@oh-my-pi/pi-coding-agent 7.0.0 → 8.0.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 (501) hide show
  1. package/CHANGELOG.md +87 -0
  2. package/README.md +1 -1
  3. package/docs/hooks.md +2 -2
  4. package/docs/sdk.md +1 -1
  5. package/package.json +10 -10
  6. package/scripts/format-prompts.ts +143 -0
  7. package/scripts/generate-template.ts +1 -1
  8. package/src/cli/args.ts +3 -3
  9. package/src/cli/config-cli.ts +4 -4
  10. package/src/cli/file-processor.ts +3 -3
  11. package/src/cli/list-models.ts +2 -2
  12. package/src/cli/plugin-cli.ts +3 -3
  13. package/src/cli/session-picker.ts +2 -2
  14. package/src/cli/setup-cli.ts +2 -2
  15. package/src/cli/stats-cli.ts +1 -1
  16. package/src/cli/update-cli.ts +2 -2
  17. package/src/{core → config}/keybindings.ts +1 -1
  18. package/src/{core → config}/model-registry.ts +1 -1
  19. package/src/{core → config}/model-resolver.ts +3 -3
  20. package/src/{core → config}/prompt-templates.ts +2 -2
  21. package/src/{core → config}/settings-manager.ts +6 -6
  22. package/src/{core/cursor/exec-bridge.ts → cursor.ts} +4 -4
  23. package/src/discovery/agents-md.ts +4 -4
  24. package/src/discovery/builtin.ts +17 -17
  25. package/src/discovery/claude.ts +12 -12
  26. package/src/discovery/cline.ts +6 -6
  27. package/src/discovery/codex.ts +21 -21
  28. package/src/discovery/cursor.ts +9 -9
  29. package/src/discovery/gemini.ts +9 -9
  30. package/src/discovery/github.ts +6 -6
  31. package/src/discovery/helpers.ts +4 -4
  32. package/src/discovery/index.ts +16 -16
  33. package/src/discovery/mcp-json.ts +4 -4
  34. package/src/discovery/ssh.ts +4 -4
  35. package/src/discovery/vscode.ts +4 -4
  36. package/src/discovery/windsurf.ts +6 -6
  37. package/src/{core/tools/exa → exa}/company.ts +2 -3
  38. package/src/{core/tools/exa → exa}/index.ts +2 -2
  39. package/src/{core/tools/exa → exa}/linkedin.ts +2 -3
  40. package/src/{core/tools/exa → exa}/mcp-client.ts +2 -2
  41. package/src/{core/tools/exa → exa}/render.ts +3 -3
  42. package/src/{core/tools/exa → exa}/researcher.ts +1 -1
  43. package/src/{core/tools/exa → exa}/search.ts +2 -10
  44. package/src/{core/tools/exa → exa}/websets.ts +1 -1
  45. package/src/{core → exec}/bash-executor.ts +22 -6
  46. package/src/{core → export}/custom-share.ts +1 -1
  47. package/src/{core/export-html → export/html}/index.ts +3 -3
  48. package/src/{core → export}/ttsr.ts +2 -2
  49. package/src/{core → extensibility}/custom-commands/bundled/review/index.ts +4 -4
  50. package/src/{core → extensibility}/custom-commands/loader.ts +3 -3
  51. package/src/{core → extensibility}/custom-commands/types.ts +1 -1
  52. package/src/{core → extensibility}/custom-tools/loader.ts +9 -9
  53. package/src/{core → extensibility}/custom-tools/types.ts +6 -6
  54. package/src/{core → extensibility}/custom-tools/wrapper.ts +1 -1
  55. package/src/{core → extensibility}/extensions/loader.ts +8 -8
  56. package/src/{core → extensibility}/extensions/runner.ts +3 -3
  57. package/src/{core → extensibility}/extensions/types.ts +15 -15
  58. package/src/{core → extensibility}/extensions/wrapper.ts +1 -1
  59. package/src/{core → extensibility}/hooks/index.ts +1 -1
  60. package/src/{core → extensibility}/hooks/loader.ts +7 -7
  61. package/src/{core → extensibility}/hooks/runner.ts +4 -4
  62. package/src/{core → extensibility}/hooks/types.ts +9 -9
  63. package/src/{core → extensibility}/plugins/doctor.ts +1 -1
  64. package/src/{core → extensibility}/plugins/installer.ts +2 -3
  65. package/src/{core → extensibility}/plugins/paths.ts +1 -1
  66. package/src/{core → extensibility}/skills.ts +8 -48
  67. package/src/{core → extensibility}/slash-commands.ts +6 -6
  68. package/src/index.ts +127 -128
  69. package/src/internal-urls/agent-protocol.ts +126 -0
  70. package/src/internal-urls/artifact-protocol.ts +93 -0
  71. package/src/internal-urls/index.ts +28 -0
  72. package/src/internal-urls/json-query.ts +126 -0
  73. package/src/internal-urls/router.ts +69 -0
  74. package/src/internal-urls/rule-protocol.ts +56 -0
  75. package/src/internal-urls/skill-protocol.ts +112 -0
  76. package/src/internal-urls/types.ts +48 -0
  77. package/src/{core/python-executor.ts → ipy/executor.ts} +51 -11
  78. package/src/{core/python-gateway-coordinator.ts → ipy/gateway-coordinator.ts} +41 -325
  79. package/src/{core/python-kernel.ts → ipy/kernel.ts} +38 -10
  80. package/src/ipy/prelude.ts +3 -0
  81. package/src/{core/tools/lsp → lsp}/client.ts +7 -6
  82. package/src/{core/tools/lsp → lsp}/clients/biome-client.ts +1 -1
  83. package/src/{core/tools/lsp → lsp}/clients/index.ts +1 -1
  84. package/src/{core/tools/lsp → lsp}/clients/lsp-linter-client.ts +4 -4
  85. package/src/{core/tools/lsp → lsp}/config.ts +1 -1
  86. package/src/{core/tools/lsp → lsp}/index.ts +16 -15
  87. package/src/{core/tools/lsp → lsp}/render.ts +2 -2
  88. package/src/{core/tools/lsp → lsp}/types.ts +14 -16
  89. package/src/{core/tools/lsp → lsp}/utils.ts +1 -1
  90. package/src/main.ts +12 -12
  91. package/src/{core/mcp → mcp}/config.ts +8 -8
  92. package/src/{core/mcp → mcp}/loader.ts +5 -6
  93. package/src/{core/mcp → mcp}/manager.ts +2 -2
  94. package/src/{core/mcp → mcp}/tool-bridge.ts +35 -6
  95. package/src/{core/mcp → mcp}/tool-cache.ts +1 -1
  96. package/src/{core/mcp → mcp}/transports/http.ts +7 -1
  97. package/src/{core/mcp → mcp}/transports/stdio.ts +1 -1
  98. package/src/{core/mcp → mcp}/types.ts +1 -1
  99. package/src/migrations.ts +2 -2
  100. package/src/modes/{interactive/components → components}/armin.ts +1 -1
  101. package/src/modes/{interactive/components → components}/assistant-message.ts +1 -1
  102. package/src/modes/{interactive/components → components}/bash-execution.ts +37 -29
  103. package/src/modes/{interactive/components → components}/bordered-loader.ts +1 -1
  104. package/src/modes/{interactive/components → components}/branch-summary-message.ts +2 -2
  105. package/src/modes/{interactive/components → components}/compaction-summary-message.ts +2 -2
  106. package/src/modes/{interactive/components → components}/custom-message.ts +3 -3
  107. package/src/modes/{interactive/components → components}/diff.ts +1 -1
  108. package/src/modes/{interactive/components → components}/dynamic-border.ts +1 -1
  109. package/src/modes/{interactive/components → components}/extensions/extension-dashboard.ts +3 -3
  110. package/src/modes/{interactive/components → components}/extensions/extension-list.ts +2 -2
  111. package/src/modes/{interactive/components → components}/extensions/inspector-panel.ts +1 -1
  112. package/src/modes/{interactive/components → components}/extensions/state-manager.ts +11 -17
  113. package/src/modes/{interactive/components → components}/extensions/types.ts +1 -1
  114. package/src/modes/{interactive/components → components}/footer.ts +3 -3
  115. package/src/modes/{interactive/components → components}/history-search.ts +2 -2
  116. package/src/modes/{interactive/components → components}/hook-editor.ts +1 -1
  117. package/src/modes/{interactive/components → components}/hook-input.ts +1 -1
  118. package/src/modes/{interactive/components → components}/hook-message.ts +3 -3
  119. package/src/modes/{interactive/components → components}/hook-selector.ts +1 -1
  120. package/src/modes/{interactive/components → components}/keybinding-hints.ts +2 -2
  121. package/src/modes/{interactive/components → components}/login-dialog.ts +1 -1
  122. package/src/modes/{interactive/components → components}/model-selector.ts +5 -5
  123. package/src/modes/{interactive/components → components}/oauth-selector.ts +2 -2
  124. package/src/modes/{interactive/components → components}/plugin-settings.ts +3 -3
  125. package/src/modes/{interactive/components → components}/python-execution.ts +35 -24
  126. package/src/modes/{interactive/components → components}/queue-mode-selector.ts +1 -1
  127. package/src/modes/{interactive/components → components}/read-tool-group.ts +2 -2
  128. package/src/modes/{interactive/components → components}/session-selector.ts +3 -3
  129. package/src/modes/{interactive/components → components}/settings-defs.ts +2 -2
  130. package/src/modes/{interactive/components → components}/settings-selector.ts +2 -2
  131. package/src/modes/{interactive/components → components}/show-images-selector.ts +1 -1
  132. package/src/modes/{interactive/components → components}/status-line/segments.ts +2 -2
  133. package/src/modes/{interactive/components → components}/status-line/separators.ts +1 -1
  134. package/src/modes/{interactive/components → components}/status-line/types.ts +2 -2
  135. package/src/modes/{interactive/components → components}/status-line-segment-editor.ts +2 -2
  136. package/src/modes/{interactive/components → components}/status-line.ts +3 -3
  137. package/src/modes/{interactive/components → components}/theme-selector.ts +1 -1
  138. package/src/modes/{interactive/components → components}/thinking-selector.ts +1 -1
  139. package/src/modes/{interactive/components → components}/todo-display.ts +3 -4
  140. package/src/modes/{interactive/components → components}/todo-reminder.ts +2 -2
  141. package/src/modes/{interactive/components → components}/tool-execution.ts +8 -8
  142. package/src/modes/{interactive/components → components}/tree-selector.ts +3 -3
  143. package/src/modes/{interactive/components → components}/ttsr-notification.ts +2 -2
  144. package/src/modes/{interactive/components → components}/user-message-selector.ts +1 -1
  145. package/src/modes/{interactive/components → components}/user-message.ts +1 -1
  146. package/src/modes/{interactive/components → components}/welcome.ts +2 -2
  147. package/src/modes/{interactive/controllers → controllers}/command-controller.ts +32 -30
  148. package/src/modes/{interactive/controllers → controllers}/event-controller.ts +9 -9
  149. package/src/modes/{interactive/controllers → controllers}/extension-ui-controller.ts +8 -8
  150. package/src/modes/{interactive/controllers → controllers}/input-controller.ts +6 -6
  151. package/src/modes/{interactive/controllers → controllers}/selector-controller.ts +16 -16
  152. package/src/modes/index.ts +1 -1
  153. package/src/modes/{interactive/interactive-mode.ts → interactive-mode.ts} +14 -14
  154. package/src/modes/print-mode.ts +1 -1
  155. package/src/modes/rpc/rpc-client.ts +3 -3
  156. package/src/modes/rpc/rpc-mode.ts +3 -3
  157. package/src/modes/rpc/rpc-types.ts +3 -3
  158. package/src/modes/{interactive/theme → theme}/theme.ts +1 -1
  159. package/src/modes/{interactive/types.ts → types.ts} +8 -9
  160. package/src/modes/{interactive/utils → utils}/ui-helpers.ts +20 -27
  161. package/src/{core/tools/patch → patch}/applicator.ts +1 -1
  162. package/src/{core/tools/patch → patch}/diff.ts +1 -1
  163. package/src/{core/tools/patch → patch}/index.ts +31 -36
  164. package/src/{core/tools/patch → patch}/shared.ts +9 -6
  165. package/src/prompts/agents/explore.md +83 -46
  166. package/src/prompts/agents/init.md +9 -4
  167. package/src/prompts/agents/plan.md +8 -7
  168. package/src/prompts/agents/reviewer.md +36 -18
  169. package/src/prompts/agents/task.md +4 -4
  170. package/src/prompts/compaction/branch-summary-preamble.md +0 -1
  171. package/src/prompts/review-request.md +0 -1
  172. package/src/prompts/system/custom-system-prompt.md +2 -14
  173. package/src/prompts/system/file-operations.md +0 -2
  174. package/src/prompts/system/system-prompt.md +147 -138
  175. package/src/prompts/system/web-search.md +26 -0
  176. package/src/prompts/tools/ask.md +31 -24
  177. package/src/prompts/tools/bash.md +20 -17
  178. package/src/prompts/tools/calculator.md +9 -5
  179. package/src/prompts/tools/fetch.md +16 -0
  180. package/src/prompts/tools/find.md +15 -5
  181. package/src/prompts/tools/gemini-image.md +21 -6
  182. package/src/prompts/tools/grep.md +28 -12
  183. package/src/prompts/tools/lsp.md +35 -14
  184. package/src/prompts/tools/patch.md +39 -41
  185. package/src/prompts/tools/python.md +59 -76
  186. package/src/prompts/tools/read.md +23 -22
  187. package/src/prompts/tools/replace.md +19 -12
  188. package/src/prompts/tools/ssh.md +21 -28
  189. package/src/prompts/tools/task.md +54 -44
  190. package/src/prompts/tools/todo-write.md +52 -163
  191. package/src/prompts/tools/web-search.md +16 -9
  192. package/src/prompts/tools/write.md +13 -2
  193. package/src/{core/sdk.ts → sdk.ts} +65 -34
  194. package/src/{core → session}/agent-session.ts +45 -37
  195. package/src/{core → session}/agent-storage.ts +2 -2
  196. package/src/session/artifacts.ts +110 -0
  197. package/src/{core → session}/auth-storage.ts +1 -1
  198. package/src/{core → session}/compaction/branch-summarization.ts +5 -5
  199. package/src/{core → session}/compaction/compaction.ts +6 -6
  200. package/src/{core → session}/compaction/utils.ts +3 -3
  201. package/src/{core → session}/history-storage.ts +1 -1
  202. package/src/{core → session}/messages.ts +6 -8
  203. package/src/{core → session}/session-manager.ts +2 -2
  204. package/src/{core → session}/storage-migration.ts +2 -2
  205. package/src/session/streaming-output.ts +177 -0
  206. package/src/{core/ssh → ssh}/connection-manager.ts +1 -1
  207. package/src/{core/ssh → ssh}/ssh-executor.ts +19 -4
  208. package/src/{core/ssh → ssh}/sshfs-mount.ts +1 -1
  209. package/src/{core/system-prompt.ts → system-prompt.ts} +8 -37
  210. package/src/{core/tools/task → task}/agents.ts +8 -8
  211. package/src/{core/tools/task → task}/commands.ts +5 -6
  212. package/src/{core/tools/task → task}/discovery.ts +3 -3
  213. package/src/{core/tools/task → task}/executor.ts +34 -44
  214. package/src/{core/tools/task → task}/index.ts +206 -50
  215. package/src/{core/tools/task → task}/render.ts +80 -23
  216. package/src/{core/tools/task → task}/subprocess-tool-registry.ts +1 -1
  217. package/src/task/template.ts +47 -0
  218. package/src/{core/tools/task → task}/types.ts +19 -27
  219. package/src/{core/tools/task → task}/worker-protocol.ts +8 -4
  220. package/src/{core/tools/task → task}/worker.ts +34 -29
  221. package/src/task/worktree.ts +166 -0
  222. package/src/{core/tools → tools}/ask.ts +13 -21
  223. package/src/{core/tools → tools}/bash-interceptor.ts +1 -1
  224. package/src/{core/tools → tools}/bash.ts +61 -63
  225. package/src/{core/tools → tools}/calculator.ts +4 -4
  226. package/src/{core/tools → tools}/complete.ts +1 -1
  227. package/src/{core/tools → tools}/context.ts +2 -2
  228. package/src/{core/tools/web-fetch.ts → tools/fetch.ts} +97 -76
  229. package/src/{core/tools → tools}/find.ts +80 -104
  230. package/src/{core/tools → tools}/gemini-image.ts +420 -29
  231. package/src/{core/tools → tools}/grep.ts +155 -164
  232. package/src/{core/tools → tools}/index.ts +63 -56
  233. package/src/tools/list-limit.ts +40 -0
  234. package/src/{core/tools → tools}/ls.ts +44 -35
  235. package/src/{core/tools → tools}/notebook.ts +3 -3
  236. package/src/tools/output-meta.ts +443 -0
  237. package/src/tools/output-utils.ts +63 -0
  238. package/src/{core/tools → tools}/python.ts +105 -89
  239. package/src/tools/read.ts +882 -0
  240. package/src/{core/tools → tools}/render-utils.ts +1 -1
  241. package/src/{core/tools → tools}/renderers.ts +8 -10
  242. package/src/{core/tools → tools}/review.ts +2 -2
  243. package/src/{core/tools → tools}/ssh.ts +56 -59
  244. package/src/{core/tools → tools}/todo-write.ts +12 -23
  245. package/src/tools/tool-errors.ts +95 -0
  246. package/src/tools/tool-result.ts +92 -0
  247. package/src/{core/tools → tools}/truncate.ts +2 -2
  248. package/src/{core/tools → tools}/write.ts +15 -13
  249. package/src/utils/changelog.ts +1 -1
  250. package/src/{core → utils}/file-mentions.ts +4 -4
  251. package/src/utils/image-convert.ts +1 -1
  252. package/src/utils/image-resize.ts +1 -1
  253. package/src/utils/shell.ts +1 -1
  254. package/src/{core → utils}/title-generator.ts +4 -4
  255. package/src/utils/tools-manager.ts +1 -1
  256. package/src/{core/tools/web-scrapers → web/scrapers}/choosealicense.ts +1 -1
  257. package/src/{core/tools/web-scrapers → web/scrapers}/twitter.ts +3 -2
  258. package/src/{core/tools/web-scrapers → web/scrapers}/types.ts +4 -2
  259. package/src/{core/tools/web-scrapers → web/scrapers}/utils.ts +1 -1
  260. package/src/{core/tools/web-scrapers → web/scrapers}/youtube.ts +14 -13
  261. package/src/{core/tools/web-search → web/search}/auth.ts +4 -4
  262. package/src/{core/tools/web-search → web/search}/index.ts +22 -71
  263. package/src/{core/tools/web-search → web/search}/providers/anthropic.ts +7 -10
  264. package/src/{core/tools/web-search → web/search}/providers/exa.ts +2 -2
  265. package/src/{core/tools/web-search → web/search}/providers/perplexity.ts +4 -16
  266. package/src/{core/tools/web-search → web/search}/render.ts +3 -3
  267. package/scripts/migrate-sessions.sh +0 -93
  268. package/src/core/index.ts +0 -56
  269. package/src/core/python-prelude.ts +0 -3
  270. package/src/core/ssh-executor.ts +0 -5
  271. package/src/core/streaming-output.ts +0 -115
  272. package/src/core/tools/output.ts +0 -519
  273. package/src/core/tools/read.ts +0 -717
  274. package/src/core/tools/task/template.ts +0 -37
  275. package/src/prompts/tools/output.md +0 -47
  276. package/src/prompts/tools/web-fetch.md +0 -9
  277. /package/src/{core/tools/exa → exa}/types.ts +0 -0
  278. /package/src/{core → exec}/exec.ts +0 -0
  279. /package/src/{core/export-html → export/html}/template.css +0 -0
  280. /package/src/{core/export-html → export/html}/template.generated.ts +0 -0
  281. /package/src/{core/export-html → export/html}/template.html +0 -0
  282. /package/src/{core/export-html → export/html}/template.js +0 -0
  283. /package/src/{core/export-html → export/html}/template.macro.ts +0 -0
  284. /package/src/{core/export-html → export/html}/vendor/highlight.min.js +0 -0
  285. /package/src/{core/export-html → export/html}/vendor/marked.min.js +0 -0
  286. /package/src/{core → extensibility}/custom-commands/index.ts +0 -0
  287. /package/src/{core → extensibility}/custom-tools/index.ts +0 -0
  288. /package/src/{core → extensibility}/extensions/index.ts +0 -0
  289. /package/src/{core → extensibility}/hooks/tool-wrapper.ts +0 -0
  290. /package/src/{core → extensibility}/plugins/index.ts +0 -0
  291. /package/src/{core → extensibility}/plugins/loader.ts +0 -0
  292. /package/src/{core → extensibility}/plugins/manager.ts +0 -0
  293. /package/src/{core → extensibility}/plugins/parser.ts +0 -0
  294. /package/src/{core → extensibility}/plugins/types.ts +0 -0
  295. /package/src/{core/python-modules.ts → ipy/modules.ts} +0 -0
  296. /package/src/{core/python-prelude.py → ipy/prelude.py} +0 -0
  297. /package/src/{core/tools/lsp → lsp}/defaults.json +0 -0
  298. /package/src/{core/tools/lsp → lsp}/edits.ts +0 -0
  299. /package/src/{core/tools/lsp → lsp}/lspmux.ts +0 -0
  300. /package/src/{core/tools/lsp → lsp}/rust-analyzer.ts +0 -0
  301. /package/src/{core/mcp → mcp}/client.ts +0 -0
  302. /package/src/{core/mcp → mcp}/index.ts +0 -0
  303. /package/src/{core/mcp → mcp}/json-rpc.ts +0 -0
  304. /package/src/{core/mcp → mcp}/transports/index.ts +0 -0
  305. /package/src/modes/{interactive/components → components}/countdown-timer.ts +0 -0
  306. /package/src/modes/{interactive/components → components}/custom-editor.ts +0 -0
  307. /package/src/modes/{interactive/components → components}/extensions/index.ts +0 -0
  308. /package/src/modes/{interactive/components → components}/index.ts +0 -0
  309. /package/src/modes/{interactive/components → components}/status-line/index.ts +0 -0
  310. /package/src/modes/{interactive/components → components}/status-line/presets.ts +0 -0
  311. /package/src/modes/{interactive/components → components}/visual-truncate.ts +0 -0
  312. /package/src/modes/{interactive/theme → theme}/dark.json +0 -0
  313. /package/src/modes/{interactive/theme → theme}/defaults/alabaster.json +0 -0
  314. /package/src/modes/{interactive/theme → theme}/defaults/amethyst.json +0 -0
  315. /package/src/modes/{interactive/theme → theme}/defaults/anthracite.json +0 -0
  316. /package/src/modes/{interactive/theme → theme}/defaults/basalt.json +0 -0
  317. /package/src/modes/{interactive/theme → theme}/defaults/birch.json +0 -0
  318. /package/src/modes/{interactive/theme → theme}/defaults/dark-abyss.json +0 -0
  319. /package/src/modes/{interactive/theme → theme}/defaults/dark-arctic.json +0 -0
  320. /package/src/modes/{interactive/theme → theme}/defaults/dark-aurora.json +0 -0
  321. /package/src/modes/{interactive/theme → theme}/defaults/dark-catppuccin.json +0 -0
  322. /package/src/modes/{interactive/theme → theme}/defaults/dark-cavern.json +0 -0
  323. /package/src/modes/{interactive/theme → theme}/defaults/dark-copper.json +0 -0
  324. /package/src/modes/{interactive/theme → theme}/defaults/dark-cosmos.json +0 -0
  325. /package/src/modes/{interactive/theme → theme}/defaults/dark-cyberpunk.json +0 -0
  326. /package/src/modes/{interactive/theme → theme}/defaults/dark-dracula.json +0 -0
  327. /package/src/modes/{interactive/theme → theme}/defaults/dark-eclipse.json +0 -0
  328. /package/src/modes/{interactive/theme → theme}/defaults/dark-ember.json +0 -0
  329. /package/src/modes/{interactive/theme → theme}/defaults/dark-equinox.json +0 -0
  330. /package/src/modes/{interactive/theme → theme}/defaults/dark-forest.json +0 -0
  331. /package/src/modes/{interactive/theme → theme}/defaults/dark-github.json +0 -0
  332. /package/src/modes/{interactive/theme → theme}/defaults/dark-gruvbox.json +0 -0
  333. /package/src/modes/{interactive/theme → theme}/defaults/dark-lavender.json +0 -0
  334. /package/src/modes/{interactive/theme → theme}/defaults/dark-lunar.json +0 -0
  335. /package/src/modes/{interactive/theme → theme}/defaults/dark-midnight.json +0 -0
  336. /package/src/modes/{interactive/theme → theme}/defaults/dark-monochrome.json +0 -0
  337. /package/src/modes/{interactive/theme → theme}/defaults/dark-monokai.json +0 -0
  338. /package/src/modes/{interactive/theme → theme}/defaults/dark-nebula.json +0 -0
  339. /package/src/modes/{interactive/theme → theme}/defaults/dark-nord.json +0 -0
  340. /package/src/modes/{interactive/theme → theme}/defaults/dark-ocean.json +0 -0
  341. /package/src/modes/{interactive/theme → theme}/defaults/dark-one.json +0 -0
  342. /package/src/modes/{interactive/theme → theme}/defaults/dark-rainforest.json +0 -0
  343. /package/src/modes/{interactive/theme → theme}/defaults/dark-reef.json +0 -0
  344. /package/src/modes/{interactive/theme → theme}/defaults/dark-retro.json +0 -0
  345. /package/src/modes/{interactive/theme → theme}/defaults/dark-rose-pine.json +0 -0
  346. /package/src/modes/{interactive/theme → theme}/defaults/dark-sakura.json +0 -0
  347. /package/src/modes/{interactive/theme → theme}/defaults/dark-slate.json +0 -0
  348. /package/src/modes/{interactive/theme → theme}/defaults/dark-solarized.json +0 -0
  349. /package/src/modes/{interactive/theme → theme}/defaults/dark-solstice.json +0 -0
  350. /package/src/modes/{interactive/theme → theme}/defaults/dark-starfall.json +0 -0
  351. /package/src/modes/{interactive/theme → theme}/defaults/dark-sunset.json +0 -0
  352. /package/src/modes/{interactive/theme → theme}/defaults/dark-swamp.json +0 -0
  353. /package/src/modes/{interactive/theme → theme}/defaults/dark-synthwave.json +0 -0
  354. /package/src/modes/{interactive/theme → theme}/defaults/dark-taiga.json +0 -0
  355. /package/src/modes/{interactive/theme → theme}/defaults/dark-terminal.json +0 -0
  356. /package/src/modes/{interactive/theme → theme}/defaults/dark-tokyo-night.json +0 -0
  357. /package/src/modes/{interactive/theme → theme}/defaults/dark-tundra.json +0 -0
  358. /package/src/modes/{interactive/theme → theme}/defaults/dark-twilight.json +0 -0
  359. /package/src/modes/{interactive/theme → theme}/defaults/dark-volcanic.json +0 -0
  360. /package/src/modes/{interactive/theme → theme}/defaults/graphite.json +0 -0
  361. /package/src/modes/{interactive/theme → theme}/defaults/index.ts +0 -0
  362. /package/src/modes/{interactive/theme → theme}/defaults/light-arctic.json +0 -0
  363. /package/src/modes/{interactive/theme → theme}/defaults/light-aurora-day.json +0 -0
  364. /package/src/modes/{interactive/theme → theme}/defaults/light-canyon.json +0 -0
  365. /package/src/modes/{interactive/theme → theme}/defaults/light-catppuccin.json +0 -0
  366. /package/src/modes/{interactive/theme → theme}/defaults/light-cirrus.json +0 -0
  367. /package/src/modes/{interactive/theme → theme}/defaults/light-coral.json +0 -0
  368. /package/src/modes/{interactive/theme → theme}/defaults/light-cyberpunk.json +0 -0
  369. /package/src/modes/{interactive/theme → theme}/defaults/light-dawn.json +0 -0
  370. /package/src/modes/{interactive/theme → theme}/defaults/light-dunes.json +0 -0
  371. /package/src/modes/{interactive/theme → theme}/defaults/light-eucalyptus.json +0 -0
  372. /package/src/modes/{interactive/theme → theme}/defaults/light-forest.json +0 -0
  373. /package/src/modes/{interactive/theme → theme}/defaults/light-frost.json +0 -0
  374. /package/src/modes/{interactive/theme → theme}/defaults/light-github.json +0 -0
  375. /package/src/modes/{interactive/theme → theme}/defaults/light-glacier.json +0 -0
  376. /package/src/modes/{interactive/theme → theme}/defaults/light-gruvbox.json +0 -0
  377. /package/src/modes/{interactive/theme → theme}/defaults/light-haze.json +0 -0
  378. /package/src/modes/{interactive/theme → theme}/defaults/light-honeycomb.json +0 -0
  379. /package/src/modes/{interactive/theme → theme}/defaults/light-lagoon.json +0 -0
  380. /package/src/modes/{interactive/theme → theme}/defaults/light-lavender.json +0 -0
  381. /package/src/modes/{interactive/theme → theme}/defaults/light-meadow.json +0 -0
  382. /package/src/modes/{interactive/theme → theme}/defaults/light-mint.json +0 -0
  383. /package/src/modes/{interactive/theme → theme}/defaults/light-monochrome.json +0 -0
  384. /package/src/modes/{interactive/theme → theme}/defaults/light-ocean.json +0 -0
  385. /package/src/modes/{interactive/theme → theme}/defaults/light-one.json +0 -0
  386. /package/src/modes/{interactive/theme → theme}/defaults/light-opal.json +0 -0
  387. /package/src/modes/{interactive/theme → theme}/defaults/light-orchard.json +0 -0
  388. /package/src/modes/{interactive/theme → theme}/defaults/light-paper.json +0 -0
  389. /package/src/modes/{interactive/theme → theme}/defaults/light-prism.json +0 -0
  390. /package/src/modes/{interactive/theme → theme}/defaults/light-retro.json +0 -0
  391. /package/src/modes/{interactive/theme → theme}/defaults/light-sand.json +0 -0
  392. /package/src/modes/{interactive/theme → theme}/defaults/light-savanna.json +0 -0
  393. /package/src/modes/{interactive/theme → theme}/defaults/light-solarized.json +0 -0
  394. /package/src/modes/{interactive/theme → theme}/defaults/light-soleil.json +0 -0
  395. /package/src/modes/{interactive/theme → theme}/defaults/light-sunset.json +0 -0
  396. /package/src/modes/{interactive/theme → theme}/defaults/light-synthwave.json +0 -0
  397. /package/src/modes/{interactive/theme → theme}/defaults/light-tokyo-night.json +0 -0
  398. /package/src/modes/{interactive/theme → theme}/defaults/light-wetland.json +0 -0
  399. /package/src/modes/{interactive/theme → theme}/defaults/light-zenith.json +0 -0
  400. /package/src/modes/{interactive/theme → theme}/defaults/limestone.json +0 -0
  401. /package/src/modes/{interactive/theme → theme}/defaults/mahogany.json +0 -0
  402. /package/src/modes/{interactive/theme → theme}/defaults/marble.json +0 -0
  403. /package/src/modes/{interactive/theme → theme}/defaults/obsidian.json +0 -0
  404. /package/src/modes/{interactive/theme → theme}/defaults/onyx.json +0 -0
  405. /package/src/modes/{interactive/theme → theme}/defaults/pearl.json +0 -0
  406. /package/src/modes/{interactive/theme → theme}/defaults/porcelain.json +0 -0
  407. /package/src/modes/{interactive/theme → theme}/defaults/quartz.json +0 -0
  408. /package/src/modes/{interactive/theme → theme}/defaults/sandstone.json +0 -0
  409. /package/src/modes/{interactive/theme → theme}/defaults/titanium.json +0 -0
  410. /package/src/modes/{interactive/theme → theme}/light.json +0 -0
  411. /package/src/modes/{interactive/theme → theme}/theme-schema.json +0 -0
  412. /package/src/{core/tools/patch → patch}/fuzzy.ts +0 -0
  413. /package/src/{core/tools/patch → patch}/normalize.ts +0 -0
  414. /package/src/{core/tools/patch → patch}/normative.ts +0 -0
  415. /package/src/{core/tools/patch → patch}/parser.ts +0 -0
  416. /package/src/{core/tools/patch → patch}/types.ts +0 -0
  417. /package/src/{core → session}/compaction/index.ts +0 -0
  418. /package/src/{core → session}/session-storage.ts +0 -0
  419. /package/src/{core/tools/task → task}/name-generator.ts +0 -0
  420. /package/src/{core/tools/task → task}/omp-command.ts +0 -0
  421. /package/src/{core/tools/task → task}/parallel.ts +0 -0
  422. /package/src/{core/tools → tools}/jtd-to-json-schema.ts +0 -0
  423. /package/src/{core/tools → tools}/path-utils.ts +0 -0
  424. /package/src/{core → utils}/event-bus.ts +0 -0
  425. /package/src/{core → utils}/frontmatter.ts +0 -0
  426. /package/src/{core → utils}/terminal-notify.ts +0 -0
  427. /package/src/{core → utils}/timings.ts +0 -0
  428. /package/src/{core → utils}/utils.ts +0 -0
  429. /package/src/{core/tools/web-scrapers → web/scrapers}/artifacthub.ts +0 -0
  430. /package/src/{core/tools/web-scrapers → web/scrapers}/arxiv.ts +0 -0
  431. /package/src/{core/tools/web-scrapers → web/scrapers}/aur.ts +0 -0
  432. /package/src/{core/tools/web-scrapers → web/scrapers}/biorxiv.ts +0 -0
  433. /package/src/{core/tools/web-scrapers → web/scrapers}/bluesky.ts +0 -0
  434. /package/src/{core/tools/web-scrapers → web/scrapers}/brew.ts +0 -0
  435. /package/src/{core/tools/web-scrapers → web/scrapers}/cheatsh.ts +0 -0
  436. /package/src/{core/tools/web-scrapers → web/scrapers}/chocolatey.ts +0 -0
  437. /package/src/{core/tools/web-scrapers → web/scrapers}/cisa-kev.ts +0 -0
  438. /package/src/{core/tools/web-scrapers → web/scrapers}/clojars.ts +0 -0
  439. /package/src/{core/tools/web-scrapers → web/scrapers}/coingecko.ts +0 -0
  440. /package/src/{core/tools/web-scrapers → web/scrapers}/crates-io.ts +0 -0
  441. /package/src/{core/tools/web-scrapers → web/scrapers}/crossref.ts +0 -0
  442. /package/src/{core/tools/web-scrapers → web/scrapers}/devto.ts +0 -0
  443. /package/src/{core/tools/web-scrapers → web/scrapers}/discogs.ts +0 -0
  444. /package/src/{core/tools/web-scrapers → web/scrapers}/discourse.ts +0 -0
  445. /package/src/{core/tools/web-scrapers → web/scrapers}/dockerhub.ts +0 -0
  446. /package/src/{core/tools/web-scrapers → web/scrapers}/fdroid.ts +0 -0
  447. /package/src/{core/tools/web-scrapers → web/scrapers}/firefox-addons.ts +0 -0
  448. /package/src/{core/tools/web-scrapers → web/scrapers}/flathub.ts +0 -0
  449. /package/src/{core/tools/web-scrapers → web/scrapers}/github-gist.ts +0 -0
  450. /package/src/{core/tools/web-scrapers → web/scrapers}/github.ts +0 -0
  451. /package/src/{core/tools/web-scrapers → web/scrapers}/gitlab.ts +0 -0
  452. /package/src/{core/tools/web-scrapers → web/scrapers}/go-pkg.ts +0 -0
  453. /package/src/{core/tools/web-scrapers → web/scrapers}/hackage.ts +0 -0
  454. /package/src/{core/tools/web-scrapers → web/scrapers}/hackernews.ts +0 -0
  455. /package/src/{core/tools/web-scrapers → web/scrapers}/hex.ts +0 -0
  456. /package/src/{core/tools/web-scrapers → web/scrapers}/huggingface.ts +0 -0
  457. /package/src/{core/tools/web-scrapers → web/scrapers}/iacr.ts +0 -0
  458. /package/src/{core/tools/web-scrapers → web/scrapers}/index.ts +0 -0
  459. /package/src/{core/tools/web-scrapers → web/scrapers}/jetbrains-marketplace.ts +0 -0
  460. /package/src/{core/tools/web-scrapers → web/scrapers}/lemmy.ts +0 -0
  461. /package/src/{core/tools/web-scrapers → web/scrapers}/lobsters.ts +0 -0
  462. /package/src/{core/tools/web-scrapers → web/scrapers}/mastodon.ts +0 -0
  463. /package/src/{core/tools/web-scrapers → web/scrapers}/maven.ts +0 -0
  464. /package/src/{core/tools/web-scrapers → web/scrapers}/mdn.ts +0 -0
  465. /package/src/{core/tools/web-scrapers → web/scrapers}/metacpan.ts +0 -0
  466. /package/src/{core/tools/web-scrapers → web/scrapers}/musicbrainz.ts +0 -0
  467. /package/src/{core/tools/web-scrapers → web/scrapers}/npm.ts +0 -0
  468. /package/src/{core/tools/web-scrapers → web/scrapers}/nuget.ts +0 -0
  469. /package/src/{core/tools/web-scrapers → web/scrapers}/nvd.ts +0 -0
  470. /package/src/{core/tools/web-scrapers → web/scrapers}/ollama.ts +0 -0
  471. /package/src/{core/tools/web-scrapers → web/scrapers}/open-vsx.ts +0 -0
  472. /package/src/{core/tools/web-scrapers → web/scrapers}/opencorporates.ts +0 -0
  473. /package/src/{core/tools/web-scrapers → web/scrapers}/openlibrary.ts +0 -0
  474. /package/src/{core/tools/web-scrapers → web/scrapers}/orcid.ts +0 -0
  475. /package/src/{core/tools/web-scrapers → web/scrapers}/osv.ts +0 -0
  476. /package/src/{core/tools/web-scrapers → web/scrapers}/packagist.ts +0 -0
  477. /package/src/{core/tools/web-scrapers → web/scrapers}/pub-dev.ts +0 -0
  478. /package/src/{core/tools/web-scrapers → web/scrapers}/pubmed.ts +0 -0
  479. /package/src/{core/tools/web-scrapers → web/scrapers}/pypi.ts +0 -0
  480. /package/src/{core/tools/web-scrapers → web/scrapers}/rawg.ts +0 -0
  481. /package/src/{core/tools/web-scrapers → web/scrapers}/readthedocs.ts +0 -0
  482. /package/src/{core/tools/web-scrapers → web/scrapers}/reddit.ts +0 -0
  483. /package/src/{core/tools/web-scrapers → web/scrapers}/repology.ts +0 -0
  484. /package/src/{core/tools/web-scrapers → web/scrapers}/rfc.ts +0 -0
  485. /package/src/{core/tools/web-scrapers → web/scrapers}/rubygems.ts +0 -0
  486. /package/src/{core/tools/web-scrapers → web/scrapers}/searchcode.ts +0 -0
  487. /package/src/{core/tools/web-scrapers → web/scrapers}/sec-edgar.ts +0 -0
  488. /package/src/{core/tools/web-scrapers → web/scrapers}/semantic-scholar.ts +0 -0
  489. /package/src/{core/tools/web-scrapers → web/scrapers}/snapcraft.ts +0 -0
  490. /package/src/{core/tools/web-scrapers → web/scrapers}/sourcegraph.ts +0 -0
  491. /package/src/{core/tools/web-scrapers → web/scrapers}/spdx.ts +0 -0
  492. /package/src/{core/tools/web-scrapers → web/scrapers}/spotify.ts +0 -0
  493. /package/src/{core/tools/web-scrapers → web/scrapers}/stackoverflow.ts +0 -0
  494. /package/src/{core/tools/web-scrapers → web/scrapers}/terraform.ts +0 -0
  495. /package/src/{core/tools/web-scrapers → web/scrapers}/tldr.ts +0 -0
  496. /package/src/{core/tools/web-scrapers → web/scrapers}/vimeo.ts +0 -0
  497. /package/src/{core/tools/web-scrapers → web/scrapers}/vscode-marketplace.ts +0 -0
  498. /package/src/{core/tools/web-scrapers → web/scrapers}/w3c.ts +0 -0
  499. /package/src/{core/tools/web-scrapers → web/scrapers}/wikidata.ts +0 -0
  500. /package/src/{core/tools/web-scrapers → web/scrapers}/wikipedia.ts +0 -0
  501. /package/src/{core/tools/web-search → web/search}/types.ts +0 -0
@@ -1,5 +1,5 @@
1
1
  import type { ImageContent } from "@oh-my-pi/pi-ai";
2
- import * as photon from "../vendor/photon";
2
+ import * as photon from "$c/vendor/photon";
3
3
 
4
4
  export interface ImageResizeOptions {
5
5
  maxWidth?: number; // Default: 2000
@@ -1,7 +1,7 @@
1
1
  import { constants } from "node:fs";
2
2
  import { access } from "node:fs/promises";
3
3
  import { $ } from "bun";
4
- import { SettingsManager } from "../core/settings-manager";
4
+ import { SettingsManager } from "$c/config/settings-manager";
5
5
 
6
6
  export interface ShellConfig {
7
7
  shell: string;
@@ -5,10 +5,10 @@
5
5
  import type { Api, Model } from "@oh-my-pi/pi-ai";
6
6
  import { completeSimple } from "@oh-my-pi/pi-ai";
7
7
  import { logger } from "@oh-my-pi/pi-utils";
8
- import titleSystemPrompt from "../prompts/system/title-system.md" with { type: "text" };
9
- import type { ModelRegistry } from "./model-registry";
10
- import { parseModelString, SMOL_MODEL_PRIORITY } from "./model-resolver";
11
- import { renderPromptTemplate } from "./prompt-templates";
8
+ import type { ModelRegistry } from "$c/config/model-registry";
9
+ import { parseModelString, SMOL_MODEL_PRIORITY } from "$c/config/model-resolver";
10
+ import { renderPromptTemplate } from "$c/config/prompt-templates";
11
+ import titleSystemPrompt from "$c/prompts/system/title-system.md" with { type: "text" };
12
12
 
13
13
  const TITLE_SYSTEM_PROMPT = renderPromptTemplate(titleSystemPrompt);
14
14
 
@@ -3,7 +3,7 @@ import { arch, platform } from "node:os";
3
3
  import { join } from "node:path";
4
4
  import { createTempDir, logger } from "@oh-my-pi/pi-utils";
5
5
  import { $ } from "bun";
6
- import { APP_NAME, getBinDir } from "../config";
6
+ import { APP_NAME, getBinDir } from "$c/config";
7
7
 
8
8
  const TOOLS_DIR = getBinDir();
9
9
 
@@ -1,4 +1,4 @@
1
- import { parseFrontmatter } from "../../../core/frontmatter";
1
+ import { parseFrontmatter } from "$c/utils/frontmatter";
2
2
  import type { RenderResult, SpecialHandler } from "./types";
3
3
  import { finalizeOutput, loadPage } from "./types";
4
4
 
@@ -1,4 +1,5 @@
1
1
  import { parse as parseHtml } from "node-html-parser";
2
+ import { ToolAbortError } from "$c/tools/tool-errors";
2
3
  import type { RenderResult, SpecialHandler } from "./types";
3
4
  import { finalizeOutput, loadPage } from "./types";
4
5
 
@@ -73,12 +74,12 @@ export const handleTwitter: SpecialHandler = async (
73
74
  }
74
75
  } catch {
75
76
  if (signal?.aborted) {
76
- return null;
77
+ throw new ToolAbortError();
77
78
  }
78
79
  }
79
80
 
80
81
  if (signal?.aborted) {
81
- return null;
82
+ throw new ToolAbortError();
82
83
  }
83
84
 
84
85
  // X.com blocks all bots - return a helpful error instead of falling through
@@ -2,6 +2,8 @@
2
2
  * Shared types and utilities for web-fetch handlers
3
3
  */
4
4
 
5
+ import { ToolAbortError } from "$c/tools/tool-errors";
6
+
5
7
  export interface RenderResult {
6
8
  url: string;
7
9
  finalUrl: string;
@@ -109,7 +111,7 @@ export async function loadPage(url: string, options: LoadPageOptions = {}): Prom
109
111
 
110
112
  for (let attempt = 0; attempt < USER_AGENTS.length; attempt++) {
111
113
  if (signal?.aborted) {
112
- return { content: "", contentType: "", finalUrl: url, ok: false };
114
+ throw new ToolAbortError();
113
115
  }
114
116
 
115
117
  const userAgent = USER_AGENTS[attempt];
@@ -170,7 +172,7 @@ export async function loadPage(url: string, options: LoadPageOptions = {}): Prom
170
172
  return { content, contentType, finalUrl, ok: true, status: response.status };
171
173
  } catch {
172
174
  if (signal?.aborted) {
173
- return { content: "", contentType: "", finalUrl: url, ok: false };
175
+ throw new ToolAbortError();
174
176
  }
175
177
  if (attempt === USER_AGENTS.length - 1) {
176
178
  return { content: "", contentType: "", finalUrl: url, ok: false };
@@ -3,7 +3,7 @@ import { tmpdir } from "node:os";
3
3
  import * as path from "node:path";
4
4
  import { ptree } from "@oh-my-pi/pi-utils";
5
5
  import { nanoid } from "nanoid";
6
- import { ensureTool } from "../../../utils/tools-manager";
6
+ import { ensureTool } from "$c/utils/tools-manager";
7
7
  import { createRequestSignal } from "./types";
8
8
 
9
9
  const MAX_BYTES = 50 * 1024 * 1024; // 50MB for binary files
@@ -3,7 +3,8 @@ import { tmpdir } from "node:os";
3
3
  import path from "node:path";
4
4
  import { cspawn } from "@oh-my-pi/pi-utils";
5
5
  import { nanoid } from "nanoid";
6
- import { ensureTool } from "../../../utils/tools-manager";
6
+ import { throwIfAborted } from "$c/tools/tool-errors";
7
+ import { ensureTool } from "$c/utils/tools-manager";
7
8
  import type { RenderResult, SpecialHandler } from "./types";
8
9
  import { finalizeOutput } from "./types";
9
10
 
@@ -139,13 +140,13 @@ export const handleYouTube: SpecialHandler = async (
139
140
  timeout: number,
140
141
  signal?: AbortSignal,
141
142
  ): Promise<RenderResult | null> => {
142
- signal?.throwIfAborted();
143
+ throwIfAborted(signal);
143
144
  const yt = parseYouTubeUrl(url);
144
145
  if (!yt) return null;
145
146
 
146
147
  // Ensure yt-dlp is available (auto-download if missing)
147
148
  const ytdlp = await ensureTool("yt-dlp", true);
148
- signal?.throwIfAborted();
149
+ throwIfAborted(signal);
149
150
  if (!ytdlp) {
150
151
  return {
151
152
  url,
@@ -164,7 +165,7 @@ export const handleYouTube: SpecialHandler = async (
164
165
  const videoUrl = `https://www.youtube.com/watch?v=${yt.videoId}`;
165
166
 
166
167
  // Fetch video metadata
167
- signal?.throwIfAborted();
168
+ throwIfAborted(signal);
168
169
  const metaResult = await exec(
169
170
  ytdlp,
170
171
  ["--dump-json", "--no-warnings", "--no-playlist", "--skip-download", videoUrl],
@@ -173,7 +174,7 @@ export const handleYouTube: SpecialHandler = async (
173
174
  signal,
174
175
  },
175
176
  );
176
- signal?.throwIfAborted();
177
+ throwIfAborted(signal);
177
178
 
178
179
  let title = "YouTube Video";
179
180
  let channel = "";
@@ -213,7 +214,7 @@ export const handleYouTube: SpecialHandler = async (
213
214
  let transcriptSource = "";
214
215
 
215
216
  // First, list available subtitles
216
- signal?.throwIfAborted();
217
+ throwIfAborted(signal);
217
218
  const listResult = await exec(
218
219
  ytdlp,
219
220
  ["--list-subs", "--no-warnings", "--no-playlist", "--skip-download", videoUrl],
@@ -222,7 +223,7 @@ export const handleYouTube: SpecialHandler = async (
222
223
  signal,
223
224
  },
224
225
  );
225
- signal?.throwIfAborted();
226
+ throwIfAborted(signal);
226
227
 
227
228
  const hasManualSubs = listResult.stdout.includes("[info] Available subtitles");
228
229
  const hasAutoSubs = listResult.stdout.includes("[info] Available automatic captions");
@@ -234,7 +235,7 @@ export const handleYouTube: SpecialHandler = async (
234
235
  try {
235
236
  // Try manual subtitles first (English preferred)
236
237
  if (hasManualSubs) {
237
- signal?.throwIfAborted();
238
+ throwIfAborted(signal);
238
239
  const subResult = await exec(
239
240
  ytdlp,
240
241
  [
@@ -255,10 +256,10 @@ export const handleYouTube: SpecialHandler = async (
255
256
 
256
257
  if (subResult.ok) {
257
258
  // Find the downloaded subtitle file using glob
258
- signal?.throwIfAborted();
259
+ throwIfAborted(signal);
259
260
  const subFiles = await Array.fromAsync(new Bun.Glob(`${tmpBase}*.vtt`).scan({ absolute: true }));
260
261
  if (subFiles.length > 0) {
261
- signal?.throwIfAborted();
262
+ throwIfAborted(signal);
262
263
  const vttContent = await Bun.file(subFiles[0]).text();
263
264
  transcript = cleanVttToText(vttContent);
264
265
  transcriptSource = "manual";
@@ -269,7 +270,7 @@ export const handleYouTube: SpecialHandler = async (
269
270
 
270
271
  // Fall back to auto-generated captions
271
272
  if (!transcript && hasAutoSubs) {
272
- signal?.throwIfAborted();
273
+ throwIfAborted(signal);
273
274
  const autoResult = await exec(
274
275
  ytdlp,
275
276
  [
@@ -289,10 +290,10 @@ export const handleYouTube: SpecialHandler = async (
289
290
  );
290
291
 
291
292
  if (autoResult.ok) {
292
- signal?.throwIfAborted();
293
+ throwIfAborted(signal);
293
294
  const subFiles = await Array.fromAsync(new Bun.Glob(`${tmpBase}*.vtt`).scan({ absolute: true }));
294
295
  if (subFiles.length > 0) {
295
- signal?.throwIfAborted();
296
+ throwIfAborted(signal);
296
297
  const vttContent = await Bun.file(subFiles[0]).text();
297
298
  transcript = cleanVttToText(vttContent);
298
299
  transcriptSource = "auto-generated";
@@ -12,10 +12,10 @@ import * as os from "node:os";
12
12
  import * as path from "node:path";
13
13
  import { buildAnthropicHeaders as buildProviderAnthropicHeaders } from "@oh-my-pi/pi-ai";
14
14
  import { logger } from "@oh-my-pi/pi-utils";
15
- import { getAgentDbPath, getConfigDirPaths } from "../../../config";
16
- import { AgentStorage } from "../../agent-storage";
17
- import type { AuthCredential, AuthCredentialEntry, AuthStorageData } from "../../auth-storage";
18
- import { migrateJsonStorage } from "../../storage-migration";
15
+ import { getAgentDbPath, getConfigDirPaths } from "$c/config";
16
+ import { AgentStorage } from "$c/session/agent-storage";
17
+ import type { AuthCredential, AuthCredentialEntry, AuthStorageData } from "$c/session/auth-storage";
18
+ import { migrateJsonStorage } from "$c/session/storage-migration";
19
19
  import type { AnthropicAuthConfig, AnthropicOAuthCredential, ModelsJson } from "./types";
20
20
 
21
21
  const DEFAULT_BASE_URL = "https://api.anthropic.com";
@@ -15,15 +15,16 @@
15
15
  import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
16
16
  import { StringEnum } from "@oh-my-pi/pi-ai";
17
17
  import { Type } from "@sinclair/typebox";
18
- import type { Theme } from "../../../modes/interactive/theme/theme";
19
- import webSearchDescription from "../../../prompts/tools/web-search.md" with { type: "text" };
20
- import type { CustomTool, CustomToolContext, RenderResultOptions } from "../../custom-tools/types";
21
- import { renderPromptTemplate } from "../../prompt-templates";
22
- import { callExaTool, findApiKey as findExaKey, formatSearchResults, isSearchResponse } from "../exa/mcp-client";
23
- import { renderExaCall, renderExaResult } from "../exa/render";
24
- import type { ExaRenderDetails } from "../exa/types";
25
- import type { ToolSession } from "../index";
26
- import { formatAge } from "../render-utils";
18
+ import { renderPromptTemplate } from "$c/config/prompt-templates";
19
+ import { callExaTool, findApiKey as findExaKey, formatSearchResults, isSearchResponse } from "$c/exa/mcp-client";
20
+ import { renderExaCall, renderExaResult } from "$c/exa/render";
21
+ import type { ExaRenderDetails } from "$c/exa/types";
22
+ import type { CustomTool, CustomToolContext, RenderResultOptions } from "$c/extensibility/custom-tools/types";
23
+ import type { Theme } from "$c/modes/theme/theme";
24
+ import webSearchSystemPrompt from "$c/prompts/system/web-search.md" with { type: "text" };
25
+ import webSearchDescription from "$c/prompts/tools/web-search.md" with { type: "text" };
26
+ import type { ToolSession } from "$c/tools/index";
27
+ import { formatAge } from "$c/tools/render-utils";
27
28
  import { findAnthropicAuth } from "./auth";
28
29
  import { searchAnthropic } from "./providers/anthropic";
29
30
  import { searchExa } from "./providers/exa";
@@ -34,70 +35,25 @@ import { WebSearchProviderError } from "./types";
34
35
 
35
36
  /** Web search parameters schema */
36
37
  export const webSearchSchema = Type.Object({
37
- // Common
38
38
  query: Type.String({ description: "Search query" }),
39
39
  provider: Type.Optional(
40
40
  StringEnum(["auto", "exa", "anthropic", "perplexity"], {
41
- description: "Search provider (auto-detected if omitted or set to auto)",
41
+ description: "Search provider (default: auto)",
42
42
  }),
43
43
  ),
44
- num_results: Type.Optional(Type.Number({ description: "Maximum number of results to return" })),
45
-
46
- // Common (Anthropic & Perplexity)
47
- system_prompt: Type.Optional(
48
- Type.String({
49
- description: "System prompt to guide response style",
50
- }),
51
- ),
52
- max_tokens: Type.Optional(
53
- Type.Number({
54
- description: "Maximum tokens in response, 1-16384, default 4096 (Anthropic only)",
55
- minimum: 1,
56
- maximum: 16384,
57
- }),
58
- ),
59
-
60
- // Perplexity-specific
61
- model: Type.Optional(
62
- StringEnum(["sonar", "sonar-pro"], {
63
- description: "Perplexity model - sonar (fast) or sonar-pro (comprehensive research)",
64
- }),
65
- ),
66
- search_recency_filter: Type.Optional(
44
+ recency: Type.Optional(
67
45
  StringEnum(["day", "week", "month", "year"], {
68
- description: "Filter results by recency (Perplexity only)",
69
- }),
70
- ),
71
- search_domain_filter: Type.Optional(
72
- Type.Array(Type.String(), {
73
- description: "Domain filter - include domains, prefix with - to exclude (Perplexity only)",
74
- }),
75
- ),
76
- search_context_size: Type.Optional(
77
- StringEnum(["low", "medium", "high"], {
78
- description: "Context size for cost control (Perplexity only)",
79
- }),
80
- ),
81
- return_related_questions: Type.Optional(
82
- Type.Boolean({
83
- description: "Include follow-up question suggestions, default true (Perplexity only)",
46
+ description: "Recency filter (Perplexity)",
84
47
  }),
85
48
  ),
49
+ limit: Type.Optional(Type.Number({ description: "Max results to return" })),
86
50
  });
87
51
 
88
52
  export type WebSearchParams = {
89
53
  query: string;
90
54
  provider?: "auto" | "exa" | "anthropic" | "perplexity";
91
- num_results?: number;
92
- // Anthropic
93
- system_prompt?: string;
94
- max_tokens?: number;
95
- // Perplexity
96
- model?: "sonar" | "sonar-pro";
97
- search_recency_filter?: "day" | "week" | "month" | "year";
98
- search_domain_filter?: string[];
99
- search_context_size?: "low" | "medium" | "high";
100
- return_related_questions?: boolean;
55
+ recency?: "day" | "week" | "month" | "year";
56
+ limit?: number;
101
57
  };
102
58
 
103
59
  /** Preferred provider set via settings (default: auto) */
@@ -284,25 +240,20 @@ async function executeWebSearch(
284
240
  if (provider === "exa") {
285
241
  response = await searchExa({
286
242
  query: params.query,
287
- num_results: params.num_results,
243
+ num_results: params.limit,
288
244
  });
289
245
  } else if (provider === "anthropic") {
290
246
  response = await searchAnthropic({
291
247
  query: params.query,
292
- system_prompt: params.system_prompt,
293
- max_tokens: params.max_tokens,
294
- num_results: params.num_results,
248
+ system_prompt: webSearchSystemPrompt,
249
+ num_results: params.limit,
295
250
  });
296
251
  } else {
297
252
  response = await searchPerplexity({
298
253
  query: params.query,
299
- model: params.model,
300
- system_prompt: params.system_prompt,
301
- search_recency_filter: params.search_recency_filter,
302
- search_domain_filter: params.search_domain_filter,
303
- search_context_size: params.search_context_size,
304
- return_related_questions: params.return_related_questions,
305
- num_results: params.num_results,
254
+ system_prompt: webSearchSystemPrompt,
255
+ search_recency_filter: params.recency,
256
+ num_results: params.limit,
306
257
  });
307
258
  }
308
259
 
@@ -6,7 +6,7 @@
6
6
  */
7
7
 
8
8
  import { applyClaudeToolPrefix, buildAnthropicSystemBlocks, stripClaudeToolPrefix } from "@oh-my-pi/pi-ai";
9
- import { buildAnthropicHeaders, buildAnthropicUrl, findAnthropicAuth, getEnv } from "../auth";
9
+ import { buildAnthropicHeaders, buildAnthropicUrl, findAnthropicAuth, getEnv } from "$c/web/search/auth";
10
10
  import type {
11
11
  AnthropicApiResponse,
12
12
  AnthropicAuthConfig,
@@ -14,8 +14,8 @@ import type {
14
14
  WebSearchCitation,
15
15
  WebSearchResponse,
16
16
  WebSearchSource,
17
- } from "../types";
18
- import { WebSearchProviderError } from "../types";
17
+ } from "$c/web/search/types";
18
+ import { WebSearchProviderError } from "$c/web/search/types";
19
19
 
20
20
  const DEFAULT_MODEL = "claude-haiku-4-5";
21
21
  const DEFAULT_MAX_TOKENS = 4096;
@@ -35,7 +35,6 @@ const applySearchToolPrefix = (name: string, isOAuth: boolean): string => {
35
35
  export interface AnthropicSearchParams {
36
36
  query: string;
37
37
  system_prompt?: string;
38
- max_tokens?: number;
39
38
  num_results?: number;
40
39
  }
41
40
 
@@ -51,7 +50,7 @@ async function getModel(): Promise<string> {
51
50
  * Builds system instruction blocks for the Anthropic API request.
52
51
  * @param auth - Authentication configuration
53
52
  * @param model - Model identifier (affects whether Claude Code instruction is included)
54
- * @param systemPrompt - Optional custom system prompt
53
+ * @param systemPrompt - Optional system prompt for guiding response style
55
54
  * @returns Array of system blocks for the API request
56
55
  */
57
56
  function buildSystemBlocks(
@@ -73,8 +72,7 @@ function buildSystemBlocks(
73
72
  * @param auth - Authentication configuration (API key or OAuth)
74
73
  * @param model - Model identifier to use
75
74
  * @param query - Search query from the user
76
- * @param systemPrompt - Optional custom system prompt
77
- * @param maxTokens - Maximum tokens for the response
75
+ * @param systemPrompt - Optional system prompt for guiding response style
78
76
  * @returns Raw API response from Anthropic
79
77
  * @throws {WebSearchProviderError} If the API request fails
80
78
  */
@@ -83,7 +81,6 @@ async function callWebSearch(
83
81
  model: string,
84
82
  query: string,
85
83
  systemPrompt?: string,
86
- maxTokens?: number,
87
84
  ): Promise<AnthropicApiResponse> {
88
85
  const url = buildAnthropicUrl(auth);
89
86
  const headers = buildAnthropicHeaders(auth);
@@ -92,7 +89,7 @@ async function callWebSearch(
92
89
 
93
90
  const body: Record<string, unknown> = {
94
91
  model,
95
- max_tokens: maxTokens ?? DEFAULT_MAX_TOKENS,
92
+ max_tokens: DEFAULT_MAX_TOKENS,
96
93
  messages: [{ role: "user", content: query }],
97
94
  tools: [
98
95
  {
@@ -240,7 +237,7 @@ export async function searchAnthropic(params: AnthropicSearchParams): Promise<We
240
237
  }
241
238
 
242
239
  const model = await getModel();
243
- const response = await callWebSearch(auth, model, params.query, params.system_prompt, params.max_tokens);
240
+ const response = await callWebSearch(auth, model, params.query, params.system_prompt);
244
241
 
245
242
  const result = parseResponse(response);
246
243
 
@@ -7,8 +7,8 @@
7
7
 
8
8
  import { existsSync, readFileSync } from "node:fs";
9
9
  import { homedir } from "node:os";
10
- import type { WebSearchResponse, WebSearchSource } from "../types";
11
- import { WebSearchProviderError } from "../types";
10
+ import type { WebSearchResponse, WebSearchSource } from "$c/web/search/types";
11
+ import { WebSearchProviderError } from "$c/web/search/types";
12
12
 
13
13
  const EXA_API_URL = "https://api.exa.ai/search";
14
14
 
@@ -12,19 +12,15 @@ import type {
12
12
  WebSearchCitation,
13
13
  WebSearchResponse,
14
14
  WebSearchSource,
15
- } from "../types";
16
- import { WebSearchProviderError } from "../types";
15
+ } from "$c/web/search/types";
16
+ import { WebSearchProviderError } from "$c/web/search/types";
17
17
 
18
18
  const PERPLEXITY_API_URL = "https://api.perplexity.ai/chat/completions";
19
19
 
20
20
  export interface PerplexitySearchParams {
21
21
  query: string;
22
- model?: "sonar" | "sonar-pro";
23
22
  system_prompt?: string;
24
23
  search_recency_filter?: "day" | "week" | "month" | "year";
25
- search_domain_filter?: string[];
26
- search_context_size?: "low" | "medium" | "high";
27
- return_related_questions?: boolean;
28
24
  num_results?: number;
29
25
  }
30
26
 
@@ -171,22 +167,14 @@ export async function searchPerplexity(params: PerplexitySearchParams): Promise<
171
167
  messages.push({ role: "user", content: params.query });
172
168
 
173
169
  const request: PerplexityRequest = {
174
- model: params.model ?? "sonar",
170
+ model: "sonar",
175
171
  messages,
176
- // Default to true for related questions (unlike original which hardcoded false)
177
- return_related_questions: params.return_related_questions ?? true,
172
+ return_related_questions: true,
178
173
  };
179
174
 
180
- // Add optional parameters
181
175
  if (params.search_recency_filter) {
182
176
  request.search_recency_filter = params.search_recency_filter;
183
177
  }
184
- if (params.search_domain_filter && params.search_domain_filter.length > 0) {
185
- request.search_domain_filter = params.search_domain_filter;
186
- }
187
- if (params.search_context_size) {
188
- request.search_context_size = params.search_context_size;
189
- }
190
178
 
191
179
  const response = await callPerplexity(apiKey, request);
192
180
  const result = parseResponse(response);
@@ -6,8 +6,8 @@
6
6
 
7
7
  import type { Component } from "@oh-my-pi/pi-tui";
8
8
  import { Text } from "@oh-my-pi/pi-tui";
9
- import type { Theme } from "../../../modes/interactive/theme/theme";
10
- import type { RenderResultOptions } from "../../custom-tools/types";
9
+ import type { RenderResultOptions } from "$c/extensibility/custom-tools/types";
10
+ import type { Theme } from "$c/modes/theme/theme";
11
11
  import {
12
12
  formatAge,
13
13
  formatCount,
@@ -19,7 +19,7 @@ import {
19
19
  PREVIEW_LIMITS,
20
20
  TRUNCATE_LENGTHS,
21
21
  truncate,
22
- } from "../render-utils";
22
+ } from "$c/tools/render-utils";
23
23
  import type { WebSearchResponse } from "./types";
24
24
 
25
25
  const MAX_COLLAPSED_ANSWER_LINES = PREVIEW_LIMITS.COLLAPSED_LINES;
@@ -1,93 +0,0 @@
1
- #!/bin/bash
2
- #
3
- # Migrate sessions from ~/.omp/agent/*.jsonl to proper session directories.
4
- # This fixes sessions created by the bug in v0.30.0 where sessions were
5
- # saved to ~/.omp/agent/ instead of ~/.omp/agent/sessions/<encoded-cwd>/.
6
- #
7
- # Usage: ./migrate-sessions.sh [--dry-run]
8
- #
9
-
10
- set -e
11
-
12
- AGENT_DIR="${OMP_AGENT_DIR:-$HOME/.omp/agent}"
13
- DRY_RUN=false
14
-
15
- if [[ "$1" == "--dry-run" ]]; then
16
- DRY_RUN=true
17
- echo "Dry run mode - no files will be moved"
18
- echo
19
- fi
20
-
21
- # Find all .jsonl files directly in agent dir (not in subdirectories)
22
- shopt -s nullglob
23
- files=("$AGENT_DIR"/*.jsonl)
24
- shopt -u nullglob
25
-
26
- if [[ ${#files[@]} -eq 0 ]]; then
27
- echo "No session files found in $AGENT_DIR"
28
- exit 0
29
- fi
30
-
31
- echo "Found ${#files[@]} session file(s) to migrate"
32
- echo
33
-
34
- migrated=0
35
- failed=0
36
-
37
- for file in "${files[@]}"; do
38
- filename=$(basename "$file")
39
-
40
- # Read first line and extract cwd using jq
41
- if ! first_line=$(head -1 "$file" 2>/dev/null); then
42
- echo "SKIP: $filename - cannot read file"
43
- ((failed++))
44
- continue
45
- fi
46
-
47
- # Parse JSON and extract cwd
48
- if ! cwd=$(echo "$first_line" | jq -r '.cwd // empty' 2>/dev/null); then
49
- echo "SKIP: $filename - invalid JSON"
50
- ((failed++))
51
- continue
52
- fi
53
-
54
- if [[ -z "$cwd" ]]; then
55
- echo "SKIP: $filename - no cwd in session header"
56
- ((failed++))
57
- continue
58
- fi
59
-
60
- # Encode cwd: remove leading slash, replace slashes with dashes, wrap with --
61
- encoded=$(echo "$cwd" | sed 's|^/||' | sed 's|[/:\\]|-|g')
62
- encoded="--${encoded}--"
63
-
64
- target_dir="$AGENT_DIR/sessions/$encoded"
65
- target_file="$target_dir/$filename"
66
-
67
- if [[ -e "$target_file" ]]; then
68
- echo "SKIP: $filename - target already exists"
69
- ((failed++))
70
- continue
71
- fi
72
-
73
- echo "MIGRATE: $filename"
74
- echo " cwd: $cwd"
75
- echo " to: $target_dir/"
76
-
77
- if [[ "$DRY_RUN" == false ]]; then
78
- mkdir -p "$target_dir"
79
- mv "$file" "$target_file"
80
- fi
81
-
82
- ((migrated++))
83
- echo
84
- done
85
-
86
- echo "---"
87
- echo "Migrated: $migrated"
88
- echo "Skipped: $failed"
89
-
90
- if [[ "$DRY_RUN" == true && $migrated -gt 0 ]]; then
91
- echo
92
- echo "Run without --dry-run to perform the migration"
93
- fi
package/src/core/index.ts DELETED
@@ -1,56 +0,0 @@
1
- /**
2
- * Core modules shared between all run modes.
3
- */
4
-
5
- export {
6
- AgentSession,
7
- type AgentSessionConfig,
8
- type AgentSessionEvent,
9
- type AgentSessionEventListener,
10
- type ModelCycleResult,
11
- type PromptOptions,
12
- type SessionStats,
13
- } from "./agent-session";
14
- export { type BashExecutorOptions, type BashResult, executeBash } from "./bash-executor";
15
- export type { CompactionResult } from "./compaction/index";
16
- export {
17
- discoverAndLoadExtensions,
18
- type ExtensionAPI,
19
- type ExtensionCommandContext,
20
- type ExtensionContext,
21
- type ExtensionFactory,
22
- ExtensionRunner,
23
- type ExtensionUIContext,
24
- type ExtensionUIDialogOptions,
25
- loadExtensionFromFactory,
26
- type ToolDefinition,
27
- } from "./extensions/index";
28
- export { HistoryStorage } from "./history-storage";
29
- export {
30
- createMCPManager,
31
- discoverAndLoadMCPTools,
32
- loadAllMCPConfigs,
33
- type MCPConfigFile,
34
- type MCPLoadResult,
35
- MCPManager,
36
- type MCPServerConfig,
37
- type MCPServerConnection,
38
- MCPToolCache,
39
- type MCPToolDefinition,
40
- type MCPToolDetails,
41
- type MCPToolsLoadResult,
42
- type MCPTransport,
43
- } from "./mcp/index";
44
- export {
45
- buildRemoteCommand,
46
- closeAllConnections,
47
- closeConnection,
48
- ensureConnection,
49
- getControlDir,
50
- getControlPathTemplate,
51
- type SSHConnectionTarget,
52
- } from "./ssh/connection-manager";
53
- export { executeSSH, type SSHExecutorOptions, type SSHResult } from "./ssh/ssh-executor";
54
- export { hasSshfs, isMounted, mountRemote, unmountAll, unmountRemote } from "./ssh/sshfs-mount";
55
-
56
- export * as utils from "./utils";