borgmcp 5.4.0 → 5.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +12 -0
  2. package/dist/assimilate-cmd.d.ts +8 -1
  3. package/dist/assimilate-cmd.d.ts.map +1 -1
  4. package/dist/assimilate-cmd.js +54 -21
  5. package/dist/assimilate-cmd.js.map +1 -1
  6. package/dist/claude.d.ts.map +1 -1
  7. package/dist/claude.js +22 -0
  8. package/dist/claude.js.map +1 -1
  9. package/dist/cli-help.d.ts +1 -0
  10. package/dist/cli-help.d.ts.map +1 -1
  11. package/dist/cli-help.js +42 -0
  12. package/dist/cli-help.js.map +1 -1
  13. package/dist/docs-sections.d.ts.map +1 -1
  14. package/dist/docs-sections.js +8 -0
  15. package/dist/docs-sections.js.map +1 -1
  16. package/dist/local-server-cursor.d.ts +1 -1
  17. package/dist/local-server-cursor.d.ts.map +1 -1
  18. package/dist/local-server-cursor.js +14 -4
  19. package/dist/local-server-cursor.js.map +1 -1
  20. package/dist/remote-client.d.ts +14 -0
  21. package/dist/remote-client.d.ts.map +1 -1
  22. package/dist/remote-client.js +30 -14
  23. package/dist/remote-client.js.map +1 -1
  24. package/dist/representative-cmd.d.ts +87 -0
  25. package/dist/representative-cmd.d.ts.map +1 -0
  26. package/dist/representative-cmd.js +286 -0
  27. package/dist/representative-cmd.js.map +1 -0
  28. package/dist/representative-core.d.ts +197 -0
  29. package/dist/representative-core.d.ts.map +1 -0
  30. package/dist/representative-core.js +493 -0
  31. package/dist/representative-core.js.map +1 -0
  32. package/dist/representative-mcp.d.ts +30 -0
  33. package/dist/representative-mcp.d.ts.map +1 -0
  34. package/dist/representative-mcp.js +182 -0
  35. package/dist/representative-mcp.js.map +1 -0
  36. package/dist/representative-owner.d.ts +10 -0
  37. package/dist/representative-owner.d.ts.map +1 -0
  38. package/dist/representative-owner.js +107 -0
  39. package/dist/representative-owner.js.map +1 -0
  40. package/dist/representative-store.d.ts +61 -0
  41. package/dist/representative-store.d.ts.map +1 -0
  42. package/dist/representative-store.js +158 -0
  43. package/dist/representative-store.js.map +1 -0
  44. package/dist/seat-store.d.ts +13 -0
  45. package/dist/seat-store.d.ts.map +1 -1
  46. package/dist/seat-store.js +55 -10
  47. package/dist/seat-store.js.map +1 -1
  48. package/dist/stream-owner.d.ts +10 -0
  49. package/dist/stream-owner.d.ts.map +1 -1
  50. package/dist/stream-owner.js +98 -19
  51. package/dist/stream-owner.js.map +1 -1
  52. package/dist/unknown-subcommand.d.ts +1 -1
  53. package/dist/unknown-subcommand.d.ts.map +1 -1
  54. package/dist/unknown-subcommand.js +1 -0
  55. package/dist/unknown-subcommand.js.map +1 -1
  56. package/docs/HUMAN_REPRESENTATIVE.md +269 -0
  57. package/docs/RELEASING.md +2 -2
  58. package/package.json +2 -2
  59. package/src/assimilate-cmd.ts +73 -22
  60. package/src/claude.ts +22 -0
  61. package/src/cli-help.ts +45 -0
  62. package/src/docs-sections.ts +8 -0
  63. package/src/local-server-cursor.ts +11 -3
  64. package/src/remote-client.ts +45 -12
  65. package/src/representative-cmd.ts +363 -0
  66. package/src/representative-core.ts +699 -0
  67. package/src/representative-mcp.ts +209 -0
  68. package/src/representative-owner.ts +105 -0
  69. package/src/representative-store.ts +208 -0
  70. package/src/seat-store.ts +61 -10
  71. package/src/stream-owner.ts +96 -19
  72. package/src/unknown-subcommand.ts +1 -0
@@ -0,0 +1,286 @@
1
+ /**
2
+ * `borg representative <prepare|status|mcp>` — operator entry for the human
3
+ * representative ("Hermes") connection.
4
+ *
5
+ * prepare binds ONE dedicated non-human-seat drone in this repository's cube
6
+ * to ONE explicitly named Coordinator drone. It creates/resumes the
7
+ * seat through the launch-free assimilate seam: no agent CLI starts
8
+ * and no existing drone's identity is touched.
9
+ * status shows the saved binding and re-checks it against the live cube.
10
+ * mcp serves the restricted stdio MCP facade for a generic MCP host.
11
+ *
12
+ * No command accepts a credential: the seat bearer stays in the private seat
13
+ * store and is hydrated in-process only.
14
+ */
15
+ import { realpathSync } from 'node:fs';
16
+ import { isAbsolute, resolve } from 'node:path';
17
+ import { normalizeServerEndpoint } from './server-endpoint.js';
18
+ import { validateName } from './name-validator.js';
19
+ import { RepresentativeError, assertRepresentativeRole, representativeStatus, resolveCoordinator, } from './representative-core.js';
20
+ import { RepresentativeStoreError, representativeRecoveryCommand, } from './representative-store.js';
21
+ import { shellEscape } from './shell-escape.js';
22
+ export const DEFAULT_REPRESENTATIVE_ROLE = 'hermes-representative';
23
+ export function parseRepresentativeArgs(args) {
24
+ const [action, ...rest] = args;
25
+ if (action !== 'prepare' && action !== 'status' && action !== 'mcp') {
26
+ return { ok: false, error: 'expected one of: prepare, status, mcp' };
27
+ }
28
+ const values = {};
29
+ let rebind = false;
30
+ const valueFlags = action === 'prepare' ? ['--coordinator', '--role', '--worktree', '--host'] : ['--worktree'];
31
+ for (let i = 0; i < rest.length; i += 1) {
32
+ const arg = rest[i];
33
+ if (action === 'prepare' && arg === '--rebind') {
34
+ rebind = true;
35
+ }
36
+ else if (valueFlags.includes(arg)) {
37
+ const next = rest[i + 1];
38
+ if (typeof next !== 'string' || next.length === 0 || next.startsWith('-')) {
39
+ return { ok: false, error: `${arg} requires a value` };
40
+ }
41
+ values[arg] = next;
42
+ i += 1;
43
+ }
44
+ else {
45
+ return {
46
+ ok: false,
47
+ error: `unknown argument: ${arg}. Supported: ${[...valueFlags, ...(action === 'prepare' ? ['--rebind'] : [])].join(', ')}`,
48
+ };
49
+ }
50
+ }
51
+ if (action !== 'prepare') {
52
+ const worktree = values['--worktree'];
53
+ if (worktree !== undefined && !isAbsolute(worktree)) {
54
+ return { ok: false, error: '--worktree must be an absolute path to the representative worktree' };
55
+ }
56
+ return { ok: true, command: { action, ...(worktree ? { worktree } : {}) } };
57
+ }
58
+ const coordinator = values['--coordinator'];
59
+ if (!coordinator) {
60
+ return {
61
+ ok: false,
62
+ error: '--coordinator <drone-label> is required: name the exact Coordinator drone (see `borg drones`). It is never chosen for you.',
63
+ };
64
+ }
65
+ const role = values['--role'] ?? DEFAULT_REPRESENTATIVE_ROLE;
66
+ if (!validateName(role).ok)
67
+ return { ok: false, error: '--role must be a valid role name' };
68
+ if (values['--worktree'] !== undefined && !validateName(values['--worktree']).ok) {
69
+ return { ok: false, error: '--worktree for prepare is a new worktree NAME (as in `borg assimilate --worktree`), not a path' };
70
+ }
71
+ return {
72
+ ok: true,
73
+ command: {
74
+ action,
75
+ coordinator,
76
+ role,
77
+ rebind,
78
+ ...(values['--worktree'] ? { worktreeName: values['--worktree'] } : {}),
79
+ ...(values['--host'] ? { host: values['--host'] } : {}),
80
+ },
81
+ };
82
+ }
83
+ function canonicalWorktree(path, deps) {
84
+ let real = resolve(path);
85
+ try {
86
+ real = realpathSync(real);
87
+ }
88
+ catch {
89
+ /* a missing path simply finds no binding below */
90
+ }
91
+ return deps.findProjectRoot(real);
92
+ }
93
+ function describeError(error) {
94
+ if (error instanceof RepresentativeError || error instanceof RepresentativeStoreError) {
95
+ return `${error.code}: ${error.message}`;
96
+ }
97
+ return error instanceof Error ? error.message : String(error);
98
+ }
99
+ function sameSeat(binding, active) {
100
+ return active.cubeId === binding.cubeId &&
101
+ active.droneId === binding.representativeDroneId &&
102
+ active.apiUrl === binding.origin &&
103
+ active.serverTrustIdentity === binding.trustIdentity;
104
+ }
105
+ /** Load the saved binding and prove the worktree's hydrated seat is still that exact seat. Fails closed. */
106
+ export async function resolveRepresentativeContext(worktree, deps) {
107
+ const binding = await deps.store.getBinding(worktree);
108
+ if (!binding) {
109
+ throw new RepresentativeError('NOT_PREPARED', `No representative connection is prepared for ${worktree}. Run \`borg representative prepare --coordinator <drone-label>\` there first.`);
110
+ }
111
+ const active = await deps.hydrateSeat(worktree);
112
+ if (!active) {
113
+ throw new RepresentativeError('SEAT_UNAVAILABLE', `The saved representative connection is missing, reset or rejected. Run \`${representativeRecoveryCommand(binding)}\`.`);
114
+ }
115
+ if (!sameSeat(binding, active)) {
116
+ throw new RepresentativeError('BINDING_MISMATCH', `This worktree's saved connection is not the bound server/cube/drone. Run \`${representativeRecoveryCommand(binding)}\` to confirm a rebind; nothing is sent until then.`);
117
+ }
118
+ return { binding, backend: await deps.backendFor(active), store: deps.store };
119
+ }
120
+ export function hermesConfigSnippet(worktree) {
121
+ return (`mcp_servers:\n` +
122
+ ` borg-representative:\n` +
123
+ ` command: borg\n` +
124
+ ` args: ["representative", "mcp", "--worktree", ${JSON.stringify(worktree)}]\n`);
125
+ }
126
+ export async function runRepresentativePrepare(command, deps) {
127
+ try {
128
+ // Same canonical key as status/mcp, so a symlinked cwd cannot bind under a path they never look up.
129
+ let worktree = canonicalWorktree(deps.cwd(), deps);
130
+ const existing = command.worktreeName === undefined ? await deps.hydrateSeat(worktree) : null;
131
+ if (existing && command.host && normalizeServerEndpoint(command.host) !== normalizeServerEndpoint(existing.apiUrl)) {
132
+ throw new RepresentativeError('BINDING_MISMATCH', 'The explicit --host does not match this worktree\'s saved connection. Use a worktree connected to the requested server; nothing was rebound.');
133
+ }
134
+ const prepared = await deps.prepareSeat({
135
+ role: command.role,
136
+ coordinator: command.coordinator,
137
+ ...(existing ? { resume: true } : {}),
138
+ ...(command.worktreeName ? { worktreeName: command.worktreeName } : {}),
139
+ ...(command.host ? { host: command.host } : {}),
140
+ });
141
+ if (prepared.code !== 0) {
142
+ deps.stderr('borg representative: the representative connection could not be prepared; nothing was bound.\n');
143
+ return prepared.code || 1;
144
+ }
145
+ if (prepared.worktree)
146
+ worktree = canonicalWorktree(prepared.worktree, deps);
147
+ const active = await deps.hydrateSeat(worktree);
148
+ if (!active || !active.serverTrustIdentity) {
149
+ throw new RepresentativeError('SEAT_UNAVAILABLE', `No usable saved connection was found for ${worktree}.`);
150
+ }
151
+ const backend = await deps.backendFor(active);
152
+ const me = await backend.whoami();
153
+ if (me.cube_id !== active.cubeId || me.drone_id !== active.droneId) {
154
+ throw new RepresentativeError('BINDING_MISMATCH', 'The server does not recognise this worktree\'s saved connection.');
155
+ }
156
+ const roster = await backend.roster();
157
+ const self = roster.drones.find((drone) => drone.id === me.drone_id);
158
+ const selfRole = roster.roles.find((role) => role.id === self?.role_id);
159
+ if (!self || !selfRole)
160
+ throw new RepresentativeError('SEAT_UNAVAILABLE', 'The representative drone is not active in the cube.');
161
+ assertRepresentativeRole(selfRole, self);
162
+ if (selfRole.name.toLowerCase() !== command.role.toLowerCase()) {
163
+ throw new RepresentativeError('REPRESENTATIVE_ROLE_MISMATCH', `This worktree's drone ${self.label} holds role ${JSON.stringify(selfRole.name)}, not ${JSON.stringify(command.role)}. ` +
164
+ 'The representative needs its own dedicated drone. Use the preparation syntax in `borg representative --help` with an explicit Coordinator and the intended role or new worktree name.');
165
+ }
166
+ const coordinator = resolveCoordinator(roster, { label: command.coordinator, selfDroneId: me.drone_id });
167
+ const binding = {
168
+ worktree,
169
+ origin: active.apiUrl,
170
+ trustIdentity: active.serverTrustIdentity,
171
+ cubeId: me.cube_id,
172
+ cubeName: me.cube_name,
173
+ representativeDroneId: me.drone_id,
174
+ representativeLabel: me.drone_label,
175
+ representativeRoleName: selfRole.name,
176
+ coordinatorDroneId: coordinator.drone.id,
177
+ coordinatorLabel: coordinator.drone.label,
178
+ coordinatorRoleName: coordinator.role.name,
179
+ ...(active.repositoryOrigin ? { repositoryOrigin: active.repositoryOrigin } : {}),
180
+ boundAt: new Date().toISOString(),
181
+ };
182
+ const outcome = await deps.store.saveBinding(binding, { rebind: command.rebind });
183
+ deps.stdout(`◼ Human representative connection ${outcome === 'unchanged' ? 'resumed' : outcome}.\n` +
184
+ ` cube: ${binding.cubeName} (${binding.cubeId})\n` +
185
+ ` representative: ${binding.representativeLabel} — role ${binding.representativeRoleName} (not a human seat)\n` +
186
+ ` coordinator: ${binding.coordinatorLabel} — role ${binding.coordinatorRoleName} (human seat)\n` +
187
+ ` worktree: ${worktree}\n\n` +
188
+ `No agent CLI was launched. Serve it to a generic MCP host with:\n` +
189
+ ` borg representative mcp --worktree ${worktree}\n\n` +
190
+ `Example host configuration (no secrets belong here):\n${hermesConfigSnippet(worktree)}`);
191
+ return 0;
192
+ }
193
+ catch (error) {
194
+ deps.stderr(`◼ borg representative prepare: ${describeError(error)}\n`);
195
+ return 1;
196
+ }
197
+ }
198
+ export async function runRepresentativeStatus(command, deps) {
199
+ try {
200
+ const worktree = canonicalWorktree(command.worktree ?? deps.cwd(), deps);
201
+ const ctx = await resolveRepresentativeContext(worktree, deps);
202
+ const status = await representativeStatus(ctx);
203
+ const { representativeOwnership } = await import('./representative-owner.js');
204
+ const ownership = await representativeOwnership(ctx.binding);
205
+ deps.stdout(`${JSON.stringify({ ...status, ownership }, null, 2)}\n`);
206
+ return status.connected ? 0 : 1;
207
+ }
208
+ catch (error) {
209
+ deps.stderr(`◼ borg representative status: ${describeError(error)}\n`);
210
+ return 1;
211
+ }
212
+ }
213
+ /**
214
+ * Serve the stdio facade. The binding selection is captured at startup; a later
215
+ * operator rebind is NOT picked up by a running process — calls fail closed
216
+ * until the host restarts it.
217
+ */
218
+ export async function runRepresentativeMcp(command, deps, io) {
219
+ let worktree;
220
+ let pinned;
221
+ try {
222
+ worktree = canonicalWorktree(command.worktree ?? deps.cwd(), deps);
223
+ pinned = (await resolveRepresentativeContext(worktree, deps)).binding;
224
+ const active = await deps.hydrateSeat(worktree);
225
+ if (active)
226
+ io.pinSeat?.(active);
227
+ }
228
+ catch (error) {
229
+ // stdout is reserved for JSON-RPC frames; refuse to start on stderr only.
230
+ deps.stderr(`◼ borg representative mcp: ${describeError(error)}\n`);
231
+ return 1;
232
+ }
233
+ const { serveRepresentativeMcp } = await import('./representative-mcp.js');
234
+ const served = await serveRepresentativeMcp({
235
+ version: io.version,
236
+ heartbeatIntervalMs: io.heartbeatIntervalMs,
237
+ ...(io.stdin ? { stdin: io.stdin } : {}),
238
+ ...(io.stdout ? { stdout: io.stdout } : {}),
239
+ context: async () => {
240
+ const ctx = await resolveRepresentativeContext(worktree, deps);
241
+ if (ctx.binding.cubeId !== pinned.cubeId ||
242
+ ctx.binding.coordinatorDroneId !== pinned.coordinatorDroneId ||
243
+ ctx.binding.representativeDroneId !== pinned.representativeDroneId) {
244
+ throw new RepresentativeError('BINDING_MISMATCH', 'The operator changed this connection\'s cube or Coordinator while it was running. Restart the MCP server to use the new binding.');
245
+ }
246
+ return ctx;
247
+ },
248
+ });
249
+ const stdin = io.stdin ?? process.stdin;
250
+ stdin.once('end', () => { void served.close(); });
251
+ await served.closed;
252
+ return 0;
253
+ }
254
+ export async function buildDefaultRepresentativeDeps() {
255
+ const [{ findProjectRoot, getActiveCubeForWorktree }, { createSeatBackend }, { createRepresentativeStore }] = await Promise.all([
256
+ import('./cubes.js'),
257
+ import('./representative-core.js'),
258
+ import('./representative-store.js'),
259
+ ]);
260
+ return {
261
+ cwd: () => process.cwd(),
262
+ findProjectRoot,
263
+ hydrateSeat: (worktree) => getActiveCubeForWorktree(worktree),
264
+ prepareSeat: async ({ role, coordinator, worktreeName, host, resume }) => {
265
+ const [{ prepareConnection }, { buildDefaultAssimilateDeps }] = await Promise.all([
266
+ import('./assimilate-cmd.js'),
267
+ import('./assimilate-deps.js'),
268
+ ]);
269
+ let worktree;
270
+ const code = await prepareConnection({ role, flags: { ...(resume ? { here: true } : {}), ...(worktreeName ? { worktree: worktreeName } : {}), ...(host ? { server: host } : {}) } }, buildDefaultAssimilateDeps(), {
271
+ validateRole: assertRepresentativeRole,
272
+ onPrepared: (prepared) => { worktree = prepared.worktree; },
273
+ authoritySelectionCommand: 'borg representative prepare --host <host>' +
274
+ (coordinator ? ` --coordinator ${shellEscape(coordinator)}` : '') +
275
+ ` --role ${shellEscape(role)}` +
276
+ (worktreeName ? ` --worktree ${shellEscape(worktreeName)}` : ''),
277
+ });
278
+ return { code, ...(worktree ? { worktree } : {}) };
279
+ },
280
+ backendFor: createSeatBackend,
281
+ store: createRepresentativeStore(),
282
+ stdout: (text) => { process.stdout.write(text); },
283
+ stderr: (text) => { process.stderr.write(text); },
284
+ };
285
+ }
286
+ //# sourceMappingURL=representative-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"representative-cmd.js","sourceRoot":"","sources":["../src/representative-cmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Human representative core ("Hermes"): a SEPARATE, non-human-seat drone that
3
+ * relays the human's requests, questions and decisions to ONE explicitly bound
4
+ * Coordinator drone and reads that Coordinator's replies.
5
+ *
6
+ * It is not the Coordinator and carries none of its playbook: it cannot address
7
+ * workers, broadcast, or manage the cube. Every message is attributed as an
8
+ * automated relay and states whether the content is user-authorized or the
9
+ * model's own advice. Borg does not verify that claim — it is delegate
10
+ * messaging, not server-enforced per-message human authority.
11
+ *
12
+ * The backend is injected so the same logic runs against the real seat-scoped
13
+ * client (`createSeatBackend`) or a controlled test double.
14
+ */
15
+ import { ErrorCode, type Role, type RosterDrone as ProtocolDrone, type EnrichedStreamEntry, type DocumentCitation } from 'borgmcp-shared/protocol';
16
+ import type { ActiveCube } from './cubes.js';
17
+ import { type RepresentativeBinding, type RepresentativeStore } from './representative-store.js';
18
+ export declare const REPRESENTATIVE_MESSAGE_LIMIT_BYTES = 3000;
19
+ export declare const REPRESENTATIVE_DELIVERY_NOTE: string;
20
+ export type RepresentativeErrorCode = typeof ErrorCode.INVALID_INPUT | 'DECISION_REQUIRES_USER_AUTHORIZATION' | 'REQUEST_ID_CONFLICT' | 'AMBIGUOUS_SEND_UNRESOLVED' | 'SEND_REJECTED' | 'REPRESENTATIVE_OWNERSHIP_REQUIRED' | 'NOT_PREPARED' | 'SEAT_UNAVAILABLE' | 'BINDING_MISMATCH' | 'BINDING_CONFLICT' | 'COORDINATOR_NOT_FOUND' | 'COORDINATOR_AMBIGUOUS' | 'COORDINATOR_NOT_HUMAN_SEAT' | 'COORDINATOR_IS_SELF' | 'COORDINATOR_UNAVAILABLE' | 'REPRESENTATIVE_ROLE_NOT_PERMITTED' | 'REPRESENTATIVE_ROLE_MISMATCH' | 'NOT_A_COORDINATOR_REPLY';
21
+ export interface RepresentativeErrorDetails {
22
+ owner?: import('./stream-owner.js').StreamOwnershipSnapshot;
23
+ request_id?: string;
24
+ cause_code?: string;
25
+ cause_message?: string;
26
+ recovery?: string;
27
+ }
28
+ export declare class RepresentativeError extends Error {
29
+ readonly code: RepresentativeErrorCode;
30
+ readonly details?: RepresentativeErrorDetails | undefined;
31
+ constructor(code: RepresentativeErrorCode, message: string, details?: RepresentativeErrorDetails | undefined);
32
+ }
33
+ type RosterRole = Pick<Role, 'id' | 'name' | 'is_human_seat' | 'role_class'>;
34
+ type RosterDrone = Pick<ProtocolDrone, 'id' | 'label' | 'role_id' | 'is_queen_class'>;
35
+ type LogEntry = Pick<EnrichedStreamEntry, 'id' | 'drone_id' | 'message' | 'visibility' | 'created_at' | 'recipient_drone_ids' | 'documents'>;
36
+ /** The only Borg operations the representative may perform, all seat-scoped. */
37
+ export interface RepresentativeBackend {
38
+ whoami(): Promise<{
39
+ cube_id: string;
40
+ cube_name: string;
41
+ drone_id: string;
42
+ drone_label: string;
43
+ role_id: string;
44
+ role_name: string;
45
+ }>;
46
+ roster(): Promise<{
47
+ drones: RosterDrone[];
48
+ roles: RosterRole[];
49
+ }>;
50
+ /**
51
+ * MUST make a single transport attempt and surface the client's typed errors
52
+ * unchanged: a typed 4xx/401/410 refusal is reported as "not stored" only
53
+ * because no hidden retry can sit between a committed write and that answer.
54
+ */
55
+ append(input: {
56
+ postId: string;
57
+ message: string;
58
+ to: string[];
59
+ }): Promise<{
60
+ entry: LogEntry;
61
+ deduplicated: boolean;
62
+ unreachableRecipients?: Array<{
63
+ id: string;
64
+ label: string;
65
+ }>;
66
+ }>;
67
+ /**
68
+ * Drains THIS seat's own unread cursor only (no other drone's cursor exists
69
+ * here) — the WHOLE returned page, including entries the caller then filters
70
+ * out. `limit` is a page-size hint: the client's digest mode may return more.
71
+ */
72
+ readUnread(limit?: number, continuationGuard?: () => Promise<void>): Promise<{
73
+ entries: LogEntry[];
74
+ has_more?: boolean;
75
+ }>;
76
+ readEntry(entryId: string): Promise<{
77
+ entry: LogEntry;
78
+ }>;
79
+ ack(entryId: string): Promise<void>;
80
+ }
81
+ export interface RepresentativeContext {
82
+ binding: RepresentativeBinding;
83
+ backend: RepresentativeBackend;
84
+ store: RepresentativeStore;
85
+ now?: () => Date;
86
+ }
87
+ /** Real backend: the existing seat-scoped client calls for one hydrated seat. */
88
+ export declare function createSeatBackend(active: ActiveCube): Promise<RepresentativeBackend>;
89
+ export declare function assertRepresentativeRole(role: {
90
+ name: string;
91
+ is_human_seat?: boolean;
92
+ role_class?: string;
93
+ }, drone?: {
94
+ is_queen_class?: boolean;
95
+ }): void;
96
+ /**
97
+ * Resolve the ONE Coordinator drone the operator named. Exact label match only;
98
+ * a missing, duplicated, non-human-seat or self target fails — no fallback.
99
+ */
100
+ export declare function resolveCoordinator(roster: {
101
+ drones: RosterDrone[];
102
+ roles: RosterRole[];
103
+ }, selector: {
104
+ label: string;
105
+ selfDroneId: string;
106
+ }): {
107
+ drone: RosterDrone;
108
+ role: RosterRole;
109
+ };
110
+ export type RepresentativeKind = 'request' | 'question' | 'decision';
111
+ export type RepresentativeAuthorization = 'user_authorized' | 'model_advice';
112
+ export interface RepresentativeSendInput {
113
+ request_id?: string;
114
+ kind: RepresentativeKind;
115
+ authorization: RepresentativeAuthorization;
116
+ message: string;
117
+ }
118
+ export interface RepresentativeSendResult {
119
+ outcome: 'sent' | 'ambiguous';
120
+ request_id: string;
121
+ entry_id?: string;
122
+ /** True when the server recognised the post id and stored nothing new. */
123
+ deduplicated?: boolean;
124
+ /** True when the local ledger already held this exact sent request; no network call was made. */
125
+ duplicate?: boolean;
126
+ coordinator: {
127
+ drone_id: string;
128
+ label: string;
129
+ };
130
+ warning?: string;
131
+ /** Ambiguous only: the sanitized underlying failure. */
132
+ cause?: SendFailureCause;
133
+ guidance?: string;
134
+ }
135
+ export declare function formatRepresentativeMessage(binding: RepresentativeBinding, requestId: string, input: RepresentativeSendInput): string;
136
+ export interface SendFailureCause {
137
+ /** Stable, bounded cause code — a typed server/protocol code where one exists. */
138
+ code: string;
139
+ /** Sanitized, bounded underlying message. Never a credential: client errors carry none. */
140
+ message: string;
141
+ }
142
+ export declare function sendRepresentativeMessage(ctx: RepresentativeContext, raw: unknown): Promise<RepresentativeSendResult>;
143
+ export interface RepresentativeReply {
144
+ documents?: DocumentCitation[];
145
+ document_delivery?: string;
146
+ entry_id: string;
147
+ created_at: string;
148
+ from_drone_id: string;
149
+ from_label: string;
150
+ addressed: 'direct' | 'broadcast';
151
+ /** A ledger request id quoted in the reply text. Textual correlation only. */
152
+ in_reply_to: string | null;
153
+ message: string;
154
+ }
155
+ export declare function readRepresentativeReplies(ctx: RepresentativeContext, raw: unknown): Promise<{
156
+ replies: RepresentativeReply[];
157
+ ignored_entries: number;
158
+ has_more: boolean;
159
+ delivery: string;
160
+ }>;
161
+ export declare function ackRepresentativeReply(ctx: RepresentativeContext, raw: unknown): Promise<{
162
+ acknowledged: string;
163
+ }>;
164
+ export declare function representativeStatus(ctx: RepresentativeContext): Promise<{
165
+ role: string;
166
+ connected: boolean;
167
+ problem?: {
168
+ code: string;
169
+ message: string;
170
+ };
171
+ cube: {
172
+ id: string;
173
+ name: string;
174
+ };
175
+ repository_origin: string | null;
176
+ worktree: string;
177
+ representative: {
178
+ drone_id: string;
179
+ label: string;
180
+ role: string;
181
+ };
182
+ coordinator: {
183
+ drone_id: string;
184
+ label: string;
185
+ role: string;
186
+ };
187
+ unresolved_requests: Array<{
188
+ request_id: string;
189
+ state: string;
190
+ kind: string;
191
+ updated_at: string;
192
+ }>;
193
+ delivery: string;
194
+ authority: string;
195
+ }>;
196
+ export {};
197
+ //# sourceMappingURL=representative-core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"representative-core.d.ts","sourceRoot":"","sources":["../src/representative-core.ts"],"names":[],"mappings":"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"}