@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
@@ -5,11 +5,9 @@
5
5
  * .bashrc/.zshrc, which can be sourced before each command to provide a familiar
6
6
  * shell experience.
7
7
  */
8
-
9
- import { unlinkSync } from "node:fs";
10
- import { mkdir } from "node:fs/promises";
11
- import { homedir, tmpdir } from "node:os";
12
- import { join } from "node:path";
8
+ import * as fs from "node:fs";
9
+ import * as os from "node:os";
10
+ import * as path from "node:path";
13
11
  import { postmortem } from "@oh-my-pi/pi-utils";
14
12
  import { $ } from "bun";
15
13
 
@@ -19,10 +17,10 @@ let cachedSnapshotPath: string | null = null;
19
17
  * Get the user's shell config file path.
20
18
  */
21
19
  function getShellConfigFile(shell: string): string {
22
- const home = homedir();
23
- if (shell.includes("zsh")) return join(home, ".zshrc");
24
- if (shell.includes("bash")) return join(home, ".bashrc");
25
- return join(home, ".profile");
20
+ const home = os.homedir();
21
+ if (shell.includes("zsh")) return path.join(home, ".zshrc");
22
+ if (shell.includes("bash")) return path.join(home, ".bashrc");
23
+ return path.join(home, ".profile");
26
24
  }
27
25
 
28
26
  /**
@@ -131,12 +129,12 @@ export async function getOrCreateSnapshot(
131
129
  const rcFile = getShellConfigFile(shell);
132
130
 
133
131
  // Create snapshot directory
134
- const snapshotDir = join(tmpdir(), "omp-shell-snapshots");
135
- await mkdir(snapshotDir, { recursive: true });
132
+ const snapshotDir = path.join(os.tmpdir(), "omp-shell-snapshots");
133
+ await fs.promises.mkdir(snapshotDir, { recursive: true });
136
134
 
137
135
  // Generate unique snapshot path
138
136
  const shellName = shell.includes("zsh") ? "zsh" : shell.includes("bash") ? "bash" : "sh";
139
- const snapshotPath = join(snapshotDir, `snapshot-${shellName}-${crypto.randomUUID()}.sh`);
137
+ const snapshotPath = path.join(snapshotDir, `snapshot-${shellName}-${crypto.randomUUID()}.sh`);
140
138
 
141
139
  // Generate and execute snapshot script
142
140
  const script = await generateSnapshotScript(shell, snapshotPath, rcFile);
@@ -167,6 +165,6 @@ export function getSnapshotSourceCommand(snapshotPath: string | null): string {
167
165
 
168
166
  postmortem.register("shell-snapshot", () => {
169
167
  if (cachedSnapshotPath) {
170
- unlinkSync(cachedSnapshotPath);
168
+ fs.unlinkSync(cachedSnapshotPath);
171
169
  }
172
170
  });
@@ -1,7 +1,6 @@
1
- import { constants } from "node:fs";
2
- import { access } from "node:fs/promises";
3
- import { SettingsManager } from "@oh-my-pi/pi-coding-agent/config/settings-manager";
1
+ import * as fs from "node:fs";
4
2
  import { $ } from "bun";
3
+ import { SettingsManager } from "../config/settings-manager";
5
4
 
6
5
  export interface ShellConfig {
7
6
  shell: string;
@@ -17,7 +16,7 @@ let cachedShellConfig: ShellConfig | null = null;
17
16
  */
18
17
  async function isExecutable(path: string): Promise<boolean> {
19
18
  try {
20
- await access(path, constants.X_OK);
19
+ await fs.promises.access(path, fs.constants.X_OK);
21
20
  return true;
22
21
  } catch {
23
22
  return false;
@@ -138,7 +137,7 @@ export async function getShellConfig(): Promise<ShellConfig> {
138
137
  ` 1. Install Git for Windows: https://git-scm.com/download/win\n` +
139
138
  ` 2. Add your bash to PATH (Cygwin, MSYS2, etc.)\n` +
140
139
  ` 3. Set shellPath in ~/.omp/agent/settings.json\n\n` +
141
- `Searched Git Bash in:\n${paths.map((p) => ` ${p}`).join("\n")}`,
140
+ `Searched Git Bash in:\n${paths.map(p => ` ${p}`).join("\n")}`,
142
141
  );
143
142
  }
144
143
 
@@ -1,14 +1,13 @@
1
1
  /**
2
2
  * Generate session titles using a smol, fast model.
3
3
  */
4
-
5
4
  import type { Api, Model } from "@oh-my-pi/pi-ai";
6
5
  import { completeSimple } from "@oh-my-pi/pi-ai";
7
- import type { ModelRegistry } from "@oh-my-pi/pi-coding-agent/config/model-registry";
8
- import { parseModelString, SMOL_MODEL_PRIORITY } from "@oh-my-pi/pi-coding-agent/config/model-resolver";
9
- import { renderPromptTemplate } from "@oh-my-pi/pi-coding-agent/config/prompt-templates";
10
- import titleSystemPrompt from "@oh-my-pi/pi-coding-agent/prompts/system/title-system.md" with { type: "text" };
11
6
  import { logger } from "@oh-my-pi/pi-utils";
7
+ import type { ModelRegistry } from "../config/model-registry";
8
+ import { parseModelString, SMOL_MODEL_PRIORITY } from "../config/model-resolver";
9
+ import { renderPromptTemplate } from "../config/prompt-templates";
10
+ import titleSystemPrompt from "../prompts/system/title-system.md" with { type: "text" };
12
11
 
13
12
  const TITLE_SYSTEM_PROMPT = renderPromptTemplate(titleSystemPrompt);
14
13
 
@@ -21,7 +20,7 @@ function getTitleModelCandidates(registry: ModelRegistry, savedSmolModel?: strin
21
20
  const candidates: Model<Api>[] = [];
22
21
  const addCandidate = (model?: Model<Api>): void => {
23
22
  if (!model) return;
24
- const exists = candidates.some((candidate) => candidate.provider === model.provider && candidate.id === model.id);
23
+ const exists = candidates.some(candidate => candidate.provider === model.provider && candidate.id === model.id);
25
24
  if (!exists) {
26
25
  candidates.push(model);
27
26
  }
@@ -30,17 +29,17 @@ function getTitleModelCandidates(registry: ModelRegistry, savedSmolModel?: strin
30
29
  if (savedSmolModel) {
31
30
  const parsed = parseModelString(savedSmolModel);
32
31
  if (parsed) {
33
- const match = availableModels.find((model) => model.provider === parsed.provider && model.id === parsed.id);
32
+ const match = availableModels.find(model => model.provider === parsed.provider && model.id === parsed.id);
34
33
  addCandidate(match);
35
34
  }
36
35
  }
37
36
 
38
37
  for (const pattern of SMOL_MODEL_PRIORITY) {
39
38
  const needle = pattern.toLowerCase();
40
- const exactMatch = availableModels.find((model) => model.id.toLowerCase() === needle);
39
+ const exactMatch = availableModels.find(model => model.id.toLowerCase() === needle);
41
40
  addCandidate(exactMatch);
42
41
 
43
- const fuzzyMatch = availableModels.find((model) => model.id.toLowerCase().includes(needle));
42
+ const fuzzyMatch = availableModels.find(model => model.id.toLowerCase().includes(needle));
44
43
  addCandidate(fuzzyMatch);
45
44
  }
46
45
 
@@ -1,9 +1,9 @@
1
- import { chmod, mkdir, rename, rm } from "node:fs/promises";
2
- import { arch, platform } from "node:os";
3
- import { join } from "node:path";
4
- import { APP_NAME, getBinDir } from "@oh-my-pi/pi-coding-agent/config";
5
- import { createTempDir, logger } from "@oh-my-pi/pi-utils";
1
+ import * as fs from "node:fs/promises";
2
+ import * as os from "node:os";
3
+ import * as path from "node:path";
4
+ import { logger, TempDir } from "@oh-my-pi/pi-utils";
6
5
  import { $ } from "bun";
6
+ import { APP_NAME, getBinDir } from "../config";
7
7
 
8
8
  const TOOLS_DIR = getBinDir();
9
9
 
@@ -148,7 +148,7 @@ export async function getToolPath(tool: ToolName): Promise<string | null> {
148
148
  if (!config) return null;
149
149
 
150
150
  // Check our tools directory first
151
- const localPath = join(TOOLS_DIR, config.binaryName + (platform() === "win32" ? ".exe" : ""));
151
+ const localPath = path.join(TOOLS_DIR, config.binaryName + (os.platform() === "win32" ? ".exe" : ""));
152
152
  if (await Bun.file(localPath).exists()) {
153
153
  return localPath;
154
154
  }
@@ -187,8 +187,8 @@ async function downloadTool(tool: ToolName): Promise<string> {
187
187
  const config = TOOLS[tool];
188
188
  if (!config) throw new Error(`Unknown tool: ${tool}`);
189
189
 
190
- const plat = platform();
191
- const architecture = arch();
190
+ const plat = os.platform();
191
+ const architecture = os.arch();
192
192
 
193
193
  // Get latest version
194
194
  const version = await getLatestVersion(config.repo);
@@ -200,64 +200,64 @@ async function downloadTool(tool: ToolName): Promise<string> {
200
200
  }
201
201
 
202
202
  // Create tools directory
203
- await mkdir(TOOLS_DIR, { recursive: true });
203
+ await fs.mkdir(TOOLS_DIR, { recursive: true });
204
204
 
205
205
  const downloadUrl = `https://github.com/${config.repo}/releases/download/${config.tagPrefix}${version}/${assetName}`;
206
206
  const binaryExt = plat === "win32" ? ".exe" : "";
207
- const binaryPath = join(TOOLS_DIR, config.binaryName + binaryExt);
207
+ const binaryPath = path.join(TOOLS_DIR, config.binaryName + binaryExt);
208
208
 
209
209
  // Handle direct binary downloads (no archive extraction needed)
210
210
  if (config.isDirectBinary) {
211
211
  await downloadFile(downloadUrl, binaryPath);
212
212
  if (plat !== "win32") {
213
- await chmod(binaryPath, 0o755);
213
+ await fs.chmod(binaryPath, 0o755);
214
214
  }
215
215
  return binaryPath;
216
216
  }
217
217
 
218
218
  // Download archive
219
- const archivePath = join(TOOLS_DIR, assetName);
219
+ const archivePath = path.join(TOOLS_DIR, assetName);
220
220
  await downloadFile(downloadUrl, archivePath);
221
221
 
222
222
  // Extract
223
- const tmp = await createTempDir("@omp-tools-extract-");
223
+ const tmp = await TempDir.create("@omp-tools-extract-");
224
224
 
225
225
  try {
226
226
  if (assetName.endsWith(".tar.gz")) {
227
227
  const archive = new Bun.Archive(await Bun.file(archivePath).arrayBuffer());
228
228
  const files = await archive.files();
229
- for (const [path, file] of files) {
230
- await Bun.write(join(tmp.path, path), file);
229
+ for (const [filePath, file] of files) {
230
+ await Bun.write(path.join(tmp.path(), filePath), file);
231
231
  }
232
232
  } else if (assetName.endsWith(".zip")) {
233
- await mkdir(tmp.path, { recursive: true });
234
- await $`unzip -o ${archivePath} -d ${tmp.path}`.quiet().nothrow();
233
+ await fs.mkdir(tmp.path(), { recursive: true });
234
+ await $`unzip -o ${archivePath} -d ${tmp.path()}`.quiet().nothrow();
235
235
  }
236
236
 
237
237
  // Find the binary in extracted files
238
238
  // ast-grep releases the binary directly in the zip, not in a subdirectory
239
239
  let extractedBinary: string;
240
240
  if (tool === "sg") {
241
- extractedBinary = join(tmp.path, config.binaryName + binaryExt);
241
+ extractedBinary = path.join(tmp.path(), config.binaryName + binaryExt);
242
242
  } else {
243
- const extractedDir = join(tmp.path, assetName.replace(/\.(tar\.gz|zip)$/, ""));
244
- extractedBinary = join(extractedDir, config.binaryName + binaryExt);
243
+ const extractedDir = path.join(tmp.path(), assetName.replace(/\.(tar\.gz|zip)$/, ""));
244
+ extractedBinary = path.join(extractedDir, config.binaryName + binaryExt);
245
245
  }
246
246
 
247
247
  if (await Bun.file(extractedBinary).exists()) {
248
- await rename(extractedBinary, binaryPath);
248
+ await fs.rename(extractedBinary, binaryPath);
249
249
  } else {
250
250
  throw new Error(`Binary not found in archive: ${extractedBinary}`);
251
251
  }
252
252
 
253
253
  // Make executable (Unix only)
254
254
  if (plat !== "win32") {
255
- await chmod(binaryPath, 0o755);
255
+ await fs.chmod(binaryPath, 0o755);
256
256
  }
257
257
  } finally {
258
258
  // Cleanup
259
259
  await tmp.remove();
260
- await rm(archivePath, { force: true });
260
+ await fs.rm(archivePath, { force: true });
261
261
  }
262
262
 
263
263
  return binaryPath;