ftown 0.26.0 → 0.28.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 (83) hide show
  1. package/dist/attention-cli.d.ts +32 -0
  2. package/dist/attention-cli.js +310 -0
  3. package/dist/attention-cli.js.map +1 -0
  4. package/dist/attention-events.d.ts +2 -1
  5. package/dist/attention-events.js.map +1 -1
  6. package/dist/attention-store.d.ts +6 -3
  7. package/dist/attention-store.js +60 -2
  8. package/dist/attention-store.js.map +1 -1
  9. package/dist/brief-cli.d.ts +10 -0
  10. package/dist/brief-cli.js +163 -0
  11. package/dist/brief-cli.js.map +1 -0
  12. package/dist/command-rpc.d.ts +11 -0
  13. package/dist/command-rpc.js +83 -16
  14. package/dist/command-rpc.js.map +1 -1
  15. package/dist/coordination/attention-routing.d.ts +37 -0
  16. package/dist/coordination/attention-routing.js +154 -0
  17. package/dist/coordination/attention-routing.js.map +1 -0
  18. package/dist/coordination/board.js +82 -3
  19. package/dist/coordination/board.js.map +1 -1
  20. package/dist/coordination/contract-b.d.ts +206 -0
  21. package/dist/coordination/contract-b.js +58 -0
  22. package/dist/coordination/contract-b.js.map +1 -0
  23. package/dist/coordination/contract-c.d.ts +117 -0
  24. package/dist/coordination/contract-c.js +47 -0
  25. package/dist/coordination/contract-c.js.map +1 -0
  26. package/dist/coordination/contract.d.ts +8 -1
  27. package/dist/coordination/contract.js +1 -1
  28. package/dist/coordination/contract.js.map +1 -1
  29. package/dist/coordination/format.js +51 -12
  30. package/dist/coordination/format.js.map +1 -1
  31. package/dist/coordination/plan.d.ts +74 -0
  32. package/dist/coordination/plan.js +534 -0
  33. package/dist/coordination/plan.js.map +1 -0
  34. package/dist/coordination/routes-brief.d.ts +10 -0
  35. package/dist/coordination/routes-brief.js +149 -0
  36. package/dist/coordination/routes-brief.js.map +1 -0
  37. package/dist/coordination/routes-plan.d.ts +13 -0
  38. package/dist/coordination/routes-plan.js +182 -0
  39. package/dist/coordination/routes-plan.js.map +1 -0
  40. package/dist/coordination/routes-worktrees.d.ts +29 -0
  41. package/dist/coordination/routes-worktrees.js +138 -0
  42. package/dist/coordination/routes-worktrees.js.map +1 -0
  43. package/dist/coordination/wiring.d.ts +17 -2
  44. package/dist/coordination/wiring.js +81 -11
  45. package/dist/coordination/wiring.js.map +1 -1
  46. package/dist/coordination-cli.d.ts +6 -1
  47. package/dist/coordination-cli.js +23 -7
  48. package/dist/coordination-cli.js.map +1 -1
  49. package/dist/create-ftown-session.d.ts +26 -1
  50. package/dist/create-ftown-session.js +208 -104
  51. package/dist/create-ftown-session.js.map +1 -1
  52. package/dist/ftown-cli.js +14 -2
  53. package/dist/ftown-cli.js.map +1 -1
  54. package/dist/index.js +29 -0
  55. package/dist/index.js.map +1 -1
  56. package/dist/local-api-server.d.ts +24 -0
  57. package/dist/local-api-server.js +473 -32
  58. package/dist/local-api-server.js.map +1 -1
  59. package/dist/mail-delivery.d.ts +18 -4
  60. package/dist/mail-delivery.js +50 -8
  61. package/dist/mail-delivery.js.map +1 -1
  62. package/dist/plan-cli.d.ts +52 -0
  63. package/dist/plan-cli.js +357 -0
  64. package/dist/plan-cli.js.map +1 -0
  65. package/dist/security/bridge/permissions.js +55 -5
  66. package/dist/security/bridge/permissions.js.map +1 -1
  67. package/dist/session-controller.d.ts +17 -1
  68. package/dist/session-controller.js +93 -2
  69. package/dist/session-controller.js.map +1 -1
  70. package/dist/sessions-commands.js +75 -5
  71. package/dist/sessions-commands.js.map +1 -1
  72. package/dist/types.d.ts +9 -1
  73. package/dist/worktrees-cli.d.ts +39 -0
  74. package/dist/worktrees-cli.js +168 -0
  75. package/dist/worktrees-cli.js.map +1 -0
  76. package/dist/worktrees.d.ts +16 -0
  77. package/dist/worktrees.js +292 -0
  78. package/dist/worktrees.js.map +1 -0
  79. package/hooks/ftown-antigravity-hook.sh +12 -6
  80. package/package.json +2 -2
  81. package/skills/ftown/SKILL.md +88 -5
  82. package/skills/ftown/references/orchestrator.md +32 -29
  83. package/skills/ftown/references/sessions.md +155 -12
@@ -0,0 +1,32 @@
1
+ import type { AttentionItem } from './attention-events.js';
2
+ import type { AttentionAnswerEntry, AttentionPrompt } from './attention-prompt-protocol.js';
3
+ /** One local-API call; injectable so tests need no bridge. */
4
+ export type AttentionApiFn = (method: string, path: string, body?: unknown, headers?: Record<string, string>) => Promise<unknown>;
5
+ export interface AttentionCliDeps {
6
+ api: AttentionApiFn;
7
+ env: NodeJS.ProcessEnv;
8
+ log: (text: string) => void;
9
+ errorLog: (text: string) => void;
10
+ }
11
+ /** API failure carrying the HTTP status, so exit codes can map 403→4 and 409→5. */
12
+ export declare class AttentionApiError extends Error {
13
+ readonly status: number;
14
+ constructor(status: number, message: string);
15
+ }
16
+ /** Usage problem: message printed, exit code 2. */
17
+ export declare class UsageError extends Error {
18
+ constructor(message: string);
19
+ }
20
+ export interface AnswerInput {
21
+ options?: string[];
22
+ text?: string;
23
+ answersJson?: string;
24
+ }
25
+ export declare function buildAnswers(prompt: AttentionPrompt | undefined, input: AnswerInput): AttentionAnswerEntry[];
26
+ export interface RoutedItem {
27
+ sessionId: string;
28
+ sessionName: string;
29
+ event: AttentionItem;
30
+ }
31
+ export declare function formatRoutedItem(item: RoutedItem): string[];
32
+ export declare function runAttention(argv: string[], deps?: Partial<AttentionCliDeps>): Promise<number>;
@@ -0,0 +1,310 @@
1
+ /**
2
+ * `ftown attention` — answer or escalate questions routed from child sessions
3
+ * (coordination phase B, see coordination/contract-b.ts ATTENTION_ROUTES).
4
+ * The caller is identified by x-ftown-session-id (FTOWN_SESSION_ID).
5
+ */
6
+ import { Command, CommanderError } from 'commander';
7
+ import { apiResponse, loadPointer } from './cli-client.js';
8
+ import { ATTENTION_ROUTES, ESCALATION_NOTE_MAX } from './coordination/contract-b.js';
9
+ /** API failure carrying the HTTP status, so exit codes can map 403→4 and 409→5. */
10
+ export class AttentionApiError extends Error {
11
+ status;
12
+ constructor(status, message) {
13
+ super(message);
14
+ this.status = status;
15
+ this.name = 'AttentionApiError';
16
+ }
17
+ }
18
+ /** Usage problem: message printed, exit code 2. */
19
+ export class UsageError extends Error {
20
+ constructor(message) {
21
+ super(message);
22
+ this.name = 'UsageError';
23
+ }
24
+ }
25
+ /** Failure with a fixed exit code (e.g. 5 for an already-resolved item). */
26
+ class CliExitError extends Error {
27
+ code;
28
+ constructor(code, message) {
29
+ super(message);
30
+ this.code = code;
31
+ this.name = 'CliExitError';
32
+ }
33
+ }
34
+ async function defaultApi(method, path, body, headers) {
35
+ const result = await apiResponse(loadPointer(), method, path, body, headers);
36
+ if (result.status < 200 || result.status >= 300) {
37
+ const raw = result.body && typeof result.body === 'object' && !Array.isArray(result.body)
38
+ ? result.body.error
39
+ : undefined;
40
+ throw new AttentionApiError(result.status, typeof raw === 'string' ? raw : `HTTP ${result.status}`);
41
+ }
42
+ return result.body;
43
+ }
44
+ function resolveDeps(partial) {
45
+ return {
46
+ api: partial?.api ?? defaultApi,
47
+ env: partial?.env ?? process.env,
48
+ log: partial?.log ?? ((text) => console.log(text)),
49
+ errorLog: partial?.errorLog ?? ((text) => console.error(text)),
50
+ };
51
+ }
52
+ function requireSelf(env) {
53
+ const id = env.FTOWN_SESSION_ID?.trim();
54
+ if (!id || !/^[A-Za-z0-9_-]{1,200}$/.test(id)) {
55
+ throw new UsageError('Set FTOWN_SESSION_ID (attention commands run inside a session)');
56
+ }
57
+ return id;
58
+ }
59
+ function callerHeaders(self) {
60
+ return { 'X-Ftown-Session-Id': self };
61
+ }
62
+ function routedPath(self) {
63
+ return ATTENTION_ROUTES.routed.replace(':id', encodeURIComponent(self));
64
+ }
65
+ function itemPath(childId, eventId) {
66
+ return `/api/sessions/${encodeURIComponent(childId)}/attention/${encodeURIComponent(eventId)}`;
67
+ }
68
+ function answerPath(childId, eventId) {
69
+ return ATTENTION_ROUTES.answer
70
+ .replace(':id', encodeURIComponent(childId))
71
+ .replace(':eventId', encodeURIComponent(eventId));
72
+ }
73
+ function escalatePath(childId, eventId) {
74
+ return ATTENTION_ROUTES.escalate
75
+ .replace(':id', encodeURIComponent(childId))
76
+ .replace(':eventId', encodeURIComponent(eventId));
77
+ }
78
+ function normalizeEntries(raw, prompt) {
79
+ const list = Array.isArray(raw)
80
+ ? raw
81
+ : raw && typeof raw === 'object' && Array.isArray(raw.answers)
82
+ ? raw.answers
83
+ : undefined;
84
+ if (!list)
85
+ throw new UsageError('--answers-json must be a JSON array of { selected, text? } entries');
86
+ if (prompt && list.length !== prompt.questions.length) {
87
+ throw new UsageError(`--answers-json must contain ${prompt.questions.length} answer(s), one per question`);
88
+ }
89
+ return list.map((entry, index) => {
90
+ if (!entry || typeof entry !== 'object' || Array.isArray(entry)) {
91
+ throw new UsageError(`answers[${index}] must be an object with a selected array`);
92
+ }
93
+ const { selected, text } = entry;
94
+ if (!Array.isArray(selected) || selected.some((s) => !Number.isInteger(s) || s < 0)) {
95
+ throw new UsageError(`answers[${index}].selected must be an array of non-negative integers`);
96
+ }
97
+ if (text !== undefined && typeof text !== 'string') {
98
+ throw new UsageError(`answers[${index}].text must be a string`);
99
+ }
100
+ const question = prompt?.questions[index];
101
+ const indexes = [...new Set(selected)].sort((a, b) => a - b);
102
+ if (question && indexes.some((s) => s >= question.options.length)) {
103
+ throw new UsageError(`answers[${index}].selected is out of range for question ${index + 1}`);
104
+ }
105
+ return text === undefined ? { selected: indexes } : { selected: indexes, text };
106
+ });
107
+ }
108
+ export function buildAnswers(prompt, input) {
109
+ if (input.answersJson !== undefined) {
110
+ let parsed;
111
+ try {
112
+ parsed = JSON.parse(input.answersJson);
113
+ }
114
+ catch {
115
+ throw new UsageError('--answers-json is not valid JSON');
116
+ }
117
+ return normalizeEntries(parsed, prompt);
118
+ }
119
+ if (input.options !== undefined && input.options.length > 0) {
120
+ if (!prompt)
121
+ throw new UsageError('This item has no prompt options to pick from; use --text');
122
+ if (prompt.questions.length > 1) {
123
+ throw new UsageError('Multi-question prompt: use --answers-json');
124
+ }
125
+ const question = prompt.questions[0];
126
+ if (question.options.length === 0) {
127
+ throw new UsageError('This question has no options; use --text');
128
+ }
129
+ const selected = input.options.map((value) => {
130
+ if (/^\d+$/.test(value)) {
131
+ const index = Number(value);
132
+ if (index < 1 || index > question.options.length) {
133
+ throw new UsageError(`--option ${value} is out of range (1-${question.options.length})`);
134
+ }
135
+ return index - 1;
136
+ }
137
+ const index = question.options.findIndex((option) => option.label === value);
138
+ if (index < 0)
139
+ throw new UsageError(`--option "${value}" does not match an option label`);
140
+ return index;
141
+ });
142
+ const unique = [...new Set(selected)].sort((a, b) => a - b);
143
+ if (!question.multiSelect && unique.length > 1) {
144
+ throw new UsageError('This question allows a single choice; supply one --option');
145
+ }
146
+ return [{ selected: unique }];
147
+ }
148
+ if (input.text !== undefined) {
149
+ if (!input.text.trim())
150
+ throw new UsageError('--text must not be empty');
151
+ if (prompt) {
152
+ if (prompt.questions.length > 1)
153
+ throw new UsageError('Multi-question prompt: use --answers-json');
154
+ const question = prompt.questions[0];
155
+ if (question.options.length > 0 && !question.allowText) {
156
+ throw new UsageError('This question does not accept free text; use --option');
157
+ }
158
+ }
159
+ return [{ selected: [], text: input.text }];
160
+ }
161
+ throw new UsageError('Supply exactly one of --option, --text or --answers-json');
162
+ }
163
+ export function formatRoutedItem(item) {
164
+ const { event } = item;
165
+ const child = item.sessionName || item.sessionId;
166
+ const title = event.title || event.message;
167
+ const lines = [`${child} ${event.id} ${title}`];
168
+ const questions = event.prompt?.questions ?? [];
169
+ questions.forEach((question, index) => {
170
+ if (questions.length > 1)
171
+ lines.push(` Q${index + 1}: ${question.question}`);
172
+ if (question.options.length > 0) {
173
+ const indent = questions.length > 1 ? ' ' : ' ';
174
+ lines.push(`${indent}${question.options.map((option, i) => `${i + 1}) ${option.label}`).join(' ')}`);
175
+ }
176
+ });
177
+ return lines;
178
+ }
179
+ async function listCommand(deps, opts) {
180
+ const self = requireSelf(deps.env);
181
+ const data = (await deps.api('GET', routedPath(self), undefined, callerHeaders(self)));
182
+ const items = data?.items ?? [];
183
+ if (opts.json === true) {
184
+ deps.log(JSON.stringify(data, null, 2));
185
+ return;
186
+ }
187
+ if (items.length === 0) {
188
+ deps.log('no routed questions');
189
+ return;
190
+ }
191
+ for (const item of items) {
192
+ for (const line of formatRoutedItem(item))
193
+ deps.log(line);
194
+ }
195
+ }
196
+ // ───────────────────────── answer / escalate ─────────────────────────
197
+ async function fetchItem(deps, self, childId, eventId) {
198
+ const data = (await deps.api('GET', itemPath(childId, eventId), undefined, callerHeaders(self)));
199
+ const event = data?.event;
200
+ if (!event || typeof event !== 'object')
201
+ throw new Error('Invalid attention response');
202
+ return event;
203
+ }
204
+ async function answerCommand(deps, childId, eventId, opts) {
205
+ const self = requireSelf(deps.env);
206
+ const modes = [
207
+ (opts.option?.length ?? 0) > 0,
208
+ opts.text !== undefined,
209
+ opts.answersJson !== undefined,
210
+ ].filter(Boolean).length;
211
+ if (modes !== 1)
212
+ throw new UsageError('Supply exactly one of --option, --text or --answers-json');
213
+ const item = await fetchItem(deps, self, childId, eventId);
214
+ if (item.resolvedAt)
215
+ throw new CliExitError(5, `Attention item ${eventId} is already resolved`);
216
+ const answers = buildAnswers(item.prompt, {
217
+ options: opts.option,
218
+ text: opts.text,
219
+ answersJson: opts.answersJson,
220
+ });
221
+ const data = await deps.api('POST', answerPath(childId, eventId), { answers }, callerHeaders(self));
222
+ if (opts.json === true)
223
+ deps.log(JSON.stringify(data, null, 2));
224
+ else
225
+ deps.log(`answer recorded for ${childId} (${eventId})`);
226
+ }
227
+ async function escalateCommand(deps, childId, eventId, opts) {
228
+ const self = requireSelf(deps.env);
229
+ if (opts.note !== undefined && opts.note.length > ESCALATION_NOTE_MAX) {
230
+ throw new UsageError(`--note must be at most ${ESCALATION_NOTE_MAX} characters`);
231
+ }
232
+ const body = opts.note === undefined ? {} : { note: opts.note };
233
+ const data = await deps.api('POST', escalatePath(childId, eventId), body, callerHeaders(self));
234
+ if (opts.json === true)
235
+ deps.log(JSON.stringify(data, null, 2));
236
+ else
237
+ deps.log(`escalated ${eventId} for ${childId} to the human`);
238
+ }
239
+ // ───────────────────────── program / entry ─────────────────────────
240
+ function attentionProgram(deps) {
241
+ const program = new Command()
242
+ .name('ftown attention')
243
+ .description('Answer or escalate questions routed from child sessions');
244
+ program.exitOverride();
245
+ program.configureOutput({
246
+ writeOut: (text) => deps.log(text.trimEnd()),
247
+ writeErr: (text) => deps.errorLog(text.trimEnd()),
248
+ });
249
+ program
250
+ .command('list')
251
+ .description('Questions routed to you from your child sessions')
252
+ .option('--json', 'Machine-readable JSON output')
253
+ .action(async (opts) => {
254
+ await listCommand(deps, opts);
255
+ });
256
+ program
257
+ .command('answer <child-id> <event-id>')
258
+ .description('Answer a routed question as its parent session')
259
+ .option('--option <value>', 'Option 1-based index or exact label (repeatable)', (value, previous) => [...previous, value], [])
260
+ .option('--text <t>', 'Free-text answer')
261
+ .option('--answers-json <json>', 'JSON answers array (required for multi-question prompts)')
262
+ .option('--json', 'Machine-readable JSON output')
263
+ .action(async (childId, eventId, opts) => {
264
+ await answerCommand(deps, childId, eventId, opts);
265
+ });
266
+ program
267
+ .command('escalate <child-id> <event-id>')
268
+ .description('Hand a routed question to the human')
269
+ .option('--note <t>', `Context for the human (max ${ESCALATION_NOTE_MAX} characters)`)
270
+ .option('--json', 'Machine-readable JSON output')
271
+ .action(async (childId, eventId, opts) => {
272
+ await escalateCommand(deps, childId, eventId, opts);
273
+ });
274
+ return program;
275
+ }
276
+ function exitCodeFor(error) {
277
+ if (error instanceof CommanderError)
278
+ return error.exitCode === 0 ? 0 : 2;
279
+ if (error instanceof UsageError)
280
+ return 2;
281
+ if (error instanceof CliExitError)
282
+ return error.code;
283
+ if (error instanceof AttentionApiError) {
284
+ if (error.status === 403)
285
+ return 4;
286
+ if (error.status === 409)
287
+ return 5;
288
+ return 1;
289
+ }
290
+ return 1;
291
+ }
292
+ export async function runAttention(argv, deps) {
293
+ const resolved = resolveDeps(deps);
294
+ const program = attentionProgram(resolved);
295
+ try {
296
+ if (argv.length === 0) {
297
+ program.outputHelp({ error: true });
298
+ return 2;
299
+ }
300
+ await program.parseAsync(argv, { from: 'user' });
301
+ return 0;
302
+ }
303
+ catch (error) {
304
+ if (error instanceof CommanderError && error.exitCode === 0)
305
+ return 0;
306
+ resolved.errorLog(`ftown attention: ${error instanceof Error ? error.message : String(error)}`);
307
+ return exitCodeFor(error);
308
+ }
309
+ }
310
+ //# sourceMappingURL=attention-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attention-cli.js","sourceRoot":"","sources":["../src/attention-cli.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { AttentionRoutingFields } from "./coordination/contract-b.js";
1
2
  import { z } from 'zod';
2
3
  import { type AttentionAnswer, type AttentionPrompt } from './attention-prompt-protocol.js';
3
4
  export type AttentionType = 'permission_prompt' | 'elicitation_dialog' | 'agent_needs_input' | 'ask_user';
@@ -6,7 +7,7 @@ export interface Activity {
6
7
  state: 'thinking' | 'tool_use' | 'idle' | 'unknown';
7
8
  lastActivityAt?: string;
8
9
  }
9
- export interface AttentionItem {
10
+ export interface AttentionItem extends AttentionRoutingFields {
10
11
  id: string;
11
12
  sequence: number;
12
13
  type: AttentionType;
@@ -1 +1 @@
1
- {"version":3,"file":"attention-events.js","sourceRoot":"","sources":["../src/attention-events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"attention-events.js","sourceRoot":"","sources":["../src/attention-events.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import type { PushNotice } from './push-notifier.js';
2
2
  import { type Activity, type AttentionItem } from './attention-events.js';
3
3
  import { type AttentionPrompt } from './attention-prompt-protocol.js';
4
+ import { type AttentionAnsweredBy, type AttentionRoute, type AttentionRoutingFields, type AttentionRoutingStoreApi } from './coordination/contract-b.js';
4
5
  export interface AttentionPage {
5
6
  events: AttentionItem[];
6
7
  cursor: string;
@@ -51,7 +52,7 @@ export interface AttentionNotificationOptions {
51
52
  onSubagentIdle?: (signal: SubagentIdleSignal, isCurrent: () => boolean) => Promise<void>;
52
53
  }
53
54
  /** Single-process, serialized snapshots. Missing/corrupt files never masquerade as recovered history. */
54
- export declare class AttentionStore {
55
+ export declare class AttentionStore implements AttentionRoutingStoreApi {
55
56
  private resolveDir;
56
57
  private resolvedRetention;
57
58
  private onNotification?;
@@ -96,8 +97,10 @@ export declare class AttentionStore {
96
97
  resolveExplicitThrough(id: string, eventId: string): Promise<ExplicitAttentionSnapshot>;
97
98
  /** Resolve exactly one item as replied (inbox reply after durable mail). Unknown/already-resolved is a no-op. */
98
99
  resolveReplied(id: string, eventId: string): Promise<void>;
99
- /** Record the human's answer and resolve the item. The caller delivers it (waiter or mail). */
100
- answer(id: string, eventId: string, answers: unknown, now?: Date): Promise<AttentionAnswerResult>;
100
+ /** Record the answer (human or parent session) and resolve the item. The caller delivers it (waiter or mail). */
101
+ answer(id: string, eventId: string, answers: unknown, now?: Date, answeredBy?: AttentionAnsweredBy): Promise<AttentionAnswerResult>;
102
+ setRoute(sessionId: string, eventId: string, fields: AttentionRoutingFields, expectRoute?: AttentionRoute): Promise<AttentionItem | undefined>;
103
+ listRouted(childId: string): Promise<AttentionItem[]>;
101
104
  mutate(id: string, ids: string[], operation: 'ack' | 'resolve', reason?: string): Promise<AttentionItem[]>;
102
105
  wait(id: string, options: AttentionReadOptions, waitSeconds: number, signal?: AbortSignal): Promise<AttentionPage>;
103
106
  private readItem;
@@ -6,6 +6,7 @@ import { z } from 'zod';
6
6
  import { classifyAttentionHook, normalizeAttentionPrompt, promptSchema, sanitizeAttentionText } from './attention-events.js';
7
7
  import { ATTENTION_ITEM_WAIT_MAX_SECONDS, ATTENTION_PROMPT_LIMITS, ATTENTION_WAITER_TTL_MS } from './attention-prompt-protocol.js';
8
8
  import { validateAttentionAnswer } from './attention-prompt.js';
9
+ import { ESCALATION_NOTE_MAX } from './coordination/contract-b.js';
9
10
  const L = ATTENTION_PROMPT_LIMITS;
10
11
  /** JSON with object keys sorted, so equal prompts always hash alike. */
11
12
  function canonical(value) {
@@ -24,6 +25,11 @@ const answerSchema = z.object({
24
25
  }).strict()).min(1).max(L.questions),
25
26
  answeredAt: z.string(),
26
27
  }).strict();
28
+ const answeredBySchema = z.object({
29
+ kind: z.enum(['human', 'session']),
30
+ sessionId: z.string().optional(),
31
+ name: z.string().optional(),
32
+ }).strict();
27
33
  const itemSchema = z.object({
28
34
  id: z.string(), sequence: z.number().int().positive(),
29
35
  type: z.enum(['permission_prompt', 'elicitation_dialog', 'agent_needs_input', 'ask_user']),
@@ -32,6 +38,11 @@ const itemSchema = z.object({
32
38
  acknowledgedAt: z.string().optional(), resolvedAt: z.string().optional(),
33
39
  resolution: z.enum(['manual', 'user_prompt', 'elicitation_complete', 'session_end', 'answered', 'tool_complete', 'replied']).optional(),
34
40
  prompt: promptSchema.optional(), answer: answerSchema.optional(),
41
+ route: z.enum(['parent', 'human']).optional(),
42
+ routedTo: z.string().optional(),
43
+ escalatedAt: z.string().optional(),
44
+ escalationNote: z.string().max(ESCALATION_NOTE_MAX).optional(),
45
+ answeredBy: answeredBySchema.optional(),
35
46
  fingerprint: z.string(), sourceId: z.string().optional(), reason: z.string().optional(),
36
47
  }).strict();
37
48
  const ledgerSchema = z.object({
@@ -448,8 +459,8 @@ export class AttentionStore {
448
459
  this.wakeItemWaiters(id);
449
460
  });
450
461
  }
451
- /** Record the human's answer and resolve the item. The caller delivers it (waiter or mail). */
452
- async answer(id, eventId, answers, now) {
462
+ /** Record the answer (human or parent session) and resolve the item. The caller delivers it (waiter or mail). */
463
+ async answer(id, eventId, answers, now, answeredBy = { kind: 'human' }) {
453
464
  return this.withLock(id, async () => {
454
465
  const ledger = await this.load(id);
455
466
  const event = ledger.events.find(candidate => candidate.id === eventId);
@@ -471,6 +482,11 @@ export class AttentionStore {
471
482
  }
472
483
  const timestamp = at.toISOString();
473
484
  event.answer = { answers: checked.value, answeredAt: timestamp };
485
+ event.answeredBy = {
486
+ kind: answeredBy.kind,
487
+ ...(answeredBy.sessionId !== undefined ? { sessionId: answeredBy.sessionId } : {}),
488
+ ...(answeredBy.name !== undefined ? { name: answeredBy.name } : {}),
489
+ };
474
490
  event.resolvedAt = timestamp;
475
491
  event.resolution = 'answered';
476
492
  const resolvedIds = [event.id];
@@ -488,6 +504,48 @@ export class AttentionStore {
488
504
  return { item, snapshot: { attention: this.latestExplicit(ledger), sequence: ledger.sequence }, waiterLive };
489
505
  });
490
506
  }
507
+ async setRoute(sessionId, eventId, fields, expectRoute) {
508
+ return this.withLock(sessionId, async () => {
509
+ const ledger = await this.load(sessionId);
510
+ const event = ledger.events.find(candidate => candidate.id === eventId);
511
+ if (!event || event.resolvedAt)
512
+ return undefined;
513
+ // Compare-and-set: parent escalate and parent-exit must not both publish.
514
+ if (expectRoute !== undefined && event.route !== expectRoute)
515
+ return undefined;
516
+ if (fields.route !== undefined)
517
+ event.route = fields.route;
518
+ if (fields.routedTo !== undefined)
519
+ event.routedTo = fields.routedTo;
520
+ if (fields.escalatedAt !== undefined)
521
+ event.escalatedAt = fields.escalatedAt;
522
+ if (fields.escalationNote !== undefined) {
523
+ const cleanedNote = sanitizeAttentionText(fields.escalationNote, ESCALATION_NOTE_MAX);
524
+ if (cleanedNote)
525
+ event.escalationNote = cleanedNote;
526
+ else
527
+ delete event.escalationNote;
528
+ }
529
+ if (fields.answeredBy !== undefined) {
530
+ event.answeredBy = {
531
+ kind: fields.answeredBy.kind,
532
+ ...(fields.answeredBy.sessionId !== undefined ? { sessionId: fields.answeredBy.sessionId } : {}),
533
+ ...(fields.answeredBy.name !== undefined ? { name: fields.answeredBy.name } : {}),
534
+ };
535
+ }
536
+ await this.save(sessionId, ledger);
537
+ return publicItem(event);
538
+ });
539
+ }
540
+ async listRouted(childId) {
541
+ return this.withLock(childId, async () => {
542
+ const ledger = await this.load(childId);
543
+ return ledger.events
544
+ .filter(event => !event.resolvedAt && event.route === 'parent')
545
+ .sort((a, b) => a.sequence - b.sequence)
546
+ .map(publicItem);
547
+ });
548
+ }
491
549
  async mutate(id, ids, operation, reason) {
492
550
  return this.withLock(id, async () => {
493
551
  const ledger = await this.load(id);