@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
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import * as fs from "node:fs/promises";
4
+ import * as path from "node:path";
5
+ import { isEnoent } from "@oh-my-pi/pi-utils";
6
+
7
+ const packageDir = path.join(import.meta.dir, "..");
8
+ const outDir = path.join(packageDir, "dist");
9
+ const cliPath = path.join(outDir, "cli.js");
10
+ const shebang = "#!/usr/bin/env bun\n";
11
+
12
+ async function runCommand(command: string[]): Promise<void> {
13
+ const proc = Bun.spawn(command, {
14
+ cwd: packageDir,
15
+ stdout: "inherit",
16
+ stderr: "inherit",
17
+ });
18
+ const exitCode = await proc.exited;
19
+ if (exitCode !== 0) throw new Error(`Command failed with exit code ${exitCode}: ${command.join(" ")}`);
20
+ }
21
+
22
+ async function ensureShebang(): Promise<void> {
23
+ const text = await Bun.file(cliPath).text();
24
+ if (text.startsWith(shebang)) return;
25
+ const withoutExisting = text.startsWith("#!") ? text.slice(text.indexOf("\n") + 1) : text;
26
+ await Bun.write(cliPath, shebang + withoutExisting);
27
+ }
28
+
29
+ function formatBytes(bytes: number): string {
30
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;
31
+ return `${(bytes / (1024 * 1024)).toFixed(2)}MB`;
32
+ }
33
+
34
+ async function cleanBundleOutputs(): Promise<void> {
35
+ // dist/ is shared with the dev binary (dist/omp); only remove this
36
+ // script's own outputs (entry bundle + copied native assets).
37
+ let entries: string[];
38
+ try {
39
+ entries = await fs.readdir(outDir);
40
+ } catch (err) {
41
+ if (isEnoent(err)) return;
42
+ throw err;
43
+ }
44
+ await Promise.all(
45
+ entries
46
+ .filter(entry => entry === "cli.js" || entry.endsWith(".node") || entry.endsWith(".js.map"))
47
+ .map(entry => fs.rm(path.join(outDir, entry), { force: true })),
48
+ );
49
+ }
50
+
51
+ async function main(): Promise<void> {
52
+ const start = Bun.nanoseconds();
53
+ await cleanBundleOutputs();
54
+ await runCommand([
55
+ "bun",
56
+ "build",
57
+ "--target=bun",
58
+ "--outdir",
59
+ "dist",
60
+ "--minify-whitespace",
61
+ "--minify-syntax",
62
+ "--keep-names",
63
+ "--external",
64
+ "mupdf",
65
+ "--external",
66
+ "@oh-my-pi/pi-natives",
67
+ "--external",
68
+ "@huggingface/transformers",
69
+ "--define",
70
+ 'process.env.PI_BUNDLED="true"',
71
+ "./src/cli.ts",
72
+ ]);
73
+ await ensureShebang();
74
+ const stat = await fs.stat(cliPath);
75
+ const elapsedMs = (Bun.nanoseconds() - start) / 1_000_000;
76
+ process.stdout.write(
77
+ `Bundled coding-agent CLI to dist/cli.js (${formatBytes(stat.size)}) in ${elapsedMs.toFixed(0)}ms\n`,
78
+ );
79
+ }
80
+
81
+ await main();
@@ -27,7 +27,7 @@ while [ -L "$self" ]; do
27
27
  done
28
28
  scripts_dir=$(CDPATH= cd -- "$(dirname -- "$self")" && pwd -P)
29
29
  cli=$scripts_dir/../src/cli.ts
30
- preload=$scripts_dir/dev-launch-preload.ts
30
+ preload=$scripts_dir/omp.ts
31
31
  timing_preload=$scripts_dir/../../utils/src/module-timer.ts
32
32
 
33
33
  launch_dir=${OMP_DEV_LAUNCH_DIR:-${HOME}/.omp/.dev-cwd}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Bun `--preload` shim for the omp dev launcher (`scripts/dev-launch`).
2
+ * Bun `--preload` shim for the omp dev launcher (`scripts/omp`).
3
3
  *
4
4
  * The launcher starts Bun from an empty, bunfig-free directory so a foreign
5
5
  * project's `bunfig.toml` `preload` cannot run inside the omp CLI: Bun reads
@@ -23,6 +23,12 @@ export interface AsyncJob {
23
23
  * supply an id (e.g. legacy tests, SDK consumers without an agent context).
24
24
  */
25
25
  ownerId?: string;
26
+ /**
27
+ * Job is registered but parked behind a caller-managed gate (e.g. a task
28
+ * batch semaphore). Queued jobs do not count toward the running-job limit
29
+ * until the caller invokes `markRunning()` from the run context.
30
+ */
31
+ queued?: boolean;
26
32
  }
27
33
 
28
34
  export interface AsyncJobManagerOptions {
@@ -53,6 +59,8 @@ export interface AsyncJobRegisterOptions {
53
59
  /** Registry id of the agent that owns this job; used to scope cancelAll. */
54
60
  ownerId?: string;
55
61
  onProgress?: (text: string, details?: Record<string, unknown>) => void | Promise<void>;
62
+ /** Register the job in queued state; see {@link AsyncJob.queued}. */
63
+ queued?: boolean;
56
64
  }
57
65
 
58
66
  /**
@@ -110,6 +118,17 @@ export class AsyncJobManager {
110
118
  this.#retentionMs = Math.max(0, Math.floor(options.retentionMs ?? DEFAULT_RETENTION_MS));
111
119
  }
112
120
 
121
+ /** True when the running-job count has reached the configured cap. */
122
+ get atCapacity(): boolean {
123
+ if (this.#disposed) return true;
124
+ // Mirror register(): queued jobs hold no execution slot.
125
+ let activeCount = 0;
126
+ for (const job of this.#jobs.values()) {
127
+ if (job.status === "running" && !job.queued) activeCount++;
128
+ }
129
+ return activeCount >= this.#maxRunningJobs;
130
+ }
131
+
113
132
  register(
114
133
  type: "bash" | "task",
115
134
  label: string,
@@ -117,14 +136,21 @@ export class AsyncJobManager {
117
136
  jobId: string;
118
137
  signal: AbortSignal;
119
138
  reportProgress: (text: string, details?: Record<string, unknown>) => Promise<void>;
139
+ /** Clear the queued flag once the job actually starts executing. */
140
+ markRunning: () => void;
120
141
  }) => Promise<string>,
121
142
  options?: AsyncJobRegisterOptions,
122
143
  ): string {
123
144
  if (this.#disposed) {
124
145
  throw new Error("Async job manager is disposed");
125
146
  }
126
- const runningCount = this.getRunningJobs().length;
127
- if (runningCount >= this.#maxRunningJobs) {
147
+ // Queued jobs hold no execution slot yet — only count jobs that are
148
+ // actually running so a large parked batch cannot starve registration.
149
+ let activeCount = 0;
150
+ for (const existing of this.#jobs.values()) {
151
+ if (existing.status === "running" && !existing.queued) activeCount++;
152
+ }
153
+ if (activeCount >= this.#maxRunningJobs) {
128
154
  throw new Error(
129
155
  `Background job limit reached (${this.#maxRunningJobs}). Wait for running jobs to finish or cancel one.`,
130
156
  );
@@ -144,6 +170,7 @@ export class AsyncJobManager {
144
170
  abortController,
145
171
  promise: Promise.resolve(),
146
172
  ownerId: options?.ownerId,
173
+ queued: options?.queued === true,
147
174
  };
148
175
 
149
176
  const reportProgress = async (text: string, details?: Record<string, unknown>): Promise<void> => {
@@ -159,7 +186,14 @@ export class AsyncJobManager {
159
186
  };
160
187
  job.promise = (async () => {
161
188
  try {
162
- const text = await run({ jobId: id, signal: abortController.signal, reportProgress });
189
+ const text = await run({
190
+ jobId: id,
191
+ signal: abortController.signal,
192
+ reportProgress,
193
+ markRunning: () => {
194
+ job.queued = false;
195
+ },
196
+ });
163
197
  if (job.status === "cancelled") {
164
198
  job.resultText = text;
165
199
  this.#scheduleEviction(id);
@@ -278,6 +312,26 @@ export class AsyncJobManager {
278
312
  return before - this.#deliveries.length;
279
313
  }
280
314
 
315
+ /**
316
+ * Lift a foreground-wait suppression set via `acknowledgeDeliveries`. If the
317
+ * job already finished while suppressed (its delivery enqueue was skipped),
318
+ * re-enqueue the completion so the result is still delivered exactly once.
319
+ */
320
+ resumeDeliveries(jobIds: string[]): void {
321
+ for (const rawId of jobIds) {
322
+ const jobId = rawId.trim();
323
+ if (!jobId) continue;
324
+ if (!this.#suppressedDeliveries.delete(jobId)) continue;
325
+ const job = this.#jobs.get(jobId);
326
+ if (!job || (job.status !== "completed" && job.status !== "failed")) continue;
327
+ const queued =
328
+ this.#deliveries.some(delivery => delivery.jobId === jobId) ||
329
+ this.#inFlightDeliveries.some(delivery => delivery.jobId === jobId);
330
+ if (queued) continue;
331
+ this.#enqueueDelivery(jobId, job.status === "completed" ? (job.resultText ?? "") : (job.errorText ?? ""));
332
+ }
333
+ }
334
+
281
335
  /**
282
336
  * Cancel running jobs. With `filter.ownerId` set, cancels only jobs the
283
337
  * matching agent registered; with no filter, cancels every running job
@@ -86,6 +86,7 @@ async function classifyOnline(input: string, deps: ClassifyDifficultyDeps): Prom
86
86
  apiKey: deps.registry.resolver(model.provider, {
87
87
  sessionId: deps.sessionId,
88
88
  baseUrl: model.baseUrl,
89
+ modelId: model.id,
89
90
  }),
90
91
  maxTokens,
91
92
  disableReasoning: true,
@@ -66,7 +66,7 @@ export function createDashboardController(): DashboardController {
66
66
 
67
67
  let scrollOffset = 0;
68
68
  return {
69
- render(width: number): string[] {
69
+ render(width: number): readonly string[] {
70
70
  const terminalRows = process.stdout.rows ?? 40;
71
71
  const header = renderExpandedHeader(runtime, width, theme);
72
72
  const body = renderDashboardLines(runtime, width, theme, 0);
@@ -18,16 +18,16 @@ Working directory: `{{working_dir}}`
18
18
  {{baseline_warning}}
19
19
  {{/if}}
20
20
 
21
- ### What you must produce
21
+ ### What you MUST produce
22
22
 
23
- Write `./autoresearch.sh` at the working directory. It is the canonical benchmark entrypoint and must:
23
+ Write `./autoresearch.sh` at the working directory. It is the canonical benchmark entrypoint and MUST:
24
24
 
25
25
  - exit 0 on success and non-zero on failure;
26
26
  - print the primary metric as a single line `METRIC <name>=<value>`;
27
27
  - print any secondary metrics as additional `METRIC <name>=<value>` lines;
28
28
  - run the same workload deterministically every time (no live network, no time-of-day dependencies, fixed seeds where applicable).
29
29
 
30
- You **may** edit anything else needed to make `autoresearch.sh` work — benchmark binaries, `Cargo.toml`, `package.json`, helper scripts, fixtures. All those edits are part of the harness baseline and will be committed for you when you call `init_experiment` on an autoresearch branch.
30
+ You MAY edit anything else needed to make `autoresearch.sh` work — benchmark binaries, `Cargo.toml`, `package.json`, helper scripts, fixtures. All those edits are part of the harness baseline and will be committed for you when you call `init_experiment` on an autoresearch branch.
31
31
 
32
32
  ### Steps
33
33
 
@@ -38,6 +38,6 @@ You **may** edit anything else needed to make `autoresearch.sh` work — benchma
38
38
 
39
39
  ### Rules
40
40
 
41
- - Do **not** call `run_experiment`, `log_experiment`, or `update_notes` yet. They will error with "no active autoresearch session" until `init_experiment` runs.
42
- - Do **not** treat a compile-only check as a benchmark. The harness must actually execute the workload and emit `METRIC`.
43
- - Do **not** create `autoresearch.md`, `autoresearch.checks.sh`, `autoresearch.program.md`, `autoresearch.ideas.md`, `autoresearch.jsonl`, `.autoresearch/`, or `autoresearch.config.json`. Session state is tracked for you.
41
+ - NEVER call `run_experiment`, `log_experiment`, or `update_notes` yet. They will error with "no active autoresearch session" until `init_experiment` runs.
42
+ - NEVER treat a compile-only check as a benchmark. The harness MUST actually execute the workload and emit `METRIC`.
43
+ - NEVER create `autoresearch.md`, `autoresearch.checks.sh`, `autoresearch.program.md`, `autoresearch.ideas.md`, `autoresearch.jsonl`, `.autoresearch/`, or `autoresearch.config.json`. Session state is tracked for you.
@@ -11,17 +11,17 @@ Primary goal:
11
11
  There is no goal recorded for this session yet. Infer what to optimize from the latest user message and the conversation; capture the goal in your notes (`update_notes`) once it is clear.
12
12
  {{/if}}
13
13
 
14
- Session state and run artifacts are managed for you. The benchmark entrypoint is `bash autoresearch.sh` (committed during Phase 1). Do not edit `autoresearch.sh` mid-segment unless you intentionally bump segment via `init_experiment new_segment: true`. Do not create `autoresearch.md` or `.autoresearch/` in this repo.
14
+ Session state and run artifacts are managed for you. The benchmark entrypoint is `bash autoresearch.sh` (committed during Phase 1). NEVER edit `autoresearch.sh` mid-segment unless you intentionally bump segment via `init_experiment new_segment: true`. NEVER create `autoresearch.md` or `.autoresearch/` in this repo.
15
15
 
16
16
  Working directory: `{{working_dir}}`
17
17
  {{#if has_branch}}Active branch: `{{branch}}`{{/if}}
18
18
  {{#if has_baseline_commit}}Baseline commit: `{{baseline_commit}}`{{/if}}
19
19
 
20
- You are running an autonomous experiment loop. Keep iterating until the user interrupts you or the configured maximum iteration count is reached.
20
+ You are running an autonomous experiment loop. You MUST keep iterating until the user interrupts you or the configured maximum iteration count is reached.
21
21
 
22
22
  ### Available tools
23
23
  - `init_experiment` — open or reconfigure the session. Pass `new_segment: true` to start a fresh baseline within the current session.
24
- - `run_experiment` — run the benchmark (`bash autoresearch.sh`). Output is captured automatically and `METRIC name=value` / `ASI key=value` lines printed by the harness are parsed back to you. The command is fixed; if you need a different workload, edit `autoresearch.sh` and bump segment via `init_experiment new_segment: true`.
24
+ - `run_experiment` — run the benchmark (`bash autoresearch.sh`). Output is captured automatically and `METRIC name=value` / `ASI key=value` lines printed by the harness are parsed back to you. The command is fixed.
25
25
  - `log_experiment` — record the result. On `keep`, modified files are committed for you; on `discard`/`crash`/`checks_failed`, the worktree is reverted. Pass `flag_runs` to mark earlier runs as suspect; flagged runs are excluded from baseline and best-metric math.
26
26
  - `update_notes` — replace the durable session playbook (`body`) or append to the ideas backlog (`append_idea`). The notes are injected into your system prompt every iteration.
27
27
 
@@ -97,7 +97,7 @@ Finish the `log_experiment` step before starting another benchmark.
97
97
  {{/if}}
98
98
 
99
99
  ### Guardrails
100
- - Do not game the benchmark.
101
- - Do not overfit to synthetic inputs if the real workload is broader.
102
- - Preserve correctness.
100
+ - NEVER game the benchmark.
101
+ - NEVER overfit to synthetic inputs if the real workload is broader.
102
+ - MUST preserve correctness.
103
103
  - If the user sends another message while a run is in progress, finish the current run and logging cycle first, then address the new input in the next iteration.
@@ -15,6 +15,16 @@ export async function readFile(filePath: string): Promise<string | null> {
15
15
  }
16
16
 
17
17
  try {
18
+ // Gate on the file type first: discovery scans foreign config dirs
19
+ // (~/.claude, ~/.cursor, project trees), and reading a FIFO/socket/char
20
+ // device with `.text()` blocks until EOF — i.e. forever — hanging
21
+ // startup with zero output. `stat` follows symlinks, so symlinked
22
+ // context files (CLAUDE.md -> AGENTS.md) still resolve.
23
+ const stats = await fs.promises.stat(abs);
24
+ if (!stats.isFile()) {
25
+ contentCache.set(abs, null);
26
+ return null;
27
+ }
18
28
  const content = await Bun.file(abs).text();
19
29
  contentCache.set(abs, content);
20
30
  return content;
package/src/cli/args.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * CLI argument parsing and help display
3
3
  */
4
- import { type Effort, THINKING_EFFORTS } from "@oh-my-pi/pi-ai/effort";
4
+ import { type Effort, THINKING_EFFORTS } from "@oh-my-pi/pi-catalog/effort";
5
5
  import { APP_NAME, CONFIG_DIR_NAME, logger } from "@oh-my-pi/pi-utils";
6
6
  import chalk from "chalk";
7
7
  import { parseEffort } from "../thinking";
@@ -14,6 +14,7 @@ export interface Args {
14
14
  allowHome?: boolean;
15
15
  provider?: string;
16
16
  model?: string;
17
+ config?: string[];
17
18
  smol?: string;
18
19
  slow?: string;
19
20
  plan?: string;
@@ -111,6 +112,8 @@ export function parseArgs(inputArgs: string[], extensionFlags?: Map<string, { ty
111
112
  result.allowHome = true;
112
113
  } else if (arg === "--cwd" && i + 1 < args.length) {
113
114
  result.cwd = args[++i];
115
+ } else if (arg === "--config" && i + 1 < args.length) {
116
+ result.config = [...(result.config ?? []), args[++i]];
114
117
  } else if (arg === "--mode" && i + 1 < args.length) {
115
118
  const mode = args[++i];
116
119
  if (mode === "text" || mode === "json" || mode === "rpc" || mode === "acp" || mode === "rpc-ui") {
@@ -24,14 +24,12 @@ import {
24
24
  type CredentialCompletionResult,
25
25
  completeSimple,
26
26
  DEFAULT_AUTH_GATEWAY_BIND,
27
- type GeneratedProvider,
28
- getBundledModels,
29
- getBundledProviders,
30
27
  type Model,
31
28
  RemoteAuthCredentialStore,
32
29
  type SnapshotResponse,
33
30
  startAuthGateway,
34
31
  } from "@oh-my-pi/pi-ai";
32
+ import { type GeneratedProvider, getBundledModels, getBundledProviders } from "@oh-my-pi/pi-catalog/models";
35
33
  import { getConfigRootDir, isEnoent, VERSION } from "@oh-my-pi/pi-utils";
36
34
  import chalk from "chalk";
37
35
  import { type AuthBrokerClientConfig, resolveAuthBrokerConfig } from "../session/auth-broker-config";
@@ -12,10 +12,10 @@ import type {
12
12
  SimpleStreamOptions,
13
13
  } from "@oh-my-pi/pi-ai";
14
14
  import { streamSimple } from "@oh-my-pi/pi-ai";
15
+ import type { CanonicalModelVariant } from "@oh-my-pi/pi-catalog/identity";
15
16
  import { replaceTabs, truncateToWidth } from "@oh-my-pi/pi-tui";
16
17
  import { formatDuration, getProjectDir } from "@oh-my-pi/pi-utils";
17
18
  import chalk from "chalk";
18
- import type { CanonicalModelVariant } from "../config/model-equivalence";
19
19
  import { type CanonicalModelQueryOptions, ModelRegistry } from "../config/model-registry";
20
20
  import {
21
21
  formatModelString,
@@ -104,7 +104,7 @@ export async function renderGalleryState(
104
104
  state: GalleryState,
105
105
  width: number,
106
106
  expanded = false,
107
- ): Promise<string[]> {
107
+ ): Promise<readonly string[]> {
108
108
  if (fixture.renderState) {
109
109
  return await fixture.renderState(state, width, expanded);
110
110
  }
@@ -56,7 +56,7 @@ function addGroupedReadArgs(component: ReadToolGroupComponent): void {
56
56
  component.updateArgs({ path: groupedReadRepeatedRanges }, "read-ranges");
57
57
  }
58
58
 
59
- function renderReadGroupFixtureState(state: GalleryFixtureState, width: number, expanded: boolean): string[] {
59
+ function renderReadGroupFixtureState(state: GalleryFixtureState, width: number, expanded: boolean): readonly string[] {
60
60
  const component = new ReadToolGroupComponent();
61
61
  component.setExpanded(expanded);
62
62
 
@@ -22,7 +22,11 @@ export interface GalleryFixture {
22
22
  * Custom gallery-only renderer for fixtures that are not one ToolExecutionComponent
23
23
  * (for example the read-group transcript component).
24
24
  */
25
- renderState?: (state: GalleryFixtureState, width: number, expanded: boolean) => string[] | Promise<string[]>;
25
+ renderState?: (
26
+ state: GalleryFixtureState,
27
+ width: number,
28
+ expanded: boolean,
29
+ ) => readonly string[] | Promise<readonly string[]>;
26
30
  /**
27
31
  * Set for tools whose real `AgentTool` attaches `renderCall`/`renderResult`
28
32
  * directly on the instance (e.g. `task`). The harness then attaches
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * List available models with optional fuzzy search
3
3
  */
4
- import { type Api, getSupportedEfforts, type Model } from "@oh-my-pi/pi-ai";
4
+ import type { Api, Model } from "@oh-my-pi/pi-ai";
5
+ import { getSupportedEfforts } from "@oh-my-pi/pi-catalog/model-thinking";
5
6
  import { fuzzyFilter } from "@oh-my-pi/pi-tui";
6
7
  import { formatNumber } from "@oh-my-pi/pi-utils";
7
8
  import type { ModelRegistry } from "../config/model-registry";