@averyyy/pi-coding-agent 0.87.1-piclient.1 → 0.99.1-piclient.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (738) hide show
  1. package/CHANGELOG.md +98 -0
  2. package/dist/bun/cli.d.ts.map +1 -1
  3. package/dist/bun/restore-sandbox-env.d.ts.map +1 -1
  4. package/dist/bun/restore-sandbox-env.js.map +1 -1
  5. package/dist/bun/runtime-setup.d.ts.map +1 -1
  6. package/dist/bun/runtime-setup.js +4 -1
  7. package/dist/bun/runtime-setup.js.map +1 -1
  8. package/dist/bun/sandbox-env-setup.d.ts.map +1 -1
  9. package/dist/bundle/chunks/anthropic-messages-A6EXUBG6.js +6 -0
  10. package/dist/bundle/chunks/anthropic.js +2 -2
  11. package/dist/bundle/chunks/azure-openai-responses-YZ3Q2WVP.js +2 -0
  12. package/dist/bundle/chunks/bedrock-converse-stream.js +2 -2
  13. package/dist/bundle/chunks/chunk-3YXHSP6S.js +21 -0
  14. package/dist/bundle/chunks/chunk-7BINYQ2V.js +1548 -0
  15. package/dist/bundle/chunks/chunk-7JGR3GZN.js +11 -0
  16. package/dist/bundle/chunks/chunk-F6ORSP6L.js +187 -0
  17. package/dist/bundle/chunks/chunk-FJTXMIZI.js +150 -0
  18. package/dist/bundle/chunks/chunk-H3QXYIF7.js +31 -0
  19. package/dist/bundle/chunks/{chunk-S7SZN6Z3.js → chunk-HSPCVFST.js} +1 -1
  20. package/dist/bundle/chunks/chunk-J4CWPC4N.js +2 -0
  21. package/dist/bundle/chunks/chunk-KYJKN5BJ.js +2 -0
  22. package/dist/bundle/chunks/chunk-RO6I2QFQ.js +4 -0
  23. package/dist/bundle/chunks/{chunk-XDUWOHPL.js → chunk-S3GGRYIO.js} +2 -2
  24. package/dist/bundle/chunks/chunk-UTB4DTYQ.js +2 -0
  25. package/dist/bundle/chunks/{chunk-UZNGGY6N.js → chunk-V7V43FNB.js} +3 -3
  26. package/dist/bundle/chunks/{chunk-FUXEF6JQ.js → chunk-W2DOMZSC.js} +1 -1
  27. package/dist/bundle/chunks/chunk-WVKBMRQX.js +82 -0
  28. package/dist/bundle/chunks/cli-WF6HDHBO.js +49 -0
  29. package/dist/bundle/chunks/cloudflare-workers-ai-system-one-XJQQYGGU.js +2 -0
  30. package/dist/bundle/chunks/codemode-worker.js +295 -0
  31. package/dist/bundle/chunks/execute-AVGAUHMT.js +308 -0
  32. package/dist/bundle/chunks/github-copilot.js +1 -1
  33. package/dist/bundle/chunks/google-generative-ai-CQAKKJTA.js +2 -0
  34. package/dist/bundle/chunks/google-vertex-AE36YXJU.js +2 -0
  35. package/dist/bundle/chunks/{lib-HGQMNYVT.js → lib-TEDK3E5I.js} +2 -2
  36. package/dist/bundle/chunks/llama-cpp-classify-PJJYKPLD.js +22 -0
  37. package/dist/bundle/chunks/mistral-conversations-KEYTXJM7.js +5 -0
  38. package/dist/bundle/chunks/openai-chatgpt.js +75 -0
  39. package/dist/bundle/chunks/{openai-codex-responses-SG7PGUUZ.js → openai-codex-responses-FUE7WESF.js} +2 -2
  40. package/dist/bundle/chunks/openai-codex.js +2 -2
  41. package/dist/bundle/chunks/{openai-completions-OBX42CLD.js → openai-completions-XW2Q5HVC.js} +2 -2
  42. package/dist/bundle/chunks/openai-responses-ZUXFVYPI.js +3 -0
  43. package/dist/bundle/chunks/{openrouter-images-N4XVVFSD.js → openrouter-images-TPQ4V6OR.js} +1 -1
  44. package/dist/bundle/chunks/openrouter.js +2 -2
  45. package/dist/bundle/chunks/{pi-messages-GFKBWJHZ.js → pi-messages-TM5SOOIW.js} +2 -2
  46. package/dist/bundle/chunks/radius.js +2 -2
  47. package/dist/bundle/chunks/runtime-6ZC4MGWD.js +2 -0
  48. package/dist/bundle/chunks/typesafe-system-one-E7A4HNJI.js +2 -0
  49. package/dist/bundle/chunks/virtual-modules-H7OCXN6W.js +2 -0
  50. package/dist/bundle/cli-runtime.js +1 -1
  51. package/dist/bundle/index.js +1 -1
  52. package/dist/bundle/rpc-entry.js +1 -1
  53. package/dist/cli/args.d.ts.map +1 -1
  54. package/dist/cli/args.js +4 -3
  55. package/dist/cli/args.js.map +1 -1
  56. package/dist/cli/auth-check.d.ts.map +1 -1
  57. package/dist/cli/auth-check.js.map +1 -1
  58. package/dist/cli/auth-command.d.ts.map +1 -1
  59. package/dist/cli/auth-command.js.map +1 -1
  60. package/dist/cli/config-selector.d.ts.map +1 -1
  61. package/dist/cli/config-selector.js.map +1 -1
  62. package/dist/cli/credential-print.d.ts.map +1 -1
  63. package/dist/cli/credential-print.js.map +1 -1
  64. package/dist/cli/file-processor.d.ts.map +1 -1
  65. package/dist/cli/file-processor.js.map +1 -1
  66. package/dist/cli/initial-message.d.ts +1 -1
  67. package/dist/cli/initial-message.d.ts.map +1 -1
  68. package/dist/cli/initial-message.js.map +1 -1
  69. package/dist/cli/list-models.d.ts.map +1 -1
  70. package/dist/cli/list-models.js.map +1 -1
  71. package/dist/cli/project-trust.d.ts.map +1 -1
  72. package/dist/cli/project-trust.js.map +1 -1
  73. package/dist/cli/session-picker.d.ts.map +1 -1
  74. package/dist/cli/session-picker.js.map +1 -1
  75. package/dist/cli/setup.d.ts.map +1 -1
  76. package/dist/cli/setup.js.map +1 -1
  77. package/dist/cli/startup-ui.d.ts.map +1 -1
  78. package/dist/cli/startup-ui.js +38 -30
  79. package/dist/cli/startup-ui.js.map +1 -1
  80. package/dist/cli.d.ts.map +1 -1
  81. package/dist/config.d.ts +18 -4
  82. package/dist/config.d.ts.map +1 -1
  83. package/dist/config.js +30 -4
  84. package/dist/config.js.map +1 -1
  85. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  86. package/dist/core/agent-session-runtime.js +1 -1
  87. package/dist/core/agent-session-runtime.js.map +1 -1
  88. package/dist/core/agent-session-services.d.ts.map +1 -1
  89. package/dist/core/agent-session-services.js +13 -0
  90. package/dist/core/agent-session-services.js.map +1 -1
  91. package/dist/core/agent-session.d.ts +120 -11
  92. package/dist/core/agent-session.d.ts.map +1 -1
  93. package/dist/core/agent-session.js +619 -289
  94. package/dist/core/agent-session.js.map +1 -1
  95. package/dist/core/auth-guidance.d.ts.map +1 -1
  96. package/dist/core/auth-guidance.js.map +1 -1
  97. package/dist/core/auth-storage.d.ts.map +1 -1
  98. package/dist/core/auth-storage.js.map +1 -1
  99. package/dist/core/bash-executor.d.ts.map +1 -1
  100. package/dist/core/bash-executor.js.map +1 -1
  101. package/dist/core/bug-report-upload.d.ts.map +1 -1
  102. package/dist/core/bug-report-upload.js.map +1 -1
  103. package/dist/core/bug-report.d.ts +1 -1
  104. package/dist/core/bug-report.d.ts.map +1 -1
  105. package/dist/core/bug-report.js +1 -1
  106. package/dist/core/bug-report.js.map +1 -1
  107. package/dist/core/cache-stats.d.ts.map +1 -1
  108. package/dist/core/cache-stats.js.map +1 -1
  109. package/dist/core/cache-warmer.d.ts.map +1 -1
  110. package/dist/core/cache-warmer.js.map +1 -1
  111. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  112. package/dist/core/compaction/branch-summarization.js.map +1 -1
  113. package/dist/core/compaction/compaction.d.ts +10 -3
  114. package/dist/core/compaction/compaction.d.ts.map +1 -1
  115. package/dist/core/compaction/compaction.js +71 -33
  116. package/dist/core/compaction/compaction.js.map +1 -1
  117. package/dist/core/compaction/index.d.ts.map +1 -1
  118. package/dist/core/compaction/utils.d.ts +2 -1
  119. package/dist/core/compaction/utils.d.ts.map +1 -1
  120. package/dist/core/compaction/utils.js +25 -18
  121. package/dist/core/compaction/utils.js.map +1 -1
  122. package/dist/core/crash-log.d.ts.map +1 -1
  123. package/dist/core/crash-log.js +2 -1
  124. package/dist/core/crash-log.js.map +1 -1
  125. package/dist/core/defaults.d.ts.map +1 -1
  126. package/dist/core/diagnostics.d.ts.map +1 -1
  127. package/dist/core/event-bus.d.ts.map +1 -1
  128. package/dist/core/event-bus.js.map +1 -1
  129. package/dist/core/exec.d.ts.map +1 -1
  130. package/dist/core/exec.js.map +1 -1
  131. package/dist/core/experimental.d.ts.map +1 -1
  132. package/dist/core/experimental.js.map +1 -1
  133. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  134. package/dist/core/export-html/ansi-to-html.js.map +1 -1
  135. package/dist/core/export-html/index.d.ts.map +1 -1
  136. package/dist/core/export-html/index.js.map +1 -1
  137. package/dist/core/export-html/template.css +10 -0
  138. package/dist/core/export-html/template.js +66 -17
  139. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  140. package/dist/core/export-html/tool-renderer.js.map +1 -1
  141. package/dist/core/extensions/index.d.ts +1 -1
  142. package/dist/core/extensions/index.d.ts.map +1 -1
  143. package/dist/core/extensions/index.js.map +1 -1
  144. package/dist/core/extensions/jiti-loader.d.ts.map +1 -1
  145. package/dist/core/extensions/jiti-static-loader.d.ts.map +1 -1
  146. package/dist/core/extensions/loader.d.ts.map +1 -1
  147. package/dist/core/extensions/loader.js +55 -5
  148. package/dist/core/extensions/loader.js.map +1 -1
  149. package/dist/core/extensions/runner.d.ts +18 -1
  150. package/dist/core/extensions/runner.d.ts.map +1 -1
  151. package/dist/core/extensions/runner.js +99 -0
  152. package/dist/core/extensions/runner.js.map +1 -1
  153. package/dist/core/extensions/types.d.ts +296 -22
  154. package/dist/core/extensions/types.d.ts.map +1 -1
  155. package/dist/core/extensions/types.js.map +1 -1
  156. package/dist/core/extensions/virtual-modules.d.ts.map +1 -1
  157. package/dist/core/extensions/wrapper.d.ts +2 -2
  158. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  159. package/dist/core/extensions/wrapper.js +3 -3
  160. package/dist/core/extensions/wrapper.js.map +1 -1
  161. package/dist/core/footer-data-provider.d.ts.map +1 -1
  162. package/dist/core/footer-data-provider.js.map +1 -1
  163. package/dist/core/http-dispatcher.d.ts.map +1 -1
  164. package/dist/core/http-dispatcher.js.map +1 -1
  165. package/dist/core/index.d.ts.map +1 -1
  166. package/dist/core/keybindings.d.ts +1 -1
  167. package/dist/core/keybindings.d.ts.map +1 -1
  168. package/dist/core/keybindings.js +1 -1
  169. package/dist/core/keybindings.js.map +1 -1
  170. package/dist/core/mcp-servers.d.ts +98 -0
  171. package/dist/core/mcp-servers.d.ts.map +1 -0
  172. package/dist/core/mcp-servers.js +157 -0
  173. package/dist/core/mcp-servers.js.map +1 -0
  174. package/dist/core/messages.d.ts.map +1 -1
  175. package/dist/core/messages.js.map +1 -1
  176. package/dist/core/model-config.d.ts.map +1 -1
  177. package/dist/core/model-config.js.map +1 -1
  178. package/dist/core/model-registry.d.ts +13 -1
  179. package/dist/core/model-registry.d.ts.map +1 -1
  180. package/dist/core/model-registry.js +25 -0
  181. package/dist/core/model-registry.js.map +1 -1
  182. package/dist/core/model-resolver.d.ts +2 -2
  183. package/dist/core/model-resolver.d.ts.map +1 -1
  184. package/dist/core/model-resolver.js +5 -5
  185. package/dist/core/model-resolver.js.map +1 -1
  186. package/dist/core/model-runtime.d.ts +41 -3
  187. package/dist/core/model-runtime.d.ts.map +1 -1
  188. package/dist/core/model-runtime.js +167 -17
  189. package/dist/core/model-runtime.js.map +1 -1
  190. package/dist/core/models-store.d.ts.map +1 -1
  191. package/dist/core/models-store.js.map +1 -1
  192. package/dist/core/nested-tool-calls.d.ts +102 -0
  193. package/dist/core/nested-tool-calls.d.ts.map +1 -0
  194. package/dist/core/nested-tool-calls.js +178 -0
  195. package/dist/core/nested-tool-calls.js.map +1 -0
  196. package/dist/core/output-guard.d.ts.map +1 -1
  197. package/dist/core/output-guard.js.map +1 -1
  198. package/dist/core/package-manager.d.ts +4 -0
  199. package/dist/core/package-manager.d.ts.map +1 -1
  200. package/dist/core/package-manager.js +59 -12
  201. package/dist/core/package-manager.js.map +1 -1
  202. package/dist/core/pi-client-cli-adapter.d.ts.map +1 -1
  203. package/dist/core/pi-client-cli-adapter.js.map +1 -1
  204. package/dist/core/pi-client-runtime-update.d.ts.map +1 -1
  205. package/dist/core/pi-client-runtime-update.js.map +1 -1
  206. package/dist/core/pi-manifest.d.ts.map +1 -1
  207. package/dist/core/pi-manifest.js.map +1 -1
  208. package/dist/core/pi-server-client.d.ts +5 -0
  209. package/dist/core/pi-server-client.d.ts.map +1 -1
  210. package/dist/core/pi-server-client.js +3 -0
  211. package/dist/core/pi-server-client.js.map +1 -1
  212. package/dist/core/pi-server-protocol.d.ts +2 -1
  213. package/dist/core/pi-server-protocol.d.ts.map +1 -1
  214. package/dist/core/pi-server-protocol.js +16 -0
  215. package/dist/core/pi-server-protocol.js.map +1 -1
  216. package/dist/core/pi-server-request.d.ts.map +1 -1
  217. package/dist/core/pi-server-request.js.map +1 -1
  218. package/dist/core/project-trust.d.ts.map +1 -1
  219. package/dist/core/project-trust.js.map +1 -1
  220. package/dist/core/prompt-templates.d.ts.map +1 -1
  221. package/dist/core/prompt-templates.js.map +1 -1
  222. package/dist/core/provider-attribution.d.ts.map +1 -1
  223. package/dist/core/provider-attribution.js.map +1 -1
  224. package/dist/core/provider-composer.d.ts +40 -21
  225. package/dist/core/provider-composer.d.ts.map +1 -1
  226. package/dist/core/provider-composer.js +92 -40
  227. package/dist/core/provider-composer.js.map +1 -1
  228. package/dist/core/radius.d.ts.map +1 -1
  229. package/dist/core/radius.js.map +1 -1
  230. package/dist/core/remote-catalog-provider.d.ts +8 -1
  231. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  232. package/dist/core/remote-catalog-provider.js +18 -3
  233. package/dist/core/remote-catalog-provider.js.map +1 -1
  234. package/dist/core/resolve-config-value.d.ts.map +1 -1
  235. package/dist/core/resolve-config-value.js.map +1 -1
  236. package/dist/core/resource-loader.d.ts +7 -1
  237. package/dist/core/resource-loader.d.ts.map +1 -1
  238. package/dist/core/resource-loader.js +161 -35
  239. package/dist/core/resource-loader.js.map +1 -1
  240. package/dist/core/runtime-credentials.d.ts.map +1 -1
  241. package/dist/core/runtime-credentials.js.map +1 -1
  242. package/dist/core/sdk.d.ts +1 -1
  243. package/dist/core/sdk.d.ts.map +1 -1
  244. package/dist/core/sdk.js +24 -6
  245. package/dist/core/sdk.js.map +1 -1
  246. package/dist/core/session-cwd.d.ts.map +1 -1
  247. package/dist/core/session-cwd.js.map +1 -1
  248. package/dist/core/session-export.d.ts.map +1 -1
  249. package/dist/core/session-export.js.map +1 -1
  250. package/dist/core/session-manager.d.ts +9 -0
  251. package/dist/core/session-manager.d.ts.map +1 -1
  252. package/dist/core/session-manager.js +22 -22
  253. package/dist/core/session-manager.js.map +1 -1
  254. package/dist/core/settings-diagnostics.d.ts.map +1 -1
  255. package/dist/core/settings-diagnostics.js.map +1 -1
  256. package/dist/core/settings-manager.d.ts +31 -1
  257. package/dist/core/settings-manager.d.ts.map +1 -1
  258. package/dist/core/settings-manager.js +72 -2
  259. package/dist/core/settings-manager.js.map +1 -1
  260. package/dist/core/skills.d.ts.map +1 -1
  261. package/dist/core/skills.js.map +1 -1
  262. package/dist/core/slash-commands.d.ts.map +1 -1
  263. package/dist/core/source-info.d.ts +8 -0
  264. package/dist/core/source-info.d.ts.map +1 -1
  265. package/dist/core/source-info.js +16 -0
  266. package/dist/core/source-info.js.map +1 -1
  267. package/dist/core/system-prompt.d.ts.map +1 -1
  268. package/dist/core/system-prompt.js +1 -1
  269. package/dist/core/system-prompt.js.map +1 -1
  270. package/dist/core/telemetry.d.ts.map +1 -1
  271. package/dist/core/telemetry.js.map +1 -1
  272. package/dist/core/timings.d.ts.map +1 -1
  273. package/dist/core/timings.js.map +1 -1
  274. package/dist/core/tools/bash.d.ts +12 -0
  275. package/dist/core/tools/bash.d.ts.map +1 -1
  276. package/dist/core/tools/bash.js +35 -2
  277. package/dist/core/tools/bash.js.map +1 -1
  278. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  279. package/dist/core/tools/edit-diff.js.map +1 -1
  280. package/dist/core/tools/edit.d.ts.map +1 -1
  281. package/dist/core/tools/edit.js.map +1 -1
  282. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  283. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  284. package/dist/core/tools/find.d.ts.map +1 -1
  285. package/dist/core/tools/find.js.map +1 -1
  286. package/dist/core/tools/grep.d.ts.map +1 -1
  287. package/dist/core/tools/grep.js.map +1 -1
  288. package/dist/core/tools/index.d.ts.map +1 -1
  289. package/dist/core/tools/index.js.map +1 -1
  290. package/dist/core/tools/ls.d.ts.map +1 -1
  291. package/dist/core/tools/ls.js.map +1 -1
  292. package/dist/core/tools/output-accumulator.d.ts +11 -0
  293. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  294. package/dist/core/tools/output-accumulator.js +36 -0
  295. package/dist/core/tools/output-accumulator.js.map +1 -1
  296. package/dist/core/tools/path-utils.d.ts.map +1 -1
  297. package/dist/core/tools/path-utils.js.map +1 -1
  298. package/dist/core/tools/powershell.d.ts.map +1 -1
  299. package/dist/core/tools/powershell.js.map +1 -1
  300. package/dist/core/tools/read.d.ts.map +1 -1
  301. package/dist/core/tools/read.js.map +1 -1
  302. package/dist/core/tools/render-utils.d.ts +6 -0
  303. package/dist/core/tools/render-utils.d.ts.map +1 -1
  304. package/dist/core/tools/render-utils.js +26 -0
  305. package/dist/core/tools/render-utils.js.map +1 -1
  306. package/dist/core/tools/renderers/bash.d.ts.map +1 -1
  307. package/dist/core/tools/renderers/bash.js +9 -10
  308. package/dist/core/tools/renderers/bash.js.map +1 -1
  309. package/dist/core/tools/renderers/edit.d.ts.map +1 -1
  310. package/dist/core/tools/renderers/edit.js.map +1 -1
  311. package/dist/core/tools/renderers/find.d.ts.map +1 -1
  312. package/dist/core/tools/renderers/find.js.map +1 -1
  313. package/dist/core/tools/renderers/grep.d.ts.map +1 -1
  314. package/dist/core/tools/renderers/grep.js.map +1 -1
  315. package/dist/core/tools/renderers/index.d.ts.map +1 -1
  316. package/dist/core/tools/renderers/index.js.map +1 -1
  317. package/dist/core/tools/renderers/ls.d.ts.map +1 -1
  318. package/dist/core/tools/renderers/ls.js.map +1 -1
  319. package/dist/core/tools/renderers/read.d.ts.map +1 -1
  320. package/dist/core/tools/renderers/read.js +3 -2
  321. package/dist/core/tools/renderers/read.js.map +1 -1
  322. package/dist/core/tools/renderers/write.d.ts.map +1 -1
  323. package/dist/core/tools/renderers/write.js.map +1 -1
  324. package/dist/core/tools/tool-definition-wrapper.d.ts +5 -3
  325. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  326. package/dist/core/tools/tool-definition-wrapper.js +3 -1
  327. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  328. package/dist/core/tools/truncate.d.ts +14 -0
  329. package/dist/core/tools/truncate.d.ts.map +1 -1
  330. package/dist/core/tools/truncate.js +29 -0
  331. package/dist/core/tools/truncate.js.map +1 -1
  332. package/dist/core/tools/write.d.ts.map +1 -1
  333. package/dist/core/tools/write.js.map +1 -1
  334. package/dist/core/trust-manager.d.ts.map +1 -1
  335. package/dist/core/trust-manager.js +1 -0
  336. package/dist/core/trust-manager.js.map +1 -1
  337. package/dist/core/usage-totals.d.ts +2 -0
  338. package/dist/core/usage-totals.d.ts.map +1 -1
  339. package/dist/core/usage-totals.js +23 -0
  340. package/dist/core/usage-totals.js.map +1 -1
  341. package/dist/core/virtual-models.d.ts +115 -0
  342. package/dist/core/virtual-models.d.ts.map +1 -0
  343. package/dist/core/virtual-models.js +117 -0
  344. package/dist/core/virtual-models.js.map +1 -0
  345. package/dist/extensions/codemode/execute.d.ts +16 -0
  346. package/dist/extensions/codemode/execute.d.ts.map +1 -0
  347. package/dist/extensions/codemode/execute.js +390 -0
  348. package/dist/extensions/codemode/execute.js.map +1 -0
  349. package/dist/extensions/codemode/execute.lazy.d.ts +3 -0
  350. package/dist/extensions/codemode/execute.lazy.d.ts.map +1 -0
  351. package/dist/extensions/codemode/execute.lazy.js +3 -0
  352. package/dist/extensions/codemode/execute.lazy.js.map +1 -0
  353. package/dist/extensions/codemode/index.d.ts +21 -0
  354. package/dist/extensions/codemode/index.d.ts.map +1 -0
  355. package/dist/extensions/codemode/index.js +31 -0
  356. package/dist/extensions/codemode/index.js.map +1 -0
  357. package/dist/extensions/codemode/renderer.d.ts +12 -0
  358. package/dist/extensions/codemode/renderer.d.ts.map +1 -0
  359. package/dist/extensions/codemode/renderer.js +119 -0
  360. package/dist/extensions/codemode/renderer.js.map +1 -0
  361. package/dist/extensions/codemode/tool.d.ts +122 -0
  362. package/dist/extensions/codemode/tool.d.ts.map +1 -0
  363. package/dist/extensions/codemode/tool.js +324 -0
  364. package/dist/extensions/codemode/tool.js.map +1 -0
  365. package/dist/extensions/codemode/worker.d.ts +7 -0
  366. package/dist/extensions/codemode/worker.d.ts.map +1 -0
  367. package/dist/extensions/codemode/worker.js +7 -0
  368. package/dist/extensions/codemode/worker.js.map +1 -0
  369. package/dist/extensions/index.d.ts.map +1 -1
  370. package/dist/extensions/index.js +11 -1
  371. package/dist/extensions/index.js.map +1 -1
  372. package/dist/extensions/llama/client.d.ts.map +1 -1
  373. package/dist/extensions/llama/client.js.map +1 -1
  374. package/dist/extensions/llama/huggingface.d.ts.map +1 -1
  375. package/dist/extensions/llama/huggingface.js.map +1 -1
  376. package/dist/extensions/llama/index.d.ts.map +1 -1
  377. package/dist/extensions/llama/index.js.map +1 -1
  378. package/dist/extensions/llama/provider.d.ts +1 -1
  379. package/dist/extensions/llama/provider.d.ts.map +1 -1
  380. package/dist/extensions/llama/provider.js +65 -13
  381. package/dist/extensions/llama/provider.js.map +1 -1
  382. package/dist/extensions/llama/ui.d.ts.map +1 -1
  383. package/dist/extensions/llama/ui.js.map +1 -1
  384. package/dist/extensions/mcp/cli.d.ts +21 -0
  385. package/dist/extensions/mcp/cli.d.ts.map +1 -0
  386. package/dist/extensions/mcp/cli.js +485 -0
  387. package/dist/extensions/mcp/cli.js.map +1 -0
  388. package/dist/extensions/mcp/cli.lazy.d.ts +3 -0
  389. package/dist/extensions/mcp/cli.lazy.d.ts.map +1 -0
  390. package/dist/extensions/mcp/cli.lazy.js +3 -0
  391. package/dist/extensions/mcp/cli.lazy.js.map +1 -0
  392. package/dist/extensions/mcp/config.d.ts +70 -0
  393. package/dist/extensions/mcp/config.d.ts.map +1 -0
  394. package/dist/extensions/mcp/config.js +146 -0
  395. package/dist/extensions/mcp/config.js.map +1 -0
  396. package/dist/extensions/mcp/index.d.ts +52 -0
  397. package/dist/extensions/mcp/index.d.ts.map +1 -0
  398. package/dist/extensions/mcp/index.js +902 -0
  399. package/dist/extensions/mcp/index.js.map +1 -0
  400. package/dist/extensions/mcp/log.d.ts +16 -0
  401. package/dist/extensions/mcp/log.d.ts.map +1 -0
  402. package/dist/extensions/mcp/log.js +66 -0
  403. package/dist/extensions/mcp/log.js.map +1 -0
  404. package/dist/extensions/mcp/oauth.d.ts +94 -0
  405. package/dist/extensions/mcp/oauth.d.ts.map +1 -0
  406. package/dist/extensions/mcp/oauth.js +333 -0
  407. package/dist/extensions/mcp/oauth.js.map +1 -0
  408. package/dist/extensions/mcp/resources.d.ts +43 -0
  409. package/dist/extensions/mcp/resources.d.ts.map +1 -0
  410. package/dist/extensions/mcp/resources.js +262 -0
  411. package/dist/extensions/mcp/resources.js.map +1 -0
  412. package/dist/extensions/mcp/runtime.d.ts +96 -0
  413. package/dist/extensions/mcp/runtime.d.ts.map +1 -0
  414. package/dist/extensions/mcp/runtime.js +388 -0
  415. package/dist/extensions/mcp/runtime.js.map +1 -0
  416. package/dist/extensions/mcp/runtime.lazy.d.ts +3 -0
  417. package/dist/extensions/mcp/runtime.lazy.d.ts.map +1 -0
  418. package/dist/extensions/mcp/runtime.lazy.js +3 -0
  419. package/dist/extensions/mcp/runtime.lazy.js.map +1 -0
  420. package/dist/extensions/mcp/tools.d.ts +83 -0
  421. package/dist/extensions/mcp/tools.d.ts.map +1 -0
  422. package/dist/extensions/mcp/tools.js +233 -0
  423. package/dist/extensions/mcp/tools.js.map +1 -0
  424. package/dist/extensions/mcp/ui.d.ts +60 -0
  425. package/dist/extensions/mcp/ui.d.ts.map +1 -0
  426. package/dist/extensions/mcp/ui.js +172 -0
  427. package/dist/extensions/mcp/ui.js.map +1 -0
  428. package/dist/extensions/tool-search/index.d.ts +12 -0
  429. package/dist/extensions/tool-search/index.d.ts.map +1 -0
  430. package/dist/extensions/tool-search/index.js +15 -0
  431. package/dist/extensions/tool-search/index.js.map +1 -0
  432. package/dist/extensions/tool-search/tool.d.ts +72 -0
  433. package/dist/extensions/tool-search/tool.d.ts.map +1 -0
  434. package/dist/extensions/tool-search/tool.js +210 -0
  435. package/dist/extensions/tool-search/tool.js.map +1 -0
  436. package/dist/index.d.ts +9 -2
  437. package/dist/index.d.ts.map +1 -1
  438. package/dist/index.js +5 -0
  439. package/dist/index.js.map +1 -1
  440. package/dist/main.d.ts.map +1 -1
  441. package/dist/main.js +10 -0
  442. package/dist/main.js.map +1 -1
  443. package/dist/migrations.d.ts.map +1 -1
  444. package/dist/migrations.js.map +1 -1
  445. package/dist/modes/index.d.ts.map +1 -1
  446. package/dist/modes/interactive/bug-report.d.ts.map +1 -1
  447. package/dist/modes/interactive/bug-report.js.map +1 -1
  448. package/dist/modes/interactive/chat-viewport.d.ts.map +1 -1
  449. package/dist/modes/interactive/chat-viewport.js.map +1 -1
  450. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  451. package/dist/modes/interactive/components/armin.js.map +1 -1
  452. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  453. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  454. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  455. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  456. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  457. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  458. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  459. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  460. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  461. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  462. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  463. package/dist/modes/interactive/components/config-selector.js +13 -3
  464. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  465. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  466. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  467. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  468. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  469. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  470. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  471. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  472. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  473. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  474. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  475. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  476. package/dist/modes/interactive/components/diff.js.map +1 -1
  477. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  478. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  479. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
  480. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  481. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  482. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  483. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  484. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  485. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  486. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  487. package/dist/modes/interactive/components/first-time-setup.d.ts +4 -4
  488. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
  489. package/dist/modes/interactive/components/first-time-setup.js +8 -2
  490. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  491. package/dist/modes/interactive/components/footer.d.ts +7 -0
  492. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  493. package/dist/modes/interactive/components/footer.js +43 -3
  494. package/dist/modes/interactive/components/footer.js.map +1 -1
  495. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  496. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  497. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  498. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  499. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  500. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -1
  501. package/dist/modes/interactive/components/markdown-transform.js.map +1 -1
  502. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -1
  503. package/dist/modes/interactive/components/mermaid.js.map +1 -1
  504. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  505. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  506. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  507. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  508. package/dist/modes/interactive/components/pi-logo.d.ts +12 -0
  509. package/dist/modes/interactive/components/pi-logo.d.ts.map +1 -0
  510. package/dist/modes/interactive/components/pi-logo.js +25 -0
  511. package/dist/modes/interactive/components/pi-logo.js.map +1 -0
  512. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  513. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  514. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  515. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  516. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  517. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  518. package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
  519. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  520. package/dist/modes/interactive/components/settings-selector.js +28 -6
  521. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  522. package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -1
  523. package/dist/modes/interactive/components/settings-submenu.js.map +1 -1
  524. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  525. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  526. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  527. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  528. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  529. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  530. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  531. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  532. package/dist/modes/interactive/components/themed-text.d.ts +17 -0
  533. package/dist/modes/interactive/components/themed-text.d.ts.map +1 -0
  534. package/dist/modes/interactive/components/themed-text.js +29 -0
  535. package/dist/modes/interactive/components/themed-text.js.map +1 -0
  536. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  537. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  538. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  539. package/dist/modes/interactive/components/tool-execution.js +2 -2
  540. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  541. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  542. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  543. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
  544. package/dist/modes/interactive/components/trust-selector.js.map +1 -1
  545. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  546. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  547. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  548. package/dist/modes/interactive/components/user-message.js.map +1 -1
  549. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  550. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  551. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  552. package/dist/modes/interactive/external-editor.js.map +1 -1
  553. package/dist/modes/interactive/interactive-mode.d.ts +11 -0
  554. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  555. package/dist/modes/interactive/interactive-mode.js +199 -161
  556. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  557. package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -1
  558. package/dist/modes/interactive/model-catalog-refresh.js.map +1 -1
  559. package/dist/modes/interactive/model-search.d.ts.map +1 -1
  560. package/dist/modes/interactive/model-search.js.map +1 -1
  561. package/dist/modes/interactive/session-share.d.ts.map +1 -1
  562. package/dist/modes/interactive/session-share.js.map +1 -1
  563. package/dist/modes/interactive/theme/dark.json +59 -72
  564. package/dist/modes/interactive/theme/light.json +57 -69
  565. package/dist/modes/interactive/theme/system-theme.d.ts +54 -0
  566. package/dist/modes/interactive/theme/system-theme.d.ts.map +1 -0
  567. package/dist/modes/interactive/theme/system-theme.js +535 -0
  568. package/dist/modes/interactive/theme/system-theme.js.map +1 -0
  569. package/dist/modes/interactive/theme/theme-controller.d.ts +46 -6
  570. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  571. package/dist/modes/interactive/theme/theme-controller.js +127 -47
  572. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  573. package/dist/modes/interactive/theme/theme-json.d.ts +1 -0
  574. package/dist/modes/interactive/theme/theme-json.d.ts.map +1 -1
  575. package/dist/modes/interactive/theme/theme-json.js +3 -1
  576. package/dist/modes/interactive/theme/theme-json.js.map +1 -1
  577. package/dist/modes/interactive/theme/theme-schema.json +7 -2
  578. package/dist/modes/interactive/theme/theme.d.ts +66 -39
  579. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  580. package/dist/modes/interactive/theme/theme.js +238 -317
  581. package/dist/modes/interactive/theme/theme.js.map +1 -1
  582. package/dist/modes/interactive/tui-renderer.d.ts +2 -1
  583. package/dist/modes/interactive/tui-renderer.d.ts.map +1 -1
  584. package/dist/modes/interactive/tui-renderer.js +1 -0
  585. package/dist/modes/interactive/tui-renderer.js.map +1 -1
  586. package/dist/modes/json-event.d.ts.map +1 -1
  587. package/dist/modes/json-event.js.map +1 -1
  588. package/dist/modes/print-mode.d.ts.map +1 -1
  589. package/dist/modes/print-mode.js.map +1 -1
  590. package/dist/modes/rpc/jsonl.d.ts.map +1 -1
  591. package/dist/modes/rpc/jsonl.js.map +1 -1
  592. package/dist/modes/rpc/rpc-client.d.ts +6 -6
  593. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  594. package/dist/modes/rpc/rpc-client.js +12 -8
  595. package/dist/modes/rpc/rpc-client.js.map +1 -1
  596. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  597. package/dist/modes/rpc/rpc-mode.js +7 -9
  598. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  599. package/dist/modes/rpc/rpc-types.d.ts +10 -1
  600. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  601. package/dist/modes/rpc/rpc-types.js.map +1 -1
  602. package/dist/package-manager-cli.d.ts.map +1 -1
  603. package/dist/package-manager-cli.js +6 -2
  604. package/dist/package-manager-cli.js.map +1 -1
  605. package/dist/pi-client-cli.d.ts.map +1 -1
  606. package/dist/pi-client-cli.js.map +1 -1
  607. package/dist/rpc-entry.d.ts.map +1 -1
  608. package/dist/rpc-entry.js.map +1 -1
  609. package/dist/utils/abort.d.ts.map +1 -1
  610. package/dist/utils/abort.js.map +1 -1
  611. package/dist/utils/ansi.d.ts.map +1 -1
  612. package/dist/utils/ansi.js.map +1 -1
  613. package/dist/utils/changelog.d.ts.map +1 -1
  614. package/dist/utils/changelog.js.map +1 -1
  615. package/dist/utils/child-process.d.ts.map +1 -1
  616. package/dist/utils/child-process.js.map +1 -1
  617. package/dist/utils/clipboard-command.d.ts.map +1 -1
  618. package/dist/utils/clipboard-command.js.map +1 -1
  619. package/dist/utils/clipboard-image.d.ts.map +1 -1
  620. package/dist/utils/clipboard-image.js +14 -17
  621. package/dist/utils/clipboard-image.js.map +1 -1
  622. package/dist/utils/clipboard.d.ts +2 -0
  623. package/dist/utils/clipboard.d.ts.map +1 -1
  624. package/dist/utils/clipboard.js +5 -0
  625. package/dist/utils/clipboard.js.map +1 -1
  626. package/dist/utils/deprecation.d.ts.map +1 -1
  627. package/dist/utils/deprecation.js.map +1 -1
  628. package/dist/utils/exif-orientation.d.ts.map +1 -1
  629. package/dist/utils/exif-orientation.js.map +1 -1
  630. package/dist/utils/frontmatter.d.ts.map +1 -1
  631. package/dist/utils/frontmatter.js.map +1 -1
  632. package/dist/utils/fs-watch.d.ts.map +1 -1
  633. package/dist/utils/fs-watch.js.map +1 -1
  634. package/dist/utils/git.d.ts.map +1 -1
  635. package/dist/utils/git.js.map +1 -1
  636. package/dist/utils/html.d.ts.map +1 -1
  637. package/dist/utils/html.js.map +1 -1
  638. package/dist/utils/image-convert.d.ts.map +1 -1
  639. package/dist/utils/image-convert.js.map +1 -1
  640. package/dist/utils/image-process.d.ts.map +1 -1
  641. package/dist/utils/image-process.js.map +1 -1
  642. package/dist/utils/image-resize-core.d.ts.map +1 -1
  643. package/dist/utils/image-resize-core.js.map +1 -1
  644. package/dist/utils/image-resize-worker.d.ts.map +1 -1
  645. package/dist/utils/image-resize-worker.js.map +1 -1
  646. package/dist/utils/image-resize.d.ts.map +1 -1
  647. package/dist/utils/image-resize.js.map +1 -1
  648. package/dist/utils/json.d.ts.map +1 -1
  649. package/dist/utils/json.js.map +1 -1
  650. package/dist/utils/management-http.d.ts.map +1 -1
  651. package/dist/utils/management-http.js.map +1 -1
  652. package/dist/utils/mime.d.ts.map +1 -1
  653. package/dist/utils/mime.js.map +1 -1
  654. package/dist/utils/open-browser.d.ts.map +1 -1
  655. package/dist/utils/open-browser.js.map +1 -1
  656. package/dist/utils/paths.d.ts +3 -3
  657. package/dist/utils/paths.d.ts.map +1 -1
  658. package/dist/utils/paths.js +5 -4
  659. package/dist/utils/paths.js.map +1 -1
  660. package/dist/utils/photon.d.ts.map +1 -1
  661. package/dist/utils/photon.js.map +1 -1
  662. package/dist/utils/pi-user-agent.d.ts.map +1 -1
  663. package/dist/utils/pi-user-agent.js.map +1 -1
  664. package/dist/utils/shell.d.ts +1 -3
  665. package/dist/utils/shell.d.ts.map +1 -1
  666. package/dist/utils/shell.js +3 -30
  667. package/dist/utils/shell.js.map +1 -1
  668. package/dist/utils/sleep.d.ts.map +1 -1
  669. package/dist/utils/sleep.js.map +1 -1
  670. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  671. package/dist/utils/syntax-highlight.js +2 -0
  672. package/dist/utils/syntax-highlight.js.map +1 -1
  673. package/dist/utils/text.d.ts.map +1 -1
  674. package/dist/utils/text.js.map +1 -1
  675. package/dist/utils/tool-result-images.d.ts.map +1 -1
  676. package/dist/utils/tool-result-images.js.map +1 -1
  677. package/dist/utils/tools-manager.d.ts.map +1 -1
  678. package/dist/utils/tools-manager.js.map +1 -1
  679. package/dist/utils/version-check.d.ts.map +1 -1
  680. package/dist/utils/version-check.js.map +1 -1
  681. package/dist/utils/windows-self-update.d.ts.map +1 -1
  682. package/dist/utils/windows-self-update.js.map +1 -1
  683. package/dist/utils/wsl.d.ts.map +1 -1
  684. package/dist/utils/wsl.js.map +1 -1
  685. package/dist/utils/zip.d.ts.map +1 -1
  686. package/dist/utils/zip.js.map +1 -1
  687. package/docs/cli.md +64 -3
  688. package/docs/configuration.md +2 -0
  689. package/docs/custom-provider.md +43 -4
  690. package/docs/docs.json +8 -0
  691. package/docs/extensions.md +55 -0
  692. package/docs/keybindings.md +1 -1
  693. package/docs/llama-cpp.md +13 -0
  694. package/docs/mcp.md +188 -0
  695. package/docs/models.md +35 -0
  696. package/docs/packages.md +4 -2
  697. package/docs/providers.md +1 -0
  698. package/docs/rpc-commands.md +9 -3
  699. package/docs/rpc.md +3 -1
  700. package/docs/sdk.md +7 -2
  701. package/docs/security.md +2 -0
  702. package/docs/session-format.md +5 -1
  703. package/docs/settings.md +20 -3
  704. package/docs/themes.md +33 -7
  705. package/docs/tui.md +18 -0
  706. package/docs/virtual-models.md +114 -0
  707. package/docs/windows.md +2 -0
  708. package/examples/README.md +1 -1
  709. package/examples/extensions/README.md +2 -0
  710. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  711. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  712. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  713. package/examples/extensions/custom-provider-gitlab-duo/test.ts +5 -5
  714. package/examples/extensions/debug-provider.ts +90 -0
  715. package/examples/extensions/gondolin/package-lock.json +2 -2
  716. package/examples/extensions/gondolin/package.json +1 -1
  717. package/examples/extensions/jev-router.ts +113 -0
  718. package/examples/extensions/sandbox/package-lock.json +2 -2
  719. package/examples/extensions/sandbox/package.json +1 -1
  720. package/examples/extensions/with-deps/package-lock.json +2 -2
  721. package/examples/extensions/with-deps/package.json +1 -1
  722. package/examples/rpc-client.ts +1 -1
  723. package/examples/rpc-extension-ui.ts +1 -1
  724. package/examples/sdk/14-codemode-mcp.ts +61 -0
  725. package/examples/sdk/README.md +2 -1
  726. package/package.json +14 -12
  727. package/dist/bundle/chunks/anthropic-messages-J5WXPPPC.js +0 -6
  728. package/dist/bundle/chunks/azure-openai-responses-QJ7SPP5M.js +0 -2
  729. package/dist/bundle/chunks/chunk-6R7UI4IY.js +0 -2
  730. package/dist/bundle/chunks/chunk-CGLIERPR.js +0 -2
  731. package/dist/bundle/chunks/chunk-G4PLSCJV.js +0 -1669
  732. package/dist/bundle/chunks/chunk-NUHFSC37.js +0 -25
  733. package/dist/bundle/chunks/chunk-RCZIEVGO.js +0 -11
  734. package/dist/bundle/chunks/google-generative-ai-IMS5EK2Y.js +0 -2
  735. package/dist/bundle/chunks/google-vertex-O4YJEQUW.js +0 -2
  736. package/dist/bundle/chunks/mistral-conversations-NOSQHBEY.js +0 -5
  737. package/dist/bundle/chunks/openai-responses-AH7QTG23.js +0 -2
  738. package/dist/bundle/chunks/virtual-modules-LRIRMGSI.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"resource-loader.d.ts","sourceRoot":"","sources":["../../src/core/resource-loader.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { basename, dirname, join, resolve, sep } from \"node:path\";\nimport chalk from \"chalk\";\nimport { CONFIG_DIR_NAME } from \"../config.ts\";\nimport { loadThemeFromPath, type Theme } from \"../modes/interactive/theme/theme.ts\";\nimport type { ResourceDiagnostic } from \"./diagnostics.ts\";\n\nexport type { ResourceCollision, ResourceDiagnostic } from \"./diagnostics.ts\";\n\nimport { canonicalizePath, isLocalPath, resolvePath } from \"../utils/paths.ts\";\nimport { stripBom } from \"../utils/text.ts\";\nimport { createEventBus, type EventBus } from \"./event-bus.ts\";\nimport {\n\tclearExtensionCache,\n\tcreateExtensionRuntime,\n\tloadExtensionFromFactory,\n\tloadExtensionsCached,\n} from \"./extensions/loader.ts\";\nimport type { Extension, ExtensionRuntime, InlineExtension, LoadExtensionsResult } from \"./extensions/types.ts\";\nimport { findGitPaths } from \"./footer-data-provider.ts\";\nimport { DefaultPackageManager, type PathMetadata, type ResolvedResource } from \"./package-manager.ts\";\nimport type { PromptTemplate } from \"./prompt-templates.ts\";\nimport { loadPromptTemplates } from \"./prompt-templates.ts\";\nimport { SettingsManager } from \"./settings-manager.ts\";\nimport type { Skill } from \"./skills.ts\";\nimport { loadSkills } from \"./skills.ts\";\nimport { createSourceInfo, type SourceInfo } from \"./source-info.ts\";\nimport { resetTimings } from \"./timings.ts\";\n\nexport interface ResourceExtensionPaths {\n\tskillPaths?: Array<{ path: string; metadata: PathMetadata }>;\n\tpromptPaths?: Array<{ path: string; metadata: PathMetadata }>;\n\tthemePaths?: Array<{ path: string; metadata: PathMetadata }>;\n}\n\nexport interface ResourceLoaderReloadOptions {\n\tresolveProjectTrust?: (input: { extensionsResult: LoadExtensionsResult }) => Promise<boolean>;\n}\n\nexport interface ResourceLoader {\n\tgetExtensions(): LoadExtensionsResult;\n\tgetSkills(): { skills: Skill[]; diagnostics: ResourceDiagnostic[] };\n\tgetPrompts(): { prompts: PromptTemplate[]; diagnostics: ResourceDiagnostic[] };\n\tgetThemes(): { themes: Theme[]; diagnostics: ResourceDiagnostic[] };\n\tgetAgentsFiles(): { agentsFiles: Array<{ path: string; content: string }> };\n\tgetSystemPrompt(): string | undefined;\n\tgetSystemPromptSource(): { path: string } | undefined;\n\tgetAppendSystemPrompt(): string[];\n\tgetAppendSystemPromptSources(): Array<{ path: string }>;\n\textendResources(paths: ResourceExtensionPaths): void;\n\treload(options?: ResourceLoaderReloadOptions): Promise<void>;\n}\n\nfunction resolvePromptInput(input: string | undefined, description: string): string | undefined {\n\tif (!input) {\n\t\treturn undefined;\n\t}\n\n\tif (existsSync(input)) {\n\t\ttry {\n\t\t\treturn stripBom(readFileSync(input, \"utf-8\"));\n\t\t} catch (error) {\n\t\t\tconsole.error(chalk.yellow(`Warning: Could not read ${description} file ${input}: ${error}`));\n\t\t\treturn input;\n\t\t}\n\t}\n\n\treturn input;\n}\n\nfunction loadContextFileFromDir(dir: string): { path: string; content: string } | null {\n\tconst candidates = [\"AGENTS.override.md\", \"AGENTS.md\", \"AGENTS.MD\", \"CLAUDE.md\", \"CLAUDE.MD\"];\n\tfor (const filename of candidates) {\n\t\tconst filePath = join(dir, filename);\n\t\tif (existsSync(filePath)) {\n\t\t\ttry {\n\t\t\t\tif (!statSync(filePath).isFile()) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tpath: filePath,\n\t\t\t\t\tcontent: stripBom(readFileSync(filePath, \"utf-8\")),\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(chalk.yellow(`Warning: Could not read ${filePath}: ${error}`));\n\t\t\t}\n\t\t}\n\t}\n\treturn null;\n}\n\n/**\n * The main repo's context file that a nested linked worktree's own copy shadows: both\n * occupy the same logical repository scope, so loading both applies that context twice. Returns\n * undefined when nothing is shadowed, leaving normal ancestor inheritance alone.\n *\n * Returned canonicalized (realpath), because `git worktree add` writes the `.git`\n * file's `gitdir:` target in realpath form while cwd may still be symlinked\n * (macOS `/tmp` -> `/private/tmp`).\n */\nfunction findShadowedContextFile(cwd: string): string | undefined {\n\tconst gitPaths = findGitPaths(cwd);\n\tif (!gitPaths) return undefined;\n\tconst commonGitDir = canonicalizePath(gitPaths.commonGitDir);\n\tconst worktreeRoot = canonicalizePath(gitPaths.repoDir);\n\tconst mainRepoRoot = dirname(commonGitDir);\n\t// False for an ordinary repo, where the two are the same dir, and for a sibling\n\t// worktree (`git worktree add ../feat`), whose main repo is not an ancestor.\n\tif (!worktreeRoot.startsWith(`${mainRepoRoot}${sep}`)) return undefined;\n\t// dirname of the common git dir is the main worktree root only when that dir is\n\t// itself checked out from the same repo. In a bare layout (`proj/.bare` +\n\t// `proj/main`) it is just the directory holding `.bare`, which tracks nothing; a\n\t// submodule's gitdir has no `commondir`, so it lands under `.git/modules`.\n\tif (canonicalizePath(join(mainRepoRoot, \".git\")) !== commonGitDir) return undefined;\n\tconst worktreeContextFile = loadContextFileFromDir(worktreeRoot);\n\treturn worktreeContextFile ? join(mainRepoRoot, basename(worktreeContextFile.path)) : undefined;\n}\n\nexport function loadProjectContextFiles(options: {\n\tcwd: string;\n\tagentDir: string;\n}): Array<{ path: string; content: string }> {\n\tconst resolvedCwd = resolvePath(options.cwd);\n\tconst resolvedAgentDir = resolvePath(options.agentDir);\n\n\tconst contextFiles: Array<{ path: string; content: string }> = [];\n\tconst seenPaths = new Set<string>();\n\n\tconst globalContext = loadContextFileFromDir(resolvedAgentDir);\n\tif (globalContext) {\n\t\tcontextFiles.push(globalContext);\n\t\tseenPaths.add(globalContext.path);\n\t}\n\n\tconst ancestorContextFiles: Array<{ path: string; content: string }> = [];\n\n\tconst shadowedContextFile = findShadowedContextFile(resolvedCwd);\n\tlet currentDir = resolvedCwd;\n\n\twhile (true) {\n\t\tconst contextFile = loadContextFileFromDir(currentDir);\n\t\tconst isShadowed =\n\t\t\tshadowedContextFile !== undefined && canonicalizePath(contextFile?.path ?? \"\") === shadowedContextFile;\n\t\tif (contextFile && !isShadowed && !seenPaths.has(contextFile.path)) {\n\t\t\tancestorContextFiles.unshift(contextFile);\n\t\t\tseenPaths.add(contextFile.path);\n\t\t}\n\n\t\tconst parentDir = dirname(currentDir);\n\t\tif (parentDir === currentDir) break;\n\t\tcurrentDir = parentDir;\n\t}\n\n\tcontextFiles.push(...ancestorContextFiles);\n\n\treturn contextFiles;\n}\n\nexport interface DefaultResourceLoaderOptions {\n\tcwd: string;\n\tagentDir: string;\n\tsettingsManager?: SettingsManager;\n\teventBus?: EventBus;\n\tadditionalExtensionPaths?: string[];\n\tadditionalSkillPaths?: string[];\n\tadditionalPromptTemplatePaths?: string[];\n\tadditionalThemePaths?: string[];\n\textensionFactories?: InlineExtension[];\n\tnoExtensions?: boolean;\n\tnoSkills?: boolean;\n\tnoPromptTemplates?: boolean;\n\tnoThemes?: boolean;\n\tnoContextFiles?: boolean;\n\tsystemPrompt?: string;\n\tappendSystemPrompt?: string[];\n\textensionsOverride?: (base: LoadExtensionsResult) => LoadExtensionsResult;\n\tskillsOverride?: (base: { skills: Skill[]; diagnostics: ResourceDiagnostic[] }) => {\n\t\tskills: Skill[];\n\t\tdiagnostics: ResourceDiagnostic[];\n\t};\n\tpromptsOverride?: (base: { prompts: PromptTemplate[]; diagnostics: ResourceDiagnostic[] }) => {\n\t\tprompts: PromptTemplate[];\n\t\tdiagnostics: ResourceDiagnostic[];\n\t};\n\tthemesOverride?: (base: { themes: Theme[]; diagnostics: ResourceDiagnostic[] }) => {\n\t\tthemes: Theme[];\n\t\tdiagnostics: ResourceDiagnostic[];\n\t};\n\tagentsFilesOverride?: (base: { agentsFiles: Array<{ path: string; content: string }> }) => {\n\t\tagentsFiles: Array<{ path: string; content: string }>;\n\t};\n\tsystemPromptOverride?: (base: string | undefined) => string | undefined;\n\tappendSystemPromptOverride?: (base: string[]) => string[];\n}\n\nexport class DefaultResourceLoader implements ResourceLoader {\n\tprivate cwd: string;\n\tprivate agentDir: string;\n\tprivate settingsManager: SettingsManager;\n\tprivate eventBus: EventBus;\n\tprivate packageManager: DefaultPackageManager;\n\tprivate additionalExtensionPaths: string[];\n\tprivate additionalSkillPaths: string[];\n\tprivate additionalPromptTemplatePaths: string[];\n\tprivate additionalThemePaths: string[];\n\tprivate extensionFactories: InlineExtension[];\n\tprivate noExtensions: boolean;\n\tprivate noSkills: boolean;\n\tprivate noPromptTemplates: boolean;\n\tprivate noThemes: boolean;\n\tprivate noContextFiles: boolean;\n\tprivate systemPromptSource?: string;\n\tprivate appendSystemPromptSource?: string[];\n\tprivate extensionsOverride?: (base: LoadExtensionsResult) => LoadExtensionsResult;\n\tprivate skillsOverride?: (base: { skills: Skill[]; diagnostics: ResourceDiagnostic[] }) => {\n\t\tskills: Skill[];\n\t\tdiagnostics: ResourceDiagnostic[];\n\t};\n\tprivate promptsOverride?: (base: { prompts: PromptTemplate[]; diagnostics: ResourceDiagnostic[] }) => {\n\t\tprompts: PromptTemplate[];\n\t\tdiagnostics: ResourceDiagnostic[];\n\t};\n\tprivate themesOverride?: (base: { themes: Theme[]; diagnostics: ResourceDiagnostic[] }) => {\n\t\tthemes: Theme[];\n\t\tdiagnostics: ResourceDiagnostic[];\n\t};\n\tprivate agentsFilesOverride?: (base: { agentsFiles: Array<{ path: string; content: string }> }) => {\n\t\tagentsFiles: Array<{ path: string; content: string }>;\n\t};\n\tprivate systemPromptOverride?: (base: string | undefined) => string | undefined;\n\tprivate appendSystemPromptOverride?: (base: string[]) => string[];\n\n\tprivate extensionsResult: LoadExtensionsResult;\n\tprivate skills: Skill[];\n\tprivate skillDiagnostics: ResourceDiagnostic[];\n\tprivate prompts: PromptTemplate[];\n\tprivate promptDiagnostics: ResourceDiagnostic[];\n\tprivate themes: Theme[];\n\tprivate themeDiagnostics: ResourceDiagnostic[];\n\tprivate agentsFiles: Array<{ path: string; content: string }>;\n\tprivate systemPrompt?: string;\n\tprivate systemPromptSourcePath?: string;\n\tprivate appendSystemPrompt: string[];\n\tprivate appendSystemPromptSourcePaths: string[];\n\tprivate lastSkillPaths: string[];\n\tprivate extensionSkillSourceInfos: Map<string, SourceInfo>;\n\tprivate extensionPromptSourceInfos: Map<string, SourceInfo>;\n\tprivate extensionThemeSourceInfos: Map<string, SourceInfo>;\n\tprivate resourceMetadataByPath: Map<string, PathMetadata>;\n\tprivate lastPromptPaths: string[];\n\tprivate lastThemePaths: string[];\n\tprivate loaded: boolean;\n\n\tconstructor(options: DefaultResourceLoaderOptions) {\n\t\tthis.cwd = resolvePath(options.cwd);\n\t\tthis.agentDir = resolvePath(options.agentDir);\n\t\tthis.settingsManager = options.settingsManager ?? SettingsManager.create(this.cwd, this.agentDir);\n\t\tthis.eventBus = options.eventBus ?? createEventBus();\n\t\tthis.packageManager = new DefaultPackageManager({\n\t\t\tcwd: this.cwd,\n\t\t\tagentDir: this.agentDir,\n\t\t\tsettingsManager: this.settingsManager,\n\t\t});\n\t\tthis.additionalExtensionPaths = options.additionalExtensionPaths ?? [];\n\t\tthis.additionalSkillPaths = options.additionalSkillPaths ?? [];\n\t\tthis.additionalPromptTemplatePaths = options.additionalPromptTemplatePaths ?? [];\n\t\tthis.additionalThemePaths = options.additionalThemePaths ?? [];\n\t\tthis.extensionFactories = options.extensionFactories ?? [];\n\t\tthis.noExtensions = options.noExtensions ?? false;\n\t\tthis.noSkills = options.noSkills ?? false;\n\t\tthis.noPromptTemplates = options.noPromptTemplates ?? false;\n\t\tthis.noThemes = options.noThemes ?? false;\n\t\tthis.noContextFiles = options.noContextFiles ?? false;\n\t\tthis.systemPromptSource = options.systemPrompt;\n\t\tthis.appendSystemPromptSource = options.appendSystemPrompt;\n\t\tthis.extensionsOverride = options.extensionsOverride;\n\t\tthis.skillsOverride = options.skillsOverride;\n\t\tthis.promptsOverride = options.promptsOverride;\n\t\tthis.themesOverride = options.themesOverride;\n\t\tthis.agentsFilesOverride = options.agentsFilesOverride;\n\t\tthis.systemPromptOverride = options.systemPromptOverride;\n\t\tthis.appendSystemPromptOverride = options.appendSystemPromptOverride;\n\n\t\tthis.extensionsResult = { extensions: [], errors: [], runtime: createExtensionRuntime() };\n\t\tthis.skills = [];\n\t\tthis.skillDiagnostics = [];\n\t\tthis.prompts = [];\n\t\tthis.promptDiagnostics = [];\n\t\tthis.themes = [];\n\t\tthis.themeDiagnostics = [];\n\t\tthis.agentsFiles = [];\n\t\tthis.appendSystemPrompt = [];\n\t\tthis.appendSystemPromptSourcePaths = [];\n\t\tthis.lastSkillPaths = [];\n\t\tthis.extensionSkillSourceInfos = new Map();\n\t\tthis.extensionPromptSourceInfos = new Map();\n\t\tthis.extensionThemeSourceInfos = new Map();\n\t\tthis.resourceMetadataByPath = new Map();\n\t\tthis.lastPromptPaths = [];\n\t\tthis.lastThemePaths = [];\n\t\tthis.loaded = false;\n\t}\n\n\tgetExtensions(): LoadExtensionsResult {\n\t\treturn this.extensionsResult;\n\t}\n\n\tgetSkills(): { skills: Skill[]; diagnostics: ResourceDiagnostic[] } {\n\t\treturn { skills: this.skills, diagnostics: this.skillDiagnostics };\n\t}\n\n\tgetPrompts(): { prompts: PromptTemplate[]; diagnostics: ResourceDiagnostic[] } {\n\t\treturn { prompts: this.prompts, diagnostics: this.promptDiagnostics };\n\t}\n\n\tgetThemes(): { themes: Theme[]; diagnostics: ResourceDiagnostic[] } {\n\t\treturn { themes: this.themes, diagnostics: this.themeDiagnostics };\n\t}\n\n\tgetAgentsFiles(): { agentsFiles: Array<{ path: string; content: string }> } {\n\t\treturn { agentsFiles: this.agentsFiles };\n\t}\n\n\tgetSystemPrompt(): string | undefined {\n\t\treturn this.systemPrompt;\n\t}\n\n\tgetSystemPromptSource(): { path: string } | undefined {\n\t\treturn this.systemPromptSourcePath ? { path: this.systemPromptSourcePath } : undefined;\n\t}\n\n\tgetAppendSystemPrompt(): string[] {\n\t\treturn this.appendSystemPrompt;\n\t}\n\n\tgetAppendSystemPromptSources(): Array<{ path: string }> {\n\t\treturn this.appendSystemPromptSourcePaths.map((path) => ({ path }));\n\t}\n\n\textendResources(paths: ResourceExtensionPaths): void {\n\t\tconst skillPaths = this.normalizeExtensionPaths(paths.skillPaths ?? []);\n\t\tconst promptPaths = this.normalizeExtensionPaths(paths.promptPaths ?? []);\n\t\tconst themePaths = this.normalizeExtensionPaths(paths.themePaths ?? []);\n\n\t\tfor (const entry of skillPaths) {\n\t\t\tthis.extensionSkillSourceInfos.set(entry.path, createSourceInfo(entry.path, entry.metadata));\n\t\t}\n\t\tfor (const entry of promptPaths) {\n\t\t\tthis.extensionPromptSourceInfos.set(entry.path, createSourceInfo(entry.path, entry.metadata));\n\t\t}\n\t\tfor (const entry of themePaths) {\n\t\t\tthis.extensionThemeSourceInfos.set(entry.path, createSourceInfo(entry.path, entry.metadata));\n\t\t}\n\n\t\tif (skillPaths.length > 0) {\n\t\t\tthis.lastSkillPaths = this.mergePaths(\n\t\t\t\tthis.lastSkillPaths,\n\t\t\t\tskillPaths.map((entry) => entry.path),\n\t\t\t);\n\t\t\tthis.updateSkillsFromPaths(this.lastSkillPaths, this.resourceMetadataByPath);\n\t\t}\n\n\t\tif (promptPaths.length > 0) {\n\t\t\tthis.lastPromptPaths = this.mergePaths(\n\t\t\t\tthis.lastPromptPaths,\n\t\t\t\tpromptPaths.map((entry) => entry.path),\n\t\t\t);\n\t\t\tthis.updatePromptsFromPaths(this.lastPromptPaths, this.resourceMetadataByPath);\n\t\t}\n\n\t\tif (themePaths.length > 0) {\n\t\t\tthis.lastThemePaths = this.mergePaths(\n\t\t\t\tthis.lastThemePaths,\n\t\t\t\tthemePaths.map((entry) => entry.path),\n\t\t\t);\n\t\t\tthis.updateThemesFromPaths(this.lastThemePaths, this.resourceMetadataByPath);\n\t\t}\n\t}\n\n\tasync loadProjectTrustExtensions(): Promise<LoadExtensionsResult> {\n\t\t// Force untrusted project settings for the bootstrap pass. This keeps project-local\n\t\t// extensions/packages out while still loading user/global and temporary CLI extensions.\n\t\tthis.settingsManager.setProjectTrusted(false);\n\t\tawait this.settingsManager.reload();\n\t\treturn this.loadCurrentExtensionSet({ includeInlineFactories: true });\n\t}\n\n\tasync reload(options?: ResourceLoaderReloadOptions): Promise<void> {\n\t\tresetTimings(\"extensions\");\n\n\t\tif (this.loaded) {\n\t\t\tclearExtensionCache();\n\t\t}\n\n\t\tlet preTrustExtensions: LoadExtensionsResult | undefined;\n\t\tif (options?.resolveProjectTrust) {\n\t\t\tpreTrustExtensions = await this.loadProjectTrustExtensions();\n\t\t\tconst projectTrusted = await options.resolveProjectTrust({ extensionsResult: preTrustExtensions });\n\t\t\tthis.settingsManager.setProjectTrusted(projectTrusted);\n\t\t}\n\n\t\t// reload() preserves SettingsManager.projectTrusted and reloads settings for that trust state.\n\t\tawait this.settingsManager.reload();\n\t\tconst resolvedPaths = await this.packageManager.resolve();\n\t\tconst cliExtensionPaths = await this.packageManager.resolveExtensionSources(this.additionalExtensionPaths, {\n\t\t\ttemporary: true,\n\t\t});\n\t\t// Kept on the instance so post-reload passes (extendResources) can still resolve package metadata.\n\t\tthis.resourceMetadataByPath = new Map();\n\t\tconst metadataByPath = this.resourceMetadataByPath;\n\n\t\tthis.extensionSkillSourceInfos = new Map();\n\t\tthis.extensionPromptSourceInfos = new Map();\n\t\tthis.extensionThemeSourceInfos = new Map();\n\n\t\t// Helper to extract enabled paths and store metadata\n\t\tconst getEnabledResources = (resources: ResolvedResource[]): ResolvedResource[] => {\n\t\t\tfor (const r of resources) {\n\t\t\t\tif (!metadataByPath.has(r.path)) {\n\t\t\t\t\tmetadataByPath.set(r.path, r.metadata);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn resources.filter((r) => r.enabled);\n\t\t};\n\n\t\tconst getEnabledPaths = (resources: ResolvedResource[]): string[] =>\n\t\t\tgetEnabledResources(resources).map((r) => r.path);\n\t\tconst enabledExtensions = getEnabledPaths(resolvedPaths.extensions);\n\t\tconst enabledSkillResources = getEnabledResources(resolvedPaths.skills);\n\t\tconst enabledPrompts = getEnabledPaths(resolvedPaths.prompts);\n\t\tconst enabledThemes = getEnabledPaths(resolvedPaths.themes);\n\n\t\tconst enabledSkills = enabledSkillResources.map((resource) => this.mapSkillPath(resource, metadataByPath));\n\n\t\t// Add CLI paths metadata\n\t\tfor (const r of cliExtensionPaths.extensions) {\n\t\t\tif (!metadataByPath.has(r.path)) {\n\t\t\t\tmetadataByPath.set(r.path, { source: \"cli\", scope: \"temporary\", origin: \"top-level\" });\n\t\t\t}\n\t\t}\n\t\tfor (const r of cliExtensionPaths.skills) {\n\t\t\tif (!metadataByPath.has(r.path)) {\n\t\t\t\tmetadataByPath.set(r.path, { source: \"cli\", scope: \"temporary\", origin: \"top-level\" });\n\t\t\t}\n\t\t}\n\n\t\tconst cliEnabledExtensions = getEnabledPaths(cliExtensionPaths.extensions);\n\t\tconst cliEnabledSkills = getEnabledPaths(cliExtensionPaths.skills);\n\t\tconst cliEnabledPrompts = getEnabledPaths(cliExtensionPaths.prompts);\n\t\tconst cliEnabledThemes = getEnabledPaths(cliExtensionPaths.themes);\n\n\t\tconst extensionPaths = this.noExtensions\n\t\t\t? cliEnabledExtensions\n\t\t\t: this.mergePaths(cliEnabledExtensions, enabledExtensions);\n\n\t\tconst extensionsResult = await this.loadFinalExtensionSet(extensionPaths, preTrustExtensions);\n\t\tfor (const p of this.additionalExtensionPaths) {\n\t\t\tif (isLocalPath(p)) {\n\t\t\t\tconst resolved = this.resolveResourcePath(p);\n\t\t\t\tif (!existsSync(resolved)) {\n\t\t\t\t\textensionsResult.errors.push({ path: resolved, error: `Extension path does not exist: ${resolved}` });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.extensionsResult = this.extensionsOverride ? this.extensionsOverride(extensionsResult) : extensionsResult;\n\t\tthis.applyExtensionSourceInfo(this.extensionsResult.extensions, metadataByPath);\n\n\t\tconst skillPaths = this.noSkills\n\t\t\t? this.mergePaths(cliEnabledSkills, this.additionalSkillPaths)\n\t\t\t: this.mergePaths([...cliEnabledSkills, ...enabledSkills], this.additionalSkillPaths);\n\n\t\tthis.lastSkillPaths = skillPaths;\n\t\tthis.updateSkillsFromPaths(skillPaths, metadataByPath);\n\t\tfor (const p of this.additionalSkillPaths) {\n\t\t\tif (isLocalPath(p)) {\n\t\t\t\tconst resolved = this.resolveResourcePath(p);\n\t\t\t\tif (!existsSync(resolved) && !this.skillDiagnostics.some((d) => d.path === resolved)) {\n\t\t\t\t\tthis.skillDiagnostics.push({ type: \"error\", message: \"Skill path does not exist\", path: resolved });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst promptPaths = this.noPromptTemplates\n\t\t\t? this.mergePaths(cliEnabledPrompts, this.additionalPromptTemplatePaths)\n\t\t\t: this.mergePaths([...cliEnabledPrompts, ...enabledPrompts], this.additionalPromptTemplatePaths);\n\n\t\tthis.lastPromptPaths = promptPaths;\n\t\tthis.updatePromptsFromPaths(promptPaths, metadataByPath);\n\t\tfor (const p of this.additionalPromptTemplatePaths) {\n\t\t\tif (isLocalPath(p)) {\n\t\t\t\tconst resolved = this.resolveResourcePath(p);\n\t\t\t\tif (!existsSync(resolved) && !this.promptDiagnostics.some((d) => d.path === resolved)) {\n\t\t\t\t\tthis.promptDiagnostics.push({\n\t\t\t\t\t\ttype: \"error\",\n\t\t\t\t\t\tmessage: \"Prompt template path does not exist\",\n\t\t\t\t\t\tpath: resolved,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst themePaths = this.noThemes\n\t\t\t? this.mergePaths(cliEnabledThemes, this.additionalThemePaths)\n\t\t\t: this.mergePaths([...cliEnabledThemes, ...enabledThemes], this.additionalThemePaths);\n\n\t\tthis.lastThemePaths = themePaths;\n\t\tthis.updateThemesFromPaths(themePaths, metadataByPath);\n\t\tfor (const p of this.additionalThemePaths) {\n\t\t\tconst resolved = this.resolveResourcePath(p);\n\t\t\tif (!existsSync(resolved) && !this.themeDiagnostics.some((d) => d.path === resolved)) {\n\t\t\t\tthis.themeDiagnostics.push({ type: \"error\", message: \"Theme path does not exist\", path: resolved });\n\t\t\t}\n\t\t}\n\n\t\tconst agentsFiles = {\n\t\t\tagentsFiles: this.noContextFiles\n\t\t\t\t? []\n\t\t\t\t: loadProjectContextFiles({\n\t\t\t\t\t\tcwd: this.cwd,\n\t\t\t\t\t\tagentDir: this.agentDir,\n\t\t\t\t\t}),\n\t\t};\n\t\tconst resolvedAgentsFiles = this.agentsFilesOverride ? this.agentsFilesOverride(agentsFiles) : agentsFiles;\n\t\tthis.agentsFiles = resolvedAgentsFiles.agentsFiles;\n\n\t\tconst systemPromptSource = this.systemPromptSource ?? this.discoverSystemPromptFile();\n\t\tconst baseSystemPrompt = resolvePromptInput(systemPromptSource, \"system prompt\");\n\t\tthis.systemPrompt = this.systemPromptOverride ? this.systemPromptOverride(baseSystemPrompt) : baseSystemPrompt;\n\t\tthis.systemPromptSourcePath =\n\t\t\tsystemPromptSource && existsSync(systemPromptSource) ? resolvePath(systemPromptSource) : undefined;\n\n\t\tlet appendSources = this.appendSystemPromptSource;\n\t\tif (!appendSources) {\n\t\t\tconst discoveredAppendSystemPromptFile = this.discoverAppendSystemPromptFile();\n\t\t\tappendSources = discoveredAppendSystemPromptFile ? [discoveredAppendSystemPromptFile] : [];\n\t\t}\n\t\tconst baseAppend = appendSources\n\t\t\t.map((s) => resolvePromptInput(s, \"append system prompt\"))\n\t\t\t.filter((s): s is string => s !== undefined);\n\t\tthis.appendSystemPrompt = this.appendSystemPromptOverride\n\t\t\t? this.appendSystemPromptOverride(baseAppend)\n\t\t\t: baseAppend;\n\t\tthis.appendSystemPromptSourcePaths = appendSources\n\t\t\t.filter((source) => existsSync(source))\n\t\t\t.map((source) => resolvePath(source));\n\t\tthis.loaded = true;\n\t}\n\n\tprivate async loadCurrentExtensionSet(options: { includeInlineFactories: boolean }): Promise<LoadExtensionsResult> {\n\t\tconst resolvedPaths = await this.packageManager.resolve();\n\t\tconst cliExtensionPaths = await this.packageManager.resolveExtensionSources(this.additionalExtensionPaths, {\n\t\t\ttemporary: true,\n\t\t});\n\t\tconst enabledExtensions = resolvedPaths.extensions.filter((r) => r.enabled).map((r) => r.path);\n\t\tconst cliEnabledExtensions = cliExtensionPaths.extensions.filter((r) => r.enabled).map((r) => r.path);\n\t\tconst extensionPaths = this.noExtensions\n\t\t\t? cliEnabledExtensions\n\t\t\t: this.mergePaths(cliEnabledExtensions, enabledExtensions);\n\t\tconst extensionsResult = await loadExtensionsCached(extensionPaths, this.cwd, this.eventBus);\n\t\tif (!options.includeInlineFactories) {\n\t\t\treturn extensionsResult;\n\t\t}\n\n\t\tconst inlineExtensions = await this.loadExtensionFactories(extensionsResult.runtime);\n\t\textensionsResult.extensions.push(...inlineExtensions.extensions);\n\t\textensionsResult.errors.push(...inlineExtensions.errors);\n\t\treturn extensionsResult;\n\t}\n\n\tprivate resolveExtensionLoadPath(path: string): string {\n\t\treturn resolvePath(path, this.cwd, { normalizeUnicodeSpaces: true });\n\t}\n\n\tprivate async loadFinalExtensionSet(\n\t\textensionPaths: string[],\n\t\tpreTrustExtensions: LoadExtensionsResult | undefined,\n\t): Promise<LoadExtensionsResult> {\n\t\tif (!preTrustExtensions) {\n\t\t\tconst extensionsResult = await loadExtensionsCached(extensionPaths, this.cwd, this.eventBus);\n\t\t\tconst inlineExtensions = await this.loadExtensionFactories(extensionsResult.runtime);\n\t\t\textensionsResult.extensions.push(...inlineExtensions.extensions);\n\t\t\textensionsResult.errors.push(...inlineExtensions.errors);\n\t\t\tthis.addExtensionConflictDiagnostics(extensionsResult);\n\t\t\treturn extensionsResult;\n\t\t}\n\n\t\tconst preloadedByPath = new Map(\n\t\t\tpreTrustExtensions.extensions\n\t\t\t\t.filter((extension) => !extension.path.startsWith(\"<inline:\"))\n\t\t\t\t.map((extension) => [extension.resolvedPath, extension]),\n\t\t);\n\t\tconst failedPreloadPaths = new Set(\n\t\t\tpreTrustExtensions.errors.map((error) => this.resolveExtensionLoadPath(error.path)),\n\t\t);\n\t\tconst remainingPaths = extensionPaths.filter((path) => {\n\t\t\tconst resolvedPath = this.resolveExtensionLoadPath(path);\n\t\t\treturn !preloadedByPath.has(resolvedPath) && !failedPreloadPaths.has(resolvedPath);\n\t\t});\n\t\tconst remainingExtensions = await loadExtensionsCached(\n\t\t\tremainingPaths,\n\t\t\tthis.cwd,\n\t\t\tthis.eventBus,\n\t\t\tpreTrustExtensions.runtime,\n\t\t);\n\t\tconst loadedByPath = new Map(preloadedByPath);\n\t\tfor (const extension of remainingExtensions.extensions) {\n\t\t\tloadedByPath.set(extension.resolvedPath, extension);\n\t\t}\n\n\t\tconst inlineExtensions = preTrustExtensions.extensions.filter((extension) =>\n\t\t\textension.path.startsWith(\"<inline:\"),\n\t\t);\n\t\tconst orderedExtensions = extensionPaths\n\t\t\t.map((path) => loadedByPath.get(this.resolveExtensionLoadPath(path)))\n\t\t\t.filter((extension): extension is Extension => extension !== undefined);\n\t\torderedExtensions.push(...inlineExtensions);\n\n\t\tconst extensionsResult: LoadExtensionsResult = {\n\t\t\textensions: orderedExtensions,\n\t\t\terrors: [...preTrustExtensions.errors, ...remainingExtensions.errors],\n\t\t\truntime: preTrustExtensions.runtime,\n\t\t};\n\t\tthis.addExtensionConflictDiagnostics(extensionsResult);\n\t\treturn extensionsResult;\n\t}\n\n\tprivate addExtensionConflictDiagnostics(extensionsResult: LoadExtensionsResult): void {\n\t\t// Detect extension conflicts (tools, commands, flags with same names from different extensions)\n\t\t// Keep all extensions loaded. Conflicts are reported as diagnostics, and precedence is handled by load order.\n\t\tconst conflicts = this.detectExtensionConflicts(extensionsResult.extensions);\n\t\tfor (const conflict of conflicts) {\n\t\t\textensionsResult.errors.push({ path: conflict.path, error: conflict.message });\n\t\t}\n\t}\n\n\tprivate mapSkillPath(resource: ResolvedResource, metadataByPath: Map<string, PathMetadata>): string {\n\t\tif (resource.metadata.source !== \"auto\" && resource.metadata.origin !== \"package\") {\n\t\t\treturn resource.path;\n\t\t}\n\t\ttry {\n\t\t\tconst stats = statSync(resource.path);\n\t\t\tif (!stats.isDirectory()) {\n\t\t\t\treturn resource.path;\n\t\t\t}\n\t\t} catch {\n\t\t\treturn resource.path;\n\t\t}\n\t\tconst skillFile = join(resource.path, \"SKILL.md\");\n\t\tif (existsSync(skillFile)) {\n\t\t\tif (!metadataByPath.has(skillFile)) {\n\t\t\t\tmetadataByPath.set(skillFile, resource.metadata);\n\t\t\t}\n\t\t\treturn skillFile;\n\t\t}\n\t\treturn resource.path;\n\t}\n\n\tprivate normalizeExtensionPaths(\n\t\tentries: Array<{ path: string; metadata: PathMetadata }>,\n\t): Array<{ path: string; metadata: PathMetadata }> {\n\t\treturn entries.map((entry) => {\n\t\t\tconst metadata = entry.metadata.baseDir\n\t\t\t\t? { ...entry.metadata, baseDir: this.resolveResourcePath(entry.metadata.baseDir) }\n\t\t\t\t: entry.metadata;\n\t\t\treturn {\n\t\t\t\tpath: this.resolveResourcePath(entry.path),\n\t\t\t\tmetadata,\n\t\t\t};\n\t\t});\n\t}\n\n\tprivate updateSkillsFromPaths(skillPaths: string[], metadataByPath?: Map<string, PathMetadata>): void {\n\t\tlet skillsResult: { skills: Skill[]; diagnostics: ResourceDiagnostic[] };\n\t\tif (this.noSkills && skillPaths.length === 0) {\n\t\t\tskillsResult = { skills: [], diagnostics: [] };\n\t\t} else {\n\t\t\tskillsResult = loadSkills({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tagentDir: this.agentDir,\n\t\t\t\tskillPaths,\n\t\t\t\tincludeDefaults: false,\n\t\t\t});\n\t\t}\n\t\tconst resolvedSkills = this.skillsOverride ? this.skillsOverride(skillsResult) : skillsResult;\n\t\tthis.skills = resolvedSkills.skills.map((skill) => ({\n\t\t\t...skill,\n\t\t\tsourceInfo:\n\t\t\t\tthis.findSourceInfoForPath(skill.filePath, this.extensionSkillSourceInfos, metadataByPath) ??\n\t\t\t\tskill.sourceInfo ??\n\t\t\t\tthis.getDefaultSourceInfoForPath(skill.filePath),\n\t\t}));\n\t\tthis.skillDiagnostics = resolvedSkills.diagnostics;\n\t}\n\n\tprivate updatePromptsFromPaths(promptPaths: string[], metadataByPath?: Map<string, PathMetadata>): void {\n\t\tlet promptsResult: { prompts: PromptTemplate[]; diagnostics: ResourceDiagnostic[] };\n\t\tif (this.noPromptTemplates && promptPaths.length === 0) {\n\t\t\tpromptsResult = { prompts: [], diagnostics: [] };\n\t\t} else {\n\t\t\tconst loaded = loadPromptTemplates({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tagentDir: this.agentDir,\n\t\t\t\tpromptPaths,\n\t\t\t\tincludeDefaults: false,\n\t\t\t});\n\t\t\tconst deduped = this.dedupePrompts(loaded.templates);\n\t\t\tpromptsResult = {\n\t\t\t\tprompts: deduped.prompts,\n\t\t\t\tdiagnostics: [...loaded.diagnostics, ...deduped.diagnostics],\n\t\t\t};\n\t\t}\n\t\tconst resolvedPrompts = this.promptsOverride ? this.promptsOverride(promptsResult) : promptsResult;\n\t\tthis.prompts = resolvedPrompts.prompts.map((prompt) => ({\n\t\t\t...prompt,\n\t\t\tsourceInfo:\n\t\t\t\tthis.findSourceInfoForPath(prompt.filePath, this.extensionPromptSourceInfos, metadataByPath) ??\n\t\t\t\tprompt.sourceInfo ??\n\t\t\t\tthis.getDefaultSourceInfoForPath(prompt.filePath),\n\t\t}));\n\t\tthis.promptDiagnostics = resolvedPrompts.diagnostics;\n\t}\n\n\tprivate updateThemesFromPaths(themePaths: string[], metadataByPath?: Map<string, PathMetadata>): void {\n\t\tlet themesResult: { themes: Theme[]; diagnostics: ResourceDiagnostic[] };\n\t\tif (this.noThemes && themePaths.length === 0) {\n\t\t\tthemesResult = { themes: [], diagnostics: [] };\n\t\t} else {\n\t\t\tconst loaded = this.loadThemes(themePaths, false);\n\t\t\tconst deduped = this.dedupeThemes(loaded.themes);\n\t\t\tthemesResult = { themes: deduped.themes, diagnostics: [...loaded.diagnostics, ...deduped.diagnostics] };\n\t\t}\n\t\tconst resolvedThemes = this.themesOverride ? this.themesOverride(themesResult) : themesResult;\n\t\tthis.themes = resolvedThemes.themes.map((theme) => {\n\t\t\tconst sourcePath = theme.sourcePath;\n\t\t\ttheme.sourceInfo = sourcePath\n\t\t\t\t? (this.findSourceInfoForPath(sourcePath, this.extensionThemeSourceInfos, metadataByPath) ??\n\t\t\t\t\ttheme.sourceInfo ??\n\t\t\t\t\tthis.getDefaultSourceInfoForPath(sourcePath))\n\t\t\t\t: theme.sourceInfo;\n\t\t\treturn theme;\n\t\t});\n\t\tthis.themeDiagnostics = resolvedThemes.diagnostics;\n\t}\n\n\tprivate applyExtensionSourceInfo(extensions: Extension[], metadataByPath: Map<string, PathMetadata>): void {\n\t\tfor (const extension of extensions) {\n\t\t\textension.sourceInfo =\n\t\t\t\tthis.findSourceInfoForPath(extension.path, undefined, metadataByPath) ??\n\t\t\t\tthis.getDefaultSourceInfoForPath(extension.path);\n\t\t\tfor (const command of extension.commands.values()) {\n\t\t\t\tcommand.sourceInfo = extension.sourceInfo;\n\t\t\t}\n\t\t\tfor (const tool of extension.tools.values()) {\n\t\t\t\ttool.sourceInfo = extension.sourceInfo;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate findSourceInfoForPath(\n\t\tresourcePath: string,\n\t\textraSourceInfos?: Map<string, SourceInfo>,\n\t\tmetadataByPath?: Map<string, PathMetadata>,\n\t): SourceInfo | undefined {\n\t\tif (!resourcePath) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (resourcePath.startsWith(\"<\")) {\n\t\t\treturn this.getDefaultSourceInfoForPath(resourcePath);\n\t\t}\n\n\t\tconst normalizedResourcePath = resolve(resourcePath);\n\t\tif (extraSourceInfos) {\n\t\t\tfor (const [sourcePath, sourceInfo] of extraSourceInfos.entries()) {\n\t\t\t\tconst normalizedSourcePath = resolve(sourcePath);\n\t\t\t\tif (\n\t\t\t\t\tnormalizedResourcePath === normalizedSourcePath ||\n\t\t\t\t\tnormalizedResourcePath.startsWith(`${normalizedSourcePath}${sep}`)\n\t\t\t\t) {\n\t\t\t\t\treturn { ...sourceInfo, path: resourcePath };\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (metadataByPath) {\n\t\t\tconst exact = metadataByPath.get(normalizedResourcePath) ?? metadataByPath.get(resourcePath);\n\t\t\tif (exact) {\n\t\t\t\treturn createSourceInfo(resourcePath, exact);\n\t\t\t}\n\n\t\t\tfor (const [sourcePath, metadata] of metadataByPath.entries()) {\n\t\t\t\tconst normalizedSourcePath = resolve(sourcePath);\n\t\t\t\tif (\n\t\t\t\t\tnormalizedResourcePath === normalizedSourcePath ||\n\t\t\t\t\tnormalizedResourcePath.startsWith(`${normalizedSourcePath}${sep}`)\n\t\t\t\t) {\n\t\t\t\t\treturn createSourceInfo(resourcePath, metadata);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tprivate getDefaultSourceInfoForPath(filePath: string): SourceInfo {\n\t\tif (filePath.startsWith(\"<\") && filePath.endsWith(\">\")) {\n\t\t\treturn {\n\t\t\t\tpath: filePath,\n\t\t\t\tsource: filePath.slice(1, -1).split(\":\")[0] || \"temporary\",\n\t\t\t\tscope: \"temporary\",\n\t\t\t\torigin: \"top-level\",\n\t\t\t};\n\t\t}\n\n\t\tconst normalizedPath = resolve(filePath);\n\t\tconst agentRoots = [\n\t\t\tjoin(this.agentDir, \"skills\"),\n\t\t\tjoin(this.agentDir, \"prompts\"),\n\t\t\tjoin(this.agentDir, \"themes\"),\n\t\t\tjoin(this.agentDir, \"extensions\"),\n\t\t];\n\t\tconst projectRoots = [\n\t\t\tjoin(this.cwd, CONFIG_DIR_NAME, \"skills\"),\n\t\t\tjoin(this.cwd, CONFIG_DIR_NAME, \"prompts\"),\n\t\t\tjoin(this.cwd, CONFIG_DIR_NAME, \"themes\"),\n\t\t\tjoin(this.cwd, CONFIG_DIR_NAME, \"extensions\"),\n\t\t];\n\n\t\tfor (const root of agentRoots) {\n\t\t\tif (this.isUnderPath(normalizedPath, root)) {\n\t\t\t\treturn { path: filePath, source: \"local\", scope: \"user\", origin: \"top-level\", baseDir: root };\n\t\t\t}\n\t\t}\n\n\t\tfor (const root of projectRoots) {\n\t\t\tif (this.isUnderPath(normalizedPath, root)) {\n\t\t\t\treturn { path: filePath, source: \"local\", scope: \"project\", origin: \"top-level\", baseDir: root };\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tpath: filePath,\n\t\t\tsource: \"local\",\n\t\t\tscope: \"temporary\",\n\t\t\torigin: \"top-level\",\n\t\t\tbaseDir: statSync(normalizedPath).isDirectory() ? normalizedPath : resolve(normalizedPath, \"..\"),\n\t\t};\n\t}\n\n\tprivate mergePaths(primary: string[], additional: string[]): string[] {\n\t\tconst merged: string[] = [];\n\t\tconst seen = new Set<string>();\n\n\t\tfor (const p of [...primary, ...additional]) {\n\t\t\tconst resolved = this.resolveResourcePath(p);\n\t\t\tconst canonicalPath = canonicalizePath(resolved);\n\t\t\tif (seen.has(canonicalPath)) continue;\n\t\t\tseen.add(canonicalPath);\n\t\t\tmerged.push(resolved);\n\t\t}\n\n\t\treturn merged;\n\t}\n\n\tprivate resolveResourcePath(p: string): string {\n\t\treturn resolvePath(p, this.cwd, { trim: true });\n\t}\n\n\tprivate loadThemes(\n\t\tpaths: string[],\n\t\tincludeDefaults: boolean = true,\n\t): {\n\t\tthemes: Theme[];\n\t\tdiagnostics: ResourceDiagnostic[];\n\t} {\n\t\tconst themes: Theme[] = [];\n\t\tconst diagnostics: ResourceDiagnostic[] = [];\n\t\tif (includeDefaults) {\n\t\t\tconst defaultDirs = [join(this.agentDir, \"themes\"), join(this.cwd, CONFIG_DIR_NAME, \"themes\")];\n\n\t\t\tfor (const dir of defaultDirs) {\n\t\t\t\tthis.loadThemesFromDir(dir, themes, diagnostics);\n\t\t\t}\n\t\t}\n\n\t\tfor (const p of paths) {\n\t\t\tconst resolved = this.resolveResourcePath(p);\n\t\t\tif (!existsSync(resolved)) {\n\t\t\t\tdiagnostics.push({ type: \"warning\", message: \"theme path does not exist\", path: resolved });\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst stats = statSync(resolved);\n\t\t\t\tif (stats.isDirectory()) {\n\t\t\t\t\tthis.loadThemesFromDir(resolved, themes, diagnostics);\n\t\t\t\t} else if (stats.isFile() && resolved.endsWith(\".json\")) {\n\t\t\t\t\tthis.loadThemeFromFile(resolved, themes, diagnostics);\n\t\t\t\t} else {\n\t\t\t\t\tdiagnostics.push({ type: \"warning\", message: \"theme path is not a json file\", path: resolved });\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : \"failed to read theme path\";\n\t\t\t\tdiagnostics.push({ type: \"warning\", message, path: resolved });\n\t\t\t}\n\t\t}\n\n\t\treturn { themes, diagnostics };\n\t}\n\n\tprivate loadThemesFromDir(dir: string, themes: Theme[], diagnostics: ResourceDiagnostic[]): void {\n\t\tif (!existsSync(dir)) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst entries = readdirSync(dir, { withFileTypes: true });\n\t\t\tfor (const entry of entries) {\n\t\t\t\tlet isFile = entry.isFile();\n\t\t\t\tif (entry.isSymbolicLink()) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tisFile = statSync(join(dir, entry.name)).isFile();\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!isFile) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (!entry.name.endsWith(\".json\")) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tthis.loadThemeFromFile(join(dir, entry.name), themes, diagnostics);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"failed to read theme directory\";\n\t\t\tdiagnostics.push({ type: \"warning\", message, path: dir });\n\t\t}\n\t}\n\n\tprivate loadThemeFromFile(filePath: string, themes: Theme[], diagnostics: ResourceDiagnostic[]): void {\n\t\ttry {\n\t\t\tthemes.push(loadThemeFromPath(filePath));\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"failed to load theme\";\n\t\t\tdiagnostics.push({ type: \"warning\", message, path: filePath });\n\t\t}\n\t}\n\n\tprivate async loadExtensionFactories(runtime: ExtensionRuntime): Promise<{\n\t\textensions: Extension[];\n\t\terrors: Array<{ path: string; error: string }>;\n\t}> {\n\t\tconst extensions: Extension[] = [];\n\t\tconst errors: Array<{ path: string; error: string }> = [];\n\n\t\tfor (const [index, input] of this.extensionFactories.entries()) {\n\t\t\tconst isNamed = typeof input !== \"function\";\n\t\t\tconst factory = isNamed ? input.factory : input;\n\t\t\tconst extensionPath = `<inline:${isNamed ? input.name : index + 1}>`;\n\t\t\ttry {\n\t\t\t\tconst extension = await loadExtensionFromFactory(factory, this.cwd, this.eventBus, runtime, extensionPath);\n\t\t\t\textension.hidden = isNamed && input.hidden;\n\t\t\t\textensions.push(extension);\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : \"failed to load extension\";\n\t\t\t\terrors.push({ path: extensionPath, error: message });\n\t\t\t}\n\t\t}\n\n\t\treturn { extensions, errors };\n\t}\n\n\tprivate dedupePrompts(prompts: PromptTemplate[]): { prompts: PromptTemplate[]; diagnostics: ResourceDiagnostic[] } {\n\t\tconst seen = new Map<string, PromptTemplate>();\n\t\tconst diagnostics: ResourceDiagnostic[] = [];\n\n\t\tfor (const prompt of prompts) {\n\t\t\tconst existing = seen.get(prompt.name);\n\t\t\tif (existing) {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\ttype: \"collision\",\n\t\t\t\t\tmessage: `name \"/${prompt.name}\" collision`,\n\t\t\t\t\tpath: prompt.filePath,\n\t\t\t\t\tcollision: {\n\t\t\t\t\t\tresourceType: \"prompt\",\n\t\t\t\t\t\tname: prompt.name,\n\t\t\t\t\t\twinnerPath: existing.filePath,\n\t\t\t\t\t\tloserPath: prompt.filePath,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tseen.set(prompt.name, prompt);\n\t\t\t}\n\t\t}\n\n\t\treturn { prompts: Array.from(seen.values()), diagnostics };\n\t}\n\n\tprivate dedupeThemes(themes: Theme[]): { themes: Theme[]; diagnostics: ResourceDiagnostic[] } {\n\t\tconst seen = new Map<string, Theme>();\n\t\tconst diagnostics: ResourceDiagnostic[] = [];\n\n\t\tfor (const t of themes) {\n\t\t\tconst name = t.name ?? \"unnamed\";\n\t\t\tconst existing = seen.get(name);\n\t\t\tif (existing) {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\ttype: \"collision\",\n\t\t\t\t\tmessage: `name \"${name}\" collision`,\n\t\t\t\t\tpath: t.sourcePath,\n\t\t\t\t\tcollision: {\n\t\t\t\t\t\tresourceType: \"theme\",\n\t\t\t\t\t\tname,\n\t\t\t\t\t\twinnerPath: existing.sourcePath ?? \"<builtin>\",\n\t\t\t\t\t\tloserPath: t.sourcePath ?? \"<builtin>\",\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tseen.set(name, t);\n\t\t\t}\n\t\t}\n\n\t\treturn { themes: Array.from(seen.values()), diagnostics };\n\t}\n\n\tprivate discoverSystemPromptFile(): string | undefined {\n\t\tconst projectPath = join(this.cwd, CONFIG_DIR_NAME, \"SYSTEM.md\");\n\t\tif (this.settingsManager.isProjectTrusted() && existsSync(projectPath)) {\n\t\t\treturn projectPath;\n\t\t}\n\n\t\tconst globalPath = join(this.agentDir, \"SYSTEM.md\");\n\t\tif (existsSync(globalPath)) {\n\t\t\treturn globalPath;\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tprivate discoverAppendSystemPromptFile(): string | undefined {\n\t\tconst projectPath = join(this.cwd, CONFIG_DIR_NAME, \"APPEND_SYSTEM.md\");\n\t\tif (this.settingsManager.isProjectTrusted() && existsSync(projectPath)) {\n\t\t\treturn projectPath;\n\t\t}\n\n\t\tconst globalPath = join(this.agentDir, \"APPEND_SYSTEM.md\");\n\t\tif (existsSync(globalPath)) {\n\t\t\treturn globalPath;\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tprivate isUnderPath(target: string, root: string): boolean {\n\t\tconst normalizedRoot = resolve(root);\n\t\tif (target === normalizedRoot) {\n\t\t\treturn true;\n\t\t}\n\t\tconst prefix = normalizedRoot.endsWith(sep) ? normalizedRoot : `${normalizedRoot}${sep}`;\n\t\treturn target.startsWith(prefix);\n\t}\n\n\tprivate detectExtensionConflicts(extensions: Extension[]): Array<{ path: string; message: string }> {\n\t\tconst conflicts: Array<{ path: string; message: string }> = [];\n\n\t\t// Track which extension registered each tool and flag\n\t\tconst toolOwners = new Map<string, string>();\n\t\tconst flagOwners = new Map<string, string>();\n\n\t\tfor (const ext of extensions) {\n\t\t\t// Check tools\n\t\t\tfor (const toolName of ext.tools.keys()) {\n\t\t\t\tconst existingOwner = toolOwners.get(toolName);\n\t\t\t\tif (existingOwner && existingOwner !== ext.path) {\n\t\t\t\t\tconflicts.push({\n\t\t\t\t\t\tpath: ext.path,\n\t\t\t\t\t\tmessage: `Tool \"${toolName}\" conflicts with ${existingOwner}`,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\ttoolOwners.set(toolName, ext.path);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check flags\n\t\t\tfor (const flagName of ext.flags.keys()) {\n\t\t\t\tconst existingOwner = flagOwners.get(flagName);\n\t\t\t\tif (existingOwner && existingOwner !== ext.path) {\n\t\t\t\t\tconflicts.push({\n\t\t\t\t\t\tpath: ext.path,\n\t\t\t\t\t\tmessage: `Flag \"--${flagName}\" conflicts with ${existingOwner}`,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tflagOwners.set(flagName, ext.path);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn conflicts;\n\t}\n}\n"]}
1
+ {"version":3,"file":"resource-loader.d.ts","sourceRoot":"","sources":["../../src/core/resource-loader.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
2
2
  import { basename, dirname, join, resolve, sep } from "node:path";
3
+ import { detectCapabilities, getTerminalColorMode } from "@earendil-works/pi-tui";
3
4
  import chalk from "chalk";
4
5
  import { CONFIG_DIR_NAME } from "../config.js";
5
6
  import { loadThemeFromPath } from "../modes/interactive/theme/theme.js";
@@ -12,8 +13,90 @@ import { DefaultPackageManager } from "./package-manager.js";
12
13
  import { loadPromptTemplates } from "./prompt-templates.js";
13
14
  import { SettingsManager } from "./settings-manager.js";
14
15
  import { loadSkills } from "./skills.js";
15
- import { createSourceInfo } from "./source-info.js";
16
+ import { BUILTIN_PATH_PREFIX, createSourceInfo, getSyntheticPathSource, isSyntheticPath, } from "./source-info.js";
16
17
  import { resetTimings } from "./timings.js";
18
+ const HOST_PROVIDED_EXTENSION_PACKAGES = new Set([
19
+ "@earendil-works/pi-agent-core",
20
+ "@earendil-works/pi-ai",
21
+ "@earendil-works/pi-coding-agent",
22
+ "@earendil-works/pi-tui",
23
+ "@mariozechner/pi-agent-core",
24
+ "@mariozechner/pi-ai",
25
+ "@mariozechner/pi-coding-agent",
26
+ "@mariozechner/pi-tui",
27
+ "@sinclair/typebox",
28
+ "typebox",
29
+ ]);
30
+ function collectExtensionPackageWarnings(extensionPaths, metadataByPath) {
31
+ const warnings = [];
32
+ const packageRoots = new Set(extensionPaths
33
+ .map((extensionPath) => metadataByPath.get(extensionPath)?.packageRoot)
34
+ .filter((packageRoot) => packageRoot !== undefined));
35
+ for (const packageRoot of packageRoots) {
36
+ const packageJsonPath = join(packageRoot, "package.json");
37
+ if (!existsSync(packageJsonPath))
38
+ continue;
39
+ const manifest = JSON.parse(stripBom(readFileSync(packageJsonPath, "utf-8")));
40
+ if (typeof manifest.dependencies !== "object" ||
41
+ manifest.dependencies === null ||
42
+ Array.isArray(manifest.dependencies)) {
43
+ continue;
44
+ }
45
+ const hostDependencies = Object.keys(manifest.dependencies)
46
+ .filter((name) => HOST_PROVIDED_EXTENSION_PACKAGES.has(name))
47
+ .sort();
48
+ if (hostDependencies.length === 0)
49
+ continue;
50
+ warnings.push({
51
+ path: packageJsonPath,
52
+ warning: `Host-provided extension packages must be declared in peerDependencies with a "*" range, not dependencies: ${hostDependencies.join(", ")}. Installed copies can bypass the extension loader and create duplicate runtime modules.`,
53
+ });
54
+ }
55
+ return warnings;
56
+ }
57
+ function mergeExtensionWarnings(result, warnings) {
58
+ result.warnings = [
59
+ ...new Map([...(result.warnings ?? []), ...warnings].map((warning) => [warning.path, warning])).values(),
60
+ ];
61
+ }
62
+ /** Built-in extensions supply the code of `builtin:<name>` extension paths (see `InlineExtension`). */
63
+ export function isBuiltinExtension(input) {
64
+ return typeof input !== "function" && input.builtin === true;
65
+ }
66
+ /**
67
+ * Leave out replaceable extensions (see `InlineExtension`) that share a tool, command, or flag name
68
+ * with another extension. For example, a third-party MCP extension that registers `/mcp` replaces
69
+ * the built-in MCP extension instead of both connecting the same servers.
70
+ */
71
+ function omitReplacedExtensions(extensions, warnings) {
72
+ const names = (extension) => [
73
+ ...[...extension.tools.keys()].map((name) => `tool:${name}`),
74
+ ...[...extension.commands.keys()].map((name) => `command:${name}`),
75
+ ...[...extension.flags.keys()].map((name) => `flag:${name}`),
76
+ ];
77
+ const taken = new Map(extensions
78
+ .filter((extension) => !extension.replaceable)
79
+ .flatMap((extension) => names(extension).map((name) => [name, extension])));
80
+ return extensions.filter((extension) => {
81
+ if (!extension.replaceable)
82
+ return true;
83
+ const replacement = names(extension)
84
+ .map((name) => ({ name, extension: taken.get(name) }))
85
+ .find((value) => value.extension !== undefined);
86
+ if (!replacement)
87
+ return true;
88
+ if (extension.path.startsWith(BUILTIN_PATH_PREFIX)) {
89
+ const builtinName = extension.path.slice(BUILTIN_PATH_PREFIX.length);
90
+ const [kind, rawName] = replacement.name.split(":", 2);
91
+ const registeredName = kind === "command" ? `/${rawName}` : kind === "flag" ? `--${rawName}` : rawName;
92
+ warnings?.push({
93
+ path: extension.path,
94
+ warning: `Extension ${replacement.extension.path} registers ${kind} \`${registeredName}\`, so built-in extension \`${builtinName}\` was not loaded. To use \`${builtinName}\`, run \`pi config\` and make sure it is enabled under Built-in extensions, then disable or remove the existing extension. We recommend only having one or the other loaded at a time.`,
95
+ });
96
+ }
97
+ return false;
98
+ });
99
+ }
17
100
  function resolvePromptInput(input, description) {
18
101
  if (!input) {
19
102
  return undefined;
@@ -118,6 +201,7 @@ export class DefaultResourceLoader {
118
201
  additionalPromptTemplatePaths;
119
202
  additionalThemePaths;
120
203
  extensionFactories;
204
+ builtinExtensions;
121
205
  noExtensions;
122
206
  noSkills;
123
207
  noPromptTemplates;
@@ -157,16 +241,19 @@ export class DefaultResourceLoader {
157
241
  this.agentDir = resolvePath(options.agentDir);
158
242
  this.settingsManager = options.settingsManager ?? SettingsManager.create(this.cwd, this.agentDir);
159
243
  this.eventBus = options.eventBus ?? createEventBus();
244
+ const factories = options.extensionFactories ?? [];
245
+ this.extensionFactories = factories.filter((input) => !isBuiltinExtension(input));
246
+ this.builtinExtensions = new Map(factories.filter(isBuiltinExtension).map((input) => [input.name, input]));
160
247
  this.packageManager = new DefaultPackageManager({
161
248
  cwd: this.cwd,
162
249
  agentDir: this.agentDir,
163
250
  settingsManager: this.settingsManager,
251
+ builtinExtensions: [...this.builtinExtensions.keys()],
164
252
  });
165
253
  this.additionalExtensionPaths = options.additionalExtensionPaths ?? [];
166
254
  this.additionalSkillPaths = options.additionalSkillPaths ?? [];
167
255
  this.additionalPromptTemplatePaths = options.additionalPromptTemplatePaths ?? [];
168
256
  this.additionalThemePaths = options.additionalThemePaths ?? [];
169
- this.extensionFactories = options.extensionFactories ?? [];
170
257
  this.noExtensions = options.noExtensions ?? false;
171
258
  this.noSkills = options.noSkills ?? false;
172
259
  this.noPromptTemplates = options.noPromptTemplates ?? false;
@@ -316,7 +403,9 @@ export class DefaultResourceLoader {
316
403
  const extensionPaths = this.noExtensions
317
404
  ? cliEnabledExtensions
318
405
  : this.mergePaths(cliEnabledExtensions, enabledExtensions);
406
+ const packageWarnings = collectExtensionPackageWarnings(extensionPaths, metadataByPath);
319
407
  const extensionsResult = await this.loadFinalExtensionSet(extensionPaths, preTrustExtensions);
408
+ mergeExtensionWarnings(extensionsResult, packageWarnings);
320
409
  for (const p of this.additionalExtensionPaths) {
321
410
  if (isLocalPath(p)) {
322
411
  const resolved = this.resolveResourcePath(p);
@@ -406,53 +495,83 @@ export class DefaultResourceLoader {
406
495
  });
407
496
  const enabledExtensions = resolvedPaths.extensions.filter((r) => r.enabled).map((r) => r.path);
408
497
  const cliEnabledExtensions = cliExtensionPaths.extensions.filter((r) => r.enabled).map((r) => r.path);
409
- const extensionPaths = this.noExtensions
410
- ? cliEnabledExtensions
411
- : this.mergePaths(cliEnabledExtensions, enabledExtensions);
498
+ // Built-in extensions wait for the final pass: project settings can disable them, and a loaded
499
+ // extension cannot be unloaded.
500
+ const extensionPaths = (this.noExtensions ? cliEnabledExtensions : this.mergePaths(cliEnabledExtensions, enabledExtensions)).filter((path) => !path.startsWith(BUILTIN_PATH_PREFIX));
501
+ const metadataByPath = new Map([...resolvedPaths.extensions, ...cliExtensionPaths.extensions].map((resource) => [
502
+ resource.path,
503
+ resource.metadata,
504
+ ]));
505
+ const packageWarnings = collectExtensionPackageWarnings(extensionPaths, metadataByPath);
412
506
  const extensionsResult = await loadExtensionsCached(extensionPaths, this.cwd, this.eventBus);
507
+ mergeExtensionWarnings(extensionsResult, packageWarnings);
413
508
  if (!options.includeInlineFactories) {
414
509
  return extensionsResult;
415
510
  }
416
511
  const inlineExtensions = await this.loadExtensionFactories(extensionsResult.runtime);
417
512
  extensionsResult.extensions.push(...inlineExtensions.extensions);
418
513
  extensionsResult.errors.push(...inlineExtensions.errors);
514
+ const replacementWarnings = [];
515
+ extensionsResult.extensions = omitReplacedExtensions(extensionsResult.extensions, replacementWarnings);
516
+ mergeExtensionWarnings(extensionsResult, replacementWarnings);
419
517
  return extensionsResult;
420
518
  }
421
519
  resolveExtensionLoadPath(path) {
422
- return resolvePath(path, this.cwd, { normalizeUnicodeSpaces: true });
520
+ return isSyntheticPath(path) ? path : resolvePath(path, this.cwd, { normalizeUnicodeSpaces: true });
521
+ }
522
+ /** Load extension paths: files from disk and `builtin:<name>` paths from the built-in extensions. */
523
+ async loadExtensionPaths(paths, runtime) {
524
+ const isBuiltinPath = (path) => path.startsWith(BUILTIN_PATH_PREFIX);
525
+ const result = await loadExtensionsCached(paths.filter((path) => !isBuiltinPath(path)), this.cwd, this.eventBus, runtime);
526
+ for (const path of paths.filter(isBuiltinPath)) {
527
+ const builtin = this.builtinExtensions.get(path.slice(BUILTIN_PATH_PREFIX.length));
528
+ if (!builtin) {
529
+ result.errors.push({ path, error: `Unknown built-in extension: ${path}` });
530
+ continue;
531
+ }
532
+ try {
533
+ const extension = await loadExtensionFromFactory(builtin.factory, this.cwd, this.eventBus, result.runtime, path);
534
+ extension.hidden = true;
535
+ extension.replaceable = builtin.replaceable === true;
536
+ result.extensions.push(extension);
537
+ }
538
+ catch (error) {
539
+ result.errors.push({ path, error: error instanceof Error ? error.message : "failed to load extension" });
540
+ }
541
+ }
542
+ return result;
423
543
  }
424
544
  async loadFinalExtensionSet(extensionPaths, preTrustExtensions) {
425
- if (!preTrustExtensions) {
426
- const extensionsResult = await loadExtensionsCached(extensionPaths, this.cwd, this.eventBus);
427
- const inlineExtensions = await this.loadExtensionFactories(extensionsResult.runtime);
428
- extensionsResult.extensions.push(...inlineExtensions.extensions);
429
- extensionsResult.errors.push(...inlineExtensions.errors);
430
- this.addExtensionConflictDiagnostics(extensionsResult);
431
- return extensionsResult;
432
- }
433
- const preloadedByPath = new Map(preTrustExtensions.extensions
545
+ // Without a pre-trust pass nothing is preloaded, and inline extensions load here.
546
+ const preloaded = preTrustExtensions?.extensions ?? [];
547
+ const preloadedByPath = new Map(preloaded
434
548
  .filter((extension) => !extension.path.startsWith("<inline:"))
435
549
  .map((extension) => [extension.resolvedPath, extension]));
436
- const failedPreloadPaths = new Set(preTrustExtensions.errors.map((error) => this.resolveExtensionLoadPath(error.path)));
550
+ const failedPreloadPaths = new Set((preTrustExtensions?.errors ?? []).map((error) => this.resolveExtensionLoadPath(error.path)));
437
551
  const remainingPaths = extensionPaths.filter((path) => {
438
552
  const resolvedPath = this.resolveExtensionLoadPath(path);
439
553
  return !preloadedByPath.has(resolvedPath) && !failedPreloadPaths.has(resolvedPath);
440
554
  });
441
- const remainingExtensions = await loadExtensionsCached(remainingPaths, this.cwd, this.eventBus, preTrustExtensions.runtime);
555
+ const remainingExtensions = await this.loadExtensionPaths(remainingPaths, preTrustExtensions?.runtime);
442
556
  const loadedByPath = new Map(preloadedByPath);
443
557
  for (const extension of remainingExtensions.extensions) {
444
558
  loadedByPath.set(extension.resolvedPath, extension);
445
559
  }
446
- const inlineExtensions = preTrustExtensions.extensions.filter((extension) => extension.path.startsWith("<inline:"));
560
+ const inlineExtensions = preTrustExtensions
561
+ ? { extensions: preloaded.filter((extension) => extension.path.startsWith("<inline:")), errors: [] }
562
+ : await this.loadExtensionFactories(remainingExtensions.runtime);
447
563
  const orderedExtensions = extensionPaths
448
564
  .map((path) => loadedByPath.get(this.resolveExtensionLoadPath(path)))
449
565
  .filter((extension) => extension !== undefined);
450
- orderedExtensions.push(...inlineExtensions);
566
+ orderedExtensions.push(...inlineExtensions.extensions);
567
+ const replacementWarnings = [];
451
568
  const extensionsResult = {
452
- extensions: orderedExtensions,
453
- errors: [...preTrustExtensions.errors, ...remainingExtensions.errors],
454
- runtime: preTrustExtensions.runtime,
569
+ extensions: omitReplacedExtensions(orderedExtensions, replacementWarnings),
570
+ errors: [...(preTrustExtensions?.errors ?? []), ...remainingExtensions.errors, ...inlineExtensions.errors],
571
+ warnings: [...(preTrustExtensions?.warnings ?? []), ...(remainingExtensions.warnings ?? [])],
572
+ runtime: remainingExtensions.runtime,
455
573
  };
574
+ mergeExtensionWarnings(extensionsResult, replacementWarnings);
456
575
  this.addExtensionConflictDiagnostics(extensionsResult);
457
576
  return extensionsResult;
458
577
  }
@@ -552,7 +671,12 @@ export class DefaultResourceLoader {
552
671
  themesResult = { themes: [], diagnostics: [] };
553
672
  }
554
673
  else {
555
- const loaded = this.loadThemes(themePaths, false);
674
+ // Theme construction only needs trueColor, so skip the unrelated tmux hyperlink probe.
675
+ const colorMode = getTerminalColorMode({
676
+ ...detectCapabilities(() => false),
677
+ ...this.settingsManager.getTerminalCapabilityOverrides(),
678
+ });
679
+ const loaded = this.loadThemes(themePaths, false, colorMode);
556
680
  const deduped = this.dedupeThemes(loaded.themes);
557
681
  themesResult = { themes: deduped.themes, diagnostics: [...loaded.diagnostics, ...deduped.diagnostics] };
558
682
  }
@@ -585,7 +709,7 @@ export class DefaultResourceLoader {
585
709
  if (!resourcePath) {
586
710
  return undefined;
587
711
  }
588
- if (resourcePath.startsWith("<")) {
712
+ if (isSyntheticPath(resourcePath)) {
589
713
  return this.getDefaultSourceInfoForPath(resourcePath);
590
714
  }
591
715
  const normalizedResourcePath = resolve(resourcePath);
@@ -614,10 +738,11 @@ export class DefaultResourceLoader {
614
738
  return undefined;
615
739
  }
616
740
  getDefaultSourceInfoForPath(filePath) {
617
- if (filePath.startsWith("<") && filePath.endsWith(">")) {
741
+ const syntheticSource = getSyntheticPathSource(filePath);
742
+ if (syntheticSource) {
618
743
  return {
619
744
  path: filePath,
620
- source: filePath.slice(1, -1).split(":")[0] || "temporary",
745
+ source: syntheticSource,
621
746
  scope: "temporary",
622
747
  origin: "top-level",
623
748
  };
@@ -667,15 +792,15 @@ export class DefaultResourceLoader {
667
792
  return merged;
668
793
  }
669
794
  resolveResourcePath(p) {
670
- return resolvePath(p, this.cwd, { trim: true });
795
+ return isSyntheticPath(p) ? p : resolvePath(p, this.cwd, { trim: true });
671
796
  }
672
- loadThemes(paths, includeDefaults = true) {
797
+ loadThemes(paths, includeDefaults, colorMode) {
673
798
  const themes = [];
674
799
  const diagnostics = [];
675
800
  if (includeDefaults) {
676
801
  const defaultDirs = [join(this.agentDir, "themes"), join(this.cwd, CONFIG_DIR_NAME, "themes")];
677
802
  for (const dir of defaultDirs) {
678
- this.loadThemesFromDir(dir, themes, diagnostics);
803
+ this.loadThemesFromDir(dir, themes, diagnostics, colorMode);
679
804
  }
680
805
  }
681
806
  for (const p of paths) {
@@ -687,10 +812,10 @@ export class DefaultResourceLoader {
687
812
  try {
688
813
  const stats = statSync(resolved);
689
814
  if (stats.isDirectory()) {
690
- this.loadThemesFromDir(resolved, themes, diagnostics);
815
+ this.loadThemesFromDir(resolved, themes, diagnostics, colorMode);
691
816
  }
692
817
  else if (stats.isFile() && resolved.endsWith(".json")) {
693
- this.loadThemeFromFile(resolved, themes, diagnostics);
818
+ this.loadThemeFromFile(resolved, themes, diagnostics, colorMode);
694
819
  }
695
820
  else {
696
821
  diagnostics.push({ type: "warning", message: "theme path is not a json file", path: resolved });
@@ -703,7 +828,7 @@ export class DefaultResourceLoader {
703
828
  }
704
829
  return { themes, diagnostics };
705
830
  }
706
- loadThemesFromDir(dir, themes, diagnostics) {
831
+ loadThemesFromDir(dir, themes, diagnostics, colorMode) {
707
832
  if (!existsSync(dir)) {
708
833
  return;
709
834
  }
@@ -725,7 +850,7 @@ export class DefaultResourceLoader {
725
850
  if (!entry.name.endsWith(".json")) {
726
851
  continue;
727
852
  }
728
- this.loadThemeFromFile(join(dir, entry.name), themes, diagnostics);
853
+ this.loadThemeFromFile(join(dir, entry.name), themes, diagnostics, colorMode);
729
854
  }
730
855
  }
731
856
  catch (error) {
@@ -733,9 +858,9 @@ export class DefaultResourceLoader {
733
858
  diagnostics.push({ type: "warning", message, path: dir });
734
859
  }
735
860
  }
736
- loadThemeFromFile(filePath, themes, diagnostics) {
861
+ loadThemeFromFile(filePath, themes, diagnostics, colorMode) {
737
862
  try {
738
- themes.push(loadThemeFromPath(filePath));
863
+ themes.push(loadThemeFromPath(filePath, colorMode));
739
864
  }
740
865
  catch (error) {
741
866
  const message = error instanceof Error ? error.message : "failed to load theme";
@@ -752,6 +877,7 @@ export class DefaultResourceLoader {
752
877
  try {
753
878
  const extension = await loadExtensionFromFactory(factory, this.cwd, this.eventBus, runtime, extensionPath);
754
879
  extension.hidden = isNamed && input.hidden;
880
+ extension.replaceable = isNamed && input.replaceable === true;
755
881
  extensions.push(extension);
756
882
  }
757
883
  catch (error) {