@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
|
@@ -4,7 +4,7 @@ import { checkAdoptionPrincipalShape, checkAdoptionWidths } from "../../adoption
|
|
|
4
4
|
import { judgeAdoptionImportBinding, readAdoptionImportBody, runAdoptionImport } from "../../adoption/import.js";
|
|
5
5
|
import { limitRefusal } from "../../limit-refusal.js";
|
|
6
6
|
import { sendJson, sendError } from "../send.js";
|
|
7
|
-
import {
|
|
7
|
+
import { gatedPerson, explicitOperatorOk, sendOperatorPrincipalsRequired, sendPrincipalRefusal } from "../principal-gate.js";
|
|
8
8
|
import { assertNever } from "../route-ctx.js";
|
|
9
9
|
import * as facts from "../../capability-facts.js";
|
|
10
10
|
function sendOutcome(res, out) {
|
|
@@ -19,19 +19,23 @@ function sendOutcome(res, out) {
|
|
|
19
19
|
boundTo: out.boundTo,
|
|
20
20
|
});
|
|
21
21
|
return;
|
|
22
|
+
case "tables_missing":
|
|
23
|
+
sendError(res, 409, "adoption.table_missing", `this deployment wires stores whose tables are absent from the database (${out.tables.join(", ")}): nothing was migrated — restart a replica so its boot creates the missing tables, then resend the same request`, {
|
|
24
|
+
adoptionId: out.adoptionId,
|
|
25
|
+
tables: out.tables,
|
|
26
|
+
});
|
|
27
|
+
return;
|
|
22
28
|
case "rejected":
|
|
23
29
|
switch (out.code) {
|
|
24
30
|
case "adoption.destination_conflict":
|
|
25
|
-
sendError(res, 409, "adoption.destination_conflict",
|
|
31
|
+
sendError(res, 409, "adoption.destination_conflict", `the destination principal already holds rows sharing a logical key with the source: ${out.detail}`, {
|
|
26
32
|
adoptionId: out.adoptionId,
|
|
27
|
-
detail: out.detail,
|
|
28
33
|
conflicts: out.conflicts,
|
|
29
34
|
});
|
|
30
35
|
return;
|
|
31
36
|
case "adoption.destination_unrepresentable":
|
|
32
|
-
sendError(res, 409, "adoption.destination_unrepresentable",
|
|
37
|
+
sendError(res, 409, "adoption.destination_unrepresentable", `the destination principal does not fit every key this adoption would derive from it: ${out.detail}`, {
|
|
33
38
|
adoptionId: out.adoptionId,
|
|
34
|
-
detail: out.detail,
|
|
35
39
|
});
|
|
36
40
|
return;
|
|
37
41
|
}
|
|
@@ -58,7 +62,7 @@ export async function handleAdoption(req, res, match, ctx) {
|
|
|
58
62
|
async function operatorLane(req, res, id, params, ctx) {
|
|
59
63
|
const { deps } = ctx;
|
|
60
64
|
const { readJson } = ctx.helpers;
|
|
61
|
-
const principal =
|
|
65
|
+
const principal = gatedPerson(req, deps.config);
|
|
62
66
|
if (deps.config.requirePrincipal && !principal) {
|
|
63
67
|
sendPrincipalRefusal(res, req, deps.config);
|
|
64
68
|
return;
|
|
@@ -85,7 +89,8 @@ async function operatorLane(req, res, id, params, ctx) {
|
|
|
85
89
|
}
|
|
86
90
|
}
|
|
87
91
|
const store = fact.backend.adoptionLog();
|
|
88
|
-
const
|
|
92
|
+
const wiring = { memoryEngine: facts.memoryExport(deps).available, taskAttachment: deps.taskAttachmentStore !== undefined };
|
|
93
|
+
const runner = createAdoptionRunner({ store, dialect: deps.backend?.kind === "pg" ? "pg" : "mysql", now: Date.now, wiring, logger: deps.logger });
|
|
89
94
|
switch (id) {
|
|
90
95
|
case "adoption-detail": {
|
|
91
96
|
const adoptionId = ctx.helpers.safeDecode(params.id);
|
|
@@ -111,12 +116,12 @@ async function operatorLane(req, res, id, params, ctx) {
|
|
|
111
116
|
const { fromPrincipal, toPrincipal } = parsed.data;
|
|
112
117
|
const badShape = checkAdoptionPrincipalShape(fromPrincipal, toPrincipal);
|
|
113
118
|
if (badShape !== undefined) {
|
|
114
|
-
sendError(res, 400, "request.field_invalid",
|
|
119
|
+
sendError(res, 400, "request.field_invalid", `the adoption principals are not in a portable identity shape: ${badShape}`);
|
|
115
120
|
return;
|
|
116
121
|
}
|
|
117
122
|
const tooWide = checkAdoptionWidths(fromPrincipal, toPrincipal);
|
|
118
123
|
if (tooWide !== undefined) {
|
|
119
|
-
sendError(res, 400, "request.field_invalid",
|
|
124
|
+
sendError(res, 400, "request.field_invalid", `the adoption principals do not fit every identity column and derived key this adoption must write: ${tooWide}`);
|
|
120
125
|
return;
|
|
121
126
|
}
|
|
122
127
|
if (fromPrincipal === toPrincipal) {
|
|
@@ -124,6 +129,8 @@ async function operatorLane(req, res, id, params, ctx) {
|
|
|
124
129
|
return;
|
|
125
130
|
}
|
|
126
131
|
const out = await runner.start(fromPrincipal, toPrincipal);
|
|
132
|
+
if (out.kind === "receipt")
|
|
133
|
+
await deps.toolApproval?.followRowOwners();
|
|
127
134
|
sendOutcome(res, out);
|
|
128
135
|
return;
|
|
129
136
|
}
|
|
@@ -135,7 +142,7 @@ async function sourceLane(req, res, params, ctx) {
|
|
|
135
142
|
const { deps } = ctx;
|
|
136
143
|
if (ctx.helpers.rateLimited(req, res))
|
|
137
144
|
return;
|
|
138
|
-
const principal =
|
|
145
|
+
const principal = gatedPerson(req, deps.config);
|
|
139
146
|
if (principal === undefined) {
|
|
140
147
|
sendPrincipalRefusal(res, req, deps.config);
|
|
141
148
|
return;
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { chosenAgentName } from "@sema-agent/core";
|
|
2
2
|
import { sendJson, sendError } from "../send.js";
|
|
3
|
-
import {
|
|
3
|
+
import { gatedSubject, sendUnauthorized } from "../principal-gate.js";
|
|
4
|
+
import { PRINCIPAL_MAX_BYTES } from "../../principal-shape.js";
|
|
5
|
+
import { partsOf } from "../../owner-brands.js";
|
|
6
|
+
import { taskSpecIdentityOf } from "../../engine-identity.js";
|
|
7
|
+
import { routeListFilter } from "../owner-access.js";
|
|
4
8
|
import { assertNever } from "../route-ctx.js";
|
|
5
9
|
import * as facts from "../../capability-facts.js";
|
|
6
10
|
import { backgroundAgentNameOf } from "../../background-agent-name.js";
|
|
@@ -63,7 +67,7 @@ export async function handleAgentRoster(req, res, match, ctx) {
|
|
|
63
67
|
const { deps } = ctx;
|
|
64
68
|
switch (match.decl.id) {
|
|
65
69
|
case "agents-roster": {
|
|
66
|
-
const { fleetWide, gateOwner } =
|
|
70
|
+
const { fleetWide, gateOwner } = routeListFilter(req, deps, match.decl.id);
|
|
67
71
|
if (!fleetWide && gateOwner === null) {
|
|
68
72
|
sendUnauthorized(res, "identity");
|
|
69
73
|
return;
|
|
@@ -84,7 +88,7 @@ export async function handleAgentRoster(req, res, match, ctx) {
|
|
|
84
88
|
const beforeRaw = q.get("before");
|
|
85
89
|
const decoded = beforeRaw === null ? undefined : decodeCursor(beforeRaw);
|
|
86
90
|
if (decoded !== undefined && !decoded.ok) {
|
|
87
|
-
sendError(res, 400, "request.query_invalid",
|
|
91
|
+
sendError(res, 400, "request.query_invalid", `before must be the opaque \`nextBefore\` cursor from a previous page of this endpoint: ${decoded.why}`);
|
|
88
92
|
return;
|
|
89
93
|
}
|
|
90
94
|
const cursor = decoded?.ok === true ? decoded.cursor : undefined;
|
|
@@ -94,19 +98,21 @@ export async function handleAgentRoster(req, res, match, ctx) {
|
|
|
94
98
|
return;
|
|
95
99
|
}
|
|
96
100
|
const status = statusRaw === null ? undefined : statusRaw;
|
|
101
|
+
const subject = gatedSubject(req, deps.config);
|
|
102
|
+
const ownScope = taskSpecIdentityOf(subject === undefined ? undefined : partsOf(subject)).principal ?? "default";
|
|
97
103
|
let scope;
|
|
98
104
|
if (gateOwner !== null) {
|
|
99
|
-
scope =
|
|
105
|
+
scope = ownScope;
|
|
100
106
|
}
|
|
101
107
|
else {
|
|
102
108
|
const raw = q.get("scope");
|
|
103
109
|
if (raw === null) {
|
|
104
|
-
scope =
|
|
110
|
+
scope = ownScope;
|
|
105
111
|
}
|
|
106
112
|
else {
|
|
107
113
|
const s = raw.trim();
|
|
108
|
-
if (s === "" || s
|
|
109
|
-
sendError(res, 400, "request.query_invalid",
|
|
114
|
+
if (s === "" || Buffer.byteLength(s, "utf8") > PRINCIPAL_MAX_BYTES) {
|
|
115
|
+
sendError(res, 400, "request.query_invalid", `scope must be a non-blank tenant principal of at most ${PRINCIPAL_MAX_BYTES} UTF-8 bytes (the principal length every identity column holds)`);
|
|
110
116
|
return;
|
|
111
117
|
}
|
|
112
118
|
scope = s;
|
|
@@ -3,13 +3,16 @@ import { skillCardFacts } from "../../approval-card.js";
|
|
|
3
3
|
import { hostDecisionFacts, readDecider, retiredDecisionKeyFacts, DECIDED_BY_NOT_IN_PROOF } from "../../host-decision.js";
|
|
4
4
|
import { sameExecutionRecord } from "@sema-agent/core";
|
|
5
5
|
import { findParkedAgentForCheckpoint } from "../../parked-decide.js";
|
|
6
|
-
import { DECIDED_REPLAY_SCAN_CAP } from "../../plugins/checkpoint-store-face.js";
|
|
6
|
+
import { DECIDED_REPLAY_SCAN_CAP, pendingTriageOrder } from "../../plugins/checkpoint-store-face.js";
|
|
7
7
|
import { approvalPayloadFingerprint } from "../../plugins/approval-payload-fingerprint.js";
|
|
8
8
|
import { carriesDeploymentListQuestion, standingAnswerDurablyRecordable } from "../../tool-approval.js";
|
|
9
9
|
import { APPROVAL_GATE_KINDS } from "../../approval-content-kind.js";
|
|
10
10
|
import { isParkedRunStatus } from "../../plugins/store-contracts.js";
|
|
11
|
-
import { principalFrom,
|
|
12
|
-
import {
|
|
11
|
+
import { principalFrom, ownerOfCheckpointScope, scopeCellOf, CHECKPOINT_PUBLIC_SCOPE, PRINCIPAL_TOKEN_HEADER, APPROVAL_MAC_HEADER, APPROVAL_MAC_KID_HEADER } from "../../security.js";
|
|
12
|
+
import { keyAdmits } from "../../owner-faces.js";
|
|
13
|
+
import { personOf } from "../../owner-brands.js";
|
|
14
|
+
import { editedPlanBinding, verifyDirectDoorProof } from "../../principal-jwt.js";
|
|
15
|
+
import { isWellFormedUnicode } from "../../principal-shape.js";
|
|
13
16
|
import { MAX_APPROVAL_REASON_CHARS, projectQuestionAnswer, questionAnswerFromProjection } from "../../approval-hmac.js";
|
|
14
17
|
import { PLAN_APPROVE_PERMISSION_MODES_AFTER, isPlanApprovePermissionModeAfter, planReviewDecisionExitsPlan, storedBodyPermissionMode } from "../../task-settings.js";
|
|
15
18
|
import { MAX_APPROVAL_NONCE_CHARS } from "../../plugins/approval-nonce-store.js";
|
|
@@ -19,8 +22,8 @@ import { buildRunName } from "../../fleet/fleet-bus.js";
|
|
|
19
22
|
import { sleep } from "../sse-log.js";
|
|
20
23
|
import { bindSseLifecycle } from "../sse-lifecycle.js";
|
|
21
24
|
import { sendJson, sendError, sseHeaders, logRequestError, SSE_MAX_STREAM_MS, SSE_HEARTBEAT_IDLE_MS } from "../send.js";
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
25
|
+
import { gatedSubject, explicitOperatorOk, sendPrincipalRefusal } from "../principal-gate.js";
|
|
26
|
+
import { admitRunById, admitSessionById, callerEntry, callerOf, callerOfDecision, deciderSubjectOf, enter, judgeRun, protocolEntry, readVisibleRun, refuse, withCaller } from "../owner-access.js";
|
|
24
27
|
import { governanceOriginOf } from "../../runtime-governance.js";
|
|
25
28
|
import { deploymentListAsks } from "../../approval.js";
|
|
26
29
|
import { grantBindingOf } from "../../standing-answer-grant.js";
|
|
@@ -215,7 +218,7 @@ export function checkQuestionAnswer(v) {
|
|
|
215
218
|
return shapeOk ? { ok: true, value: v } : { ok: false, kind: "shape" };
|
|
216
219
|
}
|
|
217
220
|
async function decideIdempotentReplay(cs, args) {
|
|
218
|
-
const { sessionId, out, binding, decision, payload,
|
|
221
|
+
const { sessionId, out, binding, decision, payload, decider, warn } = args;
|
|
219
222
|
if (out.status !== 404 || out.body.errorCode !== "not_found.approval")
|
|
220
223
|
return undefined;
|
|
221
224
|
const boundCallId = binding.boundCallId;
|
|
@@ -238,12 +241,9 @@ async function decideIdempotentReplay(cs, args) {
|
|
|
238
241
|
for (const row of rows) {
|
|
239
242
|
if (row.decision === null)
|
|
240
243
|
return undefined;
|
|
241
|
-
if (!
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
warn("decide_replay_scope_mismatch", { sessionId });
|
|
245
|
-
return undefined;
|
|
246
|
-
}
|
|
244
|
+
if (!keyAdmits("scope.decide", decider, scopeCellOf(row.scope))) {
|
|
245
|
+
warn("decide_replay_scope_mismatch", { sessionId });
|
|
246
|
+
return undefined;
|
|
247
247
|
}
|
|
248
248
|
if (binding.boundInputHash === undefined || row.boundInputHash !== binding.boundInputHash)
|
|
249
249
|
return undefined;
|
|
@@ -279,9 +279,9 @@ async function decideIdempotentReplay(cs, args) {
|
|
|
279
279
|
},
|
|
280
280
|
};
|
|
281
281
|
}
|
|
282
|
-
async function gateObjectivePreview(reader, runStore, agentStore, gate) {
|
|
283
|
-
const previewOf =
|
|
284
|
-
const own = (await runStore.getActiveTaskId(
|
|
282
|
+
async function gateObjectivePreview(reader, runStore, agentStore, gate, runSessionId) {
|
|
283
|
+
const previewOf = (taskId) => readVisibleRun(reader, runStore, taskId);
|
|
284
|
+
const own = typeof runSessionId === "string" ? ((await runStore.getActiveTaskId(runSessionId)) ?? (await runStore.latestRunForSession(runSessionId))?.taskId) : undefined;
|
|
285
285
|
if (own !== undefined)
|
|
286
286
|
return (await previewOf(own))?.objectivePreview ?? null;
|
|
287
287
|
if (agentStore === undefined)
|
|
@@ -311,8 +311,8 @@ export async function handleApprovalsAssistant(req, res, match, ctx) {
|
|
|
311
311
|
return;
|
|
312
312
|
}
|
|
313
313
|
const cs = park.checkpointStore;
|
|
314
|
-
const principal =
|
|
315
|
-
const operator = explicitOperatorOk(principal, deps.config);
|
|
314
|
+
const principal = gatedSubject(req, deps.config);
|
|
315
|
+
const operator = explicitOperatorOk(principal === undefined ? undefined : personOf(principal), deps.config);
|
|
316
316
|
const ownScope = principal ?? CHECKPOINT_PUBLIC_SCOPE;
|
|
317
317
|
if (match.decl.id === "approvals-stream") {
|
|
318
318
|
const ownerParam = operator ? (new URLSearchParams(match.search).get("owner") ?? undefined) : undefined;
|
|
@@ -354,16 +354,15 @@ export async function handleApprovalsAssistant(req, res, match, ctx) {
|
|
|
354
354
|
sendError(res, 400, "request.path_malformed", "malformed id (invalid percent-encoding)");
|
|
355
355
|
return;
|
|
356
356
|
}
|
|
357
|
-
|
|
357
|
+
const exEntry = callerEntry(req, deps, match.decl.id);
|
|
358
|
+
if (!exEntry.caller.operator) {
|
|
358
359
|
const owned = facts.sessionOwnership(deps);
|
|
359
360
|
if (!owned.available) {
|
|
360
361
|
sendError(res, 501, "capability.session_store_required", "approval exemptions require a session-store backend");
|
|
361
362
|
return;
|
|
362
363
|
}
|
|
363
|
-
if ((await
|
|
364
|
-
sendError(res, 404, "not_found.session", "not found");
|
|
364
|
+
if ((await admitSessionById(exEntry, res, owned.sessionStorage, exSessionId)) === undefined)
|
|
365
365
|
return;
|
|
366
|
-
}
|
|
367
366
|
}
|
|
368
367
|
if (match.decl.id === "approval-exemptions-list") {
|
|
369
368
|
if (exToolName !== undefined) {
|
|
@@ -398,11 +397,12 @@ export async function handleApprovalsAssistant(req, res, match, ctx) {
|
|
|
398
397
|
}
|
|
399
398
|
const ledger = facts.durableRuns(deps);
|
|
400
399
|
const agentStore = deps.backgroundAgentStore;
|
|
400
|
+
const previewEntry = protocolEntry(req, deps, "run.preview", callerOf(req, deps));
|
|
401
401
|
const inbox = (await Promise.all(summaries.map(async (s) => {
|
|
402
402
|
let objective = null;
|
|
403
403
|
if (ledger.available) {
|
|
404
404
|
try {
|
|
405
|
-
objective = await gateObjectivePreview(
|
|
405
|
+
objective = await gateObjectivePreview(previewEntry, ledger.runStore, agentStore, s, await cs.hostSessionOfCard(s.token));
|
|
406
406
|
}
|
|
407
407
|
catch (err) {
|
|
408
408
|
recordFailOpen("server.assistant-inbox.objective-preview-unreadable", `run row read for the inbox row of session ${JSON.stringify(s.sessionId)} failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -428,11 +428,12 @@ export async function handleApprovalsAssistant(req, res, match, ctx) {
|
|
|
428
428
|
...(s.boundGrantDigest !== undefined ? { boundGrantDigest: s.boundGrantDigest } : {}),
|
|
429
429
|
...skillCardFacts(s),
|
|
430
430
|
...(s.boundGrantAbsence !== undefined ? { boundGrantAbsence: s.boundGrantAbsence } : {}),
|
|
431
|
+
...(s.runOrigin !== undefined ? { runOrigin: s.runOrigin } : {}),
|
|
431
432
|
objective,
|
|
432
433
|
input,
|
|
433
434
|
};
|
|
434
435
|
})))
|
|
435
|
-
.sort(
|
|
436
|
+
.sort(pendingTriageOrder);
|
|
436
437
|
sendJson(res, 200, { inbox });
|
|
437
438
|
return;
|
|
438
439
|
}
|
|
@@ -453,7 +454,13 @@ export async function handleApprovalsAssistant(req, res, match, ctx) {
|
|
|
453
454
|
sendApprovalsReadFailure(req, res, deps.logger, err);
|
|
454
455
|
return;
|
|
455
456
|
}
|
|
456
|
-
const
|
|
457
|
+
const hosts = await Promise.all(summaries.map((s) => cs.hostSessionOfCard(s.token)));
|
|
458
|
+
const byGate = new Map();
|
|
459
|
+
summaries.forEach((s, i) => {
|
|
460
|
+
const host = hosts[i];
|
|
461
|
+
if (typeof host === "string")
|
|
462
|
+
byGate.set(host, s);
|
|
463
|
+
});
|
|
457
464
|
const runs = await runStore.listRuns({ owner: ownerOfCheckpointScope(scope), limit: 100 });
|
|
458
465
|
const tasks = runs
|
|
459
466
|
.filter((r) => r.status === "running" || isParkedRunStatus(r.status))
|
|
@@ -482,20 +489,18 @@ export async function handleApprovalsAssistant(req, res, match, ctx) {
|
|
|
482
489
|
return;
|
|
483
490
|
}
|
|
484
491
|
const runStore = runs.runStore;
|
|
485
|
-
|
|
486
|
-
|
|
492
|
+
const preemptEntry = enter(req, res, deps, match.decl.id);
|
|
493
|
+
if (preemptEntry === undefined)
|
|
487
494
|
return;
|
|
488
|
-
}
|
|
489
495
|
if (!deps.config.resourceSuspend) {
|
|
490
496
|
sendError(res, 501, "feature.preemption_disabled", "preemption not enabled on this worker (needs RESOURCE_SUSPEND=true + a durable checkpoint store)");
|
|
491
497
|
return;
|
|
492
498
|
}
|
|
493
499
|
const taskId = match.params.taskId;
|
|
494
|
-
const
|
|
495
|
-
if (
|
|
496
|
-
sendError(res, 404, "not_found.run", "task not found");
|
|
500
|
+
const preemptAdmitted = (await admitRunById(preemptEntry, res, runStore, taskId));
|
|
501
|
+
if (preemptAdmitted === undefined)
|
|
497
502
|
return;
|
|
498
|
-
|
|
503
|
+
const run = preemptAdmitted.row;
|
|
499
504
|
if (run.status === "running") {
|
|
500
505
|
const ownedHere = run.instanceId != null && run.instanceId === deps.instanceId;
|
|
501
506
|
if (ownedHere && !preemptableRuns.has(taskId)) {
|
|
@@ -541,23 +546,17 @@ export async function handleApprovalsAssistant(req, res, match, ctx) {
|
|
|
541
546
|
return;
|
|
542
547
|
}
|
|
543
548
|
const runStore = runs.runStore;
|
|
544
|
-
|
|
545
|
-
|
|
549
|
+
const resumeEntry = enter(req, res, deps, match.decl.id);
|
|
550
|
+
if (resumeEntry === undefined)
|
|
546
551
|
return;
|
|
547
|
-
}
|
|
548
552
|
const restatement = readResumeRestatement(await readJson(req));
|
|
549
553
|
const taskId = match.params.taskId;
|
|
550
|
-
const
|
|
551
|
-
if (
|
|
552
|
-
sendError(res, 404, "not_found.run", "task not found");
|
|
553
|
-
return;
|
|
554
|
-
}
|
|
555
|
-
const explicitOperator = explicitOperatorOk(principal, deps.config);
|
|
556
|
-
if (!explicitOperator && run.owner !== null && run.owner !== principal) {
|
|
557
|
-
sendError(res, 404, "not_found.run", "task not found");
|
|
554
|
+
const resumeAdmitted = (await admitRunById(resumeEntry, res, runStore, taskId));
|
|
555
|
+
if (resumeAdmitted === undefined)
|
|
558
556
|
return;
|
|
559
|
-
|
|
560
|
-
const
|
|
557
|
+
const run = resumeAdmitted.row;
|
|
558
|
+
const explicitOperator = resumeAdmitted.quals.has("operator");
|
|
559
|
+
const out = await resumePreempted(run.sessionId, req, true, { subject: resumeEntry.caller.subject, operator: explicitOperator }, restatement);
|
|
561
560
|
sendResumeOutcome(res, out, deps.logger);
|
|
562
561
|
return;
|
|
563
562
|
}
|
|
@@ -660,17 +659,15 @@ export async function handleApprovalsAssistant(req, res, match, ctx) {
|
|
|
660
659
|
}
|
|
661
660
|
}
|
|
662
661
|
const sighting = typeof body.checkpointId === "string" ? { face: "checkpointId", value: body.checkpointId } : undefined;
|
|
662
|
+
const decisionEntry = callerEntry(req, deps, match.decl.id);
|
|
663
663
|
const run = await runStore.getRun(taskId);
|
|
664
664
|
if (!run) {
|
|
665
|
-
if (deps.config.directDoorActive)
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
}
|
|
669
|
-
deps.logger?.info?.("decide_404", { reason: "no-row", taskId, principalPresent: principal !== undefined });
|
|
670
|
-
sendError(res, 404, "not_found.run", "task not found");
|
|
665
|
+
if (!deps.config.directDoorActive)
|
|
666
|
+
deps.logger?.info?.("decide_404", { reason: "no-row", taskId, principalPresent: principal !== undefined });
|
|
667
|
+
refuse(decisionEntry, res, "missing");
|
|
671
668
|
return;
|
|
672
669
|
}
|
|
673
|
-
let deciderPrincipal = principal;
|
|
670
|
+
let deciderPrincipal = principal === undefined ? undefined : personOf(principal);
|
|
674
671
|
let singleUse;
|
|
675
672
|
if (deps.config.directDoorActive) {
|
|
676
673
|
const store = deps.approvalNonceStore;
|
|
@@ -695,13 +692,15 @@ export async function handleApprovalsAssistant(req, res, match, ctx) {
|
|
|
695
692
|
deciderPrincipal = proof.principal;
|
|
696
693
|
singleUse = proof.singleUse === undefined ? undefined : { proof: proof.singleUse, store };
|
|
697
694
|
}
|
|
698
|
-
const
|
|
699
|
-
|
|
695
|
+
const deciderEntry = withCaller(decisionEntry, callerOfDecision(decisionEntry.caller, deciderPrincipal, deps.config));
|
|
696
|
+
const decisionAdmitted = judgeRun(deciderEntry, run);
|
|
697
|
+
if (decisionAdmitted === undefined) {
|
|
700
698
|
deps.logger?.info?.("decide_404", { reason: "owner-mismatch", taskId, principalPresent: principal !== undefined });
|
|
701
|
-
|
|
699
|
+
refuse(deciderEntry, res, "not_visible");
|
|
702
700
|
return;
|
|
703
701
|
}
|
|
704
|
-
const
|
|
702
|
+
const explicitOperator = decisionAdmitted.quals.has("operator");
|
|
703
|
+
const plan = await preparePlanReview(run.sessionId, { taskId, principalPresent: principal !== undefined }, { subject: deciderSubjectOf(principal, deciderPrincipal), operator: explicitOperator }, sighting, restated.restatement);
|
|
705
704
|
if (!plan.ok) {
|
|
706
705
|
sendResumeOutcome(res, plan.answer, deps.logger);
|
|
707
706
|
return;
|
|
@@ -862,7 +861,7 @@ export async function handleApprovalsAssistant(req, res, match, ctx) {
|
|
|
862
861
|
updatedInput: body.updatedInput,
|
|
863
862
|
...(typeof body.feedback === "string" ? { feedback: body.feedback } : {}),
|
|
864
863
|
};
|
|
865
|
-
let deciderPrincipal = principal;
|
|
864
|
+
let deciderPrincipal = principal === undefined ? undefined : personOf(principal);
|
|
866
865
|
if (deps.config.directDoorActive) {
|
|
867
866
|
const hdr = (n) => {
|
|
868
867
|
const h = req.headers[n];
|
|
@@ -881,19 +880,17 @@ export async function handleApprovalsAssistant(req, res, match, ctx) {
|
|
|
881
880
|
}
|
|
882
881
|
deciderPrincipal = proof.principal;
|
|
883
882
|
}
|
|
884
|
-
const
|
|
885
|
-
if (!
|
|
883
|
+
const deciderCaller = { subject: deciderSubjectOf(principal, deciderPrincipal), operator: explicitOperatorOk(deciderPrincipal, deps.config) };
|
|
884
|
+
if (!deciderCaller.operator) {
|
|
886
885
|
const cpScope = await cs
|
|
887
886
|
.peekPendingScope(sessionId, { gateKinds: APPROVAL_GATE_KINDS })
|
|
888
887
|
.then((s) => (s === undefined ? cs.peekPendingScope(sessionId) : s));
|
|
889
|
-
|
|
890
|
-
const ownsIt = cpScope == null || decodedCpScope === undefined || decodedCpScope === deciderPrincipal;
|
|
891
|
-
if (!ownsIt) {
|
|
888
|
+
if (!keyAdmits("scope.decide", deciderCaller, scopeCellOf(cpScope ?? CHECKPOINT_PUBLIC_SCOPE))) {
|
|
892
889
|
sendError(res, 404, "not_found.approval", "approval not found");
|
|
893
890
|
return;
|
|
894
891
|
}
|
|
895
892
|
}
|
|
896
|
-
const out = await resumeCheckpoint(sessionId, decision, body.reason ?? undefined, hostDecisionFacts(decider, deciderPrincipal), req, answer, binding, remember ? { grantedBy: deciderPrincipal ?? null, laneCannotRecord: "refuse" } : undefined, true,
|
|
893
|
+
const out = await resumeCheckpoint(sessionId, decision, body.reason ?? undefined, hostDecisionFacts(decider, deciderPrincipal), req, answer, binding, remember ? { grantedBy: deciderPrincipal ?? null, laneCannotRecord: "refuse" } : undefined, true, deciderCaller, restated.restatement);
|
|
897
894
|
const replay = await decideIdempotentReplay(cs, {
|
|
898
895
|
sessionId,
|
|
899
896
|
out,
|
|
@@ -905,8 +902,7 @@ export async function handleApprovalsAssistant(req, res, match, ctx) {
|
|
|
905
902
|
...((r) => (r !== undefined ? { reason: r } : {}))(decisionReasonOf(body)),
|
|
906
903
|
...(binding.feedback !== undefined ? { feedback: binding.feedback } : {}),
|
|
907
904
|
},
|
|
908
|
-
|
|
909
|
-
explicitOperator,
|
|
905
|
+
decider: deciderCaller,
|
|
910
906
|
warn: (event, fields) => deps.logger?.warn?.(event, fields),
|
|
911
907
|
});
|
|
912
908
|
if (replay !== undefined) {
|
|
@@ -983,6 +979,8 @@ function approvalsReadFailureOf(err) {
|
|
|
983
979
|
case "deployment":
|
|
984
980
|
case "unclassified":
|
|
985
981
|
return "approvals.read_unavailable";
|
|
982
|
+
case "defect":
|
|
983
|
+
return "internal.error";
|
|
986
984
|
default: {
|
|
987
985
|
const unhandled = fault;
|
|
988
986
|
throw new Error(`store fault class without an approvals read answer: ${String(unhandled)}`);
|
|
@@ -990,15 +988,18 @@ function approvalsReadFailureOf(err) {
|
|
|
990
988
|
}
|
|
991
989
|
}
|
|
992
990
|
function sendApprovalsReadFailure(req, res, logger, err) {
|
|
993
|
-
logRequestError(logger, req, err);
|
|
994
991
|
const failure = approvalsReadFailureOf(err);
|
|
995
992
|
switch (failure) {
|
|
996
993
|
case "approvals.read_corrupt":
|
|
994
|
+
logRequestError(logger, req, err);
|
|
997
995
|
sendError(res, 500, "approvals.read_corrupt", "a stored approval row cannot be read - retrying this request will fail the same way until an operator repairs or removes the row");
|
|
998
996
|
return;
|
|
999
997
|
case "approvals.read_unavailable":
|
|
998
|
+
logRequestError(logger, req, err);
|
|
1000
999
|
sendError(res, 503, "approvals.read_unavailable", "the approvals queue could not be read right now - retry this request; until a read succeeds, this answer does not mean nothing is pending");
|
|
1001
1000
|
return;
|
|
1001
|
+
case "internal.error":
|
|
1002
|
+
throw err;
|
|
1002
1003
|
default: {
|
|
1003
1004
|
const unhandled = failure;
|
|
1004
1005
|
throw new Error(`approvals read failure word without an answer: ${String(unhandled)}`);
|
|
@@ -1136,6 +1137,10 @@ export async function streamApprovals(req, res, cs, live, peerInbound, sessions,
|
|
|
1136
1137
|
if (!res.writableEnded)
|
|
1137
1138
|
res.write(`event: error\ndata: ${JSON.stringify({ type: "error", errorCode: "approvals.read_unavailable", message: "the approvals queue could not be read - this stream stays open and retries on its next poll; until a read succeeds, silence here does not mean nothing is pending" })}\n\n`);
|
|
1138
1139
|
break;
|
|
1140
|
+
case "internal.error":
|
|
1141
|
+
if (!res.writableEnded)
|
|
1142
|
+
res.write(`event: error\ndata: ${JSON.stringify({ type: "error", errorCode: "internal.error", message: "the approvals queue could not be read because of an internal error - this stream is closing; reconnecting will fail the same way until the server is fixed" })}\n\n`);
|
|
1143
|
+
throw err;
|
|
1139
1144
|
default: {
|
|
1140
1145
|
const unhandled = failure;
|
|
1141
1146
|
throw new Error(`approvals read failure word without a stream answer: ${String(unhandled)}`);
|
|
@@ -2,7 +2,7 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import { uuidv7, sanitizePathComponent } from "@sema-agent/core";
|
|
3
3
|
import { HttpError } from "../../security.js";
|
|
4
4
|
import { sendJson, sendError } from "../send.js";
|
|
5
|
-
import {
|
|
5
|
+
import { gatedSubject, sendPrincipalRefusal } from "../principal-gate.js";
|
|
6
6
|
import { assertNever } from "../route-ctx.js";
|
|
7
7
|
import { attachmentKindOf, readProjectBundle } from "../../project-bundle.js";
|
|
8
8
|
export async function handleAttachments(req, res, match, ctx) {
|
|
@@ -17,7 +17,7 @@ export async function handleAttachments(req, res, match, ctx) {
|
|
|
17
17
|
sendError(res, 501, "capability.attachment_store_required", "attachment store not configured");
|
|
18
18
|
return;
|
|
19
19
|
}
|
|
20
|
-
const principal =
|
|
20
|
+
const principal = gatedSubject(req, deps.config);
|
|
21
21
|
if (deps.config.requirePrincipal && principal === undefined) {
|
|
22
22
|
sendPrincipalRefusal(res, req, deps.config);
|
|
23
23
|
return;
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
* ── 结清口:子代结清只有一只协调器 ─────────────────────────────────────────────────────────────────
|
|
32
32
|
* `POST /v1/sessions/:id/children/retire`(无体)→ 200 `{ children: string[] }`:**显式**结清以本会话为根的后台子代(running 停掉、parked
|
|
33
33
|
* 作废卡并对账翻终态),与 `DELETE /v1/sessions/:id` 同调**一只**预检 `probeSessionChildren` 与**一只**协调器 `retireSessionChildren`
|
|
34
|
-
* (`session-children-retire.ts`)、同一个 scope(`
|
|
34
|
+
* (`session-children-retire.ts`)、同一个 scope(`sessionTenantScope`)。预检有本副本结束不了的 ⇒ 409 `conflict.session_children_alive{remaining}`
|
|
35
35
|
* (与删除门同码同投影,一只都不动);停不净(时序失败)⇒ 与删除门同一失败契约(通用 500,重试收敛)。`children` = 首轮观察到、且已全部
|
|
36
36
|
* 结清的子代,每项经名册的 id 投影 `rosterAgentId`(与换绑 / 导入两门 409 体的 `children` 同形同投影)。它不判根认领(停止口也不判):
|
|
37
37
|
* 根 run 活着时它可再派子代 —— 由换绑 / 导入门写事务内的认领读兜。鉴权 / 限流 / 无凭据写门与停止口同。
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
* 「把树结清」是两个意图、两只口。
|
|
40
40
|
*
|
|
41
41
|
* 🔴 **停止口在无凭据写门内**(`credentialGated: ["POST"]`;车OL F1 = 7.102.0 合并复审 gpt-6 腿 [high]):门的两个合取项它都中
|
|
42
|
-
* —— ① 授权的唯一输入是 principal 头(属主判 `
|
|
42
|
+
* —— ① 授权的唯一输入是 principal 头(属主判 `admitSessionRow` 与 operator 臂 `explicitOperatorOk` 读的都是 `gatedSubject`,
|
|
43
43
|
* 无 service 凭证的部署上它收调用方自报的头);② 不可撤销、爆炸半径跨租户(知道会话 id + 自报它的属主 ⇒ 停掉那个会话的后台
|
|
44
44
|
* 进程,`includeRetained:true` 连显式 retain 的活服务一起停)。于是无 service 凭证且未开 `ALLOW_UNAUTHED_WRITES` 的部署上它与
|
|
45
45
|
* 其余改写门同码同句 503 `auth.service_token_required`(在路由之前,`dispatch.ts` 那一道),同一只会话级收敛函数的另一个调用点
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
*/
|
|
50
50
|
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
51
51
|
import { type TaskRegistry, type BackgroundShellHardKillReceipt } from "@sema-agent/core";
|
|
52
|
-
import {
|
|
52
|
+
import type { RouteCtx, RouteMatch, RouteIdsOf } from "../route-ctx.js";
|
|
53
53
|
/** `description` 的显示截断(模型描述通常一句话;回落的命令文本可能是一整段脚本)。 */
|
|
54
54
|
export declare const DESCRIPTION_MAX = 500;
|
|
55
55
|
/** core `list()` 的行型(从唯一的消费位取,不抄结构)。 */
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { defaultTaskRegistry } from "@sema-agent/core";
|
|
3
3
|
import { reapSessionBackgroundHard } from "../../background-session-reap.js";
|
|
4
|
-
import { probeSessionChildren, retireSessionChildren,
|
|
4
|
+
import { probeSessionChildren, retireSessionChildren, sessionTenantScope, SessionChildrenStopIncompleteError } from "../../session-children-retire.js";
|
|
5
5
|
import { rosterAgentId } from "./agents-roster.js";
|
|
6
6
|
import { redactSecrets } from "../../trace/redact.js";
|
|
7
7
|
import { sendJson, sendError } from "../send.js";
|
|
8
|
-
import {
|
|
9
|
-
import {} from "../route-ctx.js";
|
|
10
|
-
import { assertNever, SESSION_NOT_FOUND_MESSAGE } from "../route-ctx.js";
|
|
8
|
+
import { admitSessionById, enter } from "../owner-access.js";
|
|
9
|
+
import { assertNever } from "../route-ctx.js";
|
|
11
10
|
import * as facts from "../../capability-facts.js";
|
|
12
|
-
import { sessionOwnerCellOf } from "../../security.js";
|
|
13
11
|
const LIST_LIMIT = 500;
|
|
14
12
|
export const DESCRIPTION_MAX = 500;
|
|
15
13
|
const ROW_KEY_DISPOSITION = {
|
|
@@ -50,11 +48,9 @@ export async function handleBackground(req, res, match, ctx) {
|
|
|
50
48
|
const id = match.decl.id;
|
|
51
49
|
if ((id === "session-background-stop" || id === "session-children-retire") && ctx.helpers.rateLimited(req, res))
|
|
52
50
|
return;
|
|
53
|
-
const
|
|
54
|
-
if (
|
|
55
|
-
sendPrincipalRefusal(res, req, deps.config);
|
|
51
|
+
const entry = enter(req, res, deps, id);
|
|
52
|
+
if (entry === undefined)
|
|
56
53
|
return;
|
|
57
|
-
}
|
|
58
54
|
let includeRetained = false;
|
|
59
55
|
if (id === "session-background-stop") {
|
|
60
56
|
const parsed = StopBodySchema.safeParse((await ctx.helpers.readJson(req)) ?? {});
|
|
@@ -74,15 +70,11 @@ export async function handleBackground(req, res, match, ctx) {
|
|
|
74
70
|
sendError(res, 501, "capability.session_ownership_required", "the session background faces require the session-ownership face (sessionStorage.headOf)");
|
|
75
71
|
return;
|
|
76
72
|
}
|
|
77
|
-
const
|
|
78
|
-
if (
|
|
79
|
-
sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE);
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
const operator = explicitOperatorOk(principal, deps.config);
|
|
83
|
-
if (!operator && !ctx.helpers.sessionOwnerOk(req, res, await sessionOwnerCellOf(owned.sessionStorage, sessionId, owner)))
|
|
73
|
+
const admitted = await admitSessionById(entry, res, owned.sessionStorage, sessionId);
|
|
74
|
+
if (admitted === undefined)
|
|
84
75
|
return;
|
|
85
|
-
const
|
|
76
|
+
const owner = admitted.row.owner;
|
|
77
|
+
const scope = sessionTenantScope(owner);
|
|
86
78
|
switch (id) {
|
|
87
79
|
case "session-background-list": {
|
|
88
80
|
const rows = defaultTaskRegistry.list({ owner: sessionId, sessionId, scope }, { limit: LIST_LIMIT }).map(projectRow);
|