@sema-agent/server 7.150.0 → 7.152.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 +451 -0
- package/README.md +15 -3
- package/README.zh-CN.md +10 -2
- package/USAGE.md +144 -87
- package/deploy/sema-up/README.md +11 -4
- package/deploy/sema-up/chart/Chart.yaml +1 -1
- package/deploy/sema-up/chart/templates/NOTES.txt +5 -0
- package/deploy/sema-up/chart/templates/_helpers.tpl +15 -16
- package/deploy/sema-up/chart/templates/server-v4pro.yaml +5 -3
- package/deploy/sema-up/chart/templates/server.yaml +5 -3
- package/deploy/sema-up/chart/values-full-single.yaml +3 -1
- package/deploy/sema-up/chart/values.yaml +8 -1
- package/deploy/sema-up/cluster-up.sh +7 -6
- package/deploy/sema-up/kube-up.sh +6 -6
- package/deploy/sema-up/lib/flagshape.sh +36 -8
- package/deploy/sema-up/lib/helm-values-cluster.py +2 -0
- package/deploy/sema-up/lib/helm-values-kube.py +2 -0
- package/deploy/sema-up/machines.example.yaml +3 -1
- package/deploy/sema-up/sema-up.sh +22 -16
- package/dist/adoption/import.js +3 -3
- package/dist/approval-ask-audit-store.d.ts +1 -1
- package/dist/approval-ask-machine.d.ts +4 -10
- package/dist/approval-ask-retention.d.ts +1 -1
- package/dist/approval-card.d.ts +12 -14
- package/dist/approval-gate-currency.d.ts +9 -9
- package/dist/approval-gate-currency.js +3 -4
- package/dist/approval-hmac.d.ts +17 -1
- package/dist/approval-hmac.js +7 -1
- package/dist/approval-queue-kind.d.ts +1 -1
- package/dist/approval.d.ts +2 -2
- package/dist/approval.js +2 -2
- package/dist/auth-bridge.d.ts +20 -0
- package/dist/auth-bridge.js +9 -0
- package/dist/background-session-reap.d.ts +1 -1
- package/dist/bake-runner/main.d.ts +4 -2
- package/dist/bind-host.d.ts +3 -6
- package/dist/bind-host.js +4 -7
- package/dist/boot/budget-tracing.js +1 -1
- package/dist/boot/coordinators.d.ts +1 -1
- package/dist/boot/coordinators.js +9 -10
- package/dist/boot/device-lane.js +2 -0
- package/dist/boot/engine-lease.d.ts +5 -0
- package/dist/boot/engine-lease.js +1 -0
- package/dist/boot/execution-env.d.ts +9 -14
- package/dist/boot/execution-env.js +85 -22
- package/dist/boot/execution-lane.js +32 -5
- package/dist/boot/late-binds.d.ts +8 -4
- package/dist/boot/late-binds.js +7 -1
- package/dist/boot/leader.d.ts +31 -30
- package/dist/boot/leader.js +38 -28
- package/dist/boot/leg-path-adjudication.d.ts +40 -0
- package/dist/boot/leg-path-adjudication.js +18 -0
- package/dist/boot/memory-consolidation.d.ts +3 -2
- package/dist/boot/memory-consolidation.js +6 -6
- package/dist/boot/parked-revive-gate.js +3 -15
- package/dist/boot/reapers.d.ts +6 -1
- package/dist/boot/reapers.js +13 -2
- package/dist/boot/resolve-spec.d.ts +3 -3
- package/dist/boot/resolve-spec.js +43 -48
- package/dist/boot/runner-deps.d.ts +46 -35
- package/dist/boot/runner-deps.js +94 -91
- package/dist/boot/session-age-out.d.ts +36 -0
- package/dist/boot/session-age-out.js +101 -0
- package/dist/boot/session-faces.d.ts +5 -14
- package/dist/boot/session-faces.js +9 -5
- package/dist/boot/shutdown.d.ts +6 -0
- package/dist/boot/shutdown.js +10 -4
- package/dist/boot/stage-01-config.js +2 -0
- package/dist/boot/stage-02-web-admin-pull.js +4 -5
- package/dist/boot/stage-05-execution-env.d.ts +5 -3
- package/dist/boot/stage-05-execution-env.js +3 -2
- package/dist/boot/stage-06-runners.d.ts +9 -4
- package/dist/boot/stage-06-runners.js +24 -9
- package/dist/boot/stage-07-capability-layer.d.ts +8 -4
- package/dist/boot/stage-07-capability-layer.js +3 -2
- package/dist/boot/stage-08-reapers.d.ts +8 -4
- package/dist/boot/stage-08-reapers.js +4 -2
- package/dist/boot/stage-09-leader.d.ts +12 -5
- package/dist/boot/stage-09-leader.js +14 -5
- package/dist/boot/stage-10-http-server.d.ts +19 -5
- package/dist/boot/stage-10-http-server.js +14 -21
- package/dist/boot/stores.js +7 -4
- package/dist/boot/web-admin.js +5 -8
- package/dist/boot/workflow-orchestration.d.ts +7 -2
- package/dist/boot/workflow-orchestration.js +24 -7
- package/dist/bounded-rotation.d.ts +29 -0
- package/dist/bounded-rotation.js +24 -0
- package/dist/capabilities/approvals-push.d.ts +3 -3
- package/dist/capabilities/scenarios.d.ts +28 -13
- package/dist/capabilities/scenarios.js +2 -2
- package/dist/capability-facts.d.ts +43 -32
- package/dist/capability-facts.js +45 -51
- package/dist/card-rule-offers.d.ts +32 -0
- package/dist/card-rule-offers.js +130 -0
- package/dist/center-credential.d.ts +25 -6
- package/dist/center-credential.js +25 -5
- package/dist/config-catalog.d.ts +26 -7
- package/dist/config-catalog.js +26 -22
- package/dist/config-dir-trust.js +4 -2
- package/dist/config-invariants.d.ts +20 -8
- package/dist/config-invariants.js +55 -12
- package/dist/config-lkg.d.ts +5 -19
- package/dist/config-lkg.js +8 -62
- package/dist/config-provider.d.ts +1 -1
- package/dist/config-root-migration.d.ts +2 -2
- package/dist/config-types.d.ts +38 -42
- package/dist/config.d.ts +58 -7
- package/dist/config.js +90 -40
- package/dist/control-socket.d.ts +51 -0
- package/dist/control-socket.js +115 -0
- package/dist/deployment-governance.d.ts +2 -1
- package/dist/deployment-shape.d.ts +9 -1
- package/dist/deployment-shape.js +2 -1
- package/dist/device-protocol.d.ts +5 -4
- package/dist/device-protocol.js +1 -1
- package/dist/device-ws-hub.d.ts +7 -0
- package/dist/device-ws-hub.js +10 -3
- package/dist/device-ws-protocol.d.ts +63 -10
- package/dist/device-ws-protocol.js +56 -25
- package/dist/elicitation.js +2 -2
- package/dist/engine-identity.d.ts +19 -7
- package/dist/engine-identity.js +10 -2
- package/dist/entry-mode-clamp-notice.d.ts +2 -1
- package/dist/entry-problems.d.ts +40 -3
- package/dist/entry-problems.js +3 -1
- package/dist/execution-env-refusal.d.ts +29 -0
- package/dist/execution-env-refusal.js +8 -0
- package/dist/execution-lane-caps.d.ts +3 -1
- package/dist/field-conflict.d.ts +1 -1
- package/dist/file-history-capture.d.ts +11 -4
- package/dist/file-history-capture.js +9 -6
- package/dist/file-history-disclosure.d.ts +7 -5
- package/dist/file-history-disclosure.js +7 -5
- package/dist/fleet/drain-entry.d.ts +4 -0
- package/dist/fleet/engine-signal.d.ts +12 -29
- package/dist/fleet/engine-signal.js +1 -7
- package/dist/fleet-client.js +2 -5
- package/dist/gate-settlement.d.ts +1 -8
- package/dist/gate-settlement.js +0 -4
- package/dist/history-anchor.js +1 -1
- package/dist/hitl-delivery.d.ts +2 -3
- package/dist/hitl-delivery.js +0 -2
- package/dist/hooks/hook-llm.js +4 -2
- package/dist/hooks/hook-runner.d.ts +3 -2
- package/dist/hooks/hook-runner.js +18 -3
- package/dist/host-decision.d.ts +11 -11
- package/dist/host-lsp-manager.d.ts +2 -2
- package/dist/http/active-run-conflict.d.ts +35 -2
- package/dist/http/active-run-conflict.js +48 -19
- package/dist/http/admission.js +17 -2
- package/dist/http/approval-sweeps.d.ts +1 -1
- package/dist/http/approval-sweeps.js +10 -7
- package/dist/http/checkpoint-ctx.d.ts +4 -0
- package/dist/http/checkpoint-ctx.js +2 -0
- package/dist/http/dispatch.d.ts +8 -3
- package/dist/http/dispatch.js +59 -32
- package/dist/http/durable-run-leg.js +16 -17
- package/dist/http/health-reader.d.ts +16 -9
- package/dist/http/health-reader.js +2 -1
- package/dist/http/health-self-report.d.ts +9 -1
- package/dist/http/health-self-report.js +3 -1
- package/dist/http/owner-access.d.ts +33 -14
- package/dist/http/owner-access.js +40 -10
- package/dist/http/principal-gate.d.ts +49 -21
- package/dist/http/principal-gate.js +61 -11
- package/dist/http/request-channel.d.ts +23 -0
- package/dist/http/request-channel.js +9 -0
- package/dist/http/request-guards.js +17 -2
- package/dist/http/resume-ctx-read.js +42 -3
- package/dist/http/resume-legs.d.ts +4 -3
- package/dist/http/resume-legs.js +367 -117
- package/dist/http/route-ctx.d.ts +91 -15
- package/dist/http/route-ctx.js +17 -0
- package/dist/http/route-table.d.ts +5 -1
- package/dist/http/route-table.js +4 -0
- package/dist/http/routes/admin-config-refresh.js +3 -3
- package/dist/http/routes/admin-drain.d.ts +3 -0
- package/dist/http/routes/admin-drain.js +7 -7
- package/dist/http/routes/admin-memory-optout.d.ts +1 -1
- package/dist/http/routes/admin-memory-optout.js +3 -3
- package/dist/http/routes/adoption.js +3 -5
- package/dist/http/routes/agents-roster.js +2 -3
- package/dist/http/routes/approvals-assistant.d.ts +2 -1
- package/dist/http/routes/approvals-assistant.js +99 -51
- package/dist/http/routes/background.d.ts +3 -3
- package/dist/http/routes/capabilities.d.ts +4 -0
- package/dist/http/routes/capabilities.js +38 -10
- package/dist/http/routes/config-catalog.js +2 -2
- package/dist/http/routes/devices.js +1 -1
- package/dist/http/routes/diagnostics.d.ts +3 -3
- package/dist/http/routes/diagnostics.js +19 -7
- package/dist/http/routes/fleet.js +10 -8
- package/dist/http/routes/images.js +10 -10
- package/dist/http/routes/memory-bundle.js +3 -3
- package/dist/http/routes/memory-compliance.js +3 -3
- package/dist/http/routes/memory-consolidation.js +2 -2
- package/dist/http/routes/memory-origin.js +3 -3
- package/dist/http/routes/memory-policy.js +2 -2
- package/dist/http/routes/observability.js +3 -3
- package/dist/http/routes/projects.d.ts +3 -2
- package/dist/http/routes/projects.js +4 -5
- package/dist/http/routes/retention-ops.js +3 -3
- package/dist/http/routes/rules.js +5 -5
- package/dist/http/routes/run-permission-mode.d.ts +2 -1
- package/dist/http/routes/run-permission-mode.js +2 -2
- package/dist/http/routes/runs.d.ts +4 -9
- package/dist/http/routes/runs.js +171 -65
- package/dist/http/routes/session-sync.d.ts +22 -9
- package/dist/http/routes/session-sync.js +204 -107
- package/dist/http/routes/sessions-list.js +13 -7
- package/dist/http/routes/sessions.js +30 -15
- package/dist/http/routes/tasks.js +46 -41
- package/dist/http/routes/trace-usage.js +2 -2
- package/dist/http/routes/workflows.js +1 -1
- package/dist/http/server.d.ts +30 -30
- package/dist/http/server.js +16 -4
- package/dist/http/submit-ctx.d.ts +1 -1
- package/dist/http/submit-ctx.js +7 -4
- package/dist/http/wire-types.d.ts +14 -4
- package/dist/human-facing-args.d.ts +33 -0
- package/dist/human-facing-args.js +33 -0
- package/dist/identity-source.d.ts +20 -3
- package/dist/identity-source.js +14 -0
- package/dist/index.d.ts +5 -1
- package/dist/k8s-api-credentials.d.ts +29 -0
- package/dist/k8s-api-credentials.js +25 -0
- package/dist/lane-home-probe.d.ts +3 -7
- package/dist/lane-home-probe.js +2 -2
- package/dist/leader/diffup.d.ts +19 -0
- package/dist/leader/diffup.js +7 -0
- package/dist/leader/leader.d.ts +116 -11
- package/dist/leader/leader.js +69 -5
- package/dist/leader/repair-wire.js +2 -2
- package/dist/leader/run-entry.d.ts +2 -1
- package/dist/leader/run-entry.js +1 -1
- package/dist/leader/wire.d.ts +42 -132
- package/dist/leader/wire.js +81 -67
- package/dist/leg-facts.d.ts +13 -5
- package/dist/leg-facts.js +2 -1
- package/dist/memory-scope.d.ts +23 -11
- package/dist/memory-scope.js +18 -6
- package/dist/memory-sync-client.d.ts +30 -2
- package/dist/memory-sync-client.js +16 -9
- package/dist/model-entry-headers.d.ts +9 -10
- package/dist/model-entry-headers.js +0 -4
- package/dist/model-entry-refusal.d.ts +7 -4
- package/dist/model-entry-refusal.js +11 -5
- package/dist/model-plane-face.d.ts +1 -1
- package/dist/model-plane-face.js +3 -1
- package/dist/model-route-endpoint.d.ts +13 -7
- package/dist/model-route-endpoint.js +14 -11
- package/dist/model-select.d.ts +22 -0
- package/dist/model-select.js +9 -0
- package/dist/model-unreachable-notice.d.ts +11 -0
- package/dist/model-unreachable-notice.js +4 -4
- package/dist/object-store-buckets.d.ts +640 -6
- package/dist/object-store-buckets.js +166 -0
- package/dist/observability/err-text.d.ts +7 -0
- package/dist/observability/err-text.js +5 -0
- package/dist/observability/fail-open.d.ts +25 -17
- package/dist/observability/fail-open.js +25 -17
- package/dist/observability/logger.js +3 -1
- package/dist/observability/metrics.js +1 -0
- package/dist/operator-roster.d.ts +68 -0
- package/dist/operator-roster.js +32 -0
- package/dist/orchestration/workflow-notify-journal.d.ts +18 -1
- package/dist/orchestration/workflow-notify-journal.js +12 -1
- package/dist/orchestration/workflow-park-decision.d.ts +70 -18
- package/dist/orchestration/workflow-park-decision.js +49 -10
- package/dist/orchestration/workflow-park-holder.d.ts +65 -0
- package/dist/orchestration/workflow-park-holder.js +98 -0
- package/dist/orchestration/workflow-record-fence.d.ts +36 -0
- package/dist/orchestration/workflow-record-fence.js +42 -0
- package/dist/outbound-dispatcher.d.ts +71 -8
- package/dist/outbound-dispatcher.js +48 -7
- package/dist/owner-faces.d.ts +2 -2
- package/dist/parked-decide.d.ts +106 -55
- package/dist/parked-decide.js +153 -117
- package/dist/peer-directory.d.ts +2 -2
- package/dist/peer-inbound-face.d.ts +2 -6
- package/dist/peer-inbound-face.js +0 -3
- package/dist/permission-mode-admission.d.ts +74 -5
- package/dist/permission-mode-admission.js +56 -3
- package/dist/plugins/adoption-log-sql.d.ts +3 -1
- package/dist/plugins/adoption-log-sql.js +7 -1
- package/dist/plugins/approval-ask-store-file.d.ts +14 -2
- package/dist/plugins/approval-ask-store-file.js +11 -0
- package/dist/plugins/approval-ask-store-memory.d.ts +10 -1
- package/dist/plugins/approval-ask-store-memory.js +35 -10
- package/dist/plugins/approval-ask-store-sql.d.ts +69 -4
- package/dist/plugins/approval-ask-store-sql.js +45 -5
- package/dist/plugins/approval-exemption-store.js +3 -0
- package/dist/plugins/approval-nonce-store.js +2 -0
- package/dist/plugins/blob-backend.d.ts +83 -7
- package/dist/plugins/blob-backend.js +57 -6
- package/dist/plugins/breaker-state-sql.js +2 -0
- package/dist/plugins/caching-session-store.d.ts +9 -15
- package/dist/plugins/caching-session-store.js +6 -0
- package/dist/plugins/checkpoint-index-columns.d.ts +20 -16
- package/dist/plugins/checkpoint-index-columns.js +3 -6
- package/dist/plugins/checkpoint-store-face.d.ts +119 -61
- package/dist/plugins/checkpoint-store-face.js +134 -55
- package/dist/plugins/device-store-sql.js +6 -0
- package/dist/plugins/error-origin.d.ts +18 -0
- package/dist/plugins/error-origin.js +10 -0
- package/dist/plugins/execution-placement-sql.js +6 -6
- package/dist/plugins/image-bake-store-sql.js +6 -0
- package/dist/plugins/image-index-sql.js +4 -0
- package/dist/plugins/landed-attendants.d.ts +212 -0
- package/dist/plugins/landed-attendants.js +161 -0
- package/dist/plugins/leader-run-store-sql.js +4 -0
- package/dist/plugins/local-checkpoint-store.d.ts +13 -3
- package/dist/plugins/local-checkpoint-store.js +38 -49
- package/dist/plugins/local-session-live-reference.d.ts +40 -0
- package/dist/plugins/local-session-live-reference.js +39 -0
- package/dist/plugins/local-session-store.d.ts +71 -33
- package/dist/plugins/local-session-store.js +129 -27
- package/dist/plugins/memory-engine-pg.js +4 -0
- package/dist/plugins/memory-engine-sql-apply.js +5 -2
- package/dist/plugins/memory-engine-tidb.js +4 -0
- package/dist/plugins/memory-optout-grant-store-sql.js +4 -0
- package/dist/plugins/memory-sync-store-pg.js +5 -0
- package/dist/plugins/memory-sync-store-tidb.js +5 -0
- package/dist/plugins/one-time-migrations.d.ts +104 -80
- package/dist/plugins/one-time-migrations.js +226 -132
- package/dist/plugins/org-delivery-quota-store.js +4 -1
- package/dist/plugins/outcome-ledger-sql.js +2 -0
- package/dist/plugins/permission-rule-store-sql.js +11 -4
- package/dist/plugins/pg-cost-quota.js +4 -0
- package/dist/plugins/pg-pool.js +35 -10
- package/dist/plugins/pg-rate-limiter.js +2 -0
- package/dist/plugins/posix-shell-fs.d.ts +6 -1
- package/dist/plugins/posix-shell-fs.js +4 -1
- package/dist/plugins/remote-env-adb.d.ts +19 -15
- package/dist/plugins/remote-env-adb.js +41 -15
- package/dist/plugins/remote-env-connect-seat.d.ts +105 -0
- package/dist/plugins/remote-env-connect-seat.js +72 -0
- package/dist/plugins/remote-env-device.d.ts +22 -5
- package/dist/plugins/remote-env-device.js +106 -8
- package/dist/plugins/remote-env-e2b.d.ts +15 -6
- package/dist/plugins/remote-env-e2b.js +42 -32
- package/dist/plugins/remote-env-file-error.js +6 -2
- package/dist/plugins/remote-env-host.d.ts +46 -10
- package/dist/plugins/remote-env-host.js +124 -52
- package/dist/plugins/remote-env-k8s.d.ts +109 -41
- package/dist/plugins/remote-env-k8s.js +160 -54
- package/dist/plugins/remote-env-local-docker.d.ts +13 -8
- package/dist/plugins/remote-env-local-docker.js +34 -41
- package/dist/plugins/remote-env-ssh.d.ts +18 -12
- package/dist/plugins/remote-env-ssh.js +60 -59
- package/dist/plugins/remote-shell.d.ts +98 -1
- package/dist/plugins/remote-shell.js +218 -0
- package/dist/plugins/replica-registration.d.ts +1 -1
- package/dist/plugins/replica-registration.js +1 -1
- package/dist/plugins/resume-anchor-store-sql.d.ts +11 -2
- package/dist/plugins/resume-anchor-store-sql.js +12 -5
- package/dist/plugins/retention-lane-store-sql.js +4 -0
- package/dist/plugins/retention-sql.d.ts +20 -2
- package/dist/plugins/retention-sql.js +11 -0
- package/dist/plugins/run-store-sql.d.ts +21 -2
- package/dist/plugins/run-store-sql.js +31 -7
- package/dist/plugins/s3-presign.d.ts +23 -0
- package/dist/plugins/s3-presign.js +37 -3
- package/dist/plugins/scenario-prefix-switch-m42.d.ts +1 -1
- package/dist/plugins/scenario-prefix-switch-m42.js +2 -2
- package/dist/plugins/scheduler-support.d.ts +2 -2
- package/dist/plugins/scheduler-support.js +0 -3
- package/dist/plugins/schema-consistency.d.ts +4 -2
- package/dist/plugins/schema-consistency.js +19 -2
- package/dist/plugins/schema-indexes.js +2 -0
- package/dist/plugins/send-file-ledger.d.ts +2 -2
- package/dist/plugins/send-file-ledger.js +5 -2
- package/dist/plugins/send-user-file.d.ts +3 -4
- package/dist/plugins/send-user-file.js +56 -52
- package/dist/plugins/serving-requirement.d.ts +26 -7
- package/dist/plugins/serving-requirement.js +11 -4
- package/dist/plugins/session-birth.d.ts +6 -2
- package/dist/plugins/session-blob-claim-token.d.ts +15 -0
- package/dist/plugins/session-blob-claim-token.js +20 -0
- package/dist/plugins/session-blob-namespace.d.ts +46 -0
- package/dist/plugins/session-blob-namespace.js +116 -0
- package/dist/plugins/session-capture-record-store-sql.js +2 -0
- package/dist/plugins/session-ext-table.d.ts +14 -1
- package/dist/plugins/session-ext-table.js +5 -1
- package/dist/plugins/session-row-sql.d.ts +49 -2
- package/dist/plugins/session-row-sql.js +56 -13
- package/dist/plugins/session-store-sql.d.ts +34 -18
- package/dist/plugins/session-store-sql.js +98 -17
- package/dist/plugins/shared-memory-store-sql.d.ts +1 -0
- package/dist/plugins/shared-memory-store-sql.js +6 -2
- package/dist/plugins/snapshot-bucket-presence.d.ts +25 -2
- package/dist/plugins/snapshot-bucket-presence.js +8 -2
- package/dist/plugins/sql-driver.d.ts +2 -1
- package/dist/plugins/sql-driver.js +18 -3
- package/dist/plugins/sql-errors.d.ts +11 -6
- package/dist/plugins/sql-errors.js +5 -6
- package/dist/plugins/sql-json-column.d.ts +1 -1
- package/dist/plugins/stop-then-start-sentence.d.ts +10 -4
- package/dist/plugins/stop-then-start-sentence.js +14 -10
- package/dist/plugins/stop-then-start.d.ts +109 -0
- package/dist/plugins/stop-then-start.js +104 -0
- package/dist/plugins/store-backend.d.ts +84 -15
- package/dist/plugins/store-backend.js +236 -72
- package/dist/plugins/store-boundary.d.ts +57 -0
- package/dist/plugins/store-boundary.js +139 -0
- package/dist/plugins/store-contracts.d.ts +17 -0
- package/dist/plugins/store-fault-sentence-m53.d.ts +7 -0
- package/dist/plugins/store-fault-sentence-m53.js +25 -0
- package/dist/plugins/store-fault.d.ts +26 -7
- package/dist/plugins/store-fault.js +18 -2
- package/dist/plugins/task-attachment-store.d.ts +2 -1
- package/dist/plugins/task-attachment-store.js +14 -1
- package/dist/plugins/task-list-store-sql.d.ts +2 -2
- package/dist/plugins/task-list-store-sql.js +10 -8
- package/dist/plugins/tidb-cost-quota.js +4 -0
- package/dist/plugins/tidb-pool.js +21 -25
- package/dist/plugins/tidb-rate-limiter.js +4 -0
- package/dist/plugins/user-input-ledger-sql.js +4 -0
- package/dist/plugins/workflow-run-store-sql.d.ts +28 -10
- package/dist/plugins/workflow-run-store-sql.js +64 -4
- package/dist/plugins/workspace-custody.d.ts +4 -3
- package/dist/plugins/workspace-fill.d.ts +4 -7
- package/dist/plugins/workspace-fill.js +2 -1
- package/dist/plugins/write-behind-counter.js +5 -0
- package/dist/project-context.d.ts +0 -2
- package/dist/project-context.js +4 -8
- package/dist/project-registry.d.ts +46 -0
- package/dist/project-registry.js +44 -0
- package/dist/question.d.ts +2 -1
- package/dist/question.js +5 -13
- package/dist/request-form.d.ts +6 -1
- package/dist/request-form.js +4 -1
- package/dist/request-key-closure.js +1 -1
- package/dist/request-value-closure.d.ts +4 -0
- package/dist/request-value-closure.js +10 -0
- package/dist/rule-issue-reading.d.ts +1 -1
- package/dist/rules-consent.d.ts +1 -1
- package/dist/run-acceptance.d.ts +3 -2
- package/dist/run-acceptance.js +4 -6
- package/dist/run-local.js +9 -9
- package/dist/runs.d.ts +54 -16
- package/dist/runs.js +67 -13
- package/dist/runtime-governance.d.ts +5 -4
- package/dist/security.d.ts +30 -32
- package/dist/security.js +41 -7
- package/dist/sema-config-dir.d.ts +2 -1
- package/dist/server-secret-env.d.ts +12 -10
- package/dist/server-secret-env.js +24 -15
- package/dist/session-bindings.d.ts +82 -0
- package/dist/session-bindings.js +18 -0
- package/dist/session-children-retire.d.ts +2 -2
- package/dist/session-children-retire.js +2 -6
- package/dist/session-deletion.d.ts +16 -1
- package/dist/session-error-wire.d.ts +3 -3
- package/dist/session-error-wire.js +3 -3
- package/dist/session-incarnation.d.ts +10 -0
- package/dist/session-incarnation.js +10 -1
- package/dist/session-kind.d.ts +57 -0
- package/dist/session-kind.js +22 -0
- package/dist/session-row.d.ts +21 -1
- package/dist/session-row.js +7 -1
- package/dist/session-sync-kernel.d.ts +24 -14
- package/dist/session-sync-kernel.js +3 -6
- package/dist/session-sync.d.ts +25 -103
- package/dist/session-sync.js +14 -76
- package/dist/session-titler.d.ts +10 -3
- package/dist/session-titler.js +19 -6
- package/dist/ssh-host-key.d.ts +5 -0
- package/dist/ssh-host-key.js +3 -0
- package/dist/stores-sql/blob-index-sql.d.ts +30 -9
- package/dist/stores-sql/blob-index-sql.js +40 -21
- package/dist/stores-sql/checkpoint-store-sql.d.ts +54 -27
- package/dist/stores-sql/checkpoint-store-sql.js +70 -146
- package/dist/stores-sql/file-history-store-sql.d.ts +113 -15
- package/dist/stores-sql/file-history-store-sql.js +205 -95
- package/dist/stores-sql/pg-session-storage.d.ts +34 -7
- package/dist/stores-sql/pg-session-storage.js +37 -13
- package/dist/stores-sql/retention-store-sql.d.ts +1 -9
- package/dist/stores-sql/retention-store-sql.js +5 -19
- package/dist/stores-sql/session-policy-store-sql.d.ts +30 -7
- package/dist/stores-sql/session-policy-store-sql.js +61 -44
- package/dist/stores-sql/session-write-hooks.d.ts +11 -0
- package/dist/stores-sql/tidb-session-store.d.ts +58 -7
- package/dist/stores-sql/tidb-session-store.js +37 -13
- package/dist/submission-exit.d.ts +3 -2
- package/dist/submission-exit.js +9 -1
- package/dist/task-cwd.d.ts +2 -2
- package/dist/task-settings.d.ts +7 -5
- package/dist/task-settings.js +3 -3
- package/dist/terminal.d.ts +33 -2
- package/dist/terminal.js +139 -9
- package/dist/tool-approval.d.ts +465 -507
- package/dist/tool-approval.js +606 -1222
- package/dist/trace/core-keyset-guard.d.ts +1 -1
- package/dist/trace/ledger-events.d.ts +3 -3
- package/dist/trace/project.d.ts +2 -3
- package/dist/trace/redact.js +3 -2
- package/dist/trace/self-minted-wire.d.ts +571 -178
- package/dist/trace/self-minted-wire.js +189 -56
- package/dist/web-admin-client/apply-effective.js +2 -2
- package/dist/web-admin-client/read-warnings.d.ts +2 -2
- package/dist/web-admin-client/read-warnings.js +1 -1
- package/dist/web-admin-client/types.d.ts +1 -1
- package/dist/workspace-space.d.ts +10 -4
- package/dist/workspace-space.js +4 -1
- package/docs/DEVICE-EXECUTOR-PROTOCOL.md +79 -28
- package/package.json +7 -3
- package/scripts/embed-minimal.mjs +3 -3
- package/wire-changes/server@7.151.0.json +762 -0
- package/wire-changes/server@7.152.0.json +900 -0
- package/dist/config-d-migration.d.ts +0 -37
- package/dist/config-d-migration.js +0 -60
- package/dist/http/session-inherit-env.d.ts +0 -36
- package/dist/http/session-inherit-env.js +0 -6
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* **一个进入 run 的权限模式词(调用方交来的,或停驻 run 的存储体被重放时体上的),本部署收不收、收成什么** —— 唯一的受理判官(规则一处、三只属主各一处、序一处)。
|
|
3
3
|
*
|
|
4
4
|
* ## 一条规则,三只属主,本模块只排序
|
|
5
5
|
* ① 本任务 settings 的 kill-switch 折叠(`task-settings.ts` `foldDisableAutoMode`:`disableAutoMode` 在 ⇒ `auto` 折 `default`);
|
|
@@ -8,12 +8,31 @@
|
|
|
8
8
|
* ①② 是**入口一步**({@link entryStep}:改词、不拒),③ 是**托管一步**(只拒、不改词)。顺序承重的只有「② 在 ③ 之前」(地板把 bypass 钳成 plan 之后就不开写面,不拒);
|
|
9
9
|
* ① 只动 `auto`、③ 只看开写面的词,两者互不相交。
|
|
10
10
|
*
|
|
11
|
-
* ##
|
|
11
|
+
* ## 三口的调用形(同一组函数、同一个序;提交口与切档口:同一个词 × 同一份部署事实 × 同一份任务 settings ⇒ 同一个结果,钉 `test/run-permission-mode-admission.test.ts` 的两口表;
|
|
12
|
+
* 续跑口与它们只差一张写据,钉 `test/entry-permission-mode.test.ts` 的续跑口表)
|
|
12
13
|
* · 在飞 run 的切档口(`http/routes/run-permission-mode.ts`:`POST /v1/runs/:id/permission-mode` 的 `mode`,本任务 settings 读存储体)调整只判官 {@link admitPermissionModeWord}。
|
|
13
14
|
* · 提交口(`POST /v1/tasks|/v1/tasks/stream|/v1/runs` 的词 = 顶层 `permissionMode` ?? bundle `settings.permissions.defaultMode`)把两步落在**上一版就在的两处**:
|
|
14
15
|
* 入口一步在受理门盖章({@link stampSubmissionEntryMode},`http/admission.ts`:值形门之后、装配之前 —— 首跑装配与 `buildCheckpointCtx` 读的都是盖过章的体);
|
|
15
16
|
* 托管一步是装配期那一处判(`boot/resolve-spec.ts`,对盖过章的词调同一只 ③;提交腿与续跑重放腿同经)。不把整只判官提前到受理门:那会让托管拒抢在
|
|
16
|
-
* 属主 / 会话 / 执行上下文与装配期其余值判之前答(拒序变了 —— 钉同一文件的拒序组)
|
|
17
|
+
* 属主 / 会话 / 执行上下文与装配期其余值判之前答(拒序变了 —— 钉同一文件的拒序组)。
|
|
18
|
+
* · 续跑口(一条 HTTP 车道停驻 run 的存储体被重放之前;`http/resume-legs.ts` 的 `replayCtxOf`,五个续跑读点同调;leader 车道的行按那条车道「一 run 一读」照写下的体重放,
|
|
19
|
+
* 规则在 `replayCtxOf` 头注)调 {@link stampReplayEntryMode}:体上的词过与提交口**同一只**入口一步
|
|
20
|
+
* ({@link bodyEntry}:同一只折叠、同一只 `entryPermissionMode`、地板读同一份**活** config)—— 提交之后运维把 `AUTONOMY` 改严,或体是更早的写者留下的请求原词,
|
|
21
|
+
* 重放照**现**地板钳;被钳 = 钳到地板放行(与提交口同形,不拒、不新增码),生效词由这条腿的 `wiring_manifest.permissionMode` 说;钳过的体随 CAS 赢点写回,
|
|
22
|
+
* 存储体仍是这条 run 模式词唯一的源。与提交口只差一张**写据**(不是续跑专用臂,见下一节):写据说体顶层那一格是这块地板的出口写下的、且仍是它写下的那一格 ⇒ 原样读。
|
|
23
|
+
* 托管一步照旧在装配期判。
|
|
24
|
+
*
|
|
25
|
+
* ## 写据:存储体上的模式词谁写的(一条规则)
|
|
26
|
+
* 存储体顶层 `permissionMode` 那一格谁写,谁就在同一笔写里留一张写据({@link PermissionModeWrite} `{ by, mode }`,`CheckpointCtx.permissionModeWrite`:服务端写、
|
|
27
|
+
* 客户端够不着)。写者闭集四个({@link PERMISSION_MODE_WRITERS}):`submission`(提交写口 `buildCheckpointCtx`,经 `http/submit-ctx.ts` `persistSubmissionCtx`;leader worker 的续跑体)、
|
|
28
|
+
* `switch`(在飞切档的写回)、`replay`(本模块续跑口的钳)、`plan_review`(`http/resume-legs.ts` `drivePlanReview` 批准 / 编辑把计划带出 plan 的写回 —— plan 地板的出口:一个人批了这份计划)。
|
|
29
|
+
* 新的持久化写经构造口(写据是它的必填键,漏写 = 编译红);改写那一格经一只改写口 {@link withStoredPermissionMode}(一笔换词、换写据)。
|
|
30
|
+
* 读者只有一个:续跑口。地板在场时只问「这块地板的出口是谁」({@link floorExitWriter})—— 写据的 `by` 就是它、且写据的 `mode` 仍等于体顶层的原值 ⇒ 原样;
|
|
31
|
+
* 其余一律照现地板钳(缺写据 = 7.152.0 之前写下的行,或从这样的行照抄的体;别的写者写下的同字词;bundle 拼法;kill-switch 折出来的词;词表外的串 —— 都落在这一个「否」里)。
|
|
32
|
+
* `mode` 绑定为什么承重:更早版本的副本(滚动升级窗、回滚再升回)读 ctx 时把不认识的兄弟键展开带走,把词改成另一个词却不改写据 ⇒ 写据对不上那一格 ⇒ 照钳(失效关闭,不读版本号)。
|
|
33
|
+
* ⚠️ 射程如实:旧副本把词切走又切回写据上的同一个词(批准写下 `acceptEdits` 之后在旧副本上 `acceptEdits → default → acceptEdits` 切档),写据仍对得上 ⇒ 原样 ——
|
|
34
|
+
* 与 7.151.0 同读(不比上一版宽);只看 `mode` 分不出这一形,要分开得让写据记下「最后写这一行的进程认得写据」(未闭项,MIGRATION 如实写)。
|
|
35
|
+
* 无地板时写据不参与判定;读口照样判形(读不出 = 坏体,不论地板)。写据的形只有一种读法({@link permissionModeWriteOf},续跑上下文读口经它判)。
|
|
17
36
|
*
|
|
18
37
|
* ## 为什么切档口必须经这只判官(而不是靠引擎的 deny 位)
|
|
19
38
|
* 引擎在根腿上只认两只模式拒位(`RuntimeCaps.bypassPermissions` / `RuntimeCaps.autoMode`,本仓由 center 与本地 kill-switch 写);上面三问
|
|
@@ -26,6 +45,7 @@
|
|
|
26
45
|
* `foldedBy`(本判官把词改了的那一站;没改 ⇒ 缺席。① ② 都改了 ⇒ `entry_floor`:落定的词是地板给的)。
|
|
27
46
|
*/
|
|
28
47
|
import type { PermissionMode } from "@sema-agent/core";
|
|
48
|
+
import type { CheckpointCtx } from "./http/route-ctx.js";
|
|
29
49
|
import { type Autonomy, type EntryPermissionMode } from "./runtime-governance.js";
|
|
30
50
|
import { HOST_POSTURE_REFUSED_CODE, type TaskWriteFaceInput } from "./hosted-posture.js";
|
|
31
51
|
import { type ParsedTaskSettings } from "./task-settings.js";
|
|
@@ -55,8 +75,8 @@ export type PermissionModeAdmission = {
|
|
|
55
75
|
export declare function admitPermissionModeWord(word: PermissionMode | undefined, facts: PermissionModeAdmissionFacts): PermissionModeAdmission;
|
|
56
76
|
/**
|
|
57
77
|
* 提交口的入口一步(`http/admission.ts` 唯一调用;直调装配腿的测试夹具也调它 —— 少了这一步的体是部署上到不了的体):
|
|
58
|
-
*
|
|
59
|
-
*
|
|
78
|
+
* 体上的词过 {@link bodyEntry};入口词盖进体(`task-settings.ts` `stampEntryPermissionMode`:地板在场时写顶层 `permissionMode`,缺席原物)。
|
|
79
|
+
* 不拒 —— 托管一步在装配期判(见顶注「三口的调用形」)。
|
|
60
80
|
*/
|
|
61
81
|
export declare function stampSubmissionEntryMode<B extends {
|
|
62
82
|
permissionMode?: unknown;
|
|
@@ -65,4 +85,53 @@ export declare function stampSubmissionEntryMode<B extends {
|
|
|
65
85
|
readonly body: B;
|
|
66
86
|
readonly entry: EntryPermissionMode;
|
|
67
87
|
};
|
|
88
|
+
/** 存储体顶层 `permissionMode` 那一格的写者闭集(顶注「写据」)。加一个写者 ⇒ 加一词;它默认不是任何地板的出口(失效关闭),要当出口必须改 {@link floorExitWriter} 的穷尽表。 */
|
|
89
|
+
export declare const PERMISSION_MODE_WRITERS: readonly ["submission", "switch", "replay", "plan_review"];
|
|
90
|
+
export type PermissionModeWriter = (typeof PERMISSION_MODE_WRITERS)[number];
|
|
91
|
+
/**
|
|
92
|
+
* 写据:谁写了存储体顶层 `permissionMode` 那一格、写下的是什么(`mode` = 写完那一刻顶层的原值;缺席 = 那一格写完是空的,或不是引擎的模式词)。
|
|
93
|
+
* 每个写者都写自己的那一张(一条规则,不分写者);读者只在 `by` 是这块地板的出口时拿 `mode` 去对体顶层(绑定,见顶注)。
|
|
94
|
+
*/
|
|
95
|
+
export interface PermissionModeWrite {
|
|
96
|
+
readonly by: PermissionModeWriter;
|
|
97
|
+
readonly mode?: PermissionMode;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* 一块入口地板的**出口写者** —— 存储体上由它写下的那一格,续跑口原样读(顶注「写据」)。闭集穷尽 switch:引擎的模式词表加一词 ⇒ 编译红,
|
|
101
|
+
* 逼着回答「这个词当地板时靠什么出口」。`plan` 的出口是人审(`plan_review` 的批准 / 编辑把计划带出 plan);其余五词今天不是任何档的地板
|
|
102
|
+
* (`runtime-governance.ts` `autonomyModeFloor` 只答 `plan` 或缺席),当地板也没有出口 ⇒ 缺席(失效关闭:比它松的词照钳)。
|
|
103
|
+
*/
|
|
104
|
+
export declare function floorExitWriter(floor: PermissionMode): PermissionModeWriter | undefined;
|
|
105
|
+
/** 提交写者的那一张写据:`mode` = 这份要落盘的体顶层的原值(严格读;不是引擎的模式词 ⇒ 缺席)。调用点 = 两只构造口调用方(`http/submit-ctx.ts` `persistSubmissionCtx`、`leader/wire.ts` 的 worker 续跑体)。 */
|
|
106
|
+
export declare function submissionPermissionModeWrite(body: {
|
|
107
|
+
readonly permissionMode?: unknown;
|
|
108
|
+
}): PermissionModeWrite;
|
|
109
|
+
/**
|
|
110
|
+
* **改写口**(唯一):把存储体顶层 `permissionMode` 那一格换成 `mode`,同一笔换上写者 `by` 的写据;其余位(含 bundle 拼法、无人值守标、写者版本)随行。
|
|
111
|
+
* 三个调用点:切档写回(`switch`)、续跑口的钳(`replay`,本模块 {@link stampReplayEntryMode})、`plan_review` 的出口写回(`plan_review`)。提交写者不经它(新行经构造口)。
|
|
112
|
+
*/
|
|
113
|
+
export declare function withStoredPermissionMode(ctx: CheckpointCtx, mode: PermissionMode, by: Exclude<PermissionModeWriter, "submission">): CheckpointCtx;
|
|
114
|
+
/** {@link permissionModeWriteOf} 的结局:缺席 / 读得出 / 形不对(读口答坏体)。 */
|
|
115
|
+
export type PermissionModeWriteReading = {
|
|
116
|
+
readonly kind: "absent";
|
|
117
|
+
} | {
|
|
118
|
+
readonly kind: "ok";
|
|
119
|
+
readonly write: PermissionModeWrite;
|
|
120
|
+
} | {
|
|
121
|
+
readonly kind: "malformed";
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* 落盘写据(持久化 JSON,不信型面)的**唯一**读法:缺席 ⇒ `absent`;对象、键只在 `by` / `mode` 之内、`by` 在写者闭集里、`mode` 缺席或是引擎的模式词 ⇒ `ok`(交读法铸的那一份);
|
|
125
|
+
* 其余(不是对象、多键、`by` 不认得 —— 含更新版本加的写者、`mode` 在场却不是模式词)⇒ `malformed`。唯一调用方 = 续跑上下文读口(`http/resume-ctx-read.ts`:`malformed` ⇒ 坏体)。
|
|
126
|
+
*/
|
|
127
|
+
export declare function permissionModeWriteOf(stored: unknown): PermissionModeWriteReading;
|
|
128
|
+
/**
|
|
129
|
+
* 续跑口的入口一步:一条停驻 run 的存储体被重放之前,体上的词过 {@link bodyEntry}(与提交口同一只,地板读此刻的活 config)。
|
|
130
|
+
* · 地板缺席 ⇒ ctx **原物**(零字节变化;写据不被读);
|
|
131
|
+
* · 写据说体顶层那一格是这块地板的出口写下的({@link floorExitWriter})、且 `mode` 仍等于顶层原值 ⇒ ctx **原物**(那一格已经过了地板);
|
|
132
|
+
* · 其余 ⇒ 经改写口盖入口词、写据换成 `replay`(顶注「写据」:缺写据、别的写者写下的同字词、bundle 拼法、折出来的词都在这里)。
|
|
133
|
+
* 不拒:钳到地板放行,与提交口同形(见顶注「三口的调用形」)。入参是 ctx(写据是体的兄弟键)。
|
|
134
|
+
* 唯一调用点:`http/resume-legs.ts` 的 `replayCtxOf`(五个续跑读点同调;之后的存体预判、重建、plan_review 的模式词门与驱动段、CAS 赢点的写回读的都是它交回的那一份)。
|
|
135
|
+
*/
|
|
136
|
+
export declare function stampReplayEntryMode(ctx: CheckpointCtx, deployment: PermissionModeAdmissionFacts["deployment"]): CheckpointCtx;
|
|
68
137
|
//# sourceMappingURL=permission-mode-admission.d.ts.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { autonomyModeFloor, entryPermissionMode } from "./runtime-governance.js";
|
|
2
2
|
import { HOST_POSTURE_REFUSED_CODE, permissionModeWriteFaceRefusal } from "./hosted-posture.js";
|
|
3
|
-
import { foldDisableAutoMode, parseTaskSettings, requestedPermissionMode, stampEntryPermissionMode } from "./task-settings.js";
|
|
3
|
+
import { coercePermissionModeStrict, foldDisableAutoMode, parseTaskSettings, requestedPermissionMode, stampEntryPermissionMode } from "./task-settings.js";
|
|
4
4
|
export const PERMISSION_MODE_ADMISSION_FOLDS = ["entry_floor", "disable_auto_mode"];
|
|
5
5
|
function entryStep(word, facts) {
|
|
6
6
|
const folded = foldDisableAutoMode(word, facts.settings);
|
|
@@ -15,9 +15,62 @@ export function admitPermissionModeWord(word, facts) {
|
|
|
15
15
|
return { kind: "refused", status: 422, code: HOST_POSTURE_REFUSED_CODE, message: why };
|
|
16
16
|
return { kind: "admitted", requested: word, admitted: entry.effective, entry, ...(foldedBy !== undefined ? { foldedBy } : {}) };
|
|
17
17
|
}
|
|
18
|
-
|
|
18
|
+
function bodyEntry(body, deployment) {
|
|
19
19
|
const settings = parseTaskSettings(body.settings).settings;
|
|
20
|
-
|
|
20
|
+
return entryStep(requestedPermissionMode(body, settings), { deployment, settings }).entry;
|
|
21
|
+
}
|
|
22
|
+
export function stampSubmissionEntryMode(body, deployment) {
|
|
23
|
+
const entry = bodyEntry(body, deployment);
|
|
21
24
|
return { body: stampEntryPermissionMode(body, entry), entry };
|
|
22
25
|
}
|
|
26
|
+
export const PERMISSION_MODE_WRITERS = ["submission", "switch", "replay", "plan_review"];
|
|
27
|
+
export function floorExitWriter(floor) {
|
|
28
|
+
switch (floor) {
|
|
29
|
+
case "plan":
|
|
30
|
+
return "plan_review";
|
|
31
|
+
case "default":
|
|
32
|
+
case "acceptEdits":
|
|
33
|
+
case "auto":
|
|
34
|
+
case "bypassPermissions":
|
|
35
|
+
case "dontAsk":
|
|
36
|
+
return undefined;
|
|
37
|
+
default: {
|
|
38
|
+
const unhandled = floor;
|
|
39
|
+
throw new Error(`entry floor "${String(unhandled)}" has no exit arm`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export function submissionPermissionModeWrite(body) {
|
|
44
|
+
const mode = coercePermissionModeStrict(body.permissionMode);
|
|
45
|
+
return { by: "submission", ...(mode !== undefined ? { mode } : {}) };
|
|
46
|
+
}
|
|
47
|
+
export function withStoredPermissionMode(ctx, mode, by) {
|
|
48
|
+
return { ...ctx, body: { ...ctx.body, permissionMode: mode }, permissionModeWrite: { by, mode } };
|
|
49
|
+
}
|
|
50
|
+
export function permissionModeWriteOf(stored) {
|
|
51
|
+
if (stored === undefined)
|
|
52
|
+
return { kind: "absent" };
|
|
53
|
+
if (typeof stored !== "object" || stored === null || Array.isArray(stored))
|
|
54
|
+
return { kind: "malformed" };
|
|
55
|
+
if (!Object.keys(stored).every((k) => k === "by" || k === "mode"))
|
|
56
|
+
return { kind: "malformed" };
|
|
57
|
+
const by = Object.hasOwn(stored, "by") ? stored["by"] : undefined;
|
|
58
|
+
const raw = Object.hasOwn(stored, "mode") ? stored["mode"] : undefined;
|
|
59
|
+
const writer = PERMISSION_MODE_WRITERS.find((w) => w === by);
|
|
60
|
+
if (writer === undefined)
|
|
61
|
+
return { kind: "malformed" };
|
|
62
|
+
if (raw === undefined)
|
|
63
|
+
return { kind: "ok", write: { by: writer } };
|
|
64
|
+
const mode = coercePermissionModeStrict(raw);
|
|
65
|
+
return mode === undefined ? { kind: "malformed" } : { kind: "ok", write: { by: writer, mode } };
|
|
66
|
+
}
|
|
67
|
+
export function stampReplayEntryMode(ctx, deployment) {
|
|
68
|
+
const { floor, effective } = bodyEntry(ctx.body, deployment);
|
|
69
|
+
if (floor === undefined || effective === undefined)
|
|
70
|
+
return ctx;
|
|
71
|
+
const write = ctx.permissionModeWrite;
|
|
72
|
+
if (write !== undefined && write.by === floorExitWriter(floor) && write.mode !== undefined && write.mode === ctx.body.permissionMode)
|
|
73
|
+
return ctx;
|
|
74
|
+
return withStoredPermissionMode(ctx, effective, "replay");
|
|
75
|
+
}
|
|
23
76
|
//# sourceMappingURL=permission-mode-admission.js.map
|
|
@@ -133,8 +133,10 @@ export declare class SqlAdoptionLogStore implements AdoptionLogStore {
|
|
|
133
133
|
constructor(db: SqlDriver);
|
|
134
134
|
private q;
|
|
135
135
|
/** 池级只读执行面(phase 0 的 preflight 扫描用——它**零写**,不需要也不该占一条事务连接)。
|
|
136
|
-
* 写路径一律走 {@link rebindTransaction};把驱动整个暴露出去会让调用方能绕开 phase CAS。
|
|
136
|
+
* 写路径一律走 {@link rebindTransaction};把驱动整个暴露出去会让调用方能绕开 phase CAS。
|
|
137
|
+
* 交出的是**封过**的执行面(只一个 `query`,出店口:库错只带原码 + 稳定句),不是驱动本身。 */
|
|
137
138
|
get reader(): SqlExec;
|
|
139
|
+
private sealedReader;
|
|
138
140
|
/**
|
|
139
141
|
* 发起腿的 **insert-or-fetch 原子形**。返回读回的行(可能是别人插的)+ 是否本次插入。
|
|
140
142
|
* 调用方据 `row.toPrincipal !== toPrincipal` 判「同 from 异 to」⇒ typed 409。
|
|
@@ -3,6 +3,7 @@ import { createHash } from "node:crypto";
|
|
|
3
3
|
import { mysqlDriver, pgDriver } from "./sql-driver.js";
|
|
4
4
|
import { acquireAdvisoryLockWithin, releaseAdvisoryLock } from "./ensure-schema-lock-policy.js";
|
|
5
5
|
import { ensureIndexes } from "./ensure-index.js";
|
|
6
|
+
import { sealStoreClass, sealStoreObject } from "./store-boundary.js";
|
|
6
7
|
export const ADOPTION_LOG_TABLE = "adoption_log";
|
|
7
8
|
export const ADOPTION_PHASE = {
|
|
8
9
|
INTENT: 2,
|
|
@@ -105,8 +106,9 @@ export class SqlAdoptionLogStore {
|
|
|
105
106
|
return this.db.dialect === "mysql" ? mysql : pg;
|
|
106
107
|
}
|
|
107
108
|
get reader() {
|
|
108
|
-
return this.db;
|
|
109
|
+
return (this.sealedReader ??= sealStoreObject({ query: (sql, params) => this.db.query(sql, params) }, "sql-adoption-log-reader", { query: "exit" }));
|
|
109
110
|
}
|
|
111
|
+
sealedReader;
|
|
110
112
|
async ensureAdoption(row) {
|
|
111
113
|
const emptyLegs = "[]";
|
|
112
114
|
const res = await this.db.query(this.q(`INSERT IGNORE INTO ${ADOPTION_LOG_TABLE} (${COLS}) VALUES (?, ?, ?, ?, 'in_flight', ?, ?, NULL, NULL, NULL, ?, ?)`, `INSERT INTO ${ADOPTION_LOG_TABLE} (${COLS}) VALUES ($1, $2, $3, $4, 'in_flight', $5, $6, NULL, NULL, NULL, $7, $8) ON CONFLICT (from_principal) DO NOTHING`), [row.adoptionId, row.fromPrincipal, row.toPrincipal, ADOPTION_PHASE.INTENT, emptyLegs, emptyLegs, row.nowMs, row.nowMs]);
|
|
@@ -216,6 +218,10 @@ export class SqlAdoptionLogStore {
|
|
|
216
218
|
}
|
|
217
219
|
}
|
|
218
220
|
}
|
|
221
|
+
sealStoreClass(SqlAdoptionLogStore, "sql-adoption-log-store", {
|
|
222
|
+
ensureAdoption: "exit", getById: "exit", getByFrom: "exit", listInFlight: "exit", rebindOn: "exit", sweepOn: "exit", advancePhase: "exit", putConfigs: "exit",
|
|
223
|
+
finalizeAdopted: "exit", finalizeRejected: "exit", withLock: "exit",
|
|
224
|
+
});
|
|
219
225
|
export class TiDBAdoptionLogStore extends SqlAdoptionLogStore {
|
|
220
226
|
constructor(pool) {
|
|
221
227
|
super(mysqlDriver(pool));
|
|
@@ -2,7 +2,7 @@ import { type ExecutionLane } from "../execution-lane-caps.js";
|
|
|
2
2
|
import { type LocalAskLaneBackfillRefusal } from "./one-time-migrations.js";
|
|
3
3
|
import type { AskState } from "../approval-ask-machine.js";
|
|
4
4
|
import type { SettleCause } from "../approval-deny-reasons.js";
|
|
5
|
-
import type { AskCallCoordinate, AskRow, AskTerminalClaimIntent, AskTerminalClaimOpts, AskTerminalClaimOutcome, AskTransitionPatch, ApprovalAskStore, BatchRow, BindGateInput, BindResult, DecideAskInput, DecideResult, EnsureAskResult, ExpireResult, NewAskRow } from "./approval-ask-store-sql.js";
|
|
5
|
+
import type { AskCallCoordinate, AskDecisionRecord, AskRow, AskTerminalClaimIntent, AskTerminalClaimOpts, AskTerminalClaimOutcome, AskTransitionPatch, ApprovalAskStore, BatchRow, BindGateInput, BindResult, DecideAskInput, DecideResult, EnsureAskResult, ExpireResult, NewAskRow, RecordParkedDecisionResult } from "./approval-ask-store-sql.js";
|
|
6
6
|
/** 数据根下的目录名。**按店命名**,与兄弟 File 店同规(`approval-nonces` / `approval-ask-audit` /
|
|
7
7
|
* `approval-exemptions` / `resume-anchors` / `checkpoint-ctx` / …)—— 首版写的是族名 `approvals`,而那
|
|
8
8
|
* 正是读者会去找**持久 park 行**的地方(它们其实在 `checkpoint-ctx`),且持久数据面的名字按硬 breaking
|
|
@@ -24,7 +24,7 @@ export declare const ASK_JOURNAL_COMPACT_GROWTH = 2;
|
|
|
24
24
|
* 账本的**动词闭集**([ref] 形)。运行期的词表判定与编译期的穷尽 `switch` 读同一份:
|
|
25
25
|
* 往这里加一个词,{@link FileApprovalAskStore.replayOp} 的 switch 立刻编译红(漏一口不可能发布)。
|
|
26
26
|
*/
|
|
27
|
-
declare const JOURNAL_OPS: readonly ["ensureAsk", "transitionAsk", "decideAsk", "claimTerminal", "claimTerminalRefuse", "expireAsk", "bindBatch", "abortBatch", "deferReconcile", "resolveProvisional", "deleteBySession", "reapSettledAsks", "reapEmptyBatches"];
|
|
27
|
+
declare const JOURNAL_OPS: readonly ["ensureAsk", "transitionAsk", "decideAsk", "recordParkedDecision", "claimTerminal", "claimTerminalRefuse", "expireAsk", "bindBatch", "abortBatch", "deferReconcile", "resolveProvisional", "deleteBySession", "reapSettledAsks", "reapEmptyBatches"];
|
|
28
28
|
type JournalOpWord = (typeof JOURNAL_OPS)[number];
|
|
29
29
|
/** 运行期词表(上面的数组)与类型面动词维({@link JournalCall})的**双向**对表 —— 任一边加词而另一边
|
|
30
30
|
* 没跟上,这个别名解析成 `never`,{@link JOURNAL_OP_TABLE_GATE} 的赋值当场编译红。 */
|
|
@@ -59,6 +59,12 @@ type JournalCall = {
|
|
|
59
59
|
askId: string;
|
|
60
60
|
batchId: string;
|
|
61
61
|
decision: DecideAskInput;
|
|
62
|
+
}
|
|
63
|
+
/** 停驻形的人决落行。更老的读者不认这个动词 ⇒ 拒启并点名出路(与留存两动词同一条降级纪律)。 */
|
|
64
|
+
| {
|
|
65
|
+
op: "recordParkedDecision";
|
|
66
|
+
askId: string;
|
|
67
|
+
record: AskDecisionRecord;
|
|
62
68
|
} | {
|
|
63
69
|
op: "claimTerminal";
|
|
64
70
|
askId: string;
|
|
@@ -202,6 +208,8 @@ export declare class FileApprovalAskStore implements ApprovalAskStore {
|
|
|
202
208
|
* (整本账的信封号另算 —— 见顶注「信封版本」)。
|
|
203
209
|
*/
|
|
204
210
|
decideAsk(askId: string, batchId: string, owner: string | null, decision: DecideAskInput): Promise<DecideResult>;
|
|
211
|
+
/** 停驻形的人决落行 —— 出域的一次不落账本(与 {@link decideAsk} 同一条 [ref] 理由),其余落账 → 内核。 */
|
|
212
|
+
recordParkedDecision(askId: string, owner: string | null, record: AskDecisionRecord): Promise<RecordParkedDecisionResult>;
|
|
205
213
|
claimTerminal(askId: string, batchId: string, intent: AskTerminalClaimIntent, opts?: AskTerminalClaimOpts): Promise<AskTerminalClaimOutcome>;
|
|
206
214
|
expireAsk(askId: string, batchId: string): Promise<ExpireResult>;
|
|
207
215
|
bindBatch(batchId: string, askId: string, gate: BindGateInput): Promise<BindResult>;
|
|
@@ -227,6 +235,10 @@ export declare class FileApprovalAskStore implements ApprovalAskStore {
|
|
|
227
235
|
listPendingBySession(sessionId: string, owner: string | null, signal?: AbortSignal): Promise<AskRow[]>;
|
|
228
236
|
listByCall(call: AskCallCoordinate): Promise<AskRow[]>;
|
|
229
237
|
listParkingBySourceSession(sourceSessionId: string): Promise<AskRow[]>;
|
|
238
|
+
listAsksAtGate(sourceSessionId: string, binding: {
|
|
239
|
+
readonly boundCallId: string;
|
|
240
|
+
readonly boundInputHash: string;
|
|
241
|
+
}): Promise<AskRow[]>;
|
|
230
242
|
getAsk(askId: string): Promise<AskRow | null>;
|
|
231
243
|
getByIdempotencyKey(taskId: string, key: string): Promise<AskRow | null>;
|
|
232
244
|
getBatch(batchId: string): Promise<BatchRow | null>;
|
|
@@ -20,6 +20,7 @@ const JOURNAL_OPS = [
|
|
|
20
20
|
"ensureAsk",
|
|
21
21
|
"transitionAsk",
|
|
22
22
|
"decideAsk",
|
|
23
|
+
"recordParkedDecision",
|
|
23
24
|
"claimTerminal",
|
|
24
25
|
"claimTerminalRefuse",
|
|
25
26
|
"expireAsk",
|
|
@@ -280,6 +281,8 @@ export class FileApprovalAskStore {
|
|
|
280
281
|
return this.core.transitionAsk(rec.askId, rec.from, rec.to, rec.patch);
|
|
281
282
|
case "decideAsk":
|
|
282
283
|
return this.core.decideAsk(rec.askId, rec.batchId, this.core.peekAsk(rec.askId)?.owner ?? null, rec.decision);
|
|
284
|
+
case "recordParkedDecision":
|
|
285
|
+
return this.core.recordParkedDecision(rec.askId, this.core.peekAsk(rec.askId)?.owner ?? null, rec.record);
|
|
283
286
|
case "claimTerminal":
|
|
284
287
|
return this.core.claimTerminal(rec.askId, rec.batchId, rec.intent, rec.cause !== undefined ? { cause: rec.cause } : undefined);
|
|
285
288
|
case "claimTerminalRefuse":
|
|
@@ -318,6 +321,11 @@ export class FileApprovalAskStore {
|
|
|
318
321
|
return this.core.decideAsk(askId, batchId, owner, journalled);
|
|
319
322
|
return this.write({ op: "decideAsk", askId, batchId, decision: journalled }, (c) => this.core.decideAsk(c.askId, c.batchId, owner, c.decision));
|
|
320
323
|
}
|
|
324
|
+
async recordParkedDecision(askId, owner, record) {
|
|
325
|
+
if (!askRowCarriesOwner(this.core.peekAsk(askId), owner))
|
|
326
|
+
return this.core.recordParkedDecision(askId, owner, record);
|
|
327
|
+
return this.write({ op: "recordParkedDecision", askId, record }, (c) => this.core.recordParkedDecision(c.askId, owner, c.record));
|
|
328
|
+
}
|
|
321
329
|
async claimTerminal(askId, batchId, intent, opts) {
|
|
322
330
|
switch (intent) {
|
|
323
331
|
case "expire":
|
|
@@ -378,6 +386,9 @@ export class FileApprovalAskStore {
|
|
|
378
386
|
listParkingBySourceSession(sourceSessionId) {
|
|
379
387
|
return this.core.listParkingBySourceSession(sourceSessionId);
|
|
380
388
|
}
|
|
389
|
+
listAsksAtGate(sourceSessionId, binding) {
|
|
390
|
+
return this.core.listAsksAtGate(sourceSessionId, binding);
|
|
391
|
+
}
|
|
381
392
|
getAsk(askId) {
|
|
382
393
|
return this.core.getAsk(askId);
|
|
383
394
|
}
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
*/
|
|
32
32
|
import { type AskState, type BatchState } from "../approval-ask-machine.js";
|
|
33
33
|
import type { ExecutionLane } from "../execution-lane-caps.js";
|
|
34
|
-
import type { AskCallCoordinate, AskDecision, AskRow, AskTerminalClaimIntent, AskTerminalClaimOpts, AskTerminalClaimOutcome, AskTransitionPatch, ApprovalAskStore, BatchRow, BindGateInput, BindResult, DecideAskInput, EnsureAskResult, DecideResult, ExpireResult, NewAskRow } from "./approval-ask-store-sql.js";
|
|
34
|
+
import type { AskCallCoordinate, AskDecision, AskDecisionRecord, AskRow, AskTerminalClaimIntent, AskTerminalClaimOpts, AskTerminalClaimOutcome, AskTransitionPatch, ApprovalAskStore, BatchRow, BindGateInput, BindResult, DecideAskInput, EnsureAskResult, DecideResult, ExpireResult, NewAskRow, RecordParkedDecisionResult } from "./approval-ask-store-sql.js";
|
|
35
35
|
/**
|
|
36
36
|
* [ref] 的 `updatedInput` **入店编码**——两 twin 共用的那一只(本函数是唯一真源)。
|
|
37
37
|
*
|
|
@@ -99,6 +99,11 @@ export declare class InMemoryApprovalAskStore implements ApprovalAskStore {
|
|
|
99
99
|
ensureAsk(row: NewAskRow): Promise<EnsureAskResult>;
|
|
100
100
|
transitionAsk(askId: string, from: AskState, to: AskState, patch: AskTransitionPatch): Promise<boolean>;
|
|
101
101
|
decideAsk(askId: string, batchId: string, owner: string | null, decision: DecideAskInput): Promise<DecideResult>;
|
|
102
|
+
/**
|
|
103
|
+
* 停驻形的人决落行(接口契约见 SQL 侧 {@link ApprovalAskStore.recordParkedDecision})。判定序照 SQL twin:行在 ∧ `PARKED` ∧ 属主维(UPDATE 谓词)→ 才轮到撞键
|
|
104
|
+
* (UNIQUE `(task_id, idempotency_key)` 的内存镜像,与 `decideAsk` 同一段;本行自己占着同一把键不算撞)。态不变。
|
|
105
|
+
*/
|
|
106
|
+
recordParkedDecision(askId: string, owner: string | null, record: AskDecisionRecord): Promise<RecordParkedDecisionResult>;
|
|
102
107
|
/**
|
|
103
108
|
* [ref] 原子终局 claim(接口契约见 SQL 侧 {@link ApprovalAskStore.claimTerminal})。**委托形**:CAS 走
|
|
104
109
|
* 既有 verb(expire ⇒ `this.expireAsk`;cancel ⇒ `this.transitionAsk(STREAM_PENDING→VOID)`)——律 2
|
|
@@ -124,6 +129,10 @@ export declare class InMemoryApprovalAskStore implements ApprovalAskStore {
|
|
|
124
129
|
listPendingBySession(sessionId: string, owner: string | null, signal?: AbortSignal): Promise<AskRow[]>;
|
|
125
130
|
listByCall(call: AskCallCoordinate): Promise<AskRow[]>;
|
|
126
131
|
listParkingBySourceSession(sourceSessionId: string): Promise<AskRow[]>;
|
|
132
|
+
listAsksAtGate(sourceSessionId: string, binding: {
|
|
133
|
+
readonly boundCallId: string;
|
|
134
|
+
readonly boundInputHash: string;
|
|
135
|
+
}): Promise<AskRow[]>;
|
|
127
136
|
getAsk(askId: string): Promise<AskRow | null>;
|
|
128
137
|
getByIdempotencyKey(taskId: string, key: string): Promise<AskRow | null>;
|
|
129
138
|
resolveProvisional(askId: string, from: AskState, to: AskState, patch: AskTransitionPatch): Promise<boolean>;
|
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
import { ASK_TERMINAL, canAskTransition } from "../approval-ask-machine.js";
|
|
2
2
|
import { APPROVAL_ENDING_CAUSES } from "../approval-deny-reasons.js";
|
|
3
|
-
import { askAttachedToSession, askRowCarriesOwner, askRowOnCall, assertDecideSource, assertIdempotencyKeyShape, assertIntegralEpochMs, assertReapBounds, ApprovalAskReadAbortedError, claimTargetState, POLICY_REFUSAL_DECISION, projectAskTerminalClaimTruth, projectDecideReading } from "./approval-ask-store-sql.js";
|
|
3
|
+
import { askAtGate, askAttachedToSession, askRowCarriesOwner, askRowOnCall, assertDecideSource, assertIdempotencyKeyShape, assertIntegralEpochMs, assertReapBounds, ApprovalAskReadAbortedError, claimTargetState, POLICY_REFUSAL_DECISION, projectAskTerminalClaimTruth, projectDecideReading } from "./approval-ask-store-sql.js";
|
|
4
|
+
function applyDecisionRecord(row, record, now) {
|
|
5
|
+
row.decision = record.decision;
|
|
6
|
+
row.decisionActor = record.decisionActor ?? null;
|
|
7
|
+
row.decisionNote = record.decisionNote ?? null;
|
|
8
|
+
row.settledBy = record.settledBy ?? null;
|
|
9
|
+
row.decidedVia = record.decidedVia ?? null;
|
|
10
|
+
row.decidedAtMs = now;
|
|
11
|
+
row.idempotencyKey = record.idempotencyKey ?? null;
|
|
12
|
+
row.rev += 1;
|
|
13
|
+
row.updatedAtMs = now;
|
|
14
|
+
}
|
|
4
15
|
function applyPatch(row, patch) {
|
|
5
16
|
if (patch.decision !== undefined)
|
|
6
17
|
row.decision = patch.decision;
|
|
@@ -181,19 +192,27 @@ export class InMemoryApprovalAskStore {
|
|
|
181
192
|
batch.rev += 1;
|
|
182
193
|
batch.updatedAtMs = now;
|
|
183
194
|
ask.state = "DECIDED";
|
|
184
|
-
ask
|
|
185
|
-
ask.decisionActor = decision.decisionActor ?? null;
|
|
186
|
-
ask.decisionNote = decision.decisionNote ?? null;
|
|
187
|
-
ask.settledBy = decision.settledBy ?? null;
|
|
188
|
-
ask.decidedVia = decision.decidedVia ?? null;
|
|
195
|
+
applyDecisionRecord(ask, decision, now);
|
|
189
196
|
if (decision.updatedInput === undefined)
|
|
190
197
|
delete ask.updatedInput;
|
|
191
198
|
else
|
|
192
199
|
ask.updatedInput = encodedUpdatedInput;
|
|
193
|
-
ask
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
200
|
+
return { ok: true, row: { ...ask } };
|
|
201
|
+
}
|
|
202
|
+
async recordParkedDecision(askId, owner, record) {
|
|
203
|
+
if (record.idempotencyKey != null)
|
|
204
|
+
assertIdempotencyKeyShape(record.idempotencyKey);
|
|
205
|
+
assertDecideSource(record);
|
|
206
|
+
const ask = this.asks.get(askId);
|
|
207
|
+
if (!ask || ask.state !== "PARKED" || !askRowCarriesOwner(ask, owner))
|
|
208
|
+
return { ok: false, reason: "ask_not_parked", row: projectDecideReading(ask ? { ...ask } : null, owner) };
|
|
209
|
+
if (record.idempotencyKey != null) {
|
|
210
|
+
for (const [id, r] of this.asks) {
|
|
211
|
+
if (id !== askId && r.taskId === ask.taskId && r.idempotencyKey === record.idempotencyKey)
|
|
212
|
+
return { ok: false, reason: "idempotency_conflict", row: { ...ask } };
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
applyDecisionRecord(ask, record, this.now());
|
|
197
216
|
return { ok: true, row: { ...ask } };
|
|
198
217
|
}
|
|
199
218
|
async claimTerminal(askId, batchId, intent, opts) {
|
|
@@ -365,6 +384,12 @@ export class InMemoryApprovalAskStore {
|
|
|
365
384
|
.sort((a, b) => a.createdAtMs - b.createdAtMs || (a.askId < b.askId ? -1 : a.askId > b.askId ? 1 : 0))
|
|
366
385
|
.map((r) => ({ ...r }));
|
|
367
386
|
}
|
|
387
|
+
async listAsksAtGate(sourceSessionId, binding) {
|
|
388
|
+
return [...this.asks.values()]
|
|
389
|
+
.filter((r) => askAtGate(r, sourceSessionId, binding))
|
|
390
|
+
.sort((a, b) => a.createdAtMs - b.createdAtMs || (a.askId < b.askId ? -1 : a.askId > b.askId ? 1 : 0))
|
|
391
|
+
.map((r) => ({ ...r }));
|
|
392
|
+
}
|
|
368
393
|
async getAsk(askId) {
|
|
369
394
|
const r = this.asks.get(askId);
|
|
370
395
|
return r ? { ...r } : null;
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
* 先 `SELECT` 后 `UPDATE`(设计定稿 §4 原话)。
|
|
29
29
|
* - JSON 列(`card_json`/`decision_actor`)走 `dialectJsonEncoder`(TiDB verbatim `JSON.stringify`;
|
|
30
30
|
* PG 走 `pgSafeJsonStringify` 深度 sanitize——这两列是「已帽已洗后的投影」内容面 blob,不是像
|
|
31
|
-
* checkpoint
|
|
31
|
+
* checkpoint 列里待决动作的 `args` 那样跨信任边界做 hash 绑定的执行面字节,故用有损而非无损信封)。
|
|
32
32
|
*
|
|
33
33
|
* ── 施工偏离记录(设计定稿字面矛盾,未擅自改设计,如实记在这里 + 车1 最终汇报)──────────────────────
|
|
34
34
|
* - deriveAskId/deriveBatchId 的分隔符:设计定稿 §5 代码片段字面写 `.join(' ')`(单空格),但同一段
|
|
@@ -249,11 +249,17 @@ export interface AskTransitionPatch {
|
|
|
249
249
|
provisional?: boolean;
|
|
250
250
|
updatedAtMs: number;
|
|
251
251
|
}
|
|
252
|
-
|
|
252
|
+
/**
|
|
253
|
+
* 一次人对一张卡的决定**落行的那一份记录** —— live 与停驻两形同一份、同一张列、同一只映射(SQL twin {@link SqlApprovalAskStore} 的 `decisionRecordValues`、
|
|
254
|
+
* 内存 twin 的 `applyDecisionRecord`):决议向 · 署名 · 理由 · 回决幂等键 · 出处两格(+ 决定时刻,店铸)。
|
|
255
|
+
* live 形随 `STREAM_PENDING → DECIDED` 那一笔单赢者 CAS 落({@link ApprovalAskStore.decideAsk});停驻形在停驻门受理之后落在仍 `PARKED` 的行上
|
|
256
|
+
* ({@link ApprovalAskStore.recordParkedDecision})。两形唯一的写者 = 协调器的回决写者(`ToolApprovalCoordinator.writeAskDecision`)。
|
|
257
|
+
*/
|
|
258
|
+
export interface AskDecisionRecord {
|
|
253
259
|
decision: AskDecision;
|
|
254
260
|
decisionActor?: unknown;
|
|
255
261
|
decisionNote?: string | null;
|
|
256
|
-
/** 车4 §12-E
|
|
262
|
+
/** 车4 §12-E:回决幂等键,随决议一起落列(见 `AskRow.idempotencyKey`)。缺席 ⇒ 列 NULL。 */
|
|
257
263
|
idempotencyKey?: string | null;
|
|
258
264
|
/**
|
|
259
265
|
* 🔴 [ref]:本次回决的**结算来源**,与决议同一条 UPDATE 落列 `settled_by`(语义/两态读法/为什么是
|
|
@@ -265,6 +271,9 @@ export interface DecideAskInput {
|
|
|
265
271
|
settledBy?: HostSettledBy;
|
|
266
272
|
/** core 7.61.0([ref]):`settledBy:"policy"` 旁的机器座位,与决议同一条 UPDATE 落列 `decided_via`(语义见 {@link AskRow.decidedVia});缺席 ⇒ 列 NULL。 */
|
|
267
273
|
decidedVia?: DecidedVia;
|
|
274
|
+
}
|
|
275
|
+
/** live 形的决定 = 那份记录 + 随决议交给在等那条腿的编辑实参(停驻形的编辑走停驻门的绑定,不落问行)。 */
|
|
276
|
+
export interface DecideAskInput extends AskDecisionRecord {
|
|
268
277
|
/** [ref]:ctrl+g 编辑实参,与决议同一条 UPDATE 落列(语义三态见 {@link AskRow.updatedInput})。
|
|
269
278
|
* 缺席 / `undefined` ⇒ 列 NULL(没带编辑);**`null` 是值**(编辑成 null),照存 JSON `"null"`。
|
|
270
279
|
* 调用方纪律:deny 不传(店不替调用方判决议方向,写什么存什么)。 */
|
|
@@ -285,6 +294,18 @@ export type DecideResult = {
|
|
|
285
294
|
reason: "batch_closed" | "ask_not_pending" | "idempotency_conflict";
|
|
286
295
|
row: AskRow | null;
|
|
287
296
|
};
|
|
297
|
+
/**
|
|
298
|
+
* {@link ApprovalAskStore.recordParkedDecision} 的结局:`ok` ⇒ 落后的行;`ask_not_parked` ⇒ 行不在 / 不在 `PARKED` / 已出了门判过的属主域;
|
|
299
|
+
* `idempotency_conflict` ⇒ 这把键已被同 task 另一只问占着(UNIQUE `(task_id, idempotency_key)`)。`row` 与 {@link DecideResult} 同一只属主维投影。
|
|
300
|
+
*/
|
|
301
|
+
export type RecordParkedDecisionResult = {
|
|
302
|
+
ok: true;
|
|
303
|
+
row: AskRow;
|
|
304
|
+
} | {
|
|
305
|
+
ok: false;
|
|
306
|
+
reason: "ask_not_parked" | "idempotency_conflict";
|
|
307
|
+
row: AskRow | null;
|
|
308
|
+
};
|
|
288
309
|
/**
|
|
289
310
|
* 幂等键的入店卫生门(属主兜底轮 F2,三 twin 同判——SQL 双方言与 InMemory 都从这里过)。
|
|
290
311
|
*
|
|
@@ -476,11 +497,16 @@ export declare function askRowOnCall(row: AskRow, call: AskCallCoordinate): bool
|
|
|
476
497
|
* 🔴 [ref] —— **决议作用域的属主维**:这一行此刻带着的属主,是不是这次决议的门判过的那一位(逐字相等;`null` 只等于 `null`)。
|
|
477
498
|
*
|
|
478
499
|
* 律(一条):一次决议请求的作用域 = (ask, 批, **门判过的那位属主**)。属主的唯一来源是行上的 `owner` 列(铸行写定,只有 `/v1/adoption` 改写它);
|
|
479
|
-
* 门(面表 `owner-faces.ts` 的 ask
|
|
500
|
+
* 门(面表 `owner-faces.ts` 的 ask 两行:决断口 `ask.decide` 属主 ∨ 无主 ∨ 运维、按问读口 `ask.answer` 属主 ∨ 无主)照旧在门里判授权,本谓词**不复判授权**,只绑「门判的那一份属主事实」——
|
|
480
501
|
* 门读行与 CAS 之间属主被改写,门的判断就不再是关于这一行的判断。于是这次请求拿到的**每一份**行读数(CAS 本身、CAS 输者的读数、
|
|
481
502
|
* 提交歧义的确认读、幂等回放的命中)都过这一只:出域 = 缺席,门按缺席答(与行不在同体同码)。
|
|
482
503
|
* InMemory twin 的判定、SQL twin 输者读数的投影、两扇门的确认读读同一只;SQL twin 的 UPDATE 谓词是它的方言镜像({@link decideOwnerWhere})。
|
|
483
504
|
*/
|
|
505
|
+
/** {@link ApprovalAskStore.listAsksAtGate} 的行判据(三 twin 的出口对齐与 InMemory 内核同调这一只)。 */
|
|
506
|
+
export declare function askAtGate(r: AskRow, sourceSessionId: string, binding: {
|
|
507
|
+
readonly boundCallId: string;
|
|
508
|
+
readonly boundInputHash: string;
|
|
509
|
+
}): boolean;
|
|
484
510
|
export declare function askRowCarriesOwner(row: AskRow | null, owner: string | null): row is AskRow;
|
|
485
511
|
/** [ref]:决议输者读数的投影(三 twin 共用一份):行出了这次决议的属主域 ⇒ 读作缺席,不交出别人的行。 */
|
|
486
512
|
export declare function projectDecideReading(row: AskRow | null, owner: string | null): AskRow | null;
|
|
@@ -513,6 +539,15 @@ export interface ApprovalAskStore {
|
|
|
513
539
|
* 缺省等于不绑属主,安全轴上那是静默放行。
|
|
514
540
|
*/
|
|
515
541
|
decideAsk(askId: string, batchId: string, owner: string | null, decision: DecideAskInput): Promise<DecideResult>;
|
|
542
|
+
/**
|
|
543
|
+
* **停驻形的人决落行**(一张卡一条记录:停驻卡的决定记在它的问行上,行仍 `PARKED`)—— 停驻门(checkpoint 上的那道门,单赢者是续跑腿的门 CAS)
|
|
544
|
+
* **已经受理**这次决定之后,把它的记录({@link AskDecisionRecord})落到这只问的行上。态不变:停驻形的终局恒是那道门,不是这一笔。
|
|
545
|
+
* 谓词 = 行在 ∧ `state = 'PARKED'` ∧ 门判过的那位属主还在行上([ref],与 {@link decideAsk} 同一只属主维)。
|
|
546
|
+
* **覆写**:门被引擎重开(同一把 token 翻回待决、世代号前进)之后又被受理的那一次再落一次 —— 记录恒是「门上此刻站着的那次决定」的那一份
|
|
547
|
+
* (决议向、谁、带哪把键);读者只在门已决时认它(`ToolApprovalCoordinator` 的停驻形读法)。
|
|
548
|
+
* 唯一调用方 = 协调器的回决写者,只在赎回席 2xx 之后调。三 twin 同答。
|
|
549
|
+
*/
|
|
550
|
+
recordParkedDecision(askId: string, owner: string | null, record: AskDecisionRecord): Promise<RecordParkedDecisionResult>;
|
|
516
551
|
/**
|
|
517
552
|
* [ref]:原子终局 claim —— 把「争终局」与「读真相」并成**一次**店往返(胜负判定与败方 `current` 读数
|
|
518
553
|
* 在同一原子单元内,语义见 {@link AskTerminalClaimOutcome})。[ref]-R1 的病根「CAS 与读真相是两次店
|
|
@@ -587,6 +622,21 @@ export interface ApprovalAskStore {
|
|
|
587
622
|
* 行数随在途停驻,不随账本总量)。三 twin 同答:SQL twin 读后按发起会话逐字再滤一遍(MySQL 协议 VARCHAR 等值的 PAD SPACE,与 `listByCall` 同一条出口对齐)。
|
|
588
623
|
*/
|
|
589
624
|
listParkingBySourceSession(sourceSessionId: string): Promise<AskRow[]>;
|
|
625
|
+
/**
|
|
626
|
+
* 「这道停驻门属于哪只问」:发起会话(列 `source_task_id`)= 给定会话,且 ① `state = 'PARKED'` ∧ 门上的绑定对(`gate_bound_call_id` / `gate_bound_input_hash`,收敛器
|
|
627
|
+
* 按停驻行的「同调用 ∧ 同展示入参摘要」绑上的那一对)逐字等于给定的一对,或 ② `state = 'PARKING'`(收敛器还没绑上)∧ 这只问自己的调用 id 与展示入参摘要
|
|
628
|
+
* (`tool_call_id` / `bound_input_hash`,收敛器绑定判的就是这两格)逐字等于给定的一对 —— 同一只问在绑定前后都是同一行、同一份 `card_json`,两个读者跨过绑定那一拍同答。按绑定对而不是令牌:运维队列行与续跑腿两个读者手里都有这一对
|
|
629
|
+
* (队列行不带令牌),同一个问题一个键、一只读口。
|
|
630
|
+
* 停驻行陈述的会话 = 铸它的那条腿的会话 = 同一次调用的问的发起会话(委派 / 后台子代 = 子代自己的会话;行上的 `sessionId` 记的是投递上下文,不是这一格)。
|
|
631
|
+
* 两个消费者(同一只协调器读口):续跑腿的规则记录读者(`http/resume-legs.ts`)与运维队列行的候选投影(`routes/approvals-assistant.ts`)—— 有问行的停驻卡读问行、
|
|
632
|
+
* 没有读停驻行;恰好一行才是这张卡的记录,零行 = 直停驻卡,多行 = 读不出记录(两个读者同答 fail-closed)。
|
|
633
|
+
* 不带租户门(内部读口,不上 wire;调用方已复核过停驻行的属主,记录读者再比一次行属主)。索引走既有 `idx_ask_source_session (source_task_id)`;零 DDL。
|
|
634
|
+
* 三 twin 同答:SQL twin 读后按发起会话与令牌逐字再滤一遍(MySQL 协议 VARCHAR 等值的 PAD SPACE,与 `listByCall` 同一条出口对齐)。
|
|
635
|
+
*/
|
|
636
|
+
listAsksAtGate(sourceSessionId: string, binding: {
|
|
637
|
+
readonly boundCallId: string;
|
|
638
|
+
readonly boundInputHash: string;
|
|
639
|
+
}): Promise<AskRow[]>;
|
|
590
640
|
getAsk(askId: string): Promise<AskRow | null>;
|
|
591
641
|
/** 回决幂等回放的读口。🔴 `taskId` **必填**且是键的第一维——UNIQUE 已改 `(task_id, idempotency_key)`
|
|
592
642
|
* (车4 §12-E),裸按 key 全局查在多租户库上既可能回**别人 task** 的行(存在性外泄),也可能在同 key
|
|
@@ -751,6 +801,17 @@ export declare class SqlApprovalAskStore implements ApprovalAskStore {
|
|
|
751
801
|
ensureAsk(row: NewAskRow): Promise<EnsureAskResult>;
|
|
752
802
|
transitionAsk(askId: string, from: AskState, to: AskState, patch: AskTransitionPatch): Promise<boolean>;
|
|
753
803
|
decideAsk(askId: string, batchId: string, owner: string | null, decision: DecideAskInput): Promise<DecideResult>;
|
|
804
|
+
/**
|
|
805
|
+
* 一份决定记录({@link AskDecisionRecord})的前五格列值,序 = `decision, decision_actor, decision_note, settled_by, decided_via` ——
|
|
806
|
+
* live 形({@link decideAsk})与停驻形({@link recordParkedDecision})两条 UPDATE 共用这**一只**映射(一个事实一处铸列值)。
|
|
807
|
+
*/
|
|
808
|
+
private decisionRecordValues;
|
|
809
|
+
/**
|
|
810
|
+
* 停驻形的人决落行(接口契约见 {@link ApprovalAskStore.recordParkedDecision})。单条 UPDATE,谓词 `state='PARKED'` + 属主维([ref] 的同一只方言镜像);
|
|
811
|
+
* `rev = rev + 1` 照 CAS 铁则②(MySQL 同值 UPDATE 的 affectedRows=0 坑:覆写同一份记录时列值可以逐字节相同)。
|
|
812
|
+
* `(task_id, idempotency_key)` 撞键 ⇒ typed 臂 `idempotency_conflict`(方言错误不出店,与 `decideAsk` 同一只判别)。
|
|
813
|
+
*/
|
|
814
|
+
recordParkedDecision(askId: string, owner: string | null, record: AskDecisionRecord): Promise<RecordParkedDecisionResult>;
|
|
754
815
|
/**
|
|
755
816
|
* [ref] 原子终局 claim(接口契约见 {@link ApprovalAskStore.claimTerminal};类型语义见
|
|
756
817
|
* {@link AskTerminalClaimOutcome})。expire 意图 = 既有 `expireAsk` 事务**原体**(步⓪-③ 逐字保留,
|
|
@@ -791,6 +852,10 @@ export declare class SqlApprovalAskStore implements ApprovalAskStore {
|
|
|
791
852
|
listPendingBySession(sessionId: string, owner: string | null, signal?: AbortSignal): Promise<AskRow[]>;
|
|
792
853
|
listByCall(call: AskCallCoordinate): Promise<AskRow[]>;
|
|
793
854
|
listParkingBySourceSession(sourceSessionId: string): Promise<AskRow[]>;
|
|
855
|
+
listAsksAtGate(sourceSessionId: string, binding: {
|
|
856
|
+
readonly boundCallId: string;
|
|
857
|
+
readonly boundInputHash: string;
|
|
858
|
+
}): Promise<AskRow[]>;
|
|
794
859
|
getAsk(askId: string): Promise<AskRow | null>;
|
|
795
860
|
getByIdempotencyKey(taskId: string, key: string): Promise<AskRow | null>;
|
|
796
861
|
deferReconcile(askId: string, expectedState: AskState, expectedRev: number, nowMs: number): Promise<boolean>;
|