@sema-agent/server 7.134.0 → 7.136.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 +197 -1
- package/USAGE.md +147 -42
- package/deploy/sema-up/README.md +1 -1
- package/deploy/sema-up/chart/templates/NOTES.txt +1 -1
- package/deploy/sema-up/chart/values.yaml +1 -1
- package/dist/adoption/plan.d.ts +1 -1
- package/dist/approval-ask-audit-store.d.ts +24 -24
- package/dist/approval-ask-machine.d.ts +2 -2
- package/dist/approval-card.d.ts +122 -154
- package/dist/approval-card.js +50 -51
- package/dist/approval-content-kind.d.ts +23 -5
- package/dist/approval-content-kind.js +8 -1
- package/dist/approval-deny-reasons.d.ts +1 -1
- package/dist/approval-gate-currency.d.ts +22 -3
- package/dist/approval-gate-currency.js +44 -18
- 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 +8 -8
- package/dist/approval.js +4 -2
- package/dist/auth-bridge.d.ts +35 -6
- package/dist/auth-bridge.js +20 -3
- 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/budget-tracing.d.ts +1 -2
- package/dist/boot/budget-tracing.js +2 -2
- package/dist/boot/coordinators.d.ts +2 -2
- package/dist/boot/coordinators.js +2 -2
- 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 +1 -1
- package/dist/boot/memory-boundary.d.ts +2 -2
- package/dist/boot/memory-consolidation.d.ts +15 -15
- package/dist/boot/org-memory.js +1 -1
- package/dist/boot/parked-revive-gate.d.ts +3 -3
- package/dist/boot/parked-revive-gate.js +3 -2
- package/dist/boot/reapers.d.ts +4 -4
- package/dist/boot/resolve-spec.d.ts +1 -1
- package/dist/boot/resolve-spec.js +36 -29
- package/dist/boot/runner-deps.d.ts +11 -11
- package/dist/boot/runner-deps.js +7 -4
- 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-04-stores.d.ts +1 -1
- package/dist/boot/stage-05-execution-env.d.ts +1 -1
- package/dist/boot/stage-05-execution-env.js +4 -4
- package/dist/boot/stage-06-runners.d.ts +1 -1
- package/dist/boot/stage-06-runners.js +0 -2
- package/dist/boot/stage-07-capability-layer.d.ts +1 -1
- package/dist/boot/stage-08-reapers.d.ts +1 -1
- package/dist/boot/stage-09-leader.d.ts +1 -1
- package/dist/boot/stage-10-http-server.d.ts +1 -1
- package/dist/boot/stores.js +4 -4
- package/dist/boot/web-admin.d.ts +17 -17
- package/dist/boot/web-admin.js +15 -27
- package/dist/boot/workflow-orchestration.js +2 -9
- package/dist/brain.d.ts +11 -11
- package/dist/brain.js +12 -3
- package/dist/budget.d.ts +7 -7
- package/dist/budget.js +4 -0
- 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 +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 +11 -7
- 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 +29 -32
- package/dist/capability-facts.js +17 -21
- package/dist/center-config-tier.d.ts +1 -1
- package/dist/center-credential.d.ts +22 -8
- package/dist/center-credential.js +18 -3
- 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-catalog.js +12 -10
- package/dist/config-d-migration.js +1 -1
- package/dist/config-invariants.d.ts +5 -5
- package/dist/config-invariants.js +11 -2
- package/dist/config-lkg.d.ts +1 -39
- package/dist/config-lkg.js +1 -83
- package/dist/config-provider.d.ts +13 -13
- package/dist/config-provider.js +2 -1
- package/dist/config-types.d.ts +95 -87
- package/dist/config.d.ts +26 -24
- package/dist/config.js +38 -18
- 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/elicitation.d.ts +8 -7
- package/dist/elicitation.js +9 -8
- 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/file-history-capture.d.ts +9 -9
- package/dist/file-history-disclosure.d.ts +25 -11
- package/dist/file-history-disclosure.js +25 -14
- package/dist/fleet/drain-entry.d.ts +2 -2
- package/dist/fleet/fleet-bus.d.ts +22 -14
- package/dist/fleet/fleet-bus.js +5 -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 +45 -14
- package/dist/fleet-client.js +24 -4
- package/dist/fleet-lease.d.ts +23 -19
- package/dist/fleet-lease.js +31 -23
- package/dist/governance-http-status.d.ts +2 -2
- package/dist/hooks/hook-llm.d.ts +7 -7
- package/dist/hooks/hook-llm.js +14 -8
- package/dist/hooks/hook-runner.d.ts +58 -31
- package/dist/hooks/hook-runner.js +37 -19
- 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 +20 -5
- package/dist/http/approval-sweeps.d.ts +1 -1
- package/dist/http/approval-sweeps.js +2 -1
- package/dist/http/checkpoint-ctx.d.ts +62 -17
- package/dist/http/checkpoint-ctx.js +78 -35
- package/dist/http/dispatch.d.ts +3 -3
- package/dist/http/dispatch.js +9 -9
- package/dist/http/durable-run-leg.js +4 -3
- package/dist/http/idempotency.d.ts +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 +7 -7
- package/dist/http/principal-gate.js +3 -2
- package/dist/http/readiness.d.ts +1 -1
- package/dist/http/request-guards.d.ts +4 -4
- package/dist/http/request-guards.js +2 -1
- package/dist/http/resume-ctx-read.d.ts +9 -23
- package/dist/http/resume-ctx-read.js +2 -3
- package/dist/http/resume-legs.d.ts +3 -3
- package/dist/http/resume-legs.js +11 -8
- package/dist/http/route-ctx.d.ts +29 -29
- package/dist/http/route-table.d.ts +9 -9
- package/dist/http/routes/agents-roster.d.ts +1 -1
- package/dist/http/routes/approvals-assistant.d.ts +5 -7
- package/dist/http/routes/approvals-assistant.js +101 -26
- 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 +3 -3
- package/dist/http/routes/fleet.d.ts +1 -1
- package/dist/http/routes/fleet.js +2 -1
- 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/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/runs.js +23 -11
- package/dist/http/routes/session-sync.d.ts +1 -1
- package/dist/http/routes/session-sync.js +97 -46
- package/dist/http/routes/sessions-list.js +1 -1
- package/dist/http/routes/sessions.js +43 -53
- package/dist/http/routes/tasks.d.ts +1 -1
- package/dist/http/routes/trace-usage.d.ts +1 -1
- 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 +34 -34
- 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.js +1 -1
- 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 +33 -24
- package/dist/index.d.ts +1 -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 +6 -6
- package/dist/list-entry-display.d.ts +1 -1
- package/dist/lsp-evict.d.ts +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-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-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-gap.d.ts +49 -4
- package/dist/model-route-gap.js +34 -1
- 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/object-store-buckets.d.ts +13 -0
- package/dist/object-store-buckets.js +3 -0
- 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 +17 -13
- package/dist/observability/fail-open.js +17 -13
- package/dist/observability/metrics.d.ts +3 -3
- package/dist/observability/metrics.js +1 -1
- package/dist/observability/principal-context.d.ts +4 -1
- package/dist/observability/principal-context.js +6 -1
- 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/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/outbound-dispatcher.d.ts +4 -4
- package/dist/parent-watch.d.ts +4 -4
- package/dist/parked-decide.d.ts +20 -18
- package/dist/parked-decide.js +31 -11
- package/dist/parked-revive-surface.d.ts +7 -7
- package/dist/parked-revive-surface.js +2 -3
- package/dist/peer-directory.d.ts +5 -4
- package/dist/peer-directory.js +6 -6
- package/dist/permission-rule-list.d.ts +10 -1
- package/dist/permission-rule-list.js +7 -5
- package/dist/permission-rule-vocab.d.ts +2 -2
- 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 +42 -15
- package/dist/plugins/approval-ask-store-sql.js +21 -5
- package/dist/plugins/approval-exemption-store.d.ts +3 -3
- package/dist/plugins/approval-nonce-store.d.ts +3 -3
- 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/blob-backend.js +2 -1
- package/dist/plugins/caching-session-store.d.ts +23 -32
- package/dist/plugins/caching-session-store.js +5 -17
- package/dist/plugins/checkpoint-index-columns.d.ts +130 -0
- package/dist/plugins/checkpoint-index-columns.js +90 -0
- package/dist/plugins/checkpoint-store-sql.d.ts +71 -69
- package/dist/plugins/checkpoint-store-sql.js +109 -127
- 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 +15 -7
- package/dist/plugins/file-history-store-sql.js +55 -36
- 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 +10 -10
- package/dist/plugins/local-checkpoint-store.js +7 -7
- package/dist/plugins/local-session-store.d.ts +34 -38
- package/dist/plugins/local-session-store.js +20 -39
- package/dist/plugins/local-session-window.d.ts +1 -1
- 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 +73 -54
- package/dist/plugins/one-time-migrations.js +131 -134
- 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 +12 -19
- package/dist/plugins/permission-rule-store-sql.d.ts +38 -4
- package/dist/plugins/permission-rule-store-sql.js +67 -24
- 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 +8 -20
- package/dist/plugins/pg-session-storage.js +14 -27
- package/dist/plugins/remote-env-adb.d.ts +10 -10
- package/dist/plugins/remote-env-device.d.ts +10 -9
- package/dist/plugins/remote-env-device.js +6 -2
- 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 +26 -13
- package/dist/plugins/remote-env-k8s.js +24 -7
- 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/s3-answer.d.ts +15 -0
- package/dist/plugins/s3-answer.js +5 -0
- 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.js +1 -1
- package/dist/plugins/session-placement.d.ts +1 -1
- 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/snapshot-bucket-presence.d.ts +39 -4
- package/dist/plugins/snapshot-bucket-presence.js +35 -7
- package/dist/plugins/sql-driver.d.ts +8 -8
- package/dist/plugins/sql-errors.d.ts +40 -1
- package/dist/plugins/sql-errors.js +49 -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/store-fault.d.ts +4 -0
- package/dist/plugins/store-fault.js +8 -0
- 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 +10 -3
- package/dist/plugins/tidb-session-store.d.ts +16 -26
- package/dist/plugins/tidb-session-store.js +15 -27
- 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 +20 -5
- 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-declaration-refusal.d.ts +94 -0
- package/dist/request-declaration-refusal.js +78 -0
- package/dist/request-image-urls.d.ts +6 -0
- package/dist/request-image-urls.js +27 -0
- package/dist/request-key-closure.d.ts +6 -1
- package/dist/request-key-closure.js +5 -2
- 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/runs.d.ts +13 -11
- package/dist/runs.js +15 -1
- package/dist/runtime-caps-resolver.d.ts +6 -6
- package/dist/runtime-caps-resolver.js +1 -1
- package/dist/runtime-governance.d.ts +9 -9
- package/dist/sandbox-pkg-source.d.ts +17 -12
- package/dist/sandbox-pkg-source.js +14 -9
- package/dist/sealed-key.d.ts +22 -3
- package/dist/sealed-key.js +47 -4
- package/dist/security.d.ts +23 -26
- 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 +7 -7
- package/dist/session-incarnation.d.ts +65 -37
- package/dist/session-incarnation.js +30 -12
- 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-row.d.ts +3 -17
- package/dist/session-row.js +4 -0
- package/dist/session-sync-kernel.d.ts +4 -4
- package/dist/session-sync.d.ts +61 -6
- package/dist/session-sync.js +55 -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 +52 -79
- package/dist/task-a2a.js +224 -62
- package/dist/task-cwd.d.ts +7 -88
- package/dist/task-cwd.js +2 -15
- package/dist/task-mcp.d.ts +13 -17
- package/dist/task-mcp.js +29 -49
- package/dist/task-settings.d.ts +30 -18
- package/dist/task-settings.js +33 -3
- 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 +166 -207
- package/dist/tool-approval.js +61 -61
- package/dist/tool-rule-names.d.ts +2 -2
- package/dist/trace/core-keyset-guard.d.ts +13 -8
- 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 +31 -4
- package/dist/trace/exit-seat.js +69 -67
- package/dist/trace/ledger-events.d.ts +3 -3
- package/dist/trace/ledger-sink.d.ts +1 -1
- package/dist/trace/model-segment.d.ts +3 -3
- package/dist/trace/project.d.ts +47 -45
- package/dist/trace/project.js +33 -1
- package/dist/trace/redact.d.ts +61 -31
- package/dist/trace/redact.js +394 -153
- package/dist/trace/self-minted-wire.d.ts +302 -14
- package/dist/trace/self-minted-wire.js +87 -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 +3 -3
- package/dist/trace/wire-projection-faces.js +1 -1
- package/dist/unattended-permission-mode.d.ts +5 -5
- package/dist/url-credential-refusal.d.ts +52 -0
- package/dist/url-credential-refusal.js +14 -0
- package/dist/url-refusal.d.ts +16 -3
- package/dist/url-refusal.js +15 -2
- 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 +28 -3
- package/dist/web-admin-client/skills-mcp.js +29 -1
- package/dist/web-admin-client/types.d.ts +16 -9
- package/dist/workspace-space.d.ts +32 -3
- package/dist/workspace-space.js +26 -0
- package/dist/write-protection.d.ts +2 -2
- package/package.json +5 -3
- package/scripts/drain-check-local.mjs +4 -2
- package/scripts/drain-check.mysql.sql +6 -2
- package/scripts/drain-check.pg.sql +6 -2
- package/skills/loop.md +1 -1
- package/skills/schedule.md +1 -1
- package/wire-changes/server@7.104.0.json +134 -0
- package/wire-changes/server@7.105.0.json +53 -0
- package/wire-changes/server@7.106.0.json +475 -0
- package/wire-changes/server@7.107.0.json +64 -0
- package/wire-changes/server@7.108.0.json +153 -0
- package/wire-changes/server@7.109.0.json +46 -0
- package/wire-changes/server@7.110.0.json +90 -0
- package/wire-changes/server@7.111.0.json +86 -0
- package/wire-changes/server@7.112.0.json +60 -0
- package/wire-changes/server@7.113.0.json +26 -0
- package/wire-changes/server@7.114.0.json +26 -0
- package/wire-changes/server@7.115.0.json +97 -0
- package/wire-changes/server@7.116.0.json +218 -0
- package/wire-changes/server@7.116.1.json +26 -0
- package/wire-changes/server@7.117.0.json +65 -0
- package/wire-changes/server@7.118.0.json +129 -0
- package/wire-changes/server@7.119.0.json +65 -0
- package/wire-changes/server@7.120.0.json +89 -0
- package/wire-changes/server@7.121.0.json +219 -0
- package/wire-changes/server@7.122.0.json +54 -0
- package/wire-changes/server@7.123.0.json +26 -0
- package/wire-changes/server@7.124.0.json +336 -0
- package/wire-changes/server@7.124.1.json +26 -0
- package/wire-changes/server@7.125.0.json +111 -0
- package/wire-changes/server@7.126.0.json +285 -0
- package/wire-changes/server@7.127.0.json +77 -0
- package/wire-changes/server@7.127.1.json +26 -0
- package/wire-changes/server@7.127.2.json +53 -0
- package/wire-changes/server@7.128.0.json +26 -0
- package/wire-changes/server@7.129.0.json +106 -0
- package/wire-changes/server@7.129.1.json +26 -0
- package/wire-changes/server@7.130.0.json +26 -0
- package/wire-changes/server@7.131.0.json +118 -0
- package/wire-changes/server@7.132.0.json +226 -0
- package/wire-changes/server@7.133.0.json +1155 -0
- package/wire-changes/server@7.134.0.json +107 -0
- package/wire-changes/server@7.135.0.json +174 -0
- package/wire-changes/server@7.136.0.json +448 -0
- package/dist/http/run-declared-families.d.ts +0 -16
- package/dist/http/run-declared-families.js +0 -12
- package/dist/orchestration/workflow-journal-entry.js +0 -27
package/dist/approval-card.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { ALLOW_RULE_MEMBERS, ASK_EVIDENCE_ABSENCE_VALUES, BOUND_GRANT_ABSENCES, MAX_RULE_TEXT_CHARS, PERSISTED_RULE_MATCHES, UNCOVERED_SEGMENT_REASONS, READ_ROOT_CANDIDATE_DIR_MAX, RESUME_STARTUP_CAUSES, RULE_OFFERS_ABSENCES, STEER_REPLAY_FACETS, isAskClass, isAskOrigin, isAutoModeFallbackCause, isMintableProbeReason, isPersistedRuleMandate, screenAskClassMembers } from "@sema-agent/core";
|
|
2
|
+
import { ALLOW_RULE_MEMBERS, ASK_EVIDENCE_ABSENCE_VALUES, TOOL_APPROVAL_CARDS, BOUND_GRANT_ABSENCES, DENIAL_LIMIT_BOUNDS, MAX_RULE_TEXT_CHARS, PERSISTED_RULE_MATCHES, UNCOVERED_SEGMENT_REASONS, READ_ROOT_CANDIDATE_DIR_MAX, RESUME_STARTUP_CAUSES, RULE_OFFERS_ABSENCES, RULE_OFFER_KINDS, STEER_REPLAY_FACETS, isAskClass, readRuleOffers, isAskOrigin, isAutoModeFallbackCause, isMintableProbeReason, isPersistedRuleMandate, screenAskClassMembers } from "@sema-agent/core";
|
|
3
3
|
import { redactSecrets } from "./trace/redact.js";
|
|
4
4
|
import { recordFailOpen } from "./observability/fail-open.js";
|
|
5
|
+
import { readApprovalCard } from "./approval-content-kind.js";
|
|
5
6
|
import { capText } from "./caller-text-echo.js";
|
|
6
7
|
import { retireParkArmWords, retireStoredCardWords } from "./retired-card-words.js";
|
|
7
8
|
export const MAX_AGENT_NAME = 200;
|
|
@@ -31,10 +32,9 @@ const RuleOfferBatchMemberSchema = z.union([
|
|
|
31
32
|
.strict(),
|
|
32
33
|
]);
|
|
33
34
|
const UncoveredSegmentDetailSchema = z.object({ segment: z.string().max(MAX_RULE_TEXT_CHARS), reason: UncoveredReasonSchema }).strict();
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
z
|
|
35
|
+
const RULE_OFFER_ARMS = {
|
|
36
|
+
single: z.object({ kind: z.literal("single"), rule: z.string().max(MAX_RULE_TEXT_CHARS), match: RuleMatchSchema, command: z.string().max(MAX_RULE_TEXT_CHARS) }).strict(),
|
|
37
|
+
batch: z
|
|
38
38
|
.object({
|
|
39
39
|
kind: z.literal("batch"),
|
|
40
40
|
rules: z.array(RuleOfferBatchMemberSchema).min(1).max(MAX_RULE_OFFER_BATCH_MEMBERS),
|
|
@@ -42,56 +42,39 @@ export const RuleOfferSchema = z.union([
|
|
|
42
42
|
uncoveredDetail: z.array(UncoveredSegmentDetailSchema).max(MAX_UNCOVERED_DETAIL_ROWS).optional(),
|
|
43
43
|
})
|
|
44
44
|
.strict(),
|
|
45
|
-
|
|
46
|
-
export const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
45
|
+
};
|
|
46
|
+
export const RuleOfferSchema = z.union([RULE_OFFER_ARMS.single, RULE_OFFER_ARMS.batch]);
|
|
47
|
+
const OFFER_DROP_WHY = {
|
|
48
|
+
not_an_array: "the stored value is not a list",
|
|
49
|
+
unknown_word: "a closed-set member holds a word this engine does not know",
|
|
50
|
+
malformed: "an element is not an offer this engine reads",
|
|
51
|
+
};
|
|
52
|
+
function recordOfferDropped(problem, index) {
|
|
53
|
+
recordFailOpen("server.rule-offers.offer-dropped", `${index !== undefined ? `index=${index} ` : ""}problem=${problem} (${OFFER_DROP_WHY[problem]})`);
|
|
54
|
+
}
|
|
55
|
+
export function readRuleOfferList(raw) {
|
|
56
|
+
const reading = readRuleOffers(Array.isArray(raw) ? raw.map(withoutOverCapDetailSeat) : raw);
|
|
57
|
+
if ("problem" in reading) {
|
|
58
|
+
recordOfferDropped(reading.problem);
|
|
59
|
+
return [];
|
|
60
|
+
}
|
|
61
|
+
reading.dropped.forEach((d) => recordOfferDropped(d.problem, d.index));
|
|
62
|
+
return reading.offers.map(withDetailSeatBounded);
|
|
63
|
+
}
|
|
64
|
+
function withoutOverCapDetailSeat(item, index) {
|
|
63
65
|
if (typeof item !== "object" || item === null)
|
|
64
66
|
return item;
|
|
65
67
|
const candidate = item;
|
|
66
|
-
if (candidate.kind !== "batch" || !(
|
|
68
|
+
if (candidate.kind !== "batch" || !Array.isArray(candidate.uncoveredDetail) || candidate.uncoveredDetail.length <= MAX_UNCOVERED_DETAIL_ROWS)
|
|
67
69
|
return item;
|
|
68
|
-
|
|
69
|
-
const
|
|
70
|
-
rows.length <= MAX_UNCOVERED_DETAIL_ROWS &&
|
|
71
|
-
rows.length === candidate.uncoveredSegments &&
|
|
72
|
-
rows.every((r) => UncoveredSegmentDetailRawSchema.safeParse(r).success);
|
|
73
|
-
if (wellFormed)
|
|
74
|
-
return item;
|
|
75
|
-
recordFailOpen("server.rule-offers.uncovered-detail-dropped", Array.isArray(rows) ? `rows=${rows.length} count=${String(candidate.uncoveredSegments)}` : `seat is ${typeof rows}`);
|
|
76
|
-
const { uncoveredDetail: _dropped, ...rest } = candidate;
|
|
70
|
+
recordFailOpen("server.rule-offers.uncovered-detail-dropped", `index=${index} rows=${candidate.uncoveredDetail.length} cap=${MAX_UNCOVERED_DETAIL_ROWS}`);
|
|
71
|
+
const { uncoveredDetail: _overCap, ...rest } = candidate;
|
|
77
72
|
return rest;
|
|
78
73
|
}
|
|
79
|
-
|
|
80
|
-
if (
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
if (candidate.kind !== "batch" || !Array.isArray(candidate.rules))
|
|
84
|
-
return item;
|
|
85
|
-
const isLegacy = (m) => typeof m === "object" &&
|
|
86
|
-
m !== null &&
|
|
87
|
-
!("kind" in m) &&
|
|
88
|
-
typeof m.rule === "string" &&
|
|
89
|
-
typeof m.match === "string" &&
|
|
90
|
-
typeof m.command === "string" &&
|
|
91
|
-
typeof m.segment === "string";
|
|
92
|
-
if (!candidate.rules.some(isLegacy))
|
|
93
|
-
return item;
|
|
94
|
-
return { ...candidate, rules: candidate.rules.map((m) => (isLegacy(m) ? { kind: "command", ...m } : m)) };
|
|
74
|
+
function withDetailSeatBounded(read) {
|
|
75
|
+
if (read.uncoveredDetailDropped === true)
|
|
76
|
+
recordFailOpen("server.rule-offers.uncovered-detail-dropped", `index=${read.index} seat is not one well-formed row per counted segment`);
|
|
77
|
+
return { index: read.index, offer: read.offer };
|
|
95
78
|
}
|
|
96
79
|
export function copyRuleOffer(o) {
|
|
97
80
|
switch (o.kind) {
|
|
@@ -363,11 +346,24 @@ export function parkRowFacts(stored) {
|
|
|
363
346
|
...(boundGrantAbsence !== undefined ? { boundGrantAbsence } : {}),
|
|
364
347
|
};
|
|
365
348
|
}
|
|
366
|
-
|
|
349
|
+
export function skillCardFacts(summary) {
|
|
350
|
+
return {
|
|
351
|
+
...(summary.boundGrantDigest !== undefined ? { boundGrantDigest: summary.boundGrantDigest } : {}),
|
|
352
|
+
...(summary.boundGrants !== undefined ? { boundGrants: summary.boundGrants } : {}),
|
|
353
|
+
...(summary.classifierNoRuling !== undefined ? { classifierNoRuling: summary.classifierNoRuling } : {}),
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
export function parkRowCarriesSkillCardFacts(stored) {
|
|
357
|
+
if (typeof stored !== "object" || stored === null || !("kind" in stored) || stored.kind !== "tool_approval")
|
|
358
|
+
return false;
|
|
359
|
+
const digest = "boundGrantDigest" in stored ? stored.boundGrantDigest : undefined;
|
|
360
|
+
return typeof digest === "string" || ("classifierNoRuling" in stored && stored.classifierNoRuling !== undefined);
|
|
361
|
+
}
|
|
362
|
+
export const DenialLimitFallbackSchema = z
|
|
367
363
|
.object({
|
|
368
364
|
consecutive: z.number().int().nonnegative(),
|
|
369
365
|
total: z.number().int().nonnegative(),
|
|
370
|
-
limit: z.enum(
|
|
366
|
+
limit: z.enum(DENIAL_LIMIT_BOUNDS),
|
|
371
367
|
autoDenyAfterMs: z.number().int().nonnegative().max(2147483647),
|
|
372
368
|
})
|
|
373
369
|
.strict();
|
|
@@ -395,6 +391,7 @@ export const ApprovalCardSchema = z
|
|
|
395
391
|
.strict(),
|
|
396
392
|
governanceForced: z.literal(true).optional(),
|
|
397
393
|
rememberRefused: z.literal(true).optional(),
|
|
394
|
+
approvalCard: z.enum(TOOL_APPROVAL_CARDS).optional(),
|
|
398
395
|
inputHasBidi: z.literal(true).optional(),
|
|
399
396
|
allowRuleShadowed: z
|
|
400
397
|
.array(z
|
|
@@ -462,6 +459,7 @@ export function buildApprovalCard(source, req, requiresRealApproval) {
|
|
|
462
459
|
const sourceTaskId = capText(source.sourceTaskId, MAX_IDENT);
|
|
463
460
|
const sourceAgentName = capText(source.sourceAgentName, MAX_AGENT_NAME);
|
|
464
461
|
const allowRuleShadowed = readAllowRuleShadowed(req);
|
|
462
|
+
const approvalCard = readApprovalCard(source.approvalCard);
|
|
465
463
|
return {
|
|
466
464
|
toolName: capText(source.toolName, MAX_IDENT) ?? "",
|
|
467
465
|
message: capText(source.message, MAX_MESSAGE) ?? "",
|
|
@@ -474,6 +472,7 @@ export function buildApprovalCard(source, req, requiresRealApproval) {
|
|
|
474
472
|
},
|
|
475
473
|
...(source.governanceForced === true ? { governanceForced: true } : {}),
|
|
476
474
|
...(source.rememberRefused === true ? { rememberRefused: true } : {}),
|
|
475
|
+
...(approvalCard !== undefined ? { approvalCard } : {}),
|
|
477
476
|
...(source.inputHasBidi === true ? { inputHasBidi: true } : {}),
|
|
478
477
|
...(allowRuleShadowed !== undefined ? { allowRuleShadowed } : {}),
|
|
479
478
|
...(probeCause !== undefined ? { probeCause } : {}),
|
|
@@ -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,7 +32,7 @@ export interface ParkedGateFace {
|
|
|
32
32
|
readonly approvalCard?: unknown;
|
|
33
33
|
}
|
|
34
34
|
/**
|
|
35
|
-
* 停驻行的卡 —— 读法只有引擎那一只:core 包根导出 `parkedApprovalCardOf(gate)`(core 7.54.0
|
|
35
|
+
* 停驻行的卡 —— 读法只有引擎那一只:core 包根导出 `parkedApprovalCardOf(gate)`(core 7.54.0 [ref] K2;审批门 = 门型的寄存臂是 `tool_approval`,
|
|
36
36
|
* 只在那里读卡,只有闭集成员算卡)。四态逐一处置(穷举 `switch`:core 加一态 ⇒ 编译红):`card` ⇒ 那个词;`no_card` / `not_approval` ⇒ 无卡;
|
|
37
37
|
* `unknown_word`(引擎交回**未经筛**的存储原值)⇒ 无卡 + 响亮:计一次 `server.approval-card.closed-word-out-of-set`(与 {@link readApprovalCard} 同一只计数、
|
|
38
38
|
* 同一只回显口径 —— 截 40、脱敏,对象只报形名)。修前本函数自己判「是不是审批门」(读 `PAUSE_REGISTRY` 的寄存臂)再交 {@link readApprovalCard},
|
|
@@ -44,4 +44,22 @@ export declare function parkedApprovalCard(gate: ParkedGateFace | undefined): To
|
|
|
44
44
|
* 门型不是 core 登记的门(存量行无门型 / 手改)⇒ `undefined`,调用方按「不是 `A`」处置(与无门型存量行的既有作废路同向)。
|
|
45
45
|
*/
|
|
46
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
|
+
* 包根同出(`index.ts`):嵌入方 / sdk 读这一只,不手抄。
|
|
52
|
+
* 到期分法**不**读这张表 —— SQL 里是由 core 两张表生成的 facet 谓词(`plugins/checkpoint-index-columns.ts`),JS 里是 {@link denySweepOwns}。
|
|
53
|
+
*/
|
|
54
|
+
export type ApprovalGateKind = {
|
|
55
|
+
[K in GateKind]: (typeof PAUSE_REGISTRY)[K]["pending"] extends "tool_approval" ? K : never;
|
|
56
|
+
}[GateKind];
|
|
57
|
+
export declare const APPROVAL_GATE_KINDS: readonly ApprovalGateKind[];
|
|
58
|
+
export declare function isApprovalGateKind(k: string | undefined): k is ApprovalGateKind;
|
|
59
|
+
/**
|
|
60
|
+
* 停驻行的到期归 SLA 拒扫腿(deny)而不是作废(expire)?—— **一只谓词** = core `facetOf(gate)` 读作 `A`(按 core 的定义,`A` 就是「审批门、deadline 是 SLA 拒」;
|
|
61
|
+
* 问答卡 ⇒ `B`,到期作废;非审批门 / 未登记门 / 无门 ⇒ 不归拒扫)。LOCAL 孪生的拒扫选行与作废腿的补集读这一只;SQL 孪生读由同两张表生成的谓词,逐行与它同答
|
|
62
|
+
* (`test/checkpoint-index-columns.test.ts` B 节)。修前多一个「∧ 审批门型」合取 —— 在 core 的登记表下恒真,删。
|
|
63
|
+
*/
|
|
64
|
+
export declare function denySweepOwns(gate: ParkedGateFace | undefined): boolean;
|
|
47
65
|
//# 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 { TOOL_APPROVAL_CARDS, facetOf, isGateKind, parkedApprovalCardOf } 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) {
|
|
@@ -33,4 +33,11 @@ export function parkedApprovalCard(gate) {
|
|
|
33
33
|
export function parkedFacetOf(gate) {
|
|
34
34
|
return gate !== undefined && isGateKind(gate.kind) ? facetOf({ kind: gate.kind, approvalCard: gate.approvalCard }) : undefined;
|
|
35
35
|
}
|
|
36
|
+
export const APPROVAL_GATE_KINDS = Object.freeze(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
|
+
}
|
|
36
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
|
*/
|
|
@@ -9,9 +9,24 @@
|
|
|
9
9
|
* ## 判官
|
|
10
10
|
* 问题:**这把 gate token 是不是该会话当前待决的审批门?**(应答口的答法:`resumeCheckpoint` 的 stale 臂 —— 回显的 token ≠ 该会话当前待决的审批门 ⇒ `409 approval_stale`。)
|
|
11
11
|
* · {@link currentApprovalGateToken} —— 该会话当前待决的审批门(审批门型优先,没有再退到任一待决行);应答口读它,读口读它,别处不再内联第二份;
|
|
12
|
-
* · {@link readGateCurrency} —— 一把 token 对着它的读数:`current`
|
|
12
|
+
* · {@link readGateCurrency} —— 一把 token 对着它的读数:`current`(带那一行)/ `absent`(店里没有这一行)/ `settled`(行在,但不再是当前待决门:已结算、已过期、被取代);
|
|
13
13
|
* · {@link createParkedGateRead} —— 协调器读口的门读席:把读数译成读口要的四种读法({@link ParkedGateReading}),`state` 闭集不加字。
|
|
14
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
|
+
*
|
|
15
30
|
* ## `settled` 怎么译(读口只说 checkpoint 上有凭据的话;一条规矩)
|
|
16
31
|
* 落盘的行不受类型面约束(旧版 / 手改 / 坏体 / 更新版本 core 写下的行可带闭集外的词或坏形),所以已结算门只按**一条规矩**读:
|
|
17
32
|
* ① 两个闭集词(行的 `status`、结算记录的种类 `settlement.kind`)各查一张穷举表,**同一查法**({@link throughTable}:只认表自己的键,非字符串不进表):
|
|
@@ -45,16 +60,20 @@ export interface GateCurrencyStore {
|
|
|
45
60
|
* 无序读会选中别的门型 —— 没有审批门才退到任一待决行(错门型诊断由 `/decide` 的 gate-kind 守卫点名)。应答口的 stale 臂与按问读口读这一只。
|
|
46
61
|
*/
|
|
47
62
|
export declare function currentApprovalGateToken(cs: Pick<GateCurrencyStore, "findPendingTokenBySession">, sessionId: string): Promise<CheckpointToken | null | undefined>;
|
|
48
|
-
/** 一把 gate token
|
|
63
|
+
/** 一把 gate token 对着判官的读数(`current` / `settled` 带分类用的那一行)。 */
|
|
49
64
|
export type GateCurrency = {
|
|
50
65
|
readonly kind: "current";
|
|
66
|
+
readonly checkpoint: Checkpoint;
|
|
51
67
|
} | {
|
|
52
68
|
readonly kind: "absent";
|
|
53
69
|
} | {
|
|
54
70
|
readonly kind: "settled";
|
|
55
71
|
readonly checkpoint: Checkpoint;
|
|
56
72
|
};
|
|
57
|
-
/**
|
|
73
|
+
/**
|
|
74
|
+
* 这把 gate token 是不是它那条会话当前待决的审批门 —— 分类只用同一时刻成立的读数(规矩见模块头注「一个读数只取自一个时刻」)。
|
|
75
|
+
* 读不出(店抛错)⇒ 原样上抛,由调用方的故障姿势处置;行一直在动、摸到 {@link GATE_READ_ROUNDS} ⇒ 抛。
|
|
76
|
+
*/
|
|
58
77
|
export declare function readGateCurrency(cs: GateCurrencyStore, gateToken: string): Promise<GateCurrency>;
|
|
59
78
|
/** 一个闭集词对已结算门的读法类:有人 / 有策略决过(往下读决议),或没有人决过它。 */
|
|
60
79
|
type SettledClass = "decided" | "void";
|
|
@@ -1,20 +1,32 @@
|
|
|
1
|
-
import { screenGateOutcome } from "@sema-agent/core";
|
|
1
|
+
import { REOPEN_REASONS, screenGateOutcome } from "@sema-agent/core";
|
|
2
2
|
import { approvalDecisionOfWinner } from "./plugins/checkpoint-store-sql.js";
|
|
3
|
-
import {
|
|
3
|
+
import {} from "./tool-approval.js";
|
|
4
|
+
import { APPROVAL_GATE_KINDS } from "./approval-content-kind.js";
|
|
4
5
|
export async function currentApprovalGateToken(cs, sessionId) {
|
|
5
6
|
return (await cs.findPendingTokenBySession(sessionId, undefined, { gateKinds: APPROVAL_GATE_KINDS })) ?? (await cs.findPendingTokenBySession(sessionId));
|
|
6
7
|
}
|
|
8
|
+
function revisionOf(cp) {
|
|
9
|
+
return cp.rev ?? 0;
|
|
10
|
+
}
|
|
11
|
+
const GATE_READ_ROUNDS = 3;
|
|
7
12
|
export async function readGateCurrency(cs, gateToken) {
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
+
}
|
|
18
30
|
}
|
|
19
31
|
const SETTLED_GATE_READING = { resolved: "decided", expired: "void", pending: "void" };
|
|
20
32
|
export const SETTLEMENT_KIND_READING = {
|
|
@@ -42,17 +54,18 @@ function throughTable(table, word, field) {
|
|
|
42
54
|
return table[word] === "decided" ? "decided" : { kind: "void" };
|
|
43
55
|
}
|
|
44
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) {
|
|
45
61
|
try {
|
|
46
|
-
return
|
|
62
|
+
return readWinner(checkpoint, gateBoundCallId);
|
|
47
63
|
}
|
|
48
64
|
catch (e) {
|
|
49
65
|
return unreadable([`the settled row could not be read (${e instanceof Error ? e.name : "non-Error throw"})`]);
|
|
50
66
|
}
|
|
51
67
|
}
|
|
52
|
-
function
|
|
53
|
-
const byStatus = throughTable(SETTLED_GATE_READING, checkpoint.status, "checkpoint status");
|
|
54
|
-
if (byStatus !== "decided")
|
|
55
|
-
return byStatus;
|
|
68
|
+
function readWinner(checkpoint, gateBoundCallId) {
|
|
56
69
|
const winner = checkpoint.resolvedOutcome;
|
|
57
70
|
const recorded = winner?.gateOutcome;
|
|
58
71
|
const [defect, ...more] = screenGateOutcome(recorded, { reading: "archive" });
|
|
@@ -73,12 +86,25 @@ function readSettledRow(checkpoint, gateBoundCallId) {
|
|
|
73
86
|
const note = typeof winner?.reason === "string" && winner.reason !== "" ? winner.reason : undefined;
|
|
74
87
|
return { kind: "decided", decision: direction === "approve" ? "allow" : "deny", decidedAtMs: settlement.when, ...(note !== undefined ? { decisionNote: note } : {}) };
|
|
75
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
|
+
}
|
|
76
102
|
export function createParkedGateRead(cs) {
|
|
77
103
|
return async ({ gateToken, gateBoundCallId }) => {
|
|
78
104
|
const currency = await readGateCurrency(cs, gateToken);
|
|
79
105
|
switch (currency.kind) {
|
|
80
106
|
case "current":
|
|
81
|
-
return
|
|
107
|
+
return openReading(currency.checkpoint, gateBoundCallId);
|
|
82
108
|
case "absent":
|
|
83
109
|
return { kind: "unknown", why: "row_absent" };
|
|
84
110
|
case "settled":
|
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,写进转录)。
|
|
@@ -191,7 +191,7 @@ export declare function createDeploymentListExemption(store: Pick<ApprovalExempt
|
|
|
191
191
|
*/
|
|
192
192
|
export declare const AUTO_APPROVE_BUDGET_APPROVER = "auto_approve_budget";
|
|
193
193
|
/**
|
|
194
|
-
* **请求叶策略:`settings.permissions.neverAuto`**(
|
|
194
|
+
* **请求叶策略:`settings.permissions.neverAuto`**([ref])—— 命中名单的工具恒问真人;名单外「本层没有意见」(裸 allow)。叶只管请求自己写的那张表,部署的 `APPROVAL_NEVER_AUTO`
|
|
195
195
|
* 在基线里({@link createDurableAskPolicy}),两者经 `tightenGoverned` 的 deny-wins 折叠取并:请求叶只会**多**问,删不掉基线里的任何一行。
|
|
196
196
|
*
|
|
197
197
|
* 名字读法与部署名单是**同一只**({@link createApprovalListVerdict} → 精确 ∪ covering,收紧臂读调用答得上的全部名字):一条规则只有一种读法。问的铸点是
|
package/dist/approval.js
CHANGED
|
@@ -2,7 +2,9 @@ import { createApprovalPolicy, isNamespacedCoveringRuleName, namespacedRuleNameC
|
|
|
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,7 +116,7 @@ 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));
|