@sema-agent/server 7.147.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 +1039 -24
- package/README.md +20 -7
- package/README.zh-CN.md +14 -8
- package/USAGE.md +380 -163
- package/deploy/sema-up/README.md +16 -5
- package/deploy/sema-up/chart/templates/NOTES.txt +1 -1
- package/deploy/sema-up/chart/templates/_helpers.tpl +20 -4
- package/deploy/sema-up/chart/values.yaml +3 -2
- package/deploy/sema-up/cluster-up.sh +74 -176
- package/deploy/sema-up/kube-up.sh +29 -49
- package/deploy/sema-up/lib/chart-run.sh +23 -0
- package/deploy/sema-up/lib/dataroot.sh +3 -3
- package/deploy/sema-up/lib/health.sh +62 -13
- package/deploy/sema-up/lib/helm-values-cluster.py +18 -0
- package/deploy/sema-up/lib/helm-values-kube.py +35 -0
- package/deploy/sema-up/lib/regcred.py +8 -0
- package/deploy/sema-up/lib/remote/helm-install.sh +3 -0
- package/deploy/sema-up/lib/remote/image-import.sh +6 -0
- package/deploy/sema-up/lib/remote/machine-precheck.sh +11 -0
- package/deploy/sema-up/lib/remote/region-probe.sh +3 -0
- package/deploy/sema-up/lib/remote/stack-ready.sh +26 -0
- package/deploy/sema-up/lib/remote/vxlan-guard.sh +8 -0
- package/deploy/sema-up/lib/render-stack.py +17 -0
- package/deploy/sema-up/lib/shell-text.sh +87 -0
- package/deploy/sema-up/lib/usage-flags.txt +10 -0
- package/deploy/sema-up/lib/usage-head.txt +1 -0
- package/deploy/sema-up/lib/usage-tail.txt +13 -0
- package/deploy/sema-up/preflight.sh +10 -8
- package/deploy/sema-up/sema-up.sh +14 -39
- package/deploy/sema-up/smoke.sh +7 -6
- package/deploy/sema-up/stack/compose.dataroot.yaml +3 -0
- package/deploy/sema-up/stack/compose.yaml +13 -1
- package/deploy/sema-up/stack/sema-stack-cluster.yaml +21 -0
- package/dist/adoption/plan.d.ts +24 -0
- package/dist/adoption/plan.js +53 -1
- package/dist/adoption/runner.d.ts +10 -1
- package/dist/adoption/runner.js +36 -16
- package/dist/adoption/wire.d.ts +3 -3
- package/dist/approval-card.d.ts +28 -30
- 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 +13 -11
- package/dist/approval.js +3 -3
- package/dist/audit.d.ts +10 -3
- package/dist/audit.js +15 -7
- package/dist/auth-bridge.d.ts +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 +5 -2
- package/dist/bench/s1/run-firm.js +6 -5
- package/dist/bind-host.d.ts +25 -0
- package/dist/bind-host.js +25 -0
- package/dist/boot/adoption.d.ts +3 -0
- package/dist/boot/adoption.js +1 -0
- package/dist/boot/deployment-mods.d.ts +1 -1
- package/dist/boot/execution-env.d.ts +17 -7
- package/dist/boot/execution-env.js +37 -31
- package/dist/boot/exit-boundary.d.ts +2 -2
- package/dist/boot/exit-boundary.js +6 -5
- package/dist/boot/fatal-exit.d.ts +3 -5
- package/dist/boot/fatal-exit.js +2 -2
- package/dist/boot/leader.d.ts +15 -0
- package/dist/boot/leader.js +17 -15
- package/dist/boot/memory-consolidation.d.ts +37 -29
- package/dist/boot/memory-consolidation.js +11 -5
- package/dist/boot/org-memory.js +1 -1
- package/dist/boot/parked-revive-gate.js +2 -2
- package/dist/boot/reapers.d.ts +4 -3
- package/dist/boot/reapers.js +19 -16
- package/dist/boot/resolve-spec.d.ts +5 -3
- package/dist/boot/resolve-spec.js +55 -67
- package/dist/boot/retention-lane.d.ts +4 -4
- package/dist/boot/retention-lane.js +2 -2
- package/dist/boot/runner-deps.d.ts +28 -7
- package/dist/boot/runner-deps.js +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 +16 -7
- package/dist/boot/session-faces.js +114 -94
- package/dist/boot/shutdown.d.ts +5 -4
- package/dist/boot/shutdown.js +6 -4
- package/dist/boot/stage-01-config.js +9 -1
- package/dist/boot/stage-02-web-admin-pull.d.ts +1 -0
- package/dist/boot/stage-02-web-admin-pull.js +6 -1
- package/dist/boot/stage-03-store-backend.d.ts +3 -0
- package/dist/boot/stage-03-store-backend.js +4 -3
- package/dist/boot/stage-04-stores.d.ts +2 -0
- package/dist/boot/stage-04-stores.js +2 -2
- package/dist/boot/stage-05-execution-env.d.ts +7 -3
- package/dist/boot/stage-05-execution-env.js +2 -2
- package/dist/boot/stage-06-runners.d.ts +10 -12
- package/dist/boot/stage-06-runners.js +23 -15
- package/dist/boot/stage-07-capability-layer.d.ts +11 -8
- package/dist/boot/stage-07-capability-layer.js +5 -3
- package/dist/boot/stage-08-reapers.d.ts +11 -8
- package/dist/boot/stage-08-reapers.js +3 -3
- package/dist/boot/stage-09-leader.d.ts +12 -15
- package/dist/boot/stage-09-leader.js +12 -4
- package/dist/boot/stage-10-http-server.d.ts +12 -15
- package/dist/boot/stage-10-http-server.js +7 -4
- package/dist/boot/store-evidence.d.ts +20 -0
- package/dist/boot/store-evidence.js +13 -0
- package/dist/boot/stores.d.ts +3 -0
- package/dist/boot/stores.js +21 -10
- package/dist/boot/task-list-lane.d.ts +4 -4
- package/dist/boot/web-admin.d.ts +4 -2
- package/dist/boot/web-admin.js +55 -35
- package/dist/boot/webfetch-summarize-lane.d.ts +1 -1
- package/dist/boot-reclaim.d.ts +3 -1
- package/dist/boot-reclaim.js +1 -1
- package/dist/brain.d.ts +7 -18
- package/dist/brain.js +5 -17
- package/dist/budget.js +6 -6
- package/dist/capabilities/center-plugins.d.ts +7 -1
- package/dist/capabilities/center-plugins.js +32 -10
- package/dist/capabilities/center-wiring.js +1 -1
- package/dist/capabilities/composite-members.d.ts +2 -2
- package/dist/capabilities/composite-members.js +2 -2
- package/dist/capabilities/repo-tools.d.ts +2 -0
- package/dist/capabilities/repo-tools.js +14 -12
- package/dist/capabilities/scenarios.d.ts +6 -15
- package/dist/capabilities/scenarios.js +11 -16
- package/dist/capabilities/skills.d.ts +1 -1
- package/dist/capabilities/tool-defer.d.ts +1 -1
- package/dist/capability-facts.d.ts +38 -11
- package/dist/capability-facts.js +47 -8
- 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 +7 -3
- package/dist/config-catalog.d.ts +16 -1
- package/dist/config-catalog.js +62 -56
- package/dist/config-dir-trust.d.ts +37 -4
- package/dist/config-dir-trust.js +88 -44
- package/dist/config-invariants.d.ts +42 -3
- package/dist/config-invariants.js +69 -5
- package/dist/config-lkg.d.ts +23 -1
- package/dist/config-lkg.js +17 -3
- package/dist/config-provider.d.ts +9 -9
- package/dist/config-provider.js +25 -110
- package/dist/config-pull-failure.d.ts +50 -0
- package/dist/config-pull-failure.js +48 -0
- package/dist/config-types.d.ts +26 -17
- package/dist/config.d.ts +8 -16
- package/dist/config.js +113 -47
- package/dist/delegated-session-owner.d.ts +1 -1
- package/dist/deleted-session-ids.d.ts +3 -2
- package/dist/deployment-governance.d.ts +3 -3
- package/dist/deployment-shape.d.ts +30 -4
- package/dist/deployment-shape.js +7 -0
- package/dist/egress-redirect.d.ts +25 -7
- package/dist/egress-redirect.js +20 -2
- package/dist/elicitation.d.ts +6 -5
- package/dist/elicitation.js +23 -22
- package/dist/engine-identity.d.ts +28 -0
- package/dist/engine-identity.js +10 -0
- package/dist/entry-problems.d.ts +5 -7
- package/dist/entry-problems.js +1 -1
- package/dist/env-facts.js +2 -1
- package/dist/env-witness.d.ts +7 -0
- package/dist/env-witness.js +16 -0
- package/dist/execution-lane-caps.d.ts +5 -18
- package/dist/execution-lane-caps.js +0 -22
- package/dist/execution-placement.d.ts +58 -18
- package/dist/execution-placement.js +41 -2
- package/dist/field-conflict.d.ts +7 -11
- package/dist/field-conflict.js +3 -3
- package/dist/file-history-capture.d.ts +3 -3
- package/dist/file-history-disclosure.js +1 -0
- package/dist/fleet/fleet-bus.d.ts +21 -3
- package/dist/fleet/fleet-bus.js +35 -25
- package/dist/fleet/fleet-reconciler.js +2 -2
- package/dist/fleet/serving-lease.js +3 -3
- package/dist/fleet-client.js +3 -3
- package/dist/fleet-lease.d.ts +0 -1
- package/dist/fleet-lease.js +4 -5
- package/dist/history-anchor.d.ts +23 -3
- package/dist/history-anchor.js +24 -4
- package/dist/hitl-delivery.d.ts +90 -0
- package/dist/hitl-delivery.js +98 -0
- package/dist/hooks/classic-stations.d.ts +8 -11
- package/dist/hooks/classic-stations.js +0 -7
- package/dist/hooks/hook-llm.d.ts +5 -1
- package/dist/hooks/hook-llm.js +24 -15
- package/dist/hooks/hook-runner.d.ts +67 -57
- package/dist/hooks/hook-runner.js +260 -186
- 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 +3 -3
- package/dist/http/approval-sweeps.js +54 -30
- package/dist/http/caller-trust.d.ts +8 -10
- package/dist/http/caller-trust.js +1 -2
- package/dist/http/claim-heartbeat.d.ts +49 -0
- package/dist/http/claim-heartbeat.js +46 -0
- package/dist/http/claimed-run.d.ts +4 -3
- package/dist/http/dispatch.d.ts +8 -1
- package/dist/http/dispatch.js +76 -30
- package/dist/http/durable-run-leg.d.ts +3 -3
- package/dist/http/durable-run-leg.js +17 -12
- package/dist/http/execution-context.d.ts +17 -43
- package/dist/http/execution-context.js +7 -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 +4 -2
- package/dist/http/memory-face-fault-reply.d.ts +67 -0
- package/dist/http/memory-face-fault-reply.js +71 -0
- package/dist/http/memory-store-refusal-reply.d.ts +1 -1
- package/dist/http/memory-store-refusal-reply.js +3 -0
- package/dist/http/owner-access.d.ts +391 -67
- package/dist/http/owner-access.js +371 -35
- package/dist/http/principal-gate.d.ts +24 -81
- package/dist/http/principal-gate.js +24 -68
- package/dist/http/refusal-body.d.ts +35 -2
- package/dist/http/refusal-body.js +34 -0
- package/dist/http/request-guards.d.ts +9 -13
- package/dist/http/request-guards.js +34 -68
- package/dist/http/resume-composition.d.ts +37 -0
- package/dist/http/resume-composition.js +18 -0
- package/dist/http/resume-ctx-read.d.ts +35 -12
- package/dist/http/resume-ctx-read.js +25 -6
- package/dist/http/resume-legs.d.ts +21 -18
- package/dist/http/resume-legs.js +189 -129
- package/dist/http/retired-skill-manifest.d.ts +1 -1
- package/dist/http/route-ctx.d.ts +25 -32
- 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 +70 -65
- 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 +15 -18
- package/dist/http/routes/config-catalog.js +2 -2
- package/dist/http/routes/devices.d.ts +3 -3
- package/dist/http/routes/devices.js +4 -4
- package/dist/http/routes/diagnostics.d.ts +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 +2 -0
- package/dist/http/routes/memory-origin.js +7 -8
- package/dist/http/routes/memory-policy.js +17 -12
- package/dist/http/routes/notify-wake.js +10 -19
- package/dist/http/routes/observability.js +3 -3
- package/dist/http/routes/principal-inbox.d.ts +1 -1
- package/dist/http/routes/principal-inbox.js +2 -2
- package/dist/http/routes/projects.d.ts +1 -1
- package/dist/http/routes/projects.js +3 -2
- package/dist/http/routes/retention-ops.js +6 -9
- package/dist/http/routes/rules.js +20 -5
- package/dist/http/routes/run-memory-capture.d.ts +2 -2
- package/dist/http/routes/run-memory-capture.js +6 -12
- package/dist/http/routes/run-permission-mode.d.ts +2 -2
- package/dist/http/routes/run-permission-mode.js +10 -17
- package/dist/http/routes/runs.js +146 -231
- 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 +21 -20
- package/dist/http/routes/sessions-list.d.ts +3 -3
- package/dist/http/routes/sessions-list.js +9 -9
- package/dist/http/routes/sessions.js +87 -124
- package/dist/http/routes/shared-memory.js +6 -6
- package/dist/http/routes/side-query.js +2 -2
- package/dist/http/routes/tasks.js +136 -120
- 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 +39 -40
- package/dist/http/server.js +36 -11
- package/dist/http/sse-log.d.ts +17 -10
- package/dist/http/sse-log.js +7 -7
- package/dist/http/stored-body-replay.d.ts +12 -0
- package/dist/http/stored-body-replay.js +2 -2
- package/dist/http/submit-ctx.d.ts +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 +4 -3
- package/dist/identity-source.d.ts +36 -5
- package/dist/identity-source.js +27 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/key-resolver.d.ts +32 -0
- package/dist/key-resolver.js +23 -9
- package/dist/leader/diffup.js +2 -1
- package/dist/leader/endpoint.d.ts +26 -5
- package/dist/leader/endpoint.js +154 -14
- package/dist/leader/fanout.d.ts +3 -0
- package/dist/leader/fanout.js +78 -63
- package/dist/leader/leader.d.ts +16 -0
- package/dist/leader/leader.js +43 -3
- package/dist/leader/merge.d.ts +9 -1
- package/dist/leader/merge.js +16 -1
- package/dist/leader/repair-wire.js +1 -1
- package/dist/leader/wire.d.ts +36 -3
- package/dist/leader/wire.js +59 -18
- package/dist/lsp-evict.d.ts +6 -4
- package/dist/lsp-evict.js +2 -3
- package/dist/memory-operator-faces.d.ts +5 -4
- package/dist/memory-operator-faces.js +1 -1
- package/dist/memory-scope.d.ts +29 -2
- package/dist/memory-scope.js +64 -15
- package/dist/memory-store-refusal.d.ts +5 -2
- package/dist/memory-sync-client.d.ts +3 -2
- package/dist/memory-sync-client.js +6 -3
- package/dist/model-compat.d.ts +17 -8
- package/dist/model-compat.js +6 -2
- 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 +35 -16
- package/dist/model-entry-refusal.js +40 -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 +23 -14
- package/dist/namespaced-rule-name.js +8 -11
- package/dist/net-address.d.ts +1 -1
- package/dist/observability/corrupt-read-seat.d.ts +4 -4
- package/dist/observability/corrupt-read-seat.js +5 -3
- package/dist/observability/fail-open.d.ts +58 -38
- package/dist/observability/fail-open.js +60 -38
- package/dist/observability/logger.d.ts +22 -1
- package/dist/observability/logger.js +89 -12
- package/dist/observability/metrics.js +3 -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/orchestration/hardened-vm-runner.d.ts +1 -0
- package/dist/orchestration/hardened-vm-runner.js +11 -5
- package/dist/orchestration/hardened-vm-worker-runner.d.ts +0 -14
- package/dist/orchestration/hardened-vm-worker-runner.js +5 -0
- package/dist/orchestration/hardened-vm-worker.js +2 -1
- package/dist/orchestration/workflow-completion-inbox.d.ts +3 -3
- package/dist/orchestration/workflow-completion-inbox.js +3 -2
- package/dist/org-delivery-gate.d.ts +5 -4
- package/dist/org-delivery-gate.js +7 -6
- 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 +67 -5
- package/dist/parked-decide.js +127 -5
- 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 +18 -7
- package/dist/plugins/approval-ask-store-file.js +37 -14
- package/dist/plugins/approval-ask-store-memory.d.ts +12 -4
- package/dist/plugins/approval-ask-store-memory.js +24 -10
- package/dist/plugins/approval-ask-store-sql.d.ts +39 -20
- package/dist/plugins/approval-ask-store-sql.js +41 -10
- 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 +2 -0
- package/dist/plugins/blob-backend.js +9 -6
- package/dist/plugins/caching-session-store.d.ts +13 -1
- package/dist/plugins/caching-session-store.js +43 -4
- package/dist/plugins/checkpoint-index-columns.d.ts +32 -5
- package/dist/plugins/checkpoint-index-columns.js +36 -1
- package/dist/plugins/checkpoint-store-face.d.ts +83 -10
- package/dist/plugins/checkpoint-store-face.js +18 -1
- package/dist/plugins/device-store-sql.js +1 -0
- package/dist/plugins/ensure-index.d.ts +13 -1
- package/dist/plugins/ensure-index.js +154 -21
- package/dist/plugins/ensure-schema-lock-policy.d.ts +0 -15
- package/dist/plugins/ensure-schema-lock-policy.js +3 -2
- package/dist/plugins/file-run-store.d.ts +63 -23
- package/dist/plugins/file-run-store.js +138 -83
- package/dist/plugins/host-platform.d.ts +24 -3
- package/dist/plugins/host-platform.js +15 -1
- package/dist/plugins/image-bake-store-sql.js +2 -0
- package/dist/plugins/imported-layer-root-retirement.d.ts +2 -2
- package/dist/plugins/k8s-pod-reaper.d.ts +1 -3
- package/dist/plugins/k8s-pod-reaper.js +0 -1
- package/dist/plugins/leader-run-store-sql.d.ts +22 -0
- package/dist/plugins/leader-run-store-sql.js +34 -4
- package/dist/plugins/local-checkpoint-store.d.ts +58 -23
- package/dist/plugins/local-checkpoint-store.js +195 -76
- package/dist/plugins/local-data-dir-modes-m39.js +2 -1
- 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 +4 -2
- package/dist/plugins/local-engine-high-water.js +4 -1
- package/dist/plugins/local-session-store.d.ts +358 -125
- package/dist/plugins/local-session-store.js +824 -251
- package/dist/plugins/local-session-window.d.ts +3 -2
- package/dist/plugins/local-session-window.js +3 -2
- package/dist/plugins/local-sidecar-quarantine.js +3 -2
- package/dist/plugins/local-task-attachment-store.d.ts +18 -1
- package/dist/plugins/local-task-attachment-store.js +22 -1
- package/dist/plugins/memory-embedder.js +9 -7
- package/dist/plugins/memory-engine-pg.d.ts +3 -2
- package/dist/plugins/memory-engine-pg.js +14 -5
- package/dist/plugins/memory-engine-sql-apply.d.ts +8 -4
- package/dist/plugins/memory-engine-sql-apply.js +6 -8
- package/dist/plugins/memory-engine-tidb.d.ts +4 -2
- package/dist/plugins/memory-engine-tidb.js +11 -2
- package/dist/plugins/memory-optout-grant-store-sql.d.ts +1 -1
- package/dist/plugins/memory-optout-grant-store-sql.js +3 -3
- package/dist/plugins/memory-run-store.d.ts +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 +186 -45
- package/dist/plugins/one-time-migrations.js +442 -119
- package/dist/plugins/org-delivery-quota-store.js +2 -1
- package/dist/plugins/permission-rule-store-file.d.ts +3 -3
- 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 +1 -31
- package/dist/plugins/pg-pool.js +16 -7
- package/dist/plugins/remote-env-e2b.d.ts +7 -25
- package/dist/plugins/remote-env-e2b.js +34 -25
- package/dist/plugins/remote-env-host.d.ts +2 -9
- package/dist/plugins/remote-env-host.js +34 -22
- package/dist/plugins/remote-env-k8s.d.ts +40 -45
- package/dist/plugins/remote-env-k8s.js +107 -58
- package/dist/plugins/remote-env-local-docker.d.ts +148 -14
- package/dist/plugins/remote-env-local-docker.js +367 -72
- package/dist/plugins/remote-scratchpad.js +4 -0
- package/dist/plugins/retention-deployment.d.ts +49 -17
- package/dist/plugins/retention-deployment.js +39 -8
- package/dist/plugins/run-preview-m45.d.ts +11 -0
- package/dist/plugins/run-preview-m45.js +19 -0
- package/dist/plugins/run-store-sql.d.ts +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 -9
- package/dist/plugins/schema-consistency.js +212 -11
- 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 +9 -0
- package/dist/plugins/schema-ensure-legs.js +1 -1
- package/dist/plugins/schema-indexes.js +3 -0
- package/dist/plugins/schema-live-columns.d.ts +14 -5
- package/dist/plugins/schema-live-columns.js +10 -10
- package/dist/plugins/send-user-file.js +2 -1
- package/dist/plugins/session-birth.d.ts +37 -0
- package/dist/plugins/session-birth.js +38 -0
- package/dist/plugins/session-epoch-anchor.d.ts +40 -12
- package/dist/plugins/session-epoch-anchor.js +33 -11
- package/dist/plugins/session-ext-table.d.ts +27 -3
- package/dist/plugins/session-ext-table.js +19 -6
- package/dist/plugins/session-fork.d.ts +15 -1
- package/dist/plugins/session-fork.js +3 -0
- package/dist/plugins/session-ownership.d.ts +1 -1
- package/dist/plugins/session-placement.d.ts +22 -16
- package/dist/plugins/session-placement.js +15 -12
- package/dist/plugins/session-row-sql.d.ts +12 -0
- package/dist/plugins/session-row-sql.js +3 -3
- package/dist/plugins/session-run-rollup.d.ts +29 -0
- package/dist/plugins/session-run-rollup.js +40 -0
- package/dist/plugins/session-store-sql.d.ts +38 -12
- package/dist/plugins/session-store-sql.js +130 -30
- package/dist/plugins/session-withdraw-sql.d.ts +36 -0
- package/dist/plugins/session-withdraw-sql.js +42 -0
- package/dist/plugins/shared-memory-store-sql.d.ts +0 -69
- package/dist/plugins/shared-memory-store-sql.js +2 -1
- package/dist/plugins/shell-sentinel-owner-m48.d.ts +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/sql-driver.d.ts +1 -1
- package/dist/plugins/sql-driver.js +2 -1
- package/dist/plugins/sql-errors.d.ts +32 -5
- package/dist/plugins/sql-errors.js +55 -7
- package/dist/plugins/sql-json-column.d.ts +8 -7
- package/dist/plugins/sql-json-column.js +10 -6
- package/dist/plugins/store-backend.d.ts +84 -15
- package/dist/plugins/store-backend.js +186 -55
- package/dist/plugins/store-contracts.d.ts +90 -30
- package/dist/plugins/store-contracts.js +22 -1
- package/dist/plugins/store-fault.d.ts +28 -2
- package/dist/plugins/store-fault.js +20 -2
- package/dist/plugins/task-attachment-store.d.ts +15 -3
- package/dist/plugins/task-attachment-store.js +22 -9
- package/dist/plugins/tidb-pool.js +23 -8
- 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/request-declaration-refusal.d.ts +35 -12
- package/dist/request-declaration-refusal.js +21 -9
- package/dist/request-form.d.ts +58 -0
- package/dist/request-form.js +72 -0
- package/dist/request-image-urls.d.ts +8 -2
- package/dist/request-image-urls.js +2 -1
- package/dist/request-images.d.ts +20 -0
- package/dist/request-images.js +59 -0
- package/dist/request-key-closure.d.ts +6 -7
- package/dist/request-key-closure.js +15 -2
- package/dist/resource-suspend.d.ts +7 -16
- package/dist/resource-suspend.js +1 -1
- package/dist/retired-name-host-notice.d.ts +21 -0
- package/dist/retired-name-host-notice.js +12 -0
- package/dist/rule-entry-list.d.ts +2 -2
- package/dist/rule-entry-list.js +3 -4
- package/dist/rule-issue-reading.d.ts +58 -0
- package/dist/rule-issue-reading.js +14 -0
- package/dist/rules-consent.d.ts +5 -3
- package/dist/rules-consent.js +1 -0
- package/dist/run-acceptance.d.ts +3 -1
- package/dist/run-acceptance.js +3 -0
- package/dist/run-local.d.ts +14 -6
- package/dist/run-local.js +92 -80
- package/dist/run-stale-default.d.ts +7 -0
- package/dist/run-stale-default.js +2 -0
- package/dist/runs.d.ts +26 -15
- package/dist/runs.js +39 -27
- package/dist/runtime-caps-resolver.d.ts +21 -6
- package/dist/runtime-caps-resolver.js +17 -4
- package/dist/runtime-governance.d.ts +2 -2
- package/dist/runtime-governance.js +5 -3
- package/dist/sealed-key-layout.d.ts +12 -5
- package/dist/sealed-key-layout.js +5 -0
- package/dist/sealed-key.d.ts +12 -2
- package/dist/sealed-key.js +115 -27
- package/dist/security.d.ts +128 -158
- package/dist/security.js +163 -59
- package/dist/sema-config-dir.d.ts +20 -0
- package/dist/sema-config-dir.js +25 -0
- package/dist/server-secret-env.d.ts +21 -5
- package/dist/server-secret-env.js +14 -4
- 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 +5 -5
- package/dist/session-error-wire.js +1 -1
- package/dist/session-incarnation.d.ts +52 -5
- package/dist/session-incarnation.js +19 -2
- package/dist/session-policy-wire.d.ts +6 -3
- package/dist/session-policy-wire.js +11 -1
- package/dist/session-resident-background.d.ts +0 -71
- package/dist/session-resident-background.js +4 -3
- package/dist/session-row.d.ts +2 -1
- package/dist/session-rules-seat.d.ts +12 -0
- package/dist/session-rules-seat.js +19 -0
- package/dist/session-titler.d.ts +7 -15
- package/dist/session-titler.js +1 -1
- package/dist/spec-fields.d.ts +57 -3
- package/dist/spec-fields.js +72 -51
- package/dist/store-posture.d.ts +136 -20
- package/dist/store-posture.js +188 -3
- package/dist/stored-request-hooks-m20.js +2 -2
- package/dist/stores-sql/background-agent-store-sql.d.ts +11 -2
- package/dist/stores-sql/background-agent-store-sql.js +73 -20
- package/dist/stores-sql/checkpoint-store-sql.d.ts +33 -28
- package/dist/stores-sql/checkpoint-store-sql.js +75 -44
- package/dist/stores-sql/mailbox-store-sql.d.ts +7 -4
- package/dist/stores-sql/mailbox-store-sql.js +31 -32
- package/dist/stores-sql/pg-session-storage.d.ts +7 -5
- package/dist/stores-sql/pg-session-storage.js +54 -46
- package/dist/stores-sql/retention-store-sql.d.ts +87 -19
- package/dist/stores-sql/retention-store-sql.js +92 -27
- package/dist/stores-sql/session-policy-store-sql.d.ts +32 -10
- package/dist/stores-sql/session-policy-store-sql.js +44 -36
- package/dist/stores-sql/session-write-hooks.d.ts +12 -6
- package/dist/stores-sql/tidb-session-storage.d.ts +4 -4
- package/dist/stores-sql/tidb-session-storage.js +13 -8
- package/dist/stores-sql/tidb-session-store.d.ts +36 -17
- package/dist/stores-sql/tidb-session-store.js +69 -39
- package/dist/stores-sql/windowed-session-storage.d.ts +5 -0
- package/dist/stores-sql/windowed-session-storage.js +9 -0
- package/dist/submission-exit.d.ts +50 -0
- package/dist/submission-exit.js +108 -0
- package/dist/task-a2a.d.ts +1 -1
- package/dist/task-a2a.js +3 -3
- package/dist/task-cwd.d.ts +20 -0
- package/dist/task-cwd.js +8 -0
- package/dist/task-mcp.d.ts +1 -1
- package/dist/task-mcp.js +3 -3
- package/dist/task-settings.d.ts +14 -10
- package/dist/task-settings.js +18 -7
- package/dist/terminal.d.ts +25 -43
- package/dist/terminal.js +31 -11
- package/dist/tool-approval.d.ts +131 -129
- package/dist/tool-approval.js +189 -193
- package/dist/trace/core-keyset-guard.d.ts +13 -6
- package/dist/trace/core-vocab-wire.d.ts +95 -0
- package/dist/trace/core-vocab-wire.js +15 -0
- package/dist/trace/exit-seat.d.ts +30 -4
- package/dist/trace/exit-seat.js +40 -36
- package/dist/trace/extension-call-face.d.ts +3 -2
- package/dist/trace/extension-call-face.js +3 -1
- package/dist/trace/ledger-events.d.ts +4 -7
- package/dist/trace/ledger-sink.d.ts +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 +55 -42
- package/dist/trace/project.js +52 -19
- package/dist/trace/redact.d.ts +123 -27
- package/dist/trace/redact.js +880 -260
- package/dist/trace/self-minted-wire.d.ts +487 -19
- package/dist/trace/self-minted-wire.js +172 -23
- package/dist/trace/wire-projection-faces.d.ts +5 -6
- package/dist/trace/wire-projection-faces.js +2 -2
- package/dist/upstream-body.d.ts +23 -0
- package/dist/upstream-body.js +16 -0
- package/dist/url-refusal.d.ts +3 -3
- package/dist/url-refusal.js +11 -4
- package/dist/user-authored-text.d.ts +1 -1
- package/dist/user-input-ledger.d.ts +7 -8
- package/dist/user-input-ledger.js +1 -1
- package/dist/web-admin-client/apply-effective.d.ts +6 -3
- package/dist/web-admin-client/apply-effective.js +13 -16
- package/dist/web-admin-client/apply-ledger.d.ts +16 -7
- package/dist/web-admin-client/apply-ledger.js +5 -2
- package/dist/web-admin-client/center-request.d.ts +2 -2
- package/dist/web-admin-client/center-request.js +15 -15
- package/dist/web-admin-client/effective-keys.d.ts +1 -1
- package/dist/web-admin-client/effective-keys.js +1 -1
- package/dist/web-admin-client/entry-metadata.d.ts +8 -0
- package/dist/web-admin-client/entry-metadata.js +13 -0
- package/dist/web-admin-client/http-client.d.ts +1 -1
- package/dist/web-admin-client/http-client.js +23 -4
- package/dist/web-admin-client/mcp-revocation.d.ts +1 -1
- package/dist/web-admin-client/mcp-revocation.js +2 -1
- package/dist/web-admin-client/read-warnings.d.ts +1 -0
- package/dist/web-admin-client/read-warnings.js +1 -0
- package/dist/web-admin-client/restart-signal.js +8 -4
- package/dist/web-admin-client/skills-mcp.d.ts +2 -2
- package/dist/web-admin-client/types.d.ts +1 -2
- package/dist/workspace-space.d.ts +3 -2
- package/docs/DEVICE-EXECUTOR-PROTOCOL.md +4 -4
- package/package.json +6 -3
- package/scripts/drain-check-local.mjs +118 -147
- package/scripts/drain-check.mysql.sql +22 -2
- package/scripts/drain-check.pg.sql +22 -2
- package/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,28 +1,29 @@
|
|
|
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
24
|
import { forkPathOf, resolveExecutionContext } from "../execution-context.js";
|
|
24
25
|
import { executionPlacementView } from "../../execution-placement.js";
|
|
25
|
-
import { resolveHistoryAnchor } from "../../history-anchor.js";
|
|
26
|
+
import { anchorReaderOf, resolveHistoryAnchor } from "../../history-anchor.js";
|
|
26
27
|
import { engineRefusalAnswerOf } from "../engine-refusal.js";
|
|
27
28
|
import { buildRewindFilesReply } from "../rewind-files-reply.js";
|
|
28
29
|
import { ForkTargetUnsettledError, forkKeyOf } from "../../plugins/session-fork.js";
|
|
@@ -45,11 +46,11 @@ export function createSessionsLocal() {
|
|
|
45
46
|
memoryStatusCache: new Map(),
|
|
46
47
|
};
|
|
47
48
|
}
|
|
48
|
-
async function lastLegMcpFor(deps, sessionId,
|
|
49
|
+
async function lastLegMcpFor(deps, sessionId, entry) {
|
|
49
50
|
let timer;
|
|
50
51
|
try {
|
|
51
52
|
return await Promise.race([
|
|
52
|
-
readLastLegMcp(deps, sessionId,
|
|
53
|
+
readLastLegMcp(deps, sessionId, entry),
|
|
53
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); }),
|
|
54
55
|
]);
|
|
55
56
|
}
|
|
@@ -62,14 +63,14 @@ async function lastLegMcpFor(deps, sessionId, caller) {
|
|
|
62
63
|
clearTimeout(timer);
|
|
63
64
|
}
|
|
64
65
|
}
|
|
65
|
-
async function readLastLegMcp(deps, sessionId,
|
|
66
|
+
async function readLastLegMcp(deps, sessionId, entry) {
|
|
66
67
|
const runStore = deps.runStore;
|
|
67
68
|
if (!runStore || sessionId === null)
|
|
68
69
|
return undefined;
|
|
69
70
|
const latest = await runStore.latestRunForSession(sessionId);
|
|
70
71
|
if (latest === undefined)
|
|
71
72
|
return undefined;
|
|
72
|
-
if (!
|
|
73
|
+
if (!seesRun(entry, latest.owner))
|
|
73
74
|
return undefined;
|
|
74
75
|
const events = await runStore.getEvents(latest.taskId, 0);
|
|
75
76
|
for (let i = events.length - 1; i >= 0; i--) {
|
|
@@ -85,16 +86,12 @@ async function readLastLegMcp(deps, sessionId, caller) {
|
|
|
85
86
|
}
|
|
86
87
|
export async function handleSessions(req, res, match, ctx) {
|
|
87
88
|
const { deps } = ctx;
|
|
88
|
-
const { readJson, safeDecode
|
|
89
|
-
const readOwnedSessionView = async (sessionAudit, sessionId, readOpts) => {
|
|
89
|
+
const { readJson, safeDecode } = ctx.helpers;
|
|
90
|
+
const readOwnedSessionView = async (entry, sessionAudit, sessionId, readOpts) => {
|
|
90
91
|
const headOf = headReadOf(deps.sessionStorage);
|
|
91
92
|
if (headOf !== undefined) {
|
|
92
|
-
const
|
|
93
|
-
if (
|
|
94
|
-
sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
|
|
95
|
-
return undefined;
|
|
96
|
-
}
|
|
97
|
-
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)
|
|
98
95
|
return undefined;
|
|
99
96
|
}
|
|
100
97
|
let audit;
|
|
@@ -106,11 +103,7 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
106
103
|
throw e;
|
|
107
104
|
throw new Error(`session view read failed before ownership could be established: ${e instanceof Error ? e.message : String(e)}`, { cause: e });
|
|
108
105
|
}
|
|
109
|
-
if (
|
|
110
|
-
sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
|
|
111
|
-
return undefined;
|
|
112
|
-
}
|
|
113
|
-
if (!sessionOwnerOk(req, res, await sessionOwnerCellOf(deps.sessionStorage, sessionId, audit.owner)))
|
|
106
|
+
if ((await admitSessionRow(entry, res, deps.sessionStorage, sessionId, audit)) === undefined)
|
|
114
107
|
return undefined;
|
|
115
108
|
return audit;
|
|
116
109
|
};
|
|
@@ -118,7 +111,7 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
118
111
|
const { mcpStatusCache, a2aStatusCache } = ctx.local.sessions;
|
|
119
112
|
{
|
|
120
113
|
if (match.decl.id === "session-init") {
|
|
121
|
-
const principal =
|
|
114
|
+
const principal = gatedSubject(req, deps.config);
|
|
122
115
|
if (deps.config.requirePrincipal && !principal) {
|
|
123
116
|
sendPrincipalRefusal(res, req, deps.config);
|
|
124
117
|
return;
|
|
@@ -133,7 +126,7 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
133
126
|
}
|
|
134
127
|
{
|
|
135
128
|
if (match.decl.id === "session-settings") {
|
|
136
|
-
const principal =
|
|
129
|
+
const principal = gatedSubject(req, deps.config);
|
|
137
130
|
if (deps.config.requirePrincipal && !principal) {
|
|
138
131
|
sendPrincipalRefusal(res, req, deps.config);
|
|
139
132
|
return;
|
|
@@ -153,13 +146,13 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
153
146
|
}
|
|
154
147
|
{
|
|
155
148
|
if (match.decl.id === "session-mcp") {
|
|
156
|
-
const caller =
|
|
157
|
-
const principal = caller.
|
|
149
|
+
const caller = callerOf(req, deps);
|
|
150
|
+
const principal = caller.subject === undefined ? undefined : personOf(caller.subject);
|
|
158
151
|
if (deps.config.requirePrincipal && !principal) {
|
|
159
152
|
sendPrincipalRefusal(res, req, deps.config);
|
|
160
153
|
return;
|
|
161
154
|
}
|
|
162
|
-
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));
|
|
163
156
|
const ledgerHalf = lastLegMcp === undefined ? {} : { lastLegMcp };
|
|
164
157
|
let scenarioName;
|
|
165
158
|
try {
|
|
@@ -215,7 +208,7 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
215
208
|
}
|
|
216
209
|
{
|
|
217
210
|
if (match.decl.id === "session-a2a") {
|
|
218
|
-
const principal =
|
|
211
|
+
const principal = gatedPerson(req, deps.config);
|
|
219
212
|
if (deps.config.requirePrincipal && !principal) {
|
|
220
213
|
sendPrincipalRefusal(res, req, deps.config);
|
|
221
214
|
return;
|
|
@@ -279,14 +272,12 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
279
272
|
sendError(res, 400, "request.path_malformed", "session id segment is not valid percent-encoding");
|
|
280
273
|
return;
|
|
281
274
|
}
|
|
282
|
-
const
|
|
283
|
-
|
|
284
|
-
|
|
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)
|
|
285
279
|
return;
|
|
286
|
-
|
|
287
|
-
if (!sessionOwnerOk(req, res, await sessionOwnerCellOf(deps.sessionStorage, headSession, head.owner)))
|
|
288
|
-
return;
|
|
289
|
-
const leafId = leafOfAdmittedHead(head);
|
|
280
|
+
const leafId = leafOfAdmittedHead(admittedHead.row);
|
|
290
281
|
const etag = `"${leafId ?? "empty"}"`;
|
|
291
282
|
if (req.headers["if-none-match"] === etag) {
|
|
292
283
|
res.writeHead(304, { etag }).end();
|
|
@@ -309,14 +300,12 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
309
300
|
sendError(res, 400, "request.path_malformed", "session id segment is not valid percent-encoding");
|
|
310
301
|
return;
|
|
311
302
|
}
|
|
312
|
-
const
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
}
|
|
317
|
-
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)
|
|
318
307
|
return;
|
|
319
|
-
sendJson(res, 200, executionPlacementView(
|
|
308
|
+
sendJson(res, 200, executionPlacementView(admittedPlacement.row.cell));
|
|
320
309
|
return;
|
|
321
310
|
}
|
|
322
311
|
}
|
|
@@ -327,7 +316,8 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
327
316
|
sendError(res, 501, "capability.session_store_required", "session events require a durable session store (DB_BACKEND=mysql|pg|local)");
|
|
328
317
|
return;
|
|
329
318
|
}
|
|
330
|
-
const
|
|
319
|
+
const evEntry = callerEntry(req, deps, match.decl.id);
|
|
320
|
+
const readHead = (id) => readOwnerCell(evEntry, id, () => evFact.sessionStorage.headOf(id));
|
|
331
321
|
const readOwner = async (id) => (await readHead(id))?.owner;
|
|
332
322
|
const watch = evFact.watch;
|
|
333
323
|
const evSession = safeDecode(match.params.sessionId);
|
|
@@ -364,7 +354,7 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
364
354
|
return;
|
|
365
355
|
}
|
|
366
356
|
sse.sseOwnerLookups++;
|
|
367
|
-
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) }));
|
|
368
358
|
void admissionP.catch(() => undefined).then(() => { sse.sseOwnerLookups--; });
|
|
369
359
|
let stallTimer;
|
|
370
360
|
let admission;
|
|
@@ -388,15 +378,15 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
388
378
|
}
|
|
389
379
|
if (admission === undefined) {
|
|
390
380
|
cleanup();
|
|
391
|
-
|
|
381
|
+
refuse(evEntry, res, "missing");
|
|
392
382
|
return;
|
|
393
383
|
}
|
|
394
|
-
if (
|
|
384
|
+
if (deliverVerdict(evEntry, res, admission.verdict) === undefined) {
|
|
395
385
|
cleanup();
|
|
396
386
|
return;
|
|
397
387
|
}
|
|
398
388
|
leafOfAdmittedHead(admission.head);
|
|
399
|
-
const owner = admission.
|
|
389
|
+
const owner = admission.head.owner;
|
|
400
390
|
const q = new URLSearchParams(match.search);
|
|
401
391
|
const lastLeafId = q.get("lastLeafId");
|
|
402
392
|
let first = true;
|
|
@@ -525,16 +515,15 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
525
515
|
sendError(res, 400, "request.path_malformed", "session id segment is not valid percent-encoding");
|
|
526
516
|
return;
|
|
527
517
|
}
|
|
528
|
-
|
|
529
|
-
|
|
518
|
+
const entry = enter(req, res, deps, match.decl.id);
|
|
519
|
+
if (entry === undefined)
|
|
530
520
|
return;
|
|
531
|
-
}
|
|
532
521
|
const auditFact = facts.sessionAuditView(deps);
|
|
533
522
|
if (!auditFact.available) {
|
|
534
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)");
|
|
535
524
|
return;
|
|
536
525
|
}
|
|
537
|
-
if ((await readOwnedSessionView(auditFact.sessionAudit, sessionId)) === undefined)
|
|
526
|
+
if ((await readOwnedSessionView(entry, auditFact.sessionAudit, sessionId)) === undefined)
|
|
538
527
|
return;
|
|
539
528
|
const faces = deps.memoryCompliance;
|
|
540
529
|
if (faces === undefined) {
|
|
@@ -568,7 +557,9 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
568
557
|
sendJson(res, 200, await faces.erase(input));
|
|
569
558
|
}
|
|
570
559
|
catch (err) {
|
|
571
|
-
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))
|
|
572
563
|
return;
|
|
573
564
|
deps.logger?.warn?.("session_memory_erase_failed", { sessionId, err: String(err) });
|
|
574
565
|
sendError(res, 500, "internal.error", "session memory erasure failed");
|
|
@@ -583,16 +574,15 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
583
574
|
sendError(res, 400, "request.path_malformed", "session id segment is not valid percent-encoding");
|
|
584
575
|
return;
|
|
585
576
|
}
|
|
586
|
-
|
|
587
|
-
|
|
577
|
+
const entry = enter(req, res, deps, match.decl.id);
|
|
578
|
+
if (entry === undefined)
|
|
588
579
|
return;
|
|
589
|
-
}
|
|
590
580
|
const auditFact = facts.sessionAuditView(deps);
|
|
591
581
|
if (!auditFact.available) {
|
|
592
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)");
|
|
593
583
|
return;
|
|
594
584
|
}
|
|
595
|
-
if ((await readOwnedSessionView(auditFact.sessionAudit, sessionId)) === undefined)
|
|
585
|
+
if ((await readOwnedSessionView(entry, auditFact.sessionAudit, sessionId)) === undefined)
|
|
596
586
|
return;
|
|
597
587
|
const face = deps.sessionMemoryStatus;
|
|
598
588
|
if (face === undefined) {
|
|
@@ -636,7 +626,7 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
636
626
|
});
|
|
637
627
|
}
|
|
638
628
|
catch (err) {
|
|
639
|
-
if (
|
|
629
|
+
if (sentMemoryFaceFault(res, err, { kind: "session_owner", face: "status", withheld: (message) => deps.logger?.warn?.("session_memory_status_refused", { sessionId, err: message }) }))
|
|
640
630
|
return;
|
|
641
631
|
deps.logger?.warn?.("session_memory_status_failed", { sessionId, err: String(err) });
|
|
642
632
|
sendError(res, 500, "internal.error", "session memory status read failed");
|
|
@@ -651,7 +641,8 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
651
641
|
sendError(res, 501, "capability.session_store_required", "the session audit view requires a durable session store (DB_BACKEND=mysql|pg|local)");
|
|
652
642
|
return;
|
|
653
643
|
}
|
|
654
|
-
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 });
|
|
655
646
|
if (owned === undefined)
|
|
656
647
|
return;
|
|
657
648
|
if (!Array.isArray(owned.messages)) {
|
|
@@ -714,13 +705,14 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
714
705
|
}
|
|
715
706
|
const store = rowFact.sessionStorage;
|
|
716
707
|
const sessionId = match.params.sessionId;
|
|
708
|
+
const patchEntry = callerEntry(req, deps, match.decl.id);
|
|
717
709
|
const head = await store.headOf(sessionId);
|
|
718
710
|
if (head === undefined) {
|
|
719
|
-
|
|
711
|
+
refuse(patchEntry, res, "missing");
|
|
720
712
|
return;
|
|
721
713
|
}
|
|
722
714
|
const face = sessionFaceOfHead(sessionId, head);
|
|
723
|
-
if (
|
|
715
|
+
if ((await admitSessionRow(patchEntry, res, store, sessionId, face)) === undefined)
|
|
724
716
|
return;
|
|
725
717
|
leafOfAdmittedHead(head);
|
|
726
718
|
const read = readSessionRowPatch(await readJson(req));
|
|
@@ -740,7 +732,7 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
740
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) });
|
|
741
733
|
return;
|
|
742
734
|
case "absent":
|
|
743
|
-
|
|
735
|
+
refuse(patchEntry, res, "missing");
|
|
744
736
|
return;
|
|
745
737
|
default: {
|
|
746
738
|
const unknownOutcome = outcome;
|
|
@@ -782,29 +774,25 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
782
774
|
sendError(res, 400, "request.id_invalid", "invalid session id (must be a canonical uuid)");
|
|
783
775
|
return;
|
|
784
776
|
}
|
|
785
|
-
const
|
|
786
|
-
if (
|
|
787
|
-
sendPrincipalRefusal(res, req, deps.config);
|
|
777
|
+
const rewindEntry = enter(req, res, deps, match.decl.id);
|
|
778
|
+
if (rewindEntry === undefined)
|
|
788
779
|
return;
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
if (owned === undefined) {
|
|
792
|
-
sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
|
|
780
|
+
const owned = await admitSessionById(rewindEntry, res, sessionStorage, sessionId);
|
|
781
|
+
if (owned === undefined)
|
|
793
782
|
return;
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
leafOfAdmittedHead(owned.head);
|
|
783
|
+
const sessionOwner = owned.row.owner;
|
|
784
|
+
leafOfAdmittedHead(owned.row);
|
|
797
785
|
const read = readRewindFilesBody(await readJson(req));
|
|
798
786
|
if (read.kind === "refused") {
|
|
799
787
|
sendError(res, 400, read.errorCode, read.message);
|
|
800
788
|
return;
|
|
801
789
|
}
|
|
802
|
-
const execution = await resolveExecutionContext(deps, { kind: "continuation", root: sessionId, principal: sessionOwner
|
|
790
|
+
const execution = await resolveExecutionContext(deps, { kind: "continuation", root: sessionId, principal: sessionOwner === null || sessionOwner === undefined ? undefined : personOf(sessionOwner) });
|
|
803
791
|
if (execution.lane === "host" && (await presentHostWorkspaceOf(deps.perSessionCwd?.get(sessionId))) === undefined) {
|
|
804
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");
|
|
805
793
|
return;
|
|
806
794
|
}
|
|
807
|
-
const entryId = await resolveHistoryAnchor("rewindFilesTo", anchors, sessionId, read.to, sessionOwner, "to");
|
|
795
|
+
const entryId = await resolveHistoryAnchor("rewindFilesTo", anchors, anchorReaderOf(req, deps, rewindEntry.caller), sessionId, read.to, sessionOwner, "to");
|
|
808
796
|
const activeTaskId = await deps.runStore?.getActiveTaskId(sessionId);
|
|
809
797
|
if (activeTaskId) {
|
|
810
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 });
|
|
@@ -832,27 +820,19 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
832
820
|
return;
|
|
833
821
|
}
|
|
834
822
|
const fork = forkFact.sessionStorage.fork.bind(forkFact.sessionStorage);
|
|
835
|
-
const
|
|
836
|
-
|
|
837
|
-
if (!scope.fleetWide && scope.gateOwner === null) {
|
|
838
|
-
sendUnauthorized(res, "identity");
|
|
823
|
+
const forkEntry = enter(req, res, deps, match.decl.id);
|
|
824
|
+
if (forkEntry === undefined)
|
|
839
825
|
return;
|
|
840
|
-
}
|
|
841
826
|
const sourceId = safeDecode(match.params.sessionId);
|
|
842
827
|
if (sourceId === null || !isUuidShape(sourceId)) {
|
|
843
828
|
sendError(res, 400, "request.id_invalid", "invalid session id (must be a canonical uuid)");
|
|
844
829
|
return;
|
|
845
830
|
}
|
|
846
|
-
const
|
|
847
|
-
if (
|
|
848
|
-
sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
|
|
831
|
+
const forkAdmitted = await admitSessionById(forkEntry, res, forkFact.sessionStorage, sourceId);
|
|
832
|
+
if (forkAdmitted === undefined)
|
|
849
833
|
return;
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
|
|
853
|
-
return;
|
|
854
|
-
}
|
|
855
|
-
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);
|
|
856
836
|
const keyed = readForkTarget(await readJson(req), sourceId);
|
|
857
837
|
if (keyed.kind === "refused") {
|
|
858
838
|
sendError(res, 400, keyed.errorCode, keyed.message, keyed.facts);
|
|
@@ -861,7 +841,7 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
861
841
|
if (keyed.kind === "none") {
|
|
862
842
|
const newId = await fork(sourceId, newOwner);
|
|
863
843
|
if (newId === null) {
|
|
864
|
-
|
|
844
|
+
refuse(forkEntry, res, "missing");
|
|
865
845
|
return;
|
|
866
846
|
}
|
|
867
847
|
sendJson(res, 200, { sessionId: newId });
|
|
@@ -884,7 +864,7 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
884
864
|
throw e;
|
|
885
865
|
}
|
|
886
866
|
if (outcome === null) {
|
|
887
|
-
|
|
867
|
+
refuse(forkEntry, res, "missing");
|
|
888
868
|
return;
|
|
889
869
|
}
|
|
890
870
|
switch (outcome.outcome) {
|
|
@@ -896,7 +876,7 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
896
876
|
return;
|
|
897
877
|
case "occupied":
|
|
898
878
|
if (!outcome.sameOwner) {
|
|
899
|
-
|
|
879
|
+
refuse(forkEntry, res, "not_visible");
|
|
900
880
|
return;
|
|
901
881
|
}
|
|
902
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 });
|
|
@@ -915,36 +895,27 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
915
895
|
return;
|
|
916
896
|
}
|
|
917
897
|
const purge = deleteFact.purge;
|
|
918
|
-
const
|
|
919
|
-
|
|
920
|
-
if (!scope.fleetWide && scope.gateOwner === null) {
|
|
921
|
-
sendUnauthorized(res, "identity");
|
|
898
|
+
const deleteEntry = enter(req, res, deps, match.decl.id);
|
|
899
|
+
if (deleteEntry === undefined)
|
|
922
900
|
return;
|
|
923
|
-
}
|
|
924
901
|
const sessionId = safeDecode(match.params.sessionId);
|
|
925
902
|
if (sessionId === null || !isUuidShape(sessionId)) {
|
|
926
903
|
sendError(res, 400, "request.id_invalid", "invalid session id (must be a canonical uuid)");
|
|
927
904
|
return;
|
|
928
905
|
}
|
|
929
|
-
const
|
|
930
|
-
if (
|
|
931
|
-
sendJson(res, 200, { deleted: false });
|
|
932
|
-
return;
|
|
933
|
-
}
|
|
934
|
-
if (!scope.fleetWide && owner !== scope.gateOwner && !legacyUnownedSessionOk(deps.config, sessionCallerOf(req, deps), await sessionOwnerCellOf(deleteFact.sessionStorage, sessionId, owner))) {
|
|
935
|
-
sendJson(res, 200, { deleted: false });
|
|
936
|
-
return;
|
|
937
|
-
}
|
|
938
|
-
const activeTaskId = await deps.runStore?.getActiveTaskId(sessionId);
|
|
939
|
-
if (activeTaskId) {
|
|
940
|
-
sendError(res, 409, "conflict.session_active_run", "session has an active run; cancel it before deleting", { activeTaskId });
|
|
906
|
+
const deleteAdmitted = await admitSessionById(deleteEntry, res, deleteFact.gateStore, sessionId);
|
|
907
|
+
if (deleteAdmitted === undefined)
|
|
941
908
|
return;
|
|
942
|
-
|
|
909
|
+
const owner = deleteAdmitted.row.owner;
|
|
943
910
|
const result = await purge(sessionId, owner);
|
|
944
911
|
if ("active" in result) {
|
|
945
912
|
sendError(res, 409, "conflict.session_active_run", "session has an active run; cancel it before deleting", { activeTaskId: result.active });
|
|
946
913
|
return;
|
|
947
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
|
+
}
|
|
948
919
|
if ("childrenAlive" in result) {
|
|
949
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 })) });
|
|
950
921
|
return;
|
|
@@ -961,31 +932,23 @@ export async function handleSessions(req, res, match, ctx) {
|
|
|
961
932
|
return;
|
|
962
933
|
}
|
|
963
934
|
const store = policyFact.policyStore;
|
|
964
|
-
const
|
|
965
|
-
|
|
966
|
-
if (deps.config.requirePrincipal && principal === undefined) {
|
|
967
|
-
sendUnauthorized(res, "identity");
|
|
935
|
+
const policyEntry = enter(req, res, deps, match.decl.id);
|
|
936
|
+
if (policyEntry === undefined)
|
|
968
937
|
return;
|
|
969
|
-
}
|
|
970
938
|
const sessionId = safeDecode(match.params.sessionId);
|
|
971
939
|
if (sessionId === null || !isUuidShape(sessionId)) {
|
|
972
940
|
sendError(res, 400, "request.id_invalid", "invalid session id (must be a canonical uuid)");
|
|
973
941
|
return;
|
|
974
942
|
}
|
|
975
|
-
const
|
|
976
|
-
if (
|
|
977
|
-
sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
|
|
943
|
+
const policyAdmitted = await admitSessionById(policyEntry, res, policyFact.sessionStorage, sessionId);
|
|
944
|
+
if (policyAdmitted === undefined)
|
|
978
945
|
return;
|
|
979
|
-
|
|
946
|
+
const owner = policyAdmitted.row.owner;
|
|
980
947
|
if (owner === null) {
|
|
981
|
-
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.
|
|
982
|
-
return;
|
|
983
|
-
}
|
|
984
|
-
const operator = explicitOperatorOk(principal, deps.config);
|
|
985
|
-
if (!operator && owner !== (principal ?? null)) {
|
|
986
|
-
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");
|
|
987
949
|
return;
|
|
988
950
|
}
|
|
951
|
+
const operator = policyAdmitted.quals.has("operator");
|
|
989
952
|
const target = owner;
|
|
990
953
|
if (match.decl.id === "session-policy-get") {
|
|
991
954
|
try {
|
|
@@ -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;
|