@sema-agent/server 7.146.0 → 7.147.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 +384 -0
- package/README.md +1 -1
- package/README.zh-CN.md +1 -1
- package/USAGE.md +170 -66
- package/deploy/facts/lanes.json +7 -0
- package/deploy/sema-up/README.md +2 -2
- package/deploy/sema-up/chart/templates/_helpers.tpl +22 -0
- 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 +1 -1
- package/deploy/sema-up/cluster-up.sh +2 -1
- package/deploy/sema-up/lib/flagshape.sh +4 -0
- package/deploy/sema-up/lib/lanes.json +2 -5
- package/deploy/sema-up/sema-up.sh +12 -9
- package/deploy/sema-up/stack/compose.yaml +5 -4
- package/deploy/sema-up/stack/sema-stack-cluster.yaml +4 -3
- package/dist/approval-card.d.ts +4 -4
- package/dist/approval.d.ts +3 -3
- package/dist/audit.js +2 -2
- package/dist/bench/s1/live-deps.js +3 -1
- package/dist/boot/crash-last.js +2 -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 +2 -1
- package/dist/boot/execution-env.js +45 -33
- package/dist/boot/execution-lane.d.ts +37 -9
- package/dist/boot/execution-lane.js +74 -20
- package/dist/boot/exit-boundary.d.ts +1 -1
- package/dist/boot/exit-last.js +2 -1
- package/dist/boot/governance-seams.d.ts +2 -2
- package/dist/boot/leader.js +1 -1
- package/dist/boot/memory-boundary.d.ts +11 -11
- package/dist/boot/memory-boundary.js +3 -3
- package/dist/boot/memory-consolidation.d.ts +13 -24
- package/dist/boot/memory-consolidation.js +0 -13
- package/dist/boot/org-memory.js +3 -2
- package/dist/boot/parked-revive-gate.d.ts +1 -1
- package/dist/boot/parked-revive-gate.js +1 -1
- package/dist/boot/reapers.js +1 -1
- package/dist/boot/resolve-spec.js +91 -111
- package/dist/boot/retention-lane.d.ts +4 -42
- package/dist/boot/session-faces.d.ts +1 -0
- package/dist/boot/session-faces.js +8 -2
- package/dist/boot/stage-01-config.d.ts +1 -1
- package/dist/boot/stage-01-config.js +6 -2
- package/dist/boot/stage-02-web-admin-pull.d.ts +1 -1
- package/dist/boot/stage-02-web-admin-pull.js +10 -8
- package/dist/boot/stage-03-store-backend.d.ts +1 -1
- package/dist/boot/stage-04-stores.d.ts +1 -1
- package/dist/boot/stage-05-execution-env.d.ts +2 -2
- package/dist/boot/stage-05-execution-env.js +3 -3
- package/dist/boot/stage-06-runners.d.ts +3 -3
- package/dist/boot/stage-06-runners.js +1 -3
- package/dist/boot/stage-07-capability-layer.d.ts +3 -3
- package/dist/boot/stage-07-capability-layer.js +4 -9
- package/dist/boot/stage-08-reapers.d.ts +3 -3
- package/dist/boot/stage-09-leader.d.ts +4 -3
- package/dist/boot/stage-10-http-server.d.ts +4 -3
- package/dist/boot/stage-10-http-server.js +2 -1
- package/dist/boot/stores.d.ts +9 -0
- package/dist/boot/stores.js +18 -7
- package/dist/boot/web-admin.js +3 -3
- package/dist/capabilities/center-plugins.d.ts +2 -0
- package/dist/capabilities/center-plugins.js +6 -2
- package/dist/capabilities/composite-members.d.ts +1 -0
- package/dist/capabilities/composite-members.js +1 -0
- 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/scenarios.d.ts +32 -18
- package/dist/capabilities/scenarios.js +13 -9
- package/dist/capabilities/settings-contract.d.ts +29 -0
- package/dist/capabilities/settings-contract.js +14 -0
- package/dist/capabilities/skills.d.ts +5 -5
- package/dist/capability-facts.d.ts +38 -0
- package/dist/capability-facts.js +34 -1
- package/dist/center-credential-renewer.js +3 -2
- package/dist/config-catalog.js +6 -5
- package/dist/config-invariants.d.ts +18 -3
- package/dist/config-invariants.js +36 -19
- package/dist/config-lkg.d.ts +1 -1
- package/dist/config-lkg.js +5 -6
- package/dist/config-provider.js +2 -0
- package/dist/config-types.d.ts +190 -186
- package/dist/config.d.ts +68 -5
- package/dist/config.js +80 -54
- package/dist/degenerate-instrument.js +1 -1
- package/dist/deploy-facts.js +3 -2
- package/dist/deployment-shape.d.ts +21 -12
- package/dist/deployment-shape.js +24 -6
- package/dist/env-facts.d.ts +7 -5
- package/dist/env-facts.js +10 -6
- 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 +49 -86
- package/dist/execution-lane-caps.js +52 -62
- package/dist/execution-placement.d.ts +18 -2
- package/dist/execution-placement.js +19 -0
- package/dist/file-history-disclosure.d.ts +2 -2
- package/dist/fleet/drain-entry.d.ts +17 -10
- package/dist/fleet/drain-entry.js +1 -1
- package/dist/fleet/serving-lease.js +3 -4
- package/dist/history-anchor.d.ts +22 -0
- package/dist/history-anchor.js +14 -0
- package/dist/hooks/command-spawn.d.ts +1 -4
- package/dist/hooks/command-spawn.js +0 -11
- package/dist/hooks/hook-runner.d.ts +52 -8
- package/dist/hooks/hook-runner.js +160 -36
- package/dist/http/approval-sweeps.d.ts +2 -5
- package/dist/http/approval-sweeps.js +3 -2
- package/dist/http/checkpoint-ctx.d.ts +17 -0
- package/dist/http/checkpoint-ctx.js +6 -0
- package/dist/http/claim-latency.d.ts +10 -0
- package/dist/http/claim-latency.js +12 -0
- package/dist/http/dispatch.js +1 -1
- package/dist/http/durable-run-leg.js +2 -1
- package/dist/http/execution-context.d.ts +3 -1
- package/dist/http/execution-context.js +4 -0
- package/dist/http/memory-compliance-failure-reply.d.ts +1 -1
- package/dist/http/memory-compliance-failure-reply.js +3 -0
- package/dist/http/memory-store-refusal-reply.d.ts +3 -3
- package/dist/http/memory-store-refusal-reply.js +3 -0
- package/dist/http/owner-access.d.ts +11 -0
- package/dist/http/owner-access.js +7 -4
- package/dist/http/principal-gate.d.ts +3 -14
- package/dist/http/principal-gate.js +0 -13
- package/dist/http/request-guards.d.ts +1 -1
- package/dist/http/resume-legs.d.ts +7 -10
- package/dist/http/resume-legs.js +79 -50
- 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 +32 -16
- package/dist/http/route-table.js +2 -0
- package/dist/http/routes/approvals-assistant.js +5 -25
- package/dist/http/routes/capabilities.js +8 -2
- package/dist/http/routes/devices.js +1 -1
- package/dist/http/routes/memory-origin.d.ts +1 -1
- package/dist/http/routes/notify-wake.js +2 -1
- package/dist/http/routes/projects.d.ts +70 -0
- package/dist/http/routes/projects.js +86 -0
- package/dist/http/routes/rules.js +30 -2
- package/dist/http/routes/runs.js +8 -8
- package/dist/http/routes/session-sync.js +27 -10
- package/dist/http/routes/sessions.d.ts +7 -1
- package/dist/http/routes/sessions.js +104 -2
- package/dist/http/routes/tasks.js +9 -3
- package/dist/http/server.d.ts +24 -10
- package/dist/http/server.js +17 -6
- package/dist/http/stored-body-replay.d.ts +5 -3
- package/dist/http/stored-body-replay.js +10 -1
- package/dist/http/wire-types.d.ts +19 -10
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/instruction-source-notice.d.ts +1 -1
- 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-scope.d.ts +2 -2
- package/dist/memory-scope.js +1 -1
- package/dist/memory-store-refusal.d.ts +17 -4
- package/dist/memory-store-refusal.js +1 -1
- package/dist/memory-sync-client.d.ts +2 -0
- package/dist/memory-sync-client.js +13 -11
- package/dist/memory-sync.js +1 -1
- package/dist/model-compat.d.ts +35 -21
- package/dist/model-compat.js +49 -21
- package/dist/model-entry-refusal.d.ts +11 -1
- package/dist/model-entry-refusal.js +7 -0
- package/dist/namespaced-rule-name.d.ts +18 -1
- package/dist/namespaced-rule-name.js +12 -0
- package/dist/observability/fail-open.d.ts +17 -9
- package/dist/observability/fail-open.js +17 -9
- package/dist/observability/metrics.d.ts +2 -0
- package/dist/observability/metrics.js +2 -0
- package/dist/observability/secret-env-scrub.d.ts +30 -4
- package/dist/observability/secret-env-scrub.js +15 -3
- 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 +26 -6
- package/dist/orchestration/workflow-completion-inbox.js +63 -45
- package/dist/org-memory-admission.d.ts +5 -2
- package/dist/org-memory-admission.js +25 -10
- package/dist/parked-decide.d.ts +33 -26
- package/dist/parked-decide.js +36 -44
- package/dist/plugins/approval-ask-store-file.d.ts +10 -2
- package/dist/plugins/approval-ask-store-file.js +37 -4
- package/dist/plugins/approval-ask-store-memory.d.ts +5 -3
- package/dist/plugins/approval-ask-store-memory.js +11 -2
- package/dist/plugins/approval-ask-store-sql.d.ts +3 -0
- package/dist/plugins/approval-ask-store-sql.js +3 -1
- package/dist/plugins/blob-backend.d.ts +38 -195
- package/dist/plugins/blob-backend.js +33 -229
- package/dist/plugins/caching-session-store.d.ts +9 -4
- package/dist/plugins/checkpoint-index-columns.d.ts +1 -1
- package/dist/plugins/checkpoint-index-columns.js +3 -2
- package/dist/plugins/checkpoint-store-face.d.ts +1 -1
- package/dist/plugins/device-store-sql.d.ts +2 -2
- package/dist/plugins/device-store-sql.js +5 -10
- 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 +26 -12
- package/dist/plugins/file-run-store.js +63 -63
- package/dist/plugins/imported-layer-root-retirement.d.ts +17 -8
- 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/local-checkpoint-store.d.ts +5 -0
- package/dist/plugins/local-checkpoint-store.js +11 -7
- package/dist/plugins/local-data-dir-modes-m39.d.ts +48 -0
- package/dist/plugins/local-data-dir-modes-m39.js +182 -0
- package/dist/plugins/local-engine-high-water.d.ts +11 -0
- package/dist/plugins/local-engine-high-water.js +59 -0
- package/dist/plugins/local-session-store.d.ts +91 -25
- package/dist/plugins/local-session-store.js +124 -45
- package/dist/plugins/local-task-attachment-store.d.ts +2 -0
- package/dist/plugins/local-task-attachment-store.js +10 -11
- 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 +2 -2
- package/dist/plugins/memory-engine-pg.d.ts +4 -3
- package/dist/plugins/memory-engine-pg.js +4 -4
- package/dist/plugins/memory-engine-sql-apply.d.ts +13 -4
- package/dist/plugins/memory-engine-sql-apply.js +1 -1
- package/dist/plugins/memory-engine-tidb.d.ts +8 -5
- package/dist/plugins/memory-engine-tidb.js +7 -8
- package/dist/plugins/one-time-migrations.d.ts +145 -35
- package/dist/plugins/one-time-migrations.js +272 -120
- 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 +8 -8
- package/dist/plugins/permission-rule-store-file.js +14 -2
- package/dist/plugins/pg-pool.d.ts +2 -1
- package/dist/plugins/pg-pool.js +11 -4
- 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 +12 -3
- package/dist/plugins/remote-env-e2b.js +6 -4
- package/dist/plugins/remote-env-host.d.ts +9 -1
- package/dist/plugins/remote-env-host.js +6 -5
- package/dist/plugins/remote-env-k8s.d.ts +5 -2
- package/dist/plugins/remote-env-k8s.js +15 -4
- package/dist/plugins/remote-env-local-docker.d.ts +4 -1
- package/dist/plugins/remote-env-local-docker.js +3 -3
- package/dist/plugins/remote-env-ssh.d.ts +8 -2
- package/dist/plugins/remote-env-ssh.js +26 -24
- 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 +126 -0
- package/dist/plugins/retention-deployment.js +88 -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/schema-consistency.d.ts +0 -6
- package/dist/plugins/schema-consistency.js +1 -2
- package/dist/plugins/schema-ensure-legs.d.ts +1 -1
- package/dist/plugins/schema-ensure-legs.js +11 -1
- package/dist/plugins/session-ext-table.d.ts +74 -0
- package/dist/plugins/session-ext-table.js +121 -0
- package/dist/plugins/session-fork.d.ts +1 -1
- package/dist/plugins/session-row-sql.d.ts +8 -7
- package/dist/plugins/session-row-sql.js +15 -7
- package/dist/plugins/session-store-sql.d.ts +131 -0
- package/dist/plugins/session-store-sql.js +298 -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 -0
- package/dist/plugins/shared-memory-store-sql.js +13 -13
- package/dist/plugins/snapshot-bucket-presence.js +1 -1
- package/dist/plugins/sql-driver.d.ts +23 -7
- package/dist/plugins/sql-driver.js +41 -8
- package/dist/plugins/sql-errors.d.ts +5 -2
- package/dist/plugins/sql-errors.js +4 -0
- package/dist/plugins/store-backend.d.ts +35 -8
- package/dist/plugins/store-backend.js +184 -62
- package/dist/plugins/store-contracts.d.ts +9 -2
- package/dist/plugins/store-contracts.js +1 -0
- package/dist/plugins/task-attachment-store.d.ts +6 -8
- package/dist/plugins/task-attachment-store.js +15 -10
- 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 +19 -31
- package/dist/plugins/user-input-ledger-sql.d.ts +1 -1
- package/dist/read-face-posture.d.ts +6 -6
- package/dist/read-face-posture.js +2 -2
- package/dist/request-value-closure.d.ts +5 -5
- package/dist/request-value-closure.js +1 -1
- package/dist/rules-consent.d.ts +41 -13
- package/dist/rules-consent.js +101 -53
- package/dist/run-local.js +17 -13
- package/dist/runs.d.ts +48 -30
- package/dist/runs.js +26 -16
- package/dist/runtime-caps-resolver.d.ts +15 -8
- package/dist/runtime-caps-resolver.js +14 -10
- package/dist/sealed-key-layout.d.ts +2 -3
- package/dist/sealed-key-layout.js +0 -1
- package/dist/sealed-key.js +7 -5
- package/dist/security.d.ts +5 -3
- package/dist/sema-config-dir.js +2 -2
- package/dist/server-secret-env.d.ts +2 -0
- package/dist/service-version.d.ts +2 -1
- package/dist/service-version.js +2 -2
- package/dist/session-error-wire.d.ts +1 -1
- package/dist/session-incarnation.d.ts +8 -5
- package/dist/session-resident-background.d.ts +85 -32
- package/dist/session-resident-background.js +75 -7
- package/dist/session-row.d.ts +1 -1
- package/dist/session-sync-kernel.d.ts +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/store-posture.d.ts +2 -1
- package/dist/stored-request-hooks-m20.d.ts +3 -2
- package/dist/stored-request-hooks-m20.js +19 -14
- 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 +1 -1
- package/dist/stores-sql/checkpoint-store-sql.js +11 -27
- 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/{plugins → stores-sql}/pg-session-storage.d.ts +23 -76
- package/dist/{plugins → stores-sql}/pg-session-storage.js +80 -209
- package/dist/{plugins → stores-sql}/retention-store-sql.d.ts +123 -217
- package/dist/{plugins → stores-sql}/retention-store-sql.js +66 -190
- 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 +1 -1
- package/dist/stores-sql/session-write-hooks.d.ts +59 -0
- package/dist/stores-sql/session-write-hooks.js +2 -0
- package/dist/{plugins → stores-sql}/tidb-session-storage.d.ts +10 -11
- package/dist/{plugins → stores-sql}/tidb-session-storage.js +10 -21
- package/dist/{plugins → stores-sql}/tidb-session-store.d.ts +32 -122
- package/dist/{plugins → stores-sql}/tidb-session-store.js +71 -171
- 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 +56 -0
- package/dist/stores-sql/windowed-session-storage.js +61 -0
- package/dist/task-a2a.d.ts +7 -1
- package/dist/task-a2a.js +15 -14
- package/dist/task-cwd.d.ts +11 -3
- package/dist/task-cwd.js +17 -1
- package/dist/task-mcp.d.ts +10 -2
- package/dist/task-mcp.js +13 -16
- package/dist/task-settings.d.ts +9 -4
- package/dist/task-settings.js +17 -6
- package/dist/tool-approval.d.ts +21 -8
- package/dist/tool-approval.js +10 -6
- package/dist/trace/core-keyset-guard.d.ts +9 -3
- 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 +23 -1
- package/dist/trace/exit-seat.js +3 -0
- package/dist/trace/project.d.ts +33 -16
- package/dist/trace/project.js +12 -9
- package/dist/trace/redact.d.ts +1 -1
- package/dist/trace/redact.js +61 -73
- package/dist/trace/self-minted-wire.d.ts +263 -10
- package/dist/trace/self-minted-wire.js +90 -2
- 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 +38 -2
- package/dist/trace/wire-projection-faces.js +26 -1
- package/dist/unread-request-members.d.ts +66 -0
- package/dist/unread-request-members.js +41 -0
- package/dist/user-input-ledger.d.ts +2 -2
- package/dist/web-admin-client/apply-effective.js +22 -26
- 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 +4 -1
- package/dist/web-admin-client/center-request.js +2 -1
- package/dist/web-admin-client/effective-keys.js +0 -1
- package/dist/web-admin-client/facade.d.ts +1 -1
- package/dist/web-admin-client/http-client.d.ts +1 -0
- package/dist/web-admin-client/http-client.js +17 -9
- package/dist/web-admin-client/restart-signal.js +5 -2
- package/dist/web-admin-client/skills-mcp.d.ts +20 -6
- package/dist/web-admin-client/skills-mcp.js +26 -21
- package/dist/web-admin-client/types.d.ts +34 -49
- package/docs/DEVICE-EXECUTOR-PROTOCOL.md +2 -2
- package/package.json +13 -12
- package/scripts/drain-check-local.mjs +2 -28
- package/scripts/drain-check.mysql.sql +2 -18
- package/scripts/drain-check.pg.sql +2 -18
- package/wire-changes/server@7.147.0.json +813 -0
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { posix } from "node:path";
|
|
2
2
|
import { DEPLOYMENT_SHAPE_PREDICATES } from "./deployment-shape.js";
|
|
3
|
-
import { executionLaneHomeDir
|
|
3
|
+
import { executionLaneHomeDir } from "./execution-lane-caps.js";
|
|
4
4
|
import { configRootOf } from "./sema-config-dir.js";
|
|
5
5
|
const CONFIG_DIR_ENV = "SEMA_CONFIG_DIR";
|
|
6
6
|
export function sandboxForwardedEnvOf(deployment) {
|
|
7
|
-
const lane =
|
|
7
|
+
const lane = deployment.remoteExec.provider;
|
|
8
8
|
switch (lane) {
|
|
9
9
|
case "e2b":
|
|
10
10
|
case "k8s":
|
|
11
|
-
return deployment.remoteExec
|
|
11
|
+
return deployment.remoteExec.sandboxEnv ?? {};
|
|
12
12
|
case "local-docker":
|
|
13
|
-
return deployment.remoteExec
|
|
14
|
-
case "
|
|
13
|
+
return deployment.remoteExec.env ?? {};
|
|
14
|
+
case "none":
|
|
15
15
|
case "host":
|
|
16
16
|
case "ssh":
|
|
17
17
|
case "adb":
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ExecutionEnvFactoryContext, RewindFilesRequest, RewindFilesResult, Runner } from "@sema-agent/core";
|
|
2
|
+
/**
|
|
3
|
+
* run 外回退调引擎的唯一入口:在用途 `rewind-files` 里调引擎的回退动词 `rewindFiles`,原样交回引擎的结果(引擎的拒原样上抛)。
|
|
4
|
+
* 唯一调用方 = `http/routes/sessions.ts` 的 `session-rewind-files` 臂(钉 `test/session-rewind-files.test.ts` (f))。
|
|
5
|
+
*/
|
|
6
|
+
export declare function rewindFilesUnderPurpose(runner: Pick<Runner, "rewindFiles">, request: RewindFilesRequest): Promise<RewindFilesResult>;
|
|
7
|
+
/**
|
|
8
|
+
* 会话附件物化层(D-1 半场③;只装在没有恢复点的车道上,装配见 `boot/execution-env.ts`):建好内层环境之后,把这只会话绑定的附件写进工作目录。
|
|
9
|
+
* 写失败即抛(环境建立失败 —— objective 已向模型宣告文件在场,静默缺文件比任务失败更糟)。用途 `rewind-files` ⇒ 不写(没有模型、没有宣告;回退只碰被跟踪的文件)。
|
|
10
|
+
* `materialize` = 写附件的那一只(`task-attachment-store.ts` 的 `materializeAttachmentsInto`),返回写了几只(按工厂上下文的会话写);`onMaterialized` = 写了 ≥ 1 只时的运维行。
|
|
11
|
+
* 环境型是泛型参数:层不看环境的形,只把内层交回的那一只原样交回。
|
|
12
|
+
*/
|
|
13
|
+
export declare function createAttachmentMaterializingFactory<E>(inner: (ctx: ExecutionEnvFactoryContext) => E | Promise<E>, materialize: (env: E, ctx: ExecutionEnvFactoryContext) => Promise<number>, onMaterialized: (sessionId: string, count: number) => void): (ctx: ExecutionEnvFactoryContext) => Promise<E>;
|
|
14
|
+
//# sourceMappingURL=execution-env-purpose.d.ts.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
const purposeSeat = new AsyncLocalStorage();
|
|
3
|
+
export function rewindFilesUnderPurpose(runner, request) {
|
|
4
|
+
return purposeSeat.run("rewind-files", () => runner.rewindFiles(request));
|
|
5
|
+
}
|
|
6
|
+
function materializesAttachments(purpose) {
|
|
7
|
+
switch (purpose) {
|
|
8
|
+
case undefined:
|
|
9
|
+
return true;
|
|
10
|
+
case "rewind-files":
|
|
11
|
+
return false;
|
|
12
|
+
default: {
|
|
13
|
+
const unhandled = purpose;
|
|
14
|
+
throw new Error(`materializesAttachments: no ruling for purpose ${String(unhandled)}`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function createAttachmentMaterializingFactory(inner, materialize, onMaterialized) {
|
|
19
|
+
return async (ctx) => {
|
|
20
|
+
const env = await inner(ctx);
|
|
21
|
+
if (!materializesAttachments(purposeSeat.getStore()))
|
|
22
|
+
return env;
|
|
23
|
+
const n = await materialize(env, ctx);
|
|
24
|
+
if (n > 0)
|
|
25
|
+
onMaterialized(ctx.sessionId, n);
|
|
26
|
+
return env;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=execution-env-purpose.js.map
|
|
@@ -6,11 +6,9 @@ import { type LaneHomeConfig } from "./lane-home-probe.js";
|
|
|
6
6
|
* 多租户下这一位必须关(host 家族的 cwd/scheduler/backgroundShell/LSP 都是这一档,理由同源:
|
|
7
7
|
* 一个租户的输入不许把 agent 指向 worker 宿主上另一个租户/运维的文件与进程)。 */
|
|
8
8
|
export type LaneCapability = "supported" | "unsupported" | "single-user-only";
|
|
9
|
-
/**
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
* 这个状态的名字,不在表里)。表加词 ⇒ {@link executionLaneCaps} 的穷举 switch 编译红,这正是要的(「加词必须逐位表态」)。 */
|
|
13
|
-
export type ExecutionLane = "in-process" | RemoteExecProvider;
|
|
9
|
+
/** 闭集:执行车道全集 = settings-schema 词表正本的可声明车道(**派生**,本仓零手抄;`REMOTE_EXEC` 能写下去的词就是这些)。
|
|
10
|
+
* 表加词 ⇒ {@link executionLaneCaps} 的穷举 switch 编译红,这正是要的(「加词必须逐位表态」)。 */
|
|
11
|
+
export type ExecutionLane = DeclarableLane;
|
|
14
12
|
/**
|
|
15
13
|
* per-lane 能力位。每一位的注里点名**今天真正做判决的那处代码**——对账测试按这些坐标跑真函数,
|
|
16
14
|
* 所以坐标漂了(重命名/搬家/改语义)门会红,注释不会烂在这里。
|
|
@@ -27,7 +25,7 @@ export interface ExecutionLaneCaps {
|
|
|
27
25
|
readonly scheduler: LaneCapability;
|
|
28
26
|
/** LSP。判别式:`boot/execution-env.ts` 的 `lspManager` 两臂(沙箱桥 e2b/k8s;host 本地 NodeLspManager)。 */
|
|
29
27
|
readonly lsp: LaneCapability;
|
|
30
|
-
/** SendUserFile 的**沙箱直传腿**(host
|
|
28
|
+
/** SendUserFile 的**沙箱直传腿**(host 的本机 fs 源是另一条腿,不是本位)。
|
|
31
29
|
* 读者:部署形表行 `sandboxSendUserFile`(本位即判据;判定依据在 `capabilities/sandbox-file-send.ts` 头注)。 */
|
|
32
30
|
readonly sandboxSendUserFile: LaneCapability;
|
|
33
31
|
/** `/tmp/scratchpad/<sessionId>` 远端约定。读者:部署形表行 `remoteScratchpad`(本位即判据;改前对账 `isRemoteScratchpadLane` 的 Set)。 */
|
|
@@ -37,13 +35,12 @@ export interface ExecutionLaneCaps {
|
|
|
37
35
|
/**
|
|
38
36
|
* 这条车道**分不分租户**(裁定语义 = **租户不共宿主**)。
|
|
39
37
|
* · `supported` = 每个租户的命令落在各自的目标上(每任务一只沙箱:e2b / k8s / local-docker;发起者自己的设备:device,
|
|
40
|
-
* 归属由 deviceId↔principal 绑定验过),或根本没有手(
|
|
38
|
+
* 归属由 deviceId↔principal 绑定验过),或根本没有手(none:没有可共享的执行目标);
|
|
41
39
|
* · `single-user-only` = 所有任务落在**同一个共享目标**上(worker 宿主:host;一台常驻 SSH 对端:ssh;一台 ADB 设备:adb)
|
|
42
40
|
* ⇒ 只许单用户部署用。
|
|
43
41
|
* 本位**没有** `unsupported` 这一档(那会读成「谁都不许用」,不是车道事实)—— 型上收窄掉,每条车道必须在两档里表态。
|
|
44
42
|
* 🔴 **本位的值不在本仓写**:七条可声明车道读 settings-schema 词表正本的表行(`executionLaneRow(lane).tenantSeparation`;
|
|
45
|
-
* 中心写闸的 `requirePrincipal ∧ single-user-only` 交叉判与本仓 `multi-tenant-shared-lane` 拒启读的是同一个值,不会分叉)
|
|
46
|
-
* 只有 `in-process` 一格是本仓自己的事实(它不在表里)。
|
|
43
|
+
* 中心写闸的 `requirePrincipal ∧ single-user-only` 交叉判与本仓 `multi-tenant-shared-lane` 拒启读的是同一个值,不会分叉)。
|
|
47
44
|
* 唯一消费点是 `config-invariants.ts` 的 `multi-tenant-shared-lane`(经部署形表行 `laneSeparatesTenants` 落成布尔)。本位值与本仓**运行期事实**
|
|
48
45
|
* 不矛盾的对账 = `test/execution-lanes-schema-conformance.test.ts`(执行环境块的隔离位 / 路径是不是本机的 ⇒ 租户档的蕴含 + 唯一一条「不隔离却分租户」
|
|
49
46
|
* 的车道 = device 点名);ssh / adb 「两租户同一目标」的行为预言机 = `test/multi-tenant-shared-lane.test.ts`
|
|
@@ -88,16 +85,16 @@ export declare function sandboxReadFloorState(lane: SandboxFloorLane, knob: Sand
|
|
|
88
85
|
/** {@link capabilitiesFor} 读的部署配置:已装配的 `remoteExec` 里决定块的两键(`ServiceConfig` 的判别联合每一臂结构上都满足)+ 部署级读地板旋钮
|
|
89
86
|
* (`SANDBOX_READ_FLOOR`;缺席 ⇒ 缺省 `keep`,与 loader 同一只常量)。 */
|
|
90
87
|
export interface CapabilitiesDeployment {
|
|
91
|
-
readonly remoteExec
|
|
92
|
-
readonly provider
|
|
88
|
+
readonly remoteExec: {
|
|
89
|
+
readonly provider: string;
|
|
93
90
|
readonly s3Snapshot?: unknown;
|
|
94
|
-
}
|
|
91
|
+
};
|
|
95
92
|
readonly sandboxReadFloor?: SandboxReadFloorKnob | undefined;
|
|
96
93
|
}
|
|
97
94
|
/**
|
|
98
95
|
* 「这份部署上 run 所在的执行环境能做什么」—— 引擎能力块(八键)的**唯一作者**。
|
|
99
96
|
*
|
|
100
|
-
* 七只适配器的 `capabilities` 由它铸(适配器源码里没有能力字面量);`
|
|
97
|
+
* 七只适配器的 `capabilities` 由它铸(适配器源码里没有能力字面量);`none` 答引擎桩环境的块。读者读块,不另存一位:
|
|
101
98
|
* 起服行 `remote_exec_enabled`(`isolated` / `suspendable` / `keepsReadFloor`)、部署形表行 `sandboxPathAdjudication` / `suspendableHands`、
|
|
102
99
|
* {@link laneIsolated} / {@link laneWiresExecutionEnv} / {@link handsOnWorkerFilePlane}、记忆边界审计的文件平面位。改一条车道的能力 = 改本函数一处,
|
|
103
100
|
* 适配器、行、起服行、wire 同翻(门 `test/execution-env-capabilities-one-source.test.ts`)。
|
|
@@ -105,10 +102,10 @@ export interface CapabilitiesDeployment {
|
|
|
105
102
|
* 认不出的车道词 ⇒ `undefined`(调用方 fail-closed;生产链上不可达,`loadConfig` 先拒启)。两个重载同 {@link executionLaneOf}:喂已装配的车道词 ⇒ 返回型无 `undefined`。
|
|
106
103
|
*/
|
|
107
104
|
export declare function capabilitiesFor(deployment: {
|
|
108
|
-
readonly remoteExec
|
|
109
|
-
readonly provider:
|
|
105
|
+
readonly remoteExec: {
|
|
106
|
+
readonly provider: ExecutionLane;
|
|
110
107
|
readonly s3Snapshot?: unknown;
|
|
111
|
-
}
|
|
108
|
+
};
|
|
112
109
|
readonly sandboxReadFloor?: SandboxReadFloorKnob | undefined;
|
|
113
110
|
}): ExecutionEnvCapabilities;
|
|
114
111
|
export declare function capabilitiesFor(deployment: CapabilitiesDeployment): ExecutionEnvCapabilities | undefined;
|
|
@@ -119,21 +116,15 @@ export declare function capabilitiesFor(deployment: CapabilitiesDeployment): Exe
|
|
|
119
116
|
*/
|
|
120
117
|
export declare function laneSandboxReadFloorState(deployment: CapabilitiesDeployment): SandboxReadFloorState | undefined;
|
|
121
118
|
/**
|
|
122
|
-
*
|
|
123
|
-
*
|
|
119
|
+
* 车道全集 = settings-schema 词表正本的 `EXECUTION_LANE_WORDS`(冻结副本,次序逐字同;对账测试按它逐 lane 跑真判别式)。由正本派生、不手维护。
|
|
120
|
+
* 读者:{@link isExecutionLane} 的底座;配置目录 `REMOTE_EXEC` 行的 `enumValues`(**就用它本人**,身份相等有钉 —— [ref] 修过「目录手抄一份词表」的病);
|
|
121
|
+
* `multi-tenant-shared-lane` 拒启句的出路车道。`REMOTE_EXEC` 真能写下去的就是这些词 —— 7.147.0 起没有表外的状态名。
|
|
124
122
|
*/
|
|
125
123
|
export declare const ALL_EXECUTION_LANES: readonly ExecutionLane[];
|
|
126
124
|
/** 一个开放字符串是不是闭集里的词(不做前缀 / 大小写宽容)。 */
|
|
127
125
|
export declare function isExecutionLane(word: string): word is ExecutionLane;
|
|
128
|
-
/**
|
|
129
|
-
|
|
130
|
-
* 读者:配置目录 `REMOTE_EXEC` 行的 `enumValues`(**就用它本人**,身份相等有钉 —— [ref] 修过「目录手抄一份词表」的病)、
|
|
131
|
-
* [ref] 拒启句的 `valid:` 列表、`REQUIRE_EXECUTION_LANE` 拒启句的出路、`multi-tenant-shared-lane` 拒启句的出路车道。
|
|
132
|
-
* 7.114.0 起全仓唯一的车道词来源是正本;本常量只是它在本仓的那一个读口。
|
|
133
|
-
*/
|
|
134
|
-
export declare const REMOTE_EXEC_PROVIDER_WORDS: readonly RemoteExecProvider[];
|
|
135
|
-
/** 一条可声明车道在词表正本里的那一行(必需 / 可选 env 四栏 + 租户档)。加载期自检过完备性,所以对任何 {@link RemoteExecProvider} 都有行。 */
|
|
136
|
-
export declare function executionLaneRow(lane: RemoteExecProvider): ExecutionLaneRow;
|
|
126
|
+
/** 一条车道在词表正本里的那一行(必需 / 可选 env 四栏 + 租户档)。加载期自检过完备性,所以对任何 {@link ExecutionLane} 都有行。 */
|
|
127
|
+
export declare function executionLaneRow(lane: ExecutionLane): ExecutionLaneRow;
|
|
137
128
|
/**
|
|
138
129
|
* 一条车道**必需**的 env 键名 = 正本表行的 `requiredEnv ∪ requiredSecretEnv`(次序:非密坐标在前、密钥在后 —— 与 7.113.0 本仓手写表逐字同)。
|
|
139
130
|
* 读者:`config.ts` 的 [ref] 拒启门(点了名却缺件 ⇒ 点名缺哪几键)、部署面门(`test/deploy-lanes-contract.test.ts`:`lanes.json` 每行登记
|
|
@@ -141,7 +132,7 @@ export declare function executionLaneRow(lane: RemoteExecProvider): ExecutionLan
|
|
|
141
132
|
* 每条车道的必需键都在这一张表上、缺席都由下面的 {@link laneMissingEnv} 一只判官判 —— device 行也是(契约包 16.0.0 起 `requiredEnv: ["DEVICE_RELAY_URL"]`):缺席 / 空串 / 只含空白在 `declaredExecutionLane` 的必需 env 门被拒,
|
|
142
133
|
* 走到 `config.ts` 的设备入口解析器 `parseDeviceRelayUrlEnv` 时值一定在,它只判值的文法与凭据形。没有哪个必需键另有一臂缺席判官。
|
|
143
134
|
*/
|
|
144
|
-
export declare function laneRequiredEnv(lane:
|
|
135
|
+
export declare function laneRequiredEnv(lane: ExecutionLane): readonly string[];
|
|
145
136
|
/**
|
|
146
137
|
* 一个必需 env 的值**算不算缺**的唯一判官 —— 两半各有归属:
|
|
147
138
|
* · **空白半边**(空串、只含空白)归契约包:`isBlankCoordinate`(函数体住在 `execution-lanes` 叶模块,包根转口同一个函数对象)是这件事唯一的实现,契约包的写闸(车道声明保存时)问的是同一只函数,本仓不另抄一份;
|
|
@@ -155,70 +146,42 @@ export declare function isBlankRequiredEnvValue(value: string | undefined): bool
|
|
|
155
146
|
* 一条车道此刻**缺**的必需 env 键名(次序同 {@link laneRequiredEnv};「缺」的判官是 {@link isBlankRequiredEnvValue})。
|
|
156
147
|
* 读者:`config.ts` 的 [ref] 拒启门(非空 ⇒ 拒启并点名缺哪几键);判的是调用方交来的 env 快照,本函数不读 `process.env`。
|
|
157
148
|
*/
|
|
158
|
-
export declare function laneMissingEnv(lane:
|
|
159
|
-
/** {@link readDeclaredLaneTable}
|
|
149
|
+
export declare function laneMissingEnv(lane: ExecutionLane, env: Readonly<Record<string, string | undefined>>): readonly string[];
|
|
150
|
+
/** {@link readDeclaredLaneTable} 的答案:合法 ⇒ 有序车道表(非空;首项 = 缺省);不合法 ⇒ 拒句(点名每一条拒因)。 */
|
|
160
151
|
export type DeclaredLaneTableReading = {
|
|
161
|
-
readonly lanes: readonly [
|
|
152
|
+
readonly lanes: readonly [ExecutionLane, ...ExecutionLane[]];
|
|
162
153
|
} | {
|
|
163
154
|
readonly refusal: string;
|
|
164
155
|
};
|
|
165
156
|
/**
|
|
166
157
|
* `REMOTE_EXEC` 的**唯一读法** —— 部署声明的有序执行车道表。它是契约 `runtime.execution.lanes`(settings-schema 16.0.0 起是车道集)渲成 env 的形:
|
|
167
|
-
* `lanes.join(",")`,首项 = 缺省;单词 =
|
|
158
|
+
* `lanes.join(",")`,首项 = 缺省;单词 = 一元表。
|
|
168
159
|
*
|
|
169
|
-
*
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
*
|
|
173
|
-
* `
|
|
174
|
-
*
|
|
160
|
+
* **本函数只切段**(按逗号,不 trim、不折大小写 —— 渲染器不写空白,` k8s` 不是车道词);这张表合不合法只有一个答者:契约判官 `laneSetFlaws`
|
|
161
|
+
* (settings-schema 18.0.0;写闸、web-admin 表单与本函数问同一只)—— 非空、每段是不是车道词(空白段 / 不认识的词 / 车道值墓碑里的旧词)、一条车道至多一次、
|
|
162
|
+
* 独占车道(依据 `no-execution-target`,今天 = `none`)只能独成一集,全是它答;判官交回全部拒因,拒句逐条点名,以契约规则句 `LANE_SET_RULE` 收尾
|
|
163
|
+
* (车道词表与独占形从契约表派生,本仓不手抄)。墓碑词的那一条用契约的墓碑句(出路在源头给;车道文件 `provider` 读到同一个旧词时契约给的是同一句)。
|
|
164
|
+
* `in-process`(7.146.0 及更早的「没点名」状态名)不是车道词(判官答 `unknown`;拒句列合法词,含 `none`)。未设 / 空串**不是表**(没有声明 —— 调用方先判,本函数只收非空串)。
|
|
165
|
+
* 本引擎版本能服务几条车道、每条车道缺不缺必需键,是调用方的门。
|
|
175
166
|
*/
|
|
176
167
|
export declare function readDeclaredLaneTable(raw: string): DeclaredLaneTableReading;
|
|
177
168
|
/**
|
|
178
|
-
*
|
|
179
|
-
* `
|
|
180
|
-
*
|
|
181
|
-
*
|
|
182
|
-
* (点名 `REQUIRE_EXECUTION_LANE` / `REMOTE_EXEC` + 修法,用户在 stderr 读到的就是它);注册表条目另写了一句短的
|
|
183
|
-
* 「the deployment asked to refuse this state」,而它只在 `web-admin-client/stage-limits.ts` 的全表校验里被调 —— 候选视图只装
|
|
184
|
-
* `BATCH1_LIMIT_KEYS` 的限额键,带不上这两键 ⇒ 对本条恒 `next === live`,**那一句没有任何读者**(test 六个拒启格 stderr 里零命中)。
|
|
185
|
-
* 改一份另一份不跟。现形:boot 的 throw 与注册表条目的 `check` **都**调本函数 —— 一只判据、一句话,没有第二份文本可漂。
|
|
186
|
-
*
|
|
187
|
-
* 判据读**装配结果**(`executionLaneOf` = 全仓唯一的缺席归一读口,缺席 ⇒ `in-process`),不重判 env:`remoteExec` 缺席**就是**
|
|
188
|
-
* 「`REMOTE_EXEC` 未设/空串 ∧ `CONFIG_PROVIDER ≠ local`」这条三元链尾臂的落点;点了名却配不齐 / 认不出归 [ref] 那条既有拒启(两句话各说各的问题)。
|
|
189
|
-
*
|
|
190
|
-
* 句子的量词纪律([ref] ②):stub 车道上**手带族**(`wiring_manifest.tools.entries[].mountedBy === "hands"`)整族不挂,名册里其余工具
|
|
191
|
-
* 照常执行(test R1n:`Now` 真执行成功)—— 不写「零工具」;名册**总条数**随 core 版本走,不写进句子([ref] ③)。
|
|
192
|
-
*/
|
|
193
|
-
export declare function executionLaneRequiredRefusal(deployment: {
|
|
194
|
-
readonly requireExecutionLane: boolean;
|
|
195
|
-
readonly remoteExec?: ServiceConfigFlat["remoteExec"];
|
|
196
|
-
}): string | undefined;
|
|
197
|
-
/**
|
|
198
|
-
* `config.remoteExec?.provider` → 车道词。**全仓唯一**的缺席归一读口([ref] 门 D:`?? "in-process"` 只许住在这里,
|
|
199
|
-
* `?? "host"` 与 `lane === undefined || lane === "host"` 同义折零容忍)。
|
|
200
|
-
*
|
|
201
|
-
* · `undefined`(REMOTE_EXEC 未设)⇒ `"in-process"`,那是真车道不是缺席;
|
|
202
|
-
* · 认不出的词 ⇒ `undefined`,**调用方必须 fail-closed**(禁静默按某个默认车道处理)。生产链上这一臂
|
|
203
|
-
* 不可达:`loadConfig` 的 [ref] 拒启门先咬未知词;它存在是为了消费点自卫时有个响亮出口。
|
|
204
|
-
*
|
|
205
|
-
* 两个重载 = 类型收窄([ref] §2.2 A):喂**已装配的** config 形(`RemoteExecProvider | undefined`)⇒
|
|
206
|
-
* 返回型里没有 `undefined`,调用点不必为一条不可达的臂写兜底(兜底写多了就是下一处折词);喂开放字符串
|
|
207
|
-
* (测试、外部输入)⇒ 返回含 `undefined`,逼调用点表态。第一个重载的成立依据是**构造**的:
|
|
208
|
-
* `RemoteExecProvider` 是正本元组 `EXECUTION_LANE_WORDS` 的元素型,而 {@link isExecutionLane} 的集合正是由那只元组
|
|
209
|
-
* (加 `in-process`)建成 ⇒ 对 `RemoteExecProvider` 的每一个值 `isExecutionLane` 恒真(对账格逐词跑过)。
|
|
169
|
+
* 一个**开放字符串**(外部输入、手搓的部署形)→ 车道词;认不出 ⇒ `undefined`,**调用方必须 fail-closed**(禁静默按某个默认车道处理)。
|
|
170
|
+
* 没有缺席入参:「没声明车道」只在执行车道合成步判一次(拒启),合成之后的配置型上 `remoteExec` 必在、`provider` 就是车道词 ——
|
|
171
|
+
* 读已合成配置的消费点直读 `config.remoteExec.provider`,不经本函数、不写兜底(门 `test/execution-lane-fold-ban.test.ts`:任何读者都不许把缺席 /
|
|
172
|
+
* 认不出折成某条车道)。闭集重载喂车道词 ⇒ 返回型无 `undefined`(成立依据是**构造**的:{@link isExecutionLane} 的集合就是由正本元组建成)。
|
|
210
173
|
*/
|
|
211
|
-
export declare function executionLaneOf(provider:
|
|
212
|
-
export declare function executionLaneOf(provider: string
|
|
174
|
+
export declare function executionLaneOf(provider: ExecutionLane): ExecutionLane;
|
|
175
|
+
export declare function executionLaneOf(provider: string): ExecutionLane | undefined;
|
|
213
176
|
/**
|
|
214
|
-
* 本部署声明的**有序执行车道表**(首项 = 缺省 = 服务车道)的唯一读法。本版 `REMOTE_EXEC` 单值 ⇒ 一元表 `[
|
|
177
|
+
* 本部署声明的**有序执行车道表**(首项 = 缺省 = 服务车道)的唯一读法。本版 `REMOTE_EXEC` 单值 ⇒ 一元表 `[provider]`;
|
|
215
178
|
* 车道表配置面落地时只改这一只。读者:执行放置切换的回填(一次性迁移 M32 与它的 DDL 前探针 —— 回填只在一元表下有唯一答案)。
|
|
216
179
|
*/
|
|
217
180
|
export declare function deployedExecutionLanes(config: Pick<ServiceConfigFlat, "remoteExec">): readonly ExecutionLane[];
|
|
218
181
|
/**
|
|
219
182
|
* 「这条车道的**手**就在本 worker 的盘上吗」= 块 `io ∧ hostLocalPaths`(读 {@link capabilitiesFor} 的块,不手抄)。今天只有 `host` 两键同真。
|
|
220
183
|
*
|
|
221
|
-
* 🔴 **只读 `hostLocalPaths` 是错的**:`
|
|
184
|
+
* 🔴 **只读 `hostLocalPaths` 是错的**:`none` 的桩块那一键是 true(进程内读确实在本机盘上),而它**没有手**(`io: false`)——
|
|
222
185
|
* 只读一键会让无手部署**继续**挂 SendUserFile,与「无手不挂」的意图相反。
|
|
223
186
|
*
|
|
224
187
|
* 读者问的都是这一句,**同一只函数**,不许各写一份 `=== "host"`:
|
|
@@ -234,7 +197,7 @@ export declare function handsOnWorkerFilePlane(lane: ExecutionLane): boolean;
|
|
|
234
197
|
* **一条律**:LSP 只在本谓词为真的车道挂(`boot/execution-env.ts` 的 LSP 管理器两臂都合取它;表的 `lsp` 位与之同向,
|
|
235
198
|
* 对拍钉 `test/host-env-open-bound.test.ts`:本谓词 ⟺ 适配器类原型上有 `openBound`)。
|
|
236
199
|
* · `host` —— `RemoteHostExecutionEnv.openBound` 委托 core `NodeExecutionEnv` 的实现(唯一属主),真;
|
|
237
|
-
* · `
|
|
200
|
+
* · `none` —— 没有手(执行环境两座都不给),无物可绑;
|
|
238
201
|
* · 其余车道(沙箱 / 远端 shell / 设备)—— 读走 exec / sftp / 设备协议,本版不实现绑定读,假。实现之日翻这一格,LSP 沙箱桥随之回来。
|
|
239
202
|
* 穷举 switch、无 default 臂:车道加词而此处不表态 = 编译红。
|
|
240
203
|
*/
|
|
@@ -247,7 +210,7 @@ export declare function laneBindsReads(lane: ExecutionLane): boolean;
|
|
|
247
210
|
* · `host` —— 命令是本进程的子进程,子进程拿到的 `HOME` 由适配器自己组合(继承面 + 会话 `settings.env` 授予),不 spawn 就读得出,真;
|
|
248
211
|
* · `device` —— 设备协议(hello / 指令集)没有家目录读数:读它要么走协议新增一格(协议对端在别仓),要么往员工自己的机器上多跑一条未经策略门的命令,都不是本函数能替它定的,假
|
|
249
212
|
* (声明就是座,起服披露「来自声明、未实测」,见 {@link buildLaneHomeBootNote});
|
|
250
|
-
* · `
|
|
213
|
+
* · `none` —— 没有手,无环境可读,假。
|
|
251
214
|
* 穷举 switch、无 default 臂:车道加词而此处不表态 = 编译红。对拍钉:读得出 ⟺ 该车道的适配器源码恰持一只座(`test/lane-home-claim-verified.test.ts`)。
|
|
252
215
|
*/
|
|
253
216
|
export declare function laneMeasuresHome(lane: ExecutionLane): boolean;
|
|
@@ -257,7 +220,7 @@ export type LaneReadFaceDefault = "open" | "roots";
|
|
|
257
220
|
* [ref](clay 裁 [ref])—— **车道行显式声明读面缺省 `readFaceDefault`**:`READ_FACE` 没人表态时,这条车道自己的执行体该不该读面放开。
|
|
258
221
|
* · `open` —— 隔离型车道(`e2b` / `k8s` / `local-docker`:每任务一只沙箱,OS 级隔离边界,`tenantSeparationBasis === "isolation"`):沙箱内部就是模型的整个世界,
|
|
259
222
|
* 读面缺省放开(`auto` 连续干活不再每碰一个根外路径就出卡;写面 / deny 表 / 审批模式不受影响)。
|
|
260
|
-
* · `roots` —— 其余车道(`host` / `
|
|
223
|
+
* · `roots` —— 其余车道(`host` / `none` / `ssh` / `adb` / `device`):车道本身不给读面任何放开的理由 —— 手落在一台真机 / 共享目标 / 员工设备上。
|
|
261
224
|
* **`roots` 不是「钉死 roots」**:它的意思是「本车道不替运维声明缺省」,缺省回到既有的 posture 派生(单用户 turnkey ⇒ `open`〔来源 `posture`〕;多租户 ⇒ 引擎默认 `roots`),
|
|
262
225
|
* 这些车道上的读面一个字节不变。优先序见 `posture-source.ts`(`env` > `center` > `lane` > `posture` > `engine-default`)。
|
|
263
226
|
*
|
|
@@ -273,12 +236,12 @@ export declare const LANE_OPEN_READ_FACE_CAUTION = "a deployment that mounts hos
|
|
|
273
236
|
* `remote_exec_real_system` 那一行、`config.d/remote-exec.json` 抢占披露的「隔离降级」判、wire `executionLane.isolated` + 诊断面同位、那一行 note 列的沙箱出路、
|
|
274
237
|
* 部署面 `lanes.json` 的 `isolation` 列。
|
|
275
238
|
* ⚠️ 口径 = **OS 级边界**(容器即算),**不是**「独立内核」强度 —— 那是部署形表行 `vmIsolatedHands`(A 值路由读它),不是本函数的第二份。
|
|
276
|
-
* ⚠️ 本函数对 `
|
|
239
|
+
* ⚠️ 本函数对 `none` 也答(桩块 false)—— 那一格是「表」的完整性,不是 wire 的说法:无手部署**没有执行边界可言**,wire 上 `executionLane.isolated`
|
|
277
240
|
* 按 present-iff 缺席(`capabilities/execution-lane.ts`),不是 false。
|
|
278
241
|
*/
|
|
279
242
|
export declare function laneIsolated(lane: ExecutionLane): boolean;
|
|
280
243
|
/**
|
|
281
|
-
* 这条车道**有没有手**(块 `io`:文件与 shell 两面真到达目标;`
|
|
244
|
+
* 这条车道**有没有手**(块 `io`:文件与 shell 两面真到达目标;`none` 的桩块 false)的唯一布尔口。读者四处:路由的「有没有执行环境」(`boot/resolve-spec.ts`)、
|
|
282
245
|
* wire `executionLane.isolated` 的在场判据(`capabilities/execution-lane.ts`)、场景详情的附件供给集(`boot/stage-07-capability-layer.ts` 把它填进
|
|
283
246
|
* `ScenarioDeps.handsLane`:「这一 run 有没有工作区」的车道半场)、起服家目录那一行({@link buildLaneHomeBootNote})—— 同读这一只。
|
|
284
247
|
*/
|
|
@@ -316,9 +279,9 @@ export declare const PLANNED_LANE_DIVERGENCES: readonly PlannedLaneDivergence[];
|
|
|
316
279
|
export declare const E2B_SANDBOX_HOME = "/home/user";
|
|
317
280
|
/** {@link executionLaneHomeDir} 读的那两位部署配置(`ServiceConfig` 结构上满足)。 */
|
|
318
281
|
export interface LaneHomeDeployment {
|
|
319
|
-
readonly remoteExec
|
|
320
|
-
readonly provider:
|
|
321
|
-
}
|
|
282
|
+
readonly remoteExec: {
|
|
283
|
+
readonly provider: ExecutionLane;
|
|
284
|
+
};
|
|
322
285
|
/** `REMOTE_EXEC_HOME_DIR` —— 运维显式声明的执行环境 home(绝对路径;坏值在 config 层拒启)。 */
|
|
323
286
|
readonly remoteExecHomeDir?: string | undefined;
|
|
324
287
|
}
|
|
@@ -344,8 +307,8 @@ export interface LaneHomeDeployment {
|
|
|
344
307
|
* ## 一条规则,不是七条特判
|
|
345
308
|
* **运维显式声明恒赢**(`REMOTE_EXEC_HOME_DIR`,部署级旋钮,不挂任何客户端表态);没有声明时,
|
|
346
309
|
* 只有「home 是**车道本身**的属性」的那几条车道才有答案:
|
|
347
|
-
* · `host`
|
|
348
|
-
* (core 自己的 `NodeExecutionEnv` 同判);
|
|
310
|
+
* · `host` —— 命令就跑在本进程这台机器、这个用户下,`os.homedir()` 读的就是它
|
|
311
|
+
* (core 自己的 `NodeExecutionEnv` 同判);`none` 没有手,同答本进程用户的 home(只作 `~/` 规则的基);
|
|
349
312
|
* · `e2b` —— 平台固定用户,见 {@link E2B_SANDBOX_HOME};
|
|
350
313
|
* · `k8s` / `local-docker` —— home 是**镜像**的属性,boot 期无从得知;
|
|
351
314
|
* · `ssh` —— home 是**目标机上那个登录用户**的属性(root 是 `/root`、macOS 是 `/Users/<u>`),
|
|
@@ -369,7 +332,7 @@ export declare function buildLaneHomeClaim(deployment: LaneHomeDeployment): Pick
|
|
|
369
332
|
/**
|
|
370
333
|
* 起服关于本部署执行环境家目录的那一行(纯数据 ⇒ `build*`):`{ event, note }`,或 `undefined`(不出这一行)。只有**读不了**家目录的车道才由起服说 ——
|
|
371
334
|
* 读得出的车道({@link laneMeasuresHome})在每只环境开起来时自己证 / 自己量,出问题由那只环境说(拒,或同一只 `execution_lane_home_undeclared`)。
|
|
372
|
-
* · 无手(
|
|
335
|
+
* · 无手(none)⇒ 不出;
|
|
373
336
|
* · 读不了 ∧ 没有答案 ⇒ `execution_lane_home_undeclared`:代价如实(引擎 7.52.0 起家锚拒读行放不下 ⇒ 每一次泄内容的递归读在全 shell 面强制问人、只读面拒;
|
|
374
337
|
* `~/` 形规则下单 422),出路 = 声明家目录;
|
|
375
338
|
* · 读不了 ∧ 声明了 ⇒ `execution_lane_home_unmeasured`:座 = 声明、没有读数证过它 —— 对不上时规则守错目录,运维要守住「声明 = 环境里命令看到的 `$HOME`」。
|
|
@@ -382,7 +345,7 @@ export declare function buildLaneHomeBootNote(deployment: LaneHomeDeployment): {
|
|
|
382
345
|
} | undefined;
|
|
383
346
|
/**
|
|
384
347
|
* 「部署要求读拒表的字节地板(`READ_DENY_FLOOR_REQUIRED=true`),而本部署车道的执行环境块不守地板」时起服那一行的 `note`(纯字符串 ⇒ `build*`);否则 `undefined`。
|
|
385
|
-
* 判据只读部署的要求与 {@link capabilitiesFor} 的 `keepsReadFloor`(认不出的车道答不出块 ⇒ 按不守说,不静默)。`
|
|
348
|
+
* 判据只读部署的要求与 {@link capabilitiesFor} 的 `keepsReadFloor`(认不出的车道答不出块 ⇒ 按不守说,不静默)。`none` 的桩块守地板 ⇒ 不出。
|
|
386
349
|
* 句子点名车道与键:这条车道上每个读拒表有行的 run(出厂读拒档在岗时就有行)都在准备期拒,一个命令都不起 —— 起服先把后果与两条出路说出来,
|
|
387
350
|
* 不让运维从第一条 409 才知道。
|
|
388
351
|
*/
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { homedir } from "node:os";
|
|
2
2
|
import { StubExecutionEnv } from "@sema-agent/core";
|
|
3
|
-
import { EXECUTION_LANE_WORDS as DECLARABLE_LANE_WORDS, EXECUTION_LANES, isBlankCoordinate, retiredLaneWordRefusal } from "@sema-agent/settings-schema/execution-lanes";
|
|
3
|
+
import { EXECUTION_LANE_WORDS as DECLARABLE_LANE_WORDS, EXECUTION_LANES, LANE_SET_RULE, isBlankCoordinate, laneSetFlaws, retiredLaneWordRefusal } from "@sema-agent/settings-schema/execution-lanes";
|
|
4
4
|
import { DECLARE_HOME_REMEDY, LANE_HOME_UNDECLARED_EVENT, LANE_HOME_UNMEASURED_EVENT, buildHomeAbsentNote, buildHomeUnmeasuredNote } from "./lane-home-probe.js";
|
|
5
5
|
const NO = "unsupported";
|
|
6
6
|
const YES = "supported";
|
|
7
7
|
const SU = "single-user-only";
|
|
8
8
|
export function executionLaneCaps(lane) {
|
|
9
9
|
switch (lane) {
|
|
10
|
-
case "
|
|
10
|
+
case "none":
|
|
11
11
|
return {
|
|
12
12
|
callerCwd: NO,
|
|
13
13
|
backgroundShell: NO,
|
|
@@ -16,7 +16,7 @@ export function executionLaneCaps(lane) {
|
|
|
16
16
|
sandboxSendUserFile: NO,
|
|
17
17
|
remoteScratchpad: NO,
|
|
18
18
|
worktreeIsolation: NO,
|
|
19
|
-
tenantSeparation:
|
|
19
|
+
tenantSeparation: executionLaneRow(lane).tenantSeparation,
|
|
20
20
|
};
|
|
21
21
|
case "host":
|
|
22
22
|
return {
|
|
@@ -119,7 +119,7 @@ export function sandboxReadFloorState(lane, knob) {
|
|
|
119
119
|
return readFloorStateOf(k, false);
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
|
-
const
|
|
122
|
+
const NONE_BLOCK = new StubExecutionEnv().capabilities;
|
|
123
123
|
const HOST_BLOCK = Object.freeze({ isolation: false, suspendable: false, sharesProcessTable: true, canonicalPathAuthoritative: true, hostLocalPaths: true, externalContentTarget: false, io: true, keepsReadFloor: false });
|
|
124
124
|
const E2B_SHAPE = Object.freeze({ isolation: true, suspendable: true, sharesProcessTable: false, canonicalPathAuthoritative: true, hostLocalPaths: false, externalContentTarget: false, io: true });
|
|
125
125
|
const K8S_SHAPE = Object.freeze({ isolation: true, suspendable: false, sharesProcessTable: false, canonicalPathAuthoritative: true, hostLocalPaths: false, externalContentTarget: false, io: true });
|
|
@@ -144,8 +144,8 @@ const DEVICE_BLOCK = Object.freeze({ isolation: false, suspendable: false, share
|
|
|
144
144
|
const NO_SUB_KNOBS = Object.freeze({ snapshotStore: false, sandboxReadFloor: undefined });
|
|
145
145
|
function laneBlock(lane, sub) {
|
|
146
146
|
switch (lane) {
|
|
147
|
-
case "
|
|
148
|
-
return
|
|
147
|
+
case "none":
|
|
148
|
+
return NONE_BLOCK;
|
|
149
149
|
case "host":
|
|
150
150
|
return HOST_BLOCK;
|
|
151
151
|
case "e2b":
|
|
@@ -161,13 +161,13 @@ function laneBlock(lane, sub) {
|
|
|
161
161
|
}
|
|
162
162
|
}
|
|
163
163
|
export function capabilitiesFor(deployment) {
|
|
164
|
-
const lane = executionLaneOf(deployment.remoteExec
|
|
164
|
+
const lane = executionLaneOf(deployment.remoteExec.provider);
|
|
165
165
|
if (lane === undefined)
|
|
166
166
|
return undefined;
|
|
167
|
-
return laneBlock(lane, { snapshotStore: lane === "k8s" && Boolean(deployment.remoteExec
|
|
167
|
+
return laneBlock(lane, { snapshotStore: lane === "k8s" && Boolean(deployment.remoteExec.s3Snapshot), sandboxReadFloor: deployment.sandboxReadFloor });
|
|
168
168
|
}
|
|
169
169
|
export function laneSandboxReadFloorState(deployment) {
|
|
170
|
-
const lane = executionLaneOf(deployment.remoteExec
|
|
170
|
+
const lane = executionLaneOf(deployment.remoteExec.provider);
|
|
171
171
|
if (lane === undefined)
|
|
172
172
|
return undefined;
|
|
173
173
|
switch (lane) {
|
|
@@ -175,7 +175,7 @@ export function laneSandboxReadFloorState(deployment) {
|
|
|
175
175
|
case "k8s":
|
|
176
176
|
case "local-docker":
|
|
177
177
|
return sandboxReadFloorState(lane, deployment.sandboxReadFloor);
|
|
178
|
-
case "
|
|
178
|
+
case "none":
|
|
179
179
|
case "host":
|
|
180
180
|
case "ssh":
|
|
181
181
|
case "adb":
|
|
@@ -183,12 +183,11 @@ export function laneSandboxReadFloorState(deployment) {
|
|
|
183
183
|
return undefined;
|
|
184
184
|
}
|
|
185
185
|
}
|
|
186
|
-
export const ALL_EXECUTION_LANES = Object.freeze([
|
|
186
|
+
export const ALL_EXECUTION_LANES = Object.freeze([...DECLARABLE_LANE_WORDS]);
|
|
187
187
|
const EXECUTION_LANE_SET = new Set(ALL_EXECUTION_LANES);
|
|
188
188
|
export function isExecutionLane(word) {
|
|
189
189
|
return EXECUTION_LANE_SET.has(word);
|
|
190
190
|
}
|
|
191
|
-
export const REMOTE_EXEC_PROVIDER_WORDS = Object.freeze([...DECLARABLE_LANE_WORDS]);
|
|
192
191
|
const LANE_ROWS = (() => {
|
|
193
192
|
const rows = new Map();
|
|
194
193
|
for (const row of EXECUTION_LANES) {
|
|
@@ -217,53 +216,48 @@ export function isBlankRequiredEnvValue(value) {
|
|
|
217
216
|
export function laneMissingEnv(lane, env) {
|
|
218
217
|
return laneRequiredEnv(lane).filter((name) => isBlankRequiredEnvValue(env[name]));
|
|
219
218
|
}
|
|
219
|
+
const LANE_ROW_OF_WORD = LANE_ROWS;
|
|
220
|
+
function laneSetFlawPhrase(flaw) {
|
|
221
|
+
switch (flaw.kind) {
|
|
222
|
+
case "empty_set":
|
|
223
|
+
return "it has no entries";
|
|
224
|
+
case "blank_entry":
|
|
225
|
+
return `entry ${flaw.at + 1} is empty or whitespace-only`;
|
|
226
|
+
case "unknown":
|
|
227
|
+
return `"${String(flaw.word)}" (entry ${flaw.at + 1}) is not an execution lane`;
|
|
228
|
+
case "retired":
|
|
229
|
+
return retiredLaneWordRefusal(flaw.word) ?? `"${flaw.word}" (entry ${flaw.at + 1}) is a retired execution lane`;
|
|
230
|
+
case "duplicate":
|
|
231
|
+
return `"${flaw.lane}" is listed twice (again at entry ${flaw.at + 1})`;
|
|
232
|
+
case "not_alone":
|
|
233
|
+
return `"${flaw.lane}" (no execution environment for the agent's tools) must be the only entry`;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
220
236
|
export function readDeclaredLaneTable(raw) {
|
|
221
237
|
const segments = raw.split(",");
|
|
222
|
-
const
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
const retired = lane === undefined ? retiredLaneWordRefusal(segment) : undefined;
|
|
229
|
-
if (retired !== undefined)
|
|
230
|
-
return { refusal: `REMOTE_EXEC="${raw}": ${retired}.` };
|
|
231
|
-
if (lane === undefined) {
|
|
232
|
-
return {
|
|
233
|
-
refusal: `REMOTE_EXEC="${raw}"${segments.length > 1 ? ` lists "${segment}", which` : ""} is not an execution lane — valid: ${REMOTE_EXEC_PROVIDER_WORDS.join(" | ")}. ` +
|
|
234
|
-
`An unrecognized value used to fall through to the host/in-process lane silently; refusing to start instead (#157).`,
|
|
235
|
-
};
|
|
236
|
-
}
|
|
237
|
-
if (lanes.includes(lane))
|
|
238
|
-
return { refusal: `REMOTE_EXEC="${raw}" lists "${lane}" twice — each execution lane appears once (the first one is the default).` };
|
|
239
|
-
lanes.push(lane);
|
|
238
|
+
const flaws = laneSetFlaws(segments);
|
|
239
|
+
if (flaws.length > 0) {
|
|
240
|
+
return {
|
|
241
|
+
refusal: `REMOTE_EXEC="${raw}" is not a valid execution lane set: ${flaws.map(laneSetFlawPhrase).join("; ")}. ` +
|
|
242
|
+
`REMOTE_EXEC (the lane set, comma-separated) ${LANE_SET_RULE}. Refusing to start rather than guessing a lane (#157).`,
|
|
243
|
+
};
|
|
240
244
|
}
|
|
245
|
+
const lanes = segments.map((segment) => {
|
|
246
|
+
const row = LANE_ROW_OF_WORD.get(segment);
|
|
247
|
+
if (row === undefined)
|
|
248
|
+
throw new Error(`readDeclaredLaneTable: the lane-set judge accepted "${segment}" but the lane table has no row for it`);
|
|
249
|
+
return row.lane;
|
|
250
|
+
});
|
|
241
251
|
const [first, ...rest] = lanes;
|
|
242
252
|
if (first === undefined)
|
|
243
253
|
throw new Error(`readDeclaredLaneTable: "${raw}" split into no segments`);
|
|
244
254
|
return { lanes: [first, ...rest] };
|
|
245
255
|
}
|
|
246
|
-
export function executionLaneRequiredRefusal(deployment) {
|
|
247
|
-
if (!deployment.requireExecutionLane || executionLaneOf(deployment.remoteExec?.provider) !== "in-process")
|
|
248
|
-
return undefined;
|
|
249
|
-
return (`REQUIRE_EXECUTION_LANE=true but NO execution lane is named on this deployment — refusing to start. ` +
|
|
250
|
-
`With no lane the engine falls back to its in-process stub environment: the hands band (the roster entries whose ` +
|
|
251
|
-
`wiring_manifest mountedBy is "hands", Bash among them) is not mounted, while the rest of the roster still executes, ` +
|
|
252
|
-
`and every task still returns status=completed — for any request that needs a hand, indistinguishable from "the model ` +
|
|
253
|
-
`chose not to use its tools". (How much of the roster is mounted is a per-run fact: read the wiring_manifest event and ` +
|
|
254
|
-
`count entries whose mountedBy is "hands" — never judge by tool names.) ` +
|
|
255
|
-
`Cause: REMOTE_EXEC is unset/empty AND CONFIG_PROVIDER is not "local". ` +
|
|
256
|
-
`Fix: set REMOTE_EXEC to one of ${REMOTE_EXEC_PROVIDER_WORDS.join(" | ")} (and that lane's required env), ` +
|
|
257
|
-
`or set CONFIG_PROVIDER=local to take the single-machine \`host\` default, ` +
|
|
258
|
-
`or unset REQUIRE_EXECUTION_LANE to keep running without hands on purpose.`);
|
|
259
|
-
}
|
|
260
256
|
export function executionLaneOf(provider) {
|
|
261
|
-
if (provider === undefined)
|
|
262
|
-
return "in-process";
|
|
263
257
|
return isExecutionLane(provider) ? provider : undefined;
|
|
264
258
|
}
|
|
265
259
|
export function deployedExecutionLanes(config) {
|
|
266
|
-
return [
|
|
260
|
+
return [config.remoteExec.provider];
|
|
267
261
|
}
|
|
268
262
|
export function handsOnWorkerFilePlane(lane) {
|
|
269
263
|
const block = laneBlock(lane, NO_SUB_KNOBS);
|
|
@@ -273,7 +267,7 @@ export function laneBindsReads(lane) {
|
|
|
273
267
|
switch (lane) {
|
|
274
268
|
case "host":
|
|
275
269
|
return true;
|
|
276
|
-
case "
|
|
270
|
+
case "none":
|
|
277
271
|
case "e2b":
|
|
278
272
|
case "k8s":
|
|
279
273
|
case "ssh":
|
|
@@ -293,7 +287,7 @@ export function laneMeasuresHome(lane) {
|
|
|
293
287
|
case "host":
|
|
294
288
|
return true;
|
|
295
289
|
case "device":
|
|
296
|
-
case "
|
|
290
|
+
case "none":
|
|
297
291
|
return false;
|
|
298
292
|
}
|
|
299
293
|
}
|
|
@@ -304,7 +298,7 @@ export function laneReadFaceDefault(lane) {
|
|
|
304
298
|
case "local-docker":
|
|
305
299
|
return "open";
|
|
306
300
|
case "host":
|
|
307
|
-
case "
|
|
301
|
+
case "none":
|
|
308
302
|
case "ssh":
|
|
309
303
|
case "adb":
|
|
310
304
|
case "device":
|
|
@@ -324,11 +318,8 @@ export function executionLaneHomeDir(deployment) {
|
|
|
324
318
|
const declared = deployment.remoteExecHomeDir;
|
|
325
319
|
if (declared !== undefined)
|
|
326
320
|
return declared;
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
return undefined;
|
|
330
|
-
switch (lane) {
|
|
331
|
-
case "in-process":
|
|
321
|
+
switch (deployment.remoteExec.provider) {
|
|
322
|
+
case "none":
|
|
332
323
|
case "host":
|
|
333
324
|
return homedir();
|
|
334
325
|
case "e2b":
|
|
@@ -348,23 +339,22 @@ export function buildLaneHomeClaim(deployment) {
|
|
|
348
339
|
return { homeDir: home, homeDirSource: deployment.remoteExecHomeDir !== undefined ? "declared" : "lane" };
|
|
349
340
|
}
|
|
350
341
|
export function buildLaneHomeBootNote(deployment) {
|
|
351
|
-
const
|
|
352
|
-
if (
|
|
342
|
+
const homeLane = deployment.remoteExec.provider;
|
|
343
|
+
if (!laneWiresExecutionEnv(homeLane))
|
|
353
344
|
return undefined;
|
|
354
|
-
if (laneMeasuresHome(
|
|
345
|
+
if (laneMeasuresHome(homeLane))
|
|
355
346
|
return undefined;
|
|
356
347
|
const home = executionLaneHomeDir(deployment);
|
|
357
348
|
if (home === undefined)
|
|
358
|
-
return { event: LANE_HOME_UNDECLARED_EVENT, note: buildHomeAbsentNote(
|
|
359
|
-
return { event: LANE_HOME_UNMEASURED_EVENT, note: buildHomeUnmeasuredNote(
|
|
349
|
+
return { event: LANE_HOME_UNDECLARED_EVENT, note: buildHomeAbsentNote(homeLane, "REMOTE_EXEC_HOME_DIR is unset, and this lane cannot read its execution environment's home", DECLARE_HOME_REMEDY) };
|
|
350
|
+
return { event: LANE_HOME_UNMEASURED_EVENT, note: buildHomeUnmeasuredNote(homeLane, home) };
|
|
360
351
|
}
|
|
361
352
|
export function buildReadDenyFloorUnkeptNote(deployment) {
|
|
362
353
|
if (!deployment.readDenyFloorRequired)
|
|
363
354
|
return undefined;
|
|
364
355
|
if (capabilitiesFor(deployment)?.keepsReadFloor === true)
|
|
365
356
|
return undefined;
|
|
366
|
-
|
|
367
|
-
return (`READ_DENY_FLOOR_REQUIRED=true, but the "${lane}" execution lane does not keep the read-deny byte floor (a program its commands run can open a path ` +
|
|
357
|
+
return (`READ_DENY_FLOOR_REQUIRED=true, but the "${deployment.remoteExec.provider}" execution lane does not keep the read-deny byte floor (a program its commands run can open a path ` +
|
|
368
358
|
`the read-deny table refuses). Every run whose read-deny table has rows — the shipped default tiers put rows there unless READ_DENY_BUILTIN_TIERS=none — ` +
|
|
369
359
|
`is refused before any command starts (config.read_deny_floor_unkept; a synchronous submit answers 409). ` +
|
|
370
360
|
`Either run on a lane that keeps the floor, or unset READ_DENY_FLOOR_REQUIRED to run with one operator notice per run instead.`);
|