veryfront 0.1.146 → 0.1.147

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/esm/deno.js +1 -1
  2. package/esm/src/internal-agents/run-stream.d.ts.map +1 -1
  3. package/esm/src/internal-agents/run-stream.js +60 -79
  4. package/esm/src/internal-agents/schema.d.ts +243 -4
  5. package/esm/src/internal-agents/schema.d.ts.map +1 -1
  6. package/esm/src/internal-agents/schema.js +219 -8
  7. package/esm/src/jobs/schemas.d.ts +4 -4
  8. package/esm/src/mcp/elicitation.d.ts +16 -0
  9. package/esm/src/mcp/elicitation.d.ts.map +1 -0
  10. package/esm/src/mcp/elicitation.js +21 -0
  11. package/esm/src/mcp/index.d.ts +3 -0
  12. package/esm/src/mcp/index.d.ts.map +1 -1
  13. package/esm/src/mcp/index.js +2 -0
  14. package/esm/src/mcp/server.d.ts +22 -0
  15. package/esm/src/mcp/server.d.ts.map +1 -1
  16. package/esm/src/mcp/server.js +163 -2
  17. package/esm/src/mcp/task-store.d.ts +27 -0
  18. package/esm/src/mcp/task-store.d.ts.map +1 -0
  19. package/esm/src/mcp/task-store.js +116 -0
  20. package/esm/src/modules/react-loader/ssr-module-loader/cache/memory.d.ts.map +1 -1
  21. package/esm/src/modules/react-loader/ssr-module-loader/cache/memory.js +4 -2
  22. package/esm/src/server/handlers/request/agent-stream.handler.d.ts.map +1 -1
  23. package/esm/src/server/handlers/request/agent-stream.handler.js +4 -3
  24. package/esm/src/tool/remote-mcp.d.ts.map +1 -1
  25. package/esm/src/tool/remote-mcp.js +60 -1
  26. package/esm/src/tool/types.d.ts +2 -0
  27. package/esm/src/tool/types.d.ts.map +1 -1
  28. package/esm/src/utils/version-constant.d.ts +1 -1
  29. package/esm/src/utils/version-constant.js +1 -1
  30. package/package.json +1 -1
  31. package/src/deno.js +1 -1
  32. package/src/src/internal-agents/run-stream.ts +61 -94
  33. package/src/src/internal-agents/schema.ts +277 -10
  34. package/src/src/mcp/elicitation.ts +42 -0
  35. package/src/src/mcp/index.ts +9 -0
  36. package/src/src/mcp/server.ts +185 -2
  37. package/src/src/mcp/task-store.ts +137 -0
  38. package/src/src/modules/react-loader/ssr-module-loader/cache/memory.ts +4 -2
  39. package/src/src/server/handlers/request/agent-stream.handler.ts +5 -3
  40. package/src/src/tool/remote-mcp.ts +86 -1
  41. package/src/src/tool/types.ts +2 -0
  42. package/src/src/utils/version-constant.ts +1 -1
@@ -0,0 +1,27 @@
1
+ export interface Task {
2
+ taskId: string;
3
+ status: "working" | "input_required" | "completed" | "failed" | "cancelled";
4
+ statusMessage?: string;
5
+ createdAt: string;
6
+ lastUpdatedAt: string;
7
+ ttl: number;
8
+ pollInterval?: number;
9
+ }
10
+ export declare class TaskStore {
11
+ private tasks;
12
+ private results;
13
+ private lastSweep;
14
+ create(ttl: number): Task;
15
+ get(taskId: string): Task | undefined;
16
+ complete(taskId: string, result: unknown): void;
17
+ fail(taskId: string, message: string): void;
18
+ cancel(taskId: string): boolean;
19
+ getResult(taskId: string): unknown | undefined;
20
+ list(): Task[];
21
+ clear(): void;
22
+ private isExpired;
23
+ private lazySweep;
24
+ private sweep;
25
+ private evictOldest;
26
+ }
27
+ //# sourceMappingURL=task-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-store.d.ts","sourceRoot":"","sources":["../../../src/src/mcp/task-store.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,IAAI;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,GAAG,gBAAgB,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IAC5E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAOD,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,SAAS,CAAK;IAEtB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAmBzB,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAUrC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAQ/C,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAQ3C,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAS/B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAM9C,IAAI,IAAI,IAAI,EAAE;IAKd,KAAK,IAAI,IAAI;IAKb,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,KAAK;IASb,OAAO,CAAC,WAAW;CAyBpB"}
@@ -0,0 +1,116 @@
1
+ import * as dntShim from "../../_dnt.shims.js";
2
+ const TERMINAL_STATUSES = new Set(["completed", "failed", "cancelled"]);
3
+ const DEFAULT_POLL_INTERVAL = 2000;
4
+ const SWEEP_INTERVAL_MS = 30_000;
5
+ const MAX_TASKS = 1000;
6
+ export class TaskStore {
7
+ tasks = new Map();
8
+ results = new Map();
9
+ lastSweep = 0;
10
+ create(ttl) {
11
+ this.lazySweep();
12
+ if (this.tasks.size >= MAX_TASKS) {
13
+ this.evictOldest();
14
+ }
15
+ const now = new Date().toISOString();
16
+ const task = {
17
+ taskId: dntShim.crypto.randomUUID(),
18
+ status: "working",
19
+ createdAt: now,
20
+ lastUpdatedAt: now,
21
+ ttl,
22
+ pollInterval: DEFAULT_POLL_INTERVAL,
23
+ };
24
+ this.tasks.set(task.taskId, task);
25
+ return task;
26
+ }
27
+ get(taskId) {
28
+ const task = this.tasks.get(taskId);
29
+ if (task && this.isExpired(task)) {
30
+ this.tasks.delete(taskId);
31
+ this.results.delete(taskId);
32
+ return undefined;
33
+ }
34
+ return task;
35
+ }
36
+ complete(taskId, result) {
37
+ const task = this.tasks.get(taskId);
38
+ if (!task || TERMINAL_STATUSES.has(task.status))
39
+ return;
40
+ task.status = "completed";
41
+ task.lastUpdatedAt = new Date().toISOString();
42
+ this.results.set(taskId, result);
43
+ }
44
+ fail(taskId, message) {
45
+ const task = this.tasks.get(taskId);
46
+ if (!task || TERMINAL_STATUSES.has(task.status))
47
+ return;
48
+ task.status = "failed";
49
+ task.statusMessage = message;
50
+ task.lastUpdatedAt = new Date().toISOString();
51
+ }
52
+ cancel(taskId) {
53
+ const task = this.tasks.get(taskId);
54
+ if (!task || TERMINAL_STATUSES.has(task.status))
55
+ return false;
56
+ task.status = "cancelled";
57
+ task.statusMessage = "The task was cancelled by request.";
58
+ task.lastUpdatedAt = new Date().toISOString();
59
+ return true;
60
+ }
61
+ getResult(taskId) {
62
+ const task = this.get(taskId);
63
+ if (!task || !TERMINAL_STATUSES.has(task.status))
64
+ return undefined;
65
+ return this.results.get(taskId);
66
+ }
67
+ list() {
68
+ this.lazySweep();
69
+ return Array.from(this.tasks.values());
70
+ }
71
+ clear() {
72
+ this.tasks.clear();
73
+ this.results.clear();
74
+ }
75
+ isExpired(task) {
76
+ return Date.now() - new Date(task.createdAt).getTime() > task.ttl;
77
+ }
78
+ lazySweep() {
79
+ const now = Date.now();
80
+ if (now - this.lastSweep < SWEEP_INTERVAL_MS)
81
+ return;
82
+ this.lastSweep = now;
83
+ this.sweep();
84
+ }
85
+ sweep() {
86
+ for (const [id, task] of this.tasks) {
87
+ if (this.isExpired(task)) {
88
+ this.tasks.delete(id);
89
+ this.results.delete(id);
90
+ }
91
+ }
92
+ }
93
+ evictOldest() {
94
+ // Evict the oldest terminal task, or the oldest task overall
95
+ let oldestTerminal;
96
+ let oldestAny;
97
+ let oldestTerminalTime = Infinity;
98
+ let oldestAnyTime = Infinity;
99
+ for (const [id, task] of this.tasks) {
100
+ const created = new Date(task.createdAt).getTime();
101
+ if (created < oldestAnyTime) {
102
+ oldestAnyTime = created;
103
+ oldestAny = id;
104
+ }
105
+ if (TERMINAL_STATUSES.has(task.status) && created < oldestTerminalTime) {
106
+ oldestTerminalTime = created;
107
+ oldestTerminal = id;
108
+ }
109
+ }
110
+ const toEvict = oldestTerminal ?? oldestAny;
111
+ if (toEvict) {
112
+ this.tasks.delete(toEvict);
113
+ this.results.delete(toEvict);
114
+ }
115
+ }
116
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../../../../src/src/modules/react-loader/ssr-module-loader/cache/memory.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAO5D,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAExD,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAOnE,eAAO,MAAM,iBAAiB,oCAE5B,CAAC;AAEH,eAAO,MAAM,uBAAuB,oCAElC,CAAC;AAEH,eAAO,MAAM,gBAAgB,4BAAmC,CAAC;AAEjE,eAAO,MAAM,aAAa,0BAExB,CAAC;AAEH,eAAO,MAAM,gBAAgB,4BAAmC,CAAC;AAGjE,wBAAgB,qBAAqB,IAAI,SAAS,CAKjD;AAsBD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAW/D;AAKD;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAUlB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAU5D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI;IACnC,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC,CAOA;AAiDD,wBAAgB,mBAAmB,IAAI,IAAI,CAqB1C;AAED,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAiDrE"}
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../../../../src/src/modules/react-loader/ssr-module-loader/cache/memory.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAO5D,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAExD,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAOnE,eAAO,MAAM,iBAAiB,oCAE5B,CAAC;AAEH,eAAO,MAAM,uBAAuB,oCAElC,CAAC;AAEH,eAAO,MAAM,gBAAgB,4BAAmC,CAAC;AAEjE,eAAO,MAAM,aAAa,0BAExB,CAAC;AAEH,eAAO,MAAM,gBAAgB,4BAAmC,CAAC;AAGjE,wBAAgB,qBAAqB,IAAI,SAAS,CAKjD;AAwBD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAW/D;AAKD;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAUlB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAU5D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI;IACnC,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC,CAOA;AAiDD,wBAAgB,mBAAmB,IAAI,IAAI,CAqB1C;AAED,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAiDrE"}
@@ -55,10 +55,12 @@ const projectTransformCounts = new Map();
55
55
  const RATE_LIMIT_BYPASS_PROJECTS = new Set(["__single__"]);
56
56
  /**
57
57
  * Project ID prefixes that bypass per-project rate limiting.
58
- * - "local-": Used for compiled binary CLI, local filesystem projects, and tests
58
+ * - "local-": Used for compiled binary CLI, local filesystem projects
59
59
  * where there's no multi-tenancy and noisy-neighbor protection isn't needed.
60
+ * - "test_": Used by integration tests (TestContext.projectId) where there's
61
+ * no multi-tenancy concern and rate limiting causes flaky failures under CI load.
60
62
  */
61
- const RATE_LIMIT_BYPASS_PREFIXES = ["local-"];
63
+ const RATE_LIMIT_BYPASS_PREFIXES = ["local-", "test_"];
62
64
  /**
63
65
  * Attempt to acquire a project-level transform slot immediately.
64
66
  * Returns true if acquired, false if project is at capacity.
@@ -1 +1 @@
1
- {"version":3,"file":"agent-stream.handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/handlers/request/agent-stream.handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,2BAA2B,CAAC;AAGrD,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,EAEL,KAAK,+BAA+B,EACrC,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,4BAA4B,EAE7B,MAAM,2CAA2C,CAAC;AAkBnD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAmB,aAAa,EAAE,MAAM,aAAa,CAAC;AAKnG,MAAM,WAAW,sBACf,SAAQ,yBAAyB,EAAE,+BAA+B;IAClE,4BAA4B,CAAC,EAAE,OAAO,4BAA4B,CAAC;CACpE;AA4ED,qBAAa,kBAAmB,SAAQ,WAAW;IAOrC,OAAO,CAAC,QAAQ,CAAC,IAAI;IANjC,QAAQ,EAAE,eAAe,CAIvB;gBAE2B,IAAI,GAAE,sBAAoC;IAIvE,OAAO,CAAC,sBAAsB;IAwBxB,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;CA+GhF"}
1
+ {"version":3,"file":"agent-stream.handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/handlers/request/agent-stream.handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,2BAA2B,CAAC;AAGrD,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,EAEL,KAAK,+BAA+B,EACrC,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,4BAA4B,EAE7B,MAAM,2CAA2C,CAAC;AAmBnD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAmB,aAAa,EAAE,MAAM,aAAa,CAAC;AAKnG,MAAM,WAAW,sBACf,SAAQ,yBAAyB,EAAE,+BAA+B;IAClE,4BAA4B,CAAC,EAAE,OAAO,4BAA4B,CAAC;CACpE;AA4ED,qBAAa,kBAAmB,SAAQ,WAAW;IAOrC,OAAO,CAAC,QAAQ,CAAC,IAAI;IANjC,QAAQ,EAAE,eAAe,CAIvB;gBAE2B,IAAI,GAAE,sBAAoC;IAIvE,OAAO,CAAC,sBAAsB;IAwBxB,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;CAgHhF"}
@@ -5,7 +5,7 @@ import { resolveRuntimeOwnerInvokeUrl, RUNTIME_OWNER_INVOKE_URL_HEADER, } from "
5
5
  import { ControlPlaneRequestError, verifyControlPlaneRequest, } from "../../../internal-agents/control-plane-auth.js";
6
6
  import { INTERNAL_AGENT_STREAM_MAX_BODY_BYTES, InternalAgentRequestBodyTooLargeError, readInternalAgentRequestBody, } from "../../../internal-agents/request-body.js";
7
7
  import { AgentRunAlreadyExistsError, agentRunSessionManager, } from "../../../internal-agents/session-manager.js";
8
- import { RuntimeRunAgentInputSchema, } from "../../../internal-agents/schema.js";
8
+ import { InternalAgentStreamRequestSchema, toRuntimeRunAgentInput, } from "../../../internal-agents/schema.js";
9
9
  import { BaseHandler } from "../response/base.js";
10
10
  import { PRIORITY_MEDIUM_API } from "../../../utils/constants/index.js";
11
11
  import { getHostEnv } from "../../../platform/compat/process.js";
@@ -90,7 +90,7 @@ export class AgentStreamHandler extends BaseHandler {
90
90
  .withSecurity(ctx.securityConfig ?? undefined, req);
91
91
  try {
92
92
  const rawBody = await readInternalAgentRequestBody(req, INTERNAL_AGENT_STREAM_MAX_BODY_BYTES);
93
- const payload = RuntimeRunAgentInputSchema.parse(JSON.parse(rawBody));
93
+ const payload = InternalAgentStreamRequestSchema.parse(JSON.parse(rawBody));
94
94
  await verifyControlPlaneRequest(req, ctx, rawBody, {
95
95
  expectedSubject: payload.runId,
96
96
  expectedSurface: "studio",
@@ -117,7 +117,8 @@ export class AgentStreamHandler extends BaseHandler {
117
117
  });
118
118
  return this.respond(builder.json({ error: "Agent not found" }, 404));
119
119
  }
120
- const response = await createRuntimeAgentStreamResponse(payload, agent, this.deps);
120
+ const runtimeInput = toRuntimeRunAgentInput(payload);
121
+ const response = await createRuntimeAgentStreamResponse(runtimeInput, agent, this.deps);
121
122
  logger.info("Internal agent stream response created", {
122
123
  runId: payload.runId,
123
124
  threadId: payload.threadId,
@@ -1 +1 @@
1
- {"version":3,"file":"remote-mcp.d.ts","sourceRoot":"","sources":["../../../src/src/tool/remote-mcp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,qBAAqB,CAAC;AAG/C,OAAO,KAAK,EAAE,gBAAgB,EAAkB,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEzF,KAAK,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,oBAAoB,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAEnF,MAAM,WAAW,yBAAyB;IACxC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IAC3D,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,KAAK,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAuMD,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,yBAAyB,GAChC,gBAAgB,CA6ClB"}
1
+ {"version":3,"file":"remote-mcp.d.ts","sourceRoot":"","sources":["../../../src/src/tool/remote-mcp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,qBAAqB,CAAC;AAG/C,OAAO,KAAK,EAAE,gBAAgB,EAAkB,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEzF,KAAK,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,oBAAoB,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAEnF,MAAM,WAAW,yBAAyB;IACxC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IAC3D,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,KAAK,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA4RD,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,yBAAyB,GAChC,gBAAgB,CA6ClB"}
@@ -87,6 +87,50 @@ function extractJsonRpcErrorMessage(payload) {
87
87
  }
88
88
  return "Remote MCP server returned an error";
89
89
  }
90
+ function parseSseEvents(text) {
91
+ const events = [];
92
+ let currentEvent = { data: [] };
93
+ for (const rawLine of text.split(/\r?\n/)) {
94
+ const line = rawLine.trimEnd();
95
+ if (line.length === 0) {
96
+ if (currentEvent.data.length > 0) {
97
+ events.push(currentEvent);
98
+ }
99
+ currentEvent = { data: [] };
100
+ continue;
101
+ }
102
+ if (line.startsWith(":")) {
103
+ continue;
104
+ }
105
+ if (line.startsWith("data:")) {
106
+ currentEvent.data.push(line.slice(5).trimStart());
107
+ }
108
+ }
109
+ if (currentEvent.data.length > 0) {
110
+ events.push(currentEvent);
111
+ }
112
+ return events;
113
+ }
114
+ function parseJsonRpcSsePayload(text) {
115
+ const parsedPayloads = parseSseEvents(text)
116
+ .map((event) => parseJsonText(event.data.join("\n")))
117
+ .filter((payload) => payload !== undefined);
118
+ const jsonRpcPayload = parsedPayloads.find((payload) => isRecord(payload) && ("result" in payload || "error" in payload));
119
+ if (jsonRpcPayload !== undefined) {
120
+ return jsonRpcPayload;
121
+ }
122
+ if (parsedPayloads.length > 0) {
123
+ return parsedPayloads[0];
124
+ }
125
+ throw new Error("Remote MCP SSE response did not include a JSON-RPC payload");
126
+ }
127
+ async function parseJsonRpcResponse(response) {
128
+ const contentType = response.headers.get("content-type")?.toLowerCase() ?? "";
129
+ if (contentType.includes("text/event-stream")) {
130
+ return parseJsonRpcSsePayload(await response.text());
131
+ }
132
+ return await response.json();
133
+ }
90
134
  async function resolveValue(value, context) {
91
135
  if (isResolver(value)) {
92
136
  return await value(context);
@@ -97,8 +141,23 @@ async function resolveHeaders(headers, context) {
97
141
  const resolvedHeaders = headers ? await resolveValue(headers, context) : undefined;
98
142
  const finalHeaders = new dntShim.Headers(resolvedHeaders);
99
143
  finalHeaders.set("Content-Type", "application/json");
144
+ finalHeaders.set("Accept", mergeAcceptHeader(finalHeaders.get("Accept")));
100
145
  return finalHeaders;
101
146
  }
147
+ function mergeAcceptHeader(existingAccept) {
148
+ const requiredTypes = ["application/json", "text/event-stream"];
149
+ const existingTypes = (existingAccept ?? "")
150
+ .split(",")
151
+ .map((entry) => entry.trim())
152
+ .filter((entry) => entry.length > 0);
153
+ const existingKeys = new Set(existingTypes.map((entry) => entry.split(";")[0]?.trim().toLowerCase()).filter(Boolean));
154
+ for (const requiredType of requiredTypes) {
155
+ if (!existingKeys.has(requiredType)) {
156
+ existingTypes.push(requiredType);
157
+ }
158
+ }
159
+ return existingTypes.join(", ");
160
+ }
102
161
  async function postJsonRpc(endpoint, headers, body, fetchImpl) {
103
162
  const response = await fetchImpl(endpoint, {
104
163
  method: "POST",
@@ -109,7 +168,7 @@ async function postJsonRpc(endpoint, headers, body, fetchImpl) {
109
168
  const detail = await response.text();
110
169
  throw new Error(`Remote MCP request failed (${response.status})${detail ? `: ${detail}` : ""}`);
111
170
  }
112
- return await response.json();
171
+ return await parseJsonRpcResponse(response);
113
172
  }
114
173
  function getJsonRpcResult(payload) {
115
174
  if (!isRecord(payload)) {
@@ -48,6 +48,8 @@ export interface ToolExecutionContext {
48
48
  projectId?: string;
49
49
  /** End-user identity for per-user token resolution in integration tools */
50
50
  endUserId?: string;
51
+ /** Progress token for sending progress notifications (MCP 2025-11-25) */
52
+ progressToken?: string | number;
51
53
  /** Additional context */
52
54
  [key: string]: unknown;
53
55
  /** Blob storage access (if configured in workflow) */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/src/tool/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/src/tool/types.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.1.146";
1
+ export declare const VERSION = "0.1.147";
2
2
  //# sourceMappingURL=version-constant.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // Keep in sync with deno.json version.
2
2
  // scripts/release.ts updates this constant during releases.
3
- export const VERSION = "0.1.146";
3
+ export const VERSION = "0.1.147";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "veryfront",
3
- "version": "0.1.146",
3
+ "version": "0.1.147",
4
4
  "description": "The simplest way to build AI-powered apps",
5
5
  "keywords": [
6
6
  "react",
package/src/deno.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.146",
3
+ "version": "0.1.147",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "exclude": [
@@ -120,95 +120,60 @@ function isRecord(value: unknown): value is Record<string, unknown> {
120
120
  return typeof value === "object" && value !== null && !Array.isArray(value);
121
121
  }
122
122
 
123
- function normalizeToolArgs(part: Record<string, unknown>): Record<string, unknown> {
124
- if (isRecord(part.args)) {
125
- return part.args;
126
- }
127
-
128
- if (isRecord(part.input)) {
129
- return part.input;
123
+ function parseToolArguments(serializedArguments: string): Record<string, unknown> {
124
+ try {
125
+ const parsed = JSON.parse(serializedArguments);
126
+ return isRecord(parsed) ? parsed : {};
127
+ } catch {
128
+ return {};
130
129
  }
131
-
132
- return {};
133
130
  }
134
131
 
135
- function normalizeMessagePart(part: Record<string, unknown>): Message["parts"][number] | null {
136
- if (part.type === "text" && typeof part.text === "string") {
137
- return { type: "text", text: part.text };
138
- }
139
-
140
- if (
141
- part.type === "tool_call" &&
142
- typeof part.id === "string" &&
143
- typeof part.name === "string"
144
- ) {
145
- return {
146
- type: "tool-call",
147
- toolCallId: part.id,
148
- toolName: part.name,
149
- args: normalizeToolArgs(part),
150
- };
151
- }
152
-
153
- if (
154
- part.type === "tool-call" &&
155
- typeof part.toolCallId === "string" &&
156
- typeof part.toolName === "string"
157
- ) {
158
- return {
159
- type: "tool-call",
160
- toolCallId: part.toolCallId,
161
- toolName: part.toolName,
162
- args: normalizeToolArgs(part),
163
- };
164
- }
165
-
166
- if (
167
- typeof part.type === "string" &&
168
- part.type.startsWith("tool-") &&
169
- part.type !== "tool-result" &&
170
- typeof part.toolCallId === "string" &&
171
- typeof part.toolName === "string"
172
- ) {
173
- return {
174
- type: part.type,
175
- toolCallId: part.toolCallId,
176
- toolName: part.toolName,
177
- args: normalizeToolArgs(part),
178
- };
179
- }
180
-
181
- if (part.type === "tool_result" && typeof part.tool_call_id === "string") {
182
- return {
183
- type: "tool-result",
184
- toolCallId: part.tool_call_id,
185
- toolName: typeof part.tool_name === "string" ? part.tool_name : "unknown",
186
- result: "output" in part ? part.output : undefined,
187
- };
188
- }
132
+ function normalizeRuntimeMessages(messages: RuntimeRunAgentInput["messages"]): Message[] {
133
+ return messages.map((message) => {
134
+ const parts: Message["parts"] = [];
135
+
136
+ switch (message.role) {
137
+ case "system":
138
+ case "user":
139
+ parts.push({ type: "text", text: message.content });
140
+ break;
141
+ case "assistant":
142
+ if (typeof message.content === "string" && message.content.length > 0) {
143
+ parts.push({ type: "text", text: message.content });
144
+ }
145
+ for (const toolCall of message.toolCalls ?? []) {
146
+ parts.push({
147
+ type: "tool-call",
148
+ toolCallId: toolCall.id,
149
+ toolName: toolCall.function.name,
150
+ args: parseToolArguments(toolCall.function.arguments),
151
+ });
152
+ }
153
+ break;
154
+ case "tool":
155
+ parts.push({
156
+ type: "tool-result",
157
+ toolCallId: message.toolCallId,
158
+ toolName: "unknown",
159
+ result: message.error
160
+ ? {
161
+ content: message.content,
162
+ error: message.error,
163
+ }
164
+ : message.content,
165
+ });
166
+ break;
167
+ }
189
168
 
190
- if (part.type === "tool-result" && typeof part.toolCallId === "string") {
191
169
  return {
192
- type: "tool-result",
193
- toolCallId: part.toolCallId,
194
- toolName: typeof part.toolName === "string" ? part.toolName : "unknown",
195
- result: "result" in part ? part.result : undefined,
170
+ id: message.id,
171
+ role: message.role,
172
+ parts,
173
+ ...(message.createdAt ? { timestamp: Date.parse(message.createdAt) || undefined } : {}),
174
+ ...(message.metadata ? { metadata: message.metadata } : {}),
196
175
  };
197
- }
198
-
199
- return null;
200
- }
201
-
202
- function normalizeRuntimeMessages(messages: RuntimeRunAgentInput["messages"]): Message[] {
203
- return messages.map((message) => ({
204
- id: message.id,
205
- role: message.role,
206
- parts: message.parts
207
- .map((part) => isRecord(part) ? normalizeMessagePart(part) : null)
208
- .filter((part): part is Message["parts"][number] => part !== null),
209
- ...(message.createdAt ? { timestamp: Date.parse(message.createdAt) || undefined } : {}),
210
- ...(message.metadata ? { metadata: message.metadata } : {}),
211
- }));
176
+ });
212
177
  }
213
178
 
214
179
  function getAllowedRemoteToolNames(
@@ -235,7 +200,7 @@ export async function createRuntimeAgentStreamResponse(
235
200
  logger.info("Starting internal agent runtime stream", {
236
201
  runId: input.runId,
237
202
  threadId: input.threadId,
238
- agentId: input.agentId,
203
+ agentId: agent.id,
239
204
  messageCount: input.messages.length,
240
205
  toolCount: input.tools.length,
241
206
  contextCount: input.context.length,
@@ -270,6 +235,8 @@ export async function createRuntimeAgentStreamResponse(
270
235
  {
271
236
  threadId: input.threadId,
272
237
  runId: input.runId,
238
+ ...(input.parentRunId ? { parentRunId: input.parentRunId } : {}),
239
+ ...(input.state !== undefined ? { state: input.state } : {}),
273
240
  context: input.context,
274
241
  forwardedProps: input.forwardedProps,
275
242
  },
@@ -285,14 +252,14 @@ export async function createRuntimeAgentStreamResponse(
285
252
  logger.info("Internal agent runtime stream attached", {
286
253
  runId: input.runId,
287
254
  threadId: input.threadId,
288
- agentId: input.agentId,
255
+ agentId: agent.id,
289
256
  });
290
257
  } catch (error) {
291
258
  deps.sessionManager.failRun(input.runId);
292
259
  logger.error("Internal agent runtime stream setup failed", {
293
260
  runId: input.runId,
294
261
  threadId: input.threadId,
295
- agentId: input.agentId,
262
+ agentId: agent.id,
296
263
  error: error instanceof Error ? error.message : String(error),
297
264
  });
298
265
  throw error;
@@ -330,7 +297,7 @@ export async function createRuntimeAgentStreamResponse(
330
297
  logger.warn("Internal agent runtime stream aborted", {
331
298
  runId: input.runId,
332
299
  threadId: input.threadId,
333
- agentId: input.agentId,
300
+ agentId: agent.id,
334
301
  });
335
302
  reader.cancel(new AgentRunCancelledError()).catch(() => {});
336
303
  };
@@ -339,7 +306,7 @@ export async function createRuntimeAgentStreamResponse(
339
306
  enqueueIfAttached("RunStarted", {
340
307
  runId: input.runId,
341
308
  threadId: input.threadId,
342
- agentId: input.agentId,
309
+ agentId: agent.id,
343
310
  });
344
311
 
345
312
  try {
@@ -353,7 +320,7 @@ export async function createRuntimeAgentStreamResponse(
353
320
  logger.info("Internal agent runtime stream reader completed", {
354
321
  runId: input.runId,
355
322
  threadId: input.threadId,
356
- agentId: input.agentId,
323
+ agentId: agent.id,
357
324
  });
358
325
  break;
359
326
  }
@@ -387,7 +354,7 @@ export async function createRuntimeAgentStreamResponse(
387
354
  logger.info("Internal agent runtime stream finalized", {
388
355
  runId: input.runId,
389
356
  threadId: input.threadId,
390
- agentId: input.agentId,
357
+ agentId: agent.id,
391
358
  sawVisibleOutput: state.sawVisibleOutput,
392
359
  sawTerminalError: state.sawTerminalError,
393
360
  finishReason: state.metadata.finishReason,
@@ -398,7 +365,7 @@ export async function createRuntimeAgentStreamResponse(
398
365
  logger.warn("Internal agent runtime stream cancelled", {
399
366
  runId: input.runId,
400
367
  threadId: input.threadId,
401
- agentId: input.agentId,
368
+ agentId: agent.id,
402
369
  error: error.message,
403
370
  });
404
371
  enqueueIfAttached("RunError", {
@@ -410,7 +377,7 @@ export async function createRuntimeAgentStreamResponse(
410
377
  logger.error("Internal agent runtime stream failed", {
411
378
  runId: input.runId,
412
379
  threadId: input.threadId,
413
- agentId: input.agentId,
380
+ agentId: agent.id,
414
381
  error: error instanceof Error ? error.message : String(error),
415
382
  });
416
383
  enqueueIfAttached("RunError", {
@@ -426,7 +393,7 @@ export async function createRuntimeAgentStreamResponse(
426
393
  logger.debug("Internal agent runtime stream response closed", {
427
394
  runId: input.runId,
428
395
  threadId: input.threadId,
429
- agentId: input.agentId,
396
+ agentId: agent.id,
430
397
  clientAttached,
431
398
  });
432
399
  }
@@ -436,7 +403,7 @@ export async function createRuntimeAgentStreamResponse(
436
403
  logger.info("Internal agent runtime client detached", {
437
404
  runId: input.runId,
438
405
  threadId: input.threadId,
439
- agentId: input.agentId,
406
+ agentId: agent.id,
440
407
  });
441
408
  return Promise.resolve();
442
409
  },