@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
@@ -5,6 +5,7 @@ import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
5
5
  import type { CredentialDisabledEvent, ImageContent, Model, ProviderResponseMetadata } from "@oh-my-pi/pi-ai";
6
6
  import type { KeyId } from "@oh-my-pi/pi-tui";
7
7
  import type { ModelRegistry } from "../../config/model-registry";
8
+ import type { Settings } from "../../config/settings";
8
9
  import type { MemoryRuntimeContext } from "../../memory-backend";
9
10
  import type { SessionManager } from "../../session/session-manager";
10
11
  import type { AfterProviderResponseEvent, AssistantThinkingRenderer, BeforeAgentStartEvent, BeforeAgentStartEventResult, BeforeProviderRequestEvent, BeforeProviderRequestEventResult, ContextEvent, Extension, ExtensionActions, ExtensionCommandContext, ExtensionCommandContextActions, ExtensionContext, ExtensionContextActions, ExtensionError, ExtensionEvent, ExtensionFlag, ExtensionRuntime, ExtensionShortcut, ExtensionUIContext, InputEvent, InputEventResult, MessageRenderer, RegisteredCommand, RegisteredTool, ResourcesDiscoverEvent, SessionBeforeBranchResult, SessionBeforeCompactResult, SessionBeforeSwitchResult, SessionBeforeTreeResult, SessionCompactingResult, ToolCallEvent, ToolCallEventResult, ToolResultEvent, ToolResultEventResult, UserBashEvent, UserBashEventResult, UserPythonEvent, UserPythonEventResult } from "./types";
@@ -62,7 +63,8 @@ export declare class ExtensionRunner {
62
63
  private readonly cwd;
63
64
  private readonly sessionManager;
64
65
  private readonly modelRegistry;
65
- constructor(extensions: Extension[], runtime: ExtensionRuntime, cwd: string, sessionManager: SessionManager, modelRegistry: ModelRegistry, getMemory?: () => MemoryRuntimeContext | undefined);
66
+ private readonly settings?;
67
+ constructor(extensions: Extension[], runtime: ExtensionRuntime, cwd: string, sessionManager: SessionManager, modelRegistry: ModelRegistry, getMemory?: () => MemoryRuntimeContext | undefined, settings?: Settings | undefined);
66
68
  initialize(actions: ExtensionActions, contextActions: ExtensionContextActions, commandContextActions?: ExtensionCommandContextActions, uiContext?: ExtensionUIContext): void;
67
69
  /**
68
70
  * Forward a `credential_disabled` event from `AuthStorage` to extension handlers.
@@ -13,7 +13,7 @@ import type { Api, AssistantMessageEvent, AssistantMessageEventStream, Context,
13
13
  import type { OAuthCredentials, OAuthLoginCallbacks } from "@oh-my-pi/pi-ai/oauth/types";
14
14
  import type { AutocompleteItem, Component, EditorTheme, KeyId, TUI } from "@oh-my-pi/pi-tui";
15
15
  import type { logger as PiLogger } from "@oh-my-pi/pi-utils";
16
- import type * as Zod from "zod/v4";
16
+ import type { z } from "zod/v4";
17
17
  import type { KeybindingsManager } from "../../config/keybindings";
18
18
  import type { ModelRegistry } from "../../config/model-registry";
19
19
  import type { EditToolDetails } from "../../edit";
@@ -27,6 +27,7 @@ import type { Theme } from "../../modes/theme/theme";
27
27
  import type { CustomMessage } from "../../session/messages";
28
28
  import type { ReadonlySessionManager, SessionManager } from "../../session/session-manager";
29
29
  import type { BashToolDetails, BashToolInput, FindToolDetails, FindToolInput, ReadToolDetails, ReadToolInput, SearchToolDetails, SearchToolInput, WriteToolInput } from "../../tools";
30
+ import type { ApprovalMode } from "../../tools/approval";
30
31
  import type { EventBus } from "../../utils/event-bus";
31
32
  import type { AgentEndEvent, AgentStartEvent, AutoCompactionEndEvent, AutoCompactionStartEvent, AutoRetryEndEvent, AutoRetryStartEvent, ContextEvent, GoalUpdatedEvent, SessionBeforeBranchEvent, SessionBeforeBranchResult, SessionBeforeCompactEvent, SessionBeforeCompactResult, SessionBeforeSwitchEvent, SessionBeforeSwitchResult, SessionBeforeTreeEvent, SessionBeforeTreeResult, SessionBranchEvent, SessionCompactEvent, SessionCompactingEvent, SessionCompactingResult, SessionEvent, SessionShutdownEvent, SessionStartEvent, SessionSwitchEvent, SessionTreeEvent, TodoReminderEvent, ToolCallEventResult, ToolResultEventResult, TtsrTriggeredEvent, TurnEndEvent, TurnStartEvent } from "../shared-events";
32
33
  import type { SlashCommandInfo } from "../slash-commands";
@@ -173,6 +174,31 @@ export interface CompactOptions {
173
174
  /**
174
175
  * Context passed to extension event handlers.
175
176
  */
177
+ /**
178
+ * Read-only model query facade exposed at `ctx.models`. Lets an extension select a
179
+ * model the same way core does — list authenticated models, read the session model,
180
+ * resolve a model string or role alias, and compare model families — without reaching
181
+ * into the mutable registry or re-implementing matching/family heuristics.
182
+ */
183
+ export interface ExtensionModelQuery {
184
+ /** Authenticated models available this session (the same set `--model` selection sees). */
185
+ list(): Model[];
186
+ /** The current session model, if one is set. */
187
+ current(): Model | undefined;
188
+ /**
189
+ * Resolve a model string (`provider/id`, bare id) or role alias (`pi/slow`, a
190
+ * configured role) to a Model, using the same settings-backed aliases and match
191
+ * preferences as core selection. Thinking/routing suffixes are accepted and resolved
192
+ * to the base model (pass effort separately). Returns undefined when nothing matches.
193
+ */
194
+ resolve(spec: string): Model | undefined;
195
+ /**
196
+ * Opaque lineage token for "are these the same family?" comparisons — every Claude
197
+ * point release shares a token, Claude and GPT differ. Backed by catalog canonical
198
+ * identity. Compare it; do not persist it (the vocabulary tracks new releases).
199
+ */
200
+ family(model: Model): string;
201
+ }
176
202
  export interface ExtensionContext {
177
203
  /** UI methods for user interaction */
178
204
  ui: ExtensionUIContext;
@@ -190,6 +216,8 @@ export interface ExtensionContext {
190
216
  modelRegistry: ModelRegistry;
191
217
  /** Current model (may be undefined) */
192
218
  model: Model | undefined;
219
+ /** Read-only model query facade: list / current / resolve / family. */
220
+ models: ExtensionModelQuery;
193
221
  /** Whether the agent is idle (not streaming) */
194
222
  isIdle(): boolean;
195
223
  /** Abort the current agent operation */
@@ -396,6 +424,22 @@ export interface InputEvent {
396
424
  images?: ImageContent[];
397
425
  source: "interactive" | "rpc" | "extension";
398
426
  }
427
+ export interface ToolApprovalRequestedEvent {
428
+ type: "tool_approval_requested";
429
+ sessionId: string;
430
+ toolCallId: string;
431
+ toolName: string;
432
+ reason?: string;
433
+ approvalMode: ApprovalMode;
434
+ }
435
+ export interface ToolApprovalResolvedEvent {
436
+ type: "tool_approval_resolved";
437
+ sessionId: string;
438
+ toolCallId: string;
439
+ toolName: string;
440
+ approved: boolean;
441
+ reason?: string;
442
+ }
399
443
  interface ToolCallEventBase {
400
444
  type: "tool_call";
401
445
  toolCallId: string;
@@ -498,7 +542,7 @@ export declare function isToolCallEventType<TName extends string, TInput extends
498
542
  input: TInput;
499
543
  };
500
544
  /** Union of all event types */
501
- export type ExtensionEvent = ResourcesDiscoverEvent | SessionEvent | ContextEvent | BeforeProviderRequestEvent | AfterProviderResponseEvent | BeforeAgentStartEvent | AgentStartEvent | AgentEndEvent | TurnStartEvent | TurnEndEvent | MessageStartEvent | MessageUpdateEvent | MessageEndEvent | ToolExecutionStartEvent | ToolExecutionUpdateEvent | ToolExecutionEndEvent | AutoCompactionStartEvent | AutoCompactionEndEvent | AutoRetryStartEvent | AutoRetryEndEvent | TtsrTriggeredEvent | TodoReminderEvent | GoalUpdatedEvent | CredentialDisabledEvent | UserBashEvent | UserPythonEvent | InputEvent | ToolCallEvent | ToolResultEvent;
545
+ export type ExtensionEvent = ResourcesDiscoverEvent | SessionEvent | ContextEvent | BeforeProviderRequestEvent | AfterProviderResponseEvent | BeforeAgentStartEvent | AgentStartEvent | AgentEndEvent | TurnStartEvent | TurnEndEvent | MessageStartEvent | MessageUpdateEvent | MessageEndEvent | ToolExecutionStartEvent | ToolExecutionUpdateEvent | ToolExecutionEndEvent | AutoCompactionStartEvent | AutoCompactionEndEvent | AutoRetryStartEvent | AutoRetryEndEvent | TtsrTriggeredEvent | TodoReminderEvent | GoalUpdatedEvent | CredentialDisabledEvent | UserBashEvent | UserPythonEvent | InputEvent | ToolCallEvent | ToolResultEvent | ToolApprovalRequestedEvent | ToolApprovalResolvedEvent;
502
546
  export interface ContextEventResult {
503
547
  messages?: AgentMessage[];
504
548
  }
@@ -558,7 +602,7 @@ export interface ExtensionAPI {
558
602
  /** Injected zod-backed typebox shim for legacy `Type.Object(...)` parameter authoring. */
559
603
  typebox: typeof TypeBox;
560
604
  /** Injected zod module for Zod-authored extension tools (canonical going forward). */
561
- zod: typeof Zod;
605
+ zod: typeof z;
562
606
  /** Injected pi-coding-agent exports for accessing SDK utilities */
563
607
  pi: typeof PiCodingAgent;
564
608
  on(event: "resources_discover", handler: ExtensionHandler<ResourcesDiscoverEvent, ResourcesDiscoverResult>): void;
@@ -596,6 +640,8 @@ export interface ExtensionAPI {
596
640
  on(event: "goal_updated", handler: ExtensionHandler<GoalUpdatedEvent>): void;
597
641
  on(event: "credential_disabled", handler: ExtensionHandler<CredentialDisabledEvent>): void;
598
642
  on(event: "input", handler: ExtensionHandler<InputEvent, InputEventResult>): void;
643
+ on(event: "tool_approval_requested", handler: ExtensionHandler<ToolApprovalRequestedEvent>): void;
644
+ on(event: "tool_approval_resolved", handler: ExtensionHandler<ToolApprovalResolvedEvent>): void;
599
645
  on(event: "tool_call", handler: ExtensionHandler<ToolCallEvent, ToolCallEventResult>): void;
600
646
  on(event: "tool_result", handler: ExtensionHandler<ToolResultEvent, ToolResultEventResult>): void;
601
647
  on(event: "user_bash", handler: ExtensionHandler<UserBashEvent, UserBashEventResult>): void;
@@ -1,4 +1,5 @@
1
- export type { ReadonlySessionManager, UsageStatistics } from "../../session/session-manager";
1
+ export type { UsageStatistics } from "../../session/session-entries";
2
+ export type { ReadonlySessionManager } from "../../session/session-manager";
2
3
  export * from "./loader";
3
4
  export * from "./runner";
4
5
  export * from "./tool-wrapper";
@@ -1,7 +1,7 @@
1
1
  import type { ImageContent, Message, Model, TextContent } from "@oh-my-pi/pi-ai";
2
2
  import type { Component, TUI } from "@oh-my-pi/pi-tui";
3
3
  import type { logger as PiLogger } from "@oh-my-pi/pi-utils";
4
- import type * as Zod from "zod/v4";
4
+ import type { z } from "zod/v4";
5
5
  import type { ModelRegistry } from "../../config/model-registry";
6
6
  import type { EditToolDetails } from "../../edit";
7
7
  import type { ExecOptions, ExecResult } from "../../exec/exec";
@@ -420,7 +420,7 @@ export interface HookAPI {
420
420
  /** Injected zod-backed typebox shim (legacy/compat — prefer `zod`). */
421
421
  typebox: typeof TypeBox;
422
422
  /** Injected zod module for Zod-authored hooks. */
423
- zod: typeof Zod;
423
+ zod: typeof z;
424
424
  /** Injected pi-coding-agent exports */
425
425
  pi: typeof PiCodingAgent;
426
426
  }
@@ -13,6 +13,15 @@ import * as path from "node:path";
13
13
  * Exported for tests; production callers use `BUNFS_PACKAGE_ROOT` below.
14
14
  */
15
15
  export declare function __computeBunfsPackageRoot(metaDir: string, pathImpl?: typeof path): string;
16
+ /**
17
+ * Compute the package root for the npm prebuilt `dist/cli.js` bundle.
18
+ *
19
+ * `bundle-dist.ts` defines `process.env.PI_BUNDLED="true"`; after bundling,
20
+ * `import.meta.dir` points at `<package>/dist`. Do not resolve the package via
21
+ * bare `@oh-my-pi/pi-coding-agent` here: from a global install Bun can pick an
22
+ * older cache entry, recreating mixed-runtime plugin loading.
23
+ */
24
+ export declare function __computeBundledSelfPackageRoot(metaDir: string, pathImpl?: typeof path): string;
16
25
  /**
17
26
  * Drop overrides whose targets are missing on disk so they can fall through to
18
27
  * the canonical-resolution path. Exported for the test seam in #2168.
@@ -14,6 +14,17 @@ import type { InstalledPlugin } from "./types";
14
14
  export declare function getEnabledPlugins(cwd: string, opts?: {
15
15
  home?: string;
16
16
  }): Promise<InstalledPlugin[]>;
17
+ /**
18
+ * Declared manifest entries paired with their resolved file path. Returns one
19
+ * record per declared entry — base entries first, then enabled-feature entries
20
+ * — so callers (e.g. install-time validation) can detect manifest entries that
21
+ * point at missing files instead of silently skipping them like
22
+ * {@link resolvePluginPaths} does.
23
+ */
24
+ export declare function resolvePluginManifestEntries(plugin: InstalledPlugin, key: "tools" | "hooks" | "commands" | "extensions"): Array<{
25
+ entry: string;
26
+ resolvedPath: string | null;
27
+ }>;
17
28
  export declare function resolvePluginToolPaths(plugin: InstalledPlugin): string[];
18
29
  export declare function resolvePluginHookPaths(plugin: InstalledPlugin): string[];
19
30
  export declare function resolvePluginCommandPaths(plugin: InstalledPlugin): string[];
@@ -17,7 +17,7 @@ import type { CompactionPreparation, CompactionResult } from "@oh-my-pi/pi-agent
17
17
  import type { ImageContent, TextContent, ToolResultMessage } from "@oh-my-pi/pi-ai";
18
18
  import type { Rule } from "../capability/rule";
19
19
  import type { Goal, GoalModeState } from "../goals/state";
20
- import type { BranchSummaryEntry, CompactionEntry, SessionEntry } from "../session/session-manager";
20
+ import type { BranchSummaryEntry, CompactionEntry, SessionEntry } from "../session/session-entries";
21
21
  import type { TodoItem } from "../tools/todo";
22
22
  /** Fired on initial session load */
23
23
  export interface SessionStartEvent {
@@ -33,6 +33,16 @@ export declare function getActiveSkills(): readonly Skill[];
33
33
  export declare function setActiveSkills(value: readonly Skill[]): void;
34
34
  /** Reset the active skill snapshot. Test-only. */
35
35
  export declare function resetActiveSkillsForTests(): void;
36
+ /**
37
+ * Whether `name` is already claimed by an active authored (non-managed) skill.
38
+ *
39
+ * Managed (auto-learn) skills resolve dead-last in discovery, so an authored
40
+ * skill of the same name always wins (see `loadSkills`) and a managed skill
41
+ * written under an authored name is silently dropped — it never surfaces.
42
+ * `manage_skill` create consults this to refuse the write up front instead of
43
+ * reporting a false "Created" for a skill that can never appear.
44
+ */
45
+ export declare function isNameClaimedByAuthoredSkill(name: string): boolean;
36
46
  export interface LoadSkillsFromDirOptions {
37
47
  /** Directory to scan for skills */
38
48
  dir: string;
@@ -0,0 +1,18 @@
1
+ import type { AgentSession } from "../session/agent-session";
2
+ export interface GuidedGoalMessage {
3
+ role: "user" | "assistant";
4
+ content: string;
5
+ }
6
+ export type GuidedGoalTurnResult = {
7
+ kind: "question";
8
+ question: string;
9
+ objective?: string;
10
+ } | {
11
+ kind: "ready";
12
+ objective: string;
13
+ };
14
+ export interface GuidedGoalTurnOptions {
15
+ messages: readonly GuidedGoalMessage[];
16
+ signal?: AbortSignal;
17
+ }
18
+ export declare function runGuidedGoalTurn(session: AgentSession, options: GuidedGoalTurnOptions): Promise<GuidedGoalTurnResult>;
@@ -1,4 +1,4 @@
1
- import type { UsageStatistics } from "../session/session-manager";
1
+ import type { UsageStatistics } from "../session/session-entries";
2
2
  export type GoalStatus = "active" | "paused" | "budget-limited" | "complete" | "dropped";
3
3
  export interface Goal {
4
4
  id: string;
@@ -1,6 +1,6 @@
1
1
  import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
2
2
  import type { Component } from "@oh-my-pi/pi-tui";
3
- import * as z from "zod/v4";
3
+ import { z } from "zod/v4";
4
4
  import type { RenderResultOptions } from "../../extensibility/custom-tools/types";
5
5
  import type { Theme } from "../../modes/theme/theme";
6
6
  import type { ToolSession } from "../../tools";
@@ -6,7 +6,7 @@
6
6
  * messages, and anything else that isn't a primary conversation turn. Each
7
7
  * surviving message's `TextContent` parts are joined with newlines.
8
8
  */
9
- import type { SessionEntry } from "../session/session-manager";
9
+ import type { SessionEntry } from "../session/session-entries";
10
10
  import type { HindsightMessage } from "./content";
11
11
  export interface ReadonlySessionManagerLike {
12
12
  getEntries(): SessionEntry[];
@@ -25,8 +25,13 @@ export * from "./session/auth-storage";
25
25
  export * from "./session/indexed-session-storage";
26
26
  export * from "./session/messages";
27
27
  export * from "./session/redis-session-storage";
28
+ export * from "./session/session-context";
28
29
  export * from "./session/session-dump-format";
30
+ export * from "./session/session-entries";
31
+ export * from "./session/session-listing";
32
+ export * from "./session/session-loader";
29
33
  export * from "./session/session-manager";
34
+ export * from "./session/session-migrations";
30
35
  export * from "./session/session-storage";
31
36
  export * from "./session/sql-session-storage";
32
37
  export * from "./task/executor";
@@ -3,8 +3,10 @@ export interface LocalProtocolOptions {
3
3
  getArtifactsDir?: () => string | null;
4
4
  getSessionId?: () => string | null;
5
5
  }
6
- export declare function resolveLocalRoot(options: LocalProtocolOptions): string;
7
- export declare function resolveLocalUrlToPath(input: string | InternalUrl, options: LocalProtocolOptions): string;
6
+ /** Resolve the session-scoped local:// root, shortening long Windows artifact paths before writes hit MAX_PATH. */
7
+ export declare function resolveLocalRoot(options: LocalProtocolOptions, platform?: NodeJS.Platform): string;
8
+ /** Resolve a local:// URL to an on-disk path under the active session's local root. */
9
+ export declare function resolveLocalUrlToPath(input: string | InternalUrl, options: LocalProtocolOptions, platform?: NodeJS.Platform): string;
8
10
  /**
9
11
  * On-disk roots the eval helpers (`read`/`write`/`append`) substitute for
10
12
  * internal-URL schemes so e.g. `write("local://x.md")` lands where a later
@@ -1,5 +1,5 @@
1
1
  import type { ptree } from "@oh-my-pi/pi-utils";
2
- import * as z from "zod/v4";
2
+ import { z } from "zod/v4";
3
3
  export declare const lspSchema: z.ZodObject<{
4
4
  action: z.ZodEnum<{
5
5
  capabilities: "capabilities";
@@ -1,4 +1,4 @@
1
- import type { Args } from "./cli/args";
1
+ import { type Args } from "./cli/args";
2
2
  import { ModelRegistry } from "./config/model-registry";
3
3
  import { type ScopedModel } from "./config/model-resolver";
4
4
  import { Settings } from "./config/settings";
@@ -7,14 +7,15 @@ import type { SubmittedUserInput } from "./modes/types";
7
7
  import { type CreateAgentSessionOptions, type CreateAgentSessionResult, createAgentSession, discoverAuthStorage } from "./sdk";
8
8
  import type { AgentSession } from "./session/agent-session";
9
9
  import type { AuthStorage } from "./session/auth-storage";
10
- import { type SessionInfo, SessionManager } from "./session/session-manager";
10
+ import { type SessionInfo } from "./session/session-listing";
11
+ import { SessionManager } from "./session/session-manager";
11
12
  type RunAcpMode = (createSession: AcpSessionFactory) => Promise<never>;
12
13
  export interface InteractiveModeNotify {
13
14
  kind: "warn" | "error" | "info";
14
15
  message: string;
15
16
  }
16
17
  export declare function buildModelScopeNotification(scopedModelsForDisplay: readonly Pick<ScopedModel, "model" | "thinkingLevel" | "explicitThinkingLevel">[], startupQuiet: boolean): InteractiveModeNotify | null;
17
- export declare function submitInteractiveInput(mode: Pick<InteractiveMode, "markPendingSubmissionStarted" | "finishPendingSubmission" | "showError" | "checkShutdownRequested">, session: Pick<AgentSession, "prompt" | "promptCustomMessage">, input: SubmittedUserInput): Promise<void>;
18
+ export declare function submitInteractiveInput(mode: Pick<InteractiveMode, "markPendingSubmissionStarted" | "finishPendingSubmission" | "showError" | "checkShutdownRequested">, session: Pick<AgentSession, "prompt" | "promptCustomMessage" | "isStreaming">, input: SubmittedUserInput): Promise<void>;
18
19
  type AcpSessionFactory = (cwd: string) => Promise<AgentSession>;
19
20
  export interface AcpSessionFactoryOptions {
20
21
  baseOptions: CreateAgentSessionOptions;
@@ -104,6 +104,14 @@ export declare class MCPManager {
104
104
  * Get the source metadata for a server.
105
105
  */
106
106
  getSource(name: string): SourceMeta | undefined;
107
+ /**
108
+ * Get the preserved (pre-auth) config for a known server — whether currently
109
+ * connected or merely discovered (a connect was attempted but may have failed,
110
+ * e.g. an OAuth server that has not been authorized yet). Mirrors the
111
+ * reconnect lookup at {@link reconnectServer} so callers like `/mcp reauth`
112
+ * can recover a discovered server's config without re-reading config files.
113
+ */
114
+ getServerConfig(name: string): MCPServerConfig | undefined;
107
115
  /**
108
116
  * Wait for a connection to complete (or fail).
109
117
  */
@@ -0,0 +1,11 @@
1
+ export declare const MCP_CONNECTING_EVENT_CHANNEL = "mcp:connecting";
2
+ export type McpConnectingEvent = {
3
+ serverNames: string[];
4
+ };
5
+ export declare function formatMCPConnectingMessage(serverNames: string[]): string;
6
+ /**
7
+ * Runtime validator for the cross-module event payload. The event bus is
8
+ * untyped at runtime, so the subscriber verifies the shape before formatting
9
+ * rather than trusting a cast — a malformed emit is ignored instead of throwing.
10
+ */
11
+ export declare function isMcpConnectingEvent(data: unknown): data is McpConnectingEvent;
@@ -1,5 +1,6 @@
1
1
  import type { ModelRegistry } from "../config/model-registry";
2
2
  import type { Settings } from "../config/settings";
3
+ import type { MemoryBackendSaveInput, MemoryBackendSaveResult } from "../memory-backend/types";
3
4
  import type { AgentSession } from "../session/agent-session";
4
5
  /**
5
6
  * Start the background memory startup pipeline.
@@ -26,3 +27,9 @@ export declare function clearMemoryData(agentDir: string, cwd: string): Promise<
26
27
  */
27
28
  export declare function enqueueMemoryConsolidation(agentDir: string, cwd: string, sourceUpdatedAt?: number): void;
28
29
  export declare function getMemoryRoot(agentDir: string, cwd: string): string;
30
+ /**
31
+ * Append one lesson to the project's `learned.md` (newest-first, deduped,
32
+ * capped, secret-redacted, injection-neutralized). The file backs the `learn`
33
+ * tool when `memory.backend` is `local`.
34
+ */
35
+ export declare function saveLearnedLesson(agentDir: string, cwd: string, input: MemoryBackendSaveInput): Promise<MemoryBackendSaveResult>;
@@ -2,8 +2,9 @@ import type { MemoryBackend } from "./types";
2
2
  /**
3
3
  * Wraps the existing `memories/` module as a `MemoryBackend`.
4
4
  *
5
- * No behavioural change every call delegates to the legacy entry points so
6
- * the local memory pipeline (rollout summarisation SQLite → memory_summary.md)
7
- * keeps working exactly as before.
5
+ * The rollout-summarisation pipeline (rollouts SQLite memory_summary.md) is
6
+ * delegated unchanged. On top of it, `save()` persists `learn`-tool lessons to
7
+ * `learned.md` (so `status()` reports `writable: true`); structured search is
8
+ * still unavailable.
8
9
  */
9
10
  export declare const localBackend: MemoryBackend;
@@ -28,4 +28,32 @@ export interface MnemopiBackendConfig {
28
28
  llmModel?: string;
29
29
  }
30
30
  export declare function loadMnemopiConfig(settings: Settings, agentDir: string): MnemopiBackendConfig;
31
+ export interface MnemopiBankScope {
32
+ baseBank: string;
33
+ bank: string;
34
+ globalBank: string;
35
+ retainBank: string;
36
+ recallBanks: readonly string[];
37
+ }
38
+ /**
39
+ * Resolve write/recall banks for a session.
40
+ *
41
+ * Mnemopi has no tag-filtered recall, so `per-project-tagged` maps to a
42
+ * project-local write bank plus a shared recall-visible bank. The project
43
+ * bank is derived purely from {@link cwd} — see {@link projectBank} for the
44
+ * stability contract.
45
+ */
46
+ export declare function computeMnemopiBankScope(configured: string | undefined, cwd: string, scoping: MnemopiScoping): MnemopiBankScope;
47
+ /**
48
+ * Discover sibling banks under `<dbDir>/banks/` whose `working_memory` rows
49
+ * all carry the active `cwd` in `metadata_json.$.cwd`, and add those safe
50
+ * single-cwd banks to the recall set. This rescues memories stranded by a
51
+ * previous, less-stable bank derivation (#2412) without recalling mixed-cwd
52
+ * legacy banks wholesale under per-project isolation.
53
+ *
54
+ * Robust by design: a missing banks directory, unreadable bank dir, or
55
+ * corrupt SQLite file is silently skipped. Scanning is capped at
56
+ * {@link LEGACY_BANK_SCAN_LIMIT} to bound startup cost.
57
+ */
58
+ export declare function extendRecallWithLegacyBanks(resolved: readonly string[], dbPath: string, cwd: string): readonly string[];
31
59
  export declare function truncateApproxTokens(text: string, tokenLimit: number): string;
@@ -1,4 +1,4 @@
1
- import { type Agent, type AgentSideConnection, type AuthenticateRequest, type AuthenticateResponse, type ClientCapabilities, type CloseSessionRequest, type CloseSessionResponse, type ForkSessionRequest, type ForkSessionResponse, type InitializeRequest, type InitializeResponse, type ListSessionsRequest, type ListSessionsResponse, type LoadSessionRequest, type LoadSessionResponse, type NewSessionRequest, type NewSessionResponse, type PromptRequest, type PromptResponse, type ResumeSessionRequest, type ResumeSessionResponse, type SetSessionConfigOptionRequest, type SetSessionConfigOptionResponse, type SetSessionModelRequest, type SetSessionModelResponse, type SetSessionModeRequest, type SetSessionModeResponse } from "@agentclientprotocol/sdk";
1
+ import { type Agent, type AgentSideConnection, type AuthenticateRequest, type AuthenticateResponse, type ClientCapabilities, type CloseSessionRequest, type CloseSessionResponse, type ForkSessionRequest, type ForkSessionResponse, type InitializeRequest, type InitializeResponse, type ListSessionsRequest, type ListSessionsResponse, type LoadSessionRequest, type LoadSessionResponse, type NewSessionRequest, type NewSessionResponse, type PromptRequest, type PromptResponse, type ResumeSessionRequest, type ResumeSessionResponse, type SetSessionConfigOptionRequest, type SetSessionConfigOptionResponse, type SetSessionModeRequest, type SetSessionModeResponse } from "@agentclientprotocol/sdk";
2
2
  import { type ExtensionUIContext } from "../../extensibility/extensions";
3
3
  import type { AgentSession } from "../../session/agent-session";
4
4
  /**
@@ -42,7 +42,6 @@ export declare class AcpAgent implements Agent {
42
42
  closeSession(params: CloseSessionRequest): Promise<CloseSessionResponse>;
43
43
  setSessionMode(params: SetSessionModeRequest): Promise<SetSessionModeResponse>;
44
44
  setSessionConfigOption(params: SetSessionConfigOptionRequest): Promise<SetSessionConfigOptionResponse>;
45
- unstable_setSessionModel(params: SetSessionModelRequest): Promise<SetSessionModelResponse>;
46
45
  prompt(params: PromptRequest): Promise<PromptResponse>;
47
46
  cancel(params: {
48
47
  sessionId: string;
@@ -52,6 +52,12 @@ export interface AgentHubDeps {
52
52
  export declare class AgentHubOverlayComponent extends Container {
53
53
  #private;
54
54
  constructor(deps: AgentHubDeps);
55
+ /**
56
+ * Whether the table view has no agents to show (every registered agent except
57
+ * Main, after the persisted-subagent scan in the constructor). The double-←
58
+ * gesture reads this to stay inert when there is nothing to open.
59
+ */
60
+ get isEmpty(): boolean;
55
61
  /** Tear down every subscription and timer. Called by the overlay owner on close. */
56
62
  dispose(): void;
57
63
  render(width: number): readonly string[];
@@ -1,4 +1,4 @@
1
- import type { AssistantMessage, ImageContent, Usage } from "@oh-my-pi/pi-ai";
1
+ import type { AssistantMessage, ImageContent } from "@oh-my-pi/pi-ai";
2
2
  import { Container, type ImageBudget } from "@oh-my-pi/pi-tui";
3
3
  import type { AssistantThinkingRenderer } from "../../extensibility/extensions/types";
4
4
  /**
@@ -22,7 +22,6 @@ export declare class AssistantMessageComponent extends Container {
22
22
  getTranscriptBlockVersion(): number;
23
23
  markTranscriptBlockFinalized(): void;
24
24
  setToolResultImages(toolCallId: string, images: ImageContent[]): void;
25
- setUsageInfo(usage: Usage): void;
26
25
  updateContent(message: AssistantMessage, opts?: {
27
26
  transient?: boolean;
28
27
  }): void;
@@ -1,5 +1,5 @@
1
1
  import { type Component } from "@oh-my-pi/pi-tui";
2
- import type { CompactionSummaryMessage } from "../../session/messages";
2
+ import type { CompactionSummaryMessage, CustomMessage } from "../../session/messages";
3
3
  /**
4
4
  * Compaction point in the transcript, rendered as a slim horizontal divider:
5
5
  *
@@ -17,3 +17,17 @@ export declare class CompactionSummaryMessageComponent implements Component {
17
17
  invalidate(): void;
18
18
  render(width: number): readonly string[];
19
19
  }
20
+ /**
21
+ * Handoff is a compaction strategy too, but it is persisted as a custom message
22
+ * so the LLM sees the handoff-specific developer context. Render it with the
23
+ * same divider affordance as `/compact` instead of the generic `[handoff]` box.
24
+ */
25
+ export declare class HandoffSummaryMessageComponent implements Component {
26
+ #private;
27
+ private readonly message;
28
+ constructor(message: CustomMessage<unknown>);
29
+ setExpanded(expanded: boolean): void;
30
+ invalidate(): void;
31
+ render(width: number): readonly string[];
32
+ }
33
+ export declare function createHandoffSummaryMessageComponent(message: CustomMessage<unknown>, expanded: boolean): HandoffSummaryMessageComponent | undefined;
@@ -1,6 +1,13 @@
1
1
  import { Editor, type KeyId } from "@oh-my-pi/pi-tui";
2
2
  import type { AppKeybinding } from "../../config/keybindings";
3
3
  type ConfigurableEditorAction = Extract<AppKeybinding, "app.interrupt" | "app.clear" | "app.exit" | "app.suspend" | "app.display.reset" | "app.thinking.cycle" | "app.model.cycleForward" | "app.model.cycleBackward" | "app.model.select" | "app.model.selectTemporary" | "app.tools.expand" | "app.thinking.toggle" | "app.editor.external" | "app.history.search" | "app.message.dequeue" | "app.clipboard.pasteImage" | "app.clipboard.pasteTextRaw" | "app.clipboard.copyPrompt">;
4
+ /** Plain spaces from one auto-repeat run that trigger the space-hold push-to-talk STT gesture.
5
+ * Holding the space bar makes the terminal emit a burst of spaces; once more than this many land
6
+ * in the editor we treat it as "space held", track them back out, and start recording. */
7
+ export declare const SPACE_HOLD_THRESHOLD = 5;
8
+ /** Idle gap (ms) after the last repeated space that counts as the space bar being released, ending
9
+ * the push-to-talk recording. Must comfortably exceed the OS key-repeat interval. */
10
+ export declare const SPACE_HOLD_RELEASE_MS = 250;
4
11
  export declare function extractBracketedImagePastePaths(data: string): string[] | undefined;
5
12
  export declare function extractBracketedImagePastePath(data: string): string | undefined;
6
13
  /**
@@ -12,10 +19,32 @@ export declare class CustomEditor extends Editor {
12
19
  /** Treat image/paste markers as indivisible: a stray backspace deletes the whole token
13
20
  * instead of corrupting `[Paste #1, +30 lines]` into plain text. */
14
21
  atomicTokenPattern: RegExp;
22
+ /** Magic-keyword shimmer cadence — drives one editor repaint every 70 ms while
23
+ * a keyword is on screen and the prompt is focused. ~14 frames/s is smooth
24
+ * without flooding the renderer. */
25
+ static readonly SHIMMER_FRAME_MS = 70;
26
+ /** Time for the gradient to sweep one full cycle across each keyword. */
27
+ static readonly SHIMMER_PERIOD_MS = 1800;
15
28
  /** Gradient-highlight the "ultrathink" / "orchestrate" / "workflowz" keywords as the user types
16
29
  * them, skipping any occurrence inside code spans, fenced blocks, or XML sections. Also make
17
- * pasted image placeholders visually distinct and hyperlink them once their blob file exists. */
30
+ * pasted image placeholders visually distinct and hyperlink them once their blob file exists.
31
+ * When the editor is focused, the buffer contains a magic keyword, and `magicKeywords.enabled`
32
+ * is on, the gradient shifts every frame to produce a Claude-Code-style shimmer; each render
33
+ * schedules the next frame, so losing focus, deleting the keyword, or flipping the setting
34
+ * stops the animation on its own. The static glow itself runs even when shimmering is gated
35
+ * off, matching existing behavior for the editor and sent bubbles. */
18
36
  decorateText: (text: string) => string;
37
+ /** Optional test/host override for the magic-keyword shimmer gate. When
38
+ * defined, takes precedence over the global `magicKeywords.enabled` setting,
39
+ * letting tests assert the gating behaviour without mutating the
40
+ * process-wide Settings singleton (which races with parallel test files —
41
+ * see issue #2582). Production wires this through the host's Settings
42
+ * reader and updates it on the relevant setting change. */
43
+ magicKeywordsEnabledOverride: boolean | undefined;
44
+ /** Bind the host's render request callback. Idempotent — the host wires this
45
+ * once after construction (and again after `setEditorComponent` swaps the
46
+ * editor). Passing `undefined` clears any pending frame. */
47
+ setShimmerRepaintHandler(handler: (() => void) | undefined): void;
19
48
  onEscape?: () => void;
20
49
  onClear?: () => void;
21
50
  onExit?: () => void;
@@ -44,6 +73,15 @@ export declare class CustomEditor extends Editor {
44
73
  onCapsLock?: () => void;
45
74
  /** Called when left-arrow is pressed while the editor is empty (cursor necessarily at start). */
46
75
  onLeftAtStart?: () => void;
76
+ /** Fired when a sustained space-bar hold is recognized — the push-to-talk STT start. The
77
+ * optimistically-typed spaces have already been deleted by the time this runs. */
78
+ onSpaceHoldStart?: () => void;
79
+ /** Fired when the held space bar is released (detected as an idle gap with no further repeated
80
+ * spaces) — the push-to-talk STT stop. */
81
+ onSpaceHoldEnd?: () => void;
82
+ /** Gate for the space-hold gesture. Returns false to keep the space bar inserting spaces
83
+ * normally; wired to `stt.enabled` so disabling STT restores plain space behavior. */
84
+ sttHoldEnabled?: () => boolean;
47
85
  setActionKeys(action: ConfigurableEditorAction, keys: KeyId[]): void;
48
86
  /**
49
87
  * Register a custom key handler. Extensions use this for shortcuts.
@@ -15,6 +15,7 @@ export * from "./hook-message";
15
15
  export * from "./hook-selector";
16
16
  export * from "./keybinding-hints";
17
17
  export * from "./login-dialog";
18
+ export * from "./logout-account-selector";
18
19
  export * from "./model-selector";
19
20
  export * from "./oauth-selector";
20
21
  export * from "./queue-mode-selector";
@@ -0,0 +1,8 @@
1
+ import { Container } from "@oh-my-pi/pi-tui";
2
+ import type { LogoutAccount } from "../../slash-commands/helpers/logout";
3
+ /** Account picker for `/logout` after the provider has been selected. */
4
+ export declare class LogoutAccountSelectorComponent extends Container {
5
+ #private;
6
+ constructor(providerName: string, accounts: LogoutAccount[], onSelect: (account: LogoutAccount) => void, onCancel: () => void);
7
+ handleInput(keyData: string): void;
8
+ }
@@ -1,5 +1,5 @@
1
1
  import { type Component, Container } from "@oh-my-pi/pi-tui";
2
- import type { SessionInfo } from "../../session/session-manager";
2
+ import type { SessionInfo } from "../../session/session-listing";
3
3
  /** Returns the IDs of sessions whose recorded prompts match a query, best first. */
4
4
  export type SessionHistoryMatcher = (query: string) => string[];
5
5
  /**
@@ -40,13 +40,17 @@ export declare class StatusLineComponent implements Component {
40
40
  */
41
41
  refreshUsageInBackground(): void;
42
42
  /**
43
- * Compute the (cached) used-tokens / context-window totals for the
44
- * status-line context% segment. Exposed (non-private) so unit tests can
45
- * verify the incremental-cache invariants; not part of any external
46
- * API.
43
+ * Used-tokens / context-window totals for the status-line context% segment,
44
+ * memoized so the per-event redraw stays O(1) when nothing changed.
45
+ *
46
+ * The numerator comes from `session.getContextUsage()`, which anchors on the
47
+ * last assistant's real prompt-token count — so the bar matches the provider
48
+ * and the `/context` panel — and reports `null` while that count is unknown
49
+ * (right after compaction, before the next response). Exposed (non-private)
50
+ * for unit tests and the collab host's state broadcast.
47
51
  */
48
52
  getCachedContextBreakdown(): {
49
- usedTokens: number;
53
+ usedTokens: number | null;
50
54
  contextWindow: number;
51
55
  };
52
56
  getTopBorder(width: number): {
@@ -70,7 +70,8 @@ export interface SegmentContext {
70
70
  cost: number;
71
71
  tokensPerSecond: number | null;
72
72
  };
73
- contextPercent: number;
73
+ /** Context usage percent, or null when unknown (e.g. right after compaction). */
74
+ contextPercent: number | null;
74
75
  contextWindow: number;
75
76
  autoCompactEnabled: boolean;
76
77
  subagentCount: number;