@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
@@ -28,8 +28,10 @@ import {
28
28
  } from "../../modes/theme/theme";
29
29
  import type { InteractiveModeContext } from "../../modes/types";
30
30
  import type { ResetCreditRedeemOutcome } from "../../session/auth-storage";
31
- import { type SessionInfo, SessionManager } from "../../session/session-manager";
31
+ import type { SessionInfo } from "../../session/session-listing";
32
+ import { SessionManager } from "../../session/session-manager";
32
33
  import { FileSessionStorage } from "../../session/session-storage";
34
+ import { type LogoutAccount, toLogoutAccounts } from "../../slash-commands/helpers/logout";
33
35
  import {
34
36
  describeRedeemOutcome,
35
37
  type ResetUsageAccount,
@@ -51,6 +53,7 @@ import { AssistantMessageComponent } from "../components/assistant-message";
51
53
  import { CopySelectorComponent } from "../components/copy-selector";
52
54
  import { ExtensionDashboard } from "../components/extensions";
53
55
  import { HistorySearchComponent } from "../components/history-search";
56
+ import { LogoutAccountSelectorComponent } from "../components/logout-account-selector";
54
57
  import { ModelSelectorComponent } from "../components/model-selector";
55
58
  import { OAuthSelectorComponent } from "../components/oauth-selector";
56
59
  import { PluginSelectorComponent } from "../components/plugin-selector";
@@ -1000,23 +1003,28 @@ export class SelectorController {
1000
1003
  }
1001
1004
  }
1002
1005
 
1003
- async #handleOAuthLogout(providerId: string): Promise<void> {
1006
+ async #handleCredentialLogout(providerId: string, account: LogoutAccount): Promise<void> {
1004
1007
  try {
1005
1008
  const authStorage = this.ctx.session.modelRegistry.authStorage;
1006
- if (!authStorage.has(providerId)) {
1007
- const source = authStorage.describeCredentialSource(providerId, this.ctx.session.sessionId);
1008
- const suffix = source ? ` Current auth comes from ${source}; remove that source to log out.` : "";
1009
- this.ctx.showError(`Logout skipped: no stored credentials for ${providerId}.${suffix}`);
1009
+ const removed = await authStorage.removeCredential(providerId, account.credentialId);
1010
+ if (!removed) {
1011
+ this.ctx.showError(`Logout skipped: ${account.label} is no longer stored for ${providerId}.`);
1010
1012
  return;
1011
1013
  }
1012
1014
 
1013
- await authStorage.logout(providerId);
1014
1015
  await this.ctx.session.modelRegistry.refresh();
1015
1016
  const block = new TranscriptBlock();
1016
1017
  block.addChild(
1017
- new Text(theme.fg("success", `${theme.status.success} Successfully logged out of ${providerId}`), 1, 0),
1018
+ new Text(
1019
+ theme.fg(
1020
+ "success",
1021
+ `${theme.status.success} Successfully logged out ${account.label} from ${providerId}`,
1022
+ ),
1023
+ 1,
1024
+ 0,
1025
+ ),
1018
1026
  );
1019
- block.addChild(new Text(theme.fg("dim", `Credentials removed from ${getAgentDbPath()}`), 1, 0));
1027
+ block.addChild(new Text(theme.fg("dim", `Credential removed from ${getAgentDbPath()}`), 1, 0));
1020
1028
  const remainingSource = authStorage.describeCredentialSource(providerId, this.ctx.session.sessionId);
1021
1029
  if (remainingSource) {
1022
1030
  block.addChild(
@@ -1029,12 +1037,51 @@ export class SelectorController {
1029
1037
  }
1030
1038
  }
1031
1039
 
1040
+ async #showOAuthLogoutAccountSelector(providerId: string): Promise<void> {
1041
+ const authStorage = this.ctx.session.modelRegistry.authStorage;
1042
+ try {
1043
+ await authStorage.reload();
1044
+ } catch (error: unknown) {
1045
+ this.ctx.showError(
1046
+ `Could not load stored credentials: ${error instanceof Error ? error.message : String(error)}`,
1047
+ );
1048
+ return;
1049
+ }
1050
+ const provider = getOAuthProviders().find(candidate => candidate.id === providerId);
1051
+ const accounts = toLogoutAccounts(providerId, authStorage.listStoredCredentials(providerId), {
1052
+ activeIdentity: authStorage.getOAuthAccountIdentity(providerId, this.ctx.session.sessionId),
1053
+ activeApiKey: authStorage.getCredentialOrigin(providerId)?.kind === "api_key",
1054
+ });
1055
+ if (accounts.length === 0) {
1056
+ const source = authStorage.describeCredentialSource(providerId, this.ctx.session.sessionId);
1057
+ const suffix = source ? ` Current auth comes from ${source}; remove that source to log out.` : "";
1058
+ this.ctx.showError(`Logout skipped: no stored credentials for ${providerId}.${suffix}`);
1059
+ return;
1060
+ }
1061
+
1062
+ this.showSelector(done => {
1063
+ const selector = new LogoutAccountSelectorComponent(
1064
+ provider?.name ?? providerId,
1065
+ accounts,
1066
+ account => {
1067
+ done();
1068
+ void this.#handleCredentialLogout(providerId, account);
1069
+ },
1070
+ () => {
1071
+ done();
1072
+ this.ctx.ui.requestRender();
1073
+ },
1074
+ );
1075
+ return { component: selector, focus: selector };
1076
+ });
1077
+ }
1078
+
1032
1079
  async showOAuthSelector(mode: "login" | "logout", providerId?: string): Promise<void> {
1033
1080
  if (providerId) {
1034
1081
  if (mode === "login") {
1035
1082
  await this.#handleOAuthLogin(providerId);
1036
1083
  } else {
1037
- await this.#handleOAuthLogout(providerId);
1084
+ await this.#showOAuthLogoutAccountSelector(providerId);
1038
1085
  }
1039
1086
  return;
1040
1087
  }
@@ -1062,7 +1109,7 @@ export class SelectorController {
1062
1109
  if (mode === "login") {
1063
1110
  await this.#handleOAuthLogin(selectedProviderId);
1064
1111
  } else {
1065
- await this.#handleOAuthLogout(selectedProviderId);
1112
+ await this.#showOAuthLogoutAccountSelector(selectedProviderId);
1066
1113
  }
1067
1114
  },
1068
1115
  () => {
@@ -1156,7 +1203,7 @@ export class SelectorController {
1156
1203
  });
1157
1204
  }
1158
1205
 
1159
- showAgentHub(observers: SessionObserverRegistry): void {
1206
+ showAgentHub(observers: SessionObserverRegistry, options?: { requireContent?: boolean }): void {
1160
1207
  const hubKeys = [
1161
1208
  ...this.ctx.keybindings.getKeys("app.agents.hub"),
1162
1209
  ...this.ctx.keybindings.getKeys("app.session.observe"),
@@ -1188,6 +1235,15 @@ export class SelectorController {
1188
1235
  sessionFile: this.ctx.sessionManager.getSessionFile() ?? null,
1189
1236
  });
1190
1237
 
1238
+ // The double-← gesture passes requireContent so it stays inert when there
1239
+ // are no subagents to show; the explicit hub/observe keys still open the
1240
+ // empty roster. The freshly built hub already ran the persisted-subagent
1241
+ // scan, so its row count is the authoritative "is there anything to show".
1242
+ if (options?.requireContent && hub.isEmpty) {
1243
+ hub.dispose();
1244
+ return;
1245
+ }
1246
+
1191
1247
  overlayHandle = this.ctx.ui.showOverlay(hub, {
1192
1248
  anchor: "bottom-center",
1193
1249
  width: "100%",
@@ -1,6 +1,7 @@
1
1
  import type { AssistantMessage } from "@oh-my-pi/pi-ai";
2
2
  import { getSegmenter } from "@oh-my-pi/pi-tui";
3
3
  import { LRUCache } from "lru-cache/raw";
4
+ import { hasVisibleThinking } from "../../utils/thinking-display";
4
5
  import type { AssistantMessageComponent } from "../components/assistant-message";
5
6
 
6
7
  export const STREAMING_REVEAL_FRAME_MS = 1000 / 30;
@@ -87,7 +88,7 @@ export function visibleUnits(message: AssistantMessage, hideThinking: boolean):
87
88
  for (const block of message.content) {
88
89
  if (block.type === "text") {
89
90
  total += countGraphemes(block.text);
90
- } else if (block.type === "thinking" && !hideThinking) {
91
+ } else if (block.type === "thinking" && !hideThinking && hasVisibleThinking(block)) {
91
92
  total += countGraphemes(block.thinking);
92
93
  }
93
94
  }
@@ -128,7 +129,7 @@ export function buildDisplayMessage(
128
129
  const units = countOf(i, block.text);
129
130
  content.push(revealTextBlock(block, remaining, units));
130
131
  remaining = Math.max(0, remaining - units);
131
- } else if (block.type === "thinking" && !hideThinking) {
132
+ } else if (block.type === "thinking" && !hideThinking && hasVisibleThinking(block)) {
132
133
  const units = countOf(i, block.thinking);
133
134
  content.push(revealThinkingBlock(block, remaining, units));
134
135
  remaining = Math.max(0, remaining - units);
@@ -230,7 +231,7 @@ export class StreamingRevealController {
230
231
  const block = message.content[i]!;
231
232
  if (block.type === "text") {
232
233
  total += this.#unitCounter.count(i, block.text);
233
- } else if (block.type === "thinking" && !this.#hideThinkingBlock) {
234
+ } else if (block.type === "thinking" && !this.#hideThinkingBlock && hasVisibleThinking(block)) {
234
235
  total += this.#unitCounter.count(i, block.thinking);
235
236
  }
236
237
  }
@@ -1,10 +1,15 @@
1
1
  import { maskNonProse } from "./markdown-prose";
2
2
  import { theme } from "./theme/theme";
3
3
 
4
- /** A gradient keyword highlighter. `resetTo` is the SGR foreground sequence
5
- * re-emitted after each painted keyword so surrounding text keeps its color;
6
- * it defaults to a plain foreground reset (editor / default-colored text). */
7
- export type KeywordHighlighter = (text: string, resetTo?: string) => string;
4
+ /** A gradient keyword highlighter.
5
+ *
6
+ * - `resetTo` is the SGR foreground sequence re-emitted after each painted
7
+ * keyword so surrounding text keeps its color; it defaults to a plain
8
+ * foreground reset (editor / default-colored text).
9
+ * - `phase` ∈ [0, 1) rotates the gradient stops cyclically; pass `Date.now()`-
10
+ * derived values to animate a shimmer. Defaults to `0` (the static
11
+ * sent-bubble palette). */
12
+ export type KeywordHighlighter = (text: string, resetTo?: string, phase?: number) => string;
8
13
 
9
14
  const FG_RESET = "\x1b[39m";
10
15
 
@@ -51,14 +56,19 @@ export function createGradientHighlighter(spec: GradientHighlightSpec): KeywordH
51
56
  return next;
52
57
  };
53
58
 
54
- /** Paint each character of `word` with the next gradient stop, restoring `resetTo` after. */
55
- const paint = (word: string, resetTo: string): string => {
59
+ /** Paint each character of `word` with the next gradient stop, restoring `resetTo` after.
60
+ * `phase` [0, 1) cyclically rotates the palette index so successive renders
61
+ * with monotonically increasing phase produce a moving shimmer; `0` yields the
62
+ * static palette. */
63
+ const paint = (word: string, resetTo: string, phase: number): string => {
56
64
  const stopsArr = palette();
65
+ const m = stopsArr.length;
57
66
  const n = word.length;
58
67
  let out = "";
59
68
  let prev = "";
60
69
  for (let i = 0; i < n; i++) {
61
- const color = stopsArr[Math.floor((i / n) * stopsArr.length)] ?? stopsArr[0] ?? "";
70
+ const t = (i / n + phase) % 1;
71
+ const color = stopsArr[Math.floor(t * m) % m] ?? stopsArr[0] ?? "";
62
72
  // Coalesce consecutive characters that resolve to the same stop.
63
73
  if (color !== prev) {
64
74
  out += color;
@@ -69,8 +79,10 @@ export function createGradientHighlighter(spec: GradientHighlightSpec): KeywordH
69
79
  return `${out}${resetTo}`;
70
80
  };
71
81
 
72
- return (text: string, resetTo: string = FG_RESET): string => {
82
+ return (text: string, resetTo: string = FG_RESET, phase: number = 0): string => {
73
83
  if (!probe.test(text)) return text;
84
+ // Wrap phase into [0, 1) so negative inputs and values ≥ 1 stay well-defined.
85
+ const wrappedPhase = ((phase % 1) + 1) % 1;
74
86
  // Match against a code/markup-masked copy so keywords inside code spans,
75
87
  // fenced blocks, or XML sections never paint; indices still address `text`.
76
88
  const masked = maskNonProse(text);
@@ -79,7 +91,7 @@ export function createGradientHighlighter(spec: GradientHighlightSpec): KeywordH
79
91
  for (const m of masked.matchAll(highlight)) {
80
92
  const start = m.index ?? 0;
81
93
  const end = start + m[0].length;
82
- out += text.slice(last, start) + paint(text.slice(start, end), resetTo);
94
+ out += text.slice(last, start) + paint(text.slice(start, end), resetTo, wrappedPhase);
83
95
  last = end;
84
96
  }
85
97
  return out + text.slice(last);
@@ -8,6 +8,26 @@ import { fileHyperlink } from "../tui/hyperlink";
8
8
  * tail (`, …`) is captured loosely (no `]`/newline) so future label tweaks keep matching. */
9
9
  export const PLACEHOLDER_REGEX = /\[(Image|Paste) #([1-9]\d*)(?:,[^\]\n]*)?\]/g;
10
10
 
11
+ /** Matches a single `[Image #N]` / `[Image #N, WxH]` marker. Group 1 is the
12
+ * 1-based index, group 2 the optional metadata tail (leading comma, no `]` or
13
+ * newline) so future label tweaks keep matching. Paste markers are excluded
14
+ * on purpose: their numbering is owned by the editor's paste store, not by
15
+ * the pending-image buffer. */
16
+ const IMAGE_MARKER_REGEX = /\[Image #([1-9]\d*)((?:,[^\]\n]*)?)\]/g;
17
+
18
+ /** Renumber every `[Image #N]` marker in `text` by `offset` (added to the
19
+ * existing index), preserving the optional `, WxH` tail. Paste markers are
20
+ * left untouched. Used when restoring queued image-messages back into a draft
21
+ * that already holds pending images so the merged text's positional markers
22
+ * still line up with `pendingImages`. */
23
+ export function shiftImageMarkers(text: string, offset: number): string {
24
+ if (offset === 0) return text;
25
+ return text.replace(
26
+ IMAGE_MARKER_REGEX,
27
+ (_match, idx: string, tail: string) => `[Image #${Number(idx) + offset}${tail}]`,
28
+ );
29
+ }
30
+
11
31
  type ImageBlobWriter = (data: Buffer, options?: { extension?: string }) => Promise<BlobPutResult>;
12
32
  type ImageBlobWriterSync = (data: Buffer, options?: { extension?: string }) => BlobPutResult;
13
33