@sema-agent/server 7.147.0 → 7.149.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 +1468 -24
- package/README.md +35 -7
- package/README.zh-CN.md +18 -8
- package/USAGE.md +444 -193
- package/deploy/sema-up/README.md +16 -5
- package/deploy/sema-up/chart/templates/NOTES.txt +1 -1
- package/deploy/sema-up/chart/templates/_helpers.tpl +20 -4
- package/deploy/sema-up/chart/values.yaml +3 -2
- package/deploy/sema-up/cluster-up.sh +74 -176
- package/deploy/sema-up/kube-up.sh +29 -49
- package/deploy/sema-up/lib/chart-run.sh +23 -0
- package/deploy/sema-up/lib/dataroot.sh +3 -3
- package/deploy/sema-up/lib/health.sh +62 -13
- package/deploy/sema-up/lib/helm-values-cluster.py +18 -0
- package/deploy/sema-up/lib/helm-values-kube.py +35 -0
- package/deploy/sema-up/lib/regcred.py +8 -0
- package/deploy/sema-up/lib/remote/helm-install.sh +3 -0
- package/deploy/sema-up/lib/remote/image-import.sh +6 -0
- package/deploy/sema-up/lib/remote/machine-precheck.sh +11 -0
- package/deploy/sema-up/lib/remote/region-probe.sh +3 -0
- package/deploy/sema-up/lib/remote/stack-ready.sh +26 -0
- package/deploy/sema-up/lib/remote/vxlan-guard.sh +8 -0
- package/deploy/sema-up/lib/render-stack.py +17 -0
- package/deploy/sema-up/lib/shell-text.sh +87 -0
- package/deploy/sema-up/lib/usage-flags.txt +10 -0
- package/deploy/sema-up/lib/usage-head.txt +1 -0
- package/deploy/sema-up/lib/usage-tail.txt +13 -0
- package/deploy/sema-up/preflight.sh +10 -8
- package/deploy/sema-up/sema-up.sh +14 -39
- package/deploy/sema-up/smoke.sh +7 -6
- package/deploy/sema-up/stack/compose.dataroot.yaml +3 -0
- package/deploy/sema-up/stack/compose.yaml +13 -1
- package/deploy/sema-up/stack/sema-stack-cluster.yaml +21 -0
- package/dist/adoption/plan.d.ts +24 -0
- package/dist/adoption/plan.js +53 -1
- package/dist/adoption/runner.d.ts +10 -1
- package/dist/adoption/runner.js +36 -16
- package/dist/approval-card.d.ts +36 -38
- package/dist/approval-gate-currency.js +3 -2
- package/dist/approval-leg-origin.d.ts +33 -0
- package/dist/approval-leg-origin.js +4 -0
- package/dist/approval-reconciler.d.ts +4 -13
- package/dist/approval-reconciler.js +2 -2
- package/dist/approval.d.ts +13 -11
- package/dist/approval.js +3 -3
- package/dist/audit.d.ts +10 -3
- package/dist/audit.js +15 -7
- package/dist/auth-bridge.d.ts +9 -15
- package/dist/auth-bridge.js +4 -11
- package/dist/auth-keys.d.ts +10 -1
- package/dist/auth-keys.js +8 -0
- package/dist/auto-mode-face.d.ts +10 -7
- package/dist/auto-mode-face.js +7 -4
- package/dist/background-agent-name.d.ts +19 -1
- package/dist/background-agent-name.js +12 -2
- package/dist/background-session-reap.d.ts +1 -1
- package/dist/bake-runner/main.js +9 -6
- package/dist/bench/s1/arms.js +6 -5
- package/dist/bench/s1/live-deps.js +5 -2
- package/dist/bench/s1/run-firm.js +6 -5
- package/dist/bind-host.d.ts +25 -0
- package/dist/bind-host.js +25 -0
- package/dist/boot/adoption.d.ts +3 -0
- package/dist/boot/adoption.js +1 -0
- package/dist/boot/deployment-mods.d.ts +1 -1
- package/dist/boot/execution-env.d.ts +17 -7
- package/dist/boot/execution-env.js +47 -42
- package/dist/boot/execution-lane.d.ts +6 -4
- package/dist/boot/execution-lane.js +3 -1
- package/dist/boot/exit-boundary.d.ts +2 -2
- package/dist/boot/exit-boundary.js +6 -5
- package/dist/boot/fatal-exit.d.ts +3 -5
- package/dist/boot/fatal-exit.js +2 -2
- package/dist/boot/leader.d.ts +15 -0
- package/dist/boot/leader.js +17 -15
- package/dist/boot/memory-consolidation.d.ts +37 -29
- package/dist/boot/memory-consolidation.js +11 -5
- package/dist/boot/org-delivery.d.ts +3 -2
- package/dist/boot/org-memory.js +1 -1
- package/dist/boot/parked-revive-gate.js +2 -2
- package/dist/boot/reapers.d.ts +4 -3
- package/dist/boot/reapers.js +19 -16
- package/dist/boot/resolve-spec.d.ts +5 -3
- package/dist/boot/resolve-spec.js +60 -70
- package/dist/boot/retention-lane.d.ts +4 -4
- package/dist/boot/retention-lane.js +2 -2
- package/dist/boot/runner-deps.d.ts +28 -7
- package/dist/boot/runner-deps.js +14 -5
- package/dist/boot/runtime-caps.d.ts +2 -2
- package/dist/boot/runtime-caps.js +16 -2
- package/dist/boot/session-faces.d.ts +16 -7
- package/dist/boot/session-faces.js +114 -94
- package/dist/boot/shutdown.d.ts +5 -4
- package/dist/boot/shutdown.js +6 -4
- package/dist/boot/stage-01-config.d.ts +1 -0
- package/dist/boot/stage-01-config.js +13 -4
- package/dist/boot/stage-02-web-admin-pull.d.ts +2 -0
- package/dist/boot/stage-02-web-admin-pull.js +16 -3
- package/dist/boot/stage-03-store-backend.d.ts +4 -0
- package/dist/boot/stage-03-store-backend.js +4 -3
- package/dist/boot/stage-04-stores.d.ts +3 -0
- package/dist/boot/stage-04-stores.js +2 -2
- package/dist/boot/stage-05-execution-env.d.ts +8 -3
- package/dist/boot/stage-05-execution-env.js +2 -2
- package/dist/boot/stage-06-runners.d.ts +12 -13
- package/dist/boot/stage-06-runners.js +23 -15
- package/dist/boot/stage-07-capability-layer.d.ts +13 -9
- package/dist/boot/stage-07-capability-layer.js +5 -3
- package/dist/boot/stage-08-reapers.d.ts +13 -9
- package/dist/boot/stage-08-reapers.js +3 -3
- package/dist/boot/stage-09-leader.d.ts +14 -16
- package/dist/boot/stage-09-leader.js +12 -4
- package/dist/boot/stage-10-http-server.d.ts +14 -16
- package/dist/boot/stage-10-http-server.js +7 -4
- package/dist/boot/store-evidence.d.ts +20 -0
- package/dist/boot/store-evidence.js +13 -0
- package/dist/boot/stores.d.ts +6 -0
- package/dist/boot/stores.js +41 -27
- package/dist/boot/task-list-lane.d.ts +4 -4
- package/dist/boot/web-admin.d.ts +4 -2
- package/dist/boot/web-admin.js +55 -35
- package/dist/boot/webfetch-summarize-lane.d.ts +1 -1
- package/dist/boot-reclaim.d.ts +3 -1
- package/dist/boot-reclaim.js +1 -1
- package/dist/brain.d.ts +7 -18
- package/dist/brain.js +5 -17
- package/dist/budget.js +6 -6
- package/dist/capabilities/center-plugins.d.ts +7 -1
- package/dist/capabilities/center-plugins.js +32 -10
- package/dist/capabilities/center-wiring.js +1 -1
- package/dist/capabilities/composite-members.d.ts +2 -2
- package/dist/capabilities/composite-members.js +2 -2
- package/dist/capabilities/repo-tools.d.ts +2 -0
- package/dist/capabilities/repo-tools.js +14 -12
- package/dist/capabilities/scenarios.d.ts +6 -15
- package/dist/capabilities/scenarios.js +11 -16
- package/dist/capabilities/skills.d.ts +1 -1
- package/dist/capabilities/tool-defer.d.ts +1 -1
- package/dist/capability-facts.d.ts +39 -11
- package/dist/capability-facts.js +35 -7
- package/dist/card-settle-stored-scope.d.ts +56 -0
- package/dist/card-settle-stored-scope.js +27 -0
- package/dist/card-void.d.ts +8 -13
- package/dist/card-void.js +2 -7
- package/dist/center-credential-renewer.d.ts +6 -2
- package/dist/center-credential-renewer.js +7 -3
- package/dist/config-catalog.d.ts +28 -1
- package/dist/config-catalog.js +95 -85
- package/dist/config-dir-trust.d.ts +37 -4
- package/dist/config-dir-trust.js +88 -44
- package/dist/config-invariants.d.ts +43 -3
- package/dist/config-invariants.js +69 -5
- package/dist/config-lkg.d.ts +23 -1
- package/dist/config-lkg.js +17 -3
- package/dist/config-provider.d.ts +9 -9
- package/dist/config-provider.js +25 -110
- package/dist/config-pull-failure.d.ts +50 -0
- package/dist/config-pull-failure.js +48 -0
- package/dist/config-types.d.ts +62 -21
- package/dist/config.d.ts +14 -21
- package/dist/config.js +141 -64
- package/dist/context-window-notice.d.ts +31 -0
- package/dist/context-window-notice.js +28 -0
- package/dist/delegated-session-owner.d.ts +1 -1
- package/dist/deleted-session-ids.d.ts +3 -2
- package/dist/deployment-governance.d.ts +3 -3
- package/dist/deployment-shape.d.ts +46 -11
- package/dist/deployment-shape.js +8 -0
- package/dist/egress-redirect.d.ts +25 -7
- package/dist/egress-redirect.js +20 -2
- package/dist/elicitation.d.ts +6 -5
- package/dist/elicitation.js +23 -22
- package/dist/engine-identity.d.ts +28 -0
- package/dist/engine-identity.js +10 -0
- package/dist/entry-problems.d.ts +5 -7
- package/dist/entry-problems.js +1 -1
- package/dist/env-facts.js +2 -1
- package/dist/env-name-allowlist-knobs.d.ts +6 -5
- package/dist/env-name-allowlist-knobs.js +5 -0
- package/dist/env-witness.d.ts +7 -0
- package/dist/env-witness.js +16 -0
- package/dist/execution-lane-caps.d.ts +25 -23
- package/dist/execution-lane-caps.js +18 -26
- package/dist/execution-placement.d.ts +58 -18
- package/dist/execution-placement.js +41 -2
- package/dist/field-conflict.d.ts +7 -11
- package/dist/field-conflict.js +3 -3
- package/dist/file-history-capture.d.ts +3 -3
- package/dist/file-history-disclosure.js +1 -0
- package/dist/fleet/fleet-bus.d.ts +21 -3
- package/dist/fleet/fleet-bus.js +35 -25
- package/dist/fleet/fleet-reconciler.js +2 -2
- package/dist/fleet/serving-lease.js +3 -3
- package/dist/fleet-client.js +3 -3
- package/dist/fleet-lease.d.ts +0 -1
- package/dist/fleet-lease.js +4 -5
- package/dist/history-anchor.d.ts +23 -3
- package/dist/history-anchor.js +24 -4
- package/dist/hitl-delivery.d.ts +90 -0
- package/dist/hitl-delivery.js +98 -0
- package/dist/hooks/classic-stations.d.ts +8 -11
- package/dist/hooks/classic-stations.js +0 -7
- package/dist/hooks/command-spawn.d.ts +7 -2
- package/dist/hooks/command-spawn.js +13 -6
- package/dist/hooks/hook-llm.d.ts +5 -1
- package/dist/hooks/hook-llm.js +24 -15
- package/dist/hooks/hook-runner.d.ts +72 -57
- package/dist/hooks/hook-runner.js +271 -193
- package/dist/host-lsp-manager.d.ts +22 -8
- package/dist/host-lsp-manager.js +4 -1
- package/dist/http/active-run-conflict.d.ts +2 -43
- package/dist/http/active-run-conflict.js +3 -7
- package/dist/http/admission.d.ts +4 -18
- package/dist/http/admission.js +76 -79
- package/dist/http/approval-sweeps.d.ts +3 -3
- package/dist/http/approval-sweeps.js +56 -31
- package/dist/http/caller-trust.d.ts +8 -10
- package/dist/http/caller-trust.js +1 -2
- package/dist/http/claim-heartbeat.d.ts +49 -0
- package/dist/http/claim-heartbeat.js +46 -0
- package/dist/http/claimed-run.d.ts +16 -8
- package/dist/http/claimed-run.js +8 -0
- package/dist/http/dispatch.d.ts +8 -1
- package/dist/http/dispatch.js +78 -30
- package/dist/http/durable-run-leg.d.ts +11 -4
- package/dist/http/durable-run-leg.js +45 -21
- package/dist/http/execution-context.d.ts +122 -47
- package/dist/http/execution-context.js +135 -43
- package/dist/http/health-reader.d.ts +36 -0
- package/dist/http/health-reader.js +21 -0
- package/dist/http/health-self-report.d.ts +9 -9
- package/dist/http/health-self-report.js +4 -4
- package/dist/http/idempotency.d.ts +9 -5
- package/dist/http/idempotency.js +4 -4
- package/dist/http/memory-compliance-failure-reply.d.ts +15 -16
- package/dist/http/memory-compliance-failure-reply.js +4 -2
- package/dist/http/memory-face-fault-reply.d.ts +67 -0
- package/dist/http/memory-face-fault-reply.js +71 -0
- package/dist/http/memory-store-refusal-reply.d.ts +1 -1
- package/dist/http/memory-store-refusal-reply.js +3 -0
- package/dist/http/owner-access.d.ts +392 -67
- package/dist/http/owner-access.js +370 -35
- package/dist/http/principal-gate.d.ts +39 -89
- package/dist/http/principal-gate.js +26 -68
- package/dist/http/refusal-body.d.ts +35 -2
- package/dist/http/refusal-body.js +34 -0
- package/dist/http/request-guards.d.ts +9 -13
- package/dist/http/request-guards.js +34 -68
- package/dist/http/resume-composition.d.ts +37 -0
- package/dist/http/resume-composition.js +18 -0
- package/dist/http/resume-ctx-read.d.ts +46 -12
- package/dist/http/resume-ctx-read.js +31 -6
- package/dist/http/resume-legs.d.ts +54 -19
- package/dist/http/resume-legs.js +408 -196
- package/dist/http/retired-skill-manifest.d.ts +1 -1
- package/dist/http/route-ctx.d.ts +31 -32
- package/dist/http/routes/a2a-serve.d.ts +43 -5
- package/dist/http/routes/a2a-serve.js +60 -37
- package/dist/http/routes/admin-config-refresh.js +2 -2
- package/dist/http/routes/admin-drain.js +2 -2
- package/dist/http/routes/admin-memory-optout.js +4 -3
- package/dist/http/routes/adoption.d.ts +3 -0
- package/dist/http/routes/adoption.js +17 -10
- package/dist/http/routes/agents-roster.js +13 -7
- package/dist/http/routes/approvals-assistant.js +73 -67
- package/dist/http/routes/attachments.js +2 -2
- package/dist/http/routes/background.d.ts +3 -3
- package/dist/http/routes/background.js +9 -17
- package/dist/http/routes/capabilities.js +16 -19
- package/dist/http/routes/config-catalog.js +2 -2
- package/dist/http/routes/devices.d.ts +3 -3
- package/dist/http/routes/devices.js +4 -4
- package/dist/http/routes/diagnostics.d.ts +29 -3
- package/dist/http/routes/diagnostics.js +49 -18
- package/dist/http/routes/engine.js +2 -2
- package/dist/http/routes/fleet.js +5 -3
- package/dist/http/routes/images.js +10 -6
- package/dist/http/routes/leader.d.ts +7 -2
- package/dist/http/routes/leader.js +12 -3
- package/dist/http/routes/mcp-reconnect.d.ts +1 -1
- package/dist/http/routes/mcp-reconnect.js +7 -15
- package/dist/http/routes/memory-bundle.js +4 -7
- package/dist/http/routes/memory-compliance.js +4 -4
- package/dist/http/routes/memory-consolidation.js +6 -9
- package/dist/http/routes/memory-origin.d.ts +2 -0
- package/dist/http/routes/memory-origin.js +7 -8
- package/dist/http/routes/memory-policy.js +17 -12
- package/dist/http/routes/notify-wake.js +10 -19
- package/dist/http/routes/observability.js +3 -3
- package/dist/http/routes/principal-inbox.d.ts +4 -2
- package/dist/http/routes/principal-inbox.js +5 -4
- package/dist/http/routes/projects.d.ts +1 -1
- package/dist/http/routes/projects.js +3 -2
- package/dist/http/routes/retention-ops.js +6 -9
- package/dist/http/routes/rules.js +20 -5
- package/dist/http/routes/run-memory-capture.d.ts +2 -2
- package/dist/http/routes/run-memory-capture.js +6 -12
- package/dist/http/routes/run-permission-mode.d.ts +2 -2
- package/dist/http/routes/run-permission-mode.js +10 -17
- package/dist/http/routes/runs.js +155 -237
- package/dist/http/routes/session-memory-sync.d.ts +2 -2
- package/dist/http/routes/session-memory-sync.js +7 -13
- package/dist/http/routes/session-sync.d.ts +28 -7
- package/dist/http/routes/session-sync.js +63 -50
- package/dist/http/routes/sessions-list.d.ts +3 -3
- package/dist/http/routes/sessions-list.js +9 -9
- package/dist/http/routes/sessions.js +87 -124
- package/dist/http/routes/shared-memory.js +6 -6
- package/dist/http/routes/side-query.js +2 -2
- package/dist/http/routes/tasks.js +237 -187
- package/dist/http/routes/trace-usage.d.ts +0 -12
- package/dist/http/routes/trace-usage.js +40 -46
- package/dist/http/routes/workflows.d.ts +39 -4
- package/dist/http/routes/workflows.js +42 -14
- package/dist/http/run-concurrency-cap.d.ts +20 -12
- package/dist/http/run-concurrency-cap.js +39 -26
- package/dist/http/run-read-face.d.ts +3 -5
- package/dist/http/run-read-face.js +8 -13
- package/dist/http/send.d.ts +12 -3
- package/dist/http/send.js +42 -6
- package/dist/http/server.d.ts +43 -45
- package/dist/http/server.js +61 -11
- package/dist/http/sse-log.d.ts +17 -10
- package/dist/http/sse-log.js +7 -7
- package/dist/http/stored-body-replay.d.ts +12 -0
- package/dist/http/stored-body-replay.js +2 -2
- package/dist/http/submit-ctx.d.ts +17 -8
- package/dist/http/submit-ctx.js +8 -5
- package/dist/http/submit-replay.d.ts +19 -6
- package/dist/http/submit-replay.js +18 -6
- package/dist/http/sync-submit-body.d.ts +3 -4
- package/dist/http/sync-submit-body.js +4 -5
- package/dist/http/wire-types.d.ts +4 -3
- package/dist/identity-source.d.ts +36 -5
- package/dist/identity-source.js +27 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.js +2 -0
- package/dist/key-resolver.d.ts +32 -0
- package/dist/key-resolver.js +23 -9
- package/dist/leader/diffup.js +2 -1
- package/dist/leader/endpoint.d.ts +26 -5
- package/dist/leader/endpoint.js +154 -14
- package/dist/leader/fanout.d.ts +3 -0
- package/dist/leader/fanout.js +78 -63
- package/dist/leader/leader.d.ts +16 -0
- package/dist/leader/leader.js +43 -3
- package/dist/leader/merge.d.ts +9 -1
- package/dist/leader/merge.js +16 -1
- package/dist/leader/repair-wire.js +1 -1
- package/dist/leader/wire.d.ts +36 -3
- package/dist/leader/wire.js +59 -18
- package/dist/leg-facts.d.ts +7 -2
- package/dist/leg-facts.js +1 -0
- package/dist/local-store-declaration.d.ts +54 -0
- package/dist/local-store-declaration.js +59 -0
- package/dist/lsp-evict.d.ts +6 -4
- package/dist/lsp-evict.js +2 -3
- package/dist/mcp-assertion-header.d.ts +1 -1
- package/dist/mcp-assertion-header.js +1 -1
- package/dist/memory-operator-faces.d.ts +5 -4
- package/dist/memory-operator-faces.js +1 -1
- package/dist/memory-project-layer.js +1 -1
- package/dist/memory-scope.d.ts +33 -6
- package/dist/memory-scope.js +68 -19
- package/dist/memory-store-refusal.d.ts +5 -2
- package/dist/memory-sync-client.d.ts +3 -2
- package/dist/memory-sync-client.js +8 -5
- package/dist/model-compat.d.ts +17 -8
- package/dist/model-compat.js +6 -2
- package/dist/model-context-window.d.ts +57 -0
- package/dist/model-context-window.js +21 -0
- package/dist/model-entry-headers.d.ts +46 -4
- package/dist/model-entry-headers.js +2 -2
- package/dist/model-entry-refusal.d.ts +40 -20
- package/dist/model-entry-refusal.js +57 -30
- package/dist/model-plane-face.d.ts +19 -11
- package/dist/model-plane-face.js +9 -1
- package/dist/model-plane-probe.d.ts +2 -0
- package/dist/model-plane-probe.js +17 -0
- package/dist/model-provider.d.ts +3 -3
- package/dist/model-reach-scope.d.ts +2 -1
- package/dist/model-route-endpoint.d.ts +9 -5
- package/dist/model-route-endpoint.js +29 -7
- package/dist/model-select.d.ts +16 -0
- package/dist/model-select.js +4 -0
- package/dist/mountinfo.d.ts +37 -0
- package/dist/mountinfo.js +47 -0
- package/dist/namespaced-rule-name.d.ts +23 -14
- package/dist/namespaced-rule-name.js +8 -11
- package/dist/net-address.d.ts +1 -1
- package/dist/observability/corrupt-read-seat.d.ts +4 -4
- package/dist/observability/corrupt-read-seat.js +5 -3
- package/dist/observability/fail-open.d.ts +72 -40
- package/dist/observability/fail-open.js +74 -40
- package/dist/observability/logger.d.ts +22 -1
- package/dist/observability/logger.js +89 -12
- package/dist/observability/metrics.js +4 -5
- package/dist/observability/otel-exporter.js +2 -1
- package/dist/observability/principal-context.d.ts +14 -7
- package/dist/observability/principal-context.js +8 -3
- package/dist/observability/run-terminal.d.ts +7 -1
- package/dist/observability/run-terminal.js +6 -2
- package/dist/observability/secret-env-scrub.d.ts +1 -1
- package/dist/observability/secret-env-scrub.js +1 -1
- package/dist/orchestration/hardened-vm-runner.d.ts +1 -0
- package/dist/orchestration/hardened-vm-runner.js +11 -5
- package/dist/orchestration/hardened-vm-worker-runner.d.ts +0 -14
- package/dist/orchestration/hardened-vm-worker-runner.js +5 -0
- package/dist/orchestration/hardened-vm-worker.js +2 -1
- package/dist/orchestration/workflow-completion-inbox.d.ts +3 -3
- package/dist/orchestration/workflow-completion-inbox.js +3 -2
- package/dist/org-delivery-gate.d.ts +36 -10
- package/dist/org-delivery-gate.js +12 -8
- package/dist/outbound-dispatcher.d.ts +1 -1
- package/dist/outbound-dispatcher.js +6 -12
- package/dist/owner-brands.d.ts +81 -0
- package/dist/owner-brands.js +42 -0
- package/dist/owner-faces.d.ts +532 -0
- package/dist/owner-faces.js +126 -0
- package/dist/park-row-commit.d.ts +67 -0
- package/dist/park-row-commit.js +76 -0
- package/dist/parked-decide.d.ts +76 -12
- package/dist/parked-decide.js +152 -11
- package/dist/parked-revive-surface.d.ts +14 -4
- package/dist/parked-revive-surface.js +5 -4
- package/dist/peer-directory.d.ts +7 -9
- package/dist/peer-directory.js +3 -2
- package/dist/permission-rule-vocab.d.ts +53 -8
- package/dist/permission-rule-vocab.js +30 -2
- package/dist/plugins/adoption-log-sql.d.ts +3 -25
- package/dist/plugins/adoption-log-sql.js +23 -21
- package/dist/plugins/approval-ask-retired-delete-by-task-m50.d.ts +7 -0
- package/dist/plugins/approval-ask-retired-delete-by-task-m50.js +17 -0
- package/dist/plugins/approval-ask-store-file.d.ts +18 -7
- package/dist/plugins/approval-ask-store-file.js +37 -14
- package/dist/plugins/approval-ask-store-memory.d.ts +12 -4
- package/dist/plugins/approval-ask-store-memory.js +24 -10
- package/dist/plugins/approval-ask-store-sql.d.ts +40 -21
- package/dist/plugins/approval-ask-store-sql.js +44 -15
- package/dist/plugins/approval-exemption-skill-cutoff.d.ts +64 -0
- package/dist/plugins/approval-exemption-skill-cutoff.js +122 -0
- package/dist/plugins/approval-exemption-skill-m46.d.ts +14 -0
- package/dist/plugins/approval-exemption-skill-m46.js +21 -0
- package/dist/plugins/approval-exemption-store.d.ts +32 -2
- package/dist/plugins/approval-exemption-store.js +42 -19
- package/dist/plugins/approval-nonce-store.d.ts +39 -12
- package/dist/plugins/approval-nonce-store.js +72 -23
- package/dist/plugins/blob-backend.d.ts +2 -0
- package/dist/plugins/blob-backend.js +9 -6
- package/dist/plugins/caching-session-store.d.ts +13 -1
- package/dist/plugins/caching-session-store.js +43 -4
- package/dist/plugins/checkpoint-index-columns.d.ts +32 -5
- package/dist/plugins/checkpoint-index-columns.js +36 -1
- package/dist/plugins/checkpoint-store-face.d.ts +83 -10
- package/dist/plugins/checkpoint-store-face.js +18 -1
- package/dist/plugins/device-store-sql.js +1 -0
- package/dist/plugins/ensure-index.d.ts +13 -1
- package/dist/plugins/ensure-index.js +154 -21
- package/dist/plugins/ensure-schema-lock-policy.d.ts +36 -18
- package/dist/plugins/ensure-schema-lock-policy.js +76 -9
- package/dist/plugins/file-run-store.d.ts +85 -32
- package/dist/plugins/file-run-store.js +177 -94
- package/dist/plugins/host-platform.d.ts +24 -3
- package/dist/plugins/host-platform.js +15 -1
- package/dist/plugins/image-bake-store-sql.js +2 -0
- package/dist/plugins/imported-layer-root-retirement.d.ts +2 -2
- package/dist/plugins/k8s-pod-reaper.d.ts +1 -3
- package/dist/plugins/k8s-pod-reaper.js +0 -1
- package/dist/plugins/leader-run-store-sql.d.ts +22 -0
- package/dist/plugins/leader-run-store-sql.js +34 -4
- package/dist/plugins/local-checkpoint-store.d.ts +62 -23
- package/dist/plugins/local-checkpoint-store.js +197 -77
- package/dist/plugins/local-data-dir-modes-m39.js +2 -1
- package/dist/plugins/local-data-root-admission.d.ts +52 -0
- package/dist/plugins/local-data-root-admission.js +100 -0
- package/dist/plugins/local-docker-capacity.d.ts +93 -0
- package/dist/plugins/local-docker-capacity.js +194 -0
- package/dist/plugins/local-docker-reaper.d.ts +92 -0
- package/dist/plugins/local-docker-reaper.js +102 -0
- package/dist/plugins/local-engine-high-water.d.ts +29 -6
- package/dist/plugins/local-engine-high-water.js +27 -19
- package/dist/plugins/local-session-store.d.ts +458 -140
- package/dist/plugins/local-session-store.js +906 -292
- package/dist/plugins/local-session-window.d.ts +3 -2
- package/dist/plugins/local-session-window.js +3 -2
- package/dist/plugins/local-sidecar-quarantine.js +3 -2
- package/dist/plugins/local-task-attachment-store.d.ts +18 -1
- package/dist/plugins/local-task-attachment-store.js +22 -1
- package/dist/plugins/memory-embedder.js +9 -7
- package/dist/plugins/memory-engine-pg.d.ts +3 -2
- package/dist/plugins/memory-engine-pg.js +14 -5
- package/dist/plugins/memory-engine-sql-apply.d.ts +8 -4
- package/dist/plugins/memory-engine-sql-apply.js +6 -8
- package/dist/plugins/memory-engine-tidb.d.ts +4 -2
- package/dist/plugins/memory-engine-tidb.js +11 -2
- package/dist/plugins/memory-optout-grant-store-sql.d.ts +1 -1
- package/dist/plugins/memory-optout-grant-store-sql.js +3 -3
- package/dist/plugins/memory-run-store.d.ts +53 -36
- package/dist/plugins/memory-run-store.js +116 -88
- package/dist/plugins/one-time-migration-marker.d.ts +26 -0
- package/dist/plugins/one-time-migration-marker.js +13 -0
- package/dist/plugins/one-time-migrations.d.ts +214 -47
- package/dist/plugins/one-time-migrations.js +481 -135
- package/dist/plugins/org-delivery-quota-store.d.ts +34 -11
- package/dist/plugins/org-delivery-quota-store.js +31 -15
- package/dist/plugins/permission-rule-store-file.d.ts +3 -3
- package/dist/plugins/permission-rule-store-sql.d.ts +5 -64
- package/dist/plugins/permission-rule-store-sql.js +11 -95
- package/dist/plugins/pg-pool.d.ts +2 -32
- package/dist/plugins/pg-pool.js +24 -17
- package/dist/plugins/remote-env-device.d.ts +3 -2
- package/dist/plugins/remote-env-e2b.d.ts +8 -32
- package/dist/plugins/remote-env-e2b.js +44 -32
- package/dist/plugins/remote-env-host.d.ts +51 -17
- package/dist/plugins/remote-env-host.js +111 -42
- package/dist/plugins/remote-env-k8s.d.ts +40 -45
- package/dist/plugins/remote-env-k8s.js +111 -60
- package/dist/plugins/remote-env-local-docker.d.ts +152 -15
- package/dist/plugins/remote-env-local-docker.js +352 -72
- package/dist/plugins/remote-scratchpad.js +4 -0
- package/dist/plugins/retention-deployment.d.ts +49 -17
- package/dist/plugins/retention-deployment.js +39 -8
- package/dist/plugins/run-preview-m45.d.ts +11 -0
- package/dist/plugins/run-preview-m45.js +19 -0
- package/dist/plugins/run-store-sql.d.ts +82 -75
- package/dist/plugins/run-store-sql.js +164 -125
- package/dist/plugins/s3-answer.d.ts +2 -1
- package/dist/plugins/sandbox-reaper.d.ts +26 -0
- package/dist/plugins/sandbox-reaper.js +2 -0
- package/dist/plugins/scenario-prefix-switch-m42.d.ts +56 -0
- package/dist/plugins/scenario-prefix-switch-m42.js +56 -0
- package/dist/plugins/scheduler-support.d.ts +16 -1
- package/dist/plugins/scheduler-support.js +22 -2
- package/dist/plugins/schema-consistency.d.ts +131 -14
- package/dist/plugins/schema-consistency.js +388 -18
- package/dist/plugins/schema-drift-sentence.d.ts +10 -6
- package/dist/plugins/schema-drift-sentence.js +15 -7
- package/dist/plugins/schema-ensure-legs.d.ts +9 -0
- package/dist/plugins/schema-ensure-legs.js +1 -1
- package/dist/plugins/schema-indexes.js +3 -0
- package/dist/plugins/schema-live-columns.d.ts +14 -5
- package/dist/plugins/schema-live-columns.js +10 -10
- package/dist/plugins/send-user-file.js +2 -1
- package/dist/plugins/session-birth.d.ts +37 -0
- package/dist/plugins/session-birth.js +38 -0
- package/dist/plugins/session-epoch-anchor.d.ts +40 -12
- package/dist/plugins/session-epoch-anchor.js +33 -11
- package/dist/plugins/session-ext-table.d.ts +27 -3
- package/dist/plugins/session-ext-table.js +19 -6
- package/dist/plugins/session-fork.d.ts +15 -1
- package/dist/plugins/session-fork.js +3 -0
- package/dist/plugins/session-ownership.d.ts +1 -1
- package/dist/plugins/session-placement.d.ts +27 -20
- package/dist/plugins/session-placement.js +15 -12
- package/dist/plugins/session-row-sql.d.ts +12 -0
- package/dist/plugins/session-row-sql.js +3 -3
- package/dist/plugins/session-run-rollup.d.ts +29 -0
- package/dist/plugins/session-run-rollup.js +40 -0
- package/dist/plugins/session-store-sql.d.ts +38 -12
- package/dist/plugins/session-store-sql.js +130 -30
- package/dist/plugins/session-withdraw-sql.d.ts +36 -0
- package/dist/plugins/session-withdraw-sql.js +42 -0
- package/dist/plugins/shared-memory-store-sql.d.ts +0 -69
- package/dist/plugins/shared-memory-store-sql.js +2 -1
- package/dist/plugins/shell-sentinel-owner-m48.d.ts +42 -0
- package/dist/plugins/shell-sentinel-owner-m48.js +9 -0
- package/dist/plugins/snapshot-bucket-presence.d.ts +2 -1
- package/dist/plugins/sql-driver.d.ts +1 -1
- package/dist/plugins/sql-driver.js +2 -1
- package/dist/plugins/sql-errors.d.ts +32 -5
- package/dist/plugins/sql-errors.js +55 -7
- package/dist/plugins/sql-json-column.d.ts +8 -7
- package/dist/plugins/sql-json-column.js +10 -6
- package/dist/plugins/stop-then-start-sentence.d.ts +16 -0
- package/dist/plugins/stop-then-start-sentence.js +7 -0
- package/dist/plugins/store-backend.d.ts +99 -16
- package/dist/plugins/store-backend.js +230 -65
- package/dist/plugins/store-contracts.d.ts +123 -33
- package/dist/plugins/store-contracts.js +38 -1
- package/dist/plugins/store-fault.d.ts +28 -2
- package/dist/plugins/store-fault.js +20 -2
- package/dist/plugins/task-attachment-store.d.ts +15 -3
- package/dist/plugins/task-attachment-store.js +22 -9
- package/dist/plugins/tidb-pool.d.ts +11 -6
- package/dist/plugins/tidb-pool.js +39 -18
- package/dist/plugins/web-search.js +5 -3
- package/dist/plugins/workflow-run-store-sql.d.ts +6 -1
- package/dist/plugins/workflow-run-store-sql.js +11 -5
- package/dist/plugins/workspace-custody.d.ts +44 -0
- package/dist/plugins/workspace-custody.js +47 -0
- package/dist/principal-jwt.d.ts +4 -4
- package/dist/principal-jwt.js +20 -5
- package/dist/principal-shape.d.ts +41 -0
- package/dist/principal-shape.js +19 -0
- package/dist/project-identity.d.ts +8 -7
- package/dist/project-identity.js +40 -17
- package/dist/project-layer-key.d.ts +13 -2
- package/dist/project-layer-key.js +9 -1
- package/dist/question.d.ts +13 -23
- package/dist/question.js +21 -39
- package/dist/read-deny-floor-notice.d.ts +36 -0
- package/dist/read-deny-floor-notice.js +40 -0
- package/dist/{plain-string-record.d.ts → request-declaration-disposition.d.ts} +9 -23
- package/dist/request-declaration-disposition.js +39 -0
- package/dist/request-declaration-refusal.d.ts +35 -12
- package/dist/request-declaration-refusal.js +21 -9
- package/dist/request-form.d.ts +58 -0
- package/dist/request-form.js +72 -0
- package/dist/request-image-urls.d.ts +8 -2
- package/dist/request-image-urls.js +2 -1
- package/dist/request-images.d.ts +20 -0
- package/dist/request-images.js +59 -0
- package/dist/request-key-closure.d.ts +6 -7
- package/dist/request-key-closure.js +15 -2
- package/dist/resource-suspend.d.ts +7 -16
- package/dist/resource-suspend.js +1 -1
- package/dist/retired-name-host-notice.d.ts +21 -0
- package/dist/retired-name-host-notice.js +12 -0
- package/dist/rule-entry-list.d.ts +2 -2
- package/dist/rule-entry-list.js +3 -4
- package/dist/rule-issue-reading.d.ts +58 -0
- package/dist/rule-issue-reading.js +14 -0
- package/dist/rules-consent.d.ts +5 -3
- package/dist/rules-consent.js +1 -0
- package/dist/run-acceptance.d.ts +3 -1
- package/dist/run-acceptance.js +3 -0
- package/dist/run-cancel-card.d.ts +28 -0
- package/dist/run-cancel-card.js +19 -0
- package/dist/run-cancel-context.d.ts +10 -0
- package/dist/run-cancel-context.js +1 -0
- package/dist/run-local.d.ts +14 -6
- package/dist/run-local.js +117 -90
- package/dist/run-stale-default.d.ts +7 -0
- package/dist/run-stale-default.js +2 -0
- package/dist/runs.d.ts +56 -21
- package/dist/runs.js +73 -43
- package/dist/runtime-caps-resolver.d.ts +21 -6
- package/dist/runtime-caps-resolver.js +17 -4
- package/dist/runtime-governance.d.ts +2 -2
- package/dist/runtime-governance.js +5 -3
- package/dist/sealed-key-layout.d.ts +12 -5
- package/dist/sealed-key-layout.js +5 -0
- package/dist/sealed-key.d.ts +12 -2
- package/dist/sealed-key.js +115 -27
- package/dist/security.d.ts +128 -158
- package/dist/security.js +163 -59
- package/dist/sema-config-dir.d.ts +20 -0
- package/dist/sema-config-dir.js +25 -0
- package/dist/server-secret-env.d.ts +55 -25
- package/dist/server-secret-env.js +75 -22
- package/dist/session-agent.d.ts +3 -2
- package/dist/session-children-retire.d.ts +13 -8
- package/dist/session-children-retire.js +9 -7
- package/dist/session-deletion.d.ts +88 -0
- package/dist/session-deletion.js +8 -0
- package/dist/session-erase.d.ts +145 -0
- package/dist/session-erase.js +115 -0
- package/dist/session-error-wire.d.ts +5 -5
- package/dist/session-error-wire.js +1 -1
- package/dist/session-incarnation.d.ts +52 -5
- package/dist/session-incarnation.js +19 -2
- package/dist/session-policy-wire.d.ts +6 -3
- package/dist/session-policy-wire.js +11 -1
- package/dist/session-resident-background.d.ts +0 -71
- package/dist/session-resident-background.js +4 -3
- package/dist/session-row.d.ts +2 -1
- package/dist/session-rules-seat.d.ts +12 -0
- package/dist/session-rules-seat.js +19 -0
- package/dist/session-titler.d.ts +7 -15
- package/dist/session-titler.js +1 -1
- package/dist/session-workspace.d.ts +3 -3
- package/dist/spec-fields.d.ts +57 -3
- package/dist/spec-fields.js +72 -51
- package/dist/store-admission.d.ts +33 -0
- package/dist/store-admission.js +49 -0
- package/dist/store-posture.d.ts +141 -20
- package/dist/store-posture.js +205 -3
- package/dist/stored-request-hooks-m20.js +2 -2
- package/dist/stores-sql/background-agent-store-sql.d.ts +11 -2
- package/dist/stores-sql/background-agent-store-sql.js +73 -20
- package/dist/stores-sql/checkpoint-store-sql.d.ts +34 -29
- package/dist/stores-sql/checkpoint-store-sql.js +78 -49
- package/dist/stores-sql/file-history-store-sql.d.ts +1 -1
- package/dist/stores-sql/file-history-store-sql.js +3 -5
- package/dist/stores-sql/mailbox-store-sql.d.ts +7 -4
- package/dist/stores-sql/mailbox-store-sql.js +31 -32
- package/dist/stores-sql/pg-session-storage.d.ts +7 -5
- package/dist/stores-sql/pg-session-storage.js +54 -46
- package/dist/stores-sql/retention-store-sql.d.ts +87 -19
- package/dist/stores-sql/retention-store-sql.js +92 -27
- package/dist/stores-sql/session-policy-store-sql.d.ts +32 -10
- package/dist/stores-sql/session-policy-store-sql.js +44 -36
- package/dist/stores-sql/session-write-hooks.d.ts +12 -6
- package/dist/stores-sql/tidb-session-storage.d.ts +4 -4
- package/dist/stores-sql/tidb-session-storage.js +13 -8
- package/dist/stores-sql/tidb-session-store.d.ts +36 -17
- package/dist/stores-sql/tidb-session-store.js +69 -39
- package/dist/stores-sql/tool-result-store-sql.d.ts +1 -1
- package/dist/stores-sql/tool-result-store-sql.js +4 -6
- package/dist/stores-sql/windowed-session-storage.d.ts +5 -0
- package/dist/stores-sql/windowed-session-storage.js +9 -0
- package/dist/submission-exit.d.ts +50 -0
- package/dist/submission-exit.js +108 -0
- package/dist/task-a2a.d.ts +3 -8
- package/dist/task-a2a.js +28 -30
- package/dist/task-cwd.d.ts +43 -7
- package/dist/task-cwd.js +11 -0
- package/dist/task-mcp.d.ts +3 -3
- package/dist/task-mcp.js +4 -4
- package/dist/task-settings.d.ts +14 -10
- package/dist/task-settings.js +19 -7
- package/dist/terminal.d.ts +27 -43
- package/dist/terminal.js +49 -14
- package/dist/tool-approval.d.ts +173 -163
- package/dist/tool-approval.js +247 -232
- package/dist/trace/core-keyset-guard.d.ts +13 -6
- package/dist/trace/core-vocab-wire.d.ts +95 -0
- package/dist/trace/core-vocab-wire.js +15 -0
- package/dist/trace/engine-notice-wire.d.ts +24 -21
- package/dist/trace/engine-notice-wire.js +7 -3
- package/dist/trace/exit-seat.d.ts +30 -4
- package/dist/trace/exit-seat.js +40 -36
- package/dist/trace/extension-call-face.d.ts +3 -2
- package/dist/trace/extension-call-face.js +3 -1
- package/dist/trace/ledger-events.d.ts +4 -7
- package/dist/trace/ledger-sink.d.ts +4 -31
- package/dist/trace/ledger-sink.js +0 -11
- package/dist/trace/model-segment.d.ts +5 -5
- package/dist/trace/model-segment.js +5 -5
- package/dist/trace/project.d.ts +59 -44
- package/dist/trace/project.js +60 -26
- package/dist/trace/redact.d.ts +135 -27
- package/dist/trace/redact.js +884 -260
- package/dist/trace/self-minted-wire.d.ts +567 -20
- package/dist/trace/self-minted-wire.js +205 -24
- package/dist/trace/wire-projection-faces.d.ts +5 -6
- package/dist/trace/wire-projection-faces.js +2 -2
- package/dist/upstream-body.d.ts +23 -0
- package/dist/upstream-body.js +16 -0
- package/dist/url-refusal.d.ts +3 -3
- package/dist/url-refusal.js +11 -4
- package/dist/user-authored-text.d.ts +1 -1
- package/dist/user-input-ledger.d.ts +7 -8
- package/dist/user-input-ledger.js +1 -1
- package/dist/web-admin-client/apply-effective.d.ts +6 -3
- package/dist/web-admin-client/apply-effective.js +33 -23
- package/dist/web-admin-client/apply-ledger.d.ts +16 -7
- package/dist/web-admin-client/apply-ledger.js +5 -2
- package/dist/web-admin-client/center-request.d.ts +2 -2
- package/dist/web-admin-client/center-request.js +15 -15
- package/dist/web-admin-client/effective-keys.d.ts +1 -1
- package/dist/web-admin-client/effective-keys.js +1 -1
- package/dist/web-admin-client/entry-metadata.d.ts +8 -0
- package/dist/web-admin-client/entry-metadata.js +13 -0
- package/dist/web-admin-client/http-client.d.ts +1 -1
- package/dist/web-admin-client/http-client.js +23 -4
- package/dist/web-admin-client/mcp-revocation.d.ts +1 -1
- package/dist/web-admin-client/mcp-revocation.js +2 -1
- package/dist/web-admin-client/read-warnings.d.ts +1 -0
- package/dist/web-admin-client/read-warnings.js +1 -0
- package/dist/web-admin-client/restart-signal.js +8 -4
- package/dist/web-admin-client/skills-mcp.d.ts +2 -2
- package/dist/web-admin-client/types.d.ts +1 -2
- package/dist/workspace-space.d.ts +3 -2
- package/docs/DEVICE-EXECUTOR-PROTOCOL.md +4 -4
- package/docs/error-text-lexicon.json +317 -0
- package/package.json +8 -3
- package/scripts/drain-check-local.mjs +118 -147
- package/scripts/drain-check.mysql.sql +22 -2
- package/scripts/drain-check.pg.sql +22 -2
- package/scripts/embed-minimal.mjs +183 -0
- package/wire-changes/server@7.148.0.json +1517 -0
- package/wire-changes/server@7.149.0.json +372 -0
- package/dist/http/memory-control-plane-corrupt-reply.d.ts +0 -25
- package/dist/http/memory-control-plane-corrupt-reply.js +0 -19
- package/dist/http/memory-layer-reply.d.ts +0 -30
- package/dist/http/memory-layer-reply.js +0 -24
- package/dist/lsp/e2b-bridge.d.ts +0 -57
- package/dist/lsp/e2b-bridge.js +0 -139
- package/dist/lsp/e2b-manager.d.ts +0 -93
- package/dist/lsp/e2b-manager.js +0 -178
- package/dist/lsp/lsp-frames.d.ts +0 -14
- package/dist/lsp/lsp-frames.js +0 -25
- package/dist/lsp/manager.d.ts +0 -129
- package/dist/lsp/manager.js +0 -127
- package/dist/lsp/types.d.ts +0 -12
- package/dist/lsp/types.js +0 -2
- package/dist/lsp/ws-transport.d.ts +0 -40
- package/dist/lsp/ws-transport.js +0 -210
- package/dist/plain-string-record.js +0 -70
package/dist/tool-approval.js
CHANGED
|
@@ -3,18 +3,20 @@ import { heldAskOf, liveHostSource, readDecider, retiredDecisionKeyFacts, POLICY
|
|
|
3
3
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
4
4
|
import { uuidv7, classifyAsk, foldArbitrationRow, policyCannotAnswer, screenAskClassMembers, MAX_RULE_TEXT_CHARS, READ_ROOT_CANDIDATE_DIR_MAX, parseRuleText, pathConfinableWriteToolNames } from "@sema-agent/core";
|
|
5
5
|
import { precheckCardRuleText } from "./rules-consent.js";
|
|
6
|
-
import {
|
|
6
|
+
import { CARD_RULE_FORM_OF_MATCH, cardRuleFormOf } from "./permission-rule-vocab.js";
|
|
7
7
|
import { redactDeep, redactSecrets, redactSecretsWithArms } from "./trace/redact.js";
|
|
8
8
|
import { seatText } from "./trace/exit-seat.js";
|
|
9
9
|
import { hasBidiControls } from "./text-bidi.js";
|
|
10
10
|
import { approvalPayloadFingerprint } from "./plugins/approval-payload-fingerprint.js";
|
|
11
11
|
import { createLogger } from "./observability/logger.js";
|
|
12
12
|
import { errorKindOf } from "./observability/err-text.js";
|
|
13
|
+
import { createHitlOpenRace, deliverHitlNotice } from "./hitl-delivery.js";
|
|
13
14
|
import { recordFailOpen } from "./observability/fail-open.js";
|
|
14
15
|
import { ownerOfCheckpointScope } from "./security.js";
|
|
16
|
+
import { keyAdmits, ownerCellOf, recoveredSubject } from "./owner-faces.js";
|
|
15
17
|
import { deriveAskId, deriveAskScopedBatchId, deriveBatchId, MAX_DECISION_NOTE_CHARS, noteLandedOnRow, noteRecordedReceipt, readBoundInputHash } from "./approval-ask-machine.js";
|
|
16
18
|
import { askDemandsAPerson, storedPersonDemandRecord, currentParkArm, MAX_RULE_OFFERS, buildApprovalCard, buildApprovalCardEnvelope, adoptStoredLiveFacts, buildApprovalRequestFrame, buildReplayFrame, buildRevokeFrame, readDenialLimitFallback, readProbeCause, readProbeReason, readReadRootCandidate, readStoredCardEnvelope, readRuleEvidence, readAllowRuleShadowed, readRuleOffersAbsence, readRuleOffersAbsenceSeat, readParkRowTrueSeat, readAskClassPair, readAskReasons, readClosedWordSeat, buildApprovalCompleteFrame, readRuleOfferList, } from "./approval-card.js";
|
|
17
|
-
import {
|
|
19
|
+
import { askRowCarriesOwner, POLICY_REFUSAL_DECISION, projectAskTerminalClaimTruth } from "./plugins/approval-ask-store-sql.js";
|
|
18
20
|
import { APPROVAL_ENDING_CAUSES, SETTLE_OUTCOME, askRowEndingCause, askRowParkTrigger } from "./approval-deny-reasons.js";
|
|
19
21
|
import { settleByPolicy } from "./approval-policy-settlement.js";
|
|
20
22
|
import { governanceAskMarksFor, runWithGovernanceAskScope } from "./governance-ask-marks.js";
|
|
@@ -35,7 +37,7 @@ const ADOPT_OPEN_ASKS_MAX = 1_000;
|
|
|
35
37
|
const EDITED_DECISION_MARK_CAP_MS = 10_000;
|
|
36
38
|
const DEFAULT_WINDOW_MARGIN_MS = 10_000;
|
|
37
39
|
const SHUTDOWN_DRAIN_POLL_MS = 50;
|
|
38
|
-
const MAX_ALLOW_SESSIONS = 4096;
|
|
40
|
+
export const MAX_ALLOW_SESSIONS = 4096;
|
|
39
41
|
const DEFAULT_ADMIT_MAX_PER_TASK = 32;
|
|
40
42
|
const DEFAULT_ADMIT_MAX_PER_OWNER = 256;
|
|
41
43
|
const DEFAULT_PARK_REDEMPTION_MAX = 2000;
|
|
@@ -46,8 +48,10 @@ const PARKING_RETRY_AFTER_MS = 250;
|
|
|
46
48
|
export function approvalDecidePath(sessionId) {
|
|
47
49
|
return `/v1/approvals/${encodeURIComponent(sessionId)}/decide`;
|
|
48
50
|
}
|
|
49
|
-
function parkSessionOf(row) {
|
|
50
|
-
|
|
51
|
+
export function parkSessionOf(row) {
|
|
52
|
+
if (row.state === "PARKED")
|
|
53
|
+
return row.sourceSessionId;
|
|
54
|
+
return row.sourceSessionId !== row.taskId ? row.sourceSessionId : undefined;
|
|
51
55
|
}
|
|
52
56
|
function ruleMaterialCarriesCredentialShape(command) {
|
|
53
57
|
return redactSecretsWithArms(command, { observe: false }).arms.has("full");
|
|
@@ -111,8 +115,10 @@ const FS_WRITE_TOOLS = pathConfinableWriteToolNames();
|
|
|
111
115
|
function sessionAllowCategory(toolName) {
|
|
112
116
|
return FS_WRITE_TOOLS.has(toolName) ? "fs-write" : `tool:${toolName}`;
|
|
113
117
|
}
|
|
114
|
-
function sessionAllowKey(owner, sessionId, category, binding) {
|
|
115
|
-
|
|
118
|
+
function sessionAllowKey(owner, sessionId, incarnation, category, binding) {
|
|
119
|
+
if (!sessionId || !incarnation)
|
|
120
|
+
return undefined;
|
|
121
|
+
return JSON.stringify([owner, sessionId, incarnation, category, binding.kind === "bound" ? binding.digest : null]);
|
|
116
122
|
}
|
|
117
123
|
function askStandingAnswerFacts(req, governanceForced, deploymentListAsks) {
|
|
118
124
|
const classes = screenAskClassMembers(req.askClass, req.classes)?.classes;
|
|
@@ -223,11 +229,14 @@ function mandatedFromSeat(seat) {
|
|
|
223
229
|
return false;
|
|
224
230
|
}
|
|
225
231
|
}
|
|
226
|
-
function rowOrUnknown(read) {
|
|
227
|
-
return read.kind === "row" ? read.row : null;
|
|
228
|
-
}
|
|
229
232
|
function askRowVisibleTo(row, principal) {
|
|
230
|
-
return row !== null &&
|
|
233
|
+
return row !== null && askOwnerAdmitsAnswer(row.owner, principal);
|
|
234
|
+
}
|
|
235
|
+
function askOwnerAdmitsAnswer(owner, principal) {
|
|
236
|
+
return keyAdmits("ask.answer", { subject: recoveredSubject(principal), operator: false }, ownerCellOf(owner));
|
|
237
|
+
}
|
|
238
|
+
function receiptAnswersNow(redeemedGeneration, openGenerationNow) {
|
|
239
|
+
return redeemedGeneration === undefined || openGenerationNow === undefined || openGenerationNow <= redeemedGeneration;
|
|
231
240
|
}
|
|
232
241
|
function waitingLegsReached(entry, othersReached) {
|
|
233
242
|
return (entry.adopted === true ? 0 : 1) + othersReached;
|
|
@@ -257,8 +266,10 @@ function livePendingRowOf(e) {
|
|
|
257
266
|
...(e.adopted === true ? { consumerState: ASK_DECISION_CONSUMER_ABSENT } : {}),
|
|
258
267
|
};
|
|
259
268
|
}
|
|
269
|
+
const _legFamiliesAreFrameFamilies = true;
|
|
270
|
+
void _legFamiliesAreFrameFamilies;
|
|
260
271
|
function canPresentWithoutDurableRow(c) {
|
|
261
|
-
return c.
|
|
272
|
+
return c.family === "tool_approval";
|
|
262
273
|
}
|
|
263
274
|
export const PERSIST_RULE_TEXT_ERROR = `persistRule.rule must be a non-empty string of at most ${MAX_RULE_TEXT_CHARS} characters`;
|
|
264
275
|
export const PERSIST_RULE_EDITED_FLAG_ERROR = "persistRule.edited must be a boolean when present";
|
|
@@ -435,49 +446,6 @@ export function declaredApprovalFrameFamilies(settings) {
|
|
|
435
446
|
const raw = Reflect.get(settings, "approvalFrameFamilies");
|
|
436
447
|
return new Set(Array.isArray(raw) ? raw.filter((w) => APPROVAL_FRAME_FAMILIES.includes(w)) : []);
|
|
437
448
|
}
|
|
438
|
-
export function createApprovalCardEmitter(sinks) {
|
|
439
|
-
const present = [sinks.appendDurable, sinks.writeLive].filter((w) => w !== undefined);
|
|
440
|
-
const attempt = (write, frame) => (async () => {
|
|
441
|
-
try {
|
|
442
|
-
await write(frame);
|
|
443
|
-
return true;
|
|
444
|
-
}
|
|
445
|
-
catch (err) {
|
|
446
|
-
defaultLogger.warn("approval_card_sink_write_failed", { frame: frame.type, approvalId: frame.approvalId, errKind: errorKindOf(err) });
|
|
447
|
-
return false;
|
|
448
|
-
}
|
|
449
|
-
})();
|
|
450
|
-
const opened = new Map();
|
|
451
|
-
return async (frame, registration) => {
|
|
452
|
-
if (frame.type === "approval_request") {
|
|
453
|
-
const results = present.map((write) => attempt(write, frame));
|
|
454
|
-
opened.set(registration, results);
|
|
455
|
-
const accepted = await new Promise((resolve) => {
|
|
456
|
-
let pending = results.length;
|
|
457
|
-
if (pending === 0)
|
|
458
|
-
resolve(false);
|
|
459
|
-
for (const r of results) {
|
|
460
|
-
void r.then((ok) => {
|
|
461
|
-
if (ok)
|
|
462
|
-
resolve(true);
|
|
463
|
-
else if (--pending === 0)
|
|
464
|
-
resolve(false);
|
|
465
|
-
});
|
|
466
|
-
}
|
|
467
|
-
});
|
|
468
|
-
if (!accepted) {
|
|
469
|
-
opened.delete(registration);
|
|
470
|
-
throw new Error("approval card undeliverable — no sink accepted the frame (live stream closed and/or the durable append failed)");
|
|
471
|
-
}
|
|
472
|
-
return;
|
|
473
|
-
}
|
|
474
|
-
const results = opened.get(registration);
|
|
475
|
-
opened.delete(registration);
|
|
476
|
-
if (results === undefined)
|
|
477
|
-
return;
|
|
478
|
-
await Promise.all(present.map((write, i) => results[i].then((ok) => (ok ? attempt(write, frame) : false))));
|
|
479
|
-
};
|
|
480
|
-
}
|
|
481
449
|
export function resolveApprovalLeg(input) {
|
|
482
450
|
const active = input.streamApprovalOn;
|
|
483
451
|
const tightDeadline = active && input.legWalltimeMs !== undefined && input.legWalltimeMs - input.windowMarginMs <= 0;
|
|
@@ -767,14 +735,14 @@ export class ToolApprovalCoordinator {
|
|
|
767
735
|
}
|
|
768
736
|
});
|
|
769
737
|
}
|
|
770
|
-
static ruleOfferDerivedFactsAgree(offer) {
|
|
738
|
+
static ruleOfferDerivedFactsAgree(offer, cardTool) {
|
|
771
739
|
const derive = (rule) => {
|
|
772
740
|
const p = parseRuleText(rule, "allow");
|
|
773
741
|
return "rule" in p ? p.rule : undefined;
|
|
774
742
|
};
|
|
775
743
|
if (offer.kind === "single") {
|
|
776
744
|
const d = derive(offer.rule);
|
|
777
|
-
return d !== undefined && d.rule === offer.rule && d.match === offer.match && d.command === offer.command && ToolApprovalCoordinator.
|
|
745
|
+
return d !== undefined && d.rule === offer.rule && d.match === offer.match && d.command === offer.command && ToolApprovalCoordinator.singleOfferBelongsOnCard(d.match, d.tool, cardTool);
|
|
778
746
|
}
|
|
779
747
|
return offer.rules.every((m) => {
|
|
780
748
|
const d = derive(m.rule);
|
|
@@ -790,40 +758,21 @@ export class ToolApprovalCoordinator {
|
|
|
790
758
|
}
|
|
791
759
|
});
|
|
792
760
|
}
|
|
793
|
-
static
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
case "prefix":
|
|
797
|
-
case "wildcard":
|
|
798
|
-
case "pattern":
|
|
799
|
-
return tool === "Bash";
|
|
800
|
-
case "tool":
|
|
801
|
-
return cardTakesWholeToolConsent(tool);
|
|
802
|
-
case "subpath":
|
|
803
|
-
case "path":
|
|
804
|
-
case "name":
|
|
805
|
-
case "name_prefix":
|
|
806
|
-
case "host":
|
|
807
|
-
case "subdomain":
|
|
808
|
-
return false;
|
|
809
|
-
default: {
|
|
810
|
-
const unknown = match;
|
|
811
|
-
void unknown;
|
|
812
|
-
return false;
|
|
813
|
-
}
|
|
814
|
-
}
|
|
761
|
+
static singleOfferBelongsOnCard(match, ruleTool, cardTool) {
|
|
762
|
+
const form = CARD_RULE_FORM_OF_MATCH[match];
|
|
763
|
+
return ruleTool === cardTool && form !== undefined && form === cardRuleFormOf(cardTool);
|
|
815
764
|
}
|
|
816
|
-
static boundRuleOfferTexts(offers) {
|
|
765
|
+
static boundRuleOfferTexts(offers, cardTool) {
|
|
817
766
|
const over = (s) => s.length > MAX_RULE_TEXT_CHARS;
|
|
818
767
|
const clipSegment = (s) => (over(s) ? s.slice(0, MAX_RULE_TEXT_CHARS) : s);
|
|
819
768
|
const out = [];
|
|
820
769
|
for (const { offer } of readRuleOfferList(offers)) {
|
|
821
770
|
if (ToolApprovalCoordinator.ruleOfferTextsOverSize(offer))
|
|
822
771
|
return undefined;
|
|
823
|
-
if (!ToolApprovalCoordinator.ruleOfferDerivedFactsAgree(offer)) {
|
|
772
|
+
if (!ToolApprovalCoordinator.ruleOfferDerivedFactsAgree(offer, cardTool)) {
|
|
824
773
|
defaultLogger.warn("rule_offer_dropped_derived_facts_disagree", {
|
|
825
774
|
kind: offer.kind,
|
|
826
|
-
note: "an offer's kind/match/command/directory seats do not agree with what the shared validator derives from its rule text — dropped whole so the card never shows one grant while redeeming another (core/dist skew or forged material?)",
|
|
775
|
+
note: "an offer's kind/match/command/directory seats do not agree with what the shared validator derives from its rule text, or it is not this card's tool / card form — dropped whole so the card never shows one grant while redeeming another (core/dist skew or forged material?)",
|
|
827
776
|
});
|
|
828
777
|
continue;
|
|
829
778
|
}
|
|
@@ -860,11 +809,9 @@ export class ToolApprovalCoordinator {
|
|
|
860
809
|
return out;
|
|
861
810
|
}
|
|
862
811
|
static cardBindingOf(args, offers) {
|
|
863
|
-
const
|
|
864
|
-
if (
|
|
865
|
-
return
|
|
866
|
-
if (offers.some(isWholeTool))
|
|
867
|
-
return undefined;
|
|
812
|
+
const valueOffers = offers.filter((o) => o.kind === "single" && CARD_RULE_FORM_OF_MATCH[o.match] !== "command");
|
|
813
|
+
if (valueOffers.length > 0)
|
|
814
|
+
return valueOffers.length === 1 && offers.length === 1 ? valueOffers[0].command : undefined;
|
|
868
815
|
if (args === null || typeof args !== "object" || Array.isArray(args))
|
|
869
816
|
return undefined;
|
|
870
817
|
const command = args.command;
|
|
@@ -881,7 +828,7 @@ export class ToolApprovalCoordinator {
|
|
|
881
828
|
if (!Array.isArray(rawOffers) || rawOffers.length === 0)
|
|
882
829
|
return undefined;
|
|
883
830
|
const capped = rawOffers.length > MAX_RULE_OFFERS ? rawOffers.slice(0, MAX_RULE_OFFERS) : rawOffers;
|
|
884
|
-
const offers = ToolApprovalCoordinator.boundRuleOfferTexts(capped);
|
|
831
|
+
const offers = ToolApprovalCoordinator.boundRuleOfferTexts(capped, req.toolName);
|
|
885
832
|
if (offers === undefined)
|
|
886
833
|
return undefined;
|
|
887
834
|
const command = ToolApprovalCoordinator.cardBindingOf(req.args, offers);
|
|
@@ -1012,7 +959,8 @@ export class ToolApprovalCoordinator {
|
|
|
1012
959
|
const sessionId = origin.sessionId;
|
|
1013
960
|
if (!sessionId)
|
|
1014
961
|
return false;
|
|
1015
|
-
const
|
|
962
|
+
const liveKey = sessionAllowKey(origin.owner, sessionId, origin.incarnation, sessionAllowCategory(req.toolName), facts.grantBinding);
|
|
963
|
+
const live = liveKey !== undefined && this.allowAllSessions.has(liveKey);
|
|
1016
964
|
const durable = !live && facts.grantBinding.kind === "none" && (await this.durableGrantHas(sessionId, req.toolName));
|
|
1017
965
|
if (!live && !durable)
|
|
1018
966
|
return false;
|
|
@@ -1036,7 +984,14 @@ export class ToolApprovalCoordinator {
|
|
|
1036
984
|
}
|
|
1037
985
|
boundUnattendedAsk = (identity, why) => {
|
|
1038
986
|
return async (req) => {
|
|
1039
|
-
const origin = {
|
|
987
|
+
const origin = {
|
|
988
|
+
owner: identity.owner,
|
|
989
|
+
taskId: identity.taskId,
|
|
990
|
+
...(identity.sessionId !== undefined ? { sessionId: identity.sessionId } : {}),
|
|
991
|
+
legKey: "",
|
|
992
|
+
executionLane: identity.executionLane,
|
|
993
|
+
...(identity.incarnation !== undefined ? { incarnation: identity.incarnation } : {}),
|
|
994
|
+
};
|
|
1040
995
|
if (await this.standingGrantSettles(origin, req, this.governanceForcedOf(origin, req)))
|
|
1041
996
|
return true;
|
|
1042
997
|
return this.unattendedAskOutcome({ ...why, taskId: identity.taskId, owner: identity.owner, toolName: req.toolName });
|
|
@@ -1224,15 +1179,9 @@ export class ToolApprovalCoordinator {
|
|
|
1224
1179
|
emitRevokeTo(ctxs, frame) {
|
|
1225
1180
|
if (frame.askIds.length === 0)
|
|
1226
1181
|
return;
|
|
1227
|
-
for (const c of ctxs)
|
|
1228
|
-
if (
|
|
1229
|
-
|
|
1230
|
-
try {
|
|
1231
|
-
void Promise.resolve(c.emitRevoke(frame)).catch(() => undefined);
|
|
1232
|
-
}
|
|
1233
|
-
catch {
|
|
1234
|
-
}
|
|
1235
|
-
}
|
|
1182
|
+
for (const c of ctxs)
|
|
1183
|
+
if (c.family === "approval_request")
|
|
1184
|
+
void deliverHitlNotice(c.transport, frame);
|
|
1236
1185
|
}
|
|
1237
1186
|
emitRevoke(frame, target) {
|
|
1238
1187
|
const targets = new Set();
|
|
@@ -1288,6 +1237,7 @@ export class ToolApprovalCoordinator {
|
|
|
1288
1237
|
...(ctx.sessionId !== undefined ? { sessionId: ctx.sessionId } : {}),
|
|
1289
1238
|
legKey: ctx.legKey ?? "",
|
|
1290
1239
|
executionLane: ctx.executionLane,
|
|
1240
|
+
...(ctx.incarnation !== undefined ? { incarnation: ctx.incarnation } : {}),
|
|
1291
1241
|
...(ctx.legDeadlineMonotonic !== undefined ? { legDeadlineMonotonic: ctx.legDeadlineMonotonic } : {}),
|
|
1292
1242
|
}, [ctx], req, signal);
|
|
1293
1243
|
};
|
|
@@ -1301,6 +1251,7 @@ export class ToolApprovalCoordinator {
|
|
|
1301
1251
|
...(identity.sessionId !== undefined ? { sessionId: identity.sessionId } : {}),
|
|
1302
1252
|
legKey: identity.legKey ?? "",
|
|
1303
1253
|
executionLane: identity.executionLane,
|
|
1254
|
+
...(identity.incarnation !== undefined ? { incarnation: identity.incarnation } : {}),
|
|
1304
1255
|
...(identity.legDeadlineMonotonic !== undefined ? { legDeadlineMonotonic: identity.legDeadlineMonotonic } : {}),
|
|
1305
1256
|
}, live, req, signal);
|
|
1306
1257
|
};
|
|
@@ -1583,6 +1534,7 @@ export class ToolApprovalCoordinator {
|
|
|
1583
1534
|
const allowedP = new Promise((resolve) => { resolveAllowed = resolve; });
|
|
1584
1535
|
let lastOutcome = SETTLE_OUTCOME.EXPIRED;
|
|
1585
1536
|
let lastCause;
|
|
1537
|
+
let completeFrame;
|
|
1586
1538
|
const abortListeners = [];
|
|
1587
1539
|
let selfEntry;
|
|
1588
1540
|
let hostSettled;
|
|
@@ -1646,8 +1598,10 @@ export class ToolApprovalCoordinator {
|
|
|
1646
1598
|
}
|
|
1647
1599
|
lastOutcome = outcome;
|
|
1648
1600
|
lastCause = verdict.by === "system" ? verdict.cause : undefined;
|
|
1649
|
-
if (
|
|
1650
|
-
|
|
1601
|
+
if (askId !== undefined) {
|
|
1602
|
+
completeFrame = buildApprovalCompleteFrame({ askId, taskId: origin.taskId, approvalId: wireApprovalId, outcome, ...(lastCause !== undefined ? { cause: lastCause } : {}), parked: parkRouted, nowMs: Date.now() });
|
|
1603
|
+
if (lastLiveRegistration)
|
|
1604
|
+
this.notifyPresentedCardWatchers(askId, completeFrame);
|
|
1651
1605
|
}
|
|
1652
1606
|
releaseAdmission();
|
|
1653
1607
|
if (selfEntry)
|
|
@@ -1952,10 +1906,12 @@ export class ToolApprovalCoordinator {
|
|
|
1952
1906
|
forceParkNow,
|
|
1953
1907
|
settleParkRoute: (cause) => settleParkRouteIfUnsettled(undefined, cause),
|
|
1954
1908
|
owner: origin.owner,
|
|
1909
|
+
ownerReadSeq: this.rowReadSeq,
|
|
1955
1910
|
...(primary ? { ctxTaskId: primary.taskId, originCtx: primary } : {}),
|
|
1956
1911
|
...(reachability === "unreached" ? { suspended: true } : {}),
|
|
1957
1912
|
...(child ? { originTaskId: req.sourceSessionId } : primary ? { targetCtxs: new Set(aliveCtxs), onTargetGone } : {}),
|
|
1958
1913
|
...(origin.sessionId ? { sessionId: origin.sessionId } : {}),
|
|
1914
|
+
...(origin.incarnation !== undefined ? { incarnation: origin.incarnation } : {}),
|
|
1959
1915
|
frame,
|
|
1960
1916
|
...(cardFrame !== undefined ? { cardFrame } : {}),
|
|
1961
1917
|
approvalId: wireApprovalId,
|
|
@@ -2014,38 +1970,24 @@ export class ToolApprovalCoordinator {
|
|
|
2014
1970
|
frame.serverNowMs = serverNowMs;
|
|
2015
1971
|
frame.expiresInMs = Math.max(0, persistedExpiresAtMs - serverNowMs);
|
|
2016
1972
|
}
|
|
2017
|
-
const
|
|
2018
|
-
|
|
2019
|
-
|
|
2020
|
-
|
|
2021
|
-
|
|
2022
|
-
|
|
2023
|
-
|
|
2024
|
-
|
|
2025
|
-
|
|
2026
|
-
|
|
2027
|
-
|
|
2028
|
-
|
|
2029
|
-
|
|
2030
|
-
|
|
2031
|
-
|
|
2032
|
-
else {
|
|
2033
|
-
family = "tool_approval";
|
|
2034
|
-
send = () => c.emit(frame);
|
|
2035
|
-
}
|
|
2036
|
-
try {
|
|
2037
|
-
await send();
|
|
2038
|
-
return { delivered: true };
|
|
2039
|
-
}
|
|
2040
|
-
catch (err) {
|
|
2041
|
-
defaultLogger.warn("approval_card_delivery_failed", { taskId: origin.taskId, approvalId: wireApprovalId, family, errKind: errorKindOf(err) });
|
|
2042
|
-
return { delivered: false };
|
|
2043
|
-
}
|
|
2044
|
-
};
|
|
2045
|
-
const openByCtx = new Map(aliveCtxs.map((c) => [c, emitOne(c)]));
|
|
1973
|
+
const cardCtxs = aliveCtxs.filter((c) => c.family === "approval_request");
|
|
1974
|
+
const legacyCtxs = aliveCtxs.filter((c) => c.family === "tool_approval");
|
|
1975
|
+
if (cardFrame === undefined && cardCtxs.length > 0) {
|
|
1976
|
+
defaultLogger.warn("approval card leg cannot present this ask: it has no confirmed durable identity (no approval_request frame is minted without one)", {
|
|
1977
|
+
taskId: origin.taskId,
|
|
1978
|
+
approvalId: wireApprovalId,
|
|
1979
|
+
toolName: req.toolName,
|
|
1980
|
+
});
|
|
1981
|
+
}
|
|
1982
|
+
const cardRace = cardFrame !== undefined && cardCtxs.length > 0
|
|
1983
|
+
? createHitlOpenRace({ targets: cardCtxs.map((c) => ({ transport: c.transport, frame: cardFrame })), settled: allowedP })
|
|
1984
|
+
: undefined;
|
|
1985
|
+
const legacyRace = legacyCtxs.length > 0 ? createHitlOpenRace({ targets: legacyCtxs.map((c) => ({ transport: c.transport, frame })), settled: allowedP }) : undefined;
|
|
1986
|
+
if (cardRace !== undefined && cardFrame !== undefined)
|
|
1987
|
+
cardCtxs.forEach((c, i) => this.notePresentedCardRegistration(cardFrame.askId, c.transport, cardRace.acceptedLive(i)));
|
|
2046
1988
|
const emitAllP = (async () => {
|
|
2047
|
-
const
|
|
2048
|
-
const anySucceeded = reachability === "unreached" || this.hasOtherSuspendedOwner(askId, selfEntry) ||
|
|
1989
|
+
const landings = await Promise.all([cardRace?.landing, legacyRace?.landing]);
|
|
1990
|
+
const anySucceeded = reachability === "unreached" || this.hasOtherSuspendedOwner(askId, selfEntry) || landings.includes("delivered");
|
|
2049
1991
|
emitSettled = true;
|
|
2050
1992
|
if (!anySucceeded && !done) {
|
|
2051
1993
|
if (this.askStore && askId !== undefined && batchId !== undefined) {
|
|
@@ -2086,35 +2028,15 @@ export class ToolApprovalCoordinator {
|
|
|
2086
2028
|
})();
|
|
2087
2029
|
await Promise.race([emitAllP, allowedP]);
|
|
2088
2030
|
const settled = await allowedP;
|
|
2089
|
-
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
return c.emitCard(buildApprovalCompleteFrame({
|
|
2099
|
-
askId: cardFrame.askId,
|
|
2100
|
-
taskId: cardFrame.taskId,
|
|
2101
|
-
approvalId: wireApprovalId,
|
|
2102
|
-
outcome: lastOutcome,
|
|
2103
|
-
...(lastCause !== undefined ? { cause: lastCause } : {}),
|
|
2104
|
-
parked: parkRouted,
|
|
2105
|
-
nowMs: Date.now(),
|
|
2106
|
-
}), id);
|
|
2107
|
-
}
|
|
2108
|
-
return c.emit({
|
|
2109
|
-
type: "tool_approval_complete",
|
|
2110
|
-
approvalId: wireApprovalId,
|
|
2111
|
-
outcome: lastOutcome,
|
|
2112
|
-
...(lastCause !== undefined ? { cause: lastCause } : {}),
|
|
2113
|
-
...(parkRouted ? { parked: true } : {}),
|
|
2114
|
-
});
|
|
2115
|
-
})
|
|
2116
|
-
.catch(() => undefined);
|
|
2117
|
-
}
|
|
2031
|
+
if (cardRace !== undefined && completeFrame !== undefined)
|
|
2032
|
+
cardRace.close(completeFrame);
|
|
2033
|
+
legacyRace?.close({
|
|
2034
|
+
type: "tool_approval_complete",
|
|
2035
|
+
approvalId: wireApprovalId,
|
|
2036
|
+
outcome: lastOutcome,
|
|
2037
|
+
...(lastCause !== undefined ? { cause: lastCause } : {}),
|
|
2038
|
+
...(parkRouted ? { parked: true } : {}),
|
|
2039
|
+
});
|
|
2118
2040
|
if (emitFailed)
|
|
2119
2041
|
return this.unattendedOutcome({ arm: "emit_failed", taskId: origin.taskId, ...(origin.owner !== null ? { owner: origin.owner } : {}), toolName: req.toolName, reachability });
|
|
2120
2042
|
if (windowRouteUnavailable)
|
|
@@ -2133,7 +2055,7 @@ export class ToolApprovalCoordinator {
|
|
|
2133
2055
|
const entry = this.liveEntryFor(id);
|
|
2134
2056
|
if (entry?.adopted === true)
|
|
2135
2057
|
return this.respondByRow(entry, id, principal, parsed, httpReq);
|
|
2136
|
-
if (entry !== undefined &&
|
|
2058
|
+
if (entry !== undefined && askOwnerAdmitsAnswer(entry.owner, principal))
|
|
2137
2059
|
return this.answerRegistration(entry, entry.owner, id, principal, parsed, httpReq);
|
|
2138
2060
|
if (entry !== undefined && this.registrationHasRow(entry))
|
|
2139
2061
|
return this.respondByRow(entry, id, principal, parsed, httpReq);
|
|
@@ -2145,10 +2067,10 @@ export class ToolApprovalCoordinator {
|
|
|
2145
2067
|
async respondByRow(entry, id, principal, parsed, httpReq) {
|
|
2146
2068
|
const store = this.askStore;
|
|
2147
2069
|
if (!store)
|
|
2148
|
-
return this.
|
|
2149
|
-
const row =
|
|
2070
|
+
return this.askNotVisible();
|
|
2071
|
+
const row = await this.askRowFollowingOwner(store, id, "getAsk(respond-by-row)");
|
|
2150
2072
|
if (!askRowVisibleTo(row, principal))
|
|
2151
|
-
return this.
|
|
2073
|
+
return this.askNotVisible();
|
|
2152
2074
|
if (row.state !== "STREAM_PENDING")
|
|
2153
2075
|
return this.dispatchRowTruth(row, id, parsed, httpReq, principal);
|
|
2154
2076
|
return this.answerRegistration(entry, row.owner, id, principal, parsed, httpReq);
|
|
@@ -2240,31 +2162,27 @@ export class ToolApprovalCoordinator {
|
|
|
2240
2162
|
}),
|
|
2241
2163
|
};
|
|
2242
2164
|
}
|
|
2165
|
+
askNotVisible() {
|
|
2166
|
+
return { status: 404, body: refusalBody({ errorCode: "not_found.ask", message: "no such approval ask (never existed, no longer kept, or not yours)" }) };
|
|
2167
|
+
}
|
|
2243
2168
|
readApproval(id, principal) {
|
|
2244
2169
|
const entry = this.liveEntryFor(id);
|
|
2245
2170
|
if (entry !== undefined && this.registrationHasRow(entry))
|
|
2246
2171
|
return this.readByRow(entry, id, principal);
|
|
2247
|
-
if (entry !== undefined &&
|
|
2172
|
+
if (entry !== undefined && askOwnerAdmitsAnswer(entry.owner, principal)) {
|
|
2248
2173
|
const body = { state: "pending", ...livePendingRowOf(entry) };
|
|
2249
2174
|
return { status: 200, body };
|
|
2250
2175
|
}
|
|
2251
2176
|
const store = this.askStore;
|
|
2252
2177
|
if (!store)
|
|
2253
|
-
return this.
|
|
2178
|
+
return this.askNotVisible();
|
|
2254
2179
|
return this.readAskRowState(store, id, principal);
|
|
2255
2180
|
}
|
|
2256
2181
|
async readByRow(entry, id, principal) {
|
|
2257
2182
|
const store = this.askStore;
|
|
2258
2183
|
if (!store)
|
|
2259
|
-
return this.
|
|
2260
|
-
const
|
|
2261
|
-
if (read.kind === "unreadable") {
|
|
2262
|
-
if (entry.adopted === true || !askOwnerAdmits(entry.owner, principal))
|
|
2263
|
-
return this.notPending(NOT_PENDING_UNKNOWN_CAUSE);
|
|
2264
|
-
const body = { state: "pending", ...livePendingRowOf(entry) };
|
|
2265
|
-
return { status: 200, body };
|
|
2266
|
-
}
|
|
2267
|
-
const row = rowOrUnknown(read);
|
|
2184
|
+
return this.askNotVisible();
|
|
2185
|
+
const row = await this.askRowFollowingOwner(store, id, "getAsk(read-by-row)");
|
|
2268
2186
|
if (askRowVisibleTo(row, principal) && row.state === "STREAM_PENDING") {
|
|
2269
2187
|
const body = { state: "pending", ...livePendingRowOf(entry) };
|
|
2270
2188
|
return { status: 200, body };
|
|
@@ -2272,23 +2190,27 @@ export class ToolApprovalCoordinator {
|
|
|
2272
2190
|
return this.readStateOfRow(row, principal);
|
|
2273
2191
|
}
|
|
2274
2192
|
async readAskRowState(store, id, principal) {
|
|
2275
|
-
return this.readStateOfRow(
|
|
2193
|
+
return this.readStateOfRow(await this.askRowFor(store, id, "getAsk(read)"), principal);
|
|
2276
2194
|
}
|
|
2277
2195
|
async readParkedGate(row) {
|
|
2278
2196
|
const gate = this.parkedGate;
|
|
2279
2197
|
if (gate === undefined || row.gateToken === null)
|
|
2280
|
-
return
|
|
2198
|
+
return undefined;
|
|
2281
2199
|
try {
|
|
2282
2200
|
return await this.withStoreDeadline(gate({ gateToken: row.gateToken, gateBoundCallId: row.gateBoundCallId }), "readParkedGate", DURABLE_CONVERGE_READ_TIMEOUT_MS);
|
|
2283
2201
|
}
|
|
2284
2202
|
catch (err) {
|
|
2285
2203
|
this.noteStoreError(err, "readParkedGate");
|
|
2286
|
-
return
|
|
2204
|
+
return undefined;
|
|
2287
2205
|
}
|
|
2288
2206
|
}
|
|
2207
|
+
async openGateGeneration(row) {
|
|
2208
|
+
const gate = await this.readParkedGate(row);
|
|
2209
|
+
return gate?.kind === "open" ? gate.generation : undefined;
|
|
2210
|
+
}
|
|
2289
2211
|
async readStateOfRow(row, principal) {
|
|
2290
2212
|
if (!askRowVisibleTo(row, principal))
|
|
2291
|
-
return this.
|
|
2213
|
+
return this.askNotVisible();
|
|
2292
2214
|
const projection = buildAskRowReadProjection(row, Date.now());
|
|
2293
2215
|
let body;
|
|
2294
2216
|
switch (row.state) {
|
|
@@ -2301,13 +2223,13 @@ export class ToolApprovalCoordinator {
|
|
|
2301
2223
|
}
|
|
2302
2224
|
case "PARKING":
|
|
2303
2225
|
case "PARKED": {
|
|
2304
|
-
const gate = row.state === "PARKED" ? await this.readParkedGate(row) :
|
|
2226
|
+
const gate = row.state === "PARKED" ? await this.readParkedGate(row) : undefined;
|
|
2227
|
+
if (gate === undefined || gate.kind === "open") {
|
|
2228
|
+
const parkSession = parkSessionOf(row);
|
|
2229
|
+
body = { state: "parked", ...projection, ...(parkSession !== undefined ? { decidePath: approvalDecidePath(parkSession) } : {}), ...(gate?.reopened !== undefined ? { reopened: gate.reopened } : {}) };
|
|
2230
|
+
break;
|
|
2231
|
+
}
|
|
2305
2232
|
switch (gate.kind) {
|
|
2306
|
-
case "open": {
|
|
2307
|
-
const parkSession = parkSessionOf(row);
|
|
2308
|
-
body = { state: "parked", ...projection, ...(parkSession !== undefined ? { decidePath: approvalDecidePath(parkSession) } : {}), ...(gate.reopened !== undefined ? { reopened: gate.reopened } : {}) };
|
|
2309
|
-
break;
|
|
2310
|
-
}
|
|
2311
2233
|
case "decided":
|
|
2312
2234
|
body = { state: "decided", ...projection, decision: gate.decision, decidedAtMs: gate.decidedAtMs, ...(gate.decisionNote !== undefined ? { decisionNote: gate.decisionNote } : {}) };
|
|
2313
2235
|
break;
|
|
@@ -2350,11 +2272,11 @@ export class ToolApprovalCoordinator {
|
|
|
2350
2272
|
respondLate(id, principal, parsed, httpReq) {
|
|
2351
2273
|
const store = this.askStore;
|
|
2352
2274
|
if (!store)
|
|
2353
|
-
return this.
|
|
2275
|
+
return this.askNotVisible();
|
|
2354
2276
|
return this.dispatchLateByRow(store, id, parsed, httpReq, principal);
|
|
2355
2277
|
}
|
|
2356
|
-
watchPresentedCards(askIds, deliver) {
|
|
2357
|
-
const watcher = { deliver, askIds: new Set() };
|
|
2278
|
+
watchPresentedCards(askIds, deliver, connection) {
|
|
2279
|
+
const watcher = { deliver, connection, askIds: new Set(), registrationsOnConnection: new Map() };
|
|
2358
2280
|
for (const askId of askIds) {
|
|
2359
2281
|
if (!this.pendingByAskId.has(askId))
|
|
2360
2282
|
continue;
|
|
@@ -2370,13 +2292,26 @@ export class ToolApprovalCoordinator {
|
|
|
2370
2292
|
for (const askId of watcher.askIds)
|
|
2371
2293
|
this.dropPresentedCardWatcher(askId, watcher);
|
|
2372
2294
|
watcher.askIds.clear();
|
|
2295
|
+
watcher.registrationsOnConnection.clear();
|
|
2373
2296
|
};
|
|
2374
2297
|
}
|
|
2298
|
+
notePresentedCardRegistration(askId, transport, acceptedLive) {
|
|
2299
|
+
for (const watcher of this.presentedCardWatchers.get(askId) ?? []) {
|
|
2300
|
+
if (watcher.connection() !== transport)
|
|
2301
|
+
continue;
|
|
2302
|
+
const opens = watcher.registrationsOnConnection.get(askId);
|
|
2303
|
+
if (opens === undefined)
|
|
2304
|
+
watcher.registrationsOnConnection.set(askId, [acceptedLive]);
|
|
2305
|
+
else
|
|
2306
|
+
opens.push(acceptedLive);
|
|
2307
|
+
}
|
|
2308
|
+
}
|
|
2375
2309
|
dropPresentedCardWatcher(askId, watcher) {
|
|
2376
2310
|
const set = this.presentedCardWatchers.get(askId);
|
|
2377
2311
|
if (set === undefined)
|
|
2378
2312
|
return;
|
|
2379
2313
|
set.delete(watcher);
|
|
2314
|
+
watcher.registrationsOnConnection.delete(askId);
|
|
2380
2315
|
if (set.size === 0)
|
|
2381
2316
|
this.presentedCardWatchers.delete(askId);
|
|
2382
2317
|
}
|
|
@@ -2387,12 +2322,20 @@ export class ToolApprovalCoordinator {
|
|
|
2387
2322
|
this.presentedCardWatchers.delete(askId);
|
|
2388
2323
|
for (const watcher of set) {
|
|
2389
2324
|
watcher.askIds.delete(askId);
|
|
2390
|
-
|
|
2391
|
-
|
|
2392
|
-
|
|
2393
|
-
|
|
2394
|
-
|
|
2395
|
-
|
|
2325
|
+
const opens = watcher.registrationsOnConnection.get(askId) ?? [];
|
|
2326
|
+
watcher.registrationsOnConnection.delete(askId);
|
|
2327
|
+
const write = () => {
|
|
2328
|
+
try {
|
|
2329
|
+
watcher.deliver(frame);
|
|
2330
|
+
}
|
|
2331
|
+
catch (err) {
|
|
2332
|
+
defaultLogger.warn("presented-card completion notice could not be written to its connection", { askId, error: err instanceof Error ? err.message : String(err) });
|
|
2333
|
+
}
|
|
2334
|
+
};
|
|
2335
|
+
if (opens.length === 0)
|
|
2336
|
+
write();
|
|
2337
|
+
else
|
|
2338
|
+
void Promise.all(opens).then((accepted) => (accepted.includes(true) ? undefined : write()));
|
|
2396
2339
|
}
|
|
2397
2340
|
}
|
|
2398
2341
|
liveEntryFor(id) {
|
|
@@ -2404,24 +2347,27 @@ export class ToolApprovalCoordinator {
|
|
|
2404
2347
|
return undefined;
|
|
2405
2348
|
}
|
|
2406
2349
|
async dispatchLateByRow(store, id, parsed, httpReq, principal) {
|
|
2407
|
-
return this.dispatchRowTruth(
|
|
2350
|
+
return this.dispatchRowTruth(await this.askRowFor(store, id, "getAsk(respond-late)"), id, parsed, httpReq, principal);
|
|
2408
2351
|
}
|
|
2409
2352
|
async askRowFor(store, id, label) {
|
|
2410
2353
|
try {
|
|
2411
|
-
|
|
2412
|
-
return row === null ? { kind: "absent" } : { kind: "row", row };
|
|
2354
|
+
return await this.withStoreDeadline(store.getAsk(id), label, DURABLE_CONVERGE_READ_TIMEOUT_MS);
|
|
2413
2355
|
}
|
|
2414
2356
|
catch (err) {
|
|
2415
2357
|
this.noteStoreError(err, label);
|
|
2416
|
-
return
|
|
2358
|
+
return null;
|
|
2417
2359
|
}
|
|
2418
2360
|
}
|
|
2361
|
+
async askRowFollowingOwner(store, id, label) {
|
|
2362
|
+
const readSeq = this.nextRowReadSeq();
|
|
2363
|
+
const row = await this.askRowFor(store, id, label);
|
|
2364
|
+
if (row?.state === "STREAM_PENDING")
|
|
2365
|
+
this.followRowOwner(row.askId, row.owner, readSeq);
|
|
2366
|
+
return row;
|
|
2367
|
+
}
|
|
2419
2368
|
async dispatchRowTruth(row, id, parsed, httpReq, principal) {
|
|
2420
2369
|
if (!askRowVisibleTo(row, principal))
|
|
2421
|
-
return this.
|
|
2422
|
-
const receipt = this.lookupParkRedemption(row.askId);
|
|
2423
|
-
if (receipt?.redeemed !== undefined)
|
|
2424
|
-
return this.replayRedeemReceipt(id, receipt, row, receipt.redeemed, parsed);
|
|
2370
|
+
return this.askNotVisible();
|
|
2425
2371
|
switch (row.state) {
|
|
2426
2372
|
case "DECIDED":
|
|
2427
2373
|
return this.replayDecidedAsk(id, row, parsed);
|
|
@@ -2494,14 +2440,17 @@ export class ToolApprovalCoordinator {
|
|
|
2494
2440
|
defaultLogger.error("tool approval parked row carries no gate token — nothing to redeem", { askId: row.askId });
|
|
2495
2441
|
return this.notPending();
|
|
2496
2442
|
}
|
|
2443
|
+
const openGenerationNow = this.lookupParkRedemption(row.askId) !== undefined ? await this.openGateGeneration(row) : undefined;
|
|
2497
2444
|
const prior = this.lookupParkRedemption(row.askId);
|
|
2498
|
-
if (prior?.redeemed !== undefined)
|
|
2445
|
+
if (prior?.redeemed !== undefined && receiptAnswersNow(prior.redeemed.gateGeneration, openGenerationNow))
|
|
2499
2446
|
return this.replayRedeemReceipt(id, prior, row, prior.redeemed, parsed);
|
|
2500
2447
|
if (prior?.inflight !== undefined) {
|
|
2501
2448
|
const shared = await prior.inflight;
|
|
2502
2449
|
if (shared.status < 200 || shared.status >= 300)
|
|
2503
2450
|
return shared;
|
|
2504
|
-
|
|
2451
|
+
if (!receiptAnswersNow(shared.gateGeneration, openGenerationNow))
|
|
2452
|
+
return this.redeemParkedAsk(id, row, parsed, httpReq, principal);
|
|
2453
|
+
return this.replayRedeemReceipt(id, prior, row, { decision: shared.decision, body: shared.body, gateGeneration: shared.gateGeneration, ...(shared.rule?.terminal === true ? { rule: shared.rule.body } : {}) }, parsed);
|
|
2505
2454
|
}
|
|
2506
2455
|
const admission = this.parkRedemptionAdmission(row.owner);
|
|
2507
2456
|
if (admission !== undefined)
|
|
@@ -2550,7 +2499,7 @@ export class ToolApprovalCoordinator {
|
|
|
2550
2499
|
}
|
|
2551
2500
|
const rule = out.rule;
|
|
2552
2501
|
if (this.retainParkRedemption(row.askId, memo))
|
|
2553
|
-
memo.redeemed = { decision, body: out.body, ...(rule?.terminal === true ? { rule: rule.body } : {}) };
|
|
2502
|
+
memo.redeemed = { decision, body: out.body, gateGeneration: out.gateGeneration, ...(rule?.terminal === true ? { rule: rule.body } : {}) };
|
|
2554
2503
|
return {
|
|
2555
2504
|
status: out.status,
|
|
2556
2505
|
body: {
|
|
@@ -2779,17 +2728,33 @@ export class ToolApprovalCoordinator {
|
|
|
2779
2728
|
this.noteStoreError(err, "decideAsk");
|
|
2780
2729
|
ruleEligibility.eligible = false;
|
|
2781
2730
|
try {
|
|
2731
|
+
const confirmSeq = this.nextRowReadSeq();
|
|
2782
2732
|
const row = await this.withStoreDeadline(askStore.getAsk(askId), "getAsk(decideAsk-confirm)", DURABLE_CONVERGE_READ_TIMEOUT_MS);
|
|
2783
|
-
if (row
|
|
2733
|
+
if (row?.state === "STREAM_PENDING")
|
|
2734
|
+
this.followRowOwner(askId, row.owner, confirmSeq);
|
|
2735
|
+
if (row === null || !askRowCarriesOwner(row, owner))
|
|
2784
2736
|
return { lost: true, row: null };
|
|
2785
|
-
if (row
|
|
2737
|
+
if (row.state === "DECIDED" && row.decision === (parsed.value === "deny" ? "deny" : "approve")) {
|
|
2786
2738
|
winnerRow = row;
|
|
2787
2739
|
ambiguousConfirmedRow = row;
|
|
2788
2740
|
noteLanded = noteLandedOnRow(parsed.note, row.decisionNote);
|
|
2789
2741
|
}
|
|
2742
|
+
else if (row.state !== "STREAM_PENDING") {
|
|
2743
|
+
return { lost: true, row };
|
|
2744
|
+
}
|
|
2790
2745
|
}
|
|
2791
2746
|
catch (confirmErr) {
|
|
2792
2747
|
this.noteStoreError(confirmErr, "getAsk(decideAsk-confirm)");
|
|
2748
|
+
return {
|
|
2749
|
+
lost: false,
|
|
2750
|
+
result: {
|
|
2751
|
+
status: 500,
|
|
2752
|
+
body: refusalBody({
|
|
2753
|
+
errorCode: "internal.error",
|
|
2754
|
+
message: "the approval store failed while recording this answer and could not be read back, so whether the answer was recorded is unknown — retry: a retry returns the recorded answer if it was recorded, or records it if it was not",
|
|
2755
|
+
}),
|
|
2756
|
+
},
|
|
2757
|
+
};
|
|
2793
2758
|
}
|
|
2794
2759
|
}
|
|
2795
2760
|
const wantAllowed = parsed.value !== "deny";
|
|
@@ -2831,15 +2796,20 @@ export class ToolApprovalCoordinator {
|
|
|
2831
2796
|
throw new Error(`unhandled standing-answer home: ${String(unhandled)}`);
|
|
2832
2797
|
}
|
|
2833
2798
|
}
|
|
2834
|
-
if (parsed.value === "allow_session")
|
|
2835
|
-
|
|
2836
|
-
|
|
2837
|
-
if (
|
|
2838
|
-
|
|
2839
|
-
|
|
2840
|
-
|
|
2799
|
+
if (parsed.value === "allow_session") {
|
|
2800
|
+
const grantKey = grantable ? sessionAllowKey(judgedOwner, entry.sessionId, entry.incarnation, sessionAllowCategory(entry.toolName), entry.grantBinding) : undefined;
|
|
2801
|
+
rememberApplied = grantKey !== undefined;
|
|
2802
|
+
if (grantKey !== undefined) {
|
|
2803
|
+
if (this.allowAllSessions.size >= MAX_ALLOW_SESSIONS) {
|
|
2804
|
+
const oldest = this.allowAllSessions.values().next().value;
|
|
2805
|
+
if (oldest !== undefined)
|
|
2806
|
+
this.allowAllSessions.delete(oldest);
|
|
2807
|
+
}
|
|
2808
|
+
this.allowAllSessions.add(grantKey);
|
|
2809
|
+
}
|
|
2810
|
+
else if (grantable && entry.sessionId) {
|
|
2811
|
+
defaultLogger.warn("session_grant_refused_occupant_unreadable", { sessionId: entry.sessionId, toolName: entry.toolName });
|
|
2841
2812
|
}
|
|
2842
|
-
this.allowAllSessions.add(sessionAllowKey(judgedOwner, entry.sessionId, sessionAllowCategory(entry.toolName), entry.grantBinding));
|
|
2843
2813
|
}
|
|
2844
2814
|
const allowed = parsed.value !== "deny";
|
|
2845
2815
|
const settleArgs = opts?.settleOutcome !== undefined
|
|
@@ -2939,6 +2909,7 @@ export class ToolApprovalCoordinator {
|
|
|
2939
2909
|
forceParkNow: release,
|
|
2940
2910
|
settleParkRoute: (cause) => leave({ outcome: SETTLE_OUTCOME.EXPIRED, cause, parked: this.unattendedRoutesToPark }),
|
|
2941
2911
|
owner: row.owner,
|
|
2912
|
+
ownerReadSeq: this.rowReadSeq,
|
|
2942
2913
|
executionLane: row.executionLane,
|
|
2943
2914
|
...(row.sessionId !== row.taskId ? { sessionId: row.sessionId } : {}),
|
|
2944
2915
|
...(card.fromSubagent === true ? { originTaskId: row.sourceSessionId } : {}),
|
|
@@ -2972,10 +2943,42 @@ export class ToolApprovalCoordinator {
|
|
|
2972
2943
|
for (const watcher of watchers)
|
|
2973
2944
|
watcher.askIds.delete(askId);
|
|
2974
2945
|
}
|
|
2975
|
-
|
|
2976
|
-
for (const e of this.pendingByAskId.get(askId) ?? [])
|
|
2977
|
-
if (e.
|
|
2978
|
-
|
|
2946
|
+
followRowOwner(askId, owner, readSeq) {
|
|
2947
|
+
for (const e of this.pendingByAskId.get(askId) ?? []) {
|
|
2948
|
+
if (e.ownerReadSeq >= readSeq)
|
|
2949
|
+
continue;
|
|
2950
|
+
e.owner = owner;
|
|
2951
|
+
e.ownerReadSeq = readSeq;
|
|
2952
|
+
}
|
|
2953
|
+
}
|
|
2954
|
+
rowReadSeq = 0;
|
|
2955
|
+
nextRowReadSeq() {
|
|
2956
|
+
this.rowReadSeq += 1;
|
|
2957
|
+
return this.rowReadSeq;
|
|
2958
|
+
}
|
|
2959
|
+
async followRowOwners() {
|
|
2960
|
+
const store = this.askStore;
|
|
2961
|
+
const out = { read: 0, followed: 0, unreadable: 0 };
|
|
2962
|
+
if (!store)
|
|
2963
|
+
return out;
|
|
2964
|
+
for (const askId of [...this.pendingByAskId.keys()]) {
|
|
2965
|
+
out.read += 1;
|
|
2966
|
+
const readSeq = this.nextRowReadSeq();
|
|
2967
|
+
let row;
|
|
2968
|
+
try {
|
|
2969
|
+
row = await this.withStoreDeadline(store.getAsk(askId), "getAsk(follow-row-owners)", DURABLE_CONVERGE_READ_TIMEOUT_MS);
|
|
2970
|
+
}
|
|
2971
|
+
catch (err) {
|
|
2972
|
+
this.noteStoreError(err, "getAsk(follow-row-owners)");
|
|
2973
|
+
out.unreadable += 1;
|
|
2974
|
+
continue;
|
|
2975
|
+
}
|
|
2976
|
+
if (row?.state !== "STREAM_PENDING")
|
|
2977
|
+
continue;
|
|
2978
|
+
this.followRowOwner(askId, row.owner, readSeq);
|
|
2979
|
+
out.followed += 1;
|
|
2980
|
+
}
|
|
2981
|
+
return out;
|
|
2979
2982
|
}
|
|
2980
2983
|
waitingRegistrationCount(askId) {
|
|
2981
2984
|
let n = 0;
|
|
@@ -2984,18 +2987,29 @@ export class ToolApprovalCoordinator {
|
|
|
2984
2987
|
n += 1;
|
|
2985
2988
|
return n;
|
|
2986
2989
|
}
|
|
2987
|
-
listLivePending(scope) {
|
|
2988
|
-
const rows = [];
|
|
2990
|
+
async listLivePending(scope) {
|
|
2989
2991
|
const owner = scope === undefined ? undefined : ownerOfCheckpointScope(scope);
|
|
2990
|
-
const
|
|
2991
|
-
|
|
2992
|
-
|
|
2993
|
-
|
|
2994
|
-
|
|
2995
|
-
|
|
2996
|
-
|
|
2997
|
-
|
|
2998
|
-
|
|
2992
|
+
const inScope = (rowOwner) => owner === undefined || rowOwner === owner;
|
|
2993
|
+
const candidates = new Map();
|
|
2994
|
+
for (const e of this.pending.values())
|
|
2995
|
+
if (!candidates.has(e.approvalId))
|
|
2996
|
+
candidates.set(e.approvalId, e);
|
|
2997
|
+
const store = this.askStore;
|
|
2998
|
+
const ids = [...candidates.keys()];
|
|
2999
|
+
const listed = await Promise.all([...candidates.values()].map(async (entry) => {
|
|
3000
|
+
if (store === undefined || !this.registrationHasRow(entry))
|
|
3001
|
+
return inScope(entry.owner);
|
|
3002
|
+
const ask = await this.askRowFollowingOwner(store, entry.askId, "getAsk(list-live)");
|
|
3003
|
+
return ask?.state === "STREAM_PENDING" && inScope(ask.owner);
|
|
3004
|
+
}));
|
|
3005
|
+
const rows = [];
|
|
3006
|
+
ids.forEach((id, i) => {
|
|
3007
|
+
if (!listed[i])
|
|
3008
|
+
return;
|
|
3009
|
+
const current = this.liveEntryFor(id);
|
|
3010
|
+
if (current !== undefined)
|
|
3011
|
+
rows.push(livePendingRowOf(current));
|
|
3012
|
+
});
|
|
2999
3013
|
return rows;
|
|
3000
3014
|
}
|
|
3001
3015
|
hasLivePendingFromLeg(names) {
|
|
@@ -3051,6 +3065,7 @@ export class ToolApprovalCoordinator {
|
|
|
3051
3065
|
else
|
|
3052
3066
|
this.adoptedPollOffset = adoptedStart + ++polledAdopted;
|
|
3053
3067
|
let row;
|
|
3068
|
+
const readSeq = this.nextRowReadSeq();
|
|
3054
3069
|
try {
|
|
3055
3070
|
row = await this.withStoreDeadline(store.getAsk(askId), "getAsk(poll-suspended)", DURABLE_CONVERGE_READ_TIMEOUT_MS);
|
|
3056
3071
|
}
|
|
@@ -3063,7 +3078,7 @@ export class ToolApprovalCoordinator {
|
|
|
3063
3078
|
continue;
|
|
3064
3079
|
}
|
|
3065
3080
|
if (row.state === "STREAM_PENDING") {
|
|
3066
|
-
this.
|
|
3081
|
+
this.followRowOwner(askId, row.owner, readSeq);
|
|
3067
3082
|
continue;
|
|
3068
3083
|
}
|
|
3069
3084
|
if (this.editedDecisionInFlight(askId))
|