@sema-agent/server 7.146.0 → 7.148.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MIGRATION.md +1423 -24
- package/README.md +21 -8
- package/README.zh-CN.md +15 -9
- package/USAGE.md +537 -216
- package/deploy/facts/lanes.json +7 -0
- package/deploy/sema-up/README.md +18 -7
- package/deploy/sema-up/chart/templates/NOTES.txt +1 -1
- package/deploy/sema-up/chart/templates/_helpers.tpl +42 -4
- package/deploy/sema-up/chart/templates/server-v4pro.yaml +5 -4
- package/deploy/sema-up/chart/templates/server.yaml +5 -4
- package/deploy/sema-up/chart/values.yaml +4 -3
- package/deploy/sema-up/cluster-up.sh +75 -176
- package/deploy/sema-up/kube-up.sh +29 -49
- package/deploy/sema-up/lib/chart-run.sh +23 -0
- package/deploy/sema-up/lib/dataroot.sh +3 -3
- package/deploy/sema-up/lib/flagshape.sh +4 -0
- package/deploy/sema-up/lib/health.sh +62 -13
- package/deploy/sema-up/lib/helm-values-cluster.py +18 -0
- package/deploy/sema-up/lib/helm-values-kube.py +35 -0
- package/deploy/sema-up/lib/lanes.json +2 -5
- package/deploy/sema-up/lib/regcred.py +8 -0
- package/deploy/sema-up/lib/remote/helm-install.sh +3 -0
- package/deploy/sema-up/lib/remote/image-import.sh +6 -0
- package/deploy/sema-up/lib/remote/machine-precheck.sh +11 -0
- package/deploy/sema-up/lib/remote/region-probe.sh +3 -0
- package/deploy/sema-up/lib/remote/stack-ready.sh +26 -0
- package/deploy/sema-up/lib/remote/vxlan-guard.sh +8 -0
- package/deploy/sema-up/lib/render-stack.py +17 -0
- package/deploy/sema-up/lib/shell-text.sh +87 -0
- package/deploy/sema-up/lib/usage-flags.txt +10 -0
- package/deploy/sema-up/lib/usage-head.txt +1 -0
- package/deploy/sema-up/lib/usage-tail.txt +13 -0
- package/deploy/sema-up/preflight.sh +10 -8
- package/deploy/sema-up/sema-up.sh +26 -48
- package/deploy/sema-up/smoke.sh +7 -6
- package/deploy/sema-up/stack/compose.dataroot.yaml +3 -0
- package/deploy/sema-up/stack/compose.yaml +18 -5
- package/deploy/sema-up/stack/sema-stack-cluster.yaml +25 -3
- package/dist/adoption/plan.d.ts +24 -0
- package/dist/adoption/plan.js +53 -1
- package/dist/adoption/runner.d.ts +10 -1
- package/dist/adoption/runner.js +36 -16
- package/dist/adoption/wire.d.ts +3 -3
- package/dist/approval-card.d.ts +32 -34
- package/dist/approval-gate-currency.js +3 -2
- package/dist/approval-reconciler.d.ts +4 -13
- package/dist/approval-reconciler.js +2 -2
- package/dist/approval.d.ts +16 -14
- package/dist/approval.js +3 -3
- package/dist/audit.d.ts +10 -3
- package/dist/audit.js +17 -9
- package/dist/auth-bridge.d.ts +0 -14
- package/dist/auth-bridge.js +0 -7
- package/dist/auto-mode-face.d.ts +10 -7
- package/dist/auto-mode-face.js +7 -4
- package/dist/background-agent-name.d.ts +19 -1
- package/dist/background-agent-name.js +12 -2
- package/dist/background-session-reap.d.ts +1 -1
- package/dist/bake-runner/main.js +9 -6
- package/dist/bench/s1/arms.js +6 -5
- package/dist/bench/s1/live-deps.js +8 -3
- package/dist/bench/s1/run-firm.js +6 -5
- package/dist/bind-host.d.ts +25 -0
- package/dist/bind-host.js +25 -0
- package/dist/boot/adoption.d.ts +3 -0
- package/dist/boot/adoption.js +1 -0
- package/dist/boot/crash-last.js +2 -1
- package/dist/boot/deployment-mods.d.ts +1 -1
- package/dist/boot/device-lane.js +5 -5
- package/dist/boot/engine-lease.d.ts +12 -11
- package/dist/boot/execution-env.d.ts +19 -8
- package/dist/boot/execution-env.js +80 -62
- package/dist/boot/execution-lane.d.ts +37 -9
- package/dist/boot/execution-lane.js +74 -20
- package/dist/boot/exit-boundary.d.ts +3 -3
- package/dist/boot/exit-boundary.js +6 -5
- package/dist/boot/exit-last.js +2 -1
- package/dist/boot/fatal-exit.d.ts +3 -5
- package/dist/boot/fatal-exit.js +2 -2
- package/dist/boot/governance-seams.d.ts +2 -2
- package/dist/boot/leader.d.ts +15 -0
- package/dist/boot/leader.js +18 -16
- package/dist/boot/memory-boundary.d.ts +11 -11
- package/dist/boot/memory-boundary.js +3 -3
- package/dist/boot/memory-consolidation.d.ts +50 -53
- package/dist/boot/memory-consolidation.js +11 -18
- package/dist/boot/org-memory.js +4 -3
- package/dist/boot/parked-revive-gate.d.ts +1 -1
- package/dist/boot/parked-revive-gate.js +3 -3
- package/dist/boot/reapers.d.ts +4 -3
- package/dist/boot/reapers.js +20 -17
- package/dist/boot/resolve-spec.d.ts +5 -3
- package/dist/boot/resolve-spec.js +133 -165
- package/dist/boot/retention-lane.d.ts +7 -45
- package/dist/boot/retention-lane.js +2 -2
- package/dist/boot/runner-deps.d.ts +28 -7
- package/dist/boot/runner-deps.js +11 -4
- package/dist/boot/runtime-caps.d.ts +2 -2
- package/dist/boot/runtime-caps.js +16 -2
- package/dist/boot/session-faces.d.ts +17 -7
- package/dist/boot/session-faces.js +122 -96
- package/dist/boot/shutdown.d.ts +5 -4
- package/dist/boot/shutdown.js +6 -4
- package/dist/boot/stage-01-config.d.ts +1 -1
- package/dist/boot/stage-01-config.js +14 -2
- package/dist/boot/stage-02-web-admin-pull.d.ts +2 -1
- package/dist/boot/stage-02-web-admin-pull.js +15 -8
- package/dist/boot/stage-03-store-backend.d.ts +4 -1
- package/dist/boot/stage-03-store-backend.js +4 -3
- package/dist/boot/stage-04-stores.d.ts +3 -1
- package/dist/boot/stage-04-stores.js +2 -2
- package/dist/boot/stage-05-execution-env.d.ts +9 -5
- package/dist/boot/stage-05-execution-env.js +5 -5
- package/dist/boot/stage-06-runners.d.ts +13 -15
- package/dist/boot/stage-06-runners.js +24 -18
- package/dist/boot/stage-07-capability-layer.d.ts +14 -11
- package/dist/boot/stage-07-capability-layer.js +9 -12
- package/dist/boot/stage-08-reapers.d.ts +14 -11
- package/dist/boot/stage-08-reapers.js +3 -3
- package/dist/boot/stage-09-leader.d.ts +16 -18
- package/dist/boot/stage-09-leader.js +12 -4
- package/dist/boot/stage-10-http-server.d.ts +16 -18
- package/dist/boot/stage-10-http-server.js +9 -5
- package/dist/boot/store-evidence.d.ts +20 -0
- package/dist/boot/store-evidence.js +13 -0
- package/dist/boot/stores.d.ts +12 -0
- package/dist/boot/stores.js +39 -17
- package/dist/boot/task-list-lane.d.ts +4 -4
- package/dist/boot/web-admin.d.ts +4 -2
- package/dist/boot/web-admin.js +58 -38
- package/dist/boot/webfetch-summarize-lane.d.ts +1 -1
- package/dist/boot-reclaim.d.ts +3 -1
- package/dist/boot-reclaim.js +1 -1
- package/dist/brain.d.ts +7 -18
- package/dist/brain.js +5 -17
- package/dist/budget.js +6 -6
- package/dist/capabilities/center-plugins.d.ts +9 -1
- package/dist/capabilities/center-plugins.js +37 -11
- package/dist/capabilities/center-wiring.js +1 -1
- package/dist/capabilities/composite-members.d.ts +3 -2
- package/dist/capabilities/composite-members.js +3 -2
- package/dist/capabilities/execution-lane.d.ts +7 -7
- package/dist/capabilities/execution-lane.js +2 -2
- package/dist/capabilities/hands-lane.d.ts +1 -1
- package/dist/capabilities/repo-tools.d.ts +2 -0
- package/dist/capabilities/repo-tools.js +14 -12
- package/dist/capabilities/scenarios.d.ts +38 -33
- package/dist/capabilities/scenarios.js +24 -25
- package/dist/capabilities/settings-contract.d.ts +29 -0
- package/dist/capabilities/settings-contract.js +14 -0
- package/dist/capabilities/skills.d.ts +6 -6
- package/dist/capabilities/tool-defer.d.ts +1 -1
- package/dist/capability-facts.d.ts +69 -4
- package/dist/capability-facts.js +77 -5
- package/dist/card-void.d.ts +4 -4
- package/dist/card-void.js +1 -1
- package/dist/center-credential-renewer.d.ts +6 -2
- package/dist/center-credential-renewer.js +10 -5
- package/dist/config-catalog.d.ts +16 -1
- package/dist/config-catalog.js +68 -61
- package/dist/config-dir-trust.d.ts +37 -4
- package/dist/config-dir-trust.js +88 -44
- package/dist/config-invariants.d.ts +58 -4
- package/dist/config-invariants.js +104 -23
- package/dist/config-lkg.d.ts +24 -2
- package/dist/config-lkg.js +22 -9
- package/dist/config-provider.d.ts +9 -9
- package/dist/config-provider.js +25 -108
- package/dist/config-pull-failure.d.ts +50 -0
- package/dist/config-pull-failure.js +48 -0
- package/dist/config-types.d.ts +215 -202
- package/dist/config.d.ts +69 -14
- package/dist/config.js +188 -96
- package/dist/degenerate-instrument.js +1 -1
- package/dist/delegated-session-owner.d.ts +1 -1
- package/dist/deleted-session-ids.d.ts +3 -2
- package/dist/deploy-facts.js +3 -2
- package/dist/deployment-governance.d.ts +3 -3
- package/dist/deployment-shape.d.ts +51 -16
- package/dist/deployment-shape.js +31 -6
- package/dist/egress-redirect.d.ts +25 -7
- package/dist/egress-redirect.js +20 -2
- package/dist/elicitation.d.ts +6 -5
- package/dist/elicitation.js +23 -22
- package/dist/engine-identity.d.ts +28 -0
- package/dist/engine-identity.js +10 -0
- package/dist/entry-problems.d.ts +5 -7
- package/dist/entry-problems.js +1 -1
- package/dist/env-facts.d.ts +7 -5
- package/dist/env-facts.js +12 -7
- package/dist/env-witness.d.ts +7 -0
- package/dist/env-witness.js +16 -0
- package/dist/execution-config-root.d.ts +5 -5
- package/dist/execution-config-root.js +5 -5
- package/dist/execution-env-purpose.d.ts +14 -0
- package/dist/execution-env-purpose.js +29 -0
- package/dist/execution-lane-caps.d.ts +53 -103
- package/dist/execution-lane-caps.js +51 -83
- package/dist/execution-placement.d.ts +65 -9
- package/dist/execution-placement.js +58 -0
- package/dist/field-conflict.d.ts +7 -11
- package/dist/field-conflict.js +3 -3
- package/dist/file-history-capture.d.ts +3 -3
- package/dist/file-history-disclosure.d.ts +2 -2
- package/dist/file-history-disclosure.js +1 -0
- package/dist/fleet/drain-entry.d.ts +17 -10
- package/dist/fleet/drain-entry.js +1 -1
- package/dist/fleet/fleet-bus.d.ts +21 -3
- package/dist/fleet/fleet-bus.js +35 -25
- package/dist/fleet/fleet-reconciler.js +2 -2
- package/dist/fleet/serving-lease.js +6 -7
- package/dist/fleet-client.js +3 -3
- package/dist/fleet-lease.d.ts +0 -1
- package/dist/fleet-lease.js +4 -5
- package/dist/history-anchor.d.ts +42 -0
- package/dist/history-anchor.js +34 -0
- package/dist/hitl-delivery.d.ts +90 -0
- package/dist/hitl-delivery.js +98 -0
- package/dist/hooks/classic-stations.d.ts +8 -11
- package/dist/hooks/classic-stations.js +0 -7
- package/dist/hooks/command-spawn.d.ts +1 -4
- package/dist/hooks/command-spawn.js +0 -11
- package/dist/hooks/hook-llm.d.ts +5 -1
- package/dist/hooks/hook-llm.js +24 -15
- package/dist/hooks/hook-runner.d.ts +119 -65
- package/dist/hooks/hook-runner.js +415 -217
- package/dist/host-lsp-manager.d.ts +22 -8
- package/dist/host-lsp-manager.js +4 -1
- package/dist/http/active-run-conflict.d.ts +2 -43
- package/dist/http/active-run-conflict.js +3 -7
- package/dist/http/admission.d.ts +4 -18
- package/dist/http/admission.js +75 -78
- package/dist/http/approval-sweeps.d.ts +5 -8
- package/dist/http/approval-sweeps.js +55 -30
- package/dist/http/caller-trust.d.ts +8 -10
- package/dist/http/caller-trust.js +1 -2
- package/dist/http/checkpoint-ctx.d.ts +17 -0
- package/dist/http/checkpoint-ctx.js +6 -0
- package/dist/http/claim-heartbeat.d.ts +49 -0
- package/dist/http/claim-heartbeat.js +46 -0
- package/dist/http/claim-latency.d.ts +10 -0
- package/dist/http/claim-latency.js +12 -0
- package/dist/http/claimed-run.d.ts +4 -3
- package/dist/http/dispatch.d.ts +8 -1
- package/dist/http/dispatch.js +77 -31
- package/dist/http/durable-run-leg.d.ts +3 -3
- package/dist/http/durable-run-leg.js +18 -12
- package/dist/http/execution-context.d.ts +18 -42
- package/dist/http/execution-context.js +11 -5
- package/dist/http/health-reader.d.ts +36 -0
- package/dist/http/health-reader.js +21 -0
- package/dist/http/health-self-report.d.ts +9 -9
- package/dist/http/health-self-report.js +4 -4
- package/dist/http/idempotency.d.ts +9 -5
- package/dist/http/idempotency.js +4 -4
- package/dist/http/memory-compliance-failure-reply.d.ts +15 -16
- package/dist/http/memory-compliance-failure-reply.js +7 -2
- package/dist/http/memory-face-fault-reply.d.ts +67 -0
- package/dist/http/memory-face-fault-reply.js +71 -0
- package/dist/http/memory-store-refusal-reply.d.ts +3 -3
- package/dist/http/memory-store-refusal-reply.js +6 -0
- package/dist/http/owner-access.d.ts +391 -56
- package/dist/http/owner-access.js +372 -33
- package/dist/http/principal-gate.d.ts +26 -94
- package/dist/http/principal-gate.js +24 -81
- package/dist/http/refusal-body.d.ts +35 -2
- package/dist/http/refusal-body.js +34 -0
- package/dist/http/request-guards.d.ts +10 -14
- package/dist/http/request-guards.js +34 -68
- package/dist/http/resume-composition.d.ts +37 -0
- package/dist/http/resume-composition.js +18 -0
- package/dist/http/resume-ctx-read.d.ts +35 -12
- package/dist/http/resume-ctx-read.js +25 -6
- package/dist/http/resume-legs.d.ts +24 -24
- package/dist/http/resume-legs.js +260 -171
- package/dist/http/retired-skill-manifest.d.ts +1 -1
- package/dist/http/rewind-files-reply.d.ts +34 -0
- package/dist/http/rewind-files-reply.js +36 -0
- package/dist/http/route-ctx.d.ts +56 -47
- package/dist/http/route-table.js +2 -0
- package/dist/http/routes/a2a-serve.d.ts +43 -5
- package/dist/http/routes/a2a-serve.js +58 -37
- package/dist/http/routes/admin-config-refresh.js +2 -2
- package/dist/http/routes/admin-drain.js +2 -2
- package/dist/http/routes/admin-memory-optout.js +4 -3
- package/dist/http/routes/adoption.d.ts +3 -0
- package/dist/http/routes/adoption.js +17 -10
- package/dist/http/routes/agents-roster.js +13 -7
- package/dist/http/routes/approvals-assistant.js +73 -88
- package/dist/http/routes/attachments.js +2 -2
- package/dist/http/routes/background.d.ts +3 -3
- package/dist/http/routes/background.js +9 -17
- package/dist/http/routes/capabilities.js +23 -20
- package/dist/http/routes/config-catalog.js +2 -2
- package/dist/http/routes/devices.d.ts +3 -3
- package/dist/http/routes/devices.js +5 -5
- package/dist/http/routes/diagnostics.d.ts +27 -3
- package/dist/http/routes/diagnostics.js +27 -21
- package/dist/http/routes/engine.js +2 -2
- package/dist/http/routes/fleet.js +5 -3
- package/dist/http/routes/images.js +10 -6
- package/dist/http/routes/leader.d.ts +7 -2
- package/dist/http/routes/leader.js +12 -3
- package/dist/http/routes/mcp-reconnect.d.ts +1 -1
- package/dist/http/routes/mcp-reconnect.js +7 -15
- package/dist/http/routes/memory-bundle.js +4 -7
- package/dist/http/routes/memory-compliance.js +4 -4
- package/dist/http/routes/memory-consolidation.js +6 -9
- package/dist/http/routes/memory-origin.d.ts +3 -1
- package/dist/http/routes/memory-origin.js +7 -8
- package/dist/http/routes/memory-policy.js +17 -12
- package/dist/http/routes/notify-wake.js +12 -20
- package/dist/http/routes/observability.js +3 -3
- package/dist/http/routes/principal-inbox.d.ts +1 -1
- package/dist/http/routes/principal-inbox.js +2 -2
- package/dist/http/routes/projects.d.ts +70 -0
- package/dist/http/routes/projects.js +87 -0
- package/dist/http/routes/retention-ops.js +6 -9
- package/dist/http/routes/rules.js +50 -7
- package/dist/http/routes/run-memory-capture.d.ts +2 -2
- package/dist/http/routes/run-memory-capture.js +6 -12
- package/dist/http/routes/run-permission-mode.d.ts +2 -2
- package/dist/http/routes/run-permission-mode.js +10 -17
- package/dist/http/routes/runs.js +148 -233
- package/dist/http/routes/session-memory-sync.d.ts +2 -2
- package/dist/http/routes/session-memory-sync.js +7 -13
- package/dist/http/routes/session-sync.d.ts +4 -2
- package/dist/http/routes/session-sync.js +48 -30
- package/dist/http/routes/sessions-list.d.ts +3 -3
- package/dist/http/routes/sessions-list.js +9 -9
- package/dist/http/routes/sessions.d.ts +7 -1
- package/dist/http/routes/sessions.js +177 -112
- package/dist/http/routes/shared-memory.js +6 -6
- package/dist/http/routes/side-query.js +2 -2
- package/dist/http/routes/tasks.js +144 -122
- package/dist/http/routes/trace-usage.d.ts +0 -12
- package/dist/http/routes/trace-usage.js +40 -46
- package/dist/http/routes/workflows.d.ts +39 -4
- package/dist/http/routes/workflows.js +42 -14
- package/dist/http/run-concurrency-cap.d.ts +20 -12
- package/dist/http/run-concurrency-cap.js +39 -26
- package/dist/http/run-read-face.d.ts +3 -5
- package/dist/http/run-read-face.js +8 -13
- package/dist/http/send.d.ts +12 -3
- package/dist/http/send.js +42 -6
- package/dist/http/server.d.ts +63 -50
- package/dist/http/server.js +52 -16
- package/dist/http/sse-log.d.ts +17 -10
- package/dist/http/sse-log.js +7 -7
- package/dist/http/stored-body-replay.d.ts +17 -3
- package/dist/http/stored-body-replay.js +11 -2
- package/dist/http/submit-ctx.d.ts +16 -8
- package/dist/http/submit-ctx.js +6 -2
- package/dist/http/submit-replay.d.ts +19 -6
- package/dist/http/submit-replay.js +18 -6
- package/dist/http/sync-submit-body.d.ts +3 -4
- package/dist/http/sync-submit-body.js +4 -5
- package/dist/http/wire-types.d.ts +23 -13
- package/dist/identity-source.d.ts +36 -5
- package/dist/identity-source.js +27 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.js +2 -1
- package/dist/instruction-source-notice.d.ts +1 -1
- package/dist/key-resolver.d.ts +32 -0
- package/dist/key-resolver.js +23 -9
- package/dist/leader/diffup.js +2 -1
- package/dist/leader/endpoint.d.ts +26 -5
- package/dist/leader/endpoint.js +154 -14
- package/dist/leader/fanout.d.ts +3 -0
- package/dist/leader/fanout.js +78 -63
- package/dist/leader/leader.d.ts +16 -0
- package/dist/leader/leader.js +43 -3
- package/dist/leader/merge.d.ts +9 -1
- package/dist/leader/merge.js +16 -1
- package/dist/leader/repair-wire.js +1 -1
- package/dist/leader/wire.d.ts +36 -3
- package/dist/leader/wire.js +59 -18
- package/dist/lsp-evict.d.ts +6 -4
- package/dist/lsp-evict.js +2 -3
- package/dist/memory-embedder-reembed.d.ts +38 -0
- package/dist/memory-embedder-reembed.js +20 -0
- package/dist/memory-incident-sink.d.ts +0 -28
- package/dist/memory-incident-sink.js +5 -0
- package/dist/memory-operator-faces.d.ts +5 -4
- package/dist/memory-operator-faces.js +1 -1
- package/dist/memory-scope.d.ts +31 -4
- package/dist/memory-scope.js +65 -16
- package/dist/memory-store-refusal.d.ts +20 -4
- package/dist/memory-store-refusal.js +1 -1
- package/dist/memory-sync-client.d.ts +5 -2
- package/dist/memory-sync-client.js +19 -14
- package/dist/memory-sync.js +1 -1
- package/dist/model-compat.d.ts +51 -28
- package/dist/model-compat.js +55 -23
- package/dist/model-context-window.d.ts +18 -0
- package/dist/model-context-window.js +2 -0
- package/dist/model-entry-headers.d.ts +46 -4
- package/dist/model-entry-headers.js +2 -2
- package/dist/model-entry-refusal.d.ts +46 -17
- package/dist/model-entry-refusal.js +47 -27
- package/dist/model-plane-face.d.ts +19 -11
- package/dist/model-plane-face.js +9 -1
- package/dist/model-plane-probe.d.ts +2 -0
- package/dist/model-plane-probe.js +17 -0
- package/dist/model-provider.d.ts +3 -3
- package/dist/model-route-endpoint.d.ts +9 -5
- package/dist/model-route-endpoint.js +29 -7
- package/dist/model-select.d.ts +16 -0
- package/dist/model-select.js +4 -0
- package/dist/mountinfo.d.ts +37 -0
- package/dist/mountinfo.js +47 -0
- package/dist/namespaced-rule-name.d.ts +28 -2
- package/dist/namespaced-rule-name.js +10 -1
- package/dist/net-address.d.ts +1 -1
- package/dist/observability/corrupt-read-seat.d.ts +4 -4
- package/dist/observability/corrupt-read-seat.js +5 -3
- package/dist/observability/fail-open.d.ts +75 -47
- package/dist/observability/fail-open.js +77 -47
- package/dist/observability/logger.d.ts +22 -1
- package/dist/observability/logger.js +89 -12
- package/dist/observability/metrics.d.ts +2 -0
- package/dist/observability/metrics.js +5 -4
- package/dist/observability/otel-exporter.js +2 -1
- package/dist/observability/principal-context.d.ts +14 -7
- package/dist/observability/principal-context.js +8 -3
- package/dist/observability/run-terminal.d.ts +7 -1
- package/dist/observability/run-terminal.js +5 -2
- package/dist/observability/secret-env-scrub.d.ts +30 -4
- package/dist/observability/secret-env-scrub.js +15 -3
- package/dist/orchestration/hardened-vm-runner.d.ts +1 -0
- package/dist/orchestration/hardened-vm-runner.js +11 -5
- package/dist/orchestration/hardened-vm-worker-runner.d.ts +0 -14
- package/dist/orchestration/hardened-vm-worker-runner.js +5 -0
- package/dist/orchestration/hardened-vm-worker.js +2 -1
- package/dist/orchestration/workflow-agent-session-index.d.ts +7 -12
- package/dist/orchestration/workflow-agent-session-index.js +1 -6
- package/dist/orchestration/workflow-completion-inbox.d.ts +29 -9
- package/dist/orchestration/workflow-completion-inbox.js +65 -46
- package/dist/org-delivery-gate.d.ts +5 -4
- package/dist/org-delivery-gate.js +7 -6
- package/dist/org-memory-admission.d.ts +5 -2
- package/dist/org-memory-admission.js +25 -10
- package/dist/outbound-dispatcher.d.ts +1 -1
- package/dist/outbound-dispatcher.js +6 -12
- package/dist/owner-brands.d.ts +81 -0
- package/dist/owner-brands.js +42 -0
- package/dist/owner-faces.d.ts +531 -0
- package/dist/owner-faces.js +126 -0
- package/dist/parked-decide.d.ts +100 -31
- package/dist/parked-decide.js +162 -48
- package/dist/parked-revive-surface.d.ts +14 -4
- package/dist/parked-revive-surface.js +5 -4
- package/dist/peer-directory.d.ts +6 -8
- package/dist/peer-directory.js +3 -2
- package/dist/permission-rule-vocab.d.ts +53 -8
- package/dist/permission-rule-vocab.js +30 -2
- package/dist/plugins/adoption-log-sql.d.ts +0 -22
- package/dist/plugins/adoption-log-sql.js +5 -3
- package/dist/plugins/approval-ask-retired-delete-by-task-m50.d.ts +7 -0
- package/dist/plugins/approval-ask-retired-delete-by-task-m50.js +17 -0
- package/dist/plugins/approval-ask-store-file.d.ts +28 -9
- package/dist/plugins/approval-ask-store-file.js +74 -18
- package/dist/plugins/approval-ask-store-memory.d.ts +17 -7
- package/dist/plugins/approval-ask-store-memory.js +35 -12
- package/dist/plugins/approval-ask-store-sql.d.ts +42 -20
- package/dist/plugins/approval-ask-store-sql.js +44 -11
- package/dist/plugins/approval-exemption-skill-m46.d.ts +20 -0
- package/dist/plugins/approval-exemption-skill-m46.js +25 -0
- package/dist/plugins/approval-exemption-store.d.ts +6 -1
- package/dist/plugins/approval-exemption-store.js +14 -0
- package/dist/plugins/approval-nonce-store.d.ts +39 -12
- package/dist/plugins/approval-nonce-store.js +72 -23
- package/dist/plugins/blob-backend.d.ts +40 -195
- package/dist/plugins/blob-backend.js +41 -234
- package/dist/plugins/caching-session-store.d.ts +22 -5
- package/dist/plugins/caching-session-store.js +43 -4
- package/dist/plugins/checkpoint-index-columns.d.ts +33 -6
- package/dist/plugins/checkpoint-index-columns.js +39 -3
- package/dist/plugins/checkpoint-store-face.d.ts +84 -11
- package/dist/plugins/checkpoint-store-face.js +18 -1
- package/dist/plugins/device-store-sql.d.ts +2 -2
- package/dist/plugins/device-store-sql.js +6 -10
- package/dist/plugins/ensure-index.d.ts +13 -1
- package/dist/plugins/ensure-index.js +154 -21
- package/dist/plugins/ensure-schema-lock-policy.d.ts +0 -15
- package/dist/plugins/ensure-schema-lock-policy.js +3 -2
- package/dist/plugins/execution-lane-rename-m40.d.ts +20 -0
- package/dist/plugins/execution-lane-rename-m40.js +10 -0
- package/dist/plugins/execution-placement-sql.d.ts +63 -88
- package/dist/plugins/execution-placement-sql.js +94 -54
- package/dist/plugins/file-run-store.d.ts +89 -35
- package/dist/plugins/file-run-store.js +197 -142
- package/dist/plugins/host-platform.d.ts +24 -3
- package/dist/plugins/host-platform.js +15 -1
- package/dist/plugins/image-bake-store-sql.js +2 -0
- package/dist/plugins/imported-layer-root-retirement.d.ts +19 -10
- package/dist/plugins/imported-layer-root-retirement.js +4 -8
- package/dist/plugins/inbox-payload-column.d.ts +14 -0
- package/dist/plugins/inbox-payload-column.js +13 -0
- package/dist/plugins/k8s-pod-reaper.d.ts +1 -3
- package/dist/plugins/k8s-pod-reaper.js +0 -1
- package/dist/plugins/leader-run-store-sql.d.ts +22 -0
- package/dist/plugins/leader-run-store-sql.js +34 -4
- package/dist/plugins/local-checkpoint-store.d.ts +63 -23
- package/dist/plugins/local-checkpoint-store.js +204 -81
- package/dist/plugins/local-data-dir-modes-m39.d.ts +48 -0
- package/dist/plugins/local-data-dir-modes-m39.js +183 -0
- package/dist/plugins/local-docker-capacity.d.ts +93 -0
- package/dist/plugins/local-docker-capacity.js +194 -0
- package/dist/plugins/local-docker-reaper.d.ts +92 -0
- package/dist/plugins/local-docker-reaper.js +102 -0
- package/dist/plugins/local-engine-high-water.d.ts +13 -0
- package/dist/plugins/local-engine-high-water.js +62 -0
- package/dist/plugins/local-session-store.d.ts +442 -143
- package/dist/plugins/local-session-store.js +941 -289
- package/dist/plugins/local-session-window.d.ts +3 -2
- package/dist/plugins/local-session-window.js +3 -2
- package/dist/plugins/local-sidecar-quarantine.js +3 -2
- package/dist/plugins/local-task-attachment-store.d.ts +20 -1
- package/dist/plugins/local-task-attachment-store.js +32 -12
- package/dist/plugins/memory-embedder-fingerprint.d.ts +33 -10
- package/dist/plugins/memory-embedder-fingerprint.js +52 -12
- package/dist/plugins/memory-embedder.d.ts +1 -1
- package/dist/plugins/memory-embedder.js +11 -9
- package/dist/plugins/memory-engine-pg.d.ts +7 -5
- package/dist/plugins/memory-engine-pg.js +18 -9
- package/dist/plugins/memory-engine-sql-apply.d.ts +21 -8
- package/dist/plugins/memory-engine-sql-apply.js +7 -9
- package/dist/plugins/memory-engine-tidb.d.ts +12 -7
- package/dist/plugins/memory-engine-tidb.js +18 -10
- package/dist/plugins/memory-optout-grant-store-sql.d.ts +1 -1
- package/dist/plugins/memory-optout-grant-store-sql.js +3 -3
- package/dist/plugins/memory-run-store.d.ts +39 -27
- package/dist/plugins/memory-run-store.js +72 -70
- package/dist/plugins/one-time-migration-marker.d.ts +10 -0
- package/dist/plugins/one-time-migration-marker.js +7 -0
- package/dist/plugins/one-time-migrations.d.ts +325 -74
- package/dist/plugins/one-time-migrations.js +705 -230
- package/dist/plugins/org-delivery-quota-store.js +2 -1
- package/dist/plugins/owner-only-file-mode.d.ts +29 -0
- package/dist/plugins/owner-only-file-mode.js +141 -0
- package/dist/plugins/permission-rule-store-file.d.ts +11 -11
- package/dist/plugins/permission-rule-store-file.js +14 -2
- package/dist/plugins/permission-rule-store-sql.d.ts +4 -63
- package/dist/plugins/permission-rule-store-sql.js +6 -86
- package/dist/plugins/pg-pool.d.ts +3 -32
- package/dist/plugins/pg-pool.js +27 -11
- package/dist/plugins/release-version.d.ts +20 -0
- package/dist/plugins/release-version.js +28 -0
- package/dist/plugins/remote-env-adb.d.ts +20 -4
- package/dist/plugins/remote-env-adb.js +39 -11
- package/dist/plugins/remote-env-e2b.d.ts +19 -28
- package/dist/plugins/remote-env-e2b.js +40 -29
- package/dist/plugins/remote-env-host.d.ts +11 -10
- package/dist/plugins/remote-env-host.js +40 -27
- package/dist/plugins/remote-env-k8s.d.ts +45 -47
- package/dist/plugins/remote-env-k8s.js +122 -62
- package/dist/plugins/remote-env-local-docker.d.ts +152 -15
- package/dist/plugins/remote-env-local-docker.js +370 -75
- package/dist/plugins/remote-env-ssh.d.ts +8 -2
- package/dist/plugins/remote-env-ssh.js +26 -24
- package/dist/plugins/remote-scratchpad.js +4 -0
- package/dist/plugins/remote-shell.d.ts +59 -30
- package/dist/plugins/remote-shell.js +175 -62
- package/dist/plugins/retention-declaration.d.ts +37 -0
- package/dist/plugins/retention-declaration.js +9 -0
- package/dist/plugins/retention-deployment.d.ts +158 -0
- package/dist/plugins/retention-deployment.js +119 -0
- package/dist/plugins/retention-lane-store-sql.d.ts +74 -4
- package/dist/plugins/retention-lane-store-sql.js +103 -1
- package/dist/plugins/retention-sql.d.ts +29 -0
- package/dist/plugins/retention-sql.js +8 -0
- package/dist/plugins/run-preview-m45.d.ts +11 -0
- package/dist/plugins/run-preview-m45.js +19 -0
- package/dist/plugins/run-store-sql.d.ts +56 -68
- package/dist/plugins/run-store-sql.js +127 -116
- package/dist/plugins/s3-answer.d.ts +2 -1
- package/dist/plugins/sandbox-reaper.d.ts +26 -0
- package/dist/plugins/sandbox-reaper.js +2 -0
- package/dist/plugins/scenario-prefix-switch-m42.d.ts +54 -0
- package/dist/plugins/scenario-prefix-switch-m42.js +55 -0
- package/dist/plugins/scheduler-support.d.ts +16 -1
- package/dist/plugins/scheduler-support.js +22 -2
- package/dist/plugins/schema-consistency.d.ts +42 -15
- package/dist/plugins/schema-consistency.js +213 -13
- package/dist/plugins/schema-drift-sentence.d.ts +4 -1
- package/dist/plugins/schema-drift-sentence.js +4 -4
- package/dist/plugins/schema-ensure-legs.d.ts +10 -1
- package/dist/plugins/schema-ensure-legs.js +12 -2
- package/dist/plugins/schema-indexes.js +3 -0
- package/dist/plugins/schema-live-columns.d.ts +14 -5
- package/dist/plugins/schema-live-columns.js +10 -10
- package/dist/plugins/send-user-file.js +2 -1
- package/dist/plugins/session-birth.d.ts +37 -0
- package/dist/plugins/session-birth.js +38 -0
- package/dist/plugins/session-epoch-anchor.d.ts +40 -12
- package/dist/plugins/session-epoch-anchor.js +33 -11
- package/dist/plugins/session-ext-table.d.ts +98 -0
- package/dist/plugins/session-ext-table.js +134 -0
- package/dist/plugins/session-fork.d.ts +16 -2
- package/dist/plugins/session-fork.js +3 -0
- package/dist/plugins/session-ownership.d.ts +1 -1
- package/dist/plugins/session-placement.d.ts +22 -16
- package/dist/plugins/session-placement.js +15 -12
- package/dist/plugins/session-row-sql.d.ts +20 -7
- package/dist/plugins/session-row-sql.js +16 -8
- package/dist/plugins/session-run-rollup.d.ts +29 -0
- package/dist/plugins/session-run-rollup.js +40 -0
- package/dist/plugins/session-store-sql.d.ts +157 -0
- package/dist/plugins/session-store-sql.js +398 -0
- package/dist/plugins/session-withdraw-sql.d.ts +36 -0
- package/dist/plugins/session-withdraw-sql.js +42 -0
- package/dist/plugins/session-workspace-cell.d.ts +2 -2
- package/dist/plugins/session-workspace-cell.js +2 -2
- package/dist/plugins/shared-memory-store-sql.d.ts +10 -69
- package/dist/plugins/shared-memory-store-sql.js +15 -14
- package/dist/plugins/shell-sentinel-owner-m48.d.ts +20 -0
- package/dist/plugins/shell-sentinel-owner-m48.js +3 -0
- package/dist/plugins/snapshot-bucket-presence.d.ts +2 -1
- package/dist/plugins/snapshot-bucket-presence.js +1 -1
- package/dist/plugins/sql-driver.d.ts +24 -8
- package/dist/plugins/sql-driver.js +43 -9
- package/dist/plugins/sql-errors.d.ts +35 -5
- package/dist/plugins/sql-errors.js +55 -3
- package/dist/plugins/sql-json-column.d.ts +8 -7
- package/dist/plugins/sql-json-column.js +10 -6
- package/dist/plugins/store-backend.d.ts +114 -18
- package/dist/plugins/store-backend.js +340 -87
- package/dist/plugins/store-contracts.d.ts +97 -30
- package/dist/plugins/store-contracts.js +23 -1
- package/dist/plugins/store-fault.d.ts +28 -2
- package/dist/plugins/store-fault.js +20 -2
- package/dist/plugins/task-attachment-store.d.ts +21 -11
- package/dist/plugins/task-attachment-store.js +37 -19
- package/dist/plugins/task-list-store-sql.d.ts +1 -1
- package/dist/plugins/text-column-capacity.d.ts +21 -0
- package/dist/plugins/text-column-capacity.js +5 -0
- package/dist/plugins/tidb-pool.d.ts +3 -2
- package/dist/plugins/tidb-pool.js +42 -39
- package/dist/plugins/user-input-ledger-sql.d.ts +1 -1
- package/dist/plugins/web-search.js +5 -3
- package/dist/plugins/workflow-run-store-sql.d.ts +6 -1
- package/dist/plugins/workflow-run-store-sql.js +11 -5
- package/dist/principal-jwt.d.ts +4 -4
- package/dist/principal-jwt.js +20 -5
- package/dist/principal-shape.d.ts +41 -0
- package/dist/principal-shape.js +19 -0
- package/dist/question.d.ts +13 -23
- package/dist/question.js +21 -39
- package/dist/read-face-posture.d.ts +6 -6
- package/dist/read-face-posture.js +2 -2
- package/dist/request-declaration-refusal.d.ts +35 -12
- package/dist/request-declaration-refusal.js +21 -9
- package/dist/request-form.d.ts +58 -0
- package/dist/request-form.js +72 -0
- package/dist/request-image-urls.d.ts +8 -2
- package/dist/request-image-urls.js +2 -1
- package/dist/request-images.d.ts +20 -0
- package/dist/request-images.js +59 -0
- package/dist/request-key-closure.d.ts +6 -7
- package/dist/request-key-closure.js +15 -2
- package/dist/request-value-closure.d.ts +5 -5
- package/dist/request-value-closure.js +1 -1
- package/dist/resource-suspend.d.ts +7 -16
- package/dist/resource-suspend.js +1 -1
- package/dist/retired-name-host-notice.d.ts +21 -0
- package/dist/retired-name-host-notice.js +12 -0
- package/dist/rule-entry-list.d.ts +2 -2
- package/dist/rule-entry-list.js +3 -4
- package/dist/rule-issue-reading.d.ts +58 -0
- package/dist/rule-issue-reading.js +14 -0
- package/dist/rules-consent.d.ts +46 -16
- package/dist/rules-consent.js +102 -53
- package/dist/run-acceptance.d.ts +3 -1
- package/dist/run-acceptance.js +3 -0
- package/dist/run-local.d.ts +14 -6
- package/dist/run-local.js +109 -93
- package/dist/run-stale-default.d.ts +7 -0
- package/dist/run-stale-default.js +2 -0
- package/dist/runs.d.ts +73 -44
- package/dist/runs.js +65 -43
- package/dist/runtime-caps-resolver.d.ts +36 -14
- package/dist/runtime-caps-resolver.js +31 -14
- package/dist/runtime-governance.d.ts +2 -2
- package/dist/runtime-governance.js +5 -3
- package/dist/sealed-key-layout.d.ts +12 -6
- package/dist/sealed-key-layout.js +5 -1
- package/dist/sealed-key.d.ts +12 -2
- package/dist/sealed-key.js +116 -26
- package/dist/security.d.ts +133 -161
- package/dist/security.js +163 -59
- package/dist/sema-config-dir.d.ts +20 -0
- package/dist/sema-config-dir.js +27 -2
- package/dist/server-secret-env.d.ts +23 -5
- package/dist/server-secret-env.js +14 -4
- package/dist/service-version.d.ts +2 -1
- package/dist/service-version.js +2 -2
- package/dist/session-children-retire.d.ts +7 -5
- package/dist/session-children-retire.js +7 -2
- package/dist/session-deletion.d.ts +88 -0
- package/dist/session-deletion.js +8 -0
- package/dist/session-erase.d.ts +145 -0
- package/dist/session-erase.js +115 -0
- package/dist/session-error-wire.d.ts +6 -6
- package/dist/session-error-wire.js +1 -1
- package/dist/session-incarnation.d.ts +60 -10
- package/dist/session-incarnation.js +19 -2
- package/dist/session-policy-wire.d.ts +6 -3
- package/dist/session-policy-wire.js +11 -1
- package/dist/session-resident-background.d.ts +29 -47
- package/dist/session-resident-background.js +77 -8
- package/dist/session-row.d.ts +3 -2
- package/dist/session-rules-seat.d.ts +12 -0
- package/dist/session-rules-seat.js +19 -0
- package/dist/session-sync-kernel.d.ts +1 -1
- package/dist/session-titler.d.ts +7 -15
- package/dist/session-titler.js +1 -1
- package/dist/session-workspace.d.ts +11 -2
- package/dist/session-workspace.js +5 -0
- package/dist/sighup-idle.d.ts +1 -1
- package/dist/spec-fields.d.ts +57 -3
- package/dist/spec-fields.js +72 -51
- package/dist/store-posture.d.ts +138 -21
- package/dist/store-posture.js +188 -3
- package/dist/stored-request-hooks-m20.d.ts +3 -2
- package/dist/stored-request-hooks-m20.js +21 -16
- package/dist/stores-sql/background-agent-store-sql.d.ts +11 -2
- package/dist/stores-sql/background-agent-store-sql.js +73 -20
- package/dist/stores-sql/blob-index-sql.d.ts +148 -0
- package/dist/stores-sql/blob-index-sql.js +154 -0
- package/dist/stores-sql/checkpoint-store-sql.d.ts +34 -29
- package/dist/stores-sql/checkpoint-store-sql.js +86 -71
- package/dist/{plugins → stores-sql}/file-history-store-sql.d.ts +23 -11
- package/dist/{plugins → stores-sql}/file-history-store-sql.js +23 -18
- package/dist/stores-sql/mailbox-store-sql.d.ts +7 -4
- package/dist/stores-sql/mailbox-store-sql.js +31 -32
- package/dist/{plugins → stores-sql}/pg-session-storage.d.ts +30 -81
- package/dist/{plugins → stores-sql}/pg-session-storage.js +123 -244
- package/dist/{plugins → stores-sql}/retention-store-sql.d.ts +197 -223
- package/dist/{plugins → stores-sql}/retention-store-sql.js +148 -207
- package/dist/{plugins → stores-sql}/session-event-payload.d.ts +1 -1
- package/dist/{plugins → stores-sql}/session-event-payload.js +1 -1
- package/dist/stores-sql/session-policy-store-sql.d.ts +33 -11
- package/dist/stores-sql/session-policy-store-sql.js +44 -36
- package/dist/stores-sql/session-write-hooks.d.ts +65 -0
- package/dist/stores-sql/session-write-hooks.js +2 -0
- package/dist/{plugins → stores-sql}/tidb-session-storage.d.ts +14 -15
- package/dist/{plugins → stores-sql}/tidb-session-storage.js +22 -28
- package/dist/{plugins → stores-sql}/tidb-session-store.d.ts +67 -138
- package/dist/{plugins → stores-sql}/tidb-session-store.js +130 -200
- package/dist/stores-sql/tool-result-store-sql.d.ts +1 -1
- package/dist/stores-sql/tool-result-store-sql.js +1 -1
- package/dist/stores-sql/windowed-session-storage.d.ts +61 -0
- package/dist/stores-sql/windowed-session-storage.js +70 -0
- package/dist/submission-exit.d.ts +50 -0
- package/dist/submission-exit.js +108 -0
- package/dist/task-a2a.d.ts +7 -1
- package/dist/task-a2a.js +18 -17
- package/dist/task-cwd.d.ts +31 -3
- package/dist/task-cwd.js +25 -1
- package/dist/task-mcp.d.ts +11 -3
- package/dist/task-mcp.js +16 -19
- package/dist/task-settings.d.ts +23 -14
- package/dist/task-settings.js +35 -13
- package/dist/terminal.d.ts +25 -43
- package/dist/terminal.js +31 -11
- package/dist/tool-approval.d.ts +152 -137
- package/dist/tool-approval.js +199 -199
- package/dist/trace/core-keyset-guard.d.ts +22 -9
- package/dist/trace/core-vocab-wire.d.ts +95 -0
- package/dist/trace/core-vocab-wire.js +15 -0
- package/dist/trace/engine-notice-wire.d.ts +1 -1
- package/dist/trace/engine-notice-wire.js +2 -0
- package/dist/trace/exit-seat.d.ts +52 -4
- package/dist/trace/exit-seat.js +43 -36
- package/dist/trace/extension-call-face.d.ts +3 -2
- package/dist/trace/extension-call-face.js +3 -1
- package/dist/trace/ledger-events.d.ts +4 -7
- package/dist/trace/ledger-sink.d.ts +1 -30
- package/dist/trace/ledger-sink.js +0 -11
- package/dist/trace/model-segment.d.ts +5 -5
- package/dist/trace/model-segment.js +5 -5
- package/dist/trace/project.d.ts +88 -58
- package/dist/trace/project.js +64 -28
- package/dist/trace/redact.d.ts +124 -28
- package/dist/trace/redact.js +936 -328
- package/dist/trace/self-minted-wire.d.ts +750 -29
- package/dist/trace/self-minted-wire.js +262 -25
- package/dist/trace/sema-provenance.d.ts +45 -41
- package/dist/trace/sema-provenance.js +81 -10
- package/dist/trace/task-notification-facets.d.ts +70 -2
- package/dist/trace/task-notification-facets.js +71 -1
- package/dist/trace/wire-projection-faces.d.ts +43 -8
- package/dist/trace/wire-projection-faces.js +28 -3
- package/dist/unread-request-members.d.ts +66 -0
- package/dist/unread-request-members.js +41 -0
- package/dist/upstream-body.d.ts +23 -0
- package/dist/upstream-body.js +16 -0
- package/dist/url-refusal.d.ts +3 -3
- package/dist/url-refusal.js +11 -4
- package/dist/user-authored-text.d.ts +1 -1
- package/dist/user-input-ledger.d.ts +7 -8
- package/dist/user-input-ledger.js +1 -1
- package/dist/web-admin-client/apply-effective.d.ts +6 -3
- package/dist/web-admin-client/apply-effective.js +33 -40
- package/dist/web-admin-client/apply-ledger.d.ts +16 -7
- package/dist/web-admin-client/apply-ledger.js +5 -2
- package/dist/web-admin-client/candidate-gate.d.ts +35 -3
- package/dist/web-admin-client/candidate-gate.js +53 -5
- package/dist/web-admin-client/center-request.d.ts +6 -3
- package/dist/web-admin-client/center-request.js +17 -16
- package/dist/web-admin-client/effective-keys.d.ts +1 -1
- package/dist/web-admin-client/effective-keys.js +1 -2
- package/dist/web-admin-client/entry-metadata.d.ts +8 -0
- package/dist/web-admin-client/entry-metadata.js +13 -0
- package/dist/web-admin-client/facade.d.ts +1 -1
- package/dist/web-admin-client/http-client.d.ts +2 -1
- package/dist/web-admin-client/http-client.js +40 -13
- package/dist/web-admin-client/mcp-revocation.d.ts +1 -1
- package/dist/web-admin-client/mcp-revocation.js +2 -1
- package/dist/web-admin-client/read-warnings.d.ts +1 -0
- package/dist/web-admin-client/read-warnings.js +1 -0
- package/dist/web-admin-client/restart-signal.js +13 -6
- package/dist/web-admin-client/skills-mcp.d.ts +22 -8
- package/dist/web-admin-client/skills-mcp.js +26 -21
- package/dist/web-admin-client/types.d.ts +35 -51
- package/dist/workspace-space.d.ts +3 -2
- package/docs/DEVICE-EXECUTOR-PROTOCOL.md +4 -4
- package/package.json +16 -12
- package/scripts/drain-check-local.mjs +118 -173
- package/scripts/drain-check.mysql.sql +20 -16
- package/scripts/drain-check.pg.sql +20 -16
- package/wire-changes/server@7.147.0.json +813 -0
- package/wire-changes/server@7.148.0.json +1517 -0
- package/dist/http/memory-control-plane-corrupt-reply.d.ts +0 -25
- package/dist/http/memory-control-plane-corrupt-reply.js +0 -19
- package/dist/http/memory-layer-reply.d.ts +0 -30
- package/dist/http/memory-layer-reply.js +0 -24
- package/dist/lsp/e2b-bridge.d.ts +0 -57
- package/dist/lsp/e2b-bridge.js +0 -139
- package/dist/lsp/e2b-manager.d.ts +0 -93
- package/dist/lsp/e2b-manager.js +0 -178
- package/dist/lsp/lsp-frames.d.ts +0 -14
- package/dist/lsp/lsp-frames.js +0 -25
- package/dist/lsp/manager.d.ts +0 -129
- package/dist/lsp/manager.js +0 -127
- package/dist/lsp/types.d.ts +0 -12
- package/dist/lsp/types.js +0 -2
- package/dist/lsp/ws-transport.d.ts +0 -40
- package/dist/lsp/ws-transport.js +0 -210
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ConfigCandidateRefusedError } from "./config-pull-failure.js";
|
|
1
2
|
/** 拒的机器码:起服拒启的 fatal 标题(`[config.dir_untrusted]`)与每拍那一行的句首同用。 */
|
|
2
3
|
export declare const CONFIG_DIR_UNTRUSTED_CODE = "config.dir_untrusted";
|
|
3
4
|
/** 属主声明的 env 名(登记 `config-catalog.ts`)。 */
|
|
@@ -95,14 +96,46 @@ export declare function kubeletVolumeIn(mountinfo: string, dir: string): Kubelet
|
|
|
95
96
|
export declare function localConfigDirOf(root: string): string;
|
|
96
97
|
/** 判一次。`undefined` = 读者可以读(或没有可读的);否则那一条发现。 */
|
|
97
98
|
export declare function judgeLocalConfigDir(input: ConfigDirTrustInput): Promise<ConfigDirUntrustedFinding | undefined>;
|
|
98
|
-
/**
|
|
99
|
+
/**
|
|
100
|
+
* 🔴 同一只判官的**另两只读者**:配置根之外、同属「盘上字节决定起什么」的两个文件(闭集;加一只读者 = 加一个词,拒句随词走,编译期穷举):
|
|
101
|
+
* · `lkg` —— 中心配置的盘上 LKG 读回(`config-lkg.ts` `loadLkg`):中心慢或断时它就是本服务的配置(起哪些 MCP 命令、把凭据送给哪只模型端点);
|
|
102
|
+
* · `scheduler-store` —— 调度共享店(`plugins/scheduler-support.ts` `FileSchedulerBackend`):常驻调度方按其中记录点名的主体起任务。
|
|
103
|
+
* 律与本地配置根逐字同一条(从 `/` 起逐级判到这一个文件,链接照跟;属主 ∈ 同一可信集;非链接组件不得组 / 他人可写,同两个例外;常规文件 ≤ 上界;
|
|
104
|
+
* 缺席且所在目录关着 = 读者也读不到,不是发现)。不是第二份判:走的是同一只 {@link reach}、同一张可信属主集、同一只句子。
|
|
105
|
+
*/
|
|
106
|
+
export type TrustedFileReader = "lkg" | "scheduler-store";
|
|
107
|
+
/** 拒句头半句的三格 + `creatable` 的出路(按读者;本地配置源那一份见 {@link judgeLocalConfigDir} 的句子)。 */
|
|
108
|
+
export interface TrustSubject {
|
|
109
|
+
readonly what: string;
|
|
110
|
+
readonly decides: string;
|
|
111
|
+
readonly pronoun: "it" | "them";
|
|
112
|
+
readonly relocate: string;
|
|
113
|
+
}
|
|
114
|
+
/** 本地配置源(`config.d` 与配置根上的根级文档)那一份(`configDir` = {@link localConfigDirOf} 的值)。 */
|
|
115
|
+
export declare function localConfigSubject(configDir: string): TrustSubject;
|
|
116
|
+
/** 判一个文件(读者 `reader` 要打开的那一个)。`undefined` = 可以读(或它不在、谁也建不出来);否则那一条发现。相对路径按进程 cwd 解(与读者打开时同一个解法,见 {@link readerPathOf})。 */
|
|
117
|
+
export declare function judgeTrustedFile(input: {
|
|
118
|
+
readonly reader: TrustedFileReader;
|
|
119
|
+
readonly file: string;
|
|
120
|
+
readonly declaredOwnerUid: number | undefined;
|
|
121
|
+
readonly host?: ConfigDirTrustHost;
|
|
122
|
+
}): Promise<ConfigDirUntrustedFinding | undefined>;
|
|
123
|
+
/** 两只读者的口:判,有发现就交回那一句(与本地配置根的拒句同族:同一个码、同一组发现句);可读 ⇒ `undefined`。读者各按自己的纪律处置(不读回 / 拒这一次读写)。 */
|
|
124
|
+
export declare function trustedFileRefusal(input: {
|
|
125
|
+
readonly reader: TrustedFileReader;
|
|
126
|
+
readonly file: string;
|
|
127
|
+
readonly declaredOwnerUid: number | undefined;
|
|
128
|
+
readonly host?: ConfigDirTrustHost;
|
|
129
|
+
}): Promise<string | undefined>;
|
|
130
|
+
/** 一条发现的句子(纯字符串 ⇒ `build*`)。头半句说读的是什么、为什么要判、谁可以改;后半句点名路径、实测值与改法。`subject` = 本地配置源({@link localConfigSubject})或另两只读者之一。 */
|
|
99
131
|
export declare function buildConfigDirUntrustedSentence(f: ConfigDirUntrustedFinding, ctx: {
|
|
100
|
-
readonly
|
|
132
|
+
readonly subject: TrustSubject;
|
|
101
133
|
readonly euid: number | undefined;
|
|
102
134
|
readonly declaredOwnerUid: number | undefined;
|
|
103
135
|
}): string;
|
|
104
|
-
/** 判出一条发现时抛的错:`code` = {@link CONFIG_DIR_UNTRUSTED_CODE},`message` = 那一句,`finding` = 结构。
|
|
105
|
-
|
|
136
|
+
/** 判出一条发现时抛的错:`code` = {@link CONFIG_DIR_UNTRUSTED_CODE},`message` = 那一句,`finding` = 结构。
|
|
137
|
+
* 是 `ConfigCandidateRefusedError` 的子类 —— 每拍那一拉里抛出时,失败行的成因是 `rejected`(本引擎拒收这份本地候选;`config-pull-failure.ts`)。 */
|
|
138
|
+
export declare class ConfigDirUntrustedError extends ConfigCandidateRefusedError {
|
|
106
139
|
readonly code = "config.dir_untrusted";
|
|
107
140
|
readonly finding: ConfigDirUntrustedFinding;
|
|
108
141
|
constructor(sentence: string, finding: ConfigDirUntrustedFinding);
|
package/dist/config-dir-trust.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { lstat,
|
|
1
|
+
import { lstat, readdir, readlink, realpath, stat } from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { CONFIG_ROOT_DOCUMENTS } from "@sema-agent/settings-schema";
|
|
4
4
|
import { LOCAL_READER_DOCUMENTS } from "./config-d-migration.js";
|
|
5
5
|
import { recordFailOpen } from "./observability/fail-open.js";
|
|
6
6
|
import { HOST_PLATFORM } from "./plugins/host-platform.js";
|
|
7
|
+
import { coversPath, parseMountinfo, readProcessMountinfo, visibleMountOf } from "./mountinfo.js";
|
|
8
|
+
import { ConfigCandidateRefusedError } from "./config-pull-failure.js";
|
|
7
9
|
export const CONFIG_DIR_UNTRUSTED_CODE = "config.dir_untrusted";
|
|
8
10
|
export const CONFIG_LOCAL_OWNER_UID_ENV = "CONFIG_LOCAL_OWNER_UID";
|
|
9
11
|
export const CONFIG_DOCUMENT_MAX_BYTES = 16 * 1024 * 1024;
|
|
@@ -12,35 +14,8 @@ const UID_MAX = 4294967294;
|
|
|
12
14
|
const WIN32_UNVERIFIED_TAG = "server.config-dir-trust.win32-owner-mode-unverifiable";
|
|
13
15
|
const errnoOf = (e) => (e instanceof Error && "code" in e && typeof e.code === "string" ? e.code : undefined);
|
|
14
16
|
const KUBELET_VOLUME_ROOT = /\/pods\/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\/volumes\/kubernetes\.io~configmap\/[^/]+$/;
|
|
15
|
-
const coversPath = (ancestor, p) => ancestor === p || ancestor === "/" || p.startsWith(`${ancestor}/`);
|
|
16
|
-
const unescapeMountinfoPath = (field) => field.replace(/\\([0-7]{3})/g, (_m, oct) => String.fromCharCode(Number.parseInt(oct, 8)));
|
|
17
|
-
function visibleMountOf(rows, dir) {
|
|
18
|
-
const ids = new Set(rows.map((r) => r.id));
|
|
19
|
-
let level = rows.filter((r) => !ids.has(r.parent) || r.parent === r.id);
|
|
20
|
-
let visible;
|
|
21
|
-
for (let depth = 0; depth <= rows.length; depth++) {
|
|
22
|
-
const covering = level.filter((r) => coversPath(r.mountPoint, dir));
|
|
23
|
-
if (covering.length === 0)
|
|
24
|
-
break;
|
|
25
|
-
const shortest = Math.min(...covering.map((r) => r.mountPoint.length));
|
|
26
|
-
const first = covering.filter((r) => r.mountPoint.length === shortest);
|
|
27
|
-
if (first.length !== 1)
|
|
28
|
-
return "ambiguous";
|
|
29
|
-
const next = first[0];
|
|
30
|
-
visible = next;
|
|
31
|
-
level = rows.filter((r) => r.parent === next.id && r.id !== next.id);
|
|
32
|
-
}
|
|
33
|
-
return visible;
|
|
34
|
-
}
|
|
35
17
|
export function kubeletVolumeIn(mountinfo, dir) {
|
|
36
|
-
const rows =
|
|
37
|
-
for (const line of mountinfo.split("\n")) {
|
|
38
|
-
const f = line.split(" ");
|
|
39
|
-
const [id, parent, dev, root, mountPoint, options] = f;
|
|
40
|
-
if (f.indexOf("-", 6) === -1 || id === undefined || parent === undefined || dev === undefined || root === undefined || mountPoint === undefined || options === undefined)
|
|
41
|
-
continue;
|
|
42
|
-
rows.push({ id, parent, dev, root: unescapeMountinfoPath(root), mountPoint: unescapeMountinfoPath(mountPoint), options: options.split(",") });
|
|
43
|
-
}
|
|
18
|
+
const { rows } = parseMountinfo(mountinfo);
|
|
44
19
|
const visible = visibleMountOf(rows, dir);
|
|
45
20
|
if (typeof visible !== "object" || visible.mountPoint !== dir || !visible.options.includes("ro") || !KUBELET_VOLUME_ROOT.test(visible.root))
|
|
46
21
|
return undefined;
|
|
@@ -59,7 +34,7 @@ export function kubeletVolumeIn(mountinfo, dir) {
|
|
|
59
34
|
return { source, writableExposures };
|
|
60
35
|
}
|
|
61
36
|
async function processMountinfo() {
|
|
62
|
-
return
|
|
37
|
+
return (await readProcessMountinfo()) ?? "";
|
|
63
38
|
}
|
|
64
39
|
const processHost = () => ({ platform: HOST_PLATFORM, euid: process.geteuid?.(), mountinfo: processMountinfo });
|
|
65
40
|
const UNREACHABLE = new Set(["ENOENT", "ENOTDIR"]);
|
|
@@ -339,25 +314,95 @@ async function judgeWin32(root, configDir) {
|
|
|
339
314
|
export function localConfigDirOf(root) {
|
|
340
315
|
return path.join(path.resolve(root), "config.d");
|
|
341
316
|
}
|
|
317
|
+
function judgeCtxOf(host, declaredOwnerUid) {
|
|
318
|
+
const owners = new Set([0]);
|
|
319
|
+
if (host.euid !== undefined)
|
|
320
|
+
owners.add(host.euid);
|
|
321
|
+
if (declaredOwnerUid !== undefined)
|
|
322
|
+
owners.add(declaredOwnerUid);
|
|
323
|
+
return { owners, mountinfo: host.mountinfo ?? processMountinfo };
|
|
324
|
+
}
|
|
342
325
|
export async function judgeLocalConfigDir(input) {
|
|
343
326
|
const host = input.host ?? processHost();
|
|
344
327
|
const configDir = localConfigDirOf(input.root);
|
|
345
328
|
const root = path.dirname(configDir);
|
|
346
329
|
if (host.platform === "win32")
|
|
347
330
|
return judgeWin32(root, configDir);
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
331
|
+
return judgePosix(root, configDir, judgeCtxOf(host, input.declaredOwnerUid));
|
|
332
|
+
}
|
|
333
|
+
export function localConfigSubject(configDir) {
|
|
334
|
+
return {
|
|
335
|
+
what: `the local config source ${configDir}`,
|
|
336
|
+
decides: "its documents decide which commands this server starts (mcp.json) and where it sends credentials (models.json)",
|
|
337
|
+
pronoun: "them",
|
|
338
|
+
relocate: "move the config root (CONFIG_LOCAL_DIR) under a directory only this server's user or root can write",
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
function trustedFileSubject(reader, file) {
|
|
342
|
+
switch (reader) {
|
|
343
|
+
case "lkg":
|
|
344
|
+
return {
|
|
345
|
+
what: `the last-known-good config ${file}`,
|
|
346
|
+
decides: "it is applied as this server's configuration whenever the center is slow or unreachable (the MCP commands this server starts, the model endpoints it sends credentials to)",
|
|
347
|
+
pronoun: "it",
|
|
348
|
+
relocate: "move it (SEMA_CONFIG_DIR, or CONFIG_LKG_PATH for this file alone) under a directory only this server's user or root can write",
|
|
349
|
+
};
|
|
350
|
+
case "scheduler-store":
|
|
351
|
+
return {
|
|
352
|
+
what: `the scheduled-task store ${file}`,
|
|
353
|
+
decides: "the resident scheduler starts its records as tasks under the principal each record names",
|
|
354
|
+
pronoun: "it",
|
|
355
|
+
relocate: "move it (SEMA_CONFIG_DIR, or SCHEDULER_STORE_PATH for this file alone) under a directory only this server's user or root can write",
|
|
356
|
+
};
|
|
357
|
+
default: {
|
|
358
|
+
const unknownReader = reader;
|
|
359
|
+
throw new Error(`config-dir-trust: unknown trusted-file reader ${String(unknownReader)}`);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
async function judgeWin32File(reader, file) {
|
|
364
|
+
let at;
|
|
365
|
+
try {
|
|
366
|
+
at = await realpath(file);
|
|
367
|
+
}
|
|
368
|
+
catch (e) {
|
|
369
|
+
const code = errnoOf(e);
|
|
370
|
+
if (code !== undefined && UNREACHABLE.has(code))
|
|
371
|
+
return undefined;
|
|
372
|
+
if (code === "ELOOP")
|
|
373
|
+
return { kind: "link-loop", path: file };
|
|
374
|
+
return { kind: "unreadable", path: file, errno: code ?? String(e) };
|
|
375
|
+
}
|
|
376
|
+
const st = await stat(at);
|
|
377
|
+
if (!st.isFile())
|
|
378
|
+
return { kind: "not-regular", path: at, type: typeOf(st) };
|
|
379
|
+
if (st.size > CONFIG_DOCUMENT_MAX_BYTES)
|
|
380
|
+
return { kind: "too-large", path: at, bytes: st.size };
|
|
381
|
+
recordFailOpen(WIN32_UNVERIFIED_TAG, `${reader}=${at}`);
|
|
382
|
+
return undefined;
|
|
383
|
+
}
|
|
384
|
+
const readerPathOf = (file) => (path.isAbsolute(file) ? file : `${process.cwd()}/${file}`);
|
|
385
|
+
export async function judgeTrustedFile(input) {
|
|
386
|
+
const host = input.host ?? processHost();
|
|
387
|
+
const file = readerPathOf(input.file);
|
|
388
|
+
if (host.platform === "win32")
|
|
389
|
+
return judgeWin32File(input.reader, file);
|
|
390
|
+
const reached = await reach(file, "file", judgeCtxOf(host, input.declaredOwnerUid));
|
|
391
|
+
return reached !== undefined && "kind" in reached ? reached : undefined;
|
|
392
|
+
}
|
|
393
|
+
export async function trustedFileRefusal(input) {
|
|
394
|
+
const host = input.host ?? processHost();
|
|
395
|
+
const finding = await judgeTrustedFile({ ...input, host });
|
|
396
|
+
if (finding === undefined)
|
|
397
|
+
return undefined;
|
|
398
|
+
return buildConfigDirUntrustedSentence(finding, { subject: trustedFileSubject(input.reader, readerPathOf(input.file)), euid: host.euid, declaredOwnerUid: input.declaredOwnerUid });
|
|
354
399
|
}
|
|
355
400
|
const octal = (mode) => `0${(mode & 0o7777).toString(8).padStart(3, "0")}`;
|
|
356
401
|
export function buildConfigDirUntrustedSentence(f, ctx) {
|
|
357
402
|
const self = ctx.euid === undefined ? "this server's user" : `this server's user (uid ${ctx.euid})`;
|
|
358
403
|
const declared = ctx.declaredOwnerUid === undefined ? "" : ` or the declared owner ${CONFIG_LOCAL_OWNER_UID_ENV}=${ctx.declaredOwnerUid}`;
|
|
359
|
-
const
|
|
360
|
-
|
|
404
|
+
const s = ctx.subject;
|
|
405
|
+
const head = `${CONFIG_DIR_UNTRUSTED_CODE}: refusing to read ${s.what} — ${s.decides}, so only ${self}, root${declared} may be able to change ${s.pronoun}, but`;
|
|
361
406
|
switch (f.kind) {
|
|
362
407
|
case "owner":
|
|
363
408
|
return (`${head} ${f.path} is owned by uid ${f.uid}${ctx.declaredOwnerUid === undefined ? ` (${CONFIG_LOCAL_OWNER_UID_ENV} is not set)` : ""}. ` +
|
|
@@ -376,7 +421,7 @@ export function buildConfigDirUntrustedSentence(f, ctx) {
|
|
|
376
421
|
return `${head} ${f.path} cannot be inspected (${f.errno}), so its owner and mode cannot be checked. Fix: give this server's user search access to every directory on the path.`;
|
|
377
422
|
case "creatable":
|
|
378
423
|
return (`${head} ${f.path} does not exist and ${f.parent} (mode ${octal(f.mode)}) lets other users create it between this check and the read. ` +
|
|
379
|
-
`Fix: create ${f.path} as this server's user, or
|
|
424
|
+
`Fix: create ${f.path} as this server's user, or ${s.relocate}.`);
|
|
380
425
|
case "unresolvable":
|
|
381
426
|
return `${head} ${f.path} is a symbolic link that does not resolve to a path (it points at a kernel object such as a /proc descriptor), so its owner and mode cannot be checked. Fix: point it at a regular file.`;
|
|
382
427
|
case "exposed":
|
|
@@ -389,12 +434,11 @@ export function buildConfigDirUntrustedSentence(f, ctx) {
|
|
|
389
434
|
}
|
|
390
435
|
}
|
|
391
436
|
}
|
|
392
|
-
export class ConfigDirUntrustedError extends
|
|
437
|
+
export class ConfigDirUntrustedError extends ConfigCandidateRefusedError {
|
|
393
438
|
code = CONFIG_DIR_UNTRUSTED_CODE;
|
|
394
439
|
finding;
|
|
395
440
|
constructor(sentence, finding) {
|
|
396
|
-
super(sentence);
|
|
397
|
-
this.name = "ConfigDirUntrustedError";
|
|
441
|
+
super(sentence, "ConfigDirUntrustedError");
|
|
398
442
|
this.finding = finding;
|
|
399
443
|
}
|
|
400
444
|
}
|
|
@@ -403,7 +447,7 @@ export async function assertLocalConfigDirTrusted(input) {
|
|
|
403
447
|
const finding = await judgeLocalConfigDir({ ...input, host });
|
|
404
448
|
if (finding === undefined)
|
|
405
449
|
return;
|
|
406
|
-
throw new ConfigDirUntrustedError(buildConfigDirUntrustedSentence(finding, {
|
|
450
|
+
throw new ConfigDirUntrustedError(buildConfigDirUntrustedSentence(finding, { subject: localConfigSubject(localConfigDirOf(input.root)), euid: host.euid, declaredOwnerUid: input.declaredOwnerUid }), finding);
|
|
407
451
|
}
|
|
408
452
|
export function parseConfigLocalOwnerUid(raw) {
|
|
409
453
|
if (raw === undefined)
|
|
@@ -412,6 +456,6 @@ export function parseConfigLocalOwnerUid(raw) {
|
|
|
412
456
|
if (Number.isInteger(n) && n <= UID_MAX)
|
|
413
457
|
return n;
|
|
414
458
|
throw new Error(`env ${CONFIG_LOCAL_OWNER_UID_ENV}=${JSON.stringify(raw)} must be a uid — a decimal integer in [0, ${UID_MAX}]: the one extra owner (besides this server's user and root) ` +
|
|
415
|
-
`the local config source's directories and documents may have (a userns-remapped bind mount, an operator-owned config). Unset it to trust only this server's user and root.`);
|
|
459
|
+
`the local config source's directories and documents, the last-known-good config and the scheduled-task store may have (a userns-remapped bind mount, an operator-owned config). Unset it to trust only this server's user and root.`);
|
|
416
460
|
}
|
|
417
461
|
//# sourceMappingURL=config-dir-trust.js.map
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
* 依赖纪律:本文件是**叶**(只 type-import config-types + 值引 deployment-governance 的守卫集编译门),
|
|
26
26
|
* 不引 config.ts,故 config.ts / runs.ts 都可以安全引它。
|
|
27
27
|
*/
|
|
28
|
-
import type { ConfigProviderWord, ServiceConfigFlat } from "./config-types.js";
|
|
28
|
+
import type { A2aServeConfig, ConfigProviderWord, ServiceConfigFlat } from "./config-types.js";
|
|
29
29
|
import { type EnvTableReplacementInput } from "./env-model-table-gate.js";
|
|
30
30
|
/**
|
|
31
31
|
* 活体心跳周期(ms)——`runs.ts` 的 `HEARTBEAT_MS` 就是它(那边 re-export,单源在此)。
|
|
@@ -35,9 +35,9 @@ import { type EnvTableReplacementInput } from "./env-model-table-gate.js";
|
|
|
35
35
|
*/
|
|
36
36
|
export declare const LIVENESS_HEARTBEAT_MS = 30000;
|
|
37
37
|
/** 闭集:新增一条不变量必须在这里加词(拼错 = 编译红,而不是运行期悄悄不判)。 */
|
|
38
|
-
export type CrossInvariantId = "run-stale-heartbeat" | "bind-posture" | "bake-runner-credential" | "direct-door-anchors" | "operator-principals-required" | "operator-single-user" | "bake-operator-principals" | "sensitive-write-patterns" | "leader-host-lane" | "multi-tenant-shared-lane" | "leader-durable-store" | "device-durable-store" | "device-durable-approval" | "model-provider-word" | "gateway-url-userinfo" | "anthropic-credential-exclusive" | "model-route-endpoint" | "default-model-resolvable" | "refused-names-not-minted" | "env-table-replacement-acknowledged" | "
|
|
38
|
+
export type CrossInvariantId = "run-stale-heartbeat" | "bind-posture" | "bake-runner-credential" | "direct-door-anchors" | "operator-principals-required" | "operator-single-user" | "operator-declaration-required" | "operator-single-user-boundary" | "single-user-anonymous-boundary" | "bake-operator-principals" | "sensitive-write-patterns" | "leader-host-lane" | "multi-tenant-shared-lane" | "leader-durable-store" | "device-durable-store" | "device-durable-approval" | "model-provider-word" | "gateway-url-userinfo" | "anthropic-credential-exclusive" | "model-route-endpoint" | "default-model-resolvable" | "refused-names-not-minted" | "env-table-replacement-acknowledged" | "center-one-identity" | "workflow-park-decision-domain" | "remote-config-provider-url" | "retention-lane-complete";
|
|
39
39
|
/** 表读的键集(取自平铺配置型 ⇒ 键名/类型永不与真配置漂)。 */
|
|
40
|
-
export type CrossInvariantView = Readonly<Pick<ServiceConfigFlat, "runStaleSec" | "authToken" | "authTokens" | "allowUnauthedWrites" | "imageBakes" | "directApprovalDoor" | "durableApproval" | "approvalHmacKeys" | "principalJwtPubkeys" | "principalJwtIss" | "principalJwtAud" | "requirePrincipal" | "operatorPrincipals" | "operatorSingleUser" | "sensitiveWritePatterns" | "leaderEnabled" | "selfOrchestrationEnabled" | "workflowRunStoreBackend" | "remoteExec" | "
|
|
40
|
+
export type CrossInvariantView = Readonly<Pick<ServiceConfigFlat, "runStaleSec" | "authToken" | "authTokens" | "allowUnauthedWrites" | "imageBakes" | "directApprovalDoor" | "durableApproval" | "approvalHmacKeys" | "principalJwtPubkeys" | "principalJwtIss" | "principalJwtAud" | "requirePrincipal" | "operatorPrincipals" | "operatorSingleUser" | "bindHost" | "bindHostSource" | "sensitiveWritePatterns" | "leaderEnabled" | "selfOrchestrationEnabled" | "workflowRunStoreBackend" | "remoteExec" | "dbBackend" | "tidb" | "pg" | "envModel" | "gatewayBaseUrl" | "gatewayFallbackUrls" | "anthropic" | "models" | "modelRefusals" | "tiers" | "authBridgeIssuer" | "webAdmin" | "configProvider" | "retentionPolicy" | "retentionSweep">>;
|
|
41
41
|
export interface CrossInvariantInput {
|
|
42
42
|
/** 现役配置(boot 期 = 候选自身)。 */
|
|
43
43
|
readonly live: CrossInvariantView;
|
|
@@ -65,7 +65,7 @@ export interface CrossInvariant {
|
|
|
65
65
|
}
|
|
66
66
|
/**
|
|
67
67
|
* ── [ref] ① 推广(车 UZ 推广轮):**拒因句单铸点**是一类 —— 下面五只是 `config.ts` 区里五条跨域拒启的**判据 + 句子的唯一属主**
|
|
68
|
-
* (`
|
|
68
|
+
* (`modelProviderRefusal` 同形):boot 的 throw(`config.ts`,锚在那儿)与注册表条目的 `check` **都调它**,
|
|
69
69
|
* 没有第二份文本可漂。修前这五条逐条两份不同的句子(boot 手写一份、表里另写一份),boot 那份是运维在 stderr 读到的(`config-validation.test.ts`
|
|
70
70
|
* 钉着它的指纹),表那份只在热路径上被调 —— 而热键集带不上这些键 ⇒ 实际无读者。句子**取 boot 那份**(逐字不变);类钉 =
|
|
71
71
|
* `test/config-hot/batch1-cross-invariants.test.ts` 的「类钉」一格(每条带 `bootAnchor` 的条目,boot 点不手写句子、且来自注册表本人或 check 同调的函数)。
|
|
@@ -84,6 +84,54 @@ export declare function operatorPrincipalsRequiredRefusal(v: Pick<CrossInvariant
|
|
|
84
84
|
* 只在单用户形、名单为空时成立:多租形没有「单一用户」(声明会把每个租户都变成运维);名单非空时两个来源答同一个问题。两形都拒,句子点名两根旋钮与出路。
|
|
85
85
|
*/
|
|
86
86
|
export declare function operatorSingleUserRefusal(v: Pick<CrossInvariantView, "operatorSingleUser" | "requirePrincipal" | "operatorPrincipals">): string | undefined;
|
|
87
|
+
/**
|
|
88
|
+
* `operator-declaration-required`([ref])—— **单用户部署必须说出谁是运维**。单用户形(租户轴不成立,`DEPLOYMENT_SHAPE_PREDICATES.multiTenant`)上
|
|
89
|
+
* 「谁是运维」只有两种答法:`OPERATOR_SINGLE_USER=true`(每个调用方都是)或具名 `OPERATOR_PRINCIPALS`;两样都没有 = 没人能用这台部署的运维面
|
|
90
|
+
* (审批队列全量、诊断、outcomes、管理与记忆治理口),而升级前它是静默的 —— 本条把它变成起服拒,拒句一行给出两条出路。不加旋钮、不加宽限、不给缺省:
|
|
91
|
+
* 只有字面 `true` 是声明(`=false` 与缺席同判)。多租形不归本条:空名单 = 没人是运维是合法的多租姿态(durable 形另由 `operator-principals-required` 管)。
|
|
92
|
+
* 出路 A 只在单用户 ∧ 空名单时给出 —— 恰是 `operator-single-user` 放行的形;忘设 `REQUIRE_PRINCIPAL` 的团队机器不该照它把每个调用方变成运维,句子把它点出来。
|
|
93
|
+
* **两处调用、一只判据**:兜底座在装配运维面的地方(`createHttpServer`,装路由之前;所有装运维面者都过,嵌入方只过这一座,表条目的锚在这里);
|
|
94
|
+
* 服务入口另在起服第 1 段早拒(先于店连接与中心拉取)。不在 `loadConfig`:律管的是有运维面的进程,不装路由的 `run-local`(一次性 CLI,同读 `loadConfig`)不在射程。
|
|
95
|
+
*/
|
|
96
|
+
export declare function operatorDeclarationRefusal(v: Pick<CrossInvariantView, "requirePrincipal" | "operatorPrincipals" | "operatorSingleUser">): string | undefined;
|
|
97
|
+
/** {@link operatorSingleUserBoundaryRefusal} 读的键(条目的 `keys` 与「判正在改的那份」比较同读这一张)。 */
|
|
98
|
+
declare const SINGLE_USER_BOUNDARY_KEYS: readonly ["operatorSingleUser", "authToken", "authTokens", "allowUnauthedWrites", "bindHost", "bindHostSource"];
|
|
99
|
+
type SingleUserBoundaryView = Pick<CrossInvariantView, (typeof SINGLE_USER_BOUNDARY_KEYS)[number]>;
|
|
100
|
+
/**
|
|
101
|
+
* `operator-single-user-boundary` —— **单用户声明要有一道身份边界**。`OPERATOR_SINGLE_USER=true` 让这台部署的每个调用方都是运维(`explicitOperatorOk`),
|
|
102
|
+
* 而「调用方」由部署自己的凭据门划定:没配 service 凭据(`SERVICE_AUTH_TOKEN` / `SERVICE_AUTH_TOKENS`)的部署上,能连上这个口的都是调用方。
|
|
103
|
+
* 监听地址只在本机回环上({@link listensLoopbackOnly} 读 {@link resolveBindHost} —— 起服 listen 读的同一只)⇒ 能连上的只有本机,声明的意思成立;
|
|
104
|
+
* 否则(缺省全接口 / `0.0.0.0` / 局域网地址 / 主机名)⇒ 网络上任何人都是运维(审批队列全量与决断、诊断、管理与记忆治理口)⇒ 起服拒,拒句一行给三条出路:
|
|
105
|
+
* 配凭据 / 只听本机回环 / 撤声明换具名名单。不加旋钮(三条出路都是既有键)。
|
|
106
|
+
* 「谁受伤」= 本地单机 dev 监听全接口、没配凭据、写了声明的部署;补偿 = 三条出路之一。
|
|
107
|
+
* **只在服务入口判**(起服第 1 段,`operator-declaration-required` 之后 —— 没声明先报没声明):律管的是开监听口的进程;`run-local` 不监听、同读 `loadConfig`,不在射程,
|
|
108
|
+
* 所以不在 loadConfig。嵌入方自己 listen,装配座(`createHttpServer`)看不见它绑在哪,不在那里判。
|
|
109
|
+
*/
|
|
110
|
+
export declare function operatorSingleUserBoundaryRefusal(v: SingleUserBoundaryView): string | undefined;
|
|
111
|
+
/** {@link singleUserAnonymousBoundaryRefusal} 读的键(条目的 `keys` 与「判正在改的那份」比较同读这一张)。 */
|
|
112
|
+
declare const ANONYMOUS_BOUNDARY_KEYS: readonly ["requirePrincipal", "authToken", "authTokens", "allowUnauthedWrites", "bindHost", "bindHostSource"];
|
|
113
|
+
type AnonymousBoundaryView = Pick<CrossInvariantView, (typeof ANONYMOUS_BOUNDARY_KEYS)[number]>;
|
|
114
|
+
/**
|
|
115
|
+
* `single-user-anonymous-boundary` —— **单用户部署上不带主体的 run 要有一道身份边界**。单用户形(部署形表 `multiTenant` 不成立)上,不带主体的 run 就是这台部署的那一个人:
|
|
116
|
+
* 部署声明本机属主的规则桶(`boot/runner-deps.ts` 的 `localOwnerRulesDeclared`),这类 run 读那只桶里的持久规则 —— 包括那个人存下的 allow 行。
|
|
117
|
+
* 写面无鉴权(`ALLOW_UNAUTHED_WRITES` ∧ 没配 service 凭据 = {@link bindMustNarrow})时,能连上这个口的都能不带主体提交 run;监听地址只在本机回环 ⇒ 能连上的只有本机,成立;
|
|
118
|
+
* 否则 ⇒ 网络上任何人都按那个人的规则跑 ⇒ 起服拒,拒句一行给两条出路:配凭据 / 只听本机回环。不加旋钮(两条出路都是既有键)。
|
|
119
|
+
* 写面无鉴权且零凭据时,监听地址缺省就收窄到 127.0.0.1(继承的 `HOST` 也压不过)⇒ 本条只在运维显式 `BIND_HOST` 把它暴露出去时成立。
|
|
120
|
+
* 写面要凭据而没配凭据的部署没有人能提交 run,不归本条;配了凭据的部署,调用方 = 凭据持有者(与 `operator-single-user-boundary` 同一道边界)。
|
|
121
|
+
* 「谁受伤」= 单用户 ∧ 写面无鉴权 ∧ 显式非回环 `BIND_HOST` 的部署(含容器里 `BIND_HOST=0.0.0.0`、宿主只发布到回环的那一形 —— 进程看不见宿主怎么发布端口);补偿 = 两条出路之一。
|
|
122
|
+
* **只在服务入口判**(起服第 1 段,紧跟 `operator-single-user-boundary`):律管开监听口的进程;`run-local` 不监听、同读 `loadConfig`,不在射程。
|
|
123
|
+
*/
|
|
124
|
+
export declare function singleUserAnonymousBoundaryRefusal(v: AnonymousBoundaryView): string | undefined;
|
|
125
|
+
/**
|
|
126
|
+
* `a2a-audience-identity-boundary` —— **受限技能只在有身份边界的部署上成立**。`A2A_SERVE_SKILLS` 的条目写了 `audience`(只发布给点名的调用方),而这台部署
|
|
127
|
+
* 没有身份边界 = 配置**没接任何已验身份来源**(`identity-source.ts` 的 `configuredIdentitySources` 为空 —— 「这台部署接了哪几个身份来源」的唯一读法:
|
|
128
|
+
* 没配服务凭据、没配鉴权桥 issuer(含中心回退)、没开直连门)。卡谓词只读**验过的**来源(`a2a-serve.ts` 的 `cardReaderOf` 先问 `verifiedIdentitySource`,匿名自报的主体头读成匿名),
|
|
129
|
+
* 所以这一形上**没有任何调用方能被名单点中** —— 照装就是一份静默失效的名单。只设 trace 凭据(只读凭据,不是身份来源)或只开 `REQUIRE_PRINCIPAL`(要求主体在场,
|
|
130
|
+
* 不验它)都不接来源,同判。起服拒,拒句一行给两条出路(接一个已验身份来源 / 删掉 `audience`),与 `operatorDeclarationRefusal` 同形。不回显名单里的名字。
|
|
131
|
+
* 座在装配路由的地方(`createHttpServer`,装路由之前;与 `operator-declaration-required` 的兜底座相邻,服务入口与嵌入方都过这一座)。
|
|
132
|
+
* 判据收座上对 `configuredIdentitySources(config)` 的读数,本函数不另写一份「有没有凭据」。热路径不必判:`A2A_SERVE_SKILLS` 与身份键都只来自 env、起服冻结。
|
|
133
|
+
*/
|
|
134
|
+
export declare function a2aAudienceIdentityBoundaryRefusal(a2aServe: A2aServeConfig | undefined, noVerifiedSource: boolean): string | undefined;
|
|
87
135
|
/** `bake-operator-principals`(IMAGE-API-DESIGN §P2.4a):bake 门是 build-host 无限制执行面,要**具名**运维 —— 空名单下要么没人用得了,要么(单用户声明)人人用得了。 */
|
|
88
136
|
export declare function bakeOperatorPrincipalsRefusal(v: Pick<CrossInvariantView, "imageBakes" | "operatorPrincipals">): string | undefined;
|
|
89
137
|
/**
|
|
@@ -133,6 +181,11 @@ export declare function remoteConfigProviderUrlRefusal(v: {
|
|
|
133
181
|
* 留在扫车道自持门(`boot/retention-lane.ts`)。状态型:三键都只来自 env、运行期无写点 ⇒ 热路径上恒与 boot 同答。
|
|
134
182
|
*/
|
|
135
183
|
export declare function retentionLaneRefusal(v: Pick<CrossInvariantView, "retentionPolicy" | "retentionSweep">): string | undefined;
|
|
184
|
+
/**
|
|
185
|
+
* `run-stale-heartbeat` 的判据与拒因(唯一属主;[ref] ① 同形 —— 注册表条目的 `check` 与起服第 1 段的早拒都调它)。参数取窄 `Pick`:起服第 1 段手里是
|
|
186
|
+
* 合成之前的 raw 配置(执行车道还没定形),本条不读车道。
|
|
187
|
+
*/
|
|
188
|
+
export declare function runStaleHeartbeatRefusal(v: Pick<CrossInvariantView, "runStaleSec">): string | undefined;
|
|
136
189
|
export declare const CONFIG_CROSS_INVARIANTS: readonly CrossInvariant[];
|
|
137
190
|
/**
|
|
138
191
|
* 按 id 取**一条**([ref]②:boot 面的单源化出口)。
|
|
@@ -153,4 +206,5 @@ export type CrossInvariantVerdict = {
|
|
|
153
206
|
};
|
|
154
207
|
/** 全表校验(**第一条不过即拒**:候选是整批的,报第一个成因足够行动,继续跑其余条目只会淹掉它)。 */
|
|
155
208
|
export declare function checkCrossInvariants(input: CrossInvariantInput): CrossInvariantVerdict;
|
|
209
|
+
export {};
|
|
156
210
|
//# sourceMappingURL=config-invariants.d.ts.map
|
|
@@ -6,19 +6,18 @@ import { modelRouteEndpointRefusal } from "./model-route-endpoint.js";
|
|
|
6
6
|
import { defaultModelRefusal, refusedNameMintedRefusal } from "./model-entry-refusal.js";
|
|
7
7
|
import { judgeEnvTableReplacement } from "./env-model-table-gate.js";
|
|
8
8
|
import { WEB_ADMIN_ENV, httpUrlFlaws } from "@sema-agent/settings-schema";
|
|
9
|
-
import { authBridgeIssuerOf } from "./
|
|
9
|
+
import { authBridgeIssuerOf } from "./identity-source.js";
|
|
10
10
|
import { buildDisplaySafeUrl } from "./trace/redact.js";
|
|
11
|
-
import {
|
|
11
|
+
import { ALL_EXECUTION_LANES, executionLaneCaps } from "./execution-lane-caps.js";
|
|
12
12
|
import { DEPLOYMENT_SHAPE_PREDICATES } from "./deployment-shape.js";
|
|
13
|
+
import { anyServiceCredential, bindMustNarrow, listensLoopbackOnly, resolveBindHost } from "./bind-host.js";
|
|
13
14
|
export const LIVENESS_HEARTBEAT_MS = 30_000;
|
|
14
|
-
const anyServiceAuth = (v) => Boolean(v.authToken) || Object.keys(v.authTokens ?? {}).length > 0;
|
|
15
|
-
const mustNarrowBind = (v) => Boolean(v.allowUnauthedWrites) && !anyServiceAuth(v);
|
|
16
15
|
const directDoorConjuncts = (v) => Boolean(v.directApprovalDoor) && Boolean(v.durableApproval) && v.approvalHmacKeys.length > 0 && v.principalJwtPubkeys.length > 0 && Boolean(v.principalJwtIss) && Boolean(v.principalJwtAud);
|
|
17
16
|
function multiTenantSharedLaneRefusal(v) {
|
|
18
|
-
const lane =
|
|
17
|
+
const lane = v.remoteExec.provider;
|
|
19
18
|
if (DEPLOYMENT_SHAPE_PREDICATES.laneSeparatesTenants.holds(v))
|
|
20
19
|
return undefined;
|
|
21
|
-
const outlets =
|
|
20
|
+
const outlets = ALL_EXECUTION_LANES.filter((w) => executionLaneCaps(w).tenantSeparation === "supported");
|
|
22
21
|
return (`REQUIRE_PRINCIPAL=true (multi-tenant posture) with the "${lane}" execution lane runs every tenant's Bash on one shared target — ` +
|
|
23
22
|
`this lane does not separate tenants; set REMOTE_EXEC to ${outlets.join(" / ")}, or unset REQUIRE_PRINCIPAL for a single-user box`);
|
|
24
23
|
}
|
|
@@ -56,6 +55,71 @@ export function operatorSingleUserRefusal(v) {
|
|
|
56
55
|
return "OPERATOR_SINGLE_USER=true but OPERATOR_PRINCIPALS is also set — the two answer the same question (who is an operator) in two ways. Keep one: OPERATOR_SINGLE_USER=true (every caller of this single-user deployment) or OPERATOR_PRINCIPALS (only the named principals)";
|
|
57
56
|
return undefined;
|
|
58
57
|
}
|
|
58
|
+
export function operatorDeclarationRefusal(v) {
|
|
59
|
+
if (DEPLOYMENT_SHAPE_PREDICATES.multiTenant.holds(v) || v.operatorPrincipals.length > 0 || v.operatorSingleUser === true)
|
|
60
|
+
return undefined;
|
|
61
|
+
return ("No operator is declared for this single-user deployment: REQUIRE_PRINCIPAL is off, OPERATOR_PRINCIPALS is empty and OPERATOR_SINGLE_USER is not true, " +
|
|
62
|
+
"so no caller could use its operator endpoints (the approval queues across owners, GET /v1/diagnostics/wiring, GET /v1/outcomes, the admin and memory-governance endpoints). " +
|
|
63
|
+
"Declare who operates it in one line: OPERATOR_SINGLE_USER=true (every caller of this single-user deployment is its operator — with a service credential or a loopback-only listener, or anyone who can reach the port is) or OPERATOR_PRINCIPALS=<principal,...> (only the named principals); " +
|
|
64
|
+
"a worker called by more than one person is multi-tenant — set REQUIRE_PRINCIPAL=true instead (MIGRATION.md, invariant operator-declaration-required). Refusing to boot.");
|
|
65
|
+
}
|
|
66
|
+
const SINGLE_USER_BOUNDARY_KEYS = ["operatorSingleUser", "authToken", "authTokens", "allowUnauthedWrites", "bindHost", "bindHostSource"];
|
|
67
|
+
function sameSingleUserBoundary(a, b) {
|
|
68
|
+
return a.operatorSingleUser === b.operatorSingleUser && anyServiceCredential(a) === anyServiceCredential(b) && resolveBindHost(a) === resolveBindHost(b);
|
|
69
|
+
}
|
|
70
|
+
export function operatorSingleUserBoundaryRefusal(v) {
|
|
71
|
+
if (v.operatorSingleUser !== true || anyServiceCredential(v))
|
|
72
|
+
return undefined;
|
|
73
|
+
const where = offHostListener(v);
|
|
74
|
+
if (where === undefined)
|
|
75
|
+
return undefined;
|
|
76
|
+
return (`OPERATOR_SINGLE_USER=true with no service credential, listening on ${where} — the declaration makes every caller an operator, and without a credential every caller ` +
|
|
77
|
+
"is anyone who can reach this port (the approval queues across owners and their decisions, GET /v1/diagnostics/wiring, the admin and memory-governance endpoints). " +
|
|
78
|
+
"Pick one: set SERVICE_AUTH_TOKEN (or SERVICE_AUTH_TOKENS) so only credential holders reach this deployment; or listen on loopback only (BIND_HOST=127.0.0.1 — " +
|
|
79
|
+
"a container whose port is published to other hosts needs a credential instead); or unset OPERATOR_SINGLE_USER and name the operators in OPERATOR_PRINCIPALS " +
|
|
80
|
+
"(MIGRATION.md, invariant operator-single-user-boundary). Refusing to boot.");
|
|
81
|
+
}
|
|
82
|
+
function offHostListener(v) {
|
|
83
|
+
const bound = resolveBindHost(v);
|
|
84
|
+
if (listensLoopbackOnly(bound))
|
|
85
|
+
return undefined;
|
|
86
|
+
return bound === undefined ? "every network interface (BIND_HOST is not set)" : `${bound}${v.bindHostSource === "HOST" ? " (from the HOST env var)" : ""}`;
|
|
87
|
+
}
|
|
88
|
+
const ANONYMOUS_BOUNDARY_KEYS = ["requirePrincipal", "authToken", "authTokens", "allowUnauthedWrites", "bindHost", "bindHostSource"];
|
|
89
|
+
function sameAnonymousBoundary(a, b) {
|
|
90
|
+
return DEPLOYMENT_SHAPE_PREDICATES.multiTenant.holds(a) === DEPLOYMENT_SHAPE_PREDICATES.multiTenant.holds(b) && bindMustNarrow(a) === bindMustNarrow(b) && resolveBindHost(a) === resolveBindHost(b);
|
|
91
|
+
}
|
|
92
|
+
export function singleUserAnonymousBoundaryRefusal(v) {
|
|
93
|
+
if (DEPLOYMENT_SHAPE_PREDICATES.multiTenant.holds(v) || !bindMustNarrow(v))
|
|
94
|
+
return undefined;
|
|
95
|
+
const where = offHostListener(v);
|
|
96
|
+
if (where === undefined)
|
|
97
|
+
return undefined;
|
|
98
|
+
return (`ALLOW_UNAUTHED_WRITES=true with no service credential on a single-user deployment (REQUIRE_PRINCIPAL is off), listening on ${where} — anyone who can reach this port ` +
|
|
99
|
+
"submits runs without a principal, and on a single-user deployment such a run is this deployment's one user: it runs under the local-owner permission-rule bucket, " +
|
|
100
|
+
"so the standing rules that user saved — allow rules included — apply to every caller. " +
|
|
101
|
+
"Pick one: set SERVICE_AUTH_TOKEN (or SERVICE_AUTH_TOKENS) so only credential holders submit runs; or listen on loopback only (BIND_HOST=127.0.0.1, or leave BIND_HOST unset — " +
|
|
102
|
+
"an unauthenticated write face then listens on 127.0.0.1 by itself; a container whose port is published to other hosts needs a credential instead) " +
|
|
103
|
+
"(MIGRATION.md, invariant single-user-anonymous-boundary). Refusing to boot.");
|
|
104
|
+
}
|
|
105
|
+
export function a2aAudienceIdentityBoundaryRefusal(a2aServe, noVerifiedSource) {
|
|
106
|
+
if (!noVerifiedSource || a2aServe === undefined)
|
|
107
|
+
return undefined;
|
|
108
|
+
const restricted = a2aServe.skills.filter((s) => s.audience !== undefined).length;
|
|
109
|
+
if (restricted === 0)
|
|
110
|
+
return undefined;
|
|
111
|
+
return (`A2A_SERVE_SKILLS declares ${restricted} skill${restricted === 1 ? "" : "s"} with an "audience", but this deployment has no identity boundary: ` +
|
|
112
|
+
`it wires no verified identity source (no service credential, no SSO bridge, no direct-door principal JWT; a trace token or REQUIRE_PRINCIPAL alone verifies nobody), ` +
|
|
113
|
+
`so a caller's principal header is only a self-asserted label and no caller could ever be matched against an audience. ` +
|
|
114
|
+
`Wire one verified identity source (SERVICE_AUTH_TOKEN / SERVICE_AUTH_TOKENS, the SSO bridge, or the direct door) or remove the "audience" entries from A2A_SERVE_SKILLS ` +
|
|
115
|
+
`(MIGRATION.md, invariant a2a-audience-identity-boundary). Refusing to boot.`);
|
|
116
|
+
}
|
|
117
|
+
function sameOperatorDeclaration(a, b) {
|
|
118
|
+
return (DEPLOYMENT_SHAPE_PREDICATES.multiTenant.holds(a) === DEPLOYMENT_SHAPE_PREDICATES.multiTenant.holds(b) &&
|
|
119
|
+
a.operatorSingleUser === b.operatorSingleUser &&
|
|
120
|
+
a.operatorPrincipals.length === b.operatorPrincipals.length &&
|
|
121
|
+
a.operatorPrincipals.every((p, k) => p === b.operatorPrincipals[k]));
|
|
122
|
+
}
|
|
59
123
|
export function bakeOperatorPrincipalsRefusal(v) {
|
|
60
124
|
return v.imageBakes.enabled && v.operatorPrincipals.length === 0
|
|
61
125
|
? "IMAGE_BAKES_ENABLED=true but OPERATOR_PRINCIPALS is empty — the bake door runs build.sh on the privileged build host and needs named operators: with an empty list nobody can use it, and the single-user operator declaration would open it to every caller (world-writable RCE). Set OPERATOR_PRINCIPALS or disable bakes (IMAGE-API-DESIGN.md §P2.4a boot invariant)"
|
|
@@ -132,21 +196,24 @@ export function retentionLaneRefusal(v) {
|
|
|
132
196
|
return (`RETENTION_SWEEP_INTERVAL_SEC=${intervalSec} arms the retention sweep lane, but ${gaps} — the lane would enumerate domains every tick and compute nothing. ` +
|
|
133
197
|
"Set RETENTION_MAX_AGE_DAYS, or set RETENTION_SWEEP_INTERVAL_SEC=0 to leave the lane off. Refusing to boot.");
|
|
134
198
|
}
|
|
199
|
+
export function runStaleHeartbeatRefusal(v) {
|
|
200
|
+
return v.runStaleSec * 1000 <= LIVENESS_HEARTBEAT_MS
|
|
201
|
+
? `runStaleSec (${v.runStaleSec}s) must exceed the ${LIVENESS_HEARTBEAT_MS / 1000}s liveness heartbeat — the reaper would race a run that is still heartbeating normally and reap live work`
|
|
202
|
+
: undefined;
|
|
203
|
+
}
|
|
135
204
|
export const CONFIG_CROSS_INVARIANTS = [
|
|
136
205
|
{
|
|
137
206
|
id: "run-stale-heartbeat",
|
|
138
207
|
keys: ["runStaleSec"],
|
|
139
208
|
restartReason: "run-stale-heartbeat",
|
|
140
209
|
bootAnchor: { file: "src/boot/stage-01-config.ts", marker: "CROSS-INVARIANT:run-stale-heartbeat" },
|
|
141
|
-
check: ({ next }) => next
|
|
142
|
-
? `runStaleSec (${next.runStaleSec}s) must exceed the ${LIVENESS_HEARTBEAT_MS / 1000}s liveness heartbeat — the reaper would race a run that is still heartbeating normally and reap live work`
|
|
143
|
-
: undefined,
|
|
210
|
+
check: ({ next }) => runStaleHeartbeatRefusal(next),
|
|
144
211
|
},
|
|
145
212
|
{
|
|
146
213
|
id: "bind-posture",
|
|
147
214
|
keys: ["authToken", "authTokens", "allowUnauthedWrites"],
|
|
148
215
|
restartReason: "bind-posture",
|
|
149
|
-
check: ({ live, next }) => !
|
|
216
|
+
check: ({ live, next }) => !bindMustNarrow(live) && bindMustNarrow(next)
|
|
150
217
|
? "this candidate would make the unauthenticated-write posture require narrowing the listener to 127.0.0.1, but the listen address is bound once at boot — refusing to hot-apply (restart to re-bind)"
|
|
151
218
|
: undefined,
|
|
152
219
|
},
|
|
@@ -181,6 +248,27 @@ export const CONFIG_CROSS_INVARIANTS = [
|
|
|
181
248
|
bootAnchor: { file: "src/config.ts", marker: "CROSS-INVARIANT:operator-single-user" },
|
|
182
249
|
check: ({ next }) => operatorSingleUserRefusal(next),
|
|
183
250
|
},
|
|
251
|
+
{
|
|
252
|
+
id: "operator-declaration-required",
|
|
253
|
+
keys: ["requirePrincipal", "operatorPrincipals", "operatorSingleUser"],
|
|
254
|
+
restartReason: "operator-principals",
|
|
255
|
+
bootAnchor: { file: "src/http/server.ts", marker: "CROSS-INVARIANT:operator-declaration-required" },
|
|
256
|
+
check: ({ live, next }) => (sameOperatorDeclaration(live, next) ? undefined : operatorDeclarationRefusal(next)),
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
id: "single-user-anonymous-boundary",
|
|
260
|
+
keys: [...ANONYMOUS_BOUNDARY_KEYS],
|
|
261
|
+
restartReason: "bind-posture",
|
|
262
|
+
bootAnchor: { file: "src/boot/stage-01-config.ts", marker: "CROSS-INVARIANT:single-user-anonymous-boundary" },
|
|
263
|
+
check: ({ live, next }) => (sameAnonymousBoundary(live, next) ? undefined : singleUserAnonymousBoundaryRefusal(next)),
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
id: "operator-single-user-boundary",
|
|
267
|
+
keys: [...SINGLE_USER_BOUNDARY_KEYS],
|
|
268
|
+
restartReason: "operator-principals",
|
|
269
|
+
bootAnchor: { file: "src/boot/stage-01-config.ts", marker: "CROSS-INVARIANT:operator-single-user-boundary" },
|
|
270
|
+
check: ({ live, next }) => (sameSingleUserBoundary(live, next) ? undefined : operatorSingleUserBoundaryRefusal(next)),
|
|
271
|
+
},
|
|
184
272
|
{
|
|
185
273
|
id: "bake-operator-principals",
|
|
186
274
|
keys: ["imageBakes", "operatorPrincipals"],
|
|
@@ -203,20 +291,13 @@ export const CONFIG_CROSS_INVARIANTS = [
|
|
|
203
291
|
}
|
|
204
292
|
},
|
|
205
293
|
},
|
|
206
|
-
{
|
|
207
|
-
id: "require-execution-lane",
|
|
208
|
-
keys: ["requireExecutionLane", "remoteExec"],
|
|
209
|
-
restartReason: "execution-lane",
|
|
210
|
-
bootAnchor: { file: "src/config.ts", marker: "CROSS-INVARIANT:require-execution-lane" },
|
|
211
|
-
check: ({ next }) => executionLaneRequiredRefusal(next),
|
|
212
|
-
},
|
|
213
294
|
{
|
|
214
295
|
id: "leader-host-lane",
|
|
215
296
|
keys: ["leaderEnabled", "remoteExec"],
|
|
216
297
|
restartReason: "leader-lane",
|
|
217
298
|
bootAnchor: { file: "src/boot/execution-lane.ts", marker: "CROSS-INVARIANT:leader-host-lane" },
|
|
218
|
-
check: ({ next }) => next.leaderEnabled && next.remoteExec
|
|
219
|
-
? "LEADER_ENABLED=true on the host execution lane (REMOTE_EXEC=host,
|
|
299
|
+
check: ({ next }) => next.leaderEnabled && next.remoteExec.provider === "host"
|
|
300
|
+
? "LEADER_ENABLED=true on the host execution lane (REMOTE_EXEC=host, or a " +
|
|
220
301
|
"config.d/remote-exec.json host override) is refused: the leader wire pins ONE absolute workspace path " +
|
|
221
302
|
"(LEADER_WORKSPACE / the /home/user default) for every sub-worker, while the host adapter gives each env a " +
|
|
222
303
|
"DIFFERENT random directory — so N concurrent host workers would share one physical git worktree and " +
|
|
@@ -251,13 +332,13 @@ export const CONFIG_CROSS_INVARIANTS = [
|
|
|
251
332
|
keys: ["remoteExec", "dbBackend", "tidb", "pg"],
|
|
252
333
|
restartReason: "device-lane",
|
|
253
334
|
bootAnchor: { file: "src/boot/execution-lane.ts", marker: "CROSS-INVARIANT:device-durable-store" },
|
|
254
|
-
check: ({ next }) => next.remoteExec
|
|
335
|
+
check: ({ next }) => next.remoteExec.provider === "device" && !((next.dbBackend === "mysql" && next.tidb !== undefined) || (next.dbBackend === "pg" && next.pg !== undefined))
|
|
255
336
|
? `REMOTE_EXEC=device with DB_BACKEND=${next.dbBackend} and no SQL connection coordinates built is refused ` +
|
|
256
337
|
"[device-durable-store]: the device registry, the session↔device binding and the device audit trail are all " +
|
|
257
338
|
"SQL-backed — without a real SQL store the binding lives in this process only, so a restart forgets WHICH device " +
|
|
258
339
|
"a parked run must resume onto and a second replica cannot see it at all. Note DB_BACKEND alone is not enough: " +
|
|
259
340
|
"SESSION_BACKEND=memory (or auto with no MYSQL_HOST/PG_HOST) builds no coordinates at all. Configure a durable " +
|
|
260
|
-
"store (DB_BACKEND=mysql|pg + its *_HOST/*_USER/*_DATABASE), or
|
|
341
|
+
"store (DB_BACKEND=mysql|pg + its *_HOST/*_USER/*_DATABASE), or declare another lane (REMOTE_EXEC=none if the agent's tools need no execution environment) " +
|
|
261
342
|
"(device-executor-lane-v2 §4.7 boot invariant)"
|
|
262
343
|
: undefined,
|
|
263
344
|
},
|
|
@@ -266,11 +347,11 @@ export const CONFIG_CROSS_INVARIANTS = [
|
|
|
266
347
|
keys: ["remoteExec", "durableApproval"],
|
|
267
348
|
restartReason: "device-lane",
|
|
268
349
|
bootAnchor: { file: "src/boot/execution-lane.ts", marker: "CROSS-INVARIANT:device-durable-approval" },
|
|
269
|
-
check: ({ next }) => next.remoteExec
|
|
350
|
+
check: ({ next }) => next.remoteExec.provider === "device" && !next.durableApproval
|
|
270
351
|
? "REMOTE_EXEC=device without DURABLE_APPROVAL=true is refused [device-durable-approval]: a personal device goes " +
|
|
271
352
|
"offline (lid closed, network drop) at arbitrary points, so an in-flight approval that outlives the window MUST " +
|
|
272
353
|
"have a park exit — without the durable approval store there is none and the run is stuck with nowhere to persist. " +
|
|
273
|
-
"Set DURABLE_APPROVAL=true, or
|
|
354
|
+
"Set DURABLE_APPROVAL=true, or declare another lane (REMOTE_EXEC=none if the agent's tools need no execution environment) (device-executor-lane-v2 §4.7 boot invariant)"
|
|
274
355
|
: undefined,
|
|
275
356
|
},
|
|
276
357
|
{
|