@oh-my-pi/pi-coding-agent 8.1.0 → 8.2.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 (402) hide show
  1. package/CHANGELOG.md +21 -1
  2. package/docs/session.md +111 -46
  3. package/examples/custom-tools/hello/index.ts +1 -1
  4. package/examples/custom-tools/todo/index.ts +3 -4
  5. package/examples/extensions/api-demo.ts +0 -1
  6. package/examples/extensions/chalk-logger.ts +2 -3
  7. package/examples/extensions/hello.ts +0 -1
  8. package/examples/extensions/pirate.ts +0 -1
  9. package/examples/extensions/plan-mode.ts +15 -16
  10. package/examples/extensions/todo.ts +3 -4
  11. package/examples/extensions/tools.ts +1 -2
  12. package/examples/extensions/with-deps/index.ts +0 -1
  13. package/examples/hooks/auto-commit-on-exit.ts +1 -2
  14. package/examples/hooks/confirm-destructive.ts +0 -1
  15. package/examples/hooks/custom-compaction.ts +1 -2
  16. package/examples/hooks/dirty-repo-guard.ts +0 -1
  17. package/examples/hooks/file-trigger.ts +3 -4
  18. package/examples/hooks/git-checkpoint.ts +0 -1
  19. package/examples/hooks/handoff.ts +3 -4
  20. package/examples/hooks/permission-gate.ts +1 -2
  21. package/examples/hooks/protected-paths.ts +1 -2
  22. package/examples/hooks/qna.ts +2 -3
  23. package/examples/hooks/snake.ts +4 -5
  24. package/examples/hooks/status-line.ts +0 -1
  25. package/examples/sdk/01-minimal.ts +2 -3
  26. package/examples/sdk/02-custom-model.ts +2 -3
  27. package/examples/sdk/03-custom-prompt.ts +3 -4
  28. package/examples/sdk/04-skills.ts +2 -3
  29. package/examples/sdk/06-extensions.ts +1 -2
  30. package/examples/sdk/06-hooks.ts +6 -7
  31. package/examples/sdk/07-context-files.ts +0 -1
  32. package/examples/sdk/08-prompt-templates.ts +0 -1
  33. package/examples/sdk/08-slash-commands.ts +0 -1
  34. package/examples/sdk/09-api-keys-and-oauth.ts +0 -1
  35. package/examples/sdk/10-settings.ts +0 -1
  36. package/examples/sdk/11-sessions.ts +0 -1
  37. package/package.json +51 -23
  38. package/scripts/format-prompts.ts +0 -1
  39. package/src/capability/context-file.ts +2 -3
  40. package/src/capability/extension-module.ts +2 -3
  41. package/src/capability/extension.ts +2 -3
  42. package/src/capability/fs.ts +20 -21
  43. package/src/capability/hook.ts +2 -3
  44. package/src/capability/index.ts +15 -16
  45. package/src/capability/instruction.ts +2 -3
  46. package/src/capability/mcp.ts +2 -3
  47. package/src/capability/prompt.ts +2 -3
  48. package/src/capability/rule.ts +2 -3
  49. package/src/capability/settings.ts +1 -2
  50. package/src/capability/skill.ts +2 -3
  51. package/src/capability/slash-command.ts +2 -3
  52. package/src/capability/ssh.ts +2 -3
  53. package/src/capability/system-prompt.ts +2 -3
  54. package/src/capability/tool.ts +2 -3
  55. package/src/cli/args.ts +5 -6
  56. package/src/cli/config-cli.ts +6 -7
  57. package/src/cli/file-processor.ts +19 -17
  58. package/src/cli/jupyter-cli.ts +105 -0
  59. package/src/cli/list-models.ts +10 -11
  60. package/src/cli/plugin-cli.ts +20 -21
  61. package/src/cli/session-picker.ts +2 -3
  62. package/src/cli/setup-cli.ts +2 -3
  63. package/src/cli/stats-cli.ts +2 -3
  64. package/src/cli/update-cli.ts +25 -22
  65. package/src/commit/agentic/agent.ts +21 -23
  66. package/src/commit/agentic/fallback.ts +9 -9
  67. package/src/commit/agentic/index.ts +30 -38
  68. package/src/commit/agentic/state.ts +1 -6
  69. package/src/commit/agentic/tools/analyze-file.ts +15 -15
  70. package/src/commit/agentic/tools/git-file-diff.ts +3 -3
  71. package/src/commit/agentic/tools/git-hunk.ts +7 -7
  72. package/src/commit/agentic/tools/git-overview.ts +5 -5
  73. package/src/commit/agentic/tools/index.ts +14 -14
  74. package/src/commit/agentic/tools/propose-changelog.ts +6 -6
  75. package/src/commit/agentic/tools/propose-commit.ts +8 -8
  76. package/src/commit/agentic/tools/recent-commits.ts +2 -2
  77. package/src/commit/agentic/tools/split-commit.ts +19 -23
  78. package/src/commit/agentic/topo-sort.ts +1 -1
  79. package/src/commit/agentic/trivial.ts +3 -3
  80. package/src/commit/agentic/validation.ts +12 -12
  81. package/src/commit/analysis/conventional.ts +7 -11
  82. package/src/commit/analysis/index.ts +4 -4
  83. package/src/commit/analysis/scope.ts +4 -4
  84. package/src/commit/analysis/summary.ts +7 -9
  85. package/src/commit/analysis/validation.ts +1 -1
  86. package/src/commit/changelog/detect.ts +6 -6
  87. package/src/commit/changelog/generate.ts +7 -9
  88. package/src/commit/changelog/index.ts +13 -13
  89. package/src/commit/changelog/parse.ts +2 -2
  90. package/src/commit/cli.ts +1 -1
  91. package/src/commit/git/diff.ts +3 -3
  92. package/src/commit/git/index.ts +19 -24
  93. package/src/commit/index.ts +1 -1
  94. package/src/commit/map-reduce/index.ts +9 -9
  95. package/src/commit/map-reduce/map-phase.ts +19 -34
  96. package/src/commit/map-reduce/reduce-phase.ts +9 -11
  97. package/src/commit/message.ts +2 -2
  98. package/src/commit/model-selection.ts +3 -7
  99. package/src/commit/pipeline.ts +20 -22
  100. package/src/commit/utils/exclusions.ts +3 -3
  101. package/src/config/file-lock.ts +17 -7
  102. package/src/config/keybindings.ts +6 -8
  103. package/src/config/model-registry.ts +55 -37
  104. package/src/config/model-resolver.ts +18 -19
  105. package/src/config/prompt-templates.ts +11 -11
  106. package/src/config/settings-manager.ts +50 -34
  107. package/src/config.ts +60 -62
  108. package/src/cursor.ts +11 -9
  109. package/src/discovery/agents-md.ts +11 -12
  110. package/src/discovery/builtin.ts +68 -73
  111. package/src/discovery/claude.ts +41 -42
  112. package/src/discovery/cline.ts +11 -12
  113. package/src/discovery/codex.ts +52 -53
  114. package/src/discovery/cursor.ts +9 -10
  115. package/src/discovery/gemini.ts +17 -22
  116. package/src/discovery/github.ts +13 -14
  117. package/src/discovery/helpers.ts +35 -34
  118. package/src/discovery/index.ts +16 -18
  119. package/src/discovery/mcp-json.ts +8 -9
  120. package/src/discovery/ssh.ts +8 -9
  121. package/src/discovery/vscode.ts +4 -5
  122. package/src/discovery/windsurf.ts +6 -7
  123. package/src/exa/company.ts +1 -2
  124. package/src/exa/index.ts +2 -3
  125. package/src/exa/linkedin.ts +1 -2
  126. package/src/exa/mcp-client.ts +14 -16
  127. package/src/exa/render.ts +10 -11
  128. package/src/exa/researcher.ts +1 -2
  129. package/src/exa/search.ts +1 -2
  130. package/src/exa/types.ts +0 -1
  131. package/src/exa/websets.ts +1 -2
  132. package/src/exec/bash-executor.ts +3 -4
  133. package/src/exec/exec.ts +0 -1
  134. package/src/export/custom-share.ts +5 -6
  135. package/src/export/html/index.ts +24 -21
  136. package/src/export/ttsr.ts +2 -3
  137. package/src/extensibility/custom-commands/bundled/review/index.ts +7 -8
  138. package/src/extensibility/custom-commands/loader.ts +17 -14
  139. package/src/extensibility/custom-commands/types.ts +1 -2
  140. package/src/extensibility/custom-tools/loader.ts +10 -11
  141. package/src/extensibility/custom-tools/types.ts +6 -7
  142. package/src/extensibility/custom-tools/wrapper.ts +2 -3
  143. package/src/extensibility/extensions/loader.ts +75 -53
  144. package/src/extensibility/extensions/runner.ts +11 -12
  145. package/src/extensibility/extensions/types.ts +19 -26
  146. package/src/extensibility/extensions/wrapper.ts +3 -4
  147. package/src/extensibility/hooks/index.ts +1 -1
  148. package/src/extensibility/hooks/loader.ts +8 -9
  149. package/src/extensibility/hooks/runner.ts +7 -8
  150. package/src/extensibility/hooks/tool-wrapper.ts +0 -1
  151. package/src/extensibility/hooks/types.ts +10 -17
  152. package/src/extensibility/plugins/doctor.ts +3 -3
  153. package/src/extensibility/plugins/installer.ts +27 -27
  154. package/src/extensibility/plugins/loader.ts +59 -56
  155. package/src/extensibility/plugins/manager.ts +211 -171
  156. package/src/extensibility/plugins/parser.ts +1 -1
  157. package/src/extensibility/plugins/paths.ts +8 -8
  158. package/src/extensibility/skills.ts +63 -60
  159. package/src/extensibility/slash-commands.ts +10 -10
  160. package/src/index.ts +46 -46
  161. package/src/internal-urls/agent-protocol.ts +21 -11
  162. package/src/internal-urls/artifact-protocol.ts +17 -13
  163. package/src/internal-urls/router.ts +1 -2
  164. package/src/internal-urls/rule-protocol.ts +3 -4
  165. package/src/internal-urls/skill-protocol.ts +3 -4
  166. package/src/ipy/executor.ts +14 -10
  167. package/src/ipy/gateway-coordinator.ts +79 -90
  168. package/src/ipy/kernel.ts +32 -30
  169. package/src/ipy/modules.ts +13 -13
  170. package/src/lsp/client.ts +21 -10
  171. package/src/lsp/clients/biome-client.ts +1 -2
  172. package/src/lsp/clients/index.ts +3 -3
  173. package/src/lsp/clients/lsp-linter-client.ts +4 -5
  174. package/src/lsp/config.ts +15 -15
  175. package/src/lsp/edits.ts +4 -5
  176. package/src/lsp/index.ts +43 -44
  177. package/src/lsp/lspmux.ts +8 -8
  178. package/src/lsp/render.ts +10 -16
  179. package/src/lsp/utils.ts +3 -3
  180. package/src/main.ts +55 -34
  181. package/src/mcp/client.ts +2 -3
  182. package/src/mcp/config.ts +5 -6
  183. package/src/mcp/json-rpc.ts +0 -1
  184. package/src/mcp/loader.ts +3 -4
  185. package/src/mcp/manager.ts +17 -18
  186. package/src/mcp/tool-bridge.ts +4 -9
  187. package/src/mcp/tool-cache.ts +2 -3
  188. package/src/mcp/transports/http.ts +2 -4
  189. package/src/mcp/transports/stdio.ts +1 -2
  190. package/src/migrations.ts +60 -49
  191. package/src/modes/components/armin.ts +4 -5
  192. package/src/modes/components/assistant-message.ts +6 -6
  193. package/src/modes/components/bash-execution.ts +7 -8
  194. package/src/modes/components/bordered-loader.ts +3 -3
  195. package/src/modes/components/branch-summary-message.ts +3 -3
  196. package/src/modes/components/compaction-summary-message.ts +3 -3
  197. package/src/modes/components/countdown-timer.ts +0 -1
  198. package/src/modes/components/custom-message.ts +5 -5
  199. package/src/modes/components/diff.ts +1 -1
  200. package/src/modes/components/dynamic-border.ts +2 -2
  201. package/src/modes/components/extensions/extension-dashboard.ts +6 -7
  202. package/src/modes/components/extensions/extension-list.ts +2 -3
  203. package/src/modes/components/extensions/inspector-panel.ts +3 -4
  204. package/src/modes/components/extensions/state-manager.ts +25 -26
  205. package/src/modes/components/extensions/types.ts +1 -2
  206. package/src/modes/components/footer.ts +47 -43
  207. package/src/modes/components/history-search.ts +2 -2
  208. package/src/modes/components/hook-editor.ts +3 -4
  209. package/src/modes/components/hook-input.ts +2 -3
  210. package/src/modes/components/hook-message.ts +5 -5
  211. package/src/modes/components/hook-selector.ts +2 -3
  212. package/src/modes/components/keybinding-hints.ts +2 -3
  213. package/src/modes/components/login-dialog.ts +2 -2
  214. package/src/modes/components/model-selector.ts +12 -12
  215. package/src/modes/components/oauth-selector.ts +2 -2
  216. package/src/modes/components/plugin-settings.ts +20 -20
  217. package/src/modes/components/python-execution.ts +7 -8
  218. package/src/modes/components/queue-mode-selector.ts +3 -3
  219. package/src/modes/components/read-tool-group.ts +2 -2
  220. package/src/modes/components/session-selector.ts +4 -4
  221. package/src/modes/components/settings-defs.ts +77 -69
  222. package/src/modes/components/settings-selector.ts +16 -16
  223. package/src/modes/components/show-images-selector.ts +2 -2
  224. package/src/modes/components/status-line/segments.ts +4 -4
  225. package/src/modes/components/status-line/separators.ts +1 -1
  226. package/src/modes/components/status-line/types.ts +2 -2
  227. package/src/modes/components/status-line-segment-editor.ts +7 -8
  228. package/src/modes/components/status-line.ts +12 -12
  229. package/src/modes/components/theme-selector.ts +8 -7
  230. package/src/modes/components/thinking-selector.ts +4 -4
  231. package/src/modes/components/todo-display.ts +2 -2
  232. package/src/modes/components/todo-reminder.ts +4 -4
  233. package/src/modes/components/tool-execution.ts +11 -16
  234. package/src/modes/components/tree-selector.ts +11 -11
  235. package/src/modes/components/ttsr-notification.ts +5 -5
  236. package/src/modes/components/user-message-selector.ts +1 -1
  237. package/src/modes/components/user-message.ts +1 -1
  238. package/src/modes/components/visual-truncate.ts +0 -1
  239. package/src/modes/components/welcome.ts +4 -4
  240. package/src/modes/controllers/command-controller.ts +46 -47
  241. package/src/modes/controllers/event-controller.ts +16 -20
  242. package/src/modes/controllers/extension-ui-controller.ts +40 -46
  243. package/src/modes/controllers/input-controller.ts +17 -18
  244. package/src/modes/controllers/selector-controller.ts +103 -91
  245. package/src/modes/index.ts +3 -3
  246. package/src/modes/interactive-mode.ts +27 -29
  247. package/src/modes/print-mode.ts +12 -13
  248. package/src/modes/rpc/rpc-client.ts +7 -8
  249. package/src/modes/rpc/rpc-mode.ts +24 -25
  250. package/src/modes/rpc/rpc-types.ts +3 -4
  251. package/src/modes/theme/mermaid-cache.ts +2 -2
  252. package/src/modes/theme/theme.ts +128 -53
  253. package/src/modes/types.ts +10 -10
  254. package/src/modes/utils/ui-helpers.ts +17 -17
  255. package/src/patch/applicator.ts +18 -19
  256. package/src/patch/diff.ts +1 -2
  257. package/src/patch/fuzzy.ts +1 -2
  258. package/src/patch/index.ts +10 -11
  259. package/src/patch/normalize.ts +4 -4
  260. package/src/patch/normative.ts +1 -2
  261. package/src/patch/parser.ts +8 -9
  262. package/src/patch/shared.ts +12 -13
  263. package/src/sdk.ts +60 -63
  264. package/src/session/agent-session.ts +83 -84
  265. package/src/session/agent-storage.ts +11 -11
  266. package/src/session/artifacts.ts +8 -9
  267. package/src/session/auth-storage.ts +25 -29
  268. package/src/session/compaction/branch-summarization.ts +7 -10
  269. package/src/session/compaction/compaction.ts +8 -19
  270. package/src/session/compaction/utils.ts +6 -9
  271. package/src/session/history-storage.ts +10 -10
  272. package/src/session/messages.ts +4 -5
  273. package/src/session/session-manager.ts +76 -65
  274. package/src/session/session-storage.ts +57 -69
  275. package/src/session/storage-migration.ts +2 -3
  276. package/src/session/streaming-output.ts +2 -2
  277. package/src/ssh/connection-manager.ts +43 -50
  278. package/src/ssh/ssh-executor.ts +2 -2
  279. package/src/ssh/sshfs-mount.ts +11 -18
  280. package/src/system-prompt.ts +27 -34
  281. package/src/task/agents.ts +45 -30
  282. package/src/task/commands.ts +6 -7
  283. package/src/task/discovery.ts +39 -76
  284. package/src/task/executor.ts +14 -15
  285. package/src/task/index.ts +33 -36
  286. package/src/task/output-manager.ts +3 -4
  287. package/src/task/parallel.ts +0 -1
  288. package/src/task/render.ts +19 -20
  289. package/src/task/subprocess-tool-registry.ts +1 -2
  290. package/src/task/worker-protocol.ts +3 -3
  291. package/src/task/worker.ts +32 -38
  292. package/src/task/worktree.ts +19 -19
  293. package/src/tools/ask.ts +8 -9
  294. package/src/tools/bash-interceptor.ts +1 -5
  295. package/src/tools/bash.ts +19 -18
  296. package/src/tools/calculator.ts +12 -12
  297. package/src/tools/complete.ts +3 -4
  298. package/src/tools/context.ts +2 -2
  299. package/src/tools/fetch.ts +23 -26
  300. package/src/tools/find.ts +15 -16
  301. package/src/tools/gemini-image.ts +14 -14
  302. package/src/tools/grep.ts +27 -27
  303. package/src/tools/index.ts +78 -56
  304. package/src/tools/list-limit.ts +1 -1
  305. package/src/tools/ls.ts +7 -7
  306. package/src/tools/notebook.ts +5 -5
  307. package/src/tools/output-meta.ts +3 -4
  308. package/src/tools/output-utils.ts +1 -1
  309. package/src/tools/path-utils.ts +5 -5
  310. package/src/tools/python.ts +36 -37
  311. package/src/tools/read.ts +23 -23
  312. package/src/tools/render-utils.ts +8 -9
  313. package/src/tools/renderers.ts +6 -7
  314. package/src/tools/review.ts +8 -11
  315. package/src/tools/ssh.ts +31 -30
  316. package/src/tools/todo-write.ts +13 -13
  317. package/src/tools/tool-errors.ts +3 -3
  318. package/src/tools/tool-result.ts +3 -8
  319. package/src/tools/write.ts +11 -16
  320. package/src/tui/code-cell.ts +3 -9
  321. package/src/tui/file-list.ts +3 -4
  322. package/src/tui/output-block.ts +1 -2
  323. package/src/tui/status-line.ts +2 -3
  324. package/src/tui/tree-list.ts +2 -3
  325. package/src/tui/types.ts +1 -2
  326. package/src/tui/utils.ts +2 -3
  327. package/src/utils/changelog.ts +9 -10
  328. package/src/utils/clipboard.ts +11 -11
  329. package/src/utils/file-mentions.ts +4 -10
  330. package/src/utils/frontmatter.ts +6 -3
  331. package/src/utils/fuzzy.ts +2 -2
  332. package/src/utils/image-convert.ts +1 -1
  333. package/src/utils/image-resize.ts +1 -1
  334. package/src/utils/mime.ts +2 -2
  335. package/src/utils/shell-snapshot.ts +11 -13
  336. package/src/utils/shell.ts +4 -5
  337. package/src/utils/title-generator.ts +8 -9
  338. package/src/utils/tools-manager.ts +23 -23
  339. package/src/vendor/photon/index.js +1099 -1059
  340. package/src/vendor/photon/photon_rs_bg.wasm +0 -0
  341. package/src/web/scrapers/artifacthub.ts +1 -1
  342. package/src/web/scrapers/arxiv.ts +2 -2
  343. package/src/web/scrapers/bluesky.ts +2 -2
  344. package/src/web/scrapers/cheatsh.ts +1 -1
  345. package/src/web/scrapers/chocolatey.ts +2 -2
  346. package/src/web/scrapers/choosealicense.ts +5 -5
  347. package/src/web/scrapers/cisa-kev.ts +1 -1
  348. package/src/web/scrapers/crossref.ts +2 -2
  349. package/src/web/scrapers/devto.ts +3 -3
  350. package/src/web/scrapers/discogs.ts +3 -4
  351. package/src/web/scrapers/discourse.ts +1 -1
  352. package/src/web/scrapers/dockerhub.ts +1 -1
  353. package/src/web/scrapers/fdroid.ts +2 -2
  354. package/src/web/scrapers/firefox-addons.ts +3 -3
  355. package/src/web/scrapers/flathub.ts +1 -1
  356. package/src/web/scrapers/github.ts +3 -3
  357. package/src/web/scrapers/gitlab.ts +4 -4
  358. package/src/web/scrapers/hackernews.ts +2 -2
  359. package/src/web/scrapers/huggingface.ts +1 -1
  360. package/src/web/scrapers/iacr.ts +2 -2
  361. package/src/web/scrapers/index.ts +0 -1
  362. package/src/web/scrapers/jetbrains-marketplace.ts +1 -1
  363. package/src/web/scrapers/lemmy.ts +2 -2
  364. package/src/web/scrapers/maven.ts +2 -2
  365. package/src/web/scrapers/mdn.ts +2 -4
  366. package/src/web/scrapers/metacpan.ts +2 -2
  367. package/src/web/scrapers/musicbrainz.ts +1 -2
  368. package/src/web/scrapers/npm.ts +1 -1
  369. package/src/web/scrapers/nuget.ts +2 -2
  370. package/src/web/scrapers/nvd.ts +3 -3
  371. package/src/web/scrapers/ollama.ts +7 -9
  372. package/src/web/scrapers/opencorporates.ts +2 -2
  373. package/src/web/scrapers/openlibrary.ts +6 -6
  374. package/src/web/scrapers/orcid.ts +0 -1
  375. package/src/web/scrapers/osv.ts +2 -2
  376. package/src/web/scrapers/packagist.ts +1 -1
  377. package/src/web/scrapers/pubmed.ts +1 -2
  378. package/src/web/scrapers/rawg.ts +2 -2
  379. package/src/web/scrapers/readthedocs.ts +1 -2
  380. package/src/web/scrapers/repology.ts +2 -2
  381. package/src/web/scrapers/rfc.ts +1 -1
  382. package/src/web/scrapers/searchcode.ts +2 -2
  383. package/src/web/scrapers/semantic-scholar.ts +1 -1
  384. package/src/web/scrapers/snapcraft.ts +2 -2
  385. package/src/web/scrapers/sourcegraph.ts +1 -1
  386. package/src/web/scrapers/spdx.ts +3 -3
  387. package/src/web/scrapers/spotify.ts +0 -1
  388. package/src/web/scrapers/twitter.ts +1 -1
  389. package/src/web/scrapers/types.ts +1 -2
  390. package/src/web/scrapers/utils.ts +5 -5
  391. package/src/web/scrapers/wikidata.ts +3 -3
  392. package/src/web/scrapers/youtube.ts +9 -14
  393. package/src/web/search/auth.ts +4 -9
  394. package/src/web/search/index.ts +11 -21
  395. package/src/web/search/providers/anthropic.ts +3 -9
  396. package/src/web/search/providers/exa.ts +6 -10
  397. package/src/web/search/providers/perplexity.ts +5 -5
  398. package/src/web/search/render.ts +16 -18
  399. package/scripts/generate-wasm-b64.ts +0 -24
  400. package/src/commit/map-reduce/.map-phase.ts.kate-swp +0 -0
  401. package/src/task/.executor.ts.kate-swp +0 -0
  402. package/src/vendor/photon/photon_rs_bg.wasm.b64.js +0 -1
package/src/sdk.ts CHANGED
@@ -25,31 +25,26 @@
25
25
  * });
26
26
  * ```
27
27
  */
28
-
29
- import { existsSync } from "node:fs";
30
- import { rename } from "node:fs/promises";
31
- import { join } from "node:path";
28
+ import * as fs from "node:fs";
29
+ import * as path from "node:path";
32
30
  import { Agent, type AgentEvent, type AgentMessage, type AgentTool, type ThinkingLevel } from "@oh-my-pi/pi-agent-core";
33
31
  import { type Message, type Model, supportsXhigh } from "@oh-my-pi/pi-ai";
34
- // Import discovery to register all providers on startup
35
- import { loadCapability } from "@oh-my-pi/pi-coding-agent/capability";
36
- import { type Rule, ruleCapability } from "@oh-my-pi/pi-coding-agent/capability/rule";
37
- import { getAgentDir, getConfigDirPaths } from "@oh-my-pi/pi-coding-agent/config";
38
- import { CursorExecHandlers } from "@oh-my-pi/pi-coding-agent/cursor";
39
- import { initializeWithSettings } from "@oh-my-pi/pi-coding-agent/discovery";
40
- import { TtsrManager } from "@oh-my-pi/pi-coding-agent/export/ttsr";
41
- import { disposeAllKernelSessions } from "@oh-my-pi/pi-coding-agent/ipy/executor";
42
- import { closeAllConnections } from "@oh-my-pi/pi-coding-agent/ssh/connection-manager";
43
- import { unmountAll } from "@oh-my-pi/pi-coding-agent/ssh/sshfs-mount";
44
32
  import type { Component } from "@oh-my-pi/pi-tui";
45
33
  import { logger, postmortem } from "@oh-my-pi/pi-utils";
46
34
  import { YAML } from "bun";
47
35
  import chalk from "chalk";
36
+ // Import discovery to register all providers on startup
37
+ import { loadCapability } from "./capability";
38
+ import { type Rule, ruleCapability } from "./capability/rule";
39
+ import { getAgentDir, getConfigDirPaths } from "./config";
48
40
  import { ModelRegistry } from "./config/model-registry";
49
41
  import { formatModelString, parseModelString } from "./config/model-resolver";
50
42
  import { loadPromptTemplates as loadPromptTemplatesInternal, type PromptTemplate } from "./config/prompt-templates";
51
43
  import { type Settings, SettingsManager, type SkillsSettings } from "./config/settings-manager";
44
+ import { CursorExecHandlers } from "./cursor";
52
45
  import "./discovery";
46
+ import { initializeWithSettings } from "./discovery";
47
+ import { TtsrManager } from "./export/ttsr";
53
48
  import {
54
49
  type CustomCommandsLoadResult,
55
50
  loadCustomCommands as loadCustomCommandsInternal,
@@ -77,12 +72,15 @@ import {
77
72
  RuleProtocolHandler,
78
73
  SkillProtocolHandler,
79
74
  } from "./internal-urls";
75
+ import { disposeAllKernelSessions } from "./ipy/executor";
80
76
  import { discoverAndLoadMCPTools, type MCPManager, type MCPToolsLoadResult } from "./mcp";
81
77
  import { AgentSession } from "./session/agent-session";
82
78
  import { AuthStorage } from "./session/auth-storage";
83
79
  import { convertToLlm } from "./session/messages";
84
80
  import { SessionManager } from "./session/session-manager";
85
81
  import { migrateJsonStorage } from "./session/storage-migration";
82
+ import { closeAllConnections } from "./ssh/connection-manager";
83
+ import { unmountAll } from "./ssh/sshfs-mount";
86
84
  import {
87
85
  buildSystemPrompt as buildSystemPromptInternal,
88
86
  loadProjectContextFiles as loadContextFilesInternal,
@@ -205,22 +203,19 @@ export interface CreateAgentSessionResult {
205
203
 
206
204
  // Re-exports
207
205
 
208
- export type { PromptTemplate } from "@oh-my-pi/pi-coding-agent/config/prompt-templates";
209
- export type { Settings, SkillsSettings } from "@oh-my-pi/pi-coding-agent/config/settings-manager";
210
- export type {
211
- CustomCommand,
212
- CustomCommandFactory,
213
- } from "@oh-my-pi/pi-coding-agent/extensibility/custom-commands/types";
214
- export type { CustomTool, CustomToolFactory } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
206
+ export type { PromptTemplate } from "./config/prompt-templates";
207
+ export type { Settings, SkillsSettings } from "./config/settings-manager";
208
+ export type { CustomCommand, CustomCommandFactory } from "./extensibility/custom-commands/types";
209
+ export type { CustomTool, CustomToolFactory } from "./extensibility/custom-tools/types";
215
210
  export type {
216
211
  ExtensionAPI,
217
212
  ExtensionCommandContext,
218
213
  ExtensionContext,
219
214
  ExtensionFactory,
220
215
  ToolDefinition,
221
- } from "@oh-my-pi/pi-coding-agent/extensibility/extensions";
222
- export type { Skill } from "@oh-my-pi/pi-coding-agent/extensibility/skills";
223
- export type { FileSlashCommand } from "@oh-my-pi/pi-coding-agent/extensibility/slash-commands";
216
+ } from "./extensibility/extensions";
217
+ export type { Skill } from "./extensibility/skills";
218
+ export type { FileSlashCommand } from "./extensibility/slash-commands";
224
219
  export type { MCPManager, MCPServerConfig, MCPServerConnection, MCPToolsLoadResult } from "./mcp";
225
220
  export type { Tool } from "./tools";
226
221
 
@@ -254,17 +249,17 @@ function getDefaultAgentDir(): string {
254
249
  * Reads from primary path first, then falls back to legacy paths (.pi, .claude).
255
250
  */
256
251
  export async function discoverAuthStorage(agentDir: string = getDefaultAgentDir()): Promise<AuthStorage> {
257
- const primaryPath = join(agentDir, "auth.json");
252
+ const primaryPath = path.join(agentDir, "auth.json");
258
253
  // Get all auth.json paths (user-level only), excluding the primary
259
254
  const allPaths = getConfigDirPaths("auth.json", { project: false });
260
- const fallbackPaths = allPaths.filter((p) => p !== primaryPath);
255
+ const fallbackPaths = allPaths.filter(p => p !== primaryPath);
261
256
 
262
257
  logger.debug("discoverAuthStorage", { agentDir, primaryPath, allPaths, fallbackPaths });
263
258
 
264
259
  // Migrate legacy JSON files (settings.json, auth.json) to SQLite before loading
265
260
  await migrateJsonStorage({
266
261
  agentDir,
267
- settingsPath: join(agentDir, "settings.json"),
262
+ settingsPath: path.join(agentDir, "settings.json"),
268
263
  authPaths: [primaryPath, ...fallbackPaths],
269
264
  });
270
265
 
@@ -278,48 +273,52 @@ export async function discoverAuthStorage(agentDir: string = getDefaultAgentDir(
278
273
  * Prefers models.yml over models.json. Reads from primary path first,
279
274
  * then falls back to legacy paths (.pi, .claude).
280
275
  */
281
- export async function discoverModels(
282
- authStorage: AuthStorage,
283
- agentDir: string = getDefaultAgentDir(),
284
- ): Promise<ModelRegistry> {
285
- const yamlPath = join(agentDir, "models.yml");
286
- const jsonPath = join(agentDir, "models.json");
276
+ export function discoverModels(authStorage: AuthStorage, agentDir: string = getDefaultAgentDir()): ModelRegistry {
277
+ const yamlPath = path.join(agentDir, "models.yml");
278
+ const jsonPath = path.join(agentDir, "models.json");
279
+
280
+ // Check existence of yaml and json files
281
+ let yamlExists = fs.existsSync(yamlPath);
282
+ let jsonExists = fs.existsSync(jsonPath);
287
283
 
288
284
  // Migrate models.json to models.yml if yaml doesn't exist but json does
289
- if (!existsSync(yamlPath) && existsSync(jsonPath)) {
290
- await migrateModelsJsonToYaml(jsonPath, yamlPath);
285
+ if (!yamlExists && jsonExists) {
286
+ migrateModelsJsonToYaml(jsonPath, yamlPath);
287
+ yamlExists = fs.existsSync(yamlPath);
288
+ jsonExists = fs.existsSync(jsonPath);
291
289
  }
292
290
 
293
291
  // Prefer models.yml, fall back to models.json
294
- const primaryPath = existsSync(yamlPath) ? yamlPath : jsonPath;
292
+ const primaryPath = yamlExists ? yamlPath : jsonPath;
295
293
 
296
294
  // Get all models config paths (user-level only), excluding the primary
297
295
  const yamlPaths = getConfigDirPaths("models.yml", { project: false });
298
296
  const jsonPaths = getConfigDirPaths("models.json", { project: false });
299
297
  const allPaths = [...yamlPaths, ...jsonPaths];
300
- const fallbackPaths = allPaths.filter((p) => p !== primaryPath && existsSync(p));
298
+ const existenceResults = allPaths.map(p => {
299
+ return { p, exists: fs.existsSync(p) };
300
+ });
301
+ const fallbackPaths = existenceResults.filter(({ p, exists }) => p !== primaryPath && exists).map(({ p }) => p);
301
302
 
302
303
  logger.debug("discoverModels", { primaryPath, fallbackPaths });
303
-
304
- const registry = new ModelRegistry(authStorage, primaryPath, fallbackPaths);
305
- registry.refresh();
306
- return registry;
304
+ return new ModelRegistry(authStorage, primaryPath, fallbackPaths);
307
305
  }
308
306
 
309
307
  /**
310
308
  * Migrate models.json to models.yml.
311
309
  * Creates models.yml from models.json and renames the json file to .bak.
312
310
  */
313
- async function migrateModelsJsonToYaml(jsonPath: string, yamlPath: string): Promise<void> {
311
+ function migrateModelsJsonToYaml(jsonPath: string, yamlPath: string): void {
314
312
  try {
315
- const content = await Bun.file(jsonPath).text();
313
+ const content = fs.readFileSync(jsonPath, "utf-8");
316
314
  const parsed = JSON.parse(content);
317
315
  if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
318
316
  logger.warn("migrateModelsJsonToYaml: invalid models.json structure", { path: jsonPath });
319
317
  return;
320
318
  }
321
- await Bun.write(yamlPath, YAML.stringify(parsed, null, 2));
322
- await rename(jsonPath, `${jsonPath}.bak`);
319
+ fs.mkdirSync(path.dirname(yamlPath), { recursive: true });
320
+ fs.writeFileSync(yamlPath, YAML.stringify(parsed, null, 2));
321
+ fs.renameSync(jsonPath, `${jsonPath}.bak`);
323
322
  logger.debug("migrateModelsJsonToYaml: migrated models.json to models.yml", { from: jsonPath, to: yamlPath });
324
323
  } catch (error) {
325
324
  logger.warn("migrateModelsJsonToYaml: migration failed", { error: String(error) });
@@ -524,7 +523,7 @@ function customToolToDefinition(tool: CustomTool): ToolDefinition {
524
523
  }
525
524
 
526
525
  function createCustomToolsExtension(tools: CustomTool[]): ExtensionFactory {
527
- return (api) => {
526
+ return api => {
528
527
  for (const tool of tools) {
529
528
  api.registerTool(customToolToDefinition(tool));
530
529
  }
@@ -601,7 +600,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
601
600
 
602
601
  // Use provided or create AuthStorage and ModelRegistry
603
602
  const authStorage = options.authStorage ?? (await discoverAuthStorage(agentDir));
604
- const modelRegistry = options.modelRegistry ?? (await discoverModels(authStorage, agentDir));
603
+ const modelRegistry = options.modelRegistry ?? discoverModels(authStorage, agentDir);
605
604
  time("discoverModels");
606
605
 
607
606
  const settingsManager = options.settingsManager ?? (await SettingsManager.create(cwd, agentDir));
@@ -659,9 +658,9 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
659
658
  if (!model) {
660
659
  const allModels = modelRegistry.getAll();
661
660
  const keyResults = await Promise.all(
662
- allModels.map(async (m) => ({ model: m, hasKey: !!(await modelRegistry.getApiKey(m, sessionId)) })),
661
+ allModels.map(async m => ({ model: m, hasKey: !!(await modelRegistry.getApiKey(m, sessionId)) })),
663
662
  );
664
- model = keyResults.find((r) => r.hasKey)?.model;
663
+ model = keyResults.find(r => r.hasKey)?.model;
665
664
  time("findAvailableModel");
666
665
  if (model) {
667
666
  if (modelFallbackMessage) {
@@ -784,7 +783,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
784
783
  const customTools: CustomTool[] = [];
785
784
  if (enableMCP) {
786
785
  const mcpResult = await discoverAndLoadMCPTools(cwd, {
787
- onConnecting: (serverNames) => {
786
+ onConnecting: serverNames => {
788
787
  if (options.hasUI && serverNames.length > 0) {
789
788
  process.stderr.write(
790
789
  chalk.gray(`Connecting to MCP servers: ${serverNames.join(", ")}...
@@ -813,7 +812,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
813
812
 
814
813
  if (mcpResult.tools.length > 0) {
815
814
  // MCP tools are LoadedCustomTool, extract the tool property
816
- customTools.push(...mcpResult.tools.map((loaded) => loaded.tool));
815
+ customTools.push(...mcpResult.tools.map(loaded => loaded.tool));
817
816
  }
818
817
  }
819
818
 
@@ -832,7 +831,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
832
831
  enableCompany: exaSettings.enableCompany,
833
832
  });
834
833
  // Filter out the base web_search (already in built-in tools), add specialized Exa tools
835
- const specializedTools = exaWebSearchTools.filter((t) => t.name !== "web_search");
834
+ const specializedTools = exaWebSearchTools.filter(t => t.name !== "web_search");
836
835
  if (specializedTools.length > 0) {
837
836
  customTools.push(...specializedTools);
838
837
  }
@@ -922,7 +921,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
922
921
  const registeredTools = extensionRunner?.getAllRegisteredTools() ?? [];
923
922
  const allCustomTools = [
924
923
  ...registeredTools,
925
- ...(options.customTools?.map((tool) => {
924
+ ...(options.customTools?.map(tool => {
926
925
  const definition = isCustomTool(tool) ? customToolToDefinition(tool) : tool;
927
926
  return { definition, extensionPath: "<sdk>" };
928
927
  }) ?? []),
@@ -952,7 +951,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
952
951
  cwd,
953
952
  tools: toolRegistry,
954
953
  getToolContext: () => toolContextStore.getContext(),
955
- emitEvent: (event) => cursorEventEmitter?.(event),
954
+ emitEvent: event => cursorEventEmitter?.(event),
956
955
  });
957
956
 
958
957
  const rebuildSystemPrompt = async (toolNames: string[], tools: Map<string, AgentTool>): Promise<string> => {
@@ -1002,16 +1001,14 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1002
1001
  return converted;
1003
1002
  }
1004
1003
  // Filter out ImageContent from all messages, replacing with text placeholder
1005
- return converted.map((msg) => {
1004
+ return converted.map(msg => {
1006
1005
  if (msg.role === "user" || msg.role === "toolResult") {
1007
1006
  const content = msg.content;
1008
1007
  if (Array.isArray(content)) {
1009
- const hasImages = content.some((c) => c.type === "image");
1008
+ const hasImages = content.some(c => c.type === "image");
1010
1009
  if (hasImages) {
1011
1010
  const filteredContent = content
1012
- .map((c) =>
1013
- c.type === "image" ? { type: "text" as const, text: "Image reading is disabled." } : c,
1014
- )
1011
+ .map(c => (c.type === "image" ? { type: "text" as const, text: "Image reading is disabled." } : c))
1015
1012
  .filter(
1016
1013
  (c, i, arr) =>
1017
1014
  // Dedupe consecutive "Image reading is disabled." texts
@@ -1045,7 +1042,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1045
1042
  convertToLlm: convertToLlmWithBlockImages,
1046
1043
  sessionId: sessionManager.getSessionId(),
1047
1044
  transformContext: extensionRunner
1048
- ? async (messages) => {
1045
+ ? async messages => {
1049
1046
  return extensionRunner.emitContext(messages);
1050
1047
  }
1051
1048
  : undefined,
@@ -1053,7 +1050,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1053
1050
  followUpMode: settingsManager.getFollowUpMode(),
1054
1051
  interruptMode: settingsManager.getInterruptMode(),
1055
1052
  thinkingBudgets: settingsManager.getThinkingBudgets(),
1056
- getToolContext: (tc) => toolContextStore.getContext(tc),
1053
+ getToolContext: tc => toolContextStore.getContext(tc),
1057
1054
  getApiKey: async () => {
1058
1055
  const currentModel = agent.state.model;
1059
1056
  if (!currentModel) {
@@ -1067,7 +1064,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1067
1064
  },
1068
1065
  cursorExecHandlers,
1069
1066
  });
1070
- cursorEventEmitter = (event) => agent.emitExternalEvent(event);
1067
+ cursorEventEmitter = event => agent.emitExternalEvent(event);
1071
1068
  time("createAgent");
1072
1069
 
1073
1070
  // Restore messages if session has existing data
@@ -1105,7 +1102,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1105
1102
  if (enableLsp && settingsManager.getLspDiagnosticsOnWrite()) {
1106
1103
  try {
1107
1104
  const result = await warmupLspServers(cwd, {
1108
- onConnecting: (serverNames) => {
1105
+ onConnecting: serverNames => {
1109
1106
  if (options.hasUI && serverNames.length > 0) {
1110
1107
  process.stderr.write(chalk.gray(`Starting LSP servers: ${serverNames.join(", ")}...\n`));
1111
1108
  }