@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
package/src/main.ts CHANGED
@@ -11,6 +11,7 @@ import { createInterface } from "node:readline/promises";
11
11
  import { type ImageContent, supportsXhigh } from "@oh-my-pi/pi-ai";
12
12
  import { postmortem } from "@oh-my-pi/pi-utils";
13
13
  import chalk from "chalk";
14
+ import { initTheme, stopThemeWatcher } from "$c/modes/theme/theme";
14
15
  import { type Args, parseArgs, printHelp } from "./cli/args";
15
16
  import { parseConfigArgs, printConfigHelp, runConfigCommand } from "./cli/config-cli";
16
17
  import { processFileArguments } from "./cli/file-processor";
@@ -21,21 +22,20 @@ import { parseSetupArgs, printSetupHelp, runSetupCommand } from "./cli/setup-cli
21
22
  import { parseStatsArgs, printStatsHelp, runStatsCommand } from "./cli/stats-cli";
22
23
  import { parseUpdateArgs, printUpdateHelp, runUpdateCommand } from "./cli/update-cli";
23
24
  import { findConfigFile, getModelsPath, VERSION } from "./config";
24
- import type { AgentSession } from "./core/agent-session";
25
- import { exportFromFile } from "./core/export-html/index";
26
- import type { ExtensionUIContext } from "./core/index";
27
- import type { ModelRegistry } from "./core/model-registry";
28
- import { parseModelPattern, parseModelString, resolveModelScope, type ScopedModel } from "./core/model-resolver";
29
- import { type CreateAgentSessionOptions, createAgentSession, discoverAuthStorage, discoverModels } from "./core/sdk";
30
- import { type SessionInfo, SessionManager } from "./core/session-manager";
31
- import { SettingsManager } from "./core/settings-manager";
32
- import { resolvePromptInput } from "./core/system-prompt";
33
- import { printTimings, time } from "./core/timings";
25
+ import type { ModelRegistry } from "./config/model-registry";
26
+ import { parseModelPattern, parseModelString, resolveModelScope, type ScopedModel } from "./config/model-resolver";
27
+ import { SettingsManager } from "./config/settings-manager";
34
28
  import { initializeWithSettings } from "./discovery";
29
+ import { exportFromFile } from "./export/html/index";
30
+ import type { ExtensionUIContext } from "./extensibility/extensions/types";
35
31
  import { runMigrations, showDeprecationWarnings } from "./migrations";
36
32
  import { InteractiveMode, runPrintMode, runRpcMode } from "./modes/index";
37
- import { initTheme, stopThemeWatcher } from "./modes/interactive/theme/theme";
33
+ import { type CreateAgentSessionOptions, createAgentSession, discoverAuthStorage, discoverModels } from "./sdk";
34
+ import type { AgentSession } from "./session/agent-session";
35
+ import { type SessionInfo, SessionManager } from "./session/session-manager";
36
+ import { resolvePromptInput } from "./system-prompt";
38
37
  import { getChangelogPath, getNewEntries, parseChangelog } from "./utils/changelog";
38
+ import { printTimings, time } from "./utils/timings";
39
39
 
40
40
  async function checkForNewVersion(currentVersion: string): Promise<string | undefined> {
41
41
  try {
@@ -85,7 +85,7 @@ async function runInteractiveMode(
85
85
  initialMessages: string[],
86
86
  setExtensionUIContext: (uiContext: ExtensionUIContext, hasUI: boolean) => void,
87
87
  lspServers: Array<{ name: string; status: "ready" | "error"; fileTypes: string[] }> | undefined,
88
- mcpManager: import("./core/mcp/index").MCPManager | undefined,
88
+ mcpManager: import("./mcp/index").MCPManager | undefined,
89
89
  initialMessage?: string,
90
90
  initialImages?: ImageContent[],
91
91
  ): Promise<void> {
@@ -4,9 +4,9 @@
4
4
  * Uses the capability system to load MCP servers from multiple sources.
5
5
  */
6
6
 
7
- import { mcpCapability } from "../../capability/mcp";
8
- import type { MCPServer } from "../../discovery";
9
- import { loadCapability } from "../../discovery";
7
+ import { mcpCapability } from "$c/capability/mcp";
8
+ import type { MCPServer } from "$c/discovery";
9
+ import { loadCapability } from "$c/discovery";
10
10
  import type { MCPServerConfig } from "./types";
11
11
 
12
12
  /** Options for loading MCP configs */
@@ -24,7 +24,7 @@ export interface LoadMCPConfigsResult {
24
24
  /** Extracted Exa API keys (if any were filtered) */
25
25
  exaApiKeys: string[];
26
26
  /** Source metadata for each server */
27
- sources: Record<string, import("../../capability/types").SourceMeta>;
27
+ sources: Record<string, import("../capability/types").SourceMeta>;
28
28
  }
29
29
 
30
30
  /**
@@ -90,7 +90,7 @@ export async function loadAllMCPConfigs(cwd: string, options?: LoadMCPConfigsOpt
90
90
 
91
91
  // Convert to legacy format and preserve source metadata
92
92
  const configs: Record<string, MCPServerConfig> = {};
93
- const sources: Record<string, import("../../capability/types").SourceMeta> = {};
93
+ const sources: Record<string, import("../capability/types").SourceMeta> = {};
94
94
  for (const server of servers) {
95
95
  configs[server.name] = convertToLegacyConfig(server);
96
96
  sources[server.name] = server._source;
@@ -180,7 +180,7 @@ export interface ExaFilterResult {
180
180
  /** Extracted Exa API keys (if any) */
181
181
  exaApiKeys: string[];
182
182
  /** Source metadata for remaining servers */
183
- sources: Record<string, import("../../capability/types").SourceMeta>;
183
+ sources: Record<string, import("../capability/types").SourceMeta>;
184
184
  }
185
185
 
186
186
  /**
@@ -189,10 +189,10 @@ export interface ExaFilterResult {
189
189
  */
190
190
  export function filterExaMCPServers(
191
191
  configs: Record<string, MCPServerConfig>,
192
- sources: Record<string, import("../../capability/types").SourceMeta>,
192
+ sources: Record<string, import("../capability/types").SourceMeta>,
193
193
  ): ExaFilterResult {
194
194
  const filtered: Record<string, MCPServerConfig> = {};
195
- const filteredSources: Record<string, import("../../capability/types").SourceMeta> = {};
195
+ const filteredSources: Record<string, import("../capability/types").SourceMeta> = {};
196
196
  const exaApiKeys: string[] = [];
197
197
 
198
198
  for (const [name, config] of Object.entries(configs)) {
@@ -5,10 +5,9 @@
5
5
  */
6
6
 
7
7
  import { logger } from "@oh-my-pi/pi-utils";
8
- import { AgentStorage } from "../agent-storage";
9
- import type { LoadedCustomTool } from "../custom-tools/types";
8
+ import type { LoadedCustomTool } from "$c/extensibility/custom-tools/types";
9
+ import { AgentStorage } from "$c/session/agent-storage";
10
10
  import { type MCPLoadResult, MCPManager } from "./manager";
11
- import { parseMCPToolName } from "./tool-bridge";
12
11
  import { MCPToolCache } from "./tool-cache";
13
12
 
14
13
  /** Result from loading MCP tools */
@@ -80,9 +79,9 @@ export async function discoverAndLoadMCPTools(cwd: string, options?: MCPToolsLoa
80
79
 
81
80
  // Convert MCP tools to LoadedCustomTool format
82
81
  const loadedTools: LoadedCustomTool[] = result.tools.map((tool) => {
83
- // Parse the MCP tool name to get server name
84
- const parsed = parseMCPToolName(tool.name);
85
- const serverName = parsed?.serverName;
82
+ // MCPTool and DeferredMCPTool have these properties
83
+ const mcpTool = tool as { mcpServerName?: string };
84
+ const serverName = mcpTool.mcpServerName;
86
85
 
87
86
  // Get provider info from manager's connection if available
88
87
  const connection = serverName ? manager.getConnection(serverName) : undefined;
@@ -7,7 +7,7 @@
7
7
 
8
8
  import { logger } from "@oh-my-pi/pi-utils";
9
9
  import type { TSchema } from "@sinclair/typebox";
10
- import type { CustomTool } from "../custom-tools/types";
10
+ import type { CustomTool } from "$c/extensibility/custom-tools/types";
11
11
  import { connectToServer, disconnectServer, listTools } from "./client";
12
12
  import { loadAllMCPConfigs, validateServerConfig } from "./config";
13
13
  import type { MCPToolDetails } from "./tool-bridge";
@@ -15,7 +15,7 @@ import { DeferredMCPTool, MCPTool } from "./tool-bridge";
15
15
  import type { MCPToolCache } from "./tool-cache";
16
16
  import type { MCPServerConfig, MCPServerConnection, MCPToolDefinition } from "./types";
17
17
 
18
- type SourceMeta = import("../../capability/types").SourceMeta;
18
+ type SourceMeta = import("../capability/types").SourceMeta;
19
19
 
20
20
  type ToolLoadResult = {
21
21
  connection: MCPServerConnection;
@@ -6,8 +6,8 @@
6
6
 
7
7
  import type { AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
8
8
  import type { TSchema } from "@sinclair/typebox";
9
- import type { SourceMeta } from "../../capability/types";
10
- import type { CustomTool, CustomToolContext, CustomToolResult } from "../custom-tools/types";
9
+ import type { SourceMeta } from "$c/capability/types";
10
+ import type { CustomTool, CustomToolContext, CustomToolResult } from "$c/extensibility/custom-tools/types";
11
11
  import { callTool } from "./client";
12
12
  import type { MCPContent, MCPServerConnection, MCPToolDefinition } from "./types";
13
13
 
@@ -66,21 +66,38 @@ function formatMCPContent(content: MCPContent[]): string {
66
66
 
67
67
  /**
68
68
  * Create a unique tool name for an MCP tool.
69
- * Prefixes with server name to avoid conflicts.
69
+ *
70
+ * Prefixes with server name to avoid conflicts. If the tool name already
71
+ * starts with the server name (e.g., server "puppeteer" with tool
72
+ * "puppeteer_screenshot"), strips the redundant prefix to produce
73
+ * "mcp_puppeteer_screenshot" instead of "mcp_puppeteer_puppeteer_screenshot".
70
74
  */
71
75
  export function createMCPToolName(serverName: string, toolName: string): string {
72
- // Use underscore separator since tool names can't have special chars
73
- return `mcp_${serverName}_${toolName}`;
76
+ // Strip redundant server name prefix from tool name if present
77
+ const prefixWithUnderscore = `${serverName}_`;
78
+ const prefixWithHyphen = `${serverName}-`;
79
+
80
+ let normalizedToolName = toolName;
81
+ if (toolName.startsWith(prefixWithUnderscore)) {
82
+ normalizedToolName = toolName.slice(prefixWithUnderscore.length);
83
+ } else if (toolName.startsWith(prefixWithHyphen)) {
84
+ normalizedToolName = toolName.slice(prefixWithHyphen.length);
85
+ }
86
+
87
+ return `mcp_${serverName}_${normalizedToolName}`;
74
88
  }
75
89
 
76
90
  /**
77
91
  * Parse an MCP tool name back to server and tool components.
92
+ *
93
+ * Note: This returns the normalized tool name (with server prefix stripped).
94
+ * The original MCP tool name may have had the server name as a prefix.
78
95
  */
79
96
  export function parseMCPToolName(name: string): { serverName: string; toolName: string } | null {
80
97
  if (!name.startsWith("mcp_")) return null;
81
98
 
82
99
  const rest = name.slice(4);
83
- const underscoreIdx = rest.lastIndexOf("_");
100
+ const underscoreIdx = rest.indexOf("_");
84
101
  if (underscoreIdx === -1) return null;
85
102
 
86
103
  return {
@@ -97,6 +114,10 @@ export class MCPTool implements CustomTool<TSchema, MCPToolDetails> {
97
114
  public readonly label: string;
98
115
  public readonly description: string;
99
116
  public readonly parameters: TSchema;
117
+ /** Original MCP tool name (before normalization) */
118
+ public readonly mcpToolName: string;
119
+ /** Server name */
120
+ public readonly mcpServerName: string;
100
121
 
101
122
  /** Create MCPTool instances for all tools from an MCP server connection */
102
123
  static fromTools(connection: MCPServerConnection, tools: MCPToolDefinition[]): MCPTool[] {
@@ -111,6 +132,8 @@ export class MCPTool implements CustomTool<TSchema, MCPToolDetails> {
111
132
  this.label = `${connection.name}/${tool.name}`;
112
133
  this.description = tool.description ?? `MCP tool from ${connection.name}`;
113
134
  this.parameters = convertSchema(tool.inputSchema);
135
+ this.mcpToolName = tool.name;
136
+ this.mcpServerName = connection.name;
114
137
  }
115
138
 
116
139
  async execute(
@@ -168,6 +191,10 @@ export class DeferredMCPTool implements CustomTool<TSchema, MCPToolDetails> {
168
191
  public readonly label: string;
169
192
  public readonly description: string;
170
193
  public readonly parameters: TSchema;
194
+ /** Original MCP tool name (before normalization) */
195
+ public readonly mcpToolName: string;
196
+ /** Server name */
197
+ public readonly mcpServerName: string;
171
198
  private readonly fallbackProvider: string | undefined;
172
199
  private readonly fallbackProviderName: string | undefined;
173
200
 
@@ -191,6 +218,8 @@ export class DeferredMCPTool implements CustomTool<TSchema, MCPToolDetails> {
191
218
  this.label = `${serverName}/${tool.name}`;
192
219
  this.description = tool.description ?? `MCP tool from ${serverName}`;
193
220
  this.parameters = convertSchema(tool.inputSchema);
221
+ this.mcpToolName = tool.name;
222
+ this.mcpServerName = serverName;
194
223
  this.fallbackProvider = source?.provider;
195
224
  this.fallbackProviderName = source?.providerName;
196
225
  }
@@ -5,7 +5,7 @@
5
5
  */
6
6
 
7
7
  import { logger } from "@oh-my-pi/pi-utils";
8
- import type { AgentStorage } from "../agent-storage";
8
+ import type { AgentStorage } from "$c/session/agent-storage";
9
9
  import type { MCPServerConfig, MCPToolDefinition } from "./types";
10
10
 
11
11
  const CACHE_VERSION = 1;
@@ -5,7 +5,13 @@
5
5
  * Based on MCP spec 2025-03-26.
6
6
  */
7
7
 
8
- import type { JsonRpcMessage, JsonRpcResponse, MCPHttpServerConfig, MCPSseServerConfig, MCPTransport } from "../types";
8
+ import type {
9
+ JsonRpcMessage,
10
+ JsonRpcResponse,
11
+ MCPHttpServerConfig,
12
+ MCPSseServerConfig,
13
+ MCPTransport,
14
+ } from "$c/mcp/types";
9
15
 
10
16
  /** Generate unique request ID */
11
17
  function generateId(): string {
@@ -6,7 +6,7 @@
6
6
  */
7
7
 
8
8
  import { type Subprocess, spawn } from "bun";
9
- import type { JsonRpcResponse, MCPStdioServerConfig, MCPTransport } from "../types";
9
+ import type { JsonRpcResponse, MCPStdioServerConfig, MCPTransport } from "$c/mcp/types";
10
10
 
11
11
  /** Generate unique request ID */
12
12
  function generateId(): string {
@@ -218,7 +218,7 @@ export interface MCPServerConnection {
218
218
  /** Cached tools (populated on demand) */
219
219
  tools?: MCPToolDefinition[];
220
220
  /** Source metadata (for display) */
221
- _source?: import("../../capability/types").SourceMeta;
221
+ _source?: import("../capability/types").SourceMeta;
222
222
  }
223
223
 
224
224
  /** MCP tool with server context */
package/src/migrations.ts CHANGED
@@ -6,9 +6,9 @@ import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, w
6
6
  import { join } from "node:path";
7
7
  import { logger } from "@oh-my-pi/pi-utils";
8
8
  import chalk from "chalk";
9
+ import { AgentStorage } from "$c/session/agent-storage";
10
+ import type { AuthCredential } from "$c/session/auth-storage";
9
11
  import { getAgentDbPath, getAgentDir, getBinDir } from "./config";
10
- import { AgentStorage } from "./core/agent-storage";
11
- import type { AuthCredential } from "./core/auth-storage";
12
12
 
13
13
  /**
14
14
  * Migrate legacy oauth.json and settings.json apiKeys to agent.db.
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  import type { Component, TUI } from "@oh-my-pi/pi-tui";
6
- import { theme } from "../theme/theme";
6
+ import { theme } from "$c/modes/theme/theme";
7
7
 
8
8
  // XBM image: 31x36 pixels, LSB first, 1=background, 0=foreground
9
9
  const WIDTH = 31;
@@ -1,6 +1,6 @@
1
1
  import type { AssistantMessage } from "@oh-my-pi/pi-ai";
2
2
  import { Container, Markdown, Spacer, Text } from "@oh-my-pi/pi-tui";
3
- import { getMarkdownTheme, theme } from "../theme/theme";
3
+ import { getMarkdownTheme, theme } from "$c/modes/theme/theme";
4
4
 
5
5
  /**
6
6
  * Component that renders a complete assistant message
@@ -4,13 +4,9 @@
4
4
 
5
5
  import { Container, Loader, Spacer, Text, type TUI } from "@oh-my-pi/pi-tui";
6
6
  import stripAnsi from "strip-ansi";
7
- import {
8
- DEFAULT_MAX_BYTES,
9
- DEFAULT_MAX_LINES,
10
- type TruncationResult,
11
- truncateTail,
12
- } from "../../../core/tools/truncate";
13
- import { getSymbolTheme, theme } from "../theme/theme";
7
+ import { getSymbolTheme, theme } from "$c/modes/theme/theme";
8
+ import type { TruncationMeta } from "$c/tools/output-meta";
9
+ import { formatSize } from "$c/tools/truncate";
14
10
  import { DynamicBorder } from "./dynamic-border";
15
11
  import { truncateToVisualLines } from "./visual-truncate";
16
12
 
@@ -23,8 +19,7 @@ export class BashExecutionComponent extends Container {
23
19
  private status: "running" | "complete" | "cancelled" | "error" = "running";
24
20
  private exitCode: number | undefined = undefined;
25
21
  private loader: Loader;
26
- private truncationResult?: TruncationResult;
27
- private fullOutputPath?: string;
22
+ private truncation?: TruncationMeta;
28
23
  private expanded = false;
29
24
  private contentContainer: Container;
30
25
 
@@ -78,9 +73,7 @@ export class BashExecutionComponent extends Container {
78
73
  }
79
74
 
80
75
  appendOutput(chunk: string): void {
81
- // Strip ANSI codes and normalize line endings
82
- // Note: binary data is already sanitized in tui-renderer.ts executeBashCommand
83
- const clean = stripAnsi(chunk).replace(/\r\n/g, "\n").replace(/\r/g, "\n");
76
+ const clean = this.normalizeOutput(chunk);
84
77
 
85
78
  // Append to output lines
86
79
  const newLines = clean.split("\n");
@@ -98,8 +91,7 @@ export class BashExecutionComponent extends Container {
98
91
  setComplete(
99
92
  exitCode: number | undefined,
100
93
  cancelled: boolean,
101
- truncationResult?: TruncationResult,
102
- fullOutputPath?: string,
94
+ options?: { output?: string; truncation?: TruncationMeta },
103
95
  ): void {
104
96
  this.exitCode = exitCode;
105
97
  this.status = cancelled
@@ -107,8 +99,10 @@ export class BashExecutionComponent extends Container {
107
99
  : exitCode !== 0 && exitCode !== undefined && exitCode !== null
108
100
  ? "error"
109
101
  : "complete";
110
- this.truncationResult = truncationResult;
111
- this.fullOutputPath = fullOutputPath;
102
+ this.truncation = options?.truncation;
103
+ if (options?.output !== undefined) {
104
+ this.setOutput(options.output);
105
+ }
112
106
 
113
107
  // Stop loader
114
108
  this.loader.stop();
@@ -117,15 +111,7 @@ export class BashExecutionComponent extends Container {
117
111
  }
118
112
 
119
113
  private updateDisplay(): void {
120
- // Apply truncation for LLM context limits (same limits as bash tool)
121
- const fullOutput = this.outputLines.join("\n");
122
- const contextTruncation = truncateTail(fullOutput, {
123
- maxLines: DEFAULT_MAX_LINES,
124
- maxBytes: DEFAULT_MAX_BYTES,
125
- });
126
-
127
- // Get the lines to potentially display (after context truncation)
128
- const availableLines = contextTruncation.content ? contextTruncation.content.split("\n") : [];
114
+ const availableLines = this.outputLines;
129
115
 
130
116
  // Apply preview truncation based on expanded state
131
117
  const previewLogicalLines = availableLines.slice(-PREVIEW_LINES);
@@ -177,10 +163,21 @@ export class BashExecutionComponent extends Container {
177
163
  statusParts.push(theme.fg("error", `(exit ${this.exitCode})`));
178
164
  }
179
165
 
180
- // Add truncation warning (context truncation, not preview truncation)
181
- const wasTruncated = this.truncationResult?.truncated || contextTruncation.truncated;
182
- if (wasTruncated && this.fullOutputPath) {
183
- statusParts.push(theme.fg("warning", `Output truncated. Full output: ${this.fullOutputPath}`));
166
+ if (this.truncation) {
167
+ const warnings: string[] = [];
168
+ if (this.truncation.artifactId) {
169
+ warnings.push(`Full output: artifact://${this.truncation.artifactId}`);
170
+ }
171
+ if (this.truncation.truncatedBy === "lines") {
172
+ warnings.push(
173
+ `Truncated: showing ${this.truncation.outputLines} of ${this.truncation.totalLines} lines`,
174
+ );
175
+ } else {
176
+ warnings.push(
177
+ `Truncated: ${this.truncation.outputLines} lines shown (${formatSize(this.truncation.outputBytes)} limit)`,
178
+ );
179
+ }
180
+ statusParts.push(theme.fg("warning", warnings.join(". ")));
184
181
  }
185
182
 
186
183
  if (statusParts.length > 0) {
@@ -189,6 +186,17 @@ export class BashExecutionComponent extends Container {
189
186
  }
190
187
  }
191
188
 
189
+ private normalizeOutput(text: string): string {
190
+ // Strip ANSI codes and normalize line endings
191
+ // Note: binary data is already sanitized in tui-renderer.ts executeBashCommand
192
+ return stripAnsi(text).replace(/\r\n/g, "\n").replace(/\r/g, "\n");
193
+ }
194
+
195
+ private setOutput(output: string): void {
196
+ const clean = this.normalizeOutput(output);
197
+ this.outputLines = clean ? clean.split("\n") : [];
198
+ }
199
+
192
200
  /**
193
201
  * Get the raw output for creating BashExecutionMessage.
194
202
  */
@@ -1,5 +1,5 @@
1
1
  import { CancellableLoader, Container, Spacer, Text, type TUI } from "@oh-my-pi/pi-tui";
2
- import type { Theme } from "../theme/theme";
2
+ import type { Theme } from "$c/modes/theme/theme";
3
3
  import { DynamicBorder } from "./dynamic-border";
4
4
 
5
5
  /** Loader wrapped with borders for hook UI */
@@ -1,6 +1,6 @@
1
1
  import { Box, Markdown, Spacer, Text } from "@oh-my-pi/pi-tui";
2
- import type { BranchSummaryMessage } from "../../../core/messages";
3
- import { getMarkdownTheme, theme } from "../theme/theme";
2
+ import { getMarkdownTheme, theme } from "$c/modes/theme/theme";
3
+ import type { BranchSummaryMessage } from "$c/session/messages";
4
4
 
5
5
  /**
6
6
  * Component that renders a branch summary message with collapsed/expanded state.
@@ -1,6 +1,6 @@
1
1
  import { Box, Markdown, Spacer, Text } from "@oh-my-pi/pi-tui";
2
- import type { CompactionSummaryMessage } from "../../../core/messages";
3
- import { getMarkdownTheme, theme } from "../theme/theme";
2
+ import { getMarkdownTheme, theme } from "$c/modes/theme/theme";
3
+ import type { CompactionSummaryMessage } from "$c/session/messages";
4
4
 
5
5
  /**
6
6
  * Component that renders a compaction message with collapsed/expanded state.
@@ -1,9 +1,9 @@
1
1
  import type { TextContent } from "@oh-my-pi/pi-ai";
2
2
  import type { Component } from "@oh-my-pi/pi-tui";
3
3
  import { Box, Container, Markdown, Spacer, Text } from "@oh-my-pi/pi-tui";
4
- import type { MessageRenderer } from "../../../core/extensions/types";
5
- import type { CustomMessage } from "../../../core/messages";
6
- import { getMarkdownTheme, theme } from "../theme/theme";
4
+ import type { MessageRenderer } from "$c/extensibility/extensions/types";
5
+ import { getMarkdownTheme, theme } from "$c/modes/theme/theme";
6
+ import type { CustomMessage } from "$c/session/messages";
7
7
 
8
8
  /**
9
9
  * Component that renders a custom message entry from extensions.
@@ -1,5 +1,5 @@
1
1
  import * as Diff from "diff";
2
- import { theme } from "../theme/theme";
2
+ import { theme } from "$c/modes/theme/theme";
3
3
 
4
4
  /**
5
5
  * Parse diff line to extract prefix, line number, and content.
@@ -1,5 +1,5 @@
1
1
  import type { Component } from "@oh-my-pi/pi-tui";
2
- import { theme } from "../theme/theme";
2
+ import { theme } from "$c/modes/theme/theme";
3
3
 
4
4
  /**
5
5
  * Dynamic border component that adjusts to viewport width.
@@ -13,9 +13,9 @@
13
13
  */
14
14
 
15
15
  import { type Component, Container, matchesKey, Spacer, Text, truncateToWidth, visibleWidth } from "@oh-my-pi/pi-tui";
16
- import type { SettingsManager } from "../../../../core/settings-manager";
17
- import { theme } from "../../theme/theme";
18
- import { DynamicBorder } from "../dynamic-border";
16
+ import type { SettingsManager } from "$c/config/settings-manager";
17
+ import { DynamicBorder } from "$c/modes/components/dynamic-border";
18
+ import { theme } from "$c/modes/theme/theme";
19
19
  import { ExtensionList } from "./extension-list";
20
20
  import { InspectorPanel } from "./inspector-panel";
21
21
  import { applyFilter, createInitialState, filterByProvider, refreshState, toggleProvider } from "./state-manager";
@@ -7,8 +7,8 @@
7
7
  */
8
8
 
9
9
  import { type Component, matchesKey, truncateToWidth, visibleWidth } from "@oh-my-pi/pi-tui";
10
- import { isProviderEnabled } from "../../../../discovery";
11
- import { theme } from "../../theme/theme";
10
+ import { isProviderEnabled } from "$c/discovery";
11
+ import { theme } from "$c/modes/theme/theme";
12
12
  import { applyFilter } from "./state-manager";
13
13
  import type { Extension, ExtensionKind, ExtensionState } from "./types";
14
14
 
@@ -6,7 +6,7 @@
6
6
 
7
7
  import { homedir } from "node:os";
8
8
  import { type Component, truncateToWidth, wrapTextWithAnsi } from "@oh-my-pi/pi-tui";
9
- import { theme } from "../../theme/theme";
9
+ import { theme } from "$c/modes/theme/theme";
10
10
  import type { Extension, ExtensionState } from "./types";
11
11
 
12
12
  export class InspectorPanel implements Component {
@@ -4,23 +4,17 @@
4
4
  */
5
5
 
6
6
  import { logger } from "@oh-my-pi/pi-utils";
7
- import type { ContextFile } from "../../../../capability/context-file";
8
- import type { ExtensionModule } from "../../../../capability/extension-module";
9
- import type { Hook } from "../../../../capability/hook";
10
- import type { MCPServer } from "../../../../capability/mcp";
11
- import type { Prompt } from "../../../../capability/prompt";
12
- import type { Rule } from "../../../../capability/rule";
13
- import type { Skill } from "../../../../capability/skill";
14
- import type { SlashCommand } from "../../../../capability/slash-command";
15
- import type { CustomTool } from "../../../../capability/tool";
16
- import type { SourceMeta } from "../../../../capability/types";
17
- import {
18
- disableProvider,
19
- enableProvider,
20
- getAllProvidersInfo,
21
- isProviderEnabled,
22
- loadCapability,
23
- } from "../../../../discovery";
7
+ import type { ContextFile } from "$c/capability/context-file";
8
+ import type { ExtensionModule } from "$c/capability/extension-module";
9
+ import type { Hook } from "$c/capability/hook";
10
+ import type { MCPServer } from "$c/capability/mcp";
11
+ import type { Prompt } from "$c/capability/prompt";
12
+ import type { Rule } from "$c/capability/rule";
13
+ import type { Skill } from "$c/capability/skill";
14
+ import type { SlashCommand } from "$c/capability/slash-command";
15
+ import type { CustomTool } from "$c/capability/tool";
16
+ import type { SourceMeta } from "$c/capability/types";
17
+ import { disableProvider, enableProvider, getAllProvidersInfo, isProviderEnabled, loadCapability } from "$c/discovery";
24
18
  import type {
25
19
  DashboardState,
26
20
  Extension,
@@ -2,7 +2,7 @@
2
2
  * Types for the Extension Control Center dashboard.
3
3
  */
4
4
 
5
- import type { SourceMeta } from "../../../../capability/types";
5
+ import type { SourceMeta } from "$c/capability/types";
6
6
 
7
7
  /**
8
8
  * Extension kinds matching capability types.
@@ -2,9 +2,9 @@ import { existsSync, type FSWatcher, readFileSync, watch } from "node:fs";
2
2
  import type { AssistantMessage } from "@oh-my-pi/pi-ai";
3
3
  import { type Component, truncateToWidth, visibleWidth } from "@oh-my-pi/pi-tui";
4
4
  import { dirname, join } from "path";
5
- import type { AgentSession } from "../../../core/agent-session";
6
- import { shortenPath } from "../../../core/tools/render-utils";
7
- import { theme } from "../theme/theme";
5
+ import { theme } from "$c/modes/theme/theme";
6
+ import type { AgentSession } from "$c/session/agent-session";
7
+ import { shortenPath } from "$c/tools/render-utils";
8
8
 
9
9
  /**
10
10
  * Sanitize text for display in a single-line status.
@@ -8,8 +8,8 @@ import {
8
8
  truncateToWidth,
9
9
  visibleWidth,
10
10
  } from "@oh-my-pi/pi-tui";
11
- import type { HistoryEntry, HistoryStorage } from "../../../core/history-storage";
12
- import { theme } from "../theme/theme";
11
+ import { theme } from "$c/modes/theme/theme";
12
+ import type { HistoryEntry, HistoryStorage } from "$c/session/history-storage";
13
13
  import { DynamicBorder } from "./dynamic-border";
14
14
 
15
15
  class HistoryResultsList implements Component {
@@ -8,7 +8,7 @@ import * as os from "node:os";
8
8
  import * as path from "node:path";
9
9
  import { Container, Editor, matchesKey, Spacer, Text, type TUI } from "@oh-my-pi/pi-tui";
10
10
  import { nanoid } from "nanoid";
11
- import { getEditorTheme, theme } from "../theme/theme";
11
+ import { getEditorTheme, theme } from "$c/modes/theme/theme";
12
12
  import { DynamicBorder } from "./dynamic-border";
13
13
 
14
14
  export class HookEditorComponent extends Container {
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  import { Container, Input, matchesKey, Spacer, Text, type TUI } from "@oh-my-pi/pi-tui";
6
- import { theme } from "../theme/theme";
6
+ import { theme } from "$c/modes/theme/theme";
7
7
  import { CountdownTimer } from "./countdown-timer";
8
8
  import { DynamicBorder } from "./dynamic-border";
9
9