@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/hooks/hook-llm.js
CHANGED
|
@@ -2,6 +2,7 @@ import { admitRouteRequest, BrainError, joinRequestUrl, resolveRouteCredential,
|
|
|
2
2
|
import { matchCatalogModel, refusedCatalogEntry, servedModelTableLeg } from "../model-select.js";
|
|
3
3
|
import { echoModelRef, modelUnavailableMessage } from "../model-entry-refusal.js";
|
|
4
4
|
import { resolveOpenaiRouteEndpoint } from "../model-route-endpoint.js";
|
|
5
|
+
import { anthropicLaneCredentialOf } from "../model-route-gap.js";
|
|
5
6
|
import { anthropicRouteRoot, brainLaneFor, routeTableOf } from "../model-provider.js";
|
|
6
7
|
import { egressRedirectRefusal } from "../egress-redirect.js";
|
|
7
8
|
import { buildDisplaySafeRefusal, redactSecrets } from "../trace/redact.js";
|
|
@@ -33,6 +34,16 @@ function gateRefusal(pick, e, declaredRoot) {
|
|
|
33
34
|
error: `hook model "${pick.catalogRef}" cannot be routed (${code}) — ` + buildDisplaySafeRefusal(text, [pick.baseUrl, declaredRoot ?? ""]),
|
|
34
35
|
};
|
|
35
36
|
}
|
|
37
|
+
function routeCredentialHeader(credential) {
|
|
38
|
+
if (credential === undefined)
|
|
39
|
+
return {};
|
|
40
|
+
switch (credential.kind) {
|
|
41
|
+
case "x-api-key":
|
|
42
|
+
return { "x-api-key": credential.value };
|
|
43
|
+
case "bearer":
|
|
44
|
+
return { authorization: `Bearer ${credential.value}` };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
36
47
|
export function createHookLlm(deps) {
|
|
37
48
|
const { config, metrics } = deps;
|
|
38
49
|
const anthropicRouteBaseUrl = () => anthropicRouteRoot(config.anthropic ?? {});
|
|
@@ -122,9 +133,10 @@ export function createHookLlm(deps) {
|
|
|
122
133
|
let admitted;
|
|
123
134
|
let declaredRoot;
|
|
124
135
|
if (pick.api === "anthropic-messages") {
|
|
136
|
+
const routeCredential = anthropicLaneCredentialOf(config.anthropic ?? {});
|
|
125
137
|
const routeBase = anthropicRouteBaseUrl();
|
|
126
138
|
declaredRoot = routeBase;
|
|
127
|
-
const routed = judgeRoute(pick, perModelKey,
|
|
139
|
+
const routed = judgeRoute(pick, perModelKey, routeCredential?.value, routeBase);
|
|
128
140
|
if (!routed.ok)
|
|
129
141
|
return routed;
|
|
130
142
|
admitted = routed.admission;
|
|
@@ -132,13 +144,7 @@ export function createHookLlm(deps) {
|
|
|
132
144
|
headers = {
|
|
133
145
|
"content-type": "application/json",
|
|
134
146
|
"anthropic-version": config.anthropic?.version ?? "2023-06-01",
|
|
135
|
-
...(routed.credential.source === "per-model"
|
|
136
|
-
? { "x-api-key": routed.credential.apiKey ?? "" }
|
|
137
|
-
: config.anthropic?.authToken
|
|
138
|
-
? { authorization: `Bearer ${config.anthropic.authToken}` }
|
|
139
|
-
: config.anthropic?.apiKey
|
|
140
|
-
? { "x-api-key": config.anthropic.apiKey }
|
|
141
|
-
: {}),
|
|
147
|
+
...(routed.credential.source === "per-model" ? { "x-api-key": routed.credential.apiKey ?? "" } : routeCredentialHeader(routeCredential)),
|
|
142
148
|
};
|
|
143
149
|
const want = maxOutputTokens ?? 1024;
|
|
144
150
|
const maxTokens = Math.min(config.models[pick.catalogRef]?.maxTokens ?? want, want);
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { type HookEntry, type HookEntryType, type HookEventName, type HooksDroppedPiece, type HooksDroppedPieceCode, type HooksRejection, type HooksRejectionCode } from "@sema-agent/settings-schema/hooks";
|
|
2
|
-
import { type ConfigPath } from "@sema-agent/settings-schema";
|
|
2
|
+
import { type ConfigPath, type UrlCredential } from "@sema-agent/settings-schema";
|
|
3
3
|
import { ENGINE_OWNED_HOOK_EVENTS } from "@sema-agent/settings-schema/hooks";
|
|
4
4
|
import type { EngineDollar, ModRegistration } from "@sema-agent/core";
|
|
5
5
|
import type { Logger } from "../observability/logger.js";
|
|
6
6
|
import type { HookManagedUnrun, HookNoticeObservation } from "../fleet/fleet-bus.js";
|
|
7
7
|
import { LIMIT_REASONS, type LimitMeasure } from "../limit-refusal.js";
|
|
8
|
+
import { type UrlCredentialRefusal } from "../url-credential-refusal.js";
|
|
8
9
|
import { type HookGroupSource } from "./hook-source.js";
|
|
9
10
|
import { type RunnableCommandHookEntry } from "./command-spawn.js";
|
|
10
11
|
/** 服务侧防线上限(契约本身不设量纲;不设界=单请求可塞任意大配置/任意长命令)。超界=校验错(fail-loud)。 */
|
|
@@ -134,12 +135,12 @@ export type ParseHooksConfigResult = {
|
|
|
134
135
|
readonly pieces?: readonly HooksRefusalPiece[];
|
|
135
136
|
};
|
|
136
137
|
/**
|
|
137
|
-
* 🔴 **
|
|
138
|
+
* 🔴 **[ref] → [ref](clay [ref] ③;八病审计 SG H6-d;test 7.112.0 验收 OBS ①)—— 工具事件的 matcher 选中了工具**别名**、却选不中它的正名 ⇒ fresh 提交面响亮拒。**
|
|
138
139
|
*
|
|
139
140
|
* 病:三个工具事件(PreToolUse / PostToolUse / PostToolUseFailure)的 matcher 都按调用的 **wire 名**匹配(本文件顶注
|
|
140
141
|
* 「tool_name 是哪一个名」;core `NAME_READINGS` 三行均为 `wire`)。引擎自带工具 `ListAgents` 的别名 `ListPeers` 写进 matcher
|
|
141
142
|
* ⇒ **永不命中、一句话都没有**(post 两事件自 7.107.0 / core 7.36.0 起如此,PreToolUse 一直如此)。静默不命中 = 写的人以为在生效的 hook
|
|
142
|
-
* 其实没跑,硬破坏三句要求的「响亮」没有着落。7.112.0(
|
|
143
|
+
* 其实没跑,硬破坏三句要求的「响亮」没有着落。7.112.0([ref])只拒**字面**别名;同一个错误写成 `^ListPeers$` / `ListPeers.*` / `(ListPeers)` 照样 200([ref])。
|
|
143
144
|
*
|
|
144
145
|
* 规则(一条;字面形是它的特例):{@link hooksMatcherIssue} 对 core 静态目录里**每一条退役别名**问「这只 matcher 选不选它 / 选不选它的正名」:
|
|
145
146
|
* matcher **命中别名 ∧ 不命中它的正名** ⇒ `400 request.field_invalid`(`admission.ts` fresh 门)。「选不选」**只有一只读法**:契约包的 `hookMatcherSelects`
|
|
@@ -148,7 +149,7 @@ export type ParseHooksConfigResult = {
|
|
|
148
149
|
* ② **形只问契约包的 `hookMatcherForm`**(与 `hookMatcherSelects` 同一只解析步,本仓不留形判),闭集三词、两档一张表:
|
|
149
150
|
* · `literal`(缺席 / 空 / `*` / 名字表形;契约不编、不跑调用方的正则)⇒ 两档都**直接问契约函数**、**不占求值预算**;
|
|
150
151
|
* · `regex` ⇒ **`"regex"` 档**(hooks 会被采纳的车道,`taskHooksHonored`)把**同一只契约函数**经 `node:vm` 的 `timeout` 带**每次求值各一份固定预算**调用({@link matcherSelectsWithin};
|
|
151
|
-
* 每次求值的额度**不共享**、不随同一受理里别的 matcher 缩水、这一份不读钟 ——
|
|
152
|
+
* 每次求值的额度**不共享**、不随同一受理里别的 matcher 缩水、这一份不读钟 —— [ref];另有一只受理总额度,见下「预算与结局」);**超时 ⇒ 这只 matcher 是灾难回溯 ⇒ `400 request.field_invalid` 拒**(见下「预算与结局」);
|
|
152
153
|
* **`"literal"` 档**(多租户车道:hooks 整只被 resolveSpec 忽略)= **不适用**:该车道没有被守的对象(hooks 不装配),不判、不算未判、不登记 —— **零调用方正则执行**
|
|
153
154
|
* (7.112.0 的字面判保留:裸 `ListPeers` / `Read|ListPeers` 照旧 400);
|
|
154
155
|
* · `invalid`(编不过)⇒ `"regex"` 档 = **`400 request.field_invalid` 拒**(判决 `invalid_regex`,见下「预算与结局」;不进求值 —— 形判已答「读不了」);`"literal"` 档 = 不适用(同上)。
|
|
@@ -156,7 +157,7 @@ export type ParseHooksConfigResult = {
|
|
|
156
157
|
* · **为什么两档**(codex r1 [high] + 主会话裁):受理面是**所有**车道,而运行期只有单用户车道跑 hooks。在受理线程上跑调用方的正则 = 给多租户加一个事件循环 DoS 面
|
|
157
158
|
* (实测:`(.*)*` ×10 + `X` 对 9 字符名字首次执行 1.7 s,18 字符嵌套形 15 s,24 字符 157 s;8 MiB 交替串编译 + 求值 9 s)—— 预算只界住一次请求、界不住「每个请求再拿一份」。
|
|
158
159
|
* 但也不能因此在多租户车道「不判决」(那会放宽已发行为:裸 `ListPeers` 的 400)。所以两车道同一条规则、两档深度。谓词 `taskHooksHonored` 是唯一属主(与 resolveSpec / capabilities 同调)。
|
|
159
|
-
* · **为什么不进 {@link parseHooksConfig}**(codex r1 [high],
|
|
160
|
+
* · **为什么不进 {@link parseHooksConfig}**(codex r1 [high],[ref]):`parseHooksConfig` 同时是 resume 重放(`parseTaskSettings` 宽容层)的校验器,
|
|
160
161
|
* 它判不过 ⇒ **整只 hooks 不采纳**。存量 body 里同一份 hooks 常常还有会真拦的 PreToolUse 钩子 —— 一个永不命中的别名 matcher 把它们一并带走,
|
|
161
162
|
* 升级前被拦的 Bash 升级后放行(安全轴上的回退)。所以这条规则住在 fresh 专用的判据里,与 `taskSettingsKeyIssue` 同姿势
|
|
162
163
|
* (「fresh 400 / resume 宽容」双层:会砖存量的规则只咬 fresh)。resume 照旧整只采纳,别名那一组继续永不命中(与 7.111.0 逐字同),其余照跑。
|
|
@@ -167,57 +168,57 @@ export type ParseHooksConfigResult = {
|
|
|
167
168
|
* · **正名同在则不拒**:`正名|别名` / `List.*` 会命中正名,不是「静默不命中」,且正是 7.107.0 CHANGELOG 给的「滚动期两名都写」补偿形。
|
|
168
169
|
* 只拒「别名那一路永远打不中、而它的正名不在选中集里」—— 含 `Read|ListPeers`(7.112.0 已拒;主会话裁:规则形采「按条目逐条问」,不放宽;卡面整 matcher「匹配不到任何现役名」形会把它放回 200)。
|
|
169
170
|
* 多拒(相对卡面形)三例与出路:`Read|ListPeers` / `ListPeers|mcp__.*`(别名支永不命中,出路:改成正名)/ 排除式 `^(?!ListAgents).*`(出路:`^(?!ListAgents|ListPeers).*` 两名都不命中 ⇒ 放)。
|
|
170
|
-
* · **空白与大小写(
|
|
171
|
+
* · **空白与大小写([ref] / sema-test [ref] 起,运行期与 CC 同形)**:名字表读法(契约函数;`|` 与 `,` 分隔)容忍两端与分隔符两侧空白 ⇒ `" ListPeers"` / `"ListPeers "` / `"Read | ListPeers"` 会命中别名 ⇒ 落进本规则 400;
|
|
171
172
|
* **区分大小写、不剥词内空白** ⇒ `"listpeers"` / `"List Peers"` 对别名与正名都选不中,照旧受理(CC 同形)。
|
|
172
173
|
* · **不在本规则内**:两边都选不中的 matcher(大小写错 / 词内空白 / 纯错字;目录之外的 MCP / 嵌入方工具名同样「选不中目录里任何名」,受理面无从区分错字与它们)=
|
|
173
174
|
* **「选不到目录里任何名」另一类,候设计(台账另立号,主会话裁)**。
|
|
174
175
|
*
|
|
175
|
-
* 🔴 **预算与结局(
|
|
176
|
+
* 🔴 **预算与结局([ref] / [ref];良性设置的受理结局只取决于配置,不取决于机器忙闲)**:regex 档每一次求值(一只正则形 matcher 对一个名字的一次问)各拿**一份固定的墙钟预算**
|
|
176
177
|
* {@link ADMISSION_MATCHER_BUDGET}`.budgetMs`(vm `timeout`,从这次求值开始计)—— **不共享**(此前一次受理共用 100 ms,忙机上会被吃光 ⇒
|
|
177
178
|
* 同一份设置忙机偶尔被收下、闲机恒 400),额度不随同一受理里 matcher 的个数缩水,这一份**不读钟**(没有「截止线」可被调度停顿越过)。预算只防**灾难回溯**:
|
|
178
179
|
* 良性求值 ~0.1 ms,灾难形(指数级)吃满预算也跑不完 —— 两者相差数个数量级,取值给足余量(1 000 ms),让忙机上的调度停顿也跨不过这条线。
|
|
179
|
-
* **另有一只受理总额度**(
|
|
180
|
+
* **另有一只受理总额度**([ref];同一张表的 `.totalMs`,5 000 ms):每次求值的额度界得住「一只 matcher 不会无限算」,界不住「刚好低于它的病态 matcher × 别名数 × 2 × 组数」(3 事件 × 16 组 × 1 别名 × 2 = 96 次,
|
|
180
181
|
* 每次 0.99 s 就是 96 s 的事件循环占用)。一次受理里所有**已完成**的正则形求值的耗时之和(一只单调钟逐次累加;字面形与非工具事件不进 vm、不计)一旦**超过**总额度 ⇒ 同码 `400`,
|
|
181
182
|
* `detail.reason = budget_exceeded`({@link BudgetExceededMatcherIssue},点名越线的那一组与总额度)。单次超时先到、先判 `over_budget`(更具体)。一次受理的最坏占用 ≤ 总额度 + 一次求值的额度。
|
|
182
183
|
* 总额度这一只读钟,但良性设置离它近三个数量级(一份最大的良性配置 —— 3 工具事件 × 16 组 —— 总耗时在毫秒级),所以良性设置的结局仍不随机器忙闲翻转;只有求值总耗时逼近总额度的病态设置才可能落在边界两侧。
|
|
183
184
|
* **超时 ⇒ 确定拒绝**:`400 request.field_invalid`({@link OverBudgetMatcherIssue}),句子点名**哪一只 matcher**(事件 + 组下标,不回显原字节)与**预算**;**按配置顺序遇到的第一只超时 / 命中别名的 matcher 定结局**。
|
|
184
|
-
* 为什么是拒绝而不是放行:运行期 {@link hookMatcherMatches} 在**每次工具调用**里问同一只带预算的口(
|
|
185
|
+
* 为什么是拒绝而不是放行:运行期 {@link hookMatcherMatches} 在**每次工具调用**里问同一只带预算的口([ref] 起;此前是裸调、无预算)—— 一只在受理面连目录里几个短名字都求不完的 matcher 放进去,
|
|
185
186
|
* 运行期每次调用都要白烧一整份预算(超预算的组按选中处理并登记,守卫不丢,但每次调用卡一份预算);放行 = 把一个确定的坏配置推迟成运行期每次调用的卡顿。这条拒不是「越界即拒」的新检测面:被拒的恰是**无法被求值**的 matcher,与 `hook_matcher_invalid`(编不过 ⇒ 该组不跑)同属「这只 matcher 不可用」,
|
|
186
187
|
* 只是编不过的运行期自己安全地不跑它,跑不完的不行。
|
|
187
188
|
* 总用时的上界:首个超时 / 总额度越线即拒、不再往下求值;未超时的求值各自 < 预算,其和 ≤ 总额度 + 一次求值的额度。regex 档只在单用户车道(`taskHooksHonored`,hooks 会装配的那条;调用方就是进程属主,本来就能配任意 `command` 钩子)运行,
|
|
188
189
|
* 多租户车道走 literal 档、零调用方正则执行 —— 受理面的 DoS 面不因此重开。
|
|
189
190
|
*
|
|
190
|
-
* 🔴 **编不过的正则 = 确定的拒绝**(
|
|
191
|
+
* 🔴 **编不过的正则 = 确定的拒绝**([ref] 收尾;与超预算同类 —— 确定性的坏配置,结局只取决于配置):`"regex"` 档遇契约 `hookMatcherForm` 答 `invalid`(或求值时契约函数答 `"invalid"`)⇒
|
|
191
192
|
* `400 request.field_invalid`({@link InvalidRegexMatcherIssue}),句子点名**哪一只 matcher**(事件 + 组下标 + 原文〔超 {@link MATCHER_ECHO_CHARS} 字符截断〕)与引擎的编译错误句;机读位 `detail` 只有闭集三键 + 坐标 `path`(那一组的 `matcher`)。
|
|
192
193
|
* 受理面与运行期问**同一只判**:契约把"编不过"答成 `invalid`,运行期 {@link hookMatcherMatches} 因此不跑那一组(并记 `hook_matcher_invalid`),受理面因此拒 —— 本仓不加第二个判官
|
|
193
194
|
* (编译错误句只是诊断文字,见 {@link matcherCompileSentence};拒不拒由契约函数一个人说了算)。为什么是拒绝而不是放行:放行 = 用户以为在生效的钩子(含会真拦的 PreToolUse deny 钩子)
|
|
194
195
|
* 在每次工具调用里都**悄悄不跑**,硬破坏三句要求的「响亮」没有着落;`"literal"` 档(多租户车道,hooks 不装配)= 不适用,与正则形同一行表。resume 重放不判(照旧采纳、该组不跑)。
|
|
195
|
-
* 🔴 **形判对所有事件同一判**(
|
|
196
|
+
* 🔴 **形判对所有事件同一判**([ref];此前只守三个工具事件,写在 `StopFailure` 的 `error` 词 / `PreCompact`·`PostCompact` 的 `trigger` 词上的坏 matcher 受理、运行期该组不跑并记 `hook_matcher_invalid`;壳跑的事件〔如 `SessionStart`〕由壳按同一只契约函数处置):
|
|
196
197
|
* 「这一串是不是一只读得了的 matcher」是**串的形**问题,不是事件的问题 —— `hookMatcherForm` 答 `invalid` ⇒ `400`,**不论写在 33 个契约事件里的哪一个**(含 matcher 被忽略的 `UserPromptSubmit` / `Stop` / `PostToolBatch`:规则里没有「事件类」这个维度,
|
|
197
198
|
* 也就没有一张按事件类分档的表)。死别名问(「选中别名而选不中正名」)只对 matcher 匹配**工具 wire 名**的事件(上面的三个工具事件)才问 —— 别的事件上 matcher 匹配的不是工具名,没有「别名」可言;这一问不占别的事件的求值预算。
|
|
198
199
|
*
|
|
199
200
|
* 🔴 **「未判」臂过 `recordFailOpen`**(F 类 tag `MATCHER_UNJUDGED_TAG`;主会话裁,CLAUDE.md「合法 F 类回退走登记 tag」):一只 matcher 没能被判 ⇒ 照旧受理 + 登记一笔,
|
|
200
|
-
* detail = `event=… reason=… matcherChars=…`(**不带 matcher 原字节**,
|
|
201
|
+
* detail = `event=… reason=… matcherChars=…`(**不带 matcher 原字节**,[ref] 姿势)。现在只剩一种 reason:
|
|
201
202
|
* `oversize` —— 两档:matcher 超 {@link MAX_MATCHER_EVAL_CHARS} 字符不读(多租户车道上 hooks 不装配,这一笔只为让超长输入显形)。
|
|
202
|
-
* (`over_budget` 臂自
|
|
203
|
+
* (`over_budget` 臂自 [ref] 起退役:它是「预算用尽 ⇒ 照旧受理」的随负载翻转的结局,现在是上面的确定拒绝;`invalid_regex` 臂自 [ref] 收尾起退役,同理。)
|
|
203
204
|
* 放行最坏后果 = 那一只 matcher 没被这条判据守住、照旧永不命中,**不是安全闸**(受理面有效性判)。
|
|
204
205
|
* 拒放集合相对 7.113.0 的一处放宽(披露在 CHANGELOG / MIGRATION):超过上限的字面别名 matcher 7.113.0 拒(当时字面判不设上限),自 7.114.0 两档都判未判、受理。
|
|
205
206
|
*
|
|
206
|
-
* 错误句:死别名与超预算两形只回显**目录里的**别名与正名 / 位置(闭集字符串与数字),不回显调用方的原字节(
|
|
207
|
+
* 错误句:死别名与超预算两形只回显**目录里的**别名与正名 / 位置(闭集字符串与数字),不回显调用方的原字节([ref] 姿势);编不过一形**点名那只 matcher 的原文**(截断到 {@link MATCHER_ECHO_CHARS} 字符)与引擎的编译错误句 ——
|
|
207
208
|
* 调用方要改的就是这一串,且它本来就是调用方自己送来的;机读位 `detail` 仍不带这两段。
|
|
208
209
|
*
|
|
209
|
-
* 🔴 **判决是数据,句子与体的机读位同出一只铸点**(
|
|
210
|
+
* 🔴 **判决是数据,句子与体的机读位同出一只铸点**([ref];client-core 请托,additive):{@link hooksMatcherIssue} 回 {@link HooksMatcherIssue}(闭集四形:{@link DeadToolMatcherIssue} 的 event / alias / canonical,
|
|
210
211
|
* {@link OverBudgetMatcherIssue} 的 event / groupIndex / budgetMs,{@link BudgetExceededMatcherIssue} 的 event / groupIndex / totalMs,{@link InvalidRegexMatcherIssue} 的 event / groupIndex〔+ 句子用的 matcher / compileError〕,以 `reason` 区分)而不是句子;{@link buildHooksRefusal} 是**唯一**把它铸成拒句 + `field` + `detail` 的函数(配置读者的拒同经它),
|
|
211
212
|
* 受理门只取它的返回、**不解析句子**。体上多出的两键让三端不必解析英文就能把这只拒与普通提交失败分流、提示用户改 matcher;死别名那一句逐字同 7.114.0、零新码。
|
|
212
213
|
*/
|
|
213
214
|
/** 超此长度的 matcher 不在受理面读(两档同一个上限;未判,reason = oversize)。与 {@link MAX_HOOK_COMMAND_CHARS} 同量纲的服务侧防线:真实 matcher(精确名 / 交替 / `mcp__.*`)远在其内;目录全部工具名交替 ~0.5 KiB。 */
|
|
214
215
|
export declare const MAX_MATCHER_EVAL_CHARS = 8192;
|
|
215
216
|
/**
|
|
216
|
-
* 正则形 matcher 的**求值预算表**(毫秒)—— 两个数同出这一张表,判据与测试注入都不另持第二份(名字里的 `ADMISSION` 是历史:`budgetMs` 自
|
|
217
|
-
* · `budgetMs` = **每一次**正则形求值各一份的固定墙钟额度(
|
|
218
|
-
* **运行期读同一个数**(
|
|
219
|
-
* 良性求值 ~0.1 ms;灾难回溯(指数级)吃满它也跑不完 ⇒ 这只 matcher 被 400 拒(`over_budget`)。取值是「良性求值之上数个数量级」的余量 —— 小了,忙机上的调度停顿会把良性 matcher 读成灾难(受理结局随负载翻转,正是
|
|
220
|
-
* · `totalMs` = **一次受理**里所有已完成的正则形求值的**耗时之和**的总额度(
|
|
217
|
+
* 正则形 matcher 的**求值预算表**(毫秒)—— 两个数同出这一张表,判据与测试注入都不另持第二份(名字里的 `ADMISSION` 是历史:`budgetMs` 自 [ref] 起**受理面与运行期共用**,`totalMs` 只属受理面):
|
|
218
|
+
* · `budgetMs` = **每一次**正则形求值各一份的固定墙钟额度([ref];vm `timeout`)。**不共享、额度不随受理里别的 matcher 缩水、这一份不读钟**;字面形不占它。
|
|
219
|
+
* **运行期读同一个数**([ref];{@link hookMatcherMatches} 每次现读本对象):运行期每次工具调用对正则形 matcher 的每次求值也各拿这一份,超了 ⇒ 该组按选中处理并登记,不另设运行期额度。
|
|
220
|
+
* 良性求值 ~0.1 ms;灾难回溯(指数级)吃满它也跑不完 ⇒ 这只 matcher 被 400 拒(`over_budget`)。取值是「良性求值之上数个数量级」的余量 —— 小了,忙机上的调度停顿会把良性 matcher 读成灾难(受理结局随负载翻转,正是 [ref] 要根除的形)。
|
|
221
|
+
* · `totalMs` = **一次受理**里所有已完成的正则形求值的**耗时之和**的总额度([ref]):之和一旦超过它 ⇒ `400`,`detail.reason = budget_exceeded`。每次求值的额度只界住「一只 matcher 不会无限算」,
|
|
221
222
|
* 界不住「刚好低于它的病态 matcher × 别名数 × 2 × 组数」—— 今天 3 事件 × 16 组 × 1 别名 × 2 = 96 次,每次 0.99 s 可占住事件循环 96 s(单用户车道上持 token 的调用方)。
|
|
222
223
|
* 总额度读一只单调钟、**只累加已完成求值的耗时**(`performance.now`),求值本身不被它缩短(每次求值的额度仍是固定的 `budgetMs`),所以一次受理最坏占用 ≤ `totalMs` + `budgetMs`。
|
|
223
224
|
* 取值同一条余量律:一份最大的良性配置(3 工具事件 × 16 组)的总耗时实测约 9 ms,离 `totalMs` 近三个数量级 —— 良性设置的结局不随机器忙闲翻转;只有求值总耗时逼近 `totalMs` 的病态设置才可能。
|
|
@@ -226,7 +227,7 @@ export declare const ADMISSION_MATCHER_BUDGET: {
|
|
|
226
227
|
readonly budgetMs: 1000;
|
|
227
228
|
readonly totalMs: 5000;
|
|
228
229
|
};
|
|
229
|
-
/** 拒句里回显的 matcher 原文 / 引擎编译错误句、运行期 `hook_matcher_invalid` 日志行的 `matcher` 字段,各自的字符上限(都过回显的一只口径 `echoCallerText`,截断记号 `…`;
|
|
230
|
+
/** 拒句里回显的 matcher 原文 / 引擎编译错误句、运行期 `hook_matcher_invalid` 日志行的 `matcher` 字段,各自的字符上限(都过回显的一只口径 `echoCallerText`,截断记号 `…`;[ref] 收尾 / [ref])。真实 matcher 远在其内;上限只防一只 8 KiB 的坏 matcher 把拒句撑成一屏。 */
|
|
230
231
|
export declare const MATCHER_ECHO_CHARS = 200;
|
|
231
232
|
/** 运行期 `hook_entries_skipped` 日志行的 `if` 字段(配置写的权限规则表达式)的字符上限;与 matcher 同口径(`echoCallerText`),截断记号 `…`。 */
|
|
232
233
|
export declare const IF_ECHO_CHARS = 200;
|
|
@@ -255,14 +256,14 @@ export interface DeadToolMatcherIssue {
|
|
|
255
256
|
readonly alias: string;
|
|
256
257
|
readonly canonical: string;
|
|
257
258
|
}
|
|
258
|
-
/** 一条受理面判决(纯数据)· 求值超预算(
|
|
259
|
+
/** 一条受理面判决(纯数据)· 求值超预算([ref]):`event` 事件下第 `groupIndex` 组(从 0 起)的 matcher 单次求值没在 `budgetMs` 内结束(灾难回溯)。三键都是闭集 / 数字,不含调用方原字节。 */
|
|
259
260
|
export interface OverBudgetMatcherIssue {
|
|
260
261
|
readonly reason: "over_budget";
|
|
261
262
|
readonly event: HookEventName;
|
|
262
263
|
readonly groupIndex: number;
|
|
263
264
|
readonly budgetMs: number;
|
|
264
265
|
}
|
|
265
|
-
/** 一条受理面判决(纯数据)· 受理总额度用尽(
|
|
266
|
+
/** 一条受理面判决(纯数据)· 受理总额度用尽([ref]):`event` 事件下第 `groupIndex` 组(从 0 起)的 matcher 求完之后,本次受理里所有已完成正则形求值的耗时之和超过了 `totalMs`。三键都是闭集 / 数字,不含调用方原字节。 */
|
|
266
267
|
export interface BudgetExceededMatcherIssue {
|
|
267
268
|
readonly reason: "budget_exceeded";
|
|
268
269
|
readonly event: HookEventName;
|
|
@@ -270,7 +271,7 @@ export interface BudgetExceededMatcherIssue {
|
|
|
270
271
|
readonly totalMs: number;
|
|
271
272
|
}
|
|
272
273
|
/**
|
|
273
|
-
* 一条受理面判决(纯数据)· 正则编不过(
|
|
274
|
+
* 一条受理面判决(纯数据)· 正则编不过([ref] 收尾):`event` 事件下第 `groupIndex` 组(从 0 起)的 matcher 在契约包的读法下答 `invalid`。
|
|
274
275
|
* `matcher` = 那只 matcher 的原文、`compileError` = 引擎的编译错误句(各自截到 {@link MATCHER_ECHO_CHARS} 字符):**只供铸拒句用**,机读位 `detail` 不带它们。
|
|
275
276
|
*/
|
|
276
277
|
export interface InvalidRegexMatcherIssue {
|
|
@@ -393,18 +394,41 @@ export interface HooksRefusal {
|
|
|
393
394
|
}
|
|
394
395
|
/**
|
|
395
396
|
* 判决 → 拒句 + 机读位 —— `settings.hooks` 这一面**拒句与机读位的唯一铸点**(配置读者的拒与 fresh 提交面的 matcher 拒同经这里;受理门 `admission.ts` 用返回值填 400 体,
|
|
396
|
-
* 不从句子里反解字段)。句子:死别名逐字 = 7.114.0 的那一句(`test/hooks-alias-matcher-s995.test.ts` R7 冻结);超预算点名**哪一只**(事件 + 组下标 + `matcher`)与**预算**,不回显 matcher 原字节(
|
|
397
|
+
* 不从句子里反解字段)。句子:死别名逐字 = 7.114.0 的那一句(`test/hooks-alias-matcher-s995.test.ts` R7 冻结);超预算点名**哪一只**(事件 + 组下标 + `matcher`)与**预算**,不回显 matcher 原字节([ref] 姿势);
|
|
397
398
|
* 分类器的一块 = 坐标 + 码 + 释义(+ 坏键);服务侧上限的几句逐字 = 7.131.0。`reason` 闭集穷举(多一形 = 这里编译红)。
|
|
398
399
|
*/
|
|
399
400
|
export declare function buildHooksRefusal(issue: HooksIssue): HooksRefusal;
|
|
400
401
|
/**
|
|
401
|
-
* fresh 提交面专用判据(
|
|
402
|
-
* 拒句与 400 体的机读位由 {@link buildHooksRefusal} 从这份数据铸(
|
|
402
|
+
* fresh 提交面专用判据([ref] / [ref] / [ref] / [ref] / [ref]):配置里第一条「该拒」的 matcher 的判决数据({@link HooksMatcherIssue}):「永远打不中」(死别名,只属工具事件)· 「编不过」(任何事件)· 「单次求值超预算」(灾难回溯)· 「受理总额度用尽」;没有 ⇒ undefined。
|
|
403
|
+
* 拒句与 400 体的机读位由 {@link buildHooksRefusal} 从这份数据铸([ref])。**按配置顺序(事件 → 组)遇到的第一条定结局**;良性设置的结局只取决于配置(每次求值的额度固定、不共享;总额度离良性设置近三个数量级,见头注「预算与结局」)。
|
|
403
404
|
* 入参是 {@link parseHooksConfig} 已校验过的配置;`depth` 由调用点按车道定(见头注:`taskHooksHonored(config) ? "regex" : "literal"`)。
|
|
404
405
|
* `budget` **仅供测试注入**({@link MatcherEvalBudget});生产调用点只传前两个实参。
|
|
405
406
|
* **只有 `admission.ts` 的 fresh 提交门调它** —— resume 重放不调(理由见上面的头注)。未判的 matcher 过 `recordFailOpen`(tag `MATCHER_UNJUDGED_TAG`);超预算的不是未判,是拒。
|
|
406
407
|
*/
|
|
407
408
|
export declare function hooksMatcherIssue(config: RunnableHooksConfig, depth: MatcherEvalDepth, budget?: MatcherEvalBudget): HooksMatcherIssue | undefined;
|
|
409
|
+
/** fresh 提交面 http 钩子 `url` 带凭据的判决(数据):是哪一条(事件 + 组下标 + 条目下标,与 matcher 判决同一种坐标)+ 判官的答案。 */
|
|
410
|
+
export interface HooksUrlCredentialIssue {
|
|
411
|
+
readonly event: HookEventName;
|
|
412
|
+
readonly groupIndex: number;
|
|
413
|
+
readonly entryIndex: number;
|
|
414
|
+
readonly credential: UrlCredential;
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* fresh 提交面专用判据([ref]):配置里第一条「url 带凭据」的 http 钩子 —— userinfo,或名字在日志脱敏器凭据名表里的 query / fragment 参数(判官契约包根的 `findUrlCredential` 一只,
|
|
418
|
+
* MCP `transport.url` · A2A 对端 · 搜索后端 `endpoint` · 包源六址同读);没有 ⇒ undefined。这一座有为凭据设的位(条目的 `headers`,停驻任务的续跑上下文里只以封签存在),
|
|
419
|
+
* url 却照原样进停驻上下文、日志与读面 —— 凭据只许走前者(`$NAME` 引用 + `allowedEnvVars` 让配置本身不携带密钥值,见 USAGE 9.5c)。
|
|
420
|
+
* 入参是 {@link parseHooksConfig} 已校验过的配置:**按配置序**(事件 → 组 → 条目)遇到的第一条定结局;只看 `type:"http"` 条目(别的条目型没有 `url`)。
|
|
421
|
+
*
|
|
422
|
+
* **只有 `admission.ts` 的 fresh 提交门调它** —— 重放存量 body 的腿(`parseTaskSettings`)不调:拒会让升级前停驻的任务里整只 hooks 不被采纳(守卫钩子随之消失 = fail-open),
|
|
423
|
+
* 已落盘的字节也不因拒而消失。拒句与机读位由 {@link buildHooksUrlCredentialRefusal} 铸。
|
|
424
|
+
*/
|
|
425
|
+
export declare function hooksUrlCredentialIssue(config: RunnableHooksConfig): HooksUrlCredentialIssue | undefined;
|
|
426
|
+
/**
|
|
427
|
+
* {@link hooksUrlCredentialIssue} 的判决 → 拒句 + 机读位。`field` 是这一条 `url` 在请求体里的全坐标(`settings.hooks.<事件>[g].hooks[h].url`,与封签位、本族别的 `field` 同一种写法),
|
|
428
|
+
* 出路指到同一条的 `headers`。机读位的形与 MCP / A2A / 搜索后端三座同一只铸点(`url-credential-refusal.ts`),所以**不**走上面 {@link buildHooksRefusal} 的 `field:"settings.hooks"` + `detail` 形 ——
|
|
429
|
+
* 那一形按 `detail.reason` 分形、属于配置读者与 matcher 判据;「URL 带凭据」是跨座位的一个事实,消费端按 `reason` 穷举读一次。
|
|
430
|
+
*/
|
|
431
|
+
export declare function buildHooksUrlCredentialRefusal(issue: HooksUrlCredentialIssue): UrlCredentialRefusal;
|
|
408
432
|
/**
|
|
409
433
|
* 坐标的出门段:事件名等键段是用户文本 ⇒ 先过 {@link outgoingPath}(凭据形不原样回显),每个串段再过调用方串的唯一回显口径(`caller-text-echo.ts`:剥控制 / 双向字符、截到 64 字 + …)——
|
|
410
434
|
* 一只 100 KB 的未知键不把拒体撑大、也不在句子里夹看不见的字符。400 体的 `detail.path` 与拒句里的坐标读的都是它。
|
|
@@ -421,7 +445,10 @@ export declare function hooksCoordinate(path: ConfigPath): string;
|
|
|
421
445
|
* · **本仓不执行的条目类型整份拒**:分类器受理契约的全部五型,而本仓只跑 {@link SUPPORTED_HOOK_ENTRY_TYPES}。含其余类型的配置整份拒,不留跳过臂。
|
|
422
446
|
* · **本仓的 wire 键**(分类器不认、会剥掉的三只):组上的 `source`(来源闭集,`hook-source.ts`)、command 条目上的 `plugin` / `args`(执行上下文,`command-spawn.ts`)——
|
|
423
447
|
* 在分类器装上的**同一坐标**上读原值(分类器只在 `loaded` 时放行,装上的件与原值逐位对齐),形错 ⇒ {@link HooksWireKeyIssue}。
|
|
424
|
-
* `plugin` / `args` 只在 command
|
|
448
|
+
* `plugin` / `args` 只在 command 条目上有义。值为 `undefined` 与缺席同读(与分类器读可选字段同一口径)。
|
|
449
|
+
* · **读者不携带的键**(分类器不认的字段、非 command 条目上的 `plugin` / `args`、组上的拼错键):本读者的可跑形里没有它们(读法照分类器)。
|
|
450
|
+
* 「写了却被剥掉」在 FRESH 提交面由键闭集门的第三个实例拒(`task-settings.ts` 的 `hooksKeyIssue`,词表 = 本函数交回的可跑形,400 `request.body_shape`);
|
|
451
|
+
* 续跑重放腿不过那道门,存量体按受理时的读法重放(剥掉,不砖停驻任务)。
|
|
425
452
|
* · **服务侧上限**(广度闸;契约本身不设量纲)。exec 形的命令行(`command` + 各 `args`)计入 `command` 帽;插件上下文一道总字符帽。
|
|
426
453
|
*
|
|
427
454
|
* 拒返回判决(`issue`)与它的句子(`error`)而不 throw —— submit 路径 400 fail-loud(体带 `field: "settings.hooks"` + `detail`)、resume 防御路径 warn-drop(hooks 整只不采纳),由调用方选;
|
|
@@ -433,7 +460,7 @@ export declare function parseHooksConfig(raw: unknown): ParseHooksConfigResult;
|
|
|
433
460
|
* 三形(名字表 / 空 `*` 缺省 / 不锚定的 JS 正则)与「编不过 ⇒ `"invalid"`」都由它答;**对所有带 matcher 的事件同一只读法**(工具事件 / StopFailure 的 `error` 词 /
|
|
434
461
|
* PreCompact·PostCompact 的 `trigger` 词 / `if` 条件的名部),不按事件分档。
|
|
435
462
|
*
|
|
436
|
-
* 🔴 **预算(
|
|
463
|
+
* 🔴 **预算([ref])**:求法与受理面 `"regex"` 档同一格表({@link MATCHER_EVALUATION}):字面形(名字表 / 空 / `*` / 缺省)直接问契约函数,不进 vm、不占额度;
|
|
437
464
|
* 正则形**每一次求值**进 vm、各拿一份固定的 {@link ADMISSION_MATCHER_BUDGET}`.budgetMs`(不共享、不读钟、不新造第二只预算常量)。受理面只对 core 目录里的别名 / 正名这几个短名字求过值,
|
|
438
465
|
* 运行期要对**任意别的工具名**求值 —— 受理过了的 matcher 在某个名字上灾难回溯,不能再同步占住事件循环。
|
|
439
466
|
* 四个答案(闭集,{@link MatcherAnswer}),调用方各用一条穷举 switch 处置({@link matcherGroupSelected} / {@link hookIfMatches}):
|
|
@@ -448,7 +475,7 @@ export declare function hookMatcherMatches(matcher: string | undefined, value: s
|
|
|
448
475
|
* 求值:名部走 permission matcher(交替/正则同 matcher 字段),括号内 arg-模式(`*` 通配)匹配工具输入的
|
|
449
476
|
* 主字符串(Bash=command,文件工具=file_path/path)。CC 行为逐条目:不匹配 → 跳过该条目(记日志);
|
|
450
477
|
* 非工具事件(payload 无 tool_name)→ "cannot be evaluated" 跳过;解析失败 → 跳过。返回:
|
|
451
|
-
* true=跑 / "not_matched" / "unevaluable"(调用方分别记账;跳过永不静默)/ "over_budget"(
|
|
478
|
+
* true=跑 / "not_matched" / "unevaluable"(调用方分别记账;跳过永不静默)/ "over_budget"([ref]:名部求值没在预算内结束 ⇒ 调用方按**选中**处理 + 登记,见 {@link hookMatcherMatches})。
|
|
452
479
|
*
|
|
453
480
|
* 2.1.250 复核([ref],2026-08-30;语料=sema-internal `blueprints/cc-decoded/cli250.js`):求值器与 220
|
|
454
481
|
* 逐字同构——五种工具事件之外「cannot be evaluated for non-tool event」跳过、「Skipping hook due to if
|
|
@@ -517,7 +544,7 @@ export type HookLlmCall = (opts: {
|
|
|
517
544
|
/** 失败判别码(B8:判别一律走码,禁按 error 文案分支——v3.1 批2,统检第二波 high)。error 仍是给人看的
|
|
518
545
|
* 自由文本;code 是给控制流的。缺席=未分类失败(不重试、不特判)。
|
|
519
546
|
*
|
|
520
|
-
* 🔴 **一类真因一个码**(
|
|
547
|
+
* 🔴 **一类真因一个码**([ref];闭集 —— 消费方的 `switch` 无兜底分支,加一个码而不表态 = 编译错误):码是**成因族**的名字,铸点是直连载体
|
|
521
548
|
* (`hook-llm.ts` 的 `callLlm` / `hookModelFor`)的每一个失败臂,消费方(会话标题器的 fail-open 标签表)据此区分「该改哪里」,不读 `error` 文案:
|
|
522
549
|
* · `model_unresolved`:这只模型在本部署上选不出来 —— 目录里没有 / 条目不可用 / 网关腿解析不出端点(改目录或网关配置)
|
|
523
550
|
* · `route_refused`:路由核验拒发 —— key↔URL 不配对,或 foreign 端点无 per-model key(改路由 / 凭据配置;零请求)
|
|
@@ -3,7 +3,7 @@ import { composeHostSubprocessEnv, hostSubprocessEnv } from "../server-secret-en
|
|
|
3
3
|
import vm from "node:vm";
|
|
4
4
|
import { hostShell, resolveHostShell, adoptHostForegroundChild, killTreeSoft, killTreeHard } from "../plugins/host-platform.js";
|
|
5
5
|
import { classifyHooksConfig, DEFAULT_HOOK_TIMEOUT_SECONDS, HOOK_ENTRY_TYPES, HOOK_EVENTS, HOOK_EVENT_OWNER, HOOK_EVENT_MATCHER_FIELD, hookMatcherForm, hookMatcherSelects, interpolateHookEnvVars, } from "@sema-agent/settings-schema/hooks";
|
|
6
|
-
import { formatConfigPath, outgoingPath } from "@sema-agent/settings-schema";
|
|
6
|
+
import { findUrlCredential, formatConfigPath, outgoingPath } from "@sema-agent/settings-schema";
|
|
7
7
|
import { ENGINE_OWNED_HOOK_EVENTS } from "@sema-agent/settings-schema/hooks";
|
|
8
8
|
import { describeToolCatalog } from "@sema-agent/core";
|
|
9
9
|
import { hangClassic } from "./classic-stations.js";
|
|
@@ -11,11 +11,13 @@ import { MAX_HOOK_NOTICE_TEXT_CHARS, boundedNoticeText } from "../fleet/fleet-bu
|
|
|
11
11
|
import { recordFailOpen } from "../observability/fail-open.js";
|
|
12
12
|
import { LIMIT_REASONS } from "../limit-refusal.js";
|
|
13
13
|
import { clipDataText, echoCallerText } from "../caller-text-echo.js";
|
|
14
|
+
import { seatText } from "../trace/exit-seat.js";
|
|
14
15
|
import { redactSecrets, buildDisplaySafeUrl } from "../trace/redact.js";
|
|
15
16
|
import { canonicalJsonStringify } from "@sema-agent/core";
|
|
16
17
|
import { ccPromptSystemFor, wrapCondition, parseCcVerdict, CC_EVALUATOR_MAX_OUTPUT_TOKENS } from "./cc-stop-prompt.js";
|
|
17
18
|
import { ccAgentHookSystemFor } from "./cc-agent-hook-prompt.js";
|
|
18
19
|
import { renderBranchTranscript } from "./branch-transcript.js";
|
|
20
|
+
import { buildRequestUrlCredentialRefusal, urlCredentialHeaderExit } from "../url-credential-refusal.js";
|
|
19
21
|
import { HOOK_PHASES, HOOK_SOURCE_VOCABULARY_SENTENCE, hookPhaseOf, readHookGroupSource } from "./hook-source.js";
|
|
20
22
|
import { commandLineChars, composeHookEnvLayer, hookPluginChars, planCommandSpawn, readHookArgs, readHookPlugin } from "./command-spawn.js";
|
|
21
23
|
export const MAX_HOOK_ENTRIES_PER_EVENT = 32;
|
|
@@ -102,9 +104,7 @@ export const MAX_MATCHER_EVAL_CHARS = MAX_HOOK_COMMAND_CHARS;
|
|
|
102
104
|
export const ADMISSION_MATCHER_BUDGET = { budgetMs: 1_000, totalMs: 5_000 };
|
|
103
105
|
export const MATCHER_ECHO_CHARS = 200;
|
|
104
106
|
export const IF_ECHO_CHARS = 200;
|
|
105
|
-
const
|
|
106
|
-
const LOG_ERROR_ECHO_CHARS = 300;
|
|
107
|
-
const LOG_MESSAGE_ECHO_CHARS = 500;
|
|
107
|
+
const BLANKED_HEADER_ECHO_CHARS = 200;
|
|
108
108
|
const MATCHER_UNJUDGED_TAG = "server.hooks.matcher-unjudged";
|
|
109
109
|
function matcherReadsWireToolName(event) {
|
|
110
110
|
return HOOK_EVENT_OWNER[event] === "engine" && HOOK_EVENT_MATCHER_FIELD[event] === "tool_name";
|
|
@@ -331,6 +331,24 @@ export function hooksMatcherIssue(config, depth, budget = {}) {
|
|
|
331
331
|
}
|
|
332
332
|
return undefined;
|
|
333
333
|
}
|
|
334
|
+
export function hooksUrlCredentialIssue(config) {
|
|
335
|
+
for (const [event, groups] of Object.entries(config)) {
|
|
336
|
+
for (const [groupIndex, group] of (groups ?? []).entries()) {
|
|
337
|
+
for (const [entryIndex, entry] of group.hooks.entries()) {
|
|
338
|
+
if (entry.type !== "http")
|
|
339
|
+
continue;
|
|
340
|
+
const credential = findUrlCredential(entry.url);
|
|
341
|
+
if (credential !== undefined)
|
|
342
|
+
return { event, groupIndex, entryIndex, credential };
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
return undefined;
|
|
347
|
+
}
|
|
348
|
+
export function buildHooksUrlCredentialRefusal(issue) {
|
|
349
|
+
const entry = `settings.hooks.${issue.event}[${issue.groupIndex}].hooks[${issue.entryIndex}]`;
|
|
350
|
+
return buildRequestUrlCredentialRefusal(`${entry}.url`, issue.credential, urlCredentialHeaderExit(`${entry}.headers`));
|
|
351
|
+
}
|
|
334
352
|
const HOOKS_PIECE_MEANING = {
|
|
335
353
|
"hooks-not-object": "`hooks` must be an object keyed by hook event name",
|
|
336
354
|
"unknown-event": "not a hook event name",
|
|
@@ -504,10 +522,10 @@ const MAX_LLM_ENTRIES_PER_EVENT = 4;
|
|
|
504
522
|
const DEFAULT_PROMPT_HOOK_TIMEOUT_SECONDS = 30;
|
|
505
523
|
const DEFAULT_AGENT_HOOK_TIMEOUT_SECONDS = 120;
|
|
506
524
|
function logHookCommandFailed(ctx, event, run) {
|
|
507
|
-
ctx.logger.warn("hook_command_failed", { event, code: run.code, stderr:
|
|
525
|
+
ctx.logger.warn("hook_command_failed", { event, code: run.code, stderr: seatText("operator-log-error", run.stderr) });
|
|
508
526
|
}
|
|
509
527
|
function logHookSystemMessage(ctx, event, message) {
|
|
510
|
-
ctx.logger.info("hook_system_message", { event, message:
|
|
528
|
+
ctx.logger.info("hook_system_message", { event, message: seatText("operator-log-message", message) });
|
|
511
529
|
}
|
|
512
530
|
function hookDisplayName(entry) {
|
|
513
531
|
if (typeof entry.statusMessage === "string" && entry.statusMessage.length > 0)
|
|
@@ -536,7 +554,7 @@ function emitHookNotice(ctx, n) {
|
|
|
536
554
|
}
|
|
537
555
|
catch (e) {
|
|
538
556
|
recordFailOpen("server.hooks.notice-sink-threw", `kind=${n.kind} event=${n.event}`);
|
|
539
|
-
ctx.logger.warn("hook_notice_sink_threw", { kind: n.kind, event: n.event, error:
|
|
557
|
+
ctx.logger.warn("hook_notice_sink_threw", { kind: n.kind, event: n.event, error: seatText("operator-log-text", String(e)) });
|
|
540
558
|
}
|
|
541
559
|
}
|
|
542
560
|
function noteHookFailure(ctx, args) {
|
|
@@ -557,7 +575,7 @@ function noteHookFailure(ctx, args) {
|
|
|
557
575
|
}
|
|
558
576
|
function noteMatcherOverBudget(ctx, args) {
|
|
559
577
|
const budgetMs = ADMISSION_MATCHER_BUDGET.budgetMs;
|
|
560
|
-
const shown = (text) =>
|
|
578
|
+
const shown = (text) => seatText("operator-log-text", text);
|
|
561
579
|
const expression = shown(args.expression);
|
|
562
580
|
const value = shown(args.value);
|
|
563
581
|
ctx.logger.warn("hook_matcher_over_budget", { event: args.event, scope: args.scope, expression, value, budgetMs, selected: true });
|
|
@@ -879,7 +897,7 @@ async function fireAsyncCommandHook(entry, payload, ctx, event, halt) {
|
|
|
879
897
|
}
|
|
880
898
|
child.on("error", (e) => {
|
|
881
899
|
clearTimeout(timer);
|
|
882
|
-
ctx.logger.warn("hook_async_failed", { event, reason: "spawn_failed", error:
|
|
900
|
+
ctx.logger.warn("hook_async_failed", { event, reason: "spawn_failed", error: seatText("operator-log-error", String(e)) });
|
|
883
901
|
noteHookFailure(ctx, { event, entry, reason: "spawn_failed", stderr: String(e), toolName: toolNameOf(payload) });
|
|
884
902
|
});
|
|
885
903
|
child.on("close", (code) => {
|
|
@@ -902,14 +920,14 @@ async function fireAsyncCommandHook(entry, payload, ctx, event, halt) {
|
|
|
902
920
|
ctx.logger.info("hook_async_rewake_delivered", { event, chars: text.length });
|
|
903
921
|
else
|
|
904
922
|
ctx.logger.warn("hook_async_rewake_dropped", { event, reason: "no_live_stream" });
|
|
905
|
-
}, (e) => ctx.logger.warn("hook_async_rewake_dropped", { event, reason: "wake_failed", error:
|
|
923
|
+
}, (e) => ctx.logger.warn("hook_async_rewake_dropped", { event, reason: "wake_failed", error: seatText("operator-log-text", String(e)) }));
|
|
906
924
|
});
|
|
907
925
|
child.stdin?.on("error", () => { });
|
|
908
926
|
child.stdin?.end(`${JSON.stringify(boundedToolInputPayload(payload))}\n`);
|
|
909
927
|
child.unref();
|
|
910
928
|
}
|
|
911
929
|
catch (e) {
|
|
912
|
-
ctx.logger.warn("hook_async_failed", { event, reason: "spawn_failed", error:
|
|
930
|
+
ctx.logger.warn("hook_async_failed", { event, reason: "spawn_failed", error: seatText("operator-log-error", String(e)) });
|
|
913
931
|
noteHookFailure(ctx, { event, entry, reason: "spawn_failed", stderr: String(e), toolName: toolNameOf(payload) });
|
|
914
932
|
}
|
|
915
933
|
}
|
|
@@ -996,7 +1014,7 @@ async function runHttpHook(entry, payload, ctx, event) {
|
|
|
996
1014
|
blankedCount: interpolated.blanked.length,
|
|
997
1015
|
blanked: interpolated.blanked
|
|
998
1016
|
.slice(0, MAX_BLANKED_REFERENCES_LOGGED)
|
|
999
|
-
.map(({ header, name, reason }) => ({ header: echoCallerText(header, { maxChars:
|
|
1017
|
+
.map(({ header, name, reason }) => ({ header: echoCallerText(header, { maxChars: BLANKED_HEADER_ECHO_CHARS }), name: echoCallerText(name, { maxChars: BLANKED_HEADER_ECHO_CHARS }), reason })),
|
|
1000
1018
|
});
|
|
1001
1019
|
}
|
|
1002
1020
|
const headers = { "content-type": "application/json", ...interpolated.headers };
|
|
@@ -1034,7 +1052,7 @@ async function runHttpHook(entry, payload, ctx, event) {
|
|
|
1034
1052
|
if (trimmed === "")
|
|
1035
1053
|
return { code: 0, stdout: "{}", stderr: "", timedOut: false };
|
|
1036
1054
|
if (!parseHookStdout(body)) {
|
|
1037
|
-
ctx.logger.warn("hook_http_non_json_response", { url: buildDisplaySafeUrl(entry.url), preview:
|
|
1055
|
+
ctx.logger.warn("hook_http_non_json_response", { url: buildDisplaySafeUrl(entry.url), preview: seatText("operator-log-text", trimmed) });
|
|
1038
1056
|
noteHookFailure(ctx, {
|
|
1039
1057
|
event: eventOfPayload(payload),
|
|
1040
1058
|
entry,
|
|
@@ -1086,7 +1104,7 @@ function readHookStdout(ran, event, ctx, payload, ledger) {
|
|
|
1086
1104
|
return out;
|
|
1087
1105
|
const t = run.stdout.trim();
|
|
1088
1106
|
if (t.startsWith("{") || t.startsWith("[")) {
|
|
1089
|
-
ctx.logger.warn("hook_bad_json_output", { event, type: entry.type, preview:
|
|
1107
|
+
ctx.logger.warn("hook_bad_json_output", { event, type: entry.type, preview: seatText("operator-log-text", t) });
|
|
1090
1108
|
noteHookFailure(ctx, { event, entry, reason: "bad_json", exitCode: run.code, stderr: run.stderr, toolName: toolNameOf(payload) });
|
|
1091
1109
|
ledger.unrun(ran.source, entry, "bad_json");
|
|
1092
1110
|
}
|
|
@@ -1193,7 +1211,7 @@ async function runMatchingEntries(event, groups, matchValue, payload, ctx, onceF
|
|
|
1193
1211
|
return { kind: "halted" };
|
|
1194
1212
|
}
|
|
1195
1213
|
if (run.spawnError) {
|
|
1196
|
-
ctx.logger.warn(entry.type === "http" ? "hook_http_request_failed" : entry.type === "prompt" || entry.type === "agent" ? "hook_llm_failed" : "hook_command_spawn_failed", { event, type: entry.type, error:
|
|
1214
|
+
ctx.logger.warn(entry.type === "http" ? "hook_http_request_failed" : entry.type === "prompt" || entry.type === "agent" ? "hook_llm_failed" : "hook_command_spawn_failed", { event, type: entry.type, error: seatText("operator-log-error", run.spawnError) });
|
|
1197
1215
|
if (!run.noticed)
|
|
1198
1216
|
noteHookFailure(ctx, { event, entry, reason: "spawn_failed", exitCode: run.code, stderr: run.spawnError, ...(toolName !== undefined ? { toolName } : {}) });
|
|
1199
1217
|
return { kind: "unrun", reason: "spawn_failed" };
|
|
@@ -1411,7 +1429,7 @@ export function createSettingsHooksRegistration(config, ctx, budgetMs) {
|
|
|
1411
1429
|
unknownDecision = true;
|
|
1412
1430
|
ctx.logger.warn("hook_permission_decision_unknown", {
|
|
1413
1431
|
event: "PreToolUse",
|
|
1414
|
-
decision:
|
|
1432
|
+
decision: seatText("operator-log-text", typeof decision === "string" ? decision : typeof decision),
|
|
1415
1433
|
tool: toolName,
|
|
1416
1434
|
effect: "hook ruling not honored (closed word set is allow|deny|ask); this call falls back to the engine gate",
|
|
1417
1435
|
});
|
|
@@ -1675,7 +1693,7 @@ export function createSettingsHooksRegistration(config, ctx, budgetMs) {
|
|
|
1675
1693
|
branch = await sctx.getBranch?.();
|
|
1676
1694
|
}
|
|
1677
1695
|
catch (e) {
|
|
1678
|
-
ctx.logger.warn("hook_stop_branch_failed", { error:
|
|
1696
|
+
ctx.logger.warn("hook_stop_branch_failed", { error: seatText("operator-log-error", e instanceof Error ? e.message : String(e)) });
|
|
1679
1697
|
}
|
|
1680
1698
|
const rendered = renderBranchTranscript(branch);
|
|
1681
1699
|
if (rendered.sufficient) {
|
|
@@ -1718,7 +1736,7 @@ export function createSettingsHooksRegistration(config, ctx, budgetMs) {
|
|
|
1718
1736
|
if (v.ok)
|
|
1719
1737
|
continue;
|
|
1720
1738
|
if (v.impossible) {
|
|
1721
|
-
ctx.logger.warn("hook_stop_condition_impossible", { event: "Stop", reason:
|
|
1739
|
+
ctx.logger.warn("hook_stop_condition_impossible", { event: "Stop", reason: seatText("operator-log-message", v.reason?.trim() ?? "") });
|
|
1722
1740
|
continue;
|
|
1723
1741
|
}
|
|
1724
1742
|
if (block === undefined)
|
|
@@ -1728,7 +1746,7 @@ export function createSettingsHooksRegistration(config, ctx, budgetMs) {
|
|
|
1728
1746
|
const out = llmExtra && entry.type === "prompt" ? parseHookStdout(run.stdout) : readHookStdout(ran, "Stop", ctx, payload, ledger);
|
|
1729
1747
|
if (!out) {
|
|
1730
1748
|
if (llmExtra && entry.type === "prompt") {
|
|
1731
|
-
ctx.logger.warn("hook_llm_unparsed_verdict", { event: "Stop", head:
|
|
1749
|
+
ctx.logger.warn("hook_llm_unparsed_verdict", { event: "Stop", head: seatText("operator-log-text", run.stdout.trim()) });
|
|
1732
1750
|
emitHookNotice(ctx, { kind: "hook_decision_unavailable", event: "Stop", reason: "unparsed" });
|
|
1733
1751
|
ledger.unrun(ran.source, entry, "bad_json", "the prompt hook's answer could not be read as a verdict");
|
|
1734
1752
|
}
|
package/dist/host-decision.d.ts
CHANGED
|
@@ -44,7 +44,7 @@ import { type AskOutcome, type HostDecider, type PermissionResult, type ResumeOu
|
|
|
44
44
|
* 这个事实铸(`human_refused` / `approval_window_expired` / `policy_refused`)。core 若改这一格的词表,
|
|
45
45
|
* 读它的每一处编译期先红。
|
|
46
46
|
*
|
|
47
|
-
* 🔴 **
|
|
47
|
+
* 🔴 **[ref]:为什么这一格住在本叶子模块**(此前是 `tool-approval.ts` 的模块私有型):来源位随决议
|
|
48
48
|
* **落持久行**之后,店(`src/plugins/approval-ask-store-sql.ts` 的 `AskRow.settledBy` /
|
|
49
49
|
* `DecideAskInput.settledBy`)与协调器都要说同一个型 —— 而店不能反向依赖协调器。本模块只依赖
|
|
50
50
|
* `@sema-agent/core`,与同住的 {@link HostDecision}(耐久腿的同位事实)恰好是一对:一条决议的来源
|
|
@@ -54,7 +54,7 @@ export type HostSettledBy = NonNullable<Extract<AskOutcome, {
|
|
|
54
54
|
allow: boolean;
|
|
55
55
|
}>["settledBy"]>;
|
|
56
56
|
/** 直接取 core `ResumeOutcome` policy_ask 臂的 `hostDecision` 型 —— 本仓不复述那几个词(第二铸点)。它的 `decidedBy` 就是 core 的 `HostDecider`
|
|
57
|
-
* (core 7.45.0
|
|
57
|
+
* (core 7.45.0 [ref]:三个型位读同一只闭集)。**谁结束了这次等待**的闭集只有 core 包根那一只(`HOST_DECIDERS` / `HostDecider` / `isHostDecider`)。 */
|
|
58
58
|
export type HostDecision = Extract<ResumeOutcome, {
|
|
59
59
|
gate: "policy_ask";
|
|
60
60
|
}>["hostDecision"];
|
|
@@ -72,14 +72,14 @@ export type HostDecision = Extract<ResumeOutcome, {
|
|
|
72
72
|
* · `plan_review` 不读这只键:引擎的 plan_review 结局形没有决定者位(core 的结局规整会把别的键整只重建掉),收下它就是
|
|
73
73
|
* 一句「已记」的空话。那一门照兄弟门字段那一族拒(`approvals-assistant.ts` 的回决门族派生),候 core 给座。
|
|
74
74
|
*
|
|
75
|
-
* 词表的来源:core 包根的 `HOST_DECIDERS` / `HostDecider` / `isHostDecider`(core 7.45.0
|
|
75
|
+
* 词表的来源:core 包根的 `HOST_DECIDERS` / `HostDecider` / `isHostDecider`(core 7.45.0 [ref];此前包根只有型,本仓手写一只闭集常量 + 两道
|
|
76
76
|
* 编译门双向咬它 —— 那份手抄随本版退役)。wire 闭集 = 那只词表去掉扫的那一个词,运行期值与型都从它派生,没有第二份词表。
|
|
77
77
|
*/
|
|
78
78
|
/** 只有本服务自己的截止扫说得出的那一个词 —— core 词表里唯一不上 wire 的成员(`satisfies`:core 改名 / 退役它 ⇒ 这里编译红)。 */
|
|
79
79
|
declare const SWEEP_ONLY_DECIDER = "sla_timeout";
|
|
80
80
|
/** wire 上的出处词(决定体 `decidedBy` 的值域)= core 闭集去掉扫的那一个。 */
|
|
81
81
|
export type ApprovalDecidedBy = Exclude<HostDecider, typeof SWEEP_ONLY_DECIDER>;
|
|
82
|
-
/** wire 闭集的运行期值:core `HOST_DECIDERS`(
|
|
82
|
+
/** wire 闭集的运行期值:core `HOST_DECIDERS`([ref])去掉扫的那一个,顺序随 core。core 加一个词 ⇒ 它在这里自动在场(决定口的门照收;两只座的映射
|
|
83
83
|
* {@link liveSettledBy} 的穷举 `switch` 编译红,由人裁它在同步座上怎么落)。 */
|
|
84
84
|
export declare const APPROVAL_DECIDED_BY: readonly ApprovalDecidedBy[];
|
|
85
85
|
/** 闭集外的拒句(三条决定口同一句;码按各口既有约定,见 {@link readDecidedBy})。成员表派生自 {@link APPROVAL_DECIDED_BY}(词表一个来源;今天字节与 7.118.0 同)。 */
|
|
@@ -141,7 +141,7 @@ export declare function readDecidedBy(raw: unknown, directDoorActive: boolean):
|
|
|
141
141
|
*/
|
|
142
142
|
export declare function liveSettledBy(decidedBy: ApprovalDecidedBy): Extract<HostSettledBy, "policy"> | undefined;
|
|
143
143
|
/**
|
|
144
|
-
* 引擎自己的那一条例外:**一张要人的卡不归策略答** —— 判官是 core 的 `policyCannotAnswer(question, decidedBy)`(
|
|
144
|
+
* 引擎自己的那一条例外:**一张要人的卡不归策略答** —— 判官是 core 的 `policyCannotAnswer(question, decidedBy)`([ref] 包根导出;引擎的续跑入口、
|
|
145
145
|
* 执行带与同步座读同一条)。本仓**只在自己的副作用先于引擎落地的两条口**上于裁决之前问它(live `/respond`:会话放行 / 常驻规则 / 一条按 approve
|
|
146
146
|
* 回放的 DECIDED 行;耐久 ask 账:一条宣称 approve 的 DECIDED 行),并且只问**放行**那一向(与引擎续跑入口同:拒永远答得了)。耐久 `/decide` 不判:
|
|
147
147
|
* 引擎在 CAS 之前就拒(`checkpoint.invalid_outcome`,卡留 pending),本口的副作用全在引擎受理之后 —— 在那里再问一次就是第二个判官。
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* [ref](core 7.30.1 [ref] 提货)—— **宿主车道本地语言服务器**的唯一构造点。
|
|
3
3
|
*
|
|
4
|
-
* ## 病(DEBTS
|
|
4
|
+
* ## 病(DEBTS [ref] 同轴的第二条,7.99.0 修复验证 opus 腿普查带出)
|
|
5
5
|
* core 的 `NodeLspManager` 默认 spawn(`defaultLspSpawn`)在 7.30.1 之前**不带 env** ⇒ 语言服务器整份继承本进程的
|
|
6
6
|
* `process.env`,脑钥 / 仓库令牌 / 本仓自己的凭据键全在里面,而语言服务器会执行仓里的代码(构建脚本、插件、
|
|
7
7
|
* 工作区配置)。7.30.1 起 core 默认改成 `scrubSecretEnv(process.env)`(按键名**形状**剥),并开了
|
|
@@ -9,10 +9,10 @@
|
|
|
9
9
|
* 本仓唯一组合 `hostSubprocessEnv` 的结果 —— 引擎 `inheritedHostEnv("scrub")` ∪ 点名放回)。
|
|
10
10
|
*
|
|
11
11
|
* ## 规则(一句)
|
|
12
|
-
* 语言服务器子进程的 env = 引擎 `inheritedHostEnv("scrub")`(形状剥 ∪ 本进程起服声明的自有凭据名)∪ 部署方点名放回的键(
|
|
12
|
+
* 语言服务器子进程的 env = 引擎 `inheritedHostEnv("scrub")`(形状剥 ∪ 本进程起服声明的自有凭据名)∪ 部署方点名放回的键([ref],见下节;缺省空名单)——
|
|
13
13
|
* 剥除与模型可驱动的 host shell(`inheritEnv:"scrub"`)
|
|
14
14
|
* 和 project-memory 的 git 子进程**同一只函数**:目录 `type:"secret"` 键按名剥 ∘ core 形状规则按形剥。只交 core 的默认
|
|
15
|
-
* 会漏掉形状规则认不出的本仓凭据键(当时是 `OTEL_EXPORTER_OTLP_HEADERS`,core 7.33.7
|
|
15
|
+
* 会漏掉形状规则认不出的本仓凭据键(当时是 `OTEL_EXPORTER_OTLP_HEADERS`,core 7.33.7 [ref] 起 core 按名剥它;今天只剩名单型旋钮三只),那正是 [ref] 当初的病形。
|
|
16
16
|
* 剥掉了什么经既有观测面留痕(site = `server.lsp.spawn-env`,每 site×key 一次披露 + 逐次计数)—— core 那侧
|
|
17
17
|
* 刻意不报(无收集器,KL),本仓这一格补上。
|
|
18
18
|
*
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
* env 在**构造时**取一次快照(boot / run-local 起腿时),而不是 core 默认那样每次 spawn 现取:`NodeLspManagerOptions.env`
|
|
21
21
|
* 是一份静态记录。本仓的 `process.env` 是 boot 期输入(热配置走 web-admin,不改 `process.env`),两者在本仓部署上同值。
|
|
22
22
|
*
|
|
23
|
-
* ## 点名放行(
|
|
23
|
+
* ## 点名放行([ref],`LSP_ENV_ALLOW`)
|
|
24
24
|
* 剥除会连语言服务器自己的真实依赖一起剥掉(`.npmrc` 的 `${NPM_TOKEN}` 插值、rust-analyzer `cargo metadata` 私有 registry 的
|
|
25
25
|
* `CARGO_REGISTRIES_<名>_TOKEN` —— 形状规则按名判,分不出「给语言服务器用的令牌」与「编排器的令牌」)。出路 = 部署方点名:
|
|
26
26
|
* env = 引擎 `inheritedHostEnv("scrub")` 之上把 `config.lspEnvAllow` 点到的键经 `allowlistedEnv`(与沙箱三腿
|