ftown-bridge 0.19.67 → 0.20.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 (60) hide show
  1. package/dist/ask-question-hook.d.ts +46 -0
  2. package/dist/ask-question-hook.js +192 -0
  3. package/dist/ask-question-hook.js.map +1 -0
  4. package/dist/attention-events.d.ts +38 -2
  5. package/dist/attention-events.js +70 -0
  6. package/dist/attention-events.js.map +1 -1
  7. package/dist/attention-prompt-protocol.d.ts +92 -0
  8. package/dist/attention-prompt-protocol.js +28 -0
  9. package/dist/attention-prompt-protocol.js.map +1 -0
  10. package/dist/attention-prompt.d.ts +12 -0
  11. package/dist/attention-prompt.js +333 -0
  12. package/dist/attention-prompt.js.map +1 -0
  13. package/dist/attention-store.d.ts +29 -1
  14. package/dist/attention-store.js +218 -18
  15. package/dist/attention-store.js.map +1 -1
  16. package/dist/browser-access.js +7 -1
  17. package/dist/browser-access.js.map +1 -1
  18. package/dist/command-rpc.d.ts +8 -0
  19. package/dist/command-rpc.js +76 -18
  20. package/dist/command-rpc.js.map +1 -1
  21. package/dist/harness-commands.js +7 -0
  22. package/dist/harness-commands.js.map +1 -1
  23. package/dist/hook-installer.d.ts +2 -0
  24. package/dist/hook-installer.js +83 -9
  25. package/dist/hook-installer.js.map +1 -1
  26. package/dist/index.js +6 -0
  27. package/dist/index.js.map +1 -1
  28. package/dist/local-api-server.d.ts +4 -1
  29. package/dist/local-api-server.js +148 -11
  30. package/dist/local-api-server.js.map +1 -1
  31. package/dist/mcp/fleet.d.ts +1 -1
  32. package/dist/mcp/fleet.js +2 -2
  33. package/dist/mcp/fleet.js.map +1 -1
  34. package/dist/mcp/security-events.js +3 -3
  35. package/dist/mcp/security-events.js.map +1 -1
  36. package/dist/mcp/server.js +59 -9
  37. package/dist/mcp/server.js.map +1 -1
  38. package/dist/preview-chat-protocol.d.ts +50 -0
  39. package/dist/preview-chat-protocol.js +9 -0
  40. package/dist/preview-chat-protocol.js.map +1 -0
  41. package/dist/preview-chat.d.ts +18 -0
  42. package/dist/preview-chat.js +155 -0
  43. package/dist/preview-chat.js.map +1 -0
  44. package/dist/security/bridge/account-state.d.ts +4 -4
  45. package/dist/security/bridge/audit.js +2 -2
  46. package/dist/security/bridge/audit.js.map +1 -1
  47. package/dist/security/bridge/identity.d.ts +3 -3
  48. package/dist/security/bridge/metadata.d.ts +2 -2
  49. package/dist/security/bridge/permissions.js +17 -4
  50. package/dist/security/bridge/permissions.js.map +1 -1
  51. package/dist/session-controller.d.ts +32 -0
  52. package/dist/session-controller.js +49 -0
  53. package/dist/session-controller.js.map +1 -1
  54. package/dist/sessions-commands.d.ts +5 -0
  55. package/dist/sessions-commands.js +218 -5
  56. package/dist/sessions-commands.js.map +1 -1
  57. package/dist/types.d.ts +4 -2
  58. package/package.json +2 -2
  59. package/skills/ftown/SKILL.md +35 -6
  60. package/skills/ftown/references/sessions.md +80 -5
@@ -0,0 +1,333 @@
1
+ import { ATTENTION_PROMPT_LIMITS, } from './attention-prompt-protocol.js';
2
+ // DCS/SOS/PM/APC payloads run to ST (ESC \ or U+009C) or the end of the string.
3
+ const STRING_ESCAPE_PATTERN = /\u001b[PX^_][\s\S]*?(?:\u001b\\|\u009c|$)/g;
4
+ // OSC (7-bit or U+009D) ends at BEL, ST or the end of the string.
5
+ const OSC_PATTERN = /(?:\u001b\]|\u009d)[\s\S]*?(?:\u0007|\u009c|\u001b\\|$)/g;
6
+ // CSI (7-bit or U+009B).
7
+ const CSI_PATTERN = /(?:\u001b\[|\u009b)[0-?]*[ -/]*[@-~]?/g;
8
+ // Any other ESC consumes at most one printable ASCII char; otherwise only the ESC goes.
9
+ const LONE_ESC_PATTERN = /\u001b[ -~]?/g;
10
+ // C0 and C1 control characters except \t (\u0009) and \n (\u000a), plus bidi/format controls.
11
+ const CONTROL_PATTERN = /[\u0000-\u0008\u000b-\u001f\u007f-\u009f\u061c\u200e\u200f\u202a-\u202e\u2066-\u2069]/g;
12
+ function stripControl(value) {
13
+ return value
14
+ .replace(/[\u2028\u2029]/g, '\n')
15
+ .replace(STRING_ESCAPE_PATTERN, '')
16
+ .replace(OSC_PATTERN, '')
17
+ .replace(CSI_PATTERN, '')
18
+ .replace(LONE_ESC_PATTERN, '')
19
+ .replace(CONTROL_PATTERN, '');
20
+ }
21
+ /** Multi-line text (question text, answer text): keeps \n and \t. */
22
+ function cleanBlock(value) {
23
+ return stripControl(value).trim();
24
+ }
25
+ /** Single-line text (header, label, description): \n and \t become spaces. */
26
+ function cleanLine(value) {
27
+ return stripControl(value).replace(/[\n\t]/g, ' ').trim();
28
+ }
29
+ function isPlainObject(value) {
30
+ if (typeof value !== 'object' || value === null || Array.isArray(value))
31
+ return false;
32
+ const proto = Object.getPrototypeOf(value);
33
+ return proto === Object.prototype || proto === null;
34
+ }
35
+ function ok(value) {
36
+ return { ok: true, value };
37
+ }
38
+ function fail(error) {
39
+ return { ok: false, error };
40
+ }
41
+ function unknownKey(value, allowed) {
42
+ return Object.keys(value).find((key) => !allowed.includes(key));
43
+ }
44
+ const QUESTION_KEYS = ['question', 'header', 'options', 'multiSelect', 'allowText'];
45
+ const OPTION_KEYS = ['label', 'description'];
46
+ function parseOption(raw, path) {
47
+ const limits = ATTENTION_PROMPT_LIMITS;
48
+ let labelRaw;
49
+ let descriptionRaw;
50
+ if (typeof raw === 'string') {
51
+ labelRaw = raw;
52
+ }
53
+ else if (isPlainObject(raw)) {
54
+ const extra = unknownKey(raw, OPTION_KEYS);
55
+ if (extra !== undefined)
56
+ return fail(`${path}.${extra} is not a supported field`);
57
+ labelRaw = raw.label;
58
+ descriptionRaw = raw.description;
59
+ }
60
+ else {
61
+ return fail(`${path} must be a string or an object with a label`);
62
+ }
63
+ if (typeof labelRaw !== 'string')
64
+ return fail(`${path}.label must be 1-${limits.optionLabelChars} characters`);
65
+ const label = cleanLine(labelRaw);
66
+ if (label.length < 1 || label.length > limits.optionLabelChars) {
67
+ return fail(`${path}.label must be 1-${limits.optionLabelChars} characters`);
68
+ }
69
+ const option = { label };
70
+ if (descriptionRaw !== undefined) {
71
+ if (typeof descriptionRaw !== 'string')
72
+ return fail(`${path}.description must be a string`);
73
+ const description = cleanLine(descriptionRaw);
74
+ if (description.length > limits.optionDescriptionChars) {
75
+ return fail(`${path}.description must be at most ${limits.optionDescriptionChars} characters`);
76
+ }
77
+ if (description)
78
+ option.description = description;
79
+ }
80
+ return ok(option);
81
+ }
82
+ function parseQuestion(raw, path) {
83
+ const limits = ATTENTION_PROMPT_LIMITS;
84
+ if (!isPlainObject(raw))
85
+ return fail(`${path} must be an object`);
86
+ const extra = unknownKey(raw, QUESTION_KEYS);
87
+ if (extra !== undefined)
88
+ return fail(`${path}.${extra} is not a supported field`);
89
+ if (typeof raw.question !== 'string')
90
+ return fail(`${path}.question must be 1-${limits.questionChars} characters`);
91
+ const question = cleanBlock(raw.question);
92
+ if (question.length < 1 || question.length > limits.questionChars) {
93
+ return fail(`${path}.question must be 1-${limits.questionChars} characters`);
94
+ }
95
+ let header;
96
+ if (raw.header !== undefined) {
97
+ if (typeof raw.header !== 'string')
98
+ return fail(`${path}.header must be a string`);
99
+ const cleaned = cleanLine(raw.header);
100
+ if (cleaned.length > limits.headerChars)
101
+ return fail(`${path}.header must be at most ${limits.headerChars} characters`);
102
+ if (cleaned)
103
+ header = cleaned;
104
+ }
105
+ const options = [];
106
+ if (raw.options !== undefined) {
107
+ if (!Array.isArray(raw.options))
108
+ return fail(`${path}.options must be an array`);
109
+ if (raw.options.length > limits.options)
110
+ return fail(`${path}.options must have at most ${limits.options} entries`);
111
+ const seen = new Set();
112
+ for (let i = 0; i < raw.options.length; i += 1) {
113
+ const parsed = parseOption(raw.options[i], `${path}.options[${i}]`);
114
+ if (!parsed.ok)
115
+ return parsed;
116
+ const key = parsed.value.label.toLowerCase();
117
+ if (seen.has(key))
118
+ return fail(`${path}.options[${i}].label duplicates another option label`);
119
+ seen.add(key);
120
+ options.push(parsed.value);
121
+ }
122
+ }
123
+ let multiSelect = false;
124
+ if (raw.multiSelect !== undefined) {
125
+ if (typeof raw.multiSelect !== 'boolean')
126
+ return fail(`${path}.multiSelect must be a boolean`);
127
+ multiSelect = raw.multiSelect;
128
+ }
129
+ let allowText = true;
130
+ if (raw.allowText !== undefined) {
131
+ if (typeof raw.allowText !== 'boolean')
132
+ return fail(`${path}.allowText must be a boolean`);
133
+ allowText = raw.allowText;
134
+ }
135
+ if (options.length === 0) {
136
+ if (!allowText)
137
+ return fail(`${path} has no options, so allowText must be true`);
138
+ if (multiSelect)
139
+ return fail(`${path} has no options, so multiSelect must be false`);
140
+ }
141
+ const result = { question, options, multiSelect, allowText };
142
+ if (header !== undefined)
143
+ result.header = header;
144
+ return ok(result);
145
+ }
146
+ export function parseAttentionPrompt(questions, channel) {
147
+ const max = ATTENTION_PROMPT_LIMITS.questions;
148
+ if (!Array.isArray(questions))
149
+ return fail('questions must be an array');
150
+ if (questions.length < 1 || questions.length > max)
151
+ return fail(`questions must have 1-${max} entries`);
152
+ const parsed = [];
153
+ for (let i = 0; i < questions.length; i += 1) {
154
+ const q = parseQuestion(questions[i], `questions[${i}]`);
155
+ if (!q.ok)
156
+ return q;
157
+ parsed.push(q.value);
158
+ }
159
+ return ok({ channel, questions: parsed });
160
+ }
161
+ /** Lenient parse of one Claude Code AskUserQuestion question; undefined when unusable. */
162
+ function questionFromAskInput(raw) {
163
+ const limits = ATTENTION_PROMPT_LIMITS;
164
+ if (!isPlainObject(raw))
165
+ return undefined;
166
+ if (typeof raw.question !== 'string')
167
+ return undefined;
168
+ const question = cleanBlock(raw.question);
169
+ if (question.length < 1 || question.length > limits.questionChars)
170
+ return undefined;
171
+ let header;
172
+ if (raw.header !== undefined) {
173
+ if (typeof raw.header !== 'string')
174
+ return undefined;
175
+ const cleaned = cleanLine(raw.header);
176
+ if (cleaned.length > limits.headerChars)
177
+ return undefined;
178
+ if (cleaned)
179
+ header = cleaned;
180
+ }
181
+ if (!Array.isArray(raw.options))
182
+ return undefined;
183
+ if (raw.options.length < 1 || raw.options.length > limits.options)
184
+ return undefined;
185
+ const options = [];
186
+ const seen = new Set();
187
+ for (const rawOption of raw.options) {
188
+ if (!isPlainObject(rawOption))
189
+ return undefined;
190
+ if (typeof rawOption.label !== 'string')
191
+ return undefined;
192
+ const label = cleanLine(rawOption.label);
193
+ if (label.length < 1 || label.length > limits.optionLabelChars)
194
+ return undefined;
195
+ const key = label.toLowerCase();
196
+ if (seen.has(key))
197
+ return undefined;
198
+ seen.add(key);
199
+ const option = { label };
200
+ if (rawOption.description !== undefined) {
201
+ if (typeof rawOption.description !== 'string')
202
+ return undefined;
203
+ const description = cleanLine(rawOption.description);
204
+ if (description.length > limits.optionDescriptionChars)
205
+ return undefined;
206
+ if (description)
207
+ option.description = description;
208
+ }
209
+ options.push(option);
210
+ }
211
+ let multiSelect = false;
212
+ if (raw.multiSelect !== undefined) {
213
+ if (typeof raw.multiSelect !== 'boolean')
214
+ return undefined;
215
+ multiSelect = raw.multiSelect;
216
+ }
217
+ const result = { question, options, multiSelect, allowText: true };
218
+ if (header !== undefined)
219
+ result.header = header;
220
+ return result;
221
+ }
222
+ export function promptFromAskUserQuestionInput(toolInput) {
223
+ if (!isPlainObject(toolInput))
224
+ return undefined;
225
+ const raw = toolInput.questions;
226
+ if (!Array.isArray(raw))
227
+ return undefined;
228
+ if (raw.length < 1 || raw.length > ATTENTION_PROMPT_LIMITS.questions)
229
+ return undefined;
230
+ const questions = [];
231
+ for (const entry of raw) {
232
+ const question = questionFromAskInput(entry);
233
+ if (!question)
234
+ return undefined;
235
+ questions.push(question);
236
+ }
237
+ return { channel: 'hook', questions };
238
+ }
239
+ const ANSWER_KEYS = ['selected', 'text'];
240
+ export function validateAttentionAnswer(prompt, answers) {
241
+ if (!Array.isArray(answers))
242
+ return fail('answers must be an array');
243
+ if (answers.length !== prompt.questions.length) {
244
+ return fail(`answers must have exactly ${prompt.questions.length} entries, one per question`);
245
+ }
246
+ const normalized = [];
247
+ for (let i = 0; i < answers.length; i += 1) {
248
+ const path = `answers[${i}]`;
249
+ const question = prompt.questions[i];
250
+ const raw = answers[i];
251
+ if (!isPlainObject(raw))
252
+ return fail(`${path} must be an object`);
253
+ const extra = unknownKey(raw, ANSWER_KEYS);
254
+ if (extra !== undefined)
255
+ return fail(`${path}.${extra} is not a supported field`);
256
+ const rawSelected = raw.selected === undefined ? [] : raw.selected;
257
+ if (!Array.isArray(rawSelected))
258
+ return fail(`${path}.selected must be an array of option indexes`);
259
+ const selected = [];
260
+ for (const index of rawSelected) {
261
+ if (typeof index !== 'number' || !Number.isInteger(index)) {
262
+ return fail(`${path}.selected must contain only integers`);
263
+ }
264
+ if (index < 0 || index >= question.options.length) {
265
+ return fail(`${path}.selected has an out-of-range index ${index}`);
266
+ }
267
+ if (selected.includes(index))
268
+ return fail(`${path}.selected has a duplicate index ${index}`);
269
+ selected.push(index);
270
+ }
271
+ selected.sort((a, b) => a - b);
272
+ if (!question.multiSelect && selected.length > 1) {
273
+ return fail(`${path}.selected must have at most 1 entry for a single-select question`);
274
+ }
275
+ let text;
276
+ if (raw.text !== undefined) {
277
+ if (typeof raw.text !== 'string')
278
+ return fail(`${path}.text must be a string`);
279
+ const cleaned = cleanBlock(raw.text);
280
+ if (cleaned.length > ATTENTION_PROMPT_LIMITS.answerTextChars) {
281
+ return fail(`${path}.text must be at most ${ATTENTION_PROMPT_LIMITS.answerTextChars} characters`);
282
+ }
283
+ if (cleaned) {
284
+ if (!question.allowText)
285
+ return fail(`${path}.text is not allowed for this question`);
286
+ text = cleaned;
287
+ }
288
+ }
289
+ if (selected.length === 0 && text === undefined) {
290
+ return fail(`${path} needs at least one selected option or some text`);
291
+ }
292
+ const entry = { selected };
293
+ if (text !== undefined)
294
+ entry.text = text;
295
+ normalized.push(entry);
296
+ }
297
+ return ok(normalized);
298
+ }
299
+ export function answerLabels(question, entry) {
300
+ const labels = [];
301
+ for (const index of [...entry.selected].sort((a, b) => a - b)) {
302
+ const option = question.options[index];
303
+ if (option)
304
+ labels.push(option.label);
305
+ }
306
+ return labels;
307
+ }
308
+ export function formatAttentionAnswerText(prompt, answers) {
309
+ const blocks = [];
310
+ prompt.questions.forEach((question, i) => {
311
+ const entry = answers[i] ?? { selected: [] };
312
+ const lines = [`Q: ${question.question}`];
313
+ const labels = answerLabels(question, entry);
314
+ if (labels.length > 0) {
315
+ lines.push(`A: ${labels.join(', ')}`);
316
+ if (entry.text)
317
+ lines.push(`Note: ${entry.text}`);
318
+ }
319
+ else if (entry.text) {
320
+ lines.push(`A: ${entry.text}`);
321
+ }
322
+ blocks.push(lines.join('\n'));
323
+ });
324
+ return blocks.join('\n\n');
325
+ }
326
+ export function formatAttentionAnswerMail(input) {
327
+ const lines = [`[ftown attention answer id=${input.attentionId}]`];
328
+ const title = input.title?.trim();
329
+ if (title)
330
+ lines.push(`Re: ${title}`);
331
+ return `${lines.join('\n')}\n\n${formatAttentionAnswerText(input.prompt, input.answers)}`;
332
+ }
333
+ //# sourceMappingURL=attention-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attention-prompt.js","sourceRoot":"","sources":["../src/attention-prompt.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { PushNotice } from './push-notifier.js';
2
2
  import { type Activity, type AttentionItem } from './attention-events.js';
3
+ import { type AttentionPrompt } from './attention-prompt-protocol.js';
3
4
  export interface AttentionPage {
4
5
  events: AttentionItem[];
5
6
  cursor: string;
@@ -19,6 +20,14 @@ export interface ExplicitAttentionSnapshot {
19
20
  attention: AttentionItem | null;
20
21
  sequence: number;
21
22
  }
23
+ export interface AttentionAnswerResult {
24
+ item: AttentionItem;
25
+ snapshot: ExplicitAttentionSnapshot;
26
+ waiterLive: boolean;
27
+ }
28
+ export interface AttentionRecordOptions {
29
+ prompt?: AttentionPrompt;
30
+ }
22
31
  export declare class AttentionError extends Error {
23
32
  readonly code: string;
24
33
  readonly status: number;
@@ -47,10 +56,18 @@ export declare class AttentionStore {
47
56
  private onNotification?;
48
57
  private locks;
49
58
  private listeners;
59
+ /** Per session: wake callbacks of item waiters, fired whenever any item is resolved. */
60
+ private itemWaiters;
61
+ /** Per attention event id: active item long-polls and when the latest one started. */
62
+ private pollers;
50
63
  private idleTimers;
51
64
  private notificationsStopped;
52
65
  private notificationOptions;
53
66
  constructor(resolveDir: (sessionId: string) => string, resolvedRetention?: number, onNotification?: ((sessionId: string, notice: PushNotice) => void) | undefined, options?: AttentionNotificationOptions);
67
+ private wakeItemWaiters;
68
+ private isExplicit;
69
+ hasLiveWaiter(eventId: string, now?: number): boolean;
70
+ private activeWaits;
54
71
  private clearIdleTimer;
55
72
  private idleCanceled;
56
73
  private scheduleIdle;
@@ -63,13 +80,24 @@ export declare class AttentionStore {
63
80
  private save;
64
81
  private cursor;
65
82
  private parseCursor;
83
+ /** `protect`: items resolved by the current operation; a waiter must still be able to read them. */
66
84
  private prune;
67
- record(id: string, eventName: string, data: Record<string, unknown>): Promise<AttentionItem | undefined>;
85
+ record(id: string, eventName: string, data: Record<string, unknown>, options?: AttentionRecordOptions): Promise<AttentionItem | undefined>;
86
+ /** Like record, but also reports whether the returned item was newly created (true) or deduped onto an existing one (false). */
87
+ recordDetailed(id: string, eventName: string, data: Record<string, unknown>, options?: AttentionRecordOptions): Promise<{
88
+ item: AttentionItem | undefined;
89
+ created: boolean;
90
+ }>;
68
91
  list(id: string, options?: AttentionReadOptions): Promise<AttentionPage>;
69
92
  private latestExplicit;
70
93
  explicitSnapshot(id: string): Promise<ExplicitAttentionSnapshot>;
71
94
  /** Dismiss the displayed incident and its superseded explicit predecessors. */
72
95
  resolveExplicitThrough(id: string, eventId: string): Promise<ExplicitAttentionSnapshot>;
96
+ /** Record the human's answer and resolve the item. The caller delivers it (waiter or mail). */
97
+ answer(id: string, eventId: string, answers: unknown, now?: Date): Promise<AttentionAnswerResult>;
73
98
  mutate(id: string, ids: string[], operation: 'ack' | 'resolve', reason?: string): Promise<AttentionItem[]>;
74
99
  wait(id: string, options: AttentionReadOptions, waitSeconds: number, signal?: AbortSignal): Promise<AttentionPage>;
100
+ private readItem;
101
+ /** Long-poll one item: returns when it is resolved, at the deadline (current item), or rejects on abort. */
102
+ waitForItem(id: string, eventId: string, waitMs: number, signal?: AbortSignal): Promise<AttentionItem>;
75
103
  }