@sema-agent/server 7.146.0 → 7.148.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 +1423 -24
- package/README.md +21 -8
- package/README.zh-CN.md +15 -9
- package/USAGE.md +537 -216
- package/deploy/facts/lanes.json +7 -0
- package/deploy/sema-up/README.md +18 -7
- package/deploy/sema-up/chart/templates/NOTES.txt +1 -1
- package/deploy/sema-up/chart/templates/_helpers.tpl +42 -4
- package/deploy/sema-up/chart/templates/server-v4pro.yaml +5 -4
- package/deploy/sema-up/chart/templates/server.yaml +5 -4
- package/deploy/sema-up/chart/values.yaml +4 -3
- package/deploy/sema-up/cluster-up.sh +75 -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/flagshape.sh +4 -0
- 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/lanes.json +2 -5
- 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 +26 -48
- 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 +18 -5
- package/deploy/sema-up/stack/sema-stack-cluster.yaml +25 -3
- 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/adoption/wire.d.ts +3 -3
- package/dist/approval-card.d.ts +32 -34
- package/dist/approval-gate-currency.js +3 -2
- package/dist/approval-reconciler.d.ts +4 -13
- package/dist/approval-reconciler.js +2 -2
- package/dist/approval.d.ts +16 -14
- package/dist/approval.js +3 -3
- package/dist/audit.d.ts +10 -3
- package/dist/audit.js +17 -9
- package/dist/auth-bridge.d.ts +0 -14
- package/dist/auth-bridge.js +0 -7
- 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 +8 -3
- 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/crash-last.js +2 -1
- package/dist/boot/deployment-mods.d.ts +1 -1
- package/dist/boot/device-lane.js +5 -5
- package/dist/boot/engine-lease.d.ts +12 -11
- package/dist/boot/execution-env.d.ts +19 -8
- package/dist/boot/execution-env.js +80 -62
- package/dist/boot/execution-lane.d.ts +37 -9
- package/dist/boot/execution-lane.js +74 -20
- package/dist/boot/exit-boundary.d.ts +3 -3
- package/dist/boot/exit-boundary.js +6 -5
- package/dist/boot/exit-last.js +2 -1
- package/dist/boot/fatal-exit.d.ts +3 -5
- package/dist/boot/fatal-exit.js +2 -2
- package/dist/boot/governance-seams.d.ts +2 -2
- package/dist/boot/leader.d.ts +15 -0
- package/dist/boot/leader.js +18 -16
- package/dist/boot/memory-boundary.d.ts +11 -11
- package/dist/boot/memory-boundary.js +3 -3
- package/dist/boot/memory-consolidation.d.ts +50 -53
- package/dist/boot/memory-consolidation.js +11 -18
- package/dist/boot/org-memory.js +4 -3
- package/dist/boot/parked-revive-gate.d.ts +1 -1
- package/dist/boot/parked-revive-gate.js +3 -3
- package/dist/boot/reapers.d.ts +4 -3
- package/dist/boot/reapers.js +20 -17
- package/dist/boot/resolve-spec.d.ts +5 -3
- package/dist/boot/resolve-spec.js +133 -165
- package/dist/boot/retention-lane.d.ts +7 -45
- package/dist/boot/retention-lane.js +2 -2
- package/dist/boot/runner-deps.d.ts +28 -7
- package/dist/boot/runner-deps.js +11 -4
- package/dist/boot/runtime-caps.d.ts +2 -2
- package/dist/boot/runtime-caps.js +16 -2
- package/dist/boot/session-faces.d.ts +17 -7
- package/dist/boot/session-faces.js +122 -96
- package/dist/boot/shutdown.d.ts +5 -4
- package/dist/boot/shutdown.js +6 -4
- package/dist/boot/stage-01-config.d.ts +1 -1
- package/dist/boot/stage-01-config.js +14 -2
- package/dist/boot/stage-02-web-admin-pull.d.ts +2 -1
- package/dist/boot/stage-02-web-admin-pull.js +15 -8
- package/dist/boot/stage-03-store-backend.d.ts +4 -1
- package/dist/boot/stage-03-store-backend.js +4 -3
- package/dist/boot/stage-04-stores.d.ts +3 -1
- package/dist/boot/stage-04-stores.js +2 -2
- package/dist/boot/stage-05-execution-env.d.ts +9 -5
- package/dist/boot/stage-05-execution-env.js +5 -5
- package/dist/boot/stage-06-runners.d.ts +13 -15
- package/dist/boot/stage-06-runners.js +24 -18
- package/dist/boot/stage-07-capability-layer.d.ts +14 -11
- package/dist/boot/stage-07-capability-layer.js +9 -12
- package/dist/boot/stage-08-reapers.d.ts +14 -11
- package/dist/boot/stage-08-reapers.js +3 -3
- package/dist/boot/stage-09-leader.d.ts +16 -18
- package/dist/boot/stage-09-leader.js +12 -4
- package/dist/boot/stage-10-http-server.d.ts +16 -18
- package/dist/boot/stage-10-http-server.js +9 -5
- package/dist/boot/store-evidence.d.ts +20 -0
- package/dist/boot/store-evidence.js +13 -0
- package/dist/boot/stores.d.ts +12 -0
- package/dist/boot/stores.js +39 -17
- 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 +58 -38
- 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 +9 -1
- package/dist/capabilities/center-plugins.js +37 -11
- package/dist/capabilities/center-wiring.js +1 -1
- package/dist/capabilities/composite-members.d.ts +3 -2
- package/dist/capabilities/composite-members.js +3 -2
- package/dist/capabilities/execution-lane.d.ts +7 -7
- package/dist/capabilities/execution-lane.js +2 -2
- package/dist/capabilities/hands-lane.d.ts +1 -1
- package/dist/capabilities/repo-tools.d.ts +2 -0
- package/dist/capabilities/repo-tools.js +14 -12
- package/dist/capabilities/scenarios.d.ts +38 -33
- package/dist/capabilities/scenarios.js +24 -25
- package/dist/capabilities/settings-contract.d.ts +29 -0
- package/dist/capabilities/settings-contract.js +14 -0
- package/dist/capabilities/skills.d.ts +6 -6
- package/dist/capabilities/tool-defer.d.ts +1 -1
- package/dist/capability-facts.d.ts +69 -4
- package/dist/capability-facts.js +77 -5
- package/dist/card-void.d.ts +4 -4
- package/dist/card-void.js +1 -1
- package/dist/center-credential-renewer.d.ts +6 -2
- package/dist/center-credential-renewer.js +10 -5
- package/dist/config-catalog.d.ts +16 -1
- package/dist/config-catalog.js +68 -61
- package/dist/config-dir-trust.d.ts +37 -4
- package/dist/config-dir-trust.js +88 -44
- package/dist/config-invariants.d.ts +58 -4
- package/dist/config-invariants.js +104 -23
- package/dist/config-lkg.d.ts +24 -2
- package/dist/config-lkg.js +22 -9
- package/dist/config-provider.d.ts +9 -9
- package/dist/config-provider.js +25 -108
- package/dist/config-pull-failure.d.ts +50 -0
- package/dist/config-pull-failure.js +48 -0
- package/dist/config-types.d.ts +215 -202
- package/dist/config.d.ts +69 -14
- package/dist/config.js +188 -96
- package/dist/degenerate-instrument.js +1 -1
- package/dist/delegated-session-owner.d.ts +1 -1
- package/dist/deleted-session-ids.d.ts +3 -2
- package/dist/deploy-facts.js +3 -2
- package/dist/deployment-governance.d.ts +3 -3
- package/dist/deployment-shape.d.ts +51 -16
- package/dist/deployment-shape.js +31 -6
- 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.d.ts +7 -5
- package/dist/env-facts.js +12 -7
- package/dist/env-witness.d.ts +7 -0
- package/dist/env-witness.js +16 -0
- package/dist/execution-config-root.d.ts +5 -5
- package/dist/execution-config-root.js +5 -5
- package/dist/execution-env-purpose.d.ts +14 -0
- package/dist/execution-env-purpose.js +29 -0
- package/dist/execution-lane-caps.d.ts +53 -103
- package/dist/execution-lane-caps.js +51 -83
- package/dist/execution-placement.d.ts +65 -9
- package/dist/execution-placement.js +58 -0
- 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.d.ts +2 -2
- package/dist/file-history-disclosure.js +1 -0
- package/dist/fleet/drain-entry.d.ts +17 -10
- package/dist/fleet/drain-entry.js +1 -1
- 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 +6 -7
- 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 +42 -0
- package/dist/history-anchor.js +34 -0
- 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 +1 -4
- package/dist/hooks/command-spawn.js +0 -11
- package/dist/hooks/hook-llm.d.ts +5 -1
- package/dist/hooks/hook-llm.js +24 -15
- package/dist/hooks/hook-runner.d.ts +119 -65
- package/dist/hooks/hook-runner.js +415 -217
- 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 +75 -78
- package/dist/http/approval-sweeps.d.ts +5 -8
- package/dist/http/approval-sweeps.js +55 -30
- package/dist/http/caller-trust.d.ts +8 -10
- package/dist/http/caller-trust.js +1 -2
- package/dist/http/checkpoint-ctx.d.ts +17 -0
- package/dist/http/checkpoint-ctx.js +6 -0
- package/dist/http/claim-heartbeat.d.ts +49 -0
- package/dist/http/claim-heartbeat.js +46 -0
- package/dist/http/claim-latency.d.ts +10 -0
- package/dist/http/claim-latency.js +12 -0
- package/dist/http/claimed-run.d.ts +4 -3
- package/dist/http/dispatch.d.ts +8 -1
- package/dist/http/dispatch.js +77 -31
- package/dist/http/durable-run-leg.d.ts +3 -3
- package/dist/http/durable-run-leg.js +18 -12
- package/dist/http/execution-context.d.ts +18 -42
- package/dist/http/execution-context.js +11 -5
- 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 +7 -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 +3 -3
- package/dist/http/memory-store-refusal-reply.js +6 -0
- package/dist/http/owner-access.d.ts +391 -56
- package/dist/http/owner-access.js +372 -33
- package/dist/http/principal-gate.d.ts +26 -94
- package/dist/http/principal-gate.js +24 -81
- package/dist/http/refusal-body.d.ts +35 -2
- package/dist/http/refusal-body.js +34 -0
- package/dist/http/request-guards.d.ts +10 -14
- 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 +35 -12
- package/dist/http/resume-ctx-read.js +25 -6
- package/dist/http/resume-legs.d.ts +24 -24
- package/dist/http/resume-legs.js +260 -171
- package/dist/http/retired-skill-manifest.d.ts +1 -1
- package/dist/http/rewind-files-reply.d.ts +34 -0
- package/dist/http/rewind-files-reply.js +36 -0
- package/dist/http/route-ctx.d.ts +56 -47
- package/dist/http/route-table.js +2 -0
- package/dist/http/routes/a2a-serve.d.ts +43 -5
- package/dist/http/routes/a2a-serve.js +58 -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 -88
- 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 +23 -20
- package/dist/http/routes/config-catalog.js +2 -2
- package/dist/http/routes/devices.d.ts +3 -3
- package/dist/http/routes/devices.js +5 -5
- package/dist/http/routes/diagnostics.d.ts +27 -3
- package/dist/http/routes/diagnostics.js +27 -21
- 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 +3 -1
- 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 +12 -20
- package/dist/http/routes/observability.js +3 -3
- package/dist/http/routes/principal-inbox.d.ts +1 -1
- package/dist/http/routes/principal-inbox.js +2 -2
- package/dist/http/routes/projects.d.ts +70 -0
- package/dist/http/routes/projects.js +87 -0
- package/dist/http/routes/retention-ops.js +6 -9
- package/dist/http/routes/rules.js +50 -7
- 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 +148 -233
- 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 +4 -2
- package/dist/http/routes/session-sync.js +48 -30
- package/dist/http/routes/sessions-list.d.ts +3 -3
- package/dist/http/routes/sessions-list.js +9 -9
- package/dist/http/routes/sessions.d.ts +7 -1
- package/dist/http/routes/sessions.js +177 -112
- package/dist/http/routes/shared-memory.js +6 -6
- package/dist/http/routes/side-query.js +2 -2
- package/dist/http/routes/tasks.js +144 -122
- 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 +63 -50
- package/dist/http/server.js +52 -16
- 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 +17 -3
- package/dist/http/stored-body-replay.js +11 -2
- package/dist/http/submit-ctx.d.ts +16 -8
- package/dist/http/submit-ctx.js +6 -2
- 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 +23 -13
- package/dist/identity-source.d.ts +36 -5
- package/dist/identity-source.js +27 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.js +2 -1
- package/dist/instruction-source-notice.d.ts +1 -1
- 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/lsp-evict.d.ts +6 -4
- package/dist/lsp-evict.js +2 -3
- package/dist/memory-embedder-reembed.d.ts +38 -0
- package/dist/memory-embedder-reembed.js +20 -0
- package/dist/memory-incident-sink.d.ts +0 -28
- package/dist/memory-incident-sink.js +5 -0
- package/dist/memory-operator-faces.d.ts +5 -4
- package/dist/memory-operator-faces.js +1 -1
- package/dist/memory-scope.d.ts +31 -4
- package/dist/memory-scope.js +65 -16
- package/dist/memory-store-refusal.d.ts +20 -4
- package/dist/memory-store-refusal.js +1 -1
- package/dist/memory-sync-client.d.ts +5 -2
- package/dist/memory-sync-client.js +19 -14
- package/dist/memory-sync.js +1 -1
- package/dist/model-compat.d.ts +51 -28
- package/dist/model-compat.js +55 -23
- package/dist/model-context-window.d.ts +18 -0
- package/dist/model-context-window.js +2 -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 +46 -17
- package/dist/model-entry-refusal.js +47 -27
- 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-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 +28 -2
- package/dist/namespaced-rule-name.js +10 -1
- 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 +75 -47
- package/dist/observability/fail-open.js +77 -47
- package/dist/observability/logger.d.ts +22 -1
- package/dist/observability/logger.js +89 -12
- package/dist/observability/metrics.d.ts +2 -0
- package/dist/observability/metrics.js +5 -4
- 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 +5 -2
- package/dist/observability/secret-env-scrub.d.ts +30 -4
- package/dist/observability/secret-env-scrub.js +15 -3
- 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-agent-session-index.d.ts +7 -12
- package/dist/orchestration/workflow-agent-session-index.js +1 -6
- package/dist/orchestration/workflow-completion-inbox.d.ts +29 -9
- package/dist/orchestration/workflow-completion-inbox.js +65 -46
- package/dist/org-delivery-gate.d.ts +5 -4
- package/dist/org-delivery-gate.js +7 -6
- package/dist/org-memory-admission.d.ts +5 -2
- package/dist/org-memory-admission.js +25 -10
- 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 +531 -0
- package/dist/owner-faces.js +126 -0
- package/dist/parked-decide.d.ts +100 -31
- package/dist/parked-decide.js +162 -48
- package/dist/parked-revive-surface.d.ts +14 -4
- package/dist/parked-revive-surface.js +5 -4
- package/dist/peer-directory.d.ts +6 -8
- 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 +0 -22
- package/dist/plugins/adoption-log-sql.js +5 -3
- 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 +28 -9
- package/dist/plugins/approval-ask-store-file.js +74 -18
- package/dist/plugins/approval-ask-store-memory.d.ts +17 -7
- package/dist/plugins/approval-ask-store-memory.js +35 -12
- package/dist/plugins/approval-ask-store-sql.d.ts +42 -20
- package/dist/plugins/approval-ask-store-sql.js +44 -11
- package/dist/plugins/approval-exemption-skill-m46.d.ts +20 -0
- package/dist/plugins/approval-exemption-skill-m46.js +25 -0
- package/dist/plugins/approval-exemption-store.d.ts +6 -1
- package/dist/plugins/approval-exemption-store.js +14 -0
- 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 +40 -195
- package/dist/plugins/blob-backend.js +41 -234
- package/dist/plugins/caching-session-store.d.ts +22 -5
- package/dist/plugins/caching-session-store.js +43 -4
- package/dist/plugins/checkpoint-index-columns.d.ts +33 -6
- package/dist/plugins/checkpoint-index-columns.js +39 -3
- package/dist/plugins/checkpoint-store-face.d.ts +84 -11
- package/dist/plugins/checkpoint-store-face.js +18 -1
- package/dist/plugins/device-store-sql.d.ts +2 -2
- package/dist/plugins/device-store-sql.js +6 -10
- 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 +0 -15
- package/dist/plugins/ensure-schema-lock-policy.js +3 -2
- package/dist/plugins/execution-lane-rename-m40.d.ts +20 -0
- package/dist/plugins/execution-lane-rename-m40.js +10 -0
- package/dist/plugins/execution-placement-sql.d.ts +63 -88
- package/dist/plugins/execution-placement-sql.js +94 -54
- package/dist/plugins/file-run-store.d.ts +89 -35
- package/dist/plugins/file-run-store.js +197 -142
- 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 +19 -10
- package/dist/plugins/imported-layer-root-retirement.js +4 -8
- package/dist/plugins/inbox-payload-column.d.ts +14 -0
- package/dist/plugins/inbox-payload-column.js +13 -0
- 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 +63 -23
- package/dist/plugins/local-checkpoint-store.js +204 -81
- package/dist/plugins/local-data-dir-modes-m39.d.ts +48 -0
- package/dist/plugins/local-data-dir-modes-m39.js +183 -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 +13 -0
- package/dist/plugins/local-engine-high-water.js +62 -0
- package/dist/plugins/local-session-store.d.ts +442 -143
- package/dist/plugins/local-session-store.js +941 -289
- 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 +20 -1
- package/dist/plugins/local-task-attachment-store.js +32 -12
- package/dist/plugins/memory-embedder-fingerprint.d.ts +33 -10
- package/dist/plugins/memory-embedder-fingerprint.js +52 -12
- package/dist/plugins/memory-embedder.d.ts +1 -1
- package/dist/plugins/memory-embedder.js +11 -9
- package/dist/plugins/memory-engine-pg.d.ts +7 -5
- package/dist/plugins/memory-engine-pg.js +18 -9
- package/dist/plugins/memory-engine-sql-apply.d.ts +21 -8
- package/dist/plugins/memory-engine-sql-apply.js +7 -9
- package/dist/plugins/memory-engine-tidb.d.ts +12 -7
- package/dist/plugins/memory-engine-tidb.js +18 -10
- 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 +39 -27
- package/dist/plugins/memory-run-store.js +72 -70
- package/dist/plugins/one-time-migration-marker.d.ts +10 -0
- package/dist/plugins/one-time-migration-marker.js +7 -0
- package/dist/plugins/one-time-migrations.d.ts +325 -74
- package/dist/plugins/one-time-migrations.js +705 -230
- package/dist/plugins/org-delivery-quota-store.js +2 -1
- package/dist/plugins/owner-only-file-mode.d.ts +29 -0
- package/dist/plugins/owner-only-file-mode.js +141 -0
- package/dist/plugins/permission-rule-store-file.d.ts +11 -11
- package/dist/plugins/permission-rule-store-file.js +14 -2
- package/dist/plugins/permission-rule-store-sql.d.ts +4 -63
- package/dist/plugins/permission-rule-store-sql.js +6 -86
- package/dist/plugins/pg-pool.d.ts +3 -32
- package/dist/plugins/pg-pool.js +27 -11
- package/dist/plugins/release-version.d.ts +20 -0
- package/dist/plugins/release-version.js +28 -0
- package/dist/plugins/remote-env-adb.d.ts +20 -4
- package/dist/plugins/remote-env-adb.js +39 -11
- package/dist/plugins/remote-env-e2b.d.ts +19 -28
- package/dist/plugins/remote-env-e2b.js +40 -29
- package/dist/plugins/remote-env-host.d.ts +11 -10
- package/dist/plugins/remote-env-host.js +40 -27
- package/dist/plugins/remote-env-k8s.d.ts +45 -47
- package/dist/plugins/remote-env-k8s.js +122 -62
- package/dist/plugins/remote-env-local-docker.d.ts +152 -15
- package/dist/plugins/remote-env-local-docker.js +370 -75
- package/dist/plugins/remote-env-ssh.d.ts +8 -2
- package/dist/plugins/remote-env-ssh.js +26 -24
- package/dist/plugins/remote-scratchpad.js +4 -0
- package/dist/plugins/remote-shell.d.ts +59 -30
- package/dist/plugins/remote-shell.js +175 -62
- package/dist/plugins/retention-declaration.d.ts +37 -0
- package/dist/plugins/retention-declaration.js +9 -0
- package/dist/plugins/retention-deployment.d.ts +158 -0
- package/dist/plugins/retention-deployment.js +119 -0
- package/dist/plugins/retention-lane-store-sql.d.ts +74 -4
- package/dist/plugins/retention-lane-store-sql.js +103 -1
- package/dist/plugins/retention-sql.d.ts +29 -0
- package/dist/plugins/retention-sql.js +8 -0
- 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 +56 -68
- package/dist/plugins/run-store-sql.js +127 -116
- 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 +54 -0
- package/dist/plugins/scenario-prefix-switch-m42.js +55 -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 +42 -15
- package/dist/plugins/schema-consistency.js +213 -13
- package/dist/plugins/schema-drift-sentence.d.ts +4 -1
- package/dist/plugins/schema-drift-sentence.js +4 -4
- package/dist/plugins/schema-ensure-legs.d.ts +10 -1
- package/dist/plugins/schema-ensure-legs.js +12 -2
- 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 +98 -0
- package/dist/plugins/session-ext-table.js +134 -0
- package/dist/plugins/session-fork.d.ts +16 -2
- package/dist/plugins/session-fork.js +3 -0
- package/dist/plugins/session-ownership.d.ts +1 -1
- package/dist/plugins/session-placement.d.ts +22 -16
- package/dist/plugins/session-placement.js +15 -12
- package/dist/plugins/session-row-sql.d.ts +20 -7
- package/dist/plugins/session-row-sql.js +16 -8
- 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 +157 -0
- package/dist/plugins/session-store-sql.js +398 -0
- package/dist/plugins/session-withdraw-sql.d.ts +36 -0
- package/dist/plugins/session-withdraw-sql.js +42 -0
- package/dist/plugins/session-workspace-cell.d.ts +2 -2
- package/dist/plugins/session-workspace-cell.js +2 -2
- package/dist/plugins/shared-memory-store-sql.d.ts +10 -69
- package/dist/plugins/shared-memory-store-sql.js +15 -14
- package/dist/plugins/shell-sentinel-owner-m48.d.ts +20 -0
- package/dist/plugins/shell-sentinel-owner-m48.js +3 -0
- package/dist/plugins/snapshot-bucket-presence.d.ts +2 -1
- package/dist/plugins/snapshot-bucket-presence.js +1 -1
- package/dist/plugins/sql-driver.d.ts +24 -8
- package/dist/plugins/sql-driver.js +43 -9
- package/dist/plugins/sql-errors.d.ts +35 -5
- package/dist/plugins/sql-errors.js +55 -3
- package/dist/plugins/sql-json-column.d.ts +8 -7
- package/dist/plugins/sql-json-column.js +10 -6
- package/dist/plugins/store-backend.d.ts +114 -18
- package/dist/plugins/store-backend.js +340 -87
- package/dist/plugins/store-contracts.d.ts +97 -30
- package/dist/plugins/store-contracts.js +23 -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 +21 -11
- package/dist/plugins/task-attachment-store.js +37 -19
- package/dist/plugins/task-list-store-sql.d.ts +1 -1
- package/dist/plugins/text-column-capacity.d.ts +21 -0
- package/dist/plugins/text-column-capacity.js +5 -0
- package/dist/plugins/tidb-pool.d.ts +3 -2
- package/dist/plugins/tidb-pool.js +42 -39
- package/dist/plugins/user-input-ledger-sql.d.ts +1 -1
- 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/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/question.d.ts +13 -23
- package/dist/question.js +21 -39
- package/dist/read-face-posture.d.ts +6 -6
- package/dist/read-face-posture.js +2 -2
- 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/request-value-closure.d.ts +5 -5
- package/dist/request-value-closure.js +1 -1
- 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 +46 -16
- package/dist/rules-consent.js +102 -53
- package/dist/run-acceptance.d.ts +3 -1
- package/dist/run-acceptance.js +3 -0
- package/dist/run-local.d.ts +14 -6
- package/dist/run-local.js +109 -93
- package/dist/run-stale-default.d.ts +7 -0
- package/dist/run-stale-default.js +2 -0
- package/dist/runs.d.ts +73 -44
- package/dist/runs.js +65 -43
- package/dist/runtime-caps-resolver.d.ts +36 -14
- package/dist/runtime-caps-resolver.js +31 -14
- package/dist/runtime-governance.d.ts +2 -2
- package/dist/runtime-governance.js +5 -3
- package/dist/sealed-key-layout.d.ts +12 -6
- package/dist/sealed-key-layout.js +5 -1
- package/dist/sealed-key.d.ts +12 -2
- package/dist/sealed-key.js +116 -26
- package/dist/security.d.ts +133 -161
- package/dist/security.js +163 -59
- package/dist/sema-config-dir.d.ts +20 -0
- package/dist/sema-config-dir.js +27 -2
- package/dist/server-secret-env.d.ts +23 -5
- package/dist/server-secret-env.js +14 -4
- package/dist/service-version.d.ts +2 -1
- package/dist/service-version.js +2 -2
- package/dist/session-children-retire.d.ts +7 -5
- package/dist/session-children-retire.js +7 -2
- 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 +6 -6
- package/dist/session-error-wire.js +1 -1
- package/dist/session-incarnation.d.ts +60 -10
- 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 +29 -47
- package/dist/session-resident-background.js +77 -8
- package/dist/session-row.d.ts +3 -2
- package/dist/session-rules-seat.d.ts +12 -0
- package/dist/session-rules-seat.js +19 -0
- package/dist/session-sync-kernel.d.ts +1 -1
- package/dist/session-titler.d.ts +7 -15
- package/dist/session-titler.js +1 -1
- package/dist/session-workspace.d.ts +11 -2
- package/dist/session-workspace.js +5 -0
- package/dist/sighup-idle.d.ts +1 -1
- package/dist/spec-fields.d.ts +57 -3
- package/dist/spec-fields.js +72 -51
- package/dist/store-posture.d.ts +138 -21
- package/dist/store-posture.js +188 -3
- package/dist/stored-request-hooks-m20.d.ts +3 -2
- package/dist/stored-request-hooks-m20.js +21 -16
- 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/blob-index-sql.d.ts +148 -0
- package/dist/stores-sql/blob-index-sql.js +154 -0
- package/dist/stores-sql/checkpoint-store-sql.d.ts +34 -29
- package/dist/stores-sql/checkpoint-store-sql.js +86 -71
- package/dist/{plugins → stores-sql}/file-history-store-sql.d.ts +23 -11
- package/dist/{plugins → stores-sql}/file-history-store-sql.js +23 -18
- package/dist/stores-sql/mailbox-store-sql.d.ts +7 -4
- package/dist/stores-sql/mailbox-store-sql.js +31 -32
- package/dist/{plugins → stores-sql}/pg-session-storage.d.ts +30 -81
- package/dist/{plugins → stores-sql}/pg-session-storage.js +123 -244
- package/dist/{plugins → stores-sql}/retention-store-sql.d.ts +197 -223
- package/dist/{plugins → stores-sql}/retention-store-sql.js +148 -207
- package/dist/{plugins → stores-sql}/session-event-payload.d.ts +1 -1
- package/dist/{plugins → stores-sql}/session-event-payload.js +1 -1
- package/dist/stores-sql/session-policy-store-sql.d.ts +33 -11
- package/dist/stores-sql/session-policy-store-sql.js +44 -36
- package/dist/stores-sql/session-write-hooks.d.ts +65 -0
- package/dist/stores-sql/session-write-hooks.js +2 -0
- package/dist/{plugins → stores-sql}/tidb-session-storage.d.ts +14 -15
- package/dist/{plugins → stores-sql}/tidb-session-storage.js +22 -28
- package/dist/{plugins → stores-sql}/tidb-session-store.d.ts +67 -138
- package/dist/{plugins → stores-sql}/tidb-session-store.js +130 -200
- package/dist/stores-sql/tool-result-store-sql.d.ts +1 -1
- package/dist/stores-sql/tool-result-store-sql.js +1 -1
- package/dist/stores-sql/windowed-session-storage.d.ts +61 -0
- package/dist/stores-sql/windowed-session-storage.js +70 -0
- package/dist/submission-exit.d.ts +50 -0
- package/dist/submission-exit.js +108 -0
- package/dist/task-a2a.d.ts +7 -1
- package/dist/task-a2a.js +18 -17
- package/dist/task-cwd.d.ts +31 -3
- package/dist/task-cwd.js +25 -1
- package/dist/task-mcp.d.ts +11 -3
- package/dist/task-mcp.js +16 -19
- package/dist/task-settings.d.ts +23 -14
- package/dist/task-settings.js +35 -13
- package/dist/terminal.d.ts +25 -43
- package/dist/terminal.js +31 -11
- package/dist/tool-approval.d.ts +152 -137
- package/dist/tool-approval.js +199 -199
- package/dist/trace/core-keyset-guard.d.ts +22 -9
- 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 +1 -1
- package/dist/trace/engine-notice-wire.js +2 -0
- package/dist/trace/exit-seat.d.ts +52 -4
- package/dist/trace/exit-seat.js +43 -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 +1 -30
- 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 +88 -58
- package/dist/trace/project.js +64 -28
- package/dist/trace/redact.d.ts +124 -28
- package/dist/trace/redact.js +936 -328
- package/dist/trace/self-minted-wire.d.ts +750 -29
- package/dist/trace/self-minted-wire.js +262 -25
- package/dist/trace/sema-provenance.d.ts +45 -41
- package/dist/trace/sema-provenance.js +81 -10
- package/dist/trace/task-notification-facets.d.ts +70 -2
- package/dist/trace/task-notification-facets.js +71 -1
- package/dist/trace/wire-projection-faces.d.ts +43 -8
- package/dist/trace/wire-projection-faces.js +28 -3
- package/dist/unread-request-members.d.ts +66 -0
- package/dist/unread-request-members.js +41 -0
- 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 -40
- 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/candidate-gate.d.ts +35 -3
- package/dist/web-admin-client/candidate-gate.js +53 -5
- package/dist/web-admin-client/center-request.d.ts +6 -3
- package/dist/web-admin-client/center-request.js +17 -16
- package/dist/web-admin-client/effective-keys.d.ts +1 -1
- package/dist/web-admin-client/effective-keys.js +1 -2
- 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/facade.d.ts +1 -1
- package/dist/web-admin-client/http-client.d.ts +2 -1
- package/dist/web-admin-client/http-client.js +40 -13
- 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 +13 -6
- package/dist/web-admin-client/skills-mcp.d.ts +22 -8
- package/dist/web-admin-client/skills-mcp.js +26 -21
- package/dist/web-admin-client/types.d.ts +35 -51
- package/dist/workspace-space.d.ts +3 -2
- package/docs/DEVICE-EXECUTOR-PROTOCOL.md +4 -4
- package/package.json +16 -12
- package/scripts/drain-check-local.mjs +118 -173
- package/scripts/drain-check.mysql.sql +20 -16
- package/scripts/drain-check.pg.sql +20 -16
- package/wire-changes/server@7.147.0.json +813 -0
- package/wire-changes/server@7.148.0.json +1517 -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/http/routes/runs.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
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";
|
|
8
9
|
import { redactSecrets } from "../../trace/redact.js";
|
|
9
10
|
import { isUuidV7, encodeCheckpointScope } from "../../security.js";
|
|
@@ -14,7 +15,7 @@ import { streamSseLog } from "../sse-log.js";
|
|
|
14
15
|
import { bindSseLifecycle } from "../sse-lifecycle.js";
|
|
15
16
|
import { buildApprovalPreamble, buildApprovalPreambleSseFrames, readClosedWordSeat, storedCardDemandsAPerson } from "../../approval-card.js";
|
|
16
17
|
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";
|
|
18
|
+
import { ASK_DECISION_CONSUMER_ABSENT, approvalPreambleReplays, outcomeOfDecidedRow, parkSessionOf, presentedApprovalFrameFamily, resolveStreamApprovalGate } from "../../tool-approval.js";
|
|
18
19
|
import { MAX_DECISION_NOTE_CHARS, noteLandedOnRow, noteRecordedReceipt } from "../../approval-ask-machine.js";
|
|
19
20
|
import { askRowEndingCause } from "../../approval-deny-reasons.js";
|
|
20
21
|
import { normalizeRunEventType, screenedStoredEventData } from "../../trace/project.js";
|
|
@@ -22,21 +23,23 @@ import { invalidJsonError, sendJson, sendError, sendHttpError, sseHeaders } from
|
|
|
22
23
|
import { mintCancelledResult } from "../../run-cancel-context.js";
|
|
23
24
|
import { acceptedInputKindOf } from "../../user-input-ledger.js";
|
|
24
25
|
import { INJECTION_TIERS } from "../../trace/injection-tier.js";
|
|
25
|
-
import { headerStr,
|
|
26
|
+
import { headerStr, gatedSubject, explicitOperatorOk, sendPrincipalRefusal, runIdentityOf } from "../principal-gate.js";
|
|
26
27
|
import { ActorAssertionWire } from "@sema-agent/settings-schema";
|
|
27
28
|
import * as facts from "../../capability-facts.js";
|
|
28
29
|
import { assertNever } from "../route-ctx.js";
|
|
29
30
|
import { readRunFace } from "../run-read-face.js";
|
|
30
31
|
import { replayOfExistingRun } from "../submit-replay.js";
|
|
31
32
|
import { mintAndDriveDurableRun } from "../durable-run-leg.js";
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
34
|
-
import {
|
|
33
|
+
import { admitRunById, admitRunRow, enter, runRowAt } from "../owner-access.js";
|
|
34
|
+
import { keyAdmission, ownerCellOf, recoveredSubject } from "../../owner-faces.js";
|
|
35
|
+
import { personOf } from "../../owner-brands.js";
|
|
36
|
+
import { withSubject } from "../../observability/principal-context.js";
|
|
37
|
+
import { readResumeCtx, resumeCtxUnreadableAnswer } from "../resume-ctx-read.js";
|
|
35
38
|
import { storedBodyReplayAnswer, storedBodyReplayLogFields } from "../checkpoint-ctx.js";
|
|
36
39
|
import { headReadOf } from "../../session-incarnation.js";
|
|
37
40
|
import { serviceVersion } from "../../service-version.js";
|
|
38
41
|
import { storedBodyReplayRefusal } from "../stored-body-replay.js";
|
|
39
|
-
import { steerBodyKeyIssue } from "../../request-key-closure.js";
|
|
42
|
+
import { haltBodyIssue, steerBodyKeyIssue } from "../../request-key-closure.js";
|
|
40
43
|
import { fieldConflictFacts } from "../../field-conflict.js";
|
|
41
44
|
const STEER_PRIORITY_WORDS = INJECTION_TIERS.map((tier) => `'${tier}'`);
|
|
42
45
|
const STEER_PRIORITY_UNION = STEER_PRIORITY_WORDS.join(" | ");
|
|
@@ -78,28 +81,16 @@ export function projectDecisionActor(raw) {
|
|
|
78
81
|
const parsed = AskDecisionActorSchema.safeParse(raw);
|
|
79
82
|
return parsed.success ? parsed.data : undefined;
|
|
80
83
|
}
|
|
81
|
-
async function subagentReadGate(req, res, ctx, runId,
|
|
84
|
+
async function subagentReadGate(req, res, ctx, runId, route) {
|
|
82
85
|
const { deps } = ctx;
|
|
83
|
-
const
|
|
84
|
-
if (
|
|
85
|
-
sendPrincipalRefusal(res, req, deps.config);
|
|
86
|
+
const entry = enter(req, res, deps, route);
|
|
87
|
+
if (entry === undefined)
|
|
86
88
|
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)) {
|
|
89
|
+
const admitted = (await admitRunById(entry, res, deps.runStore, runId));
|
|
90
|
+
if (admitted === undefined)
|
|
95
91
|
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 };
|
|
92
|
+
const trusted = admitted.quals.has("operator");
|
|
93
|
+
return { run: admitted.row, trusted };
|
|
103
94
|
}
|
|
104
95
|
function sendHandleMiss(res, run, thisInstanceId) {
|
|
105
96
|
if (isTerminalRunStatus(run.status)) {
|
|
@@ -112,7 +103,7 @@ function sendHandleMiss(res, run, thisInstanceId) {
|
|
|
112
103
|
}
|
|
113
104
|
return false;
|
|
114
105
|
}
|
|
115
|
-
async function streamRunEvents(req, res, deps, runStore, taskId
|
|
106
|
+
async function streamRunEvents(req, res, deps, runStore, taskId) {
|
|
116
107
|
await streamSseLog(req, res, {
|
|
117
108
|
preamble: async (signal) => {
|
|
118
109
|
const gate = resolveStreamApprovalGate({
|
|
@@ -143,7 +134,7 @@ async function streamRunEvents(req, res, deps, runStore, taskId, staleMs) {
|
|
|
143
134
|
onPreambleFailure: (reason, err) => deps.logger?.warn?.("approval_preamble_failed", { taskId, reason, face: "run.events", error: err instanceof Error ? err.message : String(err ?? "") }),
|
|
144
135
|
statusOf: async (id) => {
|
|
145
136
|
const run = await runStore.getRun(id);
|
|
146
|
-
return run ?
|
|
137
|
+
return run ? runRowAt("run-events", runStore, run) : undefined;
|
|
147
138
|
},
|
|
148
139
|
getEvents: (id, after) => runStore.getEvents(id, after),
|
|
149
140
|
formatEvent: (ev) => {
|
|
@@ -152,13 +143,16 @@ async function streamRunEvents(req, res, deps, runStore, taskId, staleMs) {
|
|
|
152
143
|
const data = screenedStoredEventData(type, redacted);
|
|
153
144
|
return { id: ev.seq, event: type, data: { type, ...(data ?? {}) } };
|
|
154
145
|
},
|
|
155
|
-
|
|
156
|
-
|
|
146
|
+
isTerminalEvent: (ev) => ev.type === "done" || ev.type === "failed",
|
|
147
|
+
closingFrameOf: (row, deliveredTerminal) => !deliveredTerminal && isHolderDeathVerdict(row)
|
|
148
|
+
? { event: "failed", data: { type: "failed", ...(row.error !== null ? { errorMessage: seatText("trace-frame-text", row.error) } : {}), errorCode: row.errorCode } }
|
|
149
|
+
: undefined,
|
|
150
|
+
}, taskId);
|
|
157
151
|
}
|
|
158
152
|
function sendSteerReplayRefusal(res, refusal) {
|
|
159
153
|
const detail = refusal?.detail;
|
|
160
154
|
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 ? {
|
|
155
|
+
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
156
|
}
|
|
163
157
|
async function acceptLiveUserInput(deps, res, at) {
|
|
164
158
|
if (!deps.userInputLedger)
|
|
@@ -190,7 +184,7 @@ async function relayAcceptedInput(deps, acceptance, call) {
|
|
|
190
184
|
export async function handleRuns(req, res, match, ctx) {
|
|
191
185
|
const { deps } = ctx;
|
|
192
186
|
const { idemCache, inflightRuns, preemptableRuns, steerableRuns, wakeParkMints } = ctx.registry;
|
|
193
|
-
const { readJson, rateLimited, quotaExceeded, leaseDenied, usageWindowDenied
|
|
187
|
+
const { readJson, rateLimited, quotaExceeded, leaseDenied, usageWindowDenied } = ctx.helpers;
|
|
194
188
|
const { prepareSpec } = ctx.legs;
|
|
195
189
|
const source = ctx.req.source;
|
|
196
190
|
if (match.decl.id === "runs-submit") {
|
|
@@ -201,7 +195,7 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
201
195
|
}
|
|
202
196
|
const runStore = runs.runStore;
|
|
203
197
|
const rawIdem = headerStr(req.headers["idempotency-key"]);
|
|
204
|
-
const submitter =
|
|
198
|
+
const submitter = gatedSubject(req, deps.config);
|
|
205
199
|
const keyedBody = rawIdem ? await readJson(req) : undefined;
|
|
206
200
|
const idem = rawIdem ? submissionIdemOf(rawIdem, idemCallerOf(req, ctx), keyedBody) : undefined;
|
|
207
201
|
if (idem) {
|
|
@@ -213,14 +207,19 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
213
207
|
const inflight = idemCache.peek(inflightKeyOf(idem, "durable", clientTaskId));
|
|
214
208
|
const keyedRow = inflight ? undefined : await runStore.getRunByIdem(idem.key);
|
|
215
209
|
if (inflight || keyedRow) {
|
|
216
|
-
const resp = inflight ? await inflight : await replayOfExistingRun(keyedRow, {
|
|
210
|
+
const resp = inflight ? await inflight : await replayOfExistingRun(keyedRow, { subject: submitter, idem, ...(clientTaskId !== undefined ? { clientTaskId } : {}) }, "durable", deps, runStore);
|
|
217
211
|
sendJson(res, resp.status, resp.body);
|
|
218
212
|
return;
|
|
219
213
|
}
|
|
220
214
|
}
|
|
221
215
|
if (rateLimited(req, res) || quotaExceeded(req, res))
|
|
222
216
|
return;
|
|
223
|
-
const
|
|
217
|
+
const body = rawIdem ? keyedBody : await readJson(req);
|
|
218
|
+
if (!idem && clientTaskIdOf(body) === false) {
|
|
219
|
+
sendError(res, 400, "request.id_invalid", "body.taskId must be a uuidv7 string (caller-minted idempotency key)");
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
const prepared = await prepareSpec(req, res, body);
|
|
224
223
|
if (!prepared)
|
|
225
224
|
return;
|
|
226
225
|
try {
|
|
@@ -241,12 +240,11 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
241
240
|
return;
|
|
242
241
|
}
|
|
243
242
|
const runStore = runs.runStore;
|
|
244
|
-
|
|
245
|
-
|
|
243
|
+
const entry = enter(req, res, deps, match.decl.id);
|
|
244
|
+
if (entry === undefined)
|
|
246
245
|
return;
|
|
247
|
-
}
|
|
248
246
|
let run;
|
|
249
|
-
let
|
|
247
|
+
let pathId;
|
|
250
248
|
if (match.decl.id === "runs-by-idem") {
|
|
251
249
|
const rawKey = new URLSearchParams(match.search).get("idempotencyKey");
|
|
252
250
|
if (!rawKey) {
|
|
@@ -254,27 +252,20 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
254
252
|
return;
|
|
255
253
|
}
|
|
256
254
|
run = await runStore.getRunByIdem(idemKeyOf(rawKey, idemCallerOf(req, ctx), "run"));
|
|
257
|
-
notFound = RUN_NOT_FOUND_MESSAGE;
|
|
258
255
|
}
|
|
259
256
|
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;
|
|
257
|
+
pathId = match.params.taskId;
|
|
258
|
+
run = await runStore.getRun(pathId);
|
|
267
259
|
}
|
|
268
|
-
const
|
|
269
|
-
if (
|
|
270
|
-
return;
|
|
271
|
-
if (!runSessionAcceptOk(req, res, run, match.decl.id === "run-events" ? "run.events" : "run.poll"))
|
|
260
|
+
const admitted = await admitRunRow(entry, res, runStore, run, pathId);
|
|
261
|
+
if (admitted === undefined)
|
|
272
262
|
return;
|
|
263
|
+
const taskId = admitted.row.taskId;
|
|
273
264
|
if (match.decl.id === "run-events") {
|
|
274
|
-
await streamRunEvents(req, res, deps, runStore, taskId
|
|
265
|
+
await streamRunEvents(req, res, deps, runStore, taskId);
|
|
275
266
|
}
|
|
276
267
|
else {
|
|
277
|
-
sendJson(res, 200, await readRunFace(deps, runStore,
|
|
268
|
+
sendJson(res, 200, await readRunFace(deps, runStore, admitted.row));
|
|
278
269
|
}
|
|
279
270
|
return;
|
|
280
271
|
}
|
|
@@ -285,26 +276,20 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
285
276
|
return;
|
|
286
277
|
}
|
|
287
278
|
const runStore = runs.runStore;
|
|
288
|
-
|
|
289
|
-
|
|
279
|
+
const entry = enter(req, res, deps, match.decl.id);
|
|
280
|
+
if (entry === undefined)
|
|
290
281
|
return;
|
|
291
|
-
}
|
|
292
282
|
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"))
|
|
283
|
+
const cancelAdmitted = (await admitRunById(entry, res, runStore, taskId));
|
|
284
|
+
if (cancelAdmitted === undefined)
|
|
301
285
|
return;
|
|
286
|
+
const run = cancelAdmitted.row;
|
|
302
287
|
const rs = runStore;
|
|
303
288
|
const cancelSuspended = async () => {
|
|
304
289
|
const cs = deps.checkpointStore;
|
|
305
290
|
let note = "cancelled while suspended (pending approval settled)";
|
|
306
291
|
if (cs) {
|
|
307
|
-
const token = await cs.findPendingTokenBySession(run.sessionId, undefined, { gateKinds: LIVE_RUN_GATE_KINDS });
|
|
292
|
+
const token = await cs.findPendingTokenBySession(run.sessionId, undefined, { gateKinds: LIVE_RUN_GATE_KINDS, axis: "run" });
|
|
308
293
|
if (token) {
|
|
309
294
|
const cp = await cs.get(token);
|
|
310
295
|
const won = cp ? await cs.expire(token, cp.scope) : false;
|
|
@@ -410,11 +395,9 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
410
395
|
return;
|
|
411
396
|
}
|
|
412
397
|
const runStore = runs.runStore;
|
|
413
|
-
const
|
|
414
|
-
if (
|
|
415
|
-
sendPrincipalRefusal(res, req, deps.config);
|
|
398
|
+
const entry = enter(req, res, deps, match.decl.id);
|
|
399
|
+
if (entry === undefined)
|
|
416
400
|
return;
|
|
417
|
-
}
|
|
418
401
|
const taskId = match.params.taskId;
|
|
419
402
|
const body = ((await readJson(req)) ?? {});
|
|
420
403
|
if (typeof body.text !== "string" || body.text.length === 0) {
|
|
@@ -440,10 +423,9 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
440
423
|
const priority = body.priority;
|
|
441
424
|
const steerIdemRaw = headerStr(req.headers["idempotency-key"]);
|
|
442
425
|
const messageId = steerIdemRaw ? `idem-${idemKeyOf(steerIdemRaw, idemCallerOf(req, ctx), "run").slice(0, 32)}` : uuidv7();
|
|
443
|
-
const trusted = explicitOperatorOk(principal, deps.config);
|
|
444
426
|
const steerInput = () => ({
|
|
445
427
|
text,
|
|
446
|
-
trusted,
|
|
428
|
+
trusted: false,
|
|
447
429
|
inputId: messageId,
|
|
448
430
|
...(priority !== undefined ? { priority } : {}),
|
|
449
431
|
});
|
|
@@ -457,15 +439,10 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
457
439
|
}
|
|
458
440
|
throw e;
|
|
459
441
|
}
|
|
460
|
-
const
|
|
461
|
-
if (
|
|
462
|
-
sendError(res, 404, "not_found.run", runNotFoundMessage(taskId));
|
|
463
|
-
return;
|
|
464
|
-
}
|
|
465
|
-
if (!trusted && !runOwnerOk(req, res, run.owner))
|
|
466
|
-
return;
|
|
467
|
-
if (!runSessionAcceptOk(req, res, run, "run.steer"))
|
|
442
|
+
const steerAdmitted = (await admitRunById(entry, res, runStore, taskId));
|
|
443
|
+
if (steerAdmitted === undefined)
|
|
468
444
|
return;
|
|
445
|
+
const run = steerAdmitted.row;
|
|
469
446
|
let parkQueueFull;
|
|
470
447
|
let parkDuplicateKey;
|
|
471
448
|
const tryPark = async () => {
|
|
@@ -473,7 +450,7 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
473
450
|
if (!park.available)
|
|
474
451
|
return "no-store";
|
|
475
452
|
const cs = park.checkpointStore;
|
|
476
|
-
const parkBinding = { gateKinds: LIVE_RUN_GATE_KINDS };
|
|
453
|
+
const parkBinding = { gateKinds: LIVE_RUN_GATE_KINDS, axis: "run" };
|
|
477
454
|
const scope = await cs.peekPendingScope(run.sessionId, parkBinding);
|
|
478
455
|
if (scope === null || scope === undefined)
|
|
479
456
|
return "no-checkpoint";
|
|
@@ -505,7 +482,7 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
505
482
|
if (acceptance === "refused")
|
|
506
483
|
return;
|
|
507
484
|
try {
|
|
508
|
-
await relayAcceptedInput(deps, acceptance, () => live.steer(text, { trusted, inputId: messageId, ...(priority !== undefined ? { priority } : {}) }));
|
|
485
|
+
await relayAcceptedInput(deps, acceptance, () => live.steer(text, { trusted: false, inputId: messageId, ...(priority !== undefined ? { priority } : {}) }));
|
|
509
486
|
sendJson(res, 200, { taskId, status: "running", delivery: "applied", messageId, ...(priority ? { priority } : {}) });
|
|
510
487
|
return;
|
|
511
488
|
}
|
|
@@ -583,7 +560,7 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
583
560
|
return;
|
|
584
561
|
}
|
|
585
562
|
const prior = wakeParkMints.get(run.sessionId) ?? Promise.resolve();
|
|
586
|
-
const mintResult = { parked: false, queueFull: false, duplicateKey: false, noResumeCtx: false };
|
|
563
|
+
const mintResult = { parked: false, queueFull: false, duplicateKey: false, noResumeCtx: false, unreadableCtx: false };
|
|
587
564
|
const parkOnce = async (t, sc) => {
|
|
588
565
|
try {
|
|
589
566
|
if (await deps.checkpointStore.setPendingSteer(t, sc, steerInput()))
|
|
@@ -638,6 +615,10 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
638
615
|
mintResult.unsealableCtx = resumeRead;
|
|
639
616
|
return;
|
|
640
617
|
}
|
|
618
|
+
if (resumeRead.kind === "unreadable") {
|
|
619
|
+
mintResult.unreadableCtx = true;
|
|
620
|
+
return;
|
|
621
|
+
}
|
|
641
622
|
if (resumeRead.kind === "absent") {
|
|
642
623
|
mintResult.noResumeCtx = true;
|
|
643
624
|
return;
|
|
@@ -661,7 +642,11 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
661
642
|
createdAt: Date.now(),
|
|
662
643
|
sourceSessionId: run.sessionId,
|
|
663
644
|
});
|
|
664
|
-
const
|
|
645
|
+
const withdrawThenRethrow = async (e) => {
|
|
646
|
+
await withdrawWakeCard(wakeToken, cpScope, "resume_context_defect");
|
|
647
|
+
throw e;
|
|
648
|
+
};
|
|
649
|
+
const stillRead = await readResumeCtx(cs.getCtx(run.sessionId), { sessionId: run.sessionId, opener: deps.checkpointCtxSealing }).catch(withdrawThenRethrow);
|
|
665
650
|
if (stillRead.kind === "corrupt" || stillRead.kind === "unsealable") {
|
|
666
651
|
await withdrawWakeCard(wakeToken, cpScope, stillRead.kind === "corrupt" ? "resume_context_corrupt" : "resume_context_unsealable");
|
|
667
652
|
if (stillRead.kind === "corrupt")
|
|
@@ -670,12 +655,17 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
670
655
|
mintResult.unsealableCtx = stillRead;
|
|
671
656
|
return;
|
|
672
657
|
}
|
|
658
|
+
if (stillRead.kind === "unreadable") {
|
|
659
|
+
await withdrawWakeCard(wakeToken, cpScope, "resume_context_unreadable");
|
|
660
|
+
mintResult.unreadableCtx = true;
|
|
661
|
+
return;
|
|
662
|
+
}
|
|
673
663
|
if (stillRead.kind !== "ok") {
|
|
674
664
|
await withdrawWakeCard(wakeToken, cpScope, "resume_context_absent");
|
|
675
665
|
mintResult.noResumeCtx = true;
|
|
676
666
|
return;
|
|
677
667
|
}
|
|
678
|
-
const winner = await cs.findPendingTokenBySession(run.sessionId, undefined, { gateKinds: TERMINAL_PARK_GATE_KINDS, pick: "oldest" }).catch(() => null);
|
|
668
|
+
const winner = await cs.findPendingTokenBySession(run.sessionId, undefined, { gateKinds: TERMINAL_PARK_GATE_KINDS, pick: "oldest", axis: "run" }).catch(() => null);
|
|
679
669
|
if (winner !== null && winner !== wakeToken) {
|
|
680
670
|
await withdrawWakeCard(wakeToken, cpScope, "converged_on_winner");
|
|
681
671
|
await parkOnce(winner, cpScope);
|
|
@@ -708,6 +698,11 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
708
698
|
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
699
|
return;
|
|
710
700
|
}
|
|
701
|
+
if (mintResult.unreadableCtx) {
|
|
702
|
+
const { status, body: { error, errorCode, ...facts } } = resumeCtxUnreadableAnswer();
|
|
703
|
+
sendError(res, status, errorCode, error, facts);
|
|
704
|
+
return;
|
|
705
|
+
}
|
|
711
706
|
if (mintResult.unservable !== undefined) {
|
|
712
707
|
deps.logger?.warn?.("steer_wake_park_refused_stored_body", { taskId, sessionId: run.sessionId, ...storedBodyReplayLogFields(mintResult.unservable) });
|
|
713
708
|
const { status, body: { error, errorCode, ...rest } } = storedBodyReplayAnswer(mintResult.unservable, serviceVersion(), false);
|
|
@@ -735,62 +730,23 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
735
730
|
return;
|
|
736
731
|
}
|
|
737
732
|
const runStore = runs.runStore;
|
|
738
|
-
const
|
|
739
|
-
if (
|
|
740
|
-
sendPrincipalRefusal(res, req, deps.config);
|
|
733
|
+
const entry = enter(req, res, deps, match.decl.id);
|
|
734
|
+
if (entry === undefined)
|
|
741
735
|
return;
|
|
742
|
-
}
|
|
743
736
|
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 });
|
|
737
|
+
const haltIssue = haltBodyIssue(await readJson(req));
|
|
738
|
+
if (haltIssue) {
|
|
739
|
+
sendError(res, 400, "request.body_shape", haltIssue.message, { unknownKeys: haltIssue.unknownKeys, unsupportedKeys: haltIssue.unsupportedKeys });
|
|
763
740
|
return;
|
|
764
741
|
}
|
|
765
|
-
const
|
|
766
|
-
|
|
767
|
-
const interruptMessageId = interruptInputId;
|
|
768
|
-
const trusted = explicitOperatorOk(principal, deps.config);
|
|
769
|
-
if (!interruptBare) {
|
|
770
|
-
try {
|
|
771
|
-
validatePendingSteer({ text, trusted, 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 (!trusted && !runOwnerOk(req, res, run.owner))
|
|
787
|
-
return;
|
|
788
|
-
if (!runSessionAcceptOk(req, res, run, "run.interrupt"))
|
|
742
|
+
const interruptAdmitted = (await admitRunById(entry, res, runStore, taskId));
|
|
743
|
+
if (interruptAdmitted === undefined)
|
|
789
744
|
return;
|
|
745
|
+
const run = interruptAdmitted.row;
|
|
790
746
|
const sendInterruptNotRunning = (error) => sendError(res, 409, "steering.not_running", error);
|
|
791
747
|
const sendNoLiveTurn = (status, streamJustSettled) => {
|
|
792
748
|
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
|
|
749
|
+
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
750
|
return;
|
|
795
751
|
}
|
|
796
752
|
if (streamJustSettled) {
|
|
@@ -814,53 +770,23 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
814
770
|
sendNoLiveTurn(run.status, false);
|
|
815
771
|
return;
|
|
816
772
|
}
|
|
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;
|
|
773
|
+
let haltReceipt;
|
|
840
774
|
try {
|
|
841
|
-
|
|
775
|
+
haltReceipt = await liveStream.halt();
|
|
842
776
|
}
|
|
843
777
|
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")
|
|
778
|
+
if (e.code !== "steering.not_running")
|
|
858
779
|
throw e;
|
|
859
780
|
const freshRun = await runStore.getRun(taskId).catch(() => undefined);
|
|
860
781
|
sendNoLiveTurn(freshRun?.status ?? run.status, true);
|
|
861
782
|
return;
|
|
862
783
|
}
|
|
863
|
-
sendJson(res, 202, {
|
|
784
|
+
sendJson(res, 202, {
|
|
785
|
+
taskId,
|
|
786
|
+
status: run.status,
|
|
787
|
+
turnCut: haltReceipt.turnCut,
|
|
788
|
+
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.",
|
|
789
|
+
});
|
|
864
790
|
return;
|
|
865
791
|
}
|
|
866
792
|
if (match.decl.id === "run-compact") {
|
|
@@ -872,22 +798,14 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
872
798
|
return;
|
|
873
799
|
}
|
|
874
800
|
const runStore = runs.runStore;
|
|
875
|
-
const
|
|
876
|
-
if (
|
|
877
|
-
sendPrincipalRefusal(res, req, deps.config);
|
|
801
|
+
const entry = enter(req, res, deps, match.decl.id);
|
|
802
|
+
if (entry === undefined)
|
|
878
803
|
return;
|
|
879
|
-
}
|
|
880
804
|
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"))
|
|
805
|
+
const compactAdmitted = (await admitRunById(entry, res, runStore, taskId));
|
|
806
|
+
if (compactAdmitted === undefined)
|
|
890
807
|
return;
|
|
808
|
+
const run = compactAdmitted.row;
|
|
891
809
|
const parsed = await readJson(req);
|
|
892
810
|
if (parsed === null || typeof parsed !== "object") {
|
|
893
811
|
sendHttpError(res, invalidJsonError("not_object"));
|
|
@@ -927,27 +845,19 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
927
845
|
return;
|
|
928
846
|
}
|
|
929
847
|
const runStore = runs.runStore;
|
|
930
|
-
const
|
|
931
|
-
if (
|
|
932
|
-
sendPrincipalRefusal(res, req, deps.config);
|
|
848
|
+
const entry = enter(req, res, deps, match.decl.id);
|
|
849
|
+
if (entry === undefined)
|
|
933
850
|
return;
|
|
934
|
-
}
|
|
935
851
|
const taskId = match.params.taskId;
|
|
936
852
|
const body = ((await readJson(req)) ?? {});
|
|
937
853
|
if (typeof body.toolCallId !== "string" || body.toolCallId.length === 0 || body.toolCallId.length > 256) {
|
|
938
854
|
sendError(res, 400, "request.body_shape", "body must be { toolCallId: string (non-empty, ≤256 chars) }");
|
|
939
855
|
return;
|
|
940
856
|
}
|
|
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"))
|
|
857
|
+
const detachAdmitted = (await admitRunById(entry, res, runStore, taskId));
|
|
858
|
+
if (detachAdmitted === undefined)
|
|
950
859
|
return;
|
|
860
|
+
const run = detachAdmitted.row;
|
|
951
861
|
const live = steerableRuns.get(taskId);
|
|
952
862
|
if (!live) {
|
|
953
863
|
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 +871,7 @@ export async function handleRuns(req, res, match, ctx) {
|
|
|
961
871
|
}
|
|
962
872
|
export async function handleRunVerbs(req, res, match, ctx) {
|
|
963
873
|
const { deps } = ctx;
|
|
964
|
-
const { readJson, rateLimited, quotaExceeded, ownerQuotaDenied, leaseDenied, ownerLeaseDenied, safeDecode
|
|
874
|
+
const { readJson, rateLimited, quotaExceeded, ownerQuotaDenied, leaseDenied, ownerLeaseDenied, safeDecode } = ctx.helpers;
|
|
965
875
|
if (match.decl.id === "run-subagent-output") {
|
|
966
876
|
const outputFact = facts.subagentOutput(deps);
|
|
967
877
|
if (!outputFact.available) {
|
|
@@ -976,7 +886,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
976
886
|
sendError(res, 400, "request.path_malformed", "malformed subagent path (invalid percent-encoding)");
|
|
977
887
|
return;
|
|
978
888
|
}
|
|
979
|
-
const gated = await subagentReadGate(req, res, ctx, runId, match.
|
|
889
|
+
const gated = await subagentReadGate(req, res, ctx, runId, match.decl.id);
|
|
980
890
|
if (!gated)
|
|
981
891
|
return;
|
|
982
892
|
const { run } = gated;
|
|
@@ -1004,7 +914,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
1004
914
|
sendError(res, 400, "request.path_malformed", "malformed subagent path (invalid percent-encoding)");
|
|
1005
915
|
return;
|
|
1006
916
|
}
|
|
1007
|
-
const gatedTail = await subagentReadGate(req, res, ctx, runId, match.
|
|
917
|
+
const gatedTail = await subagentReadGate(req, res, ctx, runId, match.decl.id);
|
|
1008
918
|
if (!gatedTail)
|
|
1009
919
|
return;
|
|
1010
920
|
const { run } = gatedTail;
|
|
@@ -1072,7 +982,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
1072
982
|
sendError(res, 400, "request.path_malformed", "malformed task path (invalid percent-encoding)");
|
|
1073
983
|
return;
|
|
1074
984
|
}
|
|
1075
|
-
const gatedB = await subagentReadGate(req, res, ctx, runId, match.
|
|
985
|
+
const gatedB = await subagentReadGate(req, res, ctx, runId, match.decl.id);
|
|
1076
986
|
if (!gatedB)
|
|
1077
987
|
return;
|
|
1078
988
|
const { run } = gatedB;
|
|
@@ -1137,11 +1047,9 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
1137
1047
|
return;
|
|
1138
1048
|
}
|
|
1139
1049
|
const runStore = steerFact.runStore;
|
|
1140
|
-
const
|
|
1141
|
-
if (
|
|
1142
|
-
sendPrincipalRefusal(res, req, deps.config);
|
|
1050
|
+
const entry = enter(req, res, deps, match.decl.id);
|
|
1051
|
+
if (entry === undefined)
|
|
1143
1052
|
return;
|
|
1144
|
-
}
|
|
1145
1053
|
const runId = safeDecode(match.params.runId);
|
|
1146
1054
|
const target = safeDecode(match.params.sub);
|
|
1147
1055
|
if (runId === null || target === null) {
|
|
@@ -1164,16 +1072,10 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
1164
1072
|
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
1073
|
return;
|
|
1166
1074
|
}
|
|
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}`))
|
|
1075
|
+
const childAdmitted = (await admitRunById(entry, res, runStore, runId));
|
|
1076
|
+
if (childAdmitted === undefined)
|
|
1176
1077
|
return;
|
|
1078
|
+
const run = childAdmitted.row;
|
|
1177
1079
|
const send409 = (errorCode, error) => sendError(res, 409, errorCode, error);
|
|
1178
1080
|
const redacted = redactSteerIn(body.content, target);
|
|
1179
1081
|
const resolution = steerFact.registry.resolve(runId, target);
|
|
@@ -1194,7 +1096,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
1194
1096
|
if (await ownerLeaseDenied(res, run.owner ?? undefined))
|
|
1195
1097
|
return;
|
|
1196
1098
|
const resumeFn = handle.resume;
|
|
1197
|
-
const marker = await
|
|
1099
|
+
const marker = await withSubject(recoveredSubject(run.owner), () => resumeFn(redacted));
|
|
1198
1100
|
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
1101
|
return;
|
|
1200
1102
|
}
|
|
@@ -1241,7 +1143,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
1241
1143
|
sendError(res, 501, "feature.elicitation_disabled", "inbound MCP elicitation is not enabled on this worker (MCP_ELICITATION_ENABLED)");
|
|
1242
1144
|
return;
|
|
1243
1145
|
}
|
|
1244
|
-
const principal =
|
|
1146
|
+
const principal = gatedSubject(req, deps.config);
|
|
1245
1147
|
if (deps.config.requirePrincipal && principal === undefined) {
|
|
1246
1148
|
sendPrincipalRefusal(res, req, deps.config);
|
|
1247
1149
|
return;
|
|
@@ -1260,7 +1162,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
1260
1162
|
sendError(res, 501, "feature.ask_question_disabled", "AskUserQuestion live HITL is not enabled on this worker (ASK_QUESTION_ENABLED)");
|
|
1261
1163
|
return;
|
|
1262
1164
|
}
|
|
1263
|
-
const principal =
|
|
1165
|
+
const principal = gatedSubject(req, deps.config);
|
|
1264
1166
|
if (deps.config.requirePrincipal && principal === undefined) {
|
|
1265
1167
|
sendPrincipalRefusal(res, req, deps.config);
|
|
1266
1168
|
return;
|
|
@@ -1279,7 +1181,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
1279
1181
|
sendError(res, 501, "feature.tool_approval_disabled", "live tool-approval HITL is not enabled on this worker (TOOL_APPROVAL_ENABLED)");
|
|
1280
1182
|
return;
|
|
1281
1183
|
}
|
|
1282
|
-
const principal =
|
|
1184
|
+
const principal = gatedSubject(req, deps.config);
|
|
1283
1185
|
if (deps.config.requirePrincipal && principal === undefined) {
|
|
1284
1186
|
sendPrincipalRefusal(res, req, deps.config);
|
|
1285
1187
|
return;
|
|
@@ -1308,7 +1210,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
1308
1210
|
return;
|
|
1309
1211
|
}
|
|
1310
1212
|
const askStore = streamFact.askStore;
|
|
1311
|
-
const principal =
|
|
1213
|
+
const principal = gatedSubject(req, deps.config);
|
|
1312
1214
|
if (deps.config.requirePrincipal && principal === undefined) {
|
|
1313
1215
|
sendPrincipalRefusal(res, req, deps.config);
|
|
1314
1216
|
return;
|
|
@@ -1350,9 +1252,8 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
1350
1252
|
askNotFound();
|
|
1351
1253
|
return;
|
|
1352
1254
|
}
|
|
1353
|
-
const
|
|
1354
|
-
|
|
1355
|
-
if (!ownerOk && !operatorOk) {
|
|
1255
|
+
const askAdmission = keyAdmission("ask.decide", { subject: principal, operator: explicitOperatorOk(principal === undefined ? undefined : personOf(principal), deps.config) }, ownerCellOf(row0.owner));
|
|
1256
|
+
if (askAdmission === undefined) {
|
|
1356
1257
|
askNotFound();
|
|
1357
1258
|
return;
|
|
1358
1259
|
}
|
|
@@ -1360,7 +1261,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
1360
1261
|
id: principal ?? "_",
|
|
1361
1262
|
...(body.actor ? { label: redactSecrets(body.actor.label).slice(0, ASK_ACTOR_LABEL_MAX) } : {}),
|
|
1362
1263
|
verified: principal !== undefined,
|
|
1363
|
-
via:
|
|
1264
|
+
via: askAdmission === "row" ? "owner" : "operator",
|
|
1364
1265
|
};
|
|
1365
1266
|
const decidedRowIsAuthoritative = (row) => {
|
|
1366
1267
|
if (row.state !== "DECIDED" || row.decision !== "approve" && row.decision !== "deny" || row.provisional || row.decidedAtMs === null) {
|
|
@@ -1423,7 +1324,7 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
1423
1324
|
}
|
|
1424
1325
|
case "PARKED":
|
|
1425
1326
|
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
|
|
1327
|
+
sessionId: parkSessionOf(row),
|
|
1427
1328
|
gateBoundCallId: row.gateBoundCallId,
|
|
1428
1329
|
gateBoundInputHash: row.gateBoundInputHash,
|
|
1429
1330
|
});
|
|
@@ -1576,31 +1477,43 @@ export async function handleRunVerbs(req, res, match, ctx) {
|
|
|
1576
1477
|
return assertNever(match.decl.id);
|
|
1577
1478
|
}
|
|
1578
1479
|
export async function createDurableRun(req, res, ctx, prepared, idem) {
|
|
1480
|
+
try {
|
|
1481
|
+
const out = await createDurableRunHeld(req, res, ctx, prepared, idem);
|
|
1482
|
+
await prepared.seat.close();
|
|
1483
|
+
return out;
|
|
1484
|
+
}
|
|
1485
|
+
catch (err) {
|
|
1486
|
+
await prepared.seat.close();
|
|
1487
|
+
throw err;
|
|
1488
|
+
}
|
|
1489
|
+
}
|
|
1490
|
+
async function createDurableRunHeld(req, res, ctx, prepared, idem) {
|
|
1579
1491
|
const { deps } = ctx;
|
|
1580
1492
|
const { idemCache } = ctx.registry;
|
|
1581
1493
|
const { leaseDenied, usageWindowDenied, admitRun } = ctx.helpers;
|
|
1494
|
+
const seat = prepared.seat;
|
|
1582
1495
|
const source = ctx.req.source;
|
|
1583
1496
|
const runs = facts.durableRuns(deps);
|
|
1584
1497
|
if (!runs.available) {
|
|
1585
|
-
sendError(res, 501, "capability.run_store_required", "async runs require a durable run store (DB_BACKEND=mysql|pg|local)");
|
|
1498
|
+
await seat.deliverTerminal(() => sendError(res, 501, "capability.run_store_required", "async runs require a durable run store (DB_BACKEND=mysql|pg|local)"));
|
|
1586
1499
|
return null;
|
|
1587
1500
|
}
|
|
1588
1501
|
const runStore = runs.runStore;
|
|
1589
1502
|
const clientTaskId = clientTaskIdOf(prepared.body);
|
|
1590
1503
|
if (clientTaskId === false) {
|
|
1591
|
-
sendError(res, 400, "request.id_invalid", "body.taskId must be a uuidv7 string (caller-minted idempotency key)");
|
|
1504
|
+
await seat.deliverTerminal(() => sendError(res, 400, "request.id_invalid", "body.taskId must be a uuidv7 string (caller-minted idempotency key)"));
|
|
1592
1505
|
return null;
|
|
1593
1506
|
}
|
|
1594
|
-
const submitter =
|
|
1595
|
-
const caller = {
|
|
1507
|
+
const submitter = gatedSubject(req, deps.config);
|
|
1508
|
+
const caller = { subject: submitter, idem, ...(clientTaskId !== undefined ? { clientTaskId } : {}) };
|
|
1596
1509
|
if (clientTaskId) {
|
|
1597
1510
|
const existing = await runStore.getRun(clientTaskId);
|
|
1598
1511
|
if (existing)
|
|
1599
1512
|
return await replayOfExistingRun(existing, caller, "durable", deps, runStore);
|
|
1600
1513
|
}
|
|
1601
|
-
if ((await leaseDenied(req, res)) || (await usageWindowDenied(req, res)))
|
|
1514
|
+
if ((await leaseDenied(req, res, seat)) || (await usageWindowDenied(req, res, seat)))
|
|
1602
1515
|
return null;
|
|
1603
|
-
const runSlot = admitRun(req, res);
|
|
1516
|
+
const runSlot = await admitRun(req, res, seat);
|
|
1604
1517
|
if (runSlot === undefined)
|
|
1605
1518
|
return null;
|
|
1606
1519
|
return await idemCache.run(idem !== undefined ? inflightKeyOf(idem, "durable", clientTaskId) : undefined, async () => {
|
|
@@ -1611,10 +1524,12 @@ export async function createDurableRun(req, res, ctx, prepared, idem) {
|
|
|
1611
1524
|
fleetScope: submitter ?? "default",
|
|
1612
1525
|
elicitOwner: submitter ?? null,
|
|
1613
1526
|
source,
|
|
1614
|
-
identity: runIdentityOf(req, deps.config, prepared.auth?.
|
|
1527
|
+
identity: runIdentityOf(req, deps.config, prepared.auth?.subject ?? null),
|
|
1615
1528
|
runSlot,
|
|
1616
1529
|
});
|
|
1617
|
-
|
|
1530
|
+
const receipt = out.existing ? await replayOfExistingRun(out.existing, caller, "durable", deps, runStore) : out;
|
|
1531
|
+
await prepared.seat.close();
|
|
1532
|
+
return receipt;
|
|
1618
1533
|
}).finally(() => runSlot.release());
|
|
1619
1534
|
}
|
|
1620
1535
|
function clientTaskIdOf(body) {
|