@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,4 +1,5 @@
1
1
  import type { ProviderAdapter, ProviderManagerEnv, ProviderManagerOptions, ProviderStatus, StreamTextOptions, StreamTextResult } from './types.js';
2
+ import { MockAdapter } from './mock.js';
2
3
  export declare class ProviderManager {
3
4
  private providers;
4
5
  private mockAdapter;
@@ -12,7 +13,15 @@ export declare class ProviderManager {
12
13
  hasProviders(): boolean;
13
14
  getProviderCount(): number;
14
15
  getAvailableAdapter(): Promise<ProviderAdapter | null>;
16
+ /**
17
+ * Returns all available adapters in priority order.
18
+ * Used for implementing multi-provider failover in streaming contexts.
19
+ */
20
+ getAvailableAdapters(): Promise<ProviderAdapter[]>;
21
+ /**
22
+ * Returns the mock adapter for fallback scenarios.
23
+ */
24
+ getMockAdapter(): MockAdapter;
15
25
  }
16
26
  export declare function getProviderManager(env: ProviderManagerEnv, options?: ProviderManagerOptions): ProviderManager;
17
- export declare function resetProviderManager(): void;
18
27
  //# sourceMappingURL=manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/provider-manager/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAEf,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAGjB,MAAM,YAAY,CAAC;AAMpB,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,OAAO,CAA0L;gBAE7L,GAAG,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,sBAAsB;IAcrE,OAAO,CAAC,mBAAmB;IAyB3B,OAAO,CAAC,aAAa;IAWf,oBAAoB,IAAI,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IASvD,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAqCvE,iBAAiB,IAAI,cAAc,EAAE;IAWrC,YAAY,IAAI,OAAO;IAIvB,gBAAgB,IAAI,MAAM;IAIpB,mBAAmB,IAAI,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;CAG7D;AAID,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,eAAe,CAK7G;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/provider-manager/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAEf,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAGjB,MAAM,YAAY,CAAC;AAIpB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,OAAO,CAA0L;gBAE7L,GAAG,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,sBAAsB;IAcrE,OAAO,CAAC,mBAAmB;IAyB3B,OAAO,CAAC,aAAa;IAWf,oBAAoB,IAAI,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IASvD,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2CvE,iBAAiB,IAAI,cAAc,EAAE;IAWrC,YAAY,IAAI,OAAO;IAIvB,gBAAgB,IAAI,MAAM;IAIpB,mBAAmB,IAAI,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAI5D;;;OAGG;IACG,oBAAoB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAUxD;;OAEG;IACH,cAAc,IAAI,WAAW;CAG9B;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,kBAAkB,EACvB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,eAAe,CAEjB"}
@@ -60,11 +60,16 @@ class ProviderManager {
60
60
  let lastProviderId = null;
61
61
  let lastError = null;
62
62
  for (const provider of this.providers) {
63
+ const wasInRecovery = provider.isInRecovery?.() ?? false;
63
64
  const isAvailable = await provider.isAvailable();
64
65
  if (!isAvailable) continue;
65
66
  try {
66
67
  const result = await provider.streamText(options);
67
68
  provider.recordSuccess();
69
+ if (wasInRecovery) {
70
+ provider.markAsRecovered?.();
71
+ this.options.onHealthChange?.(provider.id, true);
72
+ }
68
73
  if (lastProviderId && lastProviderId !== provider.id) {
69
74
  this.options.onProviderSwitch?.(lastProviderId, provider.id, "fallback success");
70
75
  }
@@ -104,19 +109,30 @@ class ProviderManager {
104
109
  async getAvailableAdapter() {
105
110
  return this.getAvailableProvider();
106
111
  }
107
- }
108
- let managerInstance = null;
109
- function getProviderManager(env, options) {
110
- if (!managerInstance) {
111
- managerInstance = new ProviderManager(env, options);
112
+ /**
113
+ * Returns all available adapters in priority order.
114
+ * Used for implementing multi-provider failover in streaming contexts.
115
+ */
116
+ async getAvailableAdapters() {
117
+ const available = [];
118
+ for (const provider of this.providers) {
119
+ if (await provider.isAvailable()) {
120
+ available.push(provider);
121
+ }
122
+ }
123
+ return available;
124
+ }
125
+ /**
126
+ * Returns the mock adapter for fallback scenarios.
127
+ */
128
+ getMockAdapter() {
129
+ return this.mockAdapter;
112
130
  }
113
- return managerInstance;
114
131
  }
115
- function resetProviderManager() {
116
- managerInstance = null;
132
+ function getProviderManager(env, options) {
133
+ return new ProviderManager(env, options);
117
134
  }
118
135
  export {
119
136
  ProviderManager,
120
- getProviderManager,
121
- resetProviderManager
137
+ getProviderManager
122
138
  };
@@ -1,5 +1,5 @@
1
- import type { OpenAIProviderConfig, StreamTextOptions, StreamTextResult } from './types.js';
2
- import { BaseProviderAdapter } from './base.js';
1
+ import type { OpenAIProviderConfig, StreamTextOptions, StreamTextResult } from "./types.js";
2
+ import { BaseProviderAdapter } from "./base.js";
3
3
  export declare class OpenAIAdapter extends BaseProviderAdapter {
4
4
  readonly id: string;
5
5
  readonly type: "openai";
@@ -1 +1 @@
1
- {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/provider-manager/openai.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC5F,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAgDhD,qBAAa,aAAc,SAAQ,mBAAmB;IACpD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,OAAO,CAAC,QAAQ,CAA4C;IAC5D,OAAO,CAAC,MAAM,CAAuB;gBAEzB,MAAM,EAAE,oBAAoB;IAuBlC,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAyCvE,SAAS,IAAI,oBAAoB;IAIjC,WAAW,IAAI;QAAE,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAA;KAAE;CAGzD"}
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/provider-manager/openai.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AA0DhD,qBAAa,aAAc,SAAQ,mBAAmB;IACpD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,OAAO,CAAC,QAAQ,CAA4C;IAC5D,OAAO,CAAC,MAAM,CAAuB;gBAEzB,MAAM,EAAE,oBAAoB;IAuBlC,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAoDvE,SAAS,IAAI,oBAAoB;IAIjC,WAAW,IAAI;QAAE,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAA;KAAE;CAGzD"}
@@ -14,14 +14,19 @@ async function setupGlobalProxy() {
14
14
  try {
15
15
  const undici = await import("undici");
16
16
  if (typeof undici.setGlobalDispatcher !== "function" || typeof undici.ProxyAgent !== "function") {
17
- console.log("[OpenAIAdapter] undici APIs not available, skipping proxy setup (likely Edge Runtime)");
17
+ console.log(
18
+ "[OpenAIAdapter] undici APIs not available, skipping proxy setup (likely Edge Runtime)"
19
+ );
18
20
  return;
19
21
  }
20
22
  undici.setGlobalDispatcher(new undici.ProxyAgent(proxyUrl));
21
23
  console.log("[OpenAIAdapter] Global proxy dispatcher set:", proxyUrl);
22
24
  proxyInitialized = true;
23
25
  } catch (e) {
24
- console.log("[OpenAIAdapter] Proxy setup skipped:", e instanceof Error ? e.message : String(e));
26
+ console.log(
27
+ "[OpenAIAdapter] Proxy setup skipped:",
28
+ e instanceof Error ? e.message : String(e)
29
+ );
25
30
  }
26
31
  }
27
32
  let proxySetupPromise = null;
@@ -43,7 +48,7 @@ class OpenAIAdapter extends BaseProviderAdapter {
43
48
  config;
44
49
  constructor(config) {
45
50
  super({
46
- unhealthyThreshold: config.maxRetries ? config.maxRetries + 2 : 3
51
+ unhealthyThreshold: config.unhealthyThreshold ?? 3
47
52
  });
48
53
  this.id = config.id;
49
54
  this.weight = config.weight ?? 100;
@@ -63,7 +68,16 @@ class OpenAIAdapter extends BaseProviderAdapter {
63
68
  }
64
69
  async streamText(options) {
65
70
  await ensureProxySetup();
66
- const { system, messages, temperature = 0.7, maxOutputTokens, topP, abortSignal, onError } = options;
71
+ const {
72
+ system,
73
+ messages,
74
+ temperature = 0.7,
75
+ maxOutputTokens,
76
+ topP,
77
+ abortSignal,
78
+ onError,
79
+ tools
80
+ } = options;
67
81
  const abortController = new AbortController();
68
82
  const timeoutId = setTimeout(() => abortController.abort(), this.timeout);
69
83
  if (abortSignal) {
@@ -77,6 +91,7 @@ class OpenAIAdapter extends BaseProviderAdapter {
77
91
  temperature,
78
92
  maxOutputTokens,
79
93
  topP,
94
+ tools,
80
95
  abortSignal: abortController.signal,
81
96
  onError: ({ error }) => {
82
97
  onError?.(error instanceof Error ? error : new Error(String(error)));
@@ -3,28 +3,24 @@
3
3
  *
4
4
  * Supports multiple provider types with priority-based fallback.
5
5
  */
6
- import type { UIMessage } from 'ai';
6
+ import type { UIMessage, ToolSet } from "ai";
7
7
  /**
8
8
  * Base configuration shared by all provider types.
9
9
  */
10
10
  export interface BaseProviderConfig {
11
- /** Unique identifier for this provider instance */
12
11
  id: string;
13
- /** Provider type */
14
- type: 'openai' | 'workers';
15
- /** Priority weight (higher = more preferred). Default: 100 */
12
+ type: "openai" | "workers";
16
13
  weight?: number;
17
- /** Default model for chat */
18
14
  model: string;
19
- /** Model for keyword extraction (optional, defaults to model) */
20
15
  keywordModel?: string;
21
- /** Model for evidence analysis (optional, defaults to keywordModel) */
22
16
  evidenceModel?: string;
23
- /** Request timeout in milliseconds. Default: 30000 */
24
17
  timeout?: number;
25
- /** Max retries on failure. Default: 0 (no retry, fallback to next provider) */
26
- maxRetries?: number;
27
- /** Enable this provider. Default: true */
18
+ /**
19
+ * Number of consecutive failures before marking provider unhealthy.
20
+ * Default: 3. Note: This is NOT retry count - provider will be skipped
21
+ * after this many failures, not retried.
22
+ */
23
+ unhealthyThreshold?: number;
28
24
  enabled?: boolean;
29
25
  }
30
26
  /**
@@ -32,7 +28,7 @@ export interface BaseProviderConfig {
32
28
  * Supports DeepSeek, Moonshot, Qwen, OpenAI, and any OpenAI-compatible API.
33
29
  */
34
30
  export interface OpenAIProviderConfig extends BaseProviderConfig {
35
- type: 'openai';
31
+ type: "openai";
36
32
  /** API base URL (e.g., https://api.deepseek.com/v1) */
37
33
  baseURL: string;
38
34
  /** API key */
@@ -43,7 +39,7 @@ export interface OpenAIProviderConfig extends BaseProviderConfig {
43
39
  * Uses AI binding directly from the Cloudflare environment.
44
40
  */
45
41
  export interface WorkersAIProviderConfig extends BaseProviderConfig {
46
- type: 'workers';
42
+ type: "workers";
47
43
  /** AI binding name in Cloudflare environment. Default: 'minimaxAI' */
48
44
  bindingName: string;
49
45
  }
@@ -95,7 +91,7 @@ export interface ProviderStatus {
95
91
  /** Provider ID */
96
92
  id: string;
97
93
  /** Provider type */
98
- type: 'openai' | 'workers' | 'mock';
94
+ type: string;
99
95
  /** Priority weight */
100
96
  weight: number;
101
97
  /** Whether the provider is enabled */
@@ -127,6 +123,8 @@ export interface StreamTextOptions {
127
123
  userQuestion?: string;
128
124
  /** Callback for errors during streaming */
129
125
  onError?: (error: Error) => void;
126
+ /** Tools for function calling */
127
+ tools?: ToolSet;
130
128
  }
131
129
  /**
132
130
  * Result from streamText operation.
@@ -175,39 +173,21 @@ export interface ProviderManagerOptions {
175
173
  * All provider types must implement this interface.
176
174
  */
177
175
  export interface ProviderAdapter {
178
- /** Provider identifier */
179
176
  readonly id: string;
180
- /** Provider type */
181
- readonly type: 'openai' | 'workers' | 'mock';
182
- /** Priority weight */
177
+ readonly type: string;
183
178
  readonly weight: number;
184
- /** Default model */
185
179
  readonly model: string;
186
- /** Model for keyword extraction */
187
180
  readonly keywordModel: string;
188
- /** Model for evidence analysis */
189
181
  readonly evidenceModel: string;
190
- /** Request timeout in ms */
191
182
  readonly timeout: number;
192
- /**
193
- * Check if this provider is currently available and healthy.
194
- */
195
183
  isAvailable(): Promise<boolean>;
196
- /**
197
- * Stream text generation.
198
- */
184
+ isInRecovery?(): boolean;
185
+ canAttemptRecovery?(): boolean;
186
+ markAsRecovered?(): void;
187
+ resetHealth?(): void;
199
188
  streamText(options: StreamTextOptions): Promise<StreamTextResult>;
200
- /**
201
- * Get current health status.
202
- */
203
189
  getHealth(): ProviderHealth;
204
- /**
205
- * Record a successful request.
206
- */
207
190
  recordSuccess(): void;
208
- /**
209
- * Record a failed request.
210
- */
211
191
  recordFailure(error: Error): void;
212
192
  getProvider(): {
213
193
  chatModel: (model: string) => unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/provider-manager/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/provider-manager/types.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import type { WorkersAIProviderConfig, StreamTextOptions, StreamTextResult, ProviderManagerEnv } from './types.js';
2
- import { BaseProviderAdapter } from './base.js';
1
+ import type { WorkersAIProviderConfig, StreamTextOptions, StreamTextResult, ProviderManagerEnv } from "./types.js";
2
+ import { BaseProviderAdapter } from "./base.js";
3
3
  export declare class WorkersAIAdapter extends BaseProviderAdapter {
4
4
  readonly id: string;
5
5
  readonly type: "workers";
@@ -1 +1 @@
1
- {"version":3,"file":"workers.d.ts","sourceRoot":"","sources":["../../src/provider-manager/workers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACnH,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD,qBAAa,gBAAiB,SAAQ,mBAAmB;IACvD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAU;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAGzB,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,MAAM,CAA0B;gBAE5B,MAAM,EAAE,uBAAuB,EAAE,GAAG,EAAE,kBAAkB;IAqB9D,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAyCvE,SAAS,IAAI,uBAAuB;IAIpC,WAAW,IAAI;QAAE,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAA;KAAE;CAKzD"}
1
+ {"version":3,"file":"workers.d.ts","sourceRoot":"","sources":["../../src/provider-manager/workers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD,qBAAa,gBAAiB,SAAQ,mBAAmB;IACvD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAU;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,MAAM,CAA0B;gBAE5B,MAAM,EAAE,uBAAuB,EAAE,GAAG,EAAE,kBAAkB;IAwB9D,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAoDvE,SAAS,IAAI,uBAAuB;IAIpC,WAAW,IAAI;QAAE,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAA;KAAE;CAMzD"}
@@ -9,12 +9,11 @@ class WorkersAIAdapter extends BaseProviderAdapter {
9
9
  keywordModel;
10
10
  evidenceModel;
11
11
  timeout;
12
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
12
  provider;
14
13
  config;
15
14
  constructor(config, env) {
16
15
  super({
17
- unhealthyThreshold: config.maxRetries ? config.maxRetries + 2 : 3
16
+ unhealthyThreshold: config.unhealthyThreshold ?? 3
18
17
  });
19
18
  this.id = config.id;
20
19
  this.weight = config.weight ?? 90;
@@ -25,12 +24,23 @@ class WorkersAIAdapter extends BaseProviderAdapter {
25
24
  this.config = config;
26
25
  const binding = env[config.bindingName];
27
26
  if (!binding) {
28
- throw new Error(`Workers AI binding '${config.bindingName}' not found in environment`);
27
+ throw new Error(
28
+ `Workers AI binding '${config.bindingName}' not found in environment`
29
+ );
29
30
  }
30
31
  this.provider = createWorkersAI({ binding });
31
32
  }
32
33
  async streamText(options) {
33
- const { system, messages, temperature = 0.7, maxOutputTokens, topP, abortSignal, onError } = options;
34
+ const {
35
+ system,
36
+ messages,
37
+ temperature = 0.7,
38
+ maxOutputTokens,
39
+ topP,
40
+ abortSignal,
41
+ onError,
42
+ tools
43
+ } = options;
34
44
  const abortController = new AbortController();
35
45
  const timeoutId = setTimeout(() => abortController.abort(), this.timeout);
36
46
  if (abortSignal) {
@@ -45,6 +55,7 @@ class WorkersAIAdapter extends BaseProviderAdapter {
45
55
  temperature,
46
56
  maxOutputTokens,
47
57
  topP,
58
+ tools,
48
59
  abortSignal: abortController.signal,
49
60
  onError: ({ error }) => {
50
61
  onError?.(error instanceof Error ? error : new Error(String(error)));
@@ -0,0 +1,7 @@
1
+ import type { SearchContextReuseParams } from "./types.js";
2
+ export declare function isLikelyFollowUp(message: string): boolean;
3
+ export declare function hasNewSignificantTokens(currentQuery: string, cachedQuery: string): boolean;
4
+ export declare function hasQueryOverlap(currentQuery: string, cachedQuery: string): boolean;
5
+ export declare function shouldReuseSearchContext(params: SearchContextReuseParams): boolean;
6
+ export declare function buildLocalSearchQuery(latestText: string): string;
7
+ //# sourceMappingURL=followup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"followup.d.ts","sourceRoot":"","sources":["../../src/query/followup.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAI3D,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAUzD;AAED,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAOT;AAED,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAKT;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAST;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEhE"}
@@ -0,0 +1,46 @@
1
+ import { tokenize, normalizeText } from "../utils/text.js";
2
+ import { CACHE } from "../constants.js";
3
+ const MAX_FOLLOW_UP_LENGTH = 48;
4
+ function isLikelyFollowUp(message) {
5
+ const text = message.trim();
6
+ if (!text || text.length > MAX_FOLLOW_UP_LENGTH) return false;
7
+ const hasTerminalPunctuation = /[??!!。.…]$/.test(text);
8
+ const wordCount = text.split(/\s+/).filter(Boolean).length;
9
+ if (text.length <= 16) return true;
10
+ if (!/\s/.test(text) && text.length <= 24) return true;
11
+ return hasTerminalPunctuation && wordCount <= 6 && text.length <= 36;
12
+ }
13
+ function hasNewSignificantTokens(currentQuery, cachedQuery) {
14
+ const currentTokens = new Set(tokenize(currentQuery));
15
+ const cachedTokens = new Set(tokenize(cachedQuery));
16
+ const newTokens = [...currentTokens].filter(
17
+ (t) => !cachedTokens.has(t) && t.length >= 2
18
+ );
19
+ return newTokens.length > 0;
20
+ }
21
+ function hasQueryOverlap(currentQuery, cachedQuery) {
22
+ const currentTokens = tokenize(currentQuery);
23
+ const cachedNorm = normalizeText(cachedQuery);
24
+ if (!currentTokens.length || !cachedNorm) return false;
25
+ return currentTokens.some((t) => cachedNorm.includes(t));
26
+ }
27
+ function shouldReuseSearchContext(params) {
28
+ const { latestText, cachedContext, userTurnCount, now } = params;
29
+ if (!cachedContext) return false;
30
+ if (userTurnCount <= 1) return false;
31
+ if (now - cachedContext.updatedAt > CACHE.SESSION_TTL * 1e3) return false;
32
+ if (!isLikelyFollowUp(latestText)) return false;
33
+ if (!hasQueryOverlap(latestText, cachedContext.query)) return false;
34
+ if (hasNewSignificantTokens(latestText, cachedContext.query)) return false;
35
+ return true;
36
+ }
37
+ function buildLocalSearchQuery(latestText) {
38
+ return tokenize(latestText).join(" ");
39
+ }
40
+ export {
41
+ buildLocalSearchQuery,
42
+ hasNewSignificantTokens,
43
+ hasQueryOverlap,
44
+ isLikelyFollowUp,
45
+ shouldReuseSearchContext
46
+ };
@@ -0,0 +1,6 @@
1
+ import type { ArticleContext } from "../search/types.js";
2
+ import type { QueryIntentCategory } from "./types.js";
3
+ export declare function classifyIntent(query: string): QueryIntentCategory;
4
+ export declare function rankArticlesByIntent(query: string, articles: ArticleContext[]): ArticleContext[];
5
+ export declare function rankArticlesByCategory(intent: QueryIntentCategory, articles: ArticleContext[]): ArticleContext[];
6
+ //# sourceMappingURL=intent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intent.d.ts","sourceRoot":"","sources":["../../src/query/intent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AA+FtD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAoBjE;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,cAAc,EAAE,GACzB,cAAc,EAAE,CAGlB;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,mBAAmB,EAC3B,QAAQ,EAAE,cAAc,EAAE,GACzB,cAAc,EAAE,CAgClB"}
@@ -0,0 +1,137 @@
1
+ const INTENT_KEYWORDS = {
2
+ setup: [
3
+ "\u642D\u5EFA",
4
+ "\u521B\u5EFA",
5
+ "\u5B89\u88C5",
6
+ "install",
7
+ "setup",
8
+ "create",
9
+ "init",
10
+ "scaffold",
11
+ "\u65B0\u5EFA",
12
+ "\u5F00\u59CB"
13
+ ],
14
+ config: [
15
+ "\u914D\u7F6E",
16
+ "\u8BBE\u7F6E",
17
+ "config",
18
+ "settings",
19
+ "\u73AF\u5883\u53D8\u91CF",
20
+ ".env",
21
+ "wrangler",
22
+ "tsconfig",
23
+ "\u4E3B\u9898\u8272",
24
+ "\u989C\u8272"
25
+ ],
26
+ content: [
27
+ "\u6587\u7AE0",
28
+ "\u535A\u5BA2",
29
+ "\u5199\u4F5C",
30
+ "markdown",
31
+ "mdx",
32
+ "\u6807\u7B7E",
33
+ "\u5206\u7C7B",
34
+ "\u6458\u8981",
35
+ "\u5C01\u9762",
36
+ "\u7FFB\u8BD1"
37
+ ],
38
+ feature: [
39
+ "\u529F\u80FD",
40
+ "\u7279\u6027",
41
+ "feature",
42
+ "\u652F\u6301",
43
+ "AI",
44
+ "RAG",
45
+ "\u641C\u7D22",
46
+ "\u8BC4\u8BBA",
47
+ "RSS",
48
+ "\u6697\u8272",
49
+ "\u6DF1\u8272"
50
+ ],
51
+ deployment: [
52
+ "\u90E8\u7F72",
53
+ "deploy",
54
+ "cloudflare",
55
+ "vercel",
56
+ "netlify",
57
+ "build",
58
+ "\u6784\u5EFA",
59
+ "CI",
60
+ "CD"
61
+ ],
62
+ troubleshooting: [
63
+ "\u62A5\u9519",
64
+ "\u9519\u8BEF",
65
+ "error",
66
+ "bug",
67
+ "\u95EE\u9898",
68
+ "\u4E0D\u5DE5\u4F5C",
69
+ "\u5931\u8D25",
70
+ "fail",
71
+ "\u4FEE\u590D",
72
+ "fix"
73
+ ],
74
+ general: []
75
+ };
76
+ function countKeywordHits(text, keywords) {
77
+ if (!text) return 0;
78
+ const lower = text.toLowerCase();
79
+ return keywords.reduce(
80
+ (hits, kw) => hits + (lower.includes(kw.toLowerCase()) ? 1 : 0),
81
+ 0
82
+ );
83
+ }
84
+ function isRecent(dateTime) {
85
+ if (!dateTime || !Number.isFinite(dateTime)) return false;
86
+ return Date.now() - dateTime <= 365 * 24 * 60 * 60 * 1e3;
87
+ }
88
+ function classifyIntent(query) {
89
+ const q = query.toLowerCase();
90
+ const scores = {};
91
+ for (const [intent, keywords] of Object.entries(INTENT_KEYWORDS)) {
92
+ if (intent === "general") continue;
93
+ const score = keywords.reduce(
94
+ (acc, kw) => acc + (q.includes(kw.toLowerCase()) ? 1 : 0),
95
+ 0
96
+ );
97
+ if (score > 0) scores[intent] = score;
98
+ }
99
+ const sorted = Object.entries(scores).sort(
100
+ (a, b) => b[1] - a[1]
101
+ );
102
+ return sorted[0]?.[0] || "general";
103
+ }
104
+ function rankArticlesByIntent(query, articles) {
105
+ const intent = classifyIntent(query);
106
+ return rankArticlesByCategory(intent, articles);
107
+ }
108
+ function rankArticlesByCategory(intent, articles) {
109
+ if (intent === "general" || articles.length <= 1) return articles;
110
+ const keywords = INTENT_KEYWORDS[intent];
111
+ if (!keywords.length) return articles;
112
+ const scored = articles.map((article, index) => {
113
+ const titleHit = countKeywordHits(article.title, keywords) > 0 ? 3 : 0;
114
+ const categoryHit = (article.categories ?? []).some(
115
+ (c) => countKeywordHits(c, keywords) > 0
116
+ ) ? 2 : 0;
117
+ const summaryHit = countKeywordHits(article.summary, keywords) > 0 ? 2 : 0;
118
+ const keyPointHit = article.keyPoints.some(
119
+ (kp) => countKeywordHits(kp, keywords) > 0
120
+ ) ? 1 : 0;
121
+ const recentHit = isRecent(article.dateTime) ? 1 : 0;
122
+ return {
123
+ article,
124
+ index,
125
+ score: titleHit + categoryHit + summaryHit + keyPointHit + recentHit
126
+ };
127
+ });
128
+ const maxScore = Math.max(...scored.map((s) => s.score), 0);
129
+ if (maxScore === 0) return articles;
130
+ scored.sort((a, b) => b.score - a.score || a.index - b.index);
131
+ return scored.map((s) => s.article);
132
+ }
133
+ export {
134
+ classifyIntent,
135
+ rankArticlesByCategory,
136
+ rankArticlesByIntent
137
+ };
@@ -0,0 +1,8 @@
1
+ export type QueryIntentCategory = "setup" | "config" | "content" | "feature" | "deployment" | "troubleshooting" | "general";
2
+ export interface SearchContextReuseParams {
3
+ latestText: string;
4
+ cachedContext: import("../search/types.js").CachedSearchContext | undefined;
5
+ userTurnCount: number;
6
+ now: number;
7
+ }
8
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/query/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAC3B,OAAO,GACP,QAAQ,GACR,SAAS,GACT,SAAS,GACT,YAAY,GACZ,iBAAiB,GACjB,SAAS,CAAC;AAEd,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,OAAO,oBAAoB,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC5E,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;CACb"}
File without changes