@earendil-works/pi-coding-agent 0.80.2 → 0.80.5

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 (211) hide show
  1. package/CHANGELOG.md +115 -1
  2. package/README.md +3 -2
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +2 -2
  5. package/dist/cli/args.js.map +1 -1
  6. package/dist/cli/config-selector.d.ts +4 -2
  7. package/dist/cli/config-selector.d.ts.map +1 -1
  8. package/dist/cli/config-selector.js +1 -1
  9. package/dist/cli/config-selector.js.map +1 -1
  10. package/dist/cli/file-processor.d.ts.map +1 -1
  11. package/dist/cli/file-processor.js +13 -25
  12. package/dist/cli/file-processor.js.map +1 -1
  13. package/dist/core/agent-session.d.ts +22 -5
  14. package/dist/core/agent-session.d.ts.map +1 -1
  15. package/dist/core/agent-session.js +133 -50
  16. package/dist/core/agent-session.js.map +1 -1
  17. package/dist/core/auth-storage.d.ts.map +1 -1
  18. package/dist/core/auth-storage.js +13 -5
  19. package/dist/core/auth-storage.js.map +1 -1
  20. package/dist/core/cache-stats.d.ts +49 -0
  21. package/dist/core/cache-stats.d.ts.map +1 -0
  22. package/dist/core/cache-stats.js +101 -0
  23. package/dist/core/cache-stats.js.map +1 -0
  24. package/dist/core/compaction/compaction.d.ts +1 -2
  25. package/dist/core/compaction/compaction.d.ts.map +1 -1
  26. package/dist/core/compaction/compaction.js +56 -81
  27. package/dist/core/compaction/compaction.js.map +1 -1
  28. package/dist/core/extensions/index.d.ts +1 -1
  29. package/dist/core/extensions/index.d.ts.map +1 -1
  30. package/dist/core/extensions/index.js.map +1 -1
  31. package/dist/core/extensions/loader.d.ts.map +1 -1
  32. package/dist/core/extensions/loader.js +10 -0
  33. package/dist/core/extensions/loader.js.map +1 -1
  34. package/dist/core/extensions/runner.d.ts +5 -3
  35. package/dist/core/extensions/runner.d.ts.map +1 -1
  36. package/dist/core/extensions/runner.js +38 -0
  37. package/dist/core/extensions/runner.js.map +1 -1
  38. package/dist/core/extensions/types.d.ts +39 -5
  39. package/dist/core/extensions/types.d.ts.map +1 -1
  40. package/dist/core/extensions/types.js.map +1 -1
  41. package/dist/core/http-dispatcher.d.ts.map +1 -1
  42. package/dist/core/http-dispatcher.js +28 -1
  43. package/dist/core/http-dispatcher.js.map +1 -1
  44. package/dist/core/index.d.ts +1 -1
  45. package/dist/core/index.d.ts.map +1 -1
  46. package/dist/core/index.js.map +1 -1
  47. package/dist/core/keybindings.d.ts.map +1 -1
  48. package/dist/core/keybindings.js +3 -6
  49. package/dist/core/keybindings.js.map +1 -1
  50. package/dist/core/model-registry.d.ts +3 -0
  51. package/dist/core/model-registry.d.ts.map +1 -1
  52. package/dist/core/model-registry.js +16 -2
  53. package/dist/core/model-registry.js.map +1 -1
  54. package/dist/core/model-resolver.d.ts +10 -0
  55. package/dist/core/model-resolver.d.ts.map +1 -1
  56. package/dist/core/model-resolver.js +15 -18
  57. package/dist/core/model-resolver.js.map +1 -1
  58. package/dist/core/package-manager.d.ts +4 -1
  59. package/dist/core/package-manager.d.ts.map +1 -1
  60. package/dist/core/package-manager.js +68 -26
  61. package/dist/core/package-manager.js.map +1 -1
  62. package/dist/core/provider-attribution.d.ts.map +1 -1
  63. package/dist/core/provider-attribution.js +0 -10
  64. package/dist/core/provider-attribution.js.map +1 -1
  65. package/dist/core/resource-loader.d.ts +2 -2
  66. package/dist/core/resource-loader.d.ts.map +1 -1
  67. package/dist/core/resource-loader.js +8 -7
  68. package/dist/core/resource-loader.js.map +1 -1
  69. package/dist/core/sdk.d.ts +1 -1
  70. package/dist/core/sdk.d.ts.map +1 -1
  71. package/dist/core/sdk.js +8 -1
  72. package/dist/core/sdk.js.map +1 -1
  73. package/dist/core/session-manager.d.ts +21 -2
  74. package/dist/core/session-manager.d.ts.map +1 -1
  75. package/dist/core/session-manager.js +104 -72
  76. package/dist/core/session-manager.js.map +1 -1
  77. package/dist/core/settings-manager.d.ts +10 -0
  78. package/dist/core/settings-manager.d.ts.map +1 -1
  79. package/dist/core/settings-manager.js +27 -0
  80. package/dist/core/settings-manager.js.map +1 -1
  81. package/dist/core/slash-commands.d.ts +1 -0
  82. package/dist/core/slash-commands.d.ts.map +1 -1
  83. package/dist/core/slash-commands.js +3 -3
  84. package/dist/core/slash-commands.js.map +1 -1
  85. package/dist/core/timings.d.ts +4 -2
  86. package/dist/core/timings.d.ts.map +1 -1
  87. package/dist/core/timings.js +24 -14
  88. package/dist/core/timings.js.map +1 -1
  89. package/dist/core/tools/bash.d.ts.map +1 -1
  90. package/dist/core/tools/bash.js +20 -5
  91. package/dist/core/tools/bash.js.map +1 -1
  92. package/dist/core/tools/edit.d.ts.map +1 -1
  93. package/dist/core/tools/edit.js +2 -2
  94. package/dist/core/tools/edit.js.map +1 -1
  95. package/dist/core/tools/read.d.ts.map +1 -1
  96. package/dist/core/tools/read.js +12 -25
  97. package/dist/core/tools/read.js.map +1 -1
  98. package/dist/index.d.ts +3 -2
  99. package/dist/index.d.ts.map +1 -1
  100. package/dist/index.js +2 -1
  101. package/dist/index.js.map +1 -1
  102. package/dist/main.d.ts +2 -2
  103. package/dist/main.d.ts.map +1 -1
  104. package/dist/main.js +17 -4
  105. package/dist/main.js.map +1 -1
  106. package/dist/modes/interactive/components/assistant-message.d.ts +3 -1
  107. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  108. package/dist/modes/interactive/components/assistant-message.js +23 -15
  109. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  110. package/dist/modes/interactive/components/config-selector.d.ts +34 -3
  111. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  112. package/dist/modes/interactive/components/config-selector.js +280 -25
  113. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  114. package/dist/modes/interactive/components/custom-entry.d.ts +19 -0
  115. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -0
  116. package/dist/modes/interactive/components/custom-entry.js +52 -0
  117. package/dist/modes/interactive/components/custom-entry.js.map +1 -0
  118. package/dist/modes/interactive/components/extension-editor.d.ts +3 -1
  119. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  120. package/dist/modes/interactive/components/extension-editor.js +12 -3
  121. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  122. package/dist/modes/interactive/components/footer.d.ts +4 -0
  123. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  124. package/dist/modes/interactive/components/footer.js +1 -1
  125. package/dist/modes/interactive/components/footer.js.map +1 -1
  126. package/dist/modes/interactive/components/oauth-selector.d.ts +3 -1
  127. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  128. package/dist/modes/interactive/components/oauth-selector.js +17 -6
  129. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  130. package/dist/modes/interactive/components/settings-selector.d.ts +4 -0
  131. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  132. package/dist/modes/interactive/components/settings-selector.js +23 -1
  133. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  134. package/dist/modes/interactive/components/status-indicator.d.ts +28 -0
  135. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -0
  136. package/dist/modes/interactive/components/status-indicator.js +60 -0
  137. package/dist/modes/interactive/components/status-indicator.js.map +1 -0
  138. package/dist/modes/interactive/components/user-message.d.ts +6 -2
  139. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  140. package/dist/modes/interactive/components/user-message.js +19 -6
  141. package/dist/modes/interactive/components/user-message.js.map +1 -1
  142. package/dist/modes/interactive/interactive-mode.d.ts +21 -10
  143. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  144. package/dist/modes/interactive/interactive-mode.js +417 -196
  145. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  146. package/dist/modes/print-mode.d.ts.map +1 -1
  147. package/dist/modes/print-mode.js +1 -1
  148. package/dist/modes/print-mode.js.map +1 -1
  149. package/dist/modes/rpc/rpc-client.d.ts +21 -6
  150. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  151. package/dist/modes/rpc/rpc-client.js +17 -3
  152. package/dist/modes/rpc/rpc-client.js.map +1 -1
  153. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  154. package/dist/modes/rpc/rpc-mode.js +20 -1
  155. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  156. package/dist/modes/rpc/rpc-types.d.ts +26 -0
  157. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  158. package/dist/modes/rpc/rpc-types.js.map +1 -1
  159. package/dist/package-manager-cli.d.ts +2 -2
  160. package/dist/package-manager-cli.d.ts.map +1 -1
  161. package/dist/package-manager-cli.js +71 -17
  162. package/dist/package-manager-cli.js.map +1 -1
  163. package/dist/rpc-entry.d.ts +3 -0
  164. package/dist/rpc-entry.d.ts.map +1 -0
  165. package/dist/rpc-entry.js +10 -0
  166. package/dist/rpc-entry.js.map +1 -0
  167. package/dist/utils/clipboard-image.d.ts.map +1 -1
  168. package/dist/utils/clipboard-image.js +1 -1
  169. package/dist/utils/clipboard-image.js.map +1 -1
  170. package/dist/utils/image-convert.d.ts +1 -0
  171. package/dist/utils/image-convert.d.ts.map +1 -1
  172. package/dist/utils/image-convert.js +21 -15
  173. package/dist/utils/image-convert.js.map +1 -1
  174. package/dist/utils/image-process.d.ts +18 -0
  175. package/dist/utils/image-process.d.ts.map +1 -0
  176. package/dist/utils/image-process.js +83 -0
  177. package/dist/utils/image-process.js.map +1 -0
  178. package/dist/utils/mime.d.ts.map +1 -1
  179. package/dist/utils/mime.js +41 -0
  180. package/dist/utils/mime.js.map +1 -1
  181. package/docs/extensions.md +88 -17
  182. package/docs/keybindings.md +1 -1
  183. package/docs/models.md +4 -4
  184. package/docs/packages.md +2 -2
  185. package/docs/providers.md +2 -1
  186. package/docs/rpc.md +71 -3
  187. package/docs/sdk.md +50 -0
  188. package/docs/session-format.md +18 -8
  189. package/docs/settings.md +11 -0
  190. package/docs/usage.md +3 -3
  191. package/examples/extensions/README.md +1 -0
  192. package/examples/extensions/custom-compaction.ts +1 -0
  193. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  194. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  195. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  196. package/examples/extensions/entry-renderer.ts +41 -0
  197. package/examples/extensions/gondolin/package-lock.json +2 -2
  198. package/examples/extensions/gondolin/package.json +1 -1
  199. package/examples/extensions/handoff.ts +1 -1
  200. package/examples/extensions/qna.ts +1 -1
  201. package/examples/extensions/question.ts +1 -0
  202. package/examples/extensions/reload-runtime.ts +2 -2
  203. package/examples/extensions/sandbox/package-lock.json +2 -2
  204. package/examples/extensions/sandbox/package.json +1 -1
  205. package/examples/extensions/summarize.ts +1 -0
  206. package/examples/extensions/with-deps/package-lock.json +2 -2
  207. package/examples/extensions/with-deps/package.json +1 -1
  208. package/examples/sdk/12-full-control.ts +1 -1
  209. package/examples/sdk/README.md +1 -1
  210. package/npm-shrinkwrap.json +12 -12
  211. package/package.json +8 -5
@@ -582,6 +582,20 @@ function applyPatterns(allPaths, patterns, baseDir) {
582
582
  }
583
583
  return new Set(result);
584
584
  }
585
+ function applyAutoloadDisabledPatterns(allPaths, patterns, baseDir) {
586
+ const result = new Map();
587
+ for (const pattern of patterns) {
588
+ const target = pattern.slice(pattern.startsWith("+") || pattern.startsWith("-") || pattern.startsWith("!") ? 1 : 0);
589
+ const enabled = !pattern.startsWith("-") && !pattern.startsWith("!");
590
+ const exact = pattern.startsWith("+") || pattern.startsWith("-");
591
+ for (const filePath of allPaths) {
592
+ if (exact ? matchesAnyExactPattern(filePath, [target], baseDir) : matchesAnyPattern(filePath, [target], baseDir)) {
593
+ result.set(filePath, enabled);
594
+ }
595
+ }
596
+ }
597
+ return result;
598
+ }
585
599
  export class DefaultPackageManager {
586
600
  cwd;
587
601
  agentDir;
@@ -964,57 +978,67 @@ export class DefaultPackageManager {
964
978
  for (const { pkg, scope } of sources) {
965
979
  const sourceStr = typeof pkg === "string" ? pkg : pkg.source;
966
980
  const filter = typeof pkg === "object" ? pkg : undefined;
967
- const parsed = this.parseSource(sourceStr);
981
+ const deltaBase = this.findAutoloadDeltaBase(pkg, scope, sources);
982
+ const resolvedSource = deltaBase?.source ?? sourceStr;
983
+ const resolvedScope = deltaBase?.scope ?? scope;
984
+ const parsed = this.parseSource(resolvedSource);
968
985
  const metadata = { source: sourceStr, scope, origin: "package" };
969
986
  if (parsed.type === "local") {
970
- const baseDir = this.getBaseDirForScope(scope);
987
+ const baseDir = this.getBaseDirForScope(resolvedScope);
971
988
  this.resolveLocalExtensionSource(parsed, accumulator, filter, metadata, baseDir);
972
989
  continue;
973
990
  }
974
991
  const installMissing = async () => {
975
- if (isOfflineModeEnabled()) {
992
+ if (isOfflineModeEnabled())
976
993
  return false;
977
- }
978
994
  if (!onMissing) {
979
- await this.installParsedSource(parsed, scope);
995
+ await this.installParsedSource(parsed, resolvedScope);
980
996
  return true;
981
997
  }
982
- const action = await onMissing(sourceStr);
998
+ const action = await onMissing(resolvedSource);
983
999
  if (action === "skip")
984
1000
  return false;
985
1001
  if (action === "error")
986
- throw new Error(`Missing source: ${sourceStr}`);
987
- await this.installParsedSource(parsed, scope);
1002
+ throw new Error(`Missing source: ${resolvedSource}`);
1003
+ await this.installParsedSource(parsed, resolvedScope);
988
1004
  return true;
989
1005
  };
990
1006
  if (parsed.type === "npm") {
991
- let installedPath = this.getNpmInstallPath(parsed, scope);
1007
+ let installedPath = this.getNpmInstallPath(parsed, resolvedScope);
992
1008
  const needsInstall = !existsSync(installedPath) || !(await this.installedNpmMatchesConfiguredVersion(parsed, installedPath));
993
1009
  if (needsInstall) {
994
1010
  const installed = await installMissing();
995
1011
  if (!installed)
996
1012
  continue;
997
- installedPath = this.getNpmInstallPath(parsed, scope);
1013
+ installedPath = this.getNpmInstallPath(parsed, resolvedScope);
998
1014
  }
999
1015
  metadata.baseDir = installedPath;
1000
1016
  this.collectPackageResources(installedPath, accumulator, filter, metadata);
1001
1017
  continue;
1002
1018
  }
1003
1019
  if (parsed.type === "git") {
1004
- const installedPath = this.getGitInstallPath(parsed, scope);
1020
+ const installedPath = this.getGitInstallPath(parsed, resolvedScope);
1005
1021
  if (!existsSync(installedPath)) {
1006
1022
  const installed = await installMissing();
1007
1023
  if (!installed)
1008
1024
  continue;
1009
1025
  }
1010
- else if (scope === "temporary" && !parsed.pinned && !isOfflineModeEnabled()) {
1011
- await this.refreshTemporaryGitSource(parsed, sourceStr);
1026
+ else if (resolvedScope === "temporary" && !parsed.pinned && !isOfflineModeEnabled()) {
1027
+ await this.refreshTemporaryGitSource(parsed, resolvedSource);
1012
1028
  }
1013
1029
  metadata.baseDir = installedPath;
1014
1030
  this.collectPackageResources(installedPath, accumulator, filter, metadata);
1015
1031
  }
1016
1032
  }
1017
1033
  }
1034
+ findAutoloadDeltaBase(pkg, scope, sources) {
1035
+ if (scope !== "project" || typeof pkg !== "object" || pkg.autoload !== false)
1036
+ return undefined;
1037
+ const identity = this.getPackageIdentity(pkg.source, scope);
1038
+ const userEntry = sources.find((entry) => entry.scope === "user" &&
1039
+ this.getPackageIdentity(this.getPackageSourceString(entry.pkg), "user") === identity);
1040
+ return userEntry ? { source: this.getPackageSourceString(userEntry.pkg), scope: "user" } : undefined;
1041
+ }
1018
1042
  resolveLocalExtensionSource(source, accumulator, filter, metadata, baseDir) {
1019
1043
  const resolved = this.resolvePathFromBase(source.path, baseDir);
1020
1044
  if (!existsSync(resolved)) {
@@ -1356,25 +1380,30 @@ export class DefaultPackageManager {
1356
1380
  }
1357
1381
  /**
1358
1382
  * Dedupe packages: if same package identity appears in both global and project,
1359
- * keep only the project one (project wins).
1383
+ * keep only the project one (project wins). A project entry with autoload=false
1384
+ * is a delta over the global entry, so both are kept (delta first).
1360
1385
  */
1361
1386
  dedupePackages(packages) {
1387
+ const result = [];
1362
1388
  const seen = new Map();
1363
1389
  for (const entry of packages) {
1364
- const sourceStr = typeof entry.pkg === "string" ? entry.pkg : entry.pkg.source;
1365
- const identity = this.getPackageIdentity(sourceStr, entry.scope);
1366
- const existing = seen.get(identity);
1367
- if (!existing) {
1368
- seen.set(identity, entry);
1390
+ const identity = this.getPackageIdentity(this.getPackageSourceString(entry.pkg), entry.scope);
1391
+ const index = seen.get(identity);
1392
+ if (index === undefined) {
1393
+ seen.set(identity, result.length);
1394
+ result.push(entry);
1395
+ continue;
1396
+ }
1397
+ const existing = result[index];
1398
+ if (existing?.scope === "project" && entry.scope === "user") {
1399
+ if (typeof existing.pkg === "object" && existing.pkg.autoload === false)
1400
+ result.push(entry);
1369
1401
  }
1370
- else if (entry.scope === "project" && existing.scope === "user") {
1371
- // Project wins over user
1372
- seen.set(identity, entry);
1402
+ else if (entry.scope === "project") {
1403
+ result[index] = entry;
1373
1404
  }
1374
- // If existing is project and new is global, keep existing (project)
1375
- // If both are same scope, keep first one
1376
1405
  }
1377
- return Array.from(seen.values());
1406
+ return result;
1378
1407
  }
1379
1408
  parseNpmSpec(spec) {
1380
1409
  const match = spec.match(/^(@?[^@]+(?:\/[^@]+)?)(?:@(.+))?$/);
@@ -1708,7 +1737,10 @@ export class DefaultPackageManager {
1708
1737
  for (const resourceType of RESOURCE_TYPES) {
1709
1738
  const patterns = filter[resourceType];
1710
1739
  const target = this.getTargetMap(accumulator, resourceType);
1711
- if (patterns !== undefined) {
1740
+ if (filter.autoload === false) {
1741
+ this.applyPackageDeltaFilter(packageRoot, patterns ?? [], resourceType, target, metadata);
1742
+ }
1743
+ else if (patterns !== undefined) {
1712
1744
  this.applyPackageFilter(packageRoot, patterns, resourceType, target, metadata);
1713
1745
  }
1714
1746
  else {
@@ -1771,6 +1803,16 @@ export class DefaultPackageManager {
1771
1803
  this.addResource(target, f, metadata, enabled);
1772
1804
  }
1773
1805
  }
1806
+ applyPackageDeltaFilter(packageRoot, userPatterns, resourceType, target, metadata) {
1807
+ if (userPatterns.length === 0) {
1808
+ return;
1809
+ }
1810
+ const { allFiles } = this.collectManifestFiles(packageRoot, resourceType);
1811
+ const enabledByUser = applyAutoloadDisabledPatterns(allFiles, userPatterns, packageRoot);
1812
+ for (const [filePath, enabled] of enabledByUser) {
1813
+ this.addResource(target, filePath, metadata, enabled);
1814
+ }
1815
+ }
1774
1816
  /**
1775
1817
  * Collect all files from a package for a resource type, applying manifest patterns.
1776
1818
  * Returns { allFiles, enabledByManifest } where enabledByManifest is the set of files