eve 0.33.2 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/src/channel/channel-address.d.ts +3 -6
  3. package/dist/src/channel/channel-address.js +1 -1
  4. package/dist/src/channel/channel-operations.d.ts +2 -3
  5. package/dist/src/channel/delivery-metadata.d.ts +9 -0
  6. package/dist/src/channel/delivery-metadata.js +1 -0
  7. package/dist/src/channel/routes.d.ts +1 -0
  8. package/dist/src/channel/session.d.ts +3 -4
  9. package/dist/src/channel/session.js +1 -1
  10. package/dist/src/channel/types.d.ts +20 -3
  11. package/dist/src/chunks/{use-eve-agent-B-Hky2f4.js → use-eve-agent-BNdcle_M.js} +33 -0
  12. package/dist/src/chunks/{use-eve-agent-3oBnxzhV.js → use-eve-agent-FJkEMXYk.js} +33 -0
  13. package/dist/src/cli/dev/tui/traces/trace-conversation.js +1 -1
  14. package/dist/src/client/message-reducer.js +1 -1
  15. package/dist/src/compiled/.vendor-stamp.json +1 -1
  16. package/dist/src/compiled/@opentelemetry/api/index.d.ts +32 -3
  17. package/dist/src/compiled/@vercel/otel/index.d.ts +45 -2
  18. package/dist/src/compiler/extension-compatibility.d.ts +12 -12
  19. package/dist/src/compiler/extension-compatibility.js +1 -1
  20. package/dist/src/compiler/manifest.js +1 -1
  21. package/dist/src/compiler/normalize-agent-config.js +1 -1
  22. package/dist/src/context/build-dynamic-tools.d.ts +7 -0
  23. package/dist/src/context/build-dynamic-tools.js +1 -1
  24. package/dist/src/context/dynamic-tool-lifecycle.d.ts +7 -0
  25. package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
  26. package/dist/src/context/keys.d.ts +13 -1
  27. package/dist/src/context/keys.js +1 -1
  28. package/dist/src/discover/filesystem.d.ts +1 -1
  29. package/dist/src/discover/filesystem.js +1 -1
  30. package/dist/src/evals/cli/eval.js +2 -2
  31. package/dist/src/evals/runner/derive-run-facts.js +1 -1
  32. package/dist/src/execution/dispatch-runtime-actions-step.d.ts +1 -5
  33. package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
  34. package/dist/src/execution/dispatch-turn-step.d.ts +5 -0
  35. package/dist/src/execution/dispatch-turn-step.js +1 -0
  36. package/dist/src/execution/durable-session-migrations/turn-workflow.d.ts +1 -0
  37. package/dist/src/execution/node-step.js +1 -1
  38. package/dist/src/execution/parked-delivery-wait.d.ts +1 -1
  39. package/dist/src/execution/parked-delivery-wait.js +1 -1
  40. package/dist/src/execution/remote-agent-dispatch.d.ts +2 -1
  41. package/dist/src/execution/remote-agent-dispatch.js +1 -1
  42. package/dist/src/execution/route-child-delivery.d.ts +3 -4
  43. package/dist/src/execution/route-child-delivery.js +1 -1
  44. package/dist/src/execution/route-proxied-deliver-step.d.ts +34 -0
  45. package/dist/src/execution/route-proxied-deliver-step.js +1 -0
  46. package/dist/src/execution/runtime-context.js +1 -1
  47. package/dist/src/execution/session-command-inbox.d.ts +2 -2
  48. package/dist/src/execution/session-command-wire.js +1 -1
  49. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  50. package/dist/src/execution/subagent-adapter.js +1 -1
  51. package/dist/src/execution/subagent-event-proxy-step.js +1 -1
  52. package/dist/src/execution/tool-auth.d.ts +9 -0
  53. package/dist/src/execution/tool-auth.js +1 -1
  54. package/dist/src/execution/turn-control-receiver.js +1 -1
  55. package/dist/src/execution/turn-dispatch.js +1 -1
  56. package/dist/src/execution/turn-workflow.js +1 -1
  57. package/dist/src/execution/workflow-entry.js +1 -1
  58. package/dist/src/execution/workflow-runtime.js +1 -1
  59. package/dist/src/execution/workflow-steps.d.ts +1 -27
  60. package/dist/src/execution/workflow-steps.js +1 -1
  61. package/dist/src/harness/ai-sdk-hook-bridge.js +1 -1
  62. package/dist/src/harness/ai-sdk-telemetry.d.ts +19 -0
  63. package/dist/src/harness/ai-sdk-telemetry.js +1 -0
  64. package/dist/src/harness/approval-candidates.d.ts +109 -0
  65. package/dist/src/harness/approval-candidates.js +1 -0
  66. package/dist/src/harness/approval-delivery-coordinator.d.ts +39 -0
  67. package/dist/src/harness/approval-delivery-coordinator.js +1 -0
  68. package/dist/src/harness/authorization.d.ts +1 -0
  69. package/dist/src/harness/authorization.js +1 -1
  70. package/dist/src/harness/channel-delivery-instrumentation.d.ts +25 -0
  71. package/dist/src/harness/channel-delivery-instrumentation.js +1 -0
  72. package/dist/src/harness/execute-tool.d.ts +1 -0
  73. package/dist/src/harness/hitl/approval-input-requests.js +1 -1
  74. package/dist/src/harness/hitl/pending-input-resolution.d.ts +3 -0
  75. package/dist/src/harness/hitl/pending-input-resolution.js +1 -1
  76. package/dist/src/harness/hitl/question-input-requests.js +1 -1
  77. package/dist/src/harness/hitl/session-limit-input-requests.js +1 -1
  78. package/dist/src/harness/input-extraction.js +1 -1
  79. package/dist/src/harness/input-request-resolution.d.ts +22 -0
  80. package/dist/src/harness/input-request-resolution.js +1 -0
  81. package/dist/src/harness/input-requests.d.ts +1 -0
  82. package/dist/src/harness/input-requests.js +1 -1
  83. package/dist/src/harness/instrumentation-config.d.ts +9 -4
  84. package/dist/src/harness/instrumentation-config.js +1 -1
  85. package/dist/src/harness/instrumentation-content.d.ts +5 -0
  86. package/dist/src/harness/instrumentation-content.js +1 -0
  87. package/dist/src/harness/instrumentation-dispatch.d.ts +2 -0
  88. package/dist/src/harness/instrumentation-dispatch.js +1 -0
  89. package/dist/src/harness/instrumentation-lifecycle.d.ts +388 -65
  90. package/dist/src/harness/instrumentation-lifecycle.js +1 -1
  91. package/dist/src/harness/instrumentation-native-events.d.ts +10 -1
  92. package/dist/src/harness/instrumentation-native-events.js +1 -1
  93. package/dist/src/harness/instrumentation-providers.d.ts +50 -0
  94. package/dist/src/harness/instrumentation-providers.js +1 -0
  95. package/dist/src/harness/instrumentation-runtime.d.ts +3 -0
  96. package/dist/src/harness/instrumentation-runtime.js +1 -1
  97. package/dist/src/harness/instrumentation-setup-context.d.ts +12 -0
  98. package/dist/src/harness/instrumentation-setup-context.js +1 -0
  99. package/dist/src/harness/instrumentation-state.d.ts +59 -0
  100. package/dist/src/harness/instrumentation-state.js +1 -0
  101. package/dist/src/harness/messages.d.ts +2 -1
  102. package/dist/src/harness/messages.js +1 -1
  103. package/dist/src/harness/pending-input-batches.d.ts +2 -0
  104. package/dist/src/harness/pending-input-batches.js +1 -1
  105. package/dist/src/harness/runtime-action-settlement-state.d.ts +3 -0
  106. package/dist/src/harness/runtime-action-settlement-state.js +1 -0
  107. package/dist/src/harness/runtime-actions.js +1 -1
  108. package/dist/src/harness/stale-input-responses.js +1 -1
  109. package/dist/src/harness/tool-call-action.d.ts +9 -0
  110. package/dist/src/harness/tool-call-action.js +1 -0
  111. package/dist/src/harness/tool-loop.js +2 -2
  112. package/dist/src/harness/tools.js +1 -1
  113. package/dist/src/harness/types.d.ts +15 -1
  114. package/dist/src/internal/application/compiled-artifacts.d.ts +13 -4
  115. package/dist/src/internal/application/compiled-artifacts.js +5 -4
  116. package/dist/src/internal/application/dev-environment.d.ts +12 -0
  117. package/dist/src/internal/application/dev-environment.js +1 -1
  118. package/dist/src/internal/application/package.js +1 -1
  119. package/dist/src/internal/authored-definition/approval.d.ts +3 -0
  120. package/dist/src/internal/authored-definition/approval.js +1 -0
  121. package/dist/src/internal/authored-definition/connection.js +1 -1
  122. package/dist/src/internal/authored-definition/core.js +1 -1
  123. package/dist/src/internal/authored-definition/schema-backed.js +1 -1
  124. package/dist/src/internal/instrumentation-layout.d.ts +28 -0
  125. package/dist/src/internal/instrumentation-layout.js +1 -0
  126. package/dist/src/internal/materialized-authored-modules.d.ts +13 -2
  127. package/dist/src/internal/materialized-authored-modules.js +1 -1
  128. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  129. package/dist/src/internal/nitro/host/dev-host-fingerprint.js +1 -1
  130. package/dist/src/internal/nitro/host/local-tracing-runtime-plugin.d.ts +5 -1
  131. package/dist/src/internal/nitro/host/local-tracing-runtime-plugin.js +1 -1
  132. package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
  133. package/dist/src/internal/nitro/routes/channel-request-instrumentation.d.ts +2 -3
  134. package/dist/src/internal/nitro/routes/channel-request-instrumentation.js +1 -1
  135. package/dist/src/packages/eve-catalog/src/index.js +1 -1
  136. package/dist/src/protocol/message.d.ts +36 -1
  137. package/dist/src/protocol/message.js +1 -1
  138. package/dist/src/protocol/traceparent.d.ts +10 -0
  139. package/dist/src/protocol/traceparent.js +1 -0
  140. package/dist/src/public/channels/eve.js +1 -1
  141. package/dist/src/public/channels/github/defaults.d.ts +1 -0
  142. package/dist/src/public/channels/github/defaults.js +5 -2
  143. package/dist/src/public/channels/github/dispatch.js +1 -1
  144. package/dist/src/public/channels/github/githubChannel.d.ts +3 -3
  145. package/dist/src/public/channels/github/githubChannel.js +1 -1
  146. package/dist/src/public/channels/github/inbound.d.ts +0 -3
  147. package/dist/src/public/channels/github/inbound.js +1 -1
  148. package/dist/src/public/channels/slack/defaults.js +3 -3
  149. package/dist/src/public/channels/slack/interactions.js +1 -1
  150. package/dist/src/public/channels/slack/slackChannel.d.ts +11 -3
  151. package/dist/src/public/channels/slack/slackChannel.js +1 -1
  152. package/dist/src/public/definitions/approval.d.ts +57 -16
  153. package/dist/src/public/definitions/approval.js +1 -1
  154. package/dist/src/public/definitions/channel.d.ts +2 -2
  155. package/dist/src/public/definitions/channel.js +1 -1
  156. package/dist/src/public/definitions/hook.d.ts +4 -2
  157. package/dist/src/public/instrumentation/index.d.ts +32 -17
  158. package/dist/src/public/instrumentation/index.js +1 -1
  159. package/dist/src/public/instrumentation/otel.d.ts +31 -0
  160. package/dist/src/public/instrumentation/otel.js +1 -0
  161. package/dist/src/public/instrumentation/provider.d.ts +117 -0
  162. package/dist/src/public/instrumentation/provider.js +1 -0
  163. package/dist/src/public/tools/approval/approval-helpers.d.ts +4 -4
  164. package/dist/src/public/tools/index.d.ts +1 -1
  165. package/dist/src/runtime/actions/results.d.ts +3 -3
  166. package/dist/src/runtime/attributes/emit.js +1 -1
  167. package/dist/src/runtime/connections/principal.d.ts +3 -0
  168. package/dist/src/runtime/connections/principal.js +1 -1
  169. package/dist/src/runtime/connections/scoped-authorization.d.ts +3 -5
  170. package/dist/src/runtime/connections/scoped-authorization.js +1 -1
  171. package/dist/src/runtime/connections/types.d.ts +5 -0
  172. package/dist/src/runtime/resolve-agent.js +1 -1
  173. package/dist/src/runtime/resolve-tool.js +1 -1
  174. package/dist/src/setup/index.d.ts +1 -0
  175. package/dist/src/setup/index.js +1 -1
  176. package/dist/src/setup/scaffold/create/project.js +1 -1
  177. package/dist/src/setup/scaffold/version-tokens.js +1 -1
  178. package/dist/src/setup/verified-remote-agent.d.ts +30 -0
  179. package/dist/src/setup/verified-remote-agent.js +1 -0
  180. package/dist/src/shared/agent-definition.d.ts +9 -0
  181. package/dist/src/shared/channel-definition.d.ts +3 -1
  182. package/dist/src/svelte/index.js +1 -1
  183. package/dist/src/svelte/use-eve-agent.js +1 -1
  184. package/dist/src/tracing/agent-action-instrumentation.d.ts +31 -0
  185. package/dist/src/tracing/agent-action-instrumentation.js +1 -0
  186. package/dist/src/tracing/agent-approval-instrumentation.d.ts +13 -0
  187. package/dist/src/tracing/agent-approval-instrumentation.js +1 -0
  188. package/dist/src/tracing/agent-channel-delivery-instrumentation.d.ts +13 -0
  189. package/dist/src/tracing/agent-channel-delivery-instrumentation.js +1 -0
  190. package/dist/src/tracing/agent-otel-content.d.ts +6 -0
  191. package/dist/src/tracing/agent-otel-content.js +2 -2
  192. package/dist/src/tracing/agent-otel-provider.d.ts +7 -7
  193. package/dist/src/tracing/agent-otel-provider.js +2 -2
  194. package/dist/src/tracing/agent-otel-usage.d.ts +4 -0
  195. package/dist/src/tracing/agent-otel-usage.js +1 -0
  196. package/dist/src/tracing/agent-span-id-generator.d.ts +2 -0
  197. package/dist/src/tracing/agent-span-id-generator.js +1 -1
  198. package/dist/src/tracing/agent-tool-instrumentation.d.ts +28 -0
  199. package/dist/src/tracing/agent-tool-instrumentation.js +1 -0
  200. package/dist/src/tracing/agent-trace-context-store.d.ts +8 -1
  201. package/dist/src/tracing/agent-trace-context-store.js +1 -1
  202. package/dist/src/tracing/agent-trace-span-processor.d.ts +0 -1
  203. package/dist/src/tracing/agent-trace-span-processor.js +1 -1
  204. package/dist/src/tracing/agent-trace-state.d.ts +33 -3
  205. package/dist/src/tracing/agent-trace-state.js +1 -1
  206. package/dist/src/tracing/batch-span-processor.d.ts +20 -0
  207. package/dist/src/tracing/batch-span-processor.js +1 -0
  208. package/dist/src/tracing/content-attributes.d.ts +28 -0
  209. package/dist/src/tracing/content-attributes.js +1 -0
  210. package/dist/src/tracing/content-span-processor.d.ts +19 -0
  211. package/dist/src/tracing/content-span-processor.js +1 -0
  212. package/dist/src/tracing/install-instrumentation-runtime.d.ts +19 -0
  213. package/dist/src/tracing/install-instrumentation-runtime.js +1 -0
  214. package/dist/src/tracing/local-instrumentation-runtime.js +1 -1
  215. package/dist/src/tracing/local-traces.d.ts +56 -0
  216. package/dist/src/tracing/local-traces.js +1 -0
  217. package/dist/src/tracing/otel-declaration.d.ts +150 -0
  218. package/dist/src/tracing/otel-declaration.js +1 -0
  219. package/dist/src/tracing/otel-registration.d.ts +21 -0
  220. package/dist/src/tracing/otel-registration.js +1 -0
  221. package/dist/src/tracing/vercel-runtime-span-exporter.d.ts +5 -0
  222. package/dist/src/tracing/vercel-runtime-span-exporter.js +1 -0
  223. package/dist/src/vue/index.js +1 -1
  224. package/dist/src/vue/use-eve-agent.js +1 -1
  225. package/docs/guides/instrumentation.md +22 -0
  226. package/package.json +7 -1
  227. package/dist/src/harness/otel-integration.d.ts +0 -12
  228. package/dist/src/harness/otel-integration.js +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,33 @@
1
1
  # eve
2
2
 
3
+ ## 0.34.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 11908eb: Tools and connections can now define optional `request` and `response` approval policies, while preserving the existing function shorthand. Response policies can authenticate the responder and return a tagged allow or rejection decision, and authorization token results can expose a stable provider subject.
8
+
9
+ ### Patch Changes
10
+
11
+ - 82c1314: Instrumentation providers can observe durable inbound channel deliveries from processing start through the resulting turn terminal. OpenTelemetry destinations receive consumer spans under the session window, with traced HTTP requests represented as links rather than parents.
12
+ - 29313be: Reconstruct durable `agent.action` spans when runtime actions settle, including across worker replacement, and record each action's exact caller-accepted duration, kind, outcome, stable error code, and subagent usage. Remote eve sessions join the caller action trace through W3C `traceparent`; older receivers may ignore the header. Human approval waits appear as durable `agent.approval` child spans, while chat spans use standard self-contained model input and output attributes.
13
+ - 749581b: Instrumentation lifecycle events now use eve-owned payloads and flat event names, including `step.attempt.*` and durable `input.requested`/`input.resolved` boundaries, instead of AI SDK callback types and paired hooks. Existing spans and attributes are unchanged.
14
+ - 7770fba: Add an experimental Buzz ACP compatibility adapter that publishes threaded and top-level responses through the local Buzz CLI, prevents duplicate replies, and defaults to Buzz's owner-only author gate. Shared service agents must explicitly opt in to letting multiple accepted Buzz senders use the same eve authentication and connections.
15
+ - 3eba855: Post GitHub human-in-the-loop prompts by default so users can see and answer pending input requests in the issue or pull request thread.
16
+ - f06633b: Give every instrumentation lifecycle event a replay-stable `idempotencyKey` derived from durable eve identity, allowing providers to upsert one record across retries and worker replays.
17
+ - c90a459: Add the experimental `agent/instrumentation/` provider layout with durable lifecycle handlers, including user input boundaries and action settlement-time, outcome, error-code, and usage metadata, final setup context, reserved OpenTelemetry destinations, and coordinated flush and shutdown. OpenTelemetry singleton settings and destinations are exposed through `eve/instrumentation/otel`, and eve's AI SDK bridge composes with registered integrations.
18
+ - d304544: OpenTelemetry destinations can independently decline input or output content. Redaction covers span attributes, exception and custom events, and status messages without mutating spans shared with other destinations; `EVE_TRACES_CONTENT=off` now narrows only local traces.
19
+ - 084f8f1: eve now assembles its local OpenTelemetry runtime from declarative singleton settings and ordered destinations. The local trace spool is an ordinary span processor, and tracer-provider ownership, flushing, and shutdown are managed centrally without changing recorded spans.
20
+ - 3b43b3d: Instrumentation providers can choose metadata-only or content-bearing events. eve builds sensitive projections only when requested and keeps prompts, responses, tool payloads, exceptions, and opaque provider metadata away from metadata-only providers.
21
+ - 1528fda: Add durable operation-scoped state to instrumentation handlers, isolated by provider and automatically released at terminal boundaries. Bound each handler and persist start-handler abandonment so a stalled provider cannot block the bus or later receive a mismatched terminal.
22
+ - 760c14a: Allow canary builds to scaffold projects pinned to their exact package artifact URL.
23
+ - 4138e64: Publish durable lifecycle events for runtime actions and user input requests, including approval decisions that resume in another worker. Action terminals expose caller-accepted settlement time, exact outcome, stable error code, and subagent usage even when settlement crosses workers. Framework skill loads are also preserved in eval tool-call facts.
24
+
25
+ ## 0.33.3
26
+
27
+ ### Patch Changes
28
+
29
+ - 22975d3: Keep GitHub comment text separate from channel metadata so option replies can resume pending input requests.
30
+
3
31
  ## 0.33.2
4
32
 
5
33
  ### Patch Changes
@@ -1,5 +1,6 @@
1
1
  import type { UserContent } from "ai";
2
2
  import type { ChannelAdapter } from "#channel/adapter.js";
3
+ import { type ChannelDeliverySource } from "#channel/delivery-metadata.js";
3
4
  import type { SendPayload } from "#channel/routes.js";
4
5
  import { type Session } from "#channel/session.js";
5
6
  import type { CancelTurnResult, ClearSessionResult, CompactSessionResult, ResetSessionResult, Runtime, SessionAuthContext, SessionCallback, TurnPolicy } from "#channel/types.js";
@@ -42,9 +43,7 @@ export declare function createChannelAddress<TState = undefined>(input: {
42
43
  readonly adapter: ChannelAdapter<any>;
43
44
  readonly channelName: string;
44
45
  readonly continuationToken: string;
45
- readonly metadata?: {
46
- readonly requestId?: string;
47
- };
46
+ readonly metadata?: ChannelDeliverySource;
48
47
  readonly runtime: Runtime;
49
48
  readonly turnPolicy?: TurnPolicy;
50
49
  }): ChannelAddress<TState>;
@@ -52,9 +51,7 @@ export declare function createChannelAddress<TState = undefined>(input: {
52
51
  export declare function createChannelAddressFn<TState = undefined>(input: {
53
52
  readonly adapter: ChannelAdapter<any>;
54
53
  readonly channelName: string;
55
- readonly metadata?: {
56
- readonly requestId?: string;
57
- };
54
+ readonly metadata?: ChannelDeliverySource;
58
55
  readonly runtime: Runtime;
59
56
  readonly turnPolicy?: TurnPolicy;
60
57
  }): ChannelAddressFn<TState>;
@@ -1 +1 @@
1
- import{createSession,sessionCallbackToTurnCaller}from"#channel/session.js";import{normalizeSendInput,serializeUrlFilePartsInMessage}from"#channel/send-input.js";import{DEFAULT_TURN_POLICY}from"#channel/types.js";import{isRuntimeSessionOwnershipConflictError}from"#execution/runtime-errors.js";import{isReservedSessionCommandToken}from"#execution/session-command-token.js";function createChannelAddress(r){let i=r.metadata??{},a=`${r.channelName}:${r.continuationToken}`;if(isReservedSessionCommandToken(a))throw Error(`Channel address "${a}" uses eve's reserved session namespace.`);return{continuationToken:r.continuationToken,async deliver(n,o){let s=normalizeSendInput(n),c=sessionCallbackToTurnCaller(o.callback),l={auth:o.auth,kind:`send`,payload:{...s,message:serializeUrlFilePartsInMessage(s.message)},requestId:i.requestId,turnPolicy:s.message===void 0?void 0:o.turnPolicy??r.turnPolicy??DEFAULT_TURN_POLICY},u=c===void 0?l:{...l,caller:c},dispatch=async()=>{let t=await r.runtime.dispatchContinuation({command:u,continuationToken:a});return t.status===`accepted`?createSession(t.sessionId,r.runtime,{...i,turnPolicy:r.turnPolicy}):void 0},d=await dispatch();if(d!==void 0)return d;if(s.inputResponses&&s.inputResponses.length>0)throw Error(`Cannot deliver inputResponses — the target session was not found via continuation token.`);let f=o.state,p={adapter:f===void 0?r.adapter:{...r.adapter,state:{...r.adapter.state,...f}},auth:o.auth,capabilities:o.mode===`task`?void 0:{requestInput:!0},callback:o.callback,channelName:r.channelName,continuationToken:a,initiatorAuth:o.initiatorAuth,input:{context:s.context,message:serializeUrlFilePartsInMessage(s.message)??``,outputSchema:s.outputSchema},mode:o.mode??`conversation`,requestId:i.requestId,title:o.title};try{return createSession((await r.runtime.createSession(p)).sessionId,r.runtime,{...i,turnPolicy:r.turnPolicy})}catch(e){if(!isRuntimeSessionOwnershipConflictError(e))throw e;let t=await dispatch();if(t!==void 0)return t;throw e}},async send(e,t){return await this.deliver({message:e},t)},async respond(e,t){if(e===void 0||e.length===0)throw Error(`respond() requires at least one input response.`);return await this.deliver({inputResponses:e},t)},async cancel(e){return await r.runtime.dispatchContinuation({command:{kind:`cancel`,turnId:e?.turnId},continuationToken:a})},async compact(){return await r.runtime.dispatchContinuation({command:{kind:`compact`},continuationToken:a})},async clear(){return await r.runtime.dispatchContinuation({command:{kind:`clear`},continuationToken:a})},async reset(e){return await r.runtime.dispatchContinuation({command:{kind:`reset`,reason:e?.reason},continuationToken:a})},async resolveSession(){let t=await r.runtime.resolveContinuation(a);return t===void 0?void 0:createSession(t.sessionId,r.runtime,{...i,turnPolicy:r.turnPolicy})}}}function createChannelAddressFn(e){return t=>createChannelAddress({...e,continuationToken:t})}export{createChannelAddress,createChannelAddressFn};
1
+ import{createSession,sessionCallbackToTurnCaller}from"#channel/session.js";import{createChannelDeliveryMetadata}from"#channel/delivery-metadata.js";import{normalizeSendInput,serializeUrlFilePartsInMessage}from"#channel/send-input.js";import{DEFAULT_TURN_POLICY}from"#channel/types.js";import{isRuntimeSessionOwnershipConflictError}from"#execution/runtime-errors.js";import{isReservedSessionCommandToken}from"#execution/session-command-token.js";function createChannelAddress(r){let i=r.metadata??{},a=`${r.channelName}:${r.continuationToken}`;if(isReservedSessionCommandToken(a))throw Error(`Channel address "${a}" uses eve's reserved session namespace.`);return{continuationToken:r.continuationToken,async deliver(n,o){let s=i.channelKind!==void 0&&i.channelName!==void 0?createChannelDeliveryMetadata(i):void 0,c=normalizeSendInput(n),l=sessionCallbackToTurnCaller(o.callback),u={auth:o.auth,delivery:s,kind:`send`,payload:{...c,message:serializeUrlFilePartsInMessage(c.message)},requestId:i.requestId,turnPolicy:c.message===void 0?void 0:o.turnPolicy??r.turnPolicy??DEFAULT_TURN_POLICY},d=l===void 0?u:{...u,caller:l},dispatch=async()=>{let t=await r.runtime.dispatchContinuation({command:d,continuationToken:a});return t.status===`accepted`?createSession(t.sessionId,r.runtime,{...i,turnPolicy:r.turnPolicy}):void 0},f=await dispatch();if(f!==void 0)return f;if(c.inputResponses&&c.inputResponses.length>0)throw Error(`Cannot deliver inputResponses — the target session was not found via continuation token.`);let p=o.state,m={adapter:p===void 0?r.adapter:{...r.adapter,state:{...r.adapter.state,...p}},auth:o.auth,capabilities:o.mode===`task`?void 0:{requestInput:!0},callback:o.callback,channelName:r.channelName,continuationToken:a,delivery:s,initiatorAuth:o.initiatorAuth,input:{context:c.context,message:serializeUrlFilePartsInMessage(c.message)??``,outputSchema:c.outputSchema},mode:o.mode??`conversation`,requestId:i.requestId,title:o.title};try{return createSession((await r.runtime.createSession(m)).sessionId,r.runtime,{...i,turnPolicy:r.turnPolicy})}catch(e){if(!isRuntimeSessionOwnershipConflictError(e))throw e;let t=await dispatch();if(t!==void 0)return t;throw e}},async send(e,t){return await this.deliver({message:e},t)},async respond(e,t){if(e===void 0||e.length===0)throw Error(`respond() requires at least one input response.`);return await this.deliver({inputResponses:e},t)},async cancel(e){return await r.runtime.dispatchContinuation({command:{kind:`cancel`,turnId:e?.turnId},continuationToken:a})},async compact(){return await r.runtime.dispatchContinuation({command:{kind:`compact`},continuationToken:a})},async clear(){return await r.runtime.dispatchContinuation({command:{kind:`clear`},continuationToken:a})},async reset(e){return await r.runtime.dispatchContinuation({command:{kind:`reset`,reason:e?.reason},continuationToken:a})},async resolveSession(){let t=await r.runtime.resolveContinuation(a);return t===void 0?void 0:createSession(t.sessionId,r.runtime,{...i,turnPolicy:r.turnPolicy})}}}function createChannelAddressFn(e){return t=>createChannelAddress({...e,continuationToken:t})}export{createChannelAddress,createChannelAddressFn};
@@ -1,5 +1,6 @@
1
1
  import type { UserContent } from "ai";
2
2
  import type { ChannelAdapter } from "#channel/adapter.js";
3
+ import type { ChannelDeliverySource } from "#channel/delivery-metadata.js";
3
4
  import { type ChannelAddressDeliveryOptions } from "#channel/channel-address.js";
4
5
  import type { SendPayload } from "#channel/routes.js";
5
6
  import type { Session } from "#channel/session.js";
@@ -65,9 +66,7 @@ export interface InternalChannelSource<TState = undefined> extends ChannelSource
65
66
  export declare function createChannelOperations<TState = undefined>(input: {
66
67
  readonly adapter: ChannelAdapter<any>;
67
68
  readonly channelName: string;
68
- readonly metadata?: {
69
- readonly requestId?: string;
70
- };
69
+ readonly metadata?: ChannelDeliverySource;
71
70
  readonly runtime: Runtime;
72
71
  readonly turnPolicy?: TurnPolicy;
73
72
  }): ChannelReceiveContext<TState>;
@@ -0,0 +1,9 @@
1
+ import type { ChannelDeliveryMetadata, SessionTraceContext } from "#channel/types.js";
2
+ export interface ChannelDeliverySource {
3
+ readonly channelKind: string;
4
+ readonly channelName: string;
5
+ readonly requestId?: string;
6
+ readonly requestTraceContext?: SessionTraceContext;
7
+ }
8
+ /** Mints the opaque identity for one inbound channel operation. */
9
+ export declare function createChannelDeliveryMetadata(source: ChannelDeliverySource): ChannelDeliveryMetadata;
@@ -0,0 +1 @@
1
+ function createChannelDeliveryMetadata(e){return{...e,deliveryId:crypto.randomUUID()}}export{createChannelDeliveryMetadata};
@@ -32,6 +32,7 @@ export interface RouteHandlerArgs<TState = undefined> {
32
32
  }
33
33
  export interface SendPayload {
34
34
  readonly message?: string | UserContent;
35
+ readonly [key: string]: unknown;
35
36
  readonly inputResponses?: readonly InputResponse[];
36
37
  /**
37
38
  * Context strings contributed by the channel. eve appends each entry
@@ -1,4 +1,5 @@
1
1
  import type { ContextAccessor } from "#context/key.js";
2
+ import { type ChannelDeliverySource } from "#channel/delivery-metadata.js";
2
3
  import type { MessageStreamEvent } from "#protocol/message.js";
3
4
  import type { UserContent } from "ai";
4
5
  import type { CancelTurnResult, ClearSessionResult, CompactSessionResult, ResetSessionResult, Runtime, SessionAuthContext, SessionCallback, SessionSendCommandResult, TurnPolicy, TurnCaller } from "#channel/types.js";
@@ -57,13 +58,11 @@ export interface SessionHandle {
57
58
  rekey(rawToken: string): void;
58
59
  };
59
60
  }
60
- export declare function createSession(id: string, runtime: Runtime, metadata?: {
61
- readonly requestId?: string;
61
+ export declare function createSession(id: string, runtime: Runtime, metadata?: Partial<ChannelDeliverySource> & {
62
62
  readonly turnPolicy?: TurnPolicy;
63
63
  }): Session;
64
64
  /** Builds an I/O-free factory for fixed session-ID handles. */
65
- export declare function createAttachSessionFn(runtime: Runtime, metadata?: {
66
- readonly requestId?: string;
65
+ export declare function createAttachSessionFn(runtime: Runtime, metadata?: Partial<ChannelDeliverySource> & {
67
66
  readonly turnPolicy?: TurnPolicy;
68
67
  }): (sessionId: string) => Session;
69
68
  /**
@@ -1 +1 @@
1
- import{serializeUrlFilePartsInMessage}from"#channel/send-input.js";import{DEFAULT_TURN_POLICY}from"#channel/types.js";import{AuthKey,ContinuationTokenKey,InitiatorAuthKey,SessionIdKey}from"#context/keys.js";import{toChannelLocalContinuationToken}from"#shared/continuation-token.js";function createSession(n,r,i={}){return{id:n,async send(a,o){let s=sessionCallbackToTurnCaller(o.callback),c={message:serializeUrlFilePartsInMessage(a)};o.context!==void 0&&(c.context=o.context),o.outputSchema!==void 0&&(c.outputSchema=o.outputSchema);let l={auth:o.auth,kind:`send`,payload:c,requestId:i.requestId,turnPolicy:o.turnPolicy??i.turnPolicy??DEFAULT_TURN_POLICY};return await r.dispatchSession({command:s===void 0?l:{...l,caller:s},sessionId:n})},async respond(e,t){if(e.length===0)throw Error(`respond() requires at least one input response.`);let a=sessionCallbackToTurnCaller(t.callback),o={inputResponses:e};t.context!==void 0&&(o.context=t.context),t.outputSchema!==void 0&&(o.outputSchema=t.outputSchema);let s={auth:t.auth,kind:`send`,payload:o,requestId:i.requestId};return await r.dispatchSession({command:a===void 0?s:{...s,caller:a},sessionId:n})},async cancel(e){return await r.dispatchSession({command:{kind:`cancel`,turnId:e?.turnId},sessionId:n})},async compact(){return await r.dispatchSession({command:{kind:`compact`},sessionId:n})},async clear(){return await r.dispatchSession({command:{kind:`clear`},sessionId:n})},async reset(e){return await r.dispatchSession({command:{kind:`reset`,reason:e?.reason},sessionId:n})},async getEventStream(e){return r.getEventStream(n,e)},async getStreamTailIndex(){return r.getStreamTailIndex(n)}}}function createAttachSessionFn(e,t={}){return n=>createSession(n,e,t)}function buildSessionHandle(e){return{get id(){return e.get(SessionIdKey)??``},get auth(){return{current:e.get(AuthKey)??null,initiator:e.get(InitiatorAuthKey)??null}},get continuation(){let t=e.get(ContinuationTokenKey);if(!(t===void 0||t.length===0))return{token:toChannelLocalContinuationToken(t),rekey(n){let i=namespaceContinuationToken(t,n);t!==i&&e.set(ContinuationTokenKey,i)}}}}}function namespaceContinuationToken(e,t){let n=e.indexOf(`:`);if(n<=0)throw Error(`Cannot set session continuation token without an existing namespaced continuation token. Start the session with a placeholder continuationToken.`);return`${e.slice(0,n+1)}${t}`}function sessionCallbackToTurnCaller(e){return e===void 0?void 0:{callId:e.callId,replyTo:{kind:`callback`,url:e.url},subagentName:e.subagentName}}export{buildSessionHandle,createAttachSessionFn,createSession,sessionCallbackToTurnCaller};
1
+ import{createChannelDeliveryMetadata}from"#channel/delivery-metadata.js";import{serializeUrlFilePartsInMessage}from"#channel/send-input.js";import{DEFAULT_TURN_POLICY}from"#channel/types.js";import{AuthKey,ContinuationTokenKey,InitiatorAuthKey,SessionIdKey}from"#context/keys.js";import{toChannelLocalContinuationToken}from"#shared/continuation-token.js";function createSession(e,r,i={}){return{id:e,async send(a,o){let s=createDelivery(i),c=sessionCallbackToTurnCaller(o.callback),l={message:serializeUrlFilePartsInMessage(a)};o.context!==void 0&&(l.context=o.context),o.outputSchema!==void 0&&(l.outputSchema=o.outputSchema);let u={auth:o.auth,delivery:s,kind:`send`,payload:l,requestId:i.requestId,turnPolicy:o.turnPolicy??i.turnPolicy??DEFAULT_TURN_POLICY};return await r.dispatchSession({command:c===void 0?u:{...u,caller:c},sessionId:e})},async respond(t,n){if(t.length===0)throw Error(`respond() requires at least one input response.`);let a=sessionCallbackToTurnCaller(n.callback),o=createDelivery(i),s={inputResponses:t};n.context!==void 0&&(s.context=n.context),n.outputSchema!==void 0&&(s.outputSchema=n.outputSchema);let c={auth:n.auth,delivery:o,kind:`send`,payload:s,requestId:i.requestId};return await r.dispatchSession({command:a===void 0?c:{...c,caller:a},sessionId:e})},async cancel(t){return await r.dispatchSession({command:{kind:`cancel`,turnId:t?.turnId},sessionId:e})},async compact(){return await r.dispatchSession({command:{kind:`compact`},sessionId:e})},async clear(){return await r.dispatchSession({command:{kind:`clear`},sessionId:e})},async reset(t){return await r.dispatchSession({command:{kind:`reset`,reason:t?.reason},sessionId:e})},async getEventStream(t){return r.getEventStream(e,t)},async getStreamTailIndex(){return r.getStreamTailIndex(e)}}}function createAttachSessionFn(e,t={}){return n=>createSession(n,e,t)}function createDelivery(t){return t.channelKind!==void 0&&t.channelName!==void 0?createChannelDeliveryMetadata(t):void 0}function buildSessionHandle(e){return{get id(){return e.get(SessionIdKey)??``},get auth(){return{current:e.get(AuthKey)??null,initiator:e.get(InitiatorAuthKey)??null}},get continuation(){let t=e.get(ContinuationTokenKey);if(!(t===void 0||t.length===0))return{token:toChannelLocalContinuationToken(t),rekey(n){let r=namespaceContinuationToken(t,n);t!==r&&e.set(ContinuationTokenKey,r)}}}}}function namespaceContinuationToken(e,t){let n=e.indexOf(`:`);if(n<=0)throw Error(`Cannot set session continuation token without an existing namespaced continuation token. Start the session with a placeholder continuationToken.`);return`${e.slice(0,n+1)}${t}`}function sessionCallbackToTurnCaller(e){return e===void 0?void 0:{callId:e.callId,replyTo:{kind:`callback`,url:e.url},subagentName:e.subagentName}}export{buildSessionHandle,createAttachSessionFn,createSession,sessionCallbackToTurnCaller};
@@ -1,5 +1,5 @@
1
1
  import type { UserContent } from "ai";
2
- import type { UnstampedMessageStreamEvent, MessageStreamEvent } from "#protocol/message.js";
2
+ import type { MessageStreamEvent, UnstampedMessageStreamEvent } from "#protocol/message.js";
3
3
  import type { CancelTurnResult as ProtocolCancelTurnResult } from "#protocol/cancel-turn.js";
4
4
  import type { RunMode } from "#shared/run-mode.js";
5
5
  import type { RuntimeSubagentChildResult } from "#runtime/actions/types.js";
@@ -72,6 +72,18 @@ export interface SessionTraceContext {
72
72
  readonly traceFlags: number;
73
73
  readonly traceId: string;
74
74
  }
75
+ /** Framework-owned identity for one inbound channel operation. */
76
+ export interface ChannelDeliveryMetadata {
77
+ readonly channelKind: string;
78
+ readonly channelName: string;
79
+ readonly deliveryId: string;
80
+ readonly requestId?: string;
81
+ readonly requestTraceContext?: SessionTraceContext;
82
+ }
83
+ /** Associates delivery metadata with one payload in a durable envelope. */
84
+ export interface ChannelDeliveryMetadataEntry extends ChannelDeliveryMetadata {
85
+ readonly payloadIndex: number;
86
+ }
75
87
  /**
76
88
  * Authenticated caller principal attached to a request.
77
89
  *
@@ -135,6 +147,7 @@ export type SessionCommand = {
135
147
  readonly caller?: TurnCaller;
136
148
  readonly kind: "send";
137
149
  readonly payload: DeliverPayload;
150
+ readonly delivery?: ChannelDeliveryMetadata;
138
151
  readonly requestId?: string;
139
152
  readonly turnPolicy?: TurnPolicy;
140
153
  } | {
@@ -188,6 +201,8 @@ export interface DeliverHookPayload {
188
201
  readonly auth?: SessionAuthContext | null;
189
202
  /** Delegated caller waiting for this turn's settled result. */
190
203
  readonly caller?: TurnCaller;
204
+ /** Additive durable metadata. Absent on envelopes written by older deployments. */
205
+ readonly deliveryMetadata?: readonly ChannelDeliveryMetadataEntry[];
191
206
  /** Inbound channel request id used only for workflow attributes. */
192
207
  readonly requestId?: string;
193
208
  readonly kind: "deliver";
@@ -244,9 +259,9 @@ export interface SubagentInputRequestHookPayload {
244
259
  readonly kind: "subagent-input-request";
245
260
  readonly subagentName: string;
246
261
  }
247
- /** Authorization lifecycle event forwarded from a delegated child. */
262
+ /** Responder-specific lifecycle event forwarded from a delegated child. */
248
263
  export type SubagentAuthorizationEvent = Extract<UnstampedMessageStreamEvent, {
249
- type: "authorization.required" | "authorization.completed";
264
+ type: "approval.candidate" | "approval.settled" | "authorization.required" | "authorization.completed";
250
265
  }>;
251
266
  /**
252
267
  * Proxy payload sent from a child subagent while it waits for authorization.
@@ -319,6 +334,8 @@ export interface RunInput {
319
334
  */
320
335
  readonly channelName?: string;
321
336
  readonly channelMetadata?: ChannelInstrumentationProjection;
337
+ /** Inbound channel operation that created this session. */
338
+ readonly delivery?: ChannelDeliveryMetadata;
322
339
  /**
323
340
  * Authenticated caller principal for this session. `null` means the
324
341
  * request was accepted with no credentials.
@@ -1796,6 +1796,39 @@ function reduceMessageData(data, event) {
1796
1796
  }
1797
1797
  return next;
1798
1798
  }
1799
+ case "approval.candidate": return data;
1800
+ case "approval.settled": {
1801
+ const existing = findToolPartByApprovalId(data, event.data.requestId);
1802
+ if (existing === void 0) return data;
1803
+ if (event.data.outcome === "approved") return updateToolPart(data, existing.toolCallId, {
1804
+ approval: {
1805
+ approved: true,
1806
+ id: event.data.requestId,
1807
+ reason: void 0
1808
+ },
1809
+ input: existing.input,
1810
+ state: "approval-responded",
1811
+ stepIndex: existing.stepIndex,
1812
+ toolCallId: existing.toolCallId,
1813
+ toolMetadata: existing.toolMetadata,
1814
+ toolName: existing.toolName,
1815
+ type: "dynamic-tool"
1816
+ });
1817
+ return updateToolPart(data, existing.toolCallId, {
1818
+ approval: {
1819
+ approved: false,
1820
+ id: event.data.requestId,
1821
+ reason: "Tool execution was cancelled."
1822
+ },
1823
+ input: existing.input,
1824
+ state: "output-denied",
1825
+ stepIndex: existing.stepIndex,
1826
+ toolCallId: existing.toolCallId,
1827
+ toolMetadata: existing.toolMetadata,
1828
+ toolName: existing.toolName,
1829
+ type: "dynamic-tool"
1830
+ });
1831
+ }
1799
1832
  case "action.result": {
1800
1833
  const descriptor = normalizeActionResult(event.data.result);
1801
1834
  const existing = findToolPart(data, event.data.result.callId);
@@ -1796,6 +1796,39 @@ function reduceMessageData(data, event) {
1796
1796
  }
1797
1797
  return next;
1798
1798
  }
1799
+ case "approval.candidate": return data;
1800
+ case "approval.settled": {
1801
+ const existing = findToolPartByApprovalId(data, event.data.requestId);
1802
+ if (existing === void 0) return data;
1803
+ if (event.data.outcome === "approved") return updateToolPart(data, existing.toolCallId, {
1804
+ approval: {
1805
+ approved: true,
1806
+ id: event.data.requestId,
1807
+ reason: void 0
1808
+ },
1809
+ input: existing.input,
1810
+ state: "approval-responded",
1811
+ stepIndex: existing.stepIndex,
1812
+ toolCallId: existing.toolCallId,
1813
+ toolMetadata: existing.toolMetadata,
1814
+ toolName: existing.toolName,
1815
+ type: "dynamic-tool"
1816
+ });
1817
+ return updateToolPart(data, existing.toolCallId, {
1818
+ approval: {
1819
+ approved: false,
1820
+ id: event.data.requestId,
1821
+ reason: "Tool execution was cancelled."
1822
+ },
1823
+ input: existing.input,
1824
+ state: "output-denied",
1825
+ stepIndex: existing.stepIndex,
1826
+ toolCallId: existing.toolCallId,
1827
+ toolMetadata: existing.toolMetadata,
1828
+ toolName: existing.toolName,
1829
+ type: "dynamic-tool"
1830
+ });
1831
+ }
1799
1832
  case "action.result": {
1800
1833
  const descriptor = normalizeActionResult(event.data.result);
1801
1834
  const existing = findToolPart(data, event.data.result.callId);
@@ -1,2 +1,2 @@
1
1
  import{formatCompactTokenCount}from"../stream-format.js";import{formatPayloadContent,wrapPlainText}from"./trace-content.js";import{SURFACE_CLOSE}from"./trace-surfaces.js";import{formatElapsed}from"#cli/format-elapsed.js";import{clipVisible,stripTerminalControls,visibleLength}from"#cli/ui/terminal-text.js";import{compareLocalTraceSpans}from"#tracing/local-trace-reader.js";function buildConversationItems(e){let t=new Map(e.spans.map(e=>[e.spanId,e])),n=new Map;for(let t of e.spans){if(t.parentSpanId===void 0)continue;let e=n.get(t.parentSpanId)??[];e.push(t),n.set(t.parentSpanId,e)}for(let e of n.values())e.sort(compareLocalTraceSpans);let r=e.spans.filter(e=>e.name===`agent.turn`);r.sort(compareLocalTraceSpans);let i=[];for(let e of r){let r=turnSubagent(e),a=[],walk=e=>{a.push(e);for(let t of n.get(e.spanId)??[])walk(t)};if(walk(e),a.sort(compareLocalTraceSpans),i.length===0){let e=a.find(e=>isModelSpan(e)&&typeof e.attributes[`ai.prompt.system`]==`string`),t=e?.attributes[`ai.prompt.system`];e!==void 0&&typeof t==`string`&&t.length>0&&i.push({item:{kind:`system`,durationMs:0,error:!1,span:e,subagent:r,text:t},order:0n})}let s=extractUserText(a.find(isModelSpan));s!==void 0&&i.push({item:{kind:`user`,durationMs:0,error:!1,span:e,subagent:r,text:s},order:e.startTimeNs});for(let e of a)if(isModelSpan(e)){let n=stringAttribute(e,`ai.response.text`),a=stringAttribute(e,`ai.response.reasoning`),s=numberAttribute(e,`agent.usage.input_tokens`)!==void 0||numberAttribute(e,`agent.usage.output_tokens`)!==void 0,c=e.attributes[`ai.response.tool_calls`]!==void 0;if((n===void 0||n.trim().length===0)&&(a===void 0||a.trim().length===0)&&!s&&!c&&e.statusCode!==2)continue;i.push({item:{kind:`assistant`,costUsd:stepCostUsd(e,t),durationMs:spanDurationMs(e),error:e.statusCode===2,inputTokens:numberAttribute(e,`agent.usage.input_tokens`),model:stringAttribute(e,`gen_ai.request.model`),outputTokens:numberAttribute(e,`agent.usage.output_tokens`),reasoning:a,span:e,subagent:r,text:n,toolCallNames:c?parseToolCallNames(stringAttribute(e,`ai.response.tool_calls`)):void 0},order:e.startTimeNs});for(let t of parseProviderToolResults(stringAttribute(e,`ai.response.tool_results`)))i.push({item:{kind:`tool`,args:t.args,durationMs:0,error:t.error,name:stripTerminalControls(t.name),result:t.result,span:e,subagent:r},order:e.startTimeNs})}else e.name===`ai.toolCall`&&i.push({item:{kind:`tool`,args:stringAttribute(e,`gen_ai.tool.call.arguments`),durationMs:spanDurationMs(e),error:e.statusCode===2,name:stripTerminalControls(stringAttribute(e,`gen_ai.tool.name`)??`tool`),result:unwrapJsonString(stringAttribute(e,`gen_ai.tool.call.result`)),span:e,subagent:r},order:e.startTimeNs})}return i.sort((e,t)=>e.order===t.order?0:e.order<t.order?-1:1).map(e=>e.item)}function turnSubagent(e){let t=stringAttribute(e,`agent.parent.turn.id`);if(t===void 0)return;let n=stringAttribute(e,`agent.subagent.name`);return{name:n===void 0?void 0:stripTerminalControls(n),parentCallId:stringAttribute(e,`agent.parent.call_id`),parentTurnId:t}}function renderConversationItem(r,a,s,c,l,u){let{colors:d,glyph:f}=s,p=Math.max(8,a-8),m=conversationItemExpandable(r,a),h=s.color?u:void 0,g=h?.primaryText??d.white,_,v,y=[];if(r.kind===`tool`){let e=d.bold(g(r.name??`tool`));_=`${foldMarker(l,m,s)}${e}`,v=r.durationMs>0?d.dim(formatElapsed(r.durationMs)):``;let n=r.args===void 0?[]:formatPayloadContent(r.args,p),a=r.result===void 0?[]:formatPayloadContent(r.result,p),o=l?n:capLines(n,p),c=l?a:capLines(a,p);o.length>0&&y.push(``,d.dim(`Input:`),``,...o),c.length>0&&y.push(``,d.dim(`Output:`),``,...c)}else if(r.kind===`system`){_=`${foldMarker(l,m,s)}${d.bold(g(`system`))}`,v=d.dim(`~${formatCompactTokenCount(estimateTokens(r.text??``))} tokens`);let t=wrapPlainText(r.text??``,p);y.push(...l?t:capLines(t,p))}else if(r.kind===`assistant`){_=`${foldMarker(l,m,s)}${d.bold(g(`assistant`))}${r.model===void 0?``:d.dim(` · ${stripTerminalControls(r.model)}`)}`,v=assistantMetrics(r,f,d);let e=r.reasoning===void 0||r.reasoning.trim().length===0?[]:wrapPlainText(r.reasoning,p),t=r.text===void 0||r.text.trim().length===0?[]:wrapPlainText(r.text,p),i=(l?e:capLines(e,p)).map(e=>d.dim(e)),a=l?t:capLines(t,p);if(i.length>0&&(y.push(d.dim(`Thought:`),``,...i),a.length>0&&y.push(``)),y.push(...a),(r.text===void 0||r.text.trim().length===0)&&r.toolCallNames!==void 0&&r.toolCallNames.length>0){i.length>0&&y.push(``);for(let e of r.toolCallNames)y.push(d.dim(`→ ${e}`))}}else{let e=r.kind===`user`&&r.subagent!==void 0?`task`:r.kind;_=`${foldMarker(l,m,s)}${d.bold(g(e))}`,v=``;let t=r.text===void 0||r.text.trim().length===0?[]:wrapPlainText(r.text,p);y.push(...l?t:capLines(t,p))}if(r.subagent!==void 0){let e=r.subagent.name===void 0?`subagent`:`subagent:${r.subagent.name}`;_+=d.dim(` · ${e}`)}r.error&&(_+=` ${d.red(f.error)}`),!l&&m?y.push(`…`,``,d.dim(`Click to expand`)):l&&m&&y.push(``,d.dim(`Click to collapse`));let b=h===void 0?void 0:r.error?h.errorHeader:h.header,x=h===void 0?void 0:r.error?h.errorBody:h.body,S=railCell(s,c,r.error,h);return[cardRow(``,a,s,S,b),cardSplitRow(_,v,a,s,S,b),cardRow(``,a,s,S,b),cardRow(``,a,s,S,x),...y.map(e=>cardRow(e,a,s,S,x)),cardRow(``,a,s,S,x)]}function cardRow(e,t,n,i,o){let c=clipVisible(e,Math.max(1,t-8)),l=` `.repeat(Math.max(0,t-8-visibleLength(c)));return o===void 0||!n.color?` ${i} ${c}${l} `:` ${i}${o} ${c.replaceAll(`\x1B[0m`,`\x1b[0m${o}`)}\x1b[0m${o}${l} ${SURFACE_CLOSE} `}function railCell(e,t,n,r){let{colors:i,glyph:a}=e;if(t){let t=e.unicode?`▌`:a.rule;return r===void 0?i.white(t):r.primaryText(t)}return r===void 0?n?i.red(a.rule):i.dim(a.rule):` `}function cardSplitRow(e,t,n,r,i,o){if(visibleLength(t)===0)return cardRow(e,n,r,i,o);let c=Math.max(1,n-8),l=visibleLength(t),u=clipVisible(e,Math.max(1,c-l-2));return cardRow(`${u}${` `.repeat(Math.max(2,c-visibleLength(u)-l))}${t}`,n,r,i,o)}function assistantMetrics(t,n,r){let a=[];return t.durationMs>0&&a.push(formatElapsed(t.durationMs)),t.inputTokens!==void 0&&a.push(`${n.arrowUp}${formatCompactTokenCount(t.inputTokens)}`),t.outputTokens!==void 0&&a.push(`${n.arrowDown}${formatCompactTokenCount(t.outputTokens)}`),t.costUsd!==void 0&&a.push(formatCost(t.costUsd)),a.length===0?``:r.dim(a.join(` · `))}function formatCost(e){return e>=.01?`$${e.toFixed(2)}`:`$${e.toFixed(4)}`}function stepCostUsd(e,t){let n=e;for(;n.parentSpanId!==void 0;){if(n=t.get(n.parentSpanId),n===void 0)return;if(n.name===`agent.step`)return numberAttribute(n,`gen_ai.usage.cost`)}}function foldMarker(e,t,n){return e?`${n.colors.dim(`▾`)} `:t?`${n.colors.dim(`▸`)} `:``}function capLines(e,t){return e.length<=3?[...e]:[...e.slice(0,2),clipVisible(e[2],Math.max(1,t))]}function conversationItemLineCount(e,t,n,r){return renderConversationItem(e,t,n,!1,r).length}function conversationItemExpandable(e,r){let i=Math.max(8,r-8);if(e.kind===`tool`){let n=e.args===void 0?0:formatPayloadContent(e.args,i-2).length,r=e.result===void 0?0:formatPayloadContent(e.result,i-2).length;return n>3||r>3}if(e.kind===`system`)return wrapPlainText(e.text??``,i).length>3;if(e.kind===`user`)return(e.text===void 0||e.text.trim().length===0?0:wrapPlainText(e.text,i).length)>3;let a=e.reasoning===void 0||e.reasoning.trim().length===0?0:wrapPlainText(e.reasoning,i).length,o=e.text===void 0||e.text.trim().length===0?0:wrapPlainText(e.text,i).length;return a>3||o>3}function estimateTokens(e){return Math.ceil(e.length/4)}function extractUserText(e){if(e===void 0)return;let t=e.attributes[`ai.prompt.messages`];if(typeof t!=`string`)return;let n;try{n=JSON.parse(t)}catch{return}if(Array.isArray(n))for(let e=n.length-1;e>=0;--e){let t=n[e];if(!isRecord(t)||t.role!==`user`)continue;let r=contentText(t.content).trim();if(r.length>0)return r}}function contentText(e){return typeof e==`string`?e:Array.isArray(e)?e.filter(e=>isRecord(e)&&e.type===`text`&&typeof e.text==`string`).map(e=>e.text).join(`
2
- `):``}function unwrapJsonString(e){if(e!==void 0)try{let t=JSON.parse(e);return typeof t==`string`?t:e}catch{return e}}function isModelSpan(e){return e.name.startsWith(`ai.`)&&e.name.includes(`do`)}function parseToolCallNames(e){if(e!==void 0)try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>isRecord(e)&&typeof e.toolName==`string`).map(e=>e.toolName):void 0}catch{return}}function parseProviderToolResults(e){if(e===void 0)return[];try{let t=JSON.parse(e);if(!Array.isArray(t))return[];let asText=e=>typeof e==`string`?e:e===void 0?void 0:JSON.stringify(e);return t.filter(isRecord).map(e=>{let t=`error`in e;return{args:asText(e.input),error:t,name:typeof e.toolName==`string`?e.toolName:`tool`,result:asText(t?e.error:e.output)}})}catch{return[]}}function stringAttribute(e,t){let n=e.attributes[t];return typeof n==`string`?n:void 0}function numberAttribute(e,t){let n=e.attributes[t];return typeof n==`number`?n:void 0}function spanDurationMs(e){return Math.max(0,Number(e.endTimeNs-e.startTimeNs)/1e6)}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}export{buildConversationItems,conversationItemExpandable,conversationItemLineCount,renderConversationItem};
2
+ `):``}function unwrapJsonString(e){if(e!==void 0)try{let t=JSON.parse(e);return typeof t==`string`?t:e}catch{return e}}function isModelSpan(e){return e.name.startsWith(`ai.`)&&e.name.includes(`do`)||e.attributes[`gen_ai.operation.name`]===`chat`}function parseToolCallNames(e){if(e!==void 0)try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>isRecord(e)&&typeof e.toolName==`string`).map(e=>e.toolName):void 0}catch{return}}function parseProviderToolResults(e){if(e===void 0)return[];try{let t=JSON.parse(e);if(!Array.isArray(t))return[];let asText=e=>typeof e==`string`?e:e===void 0?void 0:JSON.stringify(e);return t.filter(isRecord).map(e=>{let t=`error`in e;return{args:asText(e.input),error:t,name:typeof e.toolName==`string`?e.toolName:`tool`,result:asText(t?e.error:e.output)}})}catch{return[]}}function stringAttribute(e,t){let n=e.attributes[t];return typeof n==`string`?n:void 0}function numberAttribute(e,t){let n=e.attributes[t];return typeof n==`number`?n:void 0}function spanDurationMs(e){return Math.max(0,Number(e.endTimeNs-e.startTimeNs)/1e6)}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}export{buildConversationItems,conversationItemExpandable,conversationItemLineCount,renderConversationItem};
@@ -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,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};
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`approval.candidate`:return e;case`approval.settled`:{let t=findToolPartByApprovalId(e,c.data.requestId);return t===void 0?e:c.data.outcome===`approved`?updateToolPart(e,t.toolCallId,{approval:{approved:!0,id:c.data.requestId,reason:void 0},input:t.input,state:`approval-responded`,stepIndex:t.stepIndex,toolCallId:t.toolCallId,toolMetadata:t.toolMetadata,toolName:t.toolName,type:`dynamic-tool`}):updateToolPart(e,t.toolCallId,{approval:{approved:!1,id:c.data.requestId,reason:`Tool execution was cancelled.`},input:t.input,state:`output-denied`,stepIndex:t.stepIndex,toolCallId:t.toolCallId,toolMetadata:t.toolMetadata,toolName:t.toolName,type:`dynamic-tool`})}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};
@@ -43,5 +43,5 @@
43
43
  "zod": "4.4.3",
44
44
  "zod-validation-error": "5.0.0"
45
45
  },
46
- "scriptHash": "45c4b6fa4673e0e66a5e30ac20944506245b15860d4588b69f686f80d4e19d5f"
46
+ "scriptHash": "a77edc04c2737c2993d8e61a4f9d0db2bcb47868cfce7afa3e95b1cd6d944101"
47
47
  }
@@ -1,14 +1,21 @@
1
+ export interface TraceState {
2
+ get(key: string): string | undefined;
3
+ serialize(): string;
4
+ set(key: string, value: string): TraceState;
5
+ unset(key: string): TraceState;
6
+ }
7
+
1
8
  export interface SpanContext {
2
9
  isRemote?: boolean;
3
10
  spanId: string;
4
11
  traceFlags: number;
5
12
  traceId: string;
6
- traceState?: unknown;
13
+ traceState?: TraceState;
7
14
  }
8
15
 
9
16
  export interface Span {
10
17
  addEvent(name: string, attributes?: Attributes, timestamp?: number): this;
11
- end(): void;
18
+ end(endTime?: number): void;
12
19
  recordException(
13
20
  exception: Error | string | { message?: string; name?: string; stack?: string },
14
21
  ): void;
@@ -17,12 +24,18 @@ export interface Span {
17
24
  spanContext(): SpanContext;
18
25
  }
19
26
 
27
+ export interface Link {
28
+ context: SpanContext;
29
+ attributes?: Attributes;
30
+ }
31
+
20
32
  export interface Tracer {
21
33
  startSpan(
22
34
  name: string,
23
35
  options?: {
24
36
  attributes?: Attributes | undefined;
25
37
  kind?: SpanKind | undefined;
38
+ links?: Link[] | undefined;
26
39
  root?: boolean | undefined;
27
40
  startTime?: number | undefined;
28
41
  },
@@ -30,7 +43,11 @@ export interface Tracer {
30
43
  ): Span;
31
44
  }
32
45
 
33
- export interface Context {}
46
+ export interface Context {
47
+ setValue(key: symbol, value: unknown): Context;
48
+ }
49
+
50
+ export declare function createContextKey(description: string): symbol;
34
51
 
35
52
  export declare const ROOT_CONTEXT: Context;
36
53
 
@@ -40,6 +57,11 @@ export declare enum SpanStatusCode {
40
57
  ERROR = 2,
41
58
  }
42
59
 
60
+ export declare enum TraceFlags {
61
+ NONE = 0,
62
+ SAMPLED = 1,
63
+ }
64
+
43
65
  export declare const context: {
44
66
  active(): Context;
45
67
  with<T>(context: Context, fn: () => T): T;
@@ -55,13 +77,20 @@ export interface TextMapGetter<Carrier = unknown> {
55
77
  keys(carrier: Carrier): string[];
56
78
  }
57
79
 
80
+ export interface TextMapSetter<Carrier = unknown> {
81
+ set(carrier: Carrier, key: string, value: string): void;
82
+ }
83
+
58
84
  export declare const propagation: {
59
85
  extract<Carrier>(context: Context, carrier: Carrier, getter: TextMapGetter<Carrier>): Context;
86
+ inject<Carrier>(context: Context, carrier: Carrier, setter: TextMapSetter<Carrier>): void;
60
87
  };
61
88
 
62
89
  export declare const trace: {
63
90
  getActiveSpan(): Span | undefined;
91
+ getSpan(context: Context): Span | undefined;
64
92
  getTracer(name: string, version?: string): Tracer;
93
+ getTracerProvider(): unknown;
65
94
  setSpan(context: Context, span: Span): Context;
66
95
  wrapSpanContext(spanContext: SpanContext): Span;
67
96
  };
@@ -5,18 +5,61 @@ export interface SpanProcessor {
5
5
  shutdown(): Promise<void>;
6
6
  }
7
7
 
8
+ export type SpanProcessorOrName = SpanProcessor | "auto";
9
+
8
10
  export interface IdGenerator {
9
11
  generateSpanId(): string;
10
12
  generateTraceId(): string;
11
13
  }
12
14
 
15
+ /**
16
+ * A `SpanExporter`. Structural for the same reason the propagator is: the
17
+ * instance comes from whichever `@opentelemetry/*` build the app installed, and
18
+ * eve only ever hands it spans and waits for the callback.
19
+ *
20
+ * `code` is `ExportResultCode`: `0` succeeded, `1` failed.
21
+ */
22
+ export interface SpanExporter {
23
+ export(
24
+ spans: readonly unknown[],
25
+ resultCallback: (result: { code: number; error?: Error }) => void,
26
+ ): void;
27
+ forceFlush?(): Promise<void>;
28
+ shutdown(): Promise<void>;
29
+ }
30
+
31
+ /**
32
+ * A `TextMapPropagator`, or one of the names `@vercel/otel` resolves for you.
33
+ * Structural rather than imported: the instance comes from whichever
34
+ * `@opentelemetry/*` build the app installed, not from eve's.
35
+ */
36
+ export type PropagatorOrName =
37
+ | { inject(...args: never[]): void; extract(...args: never[]): unknown; fields(): string[] }
38
+ | "auto"
39
+ | "none"
40
+ | "tracecontext"
41
+ | "baggage";
42
+
43
+ /** A `Sampler`, or one of the names `@vercel/otel` resolves for you. */
44
+ export type SamplerOrName =
45
+ | { shouldSample(...args: never[]): unknown; toString(): string }
46
+ | "auto"
47
+ | "always_off"
48
+ | "always_on"
49
+ | "parentbased_always_off"
50
+ | "parentbased_always_on"
51
+ | "parentbased_traceidratio"
52
+ | "traceidratio";
53
+
13
54
  export interface Configuration {
55
+ readonly attributes?: Readonly<Record<string, unknown>>;
14
56
  readonly autoDetectResources?: boolean;
15
57
  readonly idGenerator?: IdGenerator;
16
58
  readonly instrumentations?: readonly unknown[];
17
- readonly propagators?: readonly ["none"];
59
+ readonly propagators?: readonly PropagatorOrName[];
18
60
  readonly serviceName?: string;
19
- readonly spanProcessors?: readonly SpanProcessor[];
61
+ readonly spanProcessors?: readonly SpanProcessorOrName[];
62
+ readonly traceSampler?: SamplerOrName;
20
63
  }
21
64
 
22
65
  export declare function registerOTel(configuration?: Configuration | string): void;
@@ -11,23 +11,23 @@ declare const EXTENSION_CAPABILITY_CONTRACTS: {
11
11
  readonly dropped: {};
12
12
  };
13
13
  readonly tool: {
14
- readonly current: 11;
15
- readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
14
+ readonly current: 12;
15
+ readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
16
16
  readonly dropped: {};
17
17
  };
18
18
  readonly dynamicTool: {
19
- readonly current: 13;
20
- readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
19
+ readonly current: 15;
20
+ readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
21
21
  readonly dropped: {};
22
22
  };
23
23
  readonly connection: {
24
- readonly current: 4;
25
- readonly supported: readonly [1, 2, 3, 4];
24
+ readonly current: 5;
25
+ readonly supported: readonly [1, 2, 3, 4, 5];
26
26
  readonly dropped: {};
27
27
  };
28
28
  readonly hook: {
29
- readonly current: 10;
30
- readonly supported: readonly [10];
29
+ readonly current: 11;
30
+ readonly supported: readonly [10, 11];
31
31
  readonly dropped: {
32
32
  readonly 1: "Model identity moved from session.started runtime metadata to step.started call attribution.";
33
33
  readonly 2: "Model identity moved from session.started runtime metadata to step.started call attribution.";
@@ -46,8 +46,8 @@ declare const EXTENSION_CAPABILITY_CONTRACTS: {
46
46
  readonly dropped: {};
47
47
  };
48
48
  readonly dynamicSkill: {
49
- readonly current: 8;
50
- readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8];
49
+ readonly current: 9;
50
+ readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9];
51
51
  readonly dropped: {};
52
52
  };
53
53
  readonly instructions: {
@@ -56,8 +56,8 @@ declare const EXTENSION_CAPABILITY_CONTRACTS: {
56
56
  readonly dropped: {};
57
57
  };
58
58
  readonly dynamicInstructions: {
59
- readonly current: 8;
60
- readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8];
59
+ readonly current: 9;
60
+ readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9];
61
61
  readonly dropped: {};
62
62
  };
63
63
  readonly config: {
@@ -1 +1 @@
1
- import{readFile,writeFile}from"node:fs/promises";import{z}from"#compiled/zod/index.js";import{join}from"node:path";import{formatValidationError}from"#runtime/validation.js";const EXTENSION_COMPATIBILITY_MANIFEST_KIND=`eve-extension`,EXTENSION_COMPATIBILITY_MANIFEST_FORMAT_VERSION=1,EXTENSION_COMPATIBILITY_MANIFEST_FILENAME=`_manifest.json`,EXTENSION_CAPABILITY_CONTRACTS={extension:{current:1,supported:[1],dropped:{}},tool:{current:11,supported:[1,2,3,4,5,6,7,8,9,10,11],dropped:{}},dynamicTool:{current:13,supported:[1,2,3,4,5,6,7,8,9,10,11,12,13],dropped:{}},connection:{current:4,supported:[1,2,3,4],dropped:{}},hook:{current:10,supported:[10],dropped:{1:`Model identity moved from session.started runtime metadata to step.started call attribution.`,2:`Model identity moved from session.started runtime metadata to step.started call attribution.`,3:`Model identity moved from session.started runtime metadata to step.started call attribution.`,4:`Model identity moved from session.started runtime metadata to step.started call attribution.`,5:`Model identity moved from session.started runtime metadata to step.started call attribution.`,6:`Model identity moved from session.started runtime metadata to step.started call attribution.`,7:`Model identity moved from session.started runtime metadata to step.started call attribution.`,8:`Model identity moved from session.started runtime metadata to step.started call attribution.`,9:`Model identity moved from session.started runtime metadata to step.started call attribution.`}},skill:{current:1,supported:[1],dropped:{}},dynamicSkill:{current:8,supported:[1,2,3,4,5,6,7,8],dropped:{}},instructions:{current:1,supported:[1],dropped:{}},dynamicInstructions:{current:8,supported:[1,2,3,4,5,6,7,8],dropped:{}},config:{current:1,supported:[1],dropped:{}},state:{current:3,supported:[1,2,3],dropped:{}}},EXTENSION_CAPABILITY_VERSIONS=Object.fromEntries(Object.entries(EXTENSION_CAPABILITY_CONTRACTS).map(([e,t])=>[e,t.current])),EXTENSION_CAPABILITY_SUPPORT=Object.keys(EXTENSION_CAPABILITY_CONTRACTS).reduce((e,t)=>(e[t]=EXTENSION_CAPABILITY_CONTRACTS[t].supported,e),{}),extensionCompatibilityManifestSchema=z.object({kind:z.literal(EXTENSION_COMPATIBILITY_MANIFEST_KIND),formatVersion:z.literal(1),builtWithEve:z.string().min(1),requires:z.record(z.string(),z.number().int().positive())}).strict();function serializeExtensionCompatibilityManifest(e){return`${JSON.stringify(e,null,2)}\n`}function parseExtensionCompatibilityManifest(e,t){let n;try{n=JSON.parse(e)}catch(e){throw Error(`Extension compatibility manifest "${t}" is not valid JSON: ${e instanceof Error?e.message:String(e)}`)}let r=extensionCompatibilityManifestSchema.safeParse(n);if(!r.success)throw Error(`Extension compatibility manifest "${t}" is invalid. ${formatValidationError(r.error)}`);return r.data}async function readExtensionCompatibilityManifest(t){return parseExtensionCompatibilityManifest(await readFile(t,`utf8`),t)}async function writeExtensionCompatibilityManifest(e,n){await writeFile(join(e,EXTENSION_COMPATIBILITY_MANIFEST_FILENAME),serializeExtensionCompatibilityManifest(n),`utf8`)}function findUnsupportedExtensionCapabilities(e,t=EXTENSION_CAPABILITY_SUPPORT){return Object.entries(e.requires).flatMap(([e,n])=>{let r=Object.hasOwn(t,e)?t[e]??[]:[];return r.includes(n)?[]:[{capability:e,requiredVersion:n,supportedVersions:r}]}).sort((e,t)=>e.capability.localeCompare(t.capability))}export{EXTENSION_CAPABILITY_SUPPORT,EXTENSION_CAPABILITY_VERSIONS,EXTENSION_COMPATIBILITY_MANIFEST_FILENAME,EXTENSION_COMPATIBILITY_MANIFEST_FORMAT_VERSION,EXTENSION_COMPATIBILITY_MANIFEST_KIND,findUnsupportedExtensionCapabilities,parseExtensionCompatibilityManifest,readExtensionCompatibilityManifest,serializeExtensionCompatibilityManifest,writeExtensionCompatibilityManifest};
1
+ import{readFile,writeFile}from"node:fs/promises";import{z}from"#compiled/zod/index.js";import{join}from"node:path";import{formatValidationError}from"#runtime/validation.js";const EXTENSION_COMPATIBILITY_MANIFEST_KIND=`eve-extension`,EXTENSION_COMPATIBILITY_MANIFEST_FORMAT_VERSION=1,EXTENSION_COMPATIBILITY_MANIFEST_FILENAME=`_manifest.json`,EXTENSION_CAPABILITY_CONTRACTS={extension:{current:1,supported:[1],dropped:{}},tool:{current:12,supported:[1,2,3,4,5,6,7,8,9,10,11,12],dropped:{}},dynamicTool:{current:15,supported:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],dropped:{}},connection:{current:5,supported:[1,2,3,4,5],dropped:{}},hook:{current:11,supported:[10,11],dropped:{1:`Model identity moved from session.started runtime metadata to step.started call attribution.`,2:`Model identity moved from session.started runtime metadata to step.started call attribution.`,3:`Model identity moved from session.started runtime metadata to step.started call attribution.`,4:`Model identity moved from session.started runtime metadata to step.started call attribution.`,5:`Model identity moved from session.started runtime metadata to step.started call attribution.`,6:`Model identity moved from session.started runtime metadata to step.started call attribution.`,7:`Model identity moved from session.started runtime metadata to step.started call attribution.`,8:`Model identity moved from session.started runtime metadata to step.started call attribution.`,9:`Model identity moved from session.started runtime metadata to step.started call attribution.`}},skill:{current:1,supported:[1],dropped:{}},dynamicSkill:{current:9,supported:[1,2,3,4,5,6,7,8,9],dropped:{}},instructions:{current:1,supported:[1],dropped:{}},dynamicInstructions:{current:9,supported:[1,2,3,4,5,6,7,8,9],dropped:{}},config:{current:1,supported:[1],dropped:{}},state:{current:3,supported:[1,2,3],dropped:{}}},EXTENSION_CAPABILITY_VERSIONS=Object.fromEntries(Object.entries(EXTENSION_CAPABILITY_CONTRACTS).map(([e,t])=>[e,t.current])),EXTENSION_CAPABILITY_SUPPORT=Object.keys(EXTENSION_CAPABILITY_CONTRACTS).reduce((e,t)=>(e[t]=EXTENSION_CAPABILITY_CONTRACTS[t].supported,e),{}),extensionCompatibilityManifestSchema=z.object({kind:z.literal(EXTENSION_COMPATIBILITY_MANIFEST_KIND),formatVersion:z.literal(1),builtWithEve:z.string().min(1),requires:z.record(z.string(),z.number().int().positive())}).strict();function serializeExtensionCompatibilityManifest(e){return`${JSON.stringify(e,null,2)}\n`}function parseExtensionCompatibilityManifest(e,t){let n;try{n=JSON.parse(e)}catch(e){throw Error(`Extension compatibility manifest "${t}" is not valid JSON: ${e instanceof Error?e.message:String(e)}`)}let r=extensionCompatibilityManifestSchema.safeParse(n);if(!r.success)throw Error(`Extension compatibility manifest "${t}" is invalid. ${formatValidationError(r.error)}`);return r.data}async function readExtensionCompatibilityManifest(t){return parseExtensionCompatibilityManifest(await readFile(t,`utf8`),t)}async function writeExtensionCompatibilityManifest(e,n){await writeFile(join(e,EXTENSION_COMPATIBILITY_MANIFEST_FILENAME),serializeExtensionCompatibilityManifest(n),`utf8`)}function findUnsupportedExtensionCapabilities(e,t=EXTENSION_CAPABILITY_SUPPORT){return Object.entries(e.requires).flatMap(([e,n])=>{let r=Object.hasOwn(t,e)?t[e]??[]:[];return r.includes(n)?[]:[{capability:e,requiredVersion:n,supportedVersions:r}]}).sort((e,t)=>e.capability.localeCompare(t.capability))}export{EXTENSION_CAPABILITY_SUPPORT,EXTENSION_CAPABILITY_VERSIONS,EXTENSION_COMPATIBILITY_MANIFEST_FILENAME,EXTENSION_COMPATIBILITY_MANIFEST_FORMAT_VERSION,EXTENSION_COMPATIBILITY_MANIFEST_KIND,findUnsupportedExtensionCapabilities,parseExtensionCompatibilityManifest,readExtensionCompatibilityManifest,serializeExtensionCompatibilityManifest,writeExtensionCompatibilityManifest};