ftown-bridge 0.19.43 → 0.19.48

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 (53) hide show
  1. package/claude-mod/.claude-plugin/plugin.json +6 -0
  2. package/claude-mod/hooks/hooks.json +3 -0
  3. package/claude-mod/hooks/register.js +137 -0
  4. package/dist/agent-commands.js +17 -2
  5. package/dist/agent-commands.js.map +1 -1
  6. package/dist/attention-store.d.ts +21 -1
  7. package/dist/attention-store.js +131 -3
  8. package/dist/attention-store.js.map +1 -1
  9. package/dist/claude-mod-installer.d.ts +9 -0
  10. package/dist/claude-mod-installer.js +55 -0
  11. package/dist/claude-mod-installer.js.map +1 -0
  12. package/dist/ftown-cli.d.ts +1 -1
  13. package/dist/ftown-cli.js +11 -3
  14. package/dist/ftown-cli.js.map +1 -1
  15. package/dist/harness-registry.js +4 -0
  16. package/dist/harness-registry.js.map +1 -1
  17. package/dist/index.d.ts +1 -1
  18. package/dist/index.js +719 -671
  19. package/dist/index.js.map +1 -1
  20. package/dist/install-ftown-command-cli.d.ts +1 -1
  21. package/dist/install-ftown-command-cli.js +35 -44
  22. package/dist/install-ftown-command-cli.js.map +1 -1
  23. package/dist/installation-manifest.d.ts +25 -0
  24. package/dist/installation-manifest.js +37 -0
  25. package/dist/installation-manifest.js.map +1 -0
  26. package/dist/local-api-server.js +12 -1
  27. package/dist/local-api-server.js.map +1 -1
  28. package/dist/mail-delivery.d.ts +24 -0
  29. package/dist/mail-delivery.js +155 -7
  30. package/dist/mail-delivery.js.map +1 -1
  31. package/dist/mcp/fleet.d.ts +2 -2
  32. package/dist/native-mail.d.ts +31 -0
  33. package/dist/native-mail.js +142 -0
  34. package/dist/native-mail.js.map +1 -0
  35. package/dist/production-dependencies.d.ts +13 -0
  36. package/dist/production-dependencies.js +175 -0
  37. package/dist/production-dependencies.js.map +1 -0
  38. package/dist/push-notifier.d.ts +40 -0
  39. package/dist/push-notifier.js +126 -0
  40. package/dist/push-notifier.js.map +1 -0
  41. package/dist/sessions-commands.js +278 -310
  42. package/dist/sessions-commands.js.map +1 -1
  43. package/dist/setup-state.d.ts +1 -2
  44. package/dist/setup-state.js +31 -11
  45. package/dist/setup-state.js.map +1 -1
  46. package/dist/setup.js +3 -1
  47. package/dist/setup.js.map +1 -1
  48. package/dist/start-commands.d.ts +10 -0
  49. package/dist/start-commands.js +15 -0
  50. package/dist/start-commands.js.map +1 -0
  51. package/opencode-plugin/ftown.js +142 -129
  52. package/package.json +3 -2
  53. package/skills/ftown/SKILL.md +7 -2
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "ftown-mail",
3
+ "version": "1.0.0",
4
+ "author": { "name": "FTown" },
5
+ "description": "Wake FTown-managed Claude sessions when their durable inbox has unread mail."
6
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "modules": ["./register.js"]
3
+ }
@@ -0,0 +1,137 @@
1
+ // This module intentionally submits only a pointer. Classic hooks and the mail
2
+ // CLI remain the owners of message consumption; fetching here never drains mail.
3
+ const WAKE = '[ftown mail] You have unread FTown mail. Run `ftown harness mail read` and handle the messages. Reply with `ftown harness mail send ...` where appropriate.';
4
+
5
+ /** @param {import('claude-code').On} on */
6
+ export function register(on) {
7
+ let generation = 0;
8
+ let nativeId = '';
9
+ /** @type {{ generation: number } | null} */
10
+ let pending = null;
11
+ let polling = false;
12
+ /** @type {Set<string>} */
13
+ let handled = new Set();
14
+ let retryAt = 0;
15
+ let failures = 0;
16
+ let blockedSignature = '';
17
+
18
+ // session.start does not repeat after /clear or /resume. The timer reads the
19
+ // live identity on every tick; do not cancel it on these transition events.
20
+ on('session.end', async ($, e, next) => {
21
+ generation += 1;
22
+ nativeId = '';
23
+ pending = null;
24
+ handled.clear();
25
+ failures = 0;
26
+ retryAt = 0;
27
+ blockedSignature = '';
28
+ return next(e);
29
+ });
30
+
31
+ on('session.start', async ($, e, next) => {
32
+ const ftownId = await $.env.get('FTOWN_SESSION_ID');
33
+ if (!ftownId || !/^[a-zA-Z0-9_-]+$/.test(ftownId)) return next(e);
34
+ const home = await $.env.get('HOME') || await $.env.get('USERPROFILE');
35
+ const port = await $.env.get('FTOWN_HOOK_PORT');
36
+ const token = await $.env.get('FTOWN_HOOK_TOKEN');
37
+ let connection = /^\d+$/.test(port || '') && Number(port) > 0 && Number(port) <= 65535 && token
38
+ ? { port: Number(port), token }
39
+ : null;
40
+
41
+ $.clock.every(5000, async () => {
42
+ if (polling) return;
43
+ polling = true;
44
+ try {
45
+ const currentId = await $.session.id();
46
+ if (typeof currentId !== 'string' || !currentId) return;
47
+ if (nativeId !== currentId) {
48
+ generation += 1;
49
+ nativeId = currentId;
50
+ pending = null;
51
+ handled.clear();
52
+ failures = 0;
53
+ retryAt = 0;
54
+ blockedSignature = '';
55
+ }
56
+ const epoch = generation;
57
+ /** @type {import('claude-code').HttpResponse | undefined} */
58
+ let response;
59
+ // A tmux process can outlive its bridge. On failure, retry once using
60
+ // the current pointer; the bridge still verifies both exact identities.
61
+ for (let attempt = 0; attempt < 2; attempt += 1) {
62
+ if (attempt || !connection) {
63
+ if (!home) return;
64
+ try {
65
+ const pointer = JSON.parse(await $.fs.read(home + '/.ftown/bridge.json'));
66
+ if (!Number.isInteger(pointer.port) || pointer.port < 1 || pointer.port > 65535 || typeof pointer.token !== 'string' || !pointer.token) return;
67
+ connection = { port: pointer.port, token: pointer.token };
68
+ } catch { return; }
69
+ }
70
+ const registration = blockedSignature ? '' : '&adapter=claude-mod&nativeSessionId=' + encodeURIComponent(currentId);
71
+ const url = 'http://127.0.0.1:' + connection.port + '/api/sessions/' + encodeURIComponent(ftownId) + '/inbox?peek=1&wait=0' + registration;
72
+ try {
73
+ response = await $.http.fetch(url, { headers: { Authorization: 'Bearer ' + connection.token } });
74
+ } catch { response = undefined; }
75
+ if (response && response.ok) break;
76
+ // Identity conflicts are authoritative: never redirect them to a
77
+ // different bridge or submit while native registration is unresolved.
78
+ if (response && (response.status === 400 || response.status === 409)) return;
79
+ }
80
+ if (!response?.ok || epoch !== generation || currentId !== await $.session.id()) return;
81
+ /** @type {{ messages?: Array<{ id?: unknown }> }} */
82
+ let data;
83
+ try { data = JSON.parse(response.text); } catch { return; }
84
+ if (!Array.isArray(data.messages)) return;
85
+ /** @type {Set<string>} */
86
+ const found = new Set();
87
+ for (const message of data.messages) {
88
+ if (typeof message?.id === 'string' && message.id.length > 0) found.add(message.id);
89
+ }
90
+ const ids = [...found].sort();
91
+ const unread = new Set(ids);
92
+ handled = new Set([...handled].filter((id) => unread.has(id)));
93
+ const signature = JSON.stringify(ids);
94
+ if (blockedSignature) {
95
+ if (signature === blockedSignature) return;
96
+ blockedSignature = '';
97
+ failures = 0;
98
+ retryAt = 0;
99
+ // Re-establish the authenticated native lease on the next poll before
100
+ // a new wake. This request deliberately omitted registration.
101
+ return;
102
+ }
103
+ const fresh = ids.filter((id) => !handled.has(id));
104
+ if (!fresh.length || pending || await $.clock.now() < retryAt) return;
105
+ if (epoch !== generation || currentId !== await $.session.id()) return;
106
+ const submission = { generation: epoch };
107
+ pending = submission;
108
+ // Never await this in a turn hook: submit waits for idle. Heartbeats
109
+ // continue independently while the promise waits behind active work.
110
+ void Promise.resolve().then(async () => {
111
+ if (epoch !== generation || currentId !== await $.session.id() || epoch !== generation) return;
112
+ return $.prompt.submit({ text: WAKE });
113
+ }).then(async (result) => {
114
+ if (epoch !== generation || currentId !== await $.session.id() || epoch !== generation) return;
115
+ if (result && typeof result.text === 'string' && typeof result.drop !== 'string') {
116
+ for (const id of fresh) handled.add(id);
117
+ failures = 0;
118
+ retryAt = 0;
119
+ } else if (result && typeof result.drop === 'string') {
120
+ failures += 1;
121
+ retryAt = await $.clock.now() + Math.min(60000, 5000 * 2 ** (failures - 1));
122
+ if (failures >= 3) blockedSignature = signature;
123
+ } else {
124
+ // Admission is unknown. Do not immediately repeat it; let the
125
+ // native lease expire so existing compatibility delivery recovers.
126
+ blockedSignature = signature;
127
+ }
128
+ }).catch(() => {
129
+ if (epoch === generation) blockedSignature = signature;
130
+ }).finally(() => { if (pending === submission) pending = null; });
131
+ } catch {
132
+ // Bridge outages, reloads and unsupported methods must not break Claude.
133
+ } finally { polling = false; }
134
+ });
135
+ return next(e);
136
+ });
137
+ }
@@ -1,10 +1,25 @@
1
- import { HARNESSES } from './harness-registry.js';
1
+ import { HARNESSES, shellQuote } from './harness-registry.js';
2
+ import { claudeModLaunchPath } from './claude-mod-installer.js';
2
3
  // The per-harness builders live in the registry; re-exported here so existing
3
4
  // importers (and tests) keep their import paths.
4
5
  export { buildOpencodeCommand, shellQuote, buildCursorAgentCommand, buildCodexCommand, buildGrokCommand, buildMuseCommand, buildPiCommand, buildKimiCodeCommand, } from './harness-registry.js';
5
6
  export function buildSessionCommand(input) {
6
7
  if (input.command?.trim()) {
7
- return input.command.trim();
8
+ const command = input.command.trim();
9
+ const type = input.shellType ?? 'claude';
10
+ const spec = HARNESSES[type];
11
+ const base = 'claude --allow-dangerously-skip-permissions';
12
+ const nativeId = input.claudeSessionId?.trim();
13
+ // Existing/cached dashboards send these exact generated commands. Decorate
14
+ // only that narrow surface; genuine custom commands remain verbatim, and
15
+ // the dashboard's model/prompt/resume behavior stays unchanged.
16
+ const generatedResume = nativeId && /^[a-zA-Z0-9_-]+$/.test(nativeId) && (command === `${base} --resume ${nativeId}` || command === `${base} --resume ${shellQuote(nativeId)}`);
17
+ if ((type === 'claude' || spec?.providerBase === 'claude') && (command === base || generatedResume)) {
18
+ const mod = claudeModLaunchPath();
19
+ if (mod)
20
+ return `${base} --plugin-dir ${shellQuote(mod)}${command.slice(base.length)}`;
21
+ }
22
+ return command;
8
23
  }
9
24
  const shellType = input.shellType ?? 'claude';
10
25
  // Runtime shellType may come from unvalidated JSON — unknown values fall back
@@ -1 +1 @@
1
- {"version":3,"file":"agent-commands.js","sourceRoot":"","sources":["../src/agent-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAKlD,8EAA8E;AAC9E,iDAAiD;AACjD,OAAO,EACL,oBAAoB,EACpB,UAAU,EACV,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAmB/B,MAAM,UAAU,mBAAmB,CAAC,KAA+B;IACjE,IAAI,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC;IAC9C,8EAA8E;IAC9E,2EAA2E;IAC3E,MAAM,IAAI,GAAiB,SAAyC,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC;IACpG,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"agent-commands.js","sourceRoot":"","sources":["../src/agent-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAKhE,8EAA8E;AAC9E,iDAAiD;AACjD,OAAO,EACL,oBAAoB,EACpB,UAAU,EACV,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAmB/B,MAAM,UAAU,mBAAmB,CAAC,KAA+B;IACjE,IAAI,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC;QACzC,MAAM,IAAI,GAA6B,SAAyC,CAAC,IAAI,CAAC,CAAC;QACvF,MAAM,IAAI,GAAG,6CAA6C,CAAC;QAC3D,MAAM,QAAQ,GAAG,KAAK,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;QAC/C,2EAA2E;QAC3E,yEAAyE;QACzE,gEAAgE;QAChE,MAAM,eAAe,GAAG,QAAQ,IAAI,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvE,OAAO,KAAK,GAAG,IAAI,aAAa,QAAQ,EAAE,IAAI,OAAO,KAAK,GAAG,IAAI,aAAa,UAAU,CAAC,QAAQ,CAAC,EAAE,CACrG,CAAC;QACF,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,EAAE,YAAY,KAAK,QAAQ,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,eAAe,CAAC,EAAE,CAAC;YACpG,MAAM,GAAG,GAAG,mBAAmB,EAAE,CAAC;YAClC,IAAI,GAAG;gBAAE,OAAO,GAAG,IAAI,iBAAiB,UAAU,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACzF,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC;IAC9C,8EAA8E;IAC9E,2EAA2E;IAC3E,MAAM,IAAI,GAAiB,SAAyC,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC;IACpG,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC"}
@@ -1,3 +1,4 @@
1
+ import type { PushNotice } from './push-notifier.js';
1
2
  import { type Activity, type AttentionItem } from './attention-events.js';
2
3
  export interface AttentionPage {
3
4
  events: AttentionItem[];
@@ -19,13 +20,32 @@ export declare class AttentionError extends Error {
19
20
  readonly status: number;
20
21
  constructor(code: string, message: string, status?: number);
21
22
  }
23
+ export declare const IDLE_NOTIFICATION_DELAY_MS = 600000;
24
+ export interface AttentionNotificationOptions {
25
+ now?: () => number;
26
+ schedule?: (fn: () => void, ms: number) => ReturnType<typeof setTimeout>;
27
+ cancel?: (timer: ReturnType<typeof setTimeout>) => void;
28
+ isSessionActive?: (sessionId: string) => Promise<boolean>;
29
+ onIdleCanceled?: (sessionId: string) => void;
30
+ }
22
31
  /** Single-process, serialized snapshots. Missing/corrupt files never masquerade as recovered history. */
23
32
  export declare class AttentionStore {
24
33
  private resolveDir;
25
34
  private resolvedRetention;
35
+ private onNotification?;
26
36
  private locks;
27
37
  private listeners;
28
- constructor(resolveDir: (sessionId: string) => string, resolvedRetention?: number);
38
+ private idleTimers;
39
+ private notificationsStopped;
40
+ private notificationOptions;
41
+ constructor(resolveDir: (sessionId: string) => string, resolvedRetention?: number, onNotification?: ((sessionId: string, notice: PushNotice) => void) | undefined, options?: AttentionNotificationOptions);
42
+ private clearIdleTimer;
43
+ private idleCanceled;
44
+ private scheduleIdle;
45
+ private emitIdle;
46
+ restoreIdleNotifications(ids: Iterable<string>): Promise<void>;
47
+ cancelIdleNotification(id: string): Promise<void>;
48
+ stopNotifications(): void;
29
49
  private withLock;
30
50
  private load;
31
51
  private save;
@@ -17,6 +17,7 @@ const ledgerSchema = z.object({
17
17
  prunedThrough: z.number().int().nonnegative(),
18
18
  activity: z.object({ state: z.enum(['thinking', 'tool_use', 'idle', 'unknown']), lastActivityAt: z.string().optional() }).strict(),
19
19
  events: z.array(itemSchema),
20
+ idleCycle: z.object({ id: z.string().uuid(), startedAt: z.string().datetime(), dueAt: z.string().datetime(), notifiedAt: z.string().datetime().optional() }).strict().optional(),
20
21
  }).strict();
21
22
  export class AttentionError extends Error {
22
23
  code;
@@ -28,15 +29,119 @@ export class AttentionError extends Error {
28
29
  }
29
30
  }
30
31
  const publicItem = ({ fingerprint: _fingerprint, sourceId: _sourceId, reason: _reason, ...item }) => item;
32
+ export const IDLE_NOTIFICATION_DELAY_MS = 600_000;
31
33
  /** Single-process, serialized snapshots. Missing/corrupt files never masquerade as recovered history. */
32
34
  export class AttentionStore {
33
35
  resolveDir;
34
36
  resolvedRetention;
37
+ onNotification;
35
38
  locks = new Map();
36
39
  listeners = new Map();
37
- constructor(resolveDir, resolvedRetention = 500) {
40
+ idleTimers = new Map();
41
+ notificationsStopped = false;
42
+ notificationOptions;
43
+ constructor(resolveDir, resolvedRetention = 500, onNotification, options = {}) {
38
44
  this.resolveDir = resolveDir;
39
45
  this.resolvedRetention = resolvedRetention;
46
+ this.onNotification = onNotification;
47
+ this.notificationOptions = { now: Date.now, schedule: setTimeout, cancel: clearTimeout,
48
+ isSessionActive: async () => true, ...options };
49
+ }
50
+ clearIdleTimer(id) {
51
+ const entry = this.idleTimers.get(id);
52
+ if (entry)
53
+ this.notificationOptions.cancel(entry.timer);
54
+ this.idleTimers.delete(id);
55
+ }
56
+ idleCanceled(id) {
57
+ this.clearIdleTimer(id);
58
+ try {
59
+ this.notificationOptions.onIdleCanceled?.(id);
60
+ }
61
+ catch { /* Optional observer is isolated. */ }
62
+ }
63
+ scheduleIdle(id, cycle) {
64
+ if (this.notificationsStopped || cycle.notifiedAt || !this.onNotification)
65
+ return;
66
+ this.clearIdleTimer(id);
67
+ const remaining = Math.max(0, Date.parse(cycle.dueAt) - this.notificationOptions.now());
68
+ const timer = this.notificationOptions.schedule(() => {
69
+ void this.emitIdle(id, cycle.id).catch(() => {
70
+ if (this.idleTimers.get(id)?.cycleId === cycle.id)
71
+ this.clearIdleTimer(id);
72
+ });
73
+ }, Math.min(remaining, 2_147_483_647));
74
+ timer.unref?.();
75
+ this.idleTimers.set(id, { cycleId: cycle.id, timer });
76
+ }
77
+ async emitIdle(id, cycleId) {
78
+ await this.withLock(id, async () => {
79
+ const current = () => !this.notificationsStopped && this.idleTimers.get(id)?.cycleId === cycleId;
80
+ if (!current())
81
+ return;
82
+ const ledger = await this.load(id);
83
+ const cycle = ledger.idleCycle;
84
+ if (!cycle || cycle.id !== cycleId || cycle.notifiedAt || ledger.activity.state !== 'idle') {
85
+ this.clearIdleTimer(id);
86
+ return;
87
+ }
88
+ const active = await this.notificationOptions.isSessionActive(id);
89
+ if (!current())
90
+ return;
91
+ if (!active) {
92
+ delete ledger.idleCycle;
93
+ await this.save(id, ledger);
94
+ this.idleCanceled(id);
95
+ return;
96
+ }
97
+ if (this.notificationOptions.now() < Date.parse(cycle.dueAt)) {
98
+ this.scheduleIdle(id, cycle);
99
+ return;
100
+ }
101
+ const timestamp = new Date(this.notificationOptions.now()).toISOString();
102
+ cycle.notifiedAt = timestamp;
103
+ await this.save(id, ledger);
104
+ if (!current())
105
+ return;
106
+ this.clearIdleTimer(id);
107
+ try {
108
+ this.onNotification?.(id, { kind: 'idle', eventKey: `idle:${cycle.id}`, title: 'Agent has been idle for 10 minutes',
109
+ message: 'The agent is ready for your next instruction.', occurredAt: timestamp });
110
+ }
111
+ catch { /* Durable qualification is not rolled back by delivery failure. */ }
112
+ });
113
+ }
114
+ async restoreIdleNotifications(ids) {
115
+ for (const id of ids) {
116
+ try {
117
+ await this.withLock(id, async () => {
118
+ if (this.notificationsStopped)
119
+ return;
120
+ const ledger = await this.load(id);
121
+ if (ledger.activity.state === 'idle' && ledger.idleCycle && !ledger.idleCycle.notifiedAt)
122
+ this.scheduleIdle(id, ledger.idleCycle);
123
+ });
124
+ }
125
+ catch {
126
+ console.warn(`[Bridge] Could not restore idle notification for session ${id}`);
127
+ }
128
+ }
129
+ }
130
+ async cancelIdleNotification(id) {
131
+ this.idleCanceled(id);
132
+ await this.withLock(id, async () => {
133
+ this.idleCanceled(id);
134
+ const ledger = await this.load(id);
135
+ if (ledger.idleCycle) {
136
+ delete ledger.idleCycle;
137
+ await this.save(id, ledger);
138
+ }
139
+ });
140
+ }
141
+ stopNotifications() {
142
+ this.notificationsStopped = true;
143
+ for (const id of Array.from(this.idleTimers.keys()))
144
+ this.idleCanceled(id);
40
145
  }
41
146
  withLock(id, fn) {
42
147
  if (!/^[a-zA-Z0-9_-]+$/.test(id))
@@ -116,9 +221,20 @@ export class AttentionStore {
116
221
  const observation = classifyAttentionHook(eventName, data);
117
222
  if (!observation.activity && !observation.attention && !observation.resolve)
118
223
  return;
224
+ const cancelIdle = observation.activity === 'thinking' || observation.activity === 'tool_use' || observation.resolve === 'session_end';
225
+ if (cancelIdle)
226
+ this.idleCanceled(id);
119
227
  await this.withLock(id, async () => {
120
228
  const ledger = await this.load(id);
121
- const timestamp = new Date().toISOString();
229
+ const timestamp = new Date(this.notificationOptions.now()).toISOString();
230
+ const notifications = [];
231
+ if (cancelIdle) {
232
+ this.idleCanceled(id);
233
+ delete ledger.idleCycle;
234
+ }
235
+ else if (observation.activity === 'idle' && ['thinking', 'tool_use'].includes(ledger.activity.state)) {
236
+ ledger.idleCycle = { id: randomUUID(), startedAt: timestamp, dueAt: new Date(this.notificationOptions.now() + IDLE_NOTIFICATION_DELAY_MS).toISOString() };
237
+ }
122
238
  if (observation.activity)
123
239
  ledger.activity = { state: observation.activity, lastActivityAt: timestamp };
124
240
  if (observation.resolve)
@@ -139,12 +255,24 @@ export class AttentionStore {
139
255
  existing.occurrences++;
140
256
  }
141
257
  else {
142
- ledger.events.push({ ...attention, id: randomUUID(), sequence: ++ledger.sequence, createdAt: timestamp, lastSeenAt: timestamp, occurrences: 1, fingerprint, ...(sourceId ? { sourceId } : {}) });
258
+ const attentionId = randomUUID();
259
+ notifications.push({ kind: 'question', eventKey: `question:${attentionId}`, title: attention.title, message: attention.message, occurredAt: timestamp });
260
+ ledger.events.push({ ...attention, id: attentionId, sequence: ++ledger.sequence, createdAt: timestamp, lastSeenAt: timestamp, occurrences: 1, fingerprint, ...(sourceId ? { sourceId } : {}) });
143
261
  created = true;
144
262
  }
145
263
  }
146
264
  this.prune(ledger);
147
265
  await this.save(id, ledger);
266
+ if (ledger.activity.state === 'idle' && ledger.idleCycle && !ledger.idleCycle.notifiedAt
267
+ && !this.idleTimers.has(id))
268
+ this.scheduleIdle(id, ledger.idleCycle);
269
+ for (const notice of notifications) {
270
+ try {
271
+ if (!this.notificationsStopped)
272
+ this.onNotification?.(id, notice);
273
+ }
274
+ catch { /* Optional delivery cannot fail a committed hook. */ }
275
+ }
148
276
  if (created)
149
277
  for (const listener of this.listeners.get(id) ?? [])
150
278
  listener();
@@ -1 +1 @@
1
- {"version":3,"file":"attention-store.js","sourceRoot":"","sources":["../src/attention-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"attention-store.js","sourceRoot":"","sources":["../src/attention-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAsD,MAAM,uBAAuB,CAAC;AAEzI,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACrD,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,mBAAmB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,UAAU,CAAC,CAAC;IAC1F,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;IACzD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACvF,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxE,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,aAAa,EAAE,sBAAsB,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC/F,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACxF,CAAC,CAAC,MAAM,EAAE,CAAC;AACZ,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IACzF,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAC7C,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IAClI,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC;IAC3B,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACjL,CAAC,CAAC,MAAM,EAAE,CAAC;AAOZ,MAAM,OAAO,cAAe,SAAQ,KAAK;IAClB;IAAwC;IAA7D,YAAqB,IAAY,EAAE,OAAe,EAAW,SAAS,GAAG;QAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QAAvE,SAAI,GAAJ,IAAI,CAAQ;QAA4B,WAAM,GAAN,MAAM,CAAM;IAAoB,CAAC;CAC/F;AACD,MAAM,UAAU,GAAG,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAc,EAAiB,EAAE,CAAC,IAAI,CAAC;AAErI,MAAM,CAAC,MAAM,0BAA0B,GAAG,OAAO,CAAC;AAUlD,yGAAyG;AACzG,MAAM,OAAO,cAAc;IAML;IAAmD;IAC7D;IANF,KAAK,GAAG,IAAI,GAAG,EAA4B,CAAC;IAC5C,SAAS,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC/C,UAAU,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC1C,oBAAoB,GAAG,KAAK,CAAC;IAC7B,mBAAmB,CAAwH;IACnJ,YAAoB,UAAyC,EAAU,oBAAoB,GAAG,EACpF,cAAgE,EACxE,UAAwC,EAAE;QAFxB,eAAU,GAAV,UAAU,CAA+B;QAAU,sBAAiB,GAAjB,iBAAiB,CAAM;QACpF,mBAAc,GAAd,cAAc,CAAkD;QAExE,IAAI,CAAC,mBAAmB,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY;YACpF,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC;IACpD,CAAC;IAEO,cAAc,CAAC,EAAU;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,KAAK;YAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACxD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IACO,YAAY,CAAC,EAAU;QAC7B,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC;YAAC,IAAI,CAAC,mBAAmB,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,oCAAoC,CAAC,CAAC;IACvG,CAAC;IACO,YAAY,CAAC,EAAU,EAAE,KAAuC;QACtE,IAAI,IAAI,CAAC,oBAAoB,IAAI,KAAK,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO;QAClF,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC,CAAC;QACxF,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,GAAG,EAAE;YAAG,KAAK,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;gBAClG,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,OAAO,KAAK,KAAK,CAAC,EAAE;oBAAE,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YAC7E,CAAC,CAAC,CAAC;QAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;QAC3C,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QAChB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,CAAC;IACO,KAAK,CAAC,QAAQ,CAAC,EAAU,EAAE,OAAe;QAChD,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,IAAI,EAAE;YACjC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;YACjG,IAAI,CAAC,OAAO,EAAE;gBAAE,OAAO;YACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnC,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC;YAC/B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,EAAE,KAAK,OAAO,IAAI,KAAK,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;gBAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YAChI,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;YAClE,IAAI,CAAC,OAAO,EAAE;gBAAE,OAAO;YACvB,IAAI,CAAC,MAAM,EAAE,CAAC;gBAAC,OAAO,MAAM,CAAC,SAAS,CAAC;gBAAC,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;gBAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YACrG,IAAI,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YACvG,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;YACzE,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;YAC7B,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO,EAAE;gBAAE,OAAO;YACvB,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YACxB,IAAI,CAAC;gBAAC,IAAI,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,oCAAoC;oBACvH,OAAO,EAAE,+CAA+C,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,mEAAmE,CAAC,CAAC;QACvK,CAAC,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,wBAAwB,CAAC,GAAqB;QAClD,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,IAAI,EAAE;oBACjC,IAAI,IAAI,CAAC,oBAAoB;wBAAE,OAAO;oBACtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACnC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,KAAK,MAAM,IAAI,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU;wBAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;gBACpI,CAAC,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,4DAA4D,EAAE,EAAE,CAAC,CAAC;YAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IACD,KAAK,CAAC,sBAAsB,CAAC,EAAU;QACrC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACtB,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,IAAI,EAAE;YACjC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBAAC,OAAO,MAAM,CAAC,SAAS,CAAC;gBAAC,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAAC,CAAC;QACjF,CAAC,CAAC,CAAC;IACL,CAAC;IACD,iBAAiB;QACf,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACjC,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YAAE,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC7E,CAAC;IAEO,QAAQ,CAAI,EAAU,EAAE,EAAoB;QAClD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,CAAC,CAAC;QACrH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC5B,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,OAAO;YAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxF,OAAO,IAAI,CAAC;IACd,CAAC;IACO,KAAK,CAAC,IAAI,CAAC,EAAU;QAC3B,IAAI,CAAC;YAAC,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QACnH,OAAO,KAAK,EAAE,CAAC;YACb,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,MAAM,MAAM,GAAW,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;gBACtI,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;gBAC5B,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,MAAM,IAAI,cAAc,CAAC,yBAAyB,EAAE,qCAAqC,EAAE,GAAG,CAAC,CAAC;QAClG,CAAC;IACH,CAAC;IACO,KAAK,CAAC,IAAI,CAAC,EAAU,EAAE,MAAc;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,UAAU,EAAE,MAAM,CAAC;QAC1C,IAAI,CAAC;YACH,gFAAgF;YAChF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAC5C,IAAI,CAAC;gBAAC,MAAM,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;gBAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAAC,CAAC;oBAC5E,CAAC;gBAAC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YAAC,CAAC;YACjC,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACxB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACvC,IAAI,CAAC;gBAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;YAAC,CAAC;oBAAS,CAAC;gBAAC,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;YAAC,CAAC;QACtE,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACtD,MAAM,IAAI,cAAc,CAAC,yBAAyB,EAAE,0CAA0C,EAAE,GAAG,CAAC,CAAC;QACvG,CAAC;IACH,CAAC;IACO,MAAM,CAAC,EAAU,EAAE,MAAc,EAAE,QAAgB;QACzD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACjH,CAAC;IACO,WAAW,CAAC,EAAU,EAAE,MAAc;QAC5C,IAAI,CAAC;YACH,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC;gBAAE,MAAM,IAAI,KAAK,EAAE,CAAC;YAChF,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACtN,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,MAAM,CAAC;YAAC,MAAM,IAAI,cAAc,CAAC,gBAAgB,EAAE,mDAAmD,CAAC,CAAC;QAAC,CAAC;IAC9G,CAAC;IACO,KAAK,CAAC,MAAc;QAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC3G,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACtF,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM;YAAE,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAAE,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjI,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,SAAiB,EAAE,IAA6B;QACvE,MAAM,WAAW,GAAG,qBAAqB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,OAAO;YAAE,OAAO;QACpF,MAAM,UAAU,GAAG,WAAW,CAAC,QAAQ,KAAK,UAAU,IAAI,WAAW,CAAC,QAAQ,KAAK,UAAU,IAAI,WAAW,CAAC,OAAO,KAAK,aAAa,CAAC;QACvI,IAAI,UAAU;YAAE,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACtC,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,IAAI,EAAE;YACjC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;YACzE,MAAM,aAAa,GAAiB,EAAE,CAAC;YACvC,IAAI,UAAU,EAAE,CAAC;gBAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;gBAAC,OAAO,MAAM,CAAC,SAAS,CAAC;YAAC,CAAC;iBAC9D,IAAI,WAAW,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrG,MAAM,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,0BAA0B,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YAC5J,CAAC;YACD,IAAI,WAAW,CAAC,QAAQ;gBAAE,MAAM,CAAC,QAAQ,GAAG,EAAE,KAAK,EAAE,WAAW,CAAC,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC;YACvG,IAAI,WAAW,CAAC,OAAO;gBAAE,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBAC3D,IAAI,KAAK,CAAC,UAAU,IAAI,CAAC,WAAW,CAAC,OAAO,KAAK,sBAAsB,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,CAAC;wBAAE,SAAS;oBAC1H,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;oBAC7B,KAAK,CAAC,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC;gBACzC,CAAC;YACD,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;gBAC1B,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC;gBACtE,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAClG,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACzF,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC;gBAClJ,IAAI,QAAQ,EAAE,CAAC;oBAAC,QAAQ,CAAC,UAAU,GAAG,SAAS,CAAC;oBAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;gBAAC,CAAC;qBACrE,CAAC;oBACJ,MAAM,WAAW,GAAG,UAAU,EAAE,CAAC;oBACjC,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;oBACzJ,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBAChM,OAAO,GAAG,IAAI,CAAC;gBACjB,CAAC;YACH,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACnB,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAC5B,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,KAAK,MAAM,IAAI,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU;mBACnF,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YACvE,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;gBACnC,IAAI,CAAC;oBAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB;wBAAE,IAAI,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,qDAAqD,CAAC,CAAC;YAC5I,CAAC;YACD,IAAI,OAAO;gBAAE,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE;oBAAE,QAAQ,EAAE,CAAC;QAC/E,CAAC,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAU,EAAE,UAAgC,EAAE;QACvD,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,IAAI,EAAE;YAClC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACnF,MAAM,WAAW,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC,aAAa,IAAI,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;YACvJ,MAAM,KAAK,GAAG,QAAQ,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;YAC9D,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,cAAc,IAAI,CAAC,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;YAChP,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAChD,oGAAoG;YACpG,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;YACrE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC/W,CAAC,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,GAAa,EAAE,SAA4B,EAAE,MAAe;QACnF,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,IAAI,EAAE;YAClC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC;gBAC5H,MAAM,IAAI,cAAc,CAAC,mBAAmB,EAAE,uCAAuC,CAAC,CAAC;YACzF,CAAC;YACD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAE,CAAC,CAAC;YAC7F,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,IAAI,SAAS,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,cAAc;oBAAE,KAAK,CAAC,cAAc,GAAG,SAAS,CAAC;gBACnF,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;oBACjD,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;oBAAC,KAAK,CAAC,UAAU,GAAG,QAA6B,CAAC;oBAC/E,IAAI,MAAM;wBAAE,KAAK,CAAC,MAAM,GAAG,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACtC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACnB,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAC5B,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAU,EAAE,OAA6B,EAAE,WAAmB,EAAE,MAAoB;QAC7F,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC;QAC5E,kGAAkG;QAClG,IAAI,MAAgC,CAAC;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,GAAG,EAAc,CAAC;QAClE,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC;QAClC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAC3D,IAAI,CAAC;YACH,OAAO,IAAI,EAAE,CAAC;gBACZ,IAAI,MAAM,EAAE,OAAO;oBAAE,MAAM,IAAI,cAAc,CAAC,WAAW,EAAE,0BAA0B,EAAE,GAAG,CAAC,CAAC;gBAC5F,IAAI,IAAiB,CAAC;gBACtB,MAAM,MAAM,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnE,MAAM,GAAG,IAAI,CAAC;gBACd,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC/F,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ;oBAAE,OAAO,IAAI,CAAC;gBAC9D,IAAI,KAAgD,CAAC;gBACrD,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;gBAC5B,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,GAAG,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACrH,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC1D,IAAI,MAAM,EAAE,OAAO;wBAAE,IAAI,EAAE,CAAC;oBAC5B,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;gBACxC,CAAC;wBAAS,CAAC;oBAAC,IAAI,KAAK;wBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;oBAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAAC,CAAC;YAC7F,CAAC;QACH,CAAC;gBAAS,CAAC;YAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAAC,IAAI,CAAC,SAAS,CAAC,IAAI;gBAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;IAC3F,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ export declare const CLAUDE_MOD_FILES: readonly [".claude-plugin/plugin.json", "hooks/hooks.json", "hooks/register.js"];
2
+ export declare function installClaudeMod(bundledPath: string, home?: string): string;
3
+ export declare function supportsClaudeMods(version: string): boolean;
4
+ /** Read-only, bounded compatibility probe; a missing/old CLI retains classic hooks. */
5
+ export declare function claudeModLaunchPath(options?: {
6
+ home?: string;
7
+ probeVersion?: () => string;
8
+ now?: () => number;
9
+ }): string | undefined;
@@ -0,0 +1,55 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { chmodSync, copyFileSync, existsSync, lstatSync, mkdirSync } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { dirname, join } from 'node:path';
5
+ export const CLAUDE_MOD_FILES = ['.claude-plugin/plugin.json', 'hooks/hooks.json', 'hooks/register.js'];
6
+ export function installClaudeMod(bundledPath, home = homedir()) {
7
+ const destination = join(home, '.ftown', 'claude-plugin');
8
+ for (const relative of CLAUDE_MOD_FILES) {
9
+ const target = join(destination, relative);
10
+ for (const directory of [join(home, '.ftown'), destination, dirname(target)]) {
11
+ mkdirSync(directory, { recursive: true, mode: 0o700 });
12
+ if (lstatSync(directory).isSymbolicLink())
13
+ throw new Error(`Setup refuses symlink directory: ${directory}`);
14
+ }
15
+ if (existsSync(target) && lstatSync(target).isSymbolicLink())
16
+ throw new Error(`Setup refuses symlink asset: ${target}`);
17
+ copyFileSync(join(bundledPath, relative), target);
18
+ chmodSync(target, 0o600);
19
+ }
20
+ return destination;
21
+ }
22
+ export function supportsClaudeMods(version) {
23
+ const match = version.trim().match(/^(\d+)\.(\d+)\.(\d+)(?:\s|$)/);
24
+ if (!match)
25
+ return false;
26
+ const [major, minor, patch] = match.slice(1).map(Number);
27
+ return major > 2 || (major === 2 && (minor > 1 || (minor === 1 && patch >= 287)));
28
+ }
29
+ let cached;
30
+ /** Read-only, bounded compatibility probe; a missing/old CLI retains classic hooks. */
31
+ export function claudeModLaunchPath(options = {}) {
32
+ const home = options.home ?? homedir();
33
+ const destination = join(home, '.ftown', 'claude-plugin');
34
+ if (!CLAUDE_MOD_FILES.every((file) => existsSync(join(destination, file))))
35
+ return undefined;
36
+ const key = `${home}\0${process.env.PATH ?? ''}`;
37
+ const now = options.now?.() ?? Date.now();
38
+ let compatible;
39
+ if (!options.probeVersion && cached?.key === key && now < cached.expires)
40
+ compatible = cached.compatible;
41
+ else {
42
+ try {
43
+ compatible = supportsClaudeMods(options.probeVersion ? options.probeVersion() : execFileSync('claude', ['--version'], {
44
+ encoding: 'utf8', timeout: 1500, maxBuffer: 8192, stdio: ['ignore', 'pipe', 'ignore'], windowsHide: true,
45
+ }));
46
+ }
47
+ catch {
48
+ compatible = false;
49
+ }
50
+ if (!options.probeVersion)
51
+ cached = { key, expires: now + 60_000, compatible };
52
+ }
53
+ return compatible ? destination : undefined;
54
+ }
55
+ //# sourceMappingURL=claude-mod-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-mod-installer.js","sourceRoot":"","sources":["../src/claude-mod-installer.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env node
2
2
  export { isCliEntry } from './cli-entry.js';
3
3
  export declare function usage(): string;
4
- export declare function runFtown(argv: string[]): Promise<number>;
4
+ export declare function runFtown(argv: string[], start?: (argv: string[]) => Promise<number>): Promise<number>;
package/dist/ftown-cli.js CHANGED
@@ -3,28 +3,36 @@ import { runSessions } from './sessions-commands.js';
3
3
  import { runHarness } from './harness-commands.js';
4
4
  import { runEnv } from './env-commands.js';
5
5
  import { runSetup } from './setup.js';
6
+ import { runStart } from './start-commands.js';
6
7
  import { executeCli, isCliEntry } from './cli-entry.js';
7
8
  export { isCliEntry } from './cli-entry.js';
8
9
  export function usage() {
9
- return `Usage: ftown <setup|sessions|harness|env> [args...]
10
+ return `Usage: ftown [bridge options]
11
+ ftown <setup|start|sessions|harness|env> [args...]
12
+
13
+ With no subcommand, start the bridge. Run setup explicitly before the first start.
10
14
 
11
15
  Subcommands:
12
16
  setup Install or upgrade local CLI, hooks, plugins and skill (--repair to recheck)
17
+ start Start the bridge (--solo for a single-port LAN deployment)
13
18
  sessions List, create, read and drive ftown agent sessions
14
19
  harness Inspect and drive the local ftown-bridge harness
15
20
  env Manage per-provider machine tokens (~/.ftown/env.json)`;
16
21
  }
17
- export async function runFtown(argv) {
22
+ export async function runFtown(argv, start = runStart) {
18
23
  const [group, ...args] = argv;
19
- if (!group || ['--help', '-h', 'help'].includes(group)) {
24
+ if (['--help', '-h', 'help'].includes(group)) {
20
25
  console.log(usage());
21
26
  return 0;
22
27
  }
28
+ if (!group || group.startsWith('-'))
29
+ return start(argv);
23
30
  switch (group) {
24
31
  case 'sessions': return runSessions(args);
25
32
  case 'harness': return runHarness(args);
26
33
  case 'env': return runEnv(args);
27
34
  case 'setup': return runSetup(args);
35
+ case 'start': return start(args);
28
36
  default:
29
37
  console.error(`ftown: Unknown subcommand "${group}"`);
30
38
  console.error(usage());
@@ -1 +1 @@
1
- {"version":3,"file":"ftown-cli.js","sourceRoot":"","sources":["../src/ftown-cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,MAAM,UAAU,KAAK;IACnB,OAAO;;;;;;oEAM2D,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAc;IAC3C,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC9B,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QAAC,OAAO,CAAC,CAAC;IAAC,CAAC;IAC3F,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,UAAU,CAAC,CAAC,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;QAC1C,KAAK,SAAS,CAAC,CAAC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QACxC,KAAK,KAAK,CAAC,CAAC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;QAChC,KAAK,OAAO,CAAC,CAAC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;QACpC;YAAS,OAAO,CAAC,KAAK,CAAC,8BAA8B,KAAK,GAAG,CAAC,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YAAC,OAAO,CAAC,CAAC;IACnG,CAAC;AACH,CAAC;AAED,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjD,KAAK,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC"}
1
+ {"version":3,"file":"ftown-cli.js","sourceRoot":"","sources":["../src/ftown-cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,MAAM,UAAU,KAAK;IACnB,OAAO;;;;;;;;;;oEAU2D,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAc,EAAE,QAA6C,QAAQ;IAClG,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC9B,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QAAC,OAAO,CAAC,CAAC;IAAC,CAAC;IACjF,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC;IACxD,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,UAAU,CAAC,CAAC,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;QAC1C,KAAK,SAAS,CAAC,CAAC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QACxC,KAAK,KAAK,CAAC,CAAC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;QAChC,KAAK,OAAO,CAAC,CAAC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;QACpC,KAAK,OAAO,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC;YAAS,OAAO,CAAC,KAAK,CAAC,8BAA8B,KAAK,GAAG,CAAC,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YAAC,OAAO,CAAC,CAAC;IACnG,CAAC;AACH,CAAC;AAED,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjD,KAAK,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC"}
@@ -6,6 +6,7 @@
6
6
  * branch, the prompt-as-CLI-arg predicate) now derives from HARNESSES below.
7
7
  *
8
8
  */
9
+ import { claudeModLaunchPath } from './claude-mod-installer.js';
9
10
  /** Escape an argument for the direct runtime's platform shell. */
10
11
  export function shellQuote(value, platform = process.platform) {
11
12
  if (platform === 'win32')
@@ -147,6 +148,9 @@ export function buildMuseCommand(options) {
147
148
  /** claude CLI launch — shared by 'claude' and every claude-rebadged provider flavor. */
148
149
  function buildClaudeCommand(input) {
149
150
  const parts = ['claude', '--allow-dangerously-skip-permissions'];
151
+ const mod = claudeModLaunchPath();
152
+ if (mod)
153
+ parts.push('--plugin-dir', shellQuote(mod));
150
154
  if (input.model?.trim()) {
151
155
  parts.push('--model', shellQuote(input.model.trim()));
152
156
  }