eve 0.52.2 → 0.52.3
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 +20 -0
- package/dist/src/channel/types.d.ts +1 -0
- package/dist/src/chunks/{use-eve-agent-1NAM6ftx.js → use-eve-agent-BR8EpIOX.js} +27 -10
- package/dist/src/chunks/{use-eve-agent-BEjdhhhK.js → use-eve-agent-XnfjQt1Z.js} +27 -10
- package/dist/src/cli/commands/deploy.js +1 -1
- package/dist/src/cli/commands/extension-init.d.ts +2 -1
- package/dist/src/cli/commands/extension-init.js +1 -1
- package/dist/src/cli/commands/init.d.ts +2 -13
- package/dist/src/cli/commands/init.js +1 -1
- package/dist/src/cli/dev/run-interactive-ui.d.ts +3 -0
- package/dist/src/cli/dev/run-interactive-ui.js +1 -1
- package/dist/src/cli/dev/tui/prompt-command-handler.js +1 -1
- package/dist/src/cli/dev/tui/runner.d.ts +6 -0
- package/dist/src/cli/dev/tui/runner.js +1 -1
- package/dist/src/cli/dev/tui/setup-commands.d.ts +5 -3
- package/dist/src/cli/dev/tui/setup-commands.js +2 -2
- package/dist/src/cli/dev/tui/status-line.js +1 -1
- package/dist/src/cli/dev/tui/tui.d.ts +4 -0
- package/dist/src/cli/dev/tui/tui.js +1 -1
- package/dist/src/cli/run.d.ts +1 -1
- package/dist/src/cli/run.js +2 -2
- package/dist/src/cli/telemetry/index.d.ts +15 -0
- package/dist/src/cli/telemetry/index.js +2 -2
- package/dist/src/client/session.js +1 -1
- package/dist/src/compiled/.vendor-stamp.json +1 -1
- package/dist/src/compiler/compile-from-memory.d.ts +1 -0
- package/dist/src/compiler/compile-from-memory.js +1 -1
- package/dist/src/compiler/extension-compatibility.d.ts +18 -18
- package/dist/src/compiler/extension-compatibility.js +1 -1
- package/dist/src/context/build-dynamic-tools.d.ts +2 -1
- package/dist/src/context/build-dynamic-tools.js +1 -1
- package/dist/src/context/dynamic-tool-lifecycle.d.ts +3 -3
- package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
- package/dist/src/context/dynamic-tool-metadata.d.ts +1 -1
- package/dist/src/context/hook-lifecycle.js +1 -1
- package/dist/src/context/keys.d.ts +2 -0
- package/dist/src/context/keys.js +1 -1
- package/dist/src/eve-channel/index.js +1 -1
- package/dist/src/execution/activity-events.d.ts +1 -0
- package/dist/src/execution/activity-events.js +1 -1
- package/dist/src/execution/node-step.js +1 -1
- package/dist/src/execution/sandbox/prewarm.js +1 -1
- package/dist/src/execution/session-activity-projection.js +1 -1
- package/dist/src/execution/session-activity.js +1 -1
- package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
- package/dist/src/execution/tasks/parent/dispatch.js +1 -1
- package/dist/src/execution/tasks/parent/task-cancel.d.ts +2 -2
- package/dist/src/execution/tasks/parent/task-cancel.js +1 -1
- package/dist/src/execution/tasks/parent/tool-execution.js +1 -1
- package/dist/src/execution/tools/sleep-workflow.js +1 -1
- package/dist/src/execution/workflow-runtime.js +1 -1
- package/dist/src/execution/workflow-steps.js +1 -1
- package/dist/src/harness/action-presentation.d.ts +13 -0
- package/dist/src/harness/action-presentation.js +1 -0
- package/dist/src/harness/compaction.js +1 -1
- package/dist/src/harness/coordination.js +1 -1
- package/dist/src/harness/emission.d.ts +1 -6
- package/dist/src/harness/emission.js +1 -1
- package/dist/src/harness/execute-tool.d.ts +2 -1
- package/dist/src/harness/finish-reason.d.ts +3 -0
- package/dist/src/harness/finish-reason.js +1 -0
- package/dist/src/harness/provider-tool-schemas.d.ts +1 -0
- package/dist/src/harness/provider-tool-schemas.js +1 -1
- package/dist/src/harness/step-hooks.js +1 -1
- package/dist/src/harness/stream-actions.d.ts +2 -2
- package/dist/src/harness/stream-actions.js +1 -1
- package/dist/src/harness/tool-call-input-errors.d.ts +4 -3
- package/dist/src/harness/tool-call-input-errors.js +1 -1
- package/dist/src/harness/tool-loop.js +2 -2
- package/dist/src/harness/tool-presentation.d.ts +5 -0
- package/dist/src/harness/tool-presentation.js +1 -0
- package/dist/src/harness/turn-client-context.d.ts +1 -0
- package/dist/src/harness/workflow-lifecycle.d.ts +2 -3
- package/dist/src/harness/workflow-lifecycle.js +1 -1
- package/dist/src/internal/application/compiled-artifacts.d.ts +3 -0
- package/dist/src/internal/application/compiled-artifacts.js +1 -1
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/internal/authored-definition/schema-backed.js +1 -1
- package/dist/src/internal/authored-module-conditions.d.ts +2 -0
- package/dist/src/internal/authored-module-conditions.js +1 -0
- package/dist/src/internal/authored-module-loader.d.ts +3 -0
- package/dist/src/internal/authored-module-loader.js +3 -3
- package/dist/src/internal/authored-module-map-loader.d.ts +3 -1
- package/dist/src/internal/authored-module-map-loader.js +1 -1
- package/dist/src/internal/authored-runtime-modules.d.ts +2 -0
- package/dist/src/internal/authored-runtime-modules.js +1 -1
- package/dist/src/internal/bundler/nitro-rolldown.d.ts +1 -0
- package/dist/src/internal/bundler/nitro-rolldown.js +1 -1
- package/dist/src/internal/nitro/development-generation.d.ts +2 -0
- package/dist/src/internal/nitro/development-generation.js +1 -1
- package/dist/src/internal/nitro/host/configure-nitro-routes.js +1 -1
- package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
- package/dist/src/internal/nitro/host/prepare-application-host.js +1 -1
- package/dist/src/internal/nitro/routes/channel-request-instrumentation.js +1 -1
- package/dist/src/internal/workflow-bundle/builder-support.d.ts +5 -0
- package/dist/src/internal/workflow-bundle/builder.js +2 -2
- package/dist/src/internal/workflow-bundle/dynamic-tool-transform.d.ts +1 -1
- package/dist/src/internal/workflow-bundle/dynamic-tool-transform.js +1 -1
- package/dist/src/protocol/activity.d.ts +6 -0
- package/dist/src/protocol/activity.js +1 -1
- package/dist/src/protocol/message.d.ts +13 -1
- package/dist/src/protocol/message.js +1 -1
- package/dist/src/public/channels/slack/activity-plan.js +1 -1
- package/dist/src/public/channels/slack/activity.js +2 -2
- package/dist/src/public/models/openai/chatgpt/credential-store.d.ts +6 -0
- package/dist/src/public/models/openai/chatgpt/credential-store.js +1 -0
- package/dist/src/public/models/openai/chatgpt/model.d.ts +1 -1
- package/dist/src/public/models/openai/chatgpt/oauth.d.ts +20 -0
- package/dist/src/public/models/openai/chatgpt/oauth.js +1 -0
- package/dist/src/public/models/openai/chatgpt/token-broker.d.ts +4 -3
- package/dist/src/public/models/openai/chatgpt/token-broker.js +1 -1
- package/dist/src/public/models/openai/chatgpt/transport.d.ts +1 -2
- package/dist/src/public/models/openai/index.d.ts +3 -4
- package/dist/src/public/tools/index.d.ts +1 -1
- package/dist/src/runtime/prompt/compose.js +1 -1
- package/dist/src/runtime/resolve-tool.js +1 -1
- package/dist/src/runtime/types.d.ts +2 -0
- package/dist/src/self-modification/agent.js +1 -1
- package/dist/src/self-modification/extension/instructions.d.ts +1 -3
- package/dist/src/self-modification/extension/instructions.js +4 -2
- package/dist/src/self-modification/filesystem.js +1 -1
- package/dist/src/setup/flows/chatgpt-auth.d.ts +14 -2
- package/dist/src/setup/flows/chatgpt-auth.js +1 -1
- package/dist/src/setup/flows/model.d.ts +3 -2
- package/dist/src/setup/flows/model.js +1 -1
- package/dist/src/setup/flows/provider.js +1 -1
- package/dist/src/setup/flows/registry.d.ts +4 -0
- package/dist/src/setup/flows/registry.js +1 -1
- package/dist/src/setup/scaffold/create/project.js +1 -1
- package/dist/src/shared/boundary-hook-error.d.ts +4 -0
- package/dist/src/shared/boundary-hook-error.js +1 -0
- package/dist/src/{execution/activity-text.d.ts → shared/presentation-text.d.ts} +1 -1
- package/dist/src/shared/presentation-text.js +1 -0
- package/dist/src/svelte/index.js +1 -1
- package/dist/src/svelte/use-eve-agent.js +1 -1
- package/dist/src/tools/definition.d.ts +21 -0
- package/dist/src/tools/definition.js +1 -1
- package/dist/src/tools/durable-callbacks.d.ts +37 -9
- package/dist/src/tools/durable-callbacks.js +1 -1
- package/dist/src/tools/dynamic.d.ts +2 -1
- package/dist/src/tools/framework/agent-contract.js +1 -1
- package/dist/src/tools/provided/bash.js +1 -1
- package/dist/src/tools/provided/glob.js +1 -1
- package/dist/src/tools/provided/grep.js +1 -1
- package/dist/src/tools/provided/load-skill.js +1 -1
- package/dist/src/tools/provided/read-file.js +1 -1
- package/dist/src/tools/provided/web-fetch.js +1 -1
- package/dist/src/tools/provided/write-file.js +1 -1
- package/dist/src/tools/tool-label.d.ts +1 -0
- package/dist/src/tools/tool-label.js +1 -0
- package/dist/src/tracing/agent-action-instrumentation.js +1 -1
- package/dist/src/tracing/agent-approval-instrumentation.js +1 -1
- package/dist/src/tracing/agent-channel-delivery-instrumentation.js +1 -1
- package/dist/src/tracing/agent-otel-provider.js +2 -2
- package/dist/src/tracing/agent-otel-session-context.js +1 -1
- package/dist/src/tracing/agent-otel-usage.d.ts +10 -0
- package/dist/src/tracing/agent-otel-usage.js +1 -1
- package/dist/src/tracing/agent-span-naming.d.ts +1 -0
- package/dist/src/tracing/agent-span-naming.js +1 -0
- package/dist/src/tracing/agent-tool-instrumentation.js +1 -1
- package/dist/src/vue/index.js +1 -1
- package/dist/src/vue/use-eve-agent.js +1 -1
- package/docs/concepts/default-harness.md +6 -0
- package/docs/concepts/sessions-runs-and-streaming.md +4 -0
- package/docs/connections/overview.mdx +1 -1
- package/docs/guides/client/continuations.mdx +11 -0
- package/docs/guides/dynamic-capabilities.md +4 -4
- package/docs/guides/hooks.md +1 -1
- package/docs/guides/instrumentation.md +40 -1
- package/docs/guides/remote-agents.md +2 -0
- package/docs/instructions.mdx +1 -1
- package/docs/memory/overview.mdx +45 -13
- package/docs/reference/cli.md +6 -0
- package/docs/reference/telemetry.md +2 -2
- package/docs/reference/typescript-api.md +13 -9
- package/docs/sandbox.mdx +14 -2
- package/docs/subagents/index.mdx +8 -4
- package/docs/tools/overview.mdx +44 -2
- package/docs/tools/workflows.mdx +6 -0
- package/docs/tutorial/connect-a-warehouse.mdx +49 -26
- package/docs/tutorial/first-agent.mdx +20 -19
- package/docs/tutorial/guard-the-spend.mdx +4 -4
- package/docs/tutorial/how-it-runs.mdx +2 -3
- package/docs/tutorial/meta.json +2 -2
- package/docs/tutorial/query-sample-data.mdx +30 -19
- package/docs/tutorial/remember-definitions.mdx +5 -5
- package/docs/tutorial/run-analysis.mdx +155 -18
- package/docs/tutorial/ship-it.mdx +71 -81
- package/docs/tutorial/team-playbooks.mdx +10 -10
- package/package.json +1 -1
- package/dist/src/execution/activity-text.js +0 -1
- package/dist/src/internal/workflow-bundle/authored-workflow-modules.d.ts +0 -9
- package/dist/src/internal/workflow-bundle/authored-workflow-modules.js +0 -1
- package/dist/src/public/models/openai/chatgpt/codex-app-server.d.ts +0 -40
- package/dist/src/public/models/openai/chatgpt/codex-app-server.js +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# eve
|
|
2
2
|
|
|
3
|
+
## 0.52.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 9cb899d: Add explicit Datadog operation and resource names to framework-owned agent spans while preserving their OpenTelemetry names and trace hierarchy. Agent invocation spans now include `agent.turn.outcome` so completion, failure, and cancellation remain queryable in backends that discard span events.
|
|
8
|
+
- 1a4f0b3: Allow tools to define an input-aware activity label for channel presentation. Framework tools now provide readable labels for shell, file, skill, fetch, and search actions.
|
|
9
|
+
- e5d8e7b: Match each client `send()` response to the message accepted by the server. Resuming a session with an old stream cursor now skips earlier turns instead of returning an old result.
|
|
10
|
+
- 14af96f: Preserve Node.js custom resolution conditions when bundling authored modules. Production builds with a channel importing `server-only` under `react-server` now produce a valid module map.
|
|
11
|
+
- 4cff7dc: Fix `eve start` failing when an app built on another machine is deployed to a different directory. Sandbox prewarming now resolves authored modules from the deployed app while preserving TypeScript aliases and workspace package resolution.
|
|
12
|
+
- 9034901: Resolve workflow path aliases from the application config and bundle only workflows reachable from the agent. Unresolved workflow imports now fail the build instead of producing a bundle that crashes every durable session.
|
|
13
|
+
- 8a50983: Keep dynamic tool callbacks isolated by session, lifecycle scope, and resolver. Replaying a tool now retains its own implementation when another session or scope registers the same tool name.
|
|
14
|
+
- 0d19fa3: Fix repeated ineffective compaction when provider-reported input tokens exceed the character estimate. Tool-result trimming now accounts for measured context pressure and falls back to summarization when it cannot free enough space.
|
|
15
|
+
- 67f3b8d: Sign in to a ChatGPT subscription directly from eve without installing the Codex CLI. eve now manages its own local login and token refresh, with browser sign-in, device codes over SSH, and actionable recovery messages; existing Codex users sign in once through `/model` after upgrading.
|
|
16
|
+
- 2ff8511: Preserve a cancelled task's notification to its parent when shutdown exceeds the cooperative grace period. Parents no longer wait for a notification from a task that was already cancelled.
|
|
17
|
+
- 3c3a0df: Allow async-generator tools to project typed preliminary and final results into bounded user-facing activity text with `activity.update` and `activity.result`.
|
|
18
|
+
- 2ff8511: Keep conversation sessions available after a `turn.started` or `step.started` handler throws. The failed turn reports the error, and a later message can resume the same session.
|
|
19
|
+
- 461b578: Keep framework context at a stable position throughout a turn so tool steps can reuse the existing prompt prefix instead of moving skill announcements behind new tool results.
|
|
20
|
+
- 4b5fad4: Steer a running background subagent by sending an updated message with its existing `agentId`. eve cancels its previous task and starts a new task in the same child session, preserving its conversation history.
|
|
21
|
+
- 59ec96c: Add CLI telemetry for setup and onboarding flows.
|
|
22
|
+
|
|
3
23
|
## 0.52.2
|
|
4
24
|
|
|
5
25
|
### Patch Changes
|
|
@@ -1407,7 +1407,7 @@ var ClientSession = class ClientSession {
|
|
|
1407
1407
|
}
|
|
1408
1408
|
static async create(context, input) {
|
|
1409
1409
|
const response = await postTurn(context, EVE_SESSION_ROUTE_PATH, input, true);
|
|
1410
|
-
const sessionId = await
|
|
1410
|
+
const { sessionId } = await readAcceptedMessage(response);
|
|
1411
1411
|
const session = new ClientSession(context, {
|
|
1412
1412
|
sessionId,
|
|
1413
1413
|
streamIndex: 0
|
|
@@ -1454,8 +1454,10 @@ var ClientSession = class ClientSession {
|
|
|
1454
1454
|
const initialStreamIndex = this.#state.streamIndex;
|
|
1455
1455
|
const path = createEveSessionRoutePath(this.#state.sessionId);
|
|
1456
1456
|
const response = retrySessionNotActive ? await postSessionSend(this.#context, path, input) : await postTurn(this.#context, path, input, false);
|
|
1457
|
-
|
|
1458
|
-
|
|
1457
|
+
const { sessionId: responseSessionId, deliveryId } = await readAcceptedMessage(response, this.#state.sessionId);
|
|
1458
|
+
if (responseSessionId !== this.#state.sessionId) throw new Error("Message route returned a different session id.");
|
|
1459
|
+
if (input.message !== void 0 && deliveryId === void 0) throw new Error("Message route did not return a delivery id. Update the server before sending with this client.");
|
|
1460
|
+
return this.#messageResponse(response, input, initialStreamIndex, input.message === void 0 ? void 0 : deliveryId);
|
|
1459
1461
|
}
|
|
1460
1462
|
async cancel(options) {
|
|
1461
1463
|
return await cancelClientSession({
|
|
@@ -1487,16 +1489,18 @@ var ClientSession = class ClientSession {
|
|
|
1487
1489
|
if (options?.follow === false && (options.startIndex ?? this.#state.streamIndex) < 0) throw new Error("stream({ follow: false }) requires a nonnegative startIndex; a tail-relative cursor cannot be bounded.");
|
|
1488
1490
|
return this.#streamAndAdvance(options);
|
|
1489
1491
|
}
|
|
1490
|
-
#messageResponse(response, input, initialStreamIndex) {
|
|
1492
|
+
#messageResponse(response, input, initialStreamIndex, deliveryId) {
|
|
1491
1493
|
response.body?.cancel().catch(() => {});
|
|
1492
1494
|
return new MessageResponse({
|
|
1493
1495
|
cancelTurn: async (turnId) => await this.cancel({ turnId }),
|
|
1494
|
-
createStream: () => this.#createEventStream(initialStreamIndex, input),
|
|
1496
|
+
createStream: () => this.#createEventStream(initialStreamIndex, input, deliveryId),
|
|
1495
1497
|
sessionId: this.#state.sessionId
|
|
1496
1498
|
});
|
|
1497
1499
|
}
|
|
1498
|
-
async *#createEventStream(initialStreamIndex, input) {
|
|
1500
|
+
async *#createEventStream(initialStreamIndex, input, deliveryId) {
|
|
1499
1501
|
let eventCount = 0;
|
|
1502
|
+
let started = deliveryId === void 0;
|
|
1503
|
+
let reachedBoundary = false;
|
|
1500
1504
|
const pendingAuthorizations = /* @__PURE__ */ new Set();
|
|
1501
1505
|
try {
|
|
1502
1506
|
for await (const event of this.#readStream({
|
|
@@ -1507,15 +1511,25 @@ var ClientSession = class ClientSession {
|
|
|
1507
1511
|
streamReconnectPolicy: input.streamReconnectPolicy
|
|
1508
1512
|
})) {
|
|
1509
1513
|
eventCount += 1;
|
|
1514
|
+
if (deliveryId !== void 0) {
|
|
1515
|
+
const matches = event.meta?.deliveryIds?.includes(deliveryId) === true;
|
|
1516
|
+
const terminal = event.type === "session.failed" || event.type === "session.completed";
|
|
1517
|
+
if (!matches && terminal && (!started || event.type === "session.completed")) throw new Error("The session ended before the accepted message reached its turn boundary.");
|
|
1518
|
+
if (!started && !matches) continue;
|
|
1519
|
+
if (!terminal && event.meta?.deliveryIds !== void 0 && !matches) continue;
|
|
1520
|
+
started = true;
|
|
1521
|
+
}
|
|
1510
1522
|
if (event.type === "authorization.required" && event.data.webhookUrl !== void 0) pendingAuthorizations.add(event.data.name);
|
|
1511
1523
|
else if (event.type === "authorization.completed") pendingAuthorizations.delete(event.data.name);
|
|
1524
|
+
reachedBoundary = isCurrentTurnBoundaryEvent(event) && (event.type !== "session.waiting" || pendingAuthorizations.size === 0);
|
|
1512
1525
|
yield event;
|
|
1513
|
-
if (
|
|
1526
|
+
if (reachedBoundary) break;
|
|
1514
1527
|
}
|
|
1528
|
+
if (deliveryId !== void 0 && !reachedBoundary && !input.signal?.aborted) throw new Error("The response stream ended before the accepted message reached its turn boundary.");
|
|
1515
1529
|
} finally {
|
|
1516
1530
|
this.#state = {
|
|
1517
1531
|
sessionId: this.#state.sessionId,
|
|
1518
|
-
streamIndex: initialStreamIndex + eventCount
|
|
1532
|
+
streamIndex: Math.max(this.#state.streamIndex, initialStreamIndex + eventCount)
|
|
1519
1533
|
};
|
|
1520
1534
|
}
|
|
1521
1535
|
}
|
|
@@ -1591,11 +1605,14 @@ async function postTurn(context, path, input, requireMessage) {
|
|
|
1591
1605
|
}
|
|
1592
1606
|
return response;
|
|
1593
1607
|
}
|
|
1594
|
-
async function
|
|
1608
|
+
async function readAcceptedMessage(response, expected) {
|
|
1595
1609
|
const payload = await response.json();
|
|
1596
1610
|
const sessionId = (typeof payload.sessionId === "string" ? payload.sessionId : void 0) ?? response.headers.get("x-eve-session-id")?.trim() ?? expected;
|
|
1597
1611
|
if (!sessionId) throw new Error("Message route did not return a session id.");
|
|
1598
|
-
return
|
|
1612
|
+
return {
|
|
1613
|
+
sessionId,
|
|
1614
|
+
deliveryId: typeof payload.deliveryId === "string" && payload.deliveryId.length > 0 ? payload.deliveryId : void 0
|
|
1615
|
+
};
|
|
1599
1616
|
}
|
|
1600
1617
|
function createMessageBody(input, requireMessage) {
|
|
1601
1618
|
const body = {};
|
|
@@ -1407,7 +1407,7 @@ var ClientSession = class ClientSession {
|
|
|
1407
1407
|
}
|
|
1408
1408
|
static async create(context, input) {
|
|
1409
1409
|
const response = await postTurn(context, EVE_SESSION_ROUTE_PATH, input, true);
|
|
1410
|
-
const sessionId = await
|
|
1410
|
+
const { sessionId } = await readAcceptedMessage(response);
|
|
1411
1411
|
const session = new ClientSession(context, {
|
|
1412
1412
|
sessionId,
|
|
1413
1413
|
streamIndex: 0
|
|
@@ -1454,8 +1454,10 @@ var ClientSession = class ClientSession {
|
|
|
1454
1454
|
const initialStreamIndex = this.#state.streamIndex;
|
|
1455
1455
|
const path = createEveSessionRoutePath(this.#state.sessionId);
|
|
1456
1456
|
const response = retrySessionNotActive ? await postSessionSend(this.#context, path, input) : await postTurn(this.#context, path, input, false);
|
|
1457
|
-
|
|
1458
|
-
|
|
1457
|
+
const { sessionId: responseSessionId, deliveryId } = await readAcceptedMessage(response, this.#state.sessionId);
|
|
1458
|
+
if (responseSessionId !== this.#state.sessionId) throw new Error("Message route returned a different session id.");
|
|
1459
|
+
if (input.message !== void 0 && deliveryId === void 0) throw new Error("Message route did not return a delivery id. Update the server before sending with this client.");
|
|
1460
|
+
return this.#messageResponse(response, input, initialStreamIndex, input.message === void 0 ? void 0 : deliveryId);
|
|
1459
1461
|
}
|
|
1460
1462
|
async cancel(options) {
|
|
1461
1463
|
return await cancelClientSession({
|
|
@@ -1487,16 +1489,18 @@ var ClientSession = class ClientSession {
|
|
|
1487
1489
|
if (options?.follow === false && (options.startIndex ?? this.#state.streamIndex) < 0) throw new Error("stream({ follow: false }) requires a nonnegative startIndex; a tail-relative cursor cannot be bounded.");
|
|
1488
1490
|
return this.#streamAndAdvance(options);
|
|
1489
1491
|
}
|
|
1490
|
-
#messageResponse(response, input, initialStreamIndex) {
|
|
1492
|
+
#messageResponse(response, input, initialStreamIndex, deliveryId) {
|
|
1491
1493
|
response.body?.cancel().catch(() => {});
|
|
1492
1494
|
return new MessageResponse({
|
|
1493
1495
|
cancelTurn: async (turnId) => await this.cancel({ turnId }),
|
|
1494
|
-
createStream: () => this.#createEventStream(initialStreamIndex, input),
|
|
1496
|
+
createStream: () => this.#createEventStream(initialStreamIndex, input, deliveryId),
|
|
1495
1497
|
sessionId: this.#state.sessionId
|
|
1496
1498
|
});
|
|
1497
1499
|
}
|
|
1498
|
-
async *#createEventStream(initialStreamIndex, input) {
|
|
1500
|
+
async *#createEventStream(initialStreamIndex, input, deliveryId) {
|
|
1499
1501
|
let eventCount = 0;
|
|
1502
|
+
let started = deliveryId === void 0;
|
|
1503
|
+
let reachedBoundary = false;
|
|
1500
1504
|
const pendingAuthorizations = /* @__PURE__ */ new Set();
|
|
1501
1505
|
try {
|
|
1502
1506
|
for await (const event of this.#readStream({
|
|
@@ -1507,15 +1511,25 @@ var ClientSession = class ClientSession {
|
|
|
1507
1511
|
streamReconnectPolicy: input.streamReconnectPolicy
|
|
1508
1512
|
})) {
|
|
1509
1513
|
eventCount += 1;
|
|
1514
|
+
if (deliveryId !== void 0) {
|
|
1515
|
+
const matches = event.meta?.deliveryIds?.includes(deliveryId) === true;
|
|
1516
|
+
const terminal = event.type === "session.failed" || event.type === "session.completed";
|
|
1517
|
+
if (!matches && terminal && (!started || event.type === "session.completed")) throw new Error("The session ended before the accepted message reached its turn boundary.");
|
|
1518
|
+
if (!started && !matches) continue;
|
|
1519
|
+
if (!terminal && event.meta?.deliveryIds !== void 0 && !matches) continue;
|
|
1520
|
+
started = true;
|
|
1521
|
+
}
|
|
1510
1522
|
if (event.type === "authorization.required" && event.data.webhookUrl !== void 0) pendingAuthorizations.add(event.data.name);
|
|
1511
1523
|
else if (event.type === "authorization.completed") pendingAuthorizations.delete(event.data.name);
|
|
1524
|
+
reachedBoundary = isCurrentTurnBoundaryEvent(event) && (event.type !== "session.waiting" || pendingAuthorizations.size === 0);
|
|
1512
1525
|
yield event;
|
|
1513
|
-
if (
|
|
1526
|
+
if (reachedBoundary) break;
|
|
1514
1527
|
}
|
|
1528
|
+
if (deliveryId !== void 0 && !reachedBoundary && !input.signal?.aborted) throw new Error("The response stream ended before the accepted message reached its turn boundary.");
|
|
1515
1529
|
} finally {
|
|
1516
1530
|
this.#state = {
|
|
1517
1531
|
sessionId: this.#state.sessionId,
|
|
1518
|
-
streamIndex: initialStreamIndex + eventCount
|
|
1532
|
+
streamIndex: Math.max(this.#state.streamIndex, initialStreamIndex + eventCount)
|
|
1519
1533
|
};
|
|
1520
1534
|
}
|
|
1521
1535
|
}
|
|
@@ -1591,11 +1605,14 @@ async function postTurn(context, path, input, requireMessage) {
|
|
|
1591
1605
|
}
|
|
1592
1606
|
return response;
|
|
1593
1607
|
}
|
|
1594
|
-
async function
|
|
1608
|
+
async function readAcceptedMessage(response, expected) {
|
|
1595
1609
|
const payload = await response.json();
|
|
1596
1610
|
const sessionId = (typeof payload.sessionId === "string" ? payload.sessionId : void 0) ?? response.headers.get("x-eve-session-id")?.trim() ?? expected;
|
|
1597
1611
|
if (!sessionId) throw new Error("Message route did not return a session id.");
|
|
1598
|
-
return
|
|
1612
|
+
return {
|
|
1613
|
+
sessionId,
|
|
1614
|
+
deliveryId: typeof payload.deliveryId === "string" && payload.deliveryId.length > 0 ? payload.deliveryId : void 0
|
|
1615
|
+
};
|
|
1599
1616
|
}
|
|
1600
1617
|
function createMessageBody(input, requireMessage) {
|
|
1601
1618
|
const body = {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{hasInteractiveTerminal,validateWorkspaceProjectCommand}from"./preconditions.js";import{isNonInteractiveProjectCommand,runNonInteractiveLink}from"./vercel-non-interactive.js";import{isEveProject}from"#setup/scaffold/index.js";import{runDeployFlow}from"#setup/flows/deploy.js";import{createPrompter}from"#setup/prompter.js";const defaultDependencies={hasInteractiveTerminal,isEveProject};async function runDeployCommand(e,t,n=defaultDependencies,r={}){if(!await validateWorkspaceProjectCommand({appRoot:t,isEveProject:n.isEveProject,logger:e,workspaceMemberMessage:e=>`This agent belongs to the workspace at ${e.root}. Run \`eve deploy\` from the workspace root to deploy every peer agent together.`}))return;if(isNonInteractiveProjectCommand(r)){if(r.yes!==!0){e.error("`eve deploy --non-interactive` requires `--yes` to confirm production deployment."),process.exitCode=1;return}if(r.project!==void 0&&!await runNonInteractiveLink({logger:e,appRoot:t,options:r}))return}let i=n.createPrompter?.()??createPrompter();i.intro(`Deploy your eve agent to Vercel`);try{let a=await runDeployFlow({appRoot:t,prompter:i,interactive:!isNonInteractiveProjectCommand(r)&&n.hasInteractiveTerminal(),deps:n.flowDeps});if(a.kind===`needs-link`){e.error("This directory is not linked to a Vercel project. Run `eve link` first, or name the project on the deploy itself: `eve deploy --project <name-or-id> --non-interactive --yes`."),process.exitCode=1;return}if(a.kind===`local-model`){e.error("ChatGPT subscription models use local
|
|
1
|
+
import{hasInteractiveTerminal,validateWorkspaceProjectCommand}from"./preconditions.js";import{isNonInteractiveProjectCommand,runNonInteractiveLink}from"./vercel-non-interactive.js";import{isEveProject}from"#setup/scaffold/index.js";import{runDeployFlow}from"#setup/flows/deploy.js";import{createPrompter}from"#setup/prompter.js";const defaultDependencies={hasInteractiveTerminal,isEveProject};async function runDeployCommand(e,t,n=defaultDependencies,r={}){if(!await validateWorkspaceProjectCommand({appRoot:t,isEveProject:n.isEveProject,logger:e,workspaceMemberMessage:e=>`This agent belongs to the workspace at ${e.root}. Run \`eve deploy\` from the workspace root to deploy every peer agent together.`}))return;if(isNonInteractiveProjectCommand(r)){if(r.yes!==!0){e.error("`eve deploy --non-interactive` requires `--yes` to confirm production deployment."),process.exitCode=1;return}if(r.project!==void 0&&!await runNonInteractiveLink({logger:e,appRoot:t,options:r}))return}let i=n.createPrompter?.()??createPrompter();i.intro(`Deploy your eve agent to Vercel`);try{let a=await runDeployFlow({appRoot:t,prompter:i,interactive:!isNonInteractiveProjectCommand(r)&&n.hasInteractiveTerminal(),deps:n.flowDeps});if(a.kind===`needs-link`){e.error("This directory is not linked to a Vercel project. Run `eve link` first, or name the project on the deploy itself: `eve deploy --project <name-or-id> --non-interactive --yes`."),process.exitCode=1;return}if(a.kind===`local-model`){e.error("ChatGPT subscription models use local ChatGPT credentials and cannot be deployed. Switch to an AI Gateway or server-authenticated model before running `eve deploy`."),process.exitCode=1;return}i.outro(a.kind===`cancelled`?`Cancelled.`:a.productionUrl===void 0?`Deployed.`:`Deployed: ${a.productionUrl}`)}catch(t){e.error(t instanceof Error?t.message:String(t)),process.exitCode=1}}export{runDeployCommand};
|
|
@@ -7,6 +7,7 @@ export interface ExtensionInitCliLogger {
|
|
|
7
7
|
error(message: string): void;
|
|
8
8
|
log(message: string): void;
|
|
9
9
|
}
|
|
10
|
+
export type ExtensionInitSetupStep = "resolve_target" | "scaffold" | "install_dependencies" | "initialize_git" | "handoff";
|
|
10
11
|
export interface ExtensionInitCommandDependencies {
|
|
11
12
|
detectInvokingPackageManager: typeof detectInvokingPackageManager;
|
|
12
13
|
detectPackageManager: typeof detectPackageManager;
|
|
@@ -22,4 +23,4 @@ export declare const EVE_INIT_PACKAGE_SPEC_ENV = "EVE_INIT_PACKAGE_SPEC";
|
|
|
22
23
|
* Creates a new eve extension package. Same install/git flow as agent `eve init`,
|
|
23
24
|
* but always create-only and prints next steps instead of starting `eve dev`.
|
|
24
25
|
*/
|
|
25
|
-
export declare function runExtensionInitCommand(logger: ExtensionInitCliLogger, parentDirectory: string, target: string | undefined, dependencies?: ExtensionInitCommandDependencies): Promise<void>;
|
|
26
|
+
export declare function runExtensionInitCommand(logger: ExtensionInitCliLogger, parentDirectory: string, target: string | undefined, dependencies?: ExtensionInitCommandDependencies, trackStep?: (step: ExtensionInitSetupStep) => void): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{initExtensionHandoff,initExtensionInstructions}from"./agent-instructions.js";import{tryInitializeGit}from"./init-git.js";import{mkdtemp,readdir,rename,rm,stat}from"node:fs/promises";import{createLogger,isLogLevelEnabled}from"#internal/logging.js";import{basename,join,resolve}from"node:path";import pc from"#compiled/picocolors/index.js";import{scaffoldExtensionProject}from"#setup/scaffold/index.js";import{packageManagerInstallFailureMessage,packageManagerInstallSucceeded,runPackageManagerInstall}from"#setup/primitives/index.js";import{performance}from"node:perf_hooks";import{isCodingAgentLaunch}from"#cli/agent-detection.js";import{EVE_WORDMARK}from"#cli/banner.js";import{formatElapsed}from"#cli/format-elapsed.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{formatNodeEngineOverrideWarning}from"#setup/node-engine.js";import{detectInvokingPackageManager,detectPackageManager}from"#setup/package-manager.js";import{pathExists}from"#setup/path-exists.js";import{parseProjectName}from"#setup/project-name.js";import{blockingCreateInPlaceEntries}from"#setup/scaffold/create-in-place.js";import{DEFAULT_EVE_PACKAGE_CONTRACT}from"#setup/scaffold/create/project.js";const defaultDependencies={detectInvokingPackageManager,detectPackageManager,isCodingAgentLaunch,now:()=>performance.now(),runPackageManagerInstall,scaffoldExtensionProject,tryInitializeGit},EVE_INIT_PACKAGE_SPEC_ENV=`EVE_INIT_PACKAGE_SPEC`,initLog=createLogger(`extension-init`);function isCurrentDirectoryTarget(e){return/^\.(?:[/\\]+\.?)*$/u.test(e.trim())}async function resolveTargetDirectory(e,t){let n=resolve(e,t);return(await stat(n).catch(()=>void 0))?.isDirectory()?n:void 0}async function assertCanScaffoldInPlace(e){let t=await readdir(e),n=blockingCreateInPlaceEntries(t);if(n.length===0)return;let r=n.slice(0,5).join(`, `),i=n.length>5?`, and ${n.length-5} more`:``;throw Error(`Cannot create project in current directory because it is not empty. Found: ${r}${i}. Use an empty directory.`)}async function moveDirectoryContents(e,t){for(let n of await readdir(e))await rename(join(e,n),join(t,n))}function uniqueWorkspaceRootMutations(e){let t=new Map;for(let n of e){let e=`${n.kind}:${n.path}`,r=t.get(e);t.set(e,{...n,nodeEngineOverride:n.nodeEngineOverride??r?.nodeEngineOverride})}return[...t.values()]}function formatWorkspaceRootMutationWarning(e){let t=e.kind===`package-json`?`package.json`:`configuration`,n=e.nodeEngineOverride===void 0?``:` (${formatNodeEngineOverrideWarning(e.nodeEngineOverride)})`;return`Updated workspace root ${t} at ${e.path}${n}`}async function resolveScaffoldPackageManager(e,t){let n=await t.detectPackageManager(e);return n.source==="default"?t.detectInvokingPackageManager()??`pnpm`:n.kind}async function scaffoldExtension(e,t,n,r,i){let a=resolve(e),o=t===`.`,s=o?a:join(a,t);if(o)await assertCanScaffoldInPlace(s);else if(await pathExists(s))throw Error(`Cannot create project because "${s}" already exists.`);let c=await mkdtemp(join(a,`.eve-extension-init-`)),l=[];try{let e=o?basename(s):t,a=await r.scaffoldExtensionProject({projectName:e,evePackage:i,targetDirectory:c,workspaceProbeDirectory:s,packageManager:n,onWorkspaceRootMutation:e=>{l.push(e)}});return o?await moveDirectoryContents(a,s):await rename(a,s),{projectPath:s,workspaceRootMutations:uniqueWorkspaceRootMutations(l)}}finally{await rm(c,{recursive:!0,force:!0})}}function installProgressDetail(e,t){let n=t.text.trim();if(n===``||e!==`npm`)return n||void 0;let r=/^npm silly fetch manifest (.+)$/u.exec(n);if(r!==null)return`Resolving ${r[1]}`;let i=/^npm http fetch \S+ \S+ attempt (\d+) failed with (\S+)$/u.exec(n);if(i!==null)return`npm registry · attempt ${i[1]} failed: ${i[2]}`;if(t.stream===`stdout`||/^npm (?:error|warn)\b/u.test(n))return n}const NPM_NOISE_LINE=/^\s*npm (?:silly|verbose|http|timing)\b/u;function resolveInitEvePackageOverride(){let e=process.env[EVE_INIT_PACKAGE_SPEC_ENV]?.trim();if(e!==void 0&&e.length!==0)return{nodeEngine:DEFAULT_EVE_PACKAGE_CONTRACT.nodeEngine,version:e}}async function runExtensionInitCommand(e,t,n,r=defaultDependencies){if(n===void 0&&await r.isCodingAgentLaunch()){e.log(initExtensionInstructions());return}let
|
|
1
|
+
import{initExtensionHandoff,initExtensionInstructions}from"./agent-instructions.js";import{tryInitializeGit}from"./init-git.js";import{mkdtemp,readdir,rename,rm,stat}from"node:fs/promises";import{createLogger,isLogLevelEnabled}from"#internal/logging.js";import{basename,join,resolve}from"node:path";import pc from"#compiled/picocolors/index.js";import{scaffoldExtensionProject}from"#setup/scaffold/index.js";import{packageManagerInstallFailureMessage,packageManagerInstallSucceeded,runPackageManagerInstall}from"#setup/primitives/index.js";import{performance}from"node:perf_hooks";import{isCodingAgentLaunch}from"#cli/agent-detection.js";import{EVE_WORDMARK}from"#cli/banner.js";import{formatElapsed}from"#cli/format-elapsed.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{formatNodeEngineOverrideWarning}from"#setup/node-engine.js";import{detectInvokingPackageManager,detectPackageManager}from"#setup/package-manager.js";import{pathExists}from"#setup/path-exists.js";import{parseProjectName}from"#setup/project-name.js";import{blockingCreateInPlaceEntries}from"#setup/scaffold/create-in-place.js";import{DEFAULT_EVE_PACKAGE_CONTRACT}from"#setup/scaffold/create/project.js";const defaultDependencies={detectInvokingPackageManager,detectPackageManager,isCodingAgentLaunch,now:()=>performance.now(),runPackageManagerInstall,scaffoldExtensionProject,tryInitializeGit},EVE_INIT_PACKAGE_SPEC_ENV=`EVE_INIT_PACKAGE_SPEC`,initLog=createLogger(`extension-init`);function isCurrentDirectoryTarget(e){return/^\.(?:[/\\]+\.?)*$/u.test(e.trim())}async function resolveTargetDirectory(e,t){let n=resolve(e,t);return(await stat(n).catch(()=>void 0))?.isDirectory()?n:void 0}async function assertCanScaffoldInPlace(e){let t=await readdir(e),n=blockingCreateInPlaceEntries(t);if(n.length===0)return;let r=n.slice(0,5).join(`, `),i=n.length>5?`, and ${n.length-5} more`:``;throw Error(`Cannot create project in current directory because it is not empty. Found: ${r}${i}. Use an empty directory.`)}async function moveDirectoryContents(e,t){for(let n of await readdir(e))await rename(join(e,n),join(t,n))}function uniqueWorkspaceRootMutations(e){let t=new Map;for(let n of e){let e=`${n.kind}:${n.path}`,r=t.get(e);t.set(e,{...n,nodeEngineOverride:n.nodeEngineOverride??r?.nodeEngineOverride})}return[...t.values()]}function formatWorkspaceRootMutationWarning(e){let t=e.kind===`package-json`?`package.json`:`configuration`,n=e.nodeEngineOverride===void 0?``:` (${formatNodeEngineOverrideWarning(e.nodeEngineOverride)})`;return`Updated workspace root ${t} at ${e.path}${n}`}async function resolveScaffoldPackageManager(e,t){let n=await t.detectPackageManager(e);return n.source==="default"?t.detectInvokingPackageManager()??`pnpm`:n.kind}async function scaffoldExtension(e,t,n,r,i){let a=resolve(e),o=t===`.`,s=o?a:join(a,t);if(o)await assertCanScaffoldInPlace(s);else if(await pathExists(s))throw Error(`Cannot create project because "${s}" already exists.`);let c=await mkdtemp(join(a,`.eve-extension-init-`)),l=[];try{let e=o?basename(s):t,a=await r.scaffoldExtensionProject({projectName:e,evePackage:i,targetDirectory:c,workspaceProbeDirectory:s,packageManager:n,onWorkspaceRootMutation:e=>{l.push(e)}});return o?await moveDirectoryContents(a,s):await rename(a,s),{projectPath:s,workspaceRootMutations:uniqueWorkspaceRootMutations(l)}}finally{await rm(c,{recursive:!0,force:!0})}}function installProgressDetail(e,t){let n=t.text.trim();if(n===``||e!==`npm`)return n||void 0;let r=/^npm silly fetch manifest (.+)$/u.exec(n);if(r!==null)return`Resolving ${r[1]}`;let i=/^npm http fetch \S+ \S+ attempt (\d+) failed with (\S+)$/u.exec(n);if(i!==null)return`npm registry · attempt ${i[1]} failed: ${i[2]}`;if(t.stream===`stdout`||/^npm (?:error|warn)\b/u.test(n))return n}const NPM_NOISE_LINE=/^\s*npm (?:silly|verbose|http|timing)\b/u;function resolveInitEvePackageOverride(){let e=process.env[EVE_INIT_PACKAGE_SPEC_ENV]?.trim();if(e!==void 0&&e.length!==0)return{nodeEngine:DEFAULT_EVE_PACKAGE_CONTRACT.nodeEngine,version:e}}async function runExtensionInitCommand(e,t,n,r=defaultDependencies,i){if(i?.(`resolve_target`),n===void 0&&await r.isCodingAgentLaunch()){e.log(initExtensionInstructions());return}let a=isLogLevelEnabled(`debug`),o=startCliLiveRow(e);o.update(`Preparing project`);let s,c,l=[],u,d,f;try{let p=n??`.`,m=isCurrentDirectoryTarget(p),h=m?await pathExists(join(resolve(t),`package.json`))?resolve(t):void 0:await resolveTargetDirectory(t,p),g=resolveInitEvePackageOverride();if(h!==void 0)throw Error("`eve extension init` creates a new extension package and cannot add to an existing project. Pass a new directory name, or run from an empty directory with `eve extension init .`.");i?.(`scaffold`),o.update(`Creating extension`),initLog.debug(`creating extension`);let _=r.now(),v=m?`.`:parseProjectName(p),y=resolve(t);c=await resolveScaffoldPackageManager(v===`.`?y:join(y,v),r);let b=await scaffoldExtension(t,v,c,r,g);s=b.projectPath,l=b.workspaceRootMutations,u=r.now()-_,initLog.debug(`creating extension done`,{ms:u}),i?.(`install_dependencies`),o.update(`Installing dependencies`,`${c} install`),initLog.debug(`installing dependencies with ${c}`);let x=r.now(),S=[],C=[],w=await r.runPackageManagerInstall(c,s,{progressDetails:process.stdout.isTTY===!0&&!a,onOutput:e=>{e.text.trim()!==``&&(C.push(e.text),C.length>20&&C.shift(),NPM_NOISE_LINE.test(e.text)||S.push(e.text)),a&&initLog.debug(e.text);let t=installProgressDetail(c,e);t!==void 0&&o.update(`Installing dependencies`,t)}});if(d=r.now()-x,!packageManagerInstallSucceeded(w)){initLog.debug(`dependency installation failed`,{ms:d}),o.stop();let t=S.length>0?S:C;for(let n of t)e.error(n);if(t.length===0){let t=packageManagerInstallFailureMessage(w);t!==void 0&&e.error(t)}throw Error(`Failed to install dependencies in "${s}".`)}initLog.debug(`dependencies installed`,{ms:d}),i?.(`initialize_git`),o.update(`Initializing Git repository`),initLog.debug(`initializing git repository`),f=await r.tryInitializeGit(s)}finally{o.stop()}i?.(`handoff`),e.log(`${pc.green(`✓`)} Created an ${EVE_WORDMARK} extension in ${pc.bold(s)} ${pc.dim(`in ${formatElapsed(u)}`)}`);for(let t of l)e.log(pc.yellow(`⚠ ${formatWorkspaceRootMutationWarning(t)}`));e.log(`${pc.green(`✓`)} Installed dependencies ${pc.dim(`in ${formatElapsed(d)}`)}`),f.kind===`failed`?e.error(pc.yellow(`Git initialization failed: ${f.reason}`)):f.kind===`initialized`&&e.log(`${pc.green(`✓`)} Initialized Git repository`),e.log(initExtensionHandoff({packageManager:c,packageName:basename(s),projectPath:s}))}export{EVE_INIT_PACKAGE_SPEC_ENV,runExtensionInitCommand};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { isCodingAgentLaunch } from "#cli/agent-detection.js";
|
|
2
|
+
import type { EveCliSetupStep, EveCliSetupTerminalResult } from "#cli/telemetry/index.js";
|
|
2
3
|
import { detectInvokingPackageManager, detectPackageManager } from "#setup/package-manager.js";
|
|
3
4
|
import { runPackageManagerInstall, spawnPackageManager } from "#setup/primitives/index.js";
|
|
4
5
|
import { addAgentToProject } from "#setup/scaffold/create/add-to-project.js";
|
|
@@ -26,16 +27,4 @@ export interface InitCommandDependencies {
|
|
|
26
27
|
validateModelSlug: typeof validateModelSlug;
|
|
27
28
|
}
|
|
28
29
|
export declare const EVE_INIT_PACKAGE_SPEC_ENV = "EVE_INIT_PACKAGE_SPEC";
|
|
29
|
-
|
|
30
|
-
* Creates a new eve agent (`target` is a project name), or adds one to an
|
|
31
|
-
* existing project (`target` is a directory), without external provisioning.
|
|
32
|
-
* A fresh in-place scaffold asks whether to use the current directory or a new
|
|
33
|
-
* subdirectory when the current directory is not empty. Coding-agent launches
|
|
34
|
-
* must pass an explicit subdirectory instead.
|
|
35
|
-
*
|
|
36
|
-
* Runs launched by a coding agent get the dev command printed instead of
|
|
37
|
-
* spawned after scaffolding, since the dev TUI would wedge the launching agent.
|
|
38
|
-
*
|
|
39
|
-
* For extension packages, use `eve extension init` instead.
|
|
40
|
-
*/
|
|
41
|
-
export declare function runInitCommand(logger: InitCliLogger, parentDirectory: string, target: string | undefined, options: InitCommandOptions, dependencies?: InitCommandDependencies): Promise<void>;
|
|
30
|
+
export declare function runInitCommand(logger: InitCliLogger, parentDirectory: string, target: string | undefined, options: InitCommandOptions, dependencies?: InitCommandDependencies, trackStep?: (step: EveCliSetupStep) => void, trackTerminal?: (step: EveCliSetupStep, result: EveCliSetupTerminalResult) => void): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{initAgentDevHandoff,initAgentReadySummary,initAgentReplPrompt}from"./agent-instructions.js";import{tryInitializeGit}from"./init-git.js";import{addAgentsToWorkspace,convertScaffoldToAgentWorkspace}from"./init-agent-workspace.js";import{confirmInitInNonEmptyDirectory}from"./init-confirm.js";import{cleanupFreshInitTarget,workspaceFailureNote}from"./init-recovery.js";import{selectInitHandoff,spawnCodingAgentRepl}from"./init-repl.js";import{resolveInitTarget}from"./init-target.js";import{mkdtemp,readdir,rename,rm}from"node:fs/promises";import{createLogger,isLogLevelEnabled}from"#internal/logging.js";import{basename,join,relative,resolve}from"node:path";import pc from"#compiled/picocolors/index.js";import{DEFAULT_AGENT_MODEL_ID}from"#shared/default-agent-model.js";import{ensureChannel,scaffoldBaseProject}from"#setup/scaffold/index.js";import{eveDevArguments,packageManagerInstallFailureMessage,packageManagerInstallSucceeded,resultSucceeded,runPackageManagerInstall,spawnPackageManager}from"#setup/primitives/index.js";import{performance}from"node:perf_hooks";import{isCodingAgentLaunch}from"#cli/agent-detection.js";import{EVE_WORDMARK}from"#cli/banner.js";import{formatElapsed}from"#cli/format-elapsed.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{formatNodeEngineOverrideWarning}from"#setup/node-engine.js";import{detectInvokingPackageManager,detectPackageManager}from"#setup/package-manager.js";import{pathExists}from"#setup/path-exists.js";import{DEFAULT_EVE_PACKAGE_CONTRACT}from"#setup/scaffold/create/project.js";import{validateModelSlug}from"#setup/flows/model-source-change.js";import{addAgentToProject}from"#setup/scaffold/create/add-to-project.js";import{WizardCancelledError}from"#setup/step.js";import{isPackageManagerWorkspaceMember}from"#setup/scaffold/workspace-root.js";const defaultDependencies={addAgentToProject,confirmInitInNonEmptyDirectory,detectInvokingPackageManager,detectPackageManager,ensureChannel,isCodingAgentLaunch,now:()=>performance.now(),runPackageManagerInstall,scaffoldBaseProject,selectInitHandoff,spawnCodingAgentRepl,spawnPackageManager,tryInitializeGit,validateModelSlug},EVE_INIT_PACKAGE_SPEC_ENV=`EVE_INIT_PACKAGE_SPEC`,initLog=createLogger(`init`);async function moveDirectoryContents(e,t){for(let n of await readdir(e))await rename(join(e,n),join(t,n))}function uniqueWorkspaceRootMutations(e){let t=new Map;for(let n of e){let e=`${n.kind}:${n.path}`,r=t.get(e);t.set(e,{...n,nodeEngineOverride:n.nodeEngineOverride??r?.nodeEngineOverride})}return[...t.values()]}function formatWorkspaceRootMutationWarning(e){let t=e.kind===`package-json`?`package.json`:`configuration`,n=e.nodeEngineOverride===void 0?``:` (${formatNodeEngineOverrideWarning(e.nodeEngineOverride)})`;return`Updated workspace root ${t} at ${e.path}${n}`}async function addToExistingProject(e,t,n,r){if(t.channelWebNextjs===!0)throw Error("`--channel-web-nextjs` is not supported when adding an agent to an existing project. Run `eve add channel/web` from the project afterwards instead.");if(t.model!==void 0){let r=await n.validateModelSlug(e,t.model);if(r!==null)throw Error(r)}let i=await n.detectPackageManager(e),a=await n.addAgentToProject({projectRoot:e,model:t.model??DEFAULT_AGENT_MODEL_ID,reasoning:t.reasoning,packageManager:i.kind,evePackage:r});return{configurationFilesChanged:a.configurationFilesChanged,dependenciesAdded:a.dependenciesAdded,filesWritten:a.filesWritten,packageManager:i.kind,nodeEngineOverride:a.nodeEngineOverride}}async function resolveScaffoldPackageManager(e,t){let n=await t.detectPackageManager(e);return n.source==="default"?t.detectInvokingPackageManager()??`pnpm`:n.kind}async function scaffoldProject(e,t,n,r,i,a,o,s){let c=resolve(e,`..`),l=!n&&await pathExists(e)&&(await readdir(e)).length===0;if(!n&&await pathExists(e)&&!l)throw Error(`Cannot create project because "${e}" already exists.`);let u=n&&s?void 0:await mkdtemp(join(c,`.eve-init-`)),d=[];try{let c=u??e;if(i.model!==void 0){let e=await a.validateModelSlug(c,i.model);if(e!==null)throw Error(e)}let f={projectName:u===void 0?`.`:n?basename(e):t,model:i.model??DEFAULT_AGENT_MODEL_ID,reasoning:i.reasoning,evePackage:o,targetDirectory:c,overwriteExisting:s,workspaceProbeDirectory:e,packageManager:r,onWorkspaceRootMutation:e=>{d.push(e)}},p=await a.scaffoldBaseProject(f);return i.agents!==void 0&&await convertScaffoldToAgentWorkspace(p,i.agents,i),i.channelWebNextjs===!0&&await a.ensureChannel({projectRoot:p,kind:`web`,packageManager:r,force:s,workspaceProbeDirectory:e,configureVercelServices:!1,onWorkspaceRootMutation:e=>{d.push(e)}}),u!==void 0&&(n||l?await moveDirectoryContents(p,e):await rename(p,e)),{projectPath:e,workspaceRootMutations:uniqueWorkspaceRootMutations(d)}}finally{u!==void 0&&await rm(u,{recursive:!0,force:!0})}}function installProgressDetail(e,t){let n=t.text.trim();if(n===``||e!==`npm`)return n||void 0;let r=/^npm silly fetch manifest (.+)$/u.exec(n);if(r!==null)return`Resolving ${r[1]}`;let i=/^npm http fetch \S+ \S+ attempt (\d+) failed with (\S+)$/u.exec(n);if(i!==null)return`npm registry · attempt ${i[1]} failed: ${i[2]}`;if(t.stream===`stdout`||/^npm (?:error|warn)\b/u.test(n))return n}const NPM_NOISE_LINE=/^\s*npm (?:silly|verbose|http|timing)\b/u;function reportExistingProjectChanges(e,t){e.log(`Updated existing project:`);for(let n of t.filesWritten)e.log(` Created ${relative(t.projectPath,n).replaceAll(`\\`,`/`)}`);t.dependenciesAdded.length>0&&e.log(` Added dependencies: ${t.dependenciesAdded.join(`, `)}`);for(let n of t.configurationFilesChanged)e.log(` Updated ${n}`);t.nodeEngineOverride!==void 0&&e.log(pc.yellow(` ⚠ ${formatNodeEngineOverrideWarning(t.nodeEngineOverride)}`))}async function runInitSteps(e){let{dependencies:t,logger:n,options:r,parentDirectory:i,target:a}=e,o=isLogLevelEnabled(`debug`),s=await t.isCodingAgentLaunch(),c=await resolveInitTarget({parentDirectory:i,target:a}),l=resolveInitEvePackageOverride(),u=startCliLiveRow(n);u.update(`Preparing project`);try{let e=c.kind===`fresh`?`creating agent`:`adding agent`;u.update(c.kind===`fresh`?`Creating agent`:`Adding agent`),initLog.debug(e);let i=t.now(),a;if(c.kind===`fresh`){let e=await resolveScaffoldPackageManager(c.projectPath,t),n=isPackageManagerWorkspaceMember(e,c.projectPath),i;try{i=await scaffoldProject(c.projectPath,c.projectName,c.createInPlace,e,r,t,l,c.overwriteExisting)}catch(e){if(c.failurePolicy===`clear`){let t=await cleanupFreshInitTarget(c.projectPath,c.failurePolicy,c.preservedEntries),r=e instanceof Error?e.message:String(e),i=t?`eve restored "${c.projectPath}" to its original state.`:`eve could not completely clean "${c.projectPath}".`;throw Error(`${r}\n\n${i}${workspaceFailureNote(n)}`)}if(c.failurePolicy===`remove`&&n){let t=e instanceof Error?e.message:String(e);throw Error(`${t}${workspaceFailureNote(!0)}`)}throw e}a={failurePolicy:c.failurePolicy,kind:`created`,packageManager:e,preservedTargetEntries:c.preservedEntries,projectPath:i.projectPath,retryCommand:`eve init ${c.projectPath}`,workspaceMember:n,workspaceRootMutations:i.workspaceRootMutations}}else{let e=await addToExistingProject(c.projectPath,r,t,l);a=e.nodeEngineOverride===void 0?{configurationFilesChanged:e.configurationFilesChanged,dependenciesAdded:e.dependenciesAdded,failurePolicy:`preserve`,filesWritten:e.filesWritten,kind:`added`,packageManager:e.packageManager,projectPath:c.projectPath}:{configurationFilesChanged:e.configurationFilesChanged,dependenciesAdded:e.dependenciesAdded,failurePolicy:`preserve`,filesWritten:e.filesWritten,kind:`added`,nodeEngineOverride:e.nodeEngineOverride,packageManager:e.packageManager,projectPath:c.projectPath}}let d=t.now()-i;initLog.debug(`${e} done`,{ms:d}),a.kind===`added`&&(u.stop(),reportExistingProjectChanges(n,a),u=startCliLiveRow(n)),u.update(`Installing dependencies`,`${a.packageManager} install`),initLog.debug(`installing dependencies with ${a.packageManager}`);let f=t.now(),p=[],m=[],h=await t.runPackageManagerInstall(a.packageManager,a.projectPath,{progressDetails:process.stdout.isTTY===!0&&!o,onOutput:e=>{e.text.trim()!==``&&(m.push(e.text),m.length>20&&m.shift(),NPM_NOISE_LINE.test(e.text)||p.push(e.text)),o&&initLog.debug(e.text);let t=installProgressDetail(a.packageManager,e);t!==void 0&&u.update(`Installing dependencies`,t)}}),g=t.now()-f;if(!packageManagerInstallSucceeded(h)){initLog.debug(`dependency installation failed`,{ms:g}),u.stop();let e=p.length>0?p:m;for(let t of e)n.error(t);if(e.length===0){let e=packageManagerInstallFailureMessage(h);e!==void 0&&n.error(e)}if(a.failurePolicy!==`preserve`){if(await cleanupFreshInitTarget(a.projectPath,a.failurePolicy,a.preservedTargetEntries)){let e=a.failurePolicy===`remove`?`eve removed the incomplete project at "${a.projectPath}".`:`eve restored "${a.projectPath}" to its original state.`,t=a.workspaceMember||a.workspaceRootMutations.length>0;throw Error(`Failed to install dependencies.\n\n${e}\n\nResolve the package-manager error above, then retry:\n ${a.retryCommand}${workspaceFailureNote(t)}`)}let e=a.workspaceMember||a.workspaceRootMutations.length>0;throw Error(`Failed to install dependencies, and eve could not completely clean "${a.projectPath}".\n\nResolve the package-manager error above, then install dependencies with ${a.packageManager} in that directory. Or clean the target manually before rerunning eve init.${workspaceFailureNote(e)}`)}throw Error(`The eve agent was added, but dependency installation failed.\n\nResolve the package-manager error above, then install dependencies with ${a.packageManager} in "${a.projectPath}".\n\nDo not rerun eve init; the agent is already configured.`)}return initLog.debug(`dependencies installed`,{ms:g}),a.kind===`created`?(u.update(`Initializing Git repository`),initLog.debug(`initializing git repository`),{...a,agentElapsedMs:d,agentLaunched:s,gitResult:await t.tryInitializeGit(a.projectPath),installElapsedMs:g}):{...a,agentElapsedMs:d,agentLaunched:s,installElapsedMs:g}}finally{u.stop()}}async function runInitCommand(e,t,n,r,i=defaultDependencies){if(await addAgentsToWorkspace(e,t,n,r,i.validateModelSlug))return;let a;try{a=await runInitSteps({dependencies:i,logger:e,options:r,parentDirectory:t,target:n})}catch(e){if(e instanceof WizardCancelledError)return;throw e}if(a.kind===`created`){e.log(`${pc.green(`✓`)} Created an ${EVE_WORDMARK} agent in ${pc.bold(a.projectPath)} ${pc.dim(`in ${formatElapsed(a.agentElapsedMs)}`)}`);for(let t of a.workspaceRootMutations)e.log(pc.yellow(`⚠ ${formatWorkspaceRootMutationWarning(t)}`))}else e.log(`${pc.green(`✓`)} Added an ${EVE_WORDMARK} agent to ${pc.bold(a.projectPath)} ${pc.dim(`in ${formatElapsed(a.agentElapsedMs)}`)}`);e.log(`${pc.green(`✓`)} Installed dependencies ${pc.dim(`in ${formatElapsed(a.installElapsedMs)}`)}`),a.kind===`created`&&a.gitResult.kind===`failed`&&(e.error(pc.yellow(`Git initialization failed during ${a.gitResult.stage}: ${a.gitResult.reason}`)),a.gitResult.stage===`commit`&&e.error(pc.yellow(`The eve agent was created successfully. Git repository metadata and staged files were preserved at "${a.projectPath}"; the initial commit is optional.\n\nTo create it later, configure Git identity and run:\n git -C ${JSON.stringify(a.projectPath)} commit -m "Initial commit from eve"`)));let o=eveDevArguments(a.packageManager),s=[a.packageManager,...o].join(` `),c=initAgentDevHandoff({projectPath:a.projectPath,devCommand:s});if(a.agentLaunched){e.log(initAgentReadySummary(r.model,a.projectPath,{workspace:r.agents!==void 0})),e.log(c);return}let l;try{l=await i.selectInitHandoff({agentName:basename(a.projectPath)})}catch(e){if(e instanceof WizardCancelledError)return;throw e}if(l===`exit`)return;if(l!==`eve-dev`){if(e.log(pc.dim(`$ ${l}`)),!await i.spawnCodingAgentRepl({command:l,cwd:a.projectPath,prompt:initAgentReplPrompt({devCommand:s}),onPromptUnseeded:t=>{e.log(pc.yellow(`Could not seed ${l} automatically. Paste this prompt into it:`)),e.log(t)}}))throw Error(`Coding-agent REPL exited unsuccessfully in "${a.projectPath}".`);return}let u=a.kind===`created`?[...o,`--onboard`]:o;if(e.log(pc.dim(`$ eve dev`)),!resultSucceeded(await i.spawnPackageManager(a.packageManager,a.projectPath,u)))throw Error(`Development server exited unsuccessfully in "${a.projectPath}".`)}function resolveInitEvePackageOverride(){let e=process.env[EVE_INIT_PACKAGE_SPEC_ENV]?.trim();if(e!==void 0&&e.length!==0)return{nodeEngine:DEFAULT_EVE_PACKAGE_CONTRACT.nodeEngine,version:e}}export{EVE_INIT_PACKAGE_SPEC_ENV,runInitCommand};
|
|
1
|
+
import{initAgentDevHandoff,initAgentReadySummary,initAgentReplPrompt}from"./agent-instructions.js";import{tryInitializeGit}from"./init-git.js";import{addAgentsToWorkspace,convertScaffoldToAgentWorkspace}from"./init-agent-workspace.js";import{confirmInitInNonEmptyDirectory}from"./init-confirm.js";import{cleanupFreshInitTarget,workspaceFailureNote}from"./init-recovery.js";import{selectInitHandoff,spawnCodingAgentRepl}from"./init-repl.js";import{resolveInitTarget}from"./init-target.js";import{mkdtemp,readdir,rename,rm}from"node:fs/promises";import{createLogger,isLogLevelEnabled}from"#internal/logging.js";import{basename,join,relative,resolve}from"node:path";import pc from"#compiled/picocolors/index.js";import{DEFAULT_AGENT_MODEL_ID}from"#shared/default-agent-model.js";import{ensureChannel,scaffoldBaseProject}from"#setup/scaffold/index.js";import{eveDevArguments,packageManagerInstallFailureMessage,packageManagerInstallSucceeded,resultSucceeded,runPackageManagerInstall,spawnPackageManager}from"#setup/primitives/index.js";import{performance}from"node:perf_hooks";import{isCodingAgentLaunch}from"#cli/agent-detection.js";import{EVE_WORDMARK}from"#cli/banner.js";import{formatElapsed}from"#cli/format-elapsed.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{formatNodeEngineOverrideWarning}from"#setup/node-engine.js";import{detectInvokingPackageManager,detectPackageManager}from"#setup/package-manager.js";import{pathExists}from"#setup/path-exists.js";import{DEFAULT_EVE_PACKAGE_CONTRACT}from"#setup/scaffold/create/project.js";import{validateModelSlug}from"#setup/flows/model-source-change.js";import{addAgentToProject}from"#setup/scaffold/create/add-to-project.js";import{WizardCancelledError}from"#setup/step.js";import{isPackageManagerWorkspaceMember}from"#setup/scaffold/workspace-root.js";const defaultDependencies={addAgentToProject,confirmInitInNonEmptyDirectory,detectInvokingPackageManager,detectPackageManager,ensureChannel,isCodingAgentLaunch,now:()=>performance.now(),runPackageManagerInstall,scaffoldBaseProject,selectInitHandoff,spawnCodingAgentRepl,spawnPackageManager,tryInitializeGit,validateModelSlug},EVE_INIT_PACKAGE_SPEC_ENV=`EVE_INIT_PACKAGE_SPEC`,initLog=createLogger(`init`);async function moveDirectoryContents(e,t){for(let n of await readdir(e))await rename(join(e,n),join(t,n))}function uniqueWorkspaceRootMutations(e){let t=new Map;for(let n of e){let e=`${n.kind}:${n.path}`,r=t.get(e);t.set(e,{...n,nodeEngineOverride:n.nodeEngineOverride??r?.nodeEngineOverride})}return[...t.values()]}function formatWorkspaceRootMutationWarning(e){let t=e.kind===`package-json`?`package.json`:`configuration`,n=e.nodeEngineOverride===void 0?``:` (${formatNodeEngineOverrideWarning(e.nodeEngineOverride)})`;return`Updated workspace root ${t} at ${e.path}${n}`}async function addToExistingProject(e,t,n,r){if(t.channelWebNextjs===!0)throw Error("`--channel-web-nextjs` is not supported when adding an agent to an existing project. Run `eve add channel/web` from the project afterwards instead.");if(t.model!==void 0){let r=await n.validateModelSlug(e,t.model);if(r!==null)throw Error(r)}let i=await n.detectPackageManager(e),a=await n.addAgentToProject({projectRoot:e,model:t.model??DEFAULT_AGENT_MODEL_ID,reasoning:t.reasoning,packageManager:i.kind,evePackage:r});return{configurationFilesChanged:a.configurationFilesChanged,dependenciesAdded:a.dependenciesAdded,filesWritten:a.filesWritten,packageManager:i.kind,nodeEngineOverride:a.nodeEngineOverride}}async function resolveScaffoldPackageManager(e,t){let n=await t.detectPackageManager(e);return n.source==="default"?t.detectInvokingPackageManager()??`pnpm`:n.kind}async function scaffoldProject(e,t,n,r,i,a,o,s){let c=resolve(e,`..`),l=!n&&await pathExists(e)&&(await readdir(e)).length===0;if(!n&&await pathExists(e)&&!l)throw Error(`Cannot create project because "${e}" already exists.`);let u=n&&s?void 0:await mkdtemp(join(c,`.eve-init-`)),d=[];try{let c=u??e;if(i.model!==void 0){let e=await a.validateModelSlug(c,i.model);if(e!==null)throw Error(e)}let f={projectName:u===void 0?`.`:n?basename(e):t,model:i.model??DEFAULT_AGENT_MODEL_ID,reasoning:i.reasoning,evePackage:o,targetDirectory:c,overwriteExisting:s,workspaceProbeDirectory:e,packageManager:r,onWorkspaceRootMutation:e=>{d.push(e)}},p=await a.scaffoldBaseProject(f);return i.agents!==void 0&&await convertScaffoldToAgentWorkspace(p,i.agents,i),i.channelWebNextjs===!0&&await a.ensureChannel({projectRoot:p,kind:`web`,packageManager:r,force:s,workspaceProbeDirectory:e,configureVercelServices:!1,onWorkspaceRootMutation:e=>{d.push(e)}}),u!==void 0&&(n||l?await moveDirectoryContents(p,e):await rename(p,e)),{projectPath:e,workspaceRootMutations:uniqueWorkspaceRootMutations(d)}}finally{u!==void 0&&await rm(u,{recursive:!0,force:!0})}}function installProgressDetail(e,t){let n=t.text.trim();if(n===``||e!==`npm`)return n||void 0;let r=/^npm silly fetch manifest (.+)$/u.exec(n);if(r!==null)return`Resolving ${r[1]}`;let i=/^npm http fetch \S+ \S+ attempt (\d+) failed with (\S+)$/u.exec(n);if(i!==null)return`npm registry · attempt ${i[1]} failed: ${i[2]}`;if(t.stream===`stdout`||/^npm (?:error|warn)\b/u.test(n))return n}const NPM_NOISE_LINE=/^\s*npm (?:silly|verbose|http|timing)\b/u;function reportExistingProjectChanges(e,t){e.log(`Updated existing project:`);for(let n of t.filesWritten)e.log(` Created ${relative(t.projectPath,n).replaceAll(`\\`,`/`)}`);t.dependenciesAdded.length>0&&e.log(` Added dependencies: ${t.dependenciesAdded.join(`, `)}`);for(let n of t.configurationFilesChanged)e.log(` Updated ${n}`);t.nodeEngineOverride!==void 0&&e.log(pc.yellow(` ⚠ ${formatNodeEngineOverrideWarning(t.nodeEngineOverride)}`))}async function runInitSteps(e){let{dependencies:t,logger:n,options:r,parentDirectory:i,target:a,trackStep:o}=e,s=isLogLevelEnabled(`debug`),c=await t.isCodingAgentLaunch(),l=await resolveInitTarget({parentDirectory:i,target:a}),u=resolveInitEvePackageOverride(),d=startCliLiveRow(n);d.update(`Preparing project`);try{let e=l.kind===`fresh`?`creating agent`:`adding agent`;o?.(`scaffold`),d.update(l.kind===`fresh`?`Creating agent`:`Adding agent`),initLog.debug(e);let i=t.now(),a;if(l.kind===`fresh`){let e=await resolveScaffoldPackageManager(l.projectPath,t),n=isPackageManagerWorkspaceMember(e,l.projectPath),i;try{i=await scaffoldProject(l.projectPath,l.projectName,l.createInPlace,e,r,t,u,l.overwriteExisting)}catch(e){if(l.failurePolicy===`clear`){let t=await cleanupFreshInitTarget(l.projectPath,l.failurePolicy,l.preservedEntries),r=e instanceof Error?e.message:String(e),i=t?`eve restored "${l.projectPath}" to its original state.`:`eve could not completely clean "${l.projectPath}".`;throw Error(`${r}\n\n${i}${workspaceFailureNote(n)}`)}if(l.failurePolicy===`remove`&&n){let t=e instanceof Error?e.message:String(e);throw Error(`${t}${workspaceFailureNote(!0)}`)}throw e}a={failurePolicy:l.failurePolicy,kind:`created`,packageManager:e,preservedTargetEntries:l.preservedEntries,projectPath:i.projectPath,retryCommand:`eve init ${l.projectPath}`,workspaceMember:n,workspaceRootMutations:i.workspaceRootMutations}}else{let e=await addToExistingProject(l.projectPath,r,t,u);a=e.nodeEngineOverride===void 0?{configurationFilesChanged:e.configurationFilesChanged,dependenciesAdded:e.dependenciesAdded,failurePolicy:`preserve`,filesWritten:e.filesWritten,kind:`added`,packageManager:e.packageManager,projectPath:l.projectPath}:{configurationFilesChanged:e.configurationFilesChanged,dependenciesAdded:e.dependenciesAdded,failurePolicy:`preserve`,filesWritten:e.filesWritten,kind:`added`,nodeEngineOverride:e.nodeEngineOverride,packageManager:e.packageManager,projectPath:l.projectPath}}let f=t.now()-i;initLog.debug(`${e} done`,{ms:f}),a.kind===`added`&&(d.stop(),reportExistingProjectChanges(n,a),d=startCliLiveRow(n)),o?.(`install_dependencies`),d.update(`Installing dependencies`,`${a.packageManager} install`),initLog.debug(`installing dependencies with ${a.packageManager}`);let p=t.now(),m=[],h=[],g=await t.runPackageManagerInstall(a.packageManager,a.projectPath,{progressDetails:process.stdout.isTTY===!0&&!s,onOutput:e=>{e.text.trim()!==``&&(h.push(e.text),h.length>20&&h.shift(),NPM_NOISE_LINE.test(e.text)||m.push(e.text)),s&&initLog.debug(e.text);let t=installProgressDetail(a.packageManager,e);t!==void 0&&d.update(`Installing dependencies`,t)}}),_=t.now()-p;if(!packageManagerInstallSucceeded(g)){initLog.debug(`dependency installation failed`,{ms:_}),d.stop();let e=m.length>0?m:h;for(let t of e)n.error(t);if(e.length===0){let e=packageManagerInstallFailureMessage(g);e!==void 0&&n.error(e)}if(a.failurePolicy!==`preserve`){if(await cleanupFreshInitTarget(a.projectPath,a.failurePolicy,a.preservedTargetEntries)){let e=a.failurePolicy===`remove`?`eve removed the incomplete project at "${a.projectPath}".`:`eve restored "${a.projectPath}" to its original state.`,t=a.workspaceMember||a.workspaceRootMutations.length>0;throw Error(`Failed to install dependencies.\n\n${e}\n\nResolve the package-manager error above, then retry:\n ${a.retryCommand}${workspaceFailureNote(t)}`)}let e=a.workspaceMember||a.workspaceRootMutations.length>0;throw Error(`Failed to install dependencies, and eve could not completely clean "${a.projectPath}".\n\nResolve the package-manager error above, then install dependencies with ${a.packageManager} in that directory. Or clean the target manually before rerunning eve init.${workspaceFailureNote(e)}`)}throw Error(`The eve agent was added, but dependency installation failed.\n\nResolve the package-manager error above, then install dependencies with ${a.packageManager} in "${a.projectPath}".\n\nDo not rerun eve init; the agent is already configured.`)}return initLog.debug(`dependencies installed`,{ms:_}),a.kind===`created`?(o?.(`initialize_git`),d.update(`Initializing Git repository`),initLog.debug(`initializing git repository`),{...a,agentElapsedMs:f,agentLaunched:c,gitResult:await t.tryInitializeGit(a.projectPath),installElapsedMs:_}):{...a,agentElapsedMs:f,agentLaunched:c,installElapsedMs:_}}finally{d.stop()}}async function runInitCommand(e,t,n,r,i=defaultDependencies,a,o){if(a?.(`resolve_target`),await addAgentsToWorkspace(e,t,n,r,i.validateModelSlug)){a?.(`handoff`),o?.(`handoff`,`completed`);return}let s;try{s=await runInitSteps({dependencies:i,logger:e,options:r,parentDirectory:t,target:n,trackStep:a})}catch(e){if(e instanceof WizardCancelledError){o?.(`resolve_target`,`cancelled`);return}throw e}if(a?.(`handoff`),s.kind===`created`){e.log(`${pc.green(`✓`)} Created an ${EVE_WORDMARK} agent in ${pc.bold(s.projectPath)} ${pc.dim(`in ${formatElapsed(s.agentElapsedMs)}`)}`);for(let t of s.workspaceRootMutations)e.log(pc.yellow(`⚠ ${formatWorkspaceRootMutationWarning(t)}`))}else e.log(`${pc.green(`✓`)} Added an ${EVE_WORDMARK} agent to ${pc.bold(s.projectPath)} ${pc.dim(`in ${formatElapsed(s.agentElapsedMs)}`)}`);e.log(`${pc.green(`✓`)} Installed dependencies ${pc.dim(`in ${formatElapsed(s.installElapsedMs)}`)}`),s.kind===`created`&&s.gitResult.kind===`failed`&&(e.error(pc.yellow(`Git initialization failed during ${s.gitResult.stage}: ${s.gitResult.reason}`)),s.gitResult.stage===`commit`&&e.error(pc.yellow(`The eve agent was created successfully. Git repository metadata and staged files were preserved at "${s.projectPath}"; the initial commit is optional.\n\nTo create it later, configure Git identity and run:\n git -C ${JSON.stringify(s.projectPath)} commit -m "Initial commit from eve"`)));let c=eveDevArguments(s.packageManager),l=[s.packageManager,...c].join(` `),u=initAgentDevHandoff({projectPath:s.projectPath,devCommand:l});if(s.agentLaunched){e.log(initAgentReadySummary(r.model,s.projectPath,{workspace:r.agents!==void 0})),e.log(u);return}let d;try{d=await i.selectInitHandoff({agentName:basename(s.projectPath)})}catch(e){if(e instanceof WizardCancelledError)return;throw e}if(d===`exit`)return;if(d!==`eve-dev`){if(e.log(pc.dim(`$ ${d}`)),!await i.spawnCodingAgentRepl({command:d,cwd:s.projectPath,prompt:initAgentReplPrompt({devCommand:l}),onPromptUnseeded:t=>{e.log(pc.yellow(`Could not seed ${d} automatically. Paste this prompt into it:`)),e.log(t)}}))throw Error(`Coding-agent REPL exited unsuccessfully in "${s.projectPath}".`);return}let f=s.kind===`created`?[...c,`--onboard`]:c;if(e.log(pc.dim(`$ eve dev`)),!resultSucceeded(await i.spawnPackageManager(s.packageManager,s.projectPath,f)))throw Error(`Development server exited unsuccessfully in "${s.projectPath}".`)}function resolveInitEvePackageOverride(){let e=process.env[EVE_INIT_PACKAGE_SPEC_ENV]?.trim();if(e!==void 0&&e.length!==0)return{nodeEngine:DEFAULT_EVE_PACKAGE_CONTRACT.nodeEngine,version:e}}export{EVE_INIT_PACKAGE_SPEC_ENV,runInitCommand};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type DevBootProgressReporter } from "#internal/dev-boot-progress.js";
|
|
2
|
+
import type { EveCliSetupStepEvent, EveCliSetupTerminalEvent } from "#cli/telemetry/index.js";
|
|
2
3
|
import type { DevelopmentCliOptions } from "./command-options.js";
|
|
3
4
|
import type { DevelopmentTuiStartup, RunDevelopmentTuiInput } from "./tui/tui.js";
|
|
4
5
|
import type { DevelopmentUrlTarget } from "./url-target.js";
|
|
@@ -11,6 +12,8 @@ export declare function runInteractiveDevelopmentUi(input: {
|
|
|
11
12
|
readonly remoteTarget?: DevelopmentUrlTarget;
|
|
12
13
|
readonly report?: DevBootProgressReporter;
|
|
13
14
|
readonly runDevelopmentTui?: (input: RunDevelopmentTuiInput) => Promise<void>;
|
|
15
|
+
readonly onOnboardingStep?: (input: EveCliSetupStepEvent) => void;
|
|
16
|
+
readonly onOnboardingTerminal?: (input: EveCliSetupTerminalEvent) => void;
|
|
14
17
|
readonly server: {
|
|
15
18
|
readonly appRoot?: string;
|
|
16
19
|
readonly serverUrl: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{resolveTuiDisplayOptions}from"./ui-options.js";import{resolveTuiTitle}from"./tui/target.js";import{randomUUID}from"node:crypto";import{findEveProjectContext}from"#internal/project-context.js";import{devBootPhase}from"#internal/dev-boot-progress.js";import{resumeDevelopmentRuntimeArtifacts,suspendDevelopmentRuntimeArtifacts}from"#services/dev-client/runtime-artifacts.js";async function runInteractiveDevelopmentUi(e){let t=await devBootPhase(`loading interactive UI`,async()=>e.runDevelopmentTui??(await import(`#cli/dev/tui/tui.js`)).runDevelopmentTui,e.report),n=e.server.appRoot??e.applicationRoot,r=await findEveProjectContext(n),i=r?.environmentRoot??n,a=r?.kind===`workspace-member`?r.member.appRoot:void 0,o=e.remoteTarget===void 0||e.existingLocalServer?{kind:`local`,serverUrl:e.server.serverUrl,workspaceRoot:i,agentRoot:a}:{kind:`remote`,serverUrl:e.server.serverUrl,workspaceRoot:i,agentRoot:a},s=resolveTuiDisplayOptions(e.options),c=resolveTuiTitle({name:e.options.name,target:o});c!==void 0&&(s.name=c);let l={target:o,initialInput:e.options.input,onboard:e.options.onboard,onBootProgress:e.report,lifecycle:e.lifecycle,...s};e.startup!==void 0&&(l.startup=e.startup),o.kind===`local`&&(l.withExclusiveTerminal=async t=>{let n=randomUUID();if(!await suspendDevelopmentRuntimeArtifacts({leaseId:n,serverUrl:e.server.serverUrl}))throw Error(`Could not pause the development server for integration setup.`);let r;try{r={ok:!0,value:await t()}}catch(e){r={error:e,ok:!1}}let i={leaseId:n,serverUrl:e.server.serverUrl,silent:!0};if(await resumeDevelopmentRuntimeArtifacts(i)===void 0&&await resumeDevelopmentRuntimeArtifacts(i)===void 0)throw Error(`Could not resume the eve development server after integration setup. Restart eve dev before making further source changes.`,r.ok?void 0:{cause:r.error});if(!r.ok)throw r.error;return r.value}),e.remoteTarget?.headers===void 0?await t(l):await t({...l,headers:e.remoteTarget.headers})}export{runInteractiveDevelopmentUi};
|
|
1
|
+
import{resolveTuiDisplayOptions}from"./ui-options.js";import{resolveTuiTitle}from"./tui/target.js";import{randomUUID}from"node:crypto";import{findEveProjectContext}from"#internal/project-context.js";import{devBootPhase}from"#internal/dev-boot-progress.js";import{resumeDevelopmentRuntimeArtifacts,suspendDevelopmentRuntimeArtifacts}from"#services/dev-client/runtime-artifacts.js";async function runInteractiveDevelopmentUi(e){let t=await devBootPhase(`loading interactive UI`,async()=>e.runDevelopmentTui??(await import(`#cli/dev/tui/tui.js`)).runDevelopmentTui,e.report),n=e.server.appRoot??e.applicationRoot,r=await findEveProjectContext(n),i=r?.environmentRoot??n,a=r?.kind===`workspace-member`?r.member.appRoot:void 0,o=e.remoteTarget===void 0||e.existingLocalServer?{kind:`local`,serverUrl:e.server.serverUrl,workspaceRoot:i,agentRoot:a}:{kind:`remote`,serverUrl:e.server.serverUrl,workspaceRoot:i,agentRoot:a},s=resolveTuiDisplayOptions(e.options),c=resolveTuiTitle({name:e.options.name,target:o});c!==void 0&&(s.name=c);let l={target:o,initialInput:e.options.input,onboard:e.options.onboard,onBootProgress:e.report,onOnboardingStep:e.onOnboardingStep,onOnboardingTerminal:e.onOnboardingTerminal,lifecycle:e.lifecycle,...s};e.startup!==void 0&&(l.startup=e.startup),o.kind===`local`&&(l.withExclusiveTerminal=async t=>{let n=randomUUID();if(!await suspendDevelopmentRuntimeArtifacts({leaseId:n,serverUrl:e.server.serverUrl}))throw Error(`Could not pause the development server for integration setup.`);let r;try{r={ok:!0,value:await t()}}catch(e){r={error:e,ok:!1}}let i={leaseId:n,serverUrl:e.server.serverUrl,silent:!0};if(await resumeDevelopmentRuntimeArtifacts(i)===void 0&&await resumeDevelopmentRuntimeArtifacts(i)===void 0)throw Error(`Could not resume the eve development server after integration setup. Restart eve dev before making further source changes.`,r.ok?void 0:{cause:r.error});if(!r.ok)throw r.error;return r.value}),e.remoteTarget?.headers===void 0?await t(l):await t({...l,headers:e.remoteTarget.headers})}export{runInteractiveDevelopmentUi};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isPromptCommandAvailableFor}from"./prompt-commands.js";import{toErrorMessage}from"#shared/errors.js";function createPromptCommandHandler(e){return{async handle(t,n){let{target:r}=e;if(r.kind===`remote`&&!isPromptCommandAvailableFor(t.name,`remote`))return{message:`/${t.name} needs eve dev running the local server (it is not available with --url).`};if(t.name===`model`&&t.argument.length>0){if(r.kind!==`local`)return{message:`/model needs eve dev running the local server (it is not available with --url).`};let n=r.agentRoot??r.workspaceRoot;try{let{modelChangeRefusalForUneditableModel:r}=await import(`#setup/flows/model.js`),{changeAgentModel:i,formatApplyModelOutcome:a}=await import(`#setup/flows/model-source-change.js`),o=await(e.modelChangeRefusal??r)(n);return o===null?{message:a(await(e.applyModel??i)({appRoot:n,slug:t.argument}))}:{message:o}}catch(e){return{message:`Couldn't change the model: ${toErrorMessage(e)}`}}}let i=n.renderer.setupFlow;if(i===void 0)return{message:`/${t.name} is not supported by this renderer.`};if(t.name===`vc:login`&&r.kind===`remote`){if(n.remoteConnection===void 0)return{message:`/vc:login is not available in this session.`};let t;try{({runRemoteAuthCommand:t}=await import(`./remote-auth-command.js`))}catch(e){return{message:`/vc:login failed: ${toErrorMessage(e)}`}}return{message:await t({connection:n.remoteConnection,flow:e.remoteAuthFlow,renderer:i})}}let a;try{a=await import(`./setup-commands.js`)}catch(e){return{message:`/${t.name} failed: ${toErrorMessage(e)}`}}let{runTuiSetupCommand:o,SETUP_FLOW_CONFIG:s}=a,c=s[t.name];i.begin(n.setupFlowTitle??c.title,c.indicator),i.setNavigation?.(n.setupFlowNavigation);let l=!0;try{let a={command:t.name,appRoot:r.workspaceRoot,renderer:i,withExclusiveTerminal:n.withExclusiveTerminal,chatGptAccountLabel:n.chatGptAccountLabel};r.agentRoot!==void 0&&(a.agentRoot=r.agentRoot),n.initialModelStep!==void 0&&(a.initialModelStep=n.initialModelStep),n.registryPlannerContext!==void 0&&(a.registryPlannerContext=n.registryPlannerContext),t.name===`add`&&t.argument.length>0&&(a.initialRegistryAddress=t.argument),e.flows!==void 0&&(a.flows=e.flows);let s=await o(a);l=s.preserveFlowDiagnostics;let{preserveFlowDiagnostics:c,partial:u,...d}=s;return d}finally{n.keepSetupFlowOpen!==!0&&i.end({preserveDiagnostics:l})}}}}export{createPromptCommandHandler};
|
|
1
|
+
import{isPromptCommandAvailableFor}from"./prompt-commands.js";import{toErrorMessage}from"#shared/errors.js";function createPromptCommandHandler(e){return{async handle(t,n){let{target:r}=e;if(r.kind===`remote`&&!isPromptCommandAvailableFor(t.name,`remote`))return{message:`/${t.name} needs eve dev running the local server (it is not available with --url).`};if(t.name===`model`&&t.argument.length>0){if(r.kind!==`local`)return{message:`/model needs eve dev running the local server (it is not available with --url).`};let n=r.agentRoot??r.workspaceRoot;try{let{modelChangeRefusalForUneditableModel:r}=await import(`#setup/flows/model.js`),{changeAgentModel:i,formatApplyModelOutcome:a}=await import(`#setup/flows/model-source-change.js`),o=await(e.modelChangeRefusal??r)(n);return o===null?{message:a(await(e.applyModel??i)({appRoot:n,slug:t.argument}))}:{message:o}}catch(e){return{message:`Couldn't change the model: ${toErrorMessage(e)}`}}}let i=n.renderer.setupFlow;if(i===void 0)return{message:`/${t.name} is not supported by this renderer.`};if(t.name===`vc:login`&&r.kind===`remote`){if(n.remoteConnection===void 0)return{message:`/vc:login is not available in this session.`};let t;try{({runRemoteAuthCommand:t}=await import(`./remote-auth-command.js`))}catch(e){return{message:`/vc:login failed: ${toErrorMessage(e)}`}}return{message:await t({connection:n.remoteConnection,flow:e.remoteAuthFlow,renderer:i})}}let a;try{a=await import(`./setup-commands.js`)}catch(e){return{message:`/${t.name} failed: ${toErrorMessage(e)}`}}let{runTuiSetupCommand:o,SETUP_FLOW_CONFIG:s}=a,c=s[t.name];i.begin(n.setupFlowTitle??c.title,c.indicator),i.setNavigation?.(n.setupFlowNavigation);let l=!0;try{let a={command:t.name,appRoot:r.workspaceRoot,renderer:i,withExclusiveTerminal:n.withExclusiveTerminal,chatGptAccountLabel:n.chatGptAccountLabel};r.agentRoot!==void 0&&(a.agentRoot=r.agentRoot),n.initialModelStep!==void 0&&(a.initialModelStep=n.initialModelStep),n.registryPlannerContext!==void 0&&(a.registryPlannerContext=n.registryPlannerContext),n.onOnboardingScreen!==void 0&&(a.onOnboardingScreen=n.onOnboardingScreen),t.name===`add`&&t.argument.length>0&&(a.initialRegistryAddress=t.argument),e.flows!==void 0&&(a.flows=e.flows);let s=await o(a);l=s.preserveFlowDiagnostics;let{preserveFlowDiagnostics:c,partial:u,...d}=s;return d}finally{n.keepSetupFlowOpen!==!0&&i.end({preserveDiagnostics:l})}}}}export{createPromptCommandHandler};
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { type AgentInfoResult, type ConnectionAuthorizationOutcome, type InputRequest, Client, ClientSession } from "#client/index.js";
|
|
2
|
+
import type { EveCliSetupStepEvent, EveCliSetupTerminalEvent } from "#cli/telemetry/index.js";
|
|
3
|
+
import type { OnboardingScreenEvent } from "./setup-commands.js";
|
|
2
4
|
import { inspectApplication } from "#services/inspect-application.js";
|
|
3
5
|
import { type SubagentView } from "./subagent-pump.js";
|
|
4
6
|
export type { SubagentRun, SubagentStepUpdate, SubagentToolUpdate, SubagentView, } from "./subagent-pump.js";
|
|
@@ -292,6 +294,7 @@ export interface PromptCommandHandlerContext {
|
|
|
292
294
|
/** Provider entry authorized by confirmed boot-time model-access evidence. */
|
|
293
295
|
readonly initialModelStep?: "provider";
|
|
294
296
|
readonly registryPlannerContext?: RegistryPlannerContext;
|
|
297
|
+
readonly onOnboardingScreen?: (input: OnboardingScreenEvent) => void;
|
|
295
298
|
/** Overrides the standalone command title inside a composed setup journey. */
|
|
296
299
|
readonly setupFlowTitle?: string;
|
|
297
300
|
/** Progress owned by an enclosing journey while this command runs. */
|
|
@@ -364,6 +367,9 @@ export type EveTUIRunnerOptions = TuiDisplayOptions & {
|
|
|
364
367
|
initialInput?: string;
|
|
365
368
|
/** Explicit fresh-agent onboarding handoff from `eve init`. */
|
|
366
369
|
onboard?: boolean;
|
|
370
|
+
/** Reports timestamped steps and terminal result for fresh-agent onboarding. */
|
|
371
|
+
onOnboardingStep?: (input: EveCliSetupStepEvent) => void;
|
|
372
|
+
onOnboardingTerminal?: (input: EveCliSetupTerminalEvent) => void;
|
|
367
373
|
/** Handles non-core slash commands without adding feature branches to the runner. */
|
|
368
374
|
promptCommandHandler?: PromptCommandHandler;
|
|
369
375
|
/** Commands shown in discovery for this local or remote session. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{PROMPT_COMMANDS,formatPromptCommandHelp,parsePromptCommand}from"./prompt-commands.js";import{pickAgentHeaderTip}from"./agent-header.js";import{failureKey,formatFailureDetail,formatFailureHint,formatFailureMessage,isInterruptedError,localFailureHint}from"./errors.js";import{parseLogDisplayMode}from"./log-display-mode.js";import{createMcpConnectionStatusTracker}from"./mcp-connection-status.js";import{createRemoteConnectionController}from"./remote-connection.js";import{SubagentPump}from"./subagent-pump.js";import{BOOT_DETECTIONS,CLI_MISSING_SETUP_ISSUE,LOGIN_SETUP_ISSUE,detectSetupIssues,formatSetupIssuesLine,normalizeLocalModelEndpoint,orderedSetupIssues}from"./setup-issues.js";import{TerminalRenderer}from"./terminal-renderer.js";import{createVercelStatusTracker}from"./vercel-status.js";import"#client/index.js";import{loadDevelopmentEnvironmentFiles}from"#cli/dev/environment.js";import{inspectApplication}from"#services/inspect-application.js";import{devBootPhase}from"#internal/dev-boot-progress.js";import{toErrorMessage}from"#shared/errors.js";import{getVercelAuthStatus}from"#setup/vercel-project.js";import{probeAgentInfo}from"#services/dev-client/agent-info-probe.js";import{renderApplicationInfo}from"#cli/commands/info.js";import{subscribeDevelopmentSandboxPrewarmLogs}from"#execution/sandbox/development-prewarm.js";import{createEventDeduper}from"#protocol/event-dedupe.js";import{isCurrentTurnBoundaryEvent}from"#protocol/message.js";import{createDevelopmentRuntimeArtifactRefresher}from"#services/dev-client.js";async function delayMs(e){await new Promise(t=>{setTimeout(t,e).unref?.()})}function authIssueForStatus(e){if(e===`logged-out`)return LOGIN_SETUP_ISSUE;if(e===`cli-missing`)return CLI_MISSING_SETUP_ISSUE}var EveTUIRunner=class{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p;#m;#h;#g;#_=!1;#v;#y;#b;#x;#S;#C;#w;#T;#E=!1;#D=new AbortController;#O=!1;#k=[];#A;#j;#M;#N;#P;#F=new Map;#I;#L=[];#R;#z=!1;#B;#V=new Map;#H=new Set;#U;#W;#G;constructor(e){this.#e=e.session,e.client!==void 0&&(this.#t=e.client),e.lifecycle!==void 0&&(this.#G=e.lifecycle),this.#n=createRenderer(e);let t={formatActionResultError};if(this.#t!==void 0&&(t.client=this.#t),this.#n.subagents!==void 0&&(t.view=this.#n.subagents),e.appRoot!==void 0&&(t.onToolCompleted=async(e,t)=>{let n=registryHandoffAddress(e,t);n!==void 0&&this.#oe(n)}),this.#B=new SubagentPump(t),this.#r=e.name??`eve`,this.#N=e.startup?.headerTip??pickAgentHeaderTip(),this.#b=e.withExclusiveTerminal,this.#i=e.tools??`full`,this.#a=e.reasoning??`full`,this.#o=e.subagents??`full`,this.#s=e.connectionAuth??`full`,this.#c=e.assistantResponseStats??`tokensPerSecond`,this.#l=e.contextSize,this.#u=e.formatTransportError??toErrorMessage,e.initialInput!==void 0&&(this.#m=e.initialInput),e.startup!==void 0&&(this.#h=e.startup),this.#g=e.onboard===!0,e.appRoot!==void 0){this.#p=e.appRoot;let t={appRoot:e.appRoot,onChange:e=>this.#n.setVercelStatus?.(e)};e.detectProjectIdentity!==void 0&&(t.detectIdentity=e.detectProjectIdentity),this.#j=createVercelStatusTracker(t),e.probeMcpConnection!==void 0&&(this.#M=createMcpConnectionStatusTracker({onChange:()=>{},probe:e.probeMcpConnection}))}if(e.promptCommandHandler!==void 0&&(this.#v=e.promptCommandHandler),this.#y=e.availablePromptCommands??PROMPT_COMMANDS,e.remote!==void 0){if(this.#t===void 0)throw Error(`A remote TUI requires a configured development client.`);this.#x=createRemoteConnectionController({client:this.#t,credentials:e.remote.credentials,target:e.remote.target,onChange:e=>this.#n.setRemoteConnectionStatus?.(e),resolveOidcToken:e.remote.resolveOidcToken,resolveDeployment:e.remote.resolveDeployment})}this.#S=e.bootDetections??BOOT_DETECTIONS,this.#C=e.getVercelAuthStatus??getVercelAuthStatus,this.#w=e.inspectApplication??inspectApplication,e.onBootProgress!==void 0&&(this.#T=e.onBootProgress),e.serverUrl!==void 0&&(this.#f=e.serverUrl),e.serverUrl!==void 0&&e.remote===void 0&&(this.#d=createDevelopmentRuntimeArtifactRefresher({serverUrl:e.serverUrl}))}async#K(){if(this.#f===void 0)return this.#J(),this.#g||await this.#ce(void 0),this.#h?.finish()??this.#m;let e;if(this.#x!==void 0){let t=await this.#x.check();t.state===`ready`&&(e=t.info)}else{let t=this.#t;if(t!==void 0)try{let n=await devBootPhase(`connecting to agent`,()=>probeAgentInfo({client:t}),this.#T);n.kind===`ready`&&(e=n.info)}catch{e=void 0}}let t=this.#h?.finish()??this.#m;this.#J();let n=this.#q(e);return this.#g||await this.#ce(n),t}#q(e){let t=this.#p===void 0?e:normalizeLocalModelEndpoint(e,process.env);this.#P=t;let n=this.#f;if(n===void 0||this.#_)return t;let r={name:this.#r,serverUrl:n};return t!==void 0&&(r.info=t),this.#p!==void 0&&(r.tip=this.#N),this.#n.renderAgentHeader?.(r),t}#J(){let e=this.#T;this.#T=void 0,e?.({type:`before-first-paint`})}async run(){let onStop=()=>this.#n.requestInterrupt?.();this.#G?.signal.aborted===!0?onStop():this.#G?.signal.addEventListener(`abort`,onStop,{once:!0});try{await this.#Y()}finally{this.#G?.signal.removeEventListener(`abort`,onStop),this.#E=!0,this.#D.abort(),this.#B.abortAll(),this.#W?.(),this.#W=void 0,this.#n.shutdown?.(),this.#j?.dispose(),this.#M?.dispose(),this.#x?.dispose()}}async#Y(){let e=this.#r,t,n,r=!1,i=!1,a=!1,o=await this.#K();if(this.#x?.current().connection.state===`auth-required`&&await this.#_e({type:`extension`,name:`vc:login`,argument:``},e,{trigger:`startup`}),this.#fe(),this.#j?.refreshIdentity(),this.#M?.refresh(),this.#g&&this.#p!==void 0&&this.#v!==void 0&&this.#n.setupFlow!==void 0){o=void 0,this.#_=!0;try{await this.#ye(e)}finally{this.#_=!1}}for(;;){if(this.#G?.signal.aborted===!0||this.#n.exitRequested?.()===!0)return;let s=this.#L[0];if(s!==void 0&&n===void 0&&this.#I===void 0){this.#L.shift(),this.#R=s;try{await this.#se(s)}finally{this.#R=void 0}i=!1,a=!1,t=void 0;continue}if(!a){if(t==null){if(!this.#n.readPrompt){if(r)return;throw Error(`No prompt was provided and the renderer does not support prompt input.`)}let n={title:e};o!==void 0&&(n.initialDraft=o,o=void 0);try{this.#z=!0,t=await this.#ee(n)}catch(e){if(isInterruptedError(e)){if(this.#I===void 0&&this.#L.length===0)return;a=!0,t=``}else throw e}finally{this.#z=!1}if(this.#L.length>0&&this.#I===void 0){t=void 0;continue}if(t==null&&this.#I===void 0)return}let s=this.#I===void 0?parsePromptCommand(t):null;if(s?.type===`exit`){this.#G?.requestStop();return}if(s?.type===`cancel`){if(this.#e===void 0){this.#pe(`No active turn to cancel.`),n=void 0,i=!1,a=!1,t=void 0;continue}try{let e=await this.#e.cancel();if(this.#pe(e.status===`accepted`?`Turn cancellation requested.`:`No active turn to cancel.`),e.status===`no_active_turn`){n=void 0,i=!1,a=!1,t=void 0;continue}}catch(e){this.#pe(`Couldn't cancel the turn: ${toErrorMessage(e)}`),n=void 0,i=!1,a=!1,t=void 0;continue}n=void 0,i=!0,a=!1,t=void 0}if(s?.type===`reset`){if(!await this.#Q()){n=void 0,a=!1,t=void 0;continue}n=void 0,a=!1,t=void 0;continue}if(s?.type===`compact`){if(this.#e===void 0){this.#pe(`No active session to compact.`),n=void 0,i=!1,a=!1,t=void 0;continue}try{let e=await this.#e.compact();if(this.#pe(e.status===`accepted`?`Compaction requested.`:`No active session to compact.`),e.status===`no_active_session`){n=void 0,i=!1,a=!1,t=void 0;continue}}catch(e){this.#pe(`Couldn't compact the session: ${toErrorMessage(e)}`),n=void 0,i=!1,a=!1,t=void 0;continue}n=void 0,i=!0,a=!1,t=void 0}if(s?.type===`clear`){if(this.#e===void 0){this.#pe(`No active session to clear.`),n=void 0,i=!1,a=!1,t=void 0;continue}try{let e=await this.#e.clear();if(this.#pe(e.status===`accepted`?`Context clear requested.`:`No active session to clear.`),e.status===`no_active_session`){n=void 0,i=!1,a=!1,t=void 0;continue}}catch(e){this.#pe(`Couldn't clear the session: ${toErrorMessage(e)}`),n=void 0,i=!1,a=!1,t=void 0;continue}n=void 0,i=!0,a=!1,t=void 0}if(s?.type===`help`){this.#pe(formatPromptCommandHelp(this.#y)),n=void 0,a=!1,t=void 0;continue}if(s?.type===`info`){await this.#Se(),n=void 0,a=!1,t=void 0;continue}if(s?.type===`loglevel`){this.#pe(this.#Ce(s.argument)),n=void 0,a=!1,t=void 0;continue}if(s?.type===`traces`){await this.#xe(s.argument),n=void 0,a=!1,t=void 0;continue}if(s?.type===`extension`){try{await this.#_e(s,e,{trigger:`command`})}catch(e){if(isInterruptedError(e))return;throw e}n=void 0,t=void 0,a=!1;continue}r=!0}let c=this.#I;this.#I=void 0;let l=c??(i?this.#ie():await(async()=>(this.#Z(),await this.#ne({prompt:a?void 0:t,inputResponses:n})))()),u=this.#e?.state.sessionId;u!==void 0&&this.#n.setSessionId?.(u);let d=t,f=!1;try{for(;;){await this.#n.renderStream(l,{title:e,submittedPrompt:d,continueSession:!!this.#n.readPrompt,tools:this.#i,reasoning:this.#a,subagents:this.#o,connectionAuth:this.#s,assistantResponseStats:this.#c,contextSize:this.#l});let r=l.turnState?.pendingApprovals??[],i=l.turnState?.pendingQuestions??[];if(r.length>0||i.length>0){let o=[];if(r.length>0){if(!this.#n.readToolApproval)throw Error(`Tool approval was requested, but the renderer does not support tool approval input.`);for(let t of r){let n=await this.#n.readToolApproval(t,{title:e});o.push({requestId:t.approvalId,optionId:n.approved?`approve`:`cancel`}),this.#F.delete(t.approvalId)}}if(i.length>0){if(!this.#n.readInputQuestion)throw Error(`An interactive question was requested, but the renderer does not support input questions.`);for(let t of i){let n=toAgentTUIInputQuestion(t),r=await this.#n.readInputQuestion(n,{title:e});if(r===void 0)continue;let i={requestId:t.requestId};r.optionId!==void 0&&(i.optionId=r.optionId),r.text!==void 0&&(i.text=r.text),o.push(i),this.#F.delete(t.requestId)}}if(o.length===0)break;a=!0,n=o,t=void 0,f=!0;break}if(this.#Oe(l)){l=this.#ie(),d=void 0;continue}if(l.turnState&&l.turnState.boundaryEvent===void 0&&!l.turnState.aborted){let e=this.#e?.state.sessionId;this.#n.renderNotice?.(e?`Lost the event stream — the turn may still be running on the server (session ${e}). Your next message resumes this session; use /cancel to stop the turn.`:`Lost the connection to the running turn.`)}break}}catch(e){if(isInterruptedError(e))return;throw e}if(f)continue;i=!1,a=!1,n=void 0,t=void 0;let p=l.turnState?.boundaryEvent;this.#U!==this.#e&&(p===`session.waiting`||p===`session.completed`)&&(t=this.#n.takeQueuedPrompt?.()),this.#Z(l.turnState?.aborted===!0)}}#X(){this.#B.abortAll(),this.#F.clear(),this.#V.clear(),this.#H.clear(),this.#n.setConnectionAuthPendingCount?.(0),this.#e=void 0,this.#d?.clear()}#Z(e=!1){let t=this.#U;t!==void 0&&(this.#U=void 0,this.#e===t&&(this.#X(),e?this.#n.renderNotice?.(`Stopped following the turn and started a new session. Earlier context was cleared; the interrupted turn may still be running on the server.`):this.#n.renderSessionBoundary===void 0?this.#n.renderNotice?.(`Session ended — started a new session. Earlier context was cleared.`):this.#n.renderSessionBoundary()))}async#Q(){if(this.#e===void 0)return this.#X(),this.#n.reset?.(),!0;try{await this.#e.reset()}catch(e){return this.#n.renderNotice?.(`Couldn't reset the session: ${toErrorMessage(e)}`),!1}return this.#X(),this.#n.reset?.(),!0}async#$(e){if(!this.#n.readPrompt)return;let t=this.#n.readPrompt(e),n=this.#d;if(n===void 0)return await t;let r=!1,i=!1,a,o=0,refresh=async()=>{if(!(r||i)){i=!0;try{await n.refreshIdle({onRuntimeArtifactsChanged:()=>this.#Ee()});let e=this.#P?.agent.model.endpoint,t=e?.kind===`chatgpt`&&(e.state===`signed-out`||e.state===`reauth-required`),r=Date.now();if(t&&r-o>=5e3){o=r;let e=await this.#Te();e!==void 0&&this.#q(e)}}finally{i=!1}}},startRefresh=()=>{if(r||i)return;let e=refresh().finally(()=>{a===e&&(a=void 0)});a=e};startRefresh();let s=setInterval(()=>{startRefresh()},500);s.unref?.();try{return await t}finally{r=!0,clearInterval(s),await a}}async#ee(e){let t=this.#$(e);if(this.#n.renderIdleStream===void 0||this.#e?.state.sessionId===void 0)return await t;let n=new AbortController,r=this.#te(n.signal,e).catch(e=>{n.signal.aborted||this.#n.renderNotice?.(`Stopped following session updates: ${toErrorMessage(e)}`)});try{return await t}finally{n.abort(),await r}}async#te(e,t){let n=this.#e;if(n===void 0)return;let r=n.stream({signal:e})[Symbol.asyncIterator]();try{for(;!e.aborted;){let i=!1,a={async*[Symbol.asyncIterator](){for(;!e.aborted;){let e=await r.next();if(e.done===!0||(i=!0,yield e.value,isCurrentTurnBoundaryEvent(e.value)))return}}},o=this.#ae(a,()=>{},n);if(await this.#n.renderIdleStream(o,{...t,continueSession:!0}),this.#Oe(o),(o.turnState?.pendingApprovals.length??0)>0||(o.turnState?.pendingQuestions.length??0)>0){this.#I={events:(async function*(){})(),turnState:o.turnState},this.#n.suspendPromptForInput?.();return}if(!i)return}}finally{await r.return?.()}}async#ne(e){let t=new AbortController,n={signal:t.signal};e.prompt!==void 0&&(n.message=e.prompt),e.inputResponses!==void 0&&e.inputResponses.length>0&&(n.inputResponses=e.inputResponses);let r,i=this.#e;try{if(this.#d!==void 0&&await this.#d.refresh({inputResponses:n.inputResponses,message:n.message,onRuntimeArtifactsChanged:()=>this.#Ee()}),n.message!==void 0&&(n.inputResponses?.length??0)===0&&this.#n.flushDelayedDevBuildErrors?.(),this.#e===void 0){if(this.#t===void 0)throw Error(`Cannot create a session without an eve client.`);if(n.message===void 0)throw Error(`Cannot answer an input request before the session starts.`);let e=await this.#t.sessions.create({...n,message:n.message});this.#e=e.session,r=e.response}else r=n.inputResponses===void 0?await this.#e.send(n.message,{signal:n.signal,turnPolicy:`queue`}):await this.#e.respond(n.inputResponses,{signal:n.signal})}catch(e){if(isInterruptedError(e))throw e;return this.#x?.reportFailure(e),this.#U=i,{events:errorOnlyTUIStream({errorText:this.#u(e)}),turnState:createTurnState()}}return this.#ae(r,()=>t.abort(),this.#e)}async#re(e,t){if(e.cancelInFlight!==!0){e.cancelInFlight=!0;try{for(let n=0;n<8;n+=1){if(e.boundaryEvent!==void 0||e.aborted===!0)return;let n=e.turnId;try{if((await t?.cancel(n===void 0?void 0:{turnId:n}))?.status===`accepted`)return}catch{}await delayMs(250)}}finally{e.cancelInFlight=!1}}}#ie(){if(this.#e===void 0)throw Error(`Cannot stream a session before its first turn is accepted.`);let e=new AbortController,t=this.#e;return this.#ae(t.stream({signal:e.signal}),()=>e.abort(),t)}#ae(e,t,n){let r=createTurnState();return{abort:()=>{r.aborted=!0,this.#U=n,t()},cancel:()=>{this.#re(r,n)},events:eveEventsToTUIStream({events:e,pendingInputRequests:this.#F,turnState:r,onSubagentCalled:e=>this.#B.begin(e),onSubagentBackgrounded:e=>this.#B.background(e),onSubagentCompleted:e=>this.#B.settle(e),onTurnCancelled:e=>this.#B.settleCancelledTurn(e),onConnectionAuthRequired:e=>this.#De(e),onConnectionAuthCompleted:e=>this.#ke(e),onRegistryHandoff:this.#p===void 0?void 0:async e=>this.#oe(e),onTerminalFailure:()=>{this.#U=n},failureHintOverride:this.#p===void 0?void 0:localFailureHint}),turnState:r}}#oe(e){this.#R===e||this.#L.includes(e)||(this.#L.push(e),this.#z&&this.#n.suspendPromptForInput?.())}async#se(e){await this.#_e({type:`extension`,name:`add`,argument:e},`Add to your agent`,{trigger:`command`})}async#ce(e){if(this.#p===void 0)return;let t={appRoot:this.#p,env:process.env};e!==void 0&&(t.info=e),this.#k=await detectSetupIssues(t,this.#S),this.#n.renderSetupWarning!==void 0&&(this.#le(),this.#ue())}#le(){let e=orderedSetupIssues(this.#k,this.#A);e.length>0?this.#n.renderSetupWarning?.(formatSetupIssuesLine(e)):this.#n.clearSetupWarning?.()}async#ue(){let e=this.#p;if(e===void 0)return;let t;try{t=await this.#C(e,{signal:this.#D.signal})}catch{return}this.#E||this.#O||(this.#A=authIssueForStatus(t),this.#le())}async#de(e){let t=this.#p;if(t===void 0||this.#n.renderSetupWarning===void 0)return;let n={appRoot:t,env:process.env};e!==void 0&&(n.info=e);try{this.#k=await detectSetupIssues(n,this.#S);let e=await this.#C(t,{signal:this.#D.signal});this.#A=authIssueForStatus(e)}catch{return}this.#E||this.#le()}#fe(){this.#p!==void 0&&this.#n.renderSandboxLog!==void 0&&this.#W===void 0&&(this.#W=subscribeDevelopmentSandboxPrewarmLogs({appRoot:this.#p,log:e=>this.#n.renderSandboxLog?.(e)}))}#pe(e,t){if(e!==void 0){if(this.#n.renderCommandResult!==void 0){this.#n.renderCommandResult(e,t);return}this.#n.renderNotice?.(e)}}async#me(e,t){let n=this.#v;if(n===void 0)return{message:`/${e.name} is not available in this session.`};let r=this.#P?.agent.model.endpoint,i={...t,renderer:this.#n,chatGptAccountLabel:r?.kind===`chatgpt`&&r.state===`ready`?r.accountLabel:void 0,remoteConnection:this.#x,withExclusiveTerminal:this.#b},a=this.#M?.current(),o=a!==void 0&&Object.keys(a).length>0?{...i,disabledConnectionReasons:a}:i;return t.keepSetupFlowOpen===!0?await n.handle(e,{...o,keepSetupFlowOpen:!0}):await n.handle(e,o)}#he(e,t,n){if(t!==`startup`)return;let r=this.#x?.current().connection.state,i=n===`error`||r===`auth-failed`||r===`unavailable`?`failed`:void 0,a=e.argument.length===0?``:` ${e.argument}`;this.#n.renderCommandInvocation?.(`/${e.name}${a}`,i)}async#ge(e){if(e?.kind===`model-access-changed`){this.#j?.applyEffect({kind:`refresh-identity`}),this.#O=!0,await this.#we();return}e!==void 0&&(this.#j?.applyEffect(e),this.#O=!0,this.#de(this.#P))}async#_e(e,t,n){let r=await this.#me(e,{...n,title:t}),i=n.suppressSuccessfulTranscript===!0&&r?.tone!==`error`||n.suppressCancelledTranscript===!0&&r?.cancelled===!0;return i||this.#he(e,n.trigger,r?.tone),i||this.#pe(r?.message,r?.tone),await this.#ge(r?.effect),this.#be(),r}#ve(e){return{kind:`planner`,activeStep:e,firstNavigableStep:1,steps:[{label:`Model`,complete:e>0},{label:`Channels`},{label:`Integrations`},{label:`Review`}]}}async#ye(e){let t={keepSetupFlowOpen:!0,setupFlowTitle:`Set up ${e}`,trigger:`startup`},n=await this.#_e({type:`extension`,name:`model`,argument:``},e,{...t,suppressSuccessfulTranscript:!0,initialModelStep:`provider`,setupFlowNavigation:this.#ve(0)});if(n?.tone===`error`||n?.cancelled===!0){this.#n.setupFlow?.end({preserveDiagnostics:n.tone===`error`});return}let r;try{r=await this.#_e({type:`extension`,name:`add`,argument:``},e,{...t,registryPlannerContext:{prefixSteps:[{label:`Model`,complete:!0}],reviewMessage:`Review your agent`,primaryActionLabel:`Install and finish setup`,emptyActionLabel:`Finish setup`}})}finally{this.#n.setupFlow?.end({preserveDiagnostics:r?.tone===`error`})}}#be(){if(this.#_)return;let e=this.#x?.current().connection;e?.state===`ready`&&e.info!==this.#P&&(this.#P=e.info,this.#f!==void 0&&this.#n.renderAgentHeader?.({info:e.info,name:this.#r,serverUrl:this.#f}))}async#xe(e){if(this.#p===void 0||this.#n.traceViewer===void 0){this.#pe(`/traces is only available in local dev sessions.`);return}try{await this.#n.traceViewer.open({appRoot:this.#p,sessionId:this.#e?.state.sessionId,reference:e===``?void 0:e})}catch(e){if(isInterruptedError(e))return;throw e}}async#Se(){let e=this.#p;if(e===void 0){this.#pe(`/info is only available in local dev sessions.`);return}try{this.#pe(renderApplicationInfo(await this.#w(e)))}catch(e){this.#pe(`Couldn't inspect the application: ${toErrorMessage(e)}`,`error`)}}#Ce(e){let t=this.#n;if(t.logDisplayMode===void 0||t.setLogDisplayMode===void 0)return`/loglevel is not available in this session.`;if(e===``)return`Logs: ${t.logDisplayMode()}. Use /loglevel all|stderr|sandbox|none — logs stay buffered, so switching also hides or restores past lines.`;let n=parseLogDisplayMode(e);if(n===void 0)return`Unknown log level "${e}". Use all, stderr, sandbox, or none.`;if(n===t.logDisplayMode())return`Logs already set to ${n}.`;switch(t.setLogDisplayMode(n),n){case`none`:return`Logs hidden. Output stays buffered — /loglevel all restores it.`;case`stderr`:return`Showing stderr logs only.`;case`sandbox`:return`Showing sandbox logs only.`;case`all`:return`Showing all logs.`}}async#we(){let e=this.#p;if(e===void 0)return;await loadDevelopmentEnvironmentFiles(e),await this.#d?.refreshAfterSourceChange({});let t=this.#q(await this.#Te());this.#de(t)}async#Te(){let e=this.#t;if(e===void 0)return;let t=await probeAgentInfo({client:e});return t.kind===`ready`?t.info:void 0}async#Ee(){let e=this.#P,t=await this.#Te();t!==void 0&&this.#q(t),(!this.#n.renderAgentHeader||t===void 0)&&this.#n.renderNotice?.(formatAgentUpdateNotice(e,t))}#De(e){let t={name:e.data.name,description:e.data.description,state:`required`};e.data.authorization!==void 0&&(t.challenge=e.data.authorization),e.data.webhookUrl!==void 0&&(t.webhookUrl=e.data.webhookUrl),this.#V.set(e.data.name,t),this.#Ae(t)}#Oe(e){if(e.turnState?.boundaryEvent!==`session.waiting`)return!1;let t=!1;for(let e of this.#V.values())e.state===`required`&&e.webhookUrl!==void 0&&(e.state=`pending`,this.#H.add(e.name),this.#Ae(e),t=!0);return t&&this.#n.setConnectionAuthPendingCount?.(this.#H.size),this.#H.size>0}#ke(e){let t=this.#V.get(e.data.name)??{name:e.data.name,description:``,state:e.data.outcome};t.state=e.data.outcome,e.data.reason!==void 0&&(t.reason=e.data.reason),this.#V.set(e.data.name,t),this.#H.delete(e.data.name),this.#Ae(t),this.#n.setConnectionAuthPendingCount?.(this.#H.size)}#Ae(e){let t={name:e.name,description:e.description,state:e.state};e.challenge!==void 0&&(t.challenge=e.challenge),e.reason!==void 0&&(t.reason=e.reason),this.#n.upsertConnectionAuth?.(t)}};function createRenderer(e){return e.renderer?e.renderer:new TerminalRenderer({tools:e.tools,reasoning:e.reasoning,subagents:e.subagents,connectionAuth:e.connectionAuth,assistantResponseStats:e.assistantResponseStats,contextSize:e.contextSize,logs:e.logs,availablePromptCommands:e.availablePromptCommands,input:e.userInput,output:e.screen,diagnostics:e.diagnostics,onExitRequest:e.lifecycle?.requestStop})}function formatAgentUpdateNotice(e,t){let n=e?.agent.model.id,r=t?.agent.model.id;return n!==void 0&&r!==void 0&&n!==r?`Agent updated: Model ${n} -> ${r}`:`Agent updated.`}function registryHandoffAddress(e,t){if(e!==`selfmod__registry_add`||typeof t!=`object`||!t)return;let n=t;return n.status===`needs-terminal`&&typeof n.address==`string`?n.address:void 0}async function*eveEventsToTUIStream(e){let{events:t,pendingInputRequests:n,turnState:r,onSubagentCalled:i,onSubagentBackgrounded:a,onSubagentCompleted:o,onTurnCancelled:s,onConnectionAuthRequired:c,onConnectionAuthCompleted:l,onRegistryHandoff:u,onTerminalFailure:d,failureHintOverride:f}=e,p=new Map,m=new Map,h=new Map,g=createEventDeduper(),_=0,v=new Set,y=new Set,b=new Set,x=!1,S=!1,C;for await(let e of t)if(g.admit(e)&&!(S&&isPostTurnVisibleEvent(e)))switch(e.type){case`session.started`:case`message.received`:break;case`turn.started`:r.turnId=e.data.turnId;break;case`step.started`:_+=1,yield{type:`step-start`};break;case`step.completed`:{let t=e;C=t.data.usage,yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`step-finish`,usage:t.data.usage};break}case`message.appended`:{let t=e,n=textPartId(t.data.turnId,t.data.stepIndex),r=partStateFor(p,n);if(r.completed){if(_<=r.completedEpoch)break;r.generation+=1,r.text=``,r.completed=!1}let i=t.data.messageDelta;if(i.length===0)break;r.text+=i,yield{type:`assistant-delta`,id:partGenerationId(n,r.generation),delta:i};break}case`message.completed`:{let t=textPartId(e.data.turnId,e.data.stepIndex),n=partStateFor(p,t),r=e.data.message;if(n.completed){if(r===null||_<=n.completedEpoch)break;n.generation+=1,n.text=r,n.completedEpoch=_,yield{type:`assistant-complete`,id:partGenerationId(t,n.generation),text:r};break}let i=partGenerationId(t,n.generation);if(r!==null){if(n.text.length===0)n.text=r,n.completed=!0,n.completedEpoch=_,yield{type:`assistant-complete`,id:i,text:r};else if(r.startsWith(n.text)){let e=r.slice(n.text.length);e.length>0&&(yield{type:`assistant-delta`,id:i,delta:e}),n.text=r,n.completed=!0,n.completedEpoch=_,yield{type:`assistant-complete`,id:i}}else n.text=r,n.completed=!0,n.completedEpoch=_,yield{type:`assistant-complete`,id:i,text:r}}else n.text.length>0&&(n.completed=!0,n.completedEpoch=_,yield{type:`assistant-complete`,id:i});break}case`reasoning.appended`:{let t=e,n=reasoningPartId(t.data.turnId,t.data.stepIndex),r=partStateFor(m,n);if(r.completed){if(_<=r.completedEpoch)break;r.generation+=1,r.text=``,r.completed=!1}let i=t.data.reasoningDelta;if(i.length===0)break;r.text+=i,yield{type:`reasoning-delta`,id:partGenerationId(n,r.generation),delta:i};break}case`reasoning.completed`:{let t=reasoningPartId(e.data.turnId,e.data.stepIndex),n=partStateFor(m,t),r=e.data.reasoning;if(n.completed){if(r.length===0||_<=n.completedEpoch)break;n.generation+=1,n.text=r,n.completedEpoch=_;let e=partGenerationId(t,n.generation);yield{type:`reasoning-delta`,id:e,delta:r},yield{type:`reasoning-complete`,id:e};break}let i=partGenerationId(t,n.generation);if(n.text.length===0&&r.length>0)n.text=r,yield{type:`reasoning-delta`,id:i,delta:r};else if(r.length>0&&!r.startsWith(n.text)){yield{type:`reasoning-complete`,id:i},n.generation+=1,n.text=r,n.completed=!0,n.completedEpoch=_;let e=partGenerationId(t,n.generation);yield{type:`reasoning-delta`,id:e,delta:r},yield{type:`reasoning-complete`,id:e};break}n.completed=!0,n.completedEpoch=_,yield{type:`reasoning-complete`,id:i};break}case`actions.requested`:{let t=e.data.actions.filter(e=>e.kind===`tool-call`);if(t.length===0)break;for(let e of t)h.set(e.callId,e.toolName),!v.has(e.callId)&&(v.add(e.callId),yield{type:`tool-call`,toolCallId:e.callId,toolName:e.toolName,input:e.input});break}case`input.requested`:{let t=e.data.requests.filter(e=>e.action.kind===`tool-call`);if(t.length===0)break;for(let e of t){let t=e.action.callId;if(h.set(t,e.action.toolName),e.kind!==`session-limit`&&!v.has(t)&&(v.add(t),yield{type:`tool-call`,toolCallId:t,toolName:e.action.toolName,input:e.action.input}),!y.has(e.requestId)){if(y.add(e.requestId),n.set(e.requestId,e),e.kind!==`tool-approval`){upsertPendingQuestion(r,e);continue}upsertPendingApproval(r,e),yield{type:`tool-approval-request`,approvalId:e.requestId,toolCallId:t}}}break}case`action.result`:{let t=e;if(t.data.result.kind!==`tool-result`)break;let n=t.data.result.callId;if(!v.has(n))break;switch(t.data.status){case`completed`:{let e=t.data.result.output;yield{type:`tool-result`,toolCallId:n,output:e};let r=registryHandoffAddress(h.get(n),e);r!==void 0&&await u?.(r);break}case`failed`:yield{type:`tool-error`,toolCallId:n,errorText:formatActionResultError(t)};break;case`rejected`:yield{type:`tool-rejected`,toolCallId:n,reason:formatActionResultError(t)}}break}case`step.failed`:case`turn.failed`:{let t=toFailureEvent(e,b,f);t&&(yield t);break}case`session.failed`:{r.sawSessionFailure=!0,d?.(e);let t=toFailureEvent(e,b,f);t&&(yield t),r.boundaryEvent=e.type,yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`finish`,usage:C},x=!0;return}case`session.waiting`:case`session.completed`:r.boundaryEvent=e.type,yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`finish`,usage:C},x=!0;return;case`turn.completed`:S=!0,yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_);break;case`turn.cancelled`:s?.(e.data.turnId),yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`turn-cancelled`};break;case`subagent.called`:i?.(e);break;case`subagent.started`:case`subagent.event`:break;case`subagent.completed`:{let t=e;t.data.backgroundTask===void 0?o?.(t.data.callId):a?.(t.data.callId);break}case`authorization.required`:c?.(e);break;case`authorization.completed`:l?.(e)}x||(yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`finish`,usage:C})}async function*errorOnlyTUIStream(e){yield{type:`error`,errorText:e.errorText},yield{type:`finish`}}function createTurnState(){return{aborted:!1,pendingApprovals:[],pendingQuestions:[],sawSessionFailure:!1}}function upsertPendingApproval(e,t){let n=toAgentTUIToolApprovalRequest(t),r=e.pendingApprovals.findIndex(e=>e.approvalId===n.approvalId);r===-1?e.pendingApprovals.push(n):e.pendingApprovals[r]=n}function toAgentTUIToolApprovalRequest(e){return{approvalId:e.requestId,toolCallId:e.action.callId,toolName:e.action.toolName,input:e.action.input}}function upsertPendingQuestion(e,t){let n=e.pendingQuestions.findIndex(e=>e.requestId===t.requestId);n===-1?e.pendingQuestions.push(t):e.pendingQuestions[n]=t}function textPartId(e,t){return`text:${e}:${t}`}function reasoningPartId(e,t){return`reasoning:${e}:${t}`}function partStateFor(e,t){let n=e.get(t);return n===void 0&&(n={generation:0,text:``,completed:!1,completedEpoch:0},e.set(t,n)),n}function partGenerationId(e,t){return t===0?e:`${e}#${t}`}function*closeOpenParts(e,t,n){for(let[r,i]of e)i.completed||i.text.length===0||(i.completed=!0,i.completedEpoch=n,yield{type:t,id:partGenerationId(r,i.generation)})}function isPostTurnVisibleEvent(e){switch(e.type){case`actions.requested`:case`authorization.completed`:case`authorization.required`:case`input.requested`:case`message.appended`:case`message.completed`:case`reasoning.appended`:case`reasoning.completed`:case`result.completed`:case`step.completed`:case`step.failed`:case`step.started`:case`subagent.called`:case`subagent.completed`:case`subagent.event`:case`subagent.started`:case`turn.completed`:case`turn.failed`:return!0;default:return!1}}function formatActionResultError(e){if(e.data.error?.message)return e.data.error.message;let t=e.data.result.output;if(typeof t==`string`)return t;try{return JSON.stringify(t)}catch{return`Tool execution failed.`}}function toFailureEvent(e,t,n){let r=failureKey(e);if(t.has(r))return;t.add(r);let i={type:`error`,errorText:formatFailureMessage(e)},a=n?.(e)??formatFailureHint(e);a!==void 0&&(i.hint=a);let o=formatFailureDetail(e);return o!==void 0&&(i.detail=o),i}function toAgentTUIInputQuestion(e){let t=e.display===`text`?`text`:e.display===`select`||e.options!==void 0&&e.options.length>0?`select`:`text`,n={requestId:e.requestId,prompt:e.prompt,display:t};return e.options!==void 0&&(n.options=e.options.map(e=>{let t={id:e.id,label:e.label};return e.description!==void 0&&(t.description=e.description),e.style!==void 0&&(t.style=e.style),t})),e.allowFreeform!==void 0&&(n.allowFreeform=e.allowFreeform),n}export{EveTUIRunner,parsePromptCommand,registryHandoffAddress};
|
|
1
|
+
import{PROMPT_COMMANDS,formatPromptCommandHelp,parsePromptCommand}from"./prompt-commands.js";import{pickAgentHeaderTip}from"./agent-header.js";import{failureKey,formatFailureDetail,formatFailureHint,formatFailureMessage,isInterruptedError,localFailureHint}from"./errors.js";import{parseLogDisplayMode}from"./log-display-mode.js";import{createMcpConnectionStatusTracker}from"./mcp-connection-status.js";import{createRemoteConnectionController}from"./remote-connection.js";import{SubagentPump}from"./subagent-pump.js";import{BOOT_DETECTIONS,CLI_MISSING_SETUP_ISSUE,LOGIN_SETUP_ISSUE,detectSetupIssues,formatSetupIssuesLine,normalizeLocalModelEndpoint,orderedSetupIssues}from"./setup-issues.js";import{TerminalRenderer}from"./terminal-renderer.js";import{createVercelStatusTracker}from"./vercel-status.js";import"#client/index.js";import{loadDevelopmentEnvironmentFiles}from"#cli/dev/environment.js";import{inspectApplication}from"#services/inspect-application.js";import{devBootPhase}from"#internal/dev-boot-progress.js";import{toErrorMessage}from"#shared/errors.js";import{getVercelAuthStatus}from"#setup/vercel-project.js";import{probeAgentInfo}from"#services/dev-client/agent-info-probe.js";import{renderApplicationInfo}from"#cli/commands/info.js";import{subscribeDevelopmentSandboxPrewarmLogs}from"#execution/sandbox/development-prewarm.js";import{createEventDeduper}from"#protocol/event-dedupe.js";import{isCurrentTurnBoundaryEvent}from"#protocol/message.js";import{createDevelopmentRuntimeArtifactRefresher}from"#services/dev-client.js";async function delayMs(e){await new Promise(t=>{setTimeout(t,e).unref?.()})}function authIssueForStatus(e){if(e===`logged-out`)return LOGIN_SETUP_ISSUE;if(e===`cli-missing`)return CLI_MISSING_SETUP_ISSUE}var EveTUIRunner=class{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p;#m;#h;#g;#_;#v;#y=!1;#b;#x;#S;#C;#w;#T;#E;#D;#O=!1;#k=new AbortController;#A=!1;#j=[];#M;#N;#P;#F;#I;#L=new Map;#R;#z=[];#B;#V=!1;#H;#U=new Map;#W=new Set;#G;#K;#q;constructor(e){this.#e=e.session,e.client!==void 0&&(this.#t=e.client),e.lifecycle!==void 0&&(this.#q=e.lifecycle),this.#n=createRenderer(e);let t={formatActionResultError};if(this.#t!==void 0&&(t.client=this.#t),this.#n.subagents!==void 0&&(t.view=this.#n.subagents),e.appRoot!==void 0&&(t.onToolCompleted=async(e,t)=>{let n=registryHandoffAddress(e,t);n!==void 0&&this.#ce(n)}),this.#H=new SubagentPump(t),this.#r=e.name??`eve`,this.#F=e.startup?.headerTip??pickAgentHeaderTip(),this.#S=e.withExclusiveTerminal,this.#i=e.tools??`full`,this.#a=e.reasoning??`full`,this.#o=e.subagents??`full`,this.#s=e.connectionAuth??`full`,this.#c=e.assistantResponseStats??`tokensPerSecond`,this.#l=e.contextSize,this.#u=e.formatTransportError??toErrorMessage,e.initialInput!==void 0&&(this.#m=e.initialInput),e.startup!==void 0&&(this.#h=e.startup),this.#g=e.onboard===!0,this.#_=e.onOnboardingStep,this.#v=e.onOnboardingTerminal,e.appRoot!==void 0){this.#p=e.appRoot;let t={appRoot:e.appRoot,onChange:e=>this.#n.setVercelStatus?.(e)};e.detectProjectIdentity!==void 0&&(t.detectIdentity=e.detectProjectIdentity),this.#N=createVercelStatusTracker(t),e.probeMcpConnection!==void 0&&(this.#P=createMcpConnectionStatusTracker({onChange:()=>{},probe:e.probeMcpConnection}))}if(e.promptCommandHandler!==void 0&&(this.#b=e.promptCommandHandler),this.#x=e.availablePromptCommands??PROMPT_COMMANDS,e.remote!==void 0){if(this.#t===void 0)throw Error(`A remote TUI requires a configured development client.`);this.#C=createRemoteConnectionController({client:this.#t,credentials:e.remote.credentials,target:e.remote.target,onChange:e=>this.#n.setRemoteConnectionStatus?.(e),resolveOidcToken:e.remote.resolveOidcToken,resolveDeployment:e.remote.resolveDeployment})}this.#w=e.bootDetections??BOOT_DETECTIONS,this.#T=e.getVercelAuthStatus??getVercelAuthStatus,this.#E=e.inspectApplication??inspectApplication,e.onBootProgress!==void 0&&(this.#D=e.onBootProgress),e.serverUrl!==void 0&&(this.#f=e.serverUrl),e.serverUrl!==void 0&&e.remote===void 0&&(this.#d=createDevelopmentRuntimeArtifactRefresher({serverUrl:e.serverUrl}))}async#J(){if(this.#f===void 0)return this.#X(),this.#g||await this.#ue(void 0),this.#h?.finish()??this.#m;let e;if(this.#C!==void 0){let t=await this.#C.check();t.state===`ready`&&(e=t.info)}else{let t=this.#t;if(t!==void 0)try{let n=await devBootPhase(`connecting to agent`,()=>probeAgentInfo({client:t}),this.#D);n.kind===`ready`&&(e=n.info)}catch{e=void 0}}let t=this.#h?.finish()??this.#m;this.#X();let n=this.#Y(e);return this.#g||await this.#ue(n),t}#Y(e){let t=this.#p===void 0?e:normalizeLocalModelEndpoint(e,process.env);this.#I=t;let n=this.#f;if(n===void 0||this.#y)return t;let r={name:this.#r,serverUrl:n};return t!==void 0&&(r.info=t),this.#p!==void 0&&(r.tip=this.#F),this.#n.renderAgentHeader?.(r),t}#X(){let e=this.#D;this.#D=void 0,e?.({type:`before-first-paint`})}async run(){let onStop=()=>this.#n.requestInterrupt?.();this.#q?.signal.aborted===!0?onStop():this.#q?.signal.addEventListener(`abort`,onStop,{once:!0});try{await this.#Z()}finally{this.#q?.signal.removeEventListener(`abort`,onStop),this.#O=!0,this.#k.abort(),this.#H.abortAll(),this.#K?.(),this.#K=void 0,this.#n.shutdown?.(),this.#N?.dispose(),this.#P?.dispose(),this.#C?.dispose()}}async#Z(){let e=this.#r,t,n,r=!1,i=!1,a=!1,o=await this.#J();if(this.#C?.current().connection.state===`auth-required`&&await this.#ye({type:`extension`,name:`vc:login`,argument:``},e,{trigger:`startup`}),this.#me(),this.#N?.refreshIdentity(),this.#P?.refresh(),this.#g&&this.#p!==void 0&&this.#b!==void 0&&this.#n.setupFlow!==void 0){o=void 0,this.#y=!0;try{await this.#xe(e)}finally{this.#y=!1}}for(;;){if(this.#q?.signal.aborted===!0||this.#n.exitRequested?.()===!0)return;let s=this.#z[0];if(s!==void 0&&n===void 0&&this.#R===void 0){this.#z.shift(),this.#B=s;try{await this.#le(s)}finally{this.#B=void 0}i=!1,a=!1,t=void 0;continue}if(!a){if(t==null){if(!this.#n.readPrompt){if(r)return;throw Error(`No prompt was provided and the renderer does not support prompt input.`)}let n={title:e};o!==void 0&&(n.initialDraft=o,o=void 0);try{this.#V=!0,t=await this.#ne(n)}catch(e){if(isInterruptedError(e)){if(this.#R===void 0&&this.#z.length===0)return;a=!0,t=``}else throw e}finally{this.#V=!1}if(this.#z.length>0&&this.#R===void 0){t=void 0;continue}if(t==null&&this.#R===void 0)return}let s=this.#R===void 0?parsePromptCommand(t):null;if(s?.type===`exit`){this.#q?.requestStop();return}if(s?.type===`cancel`){if(this.#e===void 0){this.#he(`No active turn to cancel.`),n=void 0,i=!1,a=!1,t=void 0;continue}try{let e=await this.#e.cancel();if(this.#he(e.status===`accepted`?`Turn cancellation requested.`:`No active turn to cancel.`),e.status===`no_active_turn`){n=void 0,i=!1,a=!1,t=void 0;continue}}catch(e){this.#he(`Couldn't cancel the turn: ${toErrorMessage(e)}`),n=void 0,i=!1,a=!1,t=void 0;continue}n=void 0,i=!0,a=!1,t=void 0}if(s?.type===`reset`){if(!await this.#ee()){n=void 0,a=!1,t=void 0;continue}n=void 0,a=!1,t=void 0;continue}if(s?.type===`compact`){if(this.#e===void 0){this.#he(`No active session to compact.`),n=void 0,i=!1,a=!1,t=void 0;continue}try{let e=await this.#e.compact();if(this.#he(e.status===`accepted`?`Compaction requested.`:`No active session to compact.`),e.status===`no_active_session`){n=void 0,i=!1,a=!1,t=void 0;continue}}catch(e){this.#he(`Couldn't compact the session: ${toErrorMessage(e)}`),n=void 0,i=!1,a=!1,t=void 0;continue}n=void 0,i=!0,a=!1,t=void 0}if(s?.type===`clear`){if(this.#e===void 0){this.#he(`No active session to clear.`),n=void 0,i=!1,a=!1,t=void 0;continue}try{let e=await this.#e.clear();if(this.#he(e.status===`accepted`?`Context clear requested.`:`No active session to clear.`),e.status===`no_active_session`){n=void 0,i=!1,a=!1,t=void 0;continue}}catch(e){this.#he(`Couldn't clear the session: ${toErrorMessage(e)}`),n=void 0,i=!1,a=!1,t=void 0;continue}n=void 0,i=!0,a=!1,t=void 0}if(s?.type===`help`){this.#he(formatPromptCommandHelp(this.#x)),n=void 0,a=!1,t=void 0;continue}if(s?.type===`info`){await this.#we(),n=void 0,a=!1,t=void 0;continue}if(s?.type===`loglevel`){this.#he(this.#Te(s.argument)),n=void 0,a=!1,t=void 0;continue}if(s?.type===`traces`){await this.#Ce(s.argument),n=void 0,a=!1,t=void 0;continue}if(s?.type===`extension`){try{await this.#ye(s,e,{trigger:`command`})}catch(e){if(isInterruptedError(e))return;throw e}n=void 0,t=void 0,a=!1;continue}r=!0}let c=this.#R;this.#R=void 0;let l=c??(i?this.#oe():await(async()=>(this.#$(),await this.#ie({prompt:a?void 0:t,inputResponses:n})))()),u=this.#e?.state.sessionId;u!==void 0&&this.#n.setSessionId?.(u);let d=t,f=!1;try{for(;;){await this.#n.renderStream(l,{title:e,submittedPrompt:d,continueSession:!!this.#n.readPrompt,tools:this.#i,reasoning:this.#a,subagents:this.#o,connectionAuth:this.#s,assistantResponseStats:this.#c,contextSize:this.#l});let r=l.turnState?.pendingApprovals??[],i=l.turnState?.pendingQuestions??[];if(r.length>0||i.length>0){let o=[];if(r.length>0){if(!this.#n.readToolApproval)throw Error(`Tool approval was requested, but the renderer does not support tool approval input.`);for(let t of r){let n=await this.#n.readToolApproval(t,{title:e});o.push({requestId:t.approvalId,optionId:n.approved?`approve`:`cancel`}),this.#L.delete(t.approvalId)}}if(i.length>0){if(!this.#n.readInputQuestion)throw Error(`An interactive question was requested, but the renderer does not support input questions.`);for(let t of i){let n=toAgentTUIInputQuestion(t),r=await this.#n.readInputQuestion(n,{title:e});if(r===void 0)continue;let i={requestId:t.requestId};r.optionId!==void 0&&(i.optionId=r.optionId),r.text!==void 0&&(i.text=r.text),o.push(i),this.#L.delete(t.requestId)}}if(o.length===0)break;a=!0,n=o,t=void 0,f=!0;break}if(this.#Ae(l)){l=this.#oe(),d=void 0;continue}if(l.turnState&&l.turnState.boundaryEvent===void 0&&!l.turnState.aborted){let e=this.#e?.state.sessionId;this.#n.renderNotice?.(e?`Lost the event stream — the turn may still be running on the server (session ${e}). Your next message resumes this session; use /cancel to stop the turn.`:`Lost the connection to the running turn.`)}break}}catch(e){if(isInterruptedError(e))return;throw e}if(f)continue;i=!1,a=!1,n=void 0,t=void 0;let p=l.turnState?.boundaryEvent;this.#G!==this.#e&&(p===`session.waiting`||p===`session.completed`)&&(t=this.#n.takeQueuedPrompt?.()),this.#$(l.turnState?.aborted===!0)}}#Q(){this.#H.abortAll(),this.#L.clear(),this.#U.clear(),this.#W.clear(),this.#n.setConnectionAuthPendingCount?.(0),this.#e=void 0,this.#d?.clear()}#$(e=!1){let t=this.#G;t!==void 0&&(this.#G=void 0,this.#e===t&&(this.#Q(),e?this.#n.renderNotice?.(`Stopped following the turn and started a new session. Earlier context was cleared; the interrupted turn may still be running on the server.`):this.#n.renderSessionBoundary===void 0?this.#n.renderNotice?.(`Session ended — started a new session. Earlier context was cleared.`):this.#n.renderSessionBoundary()))}async#ee(){if(this.#e===void 0)return this.#Q(),this.#n.reset?.(),!0;try{await this.#e.reset()}catch(e){return this.#n.renderNotice?.(`Couldn't reset the session: ${toErrorMessage(e)}`),!1}return this.#Q(),this.#n.reset?.(),!0}async#te(e){if(!this.#n.readPrompt)return;let t=this.#n.readPrompt(e),n=this.#d;if(n===void 0)return await t;let r=!1,i=!1,a,o=0,refresh=async()=>{if(!(r||i)){i=!0;try{await n.refreshIdle({onRuntimeArtifactsChanged:()=>this.#Oe()});let e=this.#I?.agent.model.endpoint,t=e?.kind===`chatgpt`&&(e.state===`signed-out`||e.state===`reauth-required`),r=Date.now();if(t&&r-o>=5e3){o=r;let e=await this.#De();e!==void 0&&this.#Y(e)}}finally{i=!1}}},startRefresh=()=>{if(r||i)return;let e=refresh().finally(()=>{a===e&&(a=void 0)});a=e};startRefresh();let s=setInterval(()=>{startRefresh()},500);s.unref?.();try{return await t}finally{r=!0,clearInterval(s),await a}}async#ne(e){let t=this.#te(e);if(this.#n.renderIdleStream===void 0||this.#e?.state.sessionId===void 0)return await t;let n=new AbortController,r=this.#re(n.signal,e).catch(e=>{n.signal.aborted||this.#n.renderNotice?.(`Stopped following session updates: ${toErrorMessage(e)}`)});try{return await t}finally{n.abort(),await r}}async#re(e,t){let n=this.#e;if(n===void 0)return;let r=n.stream({signal:e})[Symbol.asyncIterator]();try{for(;!e.aborted;){let i=!1,a={async*[Symbol.asyncIterator](){for(;!e.aborted;){let e=await r.next();if(e.done===!0||(i=!0,yield e.value,isCurrentTurnBoundaryEvent(e.value)))return}}},o=this.#se(a,()=>{},n);if(await this.#n.renderIdleStream(o,{...t,continueSession:!0}),this.#Ae(o),(o.turnState?.pendingApprovals.length??0)>0||(o.turnState?.pendingQuestions.length??0)>0){this.#R={events:(async function*(){})(),turnState:o.turnState},this.#n.suspendPromptForInput?.();return}if(!i)return}}finally{await r.return?.()}}async#ie(e){let t=new AbortController,n={signal:t.signal};e.prompt!==void 0&&(n.message=e.prompt),e.inputResponses!==void 0&&e.inputResponses.length>0&&(n.inputResponses=e.inputResponses);let r,i=this.#e;try{if(this.#d!==void 0&&await this.#d.refresh({inputResponses:n.inputResponses,message:n.message,onRuntimeArtifactsChanged:()=>this.#Oe()}),n.message!==void 0&&(n.inputResponses?.length??0)===0&&this.#n.flushDelayedDevBuildErrors?.(),this.#e===void 0){if(this.#t===void 0)throw Error(`Cannot create a session without an eve client.`);if(n.message===void 0)throw Error(`Cannot answer an input request before the session starts.`);let e=await this.#t.sessions.create({...n,message:n.message});this.#e=e.session,r=e.response}else r=n.inputResponses===void 0?await this.#e.send(n.message,{signal:n.signal,turnPolicy:`queue`}):await this.#e.respond(n.inputResponses,{signal:n.signal})}catch(e){if(isInterruptedError(e))throw e;return this.#C?.reportFailure(e),this.#G=i,{events:errorOnlyTUIStream({errorText:this.#u(e)}),turnState:createTurnState()}}return this.#se(r,()=>t.abort(),this.#e)}async#ae(e,t){if(e.cancelInFlight!==!0){e.cancelInFlight=!0;try{for(let n=0;n<8;n+=1){if(e.boundaryEvent!==void 0||e.aborted===!0)return;let n=e.turnId;try{if((await t?.cancel(n===void 0?void 0:{turnId:n}))?.status===`accepted`)return}catch{}await delayMs(250)}}finally{e.cancelInFlight=!1}}}#oe(){if(this.#e===void 0)throw Error(`Cannot stream a session before its first turn is accepted.`);let e=new AbortController,t=this.#e;return this.#se(t.stream({signal:e.signal}),()=>e.abort(),t)}#se(e,t,n){let r=createTurnState();return{abort:()=>{r.aborted=!0,this.#G=n,t()},cancel:()=>{this.#ae(r,n)},events:eveEventsToTUIStream({events:e,pendingInputRequests:this.#L,turnState:r,onSubagentCalled:e=>this.#H.begin(e),onSubagentBackgrounded:e=>this.#H.background(e),onSubagentCompleted:e=>this.#H.settle(e),onTurnCancelled:e=>this.#H.settleCancelledTurn(e),onConnectionAuthRequired:e=>this.#ke(e),onConnectionAuthCompleted:e=>this.#je(e),onRegistryHandoff:this.#p===void 0?void 0:async e=>this.#ce(e),onTerminalFailure:()=>{this.#G=n},failureHintOverride:this.#p===void 0?void 0:localFailureHint}),turnState:r}}#ce(e){this.#B===e||this.#z.includes(e)||(this.#z.push(e),this.#V&&this.#n.suspendPromptForInput?.())}async#le(e){await this.#ye({type:`extension`,name:`add`,argument:e},`Add to your agent`,{trigger:`command`})}async#ue(e){if(this.#p===void 0)return;let t={appRoot:this.#p,env:process.env};e!==void 0&&(t.info=e),this.#j=await detectSetupIssues(t,this.#w),this.#n.renderSetupWarning!==void 0&&(this.#de(),this.#fe())}#de(){let e=orderedSetupIssues(this.#j,this.#M);e.length>0?this.#n.renderSetupWarning?.(formatSetupIssuesLine(e)):this.#n.clearSetupWarning?.()}async#fe(){let e=this.#p;if(e===void 0)return;let t;try{t=await this.#T(e,{signal:this.#k.signal})}catch{return}this.#O||this.#A||(this.#M=authIssueForStatus(t),this.#de())}async#pe(e){let t=this.#p;if(t===void 0||this.#n.renderSetupWarning===void 0)return;let n={appRoot:t,env:process.env};e!==void 0&&(n.info=e);try{this.#j=await detectSetupIssues(n,this.#w);let e=await this.#T(t,{signal:this.#k.signal});this.#M=authIssueForStatus(e)}catch{return}this.#O||this.#de()}#me(){this.#p!==void 0&&this.#n.renderSandboxLog!==void 0&&this.#K===void 0&&(this.#K=subscribeDevelopmentSandboxPrewarmLogs({appRoot:this.#p,log:e=>this.#n.renderSandboxLog?.(e)}))}#he(e,t){if(e!==void 0){if(this.#n.renderCommandResult!==void 0){this.#n.renderCommandResult(e,t);return}this.#n.renderNotice?.(e)}}async#ge(e,t){let n=this.#b;if(n===void 0)return{message:`/${e.name} is not available in this session.`};let r=this.#I?.agent.model.endpoint,i={...t,renderer:this.#n,chatGptAccountLabel:r?.kind===`chatgpt`&&r.state===`ready`?r.accountLabel:void 0,remoteConnection:this.#C,withExclusiveTerminal:this.#S},a=this.#P?.current(),o=a!==void 0&&Object.keys(a).length>0?{...i,disabledConnectionReasons:a}:i;return t.keepSetupFlowOpen===!0?await n.handle(e,{...o,keepSetupFlowOpen:!0}):await n.handle(e,o)}#_e(e,t,n){if(t!==`startup`)return;let r=this.#C?.current().connection.state,i=n===`error`||r===`auth-failed`||r===`unavailable`?`failed`:void 0,a=e.argument.length===0?``:` ${e.argument}`;this.#n.renderCommandInvocation?.(`/${e.name}${a}`,i)}async#ve(e){if(e?.kind===`model-access-changed`){this.#N?.applyEffect({kind:`refresh-identity`}),this.#A=!0,await this.#Ee();return}e!==void 0&&(this.#N?.applyEffect(e),this.#A=!0,this.#pe(this.#I))}async#ye(e,t,n){let r=await this.#ge(e,{...n,title:t}),i=n.suppressSuccessfulTranscript===!0&&r?.tone!==`error`||n.suppressCancelledTranscript===!0&&r?.cancelled===!0;return i||this.#_e(e,n.trigger,r?.tone),i||this.#he(r?.message,r?.tone),await this.#ve(r?.effect),this.#Se(),r}#be(e){return{kind:`planner`,activeStep:e,firstNavigableStep:1,steps:[{label:`Model`,complete:e>0},{label:`Channels`},{label:`Integrations`},{label:`Review`}]}}async#xe(e){let t={keepSetupFlowOpen:!0,setupFlowTitle:`Set up ${e}`,trigger:`startup`},n=`model_provider`,onOnboardingScreen=e=>{n=e.screen,this.#_?.({flow:`onboarding`,step:e.screen,registrySelectedCount:e.registrySelectedCount})};onOnboardingScreen({screen:`model_provider`});let r;try{r=await this.#ye({type:`extension`,name:`model`,argument:``},e,{...t,suppressSuccessfulTranscript:!0,initialModelStep:`provider`,setupFlowNavigation:this.#be(0),onOnboardingScreen})}catch(e){throw this.#v?.({flow:`onboarding`,step:n,result:`error`}),e}if(r?.tone===`error`||r?.cancelled===!0){this.#v?.({flow:`onboarding`,step:n,result:r.cancelled===!0?`cancelled`:`error`}),this.#n.setupFlow?.end({preserveDiagnostics:r.tone===`error`});return}let i;n=`registry_channels`;let onRegistryScreen=e=>{n=e.screen,this.#_?.({flow:`onboarding`,step:e.screen,registrySelectedCount:e.registrySelectedCount})};try{onRegistryScreen({screen:`registry_channels`}),i=await this.#ye({type:`extension`,name:`add`,argument:``},e,{...t,onOnboardingScreen:onRegistryScreen,registryPlannerContext:{prefixSteps:[{label:`Model`,complete:!0}],reviewMessage:`Review your agent`,primaryActionLabel:`Install and finish setup`,emptyActionLabel:`Finish setup`}})}catch(e){throw this.#v?.({flow:`onboarding`,step:n,result:`error`}),e}finally{i!==void 0&&this.#v?.({flow:`onboarding`,step:n,result:i.cancelled===!0?`cancelled`:i.tone===`error`?`error`:`completed`}),this.#n.setupFlow?.end({preserveDiagnostics:i?.tone===`error`})}}#Se(){if(this.#y)return;let e=this.#C?.current().connection;e?.state===`ready`&&e.info!==this.#I&&(this.#I=e.info,this.#f!==void 0&&this.#n.renderAgentHeader?.({info:e.info,name:this.#r,serverUrl:this.#f}))}async#Ce(e){if(this.#p===void 0||this.#n.traceViewer===void 0){this.#he(`/traces is only available in local dev sessions.`);return}try{await this.#n.traceViewer.open({appRoot:this.#p,sessionId:this.#e?.state.sessionId,reference:e===``?void 0:e})}catch(e){if(isInterruptedError(e))return;throw e}}async#we(){let e=this.#p;if(e===void 0){this.#he(`/info is only available in local dev sessions.`);return}try{this.#he(renderApplicationInfo(await this.#E(e)))}catch(e){this.#he(`Couldn't inspect the application: ${toErrorMessage(e)}`,`error`)}}#Te(e){let t=this.#n;if(t.logDisplayMode===void 0||t.setLogDisplayMode===void 0)return`/loglevel is not available in this session.`;if(e===``)return`Logs: ${t.logDisplayMode()}. Use /loglevel all|stderr|sandbox|none — logs stay buffered, so switching also hides or restores past lines.`;let n=parseLogDisplayMode(e);if(n===void 0)return`Unknown log level "${e}". Use all, stderr, sandbox, or none.`;if(n===t.logDisplayMode())return`Logs already set to ${n}.`;switch(t.setLogDisplayMode(n),n){case`none`:return`Logs hidden. Output stays buffered — /loglevel all restores it.`;case`stderr`:return`Showing stderr logs only.`;case`sandbox`:return`Showing sandbox logs only.`;case`all`:return`Showing all logs.`}}async#Ee(){let e=this.#p;if(e===void 0)return;await loadDevelopmentEnvironmentFiles(e),await this.#d?.refreshAfterSourceChange({});let t=this.#Y(await this.#De());this.#pe(t)}async#De(){let e=this.#t;if(e===void 0)return;let t=await probeAgentInfo({client:e});return t.kind===`ready`?t.info:void 0}async#Oe(){let e=this.#I,t=await this.#De();t!==void 0&&this.#Y(t),(!this.#n.renderAgentHeader||t===void 0)&&this.#n.renderNotice?.(formatAgentUpdateNotice(e,t))}#ke(e){let t={name:e.data.name,description:e.data.description,state:`required`};e.data.authorization!==void 0&&(t.challenge=e.data.authorization),e.data.webhookUrl!==void 0&&(t.webhookUrl=e.data.webhookUrl),this.#U.set(e.data.name,t),this.#Me(t)}#Ae(e){if(e.turnState?.boundaryEvent!==`session.waiting`)return!1;let t=!1;for(let e of this.#U.values())e.state===`required`&&e.webhookUrl!==void 0&&(e.state=`pending`,this.#W.add(e.name),this.#Me(e),t=!0);return t&&this.#n.setConnectionAuthPendingCount?.(this.#W.size),this.#W.size>0}#je(e){let t=this.#U.get(e.data.name)??{name:e.data.name,description:``,state:e.data.outcome};t.state=e.data.outcome,e.data.reason!==void 0&&(t.reason=e.data.reason),this.#U.set(e.data.name,t),this.#W.delete(e.data.name),this.#Me(t),this.#n.setConnectionAuthPendingCount?.(this.#W.size)}#Me(e){let t={name:e.name,description:e.description,state:e.state};e.challenge!==void 0&&(t.challenge=e.challenge),e.reason!==void 0&&(t.reason=e.reason),this.#n.upsertConnectionAuth?.(t)}};function createRenderer(e){return e.renderer?e.renderer:new TerminalRenderer({tools:e.tools,reasoning:e.reasoning,subagents:e.subagents,connectionAuth:e.connectionAuth,assistantResponseStats:e.assistantResponseStats,contextSize:e.contextSize,logs:e.logs,availablePromptCommands:e.availablePromptCommands,input:e.userInput,output:e.screen,diagnostics:e.diagnostics,onExitRequest:e.lifecycle?.requestStop})}function formatAgentUpdateNotice(e,t){let n=e?.agent.model.id,r=t?.agent.model.id;return n!==void 0&&r!==void 0&&n!==r?`Agent updated: Model ${n} -> ${r}`:`Agent updated.`}function registryHandoffAddress(e,t){if(e!==`selfmod__registry_add`||typeof t!=`object`||!t)return;let n=t;return n.status===`needs-terminal`&&typeof n.address==`string`?n.address:void 0}async function*eveEventsToTUIStream(e){let{events:t,pendingInputRequests:n,turnState:r,onSubagentCalled:i,onSubagentBackgrounded:a,onSubagentCompleted:o,onTurnCancelled:s,onConnectionAuthRequired:c,onConnectionAuthCompleted:l,onRegistryHandoff:u,onTerminalFailure:d,failureHintOverride:f}=e,p=new Map,m=new Map,h=new Map,g=createEventDeduper(),_=0,v=new Set,y=new Set,b=new Set,x=!1,S=!1,C;for await(let e of t)if(g.admit(e)&&!(S&&isPostTurnVisibleEvent(e)))switch(e.type){case`session.started`:case`message.received`:break;case`turn.started`:r.turnId=e.data.turnId;break;case`step.started`:_+=1,yield{type:`step-start`};break;case`step.completed`:{let t=e;C=t.data.usage,yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`step-finish`,usage:t.data.usage};break}case`message.appended`:{let t=e,n=textPartId(t.data.turnId,t.data.stepIndex),r=partStateFor(p,n);if(r.completed){if(_<=r.completedEpoch)break;r.generation+=1,r.text=``,r.completed=!1}let i=t.data.messageDelta;if(i.length===0)break;r.text+=i,yield{type:`assistant-delta`,id:partGenerationId(n,r.generation),delta:i};break}case`message.completed`:{let t=textPartId(e.data.turnId,e.data.stepIndex),n=partStateFor(p,t),r=e.data.message;if(n.completed){if(r===null||_<=n.completedEpoch)break;n.generation+=1,n.text=r,n.completedEpoch=_,yield{type:`assistant-complete`,id:partGenerationId(t,n.generation),text:r};break}let i=partGenerationId(t,n.generation);if(r!==null){if(n.text.length===0)n.text=r,n.completed=!0,n.completedEpoch=_,yield{type:`assistant-complete`,id:i,text:r};else if(r.startsWith(n.text)){let e=r.slice(n.text.length);e.length>0&&(yield{type:`assistant-delta`,id:i,delta:e}),n.text=r,n.completed=!0,n.completedEpoch=_,yield{type:`assistant-complete`,id:i}}else n.text=r,n.completed=!0,n.completedEpoch=_,yield{type:`assistant-complete`,id:i,text:r}}else n.text.length>0&&(n.completed=!0,n.completedEpoch=_,yield{type:`assistant-complete`,id:i});break}case`reasoning.appended`:{let t=e,n=reasoningPartId(t.data.turnId,t.data.stepIndex),r=partStateFor(m,n);if(r.completed){if(_<=r.completedEpoch)break;r.generation+=1,r.text=``,r.completed=!1}let i=t.data.reasoningDelta;if(i.length===0)break;r.text+=i,yield{type:`reasoning-delta`,id:partGenerationId(n,r.generation),delta:i};break}case`reasoning.completed`:{let t=reasoningPartId(e.data.turnId,e.data.stepIndex),n=partStateFor(m,t),r=e.data.reasoning;if(n.completed){if(r.length===0||_<=n.completedEpoch)break;n.generation+=1,n.text=r,n.completedEpoch=_;let e=partGenerationId(t,n.generation);yield{type:`reasoning-delta`,id:e,delta:r},yield{type:`reasoning-complete`,id:e};break}let i=partGenerationId(t,n.generation);if(n.text.length===0&&r.length>0)n.text=r,yield{type:`reasoning-delta`,id:i,delta:r};else if(r.length>0&&!r.startsWith(n.text)){yield{type:`reasoning-complete`,id:i},n.generation+=1,n.text=r,n.completed=!0,n.completedEpoch=_;let e=partGenerationId(t,n.generation);yield{type:`reasoning-delta`,id:e,delta:r},yield{type:`reasoning-complete`,id:e};break}n.completed=!0,n.completedEpoch=_,yield{type:`reasoning-complete`,id:i};break}case`actions.requested`:{let t=e.data.actions.filter(e=>e.kind===`tool-call`);if(t.length===0)break;for(let e of t)h.set(e.callId,e.toolName),!v.has(e.callId)&&(v.add(e.callId),yield{type:`tool-call`,toolCallId:e.callId,toolName:e.toolName,input:e.input});break}case`input.requested`:{let t=e.data.requests.filter(e=>e.action.kind===`tool-call`);if(t.length===0)break;for(let e of t){let t=e.action.callId;if(h.set(t,e.action.toolName),e.kind!==`session-limit`&&!v.has(t)&&(v.add(t),yield{type:`tool-call`,toolCallId:t,toolName:e.action.toolName,input:e.action.input}),!y.has(e.requestId)){if(y.add(e.requestId),n.set(e.requestId,e),e.kind!==`tool-approval`){upsertPendingQuestion(r,e);continue}upsertPendingApproval(r,e),yield{type:`tool-approval-request`,approvalId:e.requestId,toolCallId:t}}}break}case`action.result`:{let t=e;if(t.data.result.kind!==`tool-result`)break;let n=t.data.result.callId;if(!v.has(n))break;switch(t.data.status){case`completed`:{let e=t.data.result.output;yield{type:`tool-result`,toolCallId:n,output:e};let r=registryHandoffAddress(h.get(n),e);r!==void 0&&await u?.(r);break}case`failed`:yield{type:`tool-error`,toolCallId:n,errorText:formatActionResultError(t)};break;case`rejected`:yield{type:`tool-rejected`,toolCallId:n,reason:formatActionResultError(t)}}break}case`step.failed`:case`turn.failed`:{let t=toFailureEvent(e,b,f);t&&(yield t);break}case`session.failed`:{r.sawSessionFailure=!0,d?.(e);let t=toFailureEvent(e,b,f);t&&(yield t),r.boundaryEvent=e.type,yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`finish`,usage:C},x=!0;return}case`session.waiting`:case`session.completed`:r.boundaryEvent=e.type,yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`finish`,usage:C},x=!0;return;case`turn.completed`:S=!0,yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_);break;case`turn.cancelled`:s?.(e.data.turnId),yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`turn-cancelled`};break;case`subagent.called`:i?.(e);break;case`subagent.started`:case`subagent.event`:break;case`subagent.completed`:{let t=e;t.data.backgroundTask===void 0?o?.(t.data.callId):a?.(t.data.callId);break}case`authorization.required`:c?.(e);break;case`authorization.completed`:l?.(e)}x||(yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`finish`,usage:C})}async function*errorOnlyTUIStream(e){yield{type:`error`,errorText:e.errorText},yield{type:`finish`}}function createTurnState(){return{aborted:!1,pendingApprovals:[],pendingQuestions:[],sawSessionFailure:!1}}function upsertPendingApproval(e,t){let n=toAgentTUIToolApprovalRequest(t),r=e.pendingApprovals.findIndex(e=>e.approvalId===n.approvalId);r===-1?e.pendingApprovals.push(n):e.pendingApprovals[r]=n}function toAgentTUIToolApprovalRequest(e){return{approvalId:e.requestId,toolCallId:e.action.callId,toolName:e.action.toolName,input:e.action.input}}function upsertPendingQuestion(e,t){let n=e.pendingQuestions.findIndex(e=>e.requestId===t.requestId);n===-1?e.pendingQuestions.push(t):e.pendingQuestions[n]=t}function textPartId(e,t){return`text:${e}:${t}`}function reasoningPartId(e,t){return`reasoning:${e}:${t}`}function partStateFor(e,t){let n=e.get(t);return n===void 0&&(n={generation:0,text:``,completed:!1,completedEpoch:0},e.set(t,n)),n}function partGenerationId(e,t){return t===0?e:`${e}#${t}`}function*closeOpenParts(e,t,n){for(let[r,i]of e)i.completed||i.text.length===0||(i.completed=!0,i.completedEpoch=n,yield{type:t,id:partGenerationId(r,i.generation)})}function isPostTurnVisibleEvent(e){switch(e.type){case`actions.requested`:case`authorization.completed`:case`authorization.required`:case`input.requested`:case`message.appended`:case`message.completed`:case`reasoning.appended`:case`reasoning.completed`:case`result.completed`:case`step.completed`:case`step.failed`:case`step.started`:case`subagent.called`:case`subagent.completed`:case`subagent.event`:case`subagent.started`:case`turn.completed`:case`turn.failed`:return!0;default:return!1}}function formatActionResultError(e){if(e.data.error?.message)return e.data.error.message;let t=e.data.result.output;if(typeof t==`string`)return t;try{return JSON.stringify(t)}catch{return`Tool execution failed.`}}function toFailureEvent(e,t,n){let r=failureKey(e);if(t.has(r))return;t.add(r);let i={type:`error`,errorText:formatFailureMessage(e)},a=n?.(e)??formatFailureHint(e);a!==void 0&&(i.hint=a);let o=formatFailureDetail(e);return o!==void 0&&(i.detail=o),i}function toAgentTUIInputQuestion(e){let t=e.display===`text`?`text`:e.display===`select`||e.options!==void 0&&e.options.length>0?`select`:`text`,n={requestId:e.requestId,prompt:e.prompt,display:t};return e.options!==void 0&&(n.options=e.options.map(e=>{let t={id:e.id,label:e.label};return e.description!==void 0&&(t.description=e.description),e.style!==void 0&&(t.style=e.style),t})),e.allowFreeform!==void 0&&(n.allowFreeform=e.allowFreeform),n}export{EveTUIRunner,parsePromptCommand,registryHandoffAddress};
|