@sema-agent/server 7.146.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 +1423 -24
- package/README.md +21 -8
- package/README.zh-CN.md +15 -9
- package/USAGE.md +537 -216
- package/deploy/facts/lanes.json +7 -0
- package/deploy/sema-up/README.md +18 -7
- package/deploy/sema-up/chart/templates/NOTES.txt +1 -1
- package/deploy/sema-up/chart/templates/_helpers.tpl +42 -4
- package/deploy/sema-up/chart/templates/server-v4pro.yaml +5 -4
- package/deploy/sema-up/chart/templates/server.yaml +5 -4
- package/deploy/sema-up/chart/values.yaml +4 -3
- package/deploy/sema-up/cluster-up.sh +75 -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/flagshape.sh +4 -0
- 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/lanes.json +2 -5
- 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 +26 -48
- 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 +18 -5
- package/deploy/sema-up/stack/sema-stack-cluster.yaml +25 -3
- 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 +32 -34
- 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 +16 -14
- package/dist/approval.js +3 -3
- package/dist/audit.d.ts +10 -3
- package/dist/audit.js +17 -9
- 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 +8 -3
- 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/crash-last.js +2 -1
- package/dist/boot/deployment-mods.d.ts +1 -1
- package/dist/boot/device-lane.js +5 -5
- package/dist/boot/engine-lease.d.ts +12 -11
- package/dist/boot/execution-env.d.ts +19 -8
- package/dist/boot/execution-env.js +80 -62
- package/dist/boot/execution-lane.d.ts +37 -9
- package/dist/boot/execution-lane.js +74 -20
- package/dist/boot/exit-boundary.d.ts +3 -3
- package/dist/boot/exit-boundary.js +6 -5
- package/dist/boot/exit-last.js +2 -1
- package/dist/boot/fatal-exit.d.ts +3 -5
- package/dist/boot/fatal-exit.js +2 -2
- package/dist/boot/governance-seams.d.ts +2 -2
- package/dist/boot/leader.d.ts +15 -0
- package/dist/boot/leader.js +18 -16
- package/dist/boot/memory-boundary.d.ts +11 -11
- package/dist/boot/memory-boundary.js +3 -3
- package/dist/boot/memory-consolidation.d.ts +50 -53
- package/dist/boot/memory-consolidation.js +11 -18
- package/dist/boot/org-memory.js +4 -3
- package/dist/boot/parked-revive-gate.d.ts +1 -1
- package/dist/boot/parked-revive-gate.js +3 -3
- package/dist/boot/reapers.d.ts +4 -3
- package/dist/boot/reapers.js +20 -17
- package/dist/boot/resolve-spec.d.ts +5 -3
- package/dist/boot/resolve-spec.js +133 -165
- package/dist/boot/retention-lane.d.ts +7 -45
- 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 +17 -7
- package/dist/boot/session-faces.js +122 -96
- package/dist/boot/shutdown.d.ts +5 -4
- package/dist/boot/shutdown.js +6 -4
- package/dist/boot/stage-01-config.d.ts +1 -1
- package/dist/boot/stage-01-config.js +14 -2
- package/dist/boot/stage-02-web-admin-pull.d.ts +2 -1
- package/dist/boot/stage-02-web-admin-pull.js +15 -8
- package/dist/boot/stage-03-store-backend.d.ts +4 -1
- package/dist/boot/stage-03-store-backend.js +4 -3
- package/dist/boot/stage-04-stores.d.ts +3 -1
- package/dist/boot/stage-04-stores.js +2 -2
- package/dist/boot/stage-05-execution-env.d.ts +9 -5
- package/dist/boot/stage-05-execution-env.js +5 -5
- package/dist/boot/stage-06-runners.d.ts +13 -15
- package/dist/boot/stage-06-runners.js +24 -18
- package/dist/boot/stage-07-capability-layer.d.ts +14 -11
- package/dist/boot/stage-07-capability-layer.js +9 -12
- package/dist/boot/stage-08-reapers.d.ts +14 -11
- package/dist/boot/stage-08-reapers.js +3 -3
- package/dist/boot/stage-09-leader.d.ts +16 -18
- package/dist/boot/stage-09-leader.js +12 -4
- package/dist/boot/stage-10-http-server.d.ts +16 -18
- package/dist/boot/stage-10-http-server.js +9 -5
- package/dist/boot/store-evidence.d.ts +20 -0
- package/dist/boot/store-evidence.js +13 -0
- package/dist/boot/stores.d.ts +12 -0
- package/dist/boot/stores.js +39 -17
- 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 +58 -38
- 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 +9 -1
- package/dist/capabilities/center-plugins.js +37 -11
- package/dist/capabilities/center-wiring.js +1 -1
- package/dist/capabilities/composite-members.d.ts +3 -2
- package/dist/capabilities/composite-members.js +3 -2
- package/dist/capabilities/execution-lane.d.ts +7 -7
- package/dist/capabilities/execution-lane.js +2 -2
- package/dist/capabilities/hands-lane.d.ts +1 -1
- package/dist/capabilities/repo-tools.d.ts +2 -0
- package/dist/capabilities/repo-tools.js +14 -12
- package/dist/capabilities/scenarios.d.ts +38 -33
- package/dist/capabilities/scenarios.js +24 -25
- package/dist/capabilities/settings-contract.d.ts +29 -0
- package/dist/capabilities/settings-contract.js +14 -0
- package/dist/capabilities/skills.d.ts +6 -6
- package/dist/capabilities/tool-defer.d.ts +1 -1
- package/dist/capability-facts.d.ts +69 -4
- package/dist/capability-facts.js +77 -5
- 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 +10 -5
- package/dist/config-catalog.d.ts +16 -1
- package/dist/config-catalog.js +68 -61
- package/dist/config-dir-trust.d.ts +37 -4
- package/dist/config-dir-trust.js +88 -44
- package/dist/config-invariants.d.ts +58 -4
- package/dist/config-invariants.js +104 -23
- package/dist/config-lkg.d.ts +24 -2
- package/dist/config-lkg.js +22 -9
- package/dist/config-provider.d.ts +9 -9
- package/dist/config-provider.js +25 -108
- package/dist/config-pull-failure.d.ts +50 -0
- package/dist/config-pull-failure.js +48 -0
- package/dist/config-types.d.ts +215 -202
- package/dist/config.d.ts +69 -14
- package/dist/config.js +188 -96
- package/dist/degenerate-instrument.js +1 -1
- package/dist/delegated-session-owner.d.ts +1 -1
- package/dist/deleted-session-ids.d.ts +3 -2
- package/dist/deploy-facts.js +3 -2
- package/dist/deployment-governance.d.ts +3 -3
- package/dist/deployment-shape.d.ts +51 -16
- package/dist/deployment-shape.js +31 -6
- 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.d.ts +7 -5
- package/dist/env-facts.js +12 -7
- package/dist/env-witness.d.ts +7 -0
- package/dist/env-witness.js +16 -0
- package/dist/execution-config-root.d.ts +5 -5
- package/dist/execution-config-root.js +5 -5
- package/dist/execution-env-purpose.d.ts +14 -0
- package/dist/execution-env-purpose.js +29 -0
- package/dist/execution-lane-caps.d.ts +53 -103
- package/dist/execution-lane-caps.js +51 -83
- package/dist/execution-placement.d.ts +65 -9
- package/dist/execution-placement.js +58 -0
- 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.d.ts +2 -2
- package/dist/file-history-disclosure.js +1 -0
- package/dist/fleet/drain-entry.d.ts +17 -10
- package/dist/fleet/drain-entry.js +1 -1
- 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 +6 -7
- 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 +42 -0
- package/dist/history-anchor.js +34 -0
- package/dist/hitl-delivery.d.ts +90 -0
- package/dist/hitl-delivery.js +98 -0
- package/dist/hooks/classic-stations.d.ts +8 -11
- package/dist/hooks/classic-stations.js +0 -7
- package/dist/hooks/command-spawn.d.ts +1 -4
- package/dist/hooks/command-spawn.js +0 -11
- package/dist/hooks/hook-llm.d.ts +5 -1
- package/dist/hooks/hook-llm.js +24 -15
- package/dist/hooks/hook-runner.d.ts +119 -65
- package/dist/hooks/hook-runner.js +415 -217
- 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 +5 -8
- package/dist/http/approval-sweeps.js +55 -30
- package/dist/http/caller-trust.d.ts +8 -10
- package/dist/http/caller-trust.js +1 -2
- package/dist/http/checkpoint-ctx.d.ts +17 -0
- package/dist/http/checkpoint-ctx.js +6 -0
- package/dist/http/claim-heartbeat.d.ts +49 -0
- package/dist/http/claim-heartbeat.js +46 -0
- package/dist/http/claim-latency.d.ts +10 -0
- package/dist/http/claim-latency.js +12 -0
- package/dist/http/claimed-run.d.ts +4 -3
- package/dist/http/dispatch.d.ts +8 -1
- package/dist/http/dispatch.js +77 -31
- package/dist/http/durable-run-leg.d.ts +3 -3
- package/dist/http/durable-run-leg.js +18 -12
- package/dist/http/execution-context.d.ts +18 -42
- package/dist/http/execution-context.js +11 -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 +7 -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 +3 -3
- package/dist/http/memory-store-refusal-reply.js +6 -0
- package/dist/http/owner-access.d.ts +391 -56
- package/dist/http/owner-access.js +372 -33
- package/dist/http/principal-gate.d.ts +26 -94
- package/dist/http/principal-gate.js +24 -81
- package/dist/http/refusal-body.d.ts +35 -2
- package/dist/http/refusal-body.js +34 -0
- package/dist/http/request-guards.d.ts +10 -14
- 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 +24 -24
- package/dist/http/resume-legs.js +260 -171
- package/dist/http/retired-skill-manifest.d.ts +1 -1
- package/dist/http/rewind-files-reply.d.ts +34 -0
- package/dist/http/rewind-files-reply.js +36 -0
- package/dist/http/route-ctx.d.ts +56 -47
- package/dist/http/route-table.js +2 -0
- 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 +73 -88
- 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 +23 -20
- package/dist/http/routes/config-catalog.js +2 -2
- package/dist/http/routes/devices.d.ts +3 -3
- package/dist/http/routes/devices.js +5 -5
- 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 +3 -1
- 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 +12 -20
- 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 +70 -0
- package/dist/http/routes/projects.js +87 -0
- package/dist/http/routes/retention-ops.js +6 -9
- package/dist/http/routes/rules.js +50 -7
- 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 +148 -233
- 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 +48 -30
- package/dist/http/routes/sessions-list.d.ts +3 -3
- package/dist/http/routes/sessions-list.js +9 -9
- package/dist/http/routes/sessions.d.ts +7 -1
- package/dist/http/routes/sessions.js +177 -112
- package/dist/http/routes/shared-memory.js +6 -6
- package/dist/http/routes/side-query.js +2 -2
- package/dist/http/routes/tasks.js +144 -122
- 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 +63 -50
- package/dist/http/server.js +52 -16
- 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 +17 -3
- package/dist/http/stored-body-replay.js +11 -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 +23 -13
- package/dist/identity-source.d.ts +36 -5
- package/dist/identity-source.js +27 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.js +2 -1
- package/dist/instruction-source-notice.d.ts +1 -1
- 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-embedder-reembed.d.ts +38 -0
- package/dist/memory-embedder-reembed.js +20 -0
- package/dist/memory-incident-sink.d.ts +0 -28
- package/dist/memory-incident-sink.js +5 -0
- package/dist/memory-operator-faces.d.ts +5 -4
- package/dist/memory-operator-faces.js +1 -1
- package/dist/memory-scope.d.ts +31 -4
- package/dist/memory-scope.js +65 -16
- package/dist/memory-store-refusal.d.ts +20 -4
- package/dist/memory-store-refusal.js +1 -1
- package/dist/memory-sync-client.d.ts +5 -2
- package/dist/memory-sync-client.js +19 -14
- package/dist/memory-sync.js +1 -1
- package/dist/model-compat.d.ts +51 -28
- package/dist/model-compat.js +55 -23
- 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 +46 -17
- package/dist/model-entry-refusal.js +47 -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 +28 -2
- package/dist/namespaced-rule-name.js +10 -1
- 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 +75 -47
- package/dist/observability/fail-open.js +77 -47
- package/dist/observability/logger.d.ts +22 -1
- package/dist/observability/logger.js +89 -12
- package/dist/observability/metrics.d.ts +2 -0
- package/dist/observability/metrics.js +5 -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/observability/secret-env-scrub.d.ts +30 -4
- package/dist/observability/secret-env-scrub.js +15 -3
- 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-agent-session-index.d.ts +7 -12
- package/dist/orchestration/workflow-agent-session-index.js +1 -6
- package/dist/orchestration/workflow-completion-inbox.d.ts +29 -9
- package/dist/orchestration/workflow-completion-inbox.js +65 -46
- package/dist/org-delivery-gate.d.ts +5 -4
- package/dist/org-delivery-gate.js +7 -6
- package/dist/org-memory-admission.d.ts +5 -2
- package/dist/org-memory-admission.js +25 -10
- 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 +100 -31
- package/dist/parked-decide.js +162 -48
- 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 +28 -9
- package/dist/plugins/approval-ask-store-file.js +74 -18
- package/dist/plugins/approval-ask-store-memory.d.ts +17 -7
- package/dist/plugins/approval-ask-store-memory.js +35 -12
- package/dist/plugins/approval-ask-store-sql.d.ts +42 -20
- package/dist/plugins/approval-ask-store-sql.js +44 -11
- 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 +40 -195
- package/dist/plugins/blob-backend.js +41 -234
- package/dist/plugins/caching-session-store.d.ts +22 -5
- package/dist/plugins/caching-session-store.js +43 -4
- package/dist/plugins/checkpoint-index-columns.d.ts +33 -6
- package/dist/plugins/checkpoint-index-columns.js +39 -3
- package/dist/plugins/checkpoint-store-face.d.ts +84 -11
- package/dist/plugins/checkpoint-store-face.js +18 -1
- package/dist/plugins/device-store-sql.d.ts +2 -2
- package/dist/plugins/device-store-sql.js +6 -10
- 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/execution-lane-rename-m40.d.ts +20 -0
- package/dist/plugins/execution-lane-rename-m40.js +10 -0
- package/dist/plugins/execution-placement-sql.d.ts +63 -88
- package/dist/plugins/execution-placement-sql.js +94 -54
- package/dist/plugins/file-run-store.d.ts +89 -35
- package/dist/plugins/file-run-store.js +197 -142
- 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 +19 -10
- package/dist/plugins/imported-layer-root-retirement.js +4 -8
- package/dist/plugins/inbox-payload-column.d.ts +14 -0
- package/dist/plugins/inbox-payload-column.js +13 -0
- 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 +63 -23
- package/dist/plugins/local-checkpoint-store.js +204 -81
- package/dist/plugins/local-data-dir-modes-m39.d.ts +48 -0
- package/dist/plugins/local-data-dir-modes-m39.js +183 -0
- package/dist/plugins/local-docker-capacity.d.ts +93 -0
- package/dist/plugins/local-docker-capacity.js +194 -0
- package/dist/plugins/local-docker-reaper.d.ts +92 -0
- package/dist/plugins/local-docker-reaper.js +102 -0
- package/dist/plugins/local-engine-high-water.d.ts +13 -0
- package/dist/plugins/local-engine-high-water.js +62 -0
- package/dist/plugins/local-session-store.d.ts +442 -143
- package/dist/plugins/local-session-store.js +941 -289
- 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 +20 -1
- package/dist/plugins/local-task-attachment-store.js +32 -12
- package/dist/plugins/memory-embedder-fingerprint.d.ts +33 -10
- package/dist/plugins/memory-embedder-fingerprint.js +52 -12
- package/dist/plugins/memory-embedder.d.ts +1 -1
- package/dist/plugins/memory-embedder.js +11 -9
- package/dist/plugins/memory-engine-pg.d.ts +7 -5
- package/dist/plugins/memory-engine-pg.js +18 -9
- package/dist/plugins/memory-engine-sql-apply.d.ts +21 -8
- package/dist/plugins/memory-engine-sql-apply.js +7 -9
- package/dist/plugins/memory-engine-tidb.d.ts +12 -7
- package/dist/plugins/memory-engine-tidb.js +18 -10
- 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 +325 -74
- package/dist/plugins/one-time-migrations.js +705 -230
- package/dist/plugins/org-delivery-quota-store.js +2 -1
- package/dist/plugins/owner-only-file-mode.d.ts +29 -0
- package/dist/plugins/owner-only-file-mode.js +141 -0
- package/dist/plugins/permission-rule-store-file.d.ts +11 -11
- package/dist/plugins/permission-rule-store-file.js +14 -2
- 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 +3 -32
- package/dist/plugins/pg-pool.js +27 -11
- package/dist/plugins/release-version.d.ts +20 -0
- package/dist/plugins/release-version.js +28 -0
- package/dist/plugins/remote-env-adb.d.ts +20 -4
- package/dist/plugins/remote-env-adb.js +39 -11
- package/dist/plugins/remote-env-e2b.d.ts +19 -28
- package/dist/plugins/remote-env-e2b.js +40 -29
- package/dist/plugins/remote-env-host.d.ts +11 -10
- package/dist/plugins/remote-env-host.js +40 -27
- package/dist/plugins/remote-env-k8s.d.ts +45 -47
- package/dist/plugins/remote-env-k8s.js +122 -62
- package/dist/plugins/remote-env-local-docker.d.ts +152 -15
- package/dist/plugins/remote-env-local-docker.js +370 -75
- package/dist/plugins/remote-env-ssh.d.ts +8 -2
- package/dist/plugins/remote-env-ssh.js +26 -24
- package/dist/plugins/remote-scratchpad.js +4 -0
- package/dist/plugins/remote-shell.d.ts +59 -30
- package/dist/plugins/remote-shell.js +175 -62
- package/dist/plugins/retention-declaration.d.ts +37 -0
- package/dist/plugins/retention-declaration.js +9 -0
- package/dist/plugins/retention-deployment.d.ts +158 -0
- package/dist/plugins/retention-deployment.js +119 -0
- package/dist/plugins/retention-lane-store-sql.d.ts +74 -4
- package/dist/plugins/retention-lane-store-sql.js +103 -1
- package/dist/plugins/retention-sql.d.ts +29 -0
- package/dist/plugins/retention-sql.js +8 -0
- 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 -15
- package/dist/plugins/schema-consistency.js +213 -13
- 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 +10 -1
- package/dist/plugins/schema-ensure-legs.js +12 -2
- 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 +98 -0
- package/dist/plugins/session-ext-table.js +134 -0
- package/dist/plugins/session-fork.d.ts +16 -2
- 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 +20 -7
- package/dist/plugins/session-row-sql.js +16 -8
- 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 +157 -0
- package/dist/plugins/session-store-sql.js +398 -0
- package/dist/plugins/session-withdraw-sql.d.ts +36 -0
- package/dist/plugins/session-withdraw-sql.js +42 -0
- package/dist/plugins/session-workspace-cell.d.ts +2 -2
- package/dist/plugins/session-workspace-cell.js +2 -2
- package/dist/plugins/shared-memory-store-sql.d.ts +10 -69
- package/dist/plugins/shared-memory-store-sql.js +15 -14
- 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/snapshot-bucket-presence.js +1 -1
- package/dist/plugins/sql-driver.d.ts +24 -8
- package/dist/plugins/sql-driver.js +43 -9
- package/dist/plugins/sql-errors.d.ts +35 -5
- package/dist/plugins/sql-errors.js +55 -3
- 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 +114 -18
- package/dist/plugins/store-backend.js +340 -87
- package/dist/plugins/store-contracts.d.ts +97 -30
- package/dist/plugins/store-contracts.js +23 -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 +21 -11
- package/dist/plugins/task-attachment-store.js +37 -19
- package/dist/plugins/task-list-store-sql.d.ts +1 -1
- package/dist/plugins/text-column-capacity.d.ts +21 -0
- package/dist/plugins/text-column-capacity.js +5 -0
- package/dist/plugins/tidb-pool.d.ts +3 -2
- package/dist/plugins/tidb-pool.js +42 -39
- package/dist/plugins/user-input-ledger-sql.d.ts +1 -1
- 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/read-face-posture.d.ts +6 -6
- package/dist/read-face-posture.js +2 -2
- 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/request-value-closure.d.ts +5 -5
- package/dist/request-value-closure.js +1 -1
- 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 +46 -16
- package/dist/rules-consent.js +102 -53
- 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 +109 -93
- package/dist/run-stale-default.d.ts +7 -0
- package/dist/run-stale-default.js +2 -0
- package/dist/runs.d.ts +73 -44
- package/dist/runs.js +65 -43
- package/dist/runtime-caps-resolver.d.ts +36 -14
- package/dist/runtime-caps-resolver.js +31 -14
- package/dist/runtime-governance.d.ts +2 -2
- package/dist/runtime-governance.js +5 -3
- package/dist/sealed-key-layout.d.ts +12 -6
- package/dist/sealed-key-layout.js +5 -1
- package/dist/sealed-key.d.ts +12 -2
- package/dist/sealed-key.js +116 -26
- package/dist/security.d.ts +133 -161
- package/dist/security.js +163 -59
- package/dist/sema-config-dir.d.ts +20 -0
- package/dist/sema-config-dir.js +27 -2
- package/dist/server-secret-env.d.ts +23 -5
- package/dist/server-secret-env.js +14 -4
- package/dist/service-version.d.ts +2 -1
- package/dist/service-version.js +2 -2
- 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 +6 -6
- package/dist/session-error-wire.js +1 -1
- package/dist/session-incarnation.d.ts +60 -10
- 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 +29 -47
- package/dist/session-resident-background.js +77 -8
- package/dist/session-row.d.ts +3 -2
- package/dist/session-rules-seat.d.ts +12 -0
- package/dist/session-rules-seat.js +19 -0
- package/dist/session-sync-kernel.d.ts +1 -1
- package/dist/session-titler.d.ts +7 -15
- package/dist/session-titler.js +1 -1
- package/dist/session-workspace.d.ts +11 -2
- package/dist/session-workspace.js +5 -0
- package/dist/sighup-idle.d.ts +1 -1
- package/dist/spec-fields.d.ts +57 -3
- package/dist/spec-fields.js +72 -51
- package/dist/store-posture.d.ts +138 -21
- package/dist/store-posture.js +188 -3
- package/dist/stored-request-hooks-m20.d.ts +3 -2
- package/dist/stored-request-hooks-m20.js +21 -16
- 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/blob-index-sql.d.ts +148 -0
- package/dist/stores-sql/blob-index-sql.js +154 -0
- package/dist/stores-sql/checkpoint-store-sql.d.ts +34 -29
- package/dist/stores-sql/checkpoint-store-sql.js +86 -71
- package/dist/{plugins → stores-sql}/file-history-store-sql.d.ts +23 -11
- package/dist/{plugins → stores-sql}/file-history-store-sql.js +23 -18
- package/dist/stores-sql/mailbox-store-sql.d.ts +7 -4
- package/dist/stores-sql/mailbox-store-sql.js +31 -32
- package/dist/{plugins → stores-sql}/pg-session-storage.d.ts +30 -81
- package/dist/{plugins → stores-sql}/pg-session-storage.js +123 -244
- package/dist/{plugins → stores-sql}/retention-store-sql.d.ts +197 -223
- package/dist/{plugins → stores-sql}/retention-store-sql.js +148 -207
- package/dist/{plugins → stores-sql}/session-event-payload.d.ts +1 -1
- package/dist/{plugins → stores-sql}/session-event-payload.js +1 -1
- package/dist/stores-sql/session-policy-store-sql.d.ts +33 -11
- package/dist/stores-sql/session-policy-store-sql.js +44 -36
- package/dist/stores-sql/session-write-hooks.d.ts +65 -0
- package/dist/stores-sql/session-write-hooks.js +2 -0
- package/dist/{plugins → stores-sql}/tidb-session-storage.d.ts +14 -15
- package/dist/{plugins → stores-sql}/tidb-session-storage.js +22 -28
- package/dist/{plugins → stores-sql}/tidb-session-store.d.ts +67 -138
- package/dist/{plugins → stores-sql}/tidb-session-store.js +130 -200
- package/dist/stores-sql/tool-result-store-sql.d.ts +1 -1
- package/dist/stores-sql/tool-result-store-sql.js +1 -1
- package/dist/stores-sql/windowed-session-storage.d.ts +61 -0
- package/dist/stores-sql/windowed-session-storage.js +70 -0
- package/dist/submission-exit.d.ts +50 -0
- package/dist/submission-exit.js +108 -0
- package/dist/task-a2a.d.ts +7 -1
- package/dist/task-a2a.js +18 -17
- package/dist/task-cwd.d.ts +31 -3
- package/dist/task-cwd.js +25 -1
- package/dist/task-mcp.d.ts +11 -3
- package/dist/task-mcp.js +16 -19
- package/dist/task-settings.d.ts +23 -14
- package/dist/task-settings.js +35 -13
- package/dist/terminal.d.ts +25 -43
- package/dist/terminal.js +31 -11
- package/dist/tool-approval.d.ts +152 -137
- package/dist/tool-approval.js +199 -199
- package/dist/trace/core-keyset-guard.d.ts +22 -9
- package/dist/trace/core-vocab-wire.d.ts +95 -0
- package/dist/trace/core-vocab-wire.js +15 -0
- package/dist/trace/engine-notice-wire.d.ts +1 -1
- package/dist/trace/engine-notice-wire.js +2 -0
- package/dist/trace/exit-seat.d.ts +52 -4
- package/dist/trace/exit-seat.js +43 -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 +88 -58
- package/dist/trace/project.js +64 -28
- package/dist/trace/redact.d.ts +124 -28
- package/dist/trace/redact.js +936 -328
- package/dist/trace/self-minted-wire.d.ts +750 -29
- package/dist/trace/self-minted-wire.js +262 -25
- package/dist/trace/sema-provenance.d.ts +45 -41
- package/dist/trace/sema-provenance.js +81 -10
- package/dist/trace/task-notification-facets.d.ts +70 -2
- package/dist/trace/task-notification-facets.js +71 -1
- package/dist/trace/wire-projection-faces.d.ts +43 -8
- package/dist/trace/wire-projection-faces.js +28 -3
- package/dist/unread-request-members.d.ts +66 -0
- package/dist/unread-request-members.js +41 -0
- package/dist/upstream-body.d.ts +23 -0
- package/dist/upstream-body.js +16 -0
- package/dist/url-refusal.d.ts +3 -3
- package/dist/url-refusal.js +11 -4
- package/dist/user-authored-text.d.ts +1 -1
- package/dist/user-input-ledger.d.ts +7 -8
- package/dist/user-input-ledger.js +1 -1
- package/dist/web-admin-client/apply-effective.d.ts +6 -3
- package/dist/web-admin-client/apply-effective.js +33 -40
- 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/candidate-gate.d.ts +35 -3
- package/dist/web-admin-client/candidate-gate.js +53 -5
- package/dist/web-admin-client/center-request.d.ts +6 -3
- package/dist/web-admin-client/center-request.js +17 -16
- package/dist/web-admin-client/effective-keys.d.ts +1 -1
- package/dist/web-admin-client/effective-keys.js +1 -2
- 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/facade.d.ts +1 -1
- package/dist/web-admin-client/http-client.d.ts +2 -1
- package/dist/web-admin-client/http-client.js +40 -13
- 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 +13 -6
- package/dist/web-admin-client/skills-mcp.d.ts +22 -8
- package/dist/web-admin-client/skills-mcp.js +26 -21
- package/dist/web-admin-client/types.d.ts +35 -51
- package/dist/workspace-space.d.ts +3 -2
- package/docs/DEVICE-EXECUTOR-PROTOCOL.md +4 -4
- package/package.json +16 -12
- package/scripts/drain-check-local.mjs +118 -173
- package/scripts/drain-check.mysql.sql +20 -16
- package/scripts/drain-check.pg.sql +20 -16
- package/wire-changes/server@7.147.0.json +813 -0
- 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
|
@@ -2,8 +2,8 @@ import path from "node:path";
|
|
|
2
2
|
import { spawn } from "node:child_process";
|
|
3
3
|
import { hostSubprocessEnv } from "../server-secret-env.js";
|
|
4
4
|
import { LANE_HOME_PROBE_COMMAND, LaneHomeSeat } from "../lane-home-probe.js";
|
|
5
|
-
import { randomBytes } from "node:crypto";
|
|
6
|
-
import { shellQuote, armPipeDestroyGrace, appendFileStaged, writeFileStaged } from "./remote-shell.js";
|
|
5
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
6
|
+
import { shellQuote, armPipeDestroyGrace, appendFileStaged, readyUpload, writeFileStaged } from "./remote-shell.js";
|
|
7
7
|
import { signalNumber } from "./host-platform.js";
|
|
8
8
|
import { buildLivenessCut, commandBoundsOf } from "../exec-bounds.js";
|
|
9
9
|
import { buildCapturedOutput, createCutError } from "../exec-cut.js";
|
|
@@ -16,6 +16,12 @@ const PROVIDER = "local-docker";
|
|
|
16
16
|
const DEFAULT_MOUNT_PATH = "/workspace";
|
|
17
17
|
const DEFAULT_COMMAND_TIMEOUT_MS = 30 * 60_000;
|
|
18
18
|
const DEFAULT_CONTROL_TIMEOUT_MS = 60_000;
|
|
19
|
+
const INSPECT_ID_STATE_AND_LABELS = "{{.Id}}\t{{.State.Status}}\t{{json .Config.Labels}}";
|
|
20
|
+
const DOCKER_STATES = ["created", "running", "paused", "restarting", "removing", "exited", "dead"];
|
|
21
|
+
const NO_CUSTODY = Object.freeze({ kind: "none" });
|
|
22
|
+
function isNameConflict(stderr, name) {
|
|
23
|
+
return stderr.includes(`The container name "/${name}" is already in use`);
|
|
24
|
+
}
|
|
19
25
|
const ok = (value) => ({ ok: true, value });
|
|
20
26
|
const unsupported = (op) => ({
|
|
21
27
|
ok: false,
|
|
@@ -33,12 +39,18 @@ export class RemoteLocalDockerExecutionEnv {
|
|
|
33
39
|
cfg;
|
|
34
40
|
spawnFn;
|
|
35
41
|
containerName;
|
|
42
|
+
custody;
|
|
36
43
|
containerId;
|
|
44
|
+
removedAny = false;
|
|
45
|
+
teardown;
|
|
46
|
+
teardownSettled = false;
|
|
37
47
|
handle;
|
|
38
48
|
destroyed = false;
|
|
39
49
|
connecting;
|
|
40
50
|
connectRefusal;
|
|
41
51
|
homeSeat;
|
|
52
|
+
lifecycle = new AbortController();
|
|
53
|
+
capacityDeadline;
|
|
42
54
|
constructor(config, deps = {}) {
|
|
43
55
|
if (!config.image || !config.image.trim()) {
|
|
44
56
|
config = { ...config, image: config.image ?? "" };
|
|
@@ -56,9 +68,21 @@ export class RemoteLocalDockerExecutionEnv {
|
|
|
56
68
|
this.spawnFn = deps.spawn ?? spawn;
|
|
57
69
|
this.floor = deps.readFloor ?? createSandboxReadFloor({ lane: PROVIDER, knob: config.sandboxReadFloor });
|
|
58
70
|
this.capabilities = capabilitiesFor({ remoteExec: { provider: PROVIDER }, sandboxReadFloor: config.sandboxReadFloor });
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
71
|
+
this.containerName = localDockerContainerNameOf(config.workerLabel, config.id ?? randomBytes(6).toString("hex"));
|
|
72
|
+
this.custody = config.leftover ?? NO_CUSTODY;
|
|
73
|
+
}
|
|
74
|
+
get instance() {
|
|
75
|
+
return this.custody.kind === "held" ? this.custody.id : undefined;
|
|
76
|
+
}
|
|
77
|
+
get leftover() {
|
|
78
|
+
const c = this.custody;
|
|
79
|
+
return c.kind === "doomed" || c.kind === "doomed-unknown" ? c : undefined;
|
|
80
|
+
}
|
|
81
|
+
get releasing() {
|
|
82
|
+
return this.teardown;
|
|
83
|
+
}
|
|
84
|
+
get released() {
|
|
85
|
+
return this.teardownSettled;
|
|
62
86
|
}
|
|
63
87
|
resolve(p) {
|
|
64
88
|
return path.posix.isAbsolute(p) ? path.posix.normalize(p) : path.posix.normalize(path.posix.join(this.cwd, p));
|
|
@@ -77,18 +101,142 @@ export class RemoteLocalDockerExecutionEnv {
|
|
|
77
101
|
return { ok: false, error: new RemoteExecutionError("aborted", "connect aborted") };
|
|
78
102
|
if (this.containerId)
|
|
79
103
|
return ok(this.workspaceHandle());
|
|
104
|
+
return this.connectOnce(config, "start-or-attach");
|
|
105
|
+
}
|
|
106
|
+
async connectOnce(config, mode) {
|
|
80
107
|
if (this.connecting)
|
|
81
108
|
return this.connecting;
|
|
82
|
-
this.connecting = this.doConnect(config);
|
|
109
|
+
this.connecting = this.doConnect(config, mode);
|
|
83
110
|
const r = await this.connecting;
|
|
84
111
|
if (!r.ok)
|
|
85
112
|
this.connecting = undefined;
|
|
86
113
|
return r;
|
|
87
114
|
}
|
|
88
|
-
async doConnect(config) {
|
|
89
|
-
if (!this.cfg.image.trim()) {
|
|
115
|
+
async doConnect(config, mode) {
|
|
116
|
+
if (mode === "start-or-attach" && !this.cfg.image.trim()) {
|
|
90
117
|
return { ok: false, error: new RemoteExecutionError("connect_failed", "local-docker: no base image configured (the image is required — no docker.io default)") };
|
|
91
118
|
}
|
|
119
|
+
const owed = this.custody;
|
|
120
|
+
if (owed.kind === "doomed" && !(await this.removeInstance(owed.id)))
|
|
121
|
+
return this.stillOwed(owed.id);
|
|
122
|
+
let seen = await this.sightContainer(config?.abortSignal);
|
|
123
|
+
if (this.custody.kind === "doomed-unknown") {
|
|
124
|
+
switch (seen.kind) {
|
|
125
|
+
case "unreadable":
|
|
126
|
+
return { ok: false, error: seen.error };
|
|
127
|
+
case "ours":
|
|
128
|
+
if (!(await this.removeInstance(seen.id)))
|
|
129
|
+
return this.stillOwed(seen.id);
|
|
130
|
+
seen = { kind: "absent" };
|
|
131
|
+
break;
|
|
132
|
+
case "absent":
|
|
133
|
+
this.custody = NO_CUSTODY;
|
|
134
|
+
this.cfg.capacity?.removed(this.containerName);
|
|
135
|
+
break;
|
|
136
|
+
case "foreign":
|
|
137
|
+
this.custody = NO_CUSTODY;
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
switch (seen.kind) {
|
|
142
|
+
case "unreadable":
|
|
143
|
+
return { ok: false, error: seen.error };
|
|
144
|
+
case "foreign":
|
|
145
|
+
return { ok: false, error: new RemoteExecutionError("connect_failed", `a container named '${this.containerName}' exists on the docker daemon but this worker did not start it (it does not carry the label ${this.cfg.workerLabel}) — nothing was started or removed; remove or rename that container`) };
|
|
146
|
+
case "absent":
|
|
147
|
+
return mode === "attach-only" ? this.notResumable("gone") : this.startContainer(config);
|
|
148
|
+
case "ours":
|
|
149
|
+
switch (seen.state) {
|
|
150
|
+
case "running":
|
|
151
|
+
return this.attachContainer(seen.id, config?.abortSignal);
|
|
152
|
+
case "exited": {
|
|
153
|
+
const admitted = await this.admitStart(config);
|
|
154
|
+
if (!admitted.ok)
|
|
155
|
+
return admitted;
|
|
156
|
+
this.custody = { kind: "held", id: seen.id };
|
|
157
|
+
const started = await this.docker(["start", seen.id], { signal: config?.abortSignal, timeoutMs: this.cfg.controlTimeoutMs });
|
|
158
|
+
admitted.ticket?.settle(this.startOutcomeOf(started));
|
|
159
|
+
if (!started.ok)
|
|
160
|
+
return { ok: false, error: this.dockerToRemoteError(started.error, "connect_failed") };
|
|
161
|
+
if (started.value.exitCode !== 0)
|
|
162
|
+
return { ok: false, error: new RemoteExecutionError("connect_failed", `container '${this.containerName}' of this worker is exited and docker start failed: ${started.value.stderr.trim() || `exit ${started.value.exitCode}`} — nothing was removed`) };
|
|
163
|
+
return this.attachContainer(seen.id, config?.abortSignal);
|
|
164
|
+
}
|
|
165
|
+
case "created": {
|
|
166
|
+
if (mode === "attach-only")
|
|
167
|
+
return this.notResumable("created, never started");
|
|
168
|
+
if (!(await this.removeInstance(seen.id))) {
|
|
169
|
+
return { ok: false, error: new RemoteExecutionError("connect_failed", `container '${this.containerName}' of this worker was created but never started and could not be removed — nothing was started; remove it and retry`) };
|
|
170
|
+
}
|
|
171
|
+
return this.startContainer(config);
|
|
172
|
+
}
|
|
173
|
+
case "paused":
|
|
174
|
+
case "restarting":
|
|
175
|
+
case "removing":
|
|
176
|
+
case "dead":
|
|
177
|
+
return { ok: false, error: new RemoteExecutionError("connect_failed", `container '${this.containerName}' of this worker is ${seen.state} — it was neither attached nor removed (its workspace may still be there); resolve it with docker and retry`) };
|
|
178
|
+
default: {
|
|
179
|
+
const unhandled = seen.state;
|
|
180
|
+
throw new Error(`local-docker: no ruling for container state ${String(unhandled)}`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
stillOwed(id) {
|
|
186
|
+
return { ok: false, error: new RemoteExecutionError("connect_failed", `container ${id.slice(0, 12)} of this worker ('${this.containerName}') is due for removal and docker rm could not confirm it — it is never attached; nothing was started; remove it and retry`) };
|
|
187
|
+
}
|
|
188
|
+
notResumable(why) {
|
|
189
|
+
return { ok: false, error: new RemoteExecutionError("connect_failed", `container '${this.containerName}' is not running (${why}) — no managed snapshot to resume`) };
|
|
190
|
+
}
|
|
191
|
+
async sightContainer(signal) {
|
|
192
|
+
const r = await this.docker(["inspect", "--type", "container", "--format", INSPECT_ID_STATE_AND_LABELS, this.containerName], { signal, timeoutMs: this.cfg.controlTimeoutMs });
|
|
193
|
+
if (!r.ok)
|
|
194
|
+
return { kind: "unreadable", error: this.dockerToRemoteError(r.error, "connect_failed") };
|
|
195
|
+
if (r.value.exitCode !== 0) {
|
|
196
|
+
return /no such (object|container)/i.test(r.value.stderr)
|
|
197
|
+
? { kind: "absent" }
|
|
198
|
+
: { kind: "unreadable", error: new RemoteExecutionError("connect_failed", `docker inspect of '${this.containerName}' failed: ${r.value.stderr.trim() || `exit ${r.value.exitCode}`}`) };
|
|
199
|
+
}
|
|
200
|
+
const line = r.value.stdout.trim();
|
|
201
|
+
const [id = "", state = "", ...rest] = line.split("\t");
|
|
202
|
+
let labels;
|
|
203
|
+
try {
|
|
204
|
+
labels = rest.length === 1 ? JSON.parse(rest[0]) : undefined;
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
labels = undefined;
|
|
208
|
+
}
|
|
209
|
+
const known = DOCKER_STATES.find((s) => s === state);
|
|
210
|
+
if (!/^[0-9a-f]{12,64}$/.test(id) || known === undefined || labels === undefined || (labels !== null && typeof labels !== "object")) {
|
|
211
|
+
return { kind: "unreadable", error: new RemoteExecutionError("connect_failed", `docker inspect of '${this.containerName}' answered a form this adapter does not read (${JSON.stringify(line.slice(0, 160))}) — nothing was started or removed`) };
|
|
212
|
+
}
|
|
213
|
+
const ours = labels !== null && Object.entries(labels).some(([k, v]) => `${k}=${String(v)}` === this.cfg.workerLabel);
|
|
214
|
+
return ours ? { kind: "ours", id, state: known } : { kind: "foreign" };
|
|
215
|
+
}
|
|
216
|
+
async attachContainer(id, signal) {
|
|
217
|
+
this.custody = { kind: "held", id };
|
|
218
|
+
if (this.homeSeat.asks && !(await this.untilOrAborted(this.probeContainerShell(), signal))) {
|
|
219
|
+
return { ok: false, error: new RemoteExecutionError("aborted", "connect aborted while detecting the container's shell") };
|
|
220
|
+
}
|
|
221
|
+
const home = await this.homeVerdict(signal);
|
|
222
|
+
if (home !== undefined)
|
|
223
|
+
return { ok: false, error: home };
|
|
224
|
+
await this.floor.attach(this.floorTransport(), { origin: "resumed", workspaceRoot: this.cfg.mountPath });
|
|
225
|
+
if (this.destroyed)
|
|
226
|
+
return { ok: false, error: new RemoteExecutionError("connect_failed", "execution env destroyed during connect") };
|
|
227
|
+
const filled = await this.fillWorkspace("restored");
|
|
228
|
+
if (!filled.ok) {
|
|
229
|
+
if (filled.standing)
|
|
230
|
+
this.connectRefusal = filled.error;
|
|
231
|
+
return { ok: false, error: filled.error };
|
|
232
|
+
}
|
|
233
|
+
if (this.destroyed)
|
|
234
|
+
return { ok: false, error: new RemoteExecutionError("connect_failed", "execution env destroyed during connect") };
|
|
235
|
+
this.containerId = id;
|
|
236
|
+
this.handle = { sandboxId: this.containerName, provider: PROVIDER, mountPath: this.cfg.mountPath, sessionToken: this.containerName };
|
|
237
|
+
return ok(this.handle);
|
|
238
|
+
}
|
|
239
|
+
async startContainer(config) {
|
|
92
240
|
const pidsLimit = this.cfg.pidsLimit ?? 512;
|
|
93
241
|
const runArgs = [
|
|
94
242
|
"run",
|
|
@@ -96,6 +244,7 @@ export class RemoteLocalDockerExecutionEnv {
|
|
|
96
244
|
"--init",
|
|
97
245
|
"--name",
|
|
98
246
|
this.containerName,
|
|
247
|
+
"--label", this.cfg.workerLabel,
|
|
99
248
|
"-w",
|
|
100
249
|
this.cfg.mountPath,
|
|
101
250
|
"--security-opt",
|
|
@@ -110,48 +259,71 @@ export class RemoteLocalDockerExecutionEnv {
|
|
|
110
259
|
"-c",
|
|
111
260
|
`mkdir -p ${shellQuote(this.cfg.mountPath)} && exec tail -f /dev/null`,
|
|
112
261
|
];
|
|
262
|
+
const admitted = await this.admitStart(config);
|
|
263
|
+
if (!admitted.ok)
|
|
264
|
+
return admitted;
|
|
113
265
|
const run = await this.docker(runArgs, { signal: config?.abortSignal, timeoutMs: this.cfg.controlTimeoutMs });
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
266
|
+
const outcome = this.startOutcomeOf(run);
|
|
267
|
+
admitted.ticket?.settle(outcome);
|
|
268
|
+
const id = run.ok && run.value.exitCode === 0 ? run.value.stdout.trim() : "";
|
|
269
|
+
if (id === "") {
|
|
270
|
+
if (outcome !== "absent")
|
|
271
|
+
await this.claimLeftoverOfThisStart();
|
|
272
|
+
const error = !run.ok ? this.dockerToRemoteError(run.error, "connect_failed") : new RemoteExecutionError("connect_failed", `docker run failed: ${run.value.stderr.trim() || (run.value.exitCode === 0 ? "it printed no container id" : `exit ${run.value.exitCode}`)}`);
|
|
273
|
+
return { ok: false, error };
|
|
121
274
|
}
|
|
275
|
+
this.custody = { kind: "held", id };
|
|
122
276
|
if (this.destroyed) {
|
|
123
|
-
await this.
|
|
277
|
+
await this.removeInstance(id);
|
|
124
278
|
return { ok: false, error: new RemoteExecutionError("connect_failed", "execution env destroyed during connect") };
|
|
125
279
|
}
|
|
126
280
|
if (this.homeSeat.asks && !(await this.untilOrAborted(this.probeContainerShell(), config?.abortSignal))) {
|
|
127
|
-
await this.
|
|
281
|
+
await this.removeInstance(id);
|
|
128
282
|
return { ok: false, error: new RemoteExecutionError("aborted", "connect aborted while detecting the container's shell") };
|
|
129
283
|
}
|
|
130
284
|
const home = await this.homeVerdict(config?.abortSignal);
|
|
131
285
|
if (home !== undefined) {
|
|
132
|
-
await this.
|
|
286
|
+
await this.removeInstance(id);
|
|
133
287
|
return { ok: false, error: home };
|
|
134
288
|
}
|
|
135
289
|
await this.floor.attach(this.floorTransport(), { origin: "created", workspaceRoot: this.cfg.mountPath });
|
|
136
290
|
if (this.destroyed) {
|
|
137
|
-
await this.
|
|
291
|
+
await this.removeInstance(id);
|
|
138
292
|
return { ok: false, error: new RemoteExecutionError("connect_failed", "execution env destroyed during connect") };
|
|
139
293
|
}
|
|
140
|
-
const filled = await this.fillWorkspace();
|
|
294
|
+
const filled = await this.fillWorkspace("minted");
|
|
141
295
|
if (!filled.ok || this.destroyed) {
|
|
142
|
-
await this.
|
|
296
|
+
await this.removeInstance(id);
|
|
143
297
|
if (!filled.ok && filled.standing)
|
|
144
298
|
this.connectRefusal = filled.error;
|
|
145
299
|
return { ok: false, error: filled.ok ? new RemoteExecutionError("connect_failed", "execution env destroyed during connect") : filled.error };
|
|
146
300
|
}
|
|
147
|
-
this.containerId =
|
|
301
|
+
this.containerId = id;
|
|
148
302
|
this.handle = { sandboxId: this.containerName, provider: PROVIDER, mountPath: this.cfg.mountPath, sessionToken: this.containerName };
|
|
149
303
|
if (config?.secrets?.length) {
|
|
150
304
|
}
|
|
151
305
|
return ok(this.handle);
|
|
152
306
|
}
|
|
153
|
-
|
|
154
|
-
|
|
307
|
+
async admitStart(config) {
|
|
308
|
+
const capacity = this.cfg.capacity;
|
|
309
|
+
if (capacity === undefined)
|
|
310
|
+
return { ok: true };
|
|
311
|
+
this.capacityDeadline ??= Date.now() + this.cfg.controlTimeoutMs;
|
|
312
|
+
const signal = config?.abortSignal ? AbortSignal.any([config.abortSignal, this.lifecycle.signal]) : this.lifecycle.signal;
|
|
313
|
+
const admitted = await capacity.admit({ name: this.containerName, read: (budgetMs, readSignal) => this.readLaneRegistry(budgetMs, readSignal), deadline: this.capacityDeadline, readBoundMs: this.cfg.controlTimeoutMs, signal });
|
|
314
|
+
if (!admitted.ok)
|
|
315
|
+
return { ok: false, error: new RemoteExecutionError(admitted.refusal.verdict === "aborted" ? "aborted" : "connect_failed", admitted.refusal.message) };
|
|
316
|
+
return { ok: true, ticket: admitted.ticket };
|
|
317
|
+
}
|
|
318
|
+
startOutcomeOf(r) {
|
|
319
|
+
if (!r.ok)
|
|
320
|
+
return r.error.code === "spawn_error" ? "absent" : "unknown";
|
|
321
|
+
if (r.value.exitCode === 0)
|
|
322
|
+
return "present";
|
|
323
|
+
return isNameConflict(r.value.stderr, this.containerName) ? "absent" : "unknown";
|
|
324
|
+
}
|
|
325
|
+
fillWorkspace(origin) {
|
|
326
|
+
return this.cfg.workspaceFill === undefined ? Promise.resolve({ ok: true }) : this.cfg.workspaceFill.fill(this.fillChannel(), this.cfg.mountPath, origin);
|
|
155
327
|
}
|
|
156
328
|
fillChannel() {
|
|
157
329
|
const run = async (command, input) => {
|
|
@@ -201,47 +373,100 @@ export class RemoteLocalDockerExecutionEnv {
|
|
|
201
373
|
if (sessionToken && sessionToken !== this.containerName) {
|
|
202
374
|
return { ok: false, error: new RemoteExecutionError("connect_failed", `reconnect token '${String(sessionToken)}' does not match this env's container '${this.containerName}'`) };
|
|
203
375
|
}
|
|
204
|
-
if (this.
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
this.
|
|
219
|
-
this.
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
376
|
+
if (this.containerId === undefined)
|
|
377
|
+
return this.connectOnce(undefined, "attach-only");
|
|
378
|
+
const seen = await this.sightContainer(undefined);
|
|
379
|
+
if (seen.kind === "ours" && seen.state === "running" && seen.id === this.containerId)
|
|
380
|
+
return ok(this.workspaceHandle());
|
|
381
|
+
if (seen.kind === "unreadable")
|
|
382
|
+
return { ok: false, error: seen.error };
|
|
383
|
+
return this.notResumable(seen.kind === "absent" ? "gone" : seen.kind === "foreign" ? "the name now holds a container this worker did not start" : seen.id !== this.containerId ? "the name now holds another container" : seen.state);
|
|
384
|
+
}
|
|
385
|
+
destroy() {
|
|
386
|
+
this.teardown ??= (async () => {
|
|
387
|
+
this.destroyed = true;
|
|
388
|
+
this.lifecycle.abort();
|
|
389
|
+
const inflight = this.connecting;
|
|
390
|
+
this.connecting = undefined;
|
|
391
|
+
this.containerId = undefined;
|
|
392
|
+
await inflight?.catch(() => { });
|
|
393
|
+
this.floor.dispose();
|
|
394
|
+
const owed = this.custody;
|
|
395
|
+
switch (owed.kind) {
|
|
396
|
+
case "held":
|
|
397
|
+
case "doomed":
|
|
398
|
+
await this.removeInstance(owed.id);
|
|
399
|
+
break;
|
|
400
|
+
case "doomed-unknown":
|
|
401
|
+
await this.claimLeftoverOfThisStart();
|
|
402
|
+
break;
|
|
403
|
+
case "none":
|
|
404
|
+
break;
|
|
405
|
+
}
|
|
406
|
+
})().finally(() => {
|
|
407
|
+
this.teardownSettled = true;
|
|
408
|
+
});
|
|
409
|
+
return this.teardown;
|
|
234
410
|
}
|
|
235
411
|
async cleanup() {
|
|
236
412
|
return this.destroy();
|
|
237
413
|
}
|
|
238
|
-
async
|
|
239
|
-
|
|
414
|
+
async reapWorkspace() {
|
|
415
|
+
if (this.custody.kind === "none")
|
|
416
|
+
this.custody = { kind: "doomed-unknown" };
|
|
417
|
+
await this.destroy();
|
|
418
|
+
return this.leftover !== undefined ? "owed" : this.removedAny ? "removed" : "nothing";
|
|
419
|
+
}
|
|
420
|
+
async removeInstance(id) {
|
|
421
|
+
this.custody = { kind: "doomed", id };
|
|
422
|
+
const r = await this.docker(["rm", "-f", id], { timeoutMs: this.cfg.controlTimeoutMs }).catch(() => undefined);
|
|
423
|
+
const removed = r?.ok === true && (r.value.exitCode === 0 || /no such container/i.test(r.value.stderr));
|
|
424
|
+
if (r?.ok === true && r.value.exitCode === 0)
|
|
425
|
+
this.removedAny = true;
|
|
426
|
+
if (removed) {
|
|
427
|
+
this.cfg.capacity?.removed(this.containerName);
|
|
428
|
+
if (this.custody.kind === "doomed" && this.custody.id === id)
|
|
429
|
+
this.custody = NO_CUSTODY;
|
|
430
|
+
}
|
|
431
|
+
return removed;
|
|
432
|
+
}
|
|
433
|
+
async claimLeftoverOfThisStart() {
|
|
434
|
+
const seen = await this.sightContainer(undefined);
|
|
435
|
+
switch (seen.kind) {
|
|
436
|
+
case "ours":
|
|
437
|
+
await this.removeInstance(seen.id);
|
|
438
|
+
return;
|
|
439
|
+
case "absent":
|
|
440
|
+
this.custody = NO_CUSTODY;
|
|
441
|
+
this.cfg.capacity?.removed(this.containerName);
|
|
442
|
+
return;
|
|
443
|
+
case "foreign":
|
|
444
|
+
this.custody = NO_CUSTODY;
|
|
445
|
+
return;
|
|
446
|
+
case "unreadable":
|
|
447
|
+
this.custody = { kind: "doomed-unknown" };
|
|
448
|
+
return;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
async readLaneRegistry(budgetMs, signal) {
|
|
452
|
+
const r = await this.docker(["ps", "-a", "--filter", `label=${this.cfg.workerLabel}`, "--format", "{{.Names}}\t{{.State}}"], { timeoutMs: Math.max(1, budgetMs), ...(signal !== undefined ? { signal } : {}) });
|
|
453
|
+
if (!r.ok)
|
|
454
|
+
return { ok: false, reason: r.error.message };
|
|
455
|
+
if (r.value.exitCode !== 0)
|
|
456
|
+
return { ok: false, reason: r.value.stderr.trim() || `exit ${r.value.exitCode}` };
|
|
457
|
+
const rows = r.value.stdout
|
|
458
|
+
.split("\n")
|
|
459
|
+
.filter((line) => line.trim().length > 0)
|
|
460
|
+
.map((line) => {
|
|
461
|
+
const [name = "", state = ""] = line.split("\t");
|
|
462
|
+
return { name: name.trim(), state: state.trim().toLowerCase() };
|
|
463
|
+
});
|
|
464
|
+
return { ok: true, rows };
|
|
240
465
|
}
|
|
241
466
|
async exec(command, options) {
|
|
242
467
|
if (options?.abortSignal?.aborted)
|
|
243
468
|
return { ok: false, error: new ExecutionError("aborted", "exec aborted before start") };
|
|
244
|
-
const ready = await this.ensureConnectedExec();
|
|
469
|
+
const ready = await this.ensureConnectedExec(options?.abortSignal);
|
|
245
470
|
if (!ready.ok)
|
|
246
471
|
return ready;
|
|
247
472
|
const execArgs = this.startArgv(engineStart(options?.readFloor), command, { cwd: options?.cwd, env: options?.env });
|
|
@@ -258,9 +483,9 @@ export class RemoteLocalDockerExecutionEnv {
|
|
|
258
483
|
return ok({ stdout: r.value.stdout, stderr: r.value.stderr, exitCode: r.value.exitCode });
|
|
259
484
|
}
|
|
260
485
|
async *execStream(command, options) {
|
|
261
|
-
const ready = await this.ensureConnectedExec();
|
|
486
|
+
const ready = await this.ensureConnectedExec(options?.signal);
|
|
262
487
|
if (!ready.ok)
|
|
263
|
-
throw new RemoteExecutionError("connect_failed", ready.error.message, ready.error);
|
|
488
|
+
throw new RemoteExecutionError(ready.error.code === "aborted" ? "aborted" : "connect_failed", ready.error.message, ready.error);
|
|
264
489
|
const execArgs = this.startArgv(engineStart(undefined), command, { cwd: options?.cwd, env: options?.env });
|
|
265
490
|
if (!execArgs.ok)
|
|
266
491
|
throw new RemoteExecutionError("unsupported", execArgs.error.message, execArgs.error);
|
|
@@ -392,7 +617,7 @@ export class RemoteLocalDockerExecutionEnv {
|
|
|
392
617
|
return ok(path.posix.join(...parts));
|
|
393
618
|
}
|
|
394
619
|
async readBinaryFile(p, abortSignal) {
|
|
395
|
-
const ready = await this.fsReady(p);
|
|
620
|
+
const ready = await this.fsReady(p, abortSignal);
|
|
396
621
|
if (!ready.ok)
|
|
397
622
|
return ready;
|
|
398
623
|
const abs = this.resolve(p);
|
|
@@ -420,20 +645,20 @@ export class RemoteLocalDockerExecutionEnv {
|
|
|
420
645
|
return ok(lines);
|
|
421
646
|
}
|
|
422
647
|
stagedLane(content) {
|
|
423
|
-
return {
|
|
648
|
+
return { prepare: readyUpload((dest, signal) => this.pipeIn(content, dest, signal)), run: (cmd, signal) => this.fsExec(cmd, signal), provider: PROVIDER, logger: this.cfg.logger };
|
|
424
649
|
}
|
|
425
650
|
async writeFile(p, content, abortSignal) {
|
|
426
|
-
const ready = await this.fsReady(p);
|
|
651
|
+
const ready = await this.fsReady(p, abortSignal);
|
|
427
652
|
if (!ready.ok)
|
|
428
653
|
return ready;
|
|
429
654
|
return writeFileStaged(this.stagedLane(content), this.resolve(p), abortSignal);
|
|
430
655
|
}
|
|
431
656
|
async appendFile(p, content, abortSignal) {
|
|
432
|
-
const ready = await this.fsReady(p);
|
|
657
|
+
const ready = await this.fsReady(p, abortSignal);
|
|
433
658
|
if (!ready.ok)
|
|
434
659
|
return ready;
|
|
435
660
|
const abs = this.resolve(p);
|
|
436
|
-
return appendFileStaged(this.stagedLane(content), abs, abortSignal, (
|
|
661
|
+
return appendFileStaged(this.stagedLane(content), abs, abortSignal, readyUpload((dest, signal) => this.pipeIn(content, dest, signal, ">>")));
|
|
437
662
|
}
|
|
438
663
|
async pipeIn(content, dest, abortSignal, redirect = ">") {
|
|
439
664
|
const r = await this.fsExec(`cat ${redirect} ${shellQuote(dest)}`, abortSignal, typeof content === "string" ? Buffer.from(content, "utf8") : content);
|
|
@@ -455,7 +680,9 @@ export class RemoteLocalDockerExecutionEnv {
|
|
|
455
680
|
if (this.destroyed)
|
|
456
681
|
return { ok: false, error: new ExecutionError("shell_unavailable", "execution env already destroyed") };
|
|
457
682
|
if (!this.containerId) {
|
|
458
|
-
const c = await this.
|
|
683
|
+
const c = await this.joinConnect(abortSignal);
|
|
684
|
+
if (!c.ok && c.error.code === "aborted" && abortSignal?.aborted)
|
|
685
|
+
return { ok: false, error: new ExecutionError("aborted", "exec aborted before start (file operation; the container was still connecting)", c.error) };
|
|
459
686
|
if (!c.ok)
|
|
460
687
|
return { ok: false, error: new ExecutionError("shell_unavailable", `local-docker connect failed: ${c.error.message}`, c.error) };
|
|
461
688
|
}
|
|
@@ -512,7 +739,9 @@ export class RemoteLocalDockerExecutionEnv {
|
|
|
512
739
|
for (const [k, v] of Object.entries(mergedEnv))
|
|
513
740
|
args.push("-e", `${k}=${v}`);
|
|
514
741
|
}
|
|
515
|
-
|
|
742
|
+
if (this.instance === undefined)
|
|
743
|
+
return { ok: false, error: new ExecutionError("shell_unavailable", "no container instance is held by this execution env") };
|
|
744
|
+
args.push(this.instance, ...floorArgv(launch.value, [o.shell ?? this.containerShell, "-c", command]));
|
|
516
745
|
return ok(args);
|
|
517
746
|
}
|
|
518
747
|
floorTransport() {
|
|
@@ -538,7 +767,12 @@ export class RemoteLocalDockerExecutionEnv {
|
|
|
538
767
|
return r.value.exitCode === 0 ? { ok: true } : { ok: false, error: r.value.stderr.trim() || `exit ${r.value.exitCode}` };
|
|
539
768
|
},
|
|
540
769
|
openRelay: (identity, command, events) => {
|
|
541
|
-
const
|
|
770
|
+
const instance = this.instance;
|
|
771
|
+
if (instance === undefined) {
|
|
772
|
+
queueMicrotask(() => events.closed("no container instance is held by this execution env"));
|
|
773
|
+
return { send: () => { }, close: () => { } };
|
|
774
|
+
}
|
|
775
|
+
const args = ["exec", "-i", ...dockerIdentityFlags({ mode: "control", identity }), instance, "/bin/sh", "-c", command];
|
|
542
776
|
const child = this.spawnFn(this.cfg.dockerPath, this.withHostFlag(args), { stdio: ["pipe", "pipe", "pipe"], env: this.cliEnv() });
|
|
543
777
|
let closed = false;
|
|
544
778
|
const close = (why) => {
|
|
@@ -567,7 +801,14 @@ export class RemoteLocalDockerExecutionEnv {
|
|
|
567
801
|
return new Promise((resolve) => {
|
|
568
802
|
let settled = false;
|
|
569
803
|
let forceSettleTimer;
|
|
570
|
-
|
|
804
|
+
let child;
|
|
805
|
+
try {
|
|
806
|
+
child = this.spawnFn(this.cfg.dockerPath, this.withHostFlag(args), { stdio: [opts?.input !== undefined ? "pipe" : "ignore", "pipe", "pipe"], env: this.cliEnv() });
|
|
807
|
+
}
|
|
808
|
+
catch (e) {
|
|
809
|
+
resolve({ ok: false, error: new ExecutionError("spawn_error", `docker spawn failed (is '${this.cfg.dockerPath}' installed?): ${errMsg(e)}`, e instanceof Error ? e : undefined) });
|
|
810
|
+
return;
|
|
811
|
+
}
|
|
571
812
|
const killGrace = () => {
|
|
572
813
|
try {
|
|
573
814
|
child.kill("SIGKILL");
|
|
@@ -635,6 +876,21 @@ export class RemoteLocalDockerExecutionEnv {
|
|
|
635
876
|
});
|
|
636
877
|
});
|
|
637
878
|
}
|
|
879
|
+
joinConnect(signal) {
|
|
880
|
+
const shared = this.connect();
|
|
881
|
+
if (signal === undefined)
|
|
882
|
+
return shared;
|
|
883
|
+
if (signal.aborted)
|
|
884
|
+
return Promise.resolve({ ok: false, error: new RemoteExecutionError("aborted", "aborted while connecting") });
|
|
885
|
+
return new Promise((resolve) => {
|
|
886
|
+
const onAbort = () => resolve({ ok: false, error: new RemoteExecutionError("aborted", "aborted while connecting") });
|
|
887
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
888
|
+
void shared.then((r) => {
|
|
889
|
+
signal.removeEventListener("abort", onAbort);
|
|
890
|
+
resolve(r);
|
|
891
|
+
});
|
|
892
|
+
});
|
|
893
|
+
}
|
|
638
894
|
containerShell = "/bin/sh";
|
|
639
895
|
containerShellReady;
|
|
640
896
|
async untilOrAborted(shared, signal) {
|
|
@@ -668,25 +924,27 @@ export class RemoteLocalDockerExecutionEnv {
|
|
|
668
924
|
catch {
|
|
669
925
|
}
|
|
670
926
|
}
|
|
671
|
-
async ensureConnectedExec() {
|
|
927
|
+
async ensureConnectedExec(signal) {
|
|
672
928
|
if (this.destroyed)
|
|
673
929
|
return { ok: false, error: new ExecutionError("shell_unavailable", "execution env already destroyed") };
|
|
674
930
|
if (this.containerId) {
|
|
675
931
|
await this.probeContainerShell();
|
|
676
932
|
return ok(undefined);
|
|
677
933
|
}
|
|
678
|
-
const c = await this.
|
|
934
|
+
const c = await this.joinConnect(signal);
|
|
935
|
+
if (!c.ok && c.error.code === "aborted" && signal?.aborted)
|
|
936
|
+
return { ok: false, error: new ExecutionError("aborted", "exec aborted before start (the container was still connecting)", c.error) };
|
|
679
937
|
if (!c.ok)
|
|
680
938
|
return { ok: false, error: new ExecutionError("shell_unavailable", `local-docker connect failed: ${c.error.message}`, c.error) };
|
|
681
939
|
await this.probeContainerShell();
|
|
682
940
|
return ok(undefined);
|
|
683
941
|
}
|
|
684
|
-
async fsReady(p) {
|
|
942
|
+
async fsReady(p, signal) {
|
|
685
943
|
if (this.destroyed)
|
|
686
944
|
return { ok: false, error: new FileError("unknown", "execution env already destroyed", this.resolve(p)) };
|
|
687
945
|
if (this.containerId)
|
|
688
946
|
return ok(undefined);
|
|
689
|
-
const c = await this.
|
|
947
|
+
const c = await this.joinConnect(signal);
|
|
690
948
|
if (!c.ok)
|
|
691
949
|
return { ok: false, error: fileErrorFromExec(c.error, this.resolve(p)) };
|
|
692
950
|
return ok(undefined);
|
|
@@ -702,14 +960,51 @@ export class RemoteLocalDockerExecutionEnv {
|
|
|
702
960
|
function sanitizeId(id) {
|
|
703
961
|
return id.replace(/[^A-Za-z0-9._-]/g, "_").slice(0, 48) || "task";
|
|
704
962
|
}
|
|
963
|
+
export function localDockerContainerNameOf(workerLabel, identity) {
|
|
964
|
+
const digest = createHash("sha256").update(workerLabel).update("\0").update(identity).digest("hex").slice(0, 12);
|
|
965
|
+
return `sema-docker-${sanitizeId(identity)}-${digest}`;
|
|
966
|
+
}
|
|
967
|
+
export function localDockerIdentityOfName(workerLabel, name) {
|
|
968
|
+
const m = /^sema-docker-(.+)-[0-9a-f]{12}$/.exec(name);
|
|
969
|
+
const candidate = m?.[1];
|
|
970
|
+
return candidate !== undefined && localDockerContainerNameOf(workerLabel, candidate) === name ? candidate : undefined;
|
|
971
|
+
}
|
|
705
972
|
function errMsg(e) {
|
|
706
973
|
return e instanceof Error ? e.message : String(e);
|
|
707
974
|
}
|
|
708
975
|
export function localDockerExecutionEnvFactory(config, deps = {}) {
|
|
709
976
|
const { workspaceFillOf, ...base } = config;
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
977
|
+
const live = new Map();
|
|
978
|
+
const envOf = async (identity, ctx) => {
|
|
979
|
+
sweep();
|
|
980
|
+
let leftover;
|
|
981
|
+
for (let held = live.get(identity); held !== undefined; held = live.get(identity)) {
|
|
982
|
+
const releasing = held.releasing;
|
|
983
|
+
if (releasing === undefined)
|
|
984
|
+
return held;
|
|
985
|
+
await releasing;
|
|
986
|
+
if (live.get(identity) === held) {
|
|
987
|
+
leftover = held.leftover;
|
|
988
|
+
live.delete(identity);
|
|
989
|
+
}
|
|
990
|
+
}
|
|
991
|
+
const workspaceFill = ctx !== undefined ? workspaceFillOf?.(ctx) : undefined;
|
|
992
|
+
const env = new RemoteLocalDockerExecutionEnv({ ...base, id: identity, ...(workspaceFill !== undefined ? { workspaceFill } : {}), ...(leftover !== undefined ? { leftover } : {}) }, deps);
|
|
993
|
+
live.set(identity, env);
|
|
994
|
+
return env;
|
|
995
|
+
};
|
|
996
|
+
const sweep = () => {
|
|
997
|
+
for (const [identity, env] of live)
|
|
998
|
+
if (env.released && env.leftover === undefined)
|
|
999
|
+
live.delete(identity);
|
|
1000
|
+
};
|
|
1001
|
+
let lister;
|
|
1002
|
+
const reapPort = {
|
|
1003
|
+
label: base.workerLabel,
|
|
1004
|
+
list: () => (lister ??= new RemoteLocalDockerExecutionEnv({ ...base, id: "reaper-lister" }, deps)).readLaneRegistry(base.controlTimeoutMs ?? DEFAULT_CONTROL_TIMEOUT_MS, undefined),
|
|
1005
|
+
identityOf: (name) => localDockerIdentityOfName(base.workerLabel, name),
|
|
1006
|
+
settle: async (identity) => (await envOf(identity, undefined)).reapWorkspace(),
|
|
713
1007
|
};
|
|
1008
|
+
return Object.assign((ctx) => envOf(ctx.taskId ?? ctx.sessionId, ctx), { reapPort });
|
|
714
1009
|
}
|
|
715
1010
|
//# sourceMappingURL=remote-env-local-docker.js.map
|