ftown-bridge 0.19.8 → 0.19.10
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/dist/harness-installer.js +2 -0
- package/dist/harness-installer.js.map +1 -1
- package/dist/mail-delivery.d.ts +2 -3
- package/dist/mail-delivery.js +7 -4
- package/dist/mail-delivery.js.map +1 -1
- package/package.json +1 -1
- package/pi-extension/API.md +10 -0
- package/pi-extension/ftown.js +196 -133
- package/skills/ftown/references/orchestrator.md +6 -4
- package/skills/ftown/references/sessions.md +5 -4
|
@@ -145,6 +145,8 @@ Mail reaches the recipient automatically: a synchronous \`hook-pump\` hook
|
|
|
145
145
|
\`~/.codex/hooks.json\` for codex) checks the inbox at turn boundaries and
|
|
146
146
|
injects pending mail as \`[ftown mail]\` context —
|
|
147
147
|
on Stop it holds the agent's turn open so messages get handled immediately.
|
|
148
|
+
Pi's bundled extension keeps one cancellable inbox long-poll open and wakes an
|
|
149
|
+
idle Pi session with a native follow-up turn as soon as mail arrives.
|
|
148
150
|
Cursor and shell sessions have no hooks; when idle they get a one-line nudge
|
|
149
151
|
to run \`ftown-harness mail read\` instead.
|
|
150
152
|
Prefer mail over \`send\` (keystroke injection) for agent-to-agent communication.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harness-installer.js","sourceRoot":"","sources":["../src/harness-installer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"harness-installer.js","sourceRoot":"","sources":["../src/harness-installer.ts"],"names":[],"mappings":"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"}
|
package/dist/mail-delivery.d.ts
CHANGED
|
@@ -104,9 +104,8 @@ export declare class MailDeliveryService {
|
|
|
104
104
|
all: boolean;
|
|
105
105
|
limit: number;
|
|
106
106
|
}): Promise<InboxReadResult>;
|
|
107
|
-
/** A session earns the
|
|
108
|
-
*
|
|
109
|
-
* exchanged mail before. */
|
|
107
|
+
/** A session earns the listen window when it has a native persistent listener
|
|
108
|
+
* (Pi), a parent, children, an orchestrator marker, or prior mail history. */
|
|
110
109
|
participatesInMail(session: Session): Promise<boolean>;
|
|
111
110
|
private scheduleMailNudge;
|
|
112
111
|
private fireMailNudge;
|
package/dist/mail-delivery.js
CHANGED
|
@@ -145,7 +145,9 @@ export class MailDeliveryService {
|
|
|
145
145
|
waiter.deliver(marked);
|
|
146
146
|
}
|
|
147
147
|
}
|
|
148
|
-
else {
|
|
148
|
+
else if (session.shellType !== 'pi') {
|
|
149
|
+
// Pi's extension owns wake/retry natively; leave mail undelivered between
|
|
150
|
+
// polls instead of falling back to terminal keystroke injection.
|
|
149
151
|
const nudgeDelay = HOOKED_SHELL_TYPES.has(session.shellType ?? 'claude')
|
|
150
152
|
? MAIL_NUDGE_DELAY_HOOKED_MS
|
|
151
153
|
: MAIL_NUDGE_DELAY_MS;
|
|
@@ -232,10 +234,11 @@ export class MailDeliveryService {
|
|
|
232
234
|
};
|
|
233
235
|
return { kind: 'longpoll', messages, abandon };
|
|
234
236
|
}
|
|
235
|
-
/** A session earns the
|
|
236
|
-
*
|
|
237
|
-
* exchanged mail before. */
|
|
237
|
+
/** A session earns the listen window when it has a native persistent listener
|
|
238
|
+
* (Pi), a parent, children, an orchestrator marker, or prior mail history. */
|
|
238
239
|
async participatesInMail(session) {
|
|
240
|
+
if (session.shellType === 'pi')
|
|
241
|
+
return true;
|
|
239
242
|
if (session.parentSessionId)
|
|
240
243
|
return true;
|
|
241
244
|
if (session.env?.FTOWN_ORCHESTRATOR === '1')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mail-delivery.js","sourceRoot":"","sources":["../src/mail-delivery.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mail-delivery.js","sourceRoot":"","sources":["../src/mail-delivery.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/pi-extension/API.md
CHANGED
|
@@ -43,6 +43,16 @@ All tools talk only to the local bridge selected by `FTOWN_HOOK_PORT` or `~/.fto
|
|
|
43
43
|
|
|
44
44
|
The extension also registers `/ftown-mail read [--peek]`, `/ftown-mail send <session> <message>`, and `/ftown-sessions` for interactive use.
|
|
45
45
|
|
|
46
|
+
## Mail wake-up
|
|
47
|
+
|
|
48
|
+
After `session_start`, the extension maintains one authenticated, cancellable
|
|
49
|
+
30-second long-poll against the current session's inbox. Incoming messages are
|
|
50
|
+
injected through Pi's native `sendUserMessage(..., { deliverAs: "followUp" })`
|
|
51
|
+
API. This starts a turn immediately while Pi is idle and safely queues a
|
|
52
|
+
follow-up while Pi is streaming. The listener retries bridge errors with capped
|
|
53
|
+
exponential backoff and is aborted during `session_shutdown`; it never types
|
|
54
|
+
into the terminal.
|
|
55
|
+
|
|
46
56
|
## Authorization and safety
|
|
47
57
|
|
|
48
58
|
The local bridge bearer token authorizes access to the current ftown user's bridge resources. Session name resolution is performed against that same authenticated bridge. The model can inspect a terminal screen or search its captured log, but it cannot inject raw terminal keystrokes, resize terminals, clear terminal history, or call hook/conversation-resolution internals through these tools.
|
package/pi-extension/ftown.js
CHANGED
|
@@ -100,13 +100,40 @@ function collectBranchUsage(ctx) {
|
|
|
100
100
|
};
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
+
function delayWithAbort(ms, signal) {
|
|
104
|
+
return new Promise((resolve) => {
|
|
105
|
+
if (signal.aborted) {
|
|
106
|
+
resolve();
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const finish = () => {
|
|
110
|
+
clearTimeout(timer);
|
|
111
|
+
signal.removeEventListener('abort', finish);
|
|
112
|
+
resolve();
|
|
113
|
+
};
|
|
114
|
+
const timer = setTimeout(finish, ms);
|
|
115
|
+
timer.unref?.();
|
|
116
|
+
signal.addEventListener('abort', finish, { once: true });
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
|
|
103
120
|
/** Register ftown lifecycle forwarding and mail delivery on Pi's extension API. */
|
|
104
121
|
export function registerFtownPiExtension(pi, options = {}) {
|
|
105
122
|
const env = options.env ?? process.env;
|
|
106
123
|
const fetchImpl = options.fetch ?? globalThis.fetch;
|
|
107
124
|
const readBridgePointer = options.readBridgePointer ?? defaultReadBridgePointer;
|
|
108
125
|
const ftownSessionId = env.FTOWN_SESSION_ID?.trim();
|
|
126
|
+
const mailWakeWaitSeconds = options.mailWakeWaitSeconds ?? 30;
|
|
127
|
+
const mailWakeIdleDelayMs = options.mailWakeIdleDelayMs ?? 1_000;
|
|
128
|
+
const mailWakeMaxRetryDelayMs = Math.max(
|
|
129
|
+
mailWakeIdleDelayMs,
|
|
130
|
+
options.mailWakeMaxRetryDelayMs ?? 30_000,
|
|
131
|
+
);
|
|
132
|
+
const delay = options.delay ?? delayWithAbort;
|
|
109
133
|
const mutationResults = new Map();
|
|
134
|
+
let mailWakeController;
|
|
135
|
+
let mailWakeTask;
|
|
136
|
+
let mailWakeClosed = false;
|
|
110
137
|
|
|
111
138
|
async function executeOnce(toolName, toolCallId, operation) {
|
|
112
139
|
if (!toolCallId) return operation();
|
|
@@ -140,6 +167,7 @@ export function registerFtownPiExtension(pi, options = {}) {
|
|
|
140
167
|
lastResponse = response;
|
|
141
168
|
} catch {
|
|
142
169
|
// A tmux-resurrected session may hold a stale port. Try bridge.json next.
|
|
170
|
+
if (init.signal?.aborted) break;
|
|
143
171
|
}
|
|
144
172
|
}
|
|
145
173
|
return lastResponse;
|
|
@@ -175,19 +203,13 @@ export function registerFtownPiExtension(pi, options = {}) {
|
|
|
175
203
|
});
|
|
176
204
|
}
|
|
177
205
|
|
|
178
|
-
async function drainMail() {
|
|
206
|
+
async function drainMail(wait = 0, signal) {
|
|
179
207
|
if (!ftownSessionId) return [];
|
|
180
|
-
const
|
|
181
|
-
`/api/sessions/${encodeURIComponent(ftownSessionId)}/inbox?wait
|
|
182
|
-
{ method: 'GET' },
|
|
208
|
+
const payload = await requestJson(
|
|
209
|
+
`/api/sessions/${encodeURIComponent(ftownSessionId)}/inbox?wait=${wait}`,
|
|
210
|
+
{ method: 'GET', signal },
|
|
183
211
|
);
|
|
184
|
-
|
|
185
|
-
try {
|
|
186
|
-
const payload = await response.json();
|
|
187
|
-
return Array.isArray(payload?.messages) ? payload.messages : [];
|
|
188
|
-
} catch {
|
|
189
|
-
return [];
|
|
190
|
-
}
|
|
212
|
+
return Array.isArray(payload?.messages) ? payload.messages : [];
|
|
191
213
|
}
|
|
192
214
|
|
|
193
215
|
async function listSessions() {
|
|
@@ -211,7 +233,36 @@ export function registerFtownPiExtension(pi, options = {}) {
|
|
|
211
233
|
throw new Error(`Session not found: ${normalized}`);
|
|
212
234
|
}
|
|
213
235
|
|
|
236
|
+
function hasOwn(value, key) {
|
|
237
|
+
return value !== null && typeof value === 'object'
|
|
238
|
+
&& Object.prototype.hasOwnProperty.call(value, key);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
function requireString(params, field, label = field) {
|
|
242
|
+
const value = params?.[field];
|
|
243
|
+
if (typeof value !== 'string' || !value.trim()) throw new Error(`${label} is required`);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function requireProperty(params, field, label = field) {
|
|
247
|
+
if (!hasOwn(params, field)) throw new Error(`${label} is required`);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
function requireOperation(params, allowed) {
|
|
251
|
+
if (!allowed.includes(params?.operation)) {
|
|
252
|
+
throw new Error(`operation must be one of: ${allowed.join(', ')}`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function validateMailParams(params) {
|
|
257
|
+
requireOperation(params, ['send', 'read']);
|
|
258
|
+
if (params.operation === 'send') {
|
|
259
|
+
requireString(params, 'target');
|
|
260
|
+
requireString(params, 'body');
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
214
264
|
async function runMail(params) {
|
|
265
|
+
validateMailParams(params);
|
|
215
266
|
if (params.operation === 'read') {
|
|
216
267
|
if (!ftownSessionId) throw new Error('FTOWN_SESSION_ID is unavailable');
|
|
217
268
|
const query = new URLSearchParams({ wait: '0' });
|
|
@@ -261,31 +312,19 @@ export function registerFtownPiExtension(pi, options = {}) {
|
|
|
261
312
|
label: 'ftown mail',
|
|
262
313
|
description: 'Send durable mail to another ftown session, or read this session inbox.',
|
|
263
314
|
parameters: {
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
{
|
|
278
|
-
type: 'object',
|
|
279
|
-
properties: {
|
|
280
|
-
operation: { const: 'read' },
|
|
281
|
-
peek: { type: 'boolean', description: 'Do not mark messages delivered.' },
|
|
282
|
-
all: { type: 'boolean', description: 'Include already-delivered messages.' },
|
|
283
|
-
limit: { type: 'integer', minimum: 1, maximum: 100 },
|
|
284
|
-
},
|
|
285
|
-
required: ['operation'],
|
|
286
|
-
additionalProperties: false,
|
|
287
|
-
},
|
|
288
|
-
],
|
|
315
|
+
type: 'object',
|
|
316
|
+
properties: {
|
|
317
|
+
operation: { type: 'string', enum: ['send', 'read'] },
|
|
318
|
+
target: { type: 'string', description: 'Session id/name, or "parent".' },
|
|
319
|
+
body: { type: 'string', minLength: 1 },
|
|
320
|
+
type: { type: 'string', enum: ['message', 'task', 'result', 'escalation'] },
|
|
321
|
+
threadId: { type: 'string' },
|
|
322
|
+
peek: { type: 'boolean', description: 'Do not mark messages delivered.' },
|
|
323
|
+
all: { type: 'boolean', description: 'Include already-delivered messages.' },
|
|
324
|
+
limit: { type: 'integer', minimum: 1, maximum: 100 },
|
|
325
|
+
},
|
|
326
|
+
required: ['operation'],
|
|
327
|
+
additionalProperties: false,
|
|
289
328
|
},
|
|
290
329
|
async execute(toolCallId, params) {
|
|
291
330
|
try {
|
|
@@ -322,6 +361,9 @@ export function registerFtownPiExtension(pi, options = {}) {
|
|
|
322
361
|
});
|
|
323
362
|
|
|
324
363
|
async function runSessions(params) {
|
|
364
|
+
requireOperation(params, ['list', 'archive', 'get', 'usage', 'running', 'screen', 'grep']);
|
|
365
|
+
if (!['list', 'archive'].includes(params.operation)) requireString(params, 'target');
|
|
366
|
+
if (params.operation === 'grep') requireString(params, 'pattern');
|
|
325
367
|
if (params.operation === 'archive') {
|
|
326
368
|
return requestJson('/api/archive', { method: 'GET' });
|
|
327
369
|
}
|
|
@@ -369,30 +411,19 @@ export function registerFtownPiExtension(pi, options = {}) {
|
|
|
369
411
|
label: 'ftown sessions',
|
|
370
412
|
description: 'List or inspect ftown sessions, running state, archive, token usage, terminal screen, and terminal log matches.',
|
|
371
413
|
parameters: {
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
...['get', 'usage', 'running'].map((operation) => ({
|
|
378
|
-
type: 'object', properties: { operation: { const: operation }, target: targetProperty },
|
|
379
|
-
required: ['operation', 'target'], additionalProperties: false,
|
|
380
|
-
})),
|
|
381
|
-
{
|
|
382
|
-
type: 'object',
|
|
383
|
-
properties: { operation: { const: 'screen' }, target: targetProperty, ...pageProperties },
|
|
384
|
-
required: ['operation', 'target'], additionalProperties: false,
|
|
385
|
-
},
|
|
386
|
-
{
|
|
387
|
-
type: 'object',
|
|
388
|
-
properties: {
|
|
389
|
-
operation: { const: 'grep' }, target: targetProperty,
|
|
390
|
-
pattern: { type: 'string', minLength: 1 }, ...pageProperties,
|
|
391
|
-
context: { type: 'integer', minimum: 0, maximum: 10 },
|
|
392
|
-
},
|
|
393
|
-
required: ['operation', 'target', 'pattern'], additionalProperties: false,
|
|
414
|
+
type: 'object',
|
|
415
|
+
properties: {
|
|
416
|
+
operation: {
|
|
417
|
+
type: 'string',
|
|
418
|
+
enum: ['list', 'archive', 'get', 'usage', 'running', 'screen', 'grep'],
|
|
394
419
|
},
|
|
395
|
-
|
|
420
|
+
target: targetProperty,
|
|
421
|
+
pattern: { type: 'string', minLength: 1 },
|
|
422
|
+
...pageProperties,
|
|
423
|
+
context: { type: 'integer', minimum: 0, maximum: 10 },
|
|
424
|
+
},
|
|
425
|
+
required: ['operation'],
|
|
426
|
+
additionalProperties: false,
|
|
396
427
|
},
|
|
397
428
|
async execute(_toolCallId, params) {
|
|
398
429
|
try {
|
|
@@ -422,6 +453,7 @@ export function registerFtownPiExtension(pi, options = {}) {
|
|
|
422
453
|
type: 'object',
|
|
423
454
|
properties: {
|
|
424
455
|
shell: {
|
|
456
|
+
type: 'string',
|
|
425
457
|
enum: ['claude', 'cursor', 'codex', 'grok', 'pi', 'kimi-code', 'opencode', 'shell', 'zai', 'kimi', 'deepseek', 'fireworks'],
|
|
426
458
|
},
|
|
427
459
|
prompt: { type: 'string', minLength: 1 },
|
|
@@ -467,6 +499,10 @@ export function registerFtownPiExtension(pi, options = {}) {
|
|
|
467
499
|
});
|
|
468
500
|
|
|
469
501
|
async function runSessionManage(params) {
|
|
502
|
+
requireOperation(params, ['stop', 'remove', 'revive', 'rename', 'reparent']);
|
|
503
|
+
requireString(params, 'target');
|
|
504
|
+
if (params.operation === 'rename') requireString(params, 'name');
|
|
505
|
+
if (params.operation === 'reparent') requireProperty(params, 'parent');
|
|
470
506
|
if (params.operation === 'revive') {
|
|
471
507
|
const payload = await requestJson('/api/archive', { method: 'GET' });
|
|
472
508
|
const archived = Array.isArray(payload?.archived) ? payload.archived : [];
|
|
@@ -517,28 +553,17 @@ export function registerFtownPiExtension(pi, options = {}) {
|
|
|
517
553
|
label: 'manage ftown session',
|
|
518
554
|
description: 'Stop, rename, reparent, remove, or revive an ftown session.',
|
|
519
555
|
parameters: {
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
})),
|
|
525
|
-
{
|
|
526
|
-
type: 'object',
|
|
527
|
-
properties: {
|
|
528
|
-
operation: { const: 'rename' }, target: targetProperty,
|
|
529
|
-
name: { type: 'string', minLength: 1 },
|
|
530
|
-
},
|
|
531
|
-
required: ['operation', 'target', 'name'], additionalProperties: false,
|
|
532
|
-
},
|
|
533
|
-
{
|
|
534
|
-
type: 'object',
|
|
535
|
-
properties: {
|
|
536
|
-
operation: { const: 'reparent' }, target: targetProperty,
|
|
537
|
-
parent: { type: ['string', 'null'], description: 'Parent id/name; null clears it.' },
|
|
538
|
-
},
|
|
539
|
-
required: ['operation', 'target', 'parent'], additionalProperties: false,
|
|
556
|
+
type: 'object',
|
|
557
|
+
properties: {
|
|
558
|
+
operation: {
|
|
559
|
+
type: 'string', enum: ['stop', 'remove', 'revive', 'rename', 'reparent'],
|
|
540
560
|
},
|
|
541
|
-
|
|
561
|
+
target: targetProperty,
|
|
562
|
+
name: { type: 'string', minLength: 1 },
|
|
563
|
+
parent: { type: ['string', 'null'], description: 'Parent id/name; null clears it.' },
|
|
564
|
+
},
|
|
565
|
+
required: ['operation', 'target'],
|
|
566
|
+
additionalProperties: false,
|
|
542
567
|
},
|
|
543
568
|
async execute(toolCallId, params) {
|
|
544
569
|
try {
|
|
@@ -567,41 +592,54 @@ export function registerFtownPiExtension(pi, options = {}) {
|
|
|
567
592
|
}
|
|
568
593
|
|
|
569
594
|
const loopScheduleProperty = {
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
},
|
|
580
|
-
{
|
|
581
|
-
type: 'object',
|
|
582
|
-
properties: {
|
|
583
|
-
kind: { const: 'cron' },
|
|
584
|
-
expression: { type: 'string', minLength: 1 },
|
|
585
|
-
tz: { type: 'string', minLength: 1 },
|
|
586
|
-
},
|
|
587
|
-
required: ['kind', 'expression'],
|
|
588
|
-
additionalProperties: false,
|
|
589
|
-
},
|
|
590
|
-
],
|
|
595
|
+
type: 'object',
|
|
596
|
+
properties: {
|
|
597
|
+
kind: { type: 'string', enum: ['interval', 'cron'] },
|
|
598
|
+
everyMs: { type: 'integer', minimum: 1000 },
|
|
599
|
+
expression: { type: 'string', minLength: 1 },
|
|
600
|
+
tz: { type: 'string', minLength: 1 },
|
|
601
|
+
},
|
|
602
|
+
required: ['kind'],
|
|
603
|
+
additionalProperties: false,
|
|
591
604
|
};
|
|
592
605
|
const loopDraftProperties = {
|
|
593
606
|
name: { type: 'string', minLength: 1 },
|
|
594
607
|
task: { type: 'string', minLength: 1 },
|
|
595
608
|
schedule: loopScheduleProperty,
|
|
596
|
-
shell: { enum: ['claude', 'cursor', 'codex', 'grok', 'pi', 'kimi-code', 'opencode', 'shell'] },
|
|
609
|
+
shell: { type: 'string', enum: ['claude', 'cursor', 'codex', 'grok', 'pi', 'kimi-code', 'opencode', 'shell'] },
|
|
597
610
|
workdir: { type: 'string' },
|
|
598
611
|
model: { type: 'string' },
|
|
599
612
|
enabled: { type: 'boolean' },
|
|
600
|
-
overlapPolicy: { enum: ['skip', 'allow'] },
|
|
613
|
+
overlapPolicy: { type: 'string', enum: ['skip', 'allow'] },
|
|
601
614
|
retention: { type: ['integer', 'null'], minimum: 0 },
|
|
602
615
|
maxRuntimeMs: { type: 'integer', minimum: 1000 },
|
|
603
616
|
group: { type: 'string' },
|
|
604
617
|
};
|
|
618
|
+
const loopDraftFields = Object.keys(loopDraftProperties);
|
|
619
|
+
|
|
620
|
+
function validateLoopSchedule(schedule) {
|
|
621
|
+
requireProperty({ schedule }, 'schedule');
|
|
622
|
+
if (schedule === null || typeof schedule !== 'object') throw new Error('schedule is required');
|
|
623
|
+
requireOperation({ operation: schedule.kind }, ['interval', 'cron']);
|
|
624
|
+
if (schedule.kind === 'interval') requireProperty(schedule, 'everyMs', 'schedule.everyMs');
|
|
625
|
+
if (schedule.kind === 'cron') requireString(schedule, 'expression', 'schedule.expression');
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
function validateLoopParams(params) {
|
|
629
|
+
requireOperation(params, ['list', 'get', 'runs', 'run_now', 'delete', 'create', 'update']);
|
|
630
|
+
if (['get', 'runs', 'run_now', 'delete', 'update'].includes(params.operation)) {
|
|
631
|
+
requireString(params, 'target');
|
|
632
|
+
}
|
|
633
|
+
if (params.operation === 'create') {
|
|
634
|
+
requireString(params, 'name');
|
|
635
|
+
requireString(params, 'task');
|
|
636
|
+
requireProperty(params, 'schedule');
|
|
637
|
+
}
|
|
638
|
+
if (params.operation === 'update' && !loopDraftFields.some((field) => hasOwn(params, field))) {
|
|
639
|
+
throw new Error('At least one field to update is required');
|
|
640
|
+
}
|
|
641
|
+
if (hasOwn(params, 'schedule')) validateLoopSchedule(params.schedule);
|
|
642
|
+
}
|
|
605
643
|
|
|
606
644
|
function loopBody(params, create = false) {
|
|
607
645
|
const body = {};
|
|
@@ -626,35 +664,21 @@ export function registerFtownPiExtension(pi, options = {}) {
|
|
|
626
664
|
label: 'ftown loops',
|
|
627
665
|
description: 'List, inspect, create, update, delete, or run scheduled ftown loops.',
|
|
628
666
|
parameters: {
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
...['get', 'runs', 'run_now', 'delete'].map((operation) => ({
|
|
635
|
-
type: 'object',
|
|
636
|
-
properties: { operation: { const: operation }, target: { type: 'string' } },
|
|
637
|
-
required: ['operation', 'target'], additionalProperties: false,
|
|
638
|
-
})),
|
|
639
|
-
{
|
|
640
|
-
type: 'object',
|
|
641
|
-
properties: { operation: { const: 'create' }, ...loopDraftProperties },
|
|
642
|
-
required: ['operation', 'name', 'task', 'schedule'],
|
|
643
|
-
additionalProperties: false,
|
|
644
|
-
},
|
|
645
|
-
{
|
|
646
|
-
type: 'object',
|
|
647
|
-
properties: {
|
|
648
|
-
operation: { const: 'update' }, target: { type: 'string' }, ...loopDraftProperties,
|
|
649
|
-
},
|
|
650
|
-
required: ['operation', 'target'],
|
|
651
|
-
minProperties: 3,
|
|
652
|
-
additionalProperties: false,
|
|
667
|
+
type: 'object',
|
|
668
|
+
properties: {
|
|
669
|
+
operation: {
|
|
670
|
+
type: 'string',
|
|
671
|
+
enum: ['list', 'get', 'runs', 'run_now', 'delete', 'create', 'update'],
|
|
653
672
|
},
|
|
654
|
-
|
|
673
|
+
target: { type: 'string' },
|
|
674
|
+
...loopDraftProperties,
|
|
675
|
+
},
|
|
676
|
+
required: ['operation'],
|
|
677
|
+
additionalProperties: false,
|
|
655
678
|
},
|
|
656
679
|
async execute(toolCallId, params) {
|
|
657
680
|
try {
|
|
681
|
+
validateLoopParams(params);
|
|
658
682
|
if (params.operation === 'create') {
|
|
659
683
|
return await executeOnce('ftown_loops', toolCallId, async () =>
|
|
660
684
|
toolResult(await requestJson('/api/loops', {
|
|
@@ -689,19 +713,57 @@ export function registerFtownPiExtension(pi, options = {}) {
|
|
|
689
713
|
},
|
|
690
714
|
});
|
|
691
715
|
|
|
692
|
-
async function deliverMail() {
|
|
693
|
-
const messages = await drainMail();
|
|
694
|
-
if (messages.length === 0) return;
|
|
716
|
+
async function deliverMail(wait = 0, signal) {
|
|
717
|
+
const messages = await drainMail(wait, signal);
|
|
718
|
+
if (signal?.aborted || messages.length === 0) return 0;
|
|
695
719
|
const formatted = messages.map(formatMail).join('\n');
|
|
696
720
|
pi.sendUserMessage(
|
|
697
721
|
`[ftown mail]\n${formatted}\n` +
|
|
698
722
|
'Handle this message and reply with the `ftown_mail` tool where appropriate.',
|
|
723
|
+
{ deliverAs: 'followUp' },
|
|
699
724
|
);
|
|
725
|
+
return messages.length;
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
async function runMailWake(signal) {
|
|
729
|
+
let retryDelayMs = mailWakeIdleDelayMs;
|
|
730
|
+
while (!signal.aborted) {
|
|
731
|
+
try {
|
|
732
|
+
const delivered = await deliverMail(mailWakeWaitSeconds, signal);
|
|
733
|
+
retryDelayMs = mailWakeIdleDelayMs;
|
|
734
|
+
if (delivered === 0 && !signal.aborted) {
|
|
735
|
+
await delay(mailWakeIdleDelayMs, signal);
|
|
736
|
+
}
|
|
737
|
+
} catch {
|
|
738
|
+
if (!signal.aborted) {
|
|
739
|
+
await delay(retryDelayMs, signal);
|
|
740
|
+
retryDelayMs = Math.min(retryDelayMs * 2, mailWakeMaxRetryDelayMs);
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
function startMailWake() {
|
|
747
|
+
if (!ftownSessionId || mailWakeClosed || mailWakeTask) return;
|
|
748
|
+
const controller = new AbortController();
|
|
749
|
+
mailWakeController = controller;
|
|
750
|
+
const task = runMailWake(controller.signal);
|
|
751
|
+
mailWakeTask = task;
|
|
752
|
+
const cleanup = () => {
|
|
753
|
+
if (mailWakeTask === task) mailWakeTask = undefined;
|
|
754
|
+
if (mailWakeController === controller) mailWakeController = undefined;
|
|
755
|
+
};
|
|
756
|
+
void task.then(cleanup, cleanup);
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
function stopMailWake() {
|
|
760
|
+
mailWakeClosed = true;
|
|
761
|
+
mailWakeController?.abort();
|
|
700
762
|
}
|
|
701
763
|
|
|
702
764
|
pi.on('session_start', async (event, ctx) => {
|
|
703
765
|
await postHook('SessionStart', ctx, { reason: event.reason });
|
|
704
|
-
|
|
766
|
+
startMailWake();
|
|
705
767
|
});
|
|
706
768
|
|
|
707
769
|
pi.on('before_agent_start', async (event, ctx) => {
|
|
@@ -727,10 +789,11 @@ export function registerFtownPiExtension(pi, options = {}) {
|
|
|
727
789
|
pi.on('agent_settled', async (_event, ctx) => {
|
|
728
790
|
const usage = collectBranchUsage(ctx);
|
|
729
791
|
await postHook('Stop', ctx, usage ? { usage } : {});
|
|
730
|
-
await deliverMail();
|
|
792
|
+
if (!mailWakeTask) await deliverMail();
|
|
731
793
|
});
|
|
732
794
|
|
|
733
795
|
pi.on('session_shutdown', async (event, ctx) => {
|
|
796
|
+
stopMailWake();
|
|
734
797
|
await postHook('SessionEnd', ctx, { reason: event.reason });
|
|
735
798
|
});
|
|
736
799
|
}
|
|
@@ -80,10 +80,12 @@ your turn and let fallback mail wake you instead of running a polling loop.
|
|
|
80
80
|
|
|
81
81
|
## Messaging fallback (mail)
|
|
82
82
|
|
|
83
|
-
Each session has an inbox. Claude
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
83
|
+
Each session has an inbox. Claude and codex receive mail automatically at turn
|
|
84
|
+
boundaries via hooks. Pi's bundled extension maintains a long-poll and wakes idle
|
|
85
|
+
Pi sessions with a native follow-up turn. None of these paths inject terminal
|
|
86
|
+
keystrokes. Cursor and shell sessions have no hooks: when idle they get a one-line
|
|
87
|
+
nudge telling them to run `ftown-harness mail read`, so expect slightly slower
|
|
88
|
+
pickup there.
|
|
87
89
|
|
|
88
90
|
```bash
|
|
89
91
|
# Send work / instructions to a child
|
|
@@ -61,10 +61,11 @@ schedule syntax, manual runs, pause/resume, and run history, read
|
|
|
61
61
|
## Messaging (mail)
|
|
62
62
|
|
|
63
63
|
`tell` posts to the target session's **inbox**. Mail is delivered into the
|
|
64
|
-
recipient's context automatically
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
64
|
+
recipient's context automatically (as `[ftown mail]` context), so there is no
|
|
65
|
+
keystroke injection by default. Claude and codex use turn-boundary hooks. Pi's
|
|
66
|
+
bundled extension keeps a cancellable long-poll open and starts a native
|
|
67
|
+
follow-up turn when mail arrives, including while Pi is idle. Cursor and shell
|
|
68
|
+
sessions rely on an idle one-line nudge to run `ftown-harness mail read` instead.
|
|
68
69
|
|
|
69
70
|
```bash
|
|
70
71
|
# Tell a specific session
|