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.
- package/dist/crosscheck/coordinator.d.ts.map +1 -1
- package/dist/crosscheck/coordinator.js +43 -9
- package/dist/crosscheck/coordinator.js.map +1 -1
- package/dist/crosscheck/live-agent-session.d.ts +3 -0
- package/dist/crosscheck/live-agent-session.d.ts.map +1 -1
- package/dist/crosscheck/live-agent-session.js +9 -2
- package/dist/crosscheck/live-agent-session.js.map +1 -1
- package/dist/offscreen/controller.d.ts +6 -3
- package/dist/offscreen/controller.d.ts.map +1 -1
- package/dist/offscreen/controller.js +127 -71
- package/dist/offscreen/controller.js.map +1 -1
- package/dist/offscreen/inquiry-sender.d.ts +1 -0
- package/dist/offscreen/inquiry-sender.d.ts.map +1 -1
- package/dist/offscreen/inquiry-sender.js +1 -0
- package/dist/offscreen/inquiry-sender.js.map +1 -1
- package/dist/offscreen/session-turn-monitor.d.ts +31 -32
- package/dist/offscreen/session-turn-monitor.d.ts.map +1 -1
- package/dist/offscreen/session-turn-monitor.js +318 -280
- package/dist/offscreen/session-turn-monitor.js.map +1 -1
- package/dist/offscreen/session-turn-receipt.d.ts +28 -0
- package/dist/offscreen/session-turn-receipt.d.ts.map +1 -0
- package/dist/offscreen/session-turn-receipt.js +53 -0
- package/dist/offscreen/session-turn-receipt.js.map +1 -0
- package/dist/providers/base-completion.d.ts +1 -0
- package/dist/providers/base-completion.d.ts.map +1 -1
- package/dist/providers/base-completion.js +4 -2
- package/dist/providers/base-completion.js.map +1 -1
- package/dist/providers/codex/completion.d.ts +4 -2
- package/dist/providers/codex/completion.d.ts.map +1 -1
- package/dist/providers/codex/completion.js +99 -14
- package/dist/providers/codex/completion.js.map +1 -1
- package/dist/providers/codex/strategy.d.ts.map +1 -1
- package/dist/providers/codex/strategy.js +3 -2
- package/dist/providers/codex/strategy.js.map +1 -1
- package/dist/providers/copilot/completion.js +10 -1
- package/dist/providers/copilot/completion.js.map +1 -1
- package/dist/providers/copilot/strategy.d.ts +1 -0
- package/dist/providers/copilot/strategy.d.ts.map +1 -1
- package/dist/providers/copilot/strategy.js +14 -1
- package/dist/providers/copilot/strategy.js.map +1 -1
- package/dist/providers/fork.d.ts +16 -0
- package/dist/providers/fork.d.ts.map +1 -1
- package/dist/providers/fork.js.map +1 -1
- package/dist/providers/live.d.ts.map +1 -1
- package/dist/providers/live.js +19 -0
- package/dist/providers/live.js.map +1 -1
- package/dist/providers/session-launch.d.ts +2 -0
- package/dist/providers/session-launch.d.ts.map +1 -1
- package/dist/providers/session-launch.js +9 -2
- package/dist/providers/session-launch.js.map +1 -1
- package/dist/terminal/paste-submit.d.ts +1 -0
- package/dist/terminal/paste-submit.d.ts.map +1 -1
- package/dist/terminal/paste-submit.js +7 -0
- package/dist/terminal/paste-submit.js.map +1 -1
- 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":"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;
|
|
1
|
+
{"version":3,"file":"live-agent-session.js","sourceRoot":"","sources":["../../src/crosscheck/live-agent-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
|
43
|
-
private readonly
|
|
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
|
|
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":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAiB,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMzF,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAWxE,OAAO,KAAK,EAAE,oBAAoB,EAAmB,MAAM,YAAY,CAAC;AAGxE,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,0BAA0B,CAAC;AAuBlC,MAAM,WAAW,gCAAgC;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,oBAAoB,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CAClD;AAED,MAAM,WAAW,2BAA4B,SAAQ,gCAAgC;IACnF,WAAW,EAAE,aAAa,CAAC;IAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,kBAAkB,CAAC,EAAE,gCAAgC,EAAE,CAAC;CACzD;AAED,MAAM,WAAW,sBAAsB;IACrC,oBAAoB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAAC;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,qBAAa,mBAAmB;
|
|
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 {
|
|
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
|
-
|
|
40
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
549
|
-
|
|
565
|
+
let receipt;
|
|
566
|
+
if (monitor) {
|
|
567
|
+
receipt = rawAttempt ? monitor.beginTurnAttempt() : monitor.reserveTurn();
|
|
568
|
+
}
|
|
550
569
|
else {
|
|
551
|
-
|
|
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
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
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 (
|
|
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.
|
|
591
|
-
this.
|
|
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.
|
|
664
|
+
if (!this.needsTurnObservation(binding)) {
|
|
621
665
|
try {
|
|
622
|
-
const lines = await
|
|
623
|
-
if (this.disposed || abort.signal.aborted || this.
|
|
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
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
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
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
Math.max(0, submitCount(fork.driver, lines) + policy.offset));
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
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.
|
|
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
|
|
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.
|
|
739
|
+
if (!this.needsTurnObservation(binding))
|
|
693
740
|
return;
|
|
694
|
-
this.
|
|
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.
|
|
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
|
|
762
|
-
|
|
763
|
-
|
|
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.
|
|
793
|
-
|
|
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"
|