@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
package/dist/boot/web-admin.js
CHANGED
|
@@ -12,7 +12,7 @@ import { applyCenterArtifact, centerSourceOnError, withPromptArtifactBackfill }
|
|
|
12
12
|
import { centerScenarios, centerScenarioDetails } from "../capabilities/scenarios.js";
|
|
13
13
|
import { isRosterGateArmed } from "../config.js";
|
|
14
14
|
import { DEPLOYMENT_SHAPE_PREDICATES } from "../deployment-shape.js";
|
|
15
|
-
import { defaultLkgPath, defaultSkillCacheDir, saveLkg, loadLkg } from "../config-lkg.js";
|
|
15
|
+
import { defaultLkgPath, defaultSkillCacheDir, saveLkg, loadLkg, preIdentityLkgLeftover, PRE_IDENTITY_LKG_REASON } from "../config-lkg.js";
|
|
16
16
|
import { answerStillCurrent, centerStateBin, credentialIdentityNow, judgeCenterCredentialAtBoot } from "../center-credential.js";
|
|
17
17
|
import { createCenterConfigTier } from "../center-config-tier.js";
|
|
18
18
|
import { buildCenterCredentialHealthView, createCenterCredentialRenewer } from "../center-credential-renewer.js";
|
|
@@ -20,8 +20,10 @@ import { centerManagedConfigKeys } from "../web-admin-client/apply-effective.js"
|
|
|
20
20
|
import { configSourceKind, createConfigProvider, raceBootFetch, BOOT_FETCH_DEFERRED } from "../config-provider.js";
|
|
21
21
|
import { REMOTE_CATALOG_SOURCE } from "../env-model-table-gate.js";
|
|
22
22
|
import { ConfigDirUntrustedError } from "../config-dir-trust.js";
|
|
23
|
+
import { ConfigPullError, ConfigPullSupersededError, asConfigPullError, configPullFailureNote } from "../config-pull-failure.js";
|
|
23
24
|
import { createKeyResolver } from "../key-resolver.js";
|
|
24
25
|
import { buildSealedKeyPublicFace, ensureCheckpointCtxSealing, ensureSealedKeyStore, reportExecutionPublicKey } from "../sealed-key.js";
|
|
26
|
+
import { sealedKeyDirOf } from "../sealed-key-layout.js";
|
|
25
27
|
import { anthropicLaneCredentialOf } from "../model-route-gap.js";
|
|
26
28
|
import { applyEffective, applyCenterReadFace, buildReadFaceBaseline, buildReadFaceSwapCandidate, restoreReadFaceBaseline, mutateInPlace, logEffectiveDiff, applySkillsManifest, skillManifestEntriesNotInstalled, resolveMcpServers, resolveA2aPeers, restartReasons, modelPlaneChanged, withModelPlaneOf, fullyLandedForLkg, NO_CENTER_EFFECTIVE, isNoCenterEffective, fetchPromptArtifact } from "../web-admin-client/facade.js";
|
|
27
29
|
import { buildConfigHandoff, buildRestartSignal, configHandoffMissing } from "../fleet/engine-signal.js";
|
|
@@ -29,7 +31,7 @@ import { createMcpRevocationLedger, enabledMcpEntries } from "../web-admin-clien
|
|
|
29
31
|
import { buildUnreadConfigFileFields, buildUnreadConfigKeyFields } from "../web-admin-client/read-warnings.js";
|
|
30
32
|
import { CONFIG_DOMAIN_INVALID_NOTE, buildCandidateRejectedFields, candidateRejectionOf, judgeConfigCandidate } from "../web-admin-client/candidate-gate.js";
|
|
31
33
|
import { SHA256_HEX_RE } from "../digest-form.js";
|
|
32
|
-
import { BOOT_REJUDGE_OF_REFUSED_GROUP, createConfigApplyLedger,
|
|
34
|
+
import { BOOT_REJUDGE_OF_REFUSED_GROUP, createConfigApplyLedger, modelPlaneOutcome, refusedGroups } from "../web-admin-client/apply-ledger.js";
|
|
33
35
|
import { announceReadDenyRows, buildDeploymentPostureSeats } from "./runner-deps.js";
|
|
34
36
|
import { seatText } from "../trace/exit-seat.js";
|
|
35
37
|
const MODELS_REJECTION_PHRASE = {
|
|
@@ -133,6 +135,15 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
133
135
|
validatorIdentity.delete(oldest.value);
|
|
134
136
|
};
|
|
135
137
|
const pullEffective = async (provider, etag) => {
|
|
138
|
+
try {
|
|
139
|
+
return await pullEffectiveOnce(provider, etag);
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
throw asConfigPullError(err);
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
const refreshFailureCause = (err) => (err instanceof ConfigPullError ? err.pullCause : "apply_refused");
|
|
146
|
+
const pullEffectiveOnce = async (provider, etag) => {
|
|
136
147
|
if (provider.kind === "local")
|
|
137
148
|
return provider.fetchEffective(etag);
|
|
138
149
|
const before = currentIdentity();
|
|
@@ -140,7 +151,7 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
140
151
|
const r = await provider.fetchEffective(conditional);
|
|
141
152
|
const used = r === null ? before : r.credentialIdentity;
|
|
142
153
|
if (cc === undefined || !answerStillCurrent(cc.credential, used)) {
|
|
143
|
-
throw new
|
|
154
|
+
throw new ConfigPullSupersededError("center credential identity changed while the effective pull was in flight — response discarded; the next pull runs under the current credential");
|
|
144
155
|
}
|
|
145
156
|
if (r !== null) {
|
|
146
157
|
candidateIdentity.set(r.effective, used);
|
|
@@ -148,7 +159,7 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
148
159
|
}
|
|
149
160
|
return r;
|
|
150
161
|
};
|
|
151
|
-
const sealedKeyDir =
|
|
162
|
+
const sealedKeyDir = sealedKeyDirOf(config, localRoot);
|
|
152
163
|
let sealedKeys;
|
|
153
164
|
try {
|
|
154
165
|
sealedKeys = await ensureSealedKeyStore(sealedKeyDir, logger);
|
|
@@ -422,8 +433,7 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
422
433
|
handoff = { ...(applied !== undefined ? { applied } : {}), ...(durable !== undefined ? { durable } : {}) };
|
|
423
434
|
latchHandoff();
|
|
424
435
|
};
|
|
425
|
-
const markApplied = (
|
|
426
|
-
applyLedger.applied(gen, eff.version);
|
|
436
|
+
const markApplied = (eff) => {
|
|
427
437
|
if (isNoCenterEffective(eff))
|
|
428
438
|
noteHandoff({ noneApplied: true });
|
|
429
439
|
else
|
|
@@ -432,6 +442,7 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
432
442
|
if (landed !== undefined)
|
|
433
443
|
announceTier(landed);
|
|
434
444
|
};
|
|
445
|
+
const closeApplied = (gen, eff) => applyLedger.applied(gen, eff.version);
|
|
435
446
|
let lkgBooted = false;
|
|
436
447
|
let bootLkgCandidate;
|
|
437
448
|
let lastPrewarmBodiesVerified = false;
|
|
@@ -495,10 +506,13 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
495
506
|
return null;
|
|
496
507
|
}
|
|
497
508
|
const lkgPath = lkgPathFor(identity);
|
|
498
|
-
const read = await loadLkg(lkgPath, cc?.worker, identity);
|
|
509
|
+
const read = await loadLkg(lkgPath, cc?.worker, identity, { declaredOwnerUid: config.configLocalOwnerUid });
|
|
499
510
|
if (!read.lkg) {
|
|
500
511
|
if (read.reason !== "absent")
|
|
501
512
|
logger.warn("config_lkg_unusable", { path: lkgPath, reason: read.reason, note: "ignoring the on-disk LKG — env fallback serves; the cache rewrites on the next clean candidate" });
|
|
513
|
+
const leftover = read.reason === "absent" && config.configLkgPath === undefined ? preIdentityLkgLeftover(config, cc?.worker, lkgPath) : undefined;
|
|
514
|
+
if (leftover !== undefined)
|
|
515
|
+
logger.warn("config_lkg_unusable", { path: leftover, reason: PRE_IDENTITY_LKG_REASON, note: "a last-known-good written by 7.98.0 or earlier sits at the pre-identity default name and is never read — delete this file (a cache, not data); env fallback serves, and the next clean candidate writes this credential identity's own LKG" });
|
|
502
516
|
return null;
|
|
503
517
|
}
|
|
504
518
|
if (currentIdentity() !== identity) {
|
|
@@ -544,9 +558,10 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
544
558
|
const lkgIdentity = candidateIdentityOf(lkgR.effective);
|
|
545
559
|
if (lkgSurvivesRestart && lkgIdentity !== undefined)
|
|
546
560
|
noteHandoff({ durable: { version: lkgR.effective.version, identity: lkgIdentity } });
|
|
547
|
-
markApplied(
|
|
561
|
+
markApplied(lkgR.effective);
|
|
562
|
+
closeApplied(lkgGen, lkgR.effective);
|
|
548
563
|
await adoptCenterPrompts(lkgR.effective, lkgR.prompts, "boot-lkg");
|
|
549
|
-
const lkgPlane =
|
|
564
|
+
const lkgPlane = modelPlaneOutcome(lkgReport) === "landed";
|
|
550
565
|
if (lkgPlane)
|
|
551
566
|
markRosterLanded(lkgR.effective);
|
|
552
567
|
effective = lkgR.effective;
|
|
@@ -592,7 +607,6 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
592
607
|
: "config.d/models.json 空或 CONFIG_LOCAL_DIR 指错目录(选目录旋钮是 CONFIG_LOCAL_DIR,不是 LOCAL_DATA_ROOT)— 模型继续走 env 兜底",
|
|
593
608
|
});
|
|
594
609
|
};
|
|
595
|
-
let bootApplyPhase = false;
|
|
596
610
|
try {
|
|
597
611
|
const bootFetch = pullEffective(configProvider, undefined);
|
|
598
612
|
const raced = await raceBootFetch(bootFetch, config.configBootFetchBudgetMs);
|
|
@@ -611,7 +625,6 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
611
625
|
}
|
|
612
626
|
const r = raced === BOOT_FETCH_DEFERRED ? null : raced;
|
|
613
627
|
if (r) {
|
|
614
|
-
bootApplyPhase = true;
|
|
615
628
|
for (const de of r.domainErrors ?? [])
|
|
616
629
|
logger.warn("config_domain_invalid", { domain: de.domain, error: de.error, note: CONFIG_DOMAIN_INVALID_NOTE });
|
|
617
630
|
if (dryRun) {
|
|
@@ -651,18 +664,20 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
651
664
|
recordApply(rep, bootArrival);
|
|
652
665
|
},
|
|
653
666
|
});
|
|
654
|
-
markApplied(
|
|
667
|
+
markApplied(r.effective);
|
|
668
|
+
closeApplied(bootGen, r.effective);
|
|
655
669
|
const bootClean = fullyLandedForLkg(r, bootReport);
|
|
656
670
|
if (bootClean)
|
|
657
671
|
ccEtag = r.etag;
|
|
658
672
|
await adoptCenterPrompts(r.effective, bootVerdict.prompts, "boot");
|
|
659
|
-
|
|
660
|
-
|
|
673
|
+
const bootOutcome = modelPlaneOutcome(bootReport);
|
|
674
|
+
let bootPlaneEff = bootOutcome === "landed" ? r.effective : undefined;
|
|
675
|
+
if (bootOutcome === "refused" || bootOutcome === undefined) {
|
|
661
676
|
const lkgPlane = await bootFromLkg("boot candidate's model plane was refused", "model-plane");
|
|
662
677
|
if (lkgPlane) {
|
|
663
678
|
let planeReport;
|
|
664
679
|
applyEffective(config, withModelPlaneOf(r.effective, lkgPlane.effective), logger, { leg: "boot", catalogSource: lkgPlane.catalogSource, sealedKeys, generation: bootGen, report: (rep) => (planeReport = rep) });
|
|
665
|
-
if (
|
|
680
|
+
if (modelPlaneOutcome(planeReport) === "landed") {
|
|
666
681
|
bootPlaneEff = lkgPlane.effective;
|
|
667
682
|
logger.warn("config_model_plane_from_lkg", { version: r.effective.version, lkgVersion: lkgPlane.effective.version, note: "the live candidate's model plane was refused at boot — serving the LKG's model plane (the catalog and what rides with it) with the live candidate's other groups; the refresh cadence re-judges the candidate" });
|
|
668
683
|
}
|
|
@@ -690,11 +705,11 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
690
705
|
catch (err) {
|
|
691
706
|
if (err instanceof ConfigDirUntrustedError)
|
|
692
707
|
throw err;
|
|
693
|
-
if (
|
|
694
|
-
logger.warn("
|
|
708
|
+
if (err instanceof ConfigPullError)
|
|
709
|
+
logger.warn("config_source_unreachable_using_env", { source: configProvider.kind, cause: err.pullCause, err: seatText("operator-log-text", String(err)), note: configPullFailureNote(err.pullCause) });
|
|
695
710
|
else
|
|
696
|
-
logger.warn("
|
|
697
|
-
await bootFallBackWhole(`${
|
|
711
|
+
logger.warn("config_apply_refused", { source: configProvider.kind, err: seatText("operator-log-text", String(err)), note: "the pulled candidate failed to apply at boot — falling back to the LKG / env; this is not a reachability failure" });
|
|
712
|
+
await bootFallBackWhole(`${err instanceof ConfigPullError ? "boot fetch failed" : "boot apply refused"}: ${seatText("operator-log-text", String(err))}`);
|
|
698
713
|
}
|
|
699
714
|
if (!dryRun && cc !== undefined && currentIdentity() !== promptStateIdentity)
|
|
700
715
|
await rebasePromptState(currentIdentity(), "boot-end");
|
|
@@ -839,6 +854,7 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
839
854
|
startRefreshLoop(a) {
|
|
840
855
|
const { pricing, limitSync, swapRunnerDeps, ceilingVerdict, consolidationSeat, degradeRoute, checkpointStorePresent } = a;
|
|
841
856
|
const signalRestart = (c) => {
|
|
857
|
+
closeApplied(c.gen, c.effective);
|
|
842
858
|
const reasons = restartReasons(c.baseline, c.effective, restartCtx(consolidationSeat?.read(), degradeRoute.read()));
|
|
843
859
|
const skillsChangeDetected = reasons.includes("skills");
|
|
844
860
|
if (bootSkillStale && !skillsChangeDetected)
|
|
@@ -934,8 +950,8 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
934
950
|
if (phase !== "boot-deferred")
|
|
935
951
|
mcpRevocations.applyEnabledEntries(enabledMcpEntries(eff.mcp));
|
|
936
952
|
applyLiveReadFace(eff, swapRunnerDeps, phase);
|
|
937
|
-
markApplied(
|
|
938
|
-
const planeCommitted =
|
|
953
|
+
markApplied(eff);
|
|
954
|
+
const planeCommitted = modelPlaneOutcome(report) === "landed";
|
|
939
955
|
if (planeCommitted)
|
|
940
956
|
appliedPlaneEff = noCenter ? undefined : eff;
|
|
941
957
|
planeDeferredNoHandoff = undefined;
|
|
@@ -954,6 +970,7 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
954
970
|
if (!hot.committed) {
|
|
955
971
|
throw new Error("the no-center tier was refused (the Runners did not accept the env model table) — the previous account's center configuration is still in force; retried next tick");
|
|
956
972
|
}
|
|
973
|
+
closeApplied(gen, NO_CENTER_EFFECTIVE);
|
|
957
974
|
if (hot.report !== undefined && !hot.report.fullyApplied) {
|
|
958
975
|
logger.warn("center_identity_demotion_partial", { groups: refusedGroups(hot.report).map((g) => g.group), note: "a group of the no-center tier was refused — that group keeps its previous values (loud; the env base for that group could not be applied)" });
|
|
959
976
|
}
|
|
@@ -1045,7 +1062,7 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
1045
1062
|
groups: refused.map((g) => g.group),
|
|
1046
1063
|
note: "a group of this candidate was refused — the live config keeps serving the prior values for it; the LKG and the ETag stay on the last FULLY applied generation (this tree is re-judged next tick)",
|
|
1047
1064
|
});
|
|
1048
|
-
const partialSignal = signalRestart({ applied: "partial", effective: r.effective, baseline: effective, refused: refused.map((g) => g.group) });
|
|
1065
|
+
const partialSignal = signalRestart({ applied: "partial", gen: tickGen, effective: r.effective, baseline: effective, refused: refused.map((g) => g.group) });
|
|
1049
1066
|
logger.info("web_admin_refreshed", {
|
|
1050
1067
|
version: r.effective.version,
|
|
1051
1068
|
note: "partially applied — the refused group(s) keep their prior values (see config_candidate_partially_applied); the other groups hot-applied; restart fields as on a complete tick",
|
|
@@ -1054,7 +1071,7 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
1054
1071
|
return "ok";
|
|
1055
1072
|
}
|
|
1056
1073
|
const lkgPersisted = await persistLkgDurable(r.effective, r.etag);
|
|
1057
|
-
const signal = signalRestart({ applied: "complete", effective: r.effective, ...(r.etag !== undefined ? { etag: r.etag } : {}), baseline: effective, lkgPersisted });
|
|
1074
|
+
const signal = signalRestart({ applied: "complete", gen: tickGen, effective: r.effective, ...(r.etag !== undefined ? { etag: r.etag } : {}), baseline: effective, lkgPersisted });
|
|
1058
1075
|
logger.info("web_admin_refreshed", {
|
|
1059
1076
|
version: r.effective.version,
|
|
1060
1077
|
note: "runtime governance (incl. approvalRequire) + limits + models/roles/roster hot-applied; skills/mcp/a2a/scenarios are restart-to-apply",
|
|
@@ -1066,7 +1083,7 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
1066
1083
|
}
|
|
1067
1084
|
}
|
|
1068
1085
|
catch (err) {
|
|
1069
|
-
logger.warn("web_admin_refresh_failed", { err: seatText("operator-log-text", String(err)), note: "etag NOT advanced — the same candidate is re-fetched and re-applied next poll" });
|
|
1086
|
+
logger.warn("web_admin_refresh_failed", { cause: refreshFailureCause(err), err: seatText("operator-log-text", String(err)), note: "etag NOT advanced — the same candidate is re-fetched and re-applied next poll" });
|
|
1070
1087
|
return "failed";
|
|
1071
1088
|
}
|
|
1072
1089
|
finally {
|
|
@@ -1075,16 +1092,17 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
1075
1092
|
return "ok";
|
|
1076
1093
|
};
|
|
1077
1094
|
let inFlight;
|
|
1078
|
-
const
|
|
1095
|
+
const enterLane = (body) => {
|
|
1079
1096
|
if (inFlight)
|
|
1080
1097
|
return inFlight;
|
|
1081
|
-
const p =
|
|
1098
|
+
const p = body().finally(() => {
|
|
1082
1099
|
inFlight = undefined;
|
|
1083
1100
|
afterLane();
|
|
1084
1101
|
});
|
|
1085
1102
|
inFlight = p;
|
|
1086
1103
|
return p;
|
|
1087
1104
|
};
|
|
1105
|
+
const runTick = (arrival) => enterLane(() => refreshTick(arrival));
|
|
1088
1106
|
const requestTick = () => {
|
|
1089
1107
|
if (ccTimer === undefined || ownRead)
|
|
1090
1108
|
return;
|
|
@@ -1115,21 +1133,22 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
1115
1133
|
requestTick();
|
|
1116
1134
|
const deferredBootApply = async (r, arrivalGen) => {
|
|
1117
1135
|
if (!r)
|
|
1118
|
-
return;
|
|
1136
|
+
return "ok";
|
|
1119
1137
|
if (refreshInFlight)
|
|
1120
|
-
return;
|
|
1138
|
+
return "ok";
|
|
1121
1139
|
refreshInFlight = true;
|
|
1122
1140
|
try {
|
|
1123
1141
|
await deferredBootApplyInner(r, useArrivalGeneration(r.effective.version, arrivalGen));
|
|
1124
1142
|
if (configProvider.kind === "remote")
|
|
1125
1143
|
lastPull = "ok";
|
|
1144
|
+
return "ok";
|
|
1126
1145
|
}
|
|
1127
1146
|
catch (err) {
|
|
1128
|
-
logger.warn("web_admin_refresh_failed", { err: seatText("operator-log-text", String(err)), leg: "boot-deferred", note: "etag NOT advanced — the refresh cadence re-fetches and re-applies the same candidate" });
|
|
1147
|
+
logger.warn("web_admin_refresh_failed", { cause: refreshFailureCause(err), err: seatText("operator-log-text", String(err)), leg: "boot-deferred", note: "etag NOT advanced — the refresh cadence re-fetches and re-applies the same candidate" });
|
|
1148
|
+
return "failed";
|
|
1129
1149
|
}
|
|
1130
1150
|
finally {
|
|
1131
1151
|
refreshInFlight = false;
|
|
1132
|
-
afterLane();
|
|
1133
1152
|
}
|
|
1134
1153
|
};
|
|
1135
1154
|
const deferredBootApplyInner = async (r, lateGen) => {
|
|
@@ -1159,7 +1178,7 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
1159
1178
|
groups: refusedLate.map((g) => g.group),
|
|
1160
1179
|
note: "late-boot candidate had a refused group — the LKG/ETag stay on the last FULLY applied generation; the refresh cadence re-judges the same tree",
|
|
1161
1180
|
});
|
|
1162
|
-
const partialSignalLate = signalRestart({ applied: "partial", effective: r.effective, baseline: undefined, refused: refusedLate.map((g) => g.group) });
|
|
1181
|
+
const partialSignalLate = signalRestart({ applied: "partial", gen: lateGen, effective: r.effective, baseline: undefined, refused: refusedLate.map((g) => g.group) });
|
|
1163
1182
|
logger.info("config_loaded_deferred", { source: configProvider.kind, version: r.effective.version, models: (r.effective.models?.models ?? []).filter((m) => m.enabled !== false).length, ...restartLogFields(partialSignalLate) });
|
|
1164
1183
|
return;
|
|
1165
1184
|
}
|
|
@@ -1167,16 +1186,16 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
1167
1186
|
latestEffective = r.effective;
|
|
1168
1187
|
ccEtag = r.etag;
|
|
1169
1188
|
const lkgPersistedLate = await persistLkgDurable(r.effective, r.etag);
|
|
1170
|
-
const signalLate = signalRestart({ applied: "complete", effective: r.effective, ...(r.etag !== undefined ? { etag: r.etag } : {}), baseline: undefined, lkgPersisted: lkgPersistedLate });
|
|
1189
|
+
const signalLate = signalRestart({ applied: "complete", gen: lateGen, effective: r.effective, ...(r.etag !== undefined ? { etag: r.etag } : {}), baseline: undefined, lkgPersisted: lkgPersistedLate });
|
|
1171
1190
|
logger.info("config_loaded_deferred", { source: configProvider.kind, version: r.effective.version, models: (r.effective.models?.models ?? []).filter((m) => m.enabled !== false).length, ...restartLogFields(signalLate) });
|
|
1172
1191
|
};
|
|
1173
1192
|
if (bootConfigPending) {
|
|
1174
1193
|
const arrivalGen = reserveArrivalGeneration();
|
|
1175
|
-
const continueArrival = (r) => void (lkgBooted ? runTick({ result: r, ordinal: arrivalGen }) : deferredBootApply(r, arrivalGen));
|
|
1194
|
+
const continueArrival = (r) => void (lkgBooted ? runTick({ result: r, ordinal: arrivalGen }) : enterLane(() => deferredBootApply(r, arrivalGen)));
|
|
1176
1195
|
void bootConfigPending.then((r) => {
|
|
1177
1196
|
if (r !== null && configProvider.kind === "remote" && candidateIdentityOf(r.effective) !== currentIdentity()) {
|
|
1178
1197
|
logger.warn("config_boot_arrival_identity_changed", { note: "the late boot pull landed under a center credential that is no longer current — not adopted; re-pulling once under the current credential" });
|
|
1179
|
-
void pullEffective(configProvider, undefined).then(continueArrival, (err) => logger.warn("config_boot_arrival_repull_failed", { err: seatText("operator-log-text", String(err)), note: "the refresh cadence retries under the current credential" }));
|
|
1198
|
+
void pullEffective(configProvider, undefined).then(continueArrival, (err) => logger.warn("config_boot_arrival_repull_failed", { cause: refreshFailureCause(err), err: seatText("operator-log-text", String(err)), note: "the refresh cadence retries under the current credential" }));
|
|
1180
1199
|
return;
|
|
1181
1200
|
}
|
|
1182
1201
|
continueArrival(r);
|
|
@@ -1189,9 +1208,10 @@ export async function createWebAdminRuntime(ctx) {
|
|
|
1189
1208
|
clearInterval(ccTimer);
|
|
1190
1209
|
ccTimer = undefined;
|
|
1191
1210
|
}
|
|
1192
|
-
credentialRenewer?.stop();
|
|
1211
|
+
const credentialSettled = credentialRenewer?.stop() ?? Promise.resolve();
|
|
1193
1212
|
unwatchCredential?.();
|
|
1194
1213
|
unwatchCredential = undefined;
|
|
1214
|
+
return credentialSettled;
|
|
1195
1215
|
},
|
|
1196
1216
|
centerCredentialState() {
|
|
1197
1217
|
return cc === undefined ? undefined : buildCenterCredentialHealthView(cc.credential.health(), credentialRenewer);
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
* 当年 core 的摘要器没有凭据座,只能在 brain 外面包一层注入 `options.apiKey`(`createPerModelKeyBrain`)。
|
|
25
25
|
* core 7.51.0 起 `WebFetchSummarizerOptions.getApiKeyAndHeaders` 是与 `TaskSpec` / `SideQuerySpec` 同一签名的座
|
|
26
26
|
* (每次摘要按摘要器的模型解一次,`{ apiKey, headers }` 两半都收)⇒ 那层包装退役:`RunnerDeps.brain` 原样交给
|
|
27
|
-
* 摘要器,座位由与 side-query
|
|
27
|
+
* 摘要器,座位由与 side-query **同一只**座位工厂(`createPerModelAuthSeat`)填充(两面都每次现取模型、不焊模型;记忆整理席焊住 Model,凭据随座冻结,见 `boot/memory-consolidation.ts`):
|
|
28
28
|
* · 有 per-model key ⇒ 请求带模型自己的凭据;
|
|
29
29
|
* · 无 ⇒ 座位回 `undefined` ⇒ 交回 core 按它自己的 key↔URL 配对法判(部署根上的模型带网关 key;
|
|
30
30
|
* entry URL 不在部署根上 ⇒ `route.credential_mismatch` 响亮拒 —— core 7.51.0 起没有「未声明部署根」的
|
package/dist/boot-reclaim.d.ts
CHANGED
|
@@ -15,7 +15,9 @@ export interface ReclaimableRunStore {
|
|
|
15
15
|
}
|
|
16
16
|
/** A checkpoint store just enough to answer "is this session a resume-in-progress?" (pending checkpoint). */
|
|
17
17
|
export interface ReclaimCheckpointProbe {
|
|
18
|
-
findPendingTokenBySession: (sessionId: string
|
|
18
|
+
findPendingTokenBySession: (sessionId: string, scope: undefined, binding: {
|
|
19
|
+
readonly axis: "run";
|
|
20
|
+
}) => Promise<unknown>;
|
|
19
21
|
}
|
|
20
22
|
/**
|
|
21
23
|
* Reclaim runs orphaned by a previous host-lane engine process (flip orphaned `running` → failed + release their
|
package/dist/boot-reclaim.js
CHANGED
|
@@ -3,7 +3,7 @@ export async function reclaimOrphansAtBoot(runStore, checkpointStore, logger) {
|
|
|
3
3
|
if (typeof store?.reclaimOrphanedAtBoot !== "function")
|
|
4
4
|
return 0;
|
|
5
5
|
const isResumable = checkpointStore
|
|
6
|
-
? async (sid) => Boolean(await checkpointStore.findPendingTokenBySession(sid))
|
|
6
|
+
? async (sid) => Boolean(await checkpointStore.findPendingTokenBySession(sid, undefined, { axis: "run" }))
|
|
7
7
|
: undefined;
|
|
8
8
|
const reclaimedCount = await store.reclaimOrphanedAtBoot(isResumable);
|
|
9
9
|
if (reclaimedCount > 0)
|
package/dist/brain.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type Brain, type BreakerState, type Model } from "@sema-agent/core";
|
|
2
2
|
import type { ServiceConfig } from "./config-types.js";
|
|
3
|
-
import { type
|
|
3
|
+
import { type CredentialIdentity } from "./key-resolver.js";
|
|
4
4
|
import { type RestartSliceCtx } from "./web-admin-client/restart-signal.js";
|
|
5
5
|
/**
|
|
6
6
|
* 配了快切层(failover ≥2 路 / 断路器)时,**每路**的重试上限。
|
|
@@ -62,24 +62,13 @@ export type DegradeRoutePlane = Pick<ServiceConfig, "degrade" | "models" | "gate
|
|
|
62
62
|
*/
|
|
63
63
|
export declare function degradeTargetOf(config: Pick<ServiceConfig, "degrade" | "models">): Model | undefined;
|
|
64
64
|
/**
|
|
65
|
-
* [ref](
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
* 所以重贴会签。🔴 明文是活秘密:只活在壳的闭包里,指纹只取摘要({@link degradeRouteFingerprint}),绝不进日志 / 序列化面。
|
|
71
|
-
* 目标没有自有凭据 ⇒ `{}`。两张表至多一个条目有效(registry-core 互斥:带 sealedApiKey 的条目不落 modelApiKeyEnv)。
|
|
65
|
+
* [ref]:读出 `target`(降级壳焊的那只目标,{@link degradeTargetOf})此刻的凭据**身份**(不是值;读法是 key 链的 `credentialIdentityOf`,
|
|
66
|
+
* 与记忆整理席同一只)—— 唯一读法:createBrain 组壳时与目标 Model 一起冻结它,`degrade-route` 指纹的两侧读数与启动摘要同读它。
|
|
67
|
+
* 查的名字与序:目标真名、再 `degrade.to`(后者可能是 `default` 别名,两张 key 表按真名索引、env 车道的目录则反过来);每个名字上托管密钥压过 env 引用。
|
|
68
|
+
* 托管密钥重贴 = 新身份,要重启才进壳 —— 指纹带它的身份摘要,所以重贴会签。🔴 明文是活秘密:只活在壳的闭包里,指纹只取摘要,绝不进日志 / 序列化面。
|
|
69
|
+
* 目标没有自有凭据 ⇒ `{}`。
|
|
72
70
|
*/
|
|
73
|
-
export
|
|
74
|
-
readonly apiKeyEnv?: string;
|
|
75
|
-
readonly sealed?: string | SealedCustodyPoison;
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* [ref]:读出 `target`(降级壳焊的那只目标,{@link degradeTargetOf})此刻的凭据身份 —— **唯一**读法:createBrain 组壳时冻结它,
|
|
79
|
-
* `degrade-route` 指纹的两侧读数与启动摘要同读它。查表的键与序与修前 `fbOwnApiKey` 同:目标真名、再 `degrade.to`(后者可能是
|
|
80
|
-
* `default` 别名,两张 key 表按真名索引、env 车道的目录则反过来);每个名字上托管密钥压过 env 引用(key-resolver 的序)。
|
|
81
|
-
*/
|
|
82
|
-
export declare function degradeCredentialIdentityOf(config: Pick<ServiceConfig, "degrade" | "modelApiKeyEnv" | "modelApiKeys">, target: Pick<Model, "name">): DegradeCredentialIdentity;
|
|
71
|
+
export declare function degradeCredentialIdentityOf(config: Pick<ServiceConfig, "degrade" | "modelApiKeyEnv" | "modelApiKeys">, target: Pick<Model, "name">): CredentialIdentity;
|
|
83
72
|
/**
|
|
84
73
|
* [ref]:降级壳的**路由指纹**(纯数据)—— `degrade-route` 重启片 `baked` / `current` 两侧读数的唯一读法。
|
|
85
74
|
*
|
package/dist/brain.js
CHANGED
|
@@ -2,8 +2,7 @@ import { adjudicateModelRoute, createAnthropicBrain, createCircuitBreakerBrain,
|
|
|
2
2
|
import { routeKeyOf } from "@sema-agent/core";
|
|
3
3
|
import { buildDefaultResilience } from "./config-types.js";
|
|
4
4
|
import { resolveModelApiKey } from "./key-resolver.js";
|
|
5
|
-
import {
|
|
6
|
-
import { isModelKeyPoison, modelKeyPoisonIdentity } from "./key-resolver.js";
|
|
5
|
+
import { credentialIdentityFingerprint, credentialIdentityOf } from "./key-resolver.js";
|
|
7
6
|
import { anthropicRouteRoot, brainLaneFor, mountRoutes, routeTableOf } from "./model-provider.js";
|
|
8
7
|
import { openaiRouteBaseUrl } from "./model-route-endpoint.js";
|
|
9
8
|
import { anthropicLaneCredentialOf, declaredCredential } from "./model-route-gap.js";
|
|
@@ -156,12 +155,9 @@ export function degradeTargetOf(config) {
|
|
|
156
155
|
}
|
|
157
156
|
export function degradeCredentialIdentityOf(config, target) {
|
|
158
157
|
for (const name of config.degrade === undefined ? [target.name] : [target.name, config.degrade.to]) {
|
|
159
|
-
const
|
|
160
|
-
if (sealed !== undefined)
|
|
161
|
-
return
|
|
162
|
-
const apiKeyEnv = config.modelApiKeyEnv?.[name];
|
|
163
|
-
if (apiKeyEnv !== undefined)
|
|
164
|
-
return { apiKeyEnv };
|
|
158
|
+
const identity = credentialIdentityOf(config, name);
|
|
159
|
+
if (identity.sealed !== undefined || identity.apiKeyEnv !== undefined)
|
|
160
|
+
return identity;
|
|
165
161
|
}
|
|
166
162
|
return {};
|
|
167
163
|
}
|
|
@@ -175,17 +171,9 @@ function degradeWeldFingerprint(config, target, credential) {
|
|
|
175
171
|
return {
|
|
176
172
|
model: catalogEntryFingerprint(target),
|
|
177
173
|
endpoint: openaiRouteBaseUrl(target.baseUrl, config.gatewayBaseUrl) ?? null,
|
|
178
|
-
|
|
179
|
-
sealedKey: sealedIdentityFingerprint(credential.sealed),
|
|
174
|
+
...credentialIdentityFingerprint(credential),
|
|
180
175
|
};
|
|
181
176
|
}
|
|
182
|
-
function sealedIdentityFingerprint(sealed) {
|
|
183
|
-
if (sealed === undefined)
|
|
184
|
-
return null;
|
|
185
|
-
if (isModelKeyPoison(sealed))
|
|
186
|
-
return { poisoned: modelKeyPoisonIdentity(sealed), reason: sealed.reason };
|
|
187
|
-
return { digest: createHash("sha256").update(sealed, "utf8").digest("hex").slice(0, 16) };
|
|
188
|
-
}
|
|
189
177
|
export function buildFailoverFirstByteNotice(config) {
|
|
190
178
|
const r = config.resilience ?? DEFAULT_RESILIENCE;
|
|
191
179
|
const fallbacks = config.gatewayFallbackUrls.length;
|
package/dist/budget.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { isModelPriced, modelCostToPricing } from "@sema-agent/core";
|
|
2
|
-
import {
|
|
2
|
+
import { currentPerson } from "./observability/principal-context.js";
|
|
3
3
|
import { isPermissionRuleEventKind, permissionRuleEventWordOf } from "./observability/permission-rule-events.js";
|
|
4
4
|
import { promptManifestRecordOf, configAssembledRecordOf } from "./observability/prompt-manifest.js";
|
|
5
5
|
import { crossBoundaryTaintEventData } from "./trace/project.js";
|
|
@@ -85,9 +85,9 @@ export function createTracer(metrics, costQuota, modelUsage, fleetUsage, fleetLe
|
|
|
85
85
|
metrics.inc("brain_calls_total", { provider: providerName(e.provider ?? "unknown"), model: modelId(e.model) });
|
|
86
86
|
if (e.costMicroUsd) {
|
|
87
87
|
metrics.inc("model_cost_micro_usd_total", { model: modelId(e.model) }, e.costMicroUsd);
|
|
88
|
-
const
|
|
89
|
-
if (
|
|
90
|
-
costQuota?.add(
|
|
88
|
+
const person = currentPerson();
|
|
89
|
+
if (person)
|
|
90
|
+
costQuota?.add(person, e.costMicroUsd);
|
|
91
91
|
}
|
|
92
92
|
else if (e.costMicroUsd === undefined) {
|
|
93
93
|
metrics.inc("brain_calls_unpriced_total", { model: modelId(e.model) });
|
|
@@ -96,8 +96,8 @@ export function createTracer(metrics, costQuota, modelUsage, fleetUsage, fleetLe
|
|
|
96
96
|
const qwRaw = quotaWeightFor?.(e.model);
|
|
97
97
|
const qw = typeof qwRaw === "number" && Number.isFinite(qwRaw) && qwRaw > 0 ? qwRaw : 1;
|
|
98
98
|
const weightedTokens = Math.round((e.totalInputTokens + e.completionTokens) * qw);
|
|
99
|
-
fleetUsage?.record(
|
|
100
|
-
fleetLease?.recordSpend(
|
|
99
|
+
fleetUsage?.record(currentPerson(), e.model, e.taskId, { inputTokens: e.totalInputTokens, outputTokens: e.completionTokens, ...(e.costMicroUsd !== undefined ? { costMicroUsd: e.costMicroUsd } : {}), weightedTokens, quotaWeightAtUse: qw });
|
|
100
|
+
fleetLease?.recordSpend(currentPerson(), { weightedTokens, ...(e.costMicroUsd !== undefined ? { costMicroUsd: e.costMicroUsd } : {}) });
|
|
101
101
|
if (e.turn !== undefined) {
|
|
102
102
|
if (e.firstTokenMs !== undefined)
|
|
103
103
|
metrics.observe("brain_first_token_ms", e.firstTokenMs);
|
|
@@ -60,10 +60,16 @@ export declare const PLUGIN_MANIFEST_MAX_BYTES: number;
|
|
|
60
60
|
* 布局同族)。返回 ok:true+dir:undefined = 插件没有 skills 目录(可以只有 commands——那是 cli 壳的
|
|
61
61
|
* 半场,worker 装 0 个 skill 不算失败);ok:false = 路径逃逸/manifest 本体畸形,整条拒装。
|
|
62
62
|
* manifest 臂分立(V2-⑦,原 broad-catch 是 fail-open):**不存在**=可选面,缺省 skills/;**存在但**
|
|
63
|
-
* 本体逃逸根外/非普通文件/超界/读失败/JSON 坏 = ok:false 走既有 warning 面。
|
|
63
|
+
* 本体逃逸根外/非普通文件/超界/读失败/JSON 坏 = ok:false 走既有 warning 面。
|
|
64
|
+
*
|
|
65
|
+
* `hooksModule`(ok:true 时同一趟顺带回报,**不**第二次读 manifest):这个插件带不带 hooks 模块 —— 入口有两个,任一在场即真:
|
|
66
|
+
* ① manifest 本体是对象且**自有**顶层键 `hooks` 在场(内联对象或路径串都算;只判键在不在,值不判,嵌套里的 `hooks` 字样不算);
|
|
67
|
+
* ② `hooks/hooks.json` 条目在场({@link hooksFileEntryMayBePresent},只问条目、不读内容)。
|
|
68
|
+
* 只是一条事实交给调用方去响(不改上面的装载判定一字:manifest 是非对象 JSON 时照旧可装、缺省 skills/)。 */
|
|
64
69
|
export declare function resolvePluginSkillsRoot(cloneRoot: string): {
|
|
65
70
|
ok: true;
|
|
66
71
|
dir?: string;
|
|
72
|
+
hooksModule: boolean;
|
|
67
73
|
} | {
|
|
68
74
|
ok: false;
|
|
69
75
|
reason: string;
|
|
@@ -2,10 +2,11 @@ import { execFile } from "node:child_process";
|
|
|
2
2
|
import { promisify } from "node:util";
|
|
3
3
|
import { promises as fsp, realpathSync, existsSync, readFileSync, lstatSync, statSync } from "node:fs";
|
|
4
4
|
import { join, resolve, isAbsolute, sep } from "node:path";
|
|
5
|
-
import { ensureDir } from "@sema-agent/core";
|
|
5
|
+
import { ensureDir, hostOfUrl, HOST_UNREADABLE_SENTENCE } from "@sema-agent/core";
|
|
6
6
|
import { assertConfined, loadSkills } from "./skills.js";
|
|
7
7
|
import { buildDisplaySafeUrl, redactSecrets } from "../trace/redact.js";
|
|
8
8
|
import { gitSubprocessEnv } from "../server-secret-env.js";
|
|
9
|
+
import { errorCodeOf } from "../observability/err-text.js";
|
|
9
10
|
const execFileP = promisify(execFile);
|
|
10
11
|
export const MAX_PLUGIN_SOURCE_URL_CHARS = 2048;
|
|
11
12
|
export const DEFAULT_PLUGIN_ALLOW_HOSTS = ["github.com"];
|
|
@@ -36,14 +37,12 @@ export function validatePluginDecl(decl, allowHosts) {
|
|
|
36
37
|
if (!/^https:\/\//i.test(url)) {
|
|
37
38
|
return { ok: false, name, reason: `plugin source must be an https:// URL (contract: https-only; got ${buildDisplaySafeUrl(url)})` };
|
|
38
39
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
host
|
|
42
|
-
}
|
|
43
|
-
catch {
|
|
44
|
-
return { ok: false, name, reason: "https url does not parse" };
|
|
40
|
+
const reading = hostOfUrl(url);
|
|
41
|
+
if ("unreadable" in reading) {
|
|
42
|
+
return { ok: false, name, reason: `plugin source url names no host this allowlist can judge — ${HOST_UNREADABLE_SENTENCE[reading.unreadable]}` };
|
|
45
43
|
}
|
|
46
|
-
|
|
44
|
+
const host = reading.host;
|
|
45
|
+
if (!allowHosts.some((h) => allowlistHostOf(h) === host)) {
|
|
47
46
|
return { ok: false, name, reason: `host ${host} not in PLUGINS_ALLOW_HOSTS (default github.com; extend with a comma-separated https mirror domain list)` };
|
|
48
47
|
}
|
|
49
48
|
if (decl.sha !== undefined) {
|
|
@@ -54,6 +53,13 @@ export function validatePluginDecl(decl, allowHosts) {
|
|
|
54
53
|
}
|
|
55
54
|
return { ok: true, name, url };
|
|
56
55
|
}
|
|
56
|
+
function allowlistHostOf(entry) {
|
|
57
|
+
const bare = !/[/?#@\\\s]/.test(entry) && (entry.startsWith("[") ? entry.endsWith("]") : !entry.includes(":"));
|
|
58
|
+
if (!bare || entry === "")
|
|
59
|
+
return undefined;
|
|
60
|
+
const reading = hostOfUrl(`https://${entry}/`);
|
|
61
|
+
return "host" in reading ? reading.host : undefined;
|
|
62
|
+
}
|
|
57
63
|
export function gitClonePlan(o) {
|
|
58
64
|
if (o.sha === undefined) {
|
|
59
65
|
return { steps: [["clone", "--depth", "1", "--quiet", o.url, o.dest]] };
|
|
@@ -69,6 +75,7 @@ export function gitClonePlan(o) {
|
|
|
69
75
|
export const PLUGIN_MANIFEST_MAX_BYTES = 64 * 1024;
|
|
70
76
|
export function resolvePluginSkillsRoot(cloneRoot) {
|
|
71
77
|
let skillsPath = "skills";
|
|
78
|
+
let manifestHasHooksKey = false;
|
|
72
79
|
const rootReal = realpathSync(cloneRoot);
|
|
73
80
|
const manifestPath = join(cloneRoot, ".claude-plugin", "plugin.json");
|
|
74
81
|
let manifestPresent = false;
|
|
@@ -90,11 +97,13 @@ export function resolvePluginSkillsRoot(cloneRoot) {
|
|
|
90
97
|
const manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
|
|
91
98
|
if (typeof manifest.skillsPath === "string" && manifest.skillsPath !== "")
|
|
92
99
|
skillsPath = manifest.skillsPath;
|
|
100
|
+
manifestHasHooksKey = Object.hasOwn(manifest, "hooks");
|
|
93
101
|
}
|
|
94
102
|
catch (e) {
|
|
95
103
|
return { ok: false, reason: `plugin manifest rejected: ${e instanceof Error ? e.message : String(e)}` };
|
|
96
104
|
}
|
|
97
105
|
}
|
|
106
|
+
const hooksModule = manifestHasHooksKey || hooksFileEntryMayBePresent(cloneRoot);
|
|
98
107
|
if (isAbsolute(skillsPath))
|
|
99
108
|
return { ok: false, reason: `skillsPath must be relative (got ${skillsPath})` };
|
|
100
109
|
const candidate = resolve(rootReal, skillsPath);
|
|
@@ -102,12 +111,22 @@ export function resolvePluginSkillsRoot(cloneRoot) {
|
|
|
102
111
|
return { ok: false, reason: `skillsPath escapes the plugin root (${skillsPath})` };
|
|
103
112
|
}
|
|
104
113
|
if (!existsSync(candidate))
|
|
105
|
-
return { ok: true };
|
|
114
|
+
return { ok: true, hooksModule };
|
|
106
115
|
const real = realpathSync(candidate);
|
|
107
116
|
if (real !== rootReal && !real.startsWith(rootReal + sep)) {
|
|
108
117
|
return { ok: false, reason: `skillsPath resolves outside the plugin root via symlink (${skillsPath})` };
|
|
109
118
|
}
|
|
110
|
-
return { ok: true, dir: candidate };
|
|
119
|
+
return { ok: true, dir: candidate, hooksModule };
|
|
120
|
+
}
|
|
121
|
+
function hooksFileEntryMayBePresent(cloneRoot) {
|
|
122
|
+
try {
|
|
123
|
+
lstatSync(join(cloneRoot, "hooks", "hooks.json"));
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
catch (e) {
|
|
127
|
+
const code = errorCodeOf(e);
|
|
128
|
+
return code !== "ENOENT" && code !== "ENOTDIR";
|
|
129
|
+
}
|
|
111
130
|
}
|
|
112
131
|
const PLUGINS_DOMAIN_FAILURE_NAME = "(plugins domain)";
|
|
113
132
|
function declaredPlugins(eff) {
|
|
@@ -198,6 +217,9 @@ export async function applyCenterPlugins(baseline, eff, opts) {
|
|
|
198
217
|
opts.logger?.warn("center_plugin_manifest_rejected", { plugin: v.name, reason: rootCheck.reason });
|
|
199
218
|
continue;
|
|
200
219
|
}
|
|
220
|
+
if (rootCheck.hooksModule) {
|
|
221
|
+
opts.logger?.warn("center_plugin_hooks_not_loaded", { plugin: v.name, note: `engine does not load the hooks module of center plugin ${v.name}; skills are loaded` });
|
|
222
|
+
}
|
|
201
223
|
if (!rootCheck.dir)
|
|
202
224
|
continue;
|
|
203
225
|
const loaded = loadSkills(rootCheck.dir, { source: "center", confineTo: liveDir, toolsShareThisFilesystem: opts.toolsShareThisFilesystem, ...(opts.logger !== undefined ? { logger: opts.logger } : {}) });
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { authBridgeIssuerOf } from "../
|
|
1
|
+
import { authBridgeIssuerOf } from "../identity-source.js";
|
|
2
2
|
import { isDisclosableIdentity } from "@sema-agent/settings-schema";
|
|
3
3
|
export const CENTER_ISSUER_WORDS = ["explicit", "fallback"];
|
|
4
4
|
export function buildCenterWiring(f) {
|
|
@@ -41,14 +41,14 @@ export declare const COMPOSITE_CAPABILITY_MEMBERS: {
|
|
|
41
41
|
readonly deviceExecutor: readonly ["enabled", "protocolVersion", "maxInflightPerDevice", "wsPath", "management", "relayUrl"];
|
|
42
42
|
readonly fleet: readonly ["stream", "sessionScope", "observe", "resume", "bgNotifyFailClosed", "steerPriority", "hookFailureNotice", "leaseClient", "generationEcho"];
|
|
43
43
|
readonly memoryEngine: readonly ["backend", "vectorMode"];
|
|
44
|
-
readonly store: readonly ["declared", "backend", "
|
|
44
|
+
readonly store: readonly ["declared", "backend", "durability", "degradedReason", "sql"];
|
|
45
45
|
readonly centerWiring: readonly ["effectivePull", "effectiveRevision", "lease", "leaseHealth", "failMode", "usageReport", "issuer", "worker", "caller"];
|
|
46
46
|
readonly webSearch: readonly ["backend"];
|
|
47
47
|
readonly background: readonly ["listFace", "exitFaces"];
|
|
48
48
|
readonly taskSettings: readonly ["permissions", "permissionMode", "model", "outputStyle", "env", "hooks", "pluginHooks", "managedHookGroups", "httpHookAllowlists", "tightenOnlySeats", "approvalFrameFamilies", "autoCompactEnabled"];
|
|
49
49
|
readonly settings: readonly ["permissions"];
|
|
50
50
|
readonly settingsContract: readonly ["version", "hookEntryFields"];
|
|
51
|
-
readonly permissionModeAuto: readonly ["accepted", "classifierSeat", "entitlementSource", "armed", "reason", "model"];
|
|
51
|
+
readonly permissionModeAuto: readonly ["accepted", "classifierSeat", "entitlementSource", "armed", "reason", "refusedBy", "model"];
|
|
52
52
|
readonly writeProtection: readonly ["armed", "rows", "replaced"];
|
|
53
53
|
readonly executionLane: readonly ["provider", "toolsOnThisHost", "isolated"];
|
|
54
54
|
readonly retention: readonly ["mode", "maxAgeDays"];
|
|
@@ -2,14 +2,14 @@ export const COMPOSITE_CAPABILITY_MEMBERS = {
|
|
|
2
2
|
deviceExecutor: ["enabled", "protocolVersion", "maxInflightPerDevice", "wsPath", "management", "relayUrl"],
|
|
3
3
|
fleet: ["stream", "sessionScope", "observe", "resume", "bgNotifyFailClosed", "steerPriority", "hookFailureNotice", "leaseClient", "generationEcho"],
|
|
4
4
|
memoryEngine: ["backend", "vectorMode"],
|
|
5
|
-
store: ["declared", "backend", "
|
|
5
|
+
store: ["declared", "backend", "durability", "degradedReason", "sql"],
|
|
6
6
|
centerWiring: ["effectivePull", "effectiveRevision", "lease", "leaseHealth", "failMode", "usageReport", "issuer", "worker", "caller"],
|
|
7
7
|
webSearch: ["backend"],
|
|
8
8
|
background: ["listFace", "exitFaces"],
|
|
9
9
|
taskSettings: ["permissions", "permissionMode", "model", "outputStyle", "env", "hooks", "pluginHooks", "managedHookGroups", "httpHookAllowlists", "tightenOnlySeats", "approvalFrameFamilies", "autoCompactEnabled"],
|
|
10
10
|
settings: ["permissions"],
|
|
11
11
|
settingsContract: ["version", "hookEntryFields"],
|
|
12
|
-
permissionModeAuto: ["accepted", "classifierSeat", "entitlementSource", "armed", "reason", "model"],
|
|
12
|
+
permissionModeAuto: ["accepted", "classifierSeat", "entitlementSource", "armed", "reason", "refusedBy", "model"],
|
|
13
13
|
writeProtection: ["armed", "rows", "replaced"],
|
|
14
14
|
executionLane: ["provider", "toolsOnThisHost", "isolated"],
|
|
15
15
|
retention: ["mode", "maxAgeDays"],
|