@dsh-edge/dsh-edge-agent 0.0.0-stage → 0.1.2
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/CHANGELOG.md +158 -0
- package/LICENSE +21 -0
- package/README.md +181 -2
- package/config/edge.example.json +179 -0
- package/config/privacy-policy.json +202 -0
- package/cordis.desktop-safe.patch.yml +129 -0
- package/cordis.patch.yml +382 -0
- package/cordis.yml +374 -0
- package/lib/attestation.d.ts +2 -0
- package/lib/attestation.d.ts.map +1 -0
- package/lib/attestation.js +2 -0
- package/lib/audit-log.d.ts +2 -0
- package/lib/audit-log.d.ts.map +1 -0
- package/lib/audit-log.js +2 -0
- package/lib/client.js +87 -0
- package/lib/cloud-llm-adapter.d.ts +2 -0
- package/lib/cloud-llm-adapter.d.ts.map +1 -0
- package/lib/cloud-llm-adapter.js +2 -0
- package/lib/dsh-adapter/attestation.d.ts +42 -0
- package/lib/dsh-adapter/attestation.d.ts.map +1 -0
- package/lib/dsh-adapter/attestation.js +40 -0
- package/lib/dsh-adapter/audit-log.d.ts +139 -0
- package/lib/dsh-adapter/audit-log.d.ts.map +1 -0
- package/lib/dsh-adapter/audit-log.js +376 -0
- package/lib/dsh-adapter/cloud-egress.d.ts +181 -0
- package/lib/dsh-adapter/cloud-egress.d.ts.map +1 -0
- package/lib/dsh-adapter/cloud-egress.js +257 -0
- package/lib/dsh-adapter/cloud-llm-adapter.d.ts +416 -0
- package/lib/dsh-adapter/cloud-llm-adapter.d.ts.map +1 -0
- package/lib/dsh-adapter/cloud-llm-adapter.js +1472 -0
- package/lib/dsh-adapter/contract.d.ts +80 -0
- package/lib/dsh-adapter/contract.d.ts.map +1 -0
- package/lib/dsh-adapter/contract.js +194 -0
- package/lib/dsh-adapter/desktop-cookie-janitor.d.ts +214 -0
- package/lib/dsh-adapter/desktop-cookie-janitor.d.ts.map +1 -0
- package/lib/dsh-adapter/desktop-cookie-janitor.js +409 -0
- package/lib/dsh-adapter/dsh-edge-agent.d.ts +48 -0
- package/lib/dsh-adapter/dsh-edge-agent.d.ts.map +1 -0
- package/lib/dsh-adapter/dsh-edge-agent.js +64 -0
- package/lib/dsh-adapter/edge-config.d.ts +484 -0
- package/lib/dsh-adapter/edge-config.d.ts.map +1 -0
- package/lib/dsh-adapter/edge-config.js +898 -0
- package/lib/dsh-adapter/edge-context-view.d.ts +184 -0
- package/lib/dsh-adapter/edge-context-view.d.ts.map +1 -0
- package/lib/dsh-adapter/edge-context-view.js +483 -0
- package/lib/dsh-adapter/effective-model.d.ts +85 -0
- package/lib/dsh-adapter/effective-model.d.ts.map +1 -0
- package/lib/dsh-adapter/effective-model.js +171 -0
- package/lib/dsh-adapter/etscli-shell-guard.d.ts +244 -0
- package/lib/dsh-adapter/etscli-shell-guard.d.ts.map +1 -0
- package/lib/dsh-adapter/etscli-shell-guard.js +420 -0
- package/lib/dsh-adapter/etscli-tools.d.ts +112 -0
- package/lib/dsh-adapter/etscli-tools.d.ts.map +1 -0
- package/lib/dsh-adapter/etscli-tools.js +393 -0
- package/lib/dsh-adapter/file-logger.d.ts +294 -0
- package/lib/dsh-adapter/file-logger.d.ts.map +1 -0
- package/lib/dsh-adapter/file-logger.js +564 -0
- package/lib/dsh-adapter/function-call-external.d.ts +357 -0
- package/lib/dsh-adapter/function-call-external.d.ts.map +1 -0
- package/lib/dsh-adapter/function-call-external.js +1005 -0
- package/lib/dsh-adapter/host-egress-guard.d.ts +161 -0
- package/lib/dsh-adapter/host-egress-guard.d.ts.map +1 -0
- package/lib/dsh-adapter/host-egress-guard.js +213 -0
- package/lib/dsh-adapter/host-llm-trace.d.ts +198 -0
- package/lib/dsh-adapter/host-llm-trace.d.ts.map +1 -0
- package/lib/dsh-adapter/host-llm-trace.js +344 -0
- package/lib/dsh-adapter/http-api-routes.d.ts +61 -0
- package/lib/dsh-adapter/http-api-routes.d.ts.map +1 -0
- package/lib/dsh-adapter/http-api-routes.js +79 -0
- package/lib/dsh-adapter/http-api-sessions.d.ts +105 -0
- package/lib/dsh-adapter/http-api-sessions.d.ts.map +1 -0
- package/lib/dsh-adapter/http-api-sessions.js +173 -0
- package/lib/dsh-adapter/http-api.d.ts +221 -0
- package/lib/dsh-adapter/http-api.d.ts.map +1 -0
- package/lib/dsh-adapter/http-api.js +1811 -0
- package/lib/dsh-adapter/index.d.ts +62 -0
- package/lib/dsh-adapter/index.d.ts.map +1 -0
- package/lib/dsh-adapter/index.js +97 -0
- package/lib/dsh-adapter/input-guard-messages.d.ts +56 -0
- package/lib/dsh-adapter/input-guard-messages.d.ts.map +1 -0
- package/lib/dsh-adapter/input-guard-messages.js +136 -0
- package/lib/dsh-adapter/input-guard.d.ts +508 -0
- package/lib/dsh-adapter/input-guard.d.ts.map +1 -0
- package/lib/dsh-adapter/input-guard.js +2174 -0
- package/lib/dsh-adapter/intent-prompts.d.ts +77 -0
- package/lib/dsh-adapter/intent-prompts.d.ts.map +1 -0
- package/lib/dsh-adapter/intent-prompts.js +97 -0
- package/lib/dsh-adapter/intent-router.d.ts +710 -0
- package/lib/dsh-adapter/intent-router.d.ts.map +1 -0
- package/lib/dsh-adapter/intent-router.js +2802 -0
- package/lib/dsh-adapter/intent-signals.d.ts +208 -0
- package/lib/dsh-adapter/intent-signals.d.ts.map +1 -0
- package/lib/dsh-adapter/intent-signals.js +391 -0
- package/lib/dsh-adapter/invariant-install.d.ts +16 -0
- package/lib/dsh-adapter/invariant-install.d.ts.map +1 -0
- package/lib/dsh-adapter/invariant-install.js +15 -0
- package/lib/dsh-adapter/invariant.d.ts +16 -0
- package/lib/dsh-adapter/invariant.d.ts.map +1 -0
- package/lib/dsh-adapter/invariant.js +22 -0
- package/lib/dsh-adapter/llm-adapters.d.ts +19 -0
- package/lib/dsh-adapter/llm-adapters.d.ts.map +1 -0
- package/lib/dsh-adapter/llm-adapters.js +16 -0
- package/lib/dsh-adapter/llm-internal-caller.d.ts +92 -0
- package/lib/dsh-adapter/llm-internal-caller.d.ts.map +1 -0
- package/lib/dsh-adapter/llm-internal-caller.js +100 -0
- package/lib/dsh-adapter/llm-max-turns.d.ts +55 -0
- package/lib/dsh-adapter/llm-max-turns.d.ts.map +1 -0
- package/lib/dsh-adapter/llm-max-turns.js +127 -0
- package/lib/dsh-adapter/llm-trace-store.d.ts +131 -0
- package/lib/dsh-adapter/llm-trace-store.d.ts.map +1 -0
- package/lib/dsh-adapter/llm-trace-store.js +205 -0
- package/lib/dsh-adapter/llm-trace.d.ts +450 -0
- package/lib/dsh-adapter/llm-trace.d.ts.map +1 -0
- package/lib/dsh-adapter/llm-trace.js +463 -0
- package/lib/dsh-adapter/local-llm-adapter.d.ts +141 -0
- package/lib/dsh-adapter/local-llm-adapter.d.ts.map +1 -0
- package/lib/dsh-adapter/local-llm-adapter.js +787 -0
- package/lib/dsh-adapter/local-storage.d.ts +96 -0
- package/lib/dsh-adapter/local-storage.d.ts.map +1 -0
- package/lib/dsh-adapter/local-storage.js +198 -0
- package/lib/dsh-adapter/model-router.d.ts +79 -0
- package/lib/dsh-adapter/model-router.d.ts.map +1 -0
- package/lib/dsh-adapter/model-router.js +107 -0
- package/lib/dsh-adapter/ohttp-gateway.d.ts +49 -0
- package/lib/dsh-adapter/ohttp-gateway.d.ts.map +1 -0
- package/lib/dsh-adapter/ohttp-gateway.js +32 -0
- package/lib/dsh-adapter/openai-sse.d.ts +85 -0
- package/lib/dsh-adapter/openai-sse.d.ts.map +1 -0
- package/lib/dsh-adapter/openai-sse.js +462 -0
- package/lib/dsh-adapter/pii-utils.d.ts +96 -0
- package/lib/dsh-adapter/pii-utils.d.ts.map +1 -0
- package/lib/dsh-adapter/pii-utils.js +324 -0
- package/lib/dsh-adapter/plugin-host.d.ts +38 -0
- package/lib/dsh-adapter/plugin-host.d.ts.map +1 -0
- package/lib/dsh-adapter/plugin-host.js +38 -0
- package/lib/dsh-adapter/plugin.d.ts +46 -0
- package/lib/dsh-adapter/plugin.d.ts.map +1 -0
- package/lib/dsh-adapter/plugin.js +100 -0
- package/lib/dsh-adapter/privacy-policy.d.ts +237 -0
- package/lib/dsh-adapter/privacy-policy.d.ts.map +1 -0
- package/lib/dsh-adapter/privacy-policy.js +391 -0
- package/lib/dsh-adapter/prompt-guard.d.ts +152 -0
- package/lib/dsh-adapter/prompt-guard.d.ts.map +1 -0
- package/lib/dsh-adapter/prompt-guard.js +872 -0
- package/lib/dsh-adapter/realm-skill-bridge.d.ts +365 -0
- package/lib/dsh-adapter/realm-skill-bridge.d.ts.map +1 -0
- package/lib/dsh-adapter/realm-skill-bridge.js +1180 -0
- package/lib/dsh-adapter/sanitizer-pipeline.d.ts +140 -0
- package/lib/dsh-adapter/sanitizer-pipeline.d.ts.map +1 -0
- package/lib/dsh-adapter/sanitizer-pipeline.js +431 -0
- package/lib/dsh-adapter/secure-bridge.d.ts +47 -0
- package/lib/dsh-adapter/secure-bridge.d.ts.map +1 -0
- package/lib/dsh-adapter/secure-bridge.js +35 -0
- package/lib/dsh-adapter/session-attribution.d.ts +70 -0
- package/lib/dsh-adapter/session-attribution.d.ts.map +1 -0
- package/lib/dsh-adapter/session-attribution.js +76 -0
- package/lib/dsh-adapter/sessions.d.ts +86 -0
- package/lib/dsh-adapter/sessions.d.ts.map +1 -0
- package/lib/dsh-adapter/sessions.js +179 -0
- package/lib/dsh-adapter/tcm.d.ts +55 -0
- package/lib/dsh-adapter/tcm.d.ts.map +1 -0
- package/lib/dsh-adapter/tcm.js +94 -0
- package/lib/dsh-adapter/td-bus.d.ts +87 -0
- package/lib/dsh-adapter/td-bus.d.ts.map +1 -0
- package/lib/dsh-adapter/td-bus.js +196 -0
- package/lib/dsh-adapter/tool-runner.d.ts +185 -0
- package/lib/dsh-adapter/tool-runner.d.ts.map +1 -0
- package/lib/dsh-adapter/tool-runner.js +271 -0
- package/lib/dsh-adapter/tools.d.ts +118 -0
- package/lib/dsh-adapter/tools.d.ts.map +1 -0
- package/lib/dsh-adapter/tools.js +292 -0
- package/lib/dsh-adapter/types.d.ts +23 -0
- package/lib/dsh-adapter/types.d.ts.map +1 -0
- package/lib/dsh-adapter/types.js +16 -0
- package/lib/dsh-adapter/voice-input.d.ts +30 -0
- package/lib/dsh-adapter/voice-input.d.ts.map +1 -0
- package/lib/dsh-adapter/voice-input.js +34 -0
- package/lib/dsh-adapter/web-search-tavily-bocha.d.ts +152 -0
- package/lib/dsh-adapter/web-search-tavily-bocha.d.ts.map +1 -0
- package/lib/dsh-adapter/web-search-tavily-bocha.js +289 -0
- package/lib/http-api.d.ts +2 -0
- package/lib/http-api.d.ts.map +1 -0
- package/lib/http-api.js +2 -0
- package/lib/index.d.ts +48 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +49 -0
- package/lib/intent-router.d.ts +2 -0
- package/lib/intent-router.d.ts.map +1 -0
- package/lib/intent-router.js +2 -0
- package/lib/llm-adapters.d.ts +2 -0
- package/lib/llm-adapters.d.ts.map +1 -0
- package/lib/llm-adapters.js +2 -0
- package/lib/local-llm-adapter.d.ts +2 -0
- package/lib/local-llm-adapter.d.ts.map +1 -0
- package/lib/local-llm-adapter.js +2 -0
- package/lib/local-storage.d.ts +2 -0
- package/lib/local-storage.d.ts.map +1 -0
- package/lib/local-storage.js +2 -0
- package/lib/model-router.d.ts +2 -0
- package/lib/model-router.d.ts.map +1 -0
- package/lib/model-router.js +2 -0
- package/lib/ohttp-gateway.d.ts +2 -0
- package/lib/ohttp-gateway.d.ts.map +1 -0
- package/lib/ohttp-gateway.js +2 -0
- package/lib/plugin-host.d.ts +2 -0
- package/lib/plugin-host.d.ts.map +1 -0
- package/lib/plugin-host.js +2 -0
- package/lib/privacy-policy.d.ts +2 -0
- package/lib/privacy-policy.d.ts.map +1 -0
- package/lib/privacy-policy.js +2 -0
- package/lib/prompt-guard.d.ts +2 -0
- package/lib/prompt-guard.d.ts.map +1 -0
- package/lib/prompt-guard.js +2 -0
- package/lib/sanitizer-pipeline.d.ts +2 -0
- package/lib/sanitizer-pipeline.d.ts.map +1 -0
- package/lib/sanitizer-pipeline.js +2 -0
- package/lib/secure-bridge.d.ts +2 -0
- package/lib/secure-bridge.d.ts.map +1 -0
- package/lib/secure-bridge.js +2 -0
- package/lib/sessions.d.ts +2 -0
- package/lib/sessions.d.ts.map +1 -0
- package/lib/sessions.js +2 -0
- package/lib/tcm.d.ts +2 -0
- package/lib/tcm.d.ts.map +1 -0
- package/lib/tcm.js +2 -0
- package/lib/td-bus.d.ts +2 -0
- package/lib/td-bus.d.ts.map +1 -0
- package/lib/td-bus.js +2 -0
- package/lib/tools.d.ts +2 -0
- package/lib/tools.d.ts.map +1 -0
- package/lib/tools.js +2 -0
- package/lib/voice-input.d.ts +2 -0
- package/lib/voice-input.d.ts.map +1 -0
- package/lib/voice-input.js +2 -0
- package/package.json +253 -3
- package/presets/agent-preset-edge.json +50 -0
- package/presets/edge.desktop-safe.patch.yml +503 -0
- package/presets/edge.patch.yml +557 -0
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cloud-llm-adapter — registers a remote LLM provider (DeepSeek, etc).
|
|
3
|
+
* M1 ships a minimal self-contained DeepSeek Chat-Completions client:
|
|
4
|
+
* one HTTPS POST, one SSE parse, no retries, no idle watchdog, no
|
|
5
|
+
* secure-bridge routing (the latter comes in A4). The credentials
|
|
6
|
+
* are read from a process-env slot the operator names in
|
|
7
|
+
* `Config.apiKeyEnv` (default `DEEPSEEK_API_KEY`); the adapter never
|
|
8
|
+
* persists the key. Each request carries `attributionHeaders()` so
|
|
9
|
+
* upstream can correlate the call to the harness.
|
|
10
|
+
*
|
|
11
|
+
* Wire protocol: OpenAI-compatible chat-completions streaming endpoint
|
|
12
|
+
* (`{baseUrl}/chat/completions`). Adapter emits `text-delta` events
|
|
13
|
+
* for `content` deltas, `tool-call-delta` for function-call deltas,
|
|
14
|
+
* and a terminal `finish({kind})` derived from the stream's
|
|
15
|
+
* `finish_reason`.
|
|
16
|
+
*
|
|
17
|
+
* The body builder + SSE parser live in `./openai-sse.js` so the
|
|
18
|
+
* `local-llm-adapter` `mode: 'real'` path shares them.
|
|
19
|
+
*
|
|
20
|
+
* @module dsh-edge-agent/cloud-llm-adapter
|
|
21
|
+
*/
|
|
22
|
+
import type { Context, LoggerService } from '@deepseek-ai/cordis';
|
|
23
|
+
import Schema from '@deepseek-ai/schemastery';
|
|
24
|
+
import { LlmAdapter } from '@deepseek-ai/dsh-llm';
|
|
25
|
+
import type { GenerateOptions, LlmModelInfo, LlmProviderInfo, LlmResolvedModelInfo, StreamChunk } from '@deepseek-ai/dsh-llm';
|
|
26
|
+
import { type EgressMessage } from './cloud-egress.js';
|
|
27
|
+
export declare const name = "cloud-llm-adapter";
|
|
28
|
+
/**
|
|
29
|
+
* §7.152 (2026-10-29): 'sanitizer' + 'modelRouter' 加入 inject。
|
|
30
|
+
*
|
|
31
|
+
* 原来的类注释(§7.131)认为「apply() 时取不到的服务可以在运行时用
|
|
32
|
+
* `ctx as unknown as {...}` 取到」——**这是错的**:cordis 的 Context 是
|
|
33
|
+
* Proxy,`inject` 里没声明的服务在**运行时**访问一样会抛
|
|
34
|
+
* `cannot get property "X" without inject`。类型断言骗不过 Proxy。
|
|
35
|
+
*
|
|
36
|
+
* 实测(独立 HTTP profile,2026-10-29):CLOUD 直连池(baseUrl + keyRef)
|
|
37
|
+
* 的首次出网就死在这里:
|
|
38
|
+
* cloud-llm-adapter: egress preparation failed
|
|
39
|
+
* (cannot get property "modelRouter" without inject)
|
|
40
|
+
* —— refusing to send unscrubbed text
|
|
41
|
+
* 即:出网前准备器**取不到本地 provider 名单**(modelRouter)与**脱敏器**
|
|
42
|
+
* (sanitizer)⇒ 宁可不发也不发未脱敏的文本 ⇒ CLOUD 轮次全 502。
|
|
43
|
+
*
|
|
44
|
+
* 为什么之前没暴露:DELEGATE 模式(cloud 池留空、转交宿主 provider)走的是
|
|
45
|
+
* 另一条路径,不碰这两个服务;本仓库的默认部署一直是 DELEGATE。一旦把
|
|
46
|
+
* cloud 池配成**直连**(baseUrl + model + keyRef),这条路径才会走到。
|
|
47
|
+
*
|
|
48
|
+
* 无环性:sanitizer-pipeline 的 inject 是 [privacyPolicy, auditLog]、
|
|
49
|
+
* model-router 的 inject 是 [llm] —— 两个都不依赖本行,硬声明不会成环
|
|
50
|
+
* (inject 是「服务有没有」,不是「谁先谁后」)。
|
|
51
|
+
*
|
|
52
|
+
* ⚠️ 两种布局各取一半(与 §7.151 的关系):
|
|
53
|
+
* - 桌面 preset 布局:patch row 自带 `inject: [llm, auditLog]`,
|
|
54
|
+
* row 级声明**覆盖**这里的 TS export ⇒ TS 侧加了也没用,出网读取靠
|
|
55
|
+
* §7.151 的 `ctx.get()` 软取 + fallback 兜住(见 localProviders)。
|
|
56
|
+
* - 独立 HTTP profile(宿主树):insert row 不能带 inject(§7.101.x),
|
|
57
|
+
* 生效的就是**这份 TS 声明** ⇒ 本行是唯一可用的修法;已实机验证
|
|
58
|
+
* CLOUD 直连池 /v1/chat 200(sanitizer 直取在 row 覆盖不到的地方仍会炸,
|
|
59
|
+
* 所以这两项声明在宿主树布局是**必需**的,不是冗余)。
|
|
60
|
+
*/
|
|
61
|
+
export declare const inject: readonly ["llm", "auditLog", "inputGuard", "sanitizer", "modelRouter"];
|
|
62
|
+
/** Minimal interface our adapter needs from the audit-log service. */
|
|
63
|
+
interface AuditLike {
|
|
64
|
+
log(entry: {
|
|
65
|
+
level: 'debug' | 'info' | 'warn' | 'error' | 'security';
|
|
66
|
+
kind: string;
|
|
67
|
+
source: string;
|
|
68
|
+
payload: Record<string, unknown>;
|
|
69
|
+
}): Promise<unknown>;
|
|
70
|
+
}
|
|
71
|
+
/** Minimal duck-typed handle for Cordis `LoggerService`. Used by tests to stub
|
|
72
|
+
* logger behavior; `apply()` injects the live `ctx.logger` from Cordis. */
|
|
73
|
+
type LoggerLike = Pick<LoggerService, 'info' | 'warn' | 'error' | 'debug'>;
|
|
74
|
+
/**
|
|
75
|
+
* Minimal interface for input-guard's orphan-tool-call sanitizer
|
|
76
|
+
* (added 2026-08-31). cloud-llm-adapter injects `'inputGuard'` and
|
|
77
|
+
* calls this before buildChatCompletionsBody to avoid DeepSeek 400
|
|
78
|
+
* errors when session history has orphaned tool_calls.
|
|
79
|
+
*/
|
|
80
|
+
interface InputGuardLike {
|
|
81
|
+
sanitizeOrphanToolCalls(messages: ReadonlyArray<Record<string, unknown>>, sessionId?: string): {
|
|
82
|
+
messages: Array<Record<string, unknown>>;
|
|
83
|
+
orphanCount: number;
|
|
84
|
+
syntheticInjected: number;
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* 出网准备结果。 */
|
|
89
|
+
export interface CloudEgressResult {
|
|
90
|
+
/** 真正发出去的消息(已裁剪 + 已脱敏)。 */
|
|
91
|
+
messages: EgressMessage[];
|
|
92
|
+
/** 被拦下的本地段消息条数。 */
|
|
93
|
+
droppedCount: number;
|
|
94
|
+
/** 脱敏替换次数。 */
|
|
95
|
+
replacements: number;
|
|
96
|
+
/** 是否真的做了脱敏(sanitizer 缺席 → false)。 */
|
|
97
|
+
sanitized: boolean;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* §7.131 (2026-10-27): 出网准备器 —— 裁剪 + 脱敏。
|
|
101
|
+
*
|
|
102
|
+
* **为什么 ctx 在这里而不是 apply() 时取**:`cordis.patch.yml` 里
|
|
103
|
+
* cloud-llm-adapter(373) 排在 sanitizer-pipeline(506) **之前**,所以 apply()
|
|
104
|
+
* 执行的那一刻 `ctx.sanitizer` 还是 undefined。但 stream() 是 boot 完成后的
|
|
105
|
+
* 运行时调用 —— 那时所有插件都已 apply,ctx 完整。所以这里持有 ctx,在
|
|
106
|
+
* **运行时**再取 sanitizer。
|
|
107
|
+
*
|
|
108
|
+
* ⚠️ §7.152 修正:运行时取 ≠ 能取到。cordis 的 Context 是 Proxy,
|
|
109
|
+
* `inject` 未声明的服务在运行时访问照样抛
|
|
110
|
+
* `cannot get property "X" without inject`(类型断言绕不过 Proxy)。
|
|
111
|
+
* 宿主树布局里 `sanitizer` / `modelRouter` 已**声明进 inject**(见上方
|
|
112
|
+
* 注释);preset 布局里 row 级 inject 会覆盖 TS 声明,那边靠 §7.151 的
|
|
113
|
+
* `ctx.get()` 软取兜底。这里保留 ctx 是因为取到的必须是**运行时那一份实例**。
|
|
114
|
+
*
|
|
115
|
+
* 同理 `ctx.inputGuard` 也是运行时才拿得到 —— apply() 时取到的那个
|
|
116
|
+
* `inputGuard` 一直是 undefined(§7.17 的孤儿 tool_call 清洗在当前部署下
|
|
117
|
+
* 因此是**失效**的)。本轮不改那件事,只把脱敏需要的 sanitizer 运行时取到。
|
|
118
|
+
*/
|
|
119
|
+
export declare class CloudEgressGuard {
|
|
120
|
+
private readonly ctx;
|
|
121
|
+
constructor(ctx: Context);
|
|
122
|
+
/** 运行时取 sanitizer(apply 时拿不到,见类注释)。 */
|
|
123
|
+
private sanitizer;
|
|
124
|
+
/**
|
|
125
|
+
* 运行时取本地 provider 名单。
|
|
126
|
+
*
|
|
127
|
+
* 用 model-router 的 `listDetailed()`(带 realm 标注)—— 与路由判定同一份
|
|
128
|
+
* 事实源,避免「出网裁剪认为它是本地、路由认为它是云」这种口径漂移。
|
|
129
|
+
* model-router 在 patch 里排在 cloud-llm-adapter 之后,所以同样运行时取。
|
|
130
|
+
*
|
|
131
|
+
* §7.151 (2026-10-29): **必须走 `ctx.get()` 而不是 `ctx.modelRouter` 直取**。
|
|
132
|
+
* cordis 4.x 的 ctx 是 Proxy:读一个既没 provide、也不在生效 `inject` 里的
|
|
133
|
+
* 属性会**直接抛** `cannot get property "modelRouter" without inject`。
|
|
134
|
+
* preset 布局里 row 级 `inject: [llm, auditLog]` 覆盖 TS 声明(不含
|
|
135
|
+
* modelRouter),直取会让 §7.131 的裁剪在真机上抛错 ⇒ 出网准备失败 ⇒ 整轮
|
|
136
|
+
* 以 `SANITIZE_FAILED` 失败(裁剪从来就没跑起来过)。
|
|
137
|
+
* §7.152 注:宿主树 profile 的 TS inject 现已声明 modelRouter,直取合法;
|
|
138
|
+
* 这里的 `ctx.get()` + fallback 仍然保留 —— preset 布局只认它,且两种
|
|
139
|
+
* 布局共用这一份代码。
|
|
140
|
+
*/
|
|
141
|
+
private localProviders;
|
|
142
|
+
/**
|
|
143
|
+
* 裁剪到「只带云段历史 + 本轮」,并对保留块做可逆脱敏。
|
|
144
|
+
*
|
|
145
|
+
* 脱敏失败(占位符超限等)→ 抛错,**fail-closed**:宁可这一轮不出网,
|
|
146
|
+
* 也不放行半脱敏文本(与 sanitizer-pipeline 的既有语义一致)。
|
|
147
|
+
*/
|
|
148
|
+
prepare(messages: readonly EgressMessage[], sessionId: string | undefined): Promise<CloudEgressResult>;
|
|
149
|
+
private sanitizeMessage;
|
|
150
|
+
}
|
|
151
|
+
export interface Config {
|
|
152
|
+
/** Provider route ids this adapter owns; defaults match DeepSeek. */
|
|
153
|
+
providers: string[];
|
|
154
|
+
/**
|
|
155
|
+
* Wire endpoint base; `/chat/completions` is appended.
|
|
156
|
+
* §7.100: EMPTY (default) = DELEGATE mode — the `cloud-llm` route becomes a
|
|
157
|
+
* pure forwarding shell onto the host profile's configured model provider.
|
|
158
|
+
* Non-empty = the classic direct-connect client below, byte-for-byte unchanged.
|
|
159
|
+
*/
|
|
160
|
+
baseUrl: string;
|
|
161
|
+
/** Process-env slot carrying the bearer key (never read at config time). Direct mode only. */
|
|
162
|
+
apiKeyEnv: string;
|
|
163
|
+
/** §7.102: literal bearer key from config/edge.json (secrets.*).
|
|
164
|
+
* Preferred over apiKeyEnv when both are present. */
|
|
165
|
+
apiKey?: string;
|
|
166
|
+
/** Default model id when the request omits one. Direct mode only (delegate carries it for forensics). */
|
|
167
|
+
defaultModel: string;
|
|
168
|
+
/** Per-request temperature. Omit when the model is fixed. */
|
|
169
|
+
temperature?: number;
|
|
170
|
+
/** Delegate step-1 explicit target route id (overrides selection/probe). */
|
|
171
|
+
delegateProvider?: string;
|
|
172
|
+
/** Delegate wire model override; beats host selection / probe model. */
|
|
173
|
+
delegateModel?: string;
|
|
174
|
+
/** Kill switch: false = never delegate. With an empty baseUrl, cloud turns
|
|
175
|
+
* then fail loudly (input-guard restores §7.35 downgrade-to-LOCAL). */
|
|
176
|
+
delegateEnabled?: boolean;
|
|
177
|
+
}
|
|
178
|
+
export declare const Config: Schema<Config>;
|
|
179
|
+
export interface CloudLlmAdapter {
|
|
180
|
+
readonly providers: string[];
|
|
181
|
+
stream(options: GenerateOptions): AsyncIterable<StreamChunk>;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Minimal DeepSeek-compatible adapter. Reads the bearer key lazily on
|
|
185
|
+
* each stream call so a config update takes effect without a re-register.
|
|
186
|
+
*/
|
|
187
|
+
export declare class CloudLlmAdapterImpl extends LlmAdapter {
|
|
188
|
+
private readonly providersList;
|
|
189
|
+
private readonly baseUrl;
|
|
190
|
+
private readonly apiKeyEnv;
|
|
191
|
+
private readonly apiKey;
|
|
192
|
+
private readonly defaultModel;
|
|
193
|
+
private readonly temperature;
|
|
194
|
+
private readonly auditLog;
|
|
195
|
+
private readonly inputGuard;
|
|
196
|
+
private readonly logger;
|
|
197
|
+
/** §7.131: 出网准备器(裁剪云段 + 脱敏)。 */
|
|
198
|
+
private readonly egress;
|
|
199
|
+
constructor(config: Config, auditLog?: AuditLike, inputGuard?: InputGuardLike, logger?: LoggerLike, egress?: CloudEgressGuard);
|
|
200
|
+
private audit;
|
|
201
|
+
/**
|
|
202
|
+
* §7.118: 当前生效的 LLM trace 配置。
|
|
203
|
+
*
|
|
204
|
+
* 每次调用现取,而不是在 apply() 里存一份 —— `loadEdgeConfig()` 自带
|
|
205
|
+
* mtime+size 指纹缓存,改了 config/edge.json 立刻生效,不用重启进程。
|
|
206
|
+
* 指纹命中时只付一次 statSync,相对一次 LLM 往返可以忽略。
|
|
207
|
+
*/
|
|
208
|
+
private traceConfig;
|
|
209
|
+
/**
|
|
210
|
+
* §7.118: 把详细的 request(messages + system + 参数)写进 ops log。
|
|
211
|
+
*
|
|
212
|
+
* 走 `info` 级别而不是 `debug` —— 运维出事之后 tail 的是 ops log,
|
|
213
|
+
* 不是 debug 日志。完整内容经过脱敏(凭据 + PII)与按字段截断,
|
|
214
|
+
* 详见 `./llm-trace.js`。
|
|
215
|
+
*
|
|
216
|
+
* 观测手段绝不能把主链路带崩:整段包在 try/catch 里。
|
|
217
|
+
*/
|
|
218
|
+
private traceRequest;
|
|
219
|
+
/**
|
|
220
|
+
* §7.118: 把详细的 response(正文 + tool calls + finish reason)写进 ops log。
|
|
221
|
+
*/
|
|
222
|
+
private traceResponse;
|
|
223
|
+
/**
|
|
224
|
+
* §7.133: trace 的统一出口 —— ops log + Edge 面板索引行 + 正文。
|
|
225
|
+
*
|
|
226
|
+
* 检测调用(安检 / 分类器)经 §7.132 的 `edgeInternalCaller` 标记带上
|
|
227
|
+
* caller —— 与主对话走的是同一段代码。
|
|
228
|
+
*/
|
|
229
|
+
private emit;
|
|
230
|
+
/** Mirror {@link CloudLlmAdapter.providers}; the upstream registry reads it. */
|
|
231
|
+
get providers(): string[];
|
|
232
|
+
providerInfo(provider: string): LlmProviderInfo;
|
|
233
|
+
/**
|
|
234
|
+
* §7.106 Option A: catalog deliberately empty — the cloud-llm route is
|
|
235
|
+
* pipeline plumbing (http-api delegate egress, internal routing), not a
|
|
236
|
+
* picker choice; advertising it let users accidentally select
|
|
237
|
+
* `cloud-llm/deepseek-chat` and exposed INVALID_CATALOG failures.
|
|
238
|
+
* Routing is unaffected ("catalog membership does not constrain core
|
|
239
|
+
* routing", dsh-llm lib/index.js:2080) and compaction gets its 65536 from
|
|
240
|
+
* resolveModel's context (§7.43), which stays.
|
|
241
|
+
*/
|
|
242
|
+
listModels(_provider: string): Promise<readonly LlmModelInfo[]>;
|
|
243
|
+
resolveModel(provider: string, model: string, _signal?: AbortSignal): Promise<LlmResolvedModelInfo>;
|
|
244
|
+
stream(options: GenerateOptions): AsyncIterable<StreamChunk>;
|
|
245
|
+
}
|
|
246
|
+
export interface CloudDelegateTarget {
|
|
247
|
+
/** Live host route to forward to. */
|
|
248
|
+
provider: string;
|
|
249
|
+
/** Wire model; undefined = resolve at stream time (host first model id). */
|
|
250
|
+
model?: string;
|
|
251
|
+
/** Which resolution step produced this — forensic provenance in audit. */
|
|
252
|
+
source: 'env' | 'selection' | 'probe';
|
|
253
|
+
}
|
|
254
|
+
/** Minimal live-topology surface the delegate needs from ctx.llm. */
|
|
255
|
+
export interface DelegateLlmLike {
|
|
256
|
+
listProviders(): Array<{
|
|
257
|
+
id: string;
|
|
258
|
+
name: string;
|
|
259
|
+
}>;
|
|
260
|
+
stream(options: GenerateOptions): AsyncIterable<StreamChunk> | Promise<AsyncIterable<StreamChunk>>;
|
|
261
|
+
listModels(provider: string): Promise<readonly LlmModelInfo[]>;
|
|
262
|
+
resolveModelInfo?(provider: string, model: string, signal?: AbortSignal): Promise<LlmResolvedModelInfo>;
|
|
263
|
+
}
|
|
264
|
+
/** Structural view of `@deepseek-ai/dsh-agent-default-model`'s service. */
|
|
265
|
+
export interface AgentDefaultModelLike {
|
|
266
|
+
currentSelection(): {
|
|
267
|
+
provider?: string;
|
|
268
|
+
model?: string;
|
|
269
|
+
} | undefined;
|
|
270
|
+
}
|
|
271
|
+
export interface DelegateAccessors {
|
|
272
|
+
llm: DelegateLlmLike;
|
|
273
|
+
/** Soft dep: absent in minimal/headless graphs without dsh-base. */
|
|
274
|
+
getAgentDefaultModel(): AgentDefaultModelLike | undefined;
|
|
275
|
+
}
|
|
276
|
+
export interface DelegateConfigLike {
|
|
277
|
+
/** Own route ids (the cloud-llm set) — recursion guard. */
|
|
278
|
+
providers: string[];
|
|
279
|
+
delegateProvider?: string;
|
|
280
|
+
delegateModel?: string;
|
|
281
|
+
delegateEnabled?: boolean;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Pure resolution probe — exported for input-guard's `cloudAvailable()`
|
|
285
|
+
* (same chain, sync only: no async model fetch). Returns null when no
|
|
286
|
+
* usable cloud target exists.
|
|
287
|
+
*/
|
|
288
|
+
export declare function probeCloudTarget(accessors: DelegateAccessors, cfg: DelegateConfigLike): CloudDelegateTarget | null;
|
|
289
|
+
/**
|
|
290
|
+
* §7.180 (2026-11-11): 委托目标的**共享缓存**。
|
|
291
|
+
*
|
|
292
|
+
* 背景(主人实测 2026-11-11 13:52,桌面 App):边缘模式会话在宿主的模型
|
|
293
|
+
* 选择器里显示「请选择模型」。宿主 `buildModelCatalog` 会把 `listModels()`
|
|
294
|
+
* 返回空数组的 provider **整组剔掉**(`groups.filter(g => g.models.length > 0)`),
|
|
295
|
+
* 而本地池此前恒返回空目录(§7.106 Option A)⇒ 本地池根本不在目录里,
|
|
296
|
+
* 选择器自然找不到与会话选择匹配的那一项(`currentChoice` 为 undefined)。
|
|
297
|
+
*
|
|
298
|
+
* 修法不是「目录里随便写个名字」,而是让三处**读同一份委托目标**:
|
|
299
|
+
*
|
|
300
|
+
* - wire(`stream()`):委托目标 → `target.model ?? firstModelId(target)`;
|
|
301
|
+
* - 目录(`listModels()`):同一个目标 → 同一条 wire model id;
|
|
302
|
+
* - 补钉(input-guard):同一个目标 → 同一个 id。
|
|
303
|
+
*
|
|
304
|
+
* ⇒ 宿主选择器上显示的名字 = 真正会跑的那个模型(§7.176 口径)。
|
|
305
|
+
*
|
|
306
|
+
* 条目按「委托旋钮」分键,并校验 `llm` 服务身份:换一个 llm 服务实例
|
|
307
|
+
* (测试里的假 llm、宿主重连后的新实例)各自解析,不会串味。
|
|
308
|
+
*/
|
|
309
|
+
export declare class DelegateTargetCache {
|
|
310
|
+
private readonly entries;
|
|
311
|
+
/**
|
|
312
|
+
* 缓存键:只跟委托旋钮有关 —— 两个自有池互相排除(§7.171 递归护栏),
|
|
313
|
+
* 所以 `providers` 不影响解析结果,不必进键。
|
|
314
|
+
*/
|
|
315
|
+
static key(cfg: DelegateConfigLike): string;
|
|
316
|
+
/** 命中返回目标(含 null = 已探到「没有可用目标」);未命中返回 undefined。 */
|
|
317
|
+
get(llm: unknown, cfg: DelegateConfigLike): CloudDelegateTarget | null | undefined;
|
|
318
|
+
set(llm: unknown, cfg: DelegateConfigLike, target: CloudDelegateTarget | null): void;
|
|
319
|
+
/** 宿主路由拓扑变了(`llm/adapters-updated`)⇒ 丢掉全部条目。 */
|
|
320
|
+
clear(): void;
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* §7.180: **本地池**共享的那一份委托目标缓存。
|
|
324
|
+
*
|
|
325
|
+
* wire(local-llm-adapter 的 DELEGATE 分支)、目录(`listModels()`)与会话
|
|
326
|
+
* 补钉(input-guard)三处都读它 ⇒ 三处永远说同一个模型。
|
|
327
|
+
* 云池不共用(§7.106:云池在目录里隐身,没有第二个消费方)。
|
|
328
|
+
*/
|
|
329
|
+
export declare const localPoolTargetCache: DelegateTargetCache;
|
|
330
|
+
export declare class CloudLlmDelegateAdapterImpl extends LlmAdapter {
|
|
331
|
+
private readonly providersList;
|
|
332
|
+
private readonly cfg;
|
|
333
|
+
private readonly accessors;
|
|
334
|
+
private readonly auditLog;
|
|
335
|
+
private readonly inputGuard;
|
|
336
|
+
private readonly logger;
|
|
337
|
+
/** §7.131: 出网准备器(裁剪云段 + 脱敏)。 */
|
|
338
|
+
private readonly egress;
|
|
339
|
+
/**
|
|
340
|
+
* §7.171: 这一池的隐私口径。
|
|
341
|
+
*
|
|
342
|
+
* - `'cloud'`(默认):云池 —— 出网裁剪(只带云段历史)+ 脱敏。
|
|
343
|
+
* - `'local'`:本地池 —— **不裁**(带全部历史)+ 不脱敏(§7.131 不对称规则)。
|
|
344
|
+
*
|
|
345
|
+
* delegate 只改变「谁提供模型」,不改变口径 —— 两个池共用同一套转发机制,
|
|
346
|
+
* 只有这一处口径开关不同。
|
|
347
|
+
*/
|
|
348
|
+
private readonly poolKind;
|
|
349
|
+
/**
|
|
350
|
+
* §7.180: 委托目标缓存。
|
|
351
|
+
*
|
|
352
|
+
* 默认每实例一份(云池:目录里隐身,没有第二个消费方);本地池改用
|
|
353
|
+
* `localPoolTargetCache` —— wire / 目录 / 会话补钉共用一份 ⇒ 三处永远
|
|
354
|
+
* 说同一个模型。
|
|
355
|
+
*/
|
|
356
|
+
private readonly targetCache;
|
|
357
|
+
/** provider → first advertised model id, so stream() never re-fetches lists. */
|
|
358
|
+
private readonly modelIdCache;
|
|
359
|
+
constructor(config: DelegateConfigLike, accessors: DelegateAccessors, auditLog?: AuditLike, inputGuard?: InputGuardLike, logger?: LoggerLike, egress?: CloudEgressGuard,
|
|
360
|
+
/** §7.171: 本地池 = 'local'(不裁剪);云池 = 'cloud'(默认,裁剪)。 */
|
|
361
|
+
poolKind?: 'local' | 'cloud',
|
|
362
|
+
/**
|
|
363
|
+
* §7.180: 委托目标缓存。默认每实例一份;本地池传入共享的
|
|
364
|
+
* `localPoolTargetCache`,让 wire / 目录 / 会话补钉共用同一份目标。
|
|
365
|
+
*/
|
|
366
|
+
targetCache?: DelegateTargetCache);
|
|
367
|
+
private audit;
|
|
368
|
+
/** §7.171: 审计 kind 的池前缀(`llm.local.*` / `llm.cloud.*`)。 */
|
|
369
|
+
private poolTag;
|
|
370
|
+
/** §7.171: 本池在宿主侧的 provider 名(`local-llm` / `cloud-llm`)。 */
|
|
371
|
+
private poolProvider;
|
|
372
|
+
/** §7.171: 日志前缀(`local-llm-adapter` / `cloud-llm-adapter`)。 */
|
|
373
|
+
private logTag;
|
|
374
|
+
/** `llm/adapters-updated` sink: drop cached target + model ids so the
|
|
375
|
+
* next call re-probes the new topology (host route churn is normal —
|
|
376
|
+
* llm-pi-ai itself re-registers via handle.replace on settings edits).
|
|
377
|
+
* §7.180: 本地池传进来的是**共享**缓存 ⇒ 这里一清,目录与补钉也跟着
|
|
378
|
+
* 重新解析,三处仍然同源。 */
|
|
379
|
+
invalidateTopology(): void;
|
|
380
|
+
/**
|
|
381
|
+
* §7.180: 委托目标(带缓存)。
|
|
382
|
+
*
|
|
383
|
+
* 命中共享缓存 ⇒ 与目录(`listModels()`)与会话补钉(input-guard)
|
|
384
|
+
* 拿到的是**同一个对象** ⇒ wire 上跑的模型 id 与界面上写的 id 必然一致。
|
|
385
|
+
*/
|
|
386
|
+
private resolveTarget;
|
|
387
|
+
get providers(): string[];
|
|
388
|
+
providerInfo(provider: string): LlmProviderInfo;
|
|
389
|
+
/**
|
|
390
|
+
* §7.180: **本地池**在模型目录里如实声明它真正会跑的那一个模型。
|
|
391
|
+
*
|
|
392
|
+
* 云池(`poolKind === 'cloud'`)保持 §7.106 Option A:目录恒空 —— 避免用户
|
|
393
|
+
* 误选 `cloud-llm/deepseek-chat`,也避免 INVALID_CATALOG。
|
|
394
|
+
*
|
|
395
|
+
* 本地池相反:边缘模式会话就该指向本地池,目录里没有它 ⇒ 宿主选择器只能
|
|
396
|
+
* 显示「请选择模型」(主人 13:52 实测)。这里声明的 id 与 wire 上真正跑的
|
|
397
|
+
* 那个**同源**(同一个委托目标 + 同一个 firstModelId 回填)⇒ 选择器上
|
|
398
|
+
* 写的名字 = 真正会跑的模型(§7.176)。
|
|
399
|
+
*/
|
|
400
|
+
listModels(provider: string): Promise<readonly LlmModelInfo[]>;
|
|
401
|
+
resolveModel(provider: string, model: string, signal?: AbortSignal): Promise<LlmResolvedModelInfo>;
|
|
402
|
+
private firstModelId;
|
|
403
|
+
/**
|
|
404
|
+
* §7.180: wire 上真正会跑的 model id —— 与 `listModels()` 同一份口径。
|
|
405
|
+
*
|
|
406
|
+
* `target.model` 是委托解析链给定的 id;探针步没定 model 时取该 provider
|
|
407
|
+
* 的第一个 model id(adapter 的既有口径)。解析出来的 id **回填进缓存
|
|
408
|
+
* 目标** ⇒ 目录、补钉与 wire 三处共享同一个 id(`target` 是缓存里那个
|
|
409
|
+
* 对象本身,回填对三方同时可见)。
|
|
410
|
+
*/
|
|
411
|
+
private resolveWireModel;
|
|
412
|
+
stream(options: GenerateOptions): AsyncIterable<StreamChunk>;
|
|
413
|
+
}
|
|
414
|
+
export declare function apply(ctx: Context, config: Config): Promise<() => Promise<void>>;
|
|
415
|
+
export {};
|
|
416
|
+
//# sourceMappingURL=cloud-llm-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-llm-adapter.d.ts","sourceRoot":"","sources":["../../src/dsh-adapter/cloud-llm-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACjE,OAAO,MAAM,MAAM,0BAA0B,CAAA;AAC7C,OAAO,EAAsB,UAAU,EAAY,MAAM,sBAAsB,CAAA;AAC/E,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,eAAe,EACf,oBAAoB,EACpB,WAAW,EACZ,MAAM,sBAAsB,CAAA;AAgC7B,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,mBAAmB,CAAA;AAS1B,eAAO,MAAM,IAAI,sBAAsB,CAAA;AAEvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,MAAM,wEAAyE,CAAA;AAE5F,sEAAsE;AACtE,UAAU,SAAS;IACjB,GAAG,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAC1J;AAED;4EAC4E;AAC5E,KAAK,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,CAAA;AAE1E;;;;;GAKG;AACH,UAAU,cAAc;IACtB,uBAAuB,CACrB,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAChD,SAAS,CAAC,EAAE,MAAM,GACjB;QACD,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;QACxC,WAAW,EAAE,MAAM,CAAA;QACnB,iBAAiB,EAAE,MAAM,CAAA;KAC1B,CAAA;CACF;AAsBD;aACa;AACb,MAAM,WAAW,iBAAiB;IAChC,2BAA2B;IAC3B,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,mBAAmB;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,sCAAsC;IACtC,SAAS,EAAE,OAAO,CAAA;CACnB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,OAAO;IAEzC,uCAAuC;IACvC,OAAO,CAAC,SAAS;IAIjB;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,cAAc;IAmBtB;;;;;OAKG;IACG,OAAO,CACX,QAAQ,EAAE,SAAS,aAAa,EAAE,EAClC,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,OAAO,CAAC,iBAAiB,CAAC;YAwBf,eAAe;CAa9B;AAwDD,MAAM,WAAW,MAAM;IACrB,qEAAqE;IACrE,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB;;;;;OAKG;IACH,OAAO,EAAE,MAAM,CAAA;IACf,8FAA8F;IAC9F,SAAS,EAAE,MAAM,CAAA;IACjB;0DACsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,yGAAyG;IACzG,YAAY,EAAE,MAAM,CAAA;IACpB,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;4EACwE;IACxE,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,CAYhC,CAAA;AAEF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,CAAA;IAC5B,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,aAAa,CAAC,WAAW,CAAC,CAAA;CAC7D;AAED;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,UAAU;IACjD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAU;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA4B;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,gCAAgC;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;gBAEzC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,gBAAgB;IAc7H,OAAO,CAAC,KAAK;IAKb;;;;;;OAMG;IACH,OAAO,CAAC,WAAW;IAInB;;;;;;;;OAQG;IACH,OAAO,CAAC,YAAY;IA+BpB;;OAEG;IACH,OAAO,CAAC,aAAa;IAkCrB;;;;;OAKG;IACH,OAAO,CAAC,IAAI;IAsBZ,gFAAgF;IAChF,IAAI,SAAS,IAAI,MAAM,EAAE,CAExB;IAEQ,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe;IAIxD;;;;;;;;OAQG;IACM,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IAI/D,YAAY,CACnB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,oBAAoB,CAAC;IAahB,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,aAAa,CAAC,WAAW,CAAC;CAihB7E;AAwBD,MAAM,WAAW,mBAAmB;IAClC,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAA;IAChB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,0EAA0E;IAC1E,MAAM,EAAE,KAAK,GAAG,WAAW,GAAG,OAAO,CAAA;CACtC;AAED,qEAAqE;AACrE,MAAM,WAAW,eAAe;IAC9B,aAAa,IAAI,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACpD,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,aAAa,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAA;IAClG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC,CAAA;IAC9D,gBAAgB,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAA;CACxG;AAED,2EAA2E;AAC3E,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,IAAI;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAA;CACtE;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,eAAe,CAAA;IACpB,oEAAoE;IACpE,oBAAoB,IAAI,qBAAqB,GAAG,SAAS,CAAA;CAC1D;AAED,MAAM,WAAW,kBAAkB;IACjC,2DAA2D;IAC3D,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAMD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,iBAAiB,EAC5B,GAAG,EAAE,kBAAkB,GACtB,mBAAmB,GAAG,IAAI,CAqD5B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0E;IAElG;;;OAGG;IACH,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM;IAQ3C,oDAAoD;IACpD,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,kBAAkB,GAAG,mBAAmB,GAAG,IAAI,GAAG,SAAS;IAOlF,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,kBAAkB,EAAE,MAAM,EAAE,mBAAmB,GAAG,IAAI,GAAG,IAAI;IAIpF,gDAAgD;IAChD,KAAK,IAAI,IAAI;CAGd;AAED;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,qBAA4B,CAAA;AAE7D,qBAAa,2BAA4B,SAAQ,UAAU;IACzD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAU;IACxC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAoB;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA4B;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,gCAAgC;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;IACrD;;;;;;;;OAQG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAE5C;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,gFAAgF;IAChF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA4B;gBAGvD,MAAM,EAAE,kBAAkB,EAC1B,SAAS,EAAE,iBAAiB,EAC5B,QAAQ,CAAC,EAAE,SAAS,EACpB,UAAU,CAAC,EAAE,cAAc,EAC3B,MAAM,CAAC,EAAE,UAAU,EACnB,MAAM,CAAC,EAAE,gBAAgB;IACzB,sDAAsD;IACtD,QAAQ,GAAE,OAAO,GAAG,OAAiB;IACrC;;;OAGG;IACH,WAAW,GAAE,mBAA+C;IAc9D,OAAO,CAAC,KAAK;IAQb,2DAA2D;IAC3D,OAAO,CAAC,OAAO;IAIf,6DAA6D;IAC7D,OAAO,CAAC,YAAY;IAIpB,+DAA+D;IAC/D,OAAO,CAAC,MAAM;IAId;;;;uBAImB;IACnB,kBAAkB,IAAI,IAAI;IAK1B;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IASrB,IAAI,SAAS,IAAI,MAAM,EAAE,CAExB;IAEQ,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe;IAIxD;;;;;;;;;;OAUG;IACY,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IAkB9D,YAAY,CACzB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,oBAAoB,CAAC;YA4BlB,YAAY;IAa1B;;;;;;;OAOG;YACW,gBAAgB;IAMd,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,aAAa,CAAC,WAAW,CAAC;CA4M7E;AAUD,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CA4HtF"}
|