@sema-agent/server 7.133.0 → 7.135.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 +221 -0
- package/README.md +2 -2
- package/README.zh-CN.md +2 -2
- package/USAGE.md +222 -36
- package/deploy/sema-up/README.md +16 -0
- package/deploy/sema-up/chart/Chart.yaml +1 -1
- package/deploy/sema-up/chart/templates/NOTES.txt +15 -0
- package/deploy/sema-up/chart/templates/_helpers.tpl +129 -0
- package/deploy/sema-up/chart/templates/sealed-key.yaml +24 -0
- package/deploy/sema-up/chart/templates/server-v4pro.yaml +14 -0
- package/deploy/sema-up/chart/templates/server.yaml +14 -0
- package/deploy/sema-up/chart/values-full-single.yaml +5 -1
- package/deploy/sema-up/chart/values.yaml +34 -0
- package/dist/adoption/plan.d.ts +1 -1
- package/dist/approval-ask-audit-store.d.ts +25 -25
- package/dist/approval-ask-machine.d.ts +2 -2
- package/dist/approval-card.d.ts +66 -154
- package/dist/approval-card.js +33 -52
- package/dist/approval-content-kind.d.ts +26 -6
- package/dist/approval-content-kind.js +23 -3
- package/dist/approval-deny-reasons.d.ts +1 -1
- package/dist/approval-gate-currency.d.ts +91 -0
- package/dist/approval-gate-currency.js +120 -0
- package/dist/approval-hmac.d.ts +7 -7
- package/dist/approval-policy-settlement.d.ts +2 -2
- package/dist/approval-reconciler.d.ts +3 -3
- package/dist/approval.d.ts +14 -8
- package/dist/approval.js +35 -16
- package/dist/auth-bridge.d.ts +1 -1
- package/dist/auto-mode-face.d.ts +4 -4
- package/dist/background-session-reap.d.ts +2 -2
- package/dist/bake-runner/main.d.ts +2 -2
- package/dist/bake-runner/runner.d.ts +4 -4
- package/dist/bench/s1/live-deps.d.ts +1 -1
- package/dist/bench/s1/run-firm.d.ts +1 -1
- package/dist/boot/coordinators.d.ts +7 -2
- package/dist/boot/coordinators.js +8 -5
- package/dist/boot/deferred-sandbox-path-env.d.ts +0 -6
- package/dist/boot/deferred-sandbox-path-env.js +0 -5
- package/dist/boot/engine-lease.d.ts +5 -5
- package/dist/boot/execution-env.d.ts +16 -15
- package/dist/boot/execution-env.js +19 -21
- package/dist/boot/fatal-exit.d.ts +2 -2
- package/dist/boot/late-binds.d.ts +1 -1
- package/dist/boot/leader.d.ts +2 -0
- package/dist/boot/leader.js +2 -1
- package/dist/boot/memory-boundary.d.ts +2 -2
- package/dist/boot/memory-consolidation.d.ts +15 -15
- package/dist/boot/parked-revive-gate.d.ts +3 -3
- package/dist/boot/parked-revive-gate.js +3 -2
- package/dist/boot/read-deny-anchor-audit.js +2 -2
- package/dist/boot/reapers.d.ts +4 -4
- package/dist/boot/resolve-spec.d.ts +1 -1
- package/dist/boot/resolve-spec.js +28 -24
- package/dist/boot/runner-deps.d.ts +29 -16
- package/dist/boot/runner-deps.js +12 -2
- package/dist/boot/session-faces.d.ts +3 -3
- package/dist/boot/session-faces.js +11 -30
- package/dist/boot/shutdown.d.ts +5 -5
- package/dist/boot/side-query-lane.d.ts +2 -2
- package/dist/boot/stage-05-execution-env.js +4 -4
- package/dist/boot/stage-06-runners.d.ts +4 -3
- package/dist/boot/stage-06-runners.js +15 -4
- package/dist/boot/stage-07-capability-layer.d.ts +2 -1
- package/dist/boot/stage-08-reapers.d.ts +2 -1
- package/dist/boot/stage-09-leader.d.ts +2 -1
- package/dist/boot/stage-09-leader.js +2 -2
- package/dist/boot/stage-10-http-server.d.ts +2 -1
- package/dist/boot/stage-10-http-server.js +2 -1
- package/dist/boot/stores.d.ts +8 -0
- package/dist/boot/stores.js +10 -13
- package/dist/boot/web-admin.d.ts +21 -15
- package/dist/boot/web-admin.js +16 -12
- package/dist/boot/workflow-orchestration.js +2 -9
- package/dist/brain.d.ts +11 -11
- package/dist/budget.d.ts +4 -4
- package/dist/budget.js +5 -1
- package/dist/caller-text-echo.d.ts +2 -0
- package/dist/caller-text-echo.js +2 -1
- package/dist/canonical-json.d.ts +2 -41
- package/dist/canonical-json.js +2 -13
- package/dist/capabilities/approvals-push.d.ts +4 -4
- package/dist/capabilities/builtin-tools.d.ts +5 -5
- package/dist/capabilities/center-plugins.d.ts +5 -5
- package/dist/capabilities/center-plugins.js +1 -1
- package/dist/capabilities/center-prompts.d.ts +1 -1
- package/dist/capabilities/center-wiring.d.ts +1 -1
- package/dist/capabilities/composite-members.d.ts +2 -2
- package/dist/capabilities/composite-members.js +1 -1
- package/dist/capabilities/execution-lane.d.ts +5 -5
- package/dist/capabilities/execution-lane.js +2 -2
- package/dist/capabilities/hands-lane.d.ts +5 -5
- package/dist/capabilities/mcp-probe.d.ts +10 -7
- package/dist/capabilities/mcp-probe.js +2 -2
- package/dist/capabilities/sandbox-file-send.d.ts +1 -18
- package/dist/capabilities/sandbox-file-send.js +0 -7
- package/dist/capabilities/scenarios.d.ts +28 -10
- package/dist/capabilities/scenarios.js +15 -5
- package/dist/capabilities/send-user-file-tool.d.ts +1 -1
- package/dist/capabilities/skills.d.ts +31 -12
- package/dist/capabilities/skills.js +23 -17
- package/dist/capabilities/tool-defer.d.ts +1 -1
- package/dist/capability-facts.d.ts +27 -24
- package/dist/capability-facts.js +18 -20
- package/dist/center-config-tier.d.ts +1 -1
- package/dist/center-credential.d.ts +4 -4
- package/dist/checkpoint-ctx-seal-m28.d.ts +42 -0
- package/dist/checkpoint-ctx-seal-m28.js +19 -0
- package/dist/checkpoint-identity.d.ts +5 -0
- package/dist/checkpoint-identity.js +14 -0
- package/dist/config-catalog.d.ts +12 -12
- package/dist/config-invariants.d.ts +4 -4
- package/dist/config-invariants.js +3 -2
- package/dist/config-lkg.d.ts +1 -1
- package/dist/config-provider.d.ts +13 -13
- package/dist/config-provider.js +2 -1
- package/dist/config-types.d.ts +83 -83
- package/dist/config.d.ts +26 -24
- package/dist/config.js +12 -10
- package/dist/cross-session-settings.d.ts +1 -1
- package/dist/delegated-session-owner.d.ts +16 -13
- package/dist/delegated-session-owner.js +9 -10
- package/dist/deployment-governance.d.ts +16 -16
- package/dist/deployment-shape.d.ts +127 -0
- package/dist/deployment-shape.js +72 -0
- package/dist/device-store.d.ts +1 -1
- package/dist/device-ws-hub.d.ts +1 -1
- package/dist/egress-redirect.d.ts +1 -1
- package/dist/entry-mode-clamp-notice.d.ts +2 -2
- package/dist/env-facts.d.ts +10 -9
- package/dist/env-facts.js +1 -1
- package/dist/env-name-allowlist-knobs.d.ts +5 -5
- package/dist/exec-bounds.d.ts +2 -2
- package/dist/execution-lane-caps.d.ts +31 -43
- package/dist/execution-lane-caps.js +0 -13
- package/dist/field-conflict.d.ts +2 -1
- package/dist/field-conflict.js +1 -0
- package/dist/file-history-capture.d.ts +9 -9
- package/dist/file-history-disclosure.d.ts +50 -9
- package/dist/file-history-disclosure.js +8 -13
- package/dist/fleet/drain-entry.d.ts +2 -2
- package/dist/fleet/fleet-bus.d.ts +26 -14
- package/dist/fleet/fleet-bus.js +6 -5
- package/dist/fleet/fleet-reconciler.d.ts +9 -9
- package/dist/fleet/subagent-tail-bus.d.ts +4 -4
- package/dist/fleet-client.d.ts +13 -13
- package/dist/fleet-lease.d.ts +16 -16
- package/dist/governance-http-status.d.ts +2 -2
- package/dist/hooks/hook-llm.d.ts +7 -7
- package/dist/hooks/hook-runner.d.ts +57 -30
- package/dist/hooks/hook-runner.js +38 -20
- package/dist/host-decision.d.ts +5 -5
- package/dist/host-lsp-manager.d.ts +5 -5
- package/dist/hosted-posture.d.ts +23 -13
- package/dist/hosted-posture.js +4 -9
- package/dist/http/admission.d.ts +2 -2
- package/dist/http/admission.js +28 -5
- package/dist/http/approval-sweeps.d.ts +1 -1
- package/dist/http/approval-sweeps.js +5 -2
- package/dist/http/checkpoint-ctx.d.ts +183 -2
- package/dist/http/checkpoint-ctx.js +197 -2
- package/dist/http/dispatch.d.ts +3 -3
- package/dist/http/dispatch.js +3 -3
- package/dist/http/durable-run-leg.js +7 -5
- package/dist/http/idempotency.d.ts +4 -4
- package/dist/http/idempotency.js +2 -2
- package/dist/http/mcp-dial-deadline.d.ts +7 -5
- package/dist/http/memory-compliance-failure-reply.d.ts +4 -4
- package/dist/http/owner-access.d.ts +4 -6
- package/dist/http/owner-access.js +1 -1
- package/dist/http/principal-gate.d.ts +39 -13
- package/dist/http/principal-gate.js +30 -6
- package/dist/http/readiness.d.ts +1 -1
- package/dist/http/refusal-body.d.ts +12 -0
- package/dist/http/refusal-body.js +11 -0
- package/dist/http/request-guards.d.ts +4 -13
- package/dist/http/request-guards.js +4 -17
- package/dist/http/resume-ctx-read.d.ts +53 -6
- package/dist/http/resume-ctx-read.js +26 -3
- package/dist/http/resume-legs.d.ts +5 -4
- package/dist/http/resume-legs.js +47 -29
- package/dist/http/route-ctx.d.ts +29 -38
- package/dist/http/route-table.d.ts +9 -9
- package/dist/http/routes/agents-roster.d.ts +1 -1
- package/dist/http/routes/agents-roster.js +2 -3
- package/dist/http/routes/approvals-assistant.d.ts +5 -5
- package/dist/http/routes/approvals-assistant.js +91 -17
- package/dist/http/routes/background.d.ts +3 -3
- package/dist/http/routes/background.js +2 -2
- package/dist/http/routes/capabilities.d.ts +1 -1
- package/dist/http/routes/capabilities.js +16 -8
- package/dist/http/routes/config-catalog.d.ts +1 -1
- package/dist/http/routes/devices.d.ts +1 -1
- package/dist/http/routes/diagnostics.d.ts +6 -6
- package/dist/http/routes/diagnostics.js +1 -1
- package/dist/http/routes/fleet.d.ts +1 -1
- package/dist/http/routes/fleet.js +5 -4
- package/dist/http/routes/mcp-reconnect.d.ts +4 -4
- package/dist/http/routes/mcp-reconnect.js +3 -3
- package/dist/http/routes/memory-consolidation.d.ts +1 -1
- package/dist/http/routes/memory-origin.d.ts +1 -1
- package/dist/http/routes/notify-wake.d.ts +1 -1
- package/dist/http/routes/notify-wake.js +2 -2
- package/dist/http/routes/rules.d.ts +1 -1
- package/dist/http/routes/rules.js +4 -4
- package/dist/http/routes/runs.js +44 -11
- package/dist/http/routes/session-sync.d.ts +3 -2
- package/dist/http/routes/session-sync.js +109 -62
- package/dist/http/routes/sessions-list.d.ts +1 -1
- package/dist/http/routes/sessions-list.js +4 -5
- package/dist/http/routes/sessions.js +34 -48
- package/dist/http/routes/tasks.d.ts +1 -1
- package/dist/http/routes/tasks.js +21 -16
- package/dist/http/routes/trace-usage.d.ts +1 -1
- package/dist/http/routes/trace-usage.js +7 -9
- package/dist/http/routes/workflows.d.ts +3 -0
- package/dist/http/routes/workflows.js +31 -28
- package/dist/http/send.d.ts +5 -5
- package/dist/http/server.d.ts +39 -33
- package/dist/http/server.js +5 -2
- package/dist/http/session-inherit-env.d.ts +3 -3
- package/dist/http/sse-lifecycle.d.ts +1 -1
- package/dist/http/sse-log.d.ts +2 -2
- package/dist/http/submit-ctx.d.ts +4 -3
- package/dist/http/submit-ctx.js +19 -3
- package/dist/http/sync-submit-body.d.ts +1 -1
- package/dist/http/verify-rounds.d.ts +1 -1
- package/dist/http/wire-types.d.ts +35 -24
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/instruction-source-notice.d.ts +2 -2
- package/dist/key-resolver.d.ts +3 -3
- package/dist/lane-home-probe.d.ts +1 -1
- package/dist/leader/diffout.d.ts +1 -1
- package/dist/leader/diffup.d.ts +2 -2
- package/dist/leader/endpoint.d.ts +1 -1
- package/dist/leader/fanout.d.ts +1 -1
- package/dist/leader/leader.d.ts +4 -4
- package/dist/leader/merge.d.ts +3 -3
- package/dist/leader/repair-wire.d.ts +1 -1
- package/dist/leader/wire.d.ts +9 -5
- package/dist/leader/wire.js +8 -7
- package/dist/list-entry-display.d.ts +1 -1
- package/dist/lsp-evict.d.ts +1 -1
- package/dist/main.js +1 -1
- package/dist/mcp-assertion-header.d.ts +1 -1
- package/dist/memory-layer-legacy-lock.d.ts +1 -1
- package/dist/memory-operator-faces.d.ts +1 -1
- package/dist/memory-origin-fence.js +2 -2
- package/dist/memory-posture.js +4 -2
- package/dist/memory-project-layer.d.ts +1 -1
- package/dist/memory-scope.d.ts +19 -19
- package/dist/memory-store-refusal.d.ts +4 -4
- package/dist/model-compat.d.ts +1 -1
- package/dist/model-entry-headers.d.ts +2 -2
- package/dist/model-entry-refusal.d.ts +17 -17
- package/dist/model-provider.d.ts +10 -10
- package/dist/model-reach-scope.d.ts +1 -1
- package/dist/model-route-endpoint.d.ts +6 -6
- package/dist/model-route-url.d.ts +5 -5
- package/dist/model-select.d.ts +15 -6
- package/dist/model-select.js +5 -0
- package/dist/model-unreachable-notice.d.ts +3 -3
- package/dist/namespaced-rule-name.d.ts +15 -5
- package/dist/namespaced-rule-name.js +3 -2
- package/dist/observability/corrupt-read-seat.d.ts +9 -9
- package/dist/observability/cost-taxonomy.d.ts +1 -1
- package/dist/observability/err-text.d.ts +1 -1
- package/dist/observability/fail-open.d.ts +12 -8
- package/dist/observability/fail-open.js +12 -8
- package/dist/observability/metrics.d.ts +3 -3
- package/dist/observability/prompt-manifest.d.ts +19 -8
- package/dist/observability/prompt-manifest.js +9 -8
- package/dist/observability/run-terminal.d.ts +36 -36
- package/dist/observability/secret-env-scrub.d.ts +3 -3
- package/dist/observability/tool-trace.d.ts +1 -1
- package/dist/observability/tool-trace.js +8 -9
- package/dist/operator-ask.d.ts +4 -4
- package/dist/orchestration/workflow-agent-session-index.d.ts +3 -3
- package/dist/orchestration/workflow-completion-inbox.d.ts +20 -5
- package/dist/orchestration/workflow-completion-inbox.js +29 -7
- package/dist/orchestration/workflow-notify-journal.d.ts +43 -19
- package/dist/orchestration/workflow-notify-journal.js +17 -0
- package/dist/orchestration/workflow-park-decision.d.ts +1 -1
- package/dist/orchestration/workflow-park-decision.js +1 -0
- package/dist/outbound-dispatcher.d.ts +4 -4
- package/dist/parent-watch.d.ts +4 -4
- package/dist/parked-decide.d.ts +20 -20
- package/dist/parked-decide.js +8 -5
- package/dist/parked-revive-surface.d.ts +7 -7
- package/dist/parked-revive-surface.js +2 -3
- package/dist/peer-directory.d.ts +3 -3
- package/dist/peer-directory.js +1 -1
- package/dist/permission-rule-list.d.ts +10 -1
- package/dist/permission-rule-list.js +7 -5
- package/dist/permission-rule-vocab.d.ts +3 -25
- package/dist/permission-rule-vocab.js +0 -13
- package/dist/plugins/adoption-log-sql.d.ts +1 -1
- package/dist/plugins/approval-ask-store-file.d.ts +8 -1
- package/dist/plugins/approval-ask-store-file.js +6 -3
- package/dist/plugins/approval-ask-store-memory.d.ts +11 -7
- package/dist/plugins/approval-ask-store-memory.js +11 -7
- package/dist/plugins/approval-ask-store-sql.d.ts +34 -15
- package/dist/plugins/approval-ask-store-sql.js +18 -5
- package/dist/plugins/approval-exemption-store.d.ts +3 -3
- package/dist/plugins/approval-nonce-store.d.ts +3 -3
- package/dist/plugins/approval-payload-fingerprint.d.ts +14 -6
- package/dist/plugins/approval-payload-fingerprint.js +1 -1
- package/dist/plugins/background-agent-store-sql.d.ts +1 -1
- package/dist/plugins/background-shell-support.d.ts +2 -2
- package/dist/plugins/blob-backend.d.ts +1 -1
- package/dist/plugins/caching-session-store.d.ts +24 -33
- package/dist/plugins/caching-session-store.js +8 -19
- package/dist/plugins/checkpoint-index-columns.d.ts +81 -0
- package/dist/plugins/checkpoint-index-columns.js +62 -0
- package/dist/plugins/checkpoint-store-sql.d.ts +66 -67
- package/dist/plugins/checkpoint-store-sql.js +100 -103
- package/dist/plugins/device-store-sql.d.ts +7 -6
- package/dist/plugins/e2b-orphan-reclaim.d.ts +1 -1
- package/dist/plugins/ensure-schema-lock-policy.d.ts +1 -1
- package/dist/plugins/file-history-store-sql.d.ts +9 -7
- package/dist/plugins/file-history-store-sql.js +27 -15
- package/dist/plugins/file-run-store.d.ts +8 -8
- package/dist/plugins/fork-routing-session-store.d.ts +2 -2
- package/dist/plugins/fork-routing-session-store.js +1 -1
- package/dist/plugins/host-platform.d.ts +10 -10
- package/dist/plugins/image-bake-store-sql.d.ts +1 -1
- package/dist/plugins/image-index-sql.d.ts +1 -1
- package/dist/plugins/leader-run-store-sql.d.ts +1 -1
- package/dist/plugins/local-checkpoint-store.d.ts +23 -12
- package/dist/plugins/local-checkpoint-store.js +29 -4
- package/dist/plugins/local-session-store.d.ts +44 -45
- package/dist/plugins/local-session-store.js +42 -52
- package/dist/plugins/local-session-window.d.ts +12 -6
- package/dist/plugins/local-session-window.js +1 -17
- package/dist/plugins/mailbox-store-sql.d.ts +2 -2
- package/dist/plugins/memory-engine-pg.d.ts +1 -1
- package/dist/plugins/memory-run-store.d.ts +4 -4
- package/dist/plugins/memory-sync-store-pg.d.ts +3 -3
- package/dist/plugins/one-time-migrations.d.ts +76 -39
- package/dist/plugins/one-time-migrations.js +127 -34
- package/dist/plugins/outcome-ledger-sql.d.ts +1 -1
- package/dist/plugins/park-commit-watch.d.ts +3 -3
- package/dist/plugins/permission-rule-store-file.d.ts +5 -5
- package/dist/plugins/permission-rule-store-file.js +16 -19
- package/dist/plugins/permission-rule-store-sql.d.ts +38 -4
- package/dist/plugins/permission-rule-store-sql.js +74 -31
- package/dist/plugins/pg-cost-quota.d.ts +1 -1
- package/dist/plugins/pg-pool.d.ts +2 -2
- package/dist/plugins/pg-pool.js +5 -2
- package/dist/plugins/pg-rate-limiter.d.ts +1 -1
- package/dist/plugins/pg-session-storage.d.ts +9 -21
- package/dist/plugins/pg-session-storage.js +51 -42
- package/dist/plugins/remote-env-adb.d.ts +10 -10
- package/dist/plugins/remote-env-device.d.ts +22 -14
- package/dist/plugins/remote-env-device.js +28 -16
- package/dist/plugins/remote-env-e2b.d.ts +3 -3
- package/dist/plugins/remote-env-host.d.ts +16 -16
- package/dist/plugins/remote-env-k8s.d.ts +8 -8
- package/dist/plugins/remote-env-local-docker.d.ts +2 -2
- package/dist/plugins/remote-env-ssh.d.ts +4 -4
- package/dist/plugins/remote-scratchpad.d.ts +2 -3
- package/dist/plugins/remote-scratchpad.js +0 -4
- package/dist/plugins/remote-shell.d.ts +6 -6
- package/dist/plugins/retention-lane-store-sql.d.ts +4 -4
- package/dist/plugins/retention-store-sql.d.ts +4 -4
- package/dist/plugins/roster-store-sql.d.ts +1 -1
- package/dist/plugins/run-store-sql.d.ts +8 -8
- package/dist/plugins/schema-consistency.d.ts +2 -2
- package/dist/plugins/schema-ensure-legs.d.ts +3 -3
- package/dist/plugins/schema-indexes.d.ts +1 -1
- package/dist/plugins/schema-live-columns.d.ts +1 -1
- package/dist/plugins/session-event-payload.d.ts +4 -4
- package/dist/plugins/session-fork.d.ts +34 -0
- package/dist/plugins/session-fork.js +29 -0
- package/dist/plugins/session-ownership.d.ts +11 -0
- package/dist/plugins/session-ownership.js +11 -0
- package/dist/plugins/session-placement.d.ts +12 -14
- package/dist/plugins/session-placement.js +2 -15
- package/dist/plugins/session-policy-store-sql.d.ts +12 -12
- package/dist/plugins/session-store.d.ts +2 -2
- package/dist/plugins/session-store.js +2 -2
- package/dist/plugins/shared-memory-store-sql.d.ts +2 -2
- package/dist/plugins/sql-driver.d.ts +8 -8
- package/dist/plugins/sql-errors.d.ts +1 -1
- package/dist/plugins/sql-json-column.d.ts +21 -21
- package/dist/plugins/sql-row-helpers.d.ts +2 -2
- package/dist/plugins/store-backend.d.ts +17 -16
- package/dist/plugins/store-backend.js +3 -3
- package/dist/plugins/store-contracts.d.ts +21 -21
- package/dist/plugins/task-attachment-store.d.ts +2 -2
- package/dist/plugins/task-list-store-sql.d.ts +1 -1
- package/dist/plugins/tidb-pool.d.ts +2 -2
- package/dist/plugins/tidb-pool.js +9 -2
- package/dist/plugins/tidb-session-store.d.ts +17 -27
- package/dist/plugins/tidb-session-store.js +52 -42
- package/dist/plugins/tool-result-store-sql.d.ts +1 -1
- package/dist/plugins/usage-window-store-sql.d.ts +3 -3
- package/dist/plugins/user-input-ledger-file.d.ts +1 -1
- package/dist/plugins/user-input-ledger-sql.d.ts +3 -3
- package/dist/plugins/web-search.d.ts +19 -5
- package/dist/plugins/web-search.js +19 -4
- package/dist/{orchestration/workflow-journal-entry.d.ts → plugins/workflow-journal-payload.d.ts} +23 -32
- package/dist/plugins/workflow-journal-payload.js +32 -0
- package/dist/plugins/workflow-journal-store-sql.d.ts +28 -14
- package/dist/plugins/workflow-journal-store-sql.js +34 -15
- package/dist/plugins/workflow-run-store-sql.d.ts +4 -4
- package/dist/posture-source.d.ts +11 -11
- package/dist/principal-jwt.d.ts +6 -6
- package/dist/project-identity.d.ts +3 -3
- package/dist/project-memory.d.ts +4 -4
- package/dist/read-face-posture.d.ts +7 -7
- package/dist/request-key-closure.d.ts +1 -1
- package/dist/request-key-closure.js +1 -1
- package/dist/request-tool-axes.d.ts +12 -0
- package/dist/request-tool-axes.js +20 -0
- package/dist/request-value-closure.d.ts +15 -8
- package/dist/request-value-closure.js +2 -0
- package/dist/router/route-orchestration.d.ts +11 -16
- package/dist/router/route-orchestration.js +2 -12
- package/dist/rule-entry-list.d.ts +8 -7
- package/dist/rule-entry-list.js +2 -9
- package/dist/rules-consent.d.ts +6 -6
- package/dist/rules-consent.js +2 -0
- package/dist/run-cancel-context.d.ts +5 -5
- package/dist/run-local.d.ts +10 -10
- package/dist/run-local.js +1 -0
- package/dist/runs.d.ts +15 -12
- package/dist/runs.js +19 -4
- package/dist/runtime-caps-resolver.d.ts +6 -6
- package/dist/runtime-governance.d.ts +9 -9
- package/dist/sandbox-pkg-source.d.ts +9 -31
- package/dist/sandbox-pkg-source.js +14 -8
- package/dist/sealed-key.d.ts +34 -2
- package/dist/sealed-key.js +55 -1
- package/dist/security.d.ts +31 -32
- package/dist/security.js +12 -9
- package/dist/server-secret-env.d.ts +10 -10
- package/dist/session-children-retire.d.ts +1 -1
- package/dist/session-error-wire.d.ts +19 -12
- package/dist/session-error-wire.js +4 -1
- package/dist/session-incarnation.d.ts +52 -35
- package/dist/session-incarnation.js +23 -8
- package/dist/session-policy-wire.d.ts +27 -5
- package/dist/session-policy-wire.js +15 -1
- package/dist/session-records-skipped-notice.d.ts +1 -1
- package/dist/session-sync-kernel.d.ts +38 -11
- package/dist/session-sync-kernel.js +10 -0
- package/dist/session-sync.d.ts +49 -6
- package/dist/session-sync.js +52 -10
- package/dist/session-titler.d.ts +7 -6
- package/dist/session-titler.js +8 -13
- package/dist/session-watch.d.ts +3 -3
- package/dist/session-watch.js +4 -4
- package/dist/sighup-idle.d.ts +2 -2
- package/dist/spec-fields.d.ts +4 -4
- package/dist/sql-engine-posture.d.ts +3 -3
- package/dist/store-posture.d.ts +2 -2
- package/dist/stored-request-tool-axes-m19.d.ts +1 -1
- package/dist/task-a2a.d.ts +3 -1
- package/dist/task-a2a.js +38 -5
- package/dist/task-cwd.d.ts +7 -88
- package/dist/task-cwd.js +2 -15
- package/dist/task-mcp.d.ts +14 -10
- package/dist/task-mcp.js +39 -12
- package/dist/task-settings.d.ts +34 -18
- package/dist/task-settings.js +34 -4
- package/dist/task-workflow.d.ts +0 -24
- package/dist/task-workflow.js +2 -1
- package/dist/terminal.d.ts +5 -5
- package/dist/tighten-only-seats.d.ts +7 -6
- package/dist/tighten-only-seats.js +1 -1
- package/dist/tool-approval.d.ts +273 -228
- package/dist/tool-approval.js +125 -47
- package/dist/tool-rule-names.d.ts +7 -1
- package/dist/trace/core-keyset-guard.d.ts +15 -9
- package/dist/trace/engine-notice-wire.d.ts +5 -5
- package/dist/trace/engine-notice-wire.js +1 -0
- package/dist/trace/exit-seat.d.ts +40 -1
- package/dist/trace/exit-seat.js +46 -14
- package/dist/trace/ledger-events.d.ts +6 -4
- package/dist/trace/ledger-sink.d.ts +1 -1
- package/dist/trace/model-segment.d.ts +3 -3
- package/dist/trace/project.d.ts +65 -46
- package/dist/trace/project.js +49 -5
- package/dist/trace/redact.d.ts +44 -27
- package/dist/trace/redact.js +343 -73
- package/dist/trace/self-minted-wire.d.ts +39 -14
- package/dist/trace/self-minted-wire.js +9 -0
- package/dist/trace/sema-provenance.d.ts +1 -1
- package/dist/trace/task-notification-facets.d.ts +4 -4
- package/dist/trace/wire-projection-faces.d.ts +9 -3
- package/dist/trace/wire-projection-faces.js +7 -1
- package/dist/unattended-permission-mode.d.ts +5 -5
- package/dist/url-credential.d.ts +52 -0
- package/dist/url-credential.js +49 -0
- package/dist/url-refusal.d.ts +6 -2
- package/dist/url-refusal.js +8 -1
- package/dist/usage-analytics.d.ts +2 -2
- package/dist/user-input-ledger.d.ts +23 -23
- package/dist/web-admin-client/apply-effective.d.ts +5 -5
- package/dist/web-admin-client/apply-effective.js +2 -1
- package/dist/web-admin-client/apply-ledger.d.ts +2 -2
- package/dist/web-admin-client/center-request.d.ts +2 -2
- package/dist/web-admin-client/facade.d.ts +5 -5
- package/dist/web-admin-client/facade.js +1 -1
- package/dist/web-admin-client/hot-keys-registry.d.ts +2 -2
- package/dist/web-admin-client/http-client.d.ts +4 -4
- package/dist/web-admin-client/mcp-revocation.d.ts +1 -1
- package/dist/web-admin-client/pull-state.d.ts +1 -1
- package/dist/web-admin-client/read-face.d.ts +2 -2
- package/dist/web-admin-client/read-warnings.d.ts +5 -5
- package/dist/web-admin-client/restart-signal.d.ts +6 -6
- package/dist/web-admin-client/skills-mcp.d.ts +29 -4
- package/dist/web-admin-client/skills-mcp.js +31 -4
- package/dist/web-admin-client/types.d.ts +17 -10
- package/dist/workspace-space.d.ts +5 -3
- package/dist/write-protection.d.ts +2 -2
- package/package.json +4 -3
- package/scripts/drain-check-local.mjs +35 -2
- package/scripts/drain-check.mysql.sql +22 -2
- package/scripts/drain-check.pg.sql +22 -2
- package/skills/loop.md +1 -1
- package/dist/mcp-tool-faces.d.ts +0 -69
- package/dist/mcp-tool-faces.js +0 -104
- package/dist/orchestration/workflow-journal-entry.js +0 -27
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 审批卡的**卡词**读口(server 侧唯一一处)与保留问答工具名的再导出。
|
|
3
3
|
*
|
|
4
|
-
* ── 规则(core 7.49.0
|
|
4
|
+
* ── 规则(core 7.49.0 [ref] / [ref] A-S4)────────────────────────────────────────────────────────────
|
|
5
5
|
* 「这一问 / 这一行用哪张卡」只有一个事实源 = **引擎铸的 `approvalCard`**(闭集 core `TOOL_APPROVAL_CARDS`):活 ask 上是
|
|
6
6
|
* `AskRequest.approvalCard`,停驻行上是门的 `gate.approvalCard`(core `summarizeCheckpoint` 投给 `CheckpointSummary.approvalCard`
|
|
7
7
|
* 的同一个词)。停驻行到期走哪条路只有一个判官 = core `facetOf(gate)`(问答卡 ⇒ `B`,到期作废;其余审批门 ⇒ `A`,SLA 拒扫腿 deny)。
|
|
8
8
|
* 本仓**不从工具名回推卡**:此前的 `contentKindOf`(工具名 ⇒ `"content_ask"`)、两只店里按 `tool_name` 判问答的 SQL 字面臂与 LOCAL
|
|
9
|
-
* 比较,以及 wire 上的第二个卡词 `contentKind`,随
|
|
9
|
+
* 比较,以及 wire 上的第二个卡词 `contentKind`,随 [ref] 整删(零别名、零双读)。
|
|
10
10
|
*
|
|
11
11
|
* ── 存量行(7.49.0 之前的引擎停驻、门上没有卡)────────────────────────────────────────────────────────
|
|
12
12
|
* 按 core 的读法:**无卡 = 不是一问**(core 不从名字回推,本仓也不)。持久数据面不留第二种读法 —— 按工具名回退的臂一旦留下,
|
|
@@ -14,12 +14,12 @@
|
|
|
14
14
|
* 本仓 CHANGELOG 对应条目:旧问答行在队列上不带卡词;过了 deadline 走 SLA 拒扫腿(模型拿到一次「拒」),不再作废整条 run。
|
|
15
15
|
*
|
|
16
16
|
* ── 为什么保留工具名常量 ────────────────────────────────────────────────────────────────────────────
|
|
17
|
-
* `ASK_USER_QUESTION_TOOL_NAME` 是 core 根导出的那一枚(
|
|
17
|
+
* `ASK_USER_QUESTION_TOOL_NAME` 是 core 根导出的那一枚([ref]①:本仓一个字节都不自铸),仍有**决断面**的读者(回决时「批准问答必须
|
|
18
18
|
* 带答」、问答不可记为会话放行、durable 问答门的政策臂)—— 那几处与 core 自己的答案绑定(`engineCardOf`,按 wire 名)同读法,
|
|
19
19
|
* 不是卡的渲染读法,不在本模块的规则里。
|
|
20
20
|
*/
|
|
21
21
|
export { ASK_USER_QUESTION_TOOL_NAME } from "@sema-agent/core";
|
|
22
|
-
import { type ToolApprovalCard } from "@sema-agent/core";
|
|
22
|
+
import { PAUSE_REGISTRY, type GateKind, type ToolApprovalCard } from "@sema-agent/core";
|
|
23
23
|
/**
|
|
24
24
|
* 一格卡词的**闭集窄读**(三个载体共用这一只:活 ask、LOCAL 店的停驻门、SQL 店读出的门子树)。成员 ⇒ 那个词;缺席 ⇒ `undefined`(不计);
|
|
25
25
|
* 在场却不是成员(世代差 —— 新引擎加了卡词而本版没跟上 —— 或手改行)⇒ `undefined` + 计一次 `server.approval-card.closed-word-out-of-set`
|
|
@@ -32,8 +32,11 @@ export interface ParkedGateFace {
|
|
|
32
32
|
readonly approvalCard?: unknown;
|
|
33
33
|
}
|
|
34
34
|
/**
|
|
35
|
-
* 停驻行的卡
|
|
36
|
-
* `
|
|
35
|
+
* 停驻行的卡 —— 读法只有引擎那一只:core 包根导出 `parkedApprovalCardOf(gate)`(core 7.54.0 [ref] K2;审批门 = 门型的寄存臂是 `tool_approval`,
|
|
36
|
+
* 只在那里读卡,只有闭集成员算卡)。四态逐一处置(穷举 `switch`:core 加一态 ⇒ 编译红):`card` ⇒ 那个词;`no_card` / `not_approval` ⇒ 无卡;
|
|
37
|
+
* `unknown_word`(引擎交回**未经筛**的存储原值)⇒ 无卡 + 响亮:计一次 `server.approval-card.closed-word-out-of-set`(与 {@link readApprovalCard} 同一只计数、
|
|
38
|
+
* 同一只回显口径 —— 截 40、脱敏,对象只报形名)。修前本函数自己判「是不是审批门」(读 `PAUSE_REGISTRY` 的寄存臂)再交 {@link readApprovalCard},
|
|
39
|
+
* 与引擎的 `summarizeCheckpoint` 是两份读法。
|
|
37
40
|
*/
|
|
38
41
|
export declare function parkedApprovalCard(gate: ParkedGateFace | undefined): ToolApprovalCard | undefined;
|
|
39
42
|
/**
|
|
@@ -41,4 +44,21 @@ export declare function parkedApprovalCard(gate: ParkedGateFace | undefined): To
|
|
|
41
44
|
* 门型不是 core 登记的门(存量行无门型 / 手改)⇒ `undefined`,调用方按「不是 `A`」处置(与无门型存量行的既有作废路同向)。
|
|
42
45
|
*/
|
|
43
46
|
export declare function parkedFacetOf(gate: ParkedGateFace | undefined): "A" | "B" | "-" | undefined;
|
|
47
|
+
/**
|
|
48
|
+
* 审批门型 = core `PAUSE_REGISTRY` 里寄存臂是 `tool_approval` 的登记门 —— 与 core `parkedApprovalCardOf` 判「是不是审批门」同一条判据(只在这些门上读卡)。
|
|
49
|
+
* **派生,不手写**(core 7.55.0 [ref] P1 阶段二):此前本仓手写一份二员词表([ref] 时 core 没有导出词表),一次性迁移 M21 又自派生一份;
|
|
50
|
+
* core 加一行审批味的门,这里跟着变,零处要改。读者:决断口与拒扫腿按门型绑定取行(`gateKinds`)、`/decide` 的门型守卫、M21 / M29 的候选扫描。
|
|
51
|
+
* 到期分法**不**读这张表 —— SQL 里是由 core 两张表生成的 facet 谓词(`plugins/checkpoint-index-columns.ts`),JS 里是 {@link denySweepOwns}。
|
|
52
|
+
*/
|
|
53
|
+
export type ApprovalGateKind = {
|
|
54
|
+
[K in GateKind]: (typeof PAUSE_REGISTRY)[K]["pending"] extends "tool_approval" ? K : never;
|
|
55
|
+
}[GateKind];
|
|
56
|
+
export declare const APPROVAL_GATE_KINDS: readonly ApprovalGateKind[];
|
|
57
|
+
export declare function isApprovalGateKind(k: string | undefined): k is ApprovalGateKind;
|
|
58
|
+
/**
|
|
59
|
+
* 停驻行的到期归 SLA 拒扫腿(deny)而不是作废(expire)?—— **一只谓词** = core `facetOf(gate)` 读作 `A`(按 core 的定义,`A` 就是「审批门、deadline 是 SLA 拒」;
|
|
60
|
+
* 问答卡 ⇒ `B`,到期作废;非审批门 / 未登记门 / 无门 ⇒ 不归拒扫)。LOCAL 孪生的拒扫选行与作废腿的补集读这一只;SQL 孪生读由同两张表生成的谓词,逐行与它同答
|
|
61
|
+
* (`test/checkpoint-index-columns.test.ts` B 节)。修前多一个「∧ 审批门型」合取 —— 在 core 的登记表下恒真,删。
|
|
62
|
+
*/
|
|
63
|
+
export declare function denySweepOwns(gate: ParkedGateFace | undefined): boolean;
|
|
44
64
|
//# sourceMappingURL=approval-content-kind.d.ts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { ASK_USER_QUESTION_TOOL_NAME } from "@sema-agent/core";
|
|
2
|
-
import { PAUSE_REGISTRY, TOOL_APPROVAL_CARDS, facetOf, isGateKind } from "@sema-agent/core";
|
|
2
|
+
import { PAUSE_REGISTRY, TOOL_APPROVAL_CARDS, facetOf, isGateKind, parkedApprovalCardOf } from "@sema-agent/core";
|
|
3
3
|
import { recordFailOpen } from "./observability/fail-open.js";
|
|
4
4
|
import { redactSecrets } from "./trace/redact.js";
|
|
5
5
|
export function readApprovalCard(raw) {
|
|
@@ -13,11 +13,31 @@ export function readApprovalCard(raw) {
|
|
|
13
13
|
return undefined;
|
|
14
14
|
}
|
|
15
15
|
export function parkedApprovalCard(gate) {
|
|
16
|
-
if (gate === undefined
|
|
16
|
+
if (gate === undefined)
|
|
17
17
|
return undefined;
|
|
18
|
-
|
|
18
|
+
const reading = parkedApprovalCardOf({ kind: gate.kind, approvalCard: gate.approvalCard });
|
|
19
|
+
switch (reading.kind) {
|
|
20
|
+
case "card":
|
|
21
|
+
return reading.card;
|
|
22
|
+
case "no_card":
|
|
23
|
+
case "not_approval":
|
|
24
|
+
return undefined;
|
|
25
|
+
case "unknown_word":
|
|
26
|
+
return readApprovalCard(reading.word);
|
|
27
|
+
default: {
|
|
28
|
+
const unreachable = reading;
|
|
29
|
+
throw new Error(`unhandled parked approval card reading: ${JSON.stringify(unreachable)}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
19
32
|
}
|
|
20
33
|
export function parkedFacetOf(gate) {
|
|
21
34
|
return gate !== undefined && isGateKind(gate.kind) ? facetOf({ kind: gate.kind, approvalCard: gate.approvalCard }) : undefined;
|
|
22
35
|
}
|
|
36
|
+
export const APPROVAL_GATE_KINDS = Object.keys(PAUSE_REGISTRY).filter((k) => PAUSE_REGISTRY[k].pending === "tool_approval");
|
|
37
|
+
export function isApprovalGateKind(k) {
|
|
38
|
+
return k !== undefined && APPROVAL_GATE_KINDS.includes(k);
|
|
39
|
+
}
|
|
40
|
+
export function denySweepOwns(gate) {
|
|
41
|
+
return parkedFacetOf(gate) === "A";
|
|
42
|
+
}
|
|
23
43
|
//# sourceMappingURL=approval-content-kind.js.map
|
|
@@ -95,7 +95,7 @@ export type ApprovalEndingCause = (typeof APPROVAL_ENDING_CAUSES)[keyof typeof A
|
|
|
95
95
|
/** 全部成因词(机器判据用:值域互不相同 + 列宽 ≤ 64 的钉子在 test/approval-reconciler.test.ts)。 */
|
|
96
96
|
export declare const ALL_APPROVAL_ENDING_CAUSES: readonly ApprovalEndingCause[];
|
|
97
97
|
/**
|
|
98
|
-
* 审计 settle 行 `cause` 的读盘词表(
|
|
98
|
+
* 审计 settle 行 `cause` 的读盘词表([ref] 形):{@link SettleCause} 的穷举,`satisfies Record<SettleCause, true>` ⇒ 闭集加一个非决断类的词而本表没跟 = **编译红**(多一个词同样红);
|
|
99
99
|
* 判定走 `Object.hasOwn`,原型链上的名字不算词。决断类三词({@link DecisionRefusalCause})拒一次决议、不结束一张卡 ⇒ 不是 settle 行的成因,读到它们照词表外处置(计坏行)。
|
|
100
100
|
* 唯一读者 = {@link isSettleCause}。
|
|
101
101
|
*/
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 一张停驻审批卡的「门」此刻还是不是它 —— 应答口判 `approval_stale` 与按问读口 `state` 的**同一只判官**。
|
|
3
|
+
*
|
|
4
|
+
* ## 病灶(为什么要有这一只)
|
|
5
|
+
* 问账行 `PARKED` 是终态(`approval-ask-machine.ts`:`PARKED: []`):赎回腿的单赢者是 **checkpoint 的 CAS**,取消腿动的也是 checkpoint(先 `expire` 门、再驱 run 终局),
|
|
6
|
+
* 两条腿都不写 ask 行。于是「这张卡的门还在不在」这件事只有 checkpoint 店知道;读口若只看行,就会在卡被答过 / run 被取消之后继续说 `parked` 并指路去决定,
|
|
7
|
+
* 而应答口对同一张卡早已答 `409 approval_stale`。同一件事两个读法 —— 本模块把它收成一个:读的是同一个问题、同一个来源。
|
|
8
|
+
*
|
|
9
|
+
* ## 判官
|
|
10
|
+
* 问题:**这把 gate token 是不是该会话当前待决的审批门?**(应答口的答法:`resumeCheckpoint` 的 stale 臂 —— 回显的 token ≠ 该会话当前待决的审批门 ⇒ `409 approval_stale`。)
|
|
11
|
+
* · {@link currentApprovalGateToken} —— 该会话当前待决的审批门(审批门型优先,没有再退到任一待决行);应答口读它,读口读它,别处不再内联第二份;
|
|
12
|
+
* · {@link readGateCurrency} —— 一把 token 对着它的读数:`current`(带那一行)/ `absent`(店里没有这一行)/ `settled`(行在,但不再是当前待决门:已结算、已过期、被取代);
|
|
13
|
+
* · {@link createParkedGateRead} —— 协调器读口的门读席:把读数译成读口要的四种读法({@link ParkedGateReading}),`state` 闭集不加字。
|
|
14
|
+
*
|
|
15
|
+
* ## 一个读数只取自一个时刻([ref])
|
|
16
|
+
* 门身份就是 token:引擎重开一张门(`reopen`:续跑腿在被批准的动作开跑之前失败)翻的是**同一行**(resolved → pending,token 不变)。所以「这张卡此刻在哪」可以在两次店读之间
|
|
17
|
+
* 来回变(待决 → 被决 → 被重开);判官的分类只用**同一时刻成立**的读数:
|
|
18
|
+
* ① 行不在 ⇒ `absent`;行不 pending ⇒ 按这一行分类(不 pending 的行不可能是「当前待决」的那一把,不必再问);
|
|
19
|
+
* ② 行 pending ⇒ 问「当前待决」,**问完再读一次行**:世代号没动(`rev`:core 的单调世代号,每一次 resolve / reopen 都推它)⇒ 两次行读之间没有 resolve / reopen 落地 ⇒
|
|
20
|
+
* 「当前待决」那一读时它就是这一行(连同行上的重开事实)⇒ 答的是它 ⇒ `current`(带这一行),答的不是它 ⇒ 被取代(`settled`);
|
|
21
|
+
* 世代号动了 ⇒ 两次行读之间这张卡被决又被重开 ⇒ 用新的那一行**从 ① 重判**(有界 {@link GATE_READ_ROUNDS};摸到上界 ⇒ 抛,读口按店故障姿势处置);
|
|
22
|
+
* 第二读不在 / 不再 pending ⇒ 从 ① 按它分类。两个答案(是 / 不是当前待决)过的是**同一道**世代号核对:
|
|
23
|
+
* 拿「被决那一瞬」读到的当前待决与「重开之后」读到的 pending 拼出 `void`,或拿第一读的旧行(那一刻它还不是当前待决、也还没被重开)答「当前待决」,都是同一种拼法。
|
|
24
|
+
*
|
|
25
|
+
* ## 被重开的门怎么读([ref])
|
|
26
|
+
* `current` 的那一行上若带 core 的重开事实(`reopenReason`,闭集 `REOPEN_REASONS`;下一次 resolve 清掉它),读法是 `open` + `reopened`:core 的因由词原样 +
|
|
27
|
+
* **重开之前的决议**(core 跨重开保留赢家 `resolvedOutcome`;读它的是已结算门 `decided` 的**同一只**决议读法 {@link decisionReading} —— 一个记录一个读者)。
|
|
28
|
+
* 那只读法读不出决议 ⇒ 只带因由词,不编一个决议;因由词不在 core 的闭集里(只有手改行带得出)⇒ 不带 `reopened`(读不懂的词说不出「重开」是哪一种)。
|
|
29
|
+
*
|
|
30
|
+
* ## `settled` 怎么译(读口只说 checkpoint 上有凭据的话;一条规矩)
|
|
31
|
+
* 落盘的行不受类型面约束(旧版 / 手改 / 坏体 / 更新版本 core 写下的行可带闭集外的词或坏形),所以已结算门只按**一条规矩**读:
|
|
32
|
+
* ① 两个闭集词(行的 `status`、结算记录的种类 `settlement.kind`)各查一张穷举表,**同一查法**({@link throughTable}:只认表自己的键,非字符串不进表):
|
|
33
|
+
* 表明说 `decided` ⇒ 往下读;明说 `void` ⇒ `void`(没有人决过它,答案无处兑现 —— 已过期〔取消 / 收割〕、仍待决却不是当前门〔被取代,应答口答 stale〕、
|
|
34
|
+
* 结算种类是引擎窗到期 / 宿主 SLA 扫 / 无人可答的失败族);**表外 ⇒ `unknown`**(读不懂的词撑不起「有人决过」,也撑不起「没有人决过它」);
|
|
35
|
+
* ② 结算赢家的门记录 `resolvedOutcome.gateOutcome` 先过 core 唯一的门记录筛 `screenGateOutcome`(**档案读法**:读回的耐久行,闭集 = 今日成员 ∪ 已退役词;
|
|
36
|
+
* 坏形记缺陷、绝不抛;本仓 `trace/project.ts` 投影同一种记录也只经这一只筛),有缺陷 ⇒ `unknown`,过了筛才读它的成员;
|
|
37
|
+
* ③ 分类之前记录要**读得全**:有结算记录、时刻(引擎写进赢家的 `settlement.when`)是有限数、赢家绑的是这一行的调用且判词是 allow / deny(与
|
|
38
|
+
* `findDecidedApprovalsForBinding` 同一只 {@link approvalDecisionOfWinner})—— 缺一个都是 `unknown`(**不编一个首决**;读口答 404,应答口对已结算的门答 409 `approval_stale`,两口不同判;
|
|
39
|
+
* `void` 也要读得全:绑在别的调用上的结算说的不是这张卡);读全了再按**结算种类**表分类:人 / 策略的四个种类 ⇒ `decided`(理由取自赢家的 `reason`),其余十个 ⇒ `void`
|
|
40
|
+
* (按种类不按当事方:跨版本稳定的是种类词,变过义的是当事方词 —— 此前版本的策略拒记 `policy_refused` + `who.party:"none"`,此后记 `"policy"`,按当事方查会把那一代合法历史记录读成 `void`);
|
|
41
|
+
* ④ 读的只是行的内容、不碰店:内容坏到读的时候抛(行上缺了必填成员)同样是坏行 ⇒ `unknown`,不冒成店故障(读口对店故障退回 `parked`)。
|
|
42
|
+
* `unknown` 的这一类(`decision_unreadable`)带上读不出的那几处(缺陷句,非空):读口答 404 `tool_approval.not_pending`,并记一行 error(首句 + 计数)。
|
|
43
|
+
* 行没了 ⇒ `unknown`(`row_absent`;应答口 PARKED 臂的 404 `not_found.approval` 同判)。
|
|
44
|
+
*
|
|
45
|
+
* ## 盲区(core 的筛不判的两处,如实写下:一处本判官手判有限数,一处本判官也不核)
|
|
46
|
+
* · 结算时刻 `settlement.when`:筛不判,本判官手判「有限数」;而本仓另一个读同一种记录的读者(trace 投影)把 `when` 原样放上 wire —— 同一个坏时刻,两个读者两种答法;
|
|
47
|
+
* · 方向与配对:赢家的方向(`resolvedOutcome.decision`)与记录自己的种类 / 处置说的方向是否一致,以及种类 × 当事方的配对 —— 筛不判,本判官也不核:读口以赢家的方向为准、读的是种类。
|
|
48
|
+
* 只有坏行 / 手改行才走得到这两处。候引擎的筛把时刻、方向与种类 × 当事方配对一并判了,两个读者同时退掉各自的手判(配对今天没有手判可退 —— 它无人判)。
|
|
49
|
+
*/
|
|
50
|
+
import { type Checkpoint, type CheckpointToken, type SettlementKind } from "@sema-agent/core";
|
|
51
|
+
import { type PendingRowBinding } from "./plugins/checkpoint-store-sql.js";
|
|
52
|
+
import { type ParkedGateRead } from "./tool-approval.js";
|
|
53
|
+
/** 判官要的两个店口(三后端同形;窄接口让测试与装配都不必拿整只店)。 */
|
|
54
|
+
export interface GateCurrencyStore {
|
|
55
|
+
get(token: CheckpointToken): Promise<Checkpoint | null>;
|
|
56
|
+
findPendingTokenBySession(sessionId: string, scope?: string, binding?: PendingRowBinding): Promise<CheckpointToken | null | undefined>;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 该会话**当前待决的审批门**的 token:审批门型({@link APPROVAL_GATE_KINDS})优先 —— 同会话 `task_done` 纯 park 与新 run 的审批 park 可以并存(表无 per-session pending 唯一约束),
|
|
60
|
+
* 无序读会选中别的门型 —— 没有审批门才退到任一待决行(错门型诊断由 `/decide` 的 gate-kind 守卫点名)。应答口的 stale 臂与按问读口读这一只。
|
|
61
|
+
*/
|
|
62
|
+
export declare function currentApprovalGateToken(cs: Pick<GateCurrencyStore, "findPendingTokenBySession">, sessionId: string): Promise<CheckpointToken | null | undefined>;
|
|
63
|
+
/** 一把 gate token 对着判官的读数(`current` / `settled` 带分类用的那一行)。 */
|
|
64
|
+
export type GateCurrency = {
|
|
65
|
+
readonly kind: "current";
|
|
66
|
+
readonly checkpoint: Checkpoint;
|
|
67
|
+
} | {
|
|
68
|
+
readonly kind: "absent";
|
|
69
|
+
} | {
|
|
70
|
+
readonly kind: "settled";
|
|
71
|
+
readonly checkpoint: Checkpoint;
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* 这把 gate token 是不是它那条会话当前待决的审批门 —— 分类只用同一时刻成立的读数(规矩见模块头注「一个读数只取自一个时刻」)。
|
|
75
|
+
* 读不出(店抛错)⇒ 原样上抛,由调用方的故障姿势处置;行一直在动、摸到 {@link GATE_READ_ROUNDS} ⇒ 抛。
|
|
76
|
+
*/
|
|
77
|
+
export declare function readGateCurrency(cs: GateCurrencyStore, gateToken: string): Promise<GateCurrency>;
|
|
78
|
+
/** 一个闭集词对已结算门的读法类:有人 / 有策略决过(往下读决议),或没有人决过它。 */
|
|
79
|
+
type SettledClass = "decided" | "void";
|
|
80
|
+
/**
|
|
81
|
+
* 结算种类(core `SETTLEMENT_KINDS`)→ 这次结算算不算「有人 / 有策略决过」。`human_*`(人)与 `policy_*`(部署的策略)四个词是仅有的决议种类;其余十个 ——
|
|
82
|
+
* 引擎自己的窗到期 · 宿主窗 / 宿主 SLA 扫 · 无人可答的失败族 —— 没有人决过它,不读成「决议:deny」(那会让壳把一次宿主超时清算渲成「被拒绝」)。
|
|
83
|
+
* 表的键是**种类**不是当事方:种类词跨版本稳定,当事方词变过义(此前版本的策略拒记 `who.party:"none"`),按当事方查会把那一代合法历史记录读错。core 现成的两张种类表
|
|
84
|
+
* (是不是拒绝 / 有没有人评判过)答的是别的问题:`human_refused` 与 `approval_window_expired` 同是拒绝,这里一个是决议、一个不是,所以不从它们派生。
|
|
85
|
+
* 表穷举(与上面 `status` 表同形、同一查法):core 给种类闭集加词而不在此表态 ⇒ 编译红。
|
|
86
|
+
*/
|
|
87
|
+
export declare const SETTLEMENT_KIND_READING: Record<SettlementKind, SettledClass>;
|
|
88
|
+
/** 协调器读口的门读席({@link ParkedGateRead}):装配点把 checkpoint 店递进来,协调器本身不认识 checkpoint 的形。 */
|
|
89
|
+
export declare function createParkedGateRead(cs: GateCurrencyStore): ParkedGateRead;
|
|
90
|
+
export {};
|
|
91
|
+
//# sourceMappingURL=approval-gate-currency.d.ts.map
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { REOPEN_REASONS, screenGateOutcome } from "@sema-agent/core";
|
|
2
|
+
import { approvalDecisionOfWinner } from "./plugins/checkpoint-store-sql.js";
|
|
3
|
+
import {} from "./tool-approval.js";
|
|
4
|
+
import { APPROVAL_GATE_KINDS } from "./approval-content-kind.js";
|
|
5
|
+
export async function currentApprovalGateToken(cs, sessionId) {
|
|
6
|
+
return (await cs.findPendingTokenBySession(sessionId, undefined, { gateKinds: APPROVAL_GATE_KINDS })) ?? (await cs.findPendingTokenBySession(sessionId));
|
|
7
|
+
}
|
|
8
|
+
function revisionOf(cp) {
|
|
9
|
+
return cp.rev ?? 0;
|
|
10
|
+
}
|
|
11
|
+
const GATE_READ_ROUNDS = 3;
|
|
12
|
+
export async function readGateCurrency(cs, gateToken) {
|
|
13
|
+
const token = gateToken;
|
|
14
|
+
let row = await cs.get(token);
|
|
15
|
+
for (let round = 1;; round += 1) {
|
|
16
|
+
if (row === null)
|
|
17
|
+
return { kind: "absent" };
|
|
18
|
+
if (row.status !== "pending")
|
|
19
|
+
return { kind: "settled", checkpoint: row };
|
|
20
|
+
const isCurrent = (await currentApprovalGateToken(cs, row.sessionId)) === gateToken;
|
|
21
|
+
const again = await cs.get(token);
|
|
22
|
+
if (again !== null && again.status === "pending") {
|
|
23
|
+
if (revisionOf(again) === revisionOf(row))
|
|
24
|
+
return isCurrent ? { kind: "current", checkpoint: again } : { kind: "settled", checkpoint: again };
|
|
25
|
+
if (round === GATE_READ_ROUNDS)
|
|
26
|
+
throw new Error(`the checkpoint row moved between reads in ${GATE_READ_ROUNDS} rounds in a row (decided and reopened each time): there is no single-instant reading of its gate`);
|
|
27
|
+
}
|
|
28
|
+
row = again;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const SETTLED_GATE_READING = { resolved: "decided", expired: "void", pending: "void" };
|
|
32
|
+
export const SETTLEMENT_KIND_READING = {
|
|
33
|
+
human_allowed: "decided",
|
|
34
|
+
human_refused: "decided",
|
|
35
|
+
policy_allowed: "decided",
|
|
36
|
+
policy_refused: "decided",
|
|
37
|
+
approval_window_expired: "void",
|
|
38
|
+
denial_limit_window_expired: "void",
|
|
39
|
+
park_sla_expired: "void",
|
|
40
|
+
no_approver: "void",
|
|
41
|
+
approver_unavailable: "void",
|
|
42
|
+
approver_error: "void",
|
|
43
|
+
approver_contract: "void",
|
|
44
|
+
presentation_failed: "void",
|
|
45
|
+
blanket_allow_refused: "void",
|
|
46
|
+
task_aborted: "void",
|
|
47
|
+
};
|
|
48
|
+
function unreadable(defects) {
|
|
49
|
+
return { kind: "unknown", why: "decision_unreadable", defects };
|
|
50
|
+
}
|
|
51
|
+
function throughTable(table, word, field) {
|
|
52
|
+
if (typeof word !== "string" || !Object.hasOwn(table, word))
|
|
53
|
+
return unreadable([`${field} has no reading in this server's table of its closed set`]);
|
|
54
|
+
return table[word] === "decided" ? "decided" : { kind: "void" };
|
|
55
|
+
}
|
|
56
|
+
function settledReading(checkpoint, gateBoundCallId) {
|
|
57
|
+
const byStatus = throughTable(SETTLED_GATE_READING, checkpoint.status, "checkpoint status");
|
|
58
|
+
return byStatus === "decided" ? decisionReading(checkpoint, gateBoundCallId) : byStatus;
|
|
59
|
+
}
|
|
60
|
+
function decisionReading(checkpoint, gateBoundCallId) {
|
|
61
|
+
try {
|
|
62
|
+
return readWinner(checkpoint, gateBoundCallId);
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
return unreadable([`the settled row could not be read (${e instanceof Error ? e.name : "non-Error throw"})`]);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function readWinner(checkpoint, gateBoundCallId) {
|
|
69
|
+
const winner = checkpoint.resolvedOutcome;
|
|
70
|
+
const recorded = winner?.gateOutcome;
|
|
71
|
+
const [defect, ...more] = screenGateOutcome(recorded, { reading: "archive" });
|
|
72
|
+
if (defect !== undefined)
|
|
73
|
+
return unreadable([defect, ...more]);
|
|
74
|
+
const settlement = recorded?.settlement;
|
|
75
|
+
if (settlement === undefined)
|
|
76
|
+
return unreadable(["the gate record carries no settlement: no decider and no time"]);
|
|
77
|
+
if (!Number.isFinite(settlement.when))
|
|
78
|
+
return unreadable(["settlement.when is not a finite epoch-ms time"]);
|
|
79
|
+
const boundCallId = gateBoundCallId ?? (checkpoint.pendingAction.kind === "tool_approval" ? checkpoint.pendingAction.toolCallId : "");
|
|
80
|
+
const direction = approvalDecisionOfWinner(winner, boundCallId);
|
|
81
|
+
if (direction === null)
|
|
82
|
+
return unreadable([`the resolved winner is not an allow / deny bound to call "${boundCallId}"`]);
|
|
83
|
+
const byKind = throughTable(SETTLEMENT_KIND_READING, settlement.kind, "settlement.kind");
|
|
84
|
+
if (byKind !== "decided")
|
|
85
|
+
return byKind;
|
|
86
|
+
const note = typeof winner?.reason === "string" && winner.reason !== "" ? winner.reason : undefined;
|
|
87
|
+
return { kind: "decided", decision: direction === "approve" ? "allow" : "deny", decidedAtMs: settlement.when, ...(note !== undefined ? { decisionNote: note } : {}) };
|
|
88
|
+
}
|
|
89
|
+
function isReopenReason(word) {
|
|
90
|
+
return typeof word === "string" && REOPEN_REASONS.includes(word);
|
|
91
|
+
}
|
|
92
|
+
function openReading(checkpoint, gateBoundCallId) {
|
|
93
|
+
const reason = checkpoint.reopenReason;
|
|
94
|
+
if (!isReopenReason(reason))
|
|
95
|
+
return { kind: "open" };
|
|
96
|
+
const prior = decisionReading(checkpoint, gateBoundCallId);
|
|
97
|
+
const reopened = prior.kind === "decided"
|
|
98
|
+
? { reason, decision: prior.decision, decidedAtMs: prior.decidedAtMs, ...(prior.decisionNote !== undefined ? { decisionNote: prior.decisionNote } : {}) }
|
|
99
|
+
: { reason };
|
|
100
|
+
return { kind: "open", reopened };
|
|
101
|
+
}
|
|
102
|
+
export function createParkedGateRead(cs) {
|
|
103
|
+
return async ({ gateToken, gateBoundCallId }) => {
|
|
104
|
+
const currency = await readGateCurrency(cs, gateToken);
|
|
105
|
+
switch (currency.kind) {
|
|
106
|
+
case "current":
|
|
107
|
+
return openReading(currency.checkpoint, gateBoundCallId);
|
|
108
|
+
case "absent":
|
|
109
|
+
return { kind: "unknown", why: "row_absent" };
|
|
110
|
+
case "settled":
|
|
111
|
+
return settledReading(currency.checkpoint, gateBoundCallId);
|
|
112
|
+
default: {
|
|
113
|
+
const unhandled = currency;
|
|
114
|
+
void unhandled;
|
|
115
|
+
return { kind: "unknown", why: "row_absent" };
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=approval-gate-currency.js.map
|
package/dist/approval-hmac.d.ts
CHANGED
|
@@ -13,25 +13,25 @@ import type { ApprovalHmacKey } from "./auth-keys.js";
|
|
|
13
13
|
* 被接管的客户端 —— 正是 HMAC 要防的风险模型)可以在操作员批准同一个动作的那次决定里,把落账理由换成
|
|
14
14
|
* 别的:动作没变,**审计记录变了**。三方裁定纳入签名载荷,不留 `reasonUnsigned` 宽限代际(未上生产)。
|
|
15
15
|
*
|
|
16
|
-
* ── 🔴 **两把绑定的分工**(
|
|
16
|
+
* ── 🔴 **两把绑定的分工**([ref] F1 立此,别再把它们当成一回事)─────────────────────────────────
|
|
17
17
|
* `principal-jwt.ts` 的 `approvalBnd`(JWT `cnf.bnd`)只哈希**前三位** `[sessionId, boundCallId, boundInputHash]`
|
|
18
18
|
* —— 它绑的是**「哪一张卡」**(这份身份凭据被签发去决哪一次待决动作),所以决定内容改了它**不该**变。
|
|
19
19
|
* 本文件的 HMAC 信封绑的是**「决了什么」**—— 决定本身的每一个会改变后果的字段都在里面(`decision`、
|
|
20
|
-
* `reason`,以及
|
|
20
|
+
* `reason`,以及 [ref] 起的 `permissionModeAfter`)。⇒ 「同一张卡上把 approve 的档偷偷调宽」这件事,
|
|
21
21
|
* 结构上只有 HMAC 这一把拦得住;往 `cnf.bnd` 里加位既不解决它,还会把一份合法 JWT 绑死在一个它签发时
|
|
22
|
-
* 根本不知道的值上。**本次(
|
|
22
|
+
* 根本不知道的值上。**本次([ref] F1)只动 HMAC 这一把,`approvalBnd` 一个字节不动。**
|
|
23
23
|
*
|
|
24
24
|
* ── 🔴 字节构造规则(权威定义;跨仓签名器照此实现,docs/ASSISTANT-WIRE-CONTRACT.md §6.2 同源)──────────
|
|
25
25
|
* 被 HMAC 的是下面这个字符串的 **UTF-8 字节**:
|
|
26
26
|
* 1. **恒 5 元素、定序**的紧凑 JSON 数组(元素间**无空格**):
|
|
27
27
|
* `[sessionId, boundCallId|null, boundInputHash|null, decision, reason|null]`
|
|
28
28
|
* —— 恒定长度是刻意的:签名器里少一个"有 reason 才追加"的条件分支,就少一类跨实现漂移。
|
|
29
|
-
* 🔴 **唯一的例外是尾位**(
|
|
29
|
+
* 🔴 **唯一的例外是尾位**([ref],server 7.87.0 起是**一只扩展对象**;7.86.0 的裸尾位形已删除):
|
|
30
30
|
* 对扩展键**闭集** {@link APPROVAL_ENVELOPE_EXT_KEYS}(字典序即声明序)逐键判 `!== undefined`,
|
|
31
31
|
* 在场的收进一只对象 `ext`;**`ext` 为空 ⇒ 一个字节都不追加**(消息与 7.85.0 逐字节相同),
|
|
32
32
|
* 非空 ⇒ 追加为第 6 位 `[…head, ext]`。`JSON.stringify` 对 `ext` 的键序 = 插入序 = 闭集字典序,
|
|
33
33
|
* 所以规范化无歧义,**与调用方给键的顺序无关**。
|
|
34
|
-
* 为什么不继续用「裸的第 6、7 格」(
|
|
34
|
+
* 为什么不继续用「裸的第 6、7 格」([ref] 的形):两个扩展位都可选 ⇒ 只有 `answer` 在场时它落在
|
|
35
35
|
* 第 6 格、与 `permissionModeAfter` 撞位,靠类型猜是谁 = 签名歧义。扩展对象让「在场的是谁」自带
|
|
36
36
|
* 名字,而且以后再加决裁字段不动数组形(规则集不再长)。
|
|
37
37
|
* 向后兼容仍然成立的那一半:**不带任何扩展键的体**,字节与 7.85.0 逐字相同 ⇒ 不签这些位的既有
|
|
@@ -95,7 +95,7 @@ export interface ApprovalEnvelope {
|
|
|
95
95
|
decision: string;
|
|
96
96
|
reason?: string | null;
|
|
97
97
|
/**
|
|
98
|
-
* 🔴 **
|
|
98
|
+
* 🔴 **[ref](7.87.0)—— 操作员对一次 AskUserQuestion 的回答进签名载荷。**
|
|
99
99
|
*
|
|
100
100
|
* 它此前**不在**信封里 ⇒ 一个能改写线上字节的中间人(反代 / 被接管的客户端 —— 正是 HMAC 的风险
|
|
101
101
|
* 模型)可以在操作员签过的那次批准里只换 `answer`:动作没变、MAC 照过,**模型收到的答案变了**。
|
|
@@ -106,7 +106,7 @@ export interface ApprovalEnvelope {
|
|
|
106
106
|
*/
|
|
107
107
|
answer?: QuestionAnswerProjection;
|
|
108
108
|
/**
|
|
109
|
-
* 🔴 **
|
|
109
|
+
* 🔴 **[ref] 合并复审 F1 [high]**(7.86.0 立,[ref] 把它从裸尾位挪进扩展对象)—— `plan_review` 的
|
|
110
110
|
* `permissionModeAfter` 选的是**批准之后这条 run 有没有手**(`acceptEdits` = 工作目录内的写不再逐次
|
|
111
111
|
* 征询)。它铸下来时没有进签名载荷 ⇒ 中间人可以把操作员签的那次 `default` 批准原地改成 `acceptEdits`:
|
|
112
112
|
* 动作没变、MAC 照过,**权限变了**。
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* [ref] / [ref] —— 「无人可答」的**政策感知终态 claim**:全仓唯一一只(NP-2 的政策结算抽出来,四处调用,不写第二份)。
|
|
3
3
|
*
|
|
4
4
|
* 一句话:一只没人答的 ask 在持久 ask 行上**落什么终局**,由部署政策(`UNATTENDED_APPROVAL_POLICY`)一处决定 ——
|
|
5
5
|
* · `park` ⇒ `expire` 意图:STREAM_PENDING→PARKING、批转投递面、同批流内兄弟连坐 VOID(park 路由的单位是整批,core 随后
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* 3. 两兜底臂 —— `ensureAsk` 行不可用 / ensure 身份不定(`tool-approval.ts` `landUnattendedOutcome`,只在交给 core 的是**结算**时
|
|
16
16
|
* 调:park 路由不是结算,行留给投递面的既有机器,park 行为逐字不变),以及后者迟到落盘那条行的收尾;
|
|
17
17
|
* 4. 崩溃恢复腿 —— 对账收敛器段二的孤儿 STREAM_PENDING 代打(`approval-reconciler.ts`):它就是窗到期竞争者在崩溃后的补位,
|
|
18
|
-
* 同一只 claim、同一个转移(
|
|
18
|
+
* 同一只 claim、同一个转移([ref] 之前它无条件 `expireAsk`,deny 部署上崩溃后行进 PARKING,run 完成后成不带来源的 DENIED)。
|
|
19
19
|
*
|
|
20
20
|
* 形:纯委托 —— 店的原子终局 claim(`ApprovalAskStore.claimTerminal`,三 twin 一台 CAS 机器,律 2)+ 政策→意图的穷举映射。
|
|
21
21
|
* 答案自足(律 1):赢 ⇒ `{claimed:true, voidedSiblings}`(refuse 恒空名单);输 ⇒ 携行真相;抛错 ⇒ 什么也不证明。
|
|
@@ -192,7 +192,7 @@ export interface ReconcileStats {
|
|
|
192
192
|
* (见 {@link RECONCILE_SEGMENT_BUDGET_MS})。 */
|
|
193
193
|
budgetExhausted: number;
|
|
194
194
|
/** 段二:被代打**窗到期终局 claim** 的孤儿 `STREAM_PENDING` 行数(赢 CAS 的)。「expired」指触发(窗过了没人收),
|
|
195
|
-
* 不指意图 —— 与 live 腿 `window_expired` 同一个读法:park 部署 ⇒ expire(进投递面);deny 部署 ⇒ refuse(当场落政策结算,
|
|
195
|
+
* 不指意图 —— 与 live 腿 `window_expired` 同一个读法:park 部署 ⇒ expire(进投递面);deny 部署 ⇒ refuse(当场落政策结算,[ref])。 */
|
|
196
196
|
orphansExpired: number;
|
|
197
197
|
}
|
|
198
198
|
/** 撤卡帧的投递面(逐 ctx 分发:durable 腿落账本、sync 腿 live,见 `ApprovalRevokeFrame` 顶注)。
|
|
@@ -226,13 +226,13 @@ export interface ApprovalReconcilerDeps {
|
|
|
226
226
|
adhocGraceMs: number;
|
|
227
227
|
orphanTtlMs: number;
|
|
228
228
|
/**
|
|
229
|
-
*
|
|
229
|
+
* [ref]:部署的无人值守政策(`UNATTENDED_APPROVAL_POLICY`)—— 段二孤儿代打打的是哪个终局 claim。**必填**、恒传(与协调器
|
|
230
230
|
* 读同一个部署值;没有缺省 —— 缺省 park 会让 deny 部署在崩溃恢复这一形上静默退回「进投递面 → 不带来源的 DENIED」)。
|
|
231
231
|
*/
|
|
232
232
|
unattendedPolicy: UnattendedApprovalPolicy;
|
|
233
233
|
emitRevoke?: ApprovalRevokeEmitter | undefined;
|
|
234
234
|
/**
|
|
235
|
-
*
|
|
235
|
+
* [ref]:park 提交的唯一观察点(`plugins/park-commit-watch.ts`;在场 ⇔ 本部署有 checkpoint 店)。在场 ⇒ 收敛器订阅它:一只审批停车行
|
|
236
236
|
* 提交的那一拍,对**这次调用**的 `PARKING` 行即时跑判据 1(与周期扫同一只执行体),`put` 等它收完才交还 core。缺席 ⇒ 只有周期扫(修前形)。
|
|
237
237
|
*/
|
|
238
238
|
parkCommits?: Pick<ParkCommitWatch, "onParkCommitted" | "track"> | undefined;
|
package/dist/approval.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ import { type ExecutionLane } from "./execution-lane-caps.js";
|
|
|
9
9
|
import { type ApprovalExemptionStore } from "./plugins/approval-exemption-store.js";
|
|
10
10
|
/**
|
|
11
11
|
* 门意图判据读的五个量(`ServiceConfig` 结构满足)。单独成型是为了让**热路径**能拿「候选视图」来判
|
|
12
|
-
* (
|
|
12
|
+
* ([ref] 波 2:`{ ...config, approvalRequire: 候选名单 }`)—— 判据只有一份,输入可以是活配置也可以是候选。
|
|
13
13
|
*/
|
|
14
14
|
export interface GateIntentView {
|
|
15
15
|
readonly approvalRequire: readonly string[];
|
|
@@ -21,7 +21,7 @@ export interface GateIntentView {
|
|
|
21
21
|
/**
|
|
22
22
|
* 三张审批名单(require / deny / never-auto)里**有没有一张在场** —— 「这台部署有一份要执行的审批策略」。
|
|
23
23
|
*
|
|
24
|
-
* 🔴
|
|
24
|
+
* 🔴 [ref] 波 2(codex r1 F1):leader 车道的 durable 审批席曾只按 `approvalRequire` 非空给出。require 名单转热之后,
|
|
25
25
|
* 中心热撤空它就把 leader worker 上**独立**的 deny / never-auto 两张表一起撤掉(主车道照旧 deny / ask)—— 三张表是
|
|
26
26
|
* 三条独立的限制,任何一张在场都要装策略。{@link hasOperatorGateIntent} 的名单三格就是本函数(同一判据,不写两份)。
|
|
27
27
|
*/
|
|
@@ -42,9 +42,9 @@ export declare function hasApprovalListIntent(config: Pick<GateIntentView, "appr
|
|
|
42
42
|
*/
|
|
43
43
|
export declare function hasOperatorGateIntent(config: GateIntentView): boolean;
|
|
44
44
|
/**
|
|
45
|
-
* 单用户 turnkey 的 **auto-accept 基线**适用吗 —— 单用户(
|
|
45
|
+
* 单用户 turnkey 的 **auto-accept 基线**适用吗 —— 单用户(部署形表行 `multiTenant` 不成立)∧ 运维零门意图。
|
|
46
46
|
*
|
|
47
|
-
* 🔴
|
|
47
|
+
* 🔴 [ref] 波 2 ③:**每请求现算**,不是 boot 常量。判据的输入 `approvalRequire` 自本批起在进程内会被中心
|
|
48
48
|
* 热换;boot 期算好的一个布尔会让「名单从空变非空」之后 allow-all 基线仍挂在每个新任务上 —— 运维刚表达的
|
|
49
49
|
* 门意图被基线静默吞掉([ref] 方向)。所以消费点(`boot/resolve-spec.ts` 每个任务、stage-07 的 boot 姿态行、
|
|
50
50
|
* run-local 的补偿 warn)一律调本函数,谁也不持有它的快照。
|
|
@@ -58,10 +58,10 @@ export declare function singleUserAutoAcceptBaselineApplies(config: GateIntentVi
|
|
|
58
58
|
* HIGH;与 env 墓碑族同谱系)。v4.3.0 的轮询门形(APPROVAL_REQUIRE + DB backend + DURABLE_APPROVAL 未设)在
|
|
59
59
|
* 5.0.0 只剩 core 每任务 warn——**原先拦、现在放**(方向反转)。「留 undefined 让 core warn」对新配置是
|
|
60
60
|
* 曝露误配,对升级存量是门静默消失,后者必须响亮。
|
|
61
|
-
* · **热路径**(
|
|
61
|
+
* · **热路径**([ref] 波 2 ④,`web-admin-client/apply-effective.ts` 的审批组 stage):对**候选视图**
|
|
62
62
|
* (活配置 + 候选名单)判,拒因 ⇒ 审批组**整组拒**、活配置零变化、世代账停旧代。进程在跑,拒启不是选项;
|
|
63
63
|
* 而放行一份「没有 checkpoint 店可停车」的名单 = 单用户 auto-accept 基线仍在、名单静默不生效。
|
|
64
|
-
* · **每个任务的装配**(
|
|
64
|
+
* · **每个任务的装配**([ref],`boot/resolve-spec.ts` 的 `resolveSpec` 头一道):对**活配置**判,拒因 ⇒ 请求 501
|
|
65
65
|
* `capability.checkpoint_store_required`。部署形到不了(boot 已拒启);可达的是嵌入方装配 / 直调 `resolveSpec`(自己递 ctx、没经 stage-07)。
|
|
66
66
|
* 修前这一形把审批基线静默铸成 `undefined`,请求的 allow 清「普通问」后任务零卡落盘 —— 同一条规则在起服层拒、在装配层静默 = 一事两读。
|
|
67
67
|
* `checkpointStorePresent` 是**部署事实**(本进程建没建出 checkpoint 店),不在 `ServiceConfig` 里 ⇒ 调用方显式递。
|
|
@@ -69,7 +69,7 @@ export declare function singleUserAutoAcceptBaselineApplies(config: GateIntentVi
|
|
|
69
69
|
*/
|
|
70
70
|
export declare function gateIntentUnserviceableReason(config: GateIntentView, checkpointStorePresent: boolean): string | undefined;
|
|
71
71
|
/**
|
|
72
|
-
*
|
|
72
|
+
* [ref] C3 —— 「**无应答面**」两条 boot warn 的判据与文案(纯函数;stage-07 只负责打日志)。
|
|
73
73
|
*
|
|
74
74
|
* 两条 warn 警的是同一类失败:一个 `ask` 发生了,而这台部署既没有活体协调器(`TOOL_APPROVAL_ENABLED`)也没有
|
|
75
75
|
* durable 停车(`DURABLE_APPROVAL`)⇒ core `resolveAsk` 无 onAsk ⇒ headless 自动拒(fail-closed,写进转录)。
|
|
@@ -185,7 +185,13 @@ export declare function createDeploymentListExemption(store: Pick<ApprovalExempt
|
|
|
185
185
|
warn(event: string, fields?: Record<string, unknown>): void;
|
|
186
186
|
}, leg?: "parked_revive"): DeploymentListExemption;
|
|
187
187
|
/**
|
|
188
|
-
*
|
|
188
|
+
* **每腿自动批额度的审批人名**(本仓闭词;core `AskOutcome.approver` 契约逐字「a closed word the host owns, never a person」)。
|
|
189
|
+
* 结算记录读 `policy_allowed` / `who.party: "policy"` / `who.approver` = 本词 —— 审计读者按它认出「这一次放行是部署的自动批额度答的」,
|
|
190
|
+
* 与无人值守腿的 `unattended_class_answer`(`unattended-permission-mode.ts`)同族。
|
|
191
|
+
*/
|
|
192
|
+
export declare const AUTO_APPROVE_BUDGET_APPROVER = "auto_approve_budget";
|
|
193
|
+
/**
|
|
194
|
+
* **请求叶策略:`settings.permissions.neverAuto`**([ref])—— 命中名单的工具恒问真人;名单外「本层没有意见」(裸 allow)。叶只管请求自己写的那张表,部署的 `APPROVAL_NEVER_AUTO`
|
|
189
195
|
* 在基线里({@link createDurableAskPolicy}),两者经 `tightenGoverned` 的 deny-wins 折叠取并:请求叶只会**多**问,删不掉基线里的任何一行。
|
|
190
196
|
*
|
|
191
197
|
* 名字读法与部署名单是**同一只**({@link createApprovalListVerdict} → 精确 ∪ covering,收紧臂读调用答得上的全部名字):一条规则只有一种读法。问的铸点是
|
package/dist/approval.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { isNamespacedCoveringRuleName, namespacedRuleNameCovers } from "@sema-agent/core";
|
|
1
|
+
import { createApprovalPolicy, isNamespacedCoveringRuleName, namespacedRuleNameCovers } from "@sema-agent/core";
|
|
2
2
|
import { operatorAlwaysHumanAsk, operatorAsk, requestAlwaysHumanAsk } from "./operator-ask.js";
|
|
3
3
|
import { ASK_USER_QUESTION_TOOL_NAME } from "./approval-content-kind.js";
|
|
4
4
|
import { isExplicitPosture } from "./posture-source.js";
|
|
5
|
+
import { DEPLOYMENT_SHAPE_PREDICATES } from "./deployment-shape.js";
|
|
5
6
|
import { handsOnWorkerFilePlane } from "./execution-lane-caps.js";
|
|
7
|
+
import { NAME_TABLE_BEHAVIOR } from "./namespaced-rule-name.js";
|
|
6
8
|
import { heldRuleName } from "./tool-rule-names.js";
|
|
7
9
|
import { DURABLE_CONVERGE_READ_TIMEOUT_MS, policyAskStandingAnswerFacts, standingAnswerDurablyRecordable } from "./tool-approval.js";
|
|
8
10
|
import { APPROVAL_EXEMPTED_EVENT } from "./plugins/approval-exemption-store.js";
|
|
@@ -16,7 +18,7 @@ export function hasOperatorGateIntent(config) {
|
|
|
16
18
|
(config.durableApproval && isExplicitPosture(config.durableApprovalSource)));
|
|
17
19
|
}
|
|
18
20
|
export function singleUserAutoAcceptBaselineApplies(config) {
|
|
19
|
-
return config
|
|
21
|
+
return !DEPLOYMENT_SHAPE_PREDICATES.multiTenant.holds(config) && !hasOperatorGateIntent(config);
|
|
20
22
|
}
|
|
21
23
|
export function gateIntentUnserviceableReason(config, checkpointStorePresent) {
|
|
22
24
|
if (!hasOperatorGateIntent(config) || checkpointStorePresent)
|
|
@@ -114,13 +116,22 @@ export function createDeploymentListExemption(store, sessionId, logger, leg) {
|
|
|
114
116
|
}
|
|
115
117
|
function createNameSetMatcher(names) {
|
|
116
118
|
const exact = new Set(names);
|
|
117
|
-
const covering = names.filter(isNamespacedCoveringRuleName);
|
|
119
|
+
const covering = names.filter((name) => isNamespacedCoveringRuleName(name, NAME_TABLE_BEHAVIOR));
|
|
118
120
|
if (covering.length === 0)
|
|
119
121
|
return (toolName) => exact.has(toolName);
|
|
120
122
|
return (toolName) => exact.has(toolName) || covering.some((rule) => namespacedRuleNameCovers(rule, toolName));
|
|
121
123
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
+
export const AUTO_APPROVE_BUDGET_APPROVER = "auto_approve_budget";
|
|
125
|
+
function budgetSeatAnswer(req, requireHit, signal) {
|
|
126
|
+
let answered = false;
|
|
127
|
+
const seat = createApprovalPolicy({
|
|
128
|
+
requireApproval: [requireHit],
|
|
129
|
+
approve: () => {
|
|
130
|
+
answered = true;
|
|
131
|
+
return { allow: true, settledBy: "policy", approver: AUTO_APPROVE_BUDGET_APPROVER };
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
return { answered: () => answered, verdict: Promise.resolve(seat.check(req, signal)) };
|
|
124
135
|
}
|
|
125
136
|
export function createRequestNeverAutoPolicy(names, source) {
|
|
126
137
|
const verdictOf = createApprovalListVerdict({ requireApproval: [], neverAuto: names });
|
|
@@ -149,7 +160,7 @@ export function createDurableAskPolicy(opts) {
|
|
|
149
160
|
let autoApproved = 0;
|
|
150
161
|
const isQuestionTool = (name) => name === ASK_USER_QUESTION_TOOL_NAME;
|
|
151
162
|
return {
|
|
152
|
-
check: (req) => {
|
|
163
|
+
check: (req, signal) => {
|
|
153
164
|
const verdict = verdictOf(req);
|
|
154
165
|
switch (verdict.list) {
|
|
155
166
|
case "deny":
|
|
@@ -157,7 +168,7 @@ export function createDurableAskPolicy(opts) {
|
|
|
157
168
|
case "never_auto":
|
|
158
169
|
return operatorAlwaysHumanAsk(`APPROVAL_NEVER_AUTO(${verdict.hit})`, `human approval required to run "${req.toolName}"`);
|
|
159
170
|
case "require":
|
|
160
|
-
return decideRequired(req, verdict.hit);
|
|
171
|
+
return decideRequired(req, verdict.hit, signal);
|
|
161
172
|
case "none":
|
|
162
173
|
return { action: "allow" };
|
|
163
174
|
default: {
|
|
@@ -167,7 +178,7 @@ export function createDurableAskPolicy(opts) {
|
|
|
167
178
|
}
|
|
168
179
|
},
|
|
169
180
|
};
|
|
170
|
-
function decideRequired(req, requireHit) {
|
|
181
|
+
function decideRequired(req, requireHit, signal) {
|
|
171
182
|
const rem = req.budget?.resourceRemainingMicroUsd;
|
|
172
183
|
if (rem !== undefined && rem <= 0) {
|
|
173
184
|
return operatorAlwaysHumanAsk("RESOURCE_SUSPEND budget exhausted", `durable resource budget exhausted — human approval required to run "${req.toolName}"`);
|
|
@@ -180,17 +191,25 @@ export function createDurableAskPolicy(opts) {
|
|
|
180
191
|
exemption.onExempted(req.toolName);
|
|
181
192
|
return { action: "allow" };
|
|
182
193
|
}
|
|
183
|
-
return budgetOrAsk(req, ask);
|
|
194
|
+
return budgetOrAsk(req, ask, requireHit, signal);
|
|
184
195
|
})();
|
|
185
196
|
}
|
|
186
|
-
return budgetOrAsk(req, ask);
|
|
197
|
+
return budgetOrAsk(req, ask, requireHit, signal);
|
|
187
198
|
}
|
|
188
|
-
function budgetOrAsk(req, ask) {
|
|
189
|
-
if (heldRuleName(req, isQuestionTool)
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
}
|
|
193
|
-
return
|
|
199
|
+
function budgetOrAsk(req, ask, requireHit, signal) {
|
|
200
|
+
if (heldRuleName(req, isQuestionTool) !== undefined || budget <= 0 || autoApproved >= budget)
|
|
201
|
+
return ask;
|
|
202
|
+
autoApproved++;
|
|
203
|
+
const { answered, verdict } = budgetSeatAnswer(req, requireHit, signal);
|
|
204
|
+
return verdict.then((d) => {
|
|
205
|
+
if (answered() && d.action === "allow")
|
|
206
|
+
return d;
|
|
207
|
+
autoApproved--;
|
|
208
|
+
return ask;
|
|
209
|
+
}, (err) => {
|
|
210
|
+
autoApproved--;
|
|
211
|
+
throw err;
|
|
212
|
+
});
|
|
194
213
|
}
|
|
195
214
|
}
|
|
196
215
|
//# sourceMappingURL=approval.js.map
|
package/dist/auth-bridge.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import type { Logger } from "./observability/logger.js";
|
|
|
3
3
|
import type { Metrics } from "./observability/metrics.js";
|
|
4
4
|
export type { VerifiedIdentity } from "@sema-agent/settings-schema/api/auth-bridge";
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* [ref] ② —— 鉴权桥 issuer 的**唯一**取值(装配 `boot/stage-09-leader.ts` 与 caps `centerWiring.issuer` 同读,不各写一份回退):
|
|
7
7
|
* 显式 `AUTH_BRIDGE_ISSUER`(`config.authBridgeIssuer`)恒赢 ⇒ `source:"explicit"`;缺席则回退中心基址 `webAdmin.baseUrl`
|
|
8
8
|
* (配了中心即默认开桥)⇒ `source:"fallback"`;两者都没有 ⇒ `undefined`(桥不装)。
|
|
9
9
|
*/
|