@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
|
@@ -1,31 +1,37 @@
|
|
|
1
1
|
import { SessionError, materializeA2aTools, materializeMcpTools, sanitizePathComponent } from "@sema-agent/core";
|
|
2
2
|
import { a2aForScenario, mcpForScenario } from "../../web-admin-client/facade.js";
|
|
3
|
-
import { HttpError, isUuidShape
|
|
3
|
+
import { HttpError, isUuidShape } from "../../security.js";
|
|
4
4
|
import { windowMessages, truncateMessageBlobs, redactSessionViewForRead } from "../../audit.js";
|
|
5
5
|
import { redactSecrets } from "../../trace/redact.js";
|
|
6
6
|
import { seatText } from "../../trace/exit-seat.js";
|
|
7
7
|
import { recordFailOpen } from "../../observability/fail-open.js";
|
|
8
8
|
import { MCP_DIAL_DEADLINE_MS, raceDeadline } from "../mcp-dial-deadline.js";
|
|
9
9
|
import { sentMemoryComplianceFailure } from "../memory-compliance-failure-reply.js";
|
|
10
|
-
import { readLayerSeat,
|
|
10
|
+
import { readLayerSeat, sentMemoryFaceFault } from "../memory-face-fault-reply.js";
|
|
11
11
|
import { DEPLOYMENT_SHAPE_PREDICATES } from "../../deployment-shape.js";
|
|
12
12
|
import { MAX_SETTINGS_OUTPUT_STYLE_CHARS, MAX_SETTINGS_ENV_VARS, MAX_SETTINGS_ENV_KEY_CHARS, MAX_SETTINGS_ENV_VALUE_CHARS } from "../../task-settings.js";
|
|
13
13
|
import { readWritableSessionPermissionRules } from "../../session-policy-wire.js";
|
|
14
14
|
import { sendJson, sendError, sendSessionError, sendSessionPolicyError, sseHeaders, httpErrorBody } from "../send.js";
|
|
15
|
-
import {
|
|
15
|
+
import { gatedPerson, gatedSubject, sendPrincipalRefusal } from "../principal-gate.js";
|
|
16
|
+
import { personOf } from "../../owner-brands.js";
|
|
16
17
|
import { headReadOf, leafOfAdmittedHead, sessionFaceOfHead } from "../../session-incarnation.js";
|
|
17
|
-
import {
|
|
18
|
-
import { assertNever
|
|
18
|
+
import { admitSessionById, admitSessionRow, admittedAsFleet, callerEntry, callerOf, deliverVerdict, enter, judgeSessionRow, protocolEntry, readOwnerCell, refuse, seesRun, sessionRowPresent } from "../owner-access.js";
|
|
19
|
+
import { assertNever } from "../route-ctx.js";
|
|
19
20
|
import * as facts from "../../capability-facts.js";
|
|
20
21
|
import { rosterAgentId } from "./agents-roster.js";
|
|
21
22
|
import { projectSessionListRow } from "./sessions-list.js";
|
|
22
23
|
import { readSessionRowPatch } from "../../session-row.js";
|
|
23
|
-
import { forkPathOf } from "../execution-context.js";
|
|
24
|
+
import { forkPathOf, resolveExecutionContext } from "../execution-context.js";
|
|
24
25
|
import { executionPlacementView } from "../../execution-placement.js";
|
|
26
|
+
import { anchorReaderOf, resolveHistoryAnchor } from "../../history-anchor.js";
|
|
27
|
+
import { engineRefusalAnswerOf } from "../engine-refusal.js";
|
|
28
|
+
import { buildRewindFilesReply } from "../rewind-files-reply.js";
|
|
25
29
|
import { ForkTargetUnsettledError, forkKeyOf } from "../../plugins/session-fork.js";
|
|
26
30
|
import { fieldConflictFacts } from "../../field-conflict.js";
|
|
27
31
|
import { buildBoundedToolNames } from "../../panel-tool-names.js";
|
|
28
32
|
import { projectMcpAuthorization } from "../../mcp-authorization-face.js";
|
|
33
|
+
import { presentHostWorkspaceOf } from "../../task-cwd.js";
|
|
34
|
+
import { rewindFilesUnderPurpose } from "../../execution-env-purpose.js";
|
|
29
35
|
const MCP_STATUS_TTL_MS = 5_000;
|
|
30
36
|
const A2A_STATUS_TTL_MS = 5_000;
|
|
31
37
|
const A2A_MATERIALIZE_TIMEOUT_MS = 10_000;
|
|
@@ -40,11 +46,11 @@ export function createSessionsLocal() {
|
|
|
40
46
|
memoryStatusCache: new Map(),
|
|
41
47
|
};
|
|
42
48
|
}
|
|
43
|
-
async function lastLegMcpFor(deps, sessionId,
|
|
49
|
+
async function lastLegMcpFor(deps, sessionId, entry) {
|
|
44
50
|
let timer;
|
|
45
51
|
try {
|
|
46
52
|
return await Promise.race([
|
|
47
|
-
readLastLegMcp(deps, sessionId,
|
|
53
|
+
readLastLegMcp(deps, sessionId, entry),
|
|
48
54
|
new Promise((r) => { timer = setTimeout(() => { recordFailOpen("server.mcp-panel.last-leg-unreadable", `ledger read exceeded ${LAST_LEG_LEDGER_TIMEOUT_MS}ms`); r(undefined); }, LAST_LEG_LEDGER_TIMEOUT_MS); }),
|
|
49
55
|
]);
|
|
50
56
|
}
|
|
@@ -57,14 +63,14 @@ async function lastLegMcpFor(deps, sessionId, caller) {
|
|
|
57
63
|
clearTimeout(timer);
|
|
58
64
|
}
|
|
59
65
|
}
|
|
60
|
-
async function readLastLegMcp(deps, sessionId,
|
|
66
|
+
async function readLastLegMcp(deps, sessionId, entry) {
|
|
61
67
|
const runStore = deps.runStore;
|
|
62
68
|
if (!runStore || sessionId === null)
|
|
63
69
|
return undefined;
|
|
64
70
|
const latest = await runStore.latestRunForSession(sessionId);
|
|
65
71
|
if (latest === undefined)
|
|
66
72
|
return undefined;
|
|
67
|
-
if (!
|
|
73
|
+
if (!seesRun(entry, latest.owner))
|
|
68
74
|
return undefined;
|
|
69
75
|
const events = await runStore.getEvents(latest.taskId, 0);
|
|
70
76
|
for (let i = events.length - 1; i >= 0; i--) {
|
|
@@ -80,16 +86,12 @@ async function readLastLegMcp(deps, sessionId, caller) {
|
|
|
80
86
|
}
|
|
81
87
|
export async function handleSessions(req, res, match, ctx) {
|
|
82
88
|
const { deps } = ctx;
|
|
83
|
-
const { readJson, safeDecode
|
|
84
|
-
const readOwnedSessionView = async (sessionAudit, sessionId, readOpts) => {
|
|
89
|
+
const { readJson, safeDecode } = ctx.helpers;
|
|
90
|
+
const readOwnedSessionView = async (entry, sessionAudit, sessionId, readOpts) => {
|
|
85
91
|
const headOf = headReadOf(deps.sessionStorage);
|
|
86
92
|
if (headOf !== undefined) {
|
|
87
|
-
const
|
|
88
|
-
if (
|
|
89
|
-
sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
|
|
90
|
-
return undefined;
|
|
91
|
-
}
|
|
92
|
-
if (!sessionOwnerOk(req, res, await sessionOwnerCellOf(deps.sessionStorage, sessionId, owner)))
|
|
93
|
+
const head = await readOwnerCell(entry, sessionId, () => headOf(sessionId));
|
|
94
|
+
if ((await admitSessionRow(entry, res, deps.sessionStorage, sessionId, head)) === undefined)
|
|
93
95
|
return undefined;
|
|
94
96
|
}
|
|
95
97
|
let audit;
|
|
@@ -101,11 +103,7 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
101
103
|
throw e;
|
|
102
104
|
throw new Error(`session view read failed before ownership could be established: ${e instanceof Error ? e.message : String(e)}`, { cause: e });
|
|
103
105
|
}
|
|
104
|
-
if (
|
|
105
|
-
sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
|
|
106
|
-
return undefined;
|
|
107
|
-
}
|
|
108
|
-
if (!sessionOwnerOk(req, res, await sessionOwnerCellOf(deps.sessionStorage, sessionId, audit.owner)))
|
|
106
|
+
if ((await admitSessionRow(entry, res, deps.sessionStorage, sessionId, audit)) === undefined)
|
|
109
107
|
return undefined;
|
|
110
108
|
return audit;
|
|
111
109
|
};
|
|
@@ -113,7 +111,7 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
113
111
|
const { mcpStatusCache, a2aStatusCache } = ctx.local.sessions;
|
|
114
112
|
{
|
|
115
113
|
if (match.decl.id === "session-init") {
|
|
116
|
-
const principal =
|
|
114
|
+
const principal = gatedSubject(req, deps.config);
|
|
117
115
|
if (deps.config.requirePrincipal && !principal) {
|
|
118
116
|
sendPrincipalRefusal(res, req, deps.config);
|
|
119
117
|
return;
|
|
@@ -128,7 +126,7 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
128
126
|
}
|
|
129
127
|
{
|
|
130
128
|
if (match.decl.id === "session-settings") {
|
|
131
|
-
const principal =
|
|
129
|
+
const principal = gatedSubject(req, deps.config);
|
|
132
130
|
if (deps.config.requirePrincipal && !principal) {
|
|
133
131
|
sendPrincipalRefusal(res, req, deps.config);
|
|
134
132
|
return;
|
|
@@ -148,13 +146,13 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
148
146
|
}
|
|
149
147
|
{
|
|
150
148
|
if (match.decl.id === "session-mcp") {
|
|
151
|
-
const caller =
|
|
152
|
-
const principal = caller.
|
|
149
|
+
const caller = callerOf(req, deps);
|
|
150
|
+
const principal = caller.subject === undefined ? undefined : personOf(caller.subject);
|
|
153
151
|
if (deps.config.requirePrincipal && !principal) {
|
|
154
152
|
sendPrincipalRefusal(res, req, deps.config);
|
|
155
153
|
return;
|
|
156
154
|
}
|
|
157
|
-
const lastLegMcp = await lastLegMcpFor(deps, safeDecode(match.params.sessionId), caller);
|
|
155
|
+
const lastLegMcp = await lastLegMcpFor(deps, safeDecode(match.params.sessionId), protocolEntry(req, deps, "run.panel", caller));
|
|
158
156
|
const ledgerHalf = lastLegMcp === undefined ? {} : { lastLegMcp };
|
|
159
157
|
let scenarioName;
|
|
160
158
|
try {
|
|
@@ -210,7 +208,7 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
210
208
|
}
|
|
211
209
|
{
|
|
212
210
|
if (match.decl.id === "session-a2a") {
|
|
213
|
-
const principal =
|
|
211
|
+
const principal = gatedPerson(req, deps.config);
|
|
214
212
|
if (deps.config.requirePrincipal && !principal) {
|
|
215
213
|
sendPrincipalRefusal(res, req, deps.config);
|
|
216
214
|
return;
|
|
@@ -274,14 +272,12 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
274
272
|
sendError(res, 400, "request.path_malformed", "session id segment is not valid percent-encoding");
|
|
275
273
|
return;
|
|
276
274
|
}
|
|
277
|
-
const
|
|
278
|
-
|
|
279
|
-
|
|
275
|
+
const headEntry = callerEntry(req, deps, match.decl.id);
|
|
276
|
+
const headRead = await readOwnerCell(headEntry, headSession, () => headOf(headSession));
|
|
277
|
+
const admittedHead = await admitSessionRow(headEntry, res, deps.sessionStorage, headSession, headRead);
|
|
278
|
+
if (admittedHead === undefined)
|
|
280
279
|
return;
|
|
281
|
-
|
|
282
|
-
if (!sessionOwnerOk(req, res, await sessionOwnerCellOf(deps.sessionStorage, headSession, head.owner)))
|
|
283
|
-
return;
|
|
284
|
-
const leafId = leafOfAdmittedHead(head);
|
|
280
|
+
const leafId = leafOfAdmittedHead(admittedHead.row);
|
|
285
281
|
const etag = `"${leafId ?? "empty"}"`;
|
|
286
282
|
if (req.headers["if-none-match"] === etag) {
|
|
287
283
|
res.writeHead(304, { etag }).end();
|
|
@@ -304,14 +300,12 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
304
300
|
sendError(res, 400, "request.path_malformed", "session id segment is not valid percent-encoding");
|
|
305
301
|
return;
|
|
306
302
|
}
|
|
307
|
-
const
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
}
|
|
312
|
-
if (!explicitOperatorOk(gatedPrincipal(req, deps.config), deps.config) && !sessionOwnerOk(req, res, await sessionOwnerCellOf(deps.sessionStorage, placementSession, reading.occupant.owner)))
|
|
303
|
+
const placementEntry = callerEntry(req, deps, match.decl.id);
|
|
304
|
+
const reading = await readOwnerCell(placementEntry, placementSession, () => placementFact.seat.read(placementSession));
|
|
305
|
+
const admittedPlacement = await admitSessionRow(placementEntry, res, deps.sessionStorage, placementSession, reading === undefined ? undefined : { owner: reading.occupant.owner, cell: reading.cell });
|
|
306
|
+
if (admittedPlacement === undefined)
|
|
313
307
|
return;
|
|
314
|
-
sendJson(res, 200, executionPlacementView(
|
|
308
|
+
sendJson(res, 200, executionPlacementView(admittedPlacement.row.cell));
|
|
315
309
|
return;
|
|
316
310
|
}
|
|
317
311
|
}
|
|
@@ -322,7 +316,8 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
322
316
|
sendError(res, 501, "capability.session_store_required", "session events require a durable session store (DB_BACKEND=mysql|pg|local)");
|
|
323
317
|
return;
|
|
324
318
|
}
|
|
325
|
-
const
|
|
319
|
+
const evEntry = callerEntry(req, deps, match.decl.id);
|
|
320
|
+
const readHead = (id) => readOwnerCell(evEntry, id, () => evFact.sessionStorage.headOf(id));
|
|
326
321
|
const readOwner = async (id) => (await readHead(id))?.owner;
|
|
327
322
|
const watch = evFact.watch;
|
|
328
323
|
const evSession = safeDecode(match.params.sessionId);
|
|
@@ -359,7 +354,7 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
359
354
|
return;
|
|
360
355
|
}
|
|
361
356
|
sse.sseOwnerLookups++;
|
|
362
|
-
const admissionP = readHead(evSession).then(async (head) => (head
|
|
357
|
+
const admissionP = readHead(evSession).then(async (head) => (!sessionRowPresent(head) ? undefined : { head, verdict: await judgeSessionRow(evEntry, evFact.sessionStorage, evSession, head) }));
|
|
363
358
|
void admissionP.catch(() => undefined).then(() => { sse.sseOwnerLookups--; });
|
|
364
359
|
let stallTimer;
|
|
365
360
|
let admission;
|
|
@@ -383,15 +378,15 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
383
378
|
}
|
|
384
379
|
if (admission === undefined) {
|
|
385
380
|
cleanup();
|
|
386
|
-
|
|
381
|
+
refuse(evEntry, res, "missing");
|
|
387
382
|
return;
|
|
388
383
|
}
|
|
389
|
-
if (
|
|
384
|
+
if (deliverVerdict(evEntry, res, admission.verdict) === undefined) {
|
|
390
385
|
cleanup();
|
|
391
386
|
return;
|
|
392
387
|
}
|
|
393
388
|
leafOfAdmittedHead(admission.head);
|
|
394
|
-
const owner = admission.
|
|
389
|
+
const owner = admission.head.owner;
|
|
395
390
|
const q = new URLSearchParams(match.search);
|
|
396
391
|
const lastLeafId = q.get("lastLeafId");
|
|
397
392
|
let first = true;
|
|
@@ -520,16 +515,15 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
520
515
|
sendError(res, 400, "request.path_malformed", "session id segment is not valid percent-encoding");
|
|
521
516
|
return;
|
|
522
517
|
}
|
|
523
|
-
|
|
524
|
-
|
|
518
|
+
const entry = enter(req, res, deps, match.decl.id);
|
|
519
|
+
if (entry === undefined)
|
|
525
520
|
return;
|
|
526
|
-
}
|
|
527
521
|
const auditFact = facts.sessionAuditView(deps);
|
|
528
522
|
if (!auditFact.available) {
|
|
529
523
|
sendError(res, 501, "capability.memory_engine_required", "memory provenance and erasure are not available on this deployment — they require a wired memory engine (MEMORY_ENGINE=on) whose backend owns the engine control plane (controlPlaneRoot); the file memory backend does, the pg/mysql memory backends do not (their control plane would land on a replica's local disk)");
|
|
530
524
|
return;
|
|
531
525
|
}
|
|
532
|
-
if ((await readOwnedSessionView(auditFact.sessionAudit, sessionId)) === undefined)
|
|
526
|
+
if ((await readOwnedSessionView(entry, auditFact.sessionAudit, sessionId)) === undefined)
|
|
533
527
|
return;
|
|
534
528
|
const faces = deps.memoryCompliance;
|
|
535
529
|
if (faces === undefined) {
|
|
@@ -563,7 +557,9 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
563
557
|
sendJson(res, 200, await faces.erase(input));
|
|
564
558
|
}
|
|
565
559
|
catch (err) {
|
|
566
|
-
if (
|
|
560
|
+
if (sentMemoryFaceFault(res, err, { kind: "session_owner", face: "erase", withheld }))
|
|
561
|
+
return;
|
|
562
|
+
if (sentMemoryComplianceFailure(res, err, { kind: "session_owner", face: "erase", withheld }, deps.logger))
|
|
567
563
|
return;
|
|
568
564
|
deps.logger?.warn?.("session_memory_erase_failed", { sessionId, err: String(err) });
|
|
569
565
|
sendError(res, 500, "internal.error", "session memory erasure failed");
|
|
@@ -578,16 +574,15 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
578
574
|
sendError(res, 400, "request.path_malformed", "session id segment is not valid percent-encoding");
|
|
579
575
|
return;
|
|
580
576
|
}
|
|
581
|
-
|
|
582
|
-
|
|
577
|
+
const entry = enter(req, res, deps, match.decl.id);
|
|
578
|
+
if (entry === undefined)
|
|
583
579
|
return;
|
|
584
|
-
}
|
|
585
580
|
const auditFact = facts.sessionAuditView(deps);
|
|
586
581
|
if (!auditFact.available) {
|
|
587
582
|
sendError(res, 501, "capability.memory_engine_required", "session memory status is not available on this deployment — it requires a wired memory engine (MEMORY_ENGINE=on) whose backend owns the engine control plane (controlPlaneRoot); the file memory backend does, the pg/mysql memory backends do not (their control plane would land on a replica's local disk)");
|
|
588
583
|
return;
|
|
589
584
|
}
|
|
590
|
-
if ((await readOwnedSessionView(auditFact.sessionAudit, sessionId)) === undefined)
|
|
585
|
+
if ((await readOwnedSessionView(entry, auditFact.sessionAudit, sessionId)) === undefined)
|
|
591
586
|
return;
|
|
592
587
|
const face = deps.sessionMemoryStatus;
|
|
593
588
|
if (face === undefined) {
|
|
@@ -631,7 +626,7 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
631
626
|
});
|
|
632
627
|
}
|
|
633
628
|
catch (err) {
|
|
634
|
-
if (
|
|
629
|
+
if (sentMemoryFaceFault(res, err, { kind: "session_owner", face: "status", withheld: (message) => deps.logger?.warn?.("session_memory_status_refused", { sessionId, err: message }) }))
|
|
635
630
|
return;
|
|
636
631
|
deps.logger?.warn?.("session_memory_status_failed", { sessionId, err: String(err) });
|
|
637
632
|
sendError(res, 500, "internal.error", "session memory status read failed");
|
|
@@ -646,7 +641,8 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
646
641
|
sendError(res, 501, "capability.session_store_required", "the session audit view requires a durable session store (DB_BACKEND=mysql|pg|local)");
|
|
647
642
|
return;
|
|
648
643
|
}
|
|
649
|
-
const
|
|
644
|
+
const viewEntry = callerEntry(req, deps, match.decl.id);
|
|
645
|
+
const owned = await readOwnedSessionView(viewEntry, auditFact.sessionAudit, match.params.sessionId, { reader: viewEntry.caller.subject ?? null });
|
|
650
646
|
if (owned === undefined)
|
|
651
647
|
return;
|
|
652
648
|
if (!Array.isArray(owned.messages)) {
|
|
@@ -709,13 +705,14 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
709
705
|
}
|
|
710
706
|
const store = rowFact.sessionStorage;
|
|
711
707
|
const sessionId = match.params.sessionId;
|
|
708
|
+
const patchEntry = callerEntry(req, deps, match.decl.id);
|
|
712
709
|
const head = await store.headOf(sessionId);
|
|
713
710
|
if (head === undefined) {
|
|
714
|
-
|
|
711
|
+
refuse(patchEntry, res, "missing");
|
|
715
712
|
return;
|
|
716
713
|
}
|
|
717
714
|
const face = sessionFaceOfHead(sessionId, head);
|
|
718
|
-
if (
|
|
715
|
+
if ((await admitSessionRow(patchEntry, res, store, sessionId, face)) === undefined)
|
|
719
716
|
return;
|
|
720
717
|
leafOfAdmittedHead(head);
|
|
721
718
|
const read = readSessionRowPatch(await readJson(req));
|
|
@@ -735,7 +732,7 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
735
732
|
sendError(res, 409, "conflict.session_mirror", "this session is a read-only mirror of a session whose writer is elsewhere — it cannot be renamed or pinned here; fork it (forkPath) to continue here; nothing was written", { forkPath: forkPathOf(sessionId) });
|
|
736
733
|
return;
|
|
737
734
|
case "absent":
|
|
738
|
-
|
|
735
|
+
refuse(patchEntry, res, "missing");
|
|
739
736
|
return;
|
|
740
737
|
default: {
|
|
741
738
|
const unknownOutcome = outcome;
|
|
@@ -743,6 +740,78 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
743
740
|
}
|
|
744
741
|
}
|
|
745
742
|
}
|
|
743
|
+
if (match.decl.id === "session-rewind-files") {
|
|
744
|
+
if (ctx.helpers.rateLimited(req, res))
|
|
745
|
+
return;
|
|
746
|
+
const rewind = facts.sessionRewindFiles(deps);
|
|
747
|
+
if (!rewind.available) {
|
|
748
|
+
switch (rewind.why) {
|
|
749
|
+
case "file_history_store_absent":
|
|
750
|
+
sendError(res, 501, "capability.snapshot_store_required", "rewinding a session's files is not available on this deployment: no file-history store is wired, so no file history was ever recorded");
|
|
751
|
+
return;
|
|
752
|
+
case "session_head_face_absent":
|
|
753
|
+
sendError(res, 501, "capability.session_store_required", "rewinding a session's files requires a durable session store (DB_BACKEND=mysql|pg|local)");
|
|
754
|
+
return;
|
|
755
|
+
case "resume_anchor_store_absent":
|
|
756
|
+
sendError(res, 501, "capability.session_store_required", "rewinding a session's files is not available on this deployment: no session-store backend holds the rewind anchor map");
|
|
757
|
+
return;
|
|
758
|
+
case "execution_lane_handless":
|
|
759
|
+
sendError(res, 501, "capability.unavailable", "rewinding a session's files is not available on this deployment: it mounts no execution environment (REMOTE_EXEC=none), so a session has no working tree to rewind");
|
|
760
|
+
return;
|
|
761
|
+
case "workspace_rebuilt_per_task":
|
|
762
|
+
sendError(res, 501, "capability.unavailable", "rewinding a session's files is not available on this deployment: each task's workspace is rebuilt when the task starts (fresh, or restored from a saved copy that a rewind cannot yet write into), so a rewind would not reach the files the next task works on");
|
|
763
|
+
return;
|
|
764
|
+
case "session_store_shared":
|
|
765
|
+
sendError(res, 501, "capability.unavailable", "rewinding a session's files is not available on this deployment yet: its session store is shared by several server instances (DB_BACKEND=mysql|pg), and a rewind cannot yet keep runs started on another instance off the session while it restores");
|
|
766
|
+
return;
|
|
767
|
+
default:
|
|
768
|
+
return assertNever(rewind.why);
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
const { anchors, sessionStorage } = rewind;
|
|
772
|
+
const sessionId = safeDecode(match.params.sessionId);
|
|
773
|
+
if (sessionId === null || !isUuidShape(sessionId)) {
|
|
774
|
+
sendError(res, 400, "request.id_invalid", "invalid session id (must be a canonical uuid)");
|
|
775
|
+
return;
|
|
776
|
+
}
|
|
777
|
+
const rewindEntry = enter(req, res, deps, match.decl.id);
|
|
778
|
+
if (rewindEntry === undefined)
|
|
779
|
+
return;
|
|
780
|
+
const owned = await admitSessionById(rewindEntry, res, sessionStorage, sessionId);
|
|
781
|
+
if (owned === undefined)
|
|
782
|
+
return;
|
|
783
|
+
const sessionOwner = owned.row.owner;
|
|
784
|
+
leafOfAdmittedHead(owned.row);
|
|
785
|
+
const read = readRewindFilesBody(await readJson(req));
|
|
786
|
+
if (read.kind === "refused") {
|
|
787
|
+
sendError(res, 400, read.errorCode, read.message);
|
|
788
|
+
return;
|
|
789
|
+
}
|
|
790
|
+
const execution = await resolveExecutionContext(deps, { kind: "continuation", root: sessionId, principal: sessionOwner === null || sessionOwner === undefined ? undefined : personOf(sessionOwner) });
|
|
791
|
+
if (execution.lane === "host" && (await presentHostWorkspaceOf(deps.perSessionCwd?.get(sessionId))) === undefined) {
|
|
792
|
+
sendError(res, 409, "conflict.session_workspace_unknown", "this server process does not know a working directory for this session that it can rewind into (no prompt carrying its cwd has been submitted since the server started, or the directory that prompt named no longer exists), so nothing was rewound; submit a prompt with its cwd first, then rewind");
|
|
793
|
+
return;
|
|
794
|
+
}
|
|
795
|
+
const entryId = await resolveHistoryAnchor("rewindFilesTo", anchors, anchorReaderOf(req, deps, rewindEntry.caller), sessionId, read.to, sessionOwner, "to");
|
|
796
|
+
const activeTaskId = await deps.runStore?.getActiveTaskId(sessionId);
|
|
797
|
+
if (activeTaskId) {
|
|
798
|
+
sendError(res, 409, "conflict.session_active_run", `session has an active run (${activeTaskId}); its files cannot be rewound under it — wait for that run to end (or cancel it), then rewind`, { activeTaskId });
|
|
799
|
+
return;
|
|
800
|
+
}
|
|
801
|
+
let result;
|
|
802
|
+
try {
|
|
803
|
+
result = await rewindFilesUnderPurpose(deps.runner, { sessionId, to: entryId, dryRun: read.dryRun });
|
|
804
|
+
}
|
|
805
|
+
catch (e) {
|
|
806
|
+
const answer = engineRefusalAnswerOf(e);
|
|
807
|
+
if (answer === undefined)
|
|
808
|
+
throw e;
|
|
809
|
+
sendError(res, answer.status, answer.refusal.errorCode, answer.refusal.message);
|
|
810
|
+
return;
|
|
811
|
+
}
|
|
812
|
+
sendJson(res, 200, buildRewindFilesReply(result));
|
|
813
|
+
return;
|
|
814
|
+
}
|
|
746
815
|
{
|
|
747
816
|
if (match.decl.id === "session-fork") {
|
|
748
817
|
const forkFact = facts.sessionFork(deps);
|
|
@@ -751,27 +820,19 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
751
820
|
return;
|
|
752
821
|
}
|
|
753
822
|
const fork = forkFact.sessionStorage.fork.bind(forkFact.sessionStorage);
|
|
754
|
-
const
|
|
755
|
-
|
|
756
|
-
if (!scope.fleetWide && scope.gateOwner === null) {
|
|
757
|
-
sendUnauthorized(res, "identity");
|
|
823
|
+
const forkEntry = enter(req, res, deps, match.decl.id);
|
|
824
|
+
if (forkEntry === undefined)
|
|
758
825
|
return;
|
|
759
|
-
}
|
|
760
826
|
const sourceId = safeDecode(match.params.sessionId);
|
|
761
827
|
if (sourceId === null || !isUuidShape(sourceId)) {
|
|
762
828
|
sendError(res, 400, "request.id_invalid", "invalid session id (must be a canonical uuid)");
|
|
763
829
|
return;
|
|
764
830
|
}
|
|
765
|
-
const
|
|
766
|
-
if (
|
|
767
|
-
sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
|
|
831
|
+
const forkAdmitted = await admitSessionById(forkEntry, res, forkFact.sessionStorage, sourceId);
|
|
832
|
+
if (forkAdmitted === undefined)
|
|
768
833
|
return;
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
|
|
772
|
-
return;
|
|
773
|
-
}
|
|
774
|
-
const newOwner = scope.fleetWide ? (owner ?? null) : scope.gateOwner;
|
|
834
|
+
const owner = forkAdmitted.row.owner;
|
|
835
|
+
const newOwner = admittedAsFleet(forkEntry, forkAdmitted) ? owner : (forkEntry.caller.subject ?? null);
|
|
775
836
|
const keyed = readForkTarget(await readJson(req), sourceId);
|
|
776
837
|
if (keyed.kind === "refused") {
|
|
777
838
|
sendError(res, 400, keyed.errorCode, keyed.message, keyed.facts);
|
|
@@ -780,7 +841,7 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
780
841
|
if (keyed.kind === "none") {
|
|
781
842
|
const newId = await fork(sourceId, newOwner);
|
|
782
843
|
if (newId === null) {
|
|
783
|
-
|
|
844
|
+
refuse(forkEntry, res, "missing");
|
|
784
845
|
return;
|
|
785
846
|
}
|
|
786
847
|
sendJson(res, 200, { sessionId: newId });
|
|
@@ -803,7 +864,7 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
803
864
|
throw e;
|
|
804
865
|
}
|
|
805
866
|
if (outcome === null) {
|
|
806
|
-
|
|
867
|
+
refuse(forkEntry, res, "missing");
|
|
807
868
|
return;
|
|
808
869
|
}
|
|
809
870
|
switch (outcome.outcome) {
|
|
@@ -815,7 +876,7 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
815
876
|
return;
|
|
816
877
|
case "occupied":
|
|
817
878
|
if (!outcome.sameOwner) {
|
|
818
|
-
|
|
879
|
+
refuse(forkEntry, res, "not_visible");
|
|
819
880
|
return;
|
|
820
881
|
}
|
|
821
882
|
sendError(res, 409, "conflict.fork_id_taken", "forkId already names another session of yours (a different fork, or a session that was not created by this fork request) — pick a new forkId and forkNonce; nothing was forked", { forkId: keyed.forkId });
|
|
@@ -834,36 +895,27 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
834
895
|
return;
|
|
835
896
|
}
|
|
836
897
|
const purge = deleteFact.purge;
|
|
837
|
-
const
|
|
838
|
-
|
|
839
|
-
if (!scope.fleetWide && scope.gateOwner === null) {
|
|
840
|
-
sendUnauthorized(res, "identity");
|
|
898
|
+
const deleteEntry = enter(req, res, deps, match.decl.id);
|
|
899
|
+
if (deleteEntry === undefined)
|
|
841
900
|
return;
|
|
842
|
-
}
|
|
843
901
|
const sessionId = safeDecode(match.params.sessionId);
|
|
844
902
|
if (sessionId === null || !isUuidShape(sessionId)) {
|
|
845
903
|
sendError(res, 400, "request.id_invalid", "invalid session id (must be a canonical uuid)");
|
|
846
904
|
return;
|
|
847
905
|
}
|
|
848
|
-
const
|
|
849
|
-
if (
|
|
850
|
-
sendJson(res, 200, { deleted: false });
|
|
906
|
+
const deleteAdmitted = await admitSessionById(deleteEntry, res, deleteFact.gateStore, sessionId);
|
|
907
|
+
if (deleteAdmitted === undefined)
|
|
851
908
|
return;
|
|
852
|
-
|
|
853
|
-
if (!scope.fleetWide && owner !== scope.gateOwner && !legacyUnownedSessionOk(deps.config, sessionCallerOf(req, deps), await sessionOwnerCellOf(deleteFact.sessionStorage, sessionId, owner))) {
|
|
854
|
-
sendJson(res, 200, { deleted: false });
|
|
855
|
-
return;
|
|
856
|
-
}
|
|
857
|
-
const activeTaskId = await deps.runStore?.getActiveTaskId(sessionId);
|
|
858
|
-
if (activeTaskId) {
|
|
859
|
-
sendError(res, 409, "conflict.session_active_run", "session has an active run; cancel it before deleting", { activeTaskId });
|
|
860
|
-
return;
|
|
861
|
-
}
|
|
909
|
+
const owner = deleteAdmitted.row.owner;
|
|
862
910
|
const result = await purge(sessionId, owner);
|
|
863
911
|
if ("active" in result) {
|
|
864
912
|
sendError(res, 409, "conflict.session_active_run", "session has an active run; cancel it before deleting", { activeTaskId: result.active });
|
|
865
913
|
return;
|
|
866
914
|
}
|
|
915
|
+
if ("inProgress" in result) {
|
|
916
|
+
sendError(res, 409, "conflict.session_deleting", "the delete of this session is already under way in another request, which finishes it — the session already reads as gone and this request returns without waiting; a retry answers {deleted:false} once the delete has finished");
|
|
917
|
+
return;
|
|
918
|
+
}
|
|
867
919
|
if ("childrenAlive" in result) {
|
|
868
920
|
sendError(res, 409, "conflict.session_children_alive", "this session still has background agents running where this replica cannot stop them (on another replica, for example), so the delete was refused before anything was deleted — `remaining` lists their ids (the same ids `GET /v1/agents/roster` shows); retry the delete once they finish, or stop them where they run", { remaining: result.childrenAlive.map((handle) => rosterAgentId({ handle })) });
|
|
869
921
|
return;
|
|
@@ -880,31 +932,23 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
880
932
|
return;
|
|
881
933
|
}
|
|
882
934
|
const store = policyFact.policyStore;
|
|
883
|
-
const
|
|
884
|
-
|
|
885
|
-
if (deps.config.requirePrincipal && principal === undefined) {
|
|
886
|
-
sendUnauthorized(res, "identity");
|
|
935
|
+
const policyEntry = enter(req, res, deps, match.decl.id);
|
|
936
|
+
if (policyEntry === undefined)
|
|
887
937
|
return;
|
|
888
|
-
}
|
|
889
938
|
const sessionId = safeDecode(match.params.sessionId);
|
|
890
939
|
if (sessionId === null || !isUuidShape(sessionId)) {
|
|
891
940
|
sendError(res, 400, "request.id_invalid", "invalid session id (must be a canonical uuid)");
|
|
892
941
|
return;
|
|
893
942
|
}
|
|
894
|
-
const
|
|
895
|
-
if (
|
|
896
|
-
sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
|
|
943
|
+
const policyAdmitted = await admitSessionById(policyEntry, res, policyFact.sessionStorage, sessionId);
|
|
944
|
+
if (policyAdmitted === undefined)
|
|
897
945
|
return;
|
|
898
|
-
|
|
946
|
+
const owner = policyAdmitted.row.owner;
|
|
899
947
|
if (owner === null) {
|
|
900
|
-
sendError(res, 409, "conflict.session_ownerless", "this session has no recorded owner, so its rules can be neither read nor changed through this route; rules already stored for it keep applying to the runs of the principal they were stored under.
|
|
901
|
-
return;
|
|
902
|
-
}
|
|
903
|
-
const operator = explicitOperatorOk(principal, deps.config);
|
|
904
|
-
if (!operator && owner !== (principal ?? null)) {
|
|
905
|
-
sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
|
|
948
|
+
sendError(res, 409, "conflict.session_ownerless", "this session has no recorded owner, so its rules can be neither read nor changed through this route; rules already stored for it keep applying to the runs of the principal they were stored under. Way out: delete the session (DELETE /v1/sessions/:id), which removes its rules with it");
|
|
906
949
|
return;
|
|
907
950
|
}
|
|
951
|
+
const operator = policyAdmitted.quals.has("operator");
|
|
908
952
|
const target = owner;
|
|
909
953
|
if (match.decl.id === "session-policy-get") {
|
|
910
954
|
try {
|
|
@@ -967,6 +1011,7 @@ export const SESSIONS_ROUTES = [
|
|
|
967
1011
|
{ id: "session-memory-status", pattern: /^\/v1\/sessions\/(?<sessionId>[^/]+)\/memory-status$/, label: "/v1/sessions/:id/memory-status", methods: ["GET"] },
|
|
968
1012
|
{ id: "session-workspace", pattern: /^\/v1\/sessions\/(?<sessionId>[^/]+)\/workspace(?:\/(?<key>[^/]+)(?:\/(?<sub>tree|file|archive))?)?$/, label: "/v1/sessions/:id/workspace", methods: ["GET"] },
|
|
969
1013
|
{ id: "session-detail", pattern: /^\/v1\/sessions\/(?<sessionId>[^/]+)$/, label: "/v1/sessions/:id", methods: ["GET"] },
|
|
1014
|
+
{ id: "session-rewind-files", pattern: /^\/v1\/sessions\/(?<sessionId>[^/]+)\/rewind-files$/, label: "/v1/sessions/:id/rewind-files", credentialGated: ["POST"], methods: ["POST"] },
|
|
970
1015
|
{ id: "session-patch", pattern: /^\/v1\/sessions\/(?<sessionId>[^/]+)$/, label: "/v1/sessions/:id", methods: ["PATCH"] },
|
|
971
1016
|
{ id: "session-delete", pattern: /^\/v1\/sessions\/(?<sessionId>[^/]+)$/, label: "/v1/sessions/:id", methods: ["DELETE"] },
|
|
972
1017
|
];
|
|
@@ -989,4 +1034,24 @@ function readForkTarget(raw, sourceId) {
|
|
|
989
1034
|
return { kind: "keyed", forkId, forkNonce };
|
|
990
1035
|
}
|
|
991
1036
|
const FORK_NONCE_MAX_CHARS = 255;
|
|
1037
|
+
const REWIND_TO_MAX_CHARS = 255;
|
|
1038
|
+
function readRewindFilesBody(raw) {
|
|
1039
|
+
const shape = {
|
|
1040
|
+
kind: "refused",
|
|
1041
|
+
errorCode: "request.body_shape",
|
|
1042
|
+
message: 'the rewind-files body must be an object { to: string, dryRun?: boolean } — acceptPartialRestore is not accepted: the engine\'s out-of-run rewind has no partial-restore policy, so a partial restore answers 200 with restore.outcome "partial" and every refused or failed file on its ledger',
|
|
1043
|
+
};
|
|
1044
|
+
if (raw === null || typeof raw !== "object" || Array.isArray(raw))
|
|
1045
|
+
return shape;
|
|
1046
|
+
const keys = Object.keys(raw);
|
|
1047
|
+
if (!keys.includes("to") || keys.some((k) => k !== "to" && k !== "dryRun"))
|
|
1048
|
+
return shape;
|
|
1049
|
+
const { to, dryRun } = raw;
|
|
1050
|
+
if (typeof to !== "string" || to.length === 0 || to.length > REWIND_TO_MAX_CHARS) {
|
|
1051
|
+
return { kind: "refused", errorCode: "request.field_invalid", message: `to must be a non-empty string of at most ${REWIND_TO_MAX_CHARS} characters: the handle of a prompt in this session (the handle rewindFilesTo takes)` };
|
|
1052
|
+
}
|
|
1053
|
+
if (dryRun !== undefined && typeof dryRun !== "boolean")
|
|
1054
|
+
return { kind: "refused", errorCode: "request.field_invalid", message: "dryRun must be a boolean when given" };
|
|
1055
|
+
return { kind: "read", to, dryRun: dryRun === true };
|
|
1056
|
+
}
|
|
992
1057
|
//# sourceMappingURL=sessions.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isSharedMemoryDocumentPath, SHARED_MEMORY_READ_CAP_BYTES, SharedMemoryStoreError } from "@sema-agent/core";
|
|
2
2
|
import { sendJson, sendError } from "../send.js";
|
|
3
|
-
import {
|
|
3
|
+
import { gatedPerson, sendUnauthorized } from "../principal-gate.js";
|
|
4
4
|
import { assertNever } from "../route-ctx.js";
|
|
5
5
|
import * as facts from "../../capability-facts.js";
|
|
6
6
|
const RETRY_AFTER_SEC = 10;
|
|
@@ -10,14 +10,14 @@ function refuseStore(res) {
|
|
|
10
10
|
}
|
|
11
11
|
function refuseUnavailable(res, message) {
|
|
12
12
|
res.setHeader("retry-after", String(RETRY_AFTER_SEC));
|
|
13
|
-
|
|
14
|
-
retryAfterSec: RETRY_AFTER_SEC
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
if (message === undefined)
|
|
14
|
+
sendError(res, 503, "memory.shared_unavailable", "shared memory stores are unavailable", { retryAfterSec: RETRY_AFTER_SEC });
|
|
15
|
+
else
|
|
16
|
+
sendError(res, 503, "memory.shared_unavailable", `shared memory stores are unavailable: ${message}`, { retryAfterSec: RETRY_AFTER_SEC });
|
|
17
17
|
}
|
|
18
18
|
async function bindSnapshot(req, res, ctx) {
|
|
19
19
|
const { deps } = ctx;
|
|
20
|
-
const principal =
|
|
20
|
+
const principal = gatedPerson(req, deps.config);
|
|
21
21
|
if (!principal && deps.config.requirePrincipal === true) {
|
|
22
22
|
sendUnauthorized(res, "identity");
|
|
23
23
|
return undefined;
|
|
@@ -7,7 +7,7 @@ import { redactSecrets } from "../../trace/redact.js";
|
|
|
7
7
|
import { errorCodeOf } from "../../observability/err-text.js";
|
|
8
8
|
import { admitProviderEcho, redactErrorMessage } from "../../observability/run-terminal.js";
|
|
9
9
|
import { sendJson, sendError, sendHttpError, msg } from "../send.js";
|
|
10
|
-
import {
|
|
10
|
+
import { gatedPerson, sendPrincipalRefusal } from "../principal-gate.js";
|
|
11
11
|
import { assertNever } from "../route-ctx.js";
|
|
12
12
|
export function isCorePreflightValidationError(err) {
|
|
13
13
|
return errorCodeOf(err) === "config.unknown_role";
|
|
@@ -38,7 +38,7 @@ export async function handleSideQuery(req, res, match, ctx) {
|
|
|
38
38
|
try {
|
|
39
39
|
if (rateLimited(req, res) || quotaExceeded(req, res) || (await leaseDenied(req, res)))
|
|
40
40
|
return;
|
|
41
|
-
const principal =
|
|
41
|
+
const principal = gatedPerson(req, deps.config);
|
|
42
42
|
if (deps.config.requirePrincipal && !principal) {
|
|
43
43
|
sendPrincipalRefusal(res, req, deps.config);
|
|
44
44
|
return;
|