@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,9 +5,26 @@ export interface RecordingHandle {
5
5
  * Returns available recording tools in priority order.
6
6
  */
7
7
  export declare function detectRecordingTools(): string[];
8
+ export interface ResolvedRecorder {
9
+ tool: "sox" | "ffmpeg" | "arecord" | "powershell";
10
+ bin: string;
11
+ }
12
+ export declare function detectRecorder(): ResolvedRecorder | null;
13
+ /**
14
+ * Ensure a recorder is available, downloading the static ffmpeg binary when
15
+ * nothing is already present. Returns the resolved recorder.
16
+ */
17
+ export declare function ensureRecorder(onProgress?: (p: {
18
+ stage: string;
19
+ percent?: number;
20
+ }) => void, signal?: AbortSignal): Promise<ResolvedRecorder>;
8
21
  export declare function startRecording(outputPath: string): Promise<RecordingHandle>;
9
22
  /**
10
23
  * Verify a recorded audio file is usable.
11
24
  * Returns the file size in bytes, or throws.
12
25
  */
13
26
  export declare function verifyRecordingFile(filePath: string): Promise<number>;
27
+ export interface StreamingRecordingHandle {
28
+ stop(): Promise<void>;
29
+ }
30
+ export declare function startStreamingRecording(onAudio: (samples: Float32Array) => void): Promise<StreamingRecordingHandle | null>;
@@ -3,9 +3,15 @@ interface ToggleOptions {
3
3
  showWarning(msg: string): void;
4
4
  showStatus(msg: string): void;
5
5
  onStateChange(state: SttState): void;
6
+ /** Force a redraw after async edits to the composer (live segment/preview inserts). */
7
+ requestRender?(): void;
6
8
  }
9
+ /** The slice of the composer editor the controller drives. */
7
10
  interface Editor {
8
11
  insertText(text: string): void;
12
+ setVolatileText(text: string): void;
13
+ clearVolatileText(): void;
14
+ commitVolatileText(text: string): void;
9
15
  }
10
16
  export declare class STTController {
11
17
  #private;
@@ -4,13 +4,11 @@ export interface TranscribeOptions {
4
4
  signal?: AbortSignal;
5
5
  }
6
6
  /**
7
- * Find a usable Python command.
8
- */
9
- export declare function resolvePython(): string | null;
10
- /**
11
- * Transcribe a WAV file using Python openai-whisper.
7
+ * Transcribe a WAV file using the local ONNX Whisper worker.
12
8
  *
13
- * Reads the WAV via Python's built-in `wave` module (no ffmpeg needed),
14
- * resamples to 16 kHz mono, and passes the numpy array directly to whisper.
9
+ * Decodes the WAV to a 16 kHz mono Float32Array in-process (no Python, no
10
+ * ffmpeg) and routes it to the warm speech worker, which keeps the model loaded
11
+ * across calls. Honors `options.signal` (abort) and applies an internal timeout
12
+ * with the same semantics as the previous Python path.
15
13
  */
16
14
  export declare function transcribe(audioPath: string, options?: TranscribeOptions): Promise<string>;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Minimal WAV (RIFF/PCM) decoder producing the Float32Array @ 16 kHz mono that
3
+ * transformers.js `automatic-speech-recognition` expects. Ports the decode/
4
+ * mono-mix/resample logic from the retired Python `transcribe.py` (which read
5
+ * via the stdlib `wave` module) so STT no longer shells out to Python.
6
+ *
7
+ * Supported sample formats: PCM uint8 (8-bit), int16 (16-bit), int32 (32-bit),
8
+ * and IEEE float32 (format tag 3). Any number of channels is mixed down to mono.
9
+ */
10
+ /** transformers.js Whisper feature extractor operates at 16 kHz. */
11
+ export declare const TARGET_SAMPLE_RATE = 16000;
12
+ /**
13
+ * Resample via linear interpolation, mirroring the Python `np.interp` over
14
+ * `linspace(0, n-1, targetLen)` against `arange(n)`.
15
+ */
16
+ export declare function resampleLinear(input: Float32Array, fromRate: number, toRate: number): Float32Array;
17
+ /**
18
+ * Decode a WAV byte buffer into a 16 kHz mono Float32Array suitable for the
19
+ * transformers.js Whisper pipeline.
20
+ */
21
+ export declare function decodeWavToMono16k(buffer: ArrayBuffer): Float32Array;
22
+ /**
23
+ * Decode interleaved little-endian signed 16-bit PCM bytes into normalized
24
+ * [-1, 1] mono float samples. The live recorder streams raw s16le frames from
25
+ * sox/ffmpeg/arecord stdout (no RIFF container), so this is the hot-path
26
+ * counterpart to {@link decodeWavToMono16k}. `bytes` MUST be 2-byte aligned;
27
+ * callers buffer any trailing odd byte across chunk boundaries.
28
+ */
29
+ export declare function decodePcmS16LE(bytes: Uint8Array): Float32Array;
@@ -78,6 +78,10 @@ export interface BuildSystemPromptOptions {
78
78
  mcpDiscoveryServerSummaries?: string[];
79
79
  /** Encourage the agent to delegate via tasks unless changes are trivial. */
80
80
  eagerTasks?: boolean;
81
+ /** When true, the Eager Tasks section uses the hard MUST/ONLY wording (`task.eager: always`) rather than the softer `preferred` nudge. */
82
+ eagerTasksAlways?: boolean;
83
+ /** Whether `task.batch` is enabled; gates batch-call guidance in the Eager Tasks section. */
84
+ taskBatch?: boolean;
81
85
  /** Rules with alwaysApply=true — their full content is injected into the prompt. */
82
86
  alwaysApplyRules?: AlwaysApplyRule[];
83
87
  /** Whether secret obfuscation is active. When true, explains the redaction format in the prompt. */
@@ -51,6 +51,8 @@ export interface ExecutorOptions {
51
51
  content: string;
52
52
  };
53
53
  description?: string;
54
+ /** Specialist role/expertise for this spawn; drives the system-prompt preamble, display name, and telemetry identity. */
55
+ role?: string;
54
56
  index: number;
55
57
  id: string;
56
58
  parentToolCallId?: string;
@@ -1,7 +1,7 @@
1
1
  import type { AgentTool, AgentToolResult, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
2
2
  import type { ToolSession } from "..";
3
3
  import type { Theme } from "../modes/theme/theme";
4
- import { type AgentDefinition, type SingleResult, type TaskToolDetails, type TaskToolSchemaInstance } from "./types";
4
+ import { type AgentDefinition, type SingleResult, type TaskItem, type TaskToolDetails, type TaskToolSchemaInstance } from "./types";
5
5
  import "../tools/review";
6
6
  import { renderResult, renderCall as renderTaskCall } from "./render";
7
7
  export { loadBundledAgents as BUNDLED_AGENTS } from "./agents";
@@ -18,6 +18,14 @@ export declare function isReadOnlyAgent(agent: AgentDefinition): boolean;
18
18
  * tell a no-op child from one that burned requests before being cancelled.
19
19
  */
20
20
  export declare function formatResultOutputFallback(result: Pick<SingleResult, "output" | "stderr" | "requests">): string;
21
+ /**
22
+ * Advisory — never a rejection — nudging the spawner toward tailored
23
+ * specialists when it spawns generic role-less workers and still holds spawn
24
+ * capacity (DepthCapacity: it currently has the `task` tool). Fires when a
25
+ * generic `task`/`quick_task` spawn carries no `role`, or when one call clones
26
+ * the same agent ≥2× all without roles. Returns undefined when no nudge applies.
27
+ */
28
+ export declare function buildSpecializationAdvisory(agentName: string | undefined, items: TaskItem[], depthCapacity: boolean): string | undefined;
21
29
  /**
22
30
  * Task tool - Delegate tasks to specialized agents.
23
31
  *
@@ -1,6 +1,6 @@
1
1
  import type { ThinkingLevel } from "@oh-my-pi/pi-agent-core";
2
2
  import type { Usage } from "@oh-my-pi/pi-ai";
3
- import * as z from "zod/v4";
3
+ import { z } from "zod/v4";
4
4
  import type { AgentSessionEvent } from "../session/agent-session";
5
5
  import type { NestedRepoPatch } from "./worktree";
6
6
  /** Source of an agent definition */
@@ -51,9 +51,14 @@ export interface SubagentLifecyclePayload {
51
51
  */
52
52
  detached?: boolean;
53
53
  }
54
+ /** Display cap for a normalized one-line label (roster line, registry `displayName`, prompt field). */
55
+ export declare const ROLE_LABEL_MAX = 80;
56
+ /** Schema bound on the raw `role` input, before it is label-normalized at every use site. */
57
+ export declare const ROLE_INPUT_MAX = 256;
54
58
  export declare const taskItemSchema: z.ZodObject<{
55
59
  id: z.ZodOptional<z.ZodString>;
56
60
  description: z.ZodOptional<z.ZodString>;
61
+ role: z.ZodOptional<z.ZodString>;
57
62
  assignment: z.ZodString;
58
63
  }, z.core.$strip>;
59
64
  /** Single task item. Fields are optional defensively: args stream in token by token. */
@@ -62,6 +67,8 @@ export interface TaskItem {
62
67
  id?: string;
63
68
  /** UI label, not seen by the subagent. */
64
69
  description?: string;
70
+ /** Specialist role/expertise this subagent embodies; shapes its system-prompt identity and display name. */
71
+ role?: string;
65
72
  /** The work; required by the schema. */
66
73
  assignment?: string;
67
74
  /** Run this spawn in an isolated worktree (batch form; flat form carries it top-level). */
@@ -70,6 +77,7 @@ export interface TaskItem {
70
77
  export declare const taskSchema: z.ZodObject<{
71
78
  id: z.ZodOptional<z.ZodString>;
72
79
  description: z.ZodOptional<z.ZodString>;
80
+ role: z.ZodOptional<z.ZodString>;
73
81
  assignment: z.ZodString;
74
82
  isolated: z.ZodOptional<z.ZodBoolean>;
75
83
  agent: z.ZodString;
@@ -77,12 +85,14 @@ export declare const taskSchema: z.ZodObject<{
77
85
  declare const ALL_TASK_SCHEMAS: readonly [z.ZodObject<{
78
86
  id: z.ZodOptional<z.ZodString>;
79
87
  description: z.ZodOptional<z.ZodString>;
88
+ role: z.ZodOptional<z.ZodString>;
80
89
  assignment: z.ZodString;
81
90
  isolated: z.ZodOptional<z.ZodBoolean>;
82
91
  agent: z.ZodString;
83
92
  }, z.core.$strip>, z.ZodObject<{
84
93
  id: z.ZodOptional<z.ZodString>;
85
94
  description: z.ZodOptional<z.ZodString>;
95
+ role: z.ZodOptional<z.ZodString>;
86
96
  assignment: z.ZodString;
87
97
  agent: z.ZodString;
88
98
  }, z.core.$strip>, z.ZodObject<{
@@ -91,6 +101,7 @@ declare const ALL_TASK_SCHEMAS: readonly [z.ZodObject<{
91
101
  tasks: z.ZodArray<z.ZodObject<{
92
102
  id: z.ZodOptional<z.ZodString>;
93
103
  description: z.ZodOptional<z.ZodString>;
104
+ role: z.ZodOptional<z.ZodString>;
94
105
  assignment: z.ZodString;
95
106
  isolated: z.ZodOptional<z.ZodBoolean>;
96
107
  }, z.core.$strip>>;
@@ -100,6 +111,7 @@ declare const ALL_TASK_SCHEMAS: readonly [z.ZodObject<{
100
111
  tasks: z.ZodArray<z.ZodObject<{
101
112
  id: z.ZodOptional<z.ZodString>;
102
113
  description: z.ZodOptional<z.ZodString>;
114
+ role: z.ZodOptional<z.ZodString>;
103
115
  assignment: z.ZodString;
104
116
  }, z.core.$strip>>;
105
117
  }, z.core.$strip>];
@@ -124,6 +136,8 @@ export interface TaskParams {
124
136
  id?: string;
125
137
  /** UI label (flat form), not seen by the subagent. */
126
138
  description?: string;
139
+ /** Specialist role/expertise this subagent embodies; shapes its system-prompt identity and display name. */
140
+ role?: string;
127
141
  /** The work (flat form). */
128
142
  assignment?: string;
129
143
  /** Batch form (`task.batch`): one subagent per item. */
@@ -133,6 +147,28 @@ export interface TaskParams {
133
147
  /** Run in an isolated worktree (flat form; per-item in batch form). */
134
148
  isolated?: boolean;
135
149
  }
150
+ /**
151
+ * One-line, length-capped label safe for a single roster line, a registry
152
+ * `displayName`, or a system-prompt field. Collapses every run of whitespace
153
+ * AND control/format characters — including U+0085 NEL, ESC/ANSI, and the
154
+ * zero-width separators that `\s` misses — to a single space, then caps length.
155
+ * So untrusted text (a spawn `role`, a peer activity gist) can neither break the
156
+ * line, inject prompt structure, nor smuggle terminal escapes. Caps at `max`
157
+ * characters (clamped to >= 1; default `ROLE_LABEL_MAX`), appending an ellipsis when truncated.
158
+ */
159
+ export declare function oneLineLabel(text: string, max?: number): string;
160
+ /**
161
+ * Display name for a spawned subagent: its tailored `role` (label-normalized)
162
+ * when one is given, else the agent type's name. Empty/whitespace roles fall
163
+ * back to the agent name.
164
+ */
165
+ export declare function resolveSubagentDisplayName(role: string | undefined, agentName: string): string;
166
+ /**
167
+ * Whether an agent at `taskDepth` may still spawn children — i.e. it currently
168
+ * holds the `task` tool. Mirrors the task-tool availability gate;
169
+ * `maxRecursionDepth < 0` disables the cap entirely.
170
+ */
171
+ export declare function canSpawnAtDepth(maxRecursionDepth: number, taskDepth: number): boolean;
136
172
  /** A code review finding reported by the reviewer agent */
137
173
  export interface ReviewFinding {
138
174
  title: string;
@@ -16,7 +16,7 @@
16
16
  */
17
17
  import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
18
18
  import { type Component } from "@oh-my-pi/pi-tui";
19
- import * as z from "zod/v4";
19
+ import { z } from "zod/v4";
20
20
  import type { RenderResultOptions } from "../extensibility/custom-tools/types";
21
21
  import { type Theme } from "../modes/theme/theme";
22
22
  import type { ToolSession } from ".";
@@ -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 ".";
@@ -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 ".";
@@ -1,6 +1,6 @@
1
1
  import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback, ToolApprovalDecision } 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 ".";
@@ -124,7 +124,7 @@ export declare function createShellRenderer<TArgs>(config: ShellRendererConfig<T
124
124
  }, uiTheme: Theme, args?: TArgs): Component;
125
125
  mergeCallAndResult: boolean;
126
126
  inline: boolean;
127
- provisionalPendingPreview: boolean;
127
+ provisionalPendingPreview: string;
128
128
  };
129
129
  export declare const bashToolRenderer: {
130
130
  renderCall(args: BashRenderArgs, options: RenderResultOptions, uiTheme: Theme): Component;
@@ -140,6 +140,6 @@ export declare const bashToolRenderer: {
140
140
  }, uiTheme: Theme, args?: BashRenderArgs | undefined): Component;
141
141
  mergeCallAndResult: boolean;
142
142
  inline: boolean;
143
- provisionalPendingPreview: boolean;
143
+ provisionalPendingPreview: string;
144
144
  };
145
145
  export {};
@@ -0,0 +1,202 @@
1
+ import { JsRuntime } from "../../../eval/js/shared/runtime";
2
+ import type { ToolSession } from "../../../sdk";
3
+ import { type ReadableFormat } from "../readable";
4
+ import type { Observation, ReadyInfo, RunResultOk, ScreenshotResult, SessionSnapshot } from "../tab-protocol";
5
+ import type { CmuxSocketClient } from "./socket-client";
6
+ interface ScreenshotOptions {
7
+ selector?: string;
8
+ fullPage?: boolean;
9
+ save?: string;
10
+ silent?: boolean;
11
+ encoding?: "base64" | "binary";
12
+ }
13
+ interface ObserveOptions {
14
+ includeAll?: boolean;
15
+ viewportOnly?: boolean;
16
+ }
17
+ interface RunContext {
18
+ session: SessionSnapshot;
19
+ displays: RunResultOk["displays"];
20
+ screenshots: ScreenshotResult[];
21
+ signal?: AbortSignal;
22
+ timeoutMs: number;
23
+ }
24
+ type WaitUntil = "load" | "domcontentloaded" | "networkidle0" | "networkidle2";
25
+ type DragTarget = string | {
26
+ readonly x: number;
27
+ readonly y: number;
28
+ };
29
+ interface BoundingBox {
30
+ x: number;
31
+ y: number;
32
+ width: number;
33
+ height: number;
34
+ }
35
+ interface CmuxResponseRecord {
36
+ id: number;
37
+ url: string;
38
+ status: number;
39
+ statusText: string;
40
+ headers: Record<string, string>;
41
+ body: string;
42
+ }
43
+ interface ViewportOptions {
44
+ width: number;
45
+ height: number;
46
+ deviceScaleFactor?: number;
47
+ }
48
+ export interface RunCmuxCodeOptions {
49
+ code: string;
50
+ timeoutMs: number;
51
+ signal?: AbortSignal;
52
+ session: ToolSession;
53
+ snapshot: SessionSnapshot;
54
+ }
55
+ export declare class CmuxTab {
56
+ #private;
57
+ constructor(opts: {
58
+ client: CmuxSocketClient;
59
+ surfaceId: string;
60
+ url?: string;
61
+ title?: string;
62
+ });
63
+ get surfaceId(): string;
64
+ get page(): CmuxPageFacade;
65
+ get browser(): CmuxBrowserFacade;
66
+ viewport(): ReadyInfo["viewport"];
67
+ setViewport(viewport: ViewportOptions): Promise<void>;
68
+ url(): string;
69
+ title(): Promise<string>;
70
+ readyInfo(viewport?: ReadyInfo["viewport"]): Promise<ReadyInfo>;
71
+ setRunContext(context: RunContext): void;
72
+ clearRunContext(): void;
73
+ goto(url: string, opts?: {
74
+ waitUntil?: WaitUntil;
75
+ timeoutMs?: number;
76
+ }): Promise<void>;
77
+ observe(opts?: ObserveOptions): Promise<Observation>;
78
+ click(selector: string): Promise<void>;
79
+ dblclick(selector: string): Promise<void>;
80
+ hover(selector: string): Promise<void>;
81
+ focus(selector: string): Promise<void>;
82
+ check(selector: string): Promise<void>;
83
+ uncheck(selector: string): Promise<void>;
84
+ type(selector: string, text: string): Promise<void>;
85
+ fill(selector: string, value: string): Promise<void>;
86
+ press(key: string, opts?: {
87
+ selector?: string;
88
+ }): Promise<void>;
89
+ scroll(dx: number, dy: number): Promise<void>;
90
+ waitFor(selector: string, opts?: {
91
+ timeout?: number;
92
+ }): Promise<CmuxElementHandle>;
93
+ evaluate<TResult, TArgs extends unknown[]>(fn: string | ((...args: TArgs) => TResult | Promise<TResult>), ...args: TArgs): Promise<TResult>;
94
+ scrollIntoView(selector: string): Promise<void>;
95
+ select(selector: string, ...values: string[]): Promise<string[]>;
96
+ extract(format?: ReadableFormat): Promise<string>;
97
+ screenshot(opts?: ScreenshotOptions): Promise<ScreenshotResult>;
98
+ waitForUrl(pattern: string | RegExp, opts?: {
99
+ timeout?: number;
100
+ }): Promise<string>;
101
+ drag(from: DragTarget, to: DragTarget): Promise<void>;
102
+ uploadFile(selector: string, ...filePaths: string[]): Promise<void>;
103
+ waitForResponse(pattern: string | RegExp | ((response: CmuxResponse) => boolean | Promise<boolean>), opts?: {
104
+ timeout?: number;
105
+ }): Promise<CmuxResponse>;
106
+ id(id: number): Promise<CmuxElementHandle>;
107
+ ensureRuntime(session: SessionSnapshot): JsRuntime;
108
+ elementHandle(selector: string): CmuxElementHandle;
109
+ elementExists(selector: string): Promise<boolean>;
110
+ elementBox(selector: string): Promise<BoundingBox | null>;
111
+ evaluateOnSelector<TResult>(selector: string, source: string, args: unknown[]): Promise<TResult>;
112
+ pageContent(): Promise<string>;
113
+ pageScreenshot(opts?: ScreenshotOptions): Promise<Buffer | string>;
114
+ waitForFunction(fn: string | ((...args: unknown[]) => unknown | Promise<unknown>), opts: {
115
+ timeout?: number;
116
+ polling?: number;
117
+ } | undefined, ...args: unknown[]): Promise<unknown>;
118
+ }
119
+ declare class CmuxResponse {
120
+ #private;
121
+ constructor(record: CmuxResponseRecord);
122
+ url(): string;
123
+ status(): number;
124
+ statusText(): string;
125
+ headers(): Record<string, string>;
126
+ text(): Promise<string>;
127
+ json(): Promise<unknown>;
128
+ }
129
+ declare class CmuxElementHandle {
130
+ #private;
131
+ constructor(tab: CmuxTab, selector: string);
132
+ click(): Promise<void>;
133
+ type(text: string): Promise<void>;
134
+ fill(value: string): Promise<void>;
135
+ focus(): Promise<void>;
136
+ hover(): Promise<void>;
137
+ evaluate<TResult, TArgs extends unknown[]>(fn: (element: unknown, ...args: TArgs) => TResult | Promise<TResult>, ...args: TArgs): Promise<TResult>;
138
+ boundingBox(): Promise<BoundingBox | null>;
139
+ uploadFile(...paths: string[]): Promise<void>;
140
+ dispose(): Promise<void>;
141
+ }
142
+ declare class CmuxLocator {
143
+ #private;
144
+ constructor(tab: CmuxTab, selector: string);
145
+ setTimeout(timeoutMs: number): this;
146
+ click(): Promise<void>;
147
+ fill(value: string): Promise<void>;
148
+ waitHandle(): Promise<CmuxElementHandle>;
149
+ }
150
+ declare class CmuxPageFacade {
151
+ #private;
152
+ readonly keyboard: {
153
+ press: (key: string) => Promise<void>;
154
+ };
155
+ readonly mouse: {
156
+ wheel: (delta: {
157
+ deltaX?: number;
158
+ deltaY?: number;
159
+ }) => Promise<void>;
160
+ move: (x: number, y: number) => Promise<void>;
161
+ down: () => Promise<void>;
162
+ up: () => Promise<void>;
163
+ };
164
+ constructor(tab: CmuxTab);
165
+ url(): string;
166
+ title(): Promise<string>;
167
+ viewport(): ReadyInfo["viewport"];
168
+ setViewport(viewport: ViewportOptions): Promise<void>;
169
+ goto(url: string, opts?: {
170
+ waitUntil?: WaitUntil;
171
+ timeout?: number;
172
+ }): Promise<{
173
+ url: string;
174
+ }>;
175
+ evaluate<TResult, TArgs extends unknown[]>(fn: string | ((...args: TArgs) => TResult | Promise<TResult>), ...args: TArgs): Promise<TResult>;
176
+ content(): Promise<string>;
177
+ locator(selector: string): CmuxLocator;
178
+ $(selector: string): Promise<CmuxElementHandle | null>;
179
+ waitForSelector(selector: string, opts?: {
180
+ timeout?: number;
181
+ }): Promise<CmuxElementHandle>;
182
+ waitForFunction(fn: string | ((...args: unknown[]) => unknown | Promise<unknown>), opts?: {
183
+ timeout?: number;
184
+ polling?: number;
185
+ }, ...args: unknown[]): Promise<unknown>;
186
+ waitForResponse(pattern: string | RegExp | ((response: CmuxResponse) => boolean | Promise<boolean>), opts?: {
187
+ timeout?: number;
188
+ }): Promise<CmuxResponse>;
189
+ screenshot(opts?: ScreenshotOptions): Promise<Buffer | string>;
190
+ }
191
+ declare class CmuxBrowserFacade {
192
+ #private;
193
+ connected: boolean;
194
+ constructor(tab: CmuxTab);
195
+ pages(): Promise<CmuxPageFacade[]>;
196
+ version(): Promise<string>;
197
+ wsEndpoint(): string;
198
+ disconnect(): void;
199
+ close(): Promise<void>;
200
+ }
201
+ export declare function runCmuxCode(tab: CmuxTab, opts: RunCmuxCodeOptions): Promise<RunResultOk>;
202
+ export {};
@@ -0,0 +1,70 @@
1
+ import type { Observation } from "../tab-protocol";
2
+ export interface CmuxKind {
3
+ kind: "cmux";
4
+ socketPath: string;
5
+ password?: string;
6
+ surface?: string;
7
+ }
8
+ export interface CmuxOpenSplitResult {
9
+ surface_id?: unknown;
10
+ url?: unknown;
11
+ workspace_id?: unknown;
12
+ created_split?: unknown;
13
+ placement_strategy?: unknown;
14
+ }
15
+ export interface CmuxSnapshotRef {
16
+ role?: unknown;
17
+ name?: unknown;
18
+ }
19
+ export interface CmuxSnapshotPage {
20
+ title?: unknown;
21
+ url?: unknown;
22
+ ready_state?: unknown;
23
+ text?: unknown;
24
+ html?: unknown;
25
+ }
26
+ export interface CmuxSnapshotResult {
27
+ snapshot?: unknown;
28
+ refs?: Record<string, CmuxSnapshotRef>;
29
+ page?: CmuxSnapshotPage;
30
+ url?: unknown;
31
+ title?: unknown;
32
+ ready_state?: unknown;
33
+ surface_id?: unknown;
34
+ }
35
+ export interface CmuxEvalResult {
36
+ value?: unknown;
37
+ surface_id?: unknown;
38
+ content_world?: unknown;
39
+ }
40
+ export interface CmuxUrlGetResult {
41
+ url?: unknown;
42
+ surface_id?: unknown;
43
+ workspace_id?: unknown;
44
+ }
45
+ export interface CmuxScreenshotResult {
46
+ png_base64?: unknown;
47
+ path?: unknown;
48
+ url?: unknown;
49
+ surface_id?: unknown;
50
+ width?: unknown;
51
+ height?: unknown;
52
+ }
53
+ export interface CmuxGeometry {
54
+ innerWidth: number;
55
+ innerHeight: number;
56
+ dpr: number;
57
+ scrollX: number;
58
+ scrollY: number;
59
+ scrollWidth: number;
60
+ scrollHeight: number;
61
+ }
62
+ export declare const GEOMETRY_SCRIPT = "(() => ({ innerWidth: window.innerWidth, innerHeight: window.innerHeight, dpr: window.devicePixelRatio||1, scrollX: window.scrollX, scrollY: window.scrollY, scrollWidth: document.documentElement.scrollWidth, scrollHeight: document.documentElement.scrollHeight }))()";
63
+ export declare function cmuxSnapshotToObservation(result: CmuxSnapshotResult, viewport: Observation["viewport"], geometry: CmuxGeometry): Observation;
64
+ export declare function serializeEval(fn: string | ((...args: unknown[]) => unknown), args: unknown[]): string;
65
+ export declare function mapWaitUntil(waitUntil: string | undefined): "interactive" | "complete";
66
+ export interface ResolveCmuxKindOptions {
67
+ surface?: string;
68
+ settingEnabled?: boolean;
69
+ }
70
+ export declare function resolveCmuxKind(options?: ResolveCmuxKindOptions | null, env?: Record<string, string | undefined>): CmuxKind | null;
@@ -0,0 +1,19 @@
1
+ type CmuxErrorPayload = {
2
+ code?: unknown;
3
+ message?: unknown;
4
+ details?: unknown;
5
+ };
6
+ export declare function formatCmuxError(error: CmuxErrorPayload | undefined): string;
7
+ export declare class CmuxSocketClient {
8
+ #private;
9
+ constructor(opts: {
10
+ socketPath: string;
11
+ password?: string;
12
+ });
13
+ connect(): Promise<void>;
14
+ request(method: string, params: Record<string, unknown>, opts?: {
15
+ timeoutMs?: number;
16
+ }): Promise<Record<string, unknown>>;
17
+ close(): void;
18
+ }
19
+ export {};
@@ -1,7 +1,9 @@
1
1
  import type { Subprocess } from "bun";
2
2
  import type { Browser, CDPSession } from "puppeteer-core";
3
+ import type { CmuxKind } from "./cmux/rpc";
4
+ import { CmuxSocketClient } from "./cmux/socket-client";
3
5
  import { type UserAgentOverride } from "./launch";
4
- export type BrowserKind = {
6
+ export type PuppeteerBrowserKind = {
5
7
  kind: "headless";
6
8
  headless: boolean;
7
9
  } | {
@@ -11,20 +13,30 @@ export type BrowserKind = {
11
13
  kind: "connected";
12
14
  cdpUrl: string;
13
15
  };
16
+ export type BrowserKind = PuppeteerBrowserKind | CmuxKind;
14
17
  export type BrowserKindTag = BrowserKind["kind"];
15
- export interface BrowserHandle {
18
+ interface BrowserHandleCommon {
16
19
  key: string;
17
20
  kind: BrowserKind;
21
+ refCount: number;
22
+ }
23
+ export interface PuppeteerBrowserHandle extends BrowserHandleCommon {
24
+ kind: PuppeteerBrowserKind;
18
25
  browser: Browser;
19
26
  cdpUrl?: string;
20
27
  pid?: number;
21
28
  subprocess?: Subprocess;
22
- refCount: number;
23
29
  stealth: {
24
30
  browserSession: CDPSession | null;
25
31
  override: UserAgentOverride | null;
26
32
  };
27
33
  }
34
+ export interface CmuxBrowserHandle extends BrowserHandleCommon {
35
+ kind: CmuxKind;
36
+ client: CmuxSocketClient;
37
+ surface?: string;
38
+ }
39
+ export type BrowserHandle = PuppeteerBrowserHandle | CmuxBrowserHandle;
28
40
  export interface AcquireBrowserOptions {
29
41
  cwd: string;
30
42
  viewport?: {
@@ -41,3 +53,4 @@ export declare function holdBrowser(handle: BrowserHandle): void;
41
53
  export declare function releaseBrowser(handle: BrowserHandle, opts: {
42
54
  kill: boolean;
43
55
  }): Promise<void>;
56
+ export {};
@@ -20,6 +20,8 @@ interface BrowserRenderArgs {
20
20
  path?: string;
21
21
  cdp_url?: string;
22
22
  target?: string;
23
+ cmux?: boolean;
24
+ surface?: string;
23
25
  };
24
26
  viewport?: {
25
27
  width: number;
@@ -37,6 +37,8 @@ export interface ScreenshotResult {
37
37
  export interface SessionSnapshot {
38
38
  cwd: string;
39
39
  browserScreenshotDir?: string;
40
+ /** Force non-WebP screenshot encoding (e.g. for Ollama). Unset honors `OMP_NO_WEBP`. */
41
+ excludeWebP?: boolean;
40
42
  }
41
43
  export type WorkerInitPayload = {
42
44
  mode: "headless";