feique 1.3.2 → 1.4.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/README.en.md +3 -2
- package/README.md +3 -2
- package/dist/backend/claude.js +28 -54
- package/dist/backend/claude.js.map +1 -1
- package/dist/backend/factory.d.ts +28 -0
- package/dist/backend/factory.js +61 -0
- package/dist/backend/factory.js.map +1 -1
- package/dist/backend/probe.d.ts +29 -0
- package/dist/backend/probe.js +99 -0
- package/dist/backend/probe.js.map +1 -0
- package/dist/bridge/admin-config.d.ts +47 -0
- package/dist/bridge/admin-config.js +141 -0
- package/dist/bridge/admin-config.js.map +1 -0
- package/dist/bridge/collab-commands.d.ts +42 -0
- package/dist/bridge/collab-commands.js +254 -0
- package/dist/bridge/collab-commands.js.map +1 -0
- package/dist/bridge/commands.d.ts +1 -1
- package/dist/bridge/commands.js +3 -0
- package/dist/bridge/commands.js.map +1 -1
- package/dist/bridge/feishu-commands.d.ts +27 -0
- package/dist/bridge/feishu-commands.js +462 -0
- package/dist/bridge/feishu-commands.js.map +1 -0
- package/dist/bridge/lifecycle.d.ts +46 -0
- package/dist/bridge/lifecycle.js +228 -0
- package/dist/bridge/lifecycle.js.map +1 -0
- package/dist/bridge/memory-commands.d.ts +26 -0
- package/dist/bridge/memory-commands.js +330 -0
- package/dist/bridge/memory-commands.js.map +1 -0
- package/dist/bridge/reply-builders.d.ts +30 -0
- package/dist/bridge/reply-builders.js +72 -0
- package/dist/bridge/reply-builders.js.map +1 -0
- package/dist/bridge/run-pipeline.d.ts +86 -0
- package/dist/bridge/run-pipeline.js +442 -0
- package/dist/bridge/run-pipeline.js.map +1 -0
- package/dist/bridge/run-scheduler.d.ts +47 -0
- package/dist/bridge/run-scheduler.js +121 -0
- package/dist/bridge/run-scheduler.js.map +1 -0
- package/dist/bridge/service-utils.d.ts +47 -0
- package/dist/bridge/service-utils.js +309 -0
- package/dist/bridge/service-utils.js.map +1 -0
- package/dist/bridge/service.d.ts +114 -66
- package/dist/bridge/service.js +225 -2196
- package/dist/bridge/service.js.map +1 -1
- package/dist/config/load.js +1 -1
- package/dist/config/load.js.map +1 -1
- package/dist/config/paths.js +1 -20
- package/dist/config/paths.js.map +1 -1
- package/dist/config/schema.d.ts +3 -0
- package/dist/config/schema.js +3 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/feishu/long-connection.js +1 -0
- package/dist/feishu/long-connection.js.map +1 -1
- package/dist/feishu/webhook.js +1 -0
- package/dist/feishu/webhook.js.map +1 -1
- package/package.json +1 -1
package/README.en.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# 飞鹊 (Feique) v1.
|
|
1
|
+
# 飞鹊 (Feique) v1.4.0
|
|
2
2
|
|
|
3
3
|
<div align="center">
|
|
4
4
|
|
|
@@ -33,7 +33,8 @@ Currently supports the full AI coding workflow: project bindings persist by `cha
|
|
|
33
33
|
| **Memory System** | Supports project memory and group shared memory, SQLite + FTS5 retrieval, configurable TTL, pin strategies, and background cleanup. |
|
|
34
34
|
| **Project Isolation** | Downloads, temp files, cache, and project audit logs default to `state/projects/<alias>/...`, with per-project overrides available. |
|
|
35
35
|
| **Observability** | Built-in `/healthz`, `/readyz`, and `/metrics`, plus structured audit trails and Prometheus / Alertmanager / Grafana integration. |
|
|
36
|
-
| **Multi-Backend** | A single bridge can manage both Codex and Claude Code backends, configurable globally via `[backend]` or per-project. The Claude backend supports `--model`, `--permission-mode`, `--max-budget-usd`, and other advanced options. |
|
|
36
|
+
| **Multi-Backend** | A single bridge can manage both Codex and Claude Code backends, configurable globally via `[backend]` or per-project. The Claude backend supports `--model`, `--permission-mode`, `--max-budget-usd`, and other advanced options. **v1.4 adds startup-level failover**: if the default backend CLI is unavailable, runs auto-switch to the alternate backend for that turn. |
|
|
37
|
+
| **Pairing UX (v1.4)** | Unauthorized chats knocking for the first time now get a friendly reply with their chat_id and instructions to contact an admin; admins get a one-shot notification. No more silent drops. |
|
|
37
38
|
| **Team Awareness** | `/team` shows who is using AI on what in real time, with automatic conflict warnings. |
|
|
38
39
|
| **Knowledge Loop** | `/learn` and `/recall` for team knowledge capture and semantic retrieval, with AI-powered auto-extraction. |
|
|
39
40
|
| **Handoff & Review** | `/handoff` `/pickup` `/review` `/approve` `/reject` for session handoffs and code review workflows. |
|
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# 飞鹊 (Feique) v1.
|
|
1
|
+
# 飞鹊 (Feique) v1.4.0
|
|
2
2
|
|
|
3
3
|
<div align="center">
|
|
4
4
|
|
|
@@ -33,7 +33,8 @@
|
|
|
33
33
|
| **记忆系统 (Memory System)** | 支持项目记忆与群共享记忆,SQLite + FTS5 检索,可配置 TTL、置顶策略和后台定时清理。 |
|
|
34
34
|
| **项目隔离 (Project Isolation)** | 下载、临时文件、缓存和项目审计默认落到 `state/projects/<alias>/...`,也可按项目单独指定。 |
|
|
35
35
|
| **可观测性 (Observability)** | 内置 `/healthz`、`/readyz`、`/metrics`,支持 Prometheus / Alertmanager / Grafana,并补齐启动告警、运行链路日志和审计。 |
|
|
36
|
-
| **多后端支持 (Multi-Backend)** | 同一桥接器可同时管理 Codex 和 Claude Code 后端,通过 `[backend]` 配置全局默认或按项目覆盖。Claude 后端支持 `--model`、`--permission-mode`、`--max-budget-usd`
|
|
36
|
+
| **多后端支持 (Multi-Backend)** | 同一桥接器可同时管理 Codex 和 Claude Code 后端,通过 `[backend]` 配置全局默认或按项目覆盖。Claude 后端支持 `--model`、`--permission-mode`、`--max-budget-usd` 等高级选项。**v1.4 新增启动级 failover**:默认 backend 的 CLI 不可用时自动临时切到另一个 backend 跑当前请求。 |
|
|
37
|
+
| **Pairing UX (v1.4)** | 陌生 chat 首次 @ bot 时返回友好提示(附自己的 chat_id 和申请指引),同时一次性通知 admin,不再静默丢包。 |
|
|
37
38
|
| **团队协作态势 (Team Awareness)** | `/team` 实时查看谁在用 AI 做什么,自动冲突预警。 |
|
|
38
39
|
| **知识回路 (Knowledge Loop)** | `/learn` `/recall` 团队知识沉淀与语义检索,AI 自动提取。 |
|
|
39
40
|
| **接力评审 (Handoff & Review)** | `/handoff` `/pickup` `/review` `/approve` `/reject` 会话交接与评审流程。 |
|
package/dist/backend/claude.js
CHANGED
|
@@ -241,66 +241,40 @@ export class ClaudeBackend {
|
|
|
241
241
|
catch {
|
|
242
242
|
return [];
|
|
243
243
|
}
|
|
244
|
+
// Claude Code stores sessions as flat JSON files: ~/.claude/sessions/<PID>.json
|
|
245
|
+
// Format: {"pid":12673,"sessionId":"uuid","cwd":"/path","startedAt":1774239981398}
|
|
244
246
|
for (const entry of entries) {
|
|
245
|
-
|
|
246
|
-
const stat = await fs.stat(sessionDir).catch(() => null);
|
|
247
|
-
if (!stat?.isDirectory())
|
|
247
|
+
if (!entry.endsWith('.json'))
|
|
248
248
|
continue;
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
if (!file.endsWith('.jsonl'))
|
|
260
|
-
continue;
|
|
261
|
-
const filePath = path.join(sessionDir, file);
|
|
262
|
-
try {
|
|
263
|
-
const content = await fs.readFile(filePath, 'utf8');
|
|
264
|
-
const firstLine = content.split(/\r?\n/, 1)[0]?.trim();
|
|
265
|
-
if (!firstLine)
|
|
266
|
-
continue;
|
|
267
|
-
const parsed = JSON.parse(firstLine);
|
|
268
|
-
if (parsed.cwd || parsed.working_directory) {
|
|
269
|
-
cwd = parsed.cwd ?? parsed.working_directory ?? '';
|
|
270
|
-
}
|
|
271
|
-
if (parsed.timestamp) {
|
|
272
|
-
createdAt = parsed.timestamp;
|
|
273
|
-
}
|
|
274
|
-
break;
|
|
275
|
-
}
|
|
276
|
-
catch {
|
|
249
|
+
const filePath = path.join(sessionsDir, entry);
|
|
250
|
+
const stat = await fs.stat(filePath).catch(() => null);
|
|
251
|
+
if (!stat?.isFile())
|
|
252
|
+
continue;
|
|
253
|
+
try {
|
|
254
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
255
|
+
const parsed = JSON.parse(content);
|
|
256
|
+
const sessionId = parsed.sessionId;
|
|
257
|
+
const cwd = parsed.cwd;
|
|
258
|
+
if (!sessionId || !cwd)
|
|
277
259
|
continue;
|
|
260
|
+
const startedAt = typeof parsed.startedAt === 'number' ? parsed.startedAt : undefined;
|
|
261
|
+
const createdAt = startedAt ? new Date(startedAt).toISOString() : undefined;
|
|
262
|
+
const updatedAt = new Date(startedAt ? Math.max(startedAt, stat.mtimeMs) : stat.mtimeMs).toISOString();
|
|
263
|
+
const existing = sessions.get(sessionId);
|
|
264
|
+
if (!existing || existing.updatedAt < updatedAt) {
|
|
265
|
+
sessions.set(sessionId, {
|
|
266
|
+
sessionId,
|
|
267
|
+
cwd,
|
|
268
|
+
updatedAt,
|
|
269
|
+
createdAt,
|
|
270
|
+
filePath,
|
|
271
|
+
source: 'sessions',
|
|
272
|
+
backend: 'claude',
|
|
273
|
+
});
|
|
278
274
|
}
|
|
279
275
|
}
|
|
280
|
-
|
|
281
|
-
if (!cwd) {
|
|
282
|
-
try {
|
|
283
|
-
const configPath = path.join(sessionDir, 'config.json');
|
|
284
|
-
const config = JSON.parse(await fs.readFile(configPath, 'utf8'));
|
|
285
|
-
cwd = config.cwd ?? config.working_directory ?? '';
|
|
286
|
-
}
|
|
287
|
-
catch {
|
|
288
|
-
// ignore
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
if (!cwd)
|
|
276
|
+
catch {
|
|
292
277
|
continue;
|
|
293
|
-
const existing = sessions.get(sessionId);
|
|
294
|
-
if (!existing || existing.updatedAt < updatedAt) {
|
|
295
|
-
sessions.set(sessionId, {
|
|
296
|
-
sessionId,
|
|
297
|
-
cwd,
|
|
298
|
-
updatedAt,
|
|
299
|
-
createdAt,
|
|
300
|
-
filePath: sessionDir,
|
|
301
|
-
source: 'sessions',
|
|
302
|
-
backend: 'claude',
|
|
303
|
-
});
|
|
304
278
|
}
|
|
305
279
|
}
|
|
306
280
|
return [...sessions.values()].sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/backend/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AA4C3C,MAAM,OAAO,aAAa;IAIL;IACA;IAJH,IAAI,GAAG,QAAiB,CAAC;IAEzC,YACmB,MAA2B,EAC3B,gBAAwB,oBAAoB,EAAE;QAD9C,WAAM,GAAN,MAAM,CAAqB;QAC3B,kBAAa,GAAb,aAAa,CAAiC;IAC9D,CAAC;IAEG,KAAK,CAAC,GAAG,CAAC,OAAoE;QACnF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAE5C,OAAO,CAAC,MAAM,CAAC,IAAI,CACjB,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,EAC9E,sBAAsB,CACvB,CAAC;QAEF,OAAO,MAAM,IAAI,OAAO,CAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC7D,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE;gBAC1D,GAAG,EAAE,OAAO,CAAC,OAAO;gBACpB,GAAG,EAAE;oBACH,GAAG,OAAO,CAAC,GAAG;oBACd,QAAQ,EAAE,GAAG;iBACd;gBACD,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;aAClC,CAAC,CAAC;YAEH,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,YAAY,GAAG,EAAE,CAAC;YACtB,IAAI,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YAClC,IAAI,YAAY,GAAG,EAAE,CAAC;YACtB,IAAI,WAA+B,CAAC;YACpC,IAAI,YAAgC,CAAC;YACrC,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,IAAI,aAAyC,CAAC;YAC9C,IAAI,YAAsC,CAAC;YAE3C,MAAM,YAAY,GAAG,CAAC,KAAY,EAAE,EAAE;gBACpC,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC;YAEF,MAAM,aAAa,GAAG,CAAC,MAAwB,EAAE,EAAE;gBACjD,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC,CAAC;YAEF,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,IAAI,aAAa;oBAAE,YAAY,CAAC,aAAa,CAAC,CAAC;gBAC/C,YAAY,EAAE,EAAE,CAAC;gBACjB,YAAY,GAAG,SAAS,CAAC;YAC3B,CAAC,CAAC;YAEF,MAAM,QAAQ,GAAG,CAAC,MAAe,EAAE,EAAE;gBACnC,IAAI,UAAU,CAAC,MAAM;oBAAE,OAAO;gBAC9B,MAAM,OAAO,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC;gBACtH,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;gBACjC,KAAK,CAAC,IAAI,GAAG,YAAY,CAAC;gBAC1B,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC3B,UAAU,CAAC,GAAG,EAAE;oBACd,IAAI,CAAC,UAAU,CAAC,MAAM;wBAAE,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACrD,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;gBACjB,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC,CAAC;YAEF,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;gBAC/C,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC9B,QAAQ,CAAC,0BAA0B,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC;gBAC5D,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;gBACtB,aAAa,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,IAAI,oBAAoB,CAAC,CAAC;gBAC/E,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBAC3B,OAAO,EAAE,CAAC;oBACV,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClE,YAAY,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7E,CAAC;YAED,IAAI,OAAO,UAAU,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACvC,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACzC,CAAC;YAED,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAa,EAAE,EAAE;gBACnD,YAAY,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACvC,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC1C,YAAY,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;gBAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;oBAC5B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;wBAAE,SAAS;oBAEvC,IAAI,CAAC;wBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAsB,CAAC;wBAEvD,uCAAuC;wBACvC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;4BAChD,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;wBAC/B,CAAC;wBAED,uDAAuD;wBACvD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;4BAChE,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC;wBAC9B,CAAC;wBACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;4BAC5B,IAAI,OAAO,KAAK,CAAC,kBAAkB,KAAK,QAAQ;gCAAE,WAAW,GAAG,KAAK,CAAC,kBAAkB,CAAC;4BACzF,IAAI,OAAO,KAAK,CAAC,mBAAmB,KAAK,QAAQ;gCAAE,YAAY,GAAG,KAAK,CAAC,mBAAmB,CAAC;wBAC9F,CAAC;wBAED,iDAAiD;wBACjD,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;4BACzD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO;iCAChC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;iCAC5D,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAK,CAAC;iCACjB,IAAI,CAAC,IAAI,CAAC,CAAC;4BACd,IAAI,KAAK,EAAE,CAAC;gCACV,YAAY,GAAG,KAAK,CAAC;4BACvB,CAAC;wBACH,CAAC;wBAED,kCAAkC;wBAClC,MAAM,YAAY,GAAiB;4BACjC,IAAI,EAAE,KAAK,CAAC,IAAI;4BAChB,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,SAAS;4BACzC,OAAO,EAAE,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;yBACrE,CAAC;wBACF,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC;oBACxC,CAAC;oBAAC,MAAM,CAAC;wBACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,iCAAiC,CAAC,CAAC;oBACpE,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC7C,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC;YAEH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC/B,YAAY,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1E,CAAC,CAAC,CAAC;YAEH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE;gBAClC,IAAI,OAAO;oBAAE,OAAO;gBAEpB,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;oBAC3C,YAAY,CAAC,IAAI,KAAK,CAAC,2BAA2B,QAAQ,IAAI,CAAC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,kBAAkB,EAAE,CAAC,CAAC,CAAC;oBAC5G,OAAO;gBACT,CAAC;gBAED,aAAa,CAAC;oBACZ,SAAS;oBACT,YAAY,EAAE,YAAY,CAAC,IAAI,EAAE;oBACjC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;oBACrB,QAAQ,EAAE,QAAQ,IAAI,CAAC;oBACvB,WAAW;oBACX,YAAY;iBACb,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,cAAc,CAAC,KAAmB;QACvC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChE,OAAO,aAAa,KAAK,CAAC,OAAO,EAAE,CAAC;QACtC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAAC,WAAmB,EAAE,QAAgB,EAAE;QACtE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAqB,EAAE,CAAC;QACrC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,iBAAiB,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YAC1D,IAAI,CAAC,KAAK;gBAAE,SAAS;YACrB,OAAO,CAAC,IAAI,CAAC;gBACX,GAAG,OAAO;gBACV,SAAS,EAAE,KAAK,CAAC,IAAI;gBACrB,UAAU,EAAE,KAAK,CAAC,KAAK;aACxB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,OAAO;aACX,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACb,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;YAC7D,IAAI,UAAU,KAAK,CAAC;gBAAE,OAAO,UAAU,CAAC;YACxC,OAAO,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAChD,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACrB,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAAC,WAAmB;QAChD,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACjE,OAAO,OAAO,IAAI,IAAI,CAAC;IACzB,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,WAAmB,EAAE,SAAiB;QACjE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;QAChE,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAC5B,MAAM,KAAK,GAAG,iBAAiB,CAAC,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,OAAO,EAAE,GAAG,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IAC1E,CAAC;IAEO,SAAS,CAAC,OAAoE;QACpF,MAAM,IAAI,GAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;QAE5C,MAAM,cAAc,GAAG,OAAO,CAAC,aAAa,EAAE,cAAc,IAAI,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC;QAClG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC;QAE/C,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;QACvE,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,EAAE,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;QAClF,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,YAAY,GAAG,OAAO,CAAC,aAAa,EAAE,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;QACrF,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,YAAY,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,kBAAkB,GAAG,OAAO,CAAC,aAAa,EAAE,kBAAkB,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;QACvG,IAAI,kBAAkB,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,kBAAkB,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,cAAc,CAAC,UAAoB;QACzC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QACxD,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,UAAU,CAAC;QACnE,MAAM,cAAc,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,OAAO,iBAAiB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC;QAC1G,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC;IAC3D,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;QAEnD,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YACjD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YACzD,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE;gBAAE,SAAS;YAEnC,sEAAsE;YACtE,uCAAuC;YACvC,MAAM,SAAS,GAAG,KAAK,CAAC;YACxB,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAc,CAAC,CAAC;YAE9E,0EAA0E;YAC1E,IAAI,GAAG,GAAG,EAAE,CAAC;YACb,IAAI,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YACrD,IAAI,SAA6B,CAAC;YAElC,yDAAyD;YACzD,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;gBAChC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;oBAAE,SAAS;gBACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;gBAC7C,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;oBACpD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;oBACvD,IAAI,CAAC,SAAS;wBAAE,SAAS;oBACzB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;oBACrC,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;wBAC3C,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,iBAAiB,IAAI,EAAE,CAAC;oBACrD,CAAC;oBACD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;wBACrB,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;oBAC/B,CAAC;oBACD,MAAM;gBACR,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;YACH,CAAC;YAED,8DAA8D;YAC9D,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,IAAI,CAAC;oBACH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;oBACxD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;oBACjE,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,iBAAiB,IAAI,EAAE,CAAC;gBACrD,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;YACH,CAAC;YAED,IAAI,CAAC,GAAG;gBAAE,SAAS;YAEnB,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACzC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;gBAChD,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE;oBACtB,SAAS;oBACT,GAAG;oBACH,SAAS;oBACT,SAAS;oBACT,QAAQ,EAAE,UAAU;oBACpB,MAAM,EAAE,UAAU;oBAClB,OAAO,EAAE,QAAQ;iBAClB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACvF,CAAC;CACF;AAED,SAAS,oBAAoB;IAC3B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;IACnD,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IAC3D,IAAI,UAAU,KAAK,GAAG;QAAE,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;IAC5C,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACrF,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AAC7C,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAe;IACxC,OAAO,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;AAEhF,SAAS,iBAAiB,CAAC,WAAmB,EAAE,UAAkB;IAChE,MAAM,qBAAqB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1F,MAAM,qBAAqB,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAEzF,IAAI,qBAAqB,KAAK,qBAAqB,EAAE,CAAC;QACpD,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IAC5C,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;IACzD,IAAI,WAAW,KAAK,WAAW,EAAE,CAAC;QAChC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,qBAAqB,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IAChE,MAAM,qBAAqB,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IAChE,IAAI,qBAAqB,IAAI,qBAAqB,KAAK,qBAAqB,EAAE,CAAC;QAC7E,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAChD,CAAC;IAED,IAAI,qBAAqB,CAAC,MAAM,IAAI,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;QAC/F,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAClD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,MAAM,MAAM,GAAG,KAAK;SACjB,WAAW,EAAE;SACb,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,KAAK,CAAC,YAAY,CAAC;SACnB,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IACzE,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7D,CAAC"}
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/backend/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AA4C3C,MAAM,OAAO,aAAa;IAIL;IACA;IAJH,IAAI,GAAG,QAAiB,CAAC;IAEzC,YACmB,MAA2B,EAC3B,gBAAwB,oBAAoB,EAAE;QAD9C,WAAM,GAAN,MAAM,CAAqB;QAC3B,kBAAa,GAAb,aAAa,CAAiC;IAC9D,CAAC;IAEG,KAAK,CAAC,GAAG,CAAC,OAAoE;QACnF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAE5C,OAAO,CAAC,MAAM,CAAC,IAAI,CACjB,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,EAC9E,sBAAsB,CACvB,CAAC;QAEF,OAAO,MAAM,IAAI,OAAO,CAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC7D,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE;gBAC1D,GAAG,EAAE,OAAO,CAAC,OAAO;gBACpB,GAAG,EAAE;oBACH,GAAG,OAAO,CAAC,GAAG;oBACd,QAAQ,EAAE,GAAG;iBACd;gBACD,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;aAClC,CAAC,CAAC;YAEH,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,YAAY,GAAG,EAAE,CAAC;YACtB,IAAI,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YAClC,IAAI,YAAY,GAAG,EAAE,CAAC;YACtB,IAAI,WAA+B,CAAC;YACpC,IAAI,YAAgC,CAAC;YACrC,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,IAAI,aAAyC,CAAC;YAC9C,IAAI,YAAsC,CAAC;YAE3C,MAAM,YAAY,GAAG,CAAC,KAAY,EAAE,EAAE;gBACpC,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC;YAEF,MAAM,aAAa,GAAG,CAAC,MAAwB,EAAE,EAAE;gBACjD,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC,CAAC;YAEF,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,IAAI,aAAa;oBAAE,YAAY,CAAC,aAAa,CAAC,CAAC;gBAC/C,YAAY,EAAE,EAAE,CAAC;gBACjB,YAAY,GAAG,SAAS,CAAC;YAC3B,CAAC,CAAC;YAEF,MAAM,QAAQ,GAAG,CAAC,MAAe,EAAE,EAAE;gBACnC,IAAI,UAAU,CAAC,MAAM;oBAAE,OAAO;gBAC9B,MAAM,OAAO,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC;gBACtH,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;gBACjC,KAAK,CAAC,IAAI,GAAG,YAAY,CAAC;gBAC1B,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC3B,UAAU,CAAC,GAAG,EAAE;oBACd,IAAI,CAAC,UAAU,CAAC,MAAM;wBAAE,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACrD,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;gBACjB,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC,CAAC;YAEF,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;gBAC/C,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC9B,QAAQ,CAAC,0BAA0B,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC;gBAC5D,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;gBACtB,aAAa,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,IAAI,oBAAoB,CAAC,CAAC;gBAC/E,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBAC3B,OAAO,EAAE,CAAC;oBACV,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClE,YAAY,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7E,CAAC;YAED,IAAI,OAAO,UAAU,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACvC,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACzC,CAAC;YAED,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAa,EAAE,EAAE;gBACnD,YAAY,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACvC,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC1C,YAAY,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;gBAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;oBAC5B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;wBAAE,SAAS;oBAEvC,IAAI,CAAC;wBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAsB,CAAC;wBAEvD,uCAAuC;wBACvC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;4BAChD,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;wBAC/B,CAAC;wBAED,uDAAuD;wBACvD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;4BAChE,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC;wBAC9B,CAAC;wBACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;4BAC5B,IAAI,OAAO,KAAK,CAAC,kBAAkB,KAAK,QAAQ;gCAAE,WAAW,GAAG,KAAK,CAAC,kBAAkB,CAAC;4BACzF,IAAI,OAAO,KAAK,CAAC,mBAAmB,KAAK,QAAQ;gCAAE,YAAY,GAAG,KAAK,CAAC,mBAAmB,CAAC;wBAC9F,CAAC;wBAED,iDAAiD;wBACjD,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;4BACzD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO;iCAChC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;iCAC5D,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAK,CAAC;iCACjB,IAAI,CAAC,IAAI,CAAC,CAAC;4BACd,IAAI,KAAK,EAAE,CAAC;gCACV,YAAY,GAAG,KAAK,CAAC;4BACvB,CAAC;wBACH,CAAC;wBAED,kCAAkC;wBAClC,MAAM,YAAY,GAAiB;4BACjC,IAAI,EAAE,KAAK,CAAC,IAAI;4BAChB,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,SAAS;4BACzC,OAAO,EAAE,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;yBACrE,CAAC;wBACF,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC;oBACxC,CAAC;oBAAC,MAAM,CAAC;wBACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,iCAAiC,CAAC,CAAC;oBACpE,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC7C,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC;YAEH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC/B,YAAY,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1E,CAAC,CAAC,CAAC;YAEH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE;gBAClC,IAAI,OAAO;oBAAE,OAAO;gBAEpB,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;oBAC3C,YAAY,CAAC,IAAI,KAAK,CAAC,2BAA2B,QAAQ,IAAI,CAAC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,kBAAkB,EAAE,CAAC,CAAC,CAAC;oBAC5G,OAAO;gBACT,CAAC;gBAED,aAAa,CAAC;oBACZ,SAAS;oBACT,YAAY,EAAE,YAAY,CAAC,IAAI,EAAE;oBACjC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;oBACrB,QAAQ,EAAE,QAAQ,IAAI,CAAC;oBACvB,WAAW;oBACX,YAAY;iBACb,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,cAAc,CAAC,KAAmB;QACvC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChE,OAAO,aAAa,KAAK,CAAC,OAAO,EAAE,CAAC;QACtC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAAC,WAAmB,EAAE,QAAgB,EAAE;QACtE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAqB,EAAE,CAAC;QACrC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,iBAAiB,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YAC1D,IAAI,CAAC,KAAK;gBAAE,SAAS;YACrB,OAAO,CAAC,IAAI,CAAC;gBACX,GAAG,OAAO;gBACV,SAAS,EAAE,KAAK,CAAC,IAAI;gBACrB,UAAU,EAAE,KAAK,CAAC,KAAK;aACxB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,OAAO;aACX,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACb,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;YAC7D,IAAI,UAAU,KAAK,CAAC;gBAAE,OAAO,UAAU,CAAC;YACxC,OAAO,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAChD,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACrB,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAAC,WAAmB;QAChD,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACjE,OAAO,OAAO,IAAI,IAAI,CAAC;IACzB,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,WAAmB,EAAE,SAAiB;QACjE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;QAChE,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAC5B,MAAM,KAAK,GAAG,iBAAiB,CAAC,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,OAAO,EAAE,GAAG,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IAC1E,CAAC;IAEO,SAAS,CAAC,OAAoE;QACpF,MAAM,IAAI,GAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;QAE5C,MAAM,cAAc,GAAG,OAAO,CAAC,aAAa,EAAE,cAAc,IAAI,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC;QAClG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC;QAE/C,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;QACvE,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,EAAE,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;QAClF,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,YAAY,GAAG,OAAO,CAAC,aAAa,EAAE,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;QACrF,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,YAAY,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,kBAAkB,GAAG,OAAO,CAAC,aAAa,EAAE,kBAAkB,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;QACvG,IAAI,kBAAkB,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,kBAAkB,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,cAAc,CAAC,UAAoB;QACzC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QACxD,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,UAAU,CAAC;QACnE,MAAM,cAAc,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,OAAO,iBAAiB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC;QAC1G,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC;IAC3D,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;QAEnD,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,gFAAgF;QAChF,mFAAmF;QACnF,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,SAAS;YACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAC/C,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YACvD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE;gBAAE,SAAS;YAE9B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAKhC,CAAC;gBAEF,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;gBACnC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;gBACvB,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG;oBAAE,SAAS;gBAEjC,MAAM,SAAS,GAAG,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;gBACtF,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC5E,MAAM,SAAS,GAAG,IAAI,IAAI,CACxB,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAC7D,CAAC,WAAW,EAAE,CAAC;gBAEhB,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACzC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;oBAChD,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE;wBACtB,SAAS;wBACT,GAAG;wBACH,SAAS;wBACT,SAAS;wBACT,QAAQ;wBACR,MAAM,EAAE,UAAU;wBAClB,OAAO,EAAE,QAAQ;qBAClB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACvF,CAAC;CACF;AAED,SAAS,oBAAoB;IAC3B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;IACnD,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IAC3D,IAAI,UAAU,KAAK,GAAG;QAAE,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;IAC5C,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACrF,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AAC7C,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAe;IACxC,OAAO,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;AAEhF,SAAS,iBAAiB,CAAC,WAAmB,EAAE,UAAkB;IAChE,MAAM,qBAAqB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1F,MAAM,qBAAqB,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAEzF,IAAI,qBAAqB,KAAK,qBAAqB,EAAE,CAAC;QACpD,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IAC5C,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;IACzD,IAAI,WAAW,KAAK,WAAW,EAAE,CAAC;QAChC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,qBAAqB,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IAChE,MAAM,qBAAqB,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IAChE,IAAI,qBAAqB,IAAI,qBAAqB,KAAK,qBAAqB,EAAE,CAAC;QAC7E,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAChD,CAAC;IAED,IAAI,qBAAqB,CAAC,MAAM,IAAI,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;QAC/F,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAClD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,MAAM,MAAM,GAAG,KAAK;SACjB,WAAW,EAAE;SACb,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,KAAK,CAAC,YAAY,CAAC;SACnB,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IACzE,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -7,3 +7,31 @@ export declare function resolveDefaultBackend(config: BridgeConfig): BackendName
|
|
|
7
7
|
export declare function resolveProjectBackend(config: BridgeConfig, projectAlias: string, codexSessionIndex?: CodexSessionIndex): Backend;
|
|
8
8
|
export declare function resolveProjectBackendWithOverride(config: BridgeConfig, projectAlias: string, sessionOverride?: BackendName, codexSessionIndex?: CodexSessionIndex): Backend;
|
|
9
9
|
export declare function resolveProjectBackendName(config: BridgeConfig, projectAlias: string, sessionOverride?: BackendName): BackendName;
|
|
10
|
+
export interface FailoverInfo {
|
|
11
|
+
from: BackendName;
|
|
12
|
+
to: BackendName;
|
|
13
|
+
reason: string;
|
|
14
|
+
}
|
|
15
|
+
export interface FailoverResolution {
|
|
16
|
+
backend: Backend;
|
|
17
|
+
name: BackendName;
|
|
18
|
+
failover?: FailoverInfo;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Resolve the backend to use for a run, with startup-only failover.
|
|
22
|
+
*
|
|
23
|
+
* Strategy (plan B):
|
|
24
|
+
* 1. Determine primary backend name (session override > project > default).
|
|
25
|
+
* 2. If failover is disabled, return the primary without probing.
|
|
26
|
+
* 3. Probe the primary. If it responds, return it.
|
|
27
|
+
* 4. If the primary probe fails, probe the alternate. If it responds,
|
|
28
|
+
* return it with a FailoverInfo describing the switch.
|
|
29
|
+
* 5. If both probes fail, return the primary anyway — the real run will
|
|
30
|
+
* surface the actual error with full context, and we avoid masking
|
|
31
|
+
* configuration mistakes with silent rewrites.
|
|
32
|
+
*
|
|
33
|
+
* Runtime failures during an actual run are NOT retried here. That is the
|
|
34
|
+
* deliberate boundary of plan B: we save users from "binary missing" and
|
|
35
|
+
* PATH issues, but we never burn tokens on speculative re-runs.
|
|
36
|
+
*/
|
|
37
|
+
export declare function resolveProjectBackendWithFailover(config: BridgeConfig, projectAlias: string, sessionOverride?: BackendName, codexSessionIndex?: CodexSessionIndex): Promise<FailoverResolution>;
|
package/dist/backend/factory.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { CodexBackend } from './codex.js';
|
|
2
2
|
import { ClaudeBackend } from './claude.js';
|
|
3
3
|
import { CodexSessionIndex } from '../codex/session-index.js';
|
|
4
|
+
import { extractProbeSpec, probeBackend } from './probe.js';
|
|
4
5
|
export function createBackend(config, codexSessionIndex) {
|
|
5
6
|
const backendName = resolveDefaultBackend(config);
|
|
6
7
|
return createBackendByName(backendName, config, codexSessionIndex);
|
|
@@ -53,4 +54,64 @@ export function resolveProjectBackendName(config, projectAlias, sessionOverride)
|
|
|
53
54
|
const project = config.projects[projectAlias];
|
|
54
55
|
return project?.backend ?? resolveDefaultBackend(config);
|
|
55
56
|
}
|
|
57
|
+
function otherBackend(name) {
|
|
58
|
+
return name === 'codex' ? 'claude' : 'codex';
|
|
59
|
+
}
|
|
60
|
+
function isFailoverEnabled(config, projectAlias) {
|
|
61
|
+
const project = config.projects[projectAlias];
|
|
62
|
+
if (project?.failover !== undefined)
|
|
63
|
+
return project.failover;
|
|
64
|
+
return config.backend?.failover ?? true;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Resolve the backend to use for a run, with startup-only failover.
|
|
68
|
+
*
|
|
69
|
+
* Strategy (plan B):
|
|
70
|
+
* 1. Determine primary backend name (session override > project > default).
|
|
71
|
+
* 2. If failover is disabled, return the primary without probing.
|
|
72
|
+
* 3. Probe the primary. If it responds, return it.
|
|
73
|
+
* 4. If the primary probe fails, probe the alternate. If it responds,
|
|
74
|
+
* return it with a FailoverInfo describing the switch.
|
|
75
|
+
* 5. If both probes fail, return the primary anyway — the real run will
|
|
76
|
+
* surface the actual error with full context, and we avoid masking
|
|
77
|
+
* configuration mistakes with silent rewrites.
|
|
78
|
+
*
|
|
79
|
+
* Runtime failures during an actual run are NOT retried here. That is the
|
|
80
|
+
* deliberate boundary of plan B: we save users from "binary missing" and
|
|
81
|
+
* PATH issues, but we never burn tokens on speculative re-runs.
|
|
82
|
+
*/
|
|
83
|
+
export async function resolveProjectBackendWithFailover(config, projectAlias, sessionOverride, codexSessionIndex) {
|
|
84
|
+
const primaryName = resolveProjectBackendName(config, projectAlias, sessionOverride);
|
|
85
|
+
if (!isFailoverEnabled(config, projectAlias)) {
|
|
86
|
+
return {
|
|
87
|
+
backend: createBackendByName(primaryName, config, codexSessionIndex),
|
|
88
|
+
name: primaryName,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const primaryProbe = await probeBackend(primaryName, extractProbeSpec(config, primaryName));
|
|
92
|
+
if (primaryProbe.ok) {
|
|
93
|
+
return {
|
|
94
|
+
backend: createBackendByName(primaryName, config, codexSessionIndex),
|
|
95
|
+
name: primaryName,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
const alternateName = otherBackend(primaryName);
|
|
99
|
+
const alternateProbe = await probeBackend(alternateName, extractProbeSpec(config, alternateName));
|
|
100
|
+
if (!alternateProbe.ok) {
|
|
101
|
+
// Both failed — let the primary run and report the real error.
|
|
102
|
+
return {
|
|
103
|
+
backend: createBackendByName(primaryName, config, codexSessionIndex),
|
|
104
|
+
name: primaryName,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
backend: createBackendByName(alternateName, config, codexSessionIndex),
|
|
109
|
+
name: alternateName,
|
|
110
|
+
failover: {
|
|
111
|
+
from: primaryName,
|
|
112
|
+
to: alternateName,
|
|
113
|
+
reason: primaryProbe.reason ?? 'unknown',
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
56
117
|
//# sourceMappingURL=factory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/backend/factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/backend/factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { BridgeConfig } from '../config/schema.js';
|
|
2
|
+
import type { BackendName } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Lightweight pre-run probe for a backend CLI.
|
|
5
|
+
*
|
|
6
|
+
* Used by the failover resolver to decide whether the primary backend is
|
|
7
|
+
* actually callable on this machine. Runs `<bin> --version` with a short
|
|
8
|
+
* timeout, respecting the same shell / pre_exec chain the real backend would
|
|
9
|
+
* use, so a broken `proxy_on` hook surfaces here rather than inside a real
|
|
10
|
+
* turn.
|
|
11
|
+
*
|
|
12
|
+
* Results are cached for 60 seconds keyed by (backend, bin, shell, preExec) —
|
|
13
|
+
* enough to absorb the common "several runs in quick succession" case without
|
|
14
|
+
* masking real fixes for longer than a minute.
|
|
15
|
+
*/
|
|
16
|
+
export interface ProbeResult {
|
|
17
|
+
ok: boolean;
|
|
18
|
+
/** Human-readable reason when ok=false. */
|
|
19
|
+
reason?: string;
|
|
20
|
+
}
|
|
21
|
+
/** Visible for tests. */
|
|
22
|
+
export declare function clearProbeCache(): void;
|
|
23
|
+
export interface ProbeSpec {
|
|
24
|
+
bin: string;
|
|
25
|
+
shell?: string | undefined;
|
|
26
|
+
preExec?: string | undefined;
|
|
27
|
+
}
|
|
28
|
+
export declare function extractProbeSpec(config: BridgeConfig, backend: BackendName): ProbeSpec;
|
|
29
|
+
export declare function probeBackend(backend: BackendName, spec: ProbeSpec): Promise<ProbeResult>;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
const PROBE_TIMEOUT_MS = 3000;
|
|
3
|
+
const CACHE_TTL_MS = 60_000;
|
|
4
|
+
const cache = new Map();
|
|
5
|
+
function cacheKey(backend, bin, shell, preExec) {
|
|
6
|
+
return `${backend}\0${bin}\0${shell ?? ''}\0${preExec ?? ''}`;
|
|
7
|
+
}
|
|
8
|
+
/** Visible for tests. */
|
|
9
|
+
export function clearProbeCache() {
|
|
10
|
+
cache.clear();
|
|
11
|
+
}
|
|
12
|
+
export function extractProbeSpec(config, backend) {
|
|
13
|
+
if (backend === 'claude') {
|
|
14
|
+
return {
|
|
15
|
+
bin: config.claude?.bin ?? 'claude',
|
|
16
|
+
shell: config.claude?.shell ?? config.codex.shell,
|
|
17
|
+
preExec: config.claude?.pre_exec ?? config.codex.pre_exec,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
bin: config.codex.bin,
|
|
22
|
+
shell: config.codex.shell,
|
|
23
|
+
preExec: config.codex.pre_exec,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function buildProbeCommand(spec) {
|
|
27
|
+
if (!spec.preExec) {
|
|
28
|
+
return { command: spec.bin, args: ['--version'] };
|
|
29
|
+
}
|
|
30
|
+
const shell = spec.shell ?? process.env.SHELL ?? '/bin/zsh';
|
|
31
|
+
// Single-quote bin because preExec is already a shell command line.
|
|
32
|
+
const chained = `${spec.preExec} && ${JSON.stringify(spec.bin)} --version`;
|
|
33
|
+
return { command: shell, args: ['-ic', chained] };
|
|
34
|
+
}
|
|
35
|
+
async function runProbe(spec) {
|
|
36
|
+
return new Promise((resolve) => {
|
|
37
|
+
const { command, args } = buildProbeCommand(spec);
|
|
38
|
+
let settled = false;
|
|
39
|
+
let stderr = '';
|
|
40
|
+
const child = spawn(command, args, {
|
|
41
|
+
stdio: ['ignore', 'ignore', 'pipe'],
|
|
42
|
+
});
|
|
43
|
+
const timer = setTimeout(() => {
|
|
44
|
+
if (settled)
|
|
45
|
+
return;
|
|
46
|
+
settled = true;
|
|
47
|
+
try {
|
|
48
|
+
child.kill('SIGKILL');
|
|
49
|
+
}
|
|
50
|
+
catch { /* ignore */ }
|
|
51
|
+
resolve({ ok: false, reason: `timeout after ${PROBE_TIMEOUT_MS}ms running ${spec.bin} --version` });
|
|
52
|
+
}, PROBE_TIMEOUT_MS);
|
|
53
|
+
timer.unref();
|
|
54
|
+
child.stderr?.on('data', (chunk) => {
|
|
55
|
+
stderr += chunk.toString();
|
|
56
|
+
if (stderr.length > 2000)
|
|
57
|
+
stderr = stderr.slice(0, 2000);
|
|
58
|
+
});
|
|
59
|
+
child.on('error', (error) => {
|
|
60
|
+
if (settled)
|
|
61
|
+
return;
|
|
62
|
+
settled = true;
|
|
63
|
+
clearTimeout(timer);
|
|
64
|
+
const code = error.code;
|
|
65
|
+
if (code === 'ENOENT') {
|
|
66
|
+
resolve({ ok: false, reason: `binary not found: ${spec.bin}` });
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
resolve({ ok: false, reason: `spawn error (${code ?? 'unknown'}): ${error.message}` });
|
|
70
|
+
});
|
|
71
|
+
child.on('exit', (exitCode) => {
|
|
72
|
+
if (settled)
|
|
73
|
+
return;
|
|
74
|
+
settled = true;
|
|
75
|
+
clearTimeout(timer);
|
|
76
|
+
if (exitCode === 0) {
|
|
77
|
+
resolve({ ok: true });
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const tail = stderr.trim().split('\n').slice(-1)[0] ?? '';
|
|
81
|
+
resolve({
|
|
82
|
+
ok: false,
|
|
83
|
+
reason: `${spec.bin} --version exited with code ${exitCode}${tail ? `: ${tail}` : ''}`,
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
export async function probeBackend(backend, spec) {
|
|
89
|
+
const key = cacheKey(backend, spec.bin, spec.shell, spec.preExec);
|
|
90
|
+
const now = Date.now();
|
|
91
|
+
const cached = cache.get(key);
|
|
92
|
+
if (cached && cached.expiresAt > now) {
|
|
93
|
+
return cached.result;
|
|
94
|
+
}
|
|
95
|
+
const result = await runProbe(spec);
|
|
96
|
+
cache.set(key, { expiresAt: now + CACHE_TTL_MS, result });
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probe.js","sourceRoot":"","sources":["../../src/backend/probe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { BridgeConfig, ProjectConfig } from '../config/schema.js';
|
|
2
|
+
import type { IncomingMessageContext } from './types.js';
|
|
3
|
+
import type { ConfigHistoryStore } from '../state/config-history-store.js';
|
|
4
|
+
/**
|
|
5
|
+
* Minimal runtime control surface that the admin-config handler needs.
|
|
6
|
+
* Matches the shape of FeiqueService's internal RuntimeControl interface
|
|
7
|
+
* but is declared here so this module does not depend on service.ts.
|
|
8
|
+
*/
|
|
9
|
+
export interface AdminConfigRuntimeControl {
|
|
10
|
+
configPath?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Subset of FeiqueService that the admin config mutation flows need.
|
|
14
|
+
* Several fields are exposed because the shared helpers
|
|
15
|
+
* (snapshotConfigForAdminMutation, reloadRuntimeConfigFromDisk,
|
|
16
|
+
* appendAdminAudit) stay on FeiqueService — they are called from many
|
|
17
|
+
* admin paths including the WIP /admin project setup flow. Moving them
|
|
18
|
+
* here would create a tangle. Instead, this host interface just routes
|
|
19
|
+
* calls back into the service instance.
|
|
20
|
+
*/
|
|
21
|
+
export interface AdminConfigHost {
|
|
22
|
+
readonly config: BridgeConfig;
|
|
23
|
+
readonly runtimeControl?: AdminConfigRuntimeControl;
|
|
24
|
+
readonly configHistoryStore: ConfigHistoryStore;
|
|
25
|
+
sendTextReply(chatId: string, body: string, replyToMessageId?: string, originalText?: string): Promise<unknown>;
|
|
26
|
+
snapshotConfigForAdminMutation(context: IncomingMessageContext, action: string, summary?: string): Promise<{
|
|
27
|
+
id: string;
|
|
28
|
+
content: string;
|
|
29
|
+
}>;
|
|
30
|
+
reloadRuntimeConfigFromDisk(configPath: string): Promise<void>;
|
|
31
|
+
appendAdminAudit(event: {
|
|
32
|
+
type: string;
|
|
33
|
+
[key: string]: unknown;
|
|
34
|
+
}): Promise<void>;
|
|
35
|
+
}
|
|
36
|
+
export declare function handleAdminConfigCommand(host: AdminConfigHost, context: IncomingMessageContext, command: {
|
|
37
|
+
kind: 'admin';
|
|
38
|
+
resource: 'config';
|
|
39
|
+
action: 'history' | 'rollback';
|
|
40
|
+
value?: string;
|
|
41
|
+
}): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Resolve a list field patch with incremental add (+value) / remove (-value) support.
|
|
44
|
+
* Plain values (no prefix) replace the entire list for backward compatibility.
|
|
45
|
+
*/
|
|
46
|
+
export declare function resolveListPatch(config: BridgeConfig, field: string, value: string, projectAlias?: string): string[];
|
|
47
|
+
export declare function parseProjectPatch(config: BridgeConfig, field: string, value: string, projectAlias?: string): Partial<ProjectConfig> | null;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { writeUtf8Atomic } from '../utils/fs.js';
|
|
2
|
+
import { canAccessGlobalCapability } from '../security/access.js';
|
|
3
|
+
import { splitCommaSeparatedValues } from './service-utils.js';
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// /admin config history|rollback
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
export async function handleAdminConfigCommand(host, context, command) {
|
|
8
|
+
const canMutate = canAccessGlobalCapability(host.config, context.chat_id, 'config:mutate');
|
|
9
|
+
const canRead = canAccessGlobalCapability(host.config, context.chat_id, 'config:history') || canMutate;
|
|
10
|
+
if (command.action === 'history' && !canRead) {
|
|
11
|
+
await host.sendTextReply(context.chat_id, '当前 chat_id 无权查看配置历史。', context.message_id, context.text);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
if (command.action === 'rollback' && !canMutate) {
|
|
15
|
+
await host.sendTextReply(context.chat_id, '当前 chat_id 无权回滚配置。', context.message_id, context.text);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (!host.runtimeControl?.configPath) {
|
|
19
|
+
await host.sendTextReply(context.chat_id, '当前运行实例没有可写配置路径,无法执行配置历史操作。', context.message_id, context.text);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const configPath = host.runtimeControl.configPath;
|
|
23
|
+
if (command.action === 'history') {
|
|
24
|
+
const snapshots = await host.configHistoryStore.listSnapshots();
|
|
25
|
+
if (snapshots.length === 0) {
|
|
26
|
+
await host.sendTextReply(context.chat_id, '当前没有可回滚的配置快照。', context.message_id, context.text);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const lines = ['最近配置快照:'];
|
|
30
|
+
for (const snapshot of snapshots) {
|
|
31
|
+
lines.push(`- ${snapshot.id} | ${snapshot.at} | ${snapshot.action}${snapshot.summary ? ` | ${snapshot.summary}` : ''}`);
|
|
32
|
+
}
|
|
33
|
+
await host.sendTextReply(context.chat_id, lines.join('\n'), context.message_id, context.text);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const target = await host.configHistoryStore.getSnapshot(command.value);
|
|
37
|
+
if (!target) {
|
|
38
|
+
await host.sendTextReply(context.chat_id, '未找到指定配置快照。可先执行 `/admin config history`。', context.message_id, context.text);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const rollbackSnapshot = await host.snapshotConfigForAdminMutation(context, 'config.rollback', `rollback -> ${target.id}`);
|
|
42
|
+
const previousContent = rollbackSnapshot.content;
|
|
43
|
+
try {
|
|
44
|
+
await writeUtf8Atomic(configPath, target.content);
|
|
45
|
+
await host.reloadRuntimeConfigFromDisk(configPath);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
await writeUtf8Atomic(configPath, previousContent);
|
|
49
|
+
await host.reloadRuntimeConfigFromDisk(configPath);
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
await host.appendAdminAudit({
|
|
53
|
+
type: 'admin.config.rollback',
|
|
54
|
+
chat_id: context.chat_id,
|
|
55
|
+
actor_id: context.actor_id,
|
|
56
|
+
target_snapshot_id: target.id,
|
|
57
|
+
snapshot_id: rollbackSnapshot.id,
|
|
58
|
+
config_path: configPath,
|
|
59
|
+
});
|
|
60
|
+
await host.sendTextReply(context.chat_id, `已回滚配置。\n目标快照: ${target.id}\n回滚前快照: ${rollbackSnapshot.id}\n如需生效到某些运行时状态,请再执行 /admin service restart。`, context.message_id, context.text);
|
|
61
|
+
}
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
// /admin project set — field patch parsing
|
|
64
|
+
// ---------------------------------------------------------------------------
|
|
65
|
+
/**
|
|
66
|
+
* Resolve a list field patch with incremental add (+value) / remove (-value) support.
|
|
67
|
+
* Plain values (no prefix) replace the entire list for backward compatibility.
|
|
68
|
+
*/
|
|
69
|
+
export function resolveListPatch(config, field, value, projectAlias) {
|
|
70
|
+
const trimmed = value.trim();
|
|
71
|
+
// Incremental add: "+oc_xxx" or "+oc_xxx,oc_yyy"
|
|
72
|
+
if (trimmed.startsWith('+')) {
|
|
73
|
+
const toAdd = splitCommaSeparatedValues(trimmed.slice(1));
|
|
74
|
+
const existing = projectAlias ? (config.projects[projectAlias]?.[field] ?? []) : [];
|
|
75
|
+
return Array.from(new Set([...existing, ...toAdd]));
|
|
76
|
+
}
|
|
77
|
+
// Incremental remove: "-oc_xxx" or "-oc_xxx,oc_yyy"
|
|
78
|
+
if (trimmed.startsWith('-')) {
|
|
79
|
+
const toRemove = new Set(splitCommaSeparatedValues(trimmed.slice(1)));
|
|
80
|
+
const existing = projectAlias ? (config.projects[projectAlias]?.[field] ?? []) : [];
|
|
81
|
+
return existing.filter((id) => !toRemove.has(id));
|
|
82
|
+
}
|
|
83
|
+
// Replace: "oc_xxx,oc_yyy"
|
|
84
|
+
return splitCommaSeparatedValues(value);
|
|
85
|
+
}
|
|
86
|
+
export function parseProjectPatch(config, field, value, projectAlias) {
|
|
87
|
+
switch (field) {
|
|
88
|
+
case 'root':
|
|
89
|
+
return { root: value };
|
|
90
|
+
case 'profile':
|
|
91
|
+
return { profile: value };
|
|
92
|
+
case 'sandbox':
|
|
93
|
+
if (value === 'read-only' || value === 'workspace-write' || value === 'danger-full-access') {
|
|
94
|
+
return { sandbox: value };
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
case 'session_scope':
|
|
98
|
+
if (value === 'chat' || value === 'chat-user') {
|
|
99
|
+
return { session_scope: value };
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
case 'mention_required':
|
|
103
|
+
if (value === 'true' || value === 'false') {
|
|
104
|
+
return { mention_required: value === 'true' };
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
case 'description':
|
|
108
|
+
return { description: value };
|
|
109
|
+
case 'viewer_chat_ids':
|
|
110
|
+
case 'operator_chat_ids':
|
|
111
|
+
case 'admin_chat_ids':
|
|
112
|
+
case 'session_operator_chat_ids':
|
|
113
|
+
case 'run_operator_chat_ids':
|
|
114
|
+
case 'config_admin_chat_ids':
|
|
115
|
+
case 'notification_chat_ids':
|
|
116
|
+
return { [field]: resolveListPatch(config, field, value, projectAlias) };
|
|
117
|
+
case 'download_dir':
|
|
118
|
+
return { download_dir: value };
|
|
119
|
+
case 'temp_dir':
|
|
120
|
+
return { temp_dir: value };
|
|
121
|
+
case 'cache_dir':
|
|
122
|
+
return { cache_dir: value };
|
|
123
|
+
case 'log_dir':
|
|
124
|
+
return { log_dir: value };
|
|
125
|
+
case 'run_priority': {
|
|
126
|
+
const parsed = Number(value);
|
|
127
|
+
return Number.isInteger(parsed) && parsed >= 1 && parsed <= 1000 ? { run_priority: parsed } : null;
|
|
128
|
+
}
|
|
129
|
+
case 'chat_rate_limit_window_seconds': {
|
|
130
|
+
const parsed = Number(value);
|
|
131
|
+
return Number.isInteger(parsed) && parsed > 0 ? { chat_rate_limit_window_seconds: parsed } : null;
|
|
132
|
+
}
|
|
133
|
+
case 'chat_rate_limit_max_runs': {
|
|
134
|
+
const parsed = Number(value);
|
|
135
|
+
return Number.isInteger(parsed) && parsed > 0 ? { chat_rate_limit_max_runs: parsed } : null;
|
|
136
|
+
}
|
|
137
|
+
default:
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=admin-config.js.map
|