@oh-my-pi/pi-coding-agent 15.10.10 → 15.10.12

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 (415) hide show
  1. package/CHANGELOG.md +142 -7
  2. package/dist/cli.js +23108 -0
  3. package/dist/tokenizers.linux-x64-gnu-xcjh3jwk.node +0 -0
  4. package/dist/types/async/job-manager.d.ts +18 -0
  5. package/dist/types/cli/args.d.ts +2 -1
  6. package/dist/types/cli/dry-balance-cli.d.ts +1 -1
  7. package/dist/types/cli/gallery-cli.d.ts +1 -1
  8. package/dist/types/cli/gallery-fixtures/types.d.ts +1 -1
  9. package/dist/types/cli/usage-cli.d.ts +72 -0
  10. package/dist/types/cli-commands.d.ts +12 -0
  11. package/dist/types/commands/launch.d.ts +5 -1
  12. package/dist/types/commands/read.d.ts +1 -1
  13. package/dist/types/commands/usage.d.ts +25 -0
  14. package/dist/types/config/api-key-resolver.d.ts +3 -0
  15. package/dist/types/config/append-only-context-mode.d.ts +2 -1
  16. package/dist/types/config/model-discovery.d.ts +55 -0
  17. package/dist/types/config/model-registry.d.ts +8 -219
  18. package/dist/types/config/model-resolver.d.ts +34 -10
  19. package/dist/types/config/model-roles.d.ts +28 -0
  20. package/dist/types/config/models-config-schema.d.ts +523 -42
  21. package/dist/types/config/models-config.d.ts +385 -0
  22. package/dist/types/config/settings-schema.d.ts +41 -8
  23. package/dist/types/config/settings.d.ts +8 -1
  24. package/dist/types/debug/log-viewer.d.ts +1 -1
  25. package/dist/types/debug/raw-sse.d.ts +1 -1
  26. package/dist/types/edit/hashline/noop-loop-guard.d.ts +72 -0
  27. package/dist/types/eval/backend.d.ts +0 -2
  28. package/dist/types/eval/idle-timeout.d.ts +0 -4
  29. package/dist/types/eval/js/shared/rewrite-imports.d.ts +6 -6
  30. package/dist/types/eval/py/executor.d.ts +5 -0
  31. package/dist/types/eval/py/kernel.d.ts +6 -1
  32. package/dist/types/eval/py/runtime.d.ts +9 -0
  33. package/dist/types/exec/bash-executor.d.ts +2 -0
  34. package/dist/types/export/html/template.generated.d.ts +1 -1
  35. package/dist/types/extensibility/extensions/runner.d.ts +3 -2
  36. package/dist/types/extensibility/extensions/types.d.ts +6 -3
  37. package/dist/types/hindsight/mental-models.d.ts +17 -8
  38. package/dist/types/internal-urls/artifact-protocol.d.ts +2 -2
  39. package/dist/types/internal-urls/types.d.ts +1 -1
  40. package/dist/types/lsp/edits.d.ts +9 -0
  41. package/dist/types/lsp/index.d.ts +2 -2
  42. package/dist/types/lsp/types.d.ts +2 -0
  43. package/dist/types/lsp/utils.d.ts +3 -0
  44. package/dist/types/mcp/json-rpc.d.ts +5 -0
  45. package/dist/types/memory-backend/index.d.ts +1 -0
  46. package/dist/types/memory-backend/runtime.d.ts +4 -0
  47. package/dist/types/memory-backend/types.d.ts +66 -1
  48. package/dist/types/mnemopi/state.d.ts +11 -1
  49. package/dist/types/modes/components/agent-dashboard.d.ts +1 -1
  50. package/dist/types/modes/components/assistant-message.d.ts +3 -1
  51. package/dist/types/modes/components/bash-execution.d.ts +1 -1
  52. package/dist/types/modes/components/copy-selector.d.ts +1 -1
  53. package/dist/types/modes/components/dynamic-border.d.ts +1 -1
  54. package/dist/types/modes/components/extensions/extension-dashboard.d.ts +1 -1
  55. package/dist/types/modes/components/extensions/extension-list.d.ts +1 -1
  56. package/dist/types/modes/components/extensions/inspector-panel.d.ts +1 -1
  57. package/dist/types/modes/components/footer.d.ts +1 -1
  58. package/dist/types/modes/components/hook-editor.d.ts +5 -0
  59. package/dist/types/modes/components/hook-input.d.ts +4 -0
  60. package/dist/types/modes/components/hook-selector.d.ts +1 -1
  61. package/dist/types/modes/components/model-selector.d.ts +1 -1
  62. package/dist/types/modes/components/plan-review-overlay.d.ts +1 -1
  63. package/dist/types/modes/components/session-observer-overlay.d.ts +1 -1
  64. package/dist/types/modes/components/session-selector.d.ts +1 -1
  65. package/dist/types/modes/components/status-line/component.d.ts +1 -1
  66. package/dist/types/modes/components/tiny-title-download-progress.d.ts +1 -1
  67. package/dist/types/modes/components/transcript-container.d.ts +25 -6
  68. package/dist/types/modes/components/tree-selector.d.ts +1 -1
  69. package/dist/types/modes/components/user-message-selector.d.ts +1 -1
  70. package/dist/types/modes/components/user-message.d.ts +2 -1
  71. package/dist/types/modes/components/visual-truncate.d.ts +1 -1
  72. package/dist/types/modes/components/welcome.d.ts +19 -3
  73. package/dist/types/modes/controllers/mcp-command-controller.d.ts +1 -1
  74. package/dist/types/modes/controllers/streaming-reveal.d.ts +1 -1
  75. package/dist/types/modes/index.d.ts +3 -3
  76. package/dist/types/modes/interactive-mode.d.ts +8 -3
  77. package/dist/types/modes/oauth-manual-input.d.ts +7 -0
  78. package/dist/types/modes/rpc/rpc-client.d.ts +39 -2
  79. package/dist/types/modes/rpc/rpc-mode.d.ts +31 -2
  80. package/dist/types/modes/rpc/rpc-subagents.d.ts +24 -0
  81. package/dist/types/modes/rpc/rpc-types.d.ts +75 -1
  82. package/dist/types/modes/setup-wizard/index.d.ts +5 -1
  83. package/dist/types/modes/setup-wizard/lazy.d.ts +2 -0
  84. package/dist/types/modes/setup-wizard/scenes/sign-in.d.ts +1 -1
  85. package/dist/types/modes/setup-wizard/scenes/types.d.ts +1 -1
  86. package/dist/types/modes/setup-wizard/scenes/web-search.d.ts +1 -1
  87. package/dist/types/modes/setup-wizard/wizard-overlay.d.ts +1 -1
  88. package/dist/types/modes/types.d.ts +4 -1
  89. package/dist/types/secrets/index.d.ts +1 -1
  90. package/dist/types/secrets/obfuscator.d.ts +8 -2
  91. package/dist/types/session/agent-session.d.ts +15 -3
  92. package/dist/types/session/auth-broker-config.d.ts +4 -0
  93. package/dist/types/session/session-manager.d.ts +1 -1
  94. package/dist/types/session/streaming-output.d.ts +23 -0
  95. package/dist/types/slash-commands/acp-builtins.d.ts +16 -0
  96. package/dist/types/slash-commands/builtin-registry.d.ts +1 -0
  97. package/dist/types/slash-commands/helpers/stats-dashboard.d.ts +13 -0
  98. package/dist/types/slash-commands/types.d.ts +1 -1
  99. package/dist/types/ssh/connection-manager.d.ts +8 -0
  100. package/dist/types/system-prompt.d.ts +2 -0
  101. package/dist/types/task/executor.d.ts +1 -0
  102. package/dist/types/task/index.d.ts +2 -2
  103. package/dist/types/task/parallel.d.ts +2 -2
  104. package/dist/types/task/types.d.ts +8 -0
  105. package/dist/types/task/worktree.d.ts +2 -0
  106. package/dist/types/thinking.d.ts +4 -0
  107. package/dist/types/tiny/title-client.d.ts +11 -0
  108. package/dist/types/tiny/title-protocol.d.ts +1 -0
  109. package/dist/types/tools/ask.d.ts +4 -0
  110. package/dist/types/tools/conflict-detect.d.ts +16 -0
  111. package/dist/types/tools/github-cache.d.ts +7 -0
  112. package/dist/types/tools/index.d.ts +6 -0
  113. package/dist/types/tools/sqlite-reader.d.ts +3 -0
  114. package/dist/types/tui/output-block.d.ts +3 -3
  115. package/dist/types/utils/changelog.d.ts +8 -0
  116. package/dist/types/utils/git.d.ts +15 -2
  117. package/dist/types/utils/title-generator.d.ts +3 -2
  118. package/dist/types/web/scrapers/readthedocs.d.ts +3 -0
  119. package/dist/types/web/scrapers/types.d.ts +12 -0
  120. package/dist/types/web/search/providers/codex.d.ts +1 -1
  121. package/dist/types/web/search/providers/gemini.d.ts +1 -1
  122. package/examples/extensions/tools.ts +5 -4
  123. package/package.json +14 -11
  124. package/scripts/build-binary.ts +18 -23
  125. package/scripts/bundle-dist.ts +81 -0
  126. package/scripts/{dev-launch → omp} +1 -1
  127. package/scripts/{dev-launch-preload.ts → omp.ts} +1 -1
  128. package/src/async/job-manager.ts +57 -3
  129. package/src/auto-thinking/classifier.ts +1 -0
  130. package/src/autoresearch/dashboard.ts +1 -1
  131. package/src/autoresearch/prompt-setup.md +6 -6
  132. package/src/autoresearch/prompt.md +6 -6
  133. package/src/capability/fs.ts +10 -0
  134. package/src/cli/args.ts +4 -1
  135. package/src/cli/auth-gateway-cli.ts +1 -3
  136. package/src/cli/dry-balance-cli.ts +1 -1
  137. package/src/cli/gallery-cli.ts +1 -1
  138. package/src/cli/gallery-fixtures/fs.ts +1 -1
  139. package/src/cli/gallery-fixtures/types.ts +5 -1
  140. package/src/cli/list-models.ts +2 -1
  141. package/src/cli/usage-cli.ts +603 -0
  142. package/src/cli-commands.ts +30 -0
  143. package/src/cli.ts +76 -13
  144. package/src/commands/complete.ts +1 -1
  145. package/src/commands/launch.ts +5 -1
  146. package/src/commands/read.ts +6 -3
  147. package/src/commands/usage.ts +35 -0
  148. package/src/commit/agentic/agent.ts +1 -1
  149. package/src/commit/model-selection.ts +4 -3
  150. package/src/config/api-key-resolver.ts +8 -6
  151. package/src/config/append-only-context-mode.ts +6 -12
  152. package/src/config/model-discovery.ts +554 -0
  153. package/src/config/model-registry.ts +320 -1041
  154. package/src/config/model-resolver.ts +173 -156
  155. package/src/config/model-roles.ts +74 -0
  156. package/src/config/models-config-schema.ts +57 -8
  157. package/src/config/models-config.ts +129 -0
  158. package/src/config/settings-schema.ts +61 -19
  159. package/src/config/settings.ts +98 -4
  160. package/src/dap/client.ts +124 -37
  161. package/src/dap/session.ts +259 -158
  162. package/src/debug/log-viewer.ts +1 -1
  163. package/src/debug/raw-sse.ts +1 -1
  164. package/src/edit/diff.ts +47 -3
  165. package/src/edit/hashline/block-resolver.ts +20 -1
  166. package/src/edit/hashline/diff.ts +36 -1
  167. package/src/edit/hashline/execute.ts +47 -4
  168. package/src/edit/hashline/noop-loop-guard.ts +99 -0
  169. package/src/edit/index.ts +16 -1
  170. package/src/edit/modes/patch.ts +52 -0
  171. package/src/edit/modes/replace.ts +56 -22
  172. package/src/edit/notebook.ts +22 -2
  173. package/src/edit/renderer.ts +36 -10
  174. package/src/eval/__tests__/completion-bridge.test.ts +1 -1
  175. package/src/eval/backend.ts +0 -2
  176. package/src/eval/completion-bridge.ts +3 -1
  177. package/src/eval/idle-timeout.ts +2 -9
  178. package/src/eval/js/context-manager.ts +6 -8
  179. package/src/eval/js/executor.ts +6 -2
  180. package/src/eval/js/index.ts +0 -2
  181. package/src/eval/js/shared/helpers.ts +5 -6
  182. package/src/eval/js/shared/local-module-loader.ts +1 -1
  183. package/src/eval/js/shared/prelude.txt +62 -1
  184. package/src/eval/js/shared/rewrite-imports.ts +40 -22
  185. package/src/eval/js/shared/runtime.ts +1 -1
  186. package/src/eval/py/executor.ts +29 -7
  187. package/src/eval/py/index.ts +6 -3
  188. package/src/eval/py/kernel.ts +43 -4
  189. package/src/eval/py/runner.py +107 -3
  190. package/src/eval/py/runtime.ts +37 -0
  191. package/src/exec/bash-executor.ts +85 -4
  192. package/src/export/html/template.generated.ts +1 -1
  193. package/src/export/html/template.js +3 -1
  194. package/src/extensibility/extensions/get-commands-handler.ts +2 -1
  195. package/src/extensibility/extensions/runner.ts +6 -1
  196. package/src/extensibility/extensions/types.ts +6 -2
  197. package/src/extensibility/plugins/legacy-pi-compat.ts +20 -3
  198. package/src/hindsight/bank.ts +17 -2
  199. package/src/hindsight/mental-models.ts +59 -12
  200. package/src/hindsight/state.ts +6 -1
  201. package/src/internal-urls/artifact-protocol.ts +11 -2
  202. package/src/internal-urls/docs-index.generated.ts +11 -11
  203. package/src/internal-urls/issue-pr-protocol.ts +12 -5
  204. package/src/internal-urls/router.ts +1 -1
  205. package/src/internal-urls/types.ts +1 -1
  206. package/src/lib/xai-http.ts +1 -1
  207. package/src/lsp/client.ts +118 -38
  208. package/src/lsp/clients/biome-client.ts +101 -39
  209. package/src/lsp/edits.ts +143 -95
  210. package/src/lsp/index.ts +31 -22
  211. package/src/lsp/render.ts +1 -1
  212. package/src/lsp/types.ts +2 -0
  213. package/src/lsp/utils.ts +28 -10
  214. package/src/main.ts +183 -23
  215. package/src/mcp/json-rpc.ts +35 -5
  216. package/src/mcp/transports/stdio.ts +7 -1
  217. package/src/memories/index.ts +4 -1
  218. package/src/memory-backend/index.ts +1 -0
  219. package/src/memory-backend/local-backend.ts +9 -0
  220. package/src/memory-backend/off-backend.ts +9 -0
  221. package/src/memory-backend/runtime.ts +66 -0
  222. package/src/memory-backend/types.ts +81 -1
  223. package/src/mnemopi/backend.ts +176 -7
  224. package/src/mnemopi/state.ts +38 -2
  225. package/src/modes/acp/acp-agent.ts +119 -11
  226. package/src/modes/components/agent-dashboard.ts +10 -7
  227. package/src/modes/components/assistant-message.ts +32 -28
  228. package/src/modes/components/bash-execution.ts +1 -1
  229. package/src/modes/components/copy-selector.ts +1 -1
  230. package/src/modes/components/diff.ts +13 -2
  231. package/src/modes/components/dynamic-border.ts +12 -3
  232. package/src/modes/components/extensions/extension-dashboard.ts +8 -5
  233. package/src/modes/components/extensions/extension-list.ts +1 -1
  234. package/src/modes/components/extensions/inspector-panel.ts +1 -1
  235. package/src/modes/components/footer.ts +4 -2
  236. package/src/modes/components/history-search.ts +1 -1
  237. package/src/modes/components/hook-editor.ts +8 -0
  238. package/src/modes/components/hook-input.ts +8 -0
  239. package/src/modes/components/hook-selector.ts +2 -2
  240. package/src/modes/components/model-selector.ts +4 -2
  241. package/src/modes/components/plan-review-overlay.ts +1 -1
  242. package/src/modes/components/session-observer-overlay.ts +2 -2
  243. package/src/modes/components/session-selector.ts +1 -1
  244. package/src/modes/components/settings-selector.ts +5 -1
  245. package/src/modes/components/status-line/component.ts +119 -35
  246. package/src/modes/components/tiny-title-download-progress.ts +1 -1
  247. package/src/modes/components/transcript-container.ts +258 -53
  248. package/src/modes/components/tree-selector.ts +3 -3
  249. package/src/modes/components/user-message-selector.ts +1 -1
  250. package/src/modes/components/user-message.ts +17 -5
  251. package/src/modes/components/visual-truncate.ts +1 -1
  252. package/src/modes/components/welcome.ts +108 -26
  253. package/src/modes/controllers/command-controller.ts +11 -4
  254. package/src/modes/controllers/event-controller.ts +73 -4
  255. package/src/modes/controllers/input-controller.ts +2 -1
  256. package/src/modes/controllers/mcp-command-controller.ts +39 -4
  257. package/src/modes/controllers/selector-controller.ts +1 -1
  258. package/src/modes/controllers/streaming-reveal.ts +85 -18
  259. package/src/modes/index.ts +3 -21
  260. package/src/modes/interactive-mode.ts +42 -18
  261. package/src/modes/oauth-manual-input.ts +30 -3
  262. package/src/modes/rpc/rpc-client.ts +154 -3
  263. package/src/modes/rpc/rpc-mode.ts +97 -12
  264. package/src/modes/rpc/rpc-subagents.ts +265 -0
  265. package/src/modes/rpc/rpc-types.ts +81 -1
  266. package/src/modes/setup-wizard/index.ts +12 -2
  267. package/src/modes/setup-wizard/lazy.ts +16 -0
  268. package/src/modes/setup-wizard/scenes/glyph.ts +1 -1
  269. package/src/modes/setup-wizard/scenes/providers.ts +1 -1
  270. package/src/modes/setup-wizard/scenes/sign-in.ts +1 -1
  271. package/src/modes/setup-wizard/scenes/theme.ts +1 -1
  272. package/src/modes/setup-wizard/scenes/types.ts +1 -1
  273. package/src/modes/setup-wizard/scenes/web-search.ts +1 -1
  274. package/src/modes/setup-wizard/wizard-overlay.ts +1 -1
  275. package/src/modes/types.ts +4 -1
  276. package/src/prompts/agents/explore.md +2 -2
  277. package/src/prompts/agents/librarian.md +1 -2
  278. package/src/prompts/agents/oracle.md +1 -1
  279. package/src/prompts/agents/plan.md +5 -5
  280. package/src/prompts/agents/task.md +5 -5
  281. package/src/prompts/ci-green-request.md +5 -7
  282. package/src/prompts/goals/goal-budget-limit.md +2 -2
  283. package/src/prompts/goals/goal-continuation.md +4 -4
  284. package/src/prompts/goals/goal-mode-active.md +1 -1
  285. package/src/prompts/memories/read-path.md +1 -1
  286. package/src/prompts/memories/stage_one_system.md +2 -2
  287. package/src/prompts/review-custom-request.md +1 -1
  288. package/src/prompts/system/agent-creation-architect.md +2 -2
  289. package/src/prompts/system/auto-continue.md +1 -1
  290. package/src/prompts/system/background-tan-dispatch.md +1 -1
  291. package/src/prompts/system/btw-user.md +2 -2
  292. package/src/prompts/system/commit-message-system.md +13 -1
  293. package/src/prompts/system/custom-system-prompt.md +1 -1
  294. package/src/prompts/system/eager-todo.md +2 -2
  295. package/src/prompts/system/irc-incoming.md +1 -1
  296. package/src/prompts/system/manual-continue.md +1 -1
  297. package/src/prompts/system/omfg-user.md +3 -4
  298. package/src/prompts/system/orchestrate-notice.md +9 -9
  299. package/src/prompts/system/plan-mode-active.md +4 -4
  300. package/src/prompts/system/plan-mode-subagent.md +4 -5
  301. package/src/prompts/system/plan-mode-tool-decision-reminder.md +1 -1
  302. package/src/prompts/system/project-prompt.md +2 -2
  303. package/src/prompts/system/subagent-system-prompt.md +4 -4
  304. package/src/prompts/system/system-prompt.md +13 -24
  305. package/src/prompts/system/title-system.md +2 -2
  306. package/src/prompts/system/ttsr-tool-reminder.md +1 -1
  307. package/src/prompts/system/workflow-notice.md +1 -1
  308. package/src/prompts/tools/ast-edit.md +1 -1
  309. package/src/prompts/tools/ast-grep.md +2 -2
  310. package/src/prompts/tools/bash.md +5 -7
  311. package/src/prompts/tools/browser.md +7 -7
  312. package/src/prompts/tools/debug.md +1 -1
  313. package/src/prompts/tools/eval.md +3 -3
  314. package/src/prompts/tools/find.md +0 -1
  315. package/src/prompts/tools/github.md +8 -7
  316. package/src/prompts/tools/goal.md +1 -1
  317. package/src/prompts/tools/image-gen.md +1 -1
  318. package/src/prompts/tools/inspect-image-system.md +1 -1
  319. package/src/prompts/tools/irc.md +15 -15
  320. package/src/prompts/tools/lsp.md +2 -2
  321. package/src/prompts/tools/patch.md +2 -2
  322. package/src/prompts/tools/read.md +3 -4
  323. package/src/prompts/tools/recall.md +1 -1
  324. package/src/prompts/tools/reflect.md +1 -1
  325. package/src/prompts/tools/render-mermaid.md +2 -2
  326. package/src/prompts/tools/replace.md +4 -10
  327. package/src/prompts/tools/rewind.md +2 -2
  328. package/src/prompts/tools/search-tool-bm25.md +1 -9
  329. package/src/prompts/tools/search.md +0 -1
  330. package/src/prompts/tools/ssh.md +0 -4
  331. package/src/prompts/tools/task.md +2 -3
  332. package/src/prompts/tools/todo.md +1 -1
  333. package/src/sdk.ts +31 -11
  334. package/src/secrets/index.ts +8 -1
  335. package/src/secrets/obfuscator.ts +39 -18
  336. package/src/session/agent-session.ts +223 -64
  337. package/src/session/auth-broker-config.ts +30 -1
  338. package/src/session/session-manager.ts +2 -2
  339. package/src/session/streaming-output.ts +188 -11
  340. package/src/slash-commands/acp-builtins.ts +24 -0
  341. package/src/slash-commands/builtin-registry.ts +40 -0
  342. package/src/slash-commands/helpers/stats-dashboard.ts +85 -0
  343. package/src/slash-commands/types.ts +1 -1
  344. package/src/ssh/connection-manager.ts +27 -0
  345. package/src/system-prompt.ts +14 -0
  346. package/src/task/commands.ts +2 -1
  347. package/src/task/executor.ts +74 -65
  348. package/src/task/index.ts +146 -68
  349. package/src/task/parallel.ts +3 -3
  350. package/src/task/render.ts +20 -5
  351. package/src/task/types.ts +9 -0
  352. package/src/task/worktree.ts +64 -56
  353. package/src/thinking.ts +9 -1
  354. package/src/tiny/title-client.ts +60 -16
  355. package/src/tiny/title-protocol.ts +1 -1
  356. package/src/tiny/worker.ts +6 -4
  357. package/src/tools/archive-reader.ts +30 -2
  358. package/src/tools/ask.ts +104 -21
  359. package/src/tools/ast-edit.ts +25 -5
  360. package/src/tools/auto-generated-guard.ts +20 -3
  361. package/src/tools/bash-interactive.ts +27 -7
  362. package/src/tools/bash.ts +100 -18
  363. package/src/tools/browser/launch.ts +11 -2
  364. package/src/tools/browser/readable.ts +19 -2
  365. package/src/tools/browser/registry.ts +4 -1
  366. package/src/tools/browser/render.ts +2 -2
  367. package/src/tools/browser/tab-supervisor.ts +55 -16
  368. package/src/tools/conflict-detect.ts +50 -4
  369. package/src/tools/debug.ts +1 -1
  370. package/src/tools/eval-render.ts +5 -5
  371. package/src/tools/eval.ts +0 -2
  372. package/src/tools/fetch.ts +33 -10
  373. package/src/tools/gh-cache-invalidation.ts +63 -8
  374. package/src/tools/gh-renderer.ts +1 -1
  375. package/src/tools/gh.ts +172 -29
  376. package/src/tools/github-cache.ts +70 -6
  377. package/src/tools/image-gen.ts +14 -13
  378. package/src/tools/index.ts +13 -1
  379. package/src/tools/inspect-image.ts +1 -0
  380. package/src/tools/irc.ts +5 -1
  381. package/src/tools/job.ts +1 -1
  382. package/src/tools/read.ts +202 -61
  383. package/src/tools/render-utils.ts +3 -3
  384. package/src/tools/resolve.ts +1 -1
  385. package/src/tools/search.ts +92 -29
  386. package/src/tools/sqlite-reader.ts +17 -5
  387. package/src/tools/ssh.ts +8 -8
  388. package/src/tools/todo.ts +38 -8
  389. package/src/tools/write.ts +118 -18
  390. package/src/tui/output-block.ts +4 -4
  391. package/src/utils/changelog.ts +27 -1
  392. package/src/utils/commit-message-generator.ts +1 -0
  393. package/src/utils/file-mentions.ts +2 -1
  394. package/src/utils/git.ts +267 -13
  395. package/src/utils/title-generator.ts +24 -5
  396. package/src/web/scrapers/arxiv.ts +1 -1
  397. package/src/web/scrapers/go-pkg.ts +1 -1
  398. package/src/web/scrapers/iacr.ts +1 -1
  399. package/src/web/scrapers/readthedocs.ts +1 -1
  400. package/src/web/scrapers/twitter.ts +2 -1
  401. package/src/web/scrapers/types.ts +87 -8
  402. package/src/web/scrapers/wikipedia.ts +1 -1
  403. package/src/web/scrapers/youtube.ts +6 -1
  404. package/src/web/search/index.ts +1 -1
  405. package/src/web/search/providers/codex.ts +2 -1
  406. package/src/web/search/providers/gemini.ts +2 -3
  407. package/src/web/search/render.ts +8 -6
  408. package/dist/types/config/model-equivalence.d.ts +0 -24
  409. package/dist/types/config/model-id-affixes.d.ts +0 -12
  410. package/dist/types/config/model-provider-priority.d.ts +0 -1
  411. package/dist/types/exec/idle-timeout-watchdog.d.ts +0 -18
  412. package/src/config/model-equivalence.ts +0 -875
  413. package/src/config/model-id-affixes.ts +0 -81
  414. package/src/config/model-provider-priority.ts +0 -56
  415. package/src/exec/idle-timeout-watchdog.ts +0 -126
package/src/cli.ts CHANGED
@@ -14,9 +14,9 @@ try {
14
14
  * CLI entry point — registers all commands explicitly and delegates to the
15
15
  * lightweight CLI runner from pi-utils.
16
16
  */
17
- import { type CliConfig, run } from "@oh-my-pi/pi-utils/cli";
17
+ import type { CliConfig } from "@oh-my-pi/pi-utils/cli";
18
18
  import { APP_NAME, MIN_BUN_VERSION, VERSION } from "@oh-my-pi/pi-utils/dirs";
19
- import { commands, isSubcommand } from "./cli-commands";
19
+ import { declareWorkerHostEntry } from "@oh-my-pi/pi-utils/env";
20
20
 
21
21
  if (Bun.semver.order(Bun.version, MIN_BUN_VERSION) < 0) {
22
22
  process.stderr.write(
@@ -27,6 +27,12 @@ if (Bun.semver.order(Bun.version, MIN_BUN_VERSION) < 0) {
27
27
 
28
28
  process.title = APP_NAME;
29
29
 
30
+ // Declare this module as the worker-host entry: Worker threads and worker
31
+ // subprocesses re-enter `Bun.main` with a hidden argv selector instead of
32
+ // loading separate worker entrypoints (single-entry contract across source,
33
+ // npm bundle, and compiled binary).
34
+ declareWorkerHostEntry();
35
+
30
36
  async function showHelp(config: CliConfig): Promise<void> {
31
37
  const { renderRootHelp } = await import("@oh-my-pi/pi-utils/cli");
32
38
  const { getExtraHelpText } = await import("./cli/args");
@@ -54,6 +60,45 @@ async function runSmokeTest(): Promise<void> {
54
60
  process.stdout.write("smoke-test: ok\n");
55
61
  }
56
62
 
63
+ const TINY_WORKER_ARGS = new Set(["--tiny-worker", "__tiny_worker"]);
64
+ const STATS_SYNC_WORKER_ARG = "__omp_stats_sync_worker";
65
+ const TAB_WORKER_ARG = "__omp_tab_worker";
66
+ const JS_EVAL_WORKER_ARG = "__omp_js_eval_worker";
67
+
68
+ async function runWorkerEntrypoint(arg: string | undefined): Promise<boolean> {
69
+ if (arg === STATS_SYNC_WORKER_ARG) {
70
+ // The sync worker handles messages via `self.onmessage`, assigned during
71
+ // this *async* dynamic import. Bun flushes the worker's initial message
72
+ // buffer when the entry module's top-level evaluation finishes — before
73
+ // this dispatch completes — so anything the parent posted right after
74
+ // spawning (the smoke ping, the first parse request) would be dropped.
75
+ // Park early events and replay them once the module's handler is live.
76
+ // (The tab/eval workers are immune: `parentPort.on("message")` queues
77
+ // until a listener attaches.)
78
+ const scope = globalThis as unknown as { onmessage: ((event: MessageEvent) => void) | null };
79
+ const pending: MessageEvent[] = [];
80
+ const buffer = (event: MessageEvent): void => {
81
+ pending.push(event);
82
+ };
83
+ scope.onmessage = buffer;
84
+ await import("@oh-my-pi/omp-stats/sync-worker");
85
+ const handler = scope.onmessage;
86
+ if (handler && handler !== buffer) {
87
+ for (const event of pending) handler.call(scope, event);
88
+ }
89
+ return true;
90
+ }
91
+ if (arg === TAB_WORKER_ARG) {
92
+ await import("./tools/browser/tab-worker-entry");
93
+ return true;
94
+ }
95
+ if (arg === JS_EVAL_WORKER_ARG) {
96
+ await import("./eval/js/worker-entry");
97
+ return true;
98
+ }
99
+ return false;
100
+ }
101
+
57
102
  /**
58
103
  * Hidden subcommand that boots the tiny-model worker inside this process
59
104
  * over the parent's IPC channel. The agent's main process spawns the same
@@ -90,11 +135,16 @@ async function runTinyWorker(): Promise<void> {
90
135
  };
91
136
  },
92
137
  });
138
+ const keepalive = setInterval(() => {}, 2 ** 30);
93
139
  // Parent went away (crashed, SIGKILL, etc.) — commit suicide so we don't
94
140
  // linger as an orphan. SIGKILL via `process.kill` keeps us symmetrical
95
141
  // with the parent's hard-kill on shutdown: skip every JS/native finalizer.
96
142
  process.on("disconnect", () => shutdown());
97
- await shuttingDown;
143
+ try {
144
+ await shuttingDown;
145
+ } finally {
146
+ clearInterval(keepalive);
147
+ }
98
148
  process.kill(process.pid, "SIGKILL");
99
149
  }
100
150
 
@@ -104,20 +154,33 @@ export async function runCli(argv: string[]): Promise<void> {
104
154
  await runSmokeTest();
105
155
  return;
106
156
  }
107
- if (argv[0] === "--tiny-worker") {
157
+ if (TINY_WORKER_ARGS.has(argv[0] ?? "")) {
108
158
  await runTinyWorker();
109
159
  return;
110
160
  }
161
+ if (await runWorkerEntrypoint(argv[0])) {
162
+ return;
163
+ }
164
+ const [{ run }, { commands, resolveCliArgv }] = await Promise.all([
165
+ import("@oh-my-pi/pi-utils/cli"),
166
+ import("./cli-commands"),
167
+ ]);
111
168
  // --help and --version are handled by run() directly, don't rewrite those.
112
169
  // Everything else that isn't a known subcommand routes to "launch".
113
- const first = argv[0];
114
- const runArgv =
115
- first === "--help" || first === "-h" || first === "--version" || first === "-v" || first === "help"
116
- ? argv
117
- : isSubcommand(first)
118
- ? argv
119
- : ["launch", ...argv];
120
- return run({ bin: APP_NAME, version: VERSION, argv: runArgv, commands, help: showHelp });
170
+ const resolved = resolveCliArgv(argv);
171
+ if ("error" in resolved) {
172
+ process.stderr.write(`error: ${resolved.error}\n`);
173
+ process.exitCode = 1;
174
+ return;
175
+ }
176
+ return run({ bin: APP_NAME, version: VERSION, argv: resolved.argv, commands, help: showHelp });
121
177
  }
122
178
 
123
- await runCli(process.argv.slice(2));
179
+ // Floating call instead of top-level await: TLA forces `--bytecode` (CJS
180
+ // lowering) builds to fail, and the entrypoint needs nothing after this.
181
+ // The catch mirrors what an unhandled TLA rejection produced: error dump to
182
+ // stderr, exit code 1. Success paths resolve without touching the exit code.
183
+ runCli(process.argv.slice(2)).catch((err: unknown) => {
184
+ process.stderr.write(`${Bun.inspect(err, { colors: process.stderr.isTTY === true })}\n`);
185
+ process.exit(1);
186
+ });
@@ -8,7 +8,7 @@
8
8
  * first field. The import surface is kept deliberately narrow so a TAB press
9
9
  * doesn't pay for the full agent boot.
10
10
  */
11
- import { type GeneratedProvider, getBundledModels, getBundledProviders } from "@oh-my-pi/pi-ai/models";
11
+ import { type GeneratedProvider, getBundledModels, getBundledProviders } from "@oh-my-pi/pi-catalog/models";
12
12
  import { Command } from "@oh-my-pi/pi-utils/cli";
13
13
  import { SessionManager } from "../session/session-manager";
14
14
 
@@ -2,7 +2,7 @@
2
2
  * Root command for the coding agent CLI.
3
3
  */
4
4
 
5
- import { THINKING_EFFORTS } from "@oh-my-pi/pi-ai/effort";
5
+ import { THINKING_EFFORTS } from "@oh-my-pi/pi-catalog/effort";
6
6
  import { APP_NAME } from "@oh-my-pi/pi-utils";
7
7
  import { Args, Command, Flags } from "@oh-my-pi/pi-utils/cli";
8
8
  import { parseArgs } from "../cli/args";
@@ -56,6 +56,10 @@ export default class Index extends Command {
56
56
  description: "Output mode: text (default), json, rpc, or rpc-ui",
57
57
  options: ["text", "json", "rpc", "acp", "rpc-ui"],
58
58
  }),
59
+ config: Flags.string({
60
+ description: "Load an extra config.yml-style overlay for this run (repeatable)",
61
+ multiple: true,
62
+ }),
59
63
  print: Flags.boolean({
60
64
  char: "p",
61
65
  description: "Non-interactive mode: process prompt and exit",
@@ -1,16 +1,17 @@
1
1
  /**
2
- * Show what the read tool will return for a given path.
2
+ * Show what the read tool will return for a path, URL, or internal URI.
3
3
  */
4
4
  import { Args, Command } from "@oh-my-pi/pi-utils/cli";
5
5
  import { type ReadCommandArgs, runReadCommand } from "../cli/read-cli";
6
6
  import { initTheme } from "../modes/theme/theme";
7
7
 
8
8
  export default class Read extends Command {
9
- static description = "Show what the read tool will return for a path or URL";
9
+ static description = "Show what the read tool will return for a path, URL, or internal URI";
10
10
 
11
11
  static args = {
12
12
  path: Args.string({
13
- description: "Path or URL to read (append :sel for line ranges or raw mode, e.g. src/foo.ts:50-100)",
13
+ description:
14
+ "Path, URL, or internal URI to read (append :sel for line ranges or raw mode, e.g. src/foo.ts:50-100)",
14
15
  required: true,
15
16
  }),
16
17
  };
@@ -20,6 +21,8 @@ export default class Read extends Command {
20
21
  "omp read src/foo.ts:50-100",
21
22
  "omp read src/foo.ts:raw",
22
23
  "omp read https://example.com",
24
+ "omp read omp://",
25
+ "omp read issue://123",
23
26
  "omp read path/to/archive.zip:dir/file.ts",
24
27
  "omp read path/to/db.sqlite:users:42",
25
28
  ];
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Show provider usage limits for every authenticated account.
3
+ */
4
+ import { Command, Flags } from "@oh-my-pi/pi-utils/cli";
5
+ import { runUsageCommand } from "../cli/usage-cli";
6
+
7
+ export default class Usage extends Command {
8
+ static description = "Show provider usage limits for every authenticated account";
9
+
10
+ static flags = {
11
+ json: Flags.boolean({ char: "j", description: "Output usage reports as JSON", default: false }),
12
+ provider: Flags.string({ char: "p", description: "Only show usage for this provider id (e.g. anthropic)" }),
13
+ redact: Flags.boolean({
14
+ char: "r",
15
+ description: "Redact account emails/ids (shortest unique prefix) for sharing screenshots",
16
+ default: false,
17
+ }),
18
+ };
19
+
20
+ static examples = [
21
+ "# Detailed per-account usage breakdown across all providers\n omp usage",
22
+ "# Only Anthropic accounts\n omp usage --provider anthropic",
23
+ "# Redact account identifiers for screenshots\n omp usage --redact",
24
+ "# Machine-readable output\n omp usage --json",
25
+ ];
26
+
27
+ async run(): Promise<void> {
28
+ const { flags } = await this.parse(Usage);
29
+ await runUsageCommand({
30
+ json: flags.json,
31
+ provider: flags.provider,
32
+ redact: flags.redact,
33
+ });
34
+ }
35
+ }
@@ -213,7 +213,7 @@ function writeAssistantMessage(message: string): void {
213
213
  }
214
214
  }
215
215
 
216
- function renderMarkdownLines(message: string): string[] {
216
+ function renderMarkdownLines(message: string): readonly string[] {
217
217
  const width = Math.max(40, process.stdout.columns ?? 100);
218
218
  const markdown = new Markdown(message, 0, 0, getMarkdownTheme());
219
219
  return markdown.render(width);
@@ -1,7 +1,6 @@
1
1
  import type { ThinkingLevel } from "@oh-my-pi/pi-agent-core";
2
2
  import type { Api, ApiKey, Model } from "@oh-my-pi/pi-ai";
3
3
  import type { ApiKeyResolverRegistry } from "../config/api-key-resolver";
4
- import { MODEL_ROLE_IDS } from "../config/model-registry";
5
4
  import {
6
5
  getModelMatchPreferences,
7
6
  type ModelLookupRegistry,
@@ -9,6 +8,7 @@ import {
9
8
  resolveModelRoleValue,
10
9
  resolveRoleSelection,
11
10
  } from "../config/model-resolver";
11
+ import { MODEL_ROLE_IDS } from "../config/model-roles";
12
12
  import type { Settings } from "../config/settings";
13
13
  import MODEL_PRIO from "../priority.json" with { type: "json" };
14
14
 
@@ -48,7 +48,7 @@ export async function resolvePrimaryModel(
48
48
  }
49
49
  return {
50
50
  model,
51
- apiKey: modelRegistry.resolver(model.provider, { baseUrl: model.baseUrl }),
51
+ apiKey: modelRegistry.resolver(model.provider, { baseUrl: model.baseUrl, modelId: model.id }),
52
52
  thinkingLevel: resolved?.thinkingLevel,
53
53
  };
54
54
  }
@@ -68,6 +68,7 @@ export async function resolveSmolModel(
68
68
  model: resolvedSmol.model,
69
69
  apiKey: modelRegistry.resolver(resolvedSmol.model.provider, {
70
70
  baseUrl: resolvedSmol.model.baseUrl,
71
+ modelId: resolvedSmol.model.id,
71
72
  }),
72
73
  thinkingLevel: resolvedSmol.thinkingLevel,
73
74
  };
@@ -82,7 +83,7 @@ export async function resolveSmolModel(
82
83
  if (apiKey) {
83
84
  return {
84
85
  model: candidate,
85
- apiKey: modelRegistry.resolver(candidate.provider, { baseUrl: candidate.baseUrl }),
86
+ apiKey: modelRegistry.resolver(candidate.provider, { baseUrl: candidate.baseUrl, modelId: candidate.id }),
86
87
  };
87
88
  }
88
89
  }
@@ -5,6 +5,8 @@ export interface ApiKeyResolverOptions {
5
5
  sessionId?: string;
6
6
  /** Provider base URL hint forwarded to the auth-storage cascade. */
7
7
  baseUrl?: string;
8
+ /** Provider model id forwarded to model-scoped usage ranking/backoff. */
9
+ modelId?: string;
8
10
  }
9
11
 
10
12
  /**
@@ -16,7 +18,7 @@ export interface ApiKeyResolverRegistry {
16
18
  getApiKeyForProvider(
17
19
  provider: string,
18
20
  sessionId?: string,
19
- options?: { baseUrl?: string; forceRefresh?: boolean; signal?: AbortSignal },
21
+ options?: { baseUrl?: string; modelId?: string; forceRefresh?: boolean; signal?: AbortSignal },
20
22
  ): Promise<string | undefined>;
21
23
  authStorage: Pick<AuthStorage, "rotateSessionCredential">;
22
24
  /**
@@ -39,10 +41,10 @@ export function createApiKeyResolver(
39
41
  provider: string,
40
42
  options: ApiKeyResolverOptions = {},
41
43
  ): ApiKeyResolver {
42
- const { sessionId, baseUrl } = options;
44
+ const { sessionId, baseUrl, modelId } = options;
43
45
  return async ({ lastChance, error, signal }) => {
44
46
  if (error === undefined) {
45
- return registry.getApiKeyForProvider(provider, sessionId, { baseUrl });
47
+ return registry.getApiKeyForProvider(provider, sessionId, { baseUrl, modelId });
46
48
  }
47
49
  if (lastChance) {
48
50
  // Account constraint (401 / usage / account-rate-limit): rotate to a
@@ -50,9 +52,9 @@ export function createApiKeyResolver(
50
52
  // sibling exists we switch immediately; the precise no-sibling backoff
51
53
  // is owned by `markUsageLimitReached` (default + server usage-report
52
54
  // reset) and the outer whole-turn retry layer.
53
- await registry.authStorage.rotateSessionCredential(provider, sessionId, { error, signal });
54
- return registry.getApiKeyForProvider(provider, sessionId, { baseUrl });
55
+ await registry.authStorage.rotateSessionCredential(provider, sessionId, { error, modelId, signal });
56
+ return registry.getApiKeyForProvider(provider, sessionId, { baseUrl, modelId });
55
57
  }
56
- return registry.getApiKeyForProvider(provider, sessionId, { baseUrl, forceRefresh: true, signal });
58
+ return registry.getApiKeyForProvider(provider, sessionId, { baseUrl, modelId, forceRefresh: true, signal });
57
59
  };
58
60
  }
@@ -1,24 +1,18 @@
1
+ import { hostMatchesUrl } from "@oh-my-pi/pi-catalog/hosts";
2
+
1
3
  /** Provider metadata needed to resolve append-only context mode. */
2
4
  export interface AppendOnlyContextModel {
3
5
  provider: string;
4
6
  baseUrl: string;
5
- compat?: object;
6
- }
7
-
8
- function isXiaomiHost(baseUrl: string): boolean {
9
- try {
10
- const host = new URL(baseUrl).hostname;
11
- return host === "xiaomimimo.com" || host.endsWith(".xiaomimimo.com");
12
- } catch {
13
- return false;
14
- }
7
+ /** Verbatim sparse compat config (explicit user intent), never the resolved record. */
8
+ compatConfig?: object;
15
9
  }
16
10
 
17
11
  function shouldAutoEnableAppendOnlyContext(model: AppendOnlyContextModel | null | undefined): boolean {
18
12
  if (!model) return false;
19
13
  if (model.provider === "deepseek") return true;
20
- if (isXiaomiHost(model.baseUrl)) return true;
21
- return !!model.compat && "supportsStore" in model.compat && model.compat.supportsStore === true;
14
+ if (hostMatchesUrl(model.baseUrl, "xiaomi")) return true;
15
+ return !!model.compatConfig && "supportsStore" in model.compatConfig && model.compatConfig.supportsStore === true;
22
16
  }
23
17
 
24
18
  /** Resolves whether append-only context should be active for a model and setting. */