@revealui/ai 0.2.0 → 0.2.2

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 (200) hide show
  1. package/LICENSE.commercial +2 -3
  2. package/dist/a2a/card.d.ts.map +1 -1
  3. package/dist/a2a/handler.d.ts +1 -1
  4. package/dist/a2a/handler.d.ts.map +1 -1
  5. package/dist/a2a/handler.js +1 -1
  6. package/dist/a2a/index.d.ts.map +1 -1
  7. package/dist/a2a/task-store.d.ts.map +1 -1
  8. package/dist/audit/emitter.d.ts.map +1 -1
  9. package/dist/audit/index.d.ts.map +1 -1
  10. package/dist/audit/observer.d.ts.map +1 -1
  11. package/dist/audit/policy.d.ts.map +1 -1
  12. package/dist/audit/store.d.ts.map +1 -1
  13. package/dist/audit/types.d.ts.map +1 -1
  14. package/dist/client/hooks/index.d.ts.map +1 -1
  15. package/dist/client/hooks/useAgentContext.d.ts.map +1 -1
  16. package/dist/client/hooks/useAgentEvents.d.ts.map +1 -1
  17. package/dist/client/hooks/useAgentStream.d.ts.map +1 -1
  18. package/dist/client/hooks/useEpisodicMemory.d.ts.map +1 -1
  19. package/dist/client/hooks/useWorkingMemory.d.ts.map +1 -1
  20. package/dist/client/index.d.ts.map +1 -1
  21. package/dist/embeddings/index.d.ts.map +1 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/inference/context-assembly.d.ts.map +1 -1
  24. package/dist/inference/context-budget.d.ts +46 -0
  25. package/dist/inference/context-budget.d.ts.map +1 -0
  26. package/dist/inference/context-budget.js +113 -0
  27. package/dist/inference/index.d.ts +8 -0
  28. package/dist/inference/index.d.ts.map +1 -0
  29. package/dist/inference/index.js +7 -0
  30. package/dist/inference/overflow-compressor.d.ts.map +1 -1
  31. package/dist/inference/runRag.d.ts.map +1 -1
  32. package/dist/inference/task-decomposer.d.ts +75 -0
  33. package/dist/inference/task-decomposer.d.ts.map +1 -0
  34. package/dist/inference/task-decomposer.js +190 -0
  35. package/dist/inference/tool-result-compressor.d.ts +39 -0
  36. package/dist/inference/tool-result-compressor.d.ts.map +1 -0
  37. package/dist/inference/tool-result-compressor.js +180 -0
  38. package/dist/ingestion/bm25.d.ts.map +1 -1
  39. package/dist/ingestion/cms-indexer.d.ts.map +1 -1
  40. package/dist/ingestion/file-parsers.d.ts.map +1 -1
  41. package/dist/ingestion/hybrid-search.d.ts.map +1 -1
  42. package/dist/ingestion/index.d.ts.map +1 -1
  43. package/dist/ingestion/pipeline.d.ts.map +1 -1
  44. package/dist/ingestion/pipeline.js +1 -1
  45. package/dist/ingestion/rag-vector-service.d.ts.map +1 -1
  46. package/dist/ingestion/reranker.d.ts.map +1 -1
  47. package/dist/ingestion/text-splitter.d.ts.map +1 -1
  48. package/dist/llm/cache-utils.d.ts.map +1 -1
  49. package/dist/llm/client.d.ts.map +1 -1
  50. package/dist/llm/client.js +3 -1
  51. package/dist/llm/key-validator.d.ts.map +1 -1
  52. package/dist/llm/provider-health.d.ts.map +1 -1
  53. package/dist/llm/providers/anthropic.d.ts.map +1 -1
  54. package/dist/llm/providers/anthropic.js +3 -1
  55. package/dist/llm/providers/base.d.ts.map +1 -1
  56. package/dist/llm/providers/bitnet.d.ts.map +1 -1
  57. package/dist/llm/providers/groq.d.ts.map +1 -1
  58. package/dist/llm/providers/inference-snaps.d.ts.map +1 -1
  59. package/dist/llm/providers/ollama.d.ts.map +1 -1
  60. package/dist/llm/providers/openai.d.ts.map +1 -1
  61. package/dist/llm/providers/vultr.d.ts.map +1 -1
  62. package/dist/llm/response-cache.d.ts.map +1 -1
  63. package/dist/llm/semantic-cache.d.ts.map +1 -1
  64. package/dist/llm/semantic-cache.js +1 -1
  65. package/dist/llm/server.d.ts.map +1 -1
  66. package/dist/llm/token-counter.d.ts.map +1 -1
  67. package/dist/llm/workspace-provider-config.d.ts.map +1 -1
  68. package/dist/memory/agent/context-manager.d.ts.map +1 -1
  69. package/dist/memory/agent/index.d.ts.map +1 -1
  70. package/dist/memory/crdt/index.d.ts.map +1 -1
  71. package/dist/memory/crdt/lww-register.d.ts.map +1 -1
  72. package/dist/memory/crdt/or-set.d.ts.map +1 -1
  73. package/dist/memory/crdt/pn-counter.d.ts.map +1 -1
  74. package/dist/memory/crdt/vector-clock.d.ts.map +1 -1
  75. package/dist/memory/errors/index.d.ts.map +1 -1
  76. package/dist/memory/index.d.ts.map +1 -1
  77. package/dist/memory/persistence/crdt-persistence.d.ts.map +1 -1
  78. package/dist/memory/persistence/crdt-persistence.js +1 -5
  79. package/dist/memory/persistence/index.d.ts.map +1 -1
  80. package/dist/memory/preferences/index.d.ts.map +1 -1
  81. package/dist/memory/preferences/user-preferences-manager.d.ts.map +1 -1
  82. package/dist/memory/preferences/user-preferences-manager.js +2 -3
  83. package/dist/memory/services/index.d.ts.map +1 -1
  84. package/dist/memory/services/node-id-service.d.ts.map +1 -1
  85. package/dist/memory/stores/episodic-memory.d.ts.map +1 -1
  86. package/dist/memory/stores/index.d.ts.map +1 -1
  87. package/dist/memory/stores/procedural-memory.d.ts.map +1 -1
  88. package/dist/memory/stores/semantic-memory.d.ts.map +1 -1
  89. package/dist/memory/stores/working-memory.d.ts.map +1 -1
  90. package/dist/memory/utils/deep-clone.d.ts.map +1 -1
  91. package/dist/memory/utils/index.d.ts.map +1 -1
  92. package/dist/memory/utils/sql-helpers.d.ts.map +1 -1
  93. package/dist/memory/utils/validation.d.ts.map +1 -1
  94. package/dist/memory/utils/validation.js +3 -1
  95. package/dist/memory/vector/index.d.ts.map +1 -1
  96. package/dist/memory/vector/vector-memory-service.d.ts.map +1 -1
  97. package/dist/memory/vector/vector-memory-service.js +1 -1
  98. package/dist/observability/logger.d.ts.map +1 -1
  99. package/dist/observability/metrics.d.ts.map +1 -1
  100. package/dist/observability/query.d.ts.map +1 -1
  101. package/dist/observability/types.d.ts.map +1 -1
  102. package/dist/orchestration/agent.d.ts.map +1 -1
  103. package/dist/orchestration/defaults.d.ts.map +1 -1
  104. package/dist/orchestration/memory-integration.d.ts.map +1 -1
  105. package/dist/orchestration/orchestrator.d.ts.map +1 -1
  106. package/dist/orchestration/runtime.d.ts +24 -0
  107. package/dist/orchestration/runtime.d.ts.map +1 -1
  108. package/dist/orchestration/runtime.js +67 -1
  109. package/dist/orchestration/streaming-runtime.d.ts.map +1 -1
  110. package/dist/orchestration/streaming-runtime.js +11 -4
  111. package/dist/orchestration/ticket-agent.d.ts.map +1 -1
  112. package/dist/orchestration/ticket-agent.js +3 -1
  113. package/dist/skills/activation/index.d.ts.map +1 -1
  114. package/dist/skills/activation/skill-activator.d.ts.map +1 -1
  115. package/dist/skills/catalog/catalog-search.d.ts.map +1 -1
  116. package/dist/skills/catalog/catalog-types.d.ts.map +1 -1
  117. package/dist/skills/catalog/index.d.ts.map +1 -1
  118. package/dist/skills/catalog/vercel-catalog.d.ts.map +1 -1
  119. package/dist/skills/compat/index.d.ts.map +1 -1
  120. package/dist/skills/compat/skill-enhancer.d.ts.map +1 -1
  121. package/dist/skills/compat/tool-mapper.d.ts.map +1 -1
  122. package/dist/skills/compat/vercel-compat.d.ts.map +1 -1
  123. package/dist/skills/index.d.ts.map +1 -1
  124. package/dist/skills/integration/agent-skill-provider.d.ts.map +1 -1
  125. package/dist/skills/integration/index.d.ts.map +1 -1
  126. package/dist/skills/loader/github-loader.d.ts.map +1 -1
  127. package/dist/skills/loader/github-loader.js +10 -2
  128. package/dist/skills/loader/index.d.ts.map +1 -1
  129. package/dist/skills/loader/local-loader.d.ts.map +1 -1
  130. package/dist/skills/loader/vercel-loader.d.ts.map +1 -1
  131. package/dist/skills/loader/vercel-loader.js +10 -2
  132. package/dist/skills/loader/vercel-types.d.ts.map +1 -1
  133. package/dist/skills/parser/index.d.ts.map +1 -1
  134. package/dist/skills/parser/skill-md-parser.d.ts.map +1 -1
  135. package/dist/skills/parser/skill-md-parser.js +2 -2
  136. package/dist/skills/registry/index.d.ts.map +1 -1
  137. package/dist/skills/registry/skill-registry.d.ts.map +1 -1
  138. package/dist/skills/types.d.ts.map +1 -1
  139. package/dist/templates/agent-spec.d.ts.map +1 -1
  140. package/dist/templates/index.d.ts.map +1 -1
  141. package/dist/templates/prompt-spec.d.ts.map +1 -1
  142. package/dist/templates/skill-spec.d.ts.map +1 -1
  143. package/dist/tools/base.d.ts +33 -0
  144. package/dist/tools/base.d.ts.map +1 -1
  145. package/dist/tools/cms/collection-tools.d.ts.map +1 -1
  146. package/dist/tools/cms/factory.d.ts.map +1 -1
  147. package/dist/tools/cms/global-tools.d.ts.map +1 -1
  148. package/dist/tools/cms/index.d.ts.map +1 -1
  149. package/dist/tools/cms/media-tools.d.ts.map +1 -1
  150. package/dist/tools/cms/user-tools.d.ts.map +1 -1
  151. package/dist/tools/coding/file-edit.d.ts +6 -0
  152. package/dist/tools/coding/file-edit.d.ts.map +1 -0
  153. package/dist/tools/coding/file-edit.js +73 -0
  154. package/dist/tools/coding/file-glob.d.ts +6 -0
  155. package/dist/tools/coding/file-glob.d.ts.map +1 -0
  156. package/dist/tools/coding/file-glob.js +120 -0
  157. package/dist/tools/coding/file-grep.d.ts +6 -0
  158. package/dist/tools/coding/file-grep.d.ts.map +1 -0
  159. package/dist/tools/coding/file-grep.js +194 -0
  160. package/dist/tools/coding/file-read.d.ts +6 -0
  161. package/dist/tools/coding/file-read.d.ts.map +1 -0
  162. package/dist/tools/coding/file-read.js +69 -0
  163. package/dist/tools/coding/file-write.d.ts +6 -0
  164. package/dist/tools/coding/file-write.d.ts.map +1 -0
  165. package/dist/tools/coding/file-write.js +49 -0
  166. package/dist/tools/coding/git-ops.d.ts +6 -0
  167. package/dist/tools/coding/git-ops.d.ts.map +1 -0
  168. package/dist/tools/coding/git-ops.js +102 -0
  169. package/dist/tools/coding/index.d.ts +40 -0
  170. package/dist/tools/coding/index.d.ts.map +1 -0
  171. package/dist/tools/coding/index.js +62 -0
  172. package/dist/tools/coding/lint-fix.d.ts +9 -0
  173. package/dist/tools/coding/lint-fix.d.ts.map +1 -0
  174. package/dist/tools/coding/lint-fix.js +256 -0
  175. package/dist/tools/coding/project-context.d.ts +6 -0
  176. package/dist/tools/coding/project-context.d.ts.map +1 -0
  177. package/dist/tools/coding/project-context.js +126 -0
  178. package/dist/tools/coding/safety.d.ts +26 -0
  179. package/dist/tools/coding/safety.d.ts.map +1 -0
  180. package/dist/tools/coding/safety.js +104 -0
  181. package/dist/tools/coding/shell-exec.d.ts +6 -0
  182. package/dist/tools/coding/shell-exec.d.ts.map +1 -0
  183. package/dist/tools/coding/shell-exec.js +79 -0
  184. package/dist/tools/coding/test-runner.d.ts +10 -0
  185. package/dist/tools/coding/test-runner.d.ts.map +1 -0
  186. package/dist/tools/coding/test-runner.js +214 -0
  187. package/dist/tools/deduplicator.d.ts.map +1 -1
  188. package/dist/tools/document-summarizer.d.ts.map +1 -1
  189. package/dist/tools/mcp-adapter.d.ts.map +1 -1
  190. package/dist/tools/memory/index.d.ts.map +1 -1
  191. package/dist/tools/memory/store-memory.d.ts.map +1 -1
  192. package/dist/tools/registry.d.ts.map +1 -1
  193. package/dist/tools/ticket-tools.d.ts.map +1 -1
  194. package/dist/tools/web/duck-duck-go.d.ts.map +1 -1
  195. package/dist/tools/web/exa.d.ts.map +1 -1
  196. package/dist/tools/web/index.d.ts.map +1 -1
  197. package/dist/tools/web/scraper.d.ts.map +1 -1
  198. package/dist/tools/web/tavily.d.ts.map +1 -1
  199. package/dist/tools/web/types.d.ts.map +1 -1
  200. package/package.json +26 -6
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/tools/cms/factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAyBtC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,OAAO,EAAE;QACZ,UAAU,EAAE,MAAM,CAAA;QAClB,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC/B,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,GAAG,OAAO,CAAC;QACV,IAAI,CAAC,EAAE,OAAO,EAAE,CAAA;QAChB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,CAAC,CAAA;IAEF,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAE1D,MAAM,CAAC,OAAO,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAExF,MAAM,CAAC,OAAO,EAAE;QACd,UAAU,EAAE,MAAM,CAAA;QAClB,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAC9B,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAEpB,MAAM,CAAC,OAAO,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAElE,UAAU,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAEvE,YAAY,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACzF;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0BAA0B;IAC1B,SAAS,EAAE,YAAY,CAAA;IAEvB,kEAAkE;IAClE,WAAW,CAAC,EAAE,kBAAkB,EAAE,CAAA;IAElC,0DAA0D;IAC1D,OAAO,CAAC,EAAE,cAAc,EAAE,CAAA;IAE1B,mDAAmD;IACnD,IAAI,CAAC,EAAE,WAAW,CAAA;CACnB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,EAAE,CAggB7D"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/tools/cms/factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAyBvC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,OAAO,EAAE;QACZ,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC;QACV,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IAEH,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3D,MAAM,CAAC,OAAO,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEzF,MAAM,CAAC,OAAO,EAAE;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC/B,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAErB,MAAM,CAAC,OAAO,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnE,UAAU,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAExE,YAAY,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1F;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0BAA0B;IAC1B,SAAS,EAAE,YAAY,CAAC;IAExB,kEAAkE;IAClE,WAAW,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAEnC,0DAA0D;IAC1D,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAE3B,mDAAmD;IACnD,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,EAAE,CAggB7D"}
@@ -1 +1 @@
1
- {"version":3,"file":"global-tools.d.ts","sourceRoot":"","sources":["../../../src/tools/cms/global-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,YAAY,CAAA;AAElD;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,IA6B7B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,IAwB3B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,IA+B9B,CAAA"}
1
+ {"version":3,"file":"global-tools.d.ts","sourceRoot":"","sources":["../../../src/tools/cms/global-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AAEnD;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,IA6B7B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,IAwB3B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,IA+B9B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/cms/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,uBAAuB,CAAA;AAC9B,YAAY,EACV,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,WAAW,GACZ,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEpF,OAAO,EACL,eAAe,EACf,YAAY,EACZ,aAAa,EACb,eAAe,EACf,eAAe,GAChB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EACL,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,cAAc,GACf,MAAM,iBAAiB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/cms/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,WAAW,GACZ,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErF,OAAO,EACL,eAAe,EACf,YAAY,EACZ,aAAa,EACb,eAAe,EACf,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,cAAc,GACf,MAAM,iBAAiB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"media-tools.d.ts","sourceRoot":"","sources":["../../../src/tools/cms/media-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,YAAY,CAAA;AAElD;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,IAqC3B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,IAsB1B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,IAyC7B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,IAuB7B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,IAoC7B,CAAA"}
1
+ {"version":3,"file":"media-tools.d.ts","sourceRoot":"","sources":["../../../src/tools/cms/media-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AAEnD;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,IAqC3B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,IAsB1B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,IAyC7B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,IAuB7B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,IAoC7B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"user-tools.d.ts","sourceRoot":"","sources":["../../../src/tools/cms/user-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,YAAY,CAAA;AAElD;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,IAoBhC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,IAiC3B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,IAsC5B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,IAsC5B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,IAuB5B,CAAA"}
1
+ {"version":3,"file":"user-tools.d.ts","sourceRoot":"","sources":["../../../src/tools/cms/user-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AAEnD;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,IAoBhC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,IAiC3B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,IAsC5B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,IAsC5B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,IAuB5B,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * file_edit — Surgical string replacement in a file
3
+ */
4
+ import type { Tool } from '../base.js';
5
+ export declare const fileEditTool: Tool;
6
+ //# sourceMappingURL=file-edit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-edit.d.ts","sourceRoot":"","sources":["../../../src/tools/coding/file-edit.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AAGnD,eAAO,MAAM,YAAY,EAAE,IA4E1B,CAAC"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * file_edit — Surgical string replacement in a file
3
+ */
4
+ import { readFileSync, writeFileSync } from 'node:fs';
5
+ import { z } from 'zod/v4';
6
+ import { getSafetyConfig, resolveSafePath, validatePath } from './safety.js';
7
+ export const fileEditTool = {
8
+ name: 'file_edit',
9
+ label: 'Edit File',
10
+ description: 'Replace an exact string in a file. The old_text must appear exactly once in the file. For creating new files or full rewrites, use file_write instead.',
11
+ parameters: z.object({
12
+ path: z.string().describe('File path relative to project root'),
13
+ old_text: z
14
+ .string()
15
+ .describe('The exact text to find and replace (must be unique in the file)'),
16
+ new_text: z.string().describe('The replacement text'),
17
+ }),
18
+ async execute(params) {
19
+ const { path, old_text, new_text } = params;
20
+ const config = getSafetyConfig();
21
+ const check = validatePath(path, config);
22
+ if (!check.safe) {
23
+ return { success: false, error: check.reason };
24
+ }
25
+ if (old_text === new_text) {
26
+ return { success: false, error: 'old_text and new_text are identical — nothing to change' };
27
+ }
28
+ const resolvedPath = resolveSafePath(path, config);
29
+ try {
30
+ const content = readFileSync(resolvedPath, 'utf8');
31
+ // Count occurrences
32
+ let count = 0;
33
+ let idx = 0;
34
+ while (idx < content.length) {
35
+ const found = content.indexOf(old_text, idx);
36
+ if (found === -1)
37
+ break;
38
+ count++;
39
+ idx = found + old_text.length;
40
+ }
41
+ if (count === 0) {
42
+ return {
43
+ success: false,
44
+ error: `old_text not found in ${path}. Verify the exact text including whitespace.`,
45
+ };
46
+ }
47
+ if (count > 1) {
48
+ return {
49
+ success: false,
50
+ error: `old_text found ${count} times in ${path}. Provide more surrounding context to make it unique.`,
51
+ };
52
+ }
53
+ const updated = content.replace(old_text, new_text);
54
+ writeFileSync(resolvedPath, updated, 'utf8');
55
+ const addedLines = new_text.split('\n').length - old_text.split('\n').length;
56
+ const sign = addedLines >= 0 ? '+' : '';
57
+ return {
58
+ success: true,
59
+ data: { path, addedLines },
60
+ content: `Edited ${path} (${sign}${addedLines} lines)`,
61
+ };
62
+ }
63
+ catch (err) {
64
+ const code = err.code;
65
+ if (code === 'ENOENT')
66
+ return { success: false, error: `File not found: ${path}` };
67
+ return {
68
+ success: false,
69
+ error: `Failed to edit ${path}: ${err instanceof Error ? err.message : String(err)}`,
70
+ };
71
+ }
72
+ },
73
+ };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * file_glob — Fast file pattern matching with picomatch-style globs
3
+ */
4
+ import type { Tool } from '../base.js';
5
+ export declare const fileGlobTool: Tool;
6
+ //# sourceMappingURL=file-glob.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-glob.d.ts","sourceRoot":"","sources":["../../../src/tools/coding/file-glob.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AA+DnD,eAAO,MAAM,YAAY,EAAE,IAgE1B,CAAC"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * file_glob — Fast file pattern matching with picomatch-style globs
3
+ */
4
+ import { readdirSync, statSync } from 'node:fs';
5
+ import { join, relative } from 'node:path';
6
+ import { z } from 'zod/v4';
7
+ import { getSafetyConfig } from './safety.js';
8
+ /** Simple glob matcher supporting *, **, and ? */
9
+ function matchGlob(pattern, filePath) {
10
+ const regex = pattern
11
+ .replace(/\./g, '\\.')
12
+ .replace(/\*\*/g, '⟨GLOBSTAR⟩')
13
+ .replace(/\*/g, '[^/]*')
14
+ .replace(/\?/g, '[^/]')
15
+ .replace(/⟨GLOBSTAR⟩/g, '.*');
16
+ return new RegExp(`^${regex}$`).test(filePath);
17
+ }
18
+ /** Recursively walk a directory, yielding relative paths */
19
+ function walkDir(dir, root, maxFiles) {
20
+ const results = [];
21
+ function recurse(current) {
22
+ if (results.length >= maxFiles)
23
+ return;
24
+ let entries;
25
+ try {
26
+ entries = readdirSync(current);
27
+ }
28
+ catch {
29
+ return;
30
+ }
31
+ for (const entry of entries) {
32
+ if (results.length >= maxFiles)
33
+ return;
34
+ // Skip common non-useful directories
35
+ if (entry === 'node_modules' ||
36
+ entry === '.git' ||
37
+ entry === 'dist' ||
38
+ entry === '.turbo' ||
39
+ entry === '.next' ||
40
+ entry === 'coverage') {
41
+ continue;
42
+ }
43
+ const fullPath = join(current, entry);
44
+ let stat;
45
+ try {
46
+ stat = statSync(fullPath);
47
+ }
48
+ catch {
49
+ continue;
50
+ }
51
+ if (stat.isDirectory()) {
52
+ recurse(fullPath);
53
+ }
54
+ else {
55
+ results.push(relative(root, fullPath));
56
+ }
57
+ }
58
+ }
59
+ recurse(dir);
60
+ return results;
61
+ }
62
+ export const fileGlobTool = {
63
+ name: 'file_glob',
64
+ label: 'Find Files',
65
+ description: 'Find files matching a glob pattern. Supports *, **, and ? wildcards. Results sorted by modification time (newest first). Skips node_modules, .git, dist, .turbo.',
66
+ parameters: z.object({
67
+ pattern: z.string().describe('Glob pattern (e.g., "**/*.ts", "src/**/*.test.ts")'),
68
+ path: z
69
+ .string()
70
+ .optional()
71
+ .describe('Directory to search in, relative to project root (default: project root)'),
72
+ }),
73
+ async execute(params) {
74
+ const { pattern, path } = params;
75
+ const config = getSafetyConfig();
76
+ const maxFiles = 10_000;
77
+ const searchRoot = path ? join(config.projectRoot, path) : config.projectRoot;
78
+ try {
79
+ const stat = statSync(searchRoot);
80
+ if (!stat.isDirectory()) {
81
+ return { success: false, error: `Not a directory: ${path ?? '.'}` };
82
+ }
83
+ }
84
+ catch {
85
+ return { success: false, error: `Directory not found: ${path ?? '.'}` };
86
+ }
87
+ try {
88
+ const allFiles = walkDir(searchRoot, config.projectRoot, maxFiles);
89
+ // Filter by glob pattern
90
+ const matched = allFiles.filter((f) => matchGlob(pattern, f));
91
+ // Sort by mtime (newest first)
92
+ const withMtime = matched.map((f) => {
93
+ try {
94
+ const s = statSync(join(config.projectRoot, f));
95
+ return { path: f, mtime: s.mtimeMs };
96
+ }
97
+ catch {
98
+ return { path: f, mtime: 0 };
99
+ }
100
+ });
101
+ withMtime.sort((a, b) => b.mtime - a.mtime);
102
+ const paths = withMtime.map((f) => f.path);
103
+ const truncated = paths.length > 200;
104
+ const display = truncated ? paths.slice(0, 200) : paths;
105
+ return {
106
+ success: true,
107
+ data: { pattern, totalMatches: paths.length, files: display },
108
+ content: truncated
109
+ ? `Found ${paths.length} files matching "${pattern}" (showing first 200):\n${display.join('\n')}`
110
+ : `Found ${paths.length} files matching "${pattern}":\n${display.join('\n')}`,
111
+ };
112
+ }
113
+ catch (err) {
114
+ return {
115
+ success: false,
116
+ error: `Glob failed: ${err instanceof Error ? err.message : String(err)}`,
117
+ };
118
+ }
119
+ },
120
+ };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * file_grep — Regex content search across files
3
+ */
4
+ import type { Tool } from '../base.js';
5
+ export declare const fileGrepTool: Tool;
6
+ //# sourceMappingURL=file-grep.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-grep.d.ts","sourceRoot":"","sources":["../../../src/tools/coding/file-grep.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AAiGnD,eAAO,MAAM,YAAY,EAAE,IA0H1B,CAAC"}
@@ -0,0 +1,194 @@
1
+ /**
2
+ * file_grep — Regex content search across files
3
+ */
4
+ import { readdirSync, readFileSync, statSync } from 'node:fs';
5
+ import { join, relative } from 'node:path';
6
+ import { z } from 'zod/v4';
7
+ import { getSafetyConfig } from './safety.js';
8
+ /** Simple glob test for file filtering */
9
+ function matchesGlob(filePath, glob) {
10
+ const regex = glob
11
+ .replace(/\./g, '\\.')
12
+ .replace(/\*\*/g, '⟨GLOBSTAR⟩')
13
+ .replace(/\*/g, '[^/]*')
14
+ .replace(/\?/g, '[^/]')
15
+ .replace(/⟨GLOBSTAR⟩/g, '.*');
16
+ return new RegExp(`^${regex}$`).test(filePath);
17
+ }
18
+ const SKIP_DIRS = new Set([
19
+ 'node_modules',
20
+ '.git',
21
+ 'dist',
22
+ '.turbo',
23
+ '.next',
24
+ 'coverage',
25
+ '.vercel',
26
+ ]);
27
+ const BINARY_EXTENSIONS = new Set([
28
+ '.png',
29
+ '.jpg',
30
+ '.jpeg',
31
+ '.gif',
32
+ '.ico',
33
+ '.webp',
34
+ '.svg',
35
+ '.woff',
36
+ '.woff2',
37
+ '.ttf',
38
+ '.eot',
39
+ '.mp3',
40
+ '.mp4',
41
+ '.zip',
42
+ '.tar',
43
+ '.gz',
44
+ '.pdf',
45
+ '.lock',
46
+ ]);
47
+ function isBinary(path) {
48
+ const ext = path.slice(path.lastIndexOf('.'));
49
+ return BINARY_EXTENSIONS.has(ext);
50
+ }
51
+ /** Recursively collect file paths */
52
+ function collectFiles(dir, root, glob, maxFiles = 50_000) {
53
+ const results = [];
54
+ function recurse(current) {
55
+ if (results.length >= maxFiles)
56
+ return;
57
+ let entries;
58
+ try {
59
+ entries = readdirSync(current);
60
+ }
61
+ catch {
62
+ return;
63
+ }
64
+ for (const entry of entries) {
65
+ if (results.length >= maxFiles)
66
+ return;
67
+ if (SKIP_DIRS.has(entry))
68
+ continue;
69
+ const fullPath = join(current, entry);
70
+ let stat;
71
+ try {
72
+ stat = statSync(fullPath);
73
+ }
74
+ catch {
75
+ continue;
76
+ }
77
+ if (stat.isDirectory()) {
78
+ recurse(fullPath);
79
+ }
80
+ else if (!isBinary(fullPath)) {
81
+ const rel = relative(root, fullPath);
82
+ if (!glob || matchesGlob(rel, glob)) {
83
+ results.push(fullPath);
84
+ }
85
+ }
86
+ }
87
+ }
88
+ recurse(dir);
89
+ return results;
90
+ }
91
+ export const fileGrepTool = {
92
+ name: 'file_grep',
93
+ label: 'Search Code',
94
+ description: 'Search file contents with regex. Returns matching lines with context. Use glob to filter by file pattern. Skips binary files and node_modules.',
95
+ parameters: z.object({
96
+ pattern: z.string().describe('Regex pattern to search for'),
97
+ path: z
98
+ .string()
99
+ .optional()
100
+ .describe('Directory to search in, relative to project root (default: project root)'),
101
+ glob: z.string().optional().describe('File glob to filter (e.g., "**/*.ts", "*.json")'),
102
+ contextLines: z
103
+ .number()
104
+ .optional()
105
+ .describe('Lines of context before/after each match (default: 0)'),
106
+ }),
107
+ async execute(params) {
108
+ const { pattern, path, glob, contextLines = 0, } = params;
109
+ const config = getSafetyConfig();
110
+ const maxMatches = 500;
111
+ const searchRoot = path ? join(config.projectRoot, path) : config.projectRoot;
112
+ let regex;
113
+ try {
114
+ regex = new RegExp(pattern, 'g');
115
+ }
116
+ catch (err) {
117
+ return {
118
+ success: false,
119
+ error: `Invalid regex: ${err instanceof Error ? err.message : String(err)}`,
120
+ };
121
+ }
122
+ try {
123
+ const files = collectFiles(searchRoot, config.projectRoot, glob);
124
+ const matches = [];
125
+ let filesSearched = 0;
126
+ let filesWithMatches = 0;
127
+ for (const filePath of files) {
128
+ if (matches.length >= maxMatches)
129
+ break;
130
+ let content;
131
+ try {
132
+ content = readFileSync(filePath, 'utf8');
133
+ }
134
+ catch {
135
+ continue;
136
+ }
137
+ filesSearched++;
138
+ const lines = content.split('\n');
139
+ let fileHasMatch = false;
140
+ for (let i = 0; i < lines.length; i++) {
141
+ if (matches.length >= maxMatches)
142
+ break;
143
+ regex.lastIndex = 0;
144
+ const currentLine = lines[i];
145
+ if (currentLine !== undefined && regex.test(currentLine)) {
146
+ if (!fileHasMatch) {
147
+ fileHasMatch = true;
148
+ filesWithMatches++;
149
+ }
150
+ const rel = relative(config.projectRoot, filePath);
151
+ if (contextLines > 0) {
152
+ const start = Math.max(0, i - contextLines);
153
+ const end = Math.min(lines.length - 1, i + contextLines);
154
+ const ctx = lines
155
+ .slice(start, end + 1)
156
+ .map((l, idx) => {
157
+ const lineNum = start + idx + 1;
158
+ const marker = start + idx === i ? '>' : ' ';
159
+ return `${marker}${String(lineNum).padStart(6)} ${l}`;
160
+ })
161
+ .join('\n');
162
+ matches.push({ file: rel, line: i + 1, content: ctx });
163
+ }
164
+ else {
165
+ matches.push({
166
+ file: rel,
167
+ line: i + 1,
168
+ content: currentLine.trim(),
169
+ });
170
+ }
171
+ }
172
+ }
173
+ }
174
+ const truncated = matches.length >= maxMatches;
175
+ const summary = `${filesWithMatches} files, ${matches.length} matches${truncated ? ' (truncated)' : ''} across ${filesSearched} files searched`;
176
+ const display = matches
177
+ .map((m) => contextLines > 0
178
+ ? `${m.file}:${m.line}\n${m.content}`
179
+ : `${m.file}:${m.line}: ${m.content}`)
180
+ .join('\n');
181
+ return {
182
+ success: true,
183
+ data: { pattern, filesSearched, filesWithMatches, matchCount: matches.length, matches },
184
+ content: `${summary}\n${display}`,
185
+ };
186
+ }
187
+ catch (err) {
188
+ return {
189
+ success: false,
190
+ error: `Grep failed: ${err instanceof Error ? err.message : String(err)}`,
191
+ };
192
+ }
193
+ },
194
+ };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * file_read — Read file contents with line numbers
3
+ */
4
+ import type { Tool } from '../base.js';
5
+ export declare const fileReadTool: Tool;
6
+ //# sourceMappingURL=file-read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-read.d.ts","sourceRoot":"","sources":["../../../src/tools/coding/file-read.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AAGnD,eAAO,MAAM,YAAY,EAAE,IAkE1B,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * file_read — Read file contents with line numbers
3
+ */
4
+ import { readFileSync, statSync } from 'node:fs';
5
+ import { z } from 'zod/v4';
6
+ import { getSafetyConfig, resolveSafePath, validatePath } from './safety.js';
7
+ export const fileReadTool = {
8
+ name: 'file_read',
9
+ label: 'Read File',
10
+ description: 'Read the contents of a file. Returns line-numbered output. Use offset/limit to read specific sections of large files.',
11
+ parameters: z.object({
12
+ path: z.string().describe('File path relative to project root'),
13
+ offset: z.number().optional().describe('Start reading from this line number (1-based)'),
14
+ limit: z.number().optional().describe('Maximum number of lines to read (default: 2000)'),
15
+ }),
16
+ async execute(params) {
17
+ const { path, offset, limit } = params;
18
+ const config = getSafetyConfig();
19
+ const check = validatePath(path, config);
20
+ if (!check.safe) {
21
+ return { success: false, error: check.reason };
22
+ }
23
+ const resolvedPath = resolveSafePath(path, config);
24
+ const maxLines = limit ?? 2000;
25
+ const startLine = (offset ?? 1) - 1; // Convert to 0-based
26
+ try {
27
+ const stat = statSync(resolvedPath);
28
+ if (stat.isDirectory()) {
29
+ return {
30
+ success: false,
31
+ error: `${path} is a directory, not a file. Use file_glob to list directory contents.`,
32
+ };
33
+ }
34
+ const raw = readFileSync(resolvedPath, 'utf8');
35
+ const allLines = raw.split('\n');
36
+ const totalLines = allLines.length;
37
+ const sliced = allLines.slice(startLine, startLine + maxLines);
38
+ const numbered = sliced
39
+ .map((line, i) => `${String(startLine + i + 1).padStart(6)} ${line}`)
40
+ .join('\n');
41
+ const truncated = sliced.length < totalLines - startLine;
42
+ const summary = truncated
43
+ ? `${path} (lines ${startLine + 1}-${startLine + sliced.length} of ${totalLines})`
44
+ : `${path} (${totalLines} lines)`;
45
+ return {
46
+ success: true,
47
+ data: {
48
+ path,
49
+ totalLines,
50
+ startLine: startLine + 1,
51
+ linesReturned: sliced.length,
52
+ content: numbered,
53
+ },
54
+ content: `${summary}\n${numbered}`,
55
+ };
56
+ }
57
+ catch (err) {
58
+ const code = err.code;
59
+ if (code === 'ENOENT')
60
+ return { success: false, error: `File not found: ${path}` };
61
+ if (code === 'EACCES')
62
+ return { success: false, error: `Permission denied: ${path}` };
63
+ return {
64
+ success: false,
65
+ error: `Failed to read ${path}: ${err instanceof Error ? err.message : String(err)}`,
66
+ };
67
+ }
68
+ },
69
+ };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * file_write — Write entire file contents
3
+ */
4
+ import type { Tool } from '../base.js';
5
+ export declare const fileWriteTool: Tool;
6
+ //# sourceMappingURL=file-write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-write.d.ts","sourceRoot":"","sources":["../../../src/tools/coding/file-write.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AAGnD,eAAO,MAAM,aAAa,EAAE,IAkD3B,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * file_write — Write entire file contents
3
+ */
4
+ import { mkdirSync, writeFileSync } from 'node:fs';
5
+ import { dirname } from 'node:path';
6
+ import { z } from 'zod/v4';
7
+ import { getSafetyConfig, resolveSafePath, validatePath } from './safety.js';
8
+ export const fileWriteTool = {
9
+ name: 'file_write',
10
+ label: 'Write File',
11
+ description: 'Write content to a file, creating it if it does not exist. Overwrites existing content. Use file_edit for surgical changes to existing files.',
12
+ parameters: z.object({
13
+ path: z.string().describe('File path relative to project root'),
14
+ content: z.string().describe('The full content to write'),
15
+ createDirs: z
16
+ .boolean()
17
+ .optional()
18
+ .describe('Create parent directories if they do not exist (default: true)'),
19
+ }),
20
+ async execute(params) {
21
+ const { path, content, createDirs } = params;
22
+ const config = getSafetyConfig();
23
+ const check = validatePath(path, config);
24
+ if (!check.safe) {
25
+ return { success: false, error: check.reason };
26
+ }
27
+ const resolvedPath = resolveSafePath(path, config);
28
+ try {
29
+ if (createDirs !== false) {
30
+ mkdirSync(dirname(resolvedPath), { recursive: true });
31
+ }
32
+ // Normalize to trailing newline
33
+ const normalized = content.endsWith('\n') ? content : `${content}\n`;
34
+ writeFileSync(resolvedPath, normalized, 'utf8');
35
+ const lineCount = normalized.split('\n').length - 1;
36
+ return {
37
+ success: true,
38
+ data: { path, bytes: Buffer.byteLength(normalized), lines: lineCount },
39
+ content: `Wrote ${lineCount} lines to ${path}`,
40
+ };
41
+ }
42
+ catch (err) {
43
+ return {
44
+ success: false,
45
+ error: `Failed to write ${path}: ${err instanceof Error ? err.message : String(err)}`,
46
+ };
47
+ }
48
+ },
49
+ };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * git_ops — Git operations wrapper (status, diff, log, blame)
3
+ */
4
+ import type { Tool } from '../base.js';
5
+ export declare const gitOpsTool: Tool;
6
+ //# sourceMappingURL=git-ops.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-ops.d.ts","sourceRoot":"","sources":["../../../src/tools/coding/git-ops.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AAyBnD,eAAO,MAAM,UAAU,EAAE,IA4FxB,CAAC"}