@sema-agent/server 7.147.0 → 7.148.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MIGRATION.md +1039 -24
- package/README.md +20 -7
- package/README.zh-CN.md +14 -8
- package/USAGE.md +380 -163
- package/deploy/sema-up/README.md +16 -5
- package/deploy/sema-up/chart/templates/NOTES.txt +1 -1
- package/deploy/sema-up/chart/templates/_helpers.tpl +20 -4
- package/deploy/sema-up/chart/values.yaml +3 -2
- package/deploy/sema-up/cluster-up.sh +74 -176
- package/deploy/sema-up/kube-up.sh +29 -49
- package/deploy/sema-up/lib/chart-run.sh +23 -0
- package/deploy/sema-up/lib/dataroot.sh +3 -3
- package/deploy/sema-up/lib/health.sh +62 -13
- package/deploy/sema-up/lib/helm-values-cluster.py +18 -0
- package/deploy/sema-up/lib/helm-values-kube.py +35 -0
- package/deploy/sema-up/lib/regcred.py +8 -0
- package/deploy/sema-up/lib/remote/helm-install.sh +3 -0
- package/deploy/sema-up/lib/remote/image-import.sh +6 -0
- package/deploy/sema-up/lib/remote/machine-precheck.sh +11 -0
- package/deploy/sema-up/lib/remote/region-probe.sh +3 -0
- package/deploy/sema-up/lib/remote/stack-ready.sh +26 -0
- package/deploy/sema-up/lib/remote/vxlan-guard.sh +8 -0
- package/deploy/sema-up/lib/render-stack.py +17 -0
- package/deploy/sema-up/lib/shell-text.sh +87 -0
- package/deploy/sema-up/lib/usage-flags.txt +10 -0
- package/deploy/sema-up/lib/usage-head.txt +1 -0
- package/deploy/sema-up/lib/usage-tail.txt +13 -0
- package/deploy/sema-up/preflight.sh +10 -8
- package/deploy/sema-up/sema-up.sh +14 -39
- package/deploy/sema-up/smoke.sh +7 -6
- package/deploy/sema-up/stack/compose.dataroot.yaml +3 -0
- package/deploy/sema-up/stack/compose.yaml +13 -1
- package/deploy/sema-up/stack/sema-stack-cluster.yaml +21 -0
- package/dist/adoption/plan.d.ts +24 -0
- package/dist/adoption/plan.js +53 -1
- package/dist/adoption/runner.d.ts +10 -1
- package/dist/adoption/runner.js +36 -16
- package/dist/adoption/wire.d.ts +3 -3
- package/dist/approval-card.d.ts +28 -30
- package/dist/approval-gate-currency.js +3 -2
- package/dist/approval-reconciler.d.ts +4 -13
- package/dist/approval-reconciler.js +2 -2
- package/dist/approval.d.ts +13 -11
- package/dist/approval.js +3 -3
- package/dist/audit.d.ts +10 -3
- package/dist/audit.js +15 -7
- package/dist/auth-bridge.d.ts +0 -14
- package/dist/auth-bridge.js +0 -7
- package/dist/auto-mode-face.d.ts +10 -7
- package/dist/auto-mode-face.js +7 -4
- package/dist/background-agent-name.d.ts +19 -1
- package/dist/background-agent-name.js +12 -2
- package/dist/background-session-reap.d.ts +1 -1
- package/dist/bake-runner/main.js +9 -6
- package/dist/bench/s1/arms.js +6 -5
- package/dist/bench/s1/live-deps.js +5 -2
- package/dist/bench/s1/run-firm.js +6 -5
- package/dist/bind-host.d.ts +25 -0
- package/dist/bind-host.js +25 -0
- package/dist/boot/adoption.d.ts +3 -0
- package/dist/boot/adoption.js +1 -0
- package/dist/boot/deployment-mods.d.ts +1 -1
- package/dist/boot/execution-env.d.ts +17 -7
- package/dist/boot/execution-env.js +37 -31
- package/dist/boot/exit-boundary.d.ts +2 -2
- package/dist/boot/exit-boundary.js +6 -5
- package/dist/boot/fatal-exit.d.ts +3 -5
- package/dist/boot/fatal-exit.js +2 -2
- package/dist/boot/leader.d.ts +15 -0
- package/dist/boot/leader.js +17 -15
- package/dist/boot/memory-consolidation.d.ts +37 -29
- package/dist/boot/memory-consolidation.js +11 -5
- package/dist/boot/org-memory.js +1 -1
- package/dist/boot/parked-revive-gate.js +2 -2
- package/dist/boot/reapers.d.ts +4 -3
- package/dist/boot/reapers.js +19 -16
- package/dist/boot/resolve-spec.d.ts +5 -3
- package/dist/boot/resolve-spec.js +55 -67
- package/dist/boot/retention-lane.d.ts +4 -4
- package/dist/boot/retention-lane.js +2 -2
- package/dist/boot/runner-deps.d.ts +28 -7
- package/dist/boot/runner-deps.js +11 -4
- package/dist/boot/runtime-caps.d.ts +2 -2
- package/dist/boot/runtime-caps.js +16 -2
- package/dist/boot/session-faces.d.ts +16 -7
- package/dist/boot/session-faces.js +114 -94
- package/dist/boot/shutdown.d.ts +5 -4
- package/dist/boot/shutdown.js +6 -4
- package/dist/boot/stage-01-config.js +9 -1
- package/dist/boot/stage-02-web-admin-pull.d.ts +1 -0
- package/dist/boot/stage-02-web-admin-pull.js +6 -1
- package/dist/boot/stage-03-store-backend.d.ts +3 -0
- package/dist/boot/stage-03-store-backend.js +4 -3
- package/dist/boot/stage-04-stores.d.ts +2 -0
- package/dist/boot/stage-04-stores.js +2 -2
- package/dist/boot/stage-05-execution-env.d.ts +7 -3
- package/dist/boot/stage-05-execution-env.js +2 -2
- package/dist/boot/stage-06-runners.d.ts +10 -12
- package/dist/boot/stage-06-runners.js +23 -15
- package/dist/boot/stage-07-capability-layer.d.ts +11 -8
- package/dist/boot/stage-07-capability-layer.js +5 -3
- package/dist/boot/stage-08-reapers.d.ts +11 -8
- package/dist/boot/stage-08-reapers.js +3 -3
- package/dist/boot/stage-09-leader.d.ts +12 -15
- package/dist/boot/stage-09-leader.js +12 -4
- package/dist/boot/stage-10-http-server.d.ts +12 -15
- package/dist/boot/stage-10-http-server.js +7 -4
- package/dist/boot/store-evidence.d.ts +20 -0
- package/dist/boot/store-evidence.js +13 -0
- package/dist/boot/stores.d.ts +3 -0
- package/dist/boot/stores.js +21 -10
- package/dist/boot/task-list-lane.d.ts +4 -4
- package/dist/boot/web-admin.d.ts +4 -2
- package/dist/boot/web-admin.js +55 -35
- package/dist/boot/webfetch-summarize-lane.d.ts +1 -1
- package/dist/boot-reclaim.d.ts +3 -1
- package/dist/boot-reclaim.js +1 -1
- package/dist/brain.d.ts +7 -18
- package/dist/brain.js +5 -17
- package/dist/budget.js +6 -6
- package/dist/capabilities/center-plugins.d.ts +7 -1
- package/dist/capabilities/center-plugins.js +32 -10
- package/dist/capabilities/center-wiring.js +1 -1
- package/dist/capabilities/composite-members.d.ts +2 -2
- package/dist/capabilities/composite-members.js +2 -2
- package/dist/capabilities/repo-tools.d.ts +2 -0
- package/dist/capabilities/repo-tools.js +14 -12
- package/dist/capabilities/scenarios.d.ts +6 -15
- package/dist/capabilities/scenarios.js +11 -16
- package/dist/capabilities/skills.d.ts +1 -1
- package/dist/capabilities/tool-defer.d.ts +1 -1
- package/dist/capability-facts.d.ts +38 -11
- package/dist/capability-facts.js +47 -8
- package/dist/card-void.d.ts +4 -4
- package/dist/card-void.js +1 -1
- package/dist/center-credential-renewer.d.ts +6 -2
- package/dist/center-credential-renewer.js +7 -3
- package/dist/config-catalog.d.ts +16 -1
- package/dist/config-catalog.js +62 -56
- package/dist/config-dir-trust.d.ts +37 -4
- package/dist/config-dir-trust.js +88 -44
- package/dist/config-invariants.d.ts +42 -3
- package/dist/config-invariants.js +69 -5
- package/dist/config-lkg.d.ts +23 -1
- package/dist/config-lkg.js +17 -3
- package/dist/config-provider.d.ts +9 -9
- package/dist/config-provider.js +25 -110
- package/dist/config-pull-failure.d.ts +50 -0
- package/dist/config-pull-failure.js +48 -0
- package/dist/config-types.d.ts +26 -17
- package/dist/config.d.ts +8 -16
- package/dist/config.js +113 -47
- package/dist/delegated-session-owner.d.ts +1 -1
- package/dist/deleted-session-ids.d.ts +3 -2
- package/dist/deployment-governance.d.ts +3 -3
- package/dist/deployment-shape.d.ts +30 -4
- package/dist/deployment-shape.js +7 -0
- package/dist/egress-redirect.d.ts +25 -7
- package/dist/egress-redirect.js +20 -2
- package/dist/elicitation.d.ts +6 -5
- package/dist/elicitation.js +23 -22
- package/dist/engine-identity.d.ts +28 -0
- package/dist/engine-identity.js +10 -0
- package/dist/entry-problems.d.ts +5 -7
- package/dist/entry-problems.js +1 -1
- package/dist/env-facts.js +2 -1
- package/dist/env-witness.d.ts +7 -0
- package/dist/env-witness.js +16 -0
- package/dist/execution-lane-caps.d.ts +5 -18
- package/dist/execution-lane-caps.js +0 -22
- package/dist/execution-placement.d.ts +58 -18
- package/dist/execution-placement.js +41 -2
- package/dist/field-conflict.d.ts +7 -11
- package/dist/field-conflict.js +3 -3
- package/dist/file-history-capture.d.ts +3 -3
- package/dist/file-history-disclosure.js +1 -0
- package/dist/fleet/fleet-bus.d.ts +21 -3
- package/dist/fleet/fleet-bus.js +35 -25
- package/dist/fleet/fleet-reconciler.js +2 -2
- package/dist/fleet/serving-lease.js +3 -3
- package/dist/fleet-client.js +3 -3
- package/dist/fleet-lease.d.ts +0 -1
- package/dist/fleet-lease.js +4 -5
- package/dist/history-anchor.d.ts +23 -3
- package/dist/history-anchor.js +24 -4
- package/dist/hitl-delivery.d.ts +90 -0
- package/dist/hitl-delivery.js +98 -0
- package/dist/hooks/classic-stations.d.ts +8 -11
- package/dist/hooks/classic-stations.js +0 -7
- package/dist/hooks/hook-llm.d.ts +5 -1
- package/dist/hooks/hook-llm.js +24 -15
- package/dist/hooks/hook-runner.d.ts +67 -57
- package/dist/hooks/hook-runner.js +260 -186
- package/dist/host-lsp-manager.d.ts +22 -8
- package/dist/host-lsp-manager.js +4 -1
- package/dist/http/active-run-conflict.d.ts +2 -43
- package/dist/http/active-run-conflict.js +3 -7
- package/dist/http/admission.d.ts +4 -18
- package/dist/http/admission.js +75 -78
- package/dist/http/approval-sweeps.d.ts +3 -3
- package/dist/http/approval-sweeps.js +54 -30
- package/dist/http/caller-trust.d.ts +8 -10
- package/dist/http/caller-trust.js +1 -2
- package/dist/http/claim-heartbeat.d.ts +49 -0
- package/dist/http/claim-heartbeat.js +46 -0
- package/dist/http/claimed-run.d.ts +4 -3
- package/dist/http/dispatch.d.ts +8 -1
- package/dist/http/dispatch.js +76 -30
- package/dist/http/durable-run-leg.d.ts +3 -3
- package/dist/http/durable-run-leg.js +17 -12
- package/dist/http/execution-context.d.ts +17 -43
- package/dist/http/execution-context.js +7 -5
- package/dist/http/health-reader.d.ts +36 -0
- package/dist/http/health-reader.js +21 -0
- package/dist/http/health-self-report.d.ts +9 -9
- package/dist/http/health-self-report.js +4 -4
- package/dist/http/idempotency.d.ts +9 -5
- package/dist/http/idempotency.js +4 -4
- package/dist/http/memory-compliance-failure-reply.d.ts +15 -16
- package/dist/http/memory-compliance-failure-reply.js +4 -2
- package/dist/http/memory-face-fault-reply.d.ts +67 -0
- package/dist/http/memory-face-fault-reply.js +71 -0
- package/dist/http/memory-store-refusal-reply.d.ts +1 -1
- package/dist/http/memory-store-refusal-reply.js +3 -0
- package/dist/http/owner-access.d.ts +391 -67
- package/dist/http/owner-access.js +371 -35
- package/dist/http/principal-gate.d.ts +24 -81
- package/dist/http/principal-gate.js +24 -68
- package/dist/http/refusal-body.d.ts +35 -2
- package/dist/http/refusal-body.js +34 -0
- package/dist/http/request-guards.d.ts +9 -13
- package/dist/http/request-guards.js +34 -68
- package/dist/http/resume-composition.d.ts +37 -0
- package/dist/http/resume-composition.js +18 -0
- package/dist/http/resume-ctx-read.d.ts +35 -12
- package/dist/http/resume-ctx-read.js +25 -6
- package/dist/http/resume-legs.d.ts +21 -18
- package/dist/http/resume-legs.js +189 -129
- package/dist/http/retired-skill-manifest.d.ts +1 -1
- package/dist/http/route-ctx.d.ts +25 -32
- package/dist/http/routes/a2a-serve.d.ts +43 -5
- package/dist/http/routes/a2a-serve.js +58 -37
- package/dist/http/routes/admin-config-refresh.js +2 -2
- package/dist/http/routes/admin-drain.js +2 -2
- package/dist/http/routes/admin-memory-optout.js +4 -3
- package/dist/http/routes/adoption.d.ts +3 -0
- package/dist/http/routes/adoption.js +17 -10
- package/dist/http/routes/agents-roster.js +13 -7
- package/dist/http/routes/approvals-assistant.js +70 -65
- package/dist/http/routes/attachments.js +2 -2
- package/dist/http/routes/background.d.ts +3 -3
- package/dist/http/routes/background.js +9 -17
- package/dist/http/routes/capabilities.js +15 -18
- package/dist/http/routes/config-catalog.js +2 -2
- package/dist/http/routes/devices.d.ts +3 -3
- package/dist/http/routes/devices.js +4 -4
- package/dist/http/routes/diagnostics.d.ts +27 -3
- package/dist/http/routes/diagnostics.js +27 -21
- package/dist/http/routes/engine.js +2 -2
- package/dist/http/routes/fleet.js +5 -3
- package/dist/http/routes/images.js +10 -6
- package/dist/http/routes/leader.d.ts +7 -2
- package/dist/http/routes/leader.js +12 -3
- package/dist/http/routes/mcp-reconnect.d.ts +1 -1
- package/dist/http/routes/mcp-reconnect.js +7 -15
- package/dist/http/routes/memory-bundle.js +4 -7
- package/dist/http/routes/memory-compliance.js +4 -4
- package/dist/http/routes/memory-consolidation.js +6 -9
- package/dist/http/routes/memory-origin.d.ts +2 -0
- package/dist/http/routes/memory-origin.js +7 -8
- package/dist/http/routes/memory-policy.js +17 -12
- package/dist/http/routes/notify-wake.js +10 -19
- package/dist/http/routes/observability.js +3 -3
- package/dist/http/routes/principal-inbox.d.ts +1 -1
- package/dist/http/routes/principal-inbox.js +2 -2
- package/dist/http/routes/projects.d.ts +1 -1
- package/dist/http/routes/projects.js +3 -2
- package/dist/http/routes/retention-ops.js +6 -9
- package/dist/http/routes/rules.js +20 -5
- package/dist/http/routes/run-memory-capture.d.ts +2 -2
- package/dist/http/routes/run-memory-capture.js +6 -12
- package/dist/http/routes/run-permission-mode.d.ts +2 -2
- package/dist/http/routes/run-permission-mode.js +10 -17
- package/dist/http/routes/runs.js +146 -231
- package/dist/http/routes/session-memory-sync.d.ts +2 -2
- package/dist/http/routes/session-memory-sync.js +7 -13
- package/dist/http/routes/session-sync.d.ts +4 -2
- package/dist/http/routes/session-sync.js +21 -20
- package/dist/http/routes/sessions-list.d.ts +3 -3
- package/dist/http/routes/sessions-list.js +9 -9
- package/dist/http/routes/sessions.js +87 -124
- package/dist/http/routes/shared-memory.js +6 -6
- package/dist/http/routes/side-query.js +2 -2
- package/dist/http/routes/tasks.js +136 -120
- package/dist/http/routes/trace-usage.d.ts +0 -12
- package/dist/http/routes/trace-usage.js +40 -46
- package/dist/http/routes/workflows.d.ts +39 -4
- package/dist/http/routes/workflows.js +42 -14
- package/dist/http/run-concurrency-cap.d.ts +20 -12
- package/dist/http/run-concurrency-cap.js +39 -26
- package/dist/http/run-read-face.d.ts +3 -5
- package/dist/http/run-read-face.js +8 -13
- package/dist/http/send.d.ts +12 -3
- package/dist/http/send.js +42 -6
- package/dist/http/server.d.ts +39 -40
- package/dist/http/server.js +36 -11
- package/dist/http/sse-log.d.ts +17 -10
- package/dist/http/sse-log.js +7 -7
- package/dist/http/stored-body-replay.d.ts +12 -0
- package/dist/http/stored-body-replay.js +2 -2
- package/dist/http/submit-ctx.d.ts +16 -8
- package/dist/http/submit-ctx.js +6 -2
- package/dist/http/submit-replay.d.ts +19 -6
- package/dist/http/submit-replay.js +18 -6
- package/dist/http/sync-submit-body.d.ts +3 -4
- package/dist/http/sync-submit-body.js +4 -5
- package/dist/http/wire-types.d.ts +4 -3
- package/dist/identity-source.d.ts +36 -5
- package/dist/identity-source.js +27 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/key-resolver.d.ts +32 -0
- package/dist/key-resolver.js +23 -9
- package/dist/leader/diffup.js +2 -1
- package/dist/leader/endpoint.d.ts +26 -5
- package/dist/leader/endpoint.js +154 -14
- package/dist/leader/fanout.d.ts +3 -0
- package/dist/leader/fanout.js +78 -63
- package/dist/leader/leader.d.ts +16 -0
- package/dist/leader/leader.js +43 -3
- package/dist/leader/merge.d.ts +9 -1
- package/dist/leader/merge.js +16 -1
- package/dist/leader/repair-wire.js +1 -1
- package/dist/leader/wire.d.ts +36 -3
- package/dist/leader/wire.js +59 -18
- package/dist/lsp-evict.d.ts +6 -4
- package/dist/lsp-evict.js +2 -3
- package/dist/memory-operator-faces.d.ts +5 -4
- package/dist/memory-operator-faces.js +1 -1
- package/dist/memory-scope.d.ts +29 -2
- package/dist/memory-scope.js +64 -15
- package/dist/memory-store-refusal.d.ts +5 -2
- package/dist/memory-sync-client.d.ts +3 -2
- package/dist/memory-sync-client.js +6 -3
- package/dist/model-compat.d.ts +17 -8
- package/dist/model-compat.js +6 -2
- package/dist/model-context-window.d.ts +18 -0
- package/dist/model-context-window.js +2 -0
- package/dist/model-entry-headers.d.ts +46 -4
- package/dist/model-entry-headers.js +2 -2
- package/dist/model-entry-refusal.d.ts +35 -16
- package/dist/model-entry-refusal.js +40 -27
- package/dist/model-plane-face.d.ts +19 -11
- package/dist/model-plane-face.js +9 -1
- package/dist/model-plane-probe.d.ts +2 -0
- package/dist/model-plane-probe.js +17 -0
- package/dist/model-provider.d.ts +3 -3
- package/dist/model-route-endpoint.d.ts +9 -5
- package/dist/model-route-endpoint.js +29 -7
- package/dist/model-select.d.ts +16 -0
- package/dist/model-select.js +4 -0
- package/dist/mountinfo.d.ts +37 -0
- package/dist/mountinfo.js +47 -0
- package/dist/namespaced-rule-name.d.ts +23 -14
- package/dist/namespaced-rule-name.js +8 -11
- package/dist/net-address.d.ts +1 -1
- package/dist/observability/corrupt-read-seat.d.ts +4 -4
- package/dist/observability/corrupt-read-seat.js +5 -3
- package/dist/observability/fail-open.d.ts +58 -38
- package/dist/observability/fail-open.js +60 -38
- package/dist/observability/logger.d.ts +22 -1
- package/dist/observability/logger.js +89 -12
- package/dist/observability/metrics.js +3 -4
- package/dist/observability/otel-exporter.js +2 -1
- package/dist/observability/principal-context.d.ts +14 -7
- package/dist/observability/principal-context.js +8 -3
- package/dist/observability/run-terminal.d.ts +7 -1
- package/dist/observability/run-terminal.js +5 -2
- package/dist/orchestration/hardened-vm-runner.d.ts +1 -0
- package/dist/orchestration/hardened-vm-runner.js +11 -5
- package/dist/orchestration/hardened-vm-worker-runner.d.ts +0 -14
- package/dist/orchestration/hardened-vm-worker-runner.js +5 -0
- package/dist/orchestration/hardened-vm-worker.js +2 -1
- package/dist/orchestration/workflow-completion-inbox.d.ts +3 -3
- package/dist/orchestration/workflow-completion-inbox.js +3 -2
- package/dist/org-delivery-gate.d.ts +5 -4
- package/dist/org-delivery-gate.js +7 -6
- package/dist/outbound-dispatcher.d.ts +1 -1
- package/dist/outbound-dispatcher.js +6 -12
- package/dist/owner-brands.d.ts +81 -0
- package/dist/owner-brands.js +42 -0
- package/dist/owner-faces.d.ts +531 -0
- package/dist/owner-faces.js +126 -0
- package/dist/parked-decide.d.ts +67 -5
- package/dist/parked-decide.js +127 -5
- package/dist/parked-revive-surface.d.ts +14 -4
- package/dist/parked-revive-surface.js +5 -4
- package/dist/peer-directory.d.ts +6 -8
- package/dist/peer-directory.js +3 -2
- package/dist/permission-rule-vocab.d.ts +53 -8
- package/dist/permission-rule-vocab.js +30 -2
- package/dist/plugins/adoption-log-sql.d.ts +0 -22
- package/dist/plugins/adoption-log-sql.js +5 -3
- package/dist/plugins/approval-ask-retired-delete-by-task-m50.d.ts +7 -0
- package/dist/plugins/approval-ask-retired-delete-by-task-m50.js +17 -0
- package/dist/plugins/approval-ask-store-file.d.ts +18 -7
- package/dist/plugins/approval-ask-store-file.js +37 -14
- package/dist/plugins/approval-ask-store-memory.d.ts +12 -4
- package/dist/plugins/approval-ask-store-memory.js +24 -10
- package/dist/plugins/approval-ask-store-sql.d.ts +39 -20
- package/dist/plugins/approval-ask-store-sql.js +41 -10
- package/dist/plugins/approval-exemption-skill-m46.d.ts +20 -0
- package/dist/plugins/approval-exemption-skill-m46.js +25 -0
- package/dist/plugins/approval-exemption-store.d.ts +6 -1
- package/dist/plugins/approval-exemption-store.js +14 -0
- package/dist/plugins/approval-nonce-store.d.ts +39 -12
- package/dist/plugins/approval-nonce-store.js +72 -23
- package/dist/plugins/blob-backend.d.ts +2 -0
- package/dist/plugins/blob-backend.js +9 -6
- package/dist/plugins/caching-session-store.d.ts +13 -1
- package/dist/plugins/caching-session-store.js +43 -4
- package/dist/plugins/checkpoint-index-columns.d.ts +32 -5
- package/dist/plugins/checkpoint-index-columns.js +36 -1
- package/dist/plugins/checkpoint-store-face.d.ts +83 -10
- package/dist/plugins/checkpoint-store-face.js +18 -1
- package/dist/plugins/device-store-sql.js +1 -0
- package/dist/plugins/ensure-index.d.ts +13 -1
- package/dist/plugins/ensure-index.js +154 -21
- package/dist/plugins/ensure-schema-lock-policy.d.ts +0 -15
- package/dist/plugins/ensure-schema-lock-policy.js +3 -2
- package/dist/plugins/file-run-store.d.ts +63 -23
- package/dist/plugins/file-run-store.js +138 -83
- package/dist/plugins/host-platform.d.ts +24 -3
- package/dist/plugins/host-platform.js +15 -1
- package/dist/plugins/image-bake-store-sql.js +2 -0
- package/dist/plugins/imported-layer-root-retirement.d.ts +2 -2
- package/dist/plugins/k8s-pod-reaper.d.ts +1 -3
- package/dist/plugins/k8s-pod-reaper.js +0 -1
- package/dist/plugins/leader-run-store-sql.d.ts +22 -0
- package/dist/plugins/leader-run-store-sql.js +34 -4
- package/dist/plugins/local-checkpoint-store.d.ts +58 -23
- package/dist/plugins/local-checkpoint-store.js +195 -76
- package/dist/plugins/local-data-dir-modes-m39.js +2 -1
- package/dist/plugins/local-docker-capacity.d.ts +93 -0
- package/dist/plugins/local-docker-capacity.js +194 -0
- package/dist/plugins/local-docker-reaper.d.ts +92 -0
- package/dist/plugins/local-docker-reaper.js +102 -0
- package/dist/plugins/local-engine-high-water.d.ts +4 -2
- package/dist/plugins/local-engine-high-water.js +4 -1
- package/dist/plugins/local-session-store.d.ts +358 -125
- package/dist/plugins/local-session-store.js +824 -251
- package/dist/plugins/local-session-window.d.ts +3 -2
- package/dist/plugins/local-session-window.js +3 -2
- package/dist/plugins/local-sidecar-quarantine.js +3 -2
- package/dist/plugins/local-task-attachment-store.d.ts +18 -1
- package/dist/plugins/local-task-attachment-store.js +22 -1
- package/dist/plugins/memory-embedder.js +9 -7
- package/dist/plugins/memory-engine-pg.d.ts +3 -2
- package/dist/plugins/memory-engine-pg.js +14 -5
- package/dist/plugins/memory-engine-sql-apply.d.ts +8 -4
- package/dist/plugins/memory-engine-sql-apply.js +6 -8
- package/dist/plugins/memory-engine-tidb.d.ts +4 -2
- package/dist/plugins/memory-engine-tidb.js +11 -2
- package/dist/plugins/memory-optout-grant-store-sql.d.ts +1 -1
- package/dist/plugins/memory-optout-grant-store-sql.js +3 -3
- package/dist/plugins/memory-run-store.d.ts +39 -27
- package/dist/plugins/memory-run-store.js +72 -70
- package/dist/plugins/one-time-migration-marker.d.ts +10 -0
- package/dist/plugins/one-time-migration-marker.js +7 -0
- package/dist/plugins/one-time-migrations.d.ts +186 -45
- package/dist/plugins/one-time-migrations.js +442 -119
- package/dist/plugins/org-delivery-quota-store.js +2 -1
- package/dist/plugins/permission-rule-store-file.d.ts +3 -3
- package/dist/plugins/permission-rule-store-sql.d.ts +4 -63
- package/dist/plugins/permission-rule-store-sql.js +6 -86
- package/dist/plugins/pg-pool.d.ts +1 -31
- package/dist/plugins/pg-pool.js +16 -7
- package/dist/plugins/remote-env-e2b.d.ts +7 -25
- package/dist/plugins/remote-env-e2b.js +34 -25
- package/dist/plugins/remote-env-host.d.ts +2 -9
- package/dist/plugins/remote-env-host.js +34 -22
- package/dist/plugins/remote-env-k8s.d.ts +40 -45
- package/dist/plugins/remote-env-k8s.js +107 -58
- package/dist/plugins/remote-env-local-docker.d.ts +148 -14
- package/dist/plugins/remote-env-local-docker.js +367 -72
- package/dist/plugins/remote-scratchpad.js +4 -0
- package/dist/plugins/retention-deployment.d.ts +49 -17
- package/dist/plugins/retention-deployment.js +39 -8
- package/dist/plugins/run-preview-m45.d.ts +11 -0
- package/dist/plugins/run-preview-m45.js +19 -0
- package/dist/plugins/run-store-sql.d.ts +56 -68
- package/dist/plugins/run-store-sql.js +127 -116
- package/dist/plugins/s3-answer.d.ts +2 -1
- package/dist/plugins/sandbox-reaper.d.ts +26 -0
- package/dist/plugins/sandbox-reaper.js +2 -0
- package/dist/plugins/scenario-prefix-switch-m42.d.ts +54 -0
- package/dist/plugins/scenario-prefix-switch-m42.js +55 -0
- package/dist/plugins/scheduler-support.d.ts +16 -1
- package/dist/plugins/scheduler-support.js +22 -2
- package/dist/plugins/schema-consistency.d.ts +42 -9
- package/dist/plugins/schema-consistency.js +212 -11
- package/dist/plugins/schema-drift-sentence.d.ts +4 -1
- package/dist/plugins/schema-drift-sentence.js +4 -4
- package/dist/plugins/schema-ensure-legs.d.ts +9 -0
- package/dist/plugins/schema-ensure-legs.js +1 -1
- package/dist/plugins/schema-indexes.js +3 -0
- package/dist/plugins/schema-live-columns.d.ts +14 -5
- package/dist/plugins/schema-live-columns.js +10 -10
- package/dist/plugins/send-user-file.js +2 -1
- package/dist/plugins/session-birth.d.ts +37 -0
- package/dist/plugins/session-birth.js +38 -0
- package/dist/plugins/session-epoch-anchor.d.ts +40 -12
- package/dist/plugins/session-epoch-anchor.js +33 -11
- package/dist/plugins/session-ext-table.d.ts +27 -3
- package/dist/plugins/session-ext-table.js +19 -6
- package/dist/plugins/session-fork.d.ts +15 -1
- package/dist/plugins/session-fork.js +3 -0
- package/dist/plugins/session-ownership.d.ts +1 -1
- package/dist/plugins/session-placement.d.ts +22 -16
- package/dist/plugins/session-placement.js +15 -12
- package/dist/plugins/session-row-sql.d.ts +12 -0
- package/dist/plugins/session-row-sql.js +3 -3
- package/dist/plugins/session-run-rollup.d.ts +29 -0
- package/dist/plugins/session-run-rollup.js +40 -0
- package/dist/plugins/session-store-sql.d.ts +38 -12
- package/dist/plugins/session-store-sql.js +130 -30
- package/dist/plugins/session-withdraw-sql.d.ts +36 -0
- package/dist/plugins/session-withdraw-sql.js +42 -0
- package/dist/plugins/shared-memory-store-sql.d.ts +0 -69
- package/dist/plugins/shared-memory-store-sql.js +2 -1
- package/dist/plugins/shell-sentinel-owner-m48.d.ts +20 -0
- package/dist/plugins/shell-sentinel-owner-m48.js +3 -0
- package/dist/plugins/snapshot-bucket-presence.d.ts +2 -1
- package/dist/plugins/sql-driver.d.ts +1 -1
- package/dist/plugins/sql-driver.js +2 -1
- package/dist/plugins/sql-errors.d.ts +32 -5
- package/dist/plugins/sql-errors.js +55 -7
- package/dist/plugins/sql-json-column.d.ts +8 -7
- package/dist/plugins/sql-json-column.js +10 -6
- package/dist/plugins/store-backend.d.ts +84 -15
- package/dist/plugins/store-backend.js +186 -55
- package/dist/plugins/store-contracts.d.ts +90 -30
- package/dist/plugins/store-contracts.js +22 -1
- package/dist/plugins/store-fault.d.ts +28 -2
- package/dist/plugins/store-fault.js +20 -2
- package/dist/plugins/task-attachment-store.d.ts +15 -3
- package/dist/plugins/task-attachment-store.js +22 -9
- package/dist/plugins/tidb-pool.js +23 -8
- package/dist/plugins/web-search.js +5 -3
- package/dist/plugins/workflow-run-store-sql.d.ts +6 -1
- package/dist/plugins/workflow-run-store-sql.js +11 -5
- package/dist/principal-jwt.d.ts +4 -4
- package/dist/principal-jwt.js +20 -5
- package/dist/principal-shape.d.ts +41 -0
- package/dist/principal-shape.js +19 -0
- package/dist/question.d.ts +13 -23
- package/dist/question.js +21 -39
- package/dist/request-declaration-refusal.d.ts +35 -12
- package/dist/request-declaration-refusal.js +21 -9
- package/dist/request-form.d.ts +58 -0
- package/dist/request-form.js +72 -0
- package/dist/request-image-urls.d.ts +8 -2
- package/dist/request-image-urls.js +2 -1
- package/dist/request-images.d.ts +20 -0
- package/dist/request-images.js +59 -0
- package/dist/request-key-closure.d.ts +6 -7
- package/dist/request-key-closure.js +15 -2
- package/dist/resource-suspend.d.ts +7 -16
- package/dist/resource-suspend.js +1 -1
- package/dist/retired-name-host-notice.d.ts +21 -0
- package/dist/retired-name-host-notice.js +12 -0
- package/dist/rule-entry-list.d.ts +2 -2
- package/dist/rule-entry-list.js +3 -4
- package/dist/rule-issue-reading.d.ts +58 -0
- package/dist/rule-issue-reading.js +14 -0
- package/dist/rules-consent.d.ts +5 -3
- package/dist/rules-consent.js +1 -0
- package/dist/run-acceptance.d.ts +3 -1
- package/dist/run-acceptance.js +3 -0
- package/dist/run-local.d.ts +14 -6
- package/dist/run-local.js +92 -80
- package/dist/run-stale-default.d.ts +7 -0
- package/dist/run-stale-default.js +2 -0
- package/dist/runs.d.ts +26 -15
- package/dist/runs.js +39 -27
- package/dist/runtime-caps-resolver.d.ts +21 -6
- package/dist/runtime-caps-resolver.js +17 -4
- package/dist/runtime-governance.d.ts +2 -2
- package/dist/runtime-governance.js +5 -3
- package/dist/sealed-key-layout.d.ts +12 -5
- package/dist/sealed-key-layout.js +5 -0
- package/dist/sealed-key.d.ts +12 -2
- package/dist/sealed-key.js +115 -27
- package/dist/security.d.ts +128 -158
- package/dist/security.js +163 -59
- package/dist/sema-config-dir.d.ts +20 -0
- package/dist/sema-config-dir.js +25 -0
- package/dist/server-secret-env.d.ts +21 -5
- package/dist/server-secret-env.js +14 -4
- package/dist/session-children-retire.d.ts +7 -5
- package/dist/session-children-retire.js +7 -2
- package/dist/session-deletion.d.ts +88 -0
- package/dist/session-deletion.js +8 -0
- package/dist/session-erase.d.ts +145 -0
- package/dist/session-erase.js +115 -0
- package/dist/session-error-wire.d.ts +5 -5
- package/dist/session-error-wire.js +1 -1
- package/dist/session-incarnation.d.ts +52 -5
- package/dist/session-incarnation.js +19 -2
- package/dist/session-policy-wire.d.ts +6 -3
- package/dist/session-policy-wire.js +11 -1
- package/dist/session-resident-background.d.ts +0 -71
- package/dist/session-resident-background.js +4 -3
- package/dist/session-row.d.ts +2 -1
- package/dist/session-rules-seat.d.ts +12 -0
- package/dist/session-rules-seat.js +19 -0
- package/dist/session-titler.d.ts +7 -15
- package/dist/session-titler.js +1 -1
- package/dist/spec-fields.d.ts +57 -3
- package/dist/spec-fields.js +72 -51
- package/dist/store-posture.d.ts +136 -20
- package/dist/store-posture.js +188 -3
- package/dist/stored-request-hooks-m20.js +2 -2
- package/dist/stores-sql/background-agent-store-sql.d.ts +11 -2
- package/dist/stores-sql/background-agent-store-sql.js +73 -20
- package/dist/stores-sql/checkpoint-store-sql.d.ts +33 -28
- package/dist/stores-sql/checkpoint-store-sql.js +75 -44
- package/dist/stores-sql/mailbox-store-sql.d.ts +7 -4
- package/dist/stores-sql/mailbox-store-sql.js +31 -32
- package/dist/stores-sql/pg-session-storage.d.ts +7 -5
- package/dist/stores-sql/pg-session-storage.js +54 -46
- package/dist/stores-sql/retention-store-sql.d.ts +87 -19
- package/dist/stores-sql/retention-store-sql.js +92 -27
- package/dist/stores-sql/session-policy-store-sql.d.ts +32 -10
- package/dist/stores-sql/session-policy-store-sql.js +44 -36
- package/dist/stores-sql/session-write-hooks.d.ts +12 -6
- package/dist/stores-sql/tidb-session-storage.d.ts +4 -4
- package/dist/stores-sql/tidb-session-storage.js +13 -8
- package/dist/stores-sql/tidb-session-store.d.ts +36 -17
- package/dist/stores-sql/tidb-session-store.js +69 -39
- package/dist/stores-sql/windowed-session-storage.d.ts +5 -0
- package/dist/stores-sql/windowed-session-storage.js +9 -0
- package/dist/submission-exit.d.ts +50 -0
- package/dist/submission-exit.js +108 -0
- package/dist/task-a2a.d.ts +1 -1
- package/dist/task-a2a.js +3 -3
- package/dist/task-cwd.d.ts +20 -0
- package/dist/task-cwd.js +8 -0
- package/dist/task-mcp.d.ts +1 -1
- package/dist/task-mcp.js +3 -3
- package/dist/task-settings.d.ts +14 -10
- package/dist/task-settings.js +18 -7
- package/dist/terminal.d.ts +25 -43
- package/dist/terminal.js +31 -11
- package/dist/tool-approval.d.ts +131 -129
- package/dist/tool-approval.js +189 -193
- package/dist/trace/core-keyset-guard.d.ts +13 -6
- package/dist/trace/core-vocab-wire.d.ts +95 -0
- package/dist/trace/core-vocab-wire.js +15 -0
- package/dist/trace/exit-seat.d.ts +30 -4
- package/dist/trace/exit-seat.js +40 -36
- package/dist/trace/extension-call-face.d.ts +3 -2
- package/dist/trace/extension-call-face.js +3 -1
- package/dist/trace/ledger-events.d.ts +4 -7
- package/dist/trace/ledger-sink.d.ts +1 -30
- package/dist/trace/ledger-sink.js +0 -11
- package/dist/trace/model-segment.d.ts +5 -5
- package/dist/trace/model-segment.js +5 -5
- package/dist/trace/project.d.ts +55 -42
- package/dist/trace/project.js +52 -19
- package/dist/trace/redact.d.ts +123 -27
- package/dist/trace/redact.js +880 -260
- package/dist/trace/self-minted-wire.d.ts +487 -19
- package/dist/trace/self-minted-wire.js +172 -23
- package/dist/trace/wire-projection-faces.d.ts +5 -6
- package/dist/trace/wire-projection-faces.js +2 -2
- package/dist/upstream-body.d.ts +23 -0
- package/dist/upstream-body.js +16 -0
- package/dist/url-refusal.d.ts +3 -3
- package/dist/url-refusal.js +11 -4
- package/dist/user-authored-text.d.ts +1 -1
- package/dist/user-input-ledger.d.ts +7 -8
- package/dist/user-input-ledger.js +1 -1
- package/dist/web-admin-client/apply-effective.d.ts +6 -3
- package/dist/web-admin-client/apply-effective.js +13 -16
- package/dist/web-admin-client/apply-ledger.d.ts +16 -7
- package/dist/web-admin-client/apply-ledger.js +5 -2
- package/dist/web-admin-client/center-request.d.ts +2 -2
- package/dist/web-admin-client/center-request.js +15 -15
- package/dist/web-admin-client/effective-keys.d.ts +1 -1
- package/dist/web-admin-client/effective-keys.js +1 -1
- package/dist/web-admin-client/entry-metadata.d.ts +8 -0
- package/dist/web-admin-client/entry-metadata.js +13 -0
- package/dist/web-admin-client/http-client.d.ts +1 -1
- package/dist/web-admin-client/http-client.js +23 -4
- package/dist/web-admin-client/mcp-revocation.d.ts +1 -1
- package/dist/web-admin-client/mcp-revocation.js +2 -1
- package/dist/web-admin-client/read-warnings.d.ts +1 -0
- package/dist/web-admin-client/read-warnings.js +1 -0
- package/dist/web-admin-client/restart-signal.js +8 -4
- package/dist/web-admin-client/skills-mcp.d.ts +2 -2
- package/dist/web-admin-client/types.d.ts +1 -2
- package/dist/workspace-space.d.ts +3 -2
- package/docs/DEVICE-EXECUTOR-PROTOCOL.md +4 -4
- package/package.json +6 -3
- package/scripts/drain-check-local.mjs +118 -147
- package/scripts/drain-check.mysql.sql +22 -2
- package/scripts/drain-check.pg.sql +22 -2
- package/wire-changes/server@7.148.0.json +1517 -0
- package/dist/http/memory-control-plane-corrupt-reply.d.ts +0 -25
- package/dist/http/memory-control-plane-corrupt-reply.js +0 -19
- package/dist/http/memory-layer-reply.d.ts +0 -30
- package/dist/http/memory-layer-reply.js +0 -24
- package/dist/lsp/e2b-bridge.d.ts +0 -57
- package/dist/lsp/e2b-bridge.js +0 -139
- package/dist/lsp/e2b-manager.d.ts +0 -93
- package/dist/lsp/e2b-manager.js +0 -178
- package/dist/lsp/lsp-frames.d.ts +0 -14
- package/dist/lsp/lsp-frames.js +0 -25
- package/dist/lsp/manager.d.ts +0 -129
- package/dist/lsp/manager.js +0 -127
- package/dist/lsp/types.d.ts +0 -12
- package/dist/lsp/types.js +0 -2
- package/dist/lsp/ws-transport.d.ts +0 -40
- package/dist/lsp/ws-transport.js +0 -210
|
@@ -1,14 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { SCENARIO_SUBJECT_PREFIX } from "../owner-brands.js";
|
|
2
|
+
import { redactErrorMessage, redactLedgerEventData, runRowErrorCodeOf, sealRunRowResult } from "../observability/run-terminal.js";
|
|
3
|
+
import { outwardPlane, persistedPlaneOf } from "../terminal.js";
|
|
3
4
|
import { projectUsageStats, USAGE_SCAN_LIMIT } from "../usage-analytics.js";
|
|
4
5
|
import { join } from "node:path";
|
|
5
|
-
import { existsSync, readFileSync, readdirSync, renameSync, rmSync, statSync } from "node:fs";
|
|
6
|
+
import { closeSync, existsSync, fsyncSync, openSync, readFileSync, readdirSync, renameSync, rmSync, statSync } from "node:fs";
|
|
7
|
+
import { IS_WIN32 } from "./host-platform.js";
|
|
6
8
|
import { randomBytes } from "node:crypto";
|
|
7
9
|
import { AppendLog, atomicWriteFile, ensureDir, isProcessLive, processFingerprint, sanitizePathComponent, sanitizeScope, writeThenLink } from "@sema-agent/core";
|
|
8
10
|
import { recordFailOpen } from "../observability/fail-open.js";
|
|
9
11
|
import { replayJsonlSkipping } from "../observability/corrupt-read-seat.js";
|
|
10
12
|
import { joinFromStore, splitForStore } from "./wiring-section-codec.js";
|
|
11
|
-
import { RUN_HOLDER_DEATH_CODES, RUN_ORPHANED_ERROR, RUN_STALLED_ERROR, StoreBootRefusalError, buildRunOrphanedError, isTerminalRunStatus, settledLegObservationOf } from "./store-contracts.js";
|
|
13
|
+
import { RUN_HOLDER_DEATH_CODES, RUN_ORPHANED_ERROR, RUN_STALLED_ERROR, RUN_STALL_DEFAULT_WIRING, RUN_STALL_VERDICT_UNLANDED_TAG, StoreBootRefusalError, runLivenessOf, buildRunOrphanedError, isTerminalRunStatus, settledLegObservationOf } from "./store-contracts.js";
|
|
14
|
+
import { buildSessionRunRollups } from "./session-run-rollup.js";
|
|
15
|
+
import { normalizedRunPreviewM45 } from "./run-preview-m45.js";
|
|
16
|
+
import { SHELL_SENTINEL_OWNER_M48 } from "./shell-sentinel-owner-m48.js";
|
|
12
17
|
import { notifyRunTerminal } from "../observability/run-terminal.js";
|
|
13
18
|
import { readRunIdentityCells, runIdentityCells } from "../identity-source.js";
|
|
14
19
|
import { createInProcessSpaceCommitTable, fenceSpaceCommitAtTerminal, SPACE_COMMIT_RECORD_SCHEMA } from "../workspace-space-commit.js";
|
|
@@ -80,10 +85,14 @@ export class FileRunStore {
|
|
|
80
85
|
claimOwner = { nonce: randomBytes(12).toString("hex"), ...processFingerprint() };
|
|
81
86
|
claimLocks = new Map();
|
|
82
87
|
logger;
|
|
88
|
+
rootRows;
|
|
83
89
|
strictHydrate;
|
|
90
|
+
stall;
|
|
84
91
|
constructor(root, opts) {
|
|
85
92
|
this.logger = opts;
|
|
86
|
-
this.
|
|
93
|
+
this.stall = opts.stall ?? RUN_STALL_DEFAULT_WIRING;
|
|
94
|
+
this.rootRows = opts.rootRows;
|
|
95
|
+
this.strictHydrate = opts.strictHydrate === true;
|
|
87
96
|
const dirs = fileRunStoreDirsFor(root);
|
|
88
97
|
this.runsDir = dirs.runs;
|
|
89
98
|
this.activeDir = dirs.active;
|
|
@@ -379,13 +388,17 @@ export class FileRunStore {
|
|
|
379
388
|
}
|
|
380
389
|
async createRun(taskId, sessionId, owner, instanceId, meta = {}) {
|
|
381
390
|
const idemKey = meta.idem?.key ?? null;
|
|
382
|
-
return this.
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
391
|
+
return this.rootRows().withRootRow(sessionId, async (present) => {
|
|
392
|
+
if (!present)
|
|
393
|
+
return { ok: false, sessionAbsent: true };
|
|
394
|
+
return this.withClaimLock(sessionId, async () => {
|
|
395
|
+
const acquired = await this.acquireClaim(sessionId, taskId);
|
|
396
|
+
if (!acquired.ok) {
|
|
397
|
+
const existing = this.submittedRow(taskId, idemKey);
|
|
398
|
+
return existing ? { ok: false, existing: this.toRecord(existing) } : acquired;
|
|
399
|
+
}
|
|
400
|
+
return this.commitNewRun(taskId, sessionId, owner, instanceId, meta, idemKey);
|
|
401
|
+
});
|
|
389
402
|
});
|
|
390
403
|
}
|
|
391
404
|
submittedRow(taskId, idemKey) {
|
|
@@ -470,6 +483,7 @@ export class FileRunStore {
|
|
|
470
483
|
const r = this.runs.get(taskId);
|
|
471
484
|
if (r && ownerEq(r.owner, owner) && r.status === "running")
|
|
472
485
|
this.persist({ ...r, updatedAt: new Date() });
|
|
486
|
+
return r !== undefined && r.status === "running";
|
|
473
487
|
}
|
|
474
488
|
async appendEvent(taskId, seq, type, data) {
|
|
475
489
|
data = redactLedgerEventData(type, data);
|
|
@@ -572,7 +586,7 @@ export class FileRunStore {
|
|
|
572
586
|
}
|
|
573
587
|
let pending;
|
|
574
588
|
if (r.status === "running" || r.status === "suspended" || r.status === "needs_review") {
|
|
575
|
-
const errorCode =
|
|
589
|
+
const errorCode = runRowErrorCodeOf(result);
|
|
576
590
|
this.persist({ ...r, status, result, error, errorCode, updatedAt: new Date() });
|
|
577
591
|
pending = {
|
|
578
592
|
runId: taskId,
|
|
@@ -596,14 +610,14 @@ export class FileRunStore {
|
|
|
596
610
|
const sealed = sealRunRowResult(result);
|
|
597
611
|
const r = this.runs.get(taskId);
|
|
598
612
|
if (r && (r.status === "running" || r.status === "suspended")) {
|
|
599
|
-
this.persist({ ...r, status: "suspended", result: sealed, updatedAt: new Date() });
|
|
613
|
+
this.persist({ ...r, status: "suspended", result: sealed, errorCode: runRowErrorCodeOf(sealed), updatedAt: new Date() });
|
|
600
614
|
}
|
|
601
615
|
}
|
|
602
616
|
async setNeedsReview(taskId, result) {
|
|
603
617
|
const sealed = sealRunRowResult(result);
|
|
604
618
|
const r = this.runs.get(taskId);
|
|
605
619
|
if (r && (r.status === "running" || r.status === "needs_review")) {
|
|
606
|
-
this.persist({ ...r, status: "needs_review", result: sealed, updatedAt: new Date() });
|
|
620
|
+
this.persist({ ...r, status: "needs_review", result: sealed, errorCode: runRowErrorCodeOf(sealed), updatedAt: new Date() });
|
|
607
621
|
}
|
|
608
622
|
}
|
|
609
623
|
async markResuming(taskId, instanceId) {
|
|
@@ -614,6 +628,7 @@ export class FileRunStore {
|
|
|
614
628
|
...r,
|
|
615
629
|
status: "running",
|
|
616
630
|
result: null,
|
|
631
|
+
errorCode: null,
|
|
617
632
|
instanceId,
|
|
618
633
|
cancelRequested: false,
|
|
619
634
|
preemptRequested: false,
|
|
@@ -696,62 +711,10 @@ export class FileRunStore {
|
|
|
696
711
|
}
|
|
697
712
|
return latest === undefined ? undefined : settledLegObservationOf(latest.taskId, latest.result);
|
|
698
713
|
}
|
|
699
|
-
async
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
continue;
|
|
704
|
-
const arr = bySession.get(r.sessionId) ?? [];
|
|
705
|
-
arr.push(r);
|
|
706
|
-
bySession.set(r.sessionId, arr);
|
|
707
|
-
}
|
|
708
|
-
const cursorAt = opts.cursor ? Date.parse(opts.cursor.lastActivityAt) : undefined;
|
|
709
|
-
const qlc = opts.q?.toLowerCase();
|
|
710
|
-
const summaries = [];
|
|
711
|
-
for (const [sessionId, arr] of bySession) {
|
|
712
|
-
if (qlc && !arr.some((r) => r.objectivePreview?.toLowerCase().includes(qlc)))
|
|
713
|
-
continue;
|
|
714
|
-
const sorted = [...arr].sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime() || (a.taskId < b.taskId ? 1 : a.taskId > b.taskId ? -1 : 0));
|
|
715
|
-
const latest = sorted[0];
|
|
716
|
-
const latestRunId = latest.result?.runId;
|
|
717
|
-
let last = -Infinity;
|
|
718
|
-
let first = Infinity;
|
|
719
|
-
for (const r of arr) {
|
|
720
|
-
const t = r.createdAt.getTime();
|
|
721
|
-
if (t > last)
|
|
722
|
-
last = t;
|
|
723
|
-
if (t < first)
|
|
724
|
-
first = t;
|
|
725
|
-
}
|
|
726
|
-
summaries.push({
|
|
727
|
-
sessionId,
|
|
728
|
-
owner: latest.owner,
|
|
729
|
-
lastActivityAt: new Date(last).toISOString(),
|
|
730
|
-
firstActivityAt: new Date(first).toISOString(),
|
|
731
|
-
runCount: arr.length,
|
|
732
|
-
objectivePreview: latest.objectivePreview,
|
|
733
|
-
lastStatus: latest.status,
|
|
734
|
-
lastRunId: latest.taskId,
|
|
735
|
-
...(typeof latestRunId === "string" && latestRunId !== "" ? { lastTaskRunId: latestRunId } : {}),
|
|
736
|
-
title: null,
|
|
737
|
-
pinned: false,
|
|
738
|
-
});
|
|
739
|
-
}
|
|
740
|
-
return summaries
|
|
741
|
-
.filter((s) => {
|
|
742
|
-
if (cursorAt === undefined)
|
|
743
|
-
return true;
|
|
744
|
-
const t = Date.parse(s.lastActivityAt);
|
|
745
|
-
return t < cursorAt || (t === cursorAt && s.sessionId < opts.cursor.sessionId);
|
|
746
|
-
})
|
|
747
|
-
.sort((a, b) => Date.parse(b.lastActivityAt) - Date.parse(a.lastActivityAt) || (a.sessionId < b.sessionId ? 1 : a.sessionId > b.sessionId ? -1 : 0))
|
|
748
|
-
.slice(0, opts.limit);
|
|
749
|
-
}
|
|
750
|
-
async deleteBySession(sessionId, expectedSessionOwner) {
|
|
751
|
-
void expectedSessionOwner;
|
|
752
|
-
const claimed = this.active.get(sessionId);
|
|
753
|
-
if (claimed !== undefined)
|
|
754
|
-
return { active: claimed };
|
|
714
|
+
async sessionRunRollups(opts = {}) {
|
|
715
|
+
return buildSessionRunRollups(this.runs.values(), opts);
|
|
716
|
+
}
|
|
717
|
+
async deleteBySession(sessionId) {
|
|
755
718
|
this.dropSectionBlobs(sessionId);
|
|
756
719
|
let removed = 0;
|
|
757
720
|
for (const [taskId, r] of [...this.runs]) {
|
|
@@ -814,9 +777,31 @@ export class FileRunStore {
|
|
|
814
777
|
this.sweepClaims();
|
|
815
778
|
return reaped;
|
|
816
779
|
}
|
|
817
|
-
async reapStale(
|
|
818
|
-
const
|
|
819
|
-
|
|
780
|
+
async reapStale() {
|
|
781
|
+
const nowMs = Date.now();
|
|
782
|
+
const windowMs = this.stall.windowMs();
|
|
783
|
+
const reaped = this.reapRunning((r) => runLivenessOf(this.toRecord(r), nowMs, windowMs) === "due", RUN_STALLED_ERROR, RUN_HOLDER_DEATH_CODES.stalled);
|
|
784
|
+
if (reaped > 0)
|
|
785
|
+
this.stall.onVerdicts(reaped);
|
|
786
|
+
return reaped;
|
|
787
|
+
}
|
|
788
|
+
async observeRun(row) {
|
|
789
|
+
const nowMs = Date.now();
|
|
790
|
+
const windowMs = this.stall.windowMs();
|
|
791
|
+
if (runLivenessOf(row, nowMs, windowMs) !== "due")
|
|
792
|
+
return row;
|
|
793
|
+
let landed = 0;
|
|
794
|
+
try {
|
|
795
|
+
landed = this.reapRunning((r) => r.taskId === row.taskId && runLivenessOf(this.toRecord(r), nowMs, windowMs) === "due", RUN_STALLED_ERROR, RUN_HOLDER_DEATH_CODES.stalled);
|
|
796
|
+
}
|
|
797
|
+
catch (err) {
|
|
798
|
+
recordFailOpen(RUN_STALL_VERDICT_UNLANDED_TAG, err instanceof Error ? err.message : String(err));
|
|
799
|
+
return row;
|
|
800
|
+
}
|
|
801
|
+
if (landed > 0)
|
|
802
|
+
this.stall.onVerdicts(landed);
|
|
803
|
+
const r = this.runs.get(row.taskId);
|
|
804
|
+
return r ? this.toRecord(r) : row;
|
|
820
805
|
}
|
|
821
806
|
async reclaimOrphanedAtBoot(isResumable) {
|
|
822
807
|
const orphans = [];
|
|
@@ -961,7 +946,19 @@ export class FileRunStore {
|
|
|
961
946
|
const verdict = await this.judgeClaim(sessionId, claim, holder);
|
|
962
947
|
if (verdict.kind === "live")
|
|
963
948
|
return { ok: false, activeTaskId: verdict.holderTaskId ?? holder };
|
|
964
|
-
|
|
949
|
+
const stalled = verdict.code === RUN_HOLDER_DEATH_CODES.stalled;
|
|
950
|
+
let taken;
|
|
951
|
+
try {
|
|
952
|
+
taken = this.takeOverClaim(sessionId, verdict.reason, verdict.snapshot, verdict.code);
|
|
953
|
+
}
|
|
954
|
+
catch (e) {
|
|
955
|
+
if (!stalled)
|
|
956
|
+
throw e;
|
|
957
|
+
recordFailOpen(RUN_STALL_VERDICT_UNLANDED_TAG, e instanceof Error ? e.message : String(e));
|
|
958
|
+
return { ok: false, activeTaskId: verdict.snapshot.taskId || holder };
|
|
959
|
+
}
|
|
960
|
+
if (taken && stalled)
|
|
961
|
+
this.stall.onVerdicts(1);
|
|
965
962
|
}
|
|
966
963
|
}
|
|
967
964
|
try {
|
|
@@ -1019,6 +1016,8 @@ export class FileRunStore {
|
|
|
1019
1016
|
return live();
|
|
1020
1017
|
return { kind: "stale", reason: `parked run (${row.status}) has no resumable checkpoint — claim reclaimed`, snapshot };
|
|
1021
1018
|
}
|
|
1019
|
+
if (row && runLivenessOf(this.toRecord(row), Date.now(), this.stall.windowMs()) === "due")
|
|
1020
|
+
return { kind: "stale", reason: RUN_STALLED_ERROR, snapshot, code: RUN_HOLDER_DEATH_CODES.stalled };
|
|
1022
1021
|
const mine = owner?.nonce === this.claimOwner.nonce;
|
|
1023
1022
|
const ownerGone = owner !== undefined && !isProcessLive(owner);
|
|
1024
1023
|
if (!mine && !ownerGone)
|
|
@@ -1051,7 +1050,7 @@ export class FileRunStore {
|
|
|
1051
1050
|
if (row?.status !== snapshot.status || row?.updatedAt.getTime() !== snapshot.updatedAtMs)
|
|
1052
1051
|
return false;
|
|
1053
1052
|
if (row && (row.status === "running" || row.status === "suspended" || row.status === "needs_review")) {
|
|
1054
|
-
this.persist({ ...row, status: "failed", error: reason,
|
|
1053
|
+
this.persist({ ...row, status: "failed", result: null, error: reason, errorCode: code ?? null, updatedAt: new Date() });
|
|
1055
1054
|
}
|
|
1056
1055
|
const quarantine = join(this.tmpDir, `stale-claim.${sanitizePathComponent(sessionId)}.${process.pid}.${randomBytes(6).toString("hex")}`);
|
|
1057
1056
|
try {
|
|
@@ -1093,23 +1092,79 @@ export class FileRunStore {
|
|
|
1093
1092
|
}
|
|
1094
1093
|
this.eventLogs.delete(taskId);
|
|
1095
1094
|
}
|
|
1095
|
+
const dir = this.runDir(taskId);
|
|
1096
|
+
rmSync(dir, { recursive: true, force: true });
|
|
1097
|
+
if (!IS_WIN32 && existsSync(this.runsDir)) {
|
|
1098
|
+
const fd = openSync(this.runsDir, "r");
|
|
1099
|
+
try {
|
|
1100
|
+
fsyncSync(fd);
|
|
1101
|
+
}
|
|
1102
|
+
finally {
|
|
1103
|
+
closeSync(fd);
|
|
1104
|
+
}
|
|
1105
|
+
}
|
|
1096
1106
|
this.events.delete(taskId);
|
|
1097
1107
|
const dropped = this.runs.get(taskId);
|
|
1098
1108
|
if (dropped?.idemKey != null && this.byIdem.get(dropped.idemKey) === taskId)
|
|
1099
1109
|
this.byIdem.delete(dropped.idemKey);
|
|
1100
1110
|
this.runs.delete(taskId);
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1111
|
+
}
|
|
1112
|
+
withdrawRunsOf(sessionId, ownTaskId) {
|
|
1113
|
+
for (const r of this.runs.values())
|
|
1114
|
+
if (r.sessionId === sessionId && r.taskId !== ownTaskId)
|
|
1115
|
+
return { keep: "runs" };
|
|
1116
|
+
const own = ownTaskId === undefined ? undefined : this.runs.get(ownTaskId);
|
|
1117
|
+
if (own !== undefined && own.sessionId !== sessionId)
|
|
1118
|
+
throw new Error(`FileRunStore.withdrawRunsOf: run ${ownTaskId} belongs to session ${own.sessionId}, not ${sessionId} — refusing to delete it`);
|
|
1119
|
+
this.dropSectionBlobs(sessionId);
|
|
1120
|
+
if (own !== undefined)
|
|
1121
|
+
this.dropRun(own.taskId);
|
|
1122
|
+
return "proceed";
|
|
1123
|
+
}
|
|
1124
|
+
migrateRunErrorCodeColumnM44() {
|
|
1125
|
+
let migrated = 0;
|
|
1126
|
+
for (const r of this.runs.values()) {
|
|
1127
|
+
const target = r.status === "running" ? null : r.result === null ? r.errorCode : (persistedPlaneOf(r.result).errorCode ?? r.errorCode);
|
|
1128
|
+
if (target === r.errorCode)
|
|
1129
|
+
continue;
|
|
1130
|
+
this.persist({ ...r, errorCode: target });
|
|
1131
|
+
migrated += 1;
|
|
1132
|
+
}
|
|
1133
|
+
return migrated;
|
|
1134
|
+
}
|
|
1135
|
+
migrateRunObjectivePreviewM45() {
|
|
1136
|
+
let migrated = 0;
|
|
1137
|
+
for (const r of this.runs.values()) {
|
|
1138
|
+
if (typeof r.objectivePreview !== "string")
|
|
1139
|
+
continue;
|
|
1140
|
+
const target = normalizedRunPreviewM45(r.objectivePreview);
|
|
1141
|
+
if (target === undefined || target === r.objectivePreview)
|
|
1142
|
+
continue;
|
|
1143
|
+
this.persist({ ...r, objectivePreview: target });
|
|
1144
|
+
migrated += 1;
|
|
1145
|
+
}
|
|
1146
|
+
return migrated;
|
|
1147
|
+
}
|
|
1148
|
+
clearShellSentinelOwnersM48() {
|
|
1149
|
+
let cleared = 0;
|
|
1150
|
+
for (const r of this.runs.values()) {
|
|
1151
|
+
if (r.owner !== SHELL_SENTINEL_OWNER_M48)
|
|
1152
|
+
continue;
|
|
1153
|
+
this.persist({ ...r, owner: null });
|
|
1154
|
+
cleared += 1;
|
|
1108
1155
|
}
|
|
1156
|
+
return cleared;
|
|
1109
1157
|
}
|
|
1110
1158
|
sessionIdsWithRuns() {
|
|
1111
1159
|
return new Set([...this.runs.values()].map((r) => r.sessionId));
|
|
1112
1160
|
}
|
|
1161
|
+
scenarioPrefixOwnerRowsM42() {
|
|
1162
|
+
let n = 0;
|
|
1163
|
+
for (const r of this.runs.values())
|
|
1164
|
+
if (r.owner !== null && r.owner.startsWith(SCENARIO_SUBJECT_PREFIX))
|
|
1165
|
+
n += 1;
|
|
1166
|
+
return n;
|
|
1167
|
+
}
|
|
1113
1168
|
dispose() {
|
|
1114
1169
|
for (const log of [...this.eventLogs.values(), ...this.blobLogs.values()]) {
|
|
1115
1170
|
try {
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
* structural tests only on mac/Linux; behavior-level bite happens on the first Windows-runner green.
|
|
33
33
|
*/
|
|
34
34
|
import type { ChildProcess } from "node:child_process";
|
|
35
|
-
import { killProcessTree, type BackgroundHardKillOutcome } from "@sema-agent/core";
|
|
35
|
+
import { killProcessTree, signalProcessTree, type BackgroundHardKillOutcome } from "@sema-agent/core";
|
|
36
36
|
import type { Logger } from "../observability/logger.js";
|
|
37
37
|
/** 平台读点全仓一处(`test/host-shell-settle-order.test.ts` 源码钉);别处要平台串从这里取,不直读 Node 的平台字段。 */
|
|
38
38
|
export declare const HOST_PLATFORM: NodeJS.Platform;
|
|
@@ -133,8 +133,29 @@ export declare function hardKillGroupNow(pid: number): BackgroundHardKillOutcome
|
|
|
133
133
|
*/
|
|
134
134
|
export declare function killTreeSoft(pid: number): void;
|
|
135
135
|
/** Graceful tree kill where the CALLER has no escalation timer of its own (currently unused by the host lane —
|
|
136
|
-
* exported for parity with core's surface; the bg driver keeps its own HOST_BG_KILL_GRACE_MS ladder).
|
|
137
|
-
|
|
136
|
+
* exported for parity with core's surface; the bg driver keeps its own HOST_BG_KILL_GRACE_MS ladder).
|
|
137
|
+
* `signalProcessTree` = ONE signal to the whole tree (POSIX: a `ps` snapshot of the descendants of `pid` + the group
|
|
138
|
+
* signal + each descendant; win32: taskkill /T). Never throws. Its root must be a pid that is still OURS (an unreaped
|
|
139
|
+
* child): a reaped pid may already be a stranger's, and a descendant walk from a stranger's pid kills the stranger's
|
|
140
|
+
* children — the one caller (the command-hook ladder) guards that on the child handle. */
|
|
141
|
+
export { killProcessTree, signalProcessTree };
|
|
142
|
+
/**
|
|
143
|
+
* Group probe for a REAPED leader: does the group of `pid` still hold an ORIGINAL member? Ask it only after node reaped the
|
|
144
|
+
* leader (an unreaped leader keeps the pid ours — no question to ask). POSIX reads two numbers:
|
|
145
|
+
* · `kill(-pid, 0)` — is anyone in the group;
|
|
146
|
+
* · `kill(pid, 0)` — is any process holding the number itself.
|
|
147
|
+
* Group empty (ESRCH) ⇒ false. Group non-empty and nobody holds the number (ESRCH) ⇒ true: the kernel never hands out a number that a
|
|
148
|
+
* process still uses as its process-group id, so the number was not recycled and the members are the original ones (Linux's pid
|
|
149
|
+
* allocator; BSD / darwin allocate the same way — inferred, not read from kernel source). Group non-empty and the number IS held
|
|
150
|
+
* (success / EPERM) ⇒ false: while an original member lived the number could not have been handed out, so every original is dead and what
|
|
151
|
+
* answers now is a stranger's new process / group — never ours, so the caller sends it nothing. EPERM on the group probe reads
|
|
152
|
+
* "non-empty" (darwin answers EPERM for a group holding only unreaped zombies, indistinguishable from a live member we may not signal:
|
|
153
|
+
* one extra shot, never a missed member); EPERM on the number probe reads "held" (the process exists, we just cannot touch it).
|
|
154
|
+
* win32 has no process group ⇒ always false (the tree is discovered only at signal time, by taskkill /T, and only from an unreaped
|
|
155
|
+
* root). Never throws. The only residual is the instant between the two probes (an original member dying and its number being
|
|
156
|
+
* recycled inside it) — microseconds, not the grace window.
|
|
157
|
+
*/
|
|
158
|
+
export declare function reapedLeaderGroupAlive(pid: number): boolean;
|
|
138
159
|
/**
|
|
139
160
|
* 登记回执 = 注销的**唯一**凭据(身份即凭据,见簿注)+ 一只幂等的注销把手。
|
|
140
161
|
*
|
|
@@ -127,7 +127,21 @@ export function killTreeSoft(pid) {
|
|
|
127
127
|
}
|
|
128
128
|
process.kill(-pid, "SIGTERM");
|
|
129
129
|
}
|
|
130
|
-
export { killProcessTree };
|
|
130
|
+
export { killProcessTree, signalProcessTree };
|
|
131
|
+
export function reapedLeaderGroupAlive(pid) {
|
|
132
|
+
if (IS_WIN32)
|
|
133
|
+
return false;
|
|
134
|
+
const answers = (target) => {
|
|
135
|
+
try {
|
|
136
|
+
process.kill(target, 0);
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
return err.code !== "ESRCH";
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
return answers(-pid) && !answers(pid);
|
|
144
|
+
}
|
|
131
145
|
const liveHostForegroundGroups = new Set();
|
|
132
146
|
export function trackHostForegroundChild(pid) {
|
|
133
147
|
const ticket = {
|
|
@@ -136,6 +136,8 @@ function refusingBakeRow(read) {
|
|
|
136
136
|
export const IMAGE_BAKE_INDEXES = [
|
|
137
137
|
{ table: "image_bake", name: "idx_image_bake_status", columns: ["status"] },
|
|
138
138
|
{ table: "image_bake", name: "idx_image_bake_created", columns: ["created_at"] },
|
|
139
|
+
{ table: "image_bake", name: "uq_image_bake_idem", columns: ["idem_key"], unique: true },
|
|
140
|
+
{ table: "image_bake_event", name: "uq_image_bake_event_line", columns: ["bake_id", "line_ord"], unique: true },
|
|
139
141
|
];
|
|
140
142
|
export async function ensurePgImageBakeSchema(pool, poolName = "standard") {
|
|
141
143
|
for (const stmt of PG_IMAGE_BAKE_SCHEMA)
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
* 另两种店**答了**却做不了的(没有写面或写面拒 / 并发争不过)⇒ 点名跳过,下一次起服再试,其间那几行照旧放行,每次起服都点名。
|
|
41
41
|
*/
|
|
42
42
|
import { type DurableRulePartitionProvider, type PersistedRule, type RuleAdd, type RuleOwner } from "@sema-agent/core";
|
|
43
|
-
/** 一只被退役的导入 add 所在的行(一行一条读数)。**不带规则正文**(
|
|
43
|
+
/** 一只被退役的导入 add 所在的行(一行一条读数)。**不带规则正文**(规则正文不出店)—— 桶键 + 工具名足够让运维去列举面对上它。 */
|
|
44
44
|
export interface ImportedLayerRootAllowRetired {
|
|
45
45
|
/** 桶键(`buildRuleOwnerKey`:属主的单向摘要;两种店同一把,日志里不出属主名)。 */
|
|
46
46
|
readonly ownerKey: string;
|
|
@@ -61,7 +61,7 @@ export type ImportedLayerRootSkipReason = "bucket_unreadable" | "vanished" | "no
|
|
|
61
61
|
export interface ImportedLayerRootBucketSkipped {
|
|
62
62
|
readonly ownerKey: string;
|
|
63
63
|
readonly reason: ImportedLayerRootSkipReason;
|
|
64
|
-
/** 一句不带行内容的话:读 / 解析桶抛出来的东西只报它的种类(原句可能引到桶里的行 ——
|
|
64
|
+
/** 一句不带行内容的话:读 / 解析桶抛出来的东西只报它的种类(原句可能引到桶里的行 —— 规则正文不出店;
|
|
65
65
|
* 原句由店自己的披露口说,File 店的 `permission_rule_store_disclosure`、SQL 店的整桶拒句);写面拒的是闭集词,原样带。 */
|
|
66
66
|
readonly why: string;
|
|
67
67
|
}
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
* 每轮一行结构化日志 `sandbox_pod_reap_round`(扫了几只、按闭集原因分的删 / 跳过计数),每删一只一行 `sandbox_pod_reaped`;**列举失败**这一轮一只都删不了 ——
|
|
26
26
|
* F 类兜底口 `server.sandbox-pod-reaper.list-failed` 计一次 + 一行 warn `sandbox_pod_reap_list_failed`(下一轮一个周期后照常再列);**某一只删失败**不挡其余 ——
|
|
27
27
|
* 与连接清理同一只上报口 `reportPodDeleteFailed`(F 类计数 `server.sandbox-pod.delete-failed` + 一行 error `sandbox_pod_delete_failed`,`why=reaper_<删它的理由>`,下一轮再判再删)。
|
|
28
|
-
* 每副本起服后第一个维护 tick 跑一次、此后每
|
|
28
|
+
* 每副本起服后第一个维护 tick 跑一次、此后每 `SANDBOX_REAP_PERIOD_MS` 一次(`boot/reapers.ts` 的沙箱回收腿,与 local-docker 车道的容器回收器共一只座一个节拍:`sandbox-reaper.ts`);多副本同时删同一只 ⇒ 404 计 `gone`。
|
|
29
29
|
*/
|
|
30
30
|
import type { Logger } from "../observability/logger.js";
|
|
31
31
|
import type { Metrics } from "../observability/metrics.js";
|
|
@@ -33,8 +33,6 @@ import type { Metrics } from "../observability/metrics.js";
|
|
|
33
33
|
export declare const SANDBOX_POD_REAP_GRACE_MS = 60000;
|
|
34
34
|
/** ① 的上界:`max(租约上限 + 宽限, 快照时限 + 引擎拆环境放行)`。唯一的调用方 = 适配器建 Pod 的那一拍(快照时限 = 建它的副本的 `dataTimeoutMs`),结果写进 Pod 的注解。 */
|
|
35
35
|
export declare function sandboxRunEndHoldMs(snapshotTimeoutMs: number): number;
|
|
36
|
-
/** 一个副本两轮回收之间的间隔。常量。 */
|
|
37
|
-
export declare const SANDBOX_POD_REAP_PERIOD_MS: number;
|
|
38
36
|
/** 列举出来的一只沙箱 Pod(只带判官要读的几样;时刻是毫秒)。 */
|
|
39
37
|
export interface SandboxPodListing {
|
|
40
38
|
readonly name: string;
|
|
@@ -15,7 +15,6 @@ function runEndHoldOf(raw) {
|
|
|
15
15
|
const ms = Number(raw);
|
|
16
16
|
return Number.isSafeInteger(ms) && ms >= RUN_END_HOLD_READABLE.min && ms <= RUN_END_HOLD_READABLE.max ? ms : undefined;
|
|
17
17
|
}
|
|
18
|
-
export const SANDBOX_POD_REAP_PERIOD_MS = 5 * 60_000;
|
|
19
18
|
const CLASS_VERDICT = {
|
|
20
19
|
live: "live",
|
|
21
20
|
parked: "live",
|
|
@@ -2,10 +2,16 @@ import type { Pool as MySqlPool } from "mysql2/promise";
|
|
|
2
2
|
import type { Pool as PgPool } from "pg";
|
|
3
3
|
import { type SqlDriver } from "./sql-driver.js";
|
|
4
4
|
import { type IndexSpec } from "./ensure-index.js";
|
|
5
|
+
import { type RunIdentity } from "../identity-source.js";
|
|
5
6
|
/** 表名([ref] 单数纪律;`schema-naming-invariants` 的闭集词表执法)。 */
|
|
6
7
|
export declare const LEADER_RUN_TABLE = "leader_run";
|
|
7
8
|
/** leader run 的四态 —— 与 `leader/endpoint.ts` 的 `LeaderRun["status"]` 同词表(闭集)。 */
|
|
8
9
|
export type LeaderRunStatus = "running" | "completed" | "failed" | "needs_human";
|
|
10
|
+
/**
|
|
11
|
+
* 终局行的机读码闭集(`error_code` 列;与 run / bake 的取消终局同词:`failed` + `cancelled`)。今天唯一的成员 = 取消口停下的 run;
|
|
12
|
+
* 其余终局(自然失败、陈旧清算)不带码 ⇒ 列 NULL。读出表外词 ⇒ 响亮拒(与 {@link statusOf} 同)。
|
|
13
|
+
*/
|
|
14
|
+
export type LeaderRunErrorCode = "cancelled";
|
|
9
15
|
/** 库里一行 leader run 的读出形。`result` 是 `LeaderResult` 的 JSON 原样(店不解释它的内部结构)。 */
|
|
10
16
|
export interface LeaderRunRecord {
|
|
11
17
|
id: string;
|
|
@@ -17,6 +23,12 @@ export interface LeaderRunRecord {
|
|
|
17
23
|
objectivePreview: string | null;
|
|
18
24
|
result?: unknown;
|
|
19
25
|
error?: string;
|
|
26
|
+
/** 只在取消口停下的终局上在场(列 NULL ⇒ 缺席)。 */
|
|
27
|
+
errorCode?: LeaderRunErrorCode;
|
|
28
|
+
/** 耐久取消旗(`cancel_requested` 列):取消口翻过、行当时还在跑 ⇒ `true`。只翻 `running` 行;终局之后不再变。 */
|
|
29
|
+
cancelRequested: boolean;
|
|
30
|
+
/** 受理时验过的身份元组(三列;律在 `identity-source.ts` 头注)。`null` = 不合格(列之前的行 / 无鉴权写面 / 别人替属主按下)。不上 wire。 */
|
|
31
|
+
identity: RunIdentity | null;
|
|
20
32
|
startedAtMs: number;
|
|
21
33
|
finishedAtMs?: number;
|
|
22
34
|
}
|
|
@@ -26,12 +38,16 @@ export interface NewLeaderRun {
|
|
|
26
38
|
owner: string | null;
|
|
27
39
|
/** 已 scope 过的幂等键(唯一铸法 `idemKeyOf(raw, caller, "leader")`,`http/idempotency.ts`;sha256 hex 定宽 64);null = 不去重。 */
|
|
28
40
|
idemKey: string | null;
|
|
41
|
+
/** 受理时的身份元组 —— 凭据门铸、提交路由经 `runIdentityOf` 交来,原样写入,之后只读(店不重算)。 */
|
|
42
|
+
identity: RunIdentity | null;
|
|
29
43
|
}
|
|
30
44
|
/** 终局补丁 —— `finishRun` 一次写完(状态 + 结果/错误 + 完成时刻)。 */
|
|
31
45
|
export interface LeaderRunTerminal {
|
|
32
46
|
status: Exclude<LeaderRunStatus, "running">;
|
|
33
47
|
result?: unknown;
|
|
34
48
|
error?: string;
|
|
49
|
+
/** 取消口停下的终局带 `cancelled`;其余缺席(列写 NULL)。 */
|
|
50
|
+
errorCode?: LeaderRunErrorCode;
|
|
35
51
|
}
|
|
36
52
|
/** `objective_preview` 的字符上限,与 DDL 的 VARCHAR(160) 同源(`task_run.objective_preview` 先例同宽)。 */
|
|
37
53
|
export declare const LEADER_OBJECTIVE_PREVIEW_CHARS = 160;
|
|
@@ -67,6 +83,12 @@ export declare class SqlLeaderRunStore {
|
|
|
67
83
|
getRun(id: string): Promise<LeaderRunRecord | undefined>;
|
|
68
84
|
/** 按幂等键读回既有行(dup-key 观察臂;也给集成套件直查)。 */
|
|
69
85
|
getByIdem(idemKey: string): Promise<LeaderRunRecord | undefined>;
|
|
86
|
+
/**
|
|
87
|
+
* 翻耐久取消旗 —— **只翻 `running` 行**(CAS:`WHERE status = 'running'`,与 task_run / image_bake 的 `requestCancel` 同形)。
|
|
88
|
+
* 回执 = 是否真的翻了:`false` ⇒ 行不在或已终局(取消口据此重读、按终局臂答)。驱动这条 run 的副本在下一个存活心跳拍读到它并中止;
|
|
89
|
+
* 与 {@link finishRun} 同一只谓词 ⇒ 两写在库里有先后:旗先到 ⇒ 终局写落定后的复读看得见它;终局先到 ⇒ 本 CAS 打空。
|
|
90
|
+
*/
|
|
91
|
+
requestCancel(id: string): Promise<boolean>;
|
|
70
92
|
/**
|
|
71
93
|
* 陈旧 `running` 清算(codex 交叉复审 R1-high②,验真后修)。
|
|
72
94
|
*
|
|
@@ -4,8 +4,10 @@ import { mysqlDriver, pgDriver, dialectJsonEncoder } from "./sql-driver.js";
|
|
|
4
4
|
import { decodeNullableJsonColumn, foldJsonColumn, jsonColumnText, readNonNullJsonValueColumn } from "./sql-json-column.js";
|
|
5
5
|
import { ensureIndexes } from "./ensure-index.js";
|
|
6
6
|
import { buildObjectivePreview } from "../user-authored-text.js";
|
|
7
|
+
import { RUN_IDENTITY_COLUMNS, readRunIdentityCells, runIdentityCells } from "../identity-source.js";
|
|
7
8
|
export const LEADER_RUN_TABLE = "leader_run";
|
|
8
9
|
const LEADER_RUN_STATUSES = new Set(["running", "completed", "failed", "needs_human"]);
|
|
10
|
+
const LEADER_RUN_ERROR_CODES = new Set(["cancelled"]);
|
|
9
11
|
export const LEADER_OBJECTIVE_PREVIEW_CHARS = 160;
|
|
10
12
|
export const TIDB_LEADER_RUN_STATEMENTS = [
|
|
11
13
|
`CREATE TABLE IF NOT EXISTS ${LEADER_RUN_TABLE} (
|
|
@@ -22,6 +24,12 @@ export const TIDB_LEADER_RUN_STATEMENTS = [
|
|
|
22
24
|
-- result:LeaderResult 的 JSON 原样(店不解释内部结构)。仅终局时写。
|
|
23
25
|
result JSON NULL,
|
|
24
26
|
error TEXT NULL,
|
|
27
|
+
-- error_code:终局的机读码(闭集 LeaderRunErrorCode;今天只有取消口停下的 run 写 cancelled,其余 NULL)。
|
|
28
|
+
error_code VARCHAR(64) NULL,
|
|
29
|
+
-- cancel_requested:耐久取消旗(与 task_run / image_bake 同形)。取消口只翻 running 行;驱动这条 run 的副本按存活心跳拍读它并中止。
|
|
30
|
+
cancel_requested SMALLINT NOT NULL DEFAULT 0,
|
|
31
|
+
-- 受理时验过的身份元组三列(列定义的唯一属主 = identity-source.ts 的 RUN_IDENTITY_COLUMNS,与 task_run 内插同一段)。
|
|
32
|
+
${RUN_IDENTITY_COLUMNS.mysql},
|
|
25
33
|
started_at_ms BIGINT NOT NULL,
|
|
26
34
|
finished_at_ms BIGINT NULL,
|
|
27
35
|
PRIMARY KEY (leader_run_id),
|
|
@@ -39,6 +47,9 @@ export const PG_LEADER_RUN_SCHEMA = [
|
|
|
39
47
|
status VARCHAR(16) COLLATE "C" NOT NULL,
|
|
40
48
|
result JSONB NULL,
|
|
41
49
|
error TEXT COLLATE "C" NULL,
|
|
50
|
+
error_code VARCHAR(64) COLLATE "C" NULL,
|
|
51
|
+
cancel_requested SMALLINT NOT NULL DEFAULT 0,
|
|
52
|
+
${RUN_IDENTITY_COLUMNS.pg},
|
|
42
53
|
started_at_ms BIGINT NOT NULL,
|
|
43
54
|
finished_at_ms BIGINT NULL,
|
|
44
55
|
PRIMARY KEY (leader_run_id),
|
|
@@ -47,6 +58,7 @@ export const PG_LEADER_RUN_SCHEMA = [
|
|
|
47
58
|
];
|
|
48
59
|
export const LEADER_RUN_INDEXES = [
|
|
49
60
|
{ table: `${LEADER_RUN_TABLE}`, name: "idx_leader_run_owner", columns: ["owner"] },
|
|
61
|
+
{ table: `${LEADER_RUN_TABLE}`, name: "uq_leader_run_idem", columns: ["idem_key"], unique: true },
|
|
50
62
|
{ table: `${LEADER_RUN_TABLE}`, name: "idx_leader_run_started", columns: ["started_at_ms"] },
|
|
51
63
|
];
|
|
52
64
|
export async function ensurePgLeaderRunSchema(q) {
|
|
@@ -57,7 +69,7 @@ export async function ensurePgLeaderRunSchema(q) {
|
|
|
57
69
|
export const STALE_SWEEP_REASON = "leader run went stale: no replica settled it within LEADER_RUN_STALE_MS (the replica driving it most likely died). " +
|
|
58
70
|
"The run was NOT taken over — re-submit with a NEW Idempotency-Key to run it again.";
|
|
59
71
|
function selectCols(dialect) {
|
|
60
|
-
return `leader_run_id, owner, objective_preview, status, ${jsonColumnText(dialect, "result")}, error, started_at_ms, finished_at_ms`;
|
|
72
|
+
return `leader_run_id, owner, objective_preview, status, ${jsonColumnText(dialect, "result")}, error, error_code, cancel_requested, identity_source, identity_scope, identity_principal_inc, started_at_ms, finished_at_ms`;
|
|
61
73
|
}
|
|
62
74
|
function readResultColumn(text, id) {
|
|
63
75
|
try {
|
|
@@ -67,6 +79,15 @@ function readResultColumn(text, id) {
|
|
|
67
79
|
throw foldJsonColumn(e, (m) => `leader_run: ${m} — refusing rather than serve this run as if it had finished empty-handed`);
|
|
68
80
|
}
|
|
69
81
|
}
|
|
82
|
+
function errorCodeOf(raw, id) {
|
|
83
|
+
if (raw == null)
|
|
84
|
+
return undefined;
|
|
85
|
+
const s = String(raw);
|
|
86
|
+
if (!LEADER_RUN_ERROR_CODES.has(s)) {
|
|
87
|
+
throw new Error(`leader_run ${id}: unknown error_code ${JSON.stringify(s)} (closed word table: ${[...LEADER_RUN_ERROR_CODES].join("|")}) — a newer replica wrote a word this build cannot interpret`);
|
|
88
|
+
}
|
|
89
|
+
return s;
|
|
90
|
+
}
|
|
70
91
|
function statusOf(raw, id) {
|
|
71
92
|
const s = String(raw);
|
|
72
93
|
if (!LEADER_RUN_STATUSES.has(s)) {
|
|
@@ -78,6 +99,7 @@ function mapRow(r) {
|
|
|
78
99
|
const id = String(r.leader_run_id);
|
|
79
100
|
const result = readResultColumn(r.result, id);
|
|
80
101
|
const error = r.error == null ? undefined : String(r.error);
|
|
102
|
+
const errorCode = errorCodeOf(r.error_code, id);
|
|
81
103
|
const finished = r.finished_at_ms == null ? undefined : Number(r.finished_at_ms);
|
|
82
104
|
return {
|
|
83
105
|
id,
|
|
@@ -86,6 +108,9 @@ function mapRow(r) {
|
|
|
86
108
|
objectivePreview: r.objective_preview == null ? null : String(r.objective_preview),
|
|
87
109
|
...(result === undefined ? {} : { result }),
|
|
88
110
|
...(error === undefined ? {} : { error }),
|
|
111
|
+
...(errorCode === undefined ? {} : { errorCode }),
|
|
112
|
+
cancelRequested: Number(r.cancel_requested) === 1,
|
|
113
|
+
identity: readRunIdentityCells(r.identity_source, r.identity_scope, r.identity_principal_inc),
|
|
89
114
|
startedAtMs: Number(r.started_at_ms),
|
|
90
115
|
...(finished === undefined ? {} : { finishedAtMs: finished }),
|
|
91
116
|
};
|
|
@@ -102,9 +127,10 @@ export class SqlLeaderRunStore {
|
|
|
102
127
|
const id = uuidv7();
|
|
103
128
|
const now = Date.now();
|
|
104
129
|
const preview = buildObjectivePreview(input.objective, LEADER_OBJECTIVE_PREVIEW_CHARS);
|
|
105
|
-
const
|
|
130
|
+
const cells = runIdentityCells(input.identity);
|
|
131
|
+
const params = [id, input.idemKey, input.owner, preview, "running", now, cells.identitySource, cells.identityScope, cells.identityPrincipalInc];
|
|
106
132
|
try {
|
|
107
|
-
await this.db.query(this.q(`INSERT INTO ${LEADER_RUN_TABLE} (leader_run_id, idem_key, owner, objective_preview, status, started_at_ms) VALUES (
|
|
133
|
+
await this.db.query(this.q(`INSERT INTO ${LEADER_RUN_TABLE} (leader_run_id, idem_key, owner, objective_preview, status, started_at_ms, identity_source, identity_scope, identity_principal_inc) VALUES (?,?,?,?,?,?,?,?,?)`, `INSERT INTO ${LEADER_RUN_TABLE} (leader_run_id, idem_key, owner, objective_preview, status, started_at_ms, identity_source, identity_scope, identity_principal_inc) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9)`), params);
|
|
108
134
|
}
|
|
109
135
|
catch (err) {
|
|
110
136
|
if (isDupKeyError(this.db.dialect, err) && input.idemKey) {
|
|
@@ -129,6 +155,10 @@ export class SqlLeaderRunStore {
|
|
|
129
155
|
const row = res.rows[0];
|
|
130
156
|
return row ? mapRow(row) : undefined;
|
|
131
157
|
}
|
|
158
|
+
async requestCancel(id) {
|
|
159
|
+
const res = await this.db.query(this.q(`UPDATE ${LEADER_RUN_TABLE} SET cancel_requested = 1 WHERE leader_run_id = ? AND status = 'running'`, `UPDATE ${LEADER_RUN_TABLE} SET cancel_requested = 1 WHERE leader_run_id = $1 AND status = 'running'`), [id]);
|
|
160
|
+
return res.affected > 0;
|
|
161
|
+
}
|
|
132
162
|
async reapStaleRunning(staleMs, now) {
|
|
133
163
|
const cutoff = now - staleMs;
|
|
134
164
|
const res = await this.db.query(this.q(`UPDATE ${LEADER_RUN_TABLE} SET status = 'failed', error = ?, finished_at_ms = ? WHERE status = 'running' AND started_at_ms < ?`, `UPDATE ${LEADER_RUN_TABLE} SET status = 'failed', error = $1, finished_at_ms = $2 WHERE status = 'running' AND started_at_ms < $3`), [STALE_SWEEP_REASON, now, cutoff]);
|
|
@@ -139,7 +169,7 @@ export class SqlLeaderRunStore {
|
|
|
139
169
|
}
|
|
140
170
|
async finishRun(id, patch) {
|
|
141
171
|
const json = dialectJsonEncoder(this.db.dialect);
|
|
142
|
-
const res = await this.db.query(this.q(`UPDATE ${LEADER_RUN_TABLE} SET status = ?, result = CAST(? AS JSON), error = ?, finished_at_ms = ? WHERE leader_run_id = ? AND status = 'running'`, `UPDATE ${LEADER_RUN_TABLE} SET status = $1, result = $2::jsonb, error = $3,
|
|
172
|
+
const res = await this.db.query(this.q(`UPDATE ${LEADER_RUN_TABLE} SET status = ?, result = CAST(? AS JSON), error = ?, error_code = ?, finished_at_ms = ? WHERE leader_run_id = ? AND status = 'running'`, `UPDATE ${LEADER_RUN_TABLE} SET status = $1, result = $2::jsonb, error = $3, error_code = $4, finished_at_ms = $5 WHERE leader_run_id = $6 AND status = 'running'`), [patch.status, patch.result == null ? null : json(patch.result), patch.error ?? null, patch.errorCode ?? null, Date.now(), id]);
|
|
143
173
|
return res.affected > 0;
|
|
144
174
|
}
|
|
145
175
|
}
|