open-multi-agent-kit 0.98.3 → 0.98.5
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/README.md +12 -2
- package/dist/cli/args.d.ts +1 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +14 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +3 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/mcp-attach.d.ts +3 -3
- package/dist/cli/mcp-attach.d.ts.map +1 -1
- package/dist/cli/mcp-attach.js +5 -4
- package/dist/cli/mcp-attach.js.map +1 -1
- package/dist/cli/model-contract.d.ts +5 -0
- package/dist/cli/model-contract.d.ts.map +1 -0
- package/dist/cli/model-contract.js +45 -0
- package/dist/cli/model-contract.js.map +1 -0
- package/dist/commands/adaptorch-doctor-cli.d.ts.map +1 -1
- package/dist/commands/adaptorch-doctor-cli.js +32 -10
- package/dist/commands/adaptorch-doctor-cli.js.map +1 -1
- package/dist/commands/init-cli.d.ts +12 -0
- package/dist/commands/init-cli.d.ts.map +1 -0
- package/dist/commands/init-cli.js +76 -0
- package/dist/commands/init-cli.js.map +1 -0
- package/dist/commands/provider-sync-cli.d.ts +27 -0
- package/dist/commands/provider-sync-cli.d.ts.map +1 -0
- package/dist/commands/provider-sync-cli.js +177 -0
- package/dist/commands/provider-sync-cli.js.map +1 -0
- package/dist/commands/run-command.d.ts +9 -0
- package/dist/commands/run-command.d.ts.map +1 -0
- package/dist/commands/run-command.js +34 -0
- package/dist/commands/run-command.js.map +1 -0
- package/dist/commands/verified-run-cli.d.ts +6 -0
- package/dist/commands/verified-run-cli.d.ts.map +1 -0
- package/dist/commands/verified-run-cli.js +190 -0
- package/dist/commands/verified-run-cli.js.map +1 -0
- package/dist/core/active-skill-state.d.ts +7 -0
- package/dist/core/active-skill-state.d.ts.map +1 -0
- package/dist/core/active-skill-state.js +25 -0
- package/dist/core/active-skill-state.js.map +1 -0
- package/dist/core/agent-session-services.d.ts +10 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +43 -0
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +7 -9
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +91 -126
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/codex-chatgpt-web-bridge.d.ts +99 -0
- package/dist/core/codex-chatgpt-web-bridge.d.ts.map +1 -0
- package/dist/core/codex-chatgpt-web-bridge.js +192 -0
- package/dist/core/codex-chatgpt-web-bridge.js.map +1 -0
- package/dist/core/codex-chatgpt-web-sync.d.ts +50 -0
- package/dist/core/codex-chatgpt-web-sync.d.ts.map +1 -0
- package/dist/core/codex-chatgpt-web-sync.js +119 -0
- package/dist/core/codex-chatgpt-web-sync.js.map +1 -0
- package/dist/core/compaction/compaction-headroom.d.ts +30 -0
- package/dist/core/compaction/compaction-headroom.d.ts.map +1 -0
- package/dist/core/compaction/compaction-headroom.js +48 -0
- package/dist/core/compaction/compaction-headroom.js.map +1 -0
- package/dist/core/compaction/compaction.d.ts +2 -29
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +19 -47
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/overflow-retry-guard.d.ts +20 -0
- package/dist/core/compaction/overflow-retry-guard.d.ts.map +1 -0
- package/dist/core/compaction/overflow-retry-guard.js +38 -0
- package/dist/core/compaction/overflow-retry-guard.js.map +1 -0
- package/dist/core/context-budget-headroom-types.d.ts.map +1 -1
- package/dist/core/context-budget-headroom-types.js +1 -1
- package/dist/core/context-budget-headroom-types.js.map +1 -1
- package/dist/core/context-budget-token-counter-types.d.ts +27 -0
- package/dist/core/context-budget-token-counter-types.d.ts.map +1 -0
- package/dist/core/context-budget-token-counter-types.js +2 -0
- package/dist/core/context-budget-token-counter-types.js.map +1 -0
- package/dist/core/context-budget-token-counter.d.ts +2 -26
- package/dist/core/context-budget-token-counter.d.ts.map +1 -1
- package/dist/core/context-budget-token-counter.js +2 -0
- package/dist/core/context-budget-token-counter.js.map +1 -1
- package/dist/core/context-budget-v2-scoring.d.ts.map +1 -1
- package/dist/core/context-budget-v2-scoring.js +14 -10
- package/dist/core/context-budget-v2-scoring.js.map +1 -1
- package/dist/core/domain-router.d.ts.map +1 -1
- package/dist/core/domain-router.js +1 -1
- package/dist/core/domain-router.js.map +1 -1
- package/dist/core/grok-harness-dispatch.d.ts +4 -0
- package/dist/core/grok-harness-dispatch.d.ts.map +1 -1
- package/dist/core/grok-harness-dispatch.js +20 -3
- package/dist/core/grok-harness-dispatch.js.map +1 -1
- package/dist/core/grok-harness.d.ts +15 -9
- package/dist/core/grok-harness.d.ts.map +1 -1
- package/dist/core/grok-harness.js +34 -8
- package/dist/core/grok-harness.js.map +1 -1
- package/dist/core/mcp/tools.d.ts +2 -2
- package/dist/core/mcp/tools.d.ts.map +1 -1
- package/dist/core/mcp/tools.js +29 -3
- package/dist/core/mcp/tools.js.map +1 -1
- package/dist/core/model-registry-schema.d.ts +1081 -0
- package/dist/core/model-registry-schema.d.ts.map +1 -0
- package/dist/core/model-registry-schema.js +148 -0
- package/dist/core/model-registry-schema.js.map +1 -0
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +1 -146
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +2 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +2 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/prompt-preset.d.ts +1 -1
- package/dist/core/prompt-preset.d.ts.map +1 -1
- package/dist/core/prompt-preset.js +16 -1
- package/dist/core/prompt-preset.js.map +1 -1
- package/dist/core/prompt-settlement.d.ts +4 -3
- package/dist/core/prompt-settlement.d.ts.map +1 -1
- package/dist/core/prompt-settlement.js.map +1 -1
- package/dist/core/provider-display-names.d.ts.map +1 -1
- package/dist/core/provider-display-names.js +1 -0
- package/dist/core/provider-display-names.js.map +1 -1
- package/dist/core/provider-resilience.d.ts +8 -0
- package/dist/core/provider-resilience.d.ts.map +1 -1
- package/dist/core/provider-resilience.js +20 -3
- package/dist/core/provider-resilience.js.map +1 -1
- package/dist/core/provider-usage-types.d.ts +42 -0
- package/dist/core/provider-usage-types.d.ts.map +1 -0
- package/dist/core/provider-usage-types.js +2 -0
- package/dist/core/provider-usage-types.js.map +1 -0
- package/dist/core/provider-usage.d.ts +2 -31
- package/dist/core/provider-usage.d.ts.map +1 -1
- package/dist/core/provider-usage.js +4 -0
- package/dist/core/provider-usage.js.map +1 -1
- package/dist/core/redaction.d.ts.map +1 -1
- package/dist/core/redaction.js +18 -2
- package/dist/core/redaction.js.map +1 -1
- package/dist/core/run-budget-policy.d.ts +18 -0
- package/dist/core/run-budget-policy.d.ts.map +1 -0
- package/dist/core/run-budget-policy.js +52 -0
- package/dist/core/run-budget-policy.js.map +1 -0
- package/dist/core/run-budget.d.ts +33 -0
- package/dist/core/run-budget.d.ts.map +1 -0
- package/dist/core/run-budget.js +89 -0
- package/dist/core/run-budget.js.map +1 -0
- package/dist/core/run-execution-api.d.ts +15 -0
- package/dist/core/run-execution-api.d.ts.map +1 -0
- package/dist/core/run-execution-api.js +7 -0
- package/dist/core/run-execution-api.js.map +1 -0
- package/dist/core/run-journal.d.ts.map +1 -1
- package/dist/core/run-journal.js +30 -208
- package/dist/core/run-journal.js.map +1 -1
- package/dist/core/sandbox/policy-merge.d.ts +6 -0
- package/dist/core/sandbox/policy-merge.d.ts.map +1 -0
- package/dist/core/sandbox/policy-merge.js +74 -0
- package/dist/core/sandbox/policy-merge.js.map +1 -0
- package/dist/core/sandbox/policy-paths.d.ts +4 -0
- package/dist/core/sandbox/policy-paths.d.ts.map +1 -0
- package/dist/core/sandbox/policy-paths.js +21 -0
- package/dist/core/sandbox/policy-paths.js.map +1 -0
- package/dist/core/sandbox/policy-types.d.ts +75 -0
- package/dist/core/sandbox/policy-types.d.ts.map +1 -0
- package/dist/core/sandbox/policy-types.js +2 -0
- package/dist/core/sandbox/policy-types.js.map +1 -0
- package/dist/core/sandbox/policy.d.ts +3 -77
- package/dist/core/sandbox/policy.d.ts.map +1 -1
- package/dist/core/sandbox/policy.js +3 -98
- package/dist/core/sandbox/policy.js.map +1 -1
- package/dist/core/sdk-provider-stream.d.ts +14 -0
- package/dist/core/sdk-provider-stream.d.ts.map +1 -0
- package/dist/core/sdk-provider-stream.js +38 -0
- package/dist/core/sdk-provider-stream.js.map +1 -0
- package/dist/core/sdk.d.ts +5 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +17 -33
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-bash-service.d.ts +2 -2
- package/dist/core/session-bash-service.d.ts.map +1 -1
- package/dist/core/session-bash-service.js +21 -9
- package/dist/core/session-bash-service.js.map +1 -1
- package/dist/core/session-failure-cause.d.ts.map +1 -1
- package/dist/core/session-failure-cause.js +15 -3
- package/dist/core/session-failure-cause.js.map +1 -1
- package/dist/core/session-prompt-lifecycle.d.ts +25 -0
- package/dist/core/session-prompt-lifecycle.d.ts.map +1 -0
- package/dist/core/session-prompt-lifecycle.js +87 -0
- package/dist/core/session-prompt-lifecycle.js.map +1 -0
- package/dist/core/session-run-budget.d.ts +28 -0
- package/dist/core/session-run-budget.d.ts.map +1 -0
- package/dist/core/session-run-budget.js +127 -0
- package/dist/core/session-run-budget.js.map +1 -0
- package/dist/core/session-run-termination.d.ts +18 -0
- package/dist/core/session-run-termination.d.ts.map +1 -0
- package/dist/core/session-run-termination.js +72 -0
- package/dist/core/session-run-termination.js.map +1 -0
- package/dist/core/session-termination-types.d.ts +97 -0
- package/dist/core/session-termination-types.d.ts.map +1 -0
- package/dist/core/session-termination-types.js +26 -0
- package/dist/core/session-termination-types.js.map +1 -0
- package/dist/core/session-termination.d.ts +3 -97
- package/dist/core/session-termination.d.ts.map +1 -1
- package/dist/core/session-termination.js +25 -29
- package/dist/core/session-termination.js.map +1 -1
- package/dist/core/skill-selector.d.ts +40 -0
- package/dist/core/skill-selector.d.ts.map +1 -0
- package/dist/core/skill-selector.js +102 -0
- package/dist/core/skill-selector.js.map +1 -0
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +1 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/subagent-lane-launcher.d.ts +3 -2
- package/dist/core/subagent-lane-launcher.d.ts.map +1 -1
- package/dist/core/subagent-lane-launcher.js +24 -13
- package/dist/core/subagent-lane-launcher.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js +2 -4
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/turn-metrics-record.d.ts +55 -0
- package/dist/core/turn-metrics-record.d.ts.map +1 -0
- package/dist/core/turn-metrics-record.js +149 -0
- package/dist/core/turn-metrics-record.js.map +1 -0
- package/dist/core/turn-metrics.d.ts +4 -56
- package/dist/core/turn-metrics.d.ts.map +1 -1
- package/dist/core/turn-metrics.js +12 -60
- package/dist/core/turn-metrics.js.map +1 -1
- package/dist/core/verified-run/broker.d.ts +26 -0
- package/dist/core/verified-run/broker.d.ts.map +1 -0
- package/dist/core/verified-run/broker.js +210 -0
- package/dist/core/verified-run/broker.js.map +1 -0
- package/dist/core/verified-run/candidate.d.ts +24 -0
- package/dist/core/verified-run/candidate.d.ts.map +1 -0
- package/dist/core/verified-run/candidate.js +167 -0
- package/dist/core/verified-run/candidate.js.map +1 -0
- package/dist/core/verified-run/check-receipt.d.ts +18 -0
- package/dist/core/verified-run/check-receipt.d.ts.map +1 -0
- package/dist/core/verified-run/check-receipt.js +92 -0
- package/dist/core/verified-run/check-receipt.js.map +1 -0
- package/dist/core/verified-run/coordinator.d.ts +39 -0
- package/dist/core/verified-run/coordinator.d.ts.map +1 -0
- package/dist/core/verified-run/coordinator.js +190 -0
- package/dist/core/verified-run/coordinator.js.map +1 -0
- package/dist/core/verified-run/dag-candidates.d.ts +8 -0
- package/dist/core/verified-run/dag-candidates.d.ts.map +1 -0
- package/dist/core/verified-run/dag-candidates.js +65 -0
- package/dist/core/verified-run/dag-candidates.js.map +1 -0
- package/dist/core/verified-run/dag-phase.d.ts +7 -0
- package/dist/core/verified-run/dag-phase.d.ts.map +1 -0
- package/dist/core/verified-run/dag-phase.js +92 -0
- package/dist/core/verified-run/dag-phase.js.map +1 -0
- package/dist/core/verified-run/dag-projection.d.ts +7 -0
- package/dist/core/verified-run/dag-projection.d.ts.map +1 -0
- package/dist/core/verified-run/dag-projection.js +90 -0
- package/dist/core/verified-run/dag-projection.js.map +1 -0
- package/dist/core/verified-run/dag-recovery.d.ts +13 -0
- package/dist/core/verified-run/dag-recovery.d.ts.map +1 -0
- package/dist/core/verified-run/dag-recovery.js +98 -0
- package/dist/core/verified-run/dag-recovery.js.map +1 -0
- package/dist/core/verified-run/dag-retry-projection.d.ts +9 -0
- package/dist/core/verified-run/dag-retry-projection.d.ts.map +1 -0
- package/dist/core/verified-run/dag-retry-projection.js +43 -0
- package/dist/core/verified-run/dag-retry-projection.js.map +1 -0
- package/dist/core/verified-run/dag-types.d.ts +47 -0
- package/dist/core/verified-run/dag-types.d.ts.map +1 -0
- package/dist/core/verified-run/dag-types.js +2 -0
- package/dist/core/verified-run/dag-types.js.map +1 -0
- package/dist/core/verified-run/event-parser.d.ts +3 -0
- package/dist/core/verified-run/event-parser.d.ts.map +1 -0
- package/dist/core/verified-run/event-parser.js +153 -0
- package/dist/core/verified-run/event-parser.js.map +1 -0
- package/dist/core/verified-run/events.d.ts +4 -0
- package/dist/core/verified-run/events.d.ts.map +1 -0
- package/dist/core/verified-run/events.js +3 -0
- package/dist/core/verified-run/events.js.map +1 -0
- package/dist/core/verified-run/evidence-binding.d.ts +18 -0
- package/dist/core/verified-run/evidence-binding.d.ts.map +1 -0
- package/dist/core/verified-run/evidence-binding.js +81 -0
- package/dist/core/verified-run/evidence-binding.js.map +1 -0
- package/dist/core/verified-run/evidence.d.ts +27 -0
- package/dist/core/verified-run/evidence.d.ts.map +1 -0
- package/dist/core/verified-run/evidence.js +100 -0
- package/dist/core/verified-run/evidence.js.map +1 -0
- package/dist/core/verified-run/journal.d.ts +32 -0
- package/dist/core/verified-run/journal.d.ts.map +1 -0
- package/dist/core/verified-run/journal.js +103 -0
- package/dist/core/verified-run/journal.js.map +1 -0
- package/dist/core/verified-run/namespace-identity.d.ts +11 -0
- package/dist/core/verified-run/namespace-identity.d.ts.map +1 -0
- package/dist/core/verified-run/namespace-identity.js +77 -0
- package/dist/core/verified-run/namespace-identity.js.map +1 -0
- package/dist/core/verified-run/owned-execution.d.ts +21 -0
- package/dist/core/verified-run/owned-execution.d.ts.map +1 -0
- package/dist/core/verified-run/owned-execution.js +43 -0
- package/dist/core/verified-run/owned-execution.js.map +1 -0
- package/dist/core/verified-run/phase-context.d.ts +9 -0
- package/dist/core/verified-run/phase-context.d.ts.map +1 -0
- package/dist/core/verified-run/phase-context.js +2 -0
- package/dist/core/verified-run/phase-context.js.map +1 -0
- package/dist/core/verified-run/process-gate.d.ts +5 -0
- package/dist/core/verified-run/process-gate.d.ts.map +1 -0
- package/dist/core/verified-run/process-gate.js +31 -0
- package/dist/core/verified-run/process-gate.js.map +1 -0
- package/dist/core/verified-run/projection.d.ts +4 -0
- package/dist/core/verified-run/projection.d.ts.map +1 -0
- package/dist/core/verified-run/projection.js +219 -0
- package/dist/core/verified-run/projection.js.map +1 -0
- package/dist/core/verified-run/recovery-clock.d.ts +19 -0
- package/dist/core/verified-run/recovery-clock.d.ts.map +1 -0
- package/dist/core/verified-run/recovery-clock.js +69 -0
- package/dist/core/verified-run/recovery-clock.js.map +1 -0
- package/dist/core/verified-run/recovery-command.d.ts +11 -0
- package/dist/core/verified-run/recovery-command.d.ts.map +1 -0
- package/dist/core/verified-run/recovery-command.js +73 -0
- package/dist/core/verified-run/recovery-command.js.map +1 -0
- package/dist/core/verified-run/recovery-projection.d.ts +12 -0
- package/dist/core/verified-run/recovery-projection.d.ts.map +1 -0
- package/dist/core/verified-run/recovery-projection.js +88 -0
- package/dist/core/verified-run/recovery-projection.js.map +1 -0
- package/dist/core/verified-run/recovery.d.ts +12 -0
- package/dist/core/verified-run/recovery.d.ts.map +1 -0
- package/dist/core/verified-run/recovery.js +115 -0
- package/dist/core/verified-run/recovery.js.map +1 -0
- package/dist/core/verified-run/run-types.d.ts +103 -0
- package/dist/core/verified-run/run-types.d.ts.map +1 -0
- package/dist/core/verified-run/run-types.js +2 -0
- package/dist/core/verified-run/run-types.js.map +1 -0
- package/dist/core/verified-run/scripted-writer.d.ts +15 -0
- package/dist/core/verified-run/scripted-writer.d.ts.map +1 -0
- package/dist/core/verified-run/scripted-writer.js +94 -0
- package/dist/core/verified-run/scripted-writer.js.map +1 -0
- package/dist/core/verified-run/session-port.d.ts +27 -0
- package/dist/core/verified-run/session-port.d.ts.map +1 -0
- package/dist/core/verified-run/session-port.js +2 -0
- package/dist/core/verified-run/session-port.js.map +1 -0
- package/dist/core/verified-run/storage.d.ts +15 -0
- package/dist/core/verified-run/storage.d.ts.map +1 -0
- package/dist/core/verified-run/storage.js +96 -0
- package/dist/core/verified-run/storage.js.map +1 -0
- package/dist/core/verified-run/verification-phase.d.ts +5 -0
- package/dist/core/verified-run/verification-phase.d.ts.map +1 -0
- package/dist/core/verified-run/verification-phase.js +56 -0
- package/dist/core/verified-run/verification-phase.js.map +1 -0
- package/dist/core/verified-run/work-recovery.d.ts +8 -0
- package/dist/core/verified-run/work-recovery.d.ts.map +1 -0
- package/dist/core/verified-run/work-recovery.js +44 -0
- package/dist/core/verified-run/work-recovery.js.map +1 -0
- package/dist/core/verified-run/writer-completion.d.ts +4 -0
- package/dist/core/verified-run/writer-completion.d.ts.map +1 -0
- package/dist/core/verified-run/writer-completion.js +27 -0
- package/dist/core/verified-run/writer-completion.js.map +1 -0
- package/dist/core/verified-run/writer-phase.d.ts +8 -0
- package/dist/core/verified-run/writer-phase.d.ts.map +1 -0
- package/dist/core/verified-run/writer-phase.js +76 -0
- package/dist/core/verified-run/writer-phase.js.map +1 -0
- package/dist/core/verified-run/writer-projection.d.ts +11 -0
- package/dist/core/verified-run/writer-projection.d.ts.map +1 -0
- package/dist/core/verified-run/writer-projection.js +70 -0
- package/dist/core/verified-run/writer-projection.js.map +1 -0
- package/dist/core/verified-run/writer-recovery.d.ts +16 -0
- package/dist/core/verified-run/writer-recovery.d.ts.map +1 -0
- package/dist/core/verified-run/writer-recovery.js +107 -0
- package/dist/core/verified-run/writer-recovery.js.map +1 -0
- package/dist/core/workload-permit-pool.d.ts +1 -3
- package/dist/core/workload-permit-pool.d.ts.map +1 -1
- package/dist/core/workload-permit-pool.js +11 -11
- package/dist/core/workload-permit-pool.js.map +1 -1
- package/dist/guardrails/evidence-system.d.ts +1 -1
- package/dist/guardrails/evidence-system.d.ts.map +1 -1
- package/dist/guardrails/evidence-system.js +18 -29
- package/dist/guardrails/evidence-system.js.map +1 -1
- package/dist/guardrails/merge-gate-result.d.ts +4 -0
- package/dist/guardrails/merge-gate-result.d.ts.map +1 -0
- package/dist/guardrails/merge-gate-result.js +32 -0
- package/dist/guardrails/merge-gate-result.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +17 -23
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/session-failure.d.ts +13 -0
- package/dist/modes/interactive/components/session-failure.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-failure.js +81 -0
- package/dist/modes/interactive/components/session-failure.js.map +1 -0
- package/dist/modes/interactive/interactive-login-options.d.ts +27 -0
- package/dist/modes/interactive/interactive-login-options.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-login-options.js +54 -0
- package/dist/modes/interactive/interactive-login-options.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +8 -4
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +183 -171
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/interactive-resume-command.d.ts +3 -0
- package/dist/modes/interactive/interactive-resume-command.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-resume-command.js +24 -0
- package/dist/modes/interactive/interactive-resume-command.js.map +1 -0
- package/dist/modes/interactive/interactive-tool-result.d.ts +32 -0
- package/dist/modes/interactive/interactive-tool-result.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-tool-result.js +59 -0
- package/dist/modes/interactive/interactive-tool-result.js.map +1 -0
- package/dist/modes/interactive/tui-diagnostics.d.ts +36 -0
- package/dist/modes/interactive/tui-diagnostics.d.ts.map +1 -0
- package/dist/modes/interactive/tui-diagnostics.js +105 -0
- package/dist/modes/interactive/tui-diagnostics.js.map +1 -0
- package/dist/modes/interactive/tui-runtime-info.d.ts +20 -0
- package/dist/modes/interactive/tui-runtime-info.d.ts.map +1 -0
- package/dist/modes/interactive/tui-runtime-info.js +76 -0
- package/dist/modes/interactive/tui-runtime-info.js.map +1 -0
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +22 -0
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js +10 -60
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/terminal-links.d.ts +13 -0
- package/dist/utils/terminal-links.d.ts.map +1 -0
- package/dist/utils/terminal-links.js +68 -0
- package/dist/utils/terminal-links.js.map +1 -0
- package/dist/utils/windows-clipboard-image.d.ts +16 -0
- package/dist/utils/windows-clipboard-image.d.ts.map +1 -0
- package/dist/utils/windows-clipboard-image.js +87 -0
- package/dist/utils/windows-clipboard-image.js.map +1 -0
- package/docs/adaptorch-onboarding.md +80 -0
- package/docs/containerization.md +12 -0
- package/docs/context-files.md +97 -0
- package/docs/correctness-wall.md +8 -0
- package/docs/custom-provider.md +35 -0
- package/docs/development.md +28 -3
- package/docs/environment-variables.md +2 -0
- package/docs/grok-harness.md +4 -0
- package/docs/harness-boundaries.md +154 -0
- package/docs/harness-improvements.md +90 -0
- package/docs/json.md +19 -0
- package/docs/keybindings.md +2 -2
- package/docs/mcp.md +22 -2
- package/docs/metrics.md +66 -16
- package/docs/model-catalog-refresh.md +190 -0
- package/docs/model-contract.md +168 -0
- package/docs/models.md +21 -4
- package/docs/provider-resilience.md +5 -3
- package/docs/providers.md +68 -1
- package/docs/quickstart.md +4 -0
- package/docs/release-audit-0.98.4.md +112 -0
- package/docs/release-audit-0.98.5.md +84 -0
- package/docs/review-bundle-followup.md +195 -0
- package/docs/run-protocol.md +33 -1
- package/docs/runtime-algorithms.md +45 -0
- package/docs/sdk.md +204 -2
- package/docs/sessions.md +1 -1
- package/docs/settings.md +17 -1
- package/docs/skills.md +2 -0
- package/docs/tb21-audit.md +131 -0
- package/docs/terminal-setup.md +20 -0
- package/docs/usage.md +77 -1
- package/docs/verified-run-testing.md +417 -0
- package/docs/verified-run.md +388 -0
- package/docs/windows.md +48 -0
- package/examples/README.md +4 -0
- package/examples/context/AGENTS.md +64 -0
- package/examples/context/CLAUDE.md +17 -0
- package/examples/context/INTERNET.md +42 -0
- 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/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/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 +18 -18
- package/package.json +6 -6
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { readyDagTasks } from "./dag-projection.js";
|
|
2
|
+
import { digestObject, VerifiedRunError } from "./storage.js";
|
|
3
|
+
export function taskCheckpoints(state) {
|
|
4
|
+
return state.tasks.filter((task) => task.status === "succeeded");
|
|
5
|
+
}
|
|
6
|
+
export function assertTaskSelection(contract, state, taskIds) {
|
|
7
|
+
if (contract.profile !== "linux-command-dag-v1" || !state.inputDigest || state.candidateDigest || state.writerOpen)
|
|
8
|
+
throw new VerifiedRunError("task_recovery_unavailable");
|
|
9
|
+
for (const id of taskIds) {
|
|
10
|
+
const task = state.tasks.find((task) => task.taskId === id);
|
|
11
|
+
const definition = contract.writer.tasks.find((task) => task.id === id);
|
|
12
|
+
if (!task || !definition || (task.status !== "failed" && task.status !== "running"))
|
|
13
|
+
throw new VerifiedRunError("task_not_retryable");
|
|
14
|
+
if (task.attempt >= definition.attempts.length)
|
|
15
|
+
throw new VerifiedRunError("task_attempt_limit");
|
|
16
|
+
}
|
|
17
|
+
if (state.tasks.some((task) => task.generation !== state.generation || (task.status === "running" && !taskIds.includes(task.taskId))))
|
|
18
|
+
throw new VerifiedRunError("task_selection");
|
|
19
|
+
if (!taskIds.length &&
|
|
20
|
+
!readyDagTasks(contract.writer, state).length &&
|
|
21
|
+
!state.tasks.every((task) => task.status === "succeeded"))
|
|
22
|
+
throw new VerifiedRunError("task_selection");
|
|
23
|
+
}
|
|
24
|
+
export function retryTaskProjection(context, event) {
|
|
25
|
+
const { state, contract } = context;
|
|
26
|
+
assertTaskSelection(contract, state, event.command.taskIds);
|
|
27
|
+
if (event.command.baseDigest !== state.inputDigest ||
|
|
28
|
+
state.inputDigest !== contract.workspace.baseDigest ||
|
|
29
|
+
digestObject(event.adopted) !== digestObject(taskCheckpoints(state)))
|
|
30
|
+
throw new VerifiedRunError("task_checkpoint_mismatch");
|
|
31
|
+
return state.tasks.map((task) => event.command.taskIds.includes(task.taskId)
|
|
32
|
+
? {
|
|
33
|
+
taskId: task.taskId,
|
|
34
|
+
attempt: task.attempt,
|
|
35
|
+
generation: state.generation + 1,
|
|
36
|
+
status: "pending",
|
|
37
|
+
inputDigest: null,
|
|
38
|
+
outputDigest: null,
|
|
39
|
+
failure: null,
|
|
40
|
+
}
|
|
41
|
+
: { ...task, generation: state.generation + 1 });
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=dag-retry-projection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dag-retry-projection.js","sourceRoot":"","sources":["../../../src/core/verified-run/dag-retry-projection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAE9D,MAAM,UAAU,eAAe,CAAC,KAAoB,EAAgC;IACnF,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAA6B,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;AAAA,CAC5F;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAqB,EAAE,KAAoB,EAAE,OAA0B,EAAQ;IAClH,IAAI,QAAQ,CAAC,OAAO,KAAK,sBAAsB,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,UAAU;QACjH,MAAM,IAAI,gBAAgB,CAAC,2BAA2B,CAAC,CAAC;IACzD,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC;YAClF,MAAM,IAAI,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;QAClD,IAAI,IAAI,CAAC,OAAO,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM;YAAE,MAAM,IAAI,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;IAClG,CAAC;IACD,IACC,KAAK,CAAC,KAAK,CAAC,IAAI,CACf,CAAC,IAAI,EAAE,EAAE,CACR,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CACtG;QAED,MAAM,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IAC9C,IACC,CAAC,OAAO,CAAC,MAAM;QACf,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM;QAC7C,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC;QAEzD,MAAM,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;AAAA,CAC9C;AAED,MAAM,UAAU,mBAAmB,CAClC,OAAwB,EACxB,KAAmD,EACpB;IAC/B,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACpC,mBAAmB,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,IACC,KAAK,CAAC,OAAO,CAAC,UAAU,KAAK,KAAK,CAAC,WAAW;QAC9C,KAAK,CAAC,WAAW,KAAK,QAAQ,CAAC,SAAS,CAAC,UAAU;QACnD,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,YAAY,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAEpE,MAAM,IAAI,gBAAgB,CAAC,0BAA0B,CAAC,CAAC;IACxD,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CACrB,CAAC,IAAI,EAAqB,EAAE,CAC3B,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QAC1C,CAAC,CAAC;YACA,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,CAAC;YAChC,MAAM,EAAE,SAAS;YACjB,WAAW,EAAE,IAAI;YACjB,YAAY,EAAE,IAAI;YAClB,OAAO,EAAE,IAAI;SACb;QACF,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,CAAC,EAAE,CACjD,CAAC;AAAA,CACF","sourcesContent":["import type { RunContract } from \"omk-protocol\";\nimport { readyDagTasks } from \"./dag-projection.ts\";\nimport type { RunTaskCheckpoint, RunTaskProjection } from \"./dag-types.ts\";\nimport type { RunEvent, RunProjection, WriterReduction } from \"./run-types.ts\";\nimport { digestObject, VerifiedRunError } from \"./storage.ts\";\n\nexport function taskCheckpoints(state: RunProjection): readonly RunTaskCheckpoint[] {\n\treturn state.tasks.filter((task): task is RunTaskCheckpoint => task.status === \"succeeded\");\n}\n\nexport function assertTaskSelection(contract: RunContract, state: RunProjection, taskIds: readonly string[]): void {\n\tif (contract.profile !== \"linux-command-dag-v1\" || !state.inputDigest || state.candidateDigest || state.writerOpen)\n\t\tthrow new VerifiedRunError(\"task_recovery_unavailable\");\n\tfor (const id of taskIds) {\n\t\tconst task = state.tasks.find((task) => task.taskId === id);\n\t\tconst definition = contract.writer.tasks.find((task) => task.id === id);\n\t\tif (!task || !definition || (task.status !== \"failed\" && task.status !== \"running\"))\n\t\t\tthrow new VerifiedRunError(\"task_not_retryable\");\n\t\tif (task.attempt >= definition.attempts.length) throw new VerifiedRunError(\"task_attempt_limit\");\n\t}\n\tif (\n\t\tstate.tasks.some(\n\t\t\t(task) =>\n\t\t\t\ttask.generation !== state.generation || (task.status === \"running\" && !taskIds.includes(task.taskId)),\n\t\t)\n\t)\n\t\tthrow new VerifiedRunError(\"task_selection\");\n\tif (\n\t\t!taskIds.length &&\n\t\t!readyDagTasks(contract.writer, state).length &&\n\t\t!state.tasks.every((task) => task.status === \"succeeded\")\n\t)\n\t\tthrow new VerifiedRunError(\"task_selection\");\n}\n\nexport function retryTaskProjection(\n\tcontext: WriterReduction,\n\tevent: Extract<RunEvent, { kind: \"tasks_retried\" }>,\n): readonly RunTaskProjection[] {\n\tconst { state, contract } = context;\n\tassertTaskSelection(contract, state, event.command.taskIds);\n\tif (\n\t\tevent.command.baseDigest !== state.inputDigest ||\n\t\tstate.inputDigest !== contract.workspace.baseDigest ||\n\t\tdigestObject(event.adopted) !== digestObject(taskCheckpoints(state))\n\t)\n\t\tthrow new VerifiedRunError(\"task_checkpoint_mismatch\");\n\treturn state.tasks.map(\n\t\t(task): RunTaskProjection =>\n\t\t\tevent.command.taskIds.includes(task.taskId)\n\t\t\t\t? {\n\t\t\t\t\t\ttaskId: task.taskId,\n\t\t\t\t\t\tattempt: task.attempt,\n\t\t\t\t\t\tgeneration: state.generation + 1,\n\t\t\t\t\t\tstatus: \"pending\",\n\t\t\t\t\t\tinputDigest: null,\n\t\t\t\t\t\toutputDigest: null,\n\t\t\t\t\t\tfailure: null,\n\t\t\t\t\t}\n\t\t\t\t: { ...task, generation: state.generation + 1 },\n\t);\n}\n"]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
interface TaskIdentity {
|
|
2
|
+
readonly taskId: string;
|
|
3
|
+
readonly attempt: number;
|
|
4
|
+
readonly generation: number;
|
|
5
|
+
}
|
|
6
|
+
export type RunTaskProjection = TaskIdentity & ({
|
|
7
|
+
readonly status: "pending";
|
|
8
|
+
readonly inputDigest: null;
|
|
9
|
+
readonly outputDigest: null;
|
|
10
|
+
readonly failure: null;
|
|
11
|
+
} | {
|
|
12
|
+
readonly status: "running";
|
|
13
|
+
readonly inputDigest: string;
|
|
14
|
+
readonly outputDigest: null;
|
|
15
|
+
readonly failure: null;
|
|
16
|
+
} | {
|
|
17
|
+
readonly status: "succeeded";
|
|
18
|
+
readonly inputDigest: string;
|
|
19
|
+
readonly outputDigest: string;
|
|
20
|
+
readonly failure: null;
|
|
21
|
+
} | {
|
|
22
|
+
readonly status: "failed";
|
|
23
|
+
readonly inputDigest: string;
|
|
24
|
+
readonly outputDigest: null;
|
|
25
|
+
readonly failure: string;
|
|
26
|
+
});
|
|
27
|
+
export type RunTaskCheckpoint = Extract<RunTaskProjection, {
|
|
28
|
+
status: "succeeded";
|
|
29
|
+
}>;
|
|
30
|
+
export type DagEvent = {
|
|
31
|
+
readonly kind: "task_started";
|
|
32
|
+
readonly taskId: string;
|
|
33
|
+
readonly attempt: number;
|
|
34
|
+
readonly inputDigest: string;
|
|
35
|
+
readonly observedMs: number;
|
|
36
|
+
} | {
|
|
37
|
+
readonly kind: "task_finished";
|
|
38
|
+
readonly taskId: string;
|
|
39
|
+
readonly attempt: number;
|
|
40
|
+
readonly outputDigest: string | null;
|
|
41
|
+
readonly failure: string | null;
|
|
42
|
+
readonly observedMs: number;
|
|
43
|
+
} | {
|
|
44
|
+
readonly kind: "tasks_paused";
|
|
45
|
+
};
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=dag-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dag-types.d.ts","sourceRoot":"","sources":["../../../src/core/verified-run/dag-types.ts"],"names":[],"mappings":"AAAA,UAAU,YAAY;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC5B;AACD,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAC3C,CACG;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAA;CAAE,GAC/G;IACA,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;CACtB,GACD;IACA,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;CACtB,GACD;IACA,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CACxB,CACH,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,EAAE;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,CAAC,CAAC;AACpF,MAAM,MAAM,QAAQ,GACjB;IACA,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC3B,GACD;IACA,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC3B,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;CAAE,CAAC","sourcesContent":["interface TaskIdentity {\n\treadonly taskId: string;\n\treadonly attempt: number;\n\treadonly generation: number;\n}\nexport type RunTaskProjection = TaskIdentity &\n\t(\n\t\t| { readonly status: \"pending\"; readonly inputDigest: null; readonly outputDigest: null; readonly failure: null }\n\t\t| {\n\t\t\t\treadonly status: \"running\";\n\t\t\t\treadonly inputDigest: string;\n\t\t\t\treadonly outputDigest: null;\n\t\t\t\treadonly failure: null;\n\t\t }\n\t\t| {\n\t\t\t\treadonly status: \"succeeded\";\n\t\t\t\treadonly inputDigest: string;\n\t\t\t\treadonly outputDigest: string;\n\t\t\t\treadonly failure: null;\n\t\t }\n\t\t| {\n\t\t\t\treadonly status: \"failed\";\n\t\t\t\treadonly inputDigest: string;\n\t\t\t\treadonly outputDigest: null;\n\t\t\t\treadonly failure: string;\n\t\t }\n\t);\nexport type RunTaskCheckpoint = Extract<RunTaskProjection, { status: \"succeeded\" }>;\nexport type DagEvent =\n\t| {\n\t\t\treadonly kind: \"task_started\";\n\t\t\treadonly taskId: string;\n\t\t\treadonly attempt: number;\n\t\t\treadonly inputDigest: string;\n\t\t\treadonly observedMs: number;\n\t }\n\t| {\n\t\t\treadonly kind: \"task_finished\";\n\t\t\treadonly taskId: string;\n\t\t\treadonly attempt: number;\n\t\t\treadonly outputDigest: string | null;\n\t\t\treadonly failure: string | null;\n\t\t\treadonly observedMs: number;\n\t }\n\t| { readonly kind: \"tasks_paused\" };\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dag-types.js","sourceRoot":"","sources":["../../../src/core/verified-run/dag-types.ts"],"names":[],"mappings":"","sourcesContent":["interface TaskIdentity {\n\treadonly taskId: string;\n\treadonly attempt: number;\n\treadonly generation: number;\n}\nexport type RunTaskProjection = TaskIdentity &\n\t(\n\t\t| { readonly status: \"pending\"; readonly inputDigest: null; readonly outputDigest: null; readonly failure: null }\n\t\t| {\n\t\t\t\treadonly status: \"running\";\n\t\t\t\treadonly inputDigest: string;\n\t\t\t\treadonly outputDigest: null;\n\t\t\t\treadonly failure: null;\n\t\t }\n\t\t| {\n\t\t\t\treadonly status: \"succeeded\";\n\t\t\t\treadonly inputDigest: string;\n\t\t\t\treadonly outputDigest: string;\n\t\t\t\treadonly failure: null;\n\t\t }\n\t\t| {\n\t\t\t\treadonly status: \"failed\";\n\t\t\t\treadonly inputDigest: string;\n\t\t\t\treadonly outputDigest: null;\n\t\t\t\treadonly failure: string;\n\t\t }\n\t);\nexport type RunTaskCheckpoint = Extract<RunTaskProjection, { status: \"succeeded\" }>;\nexport type DagEvent =\n\t| {\n\t\t\treadonly kind: \"task_started\";\n\t\t\treadonly taskId: string;\n\t\t\treadonly attempt: number;\n\t\t\treadonly inputDigest: string;\n\t\t\treadonly observedMs: number;\n\t }\n\t| {\n\t\t\treadonly kind: \"task_finished\";\n\t\t\treadonly taskId: string;\n\t\t\treadonly attempt: number;\n\t\t\treadonly outputDigest: string | null;\n\t\t\treadonly failure: string | null;\n\t\t\treadonly observedMs: number;\n\t }\n\t| { readonly kind: \"tasks_paused\" };\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-parser.d.ts","sourceRoot":"","sources":["../../../src/core/verified-run/event-parser.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAgC/C,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,QAAQ,CA6GpD","sourcesContent":["import {\n\tparseRunContract,\n\tparseRunResumeCommand,\n\tparseRunStartCommand,\n\tparseRunTaskRetryCommand,\n\tparseRunWriterRestartCommand,\n} from \"omk-protocol\";\nimport type { RunTaskCheckpoint } from \"./dag-types.ts\";\nimport { parseNamespaceIdentity } from \"./namespace-identity.ts\";\nimport { parseRecoveryBudget } from \"./recovery-clock.ts\";\nimport type { RunEvent } from \"./run-types.ts\";\nimport { VerifiedRunError } from \"./storage.ts\";\n\nfunction text(value: unknown): string {\n\tif (typeof value !== \"string\" || !/^[A-Za-z0-9_-]{1,128}$/.test(value)) throw new VerifiedRunError(\"integrity\");\n\treturn value;\n}\nfunction digest(value: unknown): string {\n\tconst result = text(value);\n\tif (!/^[a-f0-9]{64}$/.test(result)) throw new VerifiedRunError(\"integrity\");\n\treturn result;\n}\nfunction integer(value: unknown): number {\n\tif (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < 0) throw new VerifiedRunError(\"integrity\");\n\treturn value;\n}\n\nfunction checkpoint(raw: unknown): RunTaskCheckpoint {\n\tif (typeof raw !== \"object\" || raw === null) throw new VerifiedRunError(\"integrity\");\n\tconst value: Record<string, unknown> = Object.fromEntries(Object.entries(raw));\n\tif (value.status !== \"succeeded\" || value.failure !== null) throw new VerifiedRunError(\"integrity\");\n\treturn Object.freeze({\n\t\ttaskId: text(value.taskId),\n\t\tattempt: integer(value.attempt),\n\t\tgeneration: integer(value.generation),\n\t\tstatus: \"succeeded\",\n\t\tinputDigest: digest(value.inputDigest),\n\t\toutputDigest: digest(value.outputDigest),\n\t\tfailure: null,\n\t});\n}\n\nexport function parseRunEvent(raw: unknown): RunEvent {\n\tif (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) throw new VerifiedRunError(\"integrity\");\n\tconst value: Record<string, unknown> = Object.fromEntries(Object.entries(raw));\n\tswitch (value.kind) {\n\t\tcase \"created\":\n\t\t\treturn {\n\t\t\t\tkind: value.kind,\n\t\t\t\tcontract: parseRunContract(value.contract),\n\t\t\t\tcommand: parseRunStartCommand(value.command),\n\t\t\t};\n\t\tcase \"budget_anchored\":\n\t\t\tif (value.driver !== \"linux-pidns-gate-v1\") throw new VerifiedRunError(\"integrity\");\n\t\t\treturn {\n\t\t\t\tkind: value.kind,\n\t\t\t\tbudget: parseRecoveryBudget(value.budget),\n\t\t\t\tenvironmentDigest: digest(value.environmentDigest),\n\t\t\t\tdriver: value.driver,\n\t\t\t};\n\t\tcase \"dispatch\": {\n\t\t\tif (value.role !== \"writer\" && value.role !== \"verifier\") throw new VerifiedRunError(\"integrity\");\n\t\t\treturn {\n\t\t\t\tkind: value.kind,\n\t\t\t\texecutionId: text(value.executionId),\n\t\t\t\trole: value.role,\n\t\t\t\tclaimId: value.claimId === null ? null : text(value.claimId),\n\t\t\t};\n\t\t}\n\t\tcase \"input_checkpoint\":\n\t\t\treturn { kind: value.kind, digest: digest(value.digest) };\n\t\tcase \"process_ready\":\n\t\t\treturn {\n\t\t\t\tkind: value.kind,\n\t\t\t\texecutionId: text(value.executionId),\n\t\t\t\tidentity: parseNamespaceIdentity(value.identity),\n\t\t\t};\n\t\tcase \"task_started\":\n\t\t\treturn {\n\t\t\t\tkind: value.kind,\n\t\t\t\ttaskId: text(value.taskId),\n\t\t\t\tattempt: integer(value.attempt),\n\t\t\t\tinputDigest: digest(value.inputDigest),\n\t\t\t\tobservedMs: integer(value.observedMs),\n\t\t\t};\n\t\tcase \"task_finished\":\n\t\t\treturn {\n\t\t\t\tkind: value.kind,\n\t\t\t\ttaskId: text(value.taskId),\n\t\t\t\tattempt: integer(value.attempt),\n\t\t\t\toutputDigest: value.outputDigest === null ? null : digest(value.outputDigest),\n\t\t\t\tfailure: value.failure === null ? null : text(value.failure),\n\t\t\t\tobservedMs: integer(value.observedMs),\n\t\t\t};\n\t\tcase \"tasks_paused\":\n\t\tcase \"writer_opened\":\n\t\t\treturn { kind: value.kind };\n\t\tcase \"model_request\":\n\t\t\treturn { kind: value.kind, requestId: text(value.requestId) };\n\t\tcase \"writer_closed\":\n\t\t\tif (typeof value.completed !== \"boolean\") throw new VerifiedRunError(\"integrity\");\n\t\t\treturn { kind: value.kind, completed: value.completed };\n\t\tcase \"exited\":\n\t\t\treturn {\n\t\t\t\tkind: value.kind,\n\t\t\t\texecutionId: text(value.executionId),\n\t\t\t\tfailure: value.failure === null ? null : text(value.failure),\n\t\t\t};\n\t\tcase \"candidate\":\n\t\t\treturn {\n\t\t\t\tkind: value.kind,\n\t\t\t\tdigest: digest(value.digest),\n\t\t\t\t...(value.observedMs === undefined ? {} : { observedMs: integer(value.observedMs) }),\n\t\t\t\t...(value.verificationDeadlineMs === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { verificationDeadlineMs: integer(value.verificationDeadlineMs) }),\n\t\t\t};\n\t\tcase \"resumed\":\n\t\tcase \"tasks_retried\":\n\t\tcase \"writer_restarted\": {\n\t\t\tif (!Array.isArray(value.reconciledExecutionIds) || value.reconciledExecutionIds.length > 128)\n\t\t\t\tthrow new VerifiedRunError(\"integrity\");\n\t\t\tconst fields = {\n\t\t\t\tobservedMs: integer(value.observedMs),\n\t\t\t\treconciledExecutionIds: Object.freeze(value.reconciledExecutionIds.map(text)),\n\t\t\t};\n\t\t\tswitch (value.kind) {\n\t\t\t\tcase \"resumed\":\n\t\t\t\t\treturn { ...fields, kind: value.kind, command: parseRunResumeCommand(value.command) };\n\t\t\t\tcase \"writer_restarted\":\n\t\t\t\t\treturn { ...fields, kind: value.kind, command: parseRunWriterRestartCommand(value.command) };\n\t\t\t\tcase \"tasks_retried\":\n\t\t\t\t\tif (!Array.isArray(value.adopted) || value.adopted.length > 16) throw new VerifiedRunError(\"integrity\");\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...fields,\n\t\t\t\t\t\tkind: value.kind,\n\t\t\t\t\t\tcommand: parseRunTaskRetryCommand(value.command),\n\t\t\t\t\t\tadopted: Object.freeze(value.adopted.map(checkpoint)),\n\t\t\t\t\t};\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new VerifiedRunError(\"integrity\");\n\t\t\t}\n\t\t}\n\t\tcase \"evaluated\":\n\t\t\tif (typeof value.verified !== \"boolean\") throw new VerifiedRunError(\"integrity\");\n\t\t\treturn { kind: value.kind, receiptDigest: digest(value.receiptDigest), verified: value.verified };\n\t\tcase \"failed\":\n\t\t\treturn { kind: value.kind, code: text(value.code) };\n\t\tdefault:\n\t\t\tthrow new VerifiedRunError(\"integrity\");\n\t}\n}\n"]}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { parseRunContract, parseRunResumeCommand, parseRunStartCommand, parseRunTaskRetryCommand, parseRunWriterRestartCommand, } from "omk-protocol";
|
|
2
|
+
import { parseNamespaceIdentity } from "./namespace-identity.js";
|
|
3
|
+
import { parseRecoveryBudget } from "./recovery-clock.js";
|
|
4
|
+
import { VerifiedRunError } from "./storage.js";
|
|
5
|
+
function text(value) {
|
|
6
|
+
if (typeof value !== "string" || !/^[A-Za-z0-9_-]{1,128}$/.test(value))
|
|
7
|
+
throw new VerifiedRunError("integrity");
|
|
8
|
+
return value;
|
|
9
|
+
}
|
|
10
|
+
function digest(value) {
|
|
11
|
+
const result = text(value);
|
|
12
|
+
if (!/^[a-f0-9]{64}$/.test(result))
|
|
13
|
+
throw new VerifiedRunError("integrity");
|
|
14
|
+
return result;
|
|
15
|
+
}
|
|
16
|
+
function integer(value) {
|
|
17
|
+
if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 0)
|
|
18
|
+
throw new VerifiedRunError("integrity");
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
function checkpoint(raw) {
|
|
22
|
+
if (typeof raw !== "object" || raw === null)
|
|
23
|
+
throw new VerifiedRunError("integrity");
|
|
24
|
+
const value = Object.fromEntries(Object.entries(raw));
|
|
25
|
+
if (value.status !== "succeeded" || value.failure !== null)
|
|
26
|
+
throw new VerifiedRunError("integrity");
|
|
27
|
+
return Object.freeze({
|
|
28
|
+
taskId: text(value.taskId),
|
|
29
|
+
attempt: integer(value.attempt),
|
|
30
|
+
generation: integer(value.generation),
|
|
31
|
+
status: "succeeded",
|
|
32
|
+
inputDigest: digest(value.inputDigest),
|
|
33
|
+
outputDigest: digest(value.outputDigest),
|
|
34
|
+
failure: null,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
export function parseRunEvent(raw) {
|
|
38
|
+
if (typeof raw !== "object" || raw === null || Array.isArray(raw))
|
|
39
|
+
throw new VerifiedRunError("integrity");
|
|
40
|
+
const value = Object.fromEntries(Object.entries(raw));
|
|
41
|
+
switch (value.kind) {
|
|
42
|
+
case "created":
|
|
43
|
+
return {
|
|
44
|
+
kind: value.kind,
|
|
45
|
+
contract: parseRunContract(value.contract),
|
|
46
|
+
command: parseRunStartCommand(value.command),
|
|
47
|
+
};
|
|
48
|
+
case "budget_anchored":
|
|
49
|
+
if (value.driver !== "linux-pidns-gate-v1")
|
|
50
|
+
throw new VerifiedRunError("integrity");
|
|
51
|
+
return {
|
|
52
|
+
kind: value.kind,
|
|
53
|
+
budget: parseRecoveryBudget(value.budget),
|
|
54
|
+
environmentDigest: digest(value.environmentDigest),
|
|
55
|
+
driver: value.driver,
|
|
56
|
+
};
|
|
57
|
+
case "dispatch": {
|
|
58
|
+
if (value.role !== "writer" && value.role !== "verifier")
|
|
59
|
+
throw new VerifiedRunError("integrity");
|
|
60
|
+
return {
|
|
61
|
+
kind: value.kind,
|
|
62
|
+
executionId: text(value.executionId),
|
|
63
|
+
role: value.role,
|
|
64
|
+
claimId: value.claimId === null ? null : text(value.claimId),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
case "input_checkpoint":
|
|
68
|
+
return { kind: value.kind, digest: digest(value.digest) };
|
|
69
|
+
case "process_ready":
|
|
70
|
+
return {
|
|
71
|
+
kind: value.kind,
|
|
72
|
+
executionId: text(value.executionId),
|
|
73
|
+
identity: parseNamespaceIdentity(value.identity),
|
|
74
|
+
};
|
|
75
|
+
case "task_started":
|
|
76
|
+
return {
|
|
77
|
+
kind: value.kind,
|
|
78
|
+
taskId: text(value.taskId),
|
|
79
|
+
attempt: integer(value.attempt),
|
|
80
|
+
inputDigest: digest(value.inputDigest),
|
|
81
|
+
observedMs: integer(value.observedMs),
|
|
82
|
+
};
|
|
83
|
+
case "task_finished":
|
|
84
|
+
return {
|
|
85
|
+
kind: value.kind,
|
|
86
|
+
taskId: text(value.taskId),
|
|
87
|
+
attempt: integer(value.attempt),
|
|
88
|
+
outputDigest: value.outputDigest === null ? null : digest(value.outputDigest),
|
|
89
|
+
failure: value.failure === null ? null : text(value.failure),
|
|
90
|
+
observedMs: integer(value.observedMs),
|
|
91
|
+
};
|
|
92
|
+
case "tasks_paused":
|
|
93
|
+
case "writer_opened":
|
|
94
|
+
return { kind: value.kind };
|
|
95
|
+
case "model_request":
|
|
96
|
+
return { kind: value.kind, requestId: text(value.requestId) };
|
|
97
|
+
case "writer_closed":
|
|
98
|
+
if (typeof value.completed !== "boolean")
|
|
99
|
+
throw new VerifiedRunError("integrity");
|
|
100
|
+
return { kind: value.kind, completed: value.completed };
|
|
101
|
+
case "exited":
|
|
102
|
+
return {
|
|
103
|
+
kind: value.kind,
|
|
104
|
+
executionId: text(value.executionId),
|
|
105
|
+
failure: value.failure === null ? null : text(value.failure),
|
|
106
|
+
};
|
|
107
|
+
case "candidate":
|
|
108
|
+
return {
|
|
109
|
+
kind: value.kind,
|
|
110
|
+
digest: digest(value.digest),
|
|
111
|
+
...(value.observedMs === undefined ? {} : { observedMs: integer(value.observedMs) }),
|
|
112
|
+
...(value.verificationDeadlineMs === undefined
|
|
113
|
+
? {}
|
|
114
|
+
: { verificationDeadlineMs: integer(value.verificationDeadlineMs) }),
|
|
115
|
+
};
|
|
116
|
+
case "resumed":
|
|
117
|
+
case "tasks_retried":
|
|
118
|
+
case "writer_restarted": {
|
|
119
|
+
if (!Array.isArray(value.reconciledExecutionIds) || value.reconciledExecutionIds.length > 128)
|
|
120
|
+
throw new VerifiedRunError("integrity");
|
|
121
|
+
const fields = {
|
|
122
|
+
observedMs: integer(value.observedMs),
|
|
123
|
+
reconciledExecutionIds: Object.freeze(value.reconciledExecutionIds.map(text)),
|
|
124
|
+
};
|
|
125
|
+
switch (value.kind) {
|
|
126
|
+
case "resumed":
|
|
127
|
+
return { ...fields, kind: value.kind, command: parseRunResumeCommand(value.command) };
|
|
128
|
+
case "writer_restarted":
|
|
129
|
+
return { ...fields, kind: value.kind, command: parseRunWriterRestartCommand(value.command) };
|
|
130
|
+
case "tasks_retried":
|
|
131
|
+
if (!Array.isArray(value.adopted) || value.adopted.length > 16)
|
|
132
|
+
throw new VerifiedRunError("integrity");
|
|
133
|
+
return {
|
|
134
|
+
...fields,
|
|
135
|
+
kind: value.kind,
|
|
136
|
+
command: parseRunTaskRetryCommand(value.command),
|
|
137
|
+
adopted: Object.freeze(value.adopted.map(checkpoint)),
|
|
138
|
+
};
|
|
139
|
+
default:
|
|
140
|
+
throw new VerifiedRunError("integrity");
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
case "evaluated":
|
|
144
|
+
if (typeof value.verified !== "boolean")
|
|
145
|
+
throw new VerifiedRunError("integrity");
|
|
146
|
+
return { kind: value.kind, receiptDigest: digest(value.receiptDigest), verified: value.verified };
|
|
147
|
+
case "failed":
|
|
148
|
+
return { kind: value.kind, code: text(value.code) };
|
|
149
|
+
default:
|
|
150
|
+
throw new VerifiedRunError("integrity");
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=event-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-parser.js","sourceRoot":"","sources":["../../../src/core/verified-run/event-parser.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tparseRunContract,\n\tparseRunResumeCommand,\n\tparseRunStartCommand,\n\tparseRunTaskRetryCommand,\n\tparseRunWriterRestartCommand,\n} from \"omk-protocol\";\nimport type { RunTaskCheckpoint } from \"./dag-types.ts\";\nimport { parseNamespaceIdentity } from \"./namespace-identity.ts\";\nimport { parseRecoveryBudget } from \"./recovery-clock.ts\";\nimport type { RunEvent } from \"./run-types.ts\";\nimport { VerifiedRunError } from \"./storage.ts\";\n\nfunction text(value: unknown): string {\n\tif (typeof value !== \"string\" || !/^[A-Za-z0-9_-]{1,128}$/.test(value)) throw new VerifiedRunError(\"integrity\");\n\treturn value;\n}\nfunction digest(value: unknown): string {\n\tconst result = text(value);\n\tif (!/^[a-f0-9]{64}$/.test(result)) throw new VerifiedRunError(\"integrity\");\n\treturn result;\n}\nfunction integer(value: unknown): number {\n\tif (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < 0) throw new VerifiedRunError(\"integrity\");\n\treturn value;\n}\n\nfunction checkpoint(raw: unknown): RunTaskCheckpoint {\n\tif (typeof raw !== \"object\" || raw === null) throw new VerifiedRunError(\"integrity\");\n\tconst value: Record<string, unknown> = Object.fromEntries(Object.entries(raw));\n\tif (value.status !== \"succeeded\" || value.failure !== null) throw new VerifiedRunError(\"integrity\");\n\treturn Object.freeze({\n\t\ttaskId: text(value.taskId),\n\t\tattempt: integer(value.attempt),\n\t\tgeneration: integer(value.generation),\n\t\tstatus: \"succeeded\",\n\t\tinputDigest: digest(value.inputDigest),\n\t\toutputDigest: digest(value.outputDigest),\n\t\tfailure: null,\n\t});\n}\n\nexport function parseRunEvent(raw: unknown): RunEvent {\n\tif (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) throw new VerifiedRunError(\"integrity\");\n\tconst value: Record<string, unknown> = Object.fromEntries(Object.entries(raw));\n\tswitch (value.kind) {\n\t\tcase \"created\":\n\t\t\treturn {\n\t\t\t\tkind: value.kind,\n\t\t\t\tcontract: parseRunContract(value.contract),\n\t\t\t\tcommand: parseRunStartCommand(value.command),\n\t\t\t};\n\t\tcase \"budget_anchored\":\n\t\t\tif (value.driver !== \"linux-pidns-gate-v1\") throw new VerifiedRunError(\"integrity\");\n\t\t\treturn {\n\t\t\t\tkind: value.kind,\n\t\t\t\tbudget: parseRecoveryBudget(value.budget),\n\t\t\t\tenvironmentDigest: digest(value.environmentDigest),\n\t\t\t\tdriver: value.driver,\n\t\t\t};\n\t\tcase \"dispatch\": {\n\t\t\tif (value.role !== \"writer\" && value.role !== \"verifier\") throw new VerifiedRunError(\"integrity\");\n\t\t\treturn {\n\t\t\t\tkind: value.kind,\n\t\t\t\texecutionId: text(value.executionId),\n\t\t\t\trole: value.role,\n\t\t\t\tclaimId: value.claimId === null ? null : text(value.claimId),\n\t\t\t};\n\t\t}\n\t\tcase \"input_checkpoint\":\n\t\t\treturn { kind: value.kind, digest: digest(value.digest) };\n\t\tcase \"process_ready\":\n\t\t\treturn {\n\t\t\t\tkind: value.kind,\n\t\t\t\texecutionId: text(value.executionId),\n\t\t\t\tidentity: parseNamespaceIdentity(value.identity),\n\t\t\t};\n\t\tcase \"task_started\":\n\t\t\treturn {\n\t\t\t\tkind: value.kind,\n\t\t\t\ttaskId: text(value.taskId),\n\t\t\t\tattempt: integer(value.attempt),\n\t\t\t\tinputDigest: digest(value.inputDigest),\n\t\t\t\tobservedMs: integer(value.observedMs),\n\t\t\t};\n\t\tcase \"task_finished\":\n\t\t\treturn {\n\t\t\t\tkind: value.kind,\n\t\t\t\ttaskId: text(value.taskId),\n\t\t\t\tattempt: integer(value.attempt),\n\t\t\t\toutputDigest: value.outputDigest === null ? null : digest(value.outputDigest),\n\t\t\t\tfailure: value.failure === null ? null : text(value.failure),\n\t\t\t\tobservedMs: integer(value.observedMs),\n\t\t\t};\n\t\tcase \"tasks_paused\":\n\t\tcase \"writer_opened\":\n\t\t\treturn { kind: value.kind };\n\t\tcase \"model_request\":\n\t\t\treturn { kind: value.kind, requestId: text(value.requestId) };\n\t\tcase \"writer_closed\":\n\t\t\tif (typeof value.completed !== \"boolean\") throw new VerifiedRunError(\"integrity\");\n\t\t\treturn { kind: value.kind, completed: value.completed };\n\t\tcase \"exited\":\n\t\t\treturn {\n\t\t\t\tkind: value.kind,\n\t\t\t\texecutionId: text(value.executionId),\n\t\t\t\tfailure: value.failure === null ? null : text(value.failure),\n\t\t\t};\n\t\tcase \"candidate\":\n\t\t\treturn {\n\t\t\t\tkind: value.kind,\n\t\t\t\tdigest: digest(value.digest),\n\t\t\t\t...(value.observedMs === undefined ? {} : { observedMs: integer(value.observedMs) }),\n\t\t\t\t...(value.verificationDeadlineMs === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { verificationDeadlineMs: integer(value.verificationDeadlineMs) }),\n\t\t\t};\n\t\tcase \"resumed\":\n\t\tcase \"tasks_retried\":\n\t\tcase \"writer_restarted\": {\n\t\t\tif (!Array.isArray(value.reconciledExecutionIds) || value.reconciledExecutionIds.length > 128)\n\t\t\t\tthrow new VerifiedRunError(\"integrity\");\n\t\t\tconst fields = {\n\t\t\t\tobservedMs: integer(value.observedMs),\n\t\t\t\treconciledExecutionIds: Object.freeze(value.reconciledExecutionIds.map(text)),\n\t\t\t};\n\t\t\tswitch (value.kind) {\n\t\t\t\tcase \"resumed\":\n\t\t\t\t\treturn { ...fields, kind: value.kind, command: parseRunResumeCommand(value.command) };\n\t\t\t\tcase \"writer_restarted\":\n\t\t\t\t\treturn { ...fields, kind: value.kind, command: parseRunWriterRestartCommand(value.command) };\n\t\t\t\tcase \"tasks_retried\":\n\t\t\t\t\tif (!Array.isArray(value.adopted) || value.adopted.length > 16) throw new VerifiedRunError(\"integrity\");\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...fields,\n\t\t\t\t\t\tkind: value.kind,\n\t\t\t\t\t\tcommand: parseRunTaskRetryCommand(value.command),\n\t\t\t\t\t\tadopted: Object.freeze(value.adopted.map(checkpoint)),\n\t\t\t\t\t};\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new VerifiedRunError(\"integrity\");\n\t\t\t}\n\t\t}\n\t\tcase \"evaluated\":\n\t\t\tif (typeof value.verified !== \"boolean\") throw new VerifiedRunError(\"integrity\");\n\t\t\treturn { kind: value.kind, receiptDigest: digest(value.receiptDigest), verified: value.verified };\n\t\tcase \"failed\":\n\t\t\treturn { kind: value.kind, code: text(value.code) };\n\t\tdefault:\n\t\t\tthrow new VerifiedRunError(\"integrity\");\n\t}\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/core/verified-run/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC","sourcesContent":["export { parseRunEvent } from \"./event-parser.ts\";\nexport { projectRun } from \"./projection.ts\";\nexport type { RunEvent, RunProjection } from \"./run-types.ts\";\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/core/verified-run/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC","sourcesContent":["export { parseRunEvent } from \"./event-parser.ts\";\nexport { projectRun } from \"./projection.ts\";\nexport type { RunEvent, RunProjection } from \"./run-types.ts\";\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type RunContract } from "omk-protocol";
|
|
2
|
+
export interface CheckObservation {
|
|
3
|
+
readonly claimId: string;
|
|
4
|
+
readonly executionId: string;
|
|
5
|
+
readonly stdoutDigest: string;
|
|
6
|
+
readonly stderrDigest: string;
|
|
7
|
+
readonly exitCode: number | null;
|
|
8
|
+
readonly failure: string | null;
|
|
9
|
+
readonly receiptCoreDigest?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function parseCheckObservations(value: unknown, nativeRequired: boolean): readonly CheckObservation[];
|
|
12
|
+
/** Only the authenticated adapter supplies these observations; the reducer itself grants no trust. */
|
|
13
|
+
export declare function closesRunClaims(contract: RunContract, context: {
|
|
14
|
+
readonly candidate: string;
|
|
15
|
+
readonly environment: string;
|
|
16
|
+
readonly checks: readonly CheckObservation[];
|
|
17
|
+
}): boolean;
|
|
18
|
+
//# sourceMappingURL=evidence-binding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-binding.d.ts","sourceRoot":"","sources":["../../../src/core/verified-run/evidence-binding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoD,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAGlG,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,GAAG,SAAS,gBAAgB,EAAE,CAuC3G;AAED,sGAAsG;AACtG,wBAAgB,eAAe,CAC9B,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,CAAA;CAAE,GACjH,OAAO,CA2CT","sourcesContent":["import { CLAIM_GRAPH_SCHEMA_VERSION, evaluateProofClosure, type RunContract } from \"omk-protocol\";\nimport { digestBytes, VerifiedRunError } from \"./storage.ts\";\n\nexport interface CheckObservation {\n\treadonly claimId: string;\n\treadonly executionId: string;\n\treadonly stdoutDigest: string;\n\treadonly stderrDigest: string;\n\treadonly exitCode: number | null;\n\treadonly failure: string | null;\n\treadonly receiptCoreDigest?: string;\n}\n\nexport function parseCheckObservations(value: unknown, nativeRequired: boolean): readonly CheckObservation[] {\n\tif (!Array.isArray(value) || value.length > 32) throw new VerifiedRunError(\"integrity\");\n\tconst rawChecks: readonly unknown[] = value;\n\treturn Object.freeze(\n\t\trawChecks.map((raw): CheckObservation => {\n\t\t\tif (\n\t\t\t\ttypeof raw !== \"object\" ||\n\t\t\t\traw === null ||\n\t\t\t\t!(\"claimId\" in raw) ||\n\t\t\t\ttypeof raw.claimId !== \"string\" ||\n\t\t\t\t!(\"executionId\" in raw) ||\n\t\t\t\ttypeof raw.executionId !== \"string\" ||\n\t\t\t\t!(\"stdoutDigest\" in raw) ||\n\t\t\t\ttypeof raw.stdoutDigest !== \"string\" ||\n\t\t\t\t!/^[a-f0-9]{64}$/.test(raw.stdoutDigest) ||\n\t\t\t\t!(\"stderrDigest\" in raw) ||\n\t\t\t\ttypeof raw.stderrDigest !== \"string\" ||\n\t\t\t\t!/^[a-f0-9]{64}$/.test(raw.stderrDigest) ||\n\t\t\t\t!(\"exitCode\" in raw) ||\n\t\t\t\t(raw.exitCode !== null && (typeof raw.exitCode !== \"number\" || !Number.isSafeInteger(raw.exitCode))) ||\n\t\t\t\t!(\"failure\" in raw) ||\n\t\t\t\t(raw.failure !== null && typeof raw.failure !== \"string\")\n\t\t\t)\n\t\t\t\tthrow new VerifiedRunError(\"integrity\");\n\t\t\tconst native = \"receiptCoreDigest\" in raw ? raw.receiptCoreDigest : undefined;\n\t\t\tif (nativeRequired && (typeof native !== \"string\" || !/^[a-f0-9]{64}$/.test(native)))\n\t\t\t\tthrow new VerifiedRunError(\"integrity\");\n\t\t\tif (!nativeRequired && native !== undefined) throw new VerifiedRunError(\"integrity\");\n\t\t\treturn Object.freeze({\n\t\t\t\tclaimId: raw.claimId,\n\t\t\t\texecutionId: raw.executionId,\n\t\t\t\tstdoutDigest: raw.stdoutDigest,\n\t\t\t\tstderrDigest: raw.stderrDigest,\n\t\t\t\texitCode: raw.exitCode,\n\t\t\t\tfailure: raw.failure,\n\t\t\t\t...(typeof native === \"string\" ? { receiptCoreDigest: native } : {}),\n\t\t\t});\n\t\t}),\n\t);\n}\n\n/** Only the authenticated adapter supplies these observations; the reducer itself grants no trust. */\nexport function closesRunClaims(\n\tcontract: RunContract,\n\tcontext: { readonly candidate: string; readonly environment: string; readonly checks: readonly CheckObservation[] },\n): boolean {\n\tconst graph = {\n\t\tschemaVersion: CLAIM_GRAPH_SCHEMA_VERSION,\n\t\tclaims: contract.checks.map((check) => ({\n\t\t\tclaimId: check.claimId,\n\t\t\tkind: \"requirement\" as const,\n\t\t\tstatement: `Exact stdout for ${check.claimId}`,\n\t\t\tseverity: \"required\" as const,\n\t\t\tsatisfaction: { rule: \"all\" as const, inputs: [] },\n\t\t\ttrustFloor: \"trusted_attestation\" as const,\n\t\t\tinvalidationKeys: [],\n\t\t\tscopeSensitive: true,\n\t\t})),\n\t};\n\tconst observations = context.checks.map((check) => ({\n\t\tobservationId: check.executionId,\n\t\tclaimIds: [check.claimId],\n\t\tsource: \"trusted_attestation\" as const,\n\t\tpolarity:\n\t\t\tcheck.exitCode === 0 &&\n\t\t\tcheck.failure === null &&\n\t\t\tcontract.checks.some(\n\t\t\t\t(expected) => expected.claimId === check.claimId && digestBytes(expected.stdout) === check.stdoutDigest,\n\t\t\t)\n\t\t\t\t? (\"supports\" as const)\n\t\t\t\t: (\"violates\" as const),\n\t\tsourceRoot: context.candidate,\n\t\tenvironmentDigest: context.environment,\n\t\tindependenceGroup: check.executionId,\n\t}));\n\treturn (\n\t\tevaluateProofClosure({\n\t\t\tgraph,\n\t\t\tobservations,\n\t\t\twitnessIndependence: \"explicit-groups\",\n\t\t\twaivers: [],\n\t\t\tsourceRoot: context.candidate,\n\t\t\tenvironmentDigest: context.environment,\n\t\t\tworkspaceCompleteness: \"complete\",\n\t\t\tunresolvedEffectIds: [],\n\t\t\tnow: \"1970-01-01T00:00:00.000Z\",\n\t\t}).verdict === \"verified\"\n\t);\n}\n"]}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { CLAIM_GRAPH_SCHEMA_VERSION, evaluateProofClosure } from "omk-protocol";
|
|
2
|
+
import { digestBytes, VerifiedRunError } from "./storage.js";
|
|
3
|
+
export function parseCheckObservations(value, nativeRequired) {
|
|
4
|
+
if (!Array.isArray(value) || value.length > 32)
|
|
5
|
+
throw new VerifiedRunError("integrity");
|
|
6
|
+
const rawChecks = value;
|
|
7
|
+
return Object.freeze(rawChecks.map((raw) => {
|
|
8
|
+
if (typeof raw !== "object" ||
|
|
9
|
+
raw === null ||
|
|
10
|
+
!("claimId" in raw) ||
|
|
11
|
+
typeof raw.claimId !== "string" ||
|
|
12
|
+
!("executionId" in raw) ||
|
|
13
|
+
typeof raw.executionId !== "string" ||
|
|
14
|
+
!("stdoutDigest" in raw) ||
|
|
15
|
+
typeof raw.stdoutDigest !== "string" ||
|
|
16
|
+
!/^[a-f0-9]{64}$/.test(raw.stdoutDigest) ||
|
|
17
|
+
!("stderrDigest" in raw) ||
|
|
18
|
+
typeof raw.stderrDigest !== "string" ||
|
|
19
|
+
!/^[a-f0-9]{64}$/.test(raw.stderrDigest) ||
|
|
20
|
+
!("exitCode" in raw) ||
|
|
21
|
+
(raw.exitCode !== null && (typeof raw.exitCode !== "number" || !Number.isSafeInteger(raw.exitCode))) ||
|
|
22
|
+
!("failure" in raw) ||
|
|
23
|
+
(raw.failure !== null && typeof raw.failure !== "string"))
|
|
24
|
+
throw new VerifiedRunError("integrity");
|
|
25
|
+
const native = "receiptCoreDigest" in raw ? raw.receiptCoreDigest : undefined;
|
|
26
|
+
if (nativeRequired && (typeof native !== "string" || !/^[a-f0-9]{64}$/.test(native)))
|
|
27
|
+
throw new VerifiedRunError("integrity");
|
|
28
|
+
if (!nativeRequired && native !== undefined)
|
|
29
|
+
throw new VerifiedRunError("integrity");
|
|
30
|
+
return Object.freeze({
|
|
31
|
+
claimId: raw.claimId,
|
|
32
|
+
executionId: raw.executionId,
|
|
33
|
+
stdoutDigest: raw.stdoutDigest,
|
|
34
|
+
stderrDigest: raw.stderrDigest,
|
|
35
|
+
exitCode: raw.exitCode,
|
|
36
|
+
failure: raw.failure,
|
|
37
|
+
...(typeof native === "string" ? { receiptCoreDigest: native } : {}),
|
|
38
|
+
});
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
/** Only the authenticated adapter supplies these observations; the reducer itself grants no trust. */
|
|
42
|
+
export function closesRunClaims(contract, context) {
|
|
43
|
+
const graph = {
|
|
44
|
+
schemaVersion: CLAIM_GRAPH_SCHEMA_VERSION,
|
|
45
|
+
claims: contract.checks.map((check) => ({
|
|
46
|
+
claimId: check.claimId,
|
|
47
|
+
kind: "requirement",
|
|
48
|
+
statement: `Exact stdout for ${check.claimId}`,
|
|
49
|
+
severity: "required",
|
|
50
|
+
satisfaction: { rule: "all", inputs: [] },
|
|
51
|
+
trustFloor: "trusted_attestation",
|
|
52
|
+
invalidationKeys: [],
|
|
53
|
+
scopeSensitive: true,
|
|
54
|
+
})),
|
|
55
|
+
};
|
|
56
|
+
const observations = context.checks.map((check) => ({
|
|
57
|
+
observationId: check.executionId,
|
|
58
|
+
claimIds: [check.claimId],
|
|
59
|
+
source: "trusted_attestation",
|
|
60
|
+
polarity: check.exitCode === 0 &&
|
|
61
|
+
check.failure === null &&
|
|
62
|
+
contract.checks.some((expected) => expected.claimId === check.claimId && digestBytes(expected.stdout) === check.stdoutDigest)
|
|
63
|
+
? "supports"
|
|
64
|
+
: "violates",
|
|
65
|
+
sourceRoot: context.candidate,
|
|
66
|
+
environmentDigest: context.environment,
|
|
67
|
+
independenceGroup: check.executionId,
|
|
68
|
+
}));
|
|
69
|
+
return (evaluateProofClosure({
|
|
70
|
+
graph,
|
|
71
|
+
observations,
|
|
72
|
+
witnessIndependence: "explicit-groups",
|
|
73
|
+
waivers: [],
|
|
74
|
+
sourceRoot: context.candidate,
|
|
75
|
+
environmentDigest: context.environment,
|
|
76
|
+
workspaceCompleteness: "complete",
|
|
77
|
+
unresolvedEffectIds: [],
|
|
78
|
+
now: "1970-01-01T00:00:00.000Z",
|
|
79
|
+
}).verdict === "verified");
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=evidence-binding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-binding.js","sourceRoot":"","sources":["../../../src/core/verified-run/evidence-binding.ts"],"names":[],"mappings":"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","sourcesContent":["import { CLAIM_GRAPH_SCHEMA_VERSION, evaluateProofClosure, type RunContract } from \"omk-protocol\";\nimport { digestBytes, VerifiedRunError } from \"./storage.ts\";\n\nexport interface CheckObservation {\n\treadonly claimId: string;\n\treadonly executionId: string;\n\treadonly stdoutDigest: string;\n\treadonly stderrDigest: string;\n\treadonly exitCode: number | null;\n\treadonly failure: string | null;\n\treadonly receiptCoreDigest?: string;\n}\n\nexport function parseCheckObservations(value: unknown, nativeRequired: boolean): readonly CheckObservation[] {\n\tif (!Array.isArray(value) || value.length > 32) throw new VerifiedRunError(\"integrity\");\n\tconst rawChecks: readonly unknown[] = value;\n\treturn Object.freeze(\n\t\trawChecks.map((raw): CheckObservation => {\n\t\t\tif (\n\t\t\t\ttypeof raw !== \"object\" ||\n\t\t\t\traw === null ||\n\t\t\t\t!(\"claimId\" in raw) ||\n\t\t\t\ttypeof raw.claimId !== \"string\" ||\n\t\t\t\t!(\"executionId\" in raw) ||\n\t\t\t\ttypeof raw.executionId !== \"string\" ||\n\t\t\t\t!(\"stdoutDigest\" in raw) ||\n\t\t\t\ttypeof raw.stdoutDigest !== \"string\" ||\n\t\t\t\t!/^[a-f0-9]{64}$/.test(raw.stdoutDigest) ||\n\t\t\t\t!(\"stderrDigest\" in raw) ||\n\t\t\t\ttypeof raw.stderrDigest !== \"string\" ||\n\t\t\t\t!/^[a-f0-9]{64}$/.test(raw.stderrDigest) ||\n\t\t\t\t!(\"exitCode\" in raw) ||\n\t\t\t\t(raw.exitCode !== null && (typeof raw.exitCode !== \"number\" || !Number.isSafeInteger(raw.exitCode))) ||\n\t\t\t\t!(\"failure\" in raw) ||\n\t\t\t\t(raw.failure !== null && typeof raw.failure !== \"string\")\n\t\t\t)\n\t\t\t\tthrow new VerifiedRunError(\"integrity\");\n\t\t\tconst native = \"receiptCoreDigest\" in raw ? raw.receiptCoreDigest : undefined;\n\t\t\tif (nativeRequired && (typeof native !== \"string\" || !/^[a-f0-9]{64}$/.test(native)))\n\t\t\t\tthrow new VerifiedRunError(\"integrity\");\n\t\t\tif (!nativeRequired && native !== undefined) throw new VerifiedRunError(\"integrity\");\n\t\t\treturn Object.freeze({\n\t\t\t\tclaimId: raw.claimId,\n\t\t\t\texecutionId: raw.executionId,\n\t\t\t\tstdoutDigest: raw.stdoutDigest,\n\t\t\t\tstderrDigest: raw.stderrDigest,\n\t\t\t\texitCode: raw.exitCode,\n\t\t\t\tfailure: raw.failure,\n\t\t\t\t...(typeof native === \"string\" ? { receiptCoreDigest: native } : {}),\n\t\t\t});\n\t\t}),\n\t);\n}\n\n/** Only the authenticated adapter supplies these observations; the reducer itself grants no trust. */\nexport function closesRunClaims(\n\tcontract: RunContract,\n\tcontext: { readonly candidate: string; readonly environment: string; readonly checks: readonly CheckObservation[] },\n): boolean {\n\tconst graph = {\n\t\tschemaVersion: CLAIM_GRAPH_SCHEMA_VERSION,\n\t\tclaims: contract.checks.map((check) => ({\n\t\t\tclaimId: check.claimId,\n\t\t\tkind: \"requirement\" as const,\n\t\t\tstatement: `Exact stdout for ${check.claimId}`,\n\t\t\tseverity: \"required\" as const,\n\t\t\tsatisfaction: { rule: \"all\" as const, inputs: [] },\n\t\t\ttrustFloor: \"trusted_attestation\" as const,\n\t\t\tinvalidationKeys: [],\n\t\t\tscopeSensitive: true,\n\t\t})),\n\t};\n\tconst observations = context.checks.map((check) => ({\n\t\tobservationId: check.executionId,\n\t\tclaimIds: [check.claimId],\n\t\tsource: \"trusted_attestation\" as const,\n\t\tpolarity:\n\t\t\tcheck.exitCode === 0 &&\n\t\t\tcheck.failure === null &&\n\t\t\tcontract.checks.some(\n\t\t\t\t(expected) => expected.claimId === check.claimId && digestBytes(expected.stdout) === check.stdoutDigest,\n\t\t\t)\n\t\t\t\t? (\"supports\" as const)\n\t\t\t\t: (\"violates\" as const),\n\t\tsourceRoot: context.candidate,\n\t\tenvironmentDigest: context.environment,\n\t\tindependenceGroup: check.executionId,\n\t}));\n\treturn (\n\t\tevaluateProofClosure({\n\t\t\tgraph,\n\t\t\tobservations,\n\t\t\twitnessIndependence: \"explicit-groups\",\n\t\t\twaivers: [],\n\t\t\tsourceRoot: context.candidate,\n\t\t\tenvironmentDigest: context.environment,\n\t\t\tworkspaceCompleteness: \"complete\",\n\t\t\tunresolvedEffectIds: [],\n\t\t\tnow: \"1970-01-01T00:00:00.000Z\",\n\t\t}).verdict === \"verified\"\n\t);\n}\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { RunContract } from "omk-protocol";
|
|
2
|
+
import type { EvidenceReceipt } from "../../types/evidence.ts";
|
|
3
|
+
import { type CandidateManifest } from "./candidate.ts";
|
|
4
|
+
import { type CheckObservation } from "./evidence-binding.ts";
|
|
5
|
+
import type { JournalSnapshot } from "./journal.ts";
|
|
6
|
+
export type { CheckObservation } from "./evidence-binding.ts";
|
|
7
|
+
export interface VerifiedRunEvidence {
|
|
8
|
+
readonly candidateDigest: string;
|
|
9
|
+
readonly manifest: CandidateManifest;
|
|
10
|
+
readonly receiptDigest: string;
|
|
11
|
+
readonly verified: boolean;
|
|
12
|
+
readonly checks: readonly CheckObservation[];
|
|
13
|
+
readonly receiptFormat: "v3" | "legacy";
|
|
14
|
+
readonly receipts: readonly EvidenceReceipt[];
|
|
15
|
+
}
|
|
16
|
+
export declare function createRunIssuer(runPath: string): void;
|
|
17
|
+
export declare function issueRunEvidence(runPath: string, contract: RunContract, material: {
|
|
18
|
+
readonly generation: number;
|
|
19
|
+
readonly candidateDigest: string;
|
|
20
|
+
readonly environmentDigest: string;
|
|
21
|
+
readonly checks: readonly CheckObservation[];
|
|
22
|
+
}): {
|
|
23
|
+
readonly digest: string;
|
|
24
|
+
readonly verified: boolean;
|
|
25
|
+
};
|
|
26
|
+
export declare function readRunEvidence(runPath: string, journal: JournalSnapshot, environment: string): VerifiedRunEvidence;
|
|
27
|
+
//# sourceMappingURL=evidence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../../../src/core/verified-run/evidence.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,EAAE,KAAK,iBAAiB,EAAiB,MAAM,gBAAgB,CAAC;AAEvE,OAAO,EAAE,KAAK,gBAAgB,EAA2C,MAAM,uBAAuB,CAAC;AACvG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGpD,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAa9D,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC7C,QAAQ,CAAC,aAAa,EAAE,IAAI,GAAG,QAAQ,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAC;CAC9C;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGrD;AAQD,wBAAgB,gBAAgB,CAC/B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE;IACT,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,CAAC;CAC7C,GACC;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAuBzD;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,GAAG,mBAAmB,CAoEnH","sourcesContent":["import { createHmac, randomBytes, timingSafeEqual } from \"node:crypto\";\nimport { join } from \"node:path\";\nimport type { RunContract } from \"omk-protocol\";\nimport type { EvidenceReceipt } from \"../../types/evidence.ts\";\nimport { canonicalJson } from \"../run-journal.ts\";\nimport { type CandidateManifest, loadCandidate } from \"./candidate.ts\";\nimport { readCheckReceipts } from \"./check-receipt.ts\";\nimport { type CheckObservation, closesRunClaims, parseCheckObservations } from \"./evidence-binding.ts\";\nimport type { JournalSnapshot } from \"./journal.ts\";\nimport { digestObject, publishBytes, publishObject, readJson, readRegularFile, VerifiedRunError } from \"./storage.ts\";\n\nexport type { CheckObservation } from \"./evidence-binding.ts\";\n\ninterface Attestation {\n\treadonly version: 1 | 2 | 3;\n\treadonly runId: string;\n\treadonly generation: number;\n\treadonly contractDigest: string;\n\treadonly candidateDigest: string;\n\treadonly environmentDigest: string;\n\treadonly verifierDigest: string;\n\treadonly checks: readonly CheckObservation[];\n\treadonly verified: boolean;\n}\nexport interface VerifiedRunEvidence {\n\treadonly candidateDigest: string;\n\treadonly manifest: CandidateManifest;\n\treadonly receiptDigest: string;\n\treadonly verified: boolean;\n\treadonly checks: readonly CheckObservation[];\n\treadonly receiptFormat: \"v3\" | \"legacy\";\n\treadonly receipts: readonly EvidenceReceipt[];\n}\n\nexport function createRunIssuer(runPath: string): void {\n\t// Recovery must never replace a missing key and re-sign old evidence.\n\tpublishBytes(join(runPath, \"issuer.key\"), randomBytes(32));\n}\n\nfunction tag(runPath: string, receipt: unknown): Buffer {\n\tconst key = readRegularFile(join(runPath, \"issuer.key\"), 32);\n\tif (key.length !== 32) throw new VerifiedRunError(\"integrity\");\n\treturn createHmac(\"sha256\", key).update(\"omk.verified-run.attestation.v1\\0\").update(canonicalJson(receipt)).digest();\n}\n\nexport function issueRunEvidence(\n\trunPath: string,\n\tcontract: RunContract,\n\tmaterial: {\n\t\treadonly generation: number;\n\t\treadonly candidateDigest: string;\n\t\treadonly environmentDigest: string;\n\t\treadonly checks: readonly CheckObservation[];\n\t},\n): { readonly digest: string; readonly verified: boolean } {\n\tconst checks = parseCheckObservations(material.checks, true);\n\tconst candidate = loadCandidate(runPath, material.candidateDigest, contract.budget);\n\treadCheckReceipts(runPath, contract, { manifest: candidate.manifest, checks });\n\tconst receipt: Attestation = {\n\t\tversion: 3,\n\t\trunId: contract.runId,\n\t\tgeneration: material.generation,\n\t\tcontractDigest: digestObject(contract),\n\t\tcandidateDigest: material.candidateDigest,\n\t\tenvironmentDigest: material.environmentDigest,\n\t\tverifierDigest: digestObject(contract.checks),\n\t\tchecks,\n\t\tverified: closesRunClaims(contract, {\n\t\t\tcandidate: material.candidateDigest,\n\t\t\tenvironment: material.environmentDigest,\n\t\t\tchecks,\n\t\t}),\n\t};\n\tconst envelope = { receipt, authenticationTag: tag(runPath, receipt).toString(\"hex\") };\n\tconst digest = digestObject(envelope);\n\tpublishObject(join(runPath, \"attestations\", `${digest}.json`), envelope);\n\treturn { digest, verified: receipt.verified };\n}\n\nexport function readRunEvidence(runPath: string, journal: JournalSnapshot, environment: string): VerifiedRunEvidence {\n\tconst first = journal.records[0]?.event;\n\tconst { candidateDigest, receiptDigest } = journal.state;\n\tif (first?.kind !== \"created\" || !candidateDigest || !receiptDigest) throw new VerifiedRunError(\"evidence_missing\");\n\tconst raw = readJson(join(runPath, \"attestations\", `${receiptDigest}.json`));\n\tif (\n\t\tdigestObject(raw) !== receiptDigest ||\n\t\ttypeof raw !== \"object\" ||\n\t\traw === null ||\n\t\t!(\"receipt\" in raw) ||\n\t\t!(\"authenticationTag\" in raw) ||\n\t\ttypeof raw.authenticationTag !== \"string\" ||\n\t\t!/^[a-f0-9]{64}$/.test(raw.authenticationTag) ||\n\t\t!timingSafeEqual(tag(runPath, raw.receipt), Buffer.from(raw.authenticationTag, \"hex\"))\n\t)\n\t\tthrow new VerifiedRunError(\"integrity\");\n\tconst receipt = raw.receipt;\n\tif (\n\t\ttypeof receipt !== \"object\" ||\n\t\treceipt === null ||\n\t\t!(\"checks\" in receipt) ||\n\t\t!(\"version\" in receipt) ||\n\t\t(receipt.version !== 1 && receipt.version !== 2 && receipt.version !== 3)\n\t)\n\t\tthrow new VerifiedRunError(\"integrity\");\n\tconst checks = parseCheckObservations(receipt.checks, receipt.version !== 1);\n\tconst contract = first.contract;\n\tconst dispatches = journal.records.flatMap(({ event, generation }) =>\n\t\tgeneration === journal.state.generation && event.kind === \"dispatch\" && event.role === \"verifier\" ? [event] : [],\n\t);\n\tif (\n\t\tchecks.length !== contract.checks.length ||\n\t\tchecks.length !== dispatches.length ||\n\t\tnew Set(checks.map((check) => check.claimId)).size !== checks.length ||\n\t\tchecks.some(\n\t\t\t(check) =>\n\t\t\t\t!dispatches.some((event) => event.executionId === check.executionId && event.claimId === check.claimId),\n\t\t)\n\t)\n\t\tthrow new VerifiedRunError(\"integrity\");\n\tconst verified = closesRunClaims(contract, { candidate: candidateDigest, environment, checks });\n\tconst expected: Attestation = {\n\t\tversion: receipt.version,\n\t\trunId: contract.runId,\n\t\tgeneration: journal.state.generation,\n\t\tcontractDigest: digestObject(contract),\n\t\tcandidateDigest,\n\t\tenvironmentDigest: environment,\n\t\tverifierDigest: digestObject(contract.checks),\n\t\tchecks,\n\t\tverified,\n\t};\n\tif (canonicalJson(receipt) !== canonicalJson(expected) || verified !== (journal.state.verification === \"verified\"))\n\t\tthrow new VerifiedRunError(\"integrity\");\n\tconst candidate = loadCandidate(runPath, candidateDigest, contract.budget);\n\tconst receipts =\n\t\treceipt.version !== 1\n\t\t\t? readCheckReceipts(runPath, contract, { manifest: candidate.manifest, checks })\n\t\t\t: Object.freeze([]);\n\treturn Object.freeze({\n\t\tcandidateDigest,\n\t\tmanifest: candidate.manifest,\n\t\treceiptDigest,\n\t\tverified,\n\t\tchecks,\n\t\treceiptFormat: receipt.version !== 1 ? \"v3\" : \"legacy\",\n\t\treceipts,\n\t});\n}\n"]}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { createHmac, randomBytes, timingSafeEqual } from "node:crypto";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { canonicalJson } from "../run-journal.js";
|
|
4
|
+
import { loadCandidate } from "./candidate.js";
|
|
5
|
+
import { readCheckReceipts } from "./check-receipt.js";
|
|
6
|
+
import { closesRunClaims, parseCheckObservations } from "./evidence-binding.js";
|
|
7
|
+
import { digestObject, publishBytes, publishObject, readJson, readRegularFile, VerifiedRunError } from "./storage.js";
|
|
8
|
+
export function createRunIssuer(runPath) {
|
|
9
|
+
// Recovery must never replace a missing key and re-sign old evidence.
|
|
10
|
+
publishBytes(join(runPath, "issuer.key"), randomBytes(32));
|
|
11
|
+
}
|
|
12
|
+
function tag(runPath, receipt) {
|
|
13
|
+
const key = readRegularFile(join(runPath, "issuer.key"), 32);
|
|
14
|
+
if (key.length !== 32)
|
|
15
|
+
throw new VerifiedRunError("integrity");
|
|
16
|
+
return createHmac("sha256", key).update("omk.verified-run.attestation.v1\0").update(canonicalJson(receipt)).digest();
|
|
17
|
+
}
|
|
18
|
+
export function issueRunEvidence(runPath, contract, material) {
|
|
19
|
+
const checks = parseCheckObservations(material.checks, true);
|
|
20
|
+
const candidate = loadCandidate(runPath, material.candidateDigest, contract.budget);
|
|
21
|
+
readCheckReceipts(runPath, contract, { manifest: candidate.manifest, checks });
|
|
22
|
+
const receipt = {
|
|
23
|
+
version: 3,
|
|
24
|
+
runId: contract.runId,
|
|
25
|
+
generation: material.generation,
|
|
26
|
+
contractDigest: digestObject(contract),
|
|
27
|
+
candidateDigest: material.candidateDigest,
|
|
28
|
+
environmentDigest: material.environmentDigest,
|
|
29
|
+
verifierDigest: digestObject(contract.checks),
|
|
30
|
+
checks,
|
|
31
|
+
verified: closesRunClaims(contract, {
|
|
32
|
+
candidate: material.candidateDigest,
|
|
33
|
+
environment: material.environmentDigest,
|
|
34
|
+
checks,
|
|
35
|
+
}),
|
|
36
|
+
};
|
|
37
|
+
const envelope = { receipt, authenticationTag: tag(runPath, receipt).toString("hex") };
|
|
38
|
+
const digest = digestObject(envelope);
|
|
39
|
+
publishObject(join(runPath, "attestations", `${digest}.json`), envelope);
|
|
40
|
+
return { digest, verified: receipt.verified };
|
|
41
|
+
}
|
|
42
|
+
export function readRunEvidence(runPath, journal, environment) {
|
|
43
|
+
const first = journal.records[0]?.event;
|
|
44
|
+
const { candidateDigest, receiptDigest } = journal.state;
|
|
45
|
+
if (first?.kind !== "created" || !candidateDigest || !receiptDigest)
|
|
46
|
+
throw new VerifiedRunError("evidence_missing");
|
|
47
|
+
const raw = readJson(join(runPath, "attestations", `${receiptDigest}.json`));
|
|
48
|
+
if (digestObject(raw) !== receiptDigest ||
|
|
49
|
+
typeof raw !== "object" ||
|
|
50
|
+
raw === null ||
|
|
51
|
+
!("receipt" in raw) ||
|
|
52
|
+
!("authenticationTag" in raw) ||
|
|
53
|
+
typeof raw.authenticationTag !== "string" ||
|
|
54
|
+
!/^[a-f0-9]{64}$/.test(raw.authenticationTag) ||
|
|
55
|
+
!timingSafeEqual(tag(runPath, raw.receipt), Buffer.from(raw.authenticationTag, "hex")))
|
|
56
|
+
throw new VerifiedRunError("integrity");
|
|
57
|
+
const receipt = raw.receipt;
|
|
58
|
+
if (typeof receipt !== "object" ||
|
|
59
|
+
receipt === null ||
|
|
60
|
+
!("checks" in receipt) ||
|
|
61
|
+
!("version" in receipt) ||
|
|
62
|
+
(receipt.version !== 1 && receipt.version !== 2 && receipt.version !== 3))
|
|
63
|
+
throw new VerifiedRunError("integrity");
|
|
64
|
+
const checks = parseCheckObservations(receipt.checks, receipt.version !== 1);
|
|
65
|
+
const contract = first.contract;
|
|
66
|
+
const dispatches = journal.records.flatMap(({ event, generation }) => generation === journal.state.generation && event.kind === "dispatch" && event.role === "verifier" ? [event] : []);
|
|
67
|
+
if (checks.length !== contract.checks.length ||
|
|
68
|
+
checks.length !== dispatches.length ||
|
|
69
|
+
new Set(checks.map((check) => check.claimId)).size !== checks.length ||
|
|
70
|
+
checks.some((check) => !dispatches.some((event) => event.executionId === check.executionId && event.claimId === check.claimId)))
|
|
71
|
+
throw new VerifiedRunError("integrity");
|
|
72
|
+
const verified = closesRunClaims(contract, { candidate: candidateDigest, environment, checks });
|
|
73
|
+
const expected = {
|
|
74
|
+
version: receipt.version,
|
|
75
|
+
runId: contract.runId,
|
|
76
|
+
generation: journal.state.generation,
|
|
77
|
+
contractDigest: digestObject(contract),
|
|
78
|
+
candidateDigest,
|
|
79
|
+
environmentDigest: environment,
|
|
80
|
+
verifierDigest: digestObject(contract.checks),
|
|
81
|
+
checks,
|
|
82
|
+
verified,
|
|
83
|
+
};
|
|
84
|
+
if (canonicalJson(receipt) !== canonicalJson(expected) || verified !== (journal.state.verification === "verified"))
|
|
85
|
+
throw new VerifiedRunError("integrity");
|
|
86
|
+
const candidate = loadCandidate(runPath, candidateDigest, contract.budget);
|
|
87
|
+
const receipts = receipt.version !== 1
|
|
88
|
+
? readCheckReceipts(runPath, contract, { manifest: candidate.manifest, checks })
|
|
89
|
+
: Object.freeze([]);
|
|
90
|
+
return Object.freeze({
|
|
91
|
+
candidateDigest,
|
|
92
|
+
manifest: candidate.manifest,
|
|
93
|
+
receiptDigest,
|
|
94
|
+
verified,
|
|
95
|
+
checks,
|
|
96
|
+
receiptFormat: receipt.version !== 1 ? "v3" : "legacy",
|
|
97
|
+
receipts,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=evidence.js.map
|