@oh-my-pi/pi-coding-agent 15.12.3 → 15.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (457) hide show
  1. package/CHANGELOG.md +347 -7
  2. package/dist/cli.js +1615 -1231
  3. package/dist/types/async/job-manager.d.ts +15 -0
  4. package/dist/types/autolearn/controller.d.ts +25 -0
  5. package/dist/types/autolearn/managed-skills.d.ts +45 -0
  6. package/dist/types/autoresearch/state.d.ts +1 -1
  7. package/dist/types/autoresearch/tools/init-experiment.d.ts +1 -1
  8. package/dist/types/autoresearch/tools/log-experiment.d.ts +1 -1
  9. package/dist/types/autoresearch/tools/run-experiment.d.ts +1 -1
  10. package/dist/types/autoresearch/tools/update-notes.d.ts +1 -1
  11. package/dist/types/autoresearch/types.d.ts +1 -1
  12. package/dist/types/cli/args.d.ts +19 -2
  13. package/dist/types/cli/models-cli.d.ts +49 -0
  14. package/dist/types/cli/session-picker.d.ts +1 -1
  15. package/dist/types/cli/setup-cli.d.ts +1 -1
  16. package/dist/types/cli/setup-model-picker.d.ts +14 -0
  17. package/dist/types/collab/protocol.d.ts +1 -1
  18. package/dist/types/commands/launch.d.ts +0 -3
  19. package/dist/types/commands/models.d.ts +33 -0
  20. package/dist/types/commands/say.d.ts +24 -0
  21. package/dist/types/commands/token.d.ts +25 -0
  22. package/dist/types/commit/agentic/tools/analyze-file.d.ts +1 -1
  23. package/dist/types/commit/agentic/tools/git-file-diff.d.ts +1 -1
  24. package/dist/types/commit/agentic/tools/git-hunk.d.ts +1 -1
  25. package/dist/types/commit/agentic/tools/git-overview.d.ts +1 -1
  26. package/dist/types/commit/agentic/tools/propose-changelog.d.ts +1 -1
  27. package/dist/types/commit/agentic/tools/propose-commit.d.ts +1 -1
  28. package/dist/types/commit/agentic/tools/recent-commits.d.ts +1 -1
  29. package/dist/types/commit/agentic/tools/schemas.d.ts +1 -1
  30. package/dist/types/commit/agentic/tools/split-commit.d.ts +1 -1
  31. package/dist/types/commit/changelog/generate.d.ts +1 -1
  32. package/dist/types/commit/shared-llm.d.ts +1 -1
  33. package/dist/types/config/keybindings.d.ts +3 -3
  34. package/dist/types/config/model-registry.d.ts +17 -0
  35. package/dist/types/config/models-config-schema.d.ts +13 -1
  36. package/dist/types/config/models-config.d.ts +8 -2
  37. package/dist/types/config/settings-schema.d.ts +281 -58
  38. package/dist/types/edit/hashline/params.d.ts +1 -1
  39. package/dist/types/edit/modes/apply-patch.d.ts +1 -1
  40. package/dist/types/edit/modes/patch.d.ts +1 -1
  41. package/dist/types/edit/modes/replace.d.ts +1 -1
  42. package/dist/types/export/html/index.d.ts +2 -1
  43. package/dist/types/extensibility/custom-commands/types.d.ts +2 -2
  44. package/dist/types/extensibility/custom-tools/types.d.ts +2 -2
  45. package/dist/types/extensibility/extensions/model-api.d.ts +17 -0
  46. package/dist/types/extensibility/extensions/runner.d.ts +3 -1
  47. package/dist/types/extensibility/extensions/types.d.ts +49 -3
  48. package/dist/types/extensibility/hooks/index.d.ts +2 -1
  49. package/dist/types/extensibility/hooks/types.d.ts +2 -2
  50. package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +9 -0
  51. package/dist/types/extensibility/plugins/loader.d.ts +11 -0
  52. package/dist/types/extensibility/shared-events.d.ts +1 -1
  53. package/dist/types/extensibility/skills.d.ts +10 -0
  54. package/dist/types/goals/guided-setup.d.ts +18 -0
  55. package/dist/types/goals/state.d.ts +1 -1
  56. package/dist/types/goals/tools/goal-tool.d.ts +1 -1
  57. package/dist/types/hindsight/transcript.d.ts +1 -1
  58. package/dist/types/index.d.ts +5 -0
  59. package/dist/types/internal-urls/local-protocol.d.ts +4 -2
  60. package/dist/types/lsp/types.d.ts +1 -1
  61. package/dist/types/main.d.ts +4 -3
  62. package/dist/types/mcp/manager.d.ts +8 -0
  63. package/dist/types/mcp/startup-events.d.ts +11 -0
  64. package/dist/types/memories/index.d.ts +7 -0
  65. package/dist/types/memory-backend/local-backend.d.ts +4 -3
  66. package/dist/types/mnemopi/config.d.ts +28 -0
  67. package/dist/types/modes/acp/acp-agent.d.ts +1 -2
  68. package/dist/types/modes/components/agent-hub.d.ts +6 -0
  69. package/dist/types/modes/components/assistant-message.d.ts +1 -2
  70. package/dist/types/modes/components/compaction-summary-message.d.ts +15 -1
  71. package/dist/types/modes/components/custom-editor.d.ts +39 -1
  72. package/dist/types/modes/components/custom-editor.test.d.ts +1 -0
  73. package/dist/types/modes/components/index.d.ts +1 -0
  74. package/dist/types/modes/components/logout-account-selector.d.ts +8 -0
  75. package/dist/types/modes/components/session-selector.d.ts +1 -1
  76. package/dist/types/modes/components/status-line/component.d.ts +9 -5
  77. package/dist/types/modes/components/status-line/types.d.ts +2 -1
  78. package/dist/types/modes/components/tool-execution.d.ts +26 -16
  79. package/dist/types/modes/components/transcript-container.d.ts +23 -2
  80. package/dist/types/modes/components/tree-selector.d.ts +1 -1
  81. package/dist/types/modes/components/usage-row.d.ts +3 -0
  82. package/dist/types/modes/controllers/command-controller.d.ts +2 -2
  83. package/dist/types/modes/controllers/event-controller.d.ts +0 -17
  84. package/dist/types/modes/controllers/input-controller.d.ts +14 -0
  85. package/dist/types/modes/controllers/selector-controller.d.ts +3 -1
  86. package/dist/types/modes/gradient-highlight.d.ts +9 -4
  87. package/dist/types/modes/image-references.d.ts +6 -0
  88. package/dist/types/modes/interactive-mode.d.ts +27 -6
  89. package/dist/types/modes/magic-keywords.d.ts +13 -1
  90. package/dist/types/modes/rpc/rpc-mode.d.ts +35 -1
  91. package/dist/types/modes/rpc/rpc-types.d.ts +9 -1
  92. package/dist/types/modes/runtime-init.d.ts +4 -0
  93. package/dist/types/modes/theme/theme.d.ts +13 -2
  94. package/dist/types/modes/types.d.ts +8 -7
  95. package/dist/types/modes/utils/ui-helpers.d.ts +1 -1
  96. package/dist/types/registry/agent-registry.d.ts +17 -0
  97. package/dist/types/secrets/obfuscator.d.ts +1 -1
  98. package/dist/types/session/agent-session.d.ts +28 -35
  99. package/dist/types/session/agent-storage.d.ts +2 -1
  100. package/dist/types/session/indexed-session-storage.d.ts +3 -3
  101. package/dist/types/session/messages.d.ts +8 -10
  102. package/dist/types/session/session-context.d.ts +39 -0
  103. package/dist/types/session/session-entries.d.ts +159 -0
  104. package/dist/types/session/session-listing.d.ts +69 -0
  105. package/dist/types/session/session-loader.d.ts +16 -0
  106. package/dist/types/session/session-manager.d.ts +85 -462
  107. package/dist/types/session/session-migrations.d.ts +12 -0
  108. package/dist/types/session/session-paths.d.ts +25 -0
  109. package/dist/types/session/session-persistence.d.ts +8 -0
  110. package/dist/types/session/session-storage.d.ts +11 -7
  111. package/dist/types/session/snapcompact-inline.d.ts +12 -1
  112. package/dist/types/session/snapcompact-savings-journal.d.ts +46 -0
  113. package/dist/types/session/tool-choice-queue.d.ts +6 -6
  114. package/dist/types/slash-commands/helpers/logout.d.ts +15 -0
  115. package/dist/types/stt/asr-client.d.ts +90 -0
  116. package/dist/types/stt/asr-protocol.d.ts +97 -0
  117. package/dist/types/stt/asr-worker.d.ts +2 -0
  118. package/dist/types/stt/downloader.d.ts +38 -0
  119. package/dist/types/stt/endpointer.d.ts +59 -0
  120. package/dist/types/stt/index.d.ts +5 -1
  121. package/dist/types/stt/models.d.ts +120 -0
  122. package/dist/types/stt/recorder.d.ts +17 -0
  123. package/dist/types/stt/stt-controller.d.ts +6 -0
  124. package/dist/types/stt/transcriber.d.ts +5 -7
  125. package/dist/types/stt/wav.d.ts +29 -0
  126. package/dist/types/system-prompt.d.ts +4 -0
  127. package/dist/types/task/executor.d.ts +2 -0
  128. package/dist/types/task/index.d.ts +9 -1
  129. package/dist/types/task/types.d.ts +37 -1
  130. package/dist/types/tools/ask.d.ts +1 -1
  131. package/dist/types/tools/ast-edit.d.ts +1 -1
  132. package/dist/types/tools/ast-grep.d.ts +1 -1
  133. package/dist/types/tools/bash.d.ts +3 -3
  134. package/dist/types/tools/browser/cmux/cmux-tab.d.ts +202 -0
  135. package/dist/types/tools/browser/cmux/rpc.d.ts +70 -0
  136. package/dist/types/tools/browser/cmux/socket-client.d.ts +19 -0
  137. package/dist/types/tools/browser/registry.d.ts +16 -3
  138. package/dist/types/tools/browser/render.d.ts +2 -0
  139. package/dist/types/tools/browser/tab-protocol.d.ts +2 -0
  140. package/dist/types/tools/browser/tab-supervisor.d.ts +16 -4
  141. package/dist/types/tools/browser.d.ts +3 -1
  142. package/dist/types/tools/checkpoint.d.ts +1 -1
  143. package/dist/types/tools/debug.d.ts +1 -1
  144. package/dist/types/tools/eval-render.d.ts +1 -1
  145. package/dist/types/tools/eval.d.ts +1 -1
  146. package/dist/types/tools/find.d.ts +1 -1
  147. package/dist/types/tools/gh.d.ts +1 -1
  148. package/dist/types/tools/image-gen.d.ts +1 -1
  149. package/dist/types/tools/index.d.ts +14 -2
  150. package/dist/types/tools/inspect-image.d.ts +1 -1
  151. package/dist/types/tools/irc.d.ts +2 -1
  152. package/dist/types/tools/job.d.ts +1 -1
  153. package/dist/types/tools/learn.d.ts +51 -0
  154. package/dist/types/tools/manage-skill.d.ts +40 -0
  155. package/dist/types/tools/memory-edit.d.ts +1 -1
  156. package/dist/types/tools/memory-recall.d.ts +1 -1
  157. package/dist/types/tools/memory-reflect.d.ts +1 -1
  158. package/dist/types/tools/memory-retain.d.ts +1 -1
  159. package/dist/types/tools/plan-mode-guard.d.ts +10 -0
  160. package/dist/types/tools/read.d.ts +1 -1
  161. package/dist/types/tools/render-mermaid.d.ts +1 -1
  162. package/dist/types/tools/renderers.d.ts +7 -11
  163. package/dist/types/tools/resolve.d.ts +1 -1
  164. package/dist/types/tools/review.d.ts +1 -1
  165. package/dist/types/tools/search-tool-bm25.d.ts +1 -1
  166. package/dist/types/tools/search.d.ts +1 -1
  167. package/dist/types/tools/ssh.d.ts +2 -2
  168. package/dist/types/tools/todo.d.ts +2 -2
  169. package/dist/types/tools/tts.d.ts +26 -1
  170. package/dist/types/tools/write.d.ts +2 -2
  171. package/dist/types/tts/downloader.d.ts +20 -0
  172. package/dist/types/tts/index.d.ts +8 -0
  173. package/dist/types/tts/models.d.ts +82 -0
  174. package/dist/types/tts/player.d.ts +32 -0
  175. package/dist/types/tts/runtime.d.ts +6 -0
  176. package/dist/types/tts/streaming-player.d.ts +41 -0
  177. package/dist/types/tts/tts-client.d.ts +93 -0
  178. package/dist/types/tts/tts-protocol.d.ts +95 -0
  179. package/dist/types/tts/tts-worker.d.ts +2 -0
  180. package/dist/types/tts/vocalizer.d.ts +41 -0
  181. package/dist/types/tts/wav.d.ts +8 -0
  182. package/dist/types/utils/clipboard.d.ts +4 -3
  183. package/dist/types/utils/image-loading.d.ts +18 -1
  184. package/dist/types/utils/thinking-display.d.ts +17 -0
  185. package/dist/types/utils/tool-choice.d.ts +8 -0
  186. package/dist/types/utils/tools-manager.d.ts +2 -1
  187. package/dist/types/utils/tools-manager.test.d.ts +1 -0
  188. package/dist/types/web/scrapers/github.d.ts +1 -1
  189. package/dist/types/web/search/index.d.ts +1 -1
  190. package/package.json +17 -16
  191. package/src/async/job-manager.ts +49 -0
  192. package/src/autolearn/controller.ts +139 -0
  193. package/src/autolearn/managed-skills.ts +257 -0
  194. package/src/autoresearch/state.ts +1 -1
  195. package/src/autoresearch/storage.ts +2 -1
  196. package/src/autoresearch/tools/init-experiment.ts +1 -1
  197. package/src/autoresearch/tools/log-experiment.ts +1 -1
  198. package/src/autoresearch/tools/run-experiment.ts +1 -1
  199. package/src/autoresearch/tools/update-notes.ts +1 -1
  200. package/src/autoresearch/types.ts +1 -1
  201. package/src/cli/args.ts +56 -10
  202. package/src/cli/auth-gateway-cli.ts +1 -1
  203. package/src/cli/bench-cli.ts +1 -1
  204. package/src/cli/dry-balance-cli.ts +1 -1
  205. package/src/cli/models-cli.ts +427 -0
  206. package/src/cli/session-picker.ts +2 -1
  207. package/src/cli/setup-cli.ts +148 -47
  208. package/src/cli/setup-model-picker.ts +43 -0
  209. package/src/cli-commands.ts +3 -0
  210. package/src/cli.ts +45 -13
  211. package/src/collab/host.ts +10 -13
  212. package/src/collab/protocol.ts +1 -1
  213. package/src/commands/launch.ts +0 -3
  214. package/src/commands/models.ts +61 -0
  215. package/src/commands/say.ts +102 -0
  216. package/src/commands/setup.ts +1 -1
  217. package/src/commands/token.ts +89 -0
  218. package/src/commit/agentic/tools/analyze-file.ts +4 -1
  219. package/src/commit/agentic/tools/git-file-diff.ts +1 -1
  220. package/src/commit/agentic/tools/git-hunk.ts +1 -1
  221. package/src/commit/agentic/tools/git-overview.ts +1 -1
  222. package/src/commit/agentic/tools/propose-changelog.ts +1 -1
  223. package/src/commit/agentic/tools/propose-commit.ts +1 -1
  224. package/src/commit/agentic/tools/recent-commits.ts +1 -1
  225. package/src/commit/agentic/tools/schemas.ts +1 -1
  226. package/src/commit/agentic/tools/split-commit.ts +1 -1
  227. package/src/commit/analysis/summary.ts +1 -1
  228. package/src/commit/changelog/generate.ts +1 -1
  229. package/src/commit/shared-llm.ts +1 -1
  230. package/src/config/keybindings.ts +2 -2
  231. package/src/config/model-discovery.ts +11 -5
  232. package/src/config/model-registry.ts +79 -21
  233. package/src/config/model-resolver.ts +2 -2
  234. package/src/config/models-config-schema.ts +5 -2
  235. package/src/config/models-config.ts +2 -1
  236. package/src/config/settings-schema.ts +266 -32
  237. package/src/config/settings.ts +10 -0
  238. package/src/discovery/builtin.ts +23 -1
  239. package/src/discovery/claude-plugins.ts +44 -5
  240. package/src/discovery/helpers.ts +41 -1
  241. package/src/edit/hashline/params.ts +1 -1
  242. package/src/edit/modes/apply-patch.ts +1 -1
  243. package/src/edit/modes/patch.ts +1 -1
  244. package/src/edit/modes/replace.ts +1 -1
  245. package/src/eval/__tests__/budget-bridge.test.ts +1 -1
  246. package/src/eval/agent-bridge.ts +1 -1
  247. package/src/eval/completion-bridge.ts +1 -1
  248. package/src/eval/js/shared/prelude.txt +69 -17
  249. package/src/export/html/index.ts +3 -6
  250. package/src/export/html/template.js +24 -2
  251. package/src/export/html/tool-views.generated.js +2 -2
  252. package/src/extensibility/custom-commands/loader.ts +1 -1
  253. package/src/extensibility/custom-commands/types.ts +2 -2
  254. package/src/extensibility/custom-tools/loader.ts +1 -1
  255. package/src/extensibility/custom-tools/types.ts +2 -2
  256. package/src/extensibility/extensions/loader.ts +2 -2
  257. package/src/extensibility/extensions/model-api.ts +41 -0
  258. package/src/extensibility/extensions/runner.ts +4 -0
  259. package/src/extensibility/extensions/types.ts +54 -3
  260. package/src/extensibility/extensions/wrapper.ts +41 -5
  261. package/src/extensibility/hooks/index.ts +2 -1
  262. package/src/extensibility/hooks/loader.ts +1 -1
  263. package/src/extensibility/hooks/types.ts +2 -2
  264. package/src/extensibility/plugins/legacy-pi-compat.ts +43 -13
  265. package/src/extensibility/plugins/loader.ts +30 -19
  266. package/src/extensibility/plugins/manager.ts +221 -90
  267. package/src/extensibility/shared-events.ts +1 -1
  268. package/src/extensibility/skills.ts +101 -5
  269. package/src/goals/guided-setup.ts +133 -0
  270. package/src/goals/state.ts +1 -1
  271. package/src/goals/tools/goal-tool.ts +1 -1
  272. package/src/hindsight/transcript.ts +1 -1
  273. package/src/index.ts +5 -0
  274. package/src/internal-urls/docs-index.generated.ts +13 -10
  275. package/src/internal-urls/history-protocol.ts +1 -1
  276. package/src/internal-urls/local-protocol.ts +29 -7
  277. package/src/lsp/types.ts +1 -1
  278. package/src/main.ts +27 -32
  279. package/src/mcp/config-writer.ts +7 -3
  280. package/src/mcp/manager.ts +11 -0
  281. package/src/mcp/startup-events.ts +21 -0
  282. package/src/mcp/transports/stdio.ts +2 -1
  283. package/src/memories/index.ts +149 -12
  284. package/src/memories/storage.ts +2 -1
  285. package/src/memory-backend/local-backend.ts +11 -5
  286. package/src/mnemopi/backend.ts +1 -0
  287. package/src/mnemopi/config.ts +112 -12
  288. package/src/modes/acp/acp-agent.ts +8 -53
  289. package/src/modes/acp/acp-event-mapper.ts +5 -1
  290. package/src/modes/components/agent-hub.ts +51 -5
  291. package/src/modes/components/assistant-message.ts +12 -44
  292. package/src/modes/components/compaction-summary-message.ts +125 -26
  293. package/src/modes/components/custom-editor.test.ts +96 -0
  294. package/src/modes/components/custom-editor.ts +164 -8
  295. package/src/modes/components/index.ts +1 -0
  296. package/src/modes/components/logout-account-selector.ts +130 -0
  297. package/src/modes/components/mcp-add-wizard.ts +1 -1
  298. package/src/modes/components/model-selector.ts +2 -2
  299. package/src/modes/components/session-selector.ts +1 -1
  300. package/src/modes/components/settings-defs.ts +7 -0
  301. package/src/modes/components/status-line/component.ts +54 -157
  302. package/src/modes/components/status-line/segments.ts +1 -1
  303. package/src/modes/components/status-line/types.ts +2 -1
  304. package/src/modes/components/tool-execution.ts +82 -43
  305. package/src/modes/components/transcript-container.ts +70 -1
  306. package/src/modes/components/tree-selector.ts +1 -1
  307. package/src/modes/components/usage-row.ts +18 -0
  308. package/src/modes/components/user-message.ts +4 -2
  309. package/src/modes/controllers/command-controller.ts +14 -16
  310. package/src/modes/controllers/event-controller.ts +101 -73
  311. package/src/modes/controllers/extension-ui-controller.ts +6 -0
  312. package/src/modes/controllers/input-controller.ts +311 -57
  313. package/src/modes/controllers/mcp-command-controller.ts +44 -3
  314. package/src/modes/controllers/selector-controller.ts +68 -12
  315. package/src/modes/controllers/streaming-reveal.ts +4 -3
  316. package/src/modes/gradient-highlight.ts +21 -9
  317. package/src/modes/image-references.ts +20 -0
  318. package/src/modes/interactive-mode.ts +288 -48
  319. package/src/modes/magic-keywords.ts +27 -5
  320. package/src/modes/rpc/rpc-mode.ts +146 -14
  321. package/src/modes/rpc/rpc-subagents.ts +2 -2
  322. package/src/modes/rpc/rpc-types.ts +8 -2
  323. package/src/modes/runtime-init.ts +28 -3
  324. package/src/modes/theme/theme.ts +99 -51
  325. package/src/modes/types.ts +6 -7
  326. package/src/modes/utils/hotkeys-markdown.ts +1 -1
  327. package/src/modes/utils/ui-helpers.ts +36 -7
  328. package/src/priority.json +5 -1
  329. package/src/prompts/agents/task.md +1 -0
  330. package/src/prompts/goals/guided-goal-interview.md +8 -0
  331. package/src/prompts/goals/guided-goal-system.md +12 -0
  332. package/src/prompts/memories/read-path.md +6 -0
  333. package/src/prompts/system/autolearn-guidance-learn.md +1 -0
  334. package/src/prompts/system/autolearn-guidance.md +7 -0
  335. package/src/prompts/system/autolearn-nudge.md +3 -0
  336. package/src/prompts/system/eager-task.md +7 -0
  337. package/src/prompts/system/eager-todo.md +11 -6
  338. package/src/prompts/system/empty-stop-retry.md +4 -6
  339. package/src/prompts/system/subagent-system-prompt.md +4 -0
  340. package/src/prompts/system/system-prompt.md +10 -5
  341. package/src/prompts/system/title-marker-instruction.md +1 -0
  342. package/src/prompts/system/title-system-marker.md +16 -0
  343. package/src/prompts/tools/job.md +1 -0
  344. package/src/prompts/tools/learn.md +7 -0
  345. package/src/prompts/tools/manage-skill.md +9 -0
  346. package/src/prompts/tools/task.md +3 -0
  347. package/src/registry/agent-registry.ts +30 -0
  348. package/src/sdk.ts +103 -43
  349. package/src/secrets/obfuscator.ts +1 -1
  350. package/src/session/agent-session.ts +331 -318
  351. package/src/session/agent-storage.ts +18 -9
  352. package/src/session/history-storage.ts +3 -2
  353. package/src/session/indexed-session-storage.ts +7 -10
  354. package/src/session/messages.ts +9 -11
  355. package/src/session/session-context.ts +352 -0
  356. package/src/session/session-dump-format.ts +4 -2
  357. package/src/session/session-entries.ts +194 -0
  358. package/src/session/session-listing.ts +588 -0
  359. package/src/session/session-loader.ts +106 -0
  360. package/src/session/session-manager.ts +968 -3064
  361. package/src/session/session-migrations.ts +78 -0
  362. package/src/session/session-paths.ts +193 -0
  363. package/src/session/session-persistence.ts +131 -0
  364. package/src/session/session-storage.ts +91 -30
  365. package/src/session/snapcompact-inline.ts +21 -1
  366. package/src/session/snapcompact-savings-journal.ts +113 -0
  367. package/src/session/tool-choice-queue.ts +23 -11
  368. package/src/slash-commands/builtin-registry.ts +40 -4
  369. package/src/slash-commands/helpers/logout.ts +88 -0
  370. package/src/stt/asr-client.ts +520 -0
  371. package/src/stt/asr-protocol.ts +65 -0
  372. package/src/stt/asr-worker.ts +790 -0
  373. package/src/stt/downloader.ts +107 -47
  374. package/src/stt/endpointer.ts +259 -0
  375. package/src/stt/index.ts +5 -1
  376. package/src/stt/models.ts +150 -0
  377. package/src/stt/recorder.ts +247 -60
  378. package/src/stt/stt-controller.ts +201 -22
  379. package/src/stt/transcriber.ts +37 -68
  380. package/src/stt/wav.ts +173 -0
  381. package/src/system-prompt.ts +8 -0
  382. package/src/task/agents.ts +1 -2
  383. package/src/task/executor.ts +49 -15
  384. package/src/task/index.ts +60 -6
  385. package/src/task/render.ts +83 -8
  386. package/src/task/types.ts +54 -1
  387. package/src/tools/ask.ts +9 -1
  388. package/src/tools/ast-edit.ts +1 -1
  389. package/src/tools/ast-grep.ts +1 -1
  390. package/src/tools/bash.ts +5 -4
  391. package/src/tools/browser/cmux/cmux-tab.ts +1264 -0
  392. package/src/tools/browser/cmux/rpc.ts +156 -0
  393. package/src/tools/browser/cmux/socket-client.ts +309 -0
  394. package/src/tools/browser/registry.ts +37 -3
  395. package/src/tools/browser/render.ts +6 -1
  396. package/src/tools/browser/tab-protocol.ts +2 -0
  397. package/src/tools/browser/tab-supervisor.ts +189 -18
  398. package/src/tools/browser/tab-worker.ts +1 -1
  399. package/src/tools/browser.ts +16 -1
  400. package/src/tools/checkpoint.ts +1 -1
  401. package/src/tools/debug.ts +1 -1
  402. package/src/tools/eval-render.ts +4 -3
  403. package/src/tools/eval.ts +11 -6
  404. package/src/tools/fetch.ts +13 -2
  405. package/src/tools/find.ts +1 -1
  406. package/src/tools/gh.ts +1 -1
  407. package/src/tools/github-cache.ts +2 -1
  408. package/src/tools/image-gen.ts +1 -1
  409. package/src/tools/index.ts +43 -5
  410. package/src/tools/inspect-image.ts +3 -1
  411. package/src/tools/irc.ts +11 -3
  412. package/src/tools/job.ts +15 -3
  413. package/src/tools/learn.ts +144 -0
  414. package/src/tools/manage-skill.ts +104 -0
  415. package/src/tools/memory-edit.ts +1 -1
  416. package/src/tools/memory-recall.ts +1 -1
  417. package/src/tools/memory-reflect.ts +1 -1
  418. package/src/tools/memory-retain.ts +1 -1
  419. package/src/tools/plan-mode-guard.ts +53 -19
  420. package/src/tools/read.ts +8 -2
  421. package/src/tools/render-mermaid.ts +1 -1
  422. package/src/tools/renderers.ts +7 -11
  423. package/src/tools/report-tool-issue.ts +3 -2
  424. package/src/tools/resolve.ts +1 -1
  425. package/src/tools/review.ts +1 -1
  426. package/src/tools/search-tool-bm25.ts +1 -1
  427. package/src/tools/search.ts +1 -1
  428. package/src/tools/ssh.ts +5 -4
  429. package/src/tools/todo.ts +2 -2
  430. package/src/tools/tts.ts +204 -93
  431. package/src/tools/write.ts +19 -3
  432. package/src/tts/downloader.ts +64 -0
  433. package/src/tts/index.ts +8 -0
  434. package/src/tts/models.ts +137 -0
  435. package/src/tts/player.ts +137 -0
  436. package/src/tts/runtime.ts +21 -0
  437. package/src/tts/streaming-player.ts +266 -0
  438. package/src/tts/tts-client.ts +647 -0
  439. package/src/tts/tts-protocol.ts +60 -0
  440. package/src/tts/tts-worker.ts +497 -0
  441. package/src/tts/vocalizer.ts +162 -0
  442. package/src/tts/wav.ts +58 -0
  443. package/src/utils/clipboard.ts +35 -18
  444. package/src/utils/image-loading.ts +35 -4
  445. package/src/utils/thinking-display.ts +37 -0
  446. package/src/utils/title-generator.ts +48 -5
  447. package/src/utils/tool-choice.ts +16 -0
  448. package/src/utils/tools-manager.test.ts +25 -0
  449. package/src/utils/tools-manager.ts +19 -1
  450. package/src/web/scrapers/github.ts +96 -0
  451. package/src/web/search/index.ts +14 -1
  452. package/src/web/search/providers/searxng.ts +13 -1
  453. package/dist/types/cli/list-models.d.ts +0 -30
  454. package/dist/types/stt/setup.d.ts +0 -18
  455. package/src/cli/list-models.ts +0 -194
  456. package/src/stt/setup.ts +0 -52
  457. package/src/stt/transcribe.py +0 -70
@@ -0,0 +1,12 @@
1
+ import { type FileEntry } from "./session-entries";
2
+ /** Generate a unique short ID (8 hex chars, collision-checked) */
3
+ export declare function generateId(byId: {
4
+ has(id: string): boolean;
5
+ }): string;
6
+ /**
7
+ * Run all necessary migrations to bring entries to current version.
8
+ * Mutates entries in place. Returns true if any migration was applied.
9
+ */
10
+ export declare function migrateToCurrentVersion(entries: FileEntry[]): boolean;
11
+ /** Exported for testing */
12
+ export declare function migrateSessionEntries(entries: FileEntry[]): void;
@@ -0,0 +1,25 @@
1
+ import type { SessionStorage } from "./session-storage";
2
+ export declare function resolveManagedSessionRoot(sessionDir: string, cwd: string): string | undefined;
3
+ /**
4
+ * Compute the default session directory for a cwd.
5
+ * Classifies cwd by canonical location so symlink/alias paths resolve to the
6
+ * same home-relative or temp-root directory names as their real targets.
7
+ */
8
+ export declare function computeDefaultSessionDir(cwd: string, storage: SessionStorage, sessionsRoot?: string): string;
9
+ /**
10
+ * Write a breadcrumb linking the current terminal to a session file.
11
+ * The breadcrumb contains the cwd and session path so --continue can
12
+ * find "this terminal's last session" even when running concurrent instances.
13
+ */
14
+ export declare function writeTerminalBreadcrumb(cwd: string, sessionFile: string): void;
15
+ export interface TerminalBreadcrumb {
16
+ cwd: string;
17
+ sessionFile: string;
18
+ }
19
+ /**
20
+ * Read the raw terminal breadcrumb for the current terminal.
21
+ * Returns the recorded cwd + session file (verified to exist) regardless of
22
+ * whether the recorded cwd still matches the current one. Callers decide how
23
+ * to interpret a cwd mismatch (e.g. a moved/renamed worktree).
24
+ */
25
+ export declare function readTerminalBreadcrumbEntry(): Promise<TerminalBreadcrumb | null>;
@@ -0,0 +1,8 @@
1
+ import { type BlobStore } from "./blob-store";
2
+ import type { FileEntry } from "./session-entries";
3
+ export declare function isImageBlock(value: unknown): value is {
4
+ type: "image";
5
+ data: string;
6
+ mimeType?: string;
7
+ };
8
+ export declare function prepareEntryForPersistence(entry: FileEntry, blobStore: BlobStore): FileEntry;
@@ -4,17 +4,17 @@ export interface SessionStorageStat {
4
4
  mtime: Date;
5
5
  }
6
6
  export interface SessionStorageWriter {
7
- writeLine(line: string): Promise<void>;
8
7
  /**
9
- * Synchronously append a single line. Returns once the bytes are handed to the kernel
10
- * (page cache), so the data survives a non-graceful process death (OOM, SIGKILL, etc.)
11
- * even though it has not yet been fsynced to the underlying disk.
8
+ * Append one newline-terminated line. File and memory storage perform the
9
+ * write synchronously in-body; indexed backends queue in call order.
12
10
  *
13
- * `line` MUST already include the trailing newline. Throws synchronously on I/O error.
11
+ * `line` MUST include the trailing newline.
14
12
  */
15
- writeLineSync(line: string): void;
13
+ append(line: string): Promise<void>;
14
+ /** Resolve once all queued appends complete. No fsync. */
16
15
  flush(): Promise<void>;
17
- fsync(): Promise<void>;
16
+ /** False once close() has begun/finished. */
17
+ isOpen(): boolean;
18
18
  close(): Promise<void>;
19
19
  getError(): Error | undefined;
20
20
  }
@@ -29,6 +29,7 @@ export interface SessionStorage {
29
29
  /** Read the requested UTF-8 byte windows from the head and tail of the file. */
30
30
  readTextSlices(path: string, prefixBytes: number, suffixBytes: number): Promise<[string, string]>;
31
31
  writeText(path: string, content: string): Promise<void>;
32
+ writeTextAtomic(path: string, content: string): Promise<void>;
32
33
  rename(path: string, nextPath: string): Promise<void>;
33
34
  unlink(path: string): Promise<void>;
34
35
  deleteSessionWithArtifacts(sessionPath: string): Promise<void>;
@@ -38,6 +39,7 @@ export interface SessionStorage {
38
39
  }): SessionStorageWriter;
39
40
  }
40
41
  export declare class FileSessionStorage implements SessionStorage {
42
+ #private;
41
43
  ensureDirSync(dir: string): void;
42
44
  existsSync(path: string): boolean;
43
45
  writeTextSync(fpath: string, content: string): void;
@@ -47,6 +49,7 @@ export declare class FileSessionStorage implements SessionStorage {
47
49
  readText(path: string): Promise<string>;
48
50
  readTextSlices(path: string, prefixBytes: number, suffixBytes: number): Promise<[string, string]>;
49
51
  writeText(path: string, content: string): Promise<void>;
52
+ writeTextAtomic(fpath: string, content: string): Promise<void>;
50
53
  rename(path: string, nextPath: string): Promise<void>;
51
54
  unlink(path: string): Promise<void>;
52
55
  openWriter(path: string, options?: {
@@ -76,6 +79,7 @@ export declare class MemorySessionStorage implements SessionStorage {
76
79
  readText(path: string): Promise<string>;
77
80
  readTextSlices(path: string, prefixBytes: number, suffixBytes: number): Promise<[string, string]>;
78
81
  writeText(path: string, content: string): Promise<void>;
82
+ writeTextAtomic(path: string, content: string): Promise<void>;
79
83
  rename(path: string, nextPath: string): Promise<void>;
80
84
  unlink(path: string): Promise<void>;
81
85
  deleteSessionWithArtifacts(_sessionPath: string): Promise<void>;
@@ -22,6 +22,16 @@ export interface SnapcompactInlineOptions {
22
22
  /** Frame variant override; `"auto"`/omitted picks the provider's eval winner. */
23
23
  shape?: snapcompact.ShapeVariantName | "auto";
24
24
  }
25
+ /**
26
+ * Reports the per-tool-result tokens kept off the wire when a swap is applied.
27
+ * `savedTokens` is `textTokens - frames * shape.frameTokenEstimate` for each
28
+ * imaged tool result (always > 0; the savings gate guarantees it). Wired to the
29
+ * append-only savings journal; never throws into the request path.
30
+ */
31
+ export type SnapcompactSavingsSink = (savings: ReadonlyArray<{
32
+ toolCallId: string;
33
+ savedTokens: number;
34
+ }>, model: Model) => void;
25
35
  /** Tool-result swap candidate, in context order. */
26
36
  export interface InlineToolResultCandidate {
27
37
  /** Stable identifier for rendering cache key and applying the swap. */
@@ -129,6 +139,7 @@ export declare function estimateInlineSavings(input: {
129
139
  export declare class SnapcompactInlineTransformer {
130
140
  #private;
131
141
  private readonly options;
132
- constructor(options: SnapcompactInlineOptions);
142
+ private readonly onToolResultSavings?;
143
+ constructor(options: SnapcompactInlineOptions, onToolResultSavings?: SnapcompactSavingsSink | undefined);
133
144
  transform(context: Context, model: Model): Context;
134
145
  }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Append-only journal of snapcompact tool-result savings.
3
+ *
4
+ * Snapcompact frames are transient — built per provider request in
5
+ * `transformProviderContext` and never written to session.jsonl — so the tokens
6
+ * they keep off the wire would otherwise leave no trace. This records one line
7
+ * the FIRST time a tool result is imaged in a session:
8
+ *
9
+ * {"ts":<epochMs>,"session":<sessionFile>,"provider":..,"model":..,"toolCallId":..,"savedTokens":..}
10
+ *
11
+ * Newline-delimited JSON, opened with O_APPEND so concurrent appenders (parallel
12
+ * agents/subagents) never interleave a partial line. Writes are fire-and-forget;
13
+ * a failure is logged at debug and never propagates into the request hot path.
14
+ *
15
+ * Readers MUST dedup by (session, toolCallId): a session resumed in a fresh
16
+ * process re-images the same results and may append a second line. The savings
17
+ * for a given (session, toolCallId) are stable, so any-per-key is correct.
18
+ */
19
+ import type { Model } from "@oh-my-pi/pi-ai";
20
+ export interface SnapcompactSavingsRecord {
21
+ /** Epoch milliseconds when the swap was applied. */
22
+ ts: number;
23
+ /** Session file path (matches the stats `messages.session_file` key). */
24
+ session: string;
25
+ provider: string;
26
+ model: string;
27
+ toolCallId: string;
28
+ savedTokens: number;
29
+ }
30
+ /** `~/.omp/.../snapcompact-savings.jsonl`, colocated with stats.db. */
31
+ export declare function snapcompactSavingsJournalPath(): string;
32
+ /**
33
+ * Appends savings to the journal, deduped by toolCallId for the recorder's
34
+ * lifetime (one per session). Returns the in-flight append so callers/tests can
35
+ * await durability; the production transform leaves it floating (fire-and-forget,
36
+ * and it never rejects — I/O errors are swallowed to debug). `getSession` is read
37
+ * at write time so a session file assigned late is still captured; a null session
38
+ * (in-memory / SDK embedding) or non-positive savings skip the write.
39
+ */
40
+ export type SnapcompactSavingsRecorder = (savings: ReadonlyArray<{
41
+ toolCallId: string;
42
+ savedTokens: number;
43
+ }>, model: Model) => Promise<void>;
44
+ export declare function createSnapcompactSavingsRecorder(getSession: () => string | null, journalPath?: string): SnapcompactSavingsRecorder;
45
+ /** Read all journal records. Malformed lines are skipped; a missing file is empty. */
46
+ export declare function readSnapcompactSavingsJournal(journalPath?: string): Promise<SnapcompactSavingsRecord[]>;
@@ -6,12 +6,12 @@ export interface ResolveInfo {
6
6
  export interface RejectInfo {
7
7
  /** The ToolChoice that was yielded but never (or unsuccessfully) served. */
8
8
  choice: ToolChoice;
9
- reason: "aborted" | "error" | "cleared" | "removed";
9
+ reason: "aborted" | "error" | "cleared" | "removed" | "unavailable" | "not_invoked";
10
10
  }
11
11
  /** "requeue" replays the lost yield next turn; "drop" (or void/undefined) discards it. */
12
12
  export type RejectOutcome = "requeue" | "drop";
13
13
  export interface DirectiveCallbacks {
14
- /** Fires when the yield was served (LLM call completed). The directive is consumed. */
14
+ /** Fires when the yield completed; onInvoked directives require the requested tool to run first. */
15
15
  onResolved?: (info: ResolveInfo) => void;
16
16
  /**
17
17
  * Fires when the yield is being discarded. Return "requeue" to replay the
@@ -52,9 +52,9 @@ export declare class ToolChoiceQueue {
52
52
  */
53
53
  nextToolChoice(): ToolChoice | undefined;
54
54
  /**
55
- * The in-flight yield was served the LLM call completed normally.
56
- * Fires onResolved, then clears in-flight state. The directive's generator
57
- * remains in the queue if it has more values to yield.
55
+ * The in-flight yield completed normally. Directives with onInvoked are only
56
+ * consumed after their requested tool ran; a normal text turn or a different
57
+ * tool call requeues/rejects the directive instead.
58
58
  */
59
59
  resolve(): void;
60
60
  /**
@@ -65,7 +65,7 @@ export declare class ToolChoiceQueue {
65
65
  reject(reason: RejectInfo["reason"]): void;
66
66
  /** True if there is an in-flight yield that hasn't been resolved or rejected. */
67
67
  get hasInFlight(): boolean;
68
- /** Peek the in-flight directive's onInvoked handler, if any. */
68
+ /** Return the in-flight directive's onInvoked handler and mark it when called. */
69
69
  peekInFlightInvoker(): ((input: unknown) => Promise<unknown> | unknown) | undefined;
70
70
  /** Remove all directives with the given label. Rejects in-flight if it matches. */
71
71
  removeByLabel(label: string): void;
@@ -0,0 +1,15 @@
1
+ import type { OAuthAccountIdentity, StoredAuthCredential } from "../../session/auth-storage";
2
+ export interface LogoutAccount {
3
+ credentialId: number;
4
+ provider: string;
5
+ label: string;
6
+ detail: string;
7
+ type: "api_key" | "oauth";
8
+ active: boolean;
9
+ }
10
+ interface LogoutAccountOptions {
11
+ activeIdentity?: OAuthAccountIdentity;
12
+ activeApiKey?: boolean;
13
+ }
14
+ export declare function toLogoutAccounts(provider: string, credentials: StoredAuthCredential[], options?: LogoutAccountOptions): LogoutAccount[];
15
+ export {};
@@ -0,0 +1,90 @@
1
+ import type { Subprocess } from "bun";
2
+ import type { SttProgressEvent, SttWorkerInbound, SttWorkerOutbound } from "./asr-protocol";
3
+ import type { SttModelKey } from "./models";
4
+ /**
5
+ * Abstraction over the speech-recognition subprocess. Modelled as a worker
6
+ * interface so the parent composes lifecycle, ping/pong, and request/response
7
+ * correlation uniformly; the runtime implementation is a Bun child process so
8
+ * `onnxruntime-node`'s NAPI finalizer never runs inside the main agent address
9
+ * space — that destructor segfaults Bun on shutdown (issue #1606).
10
+ */
11
+ interface WorkerHandle {
12
+ send(message: SttWorkerInbound): void;
13
+ onMessage(handler: (message: SttWorkerOutbound) => void): () => void;
14
+ onError(handler: (error: Error) => void): () => void;
15
+ terminate(): Promise<void>;
16
+ }
17
+ export interface SttTranscribeOptions {
18
+ language?: string;
19
+ signal?: AbortSignal;
20
+ }
21
+ export interface SttDownloadOptions {
22
+ signal?: AbortSignal;
23
+ onProgress?: (event: SttProgressEvent) => void;
24
+ }
25
+ /** Live streaming session handle returned by {@link SttClient.startStream}. */
26
+ export interface SttStreamHandle {
27
+ /** Feed 16 kHz mono float samples as the recorder produces them. */
28
+ pushAudio(audio: Float32Array): void;
29
+ /** Flush the trailing segment and resolve with the full joined transcript. */
30
+ stop(): Promise<string>;
31
+ /** Tear the session down without a final flush (resolves `stop()` with ""). */
32
+ cancel(): void;
33
+ }
34
+ export interface SttStreamOptions {
35
+ language?: string;
36
+ signal?: AbortSignal;
37
+ /** Volatile transcript of the in-progress segment, refreshed as audio arrives. */
38
+ onPartial?: (text: string) => void;
39
+ /** A finalized segment, emitted once when the endpointer commits it. */
40
+ onSegment?: (text: string, index: number) => void;
41
+ }
42
+ /**
43
+ * Hidden subcommand on the main CLI that boots the speech-recognition worker in
44
+ * the spawned subprocess. Kept in sync with the dispatch in `cli.ts`.
45
+ */
46
+ export declare const STT_WORKER_ARG = "__omp_stt_worker";
47
+ interface SpawnedSubprocess {
48
+ proc: Subprocess<"ignore", "ignore", "ignore">;
49
+ inbound: Set<(message: SttWorkerOutbound) => void>;
50
+ errors: Set<(error: Error) => void>;
51
+ /**
52
+ * Flipped to `true` right before the parent SIGKILLs the child so `onExit`
53
+ * can distinguish the expected hard-kill from a crash/OOM/external signal.
54
+ */
55
+ intentionalExit: {
56
+ value: boolean;
57
+ };
58
+ }
59
+ /**
60
+ * Spawn the speech worker as a subprocess. Exported for tests and the smoke
61
+ * probe; production callers go through {@link spawnSttWorker}.
62
+ */
63
+ export declare function createSttSubprocess(): SpawnedSubprocess;
64
+ export declare class SttClient {
65
+ #private;
66
+ constructor(spawnWorker?: () => WorkerHandle);
67
+ onProgress(listener: (event: SttProgressEvent) => void): () => void;
68
+ /**
69
+ * Transcribe 16 kHz mono audio on the warm worker. Rejects with the worker
70
+ * error on failure and with an `AbortError` when the signal fires (the warm
71
+ * worker keeps the model loaded across calls — the model is never reloaded).
72
+ */
73
+ transcribe(modelKey: SttModelKey, audio: Float32Array, options?: SttTranscribeOptions): Promise<string>;
74
+ /**
75
+ * Open a live streaming session on the warm worker. Audio fed through the
76
+ * returned handle is segmented by the worker's endpointer: `onSegment` fires
77
+ * once per committed segment and `onPartial` for the volatile in-progress
78
+ * preview. `stop()` resolves with the full joined transcript; `cancel()` (or
79
+ * an aborted signal) tears the session down and resolves `stop()` with "".
80
+ */
81
+ startStream(modelKey: SttModelKey, options?: SttStreamOptions): SttStreamHandle;
82
+ downloadModel(modelKey: SttModelKey, options?: SttDownloadOptions): Promise<boolean>;
83
+ terminate(): Promise<void>;
84
+ }
85
+ export declare const sttClient: SttClient;
86
+ export declare function shutdownSttClient(): Promise<void>;
87
+ export declare function smokeTestSttWorker({ timeoutMs, }?: {
88
+ timeoutMs?: number;
89
+ }): Promise<void>;
90
+ export {};
@@ -0,0 +1,97 @@
1
+ import type { SttModelKey } from "./models";
2
+ export type SttProgressStatus = "initiate" | "download" | "progress" | "progress_total" | "done" | "ready" | "error";
3
+ export interface SttProgressFileState {
4
+ loaded: number;
5
+ total: number;
6
+ }
7
+ export interface SttProgressEvent {
8
+ modelKey: SttModelKey;
9
+ status: SttProgressStatus;
10
+ name?: string;
11
+ file?: string;
12
+ progress?: number;
13
+ loaded?: number;
14
+ total?: number;
15
+ files?: Record<string, SttProgressFileState>;
16
+ task?: string;
17
+ model?: string;
18
+ }
19
+ export type SttWorkerInbound = {
20
+ type: "ping";
21
+ id: string;
22
+ } | {
23
+ type: "transcribe";
24
+ id: string;
25
+ modelKey: SttModelKey;
26
+ audio: Float32Array;
27
+ language?: string;
28
+ } | {
29
+ type: "download";
30
+ id: string;
31
+ modelKey: SttModelKey;
32
+ } | {
33
+ type: "stream_start";
34
+ id: string;
35
+ modelKey: SttModelKey;
36
+ language?: string;
37
+ } | {
38
+ type: "stream_audio";
39
+ id: string;
40
+ audio: Float32Array;
41
+ } | {
42
+ type: "stream_stop";
43
+ id: string;
44
+ } | {
45
+ type: "stream_cancel";
46
+ id: string;
47
+ };
48
+ export type SttWorkerOutbound = {
49
+ type: "pong";
50
+ id: string;
51
+ } | {
52
+ type: "transcription";
53
+ id: string;
54
+ text: string;
55
+ } | {
56
+ type: "downloaded";
57
+ id: string;
58
+ } | {
59
+ type: "error";
60
+ id: string;
61
+ error: string;
62
+ } | {
63
+ type: "progress";
64
+ id: string;
65
+ event: SttProgressEvent;
66
+ } | {
67
+ type: "log";
68
+ level: "debug" | "warn" | "error";
69
+ msg: string;
70
+ meta?: Record<string, unknown>;
71
+ } | {
72
+ type: "partial";
73
+ id: string;
74
+ text: string;
75
+ } | {
76
+ type: "segment";
77
+ id: string;
78
+ index: number;
79
+ text: string;
80
+ } | {
81
+ type: "stream_done";
82
+ id: string;
83
+ text: string;
84
+ };
85
+ /**
86
+ * Wire transport between the parent (`SttClient`) and the speech-recognition
87
+ * subprocess. The parent owns the subprocess lifecycle (graceful work, hard
88
+ * SIGKILL on shutdown); the protocol therefore carries no explicit close
89
+ * handshake — once the parent decides to terminate, it signals the OS to reap
90
+ * the child so `onnxruntime-node`'s NAPI finalizer never runs in any shared
91
+ * address space (the destructor segfaults Bun on shutdown; issue #1606). See
92
+ * `asr-client.ts` for the spawn/kill glue.
93
+ */
94
+ export interface SttTransport {
95
+ send(message: SttWorkerOutbound): void;
96
+ onMessage(handler: (message: SttWorkerInbound) => void): () => void;
97
+ }
@@ -0,0 +1,2 @@
1
+ import type { SttTransport } from "./asr-protocol";
2
+ export declare function startSttWorker(transport: SttTransport): void;
@@ -1,9 +1,47 @@
1
+ import type { SttProgressStatus } from "./asr-protocol";
1
2
  export interface DownloadProgress {
2
3
  stage: string;
3
4
  percent?: number;
4
5
  }
5
6
  export interface EnsureOptions {
6
7
  modelName?: string;
8
+ signal?: AbortSignal;
7
9
  onProgress?: (progress: DownloadProgress) => void;
8
10
  }
11
+ /**
12
+ * Real-progress event for a speech-model download, surfaced to UI callers.
13
+ * `percent` is an integer 0–100 aggregated across all model files (encoder +
14
+ * decoder shards), so it advances monotonically toward completion.
15
+ */
16
+ export interface SttDownloadProgress {
17
+ status: SttProgressStatus;
18
+ /** Integer 0–100 aggregated across files. */
19
+ percent: number;
20
+ /** Bytes downloaded so far across all files. */
21
+ loaded: number;
22
+ /** Total bytes across all files seen so far. */
23
+ total: number;
24
+ /** The file currently downloading, when known. */
25
+ file?: string;
26
+ repo: string;
27
+ label: string;
28
+ }
29
+ /**
30
+ * Whether the selected model is already present in the local cache. For
31
+ * transformers.js Whisper tiers a complete download leaves `config.json` plus
32
+ * the `onnx/` weight files (a bare `config.json` from an interrupted fetch reads
33
+ * as not-cached); for sherpa-onnx tiers every model file (encoder/decoder/joiner
34
+ * + tokens) must be present (`.part` sidecars from an interrupted fetch are
35
+ * ignored).
36
+ */
37
+ export declare function isSttModelCached(key: string): Promise<boolean>;
38
+ /**
39
+ * Download (or warm from cache) the selected ONNX Whisper model via the speech
40
+ * worker, resolving once the model is fully present and loaded. Streams real
41
+ * Hub progress with an aggregated integer percent. Rejects if the worker cannot
42
+ * obtain the model. Safe to call non-interactively.
43
+ */
44
+ export declare function downloadSttModel(key: string, onProgress?: (progress: SttDownloadProgress) => void, options?: {
45
+ signal?: AbortSignal;
46
+ }): Promise<void>;
9
47
  export declare function ensureSTTDependencies(options?: EnsureOptions): Promise<void>;
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Energy-based speech endpointer for live transcription.
3
+ *
4
+ * The on-device ASR models we ship are non-streaming: the sherpa-onnx Parakeet
5
+ * recognizer and the transformers.js Whisper pipelines both decode a complete
6
+ * waveform in one shot. To transcribe *while the user is still speaking*, this
7
+ * splits the continuous 16 kHz mono float stream into speech segments at natural
8
+ * pauses — each segment is decoded and committed as it finalizes, and the
9
+ * in-progress segment is re-decoded periodically for a volatile live preview.
10
+ *
11
+ * Segmentation is pure short-time-energy VAD with an adaptive noise floor, so it
12
+ * needs no extra model and is engine-agnostic (it runs the same way whether the
13
+ * downstream model is sherpa or transformers). It is deliberately simple and
14
+ * fully deterministic so it can be unit-tested with synthetic signals.
15
+ */
16
+ /** Tunable thresholds for {@link StreamEndpointer}. All durations in ms. */
17
+ export interface EndpointerConfig {
18
+ /** Input sample rate (the recorder always delivers 16 kHz mono). */
19
+ sampleRate: number;
20
+ /** Short-time analysis frame size. */
21
+ frameMs: number;
22
+ /** Trailing silence inside a segment that finalizes (commits) it. */
23
+ endSilenceMs: number;
24
+ /** Shortest speech run that is committed; shorter runs are discarded as noise. */
25
+ minSpeechMs: number;
26
+ /** Hard cap on segment length so long pause-free speech still commits periodically. */
27
+ maxSegmentMs: number;
28
+ /** Audio retained before onset so the first phoneme of a segment is never clipped. */
29
+ preRollMs: number;
30
+ /** Cadence of volatile partial emissions for the in-progress segment. */
31
+ partialIntervalMs: number;
32
+ /** Speech threshold is `max(minThreshold, noiseFloor * energyRatio)`. */
33
+ energyRatio: number;
34
+ /** EMA weight tracking the ambient noise floor on non-speech frames. */
35
+ floorAttack: number;
36
+ /** Absolute RMS floor so a near-silent room never trips speech detection. */
37
+ minThreshold: number;
38
+ }
39
+ export declare const DEFAULT_ENDPOINTER_CONFIG: EndpointerConfig;
40
+ /**
41
+ * Emitted by {@link StreamEndpointer.push} / {@link StreamEndpointer.flush}.
42
+ * `partial` is the volatile in-progress segment (decode and show as preview,
43
+ * never commit); `segment` is a finalized run (decode and commit once).
44
+ */
45
+ export type EndpointerEvent = {
46
+ kind: "partial";
47
+ audio: Float32Array;
48
+ } | {
49
+ kind: "segment";
50
+ audio: Float32Array;
51
+ };
52
+ export declare class StreamEndpointer {
53
+ #private;
54
+ constructor(config?: Partial<EndpointerConfig>);
55
+ /** Feed newly-captured samples; returns ordered partial/segment events. */
56
+ push(samples: Float32Array): EndpointerEvent[];
57
+ /** End the stream; returns a trailing committed segment if one is pending. */
58
+ flush(): EndpointerEvent[];
59
+ }
@@ -1,3 +1,7 @@
1
+ export * from "./asr-client";
2
+ export * from "./asr-protocol";
1
3
  export * from "./downloader";
2
- export * from "./setup";
4
+ export * from "./models";
3
5
  export * from "./stt-controller";
6
+ export * from "./transcriber";
7
+ export * from "./wav";
@@ -0,0 +1,120 @@
1
+ import type { TinyModelDtype } from "../tiny/dtype";
2
+ /**
3
+ * On-device speech-to-text model registry. Each tier maps a stable settings key
4
+ * onto a locally-runnable ASR model and the engine that loads it:
5
+ *
6
+ * - `transformers` — a transformers.js / ONNX Whisper repo, loaded by the
7
+ * `@huggingface/transformers` `automatic-speech-recognition` pipeline.
8
+ * - `sherpa` — a sherpa-onnx (Next-gen Kaldi) offline model, loaded by the
9
+ * native `sherpa-onnx-node` addon. Used for NVIDIA Parakeet, the Open ASR
10
+ * Leaderboard accuracy/speed leader.
11
+ *
12
+ * The worker resolves the spec by key and loads the model lazily (kept warm
13
+ * afterwards). Both engines run inside the hard-killed subprocess worker.
14
+ */
15
+ /** ASR runtime that loads a given tier's model. */
16
+ export type SttEngine = "transformers" | "sherpa";
17
+ interface SttModelBase {
18
+ /** Stable key persisted in `stt.modelName` and sent over the worker protocol. */
19
+ key: string;
20
+ engine: SttEngine;
21
+ /** Hugging Face repo id (transformers.js ONNX repo, or sherpa-onnx model repo). */
22
+ repo: string;
23
+ /** English-only checkpoint: rejects a configured source `language`. */
24
+ englishOnly: boolean;
25
+ label: string;
26
+ description: string;
27
+ /** Approximate on-disk download size for the shipped weights (UI hint). */
28
+ sizeHint: string;
29
+ }
30
+ /** A Whisper-family tier loaded via the transformers.js ASR pipeline. */
31
+ export interface TransformersSttModelSpec extends SttModelBase {
32
+ engine: "transformers";
33
+ /** ONNX precision used unless overridden by `PI_TINY_DTYPE` / `providers.tinyModelDtype`. */
34
+ dtype: TinyModelDtype;
35
+ }
36
+ /** A sherpa-onnx offline tier (e.g. NeMo Parakeet transducer) loaded natively. */
37
+ export interface SherpaSttModelSpec extends SttModelBase {
38
+ engine: "sherpa";
39
+ /** sherpa-onnx offline model family (e.g. `nemo_transducer`). */
40
+ modelType: string;
41
+ /** Model files (relative to the repo root) fetched into the local cache. */
42
+ files: {
43
+ encoder: string;
44
+ decoder: string;
45
+ joiner: string;
46
+ tokens: string;
47
+ };
48
+ }
49
+ export type SttModelSpec = TransformersSttModelSpec | SherpaSttModelSpec;
50
+ /**
51
+ * Speech model tiers, ordered light → SoTA. Defaults to {@link DEFAULT_STT_MODEL_KEY}.
52
+ * `fast`/`balanced`/`turbo` are multilingual Whisper checkpoints on transformers.js;
53
+ * `parakeet` is NVIDIA Parakeet TDT 0.6B v3 on sherpa-onnx — the Open ASR
54
+ * Leaderboard leader (lower WER and far higher throughput than Whisper).
55
+ */
56
+ export declare const STT_MODELS: readonly [{
57
+ readonly key: "fast";
58
+ readonly engine: "transformers";
59
+ readonly repo: "onnx-community/whisper-base";
60
+ readonly dtype: "q8";
61
+ readonly englishOnly: false;
62
+ readonly label: "Fast (Whisper base)";
63
+ readonly description: "Whisper base, multilingual. Smallest + fastest; lowest accuracy. Best for low-resource machines.";
64
+ readonly sizeHint: "~60 MB";
65
+ }, {
66
+ readonly key: "balanced";
67
+ readonly engine: "transformers";
68
+ readonly repo: "onnx-community/whisper-small";
69
+ readonly dtype: "q8";
70
+ readonly englishOnly: false;
71
+ readonly label: "Balanced (Whisper small)";
72
+ readonly description: "Whisper small, multilingual. More accurate than Fast, still light on CPU/RAM.";
73
+ readonly sizeHint: "~190 MB";
74
+ }, {
75
+ readonly key: "turbo";
76
+ readonly engine: "transformers";
77
+ readonly repo: "onnx-community/whisper-large-v3-turbo";
78
+ readonly dtype: "q4";
79
+ readonly englishOnly: false;
80
+ readonly label: "Turbo (Whisper large-v3)";
81
+ readonly description: "Whisper large-v3-turbo, 99 languages. Widest language coverage; large download, slower.";
82
+ readonly sizeHint: "~600 MB";
83
+ }, {
84
+ readonly key: "parakeet";
85
+ readonly engine: "sherpa";
86
+ readonly repo: "csukuangfj/sherpa-onnx-nemo-parakeet-tdt-0.6b-v3-int8";
87
+ readonly modelType: "nemo_transducer";
88
+ readonly files: {
89
+ readonly encoder: "encoder.int8.onnx";
90
+ readonly decoder: "decoder.int8.onnx";
91
+ readonly joiner: "joiner.int8.onnx";
92
+ readonly tokens: "tokens.txt";
93
+ };
94
+ readonly englishOnly: false;
95
+ readonly label: "Parakeet TDT v3 (SoTA)";
96
+ readonly description: "NVIDIA Parakeet TDT 0.6B v3, 25 languages. Open ASR Leaderboard leader — best accuracy and far fastest decoding. Default.";
97
+ readonly sizeHint: "~680 MB";
98
+ }];
99
+ /**
100
+ * SoTA default — NVIDIA Parakeet TDT 0.6B v3 (sherpa-onnx). Tops the Open ASR
101
+ * Leaderboard on accuracy while decoding ~20× faster than Whisper large-v3.
102
+ */
103
+ export declare const DEFAULT_STT_MODEL_KEY = "parakeet";
104
+ export type SttModelKey = (typeof STT_MODELS)[number]["key"];
105
+ /** A concrete entry from {@link STT_MODELS}; `key` is the literal tier union. */
106
+ export type SttModel = (typeof STT_MODELS)[number];
107
+ export declare const STT_MODEL_VALUES: readonly ["fast", "balanced", "turbo", "parakeet"];
108
+ export declare const STT_MODEL_OPTIONS: {
109
+ value: "balanced" | "fast" | "parakeet" | "turbo";
110
+ label: "Balanced (Whisper small)" | "Fast (Whisper base)" | "Parakeet TDT v3 (SoTA)" | "Turbo (Whisper large-v3)";
111
+ description: "NVIDIA Parakeet TDT 0.6B v3, 25 languages. Open ASR Leaderboard leader — best accuracy and far fastest decoding. Default." | "Whisper base, multilingual. Smallest + fastest; lowest accuracy. Best for low-resource machines." | "Whisper large-v3-turbo, 99 languages. Widest language coverage; large download, slower." | "Whisper small, multilingual. More accurate than Fast, still light on CPU/RAM.";
112
+ }[];
113
+ export declare function isSttModelKey(value: string): value is SttModelKey;
114
+ export declare function getSttModelSpec(key: string): SttModel | undefined;
115
+ /**
116
+ * Resolve a (possibly stale or legacy) `stt.modelName` value onto a concrete
117
+ * spec, falling back to the SoTA default when the key is unknown.
118
+ */
119
+ export declare function resolveSttModelSpec(key: string | undefined): SttModel;
120
+ export {};