@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,113 @@
1
+ /**
2
+ * Append-only journal of snapcompact tool-result savings.
3
+ *
4
+ * Snapcompact frames are transient — built per provider request in
5
+ * `transformProviderContext` and never written to session.jsonl — so the tokens
6
+ * they keep off the wire would otherwise leave no trace. This records one line
7
+ * the FIRST time a tool result is imaged in a session:
8
+ *
9
+ * {"ts":<epochMs>,"session":<sessionFile>,"provider":..,"model":..,"toolCallId":..,"savedTokens":..}
10
+ *
11
+ * Newline-delimited JSON, opened with O_APPEND so concurrent appenders (parallel
12
+ * agents/subagents) never interleave a partial line. Writes are fire-and-forget;
13
+ * a failure is logged at debug and never propagates into the request hot path.
14
+ *
15
+ * Readers MUST dedup by (session, toolCallId): a session resumed in a fresh
16
+ * process re-images the same results and may append a second line. The savings
17
+ * for a given (session, toolCallId) are stable, so any-per-key is correct.
18
+ */
19
+
20
+ import * as fs from "node:fs/promises";
21
+ import * as path from "node:path";
22
+ import type { Model } from "@oh-my-pi/pi-ai";
23
+ import { getStatsDbPath, isEnoent, logger } from "@oh-my-pi/pi-utils";
24
+
25
+ export interface SnapcompactSavingsRecord {
26
+ /** Epoch milliseconds when the swap was applied. */
27
+ ts: number;
28
+ /** Session file path (matches the stats `messages.session_file` key). */
29
+ session: string;
30
+ provider: string;
31
+ model: string;
32
+ toolCallId: string;
33
+ savedTokens: number;
34
+ }
35
+
36
+ /** `~/.omp/.../snapcompact-savings.jsonl`, colocated with stats.db. */
37
+ export function snapcompactSavingsJournalPath(): string {
38
+ return path.join(path.dirname(getStatsDbPath()), "snapcompact-savings.jsonl");
39
+ }
40
+
41
+ /**
42
+ * Appends savings to the journal, deduped by toolCallId for the recorder's
43
+ * lifetime (one per session). Returns the in-flight append so callers/tests can
44
+ * await durability; the production transform leaves it floating (fire-and-forget,
45
+ * and it never rejects — I/O errors are swallowed to debug). `getSession` is read
46
+ * at write time so a session file assigned late is still captured; a null session
47
+ * (in-memory / SDK embedding) or non-positive savings skip the write.
48
+ */
49
+ export type SnapcompactSavingsRecorder = (
50
+ savings: ReadonlyArray<{ toolCallId: string; savedTokens: number }>,
51
+ model: Model,
52
+ ) => Promise<void>;
53
+
54
+ export function createSnapcompactSavingsRecorder(
55
+ getSession: () => string | null,
56
+ journalPath: string = snapcompactSavingsJournalPath(),
57
+ ): SnapcompactSavingsRecorder {
58
+ const seen = new Set<string>();
59
+ let dirEnsured = false;
60
+ return async (savings, model) => {
61
+ const session = getSession();
62
+ if (!session) return;
63
+ const ts = Date.now();
64
+ const lines: string[] = [];
65
+ for (const { toolCallId, savedTokens } of savings) {
66
+ if (savedTokens <= 0 || seen.has(toolCallId)) continue;
67
+ seen.add(toolCallId);
68
+ lines.push(
69
+ JSON.stringify({
70
+ ts,
71
+ session,
72
+ provider: model.provider,
73
+ model: model.id,
74
+ toolCallId,
75
+ savedTokens,
76
+ } satisfies SnapcompactSavingsRecord),
77
+ );
78
+ }
79
+ if (lines.length === 0) return;
80
+ try {
81
+ if (!dirEnsured) {
82
+ await fs.mkdir(path.dirname(journalPath), { recursive: true });
83
+ dirEnsured = true;
84
+ }
85
+ await fs.appendFile(journalPath, `${lines.join("\n")}\n`);
86
+ } catch (err) {
87
+ logger.debug("snapcompact savings journal append failed", { err: String(err) });
88
+ }
89
+ };
90
+ }
91
+
92
+ /** Read all journal records. Malformed lines are skipped; a missing file is empty. */
93
+ export async function readSnapcompactSavingsJournal(
94
+ journalPath: string = snapcompactSavingsJournalPath(),
95
+ ): Promise<SnapcompactSavingsRecord[]> {
96
+ let text: string;
97
+ try {
98
+ text = await Bun.file(journalPath).text();
99
+ } catch (err) {
100
+ if (isEnoent(err)) return [];
101
+ throw err;
102
+ }
103
+ const records: SnapcompactSavingsRecord[] = [];
104
+ for (const line of text.split("\n")) {
105
+ if (!line.trim()) continue;
106
+ try {
107
+ records.push(JSON.parse(line) as SnapcompactSavingsRecord);
108
+ } catch {
109
+ /* skip malformed line */
110
+ }
111
+ }
112
+ return records;
113
+ }
@@ -10,14 +10,14 @@ export interface ResolveInfo {
10
10
  export interface RejectInfo {
11
11
  /** The ToolChoice that was yielded but never (or unsuccessfully) served. */
12
12
  choice: ToolChoice;
13
- reason: "aborted" | "error" | "cleared" | "removed";
13
+ reason: "aborted" | "error" | "cleared" | "removed" | "unavailable" | "not_invoked";
14
14
  }
15
15
 
16
16
  /** "requeue" replays the lost yield next turn; "drop" (or void/undefined) discards it. */
17
17
  export type RejectOutcome = "requeue" | "drop";
18
18
 
19
19
  export interface DirectiveCallbacks {
20
- /** Fires when the yield was served (LLM call completed). The directive is consumed. */
20
+ /** Fires when the yield completed; onInvoked directives require the requested tool to run first. */
21
21
  onResolved?: (info: ResolveInfo) => void;
22
22
  /**
23
23
  * Fires when the yield is being discarded. Return "requeue" to replay the
@@ -62,6 +62,7 @@ export function* onceGen(choice: ToolChoice): Generator<ToolChoice, void, unknow
62
62
  interface InFlight {
63
63
  directive: ToolChoiceDirective;
64
64
  yielded: ToolChoice;
65
+ invoked: boolean;
65
66
  }
66
67
 
67
68
  // ── Queue ───────────────────────────────────────────────────────────────────
@@ -116,7 +117,7 @@ export class ToolChoiceQueue {
116
117
  this.#queue.shift();
117
118
  continue;
118
119
  }
119
- this.#inFlight = { directive: head, yielded: result.value };
120
+ this.#inFlight = { directive: head, yielded: result.value, invoked: false };
120
121
  return result.value;
121
122
  }
122
123
  return undefined;
@@ -125,14 +126,18 @@ export class ToolChoiceQueue {
125
126
  // ── Lifecycle ─────────────────────────────────────────────────────────
126
127
 
127
128
  /**
128
- * The in-flight yield was served the LLM call completed normally.
129
- * Fires onResolved, then clears in-flight state. The directive's generator
130
- * remains in the queue if it has more values to yield.
129
+ * The in-flight yield completed normally. Directives with onInvoked are only
130
+ * consumed after their requested tool ran; a normal text turn or a different
131
+ * tool call requeues/rejects the directive instead.
131
132
  */
132
133
  resolve(): void {
133
134
  const inFlight = this.#inFlight;
134
- this.#inFlight = undefined;
135
135
  if (!inFlight) return;
136
+ if (inFlight.directive.callbacks.onInvoked && !inFlight.invoked) {
137
+ this.reject("not_invoked");
138
+ return;
139
+ }
140
+ this.#inFlight = undefined;
136
141
 
137
142
  this.#lastResolvedLabel = inFlight.directive.label;
138
143
  inFlight.directive.callbacks.onResolved?.({ choice: inFlight.yielded });
@@ -155,12 +160,13 @@ export class ToolChoiceQueue {
155
160
 
156
161
  if (outcome === "requeue") {
157
162
  // Re-queue only the lost yield, not the rest of the sequence. Carry forward
158
- // onInvoked and onRejected so the replayed yield still executes correctly
159
- // and can requeue itself again if the next turn also aborts.
163
+ // callbacks so the replayed yield still executes and finalizes correctly,
164
+ // and can requeue itself again if the next turn also aborts or skips it.
160
165
  this.#queue.unshift({
161
166
  generator: onceGen(inFlight.yielded),
162
167
  label: `${inFlight.directive.label}-requeued`,
163
168
  callbacks: {
169
+ onResolved: inFlight.directive.callbacks.onResolved,
164
170
  onInvoked: inFlight.directive.callbacks.onInvoked,
165
171
  onRejected: inFlight.directive.callbacks.onRejected,
166
172
  },
@@ -173,9 +179,15 @@ export class ToolChoiceQueue {
173
179
  return this.#inFlight !== undefined;
174
180
  }
175
181
 
176
- /** Peek the in-flight directive's onInvoked handler, if any. */
182
+ /** Return the in-flight directive's onInvoked handler and mark it when called. */
177
183
  peekInFlightInvoker(): ((input: unknown) => Promise<unknown> | unknown) | undefined {
178
- return this.#inFlight?.directive.callbacks.onInvoked;
184
+ const inFlight = this.#inFlight;
185
+ const onInvoked = inFlight?.directive.callbacks.onInvoked;
186
+ if (!inFlight || !onInvoked) return undefined;
187
+ return (input: unknown): Promise<unknown> | unknown => {
188
+ inFlight.invoked = true;
189
+ return onInvoked(input);
190
+ };
179
191
  }
180
192
 
181
193
  // ── Cleanup ───────────────────────────────────────────────────────────
@@ -62,6 +62,19 @@ function refreshStatusLine(ctx: InteractiveModeContext): void {
62
62
  ctx.ui.requestRender();
63
63
  }
64
64
 
65
+ /** `/fast status` label: "off", "on", or scope-qualified "on (… only)". */
66
+ function formatFastModeStatus(session: AgentSession): string {
67
+ if (!session.isFastModeEnabled()) return "off";
68
+ switch (session.serviceTier) {
69
+ case "openai-only":
70
+ return "on (OpenAI only)";
71
+ case "claude-only":
72
+ return "on (Claude only)";
73
+ default:
74
+ return "on";
75
+ }
76
+ }
77
+
65
78
  /** Scheme-less display form of a browser deep link: accent + underline, OSC-8 linked to the full URL. */
66
79
  function collabWebLinkClickable(webLink: string): string {
67
80
  const display = theme.fg("accent", `\x1b[4m${webLink.replace(/^https?:\/\//, "")}\x1b[24m`);
@@ -271,6 +284,16 @@ const BUILTIN_SLASH_COMMAND_REGISTRY: ReadonlyArray<SlashCommandSpec> = [
271
284
  runtime.ctx.editor.setText("");
272
285
  },
273
286
  },
287
+ {
288
+ name: "guided-goal",
289
+ description: "Interview and refine a goal before enabling goal mode",
290
+ inlineHint: "[rough objective]",
291
+ allowArgs: true,
292
+ handleTui: async (command, runtime) => {
293
+ await runtime.ctx.handleGuidedGoalCommand(command.args || undefined);
294
+ runtime.ctx.editor.setText("");
295
+ },
296
+ },
274
297
  {
275
298
  name: "loop",
276
299
  description:
@@ -359,7 +382,7 @@ const BUILTIN_SLASH_COMMAND_REGISTRY: ReadonlyArray<SlashCommandSpec> = [
359
382
  return commandConsumed();
360
383
  }
361
384
  if (arg === "status") {
362
- await runtime.output(`Fast mode is ${runtime.session.isFastModeEnabled() ? "on" : "off"}.`);
385
+ await runtime.output(`Fast mode is ${formatFastModeStatus(runtime.session)}.`);
363
386
  return commandConsumed();
364
387
  }
365
388
  return usage("Usage: /fast [on|off|status]", runtime);
@@ -388,8 +411,7 @@ const BUILTIN_SLASH_COMMAND_REGISTRY: ReadonlyArray<SlashCommandSpec> = [
388
411
  return;
389
412
  }
390
413
  if (arg === "status") {
391
- const enabled = runtime.ctx.session.isFastModeEnabled();
392
- runtime.ctx.showStatus(`Fast mode is ${enabled ? "on" : "off"}.`);
414
+ runtime.ctx.showStatus(`Fast mode is ${formatFastModeStatus(runtime.ctx.session)}.`);
393
415
  runtime.ctx.editor.setText("");
394
416
  return;
395
417
  }
@@ -1005,7 +1027,21 @@ const BUILTIN_SLASH_COMMAND_REGISTRY: ReadonlyArray<SlashCommandSpec> = [
1005
1027
  {
1006
1028
  name: "logout",
1007
1029
  description: "Logout from OAuth provider",
1008
- handleTui: (_command, runtime) => {
1030
+ inlineHint: "[provider]",
1031
+ allowArgs: true,
1032
+ handleTui: (command, runtime) => {
1033
+ const providerId = command.args.trim();
1034
+ if (providerId) {
1035
+ const matchedProvider = getOAuthProviders().find(provider => provider.id === providerId);
1036
+ if (!matchedProvider) {
1037
+ runtime.ctx.showWarning(`Unknown OAuth provider: ${providerId}`);
1038
+ runtime.ctx.editor.setText("");
1039
+ return;
1040
+ }
1041
+ void runtime.ctx.showOAuthSelector("logout", matchedProvider.id);
1042
+ runtime.ctx.editor.setText("");
1043
+ return;
1044
+ }
1009
1045
  void runtime.ctx.showOAuthSelector("logout");
1010
1046
  runtime.ctx.editor.setText("");
1011
1047
  },
@@ -0,0 +1,88 @@
1
+ import type { OAuthAccountIdentity, StoredAuthCredential } from "../../session/auth-storage";
2
+
3
+ export interface LogoutAccount {
4
+ credentialId: number;
5
+ provider: string;
6
+ label: string;
7
+ detail: string;
8
+ type: "api_key" | "oauth";
9
+ active: boolean;
10
+ }
11
+
12
+ interface LogoutAccountOptions {
13
+ activeIdentity?: OAuthAccountIdentity;
14
+ activeApiKey?: boolean;
15
+ }
16
+
17
+ function nonEmpty(value: string | undefined): string | undefined {
18
+ const trimmed = value?.trim();
19
+ return trimmed && trimmed.length > 0 ? trimmed : undefined;
20
+ }
21
+
22
+ function oauthLabel(row: StoredAuthCredential): string {
23
+ const credential = row.credential;
24
+ if (credential.type !== "oauth") return `API key #${row.id}`;
25
+ return (
26
+ nonEmpty(credential.email) ??
27
+ nonEmpty(credential.accountId) ??
28
+ nonEmpty(credential.projectId) ??
29
+ nonEmpty(credential.enterpriseUrl) ??
30
+ `OAuth credential #${row.id}`
31
+ );
32
+ }
33
+
34
+ function oauthDetail(row: StoredAuthCredential, label: string): string {
35
+ const credential = row.credential;
36
+ if (credential.type === "api_key") return `stored API key #${row.id}`;
37
+ const parts: string[] = [];
38
+ const email = nonEmpty(credential.email);
39
+ const accountId = nonEmpty(credential.accountId);
40
+ const projectId = nonEmpty(credential.projectId);
41
+ const enterpriseUrl = nonEmpty(credential.enterpriseUrl);
42
+ if (email && email !== label) parts.push(email);
43
+ if (accountId && accountId !== label) parts.push(`account ${accountId}`);
44
+ if (projectId && projectId !== label) parts.push(`project ${projectId}`);
45
+ if (enterpriseUrl && enterpriseUrl !== label) parts.push(enterpriseUrl);
46
+ parts.push(`oauth #${row.id}`);
47
+ return parts.join(" · ");
48
+ }
49
+
50
+ function oauthMatchesActiveIdentity(
51
+ row: StoredAuthCredential,
52
+ activeIdentity: OAuthAccountIdentity | undefined,
53
+ ): boolean {
54
+ if (!activeIdentity || row.credential.type !== "oauth") return false;
55
+ const credential = row.credential;
56
+ return (
57
+ (activeIdentity.accountId !== undefined && credential.accountId === activeIdentity.accountId) ||
58
+ (activeIdentity.email !== undefined && credential.email === activeIdentity.email) ||
59
+ (activeIdentity.projectId !== undefined && credential.projectId === activeIdentity.projectId)
60
+ );
61
+ }
62
+
63
+ export function toLogoutAccounts(
64
+ provider: string,
65
+ credentials: StoredAuthCredential[],
66
+ options: LogoutAccountOptions = {},
67
+ ): LogoutAccount[] {
68
+ return credentials
69
+ .map(row => {
70
+ const label = oauthLabel(row);
71
+ const active =
72
+ row.credential.type === "oauth"
73
+ ? oauthMatchesActiveIdentity(row, options.activeIdentity)
74
+ : options.activeApiKey === true;
75
+ return {
76
+ credentialId: row.id,
77
+ provider,
78
+ label,
79
+ detail: oauthDetail(row, label),
80
+ type: row.credential.type,
81
+ active,
82
+ } satisfies LogoutAccount;
83
+ })
84
+ .sort((left, right) => {
85
+ if (left.active !== right.active) return left.active ? -1 : 1;
86
+ return left.label.localeCompare(right.label) || left.credentialId - right.credentialId;
87
+ });
88
+ }