@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
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/server/errors.ts"],"names":[],"mappings":"AAQA,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GACrD,QAAQ,CAYV;AAMD,eAAO,MAAM,MAAM;8BACS,MAAM;8BAEN,MAAM,SAAS,MAAM;0BAEzB,MAAM;0BAEN,MAAM;wBAER,MAAM,SAAS,MAAM;+BAEd,MAAM,SAAS,MAAM;qBAE/B,MAAM;iCAEM,MAAM;wBAEf,MAAM,SAAS,MAAM;CAE1C,CAAC;AAEF,wBAAgB,qBAAqB,IAAI,QAAQ,CAQhD"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/server/errors.ts"],"names":[],"mappings":"AAKA,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAElD;AASD,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GACrD,QAAQ,CAYV;AAMD,eAAO,MAAM,MAAM;8BACS,MAAM;8BAEN,MAAM,SAAS,MAAM;0BAEzB,MAAM;0BAEN,MAAM;wBAER,MAAM,SAAS,MAAM;+BAEd,MAAM,SAAS,MAAM;qBAE/B,MAAM;iCAEM,MAAM;wBAEf,MAAM,SAAS,MAAM;CAE1C,CAAC;AAEF,wBAAgB,qBAAqB,IAAI,QAAQ,CAQhD"}
@@ -1,8 +1,14 @@
1
1
  import { t } from "../utils/i18n.js";
2
- const CORS_HEADERS = {
3
- "Content-Type": "application/json",
4
- "Access-Control-Allow-Origin": "*"
5
- };
2
+ let _allowedOrigin = "*";
3
+ function setCorsOrigin(origin) {
4
+ _allowedOrigin = origin;
5
+ }
6
+ function corsHeaders() {
7
+ return {
8
+ "Content-Type": "application/json",
9
+ "Access-Control-Allow-Origin": _allowedOrigin
10
+ };
11
+ }
6
12
  function chatError(code, error, status, options) {
7
13
  const body = {
8
14
  error,
@@ -10,7 +16,7 @@ function chatError(code, error, status, options) {
10
16
  retryable: options?.retryable ?? false,
11
17
  retryAfter: options?.retryAfter
12
18
  };
13
- const headers = { ...CORS_HEADERS };
19
+ const headers = { ...corsHeaders() };
14
20
  if (options?.retryAfter) {
15
21
  headers["Retry-After"] = String(options.retryAfter);
16
22
  }
@@ -33,7 +39,7 @@ const errors = {
33
39
  function corsPreflightResponse() {
34
40
  return new Response(null, {
35
41
  headers: {
36
- "Access-Control-Allow-Origin": "*",
42
+ "Access-Control-Allow-Origin": _allowedOrigin,
37
43
  "Access-Control-Allow-Methods": "POST, OPTIONS",
38
44
  "Access-Control-Allow-Headers": "Content-Type, x-session-id"
39
45
  }
@@ -42,5 +48,6 @@ function corsPreflightResponse() {
42
48
  export {
43
49
  chatError,
44
50
  corsPreflightResponse,
45
- errors
51
+ errors,
52
+ setCorsOrigin
46
53
  };
@@ -1,9 +1,7 @@
1
1
  export { handleChatRequest } from './chat-handler.js';
2
- export { initializeMetadata, resetMetadataInit } from './metadata-init.js';
2
+ export { initializeMetadata } from './metadata-init.js';
3
+ export { applyAiConfigDefaults } from './env-config.js';
3
4
  export { errors, corsPreflightResponse, chatError } from './errors.js';
4
- export { notifyAiChat } from './notify.js';
5
- export type { ChatNotifyOptions } from './notify.js';
6
- export { writeSearchStatus, writeGeneratingStatus, writeDoneStatus, writeSourceArticles, writeTextChunk, writeFinish, streamLLMResponse, streamMockFallback, streamCachedResponse, } from './stream-helpers.js';
7
5
  export { createChatStatusData, isChatStatusData, } from './types.js';
8
6
  export type { ChatContext, ArticleChatContext, ChatRequestBody, ChatHandlerEnv, ChatHandlerOptions, ChatStatusData, ChatStatusStage, ChatErrorResponse, MetadataConfig, } from './types.js';
9
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,cAAc,GACf,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EACL,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,cAAc,GACf,MAAM,YAAY,CAAC"}
@@ -1,39 +1,18 @@
1
1
  import { handleChatRequest } from "./chat-handler.js";
2
- import { initializeMetadata, resetMetadataInit } from "./metadata-init.js";
2
+ import { initializeMetadata } from "./metadata-init.js";
3
+ import { applyAiConfigDefaults } from "./env-config.js";
3
4
  import { errors, corsPreflightResponse, chatError } from "./errors.js";
4
- import { notifyAiChat } from "./notify.js";
5
- import {
6
- writeSearchStatus,
7
- writeGeneratingStatus,
8
- writeDoneStatus,
9
- writeSourceArticles,
10
- writeTextChunk,
11
- writeFinish,
12
- streamLLMResponse,
13
- streamMockFallback,
14
- streamCachedResponse
15
- } from "./stream-helpers.js";
16
5
  import {
17
6
  createChatStatusData,
18
7
  isChatStatusData
19
8
  } from "./types.js";
20
9
  export {
10
+ applyAiConfigDefaults,
21
11
  chatError,
22
12
  corsPreflightResponse,
23
13
  createChatStatusData,
24
14
  errors,
25
15
  handleChatRequest,
26
16
  initializeMetadata,
27
- isChatStatusData,
28
- notifyAiChat,
29
- resetMetadataInit,
30
- streamCachedResponse,
31
- streamLLMResponse,
32
- streamMockFallback,
33
- writeDoneStatus,
34
- writeFinish,
35
- writeGeneratingStatus,
36
- writeSearchStatus,
37
- writeSourceArticles,
38
- writeTextChunk
17
+ isChatStatusData
39
18
  };
@@ -1,11 +1,16 @@
1
- import type { MetadataConfig, ChatHandlerEnv } from './types.js';
2
- /**
3
- * Initializes AI metadata: loads summaries, author context, voice profile,
4
- * and builds search indices. Safe to call multiple times (idempotent).
5
- */
1
+ import type { MetadataConfig, ChatHandlerEnv } from "./types.js";
6
2
  export declare function initializeMetadata(config: MetadataConfig, env?: ChatHandlerEnv): void;
7
3
  /**
8
4
  * Resets initialization state (for testing).
9
5
  */
10
6
  export declare function resetMetadataInit(): void;
7
+ /**
8
+ * Loads extensions from datas/extensions/*.json
9
+ * Returns the loaded extensions for use in chat pipeline.
10
+ */
11
+ export declare function initializeExtensions(basePath?: string): Promise<void>;
12
+ /**
13
+ * Checks if extensions have been loaded.
14
+ */
15
+ export declare function areExtensionsLoaded(): boolean;
11
16
  //# sourceMappingURL=metadata-init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"metadata-init.d.ts","sourceRoot":"","sources":["../../src/server/metadata-init.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjE;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,CAAC,EAAE,cAAc,GAAG,IAAI,CAsCrF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
1
+ {"version":3,"file":"metadata-init.d.ts","sourceRoot":"","sources":["../../src/server/metadata-init.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AASjE,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,cAAc,EACtB,GAAG,CAAC,EAAE,cAAc,GACnB,IAAI,CAgEN;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAMxC;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU3E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C"}
@@ -1,49 +1,93 @@
1
1
  import {
2
- preloadMetadata,
3
- getAuthorContext,
4
- getAllSummaries,
2
+ preloadKnowledgeBundle,
3
+ getKnowledgeBundle
4
+ } from "../data/index.js";
5
+ import {
5
6
  initArticleIndex,
6
- initProjectIndex
7
- } from "../index.js";
7
+ initProjectIndex,
8
+ initArticleChunks
9
+ } from "../search/index.js";
10
+ import { getExtensionRegistry } from "../extensions/index.js";
11
+ import { safeJoinUrl } from "../utils/url.js";
8
12
  let initialized = false;
13
+ let extensionsLoaded = false;
14
+ let initializedBundleRef = null;
15
+ let initializedSiteUrl = "";
9
16
  function initializeMetadata(config, env) {
10
- if (initialized) return;
11
- initialized = true;
12
- preloadMetadata({
13
- summaries: config.summaries,
14
- authorContext: config.authorContext,
15
- voiceProfile: config.voiceProfile,
16
- factRegistry: config.factRegistry ?? null,
17
- vectorIndex: config.vectorIndex ?? null
18
- });
19
- const authorCtx = getAuthorContext();
20
- const allSummaries = getAllSummaries();
21
- const summaryMap = new Map(allSummaries.map((s) => [s.slug, s]));
22
17
  const siteUrl = config.siteUrl ?? env?.SITE_URL ?? "";
23
- const articleDocs = (authorCtx?.posts ?? []).map((post) => {
24
- const summary = summaryMap.get(post.id);
25
- const baseUrl = post.url?.startsWith("http") ? "" : siteUrl;
26
- return {
27
- id: post.id,
28
- title: post.title,
29
- url: post.url ? `${baseUrl}${post.url}` : `${siteUrl}/${post.id}`,
30
- excerpt: post.summary || summary?.summary || "",
31
- content: [...post.keyPoints ?? [], ...summary?.keyPoints ?? []].join(" "),
32
- categories: [post.category].filter(Boolean),
33
- tags: post.tags ?? [],
34
- keyPoints: [...post.keyPoints ?? [], ...summary?.keyPoints ?? []],
35
- dateTime: post.date ? new Date(post.date).getTime() : 0,
36
- lang: post.lang,
37
- summary: summary?.summary
38
- };
39
- });
18
+ const bundleRef = config.knowledgeBundle;
19
+ if (initialized && initializedBundleRef === bundleRef && initializedSiteUrl === siteUrl) {
20
+ return;
21
+ }
22
+ initialized = true;
23
+ initializedBundleRef = bundleRef;
24
+ initializedSiteUrl = siteUrl;
25
+ preloadKnowledgeBundle(
26
+ config.knowledgeBundle
27
+ );
28
+ const knowledgeBundle = getKnowledgeBundle();
29
+ if (!knowledgeBundle) return;
30
+ const articleDocs = knowledgeBundle.corpus.documents.map(
31
+ (doc) => ({
32
+ id: doc.id,
33
+ title: doc.title,
34
+ url: safeJoinUrl(siteUrl, doc.url ?? `/${doc.id}`),
35
+ excerpt: doc.summary,
36
+ content: doc.keyPoints.join(" "),
37
+ categories: [doc.category].filter(Boolean),
38
+ tags: doc.tags ?? [],
39
+ keyPoints: doc.keyPoints ?? [],
40
+ dateTime: doc.publishedAt ? new Date(doc.publishedAt).getTime() : 0,
41
+ lang: doc.lang,
42
+ summary: doc.summary,
43
+ readingTime: doc.readingTime
44
+ })
45
+ );
40
46
  initArticleIndex(articleDocs);
41
47
  initProjectIndex([]);
48
+ const chunksData = Object.fromEntries(
49
+ knowledgeBundle.passages.passages.reduce(
50
+ (map, passage) => {
51
+ const list = map.get(passage.documentId) ?? [];
52
+ list.push({
53
+ id: passage.id,
54
+ postId: passage.documentId,
55
+ heading: passage.heading,
56
+ content: passage.text,
57
+ position: passage.position,
58
+ tokenCount: passage.tokenCount,
59
+ headers: passage.headers
60
+ });
61
+ map.set(passage.documentId, list);
62
+ return map;
63
+ },
64
+ /* @__PURE__ */ new Map()
65
+ )
66
+ );
67
+ initArticleChunks(chunksData);
42
68
  }
43
69
  function resetMetadataInit() {
44
70
  initialized = false;
71
+ extensionsLoaded = false;
72
+ initializedBundleRef = null;
73
+ initializedSiteUrl = "";
74
+ getExtensionRegistry().clear();
75
+ }
76
+ async function initializeExtensions(basePath) {
77
+ if (extensionsLoaded) return;
78
+ extensionsLoaded = true;
79
+ try {
80
+ const { loadExtensions } = await import("../extensions/loader.js");
81
+ await loadExtensions("datas/extensions/*.json", basePath);
82
+ } catch {
83
+ }
84
+ }
85
+ function areExtensionsLoaded() {
86
+ return extensionsLoaded;
45
87
  }
46
88
  export {
89
+ areExtensionsLoaded,
90
+ initializeExtensions,
47
91
  initializeMetadata,
48
92
  resetMetadataInit
49
93
  };
@@ -1,14 +1,15 @@
1
- import { type NotifyResult, type ArticleRef, type ModelInfo, type TokenUsage, type PhaseTiming } from '@astro-minimax/notify';
2
- import type { UIMessage } from 'ai';
3
- interface NotifyEnv {
4
- NOTIFY_TELEGRAM_BOT_TOKEN?: string;
5
- NOTIFY_TELEGRAM_CHAT_ID?: string;
6
- NOTIFY_WEBHOOK_URL?: string;
7
- NOTIFY_RESEND_API_KEY?: string;
8
- NOTIFY_RESEND_FROM?: string;
9
- NOTIFY_RESEND_TO?: string;
10
- SITE_URL?: string;
11
- [key: string]: unknown;
1
+ import type { UIMessage } from "ai";
2
+ import type { NotifyArticleRef as ArticleRef, NotifyModelInfo as ModelInfo, NotifyTokenUsage as TokenUsage, PhaseTiming } from "./types.js";
3
+ type NotifyEnv = Record<string, unknown>;
4
+ interface NotifyResult {
5
+ event: "comment" | "ai-chat";
6
+ success: boolean;
7
+ results: Array<{
8
+ channel: "telegram" | "webhook" | "email";
9
+ success: boolean;
10
+ error?: string;
11
+ duration?: number;
12
+ }>;
12
13
  }
13
14
  export interface ChatNotifyOptions {
14
15
  env: NotifyEnv;
@@ -1 +1 @@
1
- {"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../src/server/notify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC7J,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEpC,UAAU,SAAS;IACjB,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAiDD,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,SAAS,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,UAAU,EAAE,CAAC;IAClC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAkCrF"}
1
+ {"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../src/server/notify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,EACV,gBAAgB,IAAI,UAAU,EAC9B,eAAe,IAAI,SAAS,EAC5B,gBAAgB,IAAI,UAAU,EAC9B,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEzC,UAAU,YAAY;IACpB,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,KAAK,CAAC;QACb,OAAO,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;QAC1C,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;CACJ;AAkED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,SAAS,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,UAAU,EAAE,CAAC;IAClC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA4C9B"}
@@ -1,33 +1,23 @@
1
- import { createNotifier } from "@astro-minimax/notify";
2
- let notifierInstance = null;
3
- function getNotifier(env) {
4
- if (notifierInstance) return notifierInstance;
5
- const hasConfig = env.NOTIFY_TELEGRAM_BOT_TOKEN || env.NOTIFY_WEBHOOK_URL || env.NOTIFY_RESEND_API_KEY;
6
- if (!hasConfig) {
7
- console.warn("[notify] No notification providers configured. Missing environment variables: NOTIFY_TELEGRAM_BOT_TOKEN, NOTIFY_WEBHOOK_URL, or NOTIFY_RESEND_API_KEY");
1
+ async function loadNotifyRuntime() {
2
+ try {
3
+ return await import("@astro-minimax/notify");
4
+ } catch (error) {
5
+ if (error instanceof Error && "code" in error && error.code === "ERR_MODULE_NOT_FOUND") {
6
+ return null;
7
+ }
8
+ throw error;
9
+ }
10
+ }
11
+ async function createEnvNotifier(env) {
12
+ const runtime = await loadNotifyRuntime();
13
+ if (!runtime) {
8
14
  return null;
9
15
  }
10
- const providers = [];
11
- if (env.NOTIFY_TELEGRAM_BOT_TOKEN && env.NOTIFY_TELEGRAM_CHAT_ID) providers.push("telegram");
12
- if (env.NOTIFY_WEBHOOK_URL) providers.push("webhook");
13
- if (env.NOTIFY_RESEND_API_KEY && env.NOTIFY_RESEND_FROM && env.NOTIFY_RESEND_TO) providers.push("email");
14
- console.log(`[notify] Initializing notifier with providers: ${providers.join(", ") || "none"}`);
15
- notifierInstance = createNotifier({
16
- telegram: env.NOTIFY_TELEGRAM_BOT_TOKEN && env.NOTIFY_TELEGRAM_CHAT_ID ? {
17
- botToken: env.NOTIFY_TELEGRAM_BOT_TOKEN,
18
- chatId: env.NOTIFY_TELEGRAM_CHAT_ID
19
- } : void 0,
20
- webhook: env.NOTIFY_WEBHOOK_URL ? {
21
- url: env.NOTIFY_WEBHOOK_URL
22
- } : void 0,
23
- email: env.NOTIFY_RESEND_API_KEY && env.NOTIFY_RESEND_FROM && env.NOTIFY_RESEND_TO ? {
24
- provider: "resend",
25
- apiKey: env.NOTIFY_RESEND_API_KEY,
26
- from: env.NOTIFY_RESEND_FROM,
27
- to: env.NOTIFY_RESEND_TO
28
- } : void 0
29
- });
30
- return notifierInstance;
16
+ const config = runtime.createNotifyConfigFromEnv(env);
17
+ if (!config.telegram && !config.webhook && !config.email) {
18
+ return null;
19
+ }
20
+ return runtime.createNotifier(config);
31
21
  }
32
22
  function getMessageText(message) {
33
23
  if (Array.isArray(message.parts)) {
@@ -36,30 +26,38 @@ function getMessageText(message) {
36
26
  return "";
37
27
  }
38
28
  function notifyAiChat(options) {
39
- const { env, sessionId, messages, aiResponse, referencedArticles, model, usage, timing } = options;
40
- const notifier = getNotifier(env);
41
- if (!notifier) {
42
- console.warn("[notify] AI chat notification skipped: no notifier available. Check environment variables.");
43
- return Promise.resolve(null);
44
- }
45
- const userMessages = messages.filter((m) => m.role === "user");
46
- const lastUserMessage = userMessages[userMessages.length - 1];
47
- if (!lastUserMessage) {
48
- console.warn("[notify] AI chat notification skipped: no user message found in messages array");
49
- return Promise.resolve(null);
50
- }
51
- const userMessage = getMessageText(lastUserMessage);
52
- const roundNumber = userMessages.length;
53
- return notifier.aiChat({
29
+ const {
30
+ env,
54
31
  sessionId,
55
- roundNumber,
56
- userMessage,
57
- aiResponse: aiResponse?.slice(0, 500),
32
+ messages,
33
+ aiResponse,
58
34
  referencedArticles,
59
35
  model,
60
36
  usage,
61
- timing,
62
- siteUrl: env.SITE_URL
37
+ timing
38
+ } = options;
39
+ return createEnvNotifier(env).then((notifier) => {
40
+ if (!notifier) {
41
+ return null;
42
+ }
43
+ const userMessages = messages.filter((m) => m.role === "user");
44
+ const lastUserMessage = userMessages[userMessages.length - 1];
45
+ if (!lastUserMessage) {
46
+ return null;
47
+ }
48
+ const userMessage = getMessageText(lastUserMessage);
49
+ const roundNumber = userMessages.length;
50
+ return notifier.aiChat({
51
+ sessionId,
52
+ roundNumber,
53
+ userMessage,
54
+ aiResponse: aiResponse?.slice(0, 500),
55
+ referencedArticles,
56
+ model,
57
+ usage,
58
+ timing,
59
+ siteUrl: env.SITE_URL
60
+ });
63
61
  }).catch((error) => {
64
62
  console.error("[notify] AI chat notification failed:", error);
65
63
  return null;
@@ -0,0 +1,60 @@
1
+ import type { ChatContext } from "./types.js";
2
+ import type { PhaseTiming } from "./types.js";
3
+ import type { ProviderAdapter } from "../provider-manager/types.js";
4
+ import type { LoadedExtensions } from "../extensions/types.js";
5
+ import type { SourceSelection } from "../search/types.js";
6
+ import { getCitationGuardPreflight } from "../intelligence/index.js";
7
+ import { searchArticles, searchProjects } from "../search/index.js";
8
+ interface BuildRuntimeSystemPromptArgs {
9
+ env: Record<string, unknown>;
10
+ lang: string;
11
+ searchQuery: string;
12
+ relatedArticles: ReturnType<typeof searchArticles>;
13
+ relatedProjects: ReturnType<typeof searchProjects>;
14
+ evidenceSection?: string;
15
+ factSection?: string;
16
+ answerMode?: "fact" | "count" | "list" | "opinion" | "recommendation" | "unknown" | "general";
17
+ extensions: LoadedExtensions;
18
+ cacheKey: string | null;
19
+ voiceStylePrompt?: string;
20
+ chunksSection?: string;
21
+ preferInjectedChunks?: boolean;
22
+ }
23
+ export interface PromptAssemblyArgs {
24
+ env: Record<string, unknown>;
25
+ latestText: string;
26
+ context: ChatContext;
27
+ lang: string;
28
+ evidenceAnalysisTimeout: number;
29
+ timing: PhaseTiming & Record<string, number | undefined>;
30
+ adapter: ProviderAdapter | null;
31
+ hasRealProvider: boolean;
32
+ extensions: LoadedExtensions;
33
+ cacheKey: string | null;
34
+ searchQuery: string;
35
+ relatedArticles: ReturnType<typeof searchArticles>;
36
+ relatedProjects: ReturnType<typeof searchProjects>;
37
+ budget: {
38
+ analysisMaxTokens: number;
39
+ };
40
+ answerMode: "fact" | "count" | "list" | "opinion" | "recommendation" | "unknown" | "general";
41
+ }
42
+ export interface PromptAssemblyResult {
43
+ systemPrompt: string;
44
+ preflight: ReturnType<typeof getCitationGuardPreflight>;
45
+ unknownRefusal: {
46
+ text: string;
47
+ isUnknown: boolean;
48
+ } | null;
49
+ selectedSources: SourceSelection[];
50
+ }
51
+ export declare function resolvePromptGuards(args: {
52
+ latestText: string;
53
+ relatedArticles: ReturnType<typeof searchArticles>;
54
+ relatedProjects: ReturnType<typeof searchProjects>;
55
+ lang: string;
56
+ }): Pick<PromptAssemblyResult, 'preflight' | 'unknownRefusal'>;
57
+ export declare function buildRuntimeSystemPrompt(args: BuildRuntimeSystemPromptArgs): string;
58
+ export declare function assemblePromptRuntime(args: PromptAssemblyArgs): Promise<PromptAssemblyResult>;
59
+ export {};
60
+ //# sourceMappingURL=prompt-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-runtime.d.ts","sourceRoot":"","sources":["../../src/server/prompt-runtime.ts"],"names":[],"mappings":"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"}