@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,15 +1,15 @@
|
|
|
1
|
-
import { redactErrorMessage, redactLedgerEventData, sealRunRowResult } from "../observability/run-terminal.js";
|
|
2
|
-
import { outwardPlane } from "../terminal.js";
|
|
1
|
+
import { redactErrorMessage, redactLedgerEventData, runRowErrorCodeOf, sealRunRowResult } from "../observability/run-terminal.js";
|
|
2
|
+
import { outwardPlane, persistedPlaneOf } from "../terminal.js";
|
|
3
3
|
import { projectUsageStats, USAGE_SCAN_LIMIT } from "../usage-analytics.js";
|
|
4
|
-
import { escapeLike } from "./sql-escape.js";
|
|
5
4
|
import { pgSanitizeText } from "./pg-safe-json.js";
|
|
6
5
|
import { toIso as iso } from "./sql-row-helpers.js";
|
|
7
6
|
import { recordFailOpen } from "../observability/fail-open.js";
|
|
8
7
|
import { createObjectColumnReader, decodeJsonColumn, decodeNullableJsonColumn, foldJsonColumn, isJsonColumnBodyProblem, jsonColumnText, readJsonObjectColumn, readNonNullJsonValueColumn } from "./sql-json-column.js";
|
|
9
|
-
import { RUN_HOLDER_DEATH_CODES, RUN_STALLED_ERROR, settledLegObservationOf } from "./store-contracts.js";
|
|
8
|
+
import { RUN_HOLDER_DEATH_CODES, RUN_STALLED_ERROR, RUN_STALL_DEFAULT_WIRING, RUN_STALL_VERDICT_UNLANDED_TAG, isParkedRunStatus, runLivenessOf, settledLegObservationOf } from "./store-contracts.js";
|
|
10
9
|
import { notifyRunTerminal, runTerminalLogLevel } from "../observability/run-terminal.js";
|
|
11
10
|
import { mysqlDriver, pgDriver, dialectJsonEncoder, SQL_DB_NOW_MS, sqlDbNowMs } from "./sql-driver.js";
|
|
12
11
|
import { isDupKeyError } from "./sql-errors.js";
|
|
12
|
+
import { readDeletingTokenOn } from "./session-ext-table.js";
|
|
13
13
|
import { readRunIdentityCells, runIdentityCells } from "../identity-source.js";
|
|
14
14
|
import { decideSpaceCommitAbandon, decideSpaceCommitClaim, fenceSpaceCommitAtTerminal, spaceCommitStateOf } from "../workspace-space-commit.js";
|
|
15
15
|
function runRowCols(dialect) {
|
|
@@ -20,6 +20,17 @@ const readPersistedTaskResultBody = createObjectColumnReader();
|
|
|
20
20
|
function decodeResultColumn(v, taskId) {
|
|
21
21
|
return decodeNullableJsonColumn(v, readPersistedTaskResultBody, `task_run.result for run ${taskId}`);
|
|
22
22
|
}
|
|
23
|
+
export function decodeRunResultCellM44(v, taskId) {
|
|
24
|
+
try {
|
|
25
|
+
return decodeResultColumn(v, taskId) ?? null;
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
if (!isJsonColumnBodyProblem(e))
|
|
29
|
+
throw e;
|
|
30
|
+
recordFailOpen("server.run-store.m44-result-unreadable", e.message);
|
|
31
|
+
return "unreadable";
|
|
32
|
+
}
|
|
33
|
+
}
|
|
23
34
|
function refusing(what, read) {
|
|
24
35
|
try {
|
|
25
36
|
return read();
|
|
@@ -42,10 +53,19 @@ function usageResultBody(v) {
|
|
|
42
53
|
function decodeEventDataColumn(v, taskId, seq) {
|
|
43
54
|
return decodeNullableJsonColumn(v, readNonNullJsonValueColumn, `task_event.data for run ${taskId} seq ${seq}`);
|
|
44
55
|
}
|
|
56
|
+
function m44ErrorCodeReadSide(status, result, column) {
|
|
57
|
+
if (status === "running")
|
|
58
|
+
return null;
|
|
59
|
+
if (column !== null || !isParkedRunStatus(status))
|
|
60
|
+
return column;
|
|
61
|
+
return persistedPlaneOf(result).errorCode ?? null;
|
|
62
|
+
}
|
|
45
63
|
export class SqlRunStore {
|
|
46
64
|
db;
|
|
47
|
-
|
|
65
|
+
stall;
|
|
66
|
+
constructor(db, stall = RUN_STALL_DEFAULT_WIRING) {
|
|
48
67
|
this.db = db;
|
|
68
|
+
this.stall = stall;
|
|
49
69
|
}
|
|
50
70
|
q(mysql, pg) {
|
|
51
71
|
return this.db.dialect === "mysql" ? mysql : pg;
|
|
@@ -58,6 +78,14 @@ export class SqlRunStore {
|
|
|
58
78
|
}
|
|
59
79
|
async tx(fn) {
|
|
60
80
|
const conn = await this.db.connect();
|
|
81
|
+
try {
|
|
82
|
+
await this.txOn(conn, fn);
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
conn.release();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async txOn(conn, fn) {
|
|
61
89
|
try {
|
|
62
90
|
await conn.begin();
|
|
63
91
|
await fn(conn);
|
|
@@ -71,18 +99,26 @@ export class SqlRunStore {
|
|
|
71
99
|
}
|
|
72
100
|
throw err;
|
|
73
101
|
}
|
|
102
|
+
}
|
|
103
|
+
async createRun(taskId, sessionId, owner, instanceId, meta = {}) {
|
|
104
|
+
const conn = await this.db.connect();
|
|
105
|
+
try {
|
|
106
|
+
const first = await this.createRunOn(conn, taskId, sessionId, owner, instanceId, meta);
|
|
107
|
+
if (first.activeTaskId === undefined || !(await this.settleDueHolderOn(conn, first.activeTaskId)))
|
|
108
|
+
return first;
|
|
109
|
+
return await this.createRunOn(conn, taskId, sessionId, owner, instanceId, meta);
|
|
110
|
+
}
|
|
74
111
|
finally {
|
|
75
112
|
conn.release();
|
|
76
113
|
}
|
|
77
114
|
}
|
|
78
|
-
async
|
|
115
|
+
async createRunOn(conn, taskId, sessionId, owner, instanceId, meta) {
|
|
79
116
|
const idemKey = meta.idem?.key ?? null;
|
|
80
|
-
const conn = await this.db.connect();
|
|
81
117
|
let stage = "claim";
|
|
82
118
|
try {
|
|
83
119
|
await conn.begin();
|
|
84
120
|
const { rows: root } = await conn.query(this.q("SELECT session_id FROM session_meta WHERE session_id = ? FOR UPDATE", "SELECT session_id FROM session_meta WHERE session_id = $1 FOR UPDATE"), [sessionId]);
|
|
85
|
-
if (root.length === 0) {
|
|
121
|
+
if (root.length === 0 || (await readDeletingTokenOn(async (sql, values) => (await conn.query(sql, [...values])).rows, this.db.dialect, sessionId)) !== null) {
|
|
86
122
|
await conn.rollback();
|
|
87
123
|
return { ok: false, sessionAbsent: true };
|
|
88
124
|
}
|
|
@@ -137,9 +173,62 @@ export class SqlRunStore {
|
|
|
137
173
|
}
|
|
138
174
|
throw err;
|
|
139
175
|
}
|
|
140
|
-
|
|
141
|
-
|
|
176
|
+
}
|
|
177
|
+
async settleDueHolderOn(conn, holderTaskId) {
|
|
178
|
+
const { rows } = await conn.query(this.q("SELECT status, updated_at FROM task_run WHERE task_id = ?", "SELECT status, updated_at FROM task_run WHERE task_id = $1"), [holderTaskId]);
|
|
179
|
+
const row = rows[0];
|
|
180
|
+
if (row === undefined)
|
|
181
|
+
return false;
|
|
182
|
+
const nowMs = Date.now();
|
|
183
|
+
const windowMs = this.stall.windowMs();
|
|
184
|
+
if (runLivenessOf({ status: String(row.status), updatedAt: iso(row.updated_at) }, nowMs, windowMs) !== "due")
|
|
185
|
+
return false;
|
|
186
|
+
let landed = 0;
|
|
187
|
+
try {
|
|
188
|
+
await this.txOn(conn, async (c) => {
|
|
189
|
+
landed = await this.landStallVerdicts(c, new Date(nowMs - windowMs), holderTaskId);
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
recordFailOpen(RUN_STALL_VERDICT_UNLANDED_TAG, err instanceof Error ? err.message : String(err));
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
if (landed > 0)
|
|
197
|
+
this.stall.onVerdicts(landed);
|
|
198
|
+
return landed > 0;
|
|
199
|
+
}
|
|
200
|
+
async landStallVerdicts(conn, cutoff, taskId) {
|
|
201
|
+
const one = taskId !== undefined;
|
|
202
|
+
const { affected } = await conn.query(this.q(`UPDATE task_run SET status = 'failed', result = NULL, error = '${RUN_STALLED_ERROR}', error_code = '${RUN_HOLDER_DEATH_CODES.stalled}', updated_at = ? ` +
|
|
203
|
+
`WHERE status = 'running' AND updated_at < ?${one ? " AND task_id = ?" : ""}`, `UPDATE task_run SET status = 'failed', result = NULL, error = '${RUN_STALLED_ERROR}', error_code = '${RUN_HOLDER_DEATH_CODES.stalled}', updated_at = $1 ` +
|
|
204
|
+
`WHERE status = 'running' AND updated_at < $2${one ? " AND task_id = $3" : ""}`), one ? [new Date(), cutoff, taskId] : [new Date(), cutoff]);
|
|
205
|
+
if (one) {
|
|
206
|
+
if (affected === 1)
|
|
207
|
+
await conn.query(this.q("DELETE FROM task_active WHERE task_id = ?", "DELETE FROM task_active WHERE task_id = $1"), [taskId]);
|
|
208
|
+
return affected;
|
|
142
209
|
}
|
|
210
|
+
await conn.query(this.q("DELETE ta FROM task_active ta JOIN task_run tr ON ta.task_id = tr.task_id WHERE tr.status NOT IN ('running','suspended','needs_review')", "DELETE FROM task_active ta USING task_run tr WHERE ta.task_id = tr.task_id AND tr.status NOT IN ('running','suspended','needs_review')"));
|
|
211
|
+
await conn.query(this.q("DELETE FROM task_active WHERE NOT EXISTS (SELECT 1 FROM task_run tr WHERE tr.task_id = task_active.task_id)", "DELETE FROM task_active WHERE NOT EXISTS (SELECT 1 FROM task_run tr WHERE tr.task_id = task_active.task_id)"));
|
|
212
|
+
return affected;
|
|
213
|
+
}
|
|
214
|
+
async observeRun(row) {
|
|
215
|
+
const nowMs = Date.now();
|
|
216
|
+
const windowMs = this.stall.windowMs();
|
|
217
|
+
if (runLivenessOf(row, nowMs, windowMs) !== "due")
|
|
218
|
+
return row;
|
|
219
|
+
let landed = 0;
|
|
220
|
+
try {
|
|
221
|
+
await this.tx(async (conn) => {
|
|
222
|
+
landed = await this.landStallVerdicts(conn, new Date(nowMs - windowMs), row.taskId);
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
catch (err) {
|
|
226
|
+
recordFailOpen(RUN_STALL_VERDICT_UNLANDED_TAG, err instanceof Error ? err.message : String(err));
|
|
227
|
+
return row;
|
|
228
|
+
}
|
|
229
|
+
if (landed > 0)
|
|
230
|
+
this.stall.onVerdicts(landed);
|
|
231
|
+
return (await this.getRun(row.taskId)) ?? row;
|
|
143
232
|
}
|
|
144
233
|
async fillObjectivePreview(taskId, preview) {
|
|
145
234
|
await this.db.query(this.q("UPDATE task_run SET objective_preview = ? WHERE task_id = ? AND objective_preview IS NULL", "UPDATE task_run SET objective_preview = $1 WHERE task_id = $2 AND objective_preview IS NULL"), [this.db.dialect === "mysql" ? preview : pgSanitizeText(preview), taskId]);
|
|
@@ -161,7 +250,11 @@ export class SqlRunStore {
|
|
|
161
250
|
return Boolean(rows[0]?.preempt_requested);
|
|
162
251
|
}
|
|
163
252
|
async heartbeat(taskId, owner) {
|
|
164
|
-
await this.db.query(this.q("UPDATE task_run SET updated_at = ? WHERE task_id = ? AND owner <=> ? AND status = 'running'", "UPDATE task_run SET updated_at = $1 WHERE task_id = $2 AND owner IS NOT DISTINCT FROM $3 AND status = 'running'"), [new Date(), taskId, owner]);
|
|
253
|
+
const { affected } = await this.db.query(this.q("UPDATE task_run SET updated_at = ? WHERE task_id = ? AND owner <=> ? AND status = 'running'", "UPDATE task_run SET updated_at = $1 WHERE task_id = $2 AND owner IS NOT DISTINCT FROM $3 AND status = 'running'"), [new Date(), taskId, owner]);
|
|
254
|
+
if (affected > 0)
|
|
255
|
+
return true;
|
|
256
|
+
const { rows } = await this.db.query(this.q("SELECT status FROM task_run WHERE task_id = ?", "SELECT status FROM task_run WHERE task_id = $1"), [taskId]);
|
|
257
|
+
return rows[0] !== undefined && String(rows[0].status) === "running";
|
|
165
258
|
}
|
|
166
259
|
async appendEvent(taskId, seq, type, data) {
|
|
167
260
|
data = redactLedgerEventData(type, data);
|
|
@@ -175,7 +268,7 @@ export class SqlRunStore {
|
|
|
175
268
|
async setTerminal(taskId, status, result, error) {
|
|
176
269
|
result = sealRunRowResult(result);
|
|
177
270
|
error = error === null ? null : (redactErrorMessage(error) ?? null);
|
|
178
|
-
const errorCode =
|
|
271
|
+
const errorCode = runRowErrorCodeOf(result);
|
|
179
272
|
let won = false;
|
|
180
273
|
let observed;
|
|
181
274
|
await fenceSpaceCommitAtTerminal(taskId, async (spaceCommit) => {
|
|
@@ -272,14 +365,14 @@ export class SqlRunStore {
|
|
|
272
365
|
}
|
|
273
366
|
async setSuspended(taskId, result) {
|
|
274
367
|
const sealed = sealRunRowResult(result);
|
|
275
|
-
await this.db.query(this.q("UPDATE task_run SET status = 'suspended', result = ?, updated_at = ? WHERE task_id = ? AND status IN ('running','suspended')", "UPDATE task_run SET status = 'suspended', result = $1::jsonb,
|
|
368
|
+
await this.db.query(this.q("UPDATE task_run SET status = 'suspended', result = ?, error_code = ?, updated_at = ? WHERE task_id = ? AND status IN ('running','suspended')", "UPDATE task_run SET status = 'suspended', result = $1::jsonb, error_code = $2, updated_at = $3 WHERE task_id = $4 AND status IN ('running','suspended')"), [sealed == null ? null : this.json(sealed), runRowErrorCodeOf(sealed), new Date(), taskId]);
|
|
276
369
|
}
|
|
277
370
|
async setNeedsReview(taskId, result) {
|
|
278
371
|
const sealed = sealRunRowResult(result);
|
|
279
|
-
await this.db.query(this.q("UPDATE task_run SET status = 'needs_review', result = ?, updated_at = ? WHERE task_id = ? AND status IN ('running','needs_review')", "UPDATE task_run SET status = 'needs_review', result = $1::jsonb,
|
|
372
|
+
await this.db.query(this.q("UPDATE task_run SET status = 'needs_review', result = ?, error_code = ?, updated_at = ? WHERE task_id = ? AND status IN ('running','needs_review')", "UPDATE task_run SET status = 'needs_review', result = $1::jsonb, error_code = $2, updated_at = $3 WHERE task_id = $4 AND status IN ('running','needs_review')"), [sealed == null ? null : this.json(sealed), runRowErrorCodeOf(sealed), new Date(), taskId]);
|
|
280
373
|
}
|
|
281
374
|
async markResuming(taskId, instanceId) {
|
|
282
|
-
const { affected } = await this.db.query(this.q("UPDATE task_run SET status = 'running', cancel_requested = 0, preempt_requested = 0, result = NULL, instance_id = ?, updated_at = ? WHERE task_id = ? AND status IN ('suspended','needs_review')", "UPDATE task_run SET status = 'running', cancel_requested = 0, preempt_requested = 0, result = NULL, instance_id = $1, updated_at = $2 WHERE task_id = $3 AND status IN ('suspended','needs_review')"), [instanceId, new Date(), taskId]);
|
|
375
|
+
const { affected } = await this.db.query(this.q("UPDATE task_run SET status = 'running', cancel_requested = 0, preempt_requested = 0, result = NULL, error_code = NULL, instance_id = ?, updated_at = ? WHERE task_id = ? AND status IN ('suspended','needs_review')", "UPDATE task_run SET status = 'running', cancel_requested = 0, preempt_requested = 0, result = NULL, error_code = NULL, instance_id = $1, updated_at = $2 WHERE task_id = $3 AND status IN ('suspended','needs_review')"), [instanceId, new Date(), taskId]);
|
|
283
376
|
return affected === 1;
|
|
284
377
|
}
|
|
285
378
|
async whileHoldingClaim(sessionId, taskId, write) {
|
|
@@ -303,14 +396,15 @@ export class SqlRunStore {
|
|
|
303
396
|
return rows[0] ? String(rows[0].task_id) : undefined;
|
|
304
397
|
}
|
|
305
398
|
rowToRun(r) {
|
|
399
|
+
const result = refusing("serve a finished run as if it had produced nothing", () => decodeResultColumn(r.result, String(r.task_id))) ?? null;
|
|
306
400
|
return {
|
|
307
401
|
taskId: String(r.task_id),
|
|
308
402
|
sessionId: String(r.session_id),
|
|
309
403
|
owner: r.owner ?? null,
|
|
310
404
|
status: r.status,
|
|
311
|
-
result
|
|
405
|
+
result,
|
|
312
406
|
error: r.error ?? null,
|
|
313
|
-
errorCode: r.error_code ?? null,
|
|
407
|
+
errorCode: m44ErrorCodeReadSide(String(r.status), result, r.error_code ?? null),
|
|
314
408
|
jobId: r.job_id ?? null,
|
|
315
409
|
source: r.source ?? null,
|
|
316
410
|
identity: readRunIdentityCells(r.identity_source, r.identity_scope, r.identity_principal_inc),
|
|
@@ -424,89 +518,9 @@ export class SqlRunStore {
|
|
|
424
518
|
const taskId = String(r.task_id);
|
|
425
519
|
return settledLegObservationOf(taskId, refusing("read a settled leg as if it had observed no memory", () => decodeResultColumn(r.result, taskId)) ?? null);
|
|
426
520
|
}
|
|
427
|
-
async
|
|
428
|
-
if (this.db.dialect === "mysql") {
|
|
429
|
-
const params = [];
|
|
430
|
-
let innerWhere = "";
|
|
431
|
-
if (opts.owner !== undefined) {
|
|
432
|
-
innerWhere = opts.includeUnowned ? " WHERE (owner = ? OR owner IS NULL)" : " WHERE owner = ?";
|
|
433
|
-
params.push(opts.owner);
|
|
434
|
-
}
|
|
435
|
-
const outer = ["rn = 1"];
|
|
436
|
-
if (opts.q) {
|
|
437
|
-
outer.push("EXISTS (SELECT 1 FROM task_run tr WHERE tr.session_id = t.session_id AND LOWER(tr.objective_preview) LIKE LOWER(?) ESCAPE '\\\\')");
|
|
438
|
-
params.push(`%${escapeLike(opts.q)}%`);
|
|
439
|
-
}
|
|
440
|
-
if (opts.cursor) {
|
|
441
|
-
outer.push("(last_activity < ? OR (last_activity = ? AND session_id < ?))");
|
|
442
|
-
params.push(new Date(opts.cursor.lastActivityAt), new Date(opts.cursor.lastActivityAt), opts.cursor.sessionId);
|
|
443
|
-
}
|
|
444
|
-
const sql = "SELECT session_id, owner, task_id, last_activity, first_activity, run_count, objective_preview, status, last_task_run_id FROM (" +
|
|
445
|
-
"SELECT session_id, owner, task_id, objective_preview, status, JSON_UNQUOTE(JSON_EXTRACT(result, '$.runId')) AS last_task_run_id," +
|
|
446
|
-
" ROW_NUMBER() OVER (PARTITION BY session_id ORDER BY created_at DESC, task_id DESC) AS rn," +
|
|
447
|
-
" MAX(created_at) OVER (PARTITION BY session_id) AS last_activity," +
|
|
448
|
-
" MIN(created_at) OVER (PARTITION BY session_id) AS first_activity," +
|
|
449
|
-
" COUNT(*) OVER (PARTITION BY session_id) AS run_count" +
|
|
450
|
-
" FROM task_run" + innerWhere + ") t WHERE " + outer.join(" AND ") +
|
|
451
|
-
" ORDER BY last_activity DESC, session_id DESC LIMIT ?";
|
|
452
|
-
params.push(opts.limit);
|
|
453
|
-
const { rows } = await this.db.query(sql, params);
|
|
454
|
-
return rows.map((r) => this.rowToSession(r));
|
|
455
|
-
}
|
|
456
|
-
const params = [];
|
|
457
|
-
const p = (v) => {
|
|
458
|
-
params.push(v);
|
|
459
|
-
return `$${params.length}`;
|
|
460
|
-
};
|
|
461
|
-
const innerWhere = opts.owner !== undefined ? (opts.includeUnowned ? ` WHERE (owner = ${p(opts.owner)} OR owner IS NULL)` : ` WHERE owner = ${p(opts.owner)}`) : "";
|
|
462
|
-
const outer = ["rn = 1"];
|
|
463
|
-
if (opts.q)
|
|
464
|
-
outer.push(`EXISTS (SELECT 1 FROM task_run tr WHERE tr.session_id = t.session_id AND LOWER(tr.objective_preview) LIKE LOWER(${p(`%${escapeLike(opts.q)}%`)}) ESCAPE '\\')`);
|
|
465
|
-
if (opts.cursor) {
|
|
466
|
-
const a = p(new Date(opts.cursor.lastActivityAt));
|
|
467
|
-
const b = p(new Date(opts.cursor.lastActivityAt));
|
|
468
|
-
const sid = p(opts.cursor.sessionId);
|
|
469
|
-
outer.push(`(last_activity < ${a} OR (last_activity = ${b} AND session_id < ${sid}))`);
|
|
470
|
-
}
|
|
471
|
-
const sql = "SELECT session_id, owner, task_id, last_activity, first_activity, run_count, objective_preview, status, last_task_run_id FROM (" +
|
|
472
|
-
"SELECT session_id, owner, task_id, objective_preview, status, result ->> 'runId' AS last_task_run_id," +
|
|
473
|
-
" ROW_NUMBER() OVER (PARTITION BY session_id ORDER BY created_at DESC, task_id DESC) AS rn," +
|
|
474
|
-
" MAX(created_at) OVER (PARTITION BY session_id) AS last_activity," +
|
|
475
|
-
" MIN(created_at) OVER (PARTITION BY session_id) AS first_activity," +
|
|
476
|
-
" COUNT(*) OVER (PARTITION BY session_id) AS run_count" +
|
|
477
|
-
" FROM task_run" + innerWhere + ") t WHERE " + outer.join(" AND ") +
|
|
478
|
-
` ORDER BY last_activity DESC, session_id DESC LIMIT ${p(opts.limit)}`;
|
|
479
|
-
const { rows } = await this.db.query(sql, params);
|
|
480
|
-
return rows.map((r) => this.rowToSession(r));
|
|
481
|
-
}
|
|
482
|
-
rowToSession(r) {
|
|
483
|
-
const lastTaskRunId = r.last_task_run_id;
|
|
484
|
-
return {
|
|
485
|
-
sessionId: String(r.session_id),
|
|
486
|
-
owner: r.owner ?? null,
|
|
487
|
-
lastActivityAt: iso(r.last_activity),
|
|
488
|
-
firstActivityAt: iso(r.first_activity),
|
|
489
|
-
runCount: Number(r.run_count),
|
|
490
|
-
objectivePreview: r.objective_preview ?? null,
|
|
491
|
-
lastStatus: String(r.status),
|
|
492
|
-
lastRunId: r.task_id ?? null,
|
|
493
|
-
...(typeof lastTaskRunId === "string" && lastTaskRunId !== "" ? { lastTaskRunId } : {}),
|
|
494
|
-
title: null,
|
|
495
|
-
pinned: false,
|
|
496
|
-
};
|
|
497
|
-
}
|
|
498
|
-
async deleteBySession(sessionId, expectedSessionOwner) {
|
|
521
|
+
async deleteBySession(sessionId) {
|
|
499
522
|
let result = { removed: 0 };
|
|
500
523
|
await this.tx(async (conn) => {
|
|
501
|
-
const { rows: meta } = await conn.query(this.q("SELECT owner FROM session_meta WHERE session_id = ? FOR UPDATE", "SELECT owner FROM session_meta WHERE session_id = $1 FOR UPDATE"), [sessionId]);
|
|
502
|
-
const metaRow = meta[0];
|
|
503
|
-
if (metaRow === undefined || (metaRow.owner ?? null) !== expectedSessionOwner)
|
|
504
|
-
return;
|
|
505
|
-
const { rows: active } = await conn.query(this.q("SELECT task_id FROM task_active WHERE session_id = ? FOR UPDATE", "SELECT task_id FROM task_active WHERE session_id = $1 FOR UPDATE"), [sessionId]);
|
|
506
|
-
if (active[0]) {
|
|
507
|
-
result = { active: String(active[0].task_id) };
|
|
508
|
-
return;
|
|
509
|
-
}
|
|
510
524
|
await conn.query(this.q("DELETE te FROM task_event te JOIN task_run tr ON te.task_id = tr.task_id WHERE tr.session_id = ?", "DELETE FROM task_event te USING task_run tr WHERE te.task_id = tr.task_id AND tr.session_id = $1"), [sessionId]);
|
|
511
525
|
await conn.query(this.q("DELETE ta FROM task_active ta JOIN task_run tr ON ta.task_id = tr.task_id WHERE tr.session_id = ?", "DELETE FROM task_active ta USING task_run tr WHERE ta.task_id = tr.task_id AND tr.session_id = $1"), [sessionId]);
|
|
512
526
|
const { affected } = await conn.query(this.q("DELETE FROM task_run WHERE session_id = ?", "DELETE FROM task_run WHERE session_id = $1"), [sessionId]);
|
|
@@ -553,17 +567,14 @@ export class SqlRunStore {
|
|
|
553
567
|
ts: iso(r.ts),
|
|
554
568
|
}));
|
|
555
569
|
}
|
|
556
|
-
async reapStale(
|
|
557
|
-
const cutoff = new Date(Date.now() -
|
|
570
|
+
async reapStale() {
|
|
571
|
+
const cutoff = new Date(Date.now() - this.stall.windowMs());
|
|
558
572
|
let reaped = 0;
|
|
559
573
|
await this.tx(async (conn) => {
|
|
560
|
-
|
|
561
|
-
"WHERE status = 'running' AND updated_at < ?", `UPDATE task_run SET status = 'failed', result = NULL, error = '${RUN_STALLED_ERROR}', error_code = '${RUN_HOLDER_DEATH_CODES.stalled}', updated_at = $1 ` +
|
|
562
|
-
"WHERE status = 'running' AND updated_at < $2"), [new Date(), cutoff]);
|
|
563
|
-
reaped = affected;
|
|
564
|
-
await conn.query(this.q("DELETE ta FROM task_active ta JOIN task_run tr ON ta.task_id = tr.task_id WHERE tr.status NOT IN ('running','suspended','needs_review')", "DELETE FROM task_active ta USING task_run tr WHERE ta.task_id = tr.task_id AND tr.status NOT IN ('running','suspended','needs_review')"));
|
|
565
|
-
await conn.query(this.q("DELETE FROM task_active WHERE NOT EXISTS (SELECT 1 FROM task_run tr WHERE tr.task_id = task_active.task_id)", "DELETE FROM task_active WHERE NOT EXISTS (SELECT 1 FROM task_run tr WHERE tr.task_id = task_active.task_id)"));
|
|
574
|
+
reaped = await this.landStallVerdicts(conn, cutoff);
|
|
566
575
|
});
|
|
576
|
+
if (reaped > 0)
|
|
577
|
+
this.stall.onVerdicts(reaped);
|
|
567
578
|
return reaped;
|
|
568
579
|
}
|
|
569
580
|
async reapSuspended(olderThanMs) {
|
|
@@ -572,9 +583,9 @@ export class SqlRunStore {
|
|
|
572
583
|
await this.tx(async (conn) => {
|
|
573
584
|
const { affected } = await conn.query(this.q("UPDATE task_run tr SET tr.status = 'failed', tr.result = NULL, tr.error = 'approval expired before decision', tr.error_code = 'approval.expired', tr.updated_at = ? " +
|
|
574
585
|
"WHERE tr.status = 'suspended' AND tr.updated_at < ? " +
|
|
575
|
-
"AND NOT EXISTS (SELECT 1 FROM checkpoint c WHERE c.
|
|
586
|
+
"AND NOT EXISTS (SELECT 1 FROM checkpoint c WHERE c.host_session_id = tr.session_id AND c.status = 'pending')", "UPDATE task_run AS tr SET status = 'failed', result = NULL, error = 'approval expired before decision', error_code = 'approval.expired', updated_at = $1 " +
|
|
576
587
|
"WHERE tr.status = 'suspended' AND tr.updated_at < $2 " +
|
|
577
|
-
"AND NOT EXISTS (SELECT 1 FROM checkpoint c WHERE c.
|
|
588
|
+
"AND NOT EXISTS (SELECT 1 FROM checkpoint c WHERE c.host_session_id = tr.session_id AND c.status = 'pending')"), [new Date(), cutoff]);
|
|
578
589
|
reaped = affected;
|
|
579
590
|
await conn.query(this.q("DELETE ta FROM task_active ta JOIN task_run tr ON ta.task_id = tr.task_id WHERE tr.status NOT IN ('running','suspended','needs_review')", "DELETE FROM task_active ta USING task_run tr WHERE ta.task_id = tr.task_id AND tr.status NOT IN ('running','suspended','needs_review')"));
|
|
580
591
|
});
|
|
@@ -585,11 +596,11 @@ export class SqlRunStore {
|
|
|
585
596
|
await this.tx(async (conn) => {
|
|
586
597
|
const { affected } = await conn.query(this.q("UPDATE task_run tr SET tr.status = 'failed', tr.result = NULL, tr.error = 'approval expired before decision', tr.error_code = 'approval.expired', tr.updated_at = ? " +
|
|
587
598
|
"WHERE tr.status IN ('suspended','needs_review') " +
|
|
588
|
-
"AND EXISTS (SELECT 1 FROM checkpoint ce WHERE ce.
|
|
589
|
-
"AND NOT EXISTS (SELECT 1 FROM checkpoint cp WHERE cp.
|
|
599
|
+
"AND EXISTS (SELECT 1 FROM checkpoint ce WHERE ce.host_session_id = tr.session_id AND ce.status = 'expired') " +
|
|
600
|
+
"AND NOT EXISTS (SELECT 1 FROM checkpoint cp WHERE cp.host_session_id = tr.session_id AND cp.status = 'pending')", "UPDATE task_run AS tr SET status = 'failed', result = NULL, error = 'approval expired before decision', error_code = 'approval.expired', updated_at = $1 " +
|
|
590
601
|
"WHERE tr.status IN ('suspended','needs_review') " +
|
|
591
|
-
"AND EXISTS (SELECT 1 FROM checkpoint ce WHERE ce.
|
|
592
|
-
"AND NOT EXISTS (SELECT 1 FROM checkpoint cp WHERE cp.
|
|
602
|
+
"AND EXISTS (SELECT 1 FROM checkpoint ce WHERE ce.host_session_id = tr.session_id AND ce.status = 'expired') " +
|
|
603
|
+
"AND NOT EXISTS (SELECT 1 FROM checkpoint cp WHERE cp.host_session_id = tr.session_id AND cp.status = 'pending')"), [new Date()]);
|
|
593
604
|
reaped = affected;
|
|
594
605
|
await conn.query(this.q("DELETE ta FROM task_active ta JOIN task_run tr ON ta.task_id = tr.task_id WHERE tr.status NOT IN ('running','suspended','needs_review')", "DELETE FROM task_active ta USING task_run tr WHERE ta.task_id = tr.task_id AND tr.status NOT IN ('running','suspended','needs_review')"));
|
|
595
606
|
});
|
|
@@ -597,13 +608,13 @@ export class SqlRunStore {
|
|
|
597
608
|
}
|
|
598
609
|
}
|
|
599
610
|
export class TiDBRunStore extends SqlRunStore {
|
|
600
|
-
constructor(pool) {
|
|
601
|
-
super(mysqlDriver(pool));
|
|
611
|
+
constructor(pool, stall) {
|
|
612
|
+
super(mysqlDriver(pool), stall);
|
|
602
613
|
}
|
|
603
614
|
}
|
|
604
615
|
export class PgRunStore extends SqlRunStore {
|
|
605
|
-
constructor(pool) {
|
|
606
|
-
super(pgDriver(pool));
|
|
616
|
+
constructor(pool, stall) {
|
|
617
|
+
super(pgDriver(pool), stall);
|
|
607
618
|
}
|
|
608
619
|
}
|
|
609
620
|
//# sourceMappingURL=run-store-sql.js.map
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
* the second as the first turns a missing bucket into a silently empty workspace on every run. The ONLY evidence of a missing bucket is
|
|
7
7
|
* a 404 whose body carries the S3 error code `NoSuchBucket`: a bare 404, a 404 from a proxy or a wrong path, a 403 (credentials that
|
|
8
8
|
* cannot list ≠ no bucket) and a 5xx prove nothing about the bucket. Every consumer asks this one predicate: the boot probe of a
|
|
9
|
-
* configured bucket (`MinioBlobBackend.probeBucket`)
|
|
9
|
+
* configured bucket (`MinioBlobBackend.probeBucket`), the runtime read of the workspace `latest` pointer, and a restore's archive GET whose 404 answer the
|
|
10
|
+
* pod hands back as it is (`remote-env-k8s.ts` — the pod never judges it).
|
|
10
11
|
*/
|
|
11
12
|
/** The code a run's refusal / operator line carries when the store answered "no such bucket" (the `workspace_snapshot_bucket_missing` line's `code`). */
|
|
12
13
|
export declare const SNAPSHOT_BUCKET_MISSING = "snapshot_bucket_missing";
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 车道沙箱回收腿的接口 —— 维护 tick(`boot/reapers.ts`)上**唯一一只**沙箱回收座:k8s 车道 = 沙箱 Pod 回收器({@link createSandboxPodReaper},`k8s-pod-reaper.ts`),
|
|
3
|
+
* local-docker 车道 = 无主容器回收器({@link createLocalDockerReaper},`local-docker-reaper.ts`)。一次部署只有一条执行车道,所以座只有一只、节拍只有一个
|
|
4
|
+
* ({@link SANDBOX_REAP_PERIOD_MS})、连败告警只有一个名;两条车道各自的判据与读数留在各自的模块里,这里只有 tick 要知道的那一点。
|
|
5
|
+
*/
|
|
6
|
+
/** 一个副本两轮沙箱回收之间的间隔。常量:起服后第一个维护 tick 即跑一轮(起服那一轮),此后每个周期一轮。 */
|
|
7
|
+
export declare const SANDBOX_REAP_PERIOD_MS: number;
|
|
8
|
+
/** run 店的窄读口(三只 run 店共有的 `getRun`):回收器按 run 行的终态判「这只沙箱还有没有主人」。 */
|
|
9
|
+
export interface SandboxReaperRunReader {
|
|
10
|
+
getRun(taskId: string): Promise<{
|
|
11
|
+
readonly status: string;
|
|
12
|
+
readonly updatedAt: string;
|
|
13
|
+
} | null | undefined>;
|
|
14
|
+
}
|
|
15
|
+
/** 一轮的公共读数(两条车道的轮次读数都是它的超集):列出来了没有 / 扫了几只 / 按各自闭集原因分的删与跳过计数。 */
|
|
16
|
+
export interface SandboxReapRound {
|
|
17
|
+
readonly listed: boolean;
|
|
18
|
+
readonly scanned: number;
|
|
19
|
+
readonly deleted: Readonly<Record<string, number | undefined>>;
|
|
20
|
+
readonly skipped: Readonly<Record<string, number | undefined>>;
|
|
21
|
+
}
|
|
22
|
+
/** 维护 tick 调的那一口:一轮 = 列举 → 逐只判 → 收被判无主的;不抛。`runs` 缺席 = 本部署没有 run 店(判不了 run 的沙箱一律不动)。 */
|
|
23
|
+
export interface SandboxReaper {
|
|
24
|
+
reapOnce(runs: SandboxReaperRunReader | undefined): Promise<SandboxReapRound>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=sandbox-reaper.d.ts.map
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { StoreBootRefusalError } from "./store-contracts.js";
|
|
2
|
+
/** 本条的拒启码(机读)。 */
|
|
3
|
+
export declare const SCENARIO_PREFIX_SWITCH_REFUSED_CODE = "config.scenario_prefix_switch_refused";
|
|
4
|
+
/** 本条在标记表(`one-time-migration-marker.ts`)里的那一行的键。 */
|
|
5
|
+
export declare const SCENARIO_PREFIX_MARKER_ID = "M42";
|
|
6
|
+
/** local 车道的标记文件(数据根下,文件名即本条)。 */
|
|
7
|
+
export declare const LOCAL_MARKER_FILE = "one-time-migration-M42.json";
|
|
8
|
+
/** 身份列的名字判据(建表句派生扫描面的唯一一条)。 */
|
|
9
|
+
export declare const IDENTITY_COLUMN_NAME: RegExp;
|
|
10
|
+
/** `LIKE` 的前缀模式(`!` 作转义符:两方言同义、不碰反斜杠的方言差;前缀里的 `_` 是通配符,必须转义)。 */
|
|
11
|
+
export declare const SCENARIO_PREFIX_LIKE: string;
|
|
12
|
+
/** 一处命中:来源(SQL = `表.列`;local = 店名)+ 以保留前缀开头的行数。 */
|
|
13
|
+
export interface ScenarioPrefixHit {
|
|
14
|
+
readonly source: string;
|
|
15
|
+
readonly rows: number;
|
|
16
|
+
}
|
|
17
|
+
/** 本条的读数 / 收据格(扫了几处来源;0 = 标记在场、没扫)。 */
|
|
18
|
+
export interface ScenarioPrefixReceipt {
|
|
19
|
+
scenarioPrefixSourcesScanned: number;
|
|
20
|
+
}
|
|
21
|
+
/** 拒因闭集:存量命中 / 零命中而更早版本的副本可能仍在服务(SQL 的停-迁-起)。 */
|
|
22
|
+
export type ScenarioPrefixRefusalReason = "stored_prefix" | "live_runs";
|
|
23
|
+
/** 判活读数(`live_runs` 那一拒带):判活窗内心跳过的 run 数与可以再起的最早时刻。 */
|
|
24
|
+
export interface ScenarioPrefixLiveRuns {
|
|
25
|
+
readonly liveRuns: number;
|
|
26
|
+
readonly windowSec: number;
|
|
27
|
+
readonly restartAfter: string;
|
|
28
|
+
readonly after: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* M42 的起服拒。具名类型 + 机读码 + 拒因;继承 {@link StoreBootRefusalError}(SQL 开库的等待窗不重试它;隐式 local 的降级臂不吞)。一个字节没改(扫描只读,标记没写)。
|
|
32
|
+
* · `stored_prefix` —— 存量里有以保留前缀开头的身份(`hits` 逐来源点名);
|
|
33
|
+
* · `live_runs` —— 零命中,但判活窗内仍有 run 在心跳:更早版本的副本可能还在服务,扫描之后它还会收下这类身份 ⇒ 全停之后再起(`live` 带时刻)。
|
|
34
|
+
*/
|
|
35
|
+
export declare class ScenarioPrefixSwitchRefusedError extends StoreBootRefusalError {
|
|
36
|
+
readonly reason: ScenarioPrefixRefusalReason;
|
|
37
|
+
readonly hits: readonly ScenarioPrefixHit[];
|
|
38
|
+
readonly live?: ScenarioPrefixLiveRuns | undefined;
|
|
39
|
+
readonly code = "config.scenario_prefix_switch_refused";
|
|
40
|
+
constructor(reason: ScenarioPrefixRefusalReason, hits: readonly ScenarioPrefixHit[], live?: ScenarioPrefixLiveRuns | undefined);
|
|
41
|
+
private static sentence;
|
|
42
|
+
}
|
|
43
|
+
/** local 腿的一处来源:店名 + 它的计数口(以保留前缀开头的属主行数)。 */
|
|
44
|
+
export interface LocalScenarioPrefixSource {
|
|
45
|
+
readonly source: string;
|
|
46
|
+
readonly rows: () => number | Promise<number>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 🔴 M42 的 local 腿(唯一调用点 `LocalBackend.runOneTimeMigrations`,第一步):标记文件在 ⇒ 0(零扫描);否则逐店计数,一处命中 ⇒ {@link ScenarioPrefixSwitchRefusedError}
|
|
50
|
+
* (一字节没写);零命中 ⇒ 原子写标记文件(`required`:标记没落盘就不算扫过 —— 写不进 ⇒ 抛,起服拒,下一次起服重扫)。返回扫了几处来源。
|
|
51
|
+
* 数据根独占(根锁):同一只根上没有第二个起服者、也没有更早版本的副本与本次并跑 ⇒ 没有 SQL 腿的判活守卫。
|
|
52
|
+
*/
|
|
53
|
+
export declare function switchLocalScenarioPrefixM42(markerPath: string, sources: readonly LocalScenarioPrefixSource[]): Promise<number>;
|
|
54
|
+
//# sourceMappingURL=scenario-prefix-switch-m42.d.ts.map
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { SCENARIO_SUBJECT_PREFIX } from "../owner-brands.js";
|
|
3
|
+
import { atomicWriteFileSync } from "./owner-only-file-mode.js";
|
|
4
|
+
import { StoreBootRefusalError } from "./store-contracts.js";
|
|
5
|
+
export const SCENARIO_PREFIX_SWITCH_REFUSED_CODE = "config.scenario_prefix_switch_refused";
|
|
6
|
+
export const SCENARIO_PREFIX_MARKER_ID = "M42";
|
|
7
|
+
export const LOCAL_MARKER_FILE = "one-time-migration-M42.json";
|
|
8
|
+
export const IDENTITY_COLUMN_NAME = /(^|_)(owner|scope|principal|subject)$/;
|
|
9
|
+
export const SCENARIO_PREFIX_LIKE = `${SCENARIO_SUBJECT_PREFIX.replace(/[!%_]/g, "!$&")}%`;
|
|
10
|
+
export class ScenarioPrefixSwitchRefusedError extends StoreBootRefusalError {
|
|
11
|
+
reason;
|
|
12
|
+
hits;
|
|
13
|
+
live;
|
|
14
|
+
code = SCENARIO_PREFIX_SWITCH_REFUSED_CODE;
|
|
15
|
+
constructor(reason, hits, live) {
|
|
16
|
+
super(ScenarioPrefixSwitchRefusedError.sentence(reason, hits, live));
|
|
17
|
+
this.reason = reason;
|
|
18
|
+
this.hits = hits;
|
|
19
|
+
this.live = live;
|
|
20
|
+
this.name = "ScenarioPrefixSwitchRefusedError";
|
|
21
|
+
}
|
|
22
|
+
static sentence(reason, hits, live) {
|
|
23
|
+
switch (reason) {
|
|
24
|
+
case "stored_prefix":
|
|
25
|
+
return (`${SCENARIO_PREFIX_SWITCH_REFUSED_CODE}: stored identities start with the reserved prefix "${SCENARIO_SUBJECT_PREFIX}" (` +
|
|
26
|
+
hits.map((h) => `${h.source}: ${h.rows} row${h.rows === 1 ? "" : "s"}`).join(", ") +
|
|
27
|
+
`). This version reads that prefix as a scenario of a person, so these rows would be attributed to another person; it refuses to start rather than misread them. ` +
|
|
28
|
+
`Nothing was changed. Rename or delete those identities (the identity boundary now rejects principals with this prefix), then restart — ` +
|
|
29
|
+
`the check runs until it finds none, then records a marker in the store and does not run again.`);
|
|
30
|
+
case "live_runs":
|
|
31
|
+
return (`${SCENARIO_PREFIX_SWITCH_REFUSED_CODE}: no stored identity starts with the reserved prefix "${SCENARIO_SUBJECT_PREFIX}", but ${live?.liveRuns ?? 0} run(s) heartbeated on this database ` +
|
|
32
|
+
`within the last ${live?.windowSec ?? 0}s — a replica of an earlier version may still be serving, and it accepts principals with that prefix, so a clean check now would not stay clean. ` +
|
|
33
|
+
`Nothing was changed and no marker was written. Stop every replica of the earlier version, then start this version after ${live?.after ?? "the heartbeat window"} (this check is stop-then-start, not rolling).`);
|
|
34
|
+
default: {
|
|
35
|
+
const unhandled = reason;
|
|
36
|
+
throw new Error(`scenario-prefix-switch: unknown refusal reason ${String(unhandled)}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export async function switchLocalScenarioPrefixM42(markerPath, sources) {
|
|
42
|
+
if (existsSync(markerPath))
|
|
43
|
+
return 0;
|
|
44
|
+
const hits = [];
|
|
45
|
+
for (const s of sources) {
|
|
46
|
+
const rows = await s.rows();
|
|
47
|
+
if (rows > 0)
|
|
48
|
+
hits.push({ source: s.source, rows });
|
|
49
|
+
}
|
|
50
|
+
if (hits.length > 0)
|
|
51
|
+
throw new ScenarioPrefixSwitchRefusedError("stored_prefix", hits);
|
|
52
|
+
atomicWriteFileSync(markerPath, JSON.stringify({ migration: SCENARIO_PREFIX_MARKER_ID, markedAt: new Date().toISOString() }), { durability: "required" });
|
|
53
|
+
return sources.length;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=scenario-prefix-switch-m42.js.map
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { SchedulerError } from "@sema-agent/core";
|
|
2
2
|
import type { SchedulerCapability, ScheduledIntent, SchedulerContext, ScheduledTaskId, ScheduledTaskSummary } from "@sema-agent/core";
|
|
3
3
|
import type { SchedulerParseWarning, SchedulerRecord } from "@sema-agent/settings-schema/scheduler-store";
|
|
4
|
+
import { type ConfigDirTrustHost } from "../config-dir-trust.js";
|
|
4
5
|
export type { SchedulerRecord };
|
|
5
6
|
/** core `Result<T,E>` shape (harness/types) — `{ok:true,value} | {ok:false,error}`. */
|
|
6
7
|
type Result<T, E> = {
|
|
@@ -31,6 +32,11 @@ export declare function validateIntent(intent: ScheduledIntent, caps: Caps, nowM
|
|
|
31
32
|
export declare function defaultSchedulerStorePath(config: {
|
|
32
33
|
readonly agentConfigDir?: string;
|
|
33
34
|
}): string;
|
|
35
|
+
/** {@link FileSchedulerBackend} 读写之前目录信任判官要的两件:声明的属主(`CONFIG_LOCAL_OWNER_UID`,配置席 `configLocalOwnerUid`)+ 宿主事实(测试注入;缺席 = 本进程)。 */
|
|
36
|
+
export interface SchedulerStoreTrust {
|
|
37
|
+
readonly declaredOwnerUid: number | undefined;
|
|
38
|
+
readonly host?: ConfigDirTrustHost;
|
|
39
|
+
}
|
|
34
40
|
/** 调度店读写的日志口(logger 的子集)。 */
|
|
35
41
|
export interface SchedulerStoreLog {
|
|
36
42
|
warn(msg: string, meta?: Record<string, unknown>): void;
|
|
@@ -57,14 +63,23 @@ export declare class FileSchedulerBackend implements SchedulerCapability {
|
|
|
57
63
|
private readonly storePath;
|
|
58
64
|
private readonly now;
|
|
59
65
|
private readonly log;
|
|
66
|
+
private readonly trust;
|
|
60
67
|
/** `storePath` 必填:路径是装配层从配置定的事实(`SCHEDULER_STORE_PATH` ?? {@link defaultSchedulerStorePath}),本类不自己找缺省。
|
|
61
|
-
* `log` 必填:店的每次读都交回告警(读不懂的文件 / 被跳过的记录 / 读时改写),没有不出声的读法。
|
|
68
|
+
* `log` 必填:店的每次读都交回告警(读不懂的文件 / 被跳过的记录 / 读时改写),没有不出声的读法。
|
|
69
|
+
* `trust` 必填:每次读写之前的目录信任判官要的声明属主(`CONFIG_LOCAL_OWNER_UID`;与本地配置根同一张可信集),见 {@link FileSchedulerBackend.untrustedStore}。 */
|
|
62
70
|
constructor(opts: {
|
|
63
71
|
storePath: string;
|
|
64
72
|
log: SchedulerStoreLog;
|
|
73
|
+
trust: SchedulerStoreTrust;
|
|
65
74
|
caps?: Partial<Caps>;
|
|
66
75
|
now?: () => number;
|
|
67
76
|
});
|
|
77
|
+
/**
|
|
78
|
+
* 🔴 每次读写之前过本地配置根的**同一只**目录信任判官(读者 `scheduler-store`):常驻调度方按记录点名的主体起任务,别人改得动这只店(文件或路径上任一级
|
|
79
|
+
* 组 / 他人可写、属主不在可信集;店还不在而它所在的目录别人能在其中建它)就改得动起什么 ⇒ 这一次读写整条拒(`io`,一个字节都不读不写),
|
|
80
|
+
* 运维日志一行 `scheduler_store_untrusted` 带与本地配置根同族的拒句(点名路径与模式 / 属主与改法);模型面只拿一句不带路径的 `io` 拒。
|
|
81
|
+
*/
|
|
82
|
+
private untrustedStore;
|
|
68
83
|
/** 一次读改写(契约的唯一写原语)。`fn` 必须纯、可重放(并发写者落地时整段重放);返回 `null` = 不写。拿不到结果的三形各成一个 `io` 错。 */
|
|
69
84
|
private mutate;
|
|
70
85
|
schedule(intent: ScheduledIntent, ctx: SchedulerContext): Promise<Result<{
|