@code-yeongyu/senpi 2026.7.9 → 2026.7.10

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