@sema-agent/server 7.132.0 → 7.133.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 +266 -0
- package/README.md +8 -9
- package/README.zh-CN.md +7 -6
- package/USAGE.md +174 -55
- package/deploy/sema-up/README.md +19 -1
- package/deploy/sema-up/chart/templates/server-v4pro.yaml +5 -2
- package/deploy/sema-up/chart/templates/server.yaml +5 -2
- package/deploy/sema-up/stack/compose.yaml +3 -0
- package/deploy/sema-up/stack/sema-stack-cluster.yaml +4 -2
- package/dist/adoption/plan.d.ts +3 -2
- package/dist/adoption/plan.js +7 -5
- package/dist/adoption/runner.js +3 -10
- package/dist/adoption/sql.d.ts +3 -2
- package/dist/adoption/sql.js +3 -5
- package/dist/adoption/wire.d.ts +4 -1
- package/dist/adoption/wire.js +1 -0
- package/dist/approval-ask-audit-store.d.ts +31 -13
- package/dist/approval-ask-audit-store.js +272 -74
- package/dist/approval-ask-machine.d.ts +15 -0
- package/dist/approval-ask-machine.js +6 -0
- package/dist/approval-ask-retention.d.ts +136 -0
- package/dist/approval-ask-retention.js +102 -0
- package/dist/approval-card.d.ts +79 -19
- package/dist/approval-card.js +44 -13
- package/dist/approval-deny-reasons.d.ts +1 -1
- package/dist/approval.d.ts +9 -0
- package/dist/approval.js +24 -3
- package/dist/audit.d.ts +27 -10
- package/dist/audit.js +12 -16
- package/dist/bake-runner/main.js +3 -2
- package/dist/boot/deferred-sandbox-path-env.js +1 -1
- package/dist/boot/execution-env.js +9 -7
- package/dist/boot/execution-lane.js +11 -0
- package/dist/boot/leader.js +2 -0
- package/dist/boot/memory-boundary.js +2 -2
- package/dist/boot/memory-consolidation.d.ts +5 -4
- package/dist/boot/memory-consolidation.js +7 -6
- package/dist/boot/org-delivery.d.ts +28 -0
- package/dist/boot/org-delivery.js +20 -0
- package/dist/boot/reapers.d.ts +3 -0
- package/dist/boot/reapers.js +21 -1
- package/dist/boot/resolve-spec.d.ts +3 -0
- package/dist/boot/resolve-spec.js +60 -81
- package/dist/boot/runner-deps.js +1 -0
- package/dist/boot/session-faces.d.ts +1 -0
- package/dist/boot/session-faces.js +4 -2
- package/dist/boot/stage-02-web-admin-pull.js +4 -1
- package/dist/boot/stage-06-runners.d.ts +2 -0
- package/dist/boot/stage-06-runners.js +6 -3
- package/dist/boot/stage-07-capability-layer.d.ts +2 -0
- package/dist/boot/stage-07-capability-layer.js +24 -3
- package/dist/boot/stage-08-reapers.d.ts +2 -0
- package/dist/boot/stage-08-reapers.js +2 -2
- package/dist/boot/stage-09-leader.d.ts +3 -0
- package/dist/boot/stage-10-http-server.d.ts +3 -0
- package/dist/boot/stage-10-http-server.js +5 -6
- package/dist/boot/stores.js +2 -2
- package/dist/boot/web-admin.d.ts +4 -0
- package/dist/boot/web-admin.js +151 -63
- package/dist/boot/workflow-orchestration.d.ts +2 -0
- package/dist/boot/workflow-orchestration.js +2 -1
- package/dist/brain.js +8 -3
- package/dist/breaker-key.d.ts +6 -0
- package/dist/breaker-key.js +29 -0
- package/dist/caller-text-echo.d.ts +9 -6
- package/dist/caller-text-echo.js +8 -11
- package/dist/capabilities/center-plugins.d.ts +7 -0
- package/dist/capabilities/center-plugins.js +1 -1
- package/dist/capabilities/composite-members.d.ts +1 -1
- package/dist/capabilities/composite-members.js +1 -1
- package/dist/capabilities/execution-lane.js +2 -2
- package/dist/capabilities/hands-lane.d.ts +21 -0
- package/dist/capabilities/hands-lane.js +10 -0
- package/dist/capabilities/mcp-probe.d.ts +36 -4
- package/dist/capabilities/mcp-probe.js +27 -4
- package/dist/capabilities/scenarios.d.ts +63 -7
- package/dist/capabilities/scenarios.js +39 -7
- package/dist/capability-facts.d.ts +34 -4
- package/dist/capability-facts.js +28 -2
- package/dist/center-config-tier.d.ts +69 -0
- package/dist/center-config-tier.js +42 -0
- package/dist/checkpoint-identity.d.ts +16 -0
- package/dist/checkpoint-identity.js +19 -0
- package/dist/config-catalog.d.ts +17 -10
- package/dist/config-catalog.js +43 -28
- package/dist/config-d-migration.d.ts +3 -1
- package/dist/config-d-migration.js +2 -2
- package/dist/config-dir-trust.d.ts +114 -0
- package/dist/config-dir-trust.js +388 -0
- package/dist/config-invariants.d.ts +18 -5
- package/dist/config-invariants.js +35 -3
- package/dist/config-provider.d.ts +6 -1
- package/dist/config-provider.js +6 -2
- package/dist/config-types.d.ts +71 -14
- package/dist/config-types.js +8 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.js +121 -59
- package/dist/delegated-session-owner.d.ts +185 -0
- package/dist/delegated-session-owner.js +119 -0
- package/dist/device-protocol.d.ts +5 -3
- package/dist/device-protocol.js +1 -1
- package/dist/device-ws-hub.js +21 -2
- package/dist/device-ws-protocol.d.ts +70 -6
- package/dist/device-ws-protocol.js +50 -23
- package/dist/elicitation.js +3 -2
- package/dist/entry-problems.d.ts +34 -0
- package/dist/entry-problems.js +14 -0
- package/dist/execution-lane-caps.d.ts +49 -10
- package/dist/execution-lane-caps.js +43 -4
- package/dist/field-conflict.d.ts +43 -0
- package/dist/field-conflict.js +20 -0
- package/dist/fleet/fleet-bus.d.ts +80 -6
- package/dist/fleet/fleet-bus.js +41 -9
- package/dist/hooks/classic-stations.d.ts +10 -5
- package/dist/hooks/classic-stations.js +4 -4
- package/dist/hooks/command-spawn.d.ts +57 -0
- package/dist/hooks/command-spawn.js +139 -0
- package/dist/hooks/hook-llm.js +2 -2
- package/dist/hooks/hook-runner.d.ts +127 -25
- package/dist/hooks/hook-runner.js +668 -287
- package/dist/hooks/hook-source.d.ts +44 -0
- package/dist/hooks/hook-source.js +40 -0
- package/dist/http/active-run-conflict.d.ts +5 -13
- package/dist/http/active-run-conflict.js +17 -27
- package/dist/http/admission.js +103 -60
- package/dist/http/approval-sweeps.js +55 -18
- package/dist/http/caller-trust.d.ts +77 -0
- package/dist/http/caller-trust.js +143 -0
- package/dist/http/checkpoint-ctx.d.ts +16 -16
- package/dist/http/checkpoint-ctx.js +13 -10
- package/dist/http/claimed-run.d.ts +4 -3
- package/dist/http/device-placement.d.ts +2 -4
- package/dist/http/device-placement.js +2 -1
- package/dist/http/dispatch.js +10 -4
- package/dist/http/durable-run-leg.d.ts +4 -32
- package/dist/http/durable-run-leg.js +34 -10
- package/dist/http/owner-access.d.ts +56 -0
- package/dist/http/owner-access.js +42 -0
- package/dist/http/principal-gate.d.ts +48 -23
- package/dist/http/principal-gate.js +39 -12
- package/dist/http/readiness.d.ts +11 -5
- package/dist/http/readiness.js +10 -3
- package/dist/http/request-guards.d.ts +16 -23
- package/dist/http/request-guards.js +30 -15
- package/dist/http/resume-ctx-read.d.ts +2 -5
- package/dist/http/resume-ctx-read.js +7 -4
- package/dist/http/resume-legs.d.ts +3 -4
- package/dist/http/resume-legs.js +126 -69
- package/dist/http/retired-service-deps.d.ts +43 -0
- package/dist/http/retired-service-deps.js +18 -0
- package/dist/http/route-ctx.d.ts +44 -28
- package/dist/http/route-ctx.js +4 -0
- package/dist/http/route-table.js +2 -0
- package/dist/http/routes/a2a-serve.js +3 -4
- package/dist/http/routes/admin-config-refresh.js +1 -1
- package/dist/http/routes/admin-drain.js +1 -1
- package/dist/http/routes/admin-memory-optout.js +5 -1
- package/dist/http/routes/adoption.js +2 -9
- package/dist/http/routes/approvals-assistant.js +49 -48
- package/dist/http/routes/background.js +3 -2
- package/dist/http/routes/capabilities.js +20 -4
- package/dist/http/routes/config-catalog.d.ts +3 -3
- package/dist/http/routes/config-catalog.js +1 -1
- package/dist/http/routes/devices.js +3 -17
- package/dist/http/routes/diagnostics.js +5 -1
- package/dist/http/routes/images.js +6 -7
- package/dist/http/routes/leader.js +1 -8
- package/dist/http/routes/mcp-reconnect.d.ts +1 -1
- package/dist/http/routes/mcp-reconnect.js +3 -2
- package/dist/http/routes/memory-bundle.js +1 -1
- package/dist/http/routes/memory-compliance.js +1 -1
- package/dist/http/routes/memory-consolidation.js +1 -1
- package/dist/http/routes/memory-origin.js +1 -1
- package/dist/http/routes/memory-policy.d.ts +1 -1
- package/dist/http/routes/memory-policy.js +3 -2
- package/dist/http/routes/notify-wake.js +8 -21
- package/dist/http/routes/observability.js +2 -2
- package/dist/http/routes/principal-inbox.d.ts +39 -0
- package/dist/http/routes/principal-inbox.js +76 -0
- package/dist/http/routes/retention-ops.js +2 -9
- package/dist/http/routes/rules.js +5 -18
- package/dist/http/routes/runs.d.ts +5 -0
- package/dist/http/routes/runs.js +33 -106
- package/dist/http/routes/session-sync.js +15 -28
- package/dist/http/routes/sessions.js +30 -40
- package/dist/http/routes/side-query.js +6 -4
- package/dist/http/routes/tasks.js +50 -14
- package/dist/http/routes/workflows.d.ts +351 -0
- package/dist/http/routes/workflows.js +153 -119
- package/dist/http/send.d.ts +24 -3
- package/dist/http/send.js +14 -2
- package/dist/http/server.d.ts +17 -18
- package/dist/http/server.js +15 -13
- package/dist/http/stored-body-replay.js +17 -4
- package/dist/http/submit-ctx.js +4 -3
- package/dist/http/submit-replay.d.ts +4 -3
- package/dist/http/submit-replay.js +5 -4
- package/dist/http/wire-types.d.ts +10 -7
- package/dist/index.d.ts +1 -1
- package/dist/index.js +0 -1
- package/dist/lane-home-probe.d.ts +78 -9
- package/dist/lane-home-probe.js +78 -12
- package/dist/leader/endpoint.d.ts +4 -1
- package/dist/leader/endpoint.js +11 -10
- package/dist/limit-refusal.d.ts +17 -5
- package/dist/limit-refusal.js +4 -1
- package/dist/mcp-assertion-header.d.ts +31 -10
- package/dist/mcp-assertion-header.js +10 -3
- package/dist/mcp-tool-faces.js +1 -3
- package/dist/memory-project-layer.d.ts +37 -0
- package/dist/memory-project-layer.js +46 -0
- package/dist/memory-scope.d.ts +23 -16
- package/dist/memory-scope.js +24 -8
- package/dist/memory-sync-client.d.ts +27 -13
- package/dist/memory-sync-client.js +107 -18
- package/dist/model-entry-refusal.d.ts +9 -1
- package/dist/model-entry-refusal.js +6 -1
- package/dist/model-plane-face.d.ts +51 -0
- package/dist/model-plane-face.js +24 -0
- package/dist/model-provider.d.ts +5 -0
- package/dist/model-provider.js +4 -2
- package/dist/model-route-endpoint.d.ts +8 -11
- package/dist/model-route-endpoint.js +4 -7
- package/dist/model-route-env.d.ts +22 -0
- package/dist/model-route-env.js +2 -0
- package/dist/model-route-gap.d.ts +60 -30
- package/dist/model-route-gap.js +21 -15
- package/dist/observability/corrupt-read-seat.d.ts +7 -0
- package/dist/observability/corrupt-read-seat.js +9 -0
- package/dist/observability/err-text.d.ts +6 -0
- package/dist/observability/err-text.js +18 -4
- package/dist/observability/fail-open.d.ts +35 -9
- package/dist/observability/fail-open.js +35 -9
- package/dist/observability/metrics.js +1 -0
- package/dist/observability/prompt-manifest.d.ts +3 -17
- package/dist/observability/prompt-manifest.js +45 -42
- package/dist/observability/tool-trace.js +9 -9
- package/dist/operator-ask.d.ts +10 -0
- package/dist/operator-ask.js +3 -0
- package/dist/orchestration/workflow-agent-session-index.d.ts +12 -12
- package/dist/orchestration/workflow-agent-session-index.js +9 -13
- package/dist/orchestration/workflow-completion-inbox.d.ts +42 -15
- package/dist/orchestration/workflow-completion-inbox.js +13 -0
- package/dist/orchestration/workflow-notify-journal.d.ts +13 -32
- package/dist/orchestration/workflow-notify-journal.js +27 -34
- package/dist/orchestration/workflow-park-decision.d.ts +89 -0
- package/dist/orchestration/workflow-park-decision.js +118 -0
- package/dist/org-delivery-gate.d.ts +81 -0
- package/dist/org-delivery-gate.js +59 -0
- package/dist/panel-tool-names.d.ts +23 -0
- package/dist/panel-tool-names.js +8 -0
- package/dist/parked-decide.d.ts +39 -6
- package/dist/parked-decide.js +98 -51
- package/dist/parked-revive-surface.d.ts +9 -2
- package/dist/parked-revive-surface.js +11 -8
- package/dist/permission-rule-list.d.ts +1 -1
- package/dist/permission-rule-list.js +2 -2
- package/dist/plugins/approval-ask-store-file.d.ts +16 -1
- package/dist/plugins/approval-ask-store-file.js +21 -0
- package/dist/plugins/approval-ask-store-memory.d.ts +18 -1
- package/dist/plugins/approval-ask-store-memory.js +34 -2
- package/dist/plugins/approval-ask-store-sql.d.ts +25 -0
- package/dist/plugins/approval-ask-store-sql.js +37 -1
- package/dist/plugins/blob-backend.d.ts +38 -25
- package/dist/plugins/blob-backend.js +29 -19
- package/dist/plugins/breaker-state-sql.d.ts +2 -2
- package/dist/plugins/breaker-state-sql.js +4 -4
- package/dist/plugins/caching-session-store.d.ts +3 -0
- package/dist/plugins/caching-session-store.js +3 -0
- package/dist/plugins/checkpoint-store-sql.d.ts +14 -0
- package/dist/plugins/checkpoint-store-sql.js +20 -2
- package/dist/plugins/file-history-store-sql.d.ts +5 -2
- package/dist/plugins/file-history-store-sql.js +3 -1
- package/dist/plugins/file-run-store.d.ts +5 -13
- package/dist/plugins/file-run-store.js +9 -0
- package/dist/plugins/fork-routing-session-store.d.ts +9 -1
- package/dist/plugins/fork-routing-session-store.js +12 -1
- package/dist/plugins/host-platform.d.ts +2 -0
- package/dist/plugins/host-platform.js +2 -1
- package/dist/plugins/local-checkpoint-store.d.ts +2 -0
- package/dist/plugins/local-checkpoint-store.js +6 -1
- package/dist/plugins/local-session-store.d.ts +1 -1
- package/dist/plugins/local-session-window.d.ts +39 -0
- package/dist/plugins/local-session-window.js +54 -0
- package/dist/plugins/mailbox-recipient-lifecycle.d.ts +3 -2
- package/dist/plugins/mailbox-store-sql.d.ts +30 -48
- package/dist/plugins/mailbox-store-sql.js +77 -52
- package/dist/plugins/memory-embedder-fingerprint.js +2 -1
- package/dist/plugins/memory-run-store.d.ts +5 -13
- package/dist/plugins/memory-run-store.js +8 -0
- package/dist/plugins/one-time-migrations.d.ts +110 -5
- package/dist/plugins/one-time-migrations.js +320 -8
- package/dist/plugins/org-delivery-quota-store.d.ts +123 -0
- package/dist/plugins/org-delivery-quota-store.js +228 -0
- package/dist/plugins/pg-pool.js +39 -7
- package/dist/plugins/pg-session-storage.d.ts +17 -4
- package/dist/plugins/pg-session-storage.js +29 -6
- package/dist/plugins/remote-env-adb.d.ts +6 -12
- package/dist/plugins/remote-env-adb.js +12 -2
- package/dist/plugins/remote-env-k8s.d.ts +8 -12
- package/dist/plugins/remote-env-k8s.js +23 -5
- package/dist/plugins/remote-env-local-docker.d.ts +10 -15
- package/dist/plugins/remote-env-local-docker.js +12 -9
- package/dist/plugins/remote-env-ssh.d.ts +10 -16
- package/dist/plugins/remote-env-ssh.js +17 -11
- package/dist/plugins/run-store-sql.d.ts +16 -14
- package/dist/plugins/run-store-sql.js +22 -2
- package/dist/plugins/schema-indexes.js +2 -0
- package/dist/plugins/send-user-file.js +2 -2
- package/dist/plugins/session-epoch-anchor.d.ts +32 -6
- package/dist/plugins/session-epoch-anchor.js +2 -3
- package/dist/plugins/session-store.d.ts +18 -8
- package/dist/plugins/session-store.js +15 -4
- package/dist/plugins/sql-driver.d.ts +74 -11
- package/dist/plugins/sql-driver.js +210 -12
- package/dist/plugins/sql-errors.d.ts +23 -0
- package/dist/plugins/sql-errors.js +21 -0
- package/dist/plugins/store-backend.d.ts +36 -1
- package/dist/plugins/store-backend.js +40 -14
- package/dist/plugins/store-contracts.d.ts +42 -0
- package/dist/plugins/store-contracts.js +1 -0
- package/dist/plugins/tidb-pool.d.ts +6 -1
- package/dist/plugins/tidb-pool.js +44 -10
- package/dist/plugins/tidb-session-storage.d.ts +3 -2
- package/dist/plugins/tidb-session-storage.js +2 -2
- package/dist/plugins/tidb-session-store.d.ts +24 -4
- package/dist/plugins/tidb-session-store.js +28 -4
- package/dist/plugins/workflow-journal-store-sql.d.ts +73 -19
- package/dist/plugins/workflow-journal-store-sql.js +19 -6
- package/dist/plugins/workflow-run-store-sql.d.ts +30 -8
- package/dist/plugins/workflow-run-store-sql.js +50 -9
- package/dist/posture-source.d.ts +18 -10
- package/dist/posture-source.js +4 -1
- package/dist/project-identity.d.ts +45 -6
- package/dist/project-identity.js +162 -8
- package/dist/project-layer-key.d.ts +28 -0
- package/dist/project-layer-key.js +29 -0
- package/dist/question.js +3 -2
- package/dist/read-deny-entry.d.ts +25 -0
- package/dist/read-deny-entry.js +12 -0
- package/dist/read-face-posture.d.ts +37 -11
- package/dist/read-face-posture.js +32 -3
- package/dist/request-key-closure.d.ts +7 -0
- package/dist/request-key-closure.js +9 -1
- package/dist/request-value-closure.d.ts +5 -0
- package/dist/request-value-closure.js +11 -3
- package/dist/rule-entry-list.d.ts +26 -2
- package/dist/rule-entry-list.js +72 -12
- package/dist/rules-consent.js +3 -4
- package/dist/run-acceptance.d.ts +19 -3
- package/dist/run-acceptance.js +13 -1
- package/dist/run-local.js +36 -6
- package/dist/runs.d.ts +10 -9
- package/dist/runs.js +21 -3
- package/dist/runtime-caps-resolver.d.ts +16 -6
- package/dist/runtime-caps-resolver.js +18 -5
- package/dist/sandbox-pkg-source.d.ts +19 -1
- package/dist/sandbox-pkg-source.js +29 -7
- package/dist/security.d.ts +87 -9
- package/dist/security.js +52 -9
- package/dist/session-error-wire.d.ts +19 -2
- package/dist/session-error-wire.js +5 -1
- package/dist/session-titled-frame.d.ts +33 -0
- package/dist/session-titled-frame.js +4 -0
- package/dist/session-titler.d.ts +9 -1
- package/dist/session-titler.js +15 -4
- package/dist/spec-fields.js +21 -2
- package/dist/sql-engine-posture.d.ts +3 -1
- package/dist/task-cwd.d.ts +1 -1
- package/dist/task-mcp.d.ts +3 -3
- package/dist/task-mcp.js +7 -66
- package/dist/task-settings.d.ts +89 -88
- package/dist/task-settings.js +71 -63
- package/dist/text-bidi.d.ts +0 -4
- package/dist/text-bidi.js +1 -3
- package/dist/tighten-only-seats.d.ts +150 -0
- package/dist/tighten-only-seats.js +196 -0
- package/dist/tool-approval.d.ts +303 -87
- package/dist/tool-approval.js +623 -239
- package/dist/trace/core-keyset-guard.d.ts +104 -22
- package/dist/trace/exit-seat.d.ts +28 -0
- package/dist/trace/exit-seat.js +76 -0
- package/dist/trace/ledger-events.d.ts +3 -2
- package/dist/trace/project.d.ts +80 -12
- package/dist/trace/project.js +41 -28
- package/dist/trace/projection-table.d.ts +100 -0
- package/dist/trace/projection-table.js +130 -0
- package/dist/trace/redact.d.ts +54 -0
- package/dist/trace/redact.js +778 -152
- package/dist/trace/self-minted-wire.d.ts +345 -1
- package/dist/trace/self-minted-wire.js +117 -1
- package/dist/trace/wire-projection-faces.d.ts +298 -2
- package/dist/trace/wire-projection-faces.js +154 -13
- package/dist/url-refusal.js +2 -0
- package/dist/web-admin-client/apply-effective.d.ts +12 -0
- package/dist/web-admin-client/apply-effective.js +56 -5
- package/dist/web-admin-client/facade.d.ts +1 -1
- package/dist/web-admin-client/facade.js +1 -1
- package/dist/web-admin-client/read-face.js +5 -9
- package/dist/web-admin-client/skills-mcp.js +4 -5
- package/docs/DEVICE-EXECUTOR-PROTOCOL.md +57 -9
- package/package.json +7 -3
package/dist/tool-approval.d.ts
CHANGED
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
* — same posture as question/elicit. The frame's model-authored surfaces (message + args) are secret-REDACTED
|
|
51
51
|
* before they are streamed; the SIZE bound is per-surface: args ride a byte cap (`MAX_APPROVAL_ARGS_BYTES`,
|
|
52
52
|
* over-cap ⇒ `argsOmitted`), while the legacy frame's `message` is redacted but NOT length-capped — the char
|
|
53
|
-
* cap (`MAX_MESSAGE`, approval-card.ts `
|
|
53
|
+
* cap (`MAX_MESSAGE`, approval-card.ts `capText`) lives on the card/`approval_request` projection only (same
|
|
54
54
|
* redact-at-write contract as question; the args are shown to a human,
|
|
55
55
|
* never re-fed to a model). No throttle (unlike question): an approval breach-default would be a DENY (task failure),
|
|
56
56
|
* and asks are turn-blocking by construction — the TTL bounds the human-side exposure instead.
|
|
@@ -60,7 +60,7 @@ import { type ApprovalDecidedBy, type HostSettledBy, type RetiredDecisionKeyFact
|
|
|
60
60
|
import type { IncomingMessage } from "node:http";
|
|
61
61
|
import { type AskClass, type AskRequest, type AskOutcome, type PermissionResult, type CheckpointGate, type PendingAction, type PersistedRuleMandate, type ReadRootGrantCandidate, type RuleOffer, type AutoModeFallbackCause, type BoundGrantAbsence, type BoundSkillGrants, type ToolApprovalCard } from "@sema-agent/core";
|
|
62
62
|
import { type CardRulePersisted, type RuleConsentLane } from "./rules-consent.js";
|
|
63
|
-
import { type AllowRuleShadowProjection, type DenialLimitFallback, type RuleOffersAbsence, type ApprovalRequestFrame, type ApprovalRevokeFrame, type RuleEvidenceProjection } from "./approval-card.js";
|
|
63
|
+
import { type AllowRuleShadowProjection, type DenialLimitFallback, type RuleOffersAbsence, type ApprovalRequestFrame, type ApprovalRevokeFrame, type ApprovalCardLegFrame, type ApprovalCompleteFrame, type RuleEvidenceProjection } from "./approval-card.js";
|
|
64
64
|
import { type ApprovalAskStore, type AskRow } from "./plugins/approval-ask-store-sql.js";
|
|
65
65
|
import type { ApprovalAskAuditSink } from "./approval-ask-audit-store.js";
|
|
66
66
|
import { type AskRowEndingCause, type SettleCause, type SettleOutcome } from "./approval-deny-reasons.js";
|
|
@@ -83,6 +83,17 @@ export declare function isApprovalGateKind(k: string | undefined): k is Approval
|
|
|
83
83
|
export declare function denySweepOwns(gate: ParkedGateFace | undefined): boolean;
|
|
84
84
|
/** 两方言同形的 SQL IN 片段(值为闭集常量字面,无注入面)。 */
|
|
85
85
|
export declare const APPROVAL_GATE_KINDS_SQL_IN: string;
|
|
86
|
+
/** {@link ToolApprovalCoordinator.adoptOpenAsks} 的读数(装配点进启动日志)。 */
|
|
87
|
+
interface OpenAskAdoption {
|
|
88
|
+
/** 本次接管进活集合的问数。 */
|
|
89
|
+
readonly adopted: number;
|
|
90
|
+
/** 本副本已有这只问的登记(活登记或先前接管过)而跳过的问数 —— 幂等的那一半。 */
|
|
91
|
+
readonly alreadyLive: number;
|
|
92
|
+
/** 行上卡信封读不出(唯一信封读者不认)而没接管的问数 —— 列不出卡就不列(开流 preamble 跳坏行同判)。 */
|
|
93
|
+
readonly cardUnreadable: number;
|
|
94
|
+
/** 待决行多于 {@link ADOPT_OPEN_ASKS_MAX}:只接管了最先的那么多只。 */
|
|
95
|
+
readonly capped: boolean;
|
|
96
|
+
}
|
|
86
97
|
/**
|
|
87
98
|
* 耐久回决口 `POST /v1/approvals/:sessionId/decide` 的路径串 —— S-1280:迟到回决口 PARKING 臂 202 体的机读指路 `decidePath`。
|
|
88
99
|
* 路由表那一行(`http/routes/approvals-assistant.ts` 的 `approval-decide`)按 pattern 匹配它;两者同形由往返钉守
|
|
@@ -94,12 +105,45 @@ export declare function approvalDecidePath(sessionId: string): string;
|
|
|
94
105
|
* DECIDED/PARKED 已从 404 分流(DECIDED ⇒ 200 回放首决,回执带 `decidedBy`,**不是**成因;PARKED ⇒ 赎回席),残余两类:
|
|
95
106
|
* · 行 `VOID` / `DENIED`(没有人决过它)—— `cause` = **行上记的那个成因词**(问账 `denied_reason` 列;与决断口 410 `gone.ask` 体的 `cause`、审计 settle 行
|
|
96
107
|
* 的 `cause` 同一个词,闭集 {@link SettleCause});行上没写归因(存量行)⇒ 缺席,不替没写的行编一个词;
|
|
97
|
-
* · {@link NOT_PENDING_UNKNOWN_CAUSE} ——
|
|
108
|
+
* · {@link NOT_PENDING_UNKNOWN_CAUSE} —— 无行 / 行不是调用方的 / 行仍在别处活着:换副本或换端点重试才有意义(这个词只属于 404 面,不是结局成因)。
|
|
98
109
|
* 对齐 [ref] 反枚举语义:cause 只在**已过属主门**的面上出,不扩枚举面(属主门不过 = 与未知 id 同形)。
|
|
99
110
|
* **无持久店的部署上恒不带**:那台机器压根没有行可判,编一个 cause 是撒谎(D1 体逐字不变)。
|
|
100
111
|
*/
|
|
101
112
|
export declare const NOT_PENDING_UNKNOWN_CAUSE: "unknown_or_other_replica";
|
|
102
113
|
export type NotPendingCause = AskRowEndingCause | typeof NOT_PENDING_UNKNOWN_CAUSE;
|
|
114
|
+
/**
|
|
115
|
+
* `GET /v1/tool-approvals/:approvalId` 应答体 `state` 的**闭集**(一只 ask 此刻在哪一态;读法与应答口逐条同源):
|
|
116
|
+
* · `pending` —— 本副本上有在等它的活登记(应答口此刻收得下);
|
|
117
|
+
* · `decided` —— 行 `DECIDED`(有人 / 有策略决过;回执三键同晚答回放体);
|
|
118
|
+
* · `parked` —— 行 `PARKING` / `PARKED`(转后台候批;应答口走迟到受理,耐久回决口照收);
|
|
119
|
+
* · `void` —— 行 `DENIED` / `VOID`(没有人决过它,答案无处兑现;`cause` 同晚答 404)。
|
|
120
|
+
*/
|
|
121
|
+
export declare const TOOL_APPROVAL_READ_STATES: readonly ["pending", "decided", "parked", "void"];
|
|
122
|
+
export type ToolApprovalReadState = (typeof TOOL_APPROVAL_READ_STATES)[number];
|
|
123
|
+
/** 行 → 读口的行投影:键名是列表面 {@link LivePendingRow} 的同名子集(一个读者一套键);`frame` = 断连重放的那一只呈卡帧(卡读不出 ⇒ 缺席)。 */
|
|
124
|
+
export interface AskRowReadProjection {
|
|
125
|
+
approvalId: string;
|
|
126
|
+
ts: number;
|
|
127
|
+
expiresAtMs: number;
|
|
128
|
+
sessionId?: string;
|
|
129
|
+
toolName?: string;
|
|
130
|
+
frame?: ApprovalRequestFrame;
|
|
131
|
+
}
|
|
132
|
+
/** `GET /v1/tool-approvals/:approvalId` 的 200 体:列表面同一只行投影 + `state` + 各态附键。 */
|
|
133
|
+
export type ToolApprovalReadBody = ({
|
|
134
|
+
state: "pending";
|
|
135
|
+
} & LivePendingRow) | ({
|
|
136
|
+
state: "decided";
|
|
137
|
+
decision: "allow" | "deny";
|
|
138
|
+
decidedAtMs: number;
|
|
139
|
+
decisionNote?: string;
|
|
140
|
+
} & AskRowReadProjection) | ({
|
|
141
|
+
state: "parked";
|
|
142
|
+
decidePath?: string;
|
|
143
|
+
} & AskRowReadProjection) | ({
|
|
144
|
+
state: "void";
|
|
145
|
+
cause?: AskRowEndingCause;
|
|
146
|
+
} & AskRowReadProjection);
|
|
103
147
|
/**
|
|
104
148
|
* 结算一张卡的**判决** —— 判别联合,逼每个调用点说清「这次等待是怎么结束的」:
|
|
105
149
|
* · `by:"human"` —— 一次**决议**到了(人答,或从问账行读回来的决议,含部署政策拒落成的 `DECIDED` 行,`hostSettledBy` 记它的来源词):`allowed` 说方向;审计 settle 行
|
|
@@ -140,6 +184,9 @@ export type SettleVerdict = {
|
|
|
140
184
|
*
|
|
141
185
|
* 语义边界(禁扩读):它答的是「本副本此刻有没有活体消费者」,**不是**「这条 run 还活着吗」——持有
|
|
142
186
|
* 悬挂 promise 的可能是另一个副本(F4 的轮询腿会在它自己的下一拍续跑)。run 的生死读 run 面。
|
|
187
|
+
*
|
|
188
|
+
* S-247 起**同一个词、同一句语义**也出现在 live 面:审批机起服时从问账接管的登记(没有引擎腿在等)在 `livePending` 行上带它,
|
|
189
|
+
* 在 live 应答口的 200 回执上按同一判据(本副本被唤醒的等待腿数 = 0)带它。一个事实,各面一个读法。
|
|
143
190
|
*/
|
|
144
191
|
export declare const ASK_DECISION_CONSUMER_ABSENT = "absent";
|
|
145
192
|
/**
|
|
@@ -315,7 +362,9 @@ export declare function parkRowStandingAnswerFacts(stored: Extract<PendingAction
|
|
|
315
362
|
deploymentListAsks: boolean): StandingAnswerFacts;
|
|
316
363
|
/** A live approval frame delivered to whoever tails this run's stream. `type` IS the SSE event name (named-event
|
|
317
364
|
* convention, same as question). The shell renders `tool_approval` as the CC three-choice card and dismisses on
|
|
318
|
-
* `tool_approval_complete`.
|
|
365
|
+
* `tool_approval_complete`.
|
|
366
|
+
* 🔴 **旧族**:只投给呈卡协议未上场的腿(一条腿一个帧族,见 {@link ToolApprovalRunContext});呈卡腿上同一次铸定的这只对象仍是
|
|
367
|
+
* 卡外开卡事实的来源(`ApprovalRequestLiveFacts` 取自它)与 `livePending` 行的 `frame`。 */
|
|
319
368
|
export interface ToolApprovalFrame {
|
|
320
369
|
type: "tool_approval" | "tool_approval_complete";
|
|
321
370
|
approvalId: string;
|
|
@@ -684,10 +733,8 @@ export interface ToolApprovalFrame {
|
|
|
684
733
|
* 真才带)——`outcome:"expired"` 一词三义(park / 当场 deny / 无设施 deny,见 outcome 注)里 **park
|
|
685
734
|
* 那一义的显式判别位**:在场 ⇔ **这条 ask 本身**按 park 路由收尾(`parkRouted`,settle 咽喉里置位;
|
|
686
735
|
* [ref] F1/F3:首版读政策口〔unattendedPolicy+askStore 在场〕,对批内被连坐 VOID 的兄弟、取消/断连、
|
|
687
|
-
* D5 fail-open 等非 park 终局全撒谎)
|
|
688
|
-
*
|
|
689
|
-
* 已落 ⇒ 同一把 `approvalId` 仍可打 `respond` 走迟到受理兑现(wire 契约迟到受理段);拒新两形下
|
|
690
|
-
* live 迟到腿如实 404(unknown_or_other_replica),壳按既有协议回落 durable gate([ref] Q3)。
|
|
736
|
+
* D5 fail-open 等非 park 终局全撒谎)。同一把 `approvalId`(= 行的键)仍可打 `respond` 走迟到受理兑现
|
|
737
|
+
* (wire 契约迟到受理段;迟到腿直接读行,任一副本可达)。
|
|
691
738
|
* 壳据此把「卡失效」改渲「已转后台候批」。缺席**禁**读作
|
|
692
739
|
* 「真 deny」:无店部署 / deny 政策 / VOID 兄弟都发不出这个键,缺席只是「无 park 证据」。 */
|
|
693
740
|
parked?: true;
|
|
@@ -720,7 +767,7 @@ export interface ToolApprovalFrame {
|
|
|
720
767
|
* ——两族行形与决议路由不同:本族行的决议口=`POST /v1/tool-approvals/:approvalId/respond`,durable 行
|
|
721
768
|
* =decide 口;数组名即路由判据)。可选位全部「只记真、缺席不编」。 */
|
|
722
769
|
export interface LivePendingRow {
|
|
723
|
-
/** = `respond()` 收的 wire id
|
|
770
|
+
/** = `respond()` / `GET /v1/tool-approvals/:id` 收的 wire id:有行的 ask = 行的键 `askId`,无行的 ask = 登记本地键(见 {@link PendingApproval.approvalId})。 */
|
|
724
771
|
approvalId: string;
|
|
725
772
|
toolName: string;
|
|
726
773
|
/** 登记时刻(ms epoch)。 */
|
|
@@ -772,24 +819,48 @@ export interface LivePendingRow {
|
|
|
772
819
|
* (规则集不因 `suspended` 分叉:有活流的 ask 多带一份它自己那张卡的副本无害)。
|
|
773
820
|
*
|
|
774
821
|
* 缺席 = 老 server(7.86.0 及以前);本服务自 7.87.0 起**恒在场**(条目上是必填格)。恒不铸 `null`。
|
|
822
|
+
*
|
|
823
|
+
* 🔴 **一只 ask 一个帧族(7.133.0 起)**:呈卡族的 ask(有行 —— 呈卡协议上场的 worker)⇒ 呈卡帧 `approval_request`(卡内事实在 `card` 里,
|
|
824
|
+
* 卡外的活面事实在帧顶层);旧族的 ask(无行)⇒ 活卡帧 `tool_approval`。按 `frame.type` 判别。
|
|
825
|
+
*/
|
|
826
|
+
frame?: ToolApprovalFrame | ApprovalRequestFrame;
|
|
827
|
+
/**
|
|
828
|
+
* S-247:**本副本上没有引擎腿在等这只问** —— 与耐久决断口 200 体同名同值同义的那一位({@link ASK_DECISION_CONSUMER_ABSENT})。
|
|
829
|
+
* 在场 ⇔ 这一行是审批机起服时从问账接管的问(前一个进程 / 别的副本铸下、行仍 `STREAM_PENDING`;见 {@link ToolApprovalCoordinator.adoptOpenAsks}):
|
|
830
|
+
* 它照常列得出、照常应答得了(行落 `DECIDED`,应答回执同带这一位),但这一决不会让本副本上任何在跑的东西续跑 —— 续没续跑读 run 面。
|
|
831
|
+
* 只记真:缺席 = 本副本有引擎腿在等它(或老 server)。
|
|
775
832
|
*/
|
|
776
|
-
|
|
833
|
+
consumerState?: typeof ASK_DECISION_CONSUMER_ABSENT;
|
|
777
834
|
}
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
835
|
+
/**
|
|
836
|
+
* 一条执行腿的审批上下文 = 腿的身份三位 + 腿轴 + **恰一个帧族的投递口**。
|
|
837
|
+
*
|
|
838
|
+
* 🔴 **一条腿一个帧族**({@link ApprovalLegFamilyPorts}):呈卡协议在本腿上场(装配点按 `resolveApprovalLeg(...).active` 接
|
|
839
|
+
* `emitCard`)⇒ 本腿上一只 ask 的开卡 / 消卡 / 撤卡只走呈卡族(`approval_request` / `approval_complete` / `approval_revoke`),
|
|
840
|
+
* 旧族帧一帧不发;协议未上场 ⇒ 只走旧族(`tool_approval` / `tool_approval_complete`,经 `emit`)。两族的口在类型上互斥,
|
|
841
|
+
* 「同一只 ask 在同一条腿上发两种开卡帧」不可构造。消费方在 wire 上判别本腿是哪一族:`GET /v1/capabilities` 的 `streamApproval`
|
|
842
|
+
* (与装配点同一只判据 `resolveStreamApprovalGate`,按 worker 求值;为真 ⇒ 本 worker 每条呈卡的腿都是呈卡族)。
|
|
843
|
+
*/
|
|
844
|
+
export type ToolApprovalRunContext = ToolApprovalRunContextBase & ApprovalLegFamilyPorts;
|
|
845
|
+
/** 帧族投递口的二选一(见 {@link ToolApprovalRunContext} 顶注)。 */
|
|
846
|
+
export type ApprovalLegFamilyPorts = LegacyApprovalFamilyPorts | CardApprovalFamilyPorts;
|
|
847
|
+
/** 旧族腿(呈卡协议未上场):开卡 `tool_approval` 与消卡 `tool_approval_complete` 都经 `emit`。 */
|
|
848
|
+
export interface LegacyApprovalFamilyPorts {
|
|
782
849
|
emit: (frame: ToolApprovalFrame) => void | Promise<void>;
|
|
850
|
+
emitCard?: never;
|
|
851
|
+
emitRevoke?: never;
|
|
852
|
+
}
|
|
853
|
+
/** 呈卡族腿(呈卡协议上场):开卡 / 消卡经 `emitCard`,批级撤卡经 `emitRevoke`。 */
|
|
854
|
+
export interface CardApprovalFamilyPorts {
|
|
855
|
+
emit?: never;
|
|
783
856
|
/**
|
|
784
857
|
* [ref] 车6:**批级撤卡帧**(`approval_revoke`,语义与发射面见 approval-card.ts 的
|
|
785
858
|
* `ApprovalRevokeFrame` 顶注 —— [ref] 起 bg/resume durable 腿的钩子写本腿账本,sync 腿仍 live)
|
|
786
859
|
* 的投递口。
|
|
787
860
|
*
|
|
788
|
-
*
|
|
789
|
-
*
|
|
790
|
-
*
|
|
791
|
-
* 协议**(`approval_request` 族)的一员,消费方是新壳 —— 分口投递是诚实的分层,装配点(车3 3b /
|
|
792
|
-
* 车4 域)可以与 `approval_request` 的发射点**同批**接上。
|
|
861
|
+
* 与 {@link CardApprovalFamilyPorts.emitCard} 分口的理由是**失败语义**不同:开卡帧的投递结果参与「卡送到人手上没有」的判定
|
|
862
|
+
* (零 sink 接下 ⇒ 抛 ⇒ park 路由),撤卡帧是通知、行才是真源(失败由 `emitRevokeTo` 的 catch 如实吞);且 sync 腿的撤卡帧
|
|
863
|
+
* 刻意维持 live 单口(detach 账本撤帧是另一件行为面变更)。
|
|
793
864
|
*
|
|
794
865
|
* 缺席 ⇒ 本连接不收撤卡帧;壳侧的结构补偿恒是重连 preamble 的全量对账基准。
|
|
795
866
|
* (接线现状:[ref] 起三腿全接 —— sync 腿 live 口(`routes/tasks.ts`),bg/resume 两腿 durable
|
|
@@ -797,19 +868,22 @@ export interface ToolApprovalRunContext {
|
|
|
797
868
|
*/
|
|
798
869
|
emitRevoke?: (frame: ApprovalRevokeFrame) => void | Promise<void>;
|
|
799
870
|
/**
|
|
800
|
-
*
|
|
871
|
+
* 呈卡族的**单卡帧**投递口:开卡帧(`approval_request`,[ref] §3.1)与消卡帧(`approval_complete`)。
|
|
801
872
|
*
|
|
802
|
-
*
|
|
803
|
-
*
|
|
804
|
-
*
|
|
805
|
-
* 还不认识的帧形。设计稿 §4.3(a)「新帧同走 `emitApproval`、不新增出口」讲的是**投递面**(同一条 SSE /
|
|
806
|
-
* 同一条 durable tail),不是同一个 TS 字段:三条装配腿都把本钩子接到与 `emit` **同一个**写出口上,
|
|
807
|
-
* 于是 wire 上确实是一条面、两种帧。
|
|
873
|
+
* 三条装配腿都把它接到本腿的投递面(sync 腿 live SSE + detach 车道账本,bg / resume 腿本腿账本;双 sink 的成败判定在唯一
|
|
874
|
+
* 属主 `createApprovalCardEmitter`)—— 卡帧在哪,消卡帧就在哪。开卡帧只在 `askId` **确认落盘**时铸(设计稿 §2.2(b) 硬条款一:
|
|
875
|
+
* 无持久身份不发帧);本腿没有旧族兜底 ⇒ 身份没落盘的 ask 在呈卡腿上**呈不出卡**,按无人可答收场(协调器 `askBroadcast`)。
|
|
808
876
|
*
|
|
809
|
-
*
|
|
810
|
-
* (
|
|
877
|
+
* 第二参 `registration` = 协调器这一次**登记**的本地 id(每次注册各一个,同一只 ask 的重复登记各不相同):同一次登记的开卡帧与消卡帧
|
|
878
|
+
* 带同一个值,投递口据它把开与合配对(帧上的 askId / approvalId 在重复登记之间相同,配不了对)。它不上 wire。
|
|
811
879
|
*/
|
|
812
|
-
emitCard
|
|
880
|
+
emitCard: (frame: ApprovalCardLegFrame, registration: string) => void | Promise<void>;
|
|
881
|
+
}
|
|
882
|
+
/** 两族共有的腿身份与腿轴。 */
|
|
883
|
+
interface ToolApprovalRunContextBase {
|
|
884
|
+
taskId: string;
|
|
885
|
+
sessionId?: string;
|
|
886
|
+
owner: string | null;
|
|
813
887
|
abortSignal?: AbortSignal;
|
|
814
888
|
/** [ref]([ref] §3.1 askId 派生的腿轴;车3 刀 3a 换轴:原 `leg?: number` → `legKey?: string`)。
|
|
815
889
|
* = `sha256(resume checkpoint token)` 的 hex,**首腿缺席折空串**(空串是首腿的真值,不是「未知」)。
|
|
@@ -895,9 +969,20 @@ export declare const PERSIST_RULE_BATCH_EXCLUSIVE_ERROR = "persistRule.batchOffe
|
|
|
895
969
|
/** S-720(core 7.32.0 #1093)—— `readRootGrant` 只随 `decision:"allow"`(CC 卡的第三选项「Yes, and add directory」= 放行这一次
|
|
896
970
|
* + 加目录;`allow_session` 不是那一个选项,`deny` 上它没有意义)。裁决之前响亮拒,不静默丢。 */
|
|
897
971
|
export declare const READ_ROOT_GRANT_ALLOW_ONLY = "readRootGrant is only meaningful with decision \"allow\" \u2014 it is the card's \"Yes, and add directory\" answer (allow this call and add the card's readRootCandidate.dir to this run's read directories)";
|
|
972
|
+
/**
|
|
973
|
+
* S-765:这台部署不受理读根授权时,带 `readRootGrant` 的应答的拒句。受理与否是**部署姿态**(能力事实 `readRootGrant`,位 `approvalReadRootGrant`;
|
|
974
|
+
* 判据的唯一属主在 `capability-facts.ts`,回决路由把它读来交给 {@link ToolApprovalCoordinator.respond}):不受理 ⇒ 裁决**之前**响亮 400,
|
|
975
|
+
* 这只 ask 没被结算,同一张卡不带该键的 `allow` 照常成。不静默丢键 —— 壳以为加上了目录而引擎只看到一次普通放行,是 S-720 修过的那一种病。
|
|
976
|
+
*/
|
|
977
|
+
export declare const READ_ROOT_GRANT_NOT_ACCEPTED = "readRootGrant is not accepted on this deployment \u2014 a read-directory grant is honored only on a single-user host-lane deployment (GET /v1/capabilities approvalReadRootGrant is false here); answer with plain decision \"allow\" instead";
|
|
898
978
|
/** S-720:`readRootGrant` 的形 —— 卡上 `readRootCandidate.dir` 的原串(非空,≤ core `READ_ROOT_CANDIDATE_DIR_MAX`;超限整只拒,不截:截过的目录是另一个目录)。 */
|
|
899
979
|
export declare const READ_ROOT_GRANT_SHAPE = "readRootGrant must be the card's readRootCandidate.dir sent back byte for byte \u2014 a non-empty string of at most 1024 characters";
|
|
900
980
|
export declare const PERSIST_RULE_SCOPE_REFUSED = "this endpoint does not accept a rule scope \u2014 the server mints it from where the approval happened (send neither `scope` nor `persistRule.scope`)";
|
|
981
|
+
/** S-765:`respond()` 要的**部署事实**(由回决路由从能力事实交进;协调器不读 config,也不自判姿态)。 */
|
|
982
|
+
export interface ToolApprovalRespondDeployment {
|
|
983
|
+
/** 这台部署受理不受理应答体里的 `readRootGrant` —— 能力事实 `readRootGrant` 的 `.available`(位 `approvalReadRootGrant` 的同一个值)。 */
|
|
984
|
+
readonly readRootGrantAccepted: boolean;
|
|
985
|
+
}
|
|
901
986
|
/** {@link parseToolApprovalResponse} 的成功分支形(`respond()` 拆分出的私有收尾方法复用,避免裸内联匿名类型重复三处)。 */
|
|
902
987
|
type ParsedToolApproval = {
|
|
903
988
|
ok: true;
|
|
@@ -1024,6 +1109,19 @@ export interface StreamApprovalGateInput {
|
|
|
1024
1109
|
parkFacility: boolean;
|
|
1025
1110
|
}
|
|
1026
1111
|
export declare function resolveStreamApprovalGate(input: StreamApprovalGateInput): StreamApprovalGate;
|
|
1112
|
+
/**
|
|
1113
|
+
* 审批开卡帧的**帧族词表**(闭集)—— wire 上一只 ask 的开卡帧可能属于的族:
|
|
1114
|
+
* · `tool_approval`:旧族(活卡帧 `tool_approval` / 消卡帧 `tool_approval_complete`);
|
|
1115
|
+
* · `approval_request`:呈卡族(开卡帧 `approval_request` / 消卡帧 `approval_complete` / 批级撤卡帧 `approval_revoke`)。
|
|
1116
|
+
*
|
|
1117
|
+
* 一条腿选哪个族只由上面 {@link resolveStreamApprovalGate} 的 `active` 定(为真 ⇒ 接呈卡族的口 `emitCard` / `emitRevoke`;为假 ⇒ 只接旧族的口 `emit`,
|
|
1118
|
+
* 见 {@link ToolApprovalRunContext});`GET /v1/capabilities` 的 `approvalFrameFamilies` 把**同一份**判据结果(能力事实 `streamApproval` 的那一次求值)
|
|
1119
|
+
* 译成本词表里的词(`capability-facts.ts` 的 `approvalFrameFamilies`,对判据拒因的穷举 switch:拒因多一个 ⇒ 编译红)。
|
|
1120
|
+
* 腿选口的规则与能力位的映射是同一条,由 `test/stream-approval-on-e2e.test.ts` 在同一台 worker 上拿真腿发出的开卡帧族对拍能力位,不靠注释互相提醒。
|
|
1121
|
+
* 词表只有这一份(元组即类型);加一族而没有逐处跟进 ⇒ `test/capability-facts.test.ts` 的 `satisfies Record<ApprovalFrameFamily, true>` 编译红。
|
|
1122
|
+
*/
|
|
1123
|
+
export declare const APPROVAL_FRAME_FAMILIES: readonly ["tool_approval", "approval_request"];
|
|
1124
|
+
export type ApprovalFrameFamily = (typeof APPROVAL_FRAME_FAMILIES)[number];
|
|
1027
1125
|
/**
|
|
1028
1126
|
* [ref] 车3 刀 3b —— **一条执行腿的审批装配裁定**(sync / bg / resume **三腿共用**)。
|
|
1029
1127
|
*
|
|
@@ -1073,25 +1171,31 @@ export interface ApprovalLegAssembly {
|
|
|
1073
1171
|
legDeadlineMonotonic?: number;
|
|
1074
1172
|
}
|
|
1075
1173
|
/**
|
|
1076
|
-
* [ref] 车3 刀 3b(codex 交叉复审 round2 R2-1,2026-08-06 真 finding)——
|
|
1174
|
+
* [ref] 车3 刀 3b(codex 交叉复审 round2 R2-1,2026-08-06 真 finding)—— 呈卡腿的**双 sink 投递口**(开卡帧 + 消卡帧)。
|
|
1175
|
+
*
|
|
1176
|
+
* 🔴 为什么必须收成一个有属主的工厂:「呈卡帧送达」决定「卡到底有没有送到人手上」(见 `emitOne` 顶注;S-1683 起呈卡腿只有这一族)。
|
|
1177
|
+
* sync 腿原来那个内联闭包把两个 sink 的失败都吞掉、然后**正常返回** —— 于是「账本写失败 ∧ socket 已死」这种**真的一路都没送到**的
|
|
1178
|
+
* 情形被上报成成功,`anySucceeded` 因此压住了 park 路由。诚实的形只有一个:**至少一个 sink 真的接下了才算送达**,一个都没接下就抛 ——
|
|
1179
|
+
* 调用点(`emitOne`)的 catch 会把它如实记成没送到。
|
|
1077
1180
|
*
|
|
1078
|
-
* 🔴
|
|
1079
|
-
*
|
|
1080
|
-
*
|
|
1081
|
-
*
|
|
1082
|
-
*
|
|
1181
|
+
* 🔴 **两只 sink 各自推进、各自配对**(S-1683 codex 一轮 F1 / F2,红先钉在 `test/approval-leg-frame-family.test.ts`):
|
|
1182
|
+
* · 开卡帧同时交两只 sink,**任一只接下即算送达**(不按序串行 —— 旧族退场后 live 面只剩呈卡族这一条路,一只挂住的账本写不能挡住
|
|
1183
|
+
* 健康的 live 出口;修前先 await 账本再写 live)。两只都失败才抛。
|
|
1184
|
+
* · 消卡帧只交给**接下过本卡开卡帧**的那只 sink,且排在该 sink 自己的开卡写之后(每只 sink 内开在合前;没接下开卡的 sink 不收消卡 =
|
|
1185
|
+
* 不留孤儿消卡行)。没有任何 sink 接下过开卡 ⇒ 不投(调用点本就只对送达过开卡的连接发消卡)。
|
|
1186
|
+
* · 配对按**登记**记(第二参 `registration` = 协调器那一次登记的本地 id;codex 修复验证轮 V1:按 askId 先进先出会让第二次登记的消卡取走
|
|
1187
|
+
* 第一次失败 / 挂起的开卡记录)。开卡全失败的登记当场清账(它不会有消卡);消卡取走即清;挂住的开卡留账到本腿闭包结束。
|
|
1083
1188
|
*
|
|
1084
|
-
*
|
|
1085
|
-
* detach 断连后 live 写被丢弃,而壳换道 events tail 必须还能看到这张未决卡(§4.3(c) 的案A)。
|
|
1189
|
+
* detach 车道的用武之地仍是「live 面已死、账本还在」(§4.3(c) 的案A):那一形里 live 抛、账本接下 ⇒ 送达;消卡只进账本。
|
|
1086
1190
|
*
|
|
1087
|
-
* 命名(CLAUDE.md 工厂命名律):`create*` —— 返回的是**捕获了两个 sink
|
|
1191
|
+
* 命名(CLAUDE.md 工厂命名律):`create*` —— 返回的是**捕获了两个 sink 与配对账的闭包**,不是纯数据。
|
|
1088
1192
|
*/
|
|
1089
1193
|
export declare function createApprovalCardEmitter(sinks: {
|
|
1090
1194
|
/** durable 账本口(bg/resume 腿恒有;sync 腿只有 detach 车道有)。抛 = 这一路没接下。 */
|
|
1091
|
-
appendDurable?: (frame:
|
|
1195
|
+
appendDurable?: (frame: ApprovalCardLegFrame) => Promise<void>;
|
|
1092
1196
|
/** live SSE 口。**已死的流应当由调用方判成缺席或让它抛**,不要写一个静默 no-op —— 那正是本 finding。 */
|
|
1093
|
-
writeLive?: (frame:
|
|
1094
|
-
}): (frame:
|
|
1197
|
+
writeLive?: (frame: ApprovalCardLegFrame) => void | Promise<void>;
|
|
1198
|
+
}): (frame: ApprovalCardLegFrame, registration: string) => Promise<void>;
|
|
1095
1199
|
export declare function resolveApprovalLeg(input: {
|
|
1096
1200
|
/** = `resolveStreamApprovalGate(...).active`(协议在本 worker 上场没有)。 */
|
|
1097
1201
|
streamApprovalOn: boolean;
|
|
@@ -1179,6 +1283,8 @@ export declare class ToolApprovalCoordinator {
|
|
|
1179
1283
|
* askId 下全部本地条目(自己 + 兄弟 + 重复注册),直接调用它们各自的 `settle`,而不是被动等一个永远
|
|
1180
1284
|
* 不会来的本地信号。 */
|
|
1181
1285
|
private readonly pendingByAskId;
|
|
1286
|
+
/** preamble 呈出的卡的消卡订阅(键 = askId;见 {@link watchPresentedCards})。只订本副本上此刻在等的 ask,落定即清 ⇒ 有界于活登记数。 */
|
|
1287
|
+
private readonly presentedCardWatchers;
|
|
1182
1288
|
/** Per-capability session grants — keys = sessionAllowKey(owner, sessionId, category, grant binding) (修2; bounded). */
|
|
1183
1289
|
private readonly allowAllSessions;
|
|
1184
1290
|
/** [ref] HIGH-1(broker)→[ref]四 core 产品裁定「多活集合+广播+首决胜出」:per-(owner, host-session)
|
|
@@ -1215,6 +1321,8 @@ export declare class ToolApprovalCoordinator {
|
|
|
1215
1321
|
* `pollSuspendedDecisions` 里那段:按 askId 记的形会在「上一拍最后碰的那条被结算掉」时塌回队首,
|
|
1216
1322
|
* 构造出永久饥饿的前缀)。只回答「上一拍扫到第几个」,单调推进、按当前长度取模。 */
|
|
1217
1323
|
private suspendedPollOffset;
|
|
1324
|
+
/** S-247:悬挂轮询腿第二层(接管登记)的轮转游标 —— 与 {@link suspendedPollOffset} 同一条理由,两层各一只。 */
|
|
1325
|
+
private adoptedPollOffset;
|
|
1218
1326
|
/** [ref] + codex R3-[critical]:askId → **此刻正带着 `updatedInput` 决它的请求数**(见
|
|
1219
1327
|
* {@link markEditedDecisionInFlight} 顶注)。只在 `decideAsk` 那一次调用期间非空,故天然有界。 */
|
|
1220
1328
|
private readonly editedDecisionsInFlight;
|
|
@@ -1241,13 +1349,13 @@ export declare class ToolApprovalCoordinator {
|
|
|
1241
1349
|
* core 的 global 缺省(= 现行为,恒不更宽;也绝不错铸一个坐标系不对的 root)。装配见 main.ts:
|
|
1242
1350
|
* registry cwd(host lane 显式注册的 launch dir)?? in-process 单用户形的 `process.cwd()`。 */
|
|
1243
1351
|
private readonly ruleScopeRootFor;
|
|
1244
|
-
/** [ref]
|
|
1245
|
-
* {@link
|
|
1246
|
-
private readonly
|
|
1247
|
-
private readonly
|
|
1248
|
-
private readonly
|
|
1249
|
-
/** [ref]:per-principal 子帽(语义与取值理由见 {@link
|
|
1250
|
-
private readonly
|
|
1352
|
+
/** [ref]:停驻行迟到决议的受理回执表(键 = 行的键 `askId`,插入序 = 逐出序)。语义与有界理由见
|
|
1353
|
+
* {@link ParkRedemption} 顶注。 */
|
|
1354
|
+
private readonly parkRedemptions;
|
|
1355
|
+
private readonly parkRedemptionMax;
|
|
1356
|
+
private readonly parkRedemptionTtlMs;
|
|
1357
|
+
/** [ref]:per-principal 子帽(语义与取值理由见 {@link DEFAULT_PARK_REDEMPTION_PER_PRINCIPAL_MAX})。 */
|
|
1358
|
+
private readonly parkRedemptionPerPrincipalMax;
|
|
1251
1359
|
/** [ref]:PARKED 臂的赎回席**取值口**(晚绑 —— 赎回腿要 checkpoint/bg 店与裸 Agent 工具,它们在协调器
|
|
1252
1360
|
* 构造之后才装配;同款 holder 先例 = main.ts 的 `getRunDenySweep`)。取到 undefined ⇒ 该臂逐字回落
|
|
1253
1361
|
* 修前 404,partial 部署安全。 */
|
|
@@ -1293,12 +1401,12 @@ export declare class ToolApprovalCoordinator {
|
|
|
1293
1401
|
ruleScopeRootFor?: (sessionId: string | undefined) => string | undefined;
|
|
1294
1402
|
/** [ref]:PARKED 臂赎回席的**晚绑取值口**(见 {@link ToolApprovalCoordinator.parkedRedeem})。 */
|
|
1295
1403
|
parkedRedeem?: () => ParkedAskRedeem | undefined;
|
|
1296
|
-
/** [ref]
|
|
1404
|
+
/** [ref]:受理回执表两道界(缺省见 {@link DEFAULT_PARK_REDEMPTION_MAX}/{@link DEFAULT_PARK_REDEMPTION_TTL_MS})。
|
|
1297
1405
|
* 不是部署旋钮(不接 env),可注入只为让「有界」这件事被判据观测得到。 */
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
/** [ref]:per-principal 子帽(同上不接 env;生效值恒 `min(本值,
|
|
1301
|
-
|
|
1406
|
+
parkRedemptionMax?: number;
|
|
1407
|
+
parkRedemptionTtlMs?: number;
|
|
1408
|
+
/** [ref]:per-principal 子帽(同上不接 env;生效值恒 `min(本值, parkRedemptionMax)`)。 */
|
|
1409
|
+
parkRedemptionPerPrincipalMax?: number;
|
|
1302
1410
|
/** [ref] (c):local 车道审计 sink(见 {@link ToolApprovalCoordinator.askAudit})。 */
|
|
1303
1411
|
askAudit?: ApprovalAskAuditSink;
|
|
1304
1412
|
/** S-877 候裁 16:耐久会话授权店(见 {@link ToolApprovalCoordinator.sessionGrants})。 */
|
|
@@ -1353,7 +1461,7 @@ export declare class ToolApprovalCoordinator {
|
|
|
1353
1461
|
private unattendedOutcome;
|
|
1354
1462
|
/** 政策**读**口(不是终局铸口)—— 回答「这台部署把无人可答翻成 park 吗」。
|
|
1355
1463
|
*
|
|
1356
|
-
* 🔴 与 {@link unattendedOutcome} 分家是 S-187
|
|
1464
|
+
* 🔴 与 {@link unattendedOutcome} 分家是 S-187 的一半:此前两件事共用一只方法,于是 park 路由判别那次
|
|
1357
1465
|
* 纯粹的**政策查询**(`unattendedOutcome() !== false`)会和同一只 ask 的真终局各记一条遥测 ——
|
|
1358
1466
|
* 「一只 ask 一条线」当场不成立。读口不落日志,铸口落;谁也不兼职。 */
|
|
1359
1467
|
private get unattendedRoutesToPark();
|
|
@@ -1440,7 +1548,7 @@ export declare class ToolApprovalCoordinator {
|
|
|
1440
1548
|
*
|
|
1441
1549
|
* 两个座两种处置,**刻意不同**:
|
|
1442
1550
|
* · `segment` = **纯渲染座**(core 明写「never adjudication input」)⇒ 截长是诚实省略,与
|
|
1443
|
-
* `toolName`/`message` 的 `
|
|
1551
|
+
* `toolName`/`message` 的 `capText` 同待遇,也与耐久腿 `boundedRuleOffers` 的同名处置同形。
|
|
1444
1552
|
* · `rule`/`command` = **兑付等式的左边**(回决 `persistRule.rule` 按文本在引擎重铸的 offer 表里定位)
|
|
1445
1553
|
* ⇒ 截一个字就恒 `rule_not_offered`,所以**绝不截**;真超尺(= core 放宽了自己的 512 或本仓与 core
|
|
1446
1554
|
* 版本不同步)⇒ **整条车道撤回**(返回 `undefined`),与本文件既有的治理撤回 / 漂移撤回逐字同形:
|
|
@@ -1561,8 +1669,8 @@ export declare class ToolApprovalCoordinator {
|
|
|
1561
1669
|
* 读失败 ⇒ 不命中 = fail-closed,人多看一张卡而不是被静默代答)∧ ④ 行上没有与本地 peek 矛盾的出处({@link sessionGrantUncontestedByRow})。
|
|
1562
1670
|
*
|
|
1563
1671
|
* **两个读位、一只店、按问句的作者分**(收车档 ⑩ 16):本席兑现**引擎自装的问**(模式写门 / 形状层 —— core 7.34.0 起它们是引擎
|
|
1564
|
-
* 自己的层、不读任何豁免,折叠 ask 赢 ⇒ 策略层探针对它们恒无效,codex F2
|
|
1565
|
-
*
|
|
1672
|
+
* 自己的层、不读任何豁免,折叠 ask 赢 ⇒ 策略层探针对它们恒无效,codex F2;7.133.0 起 acceptEdits 的写也只有引擎模式门这一问);
|
|
1673
|
+
* **本仓自己的问**(durable 名单门、workflow 问句门)照旧在各自的层上读同一只店「不问」。为什么两处都要:子代经父约束链继承到的问到达祖先审批席时 core
|
|
1566
1674
|
* 盖 `mandated`(`ruleClearanceOf` 的 inheritedUnresolved / ancestorResolved 门),本席依约不退役 —— 只有策略层的「不问」够得着继承链
|
|
1567
1675
|
* (主会话裁定原想退役那三只探针,施工中被 test/parked-decide-leg.test.ts「[候裁② 修]remember 全链行为」证伪,收车档 ⑩ 16-⑤)。
|
|
1568
1676
|
* 本席的两个入口(`askBroadcast` 开头、窗 0 / 无活流身份席 {@link boundUnattendedAsk})都只调这一只。
|
|
@@ -1684,24 +1792,34 @@ export declare class ToolApprovalCoordinator {
|
|
|
1684
1792
|
* 单赢者卫兵,对已落的恒无操作。absent / 编辑在飞没有可分发的真相。
|
|
1685
1793
|
*/
|
|
1686
1794
|
private dispatchClaimTruth;
|
|
1687
|
-
/**
|
|
1688
|
-
*
|
|
1689
|
-
*
|
|
1690
|
-
*
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
*
|
|
1694
|
-
*
|
|
1695
|
-
*
|
|
1696
|
-
*
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
*
|
|
1704
|
-
|
|
1795
|
+
/**
|
|
1796
|
+
* [ref]:为一次**赎回**开一格(单飞句柄的座位)。调用点唯一 = {@link redeemParkedAsk} 开飞之前。在飞的格不受容量帽约束 ——
|
|
1797
|
+
* 它们有界于此刻在飞的赎回请求数,且开飞即受理承诺之前的那一段(逐它会撕正在进行的兑付);容量帽只管落定之后留下的**回执**
|
|
1798
|
+
* ({@link retainParkRedemption})。
|
|
1799
|
+
*/
|
|
1800
|
+
/**
|
|
1801
|
+
* 受理回执表的**准入**半场:在飞的格(赎回腿还没回来)永不被逐 —— 单飞靠它 —— 所以表的两道界对它们只能在开格之前判。
|
|
1802
|
+
* 本 principal 在飞的格已到生效子帽,或全表在飞的格已到全局帽 ⇒ 拒新(`429 limit.rate_exceeded` + `retryAfterSec`,路由据体铸 `Retry-After` 头),
|
|
1803
|
+
* 不开格、不进赎回腿;已在飞的那几只照常落定,之后同一只卡的受理照常。回 `undefined` = 放行。
|
|
1804
|
+
* 两道界与回执半场({@link retainParkRedemption})同一组数:表里每一格都有界 —— 回执靠逐出,在飞的格靠准入。
|
|
1805
|
+
*/
|
|
1806
|
+
private parkRedemptionAdmission;
|
|
1807
|
+
private openParkRedemption;
|
|
1808
|
+
/**
|
|
1809
|
+
* [ref] / [ref]:一次赎回**受理成功**之后,它的回执留不留(容量帽按**插入序**逐出最旧,与 `allowAllSessions` 同款有界纪律)。回 `false` = 容量拒新:
|
|
1810
|
+
* 这一格当场收回(那一次受理照旧生效,只是没有本副本的回执可依 —— 200 丢包后的重试再进赎回腿,终局由它的 CAS 定)。
|
|
1811
|
+
*
|
|
1812
|
+
* 两道界**只数回执**(已受理、不在飞的格;在飞的格永不被逐),且**只看本 principal 的那一段**(理由与两条臂的方向差见
|
|
1813
|
+
* {@link DEFAULT_PARK_REDEMPTION_PER_PRINCIPAL_MAX}),生效子帽对全局帽取小。记账用开格那一刻行上的 owner —— 要的是「压力来自谁」这个近似,
|
|
1814
|
+
* 不是「谁有权决这只 ask」(权威属主门恒按行上当下的 `owner` 复判)。
|
|
1815
|
+
* · 本 principal 的回执数已到子帽 ⇒ 逐本 principal 最旧的那张(过期的优先)—— 量产者自伤;
|
|
1816
|
+
* · 全表回执已到全局帽 ⇒ 先收全表第一张过期回执(清扫是惰性的,若干租户各自远低于子帽却把全局填满时,TTL 过后没人再来查那些旧 id,
|
|
1817
|
+
* 不回收就永远满 —— 回收过期条目不是「挤他人」,是收垃圾);一张过期的都没有 ⇒ 拒新,一格都不挤别人([ref] Q3)。
|
|
1818
|
+
*/
|
|
1819
|
+
private retainParkRedemption;
|
|
1820
|
+
/** [ref]:取受理回执(**惰性清扫**:过期回执读到即删,不另起定时器 —— 这张表只在迟到回决那一刻被读)。**在飞的格不随 TTL 过期**:重叠的请求
|
|
1821
|
+
* (哪怕晚于 TTL 才到)照样等它、回放它的结果,绝不另起第二次赎回。 */
|
|
1822
|
+
private lookupParkRedemption;
|
|
1705
1823
|
/**
|
|
1706
1824
|
* [ref] 车4 §12-E(F29/F30 裁定形):外部回决(车4 端点或本类 respond 腿)**赢下持久 CAS 之后**,把同
|
|
1707
1825
|
* askId 下全部本地悬挂条目按**真实决议**结算——端点已是唯一权威(CAS 已落),本地只是同步终局;查无
|
|
@@ -1804,13 +1922,25 @@ export declare class ToolApprovalCoordinator {
|
|
|
1804
1922
|
/** [ref]:发起本次回决的真实 HTTP 请求。**只**沿 PARKED 臂透传给赎回席(那条腿要它做准入解析与
|
|
1805
1923
|
* 舰队 scope,与 `/decide` 腿同姿势);live 命中路径一个字节都不看它。缺席 = 非 HTTP 调用点
|
|
1806
1924
|
* (测试/内部),赎回席按「无请求」形处置。 */
|
|
1807
|
-
httpReq?: IncomingMessage
|
|
1925
|
+
httpReq?: IncomingMessage,
|
|
1926
|
+
/** S-765:本次回决的**部署事实**(协调器自己不读 config;回决路由从能力事实读来交进)。缺席 ⇒ 按「不受理读根授权」读(失败方向 = 拒)。 */
|
|
1927
|
+
deployment?: ToolApprovalRespondDeployment): {
|
|
1808
1928
|
status: number;
|
|
1809
1929
|
body: unknown;
|
|
1810
1930
|
} | Promise<{
|
|
1811
1931
|
status: number;
|
|
1812
1932
|
body: unknown;
|
|
1813
1933
|
}>;
|
|
1934
|
+
/**
|
|
1935
|
+
* S-247:**接管登记**的应答。接管登记是行的投影(没有引擎腿在等它),所以它的属主门读**行当下的** owner —— 接管时记下的那一格可能已被
|
|
1936
|
+
* `/v1/adoption` 改写(契约:应答口的授权判据取当下的持久事实,收编之后旧属主手里的卡作废)。行仍 `STREAM_PENDING` ⇒ 与活登记同一条应答路
|
|
1937
|
+
* ({@link answerRegistration}:同一把 `decideAsk` CAS);行已有终局(别处答了 / 对账器收了,本副本的轮询还没到)⇒ 按行的真相答(与晚答口同一张表)。
|
|
1938
|
+
*/
|
|
1939
|
+
private respondAdopted;
|
|
1940
|
+
/** 一条已过属主门的登记(活登记或接管登记)的应答 —— 两者同一条路:规则文本前门 → 要人门 → CAS → 兑付。 */
|
|
1941
|
+
private answerRegistration;
|
|
1942
|
+
/** 一次 live 回决**落定之后**的两件兑付(部署名单那一问的豁免、「不再询问」的规则)—— 两件都只在 200 那一支、都读同一只资格。 */
|
|
1943
|
+
private afterLiveDecision;
|
|
1814
1944
|
/**
|
|
1815
1945
|
* **部署名单(`APPROVAL_REQUIRE`)那一问的「本会话放行」只落 server 的会话豁免店**(谁问的,谁的站着的答案算数):名单的问是 server 铸的,
|
|
1816
1946
|
* 名单门在出问之前读这只店(键 = 会话 × wire 工具名,与耐久 `/decide` 的 `remember:"session"` 写下的同形),命中就不出问 —— 引擎看到的
|
|
@@ -1842,17 +1972,67 @@ export declare class ToolApprovalCoordinator {
|
|
|
1842
1972
|
/** [ref]:`tool_approval.not_pending` 的**唯一**成形口。文案逐字不变(存量壳/SDK 按它认这条 404),
|
|
1843
1973
|
* 只 additive 加判别位;`cause` 缺席 = 这台部署没有行可判(D1 无店)或行形不可信(见各调用点)。 */
|
|
1844
1974
|
private notPending;
|
|
1975
|
+
/**
|
|
1976
|
+
* `GET /v1/tool-approvals/:approvalId` —— **按问读口**:一只 ask 此刻在哪一态({@link TOOL_APPROVAL_READ_STATES})。与 {@link respond} 同根同门
|
|
1977
|
+
* (HTTP 层的鉴权 / 属主身份同一只 `gatedPrincipal`;属主不过与未知同形 404,无存在性谕示),读法与应答口逐条同源:
|
|
1978
|
+
* 本副本上在等它的活登记({@link liveEntryFor})⇒ `pending`(行投影 = 列表面 `livePending[]` 的同一只投影);否则按 id 读行
|
|
1979
|
+
* ({@link askRowFor} + {@link askRowVisibleTo}),行态 → 读态与晚答口的分派同一张表;行仍 `STREAM_PENDING` 而本副本没有在等它的登记 ⇒ 它活在别的副本上,
|
|
1980
|
+
* 与晚答口同答 404 `unknown_or_other_replica`(那里才有兑现它的闭包)。没有 ask 账的部署 ⇒ 晚答口那句 404,不带 `cause`。
|
|
1981
|
+
* 纯读:零写、零结算、不碰本地登记(晚答口的 DECIDED 臂会顺手同步本副本的活登记,读口不做)。
|
|
1982
|
+
*/
|
|
1983
|
+
readApproval(id: string, principal: string | undefined): {
|
|
1984
|
+
status: number;
|
|
1985
|
+
body: unknown;
|
|
1986
|
+
} | Promise<{
|
|
1987
|
+
status: number;
|
|
1988
|
+
body: unknown;
|
|
1989
|
+
}>;
|
|
1990
|
+
/** S-247:接管登记的按问读口 —— 行可见且仍 `STREAM_PENDING` ⇒ `pending`(列表面同一只行投影);否则按行的态答(与读行半场同一张表)。 */
|
|
1991
|
+
private readAdopted;
|
|
1992
|
+
/** {@link readApproval} 的读行半场。 */
|
|
1993
|
+
private readAskRowState;
|
|
1994
|
+
/** 一条行 → 按问读口的答案(行态六态穷举:新增 `AskState` 而不在此表态 = **编译错**)。 */
|
|
1995
|
+
private readStateOfRow;
|
|
1845
1996
|
/**
|
|
1846
1997
|
* [ref] —— live 未命中之后的**状态感知分派**(设计 §三的那张表)。
|
|
1847
1998
|
*
|
|
1848
|
-
*
|
|
1849
|
-
*
|
|
1850
|
-
*
|
|
1851
|
-
* 有意义」的那一因)。
|
|
1999
|
+
* 有行的 ask 的 wire 身份就是行的键 ⇒ 按 id **直接读行**(任一副本、重启前后都读得到;不再经任何进程内的桥)。持久店缺席 ⇒ D1 体逐字不变
|
|
2000
|
+
* (没有行可判,编一个 cause 是撒谎);店在场而行不在 / 不是调用方的 ⇒ 404 `unknown_or_other_replica`(那正是「换副本/换端点重试才
|
|
2001
|
+
* 有意义」的那一因;属主不过与未知同形,无存在性谕示)。
|
|
1852
2002
|
*/
|
|
1853
2003
|
private respondLate;
|
|
1854
|
-
/**
|
|
2004
|
+
/**
|
|
2005
|
+
* 新开的 sync 连接经 **preamble** 呈出的卡 → 登记进这条连接的**消卡订阅**(连接的 `approval_complete` 只投给接下过开卡帧的连接 —— 这些卡的开卡帧
|
|
2006
|
+
* 就是 preamble 那一帧)。这几只 ask 在本副本上的最后一条活登记落定时,`deliver` 收一帧 `approval_complete`(与那次 settle 的判决同值)。
|
|
2007
|
+
* · 只订本副本上**此刻在等**的 ask(`pendingByAskId` 有登记):活在别的副本上的 / 订阅之前已经落定的,本副本无从得知它何时落定 ——
|
|
2008
|
+
* 那几形的结构补偿仍是下一次 preamble 的全量对账基准(不在基准内的卡一律清)。
|
|
2009
|
+
* · 投递是 live-only 的通知:`deliver` 抛错 / 连接已死 ⇒ 吞掉(卡的终局是行上的事实,不因通知没送到而改变)。
|
|
2010
|
+
* 返回退订口(连接收场时调;投递一次之后自动退订)。
|
|
2011
|
+
*/
|
|
2012
|
+
watchPresentedCards(askIds: readonly string[], deliver: (frame: ApprovalCompleteFrame) => void): () => void;
|
|
2013
|
+
private dropPresentedCardWatcher;
|
|
2014
|
+
/** settle 咽喉调:一只 ask 在本副本上的最后一条活登记落定 ⇒ 给订了它的每条连接投一帧消卡,随即退订。 */
|
|
2015
|
+
private notifyPresentedCardWatchers;
|
|
2016
|
+
/**
|
|
2017
|
+
* 一个 wire 身份 → 本副本上**此刻在等它**的那一条活登记(应答口与读口共用这一只读法)。
|
|
2018
|
+
* · 有行的 ask:wire 身份 = 行的键 ⇒ 同一只 ask 的活登记(重复登记各一条)里**最早**的那一条(插入序;CAS 单赢,赢后其余登记经
|
|
2019
|
+
* 同 askId 的广播口按同一份行真相结清);
|
|
2020
|
+
* · 无行的 ask:wire 身份 = 登记本地键 ⇒ 直接取那一条。登记本地键对有行的 ask 不是 wire 身份(它从不上 wire),拿它来问 ⇒ 查无。
|
|
2021
|
+
*/
|
|
2022
|
+
private liveEntryFor;
|
|
2023
|
+
/** {@link respondLate} 的读行:按 id 读出行,交 {@link dispatchRowTruth}。 */
|
|
1855
2024
|
private dispatchLateByRow;
|
|
2025
|
+
/**
|
|
2026
|
+
* 按 wire 身份(= 行的键)读行。读不出 ⇒ 记账并按「查无」交回:读不出 = **不知道**这只 ask 落在哪一态,而晚答口的三条受理臂(200/200/202)
|
|
2027
|
+
* 都在对客户端做承诺 —— 不知道 ⇒ 回那句 404,绝不把未知说成受理(D5 的 fail-open 只覆盖「不挡人的真实回决」那一面,这条腿方向相反)。
|
|
2028
|
+
*/
|
|
2029
|
+
private askRowFor;
|
|
2030
|
+
/**
|
|
2031
|
+
* 一条行(的此刻真相)→ 应答口的答案:属主门 + 受理回执 + 六态穷举分派(闭集:新增 `AskState` 而不在此表态 = **编译错**)。两个入口:本副本没有在等
|
|
2032
|
+
* 这只 ask 的登记({@link dispatchLateByRow} 读出行),以及有登记但回决的 CAS 干净地输(行已有终局,`decideAsk` 带回的那条行)—— 一只 ask 的
|
|
2033
|
+
* 应答只看行的真相,与本副本有没有残留登记无关。
|
|
2034
|
+
*/
|
|
2035
|
+
private dispatchRowTruth;
|
|
1856
2036
|
/** [ref]:迟到腿上的 `persistRule` 兑付面 —— 本地条目(规则车道素材的载体)早已随 park 路由散场,
|
|
1857
2037
|
* 没有任何可对的候选表 ⇒ 如实拒(裁决本身照常受理,与 {@link persistRuleAfterDecision} 的
|
|
1858
2038
|
* 「失败不翻转裁决」同判)。用既有词 `rule_lane_unavailable`,不为这一支新造词。 */
|
|
@@ -1889,7 +2069,7 @@ export declare class ToolApprovalCoordinator {
|
|
|
1889
2069
|
*
|
|
1890
2070
|
* ## 素材从哪来(这是本方法存在的全部理由)
|
|
1891
2071
|
* live 腿的等式左边是**进程内条目** `PendingApproval.ruleLane`,而 park 路由把条目连同素材一起散场
|
|
1892
|
-
* 了(
|
|
2072
|
+
* 了(行之外不留任何进程内素材)。本腿因此从**行**取,一件一件对着 live 腿的入参:
|
|
1893
2073
|
* · `command` = `rule_command` 列(**[ref] 新列**;缺席即本方法唯一的新拒因,见下);
|
|
1894
2074
|
* · `scope` = `rule_scope_root` 列 ⇒ `{kind:"project", root}`,缺席则**不铸 scope**(core 落 global,
|
|
1895
2075
|
* = live 腿 `material.scopeRoot` 缺席时逐字同形 —— 绝不在坐标系不明时编一个 root);
|
|
@@ -1940,10 +2120,44 @@ export declare class ToolApprovalCoordinator {
|
|
|
1940
2120
|
* 语义。
|
|
1941
2121
|
* 🔴 **S-454 起行上带整只活卡帧**(`frame`,见 {@link LivePendingRow.frame}):旧文那句「input/args
|
|
1942
2122
|
* 不上列表,详情走流帧」对**悬挂 ask 结构上不成立**(它永远没有流帧),而 `frame` 是 `askBroadcast`
|
|
1943
|
-
* 那一处构造的同一个对象 ⇒ 仍然只有**一个**脱敏属主、零第二投影。`scope` 与 durable
|
|
1944
|
-
* 条目)
|
|
1945
|
-
*
|
|
2123
|
+
* 那一处构造的同一个对象 ⇒ 仍然只有**一个**脱敏属主、零第二投影。`scope` 与 durable 面同一个值(checkpoint scope):`undefined` = operator 全量(含 owner null 的
|
|
2124
|
+
* 条目),`_`(`CHECKPOINT_PUBLIC_SCOPE`)= 匿名那一组 = owner null 的条目(R7:不带主体的调用方列得出它答得了的那几张),
|
|
2125
|
+
* 其余串 = 只见 `owner === scope` 的条目(null-owner 行对具名主体不列,宁少列不超范围)。行的 `approvalId` 就是 `respond()` 收的 id
|
|
1946
2126
|
* (同源可达,[ref] 判据);`expiresAtMs` 照抄登记时单点铸定的窗死线([ref] 三键同一个数)。 */
|
|
2127
|
+
/**
|
|
2128
|
+
* 🔴 S-247 —— **起服接管**:把问账里仍 `STREAM_PENDING` 的问接进本审批机的活集合,让 `livePending[]`(及 `/v1/approvals/stream` 的 live 半场、
|
|
2129
|
+
* 按问读口、应答口)在重启之后不重开流也看得见、答得了它们。审批机仍是这些读面**唯一**的读源:读问账的只有这里(起服一次),之后列表行由
|
|
2130
|
+
* 同一只 {@link livePendingRowOf} 投影,卡帧 = `buildReplayFrame`(开流 preamble 同一只构造)—— 不是 GET 上加一只读表的第二 reader。
|
|
2131
|
+
*
|
|
2132
|
+
* 律(设计稿 `design-S-247.md` §2):接管登记**没有引擎腿在等它**(铸它的进程没了,或它活在别的副本上),与活登记同一只状态机 ——
|
|
2133
|
+
* 应答 = 同一把 `decideAsk` CAS({@link answerRegistration}),收敛 = 同一条悬挂轮询腿读行({@link pollSuspendedDecisions});它活多久只由行说了算,
|
|
2134
|
+
* 没有自己的窗(无等待腿的行的到期写者已经存在:对账器段二,同一只政策感知终态 claim,窗 + 宽限 —— 接管不新增竞争者)。
|
|
2135
|
+
* 「本副本没有引擎腿在等它」机读披露:列表行与应答回执带 `consumerState:"absent"`({@link ASK_DECISION_CONSUMER_ABSENT})。
|
|
2136
|
+
*
|
|
2137
|
+
* 装配点 = `boot/stage-07` 起服收敛之后、reaper / HTTP 之前(local 车道上收敛先把前世问收成 `VOID` ⇒ 这里读到零行,车道无分叉)。
|
|
2138
|
+
* 幂等:本副本已有这只 askId 的登记就跳过;每次起服由行重新推导。读失败 ⇒ **拒启**(抛;与起服收敛同一拍、同姿态 —— 照常起来等于让
|
|
2139
|
+
* 仍待决的问在列表面上消失,而审批中心只读列表)。
|
|
2140
|
+
* ⚠️ 射程:接管的是**起服那一刻**问账里的待决行;之后别的副本新铸的问不接管(`livePending` 是本副本投影、多副本要会话粘性 —— 契约原句不变)。
|
|
2141
|
+
*/
|
|
2142
|
+
adoptOpenAsks(): Promise<OpenAskAdoption>;
|
|
2143
|
+
/**
|
|
2144
|
+
* S-247:由一条待决行铸一条接管登记并放进活集合(唯一铸点;读法见 {@link AdoptedRegistrationPart})。事实全部取自行与行上的卡:属主 / 会话(adhoc 替身
|
|
2145
|
+
* = taskId 时不投,与按问读口的行投影同读)/ 子代出身(卡 `fromSubagent` ⇒ 行 `sourceTaskId`)/ 窗死线 / 铸造时刻取行;工具名、要人位、治理位、类集取卡;
|
|
2146
|
+
* 授予绑定卡上没有 ⇒ `unreadable`(于是站着的答案判据答 `none`:`rememberRefused`,`allow_session` 只放行这一次 —— 既有律);规则素材不在 ⇒ `persistRule`
|
|
2147
|
+
* 答 `rule_lane_unavailable`(晚答腿同一个词)。卡面的 `rememberRefused` 与条目同一只判据(活登记那一处的同一条纪律)。
|
|
2148
|
+
*/
|
|
2149
|
+
private registerAdopted;
|
|
2150
|
+
/** S-247:放掉这只 askId 的全部接管登记(不碰行、不发消卡帧)。两个读者:悬挂轮询读到行没了(接管登记没有窗,没有行就没有活着的依据);本副本来了这只问的活登记(它让位)。活登记不动。 */
|
|
2151
|
+
private releaseAdoptedRegistrations;
|
|
2152
|
+
/**
|
|
2153
|
+
* S-247:问账里**这只问的行没了**(行被删)⇒ 放掉它的接管登记;放完本副本若已没有这只问的任何登记,经 preamble 订了它的消卡订阅也一并撤掉
|
|
2154
|
+
* (不发帧 —— 问不是被谁答掉的,编一帧消卡就是撒谎;壳的结构补偿仍是下一次 preamble 的全量对账基准)。还有活登记 ⇒ 订阅留给它的结算。
|
|
2155
|
+
*/
|
|
2156
|
+
private forgetAdoptedAsk;
|
|
2157
|
+
/** S-247:接管登记的属主跟行走 —— 悬挂轮询每读到一次仍待决的行就对齐一次(`/v1/adoption` 改写 `approval_ask.owner` 之后,列表面在一拍之内跟上;应答口与读口另读行当下的 owner)。 */
|
|
2158
|
+
private followAdoptedOwner;
|
|
2159
|
+
/** 这只 askId 在本副本上有几条**有引擎腿在等**的登记(接管登记不算)—— 轮询腿的「被唤醒数」读它。 */
|
|
2160
|
+
private waitingRegistrationCount;
|
|
1947
2161
|
listLivePending(scope: string | undefined): LivePendingRow[];
|
|
1948
2162
|
/**
|
|
1949
2163
|
* S-751:某只委派子代此刻有没有**待决**的活卡 —— fleet 对账腿「子代活性由属主说了算」的属主②读口(另一只是
|
|
@@ -2031,8 +2245,10 @@ export declare class ToolApprovalCoordinator {
|
|
|
2031
2245
|
/** [ref]:当前挂着的**悬挂**条目数(零投递集合铸的那一类)——运维/判据读它证「悬挂队列有多长」。 */
|
|
2032
2246
|
suspendedCount(): number;
|
|
2033
2247
|
sessionAllowedCount(): number;
|
|
2034
|
-
/**
|
|
2035
|
-
|
|
2248
|
+
/** S-247:当前在场的 preamble 消卡订阅(按 askId)数 —— 判据据它证「订阅有界于本副本的登记,没有登记、没有行的问不留订阅」。 */
|
|
2249
|
+
presentedCardWatcherCount(): number;
|
|
2250
|
+
/** [ref]:当前在场的受理回执数(有界性的可观测面 —— 判据据它证「帽是硬的、过期会被清」)。 */
|
|
2251
|
+
parkRedemptionCount(): number;
|
|
2036
2252
|
}
|
|
2037
2253
|
export {};
|
|
2038
2254
|
//# sourceMappingURL=tool-approval.d.ts.map
|