veryfront 0.1.627 → 0.1.629
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.d.ts +3 -0
- package/esm/deno.js +7 -4
- package/esm/src/agent/composition/composition.d.ts +0 -1
- package/esm/src/agent/composition/composition.d.ts.map +1 -1
- package/esm/src/agent/composition/composition.js +15 -1
- package/esm/src/agent/runtime/chat-stream-handler.d.ts +2 -0
- package/esm/src/agent/runtime/chat-stream-handler.d.ts.map +1 -1
- package/esm/src/agent/runtime/chat-stream-handler.js +34 -15
- package/esm/src/agent/runtime/index.d.ts.map +1 -1
- package/esm/src/agent/runtime/index.js +30 -18
- package/esm/src/platform/compat/http/node-types.d.ts +4 -0
- package/esm/src/platform/compat/http/node-types.d.ts.map +1 -1
- package/esm/src/platform/compat/http/request-adapter.d.ts +12 -0
- package/esm/src/platform/compat/http/request-adapter.d.ts.map +1 -1
- package/esm/src/platform/compat/http/request-adapter.js +49 -4
- package/esm/src/server/dev-server/file-watch-setup.d.ts +15 -0
- package/esm/src/server/dev-server/file-watch-setup.d.ts.map +1 -1
- package/esm/src/server/dev-server/file-watch-setup.js +61 -4
- 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/esm/deno.d.ts
CHANGED
|
@@ -329,6 +329,9 @@ declare namespace _default {
|
|
|
329
329
|
"lint:wildcard-exports": string;
|
|
330
330
|
"lint:deps": string;
|
|
331
331
|
"lint:barrel-jsdoc": string;
|
|
332
|
+
"lint:ban-test-only": string;
|
|
333
|
+
"lint:sanitizer-baseline": string;
|
|
334
|
+
"lint:skipped-tests": string;
|
|
332
335
|
"test:scripts": string;
|
|
333
336
|
"test:cross-runtime": string;
|
|
334
337
|
"test:node": string;
|
package/esm/deno.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export default {
|
|
2
2
|
"name": "veryfront",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.629",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"nodeModulesDir": "auto",
|
|
6
6
|
"workspace": [
|
|
@@ -337,8 +337,8 @@ export default {
|
|
|
337
337
|
"fmt": "deno fmt src/ cli/ react/ && deno fmt --config=scripts/test.deno.json scripts/test/",
|
|
338
338
|
"fmt:check": "deno fmt --check src/ cli/ react/ && deno fmt --check --config=scripts/test.deno.json scripts/test/",
|
|
339
339
|
"typecheck": "deno task generate:manifests:check && deno check src/index.ts cli/main.ts src/server/index.ts src/routing/api/index.ts src/rendering/index.ts src/platform/index.ts src/platform/adapters/index.ts src/build/index.ts src/build/production-build/index.ts src/transforms/index.ts src/config/index.ts src/utils/index.ts src/data/index.ts src/security/index.ts src/middleware/index.ts src/server/handlers/dev/index.ts src/server/handlers/request/api/index.ts src/rendering/cache/index.ts src/rendering/cache/stores/index.ts src/rendering/rsc/actions/index.ts src/html/index.ts src/modules/index.ts src/proxy/main.ts src/chat/index.ts src/markdown/index.ts src/mdx/index.ts src/fs/index.ts src/oauth/index.ts src/agent/index.ts src/agent/service/route-export.check.ts src/tool/index.ts src/workflow/index.ts src/prompt/index.ts src/resource/index.ts src/runs/index.ts src/mcp/index.ts src/provider/index.ts",
|
|
340
|
-
"verify": "deno task generate:manifests:check && deno task fmt:check && deno task lint && deno task lint:style && deno task lint:cli-boundary && deno task lint:wildcard-exports && deno task lint:barrel-jsdoc && deno task lint:ban-zod && deno task lint:core-deps && deno task lint:dependency-boundaries && deno task lint:extension-contracts && deno task lint:extension-capabilities && deno task docs:validate && deno task typecheck && deno task test && deno task test:e2e:binary",
|
|
341
|
-
"verify:quick": "deno task generate:manifests:check && deno task fmt:check && deno task lint && deno task lint:style && deno task lint:cli-boundary && deno task lint:wildcard-exports && deno task lint:barrel-jsdoc && deno task lint:ban-zod && deno task lint:core-deps && deno task lint:dependency-boundaries && deno task lint:extension-contracts && deno task lint:extension-capabilities && deno task docs:validate && deno task typecheck",
|
|
340
|
+
"verify": "deno task generate:manifests:check && deno task fmt:check && deno task lint && deno task lint:style && deno task lint:cli-boundary && deno task lint:wildcard-exports && deno task lint:barrel-jsdoc && deno task lint:ban-test-only && deno task lint:sanitizer-baseline && deno task lint:skipped-tests && deno task lint:ban-zod && deno task lint:core-deps && deno task lint:dependency-boundaries && deno task lint:extension-contracts && deno task lint:extension-capabilities && deno task docs:validate && deno task typecheck && deno task test && deno task test:e2e:binary",
|
|
341
|
+
"verify:quick": "deno task generate:manifests:check && deno task fmt:check && deno task lint && deno task lint:style && deno task lint:cli-boundary && deno task lint:wildcard-exports && deno task lint:barrel-jsdoc && deno task lint:ban-test-only && deno task lint:sanitizer-baseline && deno task lint:skipped-tests && deno task lint:ban-zod && deno task lint:core-deps && deno task lint:dependency-boundaries && deno task lint:extension-contracts && deno task lint:extension-capabilities && deno task docs:validate && deno task typecheck",
|
|
342
342
|
"docs": "deno run --allow-read --allow-write --allow-run --allow-env scripts/docs/generate-api-reference.ts",
|
|
343
343
|
"docs:coverage": "deno run --allow-read scripts/docs/docs-coverage.ts",
|
|
344
344
|
"docs:copy": "rm -rf ../../docs/docs/code/api-reference && cp -r docs/api-reference/ ../../docs/docs/code/api-reference/",
|
|
@@ -363,7 +363,10 @@ export default {
|
|
|
363
363
|
"lint:wildcard-exports": "deno run --allow-read scripts/lint/ban-wildcard-exports.ts",
|
|
364
364
|
"lint:deps": "deno run --allow-read scripts/lint/audit-deps.ts",
|
|
365
365
|
"lint:barrel-jsdoc": "deno run --allow-read scripts/lint/check-barrel-jsdoc.ts",
|
|
366
|
-
"test
|
|
366
|
+
"lint:ban-test-only": "deno run --allow-read scripts/lint/ban-test-only.ts",
|
|
367
|
+
"lint:sanitizer-baseline": "deno run --allow-read scripts/lint/check-sanitizer-baseline.ts",
|
|
368
|
+
"lint:skipped-tests": "deno run --allow-read scripts/lint/check-skipped-tests-baseline.ts",
|
|
369
|
+
"test:scripts": "deno test --config=scripts/test.deno.json --no-check --allow-read --allow-write --allow-run scripts/build/generate-sbom.test.ts scripts/build/npm-dependency-sources.test.ts scripts/build/npm-package-metadata.test.ts scripts/build/npm-react-shims.test.ts scripts/docs/docs-coverage.test.ts scripts/docs/generate-api-reference.test.ts scripts/docs/guide-validation.test.ts scripts/lint/audit-core-deps.test.ts scripts/lint/audit-dependency-boundaries.test.ts scripts/lint/audit-extension-capabilities.test.ts scripts/lint/audit-extension-contracts.test.ts scripts/lint/audit-deps.test.ts scripts/lint/check-circular-baseline.test.ts scripts/lint/ban-test-only.test.ts scripts/lint/check-sanitizer-baseline.test.ts scripts/lint/check-skipped-tests-baseline.test.ts scripts/security/audit-npm.test.ts scripts/security/submit-dependency-snapshot.test.ts",
|
|
367
370
|
"test:cross-runtime": "deno run --allow-all src/platform/compat/cross-runtime.test.ts",
|
|
368
371
|
"test:node": "node ./tests/node/run-tests.mjs 'src/**/*.test.ts'",
|
|
369
372
|
"test:bun": "node ./tests/bun/run-tests.mjs src/",
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import type { Agent } from "../types.js";
|
|
2
2
|
import type { Tool } from "../../tool/index.js";
|
|
3
3
|
import { ScopedRegistryFacade } from "../../registry/scoped-registry-facade.js";
|
|
4
|
-
/** Agent as tool helper. */
|
|
5
4
|
export declare function agentAsTool(agent: Agent, description: string): Tool;
|
|
6
5
|
/** Public API contract for workflow step. */
|
|
7
6
|
export interface WorkflowStep {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composition.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/composition/composition.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"composition.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/composition/composition.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,KAAK,EAAiB,MAAM,aAAa,CAAC;AACxD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AAuBhF,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CA2BnE;AAED,6CAA6C;AAC7C,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACzD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzE;AAED,sCAAsC;AACtC,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED,qCAAqC;AACrC,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,uBAAuB;AACvB,wBAAgB,cAAc,CAC5B,MAAM,EAAE,cAAc,GACrB;IAAE,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;CAAE,CAsDrD;AAID,cAAM,kBAAmB,SAAQ,oBAAoB,CAAC,KAAK,CAAC;CAAG;AAG/D,eAAO,MAAM,aAAa,oBAAuC,CAAC;AAElE,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B,uBAAuB;AACvB,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAE5D;AAED,oBAAoB;AACpB,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAEtD;AAED,4BAA4B;AAC5B,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAEzC;AAqBD,8BAA8B;AAC9B,wBAAgB,gBAAgB,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAQ5F"}
|
|
@@ -12,6 +12,20 @@ import { ScopedRegistryFacade } from "../../registry/scoped-registry-facade.js";
|
|
|
12
12
|
import { ProjectScopedRegistryManager } from "../../registry/project-scoped-registry-manager.js";
|
|
13
13
|
import { getAgentToolInputSchema } from "../schemas/index.js";
|
|
14
14
|
/** Agent as tool helper. */
|
|
15
|
+
async function runAgentAsStreamingTool(agent, input) {
|
|
16
|
+
let finalResponse;
|
|
17
|
+
const stream = await agent.stream({
|
|
18
|
+
input,
|
|
19
|
+
onFinish: (response) => {
|
|
20
|
+
finalResponse = response;
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
await stream.toDataStreamResponse().arrayBuffer();
|
|
24
|
+
if (!finalResponse) {
|
|
25
|
+
throw new Error(`Agent "${agent.id}" stream completed without a final response.`);
|
|
26
|
+
}
|
|
27
|
+
return finalResponse;
|
|
28
|
+
}
|
|
15
29
|
export function agentAsTool(agent, description) {
|
|
16
30
|
return {
|
|
17
31
|
id: `agent_${agent.id}`,
|
|
@@ -20,7 +34,7 @@ export function agentAsTool(agent, description) {
|
|
|
20
34
|
inputSchema: getAgentToolInputSchema(),
|
|
21
35
|
execute({ input }) {
|
|
22
36
|
return withSpan("agent.composition.agentAsTool.execute", async () => {
|
|
23
|
-
const response = await agent
|
|
37
|
+
const response = await runAgentAsStreamingTool(agent, input);
|
|
24
38
|
setActiveSpanAttributes({
|
|
25
39
|
"agent.tool_calls": response.toolCalls.length,
|
|
26
40
|
"agent.status": response.status,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-stream-handler.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/chat-stream-handler.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAqB,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAiBtF,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC1C,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CAChF;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,KAAK,IAAI,CAAC;CACZ;AA+KD,wBAAgB,iBAAiB,IAAI,eAAe,CAQnD;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,+BAA+B,EAC3C,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,CAAC,EAAE,mBAAmB,EAC/B,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"chat-stream-handler.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/chat-stream-handler.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAqB,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAiBtF,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC1C,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CAChF;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,KAAK,IAAI,CAAC;CACZ;AA+KD,wBAAgB,iBAAiB,IAAI,eAAe,CAQnD;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,+BAA+B,EAC3C,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,CAAC,EAAE,mBAAmB,EAC/B,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,IAAI,CAAC,CA2cf"}
|
|
@@ -219,6 +219,26 @@ export function processStream(result, state, controller, encoder, textPartId, ca
|
|
|
219
219
|
});
|
|
220
220
|
activeReasoningId = null;
|
|
221
221
|
};
|
|
222
|
+
const announceToolInputStart = (toolCall) => {
|
|
223
|
+
if (toolCall.inputAnnounced === true) {
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
const dynamic = toolCall.dynamic ?? isDynamicTool(toolCall.name);
|
|
227
|
+
sendSSE(controller, encoder, {
|
|
228
|
+
type: "tool-input-start",
|
|
229
|
+
toolCallId: toolCall.id,
|
|
230
|
+
toolName: toolCall.name,
|
|
231
|
+
...(dynamic ? { dynamic: true } : {}),
|
|
232
|
+
});
|
|
233
|
+
for (const delta of toolCall.inputDeltas ?? []) {
|
|
234
|
+
sendSSE(controller, encoder, {
|
|
235
|
+
type: "tool-input-delta",
|
|
236
|
+
toolCallId: toolCall.id,
|
|
237
|
+
inputTextDelta: delta,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
toolCall.inputAnnounced = true;
|
|
241
|
+
};
|
|
222
242
|
const ensureToolLifecycle = (part) => {
|
|
223
243
|
const dynamic = part.dynamic ?? isDynamicTool(part.toolName);
|
|
224
244
|
const existing = state.toolCalls.get(part.toolCallId);
|
|
@@ -233,6 +253,7 @@ export function processStream(result, state, controller, encoder, textPartId, ca
|
|
|
233
253
|
? { providerExecuted: part.providerExecuted }
|
|
234
254
|
: {}),
|
|
235
255
|
...(dynamic ? { dynamic: true } : {}),
|
|
256
|
+
inputAnnounced: true,
|
|
236
257
|
});
|
|
237
258
|
sendSSE(controller, encoder, {
|
|
238
259
|
type: "tool-input-start",
|
|
@@ -267,6 +288,7 @@ export function processStream(result, state, controller, encoder, textPartId, ca
|
|
|
267
288
|
if (dynamic) {
|
|
268
289
|
existing.dynamic = true;
|
|
269
290
|
}
|
|
291
|
+
announceToolInputStart(existing);
|
|
270
292
|
sendSSE(controller, encoder, {
|
|
271
293
|
type: "tool-input-available",
|
|
272
294
|
toolCallId: part.toolCallId,
|
|
@@ -353,13 +375,8 @@ export function processStream(result, state, controller, encoder, textPartId, ca
|
|
|
353
375
|
inputAvailable: false,
|
|
354
376
|
providerExecuted: typedPart.providerExecuted,
|
|
355
377
|
dynamic: typedPart.dynamic,
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
sendSSE(controller, encoder, {
|
|
359
|
-
type: "tool-input-start",
|
|
360
|
-
toolCallId: toolId,
|
|
361
|
-
toolName: typedPart.toolName,
|
|
362
|
-
...(dynamic ? { dynamic: true } : {}),
|
|
378
|
+
inputDeltas: [],
|
|
379
|
+
inputAnnounced: false,
|
|
363
380
|
});
|
|
364
381
|
break;
|
|
365
382
|
}
|
|
@@ -370,11 +387,8 @@ export function processStream(result, state, controller, encoder, textPartId, ca
|
|
|
370
387
|
if (!tc)
|
|
371
388
|
break;
|
|
372
389
|
tc.arguments = mergeToolInputDelta(tc.arguments, typedPart.delta);
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
toolCallId: toolId,
|
|
376
|
-
inputTextDelta: typedPart.delta,
|
|
377
|
-
});
|
|
390
|
+
tc.inputDeltas ??= [];
|
|
391
|
+
tc.inputDeltas.push(typedPart.delta);
|
|
378
392
|
break;
|
|
379
393
|
}
|
|
380
394
|
case "tool-call": {
|
|
@@ -383,18 +397,23 @@ export function processStream(result, state, controller, encoder, textPartId, ca
|
|
|
383
397
|
// tool-call fires when the full tool call is available
|
|
384
398
|
const toolId = typedPart.toolCallId;
|
|
385
399
|
const inputStr = normalizeToolInputString(typedPart.input);
|
|
386
|
-
const
|
|
400
|
+
const previous = state.toolCalls.get(toolId);
|
|
401
|
+
const previousArguments = previous?.arguments ?? "";
|
|
387
402
|
const resolvedArguments = mergeToolCallInput(previousArguments, inputStr);
|
|
388
|
-
|
|
403
|
+
const toolCall = {
|
|
389
404
|
id: toolId,
|
|
390
405
|
name: typedPart.toolName,
|
|
391
406
|
arguments: resolvedArguments,
|
|
407
|
+
inputDeltas: previous?.inputDeltas ?? [],
|
|
408
|
+
inputAnnounced: previous?.inputAnnounced ?? false,
|
|
392
409
|
inputAvailable: true,
|
|
393
410
|
providerExecuted: typedPart.providerExecuted,
|
|
394
411
|
dynamic: typedPart.dynamic,
|
|
395
|
-
}
|
|
412
|
+
};
|
|
413
|
+
state.toolCalls.set(toolId, toolCall);
|
|
396
414
|
const dynamic = isDynamicTool(typedPart.toolName);
|
|
397
415
|
const inputObj = parseToolInputObject(typedPart.input);
|
|
416
|
+
announceToolInputStart(toolCall);
|
|
398
417
|
sendSSE(controller, encoder, {
|
|
399
418
|
type: "tool-input-available",
|
|
400
419
|
toolCallId: toolId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -445,6 +445,14 @@ export class AgentRuntime {
|
|
|
445
445
|
// to the route handler, which returns a 503 with browser fallback info
|
|
446
446
|
// instead of swallowing it as an in-band SSE error in a 200 response.
|
|
447
447
|
await ensureModelReady(languageModel);
|
|
448
|
+
const agentContext = {
|
|
449
|
+
agentId: this.id,
|
|
450
|
+
model: resolvedModelString,
|
|
451
|
+
input: messages,
|
|
452
|
+
data: context,
|
|
453
|
+
platform: detectPlatform(),
|
|
454
|
+
};
|
|
455
|
+
const chain = new MiddlewareChain(this.config.middleware);
|
|
448
456
|
return new ReadableStream({
|
|
449
457
|
start: async (controller) => {
|
|
450
458
|
try {
|
|
@@ -465,7 +473,7 @@ export class AgentRuntime {
|
|
|
465
473
|
model: effectiveModel,
|
|
466
474
|
},
|
|
467
475
|
});
|
|
468
|
-
const response = await this.executeAgentLoopStreaming(systemPrompt, memoryMessages, controller, encoder, callbacks, textPartId, toolContext, context, resolvedModelString, languageModel, transport.headers, transport.providerOptions, maxOutputTokensOverride, streamAbortSignal);
|
|
476
|
+
const response = await chain.execute(agentContext, () => this.executeAgentLoopStreaming(systemPrompt, memoryMessages, controller, encoder, callbacks, textPartId, toolContext, context, resolvedModelString, languageModel, transport.headers, transport.providerOptions, maxOutputTokensOverride, streamAbortSignal));
|
|
469
477
|
throwIfAborted(streamAbortSignal);
|
|
470
478
|
callbacks?.onFinish?.(response);
|
|
471
479
|
throwIfAborted(streamAbortSignal);
|
|
@@ -821,14 +829,16 @@ export class AgentRuntime {
|
|
|
821
829
|
partialArgumentsLength: materialized.partialArgumentsLength,
|
|
822
830
|
partialArgumentsPreview: materialized.partialArgumentsPreview,
|
|
823
831
|
});
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
`
|
|
830
|
-
|
|
831
|
-
|
|
832
|
+
if (tc.inputAnnounced === true) {
|
|
833
|
+
const dynamicIncomplete = isDynamicTool(tc.name);
|
|
834
|
+
sendSSE(controller, encoder, {
|
|
835
|
+
type: "tool-input-error",
|
|
836
|
+
toolCallId: tc.id,
|
|
837
|
+
errorText: `Stream terminated before tool-call event fired for "${tc.name}". ` +
|
|
838
|
+
`Received ${materialized.partialArgumentsLength} chars of partial tool-input deltas.`,
|
|
839
|
+
...(dynamicIncomplete ? { dynamic: true } : {}),
|
|
840
|
+
});
|
|
841
|
+
}
|
|
832
842
|
}
|
|
833
843
|
else if (materialized.kind === "parse-error") {
|
|
834
844
|
logger.warn("Failed to parse streamed tool arguments", {
|
|
@@ -897,7 +907,7 @@ export class AgentRuntime {
|
|
|
897
907
|
status: "pending",
|
|
898
908
|
};
|
|
899
909
|
await this.recordToolError(incompleteToolCall, `Stream terminated before tool-call event fired for "${tc.name}". ` +
|
|
900
|
-
`Received ${tc.arguments.length} chars of partial tool-input deltas.`, controller, encoder, currentMessages, toolCalls, currentRunToolState);
|
|
910
|
+
`Received ${tc.arguments.length} chars of partial tool-input deltas.`, controller, encoder, currentMessages, toolCalls, currentRunToolState, { emitSse: tc.inputAnnounced === true });
|
|
901
911
|
continue;
|
|
902
912
|
}
|
|
903
913
|
const capturedInput = captureStreamedToolCallInput(tc);
|
|
@@ -1019,17 +1029,19 @@ export class AgentRuntime {
|
|
|
1019
1029
|
/**
|
|
1020
1030
|
* Record a tool error and send SSE event.
|
|
1021
1031
|
*/
|
|
1022
|
-
async recordToolError(toolCall, errorStr, controller, encoder, currentMessages, toolCalls, currentRunToolState) {
|
|
1032
|
+
async recordToolError(toolCall, errorStr, controller, encoder, currentMessages, toolCalls, currentRunToolState, options = {}) {
|
|
1023
1033
|
toolCall.status = "error";
|
|
1024
1034
|
toolCall.error = errorStr;
|
|
1025
1035
|
toolCalls.push(toolCall);
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1036
|
+
if (options.emitSse !== false) {
|
|
1037
|
+
const dynamic = isDynamicTool(toolCall.name);
|
|
1038
|
+
sendSSE(controller, encoder, {
|
|
1039
|
+
type: "tool-output-error",
|
|
1040
|
+
toolCallId: toolCall.id,
|
|
1041
|
+
errorText: errorStr,
|
|
1042
|
+
...(dynamic ? { dynamic: true } : {}),
|
|
1043
|
+
});
|
|
1044
|
+
}
|
|
1033
1045
|
const errorMessage = createToolErrorMessage(toolCall.id, toolCall.name, errorStr);
|
|
1034
1046
|
currentMessages.push(errorMessage);
|
|
1035
1047
|
await this.memory.add(errorMessage);
|
|
@@ -5,6 +5,10 @@ export interface NodeIncomingMessage {
|
|
|
5
5
|
on(event: "data", handler: (chunk: Uint8Array) => void): void;
|
|
6
6
|
on(event: "end", handler: () => void): void;
|
|
7
7
|
on(event: "error", handler: (error: Error) => void): void;
|
|
8
|
+
/** Pause flowing mode — used to apply backpressure to the request body. */
|
|
9
|
+
pause?(): void;
|
|
10
|
+
/** Resume flowing mode once the body stream consumer asks for more. */
|
|
11
|
+
resume?(): void;
|
|
8
12
|
}
|
|
9
13
|
export interface NodeServerResponse {
|
|
10
14
|
statusCode: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-types.d.ts","sourceRoot":"","sources":["../../../../../src/src/platform/compat/http/node-types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC;IAC9D,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAC5C,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"node-types.d.ts","sourceRoot":"","sources":["../../../../../src/src/platform/compat/http/node-types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC;IAC9D,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAC5C,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1D,2EAA2E;IAC3E,KAAK,CAAC,IAAI,IAAI,CAAC;IACf,uEAAuE;IACvE,MAAM,CAAC,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IACxD,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IACjF,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;IACxC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;IACvC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;CAC3D;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACnE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAChE,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,CACV,eAAe,EAAE,CAAC,GAAG,EAAE,mBAAmB,EAAE,GAAG,EAAE,kBAAkB,KAAK,IAAI,GAC3E,UAAU,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,OAAO,GAAG,CAAC;CACjB"}
|
|
@@ -1,3 +1,15 @@
|
|
|
1
1
|
import type { NodeIncomingMessage } from "./node-types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Convert a Node `http.IncomingMessage` into a WHATWG `Request`.
|
|
4
|
+
*
|
|
5
|
+
* A Node request is a readable stream of body bytes. When a streaming body is
|
|
6
|
+
* supplied to the `Request` constructor (e.g. under Node's built-in fetch /
|
|
7
|
+
* undici), the spec requires `duplex: "half"` — without it the constructor
|
|
8
|
+
* throws `TypeError: RequestInit: duplex option is required when sending a
|
|
9
|
+
* body.`, which previously surfaced as a generic 500 for every POST/PUT/etc.
|
|
10
|
+
*
|
|
11
|
+
* Bodyless methods (`GET`/`HEAD`/`OPTIONS`) must not attach a body at all;
|
|
12
|
+
* `OPTIONS` in particular is used for CORS preflights and carries no body.
|
|
13
|
+
*/
|
|
2
14
|
export declare function convertNodeRequestToWebRequest(req: NodeIncomingMessage, url: string): Request;
|
|
3
15
|
//# sourceMappingURL=request-adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-adapter.d.ts","sourceRoot":"","sources":["../../../../../src/src/platform/compat/http/request-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"request-adapter.d.ts","sourceRoot":"","sources":["../../../../../src/src/platform/compat/http/request-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAK3D;;;;;;;;;;;GAWG;AACH,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,mBAAmB,EACxB,GAAG,EAAE,MAAM,GACV,OAAO,CAiBT"}
|
|
@@ -1,9 +1,54 @@
|
|
|
1
|
+
/** HTTP methods that never carry a request body. */
|
|
2
|
+
const BODYLESS_METHODS = new Set(["GET", "HEAD", "OPTIONS"]);
|
|
3
|
+
/**
|
|
4
|
+
* Convert a Node `http.IncomingMessage` into a WHATWG `Request`.
|
|
5
|
+
*
|
|
6
|
+
* A Node request is a readable stream of body bytes. When a streaming body is
|
|
7
|
+
* supplied to the `Request` constructor (e.g. under Node's built-in fetch /
|
|
8
|
+
* undici), the spec requires `duplex: "half"` — without it the constructor
|
|
9
|
+
* throws `TypeError: RequestInit: duplex option is required when sending a
|
|
10
|
+
* body.`, which previously surfaced as a generic 500 for every POST/PUT/etc.
|
|
11
|
+
*
|
|
12
|
+
* Bodyless methods (`GET`/`HEAD`/`OPTIONS`) must not attach a body at all;
|
|
13
|
+
* `OPTIONS` in particular is used for CORS preflights and carries no body.
|
|
14
|
+
*/
|
|
1
15
|
export function convertNodeRequestToWebRequest(req, url) {
|
|
2
|
-
const method = req.method;
|
|
3
|
-
const
|
|
4
|
-
|
|
16
|
+
const method = req.method ?? "GET";
|
|
17
|
+
const hasBody = !BODYLESS_METHODS.has(method.toUpperCase());
|
|
18
|
+
// `duplex` is part of the WHATWG fetch spec but not yet in the lib.dom
|
|
19
|
+
// `RequestInit` type, hence the intersection.
|
|
20
|
+
const init = {
|
|
5
21
|
method,
|
|
6
22
|
headers: req.headers,
|
|
7
|
-
|
|
23
|
+
};
|
|
24
|
+
if (hasBody) {
|
|
25
|
+
init.body = nodeRequestToReadableStream(req);
|
|
26
|
+
init.duplex = "half";
|
|
27
|
+
}
|
|
28
|
+
return new Request(url, init);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Adapt a Node readable request into a web `ReadableStream` using only the
|
|
32
|
+
* event interface declared on {@link NodeIncomingMessage}, so this stays free
|
|
33
|
+
* of a hard `node:stream` dependency (consistent with the rest of the compat
|
|
34
|
+
* layer, which avoids static Node imports for non-Node runtimes).
|
|
35
|
+
*/
|
|
36
|
+
function nodeRequestToReadableStream(req) {
|
|
37
|
+
return new ReadableStream({
|
|
38
|
+
start(controller) {
|
|
39
|
+
req.on("data", (chunk) => {
|
|
40
|
+
controller.enqueue(chunk);
|
|
41
|
+
// Apply backpressure: once the stream's internal queue is full, pause
|
|
42
|
+
// the Node request so it stops buffering the whole body in memory.
|
|
43
|
+
if ((controller.desiredSize ?? 1) <= 0)
|
|
44
|
+
req.pause?.();
|
|
45
|
+
});
|
|
46
|
+
req.on("end", () => controller.close());
|
|
47
|
+
req.on("error", (error) => controller.error(error));
|
|
48
|
+
},
|
|
49
|
+
pull() {
|
|
50
|
+
// The consumer asked for more — resume flowing mode.
|
|
51
|
+
req.resume?.();
|
|
52
|
+
},
|
|
8
53
|
});
|
|
9
54
|
}
|
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
import type { RuntimeAdapter } from "../../platform/adapters/base.js";
|
|
2
2
|
import type { RouteDiscovery } from "./route-discovery.js";
|
|
3
|
+
/**
|
|
4
|
+
* Check if a path should be ignored for HMR purposes — either because it lives
|
|
5
|
+
* in a generated/output directory or because it is a generated-artifact file.
|
|
6
|
+
*
|
|
7
|
+
* Exported for unit testing.
|
|
8
|
+
*/
|
|
9
|
+
export declare function shouldIgnorePath(path: string): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Whether a path lives inside a generated build-output directory, evaluated
|
|
12
|
+
* relative to `projectDir` so directories *above* the project (which the user
|
|
13
|
+
* cannot control, e.g. a checkout under `/some/dist/...`) are never matched.
|
|
14
|
+
*
|
|
15
|
+
* Exported for unit testing.
|
|
16
|
+
*/
|
|
17
|
+
export declare function isIgnoredOutputDir(projectDir: string, fullPath: string): boolean;
|
|
3
18
|
export declare class FileWatchSetup {
|
|
4
19
|
private projectDir;
|
|
5
20
|
private adapter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-watch-setup.d.ts","sourceRoot":"","sources":["../../../../src/src/server/dev-server/file-watch-setup.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"file-watch-setup.d.ts","sourceRoot":"","sources":["../../../../src/src/server/dev-server/file-watch-setup.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AA0E3D;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGtD;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMhF;AAED,qBAAa,cAAc;IAUvB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,oBAAoB,CAAC;IAd/B,OAAO,CAAC,WAAW,CAAC,CAAoB;IACxC,OAAO,CAAC,iBAAiB,CAAC,CAAkB;IAC5C,OAAO,CAAC,gBAAgB,CAAC,CAAuB;IAChD,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,aAAa,CAAc;IACnC,uEAAuE;IACvE,OAAO,CAAC,aAAa,CAA6B;gBAGxC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,EACvB,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,MAAM,EAClB,iBAAiB,GAAE,MAAM,IAAe,EACxC,oBAAoB,CAAC,GAAE,MAAM,OAAO,CAAC,IAAI,CAAC,aAAA,EAClD,iBAAiB,CAAC,EAAE,MAAM,EAAE;IAKxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YA8Bd,aAAa;YA2Bb,kBAAkB;YAiClB,gBAAgB;IAkB9B;;;OAGG;IACH,OAAO,CAAC,eAAe;IAMvB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAMzB,8CAA8C;IAC9C,OAAO,CAAC,WAAW;IASnB,6DAA6D;YAC/C,kBAAkB;YAkBlB,wBAAwB;YA6BxB,yBAAyB;IAMvC,UAAU;IAIV,OAAO,IAAI,IAAI;CAYhB"}
|
|
@@ -23,7 +23,24 @@ const IGNORED_PATH_PATTERNS = [
|
|
|
23
23
|
".git\\",
|
|
24
24
|
".veryfront/",
|
|
25
25
|
".veryfront\\",
|
|
26
|
+
// Tool output directories that live inside the project root. Tools such as
|
|
27
|
+
// the Playwright MCP server write per-step artifacts here continuously,
|
|
28
|
+
// which would otherwise drive an open-ended HMR refresh loop.
|
|
29
|
+
".playwright-mcp/",
|
|
30
|
+
".playwright-mcp\\",
|
|
26
31
|
];
|
|
32
|
+
/**
|
|
33
|
+
* Generated-artifact file extensions that are never source and must never
|
|
34
|
+
* trigger an HMR update — even when written outside an ignored directory
|
|
35
|
+
* (e.g. a tool that drops a `.log` into the project root). This is the
|
|
36
|
+
* defensive guarantee against future tools writing to as-yet-unknown paths.
|
|
37
|
+
*
|
|
38
|
+
* Deliberately narrow: only extensions that are unambiguously machine output.
|
|
39
|
+
* veryfront hot-reloads more than JS (`.css`, `.mdx`/`.md`, and arbitrary
|
|
40
|
+
* primitive-directory resources), so an allowlist of "source" extensions
|
|
41
|
+
* would wrongly suppress legitimate updates.
|
|
42
|
+
*/
|
|
43
|
+
const IGNORED_ARTIFACT_EXTENSIONS = new Set([".log", ".tmp"]);
|
|
27
44
|
/**
|
|
28
45
|
* Project-root directory names that contain runtime data (not source code)
|
|
29
46
|
* and should be excluded from HMR. Matched by first path segment relative
|
|
@@ -31,10 +48,49 @@ const IGNORED_PATH_PATTERNS = [
|
|
|
31
48
|
*/
|
|
32
49
|
const IGNORED_RUNTIME_DIRS = new Set(["data"]);
|
|
33
50
|
/**
|
|
34
|
-
*
|
|
51
|
+
* Generated build-output directory names. Matched as an exact path *segment*
|
|
52
|
+
* relative to projectDir (at any depth), so a real `dist/` inside the project
|
|
53
|
+
* is skipped while:
|
|
54
|
+
* - an ancestor directory named `dist` (the project being checked out under
|
|
55
|
+
* one, e.g. `/workspace/dist/my-app/`) does NOT suppress every source
|
|
56
|
+
* change — the match is project-relative, and
|
|
57
|
+
* - a source dir whose name merely ends in "dist" (e.g. `mydist/`,
|
|
58
|
+
* `wishlist-dist/`) is NOT matched — segments are compared exactly.
|
|
59
|
+
*/
|
|
60
|
+
const IGNORED_OUTPUT_DIRS = new Set(["dist"]);
|
|
61
|
+
/** Whether a path ends in a generated-artifact extension (case-insensitive). */
|
|
62
|
+
function hasIgnoredArtifactExtension(path) {
|
|
63
|
+
const lower = path.toLowerCase();
|
|
64
|
+
for (const ext of IGNORED_ARTIFACT_EXTENSIONS) {
|
|
65
|
+
if (lower.endsWith(ext))
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Check if a path should be ignored for HMR purposes — either because it lives
|
|
72
|
+
* in a generated/output directory or because it is a generated-artifact file.
|
|
73
|
+
*
|
|
74
|
+
* Exported for unit testing.
|
|
75
|
+
*/
|
|
76
|
+
export function shouldIgnorePath(path) {
|
|
77
|
+
return IGNORED_PATH_PATTERNS.some((pattern) => path.includes(pattern)) ||
|
|
78
|
+
hasIgnoredArtifactExtension(path);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Whether a path lives inside a generated build-output directory, evaluated
|
|
82
|
+
* relative to `projectDir` so directories *above* the project (which the user
|
|
83
|
+
* cannot control, e.g. a checkout under `/some/dist/...`) are never matched.
|
|
84
|
+
*
|
|
85
|
+
* Exported for unit testing.
|
|
35
86
|
*/
|
|
36
|
-
function
|
|
37
|
-
|
|
87
|
+
export function isIgnoredOutputDir(projectDir, fullPath) {
|
|
88
|
+
const rel = relative(projectDir, fullPath);
|
|
89
|
+
// A path outside the project root yields a `..`-prefixed relative path; such
|
|
90
|
+
// paths are not project output and are left to the absolute-pattern checks.
|
|
91
|
+
if (rel.startsWith(".."))
|
|
92
|
+
return false;
|
|
93
|
+
return rel.split(sep).some((segment) => IGNORED_OUTPUT_DIRS.has(segment));
|
|
38
94
|
}
|
|
39
95
|
export class FileWatchSetup {
|
|
40
96
|
projectDir;
|
|
@@ -113,7 +169,8 @@ export class FileWatchSetup {
|
|
|
113
169
|
break;
|
|
114
170
|
try {
|
|
115
171
|
// Filter out paths that shouldn't trigger HMR (cache, node_modules, runtime data, etc.)
|
|
116
|
-
const relevantPaths = paths.filter((p) => !shouldIgnorePath(p) && !this.isRuntimeDataPath(p)
|
|
172
|
+
const relevantPaths = paths.filter((p) => !shouldIgnorePath(p) && !this.isRuntimeDataPath(p) &&
|
|
173
|
+
!isIgnoredOutputDir(this.projectDir, p));
|
|
117
174
|
if (relevantPaths.length === 0)
|
|
118
175
|
continue;
|
|
119
176
|
if (this.optimizedWatcher) {
|