eve 0.49.0 → 0.50.0

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 (92) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/src/chunks/{use-eve-agent-BZnOzAVd.js → use-eve-agent-B5I-k6Ek.js} +173 -41
  3. package/dist/src/chunks/{use-eve-agent-Bgp6INfi.js → use-eve-agent-DUMU6dap.js} +173 -41
  4. package/dist/src/cli/commands/integration-setup.d.ts +1 -0
  5. package/dist/src/cli/commands/integration-setup.js +1 -1
  6. package/dist/src/cli/commands/register-integration-commands.d.ts +1 -1
  7. package/dist/src/cli/commands/register-integration-commands.js +1 -1
  8. package/dist/src/cli/commands/registry-declared-setups.d.ts +1 -0
  9. package/dist/src/cli/commands/registry-declared-setups.js +1 -1
  10. package/dist/src/cli/commands/registry.js +1 -1
  11. package/dist/src/cli/dev/tui/runner.js +1 -1
  12. package/dist/src/cli/dev/tui/subagent-pump.js +1 -1
  13. package/dist/src/cli/dev/tui/terminal-renderer.js +1 -1
  14. package/dist/src/client/message-reducer-primitives.d.ts +0 -1
  15. package/dist/src/client/message-reducer-primitives.js +1 -1
  16. package/dist/src/client/message-reducer.js +1 -1
  17. package/dist/src/client/message-run-parts.d.ts +18 -0
  18. package/dist/src/client/message-run-parts.js +1 -0
  19. package/dist/src/client/ndjson.d.ts +4 -2
  20. package/dist/src/client/ndjson.js +3 -3
  21. package/dist/src/client/open-stream.d.ts +2 -0
  22. package/dist/src/client/open-stream.js +1 -1
  23. package/dist/src/client/stream-version.d.ts +3 -0
  24. package/dist/src/client/stream-version.js +1 -0
  25. package/dist/src/compiled/.vendor-stamp.json +7 -2
  26. package/dist/src/compiled/@eve/catalog/index.d.ts +87 -0
  27. package/dist/src/compiled/@eve/catalog/index.js +1 -0
  28. package/dist/src/compiler/extension-compatibility.d.ts +34 -21
  29. package/dist/src/compiler/extension-compatibility.js +1 -1
  30. package/dist/src/execution/ndjson-stream.d.ts +1 -1
  31. package/dist/src/execution/ndjson-stream.js +3 -3
  32. package/dist/src/execution/sandbox/bindings/docker-options.d.ts +1 -1
  33. package/dist/src/execution/sandbox/bindings/docker-options.js +1 -1
  34. package/dist/src/execution/sandbox/bindings/eve-image.d.ts +4 -0
  35. package/dist/src/execution/sandbox/bindings/eve-image.js +1 -0
  36. package/dist/src/execution/sandbox/bindings/microsandbox-options.d.ts +1 -1
  37. package/dist/src/execution/sandbox/bindings/microsandbox-options.js +1 -1
  38. package/dist/src/execution/sandbox/bindings/vercel-create-sdk.js +1 -1
  39. package/dist/src/execution/workflow-runtime.js +1 -1
  40. package/dist/src/harness/current-messages.d.ts +2 -0
  41. package/dist/src/harness/current-messages.js +1 -1
  42. package/dist/src/harness/emission.js +1 -1
  43. package/dist/src/harness/hitl/approval-input-requests.d.ts +2 -2
  44. package/dist/src/harness/hitl/approval-input-requests.js +1 -1
  45. package/dist/src/harness/input-requests.js +1 -1
  46. package/dist/src/harness/ordered-stream-emitter.js +1 -1
  47. package/dist/src/harness/tool-loop.js +2 -2
  48. package/dist/src/internal/application/package.js +1 -1
  49. package/dist/src/protocol/message-version.d.ts +52 -0
  50. package/dist/src/protocol/message-version.js +1 -0
  51. package/dist/src/protocol/message.d.ts +1 -8
  52. package/dist/src/protocol/message.js +2 -2
  53. package/dist/src/public/channels/chat-sdk/chatSdkChannel.d.ts +0 -1
  54. package/dist/src/public/channels/chat-sdk/chatSdkChannel.js +1 -1
  55. package/dist/src/public/channels/slack/activity.d.ts +18 -0
  56. package/dist/src/public/channels/slack/activity.js +1 -0
  57. package/dist/src/public/channels/slack/api.js +1 -1
  58. package/dist/src/public/channels/slack/defaults.js +2 -2
  59. package/dist/src/public/channels/slack/index.d.ts +1 -0
  60. package/dist/src/public/channels/slack/index.js +1 -1
  61. package/dist/src/public/channels/slack/interaction-cards.js +1 -1
  62. package/dist/src/public/channels/slack/interactions.js +1 -1
  63. package/dist/src/public/channels/slack/slackChannel.d.ts +5 -0
  64. package/dist/src/public/channels/slack/slackChannel.js +1 -1
  65. package/dist/src/public/memory/file/backends/default.js +1 -1
  66. package/dist/src/public/sandbox/docker-sandbox.d.ts +5 -4
  67. package/dist/src/public/sandbox/microsandbox-sandbox.d.ts +1 -1
  68. package/dist/src/public/sandbox/vercel-sandbox.d.ts +3 -1
  69. package/dist/src/setup/integrations/file-memory/setup.d.ts +15 -0
  70. package/dist/src/setup/integrations/file-memory/setup.js +2 -0
  71. package/dist/src/setup/integrations/file-memory/vercel.d.ts +103 -0
  72. package/dist/src/setup/integrations/file-memory/vercel.js +1 -0
  73. package/dist/src/setup/integrations/registry.js +1 -1
  74. package/dist/src/setup/integrations/shared/vercel-project.js +1 -1
  75. package/dist/src/setup/scaffold/channels-catalog.js +1 -1
  76. package/dist/src/setup/scaffold/connections/catalog.d.ts +1 -1
  77. package/dist/src/setup/scaffold/connections/catalog.js +1 -1
  78. package/dist/src/setup/scaffold/create/project.js +1 -1
  79. package/dist/src/svelte/index.js +1 -1
  80. package/dist/src/svelte/use-eve-agent.js +1 -1
  81. package/dist/src/vue/index.js +1 -1
  82. package/dist/src/vue/use-eve-agent.js +1 -1
  83. package/docs/channels/slack.mdx +1 -1
  84. package/docs/concepts/sessions-runs-and-streaming.md +12 -6
  85. package/docs/guides/client/streaming.mdx +18 -2
  86. package/docs/install-integrations.mdx +3 -0
  87. package/docs/memory/file.md +49 -10
  88. package/docs/reference/cli.md +28 -23
  89. package/docs/sandbox.mdx +5 -3
  90. package/docs/tools/human-in-the-loop.md +2 -0
  91. package/package.json +1 -1
  92. package/dist/src/packages/eve-catalog/src/index.js +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,33 @@
1
1
  # eve
2
2
 
3
+ ## 0.50.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 70c8a2e: Store message and reasoning appends as plain deltas instead of repeating cumulative text. Streamed tool-input appends now use the same delta-only shape.
8
+
9
+ Empty tool-input start markers no longer emit an append event; the first append contains actual input text.
10
+
11
+ Extensions built against the previous dynamic-tool, channel, schedule, subagent, connection, hook, dynamic-skill, or dynamic-instructions capability contracts must be rebuilt and republished with this release.
12
+
13
+ ### Patch Changes
14
+
15
+ - 5b90f3d: Fix approved tool calls silently not executing when task state or a dynamic skill announcement was injected on the resume step. The runtime context was appended after the approval response, so the AI SDK skipped the approved tool and providers rejected the prompt with errors like `No tool output found for function call`.
16
+ - 884cba8: Prevent approving one tool call from auto-authorizing other already-pending calls with the same approval key. Existing approval prompts now remain independent, while `once()` still auto-allows calls proposed after the pending requests are resolved.
17
+ - 2b52714: Reduce the published sandbox image by avoiding a duplicate ownership-only layer while preserving global npm and pnpm installs for sandbox users.
18
+ - ffcd817: Bundle eve's private integration catalog into the published package so setup runtime code and TypeScript declarations no longer reference an unavailable workspace dependency.
19
+
20
+ ## 0.49.1
21
+
22
+ ### Patch Changes
23
+
24
+ - 23a4b59: Use version-matched GHCR images for Docker and microsandbox while Vercel Sandbox uses VCR. Publish each eve sandbox image version to both registries.
25
+ - d8c58bd: Add `memory/file` and `eve integration setup file-memory` to provision a dedicated private Vercel Blob store automatically. Deployed file memory now prefers `EVE_MEMORY_BLOB_*` credentials while retaining generic `BLOB_*` bindings as a fallback.
26
+ - 6a5fd36: Make `eve add --overwrite` also replace files generated by eve-owned integration setup flows, including Photon channels.
27
+ - 86539ee: Add an internal experimental Slack status renderer for explicit agent activity reports and delegated work lifecycle. Activity updates do not start or steer model turns.
28
+ - 4f29a21: Allow `EVE_SANDBOX_IMAGE_TAG` to override the version-derived tag used for eve's default sandbox images.
29
+ - 2ea5d60: Allow the default `fileMemory()` backend to use an attached Vercel Blob store when its OIDC token is available from the request context instead of the environment.
30
+
3
31
  ## 0.49.0
4
32
 
5
33
  ### Minor Changes
@@ -680,6 +680,7 @@ function incrementRandom(bytes) {
680
680
  //#region src/protocol/message.ts
681
681
  const EVE_SESSION_ID_HEADER = "x-eve-session-id";
682
682
  const EVE_STREAM_TAIL_INDEX_HEADER = "x-eve-stream-tail-index";
683
+ const EVE_STREAM_VERSION_HEADER = "x-eve-stream-version";
683
684
  const textEncoder = new TextEncoder();
684
685
  function isCurrentTurnBoundaryEvent(event) {
685
686
  return event.type === "session.completed" || event.type === "session.failed" || event.type === "session.waiting";
@@ -787,6 +788,101 @@ var MessageResponse = class {
787
788
  }
788
789
  };
789
790
 
791
+ //#endregion
792
+ //#region src/protocol/message-version.ts
793
+ function normalizeMessageStreamEvent(version, event) {
794
+ switch (version) {
795
+ case "21":
796
+ case "22":
797
+ case "23":
798
+ case "24": return normalizeLegacyMessageStreamEvent(version, event);
799
+ case "25": return validateCurrentMessageStreamEvent(event);
800
+ default: return assertNever(version);
801
+ }
802
+ }
803
+ function normalizeLegacyMessageStreamEvent(version, event) {
804
+ if (event.type === "message.appended") {
805
+ assertLegacyAppendSnapshot(event.data.messageSoFar, event.data.messageDelta, "message", version);
806
+ return {
807
+ data: {
808
+ messageDelta: event.data.messageDelta,
809
+ sequence: event.data.sequence,
810
+ stepIndex: event.data.stepIndex,
811
+ turnId: event.data.turnId
812
+ },
813
+ meta: event.meta,
814
+ type: "message.appended"
815
+ };
816
+ }
817
+ if (event.type === "reasoning.appended") {
818
+ assertLegacyAppendSnapshot(event.data.reasoningSoFar, event.data.reasoningDelta, "reasoning", version);
819
+ return {
820
+ data: {
821
+ reasoningDelta: event.data.reasoningDelta,
822
+ sequence: event.data.sequence,
823
+ stepIndex: event.data.stepIndex,
824
+ turnId: event.data.turnId
825
+ },
826
+ meta: event.meta,
827
+ type: "reasoning.appended"
828
+ };
829
+ }
830
+ if (event.type === "action.input.appended") {
831
+ if (version !== void 0 && version !== "24") throw new TypeError(`Invalid action input append for stream version ${version}.`);
832
+ assertLegacyActionInputOffset(event.data.inputTextOffset, version);
833
+ return {
834
+ data: {
835
+ callId: event.data.callId,
836
+ inputTextDelta: event.data.inputTextDelta,
837
+ sequence: event.data.sequence,
838
+ stepIndex: event.data.stepIndex,
839
+ toolName: event.data.toolName,
840
+ turnId: event.data.turnId
841
+ },
842
+ meta: event.meta,
843
+ type: "action.input.appended"
844
+ };
845
+ }
846
+ return event;
847
+ }
848
+ function validateCurrentMessageStreamEvent(event) {
849
+ if (event.type === "message.appended") {
850
+ assertCurrentAppendDelta(event.data.messageDelta, "message");
851
+ assertUnsupportedAppendField(event.data, "messageOffset", "message");
852
+ assertUnsupportedAppendField(event.data, "messageSoFar", "message");
853
+ } else if (event.type === "reasoning.appended") {
854
+ assertCurrentAppendDelta(event.data.reasoningDelta, "reasoning");
855
+ assertUnsupportedAppendField(event.data, "reasoningOffset", "reasoning");
856
+ assertUnsupportedAppendField(event.data, "reasoningSoFar", "reasoning");
857
+ } else if (event.type === "action.input.appended") {
858
+ assertCurrentAppendDelta(event.data.inputTextDelta, "action input");
859
+ assertUnsupportedAppendField(event.data, "inputTextOffset", "action input");
860
+ }
861
+ return event;
862
+ }
863
+ function assertCurrentAppendDelta(delta, stream) {
864
+ if (typeof delta !== "string") throw new TypeError(`Invalid ${stream} append delta for stream version 25.`);
865
+ }
866
+ function assertUnsupportedAppendField(data, field, stream) {
867
+ if (field in data) throw new TypeError(`Invalid ${stream} append shape for stream version 25.`);
868
+ }
869
+ function assertNever(value) {
870
+ throw new TypeError(`Unsupported message stream version: ${String(value)}.`);
871
+ }
872
+ function assertLegacyActionInputOffset(offset, version) {
873
+ if (!Number.isSafeInteger(offset) || offset < 0) {
874
+ const source = version === void 0 ? "persisted stream" : `stream version ${version}`;
875
+ throw new TypeError(`Invalid action input append offset for ${source}.`);
876
+ }
877
+ }
878
+ function assertLegacyAppendSnapshot(snapshot, delta, stream, version) {
879
+ const offset = snapshot.length - delta.length;
880
+ if (offset < 0 || snapshot.slice(offset) !== delta) {
881
+ const source = version === void 0 ? "persisted stream" : `stream version ${version}`;
882
+ throw new TypeError(`Invalid cumulative ${stream} append for ${source}.`);
883
+ }
884
+ }
885
+
790
886
  //#endregion
791
887
  //#region src/client/ndjson.ts
792
888
  function isStreamDisconnectError(error) {
@@ -813,17 +909,20 @@ async function* readNdjsonStream(body, options) {
813
909
  while (newlineIndex !== -1) {
814
910
  const line = buffer.slice(0, newlineIndex).trim();
815
911
  buffer = buffer.slice(newlineIndex + 1);
816
- if (line.length > 0) yield JSON.parse(line);
912
+ if (line.length > 0) yield parseMessageStreamEvent(line, options.streamVersion);
817
913
  newlineIndex = buffer.indexOf("\n");
818
914
  }
819
915
  }
820
916
  const trailing = buffer.trim();
821
- if (trailing.length > 0) yield JSON.parse(trailing);
917
+ if (trailing.length > 0) yield parseMessageStreamEvent(trailing, options.streamVersion);
822
918
  } finally {
823
919
  if (!reachedEof) await reader.cancel().catch(() => {});
824
920
  reader.releaseLock();
825
921
  }
826
922
  }
923
+ function parseMessageStreamEvent(line, version) {
924
+ return normalizeMessageStreamEvent(version, JSON.parse(line));
925
+ }
827
926
  async function readWithIdleTimeout(reader, idleTimeoutMs) {
828
927
  if (idleTimeoutMs === void 0) return await reader.read();
829
928
  let timeout;
@@ -836,6 +935,22 @@ async function readWithIdleTimeout(reader, idleTimeoutMs) {
836
935
  }
837
936
  }
838
937
 
938
+ //#endregion
939
+ //#region src/client/stream-version.ts
940
+ const supportedMessageStreamVersions = {
941
+ "21": true,
942
+ "22": true,
943
+ "23": true,
944
+ "24": true,
945
+ "25": true
946
+ };
947
+ function readMessageStreamVersion(headers) {
948
+ const version = headers.get(EVE_STREAM_VERSION_HEADER);
949
+ if (version !== null && Object.hasOwn(supportedMessageStreamVersions, version)) return version;
950
+ if (version === null) throw new TypeError(`Missing ${EVE_STREAM_VERSION_HEADER} response header.`);
951
+ throw new TypeError(`Unsupported message stream version: ${version}.`);
952
+ }
953
+
839
954
  //#endregion
840
955
  //#region src/client/url.ts
841
956
  function createClientUrl(host, routePath, searchParams) {
@@ -962,7 +1077,10 @@ async function* followStreamIterable(input) {
962
1077
  }
963
1078
  let deliveredEvent = false;
964
1079
  try {
965
- for await (const event of readNdjsonStream(connection.body, { idleTimeoutMs: input.streamReadIdleTimeoutMs ?? DEFAULT_STREAM_READ_IDLE_TIMEOUT_MS })) {
1080
+ for await (const event of readNdjsonStream(connection.body, {
1081
+ idleTimeoutMs: input.streamReadIdleTimeoutMs ?? DEFAULT_STREAM_READ_IDLE_TIMEOUT_MS,
1082
+ streamVersion: connection.streamVersion
1083
+ })) {
966
1084
  startIndex += 1;
967
1085
  deliveredEvent = true;
968
1086
  reconnectDelayMs = idleRetryPolicy.baseDelayMs;
@@ -1017,6 +1135,7 @@ async function openStreamBody(input) {
1017
1135
  return {
1018
1136
  body: response.body,
1019
1137
  close: () => connectionController.abort(),
1138
+ streamVersion: readMessageStreamVersion(response.headers),
1020
1139
  tailIndex: parseTailIndexHeader(response.headers)
1021
1140
  };
1022
1141
  }
@@ -2285,11 +2404,51 @@ function removeStreamingToolPartsForTurn(data, turnId) {
2285
2404
  function optimisticUserMessageId(submissionId) {
2286
2405
  return `optimistic:${submissionId}:user`;
2287
2406
  }
2288
- function appendToolInputDelta(inputText, offset, delta) {
2289
- if (offset === 0) return delta;
2290
- if (inputText?.length !== offset) return void 0;
2291
- return inputText + delta;
2407
+
2408
+ //#endregion
2409
+ //#region src/client/message-run-parts.ts
2410
+ function append(message, append) {
2411
+ const current = latestStreamingRun(message, append.type, append.stepIndex);
2412
+ return upsert(message, {
2413
+ state: "streaming",
2414
+ stepIndex: append.stepIndex,
2415
+ text: (current?.text ?? "") + append.delta,
2416
+ type: append.type
2417
+ });
2418
+ }
2419
+ function latestStreamingRun(message, type, stepIndex) {
2420
+ for (let index = message.parts.length - 1; index >= 0; index -= 1) {
2421
+ const part = message.parts[index];
2422
+ if (part?.type === type && part.stepIndex === stepIndex) return part.state === "streaming" ? part : void 0;
2423
+ }
2424
+ }
2425
+ function upsert(message, next) {
2426
+ let lastIndex = -1;
2427
+ for (let index = message.parts.length - 1; index >= 0; index -= 1) {
2428
+ const part = message.parts[index];
2429
+ if (part?.type === next.type && part.stepIndex === next.stepIndex) {
2430
+ lastIndex = index;
2431
+ break;
2432
+ }
2433
+ }
2434
+ const parts = lastIndex !== -1 && message.parts[lastIndex].state === "streaming" ? [
2435
+ ...message.parts.slice(0, lastIndex),
2436
+ next,
2437
+ ...message.parts.slice(lastIndex + 1)
2438
+ ] : [...message.parts, next];
2439
+ return {
2440
+ ...message,
2441
+ metadata: {
2442
+ ...message.metadata,
2443
+ status: next.type === "text" && next.state === "done" ? "complete" : "streaming"
2444
+ },
2445
+ parts
2446
+ };
2292
2447
  }
2448
+ const messageRun = {
2449
+ append,
2450
+ upsert
2451
+ };
2293
2452
 
2294
2453
  //#endregion
2295
2454
  //#region src/client/message-reducer.ts
@@ -2349,13 +2508,12 @@ function reduceMessageData(data, event) {
2349
2508
  role: "user"
2350
2509
  });
2351
2510
  case "step.started": return updateAssistantMessage(data, event.data.turnId, (message) => ensureStepStartPart(message, event.data.stepIndex));
2352
- case "reasoning.appended": return updateAssistantMessage(data, event.data.turnId, (message) => upsertRun(ensureStepStartPart(message, event.data.stepIndex), {
2353
- state: "streaming",
2511
+ case "reasoning.appended": return updateAssistantMessage(data, event.data.turnId, (message) => messageRun.append(ensureStepStartPart(message, event.data.stepIndex), {
2512
+ delta: event.data.reasoningDelta,
2354
2513
  stepIndex: event.data.stepIndex,
2355
- text: event.data.reasoningSoFar,
2356
2514
  type: "reasoning"
2357
2515
  }));
2358
- case "reasoning.completed": return updateAssistantMessage(data, event.data.turnId, (message) => upsertRun(ensureStepStartPart(message, event.data.stepIndex), {
2516
+ case "reasoning.completed": return updateAssistantMessage(data, event.data.turnId, (message) => messageRun.upsert(ensureStepStartPart(message, event.data.stepIndex), {
2359
2517
  state: "done",
2360
2518
  stepIndex: event.data.stepIndex,
2361
2519
  text: event.data.reasoning,
@@ -2364,11 +2522,9 @@ function reduceMessageData(data, event) {
2364
2522
  case "action.input.appended": {
2365
2523
  const existing = findToolPart(data, event.data.callId);
2366
2524
  if (existing !== void 0 && existing.state !== "input-streaming") return data;
2367
- const inputText = appendToolInputDelta(existing?.state === "input-streaming" ? existing.inputText : void 0, event.data.inputTextOffset, event.data.inputTextDelta);
2368
- if (inputText === void 0) return data;
2369
2525
  const nextPart = {
2370
2526
  input: void 0,
2371
- inputText,
2527
+ inputText: (existing?.state === "input-streaming" ? existing.inputText : "") + event.data.inputTextDelta,
2372
2528
  state: "input-streaming",
2373
2529
  stepIndex: event.data.stepIndex,
2374
2530
  toolCallId: event.data.callId,
@@ -2509,15 +2665,14 @@ function reduceMessageData(data, event) {
2509
2665
  }
2510
2666
  case "authorization.required": return updateAssistantMessage(data, event.data.turnId, (message) => upsertPart(ensureStepStartPart(message, event.data.stepIndex), createAuthorizationRequiredPart(event)));
2511
2667
  case "authorization.completed": return completeAuthorization(data, event);
2512
- case "message.appended": return updateAssistantMessage(data, event.data.turnId, (message) => upsertRun(ensureStepStartPart(message, event.data.stepIndex), {
2513
- state: "streaming",
2668
+ case "message.appended": return updateAssistantMessage(data, event.data.turnId, (message) => messageRun.append(ensureStepStartPart(message, event.data.stepIndex), {
2669
+ delta: event.data.messageDelta,
2514
2670
  stepIndex: event.data.stepIndex,
2515
- text: event.data.messageSoFar,
2516
2671
  type: "text"
2517
2672
  }));
2518
2673
  case "message.completed": return updateAssistantMessage(data, event.data.turnId, (message) => {
2519
2674
  if (event.data.message === null) return removeTextPart(message, event.data.stepIndex);
2520
- return upsertRun(ensureStepStartPart(message, event.data.stepIndex), {
2675
+ return messageRun.upsert(ensureStepStartPart(message, event.data.stepIndex), {
2521
2676
  state: "done",
2522
2677
  stepIndex: event.data.stepIndex,
2523
2678
  text: event.data.message,
@@ -2635,29 +2790,6 @@ function upsertPart(message, next) {
2635
2790
  parts
2636
2791
  };
2637
2792
  }
2638
- function upsertRun(message, next) {
2639
- let lastIndex = -1;
2640
- for (let index = message.parts.length - 1; index >= 0; index -= 1) {
2641
- const part = message.parts[index];
2642
- if (part?.type === next.type && part.stepIndex === next.stepIndex) {
2643
- lastIndex = index;
2644
- break;
2645
- }
2646
- }
2647
- const parts = lastIndex !== -1 && message.parts[lastIndex].state === "streaming" ? [
2648
- ...message.parts.slice(0, lastIndex),
2649
- next,
2650
- ...message.parts.slice(lastIndex + 1)
2651
- ] : [...message.parts, next];
2652
- return {
2653
- ...message,
2654
- metadata: {
2655
- ...message.metadata,
2656
- status: next.type === "text" && next.state === "done" ? "complete" : "streaming"
2657
- },
2658
- parts
2659
- };
2660
- }
2661
2793
  function removeTextPart(message, stepIndex) {
2662
2794
  const parts = message.parts.filter((part) => part.type !== "text" || part.stepIndex !== stepIndex);
2663
2795
  if (parts.length === message.parts.length) return message;
@@ -680,6 +680,7 @@ function incrementRandom(bytes) {
680
680
  //#region src/protocol/message.ts
681
681
  const EVE_SESSION_ID_HEADER = "x-eve-session-id";
682
682
  const EVE_STREAM_TAIL_INDEX_HEADER = "x-eve-stream-tail-index";
683
+ const EVE_STREAM_VERSION_HEADER = "x-eve-stream-version";
683
684
  const textEncoder = new TextEncoder();
684
685
  function isCurrentTurnBoundaryEvent(event) {
685
686
  return event.type === "session.completed" || event.type === "session.failed" || event.type === "session.waiting";
@@ -787,6 +788,101 @@ var MessageResponse = class {
787
788
  }
788
789
  };
789
790
 
791
+ //#endregion
792
+ //#region src/protocol/message-version.ts
793
+ function normalizeMessageStreamEvent(version, event) {
794
+ switch (version) {
795
+ case "21":
796
+ case "22":
797
+ case "23":
798
+ case "24": return normalizeLegacyMessageStreamEvent(version, event);
799
+ case "25": return validateCurrentMessageStreamEvent(event);
800
+ default: return assertNever(version);
801
+ }
802
+ }
803
+ function normalizeLegacyMessageStreamEvent(version, event) {
804
+ if (event.type === "message.appended") {
805
+ assertLegacyAppendSnapshot(event.data.messageSoFar, event.data.messageDelta, "message", version);
806
+ return {
807
+ data: {
808
+ messageDelta: event.data.messageDelta,
809
+ sequence: event.data.sequence,
810
+ stepIndex: event.data.stepIndex,
811
+ turnId: event.data.turnId
812
+ },
813
+ meta: event.meta,
814
+ type: "message.appended"
815
+ };
816
+ }
817
+ if (event.type === "reasoning.appended") {
818
+ assertLegacyAppendSnapshot(event.data.reasoningSoFar, event.data.reasoningDelta, "reasoning", version);
819
+ return {
820
+ data: {
821
+ reasoningDelta: event.data.reasoningDelta,
822
+ sequence: event.data.sequence,
823
+ stepIndex: event.data.stepIndex,
824
+ turnId: event.data.turnId
825
+ },
826
+ meta: event.meta,
827
+ type: "reasoning.appended"
828
+ };
829
+ }
830
+ if (event.type === "action.input.appended") {
831
+ if (version !== void 0 && version !== "24") throw new TypeError(`Invalid action input append for stream version ${version}.`);
832
+ assertLegacyActionInputOffset(event.data.inputTextOffset, version);
833
+ return {
834
+ data: {
835
+ callId: event.data.callId,
836
+ inputTextDelta: event.data.inputTextDelta,
837
+ sequence: event.data.sequence,
838
+ stepIndex: event.data.stepIndex,
839
+ toolName: event.data.toolName,
840
+ turnId: event.data.turnId
841
+ },
842
+ meta: event.meta,
843
+ type: "action.input.appended"
844
+ };
845
+ }
846
+ return event;
847
+ }
848
+ function validateCurrentMessageStreamEvent(event) {
849
+ if (event.type === "message.appended") {
850
+ assertCurrentAppendDelta(event.data.messageDelta, "message");
851
+ assertUnsupportedAppendField(event.data, "messageOffset", "message");
852
+ assertUnsupportedAppendField(event.data, "messageSoFar", "message");
853
+ } else if (event.type === "reasoning.appended") {
854
+ assertCurrentAppendDelta(event.data.reasoningDelta, "reasoning");
855
+ assertUnsupportedAppendField(event.data, "reasoningOffset", "reasoning");
856
+ assertUnsupportedAppendField(event.data, "reasoningSoFar", "reasoning");
857
+ } else if (event.type === "action.input.appended") {
858
+ assertCurrentAppendDelta(event.data.inputTextDelta, "action input");
859
+ assertUnsupportedAppendField(event.data, "inputTextOffset", "action input");
860
+ }
861
+ return event;
862
+ }
863
+ function assertCurrentAppendDelta(delta, stream) {
864
+ if (typeof delta !== "string") throw new TypeError(`Invalid ${stream} append delta for stream version 25.`);
865
+ }
866
+ function assertUnsupportedAppendField(data, field, stream) {
867
+ if (field in data) throw new TypeError(`Invalid ${stream} append shape for stream version 25.`);
868
+ }
869
+ function assertNever(value) {
870
+ throw new TypeError(`Unsupported message stream version: ${String(value)}.`);
871
+ }
872
+ function assertLegacyActionInputOffset(offset, version) {
873
+ if (!Number.isSafeInteger(offset) || offset < 0) {
874
+ const source = version === void 0 ? "persisted stream" : `stream version ${version}`;
875
+ throw new TypeError(`Invalid action input append offset for ${source}.`);
876
+ }
877
+ }
878
+ function assertLegacyAppendSnapshot(snapshot, delta, stream, version) {
879
+ const offset = snapshot.length - delta.length;
880
+ if (offset < 0 || snapshot.slice(offset) !== delta) {
881
+ const source = version === void 0 ? "persisted stream" : `stream version ${version}`;
882
+ throw new TypeError(`Invalid cumulative ${stream} append for ${source}.`);
883
+ }
884
+ }
885
+
790
886
  //#endregion
791
887
  //#region src/client/ndjson.ts
792
888
  function isStreamDisconnectError(error) {
@@ -813,17 +909,20 @@ async function* readNdjsonStream(body, options) {
813
909
  while (newlineIndex !== -1) {
814
910
  const line = buffer.slice(0, newlineIndex).trim();
815
911
  buffer = buffer.slice(newlineIndex + 1);
816
- if (line.length > 0) yield JSON.parse(line);
912
+ if (line.length > 0) yield parseMessageStreamEvent(line, options.streamVersion);
817
913
  newlineIndex = buffer.indexOf("\n");
818
914
  }
819
915
  }
820
916
  const trailing = buffer.trim();
821
- if (trailing.length > 0) yield JSON.parse(trailing);
917
+ if (trailing.length > 0) yield parseMessageStreamEvent(trailing, options.streamVersion);
822
918
  } finally {
823
919
  if (!reachedEof) await reader.cancel().catch(() => {});
824
920
  reader.releaseLock();
825
921
  }
826
922
  }
923
+ function parseMessageStreamEvent(line, version) {
924
+ return normalizeMessageStreamEvent(version, JSON.parse(line));
925
+ }
827
926
  async function readWithIdleTimeout(reader, idleTimeoutMs) {
828
927
  if (idleTimeoutMs === void 0) return await reader.read();
829
928
  let timeout;
@@ -836,6 +935,22 @@ async function readWithIdleTimeout(reader, idleTimeoutMs) {
836
935
  }
837
936
  }
838
937
 
938
+ //#endregion
939
+ //#region src/client/stream-version.ts
940
+ const supportedMessageStreamVersions = {
941
+ "21": true,
942
+ "22": true,
943
+ "23": true,
944
+ "24": true,
945
+ "25": true
946
+ };
947
+ function readMessageStreamVersion(headers) {
948
+ const version = headers.get(EVE_STREAM_VERSION_HEADER);
949
+ if (version !== null && Object.hasOwn(supportedMessageStreamVersions, version)) return version;
950
+ if (version === null) throw new TypeError(`Missing ${EVE_STREAM_VERSION_HEADER} response header.`);
951
+ throw new TypeError(`Unsupported message stream version: ${version}.`);
952
+ }
953
+
839
954
  //#endregion
840
955
  //#region src/client/url.ts
841
956
  function createClientUrl(host, routePath, searchParams) {
@@ -962,7 +1077,10 @@ async function* followStreamIterable(input) {
962
1077
  }
963
1078
  let deliveredEvent = false;
964
1079
  try {
965
- for await (const event of readNdjsonStream(connection.body, { idleTimeoutMs: input.streamReadIdleTimeoutMs ?? DEFAULT_STREAM_READ_IDLE_TIMEOUT_MS })) {
1080
+ for await (const event of readNdjsonStream(connection.body, {
1081
+ idleTimeoutMs: input.streamReadIdleTimeoutMs ?? DEFAULT_STREAM_READ_IDLE_TIMEOUT_MS,
1082
+ streamVersion: connection.streamVersion
1083
+ })) {
966
1084
  startIndex += 1;
967
1085
  deliveredEvent = true;
968
1086
  reconnectDelayMs = idleRetryPolicy.baseDelayMs;
@@ -1017,6 +1135,7 @@ async function openStreamBody(input) {
1017
1135
  return {
1018
1136
  body: response.body,
1019
1137
  close: () => connectionController.abort(),
1138
+ streamVersion: readMessageStreamVersion(response.headers),
1020
1139
  tailIndex: parseTailIndexHeader(response.headers)
1021
1140
  };
1022
1141
  }
@@ -2285,11 +2404,51 @@ function removeStreamingToolPartsForTurn(data, turnId) {
2285
2404
  function optimisticUserMessageId(submissionId) {
2286
2405
  return `optimistic:${submissionId}:user`;
2287
2406
  }
2288
- function appendToolInputDelta(inputText, offset, delta) {
2289
- if (offset === 0) return delta;
2290
- if (inputText?.length !== offset) return void 0;
2291
- return inputText + delta;
2407
+
2408
+ //#endregion
2409
+ //#region src/client/message-run-parts.ts
2410
+ function append(message, append) {
2411
+ const current = latestStreamingRun(message, append.type, append.stepIndex);
2412
+ return upsert(message, {
2413
+ state: "streaming",
2414
+ stepIndex: append.stepIndex,
2415
+ text: (current?.text ?? "") + append.delta,
2416
+ type: append.type
2417
+ });
2418
+ }
2419
+ function latestStreamingRun(message, type, stepIndex) {
2420
+ for (let index = message.parts.length - 1; index >= 0; index -= 1) {
2421
+ const part = message.parts[index];
2422
+ if (part?.type === type && part.stepIndex === stepIndex) return part.state === "streaming" ? part : void 0;
2423
+ }
2424
+ }
2425
+ function upsert(message, next) {
2426
+ let lastIndex = -1;
2427
+ for (let index = message.parts.length - 1; index >= 0; index -= 1) {
2428
+ const part = message.parts[index];
2429
+ if (part?.type === next.type && part.stepIndex === next.stepIndex) {
2430
+ lastIndex = index;
2431
+ break;
2432
+ }
2433
+ }
2434
+ const parts = lastIndex !== -1 && message.parts[lastIndex].state === "streaming" ? [
2435
+ ...message.parts.slice(0, lastIndex),
2436
+ next,
2437
+ ...message.parts.slice(lastIndex + 1)
2438
+ ] : [...message.parts, next];
2439
+ return {
2440
+ ...message,
2441
+ metadata: {
2442
+ ...message.metadata,
2443
+ status: next.type === "text" && next.state === "done" ? "complete" : "streaming"
2444
+ },
2445
+ parts
2446
+ };
2292
2447
  }
2448
+ const messageRun = {
2449
+ append,
2450
+ upsert
2451
+ };
2293
2452
 
2294
2453
  //#endregion
2295
2454
  //#region src/client/message-reducer.ts
@@ -2349,13 +2508,12 @@ function reduceMessageData(data, event) {
2349
2508
  role: "user"
2350
2509
  });
2351
2510
  case "step.started": return updateAssistantMessage(data, event.data.turnId, (message) => ensureStepStartPart(message, event.data.stepIndex));
2352
- case "reasoning.appended": return updateAssistantMessage(data, event.data.turnId, (message) => upsertRun(ensureStepStartPart(message, event.data.stepIndex), {
2353
- state: "streaming",
2511
+ case "reasoning.appended": return updateAssistantMessage(data, event.data.turnId, (message) => messageRun.append(ensureStepStartPart(message, event.data.stepIndex), {
2512
+ delta: event.data.reasoningDelta,
2354
2513
  stepIndex: event.data.stepIndex,
2355
- text: event.data.reasoningSoFar,
2356
2514
  type: "reasoning"
2357
2515
  }));
2358
- case "reasoning.completed": return updateAssistantMessage(data, event.data.turnId, (message) => upsertRun(ensureStepStartPart(message, event.data.stepIndex), {
2516
+ case "reasoning.completed": return updateAssistantMessage(data, event.data.turnId, (message) => messageRun.upsert(ensureStepStartPart(message, event.data.stepIndex), {
2359
2517
  state: "done",
2360
2518
  stepIndex: event.data.stepIndex,
2361
2519
  text: event.data.reasoning,
@@ -2364,11 +2522,9 @@ function reduceMessageData(data, event) {
2364
2522
  case "action.input.appended": {
2365
2523
  const existing = findToolPart(data, event.data.callId);
2366
2524
  if (existing !== void 0 && existing.state !== "input-streaming") return data;
2367
- const inputText = appendToolInputDelta(existing?.state === "input-streaming" ? existing.inputText : void 0, event.data.inputTextOffset, event.data.inputTextDelta);
2368
- if (inputText === void 0) return data;
2369
2525
  const nextPart = {
2370
2526
  input: void 0,
2371
- inputText,
2527
+ inputText: (existing?.state === "input-streaming" ? existing.inputText : "") + event.data.inputTextDelta,
2372
2528
  state: "input-streaming",
2373
2529
  stepIndex: event.data.stepIndex,
2374
2530
  toolCallId: event.data.callId,
@@ -2509,15 +2665,14 @@ function reduceMessageData(data, event) {
2509
2665
  }
2510
2666
  case "authorization.required": return updateAssistantMessage(data, event.data.turnId, (message) => upsertPart(ensureStepStartPart(message, event.data.stepIndex), createAuthorizationRequiredPart(event)));
2511
2667
  case "authorization.completed": return completeAuthorization(data, event);
2512
- case "message.appended": return updateAssistantMessage(data, event.data.turnId, (message) => upsertRun(ensureStepStartPart(message, event.data.stepIndex), {
2513
- state: "streaming",
2668
+ case "message.appended": return updateAssistantMessage(data, event.data.turnId, (message) => messageRun.append(ensureStepStartPart(message, event.data.stepIndex), {
2669
+ delta: event.data.messageDelta,
2514
2670
  stepIndex: event.data.stepIndex,
2515
- text: event.data.messageSoFar,
2516
2671
  type: "text"
2517
2672
  }));
2518
2673
  case "message.completed": return updateAssistantMessage(data, event.data.turnId, (message) => {
2519
2674
  if (event.data.message === null) return removeTextPart(message, event.data.stepIndex);
2520
- return upsertRun(ensureStepStartPart(message, event.data.stepIndex), {
2675
+ return messageRun.upsert(ensureStepStartPart(message, event.data.stepIndex), {
2521
2676
  state: "done",
2522
2677
  stepIndex: event.data.stepIndex,
2523
2678
  text: event.data.message,
@@ -2635,29 +2790,6 @@ function upsertPart(message, next) {
2635
2790
  parts
2636
2791
  };
2637
2792
  }
2638
- function upsertRun(message, next) {
2639
- let lastIndex = -1;
2640
- for (let index = message.parts.length - 1; index >= 0; index -= 1) {
2641
- const part = message.parts[index];
2642
- if (part?.type === next.type && part.stepIndex === next.stepIndex) {
2643
- lastIndex = index;
2644
- break;
2645
- }
2646
- }
2647
- const parts = lastIndex !== -1 && message.parts[lastIndex].state === "streaming" ? [
2648
- ...message.parts.slice(0, lastIndex),
2649
- next,
2650
- ...message.parts.slice(lastIndex + 1)
2651
- ] : [...message.parts, next];
2652
- return {
2653
- ...message,
2654
- metadata: {
2655
- ...message.metadata,
2656
- status: next.type === "text" && next.state === "done" ? "complete" : "streaming"
2657
- },
2658
- parts
2659
- };
2660
- }
2661
2793
  function removeTextPart(message, stepIndex) {
2662
2794
  const parts = message.parts.filter((part) => part.type !== "text" || part.stepIndex !== stepIndex);
2663
2795
  if (parts.length === message.parts.length) return message;
@@ -4,6 +4,7 @@ import { type IntegrationSetupRunnerDeps } from "#setup/integrations/runner.js";
4
4
  import type { RegistryCommandLogger } from "./registry.js";
5
5
  export interface IntegrationSetupOptions {
6
6
  yes?: boolean;
7
+ force?: boolean;
7
8
  nonInteractive?: boolean;
8
9
  answers?: Record<string, unknown>;
9
10
  signal?: AbortSignal;
@@ -1 +1 @@
1
- import{serializeHeadlessSetupEvent}from"./setup-headless.js";import{createPrompter}from"#setup/prompter.js";import{ensureVercelProject}from"#setup/flows/ensure-vercel-project.js";import{createHeadlessPrompter}from"#setup/headless.js";import{SetupPrerequisiteRequired}from"#setup/integrations/shared/prerequisite.js";import{createRegistrySetupClient}from"#setup/registry-setup-client.js";import{InteractionRequired,InvalidAnswerError,headlessAsker,interactiveAsker,withAnswers,withPolicy}from"#setup/ask.js";import{runIntegrationSetup}from"#setup/integrations/runner.js";import{setupQuestionToWire}from"#setup/setup-question-wire.js";const defaultIntegrationSetupDependencies={};async function runIntegrationSetupCommand(s,c,l,u={},d=defaultIntegrationSetupDependencies){let f=createRegistrySetupClient({process:d.setupProcess,signal:u.signal});try{let n=u.nonInteractive===!0,r=f?.prompter??d.createPrompter?.()??(n?createHeadlessPrompter(()=>{}):createPrompter()),i=n?headlessAsker():interactiveAsker(r),a=u.yes?withPolicy(`assume`)(i):i,o=await runIntegrationSetup(l,{appRoot:c,prompter:r,asker:withAnswers(u.answers??{})(a),resolveVercelProject:n?void 0:()=>ensureVercelProject({appRoot:c,prompter:r,signal:f?.signal??u.signal}),signal:f?.signal??u.signal,beginExternalAction:n?e=>{let t=`external-action-${crypto.randomUUID()}`;return s.log(serializeHeadlessSetupEvent({version:1,type:`external_action`,id:t,blocking:!0,...e})),{complete(){s.log(serializeHeadlessSetupEvent({version:1,type:`external_action_resolved`,id:t}))}}}:void 0},d.runnerDeps);if(o.kind===`cancelled`){f?.cancel(),process.env.EVE_SETUP===`1`?process.exitCode=130:n&&s.error(serializeHeadlessSetupEvent({version:1,type:`cancelled`,item:l}));return}r.outro(`Integration set up.`),f?.complete(o.completion),n&&f===void 0&&s.log(serializeHeadlessSetupEvent({version:1,type:`completed`,item:l}))}catch(e){if(f?.fail(e),f!==void 0)return;u.nonInteractive&&e instanceof InteractionRequired?(s.error(serializeHeadlessSetupEvent({version:1,type:`blocked`,status:`input_required`,question:setupQuestionToWire(e.question)})),process.exitCode=2):u.nonInteractive&&e instanceof InvalidAnswerError?(s.error(serializeHeadlessSetupEvent({version:1,type:`blocked`,status:`input_required`,question:setupQuestionToWire(e.question),issue:{code:`invalid_answer`,message:e.message}})),process.exitCode=2):u.nonInteractive&&e instanceof SetupPrerequisiteRequired?(s.error(serializeHeadlessSetupEvent({version:1,type:`blocked`,status:`prerequisite_required`,prerequisite:e.prerequisite})),process.exitCode=2):(s.error(e instanceof Error?e.message:String(e)),process.exitCode=1)}}export{runIntegrationSetupCommand};
1
+ import{serializeHeadlessSetupEvent}from"./setup-headless.js";import{createPrompter}from"#setup/prompter.js";import{ensureVercelProject}from"#setup/flows/ensure-vercel-project.js";import{createHeadlessPrompter}from"#setup/headless.js";import{SetupPrerequisiteRequired}from"#setup/integrations/shared/prerequisite.js";import{createRegistrySetupClient}from"#setup/registry-setup-client.js";import{InteractionRequired,InvalidAnswerError,headlessAsker,interactiveAsker,withAnswers,withPolicy}from"#setup/ask.js";import{runIntegrationSetup}from"#setup/integrations/runner.js";import{setupQuestionToWire}from"#setup/setup-question-wire.js";const defaultIntegrationSetupDependencies={};async function runIntegrationSetupCommand(s,c,l,u={},d=defaultIntegrationSetupDependencies){let f=createRegistrySetupClient({process:d.setupProcess,signal:u.signal});try{let n=u.nonInteractive===!0,r=f?.prompter??d.createPrompter?.()??(n?createHeadlessPrompter(()=>{}):createPrompter()),i=n?headlessAsker():interactiveAsker(r),a=u.yes?withPolicy(`assume`)(i):i,o=await runIntegrationSetup(l,{appRoot:c,prompter:r,asker:withAnswers(u.answers??{})(a),force:u.force,resolveVercelProject:n?void 0:()=>ensureVercelProject({appRoot:c,prompter:r,signal:f?.signal??u.signal}),signal:f?.signal??u.signal,beginExternalAction:n?e=>{let t=`external-action-${crypto.randomUUID()}`;return s.log(serializeHeadlessSetupEvent({version:1,type:`external_action`,id:t,blocking:!0,...e})),{complete(){s.log(serializeHeadlessSetupEvent({version:1,type:`external_action_resolved`,id:t}))}}}:void 0},d.runnerDeps);if(o.kind===`cancelled`){f?.cancel(),process.env.EVE_SETUP===`1`?process.exitCode=130:n&&s.error(serializeHeadlessSetupEvent({version:1,type:`cancelled`,item:l}));return}r.outro(`Integration set up.`),f?.complete(o.completion),n&&f===void 0&&s.log(serializeHeadlessSetupEvent({version:1,type:`completed`,item:l}))}catch(e){if(f?.fail(e),f!==void 0)return;u.nonInteractive&&e instanceof InteractionRequired?(s.error(serializeHeadlessSetupEvent({version:1,type:`blocked`,status:`input_required`,question:setupQuestionToWire(e.question)})),process.exitCode=2):u.nonInteractive&&e instanceof InvalidAnswerError?(s.error(serializeHeadlessSetupEvent({version:1,type:`blocked`,status:`input_required`,question:setupQuestionToWire(e.question),issue:{code:`invalid_answer`,message:e.message}})),process.exitCode=2):u.nonInteractive&&e instanceof SetupPrerequisiteRequired?(s.error(serializeHeadlessSetupEvent({version:1,type:`blocked`,status:`prerequisite_required`,prerequisite:e.prerequisite})),process.exitCode=2):(s.error(e instanceof Error?e.message:String(e)),process.exitCode=1)}}export{runIntegrationSetupCommand};