ftown-bridge 0.19.13 → 0.19.14
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.
|
@@ -3,7 +3,7 @@ export declare function codexBinaryAvailable(): Promise<boolean>;
|
|
|
3
3
|
/**
|
|
4
4
|
* Merge ftown hook entries into ~/.codex/hooks.json (Claude-settings-shaped
|
|
5
5
|
* schema). Installs `<harness> hook-pump` (mail delivery at turn boundaries)
|
|
6
|
-
* and the notify.sh forwarder on
|
|
6
|
+
* at turn boundaries and the notify.sh forwarder on lifecycle/tool events.
|
|
7
7
|
* Idempotent; preserves unknown content; atomic tmp+rename.
|
|
8
8
|
*/
|
|
9
9
|
export declare function ensureCodexHooks(harnessBinPath: string, notifyScriptPath?: string): void;
|
package/dist/codex-installer.js
CHANGED
|
@@ -6,11 +6,14 @@ import { promisify } from 'node:util';
|
|
|
6
6
|
import { CANONICAL_NOTIFY_PATH, isFtownNotifyCommand } from './install-notify-script.js';
|
|
7
7
|
import { isFtownMailPumpCommand } from './hook-installer.js';
|
|
8
8
|
const execAsync = promisify(exec);
|
|
9
|
-
/**
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
/** Codex turn boundaries used for durable mail delivery. */
|
|
10
|
+
const CODEX_MAIL_HOOK_EVENTS = ['Stop', 'UserPromptSubmit', 'SessionStart'];
|
|
11
|
+
/** Structured lifecycle events forwarded to ftown's session event channel. */
|
|
12
|
+
const CODEX_NOTIFY_HOOK_EVENTS = [
|
|
13
|
+
...CODEX_MAIL_HOOK_EVENTS,
|
|
14
|
+
'PreToolUse',
|
|
15
|
+
'PostToolUse',
|
|
16
|
+
];
|
|
14
17
|
const CODEX_NOTIFY_TIMEOUT_SECONDS = 10;
|
|
15
18
|
function isObject(value) {
|
|
16
19
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
@@ -52,7 +55,7 @@ function upsertCodexHookEntry(hooks, event, spec) {
|
|
|
52
55
|
/**
|
|
53
56
|
* Merge ftown hook entries into ~/.codex/hooks.json (Claude-settings-shaped
|
|
54
57
|
* schema). Installs `<harness> hook-pump` (mail delivery at turn boundaries)
|
|
55
|
-
* and the notify.sh forwarder on
|
|
58
|
+
* at turn boundaries and the notify.sh forwarder on lifecycle/tool events.
|
|
56
59
|
* Idempotent; preserves unknown content; atomic tmp+rename.
|
|
57
60
|
*/
|
|
58
61
|
export function ensureCodexHooks(harnessBinPath, notifyScriptPath = CANONICAL_NOTIFY_PATH) {
|
|
@@ -93,7 +96,7 @@ export function ensureCodexHooks(harnessBinPath, notifyScriptPath = CANONICAL_NO
|
|
|
93
96
|
const hooks = parsed.hooks;
|
|
94
97
|
const counters = { added: 0, repaired: 0, kept: 0 };
|
|
95
98
|
const pumpCommand = `${harnessBinPath} hook-pump`;
|
|
96
|
-
for (const event of
|
|
99
|
+
for (const event of CODEX_MAIL_HOOK_EVENTS) {
|
|
97
100
|
upsertCodexHookEntry(hooks, event, {
|
|
98
101
|
matches: isFtownMailPumpCommand,
|
|
99
102
|
desired: { type: 'command', command: pumpCommand, timeout: 30 },
|
|
@@ -107,6 +110,8 @@ export function ensureCodexHooks(harnessBinPath, notifyScriptPath = CANONICAL_NO
|
|
|
107
110
|
},
|
|
108
111
|
counters,
|
|
109
112
|
});
|
|
113
|
+
}
|
|
114
|
+
for (const event of CODEX_NOTIFY_HOOK_EVENTS) {
|
|
110
115
|
upsertCodexHookEntry(hooks, event, {
|
|
111
116
|
matches: isFtownNotifyCommand,
|
|
112
117
|
desired: { type: 'command', command: notifyScriptPath, timeout: CODEX_NOTIFY_TIMEOUT_SECONDS },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-installer.js","sourceRoot":"","sources":["../src/codex-installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACvG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACzF,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC
|
|
1
|
+
{"version":3,"file":"codex-installer.js","sourceRoot":"","sources":["../src/codex-installer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/pi-extension/ftown.js
CHANGED
|
@@ -307,6 +307,41 @@ export function registerFtownPiExtension(pi, options = {}) {
|
|
|
307
307
|
};
|
|
308
308
|
}
|
|
309
309
|
|
|
310
|
+
pi.registerTool({
|
|
311
|
+
name: 'ftown_ask_user',
|
|
312
|
+
label: 'ask user',
|
|
313
|
+
description: 'Pause and ask the user for manual input. Prefer options when the valid choices are known.',
|
|
314
|
+
parameters: {
|
|
315
|
+
type: 'object',
|
|
316
|
+
properties: {
|
|
317
|
+
question: { type: 'string', minLength: 1 },
|
|
318
|
+
options: {
|
|
319
|
+
type: 'array',
|
|
320
|
+
items: { type: 'string', minLength: 1 },
|
|
321
|
+
minItems: 2,
|
|
322
|
+
maxItems: 12,
|
|
323
|
+
description: 'Optional choices. Omit for a free-form answer.',
|
|
324
|
+
},
|
|
325
|
+
},
|
|
326
|
+
required: ['question'],
|
|
327
|
+
additionalProperties: false,
|
|
328
|
+
},
|
|
329
|
+
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
330
|
+
try {
|
|
331
|
+
requireString(params, 'question');
|
|
332
|
+
if (!ctx?.ui) throw new Error('Pi interactive UI is unavailable');
|
|
333
|
+
const answer = Array.isArray(params.options) && params.options.length > 0
|
|
334
|
+
? await ctx.ui.select(params.question, params.options)
|
|
335
|
+
: await ctx.ui.input(params.question);
|
|
336
|
+
return toolResult(answer === undefined
|
|
337
|
+
? { answer: null, cancelled: true }
|
|
338
|
+
: { answer });
|
|
339
|
+
} catch (error) {
|
|
340
|
+
return toolError(error);
|
|
341
|
+
}
|
|
342
|
+
},
|
|
343
|
+
});
|
|
344
|
+
|
|
310
345
|
pi.registerTool({
|
|
311
346
|
name: 'ftown_mail',
|
|
312
347
|
label: 'ftown mail',
|