@earendil-works/pi-coding-agent 0.82.1 → 0.84.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 (311) hide show
  1. package/CHANGELOG.md +243 -0
  2. package/README.md +6 -1
  3. package/dist/cli/args.d.ts +2 -0
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +27 -1
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/config-selector.d.ts.map +1 -1
  8. package/dist/cli/config-selector.js +2 -2
  9. package/dist/cli/config-selector.js.map +1 -1
  10. package/dist/cli/credential-print.d.ts +23 -0
  11. package/dist/cli/credential-print.d.ts.map +1 -0
  12. package/dist/cli/credential-print.js +117 -0
  13. package/dist/cli/credential-print.js.map +1 -0
  14. package/dist/cli/experimental/auth.d.ts +16 -0
  15. package/dist/cli/experimental/auth.d.ts.map +1 -0
  16. package/dist/cli/experimental/auth.js +13 -0
  17. package/dist/cli/experimental/auth.js.map +1 -0
  18. package/dist/cli/experimental/cli.d.ts +6 -0
  19. package/dist/cli/experimental/cli.d.ts.map +1 -0
  20. package/dist/cli/experimental/cli.js +5 -0
  21. package/dist/cli/experimental/cli.js.map +1 -0
  22. package/dist/cli/experimental/command-options.d.ts +17 -0
  23. package/dist/cli/experimental/command-options.d.ts.map +1 -0
  24. package/dist/cli/experimental/command-options.js +35 -0
  25. package/dist/cli/experimental/command-options.js.map +1 -0
  26. package/dist/cli/experimental/command.d.ts +63 -0
  27. package/dist/cli/experimental/command.d.ts.map +1 -0
  28. package/dist/cli/experimental/command.js +130 -0
  29. package/dist/cli/experimental/command.js.map +1 -0
  30. package/dist/cli/experimental/commands/client.d.ts +13 -0
  31. package/dist/cli/experimental/commands/client.d.ts.map +1 -0
  32. package/dist/cli/experimental/commands/client.js +25 -0
  33. package/dist/cli/experimental/commands/client.js.map +1 -0
  34. package/dist/cli/experimental/commands/pi.d.ts +15 -0
  35. package/dist/cli/experimental/commands/pi.d.ts.map +1 -0
  36. package/dist/cli/experimental/commands/pi.js +28 -0
  37. package/dist/cli/experimental/commands/pi.js.map +1 -0
  38. package/dist/cli/experimental/commands/server.d.ts +13 -0
  39. package/dist/cli/experimental/commands/server.d.ts.map +1 -0
  40. package/dist/cli/experimental/commands/server.js +25 -0
  41. package/dist/cli/experimental/commands/server.js.map +1 -0
  42. package/dist/cli/experimental/transport-address.d.ts +10 -0
  43. package/dist/cli/experimental/transport-address.d.ts.map +1 -0
  44. package/dist/cli/experimental/transport-address.js +38 -0
  45. package/dist/cli/experimental/transport-address.js.map +1 -0
  46. package/dist/cli/list-models.d.ts +1 -1
  47. package/dist/cli/list-models.d.ts.map +1 -1
  48. package/dist/cli/list-models.js +2 -2
  49. package/dist/cli/list-models.js.map +1 -1
  50. package/dist/cli/startup-ui.d.ts +1 -1
  51. package/dist/cli/startup-ui.d.ts.map +1 -1
  52. package/dist/cli/startup-ui.js +2 -2
  53. package/dist/cli/startup-ui.js.map +1 -1
  54. package/dist/cli.d.ts.map +1 -1
  55. package/dist/cli.js +1 -0
  56. package/dist/cli.js.map +1 -1
  57. package/dist/client/index.d.ts +3 -0
  58. package/dist/client/index.d.ts.map +1 -0
  59. package/dist/client/index.js +3 -0
  60. package/dist/client/index.js.map +1 -0
  61. package/dist/client/remote-session.d.ts +53 -0
  62. package/dist/client/remote-session.d.ts.map +1 -0
  63. package/dist/client/remote-session.js +340 -0
  64. package/dist/client/remote-session.js.map +1 -0
  65. package/dist/client/transcript.d.ts +12 -0
  66. package/dist/client/transcript.d.ts.map +1 -0
  67. package/dist/client/transcript.js +98 -0
  68. package/dist/client/transcript.js.map +1 -0
  69. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  70. package/dist/core/agent-session-runtime.js +3 -0
  71. package/dist/core/agent-session-runtime.js.map +1 -1
  72. package/dist/core/agent-session-services.d.ts +1 -0
  73. package/dist/core/agent-session-services.d.ts.map +1 -1
  74. package/dist/core/agent-session-services.js +1 -0
  75. package/dist/core/agent-session-services.js.map +1 -1
  76. package/dist/core/agent-session.d.ts +2 -11
  77. package/dist/core/agent-session.d.ts.map +1 -1
  78. package/dist/core/agent-session.js +85 -76
  79. package/dist/core/agent-session.js.map +1 -1
  80. package/dist/core/auth-storage.d.ts +15 -9
  81. package/dist/core/auth-storage.d.ts.map +1 -1
  82. package/dist/core/auth-storage.js +159 -38
  83. package/dist/core/auth-storage.js.map +1 -1
  84. package/dist/core/extensions/index.d.ts +1 -1
  85. package/dist/core/extensions/index.d.ts.map +1 -1
  86. package/dist/core/extensions/index.js.map +1 -1
  87. package/dist/core/extensions/loader.d.ts.map +1 -1
  88. package/dist/core/extensions/loader.js +43 -20
  89. package/dist/core/extensions/loader.js.map +1 -1
  90. package/dist/core/extensions/runner.d.ts +3 -1
  91. package/dist/core/extensions/runner.d.ts.map +1 -1
  92. package/dist/core/extensions/runner.js +10 -0
  93. package/dist/core/extensions/runner.js.map +1 -1
  94. package/dist/core/extensions/types.d.ts +28 -3
  95. package/dist/core/extensions/types.d.ts.map +1 -1
  96. package/dist/core/extensions/types.js.map +1 -1
  97. package/dist/core/footer-data-provider.d.ts +10 -0
  98. package/dist/core/footer-data-provider.d.ts.map +1 -1
  99. package/dist/core/footer-data-provider.js +1 -1
  100. package/dist/core/footer-data-provider.js.map +1 -1
  101. package/dist/core/http-dispatcher.d.ts.map +1 -1
  102. package/dist/core/http-dispatcher.js +5 -0
  103. package/dist/core/http-dispatcher.js.map +1 -1
  104. package/dist/core/keybindings.d.ts +36 -4
  105. package/dist/core/keybindings.d.ts.map +1 -1
  106. package/dist/core/model-config.d.ts +29 -5
  107. package/dist/core/model-config.d.ts.map +1 -1
  108. package/dist/core/model-config.js +4 -0
  109. package/dist/core/model-config.js.map +1 -1
  110. package/dist/core/model-registry.d.ts +5 -3
  111. package/dist/core/model-registry.d.ts.map +1 -1
  112. package/dist/core/model-registry.js +13 -10
  113. package/dist/core/model-registry.js.map +1 -1
  114. package/dist/core/model-resolver.d.ts +4 -3
  115. package/dist/core/model-resolver.d.ts.map +1 -1
  116. package/dist/core/model-resolver.js +41 -10
  117. package/dist/core/model-resolver.js.map +1 -1
  118. package/dist/core/model-runtime.d.ts +30 -13
  119. package/dist/core/model-runtime.d.ts.map +1 -1
  120. package/dist/core/model-runtime.js +231 -73
  121. package/dist/core/model-runtime.js.map +1 -1
  122. package/dist/core/models-store.d.ts +12 -7
  123. package/dist/core/models-store.d.ts.map +1 -1
  124. package/dist/core/models-store.js +83 -14
  125. package/dist/core/models-store.js.map +1 -1
  126. package/dist/core/package-manager.d.ts +4 -1
  127. package/dist/core/package-manager.d.ts.map +1 -1
  128. package/dist/core/package-manager.js +76 -42
  129. package/dist/core/package-manager.js.map +1 -1
  130. package/dist/core/pi-manifest.d.ts +8 -0
  131. package/dist/core/pi-manifest.d.ts.map +1 -0
  132. package/dist/core/pi-manifest.js +25 -0
  133. package/dist/core/pi-manifest.js.map +1 -0
  134. package/dist/core/provider-composer.d.ts +4 -1
  135. package/dist/core/provider-composer.d.ts.map +1 -1
  136. package/dist/core/provider-composer.js +36 -15
  137. package/dist/core/provider-composer.js.map +1 -1
  138. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  139. package/dist/core/remote-catalog-provider.js +73 -67
  140. package/dist/core/remote-catalog-provider.js.map +1 -1
  141. package/dist/core/resource-loader.d.ts +15 -0
  142. package/dist/core/resource-loader.d.ts.map +1 -1
  143. package/dist/core/resource-loader.js +64 -10
  144. package/dist/core/resource-loader.js.map +1 -1
  145. package/dist/core/runtime-credentials.d.ts +5 -5
  146. package/dist/core/runtime-credentials.d.ts.map +1 -1
  147. package/dist/core/runtime-credentials.js +11 -8
  148. package/dist/core/runtime-credentials.js.map +1 -1
  149. package/dist/core/session-manager.d.ts.map +1 -1
  150. package/dist/core/session-manager.js +3 -1
  151. package/dist/core/session-manager.js.map +1 -1
  152. package/dist/core/settings-manager.d.ts +12 -0
  153. package/dist/core/settings-manager.d.ts.map +1 -1
  154. package/dist/core/settings-manager.js +40 -16
  155. package/dist/core/settings-manager.js.map +1 -1
  156. package/dist/core/tools/find.d.ts +3 -0
  157. package/dist/core/tools/find.d.ts.map +1 -1
  158. package/dist/core/tools/find.js +11 -18
  159. package/dist/core/tools/find.js.map +1 -1
  160. package/dist/core/tools/read.d.ts.map +1 -1
  161. package/dist/core/tools/read.js +1 -1
  162. package/dist/core/tools/read.js.map +1 -1
  163. package/dist/extensions/llama/index.d.ts.map +1 -1
  164. package/dist/extensions/llama/index.js +11 -2
  165. package/dist/extensions/llama/index.js.map +1 -1
  166. package/dist/extensions/llama/provider.d.ts.map +1 -1
  167. package/dist/extensions/llama/provider.js +22 -8
  168. package/dist/extensions/llama/provider.js.map +1 -1
  169. package/dist/index.d.ts +4 -4
  170. package/dist/index.d.ts.map +1 -1
  171. package/dist/index.js +1 -1
  172. package/dist/index.js.map +1 -1
  173. package/dist/main.d.ts.map +1 -1
  174. package/dist/main.js +57 -5
  175. package/dist/main.js.map +1 -1
  176. package/dist/modes/index.d.ts +1 -0
  177. package/dist/modes/index.d.ts.map +1 -1
  178. package/dist/modes/index.js.map +1 -1
  179. package/dist/modes/interactive/components/assistant-message.d.ts +5 -2
  180. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  181. package/dist/modes/interactive/components/assistant-message.js +13 -4
  182. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  183. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  184. package/dist/modes/interactive/components/custom-editor.js +7 -0
  185. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  186. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  187. package/dist/modes/interactive/components/footer.js +1 -1
  188. package/dist/modes/interactive/components/footer.js.map +1 -1
  189. package/dist/modes/interactive/components/markdown-transform.d.ts +3 -0
  190. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -0
  191. package/dist/modes/interactive/components/markdown-transform.js +19 -0
  192. package/dist/modes/interactive/components/markdown-transform.js.map +1 -0
  193. package/dist/modes/interactive/components/mermaid.d.ts +11 -0
  194. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -0
  195. package/dist/modes/interactive/components/mermaid.js +75 -0
  196. package/dist/modes/interactive/components/mermaid.js.map +1 -0
  197. package/dist/modes/interactive/components/model-selector.d.ts +1 -1
  198. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  199. package/dist/modes/interactive/components/model-selector.js +20 -5
  200. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  201. package/dist/modes/interactive/components/scoped-models-selector.d.ts +4 -0
  202. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  203. package/dist/modes/interactive/components/scoped-models-selector.js +26 -0
  204. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  205. package/dist/modes/interactive/components/settings-selector.d.ts +8 -2
  206. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  207. package/dist/modes/interactive/components/settings-selector.js +30 -0
  208. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  209. package/dist/modes/interactive/components/user-message.d.ts +3 -1
  210. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  211. package/dist/modes/interactive/components/user-message.js +9 -2
  212. package/dist/modes/interactive/components/user-message.js.map +1 -1
  213. package/dist/modes/interactive/interactive-mode.d.ts +33 -2
  214. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  215. package/dist/modes/interactive/interactive-mode.js +443 -144
  216. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  217. package/dist/modes/interactive/theme/dark.json +1 -0
  218. package/dist/modes/interactive/theme/light.json +1 -0
  219. package/dist/modes/interactive/theme/theme-controller.d.ts +3 -0
  220. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  221. package/dist/modes/interactive/theme/theme-controller.js +10 -1
  222. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  223. package/dist/modes/interactive/theme/theme-schema.json +5 -1
  224. package/dist/modes/interactive/theme/theme.d.ts +2 -2
  225. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  226. package/dist/modes/interactive/theme/theme.js +13 -3
  227. package/dist/modes/interactive/theme/theme.js.map +1 -1
  228. package/dist/modes/json-event.d.ts +28 -0
  229. package/dist/modes/json-event.d.ts.map +1 -0
  230. package/dist/modes/json-event.js +12 -0
  231. package/dist/modes/json-event.js.map +1 -0
  232. package/dist/modes/print-mode.d.ts.map +1 -1
  233. package/dist/modes/print-mode.js +12 -2
  234. package/dist/modes/print-mode.js.map +1 -1
  235. package/dist/modes/rpc/rpc-client.d.ts +5 -4
  236. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  237. package/dist/modes/rpc/rpc-client.js.map +1 -1
  238. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  239. package/dist/modes/rpc/rpc-mode.js +17 -3
  240. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  241. package/dist/package-manager-cli.d.ts.map +1 -1
  242. package/dist/package-manager-cli.js +11 -9
  243. package/dist/package-manager-cli.js.map +1 -1
  244. package/dist/rpc-entry.d.ts.map +1 -1
  245. package/dist/rpc-entry.js +1 -0
  246. package/dist/rpc-entry.js.map +1 -1
  247. package/dist/utils/abort.d.ts +5 -0
  248. package/dist/utils/abort.d.ts.map +1 -0
  249. package/dist/utils/abort.js +48 -0
  250. package/dist/utils/abort.js.map +1 -0
  251. package/dist/utils/clipboard.d.ts +1 -1
  252. package/dist/utils/clipboard.d.ts.map +1 -1
  253. package/dist/utils/clipboard.js +22 -2
  254. package/dist/utils/clipboard.js.map +1 -1
  255. package/dist/utils/management-http.d.ts +23 -0
  256. package/dist/utils/management-http.d.ts.map +1 -0
  257. package/dist/utils/management-http.js +50 -0
  258. package/dist/utils/management-http.js.map +1 -0
  259. package/dist/utils/paths.d.ts +3 -0
  260. package/dist/utils/paths.d.ts.map +1 -1
  261. package/dist/utils/paths.js +23 -1
  262. package/dist/utils/paths.js.map +1 -1
  263. package/dist/utils/tool-result-images.d.ts +19 -0
  264. package/dist/utils/tool-result-images.d.ts.map +1 -0
  265. package/dist/utils/tool-result-images.js +45 -0
  266. package/dist/utils/tool-result-images.js.map +1 -0
  267. package/dist/utils/tools-manager.d.ts.map +1 -1
  268. package/dist/utils/tools-manager.js +4 -6
  269. package/dist/utils/tools-manager.js.map +1 -1
  270. package/dist/utils/version-check.d.ts +4 -0
  271. package/dist/utils/version-check.d.ts.map +1 -1
  272. package/dist/utils/version-check.js +20 -2
  273. package/dist/utils/version-check.js.map +1 -1
  274. package/docs/compaction.md +2 -2
  275. package/docs/custom-provider.md +16 -8
  276. package/docs/extensions.md +30 -4
  277. package/docs/json.md +19 -14
  278. package/docs/keybindings.md +38 -10
  279. package/docs/models.md +24 -3
  280. package/docs/providers.md +2 -0
  281. package/docs/quickstart.md +2 -0
  282. package/docs/rpc.md +13 -11
  283. package/docs/sdk.md +21 -2
  284. package/docs/security.md +1 -1
  285. package/docs/session-format.md +2 -0
  286. package/docs/settings.md +4 -1
  287. package/docs/themes.md +5 -3
  288. package/docs/usage.md +7 -0
  289. package/examples/extensions/custom-compaction.ts +1 -16
  290. package/examples/extensions/custom-provider-anthropic/index.ts +10 -3
  291. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  292. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  293. package/examples/extensions/custom-provider-gitlab-duo/index.ts +2 -1
  294. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  295. package/examples/extensions/doom-overlay/wad-finder.ts +7 -3
  296. package/examples/extensions/gondolin/package-lock.json +2 -2
  297. package/examples/extensions/gondolin/package.json +1 -1
  298. package/examples/extensions/handoff.ts +2 -11
  299. package/examples/extensions/qna.ts +3 -7
  300. package/examples/extensions/sandbox/package-lock.json +2 -2
  301. package/examples/extensions/sandbox/package.json +1 -1
  302. package/examples/extensions/summarize.ts +7 -18
  303. package/examples/extensions/with-deps/package-lock.json +2 -2
  304. package/examples/extensions/with-deps/package.json +1 -1
  305. package/examples/rpc-extension-ui.ts +11 -2
  306. package/examples/sdk/02-custom-model.ts +1 -2
  307. package/examples/sdk/09-api-keys-and-oauth.ts +1 -1
  308. package/examples/sdk/12-full-control.ts +3 -1
  309. package/examples/sdk/README.md +1 -1
  310. package/npm-shrinkwrap.json +70 -26
  311. package/package.json +14 -7
@@ -30,6 +30,7 @@ import { spawnProcess, spawnProcessSync } from "../utils/child-process.js";
30
30
  import { parseGitUrl } from "../utils/git.js";
31
31
  import { canonicalizePath, isLocalPath, markPathIgnoredByCloudSync, resolvePath } from "../utils/paths.js";
32
32
  import { isStdoutTakenOver } from "./output-guard.js";
33
+ import { readPiManifest } from "./pi-manifest.js";
33
34
  const NETWORK_TIMEOUT_MS = 10000;
34
35
  const UPDATE_CHECK_CONCURRENCY = 4;
35
36
  const GIT_UPDATE_CONCURRENCY = 4;
@@ -360,20 +361,10 @@ function collectAutoThemeEntries(dir) {
360
361
  }
361
362
  return entries;
362
363
  }
363
- function readPiManifestFile(packageJsonPath) {
364
- try {
365
- const content = readFileSync(packageJsonPath, "utf-8");
366
- const pkg = JSON.parse(content);
367
- return pkg.pi ?? null;
368
- }
369
- catch {
370
- return null;
371
- }
372
- }
373
364
  function resolveExtensionEntries(dir) {
374
365
  const packageJsonPath = join(dir, "package.json");
375
366
  if (existsSync(packageJsonPath)) {
376
- const manifest = readPiManifestFile(packageJsonPath);
367
+ const manifest = readPiManifest(packageJsonPath);
377
368
  if (manifest?.extensions?.length) {
378
369
  const entries = [];
379
370
  for (const extPath of manifest.extensions) {
@@ -1511,13 +1502,21 @@ export class DefaultPackageManager {
1511
1502
  this.ensureGitIgnore(gitRoot);
1512
1503
  }
1513
1504
  mkdirSync(dirname(targetDir), { recursive: true });
1514
- await this.runCommand("git", ["clone", source.repo, targetDir]);
1515
- if (source.ref) {
1516
- await this.runCommand("git", ["checkout", source.ref], { cwd: targetDir });
1505
+ rmSync(this.getGitUpdateMarkerPath(targetDir), { force: true });
1506
+ try {
1507
+ await this.runCommand("git", ["clone", source.repo, targetDir]);
1508
+ if (source.ref) {
1509
+ await this.runCommand("git", ["checkout", source.ref], { cwd: targetDir });
1510
+ }
1511
+ const packageJsonPath = join(targetDir, "package.json");
1512
+ if (existsSync(packageJsonPath)) {
1513
+ await this.runNpmCommand(this.getGitDependencyInstallArgs(), { cwd: targetDir });
1514
+ }
1517
1515
  }
1518
- const packageJsonPath = join(targetDir, "package.json");
1519
- if (existsSync(packageJsonPath)) {
1520
- await this.runNpmCommand(this.getGitDependencyInstallArgs(), { cwd: targetDir });
1516
+ catch (error) {
1517
+ rmSync(targetDir, { recursive: true, force: true });
1518
+ this.pruneEmptyGitParents(targetDir, gitRoot);
1519
+ throw error;
1521
1520
  }
1522
1521
  }
1523
1522
  async updateGit(source, scope) {
@@ -1533,6 +1532,53 @@ export class DefaultPackageManager {
1533
1532
  const target = await this.getLocalGitUpdateTarget(targetDir);
1534
1533
  await this.ensureGitRef(targetDir, target.fetchArgs, target.ref);
1535
1534
  }
1535
+ hasMissingGitDependencies(targetDir) {
1536
+ const packageJsonPath = join(targetDir, "package.json");
1537
+ if (!existsSync(packageJsonPath))
1538
+ return false;
1539
+ try {
1540
+ const manifest = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
1541
+ if (!manifest.dependencies ||
1542
+ typeof manifest.dependencies !== "object" ||
1543
+ Array.isArray(manifest.dependencies)) {
1544
+ return false;
1545
+ }
1546
+ const nodeModulesDir = resolve(targetDir, "node_modules");
1547
+ return Object.keys(manifest.dependencies).some((name) => {
1548
+ const dependencyPath = resolve(nodeModulesDir, name);
1549
+ if (!dependencyPath.startsWith(`${nodeModulesDir}${sep}`))
1550
+ return false;
1551
+ return !existsSync(dependencyPath);
1552
+ });
1553
+ }
1554
+ catch {
1555
+ return false;
1556
+ }
1557
+ }
1558
+ async repairMissingGitDependencies(targetDir) {
1559
+ if (!this.hasMissingGitDependencies(targetDir))
1560
+ return;
1561
+ await this.runNpmCommand(this.getGitDependencyInstallArgs(), { cwd: targetDir });
1562
+ }
1563
+ getGitUpdateMarkerPath(targetDir) {
1564
+ return join(dirname(targetDir), `.${basename(targetDir)}.pi-update-incomplete`);
1565
+ }
1566
+ async cleanAndInstallGitDependencies(targetDir, markerPath) {
1567
+ // Clean untracked files (extensions should be pristine). If this fails after
1568
+ // deleting dependencies, repair them so the existing extension still loads.
1569
+ try {
1570
+ await this.runCommand("git", ["clean", "-fdx"], { cwd: targetDir });
1571
+ }
1572
+ catch (error) {
1573
+ await this.repairMissingGitDependencies(targetDir).catch(() => { });
1574
+ throw error;
1575
+ }
1576
+ const packageJsonPath = join(targetDir, "package.json");
1577
+ if (existsSync(packageJsonPath)) {
1578
+ await this.runNpmCommand(this.getGitDependencyInstallArgs(), { cwd: targetDir });
1579
+ }
1580
+ rmSync(markerPath, { force: true });
1581
+ }
1536
1582
  async ensureGitRef(targetDir, fetchArgs, ref) {
1537
1583
  // Fetch only the ref we will reset to, avoiding unrelated branch/tag noise.
1538
1584
  await this.runCommand("git", fetchArgs, { cwd: targetDir });
@@ -1545,16 +1591,19 @@ export class DefaultPackageManager {
1545
1591
  cwd: targetDir,
1546
1592
  timeoutMs: NETWORK_TIMEOUT_MS,
1547
1593
  });
1594
+ const markerPath = this.getGitUpdateMarkerPath(targetDir);
1548
1595
  if (localHead.trim() === targetHead.trim()) {
1596
+ if (existsSync(markerPath)) {
1597
+ await this.cleanAndInstallGitDependencies(targetDir, markerPath);
1598
+ }
1599
+ else {
1600
+ await this.repairMissingGitDependencies(targetDir);
1601
+ }
1549
1602
  return;
1550
1603
  }
1604
+ writeFileSync(markerPath, "", "utf-8");
1551
1605
  await this.runCommand("git", ["reset", "--hard", commitRef], { cwd: targetDir });
1552
- // Clean untracked files (extensions should be pristine)
1553
- await this.runCommand("git", ["clean", "-fdx"], { cwd: targetDir });
1554
- const packageJsonPath = join(targetDir, "package.json");
1555
- if (existsSync(packageJsonPath)) {
1556
- await this.runNpmCommand(this.getGitDependencyInstallArgs(), { cwd: targetDir });
1557
- }
1606
+ await this.cleanAndInstallGitDependencies(targetDir, markerPath);
1558
1607
  }
1559
1608
  async refreshTemporaryGitSource(source, sourceStr) {
1560
1609
  if (isOfflineModeEnabled()) {
@@ -1571,9 +1620,8 @@ export class DefaultPackageManager {
1571
1620
  }
1572
1621
  async removeGit(source, scope) {
1573
1622
  const targetDir = this.getGitInstallPath(source, scope);
1574
- if (!existsSync(targetDir))
1575
- return;
1576
1623
  rmSync(targetDir, { recursive: true, force: true });
1624
+ rmSync(this.getGitUpdateMarkerPath(targetDir), { force: true });
1577
1625
  this.pruneEmptyGitParents(targetDir, this.getGitInstallRoot(scope));
1578
1626
  }
1579
1627
  pruneEmptyGitParents(targetDir, installRoot) {
@@ -1754,7 +1802,7 @@ export class DefaultPackageManager {
1754
1802
  }
1755
1803
  return true;
1756
1804
  }
1757
- const manifest = this.readPiManifest(packageRoot);
1805
+ const manifest = readPiManifest(join(packageRoot, "package.json"));
1758
1806
  if (manifest) {
1759
1807
  for (const resourceType of RESOURCE_TYPES) {
1760
1808
  const entries = manifest[resourceType];
@@ -1777,7 +1825,7 @@ export class DefaultPackageManager {
1777
1825
  return hasAnyDir;
1778
1826
  }
1779
1827
  collectDefaultResources(packageRoot, resourceType, target, metadata) {
1780
- const manifest = this.readPiManifest(packageRoot);
1828
+ const manifest = readPiManifest(join(packageRoot, "package.json"));
1781
1829
  const entries = manifest?.[resourceType];
1782
1830
  if (entries) {
1783
1831
  this.addManifestEntries(entries, packageRoot, resourceType, target, metadata);
@@ -1824,7 +1872,7 @@ export class DefaultPackageManager {
1824
1872
  * that pass the manifest's own patterns.
1825
1873
  */
1826
1874
  collectManifestFiles(packageRoot, resourceType) {
1827
- const manifest = this.readPiManifest(packageRoot);
1875
+ const manifest = readPiManifest(join(packageRoot, "package.json"));
1828
1876
  const entries = manifest?.[resourceType];
1829
1877
  if (entries && entries.length > 0) {
1830
1878
  const allFiles = this.collectFilesFromManifestEntries(entries, packageRoot, resourceType);
@@ -1839,20 +1887,6 @@ export class DefaultPackageManager {
1839
1887
  const allFiles = collectResourceFiles(conventionDir, resourceType);
1840
1888
  return { allFiles, enabledByManifest: new Set(allFiles) };
1841
1889
  }
1842
- readPiManifest(packageRoot) {
1843
- const packageJsonPath = join(packageRoot, "package.json");
1844
- if (!existsSync(packageJsonPath)) {
1845
- return null;
1846
- }
1847
- try {
1848
- const content = readFileSync(packageJsonPath, "utf-8");
1849
- const pkg = JSON.parse(content);
1850
- return pkg.pi ?? null;
1851
- }
1852
- catch {
1853
- return null;
1854
- }
1855
- }
1856
1890
  addManifestEntries(entries, root, resourceType, target, metadata) {
1857
1891
  if (!entries)
1858
1892
  return;