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.
@@ -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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"}
@@ -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 Stop-hook listen window only if mail can plausibly
108
- * arrive: it has a parent, has children, was marked an orchestrator, or has
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;
@@ -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 Stop-hook listen window only if mail can plausibly
236
- * arrive: it has a parent, has children, was marked an orchestrator, or has
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":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAI3D,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC9C,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACxC,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AACzC,8EAA8E;AAC9E,4EAA4E;AAC5E,8EAA8E;AAC9E,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;AACjD,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;AACjD,8EAA8E;AAC9E,6EAA6E;AAC7E,6EAA6E;AAC7E,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;AACjD,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,MAAM,CAAC;AAE/C,MAAM,CAAC,MAAM,UAAU,GAAuC,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;AAE1G,kFAAkF;AAClF,0DAA0D;AAC1D,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAErC,qFAAqF;AACrF,yEAAyE;AACzE,SAAS,eAAe,CAAC,UAAiC;IACxD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,IAAI;SACR,OAAO,CAAC,wBAAwB,EAAE,GAAG,CAAC;SACtC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;AACZ,CAAC;AAkDD;;;;;;;;GAQG;AACH,MAAM,OAAO,mBAAmB;IACtB,KAAK,CAAkC;IACvC,SAAS,CAA+B;IACxC,MAAM,CAA4B;IACzB,GAAG,CAAe;IAClB,YAAY,CAAkD;IAC9D,cAAc,CAAoC;IAE3D,WAAW,GAA4B,IAAI,GAAG,EAAE,CAAC;IACjD,WAAW,GAAiC,IAAI,GAAG,EAAE,CAAC;IACtD,gBAAgB,GAAwB,IAAI,GAAG,EAAE,CAAC;IAClD,WAAW,GAAwB,IAAI,GAAG,EAAE,CAAC;IAC7C,cAAc,GAAwB,IAAI,GAAG,EAAE,CAAC;IAExD,YAAY,UAA+B,EAAE;QAC3C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC;QACnC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;QACrC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3E,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAwB,CAAC,CAAC,CAAC;IACrG,CAAC;IAED,QAAQ,CAAC,KAA+B;QACtC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,YAAY,CAAC,SAAgC;QAC3C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,SAAS,CAAC,MAA0B;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,2DAA2D;IAC3D,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;IACxD,CAAC;IAED,oEAAoE;IACpE,IAAI;QACF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;YAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC1E,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;YAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,sFAAsF;IACtF,aAAa,CAAC,SAAiB;QAC7B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,oDAAoD;IACpD,aAAa,CAAC,SAAiB;QAC7B,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,oFAAoF;IACpF,gEAAgE;IAChE,KAAK,CAAC,aAAa,CAAC,OAAgB,EAAE,MAAc,EAAE,IAAY;QAChE,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,KAAK,OAAO,CAAC;QACnE,MAAM,IAAI,GAAG,OAAO;YAClB,CAAC,CAAC,mBAAmB,MAAM,KAAK,IAAI,EAAE;YACtC,CAAC,CAAC,sBAAsB,MAAM,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC;QAC/D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACvD,kFAAkF;QAClF,0DAA0D;QAC1D,MAAM,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,OAAgB,EAAE,IAA6B;QAC9D,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC;QACtD,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;QAC9C,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,GAAG,oBAAoB,EAAE,CAAC;YACvC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,oBAAoB,SAAS,EAAE,CAAC;QACnF,CAAC;QAED,IAAI,IAAI,GAAwB,SAAS,CAAC;QAC1C,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAA2B,CAAC,EAAE,CAAC;gBAC5F,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,kCAAkC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YAC1F,CAAC;YACD,IAAI,GAAG,IAAI,CAAC,IAA2B,CAAC;QAC1C,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;QAC/F,MAAM,QAAQ,GACZ,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/F,MAAM,QAAQ,GACZ,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAE/F,MAAM,GAAG,GAAG,iBAAiB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9F,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEjC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAChD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACrE,oEAAoE;YACpE,wEAAwE;YACxE,uEAAuE;YACvE,wEAAwE;YACxE,+CAA+C;YAC/C,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,MAAM,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,CAC/C,OAAO,CAAC,EAAE,EACV,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAC5B,MAAM,CACP,CAAC;gBACF,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,QAAQ,CAAC;gBACtE,CAAC,CAAC,0BAA0B;gBAC5B,CAAC,CAAC,mBAAmB,CAAC;YACxB,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,IAAI,IAAI,EAAE,UAAU,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;IAClC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,QAAQ,CACZ,OAAgB,EAChB,KAAmE;QAEnE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QAC7C,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;QAEzD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG;gBACxB,CAAC,CAAC,MAAM,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC;gBAClD,CAAC,CAAC,MAAM,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAChD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;QACzC,CAAC;QAED,qEAAqE;QACrE,sEAAsE;QACtE,yEAAyE;QACzE,6DAA6D;QAC7D,IAAI,aAAa,GAAG,IAAI,CAAC;QACzB,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAC1D,aAAa,GAAG,CAAC,CAAC;QACpB,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAChE,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,aAAa,CAC1C,OAAO,CAAC,EAAE,EACV,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAC5B,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CACrC,CAAC;YACF,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QACjD,CAAC;QAED,0EAA0E;QAC1E,kEAAkE;QAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAClD,IAAI,QAAQ;YAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAEnC,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,eAAmD,CAAC;QACxD,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAgB,CAAC,OAAO,EAAE,EAAE;YACtD,eAAe,GAAG,OAAO,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,GAAe;YACzB,OAAO,EAAE,CAAC,SAAwB,EAAE,EAAE;gBACpC,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;gBAC3B,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,MAAM,EAAE,CAAC;oBAChD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACtC,CAAC;gBACD,eAAe,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC;SACF,CAAC;QACF,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE;YACnC,0EAA0E;YAC1E,uEAAuE;YACvE,iDAAiD;YACjD,IAAI,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,MAAM;gBAAE,OAAO;YACnE,SAAS;iBACN,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;iBAC3B,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;gBAChB,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO,EAAmB,CAAC;gBAChE,OAAO,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;YAC/E,CAAC,CAAC;iBACD,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;iBACxC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAEzC,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,MAAM;gBAAE,OAAO;YACxD,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAC3B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACtC,CAAC,CAAC;QAEF,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IACjD,CAAC;IAED;;iCAE6B;IAC7B,KAAK,CAAC,kBAAkB,CAAC,OAAgB;QACvC,IAAI,OAAO,CAAC,eAAe;YAAE,OAAO,IAAI,CAAC;QACzC,IAAI,OAAO,CAAC,GAAG,EAAE,kBAAkB,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QACzD,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QACjD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QACjD,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,OAAO,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QACxE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC5D,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,kFAAkF;IAClF,2EAA2E;IAC3E,iFAAiF;IACzE,iBAAiB,CAAC,SAAiB,EAAE,SAAiB,EAAE,OAAO,GAAG,mBAAmB;QAC3F,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE;YACnC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACnC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC1C,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACvG,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,OAAO,CAAC,CAAC;QACZ,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QAChB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,SAAiB;QAC3C,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAE3D,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC;QAClE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QACpE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACrD,IAAI,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,mBAAmB,EAAE,CAAC;YAC5E,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,0BAA0B,CAAC,CAAC;YACzE,OAAO;QACT,CAAC;QAED,yEAAyE;QACzE,wEAAwE;QACxE,mEAAmE;QACnE,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC;YAC3C,IAAI,SAAS,GAAG,0BAA0B,EAAE,CAAC;gBAC3C,0EAA0E;gBAC1E,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,0BAA0B,GAAG,SAAS,CAAC,CAAC;gBACrF,OAAO;YACT,CAAC;QACH,CAAC;QAED,0EAA0E;QAC1E,uEAAuE;QACvE,yEAAyE;QACzE,4DAA4D;QAC5D,oEAAoE;QACpE,iEAAiE;QACjE,qEAAqE;QACrE,UAAU;QACV,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC;YAAE,OAAO;QAC9C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,mBAAmB,CAC9B,gCAAgC,SAAS,6DAA6D,CACvG,CAAC;QACF,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC;IAEO,KAAK,CAAC,EAAU;QACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAClE,CAAC;CACF"}
1
+ {"version":3,"file":"mail-delivery.js","sourceRoot":"","sources":["../src/mail-delivery.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ftown-bridge",
3
- "version": "0.19.8",
3
+ "version": "0.19.10",
4
4
  "description": "CLI bridge for ftown — generic PTY-over-Centrifugo relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -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.
@@ -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 response = await request(
181
- `/api/sessions/${encodeURIComponent(ftownSessionId)}/inbox?wait=0`,
182
- { method: 'GET' },
208
+ const payload = await requestJson(
209
+ `/api/sessions/${encodeURIComponent(ftownSessionId)}/inbox?wait=${wait}`,
210
+ { method: 'GET', signal },
183
211
  );
184
- if (!response) return [];
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
- anyOf: [
265
- {
266
- type: 'object',
267
- properties: {
268
- operation: { const: 'send' },
269
- target: { type: 'string', description: 'Session id/name, or "parent".' },
270
- body: { type: 'string', minLength: 1 },
271
- type: { enum: ['message', 'task', 'result', 'escalation'] },
272
- threadId: { type: 'string' },
273
- },
274
- required: ['operation', 'target', 'body'],
275
- additionalProperties: false,
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
- anyOf: [
373
- {
374
- type: 'object', properties: { operation: { enum: ['list', 'archive'] } },
375
- required: ['operation'], additionalProperties: false,
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
- anyOf: [
521
- ...['stop', 'remove', 'revive'].map((operation) => ({
522
- type: 'object', properties: { operation: { const: operation }, target: targetProperty },
523
- required: ['operation', 'target'], additionalProperties: false,
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
- anyOf: [
571
- {
572
- type: 'object',
573
- properties: {
574
- kind: { const: 'interval' },
575
- everyMs: { type: 'integer', minimum: 1000 },
576
- },
577
- required: ['kind', 'everyMs'],
578
- additionalProperties: false,
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
- anyOf: [
630
- {
631
- type: 'object', properties: { operation: { const: 'list' } },
632
- required: ['operation'], additionalProperties: false,
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
- await deliverMail();
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, codex, and Pi sessions receive mail automatically
84
- at turn boundaries via hooks no keystroke injection. Cursor and shell sessions
85
- have no hooks: when idle they get a one-line nudge telling them to run
86
- `ftown-harness mail read`, so expect slightly slower pickup there.
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 at turn boundaries (as `[ftown mail]`
65
- context), so there is no keystroke injection by default. Claude, codex, and Pi
66
- sessions get this hook-based delivery; cursor and shell sessions rely on an
67
- idle one-line nudge to run `ftown-harness mail read` instead.
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