@sema-agent/server 7.52.1 → 7.54.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/USAGE.md +7 -1
- package/dist/adoption/plan.d.ts +3 -3
- package/dist/adoption/quiesce.d.ts +1 -1
- package/dist/adoption/sql.d.ts +2 -2
- package/dist/adoption/wire.d.ts +1 -1
- package/dist/approval-ask-machine.d.ts +2 -2
- package/dist/approval-card.d.ts +18 -18
- package/dist/approval-deny-reasons.d.ts +1 -1
- package/dist/approval-hmac.d.ts +2 -2
- package/dist/approval-reconciler.d.ts +14 -14
- package/dist/approval.d.ts +2 -2
- package/dist/audit.d.ts +4 -4
- package/dist/auth-keys.d.ts +6 -6
- package/dist/bench/l8/artifact.d.ts +6 -1
- package/dist/bench/l8/artifact.js +2 -27
- package/dist/bench/l8/escape.d.ts +3 -3
- package/dist/bench/l8/index.d.ts +1 -1
- package/dist/bench/s1/arms.d.ts +3 -3
- package/dist/bench/s1/oracle.d.ts +2 -2
- package/dist/bench/s1/reviewer.d.ts +1 -1
- package/dist/bench/s1/row.d.ts +5 -5
- package/dist/bench/s1/runner-ctx.d.ts +3 -3
- package/dist/boot/config-center.d.ts +14 -7
- package/dist/boot/config-center.js +4 -2
- package/dist/boot/coordinators.d.ts +4 -4
- package/dist/boot/crash-last.d.ts +1 -1
- package/dist/boot/device-lane.d.ts +3 -3
- package/dist/boot/engine-lease.d.ts +4 -4
- package/dist/boot/governance-seams.d.ts +5 -5
- package/dist/boot/leader.d.ts +5 -5
- package/dist/boot/leader.js +2 -0
- package/dist/boot/limit-sync.d.ts +1 -1
- package/dist/boot/memory-boundary.d.ts +5 -5
- package/dist/boot/memory-consolidation.d.ts +8 -2
- package/dist/boot/memory-consolidation.js +1 -0
- package/dist/boot/org-memory.d.ts +5 -5
- package/dist/boot/parked-revive-gate.d.ts +6 -6
- package/dist/boot/permission-rules-audit.d.ts +2 -2
- package/dist/boot/reapers.d.ts +8 -8
- package/dist/boot/resolve-spec.d.ts +4 -4
- package/dist/boot/resolve-spec.js +1 -3
- package/dist/boot/retention-lane.d.ts +1 -1
- package/dist/boot/runner-deps.d.ts +53 -27
- package/dist/boot/runner-deps.js +16 -9
- package/dist/boot/runtime-caps.d.ts +4 -4
- package/dist/boot/session-faces.d.ts +1 -1
- package/dist/boot/shutdown.d.ts +10 -10
- package/dist/boot/shutdown.js +1 -1
- package/dist/boot/side-query-lane.d.ts +14 -14
- package/dist/boot/stores.js +5 -0
- package/dist/boot/task-list-lane.d.ts +3 -3
- package/dist/boot/webfetch-summarize-lane.d.ts +9 -9
- package/dist/boot/workflow-orchestration.d.ts +1 -1
- package/dist/bounded-session-map.d.ts +1 -1
- package/dist/brain.d.ts +3 -3
- package/dist/budget.d.ts +3 -3
- package/dist/canonical-json.d.ts +53 -0
- package/dist/canonical-json.js +48 -0
- package/dist/capabilities/center-prompts.d.ts +13 -13
- package/dist/capabilities/collab-workflows.d.ts +1 -1
- package/dist/capabilities/hands-lane.d.ts +4 -4
- package/dist/capabilities/memory-notice.d.ts +4 -4
- package/dist/capabilities/prompt.d.ts +2 -2
- package/dist/capabilities/sandbox-file-send.d.ts +2 -2
- package/dist/capabilities/scenarios.d.ts +16 -16
- package/dist/capabilities/skills.d.ts +1 -1
- package/dist/capabilities/team.d.ts +13 -12
- package/dist/capabilities/tool-defer.d.ts +6 -6
- package/dist/config-catalog.d.ts +139 -0
- package/dist/config-catalog.js +556 -0
- package/dist/config-center/apply-effective.d.ts +42 -30
- package/dist/config-center/apply-effective.js +69 -62
- package/dist/config-center/apply-ledger.d.ts +6 -6
- package/dist/config-center/effective-keys.d.ts +30 -0
- package/dist/config-center/effective-keys.js +49 -0
- package/dist/config-center/facade.d.ts +6 -5
- package/dist/config-center/facade.js +1 -1
- package/dist/config-center/hot-keys-registry.d.ts +2 -2
- package/dist/config-center/http-client.d.ts +5 -5
- package/dist/config-center/mcp-revocation.d.ts +6 -4
- package/dist/config-center/mcp-revocation.js +2 -12
- package/dist/config-center/restart-signal.d.ts +11 -1
- package/dist/config-center/restart-signal.js +4 -10
- package/dist/config-center/skills-mcp.d.ts +2 -2
- package/dist/config-center/stage-limits.d.ts +3 -3
- package/dist/config-center/types.d.ts +42 -59
- package/dist/config-invariants.d.ts +1 -1
- package/dist/config-lkg.js +7 -1
- package/dist/config-provider.d.ts +2 -2
- package/dist/config-provider.js +1 -1
- package/dist/config-types.d.ts +140 -132
- package/dist/config.d.ts +22 -22
- package/dist/config.js +2 -1
- package/dist/degenerate-instrument.d.ts +1 -1
- package/dist/deployment-governance.d.ts +13 -13
- package/dist/device-enrollment.d.ts +5 -3
- package/dist/device-store.d.ts +17 -3
- package/dist/device-store.js +2 -0
- package/dist/device-ws-hub.d.ts +10 -5
- package/dist/device-ws-hub.js +25 -5
- package/dist/device-ws-protocol.d.ts +3 -3
- package/dist/digest-form.d.ts +1 -1
- package/dist/elicitation.d.ts +1 -1
- package/dist/env-facts.d.ts +7 -7
- package/dist/execution-lane-caps.d.ts +5 -5
- package/dist/fleet/fleet-bus.d.ts +53 -53
- package/dist/fleet/fleet-reconciler.d.ts +2 -2
- package/dist/fleet/fleet-terminal-window.d.ts +1 -1
- package/dist/fleet/subagent-tail-bus.d.ts +3 -3
- package/dist/fleet-client.d.ts +3 -3
- package/dist/fleet-lease.d.ts +1 -1
- package/dist/hooks/branch-transcript.d.ts +2 -2
- package/dist/hooks/cc-agent-hook-prompt.d.ts +2 -2
- package/dist/hooks/cc-stop-prompt.d.ts +2 -2
- package/dist/hooks/hook-llm.d.ts +1 -1
- package/dist/hooks/hook-runner.d.ts +5 -5
- package/dist/http/active-run-conflict.d.ts +31 -33
- package/dist/http/active-run-conflict.js +4 -2
- package/dist/http/route-ctx.d.ts +22 -22
- package/dist/http/routes/a2a-serve.d.ts +2 -2
- package/dist/http/routes/admin-config-refresh.d.ts +1 -1
- package/dist/http/routes/admin-drain.d.ts +4 -4
- package/dist/http/routes/admin-memory-optout.d.ts +5 -5
- package/dist/http/routes/adoption.d.ts +1 -1
- package/dist/http/routes/agents-roster.d.ts +1 -1
- package/dist/http/routes/approvals-assistant.d.ts +6 -6
- package/dist/http/routes/approvals-assistant.js +4 -1
- package/dist/http/routes/capabilities.d.ts +1 -1
- package/dist/http/routes/capabilities.js +1 -0
- package/dist/http/routes/config-catalog.d.ts +28 -0
- package/dist/http/routes/config-catalog.js +42 -0
- package/dist/http/routes/diagnostics.d.ts +2 -2
- package/dist/http/routes/fleet.d.ts +1 -1
- package/dist/http/routes/images.d.ts +1 -1
- package/dist/http/routes/leader.d.ts +1 -1
- package/dist/http/routes/memory-bundle.d.ts +4 -4
- package/dist/http/routes/memory-compliance.d.ts +7 -7
- package/dist/http/routes/memory-consolidation.d.ts +1 -1
- package/dist/http/routes/memory-origin.d.ts +9 -9
- package/dist/http/routes/memory-policy.d.ts +3 -3
- package/dist/http/routes/notify-wake.d.ts +1 -1
- package/dist/http/routes/observability.d.ts +1 -1
- package/dist/http/routes/retention-ops.d.ts +1 -1
- package/dist/http/routes/rules.d.ts +3 -3
- package/dist/http/routes/run-memory-capture.d.ts +1 -1
- package/dist/http/routes/runs.d.ts +3 -3
- package/dist/http/routes/runs.js +12 -17
- package/dist/http/routes/session-sync.d.ts +2 -2
- package/dist/http/routes/sessions-list.d.ts +1 -1
- package/dist/http/routes/sessions.d.ts +9 -1
- package/dist/http/routes/sessions.js +60 -0
- package/dist/http/routes/shared-memory.d.ts +1 -1
- package/dist/http/routes/side-query.d.ts +1 -1
- 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 +1 -1
- package/dist/http/run-meta.d.ts +1 -1
- package/dist/http/send.d.ts +6 -6
- package/dist/http/server.d.ts +84 -67
- package/dist/http/server.js +39 -10
- package/dist/http/sse-lifecycle.d.ts +1 -1
- package/dist/http/sse-log.d.ts +6 -6
- package/dist/http/verify-rounds.d.ts +3 -3
- package/dist/http/wire-gate.d.ts +2 -2
- package/dist/http/wire-types.d.ts +57 -38
- package/dist/key-resolver.d.ts +1 -1
- package/dist/leader/diffout.d.ts +2 -2
- package/dist/leader/diffup.d.ts +1 -1
- package/dist/leader/endpoint.d.ts +1 -1
- package/dist/leader/fanout.d.ts +6 -6
- package/dist/leader/grader-env-factory.d.ts +1 -1
- package/dist/leader/leader.d.ts +12 -12
- package/dist/leader/merge.d.ts +3 -3
- package/dist/leader/planner.d.ts +5 -5
- package/dist/leader/repair-oracle.d.ts +1 -1
- package/dist/leader/wire.d.ts +21 -9
- package/dist/leader/wire.js +6 -5
- package/dist/lsp/manager.d.ts +2 -2
- package/dist/lsp/types.d.ts +1 -1
- package/dist/lsp/ws-transport.d.ts +2 -2
- package/dist/main.js +12 -2
- package/dist/mcp-content-origin.d.ts +1 -1
- package/dist/memory-bundle-engine.d.ts +5 -3
- package/dist/memory-bundle-engine.js +2 -2
- package/dist/memory-operator-faces.d.ts +41 -11
- package/dist/memory-operator-faces.js +12 -0
- package/dist/memory-origin-fence.d.ts +1 -1
- package/dist/memory-origin-fence.js +2 -13
- package/dist/memory-posture.d.ts +6 -6
- package/dist/memory-scope.d.ts +7 -7
- package/dist/model-select.d.ts +5 -5
- package/dist/observability/cost-quota.d.ts +6 -6
- package/dist/observability/cost-taxonomy.d.ts +2 -2
- package/dist/observability/fail-open.d.ts +17 -5
- package/dist/observability/fail-open.js +16 -4
- package/dist/observability/metrics.d.ts +1 -1
- package/dist/observability/prompt-manifest.d.ts +8 -8
- package/dist/observability/rate-limit.d.ts +2 -2
- package/dist/observability/secret-env-scrub.d.ts +1 -1
- package/dist/observability/tool-trace.d.ts +1 -1
- package/dist/orchestration/hardened-vm-runner.d.ts +6 -6
- package/dist/orchestration/hardened-vm-worker-runner.d.ts +1 -1
- package/dist/orchestration/subagent-steer.d.ts +3 -3
- package/dist/orchestration/workflow-agent-steer.d.ts +1 -1
- package/dist/orchestration/workflow-completion-inbox.d.ts +6 -6
- package/dist/orchestration/workflow-notify-journal.d.ts +6 -6
- package/dist/parent-watch.d.ts +1 -1
- package/dist/parked-decide.d.ts +11 -11
- package/dist/plan-cache-probe.d.ts +1 -1
- package/dist/plugins/adoption-log-sql.d.ts +4 -4
- package/dist/plugins/approval-ask-store-memory.d.ts +1 -1
- package/dist/plugins/approval-ask-store-memory.js +12 -0
- package/dist/plugins/approval-ask-store-sql.d.ts +39 -17
- package/dist/plugins/approval-ask-store-sql.js +23 -6
- package/dist/plugins/approval-payload-fingerprint.d.ts +23 -0
- package/dist/plugins/approval-payload-fingerprint.js +23 -0
- package/dist/plugins/background-agent-store-sql.d.ts +8 -8
- package/dist/plugins/background-shell-support.d.ts +12 -12
- package/dist/plugins/blob-backend.d.ts +3 -3
- package/dist/plugins/breaker-state-sql.d.ts +3 -3
- package/dist/plugins/caching-session-store.d.ts +6 -6
- package/dist/plugins/checkpoint-store-sql.d.ts +162 -66
- package/dist/plugins/checkpoint-store-sql.js +76 -33
- package/dist/plugins/device-store-sql.d.ts +4 -3
- package/dist/plugins/e2b-orphan-reclaim.d.ts +3 -3
- package/dist/plugins/file-history-store-sql.d.ts +9 -8
- package/dist/plugins/file-run-store.d.ts +27 -27
- package/dist/plugins/fork-routing-session-store.d.ts +9 -9
- package/dist/plugins/image-bake-store-sql.d.ts +1 -1
- package/dist/plugins/image-index-sql.d.ts +2 -2
- package/dist/plugins/k8s-bg-scripts.d.ts +1 -1
- package/dist/plugins/k8s-exec-protocol.d.ts +1 -1
- package/dist/plugins/leader-run-store-sql.d.ts +1 -1
- package/dist/plugins/local-checkpoint-store.d.ts +26 -17
- package/dist/plugins/local-checkpoint-store.js +21 -11
- package/dist/plugins/local-session-store.d.ts +5 -5
- package/dist/plugins/mailbox-store-sql.d.ts +6 -6
- package/dist/plugins/memory-embedder-fingerprint.d.ts +2 -2
- package/dist/plugins/memory-engine-pg.d.ts +1 -1
- package/dist/plugins/memory-engine-tidb.d.ts +1 -1
- package/dist/plugins/memory-key-guards.d.ts +3 -3
- package/dist/plugins/memory-optout-grant-store-sql.d.ts +10 -10
- package/dist/plugins/memory-origin-law.d.ts +13 -13
- package/dist/plugins/memory-run-store.d.ts +12 -12
- package/dist/plugins/outcome-ledger-sql.d.ts +3 -3
- package/dist/plugins/permission-rule-store-file.d.ts +3 -3
- package/dist/plugins/permission-rule-store-sql.d.ts +38 -33
- package/dist/plugins/permission-rule-store-sql.js +7 -12
- package/dist/plugins/pg-cost-quota.d.ts +2 -2
- package/dist/plugins/pg-pool.d.ts +29 -2
- package/dist/plugins/pg-pool.js +50 -2
- package/dist/plugins/pg-query.d.ts +1 -1
- package/dist/plugins/pg-rate-limiter.d.ts +2 -2
- package/dist/plugins/pg-session-storage.d.ts +9 -9
- package/dist/plugins/remote-env-adb.d.ts +1 -1
- package/dist/plugins/remote-env-device.d.ts +6 -4
- package/dist/plugins/remote-env-device.js +4 -1
- package/dist/plugins/remote-env-e2b.d.ts +11 -11
- package/dist/plugins/remote-env-file-error.d.ts +2 -2
- package/dist/plugins/remote-env-host.d.ts +10 -10
- package/dist/plugins/remote-env-k8s.d.ts +7 -7
- package/dist/plugins/remote-env-local-docker.d.ts +1 -1
- package/dist/plugins/remote-env-ssh.d.ts +9 -9
- package/dist/plugins/remote-scratchpad.d.ts +1 -1
- package/dist/plugins/resume-anchor-store-sql.d.ts +1 -1
- package/dist/plugins/retention-lane-store-sql.d.ts +2 -2
- package/dist/plugins/retention-store-sql.d.ts +11 -11
- package/dist/plugins/roster-store-sql.d.ts +6 -8
- package/dist/plugins/run-store-sql.d.ts +12 -12
- package/dist/plugins/scheduler-support.d.ts +1 -1
- package/dist/plugins/send-user-file.d.ts +1 -1
- package/dist/plugins/session-capture-record-store-sql.d.ts +99 -0
- package/dist/plugins/session-capture-record-store-sql.js +110 -0
- package/dist/plugins/session-placement.d.ts +1 -1
- package/dist/plugins/session-policy-store-sql.d.ts +2 -2
- package/dist/plugins/session-store.d.ts +3 -3
- package/dist/plugins/shared-memory-store-sql.d.ts +5 -5
- package/dist/plugins/sql-driver.d.ts +7 -7
- package/dist/plugins/sql-errors.d.ts +2 -2
- package/dist/plugins/sql-escape.d.ts +1 -1
- package/dist/plugins/sql-row-helpers.d.ts +1 -1
- package/dist/plugins/store-backend.d.ts +32 -19
- package/dist/plugins/store-backend.js +5 -1
- package/dist/plugins/store-contracts.d.ts +9 -9
- package/dist/plugins/task-list-store-sql.d.ts +3 -3
- package/dist/plugins/tidb-cost-quota.d.ts +3 -3
- package/dist/plugins/tidb-pool.d.ts +13 -0
- package/dist/plugins/tidb-pool.js +9 -0
- package/dist/plugins/tidb-rate-limiter.d.ts +2 -2
- package/dist/plugins/tidb-session-storage.d.ts +2 -2
- package/dist/plugins/tidb-session-store.d.ts +11 -11
- package/dist/plugins/tool-result-store-sql.d.ts +8 -8
- package/dist/plugins/usage-window-store-sql.d.ts +3 -3
- package/dist/plugins/web-search.d.ts +7 -7
- package/dist/plugins/workflow-journal-store-sql.d.ts +6 -6
- package/dist/plugins/workflow-run-store-sql.d.ts +1 -1
- package/dist/plugins/write-behind-counter.d.ts +6 -6
- package/dist/principal-jwt.d.ts +2 -2
- package/dist/project-memory.d.ts +1 -1
- package/dist/prompts-domain-validate.d.ts +8 -8
- package/dist/question.d.ts +3 -3
- package/dist/resource-suspend.d.ts +4 -4
- package/dist/resource-window.d.ts +3 -3
- package/dist/router/route-orchestration.d.ts +1 -1
- package/dist/rules-consent.d.ts +48 -40
- package/dist/run-local.d.ts +5 -5
- package/dist/runs.d.ts +19 -19
- package/dist/runtime-caps-resolver.d.ts +6 -6
- package/dist/runtime-governance.d.ts +11 -7
- package/dist/runtime-governance.js +23 -1
- package/dist/security.d.ts +13 -13
- package/dist/session-leaf-bus.d.ts +1 -1
- package/dist/session-sync-content.d.ts +4 -4
- package/dist/session-sync-kernel.d.ts +2 -2
- package/dist/session-sync.d.ts +13 -13
- package/dist/session-titler.d.ts +1 -1
- package/dist/session-watch.d.ts +3 -3
- package/dist/shared-memory-scope-authorizer.d.ts +4 -4
- package/dist/sighup-idle.d.ts +1 -1
- package/dist/spec-fields.d.ts +20 -20
- package/dist/ssh-host-key.d.ts +5 -5
- package/dist/store-live-probe.d.ts +2 -2
- package/dist/task-cwd.d.ts +11 -11
- package/dist/task-mcp.d.ts +5 -5
- package/dist/task-settings.d.ts +35 -35
- package/dist/task-workflow.d.ts +3 -3
- package/dist/text-bidi.d.ts +1 -1
- package/dist/tool-approval.d.ts +186 -182
- package/dist/tool-approval.js +247 -120
- package/dist/trace/core-keyset-guard.d.ts +19 -5
- package/dist/trace/engine-notice-wire.d.ts +7 -7
- package/dist/trace/engine-notice-wire.js +2 -0
- package/dist/trace/injection-tier.d.ts +11 -21
- package/dist/trace/injection-tier.js +3 -4
- package/dist/trace/ledger-events.d.ts +3 -3
- package/dist/trace/ledger-sink.d.ts +7 -7
- package/dist/trace/project.d.ts +31 -30
- package/dist/trace/project.js +1 -0
- package/dist/turn-activity.d.ts +4 -4
- package/dist/usage-analytics.d.ts +1 -1
- package/dist/wall-clock-jump-guard.d.ts +3 -3
- package/package.json +6 -6
|
@@ -10,7 +10,7 @@ import type { EffectiveConfig } from "./types.js";
|
|
|
10
10
|
* reference captured at boot, so mutating it (vs reassigning) updates both with no split, no Runner rebuild. */
|
|
11
11
|
export declare function mutateInPlace<V>(target: Record<string, V>, source: Record<string, V>): void;
|
|
12
12
|
/**
|
|
13
|
-
*
|
|
13
|
+
* [ref] / [ref] —— 无法解读的名单条目的**代表元**。
|
|
14
14
|
*
|
|
15
15
|
* 为什么需要它(codex 复审 R1 真 finding):把坏条目**丢掉**会让 `[7, null]` 这种「在场但一条都读不
|
|
16
16
|
* 懂」的名单塌成**空数组**,而空数组在消费端的语义恰恰是「治理关闭 = 全放行」—— 一个表达"我要限制"
|
|
@@ -23,14 +23,14 @@ export declare function mutateInPlace<V>(target: Record<string, V>, source: Reco
|
|
|
23
23
|
* 🔴 只活在内存判定面:不进 wire(`/v1/models` 只发布尔)、不进日志(warn 打的是原始坏值的类型标记)。
|
|
24
24
|
*/
|
|
25
25
|
export declare const UNPARSABLE_AT_MODEL_ALLOWLIST_ENTRY = "\0<unparsable-at-model-allowlist-entry>";
|
|
26
|
-
/** 返回值=是否 COMMIT(false 两臂:[
|
|
26
|
+
/** 返回值=是否 COMMIT(false 两臂:[ref]③ 世代序 CAS 拒绝 / 5.49 swapPlane 换装拒绝——两臂都在
|
|
27
27
|
* commit 之前,活配置零触碰)。caller 收到 false 必须把**同一世代的旁路消费**(prompts 采用/pricing/
|
|
28
28
|
* keyResolver/etag 推进/LKG 落盘)一并跳过——否则 applyEffective 拒了主面、旁路却半应用同一个被拒
|
|
29
29
|
* 世代,混合世代从侧门回来。首次 apply(live 未登记)恒 true。 */
|
|
30
|
-
/**
|
|
30
|
+
/** [ref]:一次 apply 的**世代账载荷**(post-commit 发,[ref]② —— commit 段仍是零回调零发射)。 */
|
|
31
31
|
export interface ApplyReport {
|
|
32
32
|
readonly version: number;
|
|
33
|
-
/**
|
|
33
|
+
/** [ref]:本候选的收货序数(= opts.generation 原样带回;世代账按它记拒收,身份标仍是 version)。 */
|
|
34
34
|
readonly ordinal?: number;
|
|
35
35
|
readonly limits: {
|
|
36
36
|
/** 本世代真正换了值的键。 */
|
|
@@ -63,14 +63,12 @@ export declare function applyEffective(config: ServiceConfig, eff: EffectiveConf
|
|
|
63
63
|
}) => void;
|
|
64
64
|
}): boolean;
|
|
65
65
|
/**
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
* UNIFORM presence semantics across all 6 gates (center `f95438a` adopted this from our sentinel flag —
|
|
69
|
-
* SERVICE-INTEGRATION「Runtime 治理/限额闸」): all six fields are center `.optional()`, so
|
|
66
|
+
* UNIFORM presence semantics across the center gates (center `f95438a` adopted this from our sentinel flag —
|
|
67
|
+
* SERVICE-INTEGRATION「Runtime 治理/限额闸」): every gate field is center `.optional()`, so
|
|
70
68
|
* `undefined` = center isn't managing it → KEEP env;
|
|
71
69
|
* present (any value, INCLUDING an explicit 0 / [] = "publish the gate OFF") → OVERRIDE env.
|
|
72
70
|
* (Earlier center had `rateLimitPerMin`/`approvalRequire` as `.default(0/[])`, which would have let a default
|
|
73
|
-
* silently disable an env-set gate — we flagged it, center made
|
|
71
|
+
* silently disable an env-set gate — we flagged it, center made them optional, so a plain presence rule is
|
|
74
72
|
* now both correct and uniform. No sentinel special-casing.)
|
|
75
73
|
*
|
|
76
74
|
* Only guard: `costQuotaWindowSec` must be `> 0` (a 0 window is nonsensical — core divides by it). Center's
|
|
@@ -79,29 +77,46 @@ export declare function applyEffective(config: ServiceConfig, eff: EffectiveConf
|
|
|
79
77
|
* Per-worker overrides ride the per-worker `/effective?worker=` response (center merges WorkerSpec.runtime over
|
|
80
78
|
* the fleet default server-side), so this single "effective beats env" rule already honors per-worker > fleet.
|
|
81
79
|
*/
|
|
82
|
-
/**
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
|
|
87
|
-
export declare const RUNTIME_GATE_KEYS: readonly ["rateLimitPerMin", "approvalRequire", "maxTaskCostUsd", "maxTaskTokens", "maxPrincipalCostUsd", "costQuotaWindowSec"];
|
|
80
|
+
/** `runtime` 域的限额五闸(= settings-schema `RuntimeConfig` 的全部键,[ref] 件3 对账门钉集合等式),ONE place:
|
|
81
|
+
* legacy 位的 presence 判据({@link runtimeGatePresent} → stage-limits 的 `legacyGates`)、config-catalog 的
|
|
82
|
+
* center 在管键、dry-run 现值快照都从这一张表派生。[ref] 批1 起五键**全热**(属主 stage-limits,boot+refresh
|
|
83
|
+
* 双腿),所以本表与 restart-to-apply 再无关系——审批闸不在这里:它住 governance 域({@link BOOT_GATE_KEYS})。 */
|
|
84
|
+
export declare const RUNTIME_GATE_KEYS: readonly ["rateLimitPerMin", "maxTaskCostUsd", "maxTaskTokens", "maxPrincipalCostUsd", "costQuotaWindowSec"];
|
|
88
85
|
export type RuntimeGateKey = (typeof RUNTIME_GATE_KEYS)[number];
|
|
86
|
+
/** boot-only(restart-to-apply)的治理闸:今天只有 `governance.approvalRequire` 一键——它被 main.ts 在本函数之后
|
|
87
|
+
* 用 `config` 构造进 approval gate,refresh 腿(teamsOnly)不写,变更由 restart-signal 的 `runtime-gates` 片通告。
|
|
88
|
+
* ([ref] 批2 若把它转热,这张表清空、那个片随之退役——一处改动。) */
|
|
89
|
+
export declare const BOOT_GATE_KEYS: readonly ["approvalRequire"];
|
|
90
|
+
export type BootGateKey = (typeof BOOT_GATE_KEYS)[number];
|
|
91
|
+
/** Uniform presence rule (center f95438a) for the `runtime` limit gates: "managed" when the field is present —
|
|
92
|
+
* any number (incl. 0). Sole guard: costQuotaWindowSec must be > 0 (a 0 window is nonsensical — core divides by
|
|
93
|
+
* it; center's `.positive()` already enforces, belt-and-suspenders here). The approval gate's presence rule
|
|
94
|
+
* (`Array.isArray`) lives with its owner, {@link stageApprovalGate}. */
|
|
89
95
|
/**
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
*
|
|
96
|
+
* DESIGN-278 §5 S2([ref])—— center 这份 effective **当前在管**哪些 `ServiceConfig` 键(配置目录端点
|
|
97
|
+
* `GET /v1/config/catalog` 判 `effectiveLane` 的 center 半场)。
|
|
98
|
+
*
|
|
99
|
+
* 判据与各消费腿**同源**,不自铸第二份:
|
|
100
|
+
* · limits 域 = `hasOwnProperty`(stage-limits 的 published 判据逐字——present 含显式 0);
|
|
101
|
+
* · 六闸 legacy 位 = {@link runtimeGatePresent}(旧位 presence 规则的唯一属主);
|
|
102
|
+
* · governance/runtime 热二件 + approvalRequire = 键在场(applyRuntimeHot 的 non-sticky 判据同门);
|
|
103
|
+
* · readFace 域成员 = 键在场(read-face.ts 的逐键 env-wins 合成看的就是成员在场性);
|
|
104
|
+
* · models 面 = 有启用行(markRosterLanded 同判据);atModelAllowlist 单列(整表重算键)。
|
|
105
|
+
* 纯投影零副作用;`undefined` eff(还没拉到 / 纯 env 形)⇒ 空集。
|
|
93
106
|
*/
|
|
94
|
-
export declare
|
|
95
|
-
/** Uniform presence rule (center f95438a): a gate is "managed" when the field is present — any number (incl. 0),
|
|
96
|
-
* or an array for approvalRequire. Sole guard: costQuotaWindowSec must be > 0 (a 0 window is nonsensical — core
|
|
97
|
-
* divides by it; center's `.positive()` already enforces, belt-and-suspenders here). */
|
|
107
|
+
export declare function centerManagedConfigKeys(eff: EffectiveConfig | undefined): ReadonlySet<string>;
|
|
98
108
|
export declare function runtimeGatePresent(rt: NonNullable<EffectiveConfig["runtime"]>, key: RuntimeGateKey): boolean;
|
|
99
|
-
|
|
100
|
-
|
|
109
|
+
/** 独立调用面的兼容壳(测试/外部):stage → 就地赋值 → 通知。applyEffective 不走这里——它把
|
|
110
|
+
* assignments 并进自己的 commit 段以保住整世代原子性([ref]②)。入参是 eff 的两个域([ref] 件3:审批闸
|
|
111
|
+
* 住 governance,限额五闸住 runtime——两位各自的属主判据,这里不再合成视图)。
|
|
112
|
+
* [ref]:限额五闸的属主已移交热腿,所以本壳**同样**要过 stage-limits —— 否则一个仍叫 applyRuntimeGates
|
|
113
|
+
* 的函数会静默漏掉五个限额键(比改名更坏的那种沉默)。 */
|
|
114
|
+
export declare function applyRuntimeGates(config: ServiceConfig, eff: Pick<EffectiveConfig, "runtime" | "governance"> | undefined, logger?: Logger): void;
|
|
115
|
+
export declare function applyRuntimeHot(config: ServiceConfig, gov: EffectiveConfig["governance"], logger?: Logger): void;
|
|
101
116
|
/**
|
|
102
|
-
* [
|
|
117
|
+
* [ref]① 显式默认解析——applyEffective 与 dry-run(logEffectiveDiff.wouldDefaultModel)共用的单源。优先级
|
|
103
118
|
* (显式源指向不在目录/未启用的名 ⇒ onDangling 回调后落下一级,绝不静默指错模型):
|
|
104
|
-
* 1) eff.models.default 结构键 —— ✅ 既得路径([
|
|
119
|
+
* 1) eff.models.default 结构键 —— ✅ 既得路径([ref] registry-core 0.10.11 落 `default?: string` schema
|
|
105
120
|
* 键+per-worker /effective 直通;本地 lane 由 config-provider mapToServiceEffective 直通)。写面悬空 ref
|
|
106
121
|
* 由 registry-core superRefine fail-loud;存量/未经 schema 路径仍走本函数的 warn 降级(双层姿势与
|
|
107
122
|
* activeTierGroup 同构)。(1.200-1.202 期间此级恒空=当时如实的前行 seam,codex H2 注记已兑现。)
|
|
@@ -116,10 +131,7 @@ export declare function resolveDefaultModelName(eff: EffectiveConfig, has: (name
|
|
|
116
131
|
/**
|
|
117
132
|
* Read-only comparison (SEMA_REGISTRY_DRY_RUN): log what the center config WOULD change vs the current
|
|
118
133
|
* (env-derived) config, WITHOUT applying it. The safe-rollout step the config-center recommends — verify
|
|
119
|
-
* the center's models/roles/
|
|
134
|
+
* the center's models/roles/collab match (or intentionally differ from) the env baseline before going live.
|
|
120
135
|
*/
|
|
121
136
|
export declare function logEffectiveDiff(config: ServiceConfig, eff: EffectiveConfig, logger?: Logger): void;
|
|
122
|
-
/** True if the center `runtime` carries any managed gate (a PRESENT field) — i.e. a refresh that changed it
|
|
123
|
-
* needs a restart to take effect (restart-to-apply). Same key list + presence rule as applyRuntimeGates. */
|
|
124
|
-
export declare function runtimeHasActiveGate(rt: EffectiveConfig["runtime"]): boolean;
|
|
125
137
|
//# sourceMappingURL=apply-effective.d.ts.map
|
|
@@ -4,7 +4,6 @@ import { sealedKeyPoison } from "../sealed-key.js";
|
|
|
4
4
|
import { applyAutoCompactWindow, findUnmatchableToolNames, formatUnmatchableToolNames, parseAutonomy } from "../config.js";
|
|
5
5
|
import { validateCommandRules } from "../runtime-governance.js";
|
|
6
6
|
import { projectCollabToWorkflows, registerCollabWorkflows } from "../capabilities/collab-workflows.js";
|
|
7
|
-
import { registerTeams } from "../capabilities/team.js";
|
|
8
7
|
import { stageLimits } from "./stage-limits.js";
|
|
9
8
|
import { BATCH1_LIMIT_KEYS } from "./hot-keys-registry.js";
|
|
10
9
|
const asModelThinking = (v) => (v && isThinkingLevel(v) && v !== "off" ? v : undefined);
|
|
@@ -124,7 +123,7 @@ export function applyEffective(config, eff, logger, opts = {}) {
|
|
|
124
123
|
logger?.info("sema_registry_runtime", staged.gatesInfo);
|
|
125
124
|
if (Object.keys(staged.hot.infoLine).length > 0)
|
|
126
125
|
logger?.info("sema_registry_runtime_hot", staged.hot.infoLine);
|
|
127
|
-
for (const n of staged.
|
|
126
|
+
for (const n of staged.collabPlane?.notices ?? []) {
|
|
128
127
|
if (n.level === "warn")
|
|
129
128
|
logger?.warn(n.msg, n.fields);
|
|
130
129
|
else
|
|
@@ -158,11 +157,8 @@ function commitStaged(config, staged) {
|
|
|
158
157
|
config.autonomy = staged.hot.autonomyNext;
|
|
159
158
|
if (staged.hot.setCommandPolicy)
|
|
160
159
|
config.commandPolicy = staged.hot.commandPolicyNext;
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
registerTeams(tp.teams);
|
|
164
|
-
registerCollabWorkflows(tp.workflows);
|
|
165
|
-
}
|
|
160
|
+
if (staged.collabPlane)
|
|
161
|
+
registerCollabWorkflows(staged.collabPlane.workflows);
|
|
166
162
|
mutateInPlace(config.projects, staged.projects);
|
|
167
163
|
}
|
|
168
164
|
function stageEffective(config, eff, logger, opts) {
|
|
@@ -267,32 +263,20 @@ function stageEffective(config, eff, logger, opts) {
|
|
|
267
263
|
infoLine: { count: enabled.length, default: models.default.id, defaultSource: picked.source, roles: Object.keys(roles), tiers: Object.keys(activeTiers), atModelAllowlist: atModelAllowlist.length, sealedKeys: Object.values(modelApiKeys).filter((v) => typeof v === "string").length, sealedPoisoned: Object.values(modelApiKeys).filter((v) => typeof v !== "string").length },
|
|
268
264
|
};
|
|
269
265
|
}
|
|
270
|
-
const
|
|
271
|
-
const gates = opts.teamsOnly ? undefined : stageRuntimeGates(gatesView, logger);
|
|
266
|
+
const gates = opts.teamsOnly ? undefined : stageApprovalGate(eff.governance, logger);
|
|
272
267
|
const limits = stageLimits(config, { version: typeof eff.version === "number" ? eff.version : 0, ...("limits" in eff ? { limits: eff.limits } : {}), legacyGates: legacyGateValues(eff.runtime) }, logger);
|
|
273
|
-
const hot = stageRuntimeHot(config,
|
|
274
|
-
let
|
|
268
|
+
const hot = stageRuntimeHot(config, eff.governance, logger);
|
|
269
|
+
let collabPlane;
|
|
275
270
|
if (opts.deferModelPlane !== true) {
|
|
276
|
-
const teams = {};
|
|
277
|
-
for (const t of (eff.teams?.teams ?? []).filter((t) => t.enabled !== false)) {
|
|
278
|
-
teams[t.name] = {
|
|
279
|
-
name: t.name,
|
|
280
|
-
members: t.members.map((mm) => ({ role: mm.role, ...(mm.model ? { model: mm.model } : {}), modelRole: mm.modelRole, systemPrompt: mm.systemPrompt })),
|
|
281
|
-
rounds: t.rounds,
|
|
282
|
-
synthesizer: t.synthesizer ? { role: t.synthesizer.role, modelRole: t.synthesizer.modelRole, systemPrompt: t.synthesizer.systemPrompt } : undefined,
|
|
283
|
-
};
|
|
284
|
-
}
|
|
285
271
|
const projected = projectCollabToWorkflows(eff.collab?.templates);
|
|
286
272
|
const notices = [];
|
|
287
|
-
if (Object.keys(teams).length > 0)
|
|
288
|
-
notices.push({ level: "info", msg: "sema_registry_teams", fields: { teams: Object.keys(teams) } });
|
|
289
273
|
if (Object.keys(projected.workflows).length > 0)
|
|
290
274
|
notices.push({ level: "info", msg: "sema_registry_collab_workflows", fields: { workflows: Object.keys(projected.workflows) } });
|
|
291
275
|
if (projected.skipped.length > 0)
|
|
292
276
|
notices.push({ level: "warn", msg: "sema_registry_collab_skipped", fields: { skipped: projected.skipped } });
|
|
293
277
|
if (projected.notes.length > 0)
|
|
294
278
|
notices.push({ level: "info", msg: "sema_registry_collab_notes", fields: { notes: projected.notes } });
|
|
295
|
-
|
|
279
|
+
collabPlane = { workflows: projected.workflows, notices };
|
|
296
280
|
}
|
|
297
281
|
const projDomain = eff.projects;
|
|
298
282
|
const rawProjects = (projDomain && typeof projDomain === "object" && !Array.isArray(projDomain) &&
|
|
@@ -316,16 +300,55 @@ function stageEffective(config, eff, logger, opts) {
|
|
|
316
300
|
...(gates !== undefined ? { gateAssignments: gates.assignments, ...(gates.info !== undefined ? { gatesInfo: gates.info } : {}) } : {}),
|
|
317
301
|
limits,
|
|
318
302
|
hot,
|
|
319
|
-
...(
|
|
303
|
+
...(collabPlane !== undefined ? { collabPlane } : {}),
|
|
320
304
|
projects,
|
|
321
305
|
};
|
|
322
306
|
}
|
|
323
|
-
export const RUNTIME_GATE_KEYS = ["rateLimitPerMin", "
|
|
324
|
-
export const
|
|
307
|
+
export const RUNTIME_GATE_KEYS = ["rateLimitPerMin", "maxTaskCostUsd", "maxTaskTokens", "maxPrincipalCostUsd", "costQuotaWindowSec"];
|
|
308
|
+
export const BOOT_GATE_KEYS = ["approvalRequire"];
|
|
309
|
+
export function centerManagedConfigKeys(eff) {
|
|
310
|
+
const out = new Set();
|
|
311
|
+
if (!eff)
|
|
312
|
+
return out;
|
|
313
|
+
const limits = eff.limits;
|
|
314
|
+
if (limits) {
|
|
315
|
+
for (const k of BATCH1_LIMIT_KEYS)
|
|
316
|
+
if (Object.prototype.hasOwnProperty.call(limits, k))
|
|
317
|
+
out.add(k);
|
|
318
|
+
}
|
|
319
|
+
const rt = eff.runtime;
|
|
320
|
+
if (rt) {
|
|
321
|
+
for (const k of RUNTIME_GATE_KEYS)
|
|
322
|
+
if (runtimeGatePresent(rt, k))
|
|
323
|
+
out.add(k);
|
|
324
|
+
}
|
|
325
|
+
if (eff.governance) {
|
|
326
|
+
if (eff.governance.autonomy !== undefined)
|
|
327
|
+
out.add("autonomy");
|
|
328
|
+
if (eff.governance.commandPolicy !== undefined)
|
|
329
|
+
out.add("commandPolicy");
|
|
330
|
+
if (eff.governance.approvalRequire !== undefined)
|
|
331
|
+
out.add("approvalRequire");
|
|
332
|
+
}
|
|
333
|
+
const rf = eff.readFace;
|
|
334
|
+
if (rf !== undefined && rf !== null && typeof rf === "object") {
|
|
335
|
+
if (rf.face !== undefined)
|
|
336
|
+
out.add("readFace");
|
|
337
|
+
if (rf.denyPatterns !== undefined)
|
|
338
|
+
out.add("readDenyPatterns");
|
|
339
|
+
if (rf.denyBuiltinTiers !== undefined)
|
|
340
|
+
out.add("readDenyBuiltinTiers");
|
|
341
|
+
if (rf.denyBuiltinExclude !== undefined)
|
|
342
|
+
out.add("readDenyBuiltinExclude");
|
|
343
|
+
}
|
|
344
|
+
if ((eff.models?.models ?? []).some((m) => m.enabled !== false))
|
|
345
|
+
out.add("models");
|
|
346
|
+
if (eff.models?.atModelAllowlist !== undefined)
|
|
347
|
+
out.add("atModelAllowlist");
|
|
348
|
+
return out;
|
|
349
|
+
}
|
|
325
350
|
export function runtimeGatePresent(rt, key) {
|
|
326
351
|
const v = rt[key];
|
|
327
|
-
if (key === "approvalRequire")
|
|
328
|
-
return Array.isArray(v);
|
|
329
352
|
if (key === "costQuotaWindowSec")
|
|
330
353
|
return typeof v === "number" && v > 0;
|
|
331
354
|
return typeof v === "number";
|
|
@@ -356,43 +379,29 @@ function stageApprovalRequire(raw, logger) {
|
|
|
356
379
|
}
|
|
357
380
|
return { value: names };
|
|
358
381
|
}
|
|
359
|
-
function
|
|
360
|
-
|
|
382
|
+
function stageApprovalGate(gov, logger) {
|
|
383
|
+
const raw = gov?.approvalRequire;
|
|
384
|
+
if (!Array.isArray(raw))
|
|
361
385
|
return { assignments: [] };
|
|
362
|
-
const
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
continue;
|
|
367
|
-
if (!runtimeGatePresent(rt, key))
|
|
368
|
-
continue;
|
|
369
|
-
if (key === "approvalRequire") {
|
|
370
|
-
const staged = stageApprovalRequire(rt[key], logger);
|
|
371
|
-
if (staged.value === undefined)
|
|
372
|
-
continue;
|
|
373
|
-
assignments.push([key, staged.value]);
|
|
374
|
-
applied[key] = staged.value;
|
|
375
|
-
continue;
|
|
376
|
-
}
|
|
377
|
-
assignments.push([key, rt[key]]);
|
|
378
|
-
applied[key] = rt[key];
|
|
379
|
-
}
|
|
380
|
-
return { assignments, ...(Object.keys(applied).length > 0 ? { info: applied } : {}) };
|
|
386
|
+
const staged = stageApprovalRequire(raw, logger);
|
|
387
|
+
if (staged.value === undefined)
|
|
388
|
+
return { assignments: [] };
|
|
389
|
+
return { assignments: [["approvalRequire", staged.value]], info: { approvalRequire: staged.value } };
|
|
381
390
|
}
|
|
382
391
|
function legacyGateValues(rt) {
|
|
383
392
|
const out = {};
|
|
384
393
|
if (!rt)
|
|
385
394
|
return out;
|
|
386
395
|
for (const k of RUNTIME_GATE_KEYS)
|
|
387
|
-
if (
|
|
396
|
+
if (runtimeGatePresent(rt, k))
|
|
388
397
|
out[k] = rt[k];
|
|
389
398
|
return out;
|
|
390
399
|
}
|
|
391
|
-
export function applyRuntimeGates(config,
|
|
392
|
-
const s =
|
|
400
|
+
export function applyRuntimeGates(config, eff, logger) {
|
|
401
|
+
const s = stageApprovalGate(eff?.governance, logger);
|
|
393
402
|
for (const [k, v] of s.assignments)
|
|
394
403
|
config[k] = v;
|
|
395
|
-
const limits = stageLimits(config, { version: 0, legacyGates: legacyGateValues(
|
|
404
|
+
const limits = stageLimits(config, { version: 0, legacyGates: legacyGateValues(eff?.runtime) }, logger);
|
|
396
405
|
for (const [k, v] of limits.assignments)
|
|
397
406
|
config[k] = v;
|
|
398
407
|
for (const k of limits.deletions)
|
|
@@ -428,8 +437,8 @@ function stageRuntimeHot(config, rt, logger) {
|
|
|
428
437
|
}
|
|
429
438
|
return { setAutonomy, autonomyNext, setCommandPolicy, commandPolicyNext, infoLine };
|
|
430
439
|
}
|
|
431
|
-
export function applyRuntimeHot(config,
|
|
432
|
-
const s = stageRuntimeHot(config,
|
|
440
|
+
export function applyRuntimeHot(config, gov, logger) {
|
|
441
|
+
const s = stageRuntimeHot(config, gov, logger);
|
|
433
442
|
if (s.setAutonomy)
|
|
434
443
|
config.autonomy = s.autonomyNext;
|
|
435
444
|
if (s.setCommandPolicy)
|
|
@@ -461,7 +470,6 @@ export function logEffectiveDiff(config, eff, logger) {
|
|
|
461
470
|
const centerModels = enabled.map((m) => ({ name: m.name, id: m.id, provider: m.provider, apiKeyEnv: m.apiKeyEnv ?? null, tier: m.tier ?? null }));
|
|
462
471
|
const envModels = Object.entries(config.models).map(([name, m]) => ({ name, id: m.id, provider: m.provider }));
|
|
463
472
|
const centerRoles = Object.fromEntries(Object.entries(eff.models?.roles ?? {}).map(([r, t]) => [r, "model" in t ? t.model : { select: t.select }]));
|
|
464
|
-
const centerTeams = (eff.teams?.teams ?? []).filter((t) => t.enabled !== false).map((t) => t.name);
|
|
465
473
|
logger?.warn("sema_registry_dry_run", {
|
|
466
474
|
note: "DRY RUN — registry config NOT applied; unset SEMA_REGISTRY_DRY_RUN to go live",
|
|
467
475
|
version: eff.version,
|
|
@@ -470,18 +478,17 @@ export function logEffectiveDiff(config, eff, logger) {
|
|
|
470
478
|
currentDefaultModel: config.model.id,
|
|
471
479
|
models: { center: centerModels, envDerived: envModels },
|
|
472
480
|
roles: { center: centerRoles, current: config.roles },
|
|
473
|
-
|
|
481
|
+
collab: { centerWouldRegister: Object.keys(projectCollabToWorkflows(eff.collab?.templates).workflows) },
|
|
474
482
|
skills: { centerWouldLoad: (eff.skills?.skills ?? []).filter((s) => s.enabled !== false).map((s) => s.name) },
|
|
475
483
|
mcp: { centerWouldRegister: (eff.mcp?.servers ?? []).filter((s) => s.enabled !== false).map((s) => s.name) },
|
|
476
484
|
runtime: {
|
|
477
485
|
center: eff.runtime ?? null,
|
|
478
486
|
current: Object.fromEntries(RUNTIME_GATE_KEYS.map((k) => [k, config[k]])),
|
|
479
487
|
},
|
|
488
|
+
governance: {
|
|
489
|
+
center: eff.governance ?? null,
|
|
490
|
+
current: { autonomy: config.autonomy, commandPolicy: config.commandPolicy?.length ?? 0, approvalRequire: config.approvalRequire },
|
|
491
|
+
},
|
|
480
492
|
});
|
|
481
493
|
}
|
|
482
|
-
export function runtimeHasActiveGate(rt) {
|
|
483
|
-
if (!rt)
|
|
484
|
-
return false;
|
|
485
|
-
return RUNTIME_GATE_KEYS.some((k) => runtimeGatePresent(rt, k));
|
|
486
|
-
}
|
|
487
494
|
//# sourceMappingURL=apply-effective.js.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* [ref] —— **世代账**([ref] §2 世代账,codex 设计审 F4)。
|
|
3
3
|
*
|
|
4
4
|
* 身份标 = 上游 `EffectiveConfig.version`,**刻意不造跨进程 epoch**(codex F4 语义不变):
|
|
5
5
|
* · 同版本幂等重放(etag 未推进的下一拍)不该伪增世代;
|
|
6
6
|
* · 双副本对账「是不是同一代」必须能跨进程判 —— 同 source version = 同一代。
|
|
7
7
|
*
|
|
8
|
-
* 🔴
|
|
8
|
+
* 🔴 [ref](test [ref],[ref] 阻断裁定):**序轴与身份标分离**。source version 在
|
|
9
9
|
* `CONFIG_PROVIDER=local` 下是 registry-core file-store 的内容哈希(u53,上游契约只承诺
|
|
10
10
|
* 「同 files ⇒ 同 number」,从未承诺序)——把它当序数消费,哈希更小的合法新代会被永久
|
|
11
11
|
* 静默忽略且本账双盲(target/applied 都不动)。修后:**推进判断吃收货处铸的进程内单调
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* `version` 只做对账身份标——configTargetVersion 语义从「max(见过)」变为「**最后**见过的
|
|
14
14
|
* 源代」(remote 单调腿二者等价;local 腿这才是真相)。
|
|
15
15
|
*
|
|
16
|
-
* 读面两个:`/health` 的三键(target / applied /
|
|
16
|
+
* 读面两个:`/health` 的三键(target / applied / 失败持续时长;[ref] 起 additive 补
|
|
17
17
|
* targetOrdinal/appliedOrdinal 两键=推进/停滞的机器判据)给编排器判「这个副本要不要摘」;
|
|
18
18
|
* 诊断端点的 `configApply` 段给运维看**按组**的细节(哪一组停在哪一代、上一次为什么被拒)。
|
|
19
19
|
*
|
|
@@ -42,9 +42,9 @@ export interface ConfigApplyLedgerView {
|
|
|
42
42
|
readonly configTargetVersion: number;
|
|
43
43
|
/** 最后一次成功 commit 的源版本(身份标)。 */
|
|
44
44
|
readonly configAppliedVersion: number;
|
|
45
|
-
/**
|
|
45
|
+
/** [ref]:target 的收货序数(进程内单调)——「见过多少代」的推进判据,哈希方向免疫。 */
|
|
46
46
|
readonly configTargetOrdinal: number;
|
|
47
|
-
/**
|
|
47
|
+
/** [ref]:applied 的收货序数。targetOrdinal 推进而这里停滞 = 「改了没生效」的机器判据。 */
|
|
48
48
|
readonly configAppliedOrdinal: number;
|
|
49
49
|
/** target≠applied 的**持续**时长(ms);收敛时键缺席(健康面不制造噪音)。 */
|
|
50
50
|
readonly configApplyStaleMs?: number;
|
|
@@ -53,7 +53,7 @@ export interface ConfigApplyLedgerView {
|
|
|
53
53
|
/** applyEffective 的 post-commit 报告(见 apply-effective.ts `ApplyReport`)。 */
|
|
54
54
|
export interface ConfigApplyReport {
|
|
55
55
|
readonly version: number;
|
|
56
|
-
/**
|
|
56
|
+
/** [ref]:本候选的收货序数(applyEffective opts.generation 原样带回;缺席=version 兼容臂)。 */
|
|
57
57
|
readonly ordinal?: number;
|
|
58
58
|
readonly limits: {
|
|
59
59
|
readonly applied: readonly string[];
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* [ref] 件5 —— server 的 settings-schema 消费键账本(对账门 test/settings-schema-consumption-gates.test.ts 的本仓侧输入)。
|
|
3
|
+
*
|
|
4
|
+
* 🔴 三条纪律:
|
|
5
|
+
* 1. `EFFECTIVE_CONFIG_KEYS` 与 {@link EffectiveConfig} **类型级**绑定(`satisfies Record<keyof …, true>`):接口加键 /
|
|
6
|
+
* 删键而不动这里 = **编译错**——运行时键表永不与类型面漂移(这不是第二份表,是同一份接口的运行时投影;
|
|
7
|
+
* runtime / governance 两域的键表同法,用于与 schema zod shape 的集合等式墓碑)。
|
|
8
|
+
* 2. 三张登记表(非域白名单 / 不消费表 / 远端专属表)每行**必须带理由**;行的成立性由对账门**双向**钉——登记了
|
|
9
|
+
* 却不成立(死账)与成立了却没登记(半接线)都红,理由失效之日格子自己翻红(墓碑),禁裸豁免。
|
|
10
|
+
* 3. schema 侧的数据(`DOMAINS` / `PORTABLE_DOMAINS` / zod shape)一律由对账门**读 dist**,绝不抄进这里
|
|
11
|
+
* (平行副本病是 DESIGN-282 §0 的病理定性,本文件只登记 server 自己那一侧)。
|
|
12
|
+
*/
|
|
13
|
+
import type { EffectiveConfig } from "./types.js";
|
|
14
|
+
/** EffectiveConfig 的全部顶层键(信封 + 域 + 非域白名单键),类型级绑定见上。 */
|
|
15
|
+
export declare const EFFECTIVE_CONFIG_KEYS: ReadonlyArray<keyof EffectiveConfig>;
|
|
16
|
+
/** 信封键(不是域)。 */
|
|
17
|
+
export declare const EFFECTIVE_ENVELOPE_KEYS: readonly ["version", "updatedAt"];
|
|
18
|
+
/** `runtime` 域(限额残余)的键集——对账门与 schema `RuntimeConfig.shape` 钉集合等式([ref] 件3 退役键墓碑)。 */
|
|
19
|
+
export declare const RUNTIME_DOMAIN_KEYS: readonly string[];
|
|
20
|
+
/** `governance` 域(治理三件)的键集——对账门与 schema `GovernanceConfig.shape` 钉集合等式。 */
|
|
21
|
+
export declare const GOVERNANCE_DOMAIN_KEYS: readonly string[];
|
|
22
|
+
/** EffectiveConfig 上**不是** settings-schema 域的顶层键(键 → 成文理由)。⚠️ 墓碑语义:任一键将来出现在 schema
|
|
23
|
+
* `DOMAINS` 里 ⇒ 对账门红 ⇒ 清本行 + 接本地腿投影(mapToServiceEffective)+ 复核 restart 片归属。 */
|
|
24
|
+
export declare const NON_DOMAIN_EFFECTIVE_KEYS: Readonly<Record<string, string>>;
|
|
25
|
+
/** schema `DOMAINS` 里 server **不消费**的域(域 → 成文理由)。⚠️ 新域(如 presets)到货而不入本表也不入
|
|
26
|
+
* EffectiveConfig ⇒ 对账门红 ⇒ 逼一行显式决定(「加了域没人接」从此机器可见,[ref]③)。 */
|
|
27
|
+
export declare const DOMAINS_NOT_CONSUMED_BY_SERVER: Readonly<Record<string, string>>;
|
|
28
|
+
/** server 消费但**非便携**(∉ PORTABLE_DOMAINS ⇒ 本地腿无 config.d/<域>.json 可读)的域(域 → 成文理由)。 */
|
|
29
|
+
export declare const LOCAL_LANE_REMOTE_ONLY_DOMAINS: Readonly<Record<string, string>>;
|
|
30
|
+
//# sourceMappingURL=effective-keys.d.ts.map
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
const EFFECTIVE_CONFIG_KEY_TABLE = {
|
|
2
|
+
version: true,
|
|
3
|
+
updatedAt: true,
|
|
4
|
+
models: true,
|
|
5
|
+
collab: true,
|
|
6
|
+
skills: true,
|
|
7
|
+
mcp: true,
|
|
8
|
+
a2a: true,
|
|
9
|
+
scenarios: true,
|
|
10
|
+
runtime: true,
|
|
11
|
+
limits: true,
|
|
12
|
+
projects: true,
|
|
13
|
+
governance: true,
|
|
14
|
+
plugins: true,
|
|
15
|
+
readFace: true,
|
|
16
|
+
prompts: true,
|
|
17
|
+
};
|
|
18
|
+
export const EFFECTIVE_CONFIG_KEYS = Object.keys(EFFECTIVE_CONFIG_KEY_TABLE);
|
|
19
|
+
export const EFFECTIVE_ENVELOPE_KEYS = ["version", "updatedAt"];
|
|
20
|
+
const RUNTIME_DOMAIN_KEY_TABLE = {
|
|
21
|
+
rateLimitPerMin: true,
|
|
22
|
+
maxTaskCostUsd: true,
|
|
23
|
+
maxTaskTokens: true,
|
|
24
|
+
maxPrincipalCostUsd: true,
|
|
25
|
+
costQuotaWindowSec: true,
|
|
26
|
+
};
|
|
27
|
+
export const RUNTIME_DOMAIN_KEYS = Object.keys(RUNTIME_DOMAIN_KEY_TABLE);
|
|
28
|
+
const GOVERNANCE_DOMAIN_KEY_TABLE = {
|
|
29
|
+
autonomy: true,
|
|
30
|
+
commandPolicy: true,
|
|
31
|
+
approvalRequire: true,
|
|
32
|
+
};
|
|
33
|
+
export const GOVERNANCE_DOMAIN_KEYS = Object.keys(GOVERNANCE_DOMAIN_KEY_TABLE);
|
|
34
|
+
export const NON_DOMAIN_EFFECTIVE_KEYS = {
|
|
35
|
+
a2a: "R-15 裁开域([4384]),但 settings-schema 至 1.3.0 未开(DOMAINS 无 a2a)——S-31 件2 BLOCKED on schema:远端腿靠 readEffectiveWire 的 open-world verbatim 透传(DESIGN-269),本地腿不可达(FileConfigStore 只读 PORTABLE_DOMAINS)。schema 开域之日按墓碑流程收线。",
|
|
36
|
+
readFace: "R-15 裁**暂不开域**([4384]:env 逐键恒赢语义下收益薄,⚪ 呈现制过渡)——#A4 的远端腿同靠 open-world 透传;本地腿四键由 env / 引擎默认独占。若来日改裁开域,同上墓碑机制。",
|
|
37
|
+
};
|
|
38
|
+
export const DOMAINS_NOT_CONSUMED_BY_SERVER = {
|
|
39
|
+
rosters: "center 写面域:center 端 resolveEffectiveForWorker 把 roster 解析进 per-worker /effective 的 models 视图——server 消费的是解析产物,不读原始域。",
|
|
40
|
+
systems: "控制面登记簿(系统台账),orchestrator / web 消费;worker /effective 视图不含。",
|
|
41
|
+
workers: "fleet 声明域,orchestrator(reconciler)消费拆建 worker;worker 自身不读。",
|
|
42
|
+
hosts: "主机登记域,orchestrator / 探活面消费;worker /effective 视图不含。",
|
|
43
|
+
entitlement: "租户商务数据:裁定为 per-principal caps view 单源(fetchPrincipalCaps),raw 域刻意不上 worker wire(center resolve-roster strips)。",
|
|
44
|
+
execution: "per-principal 执法面同 entitlement:ruling 骑 caps view(ExecutionRuling),/effective 域面 server 不读。",
|
|
45
|
+
};
|
|
46
|
+
export const LOCAL_LANE_REMOTE_ONLY_DOMAINS = {
|
|
47
|
+
projects: "身份台账(design/142 §1.4,与租户身份同风险模型):settings-schema 便携表刻意排除(file-store.ts 成文)——本地腿无此域文件,mapToServiceEffective 不投影;远端腿 verbatim 消费(applyEffective → config.projects)。",
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=effective-keys.js.map
|
|
@@ -4,11 +4,12 @@
|
|
|
4
4
|
* "universal internal schema → translate at the boundary" pattern, with our security boundary kept:
|
|
5
5
|
*
|
|
6
6
|
* (name history: this module tracks the control plane's product name, which has changed over time
|
|
7
|
-
* — registry → sema-web →
|
|
7
|
+
* — registry → sema-web → sema-web-admin (2026-08-26 repo/product rename; an earlier revision of
|
|
8
|
+
* this note listed "planned sema-admin" as the next step). The module itself keeps a neutral, product-name-free
|
|
8
9
|
* identifier ("config-center") and does not chase the rename.)
|
|
9
10
|
*
|
|
10
11
|
* - the CENTER owns the LOGICAL config: the model roster (names/capabilities/tier), the role map,
|
|
11
|
-
* and
|
|
12
|
+
* and collab (multi-agent discussion) templates;
|
|
12
13
|
* - the SERVICE env still owns the SECRETS: API keys stay in env (the center never stores a secret);
|
|
13
14
|
* keys are per-model via `apiKeyEnv` → `config.modelApiKeyEnv` → the spec's `getApiKeyAndHeaders`
|
|
14
15
|
* (core 1.45), so each model/cascade-rung authenticates with its own upstream key.
|
|
@@ -18,7 +19,7 @@
|
|
|
18
19
|
*
|
|
19
20
|
* Hot-reload status (复审 2026-07-29 P1-11 — 亲读判定,取代此处旧的 "models/roles are restart-to-apply"
|
|
20
21
|
* TODO, which went stale when `mutateInPlace` landed):
|
|
21
|
-
* - models/roles/roster/
|
|
22
|
+
* - models/roles/roster/collab/projects/autonomy — **HOT**. `applyEffective` mutates `config.models`/
|
|
22
23
|
* `config.roles` IN PLACE, and core's Runner reads `this.deps.models/roles` per task off that very
|
|
23
24
|
* reference. Both brains re-resolve `model.baseUrl || config.baseUrl` inside `buildRequest()` on every
|
|
24
25
|
* call (core 2.1.0 `brain/openai.js` + `brain/anthropic.js`), so a moved gateway takes effect on the
|
|
@@ -32,7 +33,7 @@
|
|
|
32
33
|
* gateway silently on the rate-limit path.
|
|
33
34
|
* - skills/mcp/scenarios/runtime-gates — restart-to-apply by construction (baked into the boot wiring).
|
|
34
35
|
*
|
|
35
|
-
* (
|
|
36
|
+
* ([ref] A13, internal-lossless) This module is now a FACADE: the implementation lives
|
|
36
37
|
* alongside it in `src/config-center/` split by responsibility group (HTTP client / EffectiveConfig
|
|
37
38
|
* application / restart-signal detection / skills+MCP consumption). Every symbol below is
|
|
38
39
|
* re-exported UNCHANGED — existing `from ".../config-center/facade.js"` imports need zero changes
|
|
@@ -40,7 +41,7 @@
|
|
|
40
41
|
* importers to update, which was done in the same commit.
|
|
41
42
|
*/
|
|
42
43
|
export { fetchEffective, fetchPrincipalCaps, fetchPrincipalOrgMemory, ConfigCenterHttpError, fetchSkillContent, fetchPromptArtifact, fetchPromptBlob, } from "./http-client.js";
|
|
43
|
-
export { mutateInPlace, applyEffective, type ApplyReport, applyRuntimeGates, applyRuntimeHot, resolveDefaultModelName, logEffectiveDiff,
|
|
44
|
+
export { mutateInPlace, applyEffective, type ApplyReport, applyRuntimeGates, applyRuntimeHot, resolveDefaultModelName, logEffectiveDiff, } from "./apply-effective.js";
|
|
44
45
|
export { restartReasons, planeHasActiveTiers, modelPlaneChanged, type RestartSlice, type RestartSliceCtx, type RestartSignal, } from "./restart-signal.js";
|
|
45
46
|
export { applyCenterSkills, resolveMcpServers, mcpForScenario, resolveA2aPeers, a2aForScenario } from "./skills-mcp.js";
|
|
46
47
|
export { applyCenterReadFace } from "./read-face.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { fetchEffective, fetchPrincipalCaps, fetchPrincipalOrgMemory, ConfigCenterHttpError, fetchSkillContent, fetchPromptArtifact, fetchPromptBlob, } from "./http-client.js";
|
|
2
|
-
export { mutateInPlace, applyEffective, applyRuntimeGates, applyRuntimeHot, resolveDefaultModelName, logEffectiveDiff,
|
|
2
|
+
export { mutateInPlace, applyEffective, applyRuntimeGates, applyRuntimeHot, resolveDefaultModelName, logEffectiveDiff, } from "./apply-effective.js";
|
|
3
3
|
export { restartReasons, planeHasActiveTiers, modelPlaneChanged, } from "./restart-signal.js";
|
|
4
4
|
export { applyCenterSkills, resolveMcpServers, mcpForScenario, resolveA2aPeers, a2aForScenario } from "./skills-mcp.js";
|
|
5
5
|
export { applyCenterReadFace } from "./read-face.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* [ref] —— **热键登记表**([ref] §4 机器门)。
|
|
3
3
|
*
|
|
4
4
|
* 一个键「是不是热的」在本仓有三个互相独立的说法:①代码里真的接了写入面;②测试里真的有黑盒断言;
|
|
5
5
|
* ③文档里对运维的承诺。三者任一漂了,受害者都是运维(改了配置,不知道该不该重启)。本表是**闭集单源**:
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* 但没接线」的条目正是本表要消灭的那种谎。
|
|
13
13
|
*/
|
|
14
14
|
import type { ServiceConfigFlat, ServiceConfigGroups } from "../config-types.js";
|
|
15
|
-
/** 换代手法(
|
|
15
|
+
/** 换代手法([ref] §2):A′=写入面接线(消费侧本就现读);B=值换代座位(对象已建、值被冻住)。 */
|
|
16
16
|
export type HotKeyForm = "A-prime" | "B-setter";
|
|
17
17
|
/** 三断言的用例 ID —— 与 test/config-hot 的参数化生成规则(`HK-<key>-<kind>`)逐字一致。 */
|
|
18
18
|
export interface HotKeyCases {
|
|
@@ -2,7 +2,7 @@ import { type EntitlementRuntimeCaps } from "@sema-agent/settings-schema";
|
|
|
2
2
|
import type { ScenarioRuling } from "../capabilities/scenarios.js";
|
|
3
3
|
import type { EffectiveConfig, ExecutionRuling } from "./types.js";
|
|
4
4
|
/** GET the effective config (Bearer + ETag). null = 304 (unchanged). Throws on transport/HTTP error, and on a
|
|
5
|
-
* payload that is not an effective config at all(非对象 / version 非有限数 / gate 域坏形——[
|
|
5
|
+
* payload that is not an effective config at all(非对象 / version 非有限数 / gate 域坏形——[ref] 裁B)。
|
|
6
6
|
* `domainErrors`:坏 catalog 域(schema default 已落)逐域单列——与本地腿 `FetchEffectiveResult` 同键同义,
|
|
7
7
|
* boot/refresh 的候选门直接消费。 */
|
|
8
8
|
export declare function fetchEffective(baseUrl: string, token: string, etag: string | undefined, fetchImpl?: typeof fetch, worker?: string): Promise<{
|
|
@@ -14,7 +14,7 @@ export declare function fetchEffective(baseUrl: string, token: string, etag: str
|
|
|
14
14
|
}>;
|
|
15
15
|
} | null>;
|
|
16
16
|
/**
|
|
17
|
-
*
|
|
17
|
+
* [ref] §K (core 1.157 `RunnerDeps.runtimeCapsResolver`) — GET the PER-PRINCIPAL runtime
|
|
18
18
|
* ENTITLEMENTS the engine enforces server-side, from center's `GET /api/config/effective?principal=&worker=`.
|
|
19
19
|
* Center pre-resolves the tighten-only intersection (fleet defaults ∩ tier ⊕ roles + overrides) and returns a
|
|
20
20
|
* `runtimeCaps` block — the service passes it through verbatim (no further tightening, per center's ruling).
|
|
@@ -42,7 +42,7 @@ export declare function fetchPrincipalCaps(baseUrl: string, token: string, princ
|
|
|
42
42
|
etag?: string;
|
|
43
43
|
} | null>;
|
|
44
44
|
/**
|
|
45
|
-
*
|
|
45
|
+
* [ref] 件A —— 读 `?principal=` 响应里的 org 记忆解析段(org 目录腿的取数口)。
|
|
46
46
|
*
|
|
47
47
|
* 🔬 **为什么不复用 {@link fetchPrincipalCaps}**(复审车 D-2 修):C3「两张表失败域互不干扰」是在档
|
|
48
48
|
* 裁定,registry-core 的 `PrincipalCapsWire` 也正是为此把 org 段留成 `unknown`(「在本 schema 里校验
|
|
@@ -75,10 +75,10 @@ export declare class ConfigCenterHttpError extends Error {
|
|
|
75
75
|
* the legacy `applyCenterSkills` path keeps treating every throw as "skip this skill, keep baseline".
|
|
76
76
|
*/
|
|
77
77
|
export declare function fetchSkillContent(baseUrl: string, token: string, contentHash: string, fetchImpl?: typeof fetch): Promise<string>;
|
|
78
|
-
/** [
|
|
78
|
+
/** [ref]b / [ref]① — §9.4 by-digest 补拉二函(fetchSkillContent 同姿势:HTTP+Bearer+8s 超时+
|
|
79
79
|
* 消费侧自证)。artifact=envelope JSON(验真=调用方过 core verifyPromptArtifact,canonical 重算——
|
|
80
80
|
* 本函数只做传输与形读,不超范围解释);blob=段文本 raw-byte(sha256 逐位自证,fetchSkillContent 同款)。
|
|
81
|
-
* digest 参数收带前缀/裸 hex 两形([
|
|
81
|
+
* digest 参数收带前缀/裸 hex 两形([ref] 参数口径)。 */
|
|
82
82
|
export declare function fetchPromptArtifact(baseUrl: string, token: string, artifactDigest: string, fetchImpl?: typeof fetch): Promise<unknown>;
|
|
83
83
|
export declare function fetchPromptBlob(baseUrl: string, token: string, contentDigest: string, fetchImpl?: typeof fetch): Promise<string>;
|
|
84
84
|
//# sourceMappingURL=http-client.d.ts.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* [ref](core 5.50 [ref] 提货件)—— mid-turn MCP 撤销台账:`RunnerDeps.mcpRevocations` 席的宿主实现。
|
|
3
3
|
*
|
|
4
4
|
* 语义(与 core 契约对表,types.d.ts `RunnerDeps.mcpRevocations` 注):
|
|
5
5
|
* · 权威单点在宿主 —— core 每次 MCP dispatch 前**同步**探 `isRevoked(serverName)`,从不缓存答案。
|
|
6
6
|
* · 本台账记「中心**曾发布为 enabled、后从 enabled 集移除**」的服务器名。MCP mount 是 boot-baked
|
|
7
7
|
* (`resolveMcpServers` 只在启动期跑),所以**删除向**在 5.50 前只能等 restart 才生效——这正是
|
|
8
|
-
*
|
|
8
|
+
* [ref] 要消的窗:治理面最要紧的动作(撤销一条对外通道)现在即时生效,restart 信号的
|
|
9
9
|
* 删除向豁免见 `restart-signal.ts` 的 mcp 特判(`mcpRevocationLive` 前提,fail-closed:席没接线
|
|
10
10
|
* 的部署保持旧的 restart 语义)。
|
|
11
11
|
* · **重现恢复是指纹判,不是名字判**(codex F1,confirmed):被撤的名字回到 enabled 集时,只有当
|
|
@@ -46,8 +46,10 @@ export declare function createMcpRevocationLedger(onChange?: (ev: {
|
|
|
46
46
|
}) => void): McpRevocationLedger;
|
|
47
47
|
/** 一拍 EffectiveConfig 的 ENABLED MCP 服务器条目表(`resolveMcpServers` 同判据:`enabled !== false`;
|
|
48
48
|
* 值=整条目的 key 排序 JSON 指纹,Map 插入序=发布序);mcp 域缺席 ⇒ `null`(台账不动)。
|
|
49
|
-
*
|
|
50
|
-
*
|
|
49
|
+
* 指纹序列化器 = restart-signal 的 `stableStringify`([ref] 2026-08-31 起同源:此前本文件持一份**逐字相同**的
|
|
50
|
+
* 私有复刻 `fingerprintOf`,两份在全部输入上字节恒等,合并零行为差,golden 钉 test/canonical-json-golden.test.ts)。
|
|
51
|
+
* 两处指纹仍只在各自域内自比、不跨域比对——同源只是去掉一份多余的复刻,不引入跨域约束;也**不**改用
|
|
52
|
+
* `src/canonical-json.ts`(undefined 值键语义不同,见 restart-signal.ts 该函数顶注)。 */
|
|
51
53
|
export declare function enabledMcpEntries(mcp: {
|
|
52
54
|
servers: Array<{
|
|
53
55
|
name: string;
|