feihong-code 0.2.1

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 (154) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +37 -0
  2. package/.github/ISSUE_TEMPLATE/config.yml +14 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +28 -0
  4. package/.github/PULL_REQUEST_TEMPLATE.md +46 -0
  5. package/.github/SECURITY.md +67 -0
  6. package/.github/workflows/ci.yml +140 -0
  7. package/AGENT-GUIDE.md +237 -0
  8. package/CHANGELOG.md +73 -0
  9. package/CODE_OF_CONDUCT.md +56 -0
  10. package/CONTRIBUTING.md +68 -0
  11. package/LICENSE +22 -0
  12. package/README.md +500 -0
  13. package/dist/agent/code-review.js +115 -0
  14. package/dist/agent/code-review.js.map +1 -0
  15. package/dist/agent/code-writer.js +227 -0
  16. package/dist/agent/code-writer.js.map +1 -0
  17. package/dist/agent/context-compactor.js +108 -0
  18. package/dist/agent/context-compactor.js.map +1 -0
  19. package/dist/agent/experience.js +190 -0
  20. package/dist/agent/experience.js.map +1 -0
  21. package/dist/agent/orchestrator.js +212 -0
  22. package/dist/agent/orchestrator.js.map +1 -0
  23. package/dist/agent/parallel-orchestrator.js +94 -0
  24. package/dist/agent/parallel-orchestrator.js.map +1 -0
  25. package/dist/agent/planner.js +53 -0
  26. package/dist/agent/planner.js.map +1 -0
  27. package/dist/agent/prompts.js +26 -0
  28. package/dist/agent/prompts.js.map +1 -0
  29. package/dist/agent/quality-gate.js +143 -0
  30. package/dist/agent/quality-gate.js.map +1 -0
  31. package/dist/agent/repo-reader.js +384 -0
  32. package/dist/agent/repo-reader.js.map +1 -0
  33. package/dist/agent/repo-underwriter.js +132 -0
  34. package/dist/agent/repo-underwriter.js.map +1 -0
  35. package/dist/agent/self-heal.js +134 -0
  36. package/dist/agent/self-heal.js.map +1 -0
  37. package/dist/agent/self-improver.js +148 -0
  38. package/dist/agent/self-improver.js.map +1 -0
  39. package/dist/agent/subagent.js +75 -0
  40. package/dist/agent/subagent.js.map +1 -0
  41. package/dist/agent/swe-agent.js +162 -0
  42. package/dist/agent/swe-agent.js.map +1 -0
  43. package/dist/agent/swe-planner.js +155 -0
  44. package/dist/agent/swe-planner.js.map +1 -0
  45. package/dist/agent/swe-verifier.js +113 -0
  46. package/dist/agent/swe-verifier.js.map +1 -0
  47. package/dist/cli/commands.js +167 -0
  48. package/dist/cli/commands.js.map +1 -0
  49. package/dist/cli/index.js +179 -0
  50. package/dist/cli/index.js.map +1 -0
  51. package/dist/cli/repl.js +67 -0
  52. package/dist/cli/repl.js.map +1 -0
  53. package/dist/cli/run.js +762 -0
  54. package/dist/cli/run.js.map +1 -0
  55. package/dist/cli/version.js +14 -0
  56. package/dist/cli/version.js.map +1 -0
  57. package/dist/enterprise/audit.js +294 -0
  58. package/dist/enterprise/audit.js.map +1 -0
  59. package/dist/enterprise/guard.js +58 -0
  60. package/dist/enterprise/guard.js.map +1 -0
  61. package/dist/enterprise/index.js +99 -0
  62. package/dist/enterprise/index.js.map +1 -0
  63. package/dist/enterprise/policy.js +242 -0
  64. package/dist/enterprise/policy.js.map +1 -0
  65. package/dist/enterprise/quota.js +58 -0
  66. package/dist/enterprise/quota.js.map +1 -0
  67. package/dist/enterprise/tenant.js +143 -0
  68. package/dist/enterprise/tenant.js.map +1 -0
  69. package/dist/models/cost.js +13 -0
  70. package/dist/models/cost.js.map +1 -0
  71. package/dist/models/model-router.js +170 -0
  72. package/dist/models/model-router.js.map +1 -0
  73. package/dist/models/model.dto.js +61 -0
  74. package/dist/models/model.dto.js.map +1 -0
  75. package/dist/models/model.interface.js +3 -0
  76. package/dist/models/model.interface.js.map +1 -0
  77. package/dist/models/providers/mock.provider.js +35 -0
  78. package/dist/models/providers/mock.provider.js.map +1 -0
  79. package/dist/models/providers/ollama.provider.js +88 -0
  80. package/dist/models/providers/ollama.provider.js.map +1 -0
  81. package/dist/models/providers/openai-compatible.provider.js +106 -0
  82. package/dist/models/providers/openai-compatible.provider.js.map +1 -0
  83. package/dist/runtime/event-log.js +42 -0
  84. package/dist/runtime/event-log.js.map +1 -0
  85. package/dist/runtime/git.js +106 -0
  86. package/dist/runtime/git.js.map +1 -0
  87. package/dist/runtime/session-persist.js +60 -0
  88. package/dist/runtime/session-persist.js.map +1 -0
  89. package/dist/runtime/session-store.js +34 -0
  90. package/dist/runtime/session-store.js.map +1 -0
  91. package/dist/runtime/worktree.js +117 -0
  92. package/dist/runtime/worktree.js.map +1 -0
  93. package/dist/shared/config.js +184 -0
  94. package/dist/shared/config.js.map +1 -0
  95. package/dist/shared/errors.js +66 -0
  96. package/dist/shared/errors.js.map +1 -0
  97. package/dist/shared/logger.js +51 -0
  98. package/dist/shared/logger.js.map +1 -0
  99. package/dist/shared/types.js +9 -0
  100. package/dist/shared/types.js.map +1 -0
  101. package/dist/skills/goal.js +60 -0
  102. package/dist/skills/goal.js.map +1 -0
  103. package/dist/skills/grill.js +129 -0
  104. package/dist/skills/grill.js.map +1 -0
  105. package/dist/skills/plan.js +40 -0
  106. package/dist/skills/plan.js.map +1 -0
  107. package/dist/tools/analysis/code-analyzer.js +136 -0
  108. package/dist/tools/analysis/code-analyzer.js.map +1 -0
  109. package/dist/tools/file/edit.tool.js +43 -0
  110. package/dist/tools/file/edit.tool.js.map +1 -0
  111. package/dist/tools/file/list.tool.js +36 -0
  112. package/dist/tools/file/list.tool.js.map +1 -0
  113. package/dist/tools/file/read.tool.js +34 -0
  114. package/dist/tools/file/read.tool.js.map +1 -0
  115. package/dist/tools/file/write.tool.js +39 -0
  116. package/dist/tools/file/write.tool.js.map +1 -0
  117. package/dist/tools/generator/code-generator.js +119 -0
  118. package/dist/tools/generator/code-generator.js.map +1 -0
  119. package/dist/tools/generator/test-generator.js +65 -0
  120. package/dist/tools/generator/test-generator.js.map +1 -0
  121. package/dist/tools/index.js +53 -0
  122. package/dist/tools/index.js.map +1 -0
  123. package/dist/tools/safe-path.js +36 -0
  124. package/dist/tools/safe-path.js.map +1 -0
  125. package/dist/tools/search/grep.tool.js +81 -0
  126. package/dist/tools/search/grep.tool.js.map +1 -0
  127. package/dist/tools/shell/exec.js +50 -0
  128. package/dist/tools/shell/exec.js.map +1 -0
  129. package/dist/tools/shell/run-shell.tool.js +49 -0
  130. package/dist/tools/shell/run-shell.tool.js.map +1 -0
  131. package/dist/tools/tool.interface.js +8 -0
  132. package/dist/tools/tool.interface.js.map +1 -0
  133. package/dist/tools/tool.registry.js +75 -0
  134. package/dist/tools/tool.registry.js.map +1 -0
  135. package/dist/tools/verify/build-check.tool.js +37 -0
  136. package/dist/tools/verify/build-check.tool.js.map +1 -0
  137. package/dist/tools/verify/test-run.tool.js +37 -0
  138. package/dist/tools/verify/test-run.tool.js.map +1 -0
  139. package/dist/web/auth.js +25 -0
  140. package/dist/web/auth.js.map +1 -0
  141. package/dist/web/public/index.html +39 -0
  142. package/dist/web/server.js +60 -0
  143. package/dist/web/server.js.map +1 -0
  144. package/docs//344/272/247/345/223/201/345/274/200/345/217/221/346/226/207/346/241/243.md +614 -0
  145. package/docs//344/274/201/344/270/232/351/203/250/347/275/262/344/270/216/345/220/210/350/247/204.md +267 -0
  146. package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +358 -0
  147. package/docs//345/270/270/350/247/201/351/227/256/351/242/230/344/270/216/346/225/205/351/232/234/346/216/222/346/237/245.md +130 -0
  148. package/docs//346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +303 -0
  149. package/docs//346/236/266/346/236/204/344/270/216API.md +238 -0
  150. package/docs//347/224/250/346/210/267/346/211/213/345/206/214.md +196 -0
  151. package/docs//351/203/250/347/275/262/346/214/207/345/215/227.md +165 -0
  152. package/docs//351/205/215/347/275/256/345/217/202/350/200/203.md +127 -0
  153. package/package.json +83 -0
  154. package/tool-schema.json +127 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-router.js","sourceRoot":"","sources":["../../src/models/model-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ollamaChatResponseSchema = exports.openAIChatResponseSchema = exports.openAIMessageSchema = void 0;
4
+ exports.parseToolArgs = parseToolArgs;
5
+ /**
6
+ * 飞虹 Code (Muse Code 参照复刻)
7
+ * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
8
+ *
9
+ * 模型响应 zod 校验 + 工具参数归一化(供应商返回结构不可信,必须校验)
10
+ */
11
+ const zod_1 = require("zod");
12
+ exports.openAIMessageSchema = zod_1.z.object({
13
+ role: zod_1.z.string(),
14
+ content: zod_1.z.string().nullable().optional(),
15
+ tool_calls: zod_1.z
16
+ .array(zod_1.z.object({
17
+ id: zod_1.z.string(),
18
+ type: zod_1.z.literal('function'),
19
+ function: zod_1.z.object({
20
+ name: zod_1.z.string(),
21
+ arguments: zod_1.z.union([zod_1.z.string(), zod_1.z.record(zod_1.z.string(), zod_1.z.unknown())]),
22
+ }),
23
+ }))
24
+ .optional(),
25
+ tool_call_id: zod_1.z.string().optional(),
26
+ });
27
+ exports.openAIChatResponseSchema = zod_1.z.object({
28
+ model: zod_1.z.string(),
29
+ choices: zod_1.z
30
+ .array(zod_1.z.object({ message: exports.openAIMessageSchema, finish_reason: zod_1.z.string().optional() }))
31
+ .min(1),
32
+ usage: zod_1.z
33
+ .object({
34
+ prompt_tokens: zod_1.z.number(),
35
+ completion_tokens: zod_1.z.number(),
36
+ total_tokens: zod_1.z.number(),
37
+ })
38
+ .optional(),
39
+ });
40
+ exports.ollamaChatResponseSchema = zod_1.z.object({
41
+ model: zod_1.z.string(),
42
+ message: exports.openAIMessageSchema,
43
+ done: zod_1.z.boolean().optional(),
44
+ prompt_eval_count: zod_1.z.number().optional(),
45
+ eval_count: zod_1.z.number().optional(),
46
+ });
47
+ /** 将模型返回的工具参数(可能是 JSON 字符串或对象)归一为对象 */
48
+ function parseToolArgs(raw) {
49
+ if (typeof raw === 'string') {
50
+ try {
51
+ return JSON.parse(raw);
52
+ }
53
+ catch {
54
+ return {};
55
+ }
56
+ }
57
+ if (raw && typeof raw === 'object')
58
+ return raw;
59
+ return {};
60
+ }
61
+ //# sourceMappingURL=model.dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.dto.js","sourceRoot":"","sources":["../../src/models/model.dto.ts"],"names":[],"mappings":";;;AAiDA,sCAUC;AA3DD;;;;;GAKG;AACH,6BAAwB;AAEX,QAAA,mBAAmB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC1C,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACzC,UAAU,EAAE,OAAC;SACV,KAAK,CACJ,OAAC,CAAC,MAAM,CAAC;QACP,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE;QACd,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,UAAU,CAAC;QAC3B,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC;YACjB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;YAChB,SAAS,EAAE,OAAC,CAAC,KAAK,CAAC,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;SACpE,CAAC;KACH,CAAC,CACH;SACA,QAAQ,EAAE;IACb,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAEU,QAAA,wBAAwB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC/C,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE;IACjB,OAAO,EAAE,OAAC;SACP,KAAK,CAAC,OAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,2BAAmB,EAAE,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;SACvF,GAAG,CAAC,CAAC,CAAC;IACT,KAAK,EAAE,OAAC;SACL,MAAM,CAAC;QACN,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE;QACzB,iBAAiB,EAAE,OAAC,CAAC,MAAM,EAAE;QAC7B,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE;KACzB,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC;AAEU,QAAA,wBAAwB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC/C,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE;IACjB,OAAO,EAAE,2BAAmB;IAC5B,IAAI,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC5B,iBAAiB,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxC,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC;AAEH,uCAAuC;AACvC,SAAgB,aAAa,CAAC,GAAY;IACxC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IACD,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAA8B,CAAC;IAC1E,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=model.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.interface.js","sourceRoot":"","sources":["../../src/models/model.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ScriptedMockProvider = void 0;
4
+ const ZERO_USAGE = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };
5
+ /**
6
+ * 按预设步骤依次返回响应的 provider。
7
+ * orchestrator 每轮调用一次 chat(),依次消费 steps;
8
+ * 步骤耗尽后固定返回最后一步(通常用于最终总结,不含 toolCalls)。
9
+ */
10
+ class ScriptedMockProvider {
11
+ steps;
12
+ id = 'mock';
13
+ model = 'mock-model';
14
+ tags = ['code-gen', 'cheap'];
15
+ costPer1k = 0;
16
+ idx = 0;
17
+ constructor(steps) {
18
+ this.steps = steps;
19
+ if (steps.length === 0)
20
+ throw new Error('ScriptedMockProvider 至少需要一个步骤');
21
+ }
22
+ async chat(_req) {
23
+ const step = this.steps[Math.min(this.idx, this.steps.length - 1)];
24
+ this.idx += 1;
25
+ return {
26
+ message: step.message,
27
+ usage: step.usage ?? ZERO_USAGE,
28
+ providerId: this.id,
29
+ model: this.model,
30
+ costUsd: 0,
31
+ };
32
+ }
33
+ }
34
+ exports.ScriptedMockProvider = ScriptedMockProvider;
35
+ //# sourceMappingURL=mock.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.provider.js","sourceRoot":"","sources":["../../../src/models/providers/mock.provider.ts"],"names":[],"mappings":";;;AAeA,MAAM,UAAU,GAAe,EAAE,YAAY,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;AAExF;;;;GAIG;AACH,MAAa,oBAAoB;IAOF;IANpB,EAAE,GAAG,MAAM,CAAC;IACZ,KAAK,GAAG,YAAY,CAAC;IACrB,IAAI,GAAoB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC9C,SAAS,GAAG,CAAC,CAAC;IACf,GAAG,GAAG,CAAC,CAAC;IAEhB,YAA6B,KAAiB;QAAjB,UAAK,GAAL,KAAK,CAAY;QAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAiB;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACd,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,UAAU;YAC/B,UAAU,EAAE,IAAI,CAAC,EAAE;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,CAAC;SACX,CAAC;IACJ,CAAC;CACF;AAtBD,oDAsBC"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OllamaProvider = void 0;
4
+ /**
5
+ * 飞虹 Code (Muse Code 参照复刻)
6
+ * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
7
+ *
8
+ * Ollama 本地供应商(数据不出本机,零成本)
9
+ */
10
+ const errors_1 = require("../../shared/errors");
11
+ const model_dto_1 = require("../model.dto");
12
+ const cost_1 = require("../cost");
13
+ class OllamaProvider {
14
+ id;
15
+ model;
16
+ tags;
17
+ costPer1k;
18
+ baseURL;
19
+ constructor(cfg) {
20
+ this.id = cfg.id;
21
+ this.model = cfg.model ?? cfg.id;
22
+ this.tags = cfg.tags;
23
+ this.costPer1k = cfg.costPer1k ?? 0;
24
+ this.baseURL = cfg.baseURL.replace(/\/$/, '');
25
+ }
26
+ async chat(req) {
27
+ const body = {
28
+ model: this.model,
29
+ messages: req.messages.map((m) => ({
30
+ role: m.role,
31
+ content: m.content,
32
+ tool_calls: m.toolCalls && m.toolCalls.length > 0 ? m.toolCalls : undefined,
33
+ })),
34
+ tools: req.tools && req.tools.length > 0 ? req.tools : undefined,
35
+ stream: false,
36
+ };
37
+ const controller = new AbortController();
38
+ let timer;
39
+ if (req.timeoutMs && req.timeoutMs > 0) {
40
+ timer = setTimeout(() => controller.abort(), req.timeoutMs);
41
+ }
42
+ let res;
43
+ try {
44
+ res = await fetch(`${this.baseURL}/api/chat`, {
45
+ method: 'POST',
46
+ headers: { 'Content-Type': 'application/json' },
47
+ body: JSON.stringify(body),
48
+ signal: controller.signal,
49
+ });
50
+ }
51
+ catch (e) {
52
+ throw new errors_1.ModelError(`网络请求失败: ${e instanceof Error ? e.message : String(e)}`, this.id);
53
+ }
54
+ finally {
55
+ if (timer)
56
+ clearTimeout(timer);
57
+ }
58
+ if (!res.ok) {
59
+ const text = await res.text().catch(() => '');
60
+ throw new errors_1.ModelError(`HTTP ${res.status} ${text.slice(0, 200)}`, this.id);
61
+ }
62
+ const json = await res.json().catch(() => undefined);
63
+ const parsed = model_dto_1.ollamaChatResponseSchema.safeParse(json);
64
+ if (!parsed.success) {
65
+ throw new errors_1.ModelError(`响应结构校验失败: ${parsed.error.message}`, this.id);
66
+ }
67
+ const msg = parsed.data.message;
68
+ const toolCalls = msg.tool_calls?.map((tc) => ({
69
+ id: tc.id,
70
+ name: tc.function.name,
71
+ arguments: (0, model_dto_1.parseToolArgs)(tc.function.arguments),
72
+ }));
73
+ const usage = {
74
+ promptTokens: parsed.data.prompt_eval_count ?? 0,
75
+ completionTokens: parsed.data.eval_count ?? 0,
76
+ totalTokens: (parsed.data.prompt_eval_count ?? 0) + (parsed.data.eval_count ?? 0),
77
+ };
78
+ return {
79
+ message: { role: 'assistant', content: msg.content ?? '', toolCalls },
80
+ usage,
81
+ providerId: this.id,
82
+ model: this.model,
83
+ costUsd: (0, cost_1.estimateCost)(usage, this.costPer1k),
84
+ };
85
+ }
86
+ }
87
+ exports.OllamaProvider = OllamaProvider;
88
+ //# sourceMappingURL=ollama.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.provider.js","sourceRoot":"","sources":["../../../src/models/providers/ollama.provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OpenAICompatibleProvider = void 0;
4
+ /**
5
+ * 飞虹 Code (Muse Code 参照复刻)
6
+ * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
7
+ *
8
+ * OpenAI 兼容供应商(DeepSeek / 通义 / OpenRouter 等 OpenAI 协议接口)
9
+ */
10
+ const errors_1 = require("../../shared/errors");
11
+ const model_dto_1 = require("../model.dto");
12
+ const cost_1 = require("../cost");
13
+ class OpenAICompatibleProvider {
14
+ id;
15
+ model;
16
+ tags;
17
+ costPer1k;
18
+ baseURL;
19
+ apiKey;
20
+ constructor(cfg) {
21
+ this.id = cfg.id;
22
+ this.model = cfg.model ?? cfg.id;
23
+ this.tags = cfg.tags;
24
+ this.costPer1k = cfg.costPer1k ?? 0;
25
+ this.baseURL = cfg.baseURL.replace(/\/$/, '');
26
+ this.apiKey = cfg.apiKey;
27
+ }
28
+ async chat(req) {
29
+ const body = {
30
+ model: this.model,
31
+ messages: req.messages.map((m) => ({
32
+ role: m.role,
33
+ content: m.content,
34
+ tool_calls: m.toolCalls?.map((t) => ({
35
+ id: t.id,
36
+ type: 'function',
37
+ function: { name: t.name, arguments: JSON.stringify(t.arguments) },
38
+ })),
39
+ tool_call_id: m.toolCallId,
40
+ })),
41
+ tools: req.tools && req.tools.length > 0
42
+ ? req.tools.map((t) => ({
43
+ type: 'function',
44
+ function: { name: t.name, description: t.description, parameters: t.parameters },
45
+ }))
46
+ : undefined,
47
+ temperature: req.temperature ?? 0,
48
+ max_tokens: req.maxTokens ?? 4096,
49
+ };
50
+ const controller = new AbortController();
51
+ let timer;
52
+ if (req.timeoutMs && req.timeoutMs > 0) {
53
+ timer = setTimeout(() => controller.abort(), req.timeoutMs);
54
+ }
55
+ let res;
56
+ try {
57
+ res = await fetch(`${this.baseURL}/chat/completions`, {
58
+ method: 'POST',
59
+ headers: {
60
+ 'Content-Type': 'application/json',
61
+ ...(this.apiKey ? { Authorization: `Bearer ${this.apiKey}` } : {}),
62
+ },
63
+ body: JSON.stringify(body),
64
+ signal: controller.signal,
65
+ });
66
+ }
67
+ catch (e) {
68
+ throw new errors_1.ModelError(`网络请求失败: ${e instanceof Error ? e.message : String(e)}`, this.id);
69
+ }
70
+ finally {
71
+ if (timer)
72
+ clearTimeout(timer);
73
+ }
74
+ if (!res.ok) {
75
+ const text = await res.text().catch(() => '');
76
+ throw new errors_1.ModelError(`HTTP ${res.status} ${text.slice(0, 200)}`, this.id);
77
+ }
78
+ const json = await res.json().catch(() => undefined);
79
+ const parsed = model_dto_1.openAIChatResponseSchema.safeParse(json);
80
+ if (!parsed.success) {
81
+ throw new errors_1.ModelError(`响应结构校验失败: ${parsed.error.message}`, this.id);
82
+ }
83
+ const choice = parsed.data.choices[0];
84
+ const usage = parsed.data.usage
85
+ ? {
86
+ promptTokens: parsed.data.usage.prompt_tokens,
87
+ completionTokens: parsed.data.usage.completion_tokens,
88
+ totalTokens: parsed.data.usage.total_tokens,
89
+ }
90
+ : { promptTokens: 0, completionTokens: 0, totalTokens: 0 };
91
+ const toolCalls = choice.message.tool_calls?.map((tc) => ({
92
+ id: tc.id,
93
+ name: tc.function.name,
94
+ arguments: (0, model_dto_1.parseToolArgs)(tc.function.arguments),
95
+ }));
96
+ return {
97
+ message: { role: 'assistant', content: choice.message.content ?? '', toolCalls },
98
+ usage,
99
+ providerId: this.id,
100
+ model: this.model,
101
+ costUsd: (0, cost_1.estimateCost)(usage, this.costPer1k),
102
+ };
103
+ }
104
+ }
105
+ exports.OpenAICompatibleProvider = OpenAICompatibleProvider;
106
+ //# sourceMappingURL=openai-compatible.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-compatible.provider.js","sourceRoot":"","sources":["../../../src/models/providers/openai-compatible.provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EventLog = void 0;
4
+ /**
5
+ * 飞虹 Code (Muse Code 参照复刻)
6
+ * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
7
+ *
8
+ * 事件日志(append-only JSONL,单一可信源)。
9
+ * 所有模型调用、工具调用、结果都落盘,便于审计与 M3 长时任务恢复。
10
+ */
11
+ const promises_1 = require("fs/promises");
12
+ const path_1 = require("path");
13
+ const os_1 = require("os");
14
+ const logger_1 = require("../shared/logger");
15
+ function expandHome(p) {
16
+ return p.startsWith('~') ? p.replace(/^~/, (0, os_1.homedir)()) : p;
17
+ }
18
+ class EventLog {
19
+ runId;
20
+ file;
21
+ constructor(runId, logDir) {
22
+ this.runId = runId;
23
+ this.file = `${expandHome(logDir)}/${runId}.jsonl`;
24
+ }
25
+ async append(type, payload) {
26
+ const ev = { ts: new Date().toISOString(), runId: this.runId, type, ...payload };
27
+ try {
28
+ await (0, promises_1.mkdir)((0, path_1.dirname)(this.file), { recursive: true });
29
+ await (0, promises_1.appendFile)(this.file, JSON.stringify(ev) + '\n', 'utf8');
30
+ }
31
+ catch (e) {
32
+ logger_1.logger.warn('event-log append failed', {
33
+ error: e instanceof Error ? e.message : String(e),
34
+ });
35
+ }
36
+ }
37
+ get filePath() {
38
+ return this.file;
39
+ }
40
+ }
41
+ exports.EventLog = EventLog;
42
+ //# sourceMappingURL=event-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-log.js","sourceRoot":"","sources":["../../src/runtime/event-log.ts"],"names":[],"mappings":";;;AAAA;;;;;;GAMG;AACH,0CAAgD;AAChD,+BAA+B;AAC/B,2BAA6B;AAE7B,6CAA0C;AAuB1C,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,IAAA,YAAO,GAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,MAAa,QAAQ;IACF,KAAK,CAAQ;IACb,IAAI,CAAS;IAE9B,YAAY,KAAY,EAAE,MAAc;QACtC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAe,EAAE,OAAgC;QAC5D,MAAM,EAAE,GAAe,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC;QAC7F,IAAI,CAAC;YACH,MAAM,IAAA,gBAAK,EAAC,IAAA,cAAO,EAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,MAAM,IAAA,qBAAU,EAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;QACjE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,eAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;gBACrC,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;aAClD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;CACF;AAxBD,4BAwBC"}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isGitRepo = isGitRepo;
4
+ exports.gitDiff = gitDiff;
5
+ exports.gitRollback = gitRollback;
6
+ /**
7
+ * 飞虹 Code (Muse Code 参照复刻)
8
+ * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
9
+ *
10
+ * Git 辅助(M3 diff/rollback):仅作用于会话 touchedFiles,绝不整仓回滚,避免误删。
11
+ * 非 git 仓库时安全退出并提示,不执行任何破坏性操作。
12
+ */
13
+ const child_process_1 = require("child_process");
14
+ const fs_1 = require("fs");
15
+ const path_1 = require("path");
16
+ const os_1 = require("os");
17
+ /** 跨平台空设备路径(Windows 用 nul,POSIX 用 /dev/null) */
18
+ const NULL_DEVICE = (0, os_1.platform)() === 'win32' ? 'nul' : '/dev/null';
19
+ function git(args, cwd) {
20
+ return new Promise((resolve) => {
21
+ const child = (0, child_process_1.spawn)('git', args, { cwd, shell: false });
22
+ let out = '';
23
+ let err = '';
24
+ child.stdout?.on('data', (d) => (out += d.toString()));
25
+ child.stderr?.on('data', (d) => (err += d.toString()));
26
+ child.on('close', (code) => resolve({ code: code ?? 1, out, err }));
27
+ child.on('error', (e) => resolve({ code: 1, out, err: e.message }));
28
+ });
29
+ }
30
+ function isGitRepo(cwd) {
31
+ return (0, fs_1.existsSync)((0, path_1.join)(cwd, '.git'));
32
+ }
33
+ /** 生成会话作用域的 diff(追踪文件走 git diff,未跟踪文件走 --no-index) */
34
+ async function gitDiff(cwd, files) {
35
+ if (!isGitRepo(cwd)) {
36
+ return '(当前目录不是 git 仓库,无法生成 diff;请手动核对 touchedFiles)';
37
+ }
38
+ const parts = [];
39
+ const target = files && files.length ? files : null;
40
+ const trackedArgs = ['diff', '--color=never'];
41
+ if (target)
42
+ trackedArgs.push('--', ...target);
43
+ const tracked = await git(trackedArgs, cwd);
44
+ if (tracked.out.trim())
45
+ parts.push(tracked.out);
46
+ const status = await git(['status', '--porcelain', '--'], cwd);
47
+ const untracked = status.out
48
+ .split('\n')
49
+ .map((l) => l.trim())
50
+ .filter(Boolean)
51
+ .filter((l) => l.startsWith('??'))
52
+ .map((l) => l.slice(2).trim());
53
+ const untrackedToShow = target ? untracked.filter((f) => target.includes(f)) : untracked;
54
+ for (const f of untrackedToShow) {
55
+ const abs = (0, path_1.join)(cwd, f);
56
+ if (!(0, fs_1.existsSync)(abs))
57
+ continue;
58
+ const ni = await git(['diff', '--no-index', '--color=never', NULL_DEVICE, abs.replace(/\\/g, '/')], cwd);
59
+ parts.push(ni.out || `(新增文件: ${f})`);
60
+ }
61
+ return parts.join('\n').trim() || '(无变更)';
62
+ }
63
+ /**
64
+ * 回滚会话 touchedFiles:
65
+ * - 已跟踪文件 → git checkout -- <file>
66
+ * - 未跟踪文件 → 删除
67
+ * 未确认(--yes)或非 git 仓库时拒绝执行,绝不静默破坏。
68
+ */
69
+ async function gitRollback(cwd, files, opts = {}) {
70
+ const res = { reverted: [], removed: [], errors: [] };
71
+ if (!isGitRepo(cwd)) {
72
+ res.errors.push('当前目录不是 git 仓库,回滚已中止(避免误删)');
73
+ return res;
74
+ }
75
+ if (!opts.yes) {
76
+ res.errors.push('回滚是破坏性操作,请加 --yes 显式确认');
77
+ return res;
78
+ }
79
+ const status = await git(['status', '--porcelain', '--'], cwd);
80
+ const untracked = new Set(status.out
81
+ .split('\n')
82
+ .map((l) => l.trim())
83
+ .filter(Boolean)
84
+ .filter((l) => l.startsWith('??'))
85
+ .map((l) => l.slice(2).trim()));
86
+ for (const f of files) {
87
+ if (untracked.has(f)) {
88
+ try {
89
+ (0, fs_1.rmSync)((0, path_1.join)(cwd, f), { force: true, recursive: true });
90
+ res.removed.push(f);
91
+ }
92
+ catch (e) {
93
+ res.errors.push(`${f}: ${e instanceof Error ? e.message : String(e)}`);
94
+ }
95
+ }
96
+ else {
97
+ const r = await git(['checkout', '--', f], cwd);
98
+ if (r.code === 0)
99
+ res.reverted.push(f);
100
+ else
101
+ res.errors.push(`${f}: ${r.err.trim() || 'checkout 失败'}`);
102
+ }
103
+ }
104
+ return res;
105
+ }
106
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/runtime/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.saveCheckpoint = saveCheckpoint;
4
+ exports.loadCheckpoint = loadCheckpoint;
5
+ exports.listCheckpoints = listCheckpoints;
6
+ exports.updateStatus = updateStatus;
7
+ /**
8
+ * 飞虹 Code (Muse Code 参照复刻)
9
+ * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
10
+ *
11
+ * 会话检查点持久化(M3 恢复与审计):
12
+ * - 每次迭代后把完整对话、迭代计数、成本、被改动文件落盘为 <runId>.session.json
13
+ * - resume 读取检查点续跑;sessions 列出历史;diff/rollback 依赖 touchedFiles
14
+ */
15
+ const promises_1 = require("fs/promises");
16
+ const fs_1 = require("fs");
17
+ const path_1 = require("path");
18
+ /** 检查点落盘(文件名固定,便于 list/load) */
19
+ async function saveCheckpoint(logDir, cp) {
20
+ await (0, promises_1.mkdir)(logDir, { recursive: true });
21
+ const file = (0, path_1.join)(logDir, `${cp.runId}.session.json`);
22
+ await (0, promises_1.writeFile)(file, JSON.stringify(cp, null, 2), 'utf8');
23
+ }
24
+ async function loadCheckpoint(logDir, runId) {
25
+ const file = (0, path_1.join)(logDir, `${runId}.session.json`);
26
+ if (!(0, fs_1.existsSync)(file))
27
+ return null;
28
+ try {
29
+ return JSON.parse(await (0, promises_1.readFile)(file, 'utf8'));
30
+ }
31
+ catch {
32
+ return null;
33
+ }
34
+ }
35
+ async function listCheckpoints(logDir) {
36
+ if (!(0, fs_1.existsSync)(logDir))
37
+ return [];
38
+ const files = (await (0, promises_1.readdir)(logDir)).filter((f) => f.endsWith('.session.json'));
39
+ const out = [];
40
+ for (const f of files) {
41
+ try {
42
+ const cp = JSON.parse(await (0, promises_1.readFile)((0, path_1.join)(logDir, f), 'utf8'));
43
+ if (cp && cp.runId)
44
+ out.push(cp);
45
+ }
46
+ catch {
47
+ /* 跳过损坏文件 */
48
+ }
49
+ }
50
+ return out.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
51
+ }
52
+ async function updateStatus(logDir, runId, status) {
53
+ const cp = await loadCheckpoint(logDir, runId);
54
+ if (!cp)
55
+ return;
56
+ cp.status = status;
57
+ cp.updatedAt = new Date().toISOString();
58
+ await saveCheckpoint(logDir, cp);
59
+ }
60
+ //# sourceMappingURL=session-persist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-persist.js","sourceRoot":"","sources":["../../src/runtime/session-persist.ts"],"names":[],"mappings":";;AAgCA,wCAIC;AAED,wCAQC;AAED,0CAaC;AAED,oCAMC;AArED;;;;;;;GAOG;AACH,0CAAkE;AAClE,2BAAgC;AAChC,+BAA4B;AAqB5B,gCAAgC;AACzB,KAAK,UAAU,cAAc,CAAC,MAAc,EAAE,EAAqB;IACxE,MAAM,IAAA,gBAAK,EAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,IAAA,WAAI,EAAC,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,eAAe,CAAC,CAAC;IACtD,MAAM,IAAA,oBAAS,EAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAC7D,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,MAAc,EAAE,KAAY;IAC/D,MAAM,IAAI,GAAG,IAAA,WAAI,EAAC,MAAM,EAAE,GAAG,KAAK,eAAe,CAAC,CAAC;IACnD,IAAI,CAAC,IAAA,eAAU,EAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,IAAA,mBAAQ,EAAC,IAAI,EAAE,MAAM,CAAC,CAAsB,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,eAAe,CAAC,MAAc;IAClD,IAAI,CAAC,IAAA,eAAU,EAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,CAAC,MAAM,IAAA,kBAAO,EAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;IACjF,MAAM,GAAG,GAAwB,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAA,mBAAQ,EAAC,IAAA,WAAI,EAAC,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAsB,CAAC;YACpF,IAAI,EAAE,IAAI,EAAE,CAAC,KAAK;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AACpE,CAAC;AAEM,KAAK,UAAU,YAAY,CAAC,MAAc,EAAE,KAAY,EAAE,MAAqB;IACpF,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC/C,IAAI,CAAC,EAAE;QAAE,OAAO;IAChB,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC;IACnB,EAAE,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACxC,MAAM,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SessionStore = void 0;
4
+ class SessionStore {
5
+ state;
6
+ constructor(runId, cwd) {
7
+ const now = new Date().toISOString();
8
+ this.state = { runId, cwd, messages: [], createdAt: now, updatedAt: now };
9
+ }
10
+ get runId() {
11
+ return this.state.runId;
12
+ }
13
+ get messages() {
14
+ return this.state.messages;
15
+ }
16
+ append(msg) {
17
+ this.state.messages.push(msg);
18
+ this.state.updatedAt = new Date().toISOString();
19
+ }
20
+ snapshot() {
21
+ return structuredClone(this.state);
22
+ }
23
+ /** 从持久化检查点恢复会话(M3 resume 用) */
24
+ static restore(state) {
25
+ const inst = new SessionStore(state.runId, state.cwd);
26
+ inst.state = {
27
+ ...structuredClone(state),
28
+ messages: structuredClone(state.messages),
29
+ };
30
+ return inst;
31
+ }
32
+ }
33
+ exports.SessionStore = SessionStore;
34
+ //# sourceMappingURL=session-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/runtime/session-store.ts"],"names":[],"mappings":";;;AAiBA,MAAa,YAAY;IACf,KAAK,CAAe;IAE5B,YAAY,KAAY,EAAE,GAAW;QACnC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC,KAAK,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;IAC5E,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAC1B,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,GAAgB;QACrB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAClD,CAAC;IAED,QAAQ;QACN,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,CAAiB,CAAC;IACrD,CAAC;IAED,+BAA+B;IAC/B,MAAM,CAAC,OAAO,CAAC,KAAmB;QAChC,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QACrD,IAA2C,CAAC,KAAK,GAAG;YACnD,GAAG,eAAe,CAAC,KAAK,CAAC;YACzB,QAAQ,EAAE,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC;SAC1C,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAlCD,oCAkCC"}