@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
@@ -2,9 +2,8 @@
2
2
  * Credential storage for API keys and OAuth tokens.
3
3
  * Handles loading, saving, and refreshing credentials from agent.db.
4
4
  */
5
-
6
5
  import { Buffer } from "node:buffer";
7
- import { dirname, join } from "node:path";
6
+ import * as path from "node:path";
8
7
  import {
9
8
  antigravityUsageProvider,
10
9
  claudeUsageProvider,
@@ -32,8 +31,8 @@ import {
32
31
  type UsageReport,
33
32
  zaiUsageProvider,
34
33
  } from "@oh-my-pi/pi-ai";
35
- import { getAgentDbPath, getAuthPath } from "@oh-my-pi/pi-coding-agent/config";
36
34
  import { logger } from "@oh-my-pi/pi-utils";
35
+ import { getAgentDbPath, getAuthPath } from "../config";
37
36
  import { AgentStorage } from "./agent-storage";
38
37
  import { migrateJsonStorage } from "./storage-migration";
39
38
 
@@ -94,7 +93,7 @@ const DEFAULT_USAGE_PROVIDERS: UsageProvider[] = [
94
93
  ];
95
94
 
96
95
  const DEFAULT_USAGE_PROVIDER_MAP = new Map<Provider, UsageProvider>(
97
- DEFAULT_USAGE_PROVIDERS.map((provider) => [provider.id, provider]),
96
+ DEFAULT_USAGE_PROVIDERS.map(provider => [provider.id, provider]),
98
97
  );
99
98
 
100
99
  const USAGE_CACHE_PREFIX = "usage_cache:";
@@ -230,7 +229,7 @@ export class AuthStorage {
230
229
  for (const [provider, creds] of Object.entries(data.credentials)) {
231
230
  instance.data.set(
232
231
  provider,
233
- creds.map((c) => ({
232
+ creds.map(c => ({
234
233
  id: c.id,
235
234
  credential:
236
235
  c.type === "api_key"
@@ -255,7 +254,7 @@ export class AuthStorage {
255
254
  serialize(): SerializedAuthStorage {
256
255
  const credentials: SerializedAuthStorage["credentials"] = {};
257
256
  for (const [provider, creds] of this.data.entries()) {
258
- credentials[provider] = creds.map((c) => ({
257
+ credentials[provider] = creds.map(c => ({
259
258
  id: c.id,
260
259
  type: c.credential.type,
261
260
  data: c.credential.type === "api_key" ? { key: c.credential.key } : { ...c.credential },
@@ -282,7 +281,7 @@ export class AuthStorage {
282
281
  if (authPath.endsWith(".db")) {
283
282
  return authPath;
284
283
  }
285
- return getAgentDbPath(dirname(authPath));
284
+ return getAgentDbPath(path.dirname(authPath));
286
285
  }
287
286
 
288
287
  /**
@@ -313,10 +312,10 @@ export class AuthStorage {
313
312
  * Migrates legacy auth.json/settings.json on first load.
314
313
  */
315
314
  async reload(): Promise<void> {
316
- const agentDir = dirname(this.dbPath);
315
+ const agentDir = path.dirname(this.dbPath);
317
316
  await migrateJsonStorage({
318
317
  agentDir,
319
- settingsPath: join(agentDir, "settings.json"),
318
+ settingsPath: path.join(agentDir, "settings.json"),
320
319
  authPaths: [this.authPath, ...this.fallbackPaths],
321
320
  });
322
321
 
@@ -425,7 +424,7 @@ export class AuthStorage {
425
424
  deduped.push(credential);
426
425
  continue;
427
426
  }
428
- if (identifiers.some((identifier) => seen.has(identifier))) {
427
+ if (identifiers.some(identifier => seen.has(identifier))) {
429
428
  continue;
430
429
  }
431
430
  for (const identifier of identifiers) {
@@ -452,7 +451,7 @@ export class AuthStorage {
452
451
  kept.push(entry);
453
452
  continue;
454
453
  }
455
- if (identifiers.some((identifier) => seen.has(identifier))) {
454
+ if (identifiers.some(identifier => seen.has(identifier))) {
456
455
  removed.push(entry);
457
456
  continue;
458
457
  }
@@ -472,7 +471,7 @@ export class AuthStorage {
472
471
 
473
472
  /** Returns all credentials for a provider as an array */
474
473
  private getCredentialsForProvider(provider: string): AuthCredential[] {
475
- return this.getStoredCredentials(provider).map((entry) => entry.credential);
474
+ return this.getStoredCredentials(provider).map(entry => entry.credential);
476
475
  }
477
476
 
478
477
  /** Composite key for round-robin tracking: "anthropic:oauth" or "openai:api_key" */
@@ -660,7 +659,7 @@ export class AuthStorage {
660
659
  const stored = this.storage.replaceAuthCredentialsForProvider(provider, deduped);
661
660
  this.setStoredCredentials(
662
661
  provider,
663
- stored.map((record) => ({ id: record.id, credential: record.credential })),
662
+ stored.map(record => ({ id: record.id, credential: record.credential })),
664
663
  );
665
664
  this.resetProviderAssignments(provider);
666
665
  }
@@ -704,7 +703,7 @@ export class AuthStorage {
704
703
  * Check if OAuth credentials are configured for a provider.
705
704
  */
706
705
  hasOAuth(provider: string): boolean {
707
- return this.getCredentialsForProvider(provider).some((credential) => credential.type === "oauth");
706
+ return this.getCredentialsForProvider(provider).some(credential => credential.type === "oauth");
708
707
  }
709
708
 
710
709
  /**
@@ -722,7 +721,7 @@ export class AuthStorage {
722
721
  getAll(): AuthStorageData {
723
722
  const result: AuthStorageData = {};
724
723
  for (const [provider, entries] of this.data.entries()) {
725
- const credentials = entries.map((entry) => entry.credential);
724
+ const credentials = entries.map(entry => entry.credential);
726
725
  if (credentials.length === 1) {
727
726
  result[provider] = credentials[0];
728
727
  } else if (credentials.length > 1) {
@@ -773,7 +772,7 @@ export class AuthStorage {
773
772
  break;
774
773
  case "cursor":
775
774
  credentials = await loginCursor(
776
- (url) => ctrl.onAuth({ url }),
775
+ url => ctrl.onAuth({ url }),
777
776
  ctrl.onProgress ? () => ctrl.onProgress?.("Waiting for browser authentication...") : undefined,
778
777
  );
779
778
  break;
@@ -847,7 +846,7 @@ export class AuthStorage {
847
846
  if (username) identifiers.push(`account:${username}`);
848
847
  const scopeAccountId = this.getUsageReportScopeAccountId(report);
849
848
  if (scopeAccountId) identifiers.push(`account:${scopeAccountId}`);
850
- return identifiers.map((identifier) => `${report.provider}:${identifier.toLowerCase()}`);
849
+ return identifiers.map(identifier => `${report.provider}:${identifier.toLowerCase()}`);
851
850
  }
852
851
 
853
852
  private mergeUsageReportGroup(reports: UsageReport[]): UsageReport {
@@ -859,7 +858,7 @@ export class AuthStorage {
859
858
  });
860
859
  const base = sorted[0];
861
860
  const mergedLimits = [...base.limits];
862
- const limitIds = new Set(mergedLimits.map((limit) => limit.id));
861
+ const limitIds = new Set(mergedLimits.map(limit => limit.id));
863
862
  const mergedMetadata: Record<string, unknown> = { ...(base.metadata ?? {}) };
864
863
  let fetchedAt = base.fetchedAt;
865
864
 
@@ -912,7 +911,7 @@ export class AuthStorage {
912
911
  }
913
912
  }
914
913
 
915
- const deduped = groups.map((group) => this.mergeUsageReportGroup(group));
914
+ const deduped = groups.map(group => this.mergeUsageReportGroup(group));
916
915
  if (deduped.length !== reports.length) {
917
916
  this.usageLogger?.debug("Usage reports deduped", {
918
917
  before: reports.length,
@@ -935,7 +934,7 @@ export class AuthStorage {
935
934
 
936
935
  /** Returns true if usage indicates rate limit has been reached. */
937
936
  private isUsageLimitReached(report: UsageReport): boolean {
938
- return report.limits.some((limit) => this.isUsageLimitExhausted(limit));
937
+ return report.limits.some(limit => this.isUsageLimitExhausted(limit));
939
938
  }
940
939
 
941
940
  /** Extracts the earliest reset timestamp from exhausted windows (in ms). */
@@ -1000,10 +999,7 @@ export class AuthStorage {
1000
999
  if (!resolver || !cache) return null;
1001
1000
 
1002
1001
  const tasks: Array<Promise<UsageReport | null>> = [];
1003
- const providers = new Set<string>([
1004
- ...this.data.keys(),
1005
- ...DEFAULT_USAGE_PROVIDERS.map((provider) => provider.id),
1006
- ]);
1002
+ const providers = new Set<string>([...this.data.keys(), ...DEFAULT_USAGE_PROVIDERS.map(provider => provider.id)]);
1007
1003
  this.usageLogger?.debug("Usage fetch requested", {
1008
1004
  providers: Array.from(providers).sort(),
1009
1005
  });
@@ -1048,7 +1044,7 @@ export class AuthStorage {
1048
1044
  now: this.usageNow,
1049
1045
  logger: this.usageLogger,
1050
1046
  })
1051
- .catch((error) => {
1047
+ .catch(error => {
1052
1048
  logger.debug("AuthStorage usage fetch failed", {
1053
1049
  provider,
1054
1050
  error: String(error),
@@ -1091,7 +1087,7 @@ export class AuthStorage {
1091
1087
  now: this.usageNow,
1092
1088
  logger: this.usageLogger,
1093
1089
  })
1094
- .catch((error) => {
1090
+ .catch(error => {
1095
1091
  logger.debug("AuthStorage usage fetch failed", {
1096
1092
  provider,
1097
1093
  error: String(error),
@@ -1107,7 +1103,7 @@ export class AuthStorage {
1107
1103
  const reports = results.filter((report): report is UsageReport => report !== null);
1108
1104
  const deduped = this.dedupeUsageReports(reports);
1109
1105
  this.usageLogger?.debug("Usage fetch resolved", {
1110
- reports: deduped.map((report) => {
1106
+ reports: deduped.map(report => {
1111
1107
  const accountLabel =
1112
1108
  this.getUsageReportMetadataValue(report, "email") ??
1113
1109
  this.getUsageReportMetadataValue(report, "accountId") ??
@@ -1164,7 +1160,7 @@ export class AuthStorage {
1164
1160
  entry.credential.type === sessionCredential.type && entry.index !== sessionCredential.index,
1165
1161
  );
1166
1162
 
1167
- return remainingCredentials.some((candidate) => !this.isCredentialBlocked(providerKey, candidate.index));
1163
+ return remainingCredentials.some(candidate => !this.isCredentialBlocked(providerKey, candidate.index));
1168
1164
  }
1169
1165
 
1170
1166
  /**
@@ -1285,7 +1281,7 @@ export class AuthStorage {
1285
1281
  error: String(error),
1286
1282
  });
1287
1283
  this.removeCredentialAt(provider, selection.index);
1288
- if (this.getCredentialsForProvider(provider).some((credential) => credential.type === "oauth")) {
1284
+ if (this.getCredentialsForProvider(provider).some(credential => credential.type === "oauth")) {
1289
1285
  return this.getApiKey(provider, sessionId, options);
1290
1286
  }
1291
1287
  }
@@ -4,22 +4,19 @@
4
4
  * When navigating to a different point in the session tree, this generates
5
5
  * a summary of the branch being left so context isn't lost.
6
6
  */
7
-
8
7
  import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
9
8
  import type { Model } from "@oh-my-pi/pi-ai";
10
9
  import { completeSimple } from "@oh-my-pi/pi-ai";
11
- import { renderPromptTemplate } from "@oh-my-pi/pi-coding-agent/config/prompt-templates";
12
- import branchSummaryPrompt from "@oh-my-pi/pi-coding-agent/prompts/compaction/branch-summary.md" with { type: "text" };
13
- import branchSummaryPreamble from "@oh-my-pi/pi-coding-agent/prompts/compaction/branch-summary-preamble.md" with {
14
- type: "text",
15
- };
10
+ import { renderPromptTemplate } from "../../config/prompt-templates";
11
+ import branchSummaryPrompt from "../../prompts/compaction/branch-summary.md" with { type: "text" };
12
+ import branchSummaryPreamble from "../../prompts/compaction/branch-summary-preamble.md" with { type: "text" };
16
13
  import {
17
14
  convertToLlm,
18
15
  createBranchSummaryMessage,
19
16
  createCompactionSummaryMessage,
20
17
  createCustomMessage,
21
- } from "@oh-my-pi/pi-coding-agent/session/messages";
22
- import type { ReadonlySessionManager, SessionEntry } from "@oh-my-pi/pi-coding-agent/session/session-manager";
18
+ } from "../../session/messages";
19
+ import type { ReadonlySessionManager, SessionEntry } from "../../session/session-manager";
23
20
  import { estimateTokens } from "./compaction";
24
21
  import {
25
22
  computeFileLists,
@@ -107,7 +104,7 @@ export function collectEntriesForBranchSummary(
107
104
  }
108
105
 
109
106
  // Find common ancestor (deepest node that's on both paths)
110
- const oldPath = new Set(session.getBranch(oldLeafId).map((e) => e.id));
107
+ const oldPath = new Set(session.getBranch(oldLeafId).map(e => e.id));
111
108
  const targetPath = session.getBranch(targetId);
112
109
 
113
110
  // targetPath is root-first, so iterate backwards to find deepest common ancestor
@@ -300,7 +297,7 @@ export async function generateBranchSummary(
300
297
 
301
298
  let summary = response.content
302
299
  .filter((c): c is { type: "text"; text: string } => c.type === "text")
303
- .map((c) => c.text)
300
+ .map(c => c.text)
304
301
  .join("\n");
305
302
 
306
303
  // Prepend preamble to provide context about the branch summary
@@ -4,26 +4,15 @@
4
4
  * Pure functions for compaction logic. The session manager handles I/O,
5
5
  * and after compaction the session is reloaded.
6
6
  */
7
-
8
7
  import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
9
8
  import type { AssistantMessage, Model, Usage } from "@oh-my-pi/pi-ai";
10
9
  import { completeSimple } from "@oh-my-pi/pi-ai";
11
- import { renderPromptTemplate } from "@oh-my-pi/pi-coding-agent/config/prompt-templates";
12
- import compactionSummaryPrompt from "@oh-my-pi/pi-coding-agent/prompts/compaction/compaction-summary.md" with {
13
- type: "text",
14
- };
15
- import compactionTurnPrefixPrompt from "@oh-my-pi/pi-coding-agent/prompts/compaction/compaction-turn-prefix.md" with {
16
- type: "text",
17
- };
18
- import compactionUpdateSummaryPrompt from "@oh-my-pi/pi-coding-agent/prompts/compaction/compaction-update-summary.md" with {
19
- type: "text",
20
- };
21
- import {
22
- convertToLlm,
23
- createBranchSummaryMessage,
24
- createCustomMessage,
25
- } from "@oh-my-pi/pi-coding-agent/session/messages";
26
- import type { CompactionEntry, SessionEntry } from "@oh-my-pi/pi-coding-agent/session/session-manager";
10
+ import { renderPromptTemplate } from "../../config/prompt-templates";
11
+ import compactionSummaryPrompt from "../../prompts/compaction/compaction-summary.md" with { type: "text" };
12
+ import compactionTurnPrefixPrompt from "../../prompts/compaction/compaction-turn-prefix.md" with { type: "text" };
13
+ import compactionUpdateSummaryPrompt from "../../prompts/compaction/compaction-update-summary.md" with { type: "text" };
14
+ import { convertToLlm, createBranchSummaryMessage, createCustomMessage } from "../../session/messages";
15
+ import type { CompactionEntry, SessionEntry } from "../../session/session-manager";
27
16
  import {
28
17
  computeFileLists,
29
18
  createFileOps,
@@ -454,7 +443,7 @@ export async function generateSummary(
454
443
 
455
444
  const textContent = response.content
456
445
  .filter((c): c is { type: "text"; text: string } => c.type === "text")
457
- .map((c) => c.text)
446
+ .map(c => c.text)
458
447
  .join("\n");
459
448
 
460
449
  return textContent;
@@ -675,6 +664,6 @@ async function generateTurnPrefixSummary(
675
664
 
676
665
  return response.content
677
666
  .filter((c): c is { type: "text"; text: string } => c.type === "text")
678
- .map((c) => c.text)
667
+ .map(c => c.text)
679
668
  .join("\n");
680
669
  }
@@ -1,14 +1,11 @@
1
1
  /**
2
2
  * Shared utilities for compaction and branch summarization.
3
3
  */
4
-
5
4
  import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
6
5
  import type { Message } from "@oh-my-pi/pi-ai";
7
- import { renderPromptTemplate } from "@oh-my-pi/pi-coding-agent/config/prompt-templates";
8
- import fileOperationsTemplate from "@oh-my-pi/pi-coding-agent/prompts/system/file-operations.md" with { type: "text" };
9
- import summarizationSystemPrompt from "@oh-my-pi/pi-coding-agent/prompts/system/summarization-system.md" with {
10
- type: "text",
11
- };
6
+ import { renderPromptTemplate } from "../../config/prompt-templates";
7
+ import fileOperationsTemplate from "../../prompts/system/file-operations.md" with { type: "text" };
8
+ import summarizationSystemPrompt from "../../prompts/system/summarization-system.md" with { type: "text" };
12
9
 
13
10
  // ============================================================================
14
11
  // File Operation Tracking
@@ -66,7 +63,7 @@ export function extractFileOpsFromMessage(message: AgentMessage, fileOps: FileOp
66
63
  */
67
64
  export function computeFileLists(fileOps: FileOperations): { readFiles: string[]; modifiedFiles: string[] } {
68
65
  const modified = new Set([...fileOps.edited, ...fileOps.written]);
69
- const readOnly = [...fileOps.read].filter((f) => !modified.has(f)).sort();
66
+ const readOnly = [...fileOps.read].filter(f => !modified.has(f)).sort();
70
67
  const modifiedFiles = [...modified].sort();
71
68
  return { readFiles: readOnly, modifiedFiles };
72
69
  }
@@ -98,7 +95,7 @@ export function serializeConversation(messages: Message[]): string {
98
95
  ? msg.content
99
96
  : msg.content
100
97
  .filter((c): c is { type: "text"; text: string } => c.type === "text")
101
- .map((c) => c.text)
98
+ .map(c => c.text)
102
99
  .join("");
103
100
  if (content) parts.push(`[User]: ${content}`);
104
101
  } else if (msg.role === "assistant") {
@@ -132,7 +129,7 @@ export function serializeConversation(messages: Message[]): string {
132
129
  } else if (msg.role === "toolResult") {
133
130
  const content = msg.content
134
131
  .filter((c): c is { type: "text"; text: string } => c.type === "text")
135
- .map((c) => c.text)
132
+ .map(c => c.text)
136
133
  .join("");
137
134
  if (content) {
138
135
  parts.push(`[Tool result]: ${content}`);
@@ -1,8 +1,8 @@
1
1
  import { Database } from "bun:sqlite";
2
- import { mkdirSync } from "node:fs";
3
- import { dirname, join } from "node:path";
4
- import { getAgentDir } from "@oh-my-pi/pi-coding-agent/config";
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
5
4
  import { logger } from "@oh-my-pi/pi-utils";
5
+ import { getAgentDir } from "../config";
6
6
 
7
7
  export interface HistoryEntry {
8
8
  id: number;
@@ -81,7 +81,7 @@ END;
81
81
  this.lastPromptCache = last?.prompt ?? null;
82
82
  }
83
83
 
84
- static open(dbPath: string = join(getAgentDir(), "history.db")): HistoryStorage {
84
+ static open(dbPath: string = path.join(getAgentDir(), "history.db")): HistoryStorage {
85
85
  if (!HistoryStorage.instance) {
86
86
  HistoryStorage.instance = new HistoryStorage(dbPath);
87
87
  }
@@ -110,7 +110,7 @@ END;
110
110
 
111
111
  try {
112
112
  const rows = this.recentStmt.all(safeLimit) as HistoryRow[];
113
- return rows.map((row) => this.toEntry(row));
113
+ return rows.map(row => this.toEntry(row));
114
114
  } catch (error) {
115
115
  logger.error("HistoryStorage getRecent failed", { error: String(error) });
116
116
  return [];
@@ -126,7 +126,7 @@ END;
126
126
 
127
127
  try {
128
128
  const rows = this.searchStmt.all(ftsQuery, safeLimit) as HistoryRow[];
129
- return rows.map((row) => this.toEntry(row));
129
+ return rows.map(row => this.toEntry(row));
130
130
  } catch (error) {
131
131
  logger.error("HistoryStorage search failed", { error: String(error) });
132
132
  return [];
@@ -134,8 +134,8 @@ END;
134
134
  }
135
135
 
136
136
  private ensureDir(dbPath: string): void {
137
- const dir = dirname(dbPath);
138
- mkdirSync(dir, { recursive: true });
137
+ const dir = path.dirname(dbPath);
138
+ fs.mkdirSync(dir, { recursive: true });
139
139
  }
140
140
 
141
141
  private normalizeLimit(limit: number): number {
@@ -148,13 +148,13 @@ END;
148
148
  const tokens = query
149
149
  .trim()
150
150
  .split(/\s+/)
151
- .map((token) => token.trim())
151
+ .map(token => token.trim())
152
152
  .filter(Boolean);
153
153
 
154
154
  if (tokens.length === 0) return null;
155
155
 
156
156
  return tokens
157
- .map((token) => {
157
+ .map(token => {
158
158
  const escaped = token.replace(/"/g, '""');
159
159
  return `"${escaped}"*`;
160
160
  })
@@ -4,11 +4,10 @@
4
4
  * Extends the base AgentMessage type with coding-agent specific message types,
5
5
  * and provides a transformer to convert them to LLM-compatible messages.
6
6
  */
7
-
8
7
  import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
9
8
  import type { ImageContent, Message, TextContent } from "@oh-my-pi/pi-ai";
10
- import type { OutputMeta } from "@oh-my-pi/pi-coding-agent/tools/output-meta";
11
- import { formatOutputNotice } from "@oh-my-pi/pi-coding-agent/tools/output-meta";
9
+ import type { OutputMeta } from "../tools/output-meta";
10
+ import { formatOutputNotice } from "../tools/output-meta";
12
11
 
13
12
  export const COMPACTION_SUMMARY_PREFIX = `The conversation history before this point was compacted into the following summary:
14
13
 
@@ -255,7 +254,7 @@ export function convertToLlm(messages: AgentMessage[]): Message[] {
255
254
  timestamp: m.timestamp,
256
255
  };
257
256
  case "fileMention": {
258
- const fileContents = m.files.map((f) => `<file path="${f.path}">\n${f.content}\n</file>`).join("\n\n");
257
+ const fileContents = m.files.map(f => `<file path="${f.path}">\n${f.content}\n</file>`).join("\n\n");
259
258
  return {
260
259
  role: "user",
261
260
  content: [{ type: "text" as const, text: `<system-reminder>\n${fileContents}\n</system-reminder>` }],
@@ -272,5 +271,5 @@ export function convertToLlm(messages: AgentMessage[]): Message[] {
272
271
  return undefined;
273
272
  }
274
273
  })
275
- .filter((m) => m !== undefined);
274
+ .filter(m => m !== undefined);
276
275
  }