ctxpkg 0.0.3 → 0.0.5

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 (242) hide show
  1. package/bin/cli.js +1 -1
  2. package/bin/daemon.js +1 -1
  3. package/dist/agent/agent.d.ts +65 -0
  4. package/dist/agent/agent.d.ts.map +1 -0
  5. package/dist/agent/agent.js +291 -0
  6. package/dist/agent/agent.js.map +1 -0
  7. package/dist/agent/agent.prompts.d.ts +13 -0
  8. package/dist/agent/agent.prompts.d.ts.map +1 -0
  9. package/{src/agent/agent.prompts.ts → dist/agent/agent.prompts.js} +11 -12
  10. package/dist/agent/agent.prompts.js.map +1 -0
  11. package/dist/agent/agent.test-runner.d.ts +73 -0
  12. package/dist/agent/agent.test-runner.d.ts.map +1 -0
  13. package/dist/agent/agent.test-runner.js +316 -0
  14. package/dist/agent/agent.test-runner.js.map +1 -0
  15. package/dist/agent/agent.test-runner.schemas.d.ts +382 -0
  16. package/dist/agent/agent.test-runner.schemas.d.ts.map +1 -0
  17. package/dist/agent/agent.test-runner.schemas.js +110 -0
  18. package/dist/agent/agent.test-runner.schemas.js.map +1 -0
  19. package/dist/agent/agent.types.d.ts +122 -0
  20. package/dist/agent/agent.types.d.ts.map +1 -0
  21. package/dist/agent/agent.types.js +19 -0
  22. package/dist/agent/agent.types.js.map +1 -0
  23. package/dist/backend/backend.d.ts +16 -0
  24. package/dist/backend/backend.d.ts.map +1 -0
  25. package/dist/backend/backend.js +79 -0
  26. package/dist/backend/backend.js.map +1 -0
  27. package/dist/backend/backend.protocol.d.ts +74 -0
  28. package/dist/backend/backend.protocol.d.ts.map +1 -0
  29. package/dist/backend/backend.protocol.js +46 -0
  30. package/dist/backend/backend.protocol.js.map +1 -0
  31. package/dist/backend/backend.schemas.d.ts +141 -0
  32. package/dist/backend/backend.schemas.d.ts.map +1 -0
  33. package/dist/backend/backend.schemas.js +59 -0
  34. package/dist/backend/backend.schemas.js.map +1 -0
  35. package/dist/backend/backend.services.d.ts +290 -0
  36. package/dist/backend/backend.services.d.ts.map +1 -0
  37. package/dist/backend/backend.services.js +103 -0
  38. package/dist/backend/backend.services.js.map +1 -0
  39. package/dist/backend/backend.types.d.ts +25 -0
  40. package/dist/backend/backend.types.d.ts.map +1 -0
  41. package/dist/backend/backend.types.js +6 -0
  42. package/dist/backend/backend.types.js.map +1 -0
  43. package/dist/cli/cli.agent.d.ts +4 -0
  44. package/dist/cli/cli.agent.d.ts.map +1 -0
  45. package/dist/cli/cli.agent.js +158 -0
  46. package/dist/cli/cli.agent.js.map +1 -0
  47. package/dist/cli/cli.chat.d.ts +4 -0
  48. package/dist/cli/cli.chat.d.ts.map +1 -0
  49. package/dist/cli/cli.chat.js +311 -0
  50. package/dist/cli/cli.chat.js.map +1 -0
  51. package/dist/cli/cli.client.d.ts +11 -0
  52. package/dist/cli/cli.client.d.ts.map +1 -0
  53. package/dist/cli/cli.client.js +40 -0
  54. package/dist/cli/cli.client.js.map +1 -0
  55. package/dist/cli/cli.collections.d.ts +4 -0
  56. package/dist/cli/cli.collections.d.ts.map +1 -0
  57. package/dist/cli/cli.collections.js +411 -0
  58. package/dist/cli/cli.collections.js.map +1 -0
  59. package/dist/cli/cli.config.d.ts +4 -0
  60. package/dist/cli/cli.config.d.ts.map +1 -0
  61. package/dist/cli/cli.config.js +192 -0
  62. package/dist/cli/cli.config.js.map +1 -0
  63. package/dist/cli/cli.d.ts +4 -0
  64. package/dist/cli/cli.d.ts.map +1 -0
  65. package/dist/cli/cli.daemon.d.ts +4 -0
  66. package/dist/cli/cli.daemon.d.ts.map +1 -0
  67. package/dist/cli/cli.daemon.js +116 -0
  68. package/dist/cli/cli.daemon.js.map +1 -0
  69. package/dist/cli/cli.documents.d.ts +4 -0
  70. package/dist/cli/cli.documents.d.ts.map +1 -0
  71. package/dist/cli/cli.documents.js +332 -0
  72. package/dist/cli/cli.documents.js.map +1 -0
  73. package/dist/cli/cli.js +23 -0
  74. package/dist/cli/cli.js.map +1 -0
  75. package/dist/cli/cli.mcp.d.ts +4 -0
  76. package/dist/cli/cli.mcp.d.ts.map +1 -0
  77. package/dist/cli/cli.mcp.js +146 -0
  78. package/dist/cli/cli.mcp.js.map +1 -0
  79. package/dist/cli/cli.utils.d.ts +51 -0
  80. package/dist/cli/cli.utils.d.ts.map +1 -0
  81. package/dist/cli/cli.utils.js +95 -0
  82. package/dist/cli/cli.utils.js.map +1 -0
  83. package/dist/client/client.adapters.d.ts +38 -0
  84. package/dist/client/client.adapters.d.ts.map +1 -0
  85. package/dist/client/client.adapters.js +233 -0
  86. package/dist/client/client.adapters.js.map +1 -0
  87. package/dist/client/client.d.ts +16 -0
  88. package/dist/client/client.d.ts.map +1 -0
  89. package/dist/client/client.js +74 -0
  90. package/dist/client/client.js.map +1 -0
  91. package/dist/client/client.types.d.ts +10 -0
  92. package/dist/client/client.types.d.ts.map +1 -0
  93. package/dist/client/client.types.js +2 -0
  94. package/dist/client/client.types.js.map +1 -0
  95. package/dist/collections/collections.d.ts +219 -0
  96. package/dist/collections/collections.d.ts.map +1 -0
  97. package/dist/collections/collections.js +933 -0
  98. package/dist/collections/collections.js.map +1 -0
  99. package/dist/collections/collections.schemas.d.ts +298 -0
  100. package/dist/collections/collections.schemas.d.ts.map +1 -0
  101. package/dist/collections/collections.schemas.js +117 -0
  102. package/dist/collections/collections.schemas.js.map +1 -0
  103. package/dist/config/config.d.ts +29 -0
  104. package/dist/config/config.d.ts.map +1 -0
  105. package/dist/config/config.js +112 -0
  106. package/dist/config/config.js.map +1 -0
  107. package/dist/daemon/daemon.config.d.ts +6 -0
  108. package/dist/daemon/daemon.config.d.ts.map +1 -0
  109. package/dist/daemon/daemon.config.js +19 -0
  110. package/dist/daemon/daemon.config.js.map +1 -0
  111. package/dist/daemon/daemon.d.ts +10 -0
  112. package/dist/daemon/daemon.d.ts.map +1 -0
  113. package/dist/daemon/daemon.js +173 -0
  114. package/dist/daemon/daemon.js.map +1 -0
  115. package/dist/daemon/daemon.manager.d.ts +20 -0
  116. package/dist/daemon/daemon.manager.d.ts.map +1 -0
  117. package/dist/daemon/daemon.manager.js +176 -0
  118. package/dist/daemon/daemon.manager.js.map +1 -0
  119. package/dist/daemon/daemon.schemas.d.ts +38 -0
  120. package/dist/daemon/daemon.schemas.d.ts.map +1 -0
  121. package/dist/daemon/daemon.schemas.js +15 -0
  122. package/dist/daemon/daemon.schemas.js.map +1 -0
  123. package/dist/database/database.d.ts +10 -0
  124. package/dist/database/database.d.ts.map +1 -0
  125. package/dist/database/database.js +52 -0
  126. package/dist/database/database.js.map +1 -0
  127. package/dist/database/migrations/migrations.001-init.d.ts +9 -0
  128. package/dist/database/migrations/migrations.001-init.d.ts.map +1 -0
  129. package/dist/database/migrations/migrations.001-init.js +46 -0
  130. package/dist/database/migrations/migrations.001-init.js.map +1 -0
  131. package/dist/database/migrations/migrations.002-fts5.d.ts +11 -0
  132. package/dist/database/migrations/migrations.002-fts5.d.ts.map +1 -0
  133. package/dist/database/migrations/migrations.002-fts5.js +29 -0
  134. package/dist/database/migrations/migrations.002-fts5.js.map +1 -0
  135. package/dist/database/migrations/migrations.d.ts +11 -0
  136. package/dist/database/migrations/migrations.d.ts.map +1 -0
  137. package/dist/database/migrations/migrations.js +14 -0
  138. package/dist/database/migrations/migrations.js.map +1 -0
  139. package/dist/database/migrations/migrations.types.d.ts +8 -0
  140. package/dist/database/migrations/migrations.types.d.ts.map +1 -0
  141. package/dist/database/migrations/migrations.types.js +2 -0
  142. package/dist/database/migrations/migrations.types.js.map +1 -0
  143. package/dist/documents/documents.d.ts +58 -0
  144. package/dist/documents/documents.d.ts.map +1 -0
  145. package/dist/documents/documents.js +597 -0
  146. package/dist/documents/documents.js.map +1 -0
  147. package/dist/documents/documents.schemas.d.ts +418 -0
  148. package/dist/documents/documents.schemas.d.ts.map +1 -0
  149. package/dist/documents/documents.schemas.js +111 -0
  150. package/dist/documents/documents.schemas.js.map +1 -0
  151. package/dist/embedder/embedder.d.ts +22 -0
  152. package/dist/embedder/embedder.d.ts.map +1 -0
  153. package/dist/embedder/embedder.js +46 -0
  154. package/dist/embedder/embedder.js.map +1 -0
  155. package/dist/exports.d.ts +2 -0
  156. package/dist/exports.d.ts.map +1 -0
  157. package/dist/exports.js +2 -0
  158. package/dist/exports.js.map +1 -0
  159. package/dist/mcp/mcp.d.ts +44 -0
  160. package/dist/mcp/mcp.d.ts.map +1 -0
  161. package/dist/mcp/mcp.js +62 -0
  162. package/dist/mcp/mcp.js.map +1 -0
  163. package/dist/tools/agent/agent.d.ts +14 -0
  164. package/dist/tools/agent/agent.d.ts.map +1 -0
  165. package/dist/tools/agent/agent.js +31 -0
  166. package/dist/tools/agent/agent.js.map +1 -0
  167. package/dist/tools/documents/documents.d.ts +28 -0
  168. package/dist/tools/documents/documents.d.ts.map +1 -0
  169. package/dist/tools/documents/documents.js +336 -0
  170. package/dist/tools/documents/documents.js.map +1 -0
  171. package/dist/tools/tools.langchain.d.ts +11 -0
  172. package/dist/tools/tools.langchain.d.ts.map +1 -0
  173. package/dist/tools/tools.langchain.js +30 -0
  174. package/dist/tools/tools.langchain.js.map +1 -0
  175. package/dist/tools/tools.mcp.d.ts +12 -0
  176. package/dist/tools/tools.mcp.d.ts.map +1 -0
  177. package/dist/tools/tools.mcp.js +38 -0
  178. package/dist/tools/tools.mcp.js.map +1 -0
  179. package/{src/tools/tools.types.ts → dist/tools/tools.types.d.ts} +10 -16
  180. package/dist/tools/tools.types.d.ts.map +1 -0
  181. package/dist/tools/tools.types.js +7 -0
  182. package/dist/tools/tools.types.js.map +1 -0
  183. package/dist/tsconfig.tsbuildinfo +1 -0
  184. package/dist/utils/utils.services.d.ts +14 -0
  185. package/dist/utils/utils.services.d.ts.map +1 -0
  186. package/dist/utils/utils.services.js +33 -0
  187. package/dist/utils/utils.services.js.map +1 -0
  188. package/package.json +2 -4
  189. package/src/agent/AGENTS.md +0 -249
  190. package/src/agent/agent.test-runner.schemas.ts +0 -158
  191. package/src/agent/agent.test-runner.ts +0 -436
  192. package/src/agent/agent.ts +0 -371
  193. package/src/agent/agent.types.ts +0 -94
  194. package/src/backend/AGENTS.md +0 -112
  195. package/src/backend/backend.protocol.ts +0 -95
  196. package/src/backend/backend.schemas.ts +0 -123
  197. package/src/backend/backend.services.ts +0 -151
  198. package/src/backend/backend.ts +0 -111
  199. package/src/backend/backend.types.ts +0 -34
  200. package/src/cli/AGENTS.md +0 -213
  201. package/src/cli/cli.agent.ts +0 -197
  202. package/src/cli/cli.chat.ts +0 -369
  203. package/src/cli/cli.client.ts +0 -55
  204. package/src/cli/cli.collections.ts +0 -491
  205. package/src/cli/cli.config.ts +0 -252
  206. package/src/cli/cli.daemon.ts +0 -160
  207. package/src/cli/cli.documents.ts +0 -413
  208. package/src/cli/cli.mcp.ts +0 -177
  209. package/src/cli/cli.ts +0 -28
  210. package/src/cli/cli.utils.ts +0 -122
  211. package/src/client/AGENTS.md +0 -135
  212. package/src/client/client.adapters.ts +0 -279
  213. package/src/client/client.ts +0 -86
  214. package/src/client/client.types.ts +0 -17
  215. package/src/collections/AGENTS.md +0 -185
  216. package/src/collections/collections.schemas.ts +0 -195
  217. package/src/collections/collections.ts +0 -1160
  218. package/src/config/config.ts +0 -118
  219. package/src/daemon/AGENTS.md +0 -168
  220. package/src/daemon/daemon.config.ts +0 -23
  221. package/src/daemon/daemon.manager.ts +0 -215
  222. package/src/daemon/daemon.schemas.ts +0 -22
  223. package/src/daemon/daemon.ts +0 -205
  224. package/src/database/AGENTS.md +0 -211
  225. package/src/database/database.ts +0 -64
  226. package/src/database/migrations/migrations.001-init.ts +0 -56
  227. package/src/database/migrations/migrations.002-fts5.ts +0 -32
  228. package/src/database/migrations/migrations.ts +0 -20
  229. package/src/database/migrations/migrations.types.ts +0 -9
  230. package/src/documents/AGENTS.md +0 -301
  231. package/src/documents/documents.schemas.ts +0 -190
  232. package/src/documents/documents.ts +0 -734
  233. package/src/embedder/embedder.ts +0 -53
  234. package/src/exports.ts +0 -0
  235. package/src/mcp/AGENTS.md +0 -264
  236. package/src/mcp/mcp.ts +0 -105
  237. package/src/tools/AGENTS.md +0 -228
  238. package/src/tools/agent/agent.ts +0 -45
  239. package/src/tools/documents/documents.ts +0 -401
  240. package/src/tools/tools.langchain.ts +0 -37
  241. package/src/tools/tools.mcp.ts +0 -46
  242. package/src/utils/utils.services.ts +0 -46
package/bin/cli.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { createProgram } from '../src/cli/cli.ts';
3
+ import { createProgram } from '../dist/cli/cli.js';
4
4
 
5
5
  const program = createProgram();
6
6
 
package/bin/daemon.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { Daemon } from '../src/daemon/daemon.ts';
3
+ import { Daemon } from '../dist/daemon/daemon.js';
4
4
 
5
5
  const daemon = new Daemon();
6
6
 
@@ -0,0 +1,65 @@
1
+ import type { AgentResponse, AgentStepCallback, AskOptions, DocumentAgentOptions, LLMConfig, RetryConfig } from './agent.types.js';
2
+ import type { BackendClient } from '#root/client/client.js';
3
+ /**
4
+ * Check if an error is retryable (rate limit, temporary failure, etc.)
5
+ */
6
+ declare const isRetryableError: (error: unknown) => boolean;
7
+ /**
8
+ * Execute a function with retry logic
9
+ */
10
+ declare const withRetry: <T>(fn: () => Promise<T>, config?: RetryConfig, onRetry?: (attempt: number, error: Error, delayMs: number) => void) => Promise<T>;
11
+ /**
12
+ * Document search agent that uses LangChain tools to find and synthesize information.
13
+ */
14
+ declare class DocumentAgent {
15
+ #private;
16
+ constructor(options: DocumentAgentOptions);
17
+ /**
18
+ * Set the step callback for verbose mode
19
+ */
20
+ setOnStep(callback: AgentStepCallback | undefined): void;
21
+ /**
22
+ * Clear conversation history for a fresh start
23
+ */
24
+ clearHistory(): void;
25
+ /**
26
+ * Get current conversation history length
27
+ */
28
+ getHistoryLength(): number;
29
+ /**
30
+ * Ask a question and get a synthesized answer (stateless - doesn't use conversation history).
31
+ */
32
+ ask(query: string, useCase: string, options?: AskOptions): Promise<AgentResponse>;
33
+ /**
34
+ * Chat with conversation history (stateful - maintains context across calls).
35
+ */
36
+ chat(message: string, useCase: string, options?: AskOptions): Promise<AgentResponse>;
37
+ }
38
+ /**
39
+ * Options for creating a document agent
40
+ */
41
+ type CreateDocumentAgentOptions = {
42
+ /** Backend client for API calls */
43
+ client: BackendClient;
44
+ /** LLM configuration */
45
+ llmConfig: LLMConfig;
46
+ /** Optional map of alias names to collection IDs */
47
+ aliasMap?: Map<string, string>;
48
+ /** Maximum agent iterations */
49
+ maxIterations?: number;
50
+ /** Callback for verbose mode */
51
+ onStep?: AgentStepCallback;
52
+ /** Collections to restrict searches to */
53
+ collections?: string[];
54
+ };
55
+ /**
56
+ * Create a document search agent.
57
+ */
58
+ declare const createDocumentAgent: (options: CreateDocumentAgentOptions) => DocumentAgent;
59
+ /**
60
+ * Get LLM config from the application config.
61
+ */
62
+ declare const getLLMConfigFromAppConfig: () => Promise<LLMConfig>;
63
+ export { DocumentAgent, createDocumentAgent, getLLMConfigFromAppConfig, withRetry, isRetryableError };
64
+ export type { CreateDocumentAgentOptions };
65
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/agent/agent.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,aAAa,EAEb,iBAAiB,EACjB,UAAU,EACV,oBAAoB,EACpB,SAAS,EACT,WAAW,EACZ,MAAM,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAiB5D;;GAEG;AACH,QAAA,MAAM,gBAAgB,GAAI,OAAO,OAAO,KAAG,OAiB1C,CAAC;AAEF;;GAEG;AACH,QAAA,MAAM,SAAS,GAAU,CAAC,EACxB,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,SAAQ,WAAkC,EAC1C,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,KACjE,OAAO,CAAC,CAAC,CA6BX,CAAC;AAEF;;GAEG;AACH,cAAM,aAAa;;gBAQL,OAAO,EAAE,oBAAoB;IA8BzC;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,iBAAiB,GAAG,SAAS,GAAG,IAAI;IAIxD;;OAEG;IACH,YAAY,IAAI,IAAI;IAIpB;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACG,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC;IASvF;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC;CA6I3F;AAED;;GAEG;AACH,KAAK,0BAA0B,GAAG;IAChC,mCAAmC;IACnC,MAAM,EAAE,aAAa,CAAC;IACtB,wBAAwB;IACxB,SAAS,EAAE,SAAS,CAAC;IACrB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,+BAA+B;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gCAAgC;IAChC,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AAEF;;GAEG;AACH,QAAA,MAAM,mBAAmB,GAAI,SAAS,0BAA0B,KAAG,aAelE,CAAC;AAEF;;GAEG;AACH,QAAA,MAAM,yBAAyB,QAAa,OAAO,CAAC,SAAS,CAc5D,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;AACtG,YAAY,EAAE,0BAA0B,EAAE,CAAC"}
@@ -0,0 +1,291 @@
1
+ import { AIMessage, BaseMessage, HumanMessage, SystemMessage, ToolMessage } from '@langchain/core/messages';
2
+ import { createReactAgent } from '@langchain/langgraph/prebuilt';
3
+ import { ChatOpenAI } from '@langchain/openai';
4
+ import { AGENT_SYSTEM_PROMPT, formatCollectionRestriction, formatUserPrompt } from './agent.prompts.js';
5
+ import { createDocumentToolDefinitions } from '#root/tools/documents/documents.js';
6
+ import { toLangchainTools } from '#root/tools/tools.langchain.js';
7
+ /** Default retry configuration */
8
+ const DEFAULT_RETRY_CONFIG = {
9
+ maxRetries: 3,
10
+ initialDelayMs: 1000,
11
+ maxDelayMs: 30000,
12
+ backoffMultiplier: 2,
13
+ };
14
+ /**
15
+ * Sleep for a given number of milliseconds
16
+ */
17
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
18
+ /**
19
+ * Check if an error is retryable (rate limit, temporary failure, etc.)
20
+ */
21
+ const isRetryableError = (error) => {
22
+ if (error instanceof Error) {
23
+ const message = error.message.toLowerCase();
24
+ // Rate limit errors
25
+ if (message.includes('rate limit') || message.includes('429') || message.includes('too many requests')) {
26
+ return true;
27
+ }
28
+ // Temporary server errors
29
+ if (message.includes('500') || message.includes('502') || message.includes('503') || message.includes('504')) {
30
+ return true;
31
+ }
32
+ // Network errors
33
+ if (message.includes('econnreset') || message.includes('etimedout') || message.includes('network')) {
34
+ return true;
35
+ }
36
+ }
37
+ return false;
38
+ };
39
+ /**
40
+ * Execute a function with retry logic
41
+ */
42
+ const withRetry = async (fn, config = DEFAULT_RETRY_CONFIG, onRetry) => {
43
+ let lastError;
44
+ let delayMs = config.initialDelayMs;
45
+ for (let attempt = 1; attempt <= config.maxRetries + 1; attempt++) {
46
+ try {
47
+ return await fn();
48
+ }
49
+ catch (error) {
50
+ lastError = error instanceof Error ? error : new Error(String(error));
51
+ // Don't retry non-retryable errors or on last attempt
52
+ if (!isRetryableError(error) || attempt > config.maxRetries) {
53
+ throw lastError;
54
+ }
55
+ // Notify about retry
56
+ if (onRetry) {
57
+ onRetry(attempt, lastError, delayMs);
58
+ }
59
+ // Wait before retrying
60
+ await sleep(delayMs);
61
+ // Exponential backoff
62
+ delayMs = Math.min(delayMs * config.backoffMultiplier, config.maxDelayMs);
63
+ }
64
+ }
65
+ throw lastError;
66
+ };
67
+ /**
68
+ * Document search agent that uses LangChain tools to find and synthesize information.
69
+ */
70
+ class DocumentAgent {
71
+ #agent;
72
+ #maxIterations;
73
+ #onStep;
74
+ #collections;
75
+ #conversationHistory;
76
+ #systemPrompt;
77
+ constructor(options) {
78
+ const { llmConfig, tools, maxIterations = 15, onStep, collections } = options;
79
+ const llm = new ChatOpenAI({
80
+ configuration: {
81
+ baseURL: llmConfig.provider,
82
+ },
83
+ modelName: llmConfig.model,
84
+ apiKey: llmConfig.apiKey,
85
+ temperature: llmConfig.temperature,
86
+ maxTokens: llmConfig.maxTokens,
87
+ });
88
+ this.#agent = createReactAgent({
89
+ llm,
90
+ tools,
91
+ });
92
+ this.#maxIterations = maxIterations;
93
+ this.#onStep = onStep;
94
+ this.#collections = collections;
95
+ this.#conversationHistory = [];
96
+ // Build system prompt with collection restriction if needed
97
+ this.#systemPrompt = AGENT_SYSTEM_PROMPT;
98
+ if (collections && collections.length > 0) {
99
+ this.#systemPrompt += formatCollectionRestriction(collections);
100
+ }
101
+ }
102
+ /**
103
+ * Set the step callback for verbose mode
104
+ */
105
+ setOnStep(callback) {
106
+ this.#onStep = callback;
107
+ }
108
+ /**
109
+ * Clear conversation history for a fresh start
110
+ */
111
+ clearHistory() {
112
+ this.#conversationHistory = [];
113
+ }
114
+ /**
115
+ * Get current conversation history length
116
+ */
117
+ getHistoryLength() {
118
+ return this.#conversationHistory.length;
119
+ }
120
+ /**
121
+ * Ask a question and get a synthesized answer (stateless - doesn't use conversation history).
122
+ */
123
+ async ask(query, useCase, options) {
124
+ const onStep = options?.onStep ?? this.#onStep;
125
+ const userPrompt = formatUserPrompt(query, useCase, this.#collections);
126
+ const messages = [new SystemMessage(this.#systemPrompt), new HumanMessage(userPrompt)];
127
+ return this.#runAgent(messages, onStep);
128
+ }
129
+ /**
130
+ * Chat with conversation history (stateful - maintains context across calls).
131
+ */
132
+ async chat(message, useCase, options) {
133
+ const onStep = options?.onStep ?? this.#onStep;
134
+ // Add user message to history
135
+ const userMessage = new HumanMessage(formatUserPrompt(message, useCase, this.#collections));
136
+ this.#conversationHistory.push(userMessage);
137
+ // Build full message list with system prompt
138
+ const messages = [new SystemMessage(this.#systemPrompt), ...this.#conversationHistory];
139
+ const response = await this.#runAgent(messages, onStep);
140
+ // Add assistant response to history
141
+ this.#conversationHistory.push(new AIMessage(JSON.stringify(response)));
142
+ return response;
143
+ }
144
+ /**
145
+ * Run the agent with retry logic and step callbacks
146
+ */
147
+ async #runAgent(messages, onStep) {
148
+ // Notify about starting
149
+ if (onStep) {
150
+ onStep({ type: 'thinking', content: 'Starting search...' });
151
+ }
152
+ const result = await withRetry(async () => {
153
+ return this.#agent.invoke({ messages }, {
154
+ recursionLimit: this.#maxIterations,
155
+ });
156
+ }, DEFAULT_RETRY_CONFIG, (attempt, error, delayMs) => {
157
+ if (onStep) {
158
+ onStep({
159
+ type: 'error',
160
+ content: `Retry attempt ${attempt} after error: ${error.message}. Waiting ${delayMs}ms...`,
161
+ });
162
+ }
163
+ });
164
+ // Process messages for verbose output
165
+ if (onStep) {
166
+ this.#processMessagesForVerbose(result.messages, onStep);
167
+ }
168
+ // Extract the final message content
169
+ const resultMessages = result.messages;
170
+ const lastMessage = resultMessages[resultMessages.length - 1];
171
+ const content = typeof lastMessage.content === 'string' ? lastMessage.content : JSON.stringify(lastMessage.content);
172
+ // Try to parse as JSON response
173
+ return this.#parseResponse(content);
174
+ }
175
+ /**
176
+ * Process agent messages and emit verbose step callbacks
177
+ */
178
+ #processMessagesForVerbose(messages, onStep) {
179
+ for (const message of messages) {
180
+ if (message instanceof AIMessage) {
181
+ // Check for tool calls
182
+ const toolCalls = message.tool_calls;
183
+ if (toolCalls && toolCalls.length > 0) {
184
+ for (const toolCall of toolCalls) {
185
+ const step = {
186
+ type: 'tool_call',
187
+ content: `Calling ${toolCall.name}`,
188
+ toolName: toolCall.name,
189
+ toolInput: toolCall.args,
190
+ };
191
+ onStep(step);
192
+ }
193
+ }
194
+ else if (message.content) {
195
+ // Regular AI message (thinking or final answer)
196
+ const content = typeof message.content === 'string' ? message.content : JSON.stringify(message.content);
197
+ if (content.trim()) {
198
+ onStep({ type: 'thinking', content: content.slice(0, 200) + (content.length > 200 ? '...' : '') });
199
+ }
200
+ }
201
+ }
202
+ else if (message instanceof ToolMessage) {
203
+ // Tool result
204
+ const content = typeof message.content === 'string' ? message.content : JSON.stringify(message.content);
205
+ const preview = content.slice(0, 150) + (content.length > 150 ? '...' : '');
206
+ onStep({
207
+ type: 'tool_result',
208
+ content: preview,
209
+ toolName: message.name,
210
+ });
211
+ }
212
+ }
213
+ }
214
+ /**
215
+ * Parse the agent's response, extracting JSON if present.
216
+ */
217
+ #parseResponse(content) {
218
+ // Try to find JSON in the response
219
+ const jsonMatch = content.match(/```json\s*([\s\S]*?)\s*```/);
220
+ if (jsonMatch) {
221
+ try {
222
+ const parsed = JSON.parse(jsonMatch[1]);
223
+ return {
224
+ answer: parsed.answer ?? content,
225
+ sources: parsed.sources ?? [],
226
+ confidence: parsed.confidence ?? 'medium',
227
+ note: parsed.note,
228
+ };
229
+ }
230
+ catch {
231
+ // Fall through to default
232
+ }
233
+ }
234
+ // Try to parse the whole content as JSON
235
+ try {
236
+ const parsed = JSON.parse(content);
237
+ if (parsed.answer) {
238
+ return {
239
+ answer: parsed.answer,
240
+ sources: parsed.sources ?? [],
241
+ confidence: parsed.confidence ?? 'medium',
242
+ note: parsed.note,
243
+ };
244
+ }
245
+ }
246
+ catch {
247
+ // Fall through to default
248
+ }
249
+ // Default: treat the whole content as the answer
250
+ return {
251
+ answer: content,
252
+ sources: [],
253
+ confidence: 'medium',
254
+ };
255
+ }
256
+ }
257
+ /**
258
+ * Create a document search agent.
259
+ */
260
+ const createDocumentAgent = (options) => {
261
+ const { client, llmConfig, aliasMap, maxIterations, onStep, collections } = options;
262
+ // Create document tool definitions and convert to LangChain tools
263
+ const toolDefinitions = createDocumentToolDefinitions({ client, aliasMap });
264
+ const langchainTools = toLangchainTools(toolDefinitions);
265
+ const tools = Object.values(langchainTools);
266
+ return new DocumentAgent({
267
+ llmConfig,
268
+ tools,
269
+ maxIterations,
270
+ onStep,
271
+ collections,
272
+ });
273
+ };
274
+ /**
275
+ * Get LLM config from the application config.
276
+ */
277
+ const getLLMConfigFromAppConfig = async () => {
278
+ const { config } = await import('#root/config/config.js');
279
+ // Use type assertion for dynamic config access
280
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
281
+ const c = config;
282
+ return {
283
+ provider: c.get('llm.provider'),
284
+ model: c.get('llm.model'),
285
+ apiKey: c.get('llm.apiKey'),
286
+ temperature: c.get('llm.temperature'),
287
+ maxTokens: c.get('llm.maxTokens'),
288
+ };
289
+ };
290
+ export { DocumentAgent, createDocumentAgent, getLLMConfigFromAppConfig, withRetry, isRetryableError };
291
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/agent/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5G,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAW/C,OAAO,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGxG,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE,kCAAkC;AAClC,MAAM,oBAAoB,GAAgB;IACxC,UAAU,EAAE,CAAC;IACb,cAAc,EAAE,IAAI;IACpB,UAAU,EAAE,KAAK;IACjB,iBAAiB,EAAE,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAE/F;;GAEG;AACH,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAAW,EAAE;IACnD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC5C,oBAAoB;QACpB,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACvG,OAAO,IAAI,CAAC;QACd,CAAC;QACD,0BAA0B;QAC1B,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7G,OAAO,IAAI,CAAC;QACd,CAAC;QACD,iBAAiB;QACjB,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACnG,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,SAAS,GAAG,KAAK,EACrB,EAAoB,EACpB,SAAsB,oBAAoB,EAC1C,OAAkE,EACtD,EAAE;IACd,IAAI,SAA4B,CAAC;IACjC,IAAI,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC;IAEpC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;QAClE,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAEtE,sDAAsD;YACtD,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC5D,MAAM,SAAS,CAAC;YAClB,CAAC;YAED,qBAAqB;YACrB,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YACvC,CAAC;YAED,uBAAuB;YACvB,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YAErB,sBAAsB;YACtB,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC;AAClB,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,aAAa;IACjB,MAAM,CAAsC;IAC5C,cAAc,CAAS;IACvB,OAAO,CAAqB;IAC5B,YAAY,CAAY;IACxB,oBAAoB,CAAgB;IACpC,aAAa,CAAS;IAEtB,YAAY,OAA6B;QACvC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;QAE9E,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC;YACzB,aAAa,EAAE;gBACb,OAAO,EAAE,SAAS,CAAC,QAAQ;aAC5B;YACD,SAAS,EAAE,SAAS,CAAC,KAAK;YAC1B,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,SAAS,EAAE,SAAS,CAAC,SAAS;SAC/B,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,GAAG,gBAAgB,CAAC;YAC7B,GAAG;YACH,KAAK;SACN,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;QAE/B,4DAA4D;QAC5D,IAAI,CAAC,aAAa,GAAG,mBAAmB,CAAC;QACzC,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,aAAa,IAAI,2BAA2B,CAAC,WAAW,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,QAAuC;QAC/C,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,YAAY;QACV,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,KAAa,EAAE,OAAe,EAAE,OAAoB;QAC5D,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC;QAC/C,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAEvE,MAAM,QAAQ,GAAkB,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,IAAI,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;QAEtG,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,OAAe,EAAE,OAAe,EAAE,OAAoB;QAC/D,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC;QAE/C,8BAA8B;QAC9B,MAAM,WAAW,GAAG,IAAI,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QAC5F,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAE5C,6CAA6C;QAC7C,MAAM,QAAQ,GAAkB,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAEtG,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAExD,oCAAoC;QACpC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAExE,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,QAAuB,EAAE,MAA0B;QACjE,wBAAwB;QACxB,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,SAAS,CAC5B,KAAK,IAAI,EAAE;YACT,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CACvB,EAAE,QAAQ,EAAE,EACZ;gBACE,cAAc,EAAE,IAAI,CAAC,cAAc;aACpC,CACF,CAAC;QACJ,CAAC,EACD,oBAAoB,EACpB,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YAC1B,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC;oBACL,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,iBAAiB,OAAO,iBAAiB,KAAK,CAAC,OAAO,aAAa,OAAO,OAAO;iBAC3F,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CACF,CAAC;QAEF,sCAAsC;QACtC,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC3D,CAAC;QAED,oCAAoC;QACpC,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC;QACvC,MAAM,WAAW,GAAG,cAAc,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,OAAO,WAAW,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAEpH,gCAAgC;QAChC,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,0BAA0B,CAAC,QAAuB,EAAE,MAAyB;QAC3E,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,OAAO,YAAY,SAAS,EAAE,CAAC;gBACjC,uBAAuB;gBACvB,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;gBACrC,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;wBACjC,MAAM,IAAI,GAAc;4BACtB,IAAI,EAAE,WAAW;4BACjB,OAAO,EAAE,WAAW,QAAQ,CAAC,IAAI,EAAE;4BACnC,QAAQ,EAAE,QAAQ,CAAC,IAAI;4BACvB,SAAS,EAAE,QAAQ,CAAC,IAA+B;yBACpD,CAAC;wBACF,MAAM,CAAC,IAAI,CAAC,CAAC;oBACf,CAAC;gBACH,CAAC;qBAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBAC3B,gDAAgD;oBAChD,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBACxG,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;wBACnB,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBACrG,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,IAAI,OAAO,YAAY,WAAW,EAAE,CAAC;gBAC1C,cAAc;gBACd,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACxG,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC5E,MAAM,CAAC;oBACL,IAAI,EAAE,aAAa;oBACnB,OAAO,EAAE,OAAO;oBAChB,QAAQ,EAAE,OAAO,CAAC,IAAI;iBACvB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,OAAe;QAC5B,mCAAmC;QACnC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC9D,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxC,OAAO;oBACL,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,OAAO;oBAChC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;oBAC7B,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,QAAQ;oBACzC,IAAI,EAAE,MAAM,CAAC,IAAI;iBAClB,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,0BAA0B;YAC5B,CAAC;QACH,CAAC;QAED,yCAAyC;QACzC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,OAAO;oBACL,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;oBAC7B,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,QAAQ;oBACzC,IAAI,EAAE,MAAM,CAAC,IAAI;iBAClB,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;QAED,iDAAiD;QACjD,OAAO;YACL,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,EAAE;YACX,UAAU,EAAE,QAAQ;SACrB,CAAC;IACJ,CAAC;CACF;AAoBD;;GAEG;AACH,MAAM,mBAAmB,GAAG,CAAC,OAAmC,EAAiB,EAAE;IACjF,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAEpF,kEAAkE;IAClE,MAAM,eAAe,GAAG,6BAA6B,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC5E,MAAM,cAAc,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAE5C,OAAO,IAAI,aAAa,CAAC;QACvB,SAAS;QACT,KAAK;QACL,aAAa;QACb,MAAM;QACN,WAAW;KACZ,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,yBAAyB,GAAG,KAAK,IAAwB,EAAE;IAC/D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;IAE1D,+CAA+C;IAC/C,8DAA8D;IAC9D,MAAM,CAAC,GAAG,MAAa,CAAC;IAExB,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC;QAC/B,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC;QACzB,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC;QAC3B,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACrC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC;KAClC,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * System prompt for the document search agent
3
+ */
4
+ export declare const AGENT_SYSTEM_PROMPT = "You are a documentation search agent. Your task is to find and synthesize information from technical documentation to answer user questions.\n\n## Guidelines\n\n1. **Start broad, then narrow**: Begin with a semantic search, then drill into specific sections or documents as needed.\n\n2. **Use the right tool for the job**:\n - `documents_search` \u2014 Find relevant content across collections\n - `documents_list_documents` \u2014 Browse what's available in a collection \n - `documents_get_outline` \u2014 Understand document structure before diving in\n - `documents_get_section` \u2014 Get specific section content efficiently\n - `documents_get_document` \u2014 Only when you need the full document\n\n3. **Stop when sufficient**: The user has provided a use case. Once you have enough information to address their specific use case, synthesize and respond. Don't over-research.\n\n4. **Cite sources**: Track which documents/sections you used.\n\n5. **Acknowledge uncertainty**: If you can't find sufficient information, say so.\n\n## Response Format\n\nWhen you have found sufficient information, respond with a JSON object in this exact format:\n\n```json\n{\n \"answer\": \"Your synthesized answer here. Be clear, actionable, and include code examples when relevant.\",\n \"sources\": [\n {\"collection\": \"collection-name\", \"document\": \"document-id\", \"section\": \"Section Heading (if applicable)\"}\n ],\n \"confidence\": \"high|medium|low\",\n \"note\": \"Optional note about limitations or suggestions for further reading\"\n}\n```\n\nUse \"high\" confidence when multiple sources agree or you found a direct answer.\nUse \"medium\" when the information is relevant but not comprehensive.\nUse \"low\" when you're extrapolating or the information is tangentially related.";
5
+ /**
6
+ * Format the collection restriction instruction
7
+ */
8
+ export declare const formatCollectionRestriction: (collections: string[]) => string;
9
+ /**
10
+ * User prompt template
11
+ */
12
+ export declare const formatUserPrompt: (query: string, useCase: string, collections?: string[]) => string;
13
+ //# sourceMappingURL=agent.prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.prompts.d.ts","sourceRoot":"","sources":["../../src/agent/agent.prompts.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,mBAAmB,uxDAoCgD,CAAC;AAEjF;;GAEG;AACH,eAAO,MAAM,2BAA2B,GAAI,aAAa,MAAM,EAAE,KAAG,MAInE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAAI,OAAO,MAAM,EAAE,SAAS,MAAM,EAAE,cAAc,MAAM,EAAE,WAYtF,CAAC"}
@@ -38,25 +38,23 @@ When you have found sufficient information, respond with a JSON object in this e
38
38
  Use "high" confidence when multiple sources agree or you found a direct answer.
39
39
  Use "medium" when the information is relevant but not comprehensive.
40
40
  Use "low" when you're extrapolating or the information is tangentially related.`;
41
-
42
41
  /**
43
42
  * Format the collection restriction instruction
44
43
  */
45
- export const formatCollectionRestriction = (collections: string[]): string => {
46
- if (collections.length === 0) return '';
47
- const collectionList = collections.map((c) => `"${c}"`).join(', ');
48
- return `\n\n## Collection Restriction\nIMPORTANT: Only search within these collections: ${collectionList}. Always pass this list in the "collections" parameter of your search calls.`;
44
+ export const formatCollectionRestriction = (collections) => {
45
+ if (collections.length === 0)
46
+ return '';
47
+ const collectionList = collections.map((c) => `"${c}"`).join(', ');
48
+ return `\n\n## Collection Restriction\nIMPORTANT: Only search within these collections: ${collectionList}. Always pass this list in the "collections" parameter of your search calls.`;
49
49
  };
50
-
51
50
  /**
52
51
  * User prompt template
53
52
  */
54
- export const formatUserPrompt = (query: string, useCase: string, collections?: string[]) => {
55
- const collectionNote = collections?.length
56
- ? `\n\nNote: Restrict your searches to these collections: ${collections.join(', ')}`
57
- : '';
58
-
59
- return `## Question
53
+ export const formatUserPrompt = (query, useCase, collections) => {
54
+ const collectionNote = collections?.length
55
+ ? `\n\nNote: Restrict your searches to these collections: ${collections.join(', ')}`
56
+ : '';
57
+ return `## Question
60
58
  ${query}
61
59
 
62
60
  ## Use Case
@@ -64,3 +62,4 @@ ${useCase}${collectionNote}
64
62
 
65
63
  Find the information needed to answer this question for the given use case. Search the documentation, then provide your synthesized answer in JSON format.`;
66
64
  };
65
+ //# sourceMappingURL=agent.prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.prompts.js","sourceRoot":"","sources":["../../src/agent/agent.prompts.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gFAoC6C,CAAC;AAEjF;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,WAAqB,EAAU,EAAE;IAC3E,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,OAAO,mFAAmF,cAAc,8EAA8E,CAAC;AACzL,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAE,OAAe,EAAE,WAAsB,EAAE,EAAE;IACzF,MAAM,cAAc,GAAG,WAAW,EAAE,MAAM;QACxC,CAAC,CAAC,0DAA0D,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACpF,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;EACP,KAAK;;;EAGL,OAAO,GAAG,cAAc;;2JAEiI,CAAC;AAC5J,CAAC,CAAC"}
@@ -0,0 +1,73 @@
1
+ import type { LLMConfig } from './agent.types.js';
2
+ import { type TestResult, type TestRunResult, type TestSuite, type ValidationMode } from './agent.test-runner.schemas.js';
3
+ import { destroy } from '#root/utils/utils.services.js';
4
+ /**
5
+ * Callback for test progress updates
6
+ */
7
+ type TestProgressCallback = (event: TestProgressEvent) => void;
8
+ type TestProgressEvent = {
9
+ type: 'suite_start';
10
+ suiteName: string;
11
+ totalTests: number;
12
+ } | {
13
+ type: 'sync_start';
14
+ } | {
15
+ type: 'sync_complete';
16
+ } | {
17
+ type: 'test_start';
18
+ testId: string;
19
+ index: number;
20
+ } | {
21
+ type: 'test_complete';
22
+ testId: string;
23
+ result: TestResult;
24
+ } | {
25
+ type: 'suite_complete';
26
+ result: TestRunResult;
27
+ };
28
+ /**
29
+ * Options for running a test suite
30
+ */
31
+ type TestRunnerOptions = {
32
+ /** LLM configuration (defaults to app config) */
33
+ llmConfig?: LLMConfig;
34
+ /** Progress callback */
35
+ onProgress?: TestProgressCallback;
36
+ /** Override validation mode for all tests */
37
+ validationMode?: ValidationMode;
38
+ /** Override pass threshold for all tests */
39
+ passThreshold?: number;
40
+ /** Model to use for LLM validation (defaults to llmConfig.model) */
41
+ validationModel?: string;
42
+ /** Base directory for resolving relative URLs in the test file (defaults to test file's directory) */
43
+ baseDir?: string;
44
+ };
45
+ /**
46
+ * Test runner service for validating agent performance
47
+ */
48
+ declare class AgentTestRunner {
49
+ #private;
50
+ constructor();
51
+ /**
52
+ * Load and parse a test suite from a YAML file
53
+ */
54
+ loadTestSuite(filePath: string): Promise<{
55
+ suite: TestSuite;
56
+ baseDir: string;
57
+ }>;
58
+ /**
59
+ * Run a complete test suite
60
+ */
61
+ runTestSuite(suite: TestSuite, options?: TestRunnerOptions): Promise<TestRunResult>;
62
+ /**
63
+ * Clean up resources
64
+ */
65
+ [destroy](): Promise<void>;
66
+ }
67
+ /**
68
+ * Create a test runner instance
69
+ */
70
+ declare const createTestRunner: () => AgentTestRunner;
71
+ export { AgentTestRunner, createTestRunner };
72
+ export type { TestProgressCallback, TestProgressEvent, TestRunnerOptions };
73
+ //# sourceMappingURL=agent.test-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.test-runner.d.ts","sourceRoot":"","sources":["../../src/agent/agent.test-runner.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,gCAAgC,CAAC;AAKxC,OAAO,EAAY,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAElE;;GAEG;AACH,KAAK,oBAAoB,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;AAE/D,KAAK,iBAAiB,GAClB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,CAAC;AAEtD;;GAEG;AACH,KAAK,iBAAiB,GAAG;IACvB,iDAAiD;IACjD,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,wBAAwB;IACxB,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,6CAA6C;IAC7C,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,4CAA4C;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sGAAsG;IACtG,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAkCF;;GAEG;AACH,cAAM,eAAe;;;IAiBnB;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAQrF;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,aAAa,CAAC;IA6S7F;;OAEG;IACG,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;CAGjC;AAED;;GAEG;AACH,QAAA,MAAM,gBAAgB,QAAO,eAE5B,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAC;AAC7C,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,CAAC"}