@caupulican/pi-adaptative 0.86.3 → 0.86.6
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 +44 -0
- package/dist/core/agent-paths.d.ts +13 -0
- package/dist/core/agent-paths.d.ts.map +1 -1
- package/dist/core/agent-paths.js +23 -0
- package/dist/core/agent-paths.js.map +1 -1
- package/dist/core/autonomy/bounded-completion.d.ts +7 -0
- package/dist/core/autonomy/bounded-completion.d.ts.map +1 -1
- package/dist/core/autonomy/bounded-completion.js +12 -4
- package/dist/core/autonomy/bounded-completion.js.map +1 -1
- package/dist/core/autonomy/lane-tool-surface.d.ts +2 -0
- package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
- package/dist/core/autonomy/lane-tool-surface.js +6 -3
- package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
- package/dist/core/autonomy/subagent-prompt.js +1 -1
- package/dist/core/autonomy/subagent-prompt.js.map +1 -1
- package/dist/core/background-lane-controller.d.ts +25 -2
- package/dist/core/background-lane-controller.d.ts.map +1 -1
- package/dist/core/background-lane-controller.js +67 -0
- package/dist/core/background-lane-controller.js.map +1 -1
- package/dist/core/delegation/replay-safe-mailbox-bounds.d.ts +4 -0
- package/dist/core/delegation/replay-safe-mailbox-bounds.d.ts.map +1 -0
- package/dist/core/delegation/replay-safe-mailbox-bounds.js +20 -0
- package/dist/core/delegation/replay-safe-mailbox-bounds.js.map +1 -0
- package/dist/core/delegation/sanitized-context-fork.d.ts +25 -0
- package/dist/core/delegation/sanitized-context-fork.d.ts.map +1 -0
- package/dist/core/delegation/sanitized-context-fork.js +299 -0
- package/dist/core/delegation/sanitized-context-fork.js.map +1 -0
- package/dist/core/delegation/session-root-mailbox.d.ts +75 -0
- package/dist/core/delegation/session-root-mailbox.d.ts.map +1 -0
- package/dist/core/delegation/session-root-mailbox.js +627 -0
- package/dist/core/delegation/session-root-mailbox.js.map +1 -0
- package/dist/core/delegation/worker-agent-control-coordinator.d.ts +102 -9
- package/dist/core/delegation/worker-agent-control-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-agent-control-coordinator.js +1307 -125
- package/dist/core/delegation/worker-agent-control-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-agent-control.d.ts +183 -8
- package/dist/core/delegation/worker-agent-control.d.ts.map +1 -1
- package/dist/core/delegation/worker-agent-control.js +778 -48
- package/dist/core/delegation/worker-agent-control.js.map +1 -1
- package/dist/core/delegation/worker-attempt-executor.d.ts +9 -0
- package/dist/core/delegation/worker-attempt-executor.d.ts.map +1 -1
- package/dist/core/delegation/worker-attempt-executor.js +479 -214
- package/dist/core/delegation/worker-attempt-executor.js.map +1 -1
- package/dist/core/delegation/worker-authority-resolver.d.ts +9 -0
- package/dist/core/delegation/worker-authority-resolver.d.ts.map +1 -1
- package/dist/core/delegation/worker-authority-resolver.js +21 -2
- package/dist/core/delegation/worker-authority-resolver.js.map +1 -1
- package/dist/core/delegation/worker-context-fork-store.d.ts +71 -0
- package/dist/core/delegation/worker-context-fork-store.d.ts.map +1 -0
- package/dist/core/delegation/worker-context-fork-store.js +437 -0
- package/dist/core/delegation/worker-context-fork-store.js.map +1 -0
- package/dist/core/delegation/worker-context-inheritance-policy.d.ts +18 -0
- package/dist/core/delegation/worker-context-inheritance-policy.d.ts.map +1 -0
- package/dist/core/delegation/worker-context-inheritance-policy.js +28 -0
- package/dist/core/delegation/worker-context-inheritance-policy.js.map +1 -0
- package/dist/core/delegation/worker-conversation-revision.d.ts +31 -0
- package/dist/core/delegation/worker-conversation-revision.d.ts.map +1 -0
- package/dist/core/delegation/worker-conversation-revision.js +203 -0
- package/dist/core/delegation/worker-conversation-revision.js.map +1 -0
- package/dist/core/delegation/worker-conversation-store.d.ts +130 -18
- package/dist/core/delegation/worker-conversation-store.d.ts.map +1 -1
- package/dist/core/delegation/worker-conversation-store.js +1263 -79
- package/dist/core/delegation/worker-conversation-store.js.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.d.ts +30 -2
- package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.js +675 -111
- package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
- package/dist/core/delegation/worker-delegation-request.d.ts +2 -0
- package/dist/core/delegation/worker-delegation-request.d.ts.map +1 -1
- package/dist/core/delegation/worker-delegation-request.js.map +1 -1
- package/dist/core/delegation/worker-dispatch-scheduler.d.ts +20 -1
- package/dist/core/delegation/worker-dispatch-scheduler.d.ts.map +1 -1
- package/dist/core/delegation/worker-dispatch-scheduler.js +210 -37
- package/dist/core/delegation/worker-dispatch-scheduler.js.map +1 -1
- package/dist/core/delegation/worker-execution-policy.d.ts.map +1 -1
- package/dist/core/delegation/worker-execution-policy.js +14 -2
- package/dist/core/delegation/worker-execution-policy.js.map +1 -1
- package/dist/core/delegation/worker-fleet-limits.d.ts +38 -0
- package/dist/core/delegation/worker-fleet-limits.d.ts.map +1 -0
- package/dist/core/delegation/worker-fleet-limits.js +113 -0
- package/dist/core/delegation/worker-fleet-limits.js.map +1 -0
- package/dist/core/delegation/worker-lane-projection.d.ts +1 -0
- package/dist/core/delegation/worker-lane-projection.d.ts.map +1 -1
- package/dist/core/delegation/worker-lane-projection.js +6 -2
- package/dist/core/delegation/worker-lane-projection.js.map +1 -1
- package/dist/core/delegation/worker-lifecycle.d.ts +20 -3
- package/dist/core/delegation/worker-lifecycle.d.ts.map +1 -1
- package/dist/core/delegation/worker-lifecycle.js +42 -18
- package/dist/core/delegation/worker-lifecycle.js.map +1 -1
- package/dist/core/delegation/worker-notification-coordinator.d.ts +4 -0
- package/dist/core/delegation/worker-notification-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-notification-coordinator.js +45 -4
- package/dist/core/delegation/worker-notification-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-provider-turn-protocol.d.ts +50 -0
- package/dist/core/delegation/worker-provider-turn-protocol.d.ts.map +1 -0
- package/dist/core/delegation/worker-provider-turn-protocol.js +185 -0
- package/dist/core/delegation/worker-provider-turn-protocol.js.map +1 -0
- package/dist/core/delegation/worker-recovery-coordinator.d.ts +45 -4
- package/dist/core/delegation/worker-recovery-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-recovery-coordinator.js +223 -17
- package/dist/core/delegation/worker-recovery-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-retry-policy.d.ts +36 -0
- package/dist/core/delegation/worker-retry-policy.d.ts.map +1 -0
- package/dist/core/delegation/worker-retry-policy.js +41 -0
- package/dist/core/delegation/worker-retry-policy.js.map +1 -0
- package/dist/core/delegation/worker-runner.d.ts +3 -1
- package/dist/core/delegation/worker-runner.d.ts.map +1 -1
- package/dist/core/delegation/worker-runner.js +4 -2
- package/dist/core/delegation/worker-runner.js.map +1 -1
- package/dist/core/delegation/worker-task-view.d.ts +43 -0
- package/dist/core/delegation/worker-task-view.d.ts.map +1 -0
- package/dist/core/delegation/worker-task-view.js +194 -0
- package/dist/core/delegation/worker-task-view.js.map +1 -0
- package/dist/core/delegation/worker-terminal-handoff-coordinator.d.ts +55 -0
- package/dist/core/delegation/worker-terminal-handoff-coordinator.d.ts.map +1 -0
- package/dist/core/delegation/worker-terminal-handoff-coordinator.js +179 -0
- package/dist/core/delegation/worker-terminal-handoff-coordinator.js.map +1 -0
- package/dist/core/delegation/worker-tree-budget-coordinator.d.ts +2 -2
- package/dist/core/delegation/worker-tree-budget-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-tree-budget-coordinator.js +12 -46
- package/dist/core/delegation/worker-tree-budget-coordinator.js.map +1 -1
- package/dist/core/goals/goal-continuation-controller.d.ts.map +1 -1
- package/dist/core/goals/goal-continuation-controller.js +15 -0
- package/dist/core/goals/goal-continuation-controller.js.map +1 -1
- package/dist/core/goals/goal-state.d.ts +6 -0
- package/dist/core/goals/goal-state.d.ts.map +1 -1
- package/dist/core/goals/goal-state.js +1 -0
- package/dist/core/goals/goal-state.js.map +1 -1
- package/dist/core/goals/goal-tool-core.d.ts +1 -0
- package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
- package/dist/core/goals/goal-tool-core.js +25 -3
- package/dist/core/goals/goal-tool-core.js.map +1 -1
- package/dist/core/keybindings.d.ts +10 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +2 -0
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/orchestration/attempt-ordering.d.ts +9 -0
- package/dist/core/orchestration/attempt-ordering.d.ts.map +1 -0
- package/dist/core/orchestration/attempt-ordering.js +29 -0
- package/dist/core/orchestration/attempt-ordering.js.map +1 -0
- package/dist/core/orchestration/capability-gateway.d.ts +19 -0
- package/dist/core/orchestration/capability-gateway.d.ts.map +1 -1
- package/dist/core/orchestration/capability-gateway.js +19 -2
- package/dist/core/orchestration/capability-gateway.js.map +1 -1
- package/dist/core/orchestration/contracts.d.ts +43 -3
- package/dist/core/orchestration/contracts.d.ts.map +1 -1
- package/dist/core/orchestration/contracts.js +24 -0
- package/dist/core/orchestration/contracts.js.map +1 -1
- package/dist/core/orchestration/delegation-ledger.d.ts +8 -3
- package/dist/core/orchestration/delegation-ledger.d.ts.map +1 -1
- package/dist/core/orchestration/delegation-ledger.js +148 -55
- package/dist/core/orchestration/delegation-ledger.js.map +1 -1
- package/dist/core/orchestration/event-store.d.ts +6 -3
- package/dist/core/orchestration/event-store.d.ts.map +1 -1
- package/dist/core/orchestration/event-store.js +228 -30
- package/dist/core/orchestration/event-store.js.map +1 -1
- package/dist/core/orchestration/task-runtime-codecs.d.ts +31 -0
- package/dist/core/orchestration/task-runtime-codecs.d.ts.map +1 -0
- package/dist/core/orchestration/task-runtime-codecs.js +1471 -0
- package/dist/core/orchestration/task-runtime-codecs.js.map +1 -0
- package/dist/core/orchestration/task-runtime-projection.d.ts +30 -0
- package/dist/core/orchestration/task-runtime-projection.d.ts.map +1 -0
- package/dist/core/orchestration/task-runtime-projection.js +340 -0
- package/dist/core/orchestration/task-runtime-projection.js.map +1 -0
- package/dist/core/orchestration/task-runtime-reducer.d.ts +38 -0
- package/dist/core/orchestration/task-runtime-reducer.d.ts.map +1 -0
- package/dist/core/orchestration/task-runtime-reducer.js +1270 -0
- package/dist/core/orchestration/task-runtime-reducer.js.map +1 -0
- package/dist/core/orchestration/task-runtime-state.d.ts +142 -0
- package/dist/core/orchestration/task-runtime-state.d.ts.map +1 -0
- package/dist/core/orchestration/task-runtime-state.js +14 -0
- package/dist/core/orchestration/task-runtime-state.js.map +1 -0
- package/dist/core/orchestration/task-runtime.d.ts +44 -98
- package/dist/core/orchestration/task-runtime.d.ts.map +1 -1
- package/dist/core/orchestration/task-runtime.js +357 -1113
- package/dist/core/orchestration/task-runtime.js.map +1 -1
- package/dist/core/orchestration/worker-context-fork-reference.d.ts +20 -0
- package/dist/core/orchestration/worker-context-fork-reference.d.ts.map +1 -0
- package/dist/core/orchestration/worker-context-fork-reference.js +53 -0
- package/dist/core/orchestration/worker-context-fork-reference.js.map +1 -0
- package/dist/core/orchestration/worker-execution-contract.d.ts.map +1 -1
- package/dist/core/orchestration/worker-execution-contract.js +4 -2
- package/dist/core/orchestration/worker-execution-contract.js.map +1 -1
- package/dist/core/research/research-runner.d.ts +2 -0
- package/dist/core/research/research-runner.d.ts.map +1 -1
- package/dist/core/research/research-runner.js +1 -0
- package/dist/core/research/research-runner.js.map +1 -1
- package/dist/core/runtime-builder.d.ts.map +1 -1
- package/dist/core/runtime-builder.js +8 -0
- package/dist/core/runtime-builder.js.map +1 -1
- package/dist/core/secrets/credential-project.d.ts.map +1 -1
- package/dist/core/secrets/credential-project.js +24 -2
- package/dist/core/secrets/credential-project.js.map +1 -1
- package/dist/core/security/secret-text.d.ts +3 -0
- package/dist/core/security/secret-text.d.ts.map +1 -1
- package/dist/core/security/secret-text.js +15 -0
- package/dist/core/security/secret-text.js.map +1 -1
- package/dist/core/settings-manager.d.ts +3 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +160 -8
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/tools/delegate.d.ts +33 -15
- package/dist/core/tools/delegate.d.ts.map +1 -1
- package/dist/core/tools/delegate.js +763 -115
- package/dist/core/tools/delegate.js.map +1 -1
- package/dist/core/tools/goal.d.ts +1 -0
- package/dist/core/tools/goal.d.ts.map +1 -1
- package/dist/core/tools/goal.js +9 -1
- package/dist/core/tools/goal.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +1 -0
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/activity-lane.d.ts +5 -0
- package/dist/modes/interactive/components/activity-lane.d.ts.map +1 -1
- package/dist/modes/interactive/components/activity-lane.js +133 -49
- package/dist/modes/interactive/components/activity-lane.js.map +1 -1
- package/dist/modes/interactive/components/agents-overlay.d.ts +40 -0
- package/dist/modes/interactive/components/agents-overlay.d.ts.map +1 -0
- package/dist/modes/interactive/components/agents-overlay.js +153 -0
- package/dist/modes/interactive/components/agents-overlay.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +18 -13
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-event-controller.d.ts +1 -1
- package/dist/modes/interactive/interactive-event-controller.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-event-controller.js +6 -3
- package/dist/modes/interactive/interactive-event-controller.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +5 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +51 -0
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/key-handlers.d.ts +1 -0
- package/dist/modes/interactive/key-handlers.d.ts.map +1 -1
- package/dist/modes/interactive/key-handlers.js +1 -0
- package/dist/modes/interactive/key-handlers.js.map +1 -1
- package/docs/harness-architecture.md +61 -17
- package/docs/settings.md +17 -9
- package/docs/worker-profiles.md +6 -2
- 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
|
@@ -1,11 +1,25 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { isDeepStrictEqual } from "node:util";
|
|
1
3
|
import { deriveWorkerTaskLabel } from "../delegation/worker-task-label.js";
|
|
2
4
|
import { hasGoalAcceptanceOverride } from "../goals/goal-acceptance.js";
|
|
5
|
+
import { latestAgentAttemptByDurableOrder } from "./attempt-ordering.js";
|
|
6
|
+
import { MAX_ORCHESTRATION_IDENTIFIER_LENGTH } from "./contracts.js";
|
|
3
7
|
import { OrchestrationEventStore } from "./event-store.js";
|
|
4
|
-
import { DurableTaskRuntime, DurableTaskRuntimeError } from "./task-runtime.js";
|
|
8
|
+
import { DurableTaskRuntime, DurableTaskRuntimeError, validateTaskDependencyIds, } from "./task-runtime.js";
|
|
5
9
|
import { goalObjectiveId, projectGoalAcceptanceEvidence, projectGoalObjective } from "./work-state-projection.js";
|
|
10
|
+
import { normalizeWorkerContextForkReference, } from "./worker-context-fork-reference.js";
|
|
6
11
|
function activeAttempt(attempt) {
|
|
7
12
|
return attempt.status === "queued" || attempt.status === "leased" || attempt.status === "running";
|
|
8
13
|
}
|
|
14
|
+
function mailboxTurnTaskId(agentId, controlMessageId) {
|
|
15
|
+
return `mailbox-turn-${createHash("sha256")
|
|
16
|
+
.update("pi-worker-agent-mailbox-turn-v1")
|
|
17
|
+
.update("\0")
|
|
18
|
+
.update(agentId)
|
|
19
|
+
.update("\0")
|
|
20
|
+
.update(controlMessageId)
|
|
21
|
+
.digest("hex")}`;
|
|
22
|
+
}
|
|
9
23
|
/**
|
|
10
24
|
* Durable adapter for in-process delegated completions. It records the dispatch before execution,
|
|
11
25
|
* fences interrupted completions on restart, and returns queued work for event-driven re-dispatch.
|
|
@@ -15,7 +29,7 @@ export class DelegationOrchestrationLedger {
|
|
|
15
29
|
constructor(options) {
|
|
16
30
|
this.sessionId = options.sessionId;
|
|
17
31
|
this.runtime = new DurableTaskRuntime({
|
|
18
|
-
store: new OrchestrationEventStore({ agentDir: options.agentDir, sessionId: options.sessionId }),
|
|
32
|
+
store: options.store ?? new OrchestrationEventStore({ agentDir: options.agentDir, sessionId: options.sessionId }),
|
|
19
33
|
now: options.now,
|
|
20
34
|
});
|
|
21
35
|
}
|
|
@@ -33,7 +47,10 @@ export class DelegationOrchestrationLedger {
|
|
|
33
47
|
...(input.goal ? { goal: input.goal } : {}),
|
|
34
48
|
...(input.verificationOfTaskId ? { verificationOfTaskId: input.verificationOfTaskId } : {}),
|
|
35
49
|
...(input.taskContext ? { taskContext: input.taskContext } : {}),
|
|
36
|
-
dispatchMetadata: {
|
|
50
|
+
dispatchMetadata: {
|
|
51
|
+
logicalLaneId: input.laneId,
|
|
52
|
+
...(input.birthContextForkReference ? { birthContextForkReference: input.birthContextForkReference } : {}),
|
|
53
|
+
},
|
|
37
54
|
});
|
|
38
55
|
}
|
|
39
56
|
prepareManaged(input) {
|
|
@@ -62,24 +79,30 @@ export class DelegationOrchestrationLedger {
|
|
|
62
79
|
}
|
|
63
80
|
/**
|
|
64
81
|
* Queue one new turn for an existing logical agent. The agent identity and its immutable
|
|
65
|
-
* execution contract are inherited from the last bound turn
|
|
66
|
-
*
|
|
82
|
+
* execution contract are inherited from the last bound turn. Each distinct control message owns
|
|
83
|
+
* one deterministic task/attempt identity; exact retries adopt it instead of minting new work.
|
|
67
84
|
*/
|
|
68
85
|
prepareAgentTurn(input) {
|
|
69
86
|
const agentId = input.agentId.trim();
|
|
70
87
|
const instructions = input.instructions.trim();
|
|
88
|
+
const controlMessageId = input.controlMessageId?.trim();
|
|
71
89
|
if (!agentId)
|
|
72
90
|
throw new DurableTaskRuntimeError("Logical worker agent id is required.");
|
|
73
91
|
if (!instructions)
|
|
74
92
|
throw new DurableTaskRuntimeError("Worker follow-up instructions are required.");
|
|
93
|
+
if (input.controlMessageId !== undefined &&
|
|
94
|
+
(!controlMessageId || controlMessageId.length > MAX_ORCHESTRATION_IDENTIFIER_LENGTH)) {
|
|
95
|
+
throw new DurableTaskRuntimeError("Worker control message id is invalid.");
|
|
96
|
+
}
|
|
75
97
|
const snapshot = this.runtime.getSnapshot();
|
|
76
98
|
const agent = snapshot.agents[agentId];
|
|
77
99
|
if (!agent)
|
|
78
100
|
throw new DurableTaskRuntimeError(`Unknown logical worker agent '${agentId}'.`);
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}
|
|
82
|
-
const
|
|
101
|
+
const agentAttempts = Object.values(snapshot.attempts).filter((attempt) => attempt.agentId === agentId || attempt.dispatch.logicalLaneId === agentId);
|
|
102
|
+
const sequence = agentAttempts.length + 1;
|
|
103
|
+
const taskId = controlMessageId ? mailboxTurnTaskId(agentId, controlMessageId) : `${agentId}:turn:${sequence}`;
|
|
104
|
+
const existingTask = snapshot.tasks[taskId]?.task;
|
|
105
|
+
const prior = latestAgentAttemptByDurableOrder(snapshot, agent.agentId);
|
|
83
106
|
const contract = prior?.dispatch.executionContract;
|
|
84
107
|
if (!prior || !contract) {
|
|
85
108
|
throw new DurableTaskRuntimeError(`Logical worker agent '${agentId}' has no immutable execution contract.`);
|
|
@@ -87,9 +110,31 @@ export class DelegationOrchestrationLedger {
|
|
|
87
110
|
const priorTask = snapshot.tasks[prior.taskId]?.task;
|
|
88
111
|
if (!priorTask)
|
|
89
112
|
throw new DurableTaskRuntimeError(`Logical worker agent '${agentId}' has no prior durable task.`);
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
113
|
+
const dependencyTaskIds = validateTaskDependencyIds(snapshot.tasks, existingTask?.objectiveId ?? priorTask.objectiveId, input.dependsOnTaskIds);
|
|
114
|
+
if (existingTask && controlMessageId) {
|
|
115
|
+
if (existingTask.description !== instructions ||
|
|
116
|
+
existingTask.role !== agent.role ||
|
|
117
|
+
existingTask.dependsOn.length !== dependencyTaskIds.length ||
|
|
118
|
+
existingTask.dependsOn.some((dependencyId, index) => dependencyId !== dependencyTaskIds[index])) {
|
|
119
|
+
throw new DurableTaskRuntimeError(`Worker control message '${controlMessageId}' has conflicting task identity.`);
|
|
120
|
+
}
|
|
121
|
+
const existingAttempts = (snapshot.tasks[taskId]?.attemptIds ?? []).map((attemptId) => snapshot.attempts[attemptId]);
|
|
122
|
+
for (const attempt of existingAttempts) {
|
|
123
|
+
if (!attempt ||
|
|
124
|
+
attempt.dispatch.logicalLaneId !== agentId ||
|
|
125
|
+
attempt.dispatch.controlMessageId !== controlMessageId ||
|
|
126
|
+
attempt.dispatch.instructions !== instructions) {
|
|
127
|
+
throw new DurableTaskRuntimeError(`Worker control message '${controlMessageId}' has conflicting dispatch evidence.`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const existingAttempt = existingAttempts.at(-1);
|
|
131
|
+
if (existingAttempt)
|
|
132
|
+
return existingAttempt;
|
|
133
|
+
}
|
|
134
|
+
if (agent.status !== "registered") {
|
|
135
|
+
throw new DurableTaskRuntimeError(`Logical worker agent '${agentId}' is not idle.`);
|
|
136
|
+
}
|
|
137
|
+
if (existingTask && !controlMessageId) {
|
|
93
138
|
throw new DurableTaskRuntimeError(`Logical worker agent '${agentId}' already has turn ${sequence}.`);
|
|
94
139
|
}
|
|
95
140
|
return this.prepareNormalized({
|
|
@@ -99,9 +144,10 @@ export class DelegationOrchestrationLedger {
|
|
|
99
144
|
role: agent.role,
|
|
100
145
|
requiredCapabilities: contract.worker.authority.capabilities,
|
|
101
146
|
riskBudget: contract.worker.profile.budget,
|
|
147
|
+
...(priorTask.objectiveId.startsWith("goal:") ? { goalId: priorTask.objectiveId.slice("goal:".length) } : {}),
|
|
102
148
|
taskContext: {
|
|
103
149
|
requirementIds: prior.dispatch.requirementIds ?? [],
|
|
104
|
-
dependsOnTaskIds:
|
|
150
|
+
dependsOnTaskIds: dependencyTaskIds,
|
|
105
151
|
acceptanceCriterionIds: priorTask.acceptanceCriterionIds,
|
|
106
152
|
resourcePointerIds: prior.dispatch.resourcePointerIds,
|
|
107
153
|
},
|
|
@@ -109,16 +155,24 @@ export class DelegationOrchestrationLedger {
|
|
|
109
155
|
dispatchMetadata: {
|
|
110
156
|
logicalLaneId: agentId,
|
|
111
157
|
dispatchSequence: sequence,
|
|
158
|
+
...(controlMessageId ? { controlMessageId } : {}),
|
|
159
|
+
...(prior.dispatch.birthContextForkReference
|
|
160
|
+
? { birthContextForkReference: prior.dispatch.birthContextForkReference }
|
|
161
|
+
: {}),
|
|
112
162
|
},
|
|
113
163
|
});
|
|
114
164
|
}
|
|
115
|
-
latestAgentAttempt(snapshot, agent) {
|
|
116
|
-
return Object.values(snapshot.attempts)
|
|
117
|
-
.filter((attempt) => attempt.agentId === agent.agentId)
|
|
118
|
-
.sort((left, right) => left.createdAt.localeCompare(right.createdAt))
|
|
119
|
-
.at(-1);
|
|
120
|
-
}
|
|
121
165
|
prepareNormalized(input) {
|
|
166
|
+
let birthContextForkReference;
|
|
167
|
+
try {
|
|
168
|
+
birthContextForkReference =
|
|
169
|
+
input.dispatchMetadata?.birthContextForkReference === undefined
|
|
170
|
+
? undefined
|
|
171
|
+
: normalizeWorkerContextForkReference(input.dispatchMetadata.birthContextForkReference);
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
throw new DurableTaskRuntimeError(error instanceof Error ? error.message : String(error));
|
|
175
|
+
}
|
|
122
176
|
let snapshot = this.runtime.getSnapshot();
|
|
123
177
|
const existingVerificationSubject = input.verificationOfTaskId
|
|
124
178
|
? snapshot.tasks[input.verificationOfTaskId]
|
|
@@ -130,6 +184,34 @@ export class DelegationOrchestrationLedger {
|
|
|
130
184
|
const objectiveId = existingVerificationSubject?.task.objectiveId ??
|
|
131
185
|
projectedGoal?.objectiveId ??
|
|
132
186
|
(input.goalId ? goalObjectiveId(input.goalId) : `session:${this.sessionId}`);
|
|
187
|
+
const dependencyTaskIds = validateTaskDependencyIds(snapshot.tasks, objectiveId, input.taskContext?.dependsOnTaskIds);
|
|
188
|
+
const existingTask = snapshot.tasks[input.laneId]?.task;
|
|
189
|
+
if (existingTask &&
|
|
190
|
+
(existingTask.objectiveId !== objectiveId ||
|
|
191
|
+
existingTask.description !== input.instructions ||
|
|
192
|
+
existingTask.role !== input.role ||
|
|
193
|
+
existingTask.dependsOn.length !== dependencyTaskIds.length ||
|
|
194
|
+
existingTask.dependsOn.some((dependencyId, index) => dependencyId !== dependencyTaskIds[index]))) {
|
|
195
|
+
throw new DurableTaskRuntimeError(`Task '${input.laneId}' has conflicting durable dispatch identity.`);
|
|
196
|
+
}
|
|
197
|
+
const taskStateBeforeWrites = snapshot.tasks[input.laneId];
|
|
198
|
+
const activeAttemptBeforeWrites = taskStateBeforeWrites?.attemptIds
|
|
199
|
+
.map((attemptId) => snapshot.attempts[attemptId])
|
|
200
|
+
.find((attempt) => attempt !== undefined && activeAttempt(attempt));
|
|
201
|
+
for (const attemptId of taskStateBeforeWrites?.attemptIds ?? []) {
|
|
202
|
+
const durableReference = snapshot.attempts[attemptId]?.dispatch.birthContextForkReference;
|
|
203
|
+
if (!isDeepStrictEqual(durableReference, birthContextForkReference)) {
|
|
204
|
+
throw new DurableTaskRuntimeError(`Task '${input.laneId}' has a conflicting birth context fork reference.`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
const projectedEvidence = input.goal && objectiveId === projectedGoal?.objectiveId ? projectGoalAcceptanceEvidence(input.goal) : [];
|
|
208
|
+
if (projectedGoal)
|
|
209
|
+
this.runtime.assertObjectiveSynchronizationHeadroom(projectedGoal, projectedEvidence);
|
|
210
|
+
this.runtime.assertProjectionHeadroom({
|
|
211
|
+
objectives: snapshot.objectives[objectiveId] ? 0 : 1,
|
|
212
|
+
tasks: taskStateBeforeWrites ? 0 : 1,
|
|
213
|
+
attempts: activeAttemptBeforeWrites ? 0 : 1,
|
|
214
|
+
});
|
|
133
215
|
if (input.goal && objectiveId === projectedGoal?.objectiveId) {
|
|
134
216
|
this.synchronizeGoalState(input.goal);
|
|
135
217
|
snapshot = this.runtime.getSnapshot();
|
|
@@ -142,39 +224,25 @@ export class DelegationOrchestrationLedger {
|
|
|
142
224
|
});
|
|
143
225
|
snapshot = this.runtime.getSnapshot();
|
|
144
226
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
: {}),
|
|
165
|
-
});
|
|
166
|
-
snapshot = this.runtime.getSnapshot();
|
|
167
|
-
}
|
|
168
|
-
const task = snapshot.tasks[input.laneId];
|
|
169
|
-
if (!task)
|
|
170
|
-
throw new DurableTaskRuntimeError(`Failed to create task '${input.laneId}'.`);
|
|
171
|
-
const existing = [...task.attemptIds]
|
|
172
|
-
.reverse()
|
|
173
|
-
.map((attemptId) => snapshot.attempts[attemptId])
|
|
174
|
-
.find((attempt) => attempt !== undefined && activeAttempt(attempt));
|
|
175
|
-
if (existing)
|
|
176
|
-
return existing;
|
|
177
|
-
return this.runtime.queueAttempt(input.laneId, {
|
|
227
|
+
const verificationSubject = input.verificationOfTaskId ? snapshot.tasks[input.verificationOfTaskId] : undefined;
|
|
228
|
+
const taskInput = {
|
|
229
|
+
taskId: input.laneId,
|
|
230
|
+
objectiveId,
|
|
231
|
+
title: deriveWorkerTaskLabel(input.instructions, `Delegated ${input.role} work`),
|
|
232
|
+
description: input.instructions,
|
|
233
|
+
role: input.role,
|
|
234
|
+
dependsOn: dependencyTaskIds,
|
|
235
|
+
requiredCapabilities: input.requiredCapabilities,
|
|
236
|
+
acceptanceCriterionIds: input.taskContext?.acceptanceCriterionIds ?? [],
|
|
237
|
+
riskBudget: input.riskBudget,
|
|
238
|
+
...(input.verificationOfTaskId
|
|
239
|
+
? {
|
|
240
|
+
verificationOfTaskId: input.verificationOfTaskId,
|
|
241
|
+
acceptanceCriterionIds: verificationSubject?.task.acceptanceCriterionIds ?? [],
|
|
242
|
+
}
|
|
243
|
+
: {}),
|
|
244
|
+
};
|
|
245
|
+
const dispatch = {
|
|
178
246
|
taskId: input.laneId,
|
|
179
247
|
profileId: input.profileId,
|
|
180
248
|
instructions: input.instructions,
|
|
@@ -183,13 +251,38 @@ export class DelegationOrchestrationLedger {
|
|
|
183
251
|
requirementIds: input.taskContext?.requirementIds ?? [],
|
|
184
252
|
...(input.executionContract ? { executionContract: input.executionContract } : {}),
|
|
185
253
|
...input.dispatchMetadata,
|
|
186
|
-
|
|
254
|
+
...(birthContextForkReference ? { birthContextForkReference } : {}),
|
|
255
|
+
};
|
|
256
|
+
if (existingTask &&
|
|
257
|
+
(existingTask.title !== taskInput.title ||
|
|
258
|
+
existingTask.verificationOfTaskId !== taskInput.verificationOfTaskId ||
|
|
259
|
+
!isDeepStrictEqual(existingTask.requiredCapabilities, [...new Set(taskInput.requiredCapabilities)]) ||
|
|
260
|
+
!isDeepStrictEqual(existingTask.acceptanceCriterionIds, [...new Set(taskInput.acceptanceCriterionIds)]) ||
|
|
261
|
+
!isDeepStrictEqual(existingTask.riskBudget, taskInput.riskBudget))) {
|
|
262
|
+
throw new DurableTaskRuntimeError(`Task '${input.laneId}' has conflicting durable task identity.`);
|
|
263
|
+
}
|
|
264
|
+
if (activeAttemptBeforeWrites && !isDeepStrictEqual(activeAttemptBeforeWrites.dispatch, dispatch)) {
|
|
265
|
+
throw new DurableTaskRuntimeError(`Task '${input.laneId}' has conflicting durable dispatch identity.`);
|
|
266
|
+
}
|
|
267
|
+
if (!snapshot.tasks[input.laneId]) {
|
|
268
|
+
return this.runtime.prepareTaskAttempt({
|
|
269
|
+
...taskInput,
|
|
270
|
+
}, dispatch).attempt;
|
|
271
|
+
}
|
|
272
|
+
const task = snapshot.tasks[input.laneId];
|
|
273
|
+
if (!task)
|
|
274
|
+
throw new DurableTaskRuntimeError(`Failed to create task '${input.laneId}'.`);
|
|
275
|
+
if (activeAttemptBeforeWrites)
|
|
276
|
+
return activeAttemptBeforeWrites;
|
|
277
|
+
return this.runtime.queueAttempt(input.laneId, dispatch);
|
|
187
278
|
}
|
|
188
279
|
synchronizeGoalState(goal) {
|
|
189
280
|
const objective = projectGoalObjective(goal);
|
|
281
|
+
const evidence = projectGoalAcceptanceEvidence(goal);
|
|
282
|
+
this.runtime.assertObjectiveSynchronizationHeadroom(objective, evidence);
|
|
190
283
|
this.runtime.ensureObjective(objective);
|
|
191
|
-
for (const
|
|
192
|
-
this.runtime.recordObjectiveEvidence(objective.objectiveId,
|
|
284
|
+
for (const item of evidence) {
|
|
285
|
+
this.runtime.recordObjectiveEvidence(objective.objectiveId, item);
|
|
193
286
|
}
|
|
194
287
|
const status = this.runtime.getSnapshot().objectives[goalObjectiveId(goal.goalId)]?.objective.status;
|
|
195
288
|
switch (goal.status) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delegation-ledger.js","sourceRoot":"","sources":["../../../src/core/orchestration/delegation-ledger.ts"],"names":[],"mappings":"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","sourcesContent":["import type { WorkerDelegationTaskContext } from \"../delegation/worker-delegation-request.ts\";\nimport { deriveWorkerTaskLabel } from \"../delegation/worker-task-label.ts\";\nimport { hasGoalAcceptanceOverride } from \"../goals/goal-acceptance.ts\";\nimport type { GoalState } from \"../goals/goal-state.ts\";\nimport type {\n\tAgentBindingContract,\n\tAttemptUsageSnapshot,\n\tHarnessCapability,\n\tOrchestrationDispatchRequest,\n\tRiskBudget,\n\tWorkerExecutionContract,\n\tWorkerRole,\n} from \"./contracts.ts\";\nimport { OrchestrationEventStore } from \"./event-store.ts\";\nimport { type AttemptRuntimeState, DurableTaskRuntime, DurableTaskRuntimeError } from \"./task-runtime.ts\";\nimport { goalObjectiveId, projectGoalAcceptanceEvidence, projectGoalObjective } from \"./work-state-projection.ts\";\n\nexport interface DelegationLedgerOptions {\n\tagentDir: string;\n\tsessionId: string;\n\tnow?: () => number;\n}\n\nexport interface PrepareDelegationInput {\n\tlaneId: string;\n\tinstructions: string;\n\tparentAgentId?: string;\n\texecutionContract: WorkerExecutionContract;\n\trequiredCapabilities: readonly HarnessCapability[];\n\tgoal?: GoalState;\n\tverificationOfTaskId?: string;\n\ttaskContext?: WorkerDelegationTaskContext;\n}\n\nexport interface PrepareManagedDelegationInput {\n\tlaneId: string;\n\tdispatchSequence: number;\n\tinstructions: string;\n\tprofileId: string;\n\tprovider: string;\n\tauthorizationId: string;\n\trole: WorkerRole;\n\triskBudget: RiskBudget;\n\tgoal?: GoalState;\n\tgoalId?: string;\n\tworktreeLaneKey?: string;\n}\n\nexport interface StartedDelegationAttempt {\n\tobjectiveId: string;\n\ttaskId: string;\n\tattemptId: string;\n\tleaseId: string;\n\tfencingToken: number;\n\texpiresAt: string;\n}\n\nexport interface PrepareAgentTurnInput {\n\tagentId: string;\n\tinstructions: string;\n}\n\nfunction activeAttempt(attempt: AttemptRuntimeState): boolean {\n\treturn attempt.status === \"queued\" || attempt.status === \"leased\" || attempt.status === \"running\";\n}\n\n/**\n * Durable adapter for in-process delegated completions. It records the dispatch before execution,\n * fences interrupted completions on restart, and returns queued work for event-driven re-dispatch.\n * It deliberately does not pretend an isolated completion has a resumable model transcript.\n */\nexport class DelegationOrchestrationLedger {\n\treadonly runtime: DurableTaskRuntime;\n\tprivate readonly sessionId: string;\n\n\tconstructor(options: DelegationLedgerOptions) {\n\t\tthis.sessionId = options.sessionId;\n\t\tthis.runtime = new DurableTaskRuntime({\n\t\t\tstore: new OrchestrationEventStore({ agentDir: options.agentDir, sessionId: options.sessionId }),\n\t\t\tnow: options.now,\n\t\t});\n\t}\n\n\tprepare(input: PrepareDelegationInput): AttemptRuntimeState {\n\t\tconst profile = input.executionContract.worker.profile;\n\t\treturn this.prepareNormalized({\n\t\t\tlaneId: input.laneId,\n\t\t\tinstructions: input.instructions,\n\t\t\tprofileId: profile.profileId,\n\t\t\trole: profile.role,\n\t\t\trequiredCapabilities: input.requiredCapabilities,\n\t\t\triskBudget: profile.budget,\n\t\t\t...(input.parentAgentId ? { parentAgentId: input.parentAgentId } : {}),\n\t\t\texecutionContract: input.executionContract,\n\t\t\t...(input.goal ? { goal: input.goal } : {}),\n\t\t\t...(input.verificationOfTaskId ? { verificationOfTaskId: input.verificationOfTaskId } : {}),\n\t\t\t...(input.taskContext ? { taskContext: input.taskContext } : {}),\n\t\t\tdispatchMetadata: { logicalLaneId: input.laneId },\n\t\t});\n\t}\n\n\tprepareManaged(input: PrepareManagedDelegationInput): AttemptRuntimeState {\n\t\tif (!Number.isSafeInteger(input.dispatchSequence) || input.dispatchSequence < 1) {\n\t\t\tthrow new DurableTaskRuntimeError(\"Managed dispatch sequence must be a positive integer.\");\n\t\t}\n\t\tconst taskId = `${input.laneId}:turn:${input.dispatchSequence}`;\n\t\treturn this.prepareNormalized({\n\t\t\tlaneId: taskId,\n\t\t\tinstructions: input.instructions,\n\t\t\tprofileId: input.profileId,\n\t\t\trole: input.role,\n\t\t\trequiredCapabilities: [],\n\t\t\triskBudget: input.riskBudget,\n\t\t\t...(input.goal ? { goal: input.goal } : {}),\n\t\t\t...(input.goalId ? { goalId: input.goalId } : {}),\n\t\t\tdispatchMetadata: {\n\t\t\t\texecutionKind: \"managed-process\",\n\t\t\t\tlogicalLaneId: input.laneId,\n\t\t\t\tdispatchSequence: input.dispatchSequence,\n\t\t\t\tprovider: input.provider,\n\t\t\t\tauthorizationId: input.authorizationId,\n\t\t\t\t...(input.worktreeLaneKey ? { worktreeLaneKey: input.worktreeLaneKey } : {}),\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * Queue one new turn for an existing logical agent. The agent identity and its immutable\n\t * execution contract are inherited from the last bound turn; the durable task and attempt ids\n\t * are intentionally new so retries, leases, and terminal evidence never collide across turns.\n\t */\n\tprepareAgentTurn(input: PrepareAgentTurnInput): AttemptRuntimeState {\n\t\tconst agentId = input.agentId.trim();\n\t\tconst instructions = input.instructions.trim();\n\t\tif (!agentId) throw new DurableTaskRuntimeError(\"Logical worker agent id is required.\");\n\t\tif (!instructions) throw new DurableTaskRuntimeError(\"Worker follow-up instructions are required.\");\n\t\tconst snapshot = this.runtime.getSnapshot();\n\t\tconst agent = snapshot.agents[agentId];\n\t\tif (!agent) throw new DurableTaskRuntimeError(`Unknown logical worker agent '${agentId}'.`);\n\t\tif (agent.status !== \"registered\") {\n\t\t\tthrow new DurableTaskRuntimeError(`Logical worker agent '${agentId}' is not idle.`);\n\t\t}\n\t\tconst prior = this.latestAgentAttempt(snapshot, agent);\n\t\tconst contract = prior?.dispatch.executionContract;\n\t\tif (!prior || !contract) {\n\t\t\tthrow new DurableTaskRuntimeError(`Logical worker agent '${agentId}' has no immutable execution contract.`);\n\t\t}\n\t\tconst priorTask = snapshot.tasks[prior.taskId]?.task;\n\t\tif (!priorTask) throw new DurableTaskRuntimeError(`Logical worker agent '${agentId}' has no prior durable task.`);\n\t\tconst sequence = Object.values(snapshot.attempts).filter((attempt) => attempt.agentId === agentId).length + 1;\n\t\tconst taskId = `${agentId}:turn:${sequence}`;\n\t\tif (snapshot.tasks[taskId]) {\n\t\t\tthrow new DurableTaskRuntimeError(`Logical worker agent '${agentId}' already has turn ${sequence}.`);\n\t\t}\n\t\treturn this.prepareNormalized({\n\t\t\tlaneId: taskId,\n\t\t\tinstructions,\n\t\t\tprofileId: contract.worker.profile.profileId,\n\t\t\trole: agent.role,\n\t\t\trequiredCapabilities: contract.worker.authority.capabilities,\n\t\t\triskBudget: contract.worker.profile.budget,\n\t\t\ttaskContext: {\n\t\t\t\trequirementIds: prior.dispatch.requirementIds ?? [],\n\t\t\t\tdependsOnTaskIds: priorTask.dependsOn,\n\t\t\t\tacceptanceCriterionIds: priorTask.acceptanceCriterionIds,\n\t\t\t\tresourcePointerIds: prior.dispatch.resourcePointerIds,\n\t\t\t},\n\t\t\texecutionContract: contract,\n\t\t\tdispatchMetadata: {\n\t\t\t\tlogicalLaneId: agentId,\n\t\t\t\tdispatchSequence: sequence,\n\t\t\t},\n\t\t});\n\t}\n\n\tprivate latestAgentAttempt(\n\t\tsnapshot: ReturnType<DurableTaskRuntime[\"getSnapshot\"]>,\n\t\tagent: AgentBindingContract,\n\t): AttemptRuntimeState | undefined {\n\t\treturn Object.values(snapshot.attempts)\n\t\t\t.filter((attempt) => attempt.agentId === agent.agentId)\n\t\t\t.sort((left, right) => left.createdAt.localeCompare(right.createdAt))\n\t\t\t.at(-1);\n\t}\n\n\tprivate prepareNormalized(input: {\n\t\tlaneId: string;\n\t\tinstructions: string;\n\t\tprofileId: string;\n\t\trole: WorkerRole;\n\t\trequiredCapabilities: readonly HarnessCapability[];\n\t\triskBudget: RiskBudget;\n\t\tparentAgentId?: string;\n\t\tgoal?: GoalState;\n\t\tgoalId?: string;\n\t\tverificationOfTaskId?: string;\n\t\ttaskContext?: WorkerDelegationTaskContext;\n\t\texecutionContract?: WorkerExecutionContract;\n\t\tdispatchMetadata?: Pick<\n\t\t\tOrchestrationDispatchRequest,\n\t\t\t\"executionKind\" | \"logicalLaneId\" | \"dispatchSequence\" | \"provider\" | \"authorizationId\" | \"worktreeLaneKey\"\n\t\t>;\n\t}): AttemptRuntimeState {\n\t\tlet snapshot = this.runtime.getSnapshot();\n\t\tconst existingVerificationSubject = input.verificationOfTaskId\n\t\t\t? snapshot.tasks[input.verificationOfTaskId]\n\t\t\t: undefined;\n\t\tif (input.verificationOfTaskId && !existingVerificationSubject) {\n\t\t\tthrow new DurableTaskRuntimeError(`Unknown verification subject '${input.verificationOfTaskId}'.`);\n\t\t}\n\t\tconst projectedGoal = input.goal ? projectGoalObjective(input.goal) : undefined;\n\t\tconst objectiveId =\n\t\t\texistingVerificationSubject?.task.objectiveId ??\n\t\t\tprojectedGoal?.objectiveId ??\n\t\t\t(input.goalId ? goalObjectiveId(input.goalId) : `session:${this.sessionId}`);\n\t\tif (input.goal && objectiveId === projectedGoal?.objectiveId) {\n\t\t\tthis.synchronizeGoalState(input.goal);\n\t\t\tsnapshot = this.runtime.getSnapshot();\n\t\t} else if (!snapshot.objectives[objectiveId]) {\n\t\t\tthis.runtime.createObjective({\n\t\t\t\tobjectiveId,\n\t\t\t\ttitle: input.goalId ? `Goal ${input.goalId}` : `Session ${this.sessionId}`,\n\t\t\t\tdescription: input.goalId ? \"Externally managed goal work\" : \"Session-scoped delegated work\",\n\t\t\t});\n\t\t\tsnapshot = this.runtime.getSnapshot();\n\t\t}\n\n\t\tif (!snapshot.tasks[input.laneId]) {\n\t\t\tconst verificationSubject = input.verificationOfTaskId\n\t\t\t\t? snapshot.tasks[input.verificationOfTaskId]\n\t\t\t\t: undefined;\n\t\t\tthis.runtime.createTask({\n\t\t\t\ttaskId: input.laneId,\n\t\t\t\tobjectiveId,\n\t\t\t\ttitle: deriveWorkerTaskLabel(input.instructions, `Delegated ${input.role} work`),\n\t\t\t\tdescription: input.instructions,\n\t\t\t\trole: input.role,\n\t\t\t\tdependsOn: input.taskContext?.dependsOnTaskIds ?? [],\n\t\t\t\trequiredCapabilities: input.requiredCapabilities,\n\t\t\t\tacceptanceCriterionIds: input.taskContext?.acceptanceCriterionIds ?? [],\n\t\t\t\triskBudget: input.riskBudget,\n\t\t\t\t...(input.verificationOfTaskId\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tverificationOfTaskId: input.verificationOfTaskId,\n\t\t\t\t\t\t\tacceptanceCriterionIds: verificationSubject?.task.acceptanceCriterionIds ?? [],\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t});\n\t\t\tsnapshot = this.runtime.getSnapshot();\n\t\t}\n\n\t\tconst task = snapshot.tasks[input.laneId];\n\t\tif (!task) throw new DurableTaskRuntimeError(`Failed to create task '${input.laneId}'.`);\n\t\tconst existing = [...task.attemptIds]\n\t\t\t.reverse()\n\t\t\t.map((attemptId) => snapshot.attempts[attemptId])\n\t\t\t.find((attempt): attempt is AttemptRuntimeState => attempt !== undefined && activeAttempt(attempt));\n\t\tif (existing) return existing;\n\n\t\treturn this.runtime.queueAttempt(input.laneId, {\n\t\t\ttaskId: input.laneId,\n\t\t\tprofileId: input.profileId,\n\t\t\tinstructions: input.instructions,\n\t\t\tresourcePointerIds: input.taskContext?.resourcePointerIds ?? [],\n\t\t\t...(input.parentAgentId ? { parentAgentId: input.parentAgentId } : {}),\n\t\t\trequirementIds: input.taskContext?.requirementIds ?? [],\n\t\t\t...(input.executionContract ? { executionContract: input.executionContract } : {}),\n\t\t\t...input.dispatchMetadata,\n\t\t});\n\t}\n\n\tsynchronizeGoalState(goal: GoalState): void {\n\t\tconst objective = projectGoalObjective(goal);\n\t\tthis.runtime.ensureObjective(objective);\n\t\tfor (const evidence of projectGoalAcceptanceEvidence(goal)) {\n\t\t\tthis.runtime.recordObjectiveEvidence(objective.objectiveId, evidence);\n\t\t}\n\t\tconst status = this.runtime.getSnapshot().objectives[goalObjectiveId(goal.goalId)]?.objective.status;\n\t\tswitch (goal.status) {\n\t\t\tcase \"active\":\n\t\t\t\tif (status === \"paused\") this.runtime.resumeObjective(objective.objectiveId);\n\t\t\t\tbreak;\n\t\t\tcase \"paused\":\n\t\t\tcase \"blocked\":\n\t\t\tcase \"usage_limited\":\n\t\t\tcase \"budget_limited\":\n\t\t\t\tif (status === \"active\") this.runtime.pauseObjective(objective.objectiveId);\n\t\t\t\tbreak;\n\t\t\tcase \"cancelled\":\n\t\t\t\tif (status !== \"cancelled\") this.runtime.cancelObjective(objective.objectiveId);\n\t\t\t\tbreak;\n\t\t\tcase \"completed\":\n\t\t\t\tif (status !== \"completed\") {\n\t\t\t\t\tthis.runtime.completeObjectiveFromOwner(objective.objectiveId, hasGoalAcceptanceOverride(goal));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tstart(\n\t\tattemptId: string,\n\t\tleaseTtlMs: number,\n\t\townerId = `in-process:${this.sessionId}`,\n\t\tagentId?: string,\n\t): StartedDelegationAttempt {\n\t\tconst snapshot = this.runtime.getSnapshot();\n\t\tconst attempt = snapshot.attempts[attemptId];\n\t\tif (!attempt) throw new DurableTaskRuntimeError(`Unknown attempt '${attemptId}'.`);\n\t\tconst task = snapshot.tasks[attempt.taskId];\n\t\tif (!task) throw new DurableTaskRuntimeError(`Unknown task '${attempt.taskId}'.`);\n\t\tconst lease = this.runtime.leaseAttempt(attemptId, ownerId, leaseTtlMs, agentId);\n\t\tthis.runtime.startAttempt(attemptId, lease.leaseId, lease.fencingToken);\n\t\treturn {\n\t\t\tobjectiveId: task.task.objectiveId,\n\t\t\ttaskId: task.task.taskId,\n\t\t\tattemptId,\n\t\t\tleaseId: lease.leaseId,\n\t\t\tfencingToken: lease.fencingToken,\n\t\t\texpiresAt: lease.expiresAt,\n\t\t};\n\t}\n\n\tcancel(attemptId: string, reasonCode: string): void {\n\t\tthis.runtime.cancelAttempt(attemptId, reasonCode);\n\t}\n\n\t/** Latest fenced cumulative usage, if this attempt has crossed a durable checkpoint boundary. */\n\tgetAttemptUsage(attemptId: string): AttemptUsageSnapshot | undefined {\n\t\tconst snapshot = this.runtime.getSnapshot();\n\t\tconst attempt = snapshot.attempts[attemptId];\n\t\tif (!attempt) throw new DurableTaskRuntimeError(`Unknown attempt '${attemptId}'.`);\n\t\tfor (const checkpointId of [...attempt.checkpointIds].reverse()) {\n\t\t\tconst usage = snapshot.checkpoints[checkpointId]?.usage;\n\t\t\tif (usage) return structuredClone(usage);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/** Fence interrupted isolated completions and queue one replacement attempt per task. */\n\trecoverQueuedDispatches(): AttemptRuntimeState[] {\n\t\tthis.runtime.recoverInterruptedUnboundAttempts((attempt) => attempt.dispatch.executionKind !== \"managed-process\");\n\t\tlet snapshot = this.runtime.getSnapshot();\n\t\tfor (const task of Object.values(snapshot.tasks)) {\n\t\t\tconst attempts = task.attemptIds.map((attemptId) => snapshot.attempts[attemptId]).filter(Boolean);\n\t\t\tif (attempts.some((attempt) => attempt && activeAttempt(attempt))) continue;\n\t\t\tconst interrupted = [...attempts].reverse().find((attempt) => attempt?.status === \"expired\");\n\t\t\tif (!interrupted || task.task.status !== \"ready\") continue;\n\t\t\tconst maxAttempts = task.task.riskBudget.maxAttempts;\n\t\t\tif (maxAttempts !== undefined && task.attemptIds.length >= maxAttempts) {\n\t\t\t\tthis.runtime.failTask(task.task.taskId, \"attempt_budget_exhausted\");\n\t\t\t\tsnapshot = this.runtime.getSnapshot();\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.runtime.queueAttempt(task.task.taskId, interrupted.dispatch);\n\t\t\tsnapshot = this.runtime.getSnapshot();\n\t\t}\n\t\treturn Object.values(snapshot.attempts).filter(\n\t\t\t(attempt) => attempt.status === \"queued\" && attempt.dispatch.executionKind !== \"managed-process\",\n\t\t);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"delegation-ledger.js","sourceRoot":"","sources":["../../../src/core/orchestration/delegation-ledger.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport type { WorkerDelegationTaskContext } from \"../delegation/worker-delegation-request.ts\";\nimport { deriveWorkerTaskLabel } from \"../delegation/worker-task-label.ts\";\nimport { hasGoalAcceptanceOverride } from \"../goals/goal-acceptance.ts\";\nimport type { GoalState } from \"../goals/goal-state.ts\";\nimport { latestAgentAttemptByDurableOrder } from \"./attempt-ordering.ts\";\nimport type {\n\tAttemptUsageSnapshot,\n\tHarnessCapability,\n\tOrchestrationDispatchRequest,\n\tRiskBudget,\n\tWorkerExecutionContract,\n\tWorkerRole,\n} from \"./contracts.ts\";\nimport { MAX_ORCHESTRATION_IDENTIFIER_LENGTH } from \"./contracts.ts\";\nimport { OrchestrationEventStore } from \"./event-store.ts\";\nimport {\n\ttype AttemptRuntimeState,\n\tDurableTaskRuntime,\n\tDurableTaskRuntimeError,\n\tvalidateTaskDependencyIds,\n} from \"./task-runtime.ts\";\nimport { goalObjectiveId, projectGoalAcceptanceEvidence, projectGoalObjective } from \"./work-state-projection.ts\";\nimport {\n\tnormalizeWorkerContextForkReference,\n\ttype WorkerContextForkReference,\n} from \"./worker-context-fork-reference.ts\";\n\nexport interface DelegationLedgerOptions {\n\tagentDir: string;\n\tsessionId: string;\n\tnow?: () => number;\n\tstore?: OrchestrationEventStore;\n}\n\nexport interface PrepareDelegationInput {\n\tlaneId: string;\n\tinstructions: string;\n\tparentAgentId?: string;\n\texecutionContract: WorkerExecutionContract;\n\trequiredCapabilities: readonly HarnessCapability[];\n\tgoal?: GoalState;\n\tverificationOfTaskId?: string;\n\ttaskContext?: WorkerDelegationTaskContext;\n\tbirthContextForkReference?: WorkerContextForkReference;\n}\n\nexport interface PrepareManagedDelegationInput {\n\tlaneId: string;\n\tdispatchSequence: number;\n\tinstructions: string;\n\tprofileId: string;\n\tprovider: string;\n\tauthorizationId: string;\n\trole: WorkerRole;\n\triskBudget: RiskBudget;\n\tgoal?: GoalState;\n\tgoalId?: string;\n\tworktreeLaneKey?: string;\n}\n\nexport interface StartedDelegationAttempt {\n\tobjectiveId: string;\n\ttaskId: string;\n\tattemptId: string;\n\tleaseId: string;\n\tfencingToken: number;\n\texpiresAt: string;\n}\n\nexport interface PrepareAgentTurnInput {\n\tagentId: string;\n\tinstructions: string;\n\tcontrolMessageId?: string;\n\tdependsOnTaskIds?: readonly string[];\n}\n\nfunction activeAttempt(attempt: AttemptRuntimeState): boolean {\n\treturn attempt.status === \"queued\" || attempt.status === \"leased\" || attempt.status === \"running\";\n}\n\nfunction mailboxTurnTaskId(agentId: string, controlMessageId: string): string {\n\treturn `mailbox-turn-${createHash(\"sha256\")\n\t\t.update(\"pi-worker-agent-mailbox-turn-v1\")\n\t\t.update(\"\\0\")\n\t\t.update(agentId)\n\t\t.update(\"\\0\")\n\t\t.update(controlMessageId)\n\t\t.digest(\"hex\")}`;\n}\n\n/**\n * Durable adapter for in-process delegated completions. It records the dispatch before execution,\n * fences interrupted completions on restart, and returns queued work for event-driven re-dispatch.\n * It deliberately does not pretend an isolated completion has a resumable model transcript.\n */\nexport class DelegationOrchestrationLedger {\n\treadonly runtime: DurableTaskRuntime;\n\tprivate readonly sessionId: string;\n\n\tconstructor(options: DelegationLedgerOptions) {\n\t\tthis.sessionId = options.sessionId;\n\t\tthis.runtime = new DurableTaskRuntime({\n\t\t\tstore:\n\t\t\t\toptions.store ?? new OrchestrationEventStore({ agentDir: options.agentDir, sessionId: options.sessionId }),\n\t\t\tnow: options.now,\n\t\t});\n\t}\n\n\tprepare(input: PrepareDelegationInput): AttemptRuntimeState {\n\t\tconst profile = input.executionContract.worker.profile;\n\t\treturn this.prepareNormalized({\n\t\t\tlaneId: input.laneId,\n\t\t\tinstructions: input.instructions,\n\t\t\tprofileId: profile.profileId,\n\t\t\trole: profile.role,\n\t\t\trequiredCapabilities: input.requiredCapabilities,\n\t\t\triskBudget: profile.budget,\n\t\t\t...(input.parentAgentId ? { parentAgentId: input.parentAgentId } : {}),\n\t\t\texecutionContract: input.executionContract,\n\t\t\t...(input.goal ? { goal: input.goal } : {}),\n\t\t\t...(input.verificationOfTaskId ? { verificationOfTaskId: input.verificationOfTaskId } : {}),\n\t\t\t...(input.taskContext ? { taskContext: input.taskContext } : {}),\n\t\t\tdispatchMetadata: {\n\t\t\t\tlogicalLaneId: input.laneId,\n\t\t\t\t...(input.birthContextForkReference ? { birthContextForkReference: input.birthContextForkReference } : {}),\n\t\t\t},\n\t\t});\n\t}\n\n\tprepareManaged(input: PrepareManagedDelegationInput): AttemptRuntimeState {\n\t\tif (!Number.isSafeInteger(input.dispatchSequence) || input.dispatchSequence < 1) {\n\t\t\tthrow new DurableTaskRuntimeError(\"Managed dispatch sequence must be a positive integer.\");\n\t\t}\n\t\tconst taskId = `${input.laneId}:turn:${input.dispatchSequence}`;\n\t\treturn this.prepareNormalized({\n\t\t\tlaneId: taskId,\n\t\t\tinstructions: input.instructions,\n\t\t\tprofileId: input.profileId,\n\t\t\trole: input.role,\n\t\t\trequiredCapabilities: [],\n\t\t\triskBudget: input.riskBudget,\n\t\t\t...(input.goal ? { goal: input.goal } : {}),\n\t\t\t...(input.goalId ? { goalId: input.goalId } : {}),\n\t\t\tdispatchMetadata: {\n\t\t\t\texecutionKind: \"managed-process\",\n\t\t\t\tlogicalLaneId: input.laneId,\n\t\t\t\tdispatchSequence: input.dispatchSequence,\n\t\t\t\tprovider: input.provider,\n\t\t\t\tauthorizationId: input.authorizationId,\n\t\t\t\t...(input.worktreeLaneKey ? { worktreeLaneKey: input.worktreeLaneKey } : {}),\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * Queue one new turn for an existing logical agent. The agent identity and its immutable\n\t * execution contract are inherited from the last bound turn. Each distinct control message owns\n\t * one deterministic task/attempt identity; exact retries adopt it instead of minting new work.\n\t */\n\tprepareAgentTurn(input: PrepareAgentTurnInput): AttemptRuntimeState {\n\t\tconst agentId = input.agentId.trim();\n\t\tconst instructions = input.instructions.trim();\n\t\tconst controlMessageId = input.controlMessageId?.trim();\n\t\tif (!agentId) throw new DurableTaskRuntimeError(\"Logical worker agent id is required.\");\n\t\tif (!instructions) throw new DurableTaskRuntimeError(\"Worker follow-up instructions are required.\");\n\t\tif (\n\t\t\tinput.controlMessageId !== undefined &&\n\t\t\t(!controlMessageId || controlMessageId.length > MAX_ORCHESTRATION_IDENTIFIER_LENGTH)\n\t\t) {\n\t\t\tthrow new DurableTaskRuntimeError(\"Worker control message id is invalid.\");\n\t\t}\n\t\tconst snapshot = this.runtime.getSnapshot();\n\t\tconst agent = snapshot.agents[agentId];\n\t\tif (!agent) throw new DurableTaskRuntimeError(`Unknown logical worker agent '${agentId}'.`);\n\t\tconst agentAttempts = Object.values(snapshot.attempts).filter(\n\t\t\t(attempt) => attempt.agentId === agentId || attempt.dispatch.logicalLaneId === agentId,\n\t\t);\n\t\tconst sequence = agentAttempts.length + 1;\n\t\tconst taskId = controlMessageId ? mailboxTurnTaskId(agentId, controlMessageId) : `${agentId}:turn:${sequence}`;\n\t\tconst existingTask = snapshot.tasks[taskId]?.task;\n\t\tconst prior = latestAgentAttemptByDurableOrder(snapshot, agent.agentId);\n\t\tconst contract = prior?.dispatch.executionContract;\n\t\tif (!prior || !contract) {\n\t\t\tthrow new DurableTaskRuntimeError(`Logical worker agent '${agentId}' has no immutable execution contract.`);\n\t\t}\n\t\tconst priorTask = snapshot.tasks[prior.taskId]?.task;\n\t\tif (!priorTask) throw new DurableTaskRuntimeError(`Logical worker agent '${agentId}' has no prior durable task.`);\n\t\tconst dependencyTaskIds = validateTaskDependencyIds(\n\t\t\tsnapshot.tasks,\n\t\t\texistingTask?.objectiveId ?? priorTask.objectiveId,\n\t\t\tinput.dependsOnTaskIds,\n\t\t);\n\t\tif (existingTask && controlMessageId) {\n\t\t\tif (\n\t\t\t\texistingTask.description !== instructions ||\n\t\t\t\texistingTask.role !== agent.role ||\n\t\t\t\texistingTask.dependsOn.length !== dependencyTaskIds.length ||\n\t\t\t\texistingTask.dependsOn.some((dependencyId, index) => dependencyId !== dependencyTaskIds[index])\n\t\t\t) {\n\t\t\t\tthrow new DurableTaskRuntimeError(\n\t\t\t\t\t`Worker control message '${controlMessageId}' has conflicting task identity.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst existingAttempts = (snapshot.tasks[taskId]?.attemptIds ?? []).map(\n\t\t\t\t(attemptId) => snapshot.attempts[attemptId],\n\t\t\t);\n\t\t\tfor (const attempt of existingAttempts) {\n\t\t\t\tif (\n\t\t\t\t\t!attempt ||\n\t\t\t\t\tattempt.dispatch.logicalLaneId !== agentId ||\n\t\t\t\t\tattempt.dispatch.controlMessageId !== controlMessageId ||\n\t\t\t\t\tattempt.dispatch.instructions !== instructions\n\t\t\t\t) {\n\t\t\t\t\tthrow new DurableTaskRuntimeError(\n\t\t\t\t\t\t`Worker control message '${controlMessageId}' has conflicting dispatch evidence.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst existingAttempt = existingAttempts.at(-1);\n\t\t\tif (existingAttempt) return existingAttempt;\n\t\t}\n\t\tif (agent.status !== \"registered\") {\n\t\t\tthrow new DurableTaskRuntimeError(`Logical worker agent '${agentId}' is not idle.`);\n\t\t}\n\t\tif (existingTask && !controlMessageId) {\n\t\t\tthrow new DurableTaskRuntimeError(`Logical worker agent '${agentId}' already has turn ${sequence}.`);\n\t\t}\n\t\treturn this.prepareNormalized({\n\t\t\tlaneId: taskId,\n\t\t\tinstructions,\n\t\t\tprofileId: contract.worker.profile.profileId,\n\t\t\trole: agent.role,\n\t\t\trequiredCapabilities: contract.worker.authority.capabilities,\n\t\t\triskBudget: contract.worker.profile.budget,\n\t\t\t...(priorTask.objectiveId.startsWith(\"goal:\") ? { goalId: priorTask.objectiveId.slice(\"goal:\".length) } : {}),\n\t\t\ttaskContext: {\n\t\t\t\trequirementIds: prior.dispatch.requirementIds ?? [],\n\t\t\t\tdependsOnTaskIds: dependencyTaskIds,\n\t\t\t\tacceptanceCriterionIds: priorTask.acceptanceCriterionIds,\n\t\t\t\tresourcePointerIds: prior.dispatch.resourcePointerIds,\n\t\t\t},\n\t\t\texecutionContract: contract,\n\t\t\tdispatchMetadata: {\n\t\t\t\tlogicalLaneId: agentId,\n\t\t\t\tdispatchSequence: sequence,\n\t\t\t\t...(controlMessageId ? { controlMessageId } : {}),\n\t\t\t\t...(prior.dispatch.birthContextForkReference\n\t\t\t\t\t? { birthContextForkReference: prior.dispatch.birthContextForkReference }\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t});\n\t}\n\n\tprivate prepareNormalized(input: {\n\t\tlaneId: string;\n\t\tinstructions: string;\n\t\tprofileId: string;\n\t\trole: WorkerRole;\n\t\trequiredCapabilities: readonly HarnessCapability[];\n\t\triskBudget: RiskBudget;\n\t\tparentAgentId?: string;\n\t\tgoal?: GoalState;\n\t\tgoalId?: string;\n\t\tverificationOfTaskId?: string;\n\t\ttaskContext?: WorkerDelegationTaskContext;\n\t\texecutionContract?: WorkerExecutionContract;\n\t\tdispatchMetadata?: Pick<\n\t\t\tOrchestrationDispatchRequest,\n\t\t\t| \"executionKind\"\n\t\t\t| \"logicalLaneId\"\n\t\t\t| \"dispatchSequence\"\n\t\t\t| \"controlMessageId\"\n\t\t\t| \"provider\"\n\t\t\t| \"authorizationId\"\n\t\t\t| \"worktreeLaneKey\"\n\t\t\t| \"birthContextForkReference\"\n\t\t>;\n\t}): AttemptRuntimeState {\n\t\tlet birthContextForkReference: WorkerContextForkReference | undefined;\n\t\ttry {\n\t\t\tbirthContextForkReference =\n\t\t\t\tinput.dispatchMetadata?.birthContextForkReference === undefined\n\t\t\t\t\t? undefined\n\t\t\t\t\t: normalizeWorkerContextForkReference(input.dispatchMetadata.birthContextForkReference);\n\t\t} catch (error) {\n\t\t\tthrow new DurableTaskRuntimeError(error instanceof Error ? error.message : String(error));\n\t\t}\n\t\tlet snapshot = this.runtime.getSnapshot();\n\t\tconst existingVerificationSubject = input.verificationOfTaskId\n\t\t\t? snapshot.tasks[input.verificationOfTaskId]\n\t\t\t: undefined;\n\t\tif (input.verificationOfTaskId && !existingVerificationSubject) {\n\t\t\tthrow new DurableTaskRuntimeError(`Unknown verification subject '${input.verificationOfTaskId}'.`);\n\t\t}\n\t\tconst projectedGoal = input.goal ? projectGoalObjective(input.goal) : undefined;\n\t\tconst objectiveId =\n\t\t\texistingVerificationSubject?.task.objectiveId ??\n\t\t\tprojectedGoal?.objectiveId ??\n\t\t\t(input.goalId ? goalObjectiveId(input.goalId) : `session:${this.sessionId}`);\n\t\tconst dependencyTaskIds = validateTaskDependencyIds(\n\t\t\tsnapshot.tasks,\n\t\t\tobjectiveId,\n\t\t\tinput.taskContext?.dependsOnTaskIds,\n\t\t);\n\t\tconst existingTask = snapshot.tasks[input.laneId]?.task;\n\t\tif (\n\t\t\texistingTask &&\n\t\t\t(existingTask.objectiveId !== objectiveId ||\n\t\t\t\texistingTask.description !== input.instructions ||\n\t\t\t\texistingTask.role !== input.role ||\n\t\t\t\texistingTask.dependsOn.length !== dependencyTaskIds.length ||\n\t\t\t\texistingTask.dependsOn.some((dependencyId, index) => dependencyId !== dependencyTaskIds[index]))\n\t\t) {\n\t\t\tthrow new DurableTaskRuntimeError(`Task '${input.laneId}' has conflicting durable dispatch identity.`);\n\t\t}\n\t\tconst taskStateBeforeWrites = snapshot.tasks[input.laneId];\n\t\tconst activeAttemptBeforeWrites = taskStateBeforeWrites?.attemptIds\n\t\t\t.map((attemptId) => snapshot.attempts[attemptId])\n\t\t\t.find((attempt): attempt is AttemptRuntimeState => attempt !== undefined && activeAttempt(attempt));\n\t\tfor (const attemptId of taskStateBeforeWrites?.attemptIds ?? []) {\n\t\t\tconst durableReference = snapshot.attempts[attemptId]?.dispatch.birthContextForkReference;\n\t\t\tif (!isDeepStrictEqual(durableReference, birthContextForkReference)) {\n\t\t\t\tthrow new DurableTaskRuntimeError(`Task '${input.laneId}' has a conflicting birth context fork reference.`);\n\t\t\t}\n\t\t}\n\t\tconst projectedEvidence =\n\t\t\tinput.goal && objectiveId === projectedGoal?.objectiveId ? projectGoalAcceptanceEvidence(input.goal) : [];\n\t\tif (projectedGoal) this.runtime.assertObjectiveSynchronizationHeadroom(projectedGoal, projectedEvidence);\n\t\tthis.runtime.assertProjectionHeadroom({\n\t\t\tobjectives: snapshot.objectives[objectiveId] ? 0 : 1,\n\t\t\ttasks: taskStateBeforeWrites ? 0 : 1,\n\t\t\tattempts: activeAttemptBeforeWrites ? 0 : 1,\n\t\t});\n\t\tif (input.goal && objectiveId === projectedGoal?.objectiveId) {\n\t\t\tthis.synchronizeGoalState(input.goal);\n\t\t\tsnapshot = this.runtime.getSnapshot();\n\t\t} else if (!snapshot.objectives[objectiveId]) {\n\t\t\tthis.runtime.createObjective({\n\t\t\t\tobjectiveId,\n\t\t\t\ttitle: input.goalId ? `Goal ${input.goalId}` : `Session ${this.sessionId}`,\n\t\t\t\tdescription: input.goalId ? \"Externally managed goal work\" : \"Session-scoped delegated work\",\n\t\t\t});\n\t\t\tsnapshot = this.runtime.getSnapshot();\n\t\t}\n\n\t\tconst verificationSubject = input.verificationOfTaskId ? snapshot.tasks[input.verificationOfTaskId] : undefined;\n\t\tconst taskInput = {\n\t\t\ttaskId: input.laneId,\n\t\t\tobjectiveId,\n\t\t\ttitle: deriveWorkerTaskLabel(input.instructions, `Delegated ${input.role} work`),\n\t\t\tdescription: input.instructions,\n\t\t\trole: input.role,\n\t\t\tdependsOn: dependencyTaskIds,\n\t\t\trequiredCapabilities: input.requiredCapabilities,\n\t\t\tacceptanceCriterionIds: input.taskContext?.acceptanceCriterionIds ?? [],\n\t\t\triskBudget: input.riskBudget,\n\t\t\t...(input.verificationOfTaskId\n\t\t\t\t? {\n\t\t\t\t\t\tverificationOfTaskId: input.verificationOfTaskId,\n\t\t\t\t\t\tacceptanceCriterionIds: verificationSubject?.task.acceptanceCriterionIds ?? [],\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t} as const;\n\t\tconst dispatch = {\n\t\t\ttaskId: input.laneId,\n\t\t\tprofileId: input.profileId,\n\t\t\tinstructions: input.instructions,\n\t\t\tresourcePointerIds: input.taskContext?.resourcePointerIds ?? [],\n\t\t\t...(input.parentAgentId ? { parentAgentId: input.parentAgentId } : {}),\n\t\t\trequirementIds: input.taskContext?.requirementIds ?? [],\n\t\t\t...(input.executionContract ? { executionContract: input.executionContract } : {}),\n\t\t\t...input.dispatchMetadata,\n\t\t\t...(birthContextForkReference ? { birthContextForkReference } : {}),\n\t\t} as const;\n\t\tif (\n\t\t\texistingTask &&\n\t\t\t(existingTask.title !== taskInput.title ||\n\t\t\t\texistingTask.verificationOfTaskId !== taskInput.verificationOfTaskId ||\n\t\t\t\t!isDeepStrictEqual(existingTask.requiredCapabilities, [...new Set(taskInput.requiredCapabilities)]) ||\n\t\t\t\t!isDeepStrictEqual(existingTask.acceptanceCriterionIds, [...new Set(taskInput.acceptanceCriterionIds)]) ||\n\t\t\t\t!isDeepStrictEqual(existingTask.riskBudget, taskInput.riskBudget))\n\t\t) {\n\t\t\tthrow new DurableTaskRuntimeError(`Task '${input.laneId}' has conflicting durable task identity.`);\n\t\t}\n\t\tif (activeAttemptBeforeWrites && !isDeepStrictEqual(activeAttemptBeforeWrites.dispatch, dispatch)) {\n\t\t\tthrow new DurableTaskRuntimeError(`Task '${input.laneId}' has conflicting durable dispatch identity.`);\n\t\t}\n\t\tif (!snapshot.tasks[input.laneId]) {\n\t\t\treturn this.runtime.prepareTaskAttempt(\n\t\t\t\t{\n\t\t\t\t\t...taskInput,\n\t\t\t\t},\n\t\t\t\tdispatch,\n\t\t\t).attempt;\n\t\t}\n\n\t\tconst task = snapshot.tasks[input.laneId];\n\t\tif (!task) throw new DurableTaskRuntimeError(`Failed to create task '${input.laneId}'.`);\n\t\tif (activeAttemptBeforeWrites) return activeAttemptBeforeWrites;\n\n\t\treturn this.runtime.queueAttempt(input.laneId, dispatch);\n\t}\n\n\tsynchronizeGoalState(goal: GoalState): void {\n\t\tconst objective = projectGoalObjective(goal);\n\t\tconst evidence = projectGoalAcceptanceEvidence(goal);\n\t\tthis.runtime.assertObjectiveSynchronizationHeadroom(objective, evidence);\n\t\tthis.runtime.ensureObjective(objective);\n\t\tfor (const item of evidence) {\n\t\t\tthis.runtime.recordObjectiveEvidence(objective.objectiveId, item);\n\t\t}\n\t\tconst status = this.runtime.getSnapshot().objectives[goalObjectiveId(goal.goalId)]?.objective.status;\n\t\tswitch (goal.status) {\n\t\t\tcase \"active\":\n\t\t\t\tif (status === \"paused\") this.runtime.resumeObjective(objective.objectiveId);\n\t\t\t\tbreak;\n\t\t\tcase \"paused\":\n\t\t\tcase \"blocked\":\n\t\t\tcase \"usage_limited\":\n\t\t\tcase \"budget_limited\":\n\t\t\t\tif (status === \"active\") this.runtime.pauseObjective(objective.objectiveId);\n\t\t\t\tbreak;\n\t\t\tcase \"cancelled\":\n\t\t\t\tif (status !== \"cancelled\") this.runtime.cancelObjective(objective.objectiveId);\n\t\t\t\tbreak;\n\t\t\tcase \"completed\":\n\t\t\t\tif (status !== \"completed\") {\n\t\t\t\t\tthis.runtime.completeObjectiveFromOwner(objective.objectiveId, hasGoalAcceptanceOverride(goal));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tstart(\n\t\tattemptId: string,\n\t\tleaseTtlMs: number,\n\t\townerId = `in-process:${this.sessionId}`,\n\t\tagentId?: string,\n\t): StartedDelegationAttempt {\n\t\tconst snapshot = this.runtime.getSnapshot();\n\t\tconst attempt = snapshot.attempts[attemptId];\n\t\tif (!attempt) throw new DurableTaskRuntimeError(`Unknown attempt '${attemptId}'.`);\n\t\tconst task = snapshot.tasks[attempt.taskId];\n\t\tif (!task) throw new DurableTaskRuntimeError(`Unknown task '${attempt.taskId}'.`);\n\t\tconst lease = this.runtime.leaseAttempt(attemptId, ownerId, leaseTtlMs, agentId);\n\t\tthis.runtime.startAttempt(attemptId, lease.leaseId, lease.fencingToken);\n\t\treturn {\n\t\t\tobjectiveId: task.task.objectiveId,\n\t\t\ttaskId: task.task.taskId,\n\t\t\tattemptId,\n\t\t\tleaseId: lease.leaseId,\n\t\t\tfencingToken: lease.fencingToken,\n\t\t\texpiresAt: lease.expiresAt,\n\t\t};\n\t}\n\n\tcancel(attemptId: string, reasonCode: string): void {\n\t\tthis.runtime.cancelAttempt(attemptId, reasonCode);\n\t}\n\n\t/** Latest fenced cumulative usage, if this attempt has crossed a durable checkpoint boundary. */\n\tgetAttemptUsage(attemptId: string): AttemptUsageSnapshot | undefined {\n\t\tconst snapshot = this.runtime.getSnapshot();\n\t\tconst attempt = snapshot.attempts[attemptId];\n\t\tif (!attempt) throw new DurableTaskRuntimeError(`Unknown attempt '${attemptId}'.`);\n\t\tfor (const checkpointId of [...attempt.checkpointIds].reverse()) {\n\t\t\tconst usage = snapshot.checkpoints[checkpointId]?.usage;\n\t\t\tif (usage) return structuredClone(usage);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/** Fence interrupted isolated completions and queue one replacement attempt per task. */\n\trecoverQueuedDispatches(): AttemptRuntimeState[] {\n\t\tthis.runtime.recoverInterruptedUnboundAttempts((attempt) => attempt.dispatch.executionKind !== \"managed-process\");\n\t\tlet snapshot = this.runtime.getSnapshot();\n\t\tfor (const task of Object.values(snapshot.tasks)) {\n\t\t\tconst attempts = task.attemptIds.map((attemptId) => snapshot.attempts[attemptId]).filter(Boolean);\n\t\t\tif (attempts.some((attempt) => attempt && activeAttempt(attempt))) continue;\n\t\t\tconst interrupted = [...attempts].reverse().find((attempt) => attempt?.status === \"expired\");\n\t\t\tif (!interrupted || task.task.status !== \"ready\") continue;\n\t\t\tconst maxAttempts = task.task.riskBudget.maxAttempts;\n\t\t\tif (maxAttempts !== undefined && task.attemptIds.length >= maxAttempts) {\n\t\t\t\tthis.runtime.failTask(task.task.taskId, \"attempt_budget_exhausted\");\n\t\t\t\tsnapshot = this.runtime.getSnapshot();\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.runtime.queueAttempt(task.task.taskId, interrupted.dispatch);\n\t\t\tsnapshot = this.runtime.getSnapshot();\n\t\t}\n\t\treturn Object.values(snapshot.attempts).filter(\n\t\t\t(attempt) => attempt.status === \"queued\" && attempt.dispatch.executionKind !== \"managed-process\",\n\t\t);\n\t}\n}\n"]}
|
|
@@ -9,6 +9,11 @@ export interface OrchestrationEventStoreOptions {
|
|
|
9
9
|
maxTailBytes?: number;
|
|
10
10
|
maxIdempotencyEvents?: number;
|
|
11
11
|
}
|
|
12
|
+
export interface AppendOrchestrationEventOptions {
|
|
13
|
+
expectedLastOrdinal?: number;
|
|
14
|
+
/** Exact event admission under the append lock, before any durable file is written. */
|
|
15
|
+
validateBeforeCommit?: (event: OrchestrationEvent) => void;
|
|
16
|
+
}
|
|
12
17
|
export declare class OrchestrationEventStoreError extends Error {
|
|
13
18
|
constructor(message: string);
|
|
14
19
|
}
|
|
@@ -44,9 +49,7 @@ export declare class OrchestrationEventStore {
|
|
|
44
49
|
private verifiedSnapshotBaseline;
|
|
45
50
|
private synchronizedIndexes;
|
|
46
51
|
constructor(options: OrchestrationEventStoreOptions);
|
|
47
|
-
append(input: AppendOrchestrationEventInput, options?:
|
|
48
|
-
expectedLastOrdinal?: number;
|
|
49
|
-
}): OrchestrationEvent;
|
|
52
|
+
append(input: AppendOrchestrationEventInput, options?: AppendOrchestrationEventOptions): OrchestrationEvent;
|
|
50
53
|
readAll(): OrchestrationEvent[];
|
|
51
54
|
readAfter(ordinal: number): OrchestrationEvent[];
|
|
52
55
|
readProjectionSnapshot(): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-store.d.ts","sourceRoot":"","sources":["../../../src/core/orchestration/event-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"event-store.d.ts","sourceRoot":"","sources":["../../../src/core/orchestration/event-store.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAG3D,OAAO,EACN,KAAK,6BAA6B,EAOlC,KAAK,kBAAkB,EAEvB,MAAM,gBAAgB,CAAC;AA+FxB,MAAM,WAAW,8BAA8B;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,+BAA+B;IAC/C,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,uFAAuF;IACvF,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAC3D;AAED,qBAAa,4BAA6B,SAAQ,KAAK;IACtD,YAAY,OAAO,EAAE,MAAM,EAG1B;CACD;AAED,qBAAa,6BAA8B,SAAQ,4BAA4B;IAC9E,YAAY,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAG3C;CACD;AAED,qBAAa,kCAAmC,SAAQ,4BAA4B;IACnF,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC,YAAY,cAAc,EAAE,MAAM,EAIjC;CACD;AAkOD;;;;;;;;GAQG;AACH,qBAAa,uBAAuB;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkD;IAC5E,OAAO,CAAC,wBAAwB,CAAuC;IACvE,OAAO,CAAC,mBAAmB,CAAkC;IAE7D,YAAY,OAAO,EAAE,8BAA8B,EA2BlD;IAED,MAAM,CAAC,KAAK,EAAE,6BAA6B,EAAE,OAAO,GAAE,+BAAoC,GAAG,kBAAkB,CAyE9G;IAED,OAAO,IAAI,kBAAkB,EAAE,CAE9B;IAED,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAsB/C;IAED,sBAAsB,IAAI;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,UAAU,CAAA;KAAE,GAAG,SAAS,CAKvF;IAED,iGAAiG;IACjG,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,UAAU,GAAG,OAAO,CA+F7E;IAED,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,GAAG,MAAM,IAAI,CAGnE;IAED,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,sBAAsB;IAe9B,OAAO,CAAC,4BAA4B;IAapC,OAAO,CAAC,yBAAyB;IAejC,kFAAkF;IAClF,OAAO,CAAC,oCAAoC;IAe5C,oGAAoG;IACpG,OAAO,CAAC,0BAA0B;IAYlC,OAAO,CAAC,oBAAoB;IAqC5B,OAAO,CAAC,8BAA8B;IA6DtC;;;;OAIG;IACH,OAAO,CAAC,oCAAoC;IAuC5C,OAAO,CAAC,6BAA6B;IAcrC,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,qBAAqB;IAiB7B;;;;;OAKG;IACH,OAAO,CAAC,0BAA0B;CAuDlC"}
|