@sema-agent/server 7.147.0 → 7.149.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 +1468 -24
- package/README.md +35 -7
- package/README.zh-CN.md +18 -8
- package/USAGE.md +444 -193
- 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/approval-card.d.ts +36 -38
- package/dist/approval-gate-currency.js +3 -2
- package/dist/approval-leg-origin.d.ts +33 -0
- package/dist/approval-leg-origin.js +4 -0
- 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 +9 -15
- package/dist/auth-bridge.js +4 -11
- package/dist/auth-keys.d.ts +10 -1
- package/dist/auth-keys.js +8 -0
- 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 +47 -42
- package/dist/boot/execution-lane.d.ts +6 -4
- package/dist/boot/execution-lane.js +3 -1
- 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-delivery.d.ts +3 -2
- 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 +60 -70
- 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 +14 -5
- 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.d.ts +1 -0
- package/dist/boot/stage-01-config.js +13 -4
- package/dist/boot/stage-02-web-admin-pull.d.ts +2 -0
- package/dist/boot/stage-02-web-admin-pull.js +16 -3
- package/dist/boot/stage-03-store-backend.d.ts +4 -0
- package/dist/boot/stage-03-store-backend.js +4 -3
- package/dist/boot/stage-04-stores.d.ts +3 -0
- package/dist/boot/stage-04-stores.js +2 -2
- package/dist/boot/stage-05-execution-env.d.ts +8 -3
- package/dist/boot/stage-05-execution-env.js +2 -2
- package/dist/boot/stage-06-runners.d.ts +12 -13
- package/dist/boot/stage-06-runners.js +23 -15
- package/dist/boot/stage-07-capability-layer.d.ts +13 -9
- package/dist/boot/stage-07-capability-layer.js +5 -3
- package/dist/boot/stage-08-reapers.d.ts +13 -9
- package/dist/boot/stage-08-reapers.js +3 -3
- package/dist/boot/stage-09-leader.d.ts +14 -16
- package/dist/boot/stage-09-leader.js +12 -4
- package/dist/boot/stage-10-http-server.d.ts +14 -16
- 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 +6 -0
- package/dist/boot/stores.js +41 -27
- 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 +39 -11
- package/dist/capability-facts.js +35 -7
- package/dist/card-settle-stored-scope.d.ts +56 -0
- package/dist/card-settle-stored-scope.js +27 -0
- package/dist/card-void.d.ts +8 -13
- package/dist/card-void.js +2 -7
- package/dist/center-credential-renewer.d.ts +6 -2
- package/dist/center-credential-renewer.js +7 -3
- package/dist/config-catalog.d.ts +28 -1
- package/dist/config-catalog.js +95 -85
- package/dist/config-dir-trust.d.ts +37 -4
- package/dist/config-dir-trust.js +88 -44
- package/dist/config-invariants.d.ts +43 -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 +62 -21
- package/dist/config.d.ts +14 -21
- package/dist/config.js +141 -64
- package/dist/context-window-notice.d.ts +31 -0
- package/dist/context-window-notice.js +28 -0
- 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 +46 -11
- package/dist/deployment-shape.js +8 -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-name-allowlist-knobs.d.ts +6 -5
- package/dist/env-name-allowlist-knobs.js +5 -0
- package/dist/env-witness.d.ts +7 -0
- package/dist/env-witness.js +16 -0
- package/dist/execution-lane-caps.d.ts +25 -23
- package/dist/execution-lane-caps.js +18 -26
- 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/command-spawn.d.ts +7 -2
- package/dist/hooks/command-spawn.js +13 -6
- package/dist/hooks/hook-llm.d.ts +5 -1
- package/dist/hooks/hook-llm.js +24 -15
- package/dist/hooks/hook-runner.d.ts +72 -57
- package/dist/hooks/hook-runner.js +271 -193
- 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 +76 -79
- package/dist/http/approval-sweeps.d.ts +3 -3
- package/dist/http/approval-sweeps.js +56 -31
- 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 +16 -8
- package/dist/http/claimed-run.js +8 -0
- package/dist/http/dispatch.d.ts +8 -1
- package/dist/http/dispatch.js +78 -30
- package/dist/http/durable-run-leg.d.ts +11 -4
- package/dist/http/durable-run-leg.js +45 -21
- package/dist/http/execution-context.d.ts +122 -47
- package/dist/http/execution-context.js +135 -43
- 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 +392 -67
- package/dist/http/owner-access.js +370 -35
- package/dist/http/principal-gate.d.ts +39 -89
- package/dist/http/principal-gate.js +26 -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 +46 -12
- package/dist/http/resume-ctx-read.js +31 -6
- package/dist/http/resume-legs.d.ts +54 -19
- package/dist/http/resume-legs.js +408 -196
- package/dist/http/retired-skill-manifest.d.ts +1 -1
- package/dist/http/route-ctx.d.ts +31 -32
- package/dist/http/routes/a2a-serve.d.ts +43 -5
- package/dist/http/routes/a2a-serve.js +60 -37
- package/dist/http/routes/admin-config-refresh.js +2 -2
- package/dist/http/routes/admin-drain.js +2 -2
- package/dist/http/routes/admin-memory-optout.js +4 -3
- package/dist/http/routes/adoption.d.ts +3 -0
- package/dist/http/routes/adoption.js +17 -10
- package/dist/http/routes/agents-roster.js +13 -7
- package/dist/http/routes/approvals-assistant.js +73 -67
- 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 +16 -19
- 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 +29 -3
- package/dist/http/routes/diagnostics.js +49 -18
- 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 +4 -2
- package/dist/http/routes/principal-inbox.js +5 -4
- 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 +155 -237
- 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 +28 -7
- package/dist/http/routes/session-sync.js +63 -50
- 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 +237 -187
- 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 +43 -45
- package/dist/http/server.js +61 -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 +17 -8
- package/dist/http/submit-ctx.js +8 -5
- 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 +4 -1
- package/dist/index.js +2 -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/leg-facts.d.ts +7 -2
- package/dist/leg-facts.js +1 -0
- package/dist/local-store-declaration.d.ts +54 -0
- package/dist/local-store-declaration.js +59 -0
- package/dist/lsp-evict.d.ts +6 -4
- package/dist/lsp-evict.js +2 -3
- package/dist/mcp-assertion-header.d.ts +1 -1
- package/dist/mcp-assertion-header.js +1 -1
- package/dist/memory-operator-faces.d.ts +5 -4
- package/dist/memory-operator-faces.js +1 -1
- package/dist/memory-project-layer.js +1 -1
- package/dist/memory-scope.d.ts +33 -6
- package/dist/memory-scope.js +68 -19
- package/dist/memory-store-refusal.d.ts +5 -2
- package/dist/memory-sync-client.d.ts +3 -2
- package/dist/memory-sync-client.js +8 -5
- package/dist/model-compat.d.ts +17 -8
- package/dist/model-compat.js +6 -2
- package/dist/model-context-window.d.ts +57 -0
- package/dist/model-context-window.js +21 -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 +40 -20
- package/dist/model-entry-refusal.js +57 -30
- 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-reach-scope.d.ts +2 -1
- 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 +72 -40
- package/dist/observability/fail-open.js +74 -40
- package/dist/observability/logger.d.ts +22 -1
- package/dist/observability/logger.js +89 -12
- package/dist/observability/metrics.js +4 -5
- 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 +6 -2
- package/dist/observability/secret-env-scrub.d.ts +1 -1
- package/dist/observability/secret-env-scrub.js +1 -1
- 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 +36 -10
- package/dist/org-delivery-gate.js +12 -8
- 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 +532 -0
- package/dist/owner-faces.js +126 -0
- package/dist/park-row-commit.d.ts +67 -0
- package/dist/park-row-commit.js +76 -0
- package/dist/parked-decide.d.ts +76 -12
- package/dist/parked-decide.js +152 -11
- package/dist/parked-revive-surface.d.ts +14 -4
- package/dist/parked-revive-surface.js +5 -4
- package/dist/peer-directory.d.ts +7 -9
- 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 +3 -25
- package/dist/plugins/adoption-log-sql.js +23 -21
- 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 +40 -21
- package/dist/plugins/approval-ask-store-sql.js +44 -15
- package/dist/plugins/approval-exemption-skill-cutoff.d.ts +64 -0
- package/dist/plugins/approval-exemption-skill-cutoff.js +122 -0
- package/dist/plugins/approval-exemption-skill-m46.d.ts +14 -0
- package/dist/plugins/approval-exemption-skill-m46.js +21 -0
- package/dist/plugins/approval-exemption-store.d.ts +32 -2
- package/dist/plugins/approval-exemption-store.js +42 -19
- 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 +36 -18
- package/dist/plugins/ensure-schema-lock-policy.js +76 -9
- package/dist/plugins/file-run-store.d.ts +85 -32
- package/dist/plugins/file-run-store.js +177 -94
- 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 +62 -23
- package/dist/plugins/local-checkpoint-store.js +197 -77
- package/dist/plugins/local-data-dir-modes-m39.js +2 -1
- package/dist/plugins/local-data-root-admission.d.ts +52 -0
- package/dist/plugins/local-data-root-admission.js +100 -0
- package/dist/plugins/local-docker-capacity.d.ts +93 -0
- package/dist/plugins/local-docker-capacity.js +194 -0
- package/dist/plugins/local-docker-reaper.d.ts +92 -0
- package/dist/plugins/local-docker-reaper.js +102 -0
- package/dist/plugins/local-engine-high-water.d.ts +29 -6
- package/dist/plugins/local-engine-high-water.js +27 -19
- package/dist/plugins/local-session-store.d.ts +458 -140
- package/dist/plugins/local-session-store.js +906 -292
- 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 +53 -36
- package/dist/plugins/memory-run-store.js +116 -88
- package/dist/plugins/one-time-migration-marker.d.ts +26 -0
- package/dist/plugins/one-time-migration-marker.js +13 -0
- package/dist/plugins/one-time-migrations.d.ts +214 -47
- package/dist/plugins/one-time-migrations.js +481 -135
- package/dist/plugins/org-delivery-quota-store.d.ts +34 -11
- package/dist/plugins/org-delivery-quota-store.js +31 -15
- package/dist/plugins/permission-rule-store-file.d.ts +3 -3
- package/dist/plugins/permission-rule-store-sql.d.ts +5 -64
- package/dist/plugins/permission-rule-store-sql.js +11 -95
- package/dist/plugins/pg-pool.d.ts +2 -32
- package/dist/plugins/pg-pool.js +24 -17
- package/dist/plugins/remote-env-device.d.ts +3 -2
- package/dist/plugins/remote-env-e2b.d.ts +8 -32
- package/dist/plugins/remote-env-e2b.js +44 -32
- package/dist/plugins/remote-env-host.d.ts +51 -17
- package/dist/plugins/remote-env-host.js +111 -42
- package/dist/plugins/remote-env-k8s.d.ts +40 -45
- package/dist/plugins/remote-env-k8s.js +111 -60
- package/dist/plugins/remote-env-local-docker.d.ts +152 -15
- package/dist/plugins/remote-env-local-docker.js +352 -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 +82 -75
- package/dist/plugins/run-store-sql.js +164 -125
- 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 +56 -0
- package/dist/plugins/scenario-prefix-switch-m42.js +56 -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 +131 -14
- package/dist/plugins/schema-consistency.js +388 -18
- package/dist/plugins/schema-drift-sentence.d.ts +10 -6
- package/dist/plugins/schema-drift-sentence.js +15 -7
- 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 +27 -20
- 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 +42 -0
- package/dist/plugins/shell-sentinel-owner-m48.js +9 -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/stop-then-start-sentence.d.ts +16 -0
- package/dist/plugins/stop-then-start-sentence.js +7 -0
- package/dist/plugins/store-backend.d.ts +99 -16
- package/dist/plugins/store-backend.js +230 -65
- package/dist/plugins/store-contracts.d.ts +123 -33
- package/dist/plugins/store-contracts.js +38 -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.d.ts +11 -6
- package/dist/plugins/tidb-pool.js +39 -18
- 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/plugins/workspace-custody.d.ts +44 -0
- package/dist/plugins/workspace-custody.js +47 -0
- 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/project-identity.d.ts +8 -7
- package/dist/project-identity.js +40 -17
- package/dist/project-layer-key.d.ts +13 -2
- package/dist/project-layer-key.js +9 -1
- package/dist/question.d.ts +13 -23
- package/dist/question.js +21 -39
- package/dist/read-deny-floor-notice.d.ts +36 -0
- package/dist/read-deny-floor-notice.js +40 -0
- package/dist/{plain-string-record.d.ts → request-declaration-disposition.d.ts} +9 -23
- package/dist/request-declaration-disposition.js +39 -0
- 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-cancel-card.d.ts +28 -0
- package/dist/run-cancel-card.js +19 -0
- package/dist/run-cancel-context.d.ts +10 -0
- package/dist/run-cancel-context.js +1 -0
- package/dist/run-local.d.ts +14 -6
- package/dist/run-local.js +117 -90
- package/dist/run-stale-default.d.ts +7 -0
- package/dist/run-stale-default.js +2 -0
- package/dist/runs.d.ts +56 -21
- package/dist/runs.js +73 -43
- 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 +55 -25
- package/dist/server-secret-env.js +75 -22
- package/dist/session-agent.d.ts +3 -2
- package/dist/session-children-retire.d.ts +13 -8
- package/dist/session-children-retire.js +9 -7
- 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/session-workspace.d.ts +3 -3
- package/dist/spec-fields.d.ts +57 -3
- package/dist/spec-fields.js +72 -51
- package/dist/store-admission.d.ts +33 -0
- package/dist/store-admission.js +49 -0
- package/dist/store-posture.d.ts +141 -20
- package/dist/store-posture.js +205 -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 +34 -29
- package/dist/stores-sql/checkpoint-store-sql.js +78 -49
- package/dist/stores-sql/file-history-store-sql.d.ts +1 -1
- package/dist/stores-sql/file-history-store-sql.js +3 -5
- 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/tool-result-store-sql.d.ts +1 -1
- package/dist/stores-sql/tool-result-store-sql.js +4 -6
- 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 +3 -8
- package/dist/task-a2a.js +28 -30
- package/dist/task-cwd.d.ts +43 -7
- package/dist/task-cwd.js +11 -0
- package/dist/task-mcp.d.ts +3 -3
- package/dist/task-mcp.js +4 -4
- package/dist/task-settings.d.ts +14 -10
- package/dist/task-settings.js +19 -7
- package/dist/terminal.d.ts +27 -43
- package/dist/terminal.js +49 -14
- package/dist/tool-approval.d.ts +173 -163
- package/dist/tool-approval.js +247 -232
- 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/engine-notice-wire.d.ts +24 -21
- package/dist/trace/engine-notice-wire.js +7 -3
- 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 +4 -31
- 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 +59 -44
- package/dist/trace/project.js +60 -26
- package/dist/trace/redact.d.ts +135 -27
- package/dist/trace/redact.js +884 -260
- package/dist/trace/self-minted-wire.d.ts +567 -20
- package/dist/trace/self-minted-wire.js +205 -24
- 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 +33 -23
- 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/docs/error-text-lexicon.json +317 -0
- package/package.json +8 -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/scripts/embed-minimal.mjs +183 -0
- package/wire-changes/server@7.148.0.json +1517 -0
- package/wire-changes/server@7.149.0.json +372 -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/plain-string-record.js +0 -70
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/** 帽配置(`config.remoteExec.capacity`,只在 local-docker 车道、且 `DOCKER_MAX_CONTAINERS` > 0 时在场)。 */
|
|
2
|
+
export interface LocalDockerCapacityConfig {
|
|
3
|
+
/** `DOCKER_MAX_CONTAINERS`(> 0)。 */
|
|
4
|
+
readonly maxContainers: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* 本 worker 的稳定身份 = 数据根绝对路径的 sha256 前 16 位 hex(标签值;不把路径本身写进 docker 元数据)。同一数据根上重起 ⇒ 同一身份;数据根是这份身份的唯一源,不另存 id。
|
|
8
|
+
* 数据根缺席 ⇒ 抛(装配错:local-docker 车道说不出这只 worker 是谁,失败关闭 —— 真实起服恒铸 `localDataRoot`)。
|
|
9
|
+
*/
|
|
10
|
+
export declare function localDockerWorkerOf(localDataRoot: string | undefined): string;
|
|
11
|
+
/** 本 worker 的身份标签(`docker run --label` 的值、读数的过滤值)= `sema.local-docker=<worker>`。 */
|
|
12
|
+
export declare function localDockerWorkerLabelOf(localDataRoot: string | undefined): string;
|
|
13
|
+
/** daemon 列表里的一行(本 worker 标签下的一只容器)。 */
|
|
14
|
+
export interface RegistryRow {
|
|
15
|
+
readonly name: string;
|
|
16
|
+
readonly state: string;
|
|
17
|
+
}
|
|
18
|
+
/** 一次读数:读出 ⇒ 行;读不出 ⇒ 原因(进拒句与运维行)。 */
|
|
19
|
+
export type RegistryReading = {
|
|
20
|
+
readonly ok: true;
|
|
21
|
+
readonly rows: readonly RegistryRow[];
|
|
22
|
+
} | {
|
|
23
|
+
readonly ok: false;
|
|
24
|
+
readonly reason: string;
|
|
25
|
+
};
|
|
26
|
+
/** 等待中的重读间隔(外部删除 / 别的写者只能靠重读看见)。 */
|
|
27
|
+
export declare const REREAD_MS = 1000;
|
|
28
|
+
/** 一次起动的结局:`present` = `docker run` 退 0;`absent` = 请求没到 daemon(二进制没起来);`unknown` = 其余一切(非零退出、被信号杀、超时、中止)。 */
|
|
29
|
+
export type StartOutcome = "present" | "absent" | "unknown";
|
|
30
|
+
/** 放行交回的票:起动落定后恰调一次 `settle`。 */
|
|
31
|
+
export interface CapacityTicket {
|
|
32
|
+
settle(outcome: StartOutcome): void;
|
|
33
|
+
}
|
|
34
|
+
/** 拒:`full` = 读数证明满;`unconfirmed` = 读不出;`aborted` = 调用方 / env 的信号断了。 */
|
|
35
|
+
export interface CapacityRefusal {
|
|
36
|
+
readonly verdict: "full" | "unconfirmed" | "aborted";
|
|
37
|
+
readonly message: string;
|
|
38
|
+
}
|
|
39
|
+
export type AdmitResult = {
|
|
40
|
+
readonly ok: true;
|
|
41
|
+
readonly ticket: CapacityTicket;
|
|
42
|
+
} | {
|
|
43
|
+
readonly ok: false;
|
|
44
|
+
readonly refusal: CapacityRefusal;
|
|
45
|
+
};
|
|
46
|
+
/** `/health.sandboxCapacity` 的格(键集属主;`self-minted-wire.ts` 的 `healthSandboxCapacityKey` 按它登记)。 */
|
|
47
|
+
export interface HealthSandboxCapacitySection {
|
|
48
|
+
readonly lane: "local-docker";
|
|
49
|
+
/** 上限(`DOCKER_MAX_CONTAINERS`)。 */
|
|
50
|
+
readonly limit: number;
|
|
51
|
+
/** 最近一次读数算出的在用数;还没读过 / 最近一次读不出 ⇒ `null`。 */
|
|
52
|
+
readonly inUse: number | null;
|
|
53
|
+
/** 最近一次读(读出或读不出)的时刻(ms epoch);还没读过 ⇒ `null`。 */
|
|
54
|
+
readonly readAt: number | null;
|
|
55
|
+
/** 此刻在等空位的起动数(提交门读它)。 */
|
|
56
|
+
readonly waiting: number;
|
|
57
|
+
}
|
|
58
|
+
/** 闸的只读面:提交门与 `/health` 读它。 */
|
|
59
|
+
export interface SandboxCapacityView {
|
|
60
|
+
/** 此刻在等空位的起动数(看过一次「没空位」、还没起成也还没被拒的)。 */
|
|
61
|
+
waiting(): number;
|
|
62
|
+
health(): HealthSandboxCapacitySection;
|
|
63
|
+
}
|
|
64
|
+
/** 读 daemon 一次:界由闸给,信号是这一次准入的信号(env 销毁 / 连接被取消 ⇒ 读本身也断)。 */
|
|
65
|
+
export type RegistryRead = (budgetMs: number, signal: AbortSignal | undefined) => Promise<RegistryReading>;
|
|
66
|
+
export interface LocalDockerCapacity extends SandboxCapacityView {
|
|
67
|
+
/** 读的那只 worker 标签(装配时与适配器的 `workerLabel` 同一个值;拒句里给运维的过滤式用它)。 */
|
|
68
|
+
readonly label: string;
|
|
69
|
+
/**
|
|
70
|
+
* 一次起动的准入。`read(budgetMs)` = 调用方经自己的 docker 通道读一次 daemon(读的界由闸给);`deadline` = 调用方这只 env 的等待预算的终点(ms epoch);
|
|
71
|
+
* 预算已花完 ⇒ 只读一次,有空位就放、没有立拒。
|
|
72
|
+
*/
|
|
73
|
+
admit(req: {
|
|
74
|
+
readonly name: string;
|
|
75
|
+
readonly read: RegistryRead;
|
|
76
|
+
readonly deadline: number;
|
|
77
|
+
readonly readBoundMs: number;
|
|
78
|
+
readonly signal?: AbortSignal;
|
|
79
|
+
}): Promise<AdmitResult>;
|
|
80
|
+
/** env 的 `docker rm -f` 被证实(退 0 / daemon 答 no such container):这只名出未定集、唤醒等待者。 */
|
|
81
|
+
removed(name: string): void;
|
|
82
|
+
}
|
|
83
|
+
interface CapacityLog {
|
|
84
|
+
warn(event: string, fields: Record<string, unknown>): void;
|
|
85
|
+
}
|
|
86
|
+
/** 建一只闸(一进程一只;帽关着 ⇒ 调用方不建)。`label` = {@link localDockerWorkerLabelOf};`now` 是钉的时钟缝。 */
|
|
87
|
+
export declare function createLocalDockerCapacity(cfg: LocalDockerCapacityConfig, opts: {
|
|
88
|
+
readonly label: string;
|
|
89
|
+
readonly logger?: CapacityLog;
|
|
90
|
+
readonly now?: () => number;
|
|
91
|
+
}): LocalDockerCapacity;
|
|
92
|
+
export {};
|
|
93
|
+
//# sourceMappingURL=local-docker-capacity.d.ts.map
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
export function localDockerWorkerOf(localDataRoot) {
|
|
4
|
+
if (localDataRoot === undefined || localDataRoot === "")
|
|
5
|
+
throw new Error("the local-docker lane needs the server's data root to name this worker (every container carries the worker label) — config.localDataRoot is absent");
|
|
6
|
+
return createHash("sha256").update(resolve(localDataRoot)).digest("hex").slice(0, 16);
|
|
7
|
+
}
|
|
8
|
+
export function localDockerWorkerLabelOf(localDataRoot) {
|
|
9
|
+
return `sema.local-docker=${localDockerWorkerOf(localDataRoot)}`;
|
|
10
|
+
}
|
|
11
|
+
const LIVE_STATES = new Set(["running", "paused", "restarting", "removing"]);
|
|
12
|
+
export const REREAD_MS = 1000;
|
|
13
|
+
export function createLocalDockerCapacity(cfg, opts) {
|
|
14
|
+
const now = opts.now ?? Date.now;
|
|
15
|
+
const label = opts.label;
|
|
16
|
+
const limit = cfg.maxContainers;
|
|
17
|
+
const filter = `label=${label}`;
|
|
18
|
+
const entries = new Map();
|
|
19
|
+
let seq = 0;
|
|
20
|
+
let last;
|
|
21
|
+
let waiting = 0;
|
|
22
|
+
let tail = Promise.resolve();
|
|
23
|
+
const wakers = new Set();
|
|
24
|
+
const wake = () => {
|
|
25
|
+
for (const w of [...wakers])
|
|
26
|
+
w();
|
|
27
|
+
};
|
|
28
|
+
async function measure(read, budgetMs, signal) {
|
|
29
|
+
const snapshot = new Map(entries);
|
|
30
|
+
const readSeq = ++seq;
|
|
31
|
+
let r;
|
|
32
|
+
try {
|
|
33
|
+
r = await read(budgetMs, signal);
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
r = { ok: false, reason: e instanceof Error ? e.message : String(e) };
|
|
37
|
+
}
|
|
38
|
+
if (!r.ok) {
|
|
39
|
+
last = { inUse: null, at: now() };
|
|
40
|
+
return { unread: r.reason };
|
|
41
|
+
}
|
|
42
|
+
const listed = new Set(r.rows.map((row) => row.name));
|
|
43
|
+
const counted = new Set(r.rows.filter((row) => LIVE_STATES.has(row.state)).map((row) => row.name));
|
|
44
|
+
for (const [name, e] of snapshot) {
|
|
45
|
+
if (e.kind === "inflight" || listed.has(name) || e.settledSeq >= readSeq)
|
|
46
|
+
counted.add(name);
|
|
47
|
+
}
|
|
48
|
+
for (const [name, e] of [...entries]) {
|
|
49
|
+
if (e.kind === "unknown" && e.settledSeq < readSeq && !listed.has(name))
|
|
50
|
+
entries.delete(name);
|
|
51
|
+
}
|
|
52
|
+
last = { inUse: counted.size, at: now() };
|
|
53
|
+
return { inUse: counted.size };
|
|
54
|
+
}
|
|
55
|
+
function refusalOf(verdict, inUse, reason, waitedMs) {
|
|
56
|
+
const waited = `${Math.round(waitedMs / 100) / 10}s`;
|
|
57
|
+
const message = verdict === "full"
|
|
58
|
+
? `local-docker sandbox capacity reached: ${inUse ?? limit} of ${limit} containers carrying this server's worker label are running (containers left by an earlier run on the same data root count too) — waited ${waited} for one to end; nothing was started (limit.rate_exceeded · sandbox_capacity). ` +
|
|
59
|
+
`Retry later, raise DOCKER_MAX_CONTAINERS, or remove containers left behind (docker ps -a --filter ${filter}).`
|
|
60
|
+
: `local-docker sandbox capacity could not be confirmed: the docker daemon did not list this worker's containers (${reason ?? "no answer"}) — waited ${waited}; nothing was started (limit.rate_exceeded · sandbox_capacity). Retry later.`;
|
|
61
|
+
opts.logger?.warn("local_docker_capacity_refused", { verdict, ...(inUse !== undefined ? { inUse } : {}), limit, waitedMs });
|
|
62
|
+
return { verdict, message };
|
|
63
|
+
}
|
|
64
|
+
function pause(ms, signal) {
|
|
65
|
+
return new Promise((resolve) => {
|
|
66
|
+
const done = (why) => {
|
|
67
|
+
clearTimeout(timer);
|
|
68
|
+
wakers.delete(onWake);
|
|
69
|
+
signal?.removeEventListener("abort", onAbort);
|
|
70
|
+
resolve(why);
|
|
71
|
+
};
|
|
72
|
+
const onWake = () => done("wake");
|
|
73
|
+
const onAbort = () => done("aborted");
|
|
74
|
+
const timer = setTimeout(() => done("timer"), Math.max(0, ms));
|
|
75
|
+
wakers.add(onWake);
|
|
76
|
+
if (signal?.aborted)
|
|
77
|
+
return done("aborted");
|
|
78
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
function queue(prev, deadline, signal) {
|
|
82
|
+
return new Promise((resolve) => {
|
|
83
|
+
let settled = false;
|
|
84
|
+
const done = (why) => {
|
|
85
|
+
if (settled)
|
|
86
|
+
return;
|
|
87
|
+
settled = true;
|
|
88
|
+
clearTimeout(timer);
|
|
89
|
+
signal?.removeEventListener("abort", onAbort);
|
|
90
|
+
resolve(why);
|
|
91
|
+
};
|
|
92
|
+
const onAbort = () => done("aborted");
|
|
93
|
+
const timer = setTimeout(() => done("deadline"), Math.max(0, deadline - now()));
|
|
94
|
+
if (signal?.aborted)
|
|
95
|
+
return done("aborted");
|
|
96
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
97
|
+
void prev.then(() => done("turn"));
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
async function admit(req) {
|
|
101
|
+
const { name, read, deadline, readBoundMs, signal } = req;
|
|
102
|
+
const startedAt = now();
|
|
103
|
+
let release;
|
|
104
|
+
const prev = tail;
|
|
105
|
+
tail = new Promise((r) => (release = r));
|
|
106
|
+
let starved = false;
|
|
107
|
+
let lastInUse;
|
|
108
|
+
let lastUnread;
|
|
109
|
+
let turn = "deadline";
|
|
110
|
+
try {
|
|
111
|
+
const spent = deadline <= startedAt;
|
|
112
|
+
turn = await queue(prev, spent ? startedAt + readBoundMs : deadline, signal);
|
|
113
|
+
if (turn === "aborted")
|
|
114
|
+
return { ok: false, refusal: { verdict: "aborted", message: "local-docker container start aborted while waiting for sandbox capacity" } };
|
|
115
|
+
if (turn === "deadline")
|
|
116
|
+
return { ok: false, refusal: refusalOf(last?.inUse === null ? "unconfirmed" : "full", last?.inUse ?? undefined, last?.inUse === null ? "no reading" : undefined, now() - startedAt) };
|
|
117
|
+
for (let reads = 0;; reads++) {
|
|
118
|
+
const remaining = deadline - now();
|
|
119
|
+
if (reads > 0 && remaining <= 0)
|
|
120
|
+
return { ok: false, refusal: refusalOf(lastUnread !== undefined ? "unconfirmed" : "full", lastInUse, lastUnread, now() - startedAt) };
|
|
121
|
+
const m = await measure(read, remaining > 0 ? Math.min(remaining, readBoundMs) : readBoundMs, signal);
|
|
122
|
+
if (signal?.aborted)
|
|
123
|
+
return { ok: false, refusal: { verdict: "aborted", message: "local-docker container start aborted while waiting for sandbox capacity" } };
|
|
124
|
+
if ("inUse" in m) {
|
|
125
|
+
lastInUse = m.inUse;
|
|
126
|
+
lastUnread = undefined;
|
|
127
|
+
if (m.inUse + 1 <= limit) {
|
|
128
|
+
const entry = { kind: "inflight" };
|
|
129
|
+
entries.set(name, entry);
|
|
130
|
+
let once = false;
|
|
131
|
+
return {
|
|
132
|
+
ok: true,
|
|
133
|
+
ticket: {
|
|
134
|
+
settle: (outcome) => {
|
|
135
|
+
if (once || entries.get(name) !== entry)
|
|
136
|
+
return;
|
|
137
|
+
once = true;
|
|
138
|
+
if (outcome === "unknown")
|
|
139
|
+
entries.set(name, { kind: "unknown", settledSeq: seq });
|
|
140
|
+
else {
|
|
141
|
+
entries.delete(name);
|
|
142
|
+
if (outcome === "absent")
|
|
143
|
+
wake();
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
lastUnread = m.unread;
|
|
152
|
+
}
|
|
153
|
+
if (!starved) {
|
|
154
|
+
starved = true;
|
|
155
|
+
waiting++;
|
|
156
|
+
}
|
|
157
|
+
const left = deadline - now();
|
|
158
|
+
if (left <= 0)
|
|
159
|
+
return { ok: false, refusal: refusalOf(lastUnread !== undefined ? "unconfirmed" : "full", lastInUse, lastUnread, now() - startedAt) };
|
|
160
|
+
const slice = Math.min(REREAD_MS, left);
|
|
161
|
+
const woke = await pause(slice, signal);
|
|
162
|
+
if (woke === "aborted")
|
|
163
|
+
return { ok: false, refusal: { verdict: "aborted", message: "local-docker container start aborted while waiting for sandbox capacity" } };
|
|
164
|
+
if (woke === "timer" && slice === left)
|
|
165
|
+
return { ok: false, refusal: refusalOf(lastUnread !== undefined ? "unconfirmed" : "full", lastInUse, lastUnread, now() - startedAt) };
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
finally {
|
|
169
|
+
if (starved)
|
|
170
|
+
waiting--;
|
|
171
|
+
if (turn === "turn")
|
|
172
|
+
release();
|
|
173
|
+
else
|
|
174
|
+
void prev.then(release);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
label,
|
|
179
|
+
admit,
|
|
180
|
+
removed(name) {
|
|
181
|
+
entries.delete(name);
|
|
182
|
+
wake();
|
|
183
|
+
},
|
|
184
|
+
waiting: () => waiting,
|
|
185
|
+
health: () => ({
|
|
186
|
+
lane: "local-docker",
|
|
187
|
+
limit,
|
|
188
|
+
inUse: last?.inUse ?? null,
|
|
189
|
+
readAt: last?.at ?? null,
|
|
190
|
+
waiting,
|
|
191
|
+
}),
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=local-docker-capacity.js.map
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* local-docker 车道的无主容器回收器 —— 本 worker 起的容器、它的 run 已经终局而没人删的,由它删(停驻中取消 / 停驻过期 / 重起之后才结清的停驻:引擎不销毁停驻腿的环境,
|
|
3
|
+
* 本服务的取消与过期走店层结清、不经引擎仲裁器,于是那只容器一直在跑、一直占车道容器帽的一格;进程崩溃遗留的同理)。
|
|
4
|
+
*
|
|
5
|
+
* ## 律(一句)
|
|
6
|
+
* 容器的主人 = 它那条 run:run 行是活的(跑着 / 停驻着,还能被批准或续跑)⇒ 容器是它的手,不动;run 行**终局了、并且已经过了一段保持窗**({@link LOCAL_DOCKER_REAP_HOLD_MS})⇒ 无主,删。
|
|
7
|
+
* 拿不准恒不删(销毁不可逆;误删的代价是一个活 run 的工作区,漏删的代价只是一格容器帽):名读不回身份 / 查不到 run 行 / 读抛 / 词表外 / 终局时刻读不出 / 还在保持窗内 ⇒ 都不删。
|
|
8
|
+
*
|
|
9
|
+
* ## 为什么终局之后还要再等一段(而不是终局即删)
|
|
10
|
+
* 引擎在同一条腿里先把 `done` 帧交出去(本服务就在这一帧上把 run 行落成终局),**之后**才跑它的收尾:文件历史的边界捕获(从执行环境里读文件,自带 30 s 上限)、后台 shell 清扫、
|
|
11
|
+
* 子代清退、销毁执行环境本身(每条拆场腿至多 `teardownLegBudget()`)。终局行因此比这些用环境的收尾早 —— 终局即删会在捕获读到一半时把容器删了。保持窗远大于这一串收尾的上界;
|
|
12
|
+
* 窗过了容器还在 = 引擎自己的销毁没有发生(停驻中被取消 / 过期的环境没有销毁者、进程崩了、销毁没证实)—— 这才是无主。时刻读 run 行转终态那一拍(行上的 `updatedAt`,与 k8s pod 回收同一个钟)。
|
|
13
|
+
*
|
|
14
|
+
* ## 判据只有一个读法,删只有一个状态机
|
|
15
|
+
* · 身份 = 容器名里读回的那只 run 号({@link LocalDockerReapPort.identityOf}:`localDockerContainerNameOf` 的逆,用正向函数验过摘要才认);
|
|
16
|
+
* run 行 = 唯一属主 `runStatusClassOf`(词 → 类,本模块只写「类 → 删不删」那一句,与 E2B 孤儿回收 / k8s Pod 回收同一形:两向都是编译期问题)。
|
|
17
|
+
* · 删 = {@link LocalDockerReapPort.settle}:交给适配器里**同一只**欠着机(`remote-env-local-docker.ts` 的 `LocalDockerCustody`:先记成欠着、按实例 id 删、证实才清);
|
|
18
|
+
* 本模块不碰 docker、不碰容器名以外的任何东西。「没证实」= 这一只仍欠着,留到下一轮(欠着的删除由工厂交给同一身份的下一只环境,谁都不附着将被删的那只)。
|
|
19
|
+
* · 列举 = 车道容器帽读的那一只读数口(本 worker 标签下的全部容器):别的 worker 的容器不在列;列出之后名下被换成别人的 ⇒ 欠着机认领时按标签判「不是本 worker 的」,不动。
|
|
20
|
+
*
|
|
21
|
+
* ## 不覆盖的(读得出的边界)
|
|
22
|
+
* · 委派子代的容器(身份 = 它自己的会话号,没有 run 行)与本版之前起的容器(名带随机尾,读不回身份):`run_unread` / `identity_unreadable` ⇒ 不动 ——
|
|
23
|
+
* 它们的主人不在 run 店里,要另一只读口才判得了;运维按标签过滤式手删。
|
|
24
|
+
*
|
|
25
|
+
* 每轮一行 `local_docker_reap_round`(`listed` / `scanned` / 按原因分的 `deleted` 与 `skipped` / `unconfirmed`),每删一只一行 `local_docker_reaped`,计数
|
|
26
|
+
* `local_docker_containers_reaped_total{reason}`;**列举失败**这一轮一只都不删 —— F 类兜底口 `server.local-docker-reaper.degraded`(`why=list_failed`)+ 一行 warn;
|
|
27
|
+
* **某一只删除证实不了**不挡其余 —— 同一只口(`why=delete_unconfirmed`)+ 一行 warn,下一轮再判再删。节拍 = 维护 tick 上的沙箱回收腿({@link SANDBOX_REAP_PERIOD_MS},起服后第一拍即跑)。
|
|
28
|
+
*/
|
|
29
|
+
import type { Logger } from "../observability/logger.js";
|
|
30
|
+
import type { Metrics } from "../observability/metrics.js";
|
|
31
|
+
import type { RegistryReading } from "./local-docker-capacity.js";
|
|
32
|
+
import type { SandboxReaper, SandboxReaperRunReader } from "./sandbox-reaper.js";
|
|
33
|
+
/**
|
|
34
|
+
* run 行转终态之后、回收器才认「无主」之前要再等的一段(毫秒)。非行为旋钮,常量:它只需要「远大于终局之后引擎那串收尾的上界(边界捕获 30 s + 每条拆场腿至多 `teardownLegBudget()` 15 s)、
|
|
35
|
+
* 远小于一次容器泄漏的代价」—— 5 min 对两端都有量级余量,错设它的运维事故面比它护住的窗口更大(与 E2B 孤儿回收的 create → 行落库窗同一条理由)。
|
|
36
|
+
*/
|
|
37
|
+
export declare const LOCAL_DOCKER_REAP_HOLD_MS: number;
|
|
38
|
+
/** 删的原因(闭集;现只有一个:run 行已终局)。 */
|
|
39
|
+
export type LocalDockerReapDeleteReason = "run_ended";
|
|
40
|
+
/** 不动的原因(闭集):前八个是判决(没去删);`nothing_to_remove` 是判了删、收场时名下已没有我们删的(引擎自己先收了 / 名下是别人的)。 */
|
|
41
|
+
export type LocalDockerReapSkipReason = "identity_unreadable" | "run_store_absent" | "run_unread" | "run_read_failed" | "run_status_unknown" | "run_live" | "run_end_unreadable" | "within_run_end_hold" | "nothing_to_remove";
|
|
42
|
+
export type LocalDockerReapVerdict = {
|
|
43
|
+
readonly delete: LocalDockerReapDeleteReason;
|
|
44
|
+
} | {
|
|
45
|
+
readonly skip: Exclude<LocalDockerReapSkipReason, "identity_unreadable" | "nothing_to_remove">;
|
|
46
|
+
};
|
|
47
|
+
/** 一只身份的 run 读数(闭集):读到行 / 店答没有这一行 / 读抛 / 本部署没有 run 店可问。 */
|
|
48
|
+
export type LocalDockerRunReading = {
|
|
49
|
+
readonly found: {
|
|
50
|
+
readonly status: string;
|
|
51
|
+
readonly updatedAt: string;
|
|
52
|
+
};
|
|
53
|
+
} | {
|
|
54
|
+
readonly absent: true;
|
|
55
|
+
} | {
|
|
56
|
+
readonly failed: true;
|
|
57
|
+
} | {
|
|
58
|
+
readonly storeAbsent: true;
|
|
59
|
+
};
|
|
60
|
+
/** 一只身份的容器删不删(纯判官;律见文件头):只读它那条 run 的读数。判决链的缺省臂是**不动作**:删必须被显式选中。名读不回身份的容器(`identity_unreadable`)连 run 都没得读,由调用方先挡下。 */
|
|
61
|
+
export declare function judgeLocalDockerRun(run: LocalDockerRunReading, nowMs: number): LocalDockerReapVerdict;
|
|
62
|
+
/** 回收器对 docker 一侧的窄面(真实装配 = `remote-env-local-docker.ts` 的 `localDockerExecutionEnvFactory(...).reapPort`;测试注入假面)。 */
|
|
63
|
+
export interface LocalDockerReapPort {
|
|
64
|
+
/** 本 worker 的身份标签(`sema.local-docker=<worker>`):运维行里点名这一只 worker。 */
|
|
65
|
+
readonly label: string;
|
|
66
|
+
/** 本 worker 标签下的全部容器(与车道容器帽同一只读数口;读不出 ⇒ 原因)。 */
|
|
67
|
+
list(): Promise<RegistryReading>;
|
|
68
|
+
/** 容器名 → 它那只身份;不是本 worker 按律铸的名(旧版随机尾 / 可读形被截断 / 摘要不符)⇒ `undefined`。 */
|
|
69
|
+
identityOf(name: string): string | undefined;
|
|
70
|
+
/** 收这只身份的无主容器:交给同一只欠着机按实例 id 删。`removed` = 真删掉了一只;`nothing` = 删除证实了、但没有我们删的(名下已没有本 worker 的容器 / 是别人的);`owed` = 没证实,仍欠着(下一轮再删)。 */
|
|
71
|
+
settle(identity: string): Promise<"removed" | "nothing" | "owed">;
|
|
72
|
+
}
|
|
73
|
+
/** 一轮的读数(轮次行与计数的来源)。`deleted` / `skipped` 只列出现过的原因。 */
|
|
74
|
+
export interface LocalDockerReapRound {
|
|
75
|
+
readonly listed: boolean;
|
|
76
|
+
readonly scanned: number;
|
|
77
|
+
readonly deleted: Partial<Record<LocalDockerReapDeleteReason, number>>;
|
|
78
|
+
readonly skipped: Partial<Record<LocalDockerReapSkipReason, number>>;
|
|
79
|
+
/** 判了删、删除没证实(仍欠着)的只数。 */
|
|
80
|
+
readonly unconfirmed: number;
|
|
81
|
+
}
|
|
82
|
+
export interface LocalDockerReaper extends SandboxReaper {
|
|
83
|
+
reapOnce(runs: SandboxReaperRunReader | undefined): Promise<LocalDockerReapRound>;
|
|
84
|
+
}
|
|
85
|
+
export declare function createLocalDockerReaper(deps: {
|
|
86
|
+
readonly port: LocalDockerReapPort;
|
|
87
|
+
readonly logger?: Pick<Logger, "info" | "warn">;
|
|
88
|
+
readonly metrics?: Pick<Metrics, "inc">;
|
|
89
|
+
/** 钟缝(测试;缺省 `Date.now`)。 */
|
|
90
|
+
readonly now?: () => number;
|
|
91
|
+
}): LocalDockerReaper;
|
|
92
|
+
//# sourceMappingURL=local-docker-reaper.d.ts.map
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { recordFailOpen } from "../observability/fail-open.js";
|
|
2
|
+
import { runStatusClassOf } from "./store-contracts.js";
|
|
3
|
+
export const LOCAL_DOCKER_REAP_HOLD_MS = 5 * 60_000;
|
|
4
|
+
const CLASS_VERDICT = {
|
|
5
|
+
live: "live",
|
|
6
|
+
parked: "live",
|
|
7
|
+
succeeded: "terminal",
|
|
8
|
+
unsuccessful: "terminal",
|
|
9
|
+
};
|
|
10
|
+
export function judgeLocalDockerRun(run, nowMs) {
|
|
11
|
+
if ("storeAbsent" in run)
|
|
12
|
+
return { skip: "run_store_absent" };
|
|
13
|
+
if ("failed" in run)
|
|
14
|
+
return { skip: "run_read_failed" };
|
|
15
|
+
if ("absent" in run)
|
|
16
|
+
return { skip: "run_unread" };
|
|
17
|
+
const cls = runStatusClassOf(run.found.status);
|
|
18
|
+
if (cls === undefined)
|
|
19
|
+
return { skip: "run_status_unknown" };
|
|
20
|
+
if (CLASS_VERDICT[cls] === "live")
|
|
21
|
+
return { skip: "run_live" };
|
|
22
|
+
const endedAt = Date.parse(run.found.updatedAt);
|
|
23
|
+
if (!Number.isFinite(endedAt))
|
|
24
|
+
return { skip: "run_end_unreadable" };
|
|
25
|
+
if (nowMs - endedAt <= LOCAL_DOCKER_REAP_HOLD_MS)
|
|
26
|
+
return { skip: "within_run_end_hold" };
|
|
27
|
+
return { delete: "run_ended" };
|
|
28
|
+
}
|
|
29
|
+
export function createLocalDockerReaper(deps) {
|
|
30
|
+
const { port } = deps;
|
|
31
|
+
const now = deps.now ?? Date.now;
|
|
32
|
+
return {
|
|
33
|
+
async reapOnce(runs) {
|
|
34
|
+
const deleted = {};
|
|
35
|
+
const skipped = {};
|
|
36
|
+
let unconfirmed = 0;
|
|
37
|
+
let listing;
|
|
38
|
+
try {
|
|
39
|
+
listing = await port.list();
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
listing = { ok: false, reason: e instanceof Error ? e.message : String(e) };
|
|
43
|
+
}
|
|
44
|
+
if (!listing.ok) {
|
|
45
|
+
recordFailOpen("server.local-docker-reaper.degraded", `why=list_failed worker=${port.label} ${listing.reason}`);
|
|
46
|
+
deps.logger?.warn("local_docker_reap_list_failed", {
|
|
47
|
+
worker: port.label,
|
|
48
|
+
error: listing.reason,
|
|
49
|
+
effect: "containers of ended runs were not deleted this round — they keep holding a slot of DOCKER_MAX_CONTAINERS until a later round lists them (one period later)",
|
|
50
|
+
});
|
|
51
|
+
return { listed: false, scanned: 0, deleted, skipped, unconfirmed };
|
|
52
|
+
}
|
|
53
|
+
const at = now();
|
|
54
|
+
const reads = new Map();
|
|
55
|
+
const readRun = (identity) => {
|
|
56
|
+
if (runs === undefined)
|
|
57
|
+
return Promise.resolve({ storeAbsent: true });
|
|
58
|
+
let r = reads.get(identity);
|
|
59
|
+
if (r === undefined) {
|
|
60
|
+
r = runs.getRun(identity).then((row) => (row === undefined || row === null ? { absent: true } : { found: row }), () => ({ failed: true }));
|
|
61
|
+
reads.set(identity, r);
|
|
62
|
+
}
|
|
63
|
+
return r;
|
|
64
|
+
};
|
|
65
|
+
for (const row of listing.rows) {
|
|
66
|
+
const identity = port.identityOf(row.name);
|
|
67
|
+
if (identity === undefined) {
|
|
68
|
+
skipped.identity_unreadable = (skipped.identity_unreadable ?? 0) + 1;
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
const verdict = judgeLocalDockerRun(await readRun(identity), at);
|
|
72
|
+
if ("skip" in verdict) {
|
|
73
|
+
skipped[verdict.skip] = (skipped[verdict.skip] ?? 0) + 1;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
const settled = await port.settle(identity).catch(() => "owed");
|
|
77
|
+
if (settled === "nothing") {
|
|
78
|
+
skipped.nothing_to_remove = (skipped.nothing_to_remove ?? 0) + 1;
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (settled === "owed") {
|
|
82
|
+
unconfirmed++;
|
|
83
|
+
recordFailOpen("server.local-docker-reaper.degraded", `why=delete_unconfirmed worker=${port.label} container=${row.name}`);
|
|
84
|
+
deps.logger?.warn("local_docker_reap_unconfirmed", {
|
|
85
|
+
worker: port.label,
|
|
86
|
+
container: row.name,
|
|
87
|
+
reason: verdict.delete,
|
|
88
|
+
effect: "docker did not confirm the removal — the container stays (and keeps its DOCKER_MAX_CONTAINERS slot); it is owed, never attached again, and the next round deletes it first",
|
|
89
|
+
});
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
deleted[verdict.delete] = (deleted[verdict.delete] ?? 0) + 1;
|
|
93
|
+
deps.metrics?.inc("local_docker_containers_reaped_total", { reason: verdict.delete });
|
|
94
|
+
deps.logger?.info("local_docker_reaped", { worker: port.label, container: row.name, reason: verdict.delete });
|
|
95
|
+
}
|
|
96
|
+
const round = { listed: true, scanned: listing.rows.length, deleted, skipped, unconfirmed };
|
|
97
|
+
deps.logger?.info("local_docker_reap_round", { worker: port.label, ...round });
|
|
98
|
+
return round;
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=local-docker-reaper.js.map
|
|
@@ -1,11 +1,34 @@
|
|
|
1
|
+
import { type DataRootFileText } from "./local-session-store.js";
|
|
2
|
+
import { type ReleaseTriple } from "./release-version.js";
|
|
1
3
|
/** marker 的文件名(数据根顶层;公开契约)。 */
|
|
2
4
|
export declare const ENGINE_HIGH_WATER_FILE = "engine-high-water.json";
|
|
3
5
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* ② 读 `<root>/engine-high-water.json`:读不出 / 高水位高于本构建 ⇒ 抛 {@link LocalDataRootSchemaMismatchError}(`boot` 形;文件原地不动,不抬);
|
|
7
|
-
* ③ 缺席或低于本构建 ⇒ 原子写 `{"highWater": <本构建的纯三段>}`(`required`);相等 ⇒ 不写,只过持久化屏障(读到的可能是上一次没证完的那份)。写不进 / 证不了 ⇒ 抛(点名路径与原因)。
|
|
8
|
-
* 同步:它在后端打开的同步段里跑(建店之前),拒在这里就不会有一只店被建起。
|
|
6
|
+
* 准入判出的高水位(**读数**,不是活物):{@link raiseEngineHighWater} 按它抬。唯一的铸点 = {@link judgeEngineHighWater} / 空根那一格的 {@link ownReleaseLine}
|
|
7
|
+
* (都在数据根准入 `local-data-root-admission.ts` 的 `admitLocalDataRoot` 里)。
|
|
9
8
|
*/
|
|
10
|
-
export
|
|
9
|
+
export interface EngineHighWaterReading {
|
|
10
|
+
/** 本构建的发布线(纯三段;判与抬都按它)。 */
|
|
11
|
+
readonly own: ReleaseTriple;
|
|
12
|
+
/** marker 记的高水位(缺席 = `undefined`);跳版拒启臂读它。 */
|
|
13
|
+
readonly prior: ReleaseTriple | undefined;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 本构建的发布线(判与抬都按它):`engine` 按发布线读不出({@link buildReleaseTriple})⇒ 抛 {@link StoreBootRefusalError} —— 判不了「不比打开过这只根的引擎旧」,
|
|
17
|
+
* 也写不出自己的水位(坏包,不服务这只根;数据根上有没有东西都一样拒)。
|
|
18
|
+
*/
|
|
19
|
+
export declare function ownReleaseLine(root: string, engine: string): ReleaseTriple;
|
|
20
|
+
/** marker 在一只(物理)数据根下的路径。 */
|
|
21
|
+
export declare function engineHighWaterPath(root: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* **判**(纯;唯一调用点 = 数据根准入:判的是准入那一次观察里 marker 的字节 `raw`,不自己读盘):
|
|
24
|
+
* ① 本构建版本按发布线读不出 ⇒ 抛({@link ownReleaseLine});
|
|
25
|
+
* ② marker 读不出 / 高水位高于本构建 ⇒ 抛 {@link LocalDataRootSchemaMismatchError}(`boot` 形);
|
|
26
|
+
* ③ 否则交回读数(缺席 / 低于 / 等于)。
|
|
27
|
+
*/
|
|
28
|
+
export declare function judgeEngineHighWater(root: string, raw: DataRootFileText, engine: string): EngineHighWaterReading;
|
|
29
|
+
/**
|
|
30
|
+
* **抬**(锁内;紧随准入的「数据根没动」核对与跳版臂的记账之后、本仓任何一只店建起之前):缺席或低于本构建 ⇒ 原子写 `{"highWater": <本构建的纯三段>}`(`required`);
|
|
31
|
+
* 相等 ⇒ 不写,只过持久化屏障(读到的可能是上一次没证完的那份)。写不进 / 证不了 ⇒ 抛(点名路径与原因)。
|
|
32
|
+
*/
|
|
33
|
+
export declare function raiseEngineHighWater(physicalRoot: string, admitted: EngineHighWaterReading): void;
|
|
11
34
|
//# sourceMappingURL=local-engine-high-water.d.ts.map
|
|
@@ -2,7 +2,7 @@ import { join, resolve } from "node:path";
|
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { atomicWriteFileSync, proveDurableSync } from "./owner-only-file-mode.js";
|
|
4
4
|
import { createZodColumnReader, decodeJsonColumn } from "./sql-json-column.js";
|
|
5
|
-
import { LocalDataRootSchemaMismatchError, dataRootMismatchOf
|
|
5
|
+
import { LocalDataRootSchemaMismatchError, dataRootMismatchOf } from "./local-session-store.js";
|
|
6
6
|
import { buildReleaseTriple, compareReleaseTriples, releaseText, releaseTriple } from "./release-version.js";
|
|
7
7
|
import { StoreBootRefusalError } from "./store-contracts.js";
|
|
8
8
|
export const ENGINE_HIGH_WATER_FILE = "engine-high-water.json";
|
|
@@ -19,37 +19,45 @@ const ENGINE_HIGH_WATER_SHAPE = z
|
|
|
19
19
|
return { highWater: v.highWater, triple };
|
|
20
20
|
});
|
|
21
21
|
const readEngineHighWater = createZodColumnReader(ENGINE_HIGH_WATER_SHAPE);
|
|
22
|
-
export function
|
|
22
|
+
export function ownReleaseLine(root, engine) {
|
|
23
23
|
const own = buildReleaseTriple(engine);
|
|
24
24
|
if (own === undefined) {
|
|
25
25
|
throw new StoreBootRefusalError(`DB_BACKEND=local: this build's own version (package.json "version": ${JSON.stringify(engine.slice(0, 64))}) is not a release version (x.y.z, optionally with a prerelease or build suffix) — refusing to open the data root ${root}: ` +
|
|
26
26
|
"the engine high-water fence needs this build's release line to show it is not older than the engines that opened this data root, and to record its own. " +
|
|
27
27
|
"Run a build whose package.json carries a release version.");
|
|
28
28
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
return own;
|
|
30
|
+
}
|
|
31
|
+
export function engineHighWaterPath(root) {
|
|
32
|
+
return resolve(join(root, ENGINE_HIGH_WATER_FILE));
|
|
33
|
+
}
|
|
34
|
+
export function judgeEngineHighWater(root, raw, engine) {
|
|
35
|
+
const own = ownReleaseLine(root, engine);
|
|
36
|
+
const path = engineHighWaterPath(root);
|
|
32
37
|
if (raw.state === "unreadable")
|
|
33
38
|
throw new LocalDataRootSchemaMismatchError([dataRootMismatchOf(path, ENGINE_HIGH_WATER_LABEL, raw.fault)], "boot");
|
|
34
|
-
if (raw.state === "
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
catch (e) {
|
|
40
|
-
throw new LocalDataRootSchemaMismatchError([dataRootMismatchOf(path, ENGINE_HIGH_WATER_LABEL, e)], "boot");
|
|
41
|
-
}
|
|
42
|
-
const order = compareReleaseTriples(marker.triple, own);
|
|
43
|
-
if (order > 0) {
|
|
44
|
-
throw new LocalDataRootSchemaMismatchError([{ path, label: ENGINE_HIGH_WATER_LABEL, problem: "newer-engine", unknownFields: [], engineHighWater: { highWater: marker.highWater, engine } }], "boot");
|
|
45
|
-
}
|
|
46
|
-
equal = order === 0;
|
|
39
|
+
if (raw.state === "absent")
|
|
40
|
+
return { own, prior: undefined };
|
|
41
|
+
let marker;
|
|
42
|
+
try {
|
|
43
|
+
marker = decodeJsonColumn(raw.text, readEngineHighWater, ENGINE_HIGH_WATER_LABEL);
|
|
47
44
|
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
throw new LocalDataRootSchemaMismatchError([dataRootMismatchOf(path, ENGINE_HIGH_WATER_LABEL, e)], "boot");
|
|
47
|
+
}
|
|
48
|
+
if (compareReleaseTriples(marker.triple, own) > 0) {
|
|
49
|
+
throw new LocalDataRootSchemaMismatchError([{ path, label: ENGINE_HIGH_WATER_LABEL, problem: "newer-engine", unknownFields: [], engineHighWater: { highWater: marker.highWater, engine } }], "boot");
|
|
50
|
+
}
|
|
51
|
+
return { own, prior: marker.triple };
|
|
52
|
+
}
|
|
53
|
+
export function raiseEngineHighWater(physicalRoot, admitted) {
|
|
54
|
+
const path = engineHighWaterPath(physicalRoot);
|
|
55
|
+
const equal = admitted.prior !== undefined && compareReleaseTriples(admitted.prior, admitted.own) === 0;
|
|
48
56
|
try {
|
|
49
57
|
if (equal)
|
|
50
58
|
proveDurableSync(path);
|
|
51
59
|
else
|
|
52
|
-
atomicWriteFileSync(path, `${JSON.stringify({ highWater: releaseText(own) })}\n`, { durability: "required" });
|
|
60
|
+
atomicWriteFileSync(path, `${JSON.stringify({ highWater: releaseText(admitted.own) })}\n`, { durability: "required" });
|
|
53
61
|
}
|
|
54
62
|
catch (e) {
|
|
55
63
|
throw new Error(`DB_BACKEND=local cannot record the engine high-water ${path} durably: ${e instanceof Error ? e.message : String(e)} — refusing to open the data root: ` +
|