ftown-bridge 0.19.44 → 0.19.49
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.
- package/claude-mod/.claude-plugin/plugin.json +6 -0
- package/claude-mod/hooks/hooks.json +3 -0
- package/claude-mod/hooks/register.js +137 -0
- package/dist/agent-commands.js +17 -2
- package/dist/agent-commands.js.map +1 -1
- package/dist/attention-store.d.ts +21 -1
- package/dist/attention-store.js +131 -3
- package/dist/attention-store.js.map +1 -1
- package/dist/claude-mod-installer.d.ts +9 -0
- package/dist/claude-mod-installer.js +55 -0
- package/dist/claude-mod-installer.js.map +1 -0
- package/dist/claude-runner.d.ts +8 -0
- package/dist/claude-runner.js +11 -4
- package/dist/claude-runner.js.map +1 -1
- package/dist/ftown-cli.d.ts +1 -1
- package/dist/ftown-cli.js +11 -3
- package/dist/ftown-cli.js.map +1 -1
- package/dist/harness-registry.js +4 -0
- package/dist/harness-registry.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +719 -671
- package/dist/index.js.map +1 -1
- package/dist/install-ftown-command-cli.d.ts +1 -1
- package/dist/install-ftown-command-cli.js +35 -44
- package/dist/install-ftown-command-cli.js.map +1 -1
- package/dist/installation-manifest.d.ts +25 -0
- package/dist/installation-manifest.js +37 -0
- package/dist/installation-manifest.js.map +1 -0
- package/dist/local-api-server.d.ts +8 -0
- package/dist/local-api-server.js +73 -1
- package/dist/local-api-server.js.map +1 -1
- package/dist/mail-delivery.d.ts +30 -0
- package/dist/mail-delivery.js +202 -8
- package/dist/mail-delivery.js.map +1 -1
- package/dist/mcp/fleet.d.ts +2 -2
- package/dist/native-mail.d.ts +31 -0
- package/dist/native-mail.js +142 -0
- package/dist/native-mail.js.map +1 -0
- package/dist/production-dependencies.d.ts +13 -0
- package/dist/production-dependencies.js +175 -0
- package/dist/production-dependencies.js.map +1 -0
- package/dist/push-notifier.d.ts +40 -0
- package/dist/push-notifier.js +126 -0
- package/dist/push-notifier.js.map +1 -0
- package/dist/sessions-commands.js +278 -310
- package/dist/sessions-commands.js.map +1 -1
- package/dist/setup-state.d.ts +1 -2
- package/dist/setup-state.js +31 -11
- package/dist/setup-state.js.map +1 -1
- package/dist/setup.js +3 -1
- package/dist/setup.js.map +1 -1
- package/dist/start-commands.d.ts +10 -0
- package/dist/start-commands.js +15 -0
- package/dist/start-commands.js.map +1 -0
- package/opencode-plugin/ftown.js +142 -129
- package/package.json +3 -2
- package/skills/ftown/SKILL.md +7 -2
|
@@ -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
|
+
}
|
package/dist/agent-commands.js
CHANGED
|
@@ -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
|
-
|
|
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;
|
|
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
|
-
|
|
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;
|
package/dist/attention-store.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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":"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"}
|
|
@@ -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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"}
|
package/dist/claude-runner.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import * as pty from 'node-pty';
|
|
1
2
|
import { EventEmitter } from 'node:events';
|
|
3
|
+
import { createTmuxSession } from './tmux.js';
|
|
2
4
|
import type { SessionRuntime } from './types.js';
|
|
3
5
|
export interface ProcessRunnerEvents {
|
|
6
|
+
ready: [sessionId: string];
|
|
4
7
|
data: [string, string];
|
|
5
8
|
complete: [string];
|
|
6
9
|
error: [string, Error];
|
|
@@ -24,6 +27,7 @@ export interface ReattachOptions {
|
|
|
24
27
|
parentSessionId?: string;
|
|
25
28
|
}
|
|
26
29
|
export declare class ProcessRunner extends EventEmitter<ProcessRunnerEvents> {
|
|
30
|
+
private readonly dependencies;
|
|
27
31
|
private readonly activeProcesses;
|
|
28
32
|
private readonly runtimes;
|
|
29
33
|
/** Sessions being killed via stop(); suppresses tmux reattach and exit-event
|
|
@@ -34,6 +38,10 @@ export declare class ProcessRunner extends EventEmitter<ProcessRunnerEvents> {
|
|
|
34
38
|
private readonly detachOnly;
|
|
35
39
|
/** Last client-requested size, so tmux reattach does not snap back to creation-time size. */
|
|
36
40
|
private readonly lastSizes;
|
|
41
|
+
constructor(dependencies?: {
|
|
42
|
+
spawn?: typeof pty.spawn;
|
|
43
|
+
createTmuxSession?: typeof createTmuxSession;
|
|
44
|
+
});
|
|
37
45
|
getPreferredRuntime(): SessionRuntime;
|
|
38
46
|
getRuntime(sessionId: string): SessionRuntime | undefined;
|
|
39
47
|
run(sessionId: string, command: string, options?: RunOptions): void;
|
package/dist/claude-runner.js
CHANGED
|
@@ -4,6 +4,7 @@ import { TMUX_SOCKET_NAME, createTmuxSession, hasTmuxSession, isTmuxAvailable, k
|
|
|
4
4
|
import { applyTerminalColorEnv } from './xterm-theme.js';
|
|
5
5
|
import { directShellCommand } from './direct-shell.js';
|
|
6
6
|
export class ProcessRunner extends EventEmitter {
|
|
7
|
+
dependencies;
|
|
7
8
|
activeProcesses = new Map();
|
|
8
9
|
runtimes = new Map();
|
|
9
10
|
/** Sessions being killed via stop(); suppresses tmux reattach and exit-event
|
|
@@ -14,6 +15,10 @@ export class ProcessRunner extends EventEmitter {
|
|
|
14
15
|
detachOnly = new Set();
|
|
15
16
|
/** Last client-requested size, so tmux reattach does not snap back to creation-time size. */
|
|
16
17
|
lastSizes = new Map();
|
|
18
|
+
constructor(dependencies = {}) {
|
|
19
|
+
super();
|
|
20
|
+
this.dependencies = dependencies;
|
|
21
|
+
}
|
|
17
22
|
getPreferredRuntime() {
|
|
18
23
|
// Native Windows PTYs cannot attach to a Unix tmux server.
|
|
19
24
|
if (process.platform === 'win32')
|
|
@@ -50,7 +55,7 @@ export class ProcessRunner extends EventEmitter {
|
|
|
50
55
|
if (this.activeProcesses.has(sessionId)) {
|
|
51
56
|
return true;
|
|
52
57
|
}
|
|
53
|
-
if (!
|
|
58
|
+
if (!this.hasTmuxSession(sessionId)) {
|
|
54
59
|
return false;
|
|
55
60
|
}
|
|
56
61
|
const env = this.buildEnv(sessionId, { parentSessionId: options.parentSessionId });
|
|
@@ -159,7 +164,7 @@ export class ProcessRunner extends EventEmitter {
|
|
|
159
164
|
}
|
|
160
165
|
async runTmux(sessionId, command, env, params) {
|
|
161
166
|
try {
|
|
162
|
-
await createTmuxSession({
|
|
167
|
+
await (this.dependencies.createTmuxSession ?? createTmuxSession)({
|
|
163
168
|
sessionId,
|
|
164
169
|
command,
|
|
165
170
|
cwd: params.cwd,
|
|
@@ -194,7 +199,7 @@ export class ProcessRunner extends EventEmitter {
|
|
|
194
199
|
}
|
|
195
200
|
let proc;
|
|
196
201
|
try {
|
|
197
|
-
proc = pty.spawn('tmux', ['-L', TMUX_SOCKET_NAME, 'attach-session', '-t', `=${tmuxSessionName(sessionId)}`], {
|
|
202
|
+
proc = (this.dependencies.spawn ?? pty.spawn)('tmux', ['-L', TMUX_SOCKET_NAME, 'attach-session', '-t', `=${tmuxSessionName(sessionId)}`], {
|
|
198
203
|
name: 'xterm-256color',
|
|
199
204
|
cols: params.cols,
|
|
200
205
|
rows: params.rows,
|
|
@@ -248,13 +253,14 @@ export class ProcessRunner extends EventEmitter {
|
|
|
248
253
|
this.emit('error', sessionId, new Error(`Process exited with code ${realCode}`));
|
|
249
254
|
}
|
|
250
255
|
});
|
|
256
|
+
this.emit('ready', sessionId);
|
|
251
257
|
this.scheduleInitialInput(sessionId, proc, params.initialInput, params.initialInputDelay, params.submitSuffix);
|
|
252
258
|
}
|
|
253
259
|
runDirect(sessionId, command, env, cwd, cols, rows, options) {
|
|
254
260
|
let proc;
|
|
255
261
|
try {
|
|
256
262
|
const shell = directShellCommand(command);
|
|
257
|
-
proc = pty.spawn(shell.file, shell.args, {
|
|
263
|
+
proc = (this.dependencies.spawn ?? pty.spawn)(shell.file, shell.args, {
|
|
258
264
|
name: 'xterm-256color',
|
|
259
265
|
cols,
|
|
260
266
|
rows,
|
|
@@ -289,6 +295,7 @@ export class ProcessRunner extends EventEmitter {
|
|
|
289
295
|
this.emit('error', sessionId, new Error(`Process exited with code ${exitCode}`));
|
|
290
296
|
}
|
|
291
297
|
});
|
|
298
|
+
this.emit('ready', sessionId);
|
|
292
299
|
this.scheduleInitialInput(sessionId, proc, options.initialInput, options.initialInputDelay, options.submitSuffix);
|
|
293
300
|
}
|
|
294
301
|
scheduleInitialInput(sessionId, proc, initialInput, initialInputDelay, submitSuffix) {
|