@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,8 +1,10 @@
|
|
|
1
1
|
import { timingSafeEqual } from "node:crypto";
|
|
2
2
|
import { DEPLOYMENT_SHAPE_PREDICATES } from "../deployment-shape.js";
|
|
3
|
-
import { PRINCIPAL_TOKEN_HEADER,
|
|
3
|
+
import { PRINCIPAL_TOKEN_HEADER, verifiedPerson, verifiedSubject, scenarioHeaderOf, scenarioWithoutPrincipalError, ssoVerifiedPrincipal, ssoVerifiedPrincipalInc, ssoVerifiedScope } from "../security.js";
|
|
4
|
+
import { personOf } from "../owner-brands.js";
|
|
4
5
|
import { IDENTITY_SOURCES, runIdentityClaimOverflow } from "../identity-source.js";
|
|
5
6
|
import { sendError } from "./send.js";
|
|
7
|
+
import { canonicalAddress } from "../net-address.js";
|
|
6
8
|
export function headerStr(v) {
|
|
7
9
|
return Array.isArray(v) ? v[0] : v;
|
|
8
10
|
}
|
|
@@ -40,7 +42,8 @@ export function traceTokenPresented(req, config) {
|
|
|
40
42
|
return !!config.traceToken && authorized(req, config.traceToken);
|
|
41
43
|
}
|
|
42
44
|
export function isLoopbackAddress(addr) {
|
|
43
|
-
|
|
45
|
+
const canonical = addr === undefined ? undefined : canonicalAddress(addr);
|
|
46
|
+
return canonical === "127.0.0.1" || canonical === "::1";
|
|
44
47
|
}
|
|
45
48
|
function identitySourceVerified(kind, req, config) {
|
|
46
49
|
switch (kind) {
|
|
@@ -49,7 +52,7 @@ function identitySourceVerified(kind, req, config) {
|
|
|
49
52
|
case "sso":
|
|
50
53
|
return ssoVerifiedPrincipal(req) !== undefined;
|
|
51
54
|
case "direct_door_jwt":
|
|
52
|
-
return config.directDoorActive &&
|
|
55
|
+
return config.directDoorActive && verifiedPerson(req, config) !== undefined;
|
|
53
56
|
default: {
|
|
54
57
|
const unknownKind = kind;
|
|
55
58
|
throw new Error(`verifiedIdentitySource: unknown identity source ${String(unknownKind)}`);
|
|
@@ -97,20 +100,26 @@ export function runIdentityOf(req, config, owner) {
|
|
|
97
100
|
const admitted = ADMITTED_RUN_IDENTITY.get(req);
|
|
98
101
|
if (admitted === undefined || admitted === null)
|
|
99
102
|
return null;
|
|
100
|
-
return (
|
|
103
|
+
return (gatedSubject(req, config) ?? null) === owner ? admitted : null;
|
|
101
104
|
}
|
|
102
|
-
export function
|
|
103
|
-
if (bearerPresentedButUnverified(req, config))
|
|
105
|
+
export function gatedSubject(req, config) {
|
|
106
|
+
if (bearerPresentedButUnverified(req, config)) {
|
|
107
|
+
if (scenarioHeaderOf(req) !== undefined)
|
|
108
|
+
throw scenarioWithoutPrincipalError();
|
|
104
109
|
return undefined;
|
|
105
|
-
|
|
106
|
-
return
|
|
110
|
+
}
|
|
111
|
+
return verifiedSubject(req, config);
|
|
112
|
+
}
|
|
113
|
+
export function gatedPerson(req, config) {
|
|
114
|
+
const subject = gatedSubject(req, config);
|
|
115
|
+
return subject === undefined ? undefined : personOf(subject);
|
|
107
116
|
}
|
|
108
117
|
export function principalTokenPresentedButUnverified(req, config) {
|
|
109
118
|
if (!config.directDoorActive)
|
|
110
119
|
return false;
|
|
111
120
|
if (headerStr(req.headers[PRINCIPAL_TOKEN_HEADER]) === undefined)
|
|
112
121
|
return false;
|
|
113
|
-
return
|
|
122
|
+
return verifiedPerson(req, config) === undefined;
|
|
114
123
|
}
|
|
115
124
|
export function sendPrincipalRefusal(res, req, config) {
|
|
116
125
|
if (principalTokenPresentedButUnverified(req, config)) {
|
|
@@ -139,72 +148,19 @@ export function sendUnauthorized(res, face) {
|
|
|
139
148
|
}
|
|
140
149
|
}
|
|
141
150
|
}
|
|
142
|
-
export function
|
|
143
|
-
|
|
144
|
-
return true;
|
|
145
|
-
return sameSessionOwner(config, owner, principal ?? null);
|
|
146
|
-
}
|
|
147
|
-
export function hasServiceAuth(config) {
|
|
148
|
-
return Boolean(config.authToken) || Object.keys(config.authTokens ?? {}).length > 0;
|
|
149
|
-
}
|
|
150
|
-
function identitySourceWired(kind, w) {
|
|
151
|
-
switch (kind) {
|
|
152
|
-
case "service_token":
|
|
153
|
-
return hasServiceAuth(w.config);
|
|
154
|
-
case "sso":
|
|
155
|
-
return w.webAdminJwtVerifier !== undefined;
|
|
156
|
-
case "direct_door_jwt":
|
|
157
|
-
return w.config.directDoorActive;
|
|
158
|
-
default: {
|
|
159
|
-
const unknownKind = kind;
|
|
160
|
-
throw new Error(`identity sources: unknown identity source ${String(unknownKind)}`);
|
|
161
|
-
}
|
|
162
|
-
}
|
|
151
|
+
export function devOpenDeployment(config) {
|
|
152
|
+
return !DEPLOYMENT_SHAPE_PREDICATES.identityBoundary.holds(config);
|
|
163
153
|
}
|
|
164
|
-
export function
|
|
165
|
-
return
|
|
166
|
-
}
|
|
167
|
-
export function devOpenDeployment(w) {
|
|
168
|
-
return wiredIdentitySources(w).length === 0 && !w.config.traceToken && !DEPLOYMENT_SHAPE_PREDICATES.principalRequired.holds(w.config);
|
|
169
|
-
}
|
|
170
|
-
export function actsForDeployment(req, config, principal) {
|
|
171
|
-
return serviceTokenDeclaredActsForDeployment(config) && systemFor(req, config) !== undefined && principal() === undefined;
|
|
154
|
+
export function actsForDeployment(req, config, subject) {
|
|
155
|
+
return serviceTokenDeclaredActsForDeployment(config) && systemFor(req, config) !== undefined && subject() === undefined;
|
|
172
156
|
}
|
|
173
157
|
export function serviceTokenDeclaredActsForDeployment(config) {
|
|
174
158
|
return config.serviceTokenActsForDeployment === true;
|
|
175
159
|
}
|
|
176
|
-
export function
|
|
177
|
-
const principal = gatedPrincipal(req, w.config);
|
|
178
|
-
return { principal, fleet: devOpenDeployment(w) || actsForDeployment(req, w.config, () => principal) };
|
|
179
|
-
}
|
|
180
|
-
export function fleetViewOf(req, w, face) {
|
|
181
|
-
const caller = sessionCallerOf(req, w);
|
|
182
|
-
const fleetWide = caller.fleet || readOnlyFleetCredential(req, w.config, face);
|
|
183
|
-
return { fleetWide, gateOwner: fleetWide ? null : caller.principal || null };
|
|
184
|
-
}
|
|
185
|
-
function readOnlyFleetCredential(req, config, face) {
|
|
186
|
-
switch (face) {
|
|
187
|
-
case "read":
|
|
188
|
-
return traceTokenPresented(req, config);
|
|
189
|
-
case "write":
|
|
190
|
-
return false;
|
|
191
|
-
default: {
|
|
192
|
-
const unknownFace = face;
|
|
193
|
-
throw new Error(`fleetViewOf: unknown fleet face ${String(unknownFace)}`);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
export function sessionOwnerReadable(caller, cell, w) {
|
|
198
|
-
if (devOpenDeployment(w))
|
|
199
|
-
return true;
|
|
200
|
-
if (cell.owner === null)
|
|
201
|
-
return ownerlessRowOpen(cell, caller);
|
|
202
|
-
return runOwnerReadable(caller.principal, cell.owner, w.config);
|
|
203
|
-
}
|
|
204
|
-
export function explicitOperatorOk(principal, roster) {
|
|
160
|
+
export function explicitOperatorOk(person, roster) {
|
|
205
161
|
if (roster.operatorSingleUser === true)
|
|
206
162
|
return true;
|
|
207
|
-
return roster.operatorPrincipals.length > 0 &&
|
|
163
|
+
return roster.operatorPrincipals.length > 0 && person !== undefined && roster.operatorPrincipals.includes(person);
|
|
208
164
|
}
|
|
209
165
|
export function operatorRosterPresent(roster) {
|
|
210
166
|
return roster.operatorSingleUser === true || roster.operatorPrincipals.length > 0;
|
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* **全仓唯一的拒体组句器**(零依赖叶子模块 —— `http/checkpoint-ctx.ts` 的续跑折叠也读它,而那个模块经编译产物进随包排空脚本,闭包只许 node 内建 / 引擎包根)。
|
|
3
3
|
*
|
|
4
|
-
* 一只拒 = 三件事:机读码、给人读的句子、拒的机读事实(`field` / `reason` / `count` / `cap`
|
|
4
|
+
* 一只拒 = 三件事:机读码、给人读的句子、拒的机读事实(`field` / `reason` / `count` / `cap` …;缺席 = 没有可机读的事实)。
|
|
5
5
|
* 拒体 = `{ error, errorCode, ...facts }`(机读事实原样随体、排在最后)。整面拒(`http/send.ts` 的 `sendError` / `sendHttpError`)、把同一只拒当**数据**带进 200 体的面板
|
|
6
6
|
* (`GET /v1/sessions/:id/mcp` 的 `scenarioRefusal`)、续跑把一只拒折成 409 的 `resume_blocked_by_policy`(`http/checkpoint-ctx.ts`)读的都是它 —— 同一只拒在几处渲出的成员逐字同。
|
|
7
7
|
* 判据只交这份数据,不自己拼体。
|
|
8
|
+
*
|
|
9
|
+
* **版式律(一种)**:机读事实的容器一律在拒体**根上**,容器内部的领域结构原样保留(条目问题的 `problems[]` 每项 `{ code, field, entry, reason }`、
|
|
10
|
+
* 冲突的 `fields[]`、领养的 `conflicts[]`);拒体根上**没有** `detail` 键(对象、串都没有)—— 「哪一臂」是 `reason`,被拒值的坐标是 `field`,
|
|
11
|
+
* 给人读的话进句子。引擎 / 外部对象进拒体只经**闭集映射**(先例 {@link resumeRefusalFacts}),不整只摊。
|
|
12
|
+
* 本层自己铸的请求坐标只有一种写法:{@link fieldCoordinate}。
|
|
13
|
+
*
|
|
14
|
+
* **保留键**({@link REFUSAL_RESERVED_KEYS}):事实不得带这几只顶层键。三处读这一张表 ——
|
|
15
|
+
* · 组句器 {@link refusalBody}(覆盖 `sendError` 与直接调它的交回形):带保留键 ⇒ 抛;
|
|
16
|
+
* · `HttpError` 构造期(`security.ts`):带保留键 ⇒ 构造即抛,落普通 500 臂(早失败);
|
|
17
|
+
* · 出线点(`http/send.ts` 的拒体写口,`sendError` / `sendHttpError` 汇合处):按**最终字节**判({@link refusalWireBytes}),不对 ⇒ 不抛、答 500 开面故障。
|
|
18
|
+
* 挡:一切被执行到、经组句器或经那只写口出线的拒体(含扩宽的 `Record`、展开、断言、外部对象、构造后改写、`toJSON` 劫持)。
|
|
19
|
+
* 不挡:没被执行到的路径;组句之后、不经那只写口出线的交回体上的就地改写。
|
|
8
20
|
*/
|
|
9
21
|
export interface Refusal {
|
|
10
22
|
readonly errorCode: string;
|
|
@@ -16,8 +28,29 @@ export type RefusalBody = {
|
|
|
16
28
|
readonly error: string;
|
|
17
29
|
readonly errorCode: string;
|
|
18
30
|
} & Record<string, unknown>;
|
|
19
|
-
/**
|
|
31
|
+
/**
|
|
32
|
+
* 事实不得带的顶层键(一张表,三处读 —— 见文件头):`error` / `errorCode` = 体头(事实摊在头之后,同名即盖掉码或句);`detail` = 退役的包装位(版式律:根上没有它);
|
|
33
|
+
* `toJSON` = 摊上体顶层就接管整只体的序列化(体出线时被换成它的返回值)。
|
|
34
|
+
*/
|
|
35
|
+
export declare const REFUSAL_RESERVED_KEYS: readonly ["error", "errorCode", "detail", "toJSON"];
|
|
36
|
+
export type RefusalReservedKey = (typeof REFUSAL_RESERVED_KEYS)[number];
|
|
37
|
+
/** 一份事实里第一只保留键(按自有可枚举键读 —— 与展开读的是同一组键);没有 ⇒ `undefined`。 */
|
|
38
|
+
export declare function refusalReservedKeyOf(facts: Readonly<Record<string, unknown>>): RefusalReservedKey | undefined;
|
|
39
|
+
/** 带保留键的事实的那一句(组句器与 `HttpError` 构造期同一句;只点名码与键,不带值)。 */
|
|
40
|
+
export declare function refusalReservedKeyMessage(errorCode: string, key: RefusalReservedKey): string;
|
|
41
|
+
/** 拒体:`{ error, errorCode, ...facts }`。事实带保留键 ⇒ 抛(见文件头)。 */
|
|
20
42
|
export declare function refusalBody(r: Refusal): RefusalBody;
|
|
43
|
+
/**
|
|
44
|
+
* 一只拒出线的**最终字节**(出线点的唯一读法):组句({@link refusalBody})→ 序列化 → 按序列化之后读回的顶层键判,逐只读保留键表 —— 顶层不是对象、
|
|
45
|
+
* `error` / `errorCode` 不是这只拒的句与码、根上有表里其余的键(`detail` / `toJSON`)⇒ 抛。按字节判而不是按对象判:构造后被改写的事实、`toJSON`、
|
|
46
|
+
* 读一次变一次的成员(组句前不可枚举、展开途中才变可枚举的键),在这里读到的就是线上的那一份。
|
|
47
|
+
*/
|
|
48
|
+
export declare function refusalWireBytes(r: Refusal): string;
|
|
49
|
+
/**
|
|
50
|
+
* 请求坐标的 stringify(`settings.hooks` 面的拒体 `field`、拒句里的坐标与 `unknownKeys` 都经它;其余各面的 `field` 今天仍是各面手拼的串,没有改走这里):`root` 之后逐段 —— 数字段 `[n]`;不含 `.` `[` `]` `"`、空白、控制字符的非空串段 `.seg`;
|
|
51
|
+
* 其余串段 `[<JSON 串>]`(`settings.hooks["Pre.Tool"][0]`)。坐标是不透明定位串,消费方不反解;段里的调用方文本先由各面自己的回显口径收(本函数不脱敏、不截断)。
|
|
52
|
+
*/
|
|
53
|
+
export declare function fieldCoordinate(root: string, segs: readonly (string | number)[]): string;
|
|
21
54
|
/**
|
|
22
55
|
* 引擎拒一次续跑时的**机读事实位** → 拒体的同名事实键(唯一读法;续跑家族的每一只拒答都读它):
|
|
23
56
|
* `detail.code` ⇒ `blockedBy`(挡住它的准入码)· `detail.field` ⇒ `field`(哪一侧 / 哪一格)· `detail.reason` ⇒ `reason`(同码多臂时哪一臂)·
|
|
@@ -1,6 +1,40 @@
|
|
|
1
|
+
export const REFUSAL_RESERVED_KEYS = ["error", "errorCode", "detail", "toJSON"];
|
|
2
|
+
export function refusalReservedKeyOf(facts) {
|
|
3
|
+
return REFUSAL_RESERVED_KEYS.find((k) => Object.prototype.propertyIsEnumerable.call(facts, k));
|
|
4
|
+
}
|
|
5
|
+
export function refusalReservedKeyMessage(errorCode, key) {
|
|
6
|
+
return `refusal ${errorCode}: its facts carry the reserved key "${key}" — a refusal's facts sit at the root of its body beside error / errorCode, never under detail`;
|
|
7
|
+
}
|
|
1
8
|
export function refusalBody(r) {
|
|
9
|
+
if (r.facts !== undefined) {
|
|
10
|
+
const reserved = refusalReservedKeyOf(r.facts);
|
|
11
|
+
if (reserved !== undefined)
|
|
12
|
+
throw new TypeError(refusalReservedKeyMessage(r.errorCode, reserved));
|
|
13
|
+
}
|
|
2
14
|
return { error: r.message, errorCode: r.errorCode, ...r.facts };
|
|
3
15
|
}
|
|
16
|
+
export function refusalWireBytes(r) {
|
|
17
|
+
const bytes = JSON.stringify(refusalBody(r));
|
|
18
|
+
const back = JSON.parse(bytes);
|
|
19
|
+
if (back === null || typeof back !== "object" || Array.isArray(back))
|
|
20
|
+
throw new TypeError(`refusal ${r.errorCode}: its body did not serialize as an object`);
|
|
21
|
+
const top = back;
|
|
22
|
+
const onWire = { error: r.message, errorCode: r.errorCode, detail: undefined, toJSON: undefined };
|
|
23
|
+
for (const key of REFUSAL_RESERVED_KEYS) {
|
|
24
|
+
const own = onWire[key];
|
|
25
|
+
if (own === undefined ? Object.hasOwn(top, key) : top[key] !== own) {
|
|
26
|
+
throw new TypeError(own === undefined ? refusalReservedKeyMessage(r.errorCode, key) : `refusal ${r.errorCode}: its serialized body does not carry its own ${key}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return bytes;
|
|
30
|
+
}
|
|
31
|
+
export function fieldCoordinate(root, segs) {
|
|
32
|
+
let out = root;
|
|
33
|
+
for (const seg of segs)
|
|
34
|
+
out += typeof seg === "number" ? `[${seg}]` : PLAIN_SEGMENT.test(seg) ? `.${seg}` : `[${JSON.stringify(seg)}]`;
|
|
35
|
+
return out;
|
|
36
|
+
}
|
|
37
|
+
const PLAIN_SEGMENT = /^[^.[\]"\s\p{Cc}]+$/u;
|
|
4
38
|
export function resumeRefusalFacts(detail) {
|
|
5
39
|
if (typeof detail !== "object" || detail === null)
|
|
6
40
|
return {};
|
|
@@ -4,12 +4,13 @@
|
|
|
4
4
|
* ctx 字段 1 只(`deps`):本族对外围的耦合就这一格,它也是这一族的可测性读数。
|
|
5
5
|
*/
|
|
6
6
|
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
7
|
-
import { type SessionOwnerCell } from "../security.js";
|
|
8
7
|
import { type RefusalBody } from "./refusal-body.js";
|
|
8
|
+
import type { Person } from "../owner-brands.js";
|
|
9
9
|
import type { FlatServiceDeps } from "./server.js";
|
|
10
10
|
import type { LeaseRefusalAdmission } from "../fleet-lease.js";
|
|
11
11
|
import { type QuotaDecision } from "../observability/cost-quota.js";
|
|
12
12
|
import { type SqlWallSource, type SqlWallsReading } from "../plugins/sql-driver.js";
|
|
13
|
+
import type { TerminalSeat } from "./route-ctx.js";
|
|
13
14
|
/**
|
|
14
15
|
* 受理口对一份提交体的库墙判决:被哪一堵墙拒、量到多少、门限多少。提交体要整只落进库 —— 会话日志的用户消息、durable 审批部署上的续跑输入 ——
|
|
15
16
|
* 所以每堵墙各量各的、**量的是店真正发出去的东西**,`null` 的墙不参与(PG 两堵都是 `null`;InnoDB 的行墙是 `null`、包墙在;TiDB 两堵都在):
|
|
@@ -76,30 +77,25 @@ export declare function createRequestGuards(ctx: {
|
|
|
76
77
|
deps: FlatServiceDeps;
|
|
77
78
|
}): {
|
|
78
79
|
quotaExceeded: (req: IncomingMessage, res: ServerResponse) => boolean;
|
|
79
|
-
ownerCostQuotaDenied: (
|
|
80
|
+
ownerCostQuotaDenied: (person: Person | undefined) => {
|
|
80
81
|
status: number;
|
|
81
82
|
body: object;
|
|
82
83
|
} | undefined;
|
|
83
|
-
ownerFleetLeaseDenied: (
|
|
84
|
+
ownerFleetLeaseDenied: (person: Person | undefined) => Promise<{
|
|
84
85
|
status: number;
|
|
85
86
|
body: object;
|
|
86
87
|
} | undefined>;
|
|
87
|
-
ownerLeaseDenied: (res: ServerResponse,
|
|
88
|
-
ownerQuotaDenied: (res: ServerResponse,
|
|
89
|
-
leaseDenied: (req: IncomingMessage, res: ServerResponse) => Promise<boolean>;
|
|
90
|
-
usageWindowDenialFor: (
|
|
88
|
+
ownerLeaseDenied: (res: ServerResponse, person: Person | undefined) => Promise<boolean>;
|
|
89
|
+
ownerQuotaDenied: (res: ServerResponse, person: Person | undefined) => boolean;
|
|
90
|
+
leaseDenied: (req: IncomingMessage, res: ServerResponse, seat?: TerminalSeat) => Promise<boolean>;
|
|
91
|
+
usageWindowDenialFor: (person: Person | undefined) => Promise<{
|
|
91
92
|
status: number;
|
|
92
93
|
body: RefusalBody;
|
|
93
94
|
retryAfterSec: number;
|
|
94
95
|
} | undefined>;
|
|
95
|
-
usageWindowDenied: (req: IncomingMessage, res: ServerResponse) => Promise<boolean>;
|
|
96
|
+
usageWindowDenied: (req: IncomingMessage, res: ServerResponse, seat?: TerminalSeat) => Promise<boolean>;
|
|
96
97
|
rateLimited: (req: IncomingMessage, res: ServerResponse) => boolean;
|
|
97
98
|
safeDecode: (seg: string) => string | null;
|
|
98
|
-
runOwnerOk: (req: IncomingMessage, res: ServerResponse, owner: string | null) => boolean;
|
|
99
|
-
sessionOwnerOk: (req: IncomingMessage, res: ServerResponse, cell: SessionOwnerCell) => boolean;
|
|
100
|
-
runSessionAcceptOk: (req: IncomingMessage, res: ServerResponse, run: {
|
|
101
|
-
sessionId: string | null;
|
|
102
|
-
}, face: string, notFoundError?: string) => boolean;
|
|
103
99
|
readJson: (req: IncomingMessage) => Promise<unknown>;
|
|
104
100
|
readRawBody: (req: IncomingMessage, max: number) => Promise<Buffer>;
|
|
105
101
|
};
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import { GLOBAL_USAGE_KEY, usageRetryAfterMs } from "@sema-agent/core";
|
|
2
2
|
import { createCodedHttpError, principalFrom } from "../security.js";
|
|
3
|
-
import { RUN_NOT_FOUND_MESSAGE, SESSION_NOT_FOUND_MESSAGE } from "./route-ctx.js";
|
|
4
3
|
import { invalidJsonError, sendError } from "./send.js";
|
|
5
4
|
import { refusalBody } from "./refusal-body.js";
|
|
6
5
|
import { limitFactsUnmeasured } from "../limit-refusal.js";
|
|
7
|
-
import {
|
|
8
|
-
import { runRowReadable } from "./owner-access.js";
|
|
9
|
-
import { DEPLOYMENT_SHAPE_PREDICATES } from "../deployment-shape.js";
|
|
6
|
+
import { gatedPerson } from "./principal-gate.js";
|
|
10
7
|
import { quotaWindowResetsAt } from "../observability/cost-quota.js";
|
|
11
8
|
import { escapedStatementBytes, packetWallStatementBytes, rowWallPayloadBytes } from "../plugins/sql-driver.js";
|
|
12
9
|
import { MAX_JSON_BODY_BYTES } from "../json-body-limit.js";
|
|
10
|
+
import { deliverVia } from "../submission-exit.js";
|
|
11
|
+
import { canonicalAddress } from "../net-address.js";
|
|
13
12
|
export function refuseSubmitBody(walls, body) {
|
|
14
13
|
const rowWall = walls.maxRowBytes;
|
|
15
14
|
const packetWall = walls.maxPacketBytes;
|
|
@@ -73,10 +72,10 @@ export function createRequestGuards(ctx) {
|
|
|
73
72
|
function quotaExceeded(req, res) {
|
|
74
73
|
if (!deps.costQuota)
|
|
75
74
|
return false;
|
|
76
|
-
const
|
|
77
|
-
if (!
|
|
75
|
+
const person = gatedPerson(req, deps.config);
|
|
76
|
+
if (!person)
|
|
78
77
|
return false;
|
|
79
|
-
const d = deps.costQuota.check(
|
|
78
|
+
const d = deps.costQuota.check(person);
|
|
80
79
|
if (d.allowed)
|
|
81
80
|
return false;
|
|
82
81
|
deps.metrics?.inc("cost_quota_rejected_total");
|
|
@@ -86,37 +85,37 @@ export function createRequestGuards(ctx) {
|
|
|
86
85
|
sendError(res, status, errorCode, error, extra);
|
|
87
86
|
return true;
|
|
88
87
|
}
|
|
89
|
-
function ownerCostQuotaDenied(
|
|
90
|
-
if (!deps.costQuota || !
|
|
88
|
+
function ownerCostQuotaDenied(person) {
|
|
89
|
+
if (!deps.costQuota || !person)
|
|
91
90
|
return undefined;
|
|
92
|
-
const d = deps.costQuota.check(
|
|
91
|
+
const d = deps.costQuota.check(person);
|
|
93
92
|
if (d.allowed)
|
|
94
93
|
return undefined;
|
|
95
94
|
deps.metrics?.inc("cost_quota_rejected_total");
|
|
96
95
|
return costQuotaRefusalOf(d);
|
|
97
96
|
}
|
|
98
|
-
async function ownerFleetLeaseDenied(
|
|
99
|
-
if (!deps.fleetLease || !
|
|
97
|
+
async function ownerFleetLeaseDenied(person) {
|
|
98
|
+
if (!deps.fleetLease || !person)
|
|
100
99
|
return undefined;
|
|
101
|
-
const adm = await deps.fleetLease.admit(
|
|
100
|
+
const adm = await deps.fleetLease.admit(person);
|
|
102
101
|
if (adm.ok)
|
|
103
102
|
return undefined;
|
|
104
103
|
deps.metrics?.inc("fleet_lease_rejected_total");
|
|
105
104
|
const refusal = leaseRefusalOf(adm);
|
|
106
105
|
return { status: refusal.status, body: refusal.body };
|
|
107
106
|
}
|
|
108
|
-
async function ownerLeaseDenied(res,
|
|
109
|
-
if (!deps.fleetLease || !
|
|
107
|
+
async function ownerLeaseDenied(res, person) {
|
|
108
|
+
if (!deps.fleetLease || !person)
|
|
110
109
|
return false;
|
|
111
|
-
const adm = await deps.fleetLease.admit(
|
|
110
|
+
const adm = await deps.fleetLease.admit(person);
|
|
112
111
|
if (adm.ok)
|
|
113
112
|
return false;
|
|
114
113
|
deps.metrics?.inc("fleet_lease_rejected_total");
|
|
115
114
|
sendLeaseRefusal(res, leaseRefusalOf(adm));
|
|
116
115
|
return true;
|
|
117
116
|
}
|
|
118
|
-
function ownerQuotaDenied(res,
|
|
119
|
-
const denial = ownerCostQuotaDenied(
|
|
117
|
+
function ownerQuotaDenied(res, person) {
|
|
118
|
+
const denial = ownerCostQuotaDenied(person);
|
|
120
119
|
if (!denial)
|
|
121
120
|
return false;
|
|
122
121
|
const { errorCode, error, ...extras } = denial.body;
|
|
@@ -124,20 +123,22 @@ export function createRequestGuards(ctx) {
|
|
|
124
123
|
sendError(res, denial.status, errorCode, error, extras);
|
|
125
124
|
return true;
|
|
126
125
|
}
|
|
127
|
-
async function leaseDenied(req, res) {
|
|
126
|
+
async function leaseDenied(req, res, seat) {
|
|
128
127
|
if (!deps.fleetLease)
|
|
129
128
|
return false;
|
|
130
|
-
const
|
|
131
|
-
if (!
|
|
129
|
+
const person = gatedPerson(req, deps.config);
|
|
130
|
+
if (!person)
|
|
132
131
|
return false;
|
|
133
|
-
const adm = await deps.fleetLease.admit(
|
|
132
|
+
const adm = await deps.fleetLease.admit(person);
|
|
134
133
|
if (adm.ok)
|
|
135
134
|
return false;
|
|
136
135
|
deps.metrics?.inc("fleet_lease_rejected_total");
|
|
137
|
-
|
|
136
|
+
const refusal = leaseRefusalOf(adm);
|
|
137
|
+
await deliverVia(seat, () => sendLeaseRefusal(res, refusal));
|
|
138
138
|
return true;
|
|
139
139
|
}
|
|
140
|
-
async function usageWindowDenialFor(
|
|
140
|
+
async function usageWindowDenialFor(person) {
|
|
141
|
+
const key = person || GLOBAL_USAGE_KEY;
|
|
141
142
|
const store = deps.usageWindowStore;
|
|
142
143
|
const windows = deps.config.usageWindows;
|
|
143
144
|
if (!store || !windows || windows.length === 0)
|
|
@@ -157,18 +158,21 @@ export function createRequestGuards(ctx) {
|
|
|
157
158
|
const retryAfterSec = Math.max(1, Math.ceil(retryAfterMs / 1000));
|
|
158
159
|
return { status: 429, body: refusalBody({ errorCode: "usage.window_exhausted", message: "usage window exhausted (deployment token governance)", facts: { retryAfterSec } }), retryAfterSec };
|
|
159
160
|
}
|
|
160
|
-
async function usageWindowDenied(req, res) {
|
|
161
|
-
const denial = await usageWindowDenialFor(
|
|
161
|
+
async function usageWindowDenied(req, res, seat) {
|
|
162
|
+
const denial = await usageWindowDenialFor(gatedPerson(req, deps.config));
|
|
162
163
|
if (!denial)
|
|
163
164
|
return false;
|
|
164
|
-
|
|
165
|
-
|
|
165
|
+
await deliverVia(seat, () => {
|
|
166
|
+
res.setHeader("retry-after", String(denial.retryAfterSec));
|
|
167
|
+
sendError(res, denial.status, denial.body.errorCode, denial.body.error, { retryAfterSec: denial.retryAfterSec });
|
|
168
|
+
});
|
|
166
169
|
return true;
|
|
167
170
|
}
|
|
168
171
|
function rateLimited(req, res) {
|
|
169
172
|
if (!deps.rateLimiter)
|
|
170
173
|
return false;
|
|
171
|
-
const
|
|
174
|
+
const peer = req.socket.remoteAddress;
|
|
175
|
+
const key = (deps.config.directDoorActive ? undefined : principalFrom(req, deps.config)) ?? (peer === undefined ? "anon" : (canonicalAddress(peer) ?? peer));
|
|
172
176
|
const d = deps.rateLimiter.check(key);
|
|
173
177
|
if (d.allowed)
|
|
174
178
|
return false;
|
|
@@ -185,44 +189,6 @@ export function createRequestGuards(ctx) {
|
|
|
185
189
|
return null;
|
|
186
190
|
}
|
|
187
191
|
}
|
|
188
|
-
function ownerGate(req, res, readable, notFound) {
|
|
189
|
-
const principal = gatedPrincipal(req, deps.config);
|
|
190
|
-
if (DEPLOYMENT_SHAPE_PREDICATES.principalRequired.holds(deps.config) && !principal) {
|
|
191
|
-
sendPrincipalRefusal(res, req, deps.config);
|
|
192
|
-
return false;
|
|
193
|
-
}
|
|
194
|
-
if (!readable(principal)) {
|
|
195
|
-
notFound();
|
|
196
|
-
return false;
|
|
197
|
-
}
|
|
198
|
-
return true;
|
|
199
|
-
}
|
|
200
|
-
function runOwnerOk(req, res, owner) {
|
|
201
|
-
return ownerGate(req, res, (principal) => runRowReadable(deps.config, principal, owner, "owner"), () => sendError(res, 404, "not_found.run", RUN_NOT_FOUND_MESSAGE));
|
|
202
|
-
}
|
|
203
|
-
function sessionOwnerOk(req, res, cell) {
|
|
204
|
-
const caller = sessionCallerOf(req, deps);
|
|
205
|
-
return ownerGate(req, res, () => sessionOwnerReadable(caller, cell, deps), () => sendError(res, 404, "not_found.session", SESSION_NOT_FOUND_MESSAGE));
|
|
206
|
-
}
|
|
207
|
-
const sessionAssertAbsentWarned = new Set();
|
|
208
|
-
function runSessionAcceptOk(req, res, run, face, notFoundError = RUN_NOT_FOUND_MESSAGE) {
|
|
209
|
-
if (!run.sessionId)
|
|
210
|
-
return true;
|
|
211
|
-
const asserted = new URL(req.url ?? "", "http://x").searchParams.get("session");
|
|
212
|
-
if (asserted === null) {
|
|
213
|
-
if (!sessionAssertAbsentWarned.has(face)) {
|
|
214
|
-
sessionAssertAbsentWarned.add(face);
|
|
215
|
-
console.warn(JSON.stringify({ ts: new Date().toISOString(), level: "warn", msg: "run_face_session_assert_absent", face, note: "caller sent no ?session= on a session-bound run — allowed in the accept phase; the enforcement train will 404 this ([1498]⑥/[1499])" }));
|
|
216
|
-
}
|
|
217
|
-
return true;
|
|
218
|
-
}
|
|
219
|
-
if (asserted === run.sessionId)
|
|
220
|
-
return true;
|
|
221
|
-
if (explicitOperatorOk(gatedPrincipal(req, deps.config), deps.config))
|
|
222
|
-
return true;
|
|
223
|
-
sendError(res, 404, "not_found.run", notFoundError);
|
|
224
|
-
return false;
|
|
225
|
-
}
|
|
226
192
|
async function readJson(req) {
|
|
227
193
|
const chunks = [];
|
|
228
194
|
let size = 0;
|
|
@@ -252,6 +218,6 @@ export function createRequestGuards(ctx) {
|
|
|
252
218
|
}
|
|
253
219
|
return Buffer.concat(chunks);
|
|
254
220
|
}
|
|
255
|
-
return { quotaExceeded, ownerCostQuotaDenied, ownerFleetLeaseDenied, ownerLeaseDenied, ownerQuotaDenied, leaseDenied, usageWindowDenialFor, usageWindowDenied, rateLimited, safeDecode,
|
|
221
|
+
return { quotaExceeded, ownerCostQuotaDenied, ownerFleetLeaseDenied, ownerLeaseDenied, ownerQuotaDenied, leaseDenied, usageWindowDenialFor, usageWindowDenied, rateLimited, safeDecode, readJson, readRawBody };
|
|
256
222
|
}
|
|
257
223
|
//# sourceMappingURL=request-guards.js.map
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* **续跑腿接着跑哪一只组合入口** —— 停驻的那条 run 当初是怎么提交的(续跑输入里的提交体),就怎么续:
|
|
3
|
+
* · `verify` —— 验证门(core `resumeWithVerification`:续上实现腿,跑完再验、再修);
|
|
4
|
+
* · `cascade` —— 梯子(core `resumeCascade`:续上停在门上的那一级,再按门判接着往上爬);入参里的那一级 = 卡上记的组合腿(`CheckpointState.compositionLeg`,
|
|
5
|
+
* 「as the card records it」—— 引擎拿它对卡,记的不是这一级 ⇒ 续跑前拒 `resume.composition_mismatch`,卡不动);梯子 = 本部署的 `CASCADE_LADDER`
|
|
6
|
+
* 与提交时同一只 {@link cascadeConfig};
|
|
7
|
+
* 梯子那一臂另带**原目标上挂的输入**({@link CascadeObjectiveInputs}):续上那一级之后的每一级是原任务的冷重跑,core 要的是原 spec(「objective,
|
|
8
|
+
* attachments … included」,自己从续上的那一级剥掉)—— 续跑重建在体那一层剥了它们(一次性动作,`resume-legs.ts` 的一次性键表),这里自提交体照受理口的读法交回;
|
|
9
|
+
* · 缺席 —— 普通腿(`resumeStream`)。
|
|
10
|
+
* 两个入口不并存(受理口拒 `cascade` + `verify` 同在)。读的是提交体与卡,不读店、不抛:提交体说 `cascade` 而卡上没有梯子那一级的记录 ⇒
|
|
11
|
+
* {@link ResumeCompositionUnlinked}(调用方答 409 —— 那张卡不是这条 run 的梯子停下的,续不了;归属读法让它够不着这里,见 `hostSessionOf`)。
|
|
12
|
+
*/
|
|
13
|
+
import type { CascadeConfig, Checkpoint, CompositionLeg, TaskSpec } from "@sema-agent/core";
|
|
14
|
+
import { type VerifyRoundsSpec } from "./verify-rounds.js";
|
|
15
|
+
import type { TaskRequestBody } from "./wire-types.js";
|
|
16
|
+
/**
|
|
17
|
+
* 原目标上挂的输入(提交体的 `userAttachments` / `images`,与受理口装配 `boot/resolve-spec.ts` 同一读法:附件在场才带键,图原样)。梯子续跑交给 core 的 spec
|
|
18
|
+
* 带上它们 —— 续上的那一级 core 自己剥掉附件(耐久续跑不收附件)、续跑路径不读图;之后冷重跑的每一级照原任务收到它们。
|
|
19
|
+
*/
|
|
20
|
+
export type CascadeObjectiveInputs = Pick<TaskSpec, "userAttachments" | "images">;
|
|
21
|
+
/** 续跑腿的组合入口(闭集:加一种入口 ⇒ 读它的 `switch` 编译红)。 */
|
|
22
|
+
export type ResumeComposition = {
|
|
23
|
+
readonly entry: "verify";
|
|
24
|
+
readonly rounds: VerifyRoundsSpec;
|
|
25
|
+
} | {
|
|
26
|
+
readonly entry: "cascade";
|
|
27
|
+
readonly config: CascadeConfig;
|
|
28
|
+
readonly parkedLeg: CompositionLeg;
|
|
29
|
+
readonly objectiveInputs: CascadeObjectiveInputs;
|
|
30
|
+
};
|
|
31
|
+
/** 提交体说 `cascade`,卡上却没有梯子那一级的记录:这张卡续不了这条 run 的梯子。 */
|
|
32
|
+
export interface ResumeCompositionUnlinked {
|
|
33
|
+
readonly entry: "cascade_unlinked";
|
|
34
|
+
}
|
|
35
|
+
/** 这条 run 的组合入口(见模块头注);`undefined` = 普通腿。 */
|
|
36
|
+
export declare function resumeCompositionOf(body: Pick<TaskRequestBody, "verify" | "verifyRounds" | "maxCostUsd" | "cascade" | "userAttachments" | "images">, card: Pick<Checkpoint, "state">, cascadeLadder: readonly string[]): ResumeComposition | ResumeCompositionUnlinked | undefined;
|
|
37
|
+
//# sourceMappingURL=resume-composition.d.ts.map
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { cascadeConfig } from "./run-meta.js";
|
|
2
|
+
import { verifyRoundsFromBody } from "./verify-rounds.js";
|
|
3
|
+
export function resumeCompositionOf(body, card, cascadeLadder) {
|
|
4
|
+
const rounds = verifyRoundsFromBody(body);
|
|
5
|
+
if (rounds !== undefined)
|
|
6
|
+
return { entry: "verify", rounds };
|
|
7
|
+
if (body.cascade !== true)
|
|
8
|
+
return undefined;
|
|
9
|
+
const leg = card.state?.compositionLeg;
|
|
10
|
+
if (typeof leg !== "object" || leg === null || leg.entry !== "cascade")
|
|
11
|
+
return { entry: "cascade_unlinked" };
|
|
12
|
+
const objectiveInputs = {
|
|
13
|
+
...(body.userAttachments !== undefined ? { userAttachments: body.userAttachments } : {}),
|
|
14
|
+
...(body.images !== undefined ? { images: body.images } : {}),
|
|
15
|
+
};
|
|
16
|
+
return { entry: "cascade", config: cascadeConfig(cascadeLadder, body.maxCostUsd), parkedLeg: leg, objectiveInputs };
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=resume-composition.js.map
|
|
@@ -6,21 +6,22 @@
|
|
|
6
6
|
* 机制上「坏体不再与缺席同答」成立,**用户面上不成立**(用户拿到的还是同一个 409)。判据要钉用户实际
|
|
7
7
|
* 拿到的码,这只铸点就是让那句判据有地方落(test [ref] 的判据订正,当拍采纳)。
|
|
8
8
|
*
|
|
9
|
-
*
|
|
9
|
+
* 各态与各自的理由(店边界的读失败**怎么分类只在一处答**:整仓唯一的店故障判官 `plugins/store-fault.ts` 的 `storeFaultClassOf`,
|
|
10
|
+
* 本口按它的五词逐词落地 —— 一张穷举 `switch`,判官加词而这里不表态 = 编译错;本口自己不认任何错误类):
|
|
10
11
|
* · `ok` —— 读出来了。
|
|
11
|
-
* · `absent` ——
|
|
12
|
-
* (
|
|
13
|
-
*
|
|
14
|
-
* · `corrupt` ——
|
|
12
|
+
* · `absent` —— 店答了「这一行不在」(`null`;`reapCtx` 按设计在 run 终态后删掉它)。**只有**店的这一句答才是缺席:
|
|
13
|
+
* 读失败证不出它在,也证不出它不在,所以不进这一态(修前把连接 / 超时 / 权限 / 店抖动一并读成缺席 —— 断连下续跑被答成
|
|
14
|
+
* 「续跑上下文没了,作为新任务重提」,出路说错,且与判官对同一只错的读法是两份)。
|
|
15
|
+
* · `corrupt` —— 判官的 `corrupt`(店的**拒绝契约** `StoreCorruptError`,`kind:"corrupt"` + 坐标)。
|
|
15
16
|
* **不折成缺席**:两者的运维动作完全不同(前者去查那一行,后者什么都不用做)。
|
|
16
|
-
*
|
|
17
|
-
*
|
|
17
|
+
* · `unreadable` —— 判官的 `connection` / `deployment` / `unclassified`:这一次读失败了(库断连 / 拒连 / 超时、缺表 / 权限拒、
|
|
18
|
+
* 认不出的库错)。各续跑入口答 {@link resumeCtxUnreadableAnswer}(503 `state.resume_context_unreadable`):这一请求没有执行,稍后重发 ——
|
|
19
|
+
* 与审批队列读口对「此刻读不出」的读法同一条(判官的这三词并成一个答;[ref] 方向锚「拒绝可重试,搁浅不可」照旧成立:拒在任何状态改动之前)。
|
|
20
|
+
* · 判官的 `defect`(本服务自己的程序错:运行时的六只原生错误类、读腿漂移 `SqlJsonColumnError` 的 `not-text`)⇒ **原样上抛**,响亮成 500 ——
|
|
21
|
+
* 不许伪装成「数据坏了」,也不许折成「此刻读不出」或缺席(那会让一次代码漂看起来像「这条会话没有上下文」,或劝人重试一件注定失败的事)。
|
|
18
22
|
*
|
|
19
|
-
* 🔴 **按「店的拒绝形」分类,不按「列错误类」**([ref],7.95.1
|
|
20
|
-
*
|
|
21
|
-
* 早把列错误**折**成了一只普通 `Error` ⇒ 折后的错落进下面那条「店抖动 ⇒ 当缺席」臂,坏体与缺席在
|
|
22
|
-
* 用户面上仍然同答 409 —— 正是 [ref] 第二半要修的那个病,只是它当时只在 local 车道上修成了(那一侧
|
|
23
|
-
* 恰好没折码,把列错误漏了出来 = 巧合式正确)。两条车道现在同一份拒绝契约,本口只认它。
|
|
23
|
+
* 🔴 **按「店的拒绝形」分类,不按「列错误类」**([ref],7.95.1)。SQL 两孪生的 `refusing()` 把列错误**折**成店的拒绝契约,
|
|
24
|
+
* 两条车道同一份拒绝契约;判官认的就是它(`corrupt`),本口不再持有自己的那一份。
|
|
24
25
|
*
|
|
25
26
|
* 🔴 **第四态 `unsealable`([ref],7.134.0):读出来了,但凭据位上的封签开不开**。店交出的是**落盘形**(凭据位上是封签,`StoredCheckpointCtx`);
|
|
26
27
|
* 本口在任何消费者看到之前经**唯一**开口 `openCheckpointCtx` 开封(规则属主 = `checkpoint-ctx.ts` 末段「凭据位密封」)—— 所以 `ok` 交出的恒是开封形,
|
|
@@ -43,6 +44,8 @@ export type ResumeCtxRead = {
|
|
|
43
44
|
} | {
|
|
44
45
|
readonly kind: "corrupt";
|
|
45
46
|
readonly where: string;
|
|
47
|
+
} | {
|
|
48
|
+
readonly kind: "unreadable";
|
|
46
49
|
} | {
|
|
47
50
|
readonly kind: "unsealable";
|
|
48
51
|
readonly field: string;
|
|
@@ -54,6 +57,26 @@ export interface CheckpointCtxOpening {
|
|
|
54
57
|
readonly opener: CheckpointCtxOpener | undefined;
|
|
55
58
|
}
|
|
56
59
|
export declare function readResumeCtx(load: Promise<StoredCheckpointCtx | null>, opening: CheckpointCtxOpening): Promise<ResumeCtxRead>;
|
|
60
|
+
/**
|
|
61
|
+
* 续跑家族一次店读失败的落点 —— 判官的五词逐词表态,**只在这一处**(本口读续跑上下文那一读,与续跑腿读「这张卡归哪条 run」那一读同读它):
|
|
62
|
+
* `corrupt` ⇒ 坏体(带坐标);`connection` / `deployment` / `unclassified` ⇒ 读不出;`defect` ⇒ 原样上抛。
|
|
63
|
+
*/
|
|
64
|
+
export declare function resumeStoreReadFailureOf(e: unknown): {
|
|
65
|
+
readonly kind: "corrupt";
|
|
66
|
+
readonly where: string;
|
|
67
|
+
} | {
|
|
68
|
+
readonly kind: "unreadable";
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* 读失败的对外答复 —— 503 `state.resume_context_unreadable`:这一次读这条会话的续跑上下文失败了(判官的 `connection` / `deployment` / `unclassified`),
|
|
72
|
+
* 这一请求**没有执行**(拒在任何状态改动之前:卡仍待决、行字节不动、一次性 nonce 未烧),稍后原样重发;一直如此 ⇒ 请运维查库。句子不带店层 detail(内部机件不上 wire,[ref] 同律)。
|
|
73
|
+
* 全部续跑入口与终态 steer 的铸卡证明腿同一只答(码 / 句同源)。
|
|
74
|
+
* 🔴 形是给冻结门看的(与 {@link resumeCtxCorruptAnswer} 同一条):`status: <三位数>, body: refusalBody({ errorCode: "<码>", message: "<整句双引号字面>"`,中间只许有空白。
|
|
75
|
+
*/
|
|
76
|
+
export declare function resumeCtxUnreadableAnswer(): {
|
|
77
|
+
status: number;
|
|
78
|
+
body: RefusalBody;
|
|
79
|
+
};
|
|
57
80
|
/**
|
|
58
81
|
* 开不开的对外答复([ref])—— 409 `conflict.checkpoint_ctx_unsealable`,机读 `field`(哪一个凭据位,提交体路径;键名不是秘密,值从不进来)+ `reason`
|
|
59
82
|
* (闭集 `CHECKPOINT_CTX_UNSEALABLE_REASONS`)。句子说「这条任务的续跑上下文里带的凭据本服务开不开」、五种成因与出路(按 `reason` 修好保管目录后原样重发,
|