@illuma-ai/agents 1.4.0-alpha.2 → 1.4.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/cjs/main.cjs +37 -27
  2. package/dist/cjs/main.cjs.map +1 -1
  3. package/dist/cjs/tools/artifacts/schema.cjs +63 -0
  4. package/dist/cjs/tools/artifacts/schema.cjs.map +1 -0
  5. package/dist/cjs/tools/artifacts/tool.cjs +213 -0
  6. package/dist/cjs/tools/artifacts/tool.cjs.map +1 -0
  7. package/dist/cjs/tools/fileSearch/formatter.cjs +2 -4
  8. package/dist/cjs/tools/fileSearch/formatter.cjs.map +1 -1
  9. package/dist/cjs/tools/fileSearch/ragClient.cjs +4 -6
  10. package/dist/cjs/tools/fileSearch/ragClient.cjs.map +1 -1
  11. package/dist/cjs/tools/fileSearch/schema.cjs.map +1 -1
  12. package/dist/cjs/tools/fileSearch/tool.cjs.map +1 -1
  13. package/dist/esm/main.mjs +2 -0
  14. package/dist/esm/main.mjs.map +1 -1
  15. package/dist/esm/tools/artifacts/schema.mjs +56 -0
  16. package/dist/esm/tools/artifacts/schema.mjs.map +1 -0
  17. package/dist/esm/tools/artifacts/tool.mjs +207 -0
  18. package/dist/esm/tools/artifacts/tool.mjs.map +1 -0
  19. package/dist/esm/tools/fileSearch/formatter.mjs +2 -4
  20. package/dist/esm/tools/fileSearch/formatter.mjs.map +1 -1
  21. package/dist/esm/tools/fileSearch/ragClient.mjs +4 -6
  22. package/dist/esm/tools/fileSearch/ragClient.mjs.map +1 -1
  23. package/dist/esm/tools/fileSearch/schema.mjs.map +1 -1
  24. package/dist/esm/tools/fileSearch/tool.mjs.map +1 -1
  25. package/dist/types/index.d.ts +1 -0
  26. package/dist/types/tools/artifacts/index.d.ts +3 -0
  27. package/dist/types/tools/artifacts/schema.d.ts +63 -0
  28. package/dist/types/tools/artifacts/tool.d.ts +16 -0
  29. package/dist/types/tools/artifacts/types.d.ts +127 -0
  30. package/package.json +1 -1
  31. package/src/index.ts +1 -0
  32. package/src/tools/artifacts/__tests__/tool.test.ts +243 -0
  33. package/src/tools/artifacts/index.ts +33 -0
  34. package/src/tools/artifacts/schema.ts +76 -0
  35. package/src/tools/artifacts/tool.ts +277 -0
  36. package/src/tools/artifacts/types.ts +149 -0
  37. package/src/tools/fileSearch/__tests__/tool.test.ts +20 -10
  38. package/src/tools/fileSearch/formatter.ts +5 -7
  39. package/src/tools/fileSearch/ragClient.ts +6 -10
  40. package/src/tools/fileSearch/schema.ts +2 -2
  41. package/src/tools/fileSearch/tool.ts +6 -6
  42. package/src/tools/fileSearch/types.ts +4 -2
package/dist/cjs/main.cjs CHANGED
@@ -23,15 +23,17 @@ var ProgrammaticToolCalling = require('./tools/ProgrammaticToolCalling.cjs');
23
23
  var ToolSearch = require('./tools/ToolSearch.cjs');
24
24
  var ToolNode = require('./tools/ToolNode.cjs');
25
25
  var AskUser = require('./tools/AskUser.cjs');
26
- var schema$2 = require('./tools/schema.cjs');
26
+ var schema$3 = require('./tools/schema.cjs');
27
27
  var handlers$1 = require('./tools/handlers.cjs');
28
- var tool$1 = require('./tools/search/tool.cjs');
29
- var schema = require('./tools/search/schema.cjs');
28
+ var tool$2 = require('./tools/search/tool.cjs');
29
+ var schema$1 = require('./tools/search/schema.cjs');
30
30
  var index$2 = require('./tools/memory/index.cjs');
31
- var tool = require('./tools/fileSearch/tool.cjs');
31
+ var tool$1 = require('./tools/fileSearch/tool.cjs');
32
32
  var ragClient = require('./tools/fileSearch/ragClient.cjs');
33
33
  var formatter = require('./tools/fileSearch/formatter.cjs');
34
- var schema$1 = require('./tools/fileSearch/schema.cjs');
34
+ var schema$2 = require('./tools/fileSearch/schema.cjs');
35
+ var tool = require('./tools/artifacts/tool.cjs');
36
+ var schema = require('./tools/artifacts/schema.cjs');
35
37
  var proxyTool = require('./tools/proxyTool.cjs');
36
38
  var types = require('./providers/types.cjs');
37
39
  var capabilityNaming = require('./providers/capabilityNaming.cjs');
@@ -70,7 +72,7 @@ var run$1 = require('./utils/run.cjs');
70
72
  var tokens = require('./utils/tokens.cjs');
71
73
  var toonFormat = require('./utils/toonFormat.cjs');
72
74
  var contextAnalytics = require('./utils/contextAnalytics.cjs');
73
- var schema$3 = require('./utils/schema.cjs');
75
+ var schema$4 = require('./utils/schema.cjs');
74
76
  var toolCallContinuation = require('./utils/toolCallContinuation.cjs');
75
77
  var contextPressure = require('./utils/contextPressure.cjs');
76
78
  var toolDiscoveryCache = require('./utils/toolDiscoveryCache.cjs');
@@ -199,38 +201,46 @@ exports.AskUserStepSchema = AskUser.AskUserStepSchema;
199
201
  exports.AskUserToolName = AskUser.AskUserToolName;
200
202
  exports.HITL_FIELDS = AskUser.HITL_FIELDS;
201
203
  exports.createAskUserTool = AskUser.createAskUserTool;
202
- exports.createSchemaOnlyTool = schema$2.createSchemaOnlyTool;
203
- exports.createSchemaOnlyTools = schema$2.createSchemaOnlyTools;
204
+ exports.createSchemaOnlyTool = schema$3.createSchemaOnlyTool;
205
+ exports.createSchemaOnlyTools = schema$3.createSchemaOnlyTools;
204
206
  exports.handleServerToolResult = handlers$1.handleServerToolResult;
205
207
  exports.handleToolCallChunks = handlers$1.handleToolCallChunks;
206
208
  exports.handleToolCalls = handlers$1.handleToolCalls;
207
209
  exports.toolResultTypes = handlers$1.toolResultTypes;
208
- exports.createSearchTool = tool$1.createSearchTool;
210
+ exports.createSearchTool = tool$2.createSearchTool;
209
211
  Object.defineProperty(exports, "DATE_RANGE", {
210
212
  enumerable: true,
211
- get: function () { return schema.DATE_RANGE; }
213
+ get: function () { return schema$1.DATE_RANGE; }
212
214
  });
213
- exports.DEFAULT_COUNTRY_DESCRIPTION = schema.DEFAULT_COUNTRY_DESCRIPTION;
214
- exports.DEFAULT_QUERY_DESCRIPTION = schema.DEFAULT_QUERY_DESCRIPTION;
215
- exports.WebSearchToolDefinition = schema.WebSearchToolDefinition;
216
- exports.WebSearchToolDescription = schema.WebSearchToolDescription;
217
- exports.WebSearchToolName = schema.WebSearchToolName;
218
- exports.WebSearchToolSchema = schema.WebSearchToolSchema;
219
- exports.countrySchema = schema.countrySchema;
220
- exports.dateSchema = schema.dateSchema;
221
- exports.imagesSchema = schema.imagesSchema;
222
- exports.newsSchema = schema.newsSchema;
223
- exports.querySchema = schema.querySchema;
224
- exports.videosSchema = schema.videosSchema;
215
+ exports.DEFAULT_COUNTRY_DESCRIPTION = schema$1.DEFAULT_COUNTRY_DESCRIPTION;
216
+ exports.DEFAULT_QUERY_DESCRIPTION = schema$1.DEFAULT_QUERY_DESCRIPTION;
217
+ exports.WebSearchToolDefinition = schema$1.WebSearchToolDefinition;
218
+ exports.WebSearchToolDescription = schema$1.WebSearchToolDescription;
219
+ exports.WebSearchToolName = schema$1.WebSearchToolName;
220
+ exports.WebSearchToolSchema = schema$1.WebSearchToolSchema;
221
+ exports.countrySchema = schema$1.countrySchema;
222
+ exports.dateSchema = schema$1.dateSchema;
223
+ exports.imagesSchema = schema$1.imagesSchema;
224
+ exports.newsSchema = schema$1.newsSchema;
225
+ exports.querySchema = schema$1.querySchema;
226
+ exports.videosSchema = schema$1.videosSchema;
225
227
  exports.buildMemoryTools = index$2.buildMemoryTools;
226
- exports.createFileSearchTool = tool.createFileSearchTool;
228
+ exports.createFileSearchTool = tool$1.createFileSearchTool;
227
229
  exports.HttpRagClient = ragClient.HttpRagClient;
228
230
  exports.RAG_API_URL_ENV = ragClient.RAG_API_URL_ENV;
229
231
  exports.getRagBaseUrl = ragClient.getRagBaseUrl;
230
232
  exports.createCitationAnchorFormatter = formatter.createCitationAnchorFormatter;
231
233
  exports.plainTextFormatter = formatter.plainTextFormatter;
232
- exports.FileSearchToolName = schema$1.FileSearchToolName;
233
- exports.fileSearchInputSchema = schema$1.fileSearchInputSchema;
234
+ exports.FileSearchToolName = schema$2.FileSearchToolName;
235
+ exports.fileSearchInputSchema = schema$2.fileSearchInputSchema;
236
+ exports.createArtifactTool = tool.createArtifactTool;
237
+ exports.createContentReaderTool = tool.createContentReaderTool;
238
+ exports.ARTIFACT_TOOL_NAME = schema.ARTIFACT_TOOL_NAME;
239
+ exports.ARTIFACT_WRITE_ACTIONS = schema.ARTIFACT_WRITE_ACTIONS;
240
+ exports.CONTENT_READER_NAME = schema.CONTENT_READER_NAME;
241
+ exports.CONTENT_READ_ACTIONS = schema.CONTENT_READ_ACTIONS;
242
+ exports.artifactToolSchema = schema.artifactToolSchema;
243
+ exports.contentReaderSchema = schema.contentReaderSchema;
234
244
  exports.buildProxyTool = proxyTool.buildProxyTool;
235
245
  Object.defineProperty(exports, "AuthSource", {
236
246
  enumerable: true,
@@ -463,8 +473,8 @@ exports.isToonFormat = toonFormat.isToonFormat;
463
473
  exports.jsonToToon = toonFormat.jsonToToon;
464
474
  exports.processToolOutput = toonFormat.processToolOutput;
465
475
  exports.buildContextAnalytics = contextAnalytics.buildContextAnalytics;
466
- exports.isZodSchema = schema$3.isZodSchema;
467
- exports.toJsonSchema = schema$3.toJsonSchema;
476
+ exports.isZodSchema = schema$4.isZodSchema;
477
+ exports.toJsonSchema = schema$4.toJsonSchema;
468
478
  exports.extractFinishReason = toolCallContinuation.extractFinishReason;
469
479
  exports.isMaxTokensFinish = toolCallContinuation.isMaxTokensFinish;
470
480
  exports.buildMultiDocHintContent = contextPressure.buildMultiDocHintContent;
@@ -1 +1 @@
1
- {"version":3,"file":"main.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"main.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,63 @@
1
+ 'use strict';
2
+
3
+ var zod = require('zod');
4
+
5
+ const ARTIFACT_WRITE_ACTIONS = ['write', 'edit', 'verify', 'delete'];
6
+ const CONTENT_READ_ACTIONS = ['read', 'search', 'list', 'info'];
7
+ const artifactToolSchema = zod.z.object({
8
+ action: zod.z
9
+ .enum(ARTIFACT_WRITE_ACTIONS)
10
+ .describe('Authoring action: write (create/overwrite), edit (str_replace), verify (syntax check), delete (remove).'),
11
+ content_id: zod.z
12
+ .string()
13
+ .optional()
14
+ .describe('ID of the artifact entry. Required for edit/verify/delete; optional for write (supply to overwrite an existing entry).'),
15
+ // write
16
+ content: zod.z
17
+ .string()
18
+ .optional()
19
+ .describe('Full file content (required for write action).'),
20
+ name: zod.z
21
+ .string()
22
+ .optional()
23
+ .describe('Filename for the new entry (required when creating). MUST include the correct file extension — the extension drives the preview template.'),
24
+ // edit (str_replace)
25
+ old_str: zod.z
26
+ .string()
27
+ .optional()
28
+ .describe('Exact string to find and replace (required for edit).'),
29
+ new_str: zod.z.string().optional().describe('Replacement string (required for edit).'),
30
+ replace_all: zod.z
31
+ .boolean()
32
+ .optional()
33
+ .describe('edit: when true, replaces every occurrence of old_str. When false (default) and old_str matches more than one location, the edit is refused.'),
34
+ });
35
+ const contentReaderSchema = zod.z.object({
36
+ action: zod.z
37
+ .enum(CONTENT_READ_ACTIONS)
38
+ .describe('Read-only action: read (lines), search (regex), list (all entries), info (metadata).'),
39
+ content_id: zod.z
40
+ .string()
41
+ .optional()
42
+ .describe('ID of the content entry. Required for read/search/info. Omit for list.'),
43
+ // read pagination
44
+ start_line: zod.z.number().optional().describe('1-based start line for reading.'),
45
+ end_line: zod.z.number().optional().describe('1-based end line (inclusive).'),
46
+ // search
47
+ pattern: zod.z.string().optional().describe('Regex pattern (required for search).'),
48
+ flags: zod.z.string().optional().describe('Regex flags (e.g., "i" for case-insensitive).'),
49
+ context: zod.z.number().optional().describe('Lines of context around each match.'),
50
+ // shared pagination
51
+ offset: zod.z.number().optional().describe('Offset for read or search pagination.'),
52
+ limit: zod.z.number().optional().describe('Max lines (read) or matches (search).'),
53
+ });
54
+ const ARTIFACT_TOOL_NAME = 'artifact_tool';
55
+ const CONTENT_READER_NAME = 'content_reader';
56
+
57
+ exports.ARTIFACT_TOOL_NAME = ARTIFACT_TOOL_NAME;
58
+ exports.ARTIFACT_WRITE_ACTIONS = ARTIFACT_WRITE_ACTIONS;
59
+ exports.CONTENT_READER_NAME = CONTENT_READER_NAME;
60
+ exports.CONTENT_READ_ACTIONS = CONTENT_READ_ACTIONS;
61
+ exports.artifactToolSchema = artifactToolSchema;
62
+ exports.contentReaderSchema = contentReaderSchema;
63
+ //# sourceMappingURL=schema.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.cjs","sources":["../../../../src/tools/artifacts/schema.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const ARTIFACT_WRITE_ACTIONS = ['write', 'edit', 'verify', 'delete'] as const;\nexport const CONTENT_READ_ACTIONS = ['read', 'search', 'list', 'info'] as const;\n\nexport const artifactToolSchema = z.object({\n action: z\n .enum(ARTIFACT_WRITE_ACTIONS)\n .describe(\n 'Authoring action: write (create/overwrite), edit (str_replace), verify (syntax check), delete (remove).',\n ),\n content_id: z\n .string()\n .optional()\n .describe(\n 'ID of the artifact entry. Required for edit/verify/delete; optional for write (supply to overwrite an existing entry).',\n ),\n\n // write\n content: z\n .string()\n .optional()\n .describe('Full file content (required for write action).'),\n name: z\n .string()\n .optional()\n .describe(\n 'Filename for the new entry (required when creating). MUST include the correct file extension — the extension drives the preview template.',\n ),\n\n // edit (str_replace)\n old_str: z\n .string()\n .optional()\n .describe('Exact string to find and replace (required for edit).'),\n new_str: z.string().optional().describe('Replacement string (required for edit).'),\n replace_all: z\n .boolean()\n .optional()\n .describe(\n 'edit: when true, replaces every occurrence of old_str. When false (default) and old_str matches more than one location, the edit is refused.',\n ),\n});\n\nexport const contentReaderSchema = z.object({\n action: z\n .enum(CONTENT_READ_ACTIONS)\n .describe(\n 'Read-only action: read (lines), search (regex), list (all entries), info (metadata).',\n ),\n content_id: z\n .string()\n .optional()\n .describe(\n 'ID of the content entry. Required for read/search/info. Omit for list.',\n ),\n\n // read pagination\n start_line: z.number().optional().describe('1-based start line for reading.'),\n end_line: z.number().optional().describe('1-based end line (inclusive).'),\n\n // search\n pattern: z.string().optional().describe('Regex pattern (required for search).'),\n flags: z.string().optional().describe('Regex flags (e.g., \"i\" for case-insensitive).'),\n context: z.number().optional().describe('Lines of context around each match.'),\n\n // shared pagination\n offset: z.number().optional().describe('Offset for read or search pagination.'),\n limit: z.number().optional().describe('Max lines (read) or matches (search).'),\n});\n\nexport const ARTIFACT_TOOL_NAME = 'artifact_tool';\nexport const CONTENT_READER_NAME = 'content_reader';\n\nexport type ArtifactToolInput = z.infer<typeof artifactToolSchema>;\nexport type ContentReaderInput = z.infer<typeof contentReaderSchema>;\n"],"names":["z"],"mappings":";;;;AAEO,MAAM,sBAAsB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ;AACnE,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM;AAE9D,MAAM,kBAAkB,GAAGA,KAAC,CAAC,MAAM,CAAC;AACzC,IAAA,MAAM,EAAEA;SACL,IAAI,CAAC,sBAAsB;SAC3B,QAAQ,CACP,yGAAyG,CAC1G;AACH,IAAA,UAAU,EAAEA;AACT,SAAA,MAAM;AACN,SAAA,QAAQ;SACR,QAAQ,CACP,wHAAwH,CACzH;;AAGH,IAAA,OAAO,EAAEA;AACN,SAAA,MAAM;AACN,SAAA,QAAQ;SACR,QAAQ,CAAC,gDAAgD,CAAC;AAC7D,IAAA,IAAI,EAAEA;AACH,SAAA,MAAM;AACN,SAAA,QAAQ;SACR,QAAQ,CACP,2IAA2I,CAC5I;;AAGH,IAAA,OAAO,EAAEA;AACN,SAAA,MAAM;AACN,SAAA,QAAQ;SACR,QAAQ,CAAC,uDAAuD,CAAC;AACpE,IAAA,OAAO,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;AAClF,IAAA,WAAW,EAAEA;AACV,SAAA,OAAO;AACP,SAAA,QAAQ;SACR,QAAQ,CACP,8IAA8I,CAC/I;AACJ,CAAA;AAEM,MAAM,mBAAmB,GAAGA,KAAC,CAAC,MAAM,CAAC;AAC1C,IAAA,MAAM,EAAEA;SACL,IAAI,CAAC,oBAAoB;SACzB,QAAQ,CACP,sFAAsF,CACvF;AACH,IAAA,UAAU,EAAEA;AACT,SAAA,MAAM;AACN,SAAA,QAAQ;SACR,QAAQ,CACP,wEAAwE,CACzE;;AAGH,IAAA,UAAU,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;AAC7E,IAAA,QAAQ,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;;AAGzE,IAAA,OAAO,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;AAC/E,IAAA,KAAK,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;AACtF,IAAA,OAAO,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;;AAG9E,IAAA,MAAM,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;AAC/E,IAAA,KAAK,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;AAC/E,CAAA;AAEM,MAAM,kBAAkB,GAAG;AAC3B,MAAM,mBAAmB,GAAG;;;;;;;;;"}
@@ -0,0 +1,213 @@
1
+ 'use strict';
2
+
3
+ var tools = require('@langchain/core/tools');
4
+ var schema = require('./schema.cjs');
5
+
6
+ /**
7
+ * artifact_tool + content_reader library factories.
8
+ *
9
+ * The library owns the LangChain wiring (schema, description, response
10
+ * shape) and the action dispatch; the runtime supplies a handler bundle
11
+ * matching the `ArtifactWriteHandlers` / `ContentReadHandlers` interface.
12
+ *
13
+ * This keeps 800+ LOC of host-specific handler logic (S3 adapters, file
14
+ * model CRUD, syntax checkers, line utils) out of the library while
15
+ * still centralizing the tool surface every runtime shares.
16
+ */
17
+ const DEFAULT_ARTIFACT_DESCRIPTION = `Author content artifacts that render live in the host's preview panel — this tool does NOT produce downloadable files (use execute_code for those).
18
+
19
+ Actions:
20
+ - write: Create a new artifact. Write a COMPLETE file in one call. The \`name\` field MUST include the file extension — it routes the preview (.tsx, .html, .mmd, .svg, .csv, .json, .dot, .md, .drawio).
21
+ - verify: Check an artifact for syntax errors. REQUIRED as the next step after every write/edit on code files — do not render until verify passes.
22
+ - edit: Surgical string replacement — provide old_str (exact match) and new_str. Works on all file types.
23
+ - delete: Remove an artifact and its backing file.
24
+
25
+ Artifacts are persisted by the host. No manual save needed.`;
26
+ const DEFAULT_CONTENT_READER_DESCRIPTION = `Read and navigate stored content — artifacts authored by artifact_tool, large tool results auto-cached by the host, uploaded file attachments, and code blocks.
27
+
28
+ Read-only surface. Use write/edit tools (artifact_tool, execute_code) to mutate.
29
+
30
+ Actions:
31
+ - read: Return line ranges from a specific content_id.
32
+ - search: Regex search across a specific content_id with paginated matches.
33
+ - list: Enumerate every content entry currently stored.
34
+ - info: Metadata (size, kind, creation time) for a specific content_id.`;
35
+ /**
36
+ * Optional content_id self-healing — if the runtime supplies a resolver,
37
+ * we pre-resolve the ID on every action that takes one so nicknames
38
+ * (e.g., "Dashboard") map to canonical IDs.
39
+ */
40
+ async function resolveContentIdIfPresent(resolver, id, scope, logger) {
41
+ if (!resolver || !id)
42
+ return id;
43
+ const out = await resolver.resolve(id, scope);
44
+ if (!out)
45
+ return id;
46
+ if (out.resolvedId !== id) {
47
+ logger?.debug(`[artifact] resolved "${id}" → "${out.resolvedId}"${out.resolvedName ? ` ("${out.resolvedName}")` : ''}`);
48
+ }
49
+ return out.resolvedId;
50
+ }
51
+ // ─── Writer tool (artifact_tool) ─────────────────────────────────────────
52
+ function createArtifactTool(config) {
53
+ const { handlers, getScope, resolver, logger, descriptionOverride } = config;
54
+ return tools.tool(async (rawInput, runnableConfig) => {
55
+ const scope = getScope(runnableConfig);
56
+ if (!scope) {
57
+ logger?.warn('[artifact_tool] no scope resolved from runnableConfig');
58
+ return ['Error: No conversation context available', {}];
59
+ }
60
+ const input = rawInput;
61
+ const resolvedContentId = await resolveContentIdIfPresent(resolver, input.content_id, scope, logger);
62
+ const started = Date.now();
63
+ try {
64
+ switch (input.action) {
65
+ case 'write': {
66
+ const args = {
67
+ action: 'write',
68
+ content_id: resolvedContentId,
69
+ content: input.content ?? '',
70
+ name: input.name,
71
+ };
72
+ if (!args.content)
73
+ return ['Error: write requires content', {}];
74
+ return await handlers.write(args, scope);
75
+ }
76
+ case 'edit': {
77
+ if (!resolvedContentId)
78
+ return ['Error: edit requires content_id', {}];
79
+ const args = {
80
+ action: 'edit',
81
+ content_id: resolvedContentId,
82
+ old_str: input.old_str ?? '',
83
+ new_str: input.new_str ?? '',
84
+ replace_all: input.replace_all,
85
+ };
86
+ if (!args.old_str)
87
+ return ['Error: edit requires old_str', {}];
88
+ return await handlers.edit(args, scope);
89
+ }
90
+ case 'verify': {
91
+ if (!resolvedContentId)
92
+ return ['Error: verify requires content_id', {}];
93
+ const args = {
94
+ action: 'verify',
95
+ content_id: resolvedContentId,
96
+ };
97
+ return await handlers.verify(args, scope);
98
+ }
99
+ case 'delete': {
100
+ if (!resolvedContentId)
101
+ return ['Error: delete requires content_id', {}];
102
+ const args = {
103
+ action: 'delete',
104
+ content_id: resolvedContentId,
105
+ };
106
+ return await handlers.delete(args, scope);
107
+ }
108
+ default:
109
+ return [`Unknown action: ${input.action}`, {}];
110
+ }
111
+ }
112
+ catch (err) {
113
+ const e = err instanceof Error ? err : new Error(String(err));
114
+ logger?.error('[artifact_tool] handler threw', {
115
+ action: input.action,
116
+ contentId: resolvedContentId,
117
+ error: e.message,
118
+ elapsed: `${Date.now() - started}ms`,
119
+ });
120
+ return [`Error: ${e.message}`, {}];
121
+ }
122
+ }, {
123
+ name: schema.ARTIFACT_TOOL_NAME,
124
+ responseFormat: 'content_and_artifact',
125
+ description: descriptionOverride ?? DEFAULT_ARTIFACT_DESCRIPTION,
126
+ schema: schema.artifactToolSchema,
127
+ });
128
+ }
129
+ // ─── Reader tool (content_reader) ────────────────────────────────────────
130
+ function createContentReaderTool(config) {
131
+ const { handlers, getScope, resolver, logger, descriptionOverride } = config;
132
+ return tools.tool(async (rawInput, runnableConfig) => {
133
+ const scope = getScope(runnableConfig);
134
+ if (!scope) {
135
+ logger?.warn('[content_reader] no scope resolved from runnableConfig');
136
+ return ['Error: No conversation context available', {}];
137
+ }
138
+ const input = rawInput;
139
+ const resolvedContentId = await resolveContentIdIfPresent(resolver, input.content_id, scope, logger);
140
+ const started = Date.now();
141
+ try {
142
+ switch (input.action) {
143
+ case 'read': {
144
+ if (!resolvedContentId)
145
+ return ['Error: read requires content_id', {}];
146
+ const args = {
147
+ action: 'read',
148
+ content_id: resolvedContentId,
149
+ start_line: input.start_line,
150
+ end_line: input.end_line,
151
+ offset: input.offset,
152
+ limit: input.limit,
153
+ };
154
+ return await handlers.read(args, scope);
155
+ }
156
+ case 'search': {
157
+ if (!resolvedContentId)
158
+ return ['Error: search requires content_id', {}];
159
+ if (!input.pattern)
160
+ return ['Error: search requires pattern', {}];
161
+ const args = {
162
+ action: 'search',
163
+ content_id: resolvedContentId,
164
+ pattern: input.pattern,
165
+ flags: input.flags,
166
+ context: input.context,
167
+ offset: input.offset,
168
+ limit: input.limit,
169
+ };
170
+ return await handlers.search(args, scope);
171
+ }
172
+ case 'list': {
173
+ const args = { action: 'list' };
174
+ return await handlers.list(args, scope);
175
+ }
176
+ case 'info': {
177
+ if (!resolvedContentId)
178
+ return ['Error: info requires content_id', {}];
179
+ const args = {
180
+ action: 'info',
181
+ content_id: resolvedContentId,
182
+ };
183
+ return await handlers.info(args, scope);
184
+ }
185
+ default:
186
+ return [`Unknown action: ${input.action}`, {}];
187
+ }
188
+ }
189
+ catch (err) {
190
+ const e = err instanceof Error ? err : new Error(String(err));
191
+ logger?.error('[content_reader] handler threw', {
192
+ action: input.action,
193
+ contentId: resolvedContentId,
194
+ error: e.message,
195
+ elapsed: `${Date.now() - started}ms`,
196
+ });
197
+ return [`Error: ${e.message}`, {}];
198
+ }
199
+ }, {
200
+ name: schema.CONTENT_READER_NAME,
201
+ responseFormat: 'content_and_artifact',
202
+ description: descriptionOverride ?? DEFAULT_CONTENT_READER_DESCRIPTION,
203
+ schema: schema.contentReaderSchema,
204
+ });
205
+ }
206
+
207
+ exports.ARTIFACT_TOOL_NAME = schema.ARTIFACT_TOOL_NAME;
208
+ exports.ARTIFACT_WRITE_ACTIONS = schema.ARTIFACT_WRITE_ACTIONS;
209
+ exports.CONTENT_READER_NAME = schema.CONTENT_READER_NAME;
210
+ exports.CONTENT_READ_ACTIONS = schema.CONTENT_READ_ACTIONS;
211
+ exports.createArtifactTool = createArtifactTool;
212
+ exports.createContentReaderTool = createContentReaderTool;
213
+ //# sourceMappingURL=tool.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.cjs","sources":["../../../../src/tools/artifacts/tool.ts"],"sourcesContent":["/**\n * artifact_tool + content_reader library factories.\n *\n * The library owns the LangChain wiring (schema, description, response\n * shape) and the action dispatch; the runtime supplies a handler bundle\n * matching the `ArtifactWriteHandlers` / `ContentReadHandlers` interface.\n *\n * This keeps 800+ LOC of host-specific handler logic (S3 adapters, file\n * model CRUD, syntax checkers, line utils) out of the library while\n * still centralizing the tool surface every runtime shares.\n */\n\nimport { tool, DynamicStructuredTool } from '@langchain/core/tools';\nimport {\n artifactToolSchema,\n contentReaderSchema,\n ARTIFACT_TOOL_NAME,\n CONTENT_READER_NAME,\n} from './schema';\nimport type {\n ArtifactToolConfig,\n ContentReaderToolConfig,\n ArtifactToolScope,\n ArtifactToolResult,\n WriteArgs,\n EditArgs,\n VerifyArgs,\n DeleteArgs,\n ReadArgs,\n SearchArgs,\n ListArgs,\n InfoArgs,\n ContentIdResolver,\n} from './types';\n\nconst DEFAULT_ARTIFACT_DESCRIPTION = `Author content artifacts that render live in the host's preview panel — this tool does NOT produce downloadable files (use execute_code for those).\n\nActions:\n- write: Create a new artifact. Write a COMPLETE file in one call. The \\`name\\` field MUST include the file extension — it routes the preview (.tsx, .html, .mmd, .svg, .csv, .json, .dot, .md, .drawio).\n- verify: Check an artifact for syntax errors. REQUIRED as the next step after every write/edit on code files — do not render until verify passes.\n- edit: Surgical string replacement — provide old_str (exact match) and new_str. Works on all file types.\n- delete: Remove an artifact and its backing file.\n\nArtifacts are persisted by the host. No manual save needed.`;\n\nconst DEFAULT_CONTENT_READER_DESCRIPTION = `Read and navigate stored content — artifacts authored by artifact_tool, large tool results auto-cached by the host, uploaded file attachments, and code blocks.\n\nRead-only surface. Use write/edit tools (artifact_tool, execute_code) to mutate.\n\nActions:\n- read: Return line ranges from a specific content_id.\n- search: Regex search across a specific content_id with paginated matches.\n- list: Enumerate every content entry currently stored.\n- info: Metadata (size, kind, creation time) for a specific content_id.`;\n\n/**\n * Optional content_id self-healing — if the runtime supplies a resolver,\n * we pre-resolve the ID on every action that takes one so nicknames\n * (e.g., \"Dashboard\") map to canonical IDs.\n */\nasync function resolveContentIdIfPresent(\n resolver: ContentIdResolver | undefined,\n id: string | undefined,\n scope: ArtifactToolScope,\n logger?: { debug: (msg: string) => void },\n): Promise<string | undefined> {\n if (!resolver || !id) return id;\n const out = await resolver.resolve(id, scope);\n if (!out) return id;\n if (out.resolvedId !== id) {\n logger?.debug(\n `[artifact] resolved \"${id}\" → \"${out.resolvedId}\"${out.resolvedName ? ` (\"${out.resolvedName}\")` : ''}`,\n );\n }\n return out.resolvedId;\n}\n\n// ─── Writer tool (artifact_tool) ─────────────────────────────────────────\n\nexport function createArtifactTool(\n config: ArtifactToolConfig,\n): DynamicStructuredTool {\n const { handlers, getScope, resolver, logger, descriptionOverride } = config;\n\n return tool(\n async (rawInput, runnableConfig): Promise<ArtifactToolResult> => {\n const scope = getScope(runnableConfig);\n if (!scope) {\n logger?.warn('[artifact_tool] no scope resolved from runnableConfig');\n return ['Error: No conversation context available', {}];\n }\n\n const input = rawInput as {\n action: 'write' | 'edit' | 'verify' | 'delete';\n content_id?: string;\n content?: string;\n name?: string;\n old_str?: string;\n new_str?: string;\n replace_all?: boolean;\n };\n\n const resolvedContentId = await resolveContentIdIfPresent(\n resolver,\n input.content_id,\n scope,\n logger,\n );\n\n const started = Date.now();\n try {\n switch (input.action) {\n case 'write': {\n const args: WriteArgs = {\n action: 'write',\n content_id: resolvedContentId,\n content: input.content ?? '',\n name: input.name,\n };\n if (!args.content) return ['Error: write requires content', {}];\n return await handlers.write(args, scope);\n }\n case 'edit': {\n if (!resolvedContentId) return ['Error: edit requires content_id', {}];\n const args: EditArgs = {\n action: 'edit',\n content_id: resolvedContentId,\n old_str: input.old_str ?? '',\n new_str: input.new_str ?? '',\n replace_all: input.replace_all,\n };\n if (!args.old_str) return ['Error: edit requires old_str', {}];\n return await handlers.edit(args, scope);\n }\n case 'verify': {\n if (!resolvedContentId) return ['Error: verify requires content_id', {}];\n const args: VerifyArgs = {\n action: 'verify',\n content_id: resolvedContentId,\n };\n return await handlers.verify(args, scope);\n }\n case 'delete': {\n if (!resolvedContentId) return ['Error: delete requires content_id', {}];\n const args: DeleteArgs = {\n action: 'delete',\n content_id: resolvedContentId,\n };\n return await handlers.delete(args, scope);\n }\n default:\n return [`Unknown action: ${(input as { action: string }).action}`, {}];\n }\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n logger?.error('[artifact_tool] handler threw', {\n action: input.action,\n contentId: resolvedContentId,\n error: e.message,\n elapsed: `${Date.now() - started}ms`,\n });\n return [`Error: ${e.message}`, {}];\n }\n },\n {\n name: ARTIFACT_TOOL_NAME,\n responseFormat: 'content_and_artifact',\n description: descriptionOverride ?? DEFAULT_ARTIFACT_DESCRIPTION,\n schema: artifactToolSchema,\n },\n );\n}\n\n// ─── Reader tool (content_reader) ────────────────────────────────────────\n\nexport function createContentReaderTool(\n config: ContentReaderToolConfig,\n): DynamicStructuredTool {\n const { handlers, getScope, resolver, logger, descriptionOverride } = config;\n\n return tool(\n async (rawInput, runnableConfig): Promise<ArtifactToolResult> => {\n const scope = getScope(runnableConfig);\n if (!scope) {\n logger?.warn('[content_reader] no scope resolved from runnableConfig');\n return ['Error: No conversation context available', {}];\n }\n\n const input = rawInput as {\n action: 'read' | 'search' | 'list' | 'info';\n content_id?: string;\n start_line?: number;\n end_line?: number;\n pattern?: string;\n flags?: string;\n context?: number;\n offset?: number;\n limit?: number;\n };\n\n const resolvedContentId = await resolveContentIdIfPresent(\n resolver,\n input.content_id,\n scope,\n logger,\n );\n\n const started = Date.now();\n try {\n switch (input.action) {\n case 'read': {\n if (!resolvedContentId) return ['Error: read requires content_id', {}];\n const args: ReadArgs = {\n action: 'read',\n content_id: resolvedContentId,\n start_line: input.start_line,\n end_line: input.end_line,\n offset: input.offset,\n limit: input.limit,\n };\n return await handlers.read(args, scope);\n }\n case 'search': {\n if (!resolvedContentId) return ['Error: search requires content_id', {}];\n if (!input.pattern) return ['Error: search requires pattern', {}];\n const args: SearchArgs = {\n action: 'search',\n content_id: resolvedContentId,\n pattern: input.pattern,\n flags: input.flags,\n context: input.context,\n offset: input.offset,\n limit: input.limit,\n };\n return await handlers.search(args, scope);\n }\n case 'list': {\n const args: ListArgs = { action: 'list' };\n return await handlers.list(args, scope);\n }\n case 'info': {\n if (!resolvedContentId) return ['Error: info requires content_id', {}];\n const args: InfoArgs = {\n action: 'info',\n content_id: resolvedContentId,\n };\n return await handlers.info(args, scope);\n }\n default:\n return [`Unknown action: ${(input as { action: string }).action}`, {}];\n }\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n logger?.error('[content_reader] handler threw', {\n action: input.action,\n contentId: resolvedContentId,\n error: e.message,\n elapsed: `${Date.now() - started}ms`,\n });\n return [`Error: ${e.message}`, {}];\n }\n },\n {\n name: CONTENT_READER_NAME,\n responseFormat: 'content_and_artifact',\n description: descriptionOverride ?? DEFAULT_CONTENT_READER_DESCRIPTION,\n schema: contentReaderSchema,\n },\n );\n}\n\nexport {\n ARTIFACT_TOOL_NAME,\n CONTENT_READER_NAME,\n ARTIFACT_WRITE_ACTIONS,\n CONTENT_READ_ACTIONS,\n} from './schema';\n"],"names":["tool","ARTIFACT_TOOL_NAME","artifactToolSchema","CONTENT_READER_NAME","contentReaderSchema"],"mappings":"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"}
@@ -37,7 +37,7 @@ const plainTextFormatter = {
37
37
  function createCitationAnchorFormatter(opts = {}) {
38
38
  const toolName = opts.toolName ?? 'file_search';
39
39
  const getOffset = opts.getSourceOffset ?? (() => 0);
40
- const advance = opts.advanceSourceOffset ?? (() => { });
40
+ const advance = opts.advanceSourceOffset ?? ((_by) => { });
41
41
  return {
42
42
  format(chunks) {
43
43
  if (chunks.length === 0) {
@@ -64,9 +64,7 @@ function createCitationAnchorFormatter(opts = {}) {
64
64
  fileName: c.filename,
65
65
  relevance: 1 - c.distance,
66
66
  pages: getPage(c) != null ? [getPage(c)] : [],
67
- pageRelevance: getPage(c) != null
68
- ? { [getPage(c)]: 1 - c.distance }
69
- : {},
67
+ pageRelevance: getPage(c) != null ? { [getPage(c)]: 1 - c.distance } : {},
70
68
  }));
71
69
  advance(chunks.length);
72
70
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"formatter.cjs","sources":["../../../../src/tools/fileSearch/formatter.ts"],"sourcesContent":["/**\n * Default result formatters.\n *\n * - `plainTextFormatter`: CLI / A2A / generic output. No citation anchors.\n * - `citationAnchorFormatter`: ranger-style `\\ue202turn0fileN` anchors with\n * a monotonic `sourceOffset` so multi-call turns stay globally unique.\n *\n * Runtimes can supply their own `FileSearchResultFormatter` to override.\n */\n\nimport type {\n FileSearchResultFormatter,\n FileSearchFile,\n RagChunk,\n} from './types';\n\ntype AnnotatedChunk = RagChunk & {\n filename: string;\n isCurrentMessage: boolean;\n};\n\nexport const plainTextFormatter: FileSearchResultFormatter = {\n format(chunks, { files: _files }) {\n if (chunks.length === 0) {\n return { message: 'No relevant results found in the available files.' };\n }\n const body = chunks\n .map((c) => {\n const page = getPage(c);\n const rel = (1 - c.distance).toFixed(4);\n return (\n `File: ${c.filename}` +\n (page != null ? `\\nPage: ${page}` : '') +\n `\\nRelevance: ${rel}\\nContent: ${c.page_content}\\n`\n );\n })\n .join('\\n---\\n');\n\n const sources = chunks.map((c) => ({\n type: 'file' as const,\n fileId: c.file_id,\n content: c.page_content,\n fileName: c.filename,\n relevance: 1 - c.distance,\n pages: getPage(c) != null ? [getPage(c) as number] : [],\n }));\n\n return { message: body, artifact: { file_search: { sources } } };\n },\n};\n\nexport interface CitationAnchorFormatterOptions {\n /** Tool name used in the `file_search` artifact wrapper. Defaults to `'file_search'`. */\n toolName?: string;\n /**\n * Monotonic counter for source indices within a turn. Pass the SAME\n * function to the formatter across multiple calls in the same turn so\n * anchors stay globally unique.\n */\n getSourceOffset?: () => number;\n /** Called after formatting to advance the offset. */\n advanceSourceOffset?: (by: number) => void;\n}\n\nexport function createCitationAnchorFormatter(\n opts: CitationAnchorFormatterOptions = {},\n): FileSearchResultFormatter {\n const toolName = opts.toolName ?? 'file_search';\n const getOffset = opts.getSourceOffset ?? (() => 0);\n const advance = opts.advanceSourceOffset ?? (() => {});\n\n return {\n format(chunks) {\n if (chunks.length === 0) {\n return {\n message:\n 'No results found or errors occurred while searching the files.',\n };\n }\n const base = getOffset();\n const body = chunks\n .map((c, i) => {\n const globalIndex = base + i;\n const page = getPage(c);\n const rel = (1 - c.distance).toFixed(4);\n return (\n `[Source ${globalIndex}] File: ${c.filename} | Anchor: \\\\ue202turn0file${globalIndex}` +\n (page != null ? ` | Page: ${page}` : '') +\n ` | Relevance: ${rel}\\nContent: ${c.page_content}\\n` +\n `↑ Cite this source using: \\\\ue202turn0file${globalIndex}`\n );\n })\n .join('\\n---\\n');\n\n const sources = chunks.map((c) => ({\n type: 'file' as const,\n fileId: c.file_id,\n content: c.page_content,\n fileName: c.filename,\n relevance: 1 - c.distance,\n pages: getPage(c) != null ? [getPage(c) as number] : [],\n pageRelevance:\n getPage(c) != null\n ? { [getPage(c) as number]: 1 - c.distance }\n : {},\n }));\n\n advance(chunks.length);\n return {\n message: body,\n artifact: { [toolName]: { sources, fileCitations: true } },\n };\n },\n };\n}\n\n/** Extract a 1-indexed page number from the chunk metadata, or null. */\nfunction getPage(chunk: AnnotatedChunk | RagChunk): number | null {\n const raw =\n (chunk.metadata?.page as unknown) ??\n (chunk.metadata?.page_number as unknown) ??\n null;\n if (raw == null) return null;\n const parsed = typeof raw === 'number' ? raw : parseInt(String(raw), 10);\n if (Number.isNaN(parsed) || parsed < 0) return null;\n // rag_api stores 0-indexed; display is 1-indexed\n return parsed + 1;\n}\n\n// Re-export so consumers only import from the formatter module.\nexport type { FileSearchResultFormatter, FileSearchFile, RagChunk };\n"],"names":[],"mappings":";;AAAA;;;;;;;;AAQG;AAaI,MAAM,kBAAkB,GAA8B;AAC3D,IAAA,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAA;AAC9B,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AACvB,YAAA,OAAO,EAAE,OAAO,EAAE,mDAAmD,EAAE;QACzE;QACA,MAAM,IAAI,GAAG;AACV,aAAA,GAAG,CAAC,CAAC,CAAC,KAAI;AACT,YAAA,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC;AACvB,YAAA,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AACvC,YAAA,QACE,CAAA,MAAA,EAAS,CAAC,CAAC,QAAQ,CAAA,CAAE;AACrB,iBAAC,IAAI,IAAI,IAAI,GAAG,CAAA,QAAA,EAAW,IAAI,CAAA,CAAE,GAAG,EAAE,CAAC;AACvC,gBAAA,CAAA,aAAA,EAAgB,GAAG,CAAA,WAAA,EAAc,CAAC,CAAC,YAAY,CAAA,EAAA,CAAI;AAEvD,QAAA,CAAC;aACA,IAAI,CAAC,SAAS,CAAC;QAElB,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;AACjC,YAAA,IAAI,EAAE,MAAe;YACrB,MAAM,EAAE,CAAC,CAAC,OAAO;YACjB,OAAO,EAAE,CAAC,CAAC,YAAY;YACvB,QAAQ,EAAE,CAAC,CAAC,QAAQ;AACpB,YAAA,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ;AACzB,YAAA,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAW,CAAC,GAAG,EAAE;AACxD,SAAA,CAAC,CAAC;AAEH,QAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;IAClE,CAAC;;AAgBG,SAAU,6BAA6B,CAC3C,IAAA,GAAuC,EAAE,EAAA;AAEzC,IAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,aAAa;AAC/C,IAAA,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,KAAK,MAAM,CAAC,CAAC;AACnD,IAAA,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,KAAK,MAAK,EAAE,CAAC,CAAC;IAEtD,OAAO;AACL,QAAA,MAAM,CAAC,MAAM,EAAA;AACX,YAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;gBACvB,OAAO;AACL,oBAAA,OAAO,EACL,gEAAgE;iBACnE;YACH;AACA,YAAA,MAAM,IAAI,GAAG,SAAS,EAAE;YACxB,MAAM,IAAI,GAAG;AACV,iBAAA,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACZ,gBAAA,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;AAC5B,gBAAA,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC;AACvB,gBAAA,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;gBACvC,QACE,WAAW,WAAW,CAAA,QAAA,EAAW,CAAC,CAAC,QAAQ,CAAA,2BAAA,EAA8B,WAAW,CAAA,CAAE;AACtF,qBAAC,IAAI,IAAI,IAAI,GAAG,CAAA,SAAA,EAAY,IAAI,CAAA,CAAE,GAAG,EAAE,CAAC;AACxC,oBAAA,CAAA,cAAA,EAAiB,GAAG,CAAA,WAAA,EAAc,CAAC,CAAC,YAAY,CAAA,EAAA,CAAI;oBACpD,CAAA,0CAAA,EAA6C,WAAW,CAAA,CAAE;AAE9D,YAAA,CAAC;iBACA,IAAI,CAAC,SAAS,CAAC;YAElB,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;AACjC,gBAAA,IAAI,EAAE,MAAe;gBACrB,MAAM,EAAE,CAAC,CAAC,OAAO;gBACjB,OAAO,EAAE,CAAC,CAAC,YAAY;gBACvB,QAAQ,EAAE,CAAC,CAAC,QAAQ;AACpB,gBAAA,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ;AACzB,gBAAA,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAW,CAAC,GAAG,EAAE;AACvD,gBAAA,aAAa,EACX,OAAO,CAAC,CAAC,CAAC,IAAI;AACZ,sBAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAW,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ;AAC1C,sBAAE,EAAE;AACT,aAAA,CAAC,CAAC;AAEH,YAAA,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;YACtB,OAAO;AACL,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,QAAQ,EAAE,EAAE,CAAC,QAAQ,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE;aAC3D;QACH,CAAC;KACF;AACH;AAEA;AACA,SAAS,OAAO,CAAC,KAAgC,EAAA;AAC/C,IAAA,MAAM,GAAG,GACN,KAAK,CAAC,QAAQ,EAAE,IAAgB;QAChC,KAAK,CAAC,QAAQ,EAAE,WAAuB;AACxC,QAAA,IAAI;IACN,IAAI,GAAG,IAAI,IAAI;AAAE,QAAA,OAAO,IAAI;IAC5B,MAAM,MAAM,GAAG,OAAO,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;IACxE,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;AAAE,QAAA,OAAO,IAAI;;IAEnD,OAAO,MAAM,GAAG,CAAC;AACnB;;;;;"}
1
+ {"version":3,"file":"formatter.cjs","sources":["../../../../src/tools/fileSearch/formatter.ts"],"sourcesContent":["/**\n * Default result formatters.\n *\n * - `plainTextFormatter`: CLI / A2A / generic output. No citation anchors.\n * - `citationAnchorFormatter`: ranger-style `\\ue202turn0fileN` anchors with\n * a monotonic `sourceOffset` so multi-call turns stay globally unique.\n *\n * Runtimes can supply their own `FileSearchResultFormatter` to override.\n */\n\nimport type {\n FileSearchResultFormatter,\n FileSearchFile,\n RagChunk,\n} from './types';\n\ntype AnnotatedChunk = RagChunk & {\n filename: string;\n isCurrentMessage: boolean;\n};\n\nexport const plainTextFormatter: FileSearchResultFormatter = {\n format(chunks, { files: _files }) {\n if (chunks.length === 0) {\n return { message: 'No relevant results found in the available files.' };\n }\n const body = chunks\n .map((c) => {\n const page = getPage(c);\n const rel = (1 - c.distance).toFixed(4);\n return (\n `File: ${c.filename}` +\n (page != null ? `\\nPage: ${page}` : '') +\n `\\nRelevance: ${rel}\\nContent: ${c.page_content}\\n`\n );\n })\n .join('\\n---\\n');\n\n const sources = chunks.map((c) => ({\n type: 'file' as const,\n fileId: c.file_id,\n content: c.page_content,\n fileName: c.filename,\n relevance: 1 - c.distance,\n pages: getPage(c) != null ? [getPage(c) as number] : [],\n }));\n\n return { message: body, artifact: { file_search: { sources } } };\n },\n};\n\nexport interface CitationAnchorFormatterOptions {\n /** Tool name used in the `file_search` artifact wrapper. Defaults to `'file_search'`. */\n toolName?: string;\n /**\n * Monotonic counter for source indices within a turn. Pass the SAME\n * function to the formatter across multiple calls in the same turn so\n * anchors stay globally unique.\n */\n getSourceOffset?: () => number;\n /** Called after formatting to advance the offset. */\n advanceSourceOffset?: (by: number) => void;\n}\n\nexport function createCitationAnchorFormatter(\n opts: CitationAnchorFormatterOptions = {}\n): FileSearchResultFormatter {\n const toolName = opts.toolName ?? 'file_search';\n const getOffset = opts.getSourceOffset ?? ((): number => 0);\n const advance = opts.advanceSourceOffset ?? ((_by: number): void => {});\n\n return {\n format(chunks): { message: string; artifact?: unknown } {\n if (chunks.length === 0) {\n return {\n message:\n 'No results found or errors occurred while searching the files.',\n };\n }\n const base = getOffset();\n const body = chunks\n .map((c, i) => {\n const globalIndex = base + i;\n const page = getPage(c);\n const rel = (1 - c.distance).toFixed(4);\n return (\n `[Source ${globalIndex}] File: ${c.filename} | Anchor: \\\\ue202turn0file${globalIndex}` +\n (page != null ? ` | Page: ${page}` : '') +\n ` | Relevance: ${rel}\\nContent: ${c.page_content}\\n` +\n `↑ Cite this source using: \\\\ue202turn0file${globalIndex}`\n );\n })\n .join('\\n---\\n');\n\n const sources = chunks.map((c) => ({\n type: 'file' as const,\n fileId: c.file_id,\n content: c.page_content,\n fileName: c.filename,\n relevance: 1 - c.distance,\n pages: getPage(c) != null ? [getPage(c) as number] : [],\n pageRelevance:\n getPage(c) != null ? { [getPage(c) as number]: 1 - c.distance } : {},\n }));\n\n advance(chunks.length);\n return {\n message: body,\n artifact: { [toolName]: { sources, fileCitations: true } },\n };\n },\n };\n}\n\n/** Extract a 1-indexed page number from the chunk metadata, or null. */\nfunction getPage(chunk: AnnotatedChunk | RagChunk): number | null {\n const raw =\n (chunk.metadata?.page as unknown) ??\n (chunk.metadata?.page_number as unknown) ??\n null;\n if (raw == null) return null;\n const parsed = typeof raw === 'number' ? raw : parseInt(String(raw), 10);\n if (Number.isNaN(parsed) || parsed < 0) return null;\n // rag_api stores 0-indexed; display is 1-indexed\n return parsed + 1;\n}\n\n// Re-export so consumers only import from the formatter module.\nexport type { FileSearchResultFormatter, FileSearchFile, RagChunk };\n"],"names":[],"mappings":";;AAAA;;;;;;;;AAQG;AAaI,MAAM,kBAAkB,GAA8B;AAC3D,IAAA,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAA;AAC9B,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AACvB,YAAA,OAAO,EAAE,OAAO,EAAE,mDAAmD,EAAE;QACzE;QACA,MAAM,IAAI,GAAG;AACV,aAAA,GAAG,CAAC,CAAC,CAAC,KAAI;AACT,YAAA,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC;AACvB,YAAA,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AACvC,YAAA,QACE,CAAA,MAAA,EAAS,CAAC,CAAC,QAAQ,CAAA,CAAE;AACrB,iBAAC,IAAI,IAAI,IAAI,GAAG,CAAA,QAAA,EAAW,IAAI,CAAA,CAAE,GAAG,EAAE,CAAC;AACvC,gBAAA,CAAA,aAAA,EAAgB,GAAG,CAAA,WAAA,EAAc,CAAC,CAAC,YAAY,CAAA,EAAA,CAAI;AAEvD,QAAA,CAAC;aACA,IAAI,CAAC,SAAS,CAAC;QAElB,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;AACjC,YAAA,IAAI,EAAE,MAAe;YACrB,MAAM,EAAE,CAAC,CAAC,OAAO;YACjB,OAAO,EAAE,CAAC,CAAC,YAAY;YACvB,QAAQ,EAAE,CAAC,CAAC,QAAQ;AACpB,YAAA,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ;AACzB,YAAA,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAW,CAAC,GAAG,EAAE;AACxD,SAAA,CAAC,CAAC;AAEH,QAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;IAClE,CAAC;;AAgBG,SAAU,6BAA6B,CAC3C,IAAA,GAAuC,EAAE,EAAA;AAEzC,IAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,aAAa;AAC/C,IAAA,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,KAAK,MAAc,CAAC,CAAC;AAC3D,IAAA,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,KAAK,CAAC,GAAW,KAAU,EAAE,CAAC,CAAC;IAEvE,OAAO;AACL,QAAA,MAAM,CAAC,MAAM,EAAA;AACX,YAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;gBACvB,OAAO;AACL,oBAAA,OAAO,EACL,gEAAgE;iBACnE;YACH;AACA,YAAA,MAAM,IAAI,GAAG,SAAS,EAAE;YACxB,MAAM,IAAI,GAAG;AACV,iBAAA,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACZ,gBAAA,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;AAC5B,gBAAA,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC;AACvB,gBAAA,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;gBACvC,QACE,WAAW,WAAW,CAAA,QAAA,EAAW,CAAC,CAAC,QAAQ,CAAA,2BAAA,EAA8B,WAAW,CAAA,CAAE;AACtF,qBAAC,IAAI,IAAI,IAAI,GAAG,CAAA,SAAA,EAAY,IAAI,CAAA,CAAE,GAAG,EAAE,CAAC;AACxC,oBAAA,CAAA,cAAA,EAAiB,GAAG,CAAA,WAAA,EAAc,CAAC,CAAC,YAAY,CAAA,EAAA,CAAI;oBACpD,CAAA,0CAAA,EAA6C,WAAW,CAAA,CAAE;AAE9D,YAAA,CAAC;iBACA,IAAI,CAAC,SAAS,CAAC;YAElB,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;AACjC,gBAAA,IAAI,EAAE,MAAe;gBACrB,MAAM,EAAE,CAAC,CAAC,OAAO;gBACjB,OAAO,EAAE,CAAC,CAAC,YAAY;gBACvB,QAAQ,EAAE,CAAC,CAAC,QAAQ;AACpB,gBAAA,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ;AACzB,gBAAA,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAW,CAAC,GAAG,EAAE;gBACvD,aAAa,EACX,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAW,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE;AACvE,aAAA,CAAC,CAAC;AAEH,YAAA,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;YACtB,OAAO;AACL,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,QAAQ,EAAE,EAAE,CAAC,QAAQ,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE;aAC3D;QACH,CAAC;KACF;AACH;AAEA;AACA,SAAS,OAAO,CAAC,KAAgC,EAAA;AAC/C,IAAA,MAAM,GAAG,GACN,KAAK,CAAC,QAAQ,EAAE,IAAgB;QAChC,KAAK,CAAC,QAAQ,EAAE,WAAuB;AACxC,QAAA,IAAI;IACN,IAAI,GAAG,IAAI,IAAI;AAAE,QAAA,OAAO,IAAI;IAC5B,MAAM,MAAM,GAAG,OAAO,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;IACxE,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;AAAE,QAAA,OAAO,IAAI;;IAEnD,OAAO,MAAM,GAAG,CAAC;AACnB;;;;;"}
@@ -15,9 +15,7 @@ var env = require('@langchain/core/utils/env');
15
15
  const RAG_API_URL_ENV = 'RAG_API_URL';
16
16
  /** Resolve base URL at call time so env-var changes propagate. */
17
17
  function getRagBaseUrl(override) {
18
- const url = override ??
19
- env.getEnvironmentVariable(RAG_API_URL_ENV) ??
20
- '';
18
+ const url = override ?? env.getEnvironmentVariable(RAG_API_URL_ENV) ?? '';
21
19
  if (!url) {
22
20
  throw new Error(`file_search: ${RAG_API_URL_ENV} is not configured. ` +
23
21
  `Set the env var or pass baseUrl to HttpRagClient.`);
@@ -90,10 +88,10 @@ class HttpRagClient {
90
88
  return resp
91
89
  .filter((row) => Array.isArray(row) && row.length === 2)
92
90
  .map(([doc, distance]) => ({
93
- file_id: doc?.metadata?.file_id ?? file_id,
94
- page_content: doc?.page_content ?? '',
91
+ file_id: doc.metadata?.file_id ?? file_id,
92
+ page_content: doc.page_content ?? '',
95
93
  distance: typeof distance === 'number' ? distance : 1,
96
- metadata: doc?.metadata,
94
+ metadata: doc.metadata,
97
95
  }));
98
96
  }
99
97
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ragClient.cjs","sources":["../../../../src/tools/fileSearch/ragClient.ts"],"sourcesContent":["/**\n * Default HTTP RAG client. Posts to `${baseUrl}/query` with the shape\n * rag_api expects (`{ file_id, query, k, entity_id? }`). Runtimes that\n * use a different vector backend implement their own `RagClient`.\n *\n * Auth is runtime-provided per call (via `authHeaders` on the params) so\n * short-lived tokens can be minted per request without the client\n * caching stale credentials.\n */\n\nimport fetch from 'node-fetch';\nimport { getEnvironmentVariable } from '@langchain/core/utils/env';\nimport type {\n RagClient,\n RagQueryParams,\n RagChunk,\n FileSearchToolLogger,\n} from './types';\n\nexport const RAG_API_URL_ENV = 'RAG_API_URL';\n\n/** Resolve base URL at call time so env-var changes propagate. */\nexport function getRagBaseUrl(override?: string): string {\n const url =\n override ??\n getEnvironmentVariable(RAG_API_URL_ENV) ??\n '';\n if (!url) {\n throw new Error(\n `file_search: ${RAG_API_URL_ENV} is not configured. ` +\n `Set the env var or pass baseUrl to HttpRagClient.`,\n );\n }\n return url.replace(/\\/$/, '');\n}\n\nexport interface HttpRagClientOptions {\n /** Base URL of the RAG service (no trailing slash). Falls back to env. */\n baseUrl?: string;\n /** Default headers sent on every request (e.g., a static API key). */\n defaultHeaders?: Record<string, string>;\n /** Default timeout if params don't override. Default 15_000. */\n defaultTimeoutMs?: number;\n logger?: FileSearchToolLogger;\n}\n\n/**\n * Expected rag_api response shape: `[[{ page_content, metadata }, distance], ...]`\n * — an array of [doc, score] tuples. Normalized here into `RagChunk[]`.\n */\ntype RagApiResponse = Array<\n [\n {\n page_content: string;\n metadata?: Record<string, unknown>;\n },\n number,\n ]\n>;\n\nexport class HttpRagClient implements RagClient {\n private readonly baseUrlOverride?: string;\n private readonly defaultHeaders: Record<string, string>;\n private readonly defaultTimeoutMs: number;\n private readonly logger?: FileSearchToolLogger;\n\n constructor(opts: HttpRagClientOptions = {}) {\n this.baseUrlOverride = opts.baseUrl;\n this.defaultHeaders = opts.defaultHeaders ?? {};\n this.defaultTimeoutMs = opts.defaultTimeoutMs ?? 15_000;\n this.logger = opts.logger;\n }\n\n async query(params: RagQueryParams): Promise<RagChunk[]> {\n const baseUrl = getRagBaseUrl(this.baseUrlOverride);\n const url = `${baseUrl}/query`;\n\n const body: Record<string, unknown> = {\n file_id: params.file_id,\n query: params.query,\n k: params.k ?? 10,\n };\n if (params.entity_id) body.entity_id = params.entity_id;\n if (params.scope) body.scope = params.scope;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...this.defaultHeaders,\n ...(params.authHeaders ?? {}),\n };\n\n const timeoutMs = params.timeoutMs ?? this.defaultTimeoutMs;\n const controller =\n typeof AbortController !== 'undefined' ? new AbortController() : null;\n const timer = controller\n ? setTimeout(() => controller.abort(), timeoutMs)\n : null;\n\n this.logger?.debug('[file_search] RAG query', {\n url,\n file_id: params.file_id,\n k: body.k,\n });\n\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: controller?.signal as unknown as undefined,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(\n `RAG query failed: ${res.status} ${res.statusText} — ${text.slice(0, 200)}`,\n );\n }\n const json = (await res.json()) as RagApiResponse;\n return this.normalize(params.file_id, json);\n } finally {\n if (timer) clearTimeout(timer);\n }\n }\n\n /** Convert rag_api's tuple format into the library's normalized shape. */\n private normalize(file_id: string, resp: RagApiResponse): RagChunk[] {\n if (!Array.isArray(resp)) {\n this.logger?.warn('[file_search] RAG response not an array', { resp });\n return [];\n }\n return resp\n .filter((row) => Array.isArray(row) && row.length === 2)\n .map(([doc, distance]) => ({\n file_id:\n (doc?.metadata?.file_id as string | undefined) ?? file_id,\n page_content: doc?.page_content ?? '',\n distance: typeof distance === 'number' ? distance : 1,\n metadata: doc?.metadata,\n }));\n }\n}\n"],"names":["getEnvironmentVariable"],"mappings":"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"}
1
+ {"version":3,"file":"ragClient.cjs","sources":["../../../../src/tools/fileSearch/ragClient.ts"],"sourcesContent":["/**\n * Default HTTP RAG client. Posts to `${baseUrl}/query` with the shape\n * rag_api expects (`{ file_id, query, k, entity_id? }`). Runtimes that\n * use a different vector backend implement their own `RagClient`.\n *\n * Auth is runtime-provided per call (via `authHeaders` on the params) so\n * short-lived tokens can be minted per request without the client\n * caching stale credentials.\n */\n\nimport fetch from 'node-fetch';\nimport { getEnvironmentVariable } from '@langchain/core/utils/env';\nimport type {\n RagClient,\n RagQueryParams,\n RagChunk,\n FileSearchToolLogger,\n} from './types';\n\nexport const RAG_API_URL_ENV = 'RAG_API_URL';\n\n/** Resolve base URL at call time so env-var changes propagate. */\nexport function getRagBaseUrl(override?: string): string {\n const url = override ?? getEnvironmentVariable(RAG_API_URL_ENV) ?? '';\n if (!url) {\n throw new Error(\n `file_search: ${RAG_API_URL_ENV} is not configured. ` +\n `Set the env var or pass baseUrl to HttpRagClient.`\n );\n }\n return url.replace(/\\/$/, '');\n}\n\nexport interface HttpRagClientOptions {\n /** Base URL of the RAG service (no trailing slash). Falls back to env. */\n baseUrl?: string;\n /** Default headers sent on every request (e.g., a static API key). */\n defaultHeaders?: Record<string, string>;\n /** Default timeout if params don't override. Default 15_000. */\n defaultTimeoutMs?: number;\n logger?: FileSearchToolLogger;\n}\n\n/**\n * Expected rag_api response shape: `[[{ page_content, metadata }, distance], ...]`\n * — an array of [doc, score] tuples. Normalized here into `RagChunk[]`.\n */\ntype RagApiResponse = Array<\n [\n {\n page_content: string;\n metadata?: Record<string, unknown>;\n },\n number,\n ]\n>;\n\nexport class HttpRagClient implements RagClient {\n private readonly baseUrlOverride?: string;\n private readonly defaultHeaders: Record<string, string>;\n private readonly defaultTimeoutMs: number;\n private readonly logger?: FileSearchToolLogger;\n\n constructor(opts: HttpRagClientOptions = {}) {\n this.baseUrlOverride = opts.baseUrl;\n this.defaultHeaders = opts.defaultHeaders ?? {};\n this.defaultTimeoutMs = opts.defaultTimeoutMs ?? 15_000;\n this.logger = opts.logger;\n }\n\n async query(params: RagQueryParams): Promise<RagChunk[]> {\n const baseUrl = getRagBaseUrl(this.baseUrlOverride);\n const url = `${baseUrl}/query`;\n\n const body: Record<string, unknown> = {\n file_id: params.file_id,\n query: params.query,\n k: params.k ?? 10,\n };\n if (params.entity_id) body.entity_id = params.entity_id;\n if (params.scope) body.scope = params.scope;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...this.defaultHeaders,\n ...(params.authHeaders ?? {}),\n };\n\n const timeoutMs = params.timeoutMs ?? this.defaultTimeoutMs;\n const controller =\n typeof AbortController !== 'undefined' ? new AbortController() : null;\n const timer = controller\n ? setTimeout(() => controller.abort(), timeoutMs)\n : null;\n\n this.logger?.debug('[file_search] RAG query', {\n url,\n file_id: params.file_id,\n k: body.k,\n });\n\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: controller?.signal as unknown as undefined,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(\n `RAG query failed: ${res.status} ${res.statusText} — ${text.slice(0, 200)}`\n );\n }\n const json = (await res.json()) as RagApiResponse;\n return this.normalize(params.file_id, json);\n } finally {\n if (timer) clearTimeout(timer);\n }\n }\n\n /** Convert rag_api's tuple format into the library's normalized shape. */\n private normalize(file_id: string, resp: RagApiResponse): RagChunk[] {\n if (!Array.isArray(resp)) {\n this.logger?.warn('[file_search] RAG response not an array', { resp });\n return [];\n }\n return resp\n .filter((row) => Array.isArray(row) && row.length === 2)\n .map(([doc, distance]) => ({\n file_id: (doc.metadata?.file_id as string | undefined) ?? file_id,\n page_content: doc.page_content ?? '',\n distance: typeof distance === 'number' ? distance : 1,\n metadata: doc.metadata,\n }));\n }\n}\n"],"names":["getEnvironmentVariable"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"schema.cjs","sources":["../../../../src/tools/fileSearch/schema.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const fileSearchInputSchema = z.object({\n query: z\n .string()\n .describe(\n \"A natural language query to search for relevant information in the files. Be SPECIFIC and TARGETED — use keywords for the specific section or topic you need. For comprehensive tasks (summaries, overviews), call this tool multiple times with different targeted queries (e.g., 'introduction', 'methodology', 'results', 'conclusions') rather than one broad query.\",\n ),\n target_files: z\n .array(z.string())\n .optional()\n .describe(\n 'Optional list of filenames (or partial names) to limit the search to. When provided, only files whose name contains one of these strings will be searched. Use this to avoid searching irrelevant files. Omit to search all available files.',\n ),\n});\n\nexport type FileSearchInput = z.infer<typeof fileSearchInputSchema>;\n\nexport const FileSearchToolName = 'file_search';\n"],"names":["z"],"mappings":";;;;AAEO,MAAM,qBAAqB,GAAGA,KAAC,CAAC,MAAM,CAAC;AAC5C,IAAA,KAAK,EAAEA;AACJ,SAAA,MAAM;SACN,QAAQ,CACP,0WAA0W,CAC3W;AACH,IAAA,YAAY,EAAEA;AACX,SAAA,KAAK,CAACA,KAAC,CAAC,MAAM,EAAE;AAChB,SAAA,QAAQ;SACR,QAAQ,CACP,8OAA8O,CAC/O;AACJ,CAAA;AAIM,MAAM,kBAAkB,GAAG;;;;;"}
1
+ {"version":3,"file":"schema.cjs","sources":["../../../../src/tools/fileSearch/schema.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const fileSearchInputSchema = z.object({\n query: z\n .string()\n .describe(\n \"A natural language query to search for relevant information in the files. Be SPECIFIC and TARGETED — use keywords for the specific section or topic you need. For comprehensive tasks (summaries, overviews), call this tool multiple times with different targeted queries (e.g., 'introduction', 'methodology', 'results', 'conclusions') rather than one broad query.\"\n ),\n target_files: z\n .array(z.string())\n .optional()\n .describe(\n 'Optional list of filenames (or partial names) to limit the search to. When provided, only files whose name contains one of these strings will be searched. Use this to avoid searching irrelevant files. Omit to search all available files.'\n ),\n});\n\nexport type FileSearchInput = z.infer<typeof fileSearchInputSchema>;\n\nexport const FileSearchToolName = 'file_search';\n"],"names":["z"],"mappings":";;;;AAEO,MAAM,qBAAqB,GAAGA,KAAC,CAAC,MAAM,CAAC;AAC5C,IAAA,KAAK,EAAEA;AACJ,SAAA,MAAM;SACN,QAAQ,CACP,0WAA0W,CAC3W;AACH,IAAA,YAAY,EAAEA;AACX,SAAA,KAAK,CAACA,KAAC,CAAC,MAAM,EAAE;AAChB,SAAA,QAAQ;SACR,QAAQ,CACP,8OAA8O,CAC/O;AACJ,CAAA;AAIM,MAAM,kBAAkB,GAAG;;;;;"}