@calliopelabs/cli 3.5.4 → 3.7.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/README.md +8 -0
- package/dist/acp/controls.d.ts +10 -0
- package/dist/acp/controls.d.ts.map +1 -0
- package/dist/acp/controls.js +81 -0
- package/dist/acp/controls.js.map +1 -0
- package/dist/acp.d.ts +21 -7
- package/dist/acp.d.ts.map +1 -1
- package/dist/acp.js +139 -23
- package/dist/acp.js.map +1 -1
- package/dist/bin.d.ts.map +1 -1
- package/dist/bin.js +28 -8
- package/dist/bin.js.map +1 -1
- package/dist/build-identity.d.ts +27 -0
- package/dist/build-identity.d.ts.map +1 -0
- package/dist/build-identity.js +32 -0
- package/dist/build-identity.js.map +1 -0
- package/dist/build-metadata.json +1 -0
- package/dist/execution/authority.d.ts +4 -1
- package/dist/execution/authority.d.ts.map +1 -1
- package/dist/execution/authority.js +23 -7
- package/dist/execution/authority.js.map +1 -1
- package/dist/execution/child-grants.d.ts +2 -0
- package/dist/execution/child-grants.d.ts.map +1 -1
- package/dist/execution/child-grants.js +19 -4
- package/dist/execution/child-grants.js.map +1 -1
- package/dist/execution/delegated.d.ts +14 -0
- package/dist/execution/delegated.d.ts.map +1 -0
- package/dist/execution/delegated.js +66 -0
- package/dist/execution/delegated.js.map +1 -0
- package/dist/execution/files.js +6 -6
- package/dist/execution/files.js.map +1 -1
- package/dist/execution/guard.d.ts +5 -0
- package/dist/execution/guard.d.ts.map +1 -1
- package/dist/execution/guard.js +31 -16
- package/dist/execution/guard.js.map +1 -1
- package/dist/execution/index.d.ts +4 -0
- package/dist/execution/index.d.ts.map +1 -1
- package/dist/execution/index.js +4 -0
- package/dist/execution/index.js.map +1 -1
- package/dist/execution/ledger-cli.d.ts +2 -1
- package/dist/execution/ledger-cli.d.ts.map +1 -1
- package/dist/execution/ledger-cli.js +51 -14
- package/dist/execution/ledger-cli.js.map +1 -1
- package/dist/execution/ledger-protocol.d.ts +6 -2
- package/dist/execution/ledger-protocol.d.ts.map +1 -1
- package/dist/execution/ledger-protocol.js +110 -24
- package/dist/execution/ledger-protocol.js.map +1 -1
- package/dist/execution/ledger-server.d.ts +13 -0
- package/dist/execution/ledger-server.d.ts.map +1 -1
- package/dist/execution/ledger-server.js +57 -13
- package/dist/execution/ledger-server.js.map +1 -1
- package/dist/execution/ledger-tunnel.d.ts +50 -0
- package/dist/execution/ledger-tunnel.d.ts.map +1 -0
- package/dist/execution/ledger-tunnel.js +307 -0
- package/dist/execution/ledger-tunnel.js.map +1 -0
- package/dist/execution/ledger.d.ts +4 -0
- package/dist/execution/ledger.d.ts.map +1 -1
- package/dist/execution/ledger.js +30 -4
- package/dist/execution/ledger.js.map +1 -1
- package/dist/execution/parent-accounting.d.ts +41 -0
- package/dist/execution/parent-accounting.d.ts.map +1 -0
- package/dist/execution/parent-accounting.js +52 -0
- package/dist/execution/parent-accounting.js.map +1 -0
- package/dist/execution/parent-budget.d.ts +25 -0
- package/dist/execution/parent-budget.d.ts.map +1 -0
- package/dist/execution/parent-budget.js +102 -0
- package/dist/execution/parent-budget.js.map +1 -0
- package/dist/execution/project-spend.d.ts.map +1 -1
- package/dist/execution/project-spend.js +35 -5
- package/dist/execution/project-spend.js.map +1 -1
- package/dist/execution/remote-checkpoint.d.ts +15 -0
- package/dist/execution/remote-checkpoint.d.ts.map +1 -0
- package/dist/execution/remote-checkpoint.js +165 -0
- package/dist/execution/remote-checkpoint.js.map +1 -0
- package/dist/execution/remote-ledger.d.ts +12 -2
- package/dist/execution/remote-ledger.d.ts.map +1 -1
- package/dist/execution/remote-ledger.js +53 -21
- package/dist/execution/remote-ledger.js.map +1 -1
- package/dist/execution/types.d.ts +23 -5
- package/dist/execution/types.d.ts.map +1 -1
- package/dist/execution/types.js.map +1 -1
- package/dist/goals/supervised.js +2 -2
- package/dist/goals/supervised.js.map +1 -1
- package/dist/headless.d.ts +2 -6
- package/dist/headless.d.ts.map +1 -1
- package/dist/headless.js +17 -21
- package/dist/headless.js.map +1 -1
- package/dist/improvement/actions.d.ts +3 -4
- package/dist/improvement/actions.d.ts.map +1 -1
- package/dist/improvement/actions.js +10 -7
- package/dist/improvement/actions.js.map +1 -1
- package/dist/improvement/capabilities.d.ts +54 -0
- package/dist/improvement/capabilities.d.ts.map +1 -0
- package/dist/improvement/capabilities.js +44 -0
- package/dist/improvement/capabilities.js.map +1 -0
- package/dist/improvement/cli.d.ts +1 -1
- package/dist/improvement/cli.d.ts.map +1 -1
- package/dist/improvement/cli.js +29 -3
- package/dist/improvement/cli.js.map +1 -1
- package/dist/improvement/host-capabilities.d.ts +119 -0
- package/dist/improvement/host-capabilities.d.ts.map +1 -0
- package/dist/improvement/host-capabilities.js +18 -0
- package/dist/improvement/host-capabilities.js.map +1 -0
- package/dist/improvement/index.d.ts +6 -0
- package/dist/improvement/index.d.ts.map +1 -1
- package/dist/improvement/index.js +6 -0
- package/dist/improvement/index.js.map +1 -1
- package/dist/improvement/proposal-hash.d.ts +3 -0
- package/dist/improvement/proposal-hash.d.ts.map +1 -0
- package/dist/improvement/proposal-hash.js +5 -0
- package/dist/improvement/proposal-hash.js.map +1 -0
- package/dist/improvement/review-contract.d.ts +32 -0
- package/dist/improvement/review-contract.d.ts.map +1 -0
- package/dist/improvement/review-contract.js +62 -0
- package/dist/improvement/review-contract.js.map +1 -0
- package/dist/improvement/review-requests.d.ts +72 -0
- package/dist/improvement/review-requests.d.ts.map +1 -0
- package/dist/improvement/review-requests.js +63 -0
- package/dist/improvement/review-requests.js.map +1 -0
- package/dist/improvement/source-changes.d.ts +78 -0
- package/dist/improvement/source-changes.d.ts.map +1 -0
- package/dist/improvement/source-changes.js +91 -0
- package/dist/improvement/source-changes.js.map +1 -0
- package/dist/improvement/task-outcomes.d.ts +82 -0
- package/dist/improvement/task-outcomes.d.ts.map +1 -0
- package/dist/improvement/task-outcomes.js +72 -0
- package/dist/improvement/task-outcomes.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/isolation/contracts.d.ts +13 -0
- package/dist/isolation/contracts.d.ts.map +1 -1
- package/dist/isolation/contracts.js +9 -1
- package/dist/isolation/contracts.js.map +1 -1
- package/dist/isolation/coordinator.d.ts.map +1 -1
- package/dist/isolation/coordinator.js +4 -0
- package/dist/isolation/coordinator.js.map +1 -1
- package/dist/isolation/process.d.ts.map +1 -1
- package/dist/isolation/process.js +3 -1
- package/dist/isolation/process.js.map +1 -1
- package/dist/isolation/worktree.d.ts +9 -1
- package/dist/isolation/worktree.d.ts.map +1 -1
- package/dist/isolation/worktree.js +8 -3
- package/dist/isolation/worktree.js.map +1 -1
- package/dist/memory.d.ts +5 -3
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +8 -6
- package/dist/memory.js.map +1 -1
- package/dist/migration/assessment-contract.d.ts +60 -0
- package/dist/migration/assessment-contract.d.ts.map +1 -0
- package/dist/migration/assessment-contract.js +132 -0
- package/dist/migration/assessment-contract.js.map +1 -0
- package/dist/migration/assessment-schema.d.ts +19 -0
- package/dist/migration/assessment-schema.d.ts.map +1 -0
- package/dist/migration/assessment-schema.js +43 -0
- package/dist/migration/assessment-schema.js.map +1 -0
- package/dist/migration/assessment.d.ts +159 -0
- package/dist/migration/assessment.d.ts.map +1 -0
- package/dist/migration/assessment.js +219 -0
- package/dist/migration/assessment.js.map +1 -0
- package/dist/migration/cli.d.ts +6 -0
- package/dist/migration/cli.d.ts.map +1 -0
- package/dist/migration/cli.js +101 -0
- package/dist/migration/cli.js.map +1 -0
- package/dist/migration/evidence.d.ts +27 -0
- package/dist/migration/evidence.d.ts.map +1 -0
- package/dist/migration/evidence.js +124 -0
- package/dist/migration/evidence.js.map +1 -0
- package/dist/migration/example.d.ts +33 -0
- package/dist/migration/example.d.ts.map +1 -0
- package/dist/migration/example.js +28 -0
- package/dist/migration/example.js.map +1 -0
- package/dist/migration/index.d.ts +21 -0
- package/dist/migration/index.d.ts.map +1 -0
- package/dist/migration/index.js +15 -0
- package/dist/migration/index.js.map +1 -0
- package/dist/migration/inventory.d.ts +70 -0
- package/dist/migration/inventory.d.ts.map +1 -0
- package/dist/migration/inventory.js +233 -0
- package/dist/migration/inventory.js.map +1 -0
- package/dist/migration/schema.d.ts +61 -0
- package/dist/migration/schema.d.ts.map +1 -0
- package/dist/migration/schema.js +76 -0
- package/dist/migration/schema.js.map +1 -0
- package/dist/migration/verification.d.ts +146 -0
- package/dist/migration/verification.d.ts.map +1 -0
- package/dist/migration/verification.js +260 -0
- package/dist/migration/verification.js.map +1 -0
- package/dist/orchestration/actions.d.ts +2 -0
- package/dist/orchestration/actions.d.ts.map +1 -1
- package/dist/orchestration/actions.js.map +1 -1
- package/dist/orchestration/artifact-host.d.ts +46 -0
- package/dist/orchestration/artifact-host.d.ts.map +1 -0
- package/dist/orchestration/artifact-host.js +64 -0
- package/dist/orchestration/artifact-host.js.map +1 -0
- package/dist/orchestration/coordinator-actions.d.ts +1 -1
- package/dist/orchestration/coordinator-actions.d.ts.map +1 -1
- package/dist/orchestration/coordinator-actions.js +5 -3
- package/dist/orchestration/coordinator-actions.js.map +1 -1
- package/dist/orchestration/coordinator-types.d.ts +23 -2
- package/dist/orchestration/coordinator-types.d.ts.map +1 -1
- package/dist/orchestration/coordinator.d.ts +5 -0
- package/dist/orchestration/coordinator.d.ts.map +1 -1
- package/dist/orchestration/coordinator.js +30 -13
- package/dist/orchestration/coordinator.js.map +1 -1
- package/dist/orchestration/execution-cli.d.ts +1 -1
- package/dist/orchestration/execution-cli.d.ts.map +1 -1
- package/dist/orchestration/execution-cli.js +29 -6
- package/dist/orchestration/execution-cli.js.map +1 -1
- package/dist/orchestration/execution-journal.d.ts.map +1 -1
- package/dist/orchestration/execution-journal.js +79 -6
- package/dist/orchestration/execution-journal.js.map +1 -1
- package/dist/orchestration/execution-store.d.ts +5 -1
- package/dist/orchestration/execution-store.d.ts.map +1 -1
- package/dist/orchestration/execution-store.js +66 -5
- package/dist/orchestration/execution-store.js.map +1 -1
- package/dist/orchestration/execution.d.ts.map +1 -1
- package/dist/orchestration/execution.js +37 -10
- package/dist/orchestration/execution.js.map +1 -1
- package/dist/orchestration/index.d.ts +6 -0
- package/dist/orchestration/index.d.ts.map +1 -1
- package/dist/orchestration/index.js +6 -0
- package/dist/orchestration/index.js.map +1 -1
- package/dist/orchestration/interruption.d.ts +10 -0
- package/dist/orchestration/interruption.d.ts.map +1 -0
- package/dist/orchestration/interruption.js +38 -0
- package/dist/orchestration/interruption.js.map +1 -0
- package/dist/orchestration/question-contract.d.ts +19 -0
- package/dist/orchestration/question-contract.d.ts.map +1 -0
- package/dist/orchestration/question-contract.js +21 -0
- package/dist/orchestration/question-contract.js.map +1 -0
- package/dist/orchestration/questions.d.ts +9 -0
- package/dist/orchestration/questions.d.ts.map +1 -0
- package/dist/orchestration/questions.js +75 -0
- package/dist/orchestration/questions.js.map +1 -0
- package/dist/orchestration/reviewed-ledger.d.ts +23 -0
- package/dist/orchestration/reviewed-ledger.d.ts.map +1 -0
- package/dist/orchestration/reviewed-ledger.js +57 -0
- package/dist/orchestration/reviewed-ledger.js.map +1 -0
- package/dist/orchestration/routing.d.ts +3 -0
- package/dist/orchestration/routing.d.ts.map +1 -1
- package/dist/orchestration/routing.js +5 -1
- package/dist/orchestration/routing.js.map +1 -1
- package/dist/orchestration/source-candidates.d.ts +64 -0
- package/dist/orchestration/source-candidates.d.ts.map +1 -0
- package/dist/orchestration/source-candidates.js +95 -0
- package/dist/orchestration/source-candidates.js.map +1 -0
- package/dist/orchestration/validation.js +1 -1
- package/dist/orchestration/validation.js.map +1 -1
- package/dist/runlog.js +2 -2
- package/dist/runlog.js.map +1 -1
- package/dist/runtime/permissions.d.ts.map +1 -1
- package/dist/runtime/permissions.js +3 -2
- package/dist/runtime/permissions.js.map +1 -1
- package/dist/runtime/turn.d.ts +2 -0
- package/dist/runtime/turn.d.ts.map +1 -1
- package/dist/runtime/turn.js +21 -7
- package/dist/runtime/turn.js.map +1 -1
- package/dist/session-management/actions.js +1 -1
- package/dist/session-management/actions.js.map +1 -1
- package/dist/sessions/execution-binding.d.ts +8 -0
- package/dist/sessions/execution-binding.d.ts.map +1 -0
- package/dist/sessions/execution-binding.js +9 -0
- package/dist/sessions/execution-binding.js.map +1 -0
- package/dist/sessions/index.d.ts +1 -0
- package/dist/sessions/index.d.ts.map +1 -1
- package/dist/sessions/index.js +1 -0
- package/dist/sessions/index.js.map +1 -1
- package/dist/source-changes/writer.d.ts +77 -0
- package/dist/source-changes/writer.d.ts.map +1 -0
- package/dist/source-changes/writer.js +189 -0
- package/dist/source-changes/writer.js.map +1 -0
- package/dist/spawning/actions.d.ts +10 -1
- package/dist/spawning/actions.d.ts.map +1 -1
- package/dist/spawning/actions.js +26 -7
- package/dist/spawning/actions.js.map +1 -1
- package/dist/spawning/cli.js +1 -1
- package/dist/spawning/cli.js.map +1 -1
- package/dist/spawning/execution.d.ts.map +1 -1
- package/dist/spawning/execution.js +2 -0
- package/dist/spawning/execution.js.map +1 -1
- package/dist/spawning/types.d.ts +19 -6
- package/dist/spawning/types.d.ts.map +1 -1
- package/dist/spawning/validation.d.ts +16 -0
- package/dist/spawning/validation.d.ts.map +1 -1
- package/dist/spawning/validation.js +44 -8
- package/dist/spawning/validation.js.map +1 -1
- package/dist/storage.d.ts +5 -0
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +10 -1
- package/dist/storage.js.map +1 -1
- package/dist/supervision/contracts.js +4 -1
- package/dist/supervision/contracts.js.map +1 -1
- package/dist/tools.d.ts +1 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +5 -0
- package/dist/tools.js.map +1 -1
- package/docs/README.md +66 -0
- package/docs/acp.md +228 -0
- package/docs/delegation-ledger.md +331 -0
- package/docs/improvement-cycles.md +304 -0
- package/docs/migration-assessment.md +113 -0
- package/docs/migration-example-plan.json +88 -0
- package/docs/migration-example-report.json +511 -0
- package/docs/migration-inventory.md +63 -0
- package/docs/migration-playbook.md +152 -0
- package/docs/migration-verification.md +177 -0
- package/docs/releases/3.6.0.md +43 -0
- package/docs/releases/3.7.0.md +53 -0
- package/package.json +11 -3
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
+
import { canonicalJson } from '../approvals/index.js';
|
|
3
4
|
import { authorizeSessionAction } from '../session-management/index.js';
|
|
4
5
|
import { throwIfCancelled } from '../cancellation.js';
|
|
5
|
-
import { ReservationLedger, manifestHash, validateExecutionManifest, assertExecutionStoreOutsideProject } from '../execution/index.js';
|
|
6
|
+
import { ReservationLedger, ExecutionLimitError, manifestHash, validateExecutionManifest, assertExecutionStoreOutsideProject } from '../execution/index.js';
|
|
6
7
|
import { ExecutionStore } from './execution-store.js';
|
|
7
8
|
import { inspectSpawnAuthority } from '../spawning/authority.js';
|
|
8
9
|
import { RunStore, validateRunManifest } from './store.js';
|
|
9
10
|
import { OrchestrationError } from './types.js';
|
|
11
|
+
import { validateParentBudgetLink } from '../execution/authority.js';
|
|
12
|
+
import { parentBudgetAuthority } from '../execution/parent-budget.js';
|
|
10
13
|
/** Build a bounded runtime contract from the immutable reviewed plan, not worker output. */
|
|
11
14
|
export function executionManifestForRun(input, now = Date.now()) {
|
|
12
15
|
const manifest = validateRunManifest(input), plan = manifest.plan;
|
|
@@ -23,24 +26,48 @@ export async function prepareAgentExecution(cwd, runId, agentId, maxOutputTokens
|
|
|
23
26
|
const executionStore = new ExecutionStore(join(store.root, runId), view.manifest), context = executionStore.exists() ? executionStore.context() : view.manifest;
|
|
24
27
|
if (!context.plan.agents.some(a => a.id === agentId) || !Number.isSafeInteger(maxOutputTokens) || maxOutputTokens < 1 || maxOutputTokens > 100000000)
|
|
25
28
|
throw new OrchestrationError('invalid', 'Unknown agent or invalid output limit.');
|
|
26
|
-
|
|
29
|
+
const ledger = new ReservationLedger(join(store.root, runId, 'budget'));
|
|
30
|
+
const existing = existsSync(ledger.root) ? ledger.read(cwd).manifest : undefined;
|
|
31
|
+
const selected = options.parentBudget === undefined ? undefined : validateParentBudgetLink(options.parentBudget);
|
|
32
|
+
if (existing && selected && canonicalJson(existing.parent ?? null) !== canonicalJson(selected))
|
|
33
|
+
throw new OrchestrationError('conflict', 'An existing run budget cannot change its parent allowance.');
|
|
34
|
+
const parent = selected ?? existing?.parent;
|
|
35
|
+
await authorizeSessionAction(cwd, 'orchestration_budget', { path: cwd, runId, agentId, planHash: view.manifest.planHash, revision: view.run.revision, maxOutputTokens, ...(parent ? { parentBudget: parent } : {}) }, options);
|
|
27
36
|
throwIfCancelled(options.signal);
|
|
28
37
|
const latest = await store.read(runId, cwd, options.signal);
|
|
29
38
|
if (latest.run.revision !== view.run.revision)
|
|
30
39
|
throw new OrchestrationError('conflict', 'Run approval changed while authorizing execution.');
|
|
31
|
-
const ledger = new ReservationLedger(join(store.root, runId, 'budget'));
|
|
32
40
|
const { goalRunAuthority } = await import('../goals/index.js'), goalAuthority = goalRunAuthority(view.manifest, store.root);
|
|
33
|
-
|
|
41
|
+
let manifest = existing ?? executionManifestForRun(view.manifest, goalAuthority?.createdAt);
|
|
42
|
+
if (parent) {
|
|
43
|
+
manifest = validateExecutionManifest({ ...manifest, version: 2, parent });
|
|
44
|
+
}
|
|
34
45
|
if (manifest.runId !== runId || manifest.planHash !== view.manifest.planHash)
|
|
35
46
|
throw new OrchestrationError('conflict', 'Budget belongs to another run plan.');
|
|
36
47
|
goalAuthority?.checkBudget(manifest);
|
|
48
|
+
const funding = await parentBudgetAuthority(manifest, cwd, true, options.signal);
|
|
37
49
|
ledger.create(manifest, options.signal);
|
|
38
|
-
const assertAuthority = () => {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
50
|
+
const assertAuthority = () => {
|
|
51
|
+
executionStore.assertApproval({ approvalRevision: view.run.revision });
|
|
52
|
+
goalAuthority?.assertActive();
|
|
53
|
+
funding?.assertActive();
|
|
54
|
+
if (executionStore.exists()) {
|
|
55
|
+
const current = inspectSpawnAuthority(executionStore, ledger);
|
|
56
|
+
executionStore.assertApproval(current.view.header);
|
|
57
|
+
if (!current.context.plan.agents.some(a => a.id === agentId))
|
|
58
|
+
throw new OrchestrationError('policy-denied', 'Agent is not admitted to the current graph.');
|
|
59
|
+
if (current.view.state.status === 'completed')
|
|
60
|
+
throw new ExecutionLimitError('authority', 'Agent execution is completed; no new work is authorized.');
|
|
61
|
+
// Explicit stop controls fence handles. Task failures/escalations stay with
|
|
62
|
+
// the coordinator, which must still finalize their original outcomes.
|
|
63
|
+
let agent = current.context.plan.agents.find(a => a.id === agentId);
|
|
64
|
+
while (agent) {
|
|
65
|
+
if (current.view.state.stoppedAgents.includes(agent.id))
|
|
66
|
+
throw new ExecutionLimitError('authority', 'Agent execution is stopped; no new work is authorized.');
|
|
67
|
+
agent = current.context.plan.agents.find(a => a.id === agent.parentId);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
};
|
|
44
71
|
assertAuthority();
|
|
45
72
|
return { ledger, manifestHash: manifestHash(manifest), agentId, maxOutputTokens, assertAuthority };
|
|
46
73
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../../src/orchestration/execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,yBAAyB,EAAE,kCAAkC,EAA8C,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../../src/orchestration/execution.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,11 +10,17 @@ export * from './execution-store.js';
|
|
|
10
10
|
export * from './verification.js';
|
|
11
11
|
export * from './coordinator.js';
|
|
12
12
|
export * from './coordinator-actions.js';
|
|
13
|
+
export * from './question-contract.js';
|
|
14
|
+
export * from './questions.js';
|
|
13
15
|
export * from './recovery.js';
|
|
14
16
|
export * from './execution-cli.js';
|
|
15
17
|
export * from './worker-context.js';
|
|
18
|
+
export * from './artifact-host.js';
|
|
16
19
|
export type { CoordinatorProgress } from './progress.js';
|
|
17
20
|
export { readRunAccounting, type RunAccounting, type AccountBalance } from './accounting.js';
|
|
18
21
|
export type { RecordedAgentRoute } from './routing.js';
|
|
19
22
|
export type { AttributedCharge, RequestAccounting } from './request-accounting.js';
|
|
23
|
+
export * from './interruption.js';
|
|
24
|
+
export * from './reviewed-ledger.js';
|
|
25
|
+
export * from './source-candidates.js';
|
|
20
26
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/orchestration/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,YAAY,EAAC,mBAAmB,EAAC,MAAM,eAAe,CAAC;AACvD,OAAO,EAAC,iBAAiB,EAAC,KAAK,aAAa,EAAC,KAAK,cAAc,EAAC,MAAM,iBAAiB,CAAC;AAEzF,YAAY,EAAC,kBAAkB,EAAC,MAAM,cAAc,CAAC;AACrD,YAAY,EAAC,gBAAgB,EAAC,iBAAiB,EAAC,MAAM,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/orchestration/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,YAAY,EAAC,mBAAmB,EAAC,MAAM,eAAe,CAAC;AACvD,OAAO,EAAC,iBAAiB,EAAC,KAAK,aAAa,EAAC,KAAK,cAAc,EAAC,MAAM,iBAAiB,CAAC;AAEzF,YAAY,EAAC,kBAAkB,EAAC,MAAM,cAAc,CAAC;AACrD,YAAY,EAAC,gBAAgB,EAAC,iBAAiB,EAAC,MAAM,yBAAyB,CAAC;AAEhF,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AAErC,cAAc,wBAAwB,CAAC"}
|
|
@@ -10,8 +10,14 @@ export * from './execution-store.js';
|
|
|
10
10
|
export * from './verification.js';
|
|
11
11
|
export * from './coordinator.js';
|
|
12
12
|
export * from './coordinator-actions.js';
|
|
13
|
+
export * from './question-contract.js';
|
|
14
|
+
export * from './questions.js';
|
|
13
15
|
export * from './recovery.js';
|
|
14
16
|
export * from './execution-cli.js';
|
|
15
17
|
export * from './worker-context.js';
|
|
18
|
+
export * from './artifact-host.js';
|
|
16
19
|
export { readRunAccounting } from './accounting.js';
|
|
20
|
+
export * from './interruption.js';
|
|
21
|
+
export * from './reviewed-ledger.js';
|
|
22
|
+
export * from './source-candidates.js';
|
|
17
23
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/orchestration/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/orchestration/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AAEnC,OAAO,EAAC,iBAAiB,EAAwC,MAAM,iBAAiB,CAAC;AAKzF,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AAErC,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { RunActionOptions } from './actions.js';
|
|
2
|
+
export declare function interruptionRecoveryCapabilities(): {
|
|
3
|
+
readonly version: 1;
|
|
4
|
+
readonly owner: 'calliope-cli';
|
|
5
|
+
readonly eventVersion: 10;
|
|
6
|
+
readonly semantics: 'record-interruption-without-execution';
|
|
7
|
+
};
|
|
8
|
+
/** Record a confirmed dead coordinator without retrying work or settling charges. */
|
|
9
|
+
export declare function recoverInterruptedExecution(cwd: string, runId: string, revision: string, options?: RunActionOptions): Promise<import("./coordinator-types.js").ExecutionInspection>;
|
|
10
|
+
//# sourceMappingURL=interruption.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interruption.d.ts","sourceRoot":"","sources":["../../src/orchestration/interruption.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,cAAc,CAAC;AAEnD,wBAAgB,gCAAgC;aACtC,OAAO,EAAC,CAAC;aAAC,KAAK,EAAC,cAAc;aAAC,YAAY,EAAC,EAAE;aAAC,SAAS,EAAC,uCAAuC;EACzG;AAED,qFAAqF;AACrF,wBAAsB,2BAA2B,CAAC,GAAG,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,EAAC,MAAM,EAAC,OAAO,GAAC,gBAAmB,iEAoBpH"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { authorizeSessionAction } from '../session-management/index.js';
|
|
2
|
+
import { inspectExecution } from './coordinator-actions.js';
|
|
3
|
+
import { RunStore } from './store.js';
|
|
4
|
+
import { OrchestrationError } from './types.js';
|
|
5
|
+
export function interruptionRecoveryCapabilities() {
|
|
6
|
+
return { version: 1, owner: 'calliope-cli', eventVersion: 10, semantics: 'record-interruption-without-execution' };
|
|
7
|
+
}
|
|
8
|
+
/** Record a confirmed dead coordinator without retrying work or settling charges. */
|
|
9
|
+
export async function recoverInterruptedExecution(cwd, runId, revision, options = {}) {
|
|
10
|
+
const initial = await inspectExecution(cwd, runId, options), { store, execution, owner } = initial;
|
|
11
|
+
if (typeof revision !== 'string' || !/^[a-f0-9]{64}$/.test(revision))
|
|
12
|
+
throw new OrchestrationError('invalid', 'Recovery requires the observed execution revision.');
|
|
13
|
+
if (!execution || execution.state.status !== 'running' || !execution.state.ownerId || !owner || owner.alive || owner.id !== execution.state.ownerId)
|
|
14
|
+
throw new OrchestrationError('conflict', 'Recovery requires a confirmed dead matching coordinator.');
|
|
15
|
+
store.assertRevision(revision);
|
|
16
|
+
store.assertApproval(execution.header);
|
|
17
|
+
const authority = initial.view.manifest.version === 2 ? (await import('../goals/index.js')).goalRunAuthority(initial.view.manifest, (options.store ?? new RunStore()).root) : undefined;
|
|
18
|
+
authority?.assertActive();
|
|
19
|
+
await authorizeSessionAction(cwd, 'orchestration_recover', { path: cwd, runId, revision, ownerId: owner.id,
|
|
20
|
+
planHash: execution.state.graph?.hash ?? initial.view.manifest.planHash, operation: 'Record interrupted work without execution, retry or budget settlement.' }, options);
|
|
21
|
+
const currentOwner = store.owner();
|
|
22
|
+
if (!currentOwner || currentOwner.alive || currentOwner.id !== owner.id || currentOwner.pid !== owner.pid)
|
|
23
|
+
throw new OrchestrationError('conflict', 'Coordinator ownership changed during recovery review.');
|
|
24
|
+
const lease = store.acquire();
|
|
25
|
+
try {
|
|
26
|
+
await store.append({ type: 'interruption_recovered', ownerId: owner.id, source: options.source === 'repl' ? 'repl' : 'cli' }, options.signal, undefined, () => {
|
|
27
|
+
lease.check();
|
|
28
|
+
store.assertRevision(revision);
|
|
29
|
+
store.assertApproval(execution.header);
|
|
30
|
+
authority?.assertActive();
|
|
31
|
+
});
|
|
32
|
+
return store.read();
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
lease.release();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=interruption.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interruption.js","sourceRoot":"","sources":["../../src/orchestration/interruption.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** A question is input to one tool call, never an expansion of its authority. */
|
|
2
|
+
export interface ExecutionQuestionRequest {
|
|
3
|
+
id: string;
|
|
4
|
+
ownerId: string;
|
|
5
|
+
attempt: number;
|
|
6
|
+
sessionId: string;
|
|
7
|
+
callId: string;
|
|
8
|
+
text: string;
|
|
9
|
+
options: string[];
|
|
10
|
+
context: string | null;
|
|
11
|
+
}
|
|
12
|
+
export interface ExecutionQuestion extends ExecutionQuestionRequest {
|
|
13
|
+
taskId: string;
|
|
14
|
+
status: 'pending' | 'answered' | 'closed';
|
|
15
|
+
answer: string | null;
|
|
16
|
+
}
|
|
17
|
+
export declare function validateQuestionRequest(value: unknown): asserts value is ExecutionQuestionRequest;
|
|
18
|
+
export declare function validateQuestionAnswer(value: unknown): asserts value is string;
|
|
19
|
+
//# sourceMappingURL=question-contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"question-contract.d.ts","sourceRoot":"","sources":["../../src/orchestration/question-contract.ts"],"names":[],"mappings":"AAEA,iFAAiF;AACjF,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAC,MAAM,CAAC;IAAA,OAAO,EAAC,MAAM,CAAC;IAAA,OAAO,EAAC,MAAM,CAAC;IAAA,SAAS,EAAC,MAAM,CAAC;IAAA,MAAM,EAAC,MAAM,CAAC;IACvE,IAAI,EAAC,MAAM,CAAC;IAAA,OAAO,EAAC,MAAM,EAAE,CAAC;IAAA,OAAO,EAAC,MAAM,GAAC,IAAI,CAAC;CAClD;AACD,MAAM,WAAW,iBAAkB,SAAQ,wBAAwB;IACjE,MAAM,EAAC,MAAM,CAAC;IAAA,MAAM,EAAC,SAAS,GAAC,UAAU,GAAC,QAAQ,CAAC;IAAA,MAAM,EAAC,MAAM,GAAC,IAAI,CAAC;CACvE;AACD,wBAAgB,uBAAuB,CAAC,KAAK,EAAC,OAAO,GAAE,OAAO,CAAC,KAAK,IAAI,wBAAwB,CAQ/F;AACD,wBAAgB,sBAAsB,CAAC,KAAK,EAAC,OAAO,GAAE,OAAO,CAAC,KAAK,IAAI,MAAM,CAAoB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { array, fail, integer, shape, text, uuid } from './validation.js';
|
|
2
|
+
export function validateQuestionRequest(value) {
|
|
3
|
+
shape(value, ['id', 'ownerId', 'attempt', 'sessionId', 'callId', 'text', 'options', 'context']);
|
|
4
|
+
if (!uuid(value.id) || !uuid(value.ownerId))
|
|
5
|
+
fail('Invalid question request identity.');
|
|
6
|
+
integer(value.attempt, 1, 4);
|
|
7
|
+
text(value.sessionId, 128);
|
|
8
|
+
text(value.callId, 256);
|
|
9
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(value.sessionId))
|
|
10
|
+
fail('Invalid question session.');
|
|
11
|
+
text(value.text, 8192);
|
|
12
|
+
array(value.options, 8);
|
|
13
|
+
for (const option of value.options)
|
|
14
|
+
text(option, 256);
|
|
15
|
+
if (new Set(value.options).size !== value.options.length)
|
|
16
|
+
fail('Question options must be distinct.');
|
|
17
|
+
if (value.context !== null)
|
|
18
|
+
text(value.context, 8192);
|
|
19
|
+
}
|
|
20
|
+
export function validateQuestionAnswer(value) { text(value, 8192); }
|
|
21
|
+
//# sourceMappingURL=question-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"question-contract.js","sourceRoot":"","sources":["../../src/orchestration/question-contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAC,IAAI,EAAC,OAAO,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,MAAM,iBAAiB,CAAC;AAUnE,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACnD,KAAK,CAAC,KAAK,EAAC,CAAC,IAAI,EAAC,SAAS,EAAC,SAAS,EAAC,WAAW,EAAC,QAAQ,EAAC,MAAM,EAAC,SAAS,EAAC,SAAS,CAAC,CAAC,CAAC;IACxF,IAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACpF,OAAO,CAAC,KAAK,CAAC,OAAO,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC;IAAA,IAAI,CAAC,KAAK,CAAC,SAAS,EAAC,GAAG,CAAC,CAAC;IAAA,IAAI,CAAC,KAAK,CAAC,MAAM,EAAC,GAAG,CAAC,CAAC;IAC5E,IAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC/E,IAAI,CAAC,KAAK,CAAC,IAAI,EAAC,IAAI,CAAC,CAAC;IAAA,KAAK,CAAC,KAAK,CAAC,OAAO,EAAC,CAAC,CAAC,CAAC;IAAA,KAAI,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO;QAAC,IAAI,CAAC,MAAM,EAAC,GAAG,CAAC,CAAC;IAChG,IAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAG,KAAK,CAAC,OAAO,CAAC,MAAM;QAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACjG,IAAG,KAAK,CAAC,OAAO,KAAG,IAAI;QAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAC,IAAI,CAAC,CAAC;AACnD,CAAC;AACD,MAAM,UAAU,sBAAsB,CAAC,KAAa,IAA2B,IAAI,CAAC,KAAK,EAAC,IAAI,CAAC,CAAC,CAAA,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ToolCall } from '../types.js';
|
|
2
|
+
import type { RunActionOptions } from './actions.js';
|
|
3
|
+
import type { ExecutionInspection } from './coordinator-types.js';
|
|
4
|
+
import type { ExecutionStore } from './execution-store.js';
|
|
5
|
+
/** The coordinator retains its lease and active task slot throughout this wait. */
|
|
6
|
+
export declare function waitForExecutionAnswer(store: ExecutionStore, taskId: string, call: ToolCall, signal: AbortSignal | undefined, assertAuthority: () => void): Promise<string>;
|
|
7
|
+
/** Answer one inspected request under current policy and the journal writer lock. */
|
|
8
|
+
export declare function answerExecutionQuestion(cwd: string, runId: string, questionId: string, revision: string, answer: string, options?: RunActionOptions): Promise<ExecutionInspection>;
|
|
9
|
+
//# sourceMappingURL=questions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"questions.d.ts","sourceRoot":"","sources":["../../src/orchestration/questions.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,wBAAwB,CAAC;AAGhE,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,sBAAsB,CAAC;AAczD,mFAAmF;AACnF,wBAAsB,sBAAsB,CAAC,KAAK,EAAC,cAAc,EAAC,MAAM,EAAC,MAAM,EAAC,IAAI,EAAC,QAAQ,EAAC,MAAM,EAAC,WAAW,GAAC,SAAS,EAAC,eAAe,EAAC,MAAI,IAAI,GAAE,OAAO,CAAC,MAAM,CAAC,CAiBnK;AAED,qFAAqF;AACrF,wBAAsB,uBAAuB,CAAC,GAAG,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,UAAU,EAAC,MAAM,EAAC,QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,GAAC,gBAAmB,gCAqBhJ"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
3
|
+
import { canonicalJson, describeApproval, digest } from '../approvals/index.js';
|
|
4
|
+
import { cancellableDelay, throwIfCancelled } from '../cancellation.js';
|
|
5
|
+
import { authorizeSessionAction } from '../session-management/index.js';
|
|
6
|
+
import { withScope } from '../scope.js';
|
|
7
|
+
import { inspectExecution } from './coordinator-actions.js';
|
|
8
|
+
import { agentStopped } from './execution-journal.js';
|
|
9
|
+
import { validateQuestionRequest, validateQuestionAnswer } from './question-contract.js';
|
|
10
|
+
import { OrchestrationError } from './types.js';
|
|
11
|
+
import { hex, shape, uuid } from './validation.js';
|
|
12
|
+
function pendingQuestion(store, execution, id) {
|
|
13
|
+
const q = execution.state.questions?.[id], owner = store.owner();
|
|
14
|
+
if (!q || q.status !== 'pending' || !owner?.alive || owner.id !== q.ownerId || execution.state.ownerId !== q.ownerId)
|
|
15
|
+
throw new OrchestrationError('conflict', 'Question has no live waiting coordinator; inspect its task before recovery.');
|
|
16
|
+
const task = execution.state.tasks[q.taskId], context = store.context(execution), agent = context.plan.agents.find(a => a.id === task.agentId);
|
|
17
|
+
if (task.status !== 'running' || task.sessionId !== q.sessionId || task.attempts !== q.attempt || agentStopped(execution.state, context, agent.id) || Date.now() >= Math.min(execution.header.deadline, Date.parse(execution.header.createdAt) + agent.timeBudgetMs))
|
|
18
|
+
throw new OrchestrationError('conflict', 'Question task stopped or its original deadline expired.');
|
|
19
|
+
store.assertApproval(execution.header);
|
|
20
|
+
return q;
|
|
21
|
+
}
|
|
22
|
+
/** The coordinator retains its lease and active task slot throughout this wait. */
|
|
23
|
+
export async function waitForExecutionAnswer(store, taskId, call, signal, assertAuthority) {
|
|
24
|
+
throwIfCancelled(signal);
|
|
25
|
+
assertAuthority();
|
|
26
|
+
if (call.name !== 'ask_question')
|
|
27
|
+
throw new OrchestrationError('invalid', 'Only ask_question can wait for a question answer.');
|
|
28
|
+
shape(call.arguments, ['question'], ['options', 'context']);
|
|
29
|
+
const state = store.read().state, task = state.tasks[taskId];
|
|
30
|
+
if (!task?.sessionId || !state.ownerId)
|
|
31
|
+
throw new OrchestrationError('conflict', 'Question has no active task session.');
|
|
32
|
+
const request = { id: randomUUID(), ownerId: state.ownerId, attempt: task.attempts, sessionId: task.sessionId, callId: call.id,
|
|
33
|
+
text: call.arguments.question, options: (call.arguments.options ?? []), context: (call.arguments.context ?? null) };
|
|
34
|
+
validateQuestionRequest(request);
|
|
35
|
+
await store.append({ type: 'question_asked', taskId, request }, signal, undefined, assertAuthority);
|
|
36
|
+
for (;;) {
|
|
37
|
+
throwIfCancelled(signal);
|
|
38
|
+
assertAuthority();
|
|
39
|
+
const execution = store.read(), q = execution.state.questions?.[request.id];
|
|
40
|
+
if (q?.status === 'answered' && q.answer !== null)
|
|
41
|
+
return q.answer;
|
|
42
|
+
pendingQuestion(store, execution, request.id);
|
|
43
|
+
await cancellableDelay(100, signal);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** Answer one inspected request under current policy and the journal writer lock. */
|
|
47
|
+
export async function answerExecutionQuestion(cwd, runId, questionId, revision, answer, options = {}) {
|
|
48
|
+
if (!uuid(questionId) || !hex(revision))
|
|
49
|
+
throw new OrchestrationError('invalid', 'Answer requires the exact question ID and inspected execution revision.');
|
|
50
|
+
validateQuestionAnswer(answer);
|
|
51
|
+
const initial = await inspectExecution(cwd, runId, options), { store, view } = initial;
|
|
52
|
+
if (!initial.execution)
|
|
53
|
+
throw new OrchestrationError('unavailable', 'Run has no execution history.');
|
|
54
|
+
if (initial.execution.state.revision !== revision)
|
|
55
|
+
throw new OrchestrationError('conflict', 'Execution changed; inspect the pending question again.');
|
|
56
|
+
const q = pendingQuestion(store, initial.execution, questionId);
|
|
57
|
+
const goalAuthority = view.manifest.version === 2 ? (await import('../goals/index.js')).goalRunAuthority(view.manifest, dirname(dirname(store.root))) : undefined;
|
|
58
|
+
const permissionCall = { id: questionId, name: 'orchestration_answer', arguments: { path: cwd, runId, questionId, revision, taskId: q.taskId, sessionId: q.sessionId, attempt: q.attempt, callId: q.callId, ownerId: q.ownerId,
|
|
59
|
+
planHash: initial.execution.state.graph?.hash ?? view.manifest.planHash, questionHash: digest(canonicalJson(q)), answerHash: digest(answer) } };
|
|
60
|
+
const permissionKey = () => withScope(cwd, () => describeApproval(permissionCall, cwd).key), approvedKey = permissionKey();
|
|
61
|
+
const assertAuthority = () => {
|
|
62
|
+
throwIfCancelled(options.signal);
|
|
63
|
+
goalAuthority?.assertActive();
|
|
64
|
+
const current = store.read();
|
|
65
|
+
if (current.state.revision !== revision)
|
|
66
|
+
throw new OrchestrationError('conflict', 'Execution changed during the answer decision.');
|
|
67
|
+
pendingQuestion(store, current, questionId);
|
|
68
|
+
if (permissionKey() !== approvedKey)
|
|
69
|
+
throw new OrchestrationError('policy-denied', 'Question answer scope or policy changed before commit.');
|
|
70
|
+
};
|
|
71
|
+
await authorizeSessionAction(cwd, permissionCall.name, permissionCall.arguments, { ...options, confirmation: options.confirmation ?? 'mutating' });
|
|
72
|
+
await store.append({ type: 'question_answered', taskId: q.taskId, questionId, answer }, options.signal, undefined, assertAuthority);
|
|
73
|
+
return store.read();
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=questions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"questions.js","sourceRoot":"","sources":["../../src/orchestration/questions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { RunActionOptions } from './actions.js';
|
|
2
|
+
export declare const REVIEWED_LEDGER_CAPABILITY: {
|
|
3
|
+
readonly version: 1;
|
|
4
|
+
readonly ownerScope: 1;
|
|
5
|
+
readonly tokenVersion: 2;
|
|
6
|
+
readonly reviewedAuthority: 1;
|
|
7
|
+
readonly grants: 'native-admissions-only';
|
|
8
|
+
};
|
|
9
|
+
/** Returns an unbound server and a private owner token. Only the trusted host listens or delivers credentials. */
|
|
10
|
+
export declare function prepareReviewedLedger(cwd: string, runId: string, agentId: string, maxOutputTokens: number, options?: RunActionOptions): Promise<{
|
|
11
|
+
server: import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>;
|
|
12
|
+
ownerToken: string;
|
|
13
|
+
execution: import("../execution/guard.js").AgentExecution;
|
|
14
|
+
deadline: number;
|
|
15
|
+
capability: {
|
|
16
|
+
readonly version: 1;
|
|
17
|
+
readonly ownerScope: 1;
|
|
18
|
+
readonly tokenVersion: 2;
|
|
19
|
+
readonly reviewedAuthority: 1;
|
|
20
|
+
readonly grants: 'native-admissions-only';
|
|
21
|
+
};
|
|
22
|
+
}>;
|
|
23
|
+
//# sourceMappingURL=reviewed-ledger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewed-ledger.d.ts","sourceRoot":"","sources":["../../src/orchestration/reviewed-ledger.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,cAAc,CAAC;AAGnD,eAAO,MAAM,0BAA0B;aAAE,OAAO,EAAC,CAAC;aAAC,UAAU,EAAC,CAAC;aAAC,YAAY,EAAC,CAAC;aAAC,iBAAiB,EAAC,CAAC;aAAC,MAAM,EAAC,wBAAwB;CAAU,CAAC;AAE7I,kHAAkH;AAClH,wBAAsB,qBAAqB,CAAC,GAAG,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,eAAe,EAAC,MAAM,EAAC,OAAO,GAAC,gBAAmB;;;;;;0BAHpF,CAAC;6BAAY,CAAC;+BAAc,CAAC;oCAAmB,CAAC;yBAAQ,wBAAwB;;GAmCjI"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/** Host an existing reviewed allowance; native graph admission remains the only writer of children. */
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { canonicalJson, digest } from '../approvals/index.js';
|
|
4
|
+
import { throwIfCancelled } from '../cancellation.js';
|
|
5
|
+
import { accountLineage } from '../execution/authority.js';
|
|
6
|
+
import { effectiveExecutionManifest } from '../execution/child-grants.js';
|
|
7
|
+
import { createLedgerServer } from '../execution/ledger-server.js';
|
|
8
|
+
import { LedgerServerState, mintLedgerToken } from '../execution/ledger-protocol.js';
|
|
9
|
+
import { ExecutionLimitError } from '../execution/types.js';
|
|
10
|
+
import { inspectSpawnAuthority } from '../spawning/authority.js';
|
|
11
|
+
import { RunStore } from './store.js';
|
|
12
|
+
import { ExecutionStore } from './execution-store.js';
|
|
13
|
+
import { agentStopped } from './execution-journal.js';
|
|
14
|
+
import { prepareAgentExecution } from './execution.js';
|
|
15
|
+
import { matchesAgentPreference } from './routing.js';
|
|
16
|
+
export const REVIEWED_LEDGER_CAPABILITY = { version: 1, ownerScope: 1, tokenVersion: 2, reviewedAuthority: 1, grants: 'native-admissions-only' };
|
|
17
|
+
/** Returns an unbound server and a private owner token. Only the trusted host listens or delivers credentials. */
|
|
18
|
+
export async function prepareReviewedLedger(cwd, runId, agentId, maxOutputTokens, options = {}) {
|
|
19
|
+
const runs = options.store ?? new RunStore(), execution = await prepareAgentExecution(cwd, runId, agentId, maxOutputTokens, { ...options, store: runs });
|
|
20
|
+
const ledger = execution.ledger, view = await runs.read(runId, cwd, options.signal), history = new ExecutionStore(join(runs.root, runId), view.manifest);
|
|
21
|
+
const assertOwner = () => { throwIfCancelled(options.signal); execution.assertAuthority(); };
|
|
22
|
+
const assertAccount = (id) => {
|
|
23
|
+
assertOwner();
|
|
24
|
+
const current = history.exists() ? inspectSpawnAuthority(history, ledger) : undefined, context = current?.context ?? view.manifest;
|
|
25
|
+
const agent = context.plan.agents.find(agent => agent.id === id);
|
|
26
|
+
if (!agent || current && agentStopped(current.view.state, context, id))
|
|
27
|
+
throw new ExecutionLimitError('authority', 'Account is not active in the reviewed native graph.');
|
|
28
|
+
return agent;
|
|
29
|
+
};
|
|
30
|
+
const assertGrant = (grant) => {
|
|
31
|
+
assertOwner();
|
|
32
|
+
const admitted = history.exists() ? inspectSpawnAuthority(history, ledger).view.state.graph?.admissions.find(entry => entry.grant.grant.id === grant.id) : undefined;
|
|
33
|
+
if (!admitted || canonicalJson(admitted.grant.grant) !== canonicalJson(grant))
|
|
34
|
+
throw new ExecutionLimitError('authority', 'Child grant requires its existing native reviewed admission.');
|
|
35
|
+
for (const account of grant.accounts)
|
|
36
|
+
assertAccount(account.id);
|
|
37
|
+
};
|
|
38
|
+
assertAccount(agentId);
|
|
39
|
+
const saved = ledger.read(cwd), effective = effectiveExecutionManifest(saved.manifest, saved.projection), deadline = Math.min(...accountLineage(effective, agentId).map(account => account.deadline));
|
|
40
|
+
if (Date.now() >= deadline)
|
|
41
|
+
throw new ExecutionLimitError('deadline', 'Original owner allowance expired.');
|
|
42
|
+
history.create({ version: 1, runId, manifestHash: view.manifest.hash, approvalRevision: view.run.revision, createdAt: new Date(saved.manifest.createdAt).toISOString(), deadline: saved.manifest.deadline });
|
|
43
|
+
assertAccount(agentId);
|
|
44
|
+
const authority = digest(canonicalJson({ version: 1, runId, manifestHash: view.manifest.hash, approvalRevision: view.run.revision }));
|
|
45
|
+
const state = new LedgerServerState(join(dirname(ledger.root), `${runId}.ledger-server`));
|
|
46
|
+
const server = createLedgerServer({ ledger, cwd, state, ownerAgentId: agentId, authority, assertAuthority: assertOwner, assertAccountAuthority: assertAccount, assertGrantAuthority: assertGrant,
|
|
47
|
+
assertReservationAuthority: reservation => {
|
|
48
|
+
const agent = assertAccount(reservation.agentId);
|
|
49
|
+
if (!matchesAgentPreference(agent.preference, reservation.provider, reservation.model))
|
|
50
|
+
throw new ExecutionLimitError('authority', 'Request changes an explicit reviewed provider or model.');
|
|
51
|
+
if (reservation.outputTokens > maxOutputTokens)
|
|
52
|
+
throw new ExecutionLimitError('budget', 'Request exceeds the reviewed host output limit.');
|
|
53
|
+
} });
|
|
54
|
+
const ownerToken = mintLedgerToken(state.secret(), { v: 2, authority, run: runId, role: 'parent', owner: agentId, exp: deadline });
|
|
55
|
+
return { server, ownerToken, execution, deadline, capability: REVIEWED_LEDGER_CAPABILITY };
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=reviewed-ledger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewed-ledger.js","sourceRoot":"","sources":["../../src/orchestration/reviewed-ledger.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { type SmartRoutingPolicy, type SmartRoutingSelection } from '../routing/
|
|
|
2
2
|
import type { RoutingDecision } from '../routing/types.js';
|
|
3
3
|
import type { ExecutionEvent, RunPlanContext } from './coordinator-types.js';
|
|
4
4
|
import type { ExecutionStore } from './execution-store.js';
|
|
5
|
+
import type { AgentContract } from './types.js';
|
|
5
6
|
export interface RecordedAgentRoute {
|
|
6
7
|
version: 1;
|
|
7
8
|
decisionId: string;
|
|
@@ -12,6 +13,8 @@ export interface RecordedAgentRoute {
|
|
|
12
13
|
stage: SmartRoutingSelection['stage'];
|
|
13
14
|
evidenceId?: string;
|
|
14
15
|
}
|
|
16
|
+
/** Explicit reviewed choices remain constraints even when a host supplies its own runtime config. */
|
|
17
|
+
export declare function matchesAgentPreference(preference: AgentContract['preference'], provider: string, model: string): boolean;
|
|
15
18
|
/** Only a recorded failed check with immutable evidence opens the escalation pool. */
|
|
16
19
|
export declare function taskSmartSelection(policy: SmartRoutingPolicy, events: ExecutionEvent[], taskId?: string): SmartRoutingSelection;
|
|
17
20
|
export declare function validateRecordedRoute(value: unknown, context: RunPlanContext, agentId: string): RecordedAgentRoute;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../src/orchestration/routing.ts"],"names":[],"mappings":"AAEA,OAAO,EAA8B,KAAK,kBAAkB,EAAC,KAAK,qBAAqB,EAAC,MAAM,qBAAqB,CAAC;AACpH,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAC,cAAc,EAAC,cAAc,EAAC,MAAM,wBAAwB,CAAC;AAC1E,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../src/orchestration/routing.ts"],"names":[],"mappings":"AAEA,OAAO,EAA8B,KAAK,kBAAkB,EAAC,KAAK,qBAAqB,EAAC,MAAM,qBAAqB,CAAC;AACpH,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAC,cAAc,EAAC,cAAc,EAAC,MAAM,wBAAwB,CAAC;AAC1E,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,YAAY,CAAC;AAG9C,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAC,CAAC,CAAC;IAAA,UAAU,EAAC,MAAM,CAAC;IAAA,QAAQ,EAAC,MAAM,CAAC;IAAA,KAAK,EAAC,MAAM,CAAC;IAAA,MAAM,EAAC,MAAM,CAAC;IACvE,OAAO,EAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAAA,KAAK,EAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAAA,UAAU,CAAC,EAAC,MAAM,CAAC;CAC/F;AACD,qGAAqG;AACrG,wBAAgB,sBAAsB,CAAC,UAAU,EAAC,aAAa,CAAC,YAAY,CAAC,EAAC,QAAQ,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,GAAE,OAAO,CAElH;AACD,sFAAsF;AACtF,wBAAgB,kBAAkB,CAAC,MAAM,EAAC,kBAAkB,EAAC,MAAM,EAAC,cAAc,EAAE,EAAC,MAAM,CAAC,EAAC,MAAM,GAAE,qBAAqB,CAKzH;AACD,wBAAgB,qBAAqB,CAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,MAAM,GAAE,kBAAkB,CAW5G;AACD,uFAAuF;AACvF,wBAAsB,gBAAgB,CAAC,KAAK,EAAC,cAAc,EAAC,OAAO,EAAC,MAAM,EAAC,SAAS,EAAC,MAAM,EAAC,QAAQ,EAAC,eAAe,EAAC,MAAM,EAAC,WAAW,EAAC,YAAY,EAAC,MAAI,IAAI,EAAC,MAAM,CAAC,EAAC,MAAM,GAAE,OAAO,CAAC,IAAI,CAAC,CAI1L"}
|
|
@@ -2,6 +2,10 @@ import { approvalDisplayText } from '../approvals/index.js';
|
|
|
2
2
|
import { getProviderNames } from '../config.js';
|
|
3
3
|
import { smartPool, smartTargetMatches } from '../routing/smart.js';
|
|
4
4
|
import { shape, text, uuid, fail } from './validation.js';
|
|
5
|
+
/** Explicit reviewed choices remain constraints even when a host supplies its own runtime config. */
|
|
6
|
+
export function matchesAgentPreference(preference, provider, model) {
|
|
7
|
+
return (preference.provider === 'auto' || preference.provider === provider) && (!preference.model || preference.model === model);
|
|
8
|
+
}
|
|
5
9
|
/** Only a recorded failed check with immutable evidence opens the escalation pool. */
|
|
6
10
|
export function taskSmartSelection(policy, events, taskId) {
|
|
7
11
|
const last = taskId ? [...events].reverse().find(event => event.change.type === 'task_finished' && event.change.taskId === taskId) : undefined;
|
|
@@ -22,7 +26,7 @@ export function validateRecordedRoute(value, context, agentId) {
|
|
|
22
26
|
if (value.stage === 'escalation' ? !policy.escalationPool || !uuid(value.evidenceId) : value.evidenceId !== undefined)
|
|
23
27
|
fail('Escalated routing requires recorded verification evidence.');
|
|
24
28
|
const preference = agent.preference;
|
|
25
|
-
if (preference
|
|
29
|
+
if (!matchesAgentPreference(preference, value.provider, value.model))
|
|
26
30
|
fail('Routing evidence changed an explicit agent pin.');
|
|
27
31
|
if (!preference.model && (preference.provider === 'auto' || smartPool({ policy, stage: value.stage }).some(t => t.provider === preference.provider)) && !smartTargetMatches(smartPool({ policy, stage: value.stage }), value.provider, { id: value.model }))
|
|
28
32
|
fail('Routing evidence exceeds the reviewed model pool.');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routing.js","sourceRoot":"","sources":["../../src/orchestration/routing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAC,gBAAgB,EAAC,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAC,SAAS,EAAC,kBAAkB,EAAoD,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"routing.js","sourceRoot":"","sources":["../../src/orchestration/routing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { type WriterReview } from '../source-changes/writer.js';
|
|
2
|
+
import type { RunActionOptions } from './actions.js';
|
|
3
|
+
export interface SourceCandidateSelection {
|
|
4
|
+
runId: string;
|
|
5
|
+
executionRevision: string;
|
|
6
|
+
taskId: string;
|
|
7
|
+
attempt: number;
|
|
8
|
+
artifactId: string;
|
|
9
|
+
artifactHash: string;
|
|
10
|
+
}
|
|
11
|
+
export interface SourceCandidateReview extends WriterReview<SourceCandidateSelection> {
|
|
12
|
+
kind: 'source-candidate-review';
|
|
13
|
+
verification: 'required';
|
|
14
|
+
}
|
|
15
|
+
export declare function sourceCandidateCapabilities(): {
|
|
16
|
+
readonly version: 1;
|
|
17
|
+
readonly owner: 'calliope-cli';
|
|
18
|
+
readonly writer: 'git';
|
|
19
|
+
readonly operations: readonly ['preview', 'create', 'inspect', 'list'];
|
|
20
|
+
readonly semantics: 'generated-task-patch-to-unverified-local-candidate';
|
|
21
|
+
readonly verification: 'required';
|
|
22
|
+
readonly installation: false;
|
|
23
|
+
readonly merge: false;
|
|
24
|
+
readonly push: false;
|
|
25
|
+
readonly mayCallModel: false;
|
|
26
|
+
};
|
|
27
|
+
/** Preview creates no Git object/ref and does not turn task checks into migration acceptance. */
|
|
28
|
+
export declare function previewSourceCandidate(cwd: string, source: SourceCandidateSelection, options?: RunActionOptions): Promise<{
|
|
29
|
+
review: SourceCandidateReview;
|
|
30
|
+
hash: string;
|
|
31
|
+
branch: string;
|
|
32
|
+
patch: string;
|
|
33
|
+
}>;
|
|
34
|
+
export declare const createSourceCandidate: (cwd: string, source: SourceCandidateSelection, reviewedHash: string, options?: RunActionOptions) => Promise<{
|
|
35
|
+
version: 1;
|
|
36
|
+
status: "candidate" | "prepared";
|
|
37
|
+
hash: string;
|
|
38
|
+
branch: string;
|
|
39
|
+
review: SourceCandidateReview;
|
|
40
|
+
createdAt: string;
|
|
41
|
+
commit: string | null;
|
|
42
|
+
tree: string | null;
|
|
43
|
+
}>;
|
|
44
|
+
export declare const inspectSourceCandidate: (cwd: string, runId: string, hash: string, options?: RunActionOptions) => Promise<{
|
|
45
|
+
version: 1;
|
|
46
|
+
status: "candidate" | "prepared";
|
|
47
|
+
hash: string;
|
|
48
|
+
branch: string;
|
|
49
|
+
review: SourceCandidateReview;
|
|
50
|
+
createdAt: string;
|
|
51
|
+
commit: string | null;
|
|
52
|
+
tree: string | null;
|
|
53
|
+
}>;
|
|
54
|
+
export declare const listSourceCandidates: (cwd: string, runId: string, options?: RunActionOptions) => Promise<{
|
|
55
|
+
version: 1;
|
|
56
|
+
status: "candidate" | "prepared";
|
|
57
|
+
hash: string;
|
|
58
|
+
branch: string;
|
|
59
|
+
review: SourceCandidateReview;
|
|
60
|
+
createdAt: string;
|
|
61
|
+
commit: string | null;
|
|
62
|
+
tree: string | null;
|
|
63
|
+
}[]>;
|
|
64
|
+
//# sourceMappingURL=source-candidates.d.ts.map
|