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.
- package/CHANGELOG.md +28 -0
- package/dist/src/chunks/{use-eve-agent-BZnOzAVd.js → use-eve-agent-B5I-k6Ek.js} +173 -41
- package/dist/src/chunks/{use-eve-agent-Bgp6INfi.js → use-eve-agent-DUMU6dap.js} +173 -41
- package/dist/src/cli/commands/integration-setup.d.ts +1 -0
- package/dist/src/cli/commands/integration-setup.js +1 -1
- package/dist/src/cli/commands/register-integration-commands.d.ts +1 -1
- package/dist/src/cli/commands/register-integration-commands.js +1 -1
- package/dist/src/cli/commands/registry-declared-setups.d.ts +1 -0
- package/dist/src/cli/commands/registry-declared-setups.js +1 -1
- package/dist/src/cli/commands/registry.js +1 -1
- package/dist/src/cli/dev/tui/runner.js +1 -1
- package/dist/src/cli/dev/tui/subagent-pump.js +1 -1
- package/dist/src/cli/dev/tui/terminal-renderer.js +1 -1
- package/dist/src/client/message-reducer-primitives.d.ts +0 -1
- package/dist/src/client/message-reducer-primitives.js +1 -1
- package/dist/src/client/message-reducer.js +1 -1
- package/dist/src/client/message-run-parts.d.ts +18 -0
- package/dist/src/client/message-run-parts.js +1 -0
- package/dist/src/client/ndjson.d.ts +4 -2
- package/dist/src/client/ndjson.js +3 -3
- package/dist/src/client/open-stream.d.ts +2 -0
- package/dist/src/client/open-stream.js +1 -1
- package/dist/src/client/stream-version.d.ts +3 -0
- package/dist/src/client/stream-version.js +1 -0
- package/dist/src/compiled/.vendor-stamp.json +7 -2
- package/dist/src/compiled/@eve/catalog/index.d.ts +87 -0
- package/dist/src/compiled/@eve/catalog/index.js +1 -0
- package/dist/src/compiler/extension-compatibility.d.ts +34 -21
- package/dist/src/compiler/extension-compatibility.js +1 -1
- package/dist/src/execution/ndjson-stream.d.ts +1 -1
- package/dist/src/execution/ndjson-stream.js +3 -3
- package/dist/src/execution/sandbox/bindings/docker-options.d.ts +1 -1
- package/dist/src/execution/sandbox/bindings/docker-options.js +1 -1
- package/dist/src/execution/sandbox/bindings/eve-image.d.ts +4 -0
- package/dist/src/execution/sandbox/bindings/eve-image.js +1 -0
- package/dist/src/execution/sandbox/bindings/microsandbox-options.d.ts +1 -1
- package/dist/src/execution/sandbox/bindings/microsandbox-options.js +1 -1
- package/dist/src/execution/sandbox/bindings/vercel-create-sdk.js +1 -1
- package/dist/src/execution/workflow-runtime.js +1 -1
- package/dist/src/harness/current-messages.d.ts +2 -0
- package/dist/src/harness/current-messages.js +1 -1
- package/dist/src/harness/emission.js +1 -1
- package/dist/src/harness/hitl/approval-input-requests.d.ts +2 -2
- package/dist/src/harness/hitl/approval-input-requests.js +1 -1
- package/dist/src/harness/input-requests.js +1 -1
- package/dist/src/harness/ordered-stream-emitter.js +1 -1
- package/dist/src/harness/tool-loop.js +2 -2
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/protocol/message-version.d.ts +52 -0
- package/dist/src/protocol/message-version.js +1 -0
- package/dist/src/protocol/message.d.ts +1 -8
- package/dist/src/protocol/message.js +2 -2
- package/dist/src/public/channels/chat-sdk/chatSdkChannel.d.ts +0 -1
- package/dist/src/public/channels/chat-sdk/chatSdkChannel.js +1 -1
- package/dist/src/public/channels/slack/activity.d.ts +18 -0
- package/dist/src/public/channels/slack/activity.js +1 -0
- package/dist/src/public/channels/slack/api.js +1 -1
- package/dist/src/public/channels/slack/defaults.js +2 -2
- package/dist/src/public/channels/slack/index.d.ts +1 -0
- package/dist/src/public/channels/slack/index.js +1 -1
- package/dist/src/public/channels/slack/interaction-cards.js +1 -1
- package/dist/src/public/channels/slack/interactions.js +1 -1
- package/dist/src/public/channels/slack/slackChannel.d.ts +5 -0
- package/dist/src/public/channels/slack/slackChannel.js +1 -1
- package/dist/src/public/memory/file/backends/default.js +1 -1
- package/dist/src/public/sandbox/docker-sandbox.d.ts +5 -4
- package/dist/src/public/sandbox/microsandbox-sandbox.d.ts +1 -1
- package/dist/src/public/sandbox/vercel-sandbox.d.ts +3 -1
- package/dist/src/setup/integrations/file-memory/setup.d.ts +15 -0
- package/dist/src/setup/integrations/file-memory/setup.js +2 -0
- package/dist/src/setup/integrations/file-memory/vercel.d.ts +103 -0
- package/dist/src/setup/integrations/file-memory/vercel.js +1 -0
- package/dist/src/setup/integrations/registry.js +1 -1
- package/dist/src/setup/integrations/shared/vercel-project.js +1 -1
- package/dist/src/setup/scaffold/channels-catalog.js +1 -1
- package/dist/src/setup/scaffold/connections/catalog.d.ts +1 -1
- package/dist/src/setup/scaffold/connections/catalog.js +1 -1
- package/dist/src/setup/scaffold/create/project.js +1 -1
- package/dist/src/svelte/index.js +1 -1
- package/dist/src/svelte/use-eve-agent.js +1 -1
- package/dist/src/vue/index.js +1 -1
- package/dist/src/vue/use-eve-agent.js +1 -1
- package/docs/channels/slack.mdx +1 -1
- package/docs/concepts/sessions-runs-and-streaming.md +12 -6
- package/docs/guides/client/streaming.mdx +18 -2
- package/docs/install-integrations.mdx +3 -0
- package/docs/memory/file.md +49 -10
- package/docs/reference/cli.md +28 -23
- package/docs/sandbox.mdx +5 -3
- package/docs/tools/human-in-the-loop.md +2 -0
- package/package.json +1 -1
- 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
|
|
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
|
|
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, {
|
|
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
|
-
|
|
2289
|
-
|
|
2290
|
-
|
|
2291
|
-
|
|
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) =>
|
|
2353
|
-
|
|
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) =>
|
|
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) =>
|
|
2513
|
-
|
|
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
|
|
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
|
|
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
|
|
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, {
|
|
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
|
-
|
|
2289
|
-
|
|
2290
|
-
|
|
2291
|
-
|
|
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) =>
|
|
2353
|
-
|
|
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) =>
|
|
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) =>
|
|
2513
|
-
|
|
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
|
|
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};
|