@oh-my-pi/pi-coding-agent 8.0.20 → 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 (421) hide show
  1. package/CHANGELOG.md +125 -0
  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 +54 -23
  38. package/scripts/format-prompts.ts +0 -1
  39. package/src/capability/context-file.ts +3 -4
  40. package/src/capability/extension-module.ts +3 -4
  41. package/src/capability/extension.ts +3 -4
  42. package/src/capability/fs.ts +20 -21
  43. package/src/capability/hook.ts +3 -4
  44. package/src/capability/index.ts +15 -16
  45. package/src/capability/instruction.ts +3 -4
  46. package/src/capability/mcp.ts +3 -4
  47. package/src/capability/prompt.ts +3 -4
  48. package/src/capability/rule.ts +3 -4
  49. package/src/capability/settings.ts +2 -3
  50. package/src/capability/skill.ts +3 -4
  51. package/src/capability/slash-command.ts +3 -4
  52. package/src/capability/ssh.ts +3 -4
  53. package/src/capability/system-prompt.ts +3 -4
  54. package/src/capability/tool.ts +3 -4
  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 -25
  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 +307 -0
  66. package/src/commit/agentic/fallback.ts +96 -0
  67. package/src/commit/agentic/index.ts +351 -0
  68. package/src/commit/agentic/prompts/analyze-file.md +22 -0
  69. package/src/commit/agentic/prompts/session-user.md +26 -0
  70. package/src/commit/agentic/prompts/split-confirm.md +1 -0
  71. package/src/commit/agentic/prompts/system.md +40 -0
  72. package/src/commit/agentic/state.ts +69 -0
  73. package/src/commit/agentic/tools/analyze-file.ts +131 -0
  74. package/src/commit/agentic/tools/git-file-diff.ts +194 -0
  75. package/src/commit/agentic/tools/git-hunk.ts +50 -0
  76. package/src/commit/agentic/tools/git-overview.ts +84 -0
  77. package/src/commit/agentic/tools/index.ts +56 -0
  78. package/src/commit/agentic/tools/propose-changelog.ts +128 -0
  79. package/src/commit/agentic/tools/propose-commit.ts +154 -0
  80. package/src/commit/agentic/tools/recent-commits.ts +81 -0
  81. package/src/commit/agentic/tools/split-commit.ts +280 -0
  82. package/src/commit/agentic/topo-sort.ts +44 -0
  83. package/src/commit/agentic/trivial.ts +51 -0
  84. package/src/commit/agentic/validation.ts +200 -0
  85. package/src/commit/analysis/conventional.ts +165 -0
  86. package/src/commit/analysis/index.ts +4 -0
  87. package/src/commit/analysis/scope.ts +242 -0
  88. package/src/commit/analysis/summary.ts +112 -0
  89. package/src/commit/analysis/validation.ts +66 -0
  90. package/src/commit/changelog/detect.ts +36 -0
  91. package/src/commit/changelog/generate.ts +110 -0
  92. package/src/commit/changelog/index.ts +233 -0
  93. package/src/commit/changelog/parse.ts +44 -0
  94. package/src/commit/cli.ts +93 -0
  95. package/src/commit/git/diff.ts +148 -0
  96. package/src/commit/git/errors.ts +11 -0
  97. package/src/commit/git/index.ts +212 -0
  98. package/src/commit/git/operations.ts +53 -0
  99. package/src/commit/index.ts +5 -0
  100. package/src/commit/map-reduce/index.ts +63 -0
  101. package/src/commit/map-reduce/map-phase.ts +178 -0
  102. package/src/commit/map-reduce/reduce-phase.ts +145 -0
  103. package/src/commit/map-reduce/utils.ts +9 -0
  104. package/src/commit/message.ts +11 -0
  105. package/src/commit/model-selection.ts +80 -0
  106. package/src/commit/pipeline.ts +240 -0
  107. package/src/commit/prompts/analysis-system.md +155 -0
  108. package/src/commit/prompts/analysis-user.md +41 -0
  109. package/src/commit/prompts/changelog-system.md +56 -0
  110. package/src/commit/prompts/changelog-user.md +19 -0
  111. package/src/commit/prompts/file-observer-system.md +26 -0
  112. package/src/commit/prompts/file-observer-user.md +9 -0
  113. package/src/commit/prompts/reduce-system.md +60 -0
  114. package/src/commit/prompts/reduce-user.md +17 -0
  115. package/src/commit/prompts/summary-retry.md +4 -0
  116. package/src/commit/prompts/summary-system.md +52 -0
  117. package/src/commit/prompts/summary-user.md +13 -0
  118. package/src/commit/prompts/types-description.md +2 -0
  119. package/src/commit/types.ts +109 -0
  120. package/src/commit/utils/exclusions.ts +42 -0
  121. package/src/config/file-lock.ts +121 -0
  122. package/src/config/keybindings.ts +6 -8
  123. package/src/config/model-registry.ts +65 -38
  124. package/src/config/model-resolver.ts +18 -19
  125. package/src/config/prompt-templates.ts +11 -11
  126. package/src/config/settings-manager.ts +141 -50
  127. package/src/config.ts +64 -66
  128. package/src/cursor.ts +11 -9
  129. package/src/discovery/agents-md.ts +11 -12
  130. package/src/discovery/builtin.ts +68 -73
  131. package/src/discovery/claude.ts +41 -42
  132. package/src/discovery/cline.ts +11 -12
  133. package/src/discovery/codex.ts +52 -53
  134. package/src/discovery/cursor.ts +9 -10
  135. package/src/discovery/gemini.ts +17 -22
  136. package/src/discovery/github.ts +13 -14
  137. package/src/discovery/helpers.ts +35 -34
  138. package/src/discovery/index.ts +22 -24
  139. package/src/discovery/mcp-json.ts +8 -9
  140. package/src/discovery/ssh.ts +8 -9
  141. package/src/discovery/vscode.ts +4 -5
  142. package/src/discovery/windsurf.ts +6 -7
  143. package/src/exa/company.ts +1 -2
  144. package/src/exa/index.ts +2 -3
  145. package/src/exa/linkedin.ts +1 -2
  146. package/src/exa/mcp-client.ts +14 -16
  147. package/src/exa/render.ts +10 -11
  148. package/src/exa/researcher.ts +1 -2
  149. package/src/exa/search.ts +1 -2
  150. package/src/exa/types.ts +0 -1
  151. package/src/exa/websets.ts +1 -2
  152. package/src/exec/bash-executor.ts +3 -4
  153. package/src/exec/exec.ts +0 -1
  154. package/src/export/custom-share.ts +5 -6
  155. package/src/export/html/index.ts +24 -21
  156. package/src/export/ttsr.ts +2 -3
  157. package/src/extensibility/custom-commands/bundled/review/index.ts +7 -8
  158. package/src/extensibility/custom-commands/loader.ts +18 -15
  159. package/src/extensibility/custom-commands/types.ts +2 -3
  160. package/src/extensibility/custom-tools/loader.ts +11 -12
  161. package/src/extensibility/custom-tools/types.ts +7 -8
  162. package/src/extensibility/custom-tools/wrapper.ts +2 -3
  163. package/src/extensibility/extensions/loader.ts +76 -54
  164. package/src/extensibility/extensions/runner.ts +11 -12
  165. package/src/extensibility/extensions/types.ts +20 -27
  166. package/src/extensibility/extensions/wrapper.ts +3 -4
  167. package/src/extensibility/hooks/index.ts +1 -1
  168. package/src/extensibility/hooks/loader.ts +9 -10
  169. package/src/extensibility/hooks/runner.ts +7 -8
  170. package/src/extensibility/hooks/tool-wrapper.ts +0 -1
  171. package/src/extensibility/hooks/types.ts +11 -18
  172. package/src/extensibility/plugins/doctor.ts +3 -3
  173. package/src/extensibility/plugins/installer.ts +27 -27
  174. package/src/extensibility/plugins/loader.ts +59 -56
  175. package/src/extensibility/plugins/manager.ts +211 -171
  176. package/src/extensibility/plugins/parser.ts +1 -1
  177. package/src/extensibility/plugins/paths.ts +8 -8
  178. package/src/extensibility/skills.ts +63 -60
  179. package/src/extensibility/slash-commands.ts +10 -10
  180. package/src/index.ts +54 -54
  181. package/src/internal-urls/agent-protocol.ts +21 -11
  182. package/src/internal-urls/artifact-protocol.ts +17 -13
  183. package/src/internal-urls/router.ts +1 -2
  184. package/src/internal-urls/rule-protocol.ts +3 -4
  185. package/src/internal-urls/skill-protocol.ts +3 -4
  186. package/src/ipy/executor.ts +109 -9
  187. package/src/ipy/gateway-coordinator.ts +79 -90
  188. package/src/ipy/kernel.ts +32 -30
  189. package/src/ipy/modules.ts +13 -13
  190. package/src/lsp/client.ts +21 -10
  191. package/src/lsp/clients/biome-client.ts +1 -2
  192. package/src/lsp/clients/index.ts +3 -3
  193. package/src/lsp/clients/lsp-linter-client.ts +4 -5
  194. package/src/lsp/config.ts +15 -15
  195. package/src/lsp/edits.ts +4 -5
  196. package/src/lsp/index.ts +43 -44
  197. package/src/lsp/lspmux.ts +8 -8
  198. package/src/lsp/render.ts +99 -61
  199. package/src/lsp/utils.ts +3 -3
  200. package/src/main.ts +71 -37
  201. package/src/mcp/client.ts +2 -3
  202. package/src/mcp/config.ts +5 -6
  203. package/src/mcp/json-rpc.ts +0 -1
  204. package/src/mcp/loader.ts +6 -7
  205. package/src/mcp/manager.ts +17 -18
  206. package/src/mcp/tool-bridge.ts +4 -9
  207. package/src/mcp/tool-cache.ts +2 -3
  208. package/src/mcp/transports/http.ts +2 -4
  209. package/src/mcp/transports/stdio.ts +1 -2
  210. package/src/migrations.ts +63 -52
  211. package/src/modes/components/armin.ts +4 -5
  212. package/src/modes/components/assistant-message.ts +33 -5
  213. package/src/modes/components/bash-execution.ts +7 -8
  214. package/src/modes/components/bordered-loader.ts +3 -3
  215. package/src/modes/components/branch-summary-message.ts +3 -3
  216. package/src/modes/components/compaction-summary-message.ts +3 -3
  217. package/src/modes/components/countdown-timer.ts +0 -1
  218. package/src/modes/components/custom-message.ts +5 -5
  219. package/src/modes/components/diff.ts +1 -1
  220. package/src/modes/components/dynamic-border.ts +2 -2
  221. package/src/modes/components/extensions/extension-dashboard.ts +6 -7
  222. package/src/modes/components/extensions/extension-list.ts +2 -3
  223. package/src/modes/components/extensions/inspector-panel.ts +3 -4
  224. package/src/modes/components/extensions/state-manager.ts +25 -26
  225. package/src/modes/components/extensions/types.ts +1 -2
  226. package/src/modes/components/footer.ts +47 -43
  227. package/src/modes/components/history-search.ts +2 -2
  228. package/src/modes/components/hook-editor.ts +3 -4
  229. package/src/modes/components/hook-input.ts +2 -3
  230. package/src/modes/components/hook-message.ts +5 -5
  231. package/src/modes/components/hook-selector.ts +2 -3
  232. package/src/modes/components/keybinding-hints.ts +2 -3
  233. package/src/modes/components/login-dialog.ts +2 -2
  234. package/src/modes/components/model-selector.ts +12 -12
  235. package/src/modes/components/oauth-selector.ts +2 -2
  236. package/src/modes/components/plugin-settings.ts +20 -20
  237. package/src/modes/components/python-execution.ts +7 -8
  238. package/src/modes/components/queue-mode-selector.ts +3 -3
  239. package/src/modes/components/read-tool-group.ts +2 -2
  240. package/src/modes/components/session-selector.ts +4 -4
  241. package/src/modes/components/settings-defs.ts +77 -69
  242. package/src/modes/components/settings-selector.ts +16 -16
  243. package/src/modes/components/show-images-selector.ts +2 -2
  244. package/src/modes/components/status-line/segments.ts +4 -4
  245. package/src/modes/components/status-line/separators.ts +1 -1
  246. package/src/modes/components/status-line/types.ts +2 -2
  247. package/src/modes/components/status-line-segment-editor.ts +7 -8
  248. package/src/modes/components/status-line.ts +12 -12
  249. package/src/modes/components/theme-selector.ts +8 -7
  250. package/src/modes/components/thinking-selector.ts +4 -4
  251. package/src/modes/components/todo-display.ts +2 -2
  252. package/src/modes/components/todo-reminder.ts +4 -4
  253. package/src/modes/components/tool-execution.ts +16 -19
  254. package/src/modes/components/tree-selector.ts +12 -12
  255. package/src/modes/components/ttsr-notification.ts +5 -5
  256. package/src/modes/components/user-message-selector.ts +1 -1
  257. package/src/modes/components/user-message.ts +1 -1
  258. package/src/modes/components/visual-truncate.ts +0 -1
  259. package/src/modes/components/welcome.ts +4 -4
  260. package/src/modes/controllers/command-controller.ts +46 -47
  261. package/src/modes/controllers/event-controller.ts +16 -20
  262. package/src/modes/controllers/extension-ui-controller.ts +40 -46
  263. package/src/modes/controllers/input-controller.ts +17 -18
  264. package/src/modes/controllers/selector-controller.ts +103 -91
  265. package/src/modes/index.ts +3 -3
  266. package/src/modes/interactive-mode.ts +31 -31
  267. package/src/modes/print-mode.ts +12 -13
  268. package/src/modes/rpc/rpc-client.ts +7 -8
  269. package/src/modes/rpc/rpc-mode.ts +24 -28
  270. package/src/modes/rpc/rpc-types.ts +3 -4
  271. package/src/modes/theme/mermaid-cache.ts +89 -0
  272. package/src/modes/theme/theme.ts +130 -53
  273. package/src/modes/types.ts +10 -10
  274. package/src/modes/utils/ui-helpers.ts +17 -17
  275. package/src/patch/applicator.ts +18 -19
  276. package/src/patch/diff.ts +1 -2
  277. package/src/patch/fuzzy.ts +1 -2
  278. package/src/patch/index.ts +11 -18
  279. package/src/patch/normalize.ts +4 -4
  280. package/src/patch/normative.ts +1 -2
  281. package/src/patch/parser.ts +8 -9
  282. package/src/patch/shared.ts +43 -16
  283. package/src/prompts/tools/task.md +2 -0
  284. package/src/sdk.ts +100 -65
  285. package/src/session/agent-session.ts +84 -85
  286. package/src/session/agent-storage.ts +43 -39
  287. package/src/session/artifacts.ts +32 -10
  288. package/src/session/auth-storage.ts +50 -39
  289. package/src/session/compaction/branch-summarization.ts +7 -10
  290. package/src/session/compaction/compaction.ts +8 -19
  291. package/src/session/compaction/utils.ts +6 -9
  292. package/src/session/history-storage.ts +10 -10
  293. package/src/session/messages.ts +4 -5
  294. package/src/session/session-manager.ts +76 -65
  295. package/src/session/session-storage.ts +57 -69
  296. package/src/session/storage-migration.ts +14 -56
  297. package/src/session/streaming-output.ts +2 -2
  298. package/src/ssh/connection-manager.ts +43 -50
  299. package/src/ssh/ssh-executor.ts +2 -2
  300. package/src/ssh/sshfs-mount.ts +11 -18
  301. package/src/system-prompt.ts +28 -35
  302. package/src/task/agents.ts +45 -30
  303. package/src/task/commands.ts +6 -7
  304. package/src/task/discovery.ts +39 -76
  305. package/src/task/executor.ts +14 -15
  306. package/src/task/index.ts +40 -34
  307. package/src/task/output-manager.ts +93 -0
  308. package/src/task/parallel.ts +0 -1
  309. package/src/task/render.ts +24 -30
  310. package/src/task/subprocess-tool-registry.ts +1 -2
  311. package/src/task/worker-protocol.ts +3 -3
  312. package/src/task/worker.ts +33 -39
  313. package/src/task/worktree.ts +19 -19
  314. package/src/tools/ask.ts +41 -20
  315. package/src/tools/bash-interceptor.ts +1 -5
  316. package/src/tools/bash.ts +91 -97
  317. package/src/tools/calculator.ts +49 -47
  318. package/src/tools/complete.ts +4 -5
  319. package/src/tools/context.ts +2 -2
  320. package/src/tools/fetch.ts +84 -124
  321. package/src/tools/find.ts +94 -98
  322. package/src/tools/gemini-image.ts +14 -14
  323. package/src/tools/grep.ts +100 -116
  324. package/src/tools/index.ts +80 -55
  325. package/src/tools/list-limit.ts +1 -1
  326. package/src/tools/ls.ts +44 -70
  327. package/src/tools/notebook.ts +51 -67
  328. package/src/tools/output-meta.ts +3 -4
  329. package/src/tools/output-utils.ts +2 -2
  330. package/src/tools/path-utils.ts +5 -5
  331. package/src/tools/python.ts +104 -217
  332. package/src/tools/read.ts +92 -33
  333. package/src/tools/render-utils.ts +8 -23
  334. package/src/tools/renderers.ts +6 -7
  335. package/src/tools/review.ts +8 -11
  336. package/src/tools/ssh.ts +69 -49
  337. package/src/tools/todo-write.ts +37 -25
  338. package/src/tools/tool-errors.ts +3 -3
  339. package/src/tools/tool-result.ts +3 -8
  340. package/src/tools/write.ts +99 -75
  341. package/src/tui/code-cell.ts +109 -0
  342. package/src/tui/file-list.ts +47 -0
  343. package/src/tui/index.ts +11 -0
  344. package/src/tui/output-block.ts +72 -0
  345. package/src/tui/status-line.ts +39 -0
  346. package/src/tui/tree-list.ts +55 -0
  347. package/src/tui/types.ts +16 -0
  348. package/src/tui/utils.ts +48 -0
  349. package/src/utils/changelog.ts +9 -10
  350. package/src/utils/clipboard.ts +11 -11
  351. package/src/utils/file-mentions.ts +4 -10
  352. package/src/utils/frontmatter.ts +6 -3
  353. package/src/utils/fuzzy.ts +2 -2
  354. package/src/utils/image-convert.ts +1 -1
  355. package/src/utils/image-resize.ts +1 -1
  356. package/src/utils/mime.ts +2 -2
  357. package/src/utils/shell-snapshot.ts +11 -13
  358. package/src/utils/shell.ts +4 -5
  359. package/src/utils/title-generator.ts +8 -9
  360. package/src/utils/tools-manager.ts +23 -23
  361. package/src/vendor/photon/index.js +1099 -1059
  362. package/src/vendor/photon/photon_rs_bg.wasm +0 -0
  363. package/src/web/scrapers/artifacthub.ts +1 -1
  364. package/src/web/scrapers/arxiv.ts +2 -2
  365. package/src/web/scrapers/bluesky.ts +2 -2
  366. package/src/web/scrapers/cheatsh.ts +1 -1
  367. package/src/web/scrapers/chocolatey.ts +2 -2
  368. package/src/web/scrapers/choosealicense.ts +5 -5
  369. package/src/web/scrapers/cisa-kev.ts +1 -1
  370. package/src/web/scrapers/crossref.ts +2 -2
  371. package/src/web/scrapers/devto.ts +3 -3
  372. package/src/web/scrapers/discogs.ts +3 -4
  373. package/src/web/scrapers/discourse.ts +1 -1
  374. package/src/web/scrapers/dockerhub.ts +1 -1
  375. package/src/web/scrapers/fdroid.ts +2 -2
  376. package/src/web/scrapers/firefox-addons.ts +3 -3
  377. package/src/web/scrapers/flathub.ts +1 -1
  378. package/src/web/scrapers/github.ts +3 -3
  379. package/src/web/scrapers/gitlab.ts +4 -4
  380. package/src/web/scrapers/hackernews.ts +2 -2
  381. package/src/web/scrapers/huggingface.ts +1 -1
  382. package/src/web/scrapers/iacr.ts +2 -2
  383. package/src/web/scrapers/index.ts +0 -1
  384. package/src/web/scrapers/jetbrains-marketplace.ts +1 -1
  385. package/src/web/scrapers/lemmy.ts +2 -2
  386. package/src/web/scrapers/maven.ts +2 -2
  387. package/src/web/scrapers/mdn.ts +2 -4
  388. package/src/web/scrapers/metacpan.ts +2 -2
  389. package/src/web/scrapers/musicbrainz.ts +1 -2
  390. package/src/web/scrapers/npm.ts +1 -1
  391. package/src/web/scrapers/nuget.ts +2 -2
  392. package/src/web/scrapers/nvd.ts +3 -3
  393. package/src/web/scrapers/ollama.ts +7 -9
  394. package/src/web/scrapers/opencorporates.ts +2 -2
  395. package/src/web/scrapers/openlibrary.ts +6 -6
  396. package/src/web/scrapers/orcid.ts +0 -1
  397. package/src/web/scrapers/osv.ts +2 -2
  398. package/src/web/scrapers/packagist.ts +1 -1
  399. package/src/web/scrapers/pubmed.ts +1 -2
  400. package/src/web/scrapers/rawg.ts +2 -2
  401. package/src/web/scrapers/readthedocs.ts +1 -2
  402. package/src/web/scrapers/repology.ts +2 -2
  403. package/src/web/scrapers/rfc.ts +1 -1
  404. package/src/web/scrapers/searchcode.ts +2 -2
  405. package/src/web/scrapers/semantic-scholar.ts +1 -1
  406. package/src/web/scrapers/snapcraft.ts +2 -2
  407. package/src/web/scrapers/sourcegraph.ts +1 -1
  408. package/src/web/scrapers/spdx.ts +3 -3
  409. package/src/web/scrapers/spotify.ts +0 -1
  410. package/src/web/scrapers/twitter.ts +1 -1
  411. package/src/web/scrapers/types.ts +1 -2
  412. package/src/web/scrapers/utils.ts +5 -5
  413. package/src/web/scrapers/wikidata.ts +3 -3
  414. package/src/web/scrapers/youtube.ts +9 -14
  415. package/src/web/search/auth.ts +5 -10
  416. package/src/web/search/index.ts +11 -21
  417. package/src/web/search/providers/anthropic.ts +3 -9
  418. package/src/web/search/providers/exa.ts +6 -10
  419. package/src/web/search/providers/perplexity.ts +5 -5
  420. package/src/web/search/render.ts +129 -175
  421. package/tsconfig.json +0 -42
@@ -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:";
@@ -162,17 +161,14 @@ export class AuthStorage {
162
161
  private usageLogger?: UsageLogger;
163
162
  private fallbackResolver?: (provider: string) => string | undefined;
164
163
 
165
- /**
166
- * @param authPath - Legacy auth.json path used for migration and locating agent.db
167
- * @param fallbackPaths - Additional auth.json paths to migrate (legacy support)
168
- */
169
- constructor(
164
+ private constructor(
170
165
  private authPath: string,
171
166
  private fallbackPaths: string[] = [],
167
+ storage: AgentStorage,
172
168
  options: AuthStorageOptions = {},
173
169
  ) {
174
170
  this.dbPath = AuthStorage.resolveDbPath(authPath);
175
- this.storage = AgentStorage.open(this.dbPath);
171
+ this.storage = storage;
176
172
  this.usageProviderResolver = options.usageProviderResolver ?? resolveDefaultUsageProvider;
177
173
  this.usageCache = options.usageCache ?? new AuthStorageUsageCache(this.storage);
178
174
  this.usageFetch = options.usageFetch ?? fetch;
@@ -185,17 +181,35 @@ export class AuthStorage {
185
181
  } satisfies UsageLogger);
186
182
  }
187
183
 
184
+ /**
185
+ * Create an AuthStorage instance.
186
+ * @param authPath - Legacy auth.json path used for migration and locating agent.db
187
+ * @param fallbackPaths - Additional auth.json paths to migrate (legacy support)
188
+ */
189
+ static async create(
190
+ authPath: string,
191
+ fallbackPaths: string[] = [],
192
+ options: AuthStorageOptions = {},
193
+ ): Promise<AuthStorage> {
194
+ const dbPath = AuthStorage.resolveDbPath(authPath);
195
+ const storage = await AgentStorage.open(dbPath);
196
+ return new AuthStorage(authPath, fallbackPaths, storage, options);
197
+ }
198
+
188
199
  /**
189
200
  * Create an in-memory AuthStorage instance from serialized data.
190
201
  * Used by subagent workers to bypass discovery and use parent's credentials.
191
202
  */
192
- static fromSerialized(data: SerializedAuthStorage, options: AuthStorageOptions = {}): AuthStorage {
193
- const instance = Object.create(AuthStorage.prototype) as AuthStorage;
203
+ static async fromSerialized(data: SerializedAuthStorage, options: AuthStorageOptions = {}): Promise<AuthStorage> {
194
204
  const authPath = data.authPath ?? data.dbPath ?? getAuthPath();
205
+ const dbPath = data.dbPath ?? AuthStorage.resolveDbPath(authPath);
206
+ const storage = await AgentStorage.open(dbPath);
207
+
208
+ const instance = Object.create(AuthStorage.prototype) as AuthStorage;
195
209
  instance.authPath = authPath;
196
210
  instance.fallbackPaths = [];
197
- instance.dbPath = data.dbPath ?? AuthStorage.resolveDbPath(authPath);
198
- instance.storage = AgentStorage.open(instance.dbPath);
211
+ instance.dbPath = dbPath;
212
+ instance.storage = storage;
199
213
  instance.data = new Map();
200
214
  instance.runtimeOverrides = new Map();
201
215
  instance.providerRoundRobinIndex = new Map();
@@ -215,7 +229,7 @@ export class AuthStorage {
215
229
  for (const [provider, creds] of Object.entries(data.credentials)) {
216
230
  instance.data.set(
217
231
  provider,
218
- creds.map((c) => ({
232
+ creds.map(c => ({
219
233
  id: c.id,
220
234
  credential:
221
235
  c.type === "api_key"
@@ -240,7 +254,7 @@ export class AuthStorage {
240
254
  serialize(): SerializedAuthStorage {
241
255
  const credentials: SerializedAuthStorage["credentials"] = {};
242
256
  for (const [provider, creds] of this.data.entries()) {
243
- credentials[provider] = creds.map((c) => ({
257
+ credentials[provider] = creds.map(c => ({
244
258
  id: c.id,
245
259
  type: c.credential.type,
246
260
  data: c.credential.type === "api_key" ? { key: c.credential.key } : { ...c.credential },
@@ -267,7 +281,7 @@ export class AuthStorage {
267
281
  if (authPath.endsWith(".db")) {
268
282
  return authPath;
269
283
  }
270
- return getAgentDbPath(dirname(authPath));
284
+ return getAgentDbPath(path.dirname(authPath));
271
285
  }
272
286
 
273
287
  /**
@@ -298,10 +312,10 @@ export class AuthStorage {
298
312
  * Migrates legacy auth.json/settings.json on first load.
299
313
  */
300
314
  async reload(): Promise<void> {
301
- const agentDir = dirname(this.dbPath);
315
+ const agentDir = path.dirname(this.dbPath);
302
316
  await migrateJsonStorage({
303
317
  agentDir,
304
- settingsPath: join(agentDir, "settings.json"),
318
+ settingsPath: path.join(agentDir, "settings.json"),
305
319
  authPaths: [this.authPath, ...this.fallbackPaths],
306
320
  });
307
321
 
@@ -410,7 +424,7 @@ export class AuthStorage {
410
424
  deduped.push(credential);
411
425
  continue;
412
426
  }
413
- if (identifiers.some((identifier) => seen.has(identifier))) {
427
+ if (identifiers.some(identifier => seen.has(identifier))) {
414
428
  continue;
415
429
  }
416
430
  for (const identifier of identifiers) {
@@ -437,7 +451,7 @@ export class AuthStorage {
437
451
  kept.push(entry);
438
452
  continue;
439
453
  }
440
- if (identifiers.some((identifier) => seen.has(identifier))) {
454
+ if (identifiers.some(identifier => seen.has(identifier))) {
441
455
  removed.push(entry);
442
456
  continue;
443
457
  }
@@ -457,7 +471,7 @@ export class AuthStorage {
457
471
 
458
472
  /** Returns all credentials for a provider as an array */
459
473
  private getCredentialsForProvider(provider: string): AuthCredential[] {
460
- return this.getStoredCredentials(provider).map((entry) => entry.credential);
474
+ return this.getStoredCredentials(provider).map(entry => entry.credential);
461
475
  }
462
476
 
463
477
  /** Composite key for round-robin tracking: "anthropic:oauth" or "openai:api_key" */
@@ -645,7 +659,7 @@ export class AuthStorage {
645
659
  const stored = this.storage.replaceAuthCredentialsForProvider(provider, deduped);
646
660
  this.setStoredCredentials(
647
661
  provider,
648
- stored.map((record) => ({ id: record.id, credential: record.credential })),
662
+ stored.map(record => ({ id: record.id, credential: record.credential })),
649
663
  );
650
664
  this.resetProviderAssignments(provider);
651
665
  }
@@ -689,7 +703,7 @@ export class AuthStorage {
689
703
  * Check if OAuth credentials are configured for a provider.
690
704
  */
691
705
  hasOAuth(provider: string): boolean {
692
- return this.getCredentialsForProvider(provider).some((credential) => credential.type === "oauth");
706
+ return this.getCredentialsForProvider(provider).some(credential => credential.type === "oauth");
693
707
  }
694
708
 
695
709
  /**
@@ -707,7 +721,7 @@ export class AuthStorage {
707
721
  getAll(): AuthStorageData {
708
722
  const result: AuthStorageData = {};
709
723
  for (const [provider, entries] of this.data.entries()) {
710
- const credentials = entries.map((entry) => entry.credential);
724
+ const credentials = entries.map(entry => entry.credential);
711
725
  if (credentials.length === 1) {
712
726
  result[provider] = credentials[0];
713
727
  } else if (credentials.length > 1) {
@@ -758,7 +772,7 @@ export class AuthStorage {
758
772
  break;
759
773
  case "cursor":
760
774
  credentials = await loginCursor(
761
- (url) => ctrl.onAuth({ url }),
775
+ url => ctrl.onAuth({ url }),
762
776
  ctrl.onProgress ? () => ctrl.onProgress?.("Waiting for browser authentication...") : undefined,
763
777
  );
764
778
  break;
@@ -832,7 +846,7 @@ export class AuthStorage {
832
846
  if (username) identifiers.push(`account:${username}`);
833
847
  const scopeAccountId = this.getUsageReportScopeAccountId(report);
834
848
  if (scopeAccountId) identifiers.push(`account:${scopeAccountId}`);
835
- return identifiers.map((identifier) => `${report.provider}:${identifier.toLowerCase()}`);
849
+ return identifiers.map(identifier => `${report.provider}:${identifier.toLowerCase()}`);
836
850
  }
837
851
 
838
852
  private mergeUsageReportGroup(reports: UsageReport[]): UsageReport {
@@ -844,7 +858,7 @@ export class AuthStorage {
844
858
  });
845
859
  const base = sorted[0];
846
860
  const mergedLimits = [...base.limits];
847
- const limitIds = new Set(mergedLimits.map((limit) => limit.id));
861
+ const limitIds = new Set(mergedLimits.map(limit => limit.id));
848
862
  const mergedMetadata: Record<string, unknown> = { ...(base.metadata ?? {}) };
849
863
  let fetchedAt = base.fetchedAt;
850
864
 
@@ -897,7 +911,7 @@ export class AuthStorage {
897
911
  }
898
912
  }
899
913
 
900
- const deduped = groups.map((group) => this.mergeUsageReportGroup(group));
914
+ const deduped = groups.map(group => this.mergeUsageReportGroup(group));
901
915
  if (deduped.length !== reports.length) {
902
916
  this.usageLogger?.debug("Usage reports deduped", {
903
917
  before: reports.length,
@@ -920,7 +934,7 @@ export class AuthStorage {
920
934
 
921
935
  /** Returns true if usage indicates rate limit has been reached. */
922
936
  private isUsageLimitReached(report: UsageReport): boolean {
923
- return report.limits.some((limit) => this.isUsageLimitExhausted(limit));
937
+ return report.limits.some(limit => this.isUsageLimitExhausted(limit));
924
938
  }
925
939
 
926
940
  /** Extracts the earliest reset timestamp from exhausted windows (in ms). */
@@ -985,10 +999,7 @@ export class AuthStorage {
985
999
  if (!resolver || !cache) return null;
986
1000
 
987
1001
  const tasks: Array<Promise<UsageReport | null>> = [];
988
- const providers = new Set<string>([
989
- ...this.data.keys(),
990
- ...DEFAULT_USAGE_PROVIDERS.map((provider) => provider.id),
991
- ]);
1002
+ const providers = new Set<string>([...this.data.keys(), ...DEFAULT_USAGE_PROVIDERS.map(provider => provider.id)]);
992
1003
  this.usageLogger?.debug("Usage fetch requested", {
993
1004
  providers: Array.from(providers).sort(),
994
1005
  });
@@ -1033,7 +1044,7 @@ export class AuthStorage {
1033
1044
  now: this.usageNow,
1034
1045
  logger: this.usageLogger,
1035
1046
  })
1036
- .catch((error) => {
1047
+ .catch(error => {
1037
1048
  logger.debug("AuthStorage usage fetch failed", {
1038
1049
  provider,
1039
1050
  error: String(error),
@@ -1076,7 +1087,7 @@ export class AuthStorage {
1076
1087
  now: this.usageNow,
1077
1088
  logger: this.usageLogger,
1078
1089
  })
1079
- .catch((error) => {
1090
+ .catch(error => {
1080
1091
  logger.debug("AuthStorage usage fetch failed", {
1081
1092
  provider,
1082
1093
  error: String(error),
@@ -1092,7 +1103,7 @@ export class AuthStorage {
1092
1103
  const reports = results.filter((report): report is UsageReport => report !== null);
1093
1104
  const deduped = this.dedupeUsageReports(reports);
1094
1105
  this.usageLogger?.debug("Usage fetch resolved", {
1095
- reports: deduped.map((report) => {
1106
+ reports: deduped.map(report => {
1096
1107
  const accountLabel =
1097
1108
  this.getUsageReportMetadataValue(report, "email") ??
1098
1109
  this.getUsageReportMetadataValue(report, "accountId") ??
@@ -1149,7 +1160,7 @@ export class AuthStorage {
1149
1160
  entry.credential.type === sessionCredential.type && entry.index !== sessionCredential.index,
1150
1161
  );
1151
1162
 
1152
- return remainingCredentials.some((candidate) => !this.isCredentialBlocked(providerKey, candidate.index));
1163
+ return remainingCredentials.some(candidate => !this.isCredentialBlocked(providerKey, candidate.index));
1153
1164
  }
1154
1165
 
1155
1166
  /**
@@ -1270,7 +1281,7 @@ export class AuthStorage {
1270
1281
  error: String(error),
1271
1282
  });
1272
1283
  this.removeCredentialAt(provider, selection.index);
1273
- if (this.getCredentialsForProvider(provider).some((credential) => credential.type === "oauth")) {
1284
+ if (this.getCredentialsForProvider(provider).some(credential => credential.type === "oauth")) {
1274
1285
  return this.getApiKey(provider, sessionId, options);
1275
1286
  }
1276
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
  }