@oh-my-pi/pi-coding-agent 6.9.69 → 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 (502) hide show
  1. package/CHANGELOG.md +219 -51
  2. package/README.md +1 -1
  3. package/docs/hooks.md +2 -2
  4. package/docs/sdk.md +1 -1
  5. package/examples/sdk/04-skills.ts +1 -1
  6. package/package.json +10 -10
  7. package/scripts/format-prompts.ts +143 -0
  8. package/scripts/generate-template.ts +1 -1
  9. package/src/cli/args.ts +3 -3
  10. package/src/cli/config-cli.ts +4 -4
  11. package/src/cli/file-processor.ts +3 -3
  12. package/src/cli/list-models.ts +2 -2
  13. package/src/cli/plugin-cli.ts +3 -3
  14. package/src/cli/session-picker.ts +2 -2
  15. package/src/cli/setup-cli.ts +2 -2
  16. package/src/cli/stats-cli.ts +1 -1
  17. package/src/cli/update-cli.ts +2 -2
  18. package/src/{core → config}/keybindings.ts +1 -1
  19. package/src/{core → config}/model-registry.ts +8 -1
  20. package/src/{core → config}/model-resolver.ts +3 -3
  21. package/src/{core → config}/prompt-templates.ts +2 -2
  22. package/src/{core → config}/settings-manager.ts +6 -6
  23. package/src/{core/cursor/exec-bridge.ts → cursor.ts} +4 -4
  24. package/src/discovery/agents-md.ts +4 -4
  25. package/src/discovery/builtin.ts +17 -17
  26. package/src/discovery/claude.ts +12 -12
  27. package/src/discovery/cline.ts +6 -6
  28. package/src/discovery/codex.ts +21 -21
  29. package/src/discovery/cursor.ts +9 -9
  30. package/src/discovery/gemini.ts +9 -9
  31. package/src/discovery/github.ts +6 -6
  32. package/src/discovery/helpers.ts +4 -4
  33. package/src/discovery/index.ts +16 -16
  34. package/src/discovery/mcp-json.ts +4 -4
  35. package/src/discovery/ssh.ts +4 -4
  36. package/src/discovery/vscode.ts +4 -4
  37. package/src/discovery/windsurf.ts +6 -6
  38. package/src/{core/tools/exa → exa}/company.ts +2 -3
  39. package/src/{core/tools/exa → exa}/index.ts +2 -2
  40. package/src/{core/tools/exa → exa}/linkedin.ts +2 -3
  41. package/src/{core/tools/exa → exa}/mcp-client.ts +2 -2
  42. package/src/{core/tools/exa → exa}/render.ts +3 -3
  43. package/src/{core/tools/exa → exa}/researcher.ts +1 -1
  44. package/src/{core/tools/exa → exa}/search.ts +2 -10
  45. package/src/{core/tools/exa → exa}/websets.ts +1 -1
  46. package/src/{core → exec}/bash-executor.ts +23 -7
  47. package/src/{core → export}/custom-share.ts +1 -1
  48. package/src/{core/export-html → export/html}/index.ts +3 -3
  49. package/src/{core → export}/ttsr.ts +2 -2
  50. package/src/{core → extensibility}/custom-commands/bundled/review/index.ts +4 -4
  51. package/src/{core → extensibility}/custom-commands/loader.ts +3 -3
  52. package/src/{core → extensibility}/custom-commands/types.ts +1 -1
  53. package/src/{core → extensibility}/custom-tools/loader.ts +9 -9
  54. package/src/{core → extensibility}/custom-tools/types.ts +6 -6
  55. package/src/{core → extensibility}/custom-tools/wrapper.ts +1 -1
  56. package/src/{core → extensibility}/extensions/loader.ts +8 -8
  57. package/src/{core → extensibility}/extensions/runner.ts +3 -3
  58. package/src/{core → extensibility}/extensions/types.ts +15 -15
  59. package/src/{core → extensibility}/extensions/wrapper.ts +1 -1
  60. package/src/{core → extensibility}/hooks/index.ts +1 -1
  61. package/src/{core → extensibility}/hooks/loader.ts +7 -7
  62. package/src/{core → extensibility}/hooks/runner.ts +4 -4
  63. package/src/{core → extensibility}/hooks/types.ts +9 -9
  64. package/src/{core → extensibility}/plugins/doctor.ts +1 -1
  65. package/src/{core → extensibility}/plugins/installer.ts +2 -3
  66. package/src/{core → extensibility}/plugins/paths.ts +1 -1
  67. package/src/{core → extensibility}/skills.ts +8 -48
  68. package/src/{core → extensibility}/slash-commands.ts +6 -6
  69. package/src/index.ts +127 -128
  70. package/src/internal-urls/agent-protocol.ts +126 -0
  71. package/src/internal-urls/artifact-protocol.ts +93 -0
  72. package/src/internal-urls/index.ts +28 -0
  73. package/src/internal-urls/json-query.ts +126 -0
  74. package/src/internal-urls/router.ts +69 -0
  75. package/src/internal-urls/rule-protocol.ts +56 -0
  76. package/src/internal-urls/skill-protocol.ts +112 -0
  77. package/src/internal-urls/types.ts +48 -0
  78. package/src/{core/python-executor.ts → ipy/executor.ts} +74 -13
  79. package/src/{core/python-gateway-coordinator.ts → ipy/gateway-coordinator.ts} +40 -270
  80. package/src/{core/python-kernel.ts → ipy/kernel.ts} +38 -10
  81. package/src/{core/python-prelude.py → ipy/prelude.py} +201 -8
  82. package/src/ipy/prelude.ts +3 -0
  83. package/src/{core/tools/lsp → lsp}/client.ts +7 -6
  84. package/src/{core/tools/lsp → lsp}/clients/biome-client.ts +1 -1
  85. package/src/{core/tools/lsp → lsp}/clients/index.ts +1 -1
  86. package/src/{core/tools/lsp → lsp}/clients/lsp-linter-client.ts +4 -4
  87. package/src/{core/tools/lsp → lsp}/config.ts +1 -1
  88. package/src/{core/tools/lsp → lsp}/index.ts +29 -17
  89. package/src/{core/tools/lsp → lsp}/render.ts +2 -2
  90. package/src/{core/tools/lsp → lsp}/types.ts +14 -16
  91. package/src/{core/tools/lsp → lsp}/utils.ts +1 -1
  92. package/src/main.ts +12 -12
  93. package/src/{core/mcp → mcp}/config.ts +8 -8
  94. package/src/{core/mcp → mcp}/loader.ts +5 -6
  95. package/src/{core/mcp → mcp}/manager.ts +2 -2
  96. package/src/{core/mcp → mcp}/tool-bridge.ts +35 -6
  97. package/src/{core/mcp → mcp}/tool-cache.ts +1 -1
  98. package/src/{core/mcp → mcp}/transports/http.ts +7 -1
  99. package/src/{core/mcp → mcp}/transports/stdio.ts +1 -1
  100. package/src/{core/mcp → mcp}/types.ts +1 -1
  101. package/src/migrations.ts +2 -2
  102. package/src/modes/{interactive/components → components}/armin.ts +1 -1
  103. package/src/modes/{interactive/components → components}/assistant-message.ts +1 -1
  104. package/src/modes/{interactive/components → components}/bash-execution.ts +37 -29
  105. package/src/modes/{interactive/components → components}/bordered-loader.ts +1 -1
  106. package/src/modes/{interactive/components → components}/branch-summary-message.ts +2 -2
  107. package/src/modes/{interactive/components → components}/compaction-summary-message.ts +2 -2
  108. package/src/modes/{interactive/components → components}/custom-message.ts +3 -3
  109. package/src/modes/{interactive/components → components}/diff.ts +1 -1
  110. package/src/modes/{interactive/components → components}/dynamic-border.ts +1 -1
  111. package/src/modes/{interactive/components → components}/extensions/extension-dashboard.ts +3 -3
  112. package/src/modes/{interactive/components → components}/extensions/extension-list.ts +2 -2
  113. package/src/modes/{interactive/components → components}/extensions/inspector-panel.ts +1 -1
  114. package/src/modes/{interactive/components → components}/extensions/state-manager.ts +11 -17
  115. package/src/modes/{interactive/components → components}/extensions/types.ts +1 -1
  116. package/src/modes/{interactive/components → components}/footer.ts +3 -3
  117. package/src/modes/{interactive/components → components}/history-search.ts +2 -2
  118. package/src/modes/{interactive/components → components}/hook-editor.ts +1 -1
  119. package/src/modes/{interactive/components → components}/hook-input.ts +1 -1
  120. package/src/modes/{interactive/components → components}/hook-message.ts +3 -3
  121. package/src/modes/{interactive/components → components}/hook-selector.ts +1 -1
  122. package/src/modes/{interactive/components → components}/keybinding-hints.ts +2 -2
  123. package/src/modes/{interactive/components → components}/login-dialog.ts +1 -1
  124. package/src/modes/{interactive/components → components}/model-selector.ts +5 -5
  125. package/src/modes/{interactive/components → components}/oauth-selector.ts +2 -2
  126. package/src/modes/{interactive/components → components}/plugin-settings.ts +3 -3
  127. package/src/modes/{interactive/components → components}/python-execution.ts +35 -24
  128. package/src/modes/{interactive/components → components}/queue-mode-selector.ts +1 -1
  129. package/src/modes/{interactive/components → components}/read-tool-group.ts +2 -2
  130. package/src/modes/{interactive/components → components}/session-selector.ts +3 -3
  131. package/src/modes/{interactive/components → components}/settings-defs.ts +2 -2
  132. package/src/modes/{interactive/components → components}/settings-selector.ts +2 -2
  133. package/src/modes/{interactive/components → components}/show-images-selector.ts +1 -1
  134. package/src/modes/{interactive/components → components}/status-line/segments.ts +2 -2
  135. package/src/modes/{interactive/components → components}/status-line/separators.ts +1 -1
  136. package/src/modes/{interactive/components → components}/status-line/types.ts +2 -2
  137. package/src/modes/{interactive/components → components}/status-line-segment-editor.ts +2 -2
  138. package/src/modes/{interactive/components → components}/status-line.ts +3 -3
  139. package/src/modes/{interactive/components → components}/theme-selector.ts +1 -1
  140. package/src/modes/{interactive/components → components}/thinking-selector.ts +1 -1
  141. package/src/modes/{interactive/components → components}/todo-display.ts +3 -4
  142. package/src/modes/{interactive/components → components}/todo-reminder.ts +2 -2
  143. package/src/modes/{interactive/components → components}/tool-execution.ts +8 -8
  144. package/src/modes/{interactive/components → components}/tree-selector.ts +3 -3
  145. package/src/modes/{interactive/components → components}/ttsr-notification.ts +2 -2
  146. package/src/modes/{interactive/components → components}/user-message-selector.ts +1 -1
  147. package/src/modes/{interactive/components → components}/user-message.ts +1 -1
  148. package/src/modes/{interactive/components → components}/welcome.ts +2 -2
  149. package/src/modes/{interactive/controllers → controllers}/command-controller.ts +381 -30
  150. package/src/modes/{interactive/controllers → controllers}/event-controller.ts +9 -9
  151. package/src/modes/{interactive/controllers → controllers}/extension-ui-controller.ts +8 -8
  152. package/src/modes/{interactive/controllers → controllers}/input-controller.ts +61 -13
  153. package/src/modes/{interactive/controllers → controllers}/selector-controller.ts +16 -16
  154. package/src/modes/index.ts +1 -1
  155. package/src/modes/{interactive/interactive-mode.ts → interactive-mode.ts} +20 -15
  156. package/src/modes/print-mode.ts +1 -1
  157. package/src/modes/rpc/rpc-client.ts +3 -3
  158. package/src/modes/rpc/rpc-mode.ts +3 -3
  159. package/src/modes/rpc/rpc-types.ts +3 -3
  160. package/src/modes/{interactive/theme → theme}/theme.ts +1 -1
  161. package/src/modes/{interactive/types.ts → types.ts} +10 -10
  162. package/src/modes/{interactive/utils → utils}/ui-helpers.ts +20 -27
  163. package/src/{core/tools/patch → patch}/applicator.ts +1 -1
  164. package/src/{core/tools/patch → patch}/diff.ts +1 -1
  165. package/src/{core/tools/patch → patch}/index.ts +31 -36
  166. package/src/{core/tools/patch → patch}/shared.ts +9 -6
  167. package/src/prompts/agents/explore.md +83 -46
  168. package/src/prompts/agents/init.md +9 -4
  169. package/src/prompts/agents/plan.md +8 -7
  170. package/src/prompts/agents/reviewer.md +36 -18
  171. package/src/prompts/agents/task.md +4 -4
  172. package/src/prompts/compaction/branch-summary-preamble.md +0 -1
  173. package/src/prompts/review-request.md +0 -1
  174. package/src/prompts/system/custom-system-prompt.md +2 -14
  175. package/src/prompts/system/file-operations.md +0 -2
  176. package/src/prompts/system/system-prompt.md +182 -171
  177. package/src/prompts/system/web-search.md +26 -0
  178. package/src/prompts/tools/ask.md +31 -24
  179. package/src/prompts/tools/bash.md +20 -17
  180. package/src/prompts/tools/calculator.md +9 -5
  181. package/src/prompts/tools/fetch.md +16 -0
  182. package/src/prompts/tools/find.md +15 -5
  183. package/src/prompts/tools/gemini-image.md +21 -6
  184. package/src/prompts/tools/grep.md +28 -12
  185. package/src/prompts/tools/lsp.md +35 -14
  186. package/src/prompts/tools/patch.md +39 -41
  187. package/src/prompts/tools/python.md +59 -77
  188. package/src/prompts/tools/read.md +23 -22
  189. package/src/prompts/tools/replace.md +19 -12
  190. package/src/prompts/tools/ssh.md +21 -28
  191. package/src/prompts/tools/task.md +54 -44
  192. package/src/prompts/tools/todo-write.md +52 -163
  193. package/src/prompts/tools/web-search.md +16 -9
  194. package/src/prompts/tools/write.md +13 -2
  195. package/src/{core/sdk.ts → sdk.ts} +65 -34
  196. package/src/{core → session}/agent-session.ts +157 -41
  197. package/src/{core → session}/agent-storage.ts +2 -2
  198. package/src/session/artifacts.ts +110 -0
  199. package/src/{core → session}/auth-storage.ts +525 -203
  200. package/src/{core → session}/compaction/branch-summarization.ts +5 -5
  201. package/src/{core → session}/compaction/compaction.ts +6 -6
  202. package/src/{core → session}/compaction/utils.ts +3 -3
  203. package/src/{core → session}/history-storage.ts +1 -1
  204. package/src/{core → session}/messages.ts +6 -8
  205. package/src/{core → session}/session-manager.ts +2 -2
  206. package/src/{core → session}/storage-migration.ts +2 -2
  207. package/src/session/streaming-output.ts +177 -0
  208. package/src/{core/ssh → ssh}/connection-manager.ts +1 -1
  209. package/src/{core/ssh → ssh}/ssh-executor.ts +19 -4
  210. package/src/{core/ssh → ssh}/sshfs-mount.ts +1 -1
  211. package/src/{core/system-prompt.ts → system-prompt.ts} +8 -37
  212. package/src/{core/tools/task → task}/agents.ts +8 -8
  213. package/src/{core/tools/task → task}/commands.ts +5 -6
  214. package/src/{core/tools/task → task}/discovery.ts +3 -3
  215. package/src/{core/tools/task → task}/executor.ts +34 -44
  216. package/src/{core/tools/task → task}/index.ts +206 -50
  217. package/src/{core/tools/task → task}/render.ts +80 -23
  218. package/src/{core/tools/task → task}/subprocess-tool-registry.ts +1 -1
  219. package/src/task/template.ts +47 -0
  220. package/src/{core/tools/task → task}/types.ts +19 -27
  221. package/src/{core/tools/task → task}/worker-protocol.ts +8 -4
  222. package/src/{core/tools/task → task}/worker.ts +34 -29
  223. package/src/task/worktree.ts +166 -0
  224. package/src/{core/tools → tools}/ask.ts +13 -21
  225. package/src/{core/tools → tools}/bash-interceptor.ts +1 -1
  226. package/src/{core/tools → tools}/bash.ts +61 -63
  227. package/src/{core/tools → tools}/calculator.ts +4 -4
  228. package/src/{core/tools → tools}/complete.ts +1 -1
  229. package/src/{core/tools → tools}/context.ts +2 -2
  230. package/src/{core/tools/web-fetch.ts → tools/fetch.ts} +97 -76
  231. package/src/{core/tools → tools}/find.ts +96 -107
  232. package/src/{core/tools → tools}/gemini-image.ts +420 -29
  233. package/src/{core/tools → tools}/grep.ts +155 -164
  234. package/src/{core/tools → tools}/index.ts +63 -56
  235. package/src/tools/list-limit.ts +40 -0
  236. package/src/{core/tools → tools}/ls.ts +44 -35
  237. package/src/{core/tools → tools}/notebook.ts +3 -3
  238. package/src/tools/output-meta.ts +443 -0
  239. package/src/tools/output-utils.ts +63 -0
  240. package/src/{core/tools → tools}/python.ts +106 -89
  241. package/src/tools/read.ts +882 -0
  242. package/src/{core/tools → tools}/render-utils.ts +1 -1
  243. package/src/{core/tools → tools}/renderers.ts +8 -10
  244. package/src/{core/tools → tools}/review.ts +2 -2
  245. package/src/{core/tools → tools}/ssh.ts +56 -59
  246. package/src/{core/tools → tools}/todo-write.ts +12 -23
  247. package/src/tools/tool-errors.ts +95 -0
  248. package/src/tools/tool-result.ts +92 -0
  249. package/src/{core/tools → tools}/truncate.ts +2 -2
  250. package/src/{core/tools → tools}/write.ts +15 -13
  251. package/src/utils/changelog.ts +1 -1
  252. package/src/{core → utils}/file-mentions.ts +4 -4
  253. package/src/utils/image-convert.ts +1 -1
  254. package/src/utils/image-resize.ts +1 -1
  255. package/src/utils/shell.ts +1 -1
  256. package/src/{core → utils}/title-generator.ts +4 -4
  257. package/src/utils/tools-manager.ts +1 -1
  258. package/src/{core/tools/web-scrapers → web/scrapers}/choosealicense.ts +1 -1
  259. package/src/{core/tools/web-scrapers → web/scrapers}/twitter.ts +3 -2
  260. package/src/{core/tools/web-scrapers → web/scrapers}/types.ts +4 -2
  261. package/src/{core/tools/web-scrapers → web/scrapers}/utils.ts +1 -1
  262. package/src/{core/tools/web-scrapers → web/scrapers}/youtube.ts +14 -13
  263. package/src/{core/tools/web-search → web/search}/auth.ts +4 -4
  264. package/src/{core/tools/web-search → web/search}/index.ts +22 -71
  265. package/src/{core/tools/web-search → web/search}/providers/anthropic.ts +7 -10
  266. package/src/{core/tools/web-search → web/search}/providers/exa.ts +2 -2
  267. package/src/{core/tools/web-search → web/search}/providers/perplexity.ts +4 -16
  268. package/src/{core/tools/web-search → web/search}/render.ts +3 -3
  269. package/scripts/migrate-sessions.sh +0 -93
  270. package/src/core/index.ts +0 -56
  271. package/src/core/python-prelude.ts +0 -3
  272. package/src/core/ssh-executor.ts +0 -5
  273. package/src/core/streaming-output.ts +0 -115
  274. package/src/core/tools/output.ts +0 -519
  275. package/src/core/tools/read.ts +0 -717
  276. package/src/core/tools/task/template.ts +0 -37
  277. package/src/prompts/tools/output.md +0 -47
  278. package/src/prompts/tools/web-fetch.md +0 -9
  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/tools/lsp → lsp}/defaults.json +0 -0
  299. /package/src/{core/tools/lsp → lsp}/edits.ts +0 -0
  300. /package/src/{core/tools/lsp → lsp}/lspmux.ts +0 -0
  301. /package/src/{core/tools/lsp → lsp}/rust-analyzer.ts +0 -0
  302. /package/src/{core/mcp → mcp}/client.ts +0 -0
  303. /package/src/{core/mcp → mcp}/index.ts +0 -0
  304. /package/src/{core/mcp → mcp}/json-rpc.ts +0 -0
  305. /package/src/{core/mcp → mcp}/transports/index.ts +0 -0
  306. /package/src/modes/{interactive/components → components}/countdown-timer.ts +0 -0
  307. /package/src/modes/{interactive/components → components}/custom-editor.ts +0 -0
  308. /package/src/modes/{interactive/components → components}/extensions/index.ts +0 -0
  309. /package/src/modes/{interactive/components → components}/index.ts +0 -0
  310. /package/src/modes/{interactive/components → components}/status-line/index.ts +0 -0
  311. /package/src/modes/{interactive/components → components}/status-line/presets.ts +0 -0
  312. /package/src/modes/{interactive/components → components}/visual-truncate.ts +0 -0
  313. /package/src/modes/{interactive/theme → theme}/dark.json +0 -0
  314. /package/src/modes/{interactive/theme → theme}/defaults/alabaster.json +0 -0
  315. /package/src/modes/{interactive/theme → theme}/defaults/amethyst.json +0 -0
  316. /package/src/modes/{interactive/theme → theme}/defaults/anthracite.json +0 -0
  317. /package/src/modes/{interactive/theme → theme}/defaults/basalt.json +0 -0
  318. /package/src/modes/{interactive/theme → theme}/defaults/birch.json +0 -0
  319. /package/src/modes/{interactive/theme → theme}/defaults/dark-abyss.json +0 -0
  320. /package/src/modes/{interactive/theme → theme}/defaults/dark-arctic.json +0 -0
  321. /package/src/modes/{interactive/theme → theme}/defaults/dark-aurora.json +0 -0
  322. /package/src/modes/{interactive/theme → theme}/defaults/dark-catppuccin.json +0 -0
  323. /package/src/modes/{interactive/theme → theme}/defaults/dark-cavern.json +0 -0
  324. /package/src/modes/{interactive/theme → theme}/defaults/dark-copper.json +0 -0
  325. /package/src/modes/{interactive/theme → theme}/defaults/dark-cosmos.json +0 -0
  326. /package/src/modes/{interactive/theme → theme}/defaults/dark-cyberpunk.json +0 -0
  327. /package/src/modes/{interactive/theme → theme}/defaults/dark-dracula.json +0 -0
  328. /package/src/modes/{interactive/theme → theme}/defaults/dark-eclipse.json +0 -0
  329. /package/src/modes/{interactive/theme → theme}/defaults/dark-ember.json +0 -0
  330. /package/src/modes/{interactive/theme → theme}/defaults/dark-equinox.json +0 -0
  331. /package/src/modes/{interactive/theme → theme}/defaults/dark-forest.json +0 -0
  332. /package/src/modes/{interactive/theme → theme}/defaults/dark-github.json +0 -0
  333. /package/src/modes/{interactive/theme → theme}/defaults/dark-gruvbox.json +0 -0
  334. /package/src/modes/{interactive/theme → theme}/defaults/dark-lavender.json +0 -0
  335. /package/src/modes/{interactive/theme → theme}/defaults/dark-lunar.json +0 -0
  336. /package/src/modes/{interactive/theme → theme}/defaults/dark-midnight.json +0 -0
  337. /package/src/modes/{interactive/theme → theme}/defaults/dark-monochrome.json +0 -0
  338. /package/src/modes/{interactive/theme → theme}/defaults/dark-monokai.json +0 -0
  339. /package/src/modes/{interactive/theme → theme}/defaults/dark-nebula.json +0 -0
  340. /package/src/modes/{interactive/theme → theme}/defaults/dark-nord.json +0 -0
  341. /package/src/modes/{interactive/theme → theme}/defaults/dark-ocean.json +0 -0
  342. /package/src/modes/{interactive/theme → theme}/defaults/dark-one.json +0 -0
  343. /package/src/modes/{interactive/theme → theme}/defaults/dark-rainforest.json +0 -0
  344. /package/src/modes/{interactive/theme → theme}/defaults/dark-reef.json +0 -0
  345. /package/src/modes/{interactive/theme → theme}/defaults/dark-retro.json +0 -0
  346. /package/src/modes/{interactive/theme → theme}/defaults/dark-rose-pine.json +0 -0
  347. /package/src/modes/{interactive/theme → theme}/defaults/dark-sakura.json +0 -0
  348. /package/src/modes/{interactive/theme → theme}/defaults/dark-slate.json +0 -0
  349. /package/src/modes/{interactive/theme → theme}/defaults/dark-solarized.json +0 -0
  350. /package/src/modes/{interactive/theme → theme}/defaults/dark-solstice.json +0 -0
  351. /package/src/modes/{interactive/theme → theme}/defaults/dark-starfall.json +0 -0
  352. /package/src/modes/{interactive/theme → theme}/defaults/dark-sunset.json +0 -0
  353. /package/src/modes/{interactive/theme → theme}/defaults/dark-swamp.json +0 -0
  354. /package/src/modes/{interactive/theme → theme}/defaults/dark-synthwave.json +0 -0
  355. /package/src/modes/{interactive/theme → theme}/defaults/dark-taiga.json +0 -0
  356. /package/src/modes/{interactive/theme → theme}/defaults/dark-terminal.json +0 -0
  357. /package/src/modes/{interactive/theme → theme}/defaults/dark-tokyo-night.json +0 -0
  358. /package/src/modes/{interactive/theme → theme}/defaults/dark-tundra.json +0 -0
  359. /package/src/modes/{interactive/theme → theme}/defaults/dark-twilight.json +0 -0
  360. /package/src/modes/{interactive/theme → theme}/defaults/dark-volcanic.json +0 -0
  361. /package/src/modes/{interactive/theme → theme}/defaults/graphite.json +0 -0
  362. /package/src/modes/{interactive/theme → theme}/defaults/index.ts +0 -0
  363. /package/src/modes/{interactive/theme → theme}/defaults/light-arctic.json +0 -0
  364. /package/src/modes/{interactive/theme → theme}/defaults/light-aurora-day.json +0 -0
  365. /package/src/modes/{interactive/theme → theme}/defaults/light-canyon.json +0 -0
  366. /package/src/modes/{interactive/theme → theme}/defaults/light-catppuccin.json +0 -0
  367. /package/src/modes/{interactive/theme → theme}/defaults/light-cirrus.json +0 -0
  368. /package/src/modes/{interactive/theme → theme}/defaults/light-coral.json +0 -0
  369. /package/src/modes/{interactive/theme → theme}/defaults/light-cyberpunk.json +0 -0
  370. /package/src/modes/{interactive/theme → theme}/defaults/light-dawn.json +0 -0
  371. /package/src/modes/{interactive/theme → theme}/defaults/light-dunes.json +0 -0
  372. /package/src/modes/{interactive/theme → theme}/defaults/light-eucalyptus.json +0 -0
  373. /package/src/modes/{interactive/theme → theme}/defaults/light-forest.json +0 -0
  374. /package/src/modes/{interactive/theme → theme}/defaults/light-frost.json +0 -0
  375. /package/src/modes/{interactive/theme → theme}/defaults/light-github.json +0 -0
  376. /package/src/modes/{interactive/theme → theme}/defaults/light-glacier.json +0 -0
  377. /package/src/modes/{interactive/theme → theme}/defaults/light-gruvbox.json +0 -0
  378. /package/src/modes/{interactive/theme → theme}/defaults/light-haze.json +0 -0
  379. /package/src/modes/{interactive/theme → theme}/defaults/light-honeycomb.json +0 -0
  380. /package/src/modes/{interactive/theme → theme}/defaults/light-lagoon.json +0 -0
  381. /package/src/modes/{interactive/theme → theme}/defaults/light-lavender.json +0 -0
  382. /package/src/modes/{interactive/theme → theme}/defaults/light-meadow.json +0 -0
  383. /package/src/modes/{interactive/theme → theme}/defaults/light-mint.json +0 -0
  384. /package/src/modes/{interactive/theme → theme}/defaults/light-monochrome.json +0 -0
  385. /package/src/modes/{interactive/theme → theme}/defaults/light-ocean.json +0 -0
  386. /package/src/modes/{interactive/theme → theme}/defaults/light-one.json +0 -0
  387. /package/src/modes/{interactive/theme → theme}/defaults/light-opal.json +0 -0
  388. /package/src/modes/{interactive/theme → theme}/defaults/light-orchard.json +0 -0
  389. /package/src/modes/{interactive/theme → theme}/defaults/light-paper.json +0 -0
  390. /package/src/modes/{interactive/theme → theme}/defaults/light-prism.json +0 -0
  391. /package/src/modes/{interactive/theme → theme}/defaults/light-retro.json +0 -0
  392. /package/src/modes/{interactive/theme → theme}/defaults/light-sand.json +0 -0
  393. /package/src/modes/{interactive/theme → theme}/defaults/light-savanna.json +0 -0
  394. /package/src/modes/{interactive/theme → theme}/defaults/light-solarized.json +0 -0
  395. /package/src/modes/{interactive/theme → theme}/defaults/light-soleil.json +0 -0
  396. /package/src/modes/{interactive/theme → theme}/defaults/light-sunset.json +0 -0
  397. /package/src/modes/{interactive/theme → theme}/defaults/light-synthwave.json +0 -0
  398. /package/src/modes/{interactive/theme → theme}/defaults/light-tokyo-night.json +0 -0
  399. /package/src/modes/{interactive/theme → theme}/defaults/light-wetland.json +0 -0
  400. /package/src/modes/{interactive/theme → theme}/defaults/light-zenith.json +0 -0
  401. /package/src/modes/{interactive/theme → theme}/defaults/limestone.json +0 -0
  402. /package/src/modes/{interactive/theme → theme}/defaults/mahogany.json +0 -0
  403. /package/src/modes/{interactive/theme → theme}/defaults/marble.json +0 -0
  404. /package/src/modes/{interactive/theme → theme}/defaults/obsidian.json +0 -0
  405. /package/src/modes/{interactive/theme → theme}/defaults/onyx.json +0 -0
  406. /package/src/modes/{interactive/theme → theme}/defaults/pearl.json +0 -0
  407. /package/src/modes/{interactive/theme → theme}/defaults/porcelain.json +0 -0
  408. /package/src/modes/{interactive/theme → theme}/defaults/quartz.json +0 -0
  409. /package/src/modes/{interactive/theme → theme}/defaults/sandstone.json +0 -0
  410. /package/src/modes/{interactive/theme → theme}/defaults/titanium.json +0 -0
  411. /package/src/modes/{interactive/theme → theme}/light.json +0 -0
  412. /package/src/modes/{interactive/theme → theme}/theme-schema.json +0 -0
  413. /package/src/{core/tools/patch → patch}/fuzzy.ts +0 -0
  414. /package/src/{core/tools/patch → patch}/normalize.ts +0 -0
  415. /package/src/{core/tools/patch → patch}/normative.ts +0 -0
  416. /package/src/{core/tools/patch → patch}/parser.ts +0 -0
  417. /package/src/{core/tools/patch → patch}/types.ts +0 -0
  418. /package/src/{core → session}/compaction/index.ts +0 -0
  419. /package/src/{core → session}/session-storage.ts +0 -0
  420. /package/src/{core/tools/task → task}/name-generator.ts +0 -0
  421. /package/src/{core/tools/task → task}/omp-command.ts +0 -0
  422. /package/src/{core/tools/task → task}/parallel.ts +0 -0
  423. /package/src/{core/tools → tools}/jtd-to-json-schema.ts +0 -0
  424. /package/src/{core/tools → tools}/path-utils.ts +0 -0
  425. /package/src/{core → utils}/event-bus.ts +0 -0
  426. /package/src/{core → utils}/frontmatter.ts +0 -0
  427. /package/src/{core → utils}/terminal-notify.ts +0 -0
  428. /package/src/{core → utils}/timings.ts +0 -0
  429. /package/src/{core → utils}/utils.ts +0 -0
  430. /package/src/{core/tools/web-scrapers → web/scrapers}/artifacthub.ts +0 -0
  431. /package/src/{core/tools/web-scrapers → web/scrapers}/arxiv.ts +0 -0
  432. /package/src/{core/tools/web-scrapers → web/scrapers}/aur.ts +0 -0
  433. /package/src/{core/tools/web-scrapers → web/scrapers}/biorxiv.ts +0 -0
  434. /package/src/{core/tools/web-scrapers → web/scrapers}/bluesky.ts +0 -0
  435. /package/src/{core/tools/web-scrapers → web/scrapers}/brew.ts +0 -0
  436. /package/src/{core/tools/web-scrapers → web/scrapers}/cheatsh.ts +0 -0
  437. /package/src/{core/tools/web-scrapers → web/scrapers}/chocolatey.ts +0 -0
  438. /package/src/{core/tools/web-scrapers → web/scrapers}/cisa-kev.ts +0 -0
  439. /package/src/{core/tools/web-scrapers → web/scrapers}/clojars.ts +0 -0
  440. /package/src/{core/tools/web-scrapers → web/scrapers}/coingecko.ts +0 -0
  441. /package/src/{core/tools/web-scrapers → web/scrapers}/crates-io.ts +0 -0
  442. /package/src/{core/tools/web-scrapers → web/scrapers}/crossref.ts +0 -0
  443. /package/src/{core/tools/web-scrapers → web/scrapers}/devto.ts +0 -0
  444. /package/src/{core/tools/web-scrapers → web/scrapers}/discogs.ts +0 -0
  445. /package/src/{core/tools/web-scrapers → web/scrapers}/discourse.ts +0 -0
  446. /package/src/{core/tools/web-scrapers → web/scrapers}/dockerhub.ts +0 -0
  447. /package/src/{core/tools/web-scrapers → web/scrapers}/fdroid.ts +0 -0
  448. /package/src/{core/tools/web-scrapers → web/scrapers}/firefox-addons.ts +0 -0
  449. /package/src/{core/tools/web-scrapers → web/scrapers}/flathub.ts +0 -0
  450. /package/src/{core/tools/web-scrapers → web/scrapers}/github-gist.ts +0 -0
  451. /package/src/{core/tools/web-scrapers → web/scrapers}/github.ts +0 -0
  452. /package/src/{core/tools/web-scrapers → web/scrapers}/gitlab.ts +0 -0
  453. /package/src/{core/tools/web-scrapers → web/scrapers}/go-pkg.ts +0 -0
  454. /package/src/{core/tools/web-scrapers → web/scrapers}/hackage.ts +0 -0
  455. /package/src/{core/tools/web-scrapers → web/scrapers}/hackernews.ts +0 -0
  456. /package/src/{core/tools/web-scrapers → web/scrapers}/hex.ts +0 -0
  457. /package/src/{core/tools/web-scrapers → web/scrapers}/huggingface.ts +0 -0
  458. /package/src/{core/tools/web-scrapers → web/scrapers}/iacr.ts +0 -0
  459. /package/src/{core/tools/web-scrapers → web/scrapers}/index.ts +0 -0
  460. /package/src/{core/tools/web-scrapers → web/scrapers}/jetbrains-marketplace.ts +0 -0
  461. /package/src/{core/tools/web-scrapers → web/scrapers}/lemmy.ts +0 -0
  462. /package/src/{core/tools/web-scrapers → web/scrapers}/lobsters.ts +0 -0
  463. /package/src/{core/tools/web-scrapers → web/scrapers}/mastodon.ts +0 -0
  464. /package/src/{core/tools/web-scrapers → web/scrapers}/maven.ts +0 -0
  465. /package/src/{core/tools/web-scrapers → web/scrapers}/mdn.ts +0 -0
  466. /package/src/{core/tools/web-scrapers → web/scrapers}/metacpan.ts +0 -0
  467. /package/src/{core/tools/web-scrapers → web/scrapers}/musicbrainz.ts +0 -0
  468. /package/src/{core/tools/web-scrapers → web/scrapers}/npm.ts +0 -0
  469. /package/src/{core/tools/web-scrapers → web/scrapers}/nuget.ts +0 -0
  470. /package/src/{core/tools/web-scrapers → web/scrapers}/nvd.ts +0 -0
  471. /package/src/{core/tools/web-scrapers → web/scrapers}/ollama.ts +0 -0
  472. /package/src/{core/tools/web-scrapers → web/scrapers}/open-vsx.ts +0 -0
  473. /package/src/{core/tools/web-scrapers → web/scrapers}/opencorporates.ts +0 -0
  474. /package/src/{core/tools/web-scrapers → web/scrapers}/openlibrary.ts +0 -0
  475. /package/src/{core/tools/web-scrapers → web/scrapers}/orcid.ts +0 -0
  476. /package/src/{core/tools/web-scrapers → web/scrapers}/osv.ts +0 -0
  477. /package/src/{core/tools/web-scrapers → web/scrapers}/packagist.ts +0 -0
  478. /package/src/{core/tools/web-scrapers → web/scrapers}/pub-dev.ts +0 -0
  479. /package/src/{core/tools/web-scrapers → web/scrapers}/pubmed.ts +0 -0
  480. /package/src/{core/tools/web-scrapers → web/scrapers}/pypi.ts +0 -0
  481. /package/src/{core/tools/web-scrapers → web/scrapers}/rawg.ts +0 -0
  482. /package/src/{core/tools/web-scrapers → web/scrapers}/readthedocs.ts +0 -0
  483. /package/src/{core/tools/web-scrapers → web/scrapers}/reddit.ts +0 -0
  484. /package/src/{core/tools/web-scrapers → web/scrapers}/repology.ts +0 -0
  485. /package/src/{core/tools/web-scrapers → web/scrapers}/rfc.ts +0 -0
  486. /package/src/{core/tools/web-scrapers → web/scrapers}/rubygems.ts +0 -0
  487. /package/src/{core/tools/web-scrapers → web/scrapers}/searchcode.ts +0 -0
  488. /package/src/{core/tools/web-scrapers → web/scrapers}/sec-edgar.ts +0 -0
  489. /package/src/{core/tools/web-scrapers → web/scrapers}/semantic-scholar.ts +0 -0
  490. /package/src/{core/tools/web-scrapers → web/scrapers}/snapcraft.ts +0 -0
  491. /package/src/{core/tools/web-scrapers → web/scrapers}/sourcegraph.ts +0 -0
  492. /package/src/{core/tools/web-scrapers → web/scrapers}/spdx.ts +0 -0
  493. /package/src/{core/tools/web-scrapers → web/scrapers}/spotify.ts +0 -0
  494. /package/src/{core/tools/web-scrapers → web/scrapers}/stackoverflow.ts +0 -0
  495. /package/src/{core/tools/web-scrapers → web/scrapers}/terraform.ts +0 -0
  496. /package/src/{core/tools/web-scrapers → web/scrapers}/tldr.ts +0 -0
  497. /package/src/{core/tools/web-scrapers → web/scrapers}/vimeo.ts +0 -0
  498. /package/src/{core/tools/web-scrapers → web/scrapers}/vscode-marketplace.ts +0 -0
  499. /package/src/{core/tools/web-scrapers → web/scrapers}/w3c.ts +0 -0
  500. /package/src/{core/tools/web-scrapers → web/scrapers}/wikidata.ts +0 -0
  501. /package/src/{core/tools/web-scrapers → web/scrapers}/wikipedia.ts +0 -0
  502. /package/src/{core/tools/web-search → web/search}/types.ts +0 -0
@@ -4,9 +4,9 @@
4
4
 
5
5
  import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
6
6
  import type { Model } from "@oh-my-pi/pi-ai";
7
- import { theme } from "../../modes/interactive/theme/theme";
8
- import type { ModelRegistry } from "../model-registry";
9
- import type { SessionManager } from "../session-manager";
7
+ import type { ModelRegistry } from "$c/config/model-registry";
8
+ import { theme } from "$c/modes/theme/theme";
9
+ import type { SessionManager } from "$c/session/session-manager";
10
10
  import type {
11
11
  AppendEntryHandler,
12
12
  BranchHandler,
@@ -40,7 +40,7 @@ import type {
40
40
  export type HookErrorListener = (error: HookError) => void;
41
41
 
42
42
  // Re-export execCommand for backward compatibility
43
- export { execCommand } from "../exec";
43
+ export { execCommand } from "$c/exec/exec";
44
44
 
45
45
  /** No-op UI context used when no UI is available */
46
46
  const noOpUIContext: HookUIContext = {
@@ -8,23 +8,23 @@
8
8
  import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
9
9
  import type { ImageContent, Message, Model, TextContent, ToolResultMessage } from "@oh-my-pi/pi-ai";
10
10
  import type { Component, TUI } from "@oh-my-pi/pi-tui";
11
- import type { Theme } from "../../modes/interactive/theme/theme";
12
- import type { CompactionPreparation, CompactionResult } from "../compaction/index";
13
- import type { ExecOptions, ExecResult } from "../exec";
14
- import type { HookMessage } from "../messages";
15
- import type { ModelRegistry } from "../model-registry";
11
+ import type { ModelRegistry } from "$c/config/model-registry";
12
+ import type { ExecOptions, ExecResult } from "$c/exec/exec";
13
+ import type { Theme } from "$c/modes/theme/theme";
14
+ import type { EditToolDetails } from "$c/patch";
15
+ import type { CompactionPreparation, CompactionResult } from "$c/session/compaction/index";
16
+ import type { HookMessage } from "$c/session/messages";
16
17
  import type {
17
18
  BranchSummaryEntry,
18
19
  CompactionEntry,
19
20
  ReadonlySessionManager,
20
21
  SessionEntry,
21
22
  SessionManager,
22
- } from "../session-manager";
23
- import type { BashToolDetails, FindToolDetails, GrepToolDetails, LsToolDetails, ReadToolDetails } from "../tools/index";
24
- import type { EditToolDetails } from "../tools/patch";
23
+ } from "$c/session/session-manager";
24
+ import type { BashToolDetails, FindToolDetails, GrepToolDetails, LsToolDetails, ReadToolDetails } from "$c/tools/index";
25
25
 
26
26
  // Re-export for backward compatibility
27
- export type { ExecOptions, ExecResult } from "../exec";
27
+ export type { ExecOptions, ExecResult } from "$c/exec/exec";
28
28
 
29
29
  /**
30
30
  * UI context for hooks to request interactive UI from the harness.
@@ -1,4 +1,4 @@
1
- import { theme } from "../../modes/interactive/theme/theme";
1
+ import { theme } from "$c/modes/theme/theme";
2
2
  import type { DoctorCheck } from "./types";
3
3
 
4
4
  export async function runDoctorChecks(): Promise<DoctorCheck[]> {
@@ -1,6 +1,7 @@
1
+ import { lstatSync, symlinkSync, unlinkSync } from "node:fs";
1
2
  import { mkdir } from "node:fs/promises";
2
3
  import { join, resolve } from "node:path";
3
- import { getAgentDir } from "../../config";
4
+ import { getAgentDir } from "$c/config";
4
5
  import type { InstalledPlugin } from "./types";
5
6
 
6
7
  const PLUGINS_DIR = join(getAgentDir(), "plugins");
@@ -176,7 +177,6 @@ export async function linkPlugin(localPath: string): Promise<void> {
176
177
 
177
178
  // Remove existing if present
178
179
  try {
179
- const { unlinkSync, lstatSync } = await import("fs");
180
180
  const stat = lstatSync(linkPath);
181
181
  if (stat.isSymbolicLink() || stat.isDirectory()) {
182
182
  unlinkSync(linkPath);
@@ -186,6 +186,5 @@ export async function linkPlugin(localPath: string): Promise<void> {
186
186
  }
187
187
 
188
188
  // Create symlink using fs instead of shell command
189
- const { symlinkSync } = await import("fs");
190
189
  symlinkSync(absolutePath, linkPath);
191
190
  }
@@ -1,6 +1,6 @@
1
1
  import { homedir } from "node:os";
2
2
  import { join } from "node:path";
3
- import { CONFIG_DIR_NAME, getConfigDirPaths } from "../../config";
3
+ import { CONFIG_DIR_NAME, getConfigDirPaths } from "$c/config";
4
4
 
5
5
  // =============================================================================
6
6
  // Plugin Directory Paths
@@ -2,13 +2,12 @@ import { readdirSync, readFileSync, statSync } from "node:fs";
2
2
  import { realpath } from "node:fs/promises";
3
3
  import { basename, join } from "node:path";
4
4
  import { logger } from "@oh-my-pi/pi-utils";
5
- import { minimatch } from "minimatch";
6
- import { skillCapability } from "../capability/skill";
7
- import type { SourceMeta } from "../capability/types";
8
- import type { Skill as CapabilitySkill, SkillFrontmatter as ImportedSkillFrontmatter } from "../discovery";
9
- import { loadCapability } from "../discovery";
10
- import { parseFrontmatter } from "./frontmatter";
11
- import type { SkillsSettings } from "./settings-manager";
5
+ import { skillCapability } from "$c/capability/skill";
6
+ import type { SourceMeta } from "$c/capability/types";
7
+ import type { SkillsSettings } from "$c/config/settings-manager";
8
+ import type { Skill as CapabilitySkill, SkillFrontmatter as ImportedSkillFrontmatter } from "$c/discovery";
9
+ import { loadCapability } from "$c/discovery";
10
+ import { parseFrontmatter } from "$c/utils/frontmatter";
12
11
 
13
12
  // Re-export SkillFrontmatter for backward compatibility
14
13
  export type { ImportedSkillFrontmatter as SkillFrontmatter };
@@ -169,45 +168,6 @@ function scanDirectoryForSkills(dir: string): LoadSkillsResult {
169
168
  return { skills, warnings };
170
169
  }
171
170
 
172
- /**
173
- * Format skills for inclusion in a system prompt.
174
- * Uses XML format per Agent Skills standard.
175
- * See: https://agentskills.io/integrate-skills
176
- */
177
- export function formatSkillsForPrompt(skills: Skill[]): string {
178
- if (skills.length === 0) {
179
- return "";
180
- }
181
-
182
- const lines = [
183
- "\n\nThe following skills provide specialized instructions for specific tasks.",
184
- "Use the read tool to load a skill's file when the task matches its description.",
185
- "",
186
- "<available_skills>",
187
- ];
188
-
189
- for (const skill of skills) {
190
- lines.push(" <skill>");
191
- lines.push(` <name>${escapeXml(skill.name)}</name>`);
192
- lines.push(` <description>${escapeXml(skill.description)}</description>`);
193
- lines.push(` <location>${escapeXml(skill.filePath)}</location>`);
194
- lines.push(" </skill>");
195
- }
196
-
197
- lines.push("</available_skills>");
198
-
199
- return lines.join("\n");
200
- }
201
-
202
- function escapeXml(str: string): string {
203
- return str
204
- .replace(/&/g, "&amp;")
205
- .replace(/</g, "&lt;")
206
- .replace(/>/g, "&gt;")
207
- .replace(/"/g, "&quot;")
208
- .replace(/'/g, "&apos;");
209
- }
210
-
211
171
  export interface LoadSkillsOptions extends SkillsSettings {
212
172
  /** Working directory for project-local skills. Default: process.cwd() */
213
173
  cwd?: string;
@@ -258,13 +218,13 @@ export async function loadSkills(options: LoadSkillsOptions = {}): Promise<LoadS
258
218
  // Check if skill name matches any of the include patterns
259
219
  function matchesIncludePatterns(name: string): boolean {
260
220
  if (includeSkills.length === 0) return true;
261
- return includeSkills.some((pattern) => minimatch(name, pattern));
221
+ return includeSkills.some((pattern) => new Bun.Glob(pattern).match(name));
262
222
  }
263
223
 
264
224
  // Check if skill name matches any of the ignore patterns
265
225
  function matchesIgnorePatterns(name: string): boolean {
266
226
  if (ignoredSkills.length === 0) return false;
267
- return ignoredSkills.some((pattern) => minimatch(name, pattern));
227
+ return ignoredSkills.some((pattern) => new Bun.Glob(pattern).match(name));
268
228
  }
269
229
 
270
230
  // Filter skills by source and patterns first
@@ -1,9 +1,9 @@
1
- import { slashCommandCapability } from "../capability/slash-command";
2
- import type { SlashCommand } from "../discovery";
3
- import { loadCapability } from "../discovery";
4
- import { parseFrontmatter } from "./frontmatter";
5
- import { renderPromptTemplate } from "./prompt-templates";
6
- import { EMBEDDED_COMMAND_TEMPLATES } from "./tools/task/commands";
1
+ import { slashCommandCapability } from "$c/capability/slash-command";
2
+ import { renderPromptTemplate } from "$c/config/prompt-templates";
3
+ import type { SlashCommand } from "$c/discovery";
4
+ import { loadCapability } from "$c/discovery";
5
+ import { EMBEDDED_COMMAND_TEMPLATES } from "$c/task/commands";
6
+ import { parseFrontmatter } from "$c/utils/frontmatter";
7
7
 
8
8
  /**
9
9
  * Represents a custom slash command loaded from a file
package/src/index.ts CHANGED
@@ -7,41 +7,66 @@ export { StringEnum } from "@oh-my-pi/pi-ai";
7
7
  export { Container, Markdown, Spacer, Text } from "@oh-my-pi/pi-tui";
8
8
  // Logging
9
9
  export { logger } from "@oh-my-pi/pi-utils";
10
- export { getAgentDir, VERSION } from "./config";
10
+ export type { FileDiagnosticsResult } from "$c/lsp/index";
11
+ // UI components for extensions
11
12
  export {
12
- AgentSession,
13
- type AgentSessionConfig,
14
- type AgentSessionEvent,
15
- type AgentSessionEventListener,
16
- type ModelCycleResult,
17
- type PromptOptions,
18
- type SessionStats,
19
- } from "./core/agent-session";
20
- // Auth and model registry
21
- export { type ApiKeyCredential, type AuthCredential, AuthStorage, type OAuthCredential } from "./core/auth-storage";
22
- // Compaction
13
+ ArminComponent,
14
+ AssistantMessageComponent,
15
+ BashExecutionComponent,
16
+ BorderedLoader,
17
+ BranchSummaryMessageComponent,
18
+ CompactionSummaryMessageComponent,
19
+ CustomEditor,
20
+ CustomMessageComponent,
21
+ DynamicBorder,
22
+ FooterComponent,
23
+ HookEditorComponent as ExtensionEditorComponent,
24
+ HookInputComponent as ExtensionInputComponent,
25
+ HookSelectorComponent as ExtensionSelectorComponent,
26
+ LoginDialogComponent,
27
+ ModelSelectorComponent,
28
+ OAuthSelectorComponent,
29
+ type RenderDiffOptions,
30
+ renderDiff,
31
+ SessionSelectorComponent,
32
+ type SettingsCallbacks,
33
+ SettingsSelectorComponent,
34
+ ShowImagesSelectorComponent,
35
+ ThemeSelectorComponent,
36
+ ThinkingSelectorComponent,
37
+ ToolExecutionComponent,
38
+ type ToolExecutionOptions,
39
+ TreeSelectorComponent,
40
+ truncateToVisualLines,
41
+ UserMessageComponent,
42
+ UserMessageSelectorComponent,
43
+ type VisualTruncateResult,
44
+ } from "$c/modes/components/index";
45
+ // Theme utilities for custom tools
23
46
  export {
24
- type BranchPreparation,
25
- type BranchSummaryResult,
26
- type CollectEntriesResult,
27
- type CompactionResult,
28
- type CutPointResult,
29
- calculateContextTokens,
30
- collectEntriesForBranchSummary,
31
- compact,
32
- DEFAULT_COMPACTION_SETTINGS,
33
- estimateTokens,
34
- type FileOperations,
35
- findCutPoint,
36
- findTurnStartIndex,
37
- type GenerateBranchSummaryOptions,
38
- generateBranchSummary,
39
- generateSummary,
40
- getLastAssistantUsage,
41
- prepareBranchEntries,
42
- serializeConversation,
43
- shouldCompact,
44
- } from "./core/compaction/index";
47
+ getLanguageFromPath,
48
+ getMarkdownTheme,
49
+ getSelectListTheme,
50
+ getSettingsListTheme,
51
+ highlightCode,
52
+ initTheme,
53
+ Theme,
54
+ type ThemeColor,
55
+ } from "$c/modes/theme/theme";
56
+ export { getAgentDir, VERSION } from "./config";
57
+ export { formatKeyHint, formatKeyHints } from "./config/keybindings";
58
+ export { ModelRegistry } from "./config/model-registry";
59
+ // Prompt templates
60
+ export type { PromptTemplate } from "./config/prompt-templates";
61
+ export {
62
+ type CompactionSettings,
63
+ type ImageSettings,
64
+ type LspSettings,
65
+ type RetrySettings,
66
+ type Settings,
67
+ SettingsManager,
68
+ type SkillsSettings,
69
+ } from "./config/settings-manager";
45
70
  // Custom commands
46
71
  export type {
47
72
  CustomCommand,
@@ -50,7 +75,7 @@ export type {
50
75
  CustomCommandSource,
51
76
  CustomCommandsLoadResult,
52
77
  LoadedCustomCommand,
53
- } from "./core/custom-commands/types";
78
+ } from "./extensibility/custom-commands/types";
54
79
  export type {
55
80
  AgentToolUpdateCallback,
56
81
  CustomTool,
@@ -63,9 +88,9 @@ export type {
63
88
  ExecResult,
64
89
  LoadedCustomTool,
65
90
  RenderResultOptions,
66
- } from "./core/custom-tools/index";
91
+ } from "./extensibility/custom-tools/index";
67
92
  // Custom tools
68
- export { CustomToolLoader, discoverAndLoadCustomTools, loadCustomTools } from "./core/custom-tools/index";
93
+ export { CustomToolLoader, discoverAndLoadCustomTools, loadCustomTools } from "./extensibility/custom-tools/index";
69
94
  export type {
70
95
  AppAction,
71
96
  Extension,
@@ -97,7 +122,7 @@ export type {
97
122
  UserBashEventResult,
98
123
  UserPythonEvent,
99
124
  UserPythonEventResult,
100
- } from "./core/extensions/index";
125
+ } from "./extensibility/extensions/index";
101
126
  // Extension types and utilities
102
127
  export {
103
128
  discoverAndLoadExtensions,
@@ -110,14 +135,34 @@ export {
110
135
  isLsToolResult,
111
136
  isReadToolResult,
112
137
  isWriteToolResult,
113
- } from "./core/extensions/index";
138
+ } from "./extensibility/extensions/index";
114
139
  // Hook system types (legacy re-export)
115
- export type * from "./core/hooks/index";
116
- export { formatKeyHint, formatKeyHints } from "./core/keybindings";
117
- export { convertToLlm } from "./core/messages";
118
- export { ModelRegistry } from "./core/model-registry";
119
- // Prompt templates
120
- export type { PromptTemplate } from "./core/prompt-templates";
140
+ export type * from "./extensibility/hooks/index";
141
+ // Skills
142
+ export {
143
+ type LoadSkillsFromDirOptions,
144
+ type LoadSkillsResult,
145
+ loadSkills,
146
+ loadSkillsFromDir,
147
+ type Skill,
148
+ type SkillFrontmatter,
149
+ type SkillWarning,
150
+ } from "./extensibility/skills";
151
+ // Slash commands
152
+ export { type FileSlashCommand, loadSlashCommands as discoverSlashCommands } from "./extensibility/slash-commands";
153
+ // Main entry point
154
+ export { main } from "./main";
155
+ // Run modes for programmatic SDK usage
156
+ export {
157
+ InteractiveMode,
158
+ type InteractiveModeOptions,
159
+ type PrintModeOptions,
160
+ RpcClient,
161
+ type RpcClientOptions,
162
+ type RpcEventListener,
163
+ runPrintMode,
164
+ runRpcMode,
165
+ } from "./modes/index";
121
166
  // SDK for programmatic usage
122
167
  export {
123
168
  // Factory
@@ -149,7 +194,42 @@ export {
149
194
  ReadTool,
150
195
  type ToolSession,
151
196
  WriteTool,
152
- } from "./core/sdk";
197
+ } from "./sdk";
198
+ export {
199
+ AgentSession,
200
+ type AgentSessionConfig,
201
+ type AgentSessionEvent,
202
+ type AgentSessionEventListener,
203
+ type ModelCycleResult,
204
+ type PromptOptions,
205
+ type SessionStats,
206
+ } from "./session/agent-session";
207
+ // Auth and model registry
208
+ export { type ApiKeyCredential, type AuthCredential, AuthStorage, type OAuthCredential } from "./session/auth-storage";
209
+ // Compaction
210
+ export {
211
+ type BranchPreparation,
212
+ type BranchSummaryResult,
213
+ type CollectEntriesResult,
214
+ type CompactionResult,
215
+ type CutPointResult,
216
+ calculateContextTokens,
217
+ collectEntriesForBranchSummary,
218
+ compact,
219
+ DEFAULT_COMPACTION_SETTINGS,
220
+ estimateTokens,
221
+ type FileOperations,
222
+ findCutPoint,
223
+ findTurnStartIndex,
224
+ type GenerateBranchSummaryOptions,
225
+ generateBranchSummary,
226
+ generateSummary,
227
+ getLastAssistantUsage,
228
+ prepareBranchEntries,
229
+ serializeConversation,
230
+ shouldCompact,
231
+ } from "./session/compaction/index";
232
+ export { convertToLlm } from "./session/messages";
153
233
  export {
154
234
  type BranchSummaryEntry,
155
235
  buildSessionContext,
@@ -171,29 +251,7 @@ export {
171
251
  SessionManager,
172
252
  type SessionMessageEntry,
173
253
  type ThinkingLevelChangeEntry,
174
- } from "./core/session-manager";
175
- export {
176
- type CompactionSettings,
177
- type ImageSettings,
178
- type LspSettings,
179
- type RetrySettings,
180
- type Settings,
181
- SettingsManager,
182
- type SkillsSettings,
183
- } from "./core/settings-manager";
184
- // Skills
185
- export {
186
- formatSkillsForPrompt,
187
- type LoadSkillsFromDirOptions,
188
- type LoadSkillsResult,
189
- loadSkills,
190
- loadSkillsFromDir,
191
- type Skill,
192
- type SkillFrontmatter,
193
- type SkillWarning,
194
- } from "./core/skills";
195
- // Slash commands
196
- export { type FileSlashCommand, loadSlashCommands as discoverSlashCommands } from "./core/slash-commands";
254
+ } from "./session/session-manager";
197
255
  // Tools (detail types and utilities)
198
256
  export {
199
257
  type BashToolDetails,
@@ -217,64 +275,5 @@ export {
217
275
  truncateLine,
218
276
  truncateTail,
219
277
  type WriteToolDetails,
220
- } from "./core/tools/index";
221
- export type { FileDiagnosticsResult } from "./core/tools/lsp/index";
222
- // Main entry point
223
- export { main } from "./main";
224
- // Run modes for programmatic SDK usage
225
- export {
226
- InteractiveMode,
227
- type InteractiveModeOptions,
228
- type PrintModeOptions,
229
- RpcClient,
230
- type RpcClientOptions,
231
- type RpcEventListener,
232
- runPrintMode,
233
- runRpcMode,
234
- } from "./modes/index";
235
- // UI components for extensions
236
- export {
237
- ArminComponent,
238
- AssistantMessageComponent,
239
- BashExecutionComponent,
240
- BorderedLoader,
241
- BranchSummaryMessageComponent,
242
- CompactionSummaryMessageComponent,
243
- CustomEditor,
244
- CustomMessageComponent,
245
- DynamicBorder,
246
- FooterComponent,
247
- HookEditorComponent as ExtensionEditorComponent,
248
- HookInputComponent as ExtensionInputComponent,
249
- HookSelectorComponent as ExtensionSelectorComponent,
250
- LoginDialogComponent,
251
- ModelSelectorComponent,
252
- OAuthSelectorComponent,
253
- type RenderDiffOptions,
254
- renderDiff,
255
- SessionSelectorComponent,
256
- type SettingsCallbacks,
257
- SettingsSelectorComponent,
258
- ShowImagesSelectorComponent,
259
- ThemeSelectorComponent,
260
- ThinkingSelectorComponent,
261
- ToolExecutionComponent,
262
- type ToolExecutionOptions,
263
- TreeSelectorComponent,
264
- truncateToVisualLines,
265
- UserMessageComponent,
266
- UserMessageSelectorComponent,
267
- type VisualTruncateResult,
268
- } from "./modes/interactive/components/index";
269
- // Theme utilities for custom tools
270
- export {
271
- getLanguageFromPath,
272
- getMarkdownTheme,
273
- getSelectListTheme,
274
- getSettingsListTheme,
275
- highlightCode,
276
- initTheme,
277
- Theme,
278
- type ThemeColor,
279
- } from "./modes/interactive/theme/theme";
278
+ } from "./tools/index";
280
279
  export { getShellConfig } from "./utils/shell";
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Protocol handler for agent:// URLs.
3
+ *
4
+ * Resolves agent output IDs to artifact files in the session directory.
5
+ *
6
+ * URL forms:
7
+ * - agent://<id> - Full output content
8
+ * - agent://<id>/<path> - JSON extraction via path form
9
+ * - agent://<id>?q=<query> - JSON extraction via query form
10
+ */
11
+
12
+ import * as fs from "node:fs";
13
+ import * as path from "node:path";
14
+ import { applyQuery, pathToQuery } from "./json-query";
15
+ import type { InternalResource, InternalUrl, ProtocolHandler } from "./types";
16
+
17
+ export interface AgentProtocolOptions {
18
+ /**
19
+ * Returns the artifacts directory path, or null if no session.
20
+ * Artifacts directory is the session file path without .jsonl extension.
21
+ */
22
+ getArtifactsDir: () => string | null;
23
+ }
24
+
25
+ /**
26
+ * List available output IDs in artifacts directory.
27
+ */
28
+ function listAvailableOutputs(artifactsDir: string): string[] {
29
+ try {
30
+ const files = fs.readdirSync(artifactsDir);
31
+ return files.filter((f) => f.endsWith(".md")).map((f) => f.replace(".md", ""));
32
+ } catch {
33
+ return [];
34
+ }
35
+ }
36
+
37
+ /**
38
+ * Handler for agent:// URLs.
39
+ *
40
+ * Resolves output IDs like "reviewer_0" to their artifact files,
41
+ * with optional JSON extraction.
42
+ */
43
+ export class AgentProtocolHandler implements ProtocolHandler {
44
+ readonly scheme = "agent";
45
+
46
+ constructor(private readonly options: AgentProtocolOptions) {}
47
+
48
+ async resolve(url: InternalUrl): Promise<InternalResource> {
49
+ const artifactsDir = this.options.getArtifactsDir();
50
+ if (!artifactsDir) {
51
+ throw new Error("No session - agent outputs unavailable");
52
+ }
53
+
54
+ if (!fs.existsSync(artifactsDir)) {
55
+ throw new Error("No artifacts directory found");
56
+ }
57
+
58
+ // Extract output ID from host
59
+ const outputId = url.rawHost || url.hostname;
60
+ if (!outputId) {
61
+ throw new Error("agent:// URL requires an output ID: agent://<id>");
62
+ }
63
+
64
+ // Check for conflicting extraction methods
65
+ const urlPath = url.pathname;
66
+ const queryParam = url.searchParams.get("q");
67
+ const hasPathExtraction = urlPath && urlPath !== "/" && urlPath !== "";
68
+ const hasQueryExtraction = queryParam !== null && queryParam !== "";
69
+
70
+ if (hasPathExtraction && hasQueryExtraction) {
71
+ throw new Error("agent:// URL cannot combine path extraction with ?q=");
72
+ }
73
+
74
+ // Load the output file
75
+ const outputPath = path.join(artifactsDir, `${outputId}.md`);
76
+ if (!fs.existsSync(outputPath)) {
77
+ const available = listAvailableOutputs(artifactsDir);
78
+ const availableStr = available.length > 0 ? available.join(", ") : "none";
79
+ throw new Error(`Not found: ${outputId}\nAvailable: ${availableStr}`);
80
+ }
81
+
82
+ const rawContent = await Bun.file(outputPath).text();
83
+ const notes: string[] = [];
84
+
85
+ // Handle extraction
86
+ let content = rawContent;
87
+ let contentType: InternalResource["contentType"] = "text/markdown";
88
+
89
+ if (hasPathExtraction || hasQueryExtraction) {
90
+ // Parse JSON
91
+ let jsonValue: unknown;
92
+ try {
93
+ jsonValue = JSON.parse(rawContent);
94
+ } catch (err) {
95
+ const message = err instanceof Error ? err.message : String(err);
96
+ throw new Error(`Output ${outputId} is not valid JSON: ${message}`);
97
+ }
98
+
99
+ // Convert path to query if needed
100
+ const query = hasPathExtraction ? pathToQuery(urlPath) : queryParam!;
101
+
102
+ if (query) {
103
+ const extracted = applyQuery(jsonValue, query);
104
+ try {
105
+ content = JSON.stringify(extracted, null, 2) ?? "null";
106
+ } catch {
107
+ content = String(extracted);
108
+ }
109
+ notes.push(`Extracted: ${query}`);
110
+ } else {
111
+ // Empty path/query means return full JSON
112
+ content = JSON.stringify(jsonValue, null, 2);
113
+ }
114
+ contentType = "application/json";
115
+ }
116
+
117
+ return {
118
+ url: url.href,
119
+ content,
120
+ contentType,
121
+ size: Buffer.byteLength(content, "utf-8"),
122
+ sourcePath: outputPath,
123
+ notes,
124
+ };
125
+ }
126
+ }