@caupulican/pi-adaptative 0.94.1 → 0.95.0
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/CHANGELOG.md +39 -0
- package/dist/bundled-resources/extensions/tmux-agent-manager/README.md +32 -13
- package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts +7 -4
- package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts.map +1 -1
- package/dist/bundled-resources/extensions/tmux-agent-manager/index.js +173 -293
- package/dist/bundled-resources/extensions/tmux-agent-manager/index.js.map +1 -1
- package/dist/bundled-resources/extensions/tmux-agent-manager/index.ts +247 -392
- package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.d.ts +52 -0
- package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.d.ts.map +1 -0
- package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.js +118 -0
- package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.js.map +1 -0
- package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.ts +169 -0
- package/dist/bundled-resources/extensions/tmux-agent-manager/templates/builder-validator.json +1 -1
- package/dist/bundled-resources/extensions/tmux-agent-manager/templates/provider-prompt-smoke.json +1 -1
- package/dist/bundled-resources/skills/pi-harness-learning/SKILL.md +13 -7
- package/dist/bundled-resources/skills/worker-profile-writer/SKILL.md +11 -11
- package/dist/core/agent-session.d.ts +11 -41
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +93 -160
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/autonomy/envelope-enforcement.d.ts +6 -1
- package/dist/core/autonomy/envelope-enforcement.d.ts.map +1 -1
- package/dist/core/autonomy/envelope-enforcement.js +26 -25
- package/dist/core/autonomy/envelope-enforcement.js.map +1 -1
- package/dist/core/autonomy/lane-private-paths.d.ts.map +1 -1
- package/dist/core/autonomy/lane-private-paths.js +2 -1
- package/dist/core/autonomy/lane-private-paths.js.map +1 -1
- package/dist/core/autonomy/lane-tool-surface.d.ts +8 -8
- package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
- package/dist/core/autonomy/lane-tool-surface.js +45 -30
- package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
- package/dist/core/autonomy/worker-session-private-scope.d.ts +12 -0
- package/dist/core/autonomy/worker-session-private-scope.d.ts.map +1 -0
- package/dist/core/autonomy/worker-session-private-scope.js +42 -0
- package/dist/core/autonomy/worker-session-private-scope.js.map +1 -0
- package/dist/core/autonomy/worker-tool-adapter-registry.d.ts +65 -0
- package/dist/core/autonomy/worker-tool-adapter-registry.d.ts.map +1 -0
- package/dist/core/autonomy/worker-tool-adapter-registry.js +145 -0
- package/dist/core/autonomy/worker-tool-adapter-registry.js.map +1 -0
- package/dist/core/background-lane-controller.d.ts +1 -1
- package/dist/core/background-lane-controller.d.ts.map +1 -1
- package/dist/core/background-lane-controller.js +1 -1
- package/dist/core/background-lane-controller.js.map +1 -1
- package/dist/core/background-tool-task-controller.d.ts +8 -2
- package/dist/core/background-tool-task-controller.d.ts.map +1 -1
- package/dist/core/background-tool-task-controller.js +10 -2
- package/dist/core/background-tool-task-controller.js.map +1 -1
- package/dist/core/cost-guard-controller.d.ts +37 -0
- package/dist/core/cost-guard-controller.d.ts.map +1 -0
- package/dist/core/cost-guard-controller.js +71 -0
- package/dist/core/cost-guard-controller.js.map +1 -0
- package/dist/core/cost-guard.d.ts +9 -4
- package/dist/core/cost-guard.d.ts.map +1 -1
- package/dist/core/cost-guard.js +7 -3
- package/dist/core/cost-guard.js.map +1 -1
- package/dist/core/delegation/worker-attempt-executor.d.ts +1 -1
- package/dist/core/delegation/worker-attempt-executor.d.ts.map +1 -1
- package/dist/core/delegation/worker-attempt-executor.js +0 -1
- package/dist/core/delegation/worker-attempt-executor.js.map +1 -1
- package/dist/core/delegation/worker-authority-resolver.d.ts +16 -3
- package/dist/core/delegation/worker-authority-resolver.d.ts.map +1 -1
- package/dist/core/delegation/worker-authority-resolver.js +114 -55
- package/dist/core/delegation/worker-authority-resolver.js.map +1 -1
- package/dist/core/delegation/worker-claim.d.ts +1 -2
- package/dist/core/delegation/worker-claim.d.ts.map +1 -1
- package/dist/core/delegation/worker-claim.js.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.d.ts +19 -6
- package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.js +125 -40
- package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
- package/dist/core/delegation/worker-delegation-request.d.ts +3 -3
- package/dist/core/delegation/worker-delegation-request.d.ts.map +1 -1
- package/dist/core/delegation/worker-delegation-request.js +13 -19
- package/dist/core/delegation/worker-delegation-request.js.map +1 -1
- package/dist/core/delegation/worker-execution-policy.d.ts +3 -2
- package/dist/core/delegation/worker-execution-policy.d.ts.map +1 -1
- package/dist/core/delegation/worker-execution-policy.js +54 -39
- package/dist/core/delegation/worker-execution-policy.js.map +1 -1
- package/dist/core/delegation/worker-fleet-limits.d.ts +3 -3
- package/dist/core/delegation/worker-fleet-limits.d.ts.map +1 -1
- package/dist/core/delegation/worker-fleet-limits.js +7 -7
- package/dist/core/delegation/worker-fleet-limits.js.map +1 -1
- package/dist/core/delegation/worker-machine-scope.d.ts +12 -0
- package/dist/core/delegation/worker-machine-scope.d.ts.map +1 -0
- package/dist/core/delegation/worker-machine-scope.js +38 -0
- package/dist/core/delegation/worker-machine-scope.js.map +1 -0
- package/dist/core/delegation/worker-recovery-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-recovery-coordinator.js +6 -1
- package/dist/core/delegation/worker-recovery-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-runner.d.ts +5 -7
- package/dist/core/delegation/worker-runner.d.ts.map +1 -1
- package/dist/core/delegation/worker-runner.js +1 -4
- package/dist/core/delegation/worker-runner.js.map +1 -1
- package/dist/core/delegation/worker-write-reservation-coordinator.d.ts +3 -2
- package/dist/core/delegation/worker-write-reservation-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-write-reservation-coordinator.js +50 -25
- package/dist/core/delegation/worker-write-reservation-coordinator.js.map +1 -1
- package/dist/core/durable-custom-message-turn-controller.d.ts +6 -0
- package/dist/core/durable-custom-message-turn-controller.d.ts.map +1 -1
- package/dist/core/durable-custom-message-turn-controller.js +38 -15
- package/dist/core/durable-custom-message-turn-controller.js.map +1 -1
- package/dist/core/extension-binding-controller.d.ts +5 -1
- package/dist/core/extension-binding-controller.d.ts.map +1 -1
- package/dist/core/extension-binding-controller.js +15 -0
- package/dist/core/extension-binding-controller.js.map +1 -1
- package/dist/core/extensions/factory-runtime.d.ts.map +1 -1
- package/dist/core/extensions/factory-runtime.js +5 -0
- package/dist/core/extensions/factory-runtime.js.map +1 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +1 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +8 -4
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/foreground-terminal-handoff-controller.d.ts +14 -0
- package/dist/core/foreground-terminal-handoff-controller.d.ts.map +1 -1
- package/dist/core/foreground-terminal-handoff-controller.js +188 -72
- package/dist/core/foreground-terminal-handoff-controller.js.map +1 -1
- package/dist/core/goals/goal-session-controller.d.ts +2 -0
- package/dist/core/goals/goal-session-controller.d.ts.map +1 -1
- package/dist/core/goals/goal-session-controller.js +8 -0
- package/dist/core/goals/goal-session-controller.js.map +1 -1
- package/dist/core/goals/goal-tool-core.d.ts +5 -4
- package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
- package/dist/core/goals/goal-tool-core.js +23 -19
- package/dist/core/goals/goal-tool-core.js.map +1 -1
- package/dist/core/learning/auto-learn-settings.d.ts +84 -0
- package/dist/core/learning/auto-learn-settings.d.ts.map +1 -0
- package/dist/core/learning/auto-learn-settings.js +66 -0
- package/dist/core/learning/auto-learn-settings.js.map +1 -0
- package/dist/core/learning/reflection-engine.d.ts +4 -0
- package/dist/core/learning/reflection-engine.d.ts.map +1 -1
- package/dist/core/learning/reflection-engine.js +48 -10
- package/dist/core/learning/reflection-engine.js.map +1 -1
- package/dist/core/local-prefix-warm-controller.d.ts +24 -0
- package/dist/core/local-prefix-warm-controller.d.ts.map +1 -0
- package/dist/core/local-prefix-warm-controller.js +79 -0
- package/dist/core/local-prefix-warm-controller.js.map +1 -0
- package/dist/core/memory/providers/file-store.d.ts +2 -0
- package/dist/core/memory/providers/file-store.d.ts.map +1 -1
- package/dist/core/memory/providers/file-store.js +71 -15
- package/dist/core/memory/providers/file-store.js.map +1 -1
- package/dist/core/memory/worker-memory-tools.d.ts +5 -0
- package/dist/core/memory/worker-memory-tools.d.ts.map +1 -0
- package/dist/core/memory/worker-memory-tools.js +5 -0
- package/dist/core/memory/worker-memory-tools.js.map +1 -0
- package/dist/core/model-capability.d.ts +7 -0
- package/dist/core/model-capability.d.ts.map +1 -1
- package/dist/core/model-capability.js +12 -0
- package/dist/core/model-capability.js.map +1 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +2 -10
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-router-controller.d.ts +3 -2
- package/dist/core/model-router-controller.d.ts.map +1 -1
- package/dist/core/model-router-controller.js +3 -2
- package/dist/core/model-router-controller.js.map +1 -1
- package/dist/core/orchestration/contracts.d.ts +16 -12
- package/dist/core/orchestration/contracts.d.ts.map +1 -1
- package/dist/core/orchestration/contracts.js +2 -2
- package/dist/core/orchestration/contracts.js.map +1 -1
- package/dist/core/orchestration/lane-tool-manifests.d.ts +2 -2
- package/dist/core/orchestration/lane-tool-manifests.d.ts.map +1 -1
- package/dist/core/orchestration/lane-tool-manifests.js +6 -1
- package/dist/core/orchestration/lane-tool-manifests.js.map +1 -1
- package/dist/core/orchestration/profile-registry.d.ts.map +1 -1
- package/dist/core/orchestration/profile-registry.js +14 -0
- package/dist/core/orchestration/profile-registry.js.map +1 -1
- package/dist/core/orchestration/task-profile-writer.d.ts +7 -4
- package/dist/core/orchestration/task-profile-writer.d.ts.map +1 -1
- package/dist/core/orchestration/task-profile-writer.js +71 -59
- package/dist/core/orchestration/task-profile-writer.js.map +1 -1
- package/dist/core/orchestration/thinking-level-schema.d.ts +7 -0
- package/dist/core/orchestration/thinking-level-schema.d.ts.map +1 -0
- package/dist/core/orchestration/thinking-level-schema.js +19 -0
- package/dist/core/orchestration/thinking-level-schema.js.map +1 -0
- package/dist/core/orchestration/worker-execution-contract.d.ts.map +1 -1
- package/dist/core/orchestration/worker-execution-contract.js +12 -5
- package/dist/core/orchestration/worker-execution-contract.js.map +1 -1
- package/dist/core/provider-prompt-contracts.d.ts +1 -4
- package/dist/core/provider-prompt-contracts.d.ts.map +1 -1
- package/dist/core/provider-prompt-contracts.js +4 -10
- package/dist/core/provider-prompt-contracts.js.map +1 -1
- package/dist/core/provider-request-context-controller.d.ts +2 -0
- package/dist/core/provider-request-context-controller.d.ts.map +1 -1
- package/dist/core/provider-request-context-controller.js +10 -3
- package/dist/core/provider-request-context-controller.js.map +1 -1
- package/dist/core/reflection-controller.d.ts +56 -27
- package/dist/core/reflection-controller.d.ts.map +1 -1
- package/dist/core/reflection-controller.js +206 -117
- package/dist/core/reflection-controller.js.map +1 -1
- package/dist/core/runtime-builder.d.ts +1 -0
- package/dist/core/runtime-builder.d.ts.map +1 -1
- package/dist/core/runtime-builder.js +25 -14
- package/dist/core/runtime-builder.js.map +1 -1
- package/dist/core/secrets/credential-exposure-guard.d.ts.map +1 -1
- package/dist/core/secrets/credential-exposure-guard.js +55 -10
- package/dist/core/secrets/credential-exposure-guard.js.map +1 -1
- package/dist/core/session-role.d.ts +6 -8
- package/dist/core/session-role.d.ts.map +1 -1
- package/dist/core/session-role.js +8 -18
- package/dist/core/session-role.js.map +1 -1
- package/dist/core/settings-manager.d.ts +13 -16
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +53 -50
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skill-vault.d.ts +15 -0
- package/dist/core/skill-vault.d.ts.map +1 -1
- package/dist/core/skill-vault.js +79 -45
- package/dist/core/skill-vault.js.map +1 -1
- package/dist/core/skills.d.ts +3 -0
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +6 -6
- package/dist/core/skills.js.map +1 -1
- package/dist/core/system-prompt-builder.d.ts +2 -0
- package/dist/core/system-prompt-builder.d.ts.map +1 -1
- package/dist/core/system-prompt-builder.js +52 -12
- package/dist/core/system-prompt-builder.js.map +1 -1
- package/dist/core/system-prompt.js +1 -1
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tool-capability-policy.d.ts +3 -0
- package/dist/core/tool-capability-policy.d.ts.map +1 -1
- package/dist/core/tool-capability-policy.js +13 -2
- package/dist/core/tool-capability-policy.js.map +1 -1
- package/dist/core/toolkit/script-runner.d.ts +2 -1
- package/dist/core/toolkit/script-runner.d.ts.map +1 -1
- package/dist/core/toolkit/script-runner.js +10 -2
- package/dist/core/toolkit/script-runner.js.map +1 -1
- package/dist/core/tools/delegate-status.d.ts +1 -1
- package/dist/core/tools/delegate-status.d.ts.map +1 -1
- package/dist/core/tools/delegate-status.js +1 -1
- package/dist/core/tools/delegate-status.js.map +1 -1
- package/dist/core/tools/delegate.d.ts +4 -15
- package/dist/core/tools/delegate.d.ts.map +1 -1
- package/dist/core/tools/delegate.js +111 -73
- package/dist/core/tools/delegate.js.map +1 -1
- package/dist/core/tools/goal.d.ts +3 -4
- package/dist/core/tools/goal.d.ts.map +1 -1
- package/dist/core/tools/goal.js +24 -7
- package/dist/core/tools/goal.js.map +1 -1
- package/dist/core/tools/profile-writer.d.ts +2 -8
- package/dist/core/tools/profile-writer.d.ts.map +1 -1
- package/dist/core/tools/profile-writer.js +6 -18
- package/dist/core/tools/profile-writer.js.map +1 -1
- package/dist/core/tools/run-toolkit-script.d.ts +1 -1
- package/dist/core/tools/run-toolkit-script.d.ts.map +1 -1
- package/dist/core/tools/run-toolkit-script.js +2 -2
- package/dist/core/tools/run-toolkit-script.js.map +1 -1
- package/dist/core/tools/skill-audit.d.ts +28 -1
- package/dist/core/tools/skill-audit.d.ts.map +1 -1
- package/dist/core/tools/skill-audit.js +56 -12
- package/dist/core/tools/skill-audit.js.map +1 -1
- package/dist/core/tools/skill.d.ts +12 -1
- package/dist/core/tools/skill.d.ts.map +1 -1
- package/dist/core/tools/skill.js +52 -0
- package/dist/core/tools/skill.js.map +1 -1
- package/dist/core/tools/skillify.d.ts.map +1 -1
- package/dist/core/tools/skillify.js +16 -7
- package/dist/core/tools/skillify.js.map +1 -1
- package/dist/core/tools/task-steps.js +1 -1
- package/dist/core/tools/task-steps.js.map +1 -1
- package/dist/core/tools/tmux-dispatch.d.ts +4 -16
- package/dist/core/tools/tmux-dispatch.d.ts.map +1 -1
- package/dist/core/tools/tmux-dispatch.js +5 -20
- package/dist/core/tools/tmux-dispatch.js.map +1 -1
- package/dist/core/worktree-sync/codes.d.ts +1 -2
- package/dist/core/worktree-sync/codes.d.ts.map +1 -1
- package/dist/core/worktree-sync/codes.js +1 -2
- package/dist/core/worktree-sync/codes.js.map +1 -1
- package/dist/core/worktree-sync/lane-gate.d.ts +4 -8
- package/dist/core/worktree-sync/lane-gate.d.ts.map +1 -1
- package/dist/core/worktree-sync/lane-gate.js +5 -51
- package/dist/core/worktree-sync/lane-gate.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/auto-learn-controller.d.ts +6 -7
- package/dist/modes/interactive/auto-learn-controller.d.ts.map +1 -1
- package/dist/modes/interactive/auto-learn-controller.js +30 -207
- package/dist/modes/interactive/auto-learn-controller.js.map +1 -1
- package/dist/modes/interactive/autonomy-commands.js +2 -2
- package/dist/modes/interactive/autonomy-commands.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +17 -0
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/fitness-role-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/fitness-role-selector.js +2 -2
- package/dist/modes/interactive/components/fitness-role-selector.js.map +1 -1
- package/dist/modes/interactive/components/footer.js +1 -1
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +4 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +150 -73
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/report-commands.d.ts.map +1 -1
- package/dist/modes/interactive/report-commands.js +8 -4
- package/dist/modes/interactive/report-commands.js.map +1 -1
- package/dist/modes/interactive/settings-selector-flow.d.ts.map +1 -1
- package/dist/modes/interactive/settings-selector-flow.js +10 -0
- package/dist/modes/interactive/settings-selector-flow.js.map +1 -1
- package/docs/extensions.md +8 -0
- package/docs/harness-architecture.md +28 -32
- package/docs/index.md +1 -1
- package/docs/process-matrix.md +8 -6
- package/docs/resources.md +1 -1
- package/docs/settings.md +61 -51
- package/docs/tmux-agent-manager.md +47 -40
- package/docs/usage.md +1 -1
- package/docs/worker-profiles.md +8 -6
- package/docs/worktree-sync.md +26 -20
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +12 -12
- package/package.json +4 -4
- package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts +0 -133
- package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts.map +0 -1
- package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js +0 -199
- package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js.map +0 -1
- package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.ts +0 -312
|
@@ -38,6 +38,7 @@ function workerSummaryStatus(record, claimNeedsReview) {
|
|
|
38
38
|
return "attention";
|
|
39
39
|
return "success";
|
|
40
40
|
}
|
|
41
|
+
const MAX_DELIVERED_TERMINAL_IDENTITIES = 512;
|
|
41
42
|
export function buildForegroundWorkerTerminalHandoffContent(records, options) {
|
|
42
43
|
const included = records.slice(0, 8);
|
|
43
44
|
const omitted = Math.max(0, (options?.totalCount ?? records.length) - included.length);
|
|
@@ -91,52 +92,182 @@ export function buildForegroundWorkerTerminalHandoffContent(records, options) {
|
|
|
91
92
|
/** Serializes durable background terminal delivery through the foreground submission owner. */
|
|
92
93
|
export class ForegroundTerminalHandoffController {
|
|
93
94
|
constructor(deps) {
|
|
95
|
+
this.pending = new Set();
|
|
96
|
+
this.terminalDeliveries = new Map();
|
|
97
|
+
this.deliveredTerminalIdentities = new Set();
|
|
94
98
|
this.deps = deps;
|
|
95
99
|
}
|
|
96
100
|
async notifyWorkers(records) {
|
|
97
101
|
if (records.every((record) => record.observedAt !== undefined))
|
|
98
102
|
return;
|
|
99
103
|
this.assertLive("worker terminal handoff was persisted");
|
|
100
|
-
|
|
104
|
+
await this.scheduleUnique(records, (record) => ["worker", record.laneId, record.completedAt ?? "", record.status, record.reasonCode ?? ""].join("\0"), (uniqueRecords) => this.prepareWorkerDelivery(uniqueRecords));
|
|
105
|
+
}
|
|
106
|
+
async notifyTools(records, wakeParent) {
|
|
107
|
+
if (!wakeParent || records.every((record) => record.observedAt !== undefined))
|
|
108
|
+
return;
|
|
109
|
+
this.assertLive("background tool terminal handoff was delivered");
|
|
110
|
+
await this.scheduleUnique(records, (record) => ["tool", record.sessionId, record.taskId, record.completedAt ?? "", record.status].join("\0"), (uniqueRecords) => this.prepareToolDelivery(uniqueRecords));
|
|
111
|
+
}
|
|
112
|
+
/** Deliver queued terminals immediately before the agent loop polls its steering inbox. */
|
|
113
|
+
flushProviderBoundary() {
|
|
114
|
+
for (const pending of [...this.pending]) {
|
|
115
|
+
try {
|
|
116
|
+
this.assertLive("terminal handoff reached a provider boundary");
|
|
117
|
+
const plan = pending.prepare();
|
|
118
|
+
if (!plan) {
|
|
119
|
+
this.pending.delete(pending);
|
|
120
|
+
pending.resolve();
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (!plan.wakeParent)
|
|
124
|
+
continue;
|
|
125
|
+
this.pending.delete(pending);
|
|
126
|
+
void this.deps.enqueueCustomMessageTurn(plan.message).then(pending.resolve, pending.reject);
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
this.pending.delete(pending);
|
|
130
|
+
pending.reject(error);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
schedule(prepare) {
|
|
135
|
+
return new Promise((resolve, reject) => {
|
|
136
|
+
const pending = { prepare, resolve, reject };
|
|
137
|
+
this.pending.add(pending);
|
|
138
|
+
void this.deliverWhenIdle(pending);
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
async scheduleUnique(records, identity, prepare) {
|
|
142
|
+
const receipts = new Set();
|
|
143
|
+
const uniqueRecords = [];
|
|
144
|
+
const uniqueIdentities = [];
|
|
145
|
+
for (const record of records) {
|
|
146
|
+
const key = identity(record);
|
|
147
|
+
if (this.deliveredTerminalIdentities.has(key))
|
|
148
|
+
continue;
|
|
149
|
+
const inFlight = this.terminalDeliveries.get(key);
|
|
150
|
+
if (inFlight) {
|
|
151
|
+
receipts.add(inFlight);
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
uniqueRecords.push(record);
|
|
155
|
+
uniqueIdentities.push(key);
|
|
156
|
+
}
|
|
157
|
+
if (uniqueRecords.length > 0) {
|
|
158
|
+
const delivery = this.schedule(() => prepare(uniqueRecords));
|
|
159
|
+
for (const key of uniqueIdentities)
|
|
160
|
+
this.terminalDeliveries.set(key, delivery);
|
|
161
|
+
receipts.add(delivery);
|
|
162
|
+
void delivery.then(() => {
|
|
163
|
+
for (const key of uniqueIdentities) {
|
|
164
|
+
if (this.terminalDeliveries.get(key) === delivery)
|
|
165
|
+
this.terminalDeliveries.delete(key);
|
|
166
|
+
this.rememberDeliveredTerminal(key);
|
|
167
|
+
}
|
|
168
|
+
}, () => {
|
|
169
|
+
for (const key of uniqueIdentities) {
|
|
170
|
+
if (this.terminalDeliveries.get(key) === delivery)
|
|
171
|
+
this.terminalDeliveries.delete(key);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
await Promise.all(receipts);
|
|
176
|
+
}
|
|
177
|
+
rememberDeliveredTerminal(identity) {
|
|
178
|
+
this.deliveredTerminalIdentities.delete(identity);
|
|
179
|
+
this.deliveredTerminalIdentities.add(identity);
|
|
180
|
+
while (this.deliveredTerminalIdentities.size > MAX_DELIVERED_TERMINAL_IDENTITIES) {
|
|
181
|
+
const oldest = this.deliveredTerminalIdentities.values().next().value;
|
|
182
|
+
if (oldest === undefined)
|
|
183
|
+
break;
|
|
184
|
+
this.deliveredTerminalIdentities.delete(oldest);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
async deliverWhenIdle(pending) {
|
|
188
|
+
try {
|
|
189
|
+
while (this.pending.has(pending)) {
|
|
190
|
+
await this.deps.foreground.waitForIdle();
|
|
191
|
+
if (!this.pending.has(pending))
|
|
192
|
+
return;
|
|
193
|
+
this.assertLive("terminal handoff was waiting for foreground idle");
|
|
194
|
+
const lease = this.deps.foreground.tryAcquireSubmission();
|
|
195
|
+
if (!lease)
|
|
196
|
+
continue;
|
|
197
|
+
if (!this.pending.delete(pending)) {
|
|
198
|
+
this.deps.foreground.releaseSubmission(lease);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
try {
|
|
202
|
+
await this.deliverWithLease(pending.prepare(), lease);
|
|
203
|
+
pending.resolve();
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
pending.reject(error);
|
|
207
|
+
}
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
if (this.pending.delete(pending))
|
|
213
|
+
pending.reject(error);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
async deliverWithLease(plan, lease) {
|
|
101
217
|
let releaseLease = true;
|
|
102
218
|
try {
|
|
103
|
-
|
|
104
|
-
const unread = records.filter((record) => record.observedAt === undefined);
|
|
105
|
-
if (unread.length === 0)
|
|
219
|
+
if (!plan)
|
|
106
220
|
return;
|
|
107
|
-
|
|
108
|
-
const
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
return
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
221
|
+
if (plan.wakeParent) {
|
|
222
|
+
const started = await this.deps.startCustomMessageTurn(plan.message, lease, plan.goalId);
|
|
223
|
+
this.releaseAfterTurn(started.completion, lease, "background terminal handoff turn");
|
|
224
|
+
releaseLease = false;
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
await this.deps.sendCustomMessage(plan.message, { triggerTurn: false, deliverAs: "followUp" }, lease);
|
|
228
|
+
}
|
|
229
|
+
finally {
|
|
230
|
+
if (releaseLease)
|
|
231
|
+
this.deps.foreground.releaseSubmission(lease);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
prepareWorkerDelivery(records) {
|
|
235
|
+
const unread = records.filter((record) => record.observedAt === undefined);
|
|
236
|
+
if (unread.length === 0)
|
|
237
|
+
return undefined;
|
|
238
|
+
const prepared = unread.map((record, index) => {
|
|
239
|
+
const snapshot = this.deps.getWorkerClaimSnapshot?.(record.laneId);
|
|
240
|
+
const claim = snapshot?.claim;
|
|
241
|
+
const outputArtifact = index < 8 ? workerTerminalOutputArtifact(this.deps.getWorkerResult?.(record.laneId)) : undefined;
|
|
242
|
+
return {
|
|
243
|
+
summaryItem: {
|
|
244
|
+
id: record.laneId,
|
|
245
|
+
status: workerSummaryStatus(record, claim?.parentReviewRequired === true),
|
|
246
|
+
},
|
|
247
|
+
laneId: record.laneId,
|
|
248
|
+
status: record.status,
|
|
249
|
+
...(record.reasonCode ? { reasonCode: record.reasonCode } : {}),
|
|
250
|
+
...(outputArtifact ? { outputArtifact } : {}),
|
|
251
|
+
...(claim
|
|
252
|
+
? {
|
|
253
|
+
claim: {
|
|
254
|
+
status: claim.status,
|
|
255
|
+
summary: claim.summary.slice(0, 1000),
|
|
256
|
+
changedFiles: claim.changedFiles,
|
|
257
|
+
...(claim.blockers ? { blockers: claim.blockers } : {}),
|
|
258
|
+
...(claim.parentReviewRequired ? { parentReviewRequired: true } : {}),
|
|
259
|
+
},
|
|
260
|
+
}
|
|
261
|
+
: {}),
|
|
262
|
+
};
|
|
263
|
+
});
|
|
264
|
+
const included = prepared.slice(0, 8).map(({ summaryItem: _summaryItem, ...record }) => record);
|
|
265
|
+
const wake = this.resolveWake(unread);
|
|
266
|
+
return {
|
|
267
|
+
message: {
|
|
137
268
|
customType: "background-worker-completion",
|
|
138
269
|
content: buildForegroundWorkerTerminalHandoffContent(included, {
|
|
139
|
-
wakeParent,
|
|
270
|
+
wakeParent: wake.wakeParent,
|
|
140
271
|
totalCount: unread.length,
|
|
141
272
|
}),
|
|
142
273
|
display: true,
|
|
@@ -144,35 +275,18 @@ export class ForegroundTerminalHandoffController {
|
|
|
144
275
|
records: included,
|
|
145
276
|
summary: createBackgroundActivitySummaryContract("agent", prepared.map((entry) => entry.summaryItem)),
|
|
146
277
|
},
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
const started = await this.deps.startCustomMessageTurn(message, lease, goalId);
|
|
151
|
-
this.releaseAfterTurn(started.completion, lease, "worker terminal handoff turn");
|
|
152
|
-
releaseLease = false;
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
await this.deps.sendCustomMessage(message, { triggerTurn: false, deliverAs: "followUp" }, lease);
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
finally {
|
|
159
|
-
if (releaseLease)
|
|
160
|
-
this.deps.foreground.releaseSubmission(lease);
|
|
161
|
-
}
|
|
278
|
+
},
|
|
279
|
+
...wake,
|
|
280
|
+
};
|
|
162
281
|
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
const
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
const unread = records.filter((record) => record.observedAt === undefined);
|
|
172
|
-
if (unread.length === 0)
|
|
173
|
-
return;
|
|
174
|
-
const toolMessage = createBackgroundToolTerminalMessage(unread);
|
|
175
|
-
const message = {
|
|
282
|
+
prepareToolDelivery(records) {
|
|
283
|
+
const unread = records.filter((record) => record.observedAt === undefined);
|
|
284
|
+
if (unread.length === 0)
|
|
285
|
+
return undefined;
|
|
286
|
+
const wake = this.resolveWake(unread);
|
|
287
|
+
const toolMessage = createBackgroundToolTerminalMessage(unread, { wakeParent: wake.wakeParent });
|
|
288
|
+
return {
|
|
289
|
+
message: {
|
|
176
290
|
...toolMessage,
|
|
177
291
|
details: {
|
|
178
292
|
...toolMessage.details,
|
|
@@ -185,15 +299,17 @@ export class ForegroundTerminalHandoffController {
|
|
|
185
299
|
: "success",
|
|
186
300
|
}))),
|
|
187
301
|
},
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
302
|
+
},
|
|
303
|
+
...wake,
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
resolveWake(records) {
|
|
307
|
+
const goal = this.deps.getGoalStateSnapshot();
|
|
308
|
+
const wakeParent = records.some((record) => !record.goalId || (goal?.goalId === record.goalId && isGoalExecutionActive(goal.status)));
|
|
309
|
+
return {
|
|
310
|
+
wakeParent,
|
|
311
|
+
...(wakeParent ? { goalId: records.find((record) => record.goalId === goal?.goalId)?.goalId } : {}),
|
|
312
|
+
};
|
|
197
313
|
}
|
|
198
314
|
releaseAfterTurn(completion, lease, label) {
|
|
199
315
|
void completion.then(() => this.deps.foreground.releaseSubmission(lease), (error) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"foreground-terminal-handoff-controller.js","sourceRoot":"","sources":["../../src/core/foreground-terminal-handoff-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CustomMessage } from \"@caupulican/pi-agent-core\";\nimport type { LaneTerminalStatus } from \"./autonomy/lane-tracker.ts\";\nimport {\n\ttype BackgroundToolTaskRecord,\n\tcreateBackgroundToolTerminalMessage,\n} from \"./background-tool-task-controller.ts\";\nimport type { WorkerClaimSnapshotPayload } from \"./delegation/session-worker-claim.ts\";\nimport type { WorkerTerminalHandoffRecord } from \"./delegation/worker-notification-coordinator.ts\";\nimport { WORKER_COMPLETION_ERROR_CAVEMAN_GUIDANCE } from \"./delegation/worker-terminal-handoff-coordinator.ts\";\nimport { workerTerminalOutputArtifact } from \"./delegation/worker-terminal-output-artifact.ts\";\nimport type { ForegroundRecoveryController, ForegroundSubmissionLease } from \"./foreground-recovery-controller.ts\";\nimport { type GoalState, isGoalExecutionActive } from \"./goals/goal-state.ts\";\nimport type { ArtifactContract, WorkerResultContract } from \"./orchestration/contracts.ts\";\n\nexport type BackgroundActivitySummaryKind = \"agent\" | \"task\";\nexport type BackgroundActivitySummaryStatus = \"success\" | \"attention\" | \"failed\" | \"canceled\";\n\nexport interface BackgroundActivitySummaryItem {\n\tid: string;\n\tstatus: BackgroundActivitySummaryStatus;\n}\n\n/** Provider-neutral counts retained when the detailed handoff is bounded. */\nexport interface BackgroundActivitySummaryContract {\n\tkind: BackgroundActivitySummaryKind;\n\ttotalCount: number;\n\tattentionCount: number;\n\tfailedCount: number;\n\tcanceledCount: number;\n}\n\nexport function createBackgroundActivitySummaryContract(\n\tkind: BackgroundActivitySummaryKind,\n\titems: readonly BackgroundActivitySummaryItem[],\n): BackgroundActivitySummaryContract {\n\treturn {\n\t\tkind,\n\t\ttotalCount: items.length,\n\t\tattentionCount: items.filter((item) => item.status === \"attention\").length,\n\t\tfailedCount: items.filter((item) => item.status === \"failed\").length,\n\t\tcanceledCount: items.filter((item) => item.status === \"canceled\").length,\n\t};\n}\n\nexport function isBackgroundActivitySummaryContract(value: unknown): value is BackgroundActivitySummaryContract {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst summary = value as Record<string, unknown>;\n\tconst counts = [\"totalCount\", \"attentionCount\", \"failedCount\", \"canceledCount\"] as const;\n\tif (summary.kind !== \"agent\" && summary.kind !== \"task\") return false;\n\tif (\n\t\tcounts.some(\n\t\t\t(field) =>\n\t\t\t\ttypeof summary[field] !== \"number\" ||\n\t\t\t\t!Number.isSafeInteger(summary[field]) ||\n\t\t\t\t(summary[field] as number) < 0,\n\t\t)\n\t) {\n\t\treturn false;\n\t}\n\tconst totalCount = summary.totalCount as number;\n\treturn (\n\t\ttotalCount > 0 &&\n\t\t(summary.attentionCount as number) + (summary.failedCount as number) + (summary.canceledCount as number) <=\n\t\t\ttotalCount\n\t);\n}\n\nfunction workerSummaryStatus(\n\trecord: Pick<WorkerTerminalHandoffRecord, \"status\">,\n\tclaimNeedsReview: boolean,\n): BackgroundActivitySummaryStatus {\n\tif (record.status === \"failed\" || record.status === \"timeout\" || record.status === \"budget_exhausted\") {\n\t\treturn \"failed\";\n\t}\n\tif (record.status === \"canceled\") return \"canceled\";\n\tif (claimNeedsReview || record.status === \"partial\" || record.status === \"blocked\") return \"attention\";\n\treturn \"success\";\n}\n\ninterface ForegroundTerminalHandoffControllerDeps {\n\tforeground: ForegroundRecoveryController;\n\tisDisposed(): boolean;\n\tgetGoalStateSnapshot(): Pick<GoalState, \"goalId\" | \"status\"> | undefined;\n\tgetWorkerClaimSnapshot?(laneId: string): WorkerClaimSnapshotPayload | undefined;\n\tgetWorkerResult?(laneId: string): Pick<WorkerResultContract, \"artifacts\"> | undefined;\n\tstartCustomMessageTurn(\n\t\tmessage: Pick<CustomMessage<unknown>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\tlease: ForegroundSubmissionLease,\n\t\tgoalId?: string,\n\t): Promise<{ completion: Promise<void> }>;\n\tsendCustomMessage(\n\t\tmessage: Pick<CustomMessage<unknown>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions: { triggerTurn: false; deliverAs: \"followUp\" },\n\t\tlease: ForegroundSubmissionLease,\n\t): Promise<void>;\n\twarn(message: string): void;\n}\n\nexport function buildForegroundWorkerTerminalHandoffContent(\n\trecords: readonly {\n\t\tlaneId: string;\n\t\tstatus: LaneTerminalStatus;\n\t\treasonCode?: string;\n\t\toutputArtifact?: ArtifactContract;\n\t\tclaim?: {\n\t\t\tsummary?: string;\n\t\t\tstatus?: string;\n\t\t\tchangedFiles?: readonly string[];\n\t\t\tblockers?: readonly string[];\n\t\t\tparentReviewRequired?: boolean;\n\t\t};\n\t}[],\n\toptions?: { wakeParent?: boolean; totalCount?: number },\n): string {\n\tconst included = records.slice(0, 8);\n\tconst omitted = Math.max(0, (options?.totalCount ?? records.length) - included.length);\n\tconst wakeParent = options?.wakeParent ?? true;\n\tconst sanitize = (value: string): string => value.replace(/[\\r\\n]+/g, \" \").slice(0, 120);\n\treturn [\n\t\t\"Background worker terminal handoff:\",\n\t\t...included.flatMap((record) => {\n\t\t\tconst reason = record.reasonCode ? ` reason=${sanitize(record.reasonCode)}` : \"\";\n\t\t\tconst lines = [`- ${record.laneId}: ${record.status}${reason}`];\n\t\t\tif (record.outputArtifact) {\n\t\t\t\tlines.push(\n\t\t\t\t\t` Full Output: ${record.outputArtifact.uri}${record.outputArtifact.sizeBytes === undefined ? \"\" : ` (${record.outputArtifact.sizeBytes} bytes)`}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (record.claim?.summary) {\n\t\t\t\tlines.push(` Claim Status: ${record.claim.status || record.status}`);\n\t\t\t\tlines.push(` Claim Summary: ${sanitize(record.claim.summary)}`);\n\t\t\t\tif (record.claim.changedFiles && record.claim.changedFiles.length > 0) {\n\t\t\t\t\tlines.push(` Changed Files: ${record.claim.changedFiles.map((f) => sanitize(f)).join(\", \")}`);\n\t\t\t\t}\n\t\t\t\tif (record.claim.blockers && record.claim.blockers.length > 0) {\n\t\t\t\t\tlines.push(` Blockers: ${record.claim.blockers.map((b) => sanitize(b)).join(\"; \")}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn lines;\n\t\t}),\n\t\t...(omitted > 0 ? [`- ${omitted} additional terminal worker(s) omitted.`] : []),\n\t\t\"CAVEMAN MODE - MANDATORY: this event proves terminal persistence and delivery. Do not report missed completion or lost worker state from these records.\",\n\t\t...(wakeParent\n\t\t\t? [\"Read each lane with delegate status, verify the claim, then continue or replan the parent task.\"]\n\t\t\t: [\n\t\t\t\t\t\"The owning parent is no longer eligible for automatic continuation. Persist this handoff, but do not continue or replan automatically.\",\n\t\t\t\t]),\n\t\t...(records.some((record) => record.reasonCode === \"worker_blocked\")\n\t\t\t? [\"worker_blocked is a task claim with blockers, not harness failure.\"]\n\t\t\t: []),\n\t\t...(records.some((record) => record.status === \"budget_exhausted\")\n\t\t\t? [\n\t\t\t\t\t\"CAVEMAN MODE - MANDATORY: budget_exhausted means an admitted limit ended work, not harness failure. Terminal reason is authoritative; never replace it with earlier transcript errors. Read evidence, then replan only within remaining authority.\",\n\t\t\t\t]\n\t\t\t: []),\n\t\t...(records.some((record) => record.reasonCode === \"completion_error\")\n\t\t\t? [WORKER_COMPLETION_ERROR_CAVEMAN_GUIDANCE]\n\t\t\t: []),\n\t\t...(wakeParent\n\t\t\t? [\n\t\t\t\t\t'Parent woke. Evaluated terminal claim payload above. Use delegate { action: \"status\", laneId } for deep view if needed.',\n\t\t\t\t]\n\t\t\t: [\"Parent was not woken. Wait for explicit user input before reading a lane or starting more work.\"]),\n\t].join(\"\\n\");\n}\n\n/** Serializes durable background terminal delivery through the foreground submission owner. */\nexport class ForegroundTerminalHandoffController {\n\tprivate readonly deps: ForegroundTerminalHandoffControllerDeps;\n\n\tconstructor(deps: ForegroundTerminalHandoffControllerDeps) {\n\t\tthis.deps = deps;\n\t}\n\n\tasync notifyWorkers(records: readonly WorkerTerminalHandoffRecord[]): Promise<void> {\n\t\tif (records.every((record) => record.observedAt !== undefined)) return;\n\t\tthis.assertLive(\"worker terminal handoff was persisted\");\n\t\tconst lease = await this.deps.foreground.acquireSubmission();\n\t\tlet releaseLease = true;\n\t\ttry {\n\t\t\tthis.assertLive(\"worker terminal handoff was persisted\");\n\t\t\tconst unread = records.filter((record) => record.observedAt === undefined);\n\t\t\tif (unread.length === 0) return;\n\t\t\tconst prepared = unread.map((record, index) => {\n\t\t\t\tconst snapshot = this.deps.getWorkerClaimSnapshot?.(record.laneId);\n\t\t\t\tconst claim = snapshot?.claim;\n\t\t\t\tconst outputArtifact =\n\t\t\t\t\tindex < 8 ? workerTerminalOutputArtifact(this.deps.getWorkerResult?.(record.laneId)) : undefined;\n\t\t\t\treturn {\n\t\t\t\t\tsummaryItem: {\n\t\t\t\t\t\tid: record.laneId,\n\t\t\t\t\t\tstatus: workerSummaryStatus(record, claim?.parentReviewRequired === true),\n\t\t\t\t\t},\n\t\t\t\t\tlaneId: record.laneId,\n\t\t\t\t\tstatus: record.status,\n\t\t\t\t\t...(record.reasonCode ? { reasonCode: record.reasonCode } : {}),\n\t\t\t\t\t...(outputArtifact ? { outputArtifact } : {}),\n\t\t\t\t\t...(claim\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tclaim: {\n\t\t\t\t\t\t\t\t\tstatus: claim.status,\n\t\t\t\t\t\t\t\t\tsummary: claim.summary.slice(0, 1000),\n\t\t\t\t\t\t\t\t\tchangedFiles: claim.changedFiles,\n\t\t\t\t\t\t\t\t\t...(claim.blockers ? { blockers: claim.blockers } : {}),\n\t\t\t\t\t\t\t\t\t...(claim.parentReviewRequired ? { parentReviewRequired: true } : {}),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {}),\n\t\t\t\t};\n\t\t\t});\n\t\t\tconst included = prepared.slice(0, 8).map(({ summaryItem: _summaryItem, ...record }) => record);\n\t\t\tconst goal = this.deps.getGoalStateSnapshot();\n\t\t\tconst wakeParent = unread.some(\n\t\t\t\t(record) => !record.goalId || (goal?.goalId === record.goalId && isGoalExecutionActive(goal.status)),\n\t\t\t);\n\t\t\tconst message = {\n\t\t\t\tcustomType: \"background-worker-completion\",\n\t\t\t\tcontent: buildForegroundWorkerTerminalHandoffContent(included, {\n\t\t\t\t\twakeParent,\n\t\t\t\t\ttotalCount: unread.length,\n\t\t\t\t}),\n\t\t\t\tdisplay: true,\n\t\t\t\tdetails: {\n\t\t\t\t\trecords: included,\n\t\t\t\t\tsummary: createBackgroundActivitySummaryContract(\n\t\t\t\t\t\t\"agent\",\n\t\t\t\t\t\tprepared.map((entry) => entry.summaryItem),\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t};\n\t\t\tif (wakeParent) {\n\t\t\t\tconst goalId = unread.find((record) => record.goalId === goal?.goalId)?.goalId;\n\t\t\t\tconst started = await this.deps.startCustomMessageTurn(message, lease, goalId);\n\t\t\t\tthis.releaseAfterTurn(started.completion, lease, \"worker terminal handoff turn\");\n\t\t\t\treleaseLease = false;\n\t\t\t} else {\n\t\t\t\tawait this.deps.sendCustomMessage(message, { triggerTurn: false, deliverAs: \"followUp\" }, lease);\n\t\t\t}\n\t\t} finally {\n\t\t\tif (releaseLease) this.deps.foreground.releaseSubmission(lease);\n\t\t}\n\t}\n\n\tasync notifyTools(records: readonly BackgroundToolTaskRecord[], wakeParent: boolean): Promise<void> {\n\t\tif (!wakeParent || records.every((record) => record.observedAt !== undefined)) return;\n\t\tthis.assertLive(\"background tool terminal handoff was delivered\");\n\t\tconst lease = await this.deps.foreground.acquireSubmission();\n\t\tlet releaseLease = true;\n\t\ttry {\n\t\t\tthis.assertLive(\"background tool terminal handoff was delivered\");\n\t\t\tconst unread = records.filter((record) => record.observedAt === undefined);\n\t\t\tif (unread.length === 0) return;\n\t\t\tconst toolMessage = createBackgroundToolTerminalMessage(unread);\n\t\t\tconst message = {\n\t\t\t\t...toolMessage,\n\t\t\t\tdetails: {\n\t\t\t\t\t...toolMessage.details,\n\t\t\t\t\tsummary: createBackgroundActivitySummaryContract(\n\t\t\t\t\t\t\"task\",\n\t\t\t\t\t\tunread.map((record) => ({\n\t\t\t\t\t\t\tid: record.taskId,\n\t\t\t\t\t\t\tstatus:\n\t\t\t\t\t\t\t\trecord.status === \"failed\"\n\t\t\t\t\t\t\t\t\t? (\"failed\" as const)\n\t\t\t\t\t\t\t\t\t: record.status === \"canceled\"\n\t\t\t\t\t\t\t\t\t\t? (\"canceled\" as const)\n\t\t\t\t\t\t\t\t\t\t: (\"success\" as const),\n\t\t\t\t\t\t})),\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst started = await this.deps.startCustomMessageTurn(message, lease);\n\t\t\tthis.releaseAfterTurn(started.completion, lease, \"background tool terminal handoff turn\");\n\t\t\treleaseLease = false;\n\t\t} finally {\n\t\t\tif (releaseLease) this.deps.foreground.releaseSubmission(lease);\n\t\t}\n\t}\n\n\tprivate releaseAfterTurn(completion: Promise<void>, lease: ForegroundSubmissionLease, label: string): void {\n\t\tvoid completion.then(\n\t\t\t() => this.deps.foreground.releaseSubmission(lease),\n\t\t\t(error: unknown) => {\n\t\t\t\tthis.deps.foreground.releaseSubmission(lease);\n\t\t\t\tthis.deps.warn(\n\t\t\t\t\t`${label} failed after durable delivery: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t);\n\t\t\t},\n\t\t);\n\t}\n\n\tprivate assertLive(action: string): void {\n\t\tif (this.deps.isDisposed()) throw new Error(`Session disposed before ${action}`);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"foreground-terminal-handoff-controller.js","sourceRoot":"","sources":["../../src/core/foreground-terminal-handoff-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CustomMessage } from \"@caupulican/pi-agent-core\";\nimport type { LaneTerminalStatus } from \"./autonomy/lane-tracker.ts\";\nimport {\n\ttype BackgroundToolTaskRecord,\n\tcreateBackgroundToolTerminalMessage,\n} from \"./background-tool-task-controller.ts\";\nimport type { WorkerClaimSnapshotPayload } from \"./delegation/session-worker-claim.ts\";\nimport type { WorkerTerminalHandoffRecord } from \"./delegation/worker-notification-coordinator.ts\";\nimport { WORKER_COMPLETION_ERROR_CAVEMAN_GUIDANCE } from \"./delegation/worker-terminal-handoff-coordinator.ts\";\nimport { workerTerminalOutputArtifact } from \"./delegation/worker-terminal-output-artifact.ts\";\nimport type { ForegroundRecoveryController, ForegroundSubmissionLease } from \"./foreground-recovery-controller.ts\";\nimport { type GoalState, isGoalExecutionActive } from \"./goals/goal-state.ts\";\nimport type { ArtifactContract, WorkerResultContract } from \"./orchestration/contracts.ts\";\n\nexport type BackgroundActivitySummaryKind = \"agent\" | \"task\";\nexport type BackgroundActivitySummaryStatus = \"success\" | \"attention\" | \"failed\" | \"canceled\";\n\nexport interface BackgroundActivitySummaryItem {\n\tid: string;\n\tstatus: BackgroundActivitySummaryStatus;\n}\n\n/** Provider-neutral counts retained when the detailed handoff is bounded. */\nexport interface BackgroundActivitySummaryContract {\n\tkind: BackgroundActivitySummaryKind;\n\ttotalCount: number;\n\tattentionCount: number;\n\tfailedCount: number;\n\tcanceledCount: number;\n}\n\nexport function createBackgroundActivitySummaryContract(\n\tkind: BackgroundActivitySummaryKind,\n\titems: readonly BackgroundActivitySummaryItem[],\n): BackgroundActivitySummaryContract {\n\treturn {\n\t\tkind,\n\t\ttotalCount: items.length,\n\t\tattentionCount: items.filter((item) => item.status === \"attention\").length,\n\t\tfailedCount: items.filter((item) => item.status === \"failed\").length,\n\t\tcanceledCount: items.filter((item) => item.status === \"canceled\").length,\n\t};\n}\n\nexport function isBackgroundActivitySummaryContract(value: unknown): value is BackgroundActivitySummaryContract {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst summary = value as Record<string, unknown>;\n\tconst counts = [\"totalCount\", \"attentionCount\", \"failedCount\", \"canceledCount\"] as const;\n\tif (summary.kind !== \"agent\" && summary.kind !== \"task\") return false;\n\tif (\n\t\tcounts.some(\n\t\t\t(field) =>\n\t\t\t\ttypeof summary[field] !== \"number\" ||\n\t\t\t\t!Number.isSafeInteger(summary[field]) ||\n\t\t\t\t(summary[field] as number) < 0,\n\t\t)\n\t) {\n\t\treturn false;\n\t}\n\tconst totalCount = summary.totalCount as number;\n\treturn (\n\t\ttotalCount > 0 &&\n\t\t(summary.attentionCount as number) + (summary.failedCount as number) + (summary.canceledCount as number) <=\n\t\t\ttotalCount\n\t);\n}\n\nfunction workerSummaryStatus(\n\trecord: Pick<WorkerTerminalHandoffRecord, \"status\">,\n\tclaimNeedsReview: boolean,\n): BackgroundActivitySummaryStatus {\n\tif (record.status === \"failed\" || record.status === \"timeout\" || record.status === \"budget_exhausted\") {\n\t\treturn \"failed\";\n\t}\n\tif (record.status === \"canceled\") return \"canceled\";\n\tif (claimNeedsReview || record.status === \"partial\" || record.status === \"blocked\") return \"attention\";\n\treturn \"success\";\n}\n\ninterface ForegroundTerminalHandoffControllerDeps {\n\tforeground: ForegroundRecoveryController;\n\tisDisposed(): boolean;\n\tgetGoalStateSnapshot(): Pick<GoalState, \"goalId\" | \"status\"> | undefined;\n\tgetWorkerClaimSnapshot?(laneId: string): WorkerClaimSnapshotPayload | undefined;\n\tgetWorkerResult?(laneId: string): Pick<WorkerResultContract, \"artifacts\"> | undefined;\n\tstartCustomMessageTurn(\n\t\tmessage: Pick<CustomMessage<unknown>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\tlease: ForegroundSubmissionLease,\n\t\tgoalId?: string,\n\t): Promise<{ completion: Promise<void> }>;\n\tenqueueCustomMessageTurn(\n\t\tmessage: Pick<CustomMessage<unknown>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t): Promise<void>;\n\tsendCustomMessage(\n\t\tmessage: Pick<CustomMessage<unknown>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions: { triggerTurn: false; deliverAs: \"followUp\" },\n\t\tlease: ForegroundSubmissionLease,\n\t): Promise<void>;\n\twarn(message: string): void;\n}\n\ntype TerminalCustomMessage = Pick<CustomMessage<unknown>, \"customType\" | \"content\" | \"display\" | \"details\">;\n\ninterface TerminalDeliveryPlan {\n\tmessage: TerminalCustomMessage;\n\twakeParent: boolean;\n\tgoalId?: string;\n}\n\ninterface PendingTerminalDelivery {\n\tprepare(): TerminalDeliveryPlan | undefined;\n\tresolve(): void;\n\treject(error: unknown): void;\n}\n\nconst MAX_DELIVERED_TERMINAL_IDENTITIES = 512;\n\nexport function buildForegroundWorkerTerminalHandoffContent(\n\trecords: readonly {\n\t\tlaneId: string;\n\t\tstatus: LaneTerminalStatus;\n\t\treasonCode?: string;\n\t\toutputArtifact?: ArtifactContract;\n\t\tclaim?: {\n\t\t\tsummary?: string;\n\t\t\tstatus?: string;\n\t\t\tchangedFiles?: readonly string[];\n\t\t\tblockers?: readonly string[];\n\t\t\tparentReviewRequired?: boolean;\n\t\t};\n\t}[],\n\toptions?: { wakeParent?: boolean; totalCount?: number },\n): string {\n\tconst included = records.slice(0, 8);\n\tconst omitted = Math.max(0, (options?.totalCount ?? records.length) - included.length);\n\tconst wakeParent = options?.wakeParent ?? true;\n\tconst sanitize = (value: string): string => value.replace(/[\\r\\n]+/g, \" \").slice(0, 120);\n\treturn [\n\t\t\"Background worker terminal handoff:\",\n\t\t...included.flatMap((record) => {\n\t\t\tconst reason = record.reasonCode ? ` reason=${sanitize(record.reasonCode)}` : \"\";\n\t\t\tconst lines = [`- ${record.laneId}: ${record.status}${reason}`];\n\t\t\tif (record.outputArtifact) {\n\t\t\t\tlines.push(\n\t\t\t\t\t` Full Output: ${record.outputArtifact.uri}${record.outputArtifact.sizeBytes === undefined ? \"\" : ` (${record.outputArtifact.sizeBytes} bytes)`}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (record.claim?.summary) {\n\t\t\t\tlines.push(` Claim Status: ${record.claim.status || record.status}`);\n\t\t\t\tlines.push(` Claim Summary: ${sanitize(record.claim.summary)}`);\n\t\t\t\tif (record.claim.changedFiles && record.claim.changedFiles.length > 0) {\n\t\t\t\t\tlines.push(` Changed Files: ${record.claim.changedFiles.map((f) => sanitize(f)).join(\", \")}`);\n\t\t\t\t}\n\t\t\t\tif (record.claim.blockers && record.claim.blockers.length > 0) {\n\t\t\t\t\tlines.push(` Blockers: ${record.claim.blockers.map((b) => sanitize(b)).join(\"; \")}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn lines;\n\t\t}),\n\t\t...(omitted > 0 ? [`- ${omitted} additional terminal worker(s) omitted.`] : []),\n\t\t\"CAVEMAN MODE - MANDATORY: this event proves terminal persistence and delivery. Do not report missed completion or lost worker state from these records.\",\n\t\t...(wakeParent\n\t\t\t? [\"Read each lane with delegate status, verify the claim, then continue or replan the parent task.\"]\n\t\t\t: [\n\t\t\t\t\t\"The owning parent is no longer eligible for automatic continuation. Persist this handoff, but do not continue or replan automatically.\",\n\t\t\t\t]),\n\t\t...(records.some((record) => record.reasonCode === \"worker_blocked\")\n\t\t\t? [\"worker_blocked is a task claim with blockers, not harness failure.\"]\n\t\t\t: []),\n\t\t...(records.some((record) => record.status === \"budget_exhausted\")\n\t\t\t? [\n\t\t\t\t\t\"CAVEMAN MODE - MANDATORY: budget_exhausted means an admitted limit ended work, not harness failure. Terminal reason is authoritative; never replace it with earlier transcript errors. Read evidence, then replan only within remaining authority.\",\n\t\t\t\t]\n\t\t\t: []),\n\t\t...(records.some((record) => record.reasonCode === \"completion_error\")\n\t\t\t? [WORKER_COMPLETION_ERROR_CAVEMAN_GUIDANCE]\n\t\t\t: []),\n\t\t...(wakeParent\n\t\t\t? [\n\t\t\t\t\t'Parent woke. Evaluated terminal claim payload above. Use delegate { action: \"status\", laneId } for deep view if needed.',\n\t\t\t\t]\n\t\t\t: [\"Parent was not woken. Wait for explicit user input before reading a lane or starting more work.\"]),\n\t].join(\"\\n\");\n}\n\n/** Serializes durable background terminal delivery through the foreground submission owner. */\nexport class ForegroundTerminalHandoffController {\n\tprivate readonly deps: ForegroundTerminalHandoffControllerDeps;\n\tprivate readonly pending = new Set<PendingTerminalDelivery>();\n\tprivate readonly terminalDeliveries = new Map<string, Promise<void>>();\n\tprivate readonly deliveredTerminalIdentities = new Set<string>();\n\n\tconstructor(deps: ForegroundTerminalHandoffControllerDeps) {\n\t\tthis.deps = deps;\n\t}\n\n\tasync notifyWorkers(records: readonly WorkerTerminalHandoffRecord[]): Promise<void> {\n\t\tif (records.every((record) => record.observedAt !== undefined)) return;\n\t\tthis.assertLive(\"worker terminal handoff was persisted\");\n\t\tawait this.scheduleUnique(\n\t\t\trecords,\n\t\t\t(record) =>\n\t\t\t\t[\"worker\", record.laneId, record.completedAt ?? \"\", record.status, record.reasonCode ?? \"\"].join(\"\\0\"),\n\t\t\t(uniqueRecords) => this.prepareWorkerDelivery(uniqueRecords),\n\t\t);\n\t}\n\n\tasync notifyTools(records: readonly BackgroundToolTaskRecord[], wakeParent: boolean): Promise<void> {\n\t\tif (!wakeParent || records.every((record) => record.observedAt !== undefined)) return;\n\t\tthis.assertLive(\"background tool terminal handoff was delivered\");\n\t\tawait this.scheduleUnique(\n\t\t\trecords,\n\t\t\t(record) => [\"tool\", record.sessionId, record.taskId, record.completedAt ?? \"\", record.status].join(\"\\0\"),\n\t\t\t(uniqueRecords) => this.prepareToolDelivery(uniqueRecords),\n\t\t);\n\t}\n\n\t/** Deliver queued terminals immediately before the agent loop polls its steering inbox. */\n\tflushProviderBoundary(): void {\n\t\tfor (const pending of [...this.pending]) {\n\t\t\ttry {\n\t\t\t\tthis.assertLive(\"terminal handoff reached a provider boundary\");\n\t\t\t\tconst plan = pending.prepare();\n\t\t\t\tif (!plan) {\n\t\t\t\t\tthis.pending.delete(pending);\n\t\t\t\t\tpending.resolve();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (!plan.wakeParent) continue;\n\t\t\t\tthis.pending.delete(pending);\n\t\t\t\tvoid this.deps.enqueueCustomMessageTurn(plan.message).then(pending.resolve, pending.reject);\n\t\t\t} catch (error) {\n\t\t\t\tthis.pending.delete(pending);\n\t\t\t\tpending.reject(error);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate schedule(prepare: () => TerminalDeliveryPlan | undefined): Promise<void> {\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tconst pending: PendingTerminalDelivery = { prepare, resolve, reject };\n\t\t\tthis.pending.add(pending);\n\t\t\tvoid this.deliverWhenIdle(pending);\n\t\t});\n\t}\n\n\tprivate async scheduleUnique<T>(\n\t\trecords: readonly T[],\n\t\tidentity: (record: T) => string,\n\t\tprepare: (records: readonly T[]) => TerminalDeliveryPlan | undefined,\n\t): Promise<void> {\n\t\tconst receipts = new Set<Promise<void>>();\n\t\tconst uniqueRecords: T[] = [];\n\t\tconst uniqueIdentities: string[] = [];\n\t\tfor (const record of records) {\n\t\t\tconst key = identity(record);\n\t\t\tif (this.deliveredTerminalIdentities.has(key)) continue;\n\t\t\tconst inFlight = this.terminalDeliveries.get(key);\n\t\t\tif (inFlight) {\n\t\t\t\treceipts.add(inFlight);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tuniqueRecords.push(record);\n\t\t\tuniqueIdentities.push(key);\n\t\t}\n\t\tif (uniqueRecords.length > 0) {\n\t\t\tconst delivery = this.schedule(() => prepare(uniqueRecords));\n\t\t\tfor (const key of uniqueIdentities) this.terminalDeliveries.set(key, delivery);\n\t\t\treceipts.add(delivery);\n\t\t\tvoid delivery.then(\n\t\t\t\t() => {\n\t\t\t\t\tfor (const key of uniqueIdentities) {\n\t\t\t\t\t\tif (this.terminalDeliveries.get(key) === delivery) this.terminalDeliveries.delete(key);\n\t\t\t\t\t\tthis.rememberDeliveredTerminal(key);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tfor (const key of uniqueIdentities) {\n\t\t\t\t\t\tif (this.terminalDeliveries.get(key) === delivery) this.terminalDeliveries.delete(key);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t\tawait Promise.all(receipts);\n\t}\n\n\tprivate rememberDeliveredTerminal(identity: string): void {\n\t\tthis.deliveredTerminalIdentities.delete(identity);\n\t\tthis.deliveredTerminalIdentities.add(identity);\n\t\twhile (this.deliveredTerminalIdentities.size > MAX_DELIVERED_TERMINAL_IDENTITIES) {\n\t\t\tconst oldest = this.deliveredTerminalIdentities.values().next().value;\n\t\t\tif (oldest === undefined) break;\n\t\t\tthis.deliveredTerminalIdentities.delete(oldest);\n\t\t}\n\t}\n\n\tprivate async deliverWhenIdle(pending: PendingTerminalDelivery): Promise<void> {\n\t\ttry {\n\t\t\twhile (this.pending.has(pending)) {\n\t\t\t\tawait this.deps.foreground.waitForIdle();\n\t\t\t\tif (!this.pending.has(pending)) return;\n\t\t\t\tthis.assertLive(\"terminal handoff was waiting for foreground idle\");\n\t\t\t\tconst lease = this.deps.foreground.tryAcquireSubmission();\n\t\t\t\tif (!lease) continue;\n\t\t\t\tif (!this.pending.delete(pending)) {\n\t\t\t\t\tthis.deps.foreground.releaseSubmission(lease);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tawait this.deliverWithLease(pending.prepare(), lease);\n\t\t\t\t\tpending.resolve();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tpending.reject(error);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (this.pending.delete(pending)) pending.reject(error);\n\t\t}\n\t}\n\n\tprivate async deliverWithLease(\n\t\tplan: TerminalDeliveryPlan | undefined,\n\t\tlease: ForegroundSubmissionLease,\n\t): Promise<void> {\n\t\tlet releaseLease = true;\n\t\ttry {\n\t\t\tif (!plan) return;\n\t\t\tif (plan.wakeParent) {\n\t\t\t\tconst started = await this.deps.startCustomMessageTurn(plan.message, lease, plan.goalId);\n\t\t\t\tthis.releaseAfterTurn(started.completion, lease, \"background terminal handoff turn\");\n\t\t\t\treleaseLease = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.deps.sendCustomMessage(plan.message, { triggerTurn: false, deliverAs: \"followUp\" }, lease);\n\t\t} finally {\n\t\t\tif (releaseLease) this.deps.foreground.releaseSubmission(lease);\n\t\t}\n\t}\n\n\tprivate prepareWorkerDelivery(records: readonly WorkerTerminalHandoffRecord[]): TerminalDeliveryPlan | undefined {\n\t\tconst unread = records.filter((record) => record.observedAt === undefined);\n\t\tif (unread.length === 0) return undefined;\n\t\tconst prepared = unread.map((record, index) => {\n\t\t\tconst snapshot = this.deps.getWorkerClaimSnapshot?.(record.laneId);\n\t\t\tconst claim = snapshot?.claim;\n\t\t\tconst outputArtifact =\n\t\t\t\tindex < 8 ? workerTerminalOutputArtifact(this.deps.getWorkerResult?.(record.laneId)) : undefined;\n\t\t\treturn {\n\t\t\t\tsummaryItem: {\n\t\t\t\t\tid: record.laneId,\n\t\t\t\t\tstatus: workerSummaryStatus(record, claim?.parentReviewRequired === true),\n\t\t\t\t},\n\t\t\t\tlaneId: record.laneId,\n\t\t\t\tstatus: record.status,\n\t\t\t\t...(record.reasonCode ? { reasonCode: record.reasonCode } : {}),\n\t\t\t\t...(outputArtifact ? { outputArtifact } : {}),\n\t\t\t\t...(claim\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tclaim: {\n\t\t\t\t\t\t\t\tstatus: claim.status,\n\t\t\t\t\t\t\t\tsummary: claim.summary.slice(0, 1000),\n\t\t\t\t\t\t\t\tchangedFiles: claim.changedFiles,\n\t\t\t\t\t\t\t\t...(claim.blockers ? { blockers: claim.blockers } : {}),\n\t\t\t\t\t\t\t\t...(claim.parentReviewRequired ? { parentReviewRequired: true } : {}),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t};\n\t\t});\n\t\tconst included = prepared.slice(0, 8).map(({ summaryItem: _summaryItem, ...record }) => record);\n\t\tconst wake = this.resolveWake(unread);\n\t\treturn {\n\t\t\tmessage: {\n\t\t\t\tcustomType: \"background-worker-completion\",\n\t\t\t\tcontent: buildForegroundWorkerTerminalHandoffContent(included, {\n\t\t\t\t\twakeParent: wake.wakeParent,\n\t\t\t\t\ttotalCount: unread.length,\n\t\t\t\t}),\n\t\t\t\tdisplay: true,\n\t\t\t\tdetails: {\n\t\t\t\t\trecords: included,\n\t\t\t\t\tsummary: createBackgroundActivitySummaryContract(\n\t\t\t\t\t\t\"agent\",\n\t\t\t\t\t\tprepared.map((entry) => entry.summaryItem),\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t},\n\t\t\t...wake,\n\t\t};\n\t}\n\n\tprivate prepareToolDelivery(records: readonly BackgroundToolTaskRecord[]): TerminalDeliveryPlan | undefined {\n\t\tconst unread = records.filter((record) => record.observedAt === undefined);\n\t\tif (unread.length === 0) return undefined;\n\t\tconst wake = this.resolveWake(unread);\n\t\tconst toolMessage = createBackgroundToolTerminalMessage(unread, { wakeParent: wake.wakeParent });\n\t\treturn {\n\t\t\tmessage: {\n\t\t\t\t...toolMessage,\n\t\t\t\tdetails: {\n\t\t\t\t\t...toolMessage.details,\n\t\t\t\t\tsummary: createBackgroundActivitySummaryContract(\n\t\t\t\t\t\t\"task\",\n\t\t\t\t\t\tunread.map((record) => ({\n\t\t\t\t\t\t\tid: record.taskId,\n\t\t\t\t\t\t\tstatus:\n\t\t\t\t\t\t\t\trecord.status === \"failed\"\n\t\t\t\t\t\t\t\t\t? (\"failed\" as const)\n\t\t\t\t\t\t\t\t\t: record.status === \"canceled\"\n\t\t\t\t\t\t\t\t\t\t? (\"canceled\" as const)\n\t\t\t\t\t\t\t\t\t\t: (\"success\" as const),\n\t\t\t\t\t\t})),\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t},\n\t\t\t...wake,\n\t\t};\n\t}\n\n\tprivate resolveWake(records: readonly { goalId?: string }[]): Pick<TerminalDeliveryPlan, \"wakeParent\" | \"goalId\"> {\n\t\tconst goal = this.deps.getGoalStateSnapshot();\n\t\tconst wakeParent = records.some(\n\t\t\t(record) => !record.goalId || (goal?.goalId === record.goalId && isGoalExecutionActive(goal.status)),\n\t\t);\n\t\treturn {\n\t\t\twakeParent,\n\t\t\t...(wakeParent ? { goalId: records.find((record) => record.goalId === goal?.goalId)?.goalId } : {}),\n\t\t};\n\t}\n\n\tprivate releaseAfterTurn(completion: Promise<void>, lease: ForegroundSubmissionLease, label: string): void {\n\t\tvoid completion.then(\n\t\t\t() => this.deps.foreground.releaseSubmission(lease),\n\t\t\t(error: unknown) => {\n\t\t\t\tthis.deps.foreground.releaseSubmission(lease);\n\t\t\t\tthis.deps.warn(\n\t\t\t\t\t`${label} failed after durable delivery: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t);\n\t\t\t},\n\t\t);\n\t}\n\n\tprivate assertLive(action: string): void {\n\t\tif (this.deps.isDisposed()) throw new Error(`Session disposed before ${action}`);\n\t}\n}\n"]}
|
|
@@ -85,6 +85,8 @@ export declare class GoalSessionController {
|
|
|
85
85
|
provisionalTokenBudget?: number;
|
|
86
86
|
}): GoalExecutionLease | undefined;
|
|
87
87
|
endExecution(lease: GoalExecutionLease | undefined): void;
|
|
88
|
+
/** Goal identity authoritatively owned by the current foreground execution, if one was adopted. */
|
|
89
|
+
getExecutionGoalId(): string | undefined;
|
|
88
90
|
/** Charge one observed assistant response exactly once, including routed responses buffered from persistence. */
|
|
89
91
|
recordExecutionUsage(message: AssistantMessage): void;
|
|
90
92
|
private chargeExecutionUsage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"goal-session-controller.d.ts","sourceRoot":"","sources":["../../../src/core/goals/goal-session-controller.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"goal-session-controller.d.ts","sourceRoot":"","sources":["../../../src/core/goals/goal-session-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -222,6 +222,14 @@ export class GoalSessionController {
|
|
|
222
222
|
this.flushPendingExecutionUsage(this.executionLease);
|
|
223
223
|
this.executionLease = undefined;
|
|
224
224
|
}
|
|
225
|
+
/** Goal identity authoritatively owned by the current foreground execution, if one was adopted. */
|
|
226
|
+
getExecutionGoalId() {
|
|
227
|
+
const lease = this.executionLease;
|
|
228
|
+
if (!lease)
|
|
229
|
+
return undefined;
|
|
230
|
+
this.resolveExecutionState(lease);
|
|
231
|
+
return lease.goalId;
|
|
232
|
+
}
|
|
225
233
|
/** Charge one observed assistant response exactly once, including routed responses buffered from persistence. */
|
|
226
234
|
recordExecutionUsage(message) {
|
|
227
235
|
const lease = this.executionLease;
|