@zelari/core 0.7.9

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 (202) hide show
  1. package/LICENSE +21 -0
  2. package/dist/agents/advancedTools.d.ts +7 -0
  3. package/dist/agents/advancedTools.d.ts.map +1 -0
  4. package/dist/agents/advancedTools.js +115 -0
  5. package/dist/agents/advancedTools.js.map +1 -0
  6. package/dist/agents/councilApi.d.ts +328 -0
  7. package/dist/agents/councilApi.d.ts.map +1 -0
  8. package/dist/agents/councilApi.js +952 -0
  9. package/dist/agents/councilApi.js.map +1 -0
  10. package/dist/agents/councilDirectives.d.ts +26 -0
  11. package/dist/agents/councilDirectives.d.ts.map +1 -0
  12. package/dist/agents/councilDirectives.js +98 -0
  13. package/dist/agents/councilDirectives.js.map +1 -0
  14. package/dist/agents/harnessToolBridge.d.ts +26 -0
  15. package/dist/agents/harnessToolBridge.d.ts.map +1 -0
  16. package/dist/agents/harnessToolBridge.js +60 -0
  17. package/dist/agents/harnessToolBridge.js.map +1 -0
  18. package/dist/agents/promoteMember.d.ts +77 -0
  19. package/dist/agents/promoteMember.d.ts.map +1 -0
  20. package/dist/agents/promoteMember.js +210 -0
  21. package/dist/agents/promoteMember.js.map +1 -0
  22. package/dist/agents/promptModules.d.ts +20 -0
  23. package/dist/agents/promptModules.d.ts.map +1 -0
  24. package/dist/agents/promptModules.js +139 -0
  25. package/dist/agents/promptModules.js.map +1 -0
  26. package/dist/agents/roles.d.ts +40 -0
  27. package/dist/agents/roles.d.ts.map +1 -0
  28. package/dist/agents/roles.js +352 -0
  29. package/dist/agents/roles.js.map +1 -0
  30. package/dist/agents/skills/builtin/debugging.d.ts +2 -0
  31. package/dist/agents/skills/builtin/debugging.d.ts.map +1 -0
  32. package/dist/agents/skills/builtin/debugging.js +248 -0
  33. package/dist/agents/skills/builtin/debugging.js.map +1 -0
  34. package/dist/agents/skills/builtin/docs.d.ts +2 -0
  35. package/dist/agents/skills/builtin/docs.d.ts.map +1 -0
  36. package/dist/agents/skills/builtin/docs.js +291 -0
  37. package/dist/agents/skills/builtin/docs.js.map +1 -0
  38. package/dist/agents/skills/builtin/git-ops.d.ts +2 -0
  39. package/dist/agents/skills/builtin/git-ops.d.ts.map +1 -0
  40. package/dist/agents/skills/builtin/git-ops.js +301 -0
  41. package/dist/agents/skills/builtin/git-ops.js.map +1 -0
  42. package/dist/agents/skills/builtin/planning.d.ts +2 -0
  43. package/dist/agents/skills/builtin/planning.d.ts.map +1 -0
  44. package/dist/agents/skills/builtin/planning.js +335 -0
  45. package/dist/agents/skills/builtin/planning.js.map +1 -0
  46. package/dist/agents/skills/builtin/refactoring.d.ts +2 -0
  47. package/dist/agents/skills/builtin/refactoring.d.ts.map +1 -0
  48. package/dist/agents/skills/builtin/refactoring.js +261 -0
  49. package/dist/agents/skills/builtin/refactoring.js.map +1 -0
  50. package/dist/agents/skills/builtin/review.d.ts +2 -0
  51. package/dist/agents/skills/builtin/review.d.ts.map +1 -0
  52. package/dist/agents/skills/builtin/review.js +302 -0
  53. package/dist/agents/skills/builtin/review.js.map +1 -0
  54. package/dist/agents/skills/builtin/testing.d.ts +2 -0
  55. package/dist/agents/skills/builtin/testing.d.ts.map +1 -0
  56. package/dist/agents/skills/builtin/testing.js +245 -0
  57. package/dist/agents/skills/builtin/testing.js.map +1 -0
  58. package/dist/agents/skills.d.ts +138 -0
  59. package/dist/agents/skills.d.ts.map +1 -0
  60. package/dist/agents/skills.js +277 -0
  61. package/dist/agents/skills.js.map +1 -0
  62. package/dist/agents/systemPromptBuilder.d.ts +45 -0
  63. package/dist/agents/systemPromptBuilder.d.ts.map +1 -0
  64. package/dist/agents/systemPromptBuilder.js +159 -0
  65. package/dist/agents/systemPromptBuilder.js.map +1 -0
  66. package/dist/agents/toolSchemas.d.ts +55 -0
  67. package/dist/agents/toolSchemas.d.ts.map +1 -0
  68. package/dist/agents/toolSchemas.js +316 -0
  69. package/dist/agents/toolSchemas.js.map +1 -0
  70. package/dist/agents/tools.d.ts +67 -0
  71. package/dist/agents/tools.d.ts.map +1 -0
  72. package/dist/agents/tools.js +225 -0
  73. package/dist/agents/tools.js.map +1 -0
  74. package/dist/agents/vaultTools.d.ts +9 -0
  75. package/dist/agents/vaultTools.d.ts.map +1 -0
  76. package/dist/agents/vaultTools.js +134 -0
  77. package/dist/agents/vaultTools.js.map +1 -0
  78. package/dist/core/AgentHarness.d.ts +250 -0
  79. package/dist/core/AgentHarness.d.ts.map +1 -0
  80. package/dist/core/AgentHarness.js +614 -0
  81. package/dist/core/AgentHarness.js.map +1 -0
  82. package/dist/core/providerStream.d.ts +61 -0
  83. package/dist/core/providerStream.d.ts.map +1 -0
  84. package/dist/core/providerStream.js +99 -0
  85. package/dist/core/providerStream.js.map +1 -0
  86. package/dist/core/sessionJsonl.d.ts +50 -0
  87. package/dist/core/sessionJsonl.d.ts.map +1 -0
  88. package/dist/core/sessionJsonl.js +99 -0
  89. package/dist/core/sessionJsonl.js.map +1 -0
  90. package/dist/core/tools/auditLog.d.ts +14 -0
  91. package/dist/core/tools/auditLog.d.ts.map +1 -0
  92. package/dist/core/tools/auditLog.js +26 -0
  93. package/dist/core/tools/auditLog.js.map +1 -0
  94. package/dist/core/tools/builtin/_walk.d.ts +40 -0
  95. package/dist/core/tools/builtin/_walk.d.ts.map +1 -0
  96. package/dist/core/tools/builtin/_walk.js +129 -0
  97. package/dist/core/tools/builtin/_walk.js.map +1 -0
  98. package/dist/core/tools/builtin/diff.d.ts +45 -0
  99. package/dist/core/tools/builtin/diff.d.ts.map +1 -0
  100. package/dist/core/tools/builtin/diff.js +477 -0
  101. package/dist/core/tools/builtin/diff.js.map +1 -0
  102. package/dist/core/tools/builtin/filesystem.d.ts +45 -0
  103. package/dist/core/tools/builtin/filesystem.d.ts.map +1 -0
  104. package/dist/core/tools/builtin/filesystem.js +110 -0
  105. package/dist/core/tools/builtin/filesystem.js.map +1 -0
  106. package/dist/core/tools/builtin/listFiles.d.ts +18 -0
  107. package/dist/core/tools/builtin/listFiles.d.ts.map +1 -0
  108. package/dist/core/tools/builtin/listFiles.js +48 -0
  109. package/dist/core/tools/builtin/listFiles.js.map +1 -0
  110. package/dist/core/tools/builtin/search.d.ts +49 -0
  111. package/dist/core/tools/builtin/search.d.ts.map +1 -0
  112. package/dist/core/tools/builtin/search.js +148 -0
  113. package/dist/core/tools/builtin/search.js.map +1 -0
  114. package/dist/core/tools/builtin/shell.d.ts +27 -0
  115. package/dist/core/tools/builtin/shell.d.ts.map +1 -0
  116. package/dist/core/tools/builtin/shell.js +98 -0
  117. package/dist/core/tools/builtin/shell.js.map +1 -0
  118. package/dist/core/tools/builtin/shellResolver.d.ts +25 -0
  119. package/dist/core/tools/builtin/shellResolver.d.ts.map +1 -0
  120. package/dist/core/tools/builtin/shellResolver.js +117 -0
  121. package/dist/core/tools/builtin/shellResolver.js.map +1 -0
  122. package/dist/core/tools/builtin/web.d.ts +43 -0
  123. package/dist/core/tools/builtin/web.d.ts.map +1 -0
  124. package/dist/core/tools/builtin/web.js +208 -0
  125. package/dist/core/tools/builtin/web.js.map +1 -0
  126. package/dist/core/tools/registry.d.ts +31 -0
  127. package/dist/core/tools/registry.d.ts.map +1 -0
  128. package/dist/core/tools/registry.js +115 -0
  129. package/dist/core/tools/registry.js.map +1 -0
  130. package/dist/core/tools/toolTypes.d.ts +60 -0
  131. package/dist/core/tools/toolTypes.d.ts.map +1 -0
  132. package/dist/core/tools/toolTypes.js +8 -0
  133. package/dist/core/tools/toolTypes.js.map +1 -0
  134. package/dist/core/tools/zodBridge.d.ts +6 -0
  135. package/dist/core/tools/zodBridge.d.ts.map +1 -0
  136. package/dist/core/tools/zodBridge.js +56 -0
  137. package/dist/core/tools/zodBridge.js.map +1 -0
  138. package/dist/council/index.d.ts +14 -0
  139. package/dist/council/index.d.ts.map +1 -0
  140. package/dist/council/index.js +14 -0
  141. package/dist/council/index.js.map +1 -0
  142. package/dist/council/modeBanners.d.ts +5 -0
  143. package/dist/council/modeBanners.d.ts.map +1 -0
  144. package/dist/council/modeBanners.js +10 -0
  145. package/dist/council/modeBanners.js.map +1 -0
  146. package/dist/council/runMode.d.ts +25 -0
  147. package/dist/council/runMode.d.ts.map +1 -0
  148. package/dist/council/runMode.js +41 -0
  149. package/dist/council/runMode.js.map +1 -0
  150. package/dist/events/index.d.ts +6 -0
  151. package/dist/events/index.d.ts.map +1 -0
  152. package/dist/events/index.js +6 -0
  153. package/dist/events/index.js.map +1 -0
  154. package/dist/harness/index.d.ts +9 -0
  155. package/dist/harness/index.d.ts.map +1 -0
  156. package/dist/harness/index.js +9 -0
  157. package/dist/harness/index.js.map +1 -0
  158. package/dist/harness/tools/index.d.ts +20 -0
  159. package/dist/harness/tools/index.d.ts.map +1 -0
  160. package/dist/harness/tools/index.js +19 -0
  161. package/dist/harness/tools/index.js.map +1 -0
  162. package/dist/index.d.ts +13 -0
  163. package/dist/index.d.ts.map +1 -0
  164. package/dist/index.js +18 -0
  165. package/dist/index.js.map +1 -0
  166. package/dist/shared/eventBus.d.ts +58 -0
  167. package/dist/shared/eventBus.d.ts.map +1 -0
  168. package/dist/shared/eventBus.js +104 -0
  169. package/dist/shared/eventBus.js.map +1 -0
  170. package/dist/shared/events.d.ts +230 -0
  171. package/dist/shared/events.d.ts.map +1 -0
  172. package/dist/shared/events.js +76 -0
  173. package/dist/shared/events.js.map +1 -0
  174. package/dist/shared/index.d.ts +8 -0
  175. package/dist/shared/index.d.ts.map +1 -0
  176. package/dist/shared/index.js +8 -0
  177. package/dist/shared/index.js.map +1 -0
  178. package/dist/skills/index.d.ts +10 -0
  179. package/dist/skills/index.d.ts.map +1 -0
  180. package/dist/skills/index.js +10 -0
  181. package/dist/skills/index.js.map +1 -0
  182. package/dist/types/context.d.ts +54 -0
  183. package/dist/types/context.d.ts.map +1 -0
  184. package/dist/types/context.js +3 -0
  185. package/dist/types/context.js.map +1 -0
  186. package/dist/types/index.d.ts +13 -0
  187. package/dist/types/index.d.ts.map +1 -0
  188. package/dist/types/index.js +12 -0
  189. package/dist/types/index.js.map +1 -0
  190. package/dist/types/knowledge.d.ts +79 -0
  191. package/dist/types/knowledge.d.ts.map +1 -0
  192. package/dist/types/knowledge.js +5 -0
  193. package/dist/types/knowledge.js.map +1 -0
  194. package/dist/types/legacy.d.ts +466 -0
  195. package/dist/types/legacy.d.ts.map +1 -0
  196. package/dist/types/legacy.js +2 -0
  197. package/dist/types/legacy.js.map +1 -0
  198. package/dist/types/systemTypes.d.ts +113 -0
  199. package/dist/types/systemTypes.d.ts.map +1 -0
  200. package/dist/types/systemTypes.js +10 -0
  201. package/dist/types/systemTypes.js.map +1 -0
  202. package/package.json +151 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../../../src/core/tools/builtin/filesystem.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { z } from 'zod';
2
+ import { type ToolDefinition } from '../toolTypes.js';
3
+ import { type FileEntry } from './_walk.js';
4
+ declare const ListFilesArgsSchema: z.ZodObject<{
5
+ path: z.ZodOptional<z.ZodString>;
6
+ maxDepth: z.ZodDefault<z.ZodNumber>;
7
+ exclude: z.ZodDefault<z.ZodArray<z.ZodString>>;
8
+ }, z.core.$strip>;
9
+ type ListFilesArgs = z.infer<typeof ListFilesArgsSchema>;
10
+ interface ListFilesResult {
11
+ /** The directory that was listed (absolute). */
12
+ dir: string;
13
+ entries: FileEntry[];
14
+ truncated: boolean;
15
+ }
16
+ export declare const listFilesTool: ToolDefinition<ListFilesArgs, ListFilesResult>;
17
+ export {};
18
+ //# sourceMappingURL=listFiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listFiles.d.ts","sourceRoot":"","sources":["../../../../src/core/tools/builtin/listFiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAGL,KAAK,SAAS,EACf,MAAM,YAAY,CAAC;AAEpB,QAAA,MAAM,mBAAmB;;;;iBAOvB,CAAC;AAEH,KAAK,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEzD,UAAU,eAAe;IACvB,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,aAAa,EAAE,cAAc,CAAC,aAAa,EAAE,eAAe,CAgCxE,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { z } from 'zod';
2
+ import path from 'node:path';
3
+ import { typedOk, typedErr } from '../toolTypes.js';
4
+ import { walk, DEFAULT_EXCLUDES, } from './_walk.js';
5
+ const ListFilesArgsSchema = z.object({
6
+ /** Directory to list (relative to cwd or absolute). Defaults to cwd. */
7
+ path: z.string().optional(),
8
+ /** Max traversal depth. 1 = immediate children only (default). */
9
+ maxDepth: z.number().int().positive().max(10).default(1),
10
+ /** Glob-style patterns to exclude (matched against each entry name). */
11
+ exclude: z.array(z.string()).default(DEFAULT_EXCLUDES),
12
+ });
13
+ export const listFilesTool = {
14
+ name: 'list_files',
15
+ description: 'List files and directories in the given path (defaults to the working directory). ' +
16
+ 'Returns names with types (file/directory). Use this to discover the project structure ' +
17
+ 'before reading specific files. Supports a maxDepth for recursive listing and excludes ' +
18
+ 'common dependency/build directories by default.',
19
+ permissions: ['read'],
20
+ timeoutMs: 15000,
21
+ inputSchema: ListFilesArgsSchema,
22
+ execute: async (args, ctx) => {
23
+ try {
24
+ const target = args.path
25
+ ? (path.isAbsolute(args.path) ? args.path : path.join(ctx.cwd, args.path))
26
+ : ctx.cwd;
27
+ const entries = [];
28
+ // API: maxDepth=1 means "root only". Internally: depth=0 at root,
29
+ // so we subtract 1 from the user-facing maxDepth.
30
+ await walk(target, '', 0, args.maxDepth - 1, args.exclude, entries, ctx.signal);
31
+ // Sort: directories first, then files, alphabetically.
32
+ entries.sort((a, b) => {
33
+ if (a.type === 'directory' && b.type !== 'directory')
34
+ return -1;
35
+ if (a.type !== 'directory' && b.type === 'directory')
36
+ return 1;
37
+ return a.name.localeCompare(b.name);
38
+ });
39
+ const MAX_ENTRIES = 500;
40
+ const truncated = entries.length > MAX_ENTRIES;
41
+ return typedOk({ dir: target, entries: truncated ? entries.slice(0, MAX_ENTRIES) : entries, truncated });
42
+ }
43
+ catch (err) {
44
+ return typedErr(err instanceof Error ? err.message : String(err));
45
+ }
46
+ },
47
+ };
48
+ //# sourceMappingURL=listFiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listFiles.js","sourceRoot":"","sources":["../../../../src/core/tools/builtin/listFiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAuB,MAAM,iBAAiB,CAAC;AACzE,OAAO,EACL,IAAI,EACJ,gBAAgB,GAEjB,MAAM,YAAY,CAAC;AAEpB,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,wEAAwE;IACxE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,kEAAkE;IAClE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACxD,wEAAwE;IACxE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;CACvD,CAAC,CAAC;AAWH,MAAM,CAAC,MAAM,aAAa,GAAmD;IAC3E,IAAI,EAAE,YAAY;IAClB,WAAW,EACT,oFAAoF;QACpF,wFAAwF;QACxF,wFAAwF;QACxF,iDAAiD;IACnD,WAAW,EAAE,CAAC,MAAM,CAAC;IACrB,SAAS,EAAE,KAAK;IAChB,WAAW,EAAE,mBAAmB;IAChC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI;gBACtB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC1E,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;YACZ,MAAM,OAAO,GAAgB,EAAE,CAAC;YAChC,kEAAkE;YAClE,kDAAkD;YAClD,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YAChF,uDAAuD;YACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACpB,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW;oBAAE,OAAO,CAAC,CAAC,CAAC;gBAChE,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW;oBAAE,OAAO,CAAC,CAAC;gBAC/D,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;YACH,MAAM,WAAW,GAAG,GAAG,CAAC;YACxB,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC;YAC/C,OAAO,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3G,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { z } from 'zod';
2
+ import { type ToolDefinition } from '../toolTypes.js';
3
+ /**
4
+ * grep_content — Regex search across one file OR a directory tree.
5
+ *
6
+ * Two modes:
7
+ * 1. Single-file: `path` is a regular file → search it.
8
+ * 2. Recursive: `path` is a directory → walk it (respecting `include` /
9
+ * `exclude` globs and `maxDepth`) and search each matched file.
10
+ *
11
+ * Backward-compatible: existing callers passing a single-file `path`
12
+ * keep the v0.3.x behavior unchanged.
13
+ *
14
+ * Glob syntax: `*`, `?`, `[abc]`, `**` (recursive). See _walk.ts.
15
+ */
16
+ declare const GrepContentArgsSchema: z.ZodObject<{
17
+ path: z.ZodString;
18
+ pattern: z.ZodString;
19
+ contextLines: z.ZodDefault<z.ZodNumber>;
20
+ maxMatches: z.ZodDefault<z.ZodNumber>;
21
+ include: z.ZodDefault<z.ZodArray<z.ZodString>>;
22
+ exclude: z.ZodDefault<z.ZodArray<z.ZodString>>;
23
+ maxDepth: z.ZodDefault<z.ZodNumber>;
24
+ }, z.core.$strip>;
25
+ export { GrepContentArgsSchema };
26
+ type GrepContentArgs = z.infer<typeof GrepContentArgsSchema>;
27
+ interface GrepMatch {
28
+ /** File path (absolute). */
29
+ file: string;
30
+ /** Relative path (vs the searched directory or single file). */
31
+ relPath: string;
32
+ line: number;
33
+ text: string;
34
+ context: {
35
+ before: string[];
36
+ after: string[];
37
+ };
38
+ }
39
+ interface GrepResult {
40
+ matches: GrepMatch[];
41
+ totalMatches: number;
42
+ truncated: boolean;
43
+ /** Number of files actually searched (1 for single-file mode). */
44
+ filesSearched: number;
45
+ /** Total files in tree (for recursive mode; 1 for single-file). */
46
+ filesInTree: number;
47
+ }
48
+ export declare const grepContentTool: ToolDefinition<GrepContentArgs, GrepResult>;
49
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../../src/core/tools/builtin/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAQzE;;;;;;;;;;;;GAYG;AAEH,QAAA,MAAM,qBAAqB;;;;;;;;iBAqBzB,CAAC;AAEH,OAAO,EAAE,qBAAqB,EAAE,CAAC;AAEjC,KAAK,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAE7D,UAAU,SAAS;IACjB,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAChD;AAED,UAAU,UAAU;IAClB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,kEAAkE;IAClE,aAAa,EAAE,MAAM,CAAC;IACtB,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;CACrB;AAqDD,eAAO,MAAM,eAAe,EAAE,cAAc,CAAC,eAAe,EAAE,UAAU,CAoEvE,CAAC"}
@@ -0,0 +1,148 @@
1
+ import { z } from 'zod';
2
+ import { promises as fs } from 'node:fs';
3
+ import path from 'node:path';
4
+ import { typedOk, typedErr } from '../toolTypes.js';
5
+ import { walk, filterByInclude, DEFAULT_EXCLUDES, } from './_walk.js';
6
+ /**
7
+ * grep_content — Regex search across one file OR a directory tree.
8
+ *
9
+ * Two modes:
10
+ * 1. Single-file: `path` is a regular file → search it.
11
+ * 2. Recursive: `path` is a directory → walk it (respecting `include` /
12
+ * `exclude` globs and `maxDepth`) and search each matched file.
13
+ *
14
+ * Backward-compatible: existing callers passing a single-file `path`
15
+ * keep the v0.3.x behavior unchanged.
16
+ *
17
+ * Glob syntax: `*`, `?`, `[abc]`, `**` (recursive). See _walk.ts.
18
+ */
19
+ const GrepContentArgsSchema = z.object({
20
+ /** File OR directory to search (relative to cwd or absolute). */
21
+ path: z.string().min(1),
22
+ /** Regex pattern (no flags — gm is hardcoded). */
23
+ pattern: z.string().min(1),
24
+ /** Context lines before/after each match. */
25
+ contextLines: z.number().int().nonnegative().default(2),
26
+ /** Max matches returned (total matches still counted). */
27
+ maxMatches: z.number().int().positive().max(1000).default(50),
28
+ /**
29
+ * Glob patterns to INCLUDE when path is a directory (e.g. ['*.ts', '*.tsx']).
30
+ * Default ['*'] = all files. Ignored when path is a file.
31
+ */
32
+ include: z.array(z.string()).default(['*']),
33
+ /**
34
+ * Glob patterns to EXCLUDE when path is a directory (e.g. ['*.test.ts']).
35
+ * Defaults to common noise dirs. Ignored when path is a file.
36
+ */
37
+ exclude: z.array(z.string()).default(DEFAULT_EXCLUDES),
38
+ /** Max recursion depth when path is a directory (default 8). */
39
+ maxDepth: z.number().int().positive().max(15).default(8),
40
+ });
41
+ export { GrepContentArgsSchema };
42
+ async function searchFile(absPath, relPath, regex, contextLines, remainingSlots) {
43
+ let buf;
44
+ try {
45
+ buf = await fs.readFile(absPath, 'utf-8');
46
+ }
47
+ catch {
48
+ return { matches: [], total: 0, truncated: false }; // unreadable file → skip
49
+ }
50
+ const lines = buf.split('\n');
51
+ const matches = [];
52
+ let total = 0;
53
+ let truncated = false;
54
+ for (let i = 0; i < lines.length; i++) {
55
+ regex.lastIndex = 0;
56
+ if (regex.test(lines[i])) {
57
+ total++;
58
+ if (matches.length < remainingSlots) {
59
+ const startBefore = Math.max(0, i - contextLines);
60
+ const endAfter = Math.min(lines.length - 1, i + contextLines);
61
+ matches.push({
62
+ file: absPath,
63
+ relPath,
64
+ line: i + 1,
65
+ text: lines[i],
66
+ context: {
67
+ before: lines.slice(startBefore, i),
68
+ after: lines.slice(i + 1, endAfter + 1),
69
+ },
70
+ });
71
+ }
72
+ else {
73
+ truncated = true;
74
+ }
75
+ }
76
+ }
77
+ return { matches, total, truncated };
78
+ }
79
+ async function isDirectory(p) {
80
+ try {
81
+ const stat = await fs.stat(p);
82
+ return stat.isDirectory();
83
+ }
84
+ catch {
85
+ return false;
86
+ }
87
+ }
88
+ export const grepContentTool = {
89
+ name: 'grep_content',
90
+ description: 'Regex search for content in a file OR recursively in a directory. ' +
91
+ 'When path is a directory, include/exclude globs filter which files are searched ' +
92
+ '(default: all files, excluding node_modules/dist/.git/etc.). Returns matches with ' +
93
+ 'line numbers and surrounding context. Single-file mode preserves v0.3.x behavior.',
94
+ permissions: ['read'],
95
+ timeoutMs: 30000,
96
+ inputSchema: GrepContentArgsSchema,
97
+ execute: async (args, ctx) => {
98
+ try {
99
+ const absRoot = path.isAbsolute(args.path) ? args.path : path.join(ctx.cwd, args.path);
100
+ const regex = new RegExp(args.pattern, 'gm');
101
+ // ── Single-file mode ────────────────────────────────────────
102
+ if (!(await isDirectory(absRoot))) {
103
+ const single = await searchFile(absRoot, args.path, regex, args.contextLines, args.maxMatches);
104
+ return typedOk({
105
+ matches: single.matches,
106
+ totalMatches: single.total,
107
+ truncated: single.truncated,
108
+ filesSearched: 1,
109
+ filesInTree: 1,
110
+ });
111
+ }
112
+ // ── Recursive (directory) mode ──────────────────────────────
113
+ const allEntries = [];
114
+ await walk(absRoot, '', 0, args.maxDepth, args.exclude, allEntries, ctx.signal);
115
+ const matchedFiles = filterByInclude(allEntries, args.include);
116
+ const allMatches = [];
117
+ let totalMatches = 0;
118
+ let truncated = false;
119
+ let filesSearched = 0;
120
+ for (const entry of matchedFiles) {
121
+ if (ctx.signal?.aborted)
122
+ break;
123
+ if (allMatches.length >= args.maxMatches) {
124
+ truncated = true;
125
+ break;
126
+ }
127
+ const absFile = path.join(absRoot, entry.name);
128
+ const result = await searchFile(absFile, entry.name, regex, args.contextLines, args.maxMatches - allMatches.length);
129
+ filesSearched++;
130
+ totalMatches += result.total;
131
+ if (result.truncated)
132
+ truncated = true;
133
+ allMatches.push(...result.matches);
134
+ }
135
+ return typedOk({
136
+ matches: allMatches,
137
+ totalMatches,
138
+ truncated,
139
+ filesSearched,
140
+ filesInTree: matchedFiles.length,
141
+ });
142
+ }
143
+ catch (err) {
144
+ return typedErr(err instanceof Error ? err.message : String(err));
145
+ }
146
+ },
147
+ };
148
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../../src/core/tools/builtin/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { z } from 'zod';
2
+ import { type ToolDefinition } from '../toolTypes.js';
3
+ declare const BashArgsSchema: z.ZodObject<{
4
+ command: z.ZodString;
5
+ cwd: z.ZodOptional<z.ZodString>;
6
+ timeoutMs: z.ZodDefault<z.ZodNumber>;
7
+ }, z.core.$strip>;
8
+ type BashArgs = z.infer<typeof BashArgsSchema>;
9
+ interface BashResult {
10
+ stdout: string;
11
+ stderr: string;
12
+ exitCode: number;
13
+ durationMs: number;
14
+ /** Which shell executed the command (v0.7.2), e.g. "bash (D:\\Git\\bin\\bash.exe)" or "cmd.exe". */
15
+ shellVia: string;
16
+ /**
17
+ * Actionable hint injected when the output matches an interactive-prompt
18
+ * cancellation (v0.7.3). Scaffolders built on prompts/@clack print
19
+ * "Operation cancelled" and often exit 0, so the model sees a "success"
20
+ * that did nothing and retries variants of the same command forever
21
+ * (live test 2026-07-02: 6× `npm create vite` in a non-empty dir).
22
+ */
23
+ hint?: string;
24
+ }
25
+ export declare const bashTool: ToolDefinition<BashArgs, BashResult>;
26
+ export {};
27
+ //# sourceMappingURL=shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../../../src/core/tools/builtin/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGzE,QAAA,MAAM,cAAc;;;;iBAIlB,CAAC;AAEH,KAAK,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAE/C,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,oGAAoG;IACpG,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAYD,eAAO,MAAM,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE,UAAU,CAoFzD,CAAC"}
@@ -0,0 +1,98 @@
1
+ import { z } from 'zod';
2
+ import { spawn } from 'node:child_process';
3
+ import { typedOk, typedErr } from '../toolTypes.js';
4
+ import { resolveShell } from './shellResolver.js';
5
+ const BashArgsSchema = z.object({
6
+ command: z.string().min(1),
7
+ cwd: z.string().optional(),
8
+ timeoutMs: z.number().int().positive().max(600_000).default(30_000),
9
+ });
10
+ /** Output signatures of an interactive prompt dying on our closed stdin. */
11
+ const INTERACTIVE_CANCEL_RE = /operation cancell?ed|stdin is not a tty|the input device is not a tty/i;
12
+ const INTERACTIVE_HINT = 'This command tried to PROMPT for input, but stdin is closed (non-interactive shell). ' +
13
+ 'Do NOT retry it — every variant will be cancelled the same way. Instead: ' +
14
+ 'scaffold into a fresh EMPTY subdirectory (e.g. `npm create vite@latest scaffold-tmp -- --template react-ts`, ' +
15
+ 'then move its contents here with `mv`/`cp`), or write package.json, configs and sources directly ' +
16
+ 'with write_file and then run `npm install`.';
17
+ export const bashTool = {
18
+ name: 'bash',
19
+ description: 'Run a shell command. On Windows uses Git Bash when available (POSIX semantics: ls, $VAR, && work); falls back to cmd.exe otherwise. Streams stdout/stderr. Respects timeout and cancellation. Returns exit code. ' +
20
+ 'stdin is CLOSED (non-interactive): any command that prompts for input will fail or be cancelled — always pass non-interactive flags (--yes, -y, --template), and if a scaffolder insists on prompting (e.g. create-vite in a non-empty directory), create the files manually with write_file instead.',
21
+ permissions: ['execute'],
22
+ timeoutMs: 60000,
23
+ inputSchema: BashArgsSchema,
24
+ execute: async (args, ctx) => {
25
+ return new Promise((resolve) => {
26
+ const start = Date.now();
27
+ const cwd = args.cwd ?? ctx.cwd;
28
+ const resolved = resolveShell();
29
+ // win32 + real bash: spawn the binary directly with `-c` and shell:false
30
+ // so there is no cmd.exe indirection (npm, &&, $VAR, ls all work because
31
+ // Git Bash's PATH resolves shims and `-c` runs a true POSIX string).
32
+ // POSIX / fallback: keep the historical `shell: true` (Node picks /bin/sh
33
+ // on posix, cmd.exe on win32-fallback — already warned by the resolver).
34
+ let child;
35
+ // v0.7.3: CI=1 pushes well-behaved CLIs (npm, scaffolders, test runners)
36
+ // into non-interactive mode; stdin 'ignore' makes the rest fail FAST
37
+ // with EOF instead of hanging on a prompt until the timeout (live test:
38
+ // `npm create vite` in a non-empty dir prompted → "Operation cancelled").
39
+ const baseEnv = { ...process.env, CI: process.env.CI ?? '1' };
40
+ const env = resolved.isBash
41
+ ? { ...baseEnv, MSYSTEM: process.env.MSYSTEM ?? 'MINGW64' }
42
+ : baseEnv;
43
+ if (resolved.isBash) {
44
+ child = spawn(resolved.shell, ['-c', args.command], {
45
+ cwd,
46
+ signal: ctx.signal,
47
+ shell: false,
48
+ env,
49
+ stdio: ['ignore', 'pipe', 'pipe'],
50
+ });
51
+ }
52
+ else {
53
+ child = spawn(args.command, {
54
+ shell: resolved.shell,
55
+ cwd,
56
+ signal: ctx.signal,
57
+ env,
58
+ stdio: ['ignore', 'pipe', 'pipe'],
59
+ });
60
+ }
61
+ let stdout = '';
62
+ let stderr = '';
63
+ const maxBuffer = 1024 * 1024; // 1MB cap on each stream
64
+ child.stdout?.on('data', (data) => {
65
+ if (stdout.length < maxBuffer)
66
+ stdout += data.toString('utf-8');
67
+ });
68
+ child.stderr?.on('data', (data) => {
69
+ if (stderr.length < maxBuffer)
70
+ stderr += data.toString('utf-8');
71
+ });
72
+ const timer = setTimeout(() => {
73
+ child.kill('SIGTERM');
74
+ resolve(typedErr(`Bash command timed out after ${args.timeoutMs}ms. ` +
75
+ 'If it was waiting for interactive input: stdin is closed — pass non-interactive flags or create the files directly instead of retrying.'));
76
+ }, args.timeoutMs);
77
+ child.on('close', (code) => {
78
+ clearTimeout(timer);
79
+ const cappedStdout = stdout.slice(0, maxBuffer);
80
+ const cappedStderr = stderr.slice(0, maxBuffer);
81
+ const interactive = INTERACTIVE_CANCEL_RE.test(cappedStdout) || INTERACTIVE_CANCEL_RE.test(cappedStderr);
82
+ resolve(typedOk({
83
+ stdout: cappedStdout,
84
+ stderr: cappedStderr,
85
+ exitCode: code ?? -1,
86
+ durationMs: Date.now() - start,
87
+ shellVia: resolved.via,
88
+ ...(interactive ? { hint: INTERACTIVE_HINT } : {}),
89
+ }));
90
+ });
91
+ child.on('error', (err) => {
92
+ clearTimeout(timer);
93
+ resolve(typedErr(err.message));
94
+ });
95
+ });
96
+ },
97
+ };
98
+ //# sourceMappingURL=shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../../src/core/tools/builtin/shell.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export interface ResolvedShell {
2
+ /**
3
+ * The value to pass to `spawn`'s `shell` option, OR a bash binary path to
4
+ * spawn directly via `spawn(path, ['-c', cmd], { shell: false })`.
5
+ *
6
+ * - When `isBash` is true, `shell` is an absolute path string; spawn it
7
+ * directly with `-c`.
8
+ * - When `isBash` is false, `shell` is `true` (let Node pick cmd.exe on
9
+ * win32, /bin/sh on POSIX).
10
+ */
11
+ shell: string | true;
12
+ /** Human-readable label for logs / the model, e.g. "bash (D:\\Git\\bin\\bash.exe)". */
13
+ via: string;
14
+ /** True when `shell` is a real bash binary (spawn via `-c`, POSIX semantics). */
15
+ isBash: boolean;
16
+ }
17
+ /**
18
+ * Resolve the shell to use for command execution. Memoized per-process.
19
+ *
20
+ * @param forceReResolve bypass the memo (for tests).
21
+ */
22
+ export declare function resolveShell(forceReResolve?: boolean): ResolvedShell;
23
+ /** Test-only: reset memo + warning flag. */
24
+ export declare function _resetShellResolverForTests(): void;
25
+ //# sourceMappingURL=shellResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shellResolver.d.ts","sourceRoot":"","sources":["../../../../src/core/tools/builtin/shellResolver.ts"],"names":[],"mappings":"AAgCA,MAAM,WAAW,aAAa;IAC5B;;;;;;;;OAQG;IACH,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,uFAAuF;IACvF,GAAG,EAAE,MAAM,CAAC;IACZ,iFAAiF;IACjF,MAAM,EAAE,OAAO,CAAC;CACjB;AAaD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,cAAc,UAAQ,GAAG,aAAa,CA4BlE;AA6CD,4CAA4C;AAC5C,wBAAgB,2BAA2B,IAAI,IAAI,CAGlD"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * shellResolver — v0.7.2 cross-platform shell selection for the `bash` tool.
3
+ *
4
+ * Problem: `spawn(cmd, { shell: true })` on win32 uses cmd.exe (via ComSpec),
5
+ * which breaks npm (needs `npm.cmd`), mis-handles `&&` / quoting, and doesn't
6
+ * understand POSIX commands (`ls`, `which`, `$VAR`). The tool is named `bash`
7
+ * but historically ran cmd.exe on Windows — a misleading and broken state.
8
+ *
9
+ * Resolution: when Git Bash / MSYS2 bash is available, spawn it directly via
10
+ * `spawn(bashPath, ['-c', cmd], { shell: false })` so real POSIX semantics
11
+ * apply. Detection order (most reliable first):
12
+ *
13
+ * 1. `ZELARI_SHELL` env var — explicit user override (the knob that was
14
+ * missing; lets users point at any shell they want).
15
+ * 2. `SHELL` env var on win32 — set automatically by Git Bash / MSYS2
16
+ * sessions (e.g. `D:\Git\bin\bash.exe`). The most reliable automatic
17
+ * signal when the CLI is launched from Git Bash.
18
+ * 3. Standard Git for Windows install paths (probed with existsSync).
19
+ * 4. `where bash` — last-ditch PATH lookup.
20
+ * 5. Fallback: cmd.exe (`shell: true`) with a one-time stderr warning so
21
+ * the user knows POSIX commands may fail and can install Git for Windows
22
+ * or set ZELARI_SHELL.
23
+ *
24
+ * On POSIX the resolver is a no-op: `shell: true` already means /bin/sh,
25
+ * which is bash-compatible enough.
26
+ *
27
+ * Idempotent: the resolved shell is memoized per-process. The warning is
28
+ * emitted at most once per process (guarded by a module-level flag).
29
+ */
30
+ import { existsSync } from 'node:fs';
31
+ import { spawnSync } from 'node:child_process';
32
+ /** Standard Git for Windows bash locations (probed in order). */
33
+ const STANDARD_BASH_PATHS = [
34
+ 'C:\\Program Files\\Git\\bin\\bash.exe',
35
+ 'C:\\Program Files\\Git\\usr\\bin\\bash.exe',
36
+ 'C:\\Program Files (x86)\\Git\\bin\\bash.exe',
37
+ 'C:\\Program Files (x86)\\Git\\usr\\bin\\bash.exe',
38
+ ];
39
+ let memoized = null;
40
+ let warnedFallback = false;
41
+ /**
42
+ * Resolve the shell to use for command execution. Memoized per-process.
43
+ *
44
+ * @param forceReResolve bypass the memo (for tests).
45
+ */
46
+ export function resolveShell(forceReResolve = false) {
47
+ if (memoized && !forceReResolve)
48
+ return memoized;
49
+ // POSIX: Node's `shell: true` already uses /bin/sh — no work needed.
50
+ if (process.platform !== 'win32') {
51
+ memoized = { shell: true, via: '/bin/sh', isBash: false };
52
+ return memoized;
53
+ }
54
+ // win32: try to find a real bash.
55
+ const found = resolveBashWindows();
56
+ if (found) {
57
+ memoized = { shell: found, via: `bash (${found})`, isBash: true };
58
+ return memoized;
59
+ }
60
+ // Fallback: cmd.exe. Warn once so the user knows POSIX commands may fail.
61
+ if (!warnedFallback) {
62
+ warnedFallback = true;
63
+ // eslint-disable-next-line no-console
64
+ console.error('[zelari-code] bash tool: Git Bash not found — falling back to cmd.exe. ' +
65
+ 'POSIX commands (ls, which, $VAR, &&) may fail. Install Git for Windows ' +
66
+ 'or set ZELARI_SHELL to your bash binary for proper POSIX support.');
67
+ }
68
+ memoized = { shell: true, via: 'cmd.exe', isBash: false };
69
+ return memoized;
70
+ }
71
+ /** Detection chain for a bash binary on win32. Returns the path or null. */
72
+ function resolveBashWindows() {
73
+ // 1. Explicit override.
74
+ const envShell = process.env.ZELARI_SHELL;
75
+ if (envShell && envShell.trim().length > 0 && existsSyncSafe(envShell)) {
76
+ return envShell;
77
+ }
78
+ // 2. SHELL env var (set by Git Bash / MSYS2 sessions).
79
+ const sessionShell = process.env.SHELL;
80
+ if (sessionShell && sessionShell.trim().length > 0 && existsSyncSafe(sessionShell)) {
81
+ return sessionShell;
82
+ }
83
+ // 3. Standard install paths.
84
+ for (const p of STANDARD_BASH_PATHS) {
85
+ if (existsSyncSafe(p))
86
+ return p;
87
+ }
88
+ // 4. `where bash` — PATH lookup. `where` ships with Windows (a real .exe,
89
+ // so no shell needed — and shell:true + args array is deprecated, DEP0190).
90
+ try {
91
+ const result = spawnSync('where', ['bash'], { encoding: 'utf-8', windowsHide: true });
92
+ if (result.status === 0 && result.stdout) {
93
+ const first = result.stdout.split(/\r?\n/).find((l) => l.trim().length > 0);
94
+ if (first && existsSyncSafe(first))
95
+ return first.trim();
96
+ }
97
+ }
98
+ catch {
99
+ // `where` not available or failed — fall through to null.
100
+ }
101
+ return null;
102
+ }
103
+ /** existsSync that swallows edge-case errors (e.g. invalid chars on win32). */
104
+ function existsSyncSafe(p) {
105
+ try {
106
+ return existsSync(p);
107
+ }
108
+ catch {
109
+ return false;
110
+ }
111
+ }
112
+ /** Test-only: reset memo + warning flag. */
113
+ export function _resetShellResolverForTests() {
114
+ memoized = null;
115
+ warnedFallback = false;
116
+ }
117
+ //# sourceMappingURL=shellResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shellResolver.js","sourceRoot":"","sources":["../../../../src/core/tools/builtin/shellResolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { z } from 'zod';
2
+ import { type ToolDefinition } from '../toolTypes.js';
3
+ /**
4
+ * Reduce an HTML document to readable text: drop script/style/head noise,
5
+ * convert tags to whitespace, decode the handful of entities that matter.
6
+ * Deliberately dependency-free — good enough for LLM consumption, not for
7
+ * rendering.
8
+ */
9
+ export declare function htmlToText(html: string): string;
10
+ declare const FetchUrlArgsSchema: z.ZodObject<{
11
+ url: z.ZodString;
12
+ maxChars: z.ZodDefault<z.ZodNumber>;
13
+ }, z.core.$strip>;
14
+ export type FetchUrlArgs = z.infer<typeof FetchUrlArgsSchema>;
15
+ export interface FetchUrlResult {
16
+ url: string;
17
+ status: number;
18
+ contentType: string;
19
+ /** Extracted text (HTML stripped) or raw body for non-HTML text types. */
20
+ text: string;
21
+ truncated: boolean;
22
+ }
23
+ export declare const fetchUrlTool: ToolDefinition<FetchUrlArgs, FetchUrlResult>;
24
+ declare const WebSearchArgsSchema: z.ZodObject<{
25
+ query: z.ZodString;
26
+ maxResults: z.ZodDefault<z.ZodNumber>;
27
+ }, z.core.$strip>;
28
+ export type WebSearchArgs = z.infer<typeof WebSearchArgsSchema>;
29
+ export interface WebSearchHit {
30
+ title: string;
31
+ url: string;
32
+ snippet: string;
33
+ }
34
+ export interface WebSearchResult {
35
+ provider: 'tavily' | 'duckduckgo';
36
+ query: string;
37
+ results: WebSearchHit[];
38
+ }
39
+ /** Parse the DuckDuckGo HTML SERP (html.duckduckgo.com) into hits. */
40
+ export declare function parseDuckDuckGoHtml(html: string, maxResults: number): WebSearchHit[];
41
+ export declare const webSearchTool: ToolDefinition<WebSearchArgs, WebSearchResult>;
42
+ export {};
43
+ //# sourceMappingURL=web.d.ts.map