@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,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" | "operator-declaration-required" | "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";
|
|
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" | "dbBackend" | "tidb" | "pg" | "envModel" | "gatewayBaseUrl" | "gatewayFallbackUrls" | "anthropic" | "models" | "modelRefusals" | "tiers" | "authBridgeIssuer" | "webAdmin" | "configProvider" | "retentionPolicy" | "retentionSweep">>;
|
|
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;
|
|
@@ -94,6 +94,44 @@ export declare function operatorSingleUserRefusal(v: Pick<CrossInvariantView, "o
|
|
|
94
94
|
* 服务入口另在起服第 1 段早拒(先于店连接与中心拉取)。不在 `loadConfig`:律管的是有运维面的进程,不装路由的 `run-local`(一次性 CLI,同读 `loadConfig`)不在射程。
|
|
95
95
|
*/
|
|
96
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;
|
|
97
135
|
/** `bake-operator-principals`(IMAGE-API-DESIGN §P2.4a):bake 门是 build-host 无限制执行面,要**具名**运维 —— 空名单下要么没人用得了,要么(单用户声明)人人用得了。 */
|
|
98
136
|
export declare function bakeOperatorPrincipalsRefusal(v: Pick<CrossInvariantView, "imageBakes" | "operatorPrincipals">): string | undefined;
|
|
99
137
|
/**
|
|
@@ -168,4 +206,5 @@ export type CrossInvariantVerdict = {
|
|
|
168
206
|
};
|
|
169
207
|
/** 全表校验(**第一条不过即拒**:候选是整批的,报第一个成因足够行动,继续跑其余条目只会淹掉它)。 */
|
|
170
208
|
export declare function checkCrossInvariants(input: CrossInvariantInput): CrossInvariantVerdict;
|
|
209
|
+
export {};
|
|
171
210
|
//# sourceMappingURL=config-invariants.d.ts.map
|
|
@@ -6,13 +6,12 @@ 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
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
17
|
const lane = v.remoteExec.provider;
|
|
@@ -61,9 +60,60 @@ export function operatorDeclarationRefusal(v) {
|
|
|
61
60
|
return undefined;
|
|
62
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, " +
|
|
63
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). " +
|
|
64
|
-
"Declare who operates it in one line: OPERATOR_SINGLE_USER=true (every caller of this single-user deployment is its operator) or OPERATOR_PRINCIPALS=<principal,...> (only the named principals); " +
|
|
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); " +
|
|
65
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.");
|
|
66
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
|
+
}
|
|
67
117
|
function sameOperatorDeclaration(a, b) {
|
|
68
118
|
return (DEPLOYMENT_SHAPE_PREDICATES.multiTenant.holds(a) === DEPLOYMENT_SHAPE_PREDICATES.multiTenant.holds(b) &&
|
|
69
119
|
a.operatorSingleUser === b.operatorSingleUser &&
|
|
@@ -163,7 +213,7 @@ export const CONFIG_CROSS_INVARIANTS = [
|
|
|
163
213
|
id: "bind-posture",
|
|
164
214
|
keys: ["authToken", "authTokens", "allowUnauthedWrites"],
|
|
165
215
|
restartReason: "bind-posture",
|
|
166
|
-
check: ({ live, next }) => !
|
|
216
|
+
check: ({ live, next }) => !bindMustNarrow(live) && bindMustNarrow(next)
|
|
167
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)"
|
|
168
218
|
: undefined,
|
|
169
219
|
},
|
|
@@ -205,6 +255,20 @@ export const CONFIG_CROSS_INVARIANTS = [
|
|
|
205
255
|
bootAnchor: { file: "src/http/server.ts", marker: "CROSS-INVARIANT:operator-declaration-required" },
|
|
206
256
|
check: ({ live, next }) => (sameOperatorDeclaration(live, next) ? undefined : operatorDeclarationRefusal(next)),
|
|
207
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
|
+
},
|
|
208
272
|
{
|
|
209
273
|
id: "bake-operator-principals",
|
|
210
274
|
keys: ["imageBakes", "operatorPrincipals"],
|
package/dist/config-lkg.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type MigrationReceipt } from "@sema-agent/settings-schema/one-time-migrations";
|
|
2
2
|
import { type PublishedPromptArtifact } from "@sema-agent/core";
|
|
3
|
+
import { type ConfigDirTrustHost } from "./config-dir-trust.js";
|
|
3
4
|
/** 落盘信封。`effective`/`etag` 逐字=当时的 fetchEffective 返回(JSON verbatim 面)。`formatVersion` 的语义见头注(5 = 载荷的 prompts 是中心层唯一的那种 wire 形)。 */
|
|
4
5
|
export interface PersistedLkg {
|
|
5
6
|
formatVersion: 5;
|
|
@@ -22,6 +23,21 @@ export declare function defaultSkillCacheDir(config: {
|
|
|
22
23
|
export declare function defaultLkgPath(config: {
|
|
23
24
|
readonly agentConfigDir?: string;
|
|
24
25
|
}, worker: string | undefined, identity: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* formatVersion 1(7.98.0 及以前,信封不带凭证身份)的 LKG 不读回时的**拒因** —— 一个事实一句话:`loadLkg` 的 1 臂(`CONFIG_LKG_PATH` 指到旧文件)与
|
|
28
|
+
* 起服读腿点名默认路径旧文件名那一臂({@link preIdentityLkgPath})说同一句,运维按同一个 `reason` 认。
|
|
29
|
+
*/
|
|
30
|
+
export declare const PRE_IDENTITY_LKG_REASON = "pre-identity LKG (formatVersion 1) \u2014 not read back: it cannot prove whose credential fetched it (S-651); the next clean candidate rewrites it";
|
|
31
|
+
/**
|
|
32
|
+
* 默认路径上 7.98.0 及以前的旧 LKG 还在吗 —— 在 ⇒ 交回它的路径,起服读腿据此打一行 `config_lkg_unusable`(拒因 {@link PRE_IDENTITY_LKG_REASON} + 出路「删掉」);
|
|
33
|
+
* 不在 ⇒ `undefined`。只看名字上有没有东西(`existsSync`),**不读内容**、不迁、不改名:那个名字只有身份箱之前的版本写过,一次性迁移窗已关。
|
|
34
|
+
* 配置根本身进不去时答「不在」—— 与 {@link loadLkg} 读箱同一个读法(那一形箱也读不到,箱缺席已是这次起服的结局)。
|
|
35
|
+
* 调用方只在读箱答「缺席」、且没有 `CONFIG_LKG_PATH` 覆写时问(覆写的那一条路径由 `loadLkg` 自己判);`loadLkg` 把读不了的箱也答成缺席,所以这里先看
|
|
36
|
+
* 箱名字上有没有东西 —— 有 ⇒ 箱在,旧文件与这次起服无关。
|
|
37
|
+
*/
|
|
38
|
+
export declare function preIdentityLkgLeftover(config: {
|
|
39
|
+
readonly agentConfigDir?: string;
|
|
40
|
+
}, worker: string | undefined, binPath: string): string | undefined;
|
|
25
41
|
/**
|
|
26
42
|
* `CONFIG_LKG_PATH`(LKG 落盘路径覆写)的**唯一读法**:没设 ⇒ `undefined`(LKG 落在配置根下按箱派生,{@link defaultLkgPath});设了 ⇒ 绝对路径
|
|
27
43
|
* (相对值按进程 cwd 解,与文件被打开时同一个解法);空串 ⇒ 拒(起服拒):空串解出来是进程工作目录本身 —— 一条落盘路径不该是一个目录,
|
|
@@ -55,14 +71,20 @@ export interface LkgReadMigration {
|
|
|
55
71
|
readonly note?: string;
|
|
56
72
|
readonly receipts: readonly MigrationReceipt[];
|
|
57
73
|
}
|
|
74
|
+
/** {@link loadLkg} 读之前判官要的两件:声明的属主(`CONFIG_LOCAL_OWNER_UID`,配置席 `configLocalOwnerUid`;与本地配置根同一张可信集)+ 宿主事实(测试注入;缺席 = 本进程)。 */
|
|
75
|
+
export interface LkgReadTrust {
|
|
76
|
+
readonly declaredOwnerUid: number | undefined;
|
|
77
|
+
readonly host?: ConfigDirTrustHost;
|
|
78
|
+
}
|
|
58
79
|
/**
|
|
59
80
|
* 读盘上 LKG。返回 undefined 的所有情形都「安静地回 env 兜底」(调用方 warn 点名 reason):
|
|
81
|
+
* 别人改得动这份文件(目录信任判官的发现)/
|
|
60
82
|
* 文件缺席/JSON 坏/信封形不对/worker 或凭证身份不匹配(防同名文件跨 worker / 跨账号串包;`CONFIG_LKG_PATH`
|
|
61
83
|
* 单一路径时这是唯一的一道)/载荷有迁不动的旧形({@link migrateLkgPayload})/prompts 面复判失败。
|
|
62
84
|
* `migrated`:读回时做过一次性迁移(信封 2 → 3 / 4 → 5 或载荷的 settings-schema 迁移)—— 调用方响亮打一行,并把交回的 5 写回原位。
|
|
63
85
|
* `prompts`:候选判官对这份载荷 prompts 面交出的中心层(引擎 verify 过的发布形 artifact;`undefined` = 载荷不带 prompts 键)—— 调用方采纳直接用它。
|
|
64
86
|
*/
|
|
65
|
-
export declare function loadLkg(path: string, worker: string | undefined, identity: string): Promise<{
|
|
87
|
+
export declare function loadLkg(path: string, worker: string | undefined, identity: string, trust: LkgReadTrust): Promise<{
|
|
66
88
|
lkg: PersistedLkg;
|
|
67
89
|
prompts: PublishedPromptArtifact | undefined;
|
|
68
90
|
migrated?: LkgReadMigration;
|
package/dist/config-lkg.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { promises as fs } from "node:fs";
|
|
1
|
+
import { existsSync, promises as fs } from "node:fs";
|
|
2
2
|
import { migrateEffectiveSnapshot } from "@sema-agent/settings-schema/one-time-migrations";
|
|
3
3
|
import { formatConfigPath } from "@sema-agent/settings-schema";
|
|
4
4
|
import { join, dirname, resolve } from "node:path";
|
|
@@ -7,12 +7,23 @@ import { judgeConfigCandidate } from "./web-admin-client/candidate-gate.js";
|
|
|
7
7
|
import { centerStateBin } from "./center-credential.js";
|
|
8
8
|
import { configRootOf } from "./sema-config-dir.js";
|
|
9
9
|
import { atomicWriteFileAsync } from "./plugins/owner-only-file-mode.js";
|
|
10
|
+
import { trustedFileRefusal } from "./config-dir-trust.js";
|
|
10
11
|
export function defaultSkillCacheDir(config) {
|
|
11
12
|
return join(configRootOf(config), "skill-cache");
|
|
12
13
|
}
|
|
13
14
|
export function defaultLkgPath(config, worker, identity) {
|
|
14
15
|
return join(configRootOf(config), `config-lkg-${centerStateBin(worker, identity)}.json`);
|
|
15
16
|
}
|
|
17
|
+
export const PRE_IDENTITY_LKG_REASON = "pre-identity LKG (formatVersion 1) — not read back: it cannot prove whose credential fetched it (S-651); the next clean candidate rewrites it";
|
|
18
|
+
function preIdentityLkgPath(config, worker) {
|
|
19
|
+
return join(configRootOf(config), `config-lkg-${(worker ?? "global").replace(/[^a-zA-Z0-9._-]/g, "_").slice(0, 64)}.json`);
|
|
20
|
+
}
|
|
21
|
+
export function preIdentityLkgLeftover(config, worker, binPath) {
|
|
22
|
+
if (existsSync(binPath))
|
|
23
|
+
return undefined;
|
|
24
|
+
const path = preIdentityLkgPath(config, worker);
|
|
25
|
+
return existsSync(path) ? path : undefined;
|
|
26
|
+
}
|
|
16
27
|
export function lkgPathOverrideOf(raw) {
|
|
17
28
|
if (raw === undefined)
|
|
18
29
|
return undefined;
|
|
@@ -32,7 +43,10 @@ export async function saveLkg(path, worker, identity, effective, etag) {
|
|
|
32
43
|
ensureDir(dirname(path));
|
|
33
44
|
await atomicWriteFileAsync(path, JSON.stringify(body), { durability: "best-effort" });
|
|
34
45
|
}
|
|
35
|
-
export async function loadLkg(path, worker, identity) {
|
|
46
|
+
export async function loadLkg(path, worker, identity, trust) {
|
|
47
|
+
const untrusted = await trustedFileRefusal({ reader: "lkg", file: path, declaredOwnerUid: trust.declaredOwnerUid, ...(trust.host !== undefined ? { host: trust.host } : {}) });
|
|
48
|
+
if (untrusted !== undefined)
|
|
49
|
+
return { reason: untrusted };
|
|
36
50
|
let text;
|
|
37
51
|
try {
|
|
38
52
|
text = await fs.readFile(path, "utf8");
|
|
@@ -52,7 +66,7 @@ export async function loadLkg(path, worker, identity) {
|
|
|
52
66
|
const p = parsed;
|
|
53
67
|
const formatVersion = p.formatVersion;
|
|
54
68
|
if (formatVersion === 1)
|
|
55
|
-
return { reason:
|
|
69
|
+
return { reason: PRE_IDENTITY_LKG_REASON };
|
|
56
70
|
if (formatVersion !== 2 && formatVersion !== 3 && formatVersion !== 4 && formatVersion !== 5)
|
|
57
71
|
return { reason: `unknown formatVersion ${String(formatVersion)}` };
|
|
58
72
|
if (typeof p.worker !== "string" || p.worker !== (worker ?? "global"))
|
|
@@ -80,7 +80,7 @@ export declare const BOOT_FETCH_DEFERRED: unique symbol;
|
|
|
80
80
|
* background continuation that triggers a refresh tick when it finally settles. The timer is unref'd
|
|
81
81
|
* (never holds the loop) and cleared as soon as the fetch wins.
|
|
82
82
|
*/
|
|
83
|
-
export declare function raceBootFetch<T>(
|
|
83
|
+
export declare function raceBootFetch<T>(pull: Promise<T>, budgetMs: number): Promise<T | typeof BOOT_FETCH_DEFERRED>;
|
|
84
84
|
/**
|
|
85
85
|
* The two transport calls the service makes to obtain config, behind a backend-selectable seam. Both
|
|
86
86
|
* signatures and return shapes match `facade.fetchEffective` / `facade.fetchSkillContent`
|
|
@@ -186,16 +186,16 @@ export declare class LocalConfigProvider implements ConfigProvider {
|
|
|
186
186
|
fetchSkillContent(contentHash: string): Promise<string | undefined>;
|
|
187
187
|
}
|
|
188
188
|
/**
|
|
189
|
-
*
|
|
190
|
-
* the consumers (`applyEffective`, `resolveMcpServers`, …) expect. The two are structurally compatible
|
|
191
|
-
* for every field the consumers read; this projection makes that explicit (and drops control-plane-only
|
|
192
|
-
* domains the service never consumes: rosters, systems, workers, hosts, integrations, access).
|
|
189
|
+
* 本地腿交出的有效视图 —— **与中心 `/effective` 同一形**(两条腿只交一种形:契约的线上视图;远端腿交中心铸的那一份,`http-client.ts`)。
|
|
193
190
|
*
|
|
194
|
-
*
|
|
195
|
-
*
|
|
196
|
-
*
|
|
191
|
+
* 铸法只有契约里那一只:`resolveEffectiveForWorker(eff, null)` —— 中心把存储形铸成 `/effective` 用的同一个函数(本地腿没有 worker 身份 ⇒ 全局拉取:
|
|
192
|
+
* 目录不按名册收窄、`rosters` 域清空、`entitlement` 清空、技能换成 manifest〔`content` → `contentHash`,正文经 {@link LocalConfigProvider.fetchSkillContent}
|
|
193
|
+
* 按哈希从同一次读取的存储形里找〕、其余域原样)。本地腿唯一自己的一步是**发布**:存储形的 `prompts` 换成发布形(`localPromptsWire`,契约包的唯一选择读法;
|
|
194
|
+
* 中心那一步是它的发布闸)。
|
|
195
|
+
*
|
|
196
|
+
* 不在这里挑键:每个消费方读自己要的字段(远端腿上它们读的一直是整份线上视图),所以契约给条目加一个键,两条腿同时带上 —— 不存在「本地腿静默丢键」那一类补丁。
|
|
197
197
|
*/
|
|
198
|
-
export declare function
|
|
198
|
+
export declare function publishLocalEffective(eff: AgentConfigEffective): EffectiveConfig;
|
|
199
199
|
/**
|
|
200
200
|
* 建判官 {@link configSourceKind} 答出来的那一种配置源:`local` ⇒ {@link LocalConfigProvider}(根 = 递进来的 `localDir`);`remote` ⇒
|
|
201
201
|
* {@link RemoteConfigProvider}(中心 = `webAdmin`)。判官答「无配置源」(没写词、没配中心 = 纯 env 部署)⇒ 抛:调用方只在判官答 local / remote 时建
|