@dreb/coding-agent 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (809) hide show
  1. package/CHANGELOG.md +3316 -0
  2. package/README.md +657 -0
  3. package/agents/code-reviewer.md +55 -0
  4. package/agents/completeness-checker.md +71 -0
  5. package/agents/error-auditor.md +65 -0
  6. package/agents/explore.md +13 -0
  7. package/agents/feature-dev.md +23 -0
  8. package/agents/independent-assessor.md +61 -0
  9. package/agents/sandbox.md +14 -0
  10. package/agents/simplifier.md +69 -0
  11. package/agents/test-reviewer.md +63 -0
  12. package/dist/bun/cli.d.ts +3 -0
  13. package/dist/bun/cli.d.ts.map +1 -0
  14. package/dist/bun/cli.js +7 -0
  15. package/dist/bun/cli.js.map +1 -0
  16. package/dist/bun/register-bedrock.d.ts +2 -0
  17. package/dist/bun/register-bedrock.d.ts.map +1 -0
  18. package/dist/bun/register-bedrock.js +4 -0
  19. package/dist/bun/register-bedrock.js.map +1 -0
  20. package/dist/cli/args.d.ts +50 -0
  21. package/dist/cli/args.d.ts.map +1 -0
  22. package/dist/cli/args.js +310 -0
  23. package/dist/cli/args.js.map +1 -0
  24. package/dist/cli/config-selector.d.ts +14 -0
  25. package/dist/cli/config-selector.d.ts.map +1 -0
  26. package/dist/cli/config-selector.js +31 -0
  27. package/dist/cli/config-selector.js.map +1 -0
  28. package/dist/cli/file-processor.d.ts +15 -0
  29. package/dist/cli/file-processor.d.ts.map +1 -0
  30. package/dist/cli/file-processor.js +83 -0
  31. package/dist/cli/file-processor.js.map +1 -0
  32. package/dist/cli/initial-message.d.ts +18 -0
  33. package/dist/cli/initial-message.d.ts.map +1 -0
  34. package/dist/cli/initial-message.js +22 -0
  35. package/dist/cli/initial-message.js.map +1 -0
  36. package/dist/cli/list-models.d.ts +9 -0
  37. package/dist/cli/list-models.d.ts.map +1 -0
  38. package/dist/cli/list-models.js +92 -0
  39. package/dist/cli/list-models.js.map +1 -0
  40. package/dist/cli/session-picker.d.ts +9 -0
  41. package/dist/cli/session-picker.d.ts.map +1 -0
  42. package/dist/cli/session-picker.js +35 -0
  43. package/dist/cli/session-picker.js.map +1 -0
  44. package/dist/cli.d.ts +3 -0
  45. package/dist/cli.d.ts.map +1 -0
  46. package/dist/cli.js +14 -0
  47. package/dist/cli.js.map +1 -0
  48. package/dist/config.d.ts +76 -0
  49. package/dist/config.d.ts.map +1 -0
  50. package/dist/config.js +234 -0
  51. package/dist/config.js.map +1 -0
  52. package/dist/core/agent-session.d.ts +658 -0
  53. package/dist/core/agent-session.d.ts.map +1 -0
  54. package/dist/core/agent-session.js +2898 -0
  55. package/dist/core/agent-session.js.map +1 -0
  56. package/dist/core/auth-storage.d.ts +130 -0
  57. package/dist/core/auth-storage.d.ts.map +1 -0
  58. package/dist/core/auth-storage.js +421 -0
  59. package/dist/core/auth-storage.js.map +1 -0
  60. package/dist/core/bash-executor.d.ts +46 -0
  61. package/dist/core/bash-executor.d.ts.map +1 -0
  62. package/dist/core/bash-executor.js +113 -0
  63. package/dist/core/bash-executor.js.map +1 -0
  64. package/dist/core/buddy/buddy-controller.d.ts +139 -0
  65. package/dist/core/buddy/buddy-controller.d.ts.map +1 -0
  66. package/dist/core/buddy/buddy-controller.js +428 -0
  67. package/dist/core/buddy/buddy-controller.js.map +1 -0
  68. package/dist/core/buddy/buddy-manager.d.ts +68 -0
  69. package/dist/core/buddy/buddy-manager.d.ts.map +1 -0
  70. package/dist/core/buddy/buddy-manager.js +399 -0
  71. package/dist/core/buddy/buddy-manager.js.map +1 -0
  72. package/dist/core/buddy/buddy-prng.d.ts +28 -0
  73. package/dist/core/buddy/buddy-prng.d.ts.map +1 -0
  74. package/dist/core/buddy/buddy-prng.js +65 -0
  75. package/dist/core/buddy/buddy-prng.js.map +1 -0
  76. package/dist/core/buddy/buddy-species.d.ts +37 -0
  77. package/dist/core/buddy/buddy-species.d.ts.map +1 -0
  78. package/dist/core/buddy/buddy-species.js +287 -0
  79. package/dist/core/buddy/buddy-species.js.map +1 -0
  80. package/dist/core/buddy/buddy-types.d.ts +58 -0
  81. package/dist/core/buddy/buddy-types.d.ts.map +1 -0
  82. package/dist/core/buddy/buddy-types.js +46 -0
  83. package/dist/core/buddy/buddy-types.js.map +1 -0
  84. package/dist/core/buddy/index.d.ts +7 -0
  85. package/dist/core/buddy/index.d.ts.map +1 -0
  86. package/dist/core/buddy/index.js +6 -0
  87. package/dist/core/buddy/index.js.map +1 -0
  88. package/dist/core/compaction/branch-summarization.d.ts +86 -0
  89. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  90. package/dist/core/compaction/branch-summarization.js +243 -0
  91. package/dist/core/compaction/branch-summarization.js.map +1 -0
  92. package/dist/core/compaction/compaction.d.ts +121 -0
  93. package/dist/core/compaction/compaction.d.ts.map +1 -0
  94. package/dist/core/compaction/compaction.js +612 -0
  95. package/dist/core/compaction/compaction.js.map +1 -0
  96. package/dist/core/compaction/index.d.ts +7 -0
  97. package/dist/core/compaction/index.d.ts.map +1 -0
  98. package/dist/core/compaction/index.js +7 -0
  99. package/dist/core/compaction/index.js.map +1 -0
  100. package/dist/core/compaction/utils.d.ts +38 -0
  101. package/dist/core/compaction/utils.d.ts.map +1 -0
  102. package/dist/core/compaction/utils.js +153 -0
  103. package/dist/core/compaction/utils.js.map +1 -0
  104. package/dist/core/defaults.d.ts +3 -0
  105. package/dist/core/defaults.d.ts.map +1 -0
  106. package/dist/core/defaults.js +2 -0
  107. package/dist/core/defaults.js.map +1 -0
  108. package/dist/core/diagnostics.d.ts +15 -0
  109. package/dist/core/diagnostics.d.ts.map +1 -0
  110. package/dist/core/diagnostics.js +2 -0
  111. package/dist/core/diagnostics.js.map +1 -0
  112. package/dist/core/event-bus.d.ts +9 -0
  113. package/dist/core/event-bus.d.ts.map +1 -0
  114. package/dist/core/event-bus.js +25 -0
  115. package/dist/core/event-bus.js.map +1 -0
  116. package/dist/core/exec.d.ts +29 -0
  117. package/dist/core/exec.d.ts.map +1 -0
  118. package/dist/core/exec.js +75 -0
  119. package/dist/core/exec.js.map +1 -0
  120. package/dist/core/export-html/ansi-to-html.d.ts +22 -0
  121. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  122. package/dist/core/export-html/ansi-to-html.js +249 -0
  123. package/dist/core/export-html/ansi-to-html.js.map +1 -0
  124. package/dist/core/export-html/index.d.ts +37 -0
  125. package/dist/core/export-html/index.d.ts.map +1 -0
  126. package/dist/core/export-html/index.js +224 -0
  127. package/dist/core/export-html/index.js.map +1 -0
  128. package/dist/core/export-html/template.css +1001 -0
  129. package/dist/core/export-html/template.html +55 -0
  130. package/dist/core/export-html/template.js +1690 -0
  131. package/dist/core/export-html/tool-renderer.d.ts +38 -0
  132. package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  133. package/dist/core/export-html/tool-renderer.js +95 -0
  134. package/dist/core/export-html/tool-renderer.js.map +1 -0
  135. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  136. package/dist/core/export-html/vendor/marked.min.js +6 -0
  137. package/dist/core/extensions/index.d.ts +12 -0
  138. package/dist/core/extensions/index.d.ts.map +1 -0
  139. package/dist/core/extensions/index.js +9 -0
  140. package/dist/core/extensions/index.js.map +1 -0
  141. package/dist/core/extensions/loader.d.ts +25 -0
  142. package/dist/core/extensions/loader.d.ts.map +1 -0
  143. package/dist/core/extensions/loader.js +436 -0
  144. package/dist/core/extensions/loader.js.map +1 -0
  145. package/dist/core/extensions/runner.d.ts +147 -0
  146. package/dist/core/extensions/runner.d.ts.map +1 -0
  147. package/dist/core/extensions/runner.js +696 -0
  148. package/dist/core/extensions/runner.js.map +1 -0
  149. package/dist/core/extensions/types.d.ts +1072 -0
  150. package/dist/core/extensions/types.d.ts.map +1 -0
  151. package/dist/core/extensions/types.js +35 -0
  152. package/dist/core/extensions/types.js.map +1 -0
  153. package/dist/core/extensions/wrapper.d.ts +20 -0
  154. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  155. package/dist/core/extensions/wrapper.js +22 -0
  156. package/dist/core/extensions/wrapper.js.map +1 -0
  157. package/dist/core/footer-data-provider.d.ts +44 -0
  158. package/dist/core/footer-data-provider.d.ts.map +1 -0
  159. package/dist/core/footer-data-provider.js +252 -0
  160. package/dist/core/footer-data-provider.js.map +1 -0
  161. package/dist/core/forbidden-commands.d.ts +31 -0
  162. package/dist/core/forbidden-commands.d.ts.map +1 -0
  163. package/dist/core/forbidden-commands.js +184 -0
  164. package/dist/core/forbidden-commands.js.map +1 -0
  165. package/dist/core/git-root.d.ts +6 -0
  166. package/dist/core/git-root.d.ts.map +1 -0
  167. package/dist/core/git-root.js +32 -0
  168. package/dist/core/git-root.js.map +1 -0
  169. package/dist/core/index.d.ts +10 -0
  170. package/dist/core/index.d.ts.map +1 -0
  171. package/dist/core/index.js +10 -0
  172. package/dist/core/index.js.map +1 -0
  173. package/dist/core/keybindings.d.ts +280 -0
  174. package/dist/core/keybindings.d.ts.map +1 -0
  175. package/dist/core/keybindings.js +245 -0
  176. package/dist/core/keybindings.js.map +1 -0
  177. package/dist/core/memory-prompt.d.ts +10 -0
  178. package/dist/core/memory-prompt.d.ts.map +1 -0
  179. package/dist/core/memory-prompt.js +95 -0
  180. package/dist/core/memory-prompt.js.map +1 -0
  181. package/dist/core/messages.d.ts +77 -0
  182. package/dist/core/messages.d.ts.map +1 -0
  183. package/dist/core/messages.js +123 -0
  184. package/dist/core/messages.js.map +1 -0
  185. package/dist/core/model-registry.d.ts +114 -0
  186. package/dist/core/model-registry.d.ts.map +1 -0
  187. package/dist/core/model-registry.js +563 -0
  188. package/dist/core/model-registry.js.map +1 -0
  189. package/dist/core/model-resolver.d.ts +116 -0
  190. package/dist/core/model-resolver.d.ts.map +1 -0
  191. package/dist/core/model-resolver.js +465 -0
  192. package/dist/core/model-resolver.js.map +1 -0
  193. package/dist/core/output-guard.d.ts +6 -0
  194. package/dist/core/output-guard.d.ts.map +1 -0
  195. package/dist/core/output-guard.js +59 -0
  196. package/dist/core/output-guard.js.map +1 -0
  197. package/dist/core/package-manager.d.ts +172 -0
  198. package/dist/core/package-manager.d.ts.map +1 -0
  199. package/dist/core/package-manager.js +1767 -0
  200. package/dist/core/package-manager.js.map +1 -0
  201. package/dist/core/prompt-templates.d.ts +51 -0
  202. package/dist/core/prompt-templates.d.ts.map +1 -0
  203. package/dist/core/prompt-templates.js +251 -0
  204. package/dist/core/prompt-templates.js.map +1 -0
  205. package/dist/core/resolve-config-value.d.ts +17 -0
  206. package/dist/core/resolve-config-value.d.ts.map +1 -0
  207. package/dist/core/resolve-config-value.js +94 -0
  208. package/dist/core/resolve-config-value.js.map +1 -0
  209. package/dist/core/resource-loader.d.ts +205 -0
  210. package/dist/core/resource-loader.d.ts.map +1 -0
  211. package/dist/core/resource-loader.js +866 -0
  212. package/dist/core/resource-loader.js.map +1 -0
  213. package/dist/core/sdk.d.ts +92 -0
  214. package/dist/core/sdk.d.ts.map +1 -0
  215. package/dist/core/sdk.js +258 -0
  216. package/dist/core/sdk.js.map +1 -0
  217. package/dist/core/search/chunker.d.ts +21 -0
  218. package/dist/core/search/chunker.d.ts.map +1 -0
  219. package/dist/core/search/chunker.js +51 -0
  220. package/dist/core/search/chunker.js.map +1 -0
  221. package/dist/core/search/db.d.ts +89 -0
  222. package/dist/core/search/db.d.ts.map +1 -0
  223. package/dist/core/search/db.js +406 -0
  224. package/dist/core/search/db.js.map +1 -0
  225. package/dist/core/search/embedder.d.ts +51 -0
  226. package/dist/core/search/embedder.d.ts.map +1 -0
  227. package/dist/core/search/embedder.js +143 -0
  228. package/dist/core/search/embedder.js.map +1 -0
  229. package/dist/core/search/index-manager.d.ts +55 -0
  230. package/dist/core/search/index-manager.d.ts.map +1 -0
  231. package/dist/core/search/index-manager.js +311 -0
  232. package/dist/core/search/index-manager.js.map +1 -0
  233. package/dist/core/search/metrics/bm25.d.ts +10 -0
  234. package/dist/core/search/metrics/bm25.d.ts.map +1 -0
  235. package/dist/core/search/metrics/bm25.js +32 -0
  236. package/dist/core/search/metrics/bm25.js.map +1 -0
  237. package/dist/core/search/metrics/git-recency.d.ts +14 -0
  238. package/dist/core/search/metrics/git-recency.d.ts.map +1 -0
  239. package/dist/core/search/metrics/git-recency.js +123 -0
  240. package/dist/core/search/metrics/git-recency.js.map +1 -0
  241. package/dist/core/search/metrics/import-graph.d.ts +15 -0
  242. package/dist/core/search/metrics/import-graph.d.ts.map +1 -0
  243. package/dist/core/search/metrics/import-graph.js +115 -0
  244. package/dist/core/search/metrics/import-graph.js.map +1 -0
  245. package/dist/core/search/metrics/path-match.d.ts +13 -0
  246. package/dist/core/search/metrics/path-match.d.ts.map +1 -0
  247. package/dist/core/search/metrics/path-match.js +54 -0
  248. package/dist/core/search/metrics/path-match.js.map +1 -0
  249. package/dist/core/search/metrics/symbol-match.d.ts +12 -0
  250. package/dist/core/search/metrics/symbol-match.d.ts.map +1 -0
  251. package/dist/core/search/metrics/symbol-match.js +62 -0
  252. package/dist/core/search/metrics/symbol-match.js.map +1 -0
  253. package/dist/core/search/metrics/tokenize.d.ts +12 -0
  254. package/dist/core/search/metrics/tokenize.d.ts.map +1 -0
  255. package/dist/core/search/metrics/tokenize.js +29 -0
  256. package/dist/core/search/metrics/tokenize.js.map +1 -0
  257. package/dist/core/search/poem.d.ts +38 -0
  258. package/dist/core/search/poem.d.ts.map +1 -0
  259. package/dist/core/search/poem.js +214 -0
  260. package/dist/core/search/poem.js.map +1 -0
  261. package/dist/core/search/query-classifier.d.ts +17 -0
  262. package/dist/core/search/query-classifier.d.ts.map +1 -0
  263. package/dist/core/search/query-classifier.js +54 -0
  264. package/dist/core/search/query-classifier.js.map +1 -0
  265. package/dist/core/search/scanner.d.ts +30 -0
  266. package/dist/core/search/scanner.d.ts.map +1 -0
  267. package/dist/core/search/scanner.js +335 -0
  268. package/dist/core/search/scanner.js.map +1 -0
  269. package/dist/core/search/search.d.ts +42 -0
  270. package/dist/core/search/search.d.ts.map +1 -0
  271. package/dist/core/search/search.js +337 -0
  272. package/dist/core/search/search.js.map +1 -0
  273. package/dist/core/search/text-chunker.d.ts +15 -0
  274. package/dist/core/search/text-chunker.d.ts.map +1 -0
  275. package/dist/core/search/text-chunker.js +580 -0
  276. package/dist/core/search/text-chunker.js.map +1 -0
  277. package/dist/core/search/tree-sitter-chunker.d.ts +25 -0
  278. package/dist/core/search/tree-sitter-chunker.d.ts.map +1 -0
  279. package/dist/core/search/tree-sitter-chunker.js +357 -0
  280. package/dist/core/search/tree-sitter-chunker.js.map +1 -0
  281. package/dist/core/search/types.d.ts +96 -0
  282. package/dist/core/search/types.d.ts.map +1 -0
  283. package/dist/core/search/types.js +6 -0
  284. package/dist/core/search/types.js.map +1 -0
  285. package/dist/core/search/vector-store.d.ts +43 -0
  286. package/dist/core/search/vector-store.d.ts.map +1 -0
  287. package/dist/core/search/vector-store.js +73 -0
  288. package/dist/core/search/vector-store.js.map +1 -0
  289. package/dist/core/session-manager.d.ts +329 -0
  290. package/dist/core/session-manager.d.ts.map +1 -0
  291. package/dist/core/session-manager.js +1097 -0
  292. package/dist/core/session-manager.js.map +1 -0
  293. package/dist/core/settings-manager.d.ts +239 -0
  294. package/dist/core/settings-manager.d.ts.map +1 -0
  295. package/dist/core/settings-manager.js +705 -0
  296. package/dist/core/settings-manager.js.map +1 -0
  297. package/dist/core/skills.d.ts +67 -0
  298. package/dist/core/skills.d.ts.map +1 -0
  299. package/dist/core/skills.js +428 -0
  300. package/dist/core/skills.js.map +1 -0
  301. package/dist/core/slash-commands.d.ts +14 -0
  302. package/dist/core/slash-commands.d.ts.map +1 -0
  303. package/dist/core/slash-commands.js +23 -0
  304. package/dist/core/slash-commands.js.map +1 -0
  305. package/dist/core/source-info.d.ts +18 -0
  306. package/dist/core/source-info.d.ts.map +1 -0
  307. package/dist/core/source-info.js +19 -0
  308. package/dist/core/source-info.js.map +1 -0
  309. package/dist/core/system-prompt.d.ts +33 -0
  310. package/dist/core/system-prompt.d.ts.map +1 -0
  311. package/dist/core/system-prompt.js +184 -0
  312. package/dist/core/system-prompt.js.map +1 -0
  313. package/dist/core/timings.d.ts +8 -0
  314. package/dist/core/timings.d.ts.map +1 -0
  315. package/dist/core/timings.js +31 -0
  316. package/dist/core/timings.js.map +1 -0
  317. package/dist/core/tools/bash.d.ts +73 -0
  318. package/dist/core/tools/bash.d.ts.map +1 -0
  319. package/dist/core/tools/bash.js +342 -0
  320. package/dist/core/tools/bash.js.map +1 -0
  321. package/dist/core/tools/edit-diff.d.ts +63 -0
  322. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  323. package/dist/core/tools/edit-diff.js +244 -0
  324. package/dist/core/tools/edit-diff.js.map +1 -0
  325. package/dist/core/tools/edit.d.ts +51 -0
  326. package/dist/core/tools/edit.d.ts.map +1 -0
  327. package/dist/core/tools/edit.js +218 -0
  328. package/dist/core/tools/edit.js.map +1 -0
  329. package/dist/core/tools/file-mutation-queue.d.ts +6 -0
  330. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  331. package/dist/core/tools/file-mutation-queue.js +37 -0
  332. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  333. package/dist/core/tools/find.d.ts +46 -0
  334. package/dist/core/tools/find.d.ts.map +1 -0
  335. package/dist/core/tools/find.js +241 -0
  336. package/dist/core/tools/find.js.map +1 -0
  337. package/dist/core/tools/grep.d.ts +56 -0
  338. package/dist/core/tools/grep.d.ts.map +1 -0
  339. package/dist/core/tools/grep.js +293 -0
  340. package/dist/core/tools/grep.js.map +1 -0
  341. package/dist/core/tools/index.d.ts +176 -0
  342. package/dist/core/tools/index.d.ts.map +1 -0
  343. package/dist/core/tools/index.js +137 -0
  344. package/dist/core/tools/index.js.map +1 -0
  345. package/dist/core/tools/ls.d.ts +46 -0
  346. package/dist/core/tools/ls.d.ts.map +1 -0
  347. package/dist/core/tools/ls.js +172 -0
  348. package/dist/core/tools/ls.js.map +1 -0
  349. package/dist/core/tools/path-utils.d.ts +8 -0
  350. package/dist/core/tools/path-utils.d.ts.map +1 -0
  351. package/dist/core/tools/path-utils.js +81 -0
  352. package/dist/core/tools/path-utils.js.map +1 -0
  353. package/dist/core/tools/read.d.ts +46 -0
  354. package/dist/core/tools/read.d.ts.map +1 -0
  355. package/dist/core/tools/read.js +225 -0
  356. package/dist/core/tools/read.js.map +1 -0
  357. package/dist/core/tools/render-utils.d.ts +21 -0
  358. package/dist/core/tools/render-utils.d.ts.map +1 -0
  359. package/dist/core/tools/render-utils.js +49 -0
  360. package/dist/core/tools/render-utils.js.map +1 -0
  361. package/dist/core/tools/search.d.ts +29 -0
  362. package/dist/core/tools/search.d.ts.map +1 -0
  363. package/dist/core/tools/search.js +187 -0
  364. package/dist/core/tools/search.js.map +1 -0
  365. package/dist/core/tools/skill.d.ts +26 -0
  366. package/dist/core/tools/skill.d.ts.map +1 -0
  367. package/dist/core/tools/skill.js +127 -0
  368. package/dist/core/tools/skill.js.map +1 -0
  369. package/dist/core/tools/subagent.d.ts +147 -0
  370. package/dist/core/tools/subagent.d.ts.map +1 -0
  371. package/dist/core/tools/subagent.js +950 -0
  372. package/dist/core/tools/subagent.js.map +1 -0
  373. package/dist/core/tools/tasks.d.ts +32 -0
  374. package/dist/core/tools/tasks.d.ts.map +1 -0
  375. package/dist/core/tools/tasks.js +110 -0
  376. package/dist/core/tools/tasks.js.map +1 -0
  377. package/dist/core/tools/tmp-read.d.ts +11 -0
  378. package/dist/core/tools/tmp-read.d.ts.map +1 -0
  379. package/dist/core/tools/tmp-read.js +63 -0
  380. package/dist/core/tools/tmp-read.js.map +1 -0
  381. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  382. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  383. package/dist/core/tools/tool-definition-wrapper.js +30 -0
  384. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  385. package/dist/core/tools/truncate.d.ts +70 -0
  386. package/dist/core/tools/truncate.d.ts.map +1 -0
  387. package/dist/core/tools/truncate.js +205 -0
  388. package/dist/core/tools/truncate.js.map +1 -0
  389. package/dist/core/tools/web.d.ts +42 -0
  390. package/dist/core/tools/web.d.ts.map +1 -0
  391. package/dist/core/tools/web.js +518 -0
  392. package/dist/core/tools/web.js.map +1 -0
  393. package/dist/core/tools/write.d.ts +35 -0
  394. package/dist/core/tools/write.d.ts.map +1 -0
  395. package/dist/core/tools/write.js +216 -0
  396. package/dist/core/tools/write.js.map +1 -0
  397. package/dist/index.d.ts +28 -0
  398. package/dist/index.d.ts.map +1 -0
  399. package/dist/index.js +43 -0
  400. package/dist/index.js.map +1 -0
  401. package/dist/main.d.ts +8 -0
  402. package/dist/main.d.ts.map +1 -0
  403. package/dist/main.js +789 -0
  404. package/dist/main.js.map +1 -0
  405. package/dist/migrations.d.ts +33 -0
  406. package/dist/migrations.d.ts.map +1 -0
  407. package/dist/migrations.js +261 -0
  408. package/dist/migrations.js.map +1 -0
  409. package/dist/modes/index.d.ts +9 -0
  410. package/dist/modes/index.d.ts.map +1 -0
  411. package/dist/modes/index.js +8 -0
  412. package/dist/modes/index.js.map +1 -0
  413. package/dist/modes/interactive/components/armin.d.ts +34 -0
  414. package/dist/modes/interactive/components/armin.d.ts.map +1 -0
  415. package/dist/modes/interactive/components/armin.js +333 -0
  416. package/dist/modes/interactive/components/armin.js.map +1 -0
  417. package/dist/modes/interactive/components/assistant-message.d.ts +16 -0
  418. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  419. package/dist/modes/interactive/components/assistant-message.js +96 -0
  420. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  421. package/dist/modes/interactive/components/bash-execution.d.ts +34 -0
  422. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  423. package/dist/modes/interactive/components/bash-execution.js +175 -0
  424. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  425. package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  426. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  427. package/dist/modes/interactive/components/bordered-loader.js +51 -0
  428. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  429. package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  430. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  431. package/dist/modes/interactive/components/branch-summary-message.js +44 -0
  432. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  433. package/dist/modes/interactive/components/buddy-component.d.ts +58 -0
  434. package/dist/modes/interactive/components/buddy-component.d.ts.map +1 -0
  435. package/dist/modes/interactive/components/buddy-component.js +351 -0
  436. package/dist/modes/interactive/components/buddy-component.js.map +1 -0
  437. package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  438. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  439. package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
  440. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  441. package/dist/modes/interactive/components/config-selector.d.ts +71 -0
  442. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  443. package/dist/modes/interactive/components/config-selector.js +479 -0
  444. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  445. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  446. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  447. package/dist/modes/interactive/components/countdown-timer.js +33 -0
  448. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  449. package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
  450. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  451. package/dist/modes/interactive/components/custom-editor.js +70 -0
  452. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  453. package/dist/modes/interactive/components/custom-message.d.ts +20 -0
  454. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  455. package/dist/modes/interactive/components/custom-message.js +79 -0
  456. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  457. package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
  458. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
  459. package/dist/modes/interactive/components/daxnuts.js +140 -0
  460. package/dist/modes/interactive/components/daxnuts.js.map +1 -0
  461. package/dist/modes/interactive/components/diff.d.ts +12 -0
  462. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  463. package/dist/modes/interactive/components/diff.js +133 -0
  464. package/dist/modes/interactive/components/diff.js.map +1 -0
  465. package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  466. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  467. package/dist/modes/interactive/components/dynamic-border.js +21 -0
  468. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  469. package/dist/modes/interactive/components/extension-editor.d.ts +20 -0
  470. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  471. package/dist/modes/interactive/components/extension-editor.js +111 -0
  472. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  473. package/dist/modes/interactive/components/extension-input.d.ts +23 -0
  474. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  475. package/dist/modes/interactive/components/extension-input.js +61 -0
  476. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  477. package/dist/modes/interactive/components/extension-selector.d.ts +24 -0
  478. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  479. package/dist/modes/interactive/components/extension-selector.js +78 -0
  480. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  481. package/dist/modes/interactive/components/footer.d.ts +26 -0
  482. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  483. package/dist/modes/interactive/components/footer.js +198 -0
  484. package/dist/modes/interactive/components/footer.js.map +1 -0
  485. package/dist/modes/interactive/components/index.d.ts +33 -0
  486. package/dist/modes/interactive/components/index.d.ts.map +1 -0
  487. package/dist/modes/interactive/components/index.js +34 -0
  488. package/dist/modes/interactive/components/index.js.map +1 -0
  489. package/dist/modes/interactive/components/keybinding-hints.d.ts +8 -0
  490. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  491. package/dist/modes/interactive/components/keybinding-hints.js +22 -0
  492. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  493. package/dist/modes/interactive/components/login-dialog.d.ts +42 -0
  494. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  495. package/dist/modes/interactive/components/login-dialog.js +145 -0
  496. package/dist/modes/interactive/components/login-dialog.js.map +1 -0
  497. package/dist/modes/interactive/components/model-selector.d.ts +47 -0
  498. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  499. package/dist/modes/interactive/components/model-selector.js +275 -0
  500. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  501. package/dist/modes/interactive/components/oauth-selector.d.ts +19 -0
  502. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  503. package/dist/modes/interactive/components/oauth-selector.js +97 -0
  504. package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  505. package/dist/modes/interactive/components/scoped-models-selector.d.ts +49 -0
  506. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  507. package/dist/modes/interactive/components/scoped-models-selector.js +275 -0
  508. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  509. package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  510. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  511. package/dist/modes/interactive/components/session-selector-search.js +155 -0
  512. package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  513. package/dist/modes/interactive/components/session-selector.d.ts +95 -0
  514. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  515. package/dist/modes/interactive/components/session-selector.js +848 -0
  516. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  517. package/dist/modes/interactive/components/settings-selector.d.ts +58 -0
  518. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  519. package/dist/modes/interactive/components/settings-selector.js +301 -0
  520. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  521. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  522. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  523. package/dist/modes/interactive/components/show-images-selector.js +39 -0
  524. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  525. package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  526. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  527. package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
  528. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  529. package/dist/modes/interactive/components/tasks-panel.d.ts +20 -0
  530. package/dist/modes/interactive/components/tasks-panel.d.ts.map +1 -0
  531. package/dist/modes/interactive/components/tasks-panel.js +66 -0
  532. package/dist/modes/interactive/components/tasks-panel.js.map +1 -0
  533. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  534. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  535. package/dist/modes/interactive/components/theme-selector.js +50 -0
  536. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  537. package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  538. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  539. package/dist/modes/interactive/components/thinking-selector.js +51 -0
  540. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  541. package/dist/modes/interactive/components/tool-execution.d.ts +59 -0
  542. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  543. package/dist/modes/interactive/components/tool-execution.js +279 -0
  544. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  545. package/dist/modes/interactive/components/tree-selector.d.ts +87 -0
  546. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  547. package/dist/modes/interactive/components/tree-selector.js +1051 -0
  548. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  549. package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  550. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  551. package/dist/modes/interactive/components/user-message-selector.js +113 -0
  552. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  553. package/dist/modes/interactive/components/user-message.d.ts +9 -0
  554. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  555. package/dist/modes/interactive/components/user-message.js +28 -0
  556. package/dist/modes/interactive/components/user-message.js.map +1 -0
  557. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  558. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  559. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  560. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  561. package/dist/modes/interactive/interactive-mode.d.ts +338 -0
  562. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  563. package/dist/modes/interactive/interactive-mode.js +4167 -0
  564. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  565. package/dist/modes/interactive/theme/dark.json +85 -0
  566. package/dist/modes/interactive/theme/light.json +84 -0
  567. package/dist/modes/interactive/theme/theme-schema.json +335 -0
  568. package/dist/modes/interactive/theme/theme.d.ts +81 -0
  569. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  570. package/dist/modes/interactive/theme/theme.js +975 -0
  571. package/dist/modes/interactive/theme/theme.js.map +1 -0
  572. package/dist/modes/print-mode.d.ts +28 -0
  573. package/dist/modes/print-mode.d.ts.map +1 -0
  574. package/dist/modes/print-mode.js +107 -0
  575. package/dist/modes/print-mode.js.map +1 -0
  576. package/dist/modes/rpc/index.d.ts +10 -0
  577. package/dist/modes/rpc/index.d.ts.map +1 -0
  578. package/dist/modes/rpc/index.js +8 -0
  579. package/dist/modes/rpc/index.js.map +1 -0
  580. package/dist/modes/rpc/jsonl.d.ts +17 -0
  581. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  582. package/dist/modes/rpc/jsonl.js +49 -0
  583. package/dist/modes/rpc/jsonl.js.map +1 -0
  584. package/dist/modes/rpc/rpc-client.d.ts +237 -0
  585. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  586. package/dist/modes/rpc/rpc-client.js +448 -0
  587. package/dist/modes/rpc/rpc-client.js.map +1 -0
  588. package/dist/modes/rpc/rpc-mode.d.ts +20 -0
  589. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  590. package/dist/modes/rpc/rpc-mode.js +592 -0
  591. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  592. package/dist/modes/rpc/rpc-types.d.ts +471 -0
  593. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  594. package/dist/modes/rpc/rpc-types.js +8 -0
  595. package/dist/modes/rpc/rpc-types.js.map +1 -0
  596. package/dist/utils/changelog.d.ts +21 -0
  597. package/dist/utils/changelog.d.ts.map +1 -0
  598. package/dist/utils/changelog.js +87 -0
  599. package/dist/utils/changelog.js.map +1 -0
  600. package/dist/utils/child-process.d.ts +11 -0
  601. package/dist/utils/child-process.d.ts.map +1 -0
  602. package/dist/utils/child-process.js +78 -0
  603. package/dist/utils/child-process.js.map +1 -0
  604. package/dist/utils/clipboard-image.d.ts +11 -0
  605. package/dist/utils/clipboard-image.d.ts.map +1 -0
  606. package/dist/utils/clipboard-image.js +245 -0
  607. package/dist/utils/clipboard-image.js.map +1 -0
  608. package/dist/utils/clipboard-native.d.ts +8 -0
  609. package/dist/utils/clipboard-native.d.ts.map +1 -0
  610. package/dist/utils/clipboard-native.js +14 -0
  611. package/dist/utils/clipboard-native.js.map +1 -0
  612. package/dist/utils/clipboard.d.ts +2 -0
  613. package/dist/utils/clipboard.d.ts.map +1 -0
  614. package/dist/utils/clipboard.js +78 -0
  615. package/dist/utils/clipboard.js.map +1 -0
  616. package/dist/utils/exif-orientation.d.ts +5 -0
  617. package/dist/utils/exif-orientation.d.ts.map +1 -0
  618. package/dist/utils/exif-orientation.js +158 -0
  619. package/dist/utils/exif-orientation.js.map +1 -0
  620. package/dist/utils/frontmatter.d.ts +8 -0
  621. package/dist/utils/frontmatter.d.ts.map +1 -0
  622. package/dist/utils/frontmatter.js +26 -0
  623. package/dist/utils/frontmatter.js.map +1 -0
  624. package/dist/utils/git.d.ts +26 -0
  625. package/dist/utils/git.d.ts.map +1 -0
  626. package/dist/utils/git.js +163 -0
  627. package/dist/utils/git.js.map +1 -0
  628. package/dist/utils/image-convert.d.ts +9 -0
  629. package/dist/utils/image-convert.d.ts.map +1 -0
  630. package/dist/utils/image-convert.js +39 -0
  631. package/dist/utils/image-convert.js.map +1 -0
  632. package/dist/utils/image-resize.d.ts +36 -0
  633. package/dist/utils/image-resize.d.ts.map +1 -0
  634. package/dist/utils/image-resize.js +137 -0
  635. package/dist/utils/image-resize.js.map +1 -0
  636. package/dist/utils/mime.d.ts +2 -0
  637. package/dist/utils/mime.d.ts.map +1 -0
  638. package/dist/utils/mime.js +26 -0
  639. package/dist/utils/mime.js.map +1 -0
  640. package/dist/utils/photon.d.ts +21 -0
  641. package/dist/utils/photon.d.ts.map +1 -0
  642. package/dist/utils/photon.js +121 -0
  643. package/dist/utils/photon.js.map +1 -0
  644. package/dist/utils/shell.d.ts +26 -0
  645. package/dist/utils/shell.d.ts.map +1 -0
  646. package/dist/utils/shell.js +186 -0
  647. package/dist/utils/shell.js.map +1 -0
  648. package/dist/utils/sleep.d.ts +5 -0
  649. package/dist/utils/sleep.d.ts.map +1 -0
  650. package/dist/utils/sleep.js +17 -0
  651. package/dist/utils/sleep.js.map +1 -0
  652. package/dist/utils/tools-manager.d.ts +3 -0
  653. package/dist/utils/tools-manager.d.ts.map +1 -0
  654. package/dist/utils/tools-manager.js +252 -0
  655. package/dist/utils/tools-manager.js.map +1 -0
  656. package/dist/utils/xml.d.ts +2 -0
  657. package/dist/utils/xml.d.ts.map +1 -0
  658. package/dist/utils/xml.js +9 -0
  659. package/dist/utils/xml.js.map +1 -0
  660. package/docs/buddy.md +111 -0
  661. package/docs/compaction.md +392 -0
  662. package/docs/custom-provider.md +599 -0
  663. package/docs/development.md +108 -0
  664. package/docs/extensions.md +2130 -0
  665. package/docs/images/doom-extension.png +0 -0
  666. package/docs/images/interactive-mode.png +0 -0
  667. package/docs/images/tree-view.png +0 -0
  668. package/docs/json.md +112 -0
  669. package/docs/keybindings.md +174 -0
  670. package/docs/mach6.md +150 -0
  671. package/docs/models.md +335 -0
  672. package/docs/packages.md +197 -0
  673. package/docs/prompt-templates.md +67 -0
  674. package/docs/providers.md +194 -0
  675. package/docs/rpc.md +1426 -0
  676. package/docs/sdk.md +969 -0
  677. package/docs/session.md +412 -0
  678. package/docs/settings.md +247 -0
  679. package/docs/shell-aliases.md +55 -0
  680. package/docs/skills.md +296 -0
  681. package/docs/terminal-setup.md +104 -0
  682. package/docs/termux.md +127 -0
  683. package/docs/themes.md +295 -0
  684. package/docs/tmux.md +61 -0
  685. package/docs/tree.md +228 -0
  686. package/docs/tui.md +887 -0
  687. package/docs/windows.md +61 -0
  688. package/examples/README.md +25 -0
  689. package/examples/extensions/README.md +205 -0
  690. package/examples/extensions/antigravity-image-gen.ts +418 -0
  691. package/examples/extensions/auto-commit-on-exit.ts +49 -0
  692. package/examples/extensions/bash-spawn-hook.ts +30 -0
  693. package/examples/extensions/bookmark.ts +50 -0
  694. package/examples/extensions/built-in-tool-renderer.ts +246 -0
  695. package/examples/extensions/claude-rules.ts +86 -0
  696. package/examples/extensions/commands.ts +72 -0
  697. package/examples/extensions/confirm-destructive.ts +59 -0
  698. package/examples/extensions/custom-compaction.ts +114 -0
  699. package/examples/extensions/custom-footer.ts +64 -0
  700. package/examples/extensions/custom-header.ts +73 -0
  701. package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
  702. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  703. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  704. package/examples/extensions/custom-provider-gitlab-duo/index.ts +349 -0
  705. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  706. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  707. package/examples/extensions/custom-provider-qwen-cli/index.ts +345 -0
  708. package/examples/extensions/custom-provider-qwen-cli/package.json +16 -0
  709. package/examples/extensions/dirty-repo-guard.ts +56 -0
  710. package/examples/extensions/doom-overlay/README.md +46 -0
  711. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  712. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  713. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  714. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +73 -0
  715. package/examples/extensions/doom-overlay/doom-component.ts +132 -0
  716. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  717. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  718. package/examples/extensions/doom-overlay/index.ts +74 -0
  719. package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  720. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  721. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  722. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  723. package/examples/extensions/dynamic-resources/index.ts +15 -0
  724. package/examples/extensions/dynamic-tools.ts +74 -0
  725. package/examples/extensions/event-bus.ts +43 -0
  726. package/examples/extensions/file-trigger.ts +41 -0
  727. package/examples/extensions/git-checkpoint.ts +53 -0
  728. package/examples/extensions/handoff.ts +150 -0
  729. package/examples/extensions/hello.ts +25 -0
  730. package/examples/extensions/inline-bash.ts +94 -0
  731. package/examples/extensions/input-transform.ts +43 -0
  732. package/examples/extensions/interactive-shell.ts +196 -0
  733. package/examples/extensions/mac-system-theme.ts +47 -0
  734. package/examples/extensions/message-renderer.ts +59 -0
  735. package/examples/extensions/minimal-mode.ts +426 -0
  736. package/examples/extensions/modal-editor.ts +85 -0
  737. package/examples/extensions/model-status.ts +31 -0
  738. package/examples/extensions/notify.ts +55 -0
  739. package/examples/extensions/overlay-qa-tests.ts +1348 -0
  740. package/examples/extensions/overlay-test.ts +150 -0
  741. package/examples/extensions/permission-gate.ts +34 -0
  742. package/examples/extensions/pirate.ts +47 -0
  743. package/examples/extensions/plan-mode/README.md +65 -0
  744. package/examples/extensions/plan-mode/index.ts +340 -0
  745. package/examples/extensions/plan-mode/utils.ts +168 -0
  746. package/examples/extensions/preset.ts +403 -0
  747. package/examples/extensions/protected-paths.ts +30 -0
  748. package/examples/extensions/provider-payload.ts +14 -0
  749. package/examples/extensions/qna.ts +119 -0
  750. package/examples/extensions/question.ts +264 -0
  751. package/examples/extensions/questionnaire.ts +427 -0
  752. package/examples/extensions/rainbow-editor.ts +88 -0
  753. package/examples/extensions/reload-runtime.ts +37 -0
  754. package/examples/extensions/rpc-demo.ts +124 -0
  755. package/examples/extensions/sandbox/index.ts +317 -0
  756. package/examples/extensions/sandbox/package-lock.json +92 -0
  757. package/examples/extensions/sandbox/package.json +19 -0
  758. package/examples/extensions/send-user-message.ts +97 -0
  759. package/examples/extensions/session-name.ts +27 -0
  760. package/examples/extensions/shutdown-command.ts +63 -0
  761. package/examples/extensions/snake.ts +343 -0
  762. package/examples/extensions/space-invaders.ts +560 -0
  763. package/examples/extensions/ssh.ts +220 -0
  764. package/examples/extensions/status-line.ts +40 -0
  765. package/examples/extensions/subagent/README.md +172 -0
  766. package/examples/extensions/subagent/agents/planner.md +37 -0
  767. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  768. package/examples/extensions/subagent/agents/scout.md +50 -0
  769. package/examples/extensions/subagent/agents/worker.md +24 -0
  770. package/examples/extensions/subagent/agents.ts +126 -0
  771. package/examples/extensions/subagent/index.ts +986 -0
  772. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  773. package/examples/extensions/subagent/prompts/implement.md +10 -0
  774. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  775. package/examples/extensions/summarize.ts +195 -0
  776. package/examples/extensions/system-prompt-header.ts +17 -0
  777. package/examples/extensions/timed-confirm.ts +70 -0
  778. package/examples/extensions/titlebar-spinner.ts +58 -0
  779. package/examples/extensions/todo.ts +299 -0
  780. package/examples/extensions/tool-override.ts +144 -0
  781. package/examples/extensions/tools.ts +146 -0
  782. package/examples/extensions/trigger-compact.ts +40 -0
  783. package/examples/extensions/truncated-tool.ts +195 -0
  784. package/examples/extensions/widget-placement.ts +17 -0
  785. package/examples/extensions/with-deps/index.ts +32 -0
  786. package/examples/extensions/with-deps/package-lock.json +31 -0
  787. package/examples/extensions/with-deps/package.json +22 -0
  788. package/examples/rpc-extension-ui.ts +632 -0
  789. package/examples/sdk/01-minimal.ts +22 -0
  790. package/examples/sdk/02-custom-model.ts +49 -0
  791. package/examples/sdk/03-custom-prompt.ts +55 -0
  792. package/examples/sdk/04-skills.ts +53 -0
  793. package/examples/sdk/05-tools.ts +56 -0
  794. package/examples/sdk/06-extensions.ts +88 -0
  795. package/examples/sdk/07-context-files.ts +40 -0
  796. package/examples/sdk/08-prompt-templates.ts +48 -0
  797. package/examples/sdk/09-api-keys-and-oauth.ts +48 -0
  798. package/examples/sdk/10-settings.ts +51 -0
  799. package/examples/sdk/11-sessions.ts +48 -0
  800. package/examples/sdk/12-full-control.ts +87 -0
  801. package/examples/sdk/README.md +144 -0
  802. package/package.json +123 -0
  803. package/skills/mach6-implement/SKILL.md +170 -0
  804. package/skills/mach6-issue/SKILL.md +129 -0
  805. package/skills/mach6-plan/SKILL.md +123 -0
  806. package/skills/mach6-publish/SKILL.md +188 -0
  807. package/skills/mach6-push/SKILL.md +101 -0
  808. package/skills/mach6-review/SKILL.md +192 -0
  809. package/skills/telegram-send/SKILL.md +46 -0
@@ -0,0 +1,580 @@
1
+ /**
2
+ * Text file chunker for the semantic search subsystem.
3
+ *
4
+ * Splits non-code files (markdown, YAML, JSON, TOML, plaintext) into
5
+ * semantically meaningful chunks using format-specific boundary detection.
6
+ */
7
+ // ============================================================================
8
+ // Constants
9
+ // ============================================================================
10
+ /** Files smaller than this are returned as a single chunk. */
11
+ const MIN_SPLIT_SIZE = 500;
12
+ /** Maximum characters per chunk — oversized sections are split at paragraph boundaries. */
13
+ const MAX_CHUNK_SIZE = 8000;
14
+ /** Minimum characters for a plaintext paragraph chunk (small ones get merged). */
15
+ const MIN_PARAGRAPH_SIZE = 200;
16
+ // ============================================================================
17
+ // Public API
18
+ // ============================================================================
19
+ /**
20
+ * Chunk a non-code text file by format-specific boundaries.
21
+ *
22
+ * Returns at least one chunk for any non-empty input. Empty files produce
23
+ * a single chunk of kind 'file'.
24
+ */
25
+ export function chunkTextFile(content, filePath, fileType) {
26
+ // Empty or trivially small files → single chunk
27
+ if (content.length < MIN_SPLIT_SIZE) {
28
+ return [wholeFileChunk(content, filePath, fileType)];
29
+ }
30
+ let chunks;
31
+ switch (fileType) {
32
+ case "markdown":
33
+ chunks = chunkMarkdown(content, filePath);
34
+ break;
35
+ case "yaml":
36
+ chunks = chunkYaml(content, filePath);
37
+ break;
38
+ case "json":
39
+ chunks = chunkJson(content, filePath);
40
+ break;
41
+ case "toml":
42
+ chunks = chunkToml(content, filePath);
43
+ break;
44
+ case "plaintext":
45
+ chunks = chunkPlaintext(content, filePath);
46
+ break;
47
+ default:
48
+ chunks = [];
49
+ }
50
+ // Fallback: if format-specific parsing produced nothing, return whole file
51
+ if (chunks.length === 0) {
52
+ return [wholeFileChunk(content, filePath, fileType)];
53
+ }
54
+ // Enforce max chunk size — split oversized chunks at paragraph boundaries
55
+ return chunks.flatMap((chunk) => enforceMaxSize(chunk));
56
+ }
57
+ // ============================================================================
58
+ // Markdown
59
+ // ============================================================================
60
+ /** Heading regex: lines starting with 1–6 # characters followed by a space. */
61
+ const HEADING_RE = /^(#{1,6})\s+(.+)$/;
62
+ function chunkMarkdown(content, filePath) {
63
+ const lines = content.split("\n");
64
+ // Identify heading positions and levels
65
+ const headings = [];
66
+ for (let i = 0; i < lines.length; i++) {
67
+ const match = HEADING_RE.exec(lines[i]);
68
+ if (match) {
69
+ headings.push({ line: i, level: match[1].length, text: match[2].trim() });
70
+ }
71
+ }
72
+ // No headings → treat as plaintext
73
+ if (headings.length === 0) {
74
+ return chunkPlaintext(content, filePath);
75
+ }
76
+ const chunks = [];
77
+ // Content before the first heading (preamble)
78
+ if (headings[0].line > 0) {
79
+ const preambleLines = lines.slice(0, headings[0].line);
80
+ const preambleContent = preambleLines.join("\n");
81
+ if (preambleContent.trim().length > 0) {
82
+ chunks.push({
83
+ filePath,
84
+ startLine: 1,
85
+ endLine: headings[0].line, // 1-indexed, line before the first heading
86
+ kind: "heading_section",
87
+ name: null,
88
+ content: preambleContent,
89
+ fileType: "markdown",
90
+ });
91
+ }
92
+ }
93
+ // Each heading owns all lines until the next heading of same or higher level
94
+ for (let i = 0; i < headings.length; i++) {
95
+ const start = headings[i].line;
96
+ let end;
97
+ // Find the next heading at the same or higher (lower number) level
98
+ let nextSameOrHigher = -1;
99
+ for (let j = i + 1; j < headings.length; j++) {
100
+ if (headings[j].level <= headings[i].level) {
101
+ nextSameOrHigher = j;
102
+ break;
103
+ }
104
+ }
105
+ if (nextSameOrHigher !== -1) {
106
+ end = headings[nextSameOrHigher].line - 1;
107
+ }
108
+ else {
109
+ end = lines.length - 1;
110
+ }
111
+ const sectionLines = lines.slice(start, end + 1);
112
+ const sectionContent = sectionLines.join("\n");
113
+ chunks.push({
114
+ filePath,
115
+ startLine: start + 1, // 1-indexed
116
+ endLine: end + 1, // 1-indexed, inclusive
117
+ kind: "heading_section",
118
+ name: headings[i].text,
119
+ content: sectionContent,
120
+ fileType: "markdown",
121
+ });
122
+ }
123
+ return chunks;
124
+ }
125
+ // ============================================================================
126
+ // YAML
127
+ // ============================================================================
128
+ /**
129
+ * Top-level YAML key: a line that starts with a non-space, non-comment
130
+ * character and contains a colon. Excludes YAML directives (---/...).
131
+ */
132
+ const YAML_TOP_KEY_RE = /^([a-zA-Z_][a-zA-Z0-9_.-]*)\s*:/;
133
+ function chunkYaml(content, filePath) {
134
+ const lines = content.split("\n");
135
+ // Find top-level key positions
136
+ const keys = [];
137
+ for (let i = 0; i < lines.length; i++) {
138
+ const line = lines[i];
139
+ // Skip comments, blank lines, YAML directives
140
+ if (line.startsWith("#") || line.startsWith("---") || line.startsWith("...") || line.trim() === "") {
141
+ continue;
142
+ }
143
+ const match = YAML_TOP_KEY_RE.exec(line);
144
+ if (match) {
145
+ keys.push({ line: i, name: match[1] });
146
+ }
147
+ }
148
+ if (keys.length === 0) {
149
+ return [];
150
+ }
151
+ const chunks = [];
152
+ // Preamble (comments, directives before first key) is included in the
153
+ // first key's chunk via the `start = 0` logic below for `i === 0`.
154
+ for (let i = 0; i < keys.length; i++) {
155
+ // Include any preceding comments/blank lines that belong to this key
156
+ // by looking backwards from the key to find attached comments
157
+ let start = keys[i].line;
158
+ if (i === 0) {
159
+ // First key includes any preamble (comments, directives)
160
+ start = 0;
161
+ }
162
+ else {
163
+ // Look back for comment lines directly above
164
+ let scan = keys[i].line - 1;
165
+ while (scan > keys[i - 1].line) {
166
+ const trimmed = lines[scan].trim();
167
+ if (trimmed.startsWith("#") || trimmed === "") {
168
+ scan--;
169
+ }
170
+ else {
171
+ break;
172
+ }
173
+ }
174
+ start = scan + 1;
175
+ }
176
+ const end = i < keys.length - 1 ? keys[i + 1].line - 1 : lines.length - 1;
177
+ // Trim trailing blank lines to find the real end
178
+ let realEnd = end;
179
+ while (realEnd > start && lines[realEnd].trim() === "") {
180
+ realEnd--;
181
+ }
182
+ // But keep at least the key line
183
+ if (realEnd < keys[i].line)
184
+ realEnd = keys[i].line;
185
+ // Include trailing blank lines within the range for line counting,
186
+ // but use them as separators
187
+ const sectionLines = lines.slice(start, end + 1);
188
+ const sectionContent = sectionLines.join("\n");
189
+ chunks.push({
190
+ filePath,
191
+ startLine: start + 1,
192
+ endLine: end + 1,
193
+ kind: "top_level_key",
194
+ name: keys[i].name,
195
+ content: sectionContent,
196
+ fileType: "yaml",
197
+ });
198
+ }
199
+ return chunks;
200
+ }
201
+ // ============================================================================
202
+ // JSON
203
+ // ============================================================================
204
+ function chunkJson(content, filePath) {
205
+ let parsed;
206
+ try {
207
+ parsed = JSON.parse(content);
208
+ }
209
+ catch {
210
+ // Invalid JSON → return as whole file
211
+ return [];
212
+ }
213
+ // Only split top-level objects. Arrays and primitives → single chunk.
214
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
215
+ return [];
216
+ }
217
+ const topKeys = Object.keys(parsed);
218
+ if (topKeys.length === 0) {
219
+ return [];
220
+ }
221
+ // For JSON we can't rely on simple line scanning because values can span
222
+ // multiple lines with arbitrary nesting. Instead, re-serialize each
223
+ // top-level key and locate its position in the original content.
224
+ const lines = content.split("\n");
225
+ const chunks = [];
226
+ // Strategy: scan the original text to find each top-level key's line range.
227
+ // A top-level key in formatted JSON appears as ` "key":` at indent level 1.
228
+ // In minified JSON with a single line, we fall back to serialized slicing.
229
+ if (lines.length === 1) {
230
+ // Minified JSON — produce one chunk per top-level key using re-serialized content
231
+ const obj = parsed;
232
+ for (const key of topKeys) {
233
+ const serialized = JSON.stringify({ [key]: obj[key] }, null, 2);
234
+ chunks.push({
235
+ filePath,
236
+ startLine: 1,
237
+ endLine: 1,
238
+ kind: "top_level_key",
239
+ name: key,
240
+ content: serialized,
241
+ fileType: "json",
242
+ });
243
+ }
244
+ return chunks;
245
+ }
246
+ // Multi-line JSON: find each top-level key by scanning for `"key":` at
247
+ // brace depth 1.
248
+ const keyPositions = [];
249
+ let depth = 0;
250
+ for (let i = 0; i < lines.length; i++) {
251
+ const line = lines[i];
252
+ for (let c = 0; c < line.length; c++) {
253
+ const ch = line[c];
254
+ if (ch === '"') {
255
+ // Skip string content
256
+ c++;
257
+ while (c < line.length && line[c] !== '"') {
258
+ if (line[c] === "\\")
259
+ c++; // skip escaped char
260
+ c++;
261
+ }
262
+ // Check if this string at depth 1 is a key (followed by :)
263
+ if (depth === 1) {
264
+ // Extract the key name
265
+ const keyMatch = /^\s*"([^"\\]*(?:\\.[^"\\]*)*)"\s*:/.exec(line);
266
+ if (keyMatch) {
267
+ const foundKey = keyMatch[1].replace(/\\"/g, '"').replace(/\\\\/g, "\\");
268
+ if (topKeys.includes(foundKey) && !keyPositions.some((kp) => kp.key === foundKey)) {
269
+ keyPositions.push({ key: foundKey, startLine: i });
270
+ }
271
+ break; // Move to next line — we found the key on this line
272
+ }
273
+ }
274
+ }
275
+ else if (ch === "{" || ch === "[") {
276
+ depth++;
277
+ }
278
+ else if (ch === "}" || ch === "]") {
279
+ depth--;
280
+ }
281
+ }
282
+ }
283
+ // Build chunks from key positions
284
+ for (let i = 0; i < keyPositions.length; i++) {
285
+ const start = keyPositions[i].startLine;
286
+ const end = i < keyPositions.length - 1 ? keyPositions[i + 1].startLine - 1 : lines.length - 1;
287
+ // Trim the trailing closing brace of the root object from the last chunk
288
+ let realEnd = end;
289
+ if (i === keyPositions.length - 1) {
290
+ // Walk back from end to skip the root closing brace and trailing whitespace
291
+ while (realEnd > start && lines[realEnd].trim() === "")
292
+ realEnd--;
293
+ if (realEnd > start && lines[realEnd].trim() === "}")
294
+ realEnd--;
295
+ }
296
+ // Trim trailing commas and blank lines from non-last chunks too
297
+ while (realEnd > start && lines[realEnd].trim() === "")
298
+ realEnd--;
299
+ const sectionContent = lines.slice(start, realEnd + 1).join("\n");
300
+ chunks.push({
301
+ filePath,
302
+ startLine: start + 1,
303
+ endLine: realEnd + 1,
304
+ kind: "top_level_key",
305
+ name: keyPositions[i].key,
306
+ content: sectionContent,
307
+ fileType: "json",
308
+ });
309
+ }
310
+ return chunks;
311
+ }
312
+ // ============================================================================
313
+ // TOML
314
+ // ============================================================================
315
+ /** TOML section header: [section] or [[array-of-tables]]. */
316
+ const TOML_SECTION_RE = /^\[{1,2}([^\]]+)\]{1,2}\s*$/;
317
+ /** TOML top-level key-value pair (not indented, before any section). */
318
+ const TOML_KV_RE = /^([a-zA-Z_][a-zA-Z0-9_.-]*)\s*=/;
319
+ function chunkToml(content, filePath) {
320
+ const lines = content.split("\n");
321
+ // Phase 1: Identify all top-level boundaries (sections and top-level KV pairs before sections)
322
+ const boundaries = [];
323
+ let firstSectionLine = lines.length;
324
+ // Find section headers first
325
+ for (let i = 0; i < lines.length; i++) {
326
+ const match = TOML_SECTION_RE.exec(lines[i]);
327
+ if (match) {
328
+ if (i < firstSectionLine)
329
+ firstSectionLine = i;
330
+ boundaries.push({ line: i, kind: "section", name: match[1].trim() });
331
+ }
332
+ }
333
+ // Find top-level key-value pairs (lines before the first section)
334
+ const kvGroups = [];
335
+ for (let i = 0; i < firstSectionLine; i++) {
336
+ const line = lines[i];
337
+ if (line.trim() === "" || line.trim().startsWith("#"))
338
+ continue;
339
+ const match = TOML_KV_RE.exec(line);
340
+ if (match) {
341
+ kvGroups.push({ startLine: i, name: match[1] });
342
+ }
343
+ }
344
+ // Merge KV pairs into boundaries
345
+ for (const kv of kvGroups) {
346
+ boundaries.push({ line: kv.startLine, kind: "kv", name: kv.name });
347
+ }
348
+ // Sort boundaries by line number
349
+ boundaries.sort((a, b) => a.line - b.line);
350
+ if (boundaries.length === 0) {
351
+ return [];
352
+ }
353
+ const chunks = [];
354
+ for (let i = 0; i < boundaries.length; i++) {
355
+ const boundary = boundaries[i];
356
+ let start = boundary.line;
357
+ const end = i < boundaries.length - 1 ? boundaries[i + 1].line - 1 : lines.length - 1;
358
+ if (i === 0) {
359
+ // First boundary — include any leading comments/preamble
360
+ start = 0;
361
+ }
362
+ else {
363
+ // Look back for comment/blank lines attached to this boundary
364
+ let scan = boundary.line - 1;
365
+ const prevEnd = boundaries[i - 1].line;
366
+ while (scan > prevEnd) {
367
+ const trimmed = lines[scan].trim();
368
+ if (trimmed.startsWith("#") || trimmed === "") {
369
+ scan--;
370
+ }
371
+ else {
372
+ break;
373
+ }
374
+ }
375
+ start = scan + 1;
376
+ }
377
+ const sectionContent = lines.slice(start, end + 1).join("\n");
378
+ chunks.push({
379
+ filePath,
380
+ startLine: start + 1,
381
+ endLine: end + 1,
382
+ kind: "top_level_key",
383
+ name: boundary.name,
384
+ content: sectionContent,
385
+ fileType: "toml",
386
+ });
387
+ }
388
+ return chunks;
389
+ }
390
+ // ============================================================================
391
+ // Plaintext
392
+ // ============================================================================
393
+ function chunkPlaintext(content, filePath) {
394
+ const lines = content.split("\n");
395
+ // Split into paragraphs at double-newline boundaries
396
+ const paragraphs = [];
397
+ let paraStart = -1;
398
+ let consecutiveBlanks = 0;
399
+ for (let i = 0; i < lines.length; i++) {
400
+ const isBlank = lines[i].trim() === "";
401
+ if (isBlank) {
402
+ consecutiveBlanks++;
403
+ if (consecutiveBlanks >= 2 && paraStart !== -1) {
404
+ // End current paragraph at the last non-blank line
405
+ let paraEnd = i - consecutiveBlanks;
406
+ if (paraEnd < paraStart)
407
+ paraEnd = paraStart;
408
+ paragraphs.push({
409
+ startLine: paraStart,
410
+ endLine: paraEnd,
411
+ content: lines.slice(paraStart, paraEnd + 1).join("\n"),
412
+ });
413
+ paraStart = -1;
414
+ }
415
+ }
416
+ else {
417
+ if (paraStart === -1) {
418
+ paraStart = i;
419
+ }
420
+ consecutiveBlanks = 0;
421
+ }
422
+ }
423
+ // Don't forget the last paragraph
424
+ if (paraStart !== -1) {
425
+ let paraEnd = lines.length - 1;
426
+ while (paraEnd > paraStart && lines[paraEnd].trim() === "")
427
+ paraEnd--;
428
+ paragraphs.push({
429
+ startLine: paraStart,
430
+ endLine: paraEnd,
431
+ content: lines.slice(paraStart, paraEnd + 1).join("\n"),
432
+ });
433
+ }
434
+ if (paragraphs.length === 0) {
435
+ return [];
436
+ }
437
+ // Group small paragraphs together to meet the minimum size
438
+ const chunks = [];
439
+ let groupStart = paragraphs[0].startLine;
440
+ let groupEnd = paragraphs[0].endLine;
441
+ let groupContent = paragraphs[0].content;
442
+ for (let i = 1; i < paragraphs.length; i++) {
443
+ const para = paragraphs[i];
444
+ if (groupContent.length < MIN_PARAGRAPH_SIZE) {
445
+ // Merge with current group
446
+ groupEnd = para.endLine;
447
+ groupContent += `\n\n${para.content}`;
448
+ }
449
+ else {
450
+ // Emit current group, start new one
451
+ chunks.push({
452
+ filePath,
453
+ startLine: groupStart + 1,
454
+ endLine: groupEnd + 1,
455
+ kind: "paragraph",
456
+ name: extractParagraphName(groupContent),
457
+ content: groupContent,
458
+ fileType: "plaintext",
459
+ });
460
+ groupStart = para.startLine;
461
+ groupEnd = para.endLine;
462
+ groupContent = para.content;
463
+ }
464
+ }
465
+ // Emit final group
466
+ // If the final group is too small and there are existing chunks, merge with the last one
467
+ if (groupContent.length < MIN_PARAGRAPH_SIZE && chunks.length > 0) {
468
+ const last = chunks[chunks.length - 1];
469
+ last.endLine = groupEnd + 1;
470
+ last.content += `\n\n${groupContent}`;
471
+ }
472
+ else {
473
+ chunks.push({
474
+ filePath,
475
+ startLine: groupStart + 1,
476
+ endLine: groupEnd + 1,
477
+ kind: "paragraph",
478
+ name: extractParagraphName(groupContent),
479
+ content: groupContent,
480
+ fileType: "plaintext",
481
+ });
482
+ }
483
+ return chunks;
484
+ }
485
+ /** Extract a short name from the first line of a paragraph, truncated. */
486
+ function extractParagraphName(content) {
487
+ const firstLine = content.split("\n")[0].trim();
488
+ if (firstLine.length === 0)
489
+ return null;
490
+ if (firstLine.length <= 60)
491
+ return firstLine;
492
+ return `${firstLine.slice(0, 57)}...`;
493
+ }
494
+ // ============================================================================
495
+ // Chunk Size Enforcement
496
+ // ============================================================================
497
+ /**
498
+ * If a chunk exceeds MAX_CHUNK_SIZE, split it at paragraph boundaries
499
+ * (double newlines). If no paragraph boundaries exist, split at line
500
+ * boundaries near the limit.
501
+ */
502
+ function enforceMaxSize(chunk) {
503
+ if (chunk.content.length <= MAX_CHUNK_SIZE) {
504
+ return [chunk];
505
+ }
506
+ const lines = chunk.content.split("\n");
507
+ const subChunks = [];
508
+ let currentLines = [];
509
+ let currentSize = 0;
510
+ let chunkStartLine = chunk.startLine;
511
+ let partIndex = 0;
512
+ for (let i = 0; i < lines.length; i++) {
513
+ const line = lines[i];
514
+ const lineSize = line.length + 1; // +1 for newline
515
+ // Check if adding this line would exceed the limit
516
+ if (currentSize + lineSize > MAX_CHUNK_SIZE && currentLines.length > 0) {
517
+ // Try to find a paragraph boundary (blank line) to split at
518
+ let splitAt = currentLines.length;
519
+ for (let j = currentLines.length - 1; j > 0; j--) {
520
+ if (currentLines[j].trim() === "") {
521
+ splitAt = j;
522
+ break;
523
+ }
524
+ }
525
+ // Emit the sub-chunk up to the split point
526
+ const emitLines = currentLines.slice(0, splitAt);
527
+ const emitContent = emitLines.join("\n");
528
+ const emitEndLine = chunkStartLine + splitAt - 1;
529
+ subChunks.push({
530
+ filePath: chunk.filePath,
531
+ startLine: chunkStartLine,
532
+ endLine: emitEndLine,
533
+ kind: chunk.kind,
534
+ name: partIndex === 0 ? chunk.name : chunk.name ? `${chunk.name} (cont.)` : null,
535
+ content: emitContent,
536
+ fileType: chunk.fileType,
537
+ });
538
+ partIndex++;
539
+ // Keep remaining lines from the split
540
+ const remaining = currentLines.slice(splitAt);
541
+ currentLines = [...remaining, line];
542
+ chunkStartLine = emitEndLine + 1;
543
+ currentSize = currentLines.join("\n").length;
544
+ }
545
+ else {
546
+ currentLines.push(line);
547
+ currentSize += lineSize;
548
+ }
549
+ }
550
+ // Emit remaining lines
551
+ if (currentLines.length > 0) {
552
+ const emitContent = currentLines.join("\n");
553
+ subChunks.push({
554
+ filePath: chunk.filePath,
555
+ startLine: chunkStartLine,
556
+ endLine: chunk.endLine,
557
+ kind: chunk.kind,
558
+ name: partIndex === 0 ? chunk.name : chunk.name ? `${chunk.name} (cont.)` : null,
559
+ content: emitContent,
560
+ fileType: chunk.fileType,
561
+ });
562
+ }
563
+ return subChunks.length > 0 ? subChunks : [chunk];
564
+ }
565
+ // ============================================================================
566
+ // Helpers
567
+ // ============================================================================
568
+ function wholeFileChunk(content, filePath, fileType) {
569
+ const lineCount = content.split("\n").length;
570
+ return {
571
+ filePath,
572
+ startLine: 1,
573
+ endLine: lineCount,
574
+ kind: "file",
575
+ name: null,
576
+ content,
577
+ fileType,
578
+ };
579
+ }
580
+ //# sourceMappingURL=text-chunker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-chunker.js","sourceRoot":"","sources":["../../../src/core/search/text-chunker.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Text file chunker for the semantic search subsystem.\n *\n * Splits non-code files (markdown, YAML, JSON, TOML, plaintext) into\n * semantically meaningful chunks using format-specific boundary detection.\n */\n\nimport type { Chunk, TextFileType } from \"./types.js\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Files smaller than this are returned as a single chunk. */\nconst MIN_SPLIT_SIZE = 500;\n\n/** Maximum characters per chunk — oversized sections are split at paragraph boundaries. */\nconst MAX_CHUNK_SIZE = 8000;\n\n/** Minimum characters for a plaintext paragraph chunk (small ones get merged). */\nconst MIN_PARAGRAPH_SIZE = 200;\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Chunk a non-code text file by format-specific boundaries.\n *\n * Returns at least one chunk for any non-empty input. Empty files produce\n * a single chunk of kind 'file'.\n */\nexport function chunkTextFile(content: string, filePath: string, fileType: TextFileType): Chunk[] {\n\t// Empty or trivially small files → single chunk\n\tif (content.length < MIN_SPLIT_SIZE) {\n\t\treturn [wholeFileChunk(content, filePath, fileType)];\n\t}\n\n\tlet chunks: Chunk[];\n\tswitch (fileType) {\n\t\tcase \"markdown\":\n\t\t\tchunks = chunkMarkdown(content, filePath);\n\t\t\tbreak;\n\t\tcase \"yaml\":\n\t\t\tchunks = chunkYaml(content, filePath);\n\t\t\tbreak;\n\t\tcase \"json\":\n\t\t\tchunks = chunkJson(content, filePath);\n\t\t\tbreak;\n\t\tcase \"toml\":\n\t\t\tchunks = chunkToml(content, filePath);\n\t\t\tbreak;\n\t\tcase \"plaintext\":\n\t\t\tchunks = chunkPlaintext(content, filePath);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tchunks = [];\n\t}\n\n\t// Fallback: if format-specific parsing produced nothing, return whole file\n\tif (chunks.length === 0) {\n\t\treturn [wholeFileChunk(content, filePath, fileType)];\n\t}\n\n\t// Enforce max chunk size — split oversized chunks at paragraph boundaries\n\treturn chunks.flatMap((chunk) => enforceMaxSize(chunk));\n}\n\n// ============================================================================\n// Markdown\n// ============================================================================\n\n/** Heading regex: lines starting with 1–6 # characters followed by a space. */\nconst HEADING_RE = /^(#{1,6})\\s+(.+)$/;\n\nfunction chunkMarkdown(content: string, filePath: string): Chunk[] {\n\tconst lines = content.split(\"\\n\");\n\n\t// Identify heading positions and levels\n\tconst headings: Array<{ line: number; level: number; text: string }> = [];\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst match = HEADING_RE.exec(lines[i]);\n\t\tif (match) {\n\t\t\theadings.push({ line: i, level: match[1].length, text: match[2].trim() });\n\t\t}\n\t}\n\n\t// No headings → treat as plaintext\n\tif (headings.length === 0) {\n\t\treturn chunkPlaintext(content, filePath);\n\t}\n\n\tconst chunks: Chunk[] = [];\n\n\t// Content before the first heading (preamble)\n\tif (headings[0].line > 0) {\n\t\tconst preambleLines = lines.slice(0, headings[0].line);\n\t\tconst preambleContent = preambleLines.join(\"\\n\");\n\t\tif (preambleContent.trim().length > 0) {\n\t\t\tchunks.push({\n\t\t\t\tfilePath,\n\t\t\t\tstartLine: 1,\n\t\t\t\tendLine: headings[0].line, // 1-indexed, line before the first heading\n\t\t\t\tkind: \"heading_section\",\n\t\t\t\tname: null,\n\t\t\t\tcontent: preambleContent,\n\t\t\t\tfileType: \"markdown\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// Each heading owns all lines until the next heading of same or higher level\n\tfor (let i = 0; i < headings.length; i++) {\n\t\tconst start = headings[i].line;\n\t\tlet end: number;\n\n\t\t// Find the next heading at the same or higher (lower number) level\n\t\tlet nextSameOrHigher = -1;\n\t\tfor (let j = i + 1; j < headings.length; j++) {\n\t\t\tif (headings[j].level <= headings[i].level) {\n\t\t\t\tnextSameOrHigher = j;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (nextSameOrHigher !== -1) {\n\t\t\tend = headings[nextSameOrHigher].line - 1;\n\t\t} else {\n\t\t\tend = lines.length - 1;\n\t\t}\n\n\t\tconst sectionLines = lines.slice(start, end + 1);\n\t\tconst sectionContent = sectionLines.join(\"\\n\");\n\n\t\tchunks.push({\n\t\t\tfilePath,\n\t\t\tstartLine: start + 1, // 1-indexed\n\t\t\tendLine: end + 1, // 1-indexed, inclusive\n\t\t\tkind: \"heading_section\",\n\t\t\tname: headings[i].text,\n\t\t\tcontent: sectionContent,\n\t\t\tfileType: \"markdown\",\n\t\t});\n\t}\n\n\treturn chunks;\n}\n\n// ============================================================================\n// YAML\n// ============================================================================\n\n/**\n * Top-level YAML key: a line that starts with a non-space, non-comment\n * character and contains a colon. Excludes YAML directives (---/...).\n */\nconst YAML_TOP_KEY_RE = /^([a-zA-Z_][a-zA-Z0-9_.-]*)\\s*:/;\n\nfunction chunkYaml(content: string, filePath: string): Chunk[] {\n\tconst lines = content.split(\"\\n\");\n\n\t// Find top-level key positions\n\tconst keys: Array<{ line: number; name: string }> = [];\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst line = lines[i];\n\t\t// Skip comments, blank lines, YAML directives\n\t\tif (line.startsWith(\"#\") || line.startsWith(\"---\") || line.startsWith(\"...\") || line.trim() === \"\") {\n\t\t\tcontinue;\n\t\t}\n\t\tconst match = YAML_TOP_KEY_RE.exec(line);\n\t\tif (match) {\n\t\t\tkeys.push({ line: i, name: match[1] });\n\t\t}\n\t}\n\n\tif (keys.length === 0) {\n\t\treturn [];\n\t}\n\n\tconst chunks: Chunk[] = [];\n\n\t// Preamble (comments, directives before first key) is included in the\n\t// first key's chunk via the `start = 0` logic below for `i === 0`.\n\n\tfor (let i = 0; i < keys.length; i++) {\n\t\t// Include any preceding comments/blank lines that belong to this key\n\t\t// by looking backwards from the key to find attached comments\n\t\tlet start = keys[i].line;\n\t\tif (i === 0) {\n\t\t\t// First key includes any preamble (comments, directives)\n\t\t\tstart = 0;\n\t\t} else {\n\t\t\t// Look back for comment lines directly above\n\t\t\tlet scan = keys[i].line - 1;\n\t\t\twhile (scan > keys[i - 1].line) {\n\t\t\t\tconst trimmed = lines[scan].trim();\n\t\t\t\tif (trimmed.startsWith(\"#\") || trimmed === \"\") {\n\t\t\t\t\tscan--;\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tstart = scan + 1;\n\t\t}\n\n\t\tconst end = i < keys.length - 1 ? keys[i + 1].line - 1 : lines.length - 1;\n\n\t\t// Trim trailing blank lines to find the real end\n\t\tlet realEnd = end;\n\t\twhile (realEnd > start && lines[realEnd].trim() === \"\") {\n\t\t\trealEnd--;\n\t\t}\n\t\t// But keep at least the key line\n\t\tif (realEnd < keys[i].line) realEnd = keys[i].line;\n\n\t\t// Include trailing blank lines within the range for line counting,\n\t\t// but use them as separators\n\t\tconst sectionLines = lines.slice(start, end + 1);\n\t\tconst sectionContent = sectionLines.join(\"\\n\");\n\n\t\tchunks.push({\n\t\t\tfilePath,\n\t\t\tstartLine: start + 1,\n\t\t\tendLine: end + 1,\n\t\t\tkind: \"top_level_key\",\n\t\t\tname: keys[i].name,\n\t\t\tcontent: sectionContent,\n\t\t\tfileType: \"yaml\",\n\t\t});\n\t}\n\n\treturn chunks;\n}\n\n// ============================================================================\n// JSON\n// ============================================================================\n\nfunction chunkJson(content: string, filePath: string): Chunk[] {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(content);\n\t} catch {\n\t\t// Invalid JSON → return as whole file\n\t\treturn [];\n\t}\n\n\t// Only split top-level objects. Arrays and primitives → single chunk.\n\tif (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n\t\treturn [];\n\t}\n\n\tconst topKeys = Object.keys(parsed);\n\tif (topKeys.length === 0) {\n\t\treturn [];\n\t}\n\n\t// For JSON we can't rely on simple line scanning because values can span\n\t// multiple lines with arbitrary nesting. Instead, re-serialize each\n\t// top-level key and locate its position in the original content.\n\tconst lines = content.split(\"\\n\");\n\tconst chunks: Chunk[] = [];\n\n\t// Strategy: scan the original text to find each top-level key's line range.\n\t// A top-level key in formatted JSON appears as ` \"key\":` at indent level 1.\n\t// In minified JSON with a single line, we fall back to serialized slicing.\n\tif (lines.length === 1) {\n\t\t// Minified JSON — produce one chunk per top-level key using re-serialized content\n\t\tconst obj = parsed as Record<string, unknown>;\n\t\tfor (const key of topKeys) {\n\t\t\tconst serialized = JSON.stringify({ [key]: obj[key] }, null, 2);\n\t\t\tchunks.push({\n\t\t\t\tfilePath,\n\t\t\t\tstartLine: 1,\n\t\t\t\tendLine: 1,\n\t\t\t\tkind: \"top_level_key\",\n\t\t\t\tname: key,\n\t\t\t\tcontent: serialized,\n\t\t\t\tfileType: \"json\",\n\t\t\t});\n\t\t}\n\t\treturn chunks;\n\t}\n\n\t// Multi-line JSON: find each top-level key by scanning for `\"key\":` at\n\t// brace depth 1.\n\tconst keyPositions: Array<{ key: string; startLine: number }> = [];\n\tlet depth = 0;\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst line = lines[i];\n\t\tfor (let c = 0; c < line.length; c++) {\n\t\t\tconst ch = line[c];\n\t\t\tif (ch === '\"') {\n\t\t\t\t// Skip string content\n\t\t\t\tc++;\n\t\t\t\twhile (c < line.length && line[c] !== '\"') {\n\t\t\t\t\tif (line[c] === \"\\\\\") c++; // skip escaped char\n\t\t\t\t\tc++;\n\t\t\t\t}\n\t\t\t\t// Check if this string at depth 1 is a key (followed by :)\n\t\t\t\tif (depth === 1) {\n\t\t\t\t\t// Extract the key name\n\t\t\t\t\tconst keyMatch = /^\\s*\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"\\s*:/.exec(line);\n\t\t\t\t\tif (keyMatch) {\n\t\t\t\t\t\tconst foundKey = keyMatch[1].replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, \"\\\\\");\n\t\t\t\t\t\tif (topKeys.includes(foundKey) && !keyPositions.some((kp) => kp.key === foundKey)) {\n\t\t\t\t\t\t\tkeyPositions.push({ key: foundKey, startLine: i });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak; // Move to next line — we found the key on this line\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (ch === \"{\" || ch === \"[\") {\n\t\t\t\tdepth++;\n\t\t\t} else if (ch === \"}\" || ch === \"]\") {\n\t\t\t\tdepth--;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Build chunks from key positions\n\tfor (let i = 0; i < keyPositions.length; i++) {\n\t\tconst start = keyPositions[i].startLine;\n\t\tconst end = i < keyPositions.length - 1 ? keyPositions[i + 1].startLine - 1 : lines.length - 1;\n\n\t\t// Trim the trailing closing brace of the root object from the last chunk\n\t\tlet realEnd = end;\n\t\tif (i === keyPositions.length - 1) {\n\t\t\t// Walk back from end to skip the root closing brace and trailing whitespace\n\t\t\twhile (realEnd > start && lines[realEnd].trim() === \"\") realEnd--;\n\t\t\tif (realEnd > start && lines[realEnd].trim() === \"}\") realEnd--;\n\t\t}\n\n\t\t// Trim trailing commas and blank lines from non-last chunks too\n\t\twhile (realEnd > start && lines[realEnd].trim() === \"\") realEnd--;\n\n\t\tconst sectionContent = lines.slice(start, realEnd + 1).join(\"\\n\");\n\n\t\tchunks.push({\n\t\t\tfilePath,\n\t\t\tstartLine: start + 1,\n\t\t\tendLine: realEnd + 1,\n\t\t\tkind: \"top_level_key\",\n\t\t\tname: keyPositions[i].key,\n\t\t\tcontent: sectionContent,\n\t\t\tfileType: \"json\",\n\t\t});\n\t}\n\n\treturn chunks;\n}\n\n// ============================================================================\n// TOML\n// ============================================================================\n\n/** TOML section header: [section] or [[array-of-tables]]. */\nconst TOML_SECTION_RE = /^\\[{1,2}([^\\]]+)\\]{1,2}\\s*$/;\n\n/** TOML top-level key-value pair (not indented, before any section). */\nconst TOML_KV_RE = /^([a-zA-Z_][a-zA-Z0-9_.-]*)\\s*=/;\n\nfunction chunkToml(content: string, filePath: string): Chunk[] {\n\tconst lines = content.split(\"\\n\");\n\n\t// Phase 1: Identify all top-level boundaries (sections and top-level KV pairs before sections)\n\tconst boundaries: Array<{\n\t\tline: number;\n\t\tkind: \"section\" | \"kv\";\n\t\tname: string;\n\t}> = [];\n\n\tlet firstSectionLine = lines.length;\n\n\t// Find section headers first\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst match = TOML_SECTION_RE.exec(lines[i]);\n\t\tif (match) {\n\t\t\tif (i < firstSectionLine) firstSectionLine = i;\n\t\t\tboundaries.push({ line: i, kind: \"section\", name: match[1].trim() });\n\t\t}\n\t}\n\n\t// Find top-level key-value pairs (lines before the first section)\n\tconst kvGroups: Array<{ startLine: number; name: string }> = [];\n\tfor (let i = 0; i < firstSectionLine; i++) {\n\t\tconst line = lines[i];\n\t\tif (line.trim() === \"\" || line.trim().startsWith(\"#\")) continue;\n\t\tconst match = TOML_KV_RE.exec(line);\n\t\tif (match) {\n\t\t\tkvGroups.push({ startLine: i, name: match[1] });\n\t\t}\n\t}\n\n\t// Merge KV pairs into boundaries\n\tfor (const kv of kvGroups) {\n\t\tboundaries.push({ line: kv.startLine, kind: \"kv\", name: kv.name });\n\t}\n\n\t// Sort boundaries by line number\n\tboundaries.sort((a, b) => a.line - b.line);\n\n\tif (boundaries.length === 0) {\n\t\treturn [];\n\t}\n\n\tconst chunks: Chunk[] = [];\n\n\tfor (let i = 0; i < boundaries.length; i++) {\n\t\tconst boundary = boundaries[i];\n\t\tlet start = boundary.line;\n\t\tconst end = i < boundaries.length - 1 ? boundaries[i + 1].line - 1 : lines.length - 1;\n\n\t\tif (i === 0) {\n\t\t\t// First boundary — include any leading comments/preamble\n\t\t\tstart = 0;\n\t\t} else {\n\t\t\t// Look back for comment/blank lines attached to this boundary\n\t\t\tlet scan = boundary.line - 1;\n\t\t\tconst prevEnd = boundaries[i - 1].line;\n\t\t\twhile (scan > prevEnd) {\n\t\t\t\tconst trimmed = lines[scan].trim();\n\t\t\t\tif (trimmed.startsWith(\"#\") || trimmed === \"\") {\n\t\t\t\t\tscan--;\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tstart = scan + 1;\n\t\t}\n\n\t\tconst sectionContent = lines.slice(start, end + 1).join(\"\\n\");\n\n\t\tchunks.push({\n\t\t\tfilePath,\n\t\t\tstartLine: start + 1,\n\t\t\tendLine: end + 1,\n\t\t\tkind: \"top_level_key\",\n\t\t\tname: boundary.name,\n\t\t\tcontent: sectionContent,\n\t\t\tfileType: \"toml\",\n\t\t});\n\t}\n\n\treturn chunks;\n}\n\n// ============================================================================\n// Plaintext\n// ============================================================================\n\nfunction chunkPlaintext(content: string, filePath: string): Chunk[] {\n\tconst lines = content.split(\"\\n\");\n\n\t// Split into paragraphs at double-newline boundaries\n\tconst paragraphs: Array<{ startLine: number; endLine: number; content: string }> = [];\n\tlet paraStart = -1;\n\tlet consecutiveBlanks = 0;\n\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst isBlank = lines[i].trim() === \"\";\n\n\t\tif (isBlank) {\n\t\t\tconsecutiveBlanks++;\n\t\t\tif (consecutiveBlanks >= 2 && paraStart !== -1) {\n\t\t\t\t// End current paragraph at the last non-blank line\n\t\t\t\tlet paraEnd = i - consecutiveBlanks;\n\t\t\t\tif (paraEnd < paraStart) paraEnd = paraStart;\n\t\t\t\tparagraphs.push({\n\t\t\t\t\tstartLine: paraStart,\n\t\t\t\t\tendLine: paraEnd,\n\t\t\t\t\tcontent: lines.slice(paraStart, paraEnd + 1).join(\"\\n\"),\n\t\t\t\t});\n\t\t\t\tparaStart = -1;\n\t\t\t}\n\t\t} else {\n\t\t\tif (paraStart === -1) {\n\t\t\t\tparaStart = i;\n\t\t\t}\n\t\t\tconsecutiveBlanks = 0;\n\t\t}\n\t}\n\n\t// Don't forget the last paragraph\n\tif (paraStart !== -1) {\n\t\tlet paraEnd = lines.length - 1;\n\t\twhile (paraEnd > paraStart && lines[paraEnd].trim() === \"\") paraEnd--;\n\t\tparagraphs.push({\n\t\t\tstartLine: paraStart,\n\t\t\tendLine: paraEnd,\n\t\t\tcontent: lines.slice(paraStart, paraEnd + 1).join(\"\\n\"),\n\t\t});\n\t}\n\n\tif (paragraphs.length === 0) {\n\t\treturn [];\n\t}\n\n\t// Group small paragraphs together to meet the minimum size\n\tconst chunks: Chunk[] = [];\n\tlet groupStart = paragraphs[0].startLine;\n\tlet groupEnd = paragraphs[0].endLine;\n\tlet groupContent = paragraphs[0].content;\n\n\tfor (let i = 1; i < paragraphs.length; i++) {\n\t\tconst para = paragraphs[i];\n\n\t\tif (groupContent.length < MIN_PARAGRAPH_SIZE) {\n\t\t\t// Merge with current group\n\t\t\tgroupEnd = para.endLine;\n\t\t\tgroupContent += `\\n\\n${para.content}`;\n\t\t} else {\n\t\t\t// Emit current group, start new one\n\t\t\tchunks.push({\n\t\t\t\tfilePath,\n\t\t\t\tstartLine: groupStart + 1,\n\t\t\t\tendLine: groupEnd + 1,\n\t\t\t\tkind: \"paragraph\",\n\t\t\t\tname: extractParagraphName(groupContent),\n\t\t\t\tcontent: groupContent,\n\t\t\t\tfileType: \"plaintext\",\n\t\t\t});\n\t\t\tgroupStart = para.startLine;\n\t\t\tgroupEnd = para.endLine;\n\t\t\tgroupContent = para.content;\n\t\t}\n\t}\n\n\t// Emit final group\n\t// If the final group is too small and there are existing chunks, merge with the last one\n\tif (groupContent.length < MIN_PARAGRAPH_SIZE && chunks.length > 0) {\n\t\tconst last = chunks[chunks.length - 1];\n\t\tlast.endLine = groupEnd + 1;\n\t\tlast.content += `\\n\\n${groupContent}`;\n\t} else {\n\t\tchunks.push({\n\t\t\tfilePath,\n\t\t\tstartLine: groupStart + 1,\n\t\t\tendLine: groupEnd + 1,\n\t\t\tkind: \"paragraph\",\n\t\t\tname: extractParagraphName(groupContent),\n\t\t\tcontent: groupContent,\n\t\t\tfileType: \"plaintext\",\n\t\t});\n\t}\n\n\treturn chunks;\n}\n\n/** Extract a short name from the first line of a paragraph, truncated. */\nfunction extractParagraphName(content: string): string | null {\n\tconst firstLine = content.split(\"\\n\")[0].trim();\n\tif (firstLine.length === 0) return null;\n\tif (firstLine.length <= 60) return firstLine;\n\treturn `${firstLine.slice(0, 57)}...`;\n}\n\n// ============================================================================\n// Chunk Size Enforcement\n// ============================================================================\n\n/**\n * If a chunk exceeds MAX_CHUNK_SIZE, split it at paragraph boundaries\n * (double newlines). If no paragraph boundaries exist, split at line\n * boundaries near the limit.\n */\nfunction enforceMaxSize(chunk: Chunk): Chunk[] {\n\tif (chunk.content.length <= MAX_CHUNK_SIZE) {\n\t\treturn [chunk];\n\t}\n\n\tconst lines = chunk.content.split(\"\\n\");\n\tconst subChunks: Chunk[] = [];\n\tlet currentLines: string[] = [];\n\tlet currentSize = 0;\n\tlet chunkStartLine = chunk.startLine;\n\tlet partIndex = 0;\n\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst line = lines[i];\n\t\tconst lineSize = line.length + 1; // +1 for newline\n\n\t\t// Check if adding this line would exceed the limit\n\t\tif (currentSize + lineSize > MAX_CHUNK_SIZE && currentLines.length > 0) {\n\t\t\t// Try to find a paragraph boundary (blank line) to split at\n\t\t\tlet splitAt = currentLines.length;\n\t\t\tfor (let j = currentLines.length - 1; j > 0; j--) {\n\t\t\t\tif (currentLines[j].trim() === \"\") {\n\t\t\t\t\tsplitAt = j;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Emit the sub-chunk up to the split point\n\t\t\tconst emitLines = currentLines.slice(0, splitAt);\n\t\t\tconst emitContent = emitLines.join(\"\\n\");\n\t\t\tconst emitEndLine = chunkStartLine + splitAt - 1;\n\n\t\t\tsubChunks.push({\n\t\t\t\tfilePath: chunk.filePath,\n\t\t\t\tstartLine: chunkStartLine,\n\t\t\t\tendLine: emitEndLine,\n\t\t\t\tkind: chunk.kind,\n\t\t\t\tname: partIndex === 0 ? chunk.name : chunk.name ? `${chunk.name} (cont.)` : null,\n\t\t\t\tcontent: emitContent,\n\t\t\t\tfileType: chunk.fileType,\n\t\t\t});\n\t\t\tpartIndex++;\n\n\t\t\t// Keep remaining lines from the split\n\t\t\tconst remaining = currentLines.slice(splitAt);\n\t\t\tcurrentLines = [...remaining, line];\n\t\t\tchunkStartLine = emitEndLine + 1;\n\t\t\tcurrentSize = currentLines.join(\"\\n\").length;\n\t\t} else {\n\t\t\tcurrentLines.push(line);\n\t\t\tcurrentSize += lineSize;\n\t\t}\n\t}\n\n\t// Emit remaining lines\n\tif (currentLines.length > 0) {\n\t\tconst emitContent = currentLines.join(\"\\n\");\n\t\tsubChunks.push({\n\t\t\tfilePath: chunk.filePath,\n\t\t\tstartLine: chunkStartLine,\n\t\t\tendLine: chunk.endLine,\n\t\t\tkind: chunk.kind,\n\t\t\tname: partIndex === 0 ? chunk.name : chunk.name ? `${chunk.name} (cont.)` : null,\n\t\t\tcontent: emitContent,\n\t\t\tfileType: chunk.fileType,\n\t\t});\n\t}\n\n\treturn subChunks.length > 0 ? subChunks : [chunk];\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction wholeFileChunk(content: string, filePath: string, fileType: TextFileType): Chunk {\n\tconst lineCount = content.split(\"\\n\").length;\n\treturn {\n\t\tfilePath,\n\t\tstartLine: 1,\n\t\tendLine: lineCount,\n\t\tkind: \"file\",\n\t\tname: null,\n\t\tcontent,\n\t\tfileType,\n\t};\n}\n"]}