@sema-agent/server 7.145.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 +876 -0
- package/README.md +1 -1
- package/README.zh-CN.md +1 -1
- package/USAGE.md +374 -99
- package/deploy/facts/CHANGES.json +25 -0
- package/deploy/facts/README.md +57 -0
- package/deploy/facts/lanes.json +61 -0
- package/deploy/facts/lanes.schema.json +57 -0
- package/deploy/facts/sandbox-rbac.json +113 -0
- package/deploy/facts/sandbox-rbac.schema.json +74 -0
- package/deploy/facts/sealed-key.json +9 -0
- package/deploy/facts/sealed-key.schema.json +52 -0
- package/deploy/sema-up/README.md +2 -2
- package/deploy/sema-up/chart/templates/_helpers.tpl +41 -0
- package/deploy/sema-up/chart/templates/sandbox-rbac.yaml +47 -7
- package/deploy/sema-up/chart/templates/server-v4pro.yaml +9 -4
- package/deploy/sema-up/chart/templates/server.yaml +9 -4
- package/deploy/sema-up/chart/values.yaml +8 -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 +34 -17
- package/dist/adoption/import-limits.d.ts +6 -0
- package/dist/adoption/import-limits.js +7 -0
- package/dist/adoption/import.d.ts +62 -0
- package/dist/adoption/import.js +107 -0
- package/dist/adoption/wire.d.ts +52 -0
- package/dist/adoption/wire.js +9 -0
- package/dist/approval-ask-machine.d.ts +2 -2
- package/dist/approval-card.d.ts +7 -16
- package/dist/approval-card.js +0 -4
- package/dist/approval-gate-currency.d.ts +1 -1
- package/dist/approval-gate-currency.js +1 -1
- package/dist/approval-reconciler.d.ts +1 -1
- 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/deployment-mods.d.ts +11 -1
- package/dist/boot/deployment-mods.js +15 -2
- package/dist/boot/device-lane.js +7 -5
- package/dist/boot/engine-lease.d.ts +195 -22
- package/dist/boot/engine-lease.js +146 -20
- package/dist/boot/execution-env.d.ts +5 -0
- package/dist/boot/execution-env.js +57 -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 +50 -0
- package/dist/boot/exit-boundary.js +32 -0
- package/dist/boot/exit-last.d.ts +20 -4
- package/dist/boot/exit-last.js +23 -5
- package/dist/boot/governance-seams.d.ts +2 -2
- package/dist/boot/governance-seams.js +1 -0
- 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 +42 -41
- package/dist/boot/memory-consolidation.js +26 -28
- 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.d.ts +12 -4
- package/dist/boot/reapers.js +40 -16
- package/dist/boot/resolve-spec.d.ts +2 -0
- package/dist/boot/resolve-spec.js +126 -123
- package/dist/boot/retention-lane.d.ts +4 -42
- package/dist/boot/runner-deps.js +1 -1
- package/dist/boot/session-faces.d.ts +1 -0
- package/dist/boot/session-faces.js +11 -3
- package/dist/boot/shutdown.js +27 -9
- package/dist/boot/stage-01-config.d.ts +1 -1
- package/dist/boot/stage-01-config.js +7 -3
- 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 +2 -1
- package/dist/boot/stage-03-store-backend.js +2 -2
- package/dist/boot/stage-04-stores.d.ts +2 -1
- package/dist/boot/stage-05-execution-env.d.ts +4 -1
- package/dist/boot/stage-05-execution-env.js +6 -6
- package/dist/boot/stage-06-runners.d.ts +5 -2
- package/dist/boot/stage-06-runners.js +12 -13
- package/dist/boot/stage-07-capability-layer.d.ts +5 -2
- package/dist/boot/stage-07-capability-layer.js +7 -7
- package/dist/boot/stage-08-reapers.d.ts +5 -2
- package/dist/boot/stage-08-reapers.js +3 -3
- package/dist/boot/stage-09-leader.d.ts +6 -2
- package/dist/boot/stage-10-http-server.d.ts +6 -2
- package/dist/boot/stage-10-http-server.js +5 -3
- package/dist/boot/stores.d.ts +10 -0
- package/dist/boot/stores.js +53 -26
- package/dist/boot/web-admin.js +3 -3
- package/dist/boot/workflow-orchestration.d.ts +1 -1
- package/dist/boot/workflow-orchestration.js +2 -1
- package/dist/capabilities/center-plugins.d.ts +2 -0
- package/dist/capabilities/center-plugins.js +6 -2
- package/dist/capabilities/composite-members.d.ts +4 -1
- package/dist/capabilities/composite-members.js +4 -1
- 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 +34 -20
- 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 +56 -1
- package/dist/capability-facts.js +59 -8
- package/dist/center-credential-renewer.js +3 -2
- package/dist/checkpoint-ctx-seal-m28.d.ts +1 -1
- package/dist/config-catalog.js +19 -9
- 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.d.ts +2 -2
- package/dist/config-provider.js +2 -0
- package/dist/config-types.d.ts +228 -185
- package/dist/config.d.ts +74 -6
- package/dist/config.js +146 -64
- package/dist/degenerate-instrument.js +1 -1
- package/dist/deleted-session-ids.d.ts +19 -0
- package/dist/deleted-session-ids.js +26 -0
- package/dist/deploy-facts.d.ts +155 -0
- package/dist/deploy-facts.js +95 -0
- package/dist/deployment-shape.d.ts +21 -12
- package/dist/deployment-shape.js +24 -6
- package/dist/device-ws-hub.d.ts +48 -3
- package/dist/device-ws-hub.js +48 -2
- package/dist/env-facts.d.ts +7 -5
- package/dist/env-facts.js +10 -6
- package/dist/error-code-family.d.ts +35 -0
- package/dist/error-code-family.js +26 -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 +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 +46 -3
- package/dist/fleet/drain-entry.js +6 -0
- package/dist/fleet/fleet-bus.d.ts +2 -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/branch-transcript.d.ts +1 -1
- package/dist/hooks/branch-transcript.js +1 -0
- package/dist/hooks/classic-stations.d.ts +25 -8
- package/dist/hooks/classic-stations.js +29 -3
- package/dist/hooks/command-spawn.d.ts +1 -4
- package/dist/hooks/command-spawn.js +0 -11
- package/dist/hooks/hook-runner.d.ts +85 -24
- package/dist/hooks/hook-runner.js +326 -109
- package/dist/hooks/hook-source.d.ts +14 -2
- package/dist/hooks/hook-source.js +8 -0
- package/dist/http/active-run-conflict.d.ts +1 -1
- package/dist/http/active-run-conflict.js +1 -1
- package/dist/http/admission.js +11 -1
- package/dist/http/approval-sweeps.d.ts +2 -5
- package/dist/http/approval-sweeps.js +3 -2
- package/dist/http/checkpoint-ctx.d.ts +76 -71
- package/dist/http/checkpoint-ctx.js +40 -40
- package/dist/http/claim-latency.d.ts +10 -0
- package/dist/http/claim-latency.js +12 -0
- package/dist/http/dispatch.js +19 -3
- package/dist/http/durable-run-leg.d.ts +5 -0
- package/dist/http/durable-run-leg.js +3 -1
- package/dist/http/execution-context.d.ts +7 -1
- package/dist/http/execution-context.js +13 -0
- package/dist/http/health-self-report.d.ts +6 -2
- package/dist/http/health-self-report.js +3 -2
- package/dist/http/memory-compliance-failure-reply.d.ts +2 -2
- package/dist/http/memory-compliance-failure-reply.js +5 -15
- package/dist/http/memory-control-plane-corrupt-reply.d.ts +25 -0
- package/dist/http/memory-control-plane-corrupt-reply.js +19 -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 +28 -16
- package/dist/http/principal-gate.js +10 -19
- package/dist/http/request-guards.d.ts +2 -2
- package/dist/http/request-guards.js +5 -5
- package/dist/http/resume-legs.d.ts +29 -10
- package/dist/http/resume-legs.js +94 -56
- 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 +43 -26
- package/dist/http/route-table.js +4 -0
- package/dist/http/routes/adoption.d.ts +11 -0
- package/dist/http/routes/adoption.js +80 -6
- package/dist/http/routes/agents-roster.js +1 -0
- package/dist/http/routes/approvals-assistant.js +7 -26
- package/dist/http/routes/background.js +1 -0
- package/dist/http/routes/capabilities.js +12 -3
- package/dist/http/routes/devices.js +1 -1
- package/dist/http/routes/diagnostics.d.ts +9 -14
- package/dist/http/routes/diagnostics.js +10 -20
- package/dist/http/routes/engine.d.ts +31 -0
- package/dist/http/routes/engine.js +81 -0
- package/dist/http/routes/memory-bundle.js +3 -0
- package/dist/http/routes/memory-consolidation.js +3 -5
- package/dist/http/routes/memory-origin.d.ts +2 -2
- package/dist/http/routes/memory-origin.js +2 -4
- package/dist/http/routes/memory-policy.js +5 -1
- package/dist/http/routes/notify-wake.js +2 -1
- package/dist/http/routes/observability.js +3 -6
- 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 +15 -11
- package/dist/http/routes/session-sync.js +39 -35
- package/dist/http/routes/sessions-list.d.ts +1 -1
- package/dist/http/routes/sessions.d.ts +7 -1
- package/dist/http/routes/sessions.js +108 -2
- package/dist/http/routes/tasks.js +32 -8
- package/dist/http/routes/trace-usage.js +1 -1
- package/dist/http/run-concurrency-cap.d.ts +86 -0
- package/dist/http/run-concurrency-cap.js +54 -0
- package/dist/http/server.d.ts +31 -14
- package/dist/http/server.js +29 -3
- package/dist/http/stored-body-replay.d.ts +12 -7
- package/dist/http/stored-body-replay.js +28 -5
- package/dist/http/wire-types.d.ts +27 -13
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/instruction-source-notice.d.ts +1 -1
- package/dist/json-body-limit.d.ts +8 -0
- package/dist/json-body-limit.js +2 -0
- package/dist/leader/diffout.d.ts +1 -1
- package/dist/local-data-root.d.ts +2 -2
- 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 +9 -4
- package/dist/memory-scope-stores.d.ts +9 -7
- package/dist/memory-scope-stores.js +3 -14
- package/dist/memory-scope.d.ts +38 -2
- package/dist/memory-scope.js +33 -2
- 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/net-address.d.ts +53 -0
- package/dist/net-address.js +111 -0
- package/dist/observability/fail-open.d.ts +29 -17
- package/dist/observability/fail-open.js +29 -17
- 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/orchestration/workflow-notify-journal.js +2 -3
- package/dist/org-delivery-gate.js +1 -1
- 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/peer-directory.d.ts +6 -12
- package/dist/peer-directory.js +5 -1
- 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 +12 -5
- package/dist/plugins/caching-session-store.js +3 -0
- 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 +426 -0
- package/dist/plugins/checkpoint-store-face.js +152 -0
- 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 -18
- package/dist/plugins/file-run-store.js +64 -75
- package/dist/plugins/fork-routing-session-store.d.ts +6 -2
- package/dist/plugins/fork-routing-session-store.js +2 -2
- package/dist/plugins/imported-layer-root-retirement.d.ts +22 -11
- 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 +7 -2
- package/dist/plugins/local-checkpoint-store.js +13 -8
- 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 +119 -30
- package/dist/plugins/local-session-store.js +156 -53
- 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 +30 -6
- package/dist/plugins/memory-engine-pg.js +96 -214
- package/dist/plugins/memory-engine-sql-apply.d.ts +130 -0
- package/dist/plugins/memory-engine-sql-apply.js +358 -0
- package/dist/plugins/memory-engine-tidb.d.ts +38 -9
- package/dist/plugins/memory-engine-tidb.js +99 -230
- package/dist/plugins/memory-key-guards.d.ts +1 -1
- package/dist/plugins/memory-origin-law.d.ts +3 -3
- package/dist/plugins/one-time-migrations.d.ts +169 -83
- package/dist/plugins/one-time-migrations.js +295 -235
- 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 +17 -3
- package/dist/plugins/permission-rule-store-file.js +20 -1
- package/dist/plugins/pg-pool.d.ts +2 -1
- package/dist/plugins/pg-pool.js +12 -5
- 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/run-store-sql.js +2 -2
- 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 +13 -3
- 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 +31 -9
- package/dist/plugins/session-fork.js +3 -2
- package/dist/plugins/session-placement.d.ts +4 -2
- 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/sql-json-column.d.ts +5 -1
- package/dist/plugins/store-backend.d.ts +46 -16
- package/dist/plugins/store-backend.js +192 -69
- package/dist/plugins/store-contracts.d.ts +10 -13
- package/dist/plugins/store-contracts.js +1 -9
- package/dist/plugins/store-sweep.d.ts +63 -0
- package/dist/plugins/store-sweep.js +48 -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 +20 -32
- package/dist/plugins/user-input-ledger-sql.d.ts +1 -1
- package/dist/prompt-screen.d.ts +6 -9
- package/dist/prompt-screen.js +2 -5
- 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 +48 -27
- package/dist/rules-consent.js +147 -23
- package/dist/run-cancel-context.d.ts +4 -1
- package/dist/run-cancel-context.js +2 -1
- package/dist/run-local.js +17 -13
- package/dist/runs.d.ts +48 -30
- package/dist/runs.js +27 -17
- package/dist/runtime-caps-resolver.d.ts +15 -8
- package/dist/runtime-caps-resolver.js +14 -10
- package/dist/sandbox-egress-policy.js +6 -11
- package/dist/sandbox-rbac-rules.d.ts +88 -0
- package/dist/sandbox-rbac-rules.js +80 -0
- package/dist/sealed-key-layout.d.ts +16 -0
- package/dist/sealed-key-layout.js +3 -0
- package/dist/sealed-key.js +8 -6
- package/dist/security.d.ts +43 -9
- package/dist/security.js +9 -2
- 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-notify-door.d.ts +5 -3
- package/dist/session-resident-background.d.ts +110 -0
- package/dist/session-resident-background.js +88 -0
- package/dist/session-row.d.ts +1 -1
- package/dist/session-sync-kernel.d.ts +53 -14
- package/dist/session-sync-kernel.js +70 -1
- package/dist/session-sync.d.ts +5 -3
- package/dist/session-workspace.d.ts +12 -2
- package/dist/session-workspace.js +6 -0
- package/dist/sighup-idle.d.ts +9 -7
- package/dist/sighup-idle.js +4 -5
- package/dist/spec-fields.d.ts +16 -0
- package/dist/spec-fields.js +7 -0
- package/dist/store-posture.d.ts +2 -1
- package/dist/stored-request-env-credentials-m38.d.ts +3 -0
- package/dist/stored-request-env-credentials-m38.js +8 -0
- package/dist/stored-request-hooks-m20.d.ts +3 -2
- package/dist/stored-request-hooks-m20.js +19 -14
- package/dist/stored-request-prompt-profile-m30.d.ts +1 -1
- package/dist/stores-sql/blob-index-sql.d.ts +148 -0
- package/dist/stores-sql/blob-index-sql.js +154 -0
- package/dist/{plugins → stores-sql}/checkpoint-store-sql.d.ts +14 -428
- package/dist/{plugins → stores-sql}/checkpoint-store-sql.js +43 -220
- 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}/mailbox-store-sql.d.ts +2 -2
- package/dist/{plugins → stores-sql}/mailbox-store-sql.js +4 -4
- package/dist/{plugins → stores-sql}/pg-session-storage.d.ts +27 -67
- package/dist/{plugins → stores-sql}/pg-session-storage.js +82 -207
- 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}/roster-store-sql.d.ts +2 -2
- package/dist/{plugins → stores-sql}/roster-store-sql.js +1 -1
- 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 +35 -112
- package/dist/{plugins → stores-sql}/tidb-session-store.js +73 -169
- package/dist/{plugins → stores-sql}/tool-result-store-sql.d.ts +3 -3
- package/dist/{plugins → stores-sql}/tool-result-store-sql.js +6 -6
- package/dist/stores-sql/windowed-session-storage.d.ts +56 -0
- package/dist/stores-sql/windowed-session-storage.js +61 -0
- package/dist/{plugins → stores-sql}/workflow-journal-store-sql.d.ts +7 -12
- package/dist/{plugins → stores-sql}/workflow-journal-store-sql.js +3 -8
- 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 +68 -8
- package/dist/task-settings.js +63 -6
- package/dist/tool-approval.d.ts +23 -10
- package/dist/tool-approval.js +10 -6
- package/dist/trace/core-keyset-guard.d.ts +17 -10
- package/dist/trace/engine-notice-wire.d.ts +1 -1
- package/dist/trace/engine-notice-wire.js +4 -0
- package/dist/trace/exit-seat.d.ts +29 -1
- package/dist/trace/exit-seat.js +4 -0
- package/dist/trace/project.d.ts +33 -16
- package/dist/trace/project.js +21 -9
- package/dist/trace/redact.d.ts +13 -2
- package/dist/trace/redact.js +347 -78
- package/dist/trace/self-minted-wire.d.ts +587 -16
- package/dist/trace/self-minted-wire.js +215 -9
- 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 +39 -3
- package/dist/trace/wire-projection-faces.js +27 -2
- package/dist/unread-request-members.d.ts +66 -0
- package/dist/unread-request-members.js +41 -0
- package/dist/usage-analytics.d.ts +4 -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 +22 -13
- package/scripts/drain-check-local.mjs +8 -55
- package/scripts/drain-check.mysql.sql +3 -40
- package/scripts/drain-check.pg.sql +3 -40
- package/skills/update-config.md +1 -1
- package/wire-changes/server@7.146.0.json +3221 -0
- package/wire-changes/server@7.147.0.json +813 -0
- package/dist/approval-batch-census.d.ts +0 -27
- package/dist/approval-batch-census.js +0 -27
|
@@ -61,13 +61,14 @@ spec:
|
|
|
61
61
|
- { name: MODEL_VISION, value: {{ .Values.server.modelVision | quote }} }
|
|
62
62
|
{{/* 租户姿态与主 worker 同值(文件头「同 env 面」的承诺;修前缺席 ⇒ 主 worker 多租时本只仍单用户)。 */}}
|
|
63
63
|
- { name: REQUIRE_PRINCIPAL, value: {{ .Values.server.requirePrincipal | default "false" | quote }} }
|
|
64
|
+
{{/* 单用户运维声明 = 租户姿态的否定(同一个值派生,不另开 values 键):单用户 ⇒ 这台的调用方就是运维;多租 ⇒ 不声明(运维由具名名单另给)。
|
|
65
|
+
server 装配运维面时要单用户部署说出谁是运维,缺了这一行单用户 worker 起服拒。派生与「只认 true / false」见 _helpers.tpl 的 sema.operatorSingleUser。 */}}
|
|
66
|
+
- { name: OPERATOR_SINGLE_USER, value: {{ include "sema.operatorSingleUser" . | quote }} }
|
|
64
67
|
- { name: SANDBOX_PKG_SOURCE, value: {{ .Values.server.sandboxPkgSource | quote }} }
|
|
65
|
-
{{/*
|
|
66
|
-
|
|
67
|
-
下面圈起来的两行取自车道表(lanes.json 的 kube 行),由生成器渲出,不要手改。 */}}
|
|
68
|
+
{{/* 车道显式点名(REMOTE_EXEC)。REQUIRE_EXECUTION_LANE 是退役 env(设了即起服拒,拒句指向 REMOTE_EXEC),不再渲。
|
|
69
|
+
下面圈起来的一行取自车道表(lanes.json 的 kube 行),由生成器渲出,不要手改。 */}}
|
|
68
70
|
{{/* @generated-begin kube-lane-env */}}
|
|
69
71
|
- { name: REMOTE_EXEC, value: "k8s" }
|
|
70
|
-
- { name: REQUIRE_EXECUTION_LANE, value: "true" }
|
|
71
72
|
{{/* @generated-end kube-lane-env */}}
|
|
72
73
|
- { name: K8S_API_URL, value: "https://kubernetes.default.svc" }
|
|
73
74
|
{{- if .Values.server.k8sInsecureTls }}
|
|
@@ -77,6 +78,10 @@ spec:
|
|
|
77
78
|
- { name: K8S_RUNTIME_CLASS, value: {{ .Values.sandbox.runtimeClass }} }
|
|
78
79
|
- { name: K8S_SANDBOX_IMAGE, value: {{ .Values.sandbox.image | quote }} }
|
|
79
80
|
- { name: K8S_SANDBOX_IPV6, value: {{ .Values.sandbox.ipv6 | quote }} }
|
|
81
|
+
{{- /* 沙箱特性开关(sandbox.workspaceCacheVolume / sandbox.sandboxEnv)同一个值写引擎旋钮与沙箱 Role 规则,见 _helpers.tpl。 */}}
|
|
82
|
+
{{- with (include "sema.sandbox.switchEnv" . | trim) }}
|
|
83
|
+
{{ . | indent 12 }}
|
|
84
|
+
{{- end }}
|
|
80
85
|
- { name: K8S_TOKEN, valueFrom: { secretKeyRef: { name: sema-runner-token-copy, key: token } } }
|
|
81
86
|
{{- /* 耐久审批的显式表态与停驻封签钥匙卷同源(助手 sema.durableApproval / sema.sealedKey.*,见 _helpers.tpl):关持久 ⇒ 显式 false;留空 ⇒ 不渲。 */}}
|
|
82
87
|
{{- with (include "sema.sealedKey.env" .) }}
|
|
@@ -72,13 +72,14 @@ spec:
|
|
|
72
72
|
- { name: MODEL_API_KEY, valueFrom: { secretKeyRef: { name: sema-server-env, key: MODEL_API_KEY } } }
|
|
73
73
|
- { name: MODEL_VISION, value: {{ .Values.server.modelVision | quote }} }
|
|
74
74
|
- { name: REQUIRE_PRINCIPAL, value: {{ .Values.server.requirePrincipal | default "false" | quote }} }
|
|
75
|
+
{{/* 单用户运维声明 = 租户姿态的否定(同一个值派生,不另开 values 键):单用户 ⇒ 这台的调用方就是运维;多租 ⇒ 不声明(运维由具名名单另给)。
|
|
76
|
+
server 装配运维面时要单用户部署说出谁是运维,缺了这一行单用户 worker 起服拒。派生与「只认 true / false」见 _helpers.tpl 的 sema.operatorSingleUser。 */}}
|
|
77
|
+
- { name: OPERATOR_SINGLE_USER, value: {{ include "sema.operatorSingleUser" . | quote }} }
|
|
75
78
|
- { name: SANDBOX_PKG_SOURCE, value: {{ .Values.server.sandboxPkgSource | quote }} }
|
|
76
|
-
{{/*
|
|
77
|
-
|
|
78
|
-
下面圈起来的两行取自车道表(lanes.json 的 kube 行),由生成器渲出,不要手改。 */}}
|
|
79
|
+
{{/* 车道显式点名(REMOTE_EXEC)。REQUIRE_EXECUTION_LANE 是退役 env(设了即起服拒,拒句指向 REMOTE_EXEC),不再渲。
|
|
80
|
+
下面圈起来的一行取自车道表(lanes.json 的 kube 行),由生成器渲出,不要手改。 */}}
|
|
79
81
|
{{/* @generated-begin kube-lane-env */}}
|
|
80
82
|
- { name: REMOTE_EXEC, value: "k8s" }
|
|
81
|
-
- { name: REQUIRE_EXECUTION_LANE, value: "true" }
|
|
82
83
|
{{/* @generated-end kube-lane-env */}}
|
|
83
84
|
- { name: K8S_API_URL, value: "https://kubernetes.default.svc" }
|
|
84
85
|
{{- if .Values.server.k8sInsecureTls }}
|
|
@@ -90,6 +91,10 @@ spec:
|
|
|
90
91
|
{{- end }}
|
|
91
92
|
- { name: K8S_SANDBOX_IMAGE, value: {{ .Values.sandbox.image | quote }} }
|
|
92
93
|
- { name: K8S_SANDBOX_IPV6, value: {{ .Values.sandbox.ipv6 | quote }} }
|
|
94
|
+
{{- /* 沙箱特性开关(sandbox.workspaceCacheVolume / sandbox.sandboxEnv)同一个值写引擎旋钮与沙箱 Role 规则,见 _helpers.tpl。 */}}
|
|
95
|
+
{{- with (include "sema.sandbox.switchEnv" . | trim) }}
|
|
96
|
+
{{ . | indent 12 }}
|
|
97
|
+
{{- end }}
|
|
93
98
|
- { name: K8S_TOKEN, valueFrom: { secretKeyRef: { name: sema-runner-token-copy, key: token } } }
|
|
94
99
|
{{- /* 耐久审批的显式表态与停驻封签钥匙卷同源(助手 sema.durableApproval / sema.sealedKey.*,见 _helpers.tpl):关持久 ⇒ 显式 false;留空 ⇒ 不渲。 */}}
|
|
95
100
|
{{- with (include "sema.sealedKey.env" .) }}
|
|
@@ -48,7 +48,7 @@ server:
|
|
|
48
48
|
modelId: "" # REQUIRED
|
|
49
49
|
modelApiKey: "" # REQUIRED
|
|
50
50
|
modelVision: "false"
|
|
51
|
-
requirePrincipal: "false" # users=multi 时 true(身份隔离;compose 路径同名 env)
|
|
51
|
+
requirePrincipal: "false" # users=multi 时 true(身份隔离;compose 路径同名 env)。只认 "true" / "false";单用户运维声明 OPERATOR_SINGLE_USER 由它派生(false ⇒ "true")
|
|
52
52
|
# 耐久审批(env DURABLE_APPROVAL;停驻 / 续跑 / /v1/approvals 整条路由)。留空 = 图表不渲这个 env,开关归引擎按姿态定
|
|
53
53
|
# (单用户 + 有耐久店 ⇒ 开;requirePrincipal=true 的多用户形 ⇒ 关);"true" / "false" = 显式表态,原样渲给每只 worker。
|
|
54
54
|
# sealedKey.persistence.enabled=false 时图表固定渲 "false"(钥匙跨不过重启,停驻行就续不了);此处再写 "true" ⇒ 渲染即拒。
|
|
@@ -149,6 +149,13 @@ sandbox:
|
|
|
149
149
|
# 每个节点的 kubelet 要 --allowed-unsafe-sysctls 点名它们,否则沙箱 pod 起不来;沙箱 ns 不能 enforce PodSecurity baseline。
|
|
150
150
|
# enabled = 不动 pod(缺省):只执行 IPv4 的出网策略(k3s 单栈缺省即是)管不到 pod 的 IPv6,server 起服每次一行提醒。
|
|
151
151
|
ipv6: enabled
|
|
152
|
+
# 沙箱特性开关 —— 同一个值既写引擎旋钮、又决定沙箱 Role 带不带对应规则(「哪条规则由哪个开关决定」只写在 server 源码的规则表 src/sandbox-rbac-rules.ts):
|
|
153
|
+
# workspaceCacheVolume(布尔,只收 true / false)= 按工作区空间的构建缓存卷:true ⇒ 引擎 env WORKSPACE_CACHE=volume,Role 加 persistentvolumeclaims 的
|
|
154
|
+
# get / create / delete / deletecollection;false(缺省)⇒ 引擎不建卷、Role 不授这四个动词。前提:集群有缺省 StorageClass、引擎有存储后端(本 chart 恒有 PG)。
|
|
155
|
+
# sandboxEnv(名单字符串 NAME,NAME)= 沙箱带外 env 名单:非空 ⇒ 引擎 env K8S_SANDBOX_ENV=<名单>,Role 加 secrets 的 create;空(缺省)⇒ 都不加。
|
|
156
|
+
# 名单点到的键的**值**要在引擎进程的环境里(本 chart 不替部署提供值的来源);点到而环境里没有的键不转发。
|
|
157
|
+
workspaceCacheVolume: false
|
|
158
|
+
sandboxEnv: ""
|
|
152
159
|
# 沙箱出网策略(NetworkPolicy,egress 白名单;要集群 CNI 带 NetworkPolicy 控制器 —— k3s 缺省自带):
|
|
153
160
|
# 放行 = DNS(kube-dns)+ 对象存储(chart 自带的 MinIO 9000,加 objectStore 点名的脸)+ IPv4 公网面;
|
|
154
161
|
# 拒 = 私网 / 共享 / 链路本地 / 环回六段(10/8、172.16/12、192.168/16、100.64/10、169.254/16、127/8)整段,
|
|
@@ -399,6 +399,7 @@ RENDERED="$WORK/sema-stack-cluster.rendered.yaml"
|
|
|
399
399
|
R_PKG_SOURCE="$([ "$REGION" = "global" ] && echo global || echo '')" \
|
|
400
400
|
R_PG_INSTANCES="$PG_INSTANCES" R_PG_AA="$PG_AA" R_REPLICAS="$SERVER_REPLICAS" \
|
|
401
401
|
R_REQ_PRINCIPAL="$(principal_of_users "$USERS")" \
|
|
402
|
+
R_OPERATOR_SINGLE_USER="$(operator_single_user_of_users "$USERS")" \
|
|
402
403
|
python3 - "$HERE/stack/sema-stack-cluster.yaml" > "$RENDERED" <<'PY'
|
|
403
404
|
import os, sys
|
|
404
405
|
MAP = {"__MINIO_PW__":"R_MINIO_PW", "__SVC_TOKEN__":"R_SVC_TOKEN", "__MODEL_KEY__":"R_MODEL_KEY",
|
|
@@ -406,7 +407,7 @@ MAP = {"__MINIO_PW__":"R_MINIO_PW", "__SVC_TOKEN__":"R_SVC_TOKEN", "__MODEL_KEY_
|
|
|
406
407
|
"__SERVER_IMAGE__":"R_SERVER_IMAGE", "__SERVER_PULL_POLICY__":"R_PULL_POLICY",
|
|
407
408
|
"__PKG_SOURCE__":"R_PKG_SOURCE", "__PG_INSTANCES__":"R_PG_INSTANCES",
|
|
408
409
|
"__PG_ANTI_AFFINITY__":"R_PG_AA", "__SERVER_REPLICAS__":"R_REPLICAS",
|
|
409
|
-
"__REQUIRE_PRINCIPAL__":"R_REQ_PRINCIPAL"}
|
|
410
|
+
"__REQUIRE_PRINCIPAL__":"R_REQ_PRINCIPAL", "__OPERATOR_SINGLE_USER__":"R_OPERATOR_SINGLE_USER"}
|
|
410
411
|
t = open(sys.argv[1], encoding="utf-8").read()
|
|
411
412
|
for ph, env in MAP.items():
|
|
412
413
|
v = os.environ.get(env)
|
|
@@ -22,6 +22,10 @@ FLAG_WORDS_USERS="single multi"
|
|
|
22
22
|
# 事实核对,kube-up 的 helm values,cluster-up 的渲染清单与 helm values 同调这一只(修前 kube-up 另写一份同义翻译;
|
|
23
23
|
# cluster-up 一份都没有 ⇒ --users=multi 在 --kube=machines 路径上被静默丢成单用户)。只认两词,别的词先过 flag_enum。
|
|
24
24
|
principal_of_users() { [ "$1" = "multi" ] && echo true || echo false; }
|
|
25
|
+
# 租户形 ⇒ 单用户运维声明 OPERATOR_SINGLE_USER 的值(唯一定义;三只脚本 / 渲染段同调):server 装配运维面时要单用户部署说出谁是运维,
|
|
26
|
+
# 不声明不起服(声明与具名名单 OPERATOR_PRINCIPALS 二选一;本工具渲前者)。single = 这台只有一个人 ⇒ 他就是运维(true);
|
|
27
|
+
# multi = 多租,运维由具名名单另给 ⇒ 不声明(false;多租形上声明本身会被 server 拒)。chart 从 server.requirePrincipal 同一句派生。
|
|
28
|
+
operator_single_user_of_users() { [ "$1" = "multi" ] && echo false || echo true; }
|
|
25
29
|
|
|
26
30
|
# users_decide <显式给了 USERS 吗(1 / 空)> —— kube 两条装配路径(kube-up / cluster-up)的租户形决策,与 sema-up 的
|
|
27
31
|
# compose 档同一条规则:**决策 = 显式 USERS ∨ 上一次落在 $ENVF 的部署事实 REQUIRE_PRINCIPAL ∨ single**;显式值与事实
|
|
@@ -5,8 +5,7 @@
|
|
|
5
5
|
"choice": "host",
|
|
6
6
|
"users": ["single"],
|
|
7
7
|
"env": {
|
|
8
|
-
"REMOTE_EXEC": "host"
|
|
9
|
-
"REQUIRE_EXECUTION_LANE": "true"
|
|
8
|
+
"REMOTE_EXEC": "host"
|
|
10
9
|
},
|
|
11
10
|
"isolation": "unsupported",
|
|
12
11
|
"note": "server 容器本身就是沙箱:agent 的手落在这只容器里(worktree 隔离在、OS 级隔离不在)。只给单用户 —— 多租户下一个租户的输入会把手指向另一个租户的文件与进程。"
|
|
@@ -17,7 +16,6 @@
|
|
|
17
16
|
"users": ["single", "multi"],
|
|
18
17
|
"env": {
|
|
19
18
|
"REMOTE_EXEC": "e2b",
|
|
20
|
-
"REQUIRE_EXECUTION_LANE": "true",
|
|
21
19
|
"E2B_API_KEY": null
|
|
22
20
|
},
|
|
23
21
|
"isolation": "supported",
|
|
@@ -29,12 +27,11 @@
|
|
|
29
27
|
"users": ["single", "multi"],
|
|
30
28
|
"env": {
|
|
31
29
|
"REMOTE_EXEC": "k8s",
|
|
32
|
-
"REQUIRE_EXECUTION_LANE": "true",
|
|
33
30
|
"K8S_SANDBOX_IMAGE": null,
|
|
34
31
|
"K8S_NAMESPACE": null
|
|
35
32
|
},
|
|
36
33
|
"isolation": "supported",
|
|
37
|
-
"note": "kube 路径**不选词**:runtime 由 kube-up.sh 按 runtimeClass `kata-qemu` 在不在自动定(在 ⇒ kata VM,不在 ⇒ runc 容器),沙箱镜像与沙箱命名空间由 chart/清单给。本行只为对表(能力表 /
|
|
34
|
+
"note": "kube 路径**不选词**:runtime 由 kube-up.sh 按 runtimeClass `kata-qemu` 在不在自动定(在 ⇒ kata VM,不在 ⇒ runc 容器),沙箱镜像与沙箱命名空间由 chart/清单给。本行只为对表(能力表 / 必需键两面),不进 --sandbox 词表。"
|
|
38
35
|
}
|
|
39
36
|
],
|
|
40
37
|
"retired": [
|
|
@@ -705,6 +705,9 @@ if [ "$PROFILE" = "full-single" ] || [ "$PROFILE" = "local-plus" ]; then
|
|
|
705
705
|
setk MODEL_ID "$MODEL"
|
|
706
706
|
[ -n "$MODEL_KEY" ] && setk MODEL_API_KEY "$MODEL_KEY"
|
|
707
707
|
setk REQUIRE_PRINCIPAL "$REQUIRE_PRINCIPAL_WANT"
|
|
708
|
+
# 单用户运维声明:由租户词派生(lib/flagshape.sh 唯一定义),每次重写 —— 它不是第二个部署事实,是 REQUIRE_PRINCIPAL 那一个事实的另一根键。
|
|
709
|
+
# 不写 ⇒ 单用户 server 起服拒(没人能当运维);升级路径上旧 .env 没有这一行,resetk 补上。
|
|
710
|
+
resetk OPERATOR_SINGLE_USER "$(operator_single_user_of_users "$USERS")"
|
|
708
711
|
setk SANDBOX_PKG_SOURCE "$([ "$REGION" = "global" ] && echo global || echo '')"
|
|
709
712
|
[ -n "${SEMA_SERVER_IMAGE:-}" ] && setk SEMA_SERVER_IMAGE "$SEMA_SERVER_IMAGE"
|
|
710
713
|
# 执行车道落 .env(从上面 `lanes resolve` 的结果渲,脚本里零车道词)。
|
|
@@ -800,10 +803,11 @@ shq() { printf "'%s'" "$(printf '%s' "$1" | sed "s/'/'\\\\''/g")"; }
|
|
|
800
803
|
# ── 渲染对账(生成 .env 之后、compose up 之前)──────────────────────────────────
|
|
801
804
|
# .env 的写口 / 读口都按物理行判,认不出 compose dotenv 的跨行引号值等边角;唯一能确知「容器真正拿到
|
|
802
805
|
# 什么」的是 compose 自己。所以在 up 之前跑一次 `compose config`——与 up **同一组 -f / profile / 同一 shell
|
|
803
|
-
# 环境**(于是运维导出的空串等也算进来)——从渲染结果取 agent 服务的 REQUIRE_PRINCIPAL / REMOTE_EXEC
|
|
804
|
-
#
|
|
806
|
+
# 环境**(于是运维导出的空串等也算进来)——从渲染结果取 agent 服务的 REQUIRE_PRINCIPAL / REMOTE_EXEC,
|
|
807
|
+
# 与本次决策逐值对比,不一致 ⇒ 拒并点名渲染值与决策值。**以 compose 为唯一属主**。
|
|
805
808
|
# docker 不可达在上面 `command -v docker` 那道已 fail-loud 拦下;config 本身失败(YAML/插值坏)也拒,
|
|
806
|
-
# 不新铸降级臂:未经对账就不 up。只有 agent
|
|
809
|
+
# 不新铸降级臂:未经对账就不 up。只有 agent 面有这两个决策键,别的档跳过。
|
|
810
|
+
# (REQUIRE_EXECUTION_LANE 是退役 env —— 设了即起服拒 —— 产物不再渲它,也不再对账它。)
|
|
807
811
|
#
|
|
808
812
|
# 拒因分两种、各给各的出路(7.98.0 曾把 stderr 并进 stdout 当 JSON 解析 ⇒ compose 的任何警告都让它 traceback,
|
|
809
813
|
# 拒因还冒充「不一致」):
|
|
@@ -813,7 +817,7 @@ shq() { printf "'%s'" "$(printf '%s' "$1" | sed "s/'/'\\\\''/g")"; }
|
|
|
813
817
|
# 插值警告里的变量名也可能是凭据的一段)。
|
|
814
818
|
RECON_PY='
|
|
815
819
|
import json, sys
|
|
816
|
-
want = {"REQUIRE_PRINCIPAL": sys.argv[1], "REMOTE_EXEC": sys.argv[2]
|
|
820
|
+
want = {"REQUIRE_PRINCIPAL": sys.argv[1], "REMOTE_EXEC": sys.argv[2]}
|
|
817
821
|
try:
|
|
818
822
|
d = json.loads(sys.stdin.read())
|
|
819
823
|
env = d["services"]["server"].get("environment") or {}
|
|
@@ -833,8 +837,7 @@ if bad:
|
|
|
833
837
|
'
|
|
834
838
|
reconcile_render() {
|
|
835
839
|
case ",$COMPOSE_PROFILES," in *,agent,*) : ;; *) return 0 ;; esac
|
|
836
|
-
local exp_rp="$REQUIRE_PRINCIPAL_WANT" exp_re="$LANE_REMOTE_EXEC"
|
|
837
|
-
exp_rl="$(printf '%s\n' "$LANE_ENV" | sed -n 's/^REQUIRE_EXECUTION_LANE=//p')"
|
|
840
|
+
local exp_rp="$REQUIRE_PRINCIPAL_WANT" exp_re="$LANE_REMOTE_EXEC" rendered errf nerr rc=0 prc=0 repro a
|
|
838
841
|
# 复现命令:与这次 config 同一个 compose 入口、同一张全局参数表、同一组 profile(从源渲,不手抄)。
|
|
839
842
|
dc_argv; compose_globals
|
|
840
843
|
repro="(cd $(shq "$HERE/stack") && COMPOSE_PROFILES=$(shq "$COMPOSE_PROFILES") ${DC_ARGV[*]}"
|
|
@@ -848,12 +851,12 @@ reconcile_render() {
|
|
|
848
851
|
log " ↳ 下一步:在本机亲跑 $repro 看 compose 的报文(本脚本不转印它:.env 解析失败的报文会原样引用那一行,可能带凭据);常见成因是手改过的 .env 行"
|
|
849
852
|
exit 1
|
|
850
853
|
fi
|
|
851
|
-
printf '%s' "$rendered" | python3 -c "$RECON_PY" "$exp_rp" "$exp_re"
|
|
854
|
+
printf '%s' "$rendered" | python3 -c "$RECON_PY" "$exp_rp" "$exp_re" || prc=$?
|
|
852
855
|
case "$prc" in
|
|
853
856
|
0) : ;;
|
|
854
857
|
3)
|
|
855
858
|
log "⛔ 渲染对账:渲染值与决策值不一致 —— compose 渲染出的容器决策值与本次决策对不上;以 compose 为唯一属主,拒绝 up"
|
|
856
|
-
log " ↳ 下一步:检查 $ENVF 里 REQUIRE_PRINCIPAL / REMOTE_EXEC
|
|
859
|
+
log " ↳ 下一步:检查 $ENVF 里 REQUIRE_PRINCIPAL / REMOTE_EXEC,以及 shell / -f 里是否**导出**了同名变量(compose 插值 shell 优先于 --env-file,导出为空会盖掉 .env);亲跑 $repro 可看容器 environment"
|
|
857
860
|
exit 1 ;;
|
|
858
861
|
4)
|
|
859
862
|
log "⛔ 渲染对账:渲染结果解析失败 —— docker compose config 退出 0,但 stdout 不是可解析的 compose JSON(或其中没有 server 服务;compose 另在 stderr 输出了 $nerr 行,本脚本不转印),无法确认容器会拿到什么 —— 拒绝在未对账的情况下 up"
|
|
@@ -864,7 +867,7 @@ reconcile_render() {
|
|
|
864
867
|
log " ↳ 下一步:确认本机 python3 可用(python3 -c 'import json'),然后重跑"
|
|
865
868
|
exit 1 ;;
|
|
866
869
|
esac
|
|
867
|
-
log "渲染对账通过:REQUIRE_PRINCIPAL=$exp_rp REMOTE_EXEC=$exp_re
|
|
870
|
+
log "渲染对账通过:REQUIRE_PRINCIPAL=$exp_rp REMOTE_EXEC=$exp_re(compose 渲染逐值一致)$([ "$nerr" -gt 0 ] && printf ';compose 另在 stderr 输出了 %s 行(多为插值警告;本脚本不转印,up 时 compose 会自己打出来)' "$nerr")"
|
|
868
871
|
}
|
|
869
872
|
|
|
870
873
|
# ── 外接端点连接检测(装配前 fail-loud;只验兼容可用,不校验证书——内网自签是常态)────────────
|
|
@@ -93,14 +93,15 @@ services:
|
|
|
93
93
|
MODEL_ID: ${MODEL_ID:-}
|
|
94
94
|
MODEL_API_KEY: ${MODEL_API_KEY:-}
|
|
95
95
|
REQUIRE_PRINCIPAL: ${REQUIRE_PRINCIPAL:-false}
|
|
96
|
+
# 单用户运维声明(sema-up 由 --users 渲进 .env:single ⇒ true,multi ⇒ false)。刻意不给缺省:手工起这份 compose 而 .env 里没有它的
|
|
97
|
+
# 单用户部署,server 起服拒并给出那一行(不在模板里替运维表态「人人是运维」)。
|
|
98
|
+
OPERATOR_SINGLE_USER: ${OPERATOR_SINGLE_USER:-}
|
|
96
99
|
SANDBOX_PKG_SOURCE: ${SANDBOX_PKG_SOURCE:-}
|
|
97
100
|
# 执行车道:值由 sema-up.sh 从 lib/lanes.json 渲进 .env(resetk,每次重写)。
|
|
98
|
-
# `REQUIRE_EXECUTION_LANE
|
|
99
|
-
#
|
|
100
|
-
# 下面圈起来的几行(车道键、缺省、compose 路径上各车道运维自备的键)由车道表生成,不要手改。
|
|
101
|
+
# 不再渲 `REQUIRE_EXECUTION_LANE`:它是退役 env(设了即起服拒,拒句指向 REMOTE_EXEC);车道只由 REMOTE_EXEC 点名。
|
|
102
|
+
# 下面圈起来的几行(车道键、compose 路径上各车道运维自备的键)由车道表生成,不要手改。
|
|
101
103
|
# @generated-begin lane-env
|
|
102
104
|
REMOTE_EXEC: ${REMOTE_EXEC:-}
|
|
103
|
-
REQUIRE_EXECUTION_LANE: ${REQUIRE_EXECUTION_LANE:-true}
|
|
104
105
|
E2B_API_KEY: ${E2B_API_KEY:-}
|
|
105
106
|
# @generated-end lane-env
|
|
106
107
|
ports:
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# sema-stack(full-cluster 形态,Phase 1b as-built;cluster-up.sh 渲染 __占位符__ 后 apply)
|
|
2
|
-
# 占位符:__MINIO_PW__ __SVC_TOKEN__ __MODEL_KEY__ __MODEL_GATEWAY__ __MODEL_ID__ __REQUIRE_PRINCIPAL__
|
|
2
|
+
# 占位符:__MINIO_PW__ __SVC_TOKEN__ __MODEL_KEY__ __MODEL_GATEWAY__ __MODEL_ID__ __REQUIRE_PRINCIPAL__ __OPERATOR_SINGLE_USER__
|
|
3
3
|
# __SERVER_IMAGE__ __SERVER_PULL_POLICY__(tar 预灌=Never / registry 拉取=IfNotPresent)
|
|
4
4
|
# 前置(cluster-up.sh 负责):Longhorn 默认 SC、kata-deploy(runtimeclass kata-qemu)、CNPG operator 1.30、
|
|
5
5
|
# runner token 跨 ns 复制成 sema/sema-runner-token-copy、MinIO 建桶 sema-pg-backup
|
|
@@ -92,7 +92,10 @@ kind: Service
|
|
|
92
92
|
metadata: { name: sema-minio, namespace: sema }
|
|
93
93
|
spec: { selector: { app: sema-minio }, ports: [{ name: s3, port: 9000 }, { name: console, port: 9001 }] }
|
|
94
94
|
---
|
|
95
|
-
# ── 沙箱 lane RBAC(k8s+kata
|
|
95
|
+
# ── 沙箱 lane RBAC(k8s+kata):pod 生命周期 / exec / log、出网自检的两只只读(本 ns 的 NetworkPolicy、集群的节点表)恒授;
|
|
96
|
+
# 缓存卷的 persistentvolumeclaims 与沙箱秘密座的 secrets create 只在对应引擎旋钮(WORKSPACE_CACHE=volume / K8S_SANDBOX_ENV)开着时授 ——
|
|
97
|
+
# 本清单的引擎 env 两个都没设,所以这两条规则渲成注释块,开了旋钮就取消注释。
|
|
98
|
+
# 「哪条规则由哪个开关决定」只写在 server 源码的规则表 src/sandbox-rbac-rules.ts;下面两个规则区由 scripts/gen-deploy-lanes.ts 从它生成,不要手改。────────────────────────────────
|
|
96
99
|
apiVersion: v1
|
|
97
100
|
kind: ServiceAccount
|
|
98
101
|
metadata: { name: sema-runner, namespace: sema-sandbox }
|
|
@@ -109,29 +112,38 @@ apiVersion: rbac.authorization.k8s.io/v1
|
|
|
109
112
|
kind: Role
|
|
110
113
|
metadata: { name: sema-runner, namespace: sema-sandbox }
|
|
111
114
|
rules:
|
|
115
|
+
# @generated-begin sandbox-role-rules
|
|
116
|
+
# 沙箱 pod 的生命周期:remote-env-k8s.ts#createPod 建(POST pods)并读就绪(GET pods/<名>)· remote-env-k8s.ts#listSandboxPods 按标签列(GET pods?labelSelector)· remote-env-k8s.ts#reconnect 读存活(GET pods/<名>)· remote-env-k8s.ts#deletePod 删(DELETE pods/<名>)
|
|
117
|
+
# 兼容保留:chart 一直授着,适配器没有 watch 调用
|
|
112
118
|
- apiGroups: [""]
|
|
113
119
|
resources: [pods]
|
|
114
120
|
verbs: [get, list, watch, create, delete]
|
|
121
|
+
# 在沙箱 pod 里执行命令:remote-env-k8s.ts#execUrl 拼 pods/<名>/exec 的连接地址
|
|
122
|
+
# 兼容保留:chart 一直授着,适配器没有 attach 调用
|
|
115
123
|
- apiGroups: [""]
|
|
116
124
|
resources: [pods/exec, pods/attach]
|
|
117
|
-
verbs: [
|
|
125
|
+
verbs: [get, create]
|
|
126
|
+
# 兼容保留:chart 一直授着,适配器没有读日志的调用
|
|
118
127
|
- apiGroups: [""]
|
|
119
128
|
resources: [pods/log]
|
|
120
129
|
verbs: [get]
|
|
121
|
-
#
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
#
|
|
126
|
-
#
|
|
127
|
-
#
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
#
|
|
130
|
+
# 按工作区空间的构建缓存卷:remote-env-k8s.ts#ensureCacheClaim 按名读、没有就建(GET / POST persistentvolumeclaims)· remote-env-k8s.ts#cacheClaimBound 按名读 · remote-env-k8s.ts#reclaimSpaceCache 空间结束按标签回收(DELETE persistentvolumeclaims?labelSelector = deletecollection);缺它 ⇒ 缓存卷拿不到,适配器按 fail-open 照起、不挂卷(计数 server.workspace-cache.unavailable)
|
|
131
|
+
# 兼容保留:chart 一直授着,适配器回收只发按标签的 deletecollection,没有按名 delete 的调用
|
|
132
|
+
# 默认不授(本清单的 server env 没有 WORKSPACE_CACHE=volume):设了它就取消下面三行的注释:
|
|
133
|
+
# - apiGroups: [""]
|
|
134
|
+
# resources: [persistentvolumeclaims]
|
|
135
|
+
# verbs: [get, create, delete, deletecollection]
|
|
136
|
+
# 沙箱秘密座:动词取自 SANDBOX_SECRET_SEAT_VERBS.env —— 起服门(boot/execution-env.ts ensureSandboxSecretSeat)问的与 remote-env-k8s.ts#createOwnedSecret 为 env Secret 真发的(POST secrets)是同一行;起服门只在有效转发集合非空(名单点到的键在服务进程环境里有值)时问:答 denied ⇒ server 起服拒,问不到 ⇒ 告警 sandbox_secret_seat_unverified 照起;名单非空而有效集合为空时本行是保守多授(安装器看不到服务进程的运行时环境,引擎此时既不问也不调)
|
|
137
|
+
# 默认不授(本清单的 server env 没有 K8S_SANDBOX_ENV=NAME,NAME):设了它就取消下面三行的注释:
|
|
138
|
+
# - apiGroups: [""]
|
|
139
|
+
# resources: [secrets]
|
|
140
|
+
# verbs: [create]
|
|
141
|
+
# 起服的出网自检读本 ns 的 NetworkPolicy 集合:remote-env-k8s.ts#egressPolicyGaps(GET .../networkpolicies)
|
|
142
|
+
# 兼容保留:chart 一直授着,适配器只读集合(list),没有按名 get
|
|
132
143
|
- apiGroups: [networking.k8s.io]
|
|
133
144
|
resources: [networkpolicies]
|
|
134
145
|
verbs: [get, list]
|
|
146
|
+
# @generated-end sandbox-role-rules
|
|
135
147
|
---
|
|
136
148
|
apiVersion: rbac.authorization.k8s.io/v1
|
|
137
149
|
kind: RoleBinding
|
|
@@ -139,14 +151,18 @@ metadata: { name: sema-runner, namespace: sema-sandbox }
|
|
|
139
151
|
roleRef: { apiGroup: rbac.authorization.k8s.io, kind: Role, name: sema-runner }
|
|
140
152
|
subjects: [{ kind: ServiceAccount, name: sema-runner, namespace: sema-sandbox }]
|
|
141
153
|
---
|
|
142
|
-
# 出网自检读节点表(集群级对象 ⇒ ClusterRole
|
|
154
|
+
# 出网自检读节点表(集群级对象 ⇒ ClusterRole + Binding 给同一只服务账号)。与 chart 的 sandbox-rbac.yaml 读同一张规则表。
|
|
143
155
|
apiVersion: rbac.authorization.k8s.io/v1
|
|
144
156
|
kind: ClusterRole
|
|
145
157
|
metadata: { name: sema-runner-nodes-sema-sandbox }
|
|
146
158
|
rules:
|
|
159
|
+
# @generated-begin sandbox-clusterrole-rules
|
|
160
|
+
# 出网自检读节点表(节点是集群级对象 ⇒ ClusterRole + Binding 给同一只服务账号):remote-env-k8s.ts#egressPolicyGaps(GET /api/v1/nodes)
|
|
161
|
+
# 兼容保留:chart 一直授着,适配器只读集合(list),没有按名 get
|
|
147
162
|
- apiGroups: [""]
|
|
148
163
|
resources: [nodes]
|
|
149
164
|
verbs: [get, list]
|
|
165
|
+
# @generated-end sandbox-clusterrole-rules
|
|
150
166
|
---
|
|
151
167
|
apiVersion: rbac.authorization.k8s.io/v1
|
|
152
168
|
kind: ClusterRoleBinding
|
|
@@ -203,11 +219,12 @@ spec:
|
|
|
203
219
|
- { name: MODEL_VISION, value: "false" }
|
|
204
220
|
# 租户姿态与 chart 主 worker 同值(cluster-up 由 --users 渲:multi ⇒ true,否则 false);修前整块缺席 ⇒ 恒单用户
|
|
205
221
|
- { name: REQUIRE_PRINCIPAL, value: "__REQUIRE_PRINCIPAL__" }
|
|
222
|
+
# 单用户运维声明与租户姿态同一次翻译(cluster-up 由 --users 渲:single ⇒ true,multi ⇒ false);缺了它单用户 server 起服拒
|
|
223
|
+
- { name: OPERATOR_SINGLE_USER, value: "__OPERATOR_SINGLE_USER__" }
|
|
206
224
|
- { name: SANDBOX_PKG_SOURCE, value: "__PKG_SOURCE__" }
|
|
207
|
-
#
|
|
225
|
+
# 车道显式点名(REMOTE_EXEC;REQUIRE_EXECUTION_LANE 是退役 env,设了即起服拒,不再渲);下面圈起来的一行取自车道表(lanes.json 的 kube 行),由生成器渲出,不要手改
|
|
208
226
|
# @generated-begin kube-lane-env
|
|
209
227
|
- { name: REMOTE_EXEC, value: "k8s" }
|
|
210
|
-
- { name: REQUIRE_EXECUTION_LANE, value: "true" }
|
|
211
228
|
# @generated-end kube-lane-env
|
|
212
229
|
- { name: K8S_API_URL, value: "https://kubernetes.default.svc" }
|
|
213
230
|
- { name: K8S_INSECURE_TLS, value: "true" }
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const ADOPTION_IMPORT_MAX_SESSIONS_DEFAULT = 100;
|
|
2
|
+
export declare const ADOPTION_IMPORT_MAX_SESSIONS_FLOOR = 1;
|
|
3
|
+
export declare const ADOPTION_IMPORT_MAX_SESSION_BYTES_DEFAULT: number;
|
|
4
|
+
export declare const ADOPTION_IMPORT_MAX_SESSION_BYTES_FLOOR: number;
|
|
5
|
+
export declare const ADOPTION_IMPORT_MAX_SESSION_BYTES_CEILING: number;
|
|
6
|
+
//# sourceMappingURL=import-limits.d.ts.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { MAX_JSON_BODY_BYTES } from "../json-body-limit.js";
|
|
2
|
+
export const ADOPTION_IMPORT_MAX_SESSIONS_DEFAULT = 100;
|
|
3
|
+
export const ADOPTION_IMPORT_MAX_SESSIONS_FLOOR = 1;
|
|
4
|
+
export const ADOPTION_IMPORT_MAX_SESSION_BYTES_DEFAULT = 6 * 1024 * 1024;
|
|
5
|
+
export const ADOPTION_IMPORT_MAX_SESSION_BYTES_FLOOR = 1024 * 1024;
|
|
6
|
+
export const ADOPTION_IMPORT_MAX_SESSION_BYTES_CEILING = MAX_JSON_BODY_BYTES - Buffer.byteLength(JSON.stringify({ sessions: [] }), "utf8");
|
|
7
|
+
//# sourceMappingURL=import-limits.js.map
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { AdoptionLogStore, AdoptionRow } from "../plugins/adoption-log-sql.js";
|
|
2
|
+
import { type ImportStagingStore } from "../session-sync-kernel.js";
|
|
3
|
+
import { type AdoptionImportCapability, type AdoptionImportResult } from "./wire.js";
|
|
4
|
+
/**
|
|
5
|
+
* 幂等键 → 云端会话 id(②)。sha256 的原像是 `JSON.stringify([域, adoptionId, clientSessionId])` —— JSON 数组的编码是**单射**的(拿分隔符拼接不是:
|
|
6
|
+
* 任一半里出现分隔符就能伪造另一对),取前 16 字节,版本半字节写 `8`(RFC 9562 自定义形)、变体写 `10`,铸成 canonical uuid。
|
|
7
|
+
* 会话 id 的形门(`security.ts` 的 `isUuidShape`)收任何版本的 canonical uuid,所以这一只 id 在每扇带会话 id 的门上都可达;
|
|
8
|
+
* 版本 8 也让它与 core 铸的 uuidv7 永不同形(不会撞上一只普通会话)。
|
|
9
|
+
*/
|
|
10
|
+
export declare function buildAdoptionImportSessionId(adoptionId: string, clientSessionId: string): string;
|
|
11
|
+
/** 一条收编行对一位调用者的判(①;闭集四臂,门按臂穷举下发)。 */
|
|
12
|
+
export type AdoptionImportBinding = {
|
|
13
|
+
readonly kind: "bound";
|
|
14
|
+
readonly adoptionId: string;
|
|
15
|
+
readonly toPrincipal: string;
|
|
16
|
+
} | {
|
|
17
|
+
readonly kind: "absent";
|
|
18
|
+
} | {
|
|
19
|
+
readonly kind: "not_source";
|
|
20
|
+
} | {
|
|
21
|
+
readonly kind: "not_adopted";
|
|
22
|
+
};
|
|
23
|
+
/** ① 的唯一判官:行不在 ⇒ `absent`;调用者不**逐字**等于源主体 ⇒ `not_source`(先于收编态:不是源主体的调用方读不出这一行走到了哪);
|
|
24
|
+
* 收编没走完 / 被拒 ⇒ `not_adopted`;否则 `bound`(目的地 = 行的目的主体)。 */
|
|
25
|
+
export declare function judgeAdoptionImportBinding(row: AdoptionRow | null, caller: string): AdoptionImportBinding;
|
|
26
|
+
/** 两只帽的当前值(配置 env 腿解析过的那一份;数字属主 `import-limits.ts`)。 */
|
|
27
|
+
export interface AdoptionImportLimits {
|
|
28
|
+
readonly adoptionImportMaxSessions: number;
|
|
29
|
+
readonly adoptionImportMaxSessionBytes: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 能力位 `adoptionImport` 的唯一铸点:部署半不在 / 没有已验身份 ⇒ 缺席;按调用者读它作为源主体的那一行(`from_principal` 唯一,恰一行或没有),
|
|
33
|
+
* 过 ① 的同一只判官,`bound` 才在场。读收编日志失败 ⇒ 缺席并走登记过的 F 类臂(能力面不为一次库抖动整只 500;缺席的方向是「入口藏起来」)。
|
|
34
|
+
*/
|
|
35
|
+
export declare function readAdoptionImportCapability(face: {
|
|
36
|
+
readonly available: false;
|
|
37
|
+
} | {
|
|
38
|
+
readonly available: true;
|
|
39
|
+
readonly backend: {
|
|
40
|
+
adoptionLog(): AdoptionLogStore;
|
|
41
|
+
};
|
|
42
|
+
}, caller: string | undefined, limits: AdoptionImportLimits): Promise<AdoptionImportCapability | undefined>;
|
|
43
|
+
/** 请求体的形(恰 `{sessions: [...]}`)。读不出 ⇒ `undefined`(路由答 400 `request.body_shape`)。 */
|
|
44
|
+
export declare function readAdoptionImportBody(raw: unknown): readonly unknown[] | undefined;
|
|
45
|
+
/** 导入要的会话店那几口:只有暂存导入核(「已导过」由提交的属主判答,不读头);`evict` 在场 ⇒ 提交后丢掉缓存层的热句柄(提交经原始店写,绕过了缓存 —— 第二阶段同理)。 */
|
|
46
|
+
export type AdoptionImportSessionStore = ImportStagingStore & {
|
|
47
|
+
evict?(sessionId: string): void;
|
|
48
|
+
};
|
|
49
|
+
export interface AdoptionImportTarget {
|
|
50
|
+
readonly adoptionId: string;
|
|
51
|
+
readonly toPrincipal: string;
|
|
52
|
+
readonly maxSessionBytes: number;
|
|
53
|
+
readonly sessionStorage: AdoptionImportSessionStore;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 逐元素跑一批(顺序跑:体已整只在内存里且 ≤ JSON 体上限,逐个落暂存 + 提交)。每个元素的判序固定:
|
|
57
|
+
* 信封形(`invalid_envelope`)→ 同批重复 id(`duplicate_client_session_id`:同批第一个读得出这个 id 的元素认领它,不论它自己的结局)
|
|
58
|
+
* → 字节帽(`too_large`)→ 导入(②③;条目日志没过 core 的导入门 ⇒ `invalid_envelope`)。
|
|
59
|
+
* 店故障原样上抛(整请求 5xx;已落的元素重投答 `already_imported`)。
|
|
60
|
+
*/
|
|
61
|
+
export declare function runAdoptionImport(target: AdoptionImportTarget, sessions: readonly unknown[]): Promise<AdoptionImportResult[]>;
|
|
62
|
+
//# sourceMappingURL=import.d.ts.map
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { SessionError } from "@sema-agent/core";
|
|
3
|
+
import { createStagedLogFeed, MalformedImportEntryError, newStagingToken, StagedCommitOwnerChangedError } from "../session-sync-kernel.js";
|
|
4
|
+
import { STAGED_IMPORT_INVALID_SENTENCE } from "../session-error-wire.js";
|
|
5
|
+
import { recordFailOpen } from "../observability/fail-open.js";
|
|
6
|
+
import { AdoptionImportBodySchema, AdoptionImportEnvelopeSchema, ADOPTION_IMPORT_CLIENT_SESSION_ID_MAX_CHARS } from "./wire.js";
|
|
7
|
+
export function buildAdoptionImportSessionId(adoptionId, clientSessionId) {
|
|
8
|
+
const b = Buffer.from(createHash("sha256").update(JSON.stringify(["sema.adoption-import", adoptionId, clientSessionId])).digest().subarray(0, 16));
|
|
9
|
+
b[6] = (b[6] & 0x0f) | 0x80;
|
|
10
|
+
b[8] = (b[8] & 0x3f) | 0x80;
|
|
11
|
+
const hex = b.toString("hex");
|
|
12
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
|
|
13
|
+
}
|
|
14
|
+
export function judgeAdoptionImportBinding(row, caller) {
|
|
15
|
+
if (row === null)
|
|
16
|
+
return { kind: "absent" };
|
|
17
|
+
if (row.fromPrincipal !== caller)
|
|
18
|
+
return { kind: "not_source" };
|
|
19
|
+
switch (row.state) {
|
|
20
|
+
case "adopted":
|
|
21
|
+
return { kind: "bound", adoptionId: row.adoptionId, toPrincipal: row.toPrincipal };
|
|
22
|
+
case "in_flight":
|
|
23
|
+
case "rejected":
|
|
24
|
+
return { kind: "not_adopted" };
|
|
25
|
+
default: {
|
|
26
|
+
const unknownState = row.state;
|
|
27
|
+
throw new Error(`adoption import: unknown adoption state ${JSON.stringify(unknownState)}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export async function readAdoptionImportCapability(face, caller, limits) {
|
|
32
|
+
if (!face.available || caller === undefined)
|
|
33
|
+
return undefined;
|
|
34
|
+
let row;
|
|
35
|
+
try {
|
|
36
|
+
row = await face.backend.adoptionLog().getByFrom(caller);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
recordFailOpen("server.capabilities.adoption-import-unreadable", err instanceof Error ? err.name : "non-error throw");
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
const binding = judgeAdoptionImportBinding(row, caller);
|
|
43
|
+
return binding.kind === "bound" ? { adoptionId: binding.adoptionId, maxSessions: limits.adoptionImportMaxSessions, maxSessionBytes: limits.adoptionImportMaxSessionBytes } : undefined;
|
|
44
|
+
}
|
|
45
|
+
export function readAdoptionImportBody(raw) {
|
|
46
|
+
const parsed = AdoptionImportBodySchema.safeParse(raw);
|
|
47
|
+
return parsed.success ? parsed.data.sessions : undefined;
|
|
48
|
+
}
|
|
49
|
+
const INVALID_ENVELOPE_SHAPE = `a session envelope is exactly {clientSessionId, entries}: clientSessionId a string of 1-${ADOPTION_IMPORT_CLIENT_SESSION_ID_MAX_CHARS} characters, entries an array of session entries (oldest first) — no other keys`;
|
|
50
|
+
function envelopeBytes(raw) {
|
|
51
|
+
return Buffer.byteLength(JSON.stringify(raw), "utf8");
|
|
52
|
+
}
|
|
53
|
+
export async function runAdoptionImport(target, sessions) {
|
|
54
|
+
const claimed = new Set();
|
|
55
|
+
const results = [];
|
|
56
|
+
for (const raw of sessions) {
|
|
57
|
+
const parsed = AdoptionImportEnvelopeSchema.safeParse(raw);
|
|
58
|
+
if (!parsed.success) {
|
|
59
|
+
results.push({ outcome: "rejected", code: "invalid_envelope", detail: INVALID_ENVELOPE_SHAPE });
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
const { clientSessionId, entries } = parsed.data;
|
|
63
|
+
if (claimed.has(clientSessionId)) {
|
|
64
|
+
results.push({ clientSessionId, outcome: "rejected", code: "duplicate_client_session_id" });
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
claimed.add(clientSessionId);
|
|
68
|
+
const bytes = envelopeBytes(raw);
|
|
69
|
+
if (bytes > target.maxSessionBytes) {
|
|
70
|
+
results.push({ clientSessionId, outcome: "rejected", code: "too_large", count: bytes, cap: target.maxSessionBytes });
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
results.push(await importOne(target, clientSessionId, entries));
|
|
74
|
+
}
|
|
75
|
+
return results;
|
|
76
|
+
}
|
|
77
|
+
async function importOne(target, clientSessionId, entries) {
|
|
78
|
+
const sessionId = buildAdoptionImportSessionId(target.adoptionId, clientSessionId);
|
|
79
|
+
const store = target.sessionStorage;
|
|
80
|
+
const handle = store.beginImportStaging(sessionId, newStagingToken());
|
|
81
|
+
try {
|
|
82
|
+
const feed = createStagedLogFeed(handle);
|
|
83
|
+
for (const e of entries)
|
|
84
|
+
await feed.push(e);
|
|
85
|
+
await feed.finish();
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
await handle.abort().catch(() => undefined);
|
|
89
|
+
if (e instanceof MalformedImportEntryError)
|
|
90
|
+
return { clientSessionId, outcome: "rejected", code: "invalid_envelope", detail: e.message };
|
|
91
|
+
if (e instanceof SessionError && e.code === "invalid_session")
|
|
92
|
+
return { clientSessionId, outcome: "rejected", code: "invalid_envelope", detail: STAGED_IMPORT_INVALID_SENTENCE };
|
|
93
|
+
throw e;
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
await handle.commit(target.toPrincipal, { expectedOwner: undefined });
|
|
97
|
+
}
|
|
98
|
+
catch (e) {
|
|
99
|
+
await handle.abort().catch(() => undefined);
|
|
100
|
+
if (e instanceof StagedCommitOwnerChangedError)
|
|
101
|
+
return { clientSessionId, outcome: "already_imported", sessionId };
|
|
102
|
+
throw e;
|
|
103
|
+
}
|
|
104
|
+
store.evict?.(sessionId);
|
|
105
|
+
return { clientSessionId, outcome: "imported", sessionId };
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=import.js.map
|
package/dist/adoption/wire.d.ts
CHANGED
|
@@ -253,4 +253,56 @@ export declare const AdoptionRequestSchema: z.ZodObject<{
|
|
|
253
253
|
fromPrincipal: z.ZodString;
|
|
254
254
|
toPrincipal: z.ZodString;
|
|
255
255
|
}, z.core.$strict>;
|
|
256
|
+
/** 请求体:恰一键 `sessions`(会话信封数组)。`.strict()` —— 写面纪律;请求体里**没有**点名目的地的位置(目的地 = 收编行的目的主体)。 */
|
|
257
|
+
export declare const AdoptionImportBodySchema: z.ZodObject<{
|
|
258
|
+
sessions: z.ZodArray<z.ZodUnknown>;
|
|
259
|
+
}, z.core.$strict>;
|
|
260
|
+
/** `clientSessionId` 的长度上界(调用方本地 id;不进任何列 —— 它只进派生 id 的哈希原像,并在结局里原样回显)。 */
|
|
261
|
+
export declare const ADOPTION_IMPORT_CLIENT_SESSION_ID_MAX_CHARS = 255;
|
|
262
|
+
/**
|
|
263
|
+
* 一个会话信封 = 调用方本地的一只会话:`clientSessionId`(它的本地 id,幂等键的一半)+ `entries`(会话的条目日志,最老在前 —— 与会话同步
|
|
264
|
+
* 推送面逐行流的同一种条目,由 core 的导入门判)。恰这两键:多一个不认识的键 ⇒ 整个元素 `rejected` / `invalid_envelope`(不静默跳过)。
|
|
265
|
+
*/
|
|
266
|
+
export declare const AdoptionImportEnvelopeSchema: z.ZodObject<{
|
|
267
|
+
clientSessionId: z.ZodString;
|
|
268
|
+
entries: z.ZodArray<z.ZodUnknown>;
|
|
269
|
+
}, z.core.$strict>;
|
|
270
|
+
export type AdoptionImportEnvelope = z.infer<typeof AdoptionImportEnvelopeSchema>;
|
|
271
|
+
/** `rejected` 的具名码**闭集**(三词,穷举;消费方按码给用户话):超字节 / 信封形不认识(含条目日志没过 core 的导入门)/ 同一批里第二个带同一 id 的元素。
|
|
272
|
+
* 跨批重投同一 id 不是 `duplicate_client_session_id` —— 那是 `already_imported`(幂等)。 */
|
|
273
|
+
export declare const ADOPTION_IMPORT_REJECT_CODES: readonly ["too_large", "invalid_envelope", "duplicate_client_session_id"];
|
|
274
|
+
export type AdoptionImportRejectCode = (typeof ADOPTION_IMPORT_REJECT_CODES)[number];
|
|
275
|
+
/**
|
|
276
|
+
* 一个元素的结局(结果数组与请求的 `sessions` **按位对应**:N 个进 ⇒ N 个出)。`clientSessionId` 在信封读得出时回显(信封形不认识时缺席 —— 位置就是对应关系)。
|
|
277
|
+
* · `imported` / `already_imported`:带云端 `sessionId`(= `(adoptionId, clientSessionId)` 的纯函数,两次答同一个);
|
|
278
|
+
* · `rejected` + `too_large`:带量到的信封字节 `count` 与当时的帽 `cap`;
|
|
279
|
+
* · `rejected` + `invalid_envelope`:带一句 `detail`(固定句,不回显条目内容);
|
|
280
|
+
* · `rejected` + `duplicate_client_session_id`:同批第一个带这个 id 的元素认领它,之后的都拒(不静默去重 —— 「提交了 N 条」与「云上有 N-1 条」对不上账)。
|
|
281
|
+
*/
|
|
282
|
+
export type AdoptionImportResult = {
|
|
283
|
+
readonly clientSessionId: string;
|
|
284
|
+
readonly outcome: "imported" | "already_imported";
|
|
285
|
+
readonly sessionId: string;
|
|
286
|
+
} | {
|
|
287
|
+
readonly clientSessionId: string;
|
|
288
|
+
readonly outcome: "rejected";
|
|
289
|
+
readonly code: "too_large";
|
|
290
|
+
readonly count: number;
|
|
291
|
+
readonly cap: number;
|
|
292
|
+
} | {
|
|
293
|
+
readonly clientSessionId: string;
|
|
294
|
+
readonly outcome: "rejected";
|
|
295
|
+
readonly code: "duplicate_client_session_id";
|
|
296
|
+
} | {
|
|
297
|
+
readonly clientSessionId?: string;
|
|
298
|
+
readonly outcome: "rejected";
|
|
299
|
+
readonly code: "invalid_envelope";
|
|
300
|
+
readonly detail: string;
|
|
301
|
+
};
|
|
302
|
+
/** 能力位 `adoptionImport` 的值(present-iff 调用者是一条已收编行的源主体):导入口的 id + 两只帽的**当前值**(客户端据此分批,不撞 400 再收缩)。 */
|
|
303
|
+
export interface AdoptionImportCapability {
|
|
304
|
+
readonly adoptionId: string;
|
|
305
|
+
readonly maxSessions: number;
|
|
306
|
+
readonly maxSessionBytes: number;
|
|
307
|
+
}
|
|
256
308
|
//# sourceMappingURL=wire.d.ts.map
|
package/dist/adoption/wire.js
CHANGED
|
@@ -77,4 +77,13 @@ export const AdoptionRequestSchema = z
|
|
|
77
77
|
toPrincipal: z.string().min(1).max(190),
|
|
78
78
|
})
|
|
79
79
|
.strict();
|
|
80
|
+
export const AdoptionImportBodySchema = z.object({ sessions: z.array(z.unknown()) }).strict();
|
|
81
|
+
export const ADOPTION_IMPORT_CLIENT_SESSION_ID_MAX_CHARS = 255;
|
|
82
|
+
export const AdoptionImportEnvelopeSchema = z
|
|
83
|
+
.object({
|
|
84
|
+
clientSessionId: z.string().min(1).max(ADOPTION_IMPORT_CLIENT_SESSION_ID_MAX_CHARS),
|
|
85
|
+
entries: z.array(z.unknown()),
|
|
86
|
+
})
|
|
87
|
+
.strict();
|
|
88
|
+
export const ADOPTION_IMPORT_REJECT_CODES = ["too_large", "invalid_envelope", "duplicate_client_session_id"];
|
|
80
89
|
//# sourceMappingURL=wire.js.map
|
|
@@ -36,8 +36,8 @@ export declare function canAskTransition(from: AskState, to: AskState): boolean;
|
|
|
36
36
|
export declare function canBatchTransition(from: BatchState, to: BatchState): boolean;
|
|
37
37
|
/**
|
|
38
38
|
* `AskRequest.boundInputHash` 的**边界窄读**(唯一一只):ask 身份第四轴的入参那一半与行上 `bound_input_hash` 列(收敛器判据 1 的对账键)读的都是它。
|
|
39
|
-
* core 在闸站铸值(`onAsk({ ...bare, boundInputHash:
|
|
40
|
-
* `
|
|
39
|
+
* core 在闸站铸值(`onAsk({ ...bare, boundInputHash: exactBoundInputHashOf(req.toolName, presented.value), … })`,core 5.15.0 起每一只经 `resolveAsk` 的问都带;
|
|
40
|
+
* 7.63.0 起摘的是 `{ tool, input }`,此前只摘入参);`exactBoundInputHashOf` 不在 core 的公开导出面上(包 `exports` 只有 `.` / `./bench` / `./fixtures`),本服务既算不出也不该算 —— 只原样读。
|
|
41
41
|
* 非字符串 / 空串一律按缺席:一个形不对的摘要比没有摘要更危险(它会让「硬相等」这道门在一个垃圾值上偶然成立)。
|
|
42
42
|
* 钉:`test/stream-approval-on-e2e.test.ts` 件4(正控 / 缺席 / 空串三臂)。
|
|
43
43
|
*/
|