@oh-my-pi/pi-coding-agent 7.0.0 → 8.0.1

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 (503) 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 +12 -11
  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/tsconfig.json +25 -0
  268. package/scripts/migrate-sessions.sh +0 -93
  269. package/src/core/index.ts +0 -56
  270. package/src/core/python-prelude.ts +0 -3
  271. package/src/core/ssh-executor.ts +0 -5
  272. package/src/core/streaming-output.ts +0 -115
  273. package/src/core/tools/output.ts +0 -519
  274. package/src/core/tools/read.ts +0 -717
  275. package/src/core/tools/task/template.ts +0 -37
  276. package/src/prompts/tools/output.md +0 -47
  277. package/src/prompts/tools/web-fetch.md +0 -9
  278. package/src/vendor/photon/photon_rs_bg.wasm.b64.js +0 -1
  279. /package/src/{core/tools/exa → exa}/types.ts +0 -0
  280. /package/src/{core → exec}/exec.ts +0 -0
  281. /package/src/{core/export-html → export/html}/template.css +0 -0
  282. /package/src/{core/export-html → export/html}/template.generated.ts +0 -0
  283. /package/src/{core/export-html → export/html}/template.html +0 -0
  284. /package/src/{core/export-html → export/html}/template.js +0 -0
  285. /package/src/{core/export-html → export/html}/template.macro.ts +0 -0
  286. /package/src/{core/export-html → export/html}/vendor/highlight.min.js +0 -0
  287. /package/src/{core/export-html → export/html}/vendor/marked.min.js +0 -0
  288. /package/src/{core → extensibility}/custom-commands/index.ts +0 -0
  289. /package/src/{core → extensibility}/custom-tools/index.ts +0 -0
  290. /package/src/{core → extensibility}/extensions/index.ts +0 -0
  291. /package/src/{core → extensibility}/hooks/tool-wrapper.ts +0 -0
  292. /package/src/{core → extensibility}/plugins/index.ts +0 -0
  293. /package/src/{core → extensibility}/plugins/loader.ts +0 -0
  294. /package/src/{core → extensibility}/plugins/manager.ts +0 -0
  295. /package/src/{core → extensibility}/plugins/parser.ts +0 -0
  296. /package/src/{core → extensibility}/plugins/types.ts +0 -0
  297. /package/src/{core/python-modules.ts → ipy/modules.ts} +0 -0
  298. /package/src/{core/python-prelude.py → ipy/prelude.py} +0 -0
  299. /package/src/{core/tools/lsp → lsp}/defaults.json +0 -0
  300. /package/src/{core/tools/lsp → lsp}/edits.ts +0 -0
  301. /package/src/{core/tools/lsp → lsp}/lspmux.ts +0 -0
  302. /package/src/{core/tools/lsp → lsp}/rust-analyzer.ts +0 -0
  303. /package/src/{core/mcp → mcp}/client.ts +0 -0
  304. /package/src/{core/mcp → mcp}/index.ts +0 -0
  305. /package/src/{core/mcp → mcp}/json-rpc.ts +0 -0
  306. /package/src/{core/mcp → mcp}/transports/index.ts +0 -0
  307. /package/src/modes/{interactive/components → components}/countdown-timer.ts +0 -0
  308. /package/src/modes/{interactive/components → components}/custom-editor.ts +0 -0
  309. /package/src/modes/{interactive/components → components}/extensions/index.ts +0 -0
  310. /package/src/modes/{interactive/components → components}/index.ts +0 -0
  311. /package/src/modes/{interactive/components → components}/status-line/index.ts +0 -0
  312. /package/src/modes/{interactive/components → components}/status-line/presets.ts +0 -0
  313. /package/src/modes/{interactive/components → components}/visual-truncate.ts +0 -0
  314. /package/src/modes/{interactive/theme → theme}/dark.json +0 -0
  315. /package/src/modes/{interactive/theme → theme}/defaults/alabaster.json +0 -0
  316. /package/src/modes/{interactive/theme → theme}/defaults/amethyst.json +0 -0
  317. /package/src/modes/{interactive/theme → theme}/defaults/anthracite.json +0 -0
  318. /package/src/modes/{interactive/theme → theme}/defaults/basalt.json +0 -0
  319. /package/src/modes/{interactive/theme → theme}/defaults/birch.json +0 -0
  320. /package/src/modes/{interactive/theme → theme}/defaults/dark-abyss.json +0 -0
  321. /package/src/modes/{interactive/theme → theme}/defaults/dark-arctic.json +0 -0
  322. /package/src/modes/{interactive/theme → theme}/defaults/dark-aurora.json +0 -0
  323. /package/src/modes/{interactive/theme → theme}/defaults/dark-catppuccin.json +0 -0
  324. /package/src/modes/{interactive/theme → theme}/defaults/dark-cavern.json +0 -0
  325. /package/src/modes/{interactive/theme → theme}/defaults/dark-copper.json +0 -0
  326. /package/src/modes/{interactive/theme → theme}/defaults/dark-cosmos.json +0 -0
  327. /package/src/modes/{interactive/theme → theme}/defaults/dark-cyberpunk.json +0 -0
  328. /package/src/modes/{interactive/theme → theme}/defaults/dark-dracula.json +0 -0
  329. /package/src/modes/{interactive/theme → theme}/defaults/dark-eclipse.json +0 -0
  330. /package/src/modes/{interactive/theme → theme}/defaults/dark-ember.json +0 -0
  331. /package/src/modes/{interactive/theme → theme}/defaults/dark-equinox.json +0 -0
  332. /package/src/modes/{interactive/theme → theme}/defaults/dark-forest.json +0 -0
  333. /package/src/modes/{interactive/theme → theme}/defaults/dark-github.json +0 -0
  334. /package/src/modes/{interactive/theme → theme}/defaults/dark-gruvbox.json +0 -0
  335. /package/src/modes/{interactive/theme → theme}/defaults/dark-lavender.json +0 -0
  336. /package/src/modes/{interactive/theme → theme}/defaults/dark-lunar.json +0 -0
  337. /package/src/modes/{interactive/theme → theme}/defaults/dark-midnight.json +0 -0
  338. /package/src/modes/{interactive/theme → theme}/defaults/dark-monochrome.json +0 -0
  339. /package/src/modes/{interactive/theme → theme}/defaults/dark-monokai.json +0 -0
  340. /package/src/modes/{interactive/theme → theme}/defaults/dark-nebula.json +0 -0
  341. /package/src/modes/{interactive/theme → theme}/defaults/dark-nord.json +0 -0
  342. /package/src/modes/{interactive/theme → theme}/defaults/dark-ocean.json +0 -0
  343. /package/src/modes/{interactive/theme → theme}/defaults/dark-one.json +0 -0
  344. /package/src/modes/{interactive/theme → theme}/defaults/dark-rainforest.json +0 -0
  345. /package/src/modes/{interactive/theme → theme}/defaults/dark-reef.json +0 -0
  346. /package/src/modes/{interactive/theme → theme}/defaults/dark-retro.json +0 -0
  347. /package/src/modes/{interactive/theme → theme}/defaults/dark-rose-pine.json +0 -0
  348. /package/src/modes/{interactive/theme → theme}/defaults/dark-sakura.json +0 -0
  349. /package/src/modes/{interactive/theme → theme}/defaults/dark-slate.json +0 -0
  350. /package/src/modes/{interactive/theme → theme}/defaults/dark-solarized.json +0 -0
  351. /package/src/modes/{interactive/theme → theme}/defaults/dark-solstice.json +0 -0
  352. /package/src/modes/{interactive/theme → theme}/defaults/dark-starfall.json +0 -0
  353. /package/src/modes/{interactive/theme → theme}/defaults/dark-sunset.json +0 -0
  354. /package/src/modes/{interactive/theme → theme}/defaults/dark-swamp.json +0 -0
  355. /package/src/modes/{interactive/theme → theme}/defaults/dark-synthwave.json +0 -0
  356. /package/src/modes/{interactive/theme → theme}/defaults/dark-taiga.json +0 -0
  357. /package/src/modes/{interactive/theme → theme}/defaults/dark-terminal.json +0 -0
  358. /package/src/modes/{interactive/theme → theme}/defaults/dark-tokyo-night.json +0 -0
  359. /package/src/modes/{interactive/theme → theme}/defaults/dark-tundra.json +0 -0
  360. /package/src/modes/{interactive/theme → theme}/defaults/dark-twilight.json +0 -0
  361. /package/src/modes/{interactive/theme → theme}/defaults/dark-volcanic.json +0 -0
  362. /package/src/modes/{interactive/theme → theme}/defaults/graphite.json +0 -0
  363. /package/src/modes/{interactive/theme → theme}/defaults/index.ts +0 -0
  364. /package/src/modes/{interactive/theme → theme}/defaults/light-arctic.json +0 -0
  365. /package/src/modes/{interactive/theme → theme}/defaults/light-aurora-day.json +0 -0
  366. /package/src/modes/{interactive/theme → theme}/defaults/light-canyon.json +0 -0
  367. /package/src/modes/{interactive/theme → theme}/defaults/light-catppuccin.json +0 -0
  368. /package/src/modes/{interactive/theme → theme}/defaults/light-cirrus.json +0 -0
  369. /package/src/modes/{interactive/theme → theme}/defaults/light-coral.json +0 -0
  370. /package/src/modes/{interactive/theme → theme}/defaults/light-cyberpunk.json +0 -0
  371. /package/src/modes/{interactive/theme → theme}/defaults/light-dawn.json +0 -0
  372. /package/src/modes/{interactive/theme → theme}/defaults/light-dunes.json +0 -0
  373. /package/src/modes/{interactive/theme → theme}/defaults/light-eucalyptus.json +0 -0
  374. /package/src/modes/{interactive/theme → theme}/defaults/light-forest.json +0 -0
  375. /package/src/modes/{interactive/theme → theme}/defaults/light-frost.json +0 -0
  376. /package/src/modes/{interactive/theme → theme}/defaults/light-github.json +0 -0
  377. /package/src/modes/{interactive/theme → theme}/defaults/light-glacier.json +0 -0
  378. /package/src/modes/{interactive/theme → theme}/defaults/light-gruvbox.json +0 -0
  379. /package/src/modes/{interactive/theme → theme}/defaults/light-haze.json +0 -0
  380. /package/src/modes/{interactive/theme → theme}/defaults/light-honeycomb.json +0 -0
  381. /package/src/modes/{interactive/theme → theme}/defaults/light-lagoon.json +0 -0
  382. /package/src/modes/{interactive/theme → theme}/defaults/light-lavender.json +0 -0
  383. /package/src/modes/{interactive/theme → theme}/defaults/light-meadow.json +0 -0
  384. /package/src/modes/{interactive/theme → theme}/defaults/light-mint.json +0 -0
  385. /package/src/modes/{interactive/theme → theme}/defaults/light-monochrome.json +0 -0
  386. /package/src/modes/{interactive/theme → theme}/defaults/light-ocean.json +0 -0
  387. /package/src/modes/{interactive/theme → theme}/defaults/light-one.json +0 -0
  388. /package/src/modes/{interactive/theme → theme}/defaults/light-opal.json +0 -0
  389. /package/src/modes/{interactive/theme → theme}/defaults/light-orchard.json +0 -0
  390. /package/src/modes/{interactive/theme → theme}/defaults/light-paper.json +0 -0
  391. /package/src/modes/{interactive/theme → theme}/defaults/light-prism.json +0 -0
  392. /package/src/modes/{interactive/theme → theme}/defaults/light-retro.json +0 -0
  393. /package/src/modes/{interactive/theme → theme}/defaults/light-sand.json +0 -0
  394. /package/src/modes/{interactive/theme → theme}/defaults/light-savanna.json +0 -0
  395. /package/src/modes/{interactive/theme → theme}/defaults/light-solarized.json +0 -0
  396. /package/src/modes/{interactive/theme → theme}/defaults/light-soleil.json +0 -0
  397. /package/src/modes/{interactive/theme → theme}/defaults/light-sunset.json +0 -0
  398. /package/src/modes/{interactive/theme → theme}/defaults/light-synthwave.json +0 -0
  399. /package/src/modes/{interactive/theme → theme}/defaults/light-tokyo-night.json +0 -0
  400. /package/src/modes/{interactive/theme → theme}/defaults/light-wetland.json +0 -0
  401. /package/src/modes/{interactive/theme → theme}/defaults/light-zenith.json +0 -0
  402. /package/src/modes/{interactive/theme → theme}/defaults/limestone.json +0 -0
  403. /package/src/modes/{interactive/theme → theme}/defaults/mahogany.json +0 -0
  404. /package/src/modes/{interactive/theme → theme}/defaults/marble.json +0 -0
  405. /package/src/modes/{interactive/theme → theme}/defaults/obsidian.json +0 -0
  406. /package/src/modes/{interactive/theme → theme}/defaults/onyx.json +0 -0
  407. /package/src/modes/{interactive/theme → theme}/defaults/pearl.json +0 -0
  408. /package/src/modes/{interactive/theme → theme}/defaults/porcelain.json +0 -0
  409. /package/src/modes/{interactive/theme → theme}/defaults/quartz.json +0 -0
  410. /package/src/modes/{interactive/theme → theme}/defaults/sandstone.json +0 -0
  411. /package/src/modes/{interactive/theme → theme}/defaults/titanium.json +0 -0
  412. /package/src/modes/{interactive/theme → theme}/light.json +0 -0
  413. /package/src/modes/{interactive/theme → theme}/theme-schema.json +0 -0
  414. /package/src/{core/tools/patch → patch}/fuzzy.ts +0 -0
  415. /package/src/{core/tools/patch → patch}/normalize.ts +0 -0
  416. /package/src/{core/tools/patch → patch}/normative.ts +0 -0
  417. /package/src/{core/tools/patch → patch}/parser.ts +0 -0
  418. /package/src/{core/tools/patch → patch}/types.ts +0 -0
  419. /package/src/{core → session}/compaction/index.ts +0 -0
  420. /package/src/{core → session}/session-storage.ts +0 -0
  421. /package/src/{core/tools/task → task}/name-generator.ts +0 -0
  422. /package/src/{core/tools/task → task}/omp-command.ts +0 -0
  423. /package/src/{core/tools/task → task}/parallel.ts +0 -0
  424. /package/src/{core/tools → tools}/jtd-to-json-schema.ts +0 -0
  425. /package/src/{core/tools → tools}/path-utils.ts +0 -0
  426. /package/src/{core → utils}/event-bus.ts +0 -0
  427. /package/src/{core → utils}/frontmatter.ts +0 -0
  428. /package/src/{core → utils}/terminal-notify.ts +0 -0
  429. /package/src/{core → utils}/timings.ts +0 -0
  430. /package/src/{core → utils}/utils.ts +0 -0
  431. /package/src/{core/tools/web-scrapers → web/scrapers}/artifacthub.ts +0 -0
  432. /package/src/{core/tools/web-scrapers → web/scrapers}/arxiv.ts +0 -0
  433. /package/src/{core/tools/web-scrapers → web/scrapers}/aur.ts +0 -0
  434. /package/src/{core/tools/web-scrapers → web/scrapers}/biorxiv.ts +0 -0
  435. /package/src/{core/tools/web-scrapers → web/scrapers}/bluesky.ts +0 -0
  436. /package/src/{core/tools/web-scrapers → web/scrapers}/brew.ts +0 -0
  437. /package/src/{core/tools/web-scrapers → web/scrapers}/cheatsh.ts +0 -0
  438. /package/src/{core/tools/web-scrapers → web/scrapers}/chocolatey.ts +0 -0
  439. /package/src/{core/tools/web-scrapers → web/scrapers}/cisa-kev.ts +0 -0
  440. /package/src/{core/tools/web-scrapers → web/scrapers}/clojars.ts +0 -0
  441. /package/src/{core/tools/web-scrapers → web/scrapers}/coingecko.ts +0 -0
  442. /package/src/{core/tools/web-scrapers → web/scrapers}/crates-io.ts +0 -0
  443. /package/src/{core/tools/web-scrapers → web/scrapers}/crossref.ts +0 -0
  444. /package/src/{core/tools/web-scrapers → web/scrapers}/devto.ts +0 -0
  445. /package/src/{core/tools/web-scrapers → web/scrapers}/discogs.ts +0 -0
  446. /package/src/{core/tools/web-scrapers → web/scrapers}/discourse.ts +0 -0
  447. /package/src/{core/tools/web-scrapers → web/scrapers}/dockerhub.ts +0 -0
  448. /package/src/{core/tools/web-scrapers → web/scrapers}/fdroid.ts +0 -0
  449. /package/src/{core/tools/web-scrapers → web/scrapers}/firefox-addons.ts +0 -0
  450. /package/src/{core/tools/web-scrapers → web/scrapers}/flathub.ts +0 -0
  451. /package/src/{core/tools/web-scrapers → web/scrapers}/github-gist.ts +0 -0
  452. /package/src/{core/tools/web-scrapers → web/scrapers}/github.ts +0 -0
  453. /package/src/{core/tools/web-scrapers → web/scrapers}/gitlab.ts +0 -0
  454. /package/src/{core/tools/web-scrapers → web/scrapers}/go-pkg.ts +0 -0
  455. /package/src/{core/tools/web-scrapers → web/scrapers}/hackage.ts +0 -0
  456. /package/src/{core/tools/web-scrapers → web/scrapers}/hackernews.ts +0 -0
  457. /package/src/{core/tools/web-scrapers → web/scrapers}/hex.ts +0 -0
  458. /package/src/{core/tools/web-scrapers → web/scrapers}/huggingface.ts +0 -0
  459. /package/src/{core/tools/web-scrapers → web/scrapers}/iacr.ts +0 -0
  460. /package/src/{core/tools/web-scrapers → web/scrapers}/index.ts +0 -0
  461. /package/src/{core/tools/web-scrapers → web/scrapers}/jetbrains-marketplace.ts +0 -0
  462. /package/src/{core/tools/web-scrapers → web/scrapers}/lemmy.ts +0 -0
  463. /package/src/{core/tools/web-scrapers → web/scrapers}/lobsters.ts +0 -0
  464. /package/src/{core/tools/web-scrapers → web/scrapers}/mastodon.ts +0 -0
  465. /package/src/{core/tools/web-scrapers → web/scrapers}/maven.ts +0 -0
  466. /package/src/{core/tools/web-scrapers → web/scrapers}/mdn.ts +0 -0
  467. /package/src/{core/tools/web-scrapers → web/scrapers}/metacpan.ts +0 -0
  468. /package/src/{core/tools/web-scrapers → web/scrapers}/musicbrainz.ts +0 -0
  469. /package/src/{core/tools/web-scrapers → web/scrapers}/npm.ts +0 -0
  470. /package/src/{core/tools/web-scrapers → web/scrapers}/nuget.ts +0 -0
  471. /package/src/{core/tools/web-scrapers → web/scrapers}/nvd.ts +0 -0
  472. /package/src/{core/tools/web-scrapers → web/scrapers}/ollama.ts +0 -0
  473. /package/src/{core/tools/web-scrapers → web/scrapers}/open-vsx.ts +0 -0
  474. /package/src/{core/tools/web-scrapers → web/scrapers}/opencorporates.ts +0 -0
  475. /package/src/{core/tools/web-scrapers → web/scrapers}/openlibrary.ts +0 -0
  476. /package/src/{core/tools/web-scrapers → web/scrapers}/orcid.ts +0 -0
  477. /package/src/{core/tools/web-scrapers → web/scrapers}/osv.ts +0 -0
  478. /package/src/{core/tools/web-scrapers → web/scrapers}/packagist.ts +0 -0
  479. /package/src/{core/tools/web-scrapers → web/scrapers}/pub-dev.ts +0 -0
  480. /package/src/{core/tools/web-scrapers → web/scrapers}/pubmed.ts +0 -0
  481. /package/src/{core/tools/web-scrapers → web/scrapers}/pypi.ts +0 -0
  482. /package/src/{core/tools/web-scrapers → web/scrapers}/rawg.ts +0 -0
  483. /package/src/{core/tools/web-scrapers → web/scrapers}/readthedocs.ts +0 -0
  484. /package/src/{core/tools/web-scrapers → web/scrapers}/reddit.ts +0 -0
  485. /package/src/{core/tools/web-scrapers → web/scrapers}/repology.ts +0 -0
  486. /package/src/{core/tools/web-scrapers → web/scrapers}/rfc.ts +0 -0
  487. /package/src/{core/tools/web-scrapers → web/scrapers}/rubygems.ts +0 -0
  488. /package/src/{core/tools/web-scrapers → web/scrapers}/searchcode.ts +0 -0
  489. /package/src/{core/tools/web-scrapers → web/scrapers}/sec-edgar.ts +0 -0
  490. /package/src/{core/tools/web-scrapers → web/scrapers}/semantic-scholar.ts +0 -0
  491. /package/src/{core/tools/web-scrapers → web/scrapers}/snapcraft.ts +0 -0
  492. /package/src/{core/tools/web-scrapers → web/scrapers}/sourcegraph.ts +0 -0
  493. /package/src/{core/tools/web-scrapers → web/scrapers}/spdx.ts +0 -0
  494. /package/src/{core/tools/web-scrapers → web/scrapers}/spotify.ts +0 -0
  495. /package/src/{core/tools/web-scrapers → web/scrapers}/stackoverflow.ts +0 -0
  496. /package/src/{core/tools/web-scrapers → web/scrapers}/terraform.ts +0 -0
  497. /package/src/{core/tools/web-scrapers → web/scrapers}/tldr.ts +0 -0
  498. /package/src/{core/tools/web-scrapers → web/scrapers}/vimeo.ts +0 -0
  499. /package/src/{core/tools/web-scrapers → web/scrapers}/vscode-marketplace.ts +0 -0
  500. /package/src/{core/tools/web-scrapers → web/scrapers}/w3c.ts +0 -0
  501. /package/src/{core/tools/web-scrapers → web/scrapers}/wikidata.ts +0 -0
  502. /package/src/{core/tools/web-scrapers → web/scrapers}/wikipedia.ts +0 -0
  503. /package/src/{core/tools/web-search → web/search}/types.ts +0 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,93 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [8.0.0] - 2026-01-23
6
+ ### Added
7
+
8
+ - Added antigravity provider support for image generation with Google Cloud authentication
9
+ - Added support for google-antigravity API credentials in model registry
10
+ - Added antigravity-specific request handling with SSE streaming
11
+ - Added projectId parameter to antigravity credentials parsing
12
+ - Added antigravity provider to preferred image provider selection
13
+ - Added list-limit utility for consistent result limiting across tools
14
+ - Added output-utils module with tail buffer and artifact allocation helpers
15
+ - Added tool-result module for standardized tool result construction
16
+ - Added truncation summary options to OutputMetaBuilder for better output tracking
17
+ - Added artifact storage system for truncated tool outputs with artifact:// URL protocol
18
+ - Added structured output metadata system with fluent OutputMetaBuilder for consistent notices
19
+ - Added standardized tool error types (ToolError, MultiError, ToolAbortError) for better error handling
20
+ - Added internal URL routing system with protocol handlers:
21
+ - `agent://<id>` - access agent output artifacts
22
+ - `agent://<id>/<path>` and `agent://<id>?q=<query>` - JSON extraction from agent outputs
23
+ - `skill://<name>` and `skill://<name>/<path>` - read skill files and relative paths
24
+ - `rule://<name>` - read rule content
25
+ - URL resolution includes filesystem path in output for bash/python interop
26
+ - Added fetch tool for URL content retrieval with enhanced processing capabilities
27
+ - Added `isolated` option to task tool for git worktree execution with automatic patch generation and application
28
+ - Added format-prompts script to standardize prompt file formatting
29
+
30
+ ### Changed
31
+
32
+ - Updated default line limit from 4000 to 3000 lines for output truncation
33
+ - Reordered truncation notice to show offset continuation before artifact reference
34
+ - Applied meta notice wrapper to all tools in createTools function
35
+ - Updated test expectations to reflect new 3000 line limit
36
+ - Removed output tool from schema validation test list
37
+ - Replaced inline output truncation notices with structured metadata system across all tools
38
+ - Updated bash, python, and ssh executors to track detailed output statistics (total lines/bytes vs output lines/bytes)
39
+ - Modified artifact storage to use pre-allocated paths instead of inline file writing
40
+ - Changed message format to use meta field instead of fullOutputPath for truncation information
41
+ - Updated interactive components to display truncation metadata from structured format
42
+ - Standardized tool result building with new ToolResultBuilder for consistent metadata handling
43
+ - Simplified Python gateway coordination by removing reference counting and client tracking
44
+ - Updated Python gateway to use global shared instance instead of per-process coordination
45
+ - Modified Python kernel initialization to set working directory and environment per kernel
46
+ - Updated interactive status display to show Python and venv paths instead of client count
47
+ - Changed system prompt to clarify CHECKPOINT step 0 timing
48
+ - Updated Python environment warming to use await instead of void for proper error handling
49
+ - Updated interactive mode shutdown to use postmortem.quit instead of process.exit
50
+ - Updated bash tool documentation to clarify specialized tool usage
51
+ - Updated task tool documentation to escape placeholder syntax in examples
52
+ - Updated Python environment warming to use await instead of void for proper error handling
53
+ - Updated interactive mode shutdown to use postmortem.quit instead of process.exit
54
+ - Updated bash tool documentation to clarify specialized tool usage
55
+ - Updated task tool documentation to escape placeholder syntax in examples
56
+ - Updated all tools to use structured metadata instead of inline notices for truncation, limits, and diagnostics
57
+ - Replaced manual error formatting with ToolError.render() and standardized error handling
58
+ - Enhanced bash and python executors to save full output as artifacts when truncated
59
+ - Improved abort signal handling across all tools with consistent ToolAbortError
60
+ - Renamed task parameter from `vars` to `args` throughout task tool interface and updated template rendering to support built-in `{{id}}` and `{{description}}` placeholders
61
+ - Simplified todo-write tool by removing active_form parameter, using single content field for task descriptions
62
+ - Updated system prompt structure with `<important>` and `<avoid>` tags, clearer critical sections, and standardized whitespace handling
63
+ - Renamed web_fetch tool to fetch and removed internal URL handling (use read tool instead)
64
+ - Standardized tool parameter names from camelCase to snake_case across edit, grep, python, and todo-write tools
65
+ - Unified timeout parameters across all tools with auto-conversion from milliseconds and reasonable clamping (1s-3600s for bash/ssh, 1s-600s for python/gemini-image)
66
+ - Simplified web-search tool by removing advanced parameters (`max_tokens`, `model`, `search_domain_filter`, `search_context_size`, `return_related_questions`) and using `recency` instead of `search_recency_filter`
67
+ - Restructured tool documentation with standardized `<instruction>`, `<output>`, `<critical>`, and `<avoid>` sections across all 18 tools
68
+ - Updated find tool to always sort results by modification time
69
+ - Updated bash prompt to use `cwd` parameter instead of `workdir`
70
+ - Improved output truncation limits: bash to 50KB/2000 lines, python to 100KB
71
+ - Removed model parameter from task and gemini-image tools to use session/provider defaults
72
+ - Improved MCP tool name handling with explicit server and tool name properties
73
+ - Marked read tool as non-abortable to improve performance
74
+ - Converted dynamic imports to static imports in installer and exa tools
75
+
76
+ ### Removed
77
+
78
+ - Removed output tool (replaced by `agent://` URLs via read tool)
79
+ - Removed web_fetch tool (replaced by fetch tool)
80
+
81
+ ### Fixed
82
+
83
+ - Fixed Python kernel environment initialization for external and shared gateways
84
+ - Fixed gateway status reporting to include Python and virtual environment paths
85
+ - Fixed inconsistent error formatting across tools by standardizing on ToolError types
86
+ - Fixed timeout parameter handling to auto-convert milliseconds to seconds and clamp to reasonable ranges
87
+ - Fixed whitespace formatting in json-query.ts comment
88
+ - Fixed interactive shutdown to await postmortem cleanup so Python kernel gateways are terminated
89
+ - Fixed shared Python gateway reuse across working directories by initializing kernel cwd and env per kernel
90
+ - Fixed Python gateway coordination to use a single global gateway without ref counting
91
+
5
92
  ## [7.0.0] - 2026-01-21
6
93
  ### Added
7
94
 
package/README.md CHANGED
@@ -938,7 +938,7 @@ All tools are enabled by default. Use `--tools <list>` to restrict to a subset.
938
938
  | `lsp` | Language Server Protocol queries (go-to-definition, references, hover) |
939
939
  | `todo_write` | Track task progress during sessions |
940
940
  | `web_search` | Search the web |
941
- | `web_fetch` | Fetch and render URLs |
941
+ | `fetch` | Fetch and process URLs |
942
942
  | `python` | Execute Python code in IPython kernel |
943
943
  | `notebook` | Edit Jupyter notebook cells |
944
944
 
package/docs/hooks.md CHANGED
@@ -345,10 +345,10 @@ Tool inputs:
345
345
  - `bash`: `{ command, timeout? }`
346
346
  - `read`: `{ path, offset?, limit? }`
347
347
  - `write`: `{ path, content }`
348
- - `edit`: `{ path, oldText, newText }`
348
+ - `edit`: `{ path, old_text, new_text }`
349
349
  - `ls`: `{ path?, limit? }`
350
350
  - `find`: `{ pattern, path?, limit? }`
351
- - `grep`: `{ pattern, path?, glob?, ignoreCase?, literal?, context?, limit? }`
351
+ - `grep`: `{ pattern, path?, glob?, ignore_case?, literal?, context?, limit? }`
352
352
 
353
353
  #### tool_result
354
354
 
package/docs/sdk.md CHANGED
@@ -375,7 +375,7 @@ All tools are defined in `BUILTIN_TOOLS`:
375
375
  - `output` - Task output retrieval
376
376
  - `read` - File reading (text and images)
377
377
  - `task` - Subagent spawning
378
- - `web_fetch` - Web page fetching
378
+ - `fetch` - URL fetching
379
379
  - `web_search` - Web search
380
380
  - `write` - File writing
381
381
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oh-my-pi/pi-coding-agent",
3
- "version": "7.0.0",
3
+ "version": "8.0.1",
4
4
  "description": "Coding agent CLI with read, bash, edit, write tools and session management",
5
5
  "type": "module",
6
6
  "ompConfig": {
@@ -18,8 +18,8 @@
18
18
  "import": "./src/index.ts"
19
19
  },
20
20
  "./hooks": {
21
- "types": "./src/core/hooks/index.ts",
22
- "import": "./src/core/hooks/index.ts"
21
+ "types": "./src/extensibility/hooks/index.ts",
22
+ "import": "./src/extensibility/hooks/index.ts"
23
23
  }
24
24
  },
25
25
  "files": [
@@ -27,24 +27,26 @@
27
27
  "scripts",
28
28
  "docs",
29
29
  "examples",
30
- "CHANGELOG.md"
30
+ "CHANGELOG.md",
31
+ "tsconfig.json"
31
32
  ],
32
33
  "scripts": {
33
34
  "check": "tsgo -p tsconfig.check.json",
35
+ "format-prompts": "bun scripts/format-prompts.ts",
34
36
  "clean": "rm -rf dist",
35
37
  "build": "tsgo -p tsconfig.build.json && chmod +x dist/cli.js",
36
38
  "build:binary": "bun run generate-wasm-b64 && bun build --compile ./src/cli.ts --outfile dist/omp",
37
39
  "generate-template": "bun scripts/generate-template.ts",
38
40
  "postinstall": "bun run generate-template || true",
39
41
  "test": "bun test",
40
- "prepublishOnly": "bun run generate-template && bun run clean && bun run build"
42
+ "prepublishOnly": "bun run generate-template && cp tsconfig.publish.json tsconfig.json"
41
43
  },
42
44
  "dependencies": {
43
- "@oh-my-pi/omp-stats": "7.0.0",
44
- "@oh-my-pi/pi-agent-core": "7.0.0",
45
- "@oh-my-pi/pi-ai": "7.0.0",
46
- "@oh-my-pi/pi-tui": "7.0.0",
47
- "@oh-my-pi/pi-utils": "7.0.0",
45
+ "@oh-my-pi/omp-stats": "8.0.0",
46
+ "@oh-my-pi/pi-agent-core": "8.0.0",
47
+ "@oh-my-pi/pi-ai": "8.0.0",
48
+ "@oh-my-pi/pi-tui": "8.0.0",
49
+ "@oh-my-pi/pi-utils": "8.0.0",
48
50
  "@openai/agents": "^0.3.7",
49
51
  "@sinclair/typebox": "^0.34.46",
50
52
  "ajv": "^8.17.1",
@@ -56,7 +58,6 @@
56
58
  "handlebars": "^4.7.8",
57
59
  "highlight.js": "^11.11.1",
58
60
  "marked": "^15.0.12",
59
- "minimatch": "^10.1.1",
60
61
  "nanoid": "^5.1.6",
61
62
  "ndjson": "^2.0.0",
62
63
  "node-html-parser": "^6.1.13",
@@ -0,0 +1,143 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * Format prompt files (mixed XML + Markdown + Handlebars).
4
+ *
5
+ * Rules:
6
+ * 1. No blank line between "text:" and following list/block
7
+ * 2. No blank line after opening XML tag or Handlebars block
8
+ * 3. No blank line before closing XML tag or Handlebars block
9
+ * 4. Collapse 2+ blank lines to single blank line
10
+ * 5. Trim trailing whitespace (preserve indentation)
11
+ * 6. Ensure single newline at EOF
12
+ */
13
+
14
+ import { Glob } from "bun";
15
+
16
+ const PROMPTS_DIR = new URL("../src/prompts/", import.meta.url).pathname;
17
+
18
+ // Opening XML tag (not self-closing, not closing)
19
+ const OPENING_XML = /^<([a-z_-]+)(?:\s+[^>]*)?>$/;
20
+ // Closing XML tag
21
+ const CLOSING_XML = /^<\/([a-z_-]+)>$/;
22
+ // Handlebars block start: {{#if}}, {{#has}}, {{#list}}, etc.
23
+ const OPENING_HBS = /^\{\{#/;
24
+ // Handlebars block end: {{/if}}, {{/has}}, {{/list}}, etc.
25
+ const CLOSING_HBS = /^\{\{\//;
26
+ // Line ending with colon (intro to a list) - handles **bold:** too
27
+ const ENDS_WITH_COLON = /:\**\s*$/;
28
+ // List item or Handlebars conditional that acts like list
29
+ const LIST_OR_BLOCK = /^(\s*)[-*]|\d+\.\s|^\{\{#/;
30
+ // Code fence
31
+ const CODE_FENCE = /^```/;
32
+
33
+ function formatPrompt(content: string): string {
34
+ const lines = content.split("\n");
35
+ const result: string[] = [];
36
+ let inCodeBlock = false;
37
+
38
+ for (let i = 0; i < lines.length; i++) {
39
+ let line = lines[i];
40
+
41
+ // Trim trailing whitespace (preserve leading)
42
+ line = line.trimEnd();
43
+
44
+ const trimmed = line.trim();
45
+
46
+ // Track code blocks - don't modify inside them
47
+ if (CODE_FENCE.test(trimmed)) {
48
+ inCodeBlock = !inCodeBlock;
49
+ result.push(line);
50
+ continue;
51
+ }
52
+
53
+ if (inCodeBlock) {
54
+ result.push(line);
55
+ continue;
56
+ }
57
+
58
+ const isBlank = trimmed === "";
59
+
60
+ // Skip blank lines that violate our rules
61
+ if (isBlank) {
62
+ const prevLine = result[result.length - 1]?.trim() ?? "";
63
+ const nextLine = lines[i + 1]?.trim() ?? "";
64
+
65
+ // Rule 1: No blank between "text:" and list/block
66
+ if (ENDS_WITH_COLON.test(prevLine) && LIST_OR_BLOCK.test(nextLine)) {
67
+ continue;
68
+ }
69
+
70
+ // Rule 2: No blank after opening XML tag or Handlebars block
71
+ if (OPENING_XML.test(prevLine) || OPENING_HBS.test(prevLine)) {
72
+ continue;
73
+ }
74
+
75
+ // Rule 3: No blank before closing XML tag or Handlebars block
76
+ if (CLOSING_XML.test(nextLine) || CLOSING_HBS.test(nextLine)) {
77
+ continue;
78
+ }
79
+
80
+ // Rule 4: Collapse multiple blank lines
81
+ const prevIsBlank = prevLine === "";
82
+ if (prevIsBlank) {
83
+ continue;
84
+ }
85
+ }
86
+
87
+ // Rule 3 (cleanup): Remove trailing blanks before closing tag
88
+ if (CLOSING_XML.test(trimmed) || CLOSING_HBS.test(trimmed)) {
89
+ while (result.length > 0 && result[result.length - 1].trim() === "") {
90
+ result.pop();
91
+ }
92
+ }
93
+
94
+ result.push(line);
95
+ }
96
+
97
+ // Rule 6: Single newline at EOF
98
+ while (result.length > 0 && result[result.length - 1].trim() === "") {
99
+ result.pop();
100
+ }
101
+ result.push("");
102
+
103
+ return result.join("\n");
104
+ }
105
+
106
+ async function main() {
107
+ const glob = new Glob("**/*.md");
108
+ const files: string[] = [];
109
+ let changed = 0;
110
+
111
+ for await (const path of glob.scan(PROMPTS_DIR)) {
112
+ files.push(path);
113
+ }
114
+
115
+ const check = process.argv.includes("--check");
116
+
117
+ for (const relativePath of files) {
118
+ const fullPath = `${PROMPTS_DIR}${relativePath}`;
119
+ const original = await Bun.file(fullPath).text();
120
+ const formatted = formatPrompt(original);
121
+
122
+ if (original !== formatted) {
123
+ if (check) {
124
+ console.log(`Would format: ${relativePath}`);
125
+ } else {
126
+ await Bun.write(fullPath, formatted);
127
+ console.log(`Formatted: ${relativePath}`);
128
+ }
129
+ changed++;
130
+ }
131
+ }
132
+
133
+ if (check && changed > 0) {
134
+ console.log(`\n${changed} file(s) need formatting. Run 'bun run format-prompts' to fix.`);
135
+ process.exit(1);
136
+ } else if (changed === 0) {
137
+ console.log("All prompt files are formatted.");
138
+ } else {
139
+ console.log(`\nFormatted ${changed} file(s).`);
140
+ }
141
+ }
142
+
143
+ main();
@@ -4,7 +4,7 @@
4
4
  * This avoids the Bun macro restriction in node_modules.
5
5
  */
6
6
 
7
- const dir = new URL("../src/core/export-html/", import.meta.url).pathname;
7
+ const dir = new URL("../src/export/html/", import.meta.url).pathname;
8
8
 
9
9
  // Read all files
10
10
  const html = await Bun.file(`${dir}template.html`).text();
package/src/cli/args.ts CHANGED
@@ -4,8 +4,8 @@
4
4
 
5
5
  import type { ThinkingLevel } from "@oh-my-pi/pi-agent-core";
6
6
  import chalk from "chalk";
7
- import { APP_NAME, CONFIG_DIR_NAME, ENV_AGENT_DIR } from "../config";
8
- import { BUILTIN_TOOLS } from "../core/tools/index";
7
+ import { APP_NAME, CONFIG_DIR_NAME, ENV_AGENT_DIR } from "$c/config";
8
+ import { BUILTIN_TOOLS } from "$c/tools/index";
9
9
 
10
10
  export type Mode = "text" | "json" | "rpc";
11
11
 
@@ -296,7 +296,7 @@ ${chalk.bold("Available Tools (all enabled by default):")}
296
296
  python - Execute Python code (requires: ${APP_NAME} setup python)
297
297
  notebook - Edit Jupyter notebooks
298
298
  task - Launch sub-agents for parallel tasks
299
- web_fetch - Fetch and process web pages
299
+ fetch - Fetch and process URLs
300
300
  web_search - Search the web
301
301
  ask - Ask user questions (interactive mode only)
302
302
  `);
@@ -6,10 +6,10 @@
6
6
  */
7
7
 
8
8
  import chalk from "chalk";
9
- import { APP_NAME, getAgentDir } from "../config";
10
- import { SettingsManager } from "../core/settings-manager";
11
- import { SETTINGS_DEFS, type SettingDef } from "../modes/interactive/components/settings-defs";
12
- import { theme } from "../modes/interactive/theme/theme";
9
+ import { APP_NAME, getAgentDir } from "$c/config";
10
+ import { SettingsManager } from "$c/config/settings-manager";
11
+ import { SETTINGS_DEFS, type SettingDef } from "$c/modes/components/settings-defs";
12
+ import { theme } from "$c/modes/theme/theme";
13
13
 
14
14
  // =============================================================================
15
15
  // Types
@@ -6,9 +6,9 @@ import { existsSync, readFileSync, statSync } from "node:fs";
6
6
  import { resolve } from "node:path";
7
7
  import type { ImageContent } from "@oh-my-pi/pi-ai";
8
8
  import chalk from "chalk";
9
- import { resolveReadPath } from "../core/tools/path-utils";
10
- import { formatDimensionNote, resizeImage } from "../utils/image-resize";
11
- import { detectSupportedImageMimeTypeFromFile } from "../utils/mime";
9
+ import { resolveReadPath } from "$c/tools/path-utils";
10
+ import { formatDimensionNote, resizeImage } from "$c/utils/image-resize";
11
+ import { detectSupportedImageMimeTypeFromFile } from "$c/utils/mime";
12
12
 
13
13
  export interface ProcessedFiles {
14
14
  text: string;
@@ -3,8 +3,8 @@
3
3
  */
4
4
 
5
5
  import type { Api, Model } from "@oh-my-pi/pi-ai";
6
- import type { ModelRegistry } from "../core/model-registry";
7
- import { fuzzyFilter } from "../utils/fuzzy";
6
+ import type { ModelRegistry } from "$c/config/model-registry";
7
+ import { fuzzyFilter } from "$c/utils/fuzzy";
8
8
 
9
9
  /**
10
10
  * Format a number as human-readable (e.g., 200000 -> "200K", 1000000 -> "1M")
@@ -5,9 +5,9 @@
5
5
  */
6
6
 
7
7
  import chalk from "chalk";
8
- import { APP_NAME } from "../config";
9
- import { PluginManager, parseSettingValue, validateSetting } from "../core/plugins/index";
10
- import { theme } from "../modes/interactive/theme/theme";
8
+ import { APP_NAME } from "$c/config";
9
+ import { PluginManager, parseSettingValue, validateSetting } from "$c/extensibility/plugins/index";
10
+ import { theme } from "$c/modes/theme/theme";
11
11
 
12
12
  // =============================================================================
13
13
  // Types
@@ -3,8 +3,8 @@
3
3
  */
4
4
 
5
5
  import { ProcessTerminal, TUI } from "@oh-my-pi/pi-tui";
6
- import type { SessionInfo } from "../core/session-manager";
7
- import { SessionSelectorComponent } from "../modes/interactive/components/session-selector";
6
+ import { SessionSelectorComponent } from "$c/modes/components/session-selector";
7
+ import type { SessionInfo } from "$c/session/session-manager";
8
8
 
9
9
  /** Show TUI session selector and return selected session path or null if cancelled */
10
10
  export async function selectSession(sessions: SessionInfo[]): Promise<string | null> {
@@ -6,8 +6,8 @@
6
6
 
7
7
  import { $ } from "bun";
8
8
  import chalk from "chalk";
9
- import { APP_NAME } from "../config";
10
- import { theme } from "../modes/interactive/theme/theme";
9
+ import { APP_NAME } from "$c/config";
10
+ import { theme } from "$c/modes/theme/theme";
11
11
 
12
12
  export type SetupComponent = "python";
13
13
 
@@ -5,7 +5,7 @@
5
5
  */
6
6
 
7
7
  import chalk from "chalk";
8
- import { APP_NAME } from "../config";
8
+ import { APP_NAME } from "$c/config";
9
9
 
10
10
  // =============================================================================
11
11
  // Types
@@ -11,8 +11,8 @@ import { dirname } from "node:path";
11
11
  import { Readable } from "node:stream";
12
12
  import { pipeline } from "node:stream/promises";
13
13
  import chalk from "chalk";
14
- import { APP_NAME, VERSION } from "../config";
15
- import { theme } from "../modes/interactive/theme/theme";
14
+ import { APP_NAME, VERSION } from "$c/config";
15
+ import { theme } from "$c/modes/theme/theme";
16
16
 
17
17
  /**
18
18
  * Detect if we're running as a Bun compiled binary.
@@ -10,7 +10,7 @@ import {
10
10
  setEditorKeybindings,
11
11
  } from "@oh-my-pi/pi-tui";
12
12
  import { logger } from "@oh-my-pi/pi-utils";
13
- import { getAgentDir } from "../config";
13
+ import { getAgentDir } from "$c/config";
14
14
 
15
15
  /**
16
16
  * Application-level actions (coding agent specific).
@@ -14,7 +14,7 @@ import {
14
14
  import { logger } from "@oh-my-pi/pi-utils";
15
15
  import { type Static, Type } from "@sinclair/typebox";
16
16
  import AjvModule from "ajv";
17
- import type { AuthStorage } from "./auth-storage";
17
+ import type { AuthStorage } from "$c/session/auth-storage";
18
18
 
19
19
  const Ajv = (AjvModule as any).default || AjvModule;
20
20
 
@@ -5,8 +5,7 @@
5
5
  import type { ThinkingLevel } from "@oh-my-pi/pi-agent-core";
6
6
  import { type Api, type KnownProvider, type Model, modelsAreEqual } from "@oh-my-pi/pi-ai";
7
7
  import chalk from "chalk";
8
- import { minimatch } from "minimatch";
9
- import { isValidThinkingLevel } from "../cli/args";
8
+ import { isValidThinkingLevel } from "$c/cli/args";
10
9
  import type { ModelRegistry } from "./model-registry";
11
10
 
12
11
  /** Default model IDs for each known provider */
@@ -229,7 +228,8 @@ export async function resolveModelScope(patterns: string[], modelRegistry: Model
229
228
  // This allows "*sonnet*" to match without requiring "anthropic/*sonnet*"
230
229
  const matchingModels = availableModels.filter((m) => {
231
230
  const fullId = `${m.provider}/${m.id}`;
232
- return minimatch(fullId, globPattern, { nocase: true }) || minimatch(m.id, globPattern, { nocase: true });
231
+ const glob = new Bun.Glob(globPattern.toLowerCase());
232
+ return glob.match(fullId.toLowerCase()) || glob.match(m.id.toLowerCase());
233
233
  });
234
234
 
235
235
  if (matchingModels.length === 0) {
@@ -1,8 +1,8 @@
1
1
  import { join, resolve } from "node:path";
2
2
  import { logger } from "@oh-my-pi/pi-utils";
3
3
  import Handlebars from "handlebars";
4
- import { CONFIG_DIR_NAME, getPromptsDir } from "../config";
5
- import { parseFrontmatter } from "./frontmatter";
4
+ import { CONFIG_DIR_NAME, getPromptsDir } from "$c/config";
5
+ import { parseFrontmatter } from "$c/utils/frontmatter";
6
6
 
7
7
  /**
8
8
  * Represents a prompt template loaded from a markdown file
@@ -1,11 +1,11 @@
1
1
  import { rename } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
3
  import { logger } from "@oh-my-pi/pi-utils";
4
- import { type Settings as SettingsItem, settingsCapability } from "../capability/settings";
5
- import { getAgentDbPath, getAgentDir } from "../config";
6
- import { loadCapability } from "../discovery";
7
- import type { SymbolPreset } from "../modes/interactive/theme/theme";
8
- import { AgentStorage } from "./agent-storage";
4
+ import { type Settings as SettingsItem, settingsCapability } from "$c/capability/settings";
5
+ import { getAgentDbPath, getAgentDir } from "$c/config";
6
+ import { loadCapability } from "$c/discovery";
7
+ import type { SymbolPreset } from "$c/modes/theme/theme";
8
+ import { AgentStorage } from "$c/session/agent-storage";
9
9
 
10
10
  export interface CompactionSettings {
11
11
  enabled?: boolean; // default: true
@@ -120,7 +120,7 @@ export interface PythonSettings {
120
120
  export interface EditSettings {
121
121
  fuzzyMatch?: boolean; // default: true (accept high-confidence fuzzy matches for whitespace/indentation)
122
122
  fuzzyThreshold?: number; // default: 0.95 (similarity threshold for fuzzy matching)
123
- patchMode?: boolean; // default: true (use codex-style apply-patch format instead of oldText/newText)
123
+ patchMode?: boolean; // default: true (use codex-style apply-patch format instead of old_text/new_text)
124
124
  streamingAbort?: boolean; // default: false (abort streaming edit tool calls when patch preview fails)
125
125
  }
126
126
 
@@ -8,7 +8,7 @@ import type {
8
8
  AgentToolUpdateCallback,
9
9
  } from "@oh-my-pi/pi-agent-core";
10
10
  import type { CursorMcpCall, CursorExecHandlers as ICursorExecHandlers, ToolResultMessage } from "@oh-my-pi/pi-ai";
11
- import { resolveToCwd } from "../tools/path-utils";
11
+ import { resolveToCwd } from "$c/tools/path-utils";
12
12
 
13
13
  interface CursorExecBridgeOptions {
14
14
  cwd: string;
@@ -164,11 +164,11 @@ export class CursorExecHandlers implements ICursorExecHandlers {
164
164
  pattern: args.pattern,
165
165
  path: args.path || undefined,
166
166
  glob: args.glob || undefined,
167
- outputMode: args.outputMode || undefined,
167
+ output_mode: args.outputMode || undefined,
168
168
  context: args.context ?? args.contextBefore ?? args.contextAfter ?? undefined,
169
- ignoreCase: args.caseInsensitive || undefined,
169
+ ignore_case: args.caseInsensitive || undefined,
170
170
  type: args.type || undefined,
171
- headLimit: args.headLimit ?? undefined,
171
+ head_limit: args.headLimit ?? undefined,
172
172
  multiline: args.multiline || undefined,
173
173
  });
174
174
  return toolResultMessage;
@@ -7,10 +7,10 @@
7
7
  */
8
8
 
9
9
  import { dirname, join, sep } from "node:path";
10
- import { type ContextFile, contextFileCapability } from "../capability/context-file";
11
- import { readFile } from "../capability/fs";
12
- import { registerProvider } from "../capability/index";
13
- import type { LoadContext, LoadResult } from "../capability/types";
10
+ import { type ContextFile, contextFileCapability } from "$c/capability/context-file";
11
+ import { readFile } from "$c/capability/fs";
12
+ import { registerProvider } from "$c/capability/index";
13
+ import type { LoadContext, LoadResult } from "$c/capability/types";
14
14
  import { calculateDepth, createSourceMeta } from "./helpers";
15
15
 
16
16
  const PROVIDER_ID = "agents-md";
@@ -6,23 +6,23 @@
6
6
  */
7
7
 
8
8
  import { dirname, isAbsolute, join, resolve } from "path";
9
- import { type ContextFile, contextFileCapability } from "../capability/context-file";
10
- import { type Extension, type ExtensionManifest, extensionCapability } from "../capability/extension";
11
- import { type ExtensionModule, extensionModuleCapability } from "../capability/extension-module";
12
- import { readDirEntries, readFile } from "../capability/fs";
13
- import { type Hook, hookCapability } from "../capability/hook";
14
- import { registerProvider } from "../capability/index";
15
- import { type Instruction, instructionCapability } from "../capability/instruction";
16
- import { type MCPServer, mcpCapability } from "../capability/mcp";
17
- import { type Prompt, promptCapability } from "../capability/prompt";
18
- import { type Rule, ruleCapability } from "../capability/rule";
19
- import { type Settings, settingsCapability } from "../capability/settings";
20
- import { type Skill, skillCapability } from "../capability/skill";
21
- import { type SlashCommand, slashCommandCapability } from "../capability/slash-command";
22
- import { type SystemPrompt, systemPromptCapability } from "../capability/system-prompt";
23
- import { type CustomTool, toolCapability } from "../capability/tool";
24
- import type { LoadContext, LoadResult } from "../capability/types";
25
- import { parseFrontmatter } from "../core/frontmatter";
9
+ import { type ContextFile, contextFileCapability } from "$c/capability/context-file";
10
+ import { type Extension, type ExtensionManifest, extensionCapability } from "$c/capability/extension";
11
+ import { type ExtensionModule, extensionModuleCapability } from "$c/capability/extension-module";
12
+ import { readDirEntries, readFile } from "$c/capability/fs";
13
+ import { type Hook, hookCapability } from "$c/capability/hook";
14
+ import { registerProvider } from "$c/capability/index";
15
+ import { type Instruction, instructionCapability } from "$c/capability/instruction";
16
+ import { type MCPServer, mcpCapability } from "$c/capability/mcp";
17
+ import { type Prompt, promptCapability } from "$c/capability/prompt";
18
+ import { type Rule, ruleCapability } from "$c/capability/rule";
19
+ import { type Settings, settingsCapability } from "$c/capability/settings";
20
+ import { type Skill, skillCapability } from "$c/capability/skill";
21
+ import { type SlashCommand, slashCommandCapability } from "$c/capability/slash-command";
22
+ import { type SystemPrompt, systemPromptCapability } from "$c/capability/system-prompt";
23
+ import { type CustomTool, toolCapability } from "$c/capability/tool";
24
+ import type { LoadContext, LoadResult } from "$c/capability/types";
25
+ import { parseFrontmatter } from "$c/utils/frontmatter";
26
26
  import {
27
27
  createSourceMeta,
28
28
  discoverExtensionModulePaths,