@sema-agent/server 7.132.0 → 7.134.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 +353 -0
- package/README.md +8 -9
- package/README.zh-CN.md +7 -6
- package/USAGE.md +301 -64
- package/deploy/sema-up/README.md +35 -1
- package/deploy/sema-up/chart/Chart.yaml +1 -1
- package/deploy/sema-up/chart/templates/NOTES.txt +15 -0
- package/deploy/sema-up/chart/templates/_helpers.tpl +129 -0
- package/deploy/sema-up/chart/templates/sealed-key.yaml +24 -0
- package/deploy/sema-up/chart/templates/server-v4pro.yaml +19 -2
- package/deploy/sema-up/chart/templates/server.yaml +19 -2
- package/deploy/sema-up/chart/values-full-single.yaml +5 -1
- package/deploy/sema-up/chart/values.yaml +34 -0
- package/deploy/sema-up/stack/compose.yaml +3 -0
- package/deploy/sema-up/stack/sema-stack-cluster.yaml +4 -2
- package/dist/adoption/plan.d.ts +3 -2
- package/dist/adoption/plan.js +7 -5
- package/dist/adoption/runner.js +3 -10
- package/dist/adoption/sql.d.ts +3 -2
- package/dist/adoption/sql.js +3 -5
- package/dist/adoption/wire.d.ts +4 -1
- package/dist/adoption/wire.js +1 -0
- package/dist/approval-ask-audit-store.d.ts +32 -14
- package/dist/approval-ask-audit-store.js +272 -74
- package/dist/approval-ask-machine.d.ts +15 -0
- package/dist/approval-ask-machine.js +6 -0
- package/dist/approval-ask-retention.d.ts +136 -0
- package/dist/approval-ask-retention.js +102 -0
- package/dist/approval-card.d.ts +83 -23
- package/dist/approval-card.js +45 -15
- package/dist/approval-content-kind.d.ts +5 -2
- package/dist/approval-content-kind.js +16 -3
- package/dist/approval-deny-reasons.d.ts +1 -1
- package/dist/approval-gate-currency.d.ts +72 -0
- package/dist/approval-gate-currency.js +94 -0
- package/dist/approval.d.ts +15 -0
- package/dist/approval.js +55 -17
- package/dist/audit.d.ts +27 -10
- package/dist/audit.js +12 -16
- package/dist/bake-runner/main.js +3 -2
- package/dist/boot/coordinators.d.ts +6 -1
- package/dist/boot/coordinators.js +6 -3
- package/dist/boot/deferred-sandbox-path-env.js +1 -1
- package/dist/boot/execution-env.js +9 -7
- package/dist/boot/execution-lane.js +11 -0
- package/dist/boot/leader.d.ts +2 -0
- package/dist/boot/leader.js +4 -1
- package/dist/boot/memory-boundary.js +2 -2
- package/dist/boot/memory-consolidation.d.ts +5 -4
- package/dist/boot/memory-consolidation.js +7 -6
- package/dist/boot/org-delivery.d.ts +28 -0
- package/dist/boot/org-delivery.js +20 -0
- package/dist/boot/read-deny-anchor-audit.js +2 -2
- package/dist/boot/reapers.d.ts +3 -0
- package/dist/boot/reapers.js +21 -1
- package/dist/boot/resolve-spec.d.ts +3 -0
- package/dist/boot/resolve-spec.js +60 -81
- package/dist/boot/runner-deps.d.ts +18 -5
- package/dist/boot/runner-deps.js +10 -0
- package/dist/boot/session-faces.d.ts +1 -0
- package/dist/boot/session-faces.js +4 -2
- package/dist/boot/stage-02-web-admin-pull.js +4 -1
- package/dist/boot/stage-06-runners.d.ts +6 -3
- package/dist/boot/stage-06-runners.js +20 -4
- package/dist/boot/stage-07-capability-layer.d.ts +4 -1
- package/dist/boot/stage-07-capability-layer.js +24 -3
- package/dist/boot/stage-08-reapers.d.ts +4 -1
- package/dist/boot/stage-08-reapers.js +2 -2
- package/dist/boot/stage-09-leader.d.ts +5 -1
- package/dist/boot/stage-09-leader.js +2 -2
- package/dist/boot/stage-10-http-server.d.ts +5 -1
- package/dist/boot/stage-10-http-server.js +6 -6
- package/dist/boot/stores.d.ts +8 -0
- package/dist/boot/stores.js +10 -14
- package/dist/boot/web-admin.d.ts +10 -0
- package/dist/boot/web-admin.js +162 -65
- package/dist/boot/workflow-orchestration.d.ts +2 -0
- package/dist/boot/workflow-orchestration.js +2 -1
- package/dist/brain.js +8 -3
- package/dist/breaker-key.d.ts +6 -0
- package/dist/breaker-key.js +29 -0
- package/dist/budget.js +5 -1
- package/dist/caller-text-echo.d.ts +11 -6
- package/dist/caller-text-echo.js +10 -12
- package/dist/canonical-json.d.ts +2 -41
- package/dist/canonical-json.js +2 -13
- package/dist/capabilities/center-plugins.d.ts +7 -0
- package/dist/capabilities/center-plugins.js +1 -1
- package/dist/capabilities/composite-members.d.ts +1 -1
- package/dist/capabilities/composite-members.js +1 -1
- package/dist/capabilities/execution-lane.js +2 -2
- package/dist/capabilities/hands-lane.d.ts +21 -0
- package/dist/capabilities/hands-lane.js +10 -0
- package/dist/capabilities/mcp-probe.d.ts +36 -4
- package/dist/capabilities/mcp-probe.js +29 -6
- package/dist/capabilities/scenarios.d.ts +63 -7
- package/dist/capabilities/scenarios.js +39 -7
- package/dist/capability-facts.d.ts +36 -4
- package/dist/capability-facts.js +30 -4
- package/dist/center-config-tier.d.ts +69 -0
- package/dist/center-config-tier.js +42 -0
- package/dist/checkpoint-ctx-seal-m28.d.ts +42 -0
- package/dist/checkpoint-ctx-seal-m28.js +19 -0
- package/dist/checkpoint-identity.d.ts +16 -0
- package/dist/checkpoint-identity.js +19 -0
- package/dist/config-catalog.d.ts +17 -10
- package/dist/config-catalog.js +43 -28
- package/dist/config-d-migration.d.ts +3 -1
- package/dist/config-d-migration.js +2 -2
- package/dist/config-dir-trust.d.ts +114 -0
- package/dist/config-dir-trust.js +388 -0
- package/dist/config-invariants.d.ts +18 -5
- package/dist/config-invariants.js +35 -3
- package/dist/config-provider.d.ts +6 -1
- package/dist/config-provider.js +6 -2
- package/dist/config-types.d.ts +71 -14
- package/dist/config-types.js +8 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.js +121 -59
- package/dist/delegated-session-owner.d.ts +185 -0
- package/dist/delegated-session-owner.js +119 -0
- package/dist/device-protocol.d.ts +5 -3
- package/dist/device-protocol.js +1 -1
- package/dist/device-ws-hub.js +21 -2
- package/dist/device-ws-protocol.d.ts +70 -6
- package/dist/device-ws-protocol.js +50 -23
- package/dist/elicitation.js +3 -2
- package/dist/entry-problems.d.ts +34 -0
- package/dist/entry-problems.js +14 -0
- package/dist/execution-lane-caps.d.ts +49 -10
- package/dist/execution-lane-caps.js +43 -4
- package/dist/field-conflict.d.ts +44 -0
- package/dist/field-conflict.js +21 -0
- package/dist/file-history-disclosure.d.ts +34 -5
- package/dist/file-history-disclosure.js +2 -2
- package/dist/fleet/fleet-bus.d.ts +84 -6
- package/dist/fleet/fleet-bus.js +42 -9
- package/dist/hooks/classic-stations.d.ts +10 -5
- package/dist/hooks/classic-stations.js +4 -4
- package/dist/hooks/command-spawn.d.ts +57 -0
- package/dist/hooks/command-spawn.js +139 -0
- package/dist/hooks/hook-llm.js +2 -2
- package/dist/hooks/hook-runner.d.ts +127 -25
- package/dist/hooks/hook-runner.js +668 -287
- package/dist/hooks/hook-source.d.ts +44 -0
- package/dist/hooks/hook-source.js +40 -0
- package/dist/http/active-run-conflict.d.ts +5 -13
- package/dist/http/active-run-conflict.js +17 -27
- package/dist/http/admission.js +111 -60
- package/dist/http/approval-sweeps.js +58 -19
- package/dist/http/caller-trust.d.ts +77 -0
- package/dist/http/caller-trust.js +143 -0
- package/dist/http/checkpoint-ctx.d.ts +173 -18
- package/dist/http/checkpoint-ctx.js +171 -12
- package/dist/http/claimed-run.d.ts +4 -3
- package/dist/http/device-placement.d.ts +2 -4
- package/dist/http/device-placement.js +2 -1
- package/dist/http/dispatch.js +13 -7
- package/dist/http/durable-run-leg.d.ts +4 -32
- package/dist/http/durable-run-leg.js +37 -12
- package/dist/http/idempotency.d.ts +2 -2
- package/dist/http/idempotency.js +2 -2
- package/dist/http/owner-access.d.ts +56 -0
- package/dist/http/owner-access.js +42 -0
- package/dist/http/principal-gate.d.ts +78 -27
- package/dist/http/principal-gate.js +64 -14
- package/dist/http/readiness.d.ts +11 -5
- package/dist/http/readiness.js +10 -3
- package/dist/http/refusal-body.d.ts +12 -0
- package/dist/http/refusal-body.js +11 -0
- package/dist/http/request-guards.d.ts +16 -32
- package/dist/http/request-guards.js +31 -30
- package/dist/http/resume-ctx-read.d.ts +50 -6
- package/dist/http/resume-ctx-read.js +33 -7
- package/dist/http/resume-legs.d.ts +5 -5
- package/dist/http/resume-legs.js +163 -91
- package/dist/http/retired-service-deps.d.ts +43 -0
- package/dist/http/retired-service-deps.js +18 -0
- package/dist/http/route-ctx.d.ts +44 -37
- package/dist/http/route-ctx.js +4 -0
- package/dist/http/route-table.js +2 -0
- package/dist/http/routes/a2a-serve.js +3 -4
- package/dist/http/routes/admin-config-refresh.js +1 -1
- package/dist/http/routes/admin-drain.js +1 -1
- package/dist/http/routes/admin-memory-optout.js +5 -1
- package/dist/http/routes/adoption.js +2 -9
- package/dist/http/routes/agents-roster.js +2 -3
- package/dist/http/routes/approvals-assistant.js +91 -56
- package/dist/http/routes/background.js +3 -2
- package/dist/http/routes/capabilities.js +20 -4
- package/dist/http/routes/config-catalog.d.ts +3 -3
- package/dist/http/routes/config-catalog.js +1 -1
- package/dist/http/routes/devices.js +3 -17
- package/dist/http/routes/diagnostics.d.ts +3 -3
- package/dist/http/routes/diagnostics.js +6 -2
- package/dist/http/routes/fleet.js +4 -4
- package/dist/http/routes/images.js +6 -7
- package/dist/http/routes/leader.js +1 -8
- package/dist/http/routes/mcp-reconnect.d.ts +1 -1
- package/dist/http/routes/mcp-reconnect.js +3 -2
- package/dist/http/routes/memory-bundle.js +1 -1
- package/dist/http/routes/memory-compliance.js +1 -1
- package/dist/http/routes/memory-consolidation.js +1 -1
- package/dist/http/routes/memory-origin.d.ts +1 -1
- package/dist/http/routes/memory-origin.js +1 -1
- package/dist/http/routes/memory-policy.d.ts +1 -1
- package/dist/http/routes/memory-policy.js +3 -2
- package/dist/http/routes/notify-wake.js +8 -21
- package/dist/http/routes/observability.js +2 -2
- package/dist/http/routes/principal-inbox.d.ts +39 -0
- package/dist/http/routes/principal-inbox.js +76 -0
- package/dist/http/routes/retention-ops.js +2 -9
- package/dist/http/routes/rules.js +9 -22
- package/dist/http/routes/runs.d.ts +5 -0
- package/dist/http/routes/runs.js +63 -115
- package/dist/http/routes/session-sync.d.ts +3 -2
- package/dist/http/routes/session-sync.js +53 -48
- package/dist/http/routes/sessions-list.d.ts +1 -1
- package/dist/http/routes/sessions-list.js +3 -4
- package/dist/http/routes/sessions.js +33 -43
- package/dist/http/routes/side-query.js +6 -4
- package/dist/http/routes/tasks.js +71 -30
- package/dist/http/routes/trace-usage.js +7 -9
- package/dist/http/routes/workflows.d.ts +351 -0
- package/dist/http/routes/workflows.js +153 -119
- package/dist/http/run-declared-families.d.ts +16 -0
- package/dist/http/run-declared-families.js +12 -0
- package/dist/http/send.d.ts +24 -3
- package/dist/http/send.js +14 -2
- package/dist/http/server.d.ts +23 -18
- package/dist/http/server.js +20 -15
- package/dist/http/stored-body-replay.js +17 -4
- package/dist/http/submit-ctx.d.ts +4 -3
- package/dist/http/submit-ctx.js +23 -6
- package/dist/http/submit-replay.d.ts +4 -3
- package/dist/http/submit-replay.js +5 -4
- package/dist/http/wire-types.d.ts +17 -10
- package/dist/index.d.ts +3 -1
- package/dist/index.js +1 -1
- package/dist/lane-home-probe.d.ts +78 -9
- package/dist/lane-home-probe.js +78 -12
- package/dist/leader/endpoint.d.ts +4 -1
- package/dist/leader/endpoint.js +11 -10
- package/dist/leader/wire.d.ts +4 -0
- package/dist/leader/wire.js +8 -7
- package/dist/limit-refusal.d.ts +17 -5
- package/dist/limit-refusal.js +4 -1
- package/dist/main.js +1 -1
- package/dist/mcp-assertion-header.d.ts +31 -10
- package/dist/mcp-assertion-header.js +10 -3
- package/dist/memory-origin-fence.js +2 -2
- package/dist/memory-project-layer.d.ts +37 -0
- package/dist/memory-project-layer.js +46 -0
- package/dist/memory-scope.d.ts +23 -16
- package/dist/memory-scope.js +24 -8
- package/dist/memory-sync-client.d.ts +27 -13
- package/dist/memory-sync-client.js +107 -18
- package/dist/model-compat.d.ts +1 -1
- package/dist/model-entry-refusal.d.ts +9 -1
- package/dist/model-entry-refusal.js +6 -1
- package/dist/model-plane-face.d.ts +51 -0
- package/dist/model-plane-face.js +24 -0
- package/dist/model-provider.d.ts +5 -0
- package/dist/model-provider.js +4 -2
- package/dist/model-route-endpoint.d.ts +8 -11
- package/dist/model-route-endpoint.js +4 -7
- package/dist/model-route-env.d.ts +22 -0
- package/dist/model-route-env.js +2 -0
- package/dist/model-route-gap.d.ts +60 -30
- package/dist/model-route-gap.js +21 -15
- package/dist/observability/corrupt-read-seat.d.ts +7 -0
- package/dist/observability/corrupt-read-seat.js +9 -0
- package/dist/observability/err-text.d.ts +6 -0
- package/dist/observability/err-text.js +18 -4
- package/dist/observability/fail-open.d.ts +35 -9
- package/dist/observability/fail-open.js +35 -9
- package/dist/observability/metrics.js +1 -0
- package/dist/observability/prompt-manifest.d.ts +22 -25
- package/dist/observability/prompt-manifest.js +54 -50
- package/dist/observability/tool-trace.js +9 -10
- package/dist/operator-ask.d.ts +10 -0
- package/dist/operator-ask.js +3 -0
- package/dist/orchestration/workflow-agent-session-index.d.ts +12 -12
- package/dist/orchestration/workflow-agent-session-index.js +9 -13
- package/dist/orchestration/workflow-completion-inbox.d.ts +42 -15
- package/dist/orchestration/workflow-completion-inbox.js +13 -0
- package/dist/orchestration/workflow-notify-journal.d.ts +13 -32
- package/dist/orchestration/workflow-notify-journal.js +27 -34
- package/dist/orchestration/workflow-park-decision.d.ts +89 -0
- package/dist/orchestration/workflow-park-decision.js +119 -0
- package/dist/org-delivery-gate.d.ts +81 -0
- package/dist/org-delivery-gate.js +59 -0
- package/dist/panel-tool-names.d.ts +23 -0
- package/dist/panel-tool-names.js +8 -0
- package/dist/parked-decide.d.ts +43 -11
- package/dist/parked-decide.js +100 -51
- package/dist/parked-revive-surface.d.ts +9 -2
- package/dist/parked-revive-surface.js +11 -8
- package/dist/permission-rule-list.d.ts +1 -1
- package/dist/permission-rule-list.js +2 -2
- package/dist/permission-rule-vocab.d.ts +1 -23
- package/dist/permission-rule-vocab.js +0 -13
- package/dist/plugins/approval-ask-store-file.d.ts +16 -1
- package/dist/plugins/approval-ask-store-file.js +21 -0
- package/dist/plugins/approval-ask-store-memory.d.ts +18 -1
- package/dist/plugins/approval-ask-store-memory.js +34 -2
- package/dist/plugins/approval-ask-store-sql.d.ts +25 -0
- package/dist/plugins/approval-ask-store-sql.js +37 -1
- package/dist/plugins/approval-payload-fingerprint.d.ts +14 -6
- package/dist/plugins/approval-payload-fingerprint.js +1 -1
- package/dist/plugins/blob-backend.d.ts +38 -25
- package/dist/plugins/blob-backend.js +29 -19
- package/dist/plugins/breaker-state-sql.d.ts +2 -2
- package/dist/plugins/breaker-state-sql.js +4 -4
- package/dist/plugins/caching-session-store.d.ts +4 -1
- package/dist/plugins/caching-session-store.js +7 -3
- package/dist/plugins/checkpoint-store-sql.d.ts +36 -1
- package/dist/plugins/checkpoint-store-sql.js +65 -3
- package/dist/plugins/file-history-store-sql.d.ts +5 -2
- package/dist/plugins/file-history-store-sql.js +3 -1
- package/dist/plugins/file-run-store.d.ts +5 -13
- package/dist/plugins/file-run-store.js +9 -0
- package/dist/plugins/fork-routing-session-store.d.ts +9 -1
- package/dist/plugins/fork-routing-session-store.js +12 -1
- package/dist/plugins/host-platform.d.ts +2 -0
- package/dist/plugins/host-platform.js +2 -1
- package/dist/plugins/local-checkpoint-store.d.ts +15 -2
- package/dist/plugins/local-checkpoint-store.js +32 -1
- package/dist/plugins/local-session-store.d.ts +13 -10
- package/dist/plugins/local-session-store.js +23 -14
- package/dist/plugins/local-session-window.d.ts +45 -0
- package/dist/plugins/local-session-window.js +38 -0
- package/dist/plugins/mailbox-recipient-lifecycle.d.ts +3 -2
- package/dist/plugins/mailbox-store-sql.d.ts +30 -48
- package/dist/plugins/mailbox-store-sql.js +77 -52
- package/dist/plugins/memory-embedder-fingerprint.js +2 -1
- package/dist/plugins/memory-run-store.d.ts +5 -13
- package/dist/plugins/memory-run-store.js +8 -0
- package/dist/plugins/one-time-migrations.d.ts +121 -5
- package/dist/plugins/one-time-migrations.js +332 -8
- package/dist/plugins/org-delivery-quota-store.d.ts +123 -0
- package/dist/plugins/org-delivery-quota-store.js +228 -0
- package/dist/plugins/permission-rule-store-file.js +10 -6
- package/dist/plugins/permission-rule-store-sql.js +8 -8
- package/dist/plugins/pg-pool.js +39 -7
- package/dist/plugins/pg-session-storage.d.ts +18 -5
- package/dist/plugins/pg-session-storage.js +68 -23
- package/dist/plugins/remote-env-adb.d.ts +6 -12
- package/dist/plugins/remote-env-adb.js +12 -2
- package/dist/plugins/remote-env-device.d.ts +14 -7
- package/dist/plugins/remote-env-device.js +23 -15
- package/dist/plugins/remote-env-k8s.d.ts +8 -12
- package/dist/plugins/remote-env-k8s.js +23 -5
- package/dist/plugins/remote-env-local-docker.d.ts +10 -15
- package/dist/plugins/remote-env-local-docker.js +12 -9
- package/dist/plugins/remote-env-ssh.d.ts +10 -16
- package/dist/plugins/remote-env-ssh.js +17 -11
- package/dist/plugins/run-store-sql.d.ts +16 -14
- package/dist/plugins/run-store-sql.js +22 -2
- package/dist/plugins/schema-indexes.js +2 -0
- package/dist/plugins/send-user-file.js +2 -2
- package/dist/plugins/session-epoch-anchor.d.ts +32 -6
- package/dist/plugins/session-epoch-anchor.js +2 -3
- package/dist/plugins/session-ownership.d.ts +11 -0
- package/dist/plugins/session-ownership.js +11 -0
- package/dist/plugins/session-placement.d.ts +12 -14
- package/dist/plugins/session-placement.js +2 -15
- package/dist/plugins/session-store.d.ts +18 -8
- package/dist/plugins/session-store.js +15 -4
- package/dist/plugins/sql-driver.d.ts +74 -11
- package/dist/plugins/sql-driver.js +210 -12
- package/dist/plugins/sql-errors.d.ts +23 -0
- package/dist/plugins/sql-errors.js +21 -0
- package/dist/plugins/store-backend.d.ts +36 -1
- package/dist/plugins/store-backend.js +40 -14
- package/dist/plugins/store-contracts.d.ts +42 -0
- package/dist/plugins/store-contracts.js +1 -0
- package/dist/plugins/tidb-pool.d.ts +6 -1
- package/dist/plugins/tidb-pool.js +44 -10
- package/dist/plugins/tidb-session-storage.d.ts +3 -2
- package/dist/plugins/tidb-session-storage.js +2 -2
- package/dist/plugins/tidb-session-store.d.ts +25 -5
- package/dist/plugins/tidb-session-store.js +67 -21
- package/dist/plugins/workflow-journal-store-sql.d.ts +73 -19
- package/dist/plugins/workflow-journal-store-sql.js +19 -6
- package/dist/plugins/workflow-run-store-sql.d.ts +30 -8
- package/dist/plugins/workflow-run-store-sql.js +50 -9
- package/dist/posture-source.d.ts +18 -10
- package/dist/posture-source.js +4 -1
- package/dist/project-identity.d.ts +45 -6
- package/dist/project-identity.js +162 -8
- package/dist/project-layer-key.d.ts +28 -0
- package/dist/project-layer-key.js +29 -0
- package/dist/question.js +3 -2
- package/dist/read-deny-entry.d.ts +25 -0
- package/dist/read-deny-entry.js +12 -0
- package/dist/read-face-posture.d.ts +37 -11
- package/dist/read-face-posture.js +32 -3
- package/dist/request-key-closure.d.ts +7 -0
- package/dist/request-key-closure.js +9 -1
- package/dist/request-tool-axes.d.ts +12 -0
- package/dist/request-tool-axes.js +20 -0
- package/dist/request-value-closure.d.ts +5 -0
- package/dist/request-value-closure.js +11 -3
- package/dist/rule-entry-list.d.ts +26 -2
- package/dist/rule-entry-list.js +72 -12
- package/dist/rules-consent.js +3 -4
- package/dist/run-acceptance.d.ts +19 -3
- package/dist/run-acceptance.js +13 -1
- package/dist/run-local.js +37 -6
- package/dist/runs.d.ts +12 -10
- package/dist/runs.js +25 -6
- package/dist/runtime-caps-resolver.d.ts +16 -6
- package/dist/runtime-caps-resolver.js +18 -5
- package/dist/sandbox-pkg-source.d.ts +19 -1
- package/dist/sandbox-pkg-source.js +29 -7
- package/dist/sealed-key.d.ts +32 -0
- package/dist/sealed-key.js +55 -1
- package/dist/security.d.ts +95 -15
- package/dist/security.js +52 -9
- package/dist/session-error-wire.d.ts +31 -7
- package/dist/session-error-wire.js +9 -2
- package/dist/session-sync-kernel.d.ts +37 -10
- package/dist/session-sync-kernel.js +10 -0
- package/dist/session-titled-frame.d.ts +33 -0
- package/dist/session-titled-frame.js +4 -0
- package/dist/session-titler.d.ts +9 -1
- package/dist/session-titler.js +15 -4
- package/dist/spec-fields.js +21 -2
- package/dist/sql-engine-posture.d.ts +3 -1
- package/dist/task-a2a.js +4 -3
- package/dist/task-cwd.d.ts +1 -1
- package/dist/task-mcp.d.ts +5 -5
- package/dist/task-mcp.js +27 -74
- package/dist/task-settings.d.ts +93 -88
- package/dist/task-settings.js +71 -63
- package/dist/text-bidi.d.ts +0 -4
- package/dist/text-bidi.js +1 -3
- package/dist/tighten-only-seats.d.ts +150 -0
- package/dist/tighten-only-seats.js +196 -0
- package/dist/tool-approval.d.ts +451 -136
- package/dist/tool-approval.js +733 -256
- package/dist/tool-rule-names.d.ts +6 -0
- package/dist/trace/core-keyset-guard.d.ts +108 -25
- package/dist/trace/exit-seat.d.ts +40 -0
- package/dist/trace/exit-seat.js +130 -0
- package/dist/trace/ledger-events.d.ts +6 -3
- package/dist/trace/project.d.ts +98 -13
- package/dist/trace/project.js +57 -32
- package/dist/trace/projection-table.d.ts +100 -0
- package/dist/trace/projection-table.js +130 -0
- package/dist/trace/redact.d.ts +57 -0
- package/dist/trace/redact.js +962 -168
- package/dist/trace/self-minted-wire.d.ts +349 -1
- package/dist/trace/self-minted-wire.js +118 -1
- package/dist/trace/wire-projection-faces.d.ts +304 -2
- package/dist/trace/wire-projection-faces.js +160 -13
- package/dist/url-refusal.js +2 -0
- package/dist/web-admin-client/apply-effective.d.ts +12 -0
- package/dist/web-admin-client/apply-effective.js +56 -5
- package/dist/web-admin-client/facade.d.ts +1 -1
- package/dist/web-admin-client/facade.js +1 -1
- package/dist/web-admin-client/read-face.js +5 -9
- package/dist/web-admin-client/skills-mcp.d.ts +1 -1
- package/dist/web-admin-client/skills-mcp.js +6 -8
- package/dist/web-admin-client/types.d.ts +1 -1
- package/docs/DEVICE-EXECUTOR-PROTOCOL.md +57 -9
- package/package.json +8 -4
- package/scripts/drain-check-local.mjs +34 -2
- package/scripts/drain-check.mysql.sql +20 -2
- package/scripts/drain-check.pg.sql +20 -2
- package/dist/mcp-tool-faces.d.ts +0 -69
- package/dist/mcp-tool-faces.js +0 -106
package/deploy/sema-up/README.md
CHANGED
|
@@ -62,7 +62,7 @@ summary 会打印手动接法。
|
|
|
62
62
|
| `--gateway=URL` | — | 模型网关 baseURL(OpenAI 兼容);带 agent 的档必需 |
|
|
63
63
|
| `--model=ID` | `deepseek-v4-flash` | 模型 id |
|
|
64
64
|
| `--model-key=K` | — | 模型 API key(也可 -f 里 MODEL_API_KEY) |
|
|
65
|
-
| `--sandbox=LANE` |
|
|
65
|
+
| `--sandbox=LANE` | 按 `--users` 取表缺省(见下「执行车道」) | **执行车道**=agent 的手落在哪里,不点名就是没有手。词表、缺省、各车道运维自备的键、已退役的词都在下面「执行车道」一节(由车道表生成,单一属主=`lib/lanes.json`)。kube 路径(full-cluster)**不选词**:runtime 按 runtimeClass `kata-qemu` 在不在自动定 |
|
|
66
66
|
| `--registry=true\|false` | `true`(local-plus `false`) | 配置中心网站开关;**只收 `true` / `false`**(`yes` / `1` / `on` 在建任何目录之前拒 —— 7.104.0 之前它们被静默当成关) |
|
|
67
67
|
| `--registry-image=REF` | — | sema-registry 镜像(registry=true 必需) |
|
|
68
68
|
| `--git=MODE` | `none` | `none`/`provision`/`connect` |
|
|
@@ -78,6 +78,24 @@ summary 会打印手动接法。
|
|
|
78
78
|
| `--teardown` / `--teardown-volumes` | — | 卸载(留数据 / 连卷删) |
|
|
79
79
|
| `--skip-preflight` | — | 跳过预检(不建议) |
|
|
80
80
|
|
|
81
|
+
### 执行车道(`--sandbox`)
|
|
82
|
+
|
|
83
|
+
<!-- @generated-begin sandbox-lanes -->
|
|
84
|
+
本节由车道表 `lib/lanes.json` 生成(仓内门禁保证与表逐字一致),不要手改。
|
|
85
|
+
|
|
86
|
+
**执行车道**=agent 的手落在哪里,不点名就是没有手。`--sandbox` 只在 compose 路径(full-single / local-plus)选词;kube 路径(full-cluster)**不选词**。不点名时按 `--users` 取表里第一条允许该租户形的词:`--users=single` → `host`;`--users=multi` → `e2b-cloud`。
|
|
87
|
+
|
|
88
|
+
- **`host`**(compose 路径) — 可选 `--users`:`single`;落盘 `REMOTE_EXEC=host`;运维自备的键:无;隔离:`unsupported`。server 容器本身就是沙箱:agent 的手落在这只容器里(worktree 隔离在、OS 级隔离不在)。只给单用户 —— 多租户下一个租户的输入会把手指向另一个租户的文件与进程。
|
|
89
|
+
- **`e2b-cloud`**(compose 路径) — 可选 `--users`:`single` / `multi`;落盘 `REMOTE_EXEC=e2b`;运维自备的键:`E2B_API_KEY`;隔离:`supported`。E2B 云沙箱:每任务一只 microVM。E2B_API_KEY 由运维自备(sema-up 只登记键名,绝不写值)。
|
|
90
|
+
- **kube 路径(不选词)** — 可选 `--users`:`single` / `multi`;落盘 `REMOTE_EXEC=k8s`;运维自备的键:`K8S_SANDBOX_IMAGE`;隔离:`supported`。kube 路径**不选词**:runtime 由 kube-up.sh 按 runtimeClass `kata-qemu` 在不在自动定(在 ⇒ kata VM,不在 ⇒ runc 容器),沙箱镜像由 chart/清单给。本行只为对表(能力表 / 必需键 / REQUIRE_EXECUTION_LANE 三面),不进 --sandbox 词表。
|
|
91
|
+
|
|
92
|
+
已退役的词(收到即非零退出并指路):
|
|
93
|
+
|
|
94
|
+
- **`kata`** — 已退役。compose 路径对 kata 零接线:选了它 .env 里不会出现任何 REMOTE_EXEC,core 落 StubExecutionEnv ⇒ 起来的 worker 一只手都没有。有 KVM 的机器上它还曾是默认值,所以这是最贵的一个死词。 改用:要 VM 级隔离走 kube 路径:sema-up.sh --profile=full-cluster(runtimeClass kata-qemu 在场即自动用 kata,不在场退 runc);留在单机 compose 上就选 host 或 e2b-cloud。
|
|
95
|
+
- **`runc`** — 已退役。同 kata:compose 路径对它零接线,选了等于没选车道(无手)。 改用:单机 compose 上「容器隔离」的真形就是 host(server 容器自己);要独立沙箱容器走 kube 路径 --profile=full-cluster。
|
|
96
|
+
- **`e2b-self`** — 已退役。自托管 E2B 端点从未接线:它只在 preflight 文案与 machines.yaml 模板里出现过,没有任何一处把它翻成 REMOTE_EXEC。 改用:先用 e2b-cloud(填 E2B_API_KEY);自托管端点的接线尚未排期。
|
|
97
|
+
<!-- @generated-end sandbox-lanes -->
|
|
98
|
+
|
|
81
99
|
### 取值旗的形(7.104.0)
|
|
82
100
|
|
|
83
101
|
一条规则:**每只取值旗都过形判**,不合 ⇒ 在建任何目录、写任何文件之前非零退出,拒句点名旗、收到的值、合法形。
|
|
@@ -136,6 +154,22 @@ data-center:2c/2G/20G)以下 BLOCK——确实无法稳定部署,提前警告不
|
|
|
136
154
|
- **MinIO**:钉死的 tag(`minio/minio:RELEASE.…`,chart / cluster 静态清单 / compose 三份同值;k8s `imagePullPolicy: IfNotPresent`,不再 `:latest` + `Always`)。换源 = 换整条引用:
|
|
137
155
|
compose 与 kube-up 读环境变量 `MINIO_IMAGE`(kube-up 给了才递给 chart),chart 直接 `--set minio.image=<源>/minio/minio:<tag>`(预灌镜像的节点 `--set minio.pullPolicy=Never`)。
|
|
138
156
|
|
|
157
|
+
## 停驻钥匙的持久卷(helm 图表的 `sealedKey` 块)
|
|
158
|
+
|
|
159
|
+
server 的 `<数据根>/sealed-key/` 存着停驻任务续跑上下文里请求凭据的封签钥匙(子目录 `checkpoint-ctx-keys/`)和模型钥匙 —— 私钥只在这个目录里、不进库。
|
|
160
|
+
图表(`kube-up.sh` 的 `--kube=existing|k3s`、`cluster-up.sh` 的 `STACK_ENGINE=helm`)缺省把整个目录挂成一只 PVC(`sealedKey.persistence.enabled: true`),
|
|
161
|
+
容器内路径 `/root/.ai-agent/sealed-key`,主 worker 与启用的 `serverV4pro` 共用:重启与换副本都不丢钥匙,停驻的任务照常续跑。
|
|
162
|
+
|
|
163
|
+
- **访问模式缺省随共享这只卷的 pod 数**:`server.replicas`(加上启用的 `serverV4pro.replicas`)为 1 ⇒ `ReadWriteOnce`,多于 1 ⇒ `ReadWriteMany`,**要集群的存储类支持 RWX**
|
|
164
|
+
(Longhorn 走 NFS 共享管理器、每个节点要装 NFS 客户端;`local-path` 与多数云盘类不支持 ⇒ PVC 一直 Pending、server Pod 起不来)。点名存储类:`--set sealedKey.persistence.storageClass=<支持 RWX 的类>`。
|
|
165
|
+
单节点多副本(pod 都在同一个节点)用 `--set sealedKey.persistence.accessMode=ReadWriteOnce` 显式盖(随包的 `values-full-single.yaml` 就这么写)。
|
|
166
|
+
有效访问模式是 `ReadWriteOnce` 时 Deployment 用 `Recreate`(RWO 卷同时只能被一个节点挂,滚动更新的新 Pod 落在别的节点就永远等不到卷;代价是升级窗口内短暂没有副本)。
|
|
167
|
+
- **没有 RWX 的集群**:`--set server.replicas=1`,或单节点多副本盖 RWO(上一条),或关持久 `--set sealedKey.persistence.enabled=false` —— 关掉时图表**显式**给每只 worker 设 `DURABLE_APPROVAL=false`
|
|
168
|
+
(耐久审批整条关,不产生续不了的停驻行;`helm install` 打印的安装说明里也有这一句),且同时配 `server.durableApproval=true` 渲染即拒。
|
|
169
|
+
- **首装是空卷**:多个 pod 并发首启会各自生成一把钥匙、各持自己那一把;装好后 `kubectl -n <ns> rollout restart deploy/sema-server`(启用 `serverV4pro` 时再加 `deploy/sema-server-v4pro`)一次,之后每个 pod 读到全部钥匙。
|
|
170
|
+
- PVC 的 `accessModes` 建好后不可改:副本数跨过 1 的边界时 `helm upgrade` 会撞「spec is immutable」;卷里是私钥,换卷前先结掉停驻行或备份钥匙文件。
|
|
171
|
+
PVC 带 `helm.sh/resource-policy: keep`:`helm uninstall` 与把 `enabled` 改成 `false` 的 upgrade 都不删它(确认不要了再 `kubectl -n <ns> delete pvc sema-server-sealed-key`)。
|
|
172
|
+
|
|
139
173
|
## 凭据纪律
|
|
140
174
|
|
|
141
175
|
全部凭据生成一次、落 `~/.sema-up/<project>/.env`(0600),重跑**绝不轮换**;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{{- $persist := eq (include "sema.sealedKey.enabled" .) "true" }}
|
|
2
|
+
{{- if $persist }}
|
|
3
|
+
停驻封签钥匙:server 的 <数据根>/sealed-key/ 在持久卷 {{ include "sema.sealedKey.claimName" . }}(挂在容器内 {{ include "sema.sealedKey.mountPath" . }},{{ include "sema.sealedKey.accessMode" . }}),重启与换副本都不丢钥匙,停驻的任务照常续跑。PVC 带 helm.sh/resource-policy: keep(helm uninstall 与把 sealedKey.persistence.enabled 改成 false 的 upgrade 都不删它)。
|
|
4
|
+
{{- if eq (include "sema.sealedKey.accessMode" .) "ReadWriteOnce" }}
|
|
5
|
+
有效访问模式是 ReadWriteOnce,server / serverV4pro 的 Deployment 用 Recreate 更新策略(RWO 卷同时只能被一个节点挂,滚动更新的新 Pod 落在别的节点会一直等不到卷;代价是升级窗口内短暂没有副本)。
|
|
6
|
+
{{- end }}
|
|
7
|
+
{{- if eq (include "sema.sealedKey.accessMode" .) "ReadWriteMany" }}
|
|
8
|
+
多个 pod 共用这只卷,存储类必须支持 ReadWriteMany(PVC 一直 Pending 就是它不支持:出路 server.replicas=1,或 sealedKey.persistence.enabled=false 并接受耐久审批随之关)。
|
|
9
|
+
{{- end }}
|
|
10
|
+
{{- if gt (int (include "sema.sealedKey.podCount" .)) 1 }}
|
|
11
|
+
首装是空卷:多个副本并发首启会各自生成一把钥匙、各持自己那一把 —— 装好后执行一次 kubectl -n {{ .Release.Namespace }} rollout restart deploy/sema-server{{ if .Values.serverV4pro.enabled }} deploy/sema-server-v4pro{{ end }},此后每个副本读到目录里的全部钥匙。
|
|
12
|
+
{{- end }}
|
|
13
|
+
{{- else }}
|
|
14
|
+
停驻封签钥匙:sealedKey.persistence.enabled=false —— 不建卷,图表已给每只 worker 显式设上 DURABLE_APPROVAL=false(耐久审批整条关,不产生续不了的停驻行;代价见 values.yaml 的 sealedKey 块;要重新打开,把它改回 true)。关持久 + 提交体没声明 settings.approvalFrameFamilies 的客户端 ⇒ 受门工具当场拒(没有耐久店,无处停驻;7.134.0 起审批卡只发给声明认得这一族的客户端)。
|
|
15
|
+
{{- end }}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
{{- /*
|
|
2
|
+
sealedKey 持久块的助手 —— 卷名 / 挂载路径 / 共享 pod 数 / 访问模式 / 耐久审批的渲值,各一处定义,主 worker(server.yaml)与
|
|
3
|
+
v4pro 变体(server-v4pro.yaml)同调,不各抄一份。
|
|
4
|
+
|
|
5
|
+
这是什么:server 的数据根下 `sealed-key/` 目录存两样东西 —— 模型钥匙(web-admin 贴的 `sealedApiKey` 的解封私钥)与停驻任务续跑上下文里
|
|
6
|
+
请求凭据的封签钥匙(子目录 `checkpoint-ctx-keys/`)。私钥只在这个目录里(不进库),所以它要**跨重启持久**、**每个副本是同一份**:
|
|
7
|
+
不持久 ⇒ 每次重启换钥匙,重启前停驻、带请求凭据的任务续跑恒 409 conflict.checkpoint_ctx_unsealable(reason key_not_held);
|
|
8
|
+
多副本各一份 ⇒ A 副本停驻的任务在 B 副本上同一个结局。
|
|
9
|
+
|
|
10
|
+
路径:镜像以 root 跑、本图表不设 LOCAL_DATA_ROOT / CONFIG_LOCAL_DIR / AGENT_DATA_DIR ⇒ 数据根是缺省 ~/.ai-agent = /root/.ai-agent。
|
|
11
|
+
给部署另设了数据根变量的人:挂载路径要跟着移(本图表不替部署设这几个变量)。
|
|
12
|
+
*/ -}}
|
|
13
|
+
|
|
14
|
+
{{- /* 卷 / PVC 的名字。 */ -}}
|
|
15
|
+
{{- define "sema.sealedKey.claimName" -}}sema-server-sealed-key{{- end -}}
|
|
16
|
+
|
|
17
|
+
{{- /* 容器内挂载点 = <数据根>/sealed-key(整个目录:模型钥匙 + checkpoint-ctx-keys/ 同一卷)。 */ -}}
|
|
18
|
+
{{- define "sema.sealedKey.mountPath" -}}/root/.ai-agent/sealed-key{{- end -}}
|
|
19
|
+
|
|
20
|
+
{{- /*
|
|
21
|
+
持久开关,且**只收布尔**:`--set-string ...enabled=false` / values 里带引号的 "false" 是字符串,模板里字符串恒为真 ⇒ 会静默保持持久开,
|
|
22
|
+
与写的人的意思相反,所以非布尔渲染即拒。输出 "true" / "false"。
|
|
23
|
+
*/ -}}
|
|
24
|
+
{{- define "sema.sealedKey.enabled" -}}
|
|
25
|
+
{{- $v := .Values.sealedKey.persistence.enabled -}}
|
|
26
|
+
{{- if not (kindIs "bool" $v) -}}
|
|
27
|
+
{{- fail (printf "sealedKey.persistence.enabled must be a boolean (true or false), got %s %q — a string such as \"false\" is truthy in a template and would silently keep the volume on" (kindOf $v) (toString $v)) -}}
|
|
28
|
+
{{- end -}}
|
|
29
|
+
{{- $v -}}
|
|
30
|
+
{{- end -}}
|
|
31
|
+
|
|
32
|
+
{{- /* 一只 Deployment 的副本数:缺省(null,k8s 按 1 只起)不当 0 只数;其余按整数。 */ -}}
|
|
33
|
+
{{- define "sema.sealedKey.replicasOf" -}}
|
|
34
|
+
{{- if kindIs "invalid" . -}}1{{- else -}}{{- int . -}}{{- end -}}
|
|
35
|
+
{{- end -}}
|
|
36
|
+
|
|
37
|
+
{{- /* 共享这只卷的 pod 数:主 worker 的副本数 + 启用的 v4pro 变体的副本数(两者读同一个库里的停驻行,所以挂同一只卷)。 */ -}}
|
|
38
|
+
{{- define "sema.sealedKey.podCount" -}}
|
|
39
|
+
{{- $n := int (include "sema.sealedKey.replicasOf" .Values.server.replicas) -}}
|
|
40
|
+
{{- if .Values.serverV4pro.enabled -}}
|
|
41
|
+
{{- $n = add $n (int (include "sema.sealedKey.replicasOf" .Values.serverV4pro.replicas)) -}}
|
|
42
|
+
{{- end -}}
|
|
43
|
+
{{- $n -}}
|
|
44
|
+
{{- end -}}
|
|
45
|
+
|
|
46
|
+
{{- /*
|
|
47
|
+
访问模式:`sealedKey.persistence.accessMode` 留空 = 随共享 pod 数派生(一只 ReadWriteOnce,多只 ReadWriteMany —— 要集群的存储类支持 RWX,见 values.yaml sealedKey 块);
|
|
48
|
+
写了 ReadWriteOnce / ReadWriteMany = 显式盖。显式盖的用处:单节点、多副本 —— 所有 pod 在同一个节点上,RWO 就够,不必为它给节点装 NFS 客户端;
|
|
49
|
+
盖成 RWO 而 pod 其实会落在不同节点是写的人的前提(新 Pod 会卡在「卷被别的节点挂着」)。其它词渲染即拒。
|
|
50
|
+
*/ -}}
|
|
51
|
+
{{- define "sema.sealedKey.accessMode" -}}
|
|
52
|
+
{{- $raw := .Values.sealedKey.persistence.accessMode -}}
|
|
53
|
+
{{- $m := "" -}}
|
|
54
|
+
{{- if not (kindIs "invalid" $raw) -}}
|
|
55
|
+
{{- $m = toString $raw -}}
|
|
56
|
+
{{- end -}}
|
|
57
|
+
{{- if not (has $m (list "" "ReadWriteOnce" "ReadWriteMany")) -}}
|
|
58
|
+
{{- fail (printf "sealedKey.persistence.accessMode must be empty (derive from the number of pods sharing the volume), \"ReadWriteOnce\" or \"ReadWriteMany\", got %q" $m) -}}
|
|
59
|
+
{{- end -}}
|
|
60
|
+
{{- if ne $m "" -}}
|
|
61
|
+
{{- $m -}}
|
|
62
|
+
{{- else if gt (int (include "sema.sealedKey.podCount" .)) 1 -}}
|
|
63
|
+
ReadWriteMany
|
|
64
|
+
{{- else -}}
|
|
65
|
+
ReadWriteOnce
|
|
66
|
+
{{- end -}}
|
|
67
|
+
{{- end -}}
|
|
68
|
+
|
|
69
|
+
{{- /*
|
|
70
|
+
Deployment 的更新策略:有效访问模式是 ReadWriteOnce ⇒ `Recreate`(`nindent 2` 接在 `replicas:` 之后)。RWO 卷同时只能被一个节点挂,默认的滚动更新先起新 Pod、
|
|
71
|
+
旧 Pod 要等新 Pod 就绪才放卷 —— 新 Pod 落在别的节点就永远等不到卷。代价:升级窗口内这一只 Deployment 短暂没有副本(只有一只 pod 的形本来就没有别的副本可接)。
|
|
72
|
+
RWX 与持久关闭不碰策略。
|
|
73
|
+
*/ -}}
|
|
74
|
+
{{- define "sema.sealedKey.strategy" -}}
|
|
75
|
+
{{- /* 访问模式先取(取值即校验):持久关闭时写了非闭集词也拒,「其它词渲染即拒」不看开关。 */ -}}
|
|
76
|
+
{{- $mode := include "sema.sealedKey.accessMode" . -}}
|
|
77
|
+
{{- if and (eq (include "sema.sealedKey.enabled" .) "true") (eq $mode "ReadWriteOnce") -}}
|
|
78
|
+
strategy: { type: Recreate }
|
|
79
|
+
{{- end -}}
|
|
80
|
+
{{- end -}}
|
|
81
|
+
|
|
82
|
+
{{- /*
|
|
83
|
+
`server.durableApproval`(耐久审批,env DURABLE_APPROVAL)渲给 worker 的值:"" = 不渲(开关归引擎按姿态定),"true" / "false" = 显式。
|
|
84
|
+
布尔与字符串写法同义;其它词渲染即拒。持久被关(sealedKey.persistence.enabled=false)⇒ 固定 "false" —— 钥匙跨不过重启,耐久审批铸出来的停驻行
|
|
85
|
+
就是续不了的行,所以图表替部署**显式**关掉它(不是靠引擎的缺省碰巧关);同一份 values 又把它点名成 true ⇒ 渲染即拒,两个键各说各的就是矛盾。
|
|
86
|
+
`kindIs "invalid"` 判 nil(`--set server.durableApproval=null` 删键):不能用 `default ""` —— 布尔 false 在 `default` 里算空,会把显式 false 吞成「没表态」。
|
|
87
|
+
*/ -}}
|
|
88
|
+
{{- define "sema.durableApproval" -}}
|
|
89
|
+
{{- $raw := .Values.server.durableApproval -}}
|
|
90
|
+
{{- $want := "" -}}
|
|
91
|
+
{{- if not (kindIs "invalid" $raw) -}}
|
|
92
|
+
{{- $want = lower (trim (toString $raw)) -}}
|
|
93
|
+
{{- end -}}
|
|
94
|
+
{{- if not (has $want (list "" "true" "false")) -}}
|
|
95
|
+
{{- fail (printf "server.durableApproval must be \"true\", \"false\" or empty (empty = the engine decides by posture), got %q" $want) -}}
|
|
96
|
+
{{- end -}}
|
|
97
|
+
{{- if eq (include "sema.sealedKey.enabled" .) "true" -}}
|
|
98
|
+
{{- $want -}}
|
|
99
|
+
{{- else -}}
|
|
100
|
+
{{- if eq $want "true" -}}
|
|
101
|
+
{{- fail "server.durableApproval=true cannot be combined with sealedKey.persistence.enabled=false: durable approvals park tasks whose request credentials are sealed under keys kept in the sealed-key volume, and without that volume every restart replaces the keys so no parked task could resume. Keep sealedKey.persistence.enabled=true (the default), or drop server.durableApproval (with persistence off the chart sets DURABLE_APPROVAL=false itself)" -}}
|
|
102
|
+
{{- end -}}
|
|
103
|
+
false
|
|
104
|
+
{{- end -}}
|
|
105
|
+
{{- end -}}
|
|
106
|
+
|
|
107
|
+
{{- /* worker 容器 env 里的耐久审批一条(`nindent 12` 之后接在 env 列表里);值为空 ⇒ 什么都不出。 */ -}}
|
|
108
|
+
{{- define "sema.sealedKey.env" -}}
|
|
109
|
+
{{- with (include "sema.durableApproval" .) -}}
|
|
110
|
+
- { name: DURABLE_APPROVAL, value: {{ . | quote }} }
|
|
111
|
+
{{- end -}}
|
|
112
|
+
{{- end -}}
|
|
113
|
+
|
|
114
|
+
{{- /* worker 容器的 volumeMounts 块(`nindent 10`);持久关 ⇒ 什么都不出。 */ -}}
|
|
115
|
+
{{- define "sema.sealedKey.volumeMounts" -}}
|
|
116
|
+
{{- if eq (include "sema.sealedKey.enabled" .) "true" -}}
|
|
117
|
+
volumeMounts:
|
|
118
|
+
- { name: sealed-key, mountPath: {{ include "sema.sealedKey.mountPath" . | quote }} }
|
|
119
|
+
{{- end -}}
|
|
120
|
+
{{- end -}}
|
|
121
|
+
|
|
122
|
+
{{- /* Pod 的 volumes 块(`nindent 6`);持久关 ⇒ 什么都不出。 */ -}}
|
|
123
|
+
{{- define "sema.sealedKey.volumes" -}}
|
|
124
|
+
{{- if eq (include "sema.sealedKey.enabled" .) "true" -}}
|
|
125
|
+
volumes:
|
|
126
|
+
- name: sealed-key
|
|
127
|
+
persistentVolumeClaim: { claimName: {{ include "sema.sealedKey.claimName" . }} }
|
|
128
|
+
{{- end -}}
|
|
129
|
+
{{- end -}}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# ── 停驻封签钥匙的持久卷(sealedKey.persistence.enabled,缺省开)──────────────────────────
|
|
2
|
+
# server 的 <数据根>/sealed-key/ 整个目录(模型钥匙 + 子目录 checkpoint-ctx-keys/ 的停驻行封签钥匙)挂这一只 PVC,
|
|
3
|
+
# 主 worker 与启用的 v4pro 变体共用。私钥只在这里(不进库):卷丢了,封在停驻行里的请求凭据就开不开。
|
|
4
|
+
# 访问模式随共享这只卷的 pod 数(助手 sema.sealedKey.accessMode):一只 ReadWriteOnce,多只 ReadWriteMany(要集群的存储类支持 RWX)。
|
|
5
|
+
# ⚠ PVC 的 accessModes 建好后不可改:副本数跨过 1 的边界(1 ⇄ 多)会让升级撞「spec is immutable」—— 响亮,不静默;见 values.yaml sealedKey 块。
|
|
6
|
+
# 有效访问模式是 ReadWriteOnce 时 server / v4pro 两只 Deployment 用 Recreate(助手 sema.sealedKey.strategy)。
|
|
7
|
+
{{- if eq (include "sema.sealedKey.enabled" .) "true" }}
|
|
8
|
+
apiVersion: v1
|
|
9
|
+
kind: PersistentVolumeClaim
|
|
10
|
+
metadata:
|
|
11
|
+
name: {{ include "sema.sealedKey.claimName" . }}
|
|
12
|
+
namespace: {{ .Release.Namespace }}
|
|
13
|
+
annotations:
|
|
14
|
+
# 卷里是私钥:丢了,库里停驻行的请求凭据就开不开。`helm uninstall` 与「关持久」的 upgrade 都不顺手删它(确认不要了再 kubectl delete pvc)。
|
|
15
|
+
helm.sh/resource-policy: keep
|
|
16
|
+
spec:
|
|
17
|
+
accessModes: [{{ include "sema.sealedKey.accessMode" . }}]
|
|
18
|
+
{{- if .Values.sealedKey.persistence.storageClass }}
|
|
19
|
+
storageClassName: {{ .Values.sealedKey.persistence.storageClass | quote }}
|
|
20
|
+
{{- end }}
|
|
21
|
+
resources:
|
|
22
|
+
requests:
|
|
23
|
+
storage: {{ .Values.sealedKey.persistence.size | quote }}
|
|
24
|
+
{{- end }}
|
|
@@ -11,6 +11,9 @@ metadata:
|
|
|
11
11
|
labels: { app: sema-server-v4pro }
|
|
12
12
|
spec:
|
|
13
13
|
replicas: {{ .Values.serverV4pro.replicas }}
|
|
14
|
+
{{- with (include "sema.sealedKey.strategy" .) }}
|
|
15
|
+
{{ . | indent 2 }}
|
|
16
|
+
{{- end }}
|
|
14
17
|
selector:
|
|
15
18
|
matchLabels: { app: sema-server-v4pro }
|
|
16
19
|
template:
|
|
@@ -59,10 +62,13 @@ spec:
|
|
|
59
62
|
{{/* 租户姿态与主 worker 同值(文件头「同 env 面」的承诺;修前缺席 ⇒ 主 worker 多租时本只仍单用户)。 */}}
|
|
60
63
|
- { name: REQUIRE_PRINCIPAL, value: {{ .Values.server.requirePrincipal | default "false" | quote }} }
|
|
61
64
|
- { name: SANDBOX_PKG_SOURCE, value: {{ .Values.server.sandboxPkgSource | quote }} }
|
|
62
|
-
- { name: REMOTE_EXEC, value: k8s }
|
|
63
65
|
{{/* 车道点名了就显式表态「这台有手」——REQUIRE_EXECUTION_LANE 让「车道被谁改没了」
|
|
64
|
-
变成拒启而不是安静的无手 worker。server 侧默认仍 off,sema-up 产物一律写 true。
|
|
66
|
+
变成拒启而不是安静的无手 worker。server 侧默认仍 off,sema-up 产物一律写 true。
|
|
67
|
+
下面圈起来的两行取自车道表(lanes.json 的 kube 行),由生成器渲出,不要手改。 */}}
|
|
68
|
+
{{/* @generated-begin kube-lane-env */}}
|
|
69
|
+
- { name: REMOTE_EXEC, value: "k8s" }
|
|
65
70
|
- { name: REQUIRE_EXECUTION_LANE, value: "true" }
|
|
71
|
+
{{/* @generated-end kube-lane-env */}}
|
|
66
72
|
- { name: K8S_API_URL, value: "https://kubernetes.default.svc" }
|
|
67
73
|
{{- if .Values.server.k8sInsecureTls }}
|
|
68
74
|
- { name: K8S_INSECURE_TLS, value: "true" }
|
|
@@ -72,10 +78,21 @@ spec:
|
|
|
72
78
|
- { name: K8S_SANDBOX_IMAGE, value: {{ .Values.sandbox.image | quote }} }
|
|
73
79
|
- { name: K8S_SANDBOX_IPV6, value: {{ .Values.sandbox.ipv6 | quote }} }
|
|
74
80
|
- { name: K8S_TOKEN, valueFrom: { secretKeyRef: { name: sema-runner-token-copy, key: token } } }
|
|
81
|
+
{{- /* 耐久审批的显式表态与停驻封签钥匙卷同源(助手 sema.durableApproval / sema.sealedKey.*,见 _helpers.tpl):关持久 ⇒ 显式 false;留空 ⇒ 不渲。 */}}
|
|
82
|
+
{{- with (include "sema.sealedKey.env" .) }}
|
|
83
|
+
{{ . | indent 12 }}
|
|
84
|
+
{{- end }}
|
|
75
85
|
readinessProbe: # the only probe path is /readyz (/health is diagnostic, always 200)
|
|
76
86
|
httpGet: { path: /readyz, port: 8090 }
|
|
77
87
|
initialDelaySeconds: 5
|
|
78
88
|
periodSeconds: 5
|
|
89
|
+
{{- /* <数据根>/sealed-key 的持久卷(整个目录:模型钥匙 + 停驻封签钥匙);关持久时两块都不出。 */}}
|
|
90
|
+
{{- with (include "sema.sealedKey.volumeMounts" .) }}
|
|
91
|
+
{{ . | indent 10 }}
|
|
92
|
+
{{- end }}
|
|
93
|
+
{{- with (include "sema.sealedKey.volumes" .) }}
|
|
94
|
+
{{ . | indent 6 }}
|
|
95
|
+
{{- end }}
|
|
79
96
|
---
|
|
80
97
|
apiVersion: v1
|
|
81
98
|
kind: Service
|
|
@@ -16,6 +16,9 @@ metadata:
|
|
|
16
16
|
namespace: {{ .Release.Namespace }}
|
|
17
17
|
spec:
|
|
18
18
|
replicas: {{ .Values.server.replicas }}
|
|
19
|
+
{{- with (include "sema.sealedKey.strategy" .) }}
|
|
20
|
+
{{ . | indent 2 }}
|
|
21
|
+
{{- end }}
|
|
19
22
|
selector:
|
|
20
23
|
matchLabels: { app: sema-server }
|
|
21
24
|
template:
|
|
@@ -70,10 +73,13 @@ spec:
|
|
|
70
73
|
- { name: MODEL_VISION, value: {{ .Values.server.modelVision | quote }} }
|
|
71
74
|
- { name: REQUIRE_PRINCIPAL, value: {{ .Values.server.requirePrincipal | default "false" | quote }} }
|
|
72
75
|
- { name: SANDBOX_PKG_SOURCE, value: {{ .Values.server.sandboxPkgSource | quote }} }
|
|
73
|
-
- { name: REMOTE_EXEC, value: k8s }
|
|
74
76
|
{{/* 车道点名了就显式表态「这台有手」——REQUIRE_EXECUTION_LANE 让「车道被谁改没了」
|
|
75
|
-
变成拒启而不是安静的无手 worker。server 侧默认仍 off,sema-up 产物一律写 true。
|
|
77
|
+
变成拒启而不是安静的无手 worker。server 侧默认仍 off,sema-up 产物一律写 true。
|
|
78
|
+
下面圈起来的两行取自车道表(lanes.json 的 kube 行),由生成器渲出,不要手改。 */}}
|
|
79
|
+
{{/* @generated-begin kube-lane-env */}}
|
|
80
|
+
- { name: REMOTE_EXEC, value: "k8s" }
|
|
76
81
|
- { name: REQUIRE_EXECUTION_LANE, value: "true" }
|
|
82
|
+
{{/* @generated-end kube-lane-env */}}
|
|
77
83
|
- { name: K8S_API_URL, value: "https://kubernetes.default.svc" }
|
|
78
84
|
{{- if .Values.server.k8sInsecureTls }}
|
|
79
85
|
- { name: K8S_INSECURE_TLS, value: "true" }
|
|
@@ -85,10 +91,21 @@ spec:
|
|
|
85
91
|
- { name: K8S_SANDBOX_IMAGE, value: {{ .Values.sandbox.image | quote }} }
|
|
86
92
|
- { name: K8S_SANDBOX_IPV6, value: {{ .Values.sandbox.ipv6 | quote }} }
|
|
87
93
|
- { name: K8S_TOKEN, valueFrom: { secretKeyRef: { name: sema-runner-token-copy, key: token } } }
|
|
94
|
+
{{- /* 耐久审批的显式表态与停驻封签钥匙卷同源(助手 sema.durableApproval / sema.sealedKey.*,见 _helpers.tpl):关持久 ⇒ 显式 false;留空 ⇒ 不渲。 */}}
|
|
95
|
+
{{- with (include "sema.sealedKey.env" .) }}
|
|
96
|
+
{{ . | indent 12 }}
|
|
97
|
+
{{- end }}
|
|
88
98
|
readinessProbe: # the only probe path is /readyz (/health is diagnostic, always 200)
|
|
89
99
|
httpGet: { path: /readyz, port: 8090 }
|
|
90
100
|
initialDelaySeconds: 5
|
|
91
101
|
periodSeconds: 5
|
|
102
|
+
{{- /* <数据根>/sealed-key 的持久卷(整个目录:模型钥匙 + 停驻封签钥匙);关持久时两块都不出。 */}}
|
|
103
|
+
{{- with (include "sema.sealedKey.volumeMounts" .) }}
|
|
104
|
+
{{ . | indent 10 }}
|
|
105
|
+
{{- end }}
|
|
106
|
+
{{- with (include "sema.sealedKey.volumes" .) }}
|
|
107
|
+
{{ . | indent 6 }}
|
|
108
|
+
{{- end }}
|
|
92
109
|
---
|
|
93
110
|
apiVersion: v1
|
|
94
111
|
kind: Service
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# full-single(单节点 k3s dev/测试)覆盖:1 实例 PG、preferred 反亲和(required 在单机=永久
|
|
2
|
-
# Pending——真踩)、2 副本 server。用法:
|
|
2
|
+
# Pending——真踩)、2 副本 server(钥匙卷 RWO,见文末)。用法:
|
|
3
3
|
# helm upgrade --install sema-stack ./chart -n sema --create-namespace \
|
|
4
4
|
# -f chart/values-full-single.yaml --set server.image=… --set …(凭据)
|
|
5
5
|
pg:
|
|
@@ -7,3 +7,7 @@ pg:
|
|
|
7
7
|
antiAffinity: preferred
|
|
8
8
|
server:
|
|
9
9
|
replicas: 2
|
|
10
|
+
# 钥匙卷:单节点上的 2 个副本在同一个节点,ReadWriteOnce 的卷同节点可共用 —— 不必为它给节点装 NFS 客户端(缺省的 ReadWriteMany 要 RWX 存储类)。
|
|
11
|
+
sealedKey:
|
|
12
|
+
persistence:
|
|
13
|
+
accessMode: ReadWriteOnce
|
|
@@ -49,6 +49,10 @@ server:
|
|
|
49
49
|
modelApiKey: "" # REQUIRED
|
|
50
50
|
modelVision: "false"
|
|
51
51
|
requirePrincipal: "false" # users=multi 时 true(身份隔离;compose 路径同名 env)
|
|
52
|
+
# 耐久审批(env DURABLE_APPROVAL;停驻 / 续跑 / /v1/approvals 整条路由)。留空 = 图表不渲这个 env,开关归引擎按姿态定
|
|
53
|
+
# (单用户 + 有耐久店 ⇒ 开;requirePrincipal=true 的多用户形 ⇒ 关);"true" / "false" = 显式表态,原样渲给每只 worker。
|
|
54
|
+
# sealedKey.persistence.enabled=false 时图表固定渲 "false"(钥匙跨不过重启,停驻行就续不了);此处再写 "true" ⇒ 渲染即拒。
|
|
55
|
+
durableApproval: ""
|
|
52
56
|
# region=global 时置 "global"(B5 env-first);cn 留空 = 域内默认
|
|
53
57
|
sandboxPkgSource: ""
|
|
54
58
|
# k8s exec lane 的 TLS 姿势:true=渲染 K8S_INSECURE_TLS=true(chart 0.1.0 as-built);
|
|
@@ -66,6 +70,36 @@ server:
|
|
|
66
70
|
s3PublicBucket: ""
|
|
67
71
|
sendUserFileSandboxPutEndpoint: ""
|
|
68
72
|
|
|
73
|
+
# 停驻封签钥匙的持久卷:server 的 <数据根>/sealed-key/ 整个目录挂一只 PVC(缺省开)。
|
|
74
|
+
# 为什么:耐久审批(单用户 + 有耐久店时引擎缺省就开)停驻的任务,续跑上下文里请求自带的凭据只以封签落盘,封签的私钥只在这个目录里
|
|
75
|
+
# (子目录 checkpoint-ctx-keys/;同目录还有模型钥匙)——钥匙不进库。目录不持久 ⇒ 每次重启换一把钥匙;多副本各一份 ⇒ 换副本就换了钥匙。
|
|
76
|
+
# 两种结局相同:重启 / 换副本之前停驻、带请求凭据的任务续跑恒答 409 conflict.checkpoint_ctx_unsealable(reason key_not_held),只能作为新任务重提。
|
|
77
|
+
# 挂在哪:容器内 /root/.ai-agent/sealed-key(镜像以 root 跑、本图表不设数据根变量 ⇒ 数据根是缺省 /root/.ai-agent)。
|
|
78
|
+
# 主 worker 与启用的 serverV4pro 变体共用同一只 PVC(它们读同一个库里的停驻行)。
|
|
79
|
+
# 访问模式缺省随共享这只卷的 pod 数(server.replicas + 启用的 serverV4pro.replicas):1 只 ⇒ ReadWriteOnce;多只 ⇒ ReadWriteMany;`accessMode` 可显式盖(见下)。
|
|
80
|
+
# 有效访问模式是 ReadWriteOnce 时,server / serverV4pro 两只 Deployment 用 Recreate 更新策略(RWO 卷同时只能被一个节点挂,滚动更新的新 Pod 落在别的节点就永远等不到卷;
|
|
81
|
+
# 代价:升级窗口内这一只 Deployment 短暂没有副本)。
|
|
82
|
+
# ⚠ ReadWriteMany 要集群的存储类支持 RWX(Longhorn 的 RWX 走 NFS 共享管理器,每个节点要装 NFS 客户端 —— cluster-up.sh 不替你装;NFS / CephFS 类存储本就支持;
|
|
83
|
+
# local-path 与多数云盘类不支持,PVC 会一直 Pending、server Pod 起不来)。没有 RWX 的集群出路有三:server.replicas=1(RWO 即可);
|
|
84
|
+
# 单节点多副本(所有 pod 在同一个节点)显式 accessMode: ReadWriteOnce(随包的 values-full-single.yaml 就是这么写的);或关掉持久(下面 enabled: false,耐久审批随之关 —— 代价见下)。
|
|
85
|
+
# ⚠ PVC 的 accessModes 建好后不可改:副本数跨过 1 的边界(1 ⇄ 多;启用 v4pro 也算一只)时 helm upgrade 会撞 PVC「spec is immutable」—— 响亮失败,不静默;
|
|
86
|
+
# 这只卷里是私钥,不要为了过这个错直接删 PVC:先把停驻行结掉(随包排空检查脚本数一数)或备份钥匙文件,再换卷。
|
|
87
|
+
# PVC 带 helm.sh/resource-policy: keep:`helm uninstall` 与把 enabled 改成 false 的 upgrade 都不删它(钥匙留着;确认不要了再 `kubectl -n <ns> delete pvc sema-server-sealed-key`);
|
|
88
|
+
# 同名 release 重装会接管这只留下的 PVC。
|
|
89
|
+
# ⚠ 空卷上多副本并发首启:每个副本看到空目录各自生成一把钥匙,各副本只持有自己那一把,直到下次重启 —— 首装后 `kubectl -n <ns> rollout restart deploy/sema-server`
|
|
90
|
+
# 一次(启用 serverV4pro 时再加 deploy/sema-server-v4pro;NOTES 也说这句),重启之后每个副本读到目录里的全部钥匙,从此一致。
|
|
91
|
+
sealedKey:
|
|
92
|
+
persistence:
|
|
93
|
+
# true(缺省)= 建 PVC 并挂到上面的路径。
|
|
94
|
+
# false = 不建卷、不挂载,图表**显式**给每只 worker 设 DURABLE_APPROVAL=false(不产生续不了的停驻行;NOTES 也打印这一句);
|
|
95
|
+
# 此时 server.durableApproval 再写 "true" ⇒ 渲染即拒。代价:耐久审批整条关(审批卡停驻 / 续跑、/v1/approvals 路由、/v1/capabilities 的 approvals 位);
|
|
96
|
+
# web-admin 贴的模型钥匙 sealedApiKey 的私钥也跨不过重启(重启后那些条目答 stale_ciphertext,要对着新公钥重封)。
|
|
97
|
+
# 只收布尔:字符串 "false" 在模板里恒为真,会静默保持开着,所以渲染即拒。
|
|
98
|
+
enabled: true
|
|
99
|
+
size: 64Mi # 只放几个几百字节的钥匙文件;留余量给文件系统开销
|
|
100
|
+
storageClass: "" # 空 = 集群默认 SC;访问模式是 ReadWriteMany 时要点名一个支持它的类
|
|
101
|
+
accessMode: "" # 空 = 随共享 pod 数派生(1 只 RWO,多只 RWX);"ReadWriteOnce" / "ReadWriteMany" = 显式盖,其它词渲染即拒
|
|
102
|
+
|
|
69
103
|
# v4-pro 变体 worker(2026-07-11 手工 kubectl 资源收编进 chart;同镜像/同 env 面,仅 MODEL_ID 不同;
|
|
70
104
|
# 公网入口=Gcore LB listener 8091 → nodePort,LB 面不归 chart 管)
|
|
71
105
|
serverV4pro:
|
|
@@ -97,9 +97,12 @@ services:
|
|
|
97
97
|
# 执行车道:值由 sema-up.sh 从 lib/lanes.json 渲进 .env(resetk,每次重写)。
|
|
98
98
|
# `REQUIRE_EXECUTION_LANE` 缺省 true —— 手工起这份 compose 而没点名车道时,server 拒启
|
|
99
99
|
# 并说「没有手」,而不是安静地起成一个什么都干不了的 worker。
|
|
100
|
+
# 下面圈起来的几行(车道键、缺省、compose 路径上各车道运维自备的键)由车道表生成,不要手改。
|
|
101
|
+
# @generated-begin lane-env
|
|
100
102
|
REMOTE_EXEC: ${REMOTE_EXEC:-}
|
|
101
103
|
REQUIRE_EXECUTION_LANE: ${REQUIRE_EXECUTION_LANE:-true}
|
|
102
104
|
E2B_API_KEY: ${E2B_API_KEY:-}
|
|
105
|
+
# @generated-end lane-env
|
|
103
106
|
ports:
|
|
104
107
|
- "${SERVER_BIND:-0.0.0.0}:${SERVER_PORT:-8090}:8090"
|
|
105
108
|
|
|
@@ -198,9 +198,11 @@ spec:
|
|
|
198
198
|
# 租户姿态与 chart 主 worker 同值(cluster-up 由 --users 渲:multi ⇒ true,否则 false);修前整块缺席 ⇒ 恒单用户
|
|
199
199
|
- { name: REQUIRE_PRINCIPAL, value: "__REQUIRE_PRINCIPAL__" }
|
|
200
200
|
- { name: SANDBOX_PKG_SOURCE, value: "__PKG_SOURCE__" }
|
|
201
|
-
|
|
202
|
-
#
|
|
201
|
+
# 显式表态「这台有手」(车道被改没了 ⇒ 拒启,不是安静的无手 worker);下面圈起来的两行取自车道表(lanes.json 的 kube 行),由生成器渲出,不要手改
|
|
202
|
+
# @generated-begin kube-lane-env
|
|
203
|
+
- { name: REMOTE_EXEC, value: "k8s" }
|
|
203
204
|
- { name: REQUIRE_EXECUTION_LANE, value: "true" }
|
|
205
|
+
# @generated-end kube-lane-env
|
|
204
206
|
- { name: K8S_API_URL, value: "https://kubernetes.default.svc" }
|
|
205
207
|
- { name: K8S_INSECURE_TLS, value: "true" }
|
|
206
208
|
- { name: K8S_NAMESPACE, value: sema-sandbox }
|
package/dist/adoption/plan.d.ts
CHANGED
|
@@ -160,7 +160,8 @@ export declare function checkAdoptionPrincipalShape(fromPrincipal: string, toPri
|
|
|
160
160
|
* 纯函数(零 I/O),所以校验发生在任何库动作之前。
|
|
161
161
|
*/
|
|
162
162
|
export declare function checkAdoptionWidths(fromPrincipal: string, toPrincipal: string): string | undefined;
|
|
163
|
-
/**
|
|
163
|
+
/** 两段键的 tenant / 属主段前缀(值对由 DISTINCT 扫描按前缀解出;扫描 SQL 的前缀臂由本表生成,一处):`proj:` / `userproj:`(core 文法)
|
|
164
|
+
* 与单用户项目层 `userrepo:`(S-640,文法 `project-layer-key.ts`:属主段 = principal 的段编码)。 */
|
|
164
165
|
export declare const MEMORY_PROJECT_SCOPE_PREFIXES: readonly string[];
|
|
165
166
|
/**
|
|
166
167
|
* 一根身份轴上,「旧值 → 新值」的**值对**。`verbatim` 轴恒只有一对;`memory-scope` 轴的对数 =
|
|
@@ -175,7 +176,7 @@ export declare function buildVerbatimPair(fromPrincipal: string, toPrincipal: st
|
|
|
175
176
|
/**
|
|
176
177
|
* memory scope 键的重写(纯函数,给扫描出来的每个 scope 值算新值)。
|
|
177
178
|
* · `user:<enc(from)>` ⇒ `user:<enc(to)>`(逐字等值);
|
|
178
|
-
* · `proj:<enc(from)>/…` / `userproj:<enc(from)>/…` ⇒ 只换 tenant
|
|
179
|
+
* · `proj:<enc(from)>/…` / `userproj:<enc(from)>/…` / `userrepo:<enc(from)>/…` ⇒ 只换 tenant / 属主段,项目段原样;
|
|
179
180
|
* · 其它(`org:` 组织盘、无前缀的旧不透明键)⇒ `undefined` = **不属这个 principal,不动**。
|
|
180
181
|
*
|
|
181
182
|
* 🔴 为什么不用 `LIKE '<prefix>%'`:段是**百分号编码**的(`user%3Aweb-demo`),`%` 在 LIKE 里是通配符,
|
package/dist/adoption/plan.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { formatUserScope, encodeScopeSegment, SCOPE_SEGMENT_MAX_ENCODED } from "@sema-agent/core";
|
|
2
|
+
import { PROJECT_LAYER_KEY_PREFIX } from "../project-layer-key.js";
|
|
2
3
|
export const REBIND_LEGS = [
|
|
3
4
|
{
|
|
4
5
|
leg: "session_meta#owner",
|
|
@@ -213,15 +214,15 @@ export const REBIND_LEGS = [
|
|
|
213
214
|
why: "workflow run 行的 scope 分区(scope = `principal ?? \"default\"`)。183 §4.2 D4:不变量属 update 动词面,存储层迁移豁免",
|
|
214
215
|
},
|
|
215
216
|
{
|
|
216
|
-
leg: "
|
|
217
|
-
table: "
|
|
217
|
+
leg: "workflow_journal_owner#scope",
|
|
218
|
+
table: "workflow_journal_owner",
|
|
218
219
|
kind: "bulk-rebind",
|
|
219
220
|
action: "bucket-rebind",
|
|
220
221
|
columns: ["scope"],
|
|
221
222
|
matchColumn: "scope",
|
|
222
223
|
encoding: "verbatim",
|
|
223
224
|
residualKey: undefined,
|
|
224
|
-
why: "resume
|
|
225
|
+
why: "resume 重放日志的属主 scope(S-197 起一条 run 只记在这一行,journal 行上不再有 scope 列;读写两面都经它判)—— 与 run 行**同事务**(错配会让 load 的墙拒掉整条 resume、append 的墙拒掉续写)",
|
|
225
226
|
},
|
|
226
227
|
{
|
|
227
228
|
leg: "workflow_agent_session#scope",
|
|
@@ -320,7 +321,7 @@ export const REBIND_LEGS = [
|
|
|
320
321
|
matchColumn: "scope",
|
|
321
322
|
encoding: "memory-scope",
|
|
322
323
|
residualKey: ["slug"],
|
|
323
|
-
why: "记忆条目盘(user:/proj:/userproj:
|
|
324
|
+
why: "记忆条目盘(user:/proj:/userproj:/userrepo: 四形键的 tenant / 属主段 = principal)",
|
|
324
325
|
},
|
|
325
326
|
{
|
|
326
327
|
leg: "agent_memory_engine_cursor#scope",
|
|
@@ -406,6 +407,7 @@ export const NOT_MIGRATED_BY_DESIGN = [
|
|
|
406
407
|
{ face: "usage-window", ruling: "D1", reason: "deployment token-governance window (usage_window): a windowed governance transient — not carried, recounted from zero" },
|
|
407
408
|
{ face: "cost-quota", ruling: "D1", reason: "per-window cumulative spend counter (cost_quota.scope_key) — same windowed-transient class as usage-window" },
|
|
408
409
|
{ face: "rate-limit", ruling: "D1", reason: "per-window request counter (rate_limit.limit_key) — same windowed-transient class as usage-window" },
|
|
410
|
+
{ face: "org-delivery-quota", ruling: "D1", reason: "per-hour cross-principal delivery counters (org_delivery_sender_quota.from_scope / org_delivery_pair_quota.from_scope,to_scope / org_delivery_recipient_quota.to_scope) — same windowed-transient class as usage-window; carrying them would hand the new identity the old window's remaining budget" },
|
|
409
411
|
{ face: "approval-exemption-grantor", ruling: "D2", reason: "approval_exemption.granted_by is a historical fact (who granted this exemption), not a live authorization axis" },
|
|
410
412
|
{ face: "approval-ask-decision-actor", ruling: "D2", reason: "approval_ask.decision_actor / decision_note record who decided — historical audit fields, never rewritten" },
|
|
411
413
|
{ face: "image-bake-requested-by", ruling: "D2", reason: "image_bake.requested_by records who requested the build — historical audit field" },
|
|
@@ -471,7 +473,7 @@ export function checkAdoptionWidths(fromPrincipal, toPrincipal) {
|
|
|
471
473
|
}
|
|
472
474
|
return undefined;
|
|
473
475
|
}
|
|
474
|
-
export const MEMORY_PROJECT_SCOPE_PREFIXES = ["proj:", "userproj:"];
|
|
476
|
+
export const MEMORY_PROJECT_SCOPE_PREFIXES = ["proj:", "userproj:", PROJECT_LAYER_KEY_PREFIX];
|
|
475
477
|
export function buildVerbatimPair(fromPrincipal, toPrincipal) {
|
|
476
478
|
return { from: fromPrincipal, to: toPrincipal };
|
|
477
479
|
}
|
package/dist/adoption/runner.js
CHANGED
|
@@ -3,7 +3,7 @@ import { ADOPTION_PHASE, adoptionLockName, } from "../plugins/adoption-log-sql.j
|
|
|
3
3
|
import { policyKeyFor } from "../plugins/session-policy-store-sql.js";
|
|
4
4
|
import { buildRuleOwnerKey } from "../plugins/permission-rule-store-sql.js";
|
|
5
5
|
import { withAdoptionQuiesce } from "./quiesce.js";
|
|
6
|
-
import { AFFECTED_CONFIG_TEMPLATES, MEMORY_SCOPE_MAX_CHARS, NOT_MIGRATED_BY_DESIGN, REBIND_LEGS, buildVerbatimPair, rewriteMemoryScope, } from "./plan.js";
|
|
6
|
+
import { AFFECTED_CONFIG_TEMPLATES, MEMORY_PROJECT_SCOPE_PREFIXES, MEMORY_SCOPE_MAX_CHARS, NOT_MIGRATED_BY_DESIGN, REBIND_LEGS, buildVerbatimPair, rewriteMemoryScope, } from "./plan.js";
|
|
7
7
|
import { buildBlobScanSql, buildBlobWriteSql, buildConflictProbeSql, buildMemoryScopeScanSql, buildResidualCountSql, buildRebindSql, buildRuleOwnerRekeySql, buildSessionPolicyRewriteSql, buildSessionPolicyScanSql, } from "./sql.js";
|
|
8
8
|
import { AdoptionConfigsSchema, AdoptionLegsSchema, AdoptionReceiptSchema, AdoptionRejectDetailSchema, AdoptionReportSchema, } from "./wire.js";
|
|
9
9
|
import { formatUserScope, encodeScopeSegment } from "@sema-agent/core";
|
|
@@ -24,15 +24,8 @@ async function resolveValuePairs(exec, dialect, leg, fromPrincipal, toPrincipal)
|
|
|
24
24
|
];
|
|
25
25
|
}
|
|
26
26
|
const seg = encodeScopeSegment(fromPrincipal);
|
|
27
|
-
const
|
|
28
|
-
const
|
|
29
|
-
const res = await exec.query(buildMemoryScopeScanSql(dialect, leg.table), [
|
|
30
|
-
formatUserScope(fromPrincipal),
|
|
31
|
-
projHead.length,
|
|
32
|
-
projHead,
|
|
33
|
-
userProjHead.length,
|
|
34
|
-
userProjHead,
|
|
35
|
-
]);
|
|
27
|
+
const heads = MEMORY_PROJECT_SCOPE_PREFIXES.map((prefix) => `${prefix}${seg}/`);
|
|
28
|
+
const res = await exec.query(buildMemoryScopeScanSql(dialect, leg.table, heads.length), [formatUserScope(fromPrincipal), ...heads.flatMap((head) => [head.length, head])]);
|
|
36
29
|
const pairs = [];
|
|
37
30
|
for (const row of res.rows) {
|
|
38
31
|
const scope = String(row.scope);
|
package/dist/adoption/sql.d.ts
CHANGED
|
@@ -42,9 +42,10 @@ export declare function buildRebindSql(dialect: SqlDialect, leg: RebindLegSpec):
|
|
|
42
42
|
* LIKE 里是通配符 —— 不逐字符转义就会误命中别的租户的盘(**跨租户误迁**,不是性能问题)。`LEFT(col, n) = ?`
|
|
43
43
|
* 是纯等值比较,没有元字符面,两方言同形。
|
|
44
44
|
*
|
|
45
|
-
*
|
|
45
|
+
* 前缀臂数 = `prefixCount`(调用方传 `MEMORY_PROJECT_SCOPE_PREFIXES.length` —— 臂由词表生成,词表长一员 SQL 跟着长一臂,不手写第二份)。
|
|
46
|
+
* 参数序:`[userScope, head₁.length, head₁, head₂.length, head₂, …]`。
|
|
46
47
|
*/
|
|
47
|
-
export declare function buildMemoryScopeScanSql(dialect: SqlDialect, table: string): string;
|
|
48
|
+
export declare function buildMemoryScopeScanSql(dialect: SqlDialect, table: string, prefixCount: number): string;
|
|
48
49
|
/**
|
|
49
50
|
* 残留计数:某条腿上**仍挂在旧身份名下**的行数。参数序:`[fromValue]`。
|
|
50
51
|
*
|
package/dist/adoption/sql.js
CHANGED
|
@@ -10,11 +10,9 @@ export function buildRebindSql(dialect, leg) {
|
|
|
10
10
|
const sets = leg.columns.map((c, i) => `${c} = ${ph(dialect, i + 1)}`).join(", ");
|
|
11
11
|
return `UPDATE ${leg.table} SET ${sets} WHERE ${leg.matchColumn} = ${ph(dialect, leg.columns.length + 1)}`;
|
|
12
12
|
}
|
|
13
|
-
export function buildMemoryScopeScanSql(dialect, table) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
` OR LEFT(scope, ${ph(dialect, 2)}) = ${ph(dialect, 3)}` +
|
|
17
|
-
` OR LEFT(scope, ${ph(dialect, 4)}) = ${ph(dialect, 5)}`);
|
|
13
|
+
export function buildMemoryScopeScanSql(dialect, table, prefixCount) {
|
|
14
|
+
const arms = Array.from({ length: prefixCount }, (_, i) => ` OR LEFT(scope, ${ph(dialect, 2 + 2 * i)}) = ${ph(dialect, 3 + 2 * i)}`).join("");
|
|
15
|
+
return `SELECT DISTINCT scope FROM ${table} WHERE scope = ${ph(dialect, 1)}${arms}`;
|
|
18
16
|
}
|
|
19
17
|
export function buildResidualCountSql(dialect, table, matchColumns) {
|
|
20
18
|
const where = matchColumns.map((c, i) => `${c} = ${ph(dialect, i + 1)}`).join(" OR ");
|
package/dist/adoption/wire.d.ts
CHANGED
|
@@ -67,13 +67,14 @@ export type AdoptionConfigEntry = z.infer<typeof AdoptionConfigEntrySchema>;
|
|
|
67
67
|
* 🔴 这是**冻结的闭集**(下游按成员名写正向断言)。改名/删员 = wire 破坏;新增 = 新行为面,要先过三问。
|
|
68
68
|
* 判据形见 183 §10.5:「按设计不迁」与「漏了没迁」在黑盒上必须可分,所以它是**正向声明**而不是沉默。
|
|
69
69
|
*/
|
|
70
|
-
export declare const NOT_MIGRATED_FACES: readonly ["usage-window", "cost-quota", "rate-limit", "approval-exemption-grantor", "approval-ask-decision-actor", "image-bake-requested-by", "permission-rule-approval-history", "permission-rule-import-ticket"];
|
|
70
|
+
export declare const NOT_MIGRATED_FACES: readonly ["usage-window", "cost-quota", "rate-limit", "org-delivery-quota", "approval-exemption-grantor", "approval-ask-decision-actor", "image-bake-requested-by", "permission-rule-approval-history", "permission-rule-import-ticket"];
|
|
71
71
|
export type NotMigratedFace = (typeof NOT_MIGRATED_FACES)[number];
|
|
72
72
|
export declare const AdoptionNotMigratedSchema: z.ZodObject<{
|
|
73
73
|
face: z.ZodEnum<{
|
|
74
74
|
"usage-window": "usage-window";
|
|
75
75
|
"cost-quota": "cost-quota";
|
|
76
76
|
"rate-limit": "rate-limit";
|
|
77
|
+
"org-delivery-quota": "org-delivery-quota";
|
|
77
78
|
"approval-exemption-grantor": "approval-exemption-grantor";
|
|
78
79
|
"approval-ask-decision-actor": "approval-ask-decision-actor";
|
|
79
80
|
"image-bake-requested-by": "image-bake-requested-by";
|
|
@@ -122,6 +123,7 @@ export declare const AdoptionReportSchema: z.ZodObject<{
|
|
|
122
123
|
"usage-window": "usage-window";
|
|
123
124
|
"cost-quota": "cost-quota";
|
|
124
125
|
"rate-limit": "rate-limit";
|
|
126
|
+
"org-delivery-quota": "org-delivery-quota";
|
|
125
127
|
"approval-exemption-grantor": "approval-exemption-grantor";
|
|
126
128
|
"approval-ask-decision-actor": "approval-ask-decision-actor";
|
|
127
129
|
"image-bake-requested-by": "image-bake-requested-by";
|
|
@@ -183,6 +185,7 @@ export declare const AdoptionReceiptSchema: z.ZodObject<{
|
|
|
183
185
|
"usage-window": "usage-window";
|
|
184
186
|
"cost-quota": "cost-quota";
|
|
185
187
|
"rate-limit": "rate-limit";
|
|
188
|
+
"org-delivery-quota": "org-delivery-quota";
|
|
186
189
|
"approval-exemption-grantor": "approval-exemption-grantor";
|
|
187
190
|
"approval-ask-decision-actor": "approval-ask-decision-actor";
|
|
188
191
|
"image-bake-requested-by": "image-bake-requested-by";
|