@sema-agent/server 7.147.0 → 7.148.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MIGRATION.md +1039 -24
- package/README.md +20 -7
- package/README.zh-CN.md +14 -8
- package/USAGE.md +380 -163
- package/deploy/sema-up/README.md +16 -5
- package/deploy/sema-up/chart/templates/NOTES.txt +1 -1
- package/deploy/sema-up/chart/templates/_helpers.tpl +20 -4
- package/deploy/sema-up/chart/values.yaml +3 -2
- package/deploy/sema-up/cluster-up.sh +74 -176
- package/deploy/sema-up/kube-up.sh +29 -49
- package/deploy/sema-up/lib/chart-run.sh +23 -0
- package/deploy/sema-up/lib/dataroot.sh +3 -3
- package/deploy/sema-up/lib/health.sh +62 -13
- package/deploy/sema-up/lib/helm-values-cluster.py +18 -0
- package/deploy/sema-up/lib/helm-values-kube.py +35 -0
- package/deploy/sema-up/lib/regcred.py +8 -0
- package/deploy/sema-up/lib/remote/helm-install.sh +3 -0
- package/deploy/sema-up/lib/remote/image-import.sh +6 -0
- package/deploy/sema-up/lib/remote/machine-precheck.sh +11 -0
- package/deploy/sema-up/lib/remote/region-probe.sh +3 -0
- package/deploy/sema-up/lib/remote/stack-ready.sh +26 -0
- package/deploy/sema-up/lib/remote/vxlan-guard.sh +8 -0
- package/deploy/sema-up/lib/render-stack.py +17 -0
- package/deploy/sema-up/lib/shell-text.sh +87 -0
- package/deploy/sema-up/lib/usage-flags.txt +10 -0
- package/deploy/sema-up/lib/usage-head.txt +1 -0
- package/deploy/sema-up/lib/usage-tail.txt +13 -0
- package/deploy/sema-up/preflight.sh +10 -8
- package/deploy/sema-up/sema-up.sh +14 -39
- package/deploy/sema-up/smoke.sh +7 -6
- package/deploy/sema-up/stack/compose.dataroot.yaml +3 -0
- package/deploy/sema-up/stack/compose.yaml +13 -1
- package/deploy/sema-up/stack/sema-stack-cluster.yaml +21 -0
- package/dist/adoption/plan.d.ts +24 -0
- package/dist/adoption/plan.js +53 -1
- package/dist/adoption/runner.d.ts +10 -1
- package/dist/adoption/runner.js +36 -16
- package/dist/adoption/wire.d.ts +3 -3
- package/dist/approval-card.d.ts +28 -30
- package/dist/approval-gate-currency.js +3 -2
- package/dist/approval-reconciler.d.ts +4 -13
- package/dist/approval-reconciler.js +2 -2
- package/dist/approval.d.ts +13 -11
- package/dist/approval.js +3 -3
- package/dist/audit.d.ts +10 -3
- package/dist/audit.js +15 -7
- package/dist/auth-bridge.d.ts +0 -14
- package/dist/auth-bridge.js +0 -7
- package/dist/auto-mode-face.d.ts +10 -7
- package/dist/auto-mode-face.js +7 -4
- package/dist/background-agent-name.d.ts +19 -1
- package/dist/background-agent-name.js +12 -2
- package/dist/background-session-reap.d.ts +1 -1
- package/dist/bake-runner/main.js +9 -6
- package/dist/bench/s1/arms.js +6 -5
- package/dist/bench/s1/live-deps.js +5 -2
- package/dist/bench/s1/run-firm.js +6 -5
- package/dist/bind-host.d.ts +25 -0
- package/dist/bind-host.js +25 -0
- package/dist/boot/adoption.d.ts +3 -0
- package/dist/boot/adoption.js +1 -0
- package/dist/boot/deployment-mods.d.ts +1 -1
- package/dist/boot/execution-env.d.ts +17 -7
- package/dist/boot/execution-env.js +37 -31
- package/dist/boot/exit-boundary.d.ts +2 -2
- package/dist/boot/exit-boundary.js +6 -5
- package/dist/boot/fatal-exit.d.ts +3 -5
- package/dist/boot/fatal-exit.js +2 -2
- package/dist/boot/leader.d.ts +15 -0
- package/dist/boot/leader.js +17 -15
- package/dist/boot/memory-consolidation.d.ts +37 -29
- package/dist/boot/memory-consolidation.js +11 -5
- package/dist/boot/org-memory.js +1 -1
- package/dist/boot/parked-revive-gate.js +2 -2
- package/dist/boot/reapers.d.ts +4 -3
- package/dist/boot/reapers.js +19 -16
- package/dist/boot/resolve-spec.d.ts +5 -3
- package/dist/boot/resolve-spec.js +55 -67
- package/dist/boot/retention-lane.d.ts +4 -4
- package/dist/boot/retention-lane.js +2 -2
- package/dist/boot/runner-deps.d.ts +28 -7
- package/dist/boot/runner-deps.js +11 -4
- package/dist/boot/runtime-caps.d.ts +2 -2
- package/dist/boot/runtime-caps.js +16 -2
- package/dist/boot/session-faces.d.ts +16 -7
- package/dist/boot/session-faces.js +114 -94
- package/dist/boot/shutdown.d.ts +5 -4
- package/dist/boot/shutdown.js +6 -4
- package/dist/boot/stage-01-config.js +9 -1
- package/dist/boot/stage-02-web-admin-pull.d.ts +1 -0
- package/dist/boot/stage-02-web-admin-pull.js +6 -1
- package/dist/boot/stage-03-store-backend.d.ts +3 -0
- package/dist/boot/stage-03-store-backend.js +4 -3
- package/dist/boot/stage-04-stores.d.ts +2 -0
- package/dist/boot/stage-04-stores.js +2 -2
- package/dist/boot/stage-05-execution-env.d.ts +7 -3
- package/dist/boot/stage-05-execution-env.js +2 -2
- package/dist/boot/stage-06-runners.d.ts +10 -12
- package/dist/boot/stage-06-runners.js +23 -15
- package/dist/boot/stage-07-capability-layer.d.ts +11 -8
- package/dist/boot/stage-07-capability-layer.js +5 -3
- package/dist/boot/stage-08-reapers.d.ts +11 -8
- package/dist/boot/stage-08-reapers.js +3 -3
- package/dist/boot/stage-09-leader.d.ts +12 -15
- package/dist/boot/stage-09-leader.js +12 -4
- package/dist/boot/stage-10-http-server.d.ts +12 -15
- package/dist/boot/stage-10-http-server.js +7 -4
- package/dist/boot/store-evidence.d.ts +20 -0
- package/dist/boot/store-evidence.js +13 -0
- package/dist/boot/stores.d.ts +3 -0
- package/dist/boot/stores.js +21 -10
- package/dist/boot/task-list-lane.d.ts +4 -4
- package/dist/boot/web-admin.d.ts +4 -2
- package/dist/boot/web-admin.js +55 -35
- package/dist/boot/webfetch-summarize-lane.d.ts +1 -1
- package/dist/boot-reclaim.d.ts +3 -1
- package/dist/boot-reclaim.js +1 -1
- package/dist/brain.d.ts +7 -18
- package/dist/brain.js +5 -17
- package/dist/budget.js +6 -6
- package/dist/capabilities/center-plugins.d.ts +7 -1
- package/dist/capabilities/center-plugins.js +32 -10
- package/dist/capabilities/center-wiring.js +1 -1
- package/dist/capabilities/composite-members.d.ts +2 -2
- package/dist/capabilities/composite-members.js +2 -2
- package/dist/capabilities/repo-tools.d.ts +2 -0
- package/dist/capabilities/repo-tools.js +14 -12
- package/dist/capabilities/scenarios.d.ts +6 -15
- package/dist/capabilities/scenarios.js +11 -16
- package/dist/capabilities/skills.d.ts +1 -1
- package/dist/capabilities/tool-defer.d.ts +1 -1
- package/dist/capability-facts.d.ts +38 -11
- package/dist/capability-facts.js +47 -8
- package/dist/card-void.d.ts +4 -4
- package/dist/card-void.js +1 -1
- package/dist/center-credential-renewer.d.ts +6 -2
- package/dist/center-credential-renewer.js +7 -3
- package/dist/config-catalog.d.ts +16 -1
- package/dist/config-catalog.js +62 -56
- package/dist/config-dir-trust.d.ts +37 -4
- package/dist/config-dir-trust.js +88 -44
- package/dist/config-invariants.d.ts +42 -3
- package/dist/config-invariants.js +69 -5
- package/dist/config-lkg.d.ts +23 -1
- package/dist/config-lkg.js +17 -3
- package/dist/config-provider.d.ts +9 -9
- package/dist/config-provider.js +25 -110
- package/dist/config-pull-failure.d.ts +50 -0
- package/dist/config-pull-failure.js +48 -0
- package/dist/config-types.d.ts +26 -17
- package/dist/config.d.ts +8 -16
- package/dist/config.js +113 -47
- package/dist/delegated-session-owner.d.ts +1 -1
- package/dist/deleted-session-ids.d.ts +3 -2
- package/dist/deployment-governance.d.ts +3 -3
- package/dist/deployment-shape.d.ts +30 -4
- package/dist/deployment-shape.js +7 -0
- package/dist/egress-redirect.d.ts +25 -7
- package/dist/egress-redirect.js +20 -2
- package/dist/elicitation.d.ts +6 -5
- package/dist/elicitation.js +23 -22
- package/dist/engine-identity.d.ts +28 -0
- package/dist/engine-identity.js +10 -0
- package/dist/entry-problems.d.ts +5 -7
- package/dist/entry-problems.js +1 -1
- package/dist/env-facts.js +2 -1
- package/dist/env-witness.d.ts +7 -0
- package/dist/env-witness.js +16 -0
- package/dist/execution-lane-caps.d.ts +5 -18
- package/dist/execution-lane-caps.js +0 -22
- package/dist/execution-placement.d.ts +58 -18
- package/dist/execution-placement.js +41 -2
- package/dist/field-conflict.d.ts +7 -11
- package/dist/field-conflict.js +3 -3
- package/dist/file-history-capture.d.ts +3 -3
- package/dist/file-history-disclosure.js +1 -0
- package/dist/fleet/fleet-bus.d.ts +21 -3
- package/dist/fleet/fleet-bus.js +35 -25
- package/dist/fleet/fleet-reconciler.js +2 -2
- package/dist/fleet/serving-lease.js +3 -3
- package/dist/fleet-client.js +3 -3
- package/dist/fleet-lease.d.ts +0 -1
- package/dist/fleet-lease.js +4 -5
- package/dist/history-anchor.d.ts +23 -3
- package/dist/history-anchor.js +24 -4
- package/dist/hitl-delivery.d.ts +90 -0
- package/dist/hitl-delivery.js +98 -0
- package/dist/hooks/classic-stations.d.ts +8 -11
- package/dist/hooks/classic-stations.js +0 -7
- package/dist/hooks/hook-llm.d.ts +5 -1
- package/dist/hooks/hook-llm.js +24 -15
- package/dist/hooks/hook-runner.d.ts +67 -57
- package/dist/hooks/hook-runner.js +260 -186
- package/dist/host-lsp-manager.d.ts +22 -8
- package/dist/host-lsp-manager.js +4 -1
- package/dist/http/active-run-conflict.d.ts +2 -43
- package/dist/http/active-run-conflict.js +3 -7
- package/dist/http/admission.d.ts +4 -18
- package/dist/http/admission.js +75 -78
- package/dist/http/approval-sweeps.d.ts +3 -3
- package/dist/http/approval-sweeps.js +54 -30
- package/dist/http/caller-trust.d.ts +8 -10
- package/dist/http/caller-trust.js +1 -2
- package/dist/http/claim-heartbeat.d.ts +49 -0
- package/dist/http/claim-heartbeat.js +46 -0
- package/dist/http/claimed-run.d.ts +4 -3
- package/dist/http/dispatch.d.ts +8 -1
- package/dist/http/dispatch.js +76 -30
- package/dist/http/durable-run-leg.d.ts +3 -3
- package/dist/http/durable-run-leg.js +17 -12
- package/dist/http/execution-context.d.ts +17 -43
- package/dist/http/execution-context.js +7 -5
- package/dist/http/health-reader.d.ts +36 -0
- package/dist/http/health-reader.js +21 -0
- package/dist/http/health-self-report.d.ts +9 -9
- package/dist/http/health-self-report.js +4 -4
- package/dist/http/idempotency.d.ts +9 -5
- package/dist/http/idempotency.js +4 -4
- package/dist/http/memory-compliance-failure-reply.d.ts +15 -16
- package/dist/http/memory-compliance-failure-reply.js +4 -2
- package/dist/http/memory-face-fault-reply.d.ts +67 -0
- package/dist/http/memory-face-fault-reply.js +71 -0
- package/dist/http/memory-store-refusal-reply.d.ts +1 -1
- package/dist/http/memory-store-refusal-reply.js +3 -0
- package/dist/http/owner-access.d.ts +391 -67
- package/dist/http/owner-access.js +371 -35
- package/dist/http/principal-gate.d.ts +24 -81
- package/dist/http/principal-gate.js +24 -68
- package/dist/http/refusal-body.d.ts +35 -2
- package/dist/http/refusal-body.js +34 -0
- package/dist/http/request-guards.d.ts +9 -13
- package/dist/http/request-guards.js +34 -68
- package/dist/http/resume-composition.d.ts +37 -0
- package/dist/http/resume-composition.js +18 -0
- package/dist/http/resume-ctx-read.d.ts +35 -12
- package/dist/http/resume-ctx-read.js +25 -6
- package/dist/http/resume-legs.d.ts +21 -18
- package/dist/http/resume-legs.js +189 -129
- package/dist/http/retired-skill-manifest.d.ts +1 -1
- package/dist/http/route-ctx.d.ts +25 -32
- package/dist/http/routes/a2a-serve.d.ts +43 -5
- package/dist/http/routes/a2a-serve.js +58 -37
- package/dist/http/routes/admin-config-refresh.js +2 -2
- package/dist/http/routes/admin-drain.js +2 -2
- package/dist/http/routes/admin-memory-optout.js +4 -3
- package/dist/http/routes/adoption.d.ts +3 -0
- package/dist/http/routes/adoption.js +17 -10
- package/dist/http/routes/agents-roster.js +13 -7
- package/dist/http/routes/approvals-assistant.js +70 -65
- package/dist/http/routes/attachments.js +2 -2
- package/dist/http/routes/background.d.ts +3 -3
- package/dist/http/routes/background.js +9 -17
- package/dist/http/routes/capabilities.js +15 -18
- package/dist/http/routes/config-catalog.js +2 -2
- package/dist/http/routes/devices.d.ts +3 -3
- package/dist/http/routes/devices.js +4 -4
- package/dist/http/routes/diagnostics.d.ts +27 -3
- package/dist/http/routes/diagnostics.js +27 -21
- package/dist/http/routes/engine.js +2 -2
- package/dist/http/routes/fleet.js +5 -3
- package/dist/http/routes/images.js +10 -6
- package/dist/http/routes/leader.d.ts +7 -2
- package/dist/http/routes/leader.js +12 -3
- package/dist/http/routes/mcp-reconnect.d.ts +1 -1
- package/dist/http/routes/mcp-reconnect.js +7 -15
- package/dist/http/routes/memory-bundle.js +4 -7
- package/dist/http/routes/memory-compliance.js +4 -4
- package/dist/http/routes/memory-consolidation.js +6 -9
- package/dist/http/routes/memory-origin.d.ts +2 -0
- package/dist/http/routes/memory-origin.js +7 -8
- package/dist/http/routes/memory-policy.js +17 -12
- package/dist/http/routes/notify-wake.js +10 -19
- package/dist/http/routes/observability.js +3 -3
- package/dist/http/routes/principal-inbox.d.ts +1 -1
- package/dist/http/routes/principal-inbox.js +2 -2
- package/dist/http/routes/projects.d.ts +1 -1
- package/dist/http/routes/projects.js +3 -2
- package/dist/http/routes/retention-ops.js +6 -9
- package/dist/http/routes/rules.js +20 -5
- package/dist/http/routes/run-memory-capture.d.ts +2 -2
- package/dist/http/routes/run-memory-capture.js +6 -12
- package/dist/http/routes/run-permission-mode.d.ts +2 -2
- package/dist/http/routes/run-permission-mode.js +10 -17
- package/dist/http/routes/runs.js +146 -231
- package/dist/http/routes/session-memory-sync.d.ts +2 -2
- package/dist/http/routes/session-memory-sync.js +7 -13
- package/dist/http/routes/session-sync.d.ts +4 -2
- package/dist/http/routes/session-sync.js +21 -20
- package/dist/http/routes/sessions-list.d.ts +3 -3
- package/dist/http/routes/sessions-list.js +9 -9
- package/dist/http/routes/sessions.js +87 -124
- package/dist/http/routes/shared-memory.js +6 -6
- package/dist/http/routes/side-query.js +2 -2
- package/dist/http/routes/tasks.js +136 -120
- package/dist/http/routes/trace-usage.d.ts +0 -12
- package/dist/http/routes/trace-usage.js +40 -46
- package/dist/http/routes/workflows.d.ts +39 -4
- package/dist/http/routes/workflows.js +42 -14
- package/dist/http/run-concurrency-cap.d.ts +20 -12
- package/dist/http/run-concurrency-cap.js +39 -26
- package/dist/http/run-read-face.d.ts +3 -5
- package/dist/http/run-read-face.js +8 -13
- package/dist/http/send.d.ts +12 -3
- package/dist/http/send.js +42 -6
- package/dist/http/server.d.ts +39 -40
- package/dist/http/server.js +36 -11
- package/dist/http/sse-log.d.ts +17 -10
- package/dist/http/sse-log.js +7 -7
- package/dist/http/stored-body-replay.d.ts +12 -0
- package/dist/http/stored-body-replay.js +2 -2
- package/dist/http/submit-ctx.d.ts +16 -8
- package/dist/http/submit-ctx.js +6 -2
- package/dist/http/submit-replay.d.ts +19 -6
- package/dist/http/submit-replay.js +18 -6
- package/dist/http/sync-submit-body.d.ts +3 -4
- package/dist/http/sync-submit-body.js +4 -5
- package/dist/http/wire-types.d.ts +4 -3
- package/dist/identity-source.d.ts +36 -5
- package/dist/identity-source.js +27 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/key-resolver.d.ts +32 -0
- package/dist/key-resolver.js +23 -9
- package/dist/leader/diffup.js +2 -1
- package/dist/leader/endpoint.d.ts +26 -5
- package/dist/leader/endpoint.js +154 -14
- package/dist/leader/fanout.d.ts +3 -0
- package/dist/leader/fanout.js +78 -63
- package/dist/leader/leader.d.ts +16 -0
- package/dist/leader/leader.js +43 -3
- package/dist/leader/merge.d.ts +9 -1
- package/dist/leader/merge.js +16 -1
- package/dist/leader/repair-wire.js +1 -1
- package/dist/leader/wire.d.ts +36 -3
- package/dist/leader/wire.js +59 -18
- package/dist/lsp-evict.d.ts +6 -4
- package/dist/lsp-evict.js +2 -3
- package/dist/memory-operator-faces.d.ts +5 -4
- package/dist/memory-operator-faces.js +1 -1
- package/dist/memory-scope.d.ts +29 -2
- package/dist/memory-scope.js +64 -15
- package/dist/memory-store-refusal.d.ts +5 -2
- package/dist/memory-sync-client.d.ts +3 -2
- package/dist/memory-sync-client.js +6 -3
- package/dist/model-compat.d.ts +17 -8
- package/dist/model-compat.js +6 -2
- package/dist/model-context-window.d.ts +18 -0
- package/dist/model-context-window.js +2 -0
- package/dist/model-entry-headers.d.ts +46 -4
- package/dist/model-entry-headers.js +2 -2
- package/dist/model-entry-refusal.d.ts +35 -16
- package/dist/model-entry-refusal.js +40 -27
- package/dist/model-plane-face.d.ts +19 -11
- package/dist/model-plane-face.js +9 -1
- package/dist/model-plane-probe.d.ts +2 -0
- package/dist/model-plane-probe.js +17 -0
- package/dist/model-provider.d.ts +3 -3
- package/dist/model-route-endpoint.d.ts +9 -5
- package/dist/model-route-endpoint.js +29 -7
- package/dist/model-select.d.ts +16 -0
- package/dist/model-select.js +4 -0
- package/dist/mountinfo.d.ts +37 -0
- package/dist/mountinfo.js +47 -0
- package/dist/namespaced-rule-name.d.ts +23 -14
- package/dist/namespaced-rule-name.js +8 -11
- package/dist/net-address.d.ts +1 -1
- package/dist/observability/corrupt-read-seat.d.ts +4 -4
- package/dist/observability/corrupt-read-seat.js +5 -3
- package/dist/observability/fail-open.d.ts +58 -38
- package/dist/observability/fail-open.js +60 -38
- package/dist/observability/logger.d.ts +22 -1
- package/dist/observability/logger.js +89 -12
- package/dist/observability/metrics.js +3 -4
- package/dist/observability/otel-exporter.js +2 -1
- package/dist/observability/principal-context.d.ts +14 -7
- package/dist/observability/principal-context.js +8 -3
- package/dist/observability/run-terminal.d.ts +7 -1
- package/dist/observability/run-terminal.js +5 -2
- package/dist/orchestration/hardened-vm-runner.d.ts +1 -0
- package/dist/orchestration/hardened-vm-runner.js +11 -5
- package/dist/orchestration/hardened-vm-worker-runner.d.ts +0 -14
- package/dist/orchestration/hardened-vm-worker-runner.js +5 -0
- package/dist/orchestration/hardened-vm-worker.js +2 -1
- package/dist/orchestration/workflow-completion-inbox.d.ts +3 -3
- package/dist/orchestration/workflow-completion-inbox.js +3 -2
- package/dist/org-delivery-gate.d.ts +5 -4
- package/dist/org-delivery-gate.js +7 -6
- package/dist/outbound-dispatcher.d.ts +1 -1
- package/dist/outbound-dispatcher.js +6 -12
- package/dist/owner-brands.d.ts +81 -0
- package/dist/owner-brands.js +42 -0
- package/dist/owner-faces.d.ts +531 -0
- package/dist/owner-faces.js +126 -0
- package/dist/parked-decide.d.ts +67 -5
- package/dist/parked-decide.js +127 -5
- package/dist/parked-revive-surface.d.ts +14 -4
- package/dist/parked-revive-surface.js +5 -4
- package/dist/peer-directory.d.ts +6 -8
- package/dist/peer-directory.js +3 -2
- package/dist/permission-rule-vocab.d.ts +53 -8
- package/dist/permission-rule-vocab.js +30 -2
- package/dist/plugins/adoption-log-sql.d.ts +0 -22
- package/dist/plugins/adoption-log-sql.js +5 -3
- package/dist/plugins/approval-ask-retired-delete-by-task-m50.d.ts +7 -0
- package/dist/plugins/approval-ask-retired-delete-by-task-m50.js +17 -0
- package/dist/plugins/approval-ask-store-file.d.ts +18 -7
- package/dist/plugins/approval-ask-store-file.js +37 -14
- package/dist/plugins/approval-ask-store-memory.d.ts +12 -4
- package/dist/plugins/approval-ask-store-memory.js +24 -10
- package/dist/plugins/approval-ask-store-sql.d.ts +39 -20
- package/dist/plugins/approval-ask-store-sql.js +41 -10
- package/dist/plugins/approval-exemption-skill-m46.d.ts +20 -0
- package/dist/plugins/approval-exemption-skill-m46.js +25 -0
- package/dist/plugins/approval-exemption-store.d.ts +6 -1
- package/dist/plugins/approval-exemption-store.js +14 -0
- package/dist/plugins/approval-nonce-store.d.ts +39 -12
- package/dist/plugins/approval-nonce-store.js +72 -23
- package/dist/plugins/blob-backend.d.ts +2 -0
- package/dist/plugins/blob-backend.js +9 -6
- package/dist/plugins/caching-session-store.d.ts +13 -1
- package/dist/plugins/caching-session-store.js +43 -4
- package/dist/plugins/checkpoint-index-columns.d.ts +32 -5
- package/dist/plugins/checkpoint-index-columns.js +36 -1
- package/dist/plugins/checkpoint-store-face.d.ts +83 -10
- package/dist/plugins/checkpoint-store-face.js +18 -1
- package/dist/plugins/device-store-sql.js +1 -0
- package/dist/plugins/ensure-index.d.ts +13 -1
- package/dist/plugins/ensure-index.js +154 -21
- package/dist/plugins/ensure-schema-lock-policy.d.ts +0 -15
- package/dist/plugins/ensure-schema-lock-policy.js +3 -2
- package/dist/plugins/file-run-store.d.ts +63 -23
- package/dist/plugins/file-run-store.js +138 -83
- package/dist/plugins/host-platform.d.ts +24 -3
- package/dist/plugins/host-platform.js +15 -1
- package/dist/plugins/image-bake-store-sql.js +2 -0
- package/dist/plugins/imported-layer-root-retirement.d.ts +2 -2
- package/dist/plugins/k8s-pod-reaper.d.ts +1 -3
- package/dist/plugins/k8s-pod-reaper.js +0 -1
- package/dist/plugins/leader-run-store-sql.d.ts +22 -0
- package/dist/plugins/leader-run-store-sql.js +34 -4
- package/dist/plugins/local-checkpoint-store.d.ts +58 -23
- package/dist/plugins/local-checkpoint-store.js +195 -76
- package/dist/plugins/local-data-dir-modes-m39.js +2 -1
- package/dist/plugins/local-docker-capacity.d.ts +93 -0
- package/dist/plugins/local-docker-capacity.js +194 -0
- package/dist/plugins/local-docker-reaper.d.ts +92 -0
- package/dist/plugins/local-docker-reaper.js +102 -0
- package/dist/plugins/local-engine-high-water.d.ts +4 -2
- package/dist/plugins/local-engine-high-water.js +4 -1
- package/dist/plugins/local-session-store.d.ts +358 -125
- package/dist/plugins/local-session-store.js +824 -251
- package/dist/plugins/local-session-window.d.ts +3 -2
- package/dist/plugins/local-session-window.js +3 -2
- package/dist/plugins/local-sidecar-quarantine.js +3 -2
- package/dist/plugins/local-task-attachment-store.d.ts +18 -1
- package/dist/plugins/local-task-attachment-store.js +22 -1
- package/dist/plugins/memory-embedder.js +9 -7
- package/dist/plugins/memory-engine-pg.d.ts +3 -2
- package/dist/plugins/memory-engine-pg.js +14 -5
- package/dist/plugins/memory-engine-sql-apply.d.ts +8 -4
- package/dist/plugins/memory-engine-sql-apply.js +6 -8
- package/dist/plugins/memory-engine-tidb.d.ts +4 -2
- package/dist/plugins/memory-engine-tidb.js +11 -2
- package/dist/plugins/memory-optout-grant-store-sql.d.ts +1 -1
- package/dist/plugins/memory-optout-grant-store-sql.js +3 -3
- package/dist/plugins/memory-run-store.d.ts +39 -27
- package/dist/plugins/memory-run-store.js +72 -70
- package/dist/plugins/one-time-migration-marker.d.ts +10 -0
- package/dist/plugins/one-time-migration-marker.js +7 -0
- package/dist/plugins/one-time-migrations.d.ts +186 -45
- package/dist/plugins/one-time-migrations.js +442 -119
- package/dist/plugins/org-delivery-quota-store.js +2 -1
- package/dist/plugins/permission-rule-store-file.d.ts +3 -3
- package/dist/plugins/permission-rule-store-sql.d.ts +4 -63
- package/dist/plugins/permission-rule-store-sql.js +6 -86
- package/dist/plugins/pg-pool.d.ts +1 -31
- package/dist/plugins/pg-pool.js +16 -7
- package/dist/plugins/remote-env-e2b.d.ts +7 -25
- package/dist/plugins/remote-env-e2b.js +34 -25
- package/dist/plugins/remote-env-host.d.ts +2 -9
- package/dist/plugins/remote-env-host.js +34 -22
- package/dist/plugins/remote-env-k8s.d.ts +40 -45
- package/dist/plugins/remote-env-k8s.js +107 -58
- package/dist/plugins/remote-env-local-docker.d.ts +148 -14
- package/dist/plugins/remote-env-local-docker.js +367 -72
- package/dist/plugins/remote-scratchpad.js +4 -0
- package/dist/plugins/retention-deployment.d.ts +49 -17
- package/dist/plugins/retention-deployment.js +39 -8
- package/dist/plugins/run-preview-m45.d.ts +11 -0
- package/dist/plugins/run-preview-m45.js +19 -0
- package/dist/plugins/run-store-sql.d.ts +56 -68
- package/dist/plugins/run-store-sql.js +127 -116
- package/dist/plugins/s3-answer.d.ts +2 -1
- package/dist/plugins/sandbox-reaper.d.ts +26 -0
- package/dist/plugins/sandbox-reaper.js +2 -0
- package/dist/plugins/scenario-prefix-switch-m42.d.ts +54 -0
- package/dist/plugins/scenario-prefix-switch-m42.js +55 -0
- package/dist/plugins/scheduler-support.d.ts +16 -1
- package/dist/plugins/scheduler-support.js +22 -2
- package/dist/plugins/schema-consistency.d.ts +42 -9
- package/dist/plugins/schema-consistency.js +212 -11
- package/dist/plugins/schema-drift-sentence.d.ts +4 -1
- package/dist/plugins/schema-drift-sentence.js +4 -4
- package/dist/plugins/schema-ensure-legs.d.ts +9 -0
- package/dist/plugins/schema-ensure-legs.js +1 -1
- package/dist/plugins/schema-indexes.js +3 -0
- package/dist/plugins/schema-live-columns.d.ts +14 -5
- package/dist/plugins/schema-live-columns.js +10 -10
- package/dist/plugins/send-user-file.js +2 -1
- package/dist/plugins/session-birth.d.ts +37 -0
- package/dist/plugins/session-birth.js +38 -0
- package/dist/plugins/session-epoch-anchor.d.ts +40 -12
- package/dist/plugins/session-epoch-anchor.js +33 -11
- package/dist/plugins/session-ext-table.d.ts +27 -3
- package/dist/plugins/session-ext-table.js +19 -6
- package/dist/plugins/session-fork.d.ts +15 -1
- package/dist/plugins/session-fork.js +3 -0
- package/dist/plugins/session-ownership.d.ts +1 -1
- package/dist/plugins/session-placement.d.ts +22 -16
- package/dist/plugins/session-placement.js +15 -12
- package/dist/plugins/session-row-sql.d.ts +12 -0
- package/dist/plugins/session-row-sql.js +3 -3
- package/dist/plugins/session-run-rollup.d.ts +29 -0
- package/dist/plugins/session-run-rollup.js +40 -0
- package/dist/plugins/session-store-sql.d.ts +38 -12
- package/dist/plugins/session-store-sql.js +130 -30
- package/dist/plugins/session-withdraw-sql.d.ts +36 -0
- package/dist/plugins/session-withdraw-sql.js +42 -0
- package/dist/plugins/shared-memory-store-sql.d.ts +0 -69
- package/dist/plugins/shared-memory-store-sql.js +2 -1
- package/dist/plugins/shell-sentinel-owner-m48.d.ts +20 -0
- package/dist/plugins/shell-sentinel-owner-m48.js +3 -0
- package/dist/plugins/snapshot-bucket-presence.d.ts +2 -1
- package/dist/plugins/sql-driver.d.ts +1 -1
- package/dist/plugins/sql-driver.js +2 -1
- package/dist/plugins/sql-errors.d.ts +32 -5
- package/dist/plugins/sql-errors.js +55 -7
- package/dist/plugins/sql-json-column.d.ts +8 -7
- package/dist/plugins/sql-json-column.js +10 -6
- package/dist/plugins/store-backend.d.ts +84 -15
- package/dist/plugins/store-backend.js +186 -55
- package/dist/plugins/store-contracts.d.ts +90 -30
- package/dist/plugins/store-contracts.js +22 -1
- package/dist/plugins/store-fault.d.ts +28 -2
- package/dist/plugins/store-fault.js +20 -2
- package/dist/plugins/task-attachment-store.d.ts +15 -3
- package/dist/plugins/task-attachment-store.js +22 -9
- package/dist/plugins/tidb-pool.js +23 -8
- package/dist/plugins/web-search.js +5 -3
- package/dist/plugins/workflow-run-store-sql.d.ts +6 -1
- package/dist/plugins/workflow-run-store-sql.js +11 -5
- package/dist/principal-jwt.d.ts +4 -4
- package/dist/principal-jwt.js +20 -5
- package/dist/principal-shape.d.ts +41 -0
- package/dist/principal-shape.js +19 -0
- package/dist/question.d.ts +13 -23
- package/dist/question.js +21 -39
- package/dist/request-declaration-refusal.d.ts +35 -12
- package/dist/request-declaration-refusal.js +21 -9
- package/dist/request-form.d.ts +58 -0
- package/dist/request-form.js +72 -0
- package/dist/request-image-urls.d.ts +8 -2
- package/dist/request-image-urls.js +2 -1
- package/dist/request-images.d.ts +20 -0
- package/dist/request-images.js +59 -0
- package/dist/request-key-closure.d.ts +6 -7
- package/dist/request-key-closure.js +15 -2
- package/dist/resource-suspend.d.ts +7 -16
- package/dist/resource-suspend.js +1 -1
- package/dist/retired-name-host-notice.d.ts +21 -0
- package/dist/retired-name-host-notice.js +12 -0
- package/dist/rule-entry-list.d.ts +2 -2
- package/dist/rule-entry-list.js +3 -4
- package/dist/rule-issue-reading.d.ts +58 -0
- package/dist/rule-issue-reading.js +14 -0
- package/dist/rules-consent.d.ts +5 -3
- package/dist/rules-consent.js +1 -0
- package/dist/run-acceptance.d.ts +3 -1
- package/dist/run-acceptance.js +3 -0
- package/dist/run-local.d.ts +14 -6
- package/dist/run-local.js +92 -80
- package/dist/run-stale-default.d.ts +7 -0
- package/dist/run-stale-default.js +2 -0
- package/dist/runs.d.ts +26 -15
- package/dist/runs.js +39 -27
- package/dist/runtime-caps-resolver.d.ts +21 -6
- package/dist/runtime-caps-resolver.js +17 -4
- package/dist/runtime-governance.d.ts +2 -2
- package/dist/runtime-governance.js +5 -3
- package/dist/sealed-key-layout.d.ts +12 -5
- package/dist/sealed-key-layout.js +5 -0
- package/dist/sealed-key.d.ts +12 -2
- package/dist/sealed-key.js +115 -27
- package/dist/security.d.ts +128 -158
- package/dist/security.js +163 -59
- package/dist/sema-config-dir.d.ts +20 -0
- package/dist/sema-config-dir.js +25 -0
- package/dist/server-secret-env.d.ts +21 -5
- package/dist/server-secret-env.js +14 -4
- package/dist/session-children-retire.d.ts +7 -5
- package/dist/session-children-retire.js +7 -2
- package/dist/session-deletion.d.ts +88 -0
- package/dist/session-deletion.js +8 -0
- package/dist/session-erase.d.ts +145 -0
- package/dist/session-erase.js +115 -0
- package/dist/session-error-wire.d.ts +5 -5
- package/dist/session-error-wire.js +1 -1
- package/dist/session-incarnation.d.ts +52 -5
- package/dist/session-incarnation.js +19 -2
- package/dist/session-policy-wire.d.ts +6 -3
- package/dist/session-policy-wire.js +11 -1
- package/dist/session-resident-background.d.ts +0 -71
- package/dist/session-resident-background.js +4 -3
- package/dist/session-row.d.ts +2 -1
- package/dist/session-rules-seat.d.ts +12 -0
- package/dist/session-rules-seat.js +19 -0
- package/dist/session-titler.d.ts +7 -15
- package/dist/session-titler.js +1 -1
- package/dist/spec-fields.d.ts +57 -3
- package/dist/spec-fields.js +72 -51
- package/dist/store-posture.d.ts +136 -20
- package/dist/store-posture.js +188 -3
- package/dist/stored-request-hooks-m20.js +2 -2
- package/dist/stores-sql/background-agent-store-sql.d.ts +11 -2
- package/dist/stores-sql/background-agent-store-sql.js +73 -20
- package/dist/stores-sql/checkpoint-store-sql.d.ts +33 -28
- package/dist/stores-sql/checkpoint-store-sql.js +75 -44
- package/dist/stores-sql/mailbox-store-sql.d.ts +7 -4
- package/dist/stores-sql/mailbox-store-sql.js +31 -32
- package/dist/stores-sql/pg-session-storage.d.ts +7 -5
- package/dist/stores-sql/pg-session-storage.js +54 -46
- package/dist/stores-sql/retention-store-sql.d.ts +87 -19
- package/dist/stores-sql/retention-store-sql.js +92 -27
- package/dist/stores-sql/session-policy-store-sql.d.ts +32 -10
- package/dist/stores-sql/session-policy-store-sql.js +44 -36
- package/dist/stores-sql/session-write-hooks.d.ts +12 -6
- package/dist/stores-sql/tidb-session-storage.d.ts +4 -4
- package/dist/stores-sql/tidb-session-storage.js +13 -8
- package/dist/stores-sql/tidb-session-store.d.ts +36 -17
- package/dist/stores-sql/tidb-session-store.js +69 -39
- package/dist/stores-sql/windowed-session-storage.d.ts +5 -0
- package/dist/stores-sql/windowed-session-storage.js +9 -0
- package/dist/submission-exit.d.ts +50 -0
- package/dist/submission-exit.js +108 -0
- package/dist/task-a2a.d.ts +1 -1
- package/dist/task-a2a.js +3 -3
- package/dist/task-cwd.d.ts +20 -0
- package/dist/task-cwd.js +8 -0
- package/dist/task-mcp.d.ts +1 -1
- package/dist/task-mcp.js +3 -3
- package/dist/task-settings.d.ts +14 -10
- package/dist/task-settings.js +18 -7
- package/dist/terminal.d.ts +25 -43
- package/dist/terminal.js +31 -11
- package/dist/tool-approval.d.ts +131 -129
- package/dist/tool-approval.js +189 -193
- package/dist/trace/core-keyset-guard.d.ts +13 -6
- package/dist/trace/core-vocab-wire.d.ts +95 -0
- package/dist/trace/core-vocab-wire.js +15 -0
- package/dist/trace/exit-seat.d.ts +30 -4
- package/dist/trace/exit-seat.js +40 -36
- package/dist/trace/extension-call-face.d.ts +3 -2
- package/dist/trace/extension-call-face.js +3 -1
- package/dist/trace/ledger-events.d.ts +4 -7
- package/dist/trace/ledger-sink.d.ts +1 -30
- package/dist/trace/ledger-sink.js +0 -11
- package/dist/trace/model-segment.d.ts +5 -5
- package/dist/trace/model-segment.js +5 -5
- package/dist/trace/project.d.ts +55 -42
- package/dist/trace/project.js +52 -19
- package/dist/trace/redact.d.ts +123 -27
- package/dist/trace/redact.js +880 -260
- package/dist/trace/self-minted-wire.d.ts +487 -19
- package/dist/trace/self-minted-wire.js +172 -23
- package/dist/trace/wire-projection-faces.d.ts +5 -6
- package/dist/trace/wire-projection-faces.js +2 -2
- package/dist/upstream-body.d.ts +23 -0
- package/dist/upstream-body.js +16 -0
- package/dist/url-refusal.d.ts +3 -3
- package/dist/url-refusal.js +11 -4
- package/dist/user-authored-text.d.ts +1 -1
- package/dist/user-input-ledger.d.ts +7 -8
- package/dist/user-input-ledger.js +1 -1
- package/dist/web-admin-client/apply-effective.d.ts +6 -3
- package/dist/web-admin-client/apply-effective.js +13 -16
- package/dist/web-admin-client/apply-ledger.d.ts +16 -7
- package/dist/web-admin-client/apply-ledger.js +5 -2
- package/dist/web-admin-client/center-request.d.ts +2 -2
- package/dist/web-admin-client/center-request.js +15 -15
- package/dist/web-admin-client/effective-keys.d.ts +1 -1
- package/dist/web-admin-client/effective-keys.js +1 -1
- package/dist/web-admin-client/entry-metadata.d.ts +8 -0
- package/dist/web-admin-client/entry-metadata.js +13 -0
- package/dist/web-admin-client/http-client.d.ts +1 -1
- package/dist/web-admin-client/http-client.js +23 -4
- package/dist/web-admin-client/mcp-revocation.d.ts +1 -1
- package/dist/web-admin-client/mcp-revocation.js +2 -1
- package/dist/web-admin-client/read-warnings.d.ts +1 -0
- package/dist/web-admin-client/read-warnings.js +1 -0
- package/dist/web-admin-client/restart-signal.js +8 -4
- package/dist/web-admin-client/skills-mcp.d.ts +2 -2
- package/dist/web-admin-client/types.d.ts +1 -2
- package/dist/workspace-space.d.ts +3 -2
- package/docs/DEVICE-EXECUTOR-PROTOCOL.md +4 -4
- package/package.json +6 -3
- package/scripts/drain-check-local.mjs +118 -147
- package/scripts/drain-check.mysql.sql +22 -2
- package/scripts/drain-check.pg.sql +22 -2
- package/wire-changes/server@7.148.0.json +1517 -0
- package/dist/http/memory-control-plane-corrupt-reply.d.ts +0 -25
- package/dist/http/memory-control-plane-corrupt-reply.js +0 -19
- package/dist/http/memory-layer-reply.d.ts +0 -30
- package/dist/http/memory-layer-reply.js +0 -24
- package/dist/lsp/e2b-bridge.d.ts +0 -57
- package/dist/lsp/e2b-bridge.js +0 -139
- package/dist/lsp/e2b-manager.d.ts +0 -93
- package/dist/lsp/e2b-manager.js +0 -178
- package/dist/lsp/lsp-frames.d.ts +0 -14
- package/dist/lsp/lsp-frames.js +0 -25
- package/dist/lsp/manager.d.ts +0 -129
- package/dist/lsp/manager.js +0 -127
- package/dist/lsp/types.d.ts +0 -12
- package/dist/lsp/types.js +0 -2
- package/dist/lsp/ws-transport.d.ts +0 -40
- package/dist/lsp/ws-transport.js +0 -210
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createLogger } from "../observability/logger.js";
|
|
1
2
|
import { join } from "node:path";
|
|
2
3
|
import { existsSync, readFileSync } from "node:fs";
|
|
3
4
|
import { atomicWriteFile, ensureDir } from "@sema-agent/core";
|
|
@@ -97,7 +98,7 @@ export class FileOrgDeliveryQuotaStore extends MemoryOrgDeliveryQuotaStore {
|
|
|
97
98
|
}
|
|
98
99
|
if (!parsed.ok) {
|
|
99
100
|
this.unusable = `the cross-principal delivery quota file ${this.path} cannot be read (${parsed.problem}) — every delivery is refused until an operator moves it away (moving it resets the current window's counts)`;
|
|
100
|
-
(opts?.warn ?? (
|
|
101
|
+
(opts?.warn ?? createLogger().warn)("org_delivery_quota_corrupt_read", { path: this.path, problem: parsed.problem });
|
|
101
102
|
return;
|
|
102
103
|
}
|
|
103
104
|
this.state = parsed.state;
|
|
@@ -15,7 +15,7 @@ export declare class FileRuleApprovalRecordStore implements RuleApprovalRecordSt
|
|
|
15
15
|
private readonly log;
|
|
16
16
|
/** 本面的损坏闸([ref] 起由重放属主交回;置位后每个方法第一行响亮拒)。 */
|
|
17
17
|
private readonly gate;
|
|
18
|
-
/** @param warn 腐读披露座([ref];缺席 ⇒
|
|
18
|
+
/** @param warn 腐读披露座([ref];缺席 ⇒ 属主退回日志出口接缝的文本出口 `writeLogText`)。 */
|
|
19
19
|
constructor(dir: string, warn?: Logger["warn"]);
|
|
20
20
|
/** 取证/自证用:本面是否因内部损坏而 fail-closed。 */
|
|
21
21
|
get corrupt(): boolean;
|
|
@@ -55,7 +55,7 @@ export declare class FileRuleImportTicketStore {
|
|
|
55
55
|
private readonly gate;
|
|
56
56
|
/** 单调钟(判定用)。与 {@link now}(墙钟,记账用)是两只不同的钟,别混。 */
|
|
57
57
|
private readonly monotonic;
|
|
58
|
-
/** @param warn 腐读披露座([ref];缺席 ⇒
|
|
58
|
+
/** @param warn 腐读披露座([ref];缺席 ⇒ 属主退回日志出口接缝的文本出口 `writeLogText`)。 */
|
|
59
59
|
constructor(dir: string, now?: () => number, warn?: Logger["warn"], monotonic?: () => number);
|
|
60
60
|
private readonly now;
|
|
61
61
|
/** 取证/自证用:本面是否因内部损坏而 fail-closed。 */
|
|
@@ -128,7 +128,7 @@ export interface FilePermissionRuleStores extends PermissionRuleStoreBundle {
|
|
|
128
128
|
* `onError` 接的是 core 规则文件的**披露面**(读不出来 / 校验和不符 / 撞上符号链接时它答零规则并
|
|
129
129
|
* 说出来)。接住它打一条 warn 是**必须**的:那条路径上「零规则」与「真的没有规则」在读面上同形,
|
|
130
130
|
* 不留痕就变成一次静默的 fail-closed(用户会突然被反复询问,却没有任何线索)。
|
|
131
|
-
* `warn`([ref])接的是本仓审批记录 / 导入票两份日志的**腐读座**(逐行披露 + 计数;缺席 ⇒ `
|
|
131
|
+
* `warn`([ref])接的是本仓审批记录 / 导入票两份日志的**腐读座**(逐行披露 + 计数;缺席 ⇒ 接缝的文本出口 `writeLogText`)。
|
|
132
132
|
*/
|
|
133
133
|
export declare function createFilePermissionRuleStores(root: string, opts?: {
|
|
134
134
|
onError?: (message: string) => void;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { type PermissionRuleWriter, type DurableRulePartition, type DurableRulePartitionProvider, type RuleScope, type RuleSyncFrontier, type
|
|
2
|
+
import { type PermissionRuleWriter, type DurableRulePartition, type DurableRulePartitionProvider, type RuleScope, type RuleSyncFrontier, type RuleCandidate, type RuleApprovalRecord, type StaleRuleApprovalRecord, type RuleApprovalRecordStore, type RuleOwner } from "@sema-agent/core";
|
|
3
3
|
import type { Pool as MySqlPool } from "mysql2/promise";
|
|
4
4
|
import type { PgQueryFn } from "./pg-query.js";
|
|
5
5
|
import { type SqlDriver, type SqlDialect } from "./sql-driver.js";
|
|
@@ -59,7 +59,7 @@ export declare const PERMISSION_RULE_TICKET_TABLE = "permission_rule_ticket";
|
|
|
59
59
|
* 列宽依据([ref] A10 的「每列的值由谁铸、有没有入口上限」口径):
|
|
60
60
|
* · `owner_key` / `record_id` / `ticket_id` / `approval_id` / `payload_hash` / `checksum` → 190:
|
|
61
61
|
* 全是本仓自铸的键类值(sha256 hex 64 / uuid 36 / `sha256:` 前缀 71),190 是全仓键轴的统一宽度。
|
|
62
|
-
* · `principal` → 512:principal 入口上限是 `
|
|
62
|
+
* · `principal` → 512:principal 入口上限是 `PRINCIPAL_MAX_BYTES = 190` UTF-8 字节(`principal-shape.ts`),这里给
|
|
63
63
|
* 名类宽度 512 是**上界宽于入口**的方向(绝不制造静默截断面)。
|
|
64
64
|
* · `actor` → 190:本 backend 自铸的副本身份(`sql-<12 hex>`),按构造 ≤ 20 字符。
|
|
65
65
|
* · 内容列一律 LONGTEXT / TEXT:一只桶的规则集没有硬上限(导入一份大 settings 就能过 64K TEXT 墙)。
|
|
@@ -185,7 +185,7 @@ export declare function recordOwnerOf(record: {
|
|
|
185
185
|
readonly principal?: unknown;
|
|
186
186
|
}): RuleOwner | undefined;
|
|
187
187
|
/**
|
|
188
|
-
* 一次性迁移 M36(窗口见 `plugins/one-time-migrations.ts` 登记表)要读的桶:**规则表里的每一只桶**(按 `owner_key`
|
|
188
|
+
* 一次性迁移 M36(窗口见 `plugins/one-time-migrations.ts` 登记表)要读的桶:**规则表里的每一只桶**(按 `owner_key` 分页)。
|
|
189
189
|
* 不从审批记录推:收编腿把规则桶整桶改键到新身份、而审批史按 D2 留在旧身份名下(`src/adoption/plan.ts` 的 `permission_rule#owner_key` 腿与
|
|
190
190
|
* `permission-rule-approval-history` 一员)—— 从记录推出的属主集在收编之后漏掉新桶。属主读法只有引擎的 `readRuleOwner`(与本店读口同一只);
|
|
191
191
|
* 读不出属主的行不点名任何可解析的桶(读腿同样解析不到它),不返回。`db` 是池或迁移握锁的那一条连接。
|
|
@@ -205,7 +205,7 @@ export declare function isSqlBucketVanished(e: unknown): boolean;
|
|
|
205
205
|
* · {@link BucketRefusedError} —— 判官四道(文法戳 / 指纹 / 行的 behavior / 引擎校验器)的拒;
|
|
206
206
|
* · {@link StoreCorruptError} —— 某只 JSON 列的体读不出(`not-json` / `malformed`),读腿在 {@link refusingUnreadableColumns} 把判官抛的列错误折成的店拒绝契约。
|
|
207
207
|
* 两类都是这一行的确定性判决:原样再读也读不出,读腿对它同样整桶拒(零规则),所以它什么都不放行。
|
|
208
|
-
* 别的抛出物**不是**这一类:连接 / 超时 / 权限(一次读失败证明不了以后也读不出);以及仍以
|
|
208
|
+
* 别的抛出物**不是**这一类:连接 / 超时 / 权限(一次读失败证明不了以后也读不出);以及仍以 `SqlJsonColumnError` 穿出读腿的唯一一形 `not-text`
|
|
209
209
|
* (列没按文本投影:读腿与解码点漂了,是码缺陷不是坏数据 —— 按列错误类判它会把一次码漂读成「这只桶坏了」)。
|
|
210
210
|
*/
|
|
211
211
|
export declare function isSqlBucketRefusal(e: unknown): boolean;
|
|
@@ -473,65 +473,6 @@ export declare const RULE_PENDING_APPROVAL_RETENTION_MS: number;
|
|
|
473
473
|
* 补建完成之前(或某个副本还没起过新版),这条腿在存量库上仍是全表扫 —— 但每轮 500 行的上界让它的**单次**代价仍然有界。
|
|
474
474
|
*/
|
|
475
475
|
export declare const RULE_REAP_BATCH = 500;
|
|
476
|
-
/**
|
|
477
|
-
* M11 删掉的一行。只带桶键、态、工具名与 scope 的 root —— 规则正文不出本函数(命令行里可以有任何东西)。
|
|
478
|
-
*
|
|
479
|
-
* `kind` 是闭集(启动日志按它穷尽分句,`one-time-migrations.ts` `logOneTimeMigrations`):
|
|
480
|
-
* · `rule` —— 仍有活 add 的规则行(引擎读侧每跑一次丢它并告知;它从未生效,要的话按项目的完整路径重写);
|
|
481
|
-
* · `revoked-rule` —— 没有活 add 的规则行(判活用 core 的 `applyTombstones`:每个 add 都已被同桶墓碑撤掉,或这一行本来就没有 add):它在任何一侧都已不生效
|
|
482
|
-
* (allow / deny / ask 同判),无需处置;逐行 warn 的句子只说这个事实,不依赖桶里有没有墓碑、也不依赖态;
|
|
483
|
-
* · `tombstone` —— 一条撤销记录。它只盖得住同 (behavior, 文本, scope) 的规则 ⇒ 那些规则的 scope 与它同样不被收,随它一起删了或本来就不在,
|
|
484
|
-
* 删它不会让任何被撤销的东西回来。
|
|
485
|
-
*/
|
|
486
|
-
export interface UndurableScopeRuleRow {
|
|
487
|
-
/** 桶键(sha256,不是 principal 原文)。 */
|
|
488
|
-
readonly ownerKey: string;
|
|
489
|
-
readonly kind: "rule" | "revoked-rule" | "tombstone";
|
|
490
|
-
readonly behavior: RuleBehavior;
|
|
491
|
-
readonly tool: string;
|
|
492
|
-
/** scope 的 root,**过 `redactSecrets`**(本仓唯一脱敏器):坏 root 是最不可信的自由文本,可能夹着凭据形,而本读数进启动日志与拒因。 */
|
|
493
|
-
readonly scopeRoot: string;
|
|
494
|
-
}
|
|
495
|
-
/** M11 判成读不出、一个字节没动的桶。`why` = 唯一判官那次整桶拒**不带任何行内容**的拒因(读腿对这只桶照旧整桶拒,它仍是这只桶的属主)。 */
|
|
496
|
-
export interface UnreadableRuleBucket {
|
|
497
|
-
/** 桶键(sha256,不是 principal 原文)。 */
|
|
498
|
-
readonly ownerKey: string;
|
|
499
|
-
readonly why: string;
|
|
500
|
-
}
|
|
501
|
-
/**
|
|
502
|
-
* M11 写进的读数账 —— 三格与一次性迁移段那一只收据账(`one-time-migrations.ts` 的 `MigrationReceipts`)上的同名三格**同名同形**,迁移段把它的账直接递进来
|
|
503
|
-
* ([ref]:一次起服一只收据账,M11 不另起第二套):删掉的行在那只桶的回写**提交的那一刻**追加,之后任何一步失败,拒因随账带走它们。
|
|
504
|
-
*/
|
|
505
|
-
export interface UndurableScopePurgeReadings {
|
|
506
|
-
/** 删掉的行(一行一条读数;每只桶的回写提交之后才追加)。 */
|
|
507
|
-
readonly undurableScopeRuleRows: UndurableScopeRuleRow[];
|
|
508
|
-
/** 连续争不过在线写者(OCC 每次都输)而留到下一次起服的桶数。那些桶里的坏行这期间照旧由引擎读侧丢掉并告知。 */
|
|
509
|
-
undurableScopeRuleBucketsDeferred: number;
|
|
510
|
-
/** 读腿整桶拒的桶(形 / 指纹 / behavior 闭集 / 墓碑规范文本 / 单一验证器):一个字节不动,逐桶交出拒因,等人处置。 */
|
|
511
|
-
readonly undurableScopeRuleBucketsUnreadable: UnreadableRuleBucket[];
|
|
512
|
-
}
|
|
513
|
-
/** {@link purgeUndurableScopeRows} 要的最小查询口(一次性迁移段的 `MigrationDb` 同形;占位符按方言由本函数写)。 */
|
|
514
|
-
export interface UndurableScopePurgeDb {
|
|
515
|
-
rows(sql: string, params?: readonly unknown[]): Promise<Record<string, unknown>[]>;
|
|
516
|
-
exec(sql: string, params?: readonly unknown[]): Promise<number>;
|
|
517
|
-
}
|
|
518
|
-
/**
|
|
519
|
-
* **M11** —— 把持久桶里 scope 不被 core `isValidDurableScope` 收的行(规则行与墓碑)删掉,一行一条读数。
|
|
520
|
-
*
|
|
521
|
-
* 这些行从哪来:7.119.0 及更早的本仓入口按「root 非空」收 project scope(`/v1/rules` 写口、两条导入面),引擎 7.45 也收;
|
|
522
|
-
* 引擎 7.46.0 把 project root 收窄成完整绝对路径 ⇒ `project:myproj` 一类存量行在读侧被丢(`permission.rule_row_dropped`,每跑一条),
|
|
523
|
-
* 而撤销口删不动它(引擎的写臂对这种 scope 的墓碑同样拒)。⇒ 一次性迁移,不留「撤销口对坏 scope 另开一条读法」的长期双读。
|
|
524
|
-
*
|
|
525
|
-
* 读法与写法都是**店的那一只**:每只桶先过唯一判官 {@link decodeBucketRow}(读腿用的同一只),判官整桶拒 ⇒ 这只桶**一个字节不动**,
|
|
526
|
-
* 进 `undurableScopeRuleBucketsUnreadable`(桶键 + 不带行内容的拒因;读腿对它的整桶拒仍是它的属主,出路是人);判官放行 ⇒ 在那份合法状态上筛 scope,
|
|
527
|
-
* 经写臂的同一只 {@link writeBucket} 整桶 OCC 回写(`WHERE owner_key = ? AND rev = ?`,rev+1,落盘字节与指纹同写臂)—— 不碰别的桶。
|
|
528
|
-
* **硬删、不铸墓碑**:墓碑的作用是挡同步回灌,而引擎的 sync-join 对 scope 不合法的入站行本来就丢(`applySyncJoin`),
|
|
529
|
-
* 本店也不实现同步(见 `apply` 的 sync-join 臂)。
|
|
530
|
-
* 幂等:第二跑零命中零写(读不出的桶每一跑照报,直到有人处置)。
|
|
531
|
-
* 读数写进调用方递进来的账(`into`,{@link UndurableScopePurgeReadings}):删掉的行在那只桶的回写提交之后追加 ⇒ 本函数半途抛出时,已删的行已经在账上;
|
|
532
|
-
* 错误**原样**上抛(不加工、不自铸拒因句 —— 收据由迁移段那一只收据账随拒因带走,[ref])。
|
|
533
|
-
*/
|
|
534
|
-
export declare function purgeUndurableScopeRows(db: UndurableScopePurgeDb, dialect: SqlDialect, into: UndurableScopePurgeReadings, now?: () => number): Promise<void>;
|
|
535
476
|
/** 三个 SQL 面的一次性装配束(one driver, three faces)。`durable` = [ref] 的 durable 分区后端;
|
|
536
477
|
* 引擎接缝上的统一店由 `main.ts` 用 `createPermissionRuleStoreProvider({ durable })` 合成一次。 */
|
|
537
478
|
export interface PermissionRuleStores {
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { createHash, randomBytes, randomUUID } from "node:crypto";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
import { applyTombstones, assertDeleteDeltaCarriesNoAdd, assertRedemptionNotQuarantined, assertWriteDeltaScopeDurable, foldDelta,
|
|
3
|
+
import { applyTombstones, assertDeleteDeltaCarriesNoAdd, assertRedemptionNotQuarantined, assertWriteDeltaScopeDurable, foldDelta, parseRuleText, readRowBehavior, screenRuleSyncState, PERMISSION_RULE_WRITER, RULE_ADD_ORIGINS, RULE_APPROVAL_KINDS, RULE_APPROVAL_RECORD_SCHEMA, RULE_APPROVAL_STATES, RULE_BEHAVIORS, RULE_SYNC_DROP_CODES, EDITED_RULE_BREADTH_WARNING_CODES, PERSISTED_RULE_MATCHES, EMPTY_DURABLE_RULE_PARTITION, PERMISSION_RULES_LATER_GRAMMAR_CODE, SESSION_RULES_GRAMMAR, readRuleGrammarStamp, readRuleOwner, principalNameOf, readRuleOffer2, } from "@sema-agent/core";
|
|
4
4
|
import { dialectProtocolJsonEncoder, sqlDbNowMs, SQL_DB_NOW_MS } from "./sql-driver.js";
|
|
5
5
|
import { isMissingColumnError } from "./sql-errors.js";
|
|
6
6
|
import { describeProbedTableDrift } from "./schema-drift-sentence.js";
|
|
7
7
|
import { canonicalJsonStringify } from "@sema-agent/core";
|
|
8
8
|
import { ensureIndexes } from "./ensure-index.js";
|
|
9
|
-
import { createZodColumnReader, decodeJsonColumn, foldJsonColumn, jsonColumnText, readJsonObjectColumn,
|
|
10
|
-
import { redactSecrets } from "../trace/redact.js";
|
|
9
|
+
import { createZodColumnReader, decodeJsonColumn, foldJsonColumn, jsonColumnText, readJsonObjectColumn, StoreCorruptError } from "./sql-json-column.js";
|
|
11
10
|
export function writerOfSqlRuleStore(store) {
|
|
12
11
|
const w = Reflect.get(store, PERMISSION_RULE_WRITER);
|
|
13
12
|
if (w === null || typeof w !== "object")
|
|
@@ -63,11 +62,9 @@ function readBucketRowBehavior(raw, what, ownerKey) {
|
|
|
63
62
|
return behavior;
|
|
64
63
|
}
|
|
65
64
|
class BucketRefusedError extends Error {
|
|
66
|
-
verdict;
|
|
67
65
|
code;
|
|
68
66
|
constructor(verdict, evidence, code) {
|
|
69
67
|
super(`${verdict} ${evidence}`);
|
|
70
|
-
this.verdict = verdict;
|
|
71
68
|
if (code !== undefined)
|
|
72
69
|
this.code = code;
|
|
73
70
|
}
|
|
@@ -593,13 +590,14 @@ export class SqlDurableRulePartitionProvider {
|
|
|
593
590
|
export function recordOwnerOf(record) {
|
|
594
591
|
return readRuleOwner(record.owner ?? { kind: "principal", principal: record.principal });
|
|
595
592
|
}
|
|
593
|
+
const RULE_BUCKET_SCAN_PAGE = 200;
|
|
596
594
|
export async function listRuleBucketOwners(db) {
|
|
597
595
|
const owners = [];
|
|
598
596
|
let after = "";
|
|
599
597
|
for (;;) {
|
|
600
598
|
const { rows } = await db.query(db.dialect === "mysql"
|
|
601
|
-
? `SELECT owner_key, owner_kind, principal FROM ${PERMISSION_RULE_TABLE} WHERE owner_key > ? ORDER BY owner_key LIMIT ${
|
|
602
|
-
: `SELECT owner_key, owner_kind, principal FROM ${PERMISSION_RULE_TABLE} WHERE owner_key > $1 ORDER BY owner_key LIMIT ${
|
|
599
|
+
? `SELECT owner_key, owner_kind, principal FROM ${PERMISSION_RULE_TABLE} WHERE owner_key > ? ORDER BY owner_key LIMIT ${RULE_BUCKET_SCAN_PAGE}`
|
|
600
|
+
: `SELECT owner_key, owner_kind, principal FROM ${PERMISSION_RULE_TABLE} WHERE owner_key > $1 ORDER BY owner_key LIMIT ${RULE_BUCKET_SCAN_PAGE}`, [after]);
|
|
603
601
|
for (const row of rows) {
|
|
604
602
|
after = String(row["owner_key"]);
|
|
605
603
|
const principal = row["principal"] === null || row["principal"] === undefined ? undefined : String(row["principal"]);
|
|
@@ -607,7 +605,7 @@ export async function listRuleBucketOwners(db) {
|
|
|
607
605
|
if (owner !== undefined)
|
|
608
606
|
owners.push(owner);
|
|
609
607
|
}
|
|
610
|
-
if (rows.length <
|
|
608
|
+
if (rows.length < RULE_BUCKET_SCAN_PAGE)
|
|
611
609
|
return owners;
|
|
612
610
|
}
|
|
613
611
|
}
|
|
@@ -861,84 +859,6 @@ export class SqlRuleImportTicketStore {
|
|
|
861
859
|
}
|
|
862
860
|
export const RULE_PENDING_APPROVAL_RETENTION_MS = 24 * 60 * 60_000;
|
|
863
861
|
export const RULE_REAP_BATCH = 500;
|
|
864
|
-
const UNDURABLE_PURGE_PAGE = 200;
|
|
865
|
-
const UNDURABLE_PURGE_OCC_ATTEMPTS = 5;
|
|
866
|
-
export async function purgeUndurableScopeRows(db, dialect, into, now = Date.now) {
|
|
867
|
-
const cols = `owner_key, ${bucketRowColumns(dialect)}`;
|
|
868
|
-
let after = "";
|
|
869
|
-
for (;;) {
|
|
870
|
-
const page = await db.rows(dialect === "mysql"
|
|
871
|
-
? `SELECT ${cols} FROM ${PERMISSION_RULE_TABLE} WHERE owner_key > ? ORDER BY owner_key LIMIT ${UNDURABLE_PURGE_PAGE}`
|
|
872
|
-
: `SELECT ${cols} FROM ${PERMISSION_RULE_TABLE} WHERE owner_key > $1 ORDER BY owner_key LIMIT ${UNDURABLE_PURGE_PAGE}`, [after]);
|
|
873
|
-
for (const first of page) {
|
|
874
|
-
const ownerKey = String(first.owner_key);
|
|
875
|
-
after = ownerKey;
|
|
876
|
-
let row = first;
|
|
877
|
-
let settled = false;
|
|
878
|
-
for (let attempt = 0; attempt < UNDURABLE_PURGE_OCC_ATTEMPTS && row !== undefined && !settled; attempt++) {
|
|
879
|
-
const outcome = await purgeOneBucket(db, dialect, ownerKey, row, now);
|
|
880
|
-
switch (outcome.kind) {
|
|
881
|
-
case "purged":
|
|
882
|
-
into.undurableScopeRuleRows.push(...outcome.rows);
|
|
883
|
-
settled = true;
|
|
884
|
-
break;
|
|
885
|
-
case "unreadable":
|
|
886
|
-
into.undurableScopeRuleBucketsUnreadable.push({ ownerKey, why: outcome.why });
|
|
887
|
-
settled = true;
|
|
888
|
-
break;
|
|
889
|
-
case "clean":
|
|
890
|
-
settled = true;
|
|
891
|
-
break;
|
|
892
|
-
case "conflict":
|
|
893
|
-
row = (await db.rows(dialect === "mysql" ? `SELECT ${cols} FROM ${PERMISSION_RULE_TABLE} WHERE owner_key = ?` : `SELECT ${cols} FROM ${PERMISSION_RULE_TABLE} WHERE owner_key = $1`, [ownerKey]))[0];
|
|
894
|
-
if (row === undefined)
|
|
895
|
-
settled = true;
|
|
896
|
-
break;
|
|
897
|
-
default: {
|
|
898
|
-
const unknown = outcome;
|
|
899
|
-
throw new Error(`M11: unhandled bucket outcome ${JSON.stringify(unknown)}`);
|
|
900
|
-
}
|
|
901
|
-
}
|
|
902
|
-
}
|
|
903
|
-
if (!settled)
|
|
904
|
-
into.undurableScopeRuleBucketsDeferred += 1;
|
|
905
|
-
}
|
|
906
|
-
if (page.length < UNDURABLE_PURGE_PAGE)
|
|
907
|
-
break;
|
|
908
|
-
}
|
|
909
|
-
}
|
|
910
|
-
async function purgeOneBucket(db, dialect, ownerKey, row, now) {
|
|
911
|
-
let cur;
|
|
912
|
-
try {
|
|
913
|
-
cur = decodeBucketRow(ownerKey, row);
|
|
914
|
-
}
|
|
915
|
-
catch (e) {
|
|
916
|
-
return { kind: "unreadable", why: contentFreeRefusal(ownerKey, e) };
|
|
917
|
-
}
|
|
918
|
-
const badRules = cur.rules.filter((r) => !isValidDurableScope(r.scope));
|
|
919
|
-
const badTombstones = cur.tombstones.filter((t) => !isValidDurableScope(t.scope));
|
|
920
|
-
if (badRules.length === 0 && badTombstones.length === 0)
|
|
921
|
-
return { kind: "clean" };
|
|
922
|
-
const rootOf = (scope) => redactSecrets(scope.kind === "project" ? scope.root : scope.kind);
|
|
923
|
-
const rows = [
|
|
924
|
-
...badRules.map((r) => ({ ownerKey, kind: applyTombstones([r], cur.tombstones).length > 0 ? "rule" : "revoked-rule", behavior: r.behavior, tool: r.tool, scopeRoot: rootOf(r.scope) })),
|
|
925
|
-
...badTombstones.map((t) => {
|
|
926
|
-
const parsed = parseRuleText(t.rule, t.behavior);
|
|
927
|
-
if ("reject" in parsed)
|
|
928
|
-
throw new Error(`permission_rule bucket ${ownerKey}: a tombstone the bucket judge admitted does not parse here — refusing to touch the bucket`);
|
|
929
|
-
return { ownerKey, kind: "tombstone", behavior: t.behavior, tool: parsed.rule.tool, scopeRoot: rootOf(t.scope) };
|
|
930
|
-
}),
|
|
931
|
-
];
|
|
932
|
-
const landed = await writeBucket((sql, params) => db.exec(sql, params), dialect, ownerKey, cur, { rules: cur.rules.filter((r) => !badRules.includes(r)), tombstones: cur.tombstones.filter((t) => !badTombstones.includes(t)) }, now());
|
|
933
|
-
return landed ? { kind: "purged", rows } : { kind: "conflict" };
|
|
934
|
-
}
|
|
935
|
-
function contentFreeRefusal(ownerKey, e) {
|
|
936
|
-
if (e instanceof BucketRefusedError)
|
|
937
|
-
return e.verdict;
|
|
938
|
-
if (e instanceof SqlJsonColumnError)
|
|
939
|
-
return `${e.where}: ${e.problem}`;
|
|
940
|
-
return `permission_rule bucket ${ownerKey}: the bucket judge threw ${e instanceof Error ? e.name : typeof e} (its text is withheld here: it may quote the row)`;
|
|
941
|
-
}
|
|
942
862
|
export function createSqlPermissionRuleStores(db, now) {
|
|
943
863
|
const q = (mysql, pg) => (db.dialect === "mysql" ? mysql : pg);
|
|
944
864
|
return {
|
|
@@ -1,33 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PostgreSQL pool + central schema — the PG sibling of tidb-pool.ts, for the second run-store backend
|
|
3
|
-
* (clay 2026-06-21). Schema ownership is CENTRAL (one ensurePgSchema, like tidb-pool's SCHEMA_STATEMENTS) — PG
|
|
4
|
-
* stores assume the tables exist and NEVER create their own (a per-store `CREATE TABLE IF NOT EXISTS` is
|
|
5
|
-
* first-writer-wins, so a trimmed table would shadow the full one and drop columns).
|
|
6
|
-
*
|
|
7
|
-
* Dialect deltas vs the MySQL DDL in tidb-pool.ts: JSON→JSONB, DATETIME(3)→TIMESTAMPTZ(3), TINYINT(1)→SMALLINT,
|
|
8
|
-
* inline `KEY …`→separate `CREATE INDEX`. checkpoint timestamps stay epoch-ms BIGINT (core's Checkpoint uses ms),
|
|
9
|
-
* matching the TiDB schema byte-for-byte semantically. Only the tables PG backends implement so far are listed
|
|
10
|
-
* (run-store + checkpoint); the remaining tidb-* tables are added as their PG stores land (tracked).
|
|
11
|
-
*
|
|
12
|
-
* ─────────────────────────────── SCHEMA POLICY (clay 裁 2026-07-26) ───────────────────────────────
|
|
13
|
-
* THIS CODE IS THE SINGLE SOURCE OF TRUTH for the PG schema, and there is NO in-place migration seam in this statement array: a database that
|
|
14
|
-
* lags behind the code is refused at boot with the exact `ALTER TABLE … ADD COLUMN …` statements printed, and the
|
|
15
|
-
* deployer runs them themselves: the column-set check and its refusal never alter a database. The only DDL this
|
|
16
|
-
* process runs by itself on a table that already exists is idempotent index creation (`ensureIndex`: indexes only,
|
|
17
|
-
* never a column) and the registered one-time migrations (each has a window and a registry row in
|
|
18
|
-
* `one-time-migrations.ts`) — adding / changing / renaming a column or dropping a table is done by those migrations
|
|
19
|
-
* and by nothing else.
|
|
20
|
-
*
|
|
21
|
-
* Consequence, and it is a hard rule: **do NOT add new `ALTER TABLE` seams here.** Every column / default /
|
|
22
|
-
* constraint change is folded into its own `CREATE TABLE`, and this array stays pure `CREATE TABLE` +
|
|
23
|
-
* `CREATE INDEX`. The historical additive-ALTER seams were folded in on 2026-07-26 (they had all decayed
|
|
24
|
-
* into permanent no-ops — the CREATEs already carried the columns).
|
|
25
|
-
*
|
|
26
|
-
* Because the seams are gone, the semantics they used to document now live as inline `--` comments ON THE
|
|
27
|
-
* COLUMN inside the CREATE, not as TypeScript comments outside the template literal: the full-set SQL
|
|
28
|
-
* baseline `docs/schema/baseline-pg.sql` is GENERATED from these statement strings, so only what is inside
|
|
29
|
-
* the SQL survives the export. The baseline is a derived artifact — regenerate it, never hand-edit it.
|
|
30
|
-
*/
|
|
31
1
|
import pg from "pg";
|
|
32
2
|
import type { ServiceConfig } from "../config-types.js";
|
|
33
3
|
export declare const PG_SCHEMA_STATEMENTS: readonly string[];
|
|
@@ -70,7 +40,7 @@ export type PgPoolWarnSink = (msg: string, meta?: Record<string, unknown>) => vo
|
|
|
70
40
|
* 不留痕则只能靠间接症状发现;
|
|
71
41
|
* · 不动 shutdown.ts 的 uncaughtException 钩 —— exit 1 对**真**未捕获仍是正确姿势,旁路兜底
|
|
72
42
|
* 会吞掉别人的崩溃([ref] 纪律:修源头,不下游兜)。
|
|
73
|
-
* `onIdleClientError` 缺省
|
|
43
|
+
* `onIdleClientError` 缺省 = 日志出口接缝缺省 logger 的 `warn`(与装配后同一种 JSON 行)——生产
|
|
74
44
|
* 装配(store-backend `createStoreBackend`)递结构化 logger 的 warn 座。 */
|
|
75
45
|
export declare function createPgPool(opts: string | pg.PoolConfig, onIdleClientError?: PgPoolWarnSink): pg.Pool;
|
|
76
46
|
/** A fixed bigint key for the `pg_advisory_lock` that serializes the whole `ensurePgSchema` DDL run (see below).
|
package/dist/plugins/pg-pool.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { createLogger, writeLogText } from "../observability/logger.js";
|
|
1
2
|
import pg from "pg";
|
|
2
3
|
import { recordFailOpen } from "../observability/fail-open.js";
|
|
3
4
|
import { pollUntilLocked } from "./ensure-schema-lock-policy.js";
|
|
4
5
|
import { RUN_IDENTITY_COLUMNS } from "../identity-source.js";
|
|
5
6
|
import { ensureSchema as ensureSessionSchema } from "../stores-sql/pg-session-storage.js";
|
|
6
7
|
import { sessionExtDdl } from "./session-ext-table.js";
|
|
8
|
+
import { CHECKPOINT_HOST_SESSION_COLUMN } from "./checkpoint-index-columns.js";
|
|
7
9
|
import { ensureSchema as ensureToolResultSchema } from "../stores-sql/tool-result-store-sql.js";
|
|
8
10
|
import { ensureSchema as ensureCostQuotaSchema } from "./pg-cost-quota.js";
|
|
9
11
|
import { ensureSchema as ensureRateLimitSchema } from "./pg-rate-limiter.js";
|
|
@@ -23,7 +25,7 @@ import { ensureIndexes } from "./ensure-index.js";
|
|
|
23
25
|
import { SESSION_RULES_COLUMN } from "./session-rules-column.js";
|
|
24
26
|
import { INBOX_PAYLOAD_COLUMN } from "./inbox-payload-column.js";
|
|
25
27
|
import { CENTRAL_SCHEMA_INDEXES } from "./schema-indexes.js";
|
|
26
|
-
import {
|
|
28
|
+
import { PRINCIPAL_MAX_BYTES } from "../principal-shape.js";
|
|
27
29
|
export const PG_SCHEMA_STATEMENTS = [
|
|
28
30
|
`CREATE TABLE IF NOT EXISTS task_run (
|
|
29
31
|
task_id VARCHAR(64) COLLATE "C" NOT NULL,
|
|
@@ -121,6 +123,8 @@ export const PG_SCHEMA_STATEMENTS = [
|
|
|
121
123
|
-- JSON ⇒ 与同表 outcome 列同取 JSONB(协议信封无损,IS NULL 谓词两方言同义)。
|
|
122
124
|
execution_outcome JSONB,
|
|
123
125
|
execution_at_ms BIGINT,
|
|
126
|
+
-- host_session_id:这张卡归在哪只会话上(MySQL 孪生同名同义;语义、写口与 M49 回填见 tidb-pool.ts 同名列的行内注)。
|
|
127
|
+
${CHECKPOINT_HOST_SESSION_COLUMN.pg},
|
|
124
128
|
PRIMARY KEY (token)
|
|
125
129
|
)`,
|
|
126
130
|
`CREATE TABLE IF NOT EXISTS checkpoint_ctx (
|
|
@@ -150,22 +154,27 @@ export const PG_SCHEMA_STATEMENTS = [
|
|
|
150
154
|
consumed_at_ms BIGINT NOT NULL,
|
|
151
155
|
expires_at_ms BIGINT NOT NULL,
|
|
152
156
|
PRIMARY KEY (session_id, nonce)
|
|
157
|
+
)`,
|
|
158
|
+
`CREATE TABLE IF NOT EXISTS approval_nonce_floor (
|
|
159
|
+
singleton CHAR(1) COLLATE "C" NOT NULL DEFAULT 'x',
|
|
160
|
+
floor_ms BIGINT NOT NULL,
|
|
161
|
+
PRIMARY KEY (singleton)
|
|
153
162
|
)`,
|
|
154
163
|
`CREATE TABLE IF NOT EXISTS org_delivery_sender_quota (
|
|
155
|
-
from_scope VARCHAR(${
|
|
164
|
+
from_scope VARCHAR(${PRINCIPAL_MAX_BYTES}) COLLATE "C" NOT NULL,
|
|
156
165
|
window_start_ms BIGINT NOT NULL,
|
|
157
166
|
attempts INT NOT NULL,
|
|
158
167
|
PRIMARY KEY (from_scope)
|
|
159
168
|
)`,
|
|
160
169
|
`CREATE TABLE IF NOT EXISTS org_delivery_recipient_quota (
|
|
161
|
-
to_scope VARCHAR(${
|
|
170
|
+
to_scope VARCHAR(${PRINCIPAL_MAX_BYTES}) COLLATE "C" NOT NULL,
|
|
162
171
|
window_start_ms BIGINT NOT NULL,
|
|
163
172
|
delivered INT NOT NULL,
|
|
164
173
|
PRIMARY KEY (to_scope)
|
|
165
174
|
)`,
|
|
166
175
|
`CREATE TABLE IF NOT EXISTS org_delivery_pair_quota (
|
|
167
|
-
to_scope VARCHAR(${
|
|
168
|
-
from_scope VARCHAR(${
|
|
176
|
+
to_scope VARCHAR(${PRINCIPAL_MAX_BYTES}) COLLATE "C" NOT NULL,
|
|
177
|
+
from_scope VARCHAR(${PRINCIPAL_MAX_BYTES}) COLLATE "C" NOT NULL,
|
|
169
178
|
window_start_ms BIGINT NOT NULL,
|
|
170
179
|
delivered INT NOT NULL,
|
|
171
180
|
PRIMARY KEY (to_scope, from_scope)
|
|
@@ -430,7 +439,7 @@ export function pgPoolClientErrorMeta(err) {
|
|
|
430
439
|
}
|
|
431
440
|
export function createPgPool(opts, onIdleClientError) {
|
|
432
441
|
const pool = typeof opts === "string" ? new pg.Pool({ connectionString: opts }) : new pg.Pool(opts);
|
|
433
|
-
const warn = onIdleClientError ?? (
|
|
442
|
+
const warn = onIdleClientError ?? createLogger().warn;
|
|
434
443
|
const report = (msgName, state, err, count) => {
|
|
435
444
|
const meta = pgPoolClientErrorMeta(err);
|
|
436
445
|
try {
|
|
@@ -477,7 +486,7 @@ export async function releasePgEnsureSchemaLock(client, tag) {
|
|
|
477
486
|
await client.query("SELECT pg_advisory_unlock($1)", [ENSURE_SCHEMA_LOCK_KEY]);
|
|
478
487
|
}
|
|
479
488
|
catch (err) {
|
|
480
|
-
|
|
489
|
+
writeLogText("stderr", `[${tag}] pg_advisory_unlock(${ENSURE_SCHEMA_LOCK_KEY}) failed (lock auto-frees on connection close):`, err);
|
|
481
490
|
}
|
|
482
491
|
}
|
|
483
492
|
export async function ensurePgSchema(pool) {
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
* iterator MAY throw `RemoteExecutionError` mid-stream before an `exit` chunk (seam contract, OutputChunk).
|
|
21
21
|
*/
|
|
22
22
|
import { Sandbox, type SandboxOpts, type SandboxConnectOpts } from "e2b";
|
|
23
|
-
import { FileError, ExecutionError, RemoteExecutionError, type ExecutionEnv, type RemoteExecutionEnv, type WorkspaceHandle, type FileInfo, type Result, type SymlinkChain, type OutputChunk, type ExecStreamOptions, type RemoteConnectConfig, type SnapshotId, type SessionToken, type ExecutionEnvFactory, type VmLifecycleOptions, type BackgroundShellCapability, type BackgroundShellId, type BackgroundShellError, type BackgroundSpawnOptions, type BackgroundPoll, type ExecutionEnvCapabilities } from "@sema-agent/core";
|
|
23
|
+
import { FileError, ExecutionError, RemoteExecutionError, type ExecutionEnv, type ExecResult, type RemoteExecutionEnv, type WorkspaceHandle, type FileInfo, type Result, type SymlinkChain, type OutputChunk, type ExecStreamOptions, type RemoteConnectConfig, type SnapshotId, type SessionToken, type ExecutionEnvFactory, type VmLifecycleOptions, type BackgroundShellCapability, type BackgroundShellId, type BackgroundShellError, type BackgroundSpawnOptions, type BackgroundPoll, type ExecutionEnvCapabilities } from "@sema-agent/core";
|
|
24
24
|
import { type SandboxReadFloorKnob } from "../execution-lane-caps.js";
|
|
25
25
|
import { type SandboxReadFloor } from "./sandbox-read-floor.js";
|
|
26
26
|
import { type LaneHomeConfig } from "../lane-home-probe.js";
|
|
@@ -159,18 +159,6 @@ export declare class RemoteContainerExecutionEnv implements RemoteExecutionEnv,
|
|
|
159
159
|
/** 收据句柄。还没连上(懒环境:续跑腿的引擎在 `resumeVM` **之前**先取它比车道)⇒ 未连接形 `{ sandboxId: "(unconnected)", provider, mountPath }`(与 k8s 车道同形),
|
|
160
160
|
* 不抛 —— 抛了,续跑腿在恢复之前就失败。 */
|
|
161
161
|
workspaceHandle(): WorkspaceHandle;
|
|
162
|
-
/**
|
|
163
|
-
* Public host for a port inside the sandbox (E2B reverse proxy → `<port>-<id>.e2b.app`). The LSP sidecar
|
|
164
|
-
* ([ref] §13.1) uses this to reach the in-sandbox language-server WS bridge over `wss://`. Lazily
|
|
165
|
-
* provisions the VM (like exec/fs); `undefined` if it can't connect → the LSP manager degrades.
|
|
166
|
-
*/
|
|
167
|
-
getHost(port: number): Promise<string | undefined>;
|
|
168
|
-
/**
|
|
169
|
-
* Launch a long-running process as a TRUE E2B background command (resolves once launched, E2B keeps it alive)
|
|
170
|
-
* — for the LSP bridge ([ref] §13.1). NOT the same as `exec` with a shell `&`: E2B reaps a foreground
|
|
171
|
-
* command's process group on completion, which would kill an in-shell `&`/nohup child. Fire-and-forget.
|
|
172
|
-
*/
|
|
173
|
-
startBackground(command: string): Promise<void>;
|
|
174
162
|
connect(config?: RemoteConnectConfig): Promise<{
|
|
175
163
|
ok: true;
|
|
176
164
|
value: WorkspaceHandle;
|
|
@@ -251,14 +239,7 @@ export declare class RemoteContainerExecutionEnv implements RemoteExecutionEnv,
|
|
|
251
239
|
private stopKeepAlive;
|
|
252
240
|
destroy(): Promise<void>;
|
|
253
241
|
cleanup(): Promise<void>;
|
|
254
|
-
exec(command: string, options?: ExecOpts): Promise<Result<
|
|
255
|
-
stdout: string;
|
|
256
|
-
stderr: string;
|
|
257
|
-
exitCode: number;
|
|
258
|
-
detached?: {
|
|
259
|
-
shellId: string;
|
|
260
|
-
};
|
|
261
|
-
}, ExecutionError>>;
|
|
242
|
+
exec(command: string, options?: ExecOpts): Promise<Result<ExecResult, ExecutionError>>;
|
|
262
243
|
/** 适配器自己的固定命令(文件面助手:readlink / realpath / rm / mktemp / 暂存写的提交)—— 与 {@link exec} 同一条路,起动形 `adapter`。 */
|
|
263
244
|
private execInternal;
|
|
264
245
|
private execAs;
|
|
@@ -355,10 +336,11 @@ export declare class RemoteContainerExecutionEnv implements RemoteExecutionEnv,
|
|
|
355
336
|
* confirmations: a refused `kill()` (logged; the exit is still awaited), a `wait()` that ends without an exit (the
|
|
356
337
|
* connection deadline, a lost stream — the process may still run). With neither the count stays held and `suspendVM`
|
|
357
338
|
* keeps refusing `command_in_flight` — the same arm as a start that never settles. No start promise (the op never ran)
|
|
358
|
-
* ⇒ released now. A
|
|
359
|
-
*
|
|
360
|
-
*
|
|
361
|
-
* not
|
|
339
|
+
* ⇒ released now. A start that FAILED is read by the same rule ({@link providerRefusedStart}): the provider answered a
|
|
340
|
+
* refusal of the request itself ⇒ no process was ever spawned — a confirmation, released; any other failure (the SDK's
|
|
341
|
+
* own handshake deadline, a dropped stream, an unreachable sandbox, anything else) has no answer in it — the provider may
|
|
342
|
+
* have spawned the process and the reply was lost ⇒ not a confirmation, held, and said once
|
|
343
|
+
* (`e2b_start_outcome_unknown`: the sandbox and the error's class, never the command).
|
|
362
344
|
*/
|
|
363
345
|
private settleAbandonedStart;
|
|
364
346
|
/**
|
|
@@ -140,19 +140,6 @@ export class RemoteContainerExecutionEnv {
|
|
|
140
140
|
workspaceHandle() {
|
|
141
141
|
return this.handle ?? { sandboxId: "(unconnected)", provider: PROVIDER, mountPath: this.cwd };
|
|
142
142
|
}
|
|
143
|
-
async getHost(port) {
|
|
144
|
-
const conn = await this.ensureConnected();
|
|
145
|
-
return conn.ok ? conn.value.getHost(port) : undefined;
|
|
146
|
-
}
|
|
147
|
-
async startBackground(command) {
|
|
148
|
-
const conn = await this.ensureConnected();
|
|
149
|
-
if (!conn.ok)
|
|
150
|
-
return;
|
|
151
|
-
const s = this.startIn(engineStart(undefined), command, undefined);
|
|
152
|
-
if (!s.ok)
|
|
153
|
-
return void this.cfg.logger?.warn?.("remote_env_background_refused", { error: s.error.message });
|
|
154
|
-
await this.runIn(conn.value, s.value, { background: true });
|
|
155
|
-
}
|
|
156
143
|
async connect(config) {
|
|
157
144
|
if (config?.snapshotId) {
|
|
158
145
|
return this.resumeVM(config.snapshotId, config.abortSignal ? { abortSignal: config.abortSignal } : undefined);
|
|
@@ -507,7 +494,7 @@ export class RemoteContainerExecutionEnv {
|
|
|
507
494
|
background: true,
|
|
508
495
|
cwd: this.resolve(options?.cwd ?? this.cwd),
|
|
509
496
|
timeoutMs: tee
|
|
510
|
-
?
|
|
497
|
+
? this.commandTimeoutMs(options?.timeout) + (E2B_BG_MAX_TIMEOUT_SEC + E2B_BG_PROVIDER_BACKSTOP_PAD_SEC) * 1000
|
|
511
498
|
: this.commandTimeoutMs(options?.timeout),
|
|
512
499
|
onStdout: (d) => {
|
|
513
500
|
if (startCut)
|
|
@@ -554,12 +541,14 @@ export class RemoteContainerExecutionEnv {
|
|
|
554
541
|
waitP.then(markResolved, markResolved);
|
|
555
542
|
let fgSettled = false;
|
|
556
543
|
let adoptedShellId;
|
|
544
|
+
let adoptedCause;
|
|
557
545
|
let onDetach;
|
|
546
|
+
let onDetachSignal;
|
|
558
547
|
const detachedP = detachSignal && tee
|
|
559
548
|
? new Promise((res) => {
|
|
560
|
-
|
|
549
|
+
const adoptRunning = (cause) => {
|
|
561
550
|
if (detached || fgSettled || fgResolved || options?.abortSignal?.aborted)
|
|
562
|
-
return;
|
|
551
|
+
return false;
|
|
563
552
|
const adopted = this.bgManager.adoptSync((ctx) => {
|
|
564
553
|
waitP
|
|
565
554
|
.then((r) => ctx.onTerminal(false, r.exitCode))
|
|
@@ -572,22 +561,28 @@ export class RemoteContainerExecutionEnv {
|
|
|
572
561
|
return { handle, stdout: tee.stdout, stderr: tee.stderr };
|
|
573
562
|
});
|
|
574
563
|
if (!adopted)
|
|
575
|
-
return;
|
|
564
|
+
return false;
|
|
576
565
|
adoptedShellId = adopted.shellId;
|
|
566
|
+
adoptedCause = cause;
|
|
577
567
|
detached = true;
|
|
578
568
|
res("detached");
|
|
569
|
+
return true;
|
|
579
570
|
};
|
|
571
|
+
onDetach = adoptRunning;
|
|
572
|
+
const signalled = () => void adoptRunning();
|
|
573
|
+
onDetachSignal = signalled;
|
|
580
574
|
if (detachSignal.aborted)
|
|
581
|
-
|
|
575
|
+
signalled();
|
|
582
576
|
else
|
|
583
|
-
detachSignal.addEventListener("abort",
|
|
577
|
+
detachSignal.addEventListener("abort", signalled, { once: true });
|
|
584
578
|
})
|
|
585
579
|
: undefined;
|
|
580
|
+
const onWall = options?.autoBackgroundOnTimeout === true && detachedP !== undefined ? () => onDetach?.("timeout") === true : undefined;
|
|
586
581
|
try {
|
|
587
582
|
const fg = this.waitWithLiveness(handle, () => lastProgress, {
|
|
588
583
|
waitP,
|
|
589
584
|
disarmed: () => detached,
|
|
590
|
-
...(tee ? { wall: { totalMs: this.commandTimeoutMs(options?.timeout), leftMs: Math.max(0, this.commandTimeoutMs(options?.timeout) - (Date.now() - startedAt)) } } : {}),
|
|
585
|
+
...(tee ? { wall: { totalMs: this.commandTimeoutMs(options?.timeout), leftMs: Math.max(0, this.commandTimeoutMs(options?.timeout) - (Date.now() - startedAt)), ...(onWall !== undefined ? { onWall } : {}) } } : {}),
|
|
591
586
|
liveness: bounds.liveness,
|
|
592
587
|
captured,
|
|
593
588
|
});
|
|
@@ -599,7 +594,7 @@ export class RemoteContainerExecutionEnv {
|
|
|
599
594
|
stdout: markTruncated(o.text, o.droppedBytes),
|
|
600
595
|
stderr: markTruncated(e.text, e.droppedBytes),
|
|
601
596
|
exitCode: 0,
|
|
602
|
-
detached: { shellId: adoptedShellId },
|
|
597
|
+
detached: { shellId: adoptedShellId, ...(adoptedCause !== undefined ? { cause: adoptedCause } : {}) },
|
|
603
598
|
});
|
|
604
599
|
}
|
|
605
600
|
if (options?.abortSignal?.aborted && !detached) {
|
|
@@ -618,8 +613,8 @@ export class RemoteContainerExecutionEnv {
|
|
|
618
613
|
}
|
|
619
614
|
finally {
|
|
620
615
|
fgSettled = true;
|
|
621
|
-
if (
|
|
622
|
-
detachSignal.removeEventListener("abort",
|
|
616
|
+
if (onDetachSignal && detachSignal)
|
|
617
|
+
detachSignal.removeEventListener("abort", onDetachSignal);
|
|
623
618
|
this.activeCommands--;
|
|
624
619
|
options?.abortSignal?.removeEventListener("abort", onAbort);
|
|
625
620
|
}
|
|
@@ -673,7 +668,7 @@ export class RemoteContainerExecutionEnv {
|
|
|
673
668
|
const bc = boundCut(first);
|
|
674
669
|
throw new RemoteExecutionError(bc.code, bc.message, e);
|
|
675
670
|
}
|
|
676
|
-
throw this.remoteError(e, "connect_failed");
|
|
671
|
+
throw this.remoteError(e, providerTimedOut(e) ? "timeout" : "connect_failed");
|
|
677
672
|
}
|
|
678
673
|
handle
|
|
679
674
|
.wait()
|
|
@@ -1083,7 +1078,15 @@ export class RemoteContainerExecutionEnv {
|
|
|
1083
1078
|
late.kill().then(release, (e) => {
|
|
1084
1079
|
this.cfg.logger?.warn?.("e2b_abandoned_start_kill_failed", { sandboxId: this.sbx?.sandboxId, pid: late.pid, error: e instanceof Error ? e.name : typeof e });
|
|
1085
1080
|
});
|
|
1086
|
-
},
|
|
1081
|
+
}, (e) => {
|
|
1082
|
+
if (providerRefusedStart(e))
|
|
1083
|
+
return release();
|
|
1084
|
+
this.cfg.logger?.warn?.("e2b_start_outcome_unknown", {
|
|
1085
|
+
sandboxId: this.sbx?.sandboxId,
|
|
1086
|
+
error: e instanceof Error ? e.name : typeof e,
|
|
1087
|
+
effect: "the command start failed without the provider refusing it — the command may be running, so this sandbox is not suspended (command_in_flight) for the rest of its life",
|
|
1088
|
+
});
|
|
1089
|
+
});
|
|
1087
1090
|
}
|
|
1088
1091
|
commandTimeoutMs(timeoutSec) {
|
|
1089
1092
|
return timeoutSec != null ? timeoutSec * 1000 : this.cfg.timeoutMs;
|
|
@@ -1115,6 +1118,8 @@ export class RemoteContainerExecutionEnv {
|
|
|
1115
1118
|
wallTimer = setTimeout(() => {
|
|
1116
1119
|
if (opts.disarmed?.())
|
|
1117
1120
|
return;
|
|
1121
|
+
if (wall.onWall?.() === true)
|
|
1122
|
+
return;
|
|
1118
1123
|
reject(createCutError({ code: "timeout", message: wallCutMessage(wall.totalMs) }, opts.captured()));
|
|
1119
1124
|
void handle.kill().catch(() => { });
|
|
1120
1125
|
}, wall.leftMs);
|
|
@@ -1232,6 +1237,10 @@ function boundCut(first) {
|
|
|
1232
1237
|
function providerTimedOut(e) {
|
|
1233
1238
|
return e?.name === "TimeoutError" || /timeout|timed out/i.test(errMsg(e));
|
|
1234
1239
|
}
|
|
1240
|
+
const E2B_START_REFUSALS = new Set(["InvalidArgumentError", "AuthenticationError", "NotFoundError", "RateLimitError"]);
|
|
1241
|
+
function providerRefusedStart(e) {
|
|
1242
|
+
return e instanceof Error && E2B_START_REFUSALS.has(e.name);
|
|
1243
|
+
}
|
|
1235
1244
|
function anySignal(signals) {
|
|
1236
1245
|
const ctor = AbortSignal;
|
|
1237
1246
|
if (typeof ctor.any === "function")
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FileError, type InheritEnvPolicy, ExecutionError, RemoteExecutionError, SchedulerError, type SchedulerCapability, type ScheduledIntent, type SchedulerContext, type ScheduledTaskId, type ScheduledTaskSummary, type ExecutionEnv, type RemoteExecutionEnv, type WorkspaceHandle, type FileInfo, type Result, type SymlinkChain, type BoundFileObject, type OutputChunk, type ExecStreamOptions, type RemoteConnectConfig, type SnapshotId, type SessionToken, type VmLifecycleOptions, type ExecutionEnvFactory, BackgroundShellError, type BackgroundShellCapability, type BackgroundShellId, type BackgroundHardKillOutcome, type BackgroundPoll, type BackgroundSpawnOptions, type SecretEnvFinding } from "@sema-agent/core";
|
|
1
|
+
import { FileError, type InheritEnvPolicy, ExecutionError, RemoteExecutionError, SchedulerError, type SchedulerCapability, type ScheduledIntent, type SchedulerContext, type ScheduledTaskId, type ScheduledTaskSummary, type ExecutionEnv, type ExecResult, type RemoteExecutionEnv, type WorkspaceHandle, type FileInfo, type Result, type SymlinkChain, type BoundFileObject, type OutputChunk, type ExecStreamOptions, type RemoteConnectConfig, type SnapshotId, type SessionToken, type VmLifecycleOptions, type ExecutionEnvFactory, BackgroundShellError, type BackgroundShellCapability, type BackgroundShellId, type BackgroundHardKillOutcome, type BackgroundPoll, type BackgroundSpawnOptions, type SecretEnvFinding } from "@sema-agent/core";
|
|
2
2
|
import { type LaneHomeConfig } from "../lane-home-probe.js";
|
|
3
3
|
/** Options accepted by `ExecutionEnv.exec` (core does not re-export the type; derive it from the seam). */
|
|
4
4
|
type ExecOpts = Parameters<ExecutionEnv["exec"]>[1];
|
|
@@ -264,14 +264,7 @@ export declare class RemoteHostExecutionEnv implements RemoteExecutionEnv, Sched
|
|
|
264
264
|
disposeBackgroundShells(opts?: {
|
|
265
265
|
except?: readonly BackgroundShellId[];
|
|
266
266
|
}): Promise<void>;
|
|
267
|
-
exec(command: string, options?: ExecOpts): Promise<Result<
|
|
268
|
-
stdout: string;
|
|
269
|
-
stderr: string;
|
|
270
|
-
exitCode: number;
|
|
271
|
-
detached?: {
|
|
272
|
-
shellId: string;
|
|
273
|
-
};
|
|
274
|
-
}, ExecutionError>>;
|
|
267
|
+
exec(command: string, options?: ExecOpts): Promise<Result<ExecResult, ExecutionError>>;
|
|
275
268
|
/** 管道旧形(win32 / spool 打开失败的回退;行为=1.225 及以前的 exec 原样)。 */
|
|
276
269
|
private execViaPipes;
|
|
277
270
|
/** [ref] fg spool pair:tmpdir 私有根下专属子目录(五轮复审迁址,workspace=命令可写区不可放)+ "ax"
|