Gunnar

nordisk/holger-ui

proto/holger-room.proto

syntax = "proto3";

// holger.room.v1 — where more room for a repository is bought (2026-10-17).
//
// The console is a thin layer: it shows what the repository holds
// (UsageService.ReadUsage, with its caps) and the box's disk
// (AdminService.Capacity), and for buying it links the person to the ONE shop.
// It never prices, orders or refuses an order itself. Which shop, and the link
// for THIS repository, is holger's word — this service.
//
// Its own package, like holger.grow.v1: holger.proto, and every downstream
// copy of it, does not move.
package holger.room.v1;

service RoomService {
  // READER on the repository (the same gate as ReadUsage). NOT_FOUND for a
  // repository this server does not serve.
  rpc Room(RoomRequest) returns (RoomReply);
  // **Where a person signed in to this Holger orders a private Holger of
  // their own** (2026-10-21): the ONE shop's order page for a private estate,
  // with the person's `estate` actor ticket (this box's fleet key, ten minutes,
  // one use) — the proof the shop sells the estate to that account and nobody
  // else. ANY signed-in person (Gunnar's rule, lane SU1); nobody signed in gets
  // the page without a ticket and is told to sign in first. Empty when this
  // box sells nothing.
  rpc PrivateEstate(PrivateEstateRequest) returns (PrivateEstateReply);
}

message PrivateEstateRequest {}

message PrivateEstateReply {
  // The ONE shop's order page: product, site, account and ticket named.
  string shop_url = 1;
  // One sentence for the console to show as it is.
  string words = 2;
}

message RoomRequest {
  string repository = 1;
}

message RoomReply {
  string repository = 1;
  // Where the person buys more room for this repository: the ONE shop, with
  // the product and the repository named. Empty when this box sells nothing.
  string shop_url = 2;
  // One sentence for the console to show as it is.
  string words = 3;
}