@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.
- package/CHANGELOG.md +18 -0
- package/dist/builtin/cursor/package.json +2 -2
- package/dist/builtin/intercom/package.json +1 -1
- package/dist/builtin/mcp/package.json +1 -1
- package/dist/builtin/subagents/package.json +1 -1
- package/dist/builtin/web-access/package.json +1 -1
- package/dist/builtin/workflows/package.json +1 -1
- package/dist/bun/split-loader.d.ts +2 -0
- package/dist/bun/split-loader.d.ts.map +1 -0
- package/dist/bun/split-loader.js +37 -0
- package/dist/bun/split-loader.js.map +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -4
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-auto-compaction.d.ts +5 -4
- package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-auto-compaction.js +15 -9
- package/dist/core/agent-session-auto-compaction.js.map +1 -1
- package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
- package/dist/core/agent-session-extension-bindings.js +1 -1
- package/dist/core/agent-session-extension-bindings.js.map +1 -1
- package/dist/core/agent-session-methods.d.ts +1 -1
- package/dist/core/agent-session-methods.d.ts.map +1 -1
- package/dist/core/agent-session-methods.js.map +1 -1
- package/dist/core/builtin-packages.d.ts.map +1 -1
- package/dist/core/builtin-packages.js +8 -4
- package/dist/core/builtin-packages.js.map +1 -1
- package/dist/core/copilot-model-catalog.d.ts.map +1 -1
- package/dist/core/copilot-model-catalog.js +3 -2
- package/dist/core/copilot-model-catalog.js.map +1 -1
- package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
- package/dist/core/extensions/loader-virtual-modules.js +8 -3
- package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
- package/dist/core/openai-responses-payload-sanitizer.d.ts +6 -0
- package/dist/core/openai-responses-payload-sanitizer.d.ts.map +1 -0
- package/dist/core/openai-responses-payload-sanitizer.js +59 -0
- package/dist/core/openai-responses-payload-sanitizer.js.map +1 -0
- package/dist/core/package-manager-auto-resources.d.ts +2 -2
- package/dist/core/package-manager-auto-resources.d.ts.map +1 -1
- package/dist/core/package-manager-auto-resources.js +32 -52
- package/dist/core/package-manager-auto-resources.js.map +1 -1
- package/dist/core/package-manager-resolver.d.ts.map +1 -1
- package/dist/core/package-manager-resolver.js +23 -14
- package/dist/core/package-manager-resolver.js.map +1 -1
- package/dist/core/package-manager-resource-collector.d.ts +3 -3
- package/dist/core/package-manager-resource-collector.d.ts.map +1 -1
- package/dist/core/package-manager-resource-collector.js +76 -73
- package/dist/core/package-manager-resource-collector.js.map +1 -1
- package/dist/core/package-manager-resource-files.d.ts +9 -8
- package/dist/core/package-manager-resource-files.d.ts.map +1 -1
- package/dist/core/package-manager-resource-files.js +92 -81
- package/dist/core/package-manager-resource-files.js.map +1 -1
- package/dist/core/prompt-templates-async.d.ts +3 -0
- package/dist/core/prompt-templates-async.d.ts.map +1 -0
- package/dist/core/prompt-templates-async.js +118 -0
- package/dist/core/prompt-templates-async.js.map +1 -0
- package/dist/core/provider-context-usage.d.ts +11 -0
- package/dist/core/provider-context-usage.d.ts.map +1 -0
- package/dist/core/provider-context-usage.js +58 -0
- package/dist/core/provider-context-usage.js.map +1 -0
- package/dist/core/resource-loader-assets.d.ts +3 -3
- package/dist/core/resource-loader-assets.d.ts.map +1 -1
- package/dist/core/resource-loader-assets.js +66 -83
- package/dist/core/resource-loader-assets.js.map +1 -1
- package/dist/core/resource-loader-core.d.ts +1 -1
- package/dist/core/resource-loader-core.d.ts.map +1 -1
- package/dist/core/resource-loader-core.js +5 -5
- package/dist/core/resource-loader-core.js.map +1 -1
- package/dist/core/resource-loader-reload.d.ts.map +1 -1
- package/dist/core/resource-loader-reload.js +43 -7
- package/dist/core/resource-loader-reload.js.map +1 -1
- package/dist/core/resource-loader-types.d.ts +7 -1
- package/dist/core/resource-loader-types.d.ts.map +1 -1
- package/dist/core/resource-loader-types.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +6 -4
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/skills-async.d.ts +3 -0
- package/dist/core/skills-async.d.ts.map +1 -0
- package/dist/core/skills-async.js +269 -0
- package/dist/core/skills-async.js.map +1 -0
- package/dist/main-deferred-startup.d.ts +2 -0
- package/dist/main-deferred-startup.d.ts.map +1 -1
- package/dist/main-deferred-startup.js +2 -0
- package/dist/main-deferred-startup.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +4 -4
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/interactive-agent-events.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-agent-events.js +10 -1
- package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
- package/dist/modes/interactive/interactive-deferred-startup.d.ts +6 -0
- package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-deferred-startup.js +27 -13
- package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
- package/dist/modes/interactive/interactive-editor-actions.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-editor-actions.js +13 -13
- package/dist/modes/interactive/interactive-editor-actions.js.map +1 -1
- package/dist/modes/interactive/interactive-extension-runtime.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-extension-runtime.js +16 -0
- package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-input-handling.js +48 -0
- package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.d.ts +5 -0
- package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.js +5 -0
- package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts +18 -6
- package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
- package/dist/modes/interactive/interactive-model-routing.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-model-routing.js +3 -3
- package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
- package/dist/modes/interactive/interactive-onboarding.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-onboarding.js +1 -0
- package/dist/modes/interactive/interactive-onboarding.js.map +1 -1
- package/dist/modes/interactive/interactive-process-lifecycle.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-process-lifecycle.js +43 -6
- package/dist/modes/interactive/interactive-process-lifecycle.js.map +1 -1
- package/dist/modes/interactive/interactive-render-chat.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-render-chat.js +57 -0
- package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
- package/dist/modes/interactive/interactive-resource-disclosure.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-resource-disclosure.js +3 -2
- package/dist/modes/interactive/interactive-resource-disclosure.js.map +1 -1
- package/dist/modes/interactive/interactive-resource-rendering.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-resource-rendering.js +10 -8
- package/dist/modes/interactive/interactive-resource-rendering.js.map +1 -1
- package/dist/modes/interactive/interactive-session-runtime.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-session-runtime.js +1 -1
- package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-startup.js +59 -52
- package/dist/modes/interactive/interactive-startup.js.map +1 -1
- package/dist/modes/interactive/theme/theme-loading.d.ts +1 -0
- package/dist/modes/interactive/theme/theme-loading.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-loading.js +3 -0
- package/dist/modes/interactive/theme/theme-loading.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +1 -1
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/utils/module-require.d.ts +11 -0
- package/dist/utils/module-require.d.ts.map +1 -1
- package/dist/utils/module-require.js +14 -1
- package/dist/utils/module-require.js.map +1 -1
- package/dist/utils/split-launcher.d.ts +38 -0
- package/dist/utils/split-launcher.d.ts.map +1 -0
- package/dist/utils/split-launcher.js +63 -0
- package/dist/utils/split-launcher.js.map +1 -0
- package/docs/compaction.md +3 -0
- package/docs/keybindings.md +2 -2
- package/docs/providers.md +1 -1
- package/docs/settings.md +2 -2
- package/docs/usage.md +1 -1
- package/npm-shrinkwrap.json +23 -23
- 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
|
|
4
|
-
export declare function
|
|
5
|
-
export declare function
|
|
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 {
|
|
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 {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
17
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
86
|
-
|
|
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 (!
|
|
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 =
|
|
101
|
-
if (stats.isDirectory())
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
|
122
|
-
if (!
|
|
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 =
|
|
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 =
|
|
129
|
+
isFile = (await stat(join(dir, entry.name))).isFile();
|
|
132
130
|
}
|
|
133
131
|
catch {
|
|
134
132
|
continue;
|
|
135
133
|
}
|
|
136
134
|
}
|
|
137
|
-
if (
|
|
138
|
-
|
|
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
|
|
144
|
+
async function loadThemeFromFileAsync(filePath, themes, diagnostics) {
|
|
152
145
|
try {
|
|
153
|
-
themes.push(
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
144
|
+
await updateThemesFromPathsAsync(this, this.lastThemePaths);
|
|
145
145
|
}
|
|
146
146
|
}
|
|
147
147
|
async loadProjectTrustExtensions() {
|