@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 @@
1
+ {"version":3,"file":"buddy-species.d.ts","sourceRoot":"","sources":["../../../src/core/buddy/buddy-species.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAoC,MAAM,EAAE,KAAK,WAAW,EAAc,KAAK,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAMrH,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACpB;AA2KD,eAAO,MAAM,WAAW,eAA6C,CAAC;AAYtE;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,MAAM,GAAG;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAsBvF;AAMD,wBAAwB;AACxB,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,GAAG,MAAM,CAGlD;AAED,iBAAiB;AACjB,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,MAAM,GAAG,MAAM,CAGjD;AAsBD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAyBjF;AAMD,+CAA+C;AAC/C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,EAAE,EAAE,CAEjE;AAED,wDAAwD;AACxD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEjE;AAED,iDAAiD;AACjD,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAS5D","sourcesContent":["/**\n * Species pool, eye styles, hats, and ASCII art frames for the buddy companion.\n *\n * Each species has 3 animation frames using {E} as eye placeholder.\n * Frames cycle at 500ms for idle animation.\n */\n\nimport { rollWeighted } from \"./buddy-prng.js\";\nimport { EYE_STYLES, HATS, RARITY_WEIGHTS, Rarity, type SpeciesName, STAT_NAMES, type Stat } from \"./buddy-types.js\";\n\n// =============================================================================\n// Species Definitions — 18 species with ASCII art\n// =============================================================================\n\nexport interface SpeciesDef {\n\tname: SpeciesName;\n\tframes: string[][]; // 3 frames, each is string[] (lines)\n\trarityFloor: Rarity; // minimum rarity this species can appear at\n}\n\n/**\n * All 18 species with 3 animation frames each.\n * {E} is replaced at render time with the buddy's eye style.\n */\nconst SPECIES_DEFS: Record<SpeciesName, SpeciesDef> = {\n\tDuck: {\n\t\tname: \"Duck\",\n\t\trarityFloor: Rarity.COMMON,\n\t\tframes: [\n\t\t\t[\" __ \", \" {E}{E} \", \" < \\\\ \", \" \\\\__\\\\ \", ' \"\"\"\" '],\n\t\t\t[\" __ \", \" {E}{E} \", \" < \\\\ \", \" \\\\__\\\\ \", ' \"\"\"\" '],\n\t\t\t[\" __ \", \" {E}{E} \", \" < \\\\ \", \" \\\\__\\\\ \", \" ~~ \"],\n\t\t],\n\t},\n\tGoose: {\n\t\tname: \"Goose\",\n\t\trarityFloor: Rarity.COMMON,\n\t\tframes: [\n\t\t\t[\" __ \", \" {E}{E} \", \" < \\\\ \", \" \\\\__\\\\ \", ' \"\"\"\" '],\n\t\t\t[\" __ \", \" {E}{E} \", \" < \\\\ \", \" \\\\__\\\\ \", ' \"\"\"\" '],\n\t\t\t[\" __ \", \" {E}{E} \", \"< \\\\ \", \" \\\\__\\\\ \", ' \"\"\"\" '],\n\t\t],\n\t},\n\tBlob: {\n\t\tname: \"Blob\",\n\t\trarityFloor: Rarity.COMMON,\n\t\tframes: [\n\t\t\t[\" .---. \", \" / {E}{E}\\\\ \", \"| > | \", \" \\\\ --- / \", \" '---' \"],\n\t\t\t[\" .---. \", \" / {E}{E}\\\\ \", \"| < | \", \" \\\\ --- / \", \" '---' \"],\n\t\t\t[\" .---. \", \" / o o\\\\ \", \"| ~ | \", \" \\\\ -~- / \", \" '---' \"],\n\t\t],\n\t},\n\tCat: {\n\t\tname: \"Cat\",\n\t\trarityFloor: Rarity.COMMON,\n\t\tframes: [\n\t\t\t[\" /\\\\_/\\\\ \", \"( {E}.{E} ) \", \" > ^ < \", \" \\\\___/ \"],\n\t\t\t[\" /\\\\_/\\\\ \", \"( {E}-{E} ) \", \" > = < \", \" \\\\___/ \"],\n\t\t\t[\" /\\\\_/\\\\ \", \"( {E}.{E} ) \", \" > < \", \" \\\\___/ \"],\n\t\t],\n\t},\n\tDragon: {\n\t\tname: \"Dragon\",\n\t\trarityFloor: Rarity.UNCOMMON,\n\t\tframes: [\n\t\t\t[\" /\\\\ \", \" / \\\\ \", \" /{E}{E}\\\\ \", \" / -- \\\\ \", \"/ /| |\\\\\\\\ \", \" \\\\ || / \", \" \\\\||/ \"],\n\t\t\t[\" /\\\\ \", \" / \\\\ \", \" /{E}{E}\\\\ \", \" / ~~ \\\\ \", \"/ /| |\\\\ \\\\ \", \" \\\\ || / \", \" \\\\||/ \"],\n\t\t\t[\" /\\\\ \", \" / \\\\ \", \" /{E}{E}\\\\ \", \" / -- \\\\ \", \"/ /| |\\\\ \\\\ \", \" \\\\ || / \", \" || \"],\n\t\t],\n\t},\n\tOctopus: {\n\t\tname: \"Octopus\",\n\t\trarityFloor: Rarity.UNCOMMON,\n\t\tframes: [\n\t\t\t[\" _ _ \", \" {E}{E} \", \" /| /|\\\\| \", \"/ | \\\\ | \\\\ \", \" | | | \"],\n\t\t\t[\" _ _ \", \" {E}{E} \", \"\\\\| /|\\\\|/ \", \" | \\\\ | /| \", \" | | | \"],\n\t\t\t[\" _ _ \", \" {E}{E} \", \" /| /|\\\\| \", \" | \\\\ | \\\\ \", \" \\\\| | | \"],\n\t\t],\n\t},\n\tOwl: {\n\t\tname: \"Owl\",\n\t\trarityFloor: Rarity.UNCOMMON,\n\t\tframes: [\n\t\t\t[\" ,___, \", \" {E}{E} \", \" ([V]) \", ' ,\" \", ', \" \\\\___/ \"],\n\t\t\t[\" ,___, \", \" {E}{E} \", \" ([_]) \", ' ,\" \", ', \" \\\\___/ \"],\n\t\t\t[\" ,___, \", \" {E}{E} \", \" ([v]) \", ' ,\" \", ', \" \\\\___/ \"],\n\t\t],\n\t},\n\tPenguin: {\n\t\tname: \"Penguin\",\n\t\trarityFloor: Rarity.UNCOMMON,\n\t\tframes: [\n\t\t\t[\" (°) \", \" /{E}{E}\\\\ \", \" / __ \\\\ \", \" \\\\ / \", \" \\\\__/ \"],\n\t\t\t[\" (°) \", \" /{E}{E}\\\\ \", \" / __ \\\\ \", \" \\\\_ _/ \", \" || \"],\n\t\t\t[\" (°) \", \" /{E}{E}\\\\ \", \" / __ \\\\ \", \" \\\\ / \", \" || \"],\n\t\t],\n\t},\n\tTurtle: {\n\t\tname: \"Turtle\",\n\t\trarityFloor: Rarity.COMMON,\n\t\tframes: [\n\t\t\t[\" ___ \", \" {E}{E} \", ' .-\"\"\"-. ', \" / ___ \\\\\", \" \\\\_______/\", \" || \"],\n\t\t\t[\" ___ \", \" {E}{E} \", ' .-\"\"\"-. ', \" / ___ \\\\\", \" \\\\_______/\", \" || \"],\n\t\t\t[\" ___ \", \" _{E}{E}_ \", ' .-\"\"\"-. ', \" / ___ \\\\\", \" \\\\_______/\", \" || \"],\n\t\t],\n\t},\n\tSnail: {\n\t\tname: \"Snail\",\n\t\trarityFloor: Rarity.COMMON,\n\t\tframes: [\n\t\t\t[\" ____ \", \" / \\\\ \", \" | {E}{E} | \", \" | __ |\", \" \\\\ / \", \" ~~ \"],\n\t\t\t[\" ____ \", \" / \\\\ \", \" | {E}{E} | \", \" | __ |\", \" \\\\ / \", \" ~~ \"],\n\t\t\t[\" ____ \", \" / \\\\ \", \" | {E} {E}| \", \" | __ |\", \" \\\\ / \", \" ~~ \"],\n\t\t],\n\t},\n\tGhost: {\n\t\tname: \"Ghost\",\n\t\trarityFloor: Rarity.RARE,\n\t\tframes: [\n\t\t\t[\" .---. \", \" / {E}{E}\\\\ \", \" | > | \", \" | | \", \" \\\\~~~~/ \", \" ~~~~ \"],\n\t\t\t[\" .---. \", \" / {E}{E}\\\\ \", \" | ~ | \", \" | | \", \" \\\\ ~~~/ \", \" ~~~~ \"],\n\t\t\t[\" .---. \", \" / o o\\\\ \", \" | _ | \", \" | | \", \" \\\\~~~~/ \", \" ~~~~ \"],\n\t\t],\n\t},\n\tAxolotl: {\n\t\tname: \"Axolotl\",\n\t\trarityFloor: Rarity.RARE,\n\t\tframes: [\n\t\t\t[\" \\\\||/ \", \" //{E}{E}\\\\\\\\ \", \" || > || \", \" \\\\\\\\__// \", ' \"||\" '],\n\t\t\t[\" \\\\||/ \", \" //{E}{E}\\\\\\\\ \", \" || < || \", \" \\\\\\\\__// \", ' \"||\" '],\n\t\t\t[\" \\\\||/ \", \" //{E}{E}\\\\\\\\ \", \" || w || \", \" \\\\\\\\__// \", ' \"||\" '],\n\t\t],\n\t},\n\tCapybara: {\n\t\tname: \"Capybara\",\n\t\trarityFloor: Rarity.UNCOMMON,\n\t\tframes: [\n\t\t\t[\" _ _ \", \" {E}{E} \", \" > < \", \" \\\\____/ \", \" || || \"],\n\t\t\t[\" _ _ \", \" {E}{E} \", \" > < \", \" \\\\____/ \", \" || || \"],\n\t\t\t[\" _ _ \", \" {E} {E} \", \" > w < \", \" \\\\____/ \", \" || || \"],\n\t\t],\n\t},\n\tCactus: {\n\t\tname: \"Cactus\",\n\t\trarityFloor: Rarity.COMMON,\n\t\tframes: [\n\t\t\t[\" _ \", \" _{E}{E}_ \", \" | > | \", \"_| |_\", \" | | \", \" |_____| \", \" ||| \"],\n\t\t\t[\" _ \", \" _{E}{E}_ \", \" | < | \", \"_| |_\", \" | | \", \" |_____| \", \" ||| \"],\n\t\t\t[\" _ \", \" _{E}{E}_ \", \" | ~ | \", \"_| |_\", \" | | \", \" |_____| \", \" ||| \"],\n\t\t],\n\t},\n\tRobot: {\n\t\tname: \"Robot\",\n\t\trarityFloor: Rarity.EPIC,\n\t\tframes: [\n\t\t\t[\" [===] \", \" |{E}{E}| \", \" | __ | \", \" |____| \", \" | | \"],\n\t\t\t[\" [===] \", \" |{E}{E}| \", \" | -- | \", \" |____| \", \" | | \"],\n\t\t\t[\" [===] \", \" |{E}{E}| \", \" | ~~ | \", \" |____| \", \" | | \"],\n\t\t],\n\t},\n\tRabbit: {\n\t\tname: \"Rabbit\",\n\t\trarityFloor: Rarity.COMMON,\n\t\tframes: [\n\t\t\t[\" /\\\\_/\\\\ \", \" /{E}{E}\\\\ \", \" | > | \", \" \\\\__/ \", \" / \\\\ \"],\n\t\t\t[\" /\\\\_/\\\\ \", \" /{E}{E}\\\\ \", \" | < | \", \" \\\\__/ \", \" / \\\\ \"],\n\t\t\t[\" /\\\\_/\\\\ \", \" /{E}{E}\\\\ \", \" | ~ | \", \" \\\\__/ \", \" || \"],\n\t\t],\n\t},\n\tMushroom: {\n\t\tname: \"Mushroom\",\n\t\trarityFloor: Rarity.RARE,\n\t\tframes: [\n\t\t\t[\" .--. \", \" /{E}{E}\\\\ \", \" | > | \", \" \\\\--/ \", \" || \", \" _||_ \"],\n\t\t\t[\" .--. \", \" /{E}{E}\\\\ \", \" | < | \", \" \\\\--/ \", \" || \", \" _||_ \"],\n\t\t\t[\" .--. \", \" /{E}{E}\\\\ \", \" | ~ | \", \" \\\\--/ \", \" || \", \" _||_ \"],\n\t\t],\n\t},\n\tChonk: {\n\t\tname: \"Chonk\",\n\t\trarityFloor: Rarity.COMMON,\n\t\tframes: [\n\t\t\t[\" .----. \", \" / {E}{E}\\\\ \", \"| > | \", \"| | \", \" \\\\____/ \"],\n\t\t\t[\" .----. \", \" / {E}{E}\\\\ \", \"| < | \", \"| | \", \" \\\\____/ \"],\n\t\t\t[\" .----. \", \" / {E}{E}\\\\ \", \"| w | \", \"| | \", \" \\\\____/ \"],\n\t\t],\n\t},\n};\n\nexport const ALL_SPECIES = Object.keys(SPECIES_DEFS) as SpeciesName[];\n\n// =============================================================================\n// Species selection with rarity weighting\n// =============================================================================\n\n/** Species rarity multipliers — rarer species need at least that rarity roll */\nconst SPECIES_RARITY_FLOORS: Partial<Record<SpeciesName, Rarity>> = {};\nfor (const def of Object.values(SPECIES_DEFS)) {\n\tSPECIES_RARITY_FLOORS[def.name] = def.rarityFloor;\n}\n\n/**\n * Roll a species from the species pool based on rarity.\n * Species can only appear if the rolled rarity meets their floor.\n */\nexport function rollSpecies(rng: () => number): { species: SpeciesName; rarity: Rarity } {\n\t// First roll rarity\n\tconst rarity = rollWeighted(rng, RARITY_WEIGHTS);\n\n\t// Filter species available at this rarity tier\n\tconst rarityOrder = [Rarity.COMMON, Rarity.UNCOMMON, Rarity.RARE, Rarity.EPIC, Rarity.LEGENDARY];\n\tconst rarityIndex = rarityOrder.indexOf(rarity);\n\n\tconst available = ALL_SPECIES.filter((s) => {\n\t\tconst floor = SPECIES_RARITY_FLOORS[s] ?? Rarity.COMMON;\n\t\tconst floorIndex = rarityOrder.indexOf(floor);\n\t\treturn floorIndex <= rarityIndex; // species floor must be <= rolled rarity\n\t});\n\n\tif (available.length === 0) {\n\t\t// Shouldn't happen but fallback\n\t\treturn { species: \"Blob\", rarity: Rarity.COMMON };\n\t}\n\n\t// Pick random species from available\n\tconst idx = Math.floor(rng() * available.length);\n\treturn { species: available[idx], rarity };\n}\n\n// =============================================================================\n// Eye and hat selection\n// =============================================================================\n\n/** Roll an eye style */\nexport function rollEyes(rng: () => number): string {\n\tconst idx = Math.floor(rng() * EYE_STYLES.length);\n\treturn EYE_STYLES[idx];\n}\n\n/** Roll a hat */\nexport function rollHat(rng: () => number): string {\n\tconst idx = Math.floor(rng() * HATS.length);\n\treturn HATS[idx];\n}\n\n// =============================================================================\n// Stat rolling\n// =============================================================================\n\n/** Rarity-based stat floor */\nfunction statFloor(rarity: Rarity): number {\n\tswitch (rarity) {\n\t\tcase Rarity.COMMON:\n\t\t\treturn 10;\n\t\tcase Rarity.UNCOMMON:\n\t\t\treturn 20;\n\t\tcase Rarity.RARE:\n\t\t\treturn 35;\n\t\tcase Rarity.EPIC:\n\t\t\treturn 50;\n\t\tcase Rarity.LEGENDARY:\n\t\t\treturn 65;\n\t}\n}\n\n/**\n * Roll RPG-style stats: one peak, one dump, three random.\n * Peak can hit 100, dump near floor.\n */\nexport function rollStats(rng: () => number, rarity: Rarity): Record<Stat, number> {\n\tconst floor = statFloor(rarity);\n\tconst stats: Partial<Record<Stat, number>> = {};\n\n\t// Pick peak and dump stats (must be different)\n\tconst peakStat = STAT_NAMES[Math.floor(rng() * STAT_NAMES.length)];\n\tlet dumpStat = STAT_NAMES[Math.floor(rng() * STAT_NAMES.length)];\n\twhile (dumpStat === peakStat) {\n\t\tdumpStat = STAT_NAMES[Math.floor(rng() * STAT_NAMES.length)];\n\t}\n\n\t// Peak: high roll (70-100)\n\tstats[peakStat] = Math.floor(rng() * 31) + 70;\n\n\t// Dump: near floor\n\tstats[dumpStat] = Math.floor(rng() * 20) + floor;\n\n\t// Others: normal range\n\tfor (const stat of STAT_NAMES) {\n\t\tif (!(stat in stats)) {\n\t\t\tstats[stat] = Math.floor(rng() * (100 - floor)) + floor;\n\t\t}\n\t}\n\n\treturn stats as Record<Stat, number>;\n}\n\n// =============================================================================\n// ASCII art rendering\n// =============================================================================\n\n/** Get the 3 animation frames for a species */\nexport function getSpeciesFrames(species: SpeciesName): string[][] {\n\treturn SPECIES_DEFS[species].frames;\n}\n\n/** Replace {E} placeholder with actual eye character */\nexport function applyEyes(frame: string[], eyes: string): string[] {\n\treturn frame.map((line) => line.replace(/\\{E\\}/g, eyes));\n}\n\n/** Get the maximum width of a species' frames */\nexport function getSpeciesWidth(species: SpeciesName): number {\n\tconst frames = SPECIES_DEFS[species].frames;\n\tlet maxW = 0;\n\tfor (const frame of frames) {\n\t\tfor (const line of frame) {\n\t\t\tmaxW = Math.max(maxW, line.length);\n\t\t}\n\t}\n\treturn maxW;\n}\n"]}
@@ -0,0 +1,287 @@
1
+ /**
2
+ * Species pool, eye styles, hats, and ASCII art frames for the buddy companion.
3
+ *
4
+ * Each species has 3 animation frames using {E} as eye placeholder.
5
+ * Frames cycle at 500ms for idle animation.
6
+ */
7
+ import { rollWeighted } from "./buddy-prng.js";
8
+ import { EYE_STYLES, HATS, RARITY_WEIGHTS, Rarity, STAT_NAMES } from "./buddy-types.js";
9
+ /**
10
+ * All 18 species with 3 animation frames each.
11
+ * {E} is replaced at render time with the buddy's eye style.
12
+ */
13
+ const SPECIES_DEFS = {
14
+ Duck: {
15
+ name: "Duck",
16
+ rarityFloor: Rarity.COMMON,
17
+ frames: [
18
+ [" __ ", " {E}{E} ", " < \\ ", " \\__\\ ", ' """" '],
19
+ [" __ ", " {E}{E} ", " < \\ ", " \\__\\ ", ' """" '],
20
+ [" __ ", " {E}{E} ", " < \\ ", " \\__\\ ", " ~~ "],
21
+ ],
22
+ },
23
+ Goose: {
24
+ name: "Goose",
25
+ rarityFloor: Rarity.COMMON,
26
+ frames: [
27
+ [" __ ", " {E}{E} ", " < \\ ", " \\__\\ ", ' """" '],
28
+ [" __ ", " {E}{E} ", " < \\ ", " \\__\\ ", ' """" '],
29
+ [" __ ", " {E}{E} ", "< \\ ", " \\__\\ ", ' """" '],
30
+ ],
31
+ },
32
+ Blob: {
33
+ name: "Blob",
34
+ rarityFloor: Rarity.COMMON,
35
+ frames: [
36
+ [" .---. ", " / {E}{E}\\ ", "| > | ", " \\ --- / ", " '---' "],
37
+ [" .---. ", " / {E}{E}\\ ", "| < | ", " \\ --- / ", " '---' "],
38
+ [" .---. ", " / o o\\ ", "| ~ | ", " \\ -~- / ", " '---' "],
39
+ ],
40
+ },
41
+ Cat: {
42
+ name: "Cat",
43
+ rarityFloor: Rarity.COMMON,
44
+ frames: [
45
+ [" /\\_/\\ ", "( {E}.{E} ) ", " > ^ < ", " \\___/ "],
46
+ [" /\\_/\\ ", "( {E}-{E} ) ", " > = < ", " \\___/ "],
47
+ [" /\\_/\\ ", "( {E}.{E} ) ", " > < ", " \\___/ "],
48
+ ],
49
+ },
50
+ Dragon: {
51
+ name: "Dragon",
52
+ rarityFloor: Rarity.UNCOMMON,
53
+ frames: [
54
+ [" /\\ ", " / \\ ", " /{E}{E}\\ ", " / -- \\ ", "/ /| |\\\\ ", " \\ || / ", " \\||/ "],
55
+ [" /\\ ", " / \\ ", " /{E}{E}\\ ", " / ~~ \\ ", "/ /| |\\ \\ ", " \\ || / ", " \\||/ "],
56
+ [" /\\ ", " / \\ ", " /{E}{E}\\ ", " / -- \\ ", "/ /| |\\ \\ ", " \\ || / ", " || "],
57
+ ],
58
+ },
59
+ Octopus: {
60
+ name: "Octopus",
61
+ rarityFloor: Rarity.UNCOMMON,
62
+ frames: [
63
+ [" _ _ ", " {E}{E} ", " /| /|\\| ", "/ | \\ | \\ ", " | | | "],
64
+ [" _ _ ", " {E}{E} ", "\\| /|\\|/ ", " | \\ | /| ", " | | | "],
65
+ [" _ _ ", " {E}{E} ", " /| /|\\| ", " | \\ | \\ ", " \\| | | "],
66
+ ],
67
+ },
68
+ Owl: {
69
+ name: "Owl",
70
+ rarityFloor: Rarity.UNCOMMON,
71
+ frames: [
72
+ [" ,___, ", " {E}{E} ", " ([V]) ", ' ," ", ', " \\___/ "],
73
+ [" ,___, ", " {E}{E} ", " ([_]) ", ' ," ", ', " \\___/ "],
74
+ [" ,___, ", " {E}{E} ", " ([v]) ", ' ," ", ', " \\___/ "],
75
+ ],
76
+ },
77
+ Penguin: {
78
+ name: "Penguin",
79
+ rarityFloor: Rarity.UNCOMMON,
80
+ frames: [
81
+ [" (°) ", " /{E}{E}\\ ", " / __ \\ ", " \\ / ", " \\__/ "],
82
+ [" (°) ", " /{E}{E}\\ ", " / __ \\ ", " \\_ _/ ", " || "],
83
+ [" (°) ", " /{E}{E}\\ ", " / __ \\ ", " \\ / ", " || "],
84
+ ],
85
+ },
86
+ Turtle: {
87
+ name: "Turtle",
88
+ rarityFloor: Rarity.COMMON,
89
+ frames: [
90
+ [" ___ ", " {E}{E} ", ' .-"""-. ', " / ___ \\", " \\_______/", " || "],
91
+ [" ___ ", " {E}{E} ", ' .-"""-. ', " / ___ \\", " \\_______/", " || "],
92
+ [" ___ ", " _{E}{E}_ ", ' .-"""-. ', " / ___ \\", " \\_______/", " || "],
93
+ ],
94
+ },
95
+ Snail: {
96
+ name: "Snail",
97
+ rarityFloor: Rarity.COMMON,
98
+ frames: [
99
+ [" ____ ", " / \\ ", " | {E}{E} | ", " | __ |", " \\ / ", " ~~ "],
100
+ [" ____ ", " / \\ ", " | {E}{E} | ", " | __ |", " \\ / ", " ~~ "],
101
+ [" ____ ", " / \\ ", " | {E} {E}| ", " | __ |", " \\ / ", " ~~ "],
102
+ ],
103
+ },
104
+ Ghost: {
105
+ name: "Ghost",
106
+ rarityFloor: Rarity.RARE,
107
+ frames: [
108
+ [" .---. ", " / {E}{E}\\ ", " | > | ", " | | ", " \\~~~~/ ", " ~~~~ "],
109
+ [" .---. ", " / {E}{E}\\ ", " | ~ | ", " | | ", " \\ ~~~/ ", " ~~~~ "],
110
+ [" .---. ", " / o o\\ ", " | _ | ", " | | ", " \\~~~~/ ", " ~~~~ "],
111
+ ],
112
+ },
113
+ Axolotl: {
114
+ name: "Axolotl",
115
+ rarityFloor: Rarity.RARE,
116
+ frames: [
117
+ [" \\||/ ", " //{E}{E}\\\\ ", " || > || ", " \\\\__// ", ' "||" '],
118
+ [" \\||/ ", " //{E}{E}\\\\ ", " || < || ", " \\\\__// ", ' "||" '],
119
+ [" \\||/ ", " //{E}{E}\\\\ ", " || w || ", " \\\\__// ", ' "||" '],
120
+ ],
121
+ },
122
+ Capybara: {
123
+ name: "Capybara",
124
+ rarityFloor: Rarity.UNCOMMON,
125
+ frames: [
126
+ [" _ _ ", " {E}{E} ", " > < ", " \\____/ ", " || || "],
127
+ [" _ _ ", " {E}{E} ", " > < ", " \\____/ ", " || || "],
128
+ [" _ _ ", " {E} {E} ", " > w < ", " \\____/ ", " || || "],
129
+ ],
130
+ },
131
+ Cactus: {
132
+ name: "Cactus",
133
+ rarityFloor: Rarity.COMMON,
134
+ frames: [
135
+ [" _ ", " _{E}{E}_ ", " | > | ", "_| |_", " | | ", " |_____| ", " ||| "],
136
+ [" _ ", " _{E}{E}_ ", " | < | ", "_| |_", " | | ", " |_____| ", " ||| "],
137
+ [" _ ", " _{E}{E}_ ", " | ~ | ", "_| |_", " | | ", " |_____| ", " ||| "],
138
+ ],
139
+ },
140
+ Robot: {
141
+ name: "Robot",
142
+ rarityFloor: Rarity.EPIC,
143
+ frames: [
144
+ [" [===] ", " |{E}{E}| ", " | __ | ", " |____| ", " | | "],
145
+ [" [===] ", " |{E}{E}| ", " | -- | ", " |____| ", " | | "],
146
+ [" [===] ", " |{E}{E}| ", " | ~~ | ", " |____| ", " | | "],
147
+ ],
148
+ },
149
+ Rabbit: {
150
+ name: "Rabbit",
151
+ rarityFloor: Rarity.COMMON,
152
+ frames: [
153
+ [" /\\_/\\ ", " /{E}{E}\\ ", " | > | ", " \\__/ ", " / \\ "],
154
+ [" /\\_/\\ ", " /{E}{E}\\ ", " | < | ", " \\__/ ", " / \\ "],
155
+ [" /\\_/\\ ", " /{E}{E}\\ ", " | ~ | ", " \\__/ ", " || "],
156
+ ],
157
+ },
158
+ Mushroom: {
159
+ name: "Mushroom",
160
+ rarityFloor: Rarity.RARE,
161
+ frames: [
162
+ [" .--. ", " /{E}{E}\\ ", " | > | ", " \\--/ ", " || ", " _||_ "],
163
+ [" .--. ", " /{E}{E}\\ ", " | < | ", " \\--/ ", " || ", " _||_ "],
164
+ [" .--. ", " /{E}{E}\\ ", " | ~ | ", " \\--/ ", " || ", " _||_ "],
165
+ ],
166
+ },
167
+ Chonk: {
168
+ name: "Chonk",
169
+ rarityFloor: Rarity.COMMON,
170
+ frames: [
171
+ [" .----. ", " / {E}{E}\\ ", "| > | ", "| | ", " \\____/ "],
172
+ [" .----. ", " / {E}{E}\\ ", "| < | ", "| | ", " \\____/ "],
173
+ [" .----. ", " / {E}{E}\\ ", "| w | ", "| | ", " \\____/ "],
174
+ ],
175
+ },
176
+ };
177
+ export const ALL_SPECIES = Object.keys(SPECIES_DEFS);
178
+ // =============================================================================
179
+ // Species selection with rarity weighting
180
+ // =============================================================================
181
+ /** Species rarity multipliers — rarer species need at least that rarity roll */
182
+ const SPECIES_RARITY_FLOORS = {};
183
+ for (const def of Object.values(SPECIES_DEFS)) {
184
+ SPECIES_RARITY_FLOORS[def.name] = def.rarityFloor;
185
+ }
186
+ /**
187
+ * Roll a species from the species pool based on rarity.
188
+ * Species can only appear if the rolled rarity meets their floor.
189
+ */
190
+ export function rollSpecies(rng) {
191
+ // First roll rarity
192
+ const rarity = rollWeighted(rng, RARITY_WEIGHTS);
193
+ // Filter species available at this rarity tier
194
+ const rarityOrder = [Rarity.COMMON, Rarity.UNCOMMON, Rarity.RARE, Rarity.EPIC, Rarity.LEGENDARY];
195
+ const rarityIndex = rarityOrder.indexOf(rarity);
196
+ const available = ALL_SPECIES.filter((s) => {
197
+ const floor = SPECIES_RARITY_FLOORS[s] ?? Rarity.COMMON;
198
+ const floorIndex = rarityOrder.indexOf(floor);
199
+ return floorIndex <= rarityIndex; // species floor must be <= rolled rarity
200
+ });
201
+ if (available.length === 0) {
202
+ // Shouldn't happen but fallback
203
+ return { species: "Blob", rarity: Rarity.COMMON };
204
+ }
205
+ // Pick random species from available
206
+ const idx = Math.floor(rng() * available.length);
207
+ return { species: available[idx], rarity };
208
+ }
209
+ // =============================================================================
210
+ // Eye and hat selection
211
+ // =============================================================================
212
+ /** Roll an eye style */
213
+ export function rollEyes(rng) {
214
+ const idx = Math.floor(rng() * EYE_STYLES.length);
215
+ return EYE_STYLES[idx];
216
+ }
217
+ /** Roll a hat */
218
+ export function rollHat(rng) {
219
+ const idx = Math.floor(rng() * HATS.length);
220
+ return HATS[idx];
221
+ }
222
+ // =============================================================================
223
+ // Stat rolling
224
+ // =============================================================================
225
+ /** Rarity-based stat floor */
226
+ function statFloor(rarity) {
227
+ switch (rarity) {
228
+ case Rarity.COMMON:
229
+ return 10;
230
+ case Rarity.UNCOMMON:
231
+ return 20;
232
+ case Rarity.RARE:
233
+ return 35;
234
+ case Rarity.EPIC:
235
+ return 50;
236
+ case Rarity.LEGENDARY:
237
+ return 65;
238
+ }
239
+ }
240
+ /**
241
+ * Roll RPG-style stats: one peak, one dump, three random.
242
+ * Peak can hit 100, dump near floor.
243
+ */
244
+ export function rollStats(rng, rarity) {
245
+ const floor = statFloor(rarity);
246
+ const stats = {};
247
+ // Pick peak and dump stats (must be different)
248
+ const peakStat = STAT_NAMES[Math.floor(rng() * STAT_NAMES.length)];
249
+ let dumpStat = STAT_NAMES[Math.floor(rng() * STAT_NAMES.length)];
250
+ while (dumpStat === peakStat) {
251
+ dumpStat = STAT_NAMES[Math.floor(rng() * STAT_NAMES.length)];
252
+ }
253
+ // Peak: high roll (70-100)
254
+ stats[peakStat] = Math.floor(rng() * 31) + 70;
255
+ // Dump: near floor
256
+ stats[dumpStat] = Math.floor(rng() * 20) + floor;
257
+ // Others: normal range
258
+ for (const stat of STAT_NAMES) {
259
+ if (!(stat in stats)) {
260
+ stats[stat] = Math.floor(rng() * (100 - floor)) + floor;
261
+ }
262
+ }
263
+ return stats;
264
+ }
265
+ // =============================================================================
266
+ // ASCII art rendering
267
+ // =============================================================================
268
+ /** Get the 3 animation frames for a species */
269
+ export function getSpeciesFrames(species) {
270
+ return SPECIES_DEFS[species].frames;
271
+ }
272
+ /** Replace {E} placeholder with actual eye character */
273
+ export function applyEyes(frame, eyes) {
274
+ return frame.map((line) => line.replace(/\{E\}/g, eyes));
275
+ }
276
+ /** Get the maximum width of a species' frames */
277
+ export function getSpeciesWidth(species) {
278
+ const frames = SPECIES_DEFS[species].frames;
279
+ let maxW = 0;
280
+ for (const frame of frames) {
281
+ for (const line of frame) {
282
+ maxW = Math.max(maxW, line.length);
283
+ }
284
+ }
285
+ return maxW;
286
+ }
287
+ //# sourceMappingURL=buddy-species.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buddy-species.js","sourceRoot":"","sources":["../../../src/core/buddy/buddy-species.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAoB,UAAU,EAAa,MAAM,kBAAkB,CAAC;AAYrH;;;GAGG;AACH,MAAM,YAAY,GAAoC;IACrD,IAAI,EAAE;QACL,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,MAAM,EAAE;YACP,CAAC,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,CAAC;YACxE,CAAC,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,CAAC;YACxE,CAAC,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,CAAC;SACxE;KACD;IACD,KAAK,EAAE;QACN,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,MAAM,EAAE;YACP,CAAC,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,CAAC;YACxE,CAAC,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,CAAC;YACvE,CAAC,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,CAAC;SACvE;KACD;IACD,IAAI,EAAE;QACL,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,MAAM,EAAE;YACP,CAAC,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,CAAC;YACpE,CAAC,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,CAAC;YACpE,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,CAAC;SACjE;KACD;IACD,GAAG,EAAE;QACJ,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,MAAM,EAAE;YACP,CAAC,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,CAAC;YACzD,CAAC,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,CAAC;YACzD,CAAC,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,CAAC;SACzD;KACD;IACD,MAAM,EAAE;QACP,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,MAAM,CAAC,QAAQ;QAC5B,MAAM,EAAE;YACP,CAAC,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,CAAC;YAC5G,CAAC,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,CAAC;YAC7G,CAAC,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,CAAC;SAC5G;KACD;IACD,OAAO,EAAE;QACR,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,MAAM,CAAC,QAAQ;QAC5B,MAAM,EAAE;YACP,CAAC,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,CAAC;YAC1E,CAAC,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,CAAC;YAC1E,CAAC,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,CAAC;SAC3E;KACD;IACD,GAAG,EAAE;QACJ,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,MAAM,CAAC,QAAQ;QAC5B,MAAM,EAAE;YACP,CAAC,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,CAAC;YACxE,CAAC,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,CAAC;YACxE,CAAC,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,CAAC;SACxE;KACD;IACD,OAAO,EAAE;QACR,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,MAAM,CAAC,QAAQ;QAC5B,MAAM,EAAE;YACP,CAAC,YAAW,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,CAAC;YACxE,CAAC,YAAW,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,CAAC;YACvE,CAAC,YAAW,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,CAAC;SACvE;KACD;IACD,MAAM,EAAE;QACP,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,MAAM,EAAE;YACP,CAAC,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,CAAC;YACxF,CAAC,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,CAAC;YACxF,CAAC,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,CAAC;SACxF;KACD;IACD,KAAK,EAAE;QACN,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,MAAM,EAAE;YACP,CAAC,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,CAAC;YACzF,CAAC,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,CAAC;YACzF,CAAC,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,CAAC;SACzF;KACD;IACD,KAAK,EAAE;QACN,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,MAAM,CAAC,IAAI;QACxB,MAAM,EAAE;YACP,CAAC,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC;YACrF,CAAC,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC;YACrF,CAAC,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC;SAClF;KACD;IACD,OAAO,EAAE;QACR,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,MAAM,CAAC,IAAI;QACxB,MAAM,EAAE;YACP,CAAC,aAAa,EAAE,kBAAkB,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,CAAC;YAC/E,CAAC,aAAa,EAAE,kBAAkB,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,CAAC;YAC/E,CAAC,aAAa,EAAE,kBAAkB,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,CAAC;SAC/E;KACD;IACD,QAAQ,EAAE;QACT,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,MAAM,CAAC,QAAQ;QAC5B,MAAM,EAAE;YACP,CAAC,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,CAAC;YACtE,CAAC,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,CAAC;YACtE,CAAC,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,CAAC;SACtE;KACD;IACD,MAAM,EAAE;QACP,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,MAAM,EAAE;YACP,CAAC,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC;YAC9F,CAAC,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC;YAC9F,CAAC,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC;SAC9F;KACD;IACD,KAAK,EAAE;QACN,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,MAAM,CAAC,IAAI;QACxB,MAAM,EAAE;YACP,CAAC,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC;YACpE,CAAC,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC;YACpE,CAAC,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC;SACpE;KACD;IACD,MAAM,EAAE;QACP,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,MAAM,EAAE;YACP,CAAC,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC;YACvE,CAAC,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC;YACvE,CAAC,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,CAAC;SACtE;KACD;IACD,QAAQ,EAAE;QACT,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,MAAM,CAAC,IAAI;QACxB,MAAM,EAAE;YACP,CAAC,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,CAAC;YAClF,CAAC,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,CAAC;YAClF,CAAC,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,CAAC;SAClF;KACD;IACD,KAAK,EAAE;QACN,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,MAAM,EAAE;YACP,CAAC,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC;YACvE,CAAC,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC;YACvE,CAAC,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC;SACvE;KACD;CACD,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAkB,CAAC;AAEtE,gFAAgF;AAChF,0CAA0C;AAC1C,gFAAgF;AAEhF,kFAAgF;AAChF,MAAM,qBAAqB,GAAyC,EAAE,CAAC;AACvE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;IAC/C,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,WAAW,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,GAAiB,EAA4C;IACxF,oBAAoB;IACpB,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAEjD,+CAA+C;IAC/C,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IACjG,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhD,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,qBAAqB,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC;QACxD,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9C,OAAO,UAAU,IAAI,WAAW,CAAC,CAAC,yCAAyC;IAA1C,CACjC,CAAC,CAAC;IAEH,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,gCAAgC;QAChC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACnD,CAAC;IAED,qCAAqC;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IACjD,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;AAAA,CAC3C;AAED,gFAAgF;AAChF,wBAAwB;AACxB,gFAAgF;AAEhF,wBAAwB;AACxB,MAAM,UAAU,QAAQ,CAAC,GAAiB,EAAU;IACnD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAClD,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;AAAA,CACvB;AAED,iBAAiB;AACjB,MAAM,UAAU,OAAO,CAAC,GAAiB,EAAU;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAAA,CACjB;AAED,gFAAgF;AAChF,eAAe;AACf,gFAAgF;AAEhF,8BAA8B;AAC9B,SAAS,SAAS,CAAC,MAAc,EAAU;IAC1C,QAAQ,MAAM,EAAE,CAAC;QAChB,KAAK,MAAM,CAAC,MAAM;YACjB,OAAO,EAAE,CAAC;QACX,KAAK,MAAM,CAAC,QAAQ;YACnB,OAAO,EAAE,CAAC;QACX,KAAK,MAAM,CAAC,IAAI;YACf,OAAO,EAAE,CAAC;QACX,KAAK,MAAM,CAAC,IAAI;YACf,OAAO,EAAE,CAAC;QACX,KAAK,MAAM,CAAC,SAAS;YACpB,OAAO,EAAE,CAAC;IACZ,CAAC;AAAA,CACD;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,GAAiB,EAAE,MAAc,EAAwB;IAClF,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,KAAK,GAAkC,EAAE,CAAC;IAEhD,+CAA+C;IAC/C,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IACnE,IAAI,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IACjE,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC9B,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,2BAA2B;IAC3B,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;IAE9C,mBAAmB;IACnB,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;IAEjD,uBAAuB;IACvB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC;QACzD,CAAC;IACF,CAAC;IAED,OAAO,KAA6B,CAAC;AAAA,CACrC;AAED,gFAAgF;AAChF,sBAAsB;AACtB,gFAAgF;AAEhF,+CAA+C;AAC/C,MAAM,UAAU,gBAAgB,CAAC,OAAoB,EAAc;IAClE,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;AAAA,CACpC;AAED,wDAAwD;AACxD,MAAM,UAAU,SAAS,CAAC,KAAe,EAAE,IAAY,EAAY;IAClE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;AAAA,CACzD;AAED,iDAAiD;AACjD,MAAM,UAAU,eAAe,CAAC,OAAoB,EAAU;IAC7D,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAC5C,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;IACF,CAAC;IACD,OAAO,IAAI,CAAC;AAAA,CACZ","sourcesContent":["/**\n * Species pool, eye styles, hats, and ASCII art frames for the buddy companion.\n *\n * Each species has 3 animation frames using {E} as eye placeholder.\n * Frames cycle at 500ms for idle animation.\n */\n\nimport { rollWeighted } from \"./buddy-prng.js\";\nimport { EYE_STYLES, HATS, RARITY_WEIGHTS, Rarity, type SpeciesName, STAT_NAMES, type Stat } from \"./buddy-types.js\";\n\n// =============================================================================\n// Species Definitions — 18 species with ASCII art\n// =============================================================================\n\nexport interface SpeciesDef {\n\tname: SpeciesName;\n\tframes: string[][]; // 3 frames, each is string[] (lines)\n\trarityFloor: Rarity; // minimum rarity this species can appear at\n}\n\n/**\n * All 18 species with 3 animation frames each.\n * {E} is replaced at render time with the buddy's eye style.\n */\nconst SPECIES_DEFS: Record<SpeciesName, SpeciesDef> = {\n\tDuck: {\n\t\tname: \"Duck\",\n\t\trarityFloor: Rarity.COMMON,\n\t\tframes: [\n\t\t\t[\" __ \", \" {E}{E} \", \" < \\\\ \", \" \\\\__\\\\ \", ' \"\"\"\" '],\n\t\t\t[\" __ \", \" {E}{E} \", \" < \\\\ \", \" \\\\__\\\\ \", ' \"\"\"\" '],\n\t\t\t[\" __ \", \" {E}{E} \", \" < \\\\ \", \" \\\\__\\\\ \", \" ~~ \"],\n\t\t],\n\t},\n\tGoose: {\n\t\tname: \"Goose\",\n\t\trarityFloor: Rarity.COMMON,\n\t\tframes: [\n\t\t\t[\" __ \", \" {E}{E} \", \" < \\\\ \", \" \\\\__\\\\ \", ' \"\"\"\" '],\n\t\t\t[\" __ \", \" {E}{E} \", \" < \\\\ \", \" \\\\__\\\\ \", ' \"\"\"\" '],\n\t\t\t[\" __ \", \" {E}{E} \", \"< \\\\ \", \" \\\\__\\\\ \", ' \"\"\"\" '],\n\t\t],\n\t},\n\tBlob: {\n\t\tname: \"Blob\",\n\t\trarityFloor: Rarity.COMMON,\n\t\tframes: [\n\t\t\t[\" .---. \", \" / {E}{E}\\\\ \", \"| > | \", \" \\\\ --- / \", \" '---' \"],\n\t\t\t[\" .---. \", \" / {E}{E}\\\\ \", \"| < | \", \" \\\\ --- / \", \" '---' \"],\n\t\t\t[\" .---. \", \" / o o\\\\ \", \"| ~ | \", \" \\\\ -~- / \", \" '---' \"],\n\t\t],\n\t},\n\tCat: {\n\t\tname: \"Cat\",\n\t\trarityFloor: Rarity.COMMON,\n\t\tframes: [\n\t\t\t[\" /\\\\_/\\\\ \", \"( {E}.{E} ) \", \" > ^ < \", \" \\\\___/ \"],\n\t\t\t[\" /\\\\_/\\\\ \", \"( {E}-{E} ) \", \" > = < \", \" \\\\___/ \"],\n\t\t\t[\" /\\\\_/\\\\ \", \"( {E}.{E} ) \", \" > < \", \" \\\\___/ \"],\n\t\t],\n\t},\n\tDragon: {\n\t\tname: \"Dragon\",\n\t\trarityFloor: Rarity.UNCOMMON,\n\t\tframes: [\n\t\t\t[\" /\\\\ \", \" / \\\\ \", \" /{E}{E}\\\\ \", \" / -- \\\\ \", \"/ /| |\\\\\\\\ \", \" \\\\ || / \", \" \\\\||/ \"],\n\t\t\t[\" /\\\\ \", \" / \\\\ \", \" /{E}{E}\\\\ \", \" / ~~ \\\\ \", \"/ /| |\\\\ \\\\ \", \" \\\\ || / \", \" \\\\||/ \"],\n\t\t\t[\" /\\\\ \", \" / \\\\ \", \" /{E}{E}\\\\ \", \" / -- \\\\ \", \"/ /| |\\\\ \\\\ \", \" \\\\ || / \", \" || \"],\n\t\t],\n\t},\n\tOctopus: {\n\t\tname: \"Octopus\",\n\t\trarityFloor: Rarity.UNCOMMON,\n\t\tframes: [\n\t\t\t[\" _ _ \", \" {E}{E} \", \" /| /|\\\\| \", \"/ | \\\\ | \\\\ \", \" | | | \"],\n\t\t\t[\" _ _ \", \" {E}{E} \", \"\\\\| /|\\\\|/ \", \" | \\\\ | /| \", \" | | | \"],\n\t\t\t[\" _ _ \", \" {E}{E} \", \" /| /|\\\\| \", \" | \\\\ | \\\\ \", \" \\\\| | | \"],\n\t\t],\n\t},\n\tOwl: {\n\t\tname: \"Owl\",\n\t\trarityFloor: Rarity.UNCOMMON,\n\t\tframes: [\n\t\t\t[\" ,___, \", \" {E}{E} \", \" ([V]) \", ' ,\" \", ', \" \\\\___/ \"],\n\t\t\t[\" ,___, \", \" {E}{E} \", \" ([_]) \", ' ,\" \", ', \" \\\\___/ \"],\n\t\t\t[\" ,___, \", \" {E}{E} \", \" ([v]) \", ' ,\" \", ', \" \\\\___/ \"],\n\t\t],\n\t},\n\tPenguin: {\n\t\tname: \"Penguin\",\n\t\trarityFloor: Rarity.UNCOMMON,\n\t\tframes: [\n\t\t\t[\" (°) \", \" /{E}{E}\\\\ \", \" / __ \\\\ \", \" \\\\ / \", \" \\\\__/ \"],\n\t\t\t[\" (°) \", \" /{E}{E}\\\\ \", \" / __ \\\\ \", \" \\\\_ _/ \", \" || \"],\n\t\t\t[\" (°) \", \" /{E}{E}\\\\ \", \" / __ \\\\ \", \" \\\\ / \", \" || \"],\n\t\t],\n\t},\n\tTurtle: {\n\t\tname: \"Turtle\",\n\t\trarityFloor: Rarity.COMMON,\n\t\tframes: [\n\t\t\t[\" ___ \", \" {E}{E} \", ' .-\"\"\"-. ', \" / ___ \\\\\", \" \\\\_______/\", \" || \"],\n\t\t\t[\" ___ \", \" {E}{E} \", ' .-\"\"\"-. ', \" / ___ \\\\\", \" \\\\_______/\", \" || \"],\n\t\t\t[\" ___ \", \" _{E}{E}_ \", ' .-\"\"\"-. ', \" / ___ \\\\\", \" \\\\_______/\", \" || \"],\n\t\t],\n\t},\n\tSnail: {\n\t\tname: \"Snail\",\n\t\trarityFloor: Rarity.COMMON,\n\t\tframes: [\n\t\t\t[\" ____ \", \" / \\\\ \", \" | {E}{E} | \", \" | __ |\", \" \\\\ / \", \" ~~ \"],\n\t\t\t[\" ____ \", \" / \\\\ \", \" | {E}{E} | \", \" | __ |\", \" \\\\ / \", \" ~~ \"],\n\t\t\t[\" ____ \", \" / \\\\ \", \" | {E} {E}| \", \" | __ |\", \" \\\\ / \", \" ~~ \"],\n\t\t],\n\t},\n\tGhost: {\n\t\tname: \"Ghost\",\n\t\trarityFloor: Rarity.RARE,\n\t\tframes: [\n\t\t\t[\" .---. \", \" / {E}{E}\\\\ \", \" | > | \", \" | | \", \" \\\\~~~~/ \", \" ~~~~ \"],\n\t\t\t[\" .---. \", \" / {E}{E}\\\\ \", \" | ~ | \", \" | | \", \" \\\\ ~~~/ \", \" ~~~~ \"],\n\t\t\t[\" .---. \", \" / o o\\\\ \", \" | _ | \", \" | | \", \" \\\\~~~~/ \", \" ~~~~ \"],\n\t\t],\n\t},\n\tAxolotl: {\n\t\tname: \"Axolotl\",\n\t\trarityFloor: Rarity.RARE,\n\t\tframes: [\n\t\t\t[\" \\\\||/ \", \" //{E}{E}\\\\\\\\ \", \" || > || \", \" \\\\\\\\__// \", ' \"||\" '],\n\t\t\t[\" \\\\||/ \", \" //{E}{E}\\\\\\\\ \", \" || < || \", \" \\\\\\\\__// \", ' \"||\" '],\n\t\t\t[\" \\\\||/ \", \" //{E}{E}\\\\\\\\ \", \" || w || \", \" \\\\\\\\__// \", ' \"||\" '],\n\t\t],\n\t},\n\tCapybara: {\n\t\tname: \"Capybara\",\n\t\trarityFloor: Rarity.UNCOMMON,\n\t\tframes: [\n\t\t\t[\" _ _ \", \" {E}{E} \", \" > < \", \" \\\\____/ \", \" || || \"],\n\t\t\t[\" _ _ \", \" {E}{E} \", \" > < \", \" \\\\____/ \", \" || || \"],\n\t\t\t[\" _ _ \", \" {E} {E} \", \" > w < \", \" \\\\____/ \", \" || || \"],\n\t\t],\n\t},\n\tCactus: {\n\t\tname: \"Cactus\",\n\t\trarityFloor: Rarity.COMMON,\n\t\tframes: [\n\t\t\t[\" _ \", \" _{E}{E}_ \", \" | > | \", \"_| |_\", \" | | \", \" |_____| \", \" ||| \"],\n\t\t\t[\" _ \", \" _{E}{E}_ \", \" | < | \", \"_| |_\", \" | | \", \" |_____| \", \" ||| \"],\n\t\t\t[\" _ \", \" _{E}{E}_ \", \" | ~ | \", \"_| |_\", \" | | \", \" |_____| \", \" ||| \"],\n\t\t],\n\t},\n\tRobot: {\n\t\tname: \"Robot\",\n\t\trarityFloor: Rarity.EPIC,\n\t\tframes: [\n\t\t\t[\" [===] \", \" |{E}{E}| \", \" | __ | \", \" |____| \", \" | | \"],\n\t\t\t[\" [===] \", \" |{E}{E}| \", \" | -- | \", \" |____| \", \" | | \"],\n\t\t\t[\" [===] \", \" |{E}{E}| \", \" | ~~ | \", \" |____| \", \" | | \"],\n\t\t],\n\t},\n\tRabbit: {\n\t\tname: \"Rabbit\",\n\t\trarityFloor: Rarity.COMMON,\n\t\tframes: [\n\t\t\t[\" /\\\\_/\\\\ \", \" /{E}{E}\\\\ \", \" | > | \", \" \\\\__/ \", \" / \\\\ \"],\n\t\t\t[\" /\\\\_/\\\\ \", \" /{E}{E}\\\\ \", \" | < | \", \" \\\\__/ \", \" / \\\\ \"],\n\t\t\t[\" /\\\\_/\\\\ \", \" /{E}{E}\\\\ \", \" | ~ | \", \" \\\\__/ \", \" || \"],\n\t\t],\n\t},\n\tMushroom: {\n\t\tname: \"Mushroom\",\n\t\trarityFloor: Rarity.RARE,\n\t\tframes: [\n\t\t\t[\" .--. \", \" /{E}{E}\\\\ \", \" | > | \", \" \\\\--/ \", \" || \", \" _||_ \"],\n\t\t\t[\" .--. \", \" /{E}{E}\\\\ \", \" | < | \", \" \\\\--/ \", \" || \", \" _||_ \"],\n\t\t\t[\" .--. \", \" /{E}{E}\\\\ \", \" | ~ | \", \" \\\\--/ \", \" || \", \" _||_ \"],\n\t\t],\n\t},\n\tChonk: {\n\t\tname: \"Chonk\",\n\t\trarityFloor: Rarity.COMMON,\n\t\tframes: [\n\t\t\t[\" .----. \", \" / {E}{E}\\\\ \", \"| > | \", \"| | \", \" \\\\____/ \"],\n\t\t\t[\" .----. \", \" / {E}{E}\\\\ \", \"| < | \", \"| | \", \" \\\\____/ \"],\n\t\t\t[\" .----. \", \" / {E}{E}\\\\ \", \"| w | \", \"| | \", \" \\\\____/ \"],\n\t\t],\n\t},\n};\n\nexport const ALL_SPECIES = Object.keys(SPECIES_DEFS) as SpeciesName[];\n\n// =============================================================================\n// Species selection with rarity weighting\n// =============================================================================\n\n/** Species rarity multipliers — rarer species need at least that rarity roll */\nconst SPECIES_RARITY_FLOORS: Partial<Record<SpeciesName, Rarity>> = {};\nfor (const def of Object.values(SPECIES_DEFS)) {\n\tSPECIES_RARITY_FLOORS[def.name] = def.rarityFloor;\n}\n\n/**\n * Roll a species from the species pool based on rarity.\n * Species can only appear if the rolled rarity meets their floor.\n */\nexport function rollSpecies(rng: () => number): { species: SpeciesName; rarity: Rarity } {\n\t// First roll rarity\n\tconst rarity = rollWeighted(rng, RARITY_WEIGHTS);\n\n\t// Filter species available at this rarity tier\n\tconst rarityOrder = [Rarity.COMMON, Rarity.UNCOMMON, Rarity.RARE, Rarity.EPIC, Rarity.LEGENDARY];\n\tconst rarityIndex = rarityOrder.indexOf(rarity);\n\n\tconst available = ALL_SPECIES.filter((s) => {\n\t\tconst floor = SPECIES_RARITY_FLOORS[s] ?? Rarity.COMMON;\n\t\tconst floorIndex = rarityOrder.indexOf(floor);\n\t\treturn floorIndex <= rarityIndex; // species floor must be <= rolled rarity\n\t});\n\n\tif (available.length === 0) {\n\t\t// Shouldn't happen but fallback\n\t\treturn { species: \"Blob\", rarity: Rarity.COMMON };\n\t}\n\n\t// Pick random species from available\n\tconst idx = Math.floor(rng() * available.length);\n\treturn { species: available[idx], rarity };\n}\n\n// =============================================================================\n// Eye and hat selection\n// =============================================================================\n\n/** Roll an eye style */\nexport function rollEyes(rng: () => number): string {\n\tconst idx = Math.floor(rng() * EYE_STYLES.length);\n\treturn EYE_STYLES[idx];\n}\n\n/** Roll a hat */\nexport function rollHat(rng: () => number): string {\n\tconst idx = Math.floor(rng() * HATS.length);\n\treturn HATS[idx];\n}\n\n// =============================================================================\n// Stat rolling\n// =============================================================================\n\n/** Rarity-based stat floor */\nfunction statFloor(rarity: Rarity): number {\n\tswitch (rarity) {\n\t\tcase Rarity.COMMON:\n\t\t\treturn 10;\n\t\tcase Rarity.UNCOMMON:\n\t\t\treturn 20;\n\t\tcase Rarity.RARE:\n\t\t\treturn 35;\n\t\tcase Rarity.EPIC:\n\t\t\treturn 50;\n\t\tcase Rarity.LEGENDARY:\n\t\t\treturn 65;\n\t}\n}\n\n/**\n * Roll RPG-style stats: one peak, one dump, three random.\n * Peak can hit 100, dump near floor.\n */\nexport function rollStats(rng: () => number, rarity: Rarity): Record<Stat, number> {\n\tconst floor = statFloor(rarity);\n\tconst stats: Partial<Record<Stat, number>> = {};\n\n\t// Pick peak and dump stats (must be different)\n\tconst peakStat = STAT_NAMES[Math.floor(rng() * STAT_NAMES.length)];\n\tlet dumpStat = STAT_NAMES[Math.floor(rng() * STAT_NAMES.length)];\n\twhile (dumpStat === peakStat) {\n\t\tdumpStat = STAT_NAMES[Math.floor(rng() * STAT_NAMES.length)];\n\t}\n\n\t// Peak: high roll (70-100)\n\tstats[peakStat] = Math.floor(rng() * 31) + 70;\n\n\t// Dump: near floor\n\tstats[dumpStat] = Math.floor(rng() * 20) + floor;\n\n\t// Others: normal range\n\tfor (const stat of STAT_NAMES) {\n\t\tif (!(stat in stats)) {\n\t\t\tstats[stat] = Math.floor(rng() * (100 - floor)) + floor;\n\t\t}\n\t}\n\n\treturn stats as Record<Stat, number>;\n}\n\n// =============================================================================\n// ASCII art rendering\n// =============================================================================\n\n/** Get the 3 animation frames for a species */\nexport function getSpeciesFrames(species: SpeciesName): string[][] {\n\treturn SPECIES_DEFS[species].frames;\n}\n\n/** Replace {E} placeholder with actual eye character */\nexport function applyEyes(frame: string[], eyes: string): string[] {\n\treturn frame.map((line) => line.replace(/\\{E\\}/g, eyes));\n}\n\n/** Get the maximum width of a species' frames */\nexport function getSpeciesWidth(species: SpeciesName): number {\n\tconst frames = SPECIES_DEFS[species].frames;\n\tlet maxW = 0;\n\tfor (const frame of frames) {\n\t\tfor (const line of frame) {\n\t\t\tmaxW = Math.max(maxW, line.length);\n\t\t}\n\t}\n\treturn maxW;\n}\n"]}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Shared types for the buddy companion system.
3
+ */
4
+ /** RPG-style stats for a companion */
5
+ export declare enum Stat {
6
+ DEBUGGING = "DEBUGGING",
7
+ PATIENCE = "PATIENCE",
8
+ CHAOS = "CHAOS",
9
+ WISDOM = "WISDOM",
10
+ SNARK = "SNARK"
11
+ }
12
+ export declare const STAT_NAMES: Stat[];
13
+ export interface StatBlock {
14
+ [Stat.DEBUGGING]: number;
15
+ [Stat.PATIENCE]: number;
16
+ [Stat.CHAOS]: number;
17
+ [Stat.WISDOM]: number;
18
+ [Stat.SNARK]: number;
19
+ }
20
+ /** Rarity tiers with weights for rolling */
21
+ export declare enum Rarity {
22
+ COMMON = "Common",
23
+ UNCOMMON = "Uncommon",
24
+ RARE = "Rare",
25
+ EPIC = "Epic",
26
+ LEGENDARY = "Legendary"
27
+ }
28
+ /** Weight for each rarity tier (out of 100) */
29
+ export declare const RARITY_WEIGHTS: Record<Rarity, number>;
30
+ /** Eye styles substituted into ASCII art via {E} placeholder */
31
+ export declare const EYE_STYLES: readonly ["●", "○", "◉", "⊙", "◎", "°"];
32
+ /** Hats rendered above the sprite */
33
+ export declare const HATS: readonly ["", "🎩", "👑", "🎓", "🧢", "👒", "⛑️", "🪖"];
34
+ /** Species identifiers */
35
+ export type SpeciesName = "Duck" | "Goose" | "Blob" | "Cat" | "Dragon" | "Octopus" | "Owl" | "Penguin" | "Turtle" | "Snail" | "Ghost" | "Axolotl" | "Capybara" | "Cactus" | "Robot" | "Rabbit" | "Mushroom" | "Chonk";
36
+ /** Deterministic bones — re-rolled from hash on every session */
37
+ export interface CompanionBones {
38
+ species: SpeciesName;
39
+ rarity: Rarity;
40
+ shiny: boolean;
41
+ stats: StatBlock;
42
+ eyeStyle: string;
43
+ hat: string;
44
+ }
45
+ /** Persisted soul — generated once on first hatch */
46
+ export interface StoredCompanion {
47
+ rerollCount: number;
48
+ name: string;
49
+ personality: string;
50
+ backstory: string;
51
+ hatchedAt: string;
52
+ hidden?: boolean;
53
+ ollamaModel?: string;
54
+ }
55
+ /** Full buddy state = bones (ephemeral) + soul (persisted) */
56
+ export interface BuddyState extends CompanionBones, StoredCompanion {
57
+ }
58
+ //# sourceMappingURL=buddy-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buddy-types.d.ts","sourceRoot":"","sources":["../../../src/core/buddy/buddy-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,sCAAsC;AACtC,oBAAY,IAAI;IACf,SAAS,cAAc;IACvB,QAAQ,aAAa;IACrB,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,KAAK,UAAU;CACf;AAED,eAAO,MAAM,UAAU,QAAsB,CAAC;AAE9C,MAAM,WAAW,SAAS;IACzB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IACzB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IACxB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACrB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACtB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,4CAA4C;AAC5C,oBAAY,MAAM;IACjB,MAAM,WAAW;IACjB,QAAQ,aAAa;IACrB,IAAI,SAAS;IACb,IAAI,SAAS;IACb,SAAS,cAAc;CACvB;AAED,+CAA+C;AAC/C,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMjD,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,UAAU,oDAA0C,CAAC;AAElE,qCAAqC;AACrC,eAAO,MAAM,IAAI,yEASP,CAAC;AAEX,0BAA0B;AAC1B,MAAM,MAAM,WAAW,GACpB,MAAM,GACN,OAAO,GACP,MAAM,GACN,KAAK,GACL,QAAQ,GACR,SAAS,GACT,KAAK,GACL,SAAS,GACT,QAAQ,GACR,OAAO,GACP,OAAO,GACP,SAAS,GACT,UAAU,GACV,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,UAAU,GACV,OAAO,CAAC;AAEX,mEAAiE;AACjE,MAAM,WAAW,cAAc;IAC9B,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,uDAAqD;AACrD,MAAM,WAAW,eAAe;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,8DAA8D;AAC9D,MAAM,WAAW,UAAW,SAAQ,cAAc,EAAE,eAAe;CAAG","sourcesContent":["/**\n * Shared types for the buddy companion system.\n */\n\n/** RPG-style stats for a companion */\nexport enum Stat {\n\tDEBUGGING = \"DEBUGGING\",\n\tPATIENCE = \"PATIENCE\",\n\tCHAOS = \"CHAOS\",\n\tWISDOM = \"WISDOM\",\n\tSNARK = \"SNARK\",\n}\n\nexport const STAT_NAMES = Object.values(Stat);\n\nexport interface StatBlock {\n\t[Stat.DEBUGGING]: number;\n\t[Stat.PATIENCE]: number;\n\t[Stat.CHAOS]: number;\n\t[Stat.WISDOM]: number;\n\t[Stat.SNARK]: number;\n}\n\n/** Rarity tiers with weights for rolling */\nexport enum Rarity {\n\tCOMMON = \"Common\",\n\tUNCOMMON = \"Uncommon\",\n\tRARE = \"Rare\",\n\tEPIC = \"Epic\",\n\tLEGENDARY = \"Legendary\",\n}\n\n/** Weight for each rarity tier (out of 100) */\nexport const RARITY_WEIGHTS: Record<Rarity, number> = {\n\t[Rarity.COMMON]: 60,\n\t[Rarity.UNCOMMON]: 25,\n\t[Rarity.RARE]: 10,\n\t[Rarity.EPIC]: 4,\n\t[Rarity.LEGENDARY]: 1,\n};\n\n/** Eye styles substituted into ASCII art via {E} placeholder */\nexport const EYE_STYLES = [\"●\", \"○\", \"◉\", \"⊙\", \"◎\", \"°\"] as const;\n\n/** Hats rendered above the sprite */\nexport const HATS = [\n\t\"\", // no hat\n\t\"🎩\",\n\t\"👑\",\n\t\"🎓\",\n\t\"🧢\",\n\t\"👒\",\n\t\"⛑️\",\n\t\"🪖\",\n] as const;\n\n/** Species identifiers */\nexport type SpeciesName =\n\t| \"Duck\"\n\t| \"Goose\"\n\t| \"Blob\"\n\t| \"Cat\"\n\t| \"Dragon\"\n\t| \"Octopus\"\n\t| \"Owl\"\n\t| \"Penguin\"\n\t| \"Turtle\"\n\t| \"Snail\"\n\t| \"Ghost\"\n\t| \"Axolotl\"\n\t| \"Capybara\"\n\t| \"Cactus\"\n\t| \"Robot\"\n\t| \"Rabbit\"\n\t| \"Mushroom\"\n\t| \"Chonk\";\n\n/** Deterministic bones — re-rolled from hash on every session */\nexport interface CompanionBones {\n\tspecies: SpeciesName;\n\trarity: Rarity;\n\tshiny: boolean;\n\tstats: StatBlock;\n\teyeStyle: string;\n\that: string;\n}\n\n/** Persisted soul — generated once on first hatch */\nexport interface StoredCompanion {\n\trerollCount: number;\n\tname: string;\n\tpersonality: string;\n\tbackstory: string;\n\thatchedAt: string;\n\thidden?: boolean; // true when user ran /buddy off\n\tollamaModel?: string; // user-chosen Ollama model for reactions\n}\n\n/** Full buddy state = bones (ephemeral) + soul (persisted) */\nexport interface BuddyState extends CompanionBones, StoredCompanion {}\n"]}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Shared types for the buddy companion system.
3
+ */
4
+ export { Stat };
5
+ /** RPG-style stats for a companion */
6
+ var Stat;
7
+ (function (Stat) {
8
+ Stat["DEBUGGING"] = "DEBUGGING";
9
+ Stat["PATIENCE"] = "PATIENCE";
10
+ Stat["CHAOS"] = "CHAOS";
11
+ Stat["WISDOM"] = "WISDOM";
12
+ Stat["SNARK"] = "SNARK";
13
+ })(Stat || (Stat = {}));
14
+ export const STAT_NAMES = Object.values(Stat);
15
+ export { Rarity };
16
+ /** Rarity tiers with weights for rolling */
17
+ var Rarity;
18
+ (function (Rarity) {
19
+ Rarity["COMMON"] = "Common";
20
+ Rarity["UNCOMMON"] = "Uncommon";
21
+ Rarity["RARE"] = "Rare";
22
+ Rarity["EPIC"] = "Epic";
23
+ Rarity["LEGENDARY"] = "Legendary";
24
+ })(Rarity || (Rarity = {}));
25
+ /** Weight for each rarity tier (out of 100) */
26
+ export const RARITY_WEIGHTS = {
27
+ [Rarity.COMMON]: 60,
28
+ [Rarity.UNCOMMON]: 25,
29
+ [Rarity.RARE]: 10,
30
+ [Rarity.EPIC]: 4,
31
+ [Rarity.LEGENDARY]: 1,
32
+ };
33
+ /** Eye styles substituted into ASCII art via {E} placeholder */
34
+ export const EYE_STYLES = ["●", "○", "◉", "⊙", "◎", "°"];
35
+ /** Hats rendered above the sprite */
36
+ export const HATS = [
37
+ "", // no hat
38
+ "🎩",
39
+ "👑",
40
+ "🎓",
41
+ "🧢",
42
+ "👒",
43
+ "⛑️",
44
+ "🪖",
45
+ ];
46
+ //# sourceMappingURL=buddy-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buddy-types.js","sourceRoot":"","sources":["../../../src/core/buddy/buddy-types.ts"],"names":[],"mappings":"AAAA;;GAEG;SAGS,IAAI;AADhB,sCAAsC;AACtC,IAAY,IAMX;AAND,WAAY,IAAI;IACf,+BAAuB,CAAA;IACvB,6BAAqB,CAAA;IACrB,uBAAe,CAAA;IACf,yBAAiB,CAAA;IACjB,uBAAe,CAAA;AAAC,CACjB,EANY,IAAI,KAAJ,IAAI,QAMf;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SAWlC,MAAM;AADlB,4CAA4C;AAC5C,IAAY,MAMX;AAND,WAAY,MAAM;IACjB,2BAAiB,CAAA;IACjB,+BAAqB,CAAA;IACrB,uBAAa,CAAA;IACb,uBAAa,CAAA;IACb,iCAAuB,CAAA;AAAC,CACzB,EANY,MAAM,KAAN,MAAM,QAMjB;AAED,+CAA+C;AAC/C,MAAM,CAAC,MAAM,cAAc,GAA2B;IACrD,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE;IACnB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE;IACrB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE;IACjB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;IAChB,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;CACrB,CAAC;AAEF,gEAAgE;AAChE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAG,EAAE,KAAG,EAAE,KAAG,EAAE,KAAG,EAAE,KAAG,EAAE,IAAG,CAAU,CAAC;AAElE,qCAAqC;AACrC,MAAM,CAAC,MAAM,IAAI,GAAG;IACnB,EAAE,EAAE,SAAS;IACb,MAAG;IACH,MAAG;IACH,MAAG;IACH,MAAG;IACH,MAAG;IACH,QAAI;IACJ,MAAG;CACM,CAAC","sourcesContent":["/**\n * Shared types for the buddy companion system.\n */\n\n/** RPG-style stats for a companion */\nexport enum Stat {\n\tDEBUGGING = \"DEBUGGING\",\n\tPATIENCE = \"PATIENCE\",\n\tCHAOS = \"CHAOS\",\n\tWISDOM = \"WISDOM\",\n\tSNARK = \"SNARK\",\n}\n\nexport const STAT_NAMES = Object.values(Stat);\n\nexport interface StatBlock {\n\t[Stat.DEBUGGING]: number;\n\t[Stat.PATIENCE]: number;\n\t[Stat.CHAOS]: number;\n\t[Stat.WISDOM]: number;\n\t[Stat.SNARK]: number;\n}\n\n/** Rarity tiers with weights for rolling */\nexport enum Rarity {\n\tCOMMON = \"Common\",\n\tUNCOMMON = \"Uncommon\",\n\tRARE = \"Rare\",\n\tEPIC = \"Epic\",\n\tLEGENDARY = \"Legendary\",\n}\n\n/** Weight for each rarity tier (out of 100) */\nexport const RARITY_WEIGHTS: Record<Rarity, number> = {\n\t[Rarity.COMMON]: 60,\n\t[Rarity.UNCOMMON]: 25,\n\t[Rarity.RARE]: 10,\n\t[Rarity.EPIC]: 4,\n\t[Rarity.LEGENDARY]: 1,\n};\n\n/** Eye styles substituted into ASCII art via {E} placeholder */\nexport const EYE_STYLES = [\"●\", \"○\", \"◉\", \"⊙\", \"◎\", \"°\"] as const;\n\n/** Hats rendered above the sprite */\nexport const HATS = [\n\t\"\", // no hat\n\t\"🎩\",\n\t\"👑\",\n\t\"🎓\",\n\t\"🧢\",\n\t\"👒\",\n\t\"⛑️\",\n\t\"🪖\",\n] as const;\n\n/** Species identifiers */\nexport type SpeciesName =\n\t| \"Duck\"\n\t| \"Goose\"\n\t| \"Blob\"\n\t| \"Cat\"\n\t| \"Dragon\"\n\t| \"Octopus\"\n\t| \"Owl\"\n\t| \"Penguin\"\n\t| \"Turtle\"\n\t| \"Snail\"\n\t| \"Ghost\"\n\t| \"Axolotl\"\n\t| \"Capybara\"\n\t| \"Cactus\"\n\t| \"Robot\"\n\t| \"Rabbit\"\n\t| \"Mushroom\"\n\t| \"Chonk\";\n\n/** Deterministic bones — re-rolled from hash on every session */\nexport interface CompanionBones {\n\tspecies: SpeciesName;\n\trarity: Rarity;\n\tshiny: boolean;\n\tstats: StatBlock;\n\teyeStyle: string;\n\that: string;\n}\n\n/** Persisted soul — generated once on first hatch */\nexport interface StoredCompanion {\n\trerollCount: number;\n\tname: string;\n\tpersonality: string;\n\tbackstory: string;\n\thatchedAt: string;\n\thidden?: boolean; // true when user ran /buddy off\n\tollamaModel?: string; // user-chosen Ollama model for reactions\n}\n\n/** Full buddy state = bones (ephemeral) + soul (persisted) */\nexport interface BuddyState extends CompanionBones, StoredCompanion {}\n"]}
@@ -0,0 +1,7 @@
1
+ export { type BuddyCallbacks, type BuddyCommandResult, BuddyController, type BuddyControllerConfig, } from "./buddy-controller.js";
2
+ export { BuddyManager, checkOllama, type OllamaStatus } from "./buddy-manager.js";
3
+ export { createBuddyRng, createBuddySeed, fnv1a, mulberry32, rollFloat, rollInt, rollWeighted } from "./buddy-prng.js";
4
+ export { applyEyes, getSpeciesFrames, rollEyes, rollHat, rollSpecies, rollStats } from "./buddy-species.js";
5
+ export type { BuddyState, CompanionBones, SpeciesName, StatBlock, StoredCompanion } from "./buddy-types.js";
6
+ export { RARITY_WEIGHTS, Rarity, STAT_NAMES, Stat } from "./buddy-types.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/buddy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,eAAe,EACf,KAAK,qBAAqB,GAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACvH,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC5G,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC5G,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["export {\n\ttype BuddyCallbacks,\n\ttype BuddyCommandResult,\n\tBuddyController,\n\ttype BuddyControllerConfig,\n} from \"./buddy-controller.js\";\nexport { BuddyManager, checkOllama, type OllamaStatus } from \"./buddy-manager.js\";\nexport { createBuddyRng, createBuddySeed, fnv1a, mulberry32, rollFloat, rollInt, rollWeighted } from \"./buddy-prng.js\";\nexport { applyEyes, getSpeciesFrames, rollEyes, rollHat, rollSpecies, rollStats } from \"./buddy-species.js\";\nexport type { BuddyState, CompanionBones, SpeciesName, StatBlock, StoredCompanion } from \"./buddy-types.js\";\nexport { RARITY_WEIGHTS, Rarity, STAT_NAMES, Stat } from \"./buddy-types.js\";\n"]}
@@ -0,0 +1,6 @@
1
+ export { BuddyController, } from "./buddy-controller.js";
2
+ export { BuddyManager, checkOllama } from "./buddy-manager.js";
3
+ export { createBuddyRng, createBuddySeed, fnv1a, mulberry32, rollFloat, rollInt, rollWeighted } from "./buddy-prng.js";
4
+ export { applyEyes, getSpeciesFrames, rollEyes, rollHat, rollSpecies, rollStats } from "./buddy-species.js";
5
+ export { RARITY_WEIGHTS, Rarity, STAT_NAMES, Stat } from "./buddy-types.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/buddy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,eAAe,GAEf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,WAAW,EAAqB,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACvH,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE5G,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["export {\n\ttype BuddyCallbacks,\n\ttype BuddyCommandResult,\n\tBuddyController,\n\ttype BuddyControllerConfig,\n} from \"./buddy-controller.js\";\nexport { BuddyManager, checkOllama, type OllamaStatus } from \"./buddy-manager.js\";\nexport { createBuddyRng, createBuddySeed, fnv1a, mulberry32, rollFloat, rollInt, rollWeighted } from \"./buddy-prng.js\";\nexport { applyEyes, getSpeciesFrames, rollEyes, rollHat, rollSpecies, rollStats } from \"./buddy-species.js\";\nexport type { BuddyState, CompanionBones, SpeciesName, StatBlock, StoredCompanion } from \"./buddy-types.js\";\nexport { RARITY_WEIGHTS, Rarity, STAT_NAMES, Stat } from \"./buddy-types.js\";\n"]}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Branch summarization for tree navigation.
3
+ *
4
+ * When navigating to a different point in the session tree, this generates
5
+ * a summary of the branch being left so context isn't lost.
6
+ */
7
+ import type { AgentMessage } from "@dreb/agent-core";
8
+ import type { Model } from "@dreb/ai";
9
+ import type { ReadonlySessionManager, SessionEntry } from "../session-manager.js";
10
+ import { type FileOperations } from "./utils.js";
11
+ export interface BranchSummaryResult {
12
+ summary?: string;
13
+ readFiles?: string[];
14
+ modifiedFiles?: string[];
15
+ aborted?: boolean;
16
+ error?: string;
17
+ }
18
+ /** Details stored in BranchSummaryEntry.details for file tracking */
19
+ export interface BranchSummaryDetails {
20
+ readFiles: string[];
21
+ modifiedFiles: string[];
22
+ }
23
+ export type { FileOperations } from "./utils.js";
24
+ export interface BranchPreparation {
25
+ /** Messages extracted for summarization, in chronological order */
26
+ messages: AgentMessage[];
27
+ /** File operations extracted from tool calls */
28
+ fileOps: FileOperations;
29
+ /** Total estimated tokens in messages */
30
+ totalTokens: number;
31
+ }
32
+ export interface CollectEntriesResult {
33
+ /** Entries to summarize, in chronological order */
34
+ entries: SessionEntry[];
35
+ /** Common ancestor between old and new position, if any */
36
+ commonAncestorId: string | null;
37
+ }
38
+ export interface GenerateBranchSummaryOptions {
39
+ /** Model to use for summarization */
40
+ model: Model<any>;
41
+ /** API key for the model */
42
+ apiKey: string;
43
+ /** Abort signal for cancellation */
44
+ signal: AbortSignal;
45
+ /** Optional custom instructions for summarization */
46
+ customInstructions?: string;
47
+ /** If true, customInstructions replaces the default prompt instead of being appended */
48
+ replaceInstructions?: boolean;
49
+ /** Tokens reserved for prompt + LLM response (default 16384) */
50
+ reserveTokens?: number;
51
+ }
52
+ /**
53
+ * Collect entries that should be summarized when navigating from one position to another.
54
+ *
55
+ * Walks from oldLeafId back to the common ancestor with targetId, collecting entries
56
+ * along the way. Does NOT stop at compaction boundaries - those are included and their
57
+ * summaries become context.
58
+ *
59
+ * @param session - Session manager (read-only access)
60
+ * @param oldLeafId - Current position (where we're navigating from)
61
+ * @param targetId - Target position (where we're navigating to)
62
+ * @returns Entries to summarize and the common ancestor
63
+ */
64
+ export declare function collectEntriesForBranchSummary(session: ReadonlySessionManager, oldLeafId: string | null, targetId: string): CollectEntriesResult;
65
+ /**
66
+ * Prepare entries for summarization with token budget.
67
+ *
68
+ * Walks entries from NEWEST to OLDEST, adding messages until we hit the token budget.
69
+ * This ensures we keep the most recent context when the branch is too long.
70
+ *
71
+ * Also collects file operations from:
72
+ * - Tool calls in assistant messages
73
+ * - Existing branch_summary entries' details (for cumulative tracking)
74
+ *
75
+ * @param entries - Entries in chronological order
76
+ * @param tokenBudget - Maximum tokens to include (0 = no limit)
77
+ */
78
+ export declare function prepareBranchEntries(entries: SessionEntry[], tokenBudget?: number): BranchPreparation;
79
+ /**
80
+ * Generate a summary of abandoned branch entries.
81
+ *
82
+ * @param entries - Session entries to summarize (chronological order)
83
+ * @param options - Generation options
84
+ */
85
+ export declare function generateBranchSummary(entries: SessionEntry[], options: GenerateBranchSummaryOptions): Promise<BranchSummaryResult>;
86
+ //# sourceMappingURL=branch-summarization.d.ts.map