eve 0.30.6 → 0.30.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/src/chunks/{use-eve-agent-BXMIf5fR.js → use-eve-agent-Bx-ONuyb.js} +22 -0
  3. package/dist/src/chunks/{use-eve-agent-k-XHfrJT.js → use-eve-agent-DDoDDmJ2.js} +22 -0
  4. package/dist/src/cli/commands/registry-metadata.d.ts +15 -0
  5. package/dist/src/cli/commands/registry-metadata.js +1 -0
  6. package/dist/src/cli/commands/registry-package.d.ts +46 -0
  7. package/dist/src/cli/commands/registry-package.js +1 -0
  8. package/dist/src/cli/commands/registry.d.ts +1 -1
  9. package/dist/src/cli/commands/registry.js +4 -4
  10. package/dist/src/cli/commands/trace-detail.d.ts +53 -0
  11. package/dist/src/cli/commands/trace-detail.js +1 -0
  12. package/dist/src/cli/commands/trace.d.ts +4 -1
  13. package/dist/src/cli/commands/trace.js +4 -4
  14. package/dist/src/cli/dev/tui/traces/trace-content.d.ts +3 -3
  15. package/dist/src/cli/dev/tui/traces/trace-content.js +1 -1
  16. package/dist/src/cli/dev/tui/traces/trace-view.js +1 -1
  17. package/dist/src/cli/run.js +1 -1
  18. package/dist/src/client/index.d.ts +1 -1
  19. package/dist/src/client/message-reducer-types.d.ts +3 -0
  20. package/dist/src/client/message-reducer.js +1 -1
  21. package/dist/src/compiler/extension-compatibility.d.ts +10 -10
  22. package/dist/src/compiler/extension-compatibility.js +1 -1
  23. package/dist/src/context/dynamic-subagent-lifecycle.d.ts +2 -0
  24. package/dist/src/context/dynamic-subagent-lifecycle.js +1 -1
  25. package/dist/src/execution/agent-continuation-bundle.d.ts +13 -0
  26. package/dist/src/execution/agent-continuation-bundle.js +1 -0
  27. package/dist/src/execution/agent-handle-dispatch.d.ts +32 -4
  28. package/dist/src/execution/agent-handle-dispatch.js +1 -1
  29. package/dist/src/execution/cancel-descendant-turns-step.js +1 -1
  30. package/dist/src/execution/delegated-parent-notification.d.ts +30 -4
  31. package/dist/src/execution/delegated-parent-notification.js +1 -1
  32. package/dist/src/execution/delegated-parent-result.js +1 -1
  33. package/dist/src/execution/dispatch-action-failures.d.ts +8 -0
  34. package/dist/src/execution/dispatch-action-failures.js +1 -0
  35. package/dist/src/execution/dispatch-runtime-actions-step.d.ts +8 -7
  36. package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
  37. package/dist/src/execution/dispatch-start-operation.d.ts +15 -0
  38. package/dist/src/execution/dispatch-start-operation.js +1 -0
  39. package/dist/src/execution/forward-turn-cancellation-step.js +1 -1
  40. package/dist/src/execution/next-driver-action.d.ts +12 -0
  41. package/dist/src/execution/node-step.d.ts +1 -1
  42. package/dist/src/execution/node-step.js +1 -1
  43. package/dist/src/execution/parked-delivery-wait.d.ts +35 -0
  44. package/dist/src/execution/parked-delivery-wait.js +1 -0
  45. package/dist/src/execution/remote-agent-dispatch.d.ts +42 -0
  46. package/dist/src/execution/remote-agent-dispatch.js +1 -1
  47. package/dist/src/execution/sandbox/prewarm.js +1 -1
  48. package/dist/src/execution/session-timeout-steps.js +1 -1
  49. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  50. package/dist/src/execution/subagent-invocation.d.ts +3 -0
  51. package/dist/src/execution/subagent-invocation.js +1 -1
  52. package/dist/src/execution/subagent-tool.d.ts +7 -0
  53. package/dist/src/execution/subagent-tool.js +1 -1
  54. package/dist/src/execution/terminate-child-sessions-step.d.ts +15 -0
  55. package/dist/src/execution/terminate-child-sessions-step.js +1 -0
  56. package/dist/src/execution/tool-auth.d.ts +1 -1
  57. package/dist/src/execution/tool-auth.js +1 -1
  58. package/dist/src/execution/turn-control-protocol.js +1 -1
  59. package/dist/src/execution/turn-execution-cursor.d.ts +3 -0
  60. package/dist/src/execution/turn-workflow.js +1 -1
  61. package/dist/src/execution/workflow-entry.js +1 -1
  62. package/dist/src/execution/workflow-runtime.js +1 -1
  63. package/dist/src/execution/workflow-steps.d.ts +8 -1
  64. package/dist/src/execution/workflow-steps.js +1 -1
  65. package/dist/src/harness/agent-handle-errors.d.ts +0 -2
  66. package/dist/src/harness/agent-handle-errors.js +1 -1
  67. package/dist/src/harness/emission-state.d.ts +25 -0
  68. package/dist/src/harness/emission-state.js +1 -0
  69. package/dist/src/harness/emission.d.ts +4 -36
  70. package/dist/src/harness/emission.js +1 -1
  71. package/dist/src/harness/handles/transitions.d.ts +16 -1
  72. package/dist/src/harness/handles/transitions.js +1 -1
  73. package/dist/src/harness/messages.d.ts +4 -2
  74. package/dist/src/harness/messages.js +1 -1
  75. package/dist/src/harness/ordered-stream-emitter.d.ts +3 -2
  76. package/dist/src/harness/ordered-stream-emitter.js +1 -1
  77. package/dist/src/harness/runtime-actions.js +1 -1
  78. package/dist/src/harness/tool-loop.js +2 -2
  79. package/dist/src/harness/tools.d.ts +1 -1
  80. package/dist/src/harness/tools.js +1 -1
  81. package/dist/src/harness/turn-tag-state.d.ts +16 -0
  82. package/dist/src/harness/turn-tag-state.js +1 -1
  83. package/dist/src/harness/types.d.ts +7 -2
  84. package/dist/src/internal/application/package.js +1 -1
  85. package/dist/src/packages/eve-catalog/src/index.js +1 -1
  86. package/dist/src/protocol/message.d.ts +23 -3
  87. package/dist/src/protocol/message.js +2 -2
  88. package/dist/src/public/channels/discord/discordChannel.d.ts +1 -0
  89. package/dist/src/public/channels/eve.js +1 -1
  90. package/dist/src/public/channels/github/githubChannel.d.ts +1 -0
  91. package/dist/src/public/channels/linear/linearChannel.d.ts +1 -0
  92. package/dist/src/public/channels/slack/slackChannel.d.ts +1 -0
  93. package/dist/src/public/channels/teams/teamsChannel.d.ts +1 -0
  94. package/dist/src/public/channels/telegram/telegramChannel.d.ts +1 -0
  95. package/dist/src/public/channels/twilio/twilioChannel.d.ts +1 -0
  96. package/dist/src/public/definitions/channel.d.ts +1 -0
  97. package/dist/src/public/definitions/channel.js +1 -1
  98. package/dist/src/public/definitions/hook.d.ts +1 -0
  99. package/dist/src/public/definitions/tool.d.ts +5 -5
  100. package/dist/src/runtime/actions/types.d.ts +11 -2
  101. package/dist/src/runtime/actions/types.js +1 -1
  102. package/dist/src/runtime/agent/bootstrap.js +1 -1
  103. package/dist/src/runtime/framework-tools/agent.d.ts +16 -0
  104. package/dist/src/runtime/framework-tools/agent.js +1 -1
  105. package/dist/src/runtime/prompt/compose.d.ts +7 -0
  106. package/dist/src/runtime/prompt/compose.js +1 -1
  107. package/dist/src/runtime/resolve-agent-graph.js +1 -1
  108. package/dist/src/runtime/session-callback-route.js +1 -1
  109. package/dist/src/runtime/sessions/compiled-agent-cache.js +1 -1
  110. package/dist/src/runtime/subagents/registry.d.ts +20 -1
  111. package/dist/src/runtime/subagents/registry.js +1 -1
  112. package/dist/src/setup/integrations/github/connect.d.ts +28 -0
  113. package/dist/src/setup/integrations/github/connect.js +1 -0
  114. package/dist/src/setup/integrations/github/setup.d.ts +15 -0
  115. package/dist/src/setup/integrations/github/setup.js +15 -0
  116. package/dist/src/setup/integrations/linear/setup.js +1 -1
  117. package/dist/src/setup/integrations/registry.js +1 -1
  118. package/dist/src/setup/scaffold/create/project.js +1 -1
  119. package/dist/src/shared/async-iterable.d.ts +2 -0
  120. package/dist/src/shared/async-iterable.js +1 -0
  121. package/dist/src/shared/tool-definition.d.ts +1 -1
  122. package/dist/src/svelte/index.js +1 -1
  123. package/dist/src/svelte/use-eve-agent.js +1 -1
  124. package/dist/src/tracing/local-trace-reader.d.ts +10 -0
  125. package/dist/src/tracing/local-trace-reader.js +1 -1
  126. package/dist/src/vue/index.js +1 -1
  127. package/dist/src/vue/use-eve-agent.js +1 -1
  128. package/docs/channels/github.mdx +11 -16
  129. package/docs/channels/linear.mdx +4 -2
  130. package/docs/concepts/security-model.md +1 -0
  131. package/docs/concepts/sessions-runs-and-streaming.md +3 -0
  132. package/docs/guides/client/streaming.mdx +1 -0
  133. package/docs/guides/hooks.md +1 -1
  134. package/docs/guides/state.md +1 -0
  135. package/docs/install-integrations.mdx +4 -2
  136. package/docs/reference/cli.md +8 -1
  137. package/docs/schedules.mdx +1 -0
  138. package/docs/subagents.mdx +28 -1
  139. package/docs/tools/human-in-the-loop.md +1 -0
  140. package/docs/tools/overview.mdx +26 -2
  141. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # eve
2
2
 
3
+ ## 0.30.8
4
+
5
+ ### Patch Changes
6
+
7
+ - e6f4808: Add a single `eve add linear` flow that installs and configures both the Linear Channel and Linear MCP connection.
8
+ - f51f866: Tools can now use async generators to stream preliminary output snapshots. eve publishes local snapshots as `action.partial` events before the final `action.result`, and the default client reducer exposes provisional output with `partial: true`.
9
+
10
+ ## 0.30.7
11
+
12
+ ### Patch Changes
13
+
14
+ - e5c9191: Add experimental agent messaging behind `experimental.subagentPersistentSessions` in `agent.ts`. Opted-in agents keep delegated children alive after they answer: each child is owned by a lifecycle handle, settles every turn with an explicit outcome carrying its per-turn token usage, and parks instead of terminating. The parent's subagent tools gain an `agentId` parameter to continue a parked child, discoverable from a per-model-call `<agents>` system injection that lists only parked (resumable) children. An omitted, empty, or unknown `agentId` starts a fresh child; continuing a child that is still starting or working fails with `AGENT_BUSY`. Without the opt-in, children keep running as one-shot tasks. The subagent tool input schema no longer includes the unused `description` field.
15
+ - bd21332: Cancelling a turn with running delegated children no longer leaks their handles as permanently `running`. The cancellation epilogue now parks each abandoned child as `"(cancelled)"`, so cancelled children stay resumable and later cancellations no longer stall retrying already-dead children.
16
+ - 1758161: Add guided GitHub channel setup through `eve add channel/github`. The flow provisions a Vercel Connect GitHub App, routes verified webhooks, scaffolds the channel, and explains how to install and use the app.
17
+ - 56de47b: Show far more of what local traces record in `eve traces`: span rows carry inline token/cost/tool chips, the header aggregates models, token totals, cost, and errors, and two new flags expose everything else — `--verbose` expands every span with all attributes and events, and `--json` dumps the full trace machine-readably.
18
+
3
19
  ## 0.30.6
4
20
 
5
21
  ### Patch Changes
@@ -1836,6 +1836,25 @@ function reduceMessageData(data, event) {
1836
1836
  if (existing !== void 0) return updateToolPart(data, event.data.result.callId, nextPart);
1837
1837
  return updateAssistantMessage(data, event.data.turnId, (message) => upsertPart(ensureStepStartPart(message, event.data.stepIndex), nextPart));
1838
1838
  }
1839
+ case "action.partial": {
1840
+ const existing = findToolPart(data, event.data.result.callId);
1841
+ if (existing !== void 0 && isSettledToolPart(existing)) return data;
1842
+ const descriptor = normalizeActionResult(event.data.result);
1843
+ const nextPart = {
1844
+ approval: approvedApproval(existing),
1845
+ input: existing?.input,
1846
+ output: event.data.result.output,
1847
+ partial: true,
1848
+ state: "output-available",
1849
+ stepIndex: event.data.stepIndex,
1850
+ toolCallId: event.data.result.callId,
1851
+ toolMetadata: mergeToolMetadata(existing?.toolMetadata, createToolMetadata(descriptor)),
1852
+ toolName: existing?.toolName ?? descriptor.toolName,
1853
+ type: "dynamic-tool"
1854
+ };
1855
+ if (existing !== void 0) return updateToolPart(data, event.data.result.callId, nextPart);
1856
+ return updateAssistantMessage(data, event.data.turnId, (message) => upsertPart(ensureStepStartPart(message, event.data.stepIndex), nextPart));
1857
+ }
1839
1858
  case "authorization.required": return updateAssistantMessage(data, event.data.turnId, (message) => upsertPart(ensureStepStartPart(message, event.data.stepIndex), createAuthorizationRequiredPart(event)));
1840
1859
  case "authorization.completed": return completeAuthorization(data, event);
1841
1860
  case "message.appended": return updateAssistantMessage(data, event.data.turnId, (message) => upsertRun(ensureStepStartPart(message, event.data.stepIndex), {
@@ -1993,6 +2012,9 @@ function updateAuthorizationPart(data, existing, next) {
1993
2012
  function findToolPart(data, toolCallId) {
1994
2013
  for (const message of data.messages) for (const part of message.parts) if (part.type === "dynamic-tool" && part.toolCallId === toolCallId) return part;
1995
2014
  }
2015
+ function isSettledToolPart(part) {
2016
+ return part.state === "output-denied" || part.state === "output-error" || part.state === "output-available" && part.partial !== true;
2017
+ }
1996
2018
  function findLatestPendingAuthorizationPart(data, name) {
1997
2019
  for (let messageIndex = data.messages.length - 1; messageIndex >= 0; messageIndex -= 1) {
1998
2020
  const message = data.messages[messageIndex];
@@ -1836,6 +1836,25 @@ function reduceMessageData(data, event) {
1836
1836
  if (existing !== void 0) return updateToolPart(data, event.data.result.callId, nextPart);
1837
1837
  return updateAssistantMessage(data, event.data.turnId, (message) => upsertPart(ensureStepStartPart(message, event.data.stepIndex), nextPart));
1838
1838
  }
1839
+ case "action.partial": {
1840
+ const existing = findToolPart(data, event.data.result.callId);
1841
+ if (existing !== void 0 && isSettledToolPart(existing)) return data;
1842
+ const descriptor = normalizeActionResult(event.data.result);
1843
+ const nextPart = {
1844
+ approval: approvedApproval(existing),
1845
+ input: existing?.input,
1846
+ output: event.data.result.output,
1847
+ partial: true,
1848
+ state: "output-available",
1849
+ stepIndex: event.data.stepIndex,
1850
+ toolCallId: event.data.result.callId,
1851
+ toolMetadata: mergeToolMetadata(existing?.toolMetadata, createToolMetadata(descriptor)),
1852
+ toolName: existing?.toolName ?? descriptor.toolName,
1853
+ type: "dynamic-tool"
1854
+ };
1855
+ if (existing !== void 0) return updateToolPart(data, event.data.result.callId, nextPart);
1856
+ return updateAssistantMessage(data, event.data.turnId, (message) => upsertPart(ensureStepStartPart(message, event.data.stepIndex), nextPart));
1857
+ }
1839
1858
  case "authorization.required": return updateAssistantMessage(data, event.data.turnId, (message) => upsertPart(ensureStepStartPart(message, event.data.stepIndex), createAuthorizationRequiredPart(event)));
1840
1859
  case "authorization.completed": return completeAuthorization(data, event);
1841
1860
  case "message.appended": return updateAssistantMessage(data, event.data.turnId, (message) => upsertRun(ensureStepStartPart(message, event.data.stepIndex), {
@@ -1993,6 +2012,9 @@ function updateAuthorizationPart(data, existing, next) {
1993
2012
  function findToolPart(data, toolCallId) {
1994
2013
  for (const message of data.messages) for (const part of message.parts) if (part.type === "dynamic-tool" && part.toolCallId === toolCallId) return part;
1995
2014
  }
2015
+ function isSettledToolPart(part) {
2016
+ return part.state === "output-denied" || part.state === "output-error" || part.state === "output-available" && part.partial !== true;
2017
+ }
1996
2018
  function findLatestPendingAuthorizationPart(data, name) {
1997
2019
  for (let messageIndex = data.messages.length - 1; messageIndex >= 0; messageIndex -= 1) {
1998
2020
  const message = data.messages[messageIndex];
@@ -0,0 +1,15 @@
1
+ /** Parses eve-owned metadata from a registry item manifest. */
2
+ export declare function eveMetadataFromRegistryItem(item: unknown): {
3
+ requires?: string | undefined;
4
+ setup?: {
5
+ package: string;
6
+ bin: string;
7
+ args: string[];
8
+ }[] | undefined;
9
+ components?: {
10
+ item: string;
11
+ label: string;
12
+ description?: string | undefined;
13
+ default: boolean;
14
+ }[] | undefined;
15
+ } | undefined;
@@ -0,0 +1 @@
1
+ import{RegistryPackageComponentSchema}from"./registry-package.js";import{z}from"#compiled/zod/index.js";const RegistrySetupSchema=z.object({package:z.string().min(1),bin:z.string().min(1),args:z.array(z.string()).default([])}),EveRegistryItemMetadataSchema=z.object({meta:z.object({eve:z.object({requires:z.string().optional(),setup:z.union([RegistrySetupSchema,z.array(RegistrySetupSchema).min(1)]).transform(e=>Array.isArray(e)?e:[e]).optional(),components:z.array(RegistryPackageComponentSchema).min(1).optional()}).optional()}).optional()});function eveMetadataFromRegistryItem(e){return EveRegistryItemMetadataSchema.parse(e).meta?.eve}export{eveMetadataFromRegistryItem};
@@ -0,0 +1,46 @@
1
+ import { type RegistryConfig } from "#compiled/shadcn-registry/index.js";
2
+ import { z } from "#compiled/zod/index.js";
3
+ import { type Prompter } from "#setup/prompter.js";
4
+ import type { AddCommandOptions, RegistryCommandLogger } from "./registry.js";
5
+ import type { RegistrySetupCommand } from "./registry-setup-command.js";
6
+ export declare const RegistryPackageComponentSchema: z.ZodObject<{
7
+ item: z.ZodString;
8
+ label: z.ZodString;
9
+ description: z.ZodOptional<z.ZodString>;
10
+ default: z.ZodDefault<z.ZodBoolean>;
11
+ }, z.core.$strip>;
12
+ export type RegistryPackageComponent = z.infer<typeof RegistryPackageComponentSchema>;
13
+ interface PackageMetadata {
14
+ requires?: string;
15
+ setup?: RegistrySetupCommand[];
16
+ }
17
+ export interface RegistryPackageDependencies {
18
+ createPrompter?: () => Prompter;
19
+ hasInteractiveTerminal?: () => boolean;
20
+ }
21
+ export interface RegistryPackageOperations {
22
+ itemAddress(item: string): string;
23
+ metadata(item: unknown): PackageMetadata | undefined;
24
+ assertCompatibleVersion(requiredVersion: string | undefined): void;
25
+ runSetups(input: {
26
+ item: string;
27
+ setups: RegistrySetupCommand[];
28
+ prompter: Prompter;
29
+ }): Promise<boolean>;
30
+ setupReminder(item: string): string;
31
+ }
32
+ /** Resolves, installs, and configures the selected components of a registry package. */
33
+ export declare function runRegistryPackage(input: {
34
+ logger: RegistryCommandLogger;
35
+ appRoot: string;
36
+ item: string;
37
+ components: readonly RegistryPackageComponent[];
38
+ config: RegistryConfig;
39
+ options: AddCommandOptions & {
40
+ prompter?: Prompter;
41
+ signal?: AbortSignal;
42
+ };
43
+ dependencies: RegistryPackageDependencies;
44
+ operations: RegistryPackageOperations;
45
+ }): Promise<void>;
46
+ export {};
@@ -0,0 +1 @@
1
+ import{hasInteractiveTerminal}from"./preconditions.js";import{z}from"#compiled/zod/index.js";import{createPrompter}from"#setup/prompter.js";import{addRegistryItems,getRegistryItems}from"#compiled/shadcn-registry/index.js";const RegistryPackageComponentSchema=z.object({item:z.string().min(1),label:z.string().min(1),description:z.string().optional(),default:z.boolean().default(!1)});async function selectComponents(e,t,n,r,i){if(n.prompter===void 0&&(n.yes===!0||!r))return t.filter(e=>e.default);let a=await i().select({message:`Add ${e}`,description:`Select what you want to add to your agent.`,multiple:!0,required:!0,initialValues:t.filter(e=>e.default).map(e=>e.item),options:t.map(e=>({value:e.item,label:e.label,hint:e.description}))}),o=new Set(a);return t.filter(e=>o.has(e.item))}async function runRegistryPackage(t){let{logger:a,appRoot:o,item:s,components:c,config:l,options:u,dependencies:d,operations:f}=t,p=d.hasInteractiveTerminal?.()??hasInteractiveTerminal(),m=u.prompter,getPrompter=()=>m??=d.createPrompter?.()??createPrompter(),h=await selectComponents(s,c,u,p,getPrompter),g=h.map(e=>f.itemAddress(e.item)),_=await getRegistryItems(g,{config:l});if(_.length!==h.length)throw Error(`Registry package "${s}" could not resolve all selected components.`);let v=_.map(e=>{let t=f.metadata(e);return f.assertCompatibleVersion(t?.requires),t});if(u.skipInstall!==!0&&await addRegistryItems(g,{config:l,cwd:o,overwrite:u.overwrite,silent:u.silent}),u.skipSetup!==!0){if(u.yes!==!0&&u.prompter===void 0&&!p){a.log(f.setupReminder(s));return}for(let e of v)if(e?.setup!==void 0&&!await f.runSetups({item:s,setups:e.setup,prompter:getPrompter()}))return}}export{RegistryPackageComponentSchema,runRegistryPackage};
@@ -27,7 +27,7 @@ export interface RegistrySetupDependencies {
27
27
  }
28
28
  export interface AddCommandDependencies extends RegistrySetupDependencies {
29
29
  createPrompter?: () => Prompter;
30
- isInteractive?: () => boolean;
30
+ hasInteractiveTerminal?: () => boolean;
31
31
  }
32
32
  /** One discoverable item from an eve-compatible registry catalog. */
33
33
  export interface RegistryCatalogItem {
@@ -1,6 +1,6 @@
1
- import{NOT_AN_AGENT_MESSAGE}from"./preconditions.js";import{addRegistryMappings,readRegistryConfig}from"./registry-project.js";import{z}from"#compiled/zod/index.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{createCliTheme,sanitizeForTerminal}from"#cli/ui/output.js";import{isEveProject}from"#setup/scaffold/index.js";import{createPrompter}from"#setup/prompter.js";import{WizardCancelledError}from"#setup/step.js";import{addRegistryItems,getRegistryItems,searchRegistries}from"#compiled/shadcn-registry/index.js";import{clipVisible,wrapVisibleLine}from"#cli/ui/terminal-text.js";import semver from"#compiled/semver/index.js";const defaultAddCommandDependencies={createPrompter,isInteractive:()=>process.stdin.isTTY===!0&&process.stdout.isTTY===!0,loadSetupCommandRunner:async()=>(await import(`./registry-setup-command.js`)).runRegistrySetupCommand};function resolveOfficialRegistryUrl(e=process.env.EVE_DEV_OFFICIAL_REGISTRY_URL){if(e===void 0)return`https://eve.dev/r`;let t;try{t=new URL(e)}catch{throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`)}if(t.protocol!==`http:`&&t.protocol!==`https:`)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`);if(t.username!==``||t.password!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include credentials.`);if(t.search!==``||t.hash!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include a query or fragment.`);return t.pathname=t.pathname.replace(/\/+$/,``),t.toString().replace(/\/$/,``)}const OFFICIAL_REGISTRY=resolveOfficialRegistryUrl(),OFFICIAL_CATALOG=`${OFFICIAL_REGISTRY}/registry.json`,SKILLS_REGISTRY=`@skills`;function isRegistryAddress(e){return e.startsWith(`@`)||/^https?:\/\//.test(e)}function itemAddress(e){return isRegistryAddress(e)?e:`${OFFICIAL_REGISTRY}/${e}.json`}async function installOfficialRegistryItem(e,t,n={}){let r=await readEveRegistryConfig(e);await addRegistryItems([itemAddress(t)],{config:r,cwd:e,overwrite:n.overwrite})}const EveRegistryItemMetadataSchema=z.object({meta:z.object({eve:z.object({requires:z.string().optional(),setup:z.object({package:z.string().min(1),bin:z.string().min(1),args:z.array(z.string()).default([])}).optional()}).optional()}).optional()});function eveMetadataFromRegistryItem(e){return EveRegistryItemMetadataSchema.parse(e).meta?.eve}function setupResumeCommand(e){return`eve add ${/^[\w@./:-]+$/.test(e)?e:`'${e.replaceAll(`'`,`'\\''`)}'`} --skip-install`}function setupReminder(e,t){return`${t===`cancelled`?`Setup cancelled.`:`Setup skipped.`} Run \`${setupResumeCommand(e)}\` when you're ready.`}function assertCompatibleEveVersion(e){if(e===void 0)return;let t=resolveInstalledPackageInfo().version;if(semver.validRange(e)===null)throw Error(`Registry item has an invalid eve version requirement: ${e}.`);if(!semver.subset(t,e))throw Error(`This registry item requires eve ${e}, but this project is using eve ${t}. Upgrade eve and run the command again.`)}function isOfficialItemAddress(e){return e.startsWith(`${OFFICIAL_REGISTRY}/`)}function errorMessage(e){return e instanceof Error?e.message:String(e)}async function runRegistryAction(t,n,r){if(!await isEveProject(n)){t.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1;return}try{await r()}catch(e){t.error(errorMessage(e)),process.exitCode=1}}function withBuiltInRegistries(e){return{...e,registries:{[SKILLS_REGISTRY]:`https://www.skills.sh/r/{name}?agent=eve`,...e.registries}}}async function readEveRegistryConfig(e){return withBuiltInRegistries(await readRegistryConfig(e))}function configuredRegistrySources(e){return Object.keys(e.registries??{})}function validateRegistrySource(e){if(e!==void 0&&!isRegistryAddress(e))throw Error(`Registry sources must be a namespace or URL: ${e}`)}function normalizeRegistryText(e){return sanitizeForTerminal(e).replaceAll(`\\"`,`"`).replaceAll(`\\'`,`'`).replaceAll(/\s+/gu,` `).trim()}function registryDescriptionSummary(e){let t=normalizeRegistryText(e);return t.match(/^.*?[.!?](?=\s|$)/u)?.[0]??t}function searchItemAddress(e){return normalizeRegistryText(e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument)}function searchItemFallbackTitle(e){let t=normalizeRegistryText(e.name);return t.split(`/`).at(-1)??t}function renderSearchItem(e,t,n){let r=Math.max(1,t-4),i=wrapVisibleLine(searchItemAddress(e),r),a=[` ${n.label(searchItemFallbackTitle(e))}`,...i.map(e=>` ${e}`)];if(!e.description)return a.join(`
1
+ import{NOT_AN_AGENT_MESSAGE,hasInteractiveTerminal}from"./preconditions.js";import{runRegistryPackage}from"./registry-package.js";import{eveMetadataFromRegistryItem}from"./registry-metadata.js";import{addRegistryMappings,readRegistryConfig}from"./registry-project.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{createCliTheme,sanitizeForTerminal}from"#cli/ui/output.js";import{isEveProject}from"#setup/scaffold/index.js";import{createPrompter}from"#setup/prompter.js";import{WizardCancelledError}from"#setup/step.js";import{addRegistryItems,getRegistryItems,searchRegistries}from"#compiled/shadcn-registry/index.js";import{clipVisible,wrapVisibleLine}from"#cli/ui/terminal-text.js";import semver from"#compiled/semver/index.js";const defaultAddCommandDependencies={createPrompter,hasInteractiveTerminal,loadSetupCommandRunner:async()=>(await import(`./registry-setup-command.js`)).runRegistrySetupCommand};function resolveOfficialRegistryUrl(e=process.env.EVE_DEV_OFFICIAL_REGISTRY_URL){if(e===void 0)return`https://eve.dev/r`;let t;try{t=new URL(e)}catch{throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`)}if(t.protocol!==`http:`&&t.protocol!==`https:`)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`);if(t.username!==``||t.password!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include credentials.`);if(t.search!==``||t.hash!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include a query or fragment.`);return t.pathname=t.pathname.replace(/\/+$/,``),t.toString().replace(/\/$/,``)}const OFFICIAL_REGISTRY=resolveOfficialRegistryUrl(),OFFICIAL_CATALOG=`${OFFICIAL_REGISTRY}/registry.json`,SKILLS_REGISTRY=`@skills`;function isRegistryAddress(e){return e.startsWith(`@`)||/^https?:\/\//.test(e)}function itemAddress(e){return isRegistryAddress(e)?e:`${OFFICIAL_REGISTRY}/${e}.json`}async function installOfficialRegistryItem(e,t,n={}){let r=await readEveRegistryConfig(e);await addRegistryItems([itemAddress(t)],{config:r,cwd:e,overwrite:n.overwrite})}function setupResumeCommand(e){return`eve add ${/^[\w@./:-]+$/.test(e)?e:`'${e.replaceAll(`'`,`'\\''`)}'`} --skip-install`}function setupReminder(e,t){return`${t===`cancelled`?`Setup cancelled.`:`Setup skipped.`} Run \`${setupResumeCommand(e)}\` when you're ready.`}function assertCompatibleEveVersion(e){if(e===void 0)return;let t=resolveInstalledPackageInfo().version;if(semver.validRange(e)===null)throw Error(`Registry item has an invalid eve version requirement: ${e}.`);if(!semver.subset(t,e))throw Error(`This registry item requires eve ${e}, but this project is using eve ${t}. Upgrade eve and run the command again.`)}function isOfficialItemAddress(e){return e.startsWith(`${OFFICIAL_REGISTRY}/`)}function errorMessage(e){return e instanceof Error?e.message:String(e)}async function runRegistryAction(t,n,r){if(!await isEveProject(n)){t.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1;return}try{await r()}catch(e){if(e instanceof WizardCancelledError)return;t.error(errorMessage(e)),process.exitCode=1}}function withBuiltInRegistries(e){return{...e,registries:{[SKILLS_REGISTRY]:`https://www.skills.sh/r/{name}?agent=eve`,...e.registries}}}async function readEveRegistryConfig(e){return withBuiltInRegistries(await readRegistryConfig(e))}function configuredRegistrySources(e){return Object.keys(e.registries??{})}function validateRegistrySource(e){if(e!==void 0&&!isRegistryAddress(e))throw Error(`Registry sources must be a namespace or URL: ${e}`)}function normalizeRegistryText(e){return sanitizeForTerminal(e).replaceAll(`\\"`,`"`).replaceAll(`\\'`,`'`).replaceAll(/\s+/gu,` `).trim()}function registryDescriptionSummary(e){let t=normalizeRegistryText(e);return t.match(/^.*?[.!?](?=\s|$)/u)?.[0]??t}function searchItemAddress(e){return normalizeRegistryText(e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument)}function searchItemFallbackTitle(e){let t=normalizeRegistryText(e.name);return t.split(`/`).at(-1)??t}function renderSearchItem(e,t,n){let r=Math.max(1,t-4),i=wrapVisibleLine(searchItemAddress(e),r),a=[` ${n.label(searchItemFallbackTitle(e))}`,...i.map(e=>` ${e}`)];if(!e.description)return a.join(`
2
2
  `);let o=registryDescriptionSummary(e.description);if(o.length===0)return a.join(`
3
3
  `);let s=wrapVisibleLine(o,r),c=s.length<=2?s:[s[0],`${clipVisible(s[1],Math.max(1,r-1)).trimEnd()}…`];return a.push(...c.map(e=>n.muted(` ${e}`))),a.join(`
4
- `)}function registrySourceLabel(e){return e===OFFICIAL_CATALOG?`eve`:e===SKILLS_REGISTRY?`skills.sh`:e}function printSearchResults(e,t,n){if(n.json){e.log(JSON.stringify(t,null,2));return}if(t.items.length===0){let t=n.query&&normalizeRegistryText(n.query);e.log(t?`No registry items match "${t}".`:`No registry items found.`);return}let r=createCliTheme(),i=Math.max(20,process.stdout.columns??80),o=n.sources.flatMap(e=>{let t=n.resultsBySource.get(e);if(t===void 0||t.items.length===0)return[];let{pagination:a}=t,o=`${a.total} result${a.total===1?``:`s`}`,s=t.items.length<a.total?`showing ${t.items.length} of ${o}`:o;return[[`${r.label(registrySourceLabel(e))} ${r.muted(`(${s})`)}`,...t.items.map(e=>renderSearchItem(e,i,r))].join(`
5
- `)]});e.log(o.join(`
6
- `))}async function searchRegistryCatalog(e,t){validateRegistrySource(t.source);let n=await readEveRegistryConfig(e),r=t.source?[t.source]:[OFFICIAL_CATALOG,...configuredRegistrySources(n).filter(e=>t.query!==void 0||e!==SKILLS_REGISTRY)],i=await Promise.all(r.map(async e=>{try{return{result:await searchRegistries([e],{config:n,limit:t.limit??100,query:t.query}),source:e}}catch(t){return{error:t,source:e}}})),a=[],o=new Map;for(let e of i)if(`error`in e)a.push({message:errorMessage(e.error),registry:e.source});else{let t=e.result.errors??[];if(a.push(...t),t.length===0){let t=e.result.items.filter(t=>t.registry===e.source);o.set(e.source,{...e.result,items:t,pagination:{...e.result.pagination,total:e.result.items.length===t.length?e.result.pagination.total:0}})}}let s=new Map(a.map(e=>[`${e.registry}\0${e.message}`,e])),c=[...o.values()];return{config:n,result:{items:c.flatMap(e=>e.items),pagination:{hasMore:c.some(e=>e.pagination.hasMore),limit:t.limit??100,offset:0,total:c.reduce((e,t)=>e+t.pagination.total,0)},...s.size>0?{errors:[...s.values()]}:{}},resultsBySource:o,sources:r}}function registryManifestTitle(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e.title;return typeof t==`string`?t:void 0}async function browseRegistryCatalog(e,t={}){let{config:n,result:r}=await searchRegistryCatalog(e,t),i=await Promise.all(r.items.map(async e=>{let[t]=await getRegistryItems([e.addCommandArgument],{config:n});return t}));return{items:r.items.map((e,t)=>{let n={address:e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument,name:e.name,source:e.registry===OFFICIAL_CATALOG?`Vercel`:e.registry},r=registryManifestTitle(i[t]);return r!==void 0&&(n.title=r),e.type!==void 0&&(n.type=e.type),e.description!==void 0&&(n.description=e.description),n}),total:r.pagination.total,errors:r.errors??[]}}async function browseRegistryItems(e,t,n,r,i={}){let{result:a,resultsBySource:o,sources:s}=await searchRegistryCatalog(t,{limit:i.limit,query:n,source:r}),c=a.errors??[];(i.json||o.size>0)&&printSearchResults(e,a,{...i,query:n,resultsBySource:o,sources:s});for(let t of c)e.error(`${t.registry}: ${t.message}`);c.length>0&&(process.exitCode=1)}async function getRegistryItemManifest(e,t){let n=await readEveRegistryConfig(e),r=await getRegistryItems([itemAddress(t)],{config:n});return r.length===1?r[0]:r}async function runDeclaredSetup(e,t,n,r,i,a){if(r===void 0)return;let o=await a.loadSetupCommandRunner();try{let a=i.prompter??createPrompter(),s=await o(t,{...r,args:[...r.args,...i.yes?[`--yes`]:[]]},n,{prompter:a,signal:i.signal});if(s.kind===`cancelled`)e.log(setupReminder(n,`cancelled`));else for(let t of s.output)e.log(t)}catch(e){throw Error(`${errorMessage(e)} Try again with \`${setupResumeCommand(n)}\`.`)}}async function installRegistryItem(e,t,n={},r=defaultAddCommandDependencies){let i,a=[],o={error:e=>{i=e},log:e=>a.push(e)},s=process.exitCode;if(await runAddCommand(o,e,t,{...n,yes:!0},r),process.exitCode=s,i!==void 0)throw Error(i);return a}async function runAddCommand(e,t,n,r,i=defaultAddCommandDependencies){await runRegistryAction(e,t,async()=>{let a=await readEveRegistryConfig(t),o=itemAddress(n);if(r.skipInstall===!0){if(r.overwrite===!0)throw Error(`--overwrite cannot be used with --skip-install.`);if(r.skipSetup===!0)throw Error(`--skip-install cannot be used with --skip-setup.`);if(!isOfficialItemAddress(o))throw Error(`Setup flows are currently supported only for official eve registry items.`)}let[s]=await getRegistryItems([o],{config:a}),c=isOfficialItemAddress(o)?eveMetadataFromRegistryItem(s):void 0;if(assertCompatibleEveVersion(c?.requires),r.skipInstall===!0){if(c?.setup===void 0)throw Error(`Registry item "${n}" does not declare a setup flow.`);await runDeclaredSetup(e,t,n,c.setup,r,i);return}if(await addRegistryItems([o],{config:a,cwd:t,overwrite:r.overwrite,silent:r.silent}),c?.setup===void 0)return;let l=i.isInteractive?.()??defaultAddCommandDependencies.isInteractive();if(r.skipSetup===!0||!r.yes&&!l){e.log(setupReminder(n,`skipped`));return}if(!r.yes)try{if(await(i.createPrompter?.()??defaultAddCommandDependencies.createPrompter()).select({message:`Set up ${n} now?`,initialValue:`yes`,options:[{value:`yes`,label:`Yes`},{value:`no`,label:`No`}]})===`no`){e.log(setupReminder(n,`skipped`));return}}catch(t){if(!(t instanceof WizardCancelledError))throw t;e.log(setupReminder(n,`cancelled`));return}await runDeclaredSetup(e,t,n,c.setup,r,i)})}async function runRegistryAddCommand(e,n,r){await runRegistryAction(e,n,async()=>{let i=await addRegistryMappings(n,r);for(let t of i.skippedBuiltIn)e.log(`Skipped ${t} because it is built in.`);for(let t of i.skippedExisting)e.log(`Skipped ${t} because it is already configured.`);i.added.length>0&&e.log(`Added ${i.added.join(`, `)} to package.json.`)})}async function runRegistryListCommand(e,t,n,r={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,void 0,n,r))}async function runRegistrySearchCommand(e,t,n,r,i={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,n,r,{...i,limit:i.limit??10}))}async function runRegistryViewCommand(e,t,n){await runRegistryAction(e,t,async()=>{let r=await readEveRegistryConfig(t),i=await getRegistryItems([itemAddress(n)],{config:r});e.log(JSON.stringify(i.length===1?i[0]:i,null,2))})}export{browseRegistryCatalog,getRegistryItemManifest,installOfficialRegistryItem,installRegistryItem,resolveOfficialRegistryUrl,runAddCommand,runRegistryAddCommand,runRegistryListCommand,runRegistrySearchCommand,runRegistryViewCommand};
4
+ `)}function registrySourceLabel(e){return e===OFFICIAL_CATALOG?`eve`:e===SKILLS_REGISTRY?`skills.sh`:e}function printSearchResults(e,t,n){if(n.json){e.log(JSON.stringify(t,null,2));return}if(t.items.length===0){let t=n.query&&normalizeRegistryText(n.query);e.log(t?`No registry items match "${t}".`:`No registry items found.`);return}let r=createCliTheme(),i=Math.max(20,process.stdout.columns??80),a=n.sources.flatMap(e=>{let t=n.resultsBySource.get(e);if(t===void 0||t.items.length===0)return[];let{pagination:a}=t,o=`${a.total} result${a.total===1?``:`s`}`,s=t.items.length<a.total?`showing ${t.items.length} of ${o}`:o;return[[`${r.label(registrySourceLabel(e))} ${r.muted(`(${s})`)}`,...t.items.map(e=>renderSearchItem(e,i,r))].join(`
5
+ `)]});e.log(a.join(`
6
+ `))}async function searchRegistryCatalog(e,t){validateRegistrySource(t.source);let n=await readEveRegistryConfig(e),r=t.source?[t.source]:[OFFICIAL_CATALOG,...configuredRegistrySources(n).filter(e=>t.query!==void 0||e!==SKILLS_REGISTRY)],i=await Promise.all(r.map(async e=>{try{return{result:await searchRegistries([e],{config:n,limit:t.limit??100,query:t.query}),source:e}}catch(t){return{error:t,source:e}}})),a=[],o=new Map;for(let e of i)if(`error`in e)a.push({message:errorMessage(e.error),registry:e.source});else{let t=e.result.errors??[];if(a.push(...t),t.length===0){let t=e.result.items.filter(t=>t.registry===e.source);o.set(e.source,{...e.result,items:t,pagination:{...e.result.pagination,total:e.result.items.length===t.length?e.result.pagination.total:0}})}}let s=new Map(a.map(e=>[`${e.registry}\0${e.message}`,e])),c=[...o.values()];return{config:n,result:{items:c.flatMap(e=>e.items),pagination:{hasMore:c.some(e=>e.pagination.hasMore),limit:t.limit??100,offset:0,total:c.reduce((e,t)=>e+t.pagination.total,0)},...s.size>0?{errors:[...s.values()]}:{}},resultsBySource:o,sources:r}}function registryManifestTitle(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e.title;return typeof t==`string`?t:void 0}async function browseRegistryCatalog(e,t={}){let{config:n,result:r}=await searchRegistryCatalog(e,t),i=await Promise.all(r.items.map(async e=>{let[t]=await getRegistryItems([e.addCommandArgument],{config:n});return t}));return{items:r.items.map((e,t)=>{let n={address:e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument,name:e.name,source:e.registry===OFFICIAL_CATALOG?`Vercel`:e.registry},r=registryManifestTitle(i[t]);return r!==void 0&&(n.title=r),e.type!==void 0&&(n.type=e.type),e.description!==void 0&&(n.description=e.description),n}),total:r.pagination.total,errors:r.errors??[]}}async function browseRegistryItems(e,t,n,r,i={}){let{result:a,resultsBySource:o,sources:s}=await searchRegistryCatalog(t,{limit:i.limit,query:n,source:r}),c=a.errors??[];(i.json||o.size>0)&&printSearchResults(e,a,{...i,query:n,resultsBySource:o,sources:s});for(let t of c)e.error(`${t.registry}: ${t.message}`);c.length>0&&(process.exitCode=1)}async function getRegistryItemManifest(e,t){let n=await readEveRegistryConfig(e),r=await getRegistryItems([itemAddress(t)],{config:n});return r.length===1?r[0]:r}async function runDeclaredSetups(e,t,n,r,i,a){if(r===void 0)return!0;let o=await a.loadSetupCommandRunner(),s=i.prompter??createPrompter();try{for(let a of r){let r=await o(t,{...a,args:[...a.args,...i.yes?[`--yes`]:[]]},n,{prompter:s,signal:i.signal});if(r.kind===`cancelled`)return e.log(setupReminder(n,`cancelled`)),!1;for(let t of r.output)e.log(t)}return!0}catch(e){throw Error(`${errorMessage(e)} Try again with \`${setupResumeCommand(n)}\`.`)}}async function installRegistryItem(e,t,n={},r=defaultAddCommandDependencies){let i,a=[],o={error:e=>{i=e},log:e=>a.push(e)},s=process.exitCode;if(await runAddCommand(o,e,t,{...n,yes:n.prompter===void 0||n.yes},r),process.exitCode=s,i!==void 0)throw Error(i);return a}async function runAddCommand(e,t,i,a,o=defaultAddCommandDependencies){await runRegistryAction(e,t,async()=>{let s=await readEveRegistryConfig(t),c=itemAddress(i);if(a.skipInstall===!0){if(a.overwrite===!0)throw Error(`--overwrite cannot be used with --skip-install.`);if(a.skipSetup===!0)throw Error(`--skip-install cannot be used with --skip-setup.`);if(!isOfficialItemAddress(c))throw Error(`Setup flows are currently supported only for official eve registry items.`)}let[l]=await getRegistryItems([c],{config:s}),u=isOfficialItemAddress(c)?eveMetadataFromRegistryItem(l):void 0;if(assertCompatibleEveVersion(u?.requires),u?.components!==void 0){if(!isOfficialItemAddress(c))throw Error(`Registry packages require the official eve registry.`);await runRegistryPackage({logger:e,appRoot:t,item:i,components:u.components,config:s,options:a,dependencies:o,operations:{itemAddress,metadata:eveMetadataFromRegistryItem,assertCompatibleVersion:assertCompatibleEveVersion,runSetups:({item:n,setups:r,prompter:i})=>runDeclaredSetups(e,t,n,r,{yes:a.yes,prompter:i,signal:a.signal},o),setupReminder:e=>setupReminder(e,`skipped`)}});return}if(a.skipInstall===!0){if(u?.setup===void 0)throw Error(`Registry item "${i}" does not declare a setup flow.`);await runDeclaredSetups(e,t,i,u.setup,a,o);return}if(await addRegistryItems([c],{config:s,cwd:t,overwrite:a.overwrite,silent:a.silent}),u?.setup===void 0)return;let d=o.hasInteractiveTerminal?.()??defaultAddCommandDependencies.hasInteractiveTerminal();if(a.skipSetup===!0||!a.yes&&!d){e.log(setupReminder(i,`skipped`));return}if(!a.yes)try{if(await(a.prompter??o.createPrompter?.()??defaultAddCommandDependencies.createPrompter()).select({message:`Set up ${i} now?`,initialValue:`yes`,options:[{value:`yes`,label:`Yes`},{value:`no`,label:`No`}]})===`no`){e.log(setupReminder(i,`skipped`));return}}catch(t){if(!(t instanceof WizardCancelledError))throw t;e.log(setupReminder(i,`cancelled`));return}await runDeclaredSetups(e,t,i,u.setup,a,o)})}async function runRegistryAddCommand(e,t,n){await runRegistryAction(e,t,async()=>{let r=await addRegistryMappings(t,n);for(let t of r.skippedBuiltIn)e.log(`Skipped ${t} because it is built in.`);for(let t of r.skippedExisting)e.log(`Skipped ${t} because it is already configured.`);r.added.length>0&&e.log(`Added ${r.added.join(`, `)} to package.json.`)})}async function runRegistryListCommand(e,t,n,r={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,void 0,n,r))}async function runRegistrySearchCommand(e,t,n,r,i={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,n,r,{...i,limit:i.limit??10}))}async function runRegistryViewCommand(e,t,n){await runRegistryAction(e,t,async()=>{let r=await readEveRegistryConfig(t),i=await getRegistryItems([itemAddress(n)],{config:r});e.log(JSON.stringify(i.length===1?i[0]:i,null,2))})}export{browseRegistryCatalog,getRegistryItemManifest,installOfficialRegistryItem,installRegistryItem,resolveOfficialRegistryUrl,runAddCommand,runRegistryAddCommand,runRegistryListCommand,runRegistrySearchCommand,runRegistryViewCommand};
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Span-level detail rendering and trace-level usage aggregation for
3
+ * `eve traces`. Kept separate from the command module: the tree renderer
4
+ * stays compact while these helpers answer "what does this span carry" —
5
+ * inline metric chips for tree rows, the `--verbose` per-span block, and
6
+ * the usage/cost totals summarized in the trace header.
7
+ */
8
+ import type { LocalTraceSpan } from "#tracing/local-trace-reader.js";
9
+ /** Usage and cost totals aggregated over a trace's `agent.step` spans. */
10
+ export interface LocalTraceSummary {
11
+ readonly cacheReadTokens: number;
12
+ readonly cacheWriteTokens: number;
13
+ /** Total gateway cost in USD; undefined when no span reported cost. */
14
+ readonly costUsd?: number;
15
+ readonly errorCount: number;
16
+ readonly inputTokens: number;
17
+ /** Distinct model ids seen on any span, first-seen order. */
18
+ readonly models: readonly string[];
19
+ readonly outputTokens: number;
20
+ }
21
+ /**
22
+ * Compact metrics for one tree row: token chips (`↑1.4K`/`↓213`), cost
23
+ * (`$0.0031`), and the tool name for `ai.toolCall` spans. Only chips whose
24
+ * attributes the span actually carries — rows without usage stay clean.
25
+ * Raw values: callers sanitize for their output surface.
26
+ */
27
+ export declare function spanMetricChips(span: LocalTraceSpan): string[];
28
+ /**
29
+ * Aggregates usage, cost, models, and errors across one trace. Only
30
+ * `agent.step` spans contribute usage: model spans carry the same counters
31
+ * and a subagent's totals already appear as its own step spans in the same
32
+ * trace, so summing anything else would double-count.
33
+ */
34
+ export declare function summarizeLocalTrace(spans: readonly LocalTraceSpan[]): LocalTraceSummary;
35
+ /** One-line `Tokens` header value: `↑1.2K in · ↓340 out · 1.1K cached`. */
36
+ export declare function formatTokenSummary(summary: LocalTraceSummary): string;
37
+ /** Formats a USD cost: `$1.50` at scale, `$0.0031` for typical spans. */
38
+ export declare function formatCostUsd(costUsd: number): string;
39
+ /**
40
+ * The `--verbose` block for one span: facts (status, timing, ids), every
41
+ * attribute sorted with payloads rendered as transcripts/pretty JSON, then
42
+ * every event with its offset from span start, rendered as `tree(1)`-style
43
+ * entries: each fact, attribute key, and event is an entry with a connector
44
+ * beneath the span's row, so the rails never break. Payload content wraps
45
+ * under its key on a plain margin. `childrenFollow` decides whether the last
46
+ * entry closes the branch — child span rows come after the detail entries.
47
+ */
48
+ export declare function renderSpanDetailTree(span: LocalTraceSpan, options: {
49
+ readonly childrenFollow: boolean;
50
+ readonly margin: string;
51
+ readonly mute: (text: string) => string;
52
+ readonly width: number;
53
+ }): string[];
@@ -0,0 +1 @@
1
+ import{sanitizeForTerminal}from"#cli/ui/output.js";import{formatElapsed}from"#cli/format-elapsed.js";import{formatCompactTokenCount}from"#cli/dev/tui/stream-format.js";import{formatAttributeContent}from"#cli/dev/tui/traces/trace-content.js";function spanMetricChips(e){let t=[],r=numberAttribute(e,`agent.usage.input_tokens`),i=numberAttribute(e,`agent.usage.output_tokens`);r!==void 0&&t.push(`↑${formatCompactTokenCount(r)}`),i!==void 0&&t.push(`↓${formatCompactTokenCount(i)}`);let a=spanCostUsd(e);if(a!==void 0&&t.push(formatCostUsd(a)),e.name===`ai.toolCall`){let n=e.attributes[`gen_ai.tool.name`];typeof n==`string`&&n.length>0&&t.push(n)}return t}function summarizeLocalTrace(e){let t=[],n=0,r=0,i,a=0,o=0,s=0;for(let c of e){let e=stringAttribute(c,`agent.model.id`)??stringAttribute(c,`gen_ai.request.model`);if(e!==void 0&&!t.includes(e)&&t.push(e),c.statusCode===2&&(a+=1),c.name!==`agent.step`)continue;o+=numberAttribute(c,`agent.usage.input_tokens`)??0,s+=numberAttribute(c,`agent.usage.output_tokens`)??0,n+=numberAttribute(c,`gen_ai.usage.cache_read.input_tokens`)??0,r+=numberAttribute(c,`gen_ai.usage.cache_creation.input_tokens`)??0;let l=spanCostUsd(c);l!==void 0&&(i=(i??0)+l)}return{cacheReadTokens:n,cacheWriteTokens:r,costUsd:i,errorCount:a,inputTokens:o,models:t,outputTokens:s}}function formatTokenSummary(e){let t=[`↑${formatCompactTokenCount(e.inputTokens)} in`,`↓${formatCompactTokenCount(e.outputTokens)} out`];return e.cacheReadTokens>0&&t.push(`${formatCompactTokenCount(e.cacheReadTokens)} cached`),e.cacheWriteTokens>0&&t.push(`${formatCompactTokenCount(e.cacheWriteTokens)} cache write`),t.join(` · `)}function formatCostUsd(e){return e>=1?`$${e.toFixed(2)}`:`$${e.toFixed(4)}`}function renderSpanDetailTree(e,t){let n=spanDetailEntries(e,t.width-t.margin.length-3),r=[];return n.forEach((e,r)=>{let i=r===n.length-1&&!t.childrenFollow;emit(e,t.margin,i?`└─ `:`├─ `)}),r;function emit(e,n,i){r.push(t.mute(`${n}${i}${e.head}`));let a=`${n}${i===`└─ `?` `:`│ `}`;for(let n of e.lines)r.push(t.mute(`${a} ${n}`));e.entries.forEach((t,n)=>{emit(t,a,n===e.entries.length-1?`└─ `:`├─ `)})}}function spanDetailEntries(n,i){let dim=e=>e,a=Math.max(40,i),o=[],push=(e,t=[],n=[])=>{o.push({entries:n,head:e,lines:t})},s=n.statusCode===2;push(`status: ${s&&n.statusMessage!==void 0?`ERROR — ${sanitizeForTerminal(n.statusMessage)}`:s?`ERROR`:`ok`}`),push(`duration: ${formatElapsed(durationMs(n.startTimeNs,n.endTimeNs))}`),push(`started: ${new Date(Number(n.startTimeNs/1000000n)).toISOString()}`),push(`span: ${n.spanId}`),n.parentSpanId!==void 0&&push(`parent: ${n.parentSpanId}`),n.scope!==void 0&&push(`scope: ${sanitizeForTerminal(n.scope)}`),n.kind!==void 0&&n.kind!==1&&push(`kind: ${spanKind(n.kind)}`);for(let t of Object.keys(n.attributes).sort()){let i=formatAttributeContent(t,n.attributes[t],dim,a-2),o=sanitizeForTerminal(t);i.length===1?push(`${o}: ${i[0]}`):push(`${o}:`,i)}return n.events.length>0&&push(`events:`,[],n.events.map(i=>{let o=Math.max(0,durationMs(n.startTimeNs,i.timeNs)),s=[];for(let t of Object.keys(i.attributes).sort()){let n=formatAttributeContent(t,i.attributes[t],dim,a-6),o=sanitizeForTerminal(t);n.length===1?s.push(`${o}: ${n[0]}`):s.push(`${o}:`,...n.map(e=>` ${e}`))}return{entries:[],head:`${sanitizeForTerminal(i.name)} +${formatElapsed(o)}`,lines:s}})),o}function spanCostUsd(e){return numberAttribute(e,`gen_ai.usage.gateway_cost`)??numberAttribute(e,`gen_ai.usage.cost`)}function spanKind(e){switch(e){case 2:return`server`;case 3:return`client`;case 4:return`producer`;case 5:return`consumer`;default:return`unknown (${e})`}}function numberAttribute(e,t){let n=e.attributes[t];if(typeof n==`number`)return n;if(typeof n==`string`&&n!==``){let e=Number(n);return Number.isFinite(e)?e:void 0}}function stringAttribute(e,t){let n=e.attributes[t];return typeof n==`string`&&n.length>0?n:void 0}function durationMs(e,t){return Number(t-e)/1e6}export{formatCostUsd,formatTokenSummary,renderSpanDetailTree,spanMetricChips,summarizeLocalTrace};
@@ -11,5 +11,8 @@ export declare function resolveLocalTraces(traces: readonly LocalTrace[], refere
11
11
  export declare function runTraceListCommand(logger: CliTraceLogger, appRoot: string, options?: {
12
12
  readonly json?: boolean;
13
13
  }): Promise<void>;
14
- export declare function runTraceShowCommand(logger: CliTraceLogger, appRoot: string, reference?: string): Promise<void>;
14
+ export declare function runTraceShowCommand(logger: CliTraceLogger, appRoot: string, reference?: string, options?: {
15
+ readonly json?: boolean;
16
+ readonly verbose?: boolean;
17
+ }): Promise<void>;
15
18
  export {};
@@ -1,8 +1,8 @@
1
- import{basename}from"node:path";import{createCliTheme,renderCliSection,sanitizeForTerminal}from"#cli/ui/output.js";import{formatElapsed}from"#cli/format-elapsed.js";import{compareLocalTraceSpans,describeLocalTraceSpan,listLocalTraces}from"#tracing/local-trace-reader.js";const TRACE_DISPLAY_DIRECTORY=`.eve/traces/v1`;function resolveLocalTraces(t,n){let i=n.replaceAll(`\\`,`/`),a=basename(i),o=i===a?[i]:[i,a],s=t.find(e=>o.includes(e.traceId));if(s!==void 0)return[s];let c=t.filter(e=>e.sessionIds.some(e=>o.includes(e)));if(c.length>0)return orderWindows(c);let l=t.filter(e=>o.some(t=>e.traceId.startsWith(t)||e.sessionIds.some(e=>e.startsWith(t))));if(l.length===0)throw Error(`No local trace matches "${sanitizeForTerminal(n)}". Run \`eve traces ls\` to list traces.`);if(l.length===1)return l;if(new Set(l.map(e=>e.sessionId??e.traceId)).size>1)throw ambiguousTraceError(l,n);return orderWindows(l)}function orderWindows(e){return[...e].sort((e,t)=>e.startTimeNs===t.startTimeNs?e.traceId.localeCompare(t.traceId):e.startTimeNs<t.startTimeNs?-1:1)}async function runTraceListCommand(e,t,n={}){let a=await listLocalTraces(t);if(n.json===!0){e.log(JSON.stringify(a.map(e=>({agentName:e.agentName??null,durationMs:durationMs(e.startTimeNs,e.endTimeNs),sessionId:e.sessionId??null,spanCount:e.spans.length,startedAt:toDate(e.startTimeNs).toISOString(),traceId:e.traceId})),null,2));return}if(a.length===0){e.log(`No local traces found under ${TRACE_DISPLAY_DIRECTORY}.`);return}let o=a.map(e=>[e.traceId,sanitizeForTerminal(e.sessionId??`unknown`),sanitizeForTerminal(e.agentName??`unknown`),toDate(e.startTimeNs).toISOString(),formatElapsed(durationMs(e.startTimeNs,e.endTimeNs)),String(e.spans.length)]),l=[`TRACE`,`SESSION`,`AGENT`,`STARTED`,`DURATION`,`SPANS`],u=l.map((e,t)=>Math.max(e.length,...o.map(e=>e[t].length)));e.log([l,...o].map(e=>e.map((e,t)=>e.padEnd(u[t])).join(` `).trimEnd()).join(`
2
- `))}async function runTraceShowCommand(e,r,a){let o=await listLocalTraces(r);if(o.length===0){let t=`No local traces found under ${TRACE_DISPLAY_DIRECTORY}.`;if(a!==void 0)throw Error(t);e.log(t);return}let l=a===void 0?[o[0]]:resolveLocalTraces(o,a),u=createCliTheme();e.log(l.map(e=>[renderCliSection(u,{rows:[{label:`Trace ID`,value:e.traceId},{label:`Session ID`,value:e.sessionId??`unknown`},...e.window===void 0?[]:[{label:`Window`,value:String(e.window)}],{label:`Agent`,value:e.agentName??`unknown`},{label:`Started`,value:toDate(e.startTimeNs).toISOString()},{label:`Duration`,value:formatElapsed(durationMs(e.startTimeNs,e.endTimeNs))},{label:`Spans`,value:String(e.spans.length)}],title:`Trace`}),`${u.accent(`Spans`)}\n${renderSpanTree(e.spans)}`].join(`
1
+ import{basename}from"node:path";import{createCliTheme,renderCliSection,sanitizeForTerminal}from"#cli/ui/output.js";import{formatElapsed}from"#cli/format-elapsed.js";import{formatCostUsd,formatTokenSummary,renderSpanDetailTree,spanMetricChips,summarizeLocalTrace}from"#cli/commands/trace-detail.js";import{compareLocalTraceSpans,describeLocalTraceSpan,listLocalTraces}from"#tracing/local-trace-reader.js";const TRACE_DISPLAY_DIRECTORY=`.eve/traces/v1`;function resolveLocalTraces(t,n){let i=n.replaceAll(`\\`,`/`),a=basename(i),o=i===a?[i]:[i,a],s=t.find(e=>o.includes(e.traceId));if(s!==void 0)return[s];let c=t.filter(e=>e.sessionIds.some(e=>o.includes(e)));if(c.length>0)return orderWindows(c);let l=t.filter(e=>o.some(t=>e.traceId.startsWith(t)||e.sessionIds.some(e=>e.startsWith(t))));if(l.length===0)throw Error(`No local trace matches "${sanitizeForTerminal(n)}". Run \`eve traces ls\` to list traces.`);if(l.length===1)return l;if(new Set(l.map(e=>e.sessionId??e.traceId)).size>1)throw ambiguousTraceError(l,n);return orderWindows(l)}function orderWindows(e){return[...e].sort((e,t)=>e.startTimeNs===t.startTimeNs?e.traceId.localeCompare(t.traceId):e.startTimeNs<t.startTimeNs?-1:1)}async function runTraceListCommand(e,t,n={}){let a=await listLocalTraces(t);if(n.json===!0){e.log(JSON.stringify(a.map(e=>({agentName:e.agentName??null,durationMs:durationMs(e.startTimeNs,e.endTimeNs),sessionId:e.sessionId??null,spanCount:e.spans.length,startedAt:toDate(e.startTimeNs).toISOString(),traceId:e.traceId})),null,2));return}if(a.length===0){e.log(`No local traces found under ${TRACE_DISPLAY_DIRECTORY}.`);return}let o=a.map(e=>[e.traceId,sanitizeForTerminal(e.sessionId??`unknown`),sanitizeForTerminal(e.agentName??`unknown`),toDate(e.startTimeNs).toISOString(),formatElapsed(durationMs(e.startTimeNs,e.endTimeNs)),String(e.spans.length)]),s=[`TRACE`,`SESSION`,`AGENT`,`STARTED`,`DURATION`,`SPANS`],c=s.map((e,t)=>Math.max(e.length,...o.map(e=>e[t].length)));e.log([s,...o].map(e=>e.map((e,t)=>e.padEnd(c[t])).join(` `).trimEnd()).join(`
2
+ `))}async function runTraceShowCommand(e,r,i,a={}){let o=await listLocalTraces(r);if(o.length===0){let t=`No local traces found under ${TRACE_DISPLAY_DIRECTORY}.`;if(i!==void 0)throw Error(t);e.log(t);return}let s=i===void 0?[o[0]]:resolveLocalTraces(o,i);if(a.json===!0){e.log(JSON.stringify(s.map(serializeTraceForJson),null,2));return}let c=createCliTheme();e.log(s.map(e=>[renderCliSection(c,{rows:traceHeaderRows(e),title:`Trace`}),`${c.accent(`Spans`)}\n${renderSpanTree(e.spans,{dim:c.muted,verbose:a.verbose===!0})}`].join(`
3
3
 
4
4
  `)).join(`
5
5
 
6
- `))}function renderSpanTree(e){let t=new Map(e.map(e=>[e.spanId,e])),n=new Map,r=[];for(let i of e)if(i.parentSpanId===void 0||!t.has(i.parentSpanId))r.push(i);else{let e=n.get(i.parentSpanId)??[];e.push(i),n.set(i.parentSpanId,e)}r.sort(compareLocalTraceSpans);for(let e of n.values())e.sort(compareLocalTraceSpans);let i=subtreeExtents(e,n),o=[],s=new Set,render=(e,t,r)=>{if(s.has(e.spanId))return;s.add(e.spanId),o.push(`${t}${r}${spanLabel(e,i.get(e.spanId))}`);let a=n.get(e.spanId)??[];a.forEach((e,n)=>{let i=n===a.length-1;render(e,`${t}${r===``?``:r===`└─ `?` `:`│ `}`,i?`└─ `:`├─ `)})};for(let e of r)render(e,``,``);for(let t of[...e].sort(compareLocalTraceSpans))s.has(t.spanId)||render(t,``,``);return o.join(`
7
- `)}function subtreeExtents(e,t){let n=new Map,r=new Set,visit=e=>{let i=n.get(e.spanId);if(i!==void 0)return i;if(r.has(e.spanId))return{endTimeNs:e.endTimeNs,startTimeNs:e.startTimeNs};r.add(e.spanId);let a=e.endTimeNs,o=e.startTimeNs;for(let n of t.get(e.spanId)??[]){let e=visit(n);e.startTimeNs<o&&(o=e.startTimeNs),e.endTimeNs>a&&(a=e.endTimeNs)}r.delete(e.spanId);let s={endTimeNs:a,startTimeNs:o};return n.set(e.spanId,s),s};for(let t of e)visit(t);return n}function spanLabel(e,t){let n=describeLocalTraceSpan(e).map(sanitizeForTerminal),a=n.length===0?``:` [${n.join(`, `)}]`,s=e.statusCode===2?` ERROR`:``,c=durationMs(e.startTimeNs,e.endTimeNs),l=c===0&&t!==void 0?durationMs(t.startTimeNs,t.endTimeNs):c;return`${sanitizeForTerminal(e.name)}${a} ${formatElapsed(l)}${s}`}function durationMs(e,t){return Number(t-e)/1e6}function toDate(e){return new Date(Number(e/1000000n))}function ambiguousTraceError(e,t){return Error([`"${sanitizeForTerminal(t)}" matches ${e.length} local traces:`,...e.map(e=>` ${e.traceId} ${sanitizeForTerminal(e.sessionId??`unknown session`)}`),`Pass a longer prefix or the full trace/session id.`].join(`
6
+ `))}function traceHeaderRows(e){let t=summarizeLocalTrace(e.spans);return[{label:`Trace ID`,value:e.traceId},{label:`Session ID`,value:e.sessionId??`unknown`},...e.window===void 0?[]:[{label:`Window`,value:String(e.window)}],{label:`Agent`,value:e.agentName??`unknown`},{label:`Started`,value:toDate(e.startTimeNs).toISOString()},{label:`Duration`,value:formatElapsed(durationMs(e.startTimeNs,e.endTimeNs))},{label:`Spans`,value:String(e.spans.length)},...t.models.length===0?[]:[{label:`Models`,value:t.models.join(`, `)}],...t.inputTokens===0&&t.outputTokens===0?[]:[{label:`Tokens`,value:formatTokenSummary(t)}],...t.costUsd===void 0?[]:[{label:`Cost`,value:formatCostUsd(t.costUsd)}],...t.errorCount===0?[]:[{label:`Errors`,value:`${t.errorCount} span${t.errorCount===1?``:`s`}`}]]}function serializeTraceForJson(e){return{agentName:e.agentName??null,durationMs:durationMs(e.startTimeNs,e.endTimeNs),sessionId:e.sessionId??null,sessionIds:e.sessionIds,spanCount:e.spans.length,spans:e.spans.map(e=>({attributes:e.attributes,durationMs:durationMs(e.startTimeNs,e.endTimeNs),endTimeNs:e.endTimeNs.toString(),events:e.events.map(e=>({attributes:e.attributes,name:e.name,timeNs:e.timeNs.toString()})),kind:e.kind??null,name:e.name,parentSpanId:e.parentSpanId??null,scope:e.scope??null,spanId:e.spanId,startTimeNs:e.startTimeNs.toString(),statusCode:e.statusCode,statusMessage:e.statusMessage??null})),startedAt:toDate(e.startTimeNs).toISOString(),traceId:e.traceId,window:e.window??null}}function renderSpanTree(e,t={}){let n=new Map(e.map(e=>[e.spanId,e])),r=new Map,i=[];for(let t of e)if(t.parentSpanId===void 0||!n.has(t.parentSpanId))i.push(t);else{let e=r.get(t.parentSpanId)??[];e.push(t),r.set(t.parentSpanId,e)}i.sort(compareLocalTraceSpans);for(let e of r.values())e.sort(compareLocalTraceSpans);let a=subtreeExtents(e,r),o=terminalWidth(),c=[],l=new Set,d=t.dim??(e=>e),render=(e,n,i)=>{if(l.has(e.spanId))return;l.add(e.spanId);let u=`${n}${i}`;c.push(`${u===``?``:d(u)}${spanLabel(e,a.get(e.spanId))}`);let f=`${n}${i===``?``:i===`└─ `?` `:`│ `}`,p=r.get(e.spanId)??[];if(t.verbose===!0)for(let t of renderSpanDetailTree(e,{childrenFollow:p.length>0,margin:f,mute:d,width:o}))c.push(t);p.forEach((e,t)=>{let n=t===p.length-1;render(e,f,n?`└─ `:`├─ `)})};for(let e of i)render(e,``,``);for(let t of[...e].sort(compareLocalTraceSpans))l.has(t.spanId)||render(t,``,``);return c.join(`
7
+ `)}function subtreeExtents(e,t){let n=new Map,r=new Set,visit=e=>{let i=n.get(e.spanId);if(i!==void 0)return i;if(r.has(e.spanId))return{endTimeNs:e.endTimeNs,startTimeNs:e.startTimeNs};r.add(e.spanId);let a=e.endTimeNs,o=e.startTimeNs;for(let n of t.get(e.spanId)??[]){let e=visit(n);e.startTimeNs<o&&(o=e.startTimeNs),e.endTimeNs>a&&(a=e.endTimeNs)}r.delete(e.spanId);let s={endTimeNs:a,startTimeNs:o};return n.set(e.spanId,s),s};for(let t of e)visit(t);return n}function spanLabel(e,t){let n=describeLocalTraceSpan(e).map(sanitizeForTerminal),a=n.length===0?``:` [${n.join(`, `)}]`,o=spanMetricChips(e).map(sanitizeForTerminal),s=o.length===0?``:` ${o.join(` `)}`,l=e.statusCode===2?` ERROR`:``,u=durationMs(e.startTimeNs,e.endTimeNs),f=u===0&&t!==void 0?durationMs(t.startTimeNs,t.endTimeNs):u;return`${sanitizeForTerminal(e.name)}${a} ${formatElapsed(f)}${s}${l}`}function terminalWidth(){let e=process.stdout.columns;return typeof e==`number`&&e>=40?e:100}function durationMs(e,t){return Number(t-e)/1e6}function toDate(e){return new Date(Number(e/1000000n))}function ambiguousTraceError(e,t){return Error([`"${sanitizeForTerminal(t)}" matches ${e.length} local traces:`,...e.map(e=>` ${e.traceId} ${sanitizeForTerminal(e.sessionId??`unknown session`)}`),`Pass a longer prefix or the full trace/session id.`].join(`
8
8
  `))}export{resolveLocalTraces,runTraceListCommand,runTraceShowCommand};
@@ -9,14 +9,14 @@
9
9
  * Every returned line fits the given width; wrapped continuations keep a
10
10
  * two-space hanging indent so they read as part of their block.
11
11
  */
12
- import type { Theme } from "../theme.js";
13
12
  /**
14
13
  * Formats one attribute's value into display lines, each at most `width`
15
14
  * columns. A single scalar stays on one line so the panel can keep it beside
16
15
  * its key; multi-line content comes back unindented for the caller to nest
17
- * under the key.
16
+ * under the key. `dim` styles de-emphasized parts (role prefixes, the
17
+ * truncation notice), so callers pass their surface's dim style.
18
18
  */
19
- export declare function formatAttributeContent(key: string, value: unknown, theme: Theme, width: number): string[];
19
+ export declare function formatAttributeContent(key: string, value: unknown, dim: (text: string) => string, width: number): string[];
20
20
  /**
21
21
  * Wraps text to `width`, splitting on embedded newlines so a multi-line payload
22
22
  * keeps its shape, and stripping control bytes the frame must not carry.
@@ -1,2 +1,2 @@
1
- import{stripTerminalControls,visibleLength,wrapVisibleLine}from"#cli/ui/terminal-text.js";function formatAttributeContent(t,n,r,i){if(typeof n!=`string`)return Array.isArray(n)?prettyJson(n,i):[stripTerminalControls(shortJson(n))];if(t===`ai.prompt.messages`){let e=messageTranscript(n,r,i);if(e!==void 0)return e}return formatPayloadContent(n,i)}function wrapPlainText(t,r){return splitEmbeddedNewlines([stripTerminalControls(t)]).flatMap(e=>wrapVisibleLine(e,r))}function formatPayloadContent(e,t){let n=parseJson(e);return n!==void 0&&(Array.isArray(n)||isRecord(n))?prettyJson(n,t):wrapPlainText(e,t)}function messageTranscript(t,n,r){let i=parseJson(t);if(!Array.isArray(i))return;let a=0,o=[];for(let e of i){if(isRecord(e)&&isRecord(e[`eve.truncated`])){let t=e[`eve.truncated`].omittedMessages;if(typeof t==`number`){a+=t;continue}}o.push(e)}if(!o.every(e=>typeof e.role==`string`))return;let{colors:s}=n,c=[];a>0&&c.push(s.dim(`… ${a} earlier message${a===1?``:`s`} omitted (long context)`));for(let t of o){let n=messageContentParts(t.content),i=t.role===`tool`?toolRoleLabel(n):stripTerminalControls(String(t.role));n.forEach((e,t)=>{let n=t===0?`${s.dim(`${i}:`)} `:` `;c.push(...wrapPrefixed(n,e.text,e.dim?s.dim:void 0,r))})}return c}function toolRoleLabel(e){let t=e.find(e=>e.name!==void 0);return t?.name===void 0?`tool`:`tool ${t.name}`}function messageContentParts(t){if(typeof t==`string`)return[{text:stripTerminalControls(t)}];if(!Array.isArray(t))return[{text:shortJson(t)}];let n=[];for(let r of t){if(!isRecord(r)||typeof r.type!=`string`){n.push({text:shortJson(r)});continue}if(r.type===`text`&&typeof r.text==`string`)n.push({text:stripTerminalControls(r.text)});else if(r.type===`reasoning`){let t=typeof r.text==`string`?stripTerminalControls(r.text.trim()):``;n.push({dim:!0,text:t.length>0?`⟨reasoning⟩ ${t}`:`⟨reasoning⟩`})}else if(r.type===`tool-call`&&typeof r.toolName==`string`){let t=stripTerminalControls(r.toolName);n.push({name:t,text:`→ ${t}(${shortJson(r.input)})`})}else if(r.type===`tool-result`&&typeof r.toolName==`string`){let t=stripTerminalControls(r.toolName);n.push({name:t,text:toolOutputText(r.output)})}else n.push({text:shortJson(r)})}return n.length===0&&n.push({text:shortJson(t)}),n}function toolOutputText(t){return isRecord(t)&&typeof t.type==`string`&&`value`in t?t.type===`text`&&typeof t.value==`string`?stripTerminalControls(t.value):shortJson(t.value):shortJson(t)}function prettyJson(e,t){return JSON.stringify(e,null,2).split(`
1
+ import{stripTerminalControls,visibleLength,wrapVisibleLine}from"#cli/ui/terminal-text.js";function formatAttributeContent(t,n,r,i){if(typeof n!=`string`)return Array.isArray(n)?prettyJson(n,i):[stripTerminalControls(shortJson(n))];if(t===`ai.prompt.messages`){let e=messageTranscript(n,r,i);if(e!==void 0)return e}return formatPayloadContent(n,i)}function wrapPlainText(t,r){return splitEmbeddedNewlines([stripTerminalControls(t)]).flatMap(e=>wrapVisibleLine(e,r))}function formatPayloadContent(e,t){let n=parseJson(e);return n!==void 0&&(Array.isArray(n)||isRecord(n))?prettyJson(n,t):wrapPlainText(e,t)}function messageTranscript(t,n,r){let i=parseJson(t);if(!Array.isArray(i))return;let a=0,o=[];for(let e of i){if(isRecord(e)&&isRecord(e[`eve.truncated`])){let t=e[`eve.truncated`].omittedMessages;if(typeof t==`number`){a+=t;continue}}o.push(e)}if(!o.every(e=>typeof e.role==`string`))return;let s=[];a>0&&s.push(n(`… ${a} earlier message${a===1?``:`s`} omitted (long context)`));for(let t of o){let i=messageContentParts(t.content),a=t.role===`tool`?toolRoleLabel(i):stripTerminalControls(String(t.role));i.forEach((e,t)=>{let i=t===0?`${n(`${a}:`)} `:` `;s.push(...wrapPrefixed(i,e.text,e.dim?n:void 0,r))})}return s}function toolRoleLabel(e){let t=e.find(e=>e.name!==void 0);return t?.name===void 0?`tool`:`tool ${t.name}`}function messageContentParts(t){if(typeof t==`string`)return[{text:stripTerminalControls(t)}];if(!Array.isArray(t))return[{text:shortJson(t)}];let n=[];for(let r of t){if(!isRecord(r)||typeof r.type!=`string`){n.push({text:shortJson(r)});continue}if(r.type===`text`&&typeof r.text==`string`)n.push({text:stripTerminalControls(r.text)});else if(r.type===`reasoning`){let t=typeof r.text==`string`?stripTerminalControls(r.text.trim()):``;n.push({dim:!0,text:t.length>0?`⟨reasoning⟩ ${t}`:`⟨reasoning⟩`})}else if(r.type===`tool-call`&&typeof r.toolName==`string`){let t=stripTerminalControls(r.toolName);n.push({name:t,text:`→ ${t}(${shortJson(r.input)})`})}else if(r.type===`tool-result`&&typeof r.toolName==`string`){let t=stripTerminalControls(r.toolName);n.push({name:t,text:toolOutputText(r.output)})}else n.push({text:shortJson(r)})}return n.length===0&&n.push({text:shortJson(t)}),n}function toolOutputText(t){return isRecord(t)&&typeof t.type==`string`&&`value`in t?t.type===`text`&&typeof t.value==`string`?stripTerminalControls(t.value):shortJson(t.value):shortJson(t)}function prettyJson(e,t){return JSON.stringify(e,null,2).split(`
2
2
  `).flatMap(e=>wrapHanging(e,t,t))}function wrapPrefixed(e,n,r,i){let a=r??(e=>e),o=[];return splitEmbeddedNewlines([n]).forEach((n,r)=>{let s=r===0?e:` `,c=r===0?visibleLength(e):2;wrapHanging(n,i,Math.max(8,i-c)).forEach((e,t)=>{o.push(t===0?`${s}${a(e)}`:` ${a(e)}`)})}),o}function wrapHanging(e,r,i){let a=wrapVisibleLine(e,Math.max(8,r-2));if(visibleLength(a[0]??``)<=i)return a;let[o,...s]=wrapVisibleLine(a[0]??``,Math.max(8,i));return[o??``,...s,...a.slice(1)]}function splitEmbeddedNewlines(e){let t=e.flatMap(e=>e.split(/\r\n|\r|\n/));for(;t.length>1&&t[t.length-1]===``;)t.pop();return t}function shortJson(e){try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function parseJson(e){try{return JSON.parse(e)}catch{return}}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}export{formatAttributeContent,formatPayloadContent,prettyJson,splitEmbeddedNewlines,wrapPlainText};
@@ -1,2 +1,2 @@
1
- import{formatAttributeContent}from"./trace-content.js";import{renderConversationItem}from"./trace-conversation.js";import{orderedTextSelection,selectedTraceViewerSpan}from"./trace-viewer-state.js";import{formatElapsed}from"#cli/format-elapsed.js";import{clipVisible,sliceVisible,stripAnsi,stripTerminalControls,visibleLength,wrapVisibleLine}from"#cli/ui/terminal-text.js";import{describeLocalTraceSpan}from"#tracing/local-trace-reader.js";function renderTraceViewer(e,t){let{width:n,height:r,theme:i}=t,a=chromeStyles(i,t.surfaces),o=Math.max(1,r-3-3),s=e.panelOpen?panelWidthFor(n):0,c=Math.max(20,n-(s===0?0:s+1)),l=panelDetailLines(e,s,i,t.surfaces),u=o,d=[];if(d.push(...renderHeader(e,t)),e.traces.length===0)d.push(...renderEmptyState(t,i,o));else if(e.trace===void 0)d.push(...center(o,a.muted(`Loading trace…`)));else{let r=renderConversation(e,t,c,o);for(let t=0;t<o;t+=1){let i=r[t]??``;if(s===0){d.push(i);continue}let a=l[e.panelScroll+t]??``;e.textSelection!==void 0&&e.textSelection.region===`panel`&&(a=highlightSelection(a,e.panelScroll+t,e.textSelection,s)),d.push(joinPanels(i,c,a,n))}}return d.push(...renderFooter(e,n,i,t.surfaces)),t.toast!==void 0&&overlayToast(d,t.toast,n,i,t.surfaces),{rows:d,panelTotalRows:l.length,timelineViewportRows:o,panelViewportRows:u,contentWidth:c}}function chromeStyles(e,t){let n=e.color?t:void 0;return{muted:n?.mutedText??e.colors.dim,primary:n?.primaryText??(e=>e)}}function overlayToast(e,t,n,r,i){let a=` ${stripTerminalControls(t)} `,o=visibleLength(a),s=r.unicode?`▌`:r.glyph.rule,u=r.color?i:void 0,d=u===void 0?``:u.body,f=u?.primaryText??r.colors.white,p=r.color?`\x1B[0m`:``,m=[`${d}${f(s)}${` `.repeat(o)}${p}`,`${d}${f(s)}${f(a)}${p}`,`${d}${f(s)}${` `.repeat(o)}${p}`];for(let[t,r]of m.entries()){let i=2+t;if(i>=e.length)break;e[i]=overlayRight(e[i],r,n,1)}}function overlayRight(e,t,n,r){let i=Math.max(0,n-r-visibleLength(t)),a=visibleLength(e);return`${sliceVisible(a<i?e+` `.repeat(i-a):e,i)}\x1b[0m${t}`}const CONVERSATION_CONTENT_KEYS=new Set([`ai.prompt.messages`,`ai.prompt.system`,`ai.response.reasoning`,`ai.response.text`,`ai.response.tool_calls`,`ai.response.tool_results`,`gen_ai.tool.call.arguments`,`gen_ai.tool.call.result`]);function renderSpanDetail(t,n,r,o){let{colors:s}=r,{muted:l,primary:f}=chromeStyles(r,o?.surfaces),p=[],m=stripTerminalControls(t.name);p.push(...wrapVisibleLine(s.bold(f(m)),n));let h=describeLocalTraceSpan(t).map(stripTerminalControls);h.length>0&&p.push(l(h.join(`, `))),p.push(``);let fact=(e,t)=>`${l(e.padEnd(10))}${t}`,g=t.statusCode===2;p.push(fact(`status`,g?s.red(`ERROR`):s.green(`ok`))),p.push(fact(`duration`,formatElapsed(durationMs(t.startTimeNs,t.endTimeNs)))),p.push(fact(`started`,clockTime(t.startTimeNs))),p.push(fact(`span`,t.spanId)),t.parentSpanId!==void 0&&p.push(fact(`parent`,t.parentSpanId)),t.scope!==void 0&&p.push(fact(`scope`,stripTerminalControls(t.scope))),p.push(``);let _=Object.keys(t.attributes).filter(e=>o?.excludeKeys?.has(e)!==!0).sort();if(_.length===0)p.push(l(`no attributes`));else{p.push(l(`attributes (${_.length})`));for(let i of _){let a=formatAttributeContent(i,t.attributes[i],r,n-2),o=stripTerminalControls(i);if(a.length===1)p.push(...wrapVisibleLine(`${l(o)} ${a[0]}`,n));else{p.push(l(o));for(let e of a)p.push(` ${e}`)}}}return p.map(e=>clipVisible(e,n))}function renderHeader(e,t){let{theme:n,width:r}=t,{colors:o,glyph:s}=n,{muted:u,primary:d}=chromeStyles(n,t.surfaces),f=[];if(e.trace?.agentName!==void 0&&f.push(stripTerminalControls(e.trace.agentName)),e.trace?.sessionId!==void 0&&f.push(`session ${stripTerminalControls(e.trace.sessionId)}`),e.trace!==void 0){let n=t.activeWindowEndNs!==void 0&&t.activeWindowEndNs>e.trace.endTimeNs?t.activeWindowEndNs:e.trace.endTimeNs;f.push(clockTime(e.trace.startTimeNs),`${e.trace.spans.length} span${e.trace.spans.length===1?``:`s`}`,formatElapsed(durationMs(e.trace.startTimeNs,n)))}let p=`${o.bold(d(`${s.brand} traces`))}${f.length===0?``:u(` · ${f.join(` · `)}`)}`,m=e.traces.length===0?``:u(`[${e.traceIndex+1}/${e.traces.length}]`),h=[t.activeWindowEndNs===void 0?``:o.green(`● live`),m].filter(e=>e.length>0).join(` `);return[``,clipVisible(joinRight(` ${clipVisible(p,Math.max(0,r-visibleLength(h)-2))}`,h,r),r),``]}function renderConversation(e,t,n,r){let{theme:i}=t;if(e.conversationItems.length===0)return[chromeStyles(i,t.surfaces).muted(` No conversation content in this trace — content capture may be off (EVE_TRACES_CONTENT).`)];let a=conversationLines(e,n,i,t.surfaces).slice(e.scrollRow,e.scrollRow+r);return e.textSelection===void 0||e.textSelection.region!==`conversation`?a:a.map((t,r)=>highlightSelection(t,e.scrollRow+r,e.textSelection,n))}function conversationLines(e,n,r,i){let a=[];for(let o=0;o<e.conversationItems.length;o+=1)a.push(...renderConversationItem(e.conversationItems[o],n,r,o===e.selectedRow,e.expandedItems.has(o),i),``);return a}function panelDetailLines(e,t,n,i){let a=selectedTraceViewerSpan(e);return!e.panelOpen||t<=0||a===void 0?[]:[``,...renderSpanDetail(a,Math.max(16,t-3),n,{excludeKeys:CONVERSATION_CONTENT_KEYS,surfaces:i}).map(e=>` ${e}`)]}function conversationSelectionText(e,t,n,r,i){return selectionText(conversationLines(e,t,n,i),r)}function panelSelectionText(e,t,n,r){return selectionText(panelDetailLines(e,e.panelOpen?panelWidthFor(t):0,n),r)}function selectionText(e,t){let{start:r,end:i}=orderedTextSelection(t),a=[];for(let t=Math.max(0,r.line);t<=i.line&&t<e.length;t+=1){let n=stripAnsi(e[t]),c=t===r.line?r.column:0,l=t===i.line?i.column+1:1/0,u=l===1/0?n:sliceVisible(n,l),d=sliceVisible(n,c).length;a.push(u.slice(d).trimEnd())}return a.join(`
1
+ import{formatAttributeContent}from"./trace-content.js";import{renderConversationItem}from"./trace-conversation.js";import{orderedTextSelection,selectedTraceViewerSpan}from"./trace-viewer-state.js";import{formatElapsed}from"#cli/format-elapsed.js";import{clipVisible,sliceVisible,stripAnsi,stripTerminalControls,visibleLength,wrapVisibleLine}from"#cli/ui/terminal-text.js";import{describeLocalTraceSpan}from"#tracing/local-trace-reader.js";function renderTraceViewer(e,t){let{width:n,height:r,theme:i}=t,a=chromeStyles(i,t.surfaces),o=Math.max(1,r-3-3),s=e.panelOpen?panelWidthFor(n):0,c=Math.max(20,n-(s===0?0:s+1)),l=panelDetailLines(e,s,i,t.surfaces),u=o,d=[];if(d.push(...renderHeader(e,t)),e.traces.length===0)d.push(...renderEmptyState(t,i,o));else if(e.trace===void 0)d.push(...center(o,a.muted(`Loading trace…`)));else{let r=renderConversation(e,t,c,o);for(let t=0;t<o;t+=1){let i=r[t]??``;if(s===0){d.push(i);continue}let a=l[e.panelScroll+t]??``;e.textSelection!==void 0&&e.textSelection.region===`panel`&&(a=highlightSelection(a,e.panelScroll+t,e.textSelection,s)),d.push(joinPanels(i,c,a,n))}}return d.push(...renderFooter(e,n,i,t.surfaces)),t.toast!==void 0&&overlayToast(d,t.toast,n,i,t.surfaces),{rows:d,panelTotalRows:l.length,timelineViewportRows:o,panelViewportRows:u,contentWidth:c}}function chromeStyles(e,t){let n=e.color?t:void 0;return{muted:n?.mutedText??e.colors.dim,primary:n?.primaryText??(e=>e)}}function overlayToast(e,t,n,r,i){let a=` ${stripTerminalControls(t)} `,o=visibleLength(a),s=r.unicode?`▌`:r.glyph.rule,u=r.color?i:void 0,d=u===void 0?``:u.body,f=u?.primaryText??r.colors.white,p=r.color?`\x1B[0m`:``,m=[`${d}${f(s)}${` `.repeat(o)}${p}`,`${d}${f(s)}${f(a)}${p}`,`${d}${f(s)}${` `.repeat(o)}${p}`];for(let[t,r]of m.entries()){let i=2+t;if(i>=e.length)break;e[i]=overlayRight(e[i],r,n,1)}}function overlayRight(e,t,n,r){let i=Math.max(0,n-r-visibleLength(t)),a=visibleLength(e);return`${sliceVisible(a<i?e+` `.repeat(i-a):e,i)}\x1b[0m${t}`}const CONVERSATION_CONTENT_KEYS=new Set([`ai.prompt.messages`,`ai.prompt.system`,`ai.response.reasoning`,`ai.response.text`,`ai.response.tool_calls`,`ai.response.tool_results`,`gen_ai.tool.call.arguments`,`gen_ai.tool.call.result`]);function renderSpanDetail(t,n,r,o){let{colors:s}=r,{muted:l,primary:f}=chromeStyles(r,o?.surfaces),p=[],m=stripTerminalControls(t.name);p.push(...wrapVisibleLine(s.bold(f(m)),n));let h=describeLocalTraceSpan(t).map(stripTerminalControls);h.length>0&&p.push(l(h.join(`, `))),p.push(``);let fact=(e,t)=>`${l(e.padEnd(10))}${t}`,g=t.statusCode===2;p.push(fact(`status`,g?s.red(`ERROR`):s.green(`ok`))),p.push(fact(`duration`,formatElapsed(durationMs(t.startTimeNs,t.endTimeNs)))),p.push(fact(`started`,clockTime(t.startTimeNs))),p.push(fact(`span`,t.spanId)),t.parentSpanId!==void 0&&p.push(fact(`parent`,t.parentSpanId)),t.scope!==void 0&&p.push(fact(`scope`,stripTerminalControls(t.scope))),p.push(``);let _=Object.keys(t.attributes).filter(e=>o?.excludeKeys?.has(e)!==!0).sort();if(_.length===0)p.push(l(`no attributes`));else{p.push(l(`attributes (${_.length})`));for(let r of _){let i=formatAttributeContent(r,t.attributes[r],s.dim,n-2),a=stripTerminalControls(r);if(i.length===1)p.push(...wrapVisibleLine(`${l(a)} ${i[0]}`,n));else{p.push(l(a));for(let e of i)p.push(` ${e}`)}}}return p.map(e=>clipVisible(e,n))}function renderHeader(e,t){let{theme:n,width:r}=t,{colors:o,glyph:s}=n,{muted:u,primary:d}=chromeStyles(n,t.surfaces),f=[];if(e.trace?.agentName!==void 0&&f.push(stripTerminalControls(e.trace.agentName)),e.trace?.sessionId!==void 0&&f.push(`session ${stripTerminalControls(e.trace.sessionId)}`),e.trace!==void 0){let n=t.activeWindowEndNs!==void 0&&t.activeWindowEndNs>e.trace.endTimeNs?t.activeWindowEndNs:e.trace.endTimeNs;f.push(clockTime(e.trace.startTimeNs),`${e.trace.spans.length} span${e.trace.spans.length===1?``:`s`}`,formatElapsed(durationMs(e.trace.startTimeNs,n)))}let p=`${o.bold(d(`${s.brand} traces`))}${f.length===0?``:u(` · ${f.join(` · `)}`)}`,m=e.traces.length===0?``:u(`[${e.traceIndex+1}/${e.traces.length}]`),h=[t.activeWindowEndNs===void 0?``:o.green(`● live`),m].filter(e=>e.length>0).join(` `);return[``,clipVisible(joinRight(` ${clipVisible(p,Math.max(0,r-visibleLength(h)-2))}`,h,r),r),``]}function renderConversation(e,t,n,r){let{theme:i}=t;if(e.conversationItems.length===0)return[chromeStyles(i,t.surfaces).muted(` No conversation content in this trace — content capture may be off (EVE_TRACES_CONTENT).`)];let a=conversationLines(e,n,i,t.surfaces).slice(e.scrollRow,e.scrollRow+r);return e.textSelection===void 0||e.textSelection.region!==`conversation`?a:a.map((t,r)=>highlightSelection(t,e.scrollRow+r,e.textSelection,n))}function conversationLines(e,n,r,i){let a=[];for(let o=0;o<e.conversationItems.length;o+=1)a.push(...renderConversationItem(e.conversationItems[o],n,r,o===e.selectedRow,e.expandedItems.has(o),i),``);return a}function panelDetailLines(e,t,n,i){let a=selectedTraceViewerSpan(e);return!e.panelOpen||t<=0||a===void 0?[]:[``,...renderSpanDetail(a,Math.max(16,t-3),n,{excludeKeys:CONVERSATION_CONTENT_KEYS,surfaces:i}).map(e=>` ${e}`)]}function conversationSelectionText(e,t,n,r,i){return selectionText(conversationLines(e,t,n,i),r)}function panelSelectionText(e,t,n,r){return selectionText(panelDetailLines(e,e.panelOpen?panelWidthFor(t):0,n),r)}function selectionText(e,t){let{start:r,end:i}=orderedTextSelection(t),a=[];for(let t=Math.max(0,r.line);t<=i.line&&t<e.length;t+=1){let n=stripAnsi(e[t]),c=t===r.line?r.column:0,l=t===i.line?i.column+1:1/0,u=l===1/0?n:sliceVisible(n,l),d=sliceVisible(n,c).length;a.push(u.slice(d).trimEnd())}return a.join(`
2
2
  `)}function highlightSelection(e,t,r,i){let{start:a,end:s}=orderedTextSelection(r);if(t<a.line||t>s.line)return e;let c=t===a.line?a.column:0,u=t===s.line?s.column+1:i,d=visibleLength(e),f=d<u?e+` `.repeat(u-d):e,p=sliceVisible(f,c),m=sliceVisible(f,u),h=m.slice(p.length),g=f.slice(m.length);return h.length===0?e:`${p}\x1b[7m${h.replaceAll(`\x1B[0m`,`\x1B[0m\x1B[7m`)}\x1b[27m${g}`}function renderFooter(e,t,n,r){let{colors:i}=n,{muted:o}=chromeStyles(n,r),[s,c]=n.unicode?[`↑↓`,`←→`]:[`^/v`,`</>`],l=e.panelFocus?`${s} scroll · tab cards · esc back`:`${s} select · ${c} expand · enter attrs · tab focus · [ ] traces · q close`,u=e.conversationItems.length,d=u===0?``:o(`item ${e.selectedRow+1}/${u}`),f=[e.notice===void 0?``:i.yellow(e.notice),d].filter(e=>e.length>0).join(o(` · `));return[``,clipVisible(` ${o(l)}`,t),clipVisible(f.length===0?``:` ${f}`,t)]}function renderEmptyState(e,t,n){let{muted:r,primary:i}=chromeStyles(t,e.surfaces),[a,o]=e.tracingDisabled===!0?[`Tracing is disabled (EVE_TRACES=off).`,`Re-enable it and spans stream in live.`]:[`No local traces yet.`,`Chat with your agent — spans stream in live.`];return center(n,t.colors.bold(i(a)),r(o))}function center(e,...t){let n=Array.from({length:e},()=>``),r=Math.max(0,Math.floor(e/2)-1);return t.forEach((t,i)=>{r+i<e&&(n[r+i]=t)}),n}function joinPanels(e,t,n,r){let i=Math.max(0,r-t-1);return`${padTo(e,t)} ${clipVisible(n,i)}`}function joinRight(e,t,n){if(t.length===0)return e;let r=Math.max(1,n-visibleLength(e)-visibleLength(t));return`${e}${` `.repeat(r)}${t}`}function padTo(e,t){let n=visibleLength(e);return n>=t?clipVisible(e,t):e+` `.repeat(t-n)}function panelWidthFor(e){return e<42?0:Math.min(64,Math.max(20,Math.floor(e*.42)),e-20-1)}function durationMs(e,t){return Math.max(0,Number(t-e)/1e6)}function clockTime(e){let t=new Date(Number(e/1000000n)),pad=(e,t=2)=>String(e).padStart(t,`0`);return`${pad(t.getHours())}:${pad(t.getMinutes())}:${pad(t.getSeconds())}.${pad(t.getMilliseconds(),3)}`}export{conversationSelectionText,panelSelectionText,renderSpanDetail,renderTraceViewer};
@@ -1,4 +1,4 @@
1
1
  import{createLogger}from"#internal/logging.js";import{Command,CommanderError,InvalidArgumentError}from"#compiled/commander/index.js";import{parseDevelopmentHeaderOption,resolveDevelopmentUrlTarget}from"#cli/dev/url-target.js";import{parseDevelopmentServerUrl}from"#cli/dev/url.js";import{FORCED_EXIT_BACKSTOP_MS,installShutdownSignal,waitForShutdownSignal}from"#cli/shutdown.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{createCliTheme,renderCliTaggedLine}from"#cli/ui/output.js";import{isCodingAgentLaunch}from"#cli/agent-detection.js";import{eveCliBanner}from"#cli/banner.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{devBootPhase}from"#internal/dev-boot-progress.js";import{registerBuildCommand}from"#cli/commands/build.js";import{resolveApplicationRoot}from"#internal/application/paths.js";import{registerIntegrationCommands}from"#cli/commands/register-integration-commands.js";import{registerProjectCommands}from"#cli/commands/register-project-commands.js";import{registerRegistryCommands}from"#cli/commands/register-registry-commands.js";import{resolveDevUiMode,resolveTuiDisplayOptions}from"#cli/dev/ui-options.js";import{registerAcpCommand}from"#cli/acp/command.js";import{waitForServerOrStop,waitForUiOrServer}from"#cli/dev/wait-for-ui.js";import{registerRuntimeInvokeCommand}from"#cli/invoke/command.js";import{parseContextSizeOption,parseDisplayMode,parseLogsMode,parsePortOption,parseStatsMode}from"#cli/option-parsers.js";import{resolveTuiTitle}from"#cli/dev/tui/target.js";import{resumeDevelopmentRuntimeArtifacts,suspendDevelopmentRuntimeArtifacts}from"#services/dev-client/runtime-artifacts.js";const devBootLog=createLogger(`dev.boot`);function createDevBootProgressReporter(e){return t=>{switch(t.type){case`phase-started`:e?.update(`Building your agent`,t.phase),devBootLog.debug(t.phase);return;case`phase-finished`:devBootLog.debug(`${t.phase} finished`,{ms:t.elapsedMs});return;case`before-first-paint`:e?.stop();return;default:return t}}}async function loadPrintApplicationInfo(){return(await import(`#cli/commands/info.js`)).printApplicationInfo}async function loadRunDevelopmentTui(){return(await import(`#cli/dev/tui/tui.js`)).runDevelopmentTui}async function loadRunEvalCommand(){return(await import(`#evals/cli/eval.js`)).runEvalCommand}async function loadStartHost(){return(await import(`#cli/dev/local-server-process.js`)).createDevelopmentServer}const loadIsActiveDevelopmentServerForApp=async()=>(await import(`#internal/nitro/host.js`)).isActiveDevelopmentServerForApp;async function loadStartProductionHost(){return(await import(`#internal/nitro/host.js`)).startProductionServer}function hasInteractiveTerminal(){return!!(process.stdin.isTTY&&process.stdout.isTTY)}function createCliProgram(e,n){let f=resolveApplicationRoot(),y=resolveInstalledPackageInfo().version,b=new Command,x=createCliTheme();b.name(`eve`).description(`Build and run an eve application.`).version(y).showHelpAfterError().exitOverride().hook(`preAction`,(t,n)=>{[`info`,`dev`,`init`].includes(n.name())&&e.log(eveCliBanner())}).configureOutput({writeErr:t=>{e.error(t.trimEnd())},writeOut:t=>{e.log(t.trimEnd())}}),b.command(`channels`).description(`Manage user-authored channels in the current project.`).command(`list`).description(`List user-authored channels in the current project.`).option(`--json`,`Output as JSON`).action(async t=>{let{runChannelsListCommand:n}=await import(`#cli/commands/channels.js`);await n(e,f,t)}),registerIntegrationCommands({program:b,logger:e,appRoot:f});let S=b.command(`extension`).description(`Create and build reusable eve extension packages.`);S.command(`init [target]`).description(`Create a new eve extension package.`).option(`-y, --yes`,`Accepted for compatibility; has no effect`).action(async(t,n)=>{n.yes&&e.error(`warning: --yes has no effect for eve extension init.`);let{runExtensionInitCommand:r}=await import(`#cli/commands/extension-init.js`);await r(e,f,t)}),S.command(`build`).description(`Build the current package as an eve extension.`).action(async()=>{let{loadDevelopmentEnvironmentFiles:t}=await import(`#cli/dev/environment.js`);t(f);let{runExtensionBuildCommand:n}=await import(`#cli/commands/extension-build.js`);await n(e,f)}),registerRegistryCommands({program:b,logger:e,appRoot:f}),b.command(`init [target]`).description(`Create a new eve agent, or add one to an existing project directory.`).option(`--channel-web-nextjs`,`Add the Web Chat application (Next.js)`).option(`-y, --yes`,`Accepted for compatibility; has no effect`).action(async(t,n)=>{n.yes&&e.error(`warning: --yes has no effect for eve init.`);let{runInitCommand:r}=await import(`#cli/commands/init.js`);await r(e,f,t,{channelWebNextjs:n.channelWebNextjs})}),registerProjectCommands({program:b,logger:e,appRoot:f}),registerBuildCommand({appRoot:f,buildHost:n.buildHost,logger:e,program:b}),b.command(`start`).description(`Start a built eve application.`).option(`--host <host>`,`Host interface to bind`).option(`--port <port>`,`Port to listen on (defaults to $PORT, then 3000)`,parsePortOption).action(async t=>{let{loadDevelopmentEnvironmentFiles:r}=await import(`#cli/dev/environment.js`);r(f);let i=await(n.startProductionHost??await loadStartProductionHost())(f,{host:t.host,port:t.port});e.log(renderCliTaggedLine(x,{message:`server listening at ${i.url}`,tag:`start`,tone:`success`})),await waitForShutdownSignal({close:()=>i.close(),wait:()=>i.wait()})}),registerRuntimeInvokeCommand({appRoot:f,logger:e,program:b,runtime:n}),registerAcpCommand({appRoot:f,eveVersion:y,program:b,resolveVerifiedRemoteDevelopmentClient:n.resolveVerifiedRemoteDevelopmentClient,runAcpServer:n.runAcpServer,startHost:n.startHost}),b.command(`dev`).description(`Start the eve development server or connect to an existing URL.`).argument(`[url]`,`Connect to an existing server URL`,parseDevelopmentServerUrl).option(`--host <host>`,`Host interface to bind`).option(`--port <port>`,`Port to listen on (defaults to $PORT, then 2000)`,parsePortOption).option(`-u, --url <url>`,`Connect to an existing server URL`,parseDevelopmentServerUrl).option(`-H, --header <header>`,`Request header for a URL target, in "Name: value" form (repeatable)`,parseDevelopmentHeaderOption).option(`--no-ui`,`Start the server without an interactive UI`).option(`--name <name>`,`Title shown in the terminal UI (defaults to the app folder name)`).option(`--input <text>`,`Pre-fill the prompt input, or start onboarding with /model`).option(`--tools <mode>`,`How tool calls render: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--reasoning <mode>`,`How reasoning renders: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--subagents <mode>`,`How subagent sections render: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--connection-auth <mode>`,`How connection authorization renders: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--assistant-response-stats <mode>`,`Assistant header statistic: tokens | tokensPerSecond`,parseStatsMode).option(`--context-size <tokens>`,`Model context window size, shown as a usage percentage`,parseContextSizeOption).option(`--logs <mode>`,`Which server/agent logs to show: all | stderr | sandbox | none`,parseLogsMode).addHelpText(`after`,`
2
2
  You can also pass a bare URL, for example: eve dev https://example.com
3
3
  `).action(async(t,i)=>{let o=resolveDevelopmentUrlTarget(i,t),l=o?.serverUrl,u=hasInteractiveTerminal(),d=resolveDevUiMode({options:i,interactive:u});if(i.input!==void 0&&d===`headless`)throw new InvalidArgumentError(`--input requires the interactive UI.`);let p=!1;l!==void 0&&(p=await(n.isActiveDevelopmentServerForApp??await loadIsActiveDevelopmentServerForApp())({appRoot:f,serverUrl:l}));let runInteractiveUi=async(e,t,r)=>{let a=await devBootPhase(`loading interactive UI`,async()=>n.runDevelopmentTui??await loadRunDevelopmentTui(),t),s=resolveTuiDisplayOptions(i),c=l===void 0||p?{kind:`local`,serverUrl:e.serverUrl,workspaceRoot:e.appRoot??f}:{kind:`remote`,serverUrl:e.serverUrl,workspaceRoot:f},u=resolveTuiTitle({name:i.name,target:c});u!==void 0&&(s.name=u);let d={target:c,initialInput:i.input,onBootProgress:t,lifecycle:r,...s};c.kind===`local`&&(d.withExclusiveTerminal=async t=>await(async()=>{if(!await suspendDevelopmentRuntimeArtifacts({serverUrl:e.serverUrl}))throw Error(`Could not pause the development server for integration setup.`);try{return await t()}finally{await resumeDevelopmentRuntimeArtifacts({serverUrl:e.serverUrl,silent:!0})}})()),o?.headers===void 0?await a(d):await a({...d,headers:o.headers})};if(l){let{loadDevelopmentEnvironmentFiles:t}=await import(`#cli/dev/environment.js`);if(t(f),e.log(`↗ ${p?`local`:`remote`} mode targeting ${x.info(new URL(l).host)}`),d===`headless`){e.log(renderCliTaggedLine(x,{message:`Interactive UI disabled because the current terminal is not a TTY.`,tag:`dev`,tone:`warning`}));return}e.log(``);let n=installShutdownSignal({exitAfterMs:FORCED_EXIT_BACKSTOP_MS});try{await runInteractiveUi({serverUrl:l},void 0,n)}finally{n.dispose()}return}d===`tui`&&e.log(``);let m=d===`tui`?startCliLiveRow(e):void 0,h=createDevBootProgressReporter(m);m?.update(`Building your agent`);let g,_,closeServer=()=>g===void 0?Promise.resolve():(_??=g.close(),_.catch(()=>void 0),_),v=installShutdownSignal({exitAfterMs:FORCED_EXIT_BACKSTOP_MS,onStop:()=>{closeServer()}});try{g=(n.startHost??await loadStartHost())(f,{existing:d===`tui`?`attach-if-unconfigured`:`reject`,host:i.host,onBootProgress:h,port:i.port});let t=(await Promise.race([g.start().then(e=>({handle:e})),v.stopped.then(()=>({handle:void 0}))])).handle;if(t===void 0)return;if(d!==`tui`&&e.log(renderCliTaggedLine(x,{message:`server listening at ${t.url}`,tag:`dev`,tone:`success`})),d===`headless`){i.ui!==!1&&!u&&e.log(renderCliTaggedLine(x,{message:`Interactive UI disabled because the current terminal is not a TTY.`,tag:`dev`,tone:`warning`})),await waitForServerOrStop(g,v);return}await waitForUiOrServer({handle:t,lifecycle:v,server:g,runUi:async()=>await runInteractiveUi({appRoot:t.appRoot,serverUrl:t.url},h,v)})}finally{m?.stop(),await closeServer(),v.dispose()}});let C=b.command(`logs`).description("Inspect local `eve dev` diagnostic logs (.eve/logs).");return C.command(`show [logid]`,{isDefault:!0}).description(`Print a diagnostic log (the most recent when logid is omitted).`).option(`--dump`,`Prepend the log's environment dump (.dump sibling)`).option(`--events`,`Interleave session events from the local workflow store`).action(async(t,n)=>{let{runLogsShowCommand:r}=await import(`#cli/commands/logs.js`);await r(e,f,t,n)}),C.command(`ls`).description(`List diagnostic logs, most recent first.`).option(`--json`,`Output as JSON`).action(async t=>{let{runLogsListCommand:n}=await import(`#cli/commands/logs.js`);await n(e,f,t)}),b.command(`traces [trace]`).usage(`[options] [trace]
4
- eve traces ls [options]`).description("Show a local `eve dev` trace (the most recent when trace is omitted).").action(async t=>{let{runTraceShowCommand:n}=await import(`#cli/commands/trace.js`);await n(e,f,t)}).command(`ls`).description(`List local traces, most recent first.`).option(`--json`,`Output as JSON`).action(async t=>{let{runTraceListCommand:n}=await import(`#cli/commands/trace.js`);await n(e,f,t)}),b.command(`info`).description(`Print resolved application information.`).option(`--json`,`Output as JSON`).action(async t=>{await(n.printApplicationInfo??await loadPrintApplicationInfo())(e,f,t)}),b.command(`eval`).description(`Run evals against an eve agent.`).argument(`[evalIds...]`,`Eval ids (or directory prefixes) to run (all discovered evals when omitted)`).option(`--url <url>`,`Remote agent URL (skip local host startup)`,parseDevelopmentServerUrl).option(`--tag <tag...>`,`Run only evals carrying a tag`).option(`--exclude-tag <tag...>`,`Skip evals carrying a tag`).option(`--strict`,`Fail the exit code when any score falls below its threshold`).option(`--list`,`Print discovered evals without running them`).option(`--timeout <ms>`,`Per-eval timeout in milliseconds`).option(`--max-concurrency <n>`,`Max concurrent eval executions`).option(`--json`,`Output results as JSON`).option(`--junit <path>`,`Write JUnit XML results to a file`).option(`--skip-report`,`Skip eval-defined reporters (e.g. Braintrust)`).option(`--verbose`,`Stream per-eval t.log lines to stdout`).action(async(t,r)=>{await(n.runEvalCommand??await loadRunEvalCommand())(t,r,e)}),b}async function runCli(e=process.argv.slice(2),t=console,r={}){let i=createCliProgram(t,r),a=e.length===0?[`dev`]:e;try{await i.parseAsync(a,{from:`user`})}catch(e){if(e instanceof CommanderError){if(e.exitCode===0)return;let n=await(r.isCodingAgentLaunch??isCodingAgentLaunch)();if(a[0]===`init`&&n){let{initAgentInstructions:e}=await import(`#cli/commands/agent-instructions.js`);t.log(e())}throw Error(e.message)}throw e}}export{resolveDevUiMode,resolveTuiDisplayOptions,runCli};
4
+ eve traces ls [options]`).description("Show a local `eve dev` trace (the most recent when trace is omitted).").option(`--verbose`,`Expand every span with all attributes and events`).option(`--json`,`Output as JSON`).action(async(t,n)=>{let{runTraceShowCommand:r}=await import(`#cli/commands/trace.js`);await r(e,f,t,n)}).command(`ls`).description(`List local traces, most recent first.`).option(`--json`,`Output as JSON`).action(async t=>{let{runTraceListCommand:n}=await import(`#cli/commands/trace.js`);await n(e,f,t)}),b.command(`info`).description(`Print resolved application information.`).option(`--json`,`Output as JSON`).action(async t=>{await(n.printApplicationInfo??await loadPrintApplicationInfo())(e,f,t)}),b.command(`eval`).description(`Run evals against an eve agent.`).argument(`[evalIds...]`,`Eval ids (or directory prefixes) to run (all discovered evals when omitted)`).option(`--url <url>`,`Remote agent URL (skip local host startup)`,parseDevelopmentServerUrl).option(`--tag <tag...>`,`Run only evals carrying a tag`).option(`--exclude-tag <tag...>`,`Skip evals carrying a tag`).option(`--strict`,`Fail the exit code when any score falls below its threshold`).option(`--list`,`Print discovered evals without running them`).option(`--timeout <ms>`,`Per-eval timeout in milliseconds`).option(`--max-concurrency <n>`,`Max concurrent eval executions`).option(`--json`,`Output results as JSON`).option(`--junit <path>`,`Write JUnit XML results to a file`).option(`--skip-report`,`Skip eval-defined reporters (e.g. Braintrust)`).option(`--verbose`,`Stream per-eval t.log lines to stdout`).action(async(t,r)=>{await(n.runEvalCommand??await loadRunEvalCommand())(t,r,e)}),b}async function runCli(e=process.argv.slice(2),t=console,r={}){let i=createCliProgram(t,r),a=e.length===0?[`dev`]:e;try{await i.parseAsync(a,{from:`user`})}catch(e){if(e instanceof CommanderError){if(e.exitCode===0)return;let n=await(r.isCodingAgentLaunch??isCodingAgentLaunch)();if(a[0]===`init`&&n){let{initAgentInstructions:e}=await import(`#cli/commands/agent-instructions.js`);t.log(e())}throw Error(e.message)}throw e}}export{resolveDevUiMode,resolveTuiDisplayOptions,runCli};
@@ -10,7 +10,7 @@ export type { EveAgentStoreCallbacks, EveAgentStoreInit, EveAgentStoreSnapshot,
10
10
  export type { AgentInfoEntry, AgentInfoChannelEntry, AgentInfoChannels, AgentInfoConnectionEntry, AgentInfoDynamicResolverEntry, AgentInfoFrameworkChannelEntry, AgentInfoFrameworkToolEntry, AgentInfoHookEntry, AgentInfoInstructions, AgentInfoInstructionsEntry, AgentInfoResult, AgentInfoSandboxEntry, AgentInfoScheduleEntry, AgentInfoSkillEntry, AgentInfoSource, AgentInfoSubagentEntry, AgentInfoToolEntry, AgentInfoTools, CancelSessionResult, ClearResult, CompactResult, ClientAuth, ClientOptions, ClientRedirectPolicy, HeadersValue, HealthResult, MessageResult, ResetResult, ResolvedStreamReconnectPolicy, SendTurnInput, SendTurnPayload, SessionSnapshot, SessionState, StreamOptions, StreamReconnectPolicy, StreamReconnectRetryPolicy, TokenValue, } from "#client/types.js";
11
11
  export type { EveAgentReducer, EveAgentReducerEvent, ClientInputRespondedEvent, ClientMessageFailedEvent, ClientMessageSubmittedEvent, } from "#client/reducer.js";
12
12
  export type { EveAuthorizationChallenge, EveAuthorizationOutcome, EveAuthorizationPart, EveMessageData, EveDynamicToolPart, EveMessageInputRequest, EveMessage, EveMessageMetadata, EveMessagePart, EveMessageToolMetadata, } from "#client/message-reducer.js";
13
- export type { ActionResultStreamEvent, ActionsRequestedStreamEvent, AssistantStepFinishReason, AuthorizationOutcome, CompactionCompletedStreamEvent, CompactionRequestedStreamEvent, AuthorizationCompletedStreamEvent, ConnectionAuthorizationOutcome, AuthorizationRequiredStreamEvent, HandleMessageStreamEvent, MessageStreamEventMeta, InputRequestedStreamEvent, MessageAppendedStreamEvent, MessageCompletedStreamEvent, MessageReceivedPart, MessageReceivedStreamEvent, ReasoningAppendedStreamEvent, ReasoningCompletedStreamEvent, ResultCompletedStreamEvent, SessionCompletedStreamEvent, SessionFailedStreamEvent, SessionStartedStreamEvent, SessionWaitingStreamEvent, MessageStreamEvent, StepCompletedStreamEvent, StepFailedStreamEvent, StepStartedStreamEvent, SubagentCalledStreamEvent, SubagentChildEventStreamEvent, SubagentCompletedStreamEvent, SubagentStartedStreamEvent, TurnCancelledStreamEvent, TurnCompletedStreamEvent, TurnFailedStreamEvent, TurnStartedStreamEvent, TurnFailureStreamEvent, } from "#protocol/message.js";
13
+ export type { ActionPartialStreamEvent, ActionResultStreamEvent, ActionsRequestedStreamEvent, AssistantStepFinishReason, AuthorizationOutcome, CompactionCompletedStreamEvent, CompactionRequestedStreamEvent, AuthorizationCompletedStreamEvent, ConnectionAuthorizationOutcome, AuthorizationRequiredStreamEvent, HandleMessageStreamEvent, MessageStreamEventMeta, InputRequestedStreamEvent, MessageAppendedStreamEvent, MessageCompletedStreamEvent, MessageReceivedPart, MessageReceivedStreamEvent, ReasoningAppendedStreamEvent, ReasoningCompletedStreamEvent, ResultCompletedStreamEvent, SessionCompletedStreamEvent, SessionFailedStreamEvent, SessionStartedStreamEvent, SessionWaitingStreamEvent, MessageStreamEvent, StepCompletedStreamEvent, StepFailedStreamEvent, StepStartedStreamEvent, SubagentCalledStreamEvent, SubagentChildEventStreamEvent, SubagentCompletedStreamEvent, SubagentStartedStreamEvent, TurnCancelledStreamEvent, TurnCompletedStreamEvent, TurnFailedStreamEvent, TurnStartedStreamEvent, TurnFailureStreamEvent, } from "#protocol/message.js";
14
14
  export { isCurrentTurnBoundaryEvent, isTurnFailureEvent } from "#protocol/message.js";
15
15
  export type { InputOption, InputRequest, InputRequestKind, InputResponse, } from "#runtime/input/types.js";
16
16
  export { inputOptionSchema, inputRequestKindSchema, inputRequestSchema, inputResponseSchema, isInputRequest, isInputResponse, } from "#runtime/input/types.js";
@@ -108,6 +108,8 @@ export type EveAuthorizationPart = {
108
108
  * `"output-available"`, `"output-error"` (`errorText` set), or `"output-denied"`
109
109
  * (`approval.approved` is `false`). Which of `input`, `output`, `errorText`, and
110
110
  * `approval` are present depends on `state`, so narrow on `state` before reading them.
111
+ * Preliminary generator output uses `"output-available"` with `partial: true`;
112
+ * the terminal tool result clears that flag.
111
113
  * `toolName` and `toolMetadata.eve` ({@link EveMessageToolMetadata}) record call identity.
112
114
  */
113
115
  export type EveDynamicToolPart = {
@@ -160,6 +162,7 @@ export type EveDynamicToolPart = {
160
162
  readonly errorText?: never;
161
163
  readonly input: unknown;
162
164
  readonly output: unknown;
165
+ readonly partial?: true;
163
166
  readonly state: "output-available";
164
167
  } | {
165
168
  readonly approval?: {
@@ -1 +1 @@
1
- import{createAuthorizationCompletedPart,createAuthorizationRequiredPart}from"#client/authorization-message-parts.js";import{approvedApproval,createToolMetadata,mergeToolMetadata,normalizeActionRequest,normalizeActionResult,stringifyUnknown,toMessageInputRequest}from"#client/message-action-parts.js";function defaultMessageReducer(){return{initial(){return{messages:[]}},reduce(e,t){return reduceMessageData(e,t)}}}function reduceMessageData(e,s){switch(s.type){case`client.message.submitted`:return upsertMessage(e,{id:optimisticUserMessageId(s.data.submissionId),metadata:{optimistic:!0,status:`submitted`},parts:[{type:`text`,text:s.data.message}],role:`user`});case`client.message.failed`:return upsertMessage(e,{id:optimisticUserMessageId(s.data.submissionId),metadata:{optimistic:!0,status:`failed`},parts:[{type:`text`,text:s.data.message}],role:`user`});case`client.input.responded`:{let t=e;for(let e of s.data.responses)t=respondToInputRequest(t,e);return t}case`message.received`:return upsertMessage(e,{id:`${s.data.turnId}:user`,metadata:{status:`complete`,turnId:s.data.turnId},parts:projectReceivedParts(s.data.parts,s.data.message),role:`user`});case`step.started`:return updateAssistantMessage(e,s.data.turnId,e=>ensureStepStartPart(e,s.data.stepIndex));case`reasoning.appended`:return updateAssistantMessage(e,s.data.turnId,e=>upsertRun(ensureStepStartPart(e,s.data.stepIndex),{state:`streaming`,stepIndex:s.data.stepIndex,text:s.data.reasoningSoFar,type:`reasoning`}));case`reasoning.completed`:return updateAssistantMessage(e,s.data.turnId,e=>upsertRun(ensureStepStartPart(e,s.data.stepIndex),{state:`done`,stepIndex:s.data.stepIndex,text:s.data.reasoning,type:`reasoning`}));case`actions.requested`:{let t=e;for(let e of s.data.actions){let n=normalizeActionRequest(e);t=updateAssistantMessage(t,s.data.turnId,t=>upsertPart(ensureStepStartPart(t,s.data.stepIndex),{input:`input`in e?e.input:void 0,state:`input-available`,stepIndex:s.data.stepIndex,toolCallId:e.callId,toolMetadata:createToolMetadata(n),toolName:n.toolName,type:`dynamic-tool`}))}return t}case`input.requested`:{let t=e;for(let e of s.data.requests){let n=normalizeActionRequest(e.action);t=updateAssistantMessage(t,s.data.turnId,t=>upsertPart(ensureStepStartPart(t,s.data.stepIndex),{approval:{id:e.requestId},input:e.action.input,state:`approval-requested`,stepIndex:s.data.stepIndex,toolCallId:e.action.callId,toolMetadata:createToolMetadata(n,{inputRequest:toMessageInputRequest(e)}),toolName:n.toolName,type:`dynamic-tool`}))}return t}case`action.result`:{let t=normalizeActionResult(s.data.result),a=findToolPart(e,s.data.result.callId),o=s.data.error?.code===`TOOL_EXECUTION_DENIED`,c=s.data.status===`failed`&&!o,l=a?.approval?.id??s.data.result.callId,u=mergeToolMetadata(a?.toolMetadata,createToolMetadata(t)),d={input:a?.input,stepIndex:s.data.stepIndex,toolCallId:s.data.result.callId,toolMetadata:u,toolName:a?.toolName??t.toolName,type:`dynamic-tool`},f;return f=o?{...d,approval:{approved:!1,id:l,reason:s.data.error?.message},state:`output-denied`}:c?{...d,approval:approvedApproval(a),errorText:s.data.error?.message??stringifyUnknown(s.data.result.output),state:`output-error`}:{...d,approval:approvedApproval(a),output:s.data.result.output,state:`output-available`},a===void 0?updateAssistantMessage(e,s.data.turnId,e=>upsertPart(ensureStepStartPart(e,s.data.stepIndex),f)):updateToolPart(e,s.data.result.callId,f)}case`authorization.required`:return updateAssistantMessage(e,s.data.turnId,e=>upsertPart(ensureStepStartPart(e,s.data.stepIndex),createAuthorizationRequiredPart(s)));case`authorization.completed`:return completeAuthorization(e,s);case`message.appended`:return updateAssistantMessage(e,s.data.turnId,e=>upsertRun(ensureStepStartPart(e,s.data.stepIndex),{state:`streaming`,stepIndex:s.data.stepIndex,text:s.data.messageSoFar,type:`text`}));case`message.completed`:return updateAssistantMessage(e,s.data.turnId,e=>s.data.message===null?removeTextPart(e,s.data.stepIndex):upsertRun(ensureStepStartPart(e,s.data.stepIndex),{state:`done`,stepIndex:s.data.stepIndex,text:s.data.message,type:`text`}));case`result.completed`:return updateAssistantMetadata(e,s.data.turnId,{result:s.data.result});case`turn.completed`:return updateAssistantMetadata(e,s.data.turnId,{status:`complete`});case`turn.cancelled`:return updateAssistantMessage(e,s.data.turnId,e=>({...e,metadata:{...e.metadata,status:`complete`},parts:e.parts.map(e=>(e.type===`text`||e.type===`reasoning`)&&e.state===`streaming`?{...e,state:`done`}:e)}));case`turn.failed`:case`session.failed`:return e;default:return e}}function respondToInputRequest(e,t){let n=findToolPartByApprovalId(e,t.requestId);if(!n)return e;let r={id:t.requestId};return t.text!==void 0&&(r.reason=t.text),updateToolPart(e,n.toolCallId,{approval:r,input:n.input,state:`approval-responded`,stepIndex:n.stepIndex,toolCallId:n.toolCallId,toolMetadata:mergeToolMetadata(n.toolMetadata,{eve:{inputResponse:t,kind:n.toolMetadata?.eve?.kind??`unknown`,name:n.toolMetadata?.eve?.name??n.toolName}}),toolName:n.toolName,type:`dynamic-tool`})}function updateAssistantMessage(e,t,n){return upsertMessage(e,n(e.messages.find(e=>e.role===`assistant`&&e.metadata?.turnId===t)??createAssistantMessage(t)))}function updateAssistantMetadata(e,t,n){return updateAssistantMessage(e,t,e=>({...e,metadata:{...e.metadata,...n}}))}function createAssistantMessage(e){return{id:`${e}:assistant`,metadata:{status:`streaming`,turnId:e},parts:[],role:`assistant`}}function ensureStepStartPart(e,t){let n=e.parts.filter(e=>e.type===`step-start`).length;if(n>t)return e;let r=t-n+1;return{...e,parts:[...e.parts,...Array.from({length:r},()=>({type:`step-start`}))]}}function upsertPart(e,t){let n=e.parts.findIndex(e=>partKey(e)===partKey(t)),r=n===-1?[...e.parts,t]:[...e.parts.slice(0,n),t,...e.parts.slice(n+1)];return{...e,metadata:{...e.metadata,status:t.type===`text`&&t.state===`done`?`complete`:`streaming`},parts:r}}function upsertRun(e,t){let n=-1;for(let r=e.parts.length-1;r>=0;--r){let i=e.parts[r];if(i?.type===t.type&&i.stepIndex===t.stepIndex){n=r;break}}let r=n!==-1&&e.parts[n].state===`streaming`?[...e.parts.slice(0,n),t,...e.parts.slice(n+1)]:[...e.parts,t];return{...e,metadata:{...e.metadata,status:t.type===`text`&&t.state===`done`?`complete`:`streaming`},parts:r}}function removeTextPart(e,t){let n=e.parts.filter(e=>e.type!==`text`||e.stepIndex!==t);return n.length===e.parts.length?e:{...e,metadata:{...e.metadata,status:`complete`},parts:n}}function updateToolPart(e,t,n){let r=e.messages.find(e=>e.role===`assistant`&&e.parts.some(e=>e.type===`dynamic-tool`&&e.toolCallId===t));return r?upsertMessage(e,upsertPart(r,n)):e}function completeAuthorization(t,n){let r=findLatestPendingAuthorizationPart(t,n.data.name),i=createAuthorizationCompletedPart(n,r);return r===void 0?updateAssistantMessage(t,n.data.turnId,e=>upsertPart(ensureStepStartPart(e,n.data.stepIndex),i)):updateAuthorizationPart(t,r,i)}function updateAuthorizationPart(e,t,n){let r=e.messages.find(e=>e.role===`assistant`&&e.parts.some(e=>e===t));return r?upsertMessage(e,upsertPart(r,n)):e}function findToolPart(e,t){for(let n of e.messages)for(let e of n.parts)if(e.type===`dynamic-tool`&&e.toolCallId===t)return e}function findLatestPendingAuthorizationPart(e,t){for(let n=e.messages.length-1;n>=0;--n){let r=e.messages[n];if(r?.role===`assistant`)for(let e=r.parts.length-1;e>=0;--e){let n=r.parts[e];if(n?.type===`authorization`&&n.state===`required`&&n.name===t)return n}}}function findToolPartByApprovalId(e,t){for(let n of e.messages)for(let e of n.parts)if(e.type===`dynamic-tool`&&e.approval?.id===t)return e}function projectReceivedParts(e,t){return e?.map(e=>e.type===`text`?{state:`done`,text:e.text,type:`text`}:{filename:e.filename,mediaType:e.mediaType,size:e.size,type:`file`,url:e.url})??[{state:`done`,text:t,type:`text`}]}function partKey(e){switch(e.type){case`text`:return`text:${e.stepIndex??0}`;case`reasoning`:return`reasoning:${e.stepIndex??0}`;case`file`:return`file:${e.stepIndex??0}:${e.filename??e.url??e.mediaType}`;case`step-start`:return`step-start`;case`authorization`:return`authorization:${e.turnId}:${e.stepIndex}:${e.name}`;case`dynamic-tool`:return`dynamic-tool:${e.toolCallId}`}}function upsertMessage(e,t){let n=e.messages.findIndex(e=>e.id===t.id);return n===-1?{messages:[...e.messages,t]}:{messages:[...e.messages.slice(0,n),t,...e.messages.slice(n+1)]}}function optimisticUserMessageId(e){return`optimistic:${e}:user`}export{defaultMessageReducer};
1
+ import{createAuthorizationCompletedPart,createAuthorizationRequiredPart}from"#client/authorization-message-parts.js";import{approvedApproval,createToolMetadata,mergeToolMetadata,normalizeActionRequest,normalizeActionResult,stringifyUnknown,toMessageInputRequest}from"#client/message-action-parts.js";function defaultMessageReducer(){return{initial(){return{messages:[]}},reduce(e,t){return reduceMessageData(e,t)}}}function reduceMessageData(e,c){switch(c.type){case`client.message.submitted`:return upsertMessage(e,{id:optimisticUserMessageId(c.data.submissionId),metadata:{optimistic:!0,status:`submitted`},parts:[{type:`text`,text:c.data.message}],role:`user`});case`client.message.failed`:return upsertMessage(e,{id:optimisticUserMessageId(c.data.submissionId),metadata:{optimistic:!0,status:`failed`},parts:[{type:`text`,text:c.data.message}],role:`user`});case`client.input.responded`:{let t=e;for(let e of c.data.responses)t=respondToInputRequest(t,e);return t}case`message.received`:return upsertMessage(e,{id:`${c.data.turnId}:user`,metadata:{status:`complete`,turnId:c.data.turnId},parts:projectReceivedParts(c.data.parts,c.data.message),role:`user`});case`step.started`:return updateAssistantMessage(e,c.data.turnId,e=>ensureStepStartPart(e,c.data.stepIndex));case`reasoning.appended`:return updateAssistantMessage(e,c.data.turnId,e=>upsertRun(ensureStepStartPart(e,c.data.stepIndex),{state:`streaming`,stepIndex:c.data.stepIndex,text:c.data.reasoningSoFar,type:`reasoning`}));case`reasoning.completed`:return updateAssistantMessage(e,c.data.turnId,e=>upsertRun(ensureStepStartPart(e,c.data.stepIndex),{state:`done`,stepIndex:c.data.stepIndex,text:c.data.reasoning,type:`reasoning`}));case`actions.requested`:{let t=e;for(let e of c.data.actions){let n=normalizeActionRequest(e);t=updateAssistantMessage(t,c.data.turnId,t=>upsertPart(ensureStepStartPart(t,c.data.stepIndex),{input:`input`in e?e.input:void 0,state:`input-available`,stepIndex:c.data.stepIndex,toolCallId:e.callId,toolMetadata:createToolMetadata(n),toolName:n.toolName,type:`dynamic-tool`}))}return t}case`input.requested`:{let t=e;for(let e of c.data.requests){let n=normalizeActionRequest(e.action);t=updateAssistantMessage(t,c.data.turnId,t=>upsertPart(ensureStepStartPart(t,c.data.stepIndex),{approval:{id:e.requestId},input:e.action.input,state:`approval-requested`,stepIndex:c.data.stepIndex,toolCallId:e.action.callId,toolMetadata:createToolMetadata(n,{inputRequest:toMessageInputRequest(e)}),toolName:n.toolName,type:`dynamic-tool`}))}return t}case`action.result`:{let t=normalizeActionResult(c.data.result),a=findToolPart(e,c.data.result.callId),s=c.data.error?.code===`TOOL_EXECUTION_DENIED`,l=c.data.status===`failed`&&!s,u=a?.approval?.id??c.data.result.callId,d=mergeToolMetadata(a?.toolMetadata,createToolMetadata(t)),f={input:a?.input,stepIndex:c.data.stepIndex,toolCallId:c.data.result.callId,toolMetadata:d,toolName:a?.toolName??t.toolName,type:`dynamic-tool`},p;return p=s?{...f,approval:{approved:!1,id:u,reason:c.data.error?.message},state:`output-denied`}:l?{...f,approval:approvedApproval(a),errorText:c.data.error?.message??stringifyUnknown(c.data.result.output),state:`output-error`}:{...f,approval:approvedApproval(a),output:c.data.result.output,state:`output-available`},a===void 0?updateAssistantMessage(e,c.data.turnId,e=>upsertPart(ensureStepStartPart(e,c.data.stepIndex),p)):updateToolPart(e,c.data.result.callId,p)}case`action.partial`:{let t=findToolPart(e,c.data.result.callId);if(t!==void 0&&isSettledToolPart(t))return e;let a=normalizeActionResult(c.data.result),o={approval:approvedApproval(t),input:t?.input,output:c.data.result.output,partial:!0,state:`output-available`,stepIndex:c.data.stepIndex,toolCallId:c.data.result.callId,toolMetadata:mergeToolMetadata(t?.toolMetadata,createToolMetadata(a)),toolName:t?.toolName??a.toolName,type:`dynamic-tool`};return t===void 0?updateAssistantMessage(e,c.data.turnId,e=>upsertPart(ensureStepStartPart(e,c.data.stepIndex),o)):updateToolPart(e,c.data.result.callId,o)}case`authorization.required`:return updateAssistantMessage(e,c.data.turnId,e=>upsertPart(ensureStepStartPart(e,c.data.stepIndex),createAuthorizationRequiredPart(c)));case`authorization.completed`:return completeAuthorization(e,c);case`message.appended`:return updateAssistantMessage(e,c.data.turnId,e=>upsertRun(ensureStepStartPart(e,c.data.stepIndex),{state:`streaming`,stepIndex:c.data.stepIndex,text:c.data.messageSoFar,type:`text`}));case`message.completed`:return updateAssistantMessage(e,c.data.turnId,e=>c.data.message===null?removeTextPart(e,c.data.stepIndex):upsertRun(ensureStepStartPart(e,c.data.stepIndex),{state:`done`,stepIndex:c.data.stepIndex,text:c.data.message,type:`text`}));case`result.completed`:return updateAssistantMetadata(e,c.data.turnId,{result:c.data.result});case`turn.completed`:return updateAssistantMetadata(e,c.data.turnId,{status:`complete`});case`turn.cancelled`:return updateAssistantMessage(e,c.data.turnId,e=>({...e,metadata:{...e.metadata,status:`complete`},parts:e.parts.map(e=>(e.type===`text`||e.type===`reasoning`)&&e.state===`streaming`?{...e,state:`done`}:e)}));case`turn.failed`:case`session.failed`:return e;default:return e}}function respondToInputRequest(e,t){let n=findToolPartByApprovalId(e,t.requestId);if(!n)return e;let r={id:t.requestId};return t.text!==void 0&&(r.reason=t.text),updateToolPart(e,n.toolCallId,{approval:r,input:n.input,state:`approval-responded`,stepIndex:n.stepIndex,toolCallId:n.toolCallId,toolMetadata:mergeToolMetadata(n.toolMetadata,{eve:{inputResponse:t,kind:n.toolMetadata?.eve?.kind??`unknown`,name:n.toolMetadata?.eve?.name??n.toolName}}),toolName:n.toolName,type:`dynamic-tool`})}function updateAssistantMessage(e,t,n){return upsertMessage(e,n(e.messages.find(e=>e.role===`assistant`&&e.metadata?.turnId===t)??createAssistantMessage(t)))}function updateAssistantMetadata(e,t,n){return updateAssistantMessage(e,t,e=>({...e,metadata:{...e.metadata,...n}}))}function createAssistantMessage(e){return{id:`${e}:assistant`,metadata:{status:`streaming`,turnId:e},parts:[],role:`assistant`}}function ensureStepStartPart(e,t){let n=e.parts.filter(e=>e.type===`step-start`).length;if(n>t)return e;let r=t-n+1;return{...e,parts:[...e.parts,...Array.from({length:r},()=>({type:`step-start`}))]}}function upsertPart(e,t){let n=e.parts.findIndex(e=>partKey(e)===partKey(t)),r=n===-1?[...e.parts,t]:[...e.parts.slice(0,n),t,...e.parts.slice(n+1)];return{...e,metadata:{...e.metadata,status:t.type===`text`&&t.state===`done`?`complete`:`streaming`},parts:r}}function upsertRun(e,t){let n=-1;for(let r=e.parts.length-1;r>=0;--r){let i=e.parts[r];if(i?.type===t.type&&i.stepIndex===t.stepIndex){n=r;break}}let r=n!==-1&&e.parts[n].state===`streaming`?[...e.parts.slice(0,n),t,...e.parts.slice(n+1)]:[...e.parts,t];return{...e,metadata:{...e.metadata,status:t.type===`text`&&t.state===`done`?`complete`:`streaming`},parts:r}}function removeTextPart(e,t){let n=e.parts.filter(e=>e.type!==`text`||e.stepIndex!==t);return n.length===e.parts.length?e:{...e,metadata:{...e.metadata,status:`complete`},parts:n}}function updateToolPart(e,t,n){let r=e.messages.find(e=>e.role===`assistant`&&e.parts.some(e=>e.type===`dynamic-tool`&&e.toolCallId===t));return r?upsertMessage(e,upsertPart(r,n)):e}function completeAuthorization(t,n){let r=findLatestPendingAuthorizationPart(t,n.data.name),i=createAuthorizationCompletedPart(n,r);return r===void 0?updateAssistantMessage(t,n.data.turnId,e=>upsertPart(ensureStepStartPart(e,n.data.stepIndex),i)):updateAuthorizationPart(t,r,i)}function updateAuthorizationPart(e,t,n){let r=e.messages.find(e=>e.role===`assistant`&&e.parts.some(e=>e===t));return r?upsertMessage(e,upsertPart(r,n)):e}function findToolPart(e,t){for(let n of e.messages)for(let e of n.parts)if(e.type===`dynamic-tool`&&e.toolCallId===t)return e}function isSettledToolPart(e){return e.state===`output-denied`||e.state===`output-error`||e.state===`output-available`&&e.partial!==!0}function findLatestPendingAuthorizationPart(e,t){for(let n=e.messages.length-1;n>=0;--n){let r=e.messages[n];if(r?.role===`assistant`)for(let e=r.parts.length-1;e>=0;--e){let n=r.parts[e];if(n?.type===`authorization`&&n.state===`required`&&n.name===t)return n}}}function findToolPartByApprovalId(e,t){for(let n of e.messages)for(let e of n.parts)if(e.type===`dynamic-tool`&&e.approval?.id===t)return e}function projectReceivedParts(e,t){return e?.map(e=>e.type===`text`?{state:`done`,text:e.text,type:`text`}:{filename:e.filename,mediaType:e.mediaType,size:e.size,type:`file`,url:e.url})??[{state:`done`,text:t,type:`text`}]}function partKey(e){switch(e.type){case`text`:return`text:${e.stepIndex??0}`;case`reasoning`:return`reasoning:${e.stepIndex??0}`;case`file`:return`file:${e.stepIndex??0}:${e.filename??e.url??e.mediaType}`;case`step-start`:return`step-start`;case`authorization`:return`authorization:${e.turnId}:${e.stepIndex}:${e.name}`;case`dynamic-tool`:return`dynamic-tool:${e.toolCallId}`}}function upsertMessage(e,t){let n=e.messages.findIndex(e=>e.id===t.id);return n===-1?{messages:[...e.messages,t]}:{messages:[...e.messages.slice(0,n),t,...e.messages.slice(n+1)]}}function optimisticUserMessageId(e){return`optimistic:${e}:user`}export{defaultMessageReducer};