poly-weaver 0.15.2 → 0.15.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/crosscheck/coordinator.d.ts.map +1 -1
  2. package/dist/crosscheck/coordinator.js +43 -9
  3. package/dist/crosscheck/coordinator.js.map +1 -1
  4. package/dist/crosscheck/live-agent-session.d.ts +3 -0
  5. package/dist/crosscheck/live-agent-session.d.ts.map +1 -1
  6. package/dist/crosscheck/live-agent-session.js +9 -2
  7. package/dist/crosscheck/live-agent-session.js.map +1 -1
  8. package/dist/offscreen/controller.d.ts +6 -3
  9. package/dist/offscreen/controller.d.ts.map +1 -1
  10. package/dist/offscreen/controller.js +127 -71
  11. package/dist/offscreen/controller.js.map +1 -1
  12. package/dist/offscreen/inquiry-sender.d.ts +1 -0
  13. package/dist/offscreen/inquiry-sender.d.ts.map +1 -1
  14. package/dist/offscreen/inquiry-sender.js +1 -0
  15. package/dist/offscreen/inquiry-sender.js.map +1 -1
  16. package/dist/offscreen/session-turn-monitor.d.ts +31 -32
  17. package/dist/offscreen/session-turn-monitor.d.ts.map +1 -1
  18. package/dist/offscreen/session-turn-monitor.js +318 -280
  19. package/dist/offscreen/session-turn-monitor.js.map +1 -1
  20. package/dist/offscreen/session-turn-receipt.d.ts +28 -0
  21. package/dist/offscreen/session-turn-receipt.d.ts.map +1 -0
  22. package/dist/offscreen/session-turn-receipt.js +53 -0
  23. package/dist/offscreen/session-turn-receipt.js.map +1 -0
  24. package/dist/providers/base-completion.d.ts +1 -0
  25. package/dist/providers/base-completion.d.ts.map +1 -1
  26. package/dist/providers/base-completion.js +4 -2
  27. package/dist/providers/base-completion.js.map +1 -1
  28. package/dist/providers/codex/completion.d.ts +4 -2
  29. package/dist/providers/codex/completion.d.ts.map +1 -1
  30. package/dist/providers/codex/completion.js +99 -14
  31. package/dist/providers/codex/completion.js.map +1 -1
  32. package/dist/providers/codex/strategy.d.ts.map +1 -1
  33. package/dist/providers/codex/strategy.js +3 -2
  34. package/dist/providers/codex/strategy.js.map +1 -1
  35. package/dist/providers/copilot/completion.js +10 -1
  36. package/dist/providers/copilot/completion.js.map +1 -1
  37. package/dist/providers/copilot/strategy.d.ts +1 -0
  38. package/dist/providers/copilot/strategy.d.ts.map +1 -1
  39. package/dist/providers/copilot/strategy.js +14 -1
  40. package/dist/providers/copilot/strategy.js.map +1 -1
  41. package/dist/providers/fork.d.ts +16 -0
  42. package/dist/providers/fork.d.ts.map +1 -1
  43. package/dist/providers/fork.js.map +1 -1
  44. package/dist/providers/live.d.ts.map +1 -1
  45. package/dist/providers/live.js +19 -0
  46. package/dist/providers/live.js.map +1 -1
  47. package/dist/providers/session-launch.d.ts +2 -0
  48. package/dist/providers/session-launch.d.ts.map +1 -1
  49. package/dist/providers/session-launch.js +9 -2
  50. package/dist/providers/session-launch.js.map +1 -1
  51. package/dist/terminal/paste-submit.d.ts +1 -0
  52. package/dist/terminal/paste-submit.d.ts.map +1 -1
  53. package/dist/terminal/paste-submit.js +7 -0
  54. package/dist/terminal/paste-submit.js.map +1 -1
  55. package/package.json +1 -1
@@ -5,6 +5,7 @@ import { VirtualTerminal } from "../terminal/virtual-terminal.js";
5
5
  import { resolveProvider } from "../providers/registry.js";
6
6
  import { throwIfAborted } from "../session/locator.js";
7
7
  import { ChildKittyNegotiator } from "../terminal/kitty-negotiator.js";
8
+ import { SessionTurnReceipt } from "../offscreen/session-turn-receipt.js";
8
9
  export class LiveAgentSession {
9
10
  driver;
10
11
  pty;
@@ -15,8 +16,9 @@ export class LiveAgentSession {
15
16
  mouseTracker;
16
17
  kittyNegotiator;
17
18
  lifecycle;
19
+ launchTurnReceipt;
18
20
  _identity;
19
- constructor(driver, pty, vt, baseline, resumed, ptyTail, mouseTracker, kittyNegotiator, lifecycle) {
21
+ constructor(driver, pty, vt, baseline, resumed, ptyTail, mouseTracker, kittyNegotiator, lifecycle, launchTurnReceipt) {
20
22
  this.driver = driver;
21
23
  this.pty = pty;
22
24
  this.vt = vt;
@@ -26,6 +28,7 @@ export class LiveAgentSession {
26
28
  this.mouseTracker = mouseTracker;
27
29
  this.kittyNegotiator = kittyNegotiator;
28
30
  this.lifecycle = lifecycle;
31
+ this.launchTurnReceipt = launchTurnReceipt;
29
32
  }
30
33
  get identity() {
31
34
  if (!this._identity)
@@ -45,6 +48,7 @@ export class LiveAgentSession {
45
48
  const mouseTracker = new MouseModeTracker();
46
49
  const kittyNegotiator = new ChildKittyNegotiator();
47
50
  const lifecycle = { closed: false };
51
+ const launchTurnReceipt = opts.launchTurnReceipt ?? new SessionTurnReceipt();
48
52
  let pty;
49
53
  let session;
50
54
  try {
@@ -58,6 +62,9 @@ export class LiveAgentSession {
58
62
  rows: opts.rows,
59
63
  interactive: true,
60
64
  });
65
+ if ((launch.resumeIdentity ? opts.prompt : (opts.freshPrompt ?? opts.prompt)).length > 0) {
66
+ launchTurnReceipt.markWritten();
67
+ }
61
68
  pty.onData((data) => {
62
69
  if (lifecycle.closed)
63
70
  return;
@@ -77,7 +84,7 @@ export class LiveAgentSession {
77
84
  if (!lifecycle.closed)
78
85
  opts.onExit?.(event);
79
86
  });
80
- session = new LiveAgentSession(opts.driver, pty, vt, launch.baseline, launch.resumeIdentity !== undefined, ptyTail, mouseTracker, kittyNegotiator, lifecycle);
87
+ session = new LiveAgentSession(opts.driver, pty, vt, launch.baseline, launch.resumeIdentity !== undefined, ptyTail, mouseTracker, kittyNegotiator, lifecycle, launchTurnReceipt);
81
88
  pty.openGate();
82
89
  opts.onSpawn?.(session);
83
90
  const identity = await provider.live.locateSessionFile(launch, {
@@ -1 +1 @@
1
- {"version":3,"file":"live-agent-session.js","sourceRoot":"","sources":["../../src/crosscheck/live-agent-session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"live-agent-session.js","sourceRoot":"","sources":["../../src/crosscheck/live-agent-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,EAAE,gBAAgB,EAAkB,MAAM,mCAAmC,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAK3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAc1E,MAAM,OAAO,gBAAgB;IAIhB;IACA;IACA;IACA;IACA;IACA;IACQ;IACA;IACA;IACR;IAZH,SAAS,CAAkC;IAEnD,YACW,MAAkB,EAClB,GAAc,EACd,EAAmB,EACnB,QAAgB,EAChB,OAAgB,EAChB,OAAsB,EACd,YAA8B,EAC9B,eAAqC,EACrC,SAA8B,EACtC,iBAAqC;QATrC,WAAM,GAAN,MAAM,CAAY;QAClB,QAAG,GAAH,GAAG,CAAW;QACd,OAAE,GAAF,EAAE,CAAiB;QACnB,aAAQ,GAAR,QAAQ,CAAQ;QAChB,YAAO,GAAP,OAAO,CAAS;QAChB,YAAO,GAAP,OAAO,CAAe;QACd,iBAAY,GAAZ,YAAY,CAAkB;QAC9B,oBAAe,GAAf,eAAe,CAAsB;QACrC,cAAS,GAAT,SAAS,CAAqB;QACtC,sBAAiB,GAAjB,iBAAiB,CAAoB;IAC7C,CAAC;IAEJ,IAAI,QAAQ;QACV,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QACnF,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC;IACtC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAA6B;QAC/C,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YACnD,cAAc,EAAE,IAAI,CAAC,cAAc;SACpC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;QACpC,MAAM,YAAY,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAC5C,MAAM,eAAe,GAAG,IAAI,oBAAoB,EAAE,CAAC;QACnD,MAAM,SAAS,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QACpC,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,IAAI,IAAI,kBAAkB,EAAE,CAAC;QAC7E,IAAI,GAA0B,CAAC;QAC/B,IAAI,OAAqC,CAAC;QAC1C,IAAI,CAAC;YACH,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5B,GAAG,GAAG,QAAQ,CAAC;gBACb,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,GAAG,EAAE,IAAI,CAAC,OAAO;gBACjB,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;gBACtC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI;aAClB,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzF,iBAAiB,CAAC,WAAW,EAAE,CAAC;YAClC,CAAC;YACD,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;gBAClB,IAAI,SAAS,CAAC,MAAM;oBAAE,OAAO;gBAC7B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACrB,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBAChC,MAAM,UAAU,GAAG,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBACtD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;oBAAE,GAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAClD,MAAM,YAAY,GAAG,CAAC,EAAE,CAAC,cAAc,CAAC;gBACxC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE;oBAClB,IAAI,YAAY;wBAAE,EAAE,CAAC,cAAc,EAAE,CAAC;oBACtC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACnB,IAAI,CAAC,SAAS,CAAC,MAAM;oBAAE,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;YACH,OAAO,GAAG,IAAI,gBAAgB,CAC5B,IAAI,CAAC,MAAM,EACX,GAAG,EACH,EAAE,EACF,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,cAAc,KAAK,SAAS,EACnC,OAAO,EACP,YAAY,EACZ,eAAe,EACf,SAAS,EACT,iBAAiB,CAClB,CAAC;YACF,GAAG,CAAC,QAAQ,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;YACxB,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE;gBAC7D,SAAS,EAAE,IAAI,CAAC,iBAAiB;gBACjC,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YACH,OAAO,CAAC,SAAS,GAAG,QAAQ,CAAC;YAC7B,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC;YACxB,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC;gBAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YAC7B,EAAE,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;IACtC,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,YAAY,CAAC,sBAAsB,EAAE,CAAC;IACpD,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC;IAC1C,CAAC;IAED,MAAM,CAAC,IAAY,EAAE,IAAY;QAC/B,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM;YAAE,OAAO;QAClC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC;YAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACjC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;IACpB,CAAC;CACF"}
@@ -39,8 +39,8 @@ export declare class OffscreenController {
39
39
  private readonly forkBaselines;
40
40
  private readonly forkLocateAborts;
41
41
  private readonly forkSubmitFloors;
42
- private readonly pendingTurnGenerations;
43
- private readonly pendingTurnAttempts;
42
+ private readonly pendingTurns;
43
+ private readonly pendingAttemptTimers;
44
44
  private readonly forkSubmitFloorReads;
45
45
  private readonly forkLocateWarned;
46
46
  private readonly activeArtifactIndexes;
@@ -72,8 +72,11 @@ export declare class OffscreenController {
72
72
  private startInquirySend;
73
73
  private markSendPending;
74
74
  private clearSendPending;
75
- private beginTurn;
75
+ private reserveTurn;
76
76
  private beginTurnAttempt;
77
+ private refreshStagedActivity;
78
+ private needsTurnObservation;
79
+ private clearStagedAttemptTimers;
77
80
  private prepareTurn;
78
81
  private releaseTurn;
79
82
  private ensureForkSession;
@@ -1 +1 @@
1
- {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/offscreen/controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/offscreen/controller.ts"],"names":[],"mappings":"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"}
@@ -8,9 +8,9 @@ import { registerOffscreenDisposer } from "./registry.js";
8
8
  import { SplitInquiryCoordinator } from "./split-inquiry.js";
9
9
  import { SPLIT_COLLAPSE_AT_COLS, } from "../user/split-surface.js";
10
10
  import { sendInquiryQuestion } from "./inquiry-sender.js";
11
- import { readSessionFile, readSessionFileWithStatus, } from "../session/reader.js";
11
+ import { readSessionFileWithStatus, } from "../session/reader.js";
12
12
  import { forkFileSubmitFloor, locateForkSessionFile, submitCount, } from "./fork-busy.js";
13
- import { SessionTurnMonitor, } from "./session-turn-monitor.js";
13
+ import { SessionTurnMonitor, SessionTurnReceipt, DEFAULT_TURN_ATTEMPT_TIMEOUT_MS, } from "./session-turn-monitor.js";
14
14
  import { abortableSleep } from "../util/abortable-sleep.js";
15
15
  const OFFSCREEN_MOUSE_SOURCE = "offscreen";
16
16
  const DEFAULT_TURN_POLL_MS = 500;
@@ -36,8 +36,8 @@ export class OffscreenController {
36
36
  forkBaselines = new Map();
37
37
  forkLocateAborts = new Map();
38
38
  forkSubmitFloors = new Map();
39
- pendingTurnGenerations = new Map();
40
- pendingTurnAttempts = new Map();
39
+ pendingTurns = new Map();
40
+ pendingAttemptTimers = new Map();
41
41
  forkSubmitFloorReads = new Map();
42
42
  forkLocateWarned = new Set();
43
43
  activeArtifactIndexes = new Map();
@@ -55,13 +55,14 @@ export class OffscreenController {
55
55
  // Snapshot the configs so later caller mutation can't reach the controller.
56
56
  this.artifactConfigs = { ...artifactConfigs };
57
57
  this.turnPollMs = inquiry?.turnPollMs ?? DEFAULT_TURN_POLL_MS;
58
- this.turnAttemptTimeoutMs = inquiry?.turnAttemptTimeoutMs;
58
+ this.turnAttemptTimeoutMs = inquiry?.turnAttemptTimeoutMs ?? DEFAULT_TURN_ATTEMPT_TIMEOUT_MS;
59
59
  this.tracksTurns =
60
60
  inquiry !== undefined || slots.some((slot) => slot.summarizePrompt !== undefined);
61
61
  this.unregister = registerOffscreenDisposer(() => this.dispose());
62
62
  }
63
63
  isIssueInquiryReady(binding) {
64
- return !this.sendPending.has(binding) && !this.turnInProgress.has(binding);
64
+ return !this.sendPending.has(binding) && !this.turnInProgress.has(binding)
65
+ && !this.sendLocks.has(binding);
65
66
  }
66
67
  selectionDelegate() {
67
68
  return {
@@ -285,16 +286,16 @@ export class OffscreenController {
285
286
  return true;
286
287
  if (routed.length === 0)
287
288
  return true;
288
- const coordinator = this.activeCoordinator();
289
- const layout = this.host.getLayout();
290
- const result = coordinator
291
- ? coordinator.handleEvents(routed, layout.columns, layout.childRows)
292
- : new InquiryPaneController(fork).handleKeys(routed);
293
289
  if (this.tracksTurns && binding) {
294
290
  for (let submission = 0; submission < manualSubmissions; submission++) {
295
291
  this.beginTurnAttempt(binding);
296
292
  }
297
293
  }
294
+ const coordinator = this.activeCoordinator();
295
+ const layout = this.host.getLayout();
296
+ const result = coordinator
297
+ ? coordinator.handleEvents(routed, layout.columns, layout.childRows)
298
+ : new InquiryPaneController(fork).handleKeys(routed);
298
299
  this.applyPaneResult(fork, result);
299
300
  return true;
300
301
  }
@@ -508,12 +509,19 @@ export class OffscreenController {
508
509
  this.sendLocks.add(binding);
509
510
  this.host.scheduleParentUiRender();
510
511
  const composer = resolveProvider(fork.driver).composer;
512
+ let receipt;
511
513
  void sendInquiryQuestion(fork, question, {
512
514
  signal: controller.signal,
513
515
  composer,
516
+ beforeSubmit: async () => {
517
+ await this.turnMonitors.get(binding)?.refreshExpiredAttempts();
518
+ receipt = this.reserveTurn(binding);
519
+ },
520
+ onSubmitWritten: () => receipt?.markWritten(),
514
521
  onSubmitted: () => {
515
522
  submitted = true;
516
- this.beginTurn(binding);
523
+ receipt?.confirm();
524
+ this.clearSendPending(binding);
517
525
  },
518
526
  }).catch((err) => {
519
527
  if (!controller.signal.aborted) {
@@ -521,6 +529,15 @@ export class OffscreenController {
521
529
  this.host.output.warn(`offscreen inquiry send failed: ${reason}`);
522
530
  }
523
531
  }).finally(() => {
532
+ receipt?.release();
533
+ if (receipt?.settlement === "released") {
534
+ const remaining = (this.pendingTurns.get(binding) ?? []).filter((pending) => pending !== receipt);
535
+ if (remaining.length > 0)
536
+ this.pendingTurns.set(binding, remaining);
537
+ else
538
+ this.pendingTurns.delete(binding);
539
+ this.refreshStagedActivity(binding);
540
+ }
524
541
  if (this.sendControllers.get(binding) === controller) {
525
542
  this.sendControllers.delete(binding);
526
543
  }
@@ -541,35 +558,62 @@ export class OffscreenController {
541
558
  return;
542
559
  this.host.scheduleParentUiRender();
543
560
  }
544
- beginTurn(binding) {
561
+ reserveTurn(binding, rawAttempt = false) {
545
562
  const pendingChanged = this.sendPending.delete(binding);
546
563
  const turnChanged = this.prepareTurn(binding);
547
564
  const monitor = this.turnMonitors.get(binding);
548
- if (monitor)
549
- monitor.beginTurn();
565
+ let receipt;
566
+ if (monitor) {
567
+ receipt = rawAttempt ? monitor.beginTurnAttempt() : monitor.reserveTurn();
568
+ }
550
569
  else {
551
- this.pendingTurnGenerations.set(binding, (this.pendingTurnGenerations.get(binding) ?? 0) + 1);
570
+ receipt = new SessionTurnReceipt({
571
+ anchorSubmitCount: this.forkSubmitFloors.get(binding),
572
+ }, rawAttempt);
573
+ if (rawAttempt)
574
+ receipt.markWritten();
575
+ const pending = this.pendingTurns.get(binding) ?? [];
576
+ pending.push(receipt);
577
+ this.pendingTurns.set(binding, pending);
578
+ if (rawAttempt) {
579
+ this.pendingAttemptTimers.set(receipt.id, setTimeout(() => {
580
+ this.pendingAttemptTimers.delete(receipt.id);
581
+ if (this.disposed)
582
+ return;
583
+ receipt.settle("expired");
584
+ this.refreshStagedActivity(binding);
585
+ }, Math.max(0, receipt.startedAt + this.turnAttemptTimeoutMs - Date.now())));
586
+ }
552
587
  this.ensureTurnPoll(binding);
553
588
  }
554
589
  if (pendingChanged || turnChanged)
555
590
  this.host.scheduleParentUiRender();
591
+ return receipt;
556
592
  }
557
593
  beginTurnAttempt(binding) {
558
- const turnChanged = this.prepareTurn(binding);
559
- const monitor = this.turnMonitors.get(binding);
560
- if (monitor)
561
- monitor.beginTurnAttempt();
562
- else {
563
- const attempts = this.pendingTurnAttempts.get(binding) ?? [];
564
- attempts.push({
565
- startedAt: Date.now(),
566
- anchorSubmitCount: this.forkSubmitFloors.get(binding),
567
- });
568
- this.pendingTurnAttempts.set(binding, attempts);
569
- this.ensureTurnPoll(binding);
594
+ this.reserveTurn(binding, true);
595
+ }
596
+ refreshStagedActivity(binding) {
597
+ const pending = this.pendingTurns.get(binding) ?? [];
598
+ if (pending.some((receipt) => !receipt.settlement)
599
+ || this.turnMonitors.get(binding)?.isIdle === false)
600
+ return;
601
+ if (pending.length === 0) {
602
+ this.releaseTurn(binding);
570
603
  }
571
- if (turnChanged)
604
+ else if (this.turnInProgress.delete(binding)) {
605
+ // Retain expired receipts until discovery so late genuine work is still observed.
572
606
  this.host.scheduleParentUiRender();
607
+ }
608
+ }
609
+ needsTurnObservation(binding) {
610
+ return this.turnInProgress.has(binding) || this.pendingTurns.has(binding);
611
+ }
612
+ clearStagedAttemptTimers(binding) {
613
+ for (const receipt of this.pendingTurns.get(binding) ?? []) {
614
+ clearTimeout(this.pendingAttemptTimers.get(receipt.id));
615
+ this.pendingAttemptTimers.delete(receipt.id);
616
+ }
573
617
  }
574
618
  prepareTurn(binding) {
575
619
  const turnChanged = !this.turnInProgress.has(binding);
@@ -587,8 +631,8 @@ export class OffscreenController {
587
631
  }
588
632
  releaseTurn(binding, lines) {
589
633
  const changed = this.turnInProgress.delete(binding);
590
- this.pendingTurnGenerations.delete(binding);
591
- this.pendingTurnAttempts.delete(binding);
634
+ this.clearStagedAttemptTimers(binding);
635
+ this.pendingTurns.delete(binding);
592
636
  this.clearTurnPoll(binding);
593
637
  this.forkLocateWarned.delete(binding);
594
638
  if (lines)
@@ -617,10 +661,10 @@ export class OffscreenController {
617
661
  return;
618
662
  }
619
663
  this.forkSessionFiles.set(binding, file);
620
- if (!this.turnInProgress.has(binding)) {
664
+ if (!this.needsTurnObservation(binding)) {
621
665
  try {
622
- const lines = await readSessionFile(file);
623
- if (this.disposed || abort.signal.aborted || this.turnInProgress.has(binding))
666
+ const lines = await readTurnHistory(fork.driver, file);
667
+ if (this.disposed || abort.signal.aborted || this.needsTurnObservation(binding))
624
668
  return;
625
669
  this.refreshIdleBaseline(binding, lines);
626
670
  }
@@ -630,28 +674,31 @@ export class OffscreenController {
630
674
  }
631
675
  else {
632
676
  const policy = resolveProvider(fork.driver).forkSubmitFloor;
633
- if (policy.from !== "fork-file"
634
- || this.forkSubmitFloors.has(binding)) {
635
- if (this.turnInProgress.has(binding))
636
- this.ensureTurnPoll(binding);
637
- return;
638
- }
639
- try {
640
- const lines = await readSessionFile(file);
641
- if (this.disposed || abort.signal.aborted || !this.turnInProgress.has(binding))
677
+ while (!this.disposed && !abort.signal.aborted && this.needsTurnObservation(binding)) {
678
+ let lines;
679
+ try {
680
+ lines = await readTurnHistory(fork.driver, file);
681
+ }
682
+ catch {
683
+ if (this.turnInProgress.has(binding))
684
+ this.warnForkSessionUnavailable(binding);
685
+ await waitForRetry(this.turnPollMs, abort.signal);
686
+ continue;
687
+ }
688
+ if (this.disposed || abort.signal.aborted || !this.needsTurnObservation(binding))
642
689
  return;
643
- const providerFloor = forkFileSubmitFloor(fork.driver, fork.lineage, lines);
644
- this.forkSubmitFloors.set(binding, providerFloor !== undefined
645
- ? 0
646
- :
647
- Math.max(0, submitCount(fork.driver, lines) + policy.offset));
648
- this.forkBaselines.set(binding, 0);
649
- }
650
- catch {
690
+ if (policy.from === "fork-file" && !this.forkSubmitFloors.has(binding)) {
691
+ const providerFloor = forkFileSubmitFloor(fork.driver, fork.lineage, lines);
692
+ this.forkSubmitFloors.set(binding, providerFloor !== undefined
693
+ ? 0
694
+ : Math.max(0, submitCount(fork.driver, lines) + policy.offset));
695
+ this.forkBaselines.set(binding, 0);
696
+ }
697
+ this.ensureTurnPoll(binding, lines);
651
698
  return;
652
699
  }
653
700
  }
654
- if (this.turnInProgress.has(binding))
701
+ if (this.needsTurnObservation(binding))
655
702
  this.ensureTurnPoll(binding);
656
703
  })().catch(() => {
657
704
  // Fail closed: leave the binding busy when session discovery/read fails.
@@ -682,16 +729,17 @@ export class OffscreenController {
682
729
  const promise = (async () => {
683
730
  while (!this.disposed && !signal.aborted && slot) {
684
731
  try {
685
- const lines = await readSessionFile(slot.sourceSessionPath);
732
+ const lines = await readTurnHistory(fork.driver, slot.sourceSessionPath);
686
733
  if (!this.disposed && !signal.aborted) {
687
734
  this.forkSubmitFloors.set(binding, submitCount(fork.driver, lines));
688
735
  }
689
736
  return;
690
737
  }
691
738
  catch {
692
- if (!this.turnInProgress.has(binding))
739
+ if (!this.needsTurnObservation(binding))
693
740
  return;
694
- this.warnForkSessionUnavailable(binding);
741
+ if (this.turnInProgress.has(binding))
742
+ this.warnForkSessionUnavailable(binding);
695
743
  await waitForRetry(this.turnPollMs, signal);
696
744
  }
697
745
  }
@@ -706,8 +754,8 @@ export class OffscreenController {
706
754
  refreshIdleBaseline(binding, lines) {
707
755
  this.forkBaselines.set(binding, lines.length);
708
756
  }
709
- ensureTurnPoll(binding) {
710
- if (!this.turnInProgress.has(binding))
757
+ ensureTurnPoll(binding, initialLines) {
758
+ if (!this.needsTurnObservation(binding))
711
759
  return;
712
760
  if (this.turnMonitors.has(binding))
713
761
  return;
@@ -747,8 +795,13 @@ export class OffscreenController {
747
795
  this.host.scheduleParentUiRender();
748
796
  },
749
797
  onChange: (idle) => {
750
- if (!idle)
798
+ if (!idle) {
799
+ if (!this.turnInProgress.has(binding)) {
800
+ this.turnInProgress.add(binding);
801
+ this.host.scheduleParentUiRender();
802
+ }
751
803
  return;
804
+ }
752
805
  this.forkBaselines.set(binding, monitor.lineBaseline);
753
806
  const submitFloor = monitor.currentSubmitFloor;
754
807
  if (submitFloor !== undefined) {
@@ -758,16 +811,10 @@ export class OffscreenController {
758
811
  },
759
812
  });
760
813
  this.turnMonitors.set(binding, monitor);
761
- const generations = this.pendingTurnGenerations.get(binding) ?? 0;
762
- for (let generation = 0; generation < generations; generation++) {
763
- monitor.beginTurn();
764
- }
765
- const attempts = this.pendingTurnAttempts.get(binding) ?? [];
766
- for (const attempt of attempts) {
767
- monitor.beginTurnAttempt(attempt);
768
- }
769
- this.pendingTurnGenerations.delete(binding);
770
- this.pendingTurnAttempts.delete(binding);
814
+ const pending = this.pendingTurns.get(binding) ?? [];
815
+ this.clearStagedAttemptTimers(binding);
816
+ this.pendingTurns.delete(binding);
817
+ monitor.attachTurns(pending, initialLines);
771
818
  }
772
819
  needsSubmitFloor(binding, _fork) {
773
820
  return !this.forkSubmitFloors.has(binding);
@@ -775,7 +822,7 @@ export class OffscreenController {
775
822
  clearTurnPoll(binding) {
776
823
  const monitor = this.turnMonitors.get(binding);
777
824
  if (monitor) {
778
- if (monitor.supportsHistoryRegression)
825
+ if (monitor.supportsHistoryRegression || monitor.hasUnobservedExpiredAttempts)
779
826
  return;
780
827
  monitor.dispose();
781
828
  this.turnMonitors.delete(binding);
@@ -789,8 +836,10 @@ export class OffscreenController {
789
836
  monitor.dispose();
790
837
  this.turnMonitors.clear();
791
838
  this.turnInProgress.clear();
792
- this.pendingTurnGenerations.clear();
793
- this.pendingTurnAttempts.clear();
839
+ for (const timer of this.pendingAttemptTimers.values())
840
+ clearTimeout(timer);
841
+ this.pendingAttemptTimers.clear();
842
+ this.pendingTurns.clear();
794
843
  this.forkSession.clear();
795
844
  this.forkSessionFiles.clear();
796
845
  this.forkBaselines.clear();
@@ -884,6 +933,13 @@ function inquiryShortcutForKey(key) {
884
933
  function waitForRetry(ms, signal) {
885
934
  return abortableSleep(ms, signal, { onAbort: "resolve" });
886
935
  }
936
+ async function readTurnHistory(driver, path) {
937
+ const { lines, malformed } = await readSessionFileWithStatus(path);
938
+ if (malformed || resolveProvider(driver).fork.submissionEvidence?.(lines).indeterminate) {
939
+ throw new Error("Inquiry submission history is indeterminate");
940
+ }
941
+ return lines;
942
+ }
887
943
  function isSubmitKey(key) {
888
944
  return key.kind === "enter"
889
945
  || key.kind === "shift-enter"