@sema-agent/server 7.148.0 → 7.150.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 +551 -9
- package/README.md +17 -2
- package/README.zh-CN.md +5 -1
- package/USAGE.md +126 -68
- package/dist/adoption/wire.d.ts +3 -3
- package/dist/approval-card.d.ts +33 -33
- package/dist/approval-gate-currency.d.ts +1 -1
- package/dist/approval-leg-origin.d.ts +33 -0
- package/dist/approval-leg-origin.js +4 -0
- package/dist/audit.d.ts +1 -1
- package/dist/audit.js +2 -2
- package/dist/auth-bridge.d.ts +9 -1
- package/dist/auth-bridge.js +4 -4
- package/dist/auth-keys.d.ts +10 -1
- package/dist/auth-keys.js +8 -0
- package/dist/background-session-reap.d.ts +1 -1
- package/dist/boot/deferred-sandbox-path-env.d.ts +5 -3
- package/dist/boot/deferred-sandbox-path-env.js +1 -2
- package/dist/boot/execution-env.js +10 -11
- package/dist/boot/execution-lane.d.ts +6 -4
- package/dist/boot/execution-lane.js +3 -1
- package/dist/boot/org-delivery.d.ts +3 -2
- package/dist/boot/parked-revive-gate.d.ts +5 -5
- package/dist/boot/parked-revive-gate.js +2 -3
- package/dist/boot/resolve-spec.d.ts +4 -5
- package/dist/boot/resolve-spec.js +66 -28
- package/dist/boot/retention-lane.d.ts +1 -1
- package/dist/boot/runner-deps.js +3 -1
- package/dist/boot/session-faces.js +21 -21
- package/dist/boot/stage-01-config.d.ts +1 -0
- package/dist/boot/stage-01-config.js +4 -3
- package/dist/boot/stage-02-web-admin-pull.d.ts +1 -0
- package/dist/boot/stage-02-web-admin-pull.js +10 -2
- package/dist/boot/stage-03-store-backend.d.ts +1 -0
- package/dist/boot/stage-03-store-backend.js +4 -4
- package/dist/boot/stage-04-stores.d.ts +1 -0
- package/dist/boot/stage-05-execution-env.d.ts +1 -0
- package/dist/boot/stage-06-runners.d.ts +2 -1
- package/dist/boot/stage-06-runners.js +1 -2
- package/dist/boot/stage-07-capability-layer.d.ts +2 -1
- package/dist/boot/stage-07-capability-layer.js +1 -1
- package/dist/boot/stage-08-reapers.d.ts +2 -1
- package/dist/boot/stage-09-leader.d.ts +2 -1
- package/dist/boot/stage-10-http-server.d.ts +35 -2
- package/dist/boot/stage-10-http-server.js +9 -4
- package/dist/boot/stores.d.ts +3 -0
- package/dist/boot/stores.js +22 -19
- package/dist/boot/web-admin.d.ts +1 -1
- package/dist/capabilities/tool-defer.d.ts +1 -1
- package/dist/capability-facts.d.ts +70 -60
- package/dist/capability-facts.js +45 -49
- package/dist/card-settle-stored-scope.d.ts +56 -0
- package/dist/card-settle-stored-scope.js +27 -0
- package/dist/card-void.d.ts +7 -12
- package/dist/card-void.js +2 -7
- package/dist/config-catalog.d.ts +12 -0
- package/dist/config-catalog.js +37 -33
- package/dist/config-invariants.d.ts +5 -4
- package/dist/config-invariants.js +4 -4
- package/dist/config-types.d.ts +49 -16
- package/dist/config.d.ts +6 -5
- package/dist/config.js +35 -24
- package/dist/context-window-notice.d.ts +31 -0
- package/dist/context-window-notice.js +28 -0
- package/dist/deployment-governance.d.ts +7 -28
- package/dist/deployment-governance.js +1 -14
- package/dist/deployment-shape.d.ts +20 -11
- package/dist/deployment-shape.js +1 -0
- package/dist/device-ws-hub.d.ts +1 -0
- package/dist/device-ws-hub.js +64 -28
- package/dist/device-ws-protocol.d.ts +20 -6
- package/dist/device-ws-protocol.js +9 -2
- package/dist/engine-identity.d.ts +7 -1
- package/dist/engine-identity.js +5 -0
- package/dist/env-name-allowlist-knobs.d.ts +6 -5
- package/dist/env-name-allowlist-knobs.js +5 -0
- package/dist/execution-lane-caps.d.ts +20 -5
- package/dist/execution-lane-caps.js +18 -4
- package/dist/field-conflict.d.ts +2 -2
- package/dist/fleet/engine-signal.d.ts +14 -1
- package/dist/fleet/engine-signal.js +5 -1
- package/dist/fleet/fleet-reconciler.d.ts +1 -1
- package/dist/fleet/serving-lease.d.ts +18 -3
- package/dist/fleet/serving-lease.js +81 -35
- package/dist/fleet-client.d.ts +13 -11
- package/dist/fleet-client.js +53 -33
- package/dist/history-anchor.js +1 -1
- package/dist/hitl-delivery.d.ts +1 -3
- package/dist/hitl-delivery.js +1 -1
- package/dist/hooks/command-spawn.d.ts +7 -2
- package/dist/hooks/command-spawn.js +13 -6
- package/dist/hooks/hook-runner.d.ts +5 -0
- package/dist/hooks/hook-runner.js +11 -7
- package/dist/http/active-run-conflict.d.ts +3 -7
- package/dist/http/active-run-conflict.js +2 -2
- package/dist/http/admission.js +5 -5
- package/dist/http/approval-sweeps.js +5 -3
- package/dist/http/caller-trust.d.ts +2 -2
- package/dist/http/caller-trust.js +3 -3
- package/dist/http/checkpoint-ctx.d.ts +18 -63
- package/dist/http/checkpoint-ctx.js +1 -24
- package/dist/http/claim-heartbeat.d.ts +6 -6
- package/dist/http/claim-heartbeat.js +6 -6
- package/dist/http/claimed-run.d.ts +16 -9
- package/dist/http/claimed-run.js +8 -0
- package/dist/http/dispatch.js +7 -5
- package/dist/http/durable-run-leg.d.ts +8 -1
- package/dist/http/durable-run-leg.js +34 -15
- package/dist/http/execution-context.d.ts +115 -14
- package/dist/http/execution-context.js +130 -40
- package/dist/http/owner-access.d.ts +246 -21
- package/dist/http/owner-access.js +186 -8
- package/dist/http/principal-gate.d.ts +18 -11
- package/dist/http/principal-gate.js +3 -1
- package/dist/http/readiness.d.ts +4 -2
- package/dist/http/resume-ctx-read.d.ts +14 -3
- package/dist/http/resume-ctx-read.js +24 -3
- package/dist/http/resume-legs.d.ts +35 -3
- package/dist/http/resume-legs.js +262 -106
- package/dist/http/route-ctx.d.ts +29 -11
- package/dist/http/routes/a2a-serve.js +17 -14
- package/dist/http/routes/approvals-assistant.d.ts +3 -2
- package/dist/http/routes/approvals-assistant.js +11 -11
- package/dist/http/routes/capabilities.js +5 -4
- package/dist/http/routes/config-catalog.d.ts +1 -1
- package/dist/http/routes/diagnostics.d.ts +3 -1
- package/dist/http/routes/diagnostics.js +30 -5
- package/dist/http/routes/mcp-reconnect.js +2 -2
- package/dist/http/routes/memory-origin.d.ts +1 -1
- package/dist/http/routes/notify-wake.js +2 -3
- package/dist/http/routes/principal-inbox.d.ts +3 -1
- package/dist/http/routes/principal-inbox.js +3 -2
- package/dist/http/routes/projects.d.ts +1 -0
- package/dist/http/routes/projects.js +5 -3
- package/dist/http/routes/retention-ops.d.ts +1 -1
- package/dist/http/routes/run-permission-mode.d.ts +1 -1
- package/dist/http/routes/run-permission-mode.js +2 -2
- package/dist/http/routes/runs.d.ts +1 -1
- package/dist/http/routes/runs.js +33 -37
- package/dist/http/routes/session-memory-sync.js +4 -5
- package/dist/http/routes/session-sync.d.ts +24 -5
- package/dist/http/routes/session-sync.js +45 -37
- package/dist/http/routes/sessions-list.d.ts +1 -1
- package/dist/http/routes/sessions.d.ts +1 -1
- package/dist/http/routes/sessions.js +18 -44
- package/dist/http/routes/tasks.js +136 -101
- package/dist/http/routes/trace-usage.js +14 -14
- package/dist/http/routes/workflows.d.ts +1 -0
- package/dist/http/routes/workflows.js +20 -38
- package/dist/http/server.d.ts +12 -9
- package/dist/http/server.js +35 -6
- package/dist/http/stored-body-replay.d.ts +3 -24
- package/dist/http/stored-body-replay.js +2 -12
- package/dist/http/submit-ctx.d.ts +2 -2
- package/dist/http/submit-ctx.js +5 -5
- package/dist/http/submit-replay.d.ts +15 -2
- package/dist/http/submit-replay.js +10 -4
- package/dist/http/wire-types.d.ts +6 -3
- package/dist/index.d.ts +3 -1
- package/dist/index.js +1 -0
- package/dist/leader/endpoint.js +9 -8
- package/dist/leg-facts.d.ts +13 -2
- package/dist/leg-facts.js +2 -0
- package/dist/local-store-declaration.d.ts +54 -0
- package/dist/local-store-declaration.js +59 -0
- package/dist/mcp-assertion-header.d.ts +1 -1
- package/dist/mcp-assertion-header.js +1 -1
- package/dist/mcp-authorization-face.d.ts +18 -14
- package/dist/mcp-authorization-face.js +3 -2
- package/dist/memory-project-layer.js +1 -1
- package/dist/memory-scope.d.ts +4 -4
- package/dist/memory-scope.js +4 -4
- package/dist/memory-store-refusal.d.ts +1 -1
- package/dist/memory-sync-client.js +2 -2
- package/dist/model-context-window.d.ts +50 -11
- package/dist/model-context-window.js +20 -1
- package/dist/model-entry-refusal.d.ts +5 -4
- package/dist/model-entry-refusal.js +17 -3
- package/dist/model-reach-scope.d.ts +2 -1
- package/dist/observability/corrupt-read-seat.d.ts +1 -1
- package/dist/observability/fail-open.d.ts +19 -7
- package/dist/observability/fail-open.js +19 -7
- package/dist/observability/logger.d.ts +7 -0
- package/dist/observability/logger.js +3 -1
- package/dist/observability/metrics.js +1 -1
- package/dist/observability/run-terminal.d.ts +1 -1
- package/dist/observability/run-terminal.js +1 -0
- package/dist/observability/secret-env-scrub.d.ts +1 -1
- package/dist/observability/secret-env-scrub.js +1 -1
- package/dist/org-delivery-gate.d.ts +31 -6
- package/dist/org-delivery-gate.js +7 -4
- package/dist/owner-faces.d.ts +30 -5
- package/dist/owner-faces.js +2 -0
- package/dist/park-row-commit.d.ts +67 -0
- package/dist/park-row-commit.js +76 -0
- package/dist/parked-decide.d.ts +9 -7
- package/dist/parked-decide.js +25 -6
- package/dist/peer-directory.d.ts +1 -1
- package/dist/peer-seat.d.ts +1 -1
- package/dist/peer-seat.js +52 -59
- package/dist/plugins/adoption-log-sql.d.ts +3 -3
- package/dist/plugins/adoption-log-sql.js +19 -19
- package/dist/plugins/approval-ask-store-sql.d.ts +1 -1
- package/dist/plugins/approval-ask-store-sql.js +3 -5
- package/dist/plugins/approval-exemption-skill-cutoff.d.ts +64 -0
- package/dist/plugins/approval-exemption-skill-cutoff.js +122 -0
- package/dist/plugins/approval-exemption-skill-m46.d.ts +0 -6
- package/dist/plugins/approval-exemption-skill-m46.js +6 -10
- package/dist/plugins/approval-exemption-store.d.ts +26 -1
- package/dist/plugins/approval-exemption-store.js +28 -19
- package/dist/plugins/ensure-schema-lock-policy.d.ts +36 -3
- package/dist/plugins/ensure-schema-lock-policy.js +75 -9
- package/dist/plugins/exec-path-law.d.ts +34 -0
- package/dist/plugins/exec-path-law.js +13 -0
- package/dist/plugins/file-run-store.d.ts +22 -9
- package/dist/plugins/file-run-store.js +51 -23
- package/dist/plugins/local-checkpoint-store.d.ts +8 -1
- package/dist/plugins/local-checkpoint-store.js +5 -1
- package/dist/plugins/local-data-root-admission.d.ts +52 -0
- package/dist/plugins/local-data-root-admission.js +100 -0
- package/dist/plugins/local-engine-high-water.d.ts +28 -7
- package/dist/plugins/local-engine-high-water.js +27 -22
- package/dist/plugins/local-session-store.d.ts +134 -49
- package/dist/plugins/local-session-store.js +149 -108
- package/dist/plugins/memory-run-store.d.ts +14 -9
- package/dist/plugins/memory-run-store.js +48 -22
- package/dist/plugins/one-time-migration-marker.d.ts +19 -3
- package/dist/plugins/one-time-migration-marker.js +7 -1
- package/dist/plugins/one-time-migrations.d.ts +110 -59
- package/dist/plugins/one-time-migrations.js +224 -136
- package/dist/plugins/org-delivery-quota-store.d.ts +34 -11
- package/dist/plugins/org-delivery-quota-store.js +29 -14
- package/dist/plugins/permission-rule-store-sql.d.ts +1 -1
- package/dist/plugins/permission-rule-store-sql.js +5 -9
- package/dist/plugins/pg-pool.d.ts +1 -1
- package/dist/plugins/pg-pool.js +14 -12
- package/dist/plugins/posix-shell-fs.js +4 -2
- package/dist/plugins/remote-env-adb.js +3 -2
- package/dist/plugins/remote-env-device.d.ts +3 -2
- package/dist/plugins/remote-env-device.js +8 -6
- package/dist/plugins/remote-env-e2b.d.ts +4 -8
- package/dist/plugins/remote-env-e2b.js +21 -15
- package/dist/plugins/remote-env-host.d.ts +51 -10
- package/dist/plugins/remote-env-host.js +97 -31
- package/dist/plugins/remote-env-k8s.js +7 -4
- package/dist/plugins/remote-env-local-docker.d.ts +6 -3
- package/dist/plugins/remote-env-local-docker.js +11 -25
- package/dist/plugins/remote-env-ssh.js +4 -3
- package/dist/plugins/remote-shell.d.ts +3 -1
- package/dist/plugins/remote-shell.js +3 -3
- package/dist/plugins/replica-registration.d.ts +35 -0
- package/dist/plugins/replica-registration.js +48 -0
- package/dist/plugins/retention-lane-store-sql.d.ts +1 -1
- package/dist/plugins/run-store-sql.d.ts +27 -8
- package/dist/plugins/run-store-sql.js +46 -18
- package/dist/plugins/scenario-prefix-switch-m42.d.ts +8 -12
- package/dist/plugins/scenario-prefix-switch-m42.js +9 -6
- package/dist/plugins/schema-consistency.d.ts +91 -5
- package/dist/plugins/schema-consistency.js +189 -7
- package/dist/plugins/schema-drift-sentence.d.ts +6 -5
- package/dist/plugins/schema-drift-sentence.js +13 -5
- package/dist/plugins/serving-requirement.d.ts +49 -0
- package/dist/plugins/serving-requirement.js +53 -0
- package/dist/plugins/session-placement.d.ts +5 -4
- package/dist/plugins/shell-sentinel-owner-m48.d.ts +22 -0
- package/dist/plugins/shell-sentinel-owner-m48.js +6 -0
- package/dist/plugins/stop-then-start-sentence.d.ts +55 -0
- package/dist/plugins/stop-then-start-sentence.js +51 -0
- package/dist/plugins/store-backend.d.ts +23 -9
- package/dist/plugins/store-backend.js +58 -24
- package/dist/plugins/store-contracts.d.ts +45 -5
- package/dist/plugins/store-contracts.js +19 -0
- package/dist/plugins/tidb-pool.d.ts +11 -6
- package/dist/plugins/tidb-pool.js +22 -12
- package/dist/plugins/workspace-custody.d.ts +44 -0
- package/dist/plugins/workspace-custody.js +47 -0
- package/dist/process-instance.d.ts +3 -0
- package/dist/process-instance.js +7 -0
- package/dist/project-context.d.ts +66 -0
- package/dist/project-context.js +70 -0
- package/dist/project-identity.d.ts +8 -7
- package/dist/project-identity.js +40 -17
- package/dist/project-layer-key.d.ts +13 -2
- package/dist/project-layer-key.js +9 -1
- package/dist/question.d.ts +9 -21
- package/dist/question.js +28 -19
- package/dist/read-deny-floor-notice.d.ts +36 -0
- package/dist/read-deny-floor-notice.js +40 -0
- package/dist/{plain-string-record.d.ts → request-declaration-disposition.d.ts} +9 -23
- package/dist/request-declaration-disposition.js +39 -0
- package/dist/run-cancel-card.d.ts +28 -0
- package/dist/run-cancel-card.js +20 -0
- package/dist/run-cancel-context.d.ts +10 -0
- package/dist/run-cancel-context.js +1 -0
- package/dist/run-local.js +28 -13
- package/dist/runs.d.ts +31 -7
- package/dist/runs.js +34 -16
- package/dist/security.d.ts +3 -3
- package/dist/server-secret-env.d.ts +34 -20
- package/dist/server-secret-env.js +61 -18
- package/dist/session-agent.d.ts +4 -12
- package/dist/session-agent.js +0 -6
- package/dist/session-children-retire.d.ts +6 -3
- package/dist/session-children-retire.js +2 -5
- package/dist/session-incarnation.d.ts +18 -4
- package/dist/session-incarnation.js +4 -1
- package/dist/session-notify-door.d.ts +4 -4
- package/dist/session-notify-door.js +5 -6
- package/dist/session-rules-seat.d.ts +4 -3
- package/dist/session-rules-seat.js +3 -11
- package/dist/session-sync.js +3 -3
- package/dist/session-workspace.d.ts +3 -3
- package/dist/store-admission.d.ts +33 -0
- package/dist/store-admission.js +49 -0
- package/dist/store-posture.d.ts +5 -0
- package/dist/store-posture.js +18 -1
- package/dist/stores-sql/checkpoint-store-sql.d.ts +22 -3
- package/dist/stores-sql/checkpoint-store-sql.js +109 -23
- package/dist/stores-sql/file-history-store-sql.d.ts +1 -1
- package/dist/stores-sql/file-history-store-sql.js +3 -5
- package/dist/stores-sql/retention-store-sql.d.ts +1 -1
- package/dist/stores-sql/tool-result-store-sql.d.ts +1 -1
- package/dist/stores-sql/tool-result-store-sql.js +4 -6
- package/dist/task-a2a.d.ts +3 -8
- package/dist/task-a2a.js +25 -27
- package/dist/task-cwd.d.ts +27 -10
- package/dist/task-cwd.js +3 -0
- package/dist/task-mcp.d.ts +3 -3
- package/dist/task-mcp.js +1 -1
- package/dist/task-settings.d.ts +13 -0
- package/dist/task-settings.js +14 -7
- package/dist/terminal.d.ts +2 -0
- package/dist/terminal.js +21 -6
- package/dist/tool-approval.d.ts +50 -41
- package/dist/tool-approval.js +96 -73
- package/dist/trace/engine-notice-wire.d.ts +38 -21
- package/dist/trace/engine-notice-wire.js +25 -4
- package/dist/trace/ledger-sink.d.ts +3 -1
- package/dist/trace/project.d.ts +8 -5
- package/dist/trace/project.js +11 -9
- package/dist/trace/projection-table.d.ts +33 -2
- package/dist/trace/redact.d.ts +12 -0
- package/dist/trace/redact.js +5 -1
- package/dist/trace/self-minted-wire.d.ts +268 -56
- package/dist/trace/self-minted-wire.js +110 -40
- package/dist/trace/tool-card.d.ts +3 -0
- package/dist/trace/tool-card.js +24 -0
- package/dist/trace/tool-output-media.d.ts +2 -1
- package/dist/unattended-permission-mode.d.ts +1 -1
- package/dist/web-admin-client/apply-effective.d.ts +1 -1
- package/dist/web-admin-client/apply-effective.js +22 -9
- package/dist/web-admin-client/effective-keys.d.ts +1 -1
- package/dist/web-admin-client/skills-mcp.d.ts +1 -1
- package/docs/DEVICE-EXECUTOR-PROTOCOL.md +57 -29
- package/docs/error-text-lexicon.json +317 -0
- package/package.json +4 -2
- package/scripts/embed-minimal.mjs +183 -0
- package/wire-changes/server@7.149.0.json +372 -0
- package/wire-changes/server@7.150.0.json +335 -0
- package/dist/plain-string-record.js +0 -70
package/dist/config.d.ts
CHANGED
|
@@ -235,22 +235,23 @@ export declare function configKnobTable(): ConfigKnobRecord[];
|
|
|
235
235
|
export declare const hostBackgroundShellEnabled: () => boolean;
|
|
236
236
|
/** The `host` exec lane's spool-file stdio form; false ⇒ the pre-1.226 pipe fallback (read per exec). */
|
|
237
237
|
export declare const hostExecSpoolEnabled: () => boolean;
|
|
238
|
-
/** 名单在活配置里的落点(
|
|
239
|
-
export type EnvNameAllowlistSeats = Pick<ServiceConfig, "lspEnvAllow" | "remoteExec">;
|
|
238
|
+
/** 名单在活配置里的落点(服务进程五只旋钮;bake-runner 那只在它自己的进程里,不在 `ServiceConfig`)。 */
|
|
239
|
+
export type EnvNameAllowlistSeats = Pick<ServiceConfig, "lspEnvAllow" | "hookEnvAllow" | "remoteExec">;
|
|
240
240
|
/**
|
|
241
241
|
* 沙箱名单(表列 `channel: "sandbox-grant"` 的服务侧旋钮,表派生)此刻交出去的名 —— 起服行 `remote_exec_enabled.sandboxEnvKeys` 读它(`boot/execution-env.ts`,
|
|
242
242
|
* 排序后只出键名)。只有被选中车道的那一只有落点;e2b / k8s 报的是名单点到的键,不含 `SANDBOX_PKG_SOURCE` 推导出的包源变量(那一组是区域常量,装配点另并)。
|
|
243
243
|
*/
|
|
244
244
|
export declare function sandboxEnvNamesInForce(seats: EnvNameAllowlistSeats): readonly string[];
|
|
245
|
-
/** 声明增长后重判的一处命中:哪只旋钮、它交出去的哪个名、判官的拒因({@link
|
|
245
|
+
/** 声明增长后重判的一处命中:哪只旋钮、它交出去的哪个名、判官的拒因({@link ownCredentialProblem} 那一句,只回显名)。 */
|
|
246
246
|
export interface OwnCredentialInForce {
|
|
247
247
|
readonly knob: ServerEnvNameAllowlistKnob;
|
|
248
248
|
readonly name: string;
|
|
249
249
|
readonly problem: string;
|
|
250
250
|
}
|
|
251
251
|
/**
|
|
252
|
-
* 解析器头注 ② 那条不变量在**声明增长**那一刻的半边:对活配置里每只名单此刻交出去的名问**同一只**判官({@link
|
|
253
|
-
* `
|
|
252
|
+
* 解析器头注 ② 那条不变量在**声明增长**那一刻的半边:对活配置里每只名单此刻交出去的名问**同一只**判官({@link ownCredentialProblem} → `ownCredentialVariable`,
|
|
253
|
+
* 读引擎此刻的声明:增长并进的名,与增长并进的值 —— 新条目 `apiKeyEnv` 的值等于名单交出去的某个变量的值,同样命中)。读活配置的落点(名单是起服输入;
|
|
254
|
+
* 解析那一刻已判过形与当时的声明)。返回每一处命中,空 = 不相交。
|
|
254
255
|
* 调用点只有一处 = 声明增长的那一处(`apply-effective.ts` 的换代声明,真声明之后、席位换装之前)。
|
|
255
256
|
*/
|
|
256
257
|
export declare function ownCredentialHitsInForce(seats: EnvNameAllowlistSeats): OwnCredentialInForce[];
|
package/dist/config.js
CHANGED
|
@@ -4,9 +4,9 @@ import { DEFAULT_AT_MENTION, DEFAULT_MODEL_REF, mintCapabilityKeys } from "./mod
|
|
|
4
4
|
import { homedir } from "node:os";
|
|
5
5
|
import { isAbsolute, join, posix as posixPath } from "node:path";
|
|
6
6
|
import { fileURLToPath } from "node:url";
|
|
7
|
-
import { hostOfUrl, HOST_UNREADABLE_SENTENCE, compileAllowList,
|
|
7
|
+
import { hostOfUrl, HOST_UNREADABLE_SENTENCE, compileAllowList, BUILTIN_COMPLIANCE_DENIES, COMPLIANCE_CAPABILITIES, CROSS_SESSION_INBOUND_SETTINGS, CROSS_SESSION_DIALOG_EXPIRY_VALUES, compileReadDeny, resolveReadDenyBuiltins, isModelPriced, PROTOCOL_TABLE, RECOMMENDED_SENSITIVE_PATTERNS, judgeRuleToolName, resolveFileHistoryRetention, resolveLockedKeys, validatePermissionRules, WRITE_PROTECTED_DEFAULT_TABLE, resolveWriteProtectedTable, principalInboxConsumerOf, carriesCredential, isReplicableScope, resolveBashTimeoutCaps } from "@sema-agent/core";
|
|
8
8
|
import { ROSTER_PRIMARY_ROLES, ROSTER_CHEAP_ROLES, WEB_ADMIN_ENV, retiredEnvRefusal, stripControlAndBidi } from "@sema-agent/settings-schema";
|
|
9
|
-
import { parseApprovalHmacKeys, parsePrincipalJwks } from "./auth-keys.js";
|
|
9
|
+
import { parseApprovalHmacKeys, parsePrincipalJwks, parseServiceAuthTokens } from "./auth-keys.js";
|
|
10
10
|
import { DEFAULT_ELICITATION_THROTTLE } from "./elicitation.js";
|
|
11
11
|
import { buildRuleListJudgeOptions } from "./permission-rule-list.js";
|
|
12
12
|
import { isV2ScopeKey, memoryReplicationCoverage, replicatesProjectLayersOf } from "./memory-scope.js";
|
|
@@ -27,7 +27,7 @@ import { resolveLocalDataRoot } from "./local-data-root.js";
|
|
|
27
27
|
import { buildWriteProtectionPosture } from "./write-protection.js";
|
|
28
28
|
import { RUN_STALE_SEC_DEFAULT } from "./run-stale-default.js";
|
|
29
29
|
import { normalizeSshFingerprint } from "./ssh-host-key.js";
|
|
30
|
-
import {
|
|
30
|
+
import { resolveContextWindow } from "./model-context-window.js";
|
|
31
31
|
import { MODEL_THINKING_LEVELS, THINKING_LEVELS, THINKING_FORMATS, buildModelCompat, isModelThinkingLevel, isThinkingFormat, isThinkingTier } from "./model-compat.js";
|
|
32
32
|
import {} from "./posture-source.js";
|
|
33
33
|
import { COST_QUOTA_WINDOW_SEC_RANGE, costQuotaWindowSecInRange } from "./observability/cost-quota.js";
|
|
@@ -41,6 +41,7 @@ import { laneLivenessOf } from "./exec-bounds.js";
|
|
|
41
41
|
import { SANDBOX_IPV6_DEFAULT, SANDBOX_IPV6_WORDS } from "./sandbox-egress-policy.js";
|
|
42
42
|
import { WORKSPACE_CACHE_DEFAULT, WORKSPACE_CACHE_MOUNT_DEFAULT, WORKSPACE_CACHE_MOUNT_RESERVED, WORKSPACE_CACHE_SIZE_DEFAULT, WORKSPACE_CACHE_WORDS, isK8sQuantity, mountsOverlap, reservedMountCollision } from "./workspace-cache.js";
|
|
43
43
|
import { DEPLOYMENT_SHAPE_PREDICATES } from "./deployment-shape.js";
|
|
44
|
+
import { parseLocalStoreDurabilityWord } from "./local-store-declaration.js";
|
|
44
45
|
import { sandboxForwardedEnvOf } from "./execution-config-root.js";
|
|
45
46
|
import { SANDBOX_READ_FLOOR_DEFAULT, SANDBOX_READ_FLOOR_WORDS, laneMissingEnv, readDeclaredLaneTable } from "./execution-lane-caps.js";
|
|
46
47
|
import { MEMORY_ENGINE_BACKENDS, SESSION_BACKENDS, STORE_BACKENDS } from "@sema-agent/settings-schema/execution-lanes";
|
|
@@ -61,7 +62,7 @@ import { echoCallerText } from "./caller-text-echo.js";
|
|
|
61
62
|
import { PRINCIPAL_MAX_BYTES, principalShapeProblem } from "./principal-shape.js";
|
|
62
63
|
import { buildDisplaySafeUrl, redactSecrets } from "./trace/redact.js";
|
|
63
64
|
import { parseConfigLocalOwnerUid } from "./config-dir-trust.js";
|
|
64
|
-
import { allowlistedEnv, ownCredentialDeclarationRefusal } from "./server-secret-env.js";
|
|
65
|
+
import { allowlistedEnv, ownCredentialDeclarationRefusal, ownCredentialVariable } from "./server-secret-env.js";
|
|
65
66
|
import { ENV_NAME_ALLOWLIST_KNOBS, ENV_NAME_ALLOWLIST_KNOB_NAMES, describeAllowlistPostures } from "./env-name-allowlist-knobs.js";
|
|
66
67
|
import { APPROVAL_ASK_RETENTION_DEFAULT_MS, APPROVAL_ASK_RETENTION_FLOOR_MS } from "./approval-ask-retention.js";
|
|
67
68
|
import { parseModsDeclaration } from "./mods-declaration.js";
|
|
@@ -565,14 +566,18 @@ const OWN_CREDENTIAL_HANDOFF = {
|
|
|
565
566
|
"host-put-back": { where: "a put-back list hands the named variable back, as written, to the child the engine withheld it from", whom: "that child" },
|
|
566
567
|
"sandbox-grant": { where: "a sandbox list puts the named variable, as written, into a sandbox the model can read", whom: "the sandbox" },
|
|
567
568
|
};
|
|
568
|
-
function
|
|
569
|
-
|
|
569
|
+
function ownCredentialProblem(name, channel) {
|
|
570
|
+
const held = ownCredentialVariable(name);
|
|
571
|
+
if (held === undefined)
|
|
570
572
|
return undefined;
|
|
571
573
|
const { where, whom } = OWN_CREDENTIAL_HANDOFF[channel];
|
|
572
|
-
|
|
574
|
+
const copy = held === "value" ? "a copy under another name (its value is one of this service's credentials); " : "";
|
|
575
|
+
const engine = held === "name" ? "the engine refuses it on any allow list" : "the engine withholds it from every child";
|
|
576
|
+
return `this deployment's own credential — ${copy}${where}; give ${whom} a credential of its own (another name and another value) and list that name instead (${engine})`;
|
|
573
577
|
}
|
|
574
578
|
const NAMES_IN_FORCE = {
|
|
575
579
|
LSP_ENV_ALLOW: (c) => c.lspEnvAllow,
|
|
580
|
+
HOOK_ENV_ALLOW: (c) => c.hookEnvAllow,
|
|
576
581
|
E2B_SANDBOX_ENV: (c) => (c.remoteExec.provider === "e2b" ? Object.keys(sandboxForwardedEnvOf(c)) : []),
|
|
577
582
|
K8S_SANDBOX_ENV: (c) => (c.remoteExec.provider === "k8s" ? Object.keys(sandboxForwardedEnvOf(c)) : []),
|
|
578
583
|
DOCKER_SANDBOX_ENV: (c) => (c.remoteExec.provider === "local-docker" ? Object.keys(sandboxForwardedEnvOf(c)) : []),
|
|
@@ -583,7 +588,7 @@ export function sandboxEnvNamesInForce(seats) {
|
|
|
583
588
|
}
|
|
584
589
|
export function ownCredentialHitsInForce(seats) {
|
|
585
590
|
return SERVER_ENV_NAME_ALLOWLIST_KNOBS.flatMap((knob) => NAMES_IN_FORCE[knob](seats).flatMap((name) => {
|
|
586
|
-
const problem =
|
|
591
|
+
const problem = ownCredentialProblem(name, ENV_NAME_ALLOWLIST_KNOBS[knob].channel);
|
|
587
592
|
return problem === undefined ? [] : [{ knob, name, problem }];
|
|
588
593
|
}));
|
|
589
594
|
}
|
|
@@ -600,7 +605,7 @@ export function parseEnvNameAllowlist(knob, singleUserTurnkey) {
|
|
|
600
605
|
? 'not an environment-variable name (letters, digits and "_", not starting with a digit)'
|
|
601
606
|
: ENV_NAME_ALLOWLIST_KNOB_NAMES.has(seg.toUpperCase())
|
|
602
607
|
? `the name of a name-list knob (${[...ENV_NAME_ALLOWLIST_KNOB_NAMES].join(" / ")}: their raw text is withheld from every child process and sandbox; naming one would put that text back)`
|
|
603
|
-
:
|
|
608
|
+
: ownCredentialProblem(seg, spec.channel);
|
|
604
609
|
if (problem === undefined)
|
|
605
610
|
return;
|
|
606
611
|
throw new Error(`env ${knob}: entry #${i + 1} of ${segments.length} is ${problem}` +
|
|
@@ -762,6 +767,7 @@ function optionalEnumKey(key, envName, raw, allowed) {
|
|
|
762
767
|
}
|
|
763
768
|
return { [key]: raw };
|
|
764
769
|
}
|
|
770
|
+
const PRINCIPAL_INBOX_ECHO_CHARS = 96;
|
|
765
771
|
function principalInboxAssistantKey(raw) {
|
|
766
772
|
if (raw === undefined || raw === "")
|
|
767
773
|
return {};
|
|
@@ -769,7 +775,9 @@ function principalInboxAssistantKey(raw) {
|
|
|
769
775
|
principalInboxConsumerOf({ principalInboxConsumer: { assistant: raw } });
|
|
770
776
|
}
|
|
771
777
|
catch (err) {
|
|
772
|
-
|
|
778
|
+
const shown = JSON.stringify(raw.length > PRINCIPAL_INBOX_ECHO_CHARS ? `${raw.slice(0, PRINCIPAL_INBOX_ECHO_CHARS)}…` : raw);
|
|
779
|
+
throw new Error(`env PRINCIPAL_INBOX_ASSISTANT must name the agent handle that consumes the principal inbox, or be unset or the empty string for no cross-principal delivery (a blank value is neither — whitespace is not "empty"): ` +
|
|
780
|
+
`the value ${shown} is refused — ${err instanceof Error ? err.message : String(err)}`);
|
|
773
781
|
}
|
|
774
782
|
return { principalInboxAssistant: raw };
|
|
775
783
|
}
|
|
@@ -975,6 +983,7 @@ function parseStoreDomain(ctx) {
|
|
|
975
983
|
return raw;
|
|
976
984
|
})()),
|
|
977
985
|
runStoreStrictHydrate: parseRunStoreStrictHydrate(process.env.RUN_STORE_STRICT_HYDRATE),
|
|
986
|
+
localStoreDurability: parseLocalStoreDurabilityWord(process.env.LOCAL_STORE_DURABILITY),
|
|
978
987
|
tidb: needsDb && dbBackend === "mysql"
|
|
979
988
|
? {
|
|
980
989
|
host: env("MYSQL_HOST"),
|
|
@@ -1085,7 +1094,7 @@ function parseModelDomain() {
|
|
|
1085
1094
|
});
|
|
1086
1095
|
const envCompat = envApi === "openai-completions" ? envCompatDeclared : undefined;
|
|
1087
1096
|
const modelCapability = { reasoning: parseBoolWord("MODEL_REASONING", process.env.MODEL_REASONING), vision: parseBoolWord("MODEL_VISION", process.env.MODEL_VISION) };
|
|
1088
|
-
const
|
|
1097
|
+
const mainWindow = resolveContextWindow(optNumEnvStrict("MODEL_CONTEXT_WINDOW"));
|
|
1089
1098
|
const model = {
|
|
1090
1099
|
id: modelId,
|
|
1091
1100
|
name: modelId,
|
|
@@ -1099,10 +1108,10 @@ function parseModelDomain() {
|
|
|
1099
1108
|
cacheRead: costEnv("MODEL_COST_CACHE_READ", "unset"),
|
|
1100
1109
|
cacheWrite: costEnv("MODEL_COST_CACHE_WRITE", "unset"),
|
|
1101
1110
|
}, undefined)),
|
|
1102
|
-
contextWindow,
|
|
1111
|
+
contextWindow: mainWindow.window,
|
|
1103
1112
|
maxTokens: process.env.MODEL_MAX_TOKENS !== undefined && process.env.MODEL_MAX_TOKENS !== ""
|
|
1104
1113
|
? parseNumOrFail("MODEL_MAX_TOKENS", process.env.MODEL_MAX_TOKENS)
|
|
1105
|
-
: Math.min(32000,
|
|
1114
|
+
: Math.min(32000, mainWindow.window),
|
|
1106
1115
|
...(optFinitePositiveEnv("MODEL_CHARS_PER_TOKEN") !== undefined ? { charsPerToken: optFinitePositiveEnv("MODEL_CHARS_PER_TOKEN") } : {}),
|
|
1107
1116
|
params: { promptCacheFamily: envLaneWire.promptCacheFamily },
|
|
1108
1117
|
...(thinkingDefault ? { defaultThinking: thinkingDefault } : {}),
|
|
@@ -1138,6 +1147,8 @@ function parseModelDomain() {
|
|
|
1138
1147
|
break;
|
|
1139
1148
|
}
|
|
1140
1149
|
const cheapMintedId = mintedCheapId(cheapSlot);
|
|
1150
|
+
const cheapDeclaredWindow = cheapMintedId === undefined ? undefined : optNumEnvStrict("MODEL_CHEAP_CONTEXT_WINDOW");
|
|
1151
|
+
const cheapWindow = resolveContextWindow(cheapDeclaredWindow, mainWindow);
|
|
1141
1152
|
const cheapModel = cheapMintedId !== undefined
|
|
1142
1153
|
? {
|
|
1143
1154
|
...model,
|
|
@@ -1150,7 +1161,7 @@ function parseModelDomain() {
|
|
|
1150
1161
|
cacheRead: costEnv("MODEL_CHEAP_COST_CACHE_READ", "declares-zero"),
|
|
1151
1162
|
cacheWrite: costEnv("MODEL_CHEAP_COST_CACHE_WRITE", "declares-zero"),
|
|
1152
1163
|
}, model.cost)),
|
|
1153
|
-
contextWindow:
|
|
1164
|
+
contextWindow: cheapWindow.window,
|
|
1154
1165
|
maxTokens: numEnvOr("MODEL_CHEAP_MAX_TOKENS", model.maxTokens),
|
|
1155
1166
|
...(optFinitePositiveEnv("MODEL_CHEAP_CHARS_PER_TOKEN") !== undefined ? { charsPerToken: optFinitePositiveEnv("MODEL_CHEAP_CHARS_PER_TOKEN") } : {}),
|
|
1156
1167
|
}
|
|
@@ -1172,7 +1183,7 @@ function parseModelDomain() {
|
|
|
1172
1183
|
if (cheapModel) {
|
|
1173
1184
|
const cheapAct = optFinitePositiveEnv("MODEL_CHEAP_AUTO_COMPACT_TOKENS");
|
|
1174
1185
|
if (applyAutoCompactWindow(cheapModel, cheapAct) === "removed-1m") {
|
|
1175
|
-
const inherited =
|
|
1186
|
+
const inherited = cheapDeclaredWindow === undefined;
|
|
1176
1187
|
CONFIG_NOTICES.push({
|
|
1177
1188
|
level: "warn",
|
|
1178
1189
|
event: "auto_compact_window_not_derived_1m",
|
|
@@ -1186,6 +1197,7 @@ function parseModelDomain() {
|
|
|
1186
1197
|
noticeAutoCompactAboveWindow("cheap", "MODEL_CHEAP_AUTO_COMPACT_TOKENS", cheapModel);
|
|
1187
1198
|
}
|
|
1188
1199
|
const models = envLaneTable(modelId, model, cheapModel);
|
|
1200
|
+
const contextWindowSources = Object.fromEntries(Object.entries(envLaneTable(modelId, { id: model.id, source: mainWindow.source }, cheapModel !== undefined ? { id: cheapModel.id, source: cheapWindow.source } : undefined)).map(([name, slot]) => [name, slot.source]));
|
|
1189
1201
|
const gatewayApiKey = route.gatewayApiKey;
|
|
1190
1202
|
if (gatewayBaseUrl === undefined && declaredCredential(gatewayApiKey) !== undefined) {
|
|
1191
1203
|
CONFIG_NOTICES.push({
|
|
@@ -1241,7 +1253,9 @@ function parseModelDomain() {
|
|
|
1241
1253
|
},
|
|
1242
1254
|
model,
|
|
1243
1255
|
envModel: model,
|
|
1256
|
+
envModelContextWindowSource: mainWindow.source,
|
|
1244
1257
|
models,
|
|
1258
|
+
contextWindowSources,
|
|
1245
1259
|
modelApiKeyEnv: {},
|
|
1246
1260
|
modelApiKeys: {},
|
|
1247
1261
|
modelRefusals: {},
|
|
@@ -1980,12 +1994,7 @@ function parseAuthDomain(ctx) {
|
|
|
1980
1994
|
const principalJwtIss = process.env.PRINCIPAL_JWT_ISS || undefined;
|
|
1981
1995
|
const principalJwtAud = process.env.PRINCIPAL_JWT_AUD || undefined;
|
|
1982
1996
|
const principalJwtMaxTtlSec = parseNumOrFailNonNegative("PRINCIPAL_JWT_MAX_TTL_SEC", env("PRINCIPAL_JWT_MAX_TTL_SEC", "120"));
|
|
1983
|
-
const authTokens =
|
|
1984
|
-
.split(",")
|
|
1985
|
-
.map((s) => s.trim())
|
|
1986
|
-
.filter((s) => s.includes("="))
|
|
1987
|
-
.map((s) => [s.slice(0, s.indexOf("=")).trim(), s.slice(s.indexOf("=") + 1).trim()])
|
|
1988
|
-
.filter(([tok, sys]) => tok.length > 0 && sys.length > 0));
|
|
1997
|
+
const authTokens = parseServiceAuthTokens(process.env.SERVICE_AUTH_TOKENS);
|
|
1989
1998
|
return {
|
|
1990
1999
|
bindHost: process.env.BIND_HOST || undefined,
|
|
1991
2000
|
bindHostSource: process.env.BIND_HOST ? "BIND_HOST" : undefined,
|
|
@@ -2028,6 +2037,7 @@ function parseOrchestrationDomain(ctx) {
|
|
|
2028
2037
|
const lspHostEnabled = boolEnv("LSP_HOST_ENABLED", true);
|
|
2029
2038
|
const autoBackgroundOnTimeout = boolEnv("AUTO_BACKGROUND_ON_TIMEOUT", true);
|
|
2030
2039
|
const lspEnvAllow = parseEnvNameAllowlist("LSP_ENV_ALLOW", singleUserTurnkey) ?? [];
|
|
2040
|
+
const hookEnvAllow = parseEnvNameAllowlist("HOOK_ENV_ALLOW", singleUserTurnkey) ?? [];
|
|
2031
2041
|
const declaredLane = declaredExecutionLane(process.env.REMOTE_EXEC);
|
|
2032
2042
|
const readFaceFacts = process.env.READ_FACE !== undefined
|
|
2033
2043
|
? { readFace: enumEnv("READ_FACE", "roots", ["open", "roots"]), readFaceSource: "env" }
|
|
@@ -2203,6 +2213,7 @@ function parseOrchestrationDomain(ctx) {
|
|
|
2203
2213
|
lspHostEnabled,
|
|
2204
2214
|
autoBackgroundOnTimeout,
|
|
2205
2215
|
lspEnvAllow,
|
|
2216
|
+
hookEnvAllow,
|
|
2206
2217
|
workflowAgentsReadOnly: boolEnv("WORKFLOW_AGENTS_READONLY", false),
|
|
2207
2218
|
imageBakes: {
|
|
2208
2219
|
enabled: boolEnv("IMAGE_BAKES_ENABLED", false),
|
|
@@ -2619,11 +2630,11 @@ function parseA2aServeAudience(v, at) {
|
|
|
2619
2630
|
}
|
|
2620
2631
|
const STORE_GROUP_KEYS = [
|
|
2621
2632
|
"sessionBackend", "sessionCacheTtlSec", "storeProbeIntervalMs", "storeLockWaitMs", "dbBackend", "dbBackendExplicit", "localDataRoot", "sealedKeyDir",
|
|
2622
|
-
"runStoreStrictHydrate",
|
|
2633
|
+
"runStoreStrictHydrate", "localStoreDurability",
|
|
2623
2634
|
"tidb", "pg", "dbQueryTimeoutMs", "snapshotBlobStore", "snapshotBlobSqlMaxBytes", "snapshotBlobAllowSql", "fileHistory", "fileHistoryCapture", "sendUserFile",
|
|
2624
2635
|
];
|
|
2625
2636
|
const MODEL_PLANE_GROUP_KEYS = [
|
|
2626
|
-
"gatewayBaseUrl", "gatewayApiKey", "gatewayFallbackUrls", "gatewayMaxRetries", "anthropic", "resilience", "model", "envModel", "models",
|
|
2637
|
+
"gatewayBaseUrl", "gatewayApiKey", "gatewayFallbackUrls", "gatewayMaxRetries", "anthropic", "resilience", "model", "envModel", "envModelContextWindowSource", "models", "contextWindowSources",
|
|
2627
2638
|
"modelApiKeyEnv", "modelApiKeys", "modelRefusals", "droppedCatalogEntries", "modelQuotaWeights", "tiers", "projects", "roles", "atMention", "cascadeLadder", "degrade",
|
|
2628
2639
|
];
|
|
2629
2640
|
const APPROVAL_GROUP_KEYS = [
|
|
@@ -2650,7 +2661,7 @@ const ORCHESTRATION_GROUP_KEYS = [
|
|
|
2650
2661
|
"workflowOrphanGraceMs", "workflowJournalRetentionMs", "workflowRunRetentionMs", "usageWindows", "workflowAgentsReadOnly",
|
|
2651
2662
|
"workflowSizeGuideline", "backgroundAgentRetentionMs", "backgroundAgentStaleRunningMs", "backgroundAgentStallMs",
|
|
2652
2663
|
"backgroundAgentParkClaimStaleMs", "delegationEntryCaps", "rosterRetentionMs", "leaderRunStaleMs", "scratchpadSweepTtlMs", "sandboxPkgSource", "sandboxPkgSourceCustom",
|
|
2653
|
-
"sessionAutoTitle", "sessionAutoTitleSource", "selectEnvironmentTool", "envFactsEnabled", "toolDeferLongtail", "lspHostEnabled", "lspEnvAllow", "autoBackgroundOnTimeout",
|
|
2664
|
+
"sessionAutoTitle", "sessionAutoTitleSource", "selectEnvironmentTool", "envFactsEnabled", "toolDeferLongtail", "lspHostEnabled", "lspEnvAllow", "hookEnvAllow", "autoBackgroundOnTimeout",
|
|
2654
2665
|
"imageBakes", "readFace", "readFaceSource", "taskWriteFaceEscalation", "readDenyPatterns", "readDenyBuiltinTiers", "readDenyBuiltinExclude", "readDenyFloorRequired", "sandboxReadFloor",
|
|
2655
2666
|
"agentConfigDir", "configLkgPath", "configLkgEnabled",
|
|
2656
2667
|
];
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 「这只模型的窗是假定的」运维通告的**唯一发声器**(行的形与事件名属 `model-context-window.ts` 的 `buildContextWindowAssumedNotice`)。
|
|
3
|
+
*
|
|
4
|
+
* ## 说什么
|
|
5
|
+
* **进程此刻服务的那张模型表**里,窗来源(`config.contextWindowSources`,与 `GET /v1/models` 行的 `contextWindowSource` 同一张表)是 `assumed` 的每只模型一行;
|
|
6
|
+
* 一个名每进程只说一次(同一份活配置一本账 —— 起服说过的名,目录落地 / 「无中心配置」档回到 env 表时不再说)。
|
|
7
|
+
*
|
|
8
|
+
* ## 在哪说(位置即判据,与「配了 $ 天花板但目录未定价」那一句同一条纪律)
|
|
9
|
+
* · 起服:模型表**定形之后**(装配第 2 段目录应用之后的不变量区末尾、run-local 配置源应用之后的同一位置)—— 不在 `loadConfig` 里说:那一拍只见 env 表,
|
|
10
|
+
* 目录随后在 boot 被采纳时 env 表整张不服务,在那里说就是对一只不会服务的模型报警(行里还会说 `GET /v1/models` 有它的行,而那一行并不存在)。
|
|
11
|
+
* · 运行中:每次模型面 commit 之后(目录换代、迟到的 boot 目录、「无中心配置」档回到 env 表 —— `applyEffective` 一处)。
|
|
12
|
+
* 严格名册布防时 env 表是占位、从不被派发(`isRosterGateArmed`;路由判官对它豁免的同一个事实)⇒ env 表在服时不说。
|
|
13
|
+
*
|
|
14
|
+
* ## 哪些名
|
|
15
|
+
* 别名(`default` 与某个本名指向同一只模型)不另说;目录里真有一条**叫** `default` 的条目(不是别名)照说。
|
|
16
|
+
*/
|
|
17
|
+
import type { Model } from "@sema-agent/core";
|
|
18
|
+
import { type ContextWindowSource } from "./model-context-window.js";
|
|
19
|
+
/** 发声器读的那几格活配置(结构子集;`ServiceConfig` 满足)。 */
|
|
20
|
+
export interface AssumedWindowView {
|
|
21
|
+
readonly model: Model;
|
|
22
|
+
readonly envModel: Model;
|
|
23
|
+
readonly models: Readonly<Record<string, Model>>;
|
|
24
|
+
readonly contextWindowSources: Readonly<Record<string, ContextWindowSource>>;
|
|
25
|
+
}
|
|
26
|
+
export declare function warnAssumedContextWindows(config: AssumedWindowView, logger: {
|
|
27
|
+
warn(event: string, fields?: Record<string, unknown>): void;
|
|
28
|
+
} | undefined, opts: {
|
|
29
|
+
readonly envTableIsPlaceholder: boolean;
|
|
30
|
+
}): void;
|
|
31
|
+
//# sourceMappingURL=context-window-notice.d.ts.map
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { buildContextWindowAssumedNotice } from "./model-context-window.js";
|
|
2
|
+
import { DEFAULT_MODEL_REF, servedModelTableLeg } from "./model-select.js";
|
|
3
|
+
const assumedWindowNamesSaid = new WeakMap();
|
|
4
|
+
export function warnAssumedContextWindows(config, logger, opts) {
|
|
5
|
+
if (logger === undefined)
|
|
6
|
+
return;
|
|
7
|
+
const leg = servedModelTableLeg(config);
|
|
8
|
+
if (leg === "env" && opts.envTableIsPlaceholder)
|
|
9
|
+
return;
|
|
10
|
+
const said = assumedWindowNamesSaid.get(config) ?? new Set();
|
|
11
|
+
assumedWindowNamesSaid.set(config, said);
|
|
12
|
+
const named = new Set(Object.entries(config.models).filter(([name]) => name !== DEFAULT_MODEL_REF).map(([, m]) => m));
|
|
13
|
+
for (const [name, m] of Object.entries(config.models)) {
|
|
14
|
+
if (name === DEFAULT_MODEL_REF && named.has(m))
|
|
15
|
+
continue;
|
|
16
|
+
if (said.has(name) || config.contextWindowSources[name] !== "assumed")
|
|
17
|
+
continue;
|
|
18
|
+
said.add(name);
|
|
19
|
+
const declareAt = leg === "catalog"
|
|
20
|
+
? "the catalog entry's contextWindow (or MODEL_CONTEXT_WINDOW, which every entry without one inherits)"
|
|
21
|
+
: m === config.envModel
|
|
22
|
+
? "MODEL_CONTEXT_WINDOW"
|
|
23
|
+
: "MODEL_CHEAP_CONTEXT_WINDOW (or MODEL_CONTEXT_WINDOW, which the cheap slot inherits)";
|
|
24
|
+
const notice = buildContextWindowAssumedNotice({ model: name, window: m.contextWindow, declareAt });
|
|
25
|
+
logger.warn(notice.event, notice.fields);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=context-window-notice.js.map
|
|
@@ -58,15 +58,12 @@ export interface PathAdjudication {
|
|
|
58
58
|
* `task-settings.ts` 的 `FsWriteGateWiring.taskHome`。 */
|
|
59
59
|
readonly taskHome?: string;
|
|
60
60
|
}
|
|
61
|
-
/** [ref]([ref] 案二):durable 部署上的 AskUserQuestion 门的活体面探针(QuestionCoordinator 的切面)。 */
|
|
62
|
-
export interface LiveQuestionFace {
|
|
63
|
-
hasLiveContext(): boolean;
|
|
64
|
-
}
|
|
65
61
|
/**
|
|
66
62
|
* [ref] —— 审批基线的**席**:这条腿上「一个名单产的 `ask` 由谁来服」。闭集三形,每条腿**显式**说出自己那一形
|
|
67
63
|
* ({@link createApprovalBaselinePolicy} 的席参数必填、按 `kind` 穷举 —— 闭集 +1 = 编译红):
|
|
68
|
-
* · `durable` —— checkpoint suspend/resume 服 ask(HTTP 腿 durable 开、park 赎回腿)。
|
|
69
|
-
*
|
|
64
|
+
* · `durable` —— checkpoint suspend/resume 服 ask(HTTP 腿 durable 开、park 赎回腿)。core 的问答策略
|
|
65
|
+
* (`createDurableQuestionPolicy()`,原形逐字)**只**叠在这一形上:它对引擎的问题工具答 `ask`,落点归 core 的同步优先
|
|
66
|
+
* (有问题席 ⇒ 先投卡、席在窗内拿到答即交答;没拿到 ⇒ 停驻 —— 卡由活面呈出而窗走完的那一问除外:席抛,引擎的投递失败臂不停驻)。
|
|
70
67
|
* · `live` —— Runner 的活 onAsk 席当场服 ask(run-local 的 `createLocalApprover`:TTY 问 y/N / 无 TTY 当场拒;
|
|
71
68
|
* core `isLiveApproverSeat(onAsk)` 为真时 `suspendAsk` 早退,ask 落回调)。三张名单与 durable 席**同一只**策略。
|
|
72
69
|
* · `absent` —— 没有谁服 ask ⇒ adjudicated allow-all;**只**服务零名单(HTTP 腿「durable 关 ∧ 单用户零意图」)。
|
|
@@ -79,11 +76,9 @@ export interface LiveQuestionFace {
|
|
|
79
76
|
export type ApprovalSeat = DurableApprovalSeat | LiveApprovalSeat | AbsentApprovalSeat;
|
|
80
77
|
/** 席的形名(补偿 warn 等只需要「哪一形」的读者读它,不必铸整只席)。 */
|
|
81
78
|
export type ApprovalSeatKind = ApprovalSeat["kind"];
|
|
82
|
-
/** durable 席:checkpoint suspend/resume 服 ask
|
|
79
|
+
/** durable 席:checkpoint suspend/resume 服 ask,core 的问答策略叠在名单策略上。 */
|
|
83
80
|
export interface DurableApprovalSeat {
|
|
84
81
|
readonly kind: "durable";
|
|
85
|
-
/** 活体问答面;`undefined` ⇒ 恒 durable park 的原形门。 */
|
|
86
|
-
readonly question: LiveQuestionFace | undefined;
|
|
87
82
|
/** 本会话的「本会话放行」读面(部署名单那一问的站着的答案;铸点 `approval.ts` 的 `createSessionExemptionRead`)。缺席 = 这条腿没有会话 / 没有豁免店 ⇒ 名单照问。 */
|
|
88
83
|
readonly exemption?: SessionExemptionRead;
|
|
89
84
|
}
|
|
@@ -95,23 +90,6 @@ export interface LiveApprovalSeat {
|
|
|
95
90
|
export interface AbsentApprovalSeat {
|
|
96
91
|
readonly kind: "absent";
|
|
97
92
|
}
|
|
98
|
-
/**
|
|
99
|
-
* [ref]([ref] 案二):durable 部署上的 AskUserQuestion 门。活体面(QuestionCoordinator)缺席 ⇒ 原形
|
|
100
|
-
* `createDurableQuestionPolicy()`(恒 ask ⇒ 恒 durable park)。在场 ⇒ **判决时**按活流上下文分腿:
|
|
101
|
-
* 活流腿(bg/SSE,coordinator.runWithContext 包裹且投递面此刻可达,ALS 判)allow——工具执行落到
|
|
102
|
-
* RunnerDeps.onQuestion 的 coordinator,问正在 tail 流的活人;无活流腿(sync /v1/tasks、verify/cascade、
|
|
103
|
-
* durable resume 驱动、断连后的 detach 腿)ask——durable park 原语义逐字保留([ref] 后无活流腿放行执行
|
|
104
|
-
* 也不会产出空答:coordinator 无 ALS ctx ⇒ 冻结 `{kind:"unavailable"}`(src/question.ts),永不悬挂;
|
|
105
|
-
* park 仍是把问题送到人面前的唯一那条腿,正当性不变、只是反事实前提换了)。
|
|
106
|
-
* 「是不是引擎的问题工具」不在本层判:core 7.56.0 [ref] 起本门**组合** core 原形的答(它读调用的脸 —— 引擎挂载点 + 目录契约 id,不读名字;
|
|
107
|
-
* 它答 `ask` ⇒ 是;本层只在那之上按活流分腿)。决断口的 pre-CAS 守卫(「批准问答必须带答」)仍按保留名读(core 同版「Not changed here」那一条)。
|
|
108
|
-
* ⚠️ **单一属主**(复审 A2):AskUserQuestion 的 durable 判决只有这一处。任何需要「同参重建」这条判决的
|
|
109
|
-
* 地方(main.ts 的 parkedReviveInheritedGate 父约束链)必须调本工厂,不得自折 core 原形——两份拷贝里
|
|
110
|
-
* 只改一份正是本条 finding 的成因。**登记豁免一处**:leader worker 腿(src/leader/wire.ts provisionWorker)
|
|
111
|
-
* 自折 core 原形——该腿无活体问答面可装且 leader 不 import boot 层(分层),core 原形+sentinel 即其完整
|
|
112
|
-
* 语义;豁免注在彼处互指,接活体面之日必须并回本工厂。
|
|
113
|
-
*/
|
|
114
|
-
export declare function createDurableQuestionGate(live: LiveQuestionFace | undefined): ToolPolicy;
|
|
115
93
|
/**
|
|
116
94
|
* 沙箱 lane 上**相对形**写目标的守卫补层用 env(codex 交叉复审 round1 finding 1,红先复现)。
|
|
117
95
|
*
|
|
@@ -266,8 +244,9 @@ export declare function buildApprovalGrantNotice(config: {
|
|
|
266
244
|
* `undefined`**:治理层是 tighten-only 的叠加层,没有基线可叠时它自己也产不出「门在场」这件事。
|
|
267
245
|
*
|
|
268
246
|
* 三形,按席穷举([ref],席的定义见 {@link ApprovalSeat}):
|
|
269
|
-
* · `durable` ⇒
|
|
270
|
-
* `createDurableAskPolicy` 里)。gated `ask` 由 core 变成 durable checkpoint suspend
|
|
247
|
+
* · `durable` ⇒ core 的问答策略(原形逐字,不包)+ 三张名单的审批门(deny/neverAuto/预算/本会话的豁免行全在
|
|
248
|
+
* `createDurableAskPolicy` 里)。gated `ask` 由 core 变成 durable checkpoint suspend;问题族的 `ask` 先过 core 的同步优先
|
|
249
|
+
* (问题席在窗内拿到答 ⇒ 交答;没拿到 ⇒ 停驻;活面呈出而窗走完 ⇒ 投递失败臂)—— 「有没有人」本口不预判,唯一判官是那一次投递的结局。
|
|
271
250
|
* · `live` ⇒ **同一只**三张名单审批门,不叠问答门。gated `ask` 由 core 交给 Runner 的活 onAsk 席
|
|
272
251
|
* (本口**不**做 ask→deny 映射:无人可问时的拒由那只席说,判据与文案都归它)。
|
|
273
252
|
* · `absent` ⇒ **adjudicated allow-all**(`createAllowDenyPolicy({})`):一条**在场的**、
|
|
@@ -1,19 +1,6 @@
|
|
|
1
1
|
import { join, posix } from "node:path";
|
|
2
2
|
import { FileError, StubExecutionEnv, combinePolicies, createAllowDenyPolicy, createDurableQuestionPolicy, createSensitivePathPolicy, createTranscriptIntegrityPolicy, err, isAbsoluteForFamily, isProtectedWrite, ok, pathTargetValue, protectivePathTargetOf, } from "@sema-agent/core";
|
|
3
3
|
import { createDurableAskPolicy, hasApprovalListIntent } from "./approval.js";
|
|
4
|
-
export function createDurableQuestionGate(live) {
|
|
5
|
-
const durable = createDurableQuestionPolicy();
|
|
6
|
-
if (live === undefined)
|
|
7
|
-
return durable;
|
|
8
|
-
return {
|
|
9
|
-
async check(req) {
|
|
10
|
-
const answer = await durable.check(req);
|
|
11
|
-
if (answer.action !== "ask")
|
|
12
|
-
return answer;
|
|
13
|
-
return live.hasLiveContext() ? { action: "allow" } : answer;
|
|
14
|
-
},
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
4
|
export const SANDBOX_TREE_FAMILY = "posix";
|
|
18
5
|
function writeTargetFormOf(req) {
|
|
19
6
|
if (!isProtectedWrite(req))
|
|
@@ -125,7 +112,7 @@ export function buildApprovalGrantNotice(config) {
|
|
|
125
112
|
export function createApprovalBaselinePolicy(config, seat) {
|
|
126
113
|
switch (seat.kind) {
|
|
127
114
|
case "durable":
|
|
128
|
-
return combinePolicies(
|
|
115
|
+
return combinePolicies(createDurableQuestionPolicy(), createApprovalListPolicy(config, seat.exemption));
|
|
129
116
|
case "live":
|
|
130
117
|
return createApprovalListPolicy(config, undefined);
|
|
131
118
|
case "absent":
|
|
@@ -105,36 +105,45 @@ export declare const DEPLOYMENT_SHAPE_PREDICATES: Readonly<{
|
|
|
105
105
|
principalRequired: DeploymentShapePredicate<"principal">;
|
|
106
106
|
/**
|
|
107
107
|
* 「这台部署有没有身份边界」的问法 —— 有 = 请求里有东西替主体作保或拦在门外:声明了 `REQUIRE_PRINCIPAL`,或配置接了任一已验身份来源
|
|
108
|
-
* (service 凭据 / 鉴权桥 issuer,含中心回退 / 直连门),或声明了只读 trace 凭据。没有 = dev-open
|
|
108
|
+
* (service 凭据 / 鉴权桥 issuer,含中心回退 / 直连门),或声明了只读 trace 凭据。没有 = dev-open:主体头是谁都能自报的(不是认证;报了它的请求仍为那位主体)。
|
|
109
109
|
* 只读配置(验签器在起服第 9 段按同一个配置读数建 ⇒「验签器在场」≡「配置里有桥」),所以先于验签器的起服段(第 3 段的一次性迁移)与请求面读到同一个答案。
|
|
110
|
-
* 读者:请求面的 dev-open 判据(`http/principal-gate.ts` 的 `devOpenDeployment
|
|
110
|
+
* 读者:请求面的 dev-open 判据(`http/principal-gate.ts` 的 `devOpenDeployment`,`actsForDeployment` 的一臂:不报主体的调用方在属主存取器的 fleet 一格与 `/metrics` 族上代部署本人)、
|
|
111
111
|
* 一次性迁移 M48 的输入(`plugins/store-backend.ts`:有边界 ⇒ 不改写哨兵属主)。
|
|
112
112
|
*/
|
|
113
|
-
identityBoundary: DeploymentShapePredicate<"
|
|
113
|
+
identityBoundary: DeploymentShapePredicate<"principal" | "identity">;
|
|
114
114
|
/**
|
|
115
115
|
* 租户轴的问法。今天与 {@link DEPLOYMENT_SHAPE_PREDICATES.principalRequired} 读**同一个声明**([ref] ①:托管 / 多租 ⇔ `REQUIRE_PRINCIPAL=true`,
|
|
116
116
|
* 签发方配置是身份验签轴、不算租户证据)—— 两个问题、一根轴、一个读口;「鉴权必需」与「多租形」拆成两个声明时只改这一行的判官。
|
|
117
117
|
*/
|
|
118
118
|
multiTenant: DeploymentShapePredicate<"principal">;
|
|
119
119
|
/** 读能力表 `callerCwd` 位(host = 单主才开;device = 路径落在发起者自己的设备上,归属由根会话行执行格上的设备绑定验过,不要求单主)。 */
|
|
120
|
-
callerCwd: DeploymentShapePredicate<"
|
|
120
|
+
callerCwd: DeploymentShapePredicate<"principal" | "lane">;
|
|
121
121
|
/** 调用方给的宿主绝对路径(附加目录 / 项目上下文 / 本机 SendUserFile / 指令文件探针)只在「手就在本 worker 的盘上 ∧ 单主」时指向调用方自己的东西;
|
|
122
|
-
* 本机语言服务器(`createLspManager`:本机子进程、在 worker 盘上找根)同问这一句,读这一行 × `LSP_HOST_ENABLED`。
|
|
123
|
-
|
|
122
|
+
* 本机语言服务器(`createLspManager`:本机子进程、在 worker 盘上找根)同问这一句,读这一行 × `LSP_HOST_ENABLED`。
|
|
123
|
+
* local 店的声明(`local-store-declaration.ts` 的 `localStoreDeclarationOf`)同问这一句:店的数据根就在这块盘上,盘是调用方自己的且易失 ⇒ 部署不替他声明它活过替换。 */
|
|
124
|
+
callerOwnsWorkerDisk: DeploymentShapePredicate<"principal" | "lane">;
|
|
124
125
|
/** wire `executionLane.toolsOnThisHost` 与出厂 / 中心技能的 `baseDir`:只问文件系统同一性,与租户无关(出厂内容每个租户拿到同一份)。 */
|
|
125
126
|
toolsOnThisHost: DeploymentShapePredicate<"lane">;
|
|
126
127
|
/** 无手形(声明 `none`;判据读执行环境块 `io`,不点名车道词)且单主:进程级消费者(hooks 命令、项目上下文本机读、卡批规则 root)看到的就是引擎自己的进程 cwd / env。 */
|
|
127
|
-
noHandsSingleUser: DeploymentShapePredicate<"
|
|
128
|
+
noHandsSingleUser: DeploymentShapePredicate<"principal" | "lane">;
|
|
128
129
|
/** 任务层替部署声明宿主姿态(bypassPermissions 开写面 / host shell 继承整份环境)的射程:device 车道上跨租户宿主穿越结构性不存在(clay 裁定③)。 */
|
|
129
|
-
taskHostPostureDeclarations: DeploymentShapePredicate<"
|
|
130
|
+
taskHostPostureDeclarations: DeploymentShapePredicate<"principal" | "lane">;
|
|
130
131
|
/** 写门走代理裁决(执行环境块 `hostLocalPaths` 为假:路径不是本 worker 盘上的文件);认不出的词 ⇒ 走代理(代理 slot 空 ⇒ 写门 fail-closed)。 */
|
|
131
132
|
sandboxPathAdjudication: DeploymentShapePredicate<"lane">;
|
|
132
133
|
/** 读能力表 `sandboxSendUserFile` 位(e2b / k8s 每任务一只沙箱 ⇒ 任何租户;ssh 共享一台真机 ⇒ 只单主)。 */
|
|
133
|
-
sandboxSendUserFile: DeploymentShapePredicate<"
|
|
134
|
+
sandboxSendUserFile: DeploymentShapePredicate<"principal" | "lane">;
|
|
134
135
|
/** 读能力表 `remoteScratchpad` 位(`/tmp/scratchpad/<sessionId>` 远端约定)。 */
|
|
135
136
|
remoteScratchpad: DeploymentShapePredicate<"lane">;
|
|
137
|
+
/**
|
|
138
|
+
* 读能力表 `backgroundShell` 位 —— 「这条车道的执行环境能不能开后台 shell(`run_in_background` / `BashOutput` / `KillShell`),含把运行中的前台命令领养成后台任务」的**唯一**答者:
|
|
139
|
+
* e2b / k8s 每任务一只沙箱 ⇒ 任何租户;host(命令落在 worker 宿主上的同一张进程表)⇒ 只单主;其余车道(含 none)没有后台 shell;认不出的车道 ⇒ 否。
|
|
140
|
+
* 读者(同读这一行,没有第二份判别式):三只声明后台 shell 的适配器的 `backgroundCapabilities`(`supported` 与 `supportsDetach` 是同一个答案)、
|
|
141
|
+
* host 适配器的装配点(`boot/execution-env.ts` / `run-local.ts` 把行的答案交给适配器的 `backgroundShell`)、能力事实 `autoBackgroundOnTimeout`(`/health.autoBackgroundOnTimeout`)。
|
|
142
|
+
* 全局关停开关 `HOST_BG_ENABLED` 不在行里 —— 它是旋钮不是部署形,host 适配器与事实在行之上各合取一次。
|
|
143
|
+
*/
|
|
144
|
+
backgroundShell: DeploymentShapePredicate<"principal" | "lane">;
|
|
136
145
|
/** 读能力表 `tenantSeparation` 位(值来自 settings-schema 车道词表正本);唯一读者 = 跨域不变量 `multi-tenant-shared-lane`。 */
|
|
137
|
-
laneSeparatesTenants: DeploymentShapePredicate<"
|
|
146
|
+
laneSeparatesTenants: DeploymentShapePredicate<"principal" | "lane">;
|
|
138
147
|
/**
|
|
139
148
|
* [ref] —— **VM 级**隔离强度(独立内核:e2b 的 Firecracker microVM;k8s 只在 Kata / gVisor 运行时类上)。与执行环境块 `isolation` 键
|
|
140
149
|
* (OS 级边界,容器即算;wire `executionLane.isolated` 的属主 `laneIsolated`)是两个问题,所以不叫「isolated」。读者:A 值路由。
|
|
@@ -157,7 +166,7 @@ export declare const DEPLOYMENT_SHAPE_PREDICATES: Readonly<{
|
|
|
157
166
|
* · `none`:没有执行环境(能力事实先判无手车道,这里照样表态)。
|
|
158
167
|
* 读者:能力事实 `sessionRewindFiles`(能力位与该口的 501 同读这一行)。
|
|
159
168
|
*/
|
|
160
|
-
rewindableWorkspace: DeploymentShapePredicate<"
|
|
169
|
+
rewindableWorkspace: DeploymentShapePredicate<"principal" | "lane">;
|
|
161
170
|
}>;
|
|
162
171
|
export {};
|
|
163
172
|
//# sourceMappingURL=deployment-shape.d.ts.map
|
package/dist/deployment-shape.js
CHANGED
|
@@ -63,6 +63,7 @@ export const DEPLOYMENT_SHAPE_PREDICATES = Object.freeze({
|
|
|
63
63
|
sandboxPathAdjudication: createPredicate(["lane"], "车道:写门的路径事实要经代理到执行环境里取(文件平面不在本 worker 盘上;认不出的车道也走代理)。", ({ lane }) => lane.block === undefined || !lane.block.hostLocalPaths),
|
|
64
64
|
sandboxSendUserFile: createPredicate(["lane", "principal"], "车道 × 租户:SendUserFile 的沙箱直传腿可以挂(沙箱盘 = 租户自己的任务工作区,或共享真机上的单主部署)。", ({ lane, principal }) => lane.caps !== undefined && capabilityHolds(lane.caps.sandboxSendUserFile, principal)),
|
|
65
65
|
remoteScratchpad: createPredicate(["lane"], "车道:执行环境里按会话分的远端 scratchpad 约定适用。", ({ lane }) => lane.caps !== undefined && lane.caps.remoteScratchpad === "supported"),
|
|
66
|
+
backgroundShell: createPredicate(["lane", "principal"], "车道 × 租户:本车道的执行环境可以开后台 shell(含领养运行中的前台命令)—— e2b / k8s 任何租户,host 只单主,其余车道没有。", ({ lane, principal }) => lane.caps !== undefined && capabilityHolds(lane.caps.backgroundShell, principal)),
|
|
66
67
|
laneSeparatesTenants: createPredicate(["lane", "principal"], "车道 × 租户:这条车道在这台部署上不让两个租户的命令落在同一个共享目标上(单主部署恒成立;认不出的车道不成立)。", ({ lane, principal }) => lane.caps !== undefined && capabilityHolds(lane.caps.tenantSeparation, principal)),
|
|
67
68
|
vmIsolatedHands: createPredicate(["lane"], "车道 / 隔离强度:手跑在 VM 级边界里(独立内核);runc / 共享内核 / 真机 / 认不出 ⇒ 否。", ({ lane }) => {
|
|
68
69
|
if (lane.lane === "e2b")
|
package/dist/device-ws-hub.d.ts
CHANGED
|
@@ -209,6 +209,7 @@ export interface DeviceWsHub {
|
|
|
209
209
|
declaredSupports(deviceId: string): ReadonlySet<DeviceInstructionKind> | undefined;
|
|
210
210
|
close(): Promise<void>;
|
|
211
211
|
}
|
|
212
|
+
export declare const DEVICE_MAX_PAYLOAD_PART_BYTES: number;
|
|
212
213
|
/** per-remote 帽键的来源(闭集;指标 `device_preauth_key_total{source}` 与 cap-hit 行 `keySource` 同一张表)。 */
|
|
213
214
|
export declare const DEVICE_PREAUTH_KEY_SOURCES: readonly ["socket", "xff", "fallback"];
|
|
214
215
|
export type DevicePreAuthKeySource = (typeof DEVICE_PREAUTH_KEY_SOURCES)[number];
|