@revealui/ai 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (397) hide show
  1. package/LICENSE +22 -0
  2. package/LICENSE.commercial +112 -0
  3. package/README.md +314 -0
  4. package/dist/a2a/card.d.ts +26 -0
  5. package/dist/a2a/card.d.ts.map +1 -0
  6. package/dist/a2a/card.js +173 -0
  7. package/dist/a2a/handler.d.ts +26 -0
  8. package/dist/a2a/handler.d.ts.map +1 -0
  9. package/dist/a2a/handler.js +170 -0
  10. package/dist/a2a/index.d.ts +10 -0
  11. package/dist/a2a/index.d.ts.map +1 -0
  12. package/dist/a2a/index.js +9 -0
  13. package/dist/a2a/task-store.d.ts +42 -0
  14. package/dist/a2a/task-store.d.ts.map +1 -0
  15. package/dist/a2a/task-store.js +99 -0
  16. package/dist/audit/emitter.d.ts +34 -0
  17. package/dist/audit/emitter.d.ts.map +1 -0
  18. package/dist/audit/emitter.js +34 -0
  19. package/dist/audit/index.d.ts +44 -0
  20. package/dist/audit/index.d.ts.map +1 -0
  21. package/dist/audit/index.js +48 -0
  22. package/dist/audit/observer.d.ts +108 -0
  23. package/dist/audit/observer.d.ts.map +1 -0
  24. package/dist/audit/observer.js +271 -0
  25. package/dist/audit/policy.d.ts +70 -0
  26. package/dist/audit/policy.d.ts.map +1 -0
  27. package/dist/audit/policy.js +209 -0
  28. package/dist/audit/store.d.ts +42 -0
  29. package/dist/audit/store.d.ts.map +1 -0
  30. package/dist/audit/store.js +80 -0
  31. package/dist/audit/types.d.ts +169 -0
  32. package/dist/audit/types.d.ts.map +1 -0
  33. package/dist/audit/types.js +80 -0
  34. package/dist/client/hooks/index.d.ts +22 -0
  35. package/dist/client/hooks/index.d.ts.map +1 -0
  36. package/dist/client/hooks/index.js +21 -0
  37. package/dist/client/hooks/useAgentContext.d.ts +30 -0
  38. package/dist/client/hooks/useAgentContext.d.ts.map +1 -0
  39. package/dist/client/hooks/useAgentContext.js +161 -0
  40. package/dist/client/hooks/useAgentEvents.d.ts +126 -0
  41. package/dist/client/hooks/useAgentEvents.d.ts.map +1 -0
  42. package/dist/client/hooks/useAgentEvents.js +232 -0
  43. package/dist/client/hooks/useAgentStream.d.ts +44 -0
  44. package/dist/client/hooks/useAgentStream.d.ts.map +1 -0
  45. package/dist/client/hooks/useAgentStream.js +101 -0
  46. package/dist/client/hooks/useEpisodicMemory.d.ts +25 -0
  47. package/dist/client/hooks/useEpisodicMemory.d.ts.map +1 -0
  48. package/dist/client/hooks/useEpisodicMemory.js +174 -0
  49. package/dist/client/hooks/useWorkingMemory.d.ts +57 -0
  50. package/dist/client/hooks/useWorkingMemory.d.ts.map +1 -0
  51. package/dist/client/hooks/useWorkingMemory.js +276 -0
  52. package/dist/client/index.d.ts +14 -0
  53. package/dist/client/index.d.ts.map +1 -0
  54. package/dist/client/index.js +13 -0
  55. package/dist/embeddings/index.d.ts +51 -0
  56. package/dist/embeddings/index.d.ts.map +1 -0
  57. package/dist/embeddings/index.js +73 -0
  58. package/dist/index.d.ts +83 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +103 -0
  61. package/dist/inference/context-assembly.d.ts +27 -0
  62. package/dist/inference/context-assembly.d.ts.map +1 -0
  63. package/dist/inference/context-assembly.js +81 -0
  64. package/dist/inference/overflow-compressor.d.ts +17 -0
  65. package/dist/inference/overflow-compressor.d.ts.map +1 -0
  66. package/dist/inference/overflow-compressor.js +40 -0
  67. package/dist/inference/runRag.d.ts +35 -0
  68. package/dist/inference/runRag.d.ts.map +1 -0
  69. package/dist/inference/runRag.js +53 -0
  70. package/dist/ingestion/bm25.d.ts +29 -0
  71. package/dist/ingestion/bm25.d.ts.map +1 -0
  72. package/dist/ingestion/bm25.js +161 -0
  73. package/dist/ingestion/cms-indexer.d.ts +39 -0
  74. package/dist/ingestion/cms-indexer.d.ts.map +1 -0
  75. package/dist/ingestion/cms-indexer.js +74 -0
  76. package/dist/ingestion/file-parsers.d.ts +51 -0
  77. package/dist/ingestion/file-parsers.d.ts.map +1 -0
  78. package/dist/ingestion/file-parsers.js +247 -0
  79. package/dist/ingestion/hybrid-search.d.ts +22 -0
  80. package/dist/ingestion/hybrid-search.d.ts.map +1 -0
  81. package/dist/ingestion/hybrid-search.js +63 -0
  82. package/dist/ingestion/index.d.ts +9 -0
  83. package/dist/ingestion/index.d.ts.map +1 -0
  84. package/dist/ingestion/index.js +8 -0
  85. package/dist/ingestion/pipeline.d.ts +35 -0
  86. package/dist/ingestion/pipeline.d.ts.map +1 -0
  87. package/dist/ingestion/pipeline.js +114 -0
  88. package/dist/ingestion/rag-vector-service.d.ts +34 -0
  89. package/dist/ingestion/rag-vector-service.d.ts.map +1 -0
  90. package/dist/ingestion/rag-vector-service.js +98 -0
  91. package/dist/ingestion/reranker.d.ts +10 -0
  92. package/dist/ingestion/reranker.d.ts.map +1 -0
  93. package/dist/ingestion/reranker.js +41 -0
  94. package/dist/ingestion/text-splitter.d.ts +25 -0
  95. package/dist/ingestion/text-splitter.d.ts.map +1 -0
  96. package/dist/ingestion/text-splitter.js +119 -0
  97. package/dist/llm/cache-utils.d.ts +146 -0
  98. package/dist/llm/cache-utils.d.ts.map +1 -0
  99. package/dist/llm/cache-utils.js +204 -0
  100. package/dist/llm/client.d.ts +134 -0
  101. package/dist/llm/client.d.ts.map +1 -0
  102. package/dist/llm/client.js +497 -0
  103. package/dist/llm/key-validator.d.ts +25 -0
  104. package/dist/llm/key-validator.d.ts.map +1 -0
  105. package/dist/llm/key-validator.js +101 -0
  106. package/dist/llm/provider-health.d.ts +40 -0
  107. package/dist/llm/provider-health.d.ts.map +1 -0
  108. package/dist/llm/provider-health.js +97 -0
  109. package/dist/llm/providers/anthropic.d.ts +31 -0
  110. package/dist/llm/providers/anthropic.d.ts.map +1 -0
  111. package/dist/llm/providers/anthropic.js +248 -0
  112. package/dist/llm/providers/base.d.ts +111 -0
  113. package/dist/llm/providers/base.d.ts.map +1 -0
  114. package/dist/llm/providers/base.js +6 -0
  115. package/dist/llm/providers/groq.d.ts +23 -0
  116. package/dist/llm/providers/groq.d.ts.map +1 -0
  117. package/dist/llm/providers/groq.js +27 -0
  118. package/dist/llm/providers/ollama.d.ts +27 -0
  119. package/dist/llm/providers/ollama.d.ts.map +1 -0
  120. package/dist/llm/providers/ollama.js +48 -0
  121. package/dist/llm/providers/openai.d.ts +19 -0
  122. package/dist/llm/providers/openai.d.ts.map +1 -0
  123. package/dist/llm/providers/openai.js +245 -0
  124. package/dist/llm/providers/vultr.d.ts +18 -0
  125. package/dist/llm/providers/vultr.d.ts.map +1 -0
  126. package/dist/llm/providers/vultr.js +168 -0
  127. package/dist/llm/response-cache.d.ts +166 -0
  128. package/dist/llm/response-cache.d.ts.map +1 -0
  129. package/dist/llm/response-cache.js +233 -0
  130. package/dist/llm/semantic-cache.d.ts +179 -0
  131. package/dist/llm/semantic-cache.d.ts.map +1 -0
  132. package/dist/llm/semantic-cache.js +306 -0
  133. package/dist/llm/server.d.ts +14 -0
  134. package/dist/llm/server.d.ts.map +1 -0
  135. package/dist/llm/server.js +15 -0
  136. package/dist/llm/token-counter.d.ts +48 -0
  137. package/dist/llm/token-counter.d.ts.map +1 -0
  138. package/dist/llm/token-counter.js +77 -0
  139. package/dist/llm/workspace-provider-config.d.ts +38 -0
  140. package/dist/llm/workspace-provider-config.d.ts.map +1 -0
  141. package/dist/llm/workspace-provider-config.js +47 -0
  142. package/dist/memory/agent/context-manager.d.ts +148 -0
  143. package/dist/memory/agent/context-manager.d.ts.map +1 -0
  144. package/dist/memory/agent/context-manager.js +284 -0
  145. package/dist/memory/agent/index.d.ts +7 -0
  146. package/dist/memory/agent/index.d.ts.map +1 -0
  147. package/dist/memory/agent/index.js +6 -0
  148. package/dist/memory/crdt/index.d.ts +13 -0
  149. package/dist/memory/crdt/index.d.ts.map +1 -0
  150. package/dist/memory/crdt/index.js +12 -0
  151. package/dist/memory/crdt/lww-register.d.ts +108 -0
  152. package/dist/memory/crdt/lww-register.d.ts.map +1 -0
  153. package/dist/memory/crdt/lww-register.js +169 -0
  154. package/dist/memory/crdt/or-set.d.ts +141 -0
  155. package/dist/memory/crdt/or-set.d.ts.map +1 -0
  156. package/dist/memory/crdt/or-set.js +291 -0
  157. package/dist/memory/crdt/pn-counter.d.ts +116 -0
  158. package/dist/memory/crdt/pn-counter.d.ts.map +1 -0
  159. package/dist/memory/crdt/pn-counter.js +174 -0
  160. package/dist/memory/crdt/vector-clock.d.ts +115 -0
  161. package/dist/memory/crdt/vector-clock.d.ts.map +1 -0
  162. package/dist/memory/crdt/vector-clock.js +179 -0
  163. package/dist/memory/errors/index.d.ts +56 -0
  164. package/dist/memory/errors/index.d.ts.map +1 -0
  165. package/dist/memory/errors/index.js +85 -0
  166. package/dist/memory/index.d.ts +21 -0
  167. package/dist/memory/index.d.ts.map +1 -0
  168. package/dist/memory/index.js +20 -0
  169. package/dist/memory/persistence/crdt-persistence.d.ts +85 -0
  170. package/dist/memory/persistence/crdt-persistence.d.ts.map +1 -0
  171. package/dist/memory/persistence/crdt-persistence.js +204 -0
  172. package/dist/memory/persistence/index.d.ts +7 -0
  173. package/dist/memory/persistence/index.d.ts.map +1 -0
  174. package/dist/memory/persistence/index.js +6 -0
  175. package/dist/memory/preferences/index.d.ts +7 -0
  176. package/dist/memory/preferences/index.d.ts.map +1 -0
  177. package/dist/memory/preferences/index.js +6 -0
  178. package/dist/memory/preferences/user-preferences-manager.d.ts +133 -0
  179. package/dist/memory/preferences/user-preferences-manager.d.ts.map +1 -0
  180. package/dist/memory/preferences/user-preferences-manager.js +342 -0
  181. package/dist/memory/services/index.d.ts +8 -0
  182. package/dist/memory/services/index.d.ts.map +1 -0
  183. package/dist/memory/services/index.js +6 -0
  184. package/dist/memory/services/node-id-service.d.ts +75 -0
  185. package/dist/memory/services/node-id-service.d.ts.map +1 -0
  186. package/dist/memory/services/node-id-service.js +190 -0
  187. package/dist/memory/stores/episodic-memory.d.ts +182 -0
  188. package/dist/memory/stores/episodic-memory.d.ts.map +1 -0
  189. package/dist/memory/stores/episodic-memory.js +378 -0
  190. package/dist/memory/stores/index.d.ts +16 -0
  191. package/dist/memory/stores/index.d.ts.map +1 -0
  192. package/dist/memory/stores/index.js +15 -0
  193. package/dist/memory/stores/procedural-memory.d.ts +89 -0
  194. package/dist/memory/stores/procedural-memory.d.ts.map +1 -0
  195. package/dist/memory/stores/procedural-memory.js +152 -0
  196. package/dist/memory/stores/semantic-memory.d.ts +92 -0
  197. package/dist/memory/stores/semantic-memory.d.ts.map +1 -0
  198. package/dist/memory/stores/semantic-memory.js +155 -0
  199. package/dist/memory/stores/working-memory.d.ts +225 -0
  200. package/dist/memory/stores/working-memory.d.ts.map +1 -0
  201. package/dist/memory/stores/working-memory.js +336 -0
  202. package/dist/memory/utils/deep-clone.d.ts +10 -0
  203. package/dist/memory/utils/deep-clone.d.ts.map +1 -0
  204. package/dist/memory/utils/deep-clone.js +9 -0
  205. package/dist/memory/utils/index.d.ts +8 -0
  206. package/dist/memory/utils/index.d.ts.map +1 -0
  207. package/dist/memory/utils/index.js +7 -0
  208. package/dist/memory/utils/logger.d.ts +21 -0
  209. package/dist/memory/utils/logger.d.ts.map +1 -0
  210. package/dist/memory/utils/logger.js +62 -0
  211. package/dist/memory/utils/sql-helpers.d.ts +97 -0
  212. package/dist/memory/utils/sql-helpers.d.ts.map +1 -0
  213. package/dist/memory/utils/sql-helpers.js +214 -0
  214. package/dist/memory/utils/validation.d.ts +62 -0
  215. package/dist/memory/utils/validation.d.ts.map +1 -0
  216. package/dist/memory/utils/validation.js +244 -0
  217. package/dist/memory/vector/index.d.ts +12 -0
  218. package/dist/memory/vector/index.d.ts.map +1 -0
  219. package/dist/memory/vector/index.js +14 -0
  220. package/dist/memory/vector/vector-memory-service.d.ts +88 -0
  221. package/dist/memory/vector/vector-memory-service.d.ts.map +1 -0
  222. package/dist/memory/vector/vector-memory-service.js +335 -0
  223. package/dist/observability/logger.d.ts +79 -0
  224. package/dist/observability/logger.d.ts.map +1 -0
  225. package/dist/observability/logger.js +165 -0
  226. package/dist/observability/metrics.d.ts +43 -0
  227. package/dist/observability/metrics.d.ts.map +1 -0
  228. package/dist/observability/metrics.js +197 -0
  229. package/dist/observability/query.d.ts +150 -0
  230. package/dist/observability/query.d.ts.map +1 -0
  231. package/dist/observability/query.js +339 -0
  232. package/dist/observability/types.d.ts +140 -0
  233. package/dist/observability/types.d.ts.map +1 -0
  234. package/dist/observability/types.js +6 -0
  235. package/dist/orchestration/agent.d.ts +98 -0
  236. package/dist/orchestration/agent.d.ts.map +1 -0
  237. package/dist/orchestration/agent.js +6 -0
  238. package/dist/orchestration/defaults.d.ts +21 -0
  239. package/dist/orchestration/defaults.d.ts.map +1 -0
  240. package/dist/orchestration/defaults.js +22 -0
  241. package/dist/orchestration/memory-integration.d.ts +58 -0
  242. package/dist/orchestration/memory-integration.d.ts.map +1 -0
  243. package/dist/orchestration/memory-integration.js +130 -0
  244. package/dist/orchestration/orchestrator.d.ts +67 -0
  245. package/dist/orchestration/orchestrator.d.ts.map +1 -0
  246. package/dist/orchestration/orchestrator.js +174 -0
  247. package/dist/orchestration/runtime.d.ts +82 -0
  248. package/dist/orchestration/runtime.d.ts.map +1 -0
  249. package/dist/orchestration/runtime.js +251 -0
  250. package/dist/orchestration/streaming-runtime.d.ts +36 -0
  251. package/dist/orchestration/streaming-runtime.d.ts.map +1 -0
  252. package/dist/orchestration/streaming-runtime.js +175 -0
  253. package/dist/orchestration/ticket-agent.d.ts +70 -0
  254. package/dist/orchestration/ticket-agent.d.ts.map +1 -0
  255. package/dist/orchestration/ticket-agent.js +146 -0
  256. package/dist/skills/activation/index.d.ts +7 -0
  257. package/dist/skills/activation/index.d.ts.map +1 -0
  258. package/dist/skills/activation/index.js +6 -0
  259. package/dist/skills/activation/skill-activator.d.ts +68 -0
  260. package/dist/skills/activation/skill-activator.d.ts.map +1 -0
  261. package/dist/skills/activation/skill-activator.js +224 -0
  262. package/dist/skills/catalog/catalog-search.d.ts +55 -0
  263. package/dist/skills/catalog/catalog-search.d.ts.map +1 -0
  264. package/dist/skills/catalog/catalog-search.js +111 -0
  265. package/dist/skills/catalog/catalog-types.d.ts +81 -0
  266. package/dist/skills/catalog/catalog-types.d.ts.map +1 -0
  267. package/dist/skills/catalog/catalog-types.js +66 -0
  268. package/dist/skills/catalog/index.d.ts +9 -0
  269. package/dist/skills/catalog/index.d.ts.map +1 -0
  270. package/dist/skills/catalog/index.js +7 -0
  271. package/dist/skills/catalog/vercel-catalog.d.ts +42 -0
  272. package/dist/skills/catalog/vercel-catalog.d.ts.map +1 -0
  273. package/dist/skills/catalog/vercel-catalog.js +189 -0
  274. package/dist/skills/compat/index.d.ts +9 -0
  275. package/dist/skills/compat/index.d.ts.map +1 -0
  276. package/dist/skills/compat/index.js +8 -0
  277. package/dist/skills/compat/skill-enhancer.d.ts +37 -0
  278. package/dist/skills/compat/skill-enhancer.d.ts.map +1 -0
  279. package/dist/skills/compat/skill-enhancer.js +76 -0
  280. package/dist/skills/compat/tool-mapper.d.ts +61 -0
  281. package/dist/skills/compat/tool-mapper.d.ts.map +1 -0
  282. package/dist/skills/compat/tool-mapper.js +168 -0
  283. package/dist/skills/compat/vercel-compat.d.ts +33 -0
  284. package/dist/skills/compat/vercel-compat.d.ts.map +1 -0
  285. package/dist/skills/compat/vercel-compat.js +132 -0
  286. package/dist/skills/index.d.ts +40 -0
  287. package/dist/skills/index.d.ts.map +1 -0
  288. package/dist/skills/index.js +47 -0
  289. package/dist/skills/integration/agent-skill-provider.d.ts +94 -0
  290. package/dist/skills/integration/agent-skill-provider.d.ts.map +1 -0
  291. package/dist/skills/integration/agent-skill-provider.js +161 -0
  292. package/dist/skills/integration/index.d.ts +7 -0
  293. package/dist/skills/integration/index.d.ts.map +1 -0
  294. package/dist/skills/integration/index.js +6 -0
  295. package/dist/skills/loader/github-loader.d.ts +61 -0
  296. package/dist/skills/loader/github-loader.d.ts.map +1 -0
  297. package/dist/skills/loader/github-loader.js +176 -0
  298. package/dist/skills/loader/index.d.ts +10 -0
  299. package/dist/skills/loader/index.d.ts.map +1 -0
  300. package/dist/skills/loader/index.js +9 -0
  301. package/dist/skills/loader/local-loader.d.ts +56 -0
  302. package/dist/skills/loader/local-loader.d.ts.map +1 -0
  303. package/dist/skills/loader/local-loader.js +186 -0
  304. package/dist/skills/loader/vercel-loader.d.ts +64 -0
  305. package/dist/skills/loader/vercel-loader.d.ts.map +1 -0
  306. package/dist/skills/loader/vercel-loader.js +313 -0
  307. package/dist/skills/loader/vercel-types.d.ts +64 -0
  308. package/dist/skills/loader/vercel-types.d.ts.map +1 -0
  309. package/dist/skills/loader/vercel-types.js +55 -0
  310. package/dist/skills/parser/index.d.ts +7 -0
  311. package/dist/skills/parser/index.d.ts.map +1 -0
  312. package/dist/skills/parser/index.js +6 -0
  313. package/dist/skills/parser/skill-md-parser.d.ts +64 -0
  314. package/dist/skills/parser/skill-md-parser.d.ts.map +1 -0
  315. package/dist/skills/parser/skill-md-parser.js +242 -0
  316. package/dist/skills/registry/index.d.ts +7 -0
  317. package/dist/skills/registry/index.d.ts.map +1 -0
  318. package/dist/skills/registry/index.js +6 -0
  319. package/dist/skills/registry/skill-registry.d.ts +133 -0
  320. package/dist/skills/registry/skill-registry.d.ts.map +1 -0
  321. package/dist/skills/registry/skill-registry.js +373 -0
  322. package/dist/skills/types.d.ts +216 -0
  323. package/dist/skills/types.d.ts.map +1 -0
  324. package/dist/skills/types.js +176 -0
  325. package/dist/templates/agent-spec.d.ts +138 -0
  326. package/dist/templates/agent-spec.d.ts.map +1 -0
  327. package/dist/templates/agent-spec.js +138 -0
  328. package/dist/templates/index.d.ts +56 -0
  329. package/dist/templates/index.d.ts.map +1 -0
  330. package/dist/templates/index.js +58 -0
  331. package/dist/templates/prompt-spec.d.ts +140 -0
  332. package/dist/templates/prompt-spec.d.ts.map +1 -0
  333. package/dist/templates/prompt-spec.js +210 -0
  334. package/dist/templates/skill-spec.d.ts +106 -0
  335. package/dist/templates/skill-spec.d.ts.map +1 -0
  336. package/dist/templates/skill-spec.js +119 -0
  337. package/dist/tools/base.d.ts +74 -0
  338. package/dist/tools/base.d.ts.map +1 -0
  339. package/dist/tools/base.js +6 -0
  340. package/dist/tools/cms/collection-tools.d.ts +36 -0
  341. package/dist/tools/cms/collection-tools.d.ts.map +1 -0
  342. package/dist/tools/cms/collection-tools.js +178 -0
  343. package/dist/tools/cms/factory.d.ts +89 -0
  344. package/dist/tools/cms/factory.d.ts.map +1 -0
  345. package/dist/tools/cms/factory.js +462 -0
  346. package/dist/tools/cms/global-tools.d.ts +21 -0
  347. package/dist/tools/cms/global-tools.d.ts.map +1 -0
  348. package/dist/tools/cms/global-tools.js +92 -0
  349. package/dist/tools/cms/index.d.ts +11 -0
  350. package/dist/tools/cms/index.d.ts.map +1 -0
  351. package/dist/tools/cms/index.js +11 -0
  352. package/dist/tools/cms/media-tools.d.ts +31 -0
  353. package/dist/tools/cms/media-tools.d.ts.map +1 -0
  354. package/dist/tools/cms/media-tools.js +140 -0
  355. package/dist/tools/cms/user-tools.d.ts +31 -0
  356. package/dist/tools/cms/user-tools.d.ts.map +1 -0
  357. package/dist/tools/cms/user-tools.js +135 -0
  358. package/dist/tools/deduplicator.d.ts +19 -0
  359. package/dist/tools/deduplicator.d.ts.map +1 -0
  360. package/dist/tools/deduplicator.js +53 -0
  361. package/dist/tools/document-summarizer.d.ts +11 -0
  362. package/dist/tools/document-summarizer.d.ts.map +1 -0
  363. package/dist/tools/document-summarizer.js +82 -0
  364. package/dist/tools/mcp-adapter.d.ts +66 -0
  365. package/dist/tools/mcp-adapter.d.ts.map +1 -0
  366. package/dist/tools/mcp-adapter.js +152 -0
  367. package/dist/tools/memory/index.d.ts +3 -0
  368. package/dist/tools/memory/index.d.ts.map +1 -0
  369. package/dist/tools/memory/index.js +1 -0
  370. package/dist/tools/memory/store-memory.d.ts +39 -0
  371. package/dist/tools/memory/store-memory.d.ts.map +1 -0
  372. package/dist/tools/memory/store-memory.js +94 -0
  373. package/dist/tools/registry.d.ts +14 -0
  374. package/dist/tools/registry.d.ts.map +1 -0
  375. package/dist/tools/registry.js +48 -0
  376. package/dist/tools/ticket-tools.d.ts +31 -0
  377. package/dist/tools/ticket-tools.d.ts.map +1 -0
  378. package/dist/tools/ticket-tools.js +74 -0
  379. package/dist/tools/web/duck-duck-go.d.ts +52 -0
  380. package/dist/tools/web/duck-duck-go.d.ts.map +1 -0
  381. package/dist/tools/web/duck-duck-go.js +202 -0
  382. package/dist/tools/web/exa.d.ts +34 -0
  383. package/dist/tools/web/exa.d.ts.map +1 -0
  384. package/dist/tools/web/exa.js +80 -0
  385. package/dist/tools/web/index.d.ts +6 -0
  386. package/dist/tools/web/index.d.ts.map +1 -0
  387. package/dist/tools/web/index.js +4 -0
  388. package/dist/tools/web/scraper.d.ts +9 -0
  389. package/dist/tools/web/scraper.d.ts.map +1 -0
  390. package/dist/tools/web/scraper.js +118 -0
  391. package/dist/tools/web/tavily.d.ts +32 -0
  392. package/dist/tools/web/tavily.d.ts.map +1 -0
  393. package/dist/tools/web/tavily.js +73 -0
  394. package/dist/tools/web/types.d.ts +31 -0
  395. package/dist/tools/web/types.d.ts.map +1 -0
  396. package/dist/tools/web/types.js +9 -0
  397. package/package.json +143 -0
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Context Assembly with Smart Trimming
3
+ *
4
+ * Blends relevance (cosine similarity) and recency (createdAt) to rank chunks,
5
+ * then greedily assembles them up to a token budget.
6
+ * Auto-compresses single chunks that exceed half the budget.
7
+ *
8
+ * AnythingLLM lesson: plain cosine-only retrieval without recency weighting
9
+ * produces stale, misleading context in long-running knowledge bases.
10
+ */
11
+ function estimateTokens(text) {
12
+ return Math.ceil(text.length / 4);
13
+ }
14
+ /**
15
+ * Compute a 0–1 recency score: newest chunk = 1.0, oldest = 0.1.
16
+ * Decays linearly based on position in time-sorted array.
17
+ */
18
+ function computeRecencyScores(results) {
19
+ if (results.length === 0)
20
+ return new Map();
21
+ if (results.length === 1) {
22
+ const r = results[0];
23
+ return r ? new Map([[r.chunk.id, 1.0]]) : new Map();
24
+ }
25
+ const sorted = [...results].sort((a, b) => b.chunk.createdAt.getTime() - a.chunk.createdAt.getTime());
26
+ const map = new Map();
27
+ const n = sorted.length;
28
+ sorted.forEach((r, i) => {
29
+ // Linearly decay from 1.0 (newest) to 0.1 (oldest)
30
+ const score = 1.0 - (0.9 * i) / Math.max(n - 1, 1);
31
+ map.set(r.chunk.id, score);
32
+ });
33
+ return map;
34
+ }
35
+ /**
36
+ * Assemble RAG context from search results.
37
+ *
38
+ * Returns a formatted string of numbered references, trimmed to maxTokens.
39
+ * Returns '' if results is empty.
40
+ */
41
+ export function assembleContext(results, options) {
42
+ if (results.length === 0)
43
+ return '';
44
+ const relevanceWeight = options.relevanceWeight ?? 0.7;
45
+ const recencyWeight = options.recencyWeight ?? 0.3;
46
+ const maxTokens = options.maxTokens;
47
+ const recencyScores = computeRecencyScores(results);
48
+ // Compute blended scores
49
+ const scored = results.map((r) => {
50
+ const recency = recencyScores.get(r.chunk.id) ?? 0.5;
51
+ const finalScore = r.similarity * relevanceWeight + recency * recencyWeight;
52
+ return { result: r, finalScore };
53
+ });
54
+ // Sort descending by blended score
55
+ scored.sort((a, b) => b.finalScore - a.finalScore);
56
+ // Greedy token-budget assembly
57
+ const sections = [];
58
+ let usedTokens = 0;
59
+ const halfBudget = Math.floor(maxTokens / 2);
60
+ for (let i = 0; i < scored.length; i++) {
61
+ const item = scored[i];
62
+ if (!item)
63
+ continue;
64
+ const { result } = item;
65
+ const title = result.document.title ?? result.document.sourceCollection ?? 'Unknown';
66
+ let content = result.chunk.content;
67
+ // Auto-compress: if single chunk exceeds half the budget, truncate
68
+ const chunkTokens = estimateTokens(content);
69
+ if (chunkTokens > halfBudget) {
70
+ const maxChars = halfBudget * 4;
71
+ content = `${content.slice(0, maxChars)} [content truncated]`;
72
+ }
73
+ const section = `[${i + 1}] Source: ${title}\n${content}`;
74
+ const sectionTokens = estimateTokens(section);
75
+ if (usedTokens + sectionTokens > maxTokens)
76
+ break;
77
+ sections.push(section);
78
+ usedTokens += sectionTokens;
79
+ }
80
+ return sections.join('\n\n---\n\n');
81
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Content Overflow Auto-Compressor
3
+ *
4
+ * Called when assembled context exceeds the token budget.
5
+ * Uses the LLM to summarize, preserving key facts.
6
+ */
7
+ import type { LLMClient } from '../llm/client.js';
8
+ /**
9
+ * Compress context string if it exceeds maxTokens.
10
+ * Returns the original context if it fits within budget.
11
+ * Prepends "[summarized from N source chunks]" to compressed output.
12
+ */
13
+ export declare function compressContext(context: string, options: {
14
+ maxTokens: number;
15
+ llmClient: LLMClient;
16
+ }): Promise<string>;
17
+ //# sourceMappingURL=overflow-compressor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overflow-compressor.d.ts","sourceRoot":"","sources":["../../src/inference/overflow-compressor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAMjD;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAAE,GACnD,OAAO,CAAC,MAAM,CAAC,CA4BjB"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Content Overflow Auto-Compressor
3
+ *
4
+ * Called when assembled context exceeds the token budget.
5
+ * Uses the LLM to summarize, preserving key facts.
6
+ */
7
+ function estimateTokens(text) {
8
+ return Math.ceil(text.length / 4);
9
+ }
10
+ /**
11
+ * Compress context string if it exceeds maxTokens.
12
+ * Returns the original context if it fits within budget.
13
+ * Prepends "[summarized from N source chunks]" to compressed output.
14
+ */
15
+ export async function compressContext(context, options) {
16
+ if (estimateTokens(context) <= options.maxTokens) {
17
+ return context;
18
+ }
19
+ // Count source chunks (numbered references like "[1] Source:")
20
+ const chunkCount = (context.match(/^\[\d+\] Source:/gm) ?? []).length;
21
+ try {
22
+ const response = await options.llmClient.chat([
23
+ {
24
+ role: 'system',
25
+ content: 'Summarize the following context, preserving key facts, names, dates, and specific details. Be concise but complete.',
26
+ },
27
+ {
28
+ role: 'user',
29
+ content: context,
30
+ },
31
+ ]);
32
+ const prefix = `[summarized from ${chunkCount} source chunks]\n\n`;
33
+ return prefix + response.content;
34
+ }
35
+ catch {
36
+ // On LLM failure, hard-truncate
37
+ const maxChars = options.maxTokens * 4;
38
+ return `${context.slice(0, maxChars)} [context truncated due to size]`;
39
+ }
40
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * RAG Query — Retrieval-Augmented Generation
3
+ *
4
+ * Generates an embedding for the query, searches the rag_chunks table via
5
+ * pgvector cosine distance, assembles ranked context with recency weighting,
6
+ * and optionally compresses it if it exceeds the token budget.
7
+ */
8
+ import type { Database } from '@revealui/db/client';
9
+ import type { LLMClient } from '../llm/client.js';
10
+ export interface RAGOptions {
11
+ workspaceId: string;
12
+ db: Database;
13
+ /** Maximum search results to retrieve (default 5) */
14
+ limit?: number;
15
+ /** Minimum cosine similarity threshold 0–1 (default 0.6) */
16
+ threshold?: number;
17
+ /** Custom embedding function — defaults to generateEmbedding() */
18
+ embeddingFn?: (text: string) => Promise<number[]>;
19
+ /** search mode: 'speed' (vector-only) | 'accuracy' (BM25 hybrid + optional rerank) */
20
+ mode?: 'speed' | 'accuracy';
21
+ /** LLMClient for accuracy-mode reranking and overflow compression */
22
+ llmClient?: LLMClient;
23
+ /** Maximum tokens for assembled context (default 2000) */
24
+ maxContextTokens?: number;
25
+ /** Filter to a specific CMS collection */
26
+ sourceCollection?: string;
27
+ }
28
+ /**
29
+ * Run RAG retrieval for a query.
30
+ *
31
+ * Returns a formatted context string ready to prepend to an LLM prompt.
32
+ * Returns '' if no relevant documents exist for the workspace.
33
+ */
34
+ export declare function runRAG(query: string, options?: RAGOptions): Promise<string>;
35
+ //# sourceMappingURL=runRag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runRag.d.ts","sourceRoot":"","sources":["../../src/inference/runRag.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAGnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAIjD,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,EAAE,EAAE,QAAQ,CAAA;IACZ,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kEAAkE;IAClE,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IACjD,sFAAsF;IACtF,IAAI,CAAC,EAAE,OAAO,GAAG,UAAU,CAAA;IAC3B,qEAAqE;IACrE,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,0DAA0D;IAC1D,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,0CAA0C;IAC1C,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAyCjF"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * RAG Query — Retrieval-Augmented Generation
3
+ *
4
+ * Generates an embedding for the query, searches the rag_chunks table via
5
+ * pgvector cosine distance, assembles ranked context with recency weighting,
6
+ * and optionally compresses it if it exceeds the token budget.
7
+ */
8
+ import { generateEmbedding } from '../embeddings/index.js';
9
+ import { hybridSearch } from '../ingestion/hybrid-search.js';
10
+ import { assembleContext } from './context-assembly.js';
11
+ import { compressContext } from './overflow-compressor.js';
12
+ /**
13
+ * Run RAG retrieval for a query.
14
+ *
15
+ * Returns a formatted context string ready to prepend to an LLM prompt.
16
+ * Returns '' if no relevant documents exist for the workspace.
17
+ */
18
+ export async function runRAG(query, options) {
19
+ if (!(query?.trim() && options))
20
+ return '';
21
+ const embeddingFn = options.embeddingFn ??
22
+ (async (text) => {
23
+ const emb = await generateEmbedding(text);
24
+ return emb.vector;
25
+ });
26
+ const maxContextTokens = options.maxContextTokens ?? 2000;
27
+ // Retrieve relevant chunks
28
+ const results = await hybridSearch(query, options.db, embeddingFn, {
29
+ workspaceId: options.workspaceId,
30
+ limit: options.limit ?? 5,
31
+ threshold: options.threshold ?? 0.6,
32
+ mode: options.mode ?? 'speed',
33
+ sourceCollection: options.sourceCollection,
34
+ llmClient: options.llmClient,
35
+ rerank: options.mode === 'accuracy' && options.llmClient !== undefined,
36
+ });
37
+ if (results.length === 0)
38
+ return '';
39
+ // Assemble context with recency + relevance blending
40
+ const context = assembleContext(results, {
41
+ maxTokens: maxContextTokens,
42
+ relevanceWeight: 0.7,
43
+ recencyWeight: 0.3,
44
+ });
45
+ // Auto-compress if over budget and LLMClient available
46
+ if (options.llmClient) {
47
+ return compressContext(context, {
48
+ maxTokens: maxContextTokens,
49
+ llmClient: options.llmClient,
50
+ });
51
+ }
52
+ return context;
53
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Pure TypeScript BM25 Implementation
3
+ *
4
+ * Built on-demand from top-N vector candidates — no persistent index.
5
+ * k1=1.5, b=0.75 (standard values). No external deps.
6
+ */
7
+ export interface BM25Document {
8
+ id: string;
9
+ text: string;
10
+ }
11
+ export interface BM25Result {
12
+ id: string;
13
+ score: number;
14
+ }
15
+ export declare class BM25 {
16
+ private k1;
17
+ private b;
18
+ private docs;
19
+ private avgDocLength;
20
+ private termFreqs;
21
+ private docFreqs;
22
+ constructor(options?: {
23
+ k1?: number;
24
+ b?: number;
25
+ });
26
+ index(documents: BM25Document[]): void;
27
+ search(query: string, topK?: number): BM25Result[];
28
+ }
29
+ //# sourceMappingURL=bm25.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bm25.d.ts","sourceRoot":"","sources":["../../src/ingestion/bm25.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoFH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;CACd;AAUD,qBAAa,IAAI;IACf,OAAO,CAAC,EAAE,CAAM;IAChB,OAAO,CAAC,CAAC,CAAO;IAChB,OAAO,CAAC,IAAI,CAA8D;IAC1E,OAAO,CAAC,YAAY,CAAI;IACxB,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,QAAQ,CAAiC;gBAErC,OAAO,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE;IAKjD,KAAK,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,IAAI;IA6BtC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,SAAK,GAAG,UAAU,EAAE;CAkC/C"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Pure TypeScript BM25 Implementation
3
+ *
4
+ * Built on-demand from top-N vector candidates — no persistent index.
5
+ * k1=1.5, b=0.75 (standard values). No external deps.
6
+ */
7
+ const STOP_WORDS = new Set([
8
+ 'a',
9
+ 'an',
10
+ 'and',
11
+ 'are',
12
+ 'as',
13
+ 'at',
14
+ 'be',
15
+ 'been',
16
+ 'being',
17
+ 'but',
18
+ 'by',
19
+ 'do',
20
+ 'does',
21
+ 'doing',
22
+ 'for',
23
+ 'from',
24
+ 'had',
25
+ 'has',
26
+ 'have',
27
+ 'having',
28
+ 'he',
29
+ 'her',
30
+ 'hers',
31
+ 'him',
32
+ 'his',
33
+ 'how',
34
+ 'i',
35
+ 'if',
36
+ 'in',
37
+ 'into',
38
+ 'is',
39
+ 'it',
40
+ 'its',
41
+ 'itself',
42
+ 'me',
43
+ 'my',
44
+ 'nor',
45
+ 'not',
46
+ 'of',
47
+ 'on',
48
+ 'or',
49
+ 'our',
50
+ 'out',
51
+ 'own',
52
+ 'she',
53
+ 'so',
54
+ 'some',
55
+ 'than',
56
+ 'that',
57
+ 'the',
58
+ 'their',
59
+ 'them',
60
+ 'then',
61
+ 'there',
62
+ 'these',
63
+ 'they',
64
+ 'this',
65
+ 'those',
66
+ 'through',
67
+ 'to',
68
+ 'too',
69
+ 'up',
70
+ 'very',
71
+ 'was',
72
+ 'we',
73
+ 'were',
74
+ 'what',
75
+ 'when',
76
+ 'where',
77
+ 'which',
78
+ 'while',
79
+ 'who',
80
+ 'whom',
81
+ 'why',
82
+ 'will',
83
+ 'with',
84
+ 'would',
85
+ 'you',
86
+ 'your',
87
+ ]);
88
+ function tokenize(text) {
89
+ return text
90
+ .toLowerCase()
91
+ .split(/\W+/)
92
+ .filter((t) => t.length > 1 && !STOP_WORDS.has(t));
93
+ }
94
+ // biome-ignore lint/style/useNamingConvention: BM25 is the canonical algorithm name (Best Match 25)
95
+ export class BM25 {
96
+ k1 = 1.5;
97
+ b = 0.75;
98
+ docs = [];
99
+ avgDocLength = 0;
100
+ termFreqs = new Map(); // term → docId → freq
101
+ docFreqs = new Map(); // term → number of docs containing it
102
+ constructor(options) {
103
+ if (options?.k1 !== undefined)
104
+ this.k1 = options.k1;
105
+ if (options?.b !== undefined)
106
+ this.b = options.b;
107
+ }
108
+ index(documents) {
109
+ this.docs = [];
110
+ this.termFreqs = new Map();
111
+ this.docFreqs = new Map();
112
+ let totalLength = 0;
113
+ for (const doc of documents) {
114
+ const tokens = tokenize(doc.text);
115
+ totalLength += tokens.length;
116
+ this.docs.push({ id: doc.id, tokens, length: tokens.length });
117
+ // Count term frequencies per document
118
+ const tfMap = new Map();
119
+ for (const token of tokens) {
120
+ tfMap.set(token, (tfMap.get(token) ?? 0) + 1);
121
+ }
122
+ for (const [term, freq] of tfMap) {
123
+ if (!this.termFreqs.has(term))
124
+ this.termFreqs.set(term, new Map());
125
+ // biome-ignore lint/style/noNonNullAssertion: set above guarantees presence
126
+ this.termFreqs.get(term).set(doc.id, freq);
127
+ this.docFreqs.set(term, (this.docFreqs.get(term) ?? 0) + 1);
128
+ }
129
+ }
130
+ this.avgDocLength = documents.length > 0 ? totalLength / documents.length : 1;
131
+ }
132
+ search(query, topK = 10) {
133
+ const queryTokens = tokenize(query);
134
+ const N = this.docs.length;
135
+ if (N === 0 || queryTokens.length === 0)
136
+ return [];
137
+ const scores = new Map();
138
+ for (const term of queryTokens) {
139
+ const df = this.docFreqs.get(term) ?? 0;
140
+ if (df === 0)
141
+ continue;
142
+ // IDF with smoothing
143
+ const idf = Math.log((N - df + 0.5) / (df + 0.5) + 1);
144
+ const termDocs = this.termFreqs.get(term);
145
+ if (!termDocs)
146
+ continue;
147
+ for (const doc of this.docs) {
148
+ const tf = termDocs.get(doc.id) ?? 0;
149
+ if (tf === 0)
150
+ continue;
151
+ const normTf = (tf * (this.k1 + 1)) /
152
+ (tf + this.k1 * (1 - this.b + this.b * (doc.length / this.avgDocLength)));
153
+ scores.set(doc.id, (scores.get(doc.id) ?? 0) + idf * normTf);
154
+ }
155
+ }
156
+ return Array.from(scores.entries())
157
+ .map(([id, score]) => ({ id, score }))
158
+ .sort((a, b) => b.score - a.score)
159
+ .slice(0, topK);
160
+ }
161
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * CMS Indexer
3
+ *
4
+ * Handles automatic re-indexing of CMS documents when they change.
5
+ * Wire into CMS collection afterChange hooks — no CMS API calls from here,
6
+ * the event payload carries the document content directly.
7
+ *
8
+ * Usage (in apps/cms/src/lib/ai/indexer.ts):
9
+ * export const cmsIndexer = new CmsIndexer({ db, ingestionPipeline, enabledCollections: ['posts', 'pages'] })
10
+ *
11
+ * In each CMS collection afterChange hook:
12
+ * await cmsIndexer.onDocumentChanged({ collection: 'posts', id: doc.id, operation, doc })
13
+ */
14
+ import type { IngestionPipeline } from './pipeline.js';
15
+ export interface CmsDocumentEvent {
16
+ collection: string;
17
+ id: string;
18
+ operation: 'create' | 'update' | 'delete';
19
+ doc?: Record<string, unknown>;
20
+ workspaceId?: string;
21
+ }
22
+ export interface CmsIndexerConfig {
23
+ ingestionPipeline: IngestionPipeline;
24
+ enabledCollections: string[];
25
+ /** Default workspaceId when not provided per-event */
26
+ defaultWorkspaceId?: string;
27
+ }
28
+ export declare class CmsIndexer {
29
+ private pipeline;
30
+ private enabledCollections;
31
+ private defaultWorkspaceId;
32
+ constructor(config: CmsIndexerConfig);
33
+ /**
34
+ * Handle a CMS document change event.
35
+ * Skips collections not in enabledCollections.
36
+ */
37
+ onDocumentChanged(event: CmsDocumentEvent): Promise<void>;
38
+ }
39
+ //# sourceMappingURL=cms-indexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cms-indexer.d.ts","sourceRoot":"","sources":["../../src/ingestion/cms-indexer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEtD,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,kBAAkB,EAAE,MAAM,EAAE,CAAA;IAC5B,sDAAsD;IACtD,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAoBD,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,kBAAkB,CAAa;IACvC,OAAO,CAAC,kBAAkB,CAAQ;gBAEtB,MAAM,EAAE,gBAAgB;IAMpC;;;OAGG;IACG,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;CA8BhE"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * CMS Indexer
3
+ *
4
+ * Handles automatic re-indexing of CMS documents when they change.
5
+ * Wire into CMS collection afterChange hooks — no CMS API calls from here,
6
+ * the event payload carries the document content directly.
7
+ *
8
+ * Usage (in apps/cms/src/lib/ai/indexer.ts):
9
+ * export const cmsIndexer = new CmsIndexer({ db, ingestionPipeline, enabledCollections: ['posts', 'pages'] })
10
+ *
11
+ * In each CMS collection afterChange hook:
12
+ * await cmsIndexer.onDocumentChanged({ collection: 'posts', id: doc.id, operation, doc })
13
+ */
14
+ function extractText(doc) {
15
+ // Prefer explicit content/rawContent fields, then JSON fallback
16
+ if (typeof doc.content === 'string')
17
+ return doc.content;
18
+ if (typeof doc.rawContent === 'string')
19
+ return doc.rawContent;
20
+ if (typeof doc.description === 'string')
21
+ return doc.description;
22
+ if (typeof doc.body === 'string')
23
+ return doc.body;
24
+ // Strip internal metadata fields before JSON serialization
25
+ const { id: _id, createdAt: _c, updatedAt: _u, ...rest } = doc;
26
+ return JSON.stringify(rest, null, 2);
27
+ }
28
+ function extractTitle(doc) {
29
+ if (typeof doc.title === 'string')
30
+ return doc.title;
31
+ if (typeof doc.name === 'string')
32
+ return doc.name;
33
+ return undefined;
34
+ }
35
+ export class CmsIndexer {
36
+ pipeline;
37
+ enabledCollections;
38
+ defaultWorkspaceId;
39
+ constructor(config) {
40
+ this.pipeline = config.ingestionPipeline;
41
+ this.enabledCollections = new Set(config.enabledCollections);
42
+ this.defaultWorkspaceId = config.defaultWorkspaceId ?? 'default';
43
+ }
44
+ /**
45
+ * Handle a CMS document change event.
46
+ * Skips collections not in enabledCollections.
47
+ */
48
+ async onDocumentChanged(event) {
49
+ if (!this.enabledCollections.has(event.collection))
50
+ return;
51
+ const workspaceId = event.workspaceId ?? this.defaultWorkspaceId;
52
+ const sourceId = String(event.id);
53
+ const sourceCollection = event.collection;
54
+ if (event.operation === 'delete') {
55
+ await this.pipeline.deleteBySource(workspaceId, sourceCollection, sourceId);
56
+ return;
57
+ }
58
+ if (!event.doc)
59
+ return;
60
+ // For create/update: remove existing chunks, then re-ingest
61
+ await this.pipeline.deleteBySource(workspaceId, sourceCollection, sourceId);
62
+ const rawContent = extractText(event.doc);
63
+ const title = extractTitle(event.doc);
64
+ await this.pipeline.ingest({
65
+ workspaceId,
66
+ sourceType: 'cms_collection',
67
+ sourceCollection,
68
+ sourceId,
69
+ title,
70
+ mimeType: 'text/plain',
71
+ rawContent,
72
+ });
73
+ }
74
+ }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * File Parsers
3
+ *
4
+ * Zero external dependencies — pure Node.js + regex/string manipulation.
5
+ * PDF extraction uses a hand-rolled parser that reads text streams directly
6
+ * from the binary PDF format (BT/ET blocks, Tj/TJ operators).
7
+ */
8
+ export interface ParseResult {
9
+ text: string;
10
+ metadata?: Record<string, unknown>;
11
+ }
12
+ export declare class PlainTextParser {
13
+ parse(input: string): ParseResult;
14
+ }
15
+ export declare class MarkdownParser {
16
+ parse(input: string): ParseResult;
17
+ }
18
+ export declare class HtmlParser {
19
+ parse(input: string): ParseResult;
20
+ }
21
+ /**
22
+ * Hand-rolled PDF text extractor.
23
+ *
24
+ * Reads text content directly from the binary PDF format without any
25
+ * external dependencies. Works for text-based PDFs (the vast majority).
26
+ * Encrypted or image-only PDFs return an empty string.
27
+ *
28
+ * Supports:
29
+ * - BT/ET text blocks with Tj, TJ, ' and " operators
30
+ * - Literal string decoding (escape sequences + octal)
31
+ * - Page count from /Count dictionary entry
32
+ * - Document title from /Title dictionary entry
33
+ *
34
+ */
35
+ export declare class PdfParser {
36
+ /** Parse a PDF string (for API compatibility; use parseBuffer for binary data). */
37
+ parse(input: string): ParseResult;
38
+ /** Parse a PDF from a Buffer. */
39
+ parseBuffer(input: Buffer): ParseResult & {
40
+ metadata: {
41
+ pageCount: number;
42
+ title?: string;
43
+ };
44
+ };
45
+ }
46
+ export declare class JsonParser {
47
+ parse(input: string): ParseResult;
48
+ }
49
+ export type Parser = PlainTextParser | MarkdownParser | HtmlParser | JsonParser | PdfParser;
50
+ export declare function createParser(mimeType: string): Parser;
51
+ //# sourceMappingURL=file-parsers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-parsers.d.ts","sourceRoot":"","sources":["../../src/ingestion/file-parsers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC;AAMD,qBAAa,eAAe;IAC1B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW;CAGlC;AAgBD,qBAAa,cAAc;IACzB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW;CA6BlC;AAyBD,qBAAa,UAAU;IACrB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW;CAclC;AAmED;;;;;;;;;;;;;GAaG;AACH,qBAAa,SAAS;IACpB,mFAAmF;IACnF,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW;IAIjC,iCAAiC;IACjC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG;QAAE,QAAQ,EAAE;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE;CAqC9F;AAMD,qBAAa,UAAU;IACrB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW;CASlC;AAMD,MAAM,MAAM,MAAM,GAAG,eAAe,GAAG,cAAc,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAA;AAE3F,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgBrD"}