@sema-agent/server 7.147.0 → 7.149.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/MIGRATION.md +1468 -24
- package/README.md +35 -7
- package/README.zh-CN.md +18 -8
- package/USAGE.md +444 -193
- package/deploy/sema-up/README.md +16 -5
- package/deploy/sema-up/chart/templates/NOTES.txt +1 -1
- package/deploy/sema-up/chart/templates/_helpers.tpl +20 -4
- package/deploy/sema-up/chart/values.yaml +3 -2
- package/deploy/sema-up/cluster-up.sh +74 -176
- package/deploy/sema-up/kube-up.sh +29 -49
- package/deploy/sema-up/lib/chart-run.sh +23 -0
- package/deploy/sema-up/lib/dataroot.sh +3 -3
- package/deploy/sema-up/lib/health.sh +62 -13
- package/deploy/sema-up/lib/helm-values-cluster.py +18 -0
- package/deploy/sema-up/lib/helm-values-kube.py +35 -0
- package/deploy/sema-up/lib/regcred.py +8 -0
- package/deploy/sema-up/lib/remote/helm-install.sh +3 -0
- package/deploy/sema-up/lib/remote/image-import.sh +6 -0
- package/deploy/sema-up/lib/remote/machine-precheck.sh +11 -0
- package/deploy/sema-up/lib/remote/region-probe.sh +3 -0
- package/deploy/sema-up/lib/remote/stack-ready.sh +26 -0
- package/deploy/sema-up/lib/remote/vxlan-guard.sh +8 -0
- package/deploy/sema-up/lib/render-stack.py +17 -0
- package/deploy/sema-up/lib/shell-text.sh +87 -0
- package/deploy/sema-up/lib/usage-flags.txt +10 -0
- package/deploy/sema-up/lib/usage-head.txt +1 -0
- package/deploy/sema-up/lib/usage-tail.txt +13 -0
- package/deploy/sema-up/preflight.sh +10 -8
- package/deploy/sema-up/sema-up.sh +14 -39
- package/deploy/sema-up/smoke.sh +7 -6
- package/deploy/sema-up/stack/compose.dataroot.yaml +3 -0
- package/deploy/sema-up/stack/compose.yaml +13 -1
- package/deploy/sema-up/stack/sema-stack-cluster.yaml +21 -0
- package/dist/adoption/plan.d.ts +24 -0
- package/dist/adoption/plan.js +53 -1
- package/dist/adoption/runner.d.ts +10 -1
- package/dist/adoption/runner.js +36 -16
- package/dist/approval-card.d.ts +36 -38
- package/dist/approval-gate-currency.js +3 -2
- package/dist/approval-leg-origin.d.ts +33 -0
- package/dist/approval-leg-origin.js +4 -0
- package/dist/approval-reconciler.d.ts +4 -13
- package/dist/approval-reconciler.js +2 -2
- package/dist/approval.d.ts +13 -11
- package/dist/approval.js +3 -3
- package/dist/audit.d.ts +10 -3
- package/dist/audit.js +15 -7
- package/dist/auth-bridge.d.ts +9 -15
- package/dist/auth-bridge.js +4 -11
- package/dist/auth-keys.d.ts +10 -1
- package/dist/auth-keys.js +8 -0
- package/dist/auto-mode-face.d.ts +10 -7
- package/dist/auto-mode-face.js +7 -4
- package/dist/background-agent-name.d.ts +19 -1
- package/dist/background-agent-name.js +12 -2
- package/dist/background-session-reap.d.ts +1 -1
- package/dist/bake-runner/main.js +9 -6
- package/dist/bench/s1/arms.js +6 -5
- package/dist/bench/s1/live-deps.js +5 -2
- package/dist/bench/s1/run-firm.js +6 -5
- package/dist/bind-host.d.ts +25 -0
- package/dist/bind-host.js +25 -0
- package/dist/boot/adoption.d.ts +3 -0
- package/dist/boot/adoption.js +1 -0
- package/dist/boot/deployment-mods.d.ts +1 -1
- package/dist/boot/execution-env.d.ts +17 -7
- package/dist/boot/execution-env.js +47 -42
- package/dist/boot/execution-lane.d.ts +6 -4
- package/dist/boot/execution-lane.js +3 -1
- package/dist/boot/exit-boundary.d.ts +2 -2
- package/dist/boot/exit-boundary.js +6 -5
- package/dist/boot/fatal-exit.d.ts +3 -5
- package/dist/boot/fatal-exit.js +2 -2
- package/dist/boot/leader.d.ts +15 -0
- package/dist/boot/leader.js +17 -15
- package/dist/boot/memory-consolidation.d.ts +37 -29
- package/dist/boot/memory-consolidation.js +11 -5
- package/dist/boot/org-delivery.d.ts +3 -2
- package/dist/boot/org-memory.js +1 -1
- package/dist/boot/parked-revive-gate.js +2 -2
- package/dist/boot/reapers.d.ts +4 -3
- package/dist/boot/reapers.js +19 -16
- package/dist/boot/resolve-spec.d.ts +5 -3
- package/dist/boot/resolve-spec.js +60 -70
- package/dist/boot/retention-lane.d.ts +4 -4
- package/dist/boot/retention-lane.js +2 -2
- package/dist/boot/runner-deps.d.ts +28 -7
- package/dist/boot/runner-deps.js +14 -5
- package/dist/boot/runtime-caps.d.ts +2 -2
- package/dist/boot/runtime-caps.js +16 -2
- package/dist/boot/session-faces.d.ts +16 -7
- package/dist/boot/session-faces.js +114 -94
- package/dist/boot/shutdown.d.ts +5 -4
- package/dist/boot/shutdown.js +6 -4
- package/dist/boot/stage-01-config.d.ts +1 -0
- package/dist/boot/stage-01-config.js +13 -4
- package/dist/boot/stage-02-web-admin-pull.d.ts +2 -0
- package/dist/boot/stage-02-web-admin-pull.js +16 -3
- package/dist/boot/stage-03-store-backend.d.ts +4 -0
- package/dist/boot/stage-03-store-backend.js +4 -3
- package/dist/boot/stage-04-stores.d.ts +3 -0
- package/dist/boot/stage-04-stores.js +2 -2
- package/dist/boot/stage-05-execution-env.d.ts +8 -3
- package/dist/boot/stage-05-execution-env.js +2 -2
- package/dist/boot/stage-06-runners.d.ts +12 -13
- package/dist/boot/stage-06-runners.js +23 -15
- package/dist/boot/stage-07-capability-layer.d.ts +13 -9
- package/dist/boot/stage-07-capability-layer.js +5 -3
- package/dist/boot/stage-08-reapers.d.ts +13 -9
- package/dist/boot/stage-08-reapers.js +3 -3
- package/dist/boot/stage-09-leader.d.ts +14 -16
- package/dist/boot/stage-09-leader.js +12 -4
- package/dist/boot/stage-10-http-server.d.ts +14 -16
- package/dist/boot/stage-10-http-server.js +7 -4
- package/dist/boot/store-evidence.d.ts +20 -0
- package/dist/boot/store-evidence.js +13 -0
- package/dist/boot/stores.d.ts +6 -0
- package/dist/boot/stores.js +41 -27
- package/dist/boot/task-list-lane.d.ts +4 -4
- package/dist/boot/web-admin.d.ts +4 -2
- package/dist/boot/web-admin.js +55 -35
- package/dist/boot/webfetch-summarize-lane.d.ts +1 -1
- package/dist/boot-reclaim.d.ts +3 -1
- package/dist/boot-reclaim.js +1 -1
- package/dist/brain.d.ts +7 -18
- package/dist/brain.js +5 -17
- package/dist/budget.js +6 -6
- package/dist/capabilities/center-plugins.d.ts +7 -1
- package/dist/capabilities/center-plugins.js +32 -10
- package/dist/capabilities/center-wiring.js +1 -1
- package/dist/capabilities/composite-members.d.ts +2 -2
- package/dist/capabilities/composite-members.js +2 -2
- package/dist/capabilities/repo-tools.d.ts +2 -0
- package/dist/capabilities/repo-tools.js +14 -12
- package/dist/capabilities/scenarios.d.ts +6 -15
- package/dist/capabilities/scenarios.js +11 -16
- package/dist/capabilities/skills.d.ts +1 -1
- package/dist/capabilities/tool-defer.d.ts +1 -1
- package/dist/capability-facts.d.ts +39 -11
- package/dist/capability-facts.js +35 -7
- package/dist/card-settle-stored-scope.d.ts +56 -0
- package/dist/card-settle-stored-scope.js +27 -0
- package/dist/card-void.d.ts +8 -13
- package/dist/card-void.js +2 -7
- package/dist/center-credential-renewer.d.ts +6 -2
- package/dist/center-credential-renewer.js +7 -3
- package/dist/config-catalog.d.ts +28 -1
- package/dist/config-catalog.js +95 -85
- package/dist/config-dir-trust.d.ts +37 -4
- package/dist/config-dir-trust.js +88 -44
- package/dist/config-invariants.d.ts +43 -3
- package/dist/config-invariants.js +69 -5
- package/dist/config-lkg.d.ts +23 -1
- package/dist/config-lkg.js +17 -3
- package/dist/config-provider.d.ts +9 -9
- package/dist/config-provider.js +25 -110
- package/dist/config-pull-failure.d.ts +50 -0
- package/dist/config-pull-failure.js +48 -0
- package/dist/config-types.d.ts +62 -21
- package/dist/config.d.ts +14 -21
- package/dist/config.js +141 -64
- package/dist/context-window-notice.d.ts +31 -0
- package/dist/context-window-notice.js +28 -0
- package/dist/delegated-session-owner.d.ts +1 -1
- package/dist/deleted-session-ids.d.ts +3 -2
- package/dist/deployment-governance.d.ts +3 -3
- package/dist/deployment-shape.d.ts +46 -11
- package/dist/deployment-shape.js +8 -0
- package/dist/egress-redirect.d.ts +25 -7
- package/dist/egress-redirect.js +20 -2
- package/dist/elicitation.d.ts +6 -5
- package/dist/elicitation.js +23 -22
- package/dist/engine-identity.d.ts +28 -0
- package/dist/engine-identity.js +10 -0
- package/dist/entry-problems.d.ts +5 -7
- package/dist/entry-problems.js +1 -1
- package/dist/env-facts.js +2 -1
- package/dist/env-name-allowlist-knobs.d.ts +6 -5
- package/dist/env-name-allowlist-knobs.js +5 -0
- package/dist/env-witness.d.ts +7 -0
- package/dist/env-witness.js +16 -0
- package/dist/execution-lane-caps.d.ts +25 -23
- package/dist/execution-lane-caps.js +18 -26
- package/dist/execution-placement.d.ts +58 -18
- package/dist/execution-placement.js +41 -2
- package/dist/field-conflict.d.ts +7 -11
- package/dist/field-conflict.js +3 -3
- package/dist/file-history-capture.d.ts +3 -3
- package/dist/file-history-disclosure.js +1 -0
- package/dist/fleet/fleet-bus.d.ts +21 -3
- package/dist/fleet/fleet-bus.js +35 -25
- package/dist/fleet/fleet-reconciler.js +2 -2
- package/dist/fleet/serving-lease.js +3 -3
- package/dist/fleet-client.js +3 -3
- package/dist/fleet-lease.d.ts +0 -1
- package/dist/fleet-lease.js +4 -5
- package/dist/history-anchor.d.ts +23 -3
- package/dist/history-anchor.js +24 -4
- package/dist/hitl-delivery.d.ts +90 -0
- package/dist/hitl-delivery.js +98 -0
- package/dist/hooks/classic-stations.d.ts +8 -11
- package/dist/hooks/classic-stations.js +0 -7
- package/dist/hooks/command-spawn.d.ts +7 -2
- package/dist/hooks/command-spawn.js +13 -6
- package/dist/hooks/hook-llm.d.ts +5 -1
- package/dist/hooks/hook-llm.js +24 -15
- package/dist/hooks/hook-runner.d.ts +72 -57
- package/dist/hooks/hook-runner.js +271 -193
- package/dist/host-lsp-manager.d.ts +22 -8
- package/dist/host-lsp-manager.js +4 -1
- package/dist/http/active-run-conflict.d.ts +2 -43
- package/dist/http/active-run-conflict.js +3 -7
- package/dist/http/admission.d.ts +4 -18
- package/dist/http/admission.js +76 -79
- package/dist/http/approval-sweeps.d.ts +3 -3
- package/dist/http/approval-sweeps.js +56 -31
- package/dist/http/caller-trust.d.ts +8 -10
- package/dist/http/caller-trust.js +1 -2
- package/dist/http/claim-heartbeat.d.ts +49 -0
- package/dist/http/claim-heartbeat.js +46 -0
- package/dist/http/claimed-run.d.ts +16 -8
- package/dist/http/claimed-run.js +8 -0
- package/dist/http/dispatch.d.ts +8 -1
- package/dist/http/dispatch.js +78 -30
- package/dist/http/durable-run-leg.d.ts +11 -4
- package/dist/http/durable-run-leg.js +45 -21
- package/dist/http/execution-context.d.ts +122 -47
- package/dist/http/execution-context.js +135 -43
- package/dist/http/health-reader.d.ts +36 -0
- package/dist/http/health-reader.js +21 -0
- package/dist/http/health-self-report.d.ts +9 -9
- package/dist/http/health-self-report.js +4 -4
- package/dist/http/idempotency.d.ts +9 -5
- package/dist/http/idempotency.js +4 -4
- package/dist/http/memory-compliance-failure-reply.d.ts +15 -16
- package/dist/http/memory-compliance-failure-reply.js +4 -2
- package/dist/http/memory-face-fault-reply.d.ts +67 -0
- package/dist/http/memory-face-fault-reply.js +71 -0
- package/dist/http/memory-store-refusal-reply.d.ts +1 -1
- package/dist/http/memory-store-refusal-reply.js +3 -0
- package/dist/http/owner-access.d.ts +392 -67
- package/dist/http/owner-access.js +370 -35
- package/dist/http/principal-gate.d.ts +39 -89
- package/dist/http/principal-gate.js +26 -68
- package/dist/http/refusal-body.d.ts +35 -2
- package/dist/http/refusal-body.js +34 -0
- package/dist/http/request-guards.d.ts +9 -13
- package/dist/http/request-guards.js +34 -68
- package/dist/http/resume-composition.d.ts +37 -0
- package/dist/http/resume-composition.js +18 -0
- package/dist/http/resume-ctx-read.d.ts +46 -12
- package/dist/http/resume-ctx-read.js +31 -6
- package/dist/http/resume-legs.d.ts +54 -19
- package/dist/http/resume-legs.js +408 -196
- package/dist/http/retired-skill-manifest.d.ts +1 -1
- package/dist/http/route-ctx.d.ts +31 -32
- package/dist/http/routes/a2a-serve.d.ts +43 -5
- package/dist/http/routes/a2a-serve.js +60 -37
- package/dist/http/routes/admin-config-refresh.js +2 -2
- package/dist/http/routes/admin-drain.js +2 -2
- package/dist/http/routes/admin-memory-optout.js +4 -3
- package/dist/http/routes/adoption.d.ts +3 -0
- package/dist/http/routes/adoption.js +17 -10
- package/dist/http/routes/agents-roster.js +13 -7
- package/dist/http/routes/approvals-assistant.js +73 -67
- package/dist/http/routes/attachments.js +2 -2
- package/dist/http/routes/background.d.ts +3 -3
- package/dist/http/routes/background.js +9 -17
- package/dist/http/routes/capabilities.js +16 -19
- package/dist/http/routes/config-catalog.js +2 -2
- package/dist/http/routes/devices.d.ts +3 -3
- package/dist/http/routes/devices.js +4 -4
- package/dist/http/routes/diagnostics.d.ts +29 -3
- package/dist/http/routes/diagnostics.js +49 -18
- package/dist/http/routes/engine.js +2 -2
- package/dist/http/routes/fleet.js +5 -3
- package/dist/http/routes/images.js +10 -6
- package/dist/http/routes/leader.d.ts +7 -2
- package/dist/http/routes/leader.js +12 -3
- package/dist/http/routes/mcp-reconnect.d.ts +1 -1
- package/dist/http/routes/mcp-reconnect.js +7 -15
- package/dist/http/routes/memory-bundle.js +4 -7
- package/dist/http/routes/memory-compliance.js +4 -4
- package/dist/http/routes/memory-consolidation.js +6 -9
- package/dist/http/routes/memory-origin.d.ts +2 -0
- package/dist/http/routes/memory-origin.js +7 -8
- package/dist/http/routes/memory-policy.js +17 -12
- package/dist/http/routes/notify-wake.js +10 -19
- package/dist/http/routes/observability.js +3 -3
- package/dist/http/routes/principal-inbox.d.ts +4 -2
- package/dist/http/routes/principal-inbox.js +5 -4
- package/dist/http/routes/projects.d.ts +1 -1
- package/dist/http/routes/projects.js +3 -2
- package/dist/http/routes/retention-ops.js +6 -9
- package/dist/http/routes/rules.js +20 -5
- package/dist/http/routes/run-memory-capture.d.ts +2 -2
- package/dist/http/routes/run-memory-capture.js +6 -12
- package/dist/http/routes/run-permission-mode.d.ts +2 -2
- package/dist/http/routes/run-permission-mode.js +10 -17
- package/dist/http/routes/runs.js +155 -237
- package/dist/http/routes/session-memory-sync.d.ts +2 -2
- package/dist/http/routes/session-memory-sync.js +7 -13
- package/dist/http/routes/session-sync.d.ts +28 -7
- package/dist/http/routes/session-sync.js +63 -50
- package/dist/http/routes/sessions-list.d.ts +3 -3
- package/dist/http/routes/sessions-list.js +9 -9
- package/dist/http/routes/sessions.js +87 -124
- package/dist/http/routes/shared-memory.js +6 -6
- package/dist/http/routes/side-query.js +2 -2
- package/dist/http/routes/tasks.js +237 -187
- package/dist/http/routes/trace-usage.d.ts +0 -12
- package/dist/http/routes/trace-usage.js +40 -46
- package/dist/http/routes/workflows.d.ts +39 -4
- package/dist/http/routes/workflows.js +42 -14
- package/dist/http/run-concurrency-cap.d.ts +20 -12
- package/dist/http/run-concurrency-cap.js +39 -26
- package/dist/http/run-read-face.d.ts +3 -5
- package/dist/http/run-read-face.js +8 -13
- package/dist/http/send.d.ts +12 -3
- package/dist/http/send.js +42 -6
- package/dist/http/server.d.ts +43 -45
- package/dist/http/server.js +61 -11
- package/dist/http/sse-log.d.ts +17 -10
- package/dist/http/sse-log.js +7 -7
- package/dist/http/stored-body-replay.d.ts +12 -0
- package/dist/http/stored-body-replay.js +2 -2
- package/dist/http/submit-ctx.d.ts +17 -8
- package/dist/http/submit-ctx.js +8 -5
- package/dist/http/submit-replay.d.ts +19 -6
- package/dist/http/submit-replay.js +18 -6
- package/dist/http/sync-submit-body.d.ts +3 -4
- package/dist/http/sync-submit-body.js +4 -5
- package/dist/http/wire-types.d.ts +4 -3
- package/dist/identity-source.d.ts +36 -5
- package/dist/identity-source.js +27 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.js +2 -0
- package/dist/key-resolver.d.ts +32 -0
- package/dist/key-resolver.js +23 -9
- package/dist/leader/diffup.js +2 -1
- package/dist/leader/endpoint.d.ts +26 -5
- package/dist/leader/endpoint.js +154 -14
- package/dist/leader/fanout.d.ts +3 -0
- package/dist/leader/fanout.js +78 -63
- package/dist/leader/leader.d.ts +16 -0
- package/dist/leader/leader.js +43 -3
- package/dist/leader/merge.d.ts +9 -1
- package/dist/leader/merge.js +16 -1
- package/dist/leader/repair-wire.js +1 -1
- package/dist/leader/wire.d.ts +36 -3
- package/dist/leader/wire.js +59 -18
- package/dist/leg-facts.d.ts +7 -2
- package/dist/leg-facts.js +1 -0
- package/dist/local-store-declaration.d.ts +54 -0
- package/dist/local-store-declaration.js +59 -0
- package/dist/lsp-evict.d.ts +6 -4
- package/dist/lsp-evict.js +2 -3
- package/dist/mcp-assertion-header.d.ts +1 -1
- package/dist/mcp-assertion-header.js +1 -1
- package/dist/memory-operator-faces.d.ts +5 -4
- package/dist/memory-operator-faces.js +1 -1
- package/dist/memory-project-layer.js +1 -1
- package/dist/memory-scope.d.ts +33 -6
- package/dist/memory-scope.js +68 -19
- package/dist/memory-store-refusal.d.ts +5 -2
- package/dist/memory-sync-client.d.ts +3 -2
- package/dist/memory-sync-client.js +8 -5
- package/dist/model-compat.d.ts +17 -8
- package/dist/model-compat.js +6 -2
- package/dist/model-context-window.d.ts +57 -0
- package/dist/model-context-window.js +21 -0
- package/dist/model-entry-headers.d.ts +46 -4
- package/dist/model-entry-headers.js +2 -2
- package/dist/model-entry-refusal.d.ts +40 -20
- package/dist/model-entry-refusal.js +57 -30
- package/dist/model-plane-face.d.ts +19 -11
- package/dist/model-plane-face.js +9 -1
- package/dist/model-plane-probe.d.ts +2 -0
- package/dist/model-plane-probe.js +17 -0
- package/dist/model-provider.d.ts +3 -3
- package/dist/model-reach-scope.d.ts +2 -1
- package/dist/model-route-endpoint.d.ts +9 -5
- package/dist/model-route-endpoint.js +29 -7
- package/dist/model-select.d.ts +16 -0
- package/dist/model-select.js +4 -0
- package/dist/mountinfo.d.ts +37 -0
- package/dist/mountinfo.js +47 -0
- package/dist/namespaced-rule-name.d.ts +23 -14
- package/dist/namespaced-rule-name.js +8 -11
- package/dist/net-address.d.ts +1 -1
- package/dist/observability/corrupt-read-seat.d.ts +4 -4
- package/dist/observability/corrupt-read-seat.js +5 -3
- package/dist/observability/fail-open.d.ts +72 -40
- package/dist/observability/fail-open.js +74 -40
- package/dist/observability/logger.d.ts +22 -1
- package/dist/observability/logger.js +89 -12
- package/dist/observability/metrics.js +4 -5
- package/dist/observability/otel-exporter.js +2 -1
- package/dist/observability/principal-context.d.ts +14 -7
- package/dist/observability/principal-context.js +8 -3
- package/dist/observability/run-terminal.d.ts +7 -1
- package/dist/observability/run-terminal.js +6 -2
- package/dist/observability/secret-env-scrub.d.ts +1 -1
- package/dist/observability/secret-env-scrub.js +1 -1
- package/dist/orchestration/hardened-vm-runner.d.ts +1 -0
- package/dist/orchestration/hardened-vm-runner.js +11 -5
- package/dist/orchestration/hardened-vm-worker-runner.d.ts +0 -14
- package/dist/orchestration/hardened-vm-worker-runner.js +5 -0
- package/dist/orchestration/hardened-vm-worker.js +2 -1
- package/dist/orchestration/workflow-completion-inbox.d.ts +3 -3
- package/dist/orchestration/workflow-completion-inbox.js +3 -2
- package/dist/org-delivery-gate.d.ts +36 -10
- package/dist/org-delivery-gate.js +12 -8
- package/dist/outbound-dispatcher.d.ts +1 -1
- package/dist/outbound-dispatcher.js +6 -12
- package/dist/owner-brands.d.ts +81 -0
- package/dist/owner-brands.js +42 -0
- package/dist/owner-faces.d.ts +532 -0
- package/dist/owner-faces.js +126 -0
- package/dist/park-row-commit.d.ts +67 -0
- package/dist/park-row-commit.js +76 -0
- package/dist/parked-decide.d.ts +76 -12
- package/dist/parked-decide.js +152 -11
- package/dist/parked-revive-surface.d.ts +14 -4
- package/dist/parked-revive-surface.js +5 -4
- package/dist/peer-directory.d.ts +7 -9
- package/dist/peer-directory.js +3 -2
- package/dist/permission-rule-vocab.d.ts +53 -8
- package/dist/permission-rule-vocab.js +30 -2
- package/dist/plugins/adoption-log-sql.d.ts +3 -25
- package/dist/plugins/adoption-log-sql.js +23 -21
- package/dist/plugins/approval-ask-retired-delete-by-task-m50.d.ts +7 -0
- package/dist/plugins/approval-ask-retired-delete-by-task-m50.js +17 -0
- package/dist/plugins/approval-ask-store-file.d.ts +18 -7
- package/dist/plugins/approval-ask-store-file.js +37 -14
- package/dist/plugins/approval-ask-store-memory.d.ts +12 -4
- package/dist/plugins/approval-ask-store-memory.js +24 -10
- package/dist/plugins/approval-ask-store-sql.d.ts +40 -21
- package/dist/plugins/approval-ask-store-sql.js +44 -15
- package/dist/plugins/approval-exemption-skill-cutoff.d.ts +64 -0
- package/dist/plugins/approval-exemption-skill-cutoff.js +122 -0
- package/dist/plugins/approval-exemption-skill-m46.d.ts +14 -0
- package/dist/plugins/approval-exemption-skill-m46.js +21 -0
- package/dist/plugins/approval-exemption-store.d.ts +32 -2
- package/dist/plugins/approval-exemption-store.js +42 -19
- package/dist/plugins/approval-nonce-store.d.ts +39 -12
- package/dist/plugins/approval-nonce-store.js +72 -23
- package/dist/plugins/blob-backend.d.ts +2 -0
- package/dist/plugins/blob-backend.js +9 -6
- package/dist/plugins/caching-session-store.d.ts +13 -1
- package/dist/plugins/caching-session-store.js +43 -4
- package/dist/plugins/checkpoint-index-columns.d.ts +32 -5
- package/dist/plugins/checkpoint-index-columns.js +36 -1
- package/dist/plugins/checkpoint-store-face.d.ts +83 -10
- package/dist/plugins/checkpoint-store-face.js +18 -1
- package/dist/plugins/device-store-sql.js +1 -0
- package/dist/plugins/ensure-index.d.ts +13 -1
- package/dist/plugins/ensure-index.js +154 -21
- package/dist/plugins/ensure-schema-lock-policy.d.ts +36 -18
- package/dist/plugins/ensure-schema-lock-policy.js +76 -9
- package/dist/plugins/file-run-store.d.ts +85 -32
- package/dist/plugins/file-run-store.js +177 -94
- package/dist/plugins/host-platform.d.ts +24 -3
- package/dist/plugins/host-platform.js +15 -1
- package/dist/plugins/image-bake-store-sql.js +2 -0
- package/dist/plugins/imported-layer-root-retirement.d.ts +2 -2
- package/dist/plugins/k8s-pod-reaper.d.ts +1 -3
- package/dist/plugins/k8s-pod-reaper.js +0 -1
- package/dist/plugins/leader-run-store-sql.d.ts +22 -0
- package/dist/plugins/leader-run-store-sql.js +34 -4
- package/dist/plugins/local-checkpoint-store.d.ts +62 -23
- package/dist/plugins/local-checkpoint-store.js +197 -77
- package/dist/plugins/local-data-dir-modes-m39.js +2 -1
- package/dist/plugins/local-data-root-admission.d.ts +52 -0
- package/dist/plugins/local-data-root-admission.js +100 -0
- package/dist/plugins/local-docker-capacity.d.ts +93 -0
- package/dist/plugins/local-docker-capacity.js +194 -0
- package/dist/plugins/local-docker-reaper.d.ts +92 -0
- package/dist/plugins/local-docker-reaper.js +102 -0
- package/dist/plugins/local-engine-high-water.d.ts +29 -6
- package/dist/plugins/local-engine-high-water.js +27 -19
- package/dist/plugins/local-session-store.d.ts +458 -140
- package/dist/plugins/local-session-store.js +906 -292
- package/dist/plugins/local-session-window.d.ts +3 -2
- package/dist/plugins/local-session-window.js +3 -2
- package/dist/plugins/local-sidecar-quarantine.js +3 -2
- package/dist/plugins/local-task-attachment-store.d.ts +18 -1
- package/dist/plugins/local-task-attachment-store.js +22 -1
- package/dist/plugins/memory-embedder.js +9 -7
- package/dist/plugins/memory-engine-pg.d.ts +3 -2
- package/dist/plugins/memory-engine-pg.js +14 -5
- package/dist/plugins/memory-engine-sql-apply.d.ts +8 -4
- package/dist/plugins/memory-engine-sql-apply.js +6 -8
- package/dist/plugins/memory-engine-tidb.d.ts +4 -2
- package/dist/plugins/memory-engine-tidb.js +11 -2
- package/dist/plugins/memory-optout-grant-store-sql.d.ts +1 -1
- package/dist/plugins/memory-optout-grant-store-sql.js +3 -3
- package/dist/plugins/memory-run-store.d.ts +53 -36
- package/dist/plugins/memory-run-store.js +116 -88
- package/dist/plugins/one-time-migration-marker.d.ts +26 -0
- package/dist/plugins/one-time-migration-marker.js +13 -0
- package/dist/plugins/one-time-migrations.d.ts +214 -47
- package/dist/plugins/one-time-migrations.js +481 -135
- package/dist/plugins/org-delivery-quota-store.d.ts +34 -11
- package/dist/plugins/org-delivery-quota-store.js +31 -15
- package/dist/plugins/permission-rule-store-file.d.ts +3 -3
- package/dist/plugins/permission-rule-store-sql.d.ts +5 -64
- package/dist/plugins/permission-rule-store-sql.js +11 -95
- package/dist/plugins/pg-pool.d.ts +2 -32
- package/dist/plugins/pg-pool.js +24 -17
- package/dist/plugins/remote-env-device.d.ts +3 -2
- package/dist/plugins/remote-env-e2b.d.ts +8 -32
- package/dist/plugins/remote-env-e2b.js +44 -32
- package/dist/plugins/remote-env-host.d.ts +51 -17
- package/dist/plugins/remote-env-host.js +111 -42
- package/dist/plugins/remote-env-k8s.d.ts +40 -45
- package/dist/plugins/remote-env-k8s.js +111 -60
- package/dist/plugins/remote-env-local-docker.d.ts +152 -15
- package/dist/plugins/remote-env-local-docker.js +352 -72
- package/dist/plugins/remote-scratchpad.js +4 -0
- package/dist/plugins/retention-deployment.d.ts +49 -17
- package/dist/plugins/retention-deployment.js +39 -8
- package/dist/plugins/run-preview-m45.d.ts +11 -0
- package/dist/plugins/run-preview-m45.js +19 -0
- package/dist/plugins/run-store-sql.d.ts +82 -75
- package/dist/plugins/run-store-sql.js +164 -125
- package/dist/plugins/s3-answer.d.ts +2 -1
- package/dist/plugins/sandbox-reaper.d.ts +26 -0
- package/dist/plugins/sandbox-reaper.js +2 -0
- package/dist/plugins/scenario-prefix-switch-m42.d.ts +56 -0
- package/dist/plugins/scenario-prefix-switch-m42.js +56 -0
- package/dist/plugins/scheduler-support.d.ts +16 -1
- package/dist/plugins/scheduler-support.js +22 -2
- package/dist/plugins/schema-consistency.d.ts +131 -14
- package/dist/plugins/schema-consistency.js +388 -18
- package/dist/plugins/schema-drift-sentence.d.ts +10 -6
- package/dist/plugins/schema-drift-sentence.js +15 -7
- package/dist/plugins/schema-ensure-legs.d.ts +9 -0
- package/dist/plugins/schema-ensure-legs.js +1 -1
- package/dist/plugins/schema-indexes.js +3 -0
- package/dist/plugins/schema-live-columns.d.ts +14 -5
- package/dist/plugins/schema-live-columns.js +10 -10
- package/dist/plugins/send-user-file.js +2 -1
- package/dist/plugins/session-birth.d.ts +37 -0
- package/dist/plugins/session-birth.js +38 -0
- package/dist/plugins/session-epoch-anchor.d.ts +40 -12
- package/dist/plugins/session-epoch-anchor.js +33 -11
- package/dist/plugins/session-ext-table.d.ts +27 -3
- package/dist/plugins/session-ext-table.js +19 -6
- package/dist/plugins/session-fork.d.ts +15 -1
- package/dist/plugins/session-fork.js +3 -0
- package/dist/plugins/session-ownership.d.ts +1 -1
- package/dist/plugins/session-placement.d.ts +27 -20
- package/dist/plugins/session-placement.js +15 -12
- package/dist/plugins/session-row-sql.d.ts +12 -0
- package/dist/plugins/session-row-sql.js +3 -3
- package/dist/plugins/session-run-rollup.d.ts +29 -0
- package/dist/plugins/session-run-rollup.js +40 -0
- package/dist/plugins/session-store-sql.d.ts +38 -12
- package/dist/plugins/session-store-sql.js +130 -30
- package/dist/plugins/session-withdraw-sql.d.ts +36 -0
- package/dist/plugins/session-withdraw-sql.js +42 -0
- package/dist/plugins/shared-memory-store-sql.d.ts +0 -69
- package/dist/plugins/shared-memory-store-sql.js +2 -1
- package/dist/plugins/shell-sentinel-owner-m48.d.ts +42 -0
- package/dist/plugins/shell-sentinel-owner-m48.js +9 -0
- package/dist/plugins/snapshot-bucket-presence.d.ts +2 -1
- package/dist/plugins/sql-driver.d.ts +1 -1
- package/dist/plugins/sql-driver.js +2 -1
- package/dist/plugins/sql-errors.d.ts +32 -5
- package/dist/plugins/sql-errors.js +55 -7
- package/dist/plugins/sql-json-column.d.ts +8 -7
- package/dist/plugins/sql-json-column.js +10 -6
- package/dist/plugins/stop-then-start-sentence.d.ts +16 -0
- package/dist/plugins/stop-then-start-sentence.js +7 -0
- package/dist/plugins/store-backend.d.ts +99 -16
- package/dist/plugins/store-backend.js +230 -65
- package/dist/plugins/store-contracts.d.ts +123 -33
- package/dist/plugins/store-contracts.js +38 -1
- package/dist/plugins/store-fault.d.ts +28 -2
- package/dist/plugins/store-fault.js +20 -2
- package/dist/plugins/task-attachment-store.d.ts +15 -3
- package/dist/plugins/task-attachment-store.js +22 -9
- package/dist/plugins/tidb-pool.d.ts +11 -6
- package/dist/plugins/tidb-pool.js +39 -18
- package/dist/plugins/web-search.js +5 -3
- package/dist/plugins/workflow-run-store-sql.d.ts +6 -1
- package/dist/plugins/workflow-run-store-sql.js +11 -5
- package/dist/plugins/workspace-custody.d.ts +44 -0
- package/dist/plugins/workspace-custody.js +47 -0
- package/dist/principal-jwt.d.ts +4 -4
- package/dist/principal-jwt.js +20 -5
- package/dist/principal-shape.d.ts +41 -0
- package/dist/principal-shape.js +19 -0
- package/dist/project-identity.d.ts +8 -7
- package/dist/project-identity.js +40 -17
- package/dist/project-layer-key.d.ts +13 -2
- package/dist/project-layer-key.js +9 -1
- package/dist/question.d.ts +13 -23
- package/dist/question.js +21 -39
- package/dist/read-deny-floor-notice.d.ts +36 -0
- package/dist/read-deny-floor-notice.js +40 -0
- package/dist/{plain-string-record.d.ts → request-declaration-disposition.d.ts} +9 -23
- package/dist/request-declaration-disposition.js +39 -0
- package/dist/request-declaration-refusal.d.ts +35 -12
- package/dist/request-declaration-refusal.js +21 -9
- package/dist/request-form.d.ts +58 -0
- package/dist/request-form.js +72 -0
- package/dist/request-image-urls.d.ts +8 -2
- package/dist/request-image-urls.js +2 -1
- package/dist/request-images.d.ts +20 -0
- package/dist/request-images.js +59 -0
- package/dist/request-key-closure.d.ts +6 -7
- package/dist/request-key-closure.js +15 -2
- package/dist/resource-suspend.d.ts +7 -16
- package/dist/resource-suspend.js +1 -1
- package/dist/retired-name-host-notice.d.ts +21 -0
- package/dist/retired-name-host-notice.js +12 -0
- package/dist/rule-entry-list.d.ts +2 -2
- package/dist/rule-entry-list.js +3 -4
- package/dist/rule-issue-reading.d.ts +58 -0
- package/dist/rule-issue-reading.js +14 -0
- package/dist/rules-consent.d.ts +5 -3
- package/dist/rules-consent.js +1 -0
- package/dist/run-acceptance.d.ts +3 -1
- package/dist/run-acceptance.js +3 -0
- package/dist/run-cancel-card.d.ts +28 -0
- package/dist/run-cancel-card.js +19 -0
- package/dist/run-cancel-context.d.ts +10 -0
- package/dist/run-cancel-context.js +1 -0
- package/dist/run-local.d.ts +14 -6
- package/dist/run-local.js +117 -90
- package/dist/run-stale-default.d.ts +7 -0
- package/dist/run-stale-default.js +2 -0
- package/dist/runs.d.ts +56 -21
- package/dist/runs.js +73 -43
- package/dist/runtime-caps-resolver.d.ts +21 -6
- package/dist/runtime-caps-resolver.js +17 -4
- package/dist/runtime-governance.d.ts +2 -2
- package/dist/runtime-governance.js +5 -3
- package/dist/sealed-key-layout.d.ts +12 -5
- package/dist/sealed-key-layout.js +5 -0
- package/dist/sealed-key.d.ts +12 -2
- package/dist/sealed-key.js +115 -27
- package/dist/security.d.ts +128 -158
- package/dist/security.js +163 -59
- package/dist/sema-config-dir.d.ts +20 -0
- package/dist/sema-config-dir.js +25 -0
- package/dist/server-secret-env.d.ts +55 -25
- package/dist/server-secret-env.js +75 -22
- package/dist/session-agent.d.ts +3 -2
- package/dist/session-children-retire.d.ts +13 -8
- package/dist/session-children-retire.js +9 -7
- package/dist/session-deletion.d.ts +88 -0
- package/dist/session-deletion.js +8 -0
- package/dist/session-erase.d.ts +145 -0
- package/dist/session-erase.js +115 -0
- package/dist/session-error-wire.d.ts +5 -5
- package/dist/session-error-wire.js +1 -1
- package/dist/session-incarnation.d.ts +52 -5
- package/dist/session-incarnation.js +19 -2
- package/dist/session-policy-wire.d.ts +6 -3
- package/dist/session-policy-wire.js +11 -1
- package/dist/session-resident-background.d.ts +0 -71
- package/dist/session-resident-background.js +4 -3
- package/dist/session-row.d.ts +2 -1
- package/dist/session-rules-seat.d.ts +12 -0
- package/dist/session-rules-seat.js +19 -0
- package/dist/session-titler.d.ts +7 -15
- package/dist/session-titler.js +1 -1
- package/dist/session-workspace.d.ts +3 -3
- package/dist/spec-fields.d.ts +57 -3
- package/dist/spec-fields.js +72 -51
- package/dist/store-admission.d.ts +33 -0
- package/dist/store-admission.js +49 -0
- package/dist/store-posture.d.ts +141 -20
- package/dist/store-posture.js +205 -3
- package/dist/stored-request-hooks-m20.js +2 -2
- package/dist/stores-sql/background-agent-store-sql.d.ts +11 -2
- package/dist/stores-sql/background-agent-store-sql.js +73 -20
- package/dist/stores-sql/checkpoint-store-sql.d.ts +34 -29
- package/dist/stores-sql/checkpoint-store-sql.js +78 -49
- package/dist/stores-sql/file-history-store-sql.d.ts +1 -1
- package/dist/stores-sql/file-history-store-sql.js +3 -5
- package/dist/stores-sql/mailbox-store-sql.d.ts +7 -4
- package/dist/stores-sql/mailbox-store-sql.js +31 -32
- package/dist/stores-sql/pg-session-storage.d.ts +7 -5
- package/dist/stores-sql/pg-session-storage.js +54 -46
- package/dist/stores-sql/retention-store-sql.d.ts +87 -19
- package/dist/stores-sql/retention-store-sql.js +92 -27
- package/dist/stores-sql/session-policy-store-sql.d.ts +32 -10
- package/dist/stores-sql/session-policy-store-sql.js +44 -36
- package/dist/stores-sql/session-write-hooks.d.ts +12 -6
- package/dist/stores-sql/tidb-session-storage.d.ts +4 -4
- package/dist/stores-sql/tidb-session-storage.js +13 -8
- package/dist/stores-sql/tidb-session-store.d.ts +36 -17
- package/dist/stores-sql/tidb-session-store.js +69 -39
- package/dist/stores-sql/tool-result-store-sql.d.ts +1 -1
- package/dist/stores-sql/tool-result-store-sql.js +4 -6
- package/dist/stores-sql/windowed-session-storage.d.ts +5 -0
- package/dist/stores-sql/windowed-session-storage.js +9 -0
- package/dist/submission-exit.d.ts +50 -0
- package/dist/submission-exit.js +108 -0
- package/dist/task-a2a.d.ts +3 -8
- package/dist/task-a2a.js +28 -30
- package/dist/task-cwd.d.ts +43 -7
- package/dist/task-cwd.js +11 -0
- package/dist/task-mcp.d.ts +3 -3
- package/dist/task-mcp.js +4 -4
- package/dist/task-settings.d.ts +14 -10
- package/dist/task-settings.js +19 -7
- package/dist/terminal.d.ts +27 -43
- package/dist/terminal.js +49 -14
- package/dist/tool-approval.d.ts +173 -163
- package/dist/tool-approval.js +247 -232
- package/dist/trace/core-keyset-guard.d.ts +13 -6
- package/dist/trace/core-vocab-wire.d.ts +95 -0
- package/dist/trace/core-vocab-wire.js +15 -0
- package/dist/trace/engine-notice-wire.d.ts +24 -21
- package/dist/trace/engine-notice-wire.js +7 -3
- package/dist/trace/exit-seat.d.ts +30 -4
- package/dist/trace/exit-seat.js +40 -36
- package/dist/trace/extension-call-face.d.ts +3 -2
- package/dist/trace/extension-call-face.js +3 -1
- package/dist/trace/ledger-events.d.ts +4 -7
- package/dist/trace/ledger-sink.d.ts +4 -31
- package/dist/trace/ledger-sink.js +0 -11
- package/dist/trace/model-segment.d.ts +5 -5
- package/dist/trace/model-segment.js +5 -5
- package/dist/trace/project.d.ts +59 -44
- package/dist/trace/project.js +60 -26
- package/dist/trace/redact.d.ts +135 -27
- package/dist/trace/redact.js +884 -260
- package/dist/trace/self-minted-wire.d.ts +567 -20
- package/dist/trace/self-minted-wire.js +205 -24
- package/dist/trace/wire-projection-faces.d.ts +5 -6
- package/dist/trace/wire-projection-faces.js +2 -2
- package/dist/upstream-body.d.ts +23 -0
- package/dist/upstream-body.js +16 -0
- package/dist/url-refusal.d.ts +3 -3
- package/dist/url-refusal.js +11 -4
- package/dist/user-authored-text.d.ts +1 -1
- package/dist/user-input-ledger.d.ts +7 -8
- package/dist/user-input-ledger.js +1 -1
- package/dist/web-admin-client/apply-effective.d.ts +6 -3
- package/dist/web-admin-client/apply-effective.js +33 -23
- package/dist/web-admin-client/apply-ledger.d.ts +16 -7
- package/dist/web-admin-client/apply-ledger.js +5 -2
- package/dist/web-admin-client/center-request.d.ts +2 -2
- package/dist/web-admin-client/center-request.js +15 -15
- package/dist/web-admin-client/effective-keys.d.ts +1 -1
- package/dist/web-admin-client/effective-keys.js +1 -1
- package/dist/web-admin-client/entry-metadata.d.ts +8 -0
- package/dist/web-admin-client/entry-metadata.js +13 -0
- package/dist/web-admin-client/http-client.d.ts +1 -1
- package/dist/web-admin-client/http-client.js +23 -4
- package/dist/web-admin-client/mcp-revocation.d.ts +1 -1
- package/dist/web-admin-client/mcp-revocation.js +2 -1
- package/dist/web-admin-client/read-warnings.d.ts +1 -0
- package/dist/web-admin-client/read-warnings.js +1 -0
- package/dist/web-admin-client/restart-signal.js +8 -4
- package/dist/web-admin-client/skills-mcp.d.ts +2 -2
- package/dist/web-admin-client/types.d.ts +1 -2
- package/dist/workspace-space.d.ts +3 -2
- package/docs/DEVICE-EXECUTOR-PROTOCOL.md +4 -4
- package/docs/error-text-lexicon.json +317 -0
- package/package.json +8 -3
- package/scripts/drain-check-local.mjs +118 -147
- package/scripts/drain-check.mysql.sql +22 -2
- package/scripts/drain-check.pg.sql +22 -2
- package/scripts/embed-minimal.mjs +183 -0
- package/wire-changes/server@7.148.0.json +1517 -0
- package/wire-changes/server@7.149.0.json +372 -0
- package/dist/http/memory-control-plane-corrupt-reply.d.ts +0 -25
- package/dist/http/memory-control-plane-corrupt-reply.js +0 -19
- package/dist/http/memory-layer-reply.d.ts +0 -30
- package/dist/http/memory-layer-reply.js +0 -24
- package/dist/lsp/e2b-bridge.d.ts +0 -57
- package/dist/lsp/e2b-bridge.js +0 -139
- package/dist/lsp/e2b-manager.d.ts +0 -93
- package/dist/lsp/e2b-manager.js +0 -178
- package/dist/lsp/lsp-frames.d.ts +0 -14
- package/dist/lsp/lsp-frames.js +0 -25
- package/dist/lsp/manager.d.ts +0 -129
- package/dist/lsp/manager.js +0 -127
- package/dist/lsp/types.d.ts +0 -12
- package/dist/lsp/types.js +0 -2
- package/dist/lsp/ws-transport.d.ts +0 -40
- package/dist/lsp/ws-transport.js +0 -210
- package/dist/plain-string-record.js +0 -70
package/dist/http/routes/runs.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
|
+
import { seatText } from "../../trace/exit-seat.js";
|
|
1
2
|
import { liveToolEndForBacklog } from "../../trace/tool-output-media.js";
|
|
2
3
|
import { redactHead, redactLedgerEventForRead } from "../../observability/run-terminal.js";
|
|
3
4
|
import { z } from "zod";
|
|
4
5
|
import { uuidv7, mintCheckpointToken, CheckpointError, policyCannotAnswer, validatePendingSteer, TASK_OUTPUT_REPLAY_KINDS, isSystemInjectionPriority } from "@sema-agent/core";
|
|
5
|
-
import { isTerminalRunStatus, isParkedRunStatus, runProvenElsewhere } from "../../plugins/store-contracts.js";
|
|
6
|
-
import {
|
|
6
|
+
import { isHolderDeathVerdict, isTerminalRunStatus, isParkedRunStatus, runProvenElsewhere } from "../../plugins/store-contracts.js";
|
|
7
|
+
import { askRowCarriesOwner } from "../../plugins/approval-ask-store-sql.js";
|
|
7
8
|
import { LIVE_RUN_GATE_KINDS, TERMINAL_PARK_GATE_KINDS } from "../../plugins/checkpoint-store-face.js";
|
|
9
|
+
import { runCancelCardOf } from "../../run-cancel-card.js";
|
|
10
|
+
import { CARD_EXPIRE_OUTCOME, expireCardUnderStoredScope } from "../../card-settle-stored-scope.js";
|
|
8
11
|
import { redactSecrets } from "../../trace/redact.js";
|
|
9
12
|
import { isUuidV7, encodeCheckpointScope } from "../../security.js";
|
|
10
13
|
import { redactSteerIn, STEER_IN_MAX_CHARS, STEER_IN_MAX_REQUEST_CHARS } from "../../orchestration/workflow-agent-steer.js";
|
|
@@ -14,7 +17,7 @@ import { streamSseLog } from "../sse-log.js";
|
|
|
14
17
|
import { bindSseLifecycle } from "../sse-lifecycle.js";
|
|
15
18
|
import { buildApprovalPreamble, buildApprovalPreambleSseFrames, readClosedWordSeat, storedCardDemandsAPerson } from "../../approval-card.js";
|
|
16
19
|
import { heldAskOf, liveHostSource, readDecider, retiredDecisionKeyFacts, DECIDED_BY_NOT_IN_PROOF, POLICY_CANNOT_ALLOW_PERSON_ASK } from "../../host-decision.js";
|
|
17
|
-
import { ASK_DECISION_CONSUMER_ABSENT, approvalPreambleReplays, outcomeOfDecidedRow, presentedApprovalFrameFamily, resolveStreamApprovalGate } from "../../tool-approval.js";
|
|
20
|
+
import { ASK_DECISION_CONSUMER_ABSENT, approvalPreambleReplays, outcomeOfDecidedRow, parkSessionOf, presentedApprovalFrameFamily, resolveStreamApprovalGate } from "../../tool-approval.js";
|
|
18
21
|
import { MAX_DECISION_NOTE_CHARS, noteLandedOnRow, noteRecordedReceipt } from "../../approval-ask-machine.js";
|
|
19
22
|
import { askRowEndingCause } from "../../approval-deny-reasons.js";
|
|
20
23
|
import { normalizeRunEventType, screenedStoredEventData } from "../../trace/project.js";
|
|
@@ -22,21 +25,24 @@ import { invalidJsonError, sendJson, sendError, sendHttpError, sseHeaders } from
|
|
|
22
25
|
import { mintCancelledResult } from "../../run-cancel-context.js";
|
|
23
26
|
import { acceptedInputKindOf } from "../../user-input-ledger.js";
|
|
24
27
|
import { INJECTION_TIERS } from "../../trace/injection-tier.js";
|
|
25
|
-
import { headerStr,
|
|
28
|
+
import { headerStr, gatedSubject, explicitOperatorOk, sendPrincipalRefusal, runIdentityOf } from "../principal-gate.js";
|
|
26
29
|
import { ActorAssertionWire } from "@sema-agent/settings-schema";
|
|
27
30
|
import * as facts from "../../capability-facts.js";
|
|
28
31
|
import { assertNever } from "../route-ctx.js";
|
|
29
32
|
import { readRunFace } from "../run-read-face.js";
|
|
30
33
|
import { replayOfExistingRun } from "../submit-replay.js";
|
|
31
34
|
import { mintAndDriveDurableRun } from "../durable-run-leg.js";
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
34
|
-
import {
|
|
35
|
+
import { SUBMISSION_CLAIM_FACE } from "../execution-context.js";
|
|
36
|
+
import { admitRunById, admitRunRow, enter, runRowAt } from "../owner-access.js";
|
|
37
|
+
import { keyAdmission, ownerCellOf, recoveredSubject } from "../../owner-faces.js";
|
|
38
|
+
import { personOf } from "../../owner-brands.js";
|
|
39
|
+
import { withSubject } from "../../observability/principal-context.js";
|
|
40
|
+
import { readResumeCtx, resumeCtxUnreadableAnswer } from "../resume-ctx-read.js";
|
|
35
41
|
import { storedBodyReplayAnswer, storedBodyReplayLogFields } from "../checkpoint-ctx.js";
|
|
36
42
|
import { headReadOf } from "../../session-incarnation.js";
|
|
37
43
|
import { serviceVersion } from "../../service-version.js";
|
|
38
44
|
import { storedBodyReplayRefusal } from "../stored-body-replay.js";
|
|
39
|
-
import { steerBodyKeyIssue } from "../../request-key-closure.js";
|
|
45
|
+
import { haltBodyIssue, steerBodyKeyIssue } from "../../request-key-closure.js";
|
|
40
46
|
import { fieldConflictFacts } from "../../field-conflict.js";
|
|
41
47
|
const STEER_PRIORITY_WORDS = INJECTION_TIERS.map((tier) => `'${tier}'`);
|
|
42
48
|
const STEER_PRIORITY_UNION = STEER_PRIORITY_WORDS.join(" | ");
|
|
@@ -78,28 +84,16 @@ export function projectDecisionActor(raw) {
|
|
|
78
84
|
const parsed = AskDecisionActorSchema.safeParse(raw);
|
|
79
85
|
return parsed.success ? parsed.data : undefined;
|
|
80
86
|
}
|
|
81
|
-
async function subagentReadGate(req, res, ctx, runId,
|
|
87
|
+
async function subagentReadGate(req, res, ctx, runId, route) {
|
|
82
88
|
const { deps } = ctx;
|
|
83
|
-
const
|
|
84
|
-
if (
|
|
85
|
-
sendPrincipalRefusal(res, req, deps.config);
|
|
89
|
+
const entry = enter(req, res, deps, route);
|
|
90
|
+
if (entry === undefined)
|
|
86
91
|
return null;
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
const run = await deps.runStore.getRun(runId);
|
|
90
|
-
if (!run) {
|
|
91
|
-
sendError(res, 404, "not_found.run", RUN_NOT_FOUND_MESSAGE);
|
|
92
|
-
return null;
|
|
93
|
-
}
|
|
94
|
-
if (!trusted && !ctx.helpers.runOwnerOk(req, res, run.owner)) {
|
|
92
|
+
const admitted = (await admitRunById(entry, res, deps.runStore, runId));
|
|
93
|
+
if (admitted === undefined)
|
|
95
94
|
return null;
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
if (!trusted && run.sessionId && callerSession !== run.sessionId) {
|
|
99
|
-
sendError(res, 404, "not_found.run", RUN_NOT_FOUND_MESSAGE);
|
|
100
|
-
return null;
|
|
101
|
-
}
|
|
102
|
-
return { run, trusted };
|
|
95
|
+
const trusted = admitted.quals.has("operator");
|
|
96
|
+
return { run: admitted.row, trusted };
|
|
103
97
|
}
|
|
104
98
|
function sendHandleMiss(res, run, thisInstanceId) {
|
|
105
99
|
if (isTerminalRunStatus(run.status)) {
|
|
@@ -112,7 +106,7 @@ function sendHandleMiss(res, run, thisInstanceId) {
|
|
|
112
106
|
}
|
|
113
107
|
return false;
|
|
114
108
|
}
|
|
115
|
-
async function streamRunEvents(req, res, deps, runStore, taskId
|
|
109
|
+
async function streamRunEvents(req, res, deps, runStore, taskId) {
|
|
116
110
|
await streamSseLog(req, res, {
|
|
117
111
|
preamble: async (signal) => {
|
|
118
112
|
const gate = resolveStreamApprovalGate({
|
|
@@ -143,7 +137,7 @@ async function streamRunEvents(req, res, deps, runStore, taskId, staleMs) {
|
|
|
143
137
|
onPreambleFailure: (reason, err) => deps.logger?.warn?.("approval_preamble_failed", { taskId, reason, face: "run.events", error: err instanceof Error ? err.message : String(err ?? "") }),
|
|
144
138
|
statusOf: async (id) => {
|
|
145
139
|
const run = await runStore.getRun(id);
|
|
146
|
-
return run ?
|
|
140
|
+
return run ? runRowAt("run-events", runStore, run) : undefined;
|
|
147
141
|
},
|
|
148
142
|
getEvents: (id, after) => runStore.getEvents(id, after),
|
|
149
143
|
formatEvent: (ev) => {
|
|
@@ -152,13 +146,16 @@ async function streamRunEvents(req, res, deps, runStore, taskId, staleMs) {
|
|
|
152
146
|
const data = screenedStoredEventData(type, redacted);
|
|
153
147
|
return { id: ev.seq, event: type, data: { type, ...(data ?? {}) } };
|
|
154
148
|
},
|
|
155
|
-
|
|
156
|
-
|
|
149
|
+
isTerminalEvent: (ev) => ev.type === "done" || ev.type === "failed",
|
|
150
|
+
closingFrameOf: (row, deliveredTerminal) => !deliveredTerminal && isHolderDeathVerdict(row)
|
|
151
|
+
? { event: "failed", data: { type: "failed", ...(row.error !== null ? { errorMessage: seatText("trace-frame-text", row.error) } : {}), errorCode: row.errorCode } }
|
|
152
|
+
: undefined,
|
|
153
|
+
}, taskId);
|
|
157
154
|
}
|
|
158
155
|
function sendSteerReplayRefusal(res, refusal) {
|
|
159
156
|
const detail = refusal?.detail;
|
|
160
157
|
const differs = detail !== null && typeof detail === "object" ? readClosedWordSeat(detail, "differs") : undefined;
|
|
161
|
-
sendError(res, 409, "steering.duplicate_input_id", refusal instanceof Error ? refusal.message : "this steering input id was already accepted with different values", differs !== undefined ? {
|
|
158
|
+
sendError(res, 409, "steering.duplicate_input_id", refusal instanceof Error ? refusal.message : "this steering input id was already accepted with different values", differs !== undefined ? { differs } : undefined);
|
|
162
159
|
}
|
|
163
160
|
async function acceptLiveUserInput(deps, res, at) {
|
|
164
161
|
if (!deps.userInputLedger)
|
|
@@ -190,7 +187,7 @@ async function relayAcceptedInput(deps, acceptance, call) {
|
|
|
190
187
|
export async function handleRuns(req, res, match, ctx) {
|
|
191
188
|
const { deps } = ctx;
|
|
192
189
|
const { idemCache, inflightRuns, preemptableRuns, steerableRuns, wakeParkMints } = ctx.registry;
|
|
193
|
-
const { readJson, rateLimited, quotaExceeded, leaseDenied, usageWindowDenied
|
|
190
|
+
const { readJson, rateLimited, quotaExceeded, leaseDenied, usageWindowDenied } = ctx.helpers;
|
|
194
191
|
const { prepareSpec } = ctx.legs;
|
|
195
192
|
const source = ctx.req.source;
|
|
196
193
|
if (match.decl.id === "runs-submit") {
|
|
@@ -201,7 +198,7 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
201
198
|
}
|
|
202
199
|
const runStore = runs.runStore;
|
|
203
200
|
const rawIdem = headerStr(req.headers["idempotency-key"]);
|
|
204
|
-
const submitter =
|
|
201
|
+
const submitter = gatedSubject(req, deps.config);
|
|
205
202
|
const keyedBody = rawIdem ? await readJson(req) : undefined;
|
|
206
203
|
const idem = rawIdem ? submissionIdemOf(rawIdem, idemCallerOf(req, ctx), keyedBody) : undefined;
|
|
207
204
|
if (idem) {
|
|
@@ -213,14 +210,19 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
213
210
|
const inflight = idemCache.peek(inflightKeyOf(idem, "durable", clientTaskId));
|
|
214
211
|
const keyedRow = inflight ? undefined : await runStore.getRunByIdem(idem.key);
|
|
215
212
|
if (inflight || keyedRow) {
|
|
216
|
-
const resp = inflight ? await inflight : await replayOfExistingRun(keyedRow, {
|
|
213
|
+
const resp = inflight ? await inflight : await replayOfExistingRun(keyedRow, { subject: submitter, idem, ...(clientTaskId !== undefined ? { clientTaskId } : {}) }, "durable", deps, runStore);
|
|
217
214
|
sendJson(res, resp.status, resp.body);
|
|
218
215
|
return;
|
|
219
216
|
}
|
|
220
217
|
}
|
|
221
218
|
if (rateLimited(req, res) || quotaExceeded(req, res))
|
|
222
219
|
return;
|
|
223
|
-
const
|
|
220
|
+
const body = rawIdem ? keyedBody : await readJson(req);
|
|
221
|
+
if (!idem && clientTaskIdOf(body) === false) {
|
|
222
|
+
sendError(res, 400, "request.id_invalid", "body.taskId must be a uuidv7 string (caller-minted idempotency key)");
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
const prepared = await prepareSpec(req, res, body);
|
|
224
226
|
if (!prepared)
|
|
225
227
|
return;
|
|
226
228
|
try {
|
|
@@ -241,12 +243,11 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
241
243
|
return;
|
|
242
244
|
}
|
|
243
245
|
const runStore = runs.runStore;
|
|
244
|
-
|
|
245
|
-
|
|
246
|
+
const entry = enter(req, res, deps, match.decl.id);
|
|
247
|
+
if (entry === undefined)
|
|
246
248
|
return;
|
|
247
|
-
}
|
|
248
249
|
let run;
|
|
249
|
-
let
|
|
250
|
+
let pathId;
|
|
250
251
|
if (match.decl.id === "runs-by-idem") {
|
|
251
252
|
const rawKey = new URLSearchParams(match.search).get("idempotencyKey");
|
|
252
253
|
if (!rawKey) {
|
|
@@ -254,27 +255,20 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
254
255
|
return;
|
|
255
256
|
}
|
|
256
257
|
run = await runStore.getRunByIdem(idemKeyOf(rawKey, idemCallerOf(req, ctx), "run"));
|
|
257
|
-
notFound = RUN_NOT_FOUND_MESSAGE;
|
|
258
258
|
}
|
|
259
259
|
else {
|
|
260
|
-
|
|
261
|
-
run = await runStore.getRun(
|
|
262
|
-
notFound = runNotFoundMessage(taskId);
|
|
263
|
-
}
|
|
264
|
-
if (!run) {
|
|
265
|
-
sendError(res, 404, "not_found.run", notFound);
|
|
266
|
-
return;
|
|
260
|
+
pathId = match.params.taskId;
|
|
261
|
+
run = await runStore.getRun(pathId);
|
|
267
262
|
}
|
|
268
|
-
const
|
|
269
|
-
if (
|
|
270
|
-
return;
|
|
271
|
-
if (!runSessionAcceptOk(req, res, run, match.decl.id === "run-events" ? "run.events" : "run.poll"))
|
|
263
|
+
const admitted = await admitRunRow(entry, res, runStore, run, pathId);
|
|
264
|
+
if (admitted === undefined)
|
|
272
265
|
return;
|
|
266
|
+
const taskId = admitted.row.taskId;
|
|
273
267
|
if (match.decl.id === "run-events") {
|
|
274
|
-
await streamRunEvents(req, res, deps, runStore, taskId
|
|
268
|
+
await streamRunEvents(req, res, deps, runStore, taskId);
|
|
275
269
|
}
|
|
276
270
|
else {
|
|
277
|
-
sendJson(res, 200, await readRunFace(deps, runStore,
|
|
271
|
+
sendJson(res, 200, await readRunFace(deps, runStore, admitted.row));
|
|
278
272
|
}
|
|
279
273
|
return;
|
|
280
274
|
}
|
|
@@ -285,29 +279,22 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
285
279
|
return;
|
|
286
280
|
}
|
|
287
281
|
const runStore = runs.runStore;
|
|
288
|
-
|
|
289
|
-
|
|
282
|
+
const entry = enter(req, res, deps, match.decl.id);
|
|
283
|
+
if (entry === undefined)
|
|
290
284
|
return;
|
|
291
|
-
}
|
|
292
285
|
const taskId = match.params.taskId;
|
|
293
|
-
const
|
|
294
|
-
if (
|
|
295
|
-
sendError(res, 404, "not_found.run", runNotFoundMessage(taskId));
|
|
296
|
-
return;
|
|
297
|
-
}
|
|
298
|
-
if (!runOwnerOk(req, res, run.owner))
|
|
299
|
-
return;
|
|
300
|
-
if (!runSessionAcceptOk(req, res, run, "run.cancel"))
|
|
286
|
+
const cancelAdmitted = (await admitRunById(entry, res, runStore, taskId));
|
|
287
|
+
if (cancelAdmitted === undefined)
|
|
301
288
|
return;
|
|
289
|
+
const run = cancelAdmitted.row;
|
|
302
290
|
const rs = runStore;
|
|
303
|
-
const cancelSuspended = async () => {
|
|
291
|
+
const cancelSuspended = async (parked) => {
|
|
304
292
|
const cs = deps.checkpointStore;
|
|
305
293
|
let note = "cancelled while suspended (pending approval settled)";
|
|
306
294
|
if (cs) {
|
|
307
|
-
const token = await cs
|
|
295
|
+
const token = await runCancelCardOf(cs, run.sessionId);
|
|
308
296
|
if (token) {
|
|
309
|
-
const
|
|
310
|
-
const won = cp ? await cs.expire(token, cp.scope) : false;
|
|
297
|
+
const won = (await expireCardUnderStoredScope(cs, token)) === CARD_EXPIRE_OUTCOME.expired;
|
|
311
298
|
if (!won) {
|
|
312
299
|
const now = await rs.getRun(taskId);
|
|
313
300
|
const st = now?.status;
|
|
@@ -341,7 +328,7 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
341
328
|
}
|
|
342
329
|
const err = note;
|
|
343
330
|
try {
|
|
344
|
-
const result = mintCancelledResult({ taskId, sessionId: run.sessionId, startedAtMs: Date.parse(run.createdAt), message: err, cause: "cancel_verb" });
|
|
331
|
+
const result = mintCancelledResult({ taskId, sessionId: run.sessionId, startedAtMs: Date.parse(run.createdAt), message: err, cause: "cancel_verb", parkedResult: parked });
|
|
345
332
|
let lastErr;
|
|
346
333
|
for (let attempt = 0;; attempt++) {
|
|
347
334
|
try {
|
|
@@ -376,7 +363,7 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
376
363
|
for (let attempt = 0; !flagged; attempt++) {
|
|
377
364
|
const now = await runStore.getRun(taskId);
|
|
378
365
|
if (now !== undefined && isParkedRunStatus(now.status)) {
|
|
379
|
-
await cancelSuspended();
|
|
366
|
+
await cancelSuspended(now.result);
|
|
380
367
|
return;
|
|
381
368
|
}
|
|
382
369
|
if (now?.status === "running" && attempt < CANCEL_RECLASSIFY_ATTEMPTS) {
|
|
@@ -394,7 +381,7 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
394
381
|
sendJson(res, 202, { taskId, status: "cancelling", cancelRequested: true });
|
|
395
382
|
}
|
|
396
383
|
else if (isParkedRunStatus(run.status)) {
|
|
397
|
-
await cancelSuspended();
|
|
384
|
+
await cancelSuspended(run.result);
|
|
398
385
|
}
|
|
399
386
|
else {
|
|
400
387
|
sendJson(res, 202, { taskId, status: run.status, cancelRequested: run.cancelRequested, note: "run already terminal — cancel is a no-op" });
|
|
@@ -410,11 +397,9 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
410
397
|
return;
|
|
411
398
|
}
|
|
412
399
|
const runStore = runs.runStore;
|
|
413
|
-
const
|
|
414
|
-
if (
|
|
415
|
-
sendPrincipalRefusal(res, req, deps.config);
|
|
400
|
+
const entry = enter(req, res, deps, match.decl.id);
|
|
401
|
+
if (entry === undefined)
|
|
416
402
|
return;
|
|
417
|
-
}
|
|
418
403
|
const taskId = match.params.taskId;
|
|
419
404
|
const body = ((await readJson(req)) ?? {});
|
|
420
405
|
if (typeof body.text !== "string" || body.text.length === 0) {
|
|
@@ -440,7 +425,6 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
440
425
|
const priority = body.priority;
|
|
441
426
|
const steerIdemRaw = headerStr(req.headers["idempotency-key"]);
|
|
442
427
|
const messageId = steerIdemRaw ? `idem-${idemKeyOf(steerIdemRaw, idemCallerOf(req, ctx), "run").slice(0, 32)}` : uuidv7();
|
|
443
|
-
const operator = explicitOperatorOk(principal, deps.config);
|
|
444
428
|
const steerInput = () => ({
|
|
445
429
|
text,
|
|
446
430
|
trusted: false,
|
|
@@ -457,15 +441,10 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
457
441
|
}
|
|
458
442
|
throw e;
|
|
459
443
|
}
|
|
460
|
-
const
|
|
461
|
-
if (
|
|
462
|
-
sendError(res, 404, "not_found.run", runNotFoundMessage(taskId));
|
|
463
|
-
return;
|
|
464
|
-
}
|
|
465
|
-
if (!operator && !runOwnerOk(req, res, run.owner))
|
|
466
|
-
return;
|
|
467
|
-
if (!runSessionAcceptOk(req, res, run, "run.steer"))
|
|
444
|
+
const steerAdmitted = (await admitRunById(entry, res, runStore, taskId));
|
|
445
|
+
if (steerAdmitted === undefined)
|
|
468
446
|
return;
|
|
447
|
+
const run = steerAdmitted.row;
|
|
469
448
|
let parkQueueFull;
|
|
470
449
|
let parkDuplicateKey;
|
|
471
450
|
const tryPark = async () => {
|
|
@@ -473,7 +452,7 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
473
452
|
if (!park.available)
|
|
474
453
|
return "no-store";
|
|
475
454
|
const cs = park.checkpointStore;
|
|
476
|
-
const parkBinding = { gateKinds: LIVE_RUN_GATE_KINDS };
|
|
455
|
+
const parkBinding = { gateKinds: LIVE_RUN_GATE_KINDS, axis: "run" };
|
|
477
456
|
const scope = await cs.peekPendingScope(run.sessionId, parkBinding);
|
|
478
457
|
if (scope === null || scope === undefined)
|
|
479
458
|
return "no-checkpoint";
|
|
@@ -583,7 +562,7 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
583
562
|
return;
|
|
584
563
|
}
|
|
585
564
|
const prior = wakeParkMints.get(run.sessionId) ?? Promise.resolve();
|
|
586
|
-
const mintResult = { parked: false, queueFull: false, duplicateKey: false, noResumeCtx: false };
|
|
565
|
+
const mintResult = { parked: false, queueFull: false, duplicateKey: false, noResumeCtx: false, unreadableCtx: false };
|
|
587
566
|
const parkOnce = async (t, sc) => {
|
|
588
567
|
try {
|
|
589
568
|
if (await deps.checkpointStore.setPendingSteer(t, sc, steerInput()))
|
|
@@ -638,6 +617,10 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
638
617
|
mintResult.unsealableCtx = resumeRead;
|
|
639
618
|
return;
|
|
640
619
|
}
|
|
620
|
+
if (resumeRead.kind === "unreadable") {
|
|
621
|
+
mintResult.unreadableCtx = true;
|
|
622
|
+
return;
|
|
623
|
+
}
|
|
641
624
|
if (resumeRead.kind === "absent") {
|
|
642
625
|
mintResult.noResumeCtx = true;
|
|
643
626
|
return;
|
|
@@ -661,7 +644,11 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
661
644
|
createdAt: Date.now(),
|
|
662
645
|
sourceSessionId: run.sessionId,
|
|
663
646
|
});
|
|
664
|
-
const
|
|
647
|
+
const withdrawThenRethrow = async (e) => {
|
|
648
|
+
await withdrawWakeCard(wakeToken, cpScope, "resume_context_defect");
|
|
649
|
+
throw e;
|
|
650
|
+
};
|
|
651
|
+
const stillRead = await readResumeCtx(cs.getCtx(run.sessionId), { sessionId: run.sessionId, opener: deps.checkpointCtxSealing }).catch(withdrawThenRethrow);
|
|
665
652
|
if (stillRead.kind === "corrupt" || stillRead.kind === "unsealable") {
|
|
666
653
|
await withdrawWakeCard(wakeToken, cpScope, stillRead.kind === "corrupt" ? "resume_context_corrupt" : "resume_context_unsealable");
|
|
667
654
|
if (stillRead.kind === "corrupt")
|
|
@@ -670,12 +657,17 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
670
657
|
mintResult.unsealableCtx = stillRead;
|
|
671
658
|
return;
|
|
672
659
|
}
|
|
660
|
+
if (stillRead.kind === "unreadable") {
|
|
661
|
+
await withdrawWakeCard(wakeToken, cpScope, "resume_context_unreadable");
|
|
662
|
+
mintResult.unreadableCtx = true;
|
|
663
|
+
return;
|
|
664
|
+
}
|
|
673
665
|
if (stillRead.kind !== "ok") {
|
|
674
666
|
await withdrawWakeCard(wakeToken, cpScope, "resume_context_absent");
|
|
675
667
|
mintResult.noResumeCtx = true;
|
|
676
668
|
return;
|
|
677
669
|
}
|
|
678
|
-
const winner = await cs.findPendingTokenBySession(run.sessionId, undefined, { gateKinds: TERMINAL_PARK_GATE_KINDS, pick: "oldest" }).catch(() => null);
|
|
670
|
+
const winner = await cs.findPendingTokenBySession(run.sessionId, undefined, { gateKinds: TERMINAL_PARK_GATE_KINDS, pick: "oldest", axis: "run" }).catch(() => null);
|
|
679
671
|
if (winner !== null && winner !== wakeToken) {
|
|
680
672
|
await withdrawWakeCard(wakeToken, cpScope, "converged_on_winner");
|
|
681
673
|
await parkOnce(winner, cpScope);
|
|
@@ -708,6 +700,11 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
708
700
|
sendError(res, 409, "conflict.checkpoint_ctx_unsealable", "run already ended and this session's stored resume context holds credentials this server cannot unseal (reason says why) — nothing was queued, because POST /v1/sessions/:id/wake could not resume it; restore the sealed-key directory that sealed them, restart this server (it reads its keys only at startup) and steer again, or submit a new task instead", { field: mintResult.unsealableCtx.field, reason: mintResult.unsealableCtx.reason });
|
|
709
701
|
return;
|
|
710
702
|
}
|
|
703
|
+
if (mintResult.unreadableCtx) {
|
|
704
|
+
const { status, body: { error, errorCode, ...facts } } = resumeCtxUnreadableAnswer();
|
|
705
|
+
sendError(res, status, errorCode, error, facts);
|
|
706
|
+
return;
|
|
707
|
+
}
|
|
711
708
|
if (mintResult.unservable !== undefined) {
|
|
712
709
|
deps.logger?.warn?.("steer_wake_park_refused_stored_body", { taskId, sessionId: run.sessionId, ...storedBodyReplayLogFields(mintResult.unservable) });
|
|
713
710
|
const { status, body: { error, errorCode, ...rest } } = storedBodyReplayAnswer(mintResult.unservable, serviceVersion(), false);
|
|
@@ -735,62 +732,23 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
735
732
|
return;
|
|
736
733
|
}
|
|
737
734
|
const runStore = runs.runStore;
|
|
738
|
-
const
|
|
739
|
-
if (
|
|
740
|
-
sendPrincipalRefusal(res, req, deps.config);
|
|
735
|
+
const entry = enter(req, res, deps, match.decl.id);
|
|
736
|
+
if (entry === undefined)
|
|
741
737
|
return;
|
|
742
|
-
}
|
|
743
738
|
const taskId = match.params.taskId;
|
|
744
|
-
const
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
sendError(res, 400, "request.body_shape", "body must be {} (bare halt: cut the in-flight turn and stop the run at this boundary) or { text: string (non-empty) } (cut + steer: the text reaches the model after the cut)");
|
|
748
|
-
return;
|
|
749
|
-
}
|
|
750
|
-
const interruptBody = interruptNormalized;
|
|
751
|
-
const interruptBare = !("text" in interruptBody);
|
|
752
|
-
let text = "";
|
|
753
|
-
if (!interruptBare) {
|
|
754
|
-
if (typeof interruptBody.text !== "string" || interruptBody.text.length === 0) {
|
|
755
|
-
sendError(res, 400, "request.body_shape", "body must be {} (bare halt: cut the in-flight turn and stop the run at this boundary) or { text: string (non-empty) } (cut + steer: the text reaches the model after the cut)");
|
|
756
|
-
return;
|
|
757
|
-
}
|
|
758
|
-
text = interruptBody.text;
|
|
759
|
-
}
|
|
760
|
-
const keyIssue = steerBodyKeyIssue(interruptBody, "interrupt");
|
|
761
|
-
if (keyIssue) {
|
|
762
|
-
sendError(res, 400, "request.body_shape", keyIssue.message, { unknownKeys: keyIssue.unknownKeys, unsupportedKeys: keyIssue.unsupportedKeys });
|
|
739
|
+
const haltIssue = haltBodyIssue(await readJson(req));
|
|
740
|
+
if (haltIssue) {
|
|
741
|
+
sendError(res, 400, "request.body_shape", haltIssue.message, { unknownKeys: haltIssue.unknownKeys, unsupportedKeys: haltIssue.unsupportedKeys });
|
|
763
742
|
return;
|
|
764
743
|
}
|
|
765
|
-
const
|
|
766
|
-
|
|
767
|
-
const interruptMessageId = interruptInputId;
|
|
768
|
-
const operator = explicitOperatorOk(principal, deps.config);
|
|
769
|
-
if (!interruptBare) {
|
|
770
|
-
try {
|
|
771
|
-
validatePendingSteer({ text, trusted: false, inputId: interruptInputId });
|
|
772
|
-
}
|
|
773
|
-
catch (e) {
|
|
774
|
-
if (e instanceof CheckpointError && e.code === "steering.invalid_content") {
|
|
775
|
-
sendError(res, 422, "steering.invalid_content", e.message);
|
|
776
|
-
return;
|
|
777
|
-
}
|
|
778
|
-
throw e;
|
|
779
|
-
}
|
|
780
|
-
}
|
|
781
|
-
const run = await runStore.getRun(taskId);
|
|
782
|
-
if (!run) {
|
|
783
|
-
sendError(res, 404, "not_found.run", runNotFoundMessage(taskId));
|
|
784
|
-
return;
|
|
785
|
-
}
|
|
786
|
-
if (!operator && !runOwnerOk(req, res, run.owner))
|
|
787
|
-
return;
|
|
788
|
-
if (!runSessionAcceptOk(req, res, run, "run.interrupt"))
|
|
744
|
+
const interruptAdmitted = (await admitRunById(entry, res, runStore, taskId));
|
|
745
|
+
if (interruptAdmitted === undefined)
|
|
789
746
|
return;
|
|
747
|
+
const run = interruptAdmitted.row;
|
|
790
748
|
const sendInterruptNotRunning = (error) => sendError(res, 409, "steering.not_running", error);
|
|
791
749
|
const sendNoLiveTurn = (status, streamJustSettled) => {
|
|
792
750
|
if (isParkedRunStatus(status)) {
|
|
793
|
-
sendError(res, 409, "interrupt.nothing_in_flight", "run is waiting on a pending decision — there is no in-flight turn to interrupt; to
|
|
751
|
+
sendError(res, 409, "interrupt.nothing_in_flight", "run is waiting on a pending decision — there is no in-flight turn to interrupt; answer that decision to let the run resume, or POST /v1/runs/:id/cancel to stop the run");
|
|
794
752
|
return;
|
|
795
753
|
}
|
|
796
754
|
if (streamJustSettled) {
|
|
@@ -814,53 +772,23 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
814
772
|
sendNoLiveTurn(run.status, false);
|
|
815
773
|
return;
|
|
816
774
|
}
|
|
817
|
-
|
|
818
|
-
let haltReceipt;
|
|
819
|
-
try {
|
|
820
|
-
haltReceipt = await liveStream.halt();
|
|
821
|
-
}
|
|
822
|
-
catch (e) {
|
|
823
|
-
if (e.code !== "steering.not_running")
|
|
824
|
-
throw e;
|
|
825
|
-
const freshRun = await runStore.getRun(taskId).catch(() => undefined);
|
|
826
|
-
sendNoLiveTurn(freshRun?.status ?? run.status, true);
|
|
827
|
-
return;
|
|
828
|
-
}
|
|
829
|
-
sendJson(res, 202, {
|
|
830
|
-
taskId,
|
|
831
|
-
status: run.status,
|
|
832
|
-
turnCut: haltReceipt.turnCut,
|
|
833
|
-
note: "halt accepted — cut + stop: turnCut reports whether THIS call cut a live turn (repeat calls answer turnCut:false once the stop is latched). A halt that CONSUMES (it cut a turn, or stopped the loop at a boundary) ends the run at that boundary as status:\"completed\" with haltedByUser:true — resume by submitting the next objective on the same session. Each real cut is marked by a task.turn_interrupted event with detail.cause:\"user_halt\". A halt racing the run's natural last moments consumes NOTHING: the run's own ending stands (completed with the answer as result, or failed when the model's own abort owns the final) and the result does NOT carry haltedByUser — the only trace of that halt is a task.halt_unconsumed engine notice.",
|
|
834
|
-
});
|
|
835
|
-
return;
|
|
836
|
-
}
|
|
837
|
-
const acceptance = await acceptLiveUserInput(deps, res, { messageId: interruptMessageId, sessionId: run.sessionId, taskId, leg: liveStream, tier: "now" });
|
|
838
|
-
if (acceptance === "refused")
|
|
839
|
-
return;
|
|
775
|
+
let haltReceipt;
|
|
840
776
|
try {
|
|
841
|
-
|
|
777
|
+
haltReceipt = await liveStream.halt();
|
|
842
778
|
}
|
|
843
779
|
catch (e) {
|
|
844
|
-
|
|
845
|
-
if (code === "steering.invalid_content") {
|
|
846
|
-
sendError(res, 422, "steering.invalid_content", e instanceof Error ? e.message : "invalid steering content");
|
|
847
|
-
return;
|
|
848
|
-
}
|
|
849
|
-
if (code === "steering.blocked_by_hook") {
|
|
850
|
-
sendError(res, 422, "steering.blocked_by_hook", e instanceof Error ? e.message : "the deployment's userPromptSubmit hook refused this input (fail-closed)");
|
|
851
|
-
return;
|
|
852
|
-
}
|
|
853
|
-
if (code === "steering.duplicate_input_id") {
|
|
854
|
-
sendSteerReplayRefusal(res, e);
|
|
855
|
-
return;
|
|
856
|
-
}
|
|
857
|
-
if (code !== "steering.not_running")
|
|
780
|
+
if (e.code !== "steering.not_running")
|
|
858
781
|
throw e;
|
|
859
782
|
const freshRun = await runStore.getRun(taskId).catch(() => undefined);
|
|
860
783
|
sendNoLiveTurn(freshRun?.status ?? run.status, true);
|
|
861
784
|
return;
|
|
862
785
|
}
|
|
863
|
-
sendJson(res, 202, {
|
|
786
|
+
sendJson(res, 202, {
|
|
787
|
+
taskId,
|
|
788
|
+
status: run.status,
|
|
789
|
+
turnCut: haltReceipt.turnCut,
|
|
790
|
+
note: "halt accepted — cut + stop: turnCut reports whether THIS call cut a live turn (repeat calls answer turnCut:false once the stop is latched). A halt that CONSUMES (it cut a turn, or stopped the loop at a boundary) ends the run at that boundary as status:\"completed\" with haltedByUser:true — resume by submitting the next objective on the same session. Each real cut is marked by a task.turn_interrupted event with detail.cause:\"user_halt\". A halt racing the run's natural last moments consumes NOTHING: the run's own ending stands (completed with the answer as result, or failed when the model's own abort owns the final) and the result does NOT carry haltedByUser — the only trace of that halt is a task.halt_unconsumed engine notice.",
|
|
791
|
+
});
|
|
864
792
|
return;
|
|
865
793
|
}
|
|
866
794
|
if (match.decl.id === "run-compact") {
|
|
@@ -872,22 +800,14 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
872
800
|
return;
|
|
873
801
|
}
|
|
874
802
|
const runStore = runs.runStore;
|
|
875
|
-
const
|
|
876
|
-
if (
|
|
877
|
-
sendPrincipalRefusal(res, req, deps.config);
|
|
803
|
+
const entry = enter(req, res, deps, match.decl.id);
|
|
804
|
+
if (entry === undefined)
|
|
878
805
|
return;
|
|
879
|
-
}
|
|
880
806
|
const taskId = match.params.taskId;
|
|
881
|
-
const
|
|
882
|
-
if (
|
|
883
|
-
sendError(res, 404, "not_found.run", RUN_NOT_FOUND_MESSAGE);
|
|
884
|
-
return;
|
|
885
|
-
}
|
|
886
|
-
const operator = explicitOperatorOk(principal, deps.config);
|
|
887
|
-
if (!operator && !runOwnerOk(req, res, run.owner))
|
|
888
|
-
return;
|
|
889
|
-
if (!runSessionAcceptOk(req, res, run, "run.compact"))
|
|
807
|
+
const compactAdmitted = (await admitRunById(entry, res, runStore, taskId));
|
|
808
|
+
if (compactAdmitted === undefined)
|
|
890
809
|
return;
|
|
810
|
+
const run = compactAdmitted.row;
|
|
891
811
|
const parsed = await readJson(req);
|
|
892
812
|
if (parsed === null || typeof parsed !== "object") {
|
|
893
813
|
sendHttpError(res, invalidJsonError("not_object"));
|
|
@@ -927,27 +847,19 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
927
847
|
return;
|
|
928
848
|
}
|
|
929
849
|
const runStore = runs.runStore;
|
|
930
|
-
const
|
|
931
|
-
if (
|
|
932
|
-
sendPrincipalRefusal(res, req, deps.config);
|
|
850
|
+
const entry = enter(req, res, deps, match.decl.id);
|
|
851
|
+
if (entry === undefined)
|
|
933
852
|
return;
|
|
934
|
-
}
|
|
935
853
|
const taskId = match.params.taskId;
|
|
936
854
|
const body = ((await readJson(req)) ?? {});
|
|
937
855
|
if (typeof body.toolCallId !== "string" || body.toolCallId.length === 0 || body.toolCallId.length > 256) {
|
|
938
856
|
sendError(res, 400, "request.body_shape", "body must be { toolCallId: string (non-empty, ≤256 chars) }");
|
|
939
857
|
return;
|
|
940
858
|
}
|
|
941
|
-
const
|
|
942
|
-
if (
|
|
943
|
-
sendError(res, 404, "not_found.run", RUN_NOT_FOUND_MESSAGE);
|
|
944
|
-
return;
|
|
945
|
-
}
|
|
946
|
-
const operator = explicitOperatorOk(principal, deps.config);
|
|
947
|
-
if (!operator && !runOwnerOk(req, res, run.owner))
|
|
948
|
-
return;
|
|
949
|
-
if (!runSessionAcceptOk(req, res, run, "run.detach"))
|
|
859
|
+
const detachAdmitted = (await admitRunById(entry, res, runStore, taskId));
|
|
860
|
+
if (detachAdmitted === undefined)
|
|
950
861
|
return;
|
|
862
|
+
const run = detachAdmitted.row;
|
|
951
863
|
const live = steerableRuns.get(taskId);
|
|
952
864
|
if (!live) {
|
|
953
865
|
sendError(res, 409, "detach.not_running", run.status === "running" ? "run is active on another replica — detach is replica-local" : `run is ${run.status} — no running tool call to detach`);
|
|
@@ -961,7 +873,7 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
961
873
|
}
|
|
962
874
|
export async function handleRunVerbs(req, res, match, ctx) {
|
|
963
875
|
const { deps } = ctx;
|
|
964
|
-
const { readJson, rateLimited, quotaExceeded, ownerQuotaDenied, leaseDenied, ownerLeaseDenied, safeDecode
|
|
876
|
+
const { readJson, rateLimited, quotaExceeded, ownerQuotaDenied, leaseDenied, ownerLeaseDenied, safeDecode } = ctx.helpers;
|
|
965
877
|
if (match.decl.id === "run-subagent-output") {
|
|
966
878
|
const outputFact = facts.subagentOutput(deps);
|
|
967
879
|
if (!outputFact.available) {
|
|
@@ -976,7 +888,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
976
888
|
sendError(res, 400, "request.path_malformed", "malformed subagent path (invalid percent-encoding)");
|
|
977
889
|
return;
|
|
978
890
|
}
|
|
979
|
-
const gated = await subagentReadGate(req, res, ctx, runId, match.
|
|
891
|
+
const gated = await subagentReadGate(req, res, ctx, runId, match.decl.id);
|
|
980
892
|
if (!gated)
|
|
981
893
|
return;
|
|
982
894
|
const { run } = gated;
|
|
@@ -1004,7 +916,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
1004
916
|
sendError(res, 400, "request.path_malformed", "malformed subagent path (invalid percent-encoding)");
|
|
1005
917
|
return;
|
|
1006
918
|
}
|
|
1007
|
-
const gatedTail = await subagentReadGate(req, res, ctx, runId, match.
|
|
919
|
+
const gatedTail = await subagentReadGate(req, res, ctx, runId, match.decl.id);
|
|
1008
920
|
if (!gatedTail)
|
|
1009
921
|
return;
|
|
1010
922
|
const { run } = gatedTail;
|
|
@@ -1072,7 +984,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
1072
984
|
sendError(res, 400, "request.path_malformed", "malformed task path (invalid percent-encoding)");
|
|
1073
985
|
return;
|
|
1074
986
|
}
|
|
1075
|
-
const gatedB = await subagentReadGate(req, res, ctx, runId, match.
|
|
987
|
+
const gatedB = await subagentReadGate(req, res, ctx, runId, match.decl.id);
|
|
1076
988
|
if (!gatedB)
|
|
1077
989
|
return;
|
|
1078
990
|
const { run } = gatedB;
|
|
@@ -1137,11 +1049,9 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
1137
1049
|
return;
|
|
1138
1050
|
}
|
|
1139
1051
|
const runStore = steerFact.runStore;
|
|
1140
|
-
const
|
|
1141
|
-
if (
|
|
1142
|
-
sendPrincipalRefusal(res, req, deps.config);
|
|
1052
|
+
const entry = enter(req, res, deps, match.decl.id);
|
|
1053
|
+
if (entry === undefined)
|
|
1143
1054
|
return;
|
|
1144
|
-
}
|
|
1145
1055
|
const runId = safeDecode(match.params.runId);
|
|
1146
1056
|
const target = safeDecode(match.params.sub);
|
|
1147
1057
|
if (runId === null || target === null) {
|
|
@@ -1164,16 +1074,10 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
1164
1074
|
sendError(res, 413, "steer.content_too_large", `content exceeds ${STEER_IN_MAX_REQUEST_CHARS} characters (got ${body.content.length}); note only the first ${STEER_IN_MAX_CHARS} are delivered anyway`);
|
|
1165
1075
|
return;
|
|
1166
1076
|
}
|
|
1167
|
-
const
|
|
1168
|
-
|
|
1169
|
-
if (!run) {
|
|
1170
|
-
sendError(res, 404, "not_found.run", RUN_NOT_FOUND_MESSAGE);
|
|
1171
|
-
return;
|
|
1172
|
-
}
|
|
1173
|
-
if (!trusted && !runOwnerOk(req, res, run.owner))
|
|
1174
|
-
return;
|
|
1175
|
-
if (!runSessionAcceptOk(req, res, run, `subagent.${verb}`))
|
|
1077
|
+
const childAdmitted = (await admitRunById(entry, res, runStore, runId));
|
|
1078
|
+
if (childAdmitted === undefined)
|
|
1176
1079
|
return;
|
|
1080
|
+
const run = childAdmitted.row;
|
|
1177
1081
|
const send409 = (errorCode, error) => sendError(res, 409, errorCode, error);
|
|
1178
1082
|
const redacted = redactSteerIn(body.content, target);
|
|
1179
1083
|
const resolution = steerFact.registry.resolve(runId, target);
|
|
@@ -1194,7 +1098,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
1194
1098
|
if (await ownerLeaseDenied(res, run.owner ?? undefined))
|
|
1195
1099
|
return;
|
|
1196
1100
|
const resumeFn = handle.resume;
|
|
1197
|
-
const marker = await
|
|
1101
|
+
const marker = await withSubject(recoveredSubject(run.owner), () => resumeFn(redacted));
|
|
1198
1102
|
sendJson(res, 200, { taskId: runId, target, status: "running", delivery: "applied", marker, note: `Message queued for delivery to ${handle.agentName ?? target}; it will continue in the background.` });
|
|
1199
1103
|
return;
|
|
1200
1104
|
}
|
|
@@ -1241,7 +1145,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
1241
1145
|
sendError(res, 501, "feature.elicitation_disabled", "inbound MCP elicitation is not enabled on this worker (MCP_ELICITATION_ENABLED)");
|
|
1242
1146
|
return;
|
|
1243
1147
|
}
|
|
1244
|
-
const principal =
|
|
1148
|
+
const principal = gatedSubject(req, deps.config);
|
|
1245
1149
|
if (deps.config.requirePrincipal && principal === undefined) {
|
|
1246
1150
|
sendPrincipalRefusal(res, req, deps.config);
|
|
1247
1151
|
return;
|
|
@@ -1260,7 +1164,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
1260
1164
|
sendError(res, 501, "feature.ask_question_disabled", "AskUserQuestion live HITL is not enabled on this worker (ASK_QUESTION_ENABLED)");
|
|
1261
1165
|
return;
|
|
1262
1166
|
}
|
|
1263
|
-
const principal =
|
|
1167
|
+
const principal = gatedSubject(req, deps.config);
|
|
1264
1168
|
if (deps.config.requirePrincipal && principal === undefined) {
|
|
1265
1169
|
sendPrincipalRefusal(res, req, deps.config);
|
|
1266
1170
|
return;
|
|
@@ -1279,7 +1183,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
1279
1183
|
sendError(res, 501, "feature.tool_approval_disabled", "live tool-approval HITL is not enabled on this worker (TOOL_APPROVAL_ENABLED)");
|
|
1280
1184
|
return;
|
|
1281
1185
|
}
|
|
1282
|
-
const principal =
|
|
1186
|
+
const principal = gatedSubject(req, deps.config);
|
|
1283
1187
|
if (deps.config.requirePrincipal && principal === undefined) {
|
|
1284
1188
|
sendPrincipalRefusal(res, req, deps.config);
|
|
1285
1189
|
return;
|
|
@@ -1308,7 +1212,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
1308
1212
|
return;
|
|
1309
1213
|
}
|
|
1310
1214
|
const askStore = streamFact.askStore;
|
|
1311
|
-
const principal =
|
|
1215
|
+
const principal = gatedSubject(req, deps.config);
|
|
1312
1216
|
if (deps.config.requirePrincipal && principal === undefined) {
|
|
1313
1217
|
sendPrincipalRefusal(res, req, deps.config);
|
|
1314
1218
|
return;
|
|
@@ -1350,9 +1254,8 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
1350
1254
|
askNotFound();
|
|
1351
1255
|
return;
|
|
1352
1256
|
}
|
|
1353
|
-
const
|
|
1354
|
-
|
|
1355
|
-
if (!ownerOk && !operatorOk) {
|
|
1257
|
+
const askAdmission = keyAdmission("ask.decide", { subject: principal, operator: explicitOperatorOk(principal === undefined ? undefined : personOf(principal), deps.config) }, ownerCellOf(row0.owner));
|
|
1258
|
+
if (askAdmission === undefined) {
|
|
1356
1259
|
askNotFound();
|
|
1357
1260
|
return;
|
|
1358
1261
|
}
|
|
@@ -1360,7 +1263,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
1360
1263
|
id: principal ?? "_",
|
|
1361
1264
|
...(body.actor ? { label: redactSecrets(body.actor.label).slice(0, ASK_ACTOR_LABEL_MAX) } : {}),
|
|
1362
1265
|
verified: principal !== undefined,
|
|
1363
|
-
via:
|
|
1266
|
+
via: askAdmission === "row" ? "owner" : "operator",
|
|
1364
1267
|
};
|
|
1365
1268
|
const decidedRowIsAuthoritative = (row) => {
|
|
1366
1269
|
if (row.state !== "DECIDED" || row.decision !== "approve" && row.decision !== "deny" || row.provisional || row.decidedAtMs === null) {
|
|
@@ -1423,7 +1326,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
1423
1326
|
}
|
|
1424
1327
|
case "PARKED":
|
|
1425
1328
|
sendError(res, 410, "gone.ask_parked", "the in-stream window closed and this ask was parked onto the durable approval gate — decide it through that gate for the session echoed here", {
|
|
1426
|
-
sessionId: row
|
|
1329
|
+
sessionId: parkSessionOf(row),
|
|
1427
1330
|
gateBoundCallId: row.gateBoundCallId,
|
|
1428
1331
|
gateBoundInputHash: row.gateBoundInputHash,
|
|
1429
1332
|
});
|
|
@@ -1576,31 +1479,43 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
1576
1479
|
return assertNever(match.decl.id);
|
|
1577
1480
|
}
|
|
1578
1481
|
export async function createDurableRun(req, res, ctx, prepared, idem) {
|
|
1482
|
+
try {
|
|
1483
|
+
const out = await createDurableRunHeld(req, res, ctx, prepared, idem);
|
|
1484
|
+
await prepared.seat.close();
|
|
1485
|
+
return out;
|
|
1486
|
+
}
|
|
1487
|
+
catch (err) {
|
|
1488
|
+
await prepared.seat.close();
|
|
1489
|
+
throw err;
|
|
1490
|
+
}
|
|
1491
|
+
}
|
|
1492
|
+
async function createDurableRunHeld(req, res, ctx, prepared, idem) {
|
|
1579
1493
|
const { deps } = ctx;
|
|
1580
1494
|
const { idemCache } = ctx.registry;
|
|
1581
1495
|
const { leaseDenied, usageWindowDenied, admitRun } = ctx.helpers;
|
|
1496
|
+
const seat = prepared.seat;
|
|
1582
1497
|
const source = ctx.req.source;
|
|
1583
1498
|
const runs = facts.durableRuns(deps);
|
|
1584
1499
|
if (!runs.available) {
|
|
1585
|
-
sendError(res, 501, "capability.run_store_required", "async runs require a durable run store (DB_BACKEND=mysql|pg|local)");
|
|
1500
|
+
await seat.deliverTerminal(() => sendError(res, 501, "capability.run_store_required", "async runs require a durable run store (DB_BACKEND=mysql|pg|local)"));
|
|
1586
1501
|
return null;
|
|
1587
1502
|
}
|
|
1588
1503
|
const runStore = runs.runStore;
|
|
1589
1504
|
const clientTaskId = clientTaskIdOf(prepared.body);
|
|
1590
1505
|
if (clientTaskId === false) {
|
|
1591
|
-
sendError(res, 400, "request.id_invalid", "body.taskId must be a uuidv7 string (caller-minted idempotency key)");
|
|
1506
|
+
await seat.deliverTerminal(() => sendError(res, 400, "request.id_invalid", "body.taskId must be a uuidv7 string (caller-minted idempotency key)"));
|
|
1592
1507
|
return null;
|
|
1593
1508
|
}
|
|
1594
|
-
const submitter =
|
|
1595
|
-
const caller = {
|
|
1509
|
+
const submitter = gatedSubject(req, deps.config);
|
|
1510
|
+
const caller = { subject: submitter, idem, ...(clientTaskId !== undefined ? { clientTaskId } : {}) };
|
|
1596
1511
|
if (clientTaskId) {
|
|
1597
1512
|
const existing = await runStore.getRun(clientTaskId);
|
|
1598
1513
|
if (existing)
|
|
1599
1514
|
return await replayOfExistingRun(existing, caller, "durable", deps, runStore);
|
|
1600
1515
|
}
|
|
1601
|
-
if ((await leaseDenied(req, res)) || (await usageWindowDenied(req, res)))
|
|
1516
|
+
if ((await leaseDenied(req, res, seat)) || (await usageWindowDenied(req, res, seat)))
|
|
1602
1517
|
return null;
|
|
1603
|
-
const runSlot = admitRun(req, res);
|
|
1518
|
+
const runSlot = await admitRun(req, res, seat);
|
|
1604
1519
|
if (runSlot === undefined)
|
|
1605
1520
|
return null;
|
|
1606
1521
|
return await idemCache.run(idem !== undefined ? inflightKeyOf(idem, "durable", clientTaskId) : undefined, async () => {
|
|
@@ -1611,10 +1526,13 @@ export async function createDurableRun(req, res, ctx, prepared, idem) {
|
|
|
1611
1526
|
fleetScope: submitter ?? "default",
|
|
1612
1527
|
elicitOwner: submitter ?? null,
|
|
1613
1528
|
source,
|
|
1614
|
-
identity: runIdentityOf(req, deps.config, prepared.auth?.
|
|
1529
|
+
identity: runIdentityOf(req, deps.config, prepared.auth?.subject ?? null),
|
|
1615
1530
|
runSlot,
|
|
1531
|
+
face: SUBMISSION_CLAIM_FACE,
|
|
1616
1532
|
});
|
|
1617
|
-
|
|
1533
|
+
const receipt = out.existing ? await replayOfExistingRun(out.existing, caller, "durable", deps, runStore) : out;
|
|
1534
|
+
await prepared.seat.close();
|
|
1535
|
+
return receipt;
|
|
1618
1536
|
}).finally(() => runSlot.release());
|
|
1619
1537
|
}
|
|
1620
1538
|
function clientTaskIdOf(body) {
|