@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
@@ -279,7 +279,7 @@ function isBenchFirstTokenEvent(event: AssistantMessageEvent): boolean {
279
279
  }
280
280
 
281
281
  function resolveBenchMaxTokens(model: Model<Api>): number {
282
- return Number.isFinite(model.maxTokens) && model.maxTokens > 0
282
+ return model.maxTokens !== null && Number.isFinite(model.maxTokens) && model.maxTokens > 0
283
283
  ? Math.min(BENCH_MAX_TOKENS, model.maxTokens)
284
284
  : BENCH_MAX_TOKENS;
285
285
  }
@@ -0,0 +1,427 @@
1
+ /**
2
+ * `omp models` — list, search, and refresh available models.
3
+ *
4
+ * Subcommands:
5
+ * - `ls` (default): list every available model with a canonical + provider view.
6
+ * - `find <substring>`: list models whose provider, id, or name contains the substring.
7
+ * - `refresh`: force an online catalog re-fetch (ignoring the model cache TTL),
8
+ * then list. This is the supported replacement for `rm -rf ~/.omp/models.db`
9
+ * when a provider ships a new model that the 24h cache has not picked up yet.
10
+ *
11
+ * `ls`/`find` use the cache when fresh (`online-if-uncached`); only `refresh`
12
+ * forces the network (`online`).
13
+ */
14
+ import type { Api, Effort, Model } from "@oh-my-pi/pi-ai";
15
+ import { getSupportedEfforts } from "@oh-my-pi/pi-catalog/model-thinking";
16
+ import { formatNumber, getProjectDir } from "@oh-my-pi/pi-utils";
17
+ import chalk from "chalk";
18
+ import { ModelRegistry } from "../config/model-registry";
19
+ import { Settings } from "../config/settings";
20
+ import { discoverAndLoadExtensions, loadExtensions } from "../extensibility/extensions";
21
+ import { discoverAuthStorage } from "../sdk";
22
+ import { EventBus } from "../utils/event-bus";
23
+
24
+ export type ModelsAction = "ls" | "find" | "refresh" | "canonical";
25
+
26
+ export interface ModelsCommandArgs {
27
+ action: ModelsAction;
28
+ /** Search substring for `find`, or optional filter for `ls`. */
29
+ pattern?: string;
30
+ flags: {
31
+ json?: boolean;
32
+ /** CLI `-e <path>` extension paths to load before listing (issue #905). */
33
+ extensions?: string[];
34
+ /** Skip extension discovery; only load explicit `extensions`. */
35
+ noExtensions?: boolean;
36
+ /** Extra `config.yml` overlays to apply for this invocation. */
37
+ config?: string[];
38
+ };
39
+ }
40
+
41
+ /**
42
+ * Known action keywords. Any other first token (e.g. `openai-codex`) is treated
43
+ * as a provider/substring filter for the default `ls` view, so every provider
44
+ * name doubles as an `omp models <provider>` shortcut.
45
+ */
46
+ const KNOWN_ACTIONS: Record<string, ModelsAction> = {
47
+ ls: "ls",
48
+ list: "ls",
49
+ find: "find",
50
+ refresh: "refresh",
51
+ canonical: "canonical",
52
+ };
53
+
54
+ /** Resolve the two positional args into an action + filter (provider names fall through to `ls`). */
55
+ export function resolveModelsArgs(
56
+ first: string | undefined,
57
+ second: string | undefined,
58
+ ): { action: ModelsAction; pattern: string | undefined } {
59
+ const known = first === undefined ? undefined : KNOWN_ACTIONS[first];
60
+ if (known) {
61
+ return { action: known, pattern: second };
62
+ }
63
+ return { action: "ls", pattern: first };
64
+ }
65
+
66
+ interface ModelJson {
67
+ provider: string;
68
+ id: string;
69
+ selector: string;
70
+ name: string;
71
+ contextWindow: number | null;
72
+ maxTokens: number | null;
73
+ reasoning: boolean;
74
+ /** Supported thinking efforts when the model thinks, otherwise null. */
75
+ thinking: readonly Effort[] | null;
76
+ input: ("text" | "image")[];
77
+ cost: Model<Api>["cost"];
78
+ }
79
+
80
+ interface CanonicalJson {
81
+ id: string;
82
+ selected: string;
83
+ variants: number;
84
+ contextWindow: number | null;
85
+ maxTokens: number | null;
86
+ }
87
+
88
+ interface ModelsJson {
89
+ models: ModelJson[];
90
+ }
91
+
92
+ interface CanonicalModelsJson {
93
+ canonical: CanonicalJson[];
94
+ }
95
+
96
+ function writeLine(line = ""): void {
97
+ process.stdout.write(`${line}\n`);
98
+ }
99
+
100
+ function formatLimit(n: number | null): string {
101
+ return n === null ? "-" : formatNumber(n);
102
+ }
103
+
104
+ function byProviderThenId(left: Model<Api>, right: Model<Api>): number {
105
+ const providerCmp = left.provider.localeCompare(right.provider);
106
+ if (providerCmp !== 0) return providerCmp;
107
+ return left.id.localeCompare(right.id);
108
+ }
109
+
110
+ function toModelJson(model: Model<Api>): ModelJson {
111
+ return {
112
+ provider: model.provider,
113
+ id: model.id,
114
+ selector: `${model.provider}/${model.id}`,
115
+ name: model.name,
116
+ contextWindow: model.contextWindow,
117
+ maxTokens: model.maxTokens,
118
+ reasoning: model.reasoning,
119
+ thinking: model.thinking ? getSupportedEfforts(model) : null,
120
+ input: model.input,
121
+ cost: model.cost,
122
+ };
123
+ }
124
+
125
+ type ColumnAlign = "left" | "right";
126
+
127
+ interface BoxColumn {
128
+ header: string;
129
+ align?: ColumnAlign;
130
+ }
131
+
132
+ /** Right- or left-pad a plain (ANSI-free) cell to `width` display columns. */
133
+ function padCell(text: string, width: number, align: ColumnAlign = "left"): string {
134
+ const space = width - Bun.stringWidth(text);
135
+ if (space <= 0) return text;
136
+ const fill = " ".repeat(space);
137
+ return align === "right" ? fill + text : text + fill;
138
+ }
139
+
140
+ /**
141
+ * Render `rows` as a box-drawing table. Cells must be plain text (no ANSI); the
142
+ * header row is bolded and the borders dimmed (both no-ops on non-TTY output).
143
+ */
144
+ function boxTable(columns: BoxColumn[], rows: string[][]): string[] {
145
+ const widths = columns.map((column, index) =>
146
+ Math.max(Bun.stringWidth(column.header), ...rows.map(row => Bun.stringWidth(row[index] ?? ""))),
147
+ );
148
+ const bar = chalk.dim("│");
149
+ const segments = widths.map(width => "─".repeat(width + 2));
150
+ const renderRow = (cells: string[], bold: boolean): string => {
151
+ const padded = columns.map((column, index) => {
152
+ const cell = padCell(cells[index] ?? "", widths[index]!, column.align);
153
+ return bold ? chalk.bold(cell) : cell;
154
+ });
155
+ return `${bar} ${padded.join(` ${bar} `)} ${bar}`;
156
+ };
157
+ const lines = [chalk.dim(`┌${segments.join("┬")}┐`)];
158
+ lines.push(
159
+ renderRow(
160
+ columns.map(column => column.header),
161
+ true,
162
+ ),
163
+ );
164
+ lines.push(chalk.dim(`├${segments.join("┼")}┤`));
165
+ for (const row of rows) {
166
+ lines.push(renderRow(row, false));
167
+ }
168
+ lines.push(chalk.dim(`└${segments.join("┴")}┘`));
169
+ return lines;
170
+ }
171
+
172
+ /** `omp models ls`/`find`: provider-grouped listing (one box table per provider). */
173
+ function renderProviderModels(
174
+ modelRegistry: ModelRegistry,
175
+ action: ModelsAction,
176
+ pattern: string | undefined,
177
+ json: boolean,
178
+ ): void {
179
+ const available = modelRegistry.getAvailable();
180
+ const needle = pattern?.toLowerCase();
181
+ let filtered = available;
182
+
183
+ if (needle) {
184
+ let exactFound = false;
185
+ if (action !== "find") {
186
+ const exact = available.filter(m => m.provider.toLowerCase() === needle);
187
+ if (exact.length > 0) {
188
+ filtered = exact;
189
+ exactFound = true;
190
+ }
191
+ }
192
+ if (!exactFound) {
193
+ filtered = available.filter(
194
+ model =>
195
+ model.id.toLowerCase().includes(needle) ||
196
+ model.provider.toLowerCase().includes(needle) ||
197
+ `${model.provider}/${model.id}`.toLowerCase().includes(needle) ||
198
+ model.name.toLowerCase().includes(needle),
199
+ );
200
+ }
201
+ }
202
+
203
+ if (json) {
204
+ const output: ModelsJson = { models: filtered.slice().sort(byProviderThenId).map(toModelJson) };
205
+ writeLine(JSON.stringify(output));
206
+ return;
207
+ }
208
+
209
+ if (available.length === 0) {
210
+ writeLine("No models available. Set API keys in environment variables.");
211
+ return;
212
+ }
213
+ if (filtered.length === 0) {
214
+ writeLine(`No models matching "${pattern}"`);
215
+ return;
216
+ }
217
+
218
+ // One section per provider: bold heading + a box table of that provider's models.
219
+ const byProvider = new Map<string, Model<Api>[]>();
220
+ for (const model of filtered.slice().sort(byProviderThenId)) {
221
+ let group = byProvider.get(model.provider);
222
+ if (!group) {
223
+ group = [];
224
+ byProvider.set(model.provider, group);
225
+ }
226
+ group.push(model);
227
+ }
228
+
229
+ let firstProvider = true;
230
+ for (const [provider, models] of byProvider) {
231
+ if (!firstProvider) writeLine();
232
+ firstProvider = false;
233
+ writeLine(`${chalk.bold.cyan(provider)} ${chalk.dim(`(${models.length})`)}`);
234
+ const rows = models.map(model => [
235
+ model.id,
236
+ formatLimit(model.contextWindow),
237
+ formatLimit(model.maxTokens),
238
+ model.thinking ? getSupportedEfforts(model).join(",") : model.reasoning ? "yes" : "-",
239
+ model.input.includes("image") ? "yes" : "no",
240
+ ]);
241
+ for (const line of boxTable(
242
+ [
243
+ { header: "model" },
244
+ { header: "context", align: "right" },
245
+ { header: "max-out", align: "right" },
246
+ { header: "thinking" },
247
+ { header: "images" },
248
+ ],
249
+ rows,
250
+ )) {
251
+ writeLine(line);
252
+ }
253
+ }
254
+ }
255
+
256
+ /** `omp models canonical`: the coalesced canonical view (one row per canonical id). */
257
+ function renderCanonicalModels(modelRegistry: ModelRegistry, pattern: string | undefined, json: boolean): void {
258
+ const selections = modelRegistry.getCanonicalModelSelections({ availableOnly: true });
259
+ const needle = pattern?.toLowerCase();
260
+ const filtered = needle
261
+ ? selections.filter(
262
+ ({ record, model }) =>
263
+ record.id.toLowerCase().includes(needle) ||
264
+ `${model.provider}/${model.id}`.toLowerCase().includes(needle),
265
+ )
266
+ : selections;
267
+
268
+ if (json) {
269
+ const output: CanonicalModelsJson = {
270
+ canonical: filtered
271
+ .map(({ record, model }) => ({
272
+ id: record.id,
273
+ selected: `${model.provider}/${model.id}`,
274
+ variants: record.variants.length,
275
+ contextWindow: model.contextWindow,
276
+ maxTokens: model.maxTokens,
277
+ }))
278
+ .sort((left, right) => left.id.localeCompare(right.id)),
279
+ };
280
+ writeLine(JSON.stringify(output));
281
+ return;
282
+ }
283
+
284
+ if (selections.length === 0) {
285
+ writeLine("No models available. Set API keys in environment variables.");
286
+ return;
287
+ }
288
+ if (filtered.length === 0) {
289
+ writeLine(`No canonical models matching "${pattern}"`);
290
+ return;
291
+ }
292
+
293
+ const rows = filtered
294
+ .slice()
295
+ .sort((left, right) => left.record.id.localeCompare(right.record.id))
296
+ .map(({ record, model }) => [
297
+ record.id,
298
+ `${model.provider}/${model.id}`,
299
+ String(record.variants.length),
300
+ formatLimit(model.contextWindow),
301
+ formatLimit(model.maxTokens),
302
+ ]);
303
+ for (const line of boxTable(
304
+ [
305
+ { header: "canonical" },
306
+ { header: "selected" },
307
+ { header: "variants", align: "right" },
308
+ { header: "context", align: "right" },
309
+ { header: "max-out", align: "right" },
310
+ ],
311
+ rows,
312
+ )) {
313
+ writeLine(line);
314
+ }
315
+ }
316
+
317
+ /**
318
+ * Options for {@link runModelsListing}: render the catalog from a caller-supplied
319
+ * registry. Loads extensions (CLI `-e` paths and configured `settings.extensions`)
320
+ * and discovers their providers before rendering so extension-contributed models
321
+ * appear (issue #905). The caller is responsible for refreshing built-in providers.
322
+ */
323
+ export interface RunModelsListingOptions {
324
+ modelRegistry: ModelRegistry;
325
+ cwd: string;
326
+ action?: ModelsAction;
327
+ pattern?: string;
328
+ json?: boolean;
329
+ /** CLI-supplied extension paths (e.g. from `-e <path>`). */
330
+ additionalExtensionPaths?: string[];
331
+ /** Extension paths configured under `extensions:` in user settings. */
332
+ settingsExtensions?: string[];
333
+ /** Disabled extension ids from settings (`disabledExtensions`). */
334
+ disabledExtensionIds?: string[];
335
+ /** When true, skip discovery and only load `additionalExtensionPaths`. */
336
+ disableExtensionDiscovery?: boolean;
337
+ }
338
+
339
+ export async function runModelsListing(options: RunModelsListingOptions): Promise<void> {
340
+ const {
341
+ modelRegistry,
342
+ cwd,
343
+ action = "ls",
344
+ pattern,
345
+ json = false,
346
+ additionalExtensionPaths = [],
347
+ settingsExtensions = [],
348
+ disabledExtensionIds = [],
349
+ disableExtensionDiscovery = false,
350
+ } = options;
351
+
352
+ const eventBus = new EventBus();
353
+ const extensionsResult = disableExtensionDiscovery
354
+ ? await loadExtensions(additionalExtensionPaths, cwd, eventBus)
355
+ : await discoverAndLoadExtensions(
356
+ [...additionalExtensionPaths, ...settingsExtensions],
357
+ cwd,
358
+ eventBus,
359
+ disabledExtensionIds,
360
+ );
361
+
362
+ for (const { path: extPath, error } of extensionsResult.errors) {
363
+ process.stderr.write(`Failed to load extension: ${extPath}: ${error}\n`);
364
+ }
365
+
366
+ // Mirror sdk.ts: drain pending provider registrations into the registry.
367
+ const activeSources = extensionsResult.extensions.map(extension => extension.path);
368
+ modelRegistry.syncExtensionSources(activeSources);
369
+ for (const sourceId of new Set(activeSources)) {
370
+ modelRegistry.clearSourceRegistrations(sourceId);
371
+ }
372
+ for (const { name, config, sourceId } of extensionsResult.runtime.pendingProviderRegistrations) {
373
+ modelRegistry.registerProvider(name, config, sourceId);
374
+ }
375
+ extensionsResult.runtime.pendingProviderRegistrations = [];
376
+ // Discover runtime (extension) provider catalogs now that they are registered.
377
+ await modelRegistry.refreshRuntimeProviders(action === "refresh" ? "online" : "online-if-uncached");
378
+
379
+ if (action === "canonical") {
380
+ renderCanonicalModels(modelRegistry, pattern, json);
381
+ } else {
382
+ renderProviderModels(modelRegistry, action, pattern, json);
383
+ }
384
+ }
385
+
386
+ /**
387
+ * Entry point for the standalone `omp models` command: bootstraps auth storage,
388
+ * settings, and the model registry, force/cache-refreshes built-in providers per
389
+ * the chosen action, then delegates to {@link runModelsListing}.
390
+ */
391
+ export async function runModelsCommand(command: ModelsCommandArgs): Promise<void> {
392
+ const { action, pattern } = command;
393
+ const json = command.flags.json ?? false;
394
+
395
+ if (action === "find" && (!pattern || pattern.trim().length === 0)) {
396
+ process.stderr.write("`omp models find` requires a search substring, e.g. `omp models find minimax`\n");
397
+ process.exitCode = 1;
398
+ return;
399
+ }
400
+
401
+ const cwd = getProjectDir();
402
+ const authStorage = await discoverAuthStorage();
403
+ try {
404
+ const settings = await Settings.init({ cwd, configFiles: command.flags.config });
405
+ const modelRegistry = new ModelRegistry(authStorage);
406
+
407
+ if (action === "refresh" && !json && process.stderr.isTTY) {
408
+ process.stderr.write("Refreshing models from all providers…\n");
409
+ }
410
+ await modelRegistry.refresh(action === "refresh" ? "online" : "online-if-uncached");
411
+
412
+ const cliExtensionPaths = command.flags.noExtensions ? [] : (command.flags.extensions ?? []);
413
+ await runModelsListing({
414
+ modelRegistry,
415
+ cwd,
416
+ action,
417
+ pattern,
418
+ json,
419
+ additionalExtensionPaths: cliExtensionPaths,
420
+ settingsExtensions: settings.get("extensions") ?? [],
421
+ disabledExtensionIds: settings.get("disabledExtensions") ?? [],
422
+ disableExtensionDiscovery: Boolean(command.flags.noExtensions),
423
+ });
424
+ } finally {
425
+ authStorage.close();
426
+ }
427
+ }
@@ -2,7 +2,8 @@ import { ProcessTerminal, TUI } from "@oh-my-pi/pi-tui";
2
2
  import { logger } from "@oh-my-pi/pi-utils";
3
3
  import { SessionSelectorComponent } from "../modes/components/session-selector";
4
4
  import { HistoryStorage } from "../session/history-storage";
5
- import { type SessionInfo, SessionManager } from "../session/session-manager";
5
+ import type { SessionInfo } from "../session/session-listing";
6
+ import { SessionManager } from "../session/session-manager";
6
7
  import { FileSessionStorage } from "../session/session-storage";
7
8
 
8
9
  /**