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;
}