@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
|
@@ -36,13 +36,13 @@ export const FAIL_OPEN_TAGS = {
|
|
|
36
36
|
cls: "F",
|
|
37
37
|
note: "S-1173(`workflow-notify-journal.ts` 的 `ensurePointersFor`,park 指针的唯一写点):workflow run 记录的 `parks[]` **读不出**(在场却不是列表 / 某条目身份位或持有者两位形坏;读者 = `workflow-agent-session-index.ts` 的 `readRunParks`,整档成败制)⇒ 这一份指针投影派生不出来 ⇒ 写者这次**不写**指针,记录照写(已写过的指针只增不删,原样留着)。修前这一臂静默 `return`。**`parks` 缺席不进这一臂**:那是引擎契约里的合法形(更早引擎写的记录 / 准入没走完的续跑记录),读者答 `[]`(没有条目),没有要写的指针,不计。与指针**写**失败分家:写失败 ⇒ 记录写抛、记录不落(指针先于记录,不 fail-open);本臂没有丢任何一枚已写的指针 —— 读不出的是**记录本身**,引擎对条目形坏的记录整条拒续跑(`park_binding_broken`),读口对已有指针的 run 据记录响亮拒(`unproven/unreadable`),所以要的是查那条记录为什么读不出(投影把它写坏 / 手改)。放行的最坏后果:这条 run 首写就读不出时没有指针 ⇒ 这张卡没有别的指针时 `/decide` 落 legacy 腿、409 响亮拒,方向 fail-closed,不误配、不放行任何东西;例外 —— 同一张卡上另一支的指针在时分叉门判不出、决定投给那一支(引擎从不写坏形,要这一支在首写之前就被写坏);derived cache 没更新、真源读口自带响亮拒 ⇒ F 类。detail = `runId=`;计数非零 = 有记录的 `parks[]` 读不出,按 runId 去查记录。",
|
|
38
38
|
},
|
|
39
|
-
"server.workflow-
|
|
39
|
+
"server.workflow-park-holder.read-failed": {
|
|
40
40
|
cls: "F",
|
|
41
|
-
note: "
|
|
41
|
+
note: "workflow 停驻卡持有进程的拉取腿(`orchestration/workflow-park-holder.ts`,维护拍上读本进程执行中、持有停驻卡的 run 的决定行,把立住的决定在本地交给引擎)这一拍对某条候选读不出:决定行的主键读抛或超过期限(`step=decision`)、卡 / 持有者那一读超过期限(`step=card`),或执行器视图等那条 run 的引擎观察通道收场的那一读拒(`step=channel`,core 的观察队列只关不拒,结构上不可达)。放行的最坏后果:这条决定这一拍不交,行留着、卡仍 pending —— 下一拍再来;`channel` 那一形这条 run 出视图,它的行改由 run 的收场送达交给宿主会话的下一跑(交付晚到 run 收场,不丢、不错交)。不放宽任何判定:交不交、交给谁仍由行 + 卡状态 + 引擎判。detail = `step=<decision|card|channel> runId=<持有者> err=<原句,经记录器脱敏>`;计数持续非零 = 决定店 / 检查点店对这几条读不出,按 runId 查。",
|
|
42
42
|
},
|
|
43
43
|
"server.workflow-park-decision.card-unreadable": {
|
|
44
44
|
cls: "F",
|
|
45
|
-
note: "起跑读者(`parked-decide.ts` 的 `
|
|
45
|
+
note: "交付决定行的三方(起跑读者 `heldWorkflowParkDecisions`,每一只起跑器开跑前一次;workflow 停驻卡持有进程的拉取腿;run 收场送达)共用的逐行判(`parked-decide.ts` 的 `deliverableEntryOf`)读某条已受理的 workflow 子代决定所属的那张卡(`step=card`)或那张卡的当下持有者(`step=holder`:park 索引 / 记录读)时店抛 ⇒ 这一次**不交付**这条决定,行留着(起跑读者:这一跑不带它,下一跑照带;拉取腿:下一拍再来;收场送达:不 ack、`recover` 重投)。放行的最坏后果:这一跑里宿主若续跑那条 workflow run,子代按同一个 token 再停驻一次(卡仍 pending,决定仍在,下一跑照带)—— 方向是少交付一次,不是错交付:这一读失败不代表引擎随后那一读也失败,而引擎对「卡已不 pending、却拿到一条决定」的序数会当确认结算,所以读不出时绝不照供。计数持续非零 = checkpoint 店 / park 索引 / 记录店对这张卡读不出(库故障 / 行坏 / 写者版本更新),按 detail 的 `runId=`(受理那一刻的持有者)去查。detail = `step=<card|holder> runId=<留存锚> err=<原句,经记录器脱敏>`。",
|
|
46
46
|
},
|
|
47
47
|
"server.workflow-park-decision.store-unreadable": {
|
|
48
48
|
cls: "F",
|
|
@@ -78,7 +78,7 @@ export const FAIL_OPEN_TAGS = {
|
|
|
78
78
|
},
|
|
79
79
|
"server.run-store.file-active-claims-unreadable": {
|
|
80
80
|
cls: "P-DEBT",
|
|
81
|
-
note: "`FileRunStore.hydrate()` 的第二处 `readdirSync(runs/active/)`(claim 平面 = 单活索引)失败,且 `RUN_STORE_STRICT_HYDRATE` 关(缺省)⇒ 服务照常起动、单活索引为**空**。放行的后果两条,都不报错:① 已有 run 行仍可读(`GET /v1/runs/:id` 照常答),但此后对这些会话的审批决定在请求里同步跑完、却找不到要更新的 run 行 —— run 行停在决前的 `suspended`;② 读单活索引的各处读到「没人占用」—— `getActiveTaskId` 恒答空,例如会话同步推送前的「会话有在飞 run
|
|
81
|
+
note: "`FileRunStore.hydrate()` 的第二处 `readdirSync(runs/active/)`(claim 平面 = 单活索引)失败,且 `RUN_STORE_STRICT_HYDRATE` 关(缺省)⇒ 服务照常起动、单活索引为**空**。放行的后果两条,都不报错:① 已有 run 行仍可读(`GET /v1/runs/:id` 照常答),但此后对这些会话的审批决定在请求里同步跑完、却找不到要更新的 run 行 —— run 行停在决前的 `suspended`;② 读单活索引的各处读到「没人占用」—— `getActiveTaskId` 恒答空,例如会话同步推送前的「会话有在飞 run」检查、会话头探针 `GET /v1/sessions/:id/head` 的 `activeTaskId`(这一档里答 `null`,而提交照旧按盘上的 claim 文件 409)(与 `server.run-store.file-hydrate-unreadable` 同一句错话:「证不出有占用 ⇒ 没有占用」,只是换了一个盘面);新提交不读这张索引,claim 文件完好时仍按盘上的 claim 裁定,不受影响。同一条债的另一个盘面:缺省不拒启是刻意保留的行为,所以留作 P-DEBT —— error 级启动日志(`file_run_store_active_claims_unreadable`,带 `runs/active/` 绝对路径)早已在,本计数补的是遥测轴(此前 `runs/` 臂有计数、这一臂没有)。`RUN_STORE_STRICT_HYDRATE=on` 把这一格换成 fail-closed 启动门,本计数因此只在缺省 off 档的真放行时产生(拒启那一形不记)—— 读遥测时「计数为零」也可能是部署开了拒启门、根本起不来。",
|
|
82
82
|
},
|
|
83
83
|
"server.fork-routing.placed-probe-host-error": {
|
|
84
84
|
cls: "F",
|
|
@@ -164,17 +164,13 @@ export const FAIL_OPEN_TAGS = {
|
|
|
164
164
|
cls: "F",
|
|
165
165
|
note: "CC 规则导入票的**认领回滚**失败(认领之后的某一步没成 ⇒ 本该把认领放回去,而这次放回本身也抛了)。放行的最坏后果 = 这张票留在已认领态、属主这一轮不能重试 —— 恰好等于加认领回滚**之前**的行为,不是新损失;票随 TTL 自然消失,属主重走一次 prepare 即可拿新票(导入按 core 的设计幂等:同一条规则再兑付只是同一个 dot 的重放)。方向上没有任何权限被放宽(规则**没有**落地才走到这条臂),故 F 类;必须留痕,否则「票为什么突然不能用了」在遥测里没有任何痕迹。",
|
|
166
166
|
},
|
|
167
|
-
"server.approvals.rule-suggestions-cell-unreadable": {
|
|
168
|
-
cls: "F",
|
|
169
|
-
note: "运维待批队列(`GET /v1/approvals` / `/stream`)的某一行,`checkpoint.rule_suggestions` 这一格**不是合法 JSON 文本**(手改过的行 / 未来列语义漂了 / 回滚残留)。放行的最坏后果 = **这一行**的「不再询问」候选缺席(展示/分诊材料,永不参与 resume、也不是任何判据),队列其余部分照常;不放行的代价是整只 `rows.map` 抛出 ⇒ 一行坏 cell 打掉整个租户的队列(列表 500、SSE 心跳照常而队列永远空)。故 F 类,但必须留痕:静默吞掉之后「候选为什么消失了」在遥测里没有任何痕迹,而本键存在的全部理由就是「缺席 = 真的没有候选」。",
|
|
170
|
-
},
|
|
171
167
|
"server.approvals.risk-descriptor-cell-unreadable": {
|
|
172
168
|
cls: "F",
|
|
173
|
-
note: "运维待批队列(`GET /v1/approvals` / `/stream`
|
|
169
|
+
note: "运维待批队列(`GET /v1/approvals` / `/stream`;两孪生同一只投影 `checkpoint-store-face.ts` 的 `buildQueueActionFacts`)的某一行,停驻文档门上的风险描述(引擎派生 `checkpointIndexFacts` 那一格,只在审批门上)**在场却读不成一只对象**(手改 / 带外写者写下的文档)。7.152.0 起只有这一座:描述不再落列,队列行在读时从续跑执行的同一次整行解码取(此前 SQL 孪生读 `checkpoint.risk_descriptor` 列、列文本坏也计在本 tag;那一列随一次性迁移 M54 删)。放行的最坏后果 = **这一行**的分诊 descriptor 落 null:severity 折 0 排到有 descriptor 的行之后、披露位(`allowRuleShadowed`)无可脱敏、读面派生的 `governanceForced` 徽章不亮 —— 三者都是**展示/分诊**,不是执法判据(门早已 park,真按 `shellGateDoctrine` 判的 `active-run-conflict.ts` 读的是 `get()`,不经本读面),且 `governanceForced` 的成文语义本就是「缺席 = 没有治理来源的**证据**」。不放行的代价是一行坏描述打掉整个租户的队列。故 F 类。计数口径:SQL 孪生每份字节每进程一次(动作事实按字节记忆),local 每次列表一次。",
|
|
174
170
|
},
|
|
175
171
|
"server.approvals.park-row-blob-unreadable": {
|
|
176
172
|
cls: "F",
|
|
177
|
-
note: "
|
|
173
|
+
note: "运维待批队列(`GET /v1/approvals` / `/stream`)、收件箱 / 任务视图(`listByScope`)与按会话读口的某一行,停驻行的**整行读**(`stores-sql/checkpoint-store-sql.ts` 的 `readStoredRow`;队列行的全部动作事实 —— 工具名、绑定、入参、卡、描述、候选、bidi 位、park 行事实、`checkpointId`、技能卡两位、判决 —— 都出自这一次解码,两孪生同一只投影 `buildQueueActionFacts`)读不动:字节解不出 ⇒ 判官对读回的原样值作答(恒 `damaged`);体是对象但 core 摘要读不动(`{}` / 缺 `state` 等手改行)或 core 的投影自己抛 ⇒ 判官对这只对象作答。行照列、带判决,动作事实 `null` / 缺席(与 local 孪生同形),逐次计、不进记忆。放行的最坏后果 = **这一行**少了动作事实(这样的行续跑同样读不动它 —— `get()` 对同一份字节拒),队列其余部分照常;不放行的代价是一行坏字节打掉整个租户的队列(列表 500、SSE 心跳照常而队列永远停在旧帧)。故 F 类。7.152.0 起不再有「`pendingAction` 子树」那一座(引擎内的成员提取退役,同一份文档只有一只 parser)。计数非零 = 这一行的 decide 同样读不动,去按 session 查那一行。",
|
|
178
174
|
},
|
|
179
175
|
"server.approvals.queue-row-agent-unreadable": {
|
|
180
176
|
cls: "F",
|
|
@@ -274,7 +270,7 @@ export const FAIL_OPEN_TAGS = {
|
|
|
274
270
|
},
|
|
275
271
|
"server.approvals.active-run-conflict-material-unavailable": {
|
|
276
272
|
cls: "F",
|
|
277
|
-
note: "A-057.47
|
|
273
|
+
note: "A-057.47:409 `conflict.session_active_run` 的材料读失败,分两层(7.152.0 起):① 持有者那一行读不出(`refusalOccupantOf` 的 getRun —— 提交 / 续跑面的 `buildActiveRunConflict`、删除口、run 外回退口三处同调)⇒ 体只剩 error + errorCode + activeTaskId,`activeTaskStatus` / `msSinceLastActivity` / `pendingGate` 不在;② 持有者行读到了而出路材料读不出(turnActivity / peekPendingScope / findPendingTokenBySession / checkpoint `get`)⇒ 占用两键照留,只少 `msSinceLastActivity` 或 `pendingGate`(kind·decidePath·governanceForced·checkpointId)。放行的最坏后果 = **展示/分诊**面缺料:壳画不出「这条 run 卡在哪道门、去哪儿决」,人退回 `POST /v1/runs/{activeTaskId}/cancel` 这条保底真路 —— 不参与任何门/CAS/resume 判定(执法面读的是 checkpoint blob 的 `get()`,不经本材料;与 census 第 21 行同一条判据),故 F 类。方向刻意不改:本材料是 best-effort 增强,让它抛会把一次 store 抖动变成整个 409 路径的 500(顶注第 11 行逐字成文「store 面任何失败都不得挡 409 本体」)。必须留痕的理由:本文件零 logger 席、pool 层无 per-query 错误日志、调用侧(tasks.ts / runs.ts / server.ts 五处)因本函数恒不 reject 结构上拿不到信号 ⇒ 「approval 出路材料系统性丢失」此前在遥测里与「一切正常」同形;滚动升级期 `checkpoint-store-sql.ts` 的 version-too-new throw 与 strict parseJson 也一并被吞在这里。",
|
|
278
274
|
},
|
|
279
275
|
"server.engine-notice.durable-append-failed": {
|
|
280
276
|
cls: "F",
|
|
@@ -328,14 +324,18 @@ export const FAIL_OPEN_TAGS = {
|
|
|
328
324
|
cls: "P-DEBT",
|
|
329
325
|
note: "#296(A-052.2,clay 裁定 C-R21):`REMOTE_EXEC=ssh` 且**两只主机密钥旋钮都缺席**(`SSH_HOST_FINGERPRINT` / `SSH_KNOWN_HOSTS`)⇒ 本次连接接受**任何**主机密钥,等价 `ssh -o StrictHostKeyChecking=no`。放行的最坏后果:一次中间人拿到这条会话的**全部命令、全部产物、以及 agent 在那台机器上的全部动作**(私钥仍在控制面手里、拿不走,design/61 §5 #2)。⇒ 保护型欠账,不是体验回退。**方向是裁定的、不是遗漏**:本 lane 的既有部署形是「AI 编排批量部署到一批 SSH 可达的机器」,那些机器的指纹通常不在任何 known_hosts 里,默认拒连 = 一次静默的可用性断裂;C-R21 裁「在场即严格,缺席即响亮」。补偿三件:①**每连接**一条 `ssh_host_key_unverified` warn(不是每进程一次 —— 一条长期裸连的 lane 必须在每条连接上都看得见);②本计数(遥测里「有多少条连接是裸连」是一个可观测的数,曲线应当只降不升);③两旋钮任一在场即**严格校验、不符拒连**(拒因带两半指纹 + `ssh-keyscan` 指路)。终局 = 部署把旋钮配上(那时本计数归零);旋钮不配而想收紧的部署级开关(「无旋钮即拒启」)是下一件,不在 C-R21 射程。",
|
|
330
326
|
},
|
|
331
|
-
"server.approval.
|
|
327
|
+
"server.approval.parked-decision-not-recorded": {
|
|
332
328
|
cls: "F",
|
|
333
|
-
note: "
|
|
329
|
+
note: "S-1054 α(`tool-approval.ts` 的 `recordParkedOutcome`,停驻赎回那一飞的落行步):停驻门**已经受理**了这次决定(续跑已开始),而把它的记录(决议向 · 署名 · 理由 · 回决幂等键 · 出处)落到仍 `PARKED` 的问行上没成 —— 店错 / 超时 / 行出了门判过的属主域 / 这把键已被同 task 另一只问占着(detail 带 `reason`)。放行的最坏后果 = 这一问在耐久决断口上的**同键回放**读不到这把键:同键重发得到 `409 conflict.ask_decided`(回显门上站着的那次决定,决议向 / 时刻 / 理由取自门,无署名),而不是 200 回放;审计面少一份署名。决定本身零影响(终局恒在停驻门上,门已决);不改判、不重赎、不双兑。计数非零 = 问账店在受理之后写不动了,运维要去看店。",
|
|
334
330
|
},
|
|
335
331
|
"server.approvals.stale-echoed-token-unreadable": {
|
|
336
332
|
cls: "F",
|
|
337
333
|
note: "S-02 codex R1-[medium](验真后修):decide 的 409 `approval_stale` 臂对**调用方回显的旧 token** 做归属判定(`cs.get(binding.checkpointToken)`),那次读**抛了**(store 抖动 / 坏 checkpoint 行 / 行恰被清理)。修前这里是静默 `catch(()=>null)`,「读不出」被折成「确认不在库」——叠上 S-02 的 404 收口后,一次 store 抖动就会把合法旧 token 的 409+terminal 谎报成 404「没有这条审批」。修后:unreadable ⇒ **保持 409**(`terminal` 不披露——证不出归属就不说,与 2026-07-26 纪律同向;404 折叠只在读成功且未命中时走,探测方无法自控 store 故障 ⇒ 谕示封闭不破)。放行的最坏后果 = 该次拒体 `terminal` 诚实缺席(`currentPending` 由它自己的读口与属主复核另判,不受本臂牵连),壳退回重拉列表,judgment 面 fail-safe,故 F 类。留痕理由:这次读是 terminal 披露与 404 折叠两个判定的输入,长期抖动必须在遥测显形。",
|
|
338
334
|
},
|
|
335
|
+
"server.resume.cancel-answer-row-unreadable": {
|
|
336
|
+
cls: "F",
|
|
337
|
+
note: "续跑腿(`http/resume-legs.ts` 的 `landedTerminalRow`)两只本腿铸取消终局的取消臂(`checkpoint.resume_aborted` 臂 / 交给引擎之后抛出的取消臂):驱行终局之后读回那一行,200 体的词 / 码 / 句读行上落下的那一份(run 店终局写先到者得,先到的可以是收割 / 判死),那一读抛。放行 = 体读本腿铸的那一份取消终局(读回之前的形);最坏后果 = 先到者不是本腿时体上的码 / 句与 `GET /v1/runs/:id` 不同 —— 行、账本、读面一个字节不受它管,门 / 裁决不读这只体 ⇒ F 类。detail `task=<taskId> arm=<resume-aborted|thrown-cancel> err=<原句>`;计数 = 多少次答复没读到行。",
|
|
338
|
+
},
|
|
339
339
|
"server.resume.reopen-confirm-unreadable": {
|
|
340
340
|
cls: "F",
|
|
341
341
|
note: "S-447(#60 M2 自查项,`http/resume-legs.ts` 的 `confirmCheckpointReopened`):续跑腿交回一条没 park 的失败结果后(7.129.0 起每一条都问,不再只在三个重开码上问)按 **token** 复核「这张 checkpoint 是不是又 pending 了」,这一读抛(库拖/版本太新/店不可达)。**方向本来就是 fail-closed**:读不出 ⇒ `return true` ⇒ 「不写任何终局、重新 park」(`:1206-1212` 头注已把取舍与有界代价写死:错 park 由 `reapSuspended` 兑,错终局会孤儿化一张活 park 到 TTL)—— 所以这条腿不是 P 类,缺的只是**留痕**。放行的最坏后果 = 多一次多余的 re-park(一张已经被决掉的卡重新挂到 reaper 窗里),人面上是「这条续跑没动」而不是谁被放行了。必须登记的理由是 **uniformity**:同文件三只同形读(`:249` `server.approvals.stale-echoed-token-unreadable` · `:288` `server.approvals.stale-current-pending-unreadable` · 本腿)中只有它是黑的,于是「店一直读不出所以每条续跑都在白白 re-park」与「一切正常」在遥测上同形。计数非零 = 这台机器的 checkpoint 店在拖,运维要去看库。",
|
|
@@ -516,6 +516,10 @@ export const FAIL_OPEN_TAGS = {
|
|
|
516
516
|
cls: "F",
|
|
517
517
|
note: "S-1195(7.119.0;`plugins/snapshot-bucket-presence.ts` 的 `ensureSnapshotBucket`,boot 期核一次快照桶 `SESSION_SNAPSHOT_BUCKET`;S-2021〔7.136.0〕起同一只探针、同一条规则、同一个 tag 也核 k8s 车道的工作区快照桶 `WORKSPACE_SNAPSHOT_BUCKET`——detail 里的 `bucket=` 就是被核的那只桶名;detail = `bucket=… endpoint=<buildDisplaySafeUrl 的显示形> <HTTP 状态 | request failed: 错类>`):presigned 列举对 `MINIO_ENDPOINT` **连不上 / 403 / 5xx / 没有 NoSuchBucket 的 404**,或探针到窗尾一次都没答过(detail 写 `probe still pending when the window ended`)⇒ **证明不了桶缺**,不拒启、照常起服(只有 404 + `NoSuchBucket` 才是「缺」,那一形窗内重试、到窗拒启,不走本 tag)。三问:①错误落到哪 —— 本 tag 的计数 / 探针行 / 记录器的一次性 warn,detail 带端点显示形与状态或错类;②谁受害 —— 桶其实不存在、或凭据不能列举的部署:之后每一次快照 offload 写与 SendUserFile 私有 presigned 请求会答 404 / 403,孤儿 sweep 每分钟一条失败,运维读到的是一串失败请求而不是「桶没建」(与 7.118.x 的既有形状同形,不是新损失);工作区快照桶则是每条 run 读 `latest` 得 404/403——404 + NoSuchBucket 在运行期由 `workspace_snapshot_bucket_missing` 响亮拒绝,403/5xx 走既有的非 404 读失败臂(同样响亮);③缺席倒向哪边 —— 倒向**放行起服**:没有证据既不拒启、也不伪造「桶在场」或「桶缺」,不是门 / 权限 / 凭证。最坏后果 = 缺桶的部署晚一步才暴露;不放行的代价是对象存储一次抖动 / 一次 403 就让整只服务起不来。计数非零 = 这台部署启动时没能确认快照桶,按 detail 的端点与状态去核对网络 / 凭据 / 桶。",
|
|
518
518
|
},
|
|
519
|
+
"server.session-blob-namespace.claim-unproven": {
|
|
520
|
+
cls: "F",
|
|
521
|
+
note: "`plugins/session-blob-namespace.ts` 的 `establish`(开店时对会话 blob 命名空间认领一次:`plugins/store-backend.ts` `openStoreBackendWithFallback` 在 SQL 店开好之后调,一次尝试、不在 `STORE_LOCK_WAIT_MS` 窗里重试,每个请求的上界与快照桶探针同一只常量 `SNAPSHOT_BUCKET_PROBE_TIMEOUT_MS`;detail = `bucket=… prefix=<SESSION_SNAPSHOT_PREFIX 的显示形 | unset> endpoint=<buildDisplaySafeUrl 的显示形> <claim read answered HTTP <状态> | claim write answered HTTP <状态> | the claim just written does not read back | claim request failed: 错类>`):认领物件 `{SESSION_SNAPSHOT_PREFIX}blob-namespace-claim` **读不动 / 写不进 / 连不上 / 写了读不回** ⇒ 证明不了这只命名空间是不是本库的,不拒启、照常起服(只有读到别的库的认领才是「不是」,那一形开店即拒、不走本 tag)。三问:①错误落到哪 —— 本 tag 的计数 / 探针行 / 记录器的一次性 warn;数据轴不随之放开:之后每一次删除(附件孤儿清扫、附件释放、文件历史清扫、退役 blob 清扫)各自重读认领,读不成本库的就拒删,抛出点名桶、前缀旋钮与该授权限的拒句(响亮;那是 fail-closed,不计本 tag);②谁受害 —— 引擎的键缺认领物件 GetObject / PutObject 权限的最小权限部署,或起服那一刻对象存储不通的部署:附件与文件历史的字节不再被回收(桶只涨不减),直到权限补齐或存储答复 —— 恢复后的第一次删除当场认领(缺 ⇒ create-only 写、回读相符)再删,读到别的库的认领 ⇒ 拒删、不改写;③缺席倒向哪边 —— 倒向**放行起服**:没有证据既不拒启,也不当作「是本库的」去删任何字节,不是门 / 权限 / 凭证。最坏后果 = 回收停摆到权限补齐(存储成本,不是数据丢失);不放行的代价是对象存储一次抖动 / 一条缺的权限就让整只服务起不来。计数非零 = 这台部署启动时没能确认命名空间的归属,按 detail 的端点与原因去核对网络 / 凭据 / 认领物件的权限。",
|
|
522
|
+
},
|
|
519
523
|
"server.fleet.serving-lease-unconfirmed": {
|
|
520
524
|
cls: "R",
|
|
521
525
|
ruling: "C-R296",
|
|
@@ -558,7 +562,11 @@ export const FAIL_OPEN_TAGS = {
|
|
|
558
562
|
},
|
|
559
563
|
"server.sandbox-egress.policy-gap": {
|
|
560
564
|
cls: "P-DEBT",
|
|
561
|
-
note: "k8s 车道沙箱出网的起服自检(`plugins/remote-env-k8s.ts` `checkSandboxEgressPolicy` 读节点表与沙箱 ns 的 NetworkPolicy,判法 `sandbox-egress-policy.ts` `sandboxEgressGaps`;起服一次、不挡起服)读出一个缺口 —— 某节点的 InternalIP / ExternalIP 落在一条放行 ipBlock 内(`kind=node_address_open`)、没有策略以 Egress 选中沙箱 pod(`kind=policy_absent`)、pod 保留 IPv6 而策略层担保不了 v6(`kind=ipv6_enabled`)、节点表或策略表读不到(`kind=unreadable what=nodes|networkpolicies`)⇒ 车道**照常起**,每个缺口一行 `sandbox_egress_policy_gap`(带后果句与去哪改)。归 P 类:出网策略是保护面,缺口意味着沙箱里的代码可能够到节点上的服务;归 DEBT 的理由:修法都在集群配置里(节点地址点名、kubelet 放行 v6 sysctl、CNI 的 v6 执行、RBAC),本服务改不了,而拒起车道会让缺省单节点装法(恒有 `ipv6_enabled`)升级即停摆沙箱执行 —— 车道自己的隔离(VM 边界、零 SA token)仍在。放行的最坏后果 = 读出缺口的那一面照旧可达,直到运维按行里的后果句改配置。计数非零 = 这台部署的沙箱出网面有读得出的缺口。读不出的面(宿主 DNAT 发布端口、「pod 所在节点恒放行」的实现差异、CNI 根本不执行策略)不在本 tag 的射程里。",
|
|
565
|
+
note: "k8s 车道沙箱出网的起服自检(`plugins/remote-env-k8s.ts` `checkSandboxEgressPolicy` 读节点表与沙箱 ns 的 NetworkPolicy,判法 `sandbox-egress-policy.ts` `sandboxEgressGaps`;起服一次、不挡起服)读出一个缺口 —— 某节点的 InternalIP / ExternalIP 落在一条放行 ipBlock 内(`kind=node_address_open`)、没有策略以 Egress 选中沙箱 pod(`kind=policy_absent`)、pod 保留 IPv6 而策略层担保不了 v6(`kind=ipv6_enabled`)、节点表或策略表读不到(`kind=unreadable what=nodes|networkpolicies`:RBAC 缺 / API 不可达 / 答体不成形;**集群 API 凭据缺不在其内** —— 凭据缺是起服拒 `config.k8s_api_credentials_missing`,自检不发、不记入本 tag,这一臂已退役)⇒ 车道**照常起**,每个缺口一行 `sandbox_egress_policy_gap`(带后果句与去哪改)。归 P 类:出网策略是保护面,缺口意味着沙箱里的代码可能够到节点上的服务;归 DEBT 的理由:修法都在集群配置里(节点地址点名、kubelet 放行 v6 sysctl、CNI 的 v6 执行、RBAC),本服务改不了,而拒起车道会让缺省单节点装法(恒有 `ipv6_enabled`)升级即停摆沙箱执行 —— 车道自己的隔离(VM 边界、零 SA token)仍在。放行的最坏后果 = 读出缺口的那一面照旧可达,直到运维按行里的后果句改配置。计数非零 = 这台部署的沙箱出网面有读得出的缺口。读不出的面(宿主 DNAT 发布端口、「pod 所在节点恒放行」的实现差异、CNI 根本不执行策略)不在本 tag 的射程里。",
|
|
566
|
+
},
|
|
567
|
+
"server.sandbox-credentials.probe-unanswered": {
|
|
568
|
+
cls: "F",
|
|
569
|
+
note: "k8s 车道每条 run 铸环境之前读一次集群 API 凭据(`boot/execution-env.ts` `createK8sRunEnvFactory` ← `plugins/remote-env-k8s.ts` `apiCredentialReading`:判官说缺 ⇒ 拒;一次 SelfSubjectAccessReview 答 401 ⇒ 拒;答 2xx ⇒ 放行),而这一次探问**没有证出结论**(HTTP 403 / 5xx / 其余非 2xx 非 401、请求抛 / 超时;detail = `namespace=<ns> HTTP <状态> | <错误句>`)⇒ 这条 run 的环境照铸,凭据到底行不行由车道自己的连接答(pod 创建被 401 / 403 拒 ⇒ 响亮的 `shell_unavailable`、瞬时的 API 抖动在车道自己的重试界内重来)。只有正面证据才拒 —— 为一次没答的探问拒 run,会把每次 API 抖动变成失败的 run,把没给已认证调用方留 SSAR 权限的集群变成永远起不了 run。最坏后果 = 凭据真已失效而探问恰好没答的那条 run,落回修前的形(每条 Bash `shell_unavailable`、run `completed`)—— 可用性 / 可见性,不是门 / 凭据的放宽(没有沙箱、没有执行、没有凭据被多给一份)。归 F。计数持续非零 = 这台部署的服务账号问不了 SelfSubjectAccessReview 或 API 常不可达,按 detail 核。",
|
|
562
570
|
},
|
|
563
571
|
"server.fleet.announce-reply-unreadable": {
|
|
564
572
|
cls: "P-DEBT",
|
|
@@ -592,7 +600,7 @@ export const FAIL_OPEN_TAGS = {
|
|
|
592
600
|
},
|
|
593
601
|
"server.store-durability.evidence-unreadable": {
|
|
594
602
|
cls: "F",
|
|
595
|
-
note: "店的持久性起服取证(`store-posture.ts` `captureStoreEvidence`,起服第 2 段段首一次):`/proc/self/mountinfo` 读不出(`why=mountinfo_unreadable err=<码>`)/ 有读不懂的行(`why=mountinfo_malformed lines=<n>`)/ 一根的路径展不平成物理路径(`why=path_unresolvable err=<码> path=<路径>`)/ 挂载表读得出、却找不到走那条路径看见的那一只挂载(`why=mount_unresolved path=<路径>`:空表、同父同点的影子挂载)⇒ 那几根(读不出挂载表时是三根全部)判 `unknown`。只影响自报:能力位 `store.durability`、`/health.store.durability`、诊断 `storeDurability.roots` 如实说 `unknown`,起服布线审计对 `unknown` 只 warn、不拒启。放行的最坏后果 = 一只真落在易失介质(容器可写层 / emptyDir)上的 local 数据根因证据读不到而报 `unknown`、照常起服 —— 与本版之前「按后端种类恒报持久」同向且更诚实,不开门、不碰凭据。计数非零 = 本进程读不到 / 读不懂自己的挂载表(受限 procfs、挂载形不常见)
|
|
603
|
+
note: "店的持久性起服取证(`store-posture.ts` `captureStoreEvidence`,起服第 2 段段首一次):`/proc/self/mountinfo` 读不出(`why=mountinfo_unreadable err=<码>`)/ 有读不懂的行(`why=mountinfo_malformed lines=<n>`)/ 一根的路径展不平成物理路径(`why=path_unresolvable err=<码> path=<路径>`)/ 挂载表读得出、却找不到走那条路径看见的那一只挂载(`why=mount_unresolved path=<路径>`:空表、同父同点的影子挂载)⇒ 那几根(读不出挂载表时是三根全部)判 `unknown`。只影响自报:能力位 `store.durability`、`/health.store.durability`、诊断 `storeDurability.roots` 如实说 `unknown`,起服布线审计对 `unknown` 只 warn、不拒启。放行的最坏后果 = 一只真落在易失介质(容器可写层 / emptyDir)上的 local 数据根因证据读不到而报 `unknown`、照常起服 —— 与本版之前「按后端种类恒报持久」同向且更诚实,不开门、不碰凭据。计数非零 = 本进程读不到 / 读不懂自己的挂载表(受限 procfs、挂载形不常见)或路径上有读不出的段(没有搜索权限 / 链接成环 —— 规范形读不出即抛,不当成「还不存在」)/ 权限竞态。",
|
|
596
604
|
},
|
|
597
605
|
"server.remote-write.staging-dir-left": {
|
|
598
606
|
cls: "F",
|
|
@@ -600,11 +608,11 @@ export const FAIL_OPEN_TAGS = {
|
|
|
600
608
|
},
|
|
601
609
|
"server.resume-anchor.capture-failed": {
|
|
602
610
|
cls: "F",
|
|
603
|
-
note: "回退锚(`resumeAt` 的提示词 / 助手文本手柄)写入失败 —— 四条腿同一只写法 `runs.ts` 的 `settleResumeAnchor
|
|
611
|
+
note: "回退锚(`resumeAt` 的提示词 / 助手文本手柄)写入失败 —— 四条腿同一只写法 `runs.ts` 的 `settleResumeAnchor`,经同一只 `TurnAnchorCapture` 在决定这只锚的那一帧到手时 await(流式腿 `POST /v1/tasks/stream`、同步腿非流式 `POST /v1/tasks` 的 plain 形、后台腿 `POST /v1/runs`、续跑腿;提示锚在开场提示的提交上,早于终帧;要关窗校正的那一形同一把键写两次,后一笔等前一笔落定再发 —— 提示锚至多两个期限;后台 / 续跑腿另有每个可锚的助手文本轮各一个)。锚店写抛(库抖 / 表缺 / 盘满),或单行店操作期限(`BASELINE_IO_DEADLINE_MS`,2 s;与项目指令基线读写同一只数、同一只 `withinIoDeadline`)内没落定(锚店挂住:锚店的写口自己不带期限)⇒ 这一次提示词(或这一轮助手文本)此刻没有回退手柄,run 照常收尾、终帧照发、不改任何终局;到期只放手不取消,那次写照常在飞、迟到落定的锚照样可用(迟到的失败被吞,不重复计数)。放行的最坏后果 = 用户拿这次 run 的 taskId 去 `resumeAt` 得 404 `resume_at.unknown_event`、会话视图里那条用户消息行不带 `taskId` 手柄(用户面的读数只有这一处真源,本臂不另铸第二份);不是门、不是凭据。不放行(抛)的代价是让一次锚写失败把整条已经跑完的 run 判成失败。计数持续非零 = 锚店写不进(去看库)。计数里 `reason=timeout` 占多数 = 锚店慢到秒级(去看库的锁 / 连接池)。detail = `leg=<stream|sync|bg|resume> kind=<prompt|turn> reason=error error=<写口的错误句>` 或 `… reason=timeout boundMs=<期限>`。",
|
|
604
612
|
},
|
|
605
613
|
"server.resume-anchor.cause-read-failed": {
|
|
606
614
|
cls: "F",
|
|
607
|
-
note: "未知回退手柄的 404 成因半句(`history-anchor.ts` 的唯一组句器;提交体 `resumeAt` / `rewindFilesTo` 与 run 外回退口 `to` 三处同调):锚店里没有这只手柄 ⇒ 经属主存取器读一次 run 行(嵌套可选读,看不见 ≡ 没有)、同会话 ⇒ 按这条提问自己的属主键再问一次锚店,只为选句(调用方看得见的本会话提问、它自己也没落锚 ⇒
|
|
615
|
+
note: "未知回退手柄的 404 成因半句(`history-anchor.ts` 的唯一组句器;提交体 `resumeAt` / `rewindFilesTo` 与 run 外回退口 `to` 三处同调):锚店里没有这只手柄 ⇒ 经属主存取器读一次 run 行(嵌套可选读,看不见 ≡ 没有)、同会话 ⇒ 按这条提问自己的属主键再问一次锚店,只为选句(调用方看得见的本会话提问、它自己也没落锚 ⇒ 「没有锚的提问」,只陈述这一事实、不点名成因;否则只说没有锚)。这两读任一抛(库抖 / 表缺)⇒ 404 的码与状态照旧,句子退回只说没有锚。放行的最坏后果 = 一条真实存在、没有锚的提问,其 404 少了那半句说明(调用方可能当成手柄写错);不影响任何判定、不放行任何请求。",
|
|
608
616
|
},
|
|
609
617
|
"server.remote-write.stage-seal-fallback": {
|
|
610
618
|
cls: "F",
|
|
@@ -49,7 +49,9 @@ function screenJsonLine(line, withheld) {
|
|
|
49
49
|
}
|
|
50
50
|
function serializeEntry(head, fields) {
|
|
51
51
|
try {
|
|
52
|
-
|
|
52
|
+
const record = { ...head, ...fields, ...head };
|
|
53
|
+
Reflect.deleteProperty(record, "toJSON");
|
|
54
|
+
return JSON.stringify(record);
|
|
53
55
|
}
|
|
54
56
|
catch (err) {
|
|
55
57
|
return JSON.stringify({ ...head, [FIELDS_WITHHELD]: errorKindOf(err) });
|
|
@@ -279,6 +279,7 @@ export function createMetrics() {
|
|
|
279
279
|
m.counter("memory_knn_query_failed_total", "Memory KNN searchScored queries that failed at runtime (S22)");
|
|
280
280
|
m.counter("memory_dedup_folded_total", "Memory writes folded into an existing near-duplicate row (LOW)");
|
|
281
281
|
m.counter("memory_dedup_probe_failed_total", "Memory dedup KNN probes that failed and fell through to INSERT (LOW)");
|
|
282
|
+
m.counter("store_boundary_fault_total", "SQL-store failures whose driver error was rewritten at the store boundary (code + fixed sentence leave the store; the driver's own sentence goes to the at=store log line), by site (store.method) and class (store fault judge word)");
|
|
282
283
|
m.counter("redactions_applied_total", "redactSecrets rewrites (S24), by pattern label and `arm` (S-88: full vs prefix-fragment arm — which RULE fired, NOT proof the text was upstream-truncated)");
|
|
283
284
|
m.counter("session_cache_stale_hit_total", "Warm session-cache hits dropped because the store had moved past the cached leaf (written by another replica, or gone); the session was re-woken from the store");
|
|
284
285
|
m.counter("breaker_writethrough_failed_total", "Circuit-breaker cross-replica write-through failures (LOW), by backend");
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🔴 **运维名册的档表**(唯一一张)——「这位验过的人在这台部署上持哪几只运维权力」只在这里答。
|
|
3
|
+
*
|
|
4
|
+
* ## 律(一句)
|
|
5
|
+
* 一张闭集档表、一只读法({@link rosterTierOf}:读验过的人、读部署配置里的名册);档表一行 = 名单在哪格配置(`field` / `env`)· 这一档持哪几只权力(`powers`)·
|
|
6
|
+
* 持有者是不是人(`person`)。**不是人的档**(服务主体)的身份只在声明了它所持权力的路由上算数(路由声明行的 `power` 列,`http/route-ctx.ts`),别处整次请求
|
|
7
|
+
* 403 `auth.principal_confined`(判官 `http/principal-gate.ts` 的 `confinedTierOf`:请求的人、决定证明推出的决定者、设备行的属主三个读点同判 —— 最后一个在设备 hello 准入,
|
|
8
|
+
* 设备车道不经 HTTP、没有声明过权力的路由,落在非人档的属主登记的设备连不上),`GET /health` 按没出示凭据分档。
|
|
9
|
+
* 全运维档(`operator`)持 {@link OPERATOR_POWERS} 全集 —— 加一只权力词,现有运维不掉权。
|
|
10
|
+
*
|
|
11
|
+
* ## 读者
|
|
12
|
+
* · 档:{@link rosterTierOf}(人 → 档;单用户声明 `OPERATOR_SINGLE_USER=true` ⇒ 每个调用方落 `operator` 档)。
|
|
13
|
+
* · 授权 / 有无 / 圈禁 / 出路句:`http/principal-gate.ts` 的 `explicitOperatorOk(人, 名册, 权力)` / `operatorRosterPresent(名册, 权力)` / `confinedTierOf` /
|
|
14
|
+
* `buildOperatorRosterWayOut(权力)`,都经本表的 {@link rosterTierOf} / {@link tierHolds} / {@link rosterNamesOf},不另写一份「哪几格是名单」。
|
|
15
|
+
* · 起服不变量:`config-invariants.ts` 的 `operator-roster-well-formed`(名单是名字列表 · 非人档的名字是主体名 · 一个名字只在一档)与 `operator-single-user`(单用户声明与任一档名单互斥)按本表逐档读。
|
|
16
|
+
*
|
|
17
|
+
* 叶子:只取型(`config-types` / `owner-brands`),不 import http 层 —— 配置层(不变量)与门(`principal-gate`)读同一张表。
|
|
18
|
+
*/
|
|
19
|
+
import type { ServiceConfig } from "./config-types.js";
|
|
20
|
+
import type { Person } from "./owner-brands.js";
|
|
21
|
+
/** 运维权力(闭集)。加词 ⇒ 档表与每个按权力穷举的读者编译红。`operate` = 运维面的全部门与放宽位;`drain` = 排空口 `POST /v1/admin/drain`。 */
|
|
22
|
+
export declare const OPERATOR_POWERS: readonly ["operate", "drain"];
|
|
23
|
+
export type OperatorPower = (typeof OPERATOR_POWERS)[number];
|
|
24
|
+
/** 名册读的几格配置:各档的名单 + 单用户声明(只住在部署配置里;env 独有、起服冻结)。 */
|
|
25
|
+
export type OperatorRoster = Pick<ServiceConfig, "operatorPrincipals" | "operatorDrainPrincipals" | "operatorSingleUser">;
|
|
26
|
+
/** 档表(闭集;一档一格配置、一格 env)。 */
|
|
27
|
+
export declare const ROSTER_TIERS: {
|
|
28
|
+
readonly operator: {
|
|
29
|
+
readonly field: "operatorPrincipals";
|
|
30
|
+
readonly env: "OPERATOR_PRINCIPALS";
|
|
31
|
+
readonly holders: "operator principals";
|
|
32
|
+
readonly powers: readonly ["operate", "drain"];
|
|
33
|
+
readonly person: true;
|
|
34
|
+
};
|
|
35
|
+
readonly drain: {
|
|
36
|
+
readonly field: "operatorDrainPrincipals";
|
|
37
|
+
readonly env: "OPERATOR_DRAIN_PRINCIPALS";
|
|
38
|
+
readonly holders: "drain-only service principals";
|
|
39
|
+
readonly powers: readonly ["drain"];
|
|
40
|
+
readonly person: false;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
export type RosterTier = keyof typeof ROSTER_TIERS;
|
|
44
|
+
/** 不是人的档(圈禁的那几档)。 */
|
|
45
|
+
export type NonPersonTier = {
|
|
46
|
+
[T in RosterTier]: (typeof ROSTER_TIERS)[T]["person"] extends false ? T : never;
|
|
47
|
+
}[RosterTier];
|
|
48
|
+
/** 档的规范序(出路句按它列档;判档时人档排在非人档之后,见 {@link rosterTierOf})。漏一档 / 名册多一格名单不进表 ⇒ 编译红。 */
|
|
49
|
+
export declare const ROSTER_TIER_ORDER: readonly ["operator", "drain"];
|
|
50
|
+
/**
|
|
51
|
+
* 一档的名单(缺席 ≡ 空 = 这一档没人)。名单必须是列表:绕过类型手搓的配置在这一格放一串字符串 ⇒ 响亮抛(`includes` 会把它读成子串匹配 = 放宽;
|
|
52
|
+
* 读成空又会让非人档的服务主体落回普通身份 = 也是放宽)。装配座与起服在此之前已按 `operator-roster-well-formed` 拒,这一臂只是读法本身不说假话。
|
|
53
|
+
*/
|
|
54
|
+
export declare function rosterNamesOf(tier: RosterTier, roster: OperatorRoster): readonly string[];
|
|
55
|
+
/** 这一档持不持这只权力。 */
|
|
56
|
+
export declare function tierHolds(tier: RosterTier, power: OperatorPower): boolean;
|
|
57
|
+
/** 这一档是不是人档。 */
|
|
58
|
+
export declare function tierIsPerson(tier: RosterTier): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* 🔴 **人 → 档的唯一读法**。`person` 必须是验过的人(`gatedPerson` / `personOf(主体)` / 决定证明推出的人),绝不是自述头,也不是带场景的主体(名册登记的是人)。
|
|
61
|
+
* · 人在某档名单里 ⇒ 那一档(非人档先判,见 {@link TIER_MATCH_ORDER});
|
|
62
|
+
* · 否则单用户声明 `OPERATOR_SINGLE_USER=true` ⇒ `operator`(单用户形只有一位用户,能到这台部署的就是他;没有人也成立 —— 与改前 `explicitOperatorOk` 同读);
|
|
63
|
+
* · 否则 ⇒ 不在名册(空名单 = 没人在)。
|
|
64
|
+
*/
|
|
65
|
+
export declare function rosterTierOf(person: Person | undefined, roster: OperatorRoster): RosterTier | undefined;
|
|
66
|
+
/** 名册里有没有**非人档**的名字(圈禁判只在它为真时读人 —— 没声明非人档的部署零新读、逐字节同今天)。 */
|
|
67
|
+
export declare function rosterHasNonPersonNames(roster: OperatorRoster): boolean;
|
|
68
|
+
//# sourceMappingURL=operator-roster.d.ts.map
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export const OPERATOR_POWERS = ["operate", "drain"];
|
|
2
|
+
export const ROSTER_TIERS = {
|
|
3
|
+
operator: { field: "operatorPrincipals", env: "OPERATOR_PRINCIPALS", holders: "operator principals", powers: OPERATOR_POWERS, person: true },
|
|
4
|
+
drain: { field: "operatorDrainPrincipals", env: "OPERATOR_DRAIN_PRINCIPALS", holders: "drain-only service principals", powers: ["drain"], person: false },
|
|
5
|
+
};
|
|
6
|
+
export const ROSTER_TIER_ORDER = ["operator", "drain"];
|
|
7
|
+
const TIER_MATCH_ORDER = [...ROSTER_TIER_ORDER.filter((t) => !ROSTER_TIERS[t].person), ...ROSTER_TIER_ORDER.filter((t) => ROSTER_TIERS[t].person)];
|
|
8
|
+
export function rosterNamesOf(tier, roster) {
|
|
9
|
+
const names = roster[ROSTER_TIERS[tier].field];
|
|
10
|
+
if (names === undefined)
|
|
11
|
+
return [];
|
|
12
|
+
if (!Array.isArray(names))
|
|
13
|
+
throw new Error(`operator roster: ${ROSTER_TIERS[tier].env} is not a list of principal names (invariant operator-roster-well-formed)`);
|
|
14
|
+
return names;
|
|
15
|
+
}
|
|
16
|
+
export function tierHolds(tier, power) {
|
|
17
|
+
return ROSTER_TIERS[tier].powers.includes(power);
|
|
18
|
+
}
|
|
19
|
+
export function tierIsPerson(tier) {
|
|
20
|
+
return ROSTER_TIERS[tier].person;
|
|
21
|
+
}
|
|
22
|
+
export function rosterTierOf(person, roster) {
|
|
23
|
+
if (person !== undefined)
|
|
24
|
+
for (const tier of TIER_MATCH_ORDER)
|
|
25
|
+
if (rosterNamesOf(tier, roster).includes(person))
|
|
26
|
+
return tier;
|
|
27
|
+
return roster.operatorSingleUser === true ? "operator" : undefined;
|
|
28
|
+
}
|
|
29
|
+
export function rosterHasNonPersonNames(roster) {
|
|
30
|
+
return ROSTER_TIER_ORDER.some((t) => !ROSTER_TIERS[t].person && rosterNamesOf(t, roster).length > 0);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=operator-roster.js.map
|
|
@@ -278,6 +278,15 @@ export declare class InMemoryWorkflowNotifyJournalStore implements WorkflowNotif
|
|
|
278
278
|
get(runId: string): Promise<WorkflowNotifyJournalEntry | null>;
|
|
279
279
|
get size(): number;
|
|
280
280
|
}
|
|
281
|
+
/** 一笔**落成**的记录写的观察者(执行器视图;型属主在这里,实现 = `workflow-park-holder.ts` 的 `HeldParksHere`)。 */
|
|
282
|
+
export interface LandedRecordObserver {
|
|
283
|
+
noteLanded(runId: string, run: WorkflowRun): void;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* 「本服务的 workflow 记录写者经哪一只记录店写」的唯一读法:交给引擎的那只记录店是 journaling 装饰器 ⇒ 它里面那一只(notify 门的收养翻转也经它写);
|
|
287
|
+
* 否则就是它自己。起服判官(`workflow-park-decision.ts` 的 `parkDecisionStoreRefusal`)拿它与决定店的记录栅栏按身份比。
|
|
288
|
+
*/
|
|
289
|
+
export declare function recordWriterOf(store: object): object;
|
|
281
290
|
/**
|
|
282
291
|
* A {@link WorkflowRunStore} DECORATOR that journals a run the instant core persists it at START. core's
|
|
283
292
|
* `startWorkflow` `put`s the run row (`status: "running"`) synchronously before the body runs, carrying both the
|
|
@@ -304,6 +313,9 @@ export declare class JournalingWorkflowRunStore implements WorkflowRunStore {
|
|
|
304
313
|
* 的派生投影,写点必须与 fleet 行投影/notify journal 同一个(见 index 模块的文件头「单写者」段)。
|
|
305
314
|
* 可选:缺席 ⇒ 一位不维护(与 fleet 半场同姿势,行为逐字不变)。 */
|
|
306
315
|
private readonly agentSessionIndex?;
|
|
316
|
+
/** 本进程执行器视图(`workflow-park-holder.ts` 的 `HeldParksHere`):本装饰器在本进程引擎每一笔**落成**的记录写之后把记录交给它(它读其中本记录持有的停驻 token)。
|
|
317
|
+
* 写抛 / CAS 输 ⇒ 不交(视图保留上一份)。可选:缺席 ⇒ 不维护(没有 workflow 停驻车道的部署)。 */
|
|
318
|
+
private readonly landedRecords?;
|
|
307
319
|
constructor(inner: WorkflowRunStore,
|
|
308
320
|
/** [ref] optional since the fleet decoupling: undefined ⇒ no start-time journal (ephemeral memory
|
|
309
321
|
* backend has nothing to recover), the FLEET half still publishes — the panel is replica-local UI
|
|
@@ -316,7 +328,12 @@ export declare class JournalingWorkflowRunStore implements WorkflowRunStore {
|
|
|
316
328
|
/** [ref] 车CM:workflow 出身 park 的 join 索引。**本装饰器是它全仓唯一的写者** —— 索引是 `WorkflowRun`
|
|
317
329
|
* 的派生投影,写点必须与 fleet 行投影/notify journal 同一个(见 index 模块的文件头「单写者」段)。
|
|
318
330
|
* 可选:缺席 ⇒ 一位不维护(与 fleet 半场同姿势,行为逐字不变)。 */
|
|
319
|
-
agentSessionIndex?: WorkflowAgentSessionIndex | undefined
|
|
331
|
+
agentSessionIndex?: WorkflowAgentSessionIndex | undefined,
|
|
332
|
+
/** 本进程执行器视图(`workflow-park-holder.ts` 的 `HeldParksHere`):本装饰器在本进程引擎每一笔**落成**的记录写之后把记录交给它(它读其中本记录持有的停驻 token)。
|
|
333
|
+
* 写抛 / CAS 输 ⇒ 不交(视图保留上一份)。可选:缺席 ⇒ 不维护(没有 workflow 停驻车道的部署)。 */
|
|
334
|
+
landedRecords?: LandedRecordObserver | undefined);
|
|
335
|
+
/** 本装饰器的每一笔记录写经它落下的那只记录店(起服判官按身份比:决定店的记录栅栏必须就是它 —— {@link recordWriterOf})。 */
|
|
336
|
+
get records(): WorkflowRunStore;
|
|
320
337
|
/** 本进程**亲眼看着落进索引**的指针:run → 它点名过的子会话。只用来跳过重复的 upsert,不是缓存(指针只增不删,记着的必在索引里)。
|
|
321
338
|
*
|
|
322
339
|
* 为什么需要:workflow 的进度写是每只 agent 状态变化一次,而 park 是罕见事件 ⇒ 无条件 upsert 会给每一次写多打几发语句(SQL)
|
|
@@ -270,16 +270,24 @@ export class InMemoryWorkflowNotifyJournalStore {
|
|
|
270
270
|
return this.entries.size;
|
|
271
271
|
}
|
|
272
272
|
}
|
|
273
|
+
export function recordWriterOf(store) {
|
|
274
|
+
return store instanceof JournalingWorkflowRunStore ? store.records : store;
|
|
275
|
+
}
|
|
273
276
|
export class JournalingWorkflowRunStore {
|
|
274
277
|
inner;
|
|
275
278
|
gate;
|
|
276
279
|
fleetBus;
|
|
277
280
|
agentSessionIndex;
|
|
278
|
-
|
|
281
|
+
landedRecords;
|
|
282
|
+
constructor(inner, gate, fleetBus, agentSessionIndex, landedRecords) {
|
|
279
283
|
this.inner = inner;
|
|
280
284
|
this.gate = gate;
|
|
281
285
|
this.fleetBus = fleetBus;
|
|
282
286
|
this.agentSessionIndex = agentSessionIndex;
|
|
287
|
+
this.landedRecords = landedRecords;
|
|
288
|
+
}
|
|
289
|
+
get records() {
|
|
290
|
+
return this.inner;
|
|
283
291
|
}
|
|
284
292
|
pointedSessions = new Map();
|
|
285
293
|
async ensurePointersFor(id, run) {
|
|
@@ -338,10 +346,13 @@ export class JournalingWorkflowRunStore {
|
|
|
338
346
|
scope: run.scope,
|
|
339
347
|
});
|
|
340
348
|
await this.writeWithPointers(id, run, () => this.inner.put(id, run), () => true);
|
|
349
|
+
this.landedRecords?.noteLanded(id, run);
|
|
341
350
|
this.publishFleet(id, run);
|
|
342
351
|
}
|
|
343
352
|
async update(id, scope, run, expect) {
|
|
344
353
|
const ok = await this.writeWithPointers(id, run, () => this.inner.update(id, scope, run, expect), (won) => won);
|
|
354
|
+
if (ok)
|
|
355
|
+
this.landedRecords?.noteLanded(id, run);
|
|
345
356
|
if (ok)
|
|
346
357
|
this.publishFleet(id, run);
|
|
347
358
|
return ok;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type CheckpointToken, type ResumeOutcome } from "@sema-agent/core";
|
|
1
|
+
import { type CheckpointToken, type ResumeOutcome, type WorkflowRun } from "@sema-agent/core";
|
|
2
2
|
import type { ResumeRestatement } from "../http/resume-restatement.js";
|
|
3
3
|
import { type JsonColumnReader } from "../plugins/sql-json-column.js";
|
|
4
4
|
import { type InProcessClaimFence } from "../plugins/store-contracts.js";
|
|
@@ -15,25 +15,68 @@ export interface WorkflowParkDecision {
|
|
|
15
15
|
/** 带着它的会话 = 受理那一刻那条 run 的发起会话(宿主)。 */
|
|
16
16
|
readonly hostSessionId: string;
|
|
17
17
|
readonly outcome: WorkflowParkOutcome;
|
|
18
|
-
/** {@link parkDecisionFingerprint}:同一决定的判据(
|
|
18
|
+
/** {@link parkDecisionFingerprint}:同一决定的判据(先受理者立 / 回执幂等 / 收场转交的条件)。 */
|
|
19
19
|
readonly fingerprint: string;
|
|
20
|
-
/**
|
|
20
|
+
/** 承运者(回执上的 `taskId`):记录栅栏下 = 持有这张卡的那条 workflow run;认领栅栏下 = 投递那一跑。读者不按它的种类分支(文件头)。 */
|
|
21
21
|
readonly deliveredTaskId: string;
|
|
22
|
-
/** 受理时刻(受理那台副本的墙钟,记录值;不当任何条件
|
|
22
|
+
/** 受理时刻(受理那台副本的墙钟,记录值;不当任何条件)。 */
|
|
23
23
|
readonly acceptedAtMs: number;
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
|
-
*
|
|
27
|
-
*
|
|
26
|
+
* 记录栅栏下一次决断的结局(闭集;`switch` 穷尽):
|
|
27
|
+
* · `not_running` —— 记录已不读作 `running`(或不在)⇒ 承运者换成续跑车道的投递那一跑,零写;
|
|
28
|
+
* · `not_held` —— 仍在跑,本记录的 `parks[]` 已不持有这个 token(或读不出)⇒ 零写;
|
|
29
|
+
* · `restated` —— 仍在跑、仍持有,请求带续跑重述键(`mcpServers` / `a2aPeers`)⇒ 零写(活 run 上的子代带着它停驻时的表继续,重述盖不上);
|
|
30
|
+
* · `other_decision` —— 行上已是**另一个**决定(先受理者立)⇒ 零写;
|
|
31
|
+
* · `stands` —— 本决定落下了,或行上就是同一决定(指纹相等)。
|
|
32
|
+
*/
|
|
33
|
+
export type HolderFenceVerdict = "not_running" | "not_held" | "restated" | "other_decision" | "stands";
|
|
34
|
+
/** 记录栅栏的结局:`running: false` = 记录此刻不读作 `running`(或不在),`fn` 一次都没调。 */
|
|
35
|
+
export type RecordFenced<T> = {
|
|
36
|
+
readonly running: true;
|
|
37
|
+
readonly value: T;
|
|
38
|
+
} | {
|
|
39
|
+
readonly running: false;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* **workflow 记录的「仍在跑」原子段 —— 进程内那一形**(属主 = `workflow-record-fence.ts` 的 `FencedWorkflowRecordStore`:本服务全部记录写者 ——
|
|
43
|
+
* 引擎经 journaling 装饰器、notify 门的收养翻转 —— 都经它写,它按 runId 互斥)。`whileRunning(runId, fn)`:在这条 run 的互斥段里读记录;读作 `running`
|
|
44
|
+
* 才调 `fn`(同步:判与写同一段,型上不许把写挪到段外)、答 `{ running: true, value }`,否则答 `{ running: false }`。
|
|
45
|
+
* SQL 孪生是一个事务(`SqlWorkflowRunStore.whileRunning`:锁住 `workflow_run` 行,`fn` 收那只事务连接),不是本型。
|
|
46
|
+
*/
|
|
47
|
+
export interface InProcessRecordFence {
|
|
48
|
+
whileRunning<T>(runId: string, fn: (run: WorkflowRun) => T): Promise<RecordFenced<T>>;
|
|
49
|
+
}
|
|
50
|
+
/** 记录栅栏的两形(闭集,与认领栅栏 `ClaimFenceStore` 同形):SQL 孪生一只行锁事务 / 进程内按 runId 互斥。决定店的两形各绑各的那一形。 */
|
|
51
|
+
export type WorkflowRecordFenceStore = import("../plugins/workflow-run-store-sql.js").SqlWorkflowRunStore | InProcessRecordFence;
|
|
52
|
+
/**
|
|
53
|
+
* 记录栅栏判的那一半(两形同一只纯函数;写那一半各形自己的原子段):本记录持有这个 token 吗(`heldParksOf`,`parks[]` 读不出 ⇒ 证不出持有),
|
|
54
|
+
* 请求带重述键吗。交回 `land` ⇒ 进「行上没有就落、有就比指纹」那一步。
|
|
55
|
+
*/
|
|
56
|
+
export declare function holderFenceAdmits(run: WorkflowRun, d: Pick<WorkflowParkDecision, "runId" | "token">, restated: boolean): "not_held" | "restated" | "land";
|
|
57
|
+
/**
|
|
58
|
+
* 决定行的店契约(SQL 两方言 / local 文件 / 内存三形同律)。写者两个:`/decide` 与决断口停驻形的 workflow 车道(7.151.x 及以前:应答口的)(记录栅栏那一笔 / 续跑车道开跑之前那一笔)、
|
|
59
|
+
* run 收场送达的转交(续跑车道那一笔,带条件);读者是起跑读者、持有进程的拉取腿、收场送达与 `/decide` 自己的回执幂等判;删除只有 SQL 收割的级联。
|
|
28
60
|
*/
|
|
29
61
|
export interface WorkflowParkDecisionStore {
|
|
30
|
-
/**
|
|
62
|
+
/** 认领栅栏 = 构造时绑定的那只 run 店。起服判官要它**就是**部署的 run 店({@link parkDecisionStoreRefusal})。 */
|
|
31
63
|
readonly claims: object;
|
|
64
|
+
/** 记录栅栏 = 构造时绑定的那只 workflow 记录店。起服判官要它**就是**本服务记录写者共用的那一只。 */
|
|
65
|
+
readonly records: object;
|
|
66
|
+
/**
|
|
67
|
+
* 认领栅栏的原子段里写(律的第二个取值):投递那一跑此刻持有宿主会话的认领且在跑 ⇒ 写并答 `true`;否则什么都不写、答 `false`。
|
|
68
|
+
* `condition` 缺席 ⇒ 整行写(没有行插入、有行整行取代);在场 ⇒ 行上的指纹仍等于 `expect` 才整行写,否则不写、答 `false`(收场转交:一个更新的决定已在行上)。
|
|
69
|
+
*/
|
|
70
|
+
record(decision: WorkflowParkDecision, condition?: {
|
|
71
|
+
readonly expect: string;
|
|
72
|
+
}): Promise<boolean>;
|
|
32
73
|
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
74
|
+
* 记录栅栏的原子段里判与写(律的第一个取值;`decision.deliveredTaskId` = `decision.runId` = 持有这张卡的那条 run):结局见 {@link HolderFenceVerdict}。
|
|
75
|
+
* 只有 `stands` 可能写过(行上本来没有时插入),其余零写。
|
|
35
76
|
*/
|
|
36
|
-
|
|
77
|
+
recordForRunningHolder(decision: WorkflowParkDecision, request: {
|
|
78
|
+
readonly restated: boolean;
|
|
79
|
+
}): Promise<HolderFenceVerdict>;
|
|
37
80
|
get(token: CheckpointToken): Promise<WorkflowParkDecision | null>;
|
|
38
81
|
/** 带着这个会话的全部决定行(顺序不承重)。 */
|
|
39
82
|
listByHostSession(hostSessionId: string): Promise<WorkflowParkDecision[]>;
|
|
@@ -41,15 +84,17 @@ export interface WorkflowParkDecisionStore {
|
|
|
41
84
|
/** 起服判官读的那几座(`ServiceDeps` 的子集)。 */
|
|
42
85
|
export interface ParkDecisionLaneSeats {
|
|
43
86
|
readonly runStore?: object | undefined;
|
|
87
|
+
readonly workflowRunStore?: object | undefined;
|
|
44
88
|
readonly workflowAgentSessionIndex?: unknown;
|
|
45
89
|
readonly workflowParkDecisions?: WorkflowParkDecisionStore | undefined;
|
|
46
90
|
}
|
|
47
91
|
/**
|
|
48
|
-
* 🔴
|
|
92
|
+
* 🔴 **「决定店绑对了两只栅栏吗」的唯一判官**(`createHttpServer` 起服时调;拒 ⇒ 拒启)。判的是**递进来的对象**(按身份比),不是配置组合 ——
|
|
49
93
|
* 本服务自己那一形(SQL 后端配 `WORKFLOW_RUN_STORE=file|memory` 且开自编排)由配置不变量 `workflow-park-decision-domain` 在第 1 段、一次性迁移之前拒,走不到这里;
|
|
50
94
|
* 走到这里的不相等只来自嵌入方递错了座。
|
|
51
|
-
* 期望的绑定:workflow 子代停驻车道装了(park 索引在场)且部署有 run 店 ⇒
|
|
52
|
-
*
|
|
95
|
+
* 期望的绑定:workflow 子代停驻车道装了(park 索引在场)且部署有 run 店 ⇒ 决定店在场、`claims` **就是**那只 run 店、`records` **就是**本服务记录写者经它写的那只记录店
|
|
96
|
+
* ({@link recordWriterOf}:journaling 装饰器里面那一只);否则不该有决定店。不相等的四形各一句:
|
|
97
|
+
* ①车道与 run 店都在而决定店缺席;②决定店绑的是别的 run 店;③有决定店,而车道没装或部署没有 run 店;④决定店的记录栅栏不是本服务记录写者经它写的那一只。
|
|
53
98
|
*/
|
|
54
99
|
export declare function parkDecisionStoreRefusal(seats: ParkDecisionLaneSeats): string | undefined;
|
|
55
100
|
/**
|
|
@@ -68,24 +113,31 @@ export declare function parkDecisionFingerprint(outcome: WorkflowParkOutcome, re
|
|
|
68
113
|
*/
|
|
69
114
|
export declare const readWorkflowParkOutcome: JsonColumnReader<WorkflowParkOutcome>;
|
|
70
115
|
/**
|
|
71
|
-
* 单机车道的决定店(`LocalWorkflowAgentSessionIndex` 的同室孪生)
|
|
116
|
+
* 单机车道的决定店(`LocalWorkflowAgentSessionIndex` 的同室孪生),绑在进程内的两只栅栏上:run 店({@link InProcessClaimFence}:Memory / File run 店)与
|
|
117
|
+
* 记录栅栏装饰器({@link InProcessRecordFence})。
|
|
72
118
|
* `root` 在场 ⇒ 追加式 JSONL 账本(0o700 目录 + 0o600 账本,一行 = 一条决定行的整份快照,每一笔写都追加);重放按行序、**末行胜**
|
|
73
|
-
* (
|
|
119
|
+
* (写序就是栅栏的序:每一笔都在栅栏的段里追加);缺席 ⇒ 纯内存(`WORKFLOW_RUN_STORE=memory` 的易失车道)。
|
|
74
120
|
*
|
|
75
121
|
* 🔴 **坏行 fail-closed**(登记座 `workflow-park-decisions`):读不出的一行可能正是**取代**了一条旧决定的那一笔 —— 跳过它重放其余行,
|
|
76
|
-
*
|
|
122
|
+
* 会把被取代的旧决定复活成当下的决定,在下一次交付时交给引擎。闸合上之后四个动词都响亮拒,直到有人处理那只文件;
|
|
77
123
|
* 起跑读者(`parked-decide.ts`)把这一拒读成「本店没有可供的行」(F tag `server.workflow-park-decision.store-unreadable`)—— 起跑不连带拒,写与按 token 读照旧拒。
|
|
78
124
|
* SQL 孪生同律:某一行 `outcome` 坏体 ⇒ 读口拒,起跑读者同一臂。
|
|
79
125
|
*/
|
|
80
126
|
export declare class LocalWorkflowParkDecisionStore implements WorkflowParkDecisionStore {
|
|
81
127
|
readonly claims: InProcessClaimFence;
|
|
128
|
+
readonly records: InProcessRecordFence;
|
|
82
129
|
private readonly fsyncEnabled;
|
|
83
130
|
private readonly ledgerPath;
|
|
84
131
|
private readonly gate;
|
|
85
132
|
private readonly rows;
|
|
86
133
|
private log;
|
|
87
|
-
constructor(claims: InProcessClaimFence, root?: string, fsyncEnabled?: boolean);
|
|
88
|
-
record(decision: WorkflowParkDecision
|
|
134
|
+
constructor(claims: InProcessClaimFence, records: InProcessRecordFence, root?: string, fsyncEnabled?: boolean);
|
|
135
|
+
record(decision: WorkflowParkDecision, condition?: {
|
|
136
|
+
readonly expect: string;
|
|
137
|
+
}): Promise<boolean>;
|
|
138
|
+
recordForRunningHolder(decision: WorkflowParkDecision, request: {
|
|
139
|
+
readonly restated: boolean;
|
|
140
|
+
}): Promise<HolderFenceVerdict>;
|
|
89
141
|
/** 整行写(同步):落盘**先于**内存翻转(调用方观察到的状态背后一定有耐久记录)。交回栅栏的落定记号(同步交回,型上不许让出)。 */
|
|
90
142
|
private landNow;
|
|
91
143
|
get(token: CheckpointToken): Promise<WorkflowParkDecision | null>;
|