@oh-my-pi/pi-coding-agent 15.12.3 → 15.13.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 (457) hide show
  1. package/CHANGELOG.md +347 -7
  2. package/dist/cli.js +1615 -1231
  3. package/dist/types/async/job-manager.d.ts +15 -0
  4. package/dist/types/autolearn/controller.d.ts +25 -0
  5. package/dist/types/autolearn/managed-skills.d.ts +45 -0
  6. package/dist/types/autoresearch/state.d.ts +1 -1
  7. package/dist/types/autoresearch/tools/init-experiment.d.ts +1 -1
  8. package/dist/types/autoresearch/tools/log-experiment.d.ts +1 -1
  9. package/dist/types/autoresearch/tools/run-experiment.d.ts +1 -1
  10. package/dist/types/autoresearch/tools/update-notes.d.ts +1 -1
  11. package/dist/types/autoresearch/types.d.ts +1 -1
  12. package/dist/types/cli/args.d.ts +19 -2
  13. package/dist/types/cli/models-cli.d.ts +49 -0
  14. package/dist/types/cli/session-picker.d.ts +1 -1
  15. package/dist/types/cli/setup-cli.d.ts +1 -1
  16. package/dist/types/cli/setup-model-picker.d.ts +14 -0
  17. package/dist/types/collab/protocol.d.ts +1 -1
  18. package/dist/types/commands/launch.d.ts +0 -3
  19. package/dist/types/commands/models.d.ts +33 -0
  20. package/dist/types/commands/say.d.ts +24 -0
  21. package/dist/types/commands/token.d.ts +25 -0
  22. package/dist/types/commit/agentic/tools/analyze-file.d.ts +1 -1
  23. package/dist/types/commit/agentic/tools/git-file-diff.d.ts +1 -1
  24. package/dist/types/commit/agentic/tools/git-hunk.d.ts +1 -1
  25. package/dist/types/commit/agentic/tools/git-overview.d.ts +1 -1
  26. package/dist/types/commit/agentic/tools/propose-changelog.d.ts +1 -1
  27. package/dist/types/commit/agentic/tools/propose-commit.d.ts +1 -1
  28. package/dist/types/commit/agentic/tools/recent-commits.d.ts +1 -1
  29. package/dist/types/commit/agentic/tools/schemas.d.ts +1 -1
  30. package/dist/types/commit/agentic/tools/split-commit.d.ts +1 -1
  31. package/dist/types/commit/changelog/generate.d.ts +1 -1
  32. package/dist/types/commit/shared-llm.d.ts +1 -1
  33. package/dist/types/config/keybindings.d.ts +3 -3
  34. package/dist/types/config/model-registry.d.ts +17 -0
  35. package/dist/types/config/models-config-schema.d.ts +13 -1
  36. package/dist/types/config/models-config.d.ts +8 -2
  37. package/dist/types/config/settings-schema.d.ts +281 -58
  38. package/dist/types/edit/hashline/params.d.ts +1 -1
  39. package/dist/types/edit/modes/apply-patch.d.ts +1 -1
  40. package/dist/types/edit/modes/patch.d.ts +1 -1
  41. package/dist/types/edit/modes/replace.d.ts +1 -1
  42. package/dist/types/export/html/index.d.ts +2 -1
  43. package/dist/types/extensibility/custom-commands/types.d.ts +2 -2
  44. package/dist/types/extensibility/custom-tools/types.d.ts +2 -2
  45. package/dist/types/extensibility/extensions/model-api.d.ts +17 -0
  46. package/dist/types/extensibility/extensions/runner.d.ts +3 -1
  47. package/dist/types/extensibility/extensions/types.d.ts +49 -3
  48. package/dist/types/extensibility/hooks/index.d.ts +2 -1
  49. package/dist/types/extensibility/hooks/types.d.ts +2 -2
  50. package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +9 -0
  51. package/dist/types/extensibility/plugins/loader.d.ts +11 -0
  52. package/dist/types/extensibility/shared-events.d.ts +1 -1
  53. package/dist/types/extensibility/skills.d.ts +10 -0
  54. package/dist/types/goals/guided-setup.d.ts +18 -0
  55. package/dist/types/goals/state.d.ts +1 -1
  56. package/dist/types/goals/tools/goal-tool.d.ts +1 -1
  57. package/dist/types/hindsight/transcript.d.ts +1 -1
  58. package/dist/types/index.d.ts +5 -0
  59. package/dist/types/internal-urls/local-protocol.d.ts +4 -2
  60. package/dist/types/lsp/types.d.ts +1 -1
  61. package/dist/types/main.d.ts +4 -3
  62. package/dist/types/mcp/manager.d.ts +8 -0
  63. package/dist/types/mcp/startup-events.d.ts +11 -0
  64. package/dist/types/memories/index.d.ts +7 -0
  65. package/dist/types/memory-backend/local-backend.d.ts +4 -3
  66. package/dist/types/mnemopi/config.d.ts +28 -0
  67. package/dist/types/modes/acp/acp-agent.d.ts +1 -2
  68. package/dist/types/modes/components/agent-hub.d.ts +6 -0
  69. package/dist/types/modes/components/assistant-message.d.ts +1 -2
  70. package/dist/types/modes/components/compaction-summary-message.d.ts +15 -1
  71. package/dist/types/modes/components/custom-editor.d.ts +39 -1
  72. package/dist/types/modes/components/custom-editor.test.d.ts +1 -0
  73. package/dist/types/modes/components/index.d.ts +1 -0
  74. package/dist/types/modes/components/logout-account-selector.d.ts +8 -0
  75. package/dist/types/modes/components/session-selector.d.ts +1 -1
  76. package/dist/types/modes/components/status-line/component.d.ts +9 -5
  77. package/dist/types/modes/components/status-line/types.d.ts +2 -1
  78. package/dist/types/modes/components/tool-execution.d.ts +26 -16
  79. package/dist/types/modes/components/transcript-container.d.ts +23 -2
  80. package/dist/types/modes/components/tree-selector.d.ts +1 -1
  81. package/dist/types/modes/components/usage-row.d.ts +3 -0
  82. package/dist/types/modes/controllers/command-controller.d.ts +2 -2
  83. package/dist/types/modes/controllers/event-controller.d.ts +0 -17
  84. package/dist/types/modes/controllers/input-controller.d.ts +14 -0
  85. package/dist/types/modes/controllers/selector-controller.d.ts +3 -1
  86. package/dist/types/modes/gradient-highlight.d.ts +9 -4
  87. package/dist/types/modes/image-references.d.ts +6 -0
  88. package/dist/types/modes/interactive-mode.d.ts +27 -6
  89. package/dist/types/modes/magic-keywords.d.ts +13 -1
  90. package/dist/types/modes/rpc/rpc-mode.d.ts +35 -1
  91. package/dist/types/modes/rpc/rpc-types.d.ts +9 -1
  92. package/dist/types/modes/runtime-init.d.ts +4 -0
  93. package/dist/types/modes/theme/theme.d.ts +13 -2
  94. package/dist/types/modes/types.d.ts +8 -7
  95. package/dist/types/modes/utils/ui-helpers.d.ts +1 -1
  96. package/dist/types/registry/agent-registry.d.ts +17 -0
  97. package/dist/types/secrets/obfuscator.d.ts +1 -1
  98. package/dist/types/session/agent-session.d.ts +28 -35
  99. package/dist/types/session/agent-storage.d.ts +2 -1
  100. package/dist/types/session/indexed-session-storage.d.ts +3 -3
  101. package/dist/types/session/messages.d.ts +8 -10
  102. package/dist/types/session/session-context.d.ts +39 -0
  103. package/dist/types/session/session-entries.d.ts +159 -0
  104. package/dist/types/session/session-listing.d.ts +69 -0
  105. package/dist/types/session/session-loader.d.ts +16 -0
  106. package/dist/types/session/session-manager.d.ts +85 -462
  107. package/dist/types/session/session-migrations.d.ts +12 -0
  108. package/dist/types/session/session-paths.d.ts +25 -0
  109. package/dist/types/session/session-persistence.d.ts +8 -0
  110. package/dist/types/session/session-storage.d.ts +11 -7
  111. package/dist/types/session/snapcompact-inline.d.ts +12 -1
  112. package/dist/types/session/snapcompact-savings-journal.d.ts +46 -0
  113. package/dist/types/session/tool-choice-queue.d.ts +6 -6
  114. package/dist/types/slash-commands/helpers/logout.d.ts +15 -0
  115. package/dist/types/stt/asr-client.d.ts +90 -0
  116. package/dist/types/stt/asr-protocol.d.ts +97 -0
  117. package/dist/types/stt/asr-worker.d.ts +2 -0
  118. package/dist/types/stt/downloader.d.ts +38 -0
  119. package/dist/types/stt/endpointer.d.ts +59 -0
  120. package/dist/types/stt/index.d.ts +5 -1
  121. package/dist/types/stt/models.d.ts +120 -0
  122. package/dist/types/stt/recorder.d.ts +17 -0
  123. package/dist/types/stt/stt-controller.d.ts +6 -0
  124. package/dist/types/stt/transcriber.d.ts +5 -7
  125. package/dist/types/stt/wav.d.ts +29 -0
  126. package/dist/types/system-prompt.d.ts +4 -0
  127. package/dist/types/task/executor.d.ts +2 -0
  128. package/dist/types/task/index.d.ts +9 -1
  129. package/dist/types/task/types.d.ts +37 -1
  130. package/dist/types/tools/ask.d.ts +1 -1
  131. package/dist/types/tools/ast-edit.d.ts +1 -1
  132. package/dist/types/tools/ast-grep.d.ts +1 -1
  133. package/dist/types/tools/bash.d.ts +3 -3
  134. package/dist/types/tools/browser/cmux/cmux-tab.d.ts +202 -0
  135. package/dist/types/tools/browser/cmux/rpc.d.ts +70 -0
  136. package/dist/types/tools/browser/cmux/socket-client.d.ts +19 -0
  137. package/dist/types/tools/browser/registry.d.ts +16 -3
  138. package/dist/types/tools/browser/render.d.ts +2 -0
  139. package/dist/types/tools/browser/tab-protocol.d.ts +2 -0
  140. package/dist/types/tools/browser/tab-supervisor.d.ts +16 -4
  141. package/dist/types/tools/browser.d.ts +3 -1
  142. package/dist/types/tools/checkpoint.d.ts +1 -1
  143. package/dist/types/tools/debug.d.ts +1 -1
  144. package/dist/types/tools/eval-render.d.ts +1 -1
  145. package/dist/types/tools/eval.d.ts +1 -1
  146. package/dist/types/tools/find.d.ts +1 -1
  147. package/dist/types/tools/gh.d.ts +1 -1
  148. package/dist/types/tools/image-gen.d.ts +1 -1
  149. package/dist/types/tools/index.d.ts +14 -2
  150. package/dist/types/tools/inspect-image.d.ts +1 -1
  151. package/dist/types/tools/irc.d.ts +2 -1
  152. package/dist/types/tools/job.d.ts +1 -1
  153. package/dist/types/tools/learn.d.ts +51 -0
  154. package/dist/types/tools/manage-skill.d.ts +40 -0
  155. package/dist/types/tools/memory-edit.d.ts +1 -1
  156. package/dist/types/tools/memory-recall.d.ts +1 -1
  157. package/dist/types/tools/memory-reflect.d.ts +1 -1
  158. package/dist/types/tools/memory-retain.d.ts +1 -1
  159. package/dist/types/tools/plan-mode-guard.d.ts +10 -0
  160. package/dist/types/tools/read.d.ts +1 -1
  161. package/dist/types/tools/render-mermaid.d.ts +1 -1
  162. package/dist/types/tools/renderers.d.ts +7 -11
  163. package/dist/types/tools/resolve.d.ts +1 -1
  164. package/dist/types/tools/review.d.ts +1 -1
  165. package/dist/types/tools/search-tool-bm25.d.ts +1 -1
  166. package/dist/types/tools/search.d.ts +1 -1
  167. package/dist/types/tools/ssh.d.ts +2 -2
  168. package/dist/types/tools/todo.d.ts +2 -2
  169. package/dist/types/tools/tts.d.ts +26 -1
  170. package/dist/types/tools/write.d.ts +2 -2
  171. package/dist/types/tts/downloader.d.ts +20 -0
  172. package/dist/types/tts/index.d.ts +8 -0
  173. package/dist/types/tts/models.d.ts +82 -0
  174. package/dist/types/tts/player.d.ts +32 -0
  175. package/dist/types/tts/runtime.d.ts +6 -0
  176. package/dist/types/tts/streaming-player.d.ts +41 -0
  177. package/dist/types/tts/tts-client.d.ts +93 -0
  178. package/dist/types/tts/tts-protocol.d.ts +95 -0
  179. package/dist/types/tts/tts-worker.d.ts +2 -0
  180. package/dist/types/tts/vocalizer.d.ts +41 -0
  181. package/dist/types/tts/wav.d.ts +8 -0
  182. package/dist/types/utils/clipboard.d.ts +4 -3
  183. package/dist/types/utils/image-loading.d.ts +18 -1
  184. package/dist/types/utils/thinking-display.d.ts +17 -0
  185. package/dist/types/utils/tool-choice.d.ts +8 -0
  186. package/dist/types/utils/tools-manager.d.ts +2 -1
  187. package/dist/types/utils/tools-manager.test.d.ts +1 -0
  188. package/dist/types/web/scrapers/github.d.ts +1 -1
  189. package/dist/types/web/search/index.d.ts +1 -1
  190. package/package.json +17 -16
  191. package/src/async/job-manager.ts +49 -0
  192. package/src/autolearn/controller.ts +139 -0
  193. package/src/autolearn/managed-skills.ts +257 -0
  194. package/src/autoresearch/state.ts +1 -1
  195. package/src/autoresearch/storage.ts +2 -1
  196. package/src/autoresearch/tools/init-experiment.ts +1 -1
  197. package/src/autoresearch/tools/log-experiment.ts +1 -1
  198. package/src/autoresearch/tools/run-experiment.ts +1 -1
  199. package/src/autoresearch/tools/update-notes.ts +1 -1
  200. package/src/autoresearch/types.ts +1 -1
  201. package/src/cli/args.ts +56 -10
  202. package/src/cli/auth-gateway-cli.ts +1 -1
  203. package/src/cli/bench-cli.ts +1 -1
  204. package/src/cli/dry-balance-cli.ts +1 -1
  205. package/src/cli/models-cli.ts +427 -0
  206. package/src/cli/session-picker.ts +2 -1
  207. package/src/cli/setup-cli.ts +148 -47
  208. package/src/cli/setup-model-picker.ts +43 -0
  209. package/src/cli-commands.ts +3 -0
  210. package/src/cli.ts +45 -13
  211. package/src/collab/host.ts +10 -13
  212. package/src/collab/protocol.ts +1 -1
  213. package/src/commands/launch.ts +0 -3
  214. package/src/commands/models.ts +61 -0
  215. package/src/commands/say.ts +102 -0
  216. package/src/commands/setup.ts +1 -1
  217. package/src/commands/token.ts +89 -0
  218. package/src/commit/agentic/tools/analyze-file.ts +4 -1
  219. package/src/commit/agentic/tools/git-file-diff.ts +1 -1
  220. package/src/commit/agentic/tools/git-hunk.ts +1 -1
  221. package/src/commit/agentic/tools/git-overview.ts +1 -1
  222. package/src/commit/agentic/tools/propose-changelog.ts +1 -1
  223. package/src/commit/agentic/tools/propose-commit.ts +1 -1
  224. package/src/commit/agentic/tools/recent-commits.ts +1 -1
  225. package/src/commit/agentic/tools/schemas.ts +1 -1
  226. package/src/commit/agentic/tools/split-commit.ts +1 -1
  227. package/src/commit/analysis/summary.ts +1 -1
  228. package/src/commit/changelog/generate.ts +1 -1
  229. package/src/commit/shared-llm.ts +1 -1
  230. package/src/config/keybindings.ts +2 -2
  231. package/src/config/model-discovery.ts +11 -5
  232. package/src/config/model-registry.ts +79 -21
  233. package/src/config/model-resolver.ts +2 -2
  234. package/src/config/models-config-schema.ts +5 -2
  235. package/src/config/models-config.ts +2 -1
  236. package/src/config/settings-schema.ts +266 -32
  237. package/src/config/settings.ts +10 -0
  238. package/src/discovery/builtin.ts +23 -1
  239. package/src/discovery/claude-plugins.ts +44 -5
  240. package/src/discovery/helpers.ts +41 -1
  241. package/src/edit/hashline/params.ts +1 -1
  242. package/src/edit/modes/apply-patch.ts +1 -1
  243. package/src/edit/modes/patch.ts +1 -1
  244. package/src/edit/modes/replace.ts +1 -1
  245. package/src/eval/__tests__/budget-bridge.test.ts +1 -1
  246. package/src/eval/agent-bridge.ts +1 -1
  247. package/src/eval/completion-bridge.ts +1 -1
  248. package/src/eval/js/shared/prelude.txt +69 -17
  249. package/src/export/html/index.ts +3 -6
  250. package/src/export/html/template.js +24 -2
  251. package/src/export/html/tool-views.generated.js +2 -2
  252. package/src/extensibility/custom-commands/loader.ts +1 -1
  253. package/src/extensibility/custom-commands/types.ts +2 -2
  254. package/src/extensibility/custom-tools/loader.ts +1 -1
  255. package/src/extensibility/custom-tools/types.ts +2 -2
  256. package/src/extensibility/extensions/loader.ts +2 -2
  257. package/src/extensibility/extensions/model-api.ts +41 -0
  258. package/src/extensibility/extensions/runner.ts +4 -0
  259. package/src/extensibility/extensions/types.ts +54 -3
  260. package/src/extensibility/extensions/wrapper.ts +41 -5
  261. package/src/extensibility/hooks/index.ts +2 -1
  262. package/src/extensibility/hooks/loader.ts +1 -1
  263. package/src/extensibility/hooks/types.ts +2 -2
  264. package/src/extensibility/plugins/legacy-pi-compat.ts +43 -13
  265. package/src/extensibility/plugins/loader.ts +30 -19
  266. package/src/extensibility/plugins/manager.ts +221 -90
  267. package/src/extensibility/shared-events.ts +1 -1
  268. package/src/extensibility/skills.ts +101 -5
  269. package/src/goals/guided-setup.ts +133 -0
  270. package/src/goals/state.ts +1 -1
  271. package/src/goals/tools/goal-tool.ts +1 -1
  272. package/src/hindsight/transcript.ts +1 -1
  273. package/src/index.ts +5 -0
  274. package/src/internal-urls/docs-index.generated.ts +13 -10
  275. package/src/internal-urls/history-protocol.ts +1 -1
  276. package/src/internal-urls/local-protocol.ts +29 -7
  277. package/src/lsp/types.ts +1 -1
  278. package/src/main.ts +27 -32
  279. package/src/mcp/config-writer.ts +7 -3
  280. package/src/mcp/manager.ts +11 -0
  281. package/src/mcp/startup-events.ts +21 -0
  282. package/src/mcp/transports/stdio.ts +2 -1
  283. package/src/memories/index.ts +149 -12
  284. package/src/memories/storage.ts +2 -1
  285. package/src/memory-backend/local-backend.ts +11 -5
  286. package/src/mnemopi/backend.ts +1 -0
  287. package/src/mnemopi/config.ts +112 -12
  288. package/src/modes/acp/acp-agent.ts +8 -53
  289. package/src/modes/acp/acp-event-mapper.ts +5 -1
  290. package/src/modes/components/agent-hub.ts +51 -5
  291. package/src/modes/components/assistant-message.ts +12 -44
  292. package/src/modes/components/compaction-summary-message.ts +125 -26
  293. package/src/modes/components/custom-editor.test.ts +96 -0
  294. package/src/modes/components/custom-editor.ts +164 -8
  295. package/src/modes/components/index.ts +1 -0
  296. package/src/modes/components/logout-account-selector.ts +130 -0
  297. package/src/modes/components/mcp-add-wizard.ts +1 -1
  298. package/src/modes/components/model-selector.ts +2 -2
  299. package/src/modes/components/session-selector.ts +1 -1
  300. package/src/modes/components/settings-defs.ts +7 -0
  301. package/src/modes/components/status-line/component.ts +54 -157
  302. package/src/modes/components/status-line/segments.ts +1 -1
  303. package/src/modes/components/status-line/types.ts +2 -1
  304. package/src/modes/components/tool-execution.ts +82 -43
  305. package/src/modes/components/transcript-container.ts +70 -1
  306. package/src/modes/components/tree-selector.ts +1 -1
  307. package/src/modes/components/usage-row.ts +18 -0
  308. package/src/modes/components/user-message.ts +4 -2
  309. package/src/modes/controllers/command-controller.ts +14 -16
  310. package/src/modes/controllers/event-controller.ts +101 -73
  311. package/src/modes/controllers/extension-ui-controller.ts +6 -0
  312. package/src/modes/controllers/input-controller.ts +311 -57
  313. package/src/modes/controllers/mcp-command-controller.ts +44 -3
  314. package/src/modes/controllers/selector-controller.ts +68 -12
  315. package/src/modes/controllers/streaming-reveal.ts +4 -3
  316. package/src/modes/gradient-highlight.ts +21 -9
  317. package/src/modes/image-references.ts +20 -0
  318. package/src/modes/interactive-mode.ts +288 -48
  319. package/src/modes/magic-keywords.ts +27 -5
  320. package/src/modes/rpc/rpc-mode.ts +146 -14
  321. package/src/modes/rpc/rpc-subagents.ts +2 -2
  322. package/src/modes/rpc/rpc-types.ts +8 -2
  323. package/src/modes/runtime-init.ts +28 -3
  324. package/src/modes/theme/theme.ts +99 -51
  325. package/src/modes/types.ts +6 -7
  326. package/src/modes/utils/hotkeys-markdown.ts +1 -1
  327. package/src/modes/utils/ui-helpers.ts +36 -7
  328. package/src/priority.json +5 -1
  329. package/src/prompts/agents/task.md +1 -0
  330. package/src/prompts/goals/guided-goal-interview.md +8 -0
  331. package/src/prompts/goals/guided-goal-system.md +12 -0
  332. package/src/prompts/memories/read-path.md +6 -0
  333. package/src/prompts/system/autolearn-guidance-learn.md +1 -0
  334. package/src/prompts/system/autolearn-guidance.md +7 -0
  335. package/src/prompts/system/autolearn-nudge.md +3 -0
  336. package/src/prompts/system/eager-task.md +7 -0
  337. package/src/prompts/system/eager-todo.md +11 -6
  338. package/src/prompts/system/empty-stop-retry.md +4 -6
  339. package/src/prompts/system/subagent-system-prompt.md +4 -0
  340. package/src/prompts/system/system-prompt.md +10 -5
  341. package/src/prompts/system/title-marker-instruction.md +1 -0
  342. package/src/prompts/system/title-system-marker.md +16 -0
  343. package/src/prompts/tools/job.md +1 -0
  344. package/src/prompts/tools/learn.md +7 -0
  345. package/src/prompts/tools/manage-skill.md +9 -0
  346. package/src/prompts/tools/task.md +3 -0
  347. package/src/registry/agent-registry.ts +30 -0
  348. package/src/sdk.ts +103 -43
  349. package/src/secrets/obfuscator.ts +1 -1
  350. package/src/session/agent-session.ts +331 -318
  351. package/src/session/agent-storage.ts +18 -9
  352. package/src/session/history-storage.ts +3 -2
  353. package/src/session/indexed-session-storage.ts +7 -10
  354. package/src/session/messages.ts +9 -11
  355. package/src/session/session-context.ts +352 -0
  356. package/src/session/session-dump-format.ts +4 -2
  357. package/src/session/session-entries.ts +194 -0
  358. package/src/session/session-listing.ts +588 -0
  359. package/src/session/session-loader.ts +106 -0
  360. package/src/session/session-manager.ts +968 -3064
  361. package/src/session/session-migrations.ts +78 -0
  362. package/src/session/session-paths.ts +193 -0
  363. package/src/session/session-persistence.ts +131 -0
  364. package/src/session/session-storage.ts +91 -30
  365. package/src/session/snapcompact-inline.ts +21 -1
  366. package/src/session/snapcompact-savings-journal.ts +113 -0
  367. package/src/session/tool-choice-queue.ts +23 -11
  368. package/src/slash-commands/builtin-registry.ts +40 -4
  369. package/src/slash-commands/helpers/logout.ts +88 -0
  370. package/src/stt/asr-client.ts +520 -0
  371. package/src/stt/asr-protocol.ts +65 -0
  372. package/src/stt/asr-worker.ts +790 -0
  373. package/src/stt/downloader.ts +107 -47
  374. package/src/stt/endpointer.ts +259 -0
  375. package/src/stt/index.ts +5 -1
  376. package/src/stt/models.ts +150 -0
  377. package/src/stt/recorder.ts +247 -60
  378. package/src/stt/stt-controller.ts +201 -22
  379. package/src/stt/transcriber.ts +37 -68
  380. package/src/stt/wav.ts +173 -0
  381. package/src/system-prompt.ts +8 -0
  382. package/src/task/agents.ts +1 -2
  383. package/src/task/executor.ts +49 -15
  384. package/src/task/index.ts +60 -6
  385. package/src/task/render.ts +83 -8
  386. package/src/task/types.ts +54 -1
  387. package/src/tools/ask.ts +9 -1
  388. package/src/tools/ast-edit.ts +1 -1
  389. package/src/tools/ast-grep.ts +1 -1
  390. package/src/tools/bash.ts +5 -4
  391. package/src/tools/browser/cmux/cmux-tab.ts +1264 -0
  392. package/src/tools/browser/cmux/rpc.ts +156 -0
  393. package/src/tools/browser/cmux/socket-client.ts +309 -0
  394. package/src/tools/browser/registry.ts +37 -3
  395. package/src/tools/browser/render.ts +6 -1
  396. package/src/tools/browser/tab-protocol.ts +2 -0
  397. package/src/tools/browser/tab-supervisor.ts +189 -18
  398. package/src/tools/browser/tab-worker.ts +1 -1
  399. package/src/tools/browser.ts +16 -1
  400. package/src/tools/checkpoint.ts +1 -1
  401. package/src/tools/debug.ts +1 -1
  402. package/src/tools/eval-render.ts +4 -3
  403. package/src/tools/eval.ts +11 -6
  404. package/src/tools/fetch.ts +13 -2
  405. package/src/tools/find.ts +1 -1
  406. package/src/tools/gh.ts +1 -1
  407. package/src/tools/github-cache.ts +2 -1
  408. package/src/tools/image-gen.ts +1 -1
  409. package/src/tools/index.ts +43 -5
  410. package/src/tools/inspect-image.ts +3 -1
  411. package/src/tools/irc.ts +11 -3
  412. package/src/tools/job.ts +15 -3
  413. package/src/tools/learn.ts +144 -0
  414. package/src/tools/manage-skill.ts +104 -0
  415. package/src/tools/memory-edit.ts +1 -1
  416. package/src/tools/memory-recall.ts +1 -1
  417. package/src/tools/memory-reflect.ts +1 -1
  418. package/src/tools/memory-retain.ts +1 -1
  419. package/src/tools/plan-mode-guard.ts +53 -19
  420. package/src/tools/read.ts +8 -2
  421. package/src/tools/render-mermaid.ts +1 -1
  422. package/src/tools/renderers.ts +7 -11
  423. package/src/tools/report-tool-issue.ts +3 -2
  424. package/src/tools/resolve.ts +1 -1
  425. package/src/tools/review.ts +1 -1
  426. package/src/tools/search-tool-bm25.ts +1 -1
  427. package/src/tools/search.ts +1 -1
  428. package/src/tools/ssh.ts +5 -4
  429. package/src/tools/todo.ts +2 -2
  430. package/src/tools/tts.ts +204 -93
  431. package/src/tools/write.ts +19 -3
  432. package/src/tts/downloader.ts +64 -0
  433. package/src/tts/index.ts +8 -0
  434. package/src/tts/models.ts +137 -0
  435. package/src/tts/player.ts +137 -0
  436. package/src/tts/runtime.ts +21 -0
  437. package/src/tts/streaming-player.ts +266 -0
  438. package/src/tts/tts-client.ts +647 -0
  439. package/src/tts/tts-protocol.ts +60 -0
  440. package/src/tts/tts-worker.ts +497 -0
  441. package/src/tts/vocalizer.ts +162 -0
  442. package/src/tts/wav.ts +58 -0
  443. package/src/utils/clipboard.ts +35 -18
  444. package/src/utils/image-loading.ts +35 -4
  445. package/src/utils/thinking-display.ts +37 -0
  446. package/src/utils/title-generator.ts +48 -5
  447. package/src/utils/tool-choice.ts +16 -0
  448. package/src/utils/tools-manager.test.ts +25 -0
  449. package/src/utils/tools-manager.ts +19 -1
  450. package/src/web/scrapers/github.ts +96 -0
  451. package/src/web/search/index.ts +14 -1
  452. package/src/web/search/providers/searxng.ts +13 -1
  453. package/dist/types/cli/list-models.d.ts +0 -30
  454. package/dist/types/stt/setup.d.ts +0 -18
  455. package/src/cli/list-models.ts +0 -194
  456. package/src/stt/setup.ts +0 -52
  457. package/src/stt/transcribe.py +0 -70
@@ -0,0 +1,82 @@
1
+ import type { TinyModelDtype } from "../tiny/dtype";
2
+ /**
3
+ * Voice exposed by a local TTS model. Kokoro ships a fixed catalog of named
4
+ * voices; a voice is just a stable id (e.g. `af_heart`) plus a display label.
5
+ * Selection is purely on-device — generating with a different voice needs no
6
+ * extra network fetch once the model weights are cached.
7
+ */
8
+ export interface TtsLocalVoiceSpec {
9
+ id: string;
10
+ label: string;
11
+ }
12
+ /**
13
+ * A local (on-device, ONNX) text-to-speech model the worker can load. `repo` is
14
+ * the Hugging Face model id loaded through `kokoro-js`
15
+ * (`KokoroTTS.from_pretrained`), which runs on the same `@huggingface/transformers`
16
+ * + `onnxruntime` runtime as the rest of the tiny-model stack and bundles the
17
+ * misaki/espeak phonemizer Kokoro needs. `dtype` is the default ONNX precision
18
+ * (overridable via `providers.tinyModelDtype`/`PI_TINY_DTYPE`).
19
+ */
20
+ export interface TtsLocalModelSpec {
21
+ key: string;
22
+ repo: string;
23
+ dtype: TinyModelDtype;
24
+ /** PCM sample rate the model emits; fallback only — the worker uses the value RawAudio reports. */
25
+ sampleRate: number;
26
+ label: string;
27
+ description: string;
28
+ /** First entry is the model's default voice. */
29
+ voices: readonly TtsLocalVoiceSpec[];
30
+ }
31
+ /**
32
+ * Curated Kokoro-82M voice catalog. Kokoro ships ~28 voices; we surface the
33
+ * higher-graded ones across American/British × female/male so the picker stays
34
+ * useful without listing every D/F-grade sample. `af_heart` (grade A) leads and
35
+ * is the default voice. Grades are Kokoro's own `overallGrade` ratings.
36
+ */
37
+ export declare const KOKORO_VOICES: readonly TtsLocalVoiceSpec[];
38
+ /** Default voice within the default model — Kokoro's flagship grade-A voice. */
39
+ export declare const DEFAULT_TTS_VOICE = "af_heart";
40
+ /** Default local TTS model used when `tts.localModel` is unset. */
41
+ export declare const DEFAULT_TTS_LOCAL_MODEL_KEY = "kokoro";
42
+ /**
43
+ * Local TTS model registry. Kokoro-82M is the on-device SoTA tiny TTS (tops the
44
+ * TTS Arena leaderboard); the `onnx-community` ONNX export runs through
45
+ * `kokoro-js` on the shared transformers.js/onnxruntime worker. q8 keeps the
46
+ * weights ~100 MB and CPU inference fast while preserving quality. One model
47
+ * spans every voice/accent — language selection is a voice choice, not a
48
+ * separate download.
49
+ */
50
+ export declare const TTS_LOCAL_MODELS: readonly [{
51
+ readonly key: "kokoro";
52
+ readonly repo: "onnx-community/Kokoro-82M-v1.0-ONNX";
53
+ readonly dtype: "q8";
54
+ readonly sampleRate: 24000;
55
+ readonly label: "Kokoro-82M";
56
+ readonly description: "Kokoro-82M neural TTS — SoTA on-device quality, multi-voice, fully local";
57
+ readonly voices: readonly TtsLocalVoiceSpec[];
58
+ }];
59
+ export type TtsLocalModelKey = (typeof TTS_LOCAL_MODELS)[number]["key"];
60
+ export declare const TTS_LOCAL_MODEL_VALUES: readonly ["kokoro"];
61
+ export declare const TTS_LOCAL_MODEL_OPTIONS: readonly [{
62
+ readonly value: "kokoro";
63
+ readonly label: "Kokoro-82M";
64
+ readonly description: "Kokoro-82M neural TTS — SoTA on-device quality, multi-voice, fully local";
65
+ }];
66
+ /** Voice options for the `tts.localVoice` setting picker (default model's catalog). */
67
+ export declare const TTS_LOCAL_VOICE_OPTIONS: ReadonlyArray<{
68
+ value: string;
69
+ label: string;
70
+ }>;
71
+ /** Accepted `tts.localVoice` values (default model's catalog) for schema validation. */
72
+ export declare const TTS_LOCAL_VOICE_VALUES: readonly string[];
73
+ export declare function getTtsLocalModelSpec(key: string): TtsLocalModelSpec | undefined;
74
+ export declare function isTtsLocalModelKey(value: string): value is TtsLocalModelKey;
75
+ /** Resolve a model key (or the default) to its Hugging Face repo id. */
76
+ export declare function resolveTtsRepo(modelKey: string | undefined): string;
77
+ /**
78
+ * Resolve a requested voice id to a concrete voice the model supports, falling
79
+ * back to the model's default voice (first entry) when the id is unknown or the
80
+ * legacy `"default"` sentinel. The returned id is always a valid Kokoro voice.
81
+ */
82
+ export declare function resolveTtsVoice(modelKey: string | undefined, voice: string | undefined): string;
@@ -0,0 +1,32 @@
1
+ export interface PlayerCommand {
2
+ cmd: string;
3
+ args: string[];
4
+ }
5
+ /** Injection seam for {@link playerCommandsFor} — defaults to real PATH/tools lookups. */
6
+ export interface PlayerLookup {
7
+ which?: (bin: string) => string | null;
8
+ ffmpeg?: () => string | null;
9
+ }
10
+ /**
11
+ * Build the ordered list of playback commands to try for `filePath` on the
12
+ * given platform. Pure + injectable so the selection logic is testable without
13
+ * spawning anything.
14
+ *
15
+ * - darwin: `afplay` (always present on macOS).
16
+ * - win32: PowerShell `Media.SoundPlayer.PlaySync()` (no extra deps).
17
+ * - linux/other POSIX: `paplay` (PulseAudio) → `aplay` (ALSA) → the bundled
18
+ * static `ffmpeg` (`-f pulse` then `-f alsa`). Empty result means nothing is
19
+ * available and the caller should surface an install hint.
20
+ */
21
+ export declare function playerCommandsFor(platform: NodeJS.Platform, filePath: string, lookup?: PlayerLookup): PlayerCommand[];
22
+ export interface PlayAudioOptions {
23
+ signal?: AbortSignal;
24
+ }
25
+ /**
26
+ * Play `filePath` through the speakers, trying each candidate command in order
27
+ * and returning on the first clean exit. Throws an actionable Error if no
28
+ * player exists or every candidate fails (with the collected stderr).
29
+ */
30
+ export declare function playAudioFile(filePath: string, options?: PlayAudioOptions): Promise<void>;
31
+ /** Best-effort temp-file cleanup used by callers after playback. */
32
+ export declare function removeTempFile(filePath: string): Promise<void>;
@@ -0,0 +1,6 @@
1
+ export declare const KOKORO_PACKAGE = "kokoro-js";
2
+ export declare const KOKORO_VERSION = "1.2.1";
3
+ export declare const ONNXRUNTIME_NODE_PACKAGE = "onnxruntime-node";
4
+ export declare const ONNXRUNTIME_NODE_VERSION = "1.26.0";
5
+ export declare function getTtsRuntimeDir(): string;
6
+ export declare function isTtsRuntimeCached(): Promise<boolean>;
@@ -0,0 +1,41 @@
1
+ import { type PlayerCommand } from "./player";
2
+ /** Output gain applied while ducked (the user is speaking over the assistant). */
3
+ export declare const DUCK_GAIN = 0.25;
4
+ /** Injection seam for {@link streamingPlayerCommandsFor} — defaults to real PATH/tools lookups. */
5
+ export interface StreamingPlayerLookup {
6
+ which?: (bin: string) => string | null;
7
+ ffmpeg?: () => string | null;
8
+ }
9
+ /**
10
+ * Ordered candidate commands for a persistent raw-PCM player on `platform`: each
11
+ * reads 32-bit-float little-endian mono PCM at `sampleRate` from stdin (`pipe:0`)
12
+ * and plays it to the default output device. An empty list means no streaming
13
+ * backend is available and the caller should fall back to per-file playback.
14
+ *
15
+ * - darwin: none; `afplay` is file-only, so macOS uses the interruptible
16
+ * per-file fallback.
17
+ * - linux/other POSIX: `ffmpeg` (`-f pulse` then `-f alsa`) → `paplay`/`aplay`
18
+ * raw fallbacks.
19
+ * - win32: none (PowerShell `SoundPlayer` is file-only).
20
+ */
21
+ export declare function streamingPlayerCommandsFor(platform: NodeJS.Platform, sampleRate: number, lookup?: StreamingPlayerLookup): PlayerCommand[];
22
+ /**
23
+ * Single-session gapless player. Lifecycle: {@link start} once, {@link write}
24
+ * chunks in order, then {@link end} to drain or {@link stop} to abort. Not
25
+ * reusable after stop/end — create a new instance per utterance.
26
+ */
27
+ export declare class StreamingAudioPlayer {
28
+ #private;
29
+ /** Pick a backend and begin draining. Idempotent; the first call's rate wins. */
30
+ start(sampleRate: number): void;
31
+ /** Queue a mono float32 PCM chunk for playback in arrival order. */
32
+ write(pcm: Float32Array): void;
33
+ /** Scale subsequent output (1 = normal, <1 = ducked). Applies within {@link LEAD_SECONDS}. */
34
+ setGain(gain: number): void;
35
+ /** Close the input; resolves once all queued audio has finished playing. */
36
+ end(): Promise<void>;
37
+ /** Stop immediately: kill the player, drop everything still queued. */
38
+ stop(): void;
39
+ }
40
+ /** Factory the vocalizer calls; a function so tests can stub it without spawning a player. */
41
+ export declare function createStreamingPlayer(): StreamingAudioPlayer;
@@ -0,0 +1,93 @@
1
+ import type { Subprocess } from "bun";
2
+ import type { TtsProgressEvent, TtsWorkerInbound, TtsWorkerOutbound } from "./tts-protocol";
3
+ /** Decoded PCM returned by a local synthesis request. */
4
+ export interface TtsAudio {
5
+ pcm: Float32Array;
6
+ sampleRate: number;
7
+ }
8
+ /**
9
+ * Abstraction over the TTS subprocess. The runtime implementation is a Bun child
10
+ * process so `onnxruntime-node`'s NAPI finalizer never runs inside the main agent
11
+ * address space — that destructor segfaults Bun during shutdown (issue #1606).
12
+ */
13
+ interface WorkerHandle {
14
+ send(message: TtsWorkerInbound): void;
15
+ onMessage(handler: (message: TtsWorkerOutbound) => void): () => void;
16
+ onError(handler: (error: Error) => void): () => void;
17
+ /** Re-reference the subprocess so a pending request keeps the parent event loop alive. */
18
+ ref(): void;
19
+ /** Drop the reference once the worker is idle so it never blocks process exit. */
20
+ unref(): void;
21
+ terminate(): Promise<void>;
22
+ }
23
+ export interface TtsSynthesizeOptions {
24
+ voice?: string;
25
+ signal?: AbortSignal;
26
+ }
27
+ export interface TtsDownloadOptions {
28
+ signal?: AbortSignal;
29
+ onProgress?: (event: TtsProgressEvent) => void;
30
+ }
31
+ export interface TtsStreamOptions {
32
+ voice?: string;
33
+ signal?: AbortSignal;
34
+ }
35
+ /** One synthesized sentence of a streaming session, in emission order. */
36
+ export interface TtsAudioChunk {
37
+ index: number;
38
+ text: string;
39
+ pcm: Float32Array;
40
+ sampleRate: number;
41
+ }
42
+ /**
43
+ * A live streaming-synthesis session. Feed text incrementally with {@link push}
44
+ * and close the input with {@link end}; `chunks` yields each synthesized
45
+ * sentence's audio as soon as it is ready, then completes once the worker
46
+ * finishes draining the closed input.
47
+ */
48
+ export interface TtsStreamHandle {
49
+ push(text: string): void;
50
+ end(): void;
51
+ chunks: AsyncIterableIterator<TtsAudioChunk>;
52
+ }
53
+ /**
54
+ * Hidden subcommand on the main CLI that boots the TTS worker in the spawned
55
+ * subprocess. Kept in sync with the dispatch in `cli.ts` (Main-owned).
56
+ */
57
+ export declare const TTS_WORKER_ARG = "__omp_tts_worker";
58
+ interface SpawnedSubprocess {
59
+ proc: Subprocess<"ignore", "ignore", "ignore">;
60
+ inbound: Set<(message: TtsWorkerOutbound) => void>;
61
+ errors: Set<(error: Error) => void>;
62
+ /** Flipped to `true` right before the deliberate SIGKILL so `onExit` can tell it apart from a crash. */
63
+ intentionalExit: {
64
+ value: boolean;
65
+ };
66
+ }
67
+ /**
68
+ * Spawn the TTS worker as a subprocess. Exported for tests and the smoke probe;
69
+ * production callers go through {@link spawnTtsWorker}.
70
+ */
71
+ export declare function createTtsSubprocess(): SpawnedSubprocess;
72
+ export declare class TtsClient {
73
+ #private;
74
+ constructor(spawnWorker?: () => WorkerHandle);
75
+ onProgress(listener: (event: TtsProgressEvent) => void): () => void;
76
+ synthesize(modelKey: string, text: string, options?: TtsSynthesizeOptions): Promise<TtsAudio | null>;
77
+ /**
78
+ * Open a streaming-synthesis session. Text is fed incrementally through the
79
+ * returned handle's `push`/`end`; audio is emitted one synthesized sentence at
80
+ * a time via `chunks`, so playback can begin before the full text is known.
81
+ * Returns an inert handle (immediately-ended `chunks`) for unknown models or
82
+ * an already-aborted signal, and fails the iterator if the worker cannot spawn.
83
+ */
84
+ synthesizeStream(modelKey: string, options?: TtsStreamOptions): TtsStreamHandle;
85
+ downloadModel(modelKey: string, options?: TtsDownloadOptions): Promise<boolean>;
86
+ terminate(): Promise<void>;
87
+ }
88
+ export declare const ttsClient: TtsClient;
89
+ export declare function shutdownTtsClient(): Promise<void>;
90
+ export declare function smokeTestTtsWorker({ timeoutMs, }?: {
91
+ timeoutMs?: number;
92
+ }): Promise<void>;
93
+ export {};
@@ -0,0 +1,95 @@
1
+ import type { TtsLocalModelKey } from "./models";
2
+ export type TtsProgressStatus = "initiate" | "download" | "progress" | "progress_total" | "done" | "ready" | "error";
3
+ export interface TtsProgressFileState {
4
+ loaded: number;
5
+ total: number;
6
+ }
7
+ export interface TtsProgressEvent {
8
+ modelKey: TtsLocalModelKey;
9
+ status: TtsProgressStatus;
10
+ name?: string;
11
+ file?: string;
12
+ progress?: number;
13
+ loaded?: number;
14
+ total?: number;
15
+ files?: Record<string, TtsProgressFileState>;
16
+ task?: string;
17
+ model?: string;
18
+ }
19
+ export type TtsWorkerInbound = {
20
+ type: "ping";
21
+ id: string;
22
+ } | {
23
+ type: "synthesize";
24
+ id: string;
25
+ modelKey: TtsLocalModelKey;
26
+ text: string;
27
+ voice?: string;
28
+ } | {
29
+ type: "download";
30
+ id: string;
31
+ modelKey: TtsLocalModelKey;
32
+ } | {
33
+ type: "stream-start";
34
+ id: string;
35
+ modelKey: TtsLocalModelKey;
36
+ voice?: string;
37
+ } | {
38
+ type: "stream-push";
39
+ id: string;
40
+ text: string;
41
+ } | {
42
+ type: "stream-end";
43
+ id: string;
44
+ } | {
45
+ type: "stream-cancel";
46
+ id: string;
47
+ };
48
+ export type TtsWorkerOutbound = {
49
+ type: "pong";
50
+ id: string;
51
+ } | {
52
+ type: "audio";
53
+ id: string;
54
+ pcm: Float32Array;
55
+ sampleRate: number;
56
+ } | {
57
+ type: "downloaded";
58
+ id: string;
59
+ } | {
60
+ type: "error";
61
+ id: string;
62
+ error: string;
63
+ } | {
64
+ type: "progress";
65
+ id: string;
66
+ event: TtsProgressEvent;
67
+ } | {
68
+ type: "log";
69
+ level: "debug" | "warn" | "error";
70
+ msg: string;
71
+ meta?: Record<string, unknown>;
72
+ } | {
73
+ type: "audio-chunk";
74
+ id: string;
75
+ index: number;
76
+ text: string;
77
+ pcm: Float32Array;
78
+ sampleRate: number;
79
+ } | {
80
+ type: "stream-done";
81
+ id: string;
82
+ };
83
+ /**
84
+ * Wire transport between the parent (`TtsClient`) and the local TTS subprocess.
85
+ * The parent owns the subprocess lifecycle (graceful work, hard SIGKILL on
86
+ * shutdown); the protocol carries no explicit close handshake — once the parent
87
+ * decides to terminate, it signals the OS to reap the child so
88
+ * `onnxruntime-node`'s NAPI finalizer never runs in the main agent address
89
+ * space (it segfaults Bun on shutdown — issue #1606). See `tts-client.ts` for
90
+ * the spawn/kill glue.
91
+ */
92
+ export interface TtsTransport {
93
+ send(message: TtsWorkerOutbound): void;
94
+ onMessage(handler: (message: TtsWorkerInbound) => void): () => void;
95
+ }
@@ -0,0 +1,2 @@
1
+ import type { TtsTransport } from "./tts-protocol";
2
+ export declare function startTtsWorker(transport: TtsTransport): void;
@@ -0,0 +1,41 @@
1
+ export interface VocalizerPlayer {
2
+ start(sampleRate: number): void;
3
+ write(pcm: Float32Array): void;
4
+ setGain(gain: number): void;
5
+ end(): Promise<void>;
6
+ stop(): void;
7
+ }
8
+ export declare class Vocalizer {
9
+ #private;
10
+ constructor(createPlayer?: () => VocalizerPlayer);
11
+ /**
12
+ * Stream a delta of assistant text into the engine. No-op when vocalization
13
+ * is disabled. The engine buffers the running text and emits audio for each
14
+ * complete sentence; the trailing partial is flushed by {@link flush}.
15
+ */
16
+ pushDelta(text: string): void;
17
+ /**
18
+ * Close the current input stream (call at message/turn end). The engine
19
+ * flushes its trailing partial as a final chunk; the player keeps draining
20
+ * queued audio until it completes.
21
+ */
22
+ flush(): void;
23
+ /**
24
+ * Speak a complete piece of text in one shot (ask questions, yield-mode final
25
+ * message): stream it in and immediately close the input. No-op when disabled.
26
+ */
27
+ speak(text: string): void;
28
+ /**
29
+ * Interrupt and drop the current session, killing in-flight playback and
30
+ * synthesis (new turn / user message / Esc interrupt). Audio stops at once.
31
+ */
32
+ clear(): void;
33
+ /** Lower the volume while the user is speaking (push-to-talk), so speech doesn't drown them out. */
34
+ duck(): void;
35
+ /** Restore full volume once the user stops speaking. */
36
+ unduck(): void;
37
+ /** Resolve once the playback chain has drained (tests / shutdown). */
38
+ idle(): Promise<void>;
39
+ }
40
+ /** Process-level vocalizer shared by the event controller and the ask tool. */
41
+ export declare const vocalizer: Vocalizer;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Assemble a mono PCM16 WAV byte buffer from Float32 PCM samples (the shape
3
+ * transformers.js `RawAudio` emits: normalized [-1, 1] amplitudes plus a sample
4
+ * rate). No external encoder is involved — we write a canonical 44-byte RIFF/
5
+ * WAVE header followed by little-endian signed 16-bit samples. Samples are
6
+ * clamped before quantization so out-of-range float values do not wrap.
7
+ */
8
+ export declare function encodeWav(samples: Float32Array, sampleRate: number): Uint8Array;
@@ -13,9 +13,10 @@ export declare function copyToClipboard(text: string): Promise<void>;
13
13
  * Read an image from the system clipboard.
14
14
  *
15
15
  * Returns null on Termux (no image clipboard support) or when no display
16
- * server is available (headless/SSH without forwarding). Under WSL the
17
- * Windows clipboard is reached through `powershell.exe`, since WSLg's
18
- * Wayland clipboard does not carry image payloads through to `arboard`.
16
+ * server is available (headless/SSH without forwarding). Under native Windows
17
+ * and WSL, the Windows clipboard is also reached through `powershell.exe`
18
+ * because terminal clipboard paths can leave image payloads invisible to the
19
+ * native bridge.
19
20
  *
20
21
  * @returns PNG payload or null when no image is available.
21
22
  */
@@ -1,7 +1,20 @@
1
- import type { ImageContent } from "@oh-my-pi/pi-ai";
1
+ import type { ImageContent, Model } from "@oh-my-pi/pi-ai";
2
2
  import { type ImageResizeOptions } from "./image-resize";
3
3
  export declare const MAX_IMAGE_INPUT_BYTES: number;
4
4
  export declare const SUPPORTED_INPUT_IMAGE_MIME_TYPES: Set<string>;
5
+ /**
6
+ * Ollama and its local-backend family decode image input through llama.cpp /
7
+ * `stb_image`, which is compiled without WebP support, so a WebP upload fails
8
+ * with an opaque HTTP 400. Detect those models so the resize pipeline encodes
9
+ * to PNG/JPEG instead — the automatic equivalent of `OMP_NO_WEBP=1`.
10
+ */
11
+ export declare function modelLacksWebpSupport(model: Pick<Model, "provider" | "api"> | undefined): boolean;
12
+ /**
13
+ * `true` when `model` cannot decode WebP, otherwise `undefined` so the
14
+ * `OMP_NO_WEBP` env fallback in {@link resizeImage} still applies. Feed straight
15
+ * into {@link ImageResizeOptions.excludeWebP}.
16
+ */
17
+ export declare function webpExclusionForModel(model: Pick<Model, "provider" | "api"> | undefined): true | undefined;
5
18
  export interface LoadImageInputOptions {
6
19
  path: string;
7
20
  cwd: string;
@@ -9,6 +22,8 @@ export interface LoadImageInputOptions {
9
22
  maxBytes?: number;
10
23
  resolvedPath?: string;
11
24
  detectedMimeType?: string;
25
+ /** Force non-WebP output (e.g. for Ollama). Leave unset to honor `OMP_NO_WEBP`. */
26
+ excludeWebP?: boolean;
12
27
  }
13
28
  export interface LoadedImageInput {
14
29
  resolvedPath: string;
@@ -25,6 +40,8 @@ export declare class ImageInputTooLargeError extends Error {
25
40
  }
26
41
  export declare function ensureSupportedImageInput(image: ImageContent): Promise<ImageContent | null>;
27
42
  export interface NormalizeModelContextImagesOptions {
43
+ /** Model the images are bound for; used to derive encoder constraints (WebP exclusion for Ollama). */
44
+ model?: Model;
28
45
  resize?: ImageResizeOptions;
29
46
  }
30
47
  /**
@@ -0,0 +1,17 @@
1
+ import type { AssistantMessage } from "@oh-my-pi/pi-ai";
2
+ type AssistantContentBlock = AssistantMessage["content"][number];
3
+ type ThinkingBlock = Extract<AssistantContentBlock, {
4
+ type: "thinking";
5
+ }>;
6
+ /**
7
+ * Returns the operator-visible thinking text for a block.
8
+ *
9
+ * Some OpenAI-compatible reasoning gateways require a non-empty
10
+ * `reasoning_content` field on historical assistant tool-call turns even when
11
+ * the model did not emit any reasoning. The provider adapter uses a single dot
12
+ * as the wire-only placeholder those gateways accept; if that value is later
13
+ * replayed or echoed as a thinking block, it should not render as model thought.
14
+ */
15
+ export declare function getVisibleThinkingText(block: ThinkingBlock): string;
16
+ export declare function hasVisibleThinking(block: ThinkingBlock): boolean;
17
+ export {};
@@ -5,3 +5,11 @@ import type { Api, Model, ToolChoice } from "@oh-my-pi/pi-ai";
5
5
  * narrowing their request tool list before transport.
6
6
  */
7
7
  export declare function buildNamedToolChoice(toolName: string, model?: Model<Api>): ToolChoice | undefined;
8
+ /**
9
+ * Whether the given tool choice can be satisfied by the active tool set for the
10
+ * upcoming turn. Non-named choices (`"none"`, `"required"`, etc.) do not name a
11
+ * specific tool and are therefore always active.
12
+ */
13
+ export declare function isToolChoiceActive(toolChoice: ToolChoice | undefined, tools: readonly {
14
+ name: string;
15
+ }[]): boolean;
@@ -1,4 +1,5 @@
1
- export type ToolName = "sd" | "sg" | "yt-dlp" | "trafilatura";
1
+ export declare function ffmpegAssetName(_version: string, plat: string, architecture: string): string | null;
2
+ export type ToolName = "sd" | "sg" | "yt-dlp" | "trafilatura" | "ffmpeg";
2
3
  export declare function getToolPath(tool: ToolName): string | null;
3
4
  type EnsureToolOptions = {
4
5
  signal?: AbortSignal;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,6 +1,6 @@
1
1
  import type { SpecialHandler } from "./types";
2
2
  interface GitHubUrl {
3
- type: "blob" | "tree" | "repo" | "issue" | "issues" | "pull" | "pulls" | "discussion" | "discussions" | "actions-run" | "actions-job" | "other";
3
+ type: "blob" | "tree" | "repo" | "commit" | "issue" | "issues" | "pull" | "pulls" | "discussion" | "discussions" | "actions-run" | "actions-job" | "other";
4
4
  owner: string;
5
5
  repo: string;
6
6
  ref?: string;
@@ -6,7 +6,7 @@
6
6
  */
7
7
  import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
8
8
  import type { AuthStorage } from "@oh-my-pi/pi-ai";
9
- import * as z from "zod/v4";
9
+ import { z } from "zod/v4";
10
10
  import type { CustomTool } from "../../extensibility/custom-tools/types";
11
11
  import type { ToolSession } from "../../tools";
12
12
  import { type SearchRenderDetails } from "./render";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@oh-my-pi/pi-coding-agent",
4
- "version": "15.12.3",
4
+ "version": "15.13.0",
5
5
  "description": "Coding agent CLI with read, bash, edit, write tools and session management",
6
6
  "homepage": "https://omp.sh",
7
7
  "author": "Can Boluk",
@@ -35,7 +35,7 @@
35
35
  "check": "biome check . && bun run check:types",
36
36
  "check:types": "tsgo -p tsconfig.json --noEmit",
37
37
  "lint": "biome lint .",
38
- "test": "bun test --parallel",
38
+ "test": "bun test --parallel=2",
39
39
  "fix": "biome check --write --unsafe . && bun run format-prompts && bun run generate-docs-index",
40
40
  "fmt": "biome format --write . && bun run format-prompts",
41
41
  "format-prompts": "bun scripts/format-prompts.ts",
@@ -44,20 +44,20 @@
44
44
  "bench:guard": "bun scripts/bench-guard.ts"
45
45
  },
46
46
  "dependencies": {
47
- "@agentclientprotocol/sdk": "0.22.1",
47
+ "@agentclientprotocol/sdk": "0.25.0",
48
48
  "@babel/parser": "^7.29.7",
49
49
  "@mozilla/readability": "^0.6.0",
50
- "@oh-my-pi/hashline": "15.12.3",
51
- "@oh-my-pi/omp-stats": "15.12.3",
52
- "@oh-my-pi/pi-agent-core": "15.12.3",
53
- "@oh-my-pi/pi-ai": "15.12.3",
54
- "@oh-my-pi/pi-catalog": "15.12.3",
55
- "@oh-my-pi/pi-mnemopi": "15.12.3",
56
- "@oh-my-pi/pi-natives": "15.12.3",
57
- "@oh-my-pi/pi-tui": "15.12.3",
58
- "@oh-my-pi/pi-utils": "15.12.3",
59
- "@oh-my-pi/pi-wire": "15.12.3",
60
- "@oh-my-pi/snapcompact": "15.12.3",
50
+ "@oh-my-pi/hashline": "15.13.0",
51
+ "@oh-my-pi/omp-stats": "15.13.0",
52
+ "@oh-my-pi/pi-agent-core": "15.13.0",
53
+ "@oh-my-pi/pi-ai": "15.13.0",
54
+ "@oh-my-pi/pi-catalog": "15.13.0",
55
+ "@oh-my-pi/pi-mnemopi": "15.13.0",
56
+ "@oh-my-pi/pi-natives": "15.13.0",
57
+ "@oh-my-pi/pi-tui": "15.13.0",
58
+ "@oh-my-pi/pi-utils": "15.13.0",
59
+ "@oh-my-pi/pi-wire": "15.13.0",
60
+ "@oh-my-pi/snapcompact": "15.13.0",
61
61
  "@opentelemetry/api": "^1.9.1",
62
62
  "@opentelemetry/context-async-hooks": "^2.7.1",
63
63
  "@opentelemetry/exporter-trace-otlp-proto": "^0.218.0",
@@ -77,10 +77,11 @@
77
77
  "puppeteer-core": "^25.1.0",
78
78
  "turndown": "7.2.4",
79
79
  "turndown-plugin-gfm": "1.0.2",
80
- "zod": "4.4.3"
80
+ "zod": "^4"
81
81
  },
82
82
  "optionalDependencies": {
83
- "@huggingface/transformers": "^4.2.0"
83
+ "@huggingface/transformers": "^4.2.0",
84
+ "sherpa-onnx-node": "1.13.2"
84
85
  },
85
86
  "devDependencies": {
86
87
  "@types/bun": "^1.3.14"