agents-bridge 0.1.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.
Files changed (139) hide show
  1. package/.env.example +20 -0
  2. package/LICENSE +21 -0
  3. package/README.md +259 -0
  4. package/bin/agent-bridge.mjs +12 -0
  5. package/config.example.json +117 -0
  6. package/dist/agents/cli-backends.d.ts +32 -0
  7. package/dist/agents/cli-backends.d.ts.map +1 -0
  8. package/dist/agents/cli-backends.js +217 -0
  9. package/dist/agents/cli-backends.js.map +1 -0
  10. package/dist/agents/cli-runner.d.ts.map +1 -0
  11. package/dist/agents/cli-runner.js +524 -0
  12. package/dist/agents/cli-runner.js.map +1 -0
  13. package/dist/agents/cli-session-store.d.ts.map +1 -0
  14. package/dist/agents/cli-session-store.js +127 -0
  15. package/dist/agents/cli-session-store.js.map +1 -0
  16. package/dist/agents/model-selection.d.ts +27 -0
  17. package/dist/agents/model-selection.d.ts.map +1 -0
  18. package/dist/agents/model-selection.js +40 -0
  19. package/dist/agents/model-selection.js.map +1 -0
  20. package/dist/agents/models-config.d.ts +28 -0
  21. package/dist/agents/models-config.d.ts.map +1 -0
  22. package/dist/agents/models-config.js +43 -0
  23. package/dist/agents/models-config.js.map +1 -0
  24. package/dist/channels/botlink.d.ts.map +1 -0
  25. package/dist/channels/botlink.js +320 -0
  26. package/dist/channels/botlink.js.map +1 -0
  27. package/dist/channels/command-gating.d.ts +20 -0
  28. package/dist/channels/command-gating.d.ts.map +1 -0
  29. package/dist/channels/command-gating.js +43 -0
  30. package/dist/channels/command-gating.js.map +1 -0
  31. package/dist/channels/draft-stream-controls.d.ts +21 -0
  32. package/dist/channels/draft-stream-controls.d.ts.map +1 -0
  33. package/dist/channels/draft-stream-controls.js +43 -0
  34. package/dist/channels/draft-stream-controls.js.map +1 -0
  35. package/dist/channels/draft-stream-loop.d.ts +31 -0
  36. package/dist/channels/draft-stream-loop.d.ts.map +1 -0
  37. package/dist/channels/draft-stream-loop.js +60 -0
  38. package/dist/channels/draft-stream-loop.js.map +1 -0
  39. package/dist/channels/mention-gating.d.ts +18 -0
  40. package/dist/channels/mention-gating.d.ts.map +1 -0
  41. package/dist/channels/mention-gating.js +20 -0
  42. package/dist/channels/mention-gating.js.map +1 -0
  43. package/dist/channels/registry.d.ts +5 -0
  44. package/dist/channels/registry.d.ts.map +1 -0
  45. package/dist/channels/registry.js +14 -0
  46. package/dist/channels/registry.js.map +1 -0
  47. package/dist/channels/run-state-machine.d.ts +21 -0
  48. package/dist/channels/run-state-machine.d.ts.map +1 -0
  49. package/dist/channels/run-state-machine.js +41 -0
  50. package/dist/channels/run-state-machine.js.map +1 -0
  51. package/dist/channels/session-envelope.d.ts +5 -0
  52. package/dist/channels/session-envelope.d.ts.map +1 -0
  53. package/dist/channels/session-envelope.js +13 -0
  54. package/dist/channels/session-envelope.js.map +1 -0
  55. package/dist/channels/session.d.ts +18 -0
  56. package/dist/channels/session.d.ts.map +1 -0
  57. package/dist/channels/session.js +35 -0
  58. package/dist/channels/session.js.map +1 -0
  59. package/dist/channels/typing-lifecycle.d.ts +16 -0
  60. package/dist/channels/typing-lifecycle.d.ts.map +1 -0
  61. package/dist/channels/typing-lifecycle.js +31 -0
  62. package/dist/channels/typing-lifecycle.js.map +1 -0
  63. package/dist/cli/cmd-config.d.ts +3 -0
  64. package/dist/cli/cmd-config.d.ts.map +1 -0
  65. package/dist/cli/cmd-config.js +15 -0
  66. package/dist/cli/cmd-config.js.map +1 -0
  67. package/dist/cli/cmd-doctor.d.ts +3 -0
  68. package/dist/cli/cmd-doctor.d.ts.map +1 -0
  69. package/dist/cli/cmd-doctor.js +80 -0
  70. package/dist/cli/cmd-doctor.js.map +1 -0
  71. package/dist/cli/cmd-logs.d.ts +3 -0
  72. package/dist/cli/cmd-logs.d.ts.map +1 -0
  73. package/dist/cli/cmd-logs.js +26 -0
  74. package/dist/cli/cmd-logs.js.map +1 -0
  75. package/dist/cli/cmd-onboard.d.ts +3 -0
  76. package/dist/cli/cmd-onboard.d.ts.map +1 -0
  77. package/dist/cli/cmd-onboard.js +103 -0
  78. package/dist/cli/cmd-onboard.js.map +1 -0
  79. package/dist/cli/cmd-start.d.ts +3 -0
  80. package/dist/cli/cmd-start.d.ts.map +1 -0
  81. package/dist/cli/cmd-start.js +155 -0
  82. package/dist/cli/cmd-start.js.map +1 -0
  83. package/dist/cli/cmd-status.d.ts +3 -0
  84. package/dist/cli/cmd-status.d.ts.map +1 -0
  85. package/dist/cli/cmd-status.js +16 -0
  86. package/dist/cli/cmd-status.js.map +1 -0
  87. package/dist/cli/cmd-stop.d.ts +3 -0
  88. package/dist/cli/cmd-stop.d.ts.map +1 -0
  89. package/dist/cli/cmd-stop.js +30 -0
  90. package/dist/cli/cmd-stop.js.map +1 -0
  91. package/dist/cli/pid-file.d.ts +7 -0
  92. package/dist/cli/pid-file.d.ts.map +1 -0
  93. package/dist/cli/pid-file.js +51 -0
  94. package/dist/cli/pid-file.js.map +1 -0
  95. package/dist/cli/run-main.d.ts +11 -0
  96. package/dist/cli/run-main.d.ts.map +1 -0
  97. package/dist/cli/run-main.js +64 -0
  98. package/dist/cli/run-main.js.map +1 -0
  99. package/dist/config/agent-dirs.d.ts +12 -0
  100. package/dist/config/agent-dirs.d.ts.map +1 -0
  101. package/dist/config/agent-dirs.js +30 -0
  102. package/dist/config/agent-dirs.js.map +1 -0
  103. package/dist/config/config.d.ts +3 -0
  104. package/dist/config/config.d.ts.map +1 -0
  105. package/dist/config/config.js +40 -0
  106. package/dist/config/config.js.map +1 -0
  107. package/dist/config/env-vars.d.ts +15 -0
  108. package/dist/config/env-vars.d.ts.map +1 -0
  109. package/dist/config/env-vars.js +16 -0
  110. package/dist/config/env-vars.js.map +1 -0
  111. package/dist/config/merge-config.d.ts +7 -0
  112. package/dist/config/merge-config.d.ts.map +1 -0
  113. package/dist/config/merge-config.js +32 -0
  114. package/dist/config/merge-config.js.map +1 -0
  115. package/dist/config/paths.d.ts +19 -0
  116. package/dist/config/paths.d.ts.map +1 -0
  117. package/dist/config/paths.js +22 -0
  118. package/dist/config/paths.js.map +1 -0
  119. package/dist/config/zod-schema.d.ts +1192 -0
  120. package/dist/config/zod-schema.d.ts.map +1 -0
  121. package/dist/config/zod-schema.js +107 -0
  122. package/dist/config/zod-schema.js.map +1 -0
  123. package/dist/console-encoding.d.ts +6 -0
  124. package/dist/console-encoding.d.ts.map +1 -0
  125. package/dist/console-encoding.js +35 -0
  126. package/dist/console-encoding.js.map +1 -0
  127. package/dist/entry.d.ts +3 -0
  128. package/dist/entry.d.ts.map +1 -0
  129. package/dist/entry.js +47 -0
  130. package/dist/entry.js.map +1 -0
  131. package/dist/logger.d.ts +4 -0
  132. package/dist/logger.d.ts.map +1 -0
  133. package/dist/logger.js +19 -0
  134. package/dist/logger.js.map +1 -0
  135. package/dist/types/index.d.ts +67 -0
  136. package/dist/types/index.d.ts.map +1 -0
  137. package/dist/types/index.js +2 -0
  138. package/dist/types/index.js.map +1 -0
  139. package/package.json +55 -0
@@ -0,0 +1,127 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';
3
+ import { dirname } from 'node:path';
4
+ import { randomUUID } from 'node:crypto';
5
+ import { DATA_CLI_SESSION_STORE_PATH } from '../config/paths.js';
6
+ import { normalizeProviderId } from './cli-backends.js';
7
+ function cloneEntry(entry) {
8
+ return {
9
+ ...entry,
10
+ cliSessionIds: entry.cliSessionIds ? { ...entry.cliSessionIds } : undefined,
11
+ };
12
+ }
13
+ export class CliSessionStore {
14
+ filePath;
15
+ cache = null;
16
+ queue = Promise.resolve();
17
+ constructor(filePath = DATA_CLI_SESSION_STORE_PATH) {
18
+ this.filePath = filePath;
19
+ }
20
+ async get(sessionKey) {
21
+ const store = await this.load();
22
+ const entry = store.sessions[sessionKey];
23
+ return entry ? cloneEntry(entry) : undefined;
24
+ }
25
+ async ensureSession(sessionKey, metadata) {
26
+ return this.mutate((store) => {
27
+ const existing = store.sessions[sessionKey];
28
+ const entry = {
29
+ runtimeSessionId: existing?.runtimeSessionId ?? randomUUID(),
30
+ updatedAt: Date.now(),
31
+ provider: metadata?.provider ?? existing?.provider,
32
+ model: metadata?.model ?? existing?.model,
33
+ cliSessionIds: existing?.cliSessionIds ? { ...existing.cliSessionIds } : undefined,
34
+ };
35
+ store.sessions[sessionKey] = entry;
36
+ return cloneEntry(entry);
37
+ });
38
+ }
39
+ async getCliSessionId(sessionKey, provider) {
40
+ const entry = await this.get(sessionKey);
41
+ const normalized = normalizeProviderId(provider);
42
+ const sessionId = entry?.cliSessionIds?.[normalized]?.trim();
43
+ return sessionId || undefined;
44
+ }
45
+ async setCliSessionId(sessionKey, provider, cliSessionId, metadata) {
46
+ return this.mutate((store) => {
47
+ const normalized = normalizeProviderId(provider);
48
+ const trimmedSessionId = cliSessionId.trim();
49
+ const existing = store.sessions[sessionKey];
50
+ const cliSessionIds = { ...(existing?.cliSessionIds ?? {}) };
51
+ if (trimmedSessionId) {
52
+ cliSessionIds[normalized] = trimmedSessionId;
53
+ }
54
+ const entry = {
55
+ runtimeSessionId: existing?.runtimeSessionId ?? randomUUID(),
56
+ updatedAt: Date.now(),
57
+ provider: normalized,
58
+ model: metadata?.model ?? existing?.model,
59
+ cliSessionIds,
60
+ };
61
+ store.sessions[sessionKey] = entry;
62
+ return cloneEntry(entry);
63
+ });
64
+ }
65
+ async clearCliSessionId(sessionKey, provider, metadata) {
66
+ return this.mutate((store) => {
67
+ const normalized = normalizeProviderId(provider);
68
+ const existing = store.sessions[sessionKey];
69
+ if (!existing) {
70
+ return undefined;
71
+ }
72
+ const cliSessionIds = { ...(existing.cliSessionIds ?? {}) };
73
+ delete cliSessionIds[normalized];
74
+ const hasCliSessions = Object.keys(cliSessionIds).length > 0;
75
+ const entry = {
76
+ runtimeSessionId: existing.runtimeSessionId,
77
+ updatedAt: Date.now(),
78
+ provider: normalized,
79
+ model: metadata?.model ?? existing.model,
80
+ cliSessionIds: hasCliSessions ? cliSessionIds : undefined,
81
+ };
82
+ store.sessions[sessionKey] = entry;
83
+ return cloneEntry(entry);
84
+ });
85
+ }
86
+ async mutate(mutator) {
87
+ const previous = this.queue;
88
+ let release;
89
+ this.queue = new Promise((resolve) => {
90
+ release = resolve;
91
+ });
92
+ await previous;
93
+ try {
94
+ const store = await this.load();
95
+ const result = await mutator(store);
96
+ await this.save(store);
97
+ return result;
98
+ }
99
+ finally {
100
+ release();
101
+ }
102
+ }
103
+ async load() {
104
+ if (this.cache) {
105
+ return this.cache;
106
+ }
107
+ await mkdir(dirname(this.filePath), { recursive: true });
108
+ if (!existsSync(this.filePath)) {
109
+ this.cache = { version: 1, sessions: {} };
110
+ return this.cache;
111
+ }
112
+ const raw = await readFile(this.filePath, 'utf-8');
113
+ const parsed = JSON.parse(raw);
114
+ this.cache = {
115
+ version: 1,
116
+ sessions: parsed.sessions ?? {},
117
+ };
118
+ return this.cache;
119
+ }
120
+ async save(store) {
121
+ await mkdir(dirname(this.filePath), { recursive: true });
122
+ const tempPath = `${this.filePath}.tmp`;
123
+ await writeFile(tempPath, JSON.stringify(store, null, 2) + '\n', 'utf-8');
124
+ await rename(tempPath, this.filePath);
125
+ }
126
+ }
127
+ //# sourceMappingURL=cli-session-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-session-store.js","sourceRoot":"","sources":["../../src/agents/cli-session-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Model selection — 解析 provider/model 引用,支持 fallback
3
+ *
4
+ * model reference 格式: "provider/model"
5
+ * - "claude-cli/opus-4.6" → CLI backend
6
+ * - "codex-cli/gpt-5.3-codex" → CLI backend
7
+ * - "anthropic/claude-sonnet-4-6" → API provider (Pi mode)
8
+ * - "openai/gpt-5.2" → API provider (Pi mode)
9
+ *
10
+ * TODO: Phase 3 实现 fallback 逻辑
11
+ */
12
+ export type ModelMode = 'cli' | 'api';
13
+ export interface ResolvedModel {
14
+ mode: ModelMode;
15
+ provider: string;
16
+ model: string;
17
+ ref: string;
18
+ }
19
+ /**
20
+ * 解析单个 model reference
21
+ */
22
+ export declare function resolveModelRef(ref: string): ResolvedModel;
23
+ /**
24
+ * 按优先级解析 model references,返回 primary + fallbacks
25
+ */
26
+ export declare function resolveModelChain(primary: string, fallbacks?: string[]): ResolvedModel[];
27
+ //# sourceMappingURL=model-selection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-selection.d.ts","sourceRoot":"","sources":["../../src/agents/model-selection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAGzD,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,CAAA;AAErC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,SAAS,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;CACZ;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAO1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,EAAE,EACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAC1C,aAAa,EAAE,CAajB"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Model selection — 解析 provider/model 引用,支持 fallback
3
+ *
4
+ * model reference 格式: "provider/model"
5
+ * - "claude-cli/opus-4.6" → CLI backend
6
+ * - "codex-cli/gpt-5.3-codex" → CLI backend
7
+ * - "anthropic/claude-sonnet-4-6" → API provider (Pi mode)
8
+ * - "openai/gpt-5.2" → API provider (Pi mode)
9
+ *
10
+ * TODO: Phase 3 实现 fallback 逻辑
11
+ */
12
+ import { isCliBackend, extractProvider, extractModel } from './cli-backends.js';
13
+ /**
14
+ * 解析单个 model reference
15
+ */
16
+ export function resolveModelRef(ref) {
17
+ return {
18
+ mode: isCliBackend(ref) ? 'cli' : 'api',
19
+ provider: extractProvider(ref),
20
+ model: extractModel(ref) || ref,
21
+ ref,
22
+ };
23
+ }
24
+ /**
25
+ * 按优先级解析 model references,返回 primary + fallbacks
26
+ */
27
+ export function resolveModelChain(primary, fallbacks, backends) {
28
+ const resolveOne = (ref) => ({
29
+ mode: isCliBackend(ref, backends) ? 'cli' : 'api',
30
+ provider: extractProvider(ref),
31
+ model: extractModel(ref) || ref,
32
+ ref,
33
+ });
34
+ const chain = [resolveOne(primary)];
35
+ if (fallbacks) {
36
+ chain.push(...fallbacks.map(resolveOne));
37
+ }
38
+ return chain;
39
+ }
40
+ //# sourceMappingURL=model-selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-selection.js","sourceRoot":"","sources":["../../src/agents/model-selection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAW/E;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,OAAO;QACL,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;QACvC,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC;QAC9B,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG;QAC/B,GAAG;KACJ,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,SAAoB,EACpB,QAA2C;IAE3C,MAAM,UAAU,GAAG,CAAC,GAAW,EAAiB,EAAE,CAAC,CAAC;QAClD,IAAI,EAAE,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;QACjD,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC;QAC9B,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG;QAC/B,GAAG;KACJ,CAAC,CAAA;IAEF,MAAM,KAAK,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAA;IACnC,IAAI,SAAS,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAA;IAC1C,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Models config — 模型/CLI backend 配置解析
3
+ *
4
+ * 从 agents.defaults 中解析完整的模型配置,确定:
5
+ * 1. 使用哪个 model reference(primary or fallback)
6
+ * 2. 如果是 CLI backend,查找对应的 cliBackends 配置
7
+ * 3. 如果是 API provider,走原生 provider 栈
8
+ *
9
+ * TODO: Phase 3 实现
10
+ */
11
+ import type { CliBackendConfig } from '../types/index.js';
12
+ import type { AgentDefaultsConfig } from '../config/zod-schema.js';
13
+ import { type ResolvedModel } from './model-selection.js';
14
+ export interface ModelsConfig {
15
+ /** Primary model + fallbacks, resolved */
16
+ chain: ResolvedModel[];
17
+ /** CLI backend configs keyed by provider name (e.g. "claude-cli") */
18
+ cliBackends: Record<string, CliBackendConfig>;
19
+ }
20
+ /**
21
+ * 从 agent defaults 配置构建完整的 models config
22
+ */
23
+ export declare function buildModelsConfig(defaults: AgentDefaultsConfig): ModelsConfig;
24
+ /**
25
+ * 获取 primary model 对应的 CLI backend 配置(如果是 CLI 模式)
26
+ */
27
+ export declare function getPrimaryCliBackend(config: ModelsConfig): CliBackendConfig | undefined;
28
+ //# sourceMappingURL=models-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models-config.d.ts","sourceRoot":"","sources":["../../src/agents/models-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAClE,OAAO,EAAqB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAQ5E,MAAM,WAAW,YAAY;IAC3B,0CAA0C;IAC1C,KAAK,EAAE,aAAa,EAAE,CAAA;IACtB,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;CAC9C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,YAAY,CAyB7E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,gBAAgB,GAAG,SAAS,CAIvF"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Models config — 模型/CLI backend 配置解析
3
+ *
4
+ * 从 agents.defaults 中解析完整的模型配置,确定:
5
+ * 1. 使用哪个 model reference(primary or fallback)
6
+ * 2. 如果是 CLI backend,查找对应的 cliBackends 配置
7
+ * 3. 如果是 API provider,走原生 provider 栈
8
+ *
9
+ * TODO: Phase 3 实现
10
+ */
11
+ import { resolveModelChain } from './model-selection.js';
12
+ import { normalizeProviderId, resolveCliBackend, resolveCliBackendConfig, resolveCliBackendIds, } from './cli-backends.js';
13
+ /**
14
+ * 从 agent defaults 配置构建完整的 models config
15
+ */
16
+ export function buildModelsConfig(defaults) {
17
+ const chain = resolveModelChain(defaults.model.primary, defaults.model.fallbacks, defaults.cliBackends);
18
+ const cliBackends = {};
19
+ const fakeConfig = { agents: { defaults } };
20
+ for (const providerId of resolveCliBackendIds(fakeConfig)) {
21
+ const resolved = resolveCliBackendConfig(providerId, fakeConfig);
22
+ if (resolved) {
23
+ cliBackends[resolved.id] = resolved.config;
24
+ }
25
+ }
26
+ if (defaults.cliBackends) {
27
+ for (const [name, config] of Object.entries(defaults.cliBackends)) {
28
+ const providerId = normalizeProviderId(name);
29
+ cliBackends[providerId] = cliBackends[providerId] ?? config;
30
+ }
31
+ }
32
+ return { chain, cliBackends };
33
+ }
34
+ /**
35
+ * 获取 primary model 对应的 CLI backend 配置(如果是 CLI 模式)
36
+ */
37
+ export function getPrimaryCliBackend(config) {
38
+ const primary = config.chain[0];
39
+ if (!primary || primary.mode !== 'cli')
40
+ return undefined;
41
+ return resolveCliBackend(primary.ref, config.cliBackends);
42
+ }
43
+ //# sourceMappingURL=models-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models-config.js","sourceRoot":"","sources":["../../src/agents/models-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,iBAAiB,EAAsB,MAAM,sBAAsB,CAAA;AAC5E,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,mBAAmB,CAAA;AAS1B;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAA6B;IAC7D,MAAM,KAAK,GAAG,iBAAiB,CAC7B,QAAQ,CAAC,KAAK,CAAC,OAAO,EACtB,QAAQ,CAAC,KAAK,CAAC,SAAS,EACxB,QAAQ,CAAC,WAAW,CACrB,CAAA;IAED,MAAM,WAAW,GAAqC,EAAE,CAAA;IAExD,MAAM,UAAU,GAAG,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAA;IAC3C,KAAK,MAAM,UAAU,IAAI,oBAAoB,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1D,MAAM,QAAQ,GAAG,uBAAuB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;QAChE,IAAI,QAAQ,EAAE,CAAC;YACb,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAA;QAC5C,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAClE,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAA;YAC5C,WAAW,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,MAAM,CAAA;QAC7D,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAA;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAoB;IACvD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC/B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,SAAS,CAAA;IACxD,OAAO,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;AAC3D,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"botlink.d.ts","sourceRoot":"","sources":["../../src/channels/botlink.ts"],"names":[],"mappings":""}
@@ -0,0 +1,320 @@
1
+ import { mkdirSync } from 'node:fs';
2
+ import { basename, join } from 'node:path';
3
+ import { createWriteStream } from 'node:fs';
4
+ import { pipeline } from 'node:stream/promises';
5
+ import { registerChannel } from './registry.js';
6
+ import { BotlinkChannelSchema } from '../config/zod-schema.js';
7
+ import { DATA_FILES_DIR } from '../config/paths.js';
8
+ class BotlinkChannel {
9
+ id = 'botlink';
10
+ abortController = null;
11
+ pollingTask = null;
12
+ offset;
13
+ config = null;
14
+ ctx = null;
15
+ recentDeliveryKeys = new Map();
16
+ async setup(rawConfig, ctx) {
17
+ const config = BotlinkChannelSchema.parse(rawConfig);
18
+ assertNonPlaceholderConfig(config);
19
+ this.config = config;
20
+ this.ctx = ctx;
21
+ this.abortController = new AbortController();
22
+ const me = await this.request('getMe', undefined, this.abortController.signal);
23
+ ctx.logger.info({
24
+ channelId: this.id,
25
+ botId: me.id,
26
+ botUsername: me.username,
27
+ }, 'botlink channel connected');
28
+ this.pollingTask = this.pollLoop();
29
+ }
30
+ async teardown() {
31
+ this.abortController?.abort();
32
+ if (this.pollingTask) {
33
+ await this.pollingTask.catch(() => undefined);
34
+ }
35
+ }
36
+ async pollLoop() {
37
+ if (!this.config || !this.ctx || !this.abortController) {
38
+ throw new Error('botlink channel not initialized');
39
+ }
40
+ let retryDelayMs = this.config.retry_interval * 1000;
41
+ while (!this.abortController.signal.aborted) {
42
+ try {
43
+ const updates = await this.request('getUpdates', {
44
+ offset: this.offset,
45
+ timeout: this.config.poll_timeout,
46
+ limit: 100,
47
+ }, this.abortController.signal);
48
+ retryDelayMs = this.config.retry_interval * 1000;
49
+ if (updates.length > 0) {
50
+ this.ctx.logger.info({
51
+ channelId: this.id,
52
+ updateCount: updates.length,
53
+ updateIds: updates.map(update => update.update_id),
54
+ updates: updates.map(update => summarizeUpdate(update)),
55
+ }, 'botlink getUpdates received updates');
56
+ }
57
+ for (const update of updates) {
58
+ const deliveryKey = getDeliveryKey(update);
59
+ if (deliveryKey && this.isDuplicateDelivery(deliveryKey)) {
60
+ this.ctx.logger.warn({
61
+ channelId: this.id,
62
+ deliveryKey,
63
+ update: summarizeUpdate(update),
64
+ }, 'Skipping duplicate botlink update');
65
+ continue;
66
+ }
67
+ const nextOffset = getNextOffset(update);
68
+ if (nextOffset !== undefined) {
69
+ this.offset = nextOffset;
70
+ }
71
+ else {
72
+ this.ctx.logger.warn({
73
+ channelId: this.id,
74
+ update: summarizeUpdate(update),
75
+ }, 'botlink update missing update_id; falling back to in-memory dedupe');
76
+ }
77
+ const envelope = await this.toSessionEnvelope(update, this.abortController.signal);
78
+ if (!envelope) {
79
+ continue;
80
+ }
81
+ await this.ctx.dispatch(envelope);
82
+ }
83
+ }
84
+ catch (error) {
85
+ if (this.abortController.signal.aborted) {
86
+ break;
87
+ }
88
+ const message = error instanceof Error ? error.message : String(error);
89
+ this.ctx.logger.warn({ err: message, retryDelayMs, channelId: this.id }, 'botlink poll failed, retrying');
90
+ await sleep(retryDelayMs, this.abortController.signal);
91
+ retryDelayMs = Math.min(retryDelayMs * 2, this.config.max_retry_interval * 1000);
92
+ }
93
+ }
94
+ }
95
+ async request(method, payload, signal) {
96
+ if (!this.config) {
97
+ throw new Error('botlink channel not initialized');
98
+ }
99
+ const baseUrl = this.config.gateway_url.replace(/\/+$/, '');
100
+ const url = `${baseUrl}/bot${this.config.bot_token}/${method}`;
101
+ const response = await fetch(url, {
102
+ method: 'POST',
103
+ headers: { 'content-type': 'application/json' },
104
+ body: payload ? JSON.stringify(payload) : '{}',
105
+ signal,
106
+ });
107
+ const result = await response.json();
108
+ if (!response.ok) {
109
+ const detail = result.description ?? `HTTP ${response.status}`;
110
+ throw new Error(`botlink ${method} failed: ${detail}`);
111
+ }
112
+ if (!result.ok) {
113
+ const detail = result.description ?? `error_code=${result.error_code ?? 'unknown'}`;
114
+ throw new Error(`botlink ${method} failed: ${detail}`);
115
+ }
116
+ return result.result;
117
+ }
118
+ async toSessionEnvelope(update, signal) {
119
+ const message = update.message;
120
+ if (!message) {
121
+ this.ctx?.logger.debug({ updateId: update.update_id }, 'Skipping unsupported update');
122
+ return null;
123
+ }
124
+ const contentText = message.text ?? message.caption ?? '';
125
+ const mentionEntities = message.entities ?? message.caption_entities ?? [];
126
+ const mentions = extractMentions(contentText, mentionEntities);
127
+ const attachments = await this.downloadAttachments(message, signal);
128
+ return {
129
+ sessionId: `${this.config?.bot_token}:${message.chat.id}`,
130
+ source: {
131
+ chatId: message.chat.id,
132
+ chatType: normalizeChatType(message.chat.type),
133
+ userId: message.from?.id ?? 'unknown',
134
+ username: message.from?.username,
135
+ messageId: message.message_id,
136
+ replyToMessageId: message.reply_to_message?.message_id,
137
+ },
138
+ content: {
139
+ text: contentText,
140
+ mentions,
141
+ attachments,
142
+ },
143
+ meta: {
144
+ timestamp: message.date * 1000,
145
+ raw: update,
146
+ },
147
+ };
148
+ }
149
+ async downloadAttachments(message, signal) {
150
+ const attachments = [];
151
+ if (message.document) {
152
+ const localPath = await this.downloadFile(message.document.file_id, message.document.file_name, signal);
153
+ attachments.push({
154
+ type: 'document',
155
+ localPath,
156
+ mimeType: message.document.mime_type,
157
+ fileName: message.document.file_name,
158
+ });
159
+ }
160
+ const photo = message.photo?.at(-1);
161
+ if (photo) {
162
+ const localPath = await this.downloadFile(photo.file_id, `${photo.file_id}.jpg`, signal);
163
+ attachments.push({
164
+ type: 'photo',
165
+ localPath,
166
+ mimeType: 'image/jpeg',
167
+ fileName: `${photo.file_id}.jpg`,
168
+ });
169
+ }
170
+ return attachments;
171
+ }
172
+ async downloadFile(fileId, fileName, signal) {
173
+ if (!this.config) {
174
+ throw new Error('botlink channel not initialized');
175
+ }
176
+ const fileInfo = await this.request('getFile', { file_id: fileId }, signal);
177
+ const baseUrl = this.config.gateway_url.replace(/\/+$/, '');
178
+ const fileUrl = `${baseUrl}/file/bot${this.config.bot_token}/${fileInfo.file_path.replace(/^\/+/, '')}`;
179
+ const safeName = sanitizeFileName(fileName ?? basename(fileInfo.file_path));
180
+ const targetDir = join(DATA_FILES_DIR, String(fileId));
181
+ const targetPath = join(targetDir, safeName);
182
+ mkdirSync(targetDir, { recursive: true });
183
+ const response = await fetch(fileUrl, { signal });
184
+ if (!response.ok || !response.body) {
185
+ throw new Error(`botlink file download failed with HTTP ${response.status}`);
186
+ }
187
+ await pipeline(response.body, createWriteStream(targetPath));
188
+ return targetPath;
189
+ }
190
+ isDuplicateDelivery(deliveryKey) {
191
+ pruneRecentDeliveryKeys(this.recentDeliveryKeys);
192
+ const now = Date.now();
193
+ if (this.recentDeliveryKeys.has(deliveryKey)) {
194
+ this.recentDeliveryKeys.set(deliveryKey, now);
195
+ return true;
196
+ }
197
+ this.recentDeliveryKeys.set(deliveryKey, now);
198
+ return false;
199
+ }
200
+ }
201
+ function assertNonPlaceholderConfig(config) {
202
+ const isPlaceholderUrl = config.gateway_url.includes('your-botlink-instance.com');
203
+ const isPlaceholderToken = config.bot_token.includes('xxxxxxxx') ||
204
+ config.bot_token === 'bot_xxxxxxxxxxxxxxxxxx';
205
+ if (isPlaceholderUrl || isPlaceholderToken) {
206
+ throw new Error('botlink config is still using placeholder values; update channels.botlink.gateway_url and bot_token first');
207
+ }
208
+ }
209
+ function normalizeChatType(chatType) {
210
+ if (chatType === 'private' || chatType === 'group' || chatType === 'multi_bot') {
211
+ return chatType;
212
+ }
213
+ return chatType === 'supergroup' ? 'group' : 'private';
214
+ }
215
+ function extractMentions(text, entities) {
216
+ return entities
217
+ .filter(entity => entity.type === 'mention')
218
+ .map(entity => text.slice(entity.offset, entity.offset + entity.length).replace(/^@/, ''))
219
+ .filter(Boolean);
220
+ }
221
+ function sanitizeFileName(fileName) {
222
+ return fileName.replace(/[^a-zA-Z0-9._-]/g, '_');
223
+ }
224
+ function getNextOffset(update) {
225
+ return Number.isInteger(update.update_id) ? Number(update.update_id) + 1 : undefined;
226
+ }
227
+ function getDeliveryKey(update) {
228
+ if (Number.isInteger(update.update_id)) {
229
+ return `update:${update.update_id}`;
230
+ }
231
+ const message = update.message;
232
+ if (!message) {
233
+ return null;
234
+ }
235
+ return [
236
+ 'message',
237
+ message.chat.id,
238
+ message.from?.id ?? 'unknown',
239
+ message.date,
240
+ message.reply_to_message?.message_id ?? '',
241
+ normalizeText(message.text ?? message.caption ?? ''),
242
+ message.document?.file_id ?? '',
243
+ (message.photo ?? []).map(photo => photo.file_id).join(','),
244
+ ].join('|');
245
+ }
246
+ function normalizeText(text) {
247
+ return text.replace(/\s+/g, ' ').trim();
248
+ }
249
+ function pruneRecentDeliveryKeys(recentDeliveryKeys) {
250
+ const expiresAt = Date.now() - RECENT_DELIVERY_TTL_MS;
251
+ for (const [key, seenAt] of recentDeliveryKeys) {
252
+ if (seenAt < expiresAt) {
253
+ recentDeliveryKeys.delete(key);
254
+ }
255
+ }
256
+ while (recentDeliveryKeys.size > MAX_RECENT_DELIVERY_KEYS) {
257
+ const oldestKey = recentDeliveryKeys.keys().next().value;
258
+ if (!oldestKey) {
259
+ break;
260
+ }
261
+ recentDeliveryKeys.delete(oldestKey);
262
+ }
263
+ }
264
+ function summarizeUpdate(update) {
265
+ const message = update.message;
266
+ if (!message) {
267
+ return {
268
+ updateId: update.update_id,
269
+ kind: 'unsupported',
270
+ };
271
+ }
272
+ return {
273
+ updateId: update.update_id,
274
+ kind: 'message',
275
+ messageId: message.message_id,
276
+ chatId: message.chat.id,
277
+ chatType: message.chat.type,
278
+ userId: message.from?.id ?? 'unknown',
279
+ username: message.from?.username,
280
+ replyToMessageId: message.reply_to_message?.message_id,
281
+ textPreview: previewText(message.text ?? message.caption ?? ''),
282
+ mentionCount: (message.entities ?? message.caption_entities ?? []).filter(entity => entity.type === 'mention').length,
283
+ document: message.document
284
+ ? {
285
+ fileId: message.document.file_id,
286
+ fileName: message.document.file_name,
287
+ mimeType: message.document.mime_type,
288
+ }
289
+ : undefined,
290
+ photoCount: message.photo?.length ?? 0,
291
+ };
292
+ }
293
+ function previewText(text, maxLength = 160) {
294
+ const normalized = text.replace(/\s+/g, ' ').trim();
295
+ if (normalized.length <= maxLength) {
296
+ return normalized;
297
+ }
298
+ return `${normalized.slice(0, maxLength)}...`;
299
+ }
300
+ async function sleep(ms, signal) {
301
+ if (ms <= 0) {
302
+ return;
303
+ }
304
+ await new Promise((resolve, reject) => {
305
+ const timer = setTimeout(resolve, ms);
306
+ const onAbort = () => {
307
+ clearTimeout(timer);
308
+ reject(new Error('aborted'));
309
+ };
310
+ signal.addEventListener('abort', onAbort, { once: true });
311
+ }).catch(error => {
312
+ if (!signal.aborted) {
313
+ throw error;
314
+ }
315
+ });
316
+ }
317
+ const RECENT_DELIVERY_TTL_MS = 2 * 60 * 1000;
318
+ const MAX_RECENT_DELIVERY_KEYS = 2048;
319
+ registerChannel(new BotlinkChannel());
320
+ //# sourceMappingURL=botlink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"botlink.js","sourceRoot":"","sources":["../../src/channels/botlink.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAE/C,OAAO,EAAE,oBAAoB,EAA6B,MAAM,yBAAyB,CAAA;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAwDnD,MAAM,cAAc;IAClB,EAAE,GAAG,SAAS,CAAA;IAEN,eAAe,GAA2B,IAAI,CAAA;IAC9C,WAAW,GAAyB,IAAI,CAAA;IACxC,MAAM,CAAoB;IAC1B,MAAM,GAAgC,IAAI,CAAA;IAC1C,GAAG,GAA0B,IAAI,CAAA;IACjC,kBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAA;IAEtD,KAAK,CAAC,KAAK,CAAC,SAAkB,EAAE,GAAmB;QACjD,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QACpD,0BAA0B,CAAC,MAAM,CAAC,CAAA;QAElC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,EAAE,CAAA;QAE5C,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAC3B,OAAO,EACP,SAAS,EACT,IAAI,CAAC,eAAe,CAAC,MAAM,CAC5B,CAAA;QAED,GAAG,CAAC,MAAM,CAAC,IAAI,CACb;YACE,SAAS,EAAE,IAAI,CAAC,EAAE;YAClB,KAAK,EAAE,EAAE,CAAC,EAAE;YACZ,WAAW,EAAE,EAAE,CAAC,QAAQ;SACzB,EACD,2BAA2B,CAC5B,CAAA;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;IACpC,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,CAAA;QAC7B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;QAC/C,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ;QACpB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;QACpD,CAAC;QAED,IAAI,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG,IAAI,CAAA;QAEpD,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC5C,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAChC,YAAY,EACZ;oBACE,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;oBACjC,KAAK,EAAE,GAAG;iBACX,EACD,IAAI,CAAC,eAAe,CAAC,MAAM,CAC5B,CAAA;gBAED,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG,IAAI,CAAA;gBAEhD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAClB;wBACE,SAAS,EAAE,IAAI,CAAC,EAAE;wBAClB,WAAW,EAAE,OAAO,CAAC,MAAM;wBAC3B,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC;wBAClD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;qBACxD,EACD,qCAAqC,CACtC,CAAA;gBACH,CAAC;gBAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;oBAC7B,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,CAAA;oBAC1C,IAAI,WAAW,IAAI,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,CAAC;wBACzD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAClB;4BACE,SAAS,EAAE,IAAI,CAAC,EAAE;4BAClB,WAAW;4BACX,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC;yBAChC,EACD,mCAAmC,CACpC,CAAA;wBACD,SAAQ;oBACV,CAAC;oBAED,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;oBACxC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;wBAC7B,IAAI,CAAC,MAAM,GAAG,UAAU,CAAA;oBAC1B,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAClB;4BACE,SAAS,EAAE,IAAI,CAAC,EAAE;4BAClB,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC;yBAChC,EACD,oEAAoE,CACrE,CAAA;oBACH,CAAC;oBAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAA;oBAClF,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACd,SAAQ;oBACV,CAAC;oBAED,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;gBACnC,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACxC,MAAK;gBACP,CAAC;gBAED,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBACtE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAClB,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,EAClD,+BAA+B,CAChC,CAAA;gBAED,MAAM,KAAK,CAAC,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAA;gBACtD,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAA;YAClF,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,MAAc,EACd,OAAiC,EACjC,MAAoB;QAEpB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;QACpD,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QAC3D,MAAM,GAAG,GAAG,GAAG,OAAO,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,EAAE,CAAA;QAC9D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI;YAC9C,MAAM;SACP,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA2B,CAAA;QAC7D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,IAAI,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAA;YAC9D,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,YAAY,MAAM,EAAE,CAAC,CAAA;QACxD,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,IAAI,cAAc,MAAM,CAAC,UAAU,IAAI,SAAS,EAAE,CAAA;YACnF,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,YAAY,MAAM,EAAE,CAAC,CAAA;QACxD,CAAC;QAED,OAAO,MAAM,CAAC,MAAW,CAAA;IAC3B,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAC7B,MAAsB,EACtB,MAAmB;QAEnB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;QAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,SAAS,EAAE,EAAE,6BAA6B,CAAC,CAAA;YACrF,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,IAAI,EAAE,CAAA;QACzD,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAA;QAC1E,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,EAAE,eAAe,CAAC,CAAA;QAC9D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAEnE,OAAO;YACL,SAAS,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE;YACzD,MAAM,EAAE;gBACN,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE;gBACvB,QAAQ,EAAE,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC9C,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,SAAS;gBACrC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ;gBAChC,SAAS,EAAE,OAAO,CAAC,UAAU;gBAC7B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,EAAE,UAAU;aACvD;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,WAAW;gBACjB,QAAQ;gBACR,WAAW;aACZ;YACD,IAAI,EAAE;gBACJ,SAAS,EAAE,OAAO,CAAC,IAAI,GAAG,IAAI;gBAC9B,GAAG,EAAE,MAAgB;aACtB;SACF,CAAA;IACH,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAC/B,OAAwB,EACxB,MAAmB;QAEnB,MAAM,WAAW,GAA8C,EAAE,CAAA;QAEjE,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,EACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,EAC1B,MAAM,CACP,CAAA;YACD,WAAW,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,UAAU;gBAChB,SAAS;gBACT,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,SAAS;gBACpC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,SAAS;aACrC,CAAC,CAAA;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QACnC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,MAAM,EAAE,MAAM,CAAC,CAAA;YACxF,WAAW,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,OAAO;gBACb,SAAS;gBACT,QAAQ,EAAE,YAAY;gBACtB,QAAQ,EAAE,GAAG,KAAK,CAAC,OAAO,MAAM;aACjC,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,WAAW,CAAA;IACpB,CAAC;IAEO,KAAK,CAAC,YAAY,CACxB,MAAc,EACd,QAA4B,EAC5B,MAAmB;QAEnB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;QACpD,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAwB,SAAS,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,CAAA;QAClG,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QAC3D,MAAM,OAAO,GAAG,GAAG,OAAO,YAAY,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAA;QACvG,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAA;QAC3E,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;QACtD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;QAE5C,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAEzC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;QACjD,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,0CAA0C,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;QAC9E,CAAC;QAED,MAAM,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAA;QAC5D,OAAO,UAAU,CAAA;IACnB,CAAC;IAEO,mBAAmB,CAAC,WAAmB;QAC7C,uBAAuB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;QAEhD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;YAC7C,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;QAC7C,OAAO,KAAK,CAAA;IACd,CAAC;CACF;AAED,SAAS,0BAA0B,CAAC,MAA4B;IAC9D,MAAM,gBAAgB,GAAG,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAA;IACjF,MAAM,kBAAkB,GACtB,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC;QACrC,MAAM,CAAC,SAAS,KAAK,wBAAwB,CAAA;IAE/C,IAAI,gBAAgB,IAAI,kBAAkB,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,2GAA2G,CAC5G,CAAA;IACH,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB;IACzC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC/E,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,OAAO,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;AACxD,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,QAAiC;IACtE,OAAO,QAAQ;SACZ,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC;SAC3C,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;SACzF,MAAM,CAAC,OAAO,CAAC,CAAA;AACpB,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB;IACxC,OAAO,QAAQ,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAA;AAClD,CAAC;AAED,SAAS,aAAa,CAAC,MAAsB;IAC3C,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AACtF,CAAC;AAED,SAAS,cAAc,CAAC,MAAsB;IAC5C,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACvC,OAAO,UAAU,MAAM,CAAC,SAAS,EAAE,CAAA;IACrC,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;IAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO;QACL,SAAS;QACT,OAAO,CAAC,IAAI,CAAC,EAAE;QACf,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,SAAS;QAC7B,OAAO,CAAC,IAAI;QACZ,OAAO,CAAC,gBAAgB,EAAE,UAAU,IAAI,EAAE;QAC1C,aAAa,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACpD,OAAO,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE;QAC/B,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;KAC5D,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACb,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;AACzC,CAAC;AAED,SAAS,uBAAuB,CAAC,kBAAuC;IACtE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,sBAAsB,CAAA;IACrD,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,kBAAkB,EAAE,CAAC;QAC/C,IAAI,MAAM,GAAG,SAAS,EAAE,CAAC;YACvB,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAChC,CAAC;IACH,CAAC;IAED,OAAO,kBAAkB,CAAC,IAAI,GAAG,wBAAwB,EAAE,CAAC;QAC1D,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAA;QACxD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAK;QACP,CAAC;QACD,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACtC,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,MAAsB;IAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;IAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,QAAQ,EAAE,MAAM,CAAC,SAAS;YAC1B,IAAI,EAAE,aAAa;SACpB,CAAA;IACH,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,SAAS;QAC1B,IAAI,EAAE,SAAS;QACf,SAAS,EAAE,OAAO,CAAC,UAAU;QAC7B,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE;QACvB,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI;QAC3B,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,SAAS;QACrC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ;QAChC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,EAAE,UAAU;QACtD,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QAC/D,YAAY,EAAE,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,MAAM,CACvE,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CACpC,CAAC,MAAM;QACR,QAAQ,EAAE,OAAO,CAAC,QAAQ;YACxB,CAAC,CAAC;gBACE,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,SAAS;gBACpC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,SAAS;aACrC;YACH,CAAC,CAAC,SAAS;QACb,UAAU,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;KACvC,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,SAAS,GAAG,GAAG;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;IACnD,IAAI,UAAU,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;QACnC,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,CAAA;AAC/C,CAAC;AAED,KAAK,UAAU,KAAK,CAAC,EAAU,EAAE,MAAmB;IAClD,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QACZ,OAAM;IACR,CAAC;IAED,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;QACrC,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAA;QAC9B,CAAC,CAAA;QAED,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IAC3D,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QACf,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,sBAAsB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA;AAC5C,MAAM,wBAAwB,GAAG,IAAI,CAAA;AAErC,eAAe,CAAC,IAAI,cAAc,EAAE,CAAC,CAAA"}