@sammorrowdrums/mcpi 0.70.9 → 0.85.0-bootstrap.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (888) hide show
  1. package/CHANGELOG.md +1621 -0
  2. package/LICENSE +21 -0
  3. package/README.md +196 -141
  4. package/dist/bun/cli.d.ts.map +1 -1
  5. package/dist/bun/cli.js +4 -0
  6. package/dist/bun/cli.js.map +1 -1
  7. package/dist/bun/register-bedrock.d.ts.map +1 -1
  8. package/dist/bun/register-bedrock.js +1 -1
  9. package/dist/bun/register-bedrock.js.map +1 -1
  10. package/dist/bun/restore-sandbox-env.d.ts +17 -0
  11. package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
  12. package/dist/bun/restore-sandbox-env.js +36 -0
  13. package/dist/bun/restore-sandbox-env.js.map +1 -0
  14. package/dist/cli/args.d.ts +9 -2
  15. package/dist/cli/args.d.ts.map +1 -1
  16. package/dist/cli/args.js +116 -16
  17. package/dist/cli/args.js.map +1 -1
  18. package/dist/cli/auth-check.d.ts +19 -0
  19. package/dist/cli/auth-check.d.ts.map +1 -0
  20. package/dist/cli/auth-check.js +50 -0
  21. package/dist/cli/auth-check.js.map +1 -0
  22. package/dist/cli/auth-command.d.ts +24 -0
  23. package/dist/cli/auth-command.d.ts.map +1 -0
  24. package/dist/cli/auth-command.js +103 -0
  25. package/dist/cli/auth-command.js.map +1 -0
  26. package/dist/cli/config-selector.d.ts +6 -4
  27. package/dist/cli/config-selector.d.ts.map +1 -1
  28. package/dist/cli/config-selector.js +4 -4
  29. package/dist/cli/config-selector.js.map +1 -1
  30. package/dist/cli/credential-print.d.ts +13 -0
  31. package/dist/cli/credential-print.d.ts.map +1 -0
  32. package/dist/cli/credential-print.js +76 -0
  33. package/dist/cli/credential-print.js.map +1 -0
  34. package/dist/cli/experimental/auth.d.ts +16 -0
  35. package/dist/cli/experimental/auth.d.ts.map +1 -0
  36. package/dist/cli/experimental/auth.js +13 -0
  37. package/dist/cli/experimental/auth.js.map +1 -0
  38. package/dist/cli/experimental/cli.d.ts +6 -0
  39. package/dist/cli/experimental/cli.d.ts.map +1 -0
  40. package/dist/cli/experimental/cli.js +5 -0
  41. package/dist/cli/experimental/cli.js.map +1 -0
  42. package/dist/cli/experimental/command-options.d.ts +17 -0
  43. package/dist/cli/experimental/command-options.d.ts.map +1 -0
  44. package/dist/cli/experimental/command-options.js +35 -0
  45. package/dist/cli/experimental/command-options.js.map +1 -0
  46. package/dist/cli/experimental/command.d.ts +63 -0
  47. package/dist/cli/experimental/command.d.ts.map +1 -0
  48. package/dist/cli/experimental/command.js +130 -0
  49. package/dist/cli/experimental/command.js.map +1 -0
  50. package/dist/cli/experimental/commands/client.d.ts +13 -0
  51. package/dist/cli/experimental/commands/client.d.ts.map +1 -0
  52. package/dist/cli/experimental/commands/client.js +25 -0
  53. package/dist/cli/experimental/commands/client.js.map +1 -0
  54. package/dist/cli/experimental/commands/mcpi.d.ts +15 -0
  55. package/dist/cli/experimental/commands/mcpi.d.ts.map +1 -0
  56. package/dist/cli/experimental/commands/mcpi.js +28 -0
  57. package/dist/cli/experimental/commands/mcpi.js.map +1 -0
  58. package/dist/cli/experimental/commands/server.d.ts +13 -0
  59. package/dist/cli/experimental/commands/server.d.ts.map +1 -0
  60. package/dist/cli/experimental/commands/server.js +25 -0
  61. package/dist/cli/experimental/commands/server.js.map +1 -0
  62. package/dist/cli/experimental/transport-address.d.ts +10 -0
  63. package/dist/cli/experimental/transport-address.d.ts.map +1 -0
  64. package/dist/cli/experimental/transport-address.js +38 -0
  65. package/dist/cli/experimental/transport-address.js.map +1 -0
  66. package/dist/cli/file-processor.d.ts.map +1 -1
  67. package/dist/cli/file-processor.js +13 -26
  68. package/dist/cli/file-processor.js.map +1 -1
  69. package/dist/cli/initial-message.d.ts +1 -1
  70. package/dist/cli/initial-message.d.ts.map +1 -1
  71. package/dist/cli/initial-message.js.map +1 -1
  72. package/dist/cli/list-models.d.ts +2 -2
  73. package/dist/cli/list-models.d.ts.map +1 -1
  74. package/dist/cli/list-models.js +4 -4
  75. package/dist/cli/list-models.js.map +1 -1
  76. package/dist/cli/project-trust.d.ts +10 -0
  77. package/dist/cli/project-trust.d.ts.map +1 -0
  78. package/dist/cli/project-trust.js +48 -0
  79. package/dist/cli/project-trust.js.map +1 -0
  80. package/dist/cli/session-picker.d.ts +3 -2
  81. package/dist/cli/session-picker.d.ts.map +1 -1
  82. package/dist/cli/session-picker.js +5 -4
  83. package/dist/cli/session-picker.js.map +1 -1
  84. package/dist/cli/startup-ui.d.ts +20 -0
  85. package/dist/cli/startup-ui.d.ts.map +1 -0
  86. package/dist/cli/startup-ui.js +184 -0
  87. package/dist/cli/startup-ui.js.map +1 -0
  88. package/dist/cli.d.ts.map +1 -1
  89. package/dist/cli.js +6 -3
  90. package/dist/cli.js.map +1 -1
  91. package/dist/client/index.d.ts +3 -0
  92. package/dist/client/index.d.ts.map +1 -0
  93. package/dist/client/index.js +3 -0
  94. package/dist/client/index.js.map +1 -0
  95. package/dist/client/remote-session.d.ts +53 -0
  96. package/dist/client/remote-session.d.ts.map +1 -0
  97. package/dist/client/remote-session.js +340 -0
  98. package/dist/client/remote-session.js.map +1 -0
  99. package/dist/client/transcript.d.ts +12 -0
  100. package/dist/client/transcript.d.ts.map +1 -0
  101. package/dist/client/transcript.js +98 -0
  102. package/dist/client/transcript.js.map +1 -0
  103. package/dist/config.d.ts +34 -12
  104. package/dist/config.d.ts.map +1 -1
  105. package/dist/config.js +312 -61
  106. package/dist/config.js.map +1 -1
  107. package/dist/core/agent-session-runtime.d.ts +11 -9
  108. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  109. package/dist/core/agent-session-runtime.js +16 -7
  110. package/dist/core/agent-session-runtime.js.map +1 -1
  111. package/dist/core/agent-session-services.d.ts +13 -12
  112. package/dist/core/agent-session-services.d.ts.map +1 -1
  113. package/dist/core/agent-session-services.js +34 -14
  114. package/dist/core/agent-session-services.js.map +1 -1
  115. package/dist/core/agent-session.d.ts +110 -53
  116. package/dist/core/agent-session.d.ts.map +1 -1
  117. package/dist/core/agent-session.js +658 -488
  118. package/dist/core/agent-session.js.map +1 -1
  119. package/dist/core/auth-guidance.d.ts.map +1 -1
  120. package/dist/core/auth-guidance.js.map +1 -1
  121. package/dist/core/auth-storage.d.ts +35 -104
  122. package/dist/core/auth-storage.d.ts.map +1 -1
  123. package/dist/core/auth-storage.js +272 -286
  124. package/dist/core/auth-storage.js.map +1 -1
  125. package/dist/core/bash-executor.d.ts +1 -1
  126. package/dist/core/bash-executor.d.ts.map +1 -1
  127. package/dist/core/bash-executor.js +11 -8
  128. package/dist/core/bash-executor.js.map +1 -1
  129. package/dist/core/cache-stats.d.ts +49 -0
  130. package/dist/core/cache-stats.d.ts.map +1 -0
  131. package/dist/core/cache-stats.js +101 -0
  132. package/dist/core/cache-stats.js.map +1 -0
  133. package/dist/core/compaction/branch-summarization.d.ts +16 -6
  134. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  135. package/dist/core/compaction/branch-summarization.js +13 -10
  136. package/dist/core/compaction/branch-summarization.js.map +1 -1
  137. package/dist/core/compaction/compaction.d.ts +25 -9
  138. package/dist/core/compaction/compaction.d.ts.map +1 -1
  139. package/dist/core/compaction/compaction.js +163 -133
  140. package/dist/core/compaction/compaction.js.map +1 -1
  141. package/dist/core/compaction/index.d.ts +3 -3
  142. package/dist/core/compaction/index.d.ts.map +1 -1
  143. package/dist/core/compaction/index.js.map +1 -1
  144. package/dist/core/compaction/utils.d.ts +3 -3
  145. package/dist/core/compaction/utils.d.ts.map +1 -1
  146. package/dist/core/compaction/utils.js +7 -18
  147. package/dist/core/compaction/utils.js.map +1 -1
  148. package/dist/core/defaults.d.ts +1 -1
  149. package/dist/core/defaults.d.ts.map +1 -1
  150. package/dist/core/defaults.js.map +1 -1
  151. package/dist/core/env-overlay.d.ts +21 -0
  152. package/dist/core/env-overlay.d.ts.map +1 -0
  153. package/dist/core/env-overlay.js +25 -0
  154. package/dist/core/env-overlay.js.map +1 -0
  155. package/dist/core/exec.d.ts +8 -1
  156. package/dist/core/exec.d.ts.map +1 -1
  157. package/dist/core/exec.js +7 -1
  158. package/dist/core/exec.js.map +1 -1
  159. package/dist/core/experimental.d.ts +6 -0
  160. package/dist/core/experimental.d.ts.map +1 -0
  161. package/dist/core/experimental.js +8 -0
  162. package/dist/core/experimental.js.map +1 -0
  163. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  164. package/dist/core/export-html/ansi-to-html.js +1 -1
  165. package/dist/core/export-html/ansi-to-html.js.map +1 -1
  166. package/dist/core/export-html/index.d.ts +2 -2
  167. package/dist/core/export-html/index.d.ts.map +1 -1
  168. package/dist/core/export-html/index.js +8 -6
  169. package/dist/core/export-html/index.js.map +1 -1
  170. package/dist/core/export-html/template.css +53 -4
  171. package/dist/core/export-html/template.js +129 -35
  172. package/dist/core/export-html/tool-renderer.d.ts +2 -8
  173. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  174. package/dist/core/export-html/tool-renderer.js +15 -2
  175. package/dist/core/export-html/tool-renderer.js.map +1 -1
  176. package/dist/core/export-html/vendor/marked.min.js +75 -3
  177. package/dist/core/extensions/index.d.ts +8 -8
  178. package/dist/core/extensions/index.d.ts.map +1 -1
  179. package/dist/core/extensions/index.js.map +1 -1
  180. package/dist/core/extensions/loader.d.ts +5 -7
  181. package/dist/core/extensions/loader.d.ts.map +1 -1
  182. package/dist/core/extensions/loader.js +160 -87
  183. package/dist/core/extensions/loader.js.map +1 -1
  184. package/dist/core/extensions/runner.d.ts +32 -13
  185. package/dist/core/extensions/runner.d.ts.map +1 -1
  186. package/dist/core/extensions/runner.js +192 -4
  187. package/dist/core/extensions/runner.js.map +1 -1
  188. package/dist/core/extensions/types.d.ts +217 -69
  189. package/dist/core/extensions/types.d.ts.map +1 -1
  190. package/dist/core/extensions/types.js.map +1 -1
  191. package/dist/core/extensions/wrapper.d.ts +3 -3
  192. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  193. package/dist/core/extensions/wrapper.js +22 -3
  194. package/dist/core/extensions/wrapper.js.map +1 -1
  195. package/dist/core/footer-data-provider.d.ts +12 -0
  196. package/dist/core/footer-data-provider.d.ts.map +1 -1
  197. package/dist/core/footer-data-provider.js +30 -2
  198. package/dist/core/footer-data-provider.js.map +1 -1
  199. package/dist/core/http-dispatcher.d.ts +22 -0
  200. package/dist/core/http-dispatcher.d.ts.map +1 -0
  201. package/dist/core/http-dispatcher.js +96 -0
  202. package/dist/core/http-dispatcher.js.map +1 -0
  203. package/dist/core/index.d.ts +9 -8
  204. package/dist/core/index.d.ts.map +1 -1
  205. package/dist/core/index.js +1 -0
  206. package/dist/core/index.js.map +1 -1
  207. package/dist/core/keybindings.d.ts +79 -10
  208. package/dist/core/keybindings.d.ts.map +1 -1
  209. package/dist/core/keybindings.js +11 -10
  210. package/dist/core/keybindings.js.map +1 -1
  211. package/dist/core/messages.d.ts +2 -2
  212. package/dist/core/messages.d.ts.map +1 -1
  213. package/dist/core/messages.js.map +1 -1
  214. package/dist/core/model-config.d.ts +571 -0
  215. package/dist/core/model-config.d.ts.map +1 -0
  216. package/dist/core/model-config.js +254 -0
  217. package/dist/core/model-config.js.map +1 -0
  218. package/dist/core/model-registry.d.ts +23 -110
  219. package/dist/core/model-registry.d.ts.map +1 -1
  220. package/dist/core/model-registry.js +65 -616
  221. package/dist/core/model-registry.js.map +1 -1
  222. package/dist/core/model-resolver.d.ts +20 -7
  223. package/dist/core/model-resolver.d.ts.map +1 -1
  224. package/dist/core/model-resolver.js +139 -43
  225. package/dist/core/model-resolver.js.map +1 -1
  226. package/dist/core/model-runtime.d.ts +100 -0
  227. package/dist/core/model-runtime.d.ts.map +1 -0
  228. package/dist/core/model-runtime.js +602 -0
  229. package/dist/core/model-runtime.js.map +1 -0
  230. package/dist/core/models-store.d.ts +22 -0
  231. package/dist/core/models-store.d.ts.map +1 -0
  232. package/dist/core/models-store.js +113 -0
  233. package/dist/core/models-store.js.map +1 -0
  234. package/dist/core/output-guard.d.ts +1 -0
  235. package/dist/core/output-guard.d.ts.map +1 -1
  236. package/dist/core/output-guard.js +52 -22
  237. package/dist/core/output-guard.js.map +1 -1
  238. package/dist/core/package-manager.d.ts +21 -4
  239. package/dist/core/package-manager.d.ts.map +1 -1
  240. package/dist/core/package-manager.js +428 -191
  241. package/dist/core/package-manager.js.map +1 -1
  242. package/dist/core/pi-manifest.d.ts +8 -0
  243. package/dist/core/pi-manifest.d.ts.map +1 -0
  244. package/dist/core/pi-manifest.js +25 -0
  245. package/dist/core/pi-manifest.js.map +1 -0
  246. package/dist/core/project-trust.d.ts +15 -0
  247. package/dist/core/project-trust.d.ts.map +1 -0
  248. package/dist/core/project-trust.js +59 -0
  249. package/dist/core/project-trust.js.map +1 -0
  250. package/dist/core/prompt-templates.d.ts +4 -2
  251. package/dist/core/prompt-templates.d.ts.map +1 -1
  252. package/dist/core/prompt-templates.js +36 -50
  253. package/dist/core/prompt-templates.js.map +1 -1
  254. package/dist/core/provider-attribution.d.ts +4 -0
  255. package/dist/core/provider-attribution.d.ts.map +1 -0
  256. package/dist/core/provider-attribution.js +72 -0
  257. package/dist/core/provider-attribution.js.map +1 -0
  258. package/dist/core/provider-composer.d.ts +58 -0
  259. package/dist/core/provider-composer.d.ts.map +1 -0
  260. package/dist/core/provider-composer.js +396 -0
  261. package/dist/core/provider-composer.js.map +1 -0
  262. package/dist/core/radius.d.ts +2 -0
  263. package/dist/core/radius.d.ts.map +1 -0
  264. package/dist/core/radius.js +2 -0
  265. package/dist/core/radius.js.map +1 -0
  266. package/dist/core/remote-catalog-provider.d.ts +17 -0
  267. package/dist/core/remote-catalog-provider.d.ts.map +1 -0
  268. package/dist/core/remote-catalog-provider.js +137 -0
  269. package/dist/core/remote-catalog-provider.js.map +1 -0
  270. package/dist/core/resolve-config-value.d.ts +13 -6
  271. package/dist/core/resolve-config-value.d.ts.map +1 -1
  272. package/dist/core/resolve-config-value.js +143 -22
  273. package/dist/core/resolve-config-value.js.map +1 -1
  274. package/dist/core/resource-loader.d.ts +40 -12
  275. package/dist/core/resource-loader.d.ts.map +1 -1
  276. package/dist/core/resource-loader.js +236 -87
  277. package/dist/core/resource-loader.js.map +1 -1
  278. package/dist/core/runtime-credentials.d.ts +15 -0
  279. package/dist/core/runtime-credentials.d.ts.map +1 -0
  280. package/dist/core/runtime-credentials.js +39 -0
  281. package/dist/core/runtime-credentials.js.map +1 -0
  282. package/dist/core/sdk.d.ts +26 -25
  283. package/dist/core/sdk.d.ts.map +1 -1
  284. package/dist/core/sdk.js +56 -49
  285. package/dist/core/sdk.js.map +1 -1
  286. package/dist/core/session-manager.d.ts +42 -19
  287. package/dist/core/session-manager.d.ts.map +1 -1
  288. package/dist/core/session-manager.js +454 -223
  289. package/dist/core/session-manager.js.map +1 -1
  290. package/dist/core/settings-manager.d.ts +77 -8
  291. package/dist/core/settings-manager.d.ts.map +1 -1
  292. package/dist/core/settings-manager.js +255 -67
  293. package/dist/core/settings-manager.js.map +1 -1
  294. package/dist/core/skills.d.ts +2 -2
  295. package/dist/core/skills.d.ts.map +1 -1
  296. package/dist/core/skills.js +12 -34
  297. package/dist/core/skills.js.map +1 -1
  298. package/dist/core/slash-commands.d.ts +2 -1
  299. package/dist/core/slash-commands.d.ts.map +1 -1
  300. package/dist/core/slash-commands.js +4 -3
  301. package/dist/core/slash-commands.js.map +1 -1
  302. package/dist/core/source-info.d.ts +1 -1
  303. package/dist/core/source-info.d.ts.map +1 -1
  304. package/dist/core/source-info.js.map +1 -1
  305. package/dist/core/system-prompt.d.ts +1 -1
  306. package/dist/core/system-prompt.d.ts.map +1 -1
  307. package/dist/core/system-prompt.js +15 -25
  308. package/dist/core/system-prompt.js.map +1 -1
  309. package/dist/core/telemetry.d.ts +7 -1
  310. package/dist/core/telemetry.d.ts.map +1 -1
  311. package/dist/core/telemetry.js +7 -1
  312. package/dist/core/telemetry.js.map +1 -1
  313. package/dist/core/timings.d.ts +5 -3
  314. package/dist/core/timings.d.ts.map +1 -1
  315. package/dist/core/timings.js +26 -16
  316. package/dist/core/timings.js.map +1 -1
  317. package/dist/core/tools/bash.d.ts +11 -7
  318. package/dist/core/tools/bash.d.ts.map +1 -1
  319. package/dist/core/tools/bash.js +220 -188
  320. package/dist/core/tools/bash.js.map +1 -1
  321. package/dist/core/tools/edit-diff.d.ts +26 -5
  322. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  323. package/dist/core/tools/edit-diff.js +110 -23
  324. package/dist/core/tools/edit-diff.js.map +1 -1
  325. package/dist/core/tools/edit.d.ts +11 -5
  326. package/dist/core/tools/edit.d.ts.map +1 -1
  327. package/dist/core/tools/edit.js +67 -100
  328. package/dist/core/tools/edit.js.map +1 -1
  329. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  330. package/dist/core/tools/file-mutation-queue.js +27 -12
  331. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  332. package/dist/core/tools/find.d.ts +10 -3
  333. package/dist/core/tools/find.d.ts.map +1 -1
  334. package/dist/core/tools/find.js +41 -37
  335. package/dist/core/tools/find.js.map +1 -1
  336. package/dist/core/tools/grep.d.ts +7 -3
  337. package/dist/core/tools/grep.d.ts.map +1 -1
  338. package/dist/core/tools/grep.js +12 -8
  339. package/dist/core/tools/grep.js.map +1 -1
  340. package/dist/core/tools/index.d.ts +18 -18
  341. package/dist/core/tools/index.d.ts.map +1 -1
  342. package/dist/core/tools/index.js.map +1 -1
  343. package/dist/core/tools/ls.d.ts +7 -3
  344. package/dist/core/tools/ls.d.ts.map +1 -1
  345. package/dist/core/tools/ls.js +17 -15
  346. package/dist/core/tools/ls.js.map +1 -1
  347. package/dist/core/tools/output-accumulator.d.ts +52 -0
  348. package/dist/core/tools/output-accumulator.d.ts.map +1 -0
  349. package/dist/core/tools/output-accumulator.js +184 -0
  350. package/dist/core/tools/output-accumulator.js.map +1 -0
  351. package/dist/core/tools/path-utils.d.ts +2 -0
  352. package/dist/core/tools/path-utils.d.ts.map +1 -1
  353. package/dist/core/tools/path-utils.js +39 -21
  354. package/dist/core/tools/path-utils.js.map +1 -1
  355. package/dist/core/tools/read.d.ts +7 -3
  356. package/dist/core/tools/read.d.ts.map +1 -1
  357. package/dist/core/tools/read.js +101 -51
  358. package/dist/core/tools/read.js.map +1 -1
  359. package/dist/core/tools/render-utils.d.ts +5 -2
  360. package/dist/core/tools/render-utils.d.ts.map +1 -1
  361. package/dist/core/tools/render-utils.js +18 -2
  362. package/dist/core/tools/render-utils.js.map +1 -1
  363. package/dist/core/tools/tool-definition-wrapper.d.ts +2 -2
  364. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  365. package/dist/core/tools/tool-definition-wrapper.js +3 -3
  366. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  367. package/dist/core/tools/truncate.d.ts.map +1 -1
  368. package/dist/core/tools/truncate.js +12 -2
  369. package/dist/core/tools/truncate.js.map +1 -1
  370. package/dist/core/tools/write.d.ts +6 -2
  371. package/dist/core/tools/write.d.ts.map +1 -1
  372. package/dist/core/tools/write.js +35 -45
  373. package/dist/core/tools/write.js.map +1 -1
  374. package/dist/core/trust-manager.d.ts +36 -0
  375. package/dist/core/trust-manager.d.ts.map +1 -0
  376. package/dist/core/trust-manager.js +202 -0
  377. package/dist/core/trust-manager.js.map +1 -0
  378. package/dist/core/usage-totals.d.ts +19 -0
  379. package/dist/core/usage-totals.d.ts.map +1 -0
  380. package/dist/core/usage-totals.js +52 -0
  381. package/dist/core/usage-totals.js.map +1 -0
  382. package/dist/extensions/index.d.ts +3 -0
  383. package/dist/extensions/index.d.ts.map +1 -0
  384. package/dist/extensions/index.js +3 -0
  385. package/dist/extensions/index.js.map +1 -0
  386. package/dist/extensions/llama/client.d.ts +61 -0
  387. package/dist/extensions/llama/client.d.ts.map +1 -0
  388. package/dist/extensions/llama/client.js +302 -0
  389. package/dist/extensions/llama/client.js.map +1 -0
  390. package/dist/extensions/llama/huggingface.d.ts +23 -0
  391. package/dist/extensions/llama/huggingface.d.ts.map +1 -0
  392. package/dist/extensions/llama/huggingface.js +141 -0
  393. package/dist/extensions/llama/huggingface.js.map +1 -0
  394. package/dist/extensions/llama/index.d.ts +3 -0
  395. package/dist/extensions/llama/index.d.ts.map +1 -0
  396. package/dist/extensions/llama/index.js +217 -0
  397. package/dist/extensions/llama/index.js.map +1 -0
  398. package/dist/extensions/llama/provider.d.ts +10 -0
  399. package/dist/extensions/llama/provider.d.ts.map +1 -0
  400. package/dist/extensions/llama/provider.js +121 -0
  401. package/dist/extensions/llama/provider.js.map +1 -0
  402. package/dist/extensions/llama/ui.d.ts +42 -0
  403. package/dist/extensions/llama/ui.d.ts.map +1 -0
  404. package/dist/extensions/llama/ui.js +416 -0
  405. package/dist/extensions/llama/ui.js.map +1 -0
  406. package/dist/index.d.ts +34 -27
  407. package/dist/index.d.ts.map +1 -1
  408. package/dist/index.js +11 -5
  409. package/dist/index.js.map +1 -1
  410. package/dist/main.d.ts +2 -2
  411. package/dist/main.d.ts.map +1 -1
  412. package/dist/main.js +311 -101
  413. package/dist/main.js.map +1 -1
  414. package/dist/migrations.d.ts +5 -5
  415. package/dist/migrations.d.ts.map +1 -1
  416. package/dist/migrations.js +10 -10
  417. package/dist/migrations.js.map +1 -1
  418. package/dist/modes/index.d.ts +6 -5
  419. package/dist/modes/index.d.ts.map +1 -1
  420. package/dist/modes/index.js.map +1 -1
  421. package/dist/modes/interactive/components/armin.d.ts +1 -1
  422. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  423. package/dist/modes/interactive/components/armin.js.map +1 -1
  424. package/dist/modes/interactive/components/assistant-message.d.ts +8 -3
  425. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  426. package/dist/modes/interactive/components/assistant-message.js +55 -26
  427. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  428. package/dist/modes/interactive/components/bash-execution.d.ts +2 -2
  429. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  430. package/dist/modes/interactive/components/bash-execution.js +4 -4
  431. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  432. package/dist/modes/interactive/components/bordered-loader.d.ts +2 -2
  433. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  434. package/dist/modes/interactive/components/bordered-loader.js +1 -1
  435. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  436. package/dist/modes/interactive/components/branch-summary-message.d.ts +2 -2
  437. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  438. package/dist/modes/interactive/components/branch-summary-message.js +1 -1
  439. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  440. package/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -2
  441. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  442. package/dist/modes/interactive/components/compaction-summary-message.js +1 -1
  443. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  444. package/dist/modes/interactive/components/config-selector.d.ts +37 -6
  445. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  446. package/dist/modes/interactive/components/config-selector.js +318 -34
  447. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  448. package/dist/modes/interactive/components/countdown-timer.d.ts +3 -3
  449. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  450. package/dist/modes/interactive/components/countdown-timer.js +2 -2
  451. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  452. package/dist/modes/interactive/components/custom-editor.d.ts +2 -2
  453. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  454. package/dist/modes/interactive/components/custom-editor.js +9 -2
  455. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  456. package/dist/modes/interactive/components/custom-entry.d.ts +19 -0
  457. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -0
  458. package/dist/modes/interactive/components/custom-entry.js +52 -0
  459. package/dist/modes/interactive/components/custom-entry.js.map +1 -0
  460. package/dist/modes/interactive/components/custom-message.d.ts +6 -4
  461. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  462. package/dist/modes/interactive/components/custom-message.js +11 -3
  463. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  464. package/dist/modes/interactive/components/daxnuts.d.ts +1 -1
  465. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  466. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  467. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  468. package/dist/modes/interactive/components/diff.js.map +1 -1
  469. package/dist/modes/interactive/components/dynamic-border.d.ts +1 -1
  470. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  471. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  472. package/dist/modes/interactive/components/extension-editor.d.ts +5 -4
  473. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  474. package/dist/modes/interactive/components/extension-editor.js +19 -32
  475. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  476. package/dist/modes/interactive/components/extension-input.d.ts +1 -1
  477. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  478. package/dist/modes/interactive/components/extension-input.js +1 -1
  479. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  480. package/dist/modes/interactive/components/extension-selector.d.ts +3 -1
  481. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  482. package/dist/modes/interactive/components/extension-selector.js +7 -2
  483. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  484. package/dist/modes/interactive/components/first-time-setup.d.ts +25 -0
  485. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -0
  486. package/dist/modes/interactive/components/first-time-setup.js +103 -0
  487. package/dist/modes/interactive/components/first-time-setup.js.map +1 -0
  488. package/dist/modes/interactive/components/footer.d.ts +9 -4
  489. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  490. package/dist/modes/interactive/components/footer.js +52 -31
  491. package/dist/modes/interactive/components/footer.js.map +1 -1
  492. package/dist/modes/interactive/components/index.d.ts +33 -31
  493. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  494. package/dist/modes/interactive/components/index.js +2 -0
  495. package/dist/modes/interactive/components/index.js.map +1 -1
  496. package/dist/modes/interactive/components/keybinding-hints.d.ts +6 -1
  497. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  498. package/dist/modes/interactive/components/keybinding-hints.js +20 -6
  499. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  500. package/dist/modes/interactive/components/login-dialog.d.ts +12 -6
  501. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  502. package/dist/modes/interactive/components/login-dialog.js +46 -17
  503. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  504. package/dist/modes/interactive/components/markdown-transform.d.ts +3 -0
  505. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -0
  506. package/dist/modes/interactive/components/markdown-transform.js +19 -0
  507. package/dist/modes/interactive/components/markdown-transform.js.map +1 -0
  508. package/dist/modes/interactive/components/mermaid.d.ts +11 -0
  509. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -0
  510. package/dist/modes/interactive/components/mermaid.js +75 -0
  511. package/dist/modes/interactive/components/mermaid.js.map +1 -0
  512. package/dist/modes/interactive/components/model-selector.d.ts +13 -6
  513. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  514. package/dist/modes/interactive/components/model-selector.js +92 -44
  515. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  516. package/dist/modes/interactive/components/oauth-selector.d.ts +7 -4
  517. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  518. package/dist/modes/interactive/components/oauth-selector.js +32 -28
  519. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  520. package/dist/modes/interactive/components/scoped-models-selector.d.ts +5 -1
  521. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  522. package/dist/modes/interactive/components/scoped-models-selector.js +52 -14
  523. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  524. package/dist/modes/interactive/components/session-selector-search.d.ts +1 -1
  525. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  526. package/dist/modes/interactive/components/session-selector-search.js +1 -1
  527. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  528. package/dist/modes/interactive/components/session-selector.d.ts +4 -5
  529. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  530. package/dist/modes/interactive/components/session-selector.js +18 -16
  531. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  532. package/dist/modes/interactive/components/settings-selector.d.ts +23 -2
  533. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  534. package/dist/modes/interactive/components/settings-selector.js +322 -22
  535. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  536. package/dist/modes/interactive/components/show-images-selector.d.ts +1 -1
  537. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  538. package/dist/modes/interactive/components/show-images-selector.js +1 -1
  539. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  540. package/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -2
  541. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  542. package/dist/modes/interactive/components/skill-invocation-message.js +1 -1
  543. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  544. package/dist/modes/interactive/components/status-indicator.d.ts +28 -0
  545. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -0
  546. package/dist/modes/interactive/components/status-indicator.js +60 -0
  547. package/dist/modes/interactive/components/status-indicator.js.map +1 -0
  548. package/dist/modes/interactive/components/theme-selector.d.ts +1 -1
  549. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  550. package/dist/modes/interactive/components/theme-selector.js +1 -1
  551. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  552. package/dist/modes/interactive/components/thinking-selector.d.ts +2 -2
  553. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  554. package/dist/modes/interactive/components/thinking-selector.js +3 -2
  555. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  556. package/dist/modes/interactive/components/tool-execution.d.ts +2 -2
  557. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  558. package/dist/modes/interactive/components/tool-execution.js +33 -2
  559. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  560. package/dist/modes/interactive/components/tree-selector.d.ts +7 -2
  561. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  562. package/dist/modes/interactive/components/tree-selector.js +179 -26
  563. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  564. package/dist/modes/interactive/components/trust-selector.d.ts +23 -0
  565. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -0
  566. package/dist/modes/interactive/components/trust-selector.js +91 -0
  567. package/dist/modes/interactive/components/trust-selector.js.map +1 -0
  568. package/dist/modes/interactive/components/user-message-selector.d.ts +1 -1
  569. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  570. package/dist/modes/interactive/components/user-message-selector.js +1 -1
  571. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  572. package/dist/modes/interactive/components/user-message.d.ts +9 -3
  573. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  574. package/dist/modes/interactive/components/user-message.js +26 -6
  575. package/dist/modes/interactive/components/user-message.js.map +1 -1
  576. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  577. package/dist/modes/interactive/components/visual-truncate.js +1 -1
  578. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  579. package/dist/modes/interactive/external-editor.d.ts +12 -0
  580. package/dist/modes/interactive/external-editor.d.ts.map +1 -0
  581. package/dist/modes/interactive/external-editor.js +37 -0
  582. package/dist/modes/interactive/external-editor.js.map +1 -0
  583. package/dist/modes/interactive/interactive-mode.d.ts +104 -26
  584. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  585. package/dist/modes/interactive/interactive-mode.js +1565 -692
  586. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  587. package/dist/modes/interactive/model-catalog-refresh.d.ts +7 -0
  588. package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -0
  589. package/dist/modes/interactive/model-catalog-refresh.js +34 -0
  590. package/dist/modes/interactive/model-catalog-refresh.js.map +1 -0
  591. package/dist/modes/interactive/model-search.d.ts +12 -0
  592. package/dist/modes/interactive/model-search.d.ts.map +1 -0
  593. package/dist/modes/interactive/model-search.js +15 -0
  594. package/dist/modes/interactive/model-search.js.map +1 -0
  595. package/dist/modes/interactive/theme/dark.json +10 -5
  596. package/dist/modes/interactive/theme/light.json +10 -5
  597. package/dist/modes/interactive/theme/theme-controller.d.ts +40 -0
  598. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -0
  599. package/dist/modes/interactive/theme/theme-controller.js +125 -0
  600. package/dist/modes/interactive/theme/theme-controller.js.map +1 -0
  601. package/dist/modes/interactive/theme/theme-schema.json +22 -5
  602. package/dist/modes/interactive/theme/theme.d.ts +48 -7
  603. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  604. package/dist/modes/interactive/theme/theme.js +194 -76
  605. package/dist/modes/interactive/theme/theme.js.map +1 -1
  606. package/dist/modes/json-event.d.ts +31 -0
  607. package/dist/modes/json-event.d.ts.map +1 -0
  608. package/dist/modes/json-event.js +15 -0
  609. package/dist/modes/json-event.js.map +1 -0
  610. package/dist/modes/print-mode.d.ts +3 -3
  611. package/dist/modes/print-mode.d.ts.map +1 -1
  612. package/dist/modes/print-mode.js +16 -5
  613. package/dist/modes/print-mode.js.map +1 -1
  614. package/dist/modes/rpc/rpc-client.d.ts +33 -10
  615. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  616. package/dist/modes/rpc/rpc-client.js +89 -11
  617. package/dist/modes/rpc/rpc-client.js.map +1 -1
  618. package/dist/modes/rpc/rpc-mode.d.ts +2 -2
  619. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  620. package/dist/modes/rpc/rpc-mode.js +69 -9
  621. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  622. package/dist/modes/rpc/rpc-types.d.ts +43 -5
  623. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  624. package/dist/modes/rpc/rpc-types.js.map +1 -1
  625. package/dist/package-manager-cli.d.ts +6 -2
  626. package/dist/package-manager-cli.d.ts.map +1 -1
  627. package/dist/package-manager-cli.js +527 -25
  628. package/dist/package-manager-cli.js.map +1 -1
  629. package/dist/path-migration.d.ts +13 -0
  630. package/dist/path-migration.d.ts.map +1 -0
  631. package/dist/path-migration.js +52 -0
  632. package/dist/path-migration.js.map +1 -0
  633. package/dist/rpc-entry.d.ts +3 -0
  634. package/dist/rpc-entry.d.ts.map +1 -0
  635. package/dist/rpc-entry.js +11 -0
  636. package/dist/rpc-entry.js.map +1 -0
  637. package/dist/server/create-harness.d.ts +26 -0
  638. package/dist/server/create-harness.d.ts.map +1 -0
  639. package/dist/server/create-harness.js +106 -0
  640. package/dist/server/create-harness.js.map +1 -0
  641. package/dist/utils/abort.d.ts +5 -0
  642. package/dist/utils/abort.d.ts.map +1 -0
  643. package/dist/utils/abort.js +48 -0
  644. package/dist/utils/abort.js.map +1 -0
  645. package/dist/utils/ansi.d.ts +2 -0
  646. package/dist/utils/ansi.d.ts.map +1 -0
  647. package/dist/utils/ansi.js +52 -0
  648. package/dist/utils/ansi.js.map +1 -0
  649. package/dist/utils/changelog.d.ts +2 -1
  650. package/dist/utils/changelog.d.ts.map +1 -1
  651. package/dist/utils/changelog.js +85 -0
  652. package/dist/utils/changelog.js.map +1 -1
  653. package/dist/utils/child-process.d.ts +12 -5
  654. package/dist/utils/child-process.d.ts.map +1 -1
  655. package/dist/utils/child-process.js +33 -5
  656. package/dist/utils/child-process.js.map +1 -1
  657. package/dist/utils/clipboard-image.d.ts.map +1 -1
  658. package/dist/utils/clipboard-image.js +4 -4
  659. package/dist/utils/clipboard-image.js.map +1 -1
  660. package/dist/utils/clipboard-native.d.ts +4 -1
  661. package/dist/utils/clipboard-native.d.ts.map +1 -1
  662. package/dist/utils/clipboard-native.js +14 -8
  663. package/dist/utils/clipboard-native.js.map +1 -1
  664. package/dist/utils/clipboard.d.ts +2 -0
  665. package/dist/utils/clipboard.d.ts.map +1 -1
  666. package/dist/utils/clipboard.js +129 -46
  667. package/dist/utils/clipboard.js.map +1 -1
  668. package/dist/utils/deprecation.d.ts +4 -0
  669. package/dist/utils/deprecation.d.ts.map +1 -0
  670. package/dist/utils/deprecation.js +13 -0
  671. package/dist/utils/deprecation.js.map +1 -0
  672. package/dist/utils/exif-orientation.d.ts +1 -1
  673. package/dist/utils/exif-orientation.d.ts.map +1 -1
  674. package/dist/utils/exif-orientation.js.map +1 -1
  675. package/dist/utils/git.d.ts.map +1 -1
  676. package/dist/utils/git.js +54 -22
  677. package/dist/utils/git.js.map +1 -1
  678. package/dist/utils/html.d.ts +7 -0
  679. package/dist/utils/html.d.ts.map +1 -0
  680. package/dist/utils/html.js +40 -0
  681. package/dist/utils/html.js.map +1 -0
  682. package/dist/utils/image-convert.d.ts +1 -0
  683. package/dist/utils/image-convert.d.ts.map +1 -1
  684. package/dist/utils/image-convert.js +21 -15
  685. package/dist/utils/image-convert.js.map +1 -1
  686. package/dist/utils/image-process.d.ts +18 -0
  687. package/dist/utils/image-process.d.ts.map +1 -0
  688. package/dist/utils/image-process.js +83 -0
  689. package/dist/utils/image-process.js.map +1 -0
  690. package/dist/utils/image-resize-core.d.ts +30 -0
  691. package/dist/utils/image-resize-core.d.ts.map +1 -0
  692. package/dist/utils/image-resize-core.js +124 -0
  693. package/dist/utils/image-resize-core.js.map +1 -0
  694. package/dist/utils/image-resize-worker.d.ts +2 -0
  695. package/dist/utils/image-resize-worker.d.ts.map +1 -0
  696. package/dist/utils/image-resize-worker.js +31 -0
  697. package/dist/utils/image-resize-worker.js.map +1 -0
  698. package/dist/utils/image-resize.d.ts +7 -27
  699. package/dist/utils/image-resize.d.ts.map +1 -1
  700. package/dist/utils/image-resize.js +75 -115
  701. package/dist/utils/image-resize.js.map +1 -1
  702. package/dist/utils/json.d.ts +3 -0
  703. package/dist/utils/json.d.ts.map +1 -0
  704. package/dist/utils/json.js +7 -0
  705. package/dist/utils/json.js.map +1 -0
  706. package/dist/utils/management-http.d.ts +23 -0
  707. package/dist/utils/management-http.d.ts.map +1 -0
  708. package/dist/utils/management-http.js +50 -0
  709. package/dist/utils/management-http.js.map +1 -0
  710. package/dist/utils/mime.d.ts +1 -0
  711. package/dist/utils/mime.d.ts.map +1 -1
  712. package/dist/utils/mime.js +100 -16
  713. package/dist/utils/mime.js.map +1 -1
  714. package/dist/utils/open-browser.d.ts +9 -0
  715. package/dist/utils/open-browser.d.ts.map +1 -0
  716. package/dist/utils/open-browser.js +22 -0
  717. package/dist/utils/open-browser.js.map +1 -0
  718. package/dist/utils/paths.d.ts +28 -1
  719. package/dist/utils/paths.d.ts.map +1 -1
  720. package/dist/utils/paths.js +97 -2
  721. package/dist/utils/paths.js.map +1 -1
  722. package/dist/utils/pi-user-agent.d.ts +2 -0
  723. package/dist/utils/pi-user-agent.d.ts.map +1 -0
  724. package/dist/utils/pi-user-agent.js +5 -0
  725. package/dist/utils/pi-user-agent.js.map +1 -0
  726. package/dist/utils/shell.d.ts +1 -0
  727. package/dist/utils/shell.d.ts.map +1 -1
  728. package/dist/utils/shell.js +18 -6
  729. package/dist/utils/shell.js.map +1 -1
  730. package/dist/utils/syntax-highlight.d.ts +12 -0
  731. package/dist/utils/syntax-highlight.d.ts.map +1 -0
  732. package/dist/utils/syntax-highlight.js +118 -0
  733. package/dist/utils/syntax-highlight.js.map +1 -0
  734. package/dist/utils/tool-result-images.d.ts +19 -0
  735. package/dist/utils/tool-result-images.d.ts.map +1 -0
  736. package/dist/utils/tool-result-images.js +45 -0
  737. package/dist/utils/tool-result-images.js.map +1 -0
  738. package/dist/utils/tools-manager.d.ts +10 -1
  739. package/dist/utils/tools-manager.d.ts.map +1 -1
  740. package/dist/utils/tools-manager.js +105 -36
  741. package/dist/utils/tools-manager.js.map +1 -1
  742. package/dist/utils/version-check.d.ts +19 -0
  743. package/dist/utils/version-check.d.ts.map +1 -0
  744. package/dist/utils/version-check.js +85 -0
  745. package/dist/utils/version-check.js.map +1 -0
  746. package/dist/utils/windows-self-update.d.ts +3 -0
  747. package/dist/utils/windows-self-update.d.ts.map +1 -0
  748. package/dist/utils/windows-self-update.js +77 -0
  749. package/dist/utils/windows-self-update.js.map +1 -0
  750. package/docs/compaction.md +39 -32
  751. package/docs/containerization.md +113 -0
  752. package/docs/custom-provider.md +212 -75
  753. package/docs/development.md +9 -9
  754. package/docs/docs.json +156 -0
  755. package/docs/environment-variables.md +186 -0
  756. package/docs/extensions.md +652 -140
  757. package/docs/index.md +81 -0
  758. package/docs/json.md +26 -15
  759. package/docs/keybindings.md +60 -21
  760. package/docs/llama-cpp.md +99 -0
  761. package/docs/models.md +168 -34
  762. package/docs/packages.md +46 -36
  763. package/docs/prompt-templates.md +13 -5
  764. package/docs/providers.md +147 -26
  765. package/docs/quickstart.md +167 -0
  766. package/docs/rpc.md +218 -36
  767. package/docs/sdk.md +190 -125
  768. package/docs/security.md +59 -0
  769. package/docs/{session.md → session-format.md} +48 -22
  770. package/docs/sessions.md +145 -0
  771. package/docs/settings.md +130 -25
  772. package/docs/shell-aliases.md +2 -2
  773. package/docs/skills.md +13 -14
  774. package/docs/terminal-setup.md +73 -16
  775. package/docs/termux.md +10 -10
  776. package/docs/themes.md +41 -16
  777. package/docs/tmux.md +6 -4
  778. package/docs/tui.md +85 -61
  779. package/docs/usage.md +302 -0
  780. package/docs/windows.md +2 -2
  781. package/examples/README.md +1 -1
  782. package/examples/extensions/README.md +12 -9
  783. package/examples/extensions/bash-spawn-hook.ts +2 -2
  784. package/examples/extensions/border-status-editor.ts +145 -0
  785. package/examples/extensions/built-in-tool-renderer.ts +2 -2
  786. package/examples/extensions/claude-rules.ts +1 -1
  787. package/examples/extensions/commands.ts +1 -1
  788. package/examples/extensions/custom-compaction.ts +6 -16
  789. package/examples/extensions/custom-footer.ts +1 -1
  790. package/examples/extensions/custom-header.ts +7 -7
  791. package/examples/extensions/custom-provider-anthropic/index.ts +15 -8
  792. package/examples/extensions/custom-provider-anthropic/package-lock.json +4 -4
  793. package/examples/extensions/custom-provider-anthropic/package.json +3 -3
  794. package/examples/extensions/custom-provider-gitlab-duo/index.ts +65 -9
  795. package/examples/extensions/custom-provider-gitlab-duo/package.json +2 -2
  796. package/examples/extensions/custom-provider-gitlab-duo/test.ts +2 -2
  797. package/examples/extensions/doom-overlay/README.md +1 -1
  798. package/examples/extensions/doom-overlay/doom-component.ts +4 -4
  799. package/examples/extensions/doom-overlay/doom-keys.ts +1 -1
  800. package/examples/extensions/doom-overlay/index.ts +5 -5
  801. package/examples/extensions/doom-overlay/wad-finder.ts +7 -3
  802. package/examples/extensions/dynamic-resources/dynamic.json +1 -1
  803. package/examples/extensions/entry-renderer.ts +41 -0
  804. package/examples/extensions/git-merge-and-resolve.ts +115 -0
  805. package/examples/extensions/github-issue-autocomplete.ts +2 -2
  806. package/examples/extensions/gondolin/index.ts +531 -0
  807. package/examples/extensions/gondolin/package-lock.json +185 -0
  808. package/examples/extensions/gondolin/package.json +19 -0
  809. package/examples/extensions/handoff.ts +50 -14
  810. package/examples/extensions/hidden-thinking-label.ts +1 -1
  811. package/examples/extensions/inline-bash.ts +2 -2
  812. package/examples/extensions/input-transform-streaming.ts +39 -0
  813. package/examples/extensions/input-transform.ts +2 -2
  814. package/examples/extensions/interactive-shell.ts +2 -2
  815. package/examples/extensions/kimi-deferred-tools.ts +61 -0
  816. package/examples/extensions/mac-system-theme.ts +2 -2
  817. package/examples/extensions/message-renderer.ts +3 -3
  818. package/examples/extensions/minimal-mode.ts +2 -2
  819. package/examples/extensions/modal-editor.ts +2 -2
  820. package/examples/extensions/model-status.ts +1 -1
  821. package/examples/extensions/notify.ts +3 -3
  822. package/examples/extensions/overlay-qa-tests.ts +242 -140
  823. package/examples/extensions/overlay-test.ts +9 -6
  824. package/examples/extensions/pirate.ts +1 -1
  825. package/examples/extensions/plan-mode/README.md +3 -2
  826. package/examples/extensions/plan-mode/index.ts +90 -40
  827. package/examples/extensions/preset.ts +16 -10
  828. package/examples/extensions/project-trust.ts +64 -0
  829. package/examples/extensions/prompt-customizer.ts +1 -1
  830. package/examples/extensions/provider-payload.ts +5 -5
  831. package/examples/extensions/qna.ts +4 -8
  832. package/examples/extensions/question.ts +41 -19
  833. package/examples/extensions/questionnaire.ts +50 -29
  834. package/examples/extensions/rainbow-editor.ts +1 -1
  835. package/examples/extensions/reload-runtime.ts +2 -2
  836. package/examples/extensions/rpc-demo.ts +1 -1
  837. package/examples/extensions/sandbox/index.ts +9 -9
  838. package/examples/extensions/sandbox/package-lock.json +7 -7
  839. package/examples/extensions/sandbox/package.json +3 -3
  840. package/examples/extensions/shutdown-command.ts +5 -5
  841. package/examples/extensions/snake.ts +2 -2
  842. package/examples/extensions/space-invaders.ts +2 -2
  843. package/examples/extensions/ssh.ts +2 -2
  844. package/examples/extensions/structured-output.ts +1 -1
  845. package/examples/extensions/subagent/README.md +18 -13
  846. package/examples/extensions/subagent/agents.ts +42 -11
  847. package/examples/extensions/subagent/index.ts +76 -30
  848. package/examples/extensions/summarize.ts +12 -19
  849. package/examples/extensions/tic-tac-toe.ts +2 -2
  850. package/examples/extensions/titlebar-spinner.ts +3 -3
  851. package/examples/extensions/todo.ts +2 -2
  852. package/examples/extensions/tool-override.ts +1 -1
  853. package/examples/extensions/tools.ts +7 -2
  854. package/examples/extensions/truncated-tool.ts +2 -2
  855. package/examples/extensions/with-deps/package-lock.json +4 -4
  856. package/examples/extensions/with-deps/package.json +4 -4
  857. package/examples/extensions/working-indicator.ts +4 -4
  858. package/examples/extensions/working-message-test.ts +1 -1
  859. package/examples/rpc-extension-ui.ts +11 -2
  860. package/examples/sdk/01-minimal.ts +15 -11
  861. package/examples/sdk/02-custom-model.ts +18 -18
  862. package/examples/sdk/03-custom-prompt.ts +25 -17
  863. package/examples/sdk/04-skills.ts +3 -3
  864. package/examples/sdk/05-tools.ts +8 -4
  865. package/examples/sdk/06-extensions.ts +13 -9
  866. package/examples/sdk/07-context-files.ts +2 -2
  867. package/examples/sdk/08-prompt-templates.ts +3 -3
  868. package/examples/sdk/09-api-keys-and-oauth.ts +19 -33
  869. package/examples/sdk/10-settings.ts +4 -4
  870. package/examples/sdk/11-sessions.ts +4 -0
  871. package/examples/sdk/12-full-control.ts +22 -21
  872. package/examples/sdk/README.md +23 -30
  873. package/npm-shrinkwrap.json +1818 -0
  874. package/package.json +117 -99
  875. package/dist/modes/interactive/assets/clankolas.png +0 -0
  876. package/dist/modes/interactive/components/auth-selector-status.d.ts +0 -20
  877. package/dist/modes/interactive/components/auth-selector-status.d.ts.map +0 -1
  878. package/dist/modes/interactive/components/auth-selector-status.js +0 -23
  879. package/dist/modes/interactive/components/auth-selector-status.js.map +0 -1
  880. package/dist/modes/interactive/components/earendil-announcement.d.ts +0 -5
  881. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +0 -1
  882. package/dist/modes/interactive/components/earendil-announcement.js +0 -40
  883. package/dist/modes/interactive/components/earendil-announcement.js.map +0 -1
  884. package/docs/images/exy.png +0 -0
  885. package/docs/tree.md +0 -233
  886. package/examples/extensions/antigravity-image-gen.ts +0 -418
  887. package/examples/extensions/custom-provider-qwen-cli/index.ts +0 -345
  888. package/examples/extensions/custom-provider-qwen-cli/package.json +0 -16
@@ -1,24 +1,51 @@
1
- import { spawn, spawnSync } from "node:child_process";
2
1
  import { createHash } from "node:crypto";
3
- import { existsSync, mkdirSync, readdirSync, readFileSync, realpathSync, rmSync, statSync, writeFileSync, } from "node:fs";
4
- import { homedir, tmpdir } from "node:os";
2
+ import { chmodSync, existsSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ function getEnv() {
5
+ if (process.platform !== "linux" || Object.keys(process.env).length > 0) {
6
+ return process.env;
7
+ }
8
+ try {
9
+ const data = readFileSync("/proc/self/environ", "utf-8");
10
+ const env = {};
11
+ for (const entry of data.split("\0")) {
12
+ const idx = entry.indexOf("=");
13
+ if (idx > 0) {
14
+ env[entry.slice(0, idx)] = entry.slice(idx + 1);
15
+ }
16
+ }
17
+ return env;
18
+ }
19
+ catch {
20
+ return process.env;
21
+ }
22
+ }
5
23
  import { basename, dirname, join, relative, resolve, sep } from "node:path";
6
24
  import { globSync } from "glob";
7
25
  import ignore from "ignore";
8
26
  import { minimatch } from "minimatch";
9
- import { CONFIG_DIR_NAME } from "../config.js";
27
+ import { maxSatisfying, rcompare, satisfies, valid, validRange } from "semver";
28
+ import { CONFIG_DIR_NAME, getAgentDir, getCacheDir } from "../config.js";
29
+ import { spawnProcess, spawnProcessSync } from "../utils/child-process.js";
10
30
  import { parseGitUrl } from "../utils/git.js";
11
- import { isLocalPath } from "../utils/paths.js";
31
+ import { canonicalizePath, isLocalPath, markPathIgnoredByCloudSync, resolvePath } from "../utils/paths.js";
12
32
  import { isStdoutTakenOver } from "./output-guard.js";
33
+ import { readPiManifest } from "./pi-manifest.js";
13
34
  const NETWORK_TIMEOUT_MS = 10000;
14
35
  const UPDATE_CHECK_CONCURRENCY = 4;
15
36
  const GIT_UPDATE_CONCURRENCY = 4;
16
37
  function isOfflineModeEnabled() {
17
- const value = process.env.PI_OFFLINE;
38
+ const value = process.env.MCPI_OFFLINE;
18
39
  if (!value)
19
40
  return false;
20
41
  return value === "1" || value.toLowerCase() === "true" || value.toLowerCase() === "yes";
21
42
  }
43
+ function isExactNpmVersion(version) {
44
+ return valid(version ?? "") !== null;
45
+ }
46
+ function getNpmVersionRange(version) {
47
+ return version ? (validRange(version) ?? undefined) : undefined;
48
+ }
22
49
  /**
23
50
  * Compute a numeric precedence rank for a resource based on its metadata.
24
51
  * Lower rank = higher precedence. Used to sort resolved resources so that
@@ -51,6 +78,12 @@ function toPosixPath(p) {
51
78
  function getHomeDir() {
52
79
  return process.env.HOME || homedir();
53
80
  }
81
+ export function getExtensionTempFolder(agentDir) {
82
+ const tempFolder = join(agentDir, "tmp", "extensions");
83
+ mkdirSync(tempFolder, { recursive: true, mode: 0o700 });
84
+ chmodSync(tempFolder, 0o700);
85
+ return tempFolder;
86
+ }
54
87
  function prefixIgnorePattern(line, prefix) {
55
88
  const trimmed = line.trim();
56
89
  if (!trimmed)
@@ -206,7 +239,7 @@ function collectSkillEntries(dir, mode, ignoreMatcher, rootDir) {
206
239
  }
207
240
  }
208
241
  const relPath = toPosixPath(relative(root, fullPath));
209
- if (mode === "pi" && dir === root && isFile && entry.name.endsWith(".md") && !ig.ignores(relPath)) {
242
+ if (mode === "mcpi" && dir === root && isFile && entry.name.endsWith(".md") && !ig.ignores(relPath)) {
210
243
  entries.push(fullPath);
211
244
  continue;
212
245
  }
@@ -328,20 +361,10 @@ function collectAutoThemeEntries(dir) {
328
361
  }
329
362
  return entries;
330
363
  }
331
- function readPiManifestFile(packageJsonPath) {
332
- try {
333
- const content = readFileSync(packageJsonPath, "utf-8");
334
- const pkg = JSON.parse(content);
335
- return pkg.pi ?? null;
336
- }
337
- catch {
338
- return null;
339
- }
340
- }
341
364
  function resolveExtensionEntries(dir) {
342
365
  const packageJsonPath = join(dir, "package.json");
343
366
  if (existsSync(packageJsonPath)) {
344
- const manifest = readPiManifestFile(packageJsonPath);
367
+ const manifest = readPiManifest(packageJsonPath);
345
368
  if (manifest?.extensions?.length) {
346
369
  const entries = [];
347
370
  for (const extPath of manifest.extensions) {
@@ -423,7 +446,7 @@ function collectAutoExtensionEntries(dir) {
423
446
  */
424
447
  function collectResourceFiles(dir, resourceType) {
425
448
  if (resourceType === "skills") {
426
- return collectSkillEntries(dir, "pi");
449
+ return collectSkillEntries(dir, "mcpi");
427
450
  }
428
451
  if (resourceType === "extensions") {
429
452
  return collectAutoExtensionEntries(dir);
@@ -550,16 +573,37 @@ function applyPatterns(allPaths, patterns, baseDir) {
550
573
  }
551
574
  return new Set(result);
552
575
  }
576
+ function applyAutoloadDisabledPatterns(allPaths, patterns, baseDir) {
577
+ const result = new Map();
578
+ for (const pattern of patterns) {
579
+ const target = pattern.slice(pattern.startsWith("+") || pattern.startsWith("-") || pattern.startsWith("!") ? 1 : 0);
580
+ const enabled = !pattern.startsWith("-") && !pattern.startsWith("!");
581
+ const exact = pattern.startsWith("+") || pattern.startsWith("-");
582
+ for (const filePath of allPaths) {
583
+ if (exact ? matchesAnyExactPattern(filePath, [target], baseDir) : matchesAnyPattern(filePath, [target], baseDir)) {
584
+ result.set(filePath, enabled);
585
+ }
586
+ }
587
+ }
588
+ return result;
589
+ }
553
590
  export class DefaultPackageManager {
554
591
  cwd;
555
592
  agentDir;
593
+ cacheDir;
556
594
  settingsManager;
557
595
  globalNpmRoot;
558
596
  globalNpmRootCommandKey;
559
597
  progressCallback;
560
598
  constructor(options) {
561
- this.cwd = options.cwd;
562
- this.agentDir = options.agentDir;
599
+ this.cwd = resolvePath(options.cwd);
600
+ this.agentDir = resolvePath(options.agentDir);
601
+ this.cacheDir =
602
+ options.cacheDir !== undefined
603
+ ? resolvePath(options.cacheDir)
604
+ : this.agentDir === resolvePath(getAgentDir())
605
+ ? getCacheDir()
606
+ : this.agentDir;
563
607
  this.settingsManager = options.settingsManager;
564
608
  }
565
609
  setProgressCallback(callback) {
@@ -570,9 +614,22 @@ export class DefaultPackageManager {
570
614
  const currentSettings = scope === "project" ? this.settingsManager.getProjectSettings() : this.settingsManager.getGlobalSettings();
571
615
  const currentPackages = currentSettings.packages ?? [];
572
616
  const normalizedSource = this.normalizePackageSourceForSettings(source, scope);
573
- const exists = currentPackages.some((existing) => this.packageSourcesMatch(existing, source, scope));
574
- if (exists) {
575
- return false;
617
+ const matchIndex = currentPackages.findIndex((existing) => this.packageSourcesMatch(existing, source, scope));
618
+ if (matchIndex !== -1) {
619
+ const existing = currentPackages[matchIndex];
620
+ if (this.getPackageSourceString(existing) === normalizedSource) {
621
+ return false;
622
+ }
623
+ const nextPackages = [...currentPackages];
624
+ nextPackages[matchIndex] =
625
+ typeof existing === "string" ? normalizedSource : { ...existing, source: normalizedSource };
626
+ if (scope === "project") {
627
+ this.settingsManager.setProjectPackages(nextPackages);
628
+ }
629
+ else {
630
+ this.settingsManager.setPackages(nextPackages);
631
+ }
632
+ return true;
576
633
  }
577
634
  const nextPackages = [...currentPackages, normalizedSource];
578
635
  if (scope === "project") {
@@ -701,6 +758,7 @@ export class DefaultPackageManager {
701
758
  async install(source, options) {
702
759
  const parsed = this.parseSource(source);
703
760
  const scope = options?.local ? "project" : "user";
761
+ this.assertProjectTrustedForScope(scope);
704
762
  await this.withProgress("install", source, `Installing ${source}...`, async () => {
705
763
  if (parsed.type === "npm") {
706
764
  await this.installNpm(parsed, scope, false);
@@ -727,6 +785,7 @@ export class DefaultPackageManager {
727
785
  async remove(source, options) {
728
786
  const parsed = this.parseSource(source);
729
787
  const scope = options?.local ? "project" : "user";
788
+ this.assertProjectTrustedForScope(scope);
730
789
  await this.withProgress("remove", source, `Removing ${source}...`, async () => {
731
790
  if (parsed.type === "npm") {
732
791
  await this.uninstallNpm(parsed, scope);
@@ -782,14 +841,16 @@ export class DefaultPackageManager {
782
841
  const gitCandidates = [];
783
842
  for (const entry of sources) {
784
843
  const parsed = this.parseSource(entry.source);
785
- if (parsed.type === "local" || parsed.pinned) {
786
- continue;
787
- }
844
+ // Pinned npm versions are fixed. Pinned git refs are configured checkout targets,
845
+ // so include them to reconcile an existing clone when the configured ref changes.
788
846
  if (parsed.type === "npm") {
789
- npmCandidates.push({ ...entry, parsed });
790
- continue;
847
+ if (!parsed.pinned) {
848
+ npmCandidates.push({ ...entry, parsed });
849
+ }
850
+ }
851
+ else if (parsed.type === "git") {
852
+ gitCandidates.push({ ...entry, parsed });
791
853
  }
792
- gitCandidates.push({ ...entry, parsed });
793
854
  }
794
855
  const npmCheckTasks = npmCandidates.map((entry) => async () => ({
795
856
  entry,
@@ -825,14 +886,14 @@ export class DefaultPackageManager {
825
886
  await Promise.all(tasks);
826
887
  }
827
888
  async shouldUpdateNpmSource(source, scope) {
828
- const installedPath = this.getNpmInstallPath(source, scope);
889
+ const installedPath = this.getManagedNpmInstallPath(source, scope);
829
890
  const installedVersion = existsSync(installedPath) ? this.getInstalledNpmVersion(installedPath) : undefined;
830
891
  if (!installedVersion) {
831
892
  return true;
832
893
  }
833
894
  try {
834
- const latestVersion = await this.getLatestNpmVersion(source.name);
835
- return latestVersion !== installedVersion;
895
+ const targetVersion = await this.getLatestNpmVersion(source.version ? source.spec : source.name, source.range);
896
+ return targetVersion !== installedVersion;
836
897
  }
837
898
  catch {
838
899
  // Preserve existing update behavior when version lookup fails.
@@ -845,19 +906,15 @@ export class DefaultPackageManager {
845
906
  }
846
907
  const sourceLabel = sources.length === 1 ? sources[0].source : `${scope} npm packages`;
847
908
  const message = sources.length === 1 ? `Updating ${sources[0].source}...` : `Updating ${scope} npm packages...`;
848
- const specs = sources.map((entry) => `${entry.parsed.name}@latest`);
909
+ const specs = sources.map((entry) => (entry.parsed.version ? entry.parsed.spec : `${entry.parsed.name}@latest`));
849
910
  await this.withProgress("update", sourceLabel, message, async () => {
850
911
  await this.installNpmBatch(specs, scope);
851
912
  });
852
913
  }
853
914
  async installNpmBatch(specs, scope) {
854
- if (scope === "user") {
855
- await this.runNpmCommand(["install", "-g", ...specs]);
856
- return;
857
- }
858
915
  const installRoot = this.getNpmInstallRoot(scope, false);
859
916
  this.ensureNpmProject(installRoot);
860
- await this.runNpmCommand(["install", ...specs, "--prefix", installRoot]);
917
+ await this.runNpmCommand(this.getNpmInstallArgs(specs, installRoot));
861
918
  }
862
919
  async checkForAvailableUpdates() {
863
920
  if (isOfflineModeEnabled()) {
@@ -919,57 +976,67 @@ export class DefaultPackageManager {
919
976
  for (const { pkg, scope } of sources) {
920
977
  const sourceStr = typeof pkg === "string" ? pkg : pkg.source;
921
978
  const filter = typeof pkg === "object" ? pkg : undefined;
922
- const parsed = this.parseSource(sourceStr);
979
+ const deltaBase = this.findAutoloadDeltaBase(pkg, scope, sources);
980
+ const resolvedSource = deltaBase?.source ?? sourceStr;
981
+ const resolvedScope = deltaBase?.scope ?? scope;
982
+ const parsed = this.parseSource(resolvedSource);
923
983
  const metadata = { source: sourceStr, scope, origin: "package" };
924
984
  if (parsed.type === "local") {
925
- const baseDir = this.getBaseDirForScope(scope);
985
+ const baseDir = this.getBaseDirForScope(resolvedScope);
926
986
  this.resolveLocalExtensionSource(parsed, accumulator, filter, metadata, baseDir);
927
987
  continue;
928
988
  }
929
989
  const installMissing = async () => {
930
- if (isOfflineModeEnabled()) {
990
+ if (isOfflineModeEnabled())
931
991
  return false;
932
- }
933
992
  if (!onMissing) {
934
- await this.installParsedSource(parsed, scope);
993
+ await this.installParsedSource(parsed, resolvedScope);
935
994
  return true;
936
995
  }
937
- const action = await onMissing(sourceStr);
996
+ const action = await onMissing(resolvedSource);
938
997
  if (action === "skip")
939
998
  return false;
940
999
  if (action === "error")
941
- throw new Error(`Missing source: ${sourceStr}`);
942
- await this.installParsedSource(parsed, scope);
1000
+ throw new Error(`Missing source: ${resolvedSource}`);
1001
+ await this.installParsedSource(parsed, resolvedScope);
943
1002
  return true;
944
1003
  };
945
1004
  if (parsed.type === "npm") {
946
- const installedPath = this.getNpmInstallPath(parsed, scope);
947
- const needsInstall = !existsSync(installedPath) ||
948
- (parsed.pinned && !(await this.installedNpmMatchesPinnedVersion(parsed, installedPath)));
1005
+ let installedPath = this.getNpmInstallPath(parsed, resolvedScope);
1006
+ const needsInstall = !existsSync(installedPath) || !(await this.installedNpmMatchesConfiguredVersion(parsed, installedPath));
949
1007
  if (needsInstall) {
950
1008
  const installed = await installMissing();
951
1009
  if (!installed)
952
1010
  continue;
1011
+ installedPath = this.getNpmInstallPath(parsed, resolvedScope);
953
1012
  }
954
1013
  metadata.baseDir = installedPath;
955
1014
  this.collectPackageResources(installedPath, accumulator, filter, metadata);
956
1015
  continue;
957
1016
  }
958
1017
  if (parsed.type === "git") {
959
- const installedPath = this.getGitInstallPath(parsed, scope);
1018
+ const installedPath = this.getGitInstallPath(parsed, resolvedScope);
960
1019
  if (!existsSync(installedPath)) {
961
1020
  const installed = await installMissing();
962
1021
  if (!installed)
963
1022
  continue;
964
1023
  }
965
- else if (scope === "temporary" && !parsed.pinned && !isOfflineModeEnabled()) {
966
- await this.refreshTemporaryGitSource(parsed, sourceStr);
1024
+ else if (resolvedScope === "temporary" && !parsed.pinned && !isOfflineModeEnabled()) {
1025
+ await this.refreshTemporaryGitSource(parsed, resolvedSource);
967
1026
  }
968
1027
  metadata.baseDir = installedPath;
969
1028
  this.collectPackageResources(installedPath, accumulator, filter, metadata);
970
1029
  }
971
1030
  }
972
1031
  }
1032
+ findAutoloadDeltaBase(pkg, scope, sources) {
1033
+ if (scope !== "project" || typeof pkg !== "object" || pkg.autoload !== false)
1034
+ return undefined;
1035
+ const identity = this.getPackageIdentity(pkg.source, scope);
1036
+ const userEntry = sources.find((entry) => entry.scope === "user" &&
1037
+ this.getPackageIdentity(this.getPackageSourceString(entry.pkg), "user") === identity);
1038
+ return userEntry ? { source: this.getPackageSourceString(userEntry.pkg), scope: "user" } : undefined;
1039
+ }
973
1040
  resolveLocalExtensionSource(source, accumulator, filter, metadata, baseDir) {
974
1041
  const resolved = this.resolvePathFromBase(source.path, baseDir);
975
1042
  if (!existsSync(resolved)) {
@@ -1080,7 +1147,9 @@ export class DefaultPackageManager {
1080
1147
  type: "npm",
1081
1148
  spec,
1082
1149
  name,
1083
- pinned: Boolean(version),
1150
+ version,
1151
+ range: getNpmVersionRange(version),
1152
+ pinned: isExactNpmVersion(version),
1084
1153
  };
1085
1154
  }
1086
1155
  if (isLocalPath(source)) {
@@ -1093,16 +1162,12 @@ export class DefaultPackageManager {
1093
1162
  }
1094
1163
  return { type: "local", path: source };
1095
1164
  }
1096
- async installedNpmMatchesPinnedVersion(source, installedPath) {
1165
+ async installedNpmMatchesConfiguredVersion(source, installedPath) {
1097
1166
  const installedVersion = this.getInstalledNpmVersion(installedPath);
1098
1167
  if (!installedVersion) {
1099
1168
  return false;
1100
1169
  }
1101
- const { version: pinnedVersion } = this.parseNpmSpec(source.spec);
1102
- if (!pinnedVersion) {
1103
- return true;
1104
- }
1105
- return installedVersion === pinnedVersion;
1170
+ return source.range ? satisfies(installedVersion, source.range) : true;
1106
1171
  }
1107
1172
  async npmHasAvailableUpdate(source, installedPath) {
1108
1173
  if (isOfflineModeEnabled()) {
@@ -1113,8 +1178,8 @@ export class DefaultPackageManager {
1113
1178
  return false;
1114
1179
  }
1115
1180
  try {
1116
- const latestVersion = await this.getLatestNpmVersion(source.name);
1117
- return latestVersion !== installedVersion;
1181
+ const targetVersion = await this.getLatestNpmVersion(source.version ? source.spec : source.name, source.range);
1182
+ return targetVersion !== installedVersion;
1118
1183
  }
1119
1184
  catch {
1120
1185
  return false;
@@ -1133,13 +1198,23 @@ export class DefaultPackageManager {
1133
1198
  return undefined;
1134
1199
  }
1135
1200
  }
1136
- async getLatestNpmVersion(packageName) {
1201
+ async getLatestNpmVersion(packageSpec, range) {
1137
1202
  const npmCommand = this.getNpmCommand();
1138
- const stdout = await this.runCommandCapture(npmCommand.command, [...npmCommand.args, "view", packageName, "version", "--json"], { cwd: this.cwd, timeoutMs: NETWORK_TIMEOUT_MS });
1203
+ const stdout = await this.runCommandCapture(npmCommand.command, [...npmCommand.args, "view", packageSpec, "version", "--json"], { cwd: this.cwd, timeoutMs: NETWORK_TIMEOUT_MS });
1139
1204
  const raw = stdout.trim();
1140
1205
  if (!raw)
1141
1206
  throw new Error("Empty response from npm view");
1142
- return JSON.parse(raw);
1207
+ const parsed = JSON.parse(raw);
1208
+ if (typeof parsed === "string") {
1209
+ return parsed;
1210
+ }
1211
+ if (Array.isArray(parsed)) {
1212
+ const versions = parsed.filter((value) => typeof value === "string" && value.length > 0);
1213
+ const latest = range ? maxSatisfying(versions, range) : [...versions].sort(rcompare)[0];
1214
+ if (latest)
1215
+ return latest;
1216
+ }
1217
+ throw new Error("Unexpected response from npm view");
1143
1218
  }
1144
1219
  async gitHasAvailableUpdate(installedPath) {
1145
1220
  if (isOfflineModeEnabled()) {
@@ -1303,25 +1378,30 @@ export class DefaultPackageManager {
1303
1378
  }
1304
1379
  /**
1305
1380
  * Dedupe packages: if same package identity appears in both global and project,
1306
- * keep only the project one (project wins).
1381
+ * keep only the project one (project wins). A project entry with autoload=false
1382
+ * is a delta over the global entry, so both are kept (delta first).
1307
1383
  */
1308
1384
  dedupePackages(packages) {
1385
+ const result = [];
1309
1386
  const seen = new Map();
1310
1387
  for (const entry of packages) {
1311
- const sourceStr = typeof entry.pkg === "string" ? entry.pkg : entry.pkg.source;
1312
- const identity = this.getPackageIdentity(sourceStr, entry.scope);
1313
- const existing = seen.get(identity);
1314
- if (!existing) {
1315
- seen.set(identity, entry);
1388
+ const identity = this.getPackageIdentity(this.getPackageSourceString(entry.pkg), entry.scope);
1389
+ const index = seen.get(identity);
1390
+ if (index === undefined) {
1391
+ seen.set(identity, result.length);
1392
+ result.push(entry);
1393
+ continue;
1394
+ }
1395
+ const existing = result[index];
1396
+ if (existing?.scope === "project" && entry.scope === "user") {
1397
+ if (typeof existing.pkg === "object" && existing.pkg.autoload === false)
1398
+ result.push(entry);
1316
1399
  }
1317
- else if (entry.scope === "project" && existing.scope === "user") {
1318
- // Project wins over user
1319
- seen.set(identity, entry);
1400
+ else if (entry.scope === "project") {
1401
+ result[index] = entry;
1320
1402
  }
1321
- // If existing is project and new is global, keep existing (project)
1322
- // If both are same scope, keep first one
1323
1403
  }
1324
- return Array.from(seen.values());
1404
+ return result;
1325
1405
  }
1326
1406
  parseNpmSpec(spec) {
1327
1407
  const match = spec.match(/^(@?[^@]+(?:\/[^@]+)?)(?:@(.+))?$/);
@@ -1332,6 +1412,11 @@ export class DefaultPackageManager {
1332
1412
  const version = match[2];
1333
1413
  return { name, version };
1334
1414
  }
1415
+ assertProjectTrustedForScope(scope) {
1416
+ if (scope === "project" && !this.settingsManager.isProjectTrusted()) {
1417
+ throw new Error("Project is not trusted; refusing to access project package storage");
1418
+ }
1419
+ }
1335
1420
  getNpmCommand() {
1336
1421
  const configuredCommand = this.settingsManager.getNpmCommand();
1337
1422
  if (!configuredCommand || configuredCommand.length === 0) {
@@ -1343,6 +1428,13 @@ export class DefaultPackageManager {
1343
1428
  }
1344
1429
  return { command, args };
1345
1430
  }
1431
+ getPackageManagerName() {
1432
+ const npmCommand = this.getNpmCommand();
1433
+ const commandParts = [npmCommand.command, ...npmCommand.args];
1434
+ const separatorIndex = commandParts.lastIndexOf("--");
1435
+ const packageManagerCommand = separatorIndex >= 0 ? commandParts[separatorIndex + 1] : npmCommand.command;
1436
+ return packageManagerCommand ? basename(packageManagerCommand).replace(/\.(cmd|exe)$/i, "") : "";
1437
+ }
1346
1438
  async runNpmCommand(args, options) {
1347
1439
  const npmCommand = this.getNpmCommand();
1348
1440
  await this.runCommand(npmCommand.command, [...npmCommand.args, ...args], options);
@@ -1358,29 +1450,58 @@ export class DefaultPackageManager {
1358
1450
  const npmCommand = this.getNpmCommand();
1359
1451
  return this.runCommandSync(npmCommand.command, [...npmCommand.args, ...args]);
1360
1452
  }
1453
+ getNpmInstallArgs(specs, installRoot) {
1454
+ const packageManagerName = this.getPackageManagerName();
1455
+ // Extension packages run inside mcpi and resolve mcpi APIs through loader aliases/virtual modules.
1456
+ // Disable peer dependency resolution for managed installs (npm's --legacy-peer-deps, and
1457
+ // equivalent bun/pnpm settings) so package managers do not install or solve host-provided
1458
+ // @sammorrowdrums/mcpi-* peers. Stale auto-installed upstream peers can otherwise block updates.
1459
+ if (packageManagerName === "bun") {
1460
+ return ["install", ...specs, "--cwd", installRoot, "--omit=peer"];
1461
+ }
1462
+ if (packageManagerName === "pnpm") {
1463
+ return [
1464
+ "install",
1465
+ ...specs,
1466
+ "--prefix",
1467
+ installRoot,
1468
+ "--config.auto-install-peers=false",
1469
+ "--config.strict-peer-dependencies=false",
1470
+ "--config.strict-dep-builds=false",
1471
+ ];
1472
+ }
1473
+ return ["install", ...specs, "--prefix", installRoot, "--legacy-peer-deps"];
1474
+ }
1361
1475
  async installNpm(source, scope, temporary) {
1362
- if (scope === "user" && !temporary) {
1363
- await this.runNpmCommand(["install", "-g", source.spec]);
1364
- return;
1365
- }
1366
1476
  const installRoot = this.getNpmInstallRoot(scope, temporary);
1367
1477
  this.ensureNpmProject(installRoot);
1368
- await this.runNpmCommand(["install", source.spec, "--prefix", installRoot]);
1478
+ await this.runNpmCommand(this.getNpmInstallArgs([source.spec], installRoot));
1369
1479
  }
1370
1480
  async uninstallNpm(source, scope) {
1371
- if (scope === "user") {
1372
- await this.runNpmCommand(["uninstall", "-g", source.name]);
1373
- return;
1374
- }
1375
1481
  const installRoot = this.getNpmInstallRoot(scope, false);
1376
1482
  if (!existsSync(installRoot)) {
1377
1483
  return;
1378
1484
  }
1379
- await this.runNpmCommand(["uninstall", source.name, "--prefix", installRoot]);
1485
+ const packageManagerName = this.getPackageManagerName();
1486
+ if (packageManagerName === "bun") {
1487
+ await this.runNpmCommand(["uninstall", source.name, "--cwd", installRoot]);
1488
+ return;
1489
+ }
1490
+ const args = ["uninstall", source.name, "--prefix", installRoot];
1491
+ if (packageManagerName !== "pnpm") {
1492
+ args.push("--legacy-peer-deps");
1493
+ }
1494
+ await this.runNpmCommand(args);
1380
1495
  }
1381
1496
  async installGit(source, scope) {
1382
1497
  const targetDir = this.getGitInstallPath(source, scope);
1383
1498
  if (existsSync(targetDir)) {
1499
+ if (source.ref) {
1500
+ await this.ensureGitRef(targetDir, ["fetch", "origin", source.ref], "FETCH_HEAD");
1501
+ return;
1502
+ }
1503
+ const target = await this.getLocalGitUpdateTarget(targetDir);
1504
+ await this.ensureGitRef(targetDir, target.fetchArgs, target.ref);
1384
1505
  return;
1385
1506
  }
1386
1507
  const gitRoot = this.getGitInstallRoot(scope);
@@ -1388,13 +1509,21 @@ export class DefaultPackageManager {
1388
1509
  this.ensureGitIgnore(gitRoot);
1389
1510
  }
1390
1511
  mkdirSync(dirname(targetDir), { recursive: true });
1391
- await this.runCommand("git", ["clone", source.repo, targetDir]);
1392
- if (source.ref) {
1393
- await this.runCommand("git", ["checkout", source.ref], { cwd: targetDir });
1512
+ rmSync(this.getGitUpdateMarkerPath(targetDir), { force: true });
1513
+ try {
1514
+ await this.runCommand("git", ["clone", source.repo, targetDir]);
1515
+ if (source.ref) {
1516
+ await this.runCommand("git", ["checkout", source.ref], { cwd: targetDir });
1517
+ }
1518
+ const packageJsonPath = join(targetDir, "package.json");
1519
+ if (existsSync(packageJsonPath)) {
1520
+ await this.runNpmCommand(this.getGitDependencyInstallArgs(), { cwd: targetDir });
1521
+ }
1394
1522
  }
1395
- const packageJsonPath = join(targetDir, "package.json");
1396
- if (existsSync(packageJsonPath)) {
1397
- await this.runNpmCommand(this.getGitDependencyInstallArgs(), { cwd: targetDir });
1523
+ catch (error) {
1524
+ rmSync(targetDir, { recursive: true, force: true });
1525
+ this.pruneEmptyGitParents(targetDir, gitRoot);
1526
+ throw error;
1398
1527
  }
1399
1528
  }
1400
1529
  async updateGit(source, scope) {
@@ -1403,27 +1532,85 @@ export class DefaultPackageManager {
1403
1532
  await this.installGit(source, scope);
1404
1533
  return;
1405
1534
  }
1535
+ if (source.ref) {
1536
+ await this.ensureGitRef(targetDir, ["fetch", "origin", source.ref], "FETCH_HEAD");
1537
+ return;
1538
+ }
1406
1539
  const target = await this.getLocalGitUpdateTarget(targetDir);
1540
+ await this.ensureGitRef(targetDir, target.fetchArgs, target.ref);
1541
+ }
1542
+ hasMissingGitDependencies(targetDir) {
1543
+ const packageJsonPath = join(targetDir, "package.json");
1544
+ if (!existsSync(packageJsonPath))
1545
+ return false;
1546
+ try {
1547
+ const manifest = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
1548
+ if (!manifest.dependencies ||
1549
+ typeof manifest.dependencies !== "object" ||
1550
+ Array.isArray(manifest.dependencies)) {
1551
+ return false;
1552
+ }
1553
+ const nodeModulesDir = resolve(targetDir, "node_modules");
1554
+ return Object.keys(manifest.dependencies).some((name) => {
1555
+ const dependencyPath = resolve(nodeModulesDir, name);
1556
+ if (!dependencyPath.startsWith(`${nodeModulesDir}${sep}`))
1557
+ return false;
1558
+ return !existsSync(dependencyPath);
1559
+ });
1560
+ }
1561
+ catch {
1562
+ return false;
1563
+ }
1564
+ }
1565
+ async repairMissingGitDependencies(targetDir) {
1566
+ if (!this.hasMissingGitDependencies(targetDir))
1567
+ return;
1568
+ await this.runNpmCommand(this.getGitDependencyInstallArgs(), { cwd: targetDir });
1569
+ }
1570
+ getGitUpdateMarkerPath(targetDir) {
1571
+ return join(dirname(targetDir), `.${basename(targetDir)}.mcpi-update-incomplete`);
1572
+ }
1573
+ async cleanAndInstallGitDependencies(targetDir, markerPath) {
1574
+ // Clean untracked files (extensions should be pristine). If this fails after
1575
+ // deleting dependencies, repair them so the existing extension still loads.
1576
+ try {
1577
+ await this.runCommand("git", ["clean", "-fdx"], { cwd: targetDir });
1578
+ }
1579
+ catch (error) {
1580
+ await this.repairMissingGitDependencies(targetDir).catch(() => { });
1581
+ throw error;
1582
+ }
1583
+ const packageJsonPath = join(targetDir, "package.json");
1584
+ if (existsSync(packageJsonPath)) {
1585
+ await this.runNpmCommand(this.getGitDependencyInstallArgs(), { cwd: targetDir });
1586
+ }
1587
+ rmSync(markerPath, { force: true });
1588
+ }
1589
+ async ensureGitRef(targetDir, fetchArgs, ref) {
1407
1590
  // Fetch only the ref we will reset to, avoiding unrelated branch/tag noise.
1408
- await this.runCommand("git", target.fetchArgs, { cwd: targetDir });
1591
+ await this.runCommand("git", fetchArgs, { cwd: targetDir });
1409
1592
  const localHead = await this.runCommandCapture("git", ["rev-parse", "HEAD"], {
1410
1593
  cwd: targetDir,
1411
1594
  timeoutMs: NETWORK_TIMEOUT_MS,
1412
1595
  });
1413
- const refreshedTargetHead = await this.runCommandCapture("git", ["rev-parse", target.ref], {
1596
+ const commitRef = `${ref}^{commit}`;
1597
+ const targetHead = await this.runCommandCapture("git", ["rev-parse", commitRef], {
1414
1598
  cwd: targetDir,
1415
1599
  timeoutMs: NETWORK_TIMEOUT_MS,
1416
1600
  });
1417
- if (localHead.trim() === refreshedTargetHead.trim()) {
1601
+ const markerPath = this.getGitUpdateMarkerPath(targetDir);
1602
+ if (localHead.trim() === targetHead.trim()) {
1603
+ if (existsSync(markerPath)) {
1604
+ await this.cleanAndInstallGitDependencies(targetDir, markerPath);
1605
+ }
1606
+ else {
1607
+ await this.repairMissingGitDependencies(targetDir);
1608
+ }
1418
1609
  return;
1419
1610
  }
1420
- await this.runCommand("git", ["reset", "--hard", target.ref], { cwd: targetDir });
1421
- // Clean untracked files (extensions should be pristine)
1422
- await this.runCommand("git", ["clean", "-fdx"], { cwd: targetDir });
1423
- const packageJsonPath = join(targetDir, "package.json");
1424
- if (existsSync(packageJsonPath)) {
1425
- await this.runNpmCommand(this.getGitDependencyInstallArgs(), { cwd: targetDir });
1426
- }
1611
+ writeFileSync(markerPath, "", "utf-8");
1612
+ await this.runCommand("git", ["reset", "--hard", commitRef], { cwd: targetDir });
1613
+ await this.cleanAndInstallGitDependencies(targetDir, markerPath);
1427
1614
  }
1428
1615
  async refreshTemporaryGitSource(source, sourceStr) {
1429
1616
  if (isOfflineModeEnabled()) {
@@ -1440,9 +1627,8 @@ export class DefaultPackageManager {
1440
1627
  }
1441
1628
  async removeGit(source, scope) {
1442
1629
  const targetDir = this.getGitInstallPath(source, scope);
1443
- if (!existsSync(targetDir))
1444
- return;
1445
1630
  rmSync(targetDir, { recursive: true, force: true });
1631
+ rmSync(this.getGitUpdateMarkerPath(targetDir), { force: true });
1446
1632
  this.pruneEmptyGitParents(targetDir, this.getGitInstallRoot(scope));
1447
1633
  }
1448
1634
  pruneEmptyGitParents(targetDir, installRoot) {
@@ -1472,10 +1658,11 @@ export class DefaultPackageManager {
1472
1658
  if (!existsSync(installRoot)) {
1473
1659
  mkdirSync(installRoot, { recursive: true });
1474
1660
  }
1661
+ markPathIgnoredByCloudSync(installRoot);
1475
1662
  this.ensureGitIgnore(installRoot);
1476
1663
  const packageJsonPath = join(installRoot, "package.json");
1477
1664
  if (!existsSync(packageJsonPath)) {
1478
- const pkgJson = { name: "pi-extensions", private: true };
1665
+ const pkgJson = { name: "mcpi-extensions", private: true };
1479
1666
  writeFileSync(packageJsonPath, JSON.stringify(pkgJson, null, 2), "utf-8");
1480
1667
  }
1481
1668
  }
@@ -1493,9 +1680,10 @@ export class DefaultPackageManager {
1493
1680
  return this.getTemporaryDir("npm");
1494
1681
  }
1495
1682
  if (scope === "project") {
1683
+ this.assertProjectTrustedForScope(scope);
1496
1684
  return join(this.cwd, CONFIG_DIR_NAME, "npm");
1497
1685
  }
1498
- return join(this.getGlobalNpmRoot(), "..");
1686
+ return join(this.cacheDir, "npm");
1499
1687
  }
1500
1688
  getGlobalNpmRoot() {
1501
1689
  const npmCommand = this.getNpmCommand();
@@ -1503,47 +1691,94 @@ export class DefaultPackageManager {
1503
1691
  if (this.globalNpmRoot && this.globalNpmRootCommandKey === commandKey) {
1504
1692
  return this.globalNpmRoot;
1505
1693
  }
1506
- const result = this.runNpmCommandSync(["root", "-g"]);
1507
- this.globalNpmRoot = result.trim();
1694
+ if (this.getPackageManagerName() === "bun") {
1695
+ const binDir = this.runNpmCommandSync(["pm", "bin", "-g"]).trim();
1696
+ this.globalNpmRoot = join(dirname(binDir), "install", "global", "node_modules");
1697
+ }
1698
+ else {
1699
+ this.globalNpmRoot = this.runNpmCommandSync(["root", "-g"]).trim();
1700
+ }
1508
1701
  this.globalNpmRootCommandKey = commandKey;
1509
1702
  return this.globalNpmRoot;
1510
1703
  }
1511
- getNpmInstallPath(source, scope) {
1704
+ getPnpmGlobalPackagePath(packageName) {
1705
+ if (this.getPackageManagerName() !== "pnpm") {
1706
+ return undefined;
1707
+ }
1708
+ const output = this.runNpmCommandSync(["list", "-g", "--depth", "0", "--json"]);
1709
+ const entries = JSON.parse(output);
1710
+ for (const entry of entries) {
1711
+ const path = entry.dependencies?.[packageName]?.path;
1712
+ if (path)
1713
+ return path;
1714
+ }
1715
+ return undefined;
1716
+ }
1717
+ getManagedNpmInstallPath(source, scope) {
1512
1718
  if (scope === "temporary") {
1513
1719
  return join(this.getTemporaryDir("npm"), "node_modules", source.name);
1514
1720
  }
1515
1721
  if (scope === "project") {
1722
+ this.assertProjectTrustedForScope(scope);
1516
1723
  return join(this.cwd, CONFIG_DIR_NAME, "npm", "node_modules", source.name);
1517
1724
  }
1518
- return join(this.getGlobalNpmRoot(), source.name);
1725
+ return join(this.cacheDir, "npm", "node_modules", source.name);
1726
+ }
1727
+ getLegacyGlobalNpmInstallPath(source) {
1728
+ try {
1729
+ return this.getPnpmGlobalPackagePath(source.name) ?? join(this.getGlobalNpmRoot(), source.name);
1730
+ }
1731
+ catch {
1732
+ return undefined;
1733
+ }
1734
+ }
1735
+ getNpmInstallPath(source, scope) {
1736
+ const managedPath = this.getManagedNpmInstallPath(source, scope);
1737
+ if (scope !== "user" || existsSync(managedPath)) {
1738
+ return managedPath;
1739
+ }
1740
+ const legacyPath = this.getLegacyGlobalNpmInstallPath(source);
1741
+ return legacyPath && existsSync(legacyPath) ? legacyPath : managedPath;
1519
1742
  }
1520
1743
  getGitInstallPath(source, scope) {
1521
1744
  if (scope === "temporary") {
1522
1745
  return this.getTemporaryDir(`git-${source.host}`, source.path);
1523
1746
  }
1524
- if (scope === "project") {
1525
- return join(this.cwd, CONFIG_DIR_NAME, "git", source.host, source.path);
1747
+ const installRoot = this.getGitInstallRoot(scope);
1748
+ if (!installRoot) {
1749
+ throw new Error("Missing git install root");
1526
1750
  }
1527
- return join(this.agentDir, "git", source.host, source.path);
1751
+ return this.resolveManagedPath(installRoot, source.host, source.path);
1528
1752
  }
1529
1753
  getGitInstallRoot(scope) {
1530
1754
  if (scope === "temporary") {
1531
1755
  return undefined;
1532
1756
  }
1533
1757
  if (scope === "project") {
1758
+ this.assertProjectTrustedForScope(scope);
1534
1759
  return join(this.cwd, CONFIG_DIR_NAME, "git");
1535
1760
  }
1536
- return join(this.agentDir, "git");
1761
+ return join(this.cacheDir, "git");
1537
1762
  }
1538
1763
  getTemporaryDir(prefix, suffix) {
1764
+ const root = this.resolveManagedPath(getExtensionTempFolder(this.cacheDir), prefix);
1539
1765
  const hash = createHash("sha256")
1540
1766
  .update(`${prefix}-${suffix ?? ""}`)
1541
1767
  .digest("hex")
1542
1768
  .slice(0, 8);
1543
- return join(tmpdir(), "pi-extensions", prefix, hash, suffix ?? "");
1769
+ return this.resolveManagedPath(root, hash, suffix ?? "");
1770
+ }
1771
+ resolveManagedPath(root, ...parts) {
1772
+ const resolvedRoot = resolve(root);
1773
+ const resolvedPath = resolve(resolvedRoot, ...parts);
1774
+ if (resolvedPath !== resolvedRoot && !resolvedPath.startsWith(`${resolvedRoot}${sep}`)) {
1775
+ throw new Error(`Refusing to use path outside package install root: ${resolvedPath}`);
1776
+ }
1777
+ return resolvedPath;
1544
1778
  }
1545
1779
  getBaseDirForScope(scope) {
1546
1780
  if (scope === "project") {
1781
+ this.assertProjectTrustedForScope(scope);
1547
1782
  return join(this.cwd, CONFIG_DIR_NAME);
1548
1783
  }
1549
1784
  if (scope === "user") {
@@ -1552,31 +1787,20 @@ export class DefaultPackageManager {
1552
1787
  return this.cwd;
1553
1788
  }
1554
1789
  resolvePath(input) {
1555
- const trimmed = input.trim();
1556
- if (trimmed === "~")
1557
- return getHomeDir();
1558
- if (trimmed.startsWith("~/"))
1559
- return join(getHomeDir(), trimmed.slice(2));
1560
- if (trimmed.startsWith("~"))
1561
- return join(getHomeDir(), trimmed.slice(1));
1562
- return resolve(this.cwd, trimmed);
1790
+ return resolvePath(input, this.cwd, { homeDir: getHomeDir(), trim: true });
1563
1791
  }
1564
1792
  resolvePathFromBase(input, baseDir) {
1565
- const trimmed = input.trim();
1566
- if (trimmed === "~")
1567
- return getHomeDir();
1568
- if (trimmed.startsWith("~/"))
1569
- return join(getHomeDir(), trimmed.slice(2));
1570
- if (trimmed.startsWith("~"))
1571
- return join(getHomeDir(), trimmed.slice(1));
1572
- return resolve(baseDir, trimmed);
1793
+ return resolvePath(input, baseDir, { homeDir: getHomeDir(), trim: true });
1573
1794
  }
1574
1795
  collectPackageResources(packageRoot, accumulator, filter, metadata) {
1575
1796
  if (filter) {
1576
1797
  for (const resourceType of RESOURCE_TYPES) {
1577
1798
  const patterns = filter[resourceType];
1578
1799
  const target = this.getTargetMap(accumulator, resourceType);
1579
- if (patterns !== undefined) {
1800
+ if (filter.autoload === false) {
1801
+ this.applyPackageDeltaFilter(packageRoot, patterns ?? [], resourceType, target, metadata);
1802
+ }
1803
+ else if (patterns !== undefined) {
1580
1804
  this.applyPackageFilter(packageRoot, patterns, resourceType, target, metadata);
1581
1805
  }
1582
1806
  else {
@@ -1585,7 +1809,7 @@ export class DefaultPackageManager {
1585
1809
  }
1586
1810
  return true;
1587
1811
  }
1588
- const manifest = this.readPiManifest(packageRoot);
1812
+ const manifest = readPiManifest(join(packageRoot, "package.json"));
1589
1813
  if (manifest) {
1590
1814
  for (const resourceType of RESOURCE_TYPES) {
1591
1815
  const entries = manifest[resourceType];
@@ -1608,7 +1832,7 @@ export class DefaultPackageManager {
1608
1832
  return hasAnyDir;
1609
1833
  }
1610
1834
  collectDefaultResources(packageRoot, resourceType, target, metadata) {
1611
- const manifest = this.readPiManifest(packageRoot);
1835
+ const manifest = readPiManifest(join(packageRoot, "package.json"));
1612
1836
  const entries = manifest?.[resourceType];
1613
1837
  if (entries) {
1614
1838
  this.addManifestEntries(entries, packageRoot, resourceType, target, metadata);
@@ -1639,13 +1863,23 @@ export class DefaultPackageManager {
1639
1863
  this.addResource(target, f, metadata, enabled);
1640
1864
  }
1641
1865
  }
1866
+ applyPackageDeltaFilter(packageRoot, userPatterns, resourceType, target, metadata) {
1867
+ if (userPatterns.length === 0) {
1868
+ return;
1869
+ }
1870
+ const { allFiles } = this.collectManifestFiles(packageRoot, resourceType);
1871
+ const enabledByUser = applyAutoloadDisabledPatterns(allFiles, userPatterns, packageRoot);
1872
+ for (const [filePath, enabled] of enabledByUser) {
1873
+ this.addResource(target, filePath, metadata, enabled);
1874
+ }
1875
+ }
1642
1876
  /**
1643
1877
  * Collect all files from a package for a resource type, applying manifest patterns.
1644
1878
  * Returns { allFiles, enabledByManifest } where enabledByManifest is the set of files
1645
1879
  * that pass the manifest's own patterns.
1646
1880
  */
1647
1881
  collectManifestFiles(packageRoot, resourceType) {
1648
- const manifest = this.readPiManifest(packageRoot);
1882
+ const manifest = readPiManifest(join(packageRoot, "package.json"));
1649
1883
  const entries = manifest?.[resourceType];
1650
1884
  if (entries && entries.length > 0) {
1651
1885
  const allFiles = this.collectFilesFromManifestEntries(entries, packageRoot, resourceType);
@@ -1660,20 +1894,6 @@ export class DefaultPackageManager {
1660
1894
  const allFiles = collectResourceFiles(conventionDir, resourceType);
1661
1895
  return { allFiles, enabledByManifest: new Set(allFiles) };
1662
1896
  }
1663
- readPiManifest(packageRoot) {
1664
- const packageJsonPath = join(packageRoot, "package.json");
1665
- if (!existsSync(packageJsonPath)) {
1666
- return null;
1667
- }
1668
- try {
1669
- const content = readFileSync(packageJsonPath, "utf-8");
1670
- const pkg = JSON.parse(content);
1671
- return pkg.pi ?? null;
1672
- }
1673
- catch {
1674
- return null;
1675
- }
1676
- }
1677
1897
  addManifestEntries(entries, root, resourceType, target, metadata) {
1678
1898
  if (!entries)
1679
1899
  return;
@@ -1753,7 +1973,10 @@ export class DefaultPackageManager {
1753
1973
  themes: join(projectBaseDir, "themes"),
1754
1974
  };
1755
1975
  const userAgentsSkillsDir = join(getHomeDir(), ".agents", "skills");
1756
- const projectAgentsSkillDirs = collectAncestorAgentsSkillDirs(this.cwd).filter((dir) => resolve(dir) !== resolve(userAgentsSkillsDir));
1976
+ const projectTrusted = this.settingsManager.isProjectTrusted();
1977
+ const projectAgentsSkillDirs = projectTrusted
1978
+ ? collectAncestorAgentsSkillDirs(this.cwd).filter((dir) => resolve(dir) !== resolve(userAgentsSkillsDir))
1979
+ : [];
1757
1980
  const addResources = (resourceType, paths, metadata, overrides, baseDir) => {
1758
1981
  const target = this.getTargetMap(accumulator, resourceType);
1759
1982
  for (const path of paths) {
@@ -1761,15 +1984,36 @@ export class DefaultPackageManager {
1761
1984
  this.addResource(target, path, metadata, enabled);
1762
1985
  }
1763
1986
  };
1764
- addResources("extensions", collectAutoExtensionEntries(projectDirs.extensions), projectMetadata, projectOverrides.extensions, projectBaseDir);
1765
- addResources("skills", [
1766
- ...collectAutoSkillEntries(projectDirs.skills, "pi"),
1767
- ...projectAgentsSkillDirs.flatMap((dir) => collectAutoSkillEntries(dir, "agents")),
1768
- ], projectMetadata, projectOverrides.skills, projectBaseDir);
1769
- addResources("prompts", collectAutoPromptEntries(projectDirs.prompts), projectMetadata, projectOverrides.prompts, projectBaseDir);
1770
- addResources("themes", collectAutoThemeEntries(projectDirs.themes), projectMetadata, projectOverrides.themes, projectBaseDir);
1987
+ if (projectTrusted) {
1988
+ // Project extensions from .mcpi/
1989
+ addResources("extensions", collectAutoExtensionEntries(projectDirs.extensions), projectMetadata, projectOverrides.extensions, projectBaseDir);
1990
+ // Project skills from .mcpi/
1991
+ addResources("skills", collectAutoSkillEntries(projectDirs.skills, "mcpi"), projectMetadata, projectOverrides.skills, projectBaseDir);
1992
+ }
1993
+ // Project skills from .agents/ (each with its own baseDir)
1994
+ for (const agentsSkillsDir of projectAgentsSkillDirs) {
1995
+ const agentsBaseDir = dirname(agentsSkillsDir); // the .agents directory
1996
+ const agentsMetadata = {
1997
+ ...projectMetadata,
1998
+ baseDir: agentsBaseDir,
1999
+ };
2000
+ addResources("skills", collectAutoSkillEntries(agentsSkillsDir, "agents"), agentsMetadata, projectOverrides.skills, agentsBaseDir);
2001
+ }
2002
+ if (projectTrusted) {
2003
+ addResources("prompts", collectAutoPromptEntries(projectDirs.prompts), projectMetadata, projectOverrides.prompts, projectBaseDir);
2004
+ addResources("themes", collectAutoThemeEntries(projectDirs.themes), projectMetadata, projectOverrides.themes, projectBaseDir);
2005
+ }
2006
+ // User extensions from the mcpi config directory
1771
2007
  addResources("extensions", collectAutoExtensionEntries(userDirs.extensions), userMetadata, userOverrides.extensions, globalBaseDir);
1772
- addResources("skills", [...collectAutoSkillEntries(userDirs.skills, "pi"), ...collectAutoSkillEntries(userAgentsSkillsDir, "agents")], userMetadata, userOverrides.skills, globalBaseDir);
2008
+ // User skills from the mcpi config directory
2009
+ addResources("skills", collectAutoSkillEntries(userDirs.skills, "mcpi"), userMetadata, userOverrides.skills, globalBaseDir);
2010
+ // User skills from ~/.agents/ (with its own baseDir)
2011
+ const userAgentsBaseDir = dirname(userAgentsSkillsDir);
2012
+ const userAgentsMetadata = {
2013
+ ...userMetadata,
2014
+ baseDir: userAgentsBaseDir,
2015
+ };
2016
+ addResources("skills", collectAutoSkillEntries(userAgentsSkillsDir, "agents"), userAgentsMetadata, userOverrides.skills, userAgentsBaseDir);
1773
2017
  addResources("prompts", collectAutoPromptEntries(userDirs.prompts), userMetadata, userOverrides.prompts, globalBaseDir);
1774
2018
  addResources("themes", collectAutoThemeEntries(userDirs.themes), userMetadata, userOverrides.themes, globalBaseDir);
1775
2019
  }
@@ -1823,52 +2067,44 @@ export class DefaultPackageManager {
1823
2067
  };
1824
2068
  }
1825
2069
  toResolvedPaths(accumulator) {
1826
- const toResolved = (entries) => {
2070
+ const mapToResolved = (entries) => {
1827
2071
  const resolved = Array.from(entries.entries()).map(([path, { metadata, enabled }]) => ({
1828
2072
  path,
1829
2073
  enabled,
1830
2074
  metadata,
1831
2075
  }));
1832
2076
  resolved.sort((a, b) => resourcePrecedenceRank(a.metadata) - resourcePrecedenceRank(b.metadata));
1833
- return resolved;
2077
+ const seen = new Set();
2078
+ return resolved.filter((entry) => {
2079
+ const canonicalPath = canonicalizePath(entry.path);
2080
+ if (seen.has(canonicalPath))
2081
+ return false;
2082
+ seen.add(canonicalPath);
2083
+ return true;
2084
+ });
1834
2085
  };
1835
- const seenCanonicalSkillPaths = new Set();
1836
- const resolvedSkills = toResolved(accumulator.skills).filter((entry) => {
1837
- let canonicalPath;
1838
- try {
1839
- // Resolve symlink aliases to detect duplicate files.
1840
- canonicalPath = realpathSync(entry.path);
1841
- }
1842
- catch {
1843
- // Fallback to raw path to match loadSkills() behavior.
1844
- canonicalPath = entry.path;
1845
- }
1846
- if (seenCanonicalSkillPaths.has(canonicalPath)) {
1847
- return false;
1848
- }
1849
- seenCanonicalSkillPaths.add(canonicalPath);
1850
- return true;
1851
- });
1852
2086
  return {
1853
- extensions: toResolved(accumulator.extensions),
1854
- skills: resolvedSkills,
1855
- prompts: toResolved(accumulator.prompts),
1856
- themes: toResolved(accumulator.themes),
2087
+ extensions: mapToResolved(accumulator.extensions),
2088
+ skills: mapToResolved(accumulator.skills),
2089
+ prompts: mapToResolved(accumulator.prompts),
2090
+ themes: mapToResolved(accumulator.themes),
1857
2091
  };
1858
2092
  }
1859
2093
  spawnCommand(command, args, options) {
1860
- return spawn(command, args, {
2094
+ const env = getEnv();
2095
+ return spawnProcess(command, args, {
1861
2096
  cwd: options?.cwd,
1862
2097
  stdio: isStdoutTakenOver() ? ["ignore", 2, 2] : "inherit",
1863
- shell: process.platform === "win32",
2098
+ env,
1864
2099
  });
1865
2100
  }
1866
2101
  spawnCaptureCommand(command, args, options) {
1867
- return spawn(command, args, {
2102
+ const baseEnv = getEnv();
2103
+ const env = options?.env ? { ...baseEnv, ...options.env } : baseEnv;
2104
+ return spawnProcess(command, args, {
1868
2105
  cwd: options?.cwd,
1869
2106
  stdio: ["ignore", "pipe", "pipe"],
1870
- shell: process.platform === "win32",
1871
- env: options?.env ? { ...process.env, ...options.env } : process.env,
2107
+ env,
1872
2108
  });
1873
2109
  }
1874
2110
  runCommandCapture(command, args, options) {
@@ -1925,13 +2161,14 @@ export class DefaultPackageManager {
1925
2161
  });
1926
2162
  }
1927
2163
  runCommandSync(command, args) {
1928
- const result = spawnSync(command, args, {
2164
+ const env = getEnv();
2165
+ const result = spawnProcessSync(command, args, {
1929
2166
  stdio: ["ignore", "pipe", "pipe"],
1930
2167
  encoding: "utf-8",
1931
- shell: process.platform === "win32",
2168
+ env,
1932
2169
  });
1933
- if (result.status !== 0) {
1934
- throw new Error(`Failed to run ${command} ${args.join(" ")}: ${result.stderr || result.stdout}`);
2170
+ if (result.error || result.status !== 0) {
2171
+ throw new Error(`Failed to run ${command} ${args.join(" ")}: ${result.error?.message || result.stderr || result.stdout}`);
1935
2172
  }
1936
2173
  return (result.stdout || result.stderr || "").trim();
1937
2174
  }