@bastani/atomic 0.9.5-alpha.6 → 0.9.5-alpha.7

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 (158) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/builtin/cursor/package.json +2 -2
  3. package/dist/builtin/intercom/package.json +1 -1
  4. package/dist/builtin/mcp/package.json +1 -1
  5. package/dist/builtin/subagents/package.json +1 -1
  6. package/dist/builtin/web-access/package.json +1 -1
  7. package/dist/builtin/workflows/package.json +1 -1
  8. package/dist/bun/split-loader.d.ts +2 -0
  9. package/dist/bun/split-loader.d.ts.map +1 -0
  10. package/dist/bun/split-loader.js +37 -0
  11. package/dist/bun/split-loader.js.map +1 -0
  12. package/dist/config.d.ts.map +1 -1
  13. package/dist/config.js +6 -4
  14. package/dist/config.js.map +1 -1
  15. package/dist/core/agent-session-auto-compaction.d.ts +5 -4
  16. package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
  17. package/dist/core/agent-session-auto-compaction.js +15 -9
  18. package/dist/core/agent-session-auto-compaction.js.map +1 -1
  19. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  20. package/dist/core/agent-session-extension-bindings.js +1 -1
  21. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  22. package/dist/core/agent-session-methods.d.ts +1 -1
  23. package/dist/core/agent-session-methods.d.ts.map +1 -1
  24. package/dist/core/agent-session-methods.js.map +1 -1
  25. package/dist/core/builtin-packages.d.ts.map +1 -1
  26. package/dist/core/builtin-packages.js +8 -4
  27. package/dist/core/builtin-packages.js.map +1 -1
  28. package/dist/core/copilot-model-catalog.d.ts.map +1 -1
  29. package/dist/core/copilot-model-catalog.js +3 -2
  30. package/dist/core/copilot-model-catalog.js.map +1 -1
  31. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  32. package/dist/core/extensions/loader-virtual-modules.js +8 -3
  33. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  34. package/dist/core/openai-responses-payload-sanitizer.d.ts +6 -0
  35. package/dist/core/openai-responses-payload-sanitizer.d.ts.map +1 -0
  36. package/dist/core/openai-responses-payload-sanitizer.js +59 -0
  37. package/dist/core/openai-responses-payload-sanitizer.js.map +1 -0
  38. package/dist/core/package-manager-auto-resources.d.ts +2 -2
  39. package/dist/core/package-manager-auto-resources.d.ts.map +1 -1
  40. package/dist/core/package-manager-auto-resources.js +32 -52
  41. package/dist/core/package-manager-auto-resources.js.map +1 -1
  42. package/dist/core/package-manager-resolver.d.ts.map +1 -1
  43. package/dist/core/package-manager-resolver.js +23 -14
  44. package/dist/core/package-manager-resolver.js.map +1 -1
  45. package/dist/core/package-manager-resource-collector.d.ts +3 -3
  46. package/dist/core/package-manager-resource-collector.d.ts.map +1 -1
  47. package/dist/core/package-manager-resource-collector.js +76 -73
  48. package/dist/core/package-manager-resource-collector.js.map +1 -1
  49. package/dist/core/package-manager-resource-files.d.ts +9 -8
  50. package/dist/core/package-manager-resource-files.d.ts.map +1 -1
  51. package/dist/core/package-manager-resource-files.js +92 -81
  52. package/dist/core/package-manager-resource-files.js.map +1 -1
  53. package/dist/core/prompt-templates-async.d.ts +3 -0
  54. package/dist/core/prompt-templates-async.d.ts.map +1 -0
  55. package/dist/core/prompt-templates-async.js +118 -0
  56. package/dist/core/prompt-templates-async.js.map +1 -0
  57. package/dist/core/provider-context-usage.d.ts +11 -0
  58. package/dist/core/provider-context-usage.d.ts.map +1 -0
  59. package/dist/core/provider-context-usage.js +58 -0
  60. package/dist/core/provider-context-usage.js.map +1 -0
  61. package/dist/core/resource-loader-assets.d.ts +3 -3
  62. package/dist/core/resource-loader-assets.d.ts.map +1 -1
  63. package/dist/core/resource-loader-assets.js +66 -83
  64. package/dist/core/resource-loader-assets.js.map +1 -1
  65. package/dist/core/resource-loader-core.d.ts +1 -1
  66. package/dist/core/resource-loader-core.d.ts.map +1 -1
  67. package/dist/core/resource-loader-core.js +5 -5
  68. package/dist/core/resource-loader-core.js.map +1 -1
  69. package/dist/core/resource-loader-reload.d.ts.map +1 -1
  70. package/dist/core/resource-loader-reload.js +43 -7
  71. package/dist/core/resource-loader-reload.js.map +1 -1
  72. package/dist/core/resource-loader-types.d.ts +7 -1
  73. package/dist/core/resource-loader-types.d.ts.map +1 -1
  74. package/dist/core/resource-loader-types.js.map +1 -1
  75. package/dist/core/sdk.d.ts.map +1 -1
  76. package/dist/core/sdk.js +6 -4
  77. package/dist/core/sdk.js.map +1 -1
  78. package/dist/core/skills-async.d.ts +3 -0
  79. package/dist/core/skills-async.d.ts.map +1 -0
  80. package/dist/core/skills-async.js +269 -0
  81. package/dist/core/skills-async.js.map +1 -0
  82. package/dist/main-deferred-startup.d.ts +2 -0
  83. package/dist/main-deferred-startup.d.ts.map +1 -1
  84. package/dist/main-deferred-startup.js +2 -0
  85. package/dist/main-deferred-startup.js.map +1 -1
  86. package/dist/main.d.ts.map +1 -1
  87. package/dist/main.js +4 -4
  88. package/dist/main.js.map +1 -1
  89. package/dist/modes/interactive/interactive-agent-events.d.ts.map +1 -1
  90. package/dist/modes/interactive/interactive-agent-events.js +10 -1
  91. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  92. package/dist/modes/interactive/interactive-deferred-startup.d.ts +6 -0
  93. package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -1
  94. package/dist/modes/interactive/interactive-deferred-startup.js +27 -13
  95. package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
  96. package/dist/modes/interactive/interactive-editor-actions.d.ts.map +1 -1
  97. package/dist/modes/interactive/interactive-editor-actions.js +13 -13
  98. package/dist/modes/interactive/interactive-editor-actions.js.map +1 -1
  99. package/dist/modes/interactive/interactive-extension-runtime.d.ts.map +1 -1
  100. package/dist/modes/interactive/interactive-extension-runtime.js +16 -0
  101. package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
  102. package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
  103. package/dist/modes/interactive/interactive-input-handling.js +48 -0
  104. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  105. package/dist/modes/interactive/interactive-mode-base.d.ts +5 -0
  106. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  107. package/dist/modes/interactive/interactive-mode-base.js +5 -0
  108. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  109. package/dist/modes/interactive/interactive-mode-surface.d.ts +18 -6
  110. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  111. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  112. package/dist/modes/interactive/interactive-model-routing.d.ts.map +1 -1
  113. package/dist/modes/interactive/interactive-model-routing.js +3 -3
  114. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  115. package/dist/modes/interactive/interactive-onboarding.d.ts.map +1 -1
  116. package/dist/modes/interactive/interactive-onboarding.js +1 -0
  117. package/dist/modes/interactive/interactive-onboarding.js.map +1 -1
  118. package/dist/modes/interactive/interactive-process-lifecycle.d.ts.map +1 -1
  119. package/dist/modes/interactive/interactive-process-lifecycle.js +43 -6
  120. package/dist/modes/interactive/interactive-process-lifecycle.js.map +1 -1
  121. package/dist/modes/interactive/interactive-render-chat.d.ts.map +1 -1
  122. package/dist/modes/interactive/interactive-render-chat.js +57 -0
  123. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  124. package/dist/modes/interactive/interactive-resource-disclosure.d.ts.map +1 -1
  125. package/dist/modes/interactive/interactive-resource-disclosure.js +3 -2
  126. package/dist/modes/interactive/interactive-resource-disclosure.js.map +1 -1
  127. package/dist/modes/interactive/interactive-resource-rendering.d.ts.map +1 -1
  128. package/dist/modes/interactive/interactive-resource-rendering.js +10 -8
  129. package/dist/modes/interactive/interactive-resource-rendering.js.map +1 -1
  130. package/dist/modes/interactive/interactive-session-runtime.d.ts.map +1 -1
  131. package/dist/modes/interactive/interactive-session-runtime.js +1 -1
  132. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  133. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  134. package/dist/modes/interactive/interactive-startup.js +59 -52
  135. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  136. package/dist/modes/interactive/theme/theme-loading.d.ts +1 -0
  137. package/dist/modes/interactive/theme/theme-loading.d.ts.map +1 -1
  138. package/dist/modes/interactive/theme/theme-loading.js +3 -0
  139. package/dist/modes/interactive/theme/theme-loading.js.map +1 -1
  140. package/dist/modes/interactive/theme/theme.d.ts +1 -1
  141. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  142. package/dist/modes/interactive/theme/theme.js +1 -1
  143. package/dist/modes/interactive/theme/theme.js.map +1 -1
  144. package/dist/utils/module-require.d.ts +11 -0
  145. package/dist/utils/module-require.d.ts.map +1 -1
  146. package/dist/utils/module-require.js +14 -1
  147. package/dist/utils/module-require.js.map +1 -1
  148. package/dist/utils/split-launcher.d.ts +38 -0
  149. package/dist/utils/split-launcher.d.ts.map +1 -0
  150. package/dist/utils/split-launcher.js +63 -0
  151. package/dist/utils/split-launcher.js.map +1 -0
  152. package/docs/compaction.md +3 -0
  153. package/docs/keybindings.md +2 -2
  154. package/docs/providers.md +1 -1
  155. package/docs/settings.md +2 -2
  156. package/docs/usage.md +1 -1
  157. package/npm-shrinkwrap.json +23 -23
  158. package/package.json +4 -4
@@ -0,0 +1,58 @@
1
+ function findLatestCompactionBoundary(entries) {
2
+ for (let i = entries.length - 1; i >= 0; i--) {
3
+ const entry = entries[i];
4
+ if (entry.type === "context_compaction") {
5
+ return entry;
6
+ }
7
+ }
8
+ return undefined;
9
+ }
10
+ function hasTokenUsage(usage) {
11
+ return usage.input > 0 || usage.output > 0 || usage.cacheRead > 0 || usage.cacheWrite > 0 || usage.totalTokens > 0;
12
+ }
13
+ function createZeroUsage(usage) {
14
+ const zeroed = {
15
+ ...usage,
16
+ input: 0,
17
+ output: 0,
18
+ cacheRead: 0,
19
+ cacheWrite: 0,
20
+ totalTokens: 0,
21
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
22
+ };
23
+ if (usage.cacheWrite1h !== undefined) {
24
+ zeroed.cacheWrite1h = 0;
25
+ }
26
+ if (usage.reasoning !== undefined) {
27
+ zeroed.reasoning = 0;
28
+ }
29
+ return zeroed;
30
+ }
31
+ /**
32
+ * Provider-side token-budget estimators use the last assistant usage in the
33
+ * request context as an anchor. After logical context compaction, retained
34
+ * pre-compaction assistant messages still carry usage from the old, larger
35
+ * context. Scrub only the provider-bound clone so the durable transcript keeps
36
+ * historical billing data while the next request estimates the compacted prompt.
37
+ */
38
+ export function scrubPreCompactionAssistantUsage(messages, entries) {
39
+ const compactionBoundary = findLatestCompactionBoundary(entries);
40
+ if (!compactionBoundary)
41
+ return messages;
42
+ const boundaryTime = Date.parse(compactionBoundary.timestamp);
43
+ if (!Number.isFinite(boundaryTime))
44
+ return messages;
45
+ let changed = false;
46
+ const scrubbed = messages.map((message) => {
47
+ if (message.role !== "assistant")
48
+ return message;
49
+ const assistant = message;
50
+ if (assistant.timestamp > boundaryTime || !hasTokenUsage(assistant.usage)) {
51
+ return message;
52
+ }
53
+ changed = true;
54
+ return { ...assistant, usage: createZeroUsage(assistant.usage) };
55
+ });
56
+ return changed ? scrubbed : messages;
57
+ }
58
+ //# sourceMappingURL=provider-context-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-context-usage.js","sourceRoot":"","sources":["../../src/core/provider-context-usage.ts"],"names":[],"mappings":"AAIA,SAAS,4BAA4B,CAAC,OAAgC;IACrE,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;YACzC,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,aAAa,CAAC,KAAY;IAClC,OAAO,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,IAAI,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC;AACpH,CAAC;AAED,SAAS,eAAe,CAAC,KAAY;IACpC,MAAM,MAAM,GAAU;QACrB,GAAG,KAAK;QACR,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;QACb,WAAW,EAAE,CAAC;QACd,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;KACpE,CAAC;IAEF,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACtC,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gCAAgC,CAC/C,QAAwB,EACxB,OAAgC;IAEhC,MAAM,kBAAkB,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;IACjE,IAAI,CAAC,kBAAkB;QAAE,OAAO,QAAQ,CAAC;IAEzC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC9D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,QAAQ,CAAC;IAEpD,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACzC,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,OAAO,CAAC;QAEjD,MAAM,SAAS,GAAG,OAA2B,CAAC;QAC9C,IAAI,SAAS,CAAC,SAAS,GAAG,YAAY,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3E,OAAO,OAAO,CAAC;QAChB,CAAC;QAED,OAAO,GAAG,IAAI,CAAC;QACf,OAAO,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;AACtC,CAAC","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { AssistantMessage, Usage } from \"@earendil-works/pi-ai/compat\";\nimport type { ContextCompactionEntry, SessionEntry } from \"./session-manager.ts\";\n\nfunction findLatestCompactionBoundary(entries: readonly SessionEntry[]): ContextCompactionEntry | undefined {\n\tfor (let i = entries.length - 1; i >= 0; i--) {\n\t\tconst entry = entries[i];\n\t\tif (entry.type === \"context_compaction\") {\n\t\t\treturn entry;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction hasTokenUsage(usage: Usage): boolean {\n\treturn usage.input > 0 || usage.output > 0 || usage.cacheRead > 0 || usage.cacheWrite > 0 || usage.totalTokens > 0;\n}\n\nfunction createZeroUsage(usage: Usage): Usage {\n\tconst zeroed: Usage = {\n\t\t...usage,\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotalTokens: 0,\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t};\n\n\tif (usage.cacheWrite1h !== undefined) {\n\t\tzeroed.cacheWrite1h = 0;\n\t}\n\tif (usage.reasoning !== undefined) {\n\t\tzeroed.reasoning = 0;\n\t}\n\n\treturn zeroed;\n}\n\n/**\n * Provider-side token-budget estimators use the last assistant usage in the\n * request context as an anchor. After logical context compaction, retained\n * pre-compaction assistant messages still carry usage from the old, larger\n * context. Scrub only the provider-bound clone so the durable transcript keeps\n * historical billing data while the next request estimates the compacted prompt.\n */\nexport function scrubPreCompactionAssistantUsage(\n\tmessages: AgentMessage[],\n\tentries: readonly SessionEntry[],\n): AgentMessage[] {\n\tconst compactionBoundary = findLatestCompactionBoundary(entries);\n\tif (!compactionBoundary) return messages;\n\n\tconst boundaryTime = Date.parse(compactionBoundary.timestamp);\n\tif (!Number.isFinite(boundaryTime)) return messages;\n\n\tlet changed = false;\n\tconst scrubbed = messages.map((message) => {\n\t\tif (message.role !== \"assistant\") return message;\n\n\t\tconst assistant = message as AssistantMessage;\n\t\tif (assistant.timestamp > boundaryTime || !hasTokenUsage(assistant.usage)) {\n\t\t\treturn message;\n\t\t}\n\n\t\tchanged = true;\n\t\treturn { ...assistant, usage: createZeroUsage(assistant.usage) };\n\t});\n\n\treturn changed ? scrubbed : messages;\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import type { PathMetadata } from "./package-manager.ts";
2
2
  import type { DefaultResourceLoader } from "./resource-loader-core.ts";
3
- export declare function updateSkillsFromPaths(loader: DefaultResourceLoader, skillPaths: string[], metadataByPath?: Map<string, PathMetadata>): void;
4
- export declare function updatePromptsFromPaths(loader: DefaultResourceLoader, promptPaths: string[], metadataByPath?: Map<string, PathMetadata>): void;
5
- export declare function updateThemesFromPaths(loader: DefaultResourceLoader, themePaths: string[], metadataByPath?: Map<string, PathMetadata>): void;
3
+ export declare function updateSkillsFromPathsAsync(loader: DefaultResourceLoader, skillPaths: string[], metadataByPath?: Map<string, PathMetadata>): Promise<void>;
4
+ export declare function updatePromptsFromPathsAsync(loader: DefaultResourceLoader, promptPaths: string[], metadataByPath?: Map<string, PathMetadata>): Promise<void>;
5
+ export declare function updateThemesFromPathsAsync(loader: DefaultResourceLoader, themePaths: string[], metadataByPath?: Map<string, PathMetadata>): Promise<void>;
6
6
  //# sourceMappingURL=resource-loader-assets.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resource-loader-assets.d.ts","sourceRoot":"","sources":["../../src/core/resource-loader-assets.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAOzD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAGvE,wBAAgB,qBAAqB,CACpC,MAAM,EAAE,qBAAqB,EAC7B,UAAU,EAAE,MAAM,EAAE,EACpB,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GACxC,IAAI,CAsBN;AAED,wBAAgB,sBAAsB,CACrC,MAAM,EAAE,qBAAqB,EAC7B,WAAW,EAAE,MAAM,EAAE,EACrB,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GACxC,IAAI,CAuBN;AAED,wBAAgB,qBAAqB,CACpC,MAAM,EAAE,qBAAqB,EAC7B,UAAU,EAAE,MAAM,EAAE,EACpB,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GACxC,IAAI,CAqBN","sourcesContent":["import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getProjectConfigDirs } from \"../config.ts\";\nimport { loadThemeFromPath, type Theme } from \"../modes/interactive/theme/theme.ts\";\nimport type { ResourceDiagnostic } from \"./diagnostics.ts\";\nimport type { PathMetadata } from \"./package-manager.ts\";\nimport type { PromptTemplate } from \"./prompt-templates.ts\";\nimport { loadPromptTemplates } from \"./prompt-templates.ts\";\nimport type { Skill } from \"./skills.ts\";\nimport { loadSkills } from \"./skills.ts\";\nimport { resourceInternals } from \"./resource-loader-internals.ts\";\nimport { getLoaderAgentDirs, resolveResourcePath } from \"./resource-loader-paths.ts\";\nimport type { DefaultResourceLoader } from \"./resource-loader-core.ts\";\nimport { findSourceInfoForPath, getDefaultSourceInfoForPath } from \"./resource-loader-source-info.ts\";\n\nexport function updateSkillsFromPaths(\n\tloader: DefaultResourceLoader,\n\tskillPaths: string[],\n\tmetadataByPath?: Map<string, PathMetadata>,\n): void {\n\tconst state = resourceInternals(loader);\n\tlet skillsResult: { skills: Skill[]; diagnostics: ResourceDiagnostic[] };\n\tif (state.noSkills && skillPaths.length === 0) {\n\t\tskillsResult = { skills: [], diagnostics: [] };\n\t} else {\n\t\tskillsResult = loadSkills({\n\t\t\tcwd: state.cwd,\n\t\t\tagentDir: state.agentDir,\n\t\t\tskillPaths,\n\t\t\tincludeDefaults: false,\n\t\t});\n\t}\n\tconst resolvedSkills = state.skillsOverride ? state.skillsOverride(skillsResult) : skillsResult;\n\tstate.skills = resolvedSkills.skills.map((skill) => ({\n\t\t...skill,\n\t\tsourceInfo:\n\t\t\tfindSourceInfoForPath(loader, skill.filePath, state.extensionSkillSourceInfos, metadataByPath) ??\n\t\t\tskill.sourceInfo ??\n\t\t\tgetDefaultSourceInfoForPath(loader, skill.filePath),\n\t}));\n\tstate.skillDiagnostics = resolvedSkills.diagnostics;\n}\n\nexport function updatePromptsFromPaths(\n\tloader: DefaultResourceLoader,\n\tpromptPaths: string[],\n\tmetadataByPath?: Map<string, PathMetadata>,\n): void {\n\tconst state = resourceInternals(loader);\n\tlet promptsResult: { prompts: PromptTemplate[]; diagnostics: ResourceDiagnostic[] };\n\tif (state.noPromptTemplates && promptPaths.length === 0) {\n\t\tpromptsResult = { prompts: [], diagnostics: [] };\n\t} else {\n\t\tconst allPrompts = loadPromptTemplates({\n\t\t\tcwd: state.cwd,\n\t\t\tagentDir: state.agentDir,\n\t\t\tpromptPaths,\n\t\t\tincludeDefaults: false,\n\t\t});\n\t\tpromptsResult = dedupePrompts(allPrompts);\n\t}\n\tconst resolvedPrompts = state.promptsOverride ? state.promptsOverride(promptsResult) : promptsResult;\n\tstate.prompts = resolvedPrompts.prompts.map((prompt) => ({\n\t\t...prompt,\n\t\tsourceInfo:\n\t\t\tfindSourceInfoForPath(loader, prompt.filePath, state.extensionPromptSourceInfos, metadataByPath) ??\n\t\t\tprompt.sourceInfo ??\n\t\t\tgetDefaultSourceInfoForPath(loader, prompt.filePath),\n\t}));\n\tstate.promptDiagnostics = resolvedPrompts.diagnostics;\n}\n\nexport function updateThemesFromPaths(\n\tloader: DefaultResourceLoader,\n\tthemePaths: string[],\n\tmetadataByPath?: Map<string, PathMetadata>,\n): void {\n\tconst state = resourceInternals(loader);\n\tlet themesResult: { themes: Theme[]; diagnostics: ResourceDiagnostic[] };\n\tif (state.noThemes && themePaths.length === 0) {\n\t\tthemesResult = { themes: [], diagnostics: [] };\n\t} else {\n\t\tconst loaded = loadThemes(loader, themePaths, false);\n\t\tconst deduped = dedupeThemes(loaded.themes);\n\t\tthemesResult = { themes: deduped.themes, diagnostics: [...loaded.diagnostics, ...deduped.diagnostics] };\n\t}\n\tconst resolvedThemes = state.themesOverride ? state.themesOverride(themesResult) : themesResult;\n\tstate.themes = resolvedThemes.themes.map((theme) => {\n\t\tconst sourcePath = theme.sourcePath;\n\t\ttheme.sourceInfo = sourcePath\n\t\t\t? (findSourceInfoForPath(loader, sourcePath, state.extensionThemeSourceInfos, metadataByPath) ??\n\t\t\t\ttheme.sourceInfo ??\n\t\t\t\tgetDefaultSourceInfoForPath(loader, sourcePath))\n\t\t\t: theme.sourceInfo;\n\t\treturn theme;\n\t});\n\tstate.themeDiagnostics = resolvedThemes.diagnostics;\n}\n\nfunction loadThemes(\n\tloader: DefaultResourceLoader,\n\tpaths: string[],\n\tincludeDefaults = true,\n): {\n\tthemes: Theme[];\n\tdiagnostics: ResourceDiagnostic[];\n} {\n\tconst state = resourceInternals(loader);\n\tconst themes: Theme[] = [];\n\tconst diagnostics: ResourceDiagnostic[] = [];\n\tif (includeDefaults) {\n\t\tconst defaultDirs = [\n\t\t\t...getLoaderAgentDirs(state.agentDir).map((agentDir) => join(agentDir, \"themes\")),\n\t\t\t...getProjectThemeDirs(state.cwd),\n\t\t];\n\n\t\tfor (const dir of defaultDirs) {\n\t\t\tloadThemesFromDir(dir, themes, diagnostics);\n\t\t}\n\t}\n\n\tfor (const p of paths) {\n\t\tconst resolved = resolveResourcePath(state.cwd, p);\n\t\tif (!existsSync(resolved)) {\n\t\t\tdiagnostics.push({ type: \"warning\", message: \"theme path does not exist\", path: resolved });\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\tconst stats = statSync(resolved);\n\t\t\tif (stats.isDirectory()) {\n\t\t\t\tloadThemesFromDir(resolved, themes, diagnostics);\n\t\t\t} else if (stats.isFile() && resolved.endsWith(\".json\")) {\n\t\t\t\tloadThemeFromFile(resolved, themes, diagnostics);\n\t\t\t} else {\n\t\t\t\tdiagnostics.push({ type: \"warning\", message: \"theme path is not a json file\", path: resolved });\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"failed to read theme path\";\n\t\t\tdiagnostics.push({ type: \"warning\", message, path: resolved });\n\t\t}\n\t}\n\n\treturn { themes, diagnostics };\n}\n\nfunction getProjectThemeDirs(cwd: string): string[] {\n\treturn getProjectConfigDirs(cwd).map((configDir) => join(configDir, \"themes\"));\n}\n\nfunction loadThemesFromDir(dir: string, themes: Theme[], diagnostics: ResourceDiagnostic[]): void {\n\tif (!existsSync(dir)) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst entries = readdirSync(dir, { withFileTypes: true });\n\t\tfor (const entry of entries) {\n\t\t\tlet isFile = entry.isFile();\n\t\t\tif (entry.isSymbolicLink()) {\n\t\t\t\ttry {\n\t\t\t\t\tisFile = statSync(join(dir, entry.name)).isFile();\n\t\t\t\t} catch {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!isFile) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!entry.name.endsWith(\".json\")) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tloadThemeFromFile(join(dir, entry.name), themes, diagnostics);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"failed to read theme directory\";\n\t\tdiagnostics.push({ type: \"warning\", message, path: dir });\n\t}\n}\n\nfunction loadThemeFromFile(filePath: string, themes: Theme[], diagnostics: ResourceDiagnostic[]): void {\n\ttry {\n\t\tthemes.push(loadThemeFromPath(filePath));\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"failed to load theme\";\n\t\tdiagnostics.push({ type: \"warning\", message, path: filePath });\n\t}\n}\n\nfunction dedupePrompts(prompts: PromptTemplate[]): { prompts: PromptTemplate[]; diagnostics: ResourceDiagnostic[] } {\n\tconst seen = new Map<string, PromptTemplate>();\n\tconst diagnostics: ResourceDiagnostic[] = [];\n\n\tfor (const prompt of prompts) {\n\t\tconst existing = seen.get(prompt.name);\n\t\tif (existing) {\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"collision\",\n\t\t\t\tmessage: `name \"/${prompt.name}\" collision`,\n\t\t\t\tpath: prompt.filePath,\n\t\t\t\tcollision: {\n\t\t\t\t\tresourceType: \"prompt\",\n\t\t\t\t\tname: prompt.name,\n\t\t\t\t\twinnerPath: existing.filePath,\n\t\t\t\t\tloserPath: prompt.filePath,\n\t\t\t\t},\n\t\t\t});\n\t\t} else {\n\t\t\tseen.set(prompt.name, prompt);\n\t\t}\n\t}\n\n\treturn { prompts: Array.from(seen.values()), diagnostics };\n}\n\nfunction dedupeThemes(themes: Theme[]): { themes: Theme[]; diagnostics: ResourceDiagnostic[] } {\n\tconst seen = new Map<string, Theme>();\n\tconst diagnostics: ResourceDiagnostic[] = [];\n\n\tfor (const t of themes) {\n\t\tconst name = t.name ?? \"unnamed\";\n\t\tconst existing = seen.get(name);\n\t\tif (existing) {\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"collision\",\n\t\t\t\tmessage: `name \"${name}\" collision`,\n\t\t\t\tpath: t.sourcePath,\n\t\t\t\tcollision: {\n\t\t\t\t\tresourceType: \"theme\",\n\t\t\t\t\tname,\n\t\t\t\t\twinnerPath: existing.sourcePath ?? \"<builtin>\",\n\t\t\t\t\tloserPath: t.sourcePath ?? \"<builtin>\",\n\t\t\t\t},\n\t\t\t});\n\t\t} else {\n\t\t\tseen.set(name, t);\n\t\t}\n\t}\n\n\treturn { themes: Array.from(seen.values()), diagnostics };\n}\n"]}
1
+ {"version":3,"file":"resource-loader-assets.d.ts","sourceRoot":"","sources":["../../src/core/resource-loader-assets.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAKzD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AA4BvE,wBAAsB,0BAA0B,CAC/C,MAAM,EAAE,qBAAqB,EAC7B,UAAU,EAAE,MAAM,EAAE,EACpB,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GACxC,OAAO,CAAC,IAAI,CAAC,CAMf;AAmBD,wBAAsB,2BAA2B,CAChD,MAAM,EAAE,qBAAqB,EAC7B,WAAW,EAAE,MAAM,EAAE,EACrB,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GACxC,OAAO,CAAC,IAAI,CAAC,CAMf;AAqBD,wBAAsB,0BAA0B,CAC/C,MAAM,EAAE,qBAAqB,EAC7B,UAAU,EAAE,MAAM,EAAE,EACpB,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GACxC,OAAO,CAAC,IAAI,CAAC,CAMf","sourcesContent":["import { access, readdir, readFile, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getProjectConfigDirs } from \"../config.ts\";\nimport { loadThemeFromContent, type Theme } from \"../modes/interactive/theme/theme.ts\";\nimport { yieldToEventLoopIfSlow } from \"../utils/event-loop.ts\";\nimport type { ResourceDiagnostic } from \"./diagnostics.ts\";\nimport type { PathMetadata } from \"./package-manager.ts\";\nimport type { PromptTemplate } from \"./prompt-templates.ts\";\nimport { loadPromptTemplatesAsync } from \"./prompt-templates-async.ts\";\nimport type { Skill } from \"./skills.ts\";\nimport { loadSkillsAsync } from \"./skills-async.ts\";\nimport type { DefaultResourceLoader } from \"./resource-loader-core.ts\";\nimport { resourceInternals } from \"./resource-loader-internals.ts\";\nimport { getLoaderAgentDirs, resolveResourcePath } from \"./resource-loader-paths.ts\";\nimport { findSourceInfoForPath, getDefaultSourceInfoForPath } from \"./resource-loader-source-info.ts\";\n\nconst RESOURCE_LOAD_YIELD_AFTER_MS = 8;\n\nasync function existsAsync(path: string): Promise<boolean> {\n\ttry { await access(path); return true; } catch { return false; }\n}\n\nfunction applySkillsResult(\n\tloader: DefaultResourceLoader,\n\tskillsResult: { skills: Skill[]; diagnostics: ResourceDiagnostic[] },\n\tmetadataByPath?: Map<string, PathMetadata>,\n): void {\n\tconst state = resourceInternals(loader);\n\tconst resolvedSkills = state.skillsOverride ? state.skillsOverride(skillsResult) : skillsResult;\n\tstate.skills = resolvedSkills.skills.map((skill) => ({\n\t\t...skill,\n\t\tsourceInfo:\n\t\t\tfindSourceInfoForPath(loader, skill.filePath, state.extensionSkillSourceInfos, metadataByPath) ??\n\t\t\tskill.sourceInfo ??\n\t\t\tgetDefaultSourceInfoForPath(loader, skill.filePath),\n\t}));\n\tstate.skillDiagnostics = resolvedSkills.diagnostics;\n}\n\nexport async function updateSkillsFromPathsAsync(\n\tloader: DefaultResourceLoader,\n\tskillPaths: string[],\n\tmetadataByPath?: Map<string, PathMetadata>,\n): Promise<void> {\n\tconst state = resourceInternals(loader);\n\tconst skillsResult = state.noSkills && skillPaths.length === 0\n\t\t? { skills: [], diagnostics: [] }\n\t\t: await loadSkillsAsync({ cwd: state.cwd, agentDir: state.agentDir, skillPaths, includeDefaults: false });\n\tapplySkillsResult(loader, skillsResult, metadataByPath);\n}\n\nfunction applyPromptsResult(\n\tloader: DefaultResourceLoader,\n\tpromptsResult: { prompts: PromptTemplate[]; diagnostics: ResourceDiagnostic[] },\n\tmetadataByPath?: Map<string, PathMetadata>,\n): void {\n\tconst state = resourceInternals(loader);\n\tconst resolvedPrompts = state.promptsOverride ? state.promptsOverride(promptsResult) : promptsResult;\n\tstate.prompts = resolvedPrompts.prompts.map((prompt) => ({\n\t\t...prompt,\n\t\tsourceInfo:\n\t\t\tfindSourceInfoForPath(loader, prompt.filePath, state.extensionPromptSourceInfos, metadataByPath) ??\n\t\t\tprompt.sourceInfo ??\n\t\t\tgetDefaultSourceInfoForPath(loader, prompt.filePath),\n\t}));\n\tstate.promptDiagnostics = resolvedPrompts.diagnostics;\n}\n\nexport async function updatePromptsFromPathsAsync(\n\tloader: DefaultResourceLoader,\n\tpromptPaths: string[],\n\tmetadataByPath?: Map<string, PathMetadata>,\n): Promise<void> {\n\tconst state = resourceInternals(loader);\n\tconst promptsResult = state.noPromptTemplates && promptPaths.length === 0\n\t\t? { prompts: [], diagnostics: [] }\n\t\t: dedupePrompts(await loadPromptTemplatesAsync({ cwd: state.cwd, agentDir: state.agentDir, promptPaths, includeDefaults: false }));\n\tapplyPromptsResult(loader, promptsResult, metadataByPath);\n}\n\nfunction applyThemesResult(\n\tloader: DefaultResourceLoader,\n\tthemesResult: { themes: Theme[]; diagnostics: ResourceDiagnostic[] },\n\tmetadataByPath?: Map<string, PathMetadata>,\n): void {\n\tconst state = resourceInternals(loader);\n\tconst resolvedThemes = state.themesOverride ? state.themesOverride(themesResult) : themesResult;\n\tstate.themes = resolvedThemes.themes.map((theme) => {\n\t\tconst sourcePath = theme.sourcePath;\n\t\ttheme.sourceInfo = sourcePath\n\t\t\t? (findSourceInfoForPath(loader, sourcePath, state.extensionThemeSourceInfos, metadataByPath) ??\n\t\t\t\ttheme.sourceInfo ??\n\t\t\t\tgetDefaultSourceInfoForPath(loader, sourcePath))\n\t\t\t: theme.sourceInfo;\n\t\treturn theme;\n\t});\n\tstate.themeDiagnostics = resolvedThemes.diagnostics;\n}\n\nexport async function updateThemesFromPathsAsync(\n\tloader: DefaultResourceLoader,\n\tthemePaths: string[],\n\tmetadataByPath?: Map<string, PathMetadata>,\n): Promise<void> {\n\tconst state = resourceInternals(loader);\n\tconst themesResult = state.noThemes && themePaths.length === 0\n\t\t? { themes: [], diagnostics: [] }\n\t\t: loadAndDedupeThemes(await loadThemesAsync(loader, themePaths, false));\n\tapplyThemesResult(loader, themesResult, metadataByPath);\n}\n\nfunction loadAndDedupeThemes(loaded: { themes: Theme[]; diagnostics: ResourceDiagnostic[] }): { themes: Theme[]; diagnostics: ResourceDiagnostic[] } {\n\tconst deduped = dedupeThemes(loaded.themes);\n\treturn { themes: deduped.themes, diagnostics: [...loaded.diagnostics, ...deduped.diagnostics] };\n}\n\n\nasync function loadThemesAsync(loader: DefaultResourceLoader, paths: string[], includeDefaults = true): Promise<{ themes: Theme[]; diagnostics: ResourceDiagnostic[] }> {\n\tconst state = resourceInternals(loader);\n\tconst themes: Theme[] = [];\n\tconst diagnostics: ResourceDiagnostic[] = [];\n\tif (includeDefaults) {\n\t\tfor (const dir of [...getLoaderAgentDirs(state.agentDir).map((agentDir) => join(agentDir, \"themes\")), ...getProjectThemeDirs(state.cwd)]) {\n\t\t\tawait loadThemesFromDirAsync(dir, themes, diagnostics);\n\t\t}\n\t}\n\tconst startedAt = Date.now();\n\tfor (const p of paths) {\n\t\tawait yieldToEventLoopIfSlow(startedAt, RESOURCE_LOAD_YIELD_AFTER_MS);\n\t\tconst resolved = resolveResourcePath(state.cwd, p);\n\t\tif (!(await existsAsync(resolved))) {\n\t\t\tdiagnostics.push({ type: \"warning\", message: \"theme path does not exist\", path: resolved });\n\t\t\tcontinue;\n\t\t}\n\t\ttry {\n\t\t\tconst stats = await stat(resolved);\n\t\t\tif (stats.isDirectory()) await loadThemesFromDirAsync(resolved, themes, diagnostics);\n\t\t\telse if (stats.isFile() && resolved.endsWith(\".json\")) await loadThemeFromFileAsync(resolved, themes, diagnostics);\n\t\t\telse diagnostics.push({ type: \"warning\", message: \"theme path is not a json file\", path: resolved });\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"failed to read theme path\";\n\t\t\tdiagnostics.push({ type: \"warning\", message, path: resolved });\n\t\t}\n\t}\n\treturn { themes, diagnostics };\n}\n\nfunction getProjectThemeDirs(cwd: string): string[] {\n\treturn getProjectConfigDirs(cwd).map((configDir) => join(configDir, \"themes\"));\n}\n\n\nasync function loadThemesFromDirAsync(dir: string, themes: Theme[], diagnostics: ResourceDiagnostic[]): Promise<void> {\n\tif (!(await existsAsync(dir))) return;\n\tconst startedAt = Date.now();\n\ttry {\n\t\tconst entries = await readdir(dir, { withFileTypes: true });\n\t\tfor (const entry of entries) {\n\t\t\tawait yieldToEventLoopIfSlow(startedAt, RESOURCE_LOAD_YIELD_AFTER_MS);\n\t\t\tlet isFile = entry.isFile();\n\t\t\tif (entry.isSymbolicLink()) {\n\t\t\t\ttry { isFile = (await stat(join(dir, entry.name))).isFile(); } catch { continue; }\n\t\t\t}\n\t\t\tif (isFile && entry.name.endsWith(\".json\")) await loadThemeFromFileAsync(join(dir, entry.name), themes, diagnostics);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"failed to read theme directory\";\n\t\tdiagnostics.push({ type: \"warning\", message, path: dir });\n\t}\n}\n\n\nasync function loadThemeFromFileAsync(filePath: string, themes: Theme[], diagnostics: ResourceDiagnostic[]): Promise<void> {\n\ttry { themes.push(loadThemeFromContent(filePath, await readFile(filePath, \"utf-8\"))); }\n\tcatch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"failed to load theme\";\n\t\tdiagnostics.push({ type: \"warning\", message, path: filePath });\n\t}\n}\n\nfunction dedupePrompts(prompts: PromptTemplate[]): { prompts: PromptTemplate[]; diagnostics: ResourceDiagnostic[] } {\n\tconst seen = new Map<string, PromptTemplate>();\n\tconst diagnostics: ResourceDiagnostic[] = [];\n\tfor (const prompt of prompts) {\n\t\tconst existing = seen.get(prompt.name);\n\t\tif (existing) {\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"collision\",\n\t\t\t\tmessage: `name \"/${prompt.name}\" collision`,\n\t\t\t\tpath: prompt.filePath,\n\t\t\t\tcollision: { resourceType: \"prompt\", name: prompt.name, winnerPath: existing.filePath, loserPath: prompt.filePath },\n\t\t\t});\n\t\t} else {\n\t\t\tseen.set(prompt.name, prompt);\n\t\t}\n\t}\n\treturn { prompts: Array.from(seen.values()), diagnostics };\n}\n\nfunction dedupeThemes(themes: Theme[]): { themes: Theme[]; diagnostics: ResourceDiagnostic[] } {\n\tconst seen = new Map<string, Theme>();\n\tconst diagnostics: ResourceDiagnostic[] = [];\n\tfor (const t of themes) {\n\t\tconst name = t.name ?? \"unnamed\";\n\t\tconst existing = seen.get(name);\n\t\tif (existing) {\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"collision\",\n\t\t\t\tmessage: `name \"${name}\" collision`,\n\t\t\t\tpath: t.sourcePath,\n\t\t\t\tcollision: { resourceType: \"theme\", name, winnerPath: existing.sourcePath ?? \"<builtin>\", loserPath: t.sourcePath ?? \"<builtin>\" },\n\t\t\t});\n\t\t} else {\n\t\t\tseen.set(name, t);\n\t\t}\n\t}\n\treturn { themes: Array.from(seen.values()), diagnostics };\n}\n"]}
@@ -1,26 +1,25 @@
1
- import { existsSync, readdirSync, statSync } from "node:fs";
1
+ import { access, readdir, readFile, stat } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
3
  import { getProjectConfigDirs } from "../config.js";
4
- import { loadThemeFromPath } from "../modes/interactive/theme/theme.js";
5
- import { loadPromptTemplates } from "./prompt-templates.js";
6
- import { loadSkills } from "./skills.js";
4
+ import { loadThemeFromContent } from "../modes/interactive/theme/theme.js";
5
+ import { yieldToEventLoopIfSlow } from "../utils/event-loop.js";
6
+ import { loadPromptTemplatesAsync } from "./prompt-templates-async.js";
7
+ import { loadSkillsAsync } from "./skills-async.js";
7
8
  import { resourceInternals } from "./resource-loader-internals.js";
8
9
  import { getLoaderAgentDirs, resolveResourcePath } from "./resource-loader-paths.js";
9
10
  import { findSourceInfoForPath, getDefaultSourceInfoForPath } from "./resource-loader-source-info.js";
10
- export function updateSkillsFromPaths(loader, skillPaths, metadataByPath) {
11
- const state = resourceInternals(loader);
12
- let skillsResult;
13
- if (state.noSkills && skillPaths.length === 0) {
14
- skillsResult = { skills: [], diagnostics: [] };
11
+ const RESOURCE_LOAD_YIELD_AFTER_MS = 8;
12
+ async function existsAsync(path) {
13
+ try {
14
+ await access(path);
15
+ return true;
15
16
  }
16
- else {
17
- skillsResult = loadSkills({
18
- cwd: state.cwd,
19
- agentDir: state.agentDir,
20
- skillPaths,
21
- includeDefaults: false,
22
- });
17
+ catch {
18
+ return false;
23
19
  }
20
+ }
21
+ function applySkillsResult(loader, skillsResult, metadataByPath) {
22
+ const state = resourceInternals(loader);
24
23
  const resolvedSkills = state.skillsOverride ? state.skillsOverride(skillsResult) : skillsResult;
25
24
  state.skills = resolvedSkills.skills.map((skill) => ({
26
25
  ...skill,
@@ -30,21 +29,15 @@ export function updateSkillsFromPaths(loader, skillPaths, metadataByPath) {
30
29
  }));
31
30
  state.skillDiagnostics = resolvedSkills.diagnostics;
32
31
  }
33
- export function updatePromptsFromPaths(loader, promptPaths, metadataByPath) {
32
+ export async function updateSkillsFromPathsAsync(loader, skillPaths, metadataByPath) {
33
+ const state = resourceInternals(loader);
34
+ const skillsResult = state.noSkills && skillPaths.length === 0
35
+ ? { skills: [], diagnostics: [] }
36
+ : await loadSkillsAsync({ cwd: state.cwd, agentDir: state.agentDir, skillPaths, includeDefaults: false });
37
+ applySkillsResult(loader, skillsResult, metadataByPath);
38
+ }
39
+ function applyPromptsResult(loader, promptsResult, metadataByPath) {
34
40
  const state = resourceInternals(loader);
35
- let promptsResult;
36
- if (state.noPromptTemplates && promptPaths.length === 0) {
37
- promptsResult = { prompts: [], diagnostics: [] };
38
- }
39
- else {
40
- const allPrompts = loadPromptTemplates({
41
- cwd: state.cwd,
42
- agentDir: state.agentDir,
43
- promptPaths,
44
- includeDefaults: false,
45
- });
46
- promptsResult = dedupePrompts(allPrompts);
47
- }
48
41
  const resolvedPrompts = state.promptsOverride ? state.promptsOverride(promptsResult) : promptsResult;
49
42
  state.prompts = resolvedPrompts.prompts.map((prompt) => ({
50
43
  ...prompt,
@@ -54,17 +47,15 @@ export function updatePromptsFromPaths(loader, promptPaths, metadataByPath) {
54
47
  }));
55
48
  state.promptDiagnostics = resolvedPrompts.diagnostics;
56
49
  }
57
- export function updateThemesFromPaths(loader, themePaths, metadataByPath) {
50
+ export async function updatePromptsFromPathsAsync(loader, promptPaths, metadataByPath) {
51
+ const state = resourceInternals(loader);
52
+ const promptsResult = state.noPromptTemplates && promptPaths.length === 0
53
+ ? { prompts: [], diagnostics: [] }
54
+ : dedupePrompts(await loadPromptTemplatesAsync({ cwd: state.cwd, agentDir: state.agentDir, promptPaths, includeDefaults: false }));
55
+ applyPromptsResult(loader, promptsResult, metadataByPath);
56
+ }
57
+ function applyThemesResult(loader, themesResult, metadataByPath) {
58
58
  const state = resourceInternals(loader);
59
- let themesResult;
60
- if (state.noThemes && themePaths.length === 0) {
61
- themesResult = { themes: [], diagnostics: [] };
62
- }
63
- else {
64
- const loaded = loadThemes(loader, themePaths, false);
65
- const deduped = dedupeThemes(loaded.themes);
66
- themesResult = { themes: deduped.themes, diagnostics: [...loaded.diagnostics, ...deduped.diagnostics] };
67
- }
68
59
  const resolvedThemes = state.themesOverride ? state.themesOverride(themesResult) : themesResult;
69
60
  state.themes = resolvedThemes.themes.map((theme) => {
70
61
  const sourcePath = theme.sourcePath;
@@ -77,36 +68,42 @@ export function updateThemesFromPaths(loader, themePaths, metadataByPath) {
77
68
  });
78
69
  state.themeDiagnostics = resolvedThemes.diagnostics;
79
70
  }
80
- function loadThemes(loader, paths, includeDefaults = true) {
71
+ export async function updateThemesFromPathsAsync(loader, themePaths, metadataByPath) {
72
+ const state = resourceInternals(loader);
73
+ const themesResult = state.noThemes && themePaths.length === 0
74
+ ? { themes: [], diagnostics: [] }
75
+ : loadAndDedupeThemes(await loadThemesAsync(loader, themePaths, false));
76
+ applyThemesResult(loader, themesResult, metadataByPath);
77
+ }
78
+ function loadAndDedupeThemes(loaded) {
79
+ const deduped = dedupeThemes(loaded.themes);
80
+ return { themes: deduped.themes, diagnostics: [...loaded.diagnostics, ...deduped.diagnostics] };
81
+ }
82
+ async function loadThemesAsync(loader, paths, includeDefaults = true) {
81
83
  const state = resourceInternals(loader);
82
84
  const themes = [];
83
85
  const diagnostics = [];
84
86
  if (includeDefaults) {
85
- const defaultDirs = [
86
- ...getLoaderAgentDirs(state.agentDir).map((agentDir) => join(agentDir, "themes")),
87
- ...getProjectThemeDirs(state.cwd),
88
- ];
89
- for (const dir of defaultDirs) {
90
- loadThemesFromDir(dir, themes, diagnostics);
87
+ for (const dir of [...getLoaderAgentDirs(state.agentDir).map((agentDir) => join(agentDir, "themes")), ...getProjectThemeDirs(state.cwd)]) {
88
+ await loadThemesFromDirAsync(dir, themes, diagnostics);
91
89
  }
92
90
  }
91
+ const startedAt = Date.now();
93
92
  for (const p of paths) {
93
+ await yieldToEventLoopIfSlow(startedAt, RESOURCE_LOAD_YIELD_AFTER_MS);
94
94
  const resolved = resolveResourcePath(state.cwd, p);
95
- if (!existsSync(resolved)) {
95
+ if (!(await existsAsync(resolved))) {
96
96
  diagnostics.push({ type: "warning", message: "theme path does not exist", path: resolved });
97
97
  continue;
98
98
  }
99
99
  try {
100
- const stats = statSync(resolved);
101
- if (stats.isDirectory()) {
102
- loadThemesFromDir(resolved, themes, diagnostics);
103
- }
104
- else if (stats.isFile() && resolved.endsWith(".json")) {
105
- loadThemeFromFile(resolved, themes, diagnostics);
106
- }
107
- else {
100
+ const stats = await stat(resolved);
101
+ if (stats.isDirectory())
102
+ await loadThemesFromDirAsync(resolved, themes, diagnostics);
103
+ else if (stats.isFile() && resolved.endsWith(".json"))
104
+ await loadThemeFromFileAsync(resolved, themes, diagnostics);
105
+ else
108
106
  diagnostics.push({ type: "warning", message: "theme path is not a json file", path: resolved });
109
- }
110
107
  }
111
108
  catch (error) {
112
109
  const message = error instanceof Error ? error.message : "failed to read theme path";
@@ -118,29 +115,25 @@ function loadThemes(loader, paths, includeDefaults = true) {
118
115
  function getProjectThemeDirs(cwd) {
119
116
  return getProjectConfigDirs(cwd).map((configDir) => join(configDir, "themes"));
120
117
  }
121
- function loadThemesFromDir(dir, themes, diagnostics) {
122
- if (!existsSync(dir)) {
118
+ async function loadThemesFromDirAsync(dir, themes, diagnostics) {
119
+ if (!(await existsAsync(dir)))
123
120
  return;
124
- }
121
+ const startedAt = Date.now();
125
122
  try {
126
- const entries = readdirSync(dir, { withFileTypes: true });
123
+ const entries = await readdir(dir, { withFileTypes: true });
127
124
  for (const entry of entries) {
125
+ await yieldToEventLoopIfSlow(startedAt, RESOURCE_LOAD_YIELD_AFTER_MS);
128
126
  let isFile = entry.isFile();
129
127
  if (entry.isSymbolicLink()) {
130
128
  try {
131
- isFile = statSync(join(dir, entry.name)).isFile();
129
+ isFile = (await stat(join(dir, entry.name))).isFile();
132
130
  }
133
131
  catch {
134
132
  continue;
135
133
  }
136
134
  }
137
- if (!isFile) {
138
- continue;
139
- }
140
- if (!entry.name.endsWith(".json")) {
141
- continue;
142
- }
143
- loadThemeFromFile(join(dir, entry.name), themes, diagnostics);
135
+ if (isFile && entry.name.endsWith(".json"))
136
+ await loadThemeFromFileAsync(join(dir, entry.name), themes, diagnostics);
144
137
  }
145
138
  }
146
139
  catch (error) {
@@ -148,9 +141,9 @@ function loadThemesFromDir(dir, themes, diagnostics) {
148
141
  diagnostics.push({ type: "warning", message, path: dir });
149
142
  }
150
143
  }
151
- function loadThemeFromFile(filePath, themes, diagnostics) {
144
+ async function loadThemeFromFileAsync(filePath, themes, diagnostics) {
152
145
  try {
153
- themes.push(loadThemeFromPath(filePath));
146
+ themes.push(loadThemeFromContent(filePath, await readFile(filePath, "utf-8")));
154
147
  }
155
148
  catch (error) {
156
149
  const message = error instanceof Error ? error.message : "failed to load theme";
@@ -167,12 +160,7 @@ function dedupePrompts(prompts) {
167
160
  type: "collision",
168
161
  message: `name "/${prompt.name}" collision`,
169
162
  path: prompt.filePath,
170
- collision: {
171
- resourceType: "prompt",
172
- name: prompt.name,
173
- winnerPath: existing.filePath,
174
- loserPath: prompt.filePath,
175
- },
163
+ collision: { resourceType: "prompt", name: prompt.name, winnerPath: existing.filePath, loserPath: prompt.filePath },
176
164
  });
177
165
  }
178
166
  else {
@@ -192,12 +180,7 @@ function dedupeThemes(themes) {
192
180
  type: "collision",
193
181
  message: `name "${name}" collision`,
194
182
  path: t.sourcePath,
195
- collision: {
196
- resourceType: "theme",
197
- name,
198
- winnerPath: existing.sourcePath ?? "<builtin>",
199
- loserPath: t.sourcePath ?? "<builtin>",
200
- },
183
+ collision: { resourceType: "theme", name, winnerPath: existing.sourcePath ?? "<builtin>", loserPath: t.sourcePath ?? "<builtin>" },
201
184
  });
202
185
  }
203
186
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"resource-loader-assets.js","sourceRoot":"","sources":["../../src/core/resource-loader-assets.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getProjectConfigDirs } from \"../config.ts\";\nimport { loadThemeFromPath, type Theme } from \"../modes/interactive/theme/theme.ts\";\nimport type { ResourceDiagnostic } from \"./diagnostics.ts\";\nimport type { PathMetadata } from \"./package-manager.ts\";\nimport type { PromptTemplate } from \"./prompt-templates.ts\";\nimport { loadPromptTemplates } from \"./prompt-templates.ts\";\nimport type { Skill } from \"./skills.ts\";\nimport { loadSkills } from \"./skills.ts\";\nimport { resourceInternals } from \"./resource-loader-internals.ts\";\nimport { getLoaderAgentDirs, resolveResourcePath } from \"./resource-loader-paths.ts\";\nimport type { DefaultResourceLoader } from \"./resource-loader-core.ts\";\nimport { findSourceInfoForPath, getDefaultSourceInfoForPath } from \"./resource-loader-source-info.ts\";\n\nexport function updateSkillsFromPaths(\n\tloader: DefaultResourceLoader,\n\tskillPaths: string[],\n\tmetadataByPath?: Map<string, PathMetadata>,\n): void {\n\tconst state = resourceInternals(loader);\n\tlet skillsResult: { skills: Skill[]; diagnostics: ResourceDiagnostic[] };\n\tif (state.noSkills && skillPaths.length === 0) {\n\t\tskillsResult = { skills: [], diagnostics: [] };\n\t} else {\n\t\tskillsResult = loadSkills({\n\t\t\tcwd: state.cwd,\n\t\t\tagentDir: state.agentDir,\n\t\t\tskillPaths,\n\t\t\tincludeDefaults: false,\n\t\t});\n\t}\n\tconst resolvedSkills = state.skillsOverride ? state.skillsOverride(skillsResult) : skillsResult;\n\tstate.skills = resolvedSkills.skills.map((skill) => ({\n\t\t...skill,\n\t\tsourceInfo:\n\t\t\tfindSourceInfoForPath(loader, skill.filePath, state.extensionSkillSourceInfos, metadataByPath) ??\n\t\t\tskill.sourceInfo ??\n\t\t\tgetDefaultSourceInfoForPath(loader, skill.filePath),\n\t}));\n\tstate.skillDiagnostics = resolvedSkills.diagnostics;\n}\n\nexport function updatePromptsFromPaths(\n\tloader: DefaultResourceLoader,\n\tpromptPaths: string[],\n\tmetadataByPath?: Map<string, PathMetadata>,\n): void {\n\tconst state = resourceInternals(loader);\n\tlet promptsResult: { prompts: PromptTemplate[]; diagnostics: ResourceDiagnostic[] };\n\tif (state.noPromptTemplates && promptPaths.length === 0) {\n\t\tpromptsResult = { prompts: [], diagnostics: [] };\n\t} else {\n\t\tconst allPrompts = loadPromptTemplates({\n\t\t\tcwd: state.cwd,\n\t\t\tagentDir: state.agentDir,\n\t\t\tpromptPaths,\n\t\t\tincludeDefaults: false,\n\t\t});\n\t\tpromptsResult = dedupePrompts(allPrompts);\n\t}\n\tconst resolvedPrompts = state.promptsOverride ? state.promptsOverride(promptsResult) : promptsResult;\n\tstate.prompts = resolvedPrompts.prompts.map((prompt) => ({\n\t\t...prompt,\n\t\tsourceInfo:\n\t\t\tfindSourceInfoForPath(loader, prompt.filePath, state.extensionPromptSourceInfos, metadataByPath) ??\n\t\t\tprompt.sourceInfo ??\n\t\t\tgetDefaultSourceInfoForPath(loader, prompt.filePath),\n\t}));\n\tstate.promptDiagnostics = resolvedPrompts.diagnostics;\n}\n\nexport function updateThemesFromPaths(\n\tloader: DefaultResourceLoader,\n\tthemePaths: string[],\n\tmetadataByPath?: Map<string, PathMetadata>,\n): void {\n\tconst state = resourceInternals(loader);\n\tlet themesResult: { themes: Theme[]; diagnostics: ResourceDiagnostic[] };\n\tif (state.noThemes && themePaths.length === 0) {\n\t\tthemesResult = { themes: [], diagnostics: [] };\n\t} else {\n\t\tconst loaded = loadThemes(loader, themePaths, false);\n\t\tconst deduped = dedupeThemes(loaded.themes);\n\t\tthemesResult = { themes: deduped.themes, diagnostics: [...loaded.diagnostics, ...deduped.diagnostics] };\n\t}\n\tconst resolvedThemes = state.themesOverride ? state.themesOverride(themesResult) : themesResult;\n\tstate.themes = resolvedThemes.themes.map((theme) => {\n\t\tconst sourcePath = theme.sourcePath;\n\t\ttheme.sourceInfo = sourcePath\n\t\t\t? (findSourceInfoForPath(loader, sourcePath, state.extensionThemeSourceInfos, metadataByPath) ??\n\t\t\t\ttheme.sourceInfo ??\n\t\t\t\tgetDefaultSourceInfoForPath(loader, sourcePath))\n\t\t\t: theme.sourceInfo;\n\t\treturn theme;\n\t});\n\tstate.themeDiagnostics = resolvedThemes.diagnostics;\n}\n\nfunction loadThemes(\n\tloader: DefaultResourceLoader,\n\tpaths: string[],\n\tincludeDefaults = true,\n): {\n\tthemes: Theme[];\n\tdiagnostics: ResourceDiagnostic[];\n} {\n\tconst state = resourceInternals(loader);\n\tconst themes: Theme[] = [];\n\tconst diagnostics: ResourceDiagnostic[] = [];\n\tif (includeDefaults) {\n\t\tconst defaultDirs = [\n\t\t\t...getLoaderAgentDirs(state.agentDir).map((agentDir) => join(agentDir, \"themes\")),\n\t\t\t...getProjectThemeDirs(state.cwd),\n\t\t];\n\n\t\tfor (const dir of defaultDirs) {\n\t\t\tloadThemesFromDir(dir, themes, diagnostics);\n\t\t}\n\t}\n\n\tfor (const p of paths) {\n\t\tconst resolved = resolveResourcePath(state.cwd, p);\n\t\tif (!existsSync(resolved)) {\n\t\t\tdiagnostics.push({ type: \"warning\", message: \"theme path does not exist\", path: resolved });\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\tconst stats = statSync(resolved);\n\t\t\tif (stats.isDirectory()) {\n\t\t\t\tloadThemesFromDir(resolved, themes, diagnostics);\n\t\t\t} else if (stats.isFile() && resolved.endsWith(\".json\")) {\n\t\t\t\tloadThemeFromFile(resolved, themes, diagnostics);\n\t\t\t} else {\n\t\t\t\tdiagnostics.push({ type: \"warning\", message: \"theme path is not a json file\", path: resolved });\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"failed to read theme path\";\n\t\t\tdiagnostics.push({ type: \"warning\", message, path: resolved });\n\t\t}\n\t}\n\n\treturn { themes, diagnostics };\n}\n\nfunction getProjectThemeDirs(cwd: string): string[] {\n\treturn getProjectConfigDirs(cwd).map((configDir) => join(configDir, \"themes\"));\n}\n\nfunction loadThemesFromDir(dir: string, themes: Theme[], diagnostics: ResourceDiagnostic[]): void {\n\tif (!existsSync(dir)) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst entries = readdirSync(dir, { withFileTypes: true });\n\t\tfor (const entry of entries) {\n\t\t\tlet isFile = entry.isFile();\n\t\t\tif (entry.isSymbolicLink()) {\n\t\t\t\ttry {\n\t\t\t\t\tisFile = statSync(join(dir, entry.name)).isFile();\n\t\t\t\t} catch {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!isFile) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!entry.name.endsWith(\".json\")) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tloadThemeFromFile(join(dir, entry.name), themes, diagnostics);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"failed to read theme directory\";\n\t\tdiagnostics.push({ type: \"warning\", message, path: dir });\n\t}\n}\n\nfunction loadThemeFromFile(filePath: string, themes: Theme[], diagnostics: ResourceDiagnostic[]): void {\n\ttry {\n\t\tthemes.push(loadThemeFromPath(filePath));\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"failed to load theme\";\n\t\tdiagnostics.push({ type: \"warning\", message, path: filePath });\n\t}\n}\n\nfunction dedupePrompts(prompts: PromptTemplate[]): { prompts: PromptTemplate[]; diagnostics: ResourceDiagnostic[] } {\n\tconst seen = new Map<string, PromptTemplate>();\n\tconst diagnostics: ResourceDiagnostic[] = [];\n\n\tfor (const prompt of prompts) {\n\t\tconst existing = seen.get(prompt.name);\n\t\tif (existing) {\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"collision\",\n\t\t\t\tmessage: `name \"/${prompt.name}\" collision`,\n\t\t\t\tpath: prompt.filePath,\n\t\t\t\tcollision: {\n\t\t\t\t\tresourceType: \"prompt\",\n\t\t\t\t\tname: prompt.name,\n\t\t\t\t\twinnerPath: existing.filePath,\n\t\t\t\t\tloserPath: prompt.filePath,\n\t\t\t\t},\n\t\t\t});\n\t\t} else {\n\t\t\tseen.set(prompt.name, prompt);\n\t\t}\n\t}\n\n\treturn { prompts: Array.from(seen.values()), diagnostics };\n}\n\nfunction dedupeThemes(themes: Theme[]): { themes: Theme[]; diagnostics: ResourceDiagnostic[] } {\n\tconst seen = new Map<string, Theme>();\n\tconst diagnostics: ResourceDiagnostic[] = [];\n\n\tfor (const t of themes) {\n\t\tconst name = t.name ?? \"unnamed\";\n\t\tconst existing = seen.get(name);\n\t\tif (existing) {\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"collision\",\n\t\t\t\tmessage: `name \"${name}\" collision`,\n\t\t\t\tpath: t.sourcePath,\n\t\t\t\tcollision: {\n\t\t\t\t\tresourceType: \"theme\",\n\t\t\t\t\tname,\n\t\t\t\t\twinnerPath: existing.sourcePath ?? \"<builtin>\",\n\t\t\t\t\tloserPath: t.sourcePath ?? \"<builtin>\",\n\t\t\t\t},\n\t\t\t});\n\t\t} else {\n\t\t\tseen.set(name, t);\n\t\t}\n\t}\n\n\treturn { themes: Array.from(seen.values()), diagnostics };\n}\n"]}
1
+ {"version":3,"file":"resource-loader-assets.js","sourceRoot":"","sources":["../../src/core/resource-loader-assets.ts"],"names":[],"mappings":"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","sourcesContent":["import { access, readdir, readFile, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getProjectConfigDirs } from \"../config.ts\";\nimport { loadThemeFromContent, type Theme } from \"../modes/interactive/theme/theme.ts\";\nimport { yieldToEventLoopIfSlow } from \"../utils/event-loop.ts\";\nimport type { ResourceDiagnostic } from \"./diagnostics.ts\";\nimport type { PathMetadata } from \"./package-manager.ts\";\nimport type { PromptTemplate } from \"./prompt-templates.ts\";\nimport { loadPromptTemplatesAsync } from \"./prompt-templates-async.ts\";\nimport type { Skill } from \"./skills.ts\";\nimport { loadSkillsAsync } from \"./skills-async.ts\";\nimport type { DefaultResourceLoader } from \"./resource-loader-core.ts\";\nimport { resourceInternals } from \"./resource-loader-internals.ts\";\nimport { getLoaderAgentDirs, resolveResourcePath } from \"./resource-loader-paths.ts\";\nimport { findSourceInfoForPath, getDefaultSourceInfoForPath } from \"./resource-loader-source-info.ts\";\n\nconst RESOURCE_LOAD_YIELD_AFTER_MS = 8;\n\nasync function existsAsync(path: string): Promise<boolean> {\n\ttry { await access(path); return true; } catch { return false; }\n}\n\nfunction applySkillsResult(\n\tloader: DefaultResourceLoader,\n\tskillsResult: { skills: Skill[]; diagnostics: ResourceDiagnostic[] },\n\tmetadataByPath?: Map<string, PathMetadata>,\n): void {\n\tconst state = resourceInternals(loader);\n\tconst resolvedSkills = state.skillsOverride ? state.skillsOverride(skillsResult) : skillsResult;\n\tstate.skills = resolvedSkills.skills.map((skill) => ({\n\t\t...skill,\n\t\tsourceInfo:\n\t\t\tfindSourceInfoForPath(loader, skill.filePath, state.extensionSkillSourceInfos, metadataByPath) ??\n\t\t\tskill.sourceInfo ??\n\t\t\tgetDefaultSourceInfoForPath(loader, skill.filePath),\n\t}));\n\tstate.skillDiagnostics = resolvedSkills.diagnostics;\n}\n\nexport async function updateSkillsFromPathsAsync(\n\tloader: DefaultResourceLoader,\n\tskillPaths: string[],\n\tmetadataByPath?: Map<string, PathMetadata>,\n): Promise<void> {\n\tconst state = resourceInternals(loader);\n\tconst skillsResult = state.noSkills && skillPaths.length === 0\n\t\t? { skills: [], diagnostics: [] }\n\t\t: await loadSkillsAsync({ cwd: state.cwd, agentDir: state.agentDir, skillPaths, includeDefaults: false });\n\tapplySkillsResult(loader, skillsResult, metadataByPath);\n}\n\nfunction applyPromptsResult(\n\tloader: DefaultResourceLoader,\n\tpromptsResult: { prompts: PromptTemplate[]; diagnostics: ResourceDiagnostic[] },\n\tmetadataByPath?: Map<string, PathMetadata>,\n): void {\n\tconst state = resourceInternals(loader);\n\tconst resolvedPrompts = state.promptsOverride ? state.promptsOverride(promptsResult) : promptsResult;\n\tstate.prompts = resolvedPrompts.prompts.map((prompt) => ({\n\t\t...prompt,\n\t\tsourceInfo:\n\t\t\tfindSourceInfoForPath(loader, prompt.filePath, state.extensionPromptSourceInfos, metadataByPath) ??\n\t\t\tprompt.sourceInfo ??\n\t\t\tgetDefaultSourceInfoForPath(loader, prompt.filePath),\n\t}));\n\tstate.promptDiagnostics = resolvedPrompts.diagnostics;\n}\n\nexport async function updatePromptsFromPathsAsync(\n\tloader: DefaultResourceLoader,\n\tpromptPaths: string[],\n\tmetadataByPath?: Map<string, PathMetadata>,\n): Promise<void> {\n\tconst state = resourceInternals(loader);\n\tconst promptsResult = state.noPromptTemplates && promptPaths.length === 0\n\t\t? { prompts: [], diagnostics: [] }\n\t\t: dedupePrompts(await loadPromptTemplatesAsync({ cwd: state.cwd, agentDir: state.agentDir, promptPaths, includeDefaults: false }));\n\tapplyPromptsResult(loader, promptsResult, metadataByPath);\n}\n\nfunction applyThemesResult(\n\tloader: DefaultResourceLoader,\n\tthemesResult: { themes: Theme[]; diagnostics: ResourceDiagnostic[] },\n\tmetadataByPath?: Map<string, PathMetadata>,\n): void {\n\tconst state = resourceInternals(loader);\n\tconst resolvedThemes = state.themesOverride ? state.themesOverride(themesResult) : themesResult;\n\tstate.themes = resolvedThemes.themes.map((theme) => {\n\t\tconst sourcePath = theme.sourcePath;\n\t\ttheme.sourceInfo = sourcePath\n\t\t\t? (findSourceInfoForPath(loader, sourcePath, state.extensionThemeSourceInfos, metadataByPath) ??\n\t\t\t\ttheme.sourceInfo ??\n\t\t\t\tgetDefaultSourceInfoForPath(loader, sourcePath))\n\t\t\t: theme.sourceInfo;\n\t\treturn theme;\n\t});\n\tstate.themeDiagnostics = resolvedThemes.diagnostics;\n}\n\nexport async function updateThemesFromPathsAsync(\n\tloader: DefaultResourceLoader,\n\tthemePaths: string[],\n\tmetadataByPath?: Map<string, PathMetadata>,\n): Promise<void> {\n\tconst state = resourceInternals(loader);\n\tconst themesResult = state.noThemes && themePaths.length === 0\n\t\t? { themes: [], diagnostics: [] }\n\t\t: loadAndDedupeThemes(await loadThemesAsync(loader, themePaths, false));\n\tapplyThemesResult(loader, themesResult, metadataByPath);\n}\n\nfunction loadAndDedupeThemes(loaded: { themes: Theme[]; diagnostics: ResourceDiagnostic[] }): { themes: Theme[]; diagnostics: ResourceDiagnostic[] } {\n\tconst deduped = dedupeThemes(loaded.themes);\n\treturn { themes: deduped.themes, diagnostics: [...loaded.diagnostics, ...deduped.diagnostics] };\n}\n\n\nasync function loadThemesAsync(loader: DefaultResourceLoader, paths: string[], includeDefaults = true): Promise<{ themes: Theme[]; diagnostics: ResourceDiagnostic[] }> {\n\tconst state = resourceInternals(loader);\n\tconst themes: Theme[] = [];\n\tconst diagnostics: ResourceDiagnostic[] = [];\n\tif (includeDefaults) {\n\t\tfor (const dir of [...getLoaderAgentDirs(state.agentDir).map((agentDir) => join(agentDir, \"themes\")), ...getProjectThemeDirs(state.cwd)]) {\n\t\t\tawait loadThemesFromDirAsync(dir, themes, diagnostics);\n\t\t}\n\t}\n\tconst startedAt = Date.now();\n\tfor (const p of paths) {\n\t\tawait yieldToEventLoopIfSlow(startedAt, RESOURCE_LOAD_YIELD_AFTER_MS);\n\t\tconst resolved = resolveResourcePath(state.cwd, p);\n\t\tif (!(await existsAsync(resolved))) {\n\t\t\tdiagnostics.push({ type: \"warning\", message: \"theme path does not exist\", path: resolved });\n\t\t\tcontinue;\n\t\t}\n\t\ttry {\n\t\t\tconst stats = await stat(resolved);\n\t\t\tif (stats.isDirectory()) await loadThemesFromDirAsync(resolved, themes, diagnostics);\n\t\t\telse if (stats.isFile() && resolved.endsWith(\".json\")) await loadThemeFromFileAsync(resolved, themes, diagnostics);\n\t\t\telse diagnostics.push({ type: \"warning\", message: \"theme path is not a json file\", path: resolved });\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"failed to read theme path\";\n\t\t\tdiagnostics.push({ type: \"warning\", message, path: resolved });\n\t\t}\n\t}\n\treturn { themes, diagnostics };\n}\n\nfunction getProjectThemeDirs(cwd: string): string[] {\n\treturn getProjectConfigDirs(cwd).map((configDir) => join(configDir, \"themes\"));\n}\n\n\nasync function loadThemesFromDirAsync(dir: string, themes: Theme[], diagnostics: ResourceDiagnostic[]): Promise<void> {\n\tif (!(await existsAsync(dir))) return;\n\tconst startedAt = Date.now();\n\ttry {\n\t\tconst entries = await readdir(dir, { withFileTypes: true });\n\t\tfor (const entry of entries) {\n\t\t\tawait yieldToEventLoopIfSlow(startedAt, RESOURCE_LOAD_YIELD_AFTER_MS);\n\t\t\tlet isFile = entry.isFile();\n\t\t\tif (entry.isSymbolicLink()) {\n\t\t\t\ttry { isFile = (await stat(join(dir, entry.name))).isFile(); } catch { continue; }\n\t\t\t}\n\t\t\tif (isFile && entry.name.endsWith(\".json\")) await loadThemeFromFileAsync(join(dir, entry.name), themes, diagnostics);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"failed to read theme directory\";\n\t\tdiagnostics.push({ type: \"warning\", message, path: dir });\n\t}\n}\n\n\nasync function loadThemeFromFileAsync(filePath: string, themes: Theme[], diagnostics: ResourceDiagnostic[]): Promise<void> {\n\ttry { themes.push(loadThemeFromContent(filePath, await readFile(filePath, \"utf-8\"))); }\n\tcatch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"failed to load theme\";\n\t\tdiagnostics.push({ type: \"warning\", message, path: filePath });\n\t}\n}\n\nfunction dedupePrompts(prompts: PromptTemplate[]): { prompts: PromptTemplate[]; diagnostics: ResourceDiagnostic[] } {\n\tconst seen = new Map<string, PromptTemplate>();\n\tconst diagnostics: ResourceDiagnostic[] = [];\n\tfor (const prompt of prompts) {\n\t\tconst existing = seen.get(prompt.name);\n\t\tif (existing) {\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"collision\",\n\t\t\t\tmessage: `name \"/${prompt.name}\" collision`,\n\t\t\t\tpath: prompt.filePath,\n\t\t\t\tcollision: { resourceType: \"prompt\", name: prompt.name, winnerPath: existing.filePath, loserPath: prompt.filePath },\n\t\t\t});\n\t\t} else {\n\t\t\tseen.set(prompt.name, prompt);\n\t\t}\n\t}\n\treturn { prompts: Array.from(seen.values()), diagnostics };\n}\n\nfunction dedupeThemes(themes: Theme[]): { themes: Theme[]; diagnostics: ResourceDiagnostic[] } {\n\tconst seen = new Map<string, Theme>();\n\tconst diagnostics: ResourceDiagnostic[] = [];\n\tfor (const t of themes) {\n\t\tconst name = t.name ?? \"unnamed\";\n\t\tconst existing = seen.get(name);\n\t\tif (existing) {\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"collision\",\n\t\t\t\tmessage: `name \"${name}\" collision`,\n\t\t\t\tpath: t.sourcePath,\n\t\t\t\tcollision: { resourceType: \"theme\", name, winnerPath: existing.sourcePath ?? \"<builtin>\", loserPath: t.sourcePath ?? \"<builtin>\" },\n\t\t\t});\n\t\t} else {\n\t\t\tseen.set(name, t);\n\t\t}\n\t}\n\treturn { themes: Array.from(seen.values()), diagnostics };\n}\n"]}
@@ -75,7 +75,7 @@ export declare class DefaultResourceLoader implements ResourceLoader {
75
75
  getWorkflowResources(): ResolvedResource[];
76
76
  getInheritanceSnapshot(): DefaultResourceLoaderInheritanceSnapshot;
77
77
  refreshWorkflowResources(): Promise<ResolvedResource[]>;
78
- extendResources(paths: ResourceExtensionPaths): void;
78
+ extendResources(paths: ResourceExtensionPaths): Promise<void>;
79
79
  loadProjectTrustExtensions(): Promise<LoadExtensionsResult>;
80
80
  reload(options?: ResourceLoaderReloadOptions): Promise<void>;
81
81
  private touchInternalFieldsForSplit;
@@ -1 +1 @@
1
- {"version":3,"file":"resource-loader-core.d.ts","sourceRoot":"","sources":["../../src/core/resource-loader-core.ts"],"names":[],"mappings":"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","sourcesContent":["import { resolvePath } from \"../utils/paths.ts\";\nimport { createEventBus, type EventBus } from \"./event-bus.ts\";\nimport { createExtensionRuntime } from \"./extensions/loader.ts\";\nimport type { ExtensionFactory, LoadExtensionsResult } from \"./extensions/types.ts\";\nimport { DefaultPackageManager, type ResolvedResource } from \"./package-manager.ts\";\nimport type { PromptTemplate } from \"./prompt-templates.ts\";\nimport { SettingsManager, type PackageSource } from \"./settings-manager.ts\";\nimport type { Skill } from \"./skills.ts\";\nimport type { SourceInfo } from \"./source-info.ts\";\nimport type { ResourceDiagnostic } from \"./diagnostics.ts\";\nimport type { Theme } from \"../modes/interactive/theme/theme.ts\";\nimport { updatePromptsFromPaths, updateSkillsFromPaths, updateThemesFromPaths } from \"./resource-loader-assets.ts\";\nimport { clonePackageSources, mergeInheritedStrings } from \"./resource-loader-helpers.ts\";\nimport {\n\tcollectWorkflowResources,\n\tnormalizeExtensionPaths,\n\trecordExtensionSourceInfo,\n\tresolvePackageResourcePaths,\n} from \"./resource-loader-package-resources.ts\";\nimport { mergeResourcePaths } from \"./resource-loader-paths.ts\";\nimport { loadProjectTrustExtensions, reloadDefaultResourceLoader } from \"./resource-loader-reload.ts\";\nimport type {\n\tDefaultResourceLoaderInheritanceSnapshot,\n\tDefaultResourceLoaderOptions,\n\tResourceExtensionPaths,\n\tResourceLoader,\n\tResourceLoaderReloadOptions,\n} from \"./resource-loader-types.ts\";\n\nexport class DefaultResourceLoader implements ResourceLoader {\n\tprivate cwd: string;\n\tprivate agentDir: string;\n\tprivate settingsManager: SettingsManager;\n\tprivate eventBus: EventBus;\n\tprivate packageManager: DefaultPackageManager;\n\tprivate additionalExtensionPaths: string[];\n\tprivate additionalSkillPaths: string[];\n\tprivate additionalPromptTemplatePaths: string[];\n\tprivate additionalThemePaths: string[];\n\tprivate builtinPackagePaths: PackageSource[];\n\tprivate extensionFactories: ExtensionFactory[];\n\tprivate noExtensions: boolean;\n\tprivate noSkills: boolean;\n\tprivate noPromptTemplates: boolean;\n\tprivate noThemes: boolean;\n\tprivate noContextFiles: boolean;\n\tprivate systemPromptSource?: string;\n\tprivate appendSystemPromptSource?: string[];\n\tprivate extensionsOverride?: (base: LoadExtensionsResult) => LoadExtensionsResult;\n\tprivate skillsOverride?: (base: { skills: Skill[]; diagnostics: ResourceDiagnostic[] }) => {\n\t\tskills: Skill[];\n\t\tdiagnostics: ResourceDiagnostic[];\n\t};\n\tprivate promptsOverride?: (base: { prompts: PromptTemplate[]; diagnostics: ResourceDiagnostic[] }) => {\n\t\tprompts: PromptTemplate[];\n\t\tdiagnostics: ResourceDiagnostic[];\n\t};\n\tprivate themesOverride?: (base: { themes: Theme[]; diagnostics: ResourceDiagnostic[] }) => {\n\t\tthemes: Theme[];\n\t\tdiagnostics: ResourceDiagnostic[];\n\t};\n\tprivate agentsFilesOverride?: (base: { agentsFiles: Array<{ path: string; content: string }> }) => {\n\t\tagentsFiles: Array<{ path: string; content: string }>;\n\t};\n\tprivate systemPromptOverride?: (base: string | undefined) => string | undefined;\n\tprivate appendSystemPromptOverride?: (base: string[]) => string[];\n\tprivate extensionsResult: LoadExtensionsResult;\n\tprivate skills: Skill[];\n\tprivate skillDiagnostics: ResourceDiagnostic[];\n\tprivate prompts: PromptTemplate[];\n\tprivate promptDiagnostics: ResourceDiagnostic[];\n\tprivate themes: Theme[];\n\tprivate themeDiagnostics: ResourceDiagnostic[];\n\tprivate agentsFiles: Array<{ path: string; content: string }>;\n\tprivate systemPrompt?: string;\n\tprivate appendSystemPrompt: string[];\n\tprivate workflowResources: ResolvedResource[];\n\tprivate trustedBorrowedProjectLocalSources?: Set<string>;\n\tprivate lastSkillPaths: string[];\n\tprivate extensionSkillSourceInfos: Map<string, SourceInfo>;\n\tprivate extensionPromptSourceInfos: Map<string, SourceInfo>;\n\tprivate extensionThemeSourceInfos: Map<string, SourceInfo>;\n\tprivate lastPromptPaths: string[];\n\tprivate lastThemePaths: string[];\n\tprivate loaded: boolean;\n\n\tconstructor(options: DefaultResourceLoaderOptions) {\n\t\tconst inheritanceSnapshot = options.resourceLoaderInheritanceSnapshot;\n\t\tconst inheritedSettingsOptions = inheritanceSnapshot?.projectTrusted === undefined\n\t\t\t? undefined\n\t\t\t: { projectTrusted: inheritanceSnapshot.projectTrusted };\n\t\tthis.cwd = resolvePath(options.cwd);\n\t\tthis.agentDir = resolvePath(options.agentDir);\n\t\tthis.settingsManager = options.settingsManager ?? SettingsManager.create(\n\t\t\tthis.cwd,\n\t\t\tthis.agentDir,\n\t\t\tinheritedSettingsOptions,\n\t\t);\n\t\tthis.eventBus = options.eventBus ?? createEventBus();\n\t\tthis.packageManager = new DefaultPackageManager({\n\t\t\tcwd: this.cwd,\n\t\t\tagentDir: this.agentDir,\n\t\t\tsettingsManager: this.settingsManager,\n\t\t});\n\t\tthis.additionalExtensionPaths = mergeInheritedStrings(\n\t\t\tinheritanceSnapshot?.additionalExtensionPaths,\n\t\t\toptions.additionalExtensionPaths,\n\t\t);\n\t\tthis.additionalSkillPaths = mergeInheritedStrings(inheritanceSnapshot?.additionalSkillPaths, options.additionalSkillPaths);\n\t\tthis.additionalPromptTemplatePaths = mergeInheritedStrings(\n\t\t\tinheritanceSnapshot?.additionalPromptTemplatePaths,\n\t\t\toptions.additionalPromptTemplatePaths,\n\t\t);\n\t\tthis.additionalThemePaths = mergeInheritedStrings(inheritanceSnapshot?.additionalThemePaths, options.additionalThemePaths);\n\t\tthis.builtinPackagePaths = options.builtinPackagePaths !== undefined\n\t\t\t? clonePackageSources(options.builtinPackagePaths)\n\t\t\t: clonePackageSources(inheritanceSnapshot?.builtinPackagePaths);\n\t\tthis.extensionFactories = [...(inheritanceSnapshot?.extensionFactories ?? []), ...(options.extensionFactories ?? [])];\n\t\tthis.noExtensions = options.noExtensions ?? inheritanceSnapshot?.noExtensions ?? false;\n\t\tthis.noSkills = options.noSkills ?? inheritanceSnapshot?.noSkills ?? false;\n\t\tthis.noPromptTemplates = options.noPromptTemplates ?? inheritanceSnapshot?.noPromptTemplates ?? false;\n\t\tthis.noThemes = options.noThemes ?? inheritanceSnapshot?.noThemes ?? false;\n\t\tthis.noContextFiles = options.noContextFiles ?? inheritanceSnapshot?.noContextFiles ?? false;\n\t\tthis.systemPromptSource = options.systemPrompt ?? inheritanceSnapshot?.systemPrompt;\n\t\tthis.appendSystemPromptSource = options.appendSystemPrompt !== undefined\n\t\t\t? [...options.appendSystemPrompt]\n\t\t\t: inheritanceSnapshot?.appendSystemPrompt === undefined\n\t\t\t\t? undefined\n\t\t\t\t: [...inheritanceSnapshot.appendSystemPrompt];\n\t\tthis.extensionsOverride = options.extensionsOverride;\n\t\tthis.skillsOverride = options.skillsOverride;\n\t\tthis.promptsOverride = options.promptsOverride;\n\t\tthis.themesOverride = options.themesOverride;\n\t\tthis.agentsFilesOverride = options.agentsFilesOverride;\n\t\tthis.systemPromptOverride = options.systemPromptOverride;\n\t\tthis.appendSystemPromptOverride = options.appendSystemPromptOverride;\n\t\tthis.extensionsResult = { extensions: [], errors: [], runtime: createExtensionRuntime() };\n\t\tthis.skills = [];\n\t\tthis.skillDiagnostics = [];\n\t\tthis.prompts = [];\n\t\tthis.promptDiagnostics = [];\n\t\tthis.themes = [];\n\t\tthis.themeDiagnostics = [];\n\t\tthis.agentsFiles = [];\n\t\tthis.appendSystemPrompt = [];\n\t\tthis.workflowResources = [];\n\t\tthis.trustedBorrowedProjectLocalSources = inheritanceSnapshot?.trustedBorrowedProjectLocalSources === undefined\n\t\t\t? undefined\n\t\t\t: new Set(inheritanceSnapshot.trustedBorrowedProjectLocalSources);\n\t\tthis.lastSkillPaths = [];\n\t\tthis.extensionSkillSourceInfos = new Map();\n\t\tthis.extensionPromptSourceInfos = new Map();\n\t\tthis.extensionThemeSourceInfos = new Map();\n\t\tthis.lastPromptPaths = [];\n\t\tthis.lastThemePaths = [];\n\t\tthis.loaded = false;\n\t\tthis.touchInternalFieldsForSplit();\n\t}\n\n\tgetExtensions(): LoadExtensionsResult {\n\t\treturn this.extensionsResult;\n\t}\n\n\tgetSkills(): { skills: Skill[]; diagnostics: ResourceDiagnostic[] } {\n\t\treturn { skills: this.skills, diagnostics: this.skillDiagnostics };\n\t}\n\n\tgetPrompts(): { prompts: PromptTemplate[]; diagnostics: ResourceDiagnostic[] } {\n\t\treturn { prompts: this.prompts, diagnostics: this.promptDiagnostics };\n\t}\n\n\tgetThemes(): { themes: Theme[]; diagnostics: ResourceDiagnostic[] } {\n\t\treturn { themes: this.themes, diagnostics: this.themeDiagnostics };\n\t}\n\n\tgetAgentsFiles(): { agentsFiles: Array<{ path: string; content: string }> } {\n\t\treturn { agentsFiles: this.agentsFiles };\n\t}\n\n\tgetSystemPrompt(): string | undefined {\n\t\treturn this.systemPrompt;\n\t}\n\n\tgetAppendSystemPrompt(): string[] {\n\t\treturn this.appendSystemPrompt;\n\t}\n\n\tgetWorkflowResources(): ResolvedResource[] {\n\t\treturn [...this.workflowResources];\n\t}\n\n\tgetInheritanceSnapshot(): DefaultResourceLoaderInheritanceSnapshot {\n\t\treturn {\n\t\t\tprojectTrusted: this.settingsManager.isProjectTrusted(),\n\t\t\tadditionalExtensionPaths: [...this.additionalExtensionPaths],\n\t\t\tadditionalSkillPaths: [...this.additionalSkillPaths],\n\t\t\tadditionalPromptTemplatePaths: [...this.additionalPromptTemplatePaths],\n\t\t\tadditionalThemePaths: [...this.additionalThemePaths],\n\t\t\tbuiltinPackagePaths: clonePackageSources(this.builtinPackagePaths),\n\t\t\textensionFactories: [...this.extensionFactories],\n\t\t\tnoExtensions: this.noExtensions,\n\t\t\tnoSkills: this.noSkills,\n\t\t\tnoPromptTemplates: this.noPromptTemplates,\n\t\t\tnoThemes: this.noThemes,\n\t\t\tnoContextFiles: this.noContextFiles,\n\t\t\t...(this.systemPromptSource === undefined ? {} : { systemPrompt: this.systemPromptSource }),\n\t\t\t...(this.appendSystemPromptSource === undefined ? {} : { appendSystemPrompt: [...this.appendSystemPromptSource] }),\n\t\t\t...(this.trustedBorrowedProjectLocalSources === undefined\n\t\t\t\t? {}\n\t\t\t\t: { trustedBorrowedProjectLocalSources: [...this.trustedBorrowedProjectLocalSources] }),\n\t\t};\n\t}\n\n\tasync refreshWorkflowResources(): Promise<ResolvedResource[]> {\n\t\tconst { resolvedPaths, cliExtensionPaths, builtinPackagePaths } = await resolvePackageResourcePaths(this, {\n\t\t\ttrustedBorrowedProjectLocalSources: this.trustedBorrowedProjectLocalSources,\n\t\t});\n\t\tconst workflowResources = collectWorkflowResources(resolvedPaths, cliExtensionPaths, builtinPackagePaths);\n\t\tthis.workflowResources = workflowResources;\n\t\treturn [...this.workflowResources];\n\t}\n\n\textendResources(paths: ResourceExtensionPaths): void {\n\t\tconst skillPaths = normalizeExtensionPaths(this, paths.skillPaths ?? []);\n\t\tconst promptPaths = normalizeExtensionPaths(this, paths.promptPaths ?? []);\n\t\tconst themePaths = normalizeExtensionPaths(this, paths.themePaths ?? []);\n\t\trecordExtensionSourceInfo(this, skillPaths, \"skill\");\n\t\trecordExtensionSourceInfo(this, promptPaths, \"prompt\");\n\t\trecordExtensionSourceInfo(this, themePaths, \"theme\");\n\n\t\tif (skillPaths.length > 0) {\n\t\t\tthis.lastSkillPaths = mergeResourcePaths(this.cwd, this.lastSkillPaths, skillPaths.map((entry) => entry.path));\n\t\t\tupdateSkillsFromPaths(this, this.lastSkillPaths);\n\t\t}\n\t\tif (promptPaths.length > 0) {\n\t\t\tthis.lastPromptPaths = mergeResourcePaths(this.cwd, this.lastPromptPaths, promptPaths.map((entry) => entry.path));\n\t\t\tupdatePromptsFromPaths(this, this.lastPromptPaths);\n\t\t}\n\t\tif (themePaths.length > 0) {\n\t\t\tthis.lastThemePaths = mergeResourcePaths(this.cwd, this.lastThemePaths, themePaths.map((entry) => entry.path));\n\t\t\tupdateThemesFromPaths(this, this.lastThemePaths);\n\t\t}\n\t}\n\n\tasync loadProjectTrustExtensions(): Promise<LoadExtensionsResult> {\n\t\treturn loadProjectTrustExtensions(this);\n\t}\n\n\tasync reload(options?: ResourceLoaderReloadOptions): Promise<void> {\n\t\treturn reloadDefaultResourceLoader(this, options);\n\t}\n\n\tprivate touchInternalFieldsForSplit(): void {\n\t\tvoid this.eventBus;\n\t\tvoid this.packageManager;\n\t\tvoid this.noContextFiles;\n\t\tvoid this.extensionsOverride;\n\t\tvoid this.skillsOverride;\n\t\tvoid this.promptsOverride;\n\t\tvoid this.themesOverride;\n\t\tvoid this.agentsFilesOverride;\n\t\tvoid this.systemPromptOverride;\n\t\tvoid this.appendSystemPromptOverride;\n\t\tvoid this.extensionSkillSourceInfos;\n\t\tvoid this.extensionPromptSourceInfos;\n\t\tvoid this.extensionThemeSourceInfos;\n\t\tvoid this.loaded;\n\t}\n}\n"]}
1
+ {"version":3,"file":"resource-loader-core.d.ts","sourceRoot":"","sources":["../../src/core/resource-loader-core.ts"],"names":[],"mappings":"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","sourcesContent":["import { resolvePath } from \"../utils/paths.ts\";\nimport { createEventBus, type EventBus } from \"./event-bus.ts\";\nimport { createExtensionRuntime } from \"./extensions/loader.ts\";\nimport type { ExtensionFactory, LoadExtensionsResult } from \"./extensions/types.ts\";\nimport { DefaultPackageManager, type ResolvedResource } from \"./package-manager.ts\";\nimport type { PromptTemplate } from \"./prompt-templates.ts\";\nimport { SettingsManager, type PackageSource } from \"./settings-manager.ts\";\nimport type { Skill } from \"./skills.ts\";\nimport type { SourceInfo } from \"./source-info.ts\";\nimport type { ResourceDiagnostic } from \"./diagnostics.ts\";\nimport type { Theme } from \"../modes/interactive/theme/theme.ts\";\nimport { updatePromptsFromPathsAsync, updateSkillsFromPathsAsync, updateThemesFromPathsAsync } from \"./resource-loader-assets.ts\";\nimport { clonePackageSources, mergeInheritedStrings } from \"./resource-loader-helpers.ts\";\nimport {\n\tcollectWorkflowResources,\n\tnormalizeExtensionPaths,\n\trecordExtensionSourceInfo,\n\tresolvePackageResourcePaths,\n} from \"./resource-loader-package-resources.ts\";\nimport { mergeResourcePaths } from \"./resource-loader-paths.ts\";\nimport { loadProjectTrustExtensions, reloadDefaultResourceLoader } from \"./resource-loader-reload.ts\";\nimport type {\n\tDefaultResourceLoaderInheritanceSnapshot,\n\tDefaultResourceLoaderOptions,\n\tResourceExtensionPaths,\n\tResourceLoader,\n\tResourceLoaderReloadOptions,\n} from \"./resource-loader-types.ts\";\n\nexport class DefaultResourceLoader implements ResourceLoader {\n\tprivate cwd: string;\n\tprivate agentDir: string;\n\tprivate settingsManager: SettingsManager;\n\tprivate eventBus: EventBus;\n\tprivate packageManager: DefaultPackageManager;\n\tprivate additionalExtensionPaths: string[];\n\tprivate additionalSkillPaths: string[];\n\tprivate additionalPromptTemplatePaths: string[];\n\tprivate additionalThemePaths: string[];\n\tprivate builtinPackagePaths: PackageSource[];\n\tprivate extensionFactories: ExtensionFactory[];\n\tprivate noExtensions: boolean;\n\tprivate noSkills: boolean;\n\tprivate noPromptTemplates: boolean;\n\tprivate noThemes: boolean;\n\tprivate noContextFiles: boolean;\n\tprivate systemPromptSource?: string;\n\tprivate appendSystemPromptSource?: string[];\n\tprivate extensionsOverride?: (base: LoadExtensionsResult) => LoadExtensionsResult;\n\tprivate skillsOverride?: (base: { skills: Skill[]; diagnostics: ResourceDiagnostic[] }) => {\n\t\tskills: Skill[];\n\t\tdiagnostics: ResourceDiagnostic[];\n\t};\n\tprivate promptsOverride?: (base: { prompts: PromptTemplate[]; diagnostics: ResourceDiagnostic[] }) => {\n\t\tprompts: PromptTemplate[];\n\t\tdiagnostics: ResourceDiagnostic[];\n\t};\n\tprivate themesOverride?: (base: { themes: Theme[]; diagnostics: ResourceDiagnostic[] }) => {\n\t\tthemes: Theme[];\n\t\tdiagnostics: ResourceDiagnostic[];\n\t};\n\tprivate agentsFilesOverride?: (base: { agentsFiles: Array<{ path: string; content: string }> }) => {\n\t\tagentsFiles: Array<{ path: string; content: string }>;\n\t};\n\tprivate systemPromptOverride?: (base: string | undefined) => string | undefined;\n\tprivate appendSystemPromptOverride?: (base: string[]) => string[];\n\tprivate extensionsResult: LoadExtensionsResult;\n\tprivate skills: Skill[];\n\tprivate skillDiagnostics: ResourceDiagnostic[];\n\tprivate prompts: PromptTemplate[];\n\tprivate promptDiagnostics: ResourceDiagnostic[];\n\tprivate themes: Theme[];\n\tprivate themeDiagnostics: ResourceDiagnostic[];\n\tprivate agentsFiles: Array<{ path: string; content: string }>;\n\tprivate systemPrompt?: string;\n\tprivate appendSystemPrompt: string[];\n\tprivate workflowResources: ResolvedResource[];\n\tprivate trustedBorrowedProjectLocalSources?: Set<string>;\n\tprivate lastSkillPaths: string[];\n\tprivate extensionSkillSourceInfos: Map<string, SourceInfo>;\n\tprivate extensionPromptSourceInfos: Map<string, SourceInfo>;\n\tprivate extensionThemeSourceInfos: Map<string, SourceInfo>;\n\tprivate lastPromptPaths: string[];\n\tprivate lastThemePaths: string[];\n\tprivate loaded: boolean;\n\n\tconstructor(options: DefaultResourceLoaderOptions) {\n\t\tconst inheritanceSnapshot = options.resourceLoaderInheritanceSnapshot;\n\t\tconst inheritedSettingsOptions = inheritanceSnapshot?.projectTrusted === undefined\n\t\t\t? undefined\n\t\t\t: { projectTrusted: inheritanceSnapshot.projectTrusted };\n\t\tthis.cwd = resolvePath(options.cwd);\n\t\tthis.agentDir = resolvePath(options.agentDir);\n\t\tthis.settingsManager = options.settingsManager ?? SettingsManager.create(\n\t\t\tthis.cwd,\n\t\t\tthis.agentDir,\n\t\t\tinheritedSettingsOptions,\n\t\t);\n\t\tthis.eventBus = options.eventBus ?? createEventBus();\n\t\tthis.packageManager = new DefaultPackageManager({\n\t\t\tcwd: this.cwd,\n\t\t\tagentDir: this.agentDir,\n\t\t\tsettingsManager: this.settingsManager,\n\t\t});\n\t\tthis.additionalExtensionPaths = mergeInheritedStrings(\n\t\t\tinheritanceSnapshot?.additionalExtensionPaths,\n\t\t\toptions.additionalExtensionPaths,\n\t\t);\n\t\tthis.additionalSkillPaths = mergeInheritedStrings(inheritanceSnapshot?.additionalSkillPaths, options.additionalSkillPaths);\n\t\tthis.additionalPromptTemplatePaths = mergeInheritedStrings(\n\t\t\tinheritanceSnapshot?.additionalPromptTemplatePaths,\n\t\t\toptions.additionalPromptTemplatePaths,\n\t\t);\n\t\tthis.additionalThemePaths = mergeInheritedStrings(inheritanceSnapshot?.additionalThemePaths, options.additionalThemePaths);\n\t\tthis.builtinPackagePaths = options.builtinPackagePaths !== undefined\n\t\t\t? clonePackageSources(options.builtinPackagePaths)\n\t\t\t: clonePackageSources(inheritanceSnapshot?.builtinPackagePaths);\n\t\tthis.extensionFactories = [...(inheritanceSnapshot?.extensionFactories ?? []), ...(options.extensionFactories ?? [])];\n\t\tthis.noExtensions = options.noExtensions ?? inheritanceSnapshot?.noExtensions ?? false;\n\t\tthis.noSkills = options.noSkills ?? inheritanceSnapshot?.noSkills ?? false;\n\t\tthis.noPromptTemplates = options.noPromptTemplates ?? inheritanceSnapshot?.noPromptTemplates ?? false;\n\t\tthis.noThemes = options.noThemes ?? inheritanceSnapshot?.noThemes ?? false;\n\t\tthis.noContextFiles = options.noContextFiles ?? inheritanceSnapshot?.noContextFiles ?? false;\n\t\tthis.systemPromptSource = options.systemPrompt ?? inheritanceSnapshot?.systemPrompt;\n\t\tthis.appendSystemPromptSource = options.appendSystemPrompt !== undefined\n\t\t\t? [...options.appendSystemPrompt]\n\t\t\t: inheritanceSnapshot?.appendSystemPrompt === undefined\n\t\t\t\t? undefined\n\t\t\t\t: [...inheritanceSnapshot.appendSystemPrompt];\n\t\tthis.extensionsOverride = options.extensionsOverride;\n\t\tthis.skillsOverride = options.skillsOverride;\n\t\tthis.promptsOverride = options.promptsOverride;\n\t\tthis.themesOverride = options.themesOverride;\n\t\tthis.agentsFilesOverride = options.agentsFilesOverride;\n\t\tthis.systemPromptOverride = options.systemPromptOverride;\n\t\tthis.appendSystemPromptOverride = options.appendSystemPromptOverride;\n\t\tthis.extensionsResult = { extensions: [], errors: [], runtime: createExtensionRuntime() };\n\t\tthis.skills = [];\n\t\tthis.skillDiagnostics = [];\n\t\tthis.prompts = [];\n\t\tthis.promptDiagnostics = [];\n\t\tthis.themes = [];\n\t\tthis.themeDiagnostics = [];\n\t\tthis.agentsFiles = [];\n\t\tthis.appendSystemPrompt = [];\n\t\tthis.workflowResources = [];\n\t\tthis.trustedBorrowedProjectLocalSources = inheritanceSnapshot?.trustedBorrowedProjectLocalSources === undefined\n\t\t\t? undefined\n\t\t\t: new Set(inheritanceSnapshot.trustedBorrowedProjectLocalSources);\n\t\tthis.lastSkillPaths = [];\n\t\tthis.extensionSkillSourceInfos = new Map();\n\t\tthis.extensionPromptSourceInfos = new Map();\n\t\tthis.extensionThemeSourceInfos = new Map();\n\t\tthis.lastPromptPaths = [];\n\t\tthis.lastThemePaths = [];\n\t\tthis.loaded = false;\n\t\tthis.touchInternalFieldsForSplit();\n\t}\n\n\tgetExtensions(): LoadExtensionsResult {\n\t\treturn this.extensionsResult;\n\t}\n\n\tgetSkills(): { skills: Skill[]; diagnostics: ResourceDiagnostic[] } {\n\t\treturn { skills: this.skills, diagnostics: this.skillDiagnostics };\n\t}\n\n\tgetPrompts(): { prompts: PromptTemplate[]; diagnostics: ResourceDiagnostic[] } {\n\t\treturn { prompts: this.prompts, diagnostics: this.promptDiagnostics };\n\t}\n\n\tgetThemes(): { themes: Theme[]; diagnostics: ResourceDiagnostic[] } {\n\t\treturn { themes: this.themes, diagnostics: this.themeDiagnostics };\n\t}\n\n\tgetAgentsFiles(): { agentsFiles: Array<{ path: string; content: string }> } {\n\t\treturn { agentsFiles: this.agentsFiles };\n\t}\n\n\tgetSystemPrompt(): string | undefined {\n\t\treturn this.systemPrompt;\n\t}\n\n\tgetAppendSystemPrompt(): string[] {\n\t\treturn this.appendSystemPrompt;\n\t}\n\n\tgetWorkflowResources(): ResolvedResource[] {\n\t\treturn [...this.workflowResources];\n\t}\n\n\tgetInheritanceSnapshot(): DefaultResourceLoaderInheritanceSnapshot {\n\t\treturn {\n\t\t\tprojectTrusted: this.settingsManager.isProjectTrusted(),\n\t\t\tadditionalExtensionPaths: [...this.additionalExtensionPaths],\n\t\t\tadditionalSkillPaths: [...this.additionalSkillPaths],\n\t\t\tadditionalPromptTemplatePaths: [...this.additionalPromptTemplatePaths],\n\t\t\tadditionalThemePaths: [...this.additionalThemePaths],\n\t\t\tbuiltinPackagePaths: clonePackageSources(this.builtinPackagePaths),\n\t\t\textensionFactories: [...this.extensionFactories],\n\t\t\tnoExtensions: this.noExtensions,\n\t\t\tnoSkills: this.noSkills,\n\t\t\tnoPromptTemplates: this.noPromptTemplates,\n\t\t\tnoThemes: this.noThemes,\n\t\t\tnoContextFiles: this.noContextFiles,\n\t\t\t...(this.systemPromptSource === undefined ? {} : { systemPrompt: this.systemPromptSource }),\n\t\t\t...(this.appendSystemPromptSource === undefined ? {} : { appendSystemPrompt: [...this.appendSystemPromptSource] }),\n\t\t\t...(this.trustedBorrowedProjectLocalSources === undefined\n\t\t\t\t? {}\n\t\t\t\t: { trustedBorrowedProjectLocalSources: [...this.trustedBorrowedProjectLocalSources] }),\n\t\t};\n\t}\n\n\tasync refreshWorkflowResources(): Promise<ResolvedResource[]> {\n\t\tconst { resolvedPaths, cliExtensionPaths, builtinPackagePaths } = await resolvePackageResourcePaths(this, {\n\t\t\ttrustedBorrowedProjectLocalSources: this.trustedBorrowedProjectLocalSources,\n\t\t});\n\t\tconst workflowResources = collectWorkflowResources(resolvedPaths, cliExtensionPaths, builtinPackagePaths);\n\t\tthis.workflowResources = workflowResources;\n\t\treturn [...this.workflowResources];\n\t}\n\n\tasync extendResources(paths: ResourceExtensionPaths): Promise<void> {\n\t\tconst skillPaths = normalizeExtensionPaths(this, paths.skillPaths ?? []);\n\t\tconst promptPaths = normalizeExtensionPaths(this, paths.promptPaths ?? []);\n\t\tconst themePaths = normalizeExtensionPaths(this, paths.themePaths ?? []);\n\t\trecordExtensionSourceInfo(this, skillPaths, \"skill\");\n\t\trecordExtensionSourceInfo(this, promptPaths, \"prompt\");\n\t\trecordExtensionSourceInfo(this, themePaths, \"theme\");\n\n\t\tif (skillPaths.length > 0) {\n\t\t\tthis.lastSkillPaths = mergeResourcePaths(this.cwd, this.lastSkillPaths, skillPaths.map((entry) => entry.path));\n\t\t\tawait updateSkillsFromPathsAsync(this, this.lastSkillPaths);\n\t\t}\n\t\tif (promptPaths.length > 0) {\n\t\t\tthis.lastPromptPaths = mergeResourcePaths(this.cwd, this.lastPromptPaths, promptPaths.map((entry) => entry.path));\n\t\t\tawait updatePromptsFromPathsAsync(this, this.lastPromptPaths);\n\t\t}\n\t\tif (themePaths.length > 0) {\n\t\t\tthis.lastThemePaths = mergeResourcePaths(this.cwd, this.lastThemePaths, themePaths.map((entry) => entry.path));\n\t\t\tawait updateThemesFromPathsAsync(this, this.lastThemePaths);\n\t\t}\n\t}\n\n\tasync loadProjectTrustExtensions(): Promise<LoadExtensionsResult> {\n\t\treturn loadProjectTrustExtensions(this);\n\t}\n\n\tasync reload(options?: ResourceLoaderReloadOptions): Promise<void> {\n\t\treturn reloadDefaultResourceLoader(this, options);\n\t}\n\n\tprivate touchInternalFieldsForSplit(): void {\n\t\tvoid this.eventBus;\n\t\tvoid this.packageManager;\n\t\tvoid this.noContextFiles;\n\t\tvoid this.extensionsOverride;\n\t\tvoid this.skillsOverride;\n\t\tvoid this.promptsOverride;\n\t\tvoid this.themesOverride;\n\t\tvoid this.agentsFilesOverride;\n\t\tvoid this.systemPromptOverride;\n\t\tvoid this.appendSystemPromptOverride;\n\t\tvoid this.extensionSkillSourceInfos;\n\t\tvoid this.extensionPromptSourceInfos;\n\t\tvoid this.extensionThemeSourceInfos;\n\t\tvoid this.loaded;\n\t}\n}\n"]}
@@ -3,7 +3,7 @@ import { createEventBus } from "./event-bus.js";
3
3
  import { createExtensionRuntime } from "./extensions/loader.js";
4
4
  import { DefaultPackageManager } from "./package-manager.js";
5
5
  import { SettingsManager } from "./settings-manager.js";
6
- import { updatePromptsFromPaths, updateSkillsFromPaths, updateThemesFromPaths } from "./resource-loader-assets.js";
6
+ import { updatePromptsFromPathsAsync, updateSkillsFromPathsAsync, updateThemesFromPathsAsync } from "./resource-loader-assets.js";
7
7
  import { clonePackageSources, mergeInheritedStrings } from "./resource-loader-helpers.js";
8
8
  import { collectWorkflowResources, normalizeExtensionPaths, recordExtensionSourceInfo, resolvePackageResourcePaths, } from "./resource-loader-package-resources.js";
9
9
  import { mergeResourcePaths } from "./resource-loader-paths.js";
@@ -124,7 +124,7 @@ export class DefaultResourceLoader {
124
124
  this.workflowResources = workflowResources;
125
125
  return [...this.workflowResources];
126
126
  }
127
- extendResources(paths) {
127
+ async extendResources(paths) {
128
128
  const skillPaths = normalizeExtensionPaths(this, paths.skillPaths ?? []);
129
129
  const promptPaths = normalizeExtensionPaths(this, paths.promptPaths ?? []);
130
130
  const themePaths = normalizeExtensionPaths(this, paths.themePaths ?? []);
@@ -133,15 +133,15 @@ export class DefaultResourceLoader {
133
133
  recordExtensionSourceInfo(this, themePaths, "theme");
134
134
  if (skillPaths.length > 0) {
135
135
  this.lastSkillPaths = mergeResourcePaths(this.cwd, this.lastSkillPaths, skillPaths.map((entry) => entry.path));
136
- updateSkillsFromPaths(this, this.lastSkillPaths);
136
+ await updateSkillsFromPathsAsync(this, this.lastSkillPaths);
137
137
  }
138
138
  if (promptPaths.length > 0) {
139
139
  this.lastPromptPaths = mergeResourcePaths(this.cwd, this.lastPromptPaths, promptPaths.map((entry) => entry.path));
140
- updatePromptsFromPaths(this, this.lastPromptPaths);
140
+ await updatePromptsFromPathsAsync(this, this.lastPromptPaths);
141
141
  }
142
142
  if (themePaths.length > 0) {
143
143
  this.lastThemePaths = mergeResourcePaths(this.cwd, this.lastThemePaths, themePaths.map((entry) => entry.path));
144
- updateThemesFromPaths(this, this.lastThemePaths);
144
+ await updateThemesFromPathsAsync(this, this.lastThemePaths);
145
145
  }
146
146
  }
147
147
  async loadProjectTrustExtensions() {