@astro-minimax/ai 0.9.0 → 0.9.3

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 (251) hide show
  1. package/README.md +108 -18
  2. package/dist/cache/global-cache.d.ts +6 -2
  3. package/dist/cache/global-cache.d.ts.map +1 -1
  4. package/dist/cache/global-cache.js +24 -9
  5. package/dist/cache/index.d.ts +7 -6
  6. package/dist/cache/index.d.ts.map +1 -1
  7. package/dist/cache/index.js +12 -4
  8. package/dist/cache/injection-cache.d.ts +36 -0
  9. package/dist/cache/injection-cache.d.ts.map +1 -0
  10. package/dist/cache/injection-cache.js +90 -0
  11. package/dist/cache/kv-adapter.d.ts.map +1 -1
  12. package/dist/cache/kv-adapter.js +2 -1
  13. package/dist/cache/memory-adapter.d.ts.map +1 -1
  14. package/dist/cache/memory-adapter.js +2 -1
  15. package/dist/cache/response-cache.d.ts +10 -5
  16. package/dist/cache/response-cache.d.ts.map +1 -1
  17. package/dist/cache/response-cache.js +18 -6
  18. package/dist/components/AIChatContainer.d.ts +2 -2
  19. package/dist/components/AIChatContainer.d.ts.map +1 -1
  20. package/dist/components/AIChatContainer.js +8 -920
  21. package/dist/components/ChatInput.d.ts +15 -0
  22. package/dist/components/ChatInput.d.ts.map +1 -0
  23. package/dist/components/ChatInput.js +72 -0
  24. package/dist/components/ChatPanel.d.ts +1 -1
  25. package/dist/components/ChatPanel.d.ts.map +1 -1
  26. package/dist/components/ChatPanel.js +210 -672
  27. package/dist/components/CodeBlock.d.ts +31 -0
  28. package/dist/components/CodeBlock.d.ts.map +1 -0
  29. package/dist/components/CodeBlock.js +143 -0
  30. package/dist/components/MarkmapBlock.d.ts +4 -0
  31. package/dist/components/MarkmapBlock.d.ts.map +1 -0
  32. package/dist/components/MarkmapBlock.js +180 -0
  33. package/dist/components/MermaidBlock.d.ts +4 -0
  34. package/dist/components/MermaidBlock.d.ts.map +1 -0
  35. package/dist/components/MermaidBlock.js +193 -0
  36. package/dist/components/MessageBubble.d.ts +21 -0
  37. package/dist/components/MessageBubble.d.ts.map +1 -0
  38. package/dist/components/MessageBubble.js +233 -0
  39. package/dist/components/ReasoningBlock.d.ts +6 -0
  40. package/dist/components/ReasoningBlock.d.ts.map +1 -0
  41. package/dist/components/ReasoningBlock.js +11 -0
  42. package/dist/components/RichText.d.ts +41 -0
  43. package/dist/components/RichText.d.ts.map +1 -0
  44. package/dist/components/RichText.js +202 -0
  45. package/dist/components/VizShared.d.ts +57 -0
  46. package/dist/components/VizShared.d.ts.map +1 -0
  47. package/dist/components/VizShared.js +233 -0
  48. package/dist/components/tool-auto-continue.d.ts +5 -0
  49. package/dist/components/tool-auto-continue.d.ts.map +1 -0
  50. package/dist/components/tool-auto-continue.js +33 -0
  51. package/dist/constants.d.ts +61 -0
  52. package/dist/constants.d.ts.map +1 -0
  53. package/dist/constants.js +72 -0
  54. package/dist/data/index.d.ts +4 -3
  55. package/dist/data/index.d.ts.map +1 -1
  56. package/dist/data/index.js +4 -10
  57. package/dist/data/knowledge-types.d.ts +8 -0
  58. package/dist/data/knowledge-types.d.ts.map +1 -0
  59. package/dist/data/knowledge-types.js +14 -0
  60. package/dist/data/metadata-loader.d.ts +4 -28
  61. package/dist/data/metadata-loader.d.ts.map +1 -1
  62. package/dist/data/metadata-loader.js +11 -34
  63. package/dist/data/types.d.ts +17 -2
  64. package/dist/data/types.d.ts.map +1 -1
  65. package/dist/extensions/index.d.ts +5 -0
  66. package/dist/extensions/index.d.ts.map +1 -0
  67. package/dist/extensions/index.js +24 -0
  68. package/dist/extensions/injector.d.ts +14 -0
  69. package/dist/extensions/injector.d.ts.map +1 -0
  70. package/dist/extensions/injector.js +146 -0
  71. package/dist/extensions/loader.d.ts +5 -0
  72. package/dist/extensions/loader.d.ts.map +1 -0
  73. package/dist/extensions/loader.js +45 -0
  74. package/dist/extensions/registry.d.ts +4 -0
  75. package/dist/extensions/registry.d.ts.map +1 -0
  76. package/dist/extensions/registry.js +144 -0
  77. package/dist/extensions/types.d.ts +126 -0
  78. package/dist/extensions/types.d.ts.map +1 -0
  79. package/dist/extensions/types.js +0 -0
  80. package/dist/fact-registry/prompt-injector.d.ts +1 -1
  81. package/dist/fact-registry/prompt-injector.d.ts.map +1 -1
  82. package/dist/fact-registry/prompt-injector.js +2 -1
  83. package/dist/index.d.ts +3 -2
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +3 -2
  86. package/dist/intelligence/citation-guard.d.ts +2 -13
  87. package/dist/intelligence/citation-guard.d.ts.map +1 -1
  88. package/dist/intelligence/citation-guard.js +52 -23
  89. package/dist/intelligence/evidence-analysis.d.ts +24 -16
  90. package/dist/intelligence/evidence-analysis.d.ts.map +1 -1
  91. package/dist/intelligence/evidence-analysis.js +118 -20
  92. package/dist/intelligence/evidence-budget.d.ts +13 -0
  93. package/dist/intelligence/evidence-budget.d.ts.map +1 -0
  94. package/dist/intelligence/evidence-budget.js +49 -0
  95. package/dist/intelligence/index.d.ts +10 -4
  96. package/dist/intelligence/index.d.ts.map +1 -1
  97. package/dist/intelligence/index.js +27 -3
  98. package/dist/intelligence/keyword-extract.d.ts +1 -1
  99. package/dist/intelligence/keyword-extract.d.ts.map +1 -1
  100. package/dist/intelligence/keyword-extract.js +5 -9
  101. package/dist/intelligence/request-interpretation.d.ts +40 -0
  102. package/dist/intelligence/request-interpretation.d.ts.map +1 -0
  103. package/dist/intelligence/request-interpretation.js +71 -0
  104. package/dist/intelligence/response-templates.d.ts +1 -0
  105. package/dist/intelligence/response-templates.d.ts.map +1 -1
  106. package/dist/intelligence/response-templates.js +13 -0
  107. package/dist/prompt/dynamic-layer.d.ts +1 -5
  108. package/dist/prompt/dynamic-layer.d.ts.map +1 -1
  109. package/dist/prompt/dynamic-layer.js +145 -9
  110. package/dist/prompt/prompt-builder.d.ts +1 -1
  111. package/dist/prompt/prompt-builder.d.ts.map +1 -1
  112. package/dist/prompt/prompt-builder.js +5 -1
  113. package/dist/prompt/semi-static-layer.d.ts +1 -1
  114. package/dist/prompt/semi-static-layer.d.ts.map +1 -1
  115. package/dist/prompt/semi-static-layer.js +22 -12
  116. package/dist/prompt/static-layer.d.ts.map +1 -1
  117. package/dist/prompt/static-layer.js +37 -4
  118. package/dist/prompt/types.d.ts +9 -4
  119. package/dist/prompt/types.d.ts.map +1 -1
  120. package/dist/provider-manager/base.d.ts +5 -1
  121. package/dist/provider-manager/base.d.ts.map +1 -1
  122. package/dist/provider-manager/base.js +22 -2
  123. package/dist/provider-manager/config.d.ts.map +1 -1
  124. package/dist/provider-manager/config.js +3 -2
  125. package/dist/provider-manager/index.d.ts +1 -1
  126. package/dist/provider-manager/index.d.ts.map +1 -1
  127. package/dist/provider-manager/index.js +1 -2
  128. package/dist/provider-manager/manager.d.ts +10 -1
  129. package/dist/provider-manager/manager.d.ts.map +1 -1
  130. package/dist/provider-manager/manager.js +26 -10
  131. package/dist/provider-manager/openai.d.ts +2 -2
  132. package/dist/provider-manager/openai.d.ts.map +1 -1
  133. package/dist/provider-manager/openai.js +19 -4
  134. package/dist/provider-manager/types.d.ts +18 -38
  135. package/dist/provider-manager/types.d.ts.map +1 -1
  136. package/dist/provider-manager/workers.d.ts +2 -2
  137. package/dist/provider-manager/workers.d.ts.map +1 -1
  138. package/dist/provider-manager/workers.js +15 -4
  139. package/dist/query/followup.d.ts +7 -0
  140. package/dist/query/followup.d.ts.map +1 -0
  141. package/dist/query/followup.js +46 -0
  142. package/dist/query/intent.d.ts +6 -0
  143. package/dist/query/intent.d.ts.map +1 -0
  144. package/dist/query/intent.js +137 -0
  145. package/dist/query/types.d.ts +8 -0
  146. package/dist/query/types.d.ts.map +1 -0
  147. package/dist/query/types.js +0 -0
  148. package/dist/search/hybrid-search.d.ts +111 -0
  149. package/dist/search/hybrid-search.d.ts.map +1 -0
  150. package/dist/search/hybrid-search.js +326 -0
  151. package/dist/search/index.d.ts +11 -9
  152. package/dist/search/index.d.ts.map +1 -1
  153. package/dist/search/index.js +46 -10
  154. package/dist/search/scoring.d.ts +18 -0
  155. package/dist/search/scoring.d.ts.map +1 -0
  156. package/dist/search/{search-utils.js → scoring.js} +14 -27
  157. package/dist/search/search-api.d.ts +16 -1
  158. package/dist/search/search-api.d.ts.map +1 -1
  159. package/dist/search/search-api.js +118 -15
  160. package/dist/search/search-index.d.ts +2 -2
  161. package/dist/search/search-index.d.ts.map +1 -1
  162. package/dist/search/search-index.js +4 -2
  163. package/dist/search/session-cache.d.ts +4 -10
  164. package/dist/search/session-cache.d.ts.map +1 -1
  165. package/dist/search/session-cache.js +12 -45
  166. package/dist/search/types.d.ts +28 -0
  167. package/dist/search/types.d.ts.map +1 -1
  168. package/dist/search/vector-reranker.d.ts +3 -3
  169. package/dist/search/vector-reranker.d.ts.map +1 -1
  170. package/dist/search/vector-reranker.js +14 -2
  171. package/dist/server/chat-handler.d.ts +86 -1
  172. package/dist/server/chat-handler.d.ts.map +1 -1
  173. package/dist/server/chat-handler.js +835 -401
  174. package/dist/server/chat-message-utils.d.ts +6 -0
  175. package/dist/server/chat-message-utils.d.ts.map +1 -0
  176. package/dist/server/chat-message-utils.js +40 -0
  177. package/dist/server/chat-utils.d.ts +30 -0
  178. package/dist/server/chat-utils.d.ts.map +1 -0
  179. package/dist/server/chat-utils.js +88 -0
  180. package/dist/server/dev-server.js +238 -101
  181. package/dist/server/env-config.d.ts +22 -0
  182. package/dist/server/env-config.d.ts.map +1 -0
  183. package/dist/server/env-config.js +25 -0
  184. package/dist/server/errors.d.ts +1 -0
  185. package/dist/server/errors.d.ts.map +1 -1
  186. package/dist/server/errors.js +14 -7
  187. package/dist/server/index.d.ts +2 -4
  188. package/dist/server/index.d.ts.map +1 -1
  189. package/dist/server/index.js +4 -25
  190. package/dist/server/metadata-init.d.ts +10 -5
  191. package/dist/server/metadata-init.d.ts.map +1 -1
  192. package/dist/server/metadata-init.js +78 -34
  193. package/dist/server/notify.d.ts +12 -11
  194. package/dist/server/notify.d.ts.map +1 -1
  195. package/dist/server/notify.js +46 -48
  196. package/dist/server/prompt-runtime.d.ts +60 -0
  197. package/dist/server/prompt-runtime.d.ts.map +1 -0
  198. package/dist/server/prompt-runtime.js +284 -0
  199. package/dist/server/stream-helpers.d.ts +30 -16
  200. package/dist/server/stream-helpers.d.ts.map +1 -1
  201. package/dist/server/stream-helpers.js +152 -15
  202. package/dist/server/types.d.ts +47 -12
  203. package/dist/server/types.d.ts.map +1 -1
  204. package/dist/structured-output/generator.d.ts +6 -0
  205. package/dist/structured-output/generator.d.ts.map +1 -0
  206. package/dist/structured-output/generator.js +164 -0
  207. package/dist/structured-output/index.d.ts +4 -0
  208. package/dist/structured-output/index.d.ts.map +1 -0
  209. package/dist/structured-output/index.js +6 -0
  210. package/dist/structured-output/schemas/evidence.d.ts +88 -0
  211. package/dist/structured-output/schemas/evidence.d.ts.map +1 -0
  212. package/dist/structured-output/schemas/evidence.js +65 -0
  213. package/dist/structured-output/types.d.ts +69 -0
  214. package/dist/structured-output/types.d.ts.map +1 -0
  215. package/dist/structured-output/types.js +0 -0
  216. package/dist/tools/action-tools.d.ts +63 -0
  217. package/dist/tools/action-tools.d.ts.map +1 -0
  218. package/dist/tools/action-tools.js +158 -0
  219. package/dist/tools/index.d.ts +2 -0
  220. package/dist/tools/index.d.ts.map +1 -0
  221. package/dist/tools/index.js +30 -0
  222. package/dist/utils/i18n.d.ts +1 -1
  223. package/dist/utils/i18n.d.ts.map +1 -1
  224. package/dist/utils/i18n.js +1 -1
  225. package/dist/utils/logger.d.ts +11 -0
  226. package/dist/utils/logger.d.ts.map +1 -0
  227. package/dist/utils/logger.js +36 -0
  228. package/dist/utils/text.d.ts +11 -0
  229. package/dist/utils/text.d.ts.map +1 -0
  230. package/dist/utils/text.js +87 -0
  231. package/dist/utils/url.d.ts +19 -0
  232. package/dist/utils/url.d.ts.map +1 -0
  233. package/dist/utils/url.js +13 -0
  234. package/package.json +46 -12
  235. package/dist/intelligence/intent-detect.d.ts +0 -40
  236. package/dist/intelligence/intent-detect.d.ts.map +0 -1
  237. package/dist/intelligence/intent-detect.js +0 -93
  238. package/dist/providers/index.d.ts +0 -2
  239. package/dist/providers/index.d.ts.map +0 -1
  240. package/dist/providers/index.js +0 -5
  241. package/dist/search/search-utils.d.ts +0 -47
  242. package/dist/search/search-utils.d.ts.map +0 -1
  243. package/dist/stream/index.d.ts +0 -3
  244. package/dist/stream/index.d.ts.map +0 -1
  245. package/dist/stream/index.js +0 -8
  246. package/dist/stream/mock-stream.d.ts +0 -12
  247. package/dist/stream/mock-stream.d.ts.map +0 -1
  248. package/dist/stream/mock-stream.js +0 -26
  249. package/dist/stream/response.d.ts +0 -10
  250. package/dist/stream/response.d.ts.map +0 -1
  251. package/dist/stream/response.js +0 -21
@@ -0,0 +1,24 @@
1
+ export * from "./types.js";
2
+ import { getExtensionRegistry, resetExtensionRegistry } from "./registry.js";
3
+ import { loadExtensions, loadExtensionsFromGlob, registerBuiltInExtensions } from "./loader.js";
4
+ import {
5
+ resolveVoiceStyleMode,
6
+ buildVoiceStylePrompt,
7
+ buildContextSections,
8
+ getSemanticFallback,
9
+ mergeSearchDocuments,
10
+ mergeFacts
11
+ } from "./injector.js";
12
+ export {
13
+ buildContextSections,
14
+ buildVoiceStylePrompt,
15
+ getExtensionRegistry,
16
+ getSemanticFallback,
17
+ loadExtensions,
18
+ loadExtensionsFromGlob,
19
+ mergeFacts,
20
+ mergeSearchDocuments,
21
+ registerBuiltInExtensions,
22
+ resetExtensionRegistry,
23
+ resolveVoiceStyleMode
24
+ };
@@ -0,0 +1,14 @@
1
+ import type { LoadedExtensions, VoiceStyleMode, PromptContext } from './types.js';
2
+ import type { ArticleContext } from '../search/types.js';
3
+ import type { Fact } from '../fact-registry/types.js';
4
+ export declare function resolveVoiceStyleMode(query: string, categories: string[], extensions: LoadedExtensions): VoiceStyleMode | null;
5
+ export declare function buildVoiceStylePrompt(mode: VoiceStyleMode | null, extensions: LoadedExtensions): string;
6
+ export declare function buildContextSections(context: PromptContext, extensions: LoadedExtensions): string;
7
+ export declare function getSemanticFallback(query: string, extensions: LoadedExtensions): {
8
+ query: string;
9
+ primaryQuery?: string;
10
+ complexity?: string;
11
+ } | null;
12
+ export declare function mergeSearchDocuments(baseDocuments: ArticleContext[], extensions: LoadedExtensions): ArticleContext[];
13
+ export declare function mergeFacts(baseFacts: Fact[], extensions: LoadedExtensions): Fact[];
14
+ //# sourceMappingURL=injector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injector.d.ts","sourceRoot":"","sources":["../../src/extensions/injector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,aAAa,EAGd,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,oBAAoB,CAAC;AACzE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAEtD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAAE,EACpB,UAAU,EAAE,gBAAgB,GAC3B,cAAc,GAAG,IAAI,CA+BvB;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,cAAc,GAAG,IAAI,EAC3B,UAAU,EAAE,gBAAgB,GAC3B,MAAM,CAyBR;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,aAAa,EACtB,UAAU,EAAE,gBAAgB,GAC3B,MAAM,CAuCR;AASD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,gBAAgB,GAC3B;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAsBtE;AAED,wBAAgB,oBAAoB,CAClC,aAAa,EAAE,cAAc,EAAE,EAC/B,UAAU,EAAE,gBAAgB,GAC3B,cAAc,EAAE,CAkBlB;AAED,wBAAgB,UAAU,CACxB,SAAS,EAAE,IAAI,EAAE,EACjB,UAAU,EAAE,gBAAgB,GAC3B,IAAI,EAAE,CAmBR"}
@@ -0,0 +1,146 @@
1
+ function resolveVoiceStyleMode(query, categories, extensions) {
2
+ const voiceStyle = extensions.voiceStyle;
3
+ if (!voiceStyle || !voiceStyle.modes.length) return null;
4
+ const lowerQuery = query.toLowerCase();
5
+ for (const mode of voiceStyle.modes) {
6
+ if (mode.matchKeywords) {
7
+ for (const keyword of mode.matchKeywords) {
8
+ if (lowerQuery.includes(keyword.toLowerCase())) {
9
+ return mode;
10
+ }
11
+ }
12
+ }
13
+ }
14
+ for (const mode of voiceStyle.modes) {
15
+ if (mode.matchCategories) {
16
+ for (const category of categories) {
17
+ if (mode.matchCategories.includes(category)) {
18
+ return mode;
19
+ }
20
+ }
21
+ }
22
+ }
23
+ if (voiceStyle.defaultMode) {
24
+ return voiceStyle.modes.find((m) => m.id === voiceStyle.defaultMode) ?? null;
25
+ }
26
+ return null;
27
+ }
28
+ function buildVoiceStylePrompt(mode, extensions) {
29
+ const voiceStyle = extensions.voiceStyle;
30
+ if (!voiceStyle) return "";
31
+ const lines = ["## \u8BED\u8A00\u98CE\u683C\uFF08L5 style_only\uFF0C\u4EC5\u5F71\u54CD\u8868\u8FBE\uFF09"];
32
+ if (voiceStyle.overallTone) {
33
+ lines.push(`\u8BED\u6C14\u57FA\u8C03\uFF1A${voiceStyle.overallTone}`);
34
+ }
35
+ if (voiceStyle.frequentExpressions?.length) {
36
+ const words = voiceStyle.frequentExpressions.slice(0, 6).join("\u3001");
37
+ lines.push(`\u9AD8\u9891\u8868\u8FBE\uFF1A${words}`);
38
+ }
39
+ if (mode) {
40
+ lines.push("");
41
+ lines.push(`\u5F53\u524D\u56DE\u7B54\u98CE\u683C\u6A21\u5F0F\uFF1A${mode.description}\uFF08${mode.name}\uFF09`);
42
+ lines.push("\u672C\u8F6E\u8868\u8FBE\u53C2\u8003\uFF1A");
43
+ for (const trait of mode.traits.slice(0, 4)) {
44
+ lines.push(`- ${trait}`);
45
+ }
46
+ }
47
+ return lines.join("\n");
48
+ }
49
+ function buildContextSections(context, extensions) {
50
+ const sections = [];
51
+ for (const ctx of extensions.context) {
52
+ if (ctx.matchCondition) {
53
+ const { queryPatterns, categories, tags } = ctx.matchCondition;
54
+ if (queryPatterns?.length) {
55
+ const matches = queryPatterns.some((p) => p.test(context.userQuery));
56
+ if (!matches) continue;
57
+ }
58
+ if (categories?.length) {
59
+ const articleCategories = new Set(
60
+ context.articles.flatMap((a) => a.categories ?? [])
61
+ );
62
+ const hasMatch = categories.some((c) => articleCategories.has(c));
63
+ if (!hasMatch) continue;
64
+ }
65
+ if (tags?.length) {
66
+ const articleTags = new Set(
67
+ context.articles.flatMap((a) => a.keyPoints ?? [])
68
+ );
69
+ const hasMatch = tags.some((t) => articleTags.has(t));
70
+ if (!hasMatch) continue;
71
+ }
72
+ }
73
+ const content = typeof ctx.content === "function" ? ctx.content(context) : ctx.content;
74
+ if (content) {
75
+ sections.push(`## ${ctx.sectionTitle}
76
+ ${content}`);
77
+ }
78
+ }
79
+ return sections.join("\n\n");
80
+ }
81
+ function replaceCaptureGroups(template, match) {
82
+ return template.replace(/\$(\d+)/g, (_, groupIndex) => {
83
+ const index = parseInt(groupIndex, 10);
84
+ return match[index] ?? "";
85
+ });
86
+ }
87
+ function getSemanticFallback(query, extensions) {
88
+ for (const rule of extensions.semanticFallback) {
89
+ for (const pattern of rule.patterns) {
90
+ const match = pattern.exec(query);
91
+ if (match) {
92
+ const fallbackQuery = rule.fallbackQuery.includes("$") ? replaceCaptureGroups(rule.fallbackQuery, match) : rule.fallbackQuery;
93
+ const primaryQuery = rule.primaryQuery?.includes("$") ? replaceCaptureGroups(rule.primaryQuery, match) : rule.primaryQuery;
94
+ return {
95
+ query: fallbackQuery,
96
+ primaryQuery,
97
+ complexity: rule.complexity
98
+ };
99
+ }
100
+ }
101
+ }
102
+ return null;
103
+ }
104
+ function mergeSearchDocuments(baseDocuments, extensions) {
105
+ const allDocs = [...baseDocuments];
106
+ for (const [, data] of extensions.searchable) {
107
+ for (const doc of data.documents) {
108
+ allDocs.push({
109
+ title: doc.title,
110
+ url: doc.url,
111
+ summary: doc.excerpt,
112
+ keyPoints: doc.keyPoints ?? [],
113
+ categories: doc.categories,
114
+ dateTime: doc.dateTime,
115
+ score: 0
116
+ });
117
+ }
118
+ }
119
+ return allDocs;
120
+ }
121
+ function mergeFacts(baseFacts, extensions) {
122
+ const allFacts = [...baseFacts];
123
+ for (const [, data] of extensions.facts) {
124
+ for (const fact of data.facts) {
125
+ allFacts.push({
126
+ id: fact.id,
127
+ category: fact.category,
128
+ statement: fact.statement,
129
+ evidence: fact.evidence ?? "",
130
+ source: "explicit",
131
+ confidence: fact.confidence,
132
+ tags: fact.tags,
133
+ lang: fact.lang
134
+ });
135
+ }
136
+ }
137
+ return allFacts;
138
+ }
139
+ export {
140
+ buildContextSections,
141
+ buildVoiceStylePrompt,
142
+ getSemanticFallback,
143
+ mergeFacts,
144
+ mergeSearchDocuments,
145
+ resolveVoiceStyleMode
146
+ };
@@ -0,0 +1,5 @@
1
+ import type { Extension, LoadedExtensions } from './types.js';
2
+ export declare function loadExtensionsFromGlob(pattern?: string, basePath?: string): Promise<Extension[]>;
3
+ export declare function loadExtensions(pattern?: string, basePath?: string): Promise<LoadedExtensions>;
4
+ export declare function registerBuiltInExtensions(extensions: Extension[]): void;
5
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/extensions/loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAiB,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAK7E,wBAAsB,sBAAsB,CAC1C,OAAO,GAAE,MAAgC,EACzC,QAAQ,GAAE,MAAsB,GAC/B,OAAO,CAAC,SAAS,EAAE,CAAC,CA4BtB;AAED,wBAAsB,cAAc,CAClC,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,gBAAgB,CAAC,CAS3B;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,CAMvE"}
@@ -0,0 +1,45 @@
1
+ import { getExtensionRegistry } from "./registry.js";
2
+ const DEFAULT_EXTENSIONS_GLOB = "datas/extensions/*.json";
3
+ async function loadExtensionsFromGlob(pattern = DEFAULT_EXTENSIONS_GLOB, basePath = process.cwd()) {
4
+ const extensions = [];
5
+ const { glob } = await import("glob");
6
+ const { readFile } = await import("fs/promises");
7
+ const { join } = await import("path");
8
+ const fullPattern = join(basePath, pattern);
9
+ const files = await glob(fullPattern);
10
+ for (const file of files) {
11
+ try {
12
+ const content = await readFile(file, "utf-8");
13
+ const parsed = JSON.parse(content);
14
+ if (parsed.extensions && Array.isArray(parsed.extensions)) {
15
+ for (const ext of parsed.extensions) {
16
+ if (ext.enabled !== false) {
17
+ extensions.push(ext);
18
+ }
19
+ }
20
+ }
21
+ } catch (err) {
22
+ console.warn(`[extensions] Failed to load ${file}:`, err);
23
+ }
24
+ }
25
+ return extensions;
26
+ }
27
+ async function loadExtensions(pattern, basePath) {
28
+ const registry = getExtensionRegistry();
29
+ const extensions = await loadExtensionsFromGlob(pattern, basePath);
30
+ for (const ext of extensions) {
31
+ registry.register(ext);
32
+ }
33
+ return registry.getLoadedExtensions();
34
+ }
35
+ function registerBuiltInExtensions(extensions) {
36
+ const registry = getExtensionRegistry();
37
+ for (const ext of extensions) {
38
+ registry.register(ext);
39
+ }
40
+ }
41
+ export {
42
+ loadExtensions,
43
+ loadExtensionsFromGlob,
44
+ registerBuiltInExtensions
45
+ };
@@ -0,0 +1,4 @@
1
+ import type { ExtensionRegistryInterface } from './types.js';
2
+ export declare function getExtensionRegistry(): ExtensionRegistryInterface;
3
+ export declare function resetExtensionRegistry(): void;
4
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/extensions/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAKV,0BAA0B,EAO3B,MAAM,YAAY,CAAC;AAoKpB,wBAAgB,oBAAoB,IAAI,0BAA0B,CAKjE;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
@@ -0,0 +1,144 @@
1
+ function compilePatterns(patterns) {
2
+ const compiled = [];
3
+ const errors = [];
4
+ for (const pattern of patterns) {
5
+ try {
6
+ if (pattern instanceof RegExp) {
7
+ compiled.push(pattern);
8
+ } else if (typeof pattern === "string") {
9
+ compiled.push(new RegExp(pattern, "i"));
10
+ } else {
11
+ errors.push(`Invalid pattern type: ${typeof pattern}`);
12
+ }
13
+ } catch (err) {
14
+ const msg = err instanceof Error ? err.message : String(err);
15
+ errors.push(`Failed to compile pattern "${pattern}": ${msg}`);
16
+ }
17
+ }
18
+ return { compiled, errors };
19
+ }
20
+ function mergeVoiceStyleData(existing, newData, newPriority) {
21
+ if (!existing) {
22
+ return { ...newData, _highestPriority: newPriority };
23
+ }
24
+ const mergedModes = [...existing.modes];
25
+ const existingModeIds = new Set(existing.modes.map((m) => m.id));
26
+ for (const mode of newData.modes) {
27
+ if (!existingModeIds.has(mode.id)) {
28
+ mergedModes.push(mode);
29
+ }
30
+ }
31
+ const existingPriority = existing._highestPriority ?? 0;
32
+ return {
33
+ modes: mergedModes,
34
+ defaultMode: newData.defaultMode ?? existing.defaultMode,
35
+ overallTone: newPriority >= existingPriority ? newData.overallTone ?? existing.overallTone : existing.overallTone,
36
+ frequentExpressions: [
37
+ ...existing.frequentExpressions ?? [],
38
+ ...newData.frequentExpressions ?? []
39
+ ].slice(0, 10),
40
+ _highestPriority: Math.max(existingPriority, newPriority)
41
+ };
42
+ }
43
+ class ExtensionRegistry {
44
+ extensions = /* @__PURE__ */ new Map();
45
+ loadedCache = null;
46
+ register(extension) {
47
+ if (this.extensions.has(extension.id)) {
48
+ console.warn(`[extensions] Extension "${extension.id}" already registered, overwriting`);
49
+ }
50
+ this.extensions.set(extension.id, extension);
51
+ this.loadedCache = null;
52
+ }
53
+ unregister(id) {
54
+ this.extensions.delete(id);
55
+ this.loadedCache = null;
56
+ }
57
+ get(id) {
58
+ return this.extensions.get(id);
59
+ }
60
+ getAll() {
61
+ return Array.from(this.extensions.values()).filter((ext) => ext.enabled !== false).sort((a, b) => b.priority - a.priority);
62
+ }
63
+ getByType(type) {
64
+ return this.getAll().filter((ext) => ext.type === type);
65
+ }
66
+ getLoadedExtensions() {
67
+ if (this.loadedCache) {
68
+ return this.loadedCache;
69
+ }
70
+ const result = {
71
+ searchable: /* @__PURE__ */ new Map(),
72
+ facts: /* @__PURE__ */ new Map(),
73
+ context: [],
74
+ voiceStyle: null,
75
+ semanticFallback: []
76
+ };
77
+ const sorted = this.getAll();
78
+ for (const ext of sorted) {
79
+ switch (ext.type) {
80
+ case "searchable": {
81
+ result.searchable.set(ext.id, ext.data);
82
+ break;
83
+ }
84
+ case "facts": {
85
+ result.facts.set(ext.id, ext.data);
86
+ break;
87
+ }
88
+ case "context": {
89
+ result.context.push(ext.data);
90
+ break;
91
+ }
92
+ case "voice-style": {
93
+ result.voiceStyle = mergeVoiceStyleData(
94
+ result.voiceStyle,
95
+ ext.data,
96
+ ext.priority
97
+ );
98
+ break;
99
+ }
100
+ case "semantic-fallback": {
101
+ const rulesData = ext.data;
102
+ for (const rule of rulesData.rules) {
103
+ const { compiled, errors } = compilePatterns(rule.patterns);
104
+ if (errors.length > 0) {
105
+ for (const err of errors) {
106
+ console.warn(`[extensions] ${ext.id}/${rule.id}: ${err}`);
107
+ }
108
+ }
109
+ if (compiled.length > 0) {
110
+ result.semanticFallback.push({
111
+ id: rule.id,
112
+ patterns: compiled,
113
+ fallbackQuery: rule.fallbackQuery,
114
+ primaryQuery: rule.primaryQuery,
115
+ complexity: rule.complexity
116
+ });
117
+ }
118
+ }
119
+ break;
120
+ }
121
+ }
122
+ }
123
+ this.loadedCache = result;
124
+ return result;
125
+ }
126
+ clear() {
127
+ this.extensions.clear();
128
+ this.loadedCache = null;
129
+ }
130
+ }
131
+ let globalRegistry = null;
132
+ function getExtensionRegistry() {
133
+ if (!globalRegistry) {
134
+ globalRegistry = new ExtensionRegistry();
135
+ }
136
+ return globalRegistry;
137
+ }
138
+ function resetExtensionRegistry() {
139
+ globalRegistry = null;
140
+ }
141
+ export {
142
+ getExtensionRegistry,
143
+ resetExtensionRegistry
144
+ };
@@ -0,0 +1,126 @@
1
+ import type { ArticleContext, ProjectContext } from '../search/types.js';
2
+ export type ExtensionType = 'searchable' | 'facts' | 'context' | 'voice-style' | 'semantic-fallback';
3
+ export interface ExtensionSearchDocument {
4
+ id: string;
5
+ title: string;
6
+ url: string;
7
+ excerpt: string;
8
+ content: string;
9
+ categories: string[];
10
+ dateTime: number;
11
+ keyPoints?: string[];
12
+ }
13
+ export interface SearchableData {
14
+ documents: ExtensionSearchDocument[];
15
+ reranking?: {
16
+ positiveTerms?: string[];
17
+ negativeTerms?: string[];
18
+ categoryBoost?: Record<string, number>;
19
+ };
20
+ }
21
+ export interface FactEntry {
22
+ id: string;
23
+ category: string;
24
+ statement: string;
25
+ evidence?: string;
26
+ confidence: number;
27
+ tags: string[];
28
+ lang: string;
29
+ attributes?: Record<string, unknown>;
30
+ }
31
+ export interface FactsData {
32
+ facts: FactEntry[];
33
+ categories?: CategoryDefinition[];
34
+ }
35
+ export interface CategoryDefinition {
36
+ id: string;
37
+ name: string;
38
+ keywords: string[];
39
+ }
40
+ export interface PromptContext {
41
+ userQuery: string;
42
+ lang: string;
43
+ articles: ArticleContext[];
44
+ projects: ProjectContext[];
45
+ }
46
+ export interface ContextData {
47
+ sectionTitle: string;
48
+ content: string | ((context: PromptContext) => string);
49
+ position: 'before-articles' | 'after-articles' | 'before-facts' | 'after-facts';
50
+ matchCondition?: {
51
+ queryPatterns?: RegExp[];
52
+ categories?: string[];
53
+ tags?: string[];
54
+ };
55
+ }
56
+ export interface VoiceStyleMode {
57
+ id: string;
58
+ name: string;
59
+ description: string;
60
+ matchKeywords?: string[];
61
+ matchCategories?: string[];
62
+ traits: string[];
63
+ }
64
+ export interface VoiceStyleData {
65
+ modes: VoiceStyleMode[];
66
+ defaultMode?: string;
67
+ overallTone?: string;
68
+ frequentExpressions?: string[];
69
+ _highestPriority?: number;
70
+ }
71
+ export interface SemanticFallbackRule {
72
+ id: string;
73
+ patterns: RegExp[];
74
+ fallbackQuery: string;
75
+ primaryQuery?: string;
76
+ complexity?: 'simple' | 'moderate' | 'complex';
77
+ }
78
+ export interface SemanticFallbackData {
79
+ rules: SemanticFallbackRule[];
80
+ }
81
+ export type ExtensionData = SearchableData | FactsData | ContextData | VoiceStyleData | SemanticFallbackData;
82
+ export interface Extension<T extends ExtensionData = ExtensionData> {
83
+ id: string;
84
+ type: ExtensionType;
85
+ name: string;
86
+ description?: string;
87
+ enabled?: boolean;
88
+ priority: number;
89
+ data: T;
90
+ }
91
+ export interface ExtensionFile {
92
+ $schema: string;
93
+ version: number;
94
+ extensions: Extension[];
95
+ }
96
+ export interface LoadedExtensions {
97
+ searchable: Map<string, SearchableData>;
98
+ facts: Map<string, FactsData>;
99
+ context: ContextData[];
100
+ voiceStyle: VoiceStyleData | null;
101
+ semanticFallback: SemanticFallbackRule[];
102
+ }
103
+ export interface ExtensionContext {
104
+ userQuery: string;
105
+ lang: string;
106
+ articles: ArticleContext[];
107
+ projects: ProjectContext[];
108
+ abortSignal?: AbortSignal;
109
+ }
110
+ export interface ExtensionResult<T = unknown> {
111
+ extensionId: string;
112
+ timestamp: number;
113
+ data: T | null;
114
+ error?: string;
115
+ cacheHit: boolean;
116
+ }
117
+ export interface ExtensionRegistryInterface {
118
+ register<T extends ExtensionData>(extension: Extension<T>): void;
119
+ unregister(id: string): void;
120
+ get<T extends ExtensionData>(id: string): Extension<T> | undefined;
121
+ getAll(): Extension[];
122
+ getByType(type: ExtensionType): Extension[];
123
+ getLoadedExtensions(): LoadedExtensions;
124
+ clear(): void;
125
+ }
126
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/extensions/types.ts"],"names":[],"mappings":"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"}
File without changes
@@ -1,4 +1,4 @@
1
- import type { Fact } from './types.js';
1
+ import type { Fact } from "./types.js";
2
2
  /**
3
3
  * Formats matched facts into a prompt section ready for injection.
4
4
  * Groups facts by category with clear structure.
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-injector.d.ts","sourceRoot":"","sources":["../../src/fact-registry/prompt-injector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAgB,MAAM,YAAY,CAAC;AAgCrD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,GAAE,MAAa,GAAG,MAAM,CA+B3E"}
1
+ {"version":3,"file":"prompt-injector.d.ts","sourceRoot":"","sources":["../../src/fact-registry/prompt-injector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAgB,MAAM,YAAY,CAAC;AAgCrD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,GAAE,MAAa,GAAG,MAAM,CA+B3E"}
@@ -1,3 +1,4 @@
1
+ import { getLang } from "../utils/i18n.js";
1
2
  const CATEGORY_LABELS = {
2
3
  zh: {
3
4
  author: "\u5173\u4E8E\u4F5C\u8005",
@@ -26,7 +27,7 @@ const SECTION_TEXT = {
26
27
  };
27
28
  function buildFactSection(facts, lang = "zh") {
28
29
  if (!facts.length) return "";
29
- const l = lang === "zh" ? "zh" : "en";
30
+ const l = getLang(lang);
30
31
  const labels = CATEGORY_LABELS[l];
31
32
  const text = SECTION_TEXT[l];
32
33
  const grouped = /* @__PURE__ */ new Map();
package/dist/index.d.ts CHANGED
@@ -6,7 +6,6 @@
6
6
  *
7
7
  * @packageDocumentation
8
8
  */
9
- export * from './providers/index.js';
10
9
  export * from './provider-manager/index.js';
11
10
  export * from './middleware/index.js';
12
11
  export * from './cache/index.js';
@@ -15,6 +14,8 @@ export * from './intelligence/index.js';
15
14
  export * from './prompt/index.js';
16
15
  export * from './data/index.js';
17
16
  export * from './fact-registry/index.js';
18
- export * from './stream/index.js';
19
17
  export * from './server/index.js';
18
+ export * from './structured-output/index.js';
19
+ export * from './extensions/index.js';
20
+ export * from './tools/index.js';
20
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,cAAc,sBAAsB,CAAC;AAGrC,cAAc,6BAA6B,CAAC;AAG5C,cAAc,uBAAuB,CAAC;AAGtC,cAAc,kBAAkB,CAAC;AAGjC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,yBAAyB,CAAC;AAGxC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,iBAAiB,CAAC;AAGhC,cAAc,0BAA0B,CAAC;AAGzC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,cAAc,6BAA6B,CAAC;AAG5C,cAAc,uBAAuB,CAAC;AAGtC,cAAc,kBAAkB,CAAC;AAGjC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,yBAAyB,CAAC;AAGxC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,iBAAiB,CAAC;AAGhC,cAAc,0BAA0B,CAAC;AAGzC,cAAc,mBAAmB,CAAC;AAElC,cAAc,8BAA8B,CAAC;AAE7C,cAAc,uBAAuB,CAAC;AAEtC,cAAc,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,3 @@
1
- export * from "./providers/index.js";
2
1
  export * from "./provider-manager/index.js";
3
2
  export * from "./middleware/index.js";
4
3
  export * from "./cache/index.js";
@@ -7,5 +6,7 @@ export * from "./intelligence/index.js";
7
6
  export * from "./prompt/index.js";
8
7
  export * from "./data/index.js";
9
8
  export * from "./fact-registry/index.js";
10
- export * from "./stream/index.js";
11
9
  export * from "./server/index.js";
10
+ export * from "./structured-output/index.js";
11
+ export * from "./extensions/index.js";
12
+ export * from "./tools/index.js";
@@ -1,29 +1,18 @@
1
1
  import type { ArticleContext, ProjectContext } from '../search/types.js';
2
2
  import type { CitationGuardPreflight, CitationGuardAction } from './types.js';
3
3
  export type AnswerMode = 'fact' | 'count' | 'list' | 'opinion' | 'recommendation' | 'unknown' | 'general';
4
- /**
5
- * Resolves the expected answer mode from the user query.
6
- * Helps the system decide how to structure the response.
7
- */
8
4
  export declare function resolveAnswerMode(query: string): AnswerMode;
9
- /**
10
- * Pre-flight check: if the user is asking about something that can be
11
- * answered directly from the available context without an LLM, return it.
12
- * This prevents hallucination for specific factual queries.
13
- */
5
+ export declare function buildUnknownRefusal(query: string, lang?: string): string;
14
6
  export declare function getCitationGuardPreflight(params: {
15
7
  userQuery: string;
16
8
  articles: ArticleContext[];
17
9
  projects: ProjectContext[];
18
10
  lang?: string;
19
11
  }): CitationGuardPreflight | null;
20
- /**
21
- * Creates a transform stream that monitors the AI output for hallucinated references.
22
- * Rewrites or suppresses fabricated article/project links.
23
- */
24
12
  export declare function createCitationGuardTransform(params: {
25
13
  articles: ArticleContext[];
26
14
  projects: ProjectContext[];
15
+ siteUrl?: string;
27
16
  onApplied?: (result: {
28
17
  actions: CitationGuardAction[];
29
18
  }) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"citation-guard.d.ts","sourceRoot":"","sources":["../../src/intelligence/citation-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,KAAK,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAS9E,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,gBAAgB,GAAG,SAAS,GAAG,SAAS,CAAC;AAgB1G;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAS3D;AAoBD;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,sBAAsB,GAAG,IAAI,CAuBhC;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE;IACnD,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,mBAAmB,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;CAClE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,KAAK,cAAc,CAAC,MAAM,CAAC,CAuD7D"}
1
+ {"version":3,"file":"citation-guard.d.ts","sourceRoot":"","sources":["../../src/intelligence/citation-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,KAAK,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAU9E,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,gBAAgB,GAAG,SAAS,GAAG,SAAS,CAAC;AAkB1G,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAW3D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAAa,GAAG,MAAM,CAuB9E;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,sBAAsB,GAAG,IAAI,CAsBhC;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE;IACnD,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,mBAAmB,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;CAClE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,KAAK,cAAc,CAAC,MAAM,CAAC,CAsE7D"}