veryfront 0.1.171 → 0.1.174
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/esm/deno.js +1 -1
- package/esm/src/agent/runtime/model-tool-converter.d.ts.map +1 -1
- package/esm/src/agent/runtime/model-tool-converter.js +6 -3
- package/esm/src/agent/runtime/provider-native-tools.d.ts +1 -0
- package/esm/src/agent/runtime/provider-native-tools.d.ts.map +1 -1
- package/esm/src/agent/runtime/provider-native-tools.js +66 -0
- package/esm/src/platform/adapters/fs/veryfront/read-operations.d.ts +1 -0
- package/esm/src/platform/adapters/fs/veryfront/read-operations.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/veryfront/read-operations.js +10 -16
- package/esm/src/provider/runtime-loader.d.ts.map +1 -1
- package/esm/src/provider/runtime-loader.js +21 -0
- package/esm/src/rendering/orchestrator/html-imported-css.d.ts +17 -0
- package/esm/src/rendering/orchestrator/html-imported-css.d.ts.map +1 -0
- package/esm/src/rendering/orchestrator/html-imported-css.js +49 -0
- package/esm/src/rendering/orchestrator/html.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/html.js +8 -48
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/package.json +1 -1
- package/src/deno.js +1 -1
- package/src/src/agent/runtime/model-tool-converter.ts +13 -3
- package/src/src/agent/runtime/provider-native-tools.ts +69 -0
- package/src/src/platform/adapters/fs/veryfront/read-operations.ts +14 -12
- package/src/src/provider/runtime-loader.ts +27 -0
- package/src/src/rendering/orchestrator/html-imported-css.ts +81 -0
- package/src/src/rendering/orchestrator/html.ts +8 -55
- package/src/src/utils/version-constant.ts +1 -1
package/esm/deno.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-tool-converter.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/model-tool-converter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"model-tool-converter.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/model-tool-converter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAW9D,MAAM,WAAW,iCAAiC;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAmCD;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,CAAC,EAAE,iCAAiC,GAC1C,cAAc,GAAG,SAAS,CAwB5B"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { addRuntimeTool, createRuntimeJsonSchema, createRuntimeTool, } from "./runtime-tool-builder.js";
|
|
2
|
-
import { createAnthropicWebSearchToolSet } from "./provider-native-tools.js";
|
|
2
|
+
import { createAnthropicWebFetchToolSet, createAnthropicWebSearchToolSet, } from "./provider-native-tools.js";
|
|
3
3
|
function resolveHostedProvider(model) {
|
|
4
4
|
if (!model)
|
|
5
5
|
return undefined;
|
|
@@ -12,13 +12,16 @@ function resolveHostedProvider(model) {
|
|
|
12
12
|
return provider;
|
|
13
13
|
}
|
|
14
14
|
function resolveProviderNativeTools(options) {
|
|
15
|
-
if (!options?.allowedToolNames?.
|
|
15
|
+
if (!options?.allowedToolNames?.some((toolName) => toolName === "web_search" || toolName === "web_fetch")) {
|
|
16
16
|
return undefined;
|
|
17
17
|
}
|
|
18
18
|
if (resolveHostedProvider(options.model) !== "anthropic") {
|
|
19
19
|
return undefined;
|
|
20
20
|
}
|
|
21
|
-
return
|
|
21
|
+
return {
|
|
22
|
+
...createAnthropicWebSearchToolSet(),
|
|
23
|
+
...createAnthropicWebFetchToolSet(),
|
|
24
|
+
};
|
|
22
25
|
}
|
|
23
26
|
/**
|
|
24
27
|
* Convert veryfront tool definitions to the current model-runtime ToolSet.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-native-tools.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/provider-native-tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"provider-native-tools.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/provider-native-tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAuG9D,wBAAgB,+BAA+B,IAAI,cAAc,CAYhE;AAED,wBAAgB,8BAA8B,IAAI,cAAc,CAU/D"}
|
|
@@ -41,6 +41,61 @@ const WEB_SEARCH_OUTPUT_SCHEMA = {
|
|
|
41
41
|
additionalProperties: false,
|
|
42
42
|
},
|
|
43
43
|
};
|
|
44
|
+
const WEB_FETCH_INPUT_SCHEMA = {
|
|
45
|
+
type: "object",
|
|
46
|
+
properties: {
|
|
47
|
+
url: {
|
|
48
|
+
type: "string",
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
required: ["url"],
|
|
52
|
+
additionalProperties: false,
|
|
53
|
+
};
|
|
54
|
+
const WEB_FETCH_OUTPUT_SCHEMA = {
|
|
55
|
+
type: "object",
|
|
56
|
+
properties: {
|
|
57
|
+
type: {
|
|
58
|
+
type: "string",
|
|
59
|
+
const: "web_fetch_result",
|
|
60
|
+
},
|
|
61
|
+
url: {
|
|
62
|
+
type: "string",
|
|
63
|
+
},
|
|
64
|
+
content: {
|
|
65
|
+
type: "object",
|
|
66
|
+
properties: {
|
|
67
|
+
type: {
|
|
68
|
+
type: "string",
|
|
69
|
+
const: "document",
|
|
70
|
+
},
|
|
71
|
+
source: {
|
|
72
|
+
type: "object",
|
|
73
|
+
properties: {
|
|
74
|
+
type: {
|
|
75
|
+
type: "string",
|
|
76
|
+
enum: ["text", "base64"],
|
|
77
|
+
},
|
|
78
|
+
mediaType: {
|
|
79
|
+
type: "string",
|
|
80
|
+
},
|
|
81
|
+
data: {
|
|
82
|
+
type: "string",
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
required: ["type", "mediaType", "data"],
|
|
86
|
+
additionalProperties: true,
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
required: ["type", "source"],
|
|
90
|
+
additionalProperties: true,
|
|
91
|
+
},
|
|
92
|
+
retrievedAt: {
|
|
93
|
+
type: "string",
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
required: ["type", "url", "content", "retrievedAt"],
|
|
97
|
+
additionalProperties: false,
|
|
98
|
+
};
|
|
44
99
|
export function createAnthropicWebSearchToolSet() {
|
|
45
100
|
return {
|
|
46
101
|
web_search: createRuntimeProviderTool({
|
|
@@ -54,3 +109,14 @@ export function createAnthropicWebSearchToolSet() {
|
|
|
54
109
|
}),
|
|
55
110
|
};
|
|
56
111
|
}
|
|
112
|
+
export function createAnthropicWebFetchToolSet() {
|
|
113
|
+
return {
|
|
114
|
+
web_fetch: createRuntimeProviderTool({
|
|
115
|
+
id: "anthropic.web_fetch_20250910",
|
|
116
|
+
args: {},
|
|
117
|
+
inputSchema: createLazyRuntimeJsonSchema(WEB_FETCH_INPUT_SCHEMA),
|
|
118
|
+
outputSchema: createLazyRuntimeJsonSchema(WEB_FETCH_OUTPUT_SCHEMA),
|
|
119
|
+
supportsDeferredResults: true,
|
|
120
|
+
}),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
@@ -29,6 +29,7 @@ export declare class ReadOperations {
|
|
|
29
29
|
private tryResolveExtensionlessPath;
|
|
30
30
|
private tryResolveExtensionlessPathFromFileList;
|
|
31
31
|
private cacheResolvedContent;
|
|
32
|
+
private storeFetchedContent;
|
|
32
33
|
private fetchContent;
|
|
33
34
|
private fetchPublishedContent;
|
|
34
35
|
private tryFallbackExtensions;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-operations.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/fs/veryfront/read-operations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAKnD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAapE,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAY9B,qBAAa,cAAc;IAWvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IACjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IACpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAfpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAI9B;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,mGAAmG;IACnG,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAA6B;gBAGnD,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,cAAc,EAC1B,eAAe,CAAC,EAAE,sBAAsB,YAAA,EACxC,kBAAkB,CAAC,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,aAAA,EAC7C,gBAAgB,CAAC,GAAE,MAAM,OAAO,CAC/C,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,SAAS,CACtD,aAAA;IAKH,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIrD,kBAAkB,IAAI,IAAI;IAK1B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAY3C,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAY3C,OAAO,CAAC,mBAAmB;YAsBb,+BAA+B;YA0C/B,mBAAmB;IA0CjC,OAAO,CAAC,kBAAkB;YAoFZ,2BAA2B;YA8D3B,uCAAuC;IAmCrD,OAAO,CAAC,oBAAoB;
|
|
1
|
+
{"version":3,"file":"read-operations.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/fs/veryfront/read-operations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAKnD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAapE,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAY9B,qBAAa,cAAc;IAWvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IACjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IACpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAfpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAI9B;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,mGAAmG;IACnG,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAA6B;gBAGnD,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,cAAc,EAC1B,eAAe,CAAC,EAAE,sBAAsB,YAAA,EACxC,kBAAkB,CAAC,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,aAAA,EAC7C,gBAAgB,CAAC,GAAE,MAAM,OAAO,CAC/C,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,SAAS,CACtD,aAAA;IAKH,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIrD,kBAAkB,IAAI,IAAI;IAK1B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAY3C,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAY3C,OAAO,CAAC,mBAAmB;YAsBb,+BAA+B;YA0C/B,mBAAmB;IA0CjC,OAAO,CAAC,kBAAkB;YAoFZ,2BAA2B;YA8D3B,uCAAuC;IAmCrD,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,mBAAmB;YAUb,YAAY;YA6JZ,qBAAqB;YA4DrB,qBAAqB;YA8CrB,+BAA+B;YA4D/B,iBAAiB;CAuBhC"}
|
|
@@ -273,6 +273,12 @@ export class ReadOperations {
|
|
|
273
273
|
setRequestScopedFile(resolvedCacheKey, content);
|
|
274
274
|
}
|
|
275
275
|
}
|
|
276
|
+
storeFetchedContent(cacheKey, content, shouldCache) {
|
|
277
|
+
if (shouldCache)
|
|
278
|
+
this.cache.set(cacheKey, content);
|
|
279
|
+
setRequestScopedFile(cacheKey, content);
|
|
280
|
+
return content;
|
|
281
|
+
}
|
|
276
282
|
async fetchContent(normalizedPath) {
|
|
277
283
|
// Framework paths should NEVER be fetched from API - they must be read from local filesystem.
|
|
278
284
|
// If we reach here for a framework path, the module server's local resolution failed.
|
|
@@ -357,10 +363,7 @@ export class ReadOperations {
|
|
|
357
363
|
contentLength: content.length,
|
|
358
364
|
releaseId,
|
|
359
365
|
});
|
|
360
|
-
|
|
361
|
-
this.cache.set(cacheKey, content);
|
|
362
|
-
setRequestScopedFile(cacheKey, content);
|
|
363
|
-
return content;
|
|
366
|
+
return this.storeFetchedContent(cacheKey, content, shouldCache);
|
|
364
367
|
}
|
|
365
368
|
catch (error) {
|
|
366
369
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
@@ -402,10 +405,7 @@ export class ReadOperations {
|
|
|
402
405
|
foundPath: result.path,
|
|
403
406
|
contentLength: result.content.length,
|
|
404
407
|
});
|
|
405
|
-
|
|
406
|
-
this.cache.set(cacheKey, result.content);
|
|
407
|
-
setRequestScopedFile(cacheKey, result.content);
|
|
408
|
-
return result.content;
|
|
408
|
+
return this.storeFetchedContent(cacheKey, result.content, shouldCache);
|
|
409
409
|
}
|
|
410
410
|
catch (error) {
|
|
411
411
|
logger.debug("Pattern search failed, trying sequential fallback", {
|
|
@@ -448,10 +448,7 @@ export class ReadOperations {
|
|
|
448
448
|
durationMs,
|
|
449
449
|
candidateCount: candidates.length,
|
|
450
450
|
});
|
|
451
|
-
|
|
452
|
-
this.cache.set(cacheKey, content);
|
|
453
|
-
setRequestScopedFile(cacheKey, content);
|
|
454
|
-
return content;
|
|
451
|
+
return this.storeFetchedContent(cacheKey, content, shouldCache);
|
|
455
452
|
}
|
|
456
453
|
catch (_) {
|
|
457
454
|
/* expected: this extension variant does not exist, try next priority */
|
|
@@ -473,9 +470,6 @@ export class ReadOperations {
|
|
|
473
470
|
preview: previewText(content).replace(/\n/g, "\\n"),
|
|
474
471
|
willCache: shouldCache,
|
|
475
472
|
});
|
|
476
|
-
|
|
477
|
-
this.cache.set(cacheKey, content);
|
|
478
|
-
setRequestScopedFile(cacheKey, content);
|
|
479
|
-
return content;
|
|
473
|
+
return this.storeFetchedContent(cacheKey, content, shouldCache);
|
|
480
474
|
}
|
|
481
475
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-loader.d.ts","sourceRoot":"","sources":["../../../src/src/provider/runtime-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,qBAAqB,CAAC;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjE,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,KAAK,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,KAAK,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,KAAK,CAAC;CAC9B;
|
|
1
|
+
{"version":3,"file":"runtime-loader.d.ts","sourceRoot":"","sources":["../../../src/src/provider/runtime-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,qBAAqB,CAAC;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjE,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,KAAK,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,KAAK,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,KAAK,CAAC;CAC9B;AAkhDD,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,MAAM,GACd,YAAY,CAkDd;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,sBAAsB,EAC9B,OAAO,EAAE,MAAM,GACd,YAAY,CA4Dd;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,MAAM,GACd,YAAY,CAkDd;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,MAAM,GACd,gBAAgB,CA0ClB;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,MAAM,GACd,gBAAgB,CAgDlB"}
|
|
@@ -397,6 +397,16 @@ function buildAnthropicGenerateResult(payload) {
|
|
|
397
397
|
result: block.content,
|
|
398
398
|
});
|
|
399
399
|
}
|
|
400
|
+
if (blockType === "web_fetch_tool_result" &&
|
|
401
|
+
typeof block?.tool_use_id === "string" &&
|
|
402
|
+
readRecord(block?.content)) {
|
|
403
|
+
normalized.push({
|
|
404
|
+
type: "tool-result",
|
|
405
|
+
toolCallId: block.tool_use_id,
|
|
406
|
+
toolName: "web_fetch",
|
|
407
|
+
result: block.content,
|
|
408
|
+
});
|
|
409
|
+
}
|
|
400
410
|
}
|
|
401
411
|
return {
|
|
402
412
|
content: normalized,
|
|
@@ -497,6 +507,17 @@ async function* streamAnthropicCompatibleParts(stream) {
|
|
|
497
507
|
providerExecuted: true,
|
|
498
508
|
};
|
|
499
509
|
}
|
|
510
|
+
if (blockType === "web_fetch_tool_result" &&
|
|
511
|
+
typeof contentBlock?.tool_use_id === "string" &&
|
|
512
|
+
readRecord(contentBlock?.content)) {
|
|
513
|
+
yield {
|
|
514
|
+
type: "tool-result",
|
|
515
|
+
toolCallId: contentBlock.tool_use_id,
|
|
516
|
+
toolName: "web_fetch",
|
|
517
|
+
result: contentBlock.content,
|
|
518
|
+
providerExecuted: true,
|
|
519
|
+
};
|
|
520
|
+
}
|
|
500
521
|
continue;
|
|
501
522
|
}
|
|
502
523
|
if (eventType === "content_block_delta") {
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface CssFsAdapterLike {
|
|
2
|
+
readFile(path: string): Promise<string>;
|
|
3
|
+
}
|
|
4
|
+
interface CssLoggerLike {
|
|
5
|
+
debug(message: string, context?: Record<string, unknown>): void;
|
|
6
|
+
}
|
|
7
|
+
interface MergeImportedCssOptions {
|
|
8
|
+
fs: CssFsAdapterLike;
|
|
9
|
+
logger: CssLoggerLike;
|
|
10
|
+
projectDir: string;
|
|
11
|
+
globalCSS: string | undefined;
|
|
12
|
+
cssImports: string[] | undefined;
|
|
13
|
+
stylesheetPath: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function mergeImportedCSS({ fs, logger, projectDir, globalCSS, cssImports, stylesheetPath, }: MergeImportedCssOptions): Promise<string | undefined>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=html-imported-css.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-imported-css.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/html-imported-css.ts"],"names":[],"mappings":"AAMA,UAAU,gBAAgB;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACzC;AAED,UAAU,aAAa;IACrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACjE;AAED,UAAU,uBAAuB;IAC/B,EAAE,EAAE,gBAAgB,CAAC;IACrB,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACjC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,gBAAgB,CAAC,EACrC,EAAE,EACF,MAAM,EACN,UAAU,EACV,SAAS,EACT,UAAU,EACV,cAAc,GACf,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAkDvD"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { join } from "../../platform/compat/path/index.js";
|
|
2
|
+
import { normalizeCssModuleKey, rewriteCssModuleContent, } from "../../transforms/css-modules/naming.js";
|
|
3
|
+
export async function mergeImportedCSS({ fs, logger, projectDir, globalCSS, cssImports, stylesheetPath, }) {
|
|
4
|
+
if (!cssImports || cssImports.length === 0)
|
|
5
|
+
return globalCSS;
|
|
6
|
+
const normalizedStylesheetPath = stylesheetPath.replace(/^\/+/, "");
|
|
7
|
+
const configuredStylesheetAbsolute = normalizeCssModuleKey(join(projectDir, normalizedStylesheetPath));
|
|
8
|
+
const uniqueImports = new Map();
|
|
9
|
+
for (const cssPath of cssImports) {
|
|
10
|
+
const normalized = normalizeCssModuleKey(cssPath);
|
|
11
|
+
if (!uniqueImports.has(normalized)) {
|
|
12
|
+
uniqueImports.set(normalized, cssPath);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
const sortedImports = [...uniqueImports.entries()].sort((a, b) => a[0].localeCompare(b[0]));
|
|
16
|
+
const regularCssSegments = [];
|
|
17
|
+
const moduleCssSegments = [];
|
|
18
|
+
for (const [normalizedCssPath, cssPath] of sortedImports) {
|
|
19
|
+
if (normalizedCssPath === configuredStylesheetAbsolute) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const content = await fs.readFile(cssPath);
|
|
24
|
+
if (!content)
|
|
25
|
+
continue;
|
|
26
|
+
if (normalizedCssPath.endsWith(".module.css")) {
|
|
27
|
+
moduleCssSegments.push(rewriteCssModuleContent(content, normalizedCssPath));
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
regularCssSegments.push(content);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch (_) {
|
|
34
|
+
logger.debug("Could not load imported CSS file", { cssPath });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (regularCssSegments.length === 0 && moduleCssSegments.length === 0)
|
|
38
|
+
return globalCSS;
|
|
39
|
+
const combined = [globalCSS, ...regularCssSegments, ...moduleCssSegments]
|
|
40
|
+
.filter(Boolean)
|
|
41
|
+
.join("\n");
|
|
42
|
+
logger.debug("Merged imported CSS with global stylesheet", {
|
|
43
|
+
importedCount: regularCssSegments.length + moduleCssSegments.length,
|
|
44
|
+
regularCount: regularCssSegments.length,
|
|
45
|
+
moduleCount: moduleCssSegments.length,
|
|
46
|
+
totalLength: combined.length,
|
|
47
|
+
});
|
|
48
|
+
return combined;
|
|
49
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/html.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAS7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,SAAS,EAET,UAAU,EACX,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/html.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAS7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,SAAS,EAET,UAAU,EACX,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA6EhD,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,eAAe,CAAC;IACxB,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC;CACpC;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,UAAU,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,SAAS,GAAG,SAAS,CAAC;IACpC,aAAa,EAAE,UAAU,EAAE,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,2FAA2F;IAC3F,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,EAAE,mBAAmB;IAIjC,gBAAgB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;IA0BjE,kBAAkB,CACtB,WAAW,EAAE,cAAc,EAC3B,OAAO,EAAE,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC,GAC3C,OAAO,CAAC,cAAc,CAAC;YAqEZ,sBAAsB;YAqDtB,4BAA4B;YAiB5B,wBAAwB;YAmBxB,gBAAgB;YAyBhB,kBAAkB;IAwDhC,OAAO,CAAC,cAAc;YAQR,eAAe;YAaf,gBAAgB;IAgF9B;;;;OAIG;YACW,gBAAgB;CAc/B"}
|
|
@@ -9,9 +9,9 @@ import { extractRelativePath } from "../../utils/route-path-utils.js";
|
|
|
9
9
|
import { resolveAppComponentPath } from "../layouts/utils/app-resolver.js";
|
|
10
10
|
import { StreamTimeoutError, streamToString } from "../utils/stream-utils.js";
|
|
11
11
|
import { profilePhase, profileSyncPhase } from "../../observability/request-profiler.js";
|
|
12
|
-
import { normalizeCssModuleKey, rewriteCssModuleContent, } from "../../transforms/css-modules/naming.js";
|
|
13
12
|
import { extractProjectClassesForRoute, startPreparedCSSWarmup, startProjectCSSPreparation, } from "./html-project-css.js";
|
|
14
13
|
import { buildHeadElements as buildCollectedHeadElements, mergeFrontmatter as mergeCollectedFrontmatter, } from "./html-head.js";
|
|
14
|
+
import { mergeImportedCSS as mergeImportedProjectCss } from "./html-imported-css.js";
|
|
15
15
|
const logger = rendererLogger.component("html-generator");
|
|
16
16
|
function applyExplicitThemeToDocument(html, colorScheme, enabled) {
|
|
17
17
|
if (!enabled || !colorScheme)
|
|
@@ -297,53 +297,13 @@ export class HTMLGenerator {
|
|
|
297
297
|
* double-loading globals.css when it's both auto-discovered and explicitly imported.
|
|
298
298
|
*/
|
|
299
299
|
async mergeImportedCSS(globalCSS, cssImports, stylesheetPath) {
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
if (!uniqueImports.has(normalized)) {
|
|
308
|
-
uniqueImports.set(normalized, cssPath);
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
const sortedImports = [...uniqueImports.entries()].sort((a, b) => a[0].localeCompare(b[0]));
|
|
312
|
-
const regularCssSegments = [];
|
|
313
|
-
const moduleCssSegments = [];
|
|
314
|
-
for (const [normalizedCssPath, cssPath] of sortedImports) {
|
|
315
|
-
// Deduplicate only exact path matches to avoid skipping unrelated files
|
|
316
|
-
// like /styles/globals.css when the configured stylesheet is /globals.css.
|
|
317
|
-
if (normalizedCssPath === configuredStylesheetAbsolute) {
|
|
318
|
-
continue;
|
|
319
|
-
}
|
|
320
|
-
try {
|
|
321
|
-
const content = await this.config.adapter.fs.readFile(cssPath);
|
|
322
|
-
if (!content)
|
|
323
|
-
continue;
|
|
324
|
-
if (normalizedCssPath.endsWith(".module.css")) {
|
|
325
|
-
moduleCssSegments.push(rewriteCssModuleContent(content, normalizedCssPath));
|
|
326
|
-
}
|
|
327
|
-
else {
|
|
328
|
-
regularCssSegments.push(content);
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
catch (_) {
|
|
332
|
-
/* expected: imported CSS file may not exist */
|
|
333
|
-
logger.debug("Could not load imported CSS file", { cssPath });
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
if (regularCssSegments.length === 0 && moduleCssSegments.length === 0)
|
|
337
|
-
return globalCSS;
|
|
338
|
-
const combined = [globalCSS, ...regularCssSegments, ...moduleCssSegments]
|
|
339
|
-
.filter(Boolean)
|
|
340
|
-
.join("\n");
|
|
341
|
-
logger.debug("Merged imported CSS with global stylesheet", {
|
|
342
|
-
importedCount: regularCssSegments.length + moduleCssSegments.length,
|
|
343
|
-
regularCount: regularCssSegments.length,
|
|
344
|
-
moduleCount: moduleCssSegments.length,
|
|
345
|
-
totalLength: combined.length,
|
|
300
|
+
return mergeImportedProjectCss({
|
|
301
|
+
fs: this.config.adapter.fs,
|
|
302
|
+
logger,
|
|
303
|
+
projectDir: this.config.projectDir,
|
|
304
|
+
globalCSS,
|
|
305
|
+
cssImports,
|
|
306
|
+
stylesheetPath,
|
|
346
307
|
});
|
|
347
|
-
return combined;
|
|
348
308
|
}
|
|
349
309
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.1.
|
|
1
|
+
export declare const VERSION = "0.1.174";
|
|
2
2
|
//# sourceMappingURL=version-constant.d.ts.map
|
package/package.json
CHANGED
package/src/deno.js
CHANGED
|
@@ -13,7 +13,10 @@ import {
|
|
|
13
13
|
createRuntimeJsonSchema,
|
|
14
14
|
createRuntimeTool,
|
|
15
15
|
} from "./runtime-tool-builder.js";
|
|
16
|
-
import {
|
|
16
|
+
import {
|
|
17
|
+
createAnthropicWebFetchToolSet,
|
|
18
|
+
createAnthropicWebSearchToolSet,
|
|
19
|
+
} from "./provider-native-tools.js";
|
|
17
20
|
|
|
18
21
|
export interface ConvertToolsToRuntimeToolsOptions {
|
|
19
22
|
model?: string;
|
|
@@ -35,7 +38,11 @@ function resolveHostedProvider(model?: string): string | undefined {
|
|
|
35
38
|
function resolveProviderNativeTools(
|
|
36
39
|
options?: ConvertToolsToRuntimeToolsOptions,
|
|
37
40
|
): RuntimeToolSet | undefined {
|
|
38
|
-
if (
|
|
41
|
+
if (
|
|
42
|
+
!options?.allowedToolNames?.some((toolName) =>
|
|
43
|
+
toolName === "web_search" || toolName === "web_fetch"
|
|
44
|
+
)
|
|
45
|
+
) {
|
|
39
46
|
return undefined;
|
|
40
47
|
}
|
|
41
48
|
|
|
@@ -43,7 +50,10 @@ function resolveProviderNativeTools(
|
|
|
43
50
|
return undefined;
|
|
44
51
|
}
|
|
45
52
|
|
|
46
|
-
return
|
|
53
|
+
return {
|
|
54
|
+
...createAnthropicWebSearchToolSet(),
|
|
55
|
+
...createAnthropicWebFetchToolSet(),
|
|
56
|
+
};
|
|
47
57
|
}
|
|
48
58
|
|
|
49
59
|
/**
|
|
@@ -46,6 +46,63 @@ const WEB_SEARCH_OUTPUT_SCHEMA: JsonSchema = {
|
|
|
46
46
|
},
|
|
47
47
|
};
|
|
48
48
|
|
|
49
|
+
const WEB_FETCH_INPUT_SCHEMA: JsonSchema = {
|
|
50
|
+
type: "object",
|
|
51
|
+
properties: {
|
|
52
|
+
url: {
|
|
53
|
+
type: "string",
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
required: ["url"],
|
|
57
|
+
additionalProperties: false,
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const WEB_FETCH_OUTPUT_SCHEMA: JsonSchema = {
|
|
61
|
+
type: "object",
|
|
62
|
+
properties: {
|
|
63
|
+
type: {
|
|
64
|
+
type: "string",
|
|
65
|
+
const: "web_fetch_result",
|
|
66
|
+
},
|
|
67
|
+
url: {
|
|
68
|
+
type: "string",
|
|
69
|
+
},
|
|
70
|
+
content: {
|
|
71
|
+
type: "object",
|
|
72
|
+
properties: {
|
|
73
|
+
type: {
|
|
74
|
+
type: "string",
|
|
75
|
+
const: "document",
|
|
76
|
+
},
|
|
77
|
+
source: {
|
|
78
|
+
type: "object",
|
|
79
|
+
properties: {
|
|
80
|
+
type: {
|
|
81
|
+
type: "string",
|
|
82
|
+
enum: ["text", "base64"],
|
|
83
|
+
},
|
|
84
|
+
mediaType: {
|
|
85
|
+
type: "string",
|
|
86
|
+
},
|
|
87
|
+
data: {
|
|
88
|
+
type: "string",
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
required: ["type", "mediaType", "data"],
|
|
92
|
+
additionalProperties: true,
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
required: ["type", "source"],
|
|
96
|
+
additionalProperties: true,
|
|
97
|
+
},
|
|
98
|
+
retrievedAt: {
|
|
99
|
+
type: "string",
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
required: ["type", "url", "content", "retrievedAt"],
|
|
103
|
+
additionalProperties: false,
|
|
104
|
+
};
|
|
105
|
+
|
|
49
106
|
export function createAnthropicWebSearchToolSet(): RuntimeToolSet {
|
|
50
107
|
return {
|
|
51
108
|
web_search: createRuntimeProviderTool({
|
|
@@ -59,3 +116,15 @@ export function createAnthropicWebSearchToolSet(): RuntimeToolSet {
|
|
|
59
116
|
}),
|
|
60
117
|
};
|
|
61
118
|
}
|
|
119
|
+
|
|
120
|
+
export function createAnthropicWebFetchToolSet(): RuntimeToolSet {
|
|
121
|
+
return {
|
|
122
|
+
web_fetch: createRuntimeProviderTool({
|
|
123
|
+
id: "anthropic.web_fetch_20250910",
|
|
124
|
+
args: {},
|
|
125
|
+
inputSchema: createLazyRuntimeJsonSchema(WEB_FETCH_INPUT_SCHEMA),
|
|
126
|
+
outputSchema: createLazyRuntimeJsonSchema(WEB_FETCH_OUTPUT_SCHEMA),
|
|
127
|
+
supportsDeferredResults: true,
|
|
128
|
+
}),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
@@ -396,6 +396,16 @@ export class ReadOperations {
|
|
|
396
396
|
}
|
|
397
397
|
}
|
|
398
398
|
|
|
399
|
+
private storeFetchedContent(
|
|
400
|
+
cacheKey: string,
|
|
401
|
+
content: string,
|
|
402
|
+
shouldCache: boolean,
|
|
403
|
+
): string {
|
|
404
|
+
if (shouldCache) this.cache.set(cacheKey, content);
|
|
405
|
+
setRequestScopedFile(cacheKey, content);
|
|
406
|
+
return content;
|
|
407
|
+
}
|
|
408
|
+
|
|
399
409
|
private async fetchContent(normalizedPath: string): Promise<string> {
|
|
400
410
|
// Framework paths should NEVER be fetched from API - they must be read from local filesystem.
|
|
401
411
|
// If we reach here for a framework path, the module server's local resolution failed.
|
|
@@ -581,9 +591,7 @@ export class ReadOperations {
|
|
|
581
591
|
releaseId,
|
|
582
592
|
});
|
|
583
593
|
|
|
584
|
-
|
|
585
|
-
setRequestScopedFile(cacheKey, content);
|
|
586
|
-
return content;
|
|
594
|
+
return this.storeFetchedContent(cacheKey, content, shouldCache);
|
|
587
595
|
} catch (error) {
|
|
588
596
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
589
597
|
const is404Error = isNotFoundLikeError(error);
|
|
@@ -642,9 +650,7 @@ export class ReadOperations {
|
|
|
642
650
|
contentLength: result.content.length,
|
|
643
651
|
});
|
|
644
652
|
|
|
645
|
-
|
|
646
|
-
setRequestScopedFile(cacheKey, result.content);
|
|
647
|
-
return result.content;
|
|
653
|
+
return this.storeFetchedContent(cacheKey, result.content, shouldCache);
|
|
648
654
|
} catch (error) {
|
|
649
655
|
logger.debug("Pattern search failed, trying sequential fallback", {
|
|
650
656
|
originalPath: apiPath,
|
|
@@ -713,9 +719,7 @@ export class ReadOperations {
|
|
|
713
719
|
candidateCount: candidates.length,
|
|
714
720
|
});
|
|
715
721
|
|
|
716
|
-
|
|
717
|
-
setRequestScopedFile(cacheKey, content);
|
|
718
|
-
return content;
|
|
722
|
+
return this.storeFetchedContent(cacheKey, content, shouldCache);
|
|
719
723
|
} catch (_) {
|
|
720
724
|
/* expected: this extension variant does not exist, try next priority */
|
|
721
725
|
continue;
|
|
@@ -746,8 +750,6 @@ export class ReadOperations {
|
|
|
746
750
|
willCache: shouldCache,
|
|
747
751
|
});
|
|
748
752
|
|
|
749
|
-
|
|
750
|
-
setRequestScopedFile(cacheKey, content);
|
|
751
|
-
return content;
|
|
753
|
+
return this.storeFetchedContent(cacheKey, content, shouldCache);
|
|
752
754
|
}
|
|
753
755
|
}
|
|
@@ -723,6 +723,19 @@ function buildAnthropicGenerateResult(payload: unknown): {
|
|
|
723
723
|
result: block.content,
|
|
724
724
|
});
|
|
725
725
|
}
|
|
726
|
+
|
|
727
|
+
if (
|
|
728
|
+
blockType === "web_fetch_tool_result" &&
|
|
729
|
+
typeof block?.tool_use_id === "string" &&
|
|
730
|
+
readRecord(block?.content)
|
|
731
|
+
) {
|
|
732
|
+
normalized.push({
|
|
733
|
+
type: "tool-result",
|
|
734
|
+
toolCallId: block.tool_use_id,
|
|
735
|
+
toolName: "web_fetch",
|
|
736
|
+
result: block.content,
|
|
737
|
+
});
|
|
738
|
+
}
|
|
726
739
|
}
|
|
727
740
|
|
|
728
741
|
return {
|
|
@@ -851,6 +864,20 @@ async function* streamAnthropicCompatibleParts(
|
|
|
851
864
|
};
|
|
852
865
|
}
|
|
853
866
|
|
|
867
|
+
if (
|
|
868
|
+
blockType === "web_fetch_tool_result" &&
|
|
869
|
+
typeof contentBlock?.tool_use_id === "string" &&
|
|
870
|
+
readRecord(contentBlock?.content)
|
|
871
|
+
) {
|
|
872
|
+
yield {
|
|
873
|
+
type: "tool-result",
|
|
874
|
+
toolCallId: contentBlock.tool_use_id,
|
|
875
|
+
toolName: "web_fetch",
|
|
876
|
+
result: contentBlock.content,
|
|
877
|
+
providerExecuted: true,
|
|
878
|
+
};
|
|
879
|
+
}
|
|
880
|
+
|
|
854
881
|
continue;
|
|
855
882
|
}
|
|
856
883
|
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { join } from "../../platform/compat/path/index.js";
|
|
2
|
+
import {
|
|
3
|
+
normalizeCssModuleKey,
|
|
4
|
+
rewriteCssModuleContent,
|
|
5
|
+
} from "../../transforms/css-modules/naming.js";
|
|
6
|
+
|
|
7
|
+
interface CssFsAdapterLike {
|
|
8
|
+
readFile(path: string): Promise<string>;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
interface CssLoggerLike {
|
|
12
|
+
debug(message: string, context?: Record<string, unknown>): void;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
interface MergeImportedCssOptions {
|
|
16
|
+
fs: CssFsAdapterLike;
|
|
17
|
+
logger: CssLoggerLike;
|
|
18
|
+
projectDir: string;
|
|
19
|
+
globalCSS: string | undefined;
|
|
20
|
+
cssImports: string[] | undefined;
|
|
21
|
+
stylesheetPath: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export async function mergeImportedCSS({
|
|
25
|
+
fs,
|
|
26
|
+
logger,
|
|
27
|
+
projectDir,
|
|
28
|
+
globalCSS,
|
|
29
|
+
cssImports,
|
|
30
|
+
stylesheetPath,
|
|
31
|
+
}: MergeImportedCssOptions): Promise<string | undefined> {
|
|
32
|
+
if (!cssImports || cssImports.length === 0) return globalCSS;
|
|
33
|
+
|
|
34
|
+
const normalizedStylesheetPath = stylesheetPath.replace(/^\/+/, "");
|
|
35
|
+
const configuredStylesheetAbsolute = normalizeCssModuleKey(
|
|
36
|
+
join(projectDir, normalizedStylesheetPath),
|
|
37
|
+
);
|
|
38
|
+
const uniqueImports = new Map<string, string>();
|
|
39
|
+
for (const cssPath of cssImports) {
|
|
40
|
+
const normalized = normalizeCssModuleKey(cssPath);
|
|
41
|
+
if (!uniqueImports.has(normalized)) {
|
|
42
|
+
uniqueImports.set(normalized, cssPath);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const sortedImports = [...uniqueImports.entries()].sort((a, b) => a[0].localeCompare(b[0]));
|
|
47
|
+
const regularCssSegments: string[] = [];
|
|
48
|
+
const moduleCssSegments: string[] = [];
|
|
49
|
+
|
|
50
|
+
for (const [normalizedCssPath, cssPath] of sortedImports) {
|
|
51
|
+
if (normalizedCssPath === configuredStylesheetAbsolute) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
try {
|
|
56
|
+
const content = await fs.readFile(cssPath);
|
|
57
|
+
if (!content) continue;
|
|
58
|
+
|
|
59
|
+
if (normalizedCssPath.endsWith(".module.css")) {
|
|
60
|
+
moduleCssSegments.push(rewriteCssModuleContent(content, normalizedCssPath));
|
|
61
|
+
} else {
|
|
62
|
+
regularCssSegments.push(content);
|
|
63
|
+
}
|
|
64
|
+
} catch (_) {
|
|
65
|
+
logger.debug("Could not load imported CSS file", { cssPath });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (regularCssSegments.length === 0 && moduleCssSegments.length === 0) return globalCSS;
|
|
70
|
+
|
|
71
|
+
const combined = [globalCSS, ...regularCssSegments, ...moduleCssSegments]
|
|
72
|
+
.filter(Boolean)
|
|
73
|
+
.join("\n");
|
|
74
|
+
logger.debug("Merged imported CSS with global stylesheet", {
|
|
75
|
+
importedCount: regularCssSegments.length + moduleCssSegments.length,
|
|
76
|
+
regularCount: regularCssSegments.length,
|
|
77
|
+
moduleCount: moduleCssSegments.length,
|
|
78
|
+
totalLength: combined.length,
|
|
79
|
+
});
|
|
80
|
+
return combined;
|
|
81
|
+
}
|
|
@@ -27,10 +27,6 @@ import { extractRelativePath } from "../../utils/route-path-utils.js";
|
|
|
27
27
|
import { resolveAppComponentPath } from "../layouts/utils/app-resolver.js";
|
|
28
28
|
import { StreamTimeoutError, streamToString } from "../utils/stream-utils.js";
|
|
29
29
|
import { profilePhase, profileSyncPhase } from "../../observability/request-profiler.js";
|
|
30
|
-
import {
|
|
31
|
-
normalizeCssModuleKey,
|
|
32
|
-
rewriteCssModuleContent,
|
|
33
|
-
} from "../../transforms/css-modules/naming.js";
|
|
34
30
|
import {
|
|
35
31
|
extractProjectClassesForRoute,
|
|
36
32
|
type ProjectCSSResult,
|
|
@@ -41,6 +37,7 @@ import {
|
|
|
41
37
|
buildHeadElements as buildCollectedHeadElements,
|
|
42
38
|
mergeFrontmatter as mergeCollectedFrontmatter,
|
|
43
39
|
} from "./html-head.js";
|
|
40
|
+
import { mergeImportedCSS as mergeImportedProjectCss } from "./html-imported-css.js";
|
|
44
41
|
|
|
45
42
|
const logger = rendererLogger.component("html-generator");
|
|
46
43
|
|
|
@@ -508,57 +505,13 @@ export class HTMLGenerator {
|
|
|
508
505
|
cssImports: string[] | undefined,
|
|
509
506
|
stylesheetPath: string,
|
|
510
507
|
): Promise<string | undefined> {
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
for (const cssPath of cssImports) {
|
|
519
|
-
const normalized = normalizeCssModuleKey(cssPath);
|
|
520
|
-
if (!uniqueImports.has(normalized)) {
|
|
521
|
-
uniqueImports.set(normalized, cssPath);
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
const sortedImports = [...uniqueImports.entries()].sort((a, b) => a[0].localeCompare(b[0]));
|
|
526
|
-
const regularCssSegments: string[] = [];
|
|
527
|
-
const moduleCssSegments: string[] = [];
|
|
528
|
-
|
|
529
|
-
for (const [normalizedCssPath, cssPath] of sortedImports) {
|
|
530
|
-
// Deduplicate only exact path matches to avoid skipping unrelated files
|
|
531
|
-
// like /styles/globals.css when the configured stylesheet is /globals.css.
|
|
532
|
-
if (normalizedCssPath === configuredStylesheetAbsolute) {
|
|
533
|
-
continue;
|
|
534
|
-
}
|
|
535
|
-
|
|
536
|
-
try {
|
|
537
|
-
const content = await this.config.adapter.fs.readFile(cssPath);
|
|
538
|
-
if (!content) continue;
|
|
539
|
-
|
|
540
|
-
if (normalizedCssPath.endsWith(".module.css")) {
|
|
541
|
-
moduleCssSegments.push(rewriteCssModuleContent(content, normalizedCssPath));
|
|
542
|
-
} else {
|
|
543
|
-
regularCssSegments.push(content);
|
|
544
|
-
}
|
|
545
|
-
} catch (_) {
|
|
546
|
-
/* expected: imported CSS file may not exist */
|
|
547
|
-
logger.debug("Could not load imported CSS file", { cssPath });
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
if (regularCssSegments.length === 0 && moduleCssSegments.length === 0) return globalCSS;
|
|
552
|
-
|
|
553
|
-
const combined = [globalCSS, ...regularCssSegments, ...moduleCssSegments]
|
|
554
|
-
.filter(Boolean)
|
|
555
|
-
.join("\n");
|
|
556
|
-
logger.debug("Merged imported CSS with global stylesheet", {
|
|
557
|
-
importedCount: regularCssSegments.length + moduleCssSegments.length,
|
|
558
|
-
regularCount: regularCssSegments.length,
|
|
559
|
-
moduleCount: moduleCssSegments.length,
|
|
560
|
-
totalLength: combined.length,
|
|
508
|
+
return mergeImportedProjectCss({
|
|
509
|
+
fs: this.config.adapter.fs,
|
|
510
|
+
logger,
|
|
511
|
+
projectDir: this.config.projectDir,
|
|
512
|
+
globalCSS,
|
|
513
|
+
cssImports,
|
|
514
|
+
stylesheetPath,
|
|
561
515
|
});
|
|
562
|
-
return combined;
|
|
563
516
|
}
|
|
564
517
|
}
|