@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,202 @@
1
+ /**
2
+ * DuckDuckGo Web Search Tool
3
+ *
4
+ * Uses the DuckDuckGo Instant Answer API (no API key required).
5
+ * Returns structured results suitable for agent consumption.
6
+ *
7
+ * Part of the WebSearch skill family — see types.ts for the
8
+ * WebSearchProvider interface used by future Tavily/Exa backends (P4-3).
9
+ */
10
+ import { z } from 'zod/v4';
11
+ const DDG_API_URL = 'https://api.duckduckgo.com/';
12
+ /** Approximate token count for a string (4 chars ≈ 1 token). */
13
+ function estimateTokens(text) {
14
+ return Math.ceil(text.length / 4);
15
+ }
16
+ // =============================================================================
17
+ // Provider
18
+ // =============================================================================
19
+ /**
20
+ * DuckDuckGo search provider — zero-config, no API key required.
21
+ *
22
+ * Uses the DuckDuckGo Instant Answer API to retrieve the abstract summary
23
+ * and related topics for a query.
24
+ */
25
+ export class DuckDuckGoProvider {
26
+ name = 'duckduckgo';
27
+ async search(query, maxResults) {
28
+ const url = new URL(DDG_API_URL);
29
+ url.searchParams.set('q', query);
30
+ url.searchParams.set('format', 'json');
31
+ url.searchParams.set('no_html', '1');
32
+ url.searchParams.set('skip_disambig', '1');
33
+ const controller = new AbortController();
34
+ const timeoutId = setTimeout(() => controller.abort(), 10_000);
35
+ let response;
36
+ try {
37
+ response = await fetch(url.toString(), { signal: controller.signal });
38
+ }
39
+ finally {
40
+ clearTimeout(timeoutId);
41
+ }
42
+ if (!response.ok) {
43
+ throw new Error(`DuckDuckGo API request failed: ${response.status} ${response.statusText}`);
44
+ }
45
+ const data = (await response.json());
46
+ const results = [];
47
+ // Add abstract if present
48
+ if (data.AbstractText && data.AbstractURL) {
49
+ results.push({
50
+ title: data.AbstractSource || query,
51
+ link: data.AbstractURL,
52
+ snippet: data.AbstractText,
53
+ });
54
+ }
55
+ // Add related topics (skip category group entries that have nested Topics)
56
+ for (const topic of data.RelatedTopics ?? []) {
57
+ if (results.length >= maxResults)
58
+ break;
59
+ if (topic.Topics)
60
+ continue; // category group — skip
61
+ const text = topic.Text;
62
+ const firstURL = topic.FirstURL;
63
+ if (!(firstURL && text))
64
+ continue;
65
+ const parts = text.split(' - ');
66
+ results.push({
67
+ title: parts[0]?.trim() ?? text,
68
+ link: firstURL,
69
+ snippet: text,
70
+ });
71
+ }
72
+ const tokenCount = results.reduce((acc, r) => acc + estimateTokens(r.title + r.link + r.snippet), 0);
73
+ return { results, query, tokenCount };
74
+ }
75
+ }
76
+ // =============================================================================
77
+ // Tool
78
+ // =============================================================================
79
+ const WebSearchParamsSchema = z.object({
80
+ query: z.string().min(1).describe('The search query'),
81
+ maxResults: z
82
+ .number()
83
+ .int()
84
+ .min(1)
85
+ .max(20)
86
+ .default(5)
87
+ .describe('Maximum number of results to return (1–20, default 5)'),
88
+ });
89
+ /**
90
+ * Factory that creates a `web_search` tool backed by any WebSearchProvider.
91
+ *
92
+ * The singleton `webSearchTool` uses DuckDuckGo. Pass a TavilyProvider or
93
+ * ExaProvider here to get the same tool with a premium BYOK backend.
94
+ *
95
+ * @example
96
+ * ```typescript
97
+ * import { createWebSearchTool, TavilyProvider } from '@revealui/ai'
98
+ *
99
+ * const tool = createWebSearchTool(new TavilyProvider(apiKey))
100
+ * agent.tools.push(tool)
101
+ * ```
102
+ */
103
+ export function createWebSearchTool(provider) {
104
+ return {
105
+ name: 'web_search',
106
+ description: `Search the web using ${provider.name}. Returns titles, URLs, and snippets for the given query.`,
107
+ parameters: WebSearchParamsSchema,
108
+ async execute(params) {
109
+ const { query, maxResults } = WebSearchParamsSchema.parse(params);
110
+ try {
111
+ const response = await provider.search(query, maxResults);
112
+ if (response.results.length === 0) {
113
+ return {
114
+ success: true,
115
+ data: {
116
+ results: [],
117
+ query,
118
+ tokenCount: 0,
119
+ message: 'No results found for this query.',
120
+ },
121
+ metadata: { tokensUsed: 0 },
122
+ };
123
+ }
124
+ return {
125
+ success: true,
126
+ data: response,
127
+ metadata: { tokensUsed: response.tokenCount },
128
+ };
129
+ }
130
+ catch (error) {
131
+ return {
132
+ success: false,
133
+ error: `Web search failed: ${error instanceof Error ? error.message : String(error)}`,
134
+ };
135
+ }
136
+ },
137
+ getMetadata() {
138
+ return {
139
+ category: 'web',
140
+ version: '1.0.0',
141
+ author: 'RevealUI',
142
+ };
143
+ },
144
+ };
145
+ }
146
+ /**
147
+ * Web search tool backed by DuckDuckGo (zero-config).
148
+ *
149
+ * Register this on any agent that needs live web access. Requires no
150
+ * API key — backed by the DuckDuckGo Instant Answer API.
151
+ *
152
+ * @example
153
+ * ```typescript
154
+ * import { webSearchTool } from '@revealui/ai'
155
+ *
156
+ * agent.tools.push(webSearchTool)
157
+ * // Agent can now call web_search({ query: '...', maxResults: 5 })
158
+ * ```
159
+ */
160
+ export const webSearchTool = {
161
+ name: 'web_search',
162
+ description: 'Search the web using DuckDuckGo. Returns titles, URLs, and snippets for the given query. ' +
163
+ 'No API key required.',
164
+ parameters: WebSearchParamsSchema,
165
+ async execute(params) {
166
+ const { query, maxResults } = WebSearchParamsSchema.parse(params);
167
+ const provider = new DuckDuckGoProvider();
168
+ try {
169
+ const response = await provider.search(query, maxResults);
170
+ if (response.results.length === 0) {
171
+ return {
172
+ success: true,
173
+ data: {
174
+ results: [],
175
+ query,
176
+ tokenCount: 0,
177
+ message: 'No results found for this query.',
178
+ },
179
+ metadata: { tokensUsed: 0 },
180
+ };
181
+ }
182
+ return {
183
+ success: true,
184
+ data: response,
185
+ metadata: { tokensUsed: response.tokenCount },
186
+ };
187
+ }
188
+ catch (error) {
189
+ return {
190
+ success: false,
191
+ error: `Web search failed: ${error instanceof Error ? error.message : String(error)}`,
192
+ };
193
+ }
194
+ },
195
+ getMetadata() {
196
+ return {
197
+ category: 'web',
198
+ version: '1.0.0',
199
+ author: 'RevealUI',
200
+ };
201
+ },
202
+ };
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Exa Web Search Provider (P4-3)
3
+ *
4
+ * Neural search backend using the Exa Search API.
5
+ * Exa uses embeddings to find semantically relevant results, making it
6
+ * especially good for research and complex queries. Requires an Exa API key.
7
+ *
8
+ * @see https://docs.exa.ai/reference/search
9
+ */
10
+ import type { WebSearchProvider, WebSearchResponse } from './types.js';
11
+ /**
12
+ * Exa neural search provider — BYOK, requires `EXA_API_KEY`.
13
+ *
14
+ * Exa uses embeddings to find semantically relevant results rather than
15
+ * keyword matching. Best for research-oriented queries.
16
+ *
17
+ * Register via `AgentConfig.webSearchProvider` to replace the default
18
+ * DuckDuckGo backend.
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * import { ExaProvider, createWebSearchTool } from '@revealui/ai'
23
+ *
24
+ * const tool = createWebSearchTool(new ExaProvider(process.env.EXA_API_KEY!))
25
+ * agent.config = { webSearchProvider: new ExaProvider(key) }
26
+ * ```
27
+ */
28
+ export declare class ExaProvider implements WebSearchProvider {
29
+ readonly name = "exa";
30
+ private readonly apiKey;
31
+ constructor(apiKey: string);
32
+ search(query: string, maxResults: number): Promise<WebSearchResponse>;
33
+ }
34
+ //# sourceMappingURL=exa.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exa.d.ts","sourceRoot":"","sources":["../../../src/tools/web/exa.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAmB,MAAM,YAAY,CAAA;AAsBvF;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,WAAY,YAAW,iBAAiB;IACnD,QAAQ,CAAC,IAAI,SAAQ;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;gBAEnB,MAAM,EAAE,MAAM;IAKpB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA+C5E"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Exa Web Search Provider (P4-3)
3
+ *
4
+ * Neural search backend using the Exa Search API.
5
+ * Exa uses embeddings to find semantically relevant results, making it
6
+ * especially good for research and complex queries. Requires an Exa API key.
7
+ *
8
+ * @see https://docs.exa.ai/reference/search
9
+ */
10
+ const EXA_API_URL = 'https://api.exa.ai/search';
11
+ /** Approximate token count for a string (4 chars ≈ 1 token). */
12
+ function estimateTokens(text) {
13
+ return Math.ceil(text.length / 4);
14
+ }
15
+ /**
16
+ * Exa neural search provider — BYOK, requires `EXA_API_KEY`.
17
+ *
18
+ * Exa uses embeddings to find semantically relevant results rather than
19
+ * keyword matching. Best for research-oriented queries.
20
+ *
21
+ * Register via `AgentConfig.webSearchProvider` to replace the default
22
+ * DuckDuckGo backend.
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * import { ExaProvider, createWebSearchTool } from '@revealui/ai'
27
+ *
28
+ * const tool = createWebSearchTool(new ExaProvider(process.env.EXA_API_KEY!))
29
+ * agent.config = { webSearchProvider: new ExaProvider(key) }
30
+ * ```
31
+ */
32
+ export class ExaProvider {
33
+ name = 'exa';
34
+ apiKey;
35
+ constructor(apiKey) {
36
+ if (!apiKey)
37
+ throw new Error('ExaProvider: apiKey is required');
38
+ this.apiKey = apiKey;
39
+ }
40
+ async search(query, maxResults) {
41
+ const controller = new AbortController();
42
+ const timeoutId = setTimeout(() => controller.abort(), 10_000);
43
+ let response;
44
+ try {
45
+ response = await fetch(EXA_API_URL, {
46
+ method: 'POST',
47
+ headers: {
48
+ 'Content-Type': 'application/json',
49
+ 'x-api-key': this.apiKey,
50
+ },
51
+ body: JSON.stringify({
52
+ query,
53
+ num_results: maxResults,
54
+ type: 'auto',
55
+ contents: {
56
+ text: { max_characters: 1000 },
57
+ },
58
+ }),
59
+ signal: controller.signal,
60
+ });
61
+ }
62
+ finally {
63
+ clearTimeout(timeoutId);
64
+ }
65
+ if (!response.ok) {
66
+ throw new Error(`Exa API request failed: ${response.status} ${response.statusText}`);
67
+ }
68
+ const data = (await response.json());
69
+ const results = data.results.slice(0, maxResults).map((r) => {
70
+ const snippet = r.highlights?.join(' ') ?? r.text ?? '';
71
+ return {
72
+ title: r.title,
73
+ link: r.url,
74
+ snippet,
75
+ };
76
+ });
77
+ const tokenCount = results.reduce((acc, r) => acc + estimateTokens(r.title + r.link + r.snippet), 0);
78
+ return { results, query, tokenCount };
79
+ }
80
+ }
@@ -0,0 +1,6 @@
1
+ export { createWebSearchTool, DuckDuckGoProvider, webSearchTool } from './duck-duck-go.js';
2
+ export { ExaProvider } from './exa.js';
3
+ export { webScraperTool } from './scraper.js';
4
+ export { TavilyProvider } from './tavily.js';
5
+ export type { WebSearchProvider, WebSearchResponse, WebSearchResult } from './types.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/web/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAC1F,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,4 @@
1
+ export { createWebSearchTool, DuckDuckGoProvider, webSearchTool } from './duck-duck-go.js';
2
+ export { ExaProvider } from './exa.js';
3
+ export { webScraperTool } from './scraper.js';
4
+ export { TavilyProvider } from './tavily.js';
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Web Scraper Tool
3
+ *
4
+ * Fetches a URL, extracts text via HtmlParser (no external deps),
5
+ * and truncates to maxLength tokens with a helpful message.
6
+ */
7
+ import type { Tool } from '../base.js';
8
+ export declare const webScraperTool: Tool;
9
+ //# sourceMappingURL=scraper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scraper.d.ts","sourceRoot":"","sources":["../../../src/tools/web/scraper.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,YAAY,CAAA;AA+ClD,eAAO,MAAM,cAAc,EAAE,IAwE5B,CAAA"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Web Scraper Tool
3
+ *
4
+ * Fetches a URL, extracts text via HtmlParser (no external deps),
5
+ * and truncates to maxLength tokens with a helpful message.
6
+ */
7
+ import { z } from 'zod/v4';
8
+ import { HtmlParser } from '../../ingestion/file-parsers.js';
9
+ const ScraperParams = z.object({
10
+ url: z.url(),
11
+ maxLength: z.number().int().positive().default(4000),
12
+ });
13
+ const htmlParser = new HtmlParser();
14
+ /**
15
+ * Returns true if the URL targets a private, loopback, or reserved address
16
+ * that agents must not be allowed to fetch (SSRF protection).
17
+ */
18
+ function isPrivateOrLoopbackUrl(urlString) {
19
+ let url;
20
+ try {
21
+ url = new URL(urlString);
22
+ }
23
+ catch {
24
+ return true;
25
+ }
26
+ if (url.protocol !== 'http:' && url.protocol !== 'https:') {
27
+ return true;
28
+ }
29
+ const host = url.hostname.toLowerCase();
30
+ if (host === 'localhost' || host === '0.0.0.0')
31
+ return true;
32
+ if (host === '[::1]' || host === '::1')
33
+ return true;
34
+ const ipv4 = host.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);
35
+ if (ipv4) {
36
+ const [, aStr, bStr] = ipv4;
37
+ const a = Number(aStr);
38
+ const b = Number(bStr);
39
+ if (a === 10)
40
+ return true; // Class A private (RFC 1918)
41
+ if (a === 127)
42
+ return true; // Loopback
43
+ if (a === 172 && b >= 16 && b <= 31)
44
+ return true; // Class B private
45
+ if (a === 192 && b === 168)
46
+ return true; // Class C private
47
+ if (a === 169 && b === 254)
48
+ return true; // Link-local / AWS IMDS
49
+ if (a === 100 && b >= 64 && b <= 127)
50
+ return true; // CGNAT (RFC 6598)
51
+ if (a === 0)
52
+ return true; // 0.x.x.x
53
+ }
54
+ return false;
55
+ }
56
+ export const webScraperTool = {
57
+ name: 'web_scrape',
58
+ description: 'Fetch a URL and extract its text content. Use this to read web pages, documentation, or articles. For long documents, use document_summarize instead.',
59
+ parameters: ScraperParams,
60
+ async execute(params) {
61
+ const start = Date.now();
62
+ const parsed = ScraperParams.safeParse(params);
63
+ if (!parsed.success) {
64
+ return { success: false, error: `Invalid parameters: ${parsed.error.message}` };
65
+ }
66
+ const { url, maxLength } = parsed.data;
67
+ const maxChars = maxLength * 4;
68
+ if (isPrivateOrLoopbackUrl(url)) {
69
+ return { success: false, error: 'URL targets a private or reserved address' };
70
+ }
71
+ try {
72
+ const controller = new AbortController();
73
+ const timer = setTimeout(() => controller.abort(), 10_000);
74
+ let html;
75
+ try {
76
+ const response = await fetch(url, {
77
+ signal: controller.signal,
78
+ headers: { 'User-Agent': 'RevealUI-Agent/1.0' },
79
+ });
80
+ clearTimeout(timer);
81
+ if (!response.ok) {
82
+ return {
83
+ success: false,
84
+ error: `HTTP ${response.status}: ${response.statusText}`,
85
+ };
86
+ }
87
+ html = await response.text();
88
+ }
89
+ finally {
90
+ clearTimeout(timer);
91
+ }
92
+ const { text } = htmlParser.parse(html);
93
+ const wordCount = text.split(/\s+/).filter((w) => w.length > 0).length;
94
+ let content = text;
95
+ let truncated = false;
96
+ if (content.length > maxChars) {
97
+ content =
98
+ content.slice(0, maxChars) +
99
+ ' [content truncated — use document_summarize for full content]';
100
+ truncated = true;
101
+ }
102
+ return {
103
+ success: true,
104
+ data: { url, content, wordCount, truncated },
105
+ metadata: { executionTime: Date.now() - start },
106
+ };
107
+ }
108
+ catch (error) {
109
+ if (error instanceof Error && error.name === 'AbortError') {
110
+ return { success: false, error: 'Request timed out after 10 seconds' };
111
+ }
112
+ return {
113
+ success: false,
114
+ error: error instanceof Error ? error.message : String(error),
115
+ };
116
+ }
117
+ },
118
+ };
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Tavily Web Search Provider (P4-3)
3
+ *
4
+ * High-quality BYOK search backend using the Tavily Search API.
5
+ * Tavily is optimised for LLM consumption — returns clean, summarised
6
+ * content rather than raw HTML. Requires a Tavily API key.
7
+ *
8
+ * @see https://docs.tavily.com/docs/tavily-api/rest_api
9
+ */
10
+ import type { WebSearchProvider, WebSearchResponse } from './types.js';
11
+ /**
12
+ * Tavily search provider — BYOK, requires `TAVILY_API_KEY`.
13
+ *
14
+ * Tavily returns high-quality, LLM-optimised results with relevance scoring.
15
+ * Register via `AgentConfig.webSearchProvider` to replace the default
16
+ * DuckDuckGo backend.
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * import { TavilyProvider, createWebSearchTool } from '@revealui/ai'
21
+ *
22
+ * const tool = createWebSearchTool(new TavilyProvider(process.env.TAVILY_API_KEY!))
23
+ * agent.config = { webSearchProvider: new TavilyProvider(key) }
24
+ * ```
25
+ */
26
+ export declare class TavilyProvider implements WebSearchProvider {
27
+ readonly name = "tavily";
28
+ private readonly apiKey;
29
+ constructor(apiKey: string);
30
+ search(query: string, maxResults: number): Promise<WebSearchResponse>;
31
+ }
32
+ //# sourceMappingURL=tavily.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tavily.d.ts","sourceRoot":"","sources":["../../../src/tools/web/tavily.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAmB,MAAM,YAAY,CAAA;AAsBvF;;;;;;;;;;;;;;GAcG;AACH,qBAAa,cAAe,YAAW,iBAAiB;IACtD,QAAQ,CAAC,IAAI,YAAW;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;gBAEnB,MAAM,EAAE,MAAM;IAKpB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA0C5E"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Tavily Web Search Provider (P4-3)
3
+ *
4
+ * High-quality BYOK search backend using the Tavily Search API.
5
+ * Tavily is optimised for LLM consumption — returns clean, summarised
6
+ * content rather than raw HTML. Requires a Tavily API key.
7
+ *
8
+ * @see https://docs.tavily.com/docs/tavily-api/rest_api
9
+ */
10
+ const TAVILY_API_URL = 'https://api.tavily.com/search';
11
+ /** Approximate token count for a string (4 chars ≈ 1 token). */
12
+ function estimateTokens(text) {
13
+ return Math.ceil(text.length / 4);
14
+ }
15
+ /**
16
+ * Tavily search provider — BYOK, requires `TAVILY_API_KEY`.
17
+ *
18
+ * Tavily returns high-quality, LLM-optimised results with relevance scoring.
19
+ * Register via `AgentConfig.webSearchProvider` to replace the default
20
+ * DuckDuckGo backend.
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * import { TavilyProvider, createWebSearchTool } from '@revealui/ai'
25
+ *
26
+ * const tool = createWebSearchTool(new TavilyProvider(process.env.TAVILY_API_KEY!))
27
+ * agent.config = { webSearchProvider: new TavilyProvider(key) }
28
+ * ```
29
+ */
30
+ export class TavilyProvider {
31
+ name = 'tavily';
32
+ apiKey;
33
+ constructor(apiKey) {
34
+ if (!apiKey)
35
+ throw new Error('TavilyProvider: apiKey is required');
36
+ this.apiKey = apiKey;
37
+ }
38
+ async search(query, maxResults) {
39
+ const controller = new AbortController();
40
+ const timeoutId = setTimeout(() => controller.abort(), 10_000);
41
+ let response;
42
+ try {
43
+ response = await fetch(TAVILY_API_URL, {
44
+ method: 'POST',
45
+ headers: {
46
+ 'Content-Type': 'application/json',
47
+ Authorization: `Bearer ${this.apiKey}`,
48
+ },
49
+ body: JSON.stringify({
50
+ query,
51
+ max_results: maxResults,
52
+ search_depth: 'basic',
53
+ include_answer: false,
54
+ }),
55
+ signal: controller.signal,
56
+ });
57
+ }
58
+ finally {
59
+ clearTimeout(timeoutId);
60
+ }
61
+ if (!response.ok) {
62
+ throw new Error(`Tavily API request failed: ${response.status} ${response.statusText}`);
63
+ }
64
+ const data = (await response.json());
65
+ const results = data.results.slice(0, maxResults).map((r) => ({
66
+ title: r.title,
67
+ link: r.url,
68
+ snippet: r.content,
69
+ }));
70
+ const tokenCount = results.reduce((acc, r) => acc + estimateTokens(r.title + r.link + r.snippet), 0);
71
+ return { results, query, tokenCount };
72
+ }
73
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Web Search Types
3
+ *
4
+ * Shared types for web search tools and provider interface.
5
+ * The WebSearchProvider interface enables swappable backends:
6
+ * - DuckDuckGo (default, zero-config) — P3-1
7
+ * - Tavily, Exa (BYOK) — P4-3
8
+ */
9
+ export interface WebSearchResult {
10
+ title: string;
11
+ link: string;
12
+ snippet: string;
13
+ }
14
+ export interface WebSearchResponse {
15
+ results: WebSearchResult[];
16
+ query: string;
17
+ /** Approximate token count of the response content (chars / 4) */
18
+ tokenCount: number;
19
+ }
20
+ /**
21
+ * Interface for pluggable web search backends.
22
+ *
23
+ * DuckDuckGo is the default zero-config implementation.
24
+ * Drop in Tavily or Exa by implementing this interface and registering
25
+ * it via AgentConfig.webSearchProvider (Phase 4, P4-3).
26
+ */
27
+ export interface WebSearchProvider {
28
+ readonly name: string;
29
+ search(query: string, maxResults: number): Promise<WebSearchResponse>;
30
+ }
31
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/tools/web/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,eAAe,EAAE,CAAA;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;CACtE"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Web Search Types
3
+ *
4
+ * Shared types for web search tools and provider interface.
5
+ * The WebSearchProvider interface enables swappable backends:
6
+ * - DuckDuckGo (default, zero-config) — P3-1
7
+ * - Tavily, Exa (BYOK) — P4-3
8
+ */
9
+ export {};