eve 0.84.0 → 0.85.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 (248) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/dist/src/channel/channel-operations.d.ts +2 -18
  3. package/dist/src/channel/compiled-channel.d.ts +3 -7
  4. package/dist/src/channel/cross-channel-receive.d.ts +13 -11
  5. package/dist/src/channel/cross-channel-receive.js +1 -1
  6. package/dist/src/channel/delivery.js +1 -1
  7. package/dist/src/channel/schedule.js +1 -1
  8. package/dist/src/channel/session.d.ts +26 -4
  9. package/dist/src/channel/session.js +1 -1
  10. package/dist/src/channel/types.d.ts +2 -0
  11. package/dist/src/chunks/{use-eve-agent-BbbguIdB.js → use-eve-agent-B2jCfcnG.js} +29 -12
  12. package/dist/src/chunks/{use-eve-agent-DWjyzplb.js → use-eve-agent-DCLFi26P.js} +29 -12
  13. package/dist/src/cli/commands/init.js +1 -1
  14. package/dist/src/client/client.js +1 -1
  15. package/dist/src/client/delivery.d.ts +2 -0
  16. package/dist/src/client/delivery.js +1 -1
  17. package/dist/src/client/open-stream.js +1 -1
  18. package/dist/src/client/optimistic-message-submissions.js +1 -1
  19. package/dist/src/client/session-store.js +1 -1
  20. package/dist/src/client/session.js +1 -1
  21. package/dist/src/client/sessions.d.ts +1 -0
  22. package/dist/src/client/sessions.js +1 -1
  23. package/dist/src/client/types.d.ts +7 -4
  24. package/dist/src/compiled/.vendor-stamp.json +2 -2
  25. package/dist/src/compiled/@chat-adapter/slack/index.js +13 -13
  26. package/dist/src/compiled/@vercel/sandbox/api-client/api-client.d.ts +75 -0
  27. package/dist/src/compiled/@vercel/sandbox/api-client/validators.d.ts +4 -0
  28. package/dist/src/compiled/@vercel/sandbox/command.d.ts +78 -0
  29. package/dist/src/compiled/@vercel/sandbox/drive.d.ts +41 -1
  30. package/dist/src/compiled/@vercel/sandbox/index.js +13 -13
  31. package/dist/src/compiled/@vercel/sandbox/network-policy.d.ts +35 -4
  32. package/dist/src/compiled/@vercel/sandbox/sandbox.d.ts +18 -4
  33. package/dist/src/compiled/@vercel/sandbox/session.d.ts +29 -3
  34. package/dist/src/compiled/@vercel/sandbox/utils/pipe-stdin.d.ts +19 -0
  35. package/dist/src/compiled/_chunks/client/{core-CspsxXR-.js → core-BsvaaMUJ.js} +1 -1
  36. package/dist/src/compiled/_chunks/node/{auth-Dztlx9pE.js → auth-v5pS3mLo.js} +1 -1
  37. package/dist/src/compiled/_chunks/node/is-stream-DsuQX_bd.js +1 -0
  38. package/dist/src/compiled/_chunks/node/token-DHGH-jVc.js +1 -0
  39. package/dist/src/compiled/_chunks/node/token-util-BH2pw9Qm.js +25 -0
  40. package/dist/src/compiled/_chunks/node/token-util-CcvxNv76.js +1 -0
  41. package/dist/src/compiled/_chunks/node/version-C2PfNyEv.js +1 -0
  42. package/dist/src/compiled/zod/index.js +1 -1
  43. package/dist/src/compiled/zod/v4/core.js +1 -1
  44. package/dist/src/compiled/zod-validation-error/index.js +1 -1
  45. package/dist/src/compiler/artifacts.d.ts +1 -0
  46. package/dist/src/compiler/artifacts.js +1 -1
  47. package/dist/src/compiler/manifest.d.ts +2 -2
  48. package/dist/src/compiler/manifest.js +1 -1
  49. package/dist/src/compiler/model-catalog.d.ts +8 -18
  50. package/dist/src/compiler/model-catalog.js +1 -1
  51. package/dist/src/compiler/normalize-agent-config.js +1 -1
  52. package/dist/src/compiler/normalize-manifest-types.d.ts +3 -0
  53. package/dist/src/compiler/normalize-manifest.js +1 -1
  54. package/dist/src/context/keys.d.ts +7 -8
  55. package/dist/src/context/keys.js +1 -1
  56. package/dist/src/eve-channel/index.js +1 -1
  57. package/dist/src/eve-channel/request.d.ts +1 -0
  58. package/dist/src/eve-channel/request.js +1 -1
  59. package/dist/src/eve-channel/support.js +1 -1
  60. package/dist/src/execution/agent-sessions/context.d.ts +5 -1
  61. package/dist/src/execution/agent-sessions/context.js +1 -1
  62. package/dist/src/execution/agent-sessions/steps.js +1 -1
  63. package/dist/src/execution/dynamic-workflow/tool.js +1 -1
  64. package/dist/src/execution/legacy-session/snapshot.d.ts +1 -2
  65. package/dist/src/execution/legacy-session/snapshot.js +1 -1
  66. package/dist/src/execution/proxied-deliver-step.js +1 -1
  67. package/dist/src/execution/public-destination.d.ts +3 -0
  68. package/dist/src/execution/public-destination.js +1 -1
  69. package/dist/src/execution/publish-session-events.js +1 -1
  70. package/dist/src/execution/sandbox/bindings/docker-cli.d.ts +2 -0
  71. package/dist/src/execution/sandbox/bindings/docker-cli.js +1 -1
  72. package/dist/src/execution/sandbox/bindings/docker-connection.js +1 -1
  73. package/dist/src/execution/sandbox/bindings/just-bash-runtime.js +1 -1
  74. package/dist/src/execution/sandbox/bindings/vercel.js +1 -1
  75. package/dist/src/execution/sandbox/multiplexed-command.d.ts +11 -1
  76. package/dist/src/execution/sandbox/multiplexed-command.js +1 -1
  77. package/dist/src/execution/sandbox/session.js +1 -1
  78. package/dist/src/execution/session/checkpoint-migrations.d.ts +16 -5
  79. package/dist/src/execution/session/checkpoint-migrations.js +1 -1
  80. package/dist/src/execution/session/checkpoint-refusal.d.ts +4 -0
  81. package/dist/src/execution/session/checkpoint-refusal.js +1 -0
  82. package/dist/src/execution/session/entry.js +1 -1
  83. package/dist/src/execution/session/handoff-steps.d.ts +7 -1
  84. package/dist/src/execution/session/handoff-steps.js +1 -1
  85. package/dist/src/execution/session/imported-conversation.d.ts +2 -0
  86. package/dist/src/execution/session/imported-conversation.js +1 -0
  87. package/dist/src/execution/session/interrupted-step.js +1 -1
  88. package/dist/src/execution/session/pre-v27-checkpoint.d.ts +36 -0
  89. package/dist/src/execution/session/pre-v27-checkpoint.js +1 -0
  90. package/dist/src/execution/session/program.d.ts +2 -0
  91. package/dist/src/execution/session/program.js +1 -1
  92. package/dist/src/execution/session/turn-step.js +1 -1
  93. package/dist/src/execution/session-callback-request.js +1 -1
  94. package/dist/src/execution/session-inbox/address.d.ts +1 -0
  95. package/dist/src/execution/session-inbox/handle.d.ts +7 -0
  96. package/dist/src/execution/session-inbox/handle.js +1 -0
  97. package/dist/src/execution/session-inbox/owner.d.ts +4 -4
  98. package/dist/src/execution/session-inbox/owner.js +1 -1
  99. package/dist/src/execution/session-inbox/resume.d.ts +1 -0
  100. package/dist/src/execution/session-inbox/resume.js +1 -1
  101. package/dist/src/execution/tool-auth.js +1 -1
  102. package/dist/src/execution/tools/agent-router-workflow.js +1 -1
  103. package/dist/src/execution/tools/channel-to.d.ts +12 -0
  104. package/dist/src/execution/tools/channel-to.js +1 -0
  105. package/dist/src/execution/tools/workflow/body.d.ts +3 -0
  106. package/dist/src/execution/tools/workflow/body.js +1 -1
  107. package/dist/src/execution/tools/workflow/step-context.d.ts +5 -0
  108. package/dist/src/execution/tools/workflow/step-execution.js +1 -1
  109. package/dist/src/execution/tools/workflow/step.js +1 -1
  110. package/dist/src/execution/workflow-callback-url.d.ts +2 -3
  111. package/dist/src/execution/workflow-callback-url.js +1 -1
  112. package/dist/src/execution/workflow-runtime.js +1 -1
  113. package/dist/src/harness/compaction/step.js +1 -1
  114. package/dist/src/harness/model-call/call.d.ts +3 -1
  115. package/dist/src/harness/model-call/call.js +1 -1
  116. package/dist/src/harness/model-call/run.js +1 -1
  117. package/dist/src/harness/semantic-errors/rules/gateway.js +1 -1
  118. package/dist/src/harness/session-machine/transitions.js +1 -1
  119. package/dist/src/internal/application/compiled-artifacts.d.ts +2 -0
  120. package/dist/src/internal/application/compiled-artifacts.js +2 -2
  121. package/dist/src/internal/application/optional-package-install.js +1 -1
  122. package/dist/src/internal/application/stamped-package-version.js +1 -1
  123. package/dist/src/internal/attachments/limited-read.d.ts +2 -0
  124. package/dist/src/internal/attachments/limited-read.js +1 -1
  125. package/dist/src/internal/attachments/url-refs.js +1 -1
  126. package/dist/src/internal/capability-error.d.ts +3 -0
  127. package/dist/src/internal/capability-error.js +1 -0
  128. package/dist/src/internal/model-catalog.d.ts +39 -16
  129. package/dist/src/internal/model-catalog.js +1 -1
  130. package/dist/src/internal/nitro/host/dev-build-host.js +1 -1
  131. package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
  132. package/dist/src/protocol/delivery.d.ts +1 -0
  133. package/dist/src/public/channels/chat-sdk/chatSdkChannel.js +1 -1
  134. package/dist/src/public/channels/discord/discordChannel.js +1 -1
  135. package/dist/src/public/channels/github/githubChannel.js +1 -1
  136. package/dist/src/public/channels/linear/linearChannel.js +1 -1
  137. package/dist/src/public/channels/linq/inboundContent.js +1 -1
  138. package/dist/src/public/channels/slack/answers.d.ts +2 -3
  139. package/dist/src/public/channels/slack/answers.js +1 -1
  140. package/dist/src/public/channels/slack/api.d.ts +23 -3
  141. package/dist/src/public/channels/slack/api.js +1 -1
  142. package/dist/src/public/channels/slack/app-manifest.d.ts +2 -0
  143. package/dist/src/public/channels/slack/app-manifest.js +1 -1
  144. package/dist/src/public/channels/slack/auth.d.ts +2 -1
  145. package/dist/src/public/channels/slack/auth.js +1 -1
  146. package/dist/src/public/channels/slack/code-channel.d.ts +42 -0
  147. package/dist/src/public/channels/slack/code-channel.js +1 -0
  148. package/dist/src/public/channels/slack/defaults.d.ts +7 -3
  149. package/dist/src/public/channels/slack/defaults.js +3 -3
  150. package/dist/src/public/channels/slack/hitl.d.ts +7 -17
  151. package/dist/src/public/channels/slack/hitl.js +1 -1
  152. package/dist/src/public/channels/slack/index.d.ts +4 -3
  153. package/dist/src/public/channels/slack/index.js +1 -1
  154. package/dist/src/public/channels/slack/interaction-cards.d.ts +0 -2
  155. package/dist/src/public/channels/slack/interaction-cards.js +1 -1
  156. package/dist/src/public/channels/slack/interactions.js +1 -1
  157. package/dist/src/public/channels/slack/open-code-channel.d.ts +30 -0
  158. package/dist/src/public/channels/slack/open-code-channel.js +1 -0
  159. package/dist/src/public/channels/slack/private-approval-delivery.d.ts +16 -4
  160. package/dist/src/public/channels/slack/private-approval-delivery.js +1 -1
  161. package/dist/src/public/channels/slack/renderers.d.ts +58 -6
  162. package/dist/src/public/channels/slack/renderers.js +1 -1
  163. package/dist/src/public/channels/slack/reply-delivery.d.ts +4 -0
  164. package/dist/src/public/channels/slack/reply-delivery.js +1 -1
  165. package/dist/src/public/channels/slack/request-card-render.d.ts +45 -0
  166. package/dist/src/public/channels/slack/request-card-render.js +1 -0
  167. package/dist/src/public/channels/slack/request-cards.d.ts +35 -0
  168. package/dist/src/public/channels/slack/request-cards.js +3 -0
  169. package/dist/src/public/channels/slack/sign-in-cancel.d.ts +3 -5
  170. package/dist/src/public/channels/slack/sign-in-cancel.js +1 -1
  171. package/dist/src/public/channels/slack/slackChannel.d.ts +109 -22
  172. package/dist/src/public/channels/slack/slackChannel.js +1 -1
  173. package/dist/src/public/channels/slack/task-card.d.ts +3 -3
  174. package/dist/src/public/channels/slack/task-card.js +1 -1
  175. package/dist/src/public/channels/slack/thread-status.js +1 -1
  176. package/dist/src/public/channels/teams/api.js +1 -1
  177. package/dist/src/public/channels/teams/defaults.js +1 -1
  178. package/dist/src/public/channels/teams/teamsChannel.js +1 -1
  179. package/dist/src/public/channels/teams/verify.d.ts +9 -5
  180. package/dist/src/public/channels/teams/verify.js +1 -1
  181. package/dist/src/public/channels/telegram/telegramChannel.js +1 -1
  182. package/dist/src/public/channels/twilio/twilioChannel.js +1 -1
  183. package/dist/src/public/nuxt/module.js +1 -1
  184. package/dist/src/public/schedules/subscription.d.ts +10 -1
  185. package/dist/src/reactions/kinds/model.js +1 -1
  186. package/dist/src/reactions/kinds/subagent.js +1 -1
  187. package/dist/src/runtime/agent/resolve-model.d.ts +3 -4
  188. package/dist/src/runtime/agent/resolve-model.js +1 -1
  189. package/dist/src/runtime/loaders/artifact-paths.d.ts +1 -0
  190. package/dist/src/runtime/loaders/artifact-paths.js +1 -1
  191. package/dist/src/runtime/loaders/bundled-artifacts.d.ts +2 -0
  192. package/dist/src/runtime/loaders/bundled-artifacts.js +1 -1
  193. package/dist/src/runtime/loaders/model-metadata.d.ts +4 -0
  194. package/dist/src/runtime/loaders/model-metadata.js +1 -0
  195. package/dist/src/runtime/resolve-agent.js +1 -1
  196. package/dist/src/runtime/sessions/compiled-agent-cache.d.ts +3 -0
  197. package/dist/src/runtime/sessions/compiled-agent-cache.js +1 -1
  198. package/dist/src/runtime/subagents/dynamic-agent-config.d.ts +2 -2
  199. package/dist/src/runtime/subagents/dynamic-agent-config.js +1 -1
  200. package/dist/src/runtime/subagents/workflow.js +1 -1
  201. package/dist/src/sandbox/provider.d.ts +2 -0
  202. package/dist/src/setup/flows/model-source-change.js +1 -1
  203. package/dist/src/setup/index.d.ts +1 -1
  204. package/dist/src/setup/primitives/index.d.ts +1 -1
  205. package/dist/src/setup/primitives/pm/run.d.ts +0 -2
  206. package/dist/src/setup/scaffold/create/project.js +1 -1
  207. package/dist/src/shared/agent-definition.d.ts +0 -1
  208. package/dist/src/shared/channel-definition.d.ts +4 -4
  209. package/dist/src/shared/sandbox-session.d.ts +4 -0
  210. package/dist/src/subagents/adapter.js +1 -1
  211. package/dist/src/subagents/parent-notification.js +1 -1
  212. package/dist/src/svelte/index.js +1 -1
  213. package/dist/src/svelte/use-eve-agent.js +1 -1
  214. package/dist/src/tools/definition.d.ts +21 -0
  215. package/dist/src/tools/provided/ask-question-workflow.js +1 -1
  216. package/dist/src/tools/provided/sleep-workflow.js +1 -1
  217. package/dist/src/tools/workflow-definition.d.ts +4 -4
  218. package/dist/src/vue/index.js +1 -1
  219. package/dist/src/vue/use-eve-agent.js +1 -1
  220. package/docs/agent-config.md +5 -4
  221. package/docs/channels/custom.mdx +16 -3
  222. package/docs/channels/eve.mdx +2 -0
  223. package/docs/channels/linq.mdx +1 -1
  224. package/docs/channels/slack.mdx +185 -18
  225. package/docs/channels/teams.mdx +6 -2
  226. package/docs/concepts/default-harness.md +6 -0
  227. package/docs/concepts/upgrade-to-v27-events.md +2 -2
  228. package/docs/evals/judge.mdx +13 -0
  229. package/docs/experimental/dynamic-schedules.mdx +2 -2
  230. package/docs/guides/client/overview.mdx +24 -2
  231. package/docs/guides/remote-agents.md +8 -0
  232. package/docs/patterns/fork-conversations-into-new-threads.md +159 -0
  233. package/docs/patterns/meta.json +1 -0
  234. package/docs/reference/cli.md +1 -1
  235. package/docs/sandbox/custom-providers.mdx +1 -1
  236. package/docs/sandbox/index.mdx +1 -1
  237. package/docs/schedules.mdx +1 -1
  238. package/docs/tools/overview.mdx +34 -0
  239. package/docs/tools/workflows.mdx +51 -5
  240. package/package.json +2 -2
  241. package/dist/src/compiled/_chunks/node/token-Bedbhv5z.js +0 -1
  242. package/dist/src/compiled/_chunks/node/token-util-DpJNusVS.js +0 -1
  243. package/dist/src/compiled/_chunks/node/token-util-DwHQ2a3c.js +0 -1
  244. package/dist/src/compiled/_chunks/node/version-C__MqbLM.js +0 -1
  245. package/dist/src/public/channels/slack/approval-cards.d.ts +0 -25
  246. package/dist/src/public/channels/slack/approval-cards.js +0 -2
  247. package/dist/src/runtime/agent/model-catalog.d.ts +0 -10
  248. package/dist/src/runtime/agent/model-catalog.js +0 -1
@@ -1 +1 @@
1
- import{createLogger}from"#internal/logging.js";import{readNonEmptyString}from"#shared/guards.js";import{GET,POST,defineChannel}from"#public/definitions/channel.js";import"#public/channels/twilio/verify.js";import{callTwilioApi,createTwilioFetchFile,sendTwilioMessage,twilioContinuationToken,updateTwilioCall}from"#public/channels/twilio/api.js";import{defaultEvents,defaultOnText,defaultOnVoice,defaultOnVoiceTranscription}from"#public/channels/twilio/defaults.js";import{formatTwilioContextBlock,parseTwilioTextMessage,parseTwilioVoiceCall,parseTwilioVoiceTranscription,twilioMessageContent}from"#public/channels/twilio/inbound.js";import{emptyTwilioResponse,gatherSpeechTwilioResponse,sayTwilioResponse}from"#public/channels/twilio/twiml.js";import{buildTwilioActionUrl,buildTwilioRoutes,verifyTwilioInbound}from"#public/channels/twilio/routing.js";const log=createLogger(`twilio.channel`);function twilioChannel(e){assertAllowFromConfigured(e);let t=buildTwilioRoutes(e.route??`/eve/v1/twilio`),n=e.onText??defaultOnText,r=e.onVoice??defaultOnVoice,i=e.onVoiceTranscription??defaultOnVoiceTranscription,a={...defaultEvents,...e.events},o=handleTwilioMessages({config:e,onText:n}),s=handleTwilioVoice({config:e,onVoice:r,routes:t}),c=handleTwilioTranscription({config:e,onVoiceTranscription:i,routes:t});return defineChannel({turnPolicy:e.turnPolicy,state:{from:null,to:null,lastCallSid:null,lastMessageSid:null},metadata(e){return{from:e.from,lastCallSid:e.lastCallSid??null,lastMessageSid:e.lastMessageSid??null,to:e.to}},audience:()=>`private`,fetchFile:createTwilioFetchFile({...e.api,credentials:e.credentials}),context(t,n){return rebuildTwilioContext(t,n,e)},routes:[GET(t.messages,o),POST(t.messages,o),GET(t.voice,s),POST(t.voice,s),GET(t.transcription,c),POST(t.transcription,c)],async receive(t,{from:n}){let r=readNonEmptyString(t.target.phoneNumber);if(!r)throw Error(`twilioChannel().receive requires target.phoneNumber.`);let i=readNonEmptyString(t.target.from)??e.messaging?.from??null;return n(twilioContinuationToken({from:r,to:i??void 0})).send(t.message,{auth:t.auth,state:{from:r,lastCallSid:null,lastMessageSid:null,to:i}})},events:a})}function handleTwilioMessages(e){return async(t,{from:n,waitUntil:r})=>{let i=await verifyTwilioInbound(t,e.config);if(i===null)return new Response(`unauthorized`,{status:401});let a=parseTwilioTextMessage(i.params);return a?await isAllowed(a.from,e.config.allowFrom)?(r(dispatchText({config:e.config,message:a,onText:e.onText,from:n})),emptyTwilioResponse()):new Response(`forbidden`,{status:403}):emptyTwilioResponse()}}function handleTwilioVoice(e){return async t=>{let n=await verifyTwilioInbound(t,e.config);if(n===null)return new Response(`unauthorized`,{status:401});let r=parseTwilioVoiceCall(n.params);if(!r)return sayTwilioResponse(`Missing caller information.`);if(!await isAllowed(r.from,e.config.allowFrom))return new Response(`forbidden`,{status:403});let i=await acceptVoiceCall({call:r,config:e.config,onVoice:e.onVoice});if(i===null)return new Response(`forbidden`,{status:403});let a=i??{};return gatherSpeechTwilioResponse({actionUrl:await buildTwilioActionUrl(t,e.config,e.routes.transcription),hints:a.hints??e.config.voice?.hints,language:a.language??e.config.voice?.language,profanityFilter:a.profanityFilter??e.config.voice?.profanityFilter,prompt:a.prompt??e.config.voice?.prompt??`Please say your message after the tone.`,speechModel:a.speechModel??e.config.voice?.speechModel,speechTimeout:a.speechTimeout??e.config.voice?.speechTimeout??`auto`,timeoutSeconds:a.timeoutSeconds??e.config.voice?.timeoutSeconds,voice:a.voice??e.config.voice?.voice})}}function handleTwilioTranscription(e){return async(t,{from:n,waitUntil:r})=>{let i=await verifyTwilioInbound(t,e.config);if(i===null)return new Response(`unauthorized`,{status:401});let a=parseTwilioVoiceTranscription(i.params);return a?await isAllowed(a.from,e.config.allowFrom)?(r(dispatchVoiceTranscription({config:e.config,onVoiceTranscription:e.onVoiceTranscription,from:n,transcription:a})),sayTwilioResponse(e.config.voice?.acknowledgement??`Thanks. I'll follow up by text.`)):new Response(`forbidden`,{status:403}):gatherSpeechTwilioResponse({actionUrl:await buildTwilioActionUrl(t,e.config,e.routes.transcription),language:e.config.voice?.language,prompt:e.config.voice?.prompt??`Please say your message after the tone.`,speechTimeout:e.config.voice?.speechTimeout??`auto`,timeoutSeconds:e.config.voice?.timeoutSeconds})}}function rebuildTwilioContext(e,t,n){return{state:e,twilio:buildTwilioHandle({callSid:e.lastCallSid??void 0,config:n,from:e.from??``,to:e.to??void 0})}}function buildTwilioHandle(e){let t=e.config.api,n=e.config.credentials,r=e.config.messaging?.from??e.to,i=e.config.messaging?.messagingServiceSid,a=e.config.messaging?.statusCallbackUrl;return{callSid:e.callSid,from:e.from,to:e.to,request(e,r){return callTwilioApi({apiBaseUrl:t?.apiBaseUrl,body:r,credentials:n,fetch:t?.fetch,path:e})},sendMessage(o,s){return sendTwilioMessage({apiBaseUrl:t?.apiBaseUrl,body:o,credentials:n,fetch:t?.fetch,from:s?.from??r,messagingServiceSid:s?.messagingServiceSid??i,statusCallbackUrl:s?.statusCallbackUrl??a,to:s?.to??e.from})},updateCall(e,r){return updateTwilioCall({apiBaseUrl:t?.apiBaseUrl,callSid:e,credentials:n,fetch:t?.fetch,twiml:r})}}}function assertAllowFromConfigured(e){if(e?.allowFrom===void 0)throw Error(`twilioChannel requires allowFrom. Use allowFrom: "*" to allow all numbers.`)}async function dispatchText(e){let{message:t}=e,n={twilio:buildTwilioHandle({callSid:void 0,config:e.config,from:t.from,to:t.to})},r;try{r=await e.onText(n,t)}catch(e){log.error(`text handler failed`,{error:e});return}if(r==null)return;let i=formatTwilioContextBlock({channel:`text`,from:t.from,messageSid:t.messageSid,to:t.to});try{await e.from(twilioContinuationToken({from:t.from,to:t.to})).send(twilioMessageContent(t),{auth:r.auth,context:[i],state:{from:t.from,lastCallSid:null,lastMessageSid:t.messageSid??null,to:t.to??null},title:r.title})}catch(e){log.error(`text delivery failed`,{error:e})}}async function acceptVoiceCall(e){let{call:t}=e,n={twilio:buildTwilioHandle({callSid:t.callSid,config:e.config,from:t.from,to:t.to})};try{return await e.onVoice(n,t)}catch(e){return log.error(`voice handler failed`,{error:e}),null}}async function dispatchVoiceTranscription(e){let{transcription:t}=e,n={twilio:buildTwilioHandle({callSid:t.callSid,config:e.config,from:t.from,to:t.to})},r;try{r=await e.onVoiceTranscription(n,t)}catch(e){log.error(`voice transcription handler failed`,{error:e});return}if(r==null)return;let i=formatTwilioContextBlock({callSid:t.callSid,channel:`voice`,from:t.from,to:t.to});try{await e.from(twilioContinuationToken({from:t.from,to:t.to})).send(t.text,{auth:r.auth,context:[i],state:{from:t.from,lastCallSid:t.callSid??null,lastMessageSid:null,to:t.to??null},title:r.title})}catch(e){log.error(`voice transcription delivery failed`,{error:e})}}async function isAllowed(e,t){let n=typeof t==`function`?await t():t;return n===`*`?!0:typeof n==`string`?n===e:n.includes(e)}export{twilioChannel};
1
+ import{createLogger}from"#internal/logging.js";import{readNonEmptyString}from"#shared/guards.js";import{GET,POST,defineChannel}from"#public/definitions/channel.js";import"#public/channels/twilio/verify.js";import{callTwilioApi,createTwilioFetchFile,sendTwilioMessage,twilioContinuationToken,updateTwilioCall}from"#public/channels/twilio/api.js";import{defaultEvents,defaultOnText,defaultOnVoice,defaultOnVoiceTranscription}from"#public/channels/twilio/defaults.js";import{formatTwilioContextBlock,parseTwilioTextMessage,parseTwilioVoiceCall,parseTwilioVoiceTranscription,twilioMessageContent}from"#public/channels/twilio/inbound.js";import{emptyTwilioResponse,gatherSpeechTwilioResponse,sayTwilioResponse}from"#public/channels/twilio/twiml.js";import{buildTwilioActionUrl,buildTwilioRoutes,verifyTwilioInbound}from"#public/channels/twilio/routing.js";const log=createLogger(`twilio.channel`);function twilioChannel(e){assertAllowFromConfigured(e);let t=buildTwilioRoutes(e.route??`/eve/v1/twilio`),n=e.onText??defaultOnText,r=e.onVoice??defaultOnVoice,i=e.onVoiceTranscription??defaultOnVoiceTranscription,a={...defaultEvents,...e.events},o=handleTwilioMessages({config:e,onText:n}),s=handleTwilioVoice({config:e,onVoice:r,routes:t}),c=handleTwilioTranscription({config:e,onVoiceTranscription:i,routes:t});return defineChannel({turnPolicy:e.turnPolicy,state:{from:null,to:null,lastCallSid:null,lastMessageSid:null},metadata(e){return{from:e.from,lastCallSid:e.lastCallSid??null,lastMessageSid:e.lastMessageSid??null,to:e.to}},audience:()=>`private`,fetchFile:createTwilioFetchFile({...e.api,credentials:e.credentials}),context(t,n){return rebuildTwilioContext(t,n,e)},routes:[GET(t.messages,o),POST(t.messages,o),GET(t.voice,s),POST(t.voice,s),GET(t.transcription,c),POST(t.transcription,c)],async receive({message:t,target:n,...r},{from:i}){let a=readNonEmptyString(n.phoneNumber);if(!a)throw Error(`twilioChannel().receive requires target.phoneNumber.`);let o=readNonEmptyString(n.from)??e.messaging?.from??null;return i(twilioContinuationToken({from:a,to:o??void 0})).send(t,{...r,state:{from:a,lastCallSid:null,lastMessageSid:null,to:o}})},events:a})}function handleTwilioMessages(e){return async(t,{from:n,waitUntil:r})=>{let i=await verifyTwilioInbound(t,e.config);if(i===null)return new Response(`unauthorized`,{status:401});let a=parseTwilioTextMessage(i.params);return a?await isAllowed(a.from,e.config.allowFrom)?(r(dispatchText({config:e.config,message:a,onText:e.onText,from:n})),emptyTwilioResponse()):new Response(`forbidden`,{status:403}):emptyTwilioResponse()}}function handleTwilioVoice(e){return async t=>{let n=await verifyTwilioInbound(t,e.config);if(n===null)return new Response(`unauthorized`,{status:401});let r=parseTwilioVoiceCall(n.params);if(!r)return sayTwilioResponse(`Missing caller information.`);if(!await isAllowed(r.from,e.config.allowFrom))return new Response(`forbidden`,{status:403});let i=await acceptVoiceCall({call:r,config:e.config,onVoice:e.onVoice});if(i===null)return new Response(`forbidden`,{status:403});let a=i??{};return gatherSpeechTwilioResponse({actionUrl:await buildTwilioActionUrl(t,e.config,e.routes.transcription),hints:a.hints??e.config.voice?.hints,language:a.language??e.config.voice?.language,profanityFilter:a.profanityFilter??e.config.voice?.profanityFilter,prompt:a.prompt??e.config.voice?.prompt??`Please say your message after the tone.`,speechModel:a.speechModel??e.config.voice?.speechModel,speechTimeout:a.speechTimeout??e.config.voice?.speechTimeout??`auto`,timeoutSeconds:a.timeoutSeconds??e.config.voice?.timeoutSeconds,voice:a.voice??e.config.voice?.voice})}}function handleTwilioTranscription(e){return async(t,{from:n,waitUntil:r})=>{let i=await verifyTwilioInbound(t,e.config);if(i===null)return new Response(`unauthorized`,{status:401});let a=parseTwilioVoiceTranscription(i.params);return a?await isAllowed(a.from,e.config.allowFrom)?(r(dispatchVoiceTranscription({config:e.config,onVoiceTranscription:e.onVoiceTranscription,from:n,transcription:a})),sayTwilioResponse(e.config.voice?.acknowledgement??`Thanks. I'll follow up by text.`)):new Response(`forbidden`,{status:403}):gatherSpeechTwilioResponse({actionUrl:await buildTwilioActionUrl(t,e.config,e.routes.transcription),language:e.config.voice?.language,prompt:e.config.voice?.prompt??`Please say your message after the tone.`,speechTimeout:e.config.voice?.speechTimeout??`auto`,timeoutSeconds:e.config.voice?.timeoutSeconds})}}function rebuildTwilioContext(e,t,n){return{state:e,twilio:buildTwilioHandle({callSid:e.lastCallSid??void 0,config:n,from:e.from??``,to:e.to??void 0})}}function buildTwilioHandle(e){let t=e.config.api,n=e.config.credentials,r=e.config.messaging?.from??e.to,i=e.config.messaging?.messagingServiceSid,a=e.config.messaging?.statusCallbackUrl;return{callSid:e.callSid,from:e.from,to:e.to,request(e,r){return callTwilioApi({apiBaseUrl:t?.apiBaseUrl,body:r,credentials:n,fetch:t?.fetch,path:e})},sendMessage(o,s){return sendTwilioMessage({apiBaseUrl:t?.apiBaseUrl,body:o,credentials:n,fetch:t?.fetch,from:s?.from??r,messagingServiceSid:s?.messagingServiceSid??i,statusCallbackUrl:s?.statusCallbackUrl??a,to:s?.to??e.from})},updateCall(e,r){return updateTwilioCall({apiBaseUrl:t?.apiBaseUrl,callSid:e,credentials:n,fetch:t?.fetch,twiml:r})}}}function assertAllowFromConfigured(e){if(e?.allowFrom===void 0)throw Error(`twilioChannel requires allowFrom. Use allowFrom: "*" to allow all numbers.`)}async function dispatchText(e){let{message:t}=e,n={twilio:buildTwilioHandle({callSid:void 0,config:e.config,from:t.from,to:t.to})},r;try{r=await e.onText(n,t)}catch(e){log.error(`text handler failed`,{error:e});return}if(r==null)return;let i=formatTwilioContextBlock({channel:`text`,from:t.from,messageSid:t.messageSid,to:t.to});try{await e.from(twilioContinuationToken({from:t.from,to:t.to})).send(twilioMessageContent(t),{auth:r.auth,context:[i],state:{from:t.from,lastCallSid:null,lastMessageSid:t.messageSid??null,to:t.to??null},title:r.title})}catch(e){log.error(`text delivery failed`,{error:e})}}async function acceptVoiceCall(e){let{call:t}=e,n={twilio:buildTwilioHandle({callSid:t.callSid,config:e.config,from:t.from,to:t.to})};try{return await e.onVoice(n,t)}catch(e){return log.error(`voice handler failed`,{error:e}),null}}async function dispatchVoiceTranscription(e){let{transcription:t}=e,n={twilio:buildTwilioHandle({callSid:t.callSid,config:e.config,from:t.from,to:t.to})},r;try{r=await e.onVoiceTranscription(n,t)}catch(e){log.error(`voice transcription handler failed`,{error:e});return}if(r==null)return;let i=formatTwilioContextBlock({callSid:t.callSid,channel:`voice`,from:t.from,to:t.to});try{await e.from(twilioContinuationToken({from:t.from,to:t.to})).send(t.text,{auth:r.auth,context:[i],state:{from:t.from,lastCallSid:t.callSid??null,lastMessageSid:null,to:t.to??null},title:r.title})}catch(e){log.error(`voice transcription delivery failed`,{error:e})}}async function isAllowed(e,t){let n=typeof t==`function`?await t():t;return n===`*`?!0:typeof n==`string`?n===e:n.includes(e)}export{twilioChannel};
@@ -1 +1 @@
1
- import{joinRoutePrefix,normalizeOrigin,resolveProductionTarget}from"./routing.js";import{EVE_ROUTE_PREFIX}from"#protocol/routes.js";import{isAbsolute,resolve}from"node:path";import{resolveDevServerTimeout,resolveSharedEveDevServer}from"#shared/framework-eve-server.js";import{addImports,defineNuxtModule,extendRouteRules}from"@nuxt/kit";import{ensureEveVercelServicesConfig,mergeEveVercelConfig}from"#shared/vercel-services.js";const EVE_NUXT_HOST={label:`Nuxt`,slug:`nuxt`};function resolveApplicationRoot(e,t){return t===void 0||t.length===0?e:isAbsolute(t)?t:resolve(e,t)}async function resolveEveProxyTarget(e){if(!e.dev)return resolveProductionTarget();let t=process.env.EVE_BASE_URL?.trim();if(t&&t.length>0)return joinRoutePrefix(normalizeOrigin(t),EVE_ROUTE_PREFIX);let n=await resolveSharedEveDevServer({appRoot:e.appRoot,host:EVE_NUXT_HOST,timeoutMs:e.devServerTimeoutMs});return n.process!==void 0&&e.onDevServerSpawned?.(n.process),joinRoutePrefix(n.origin,EVE_ROUTE_PREFIX)}const eveNuxtModule=defineNuxtModule({meta:{name:`eve`,configKey:`eve`,compatibility:{nuxt:`>=4.0.0`}},defaults:{},async setup(e,t){let n=t.options.rootDir,r=resolveApplicationRoot(n,e.eveRoot),i=resolveDevServerTimeout(e.devServerTimeoutMs,EVE_NUXT_HOST);if(addImports({name:`useEveAgent`,from:`eve/vue`}),!t.options.dev&&process.env.VERCEL){let i=await ensureEveVercelServicesConfig({appRoot:r,eveBuildCommand:e.eveBuildCommand,frameworkName:`Nuxt`,hostRoot:n});if(i.mode===`generated`){let e=t.options.nitro;e.vercel={...e.vercel,config:mergeEveVercelConfig(e.vercel?.config,i)}}}else t.hook(`modules:done`,async()=>{let e=await resolveEveProxyTarget({appRoot:r,dev:t.options.dev,devServerTimeoutMs:i,onDevServerSpawned:e=>{t.hook(`close`,()=>{e.killed||e.kill()})}});extendRouteRules(`${EVE_ROUTE_PREFIX}/**`,{proxy:`${e}/**`})})}});export{eveNuxtModule as default};
1
+ import{joinRoutePrefix,normalizeOrigin,resolveProductionTarget}from"./routing.js";import{EVE_ROUTE_PREFIX}from"#protocol/routes.js";import{isAbsolute,resolve}from"node:path";import{resolveDevServerTimeout,resolveSharedEveDevServer}from"#shared/framework-eve-server.js";import{addImports,defineNuxtModule,extendRouteRules}from"@nuxt/kit";import{ensureEveVercelServicesConfig,mergeEveVercelConfig}from"#shared/vercel-services.js";const EVE_NUXT_HOST={label:`Nuxt`,slug:`nuxt`};function resolveApplicationRoot(e,t){return t===void 0||t.length===0?e:isAbsolute(t)?t:resolve(e,t)}async function resolveEveProxyTarget(e){if(!e.dev)return resolveProductionTarget();let t=process.env.EVE_BASE_URL?.trim();if(t&&t.length>0)return joinRoutePrefix(normalizeOrigin(t),EVE_ROUTE_PREFIX);let n=await resolveSharedEveDevServer({appRoot:e.appRoot,host:EVE_NUXT_HOST,timeoutMs:e.devServerTimeoutMs});return n.process!==void 0&&e.onDevServerSpawned?.(n.process),joinRoutePrefix(n.origin,EVE_ROUTE_PREFIX)}const eveNuxtModule=defineNuxtModule({meta:{name:`eve`,configKey:`eve`,compatibility:{nuxt:`>=4.0.0`}},defaults:{},async setup(e,t){let n=t.options.rootDir,r=resolveApplicationRoot(n,e.eveRoot),i=resolveDevServerTimeout(e.devServerTimeoutMs,EVE_NUXT_HOST);if(addImports({name:`useEveAgent`,from:`eve/vue`}),t.options.vite.optimizeDeps={...t.options.vite.optimizeDeps,include:[...t.options.vite.optimizeDeps?.include??[],`eve/vue`]},!t.options.dev&&process.env.VERCEL){let i=await ensureEveVercelServicesConfig({appRoot:r,eveBuildCommand:e.eveBuildCommand,frameworkName:`Nuxt`,hostRoot:n});if(i.mode===`generated`){let e=t.options.nitro;e.vercel={...e.vercel,config:mergeEveVercelConfig(e.vercel?.config,i)}}}else t.hook(`modules:done`,async()=>{let e=await resolveEveProxyTarget({appRoot:r,dev:t.options.dev,devServerTimeoutMs:i,onDevServerSpawned:e=>{t.hook(`close`,()=>{e.killed||e.kill()})}});extendRouteRules(`${EVE_ROUTE_PREFIX}/**`,{proxy:`${e}/**`})})}});export{eveNuxtModule as default};
@@ -1,3 +1,4 @@
1
+ import type { SessionSendOptions } from "#channel/session.js";
1
2
  import type { InstrumentationChannel } from "#shared/instrumentation-channel.js";
2
3
  import type { StandardSchemaV1 } from "#compiled/@standard-schema/spec/index.js";
3
4
  import type { SessionSchedule } from "#context/session-schedule.js";
@@ -163,7 +164,15 @@ export interface ScheduleClient<TPayload> {
163
164
  }
164
165
  /** Starts fresh unattended work bound to the resolved creator; callers cannot choose another identity. */
165
166
  export type DynamicSchedulesToFn = <TChannel extends ChannelReference<unknown>>(channel: TChannel, target: InferReceiveTarget<TChannel>) => {
166
- send(message: MessageContent): Promise<Delivery>;
167
+ /**
168
+ * Accepts the `to().send()` options that apply to a fresh session. `auth` is
169
+ * the schedule's creator. A send never reaches a session the schedule didn't
170
+ * start, so `turnPolicy` has nothing to act on. A send with an
171
+ * `idempotencyKey` reaches the session an earlier send from this schedule
172
+ * with the same key and target started, so a retried callback whose key
173
+ * includes `occurrence.executionId` doesn't start a second session.
174
+ */
175
+ send(message: MessageContent, options?: Omit<SessionSendOptions, "auth" | "turnPolicy">): Promise<Delivery>;
167
176
  };
168
177
  type SchedulePayloadApproval<TPrepared> = ((context: ApprovalContext & {
169
178
  readonly payload: TPrepared;
@@ -1 +1 @@
1
- import{authoredEvaluate}from"../reaction.js";import{readLive,readReactionsState,slotValueOf}from"../state.js";import{StaticModelReferenceKey}from"#context/keys.js";import{toErrorMessage}from"#shared/errors.js";import{parseJsonValue}from"#shared/json.js";import{isMockModel}from"#internal/mock-model-identity.js";import{isFrameworkDefinition}from"#dynamic/definition.js";import{loadDynamicRuntimeModelDefinition,resolveRuntimeModelSelection,shouldMockAuthoredRuntimeModels}from"#runtime/agent/resolve-model.js";const MODEL_REACTION_ID=`model:agent`,DYNAMIC_MODEL_SELECTION_ERROR_CODE=`EVE_DYNAMIC_MODEL_SELECTION_FAILED`;var DynamicModelSelectionError=class extends Error{code=DYNAMIC_MODEL_SELECTION_ERROR_CODE;name=`DynamicModelSelectionError`;constructor(e){super(toErrorMessage(e),{cause:e})}};function isDynamicModelSelectionError(e){return e instanceof DynamicModelSelectionError||typeof e==`object`&&!!e&&e.code===DYNAMIC_MODEL_SELECTION_ERROR_CODE}async function loadModelReaction(e){let t=e.turnAgent.dynamicModel;if(t===void 0)return;let n=await loadDynamicRuntimeModelDefinition({dynamicModel:t,scope:{moduleMap:e.moduleMap,nodeId:e.nodeId}}),r=`${t.logicalPath}#model`;return{contribute:async(e,{ctx:t})=>{try{return await contributionOf(e,t)}catch(e){throw new DynamicModelSelectionError(e)}},evaluate:authoredEvaluate(n.evaluate,{framework:isFrameworkDefinition(n)}),id:MODEL_REACTION_ID,kind:`model`,label:r}}async function contributionOf(e,t){let n=await resolveRuntimeModelSelection({durability:`live`,selection:e,state:t}),r=n.model===void 0||!isMockModel(n.model)&&shouldMockAuthoredRuntimeModels()?void 0:n,i={reference:n.reference};return{live:r,value:parseJsonValue(i)}}function getEffectiveModelSelection(e){let t=readReactionsState(e).slots[MODEL_REACTION_ID];if(t!==void 0&&t.value!==null)return readLive(e,MODEL_REACTION_ID,t)?.live??{reference:slotValueOf(t.value).reference};let n=e.get(StaticModelReferenceKey);return n==null?null:{reference:n}}function effectiveModelId(e){try{return getEffectiveModelSelection(e)?.reference.id}catch{return}}export{DynamicModelSelectionError,effectiveModelId,getEffectiveModelSelection,isDynamicModelSelectionError,loadModelReaction};
1
+ import{authoredEvaluate}from"../reaction.js";import{readLive,readReactionsState,slotValueOf}from"../state.js";import{StaticModelReferenceKey}from"#context/keys.js";import{toErrorMessage}from"#shared/errors.js";import{parseJsonValue}from"#shared/json.js";import{isMockModel}from"#internal/mock-model-identity.js";import{isFrameworkDefinition}from"#dynamic/definition.js";import{loadDynamicRuntimeModelDefinition,resolveRuntimeModelSelection,shouldMockAuthoredRuntimeModels}from"#runtime/agent/resolve-model.js";const MODEL_REACTION_ID=`model:agent`,DYNAMIC_MODEL_SELECTION_ERROR_CODE=`EVE_DYNAMIC_MODEL_SELECTION_FAILED`;var DynamicModelSelectionError=class extends Error{code=DYNAMIC_MODEL_SELECTION_ERROR_CODE;name=`DynamicModelSelectionError`;constructor(e){super(toErrorMessage(e),{cause:e})}};function isDynamicModelSelectionError(e){return e instanceof DynamicModelSelectionError||typeof e==`object`&&!!e&&e.code===DYNAMIC_MODEL_SELECTION_ERROR_CODE}async function loadModelReaction(e){let t=e.turnAgent.dynamicModel;if(t===void 0)return;let n=await loadDynamicRuntimeModelDefinition({dynamicModel:t,scope:{moduleMap:e.moduleMap,nodeId:e.nodeId}}),r=`${t.logicalPath}#model`;return{contribute:async t=>{try{return await contributionOf(t,e)}catch(e){throw new DynamicModelSelectionError(e)}},evaluate:authoredEvaluate(n.evaluate,{framework:isFrameworkDefinition(n)}),id:MODEL_REACTION_ID,kind:`model`,label:r}}async function contributionOf(e,t){let n=await resolveRuntimeModelSelection({durability:`live`,modelMetadata:t.modelMetadata,selection:e}),r=n.model===void 0||!isMockModel(n.model)&&shouldMockAuthoredRuntimeModels()?void 0:n,i={reference:n.reference};return{live:r,value:parseJsonValue(i)}}function getEffectiveModelSelection(e){let t=readReactionsState(e).slots[MODEL_REACTION_ID];if(t!==void 0&&t.value!==null)return readLive(e,MODEL_REACTION_ID,t)?.live??{reference:slotValueOf(t.value).reference};let n=e.get(StaticModelReferenceKey);return n==null?null:{reference:n}}function effectiveModelId(e){try{return getEffectiveModelSelection(e)?.reference.id}catch{return}}export{DynamicModelSelectionError,effectiveModelId,getEffectiveModelSelection,isDynamicModelSelectionError,loadModelReaction};
@@ -1 +1 @@
1
- import{authoredEvaluate}from"../reaction.js";import{entryVersions,slotValueOf,slotsOf}from"../state.js";import{sessionConnectionNames}from"./connection.js";import{bindingOf}from"../remote.js";import{parseJsonValue}from"#shared/json.js";import{assertNotConnectionOwned}from"#connections/ownership.js";import{eveNamespaceReservation}from"#protocol/runtime-tools.js";import{BundleKey}from"#runtime/sessions/runtime-context-keys.js";import{normalizeDynamicRemoteAgent}from"#runtime/subagents/dynamic-remote-agent-config.js";import{createPreparedWorkflowToolHarnessDefinition}from"#execution/tools/workflow/harness-definition.js";import{normalizeDynamicSubagentAgentConfig}from"#runtime/subagents/dynamic-agent-config.js";import{createPreparedRuntimeSubagentTool}from"#runtime/subagents/registry.js";function subagentReaction(e){return{contribute:async(t,{ctx:n})=>{if(t==null)return{value:null};let{credentials:r,selection:i}=await selectionOf(n,e,t),a=parseJsonValue(JSON.parse(JSON.stringify(i)));return r===void 0?{value:a}:{live:r,value:a}},id:`subagent:${e.nodeId}`,kind:`subagent`,evaluate:authoredEvaluate(e.evaluate,{framework:e.framework}),label:e.logicalPath}}function readDynamicSubagentSelections(e){let t={};for(let{id:n,slot:r}of slotsOf(e,`subagent`)){let i=slotValueOf(r.value);if(i===null)continue;let a=n.slice(9);t[a]=i.kind===`remote`&&i.remoteAgent.credentials===!0?{...i,binding:bindingOf(e,a)}:i}return t}function buildDynamicSubagentTools(e){return slotsOf(e,`subagent`).flatMap(({id:t,slot:n})=>{let r=slotValueOf(n.value);return r===null||(r.kind===`subagent`?r.agentConfig.tool:r.remoteAgent.tool)===!1?[]:[{...createPreparedWorkflowToolHarnessDefinition(r.prepared),version:entryVersions(e,t)(n.value)}]})}async function selectionOf(e,t,n){assertNotConnectionOwned({connectionNames:sessionConnectionNames(e),name:t.name,remedy:`Rename the subagent directory.`,subject:`Dynamic subagent`});let r={logicalPath:t.logicalPath,name:t.name,nodeId:t.nodeId,sourceId:t.sourceId,sourceKind:t.sourceKind};if(n.kind===`remote`){let{config:i,credentials:a}=await normalizeDynamicRemoteAgent({name:t.name,value:n}),o=t.tool===!1?{...i,tool:!1}:i;assertToolNameAvailable(e,t,o.tool);let s={kind:`remote`,prepared:createPreparedRuntimeSubagentTool({...r,description:o.description,kind:`remote`,path:o.path,tool:o.tool,url:o.url}),remoteAgent:o};return a===void 0?{selection:s}:{credentials:a,selection:s}}let i=await normalizeDynamicSubagentAgentConfig({name:t.name,state:e,value:n}),a=t.tool===!1?{...i,tool:!1}:i;return assertToolNameAvailable(e,t,a.tool),{selection:{agentConfig:a,kind:`subagent`,prepared:createPreparedRuntimeSubagentTool({...r,description:a.description,kind:`subagent`,tool:a.tool})}}}function assertToolNameAvailable(e,t,n){let r=eveNamespaceReservation(t.name);if(r!==void 0)throw Error(`Dynamic subagent "${t.name}" from "${t.logicalPath}" uses the reserved name "${t.name}". ${r}; rename the subagent.`);if(n!==!1&&e.get(BundleKey)?.toolRegistry.toolsByName.has(t.name)===!0)throw Error(`Dynamic subagent "${t.name}" from "${t.logicalPath}" collides with the tool "${t.name}". Set the subagent's tool to false when that tool wraps it.`)}export{buildDynamicSubagentTools,readDynamicSubagentSelections,subagentReaction};
1
+ import{authoredEvaluate}from"../reaction.js";import{entryVersions,slotValueOf,slotsOf}from"../state.js";import{sessionConnectionNames}from"./connection.js";import{bindingOf}from"../remote.js";import{parseJsonValue}from"#shared/json.js";import{assertNotConnectionOwned}from"#connections/ownership.js";import{eveNamespaceReservation}from"#protocol/runtime-tools.js";import{BundleKey}from"#runtime/sessions/runtime-context-keys.js";import{normalizeDynamicRemoteAgent}from"#runtime/subagents/dynamic-remote-agent-config.js";import{createPreparedWorkflowToolHarnessDefinition}from"#execution/tools/workflow/harness-definition.js";import{normalizeDynamicSubagentAgentConfig}from"#runtime/subagents/dynamic-agent-config.js";import{createPreparedRuntimeSubagentTool}from"#runtime/subagents/registry.js";function subagentReaction(e){return{contribute:async(t,{ctx:n})=>{if(t==null)return{value:null};let{credentials:r,selection:i}=await selectionOf(n,e,t),a=parseJsonValue(JSON.parse(JSON.stringify(i)));return r===void 0?{value:a}:{live:r,value:a}},id:`subagent:${e.nodeId}`,kind:`subagent`,evaluate:authoredEvaluate(e.evaluate,{framework:e.framework}),label:e.logicalPath}}function readDynamicSubagentSelections(e){let t={};for(let{id:n,slot:r}of slotsOf(e,`subagent`)){let i=slotValueOf(r.value);if(i===null)continue;let a=n.slice(9);t[a]=i.kind===`remote`&&i.remoteAgent.credentials===!0?{...i,binding:bindingOf(e,a)}:i}return t}function buildDynamicSubagentTools(e){return slotsOf(e,`subagent`).flatMap(({id:t,slot:n})=>{let r=slotValueOf(n.value);return r===null||(r.kind===`subagent`?r.agentConfig.tool:r.remoteAgent.tool)===!1?[]:[{...createPreparedWorkflowToolHarnessDefinition(r.prepared),version:entryVersions(e,t)(n.value)}]})}async function selectionOf(e,t,n){assertNotConnectionOwned({connectionNames:sessionConnectionNames(e),name:t.name,remedy:`Rename the subagent directory.`,subject:`Dynamic subagent`});let r={logicalPath:t.logicalPath,name:t.name,nodeId:t.nodeId,sourceId:t.sourceId,sourceKind:t.sourceKind};if(n.kind===`remote`){let{config:i,credentials:a}=await normalizeDynamicRemoteAgent({name:t.name,value:n}),o=t.tool===!1?{...i,tool:!1}:i;assertToolNameAvailable(e,t,o.tool);let s={kind:`remote`,prepared:createPreparedRuntimeSubagentTool({...r,description:o.description,kind:`remote`,path:o.path,tool:o.tool,url:o.url}),remoteAgent:o};return a===void 0?{selection:s}:{credentials:a,selection:s}}let i=await normalizeDynamicSubagentAgentConfig({modelMetadata:e.require(BundleKey).modelMetadata,name:t.name,state:e,value:n}),a=t.tool===!1?{...i,tool:!1}:i;return assertToolNameAvailable(e,t,a.tool),{selection:{agentConfig:a,kind:`subagent`,prepared:createPreparedRuntimeSubagentTool({...r,description:a.description,kind:`subagent`,tool:a.tool})}}}function assertToolNameAvailable(e,t,n){let r=eveNamespaceReservation(t.name);if(r!==void 0)throw Error(`Dynamic subagent "${t.name}" from "${t.logicalPath}" uses the reserved name "${t.name}". ${r}; rename the subagent.`);if(n!==!1&&e.get(BundleKey)?.toolRegistry.toolsByName.has(t.name)===!0)throw Error(`Dynamic subagent "${t.name}" from "${t.logicalPath}" collides with the tool "${t.name}". Set the subagent's tool to false when that tool wraps it.`)}export{buildDynamicSubagentTools,readDynamicSubagentSelections,subagentReaction};
@@ -1,10 +1,9 @@
1
1
  import type { LanguageModel } from "ai";
2
2
  import type { CompiledModuleMap } from "#compiler/module-map.js";
3
- import type { ContextAccessor } from "#context/key.js";
4
3
  import type { RuntimeDynamicModelReference, RuntimeModelReference } from "#runtime/agent/bootstrap.js";
5
4
  import { shouldMockAuthoredRuntimeModels } from "#runtime/agent/mock-model-adapter.js";
6
5
  import { type PublicAgentDynamicModelDefinition, type PublicAgentDynamicModelResult } from "#shared/agent-definition.js";
7
- import { type RuntimeModelCatalog } from "#runtime/agent/model-catalog.js";
6
+ import { type ModelMetadata } from "#internal/model-catalog.js";
8
7
  export { shouldMockAuthoredRuntimeModels };
9
8
  /** A deterministic authoring or selection error that retrying cannot repair. */
10
9
  export declare class InvalidRuntimeModelSelectionError extends Error {
@@ -29,8 +28,8 @@ export declare function loadDynamicRuntimeModelDefinition(input: {
29
28
  readonly scope: RuntimeModelResolutionScope;
30
29
  }): Promise<PublicAgentDynamicModelDefinition>;
31
30
  export declare function resolveRuntimeModelSelection(input: {
32
- readonly catalog?: RuntimeModelCatalog;
33
31
  readonly durability: "durable" | "live";
32
+ /** The build's model metadata snapshot, read only when the selection omits its context window. */
33
+ readonly modelMetadata: () => Promise<ModelMetadata>;
34
34
  readonly selection: PublicAgentDynamicModelResult;
35
- readonly state: ContextAccessor;
36
35
  }): Promise<ResolvedRuntimeModelSelection>;
@@ -1 +1 @@
1
- import{localGatewayModel}from"#internal/model-auth/transport.js";import{RuntimeModelMetadataCacheKey}from"#context/keys.js";import{parseJsonObject}from"#shared/json.js";import{isDynamicModelDefinition}from"#shared/agent-definition.js";import{normalizeAgentDefinition,normalizeAgentPromptCache}from"#internal/authored-definition/core.js";import{formatLanguageModelGatewayId,isAgentReasoningDefinition,isRuntimeLanguageModel}from"#internal/runtime-model.js";import{loadResolvedModuleExport}from"#runtime/resolve-helpers.js";import{resolveBootstrapRuntimeModel}from"#runtime/agent/bootstrap-model.js";import{resolveMockAuthoredRuntimeModel,shouldMockAuthoredRuntimeModels}from"#runtime/agent/mock-model-adapter.js";import{createRuntimeModelCatalog}from"#runtime/agent/model-catalog.js";var InvalidRuntimeModelSelectionError=class extends Error{constructor(e,t){super(e,t),this.name=`InvalidRuntimeModelSelectionError`}};async function resolveRuntimeModelReference(e,t){let n=resolveBootstrapRuntimeModel(e);if(n!==null)return n;let r=resolveMockAuthoredRuntimeModel(e);return r===null?isSourceBackedRuntimeModelReference(e)?await loadSourceBackedRuntimeModelReference(e,t):localGatewayModel(e.id)??e.id:r}async function loadSourceBackedRuntimeModelReference(e,t){if(t===void 0)throw Error(`Expected a compiled module-map scope to resolve the authored runtime model "${e.id}".`);let n=await loadResolvedModuleExport({definition:e.source,kindLabel:`runtime model "${e.id}"`,moduleMap:t.moduleMap,nodeId:t.nodeId}),r=normalizeAgentDefinition(n,`Expected the authored agent config export "${e.source.exportName??`default`}" from "${e.source.logicalPath}" to match the public eve shape.`),i=e.sourceField===`compaction.model`?r.compaction?.model:r.model;if(i===void 0)throw Error(`Expected the authored agent config export "${e.source.exportName??`default`}" from "${e.source.logicalPath}" to provide a runtime model at "${e.sourceField??`model`}".`);if(isDynamicModelDefinition(i))throw Error(`Expected the authored agent config export "${e.source.exportName??`default`}" from "${e.source.logicalPath}" to provide a static runtime model.`);return i}function isSourceBackedRuntimeModelReference(e){return e.source!==void 0}async function loadDynamicRuntimeModelDefinition(e){let t=await loadResolvedModuleExport({definition:e.dynamicModel,kindLabel:`dynamic runtime model`,moduleMap:e.scope.moduleMap,nodeId:e.scope.nodeId}),n=normalizeAgentDefinition(t,`Expected the authored agent config export "${e.dynamicModel.exportName??`default`}" from "${e.dynamicModel.logicalPath}" to match the public eve shape.`).model;if(!isDynamicModelDefinition(n))throw Error(`Expected the authored agent config export "${e.dynamicModel.exportName??`default`}" from "${e.dynamicModel.logicalPath}" to provide a dynamic model definition.`);return n}async function resolveRuntimeModelSelection(e){if(e.selection===null||e.selection===void 0)throw new InvalidRuntimeModelSelectionError(`The dynamic model returned no model. Return a model ID, a provider model, or { model, reasoning?, modelContextWindowTokens?, modelOptions? }.`);let t,n,r;try{t=normalizeDynamicModelSelection(e.selection),validateDynamicModelSelection(t),n=t.modelOptions?.providerOptions===void 0?void 0:parseProviderOptionsRecord(t.modelOptions.providerOptions),r=t.modelOptions?.promptCache===void 0?void 0:normalizeAgentPromptCache(t.modelOptions.promptCache,`Dynamic model resolver returned an invalid selection.`)}catch(e){throw invalidSelectionError(e)}let i=t.model,a=e.catalog??runtimeModelCatalogForState(e.state);if(typeof i==`string`){let o=formatLanguageModelGatewayId(i);if(r!==void 0)throw gatewayPromptCacheError(o);let s=await resolveSelectionMetadata({cacheKey:`gateway:${o}`,catalog:a,contextWindowTokens:t.modelContextWindowTokens,load:e=>e.getByGatewayId(o),modelLabel:o,state:e.state});return{reference:{id:s.resolvedModelId,contextWindowTokens:s.contextWindowTokens,maxOutputTokens:s.maxOutputTokens,providerOptions:n,reasoning:t.reasoning}}}if(validateRuntimeLanguageModel(i),e.durability===`durable`)throw new InvalidRuntimeModelSelectionError(`Dynamic model selection returned a provider object, but durable model selections must be serializable. Return a model id string, or use a "beforeModel" model resolver.`);let o=formatLanguageModelGatewayId(i),s=i.provider.split(`.`)[0];if(r!==void 0&&s===`gateway`)throw gatewayPromptCacheError(o);let c=await resolveSelectionMetadata({cacheKey:s===`gateway`?`gateway:${i.modelId}`:`provider:${i.provider}:${i.modelId}`,catalog:a,contextWindowTokens:t.modelContextWindowTokens,load:e=>s===`gateway`?e.getByGatewayId(i.modelId):e.getByProviderModelId(i.provider,i.modelId),modelLabel:o,state:e.state});return{model:i,reference:{id:c.resolvedModelId,contextWindowTokens:c.contextWindowTokens,maxOutputTokens:c.maxOutputTokens,promptCache:r,providerOptions:n,reasoning:t.reasoning}}}function invalidSelectionError(e){return e instanceof InvalidRuntimeModelSelectionError?e:new InvalidRuntimeModelSelectionError(e instanceof Error?e.message:String(e),{cause:e})}function gatewayPromptCacheError(e){return new InvalidRuntimeModelSelectionError(`Dynamic model resolver returned modelOptions.promptCache for "${e}", which routes through AI Gateway. promptCache applies only to models eve calls directly; Gateway manages its own prompt caching through providerOptions.gateway.caching.`)}const runtimeModelCatalogsByState=new WeakMap;function runtimeModelCatalogForState(e){let t=runtimeModelCatalogsByState.get(e);if(t!==void 0)return t;let n=createRuntimeModelCatalog();return runtimeModelCatalogsByState.set(e,n),n}async function resolveSelectionMetadata(e){if(e.contextWindowTokens!==void 0)return{contextWindowTokens:e.contextWindowTokens,resolvedModelId:e.modelLabel};let t=Date.now(),n=e.state.get(RuntimeModelMetadataCacheKey)?.[e.cacheKey];if(n!==void 0&&n.expiresAt>t)return n;let r=await e.load(e.catalog);if(r===null)throw new InvalidRuntimeModelSelectionError(`Cannot select model "${e.modelLabel}" because AI Gateway did not provide context window metadata. Return modelContextWindowTokens with this selection for an unlisted or custom model.`);let i={...r,expiresAt:t+864e5};return e.state.set(RuntimeModelMetadataCacheKey,n=>({...Object.fromEntries(Object.entries(n??{}).filter(([,e])=>e.expiresAt>t)),[e.cacheKey]:i})),i}const DYNAMIC_MODEL_SELECTION_KEYS=new Set([`model`,`modelContextWindowTokens`,`modelOptions`,`reasoning`]);function validateDynamicModelSelection(e){let t=Object.keys(e).filter(e=>!DYNAMIC_MODEL_SELECTION_KEYS.has(e));if(t.length>0)throw Error(`A dynamic model returns only runtime settings: model, reasoning, modelContextWindowTokens, and modelOptions. It returned ${t.map(e=>`"${e}"`).join(`, `)}, which can't vary per session; declare ${t.length===1?`it`:`them`} on defineAgent() instead.`);if(e.reasoning!==void 0&&!isAgentReasoningDefinition(e.reasoning))throw Error(`Dynamic model resolver returned an invalid reasoning effort. Expected provider-default, none, minimal, low, medium, high, or xhigh.`);let n=e.modelContextWindowTokens;if(n!==void 0&&(!Number.isInteger(n)||n<=0))throw Error(`Dynamic model resolver returned an invalid modelContextWindowTokens value. Expected a positive integer.`);if(typeof e.model==`string`&&e.model.trim()===``)throw Error(`Dynamic model resolver returned an empty model id.`)}function normalizeDynamicModelSelection(e){return isModelSelectionDefinition(e)?e:{model:e}}function isModelSelectionDefinition(e){return typeof e==`object`&&!!e&&`model`in e&&!isRuntimeLanguageModel(e)}function validateRuntimeLanguageModel(e){if(!isRuntimeLanguageModel(e))throw new InvalidRuntimeModelSelectionError(`Dynamic model resolver returned an invalid model. Return an AI Gateway model id string, an AI SDK language model, or { model, modelContextWindowTokens?, modelOptions? }.`)}function parseProviderOptionsRecord(e){if(e===void 0)return;let t={};for(let[n,r]of Object.entries(e))t[n]=parseJsonObject(r);return t}export{InvalidRuntimeModelSelectionError,loadDynamicRuntimeModelDefinition,resolveRuntimeModelReference,resolveRuntimeModelSelection,shouldMockAuthoredRuntimeModels};
1
+ import{localGatewayModel}from"#internal/model-auth/transport.js";import{parseJsonObject}from"#shared/json.js";import{isDynamicModelDefinition}from"#shared/agent-definition.js";import{lookupCatalogModelByProviderModelId,lookupCatalogModelBySlug}from"#internal/model-catalog.js";import{normalizeAgentDefinition,normalizeAgentPromptCache}from"#internal/authored-definition/core.js";import{formatLanguageModelGatewayId,isAgentReasoningDefinition,isRuntimeLanguageModel}from"#internal/runtime-model.js";import{loadResolvedModuleExport}from"#runtime/resolve-helpers.js";import{resolveBootstrapRuntimeModel}from"#runtime/agent/bootstrap-model.js";import{resolveMockAuthoredRuntimeModel,shouldMockAuthoredRuntimeModels}from"#runtime/agent/mock-model-adapter.js";var InvalidRuntimeModelSelectionError=class extends Error{constructor(e,t){super(e,t),this.name=`InvalidRuntimeModelSelectionError`}};async function resolveRuntimeModelReference(e,t){let n=resolveBootstrapRuntimeModel(e);if(n!==null)return n;let r=resolveMockAuthoredRuntimeModel(e);return r===null?isSourceBackedRuntimeModelReference(e)?await loadSourceBackedRuntimeModelReference(e,t):localGatewayModel(e.id)??e.id:r}async function loadSourceBackedRuntimeModelReference(e,t){if(t===void 0)throw Error(`Expected a compiled module-map scope to resolve the authored runtime model "${e.id}".`);let n=await loadResolvedModuleExport({definition:e.source,kindLabel:`runtime model "${e.id}"`,moduleMap:t.moduleMap,nodeId:t.nodeId}),r=normalizeAgentDefinition(n,`Expected the authored agent config export "${e.source.exportName??`default`}" from "${e.source.logicalPath}" to match the public eve shape.`),i=e.sourceField===`compaction.model`?r.compaction?.model:r.model;if(i===void 0)throw Error(`Expected the authored agent config export "${e.source.exportName??`default`}" from "${e.source.logicalPath}" to provide a runtime model at "${e.sourceField??`model`}".`);if(isDynamicModelDefinition(i))throw Error(`Expected the authored agent config export "${e.source.exportName??`default`}" from "${e.source.logicalPath}" to provide a static runtime model.`);return i}function isSourceBackedRuntimeModelReference(e){return e.source!==void 0}async function loadDynamicRuntimeModelDefinition(e){let t=await loadResolvedModuleExport({definition:e.dynamicModel,kindLabel:`dynamic runtime model`,moduleMap:e.scope.moduleMap,nodeId:e.scope.nodeId}),n=normalizeAgentDefinition(t,`Expected the authored agent config export "${e.dynamicModel.exportName??`default`}" from "${e.dynamicModel.logicalPath}" to match the public eve shape.`).model;if(!isDynamicModelDefinition(n))throw Error(`Expected the authored agent config export "${e.dynamicModel.exportName??`default`}" from "${e.dynamicModel.logicalPath}" to provide a dynamic model definition.`);return n}async function resolveRuntimeModelSelection(e){if(e.selection===null||e.selection===void 0)throw new InvalidRuntimeModelSelectionError(`The dynamic model returned no model. Return a model ID, a provider model, or { model, reasoning?, modelContextWindowTokens?, modelOptions? }.`);let t,n,r;try{t=normalizeDynamicModelSelection(e.selection),validateDynamicModelSelection(t),n=t.modelOptions?.providerOptions===void 0?void 0:parseProviderOptionsRecord(t.modelOptions.providerOptions),r=t.modelOptions?.promptCache===void 0?void 0:normalizeAgentPromptCache(t.modelOptions.promptCache,`Dynamic model resolver returned an invalid selection.`)}catch(e){throw invalidSelectionError(e)}let i=t.model;if(typeof i==`string`){let a=formatLanguageModelGatewayId(i);if(r!==void 0)throw gatewayPromptCacheError(a);return{reference:{id:a,contextWindowTokens:t.modelContextWindowTokens??(await lookupModelMetadata(e.modelMetadata,a,e=>lookupCatalogModelBySlug(e,a))).contextWindowTokens,providerOptions:n,reasoning:t.reasoning}}}if(validateRuntimeLanguageModel(i),e.durability===`durable`)throw new InvalidRuntimeModelSelectionError(`Dynamic model selection returned a provider object, but durable model selections must be serializable. Return a model id string, or use a "beforeModel" model resolver.`);let a=formatLanguageModelGatewayId(i),o=i.provider.split(`.`)[0]===`gateway`;if(r!==void 0&&o)throw gatewayPromptCacheError(a);let s=o?i.modelId:a,c=t.modelContextWindowTokens;if(c===void 0){let t=await lookupModelMetadata(e.modelMetadata,s,e=>o?lookupCatalogModelBySlug(e,i.modelId):lookupCatalogModelByProviderModelId(e,i.provider,i.modelId));o||(s=t.slug),c=t.contextWindowTokens}return{model:i,reference:{id:s,contextWindowTokens:c,promptCache:r,providerOptions:n,reasoning:t.reasoning}}}function invalidSelectionError(e){return e instanceof InvalidRuntimeModelSelectionError?e:new InvalidRuntimeModelSelectionError(e instanceof Error?e.message:String(e),{cause:e})}function gatewayPromptCacheError(e){return new InvalidRuntimeModelSelectionError(`Dynamic model resolver returned modelOptions.promptCache for "${e}", which routes through AI Gateway. promptCache applies only to models eve calls directly; Gateway manages its own prompt caching through providerOptions.gateway.caching.`)}async function lookupModelMetadata(e,t,n){let r=await e(),i=n(r);if(i!==null)return i;throw new InvalidRuntimeModelSelectionError(r.fetchedAt===null?`Cannot select model "${t}" because this build couldn't read the AI Gateway model catalog, so it has no context window for the model. Return modelContextWindowTokens with this selection, or rebuild with network access to ai-gateway.vercel.sh.`:`Cannot select model "${t}" because the AI Gateway model catalog this build read at ${r.fetchedAt} has no context window for it. Return modelContextWindowTokens with this selection for an unlisted or custom model, or rebuild to pick up a newly published one.`)}const DYNAMIC_MODEL_SELECTION_KEYS=new Set([`model`,`modelContextWindowTokens`,`modelOptions`,`reasoning`]);function validateDynamicModelSelection(e){let t=Object.keys(e).filter(e=>!DYNAMIC_MODEL_SELECTION_KEYS.has(e));if(t.length>0)throw Error(`A dynamic model returns only runtime settings: model, reasoning, modelContextWindowTokens, and modelOptions. It returned ${t.map(e=>`"${e}"`).join(`, `)}, which can't vary per session; declare ${t.length===1?`it`:`them`} on defineAgent() instead.`);if(e.reasoning!==void 0&&!isAgentReasoningDefinition(e.reasoning))throw Error(`Dynamic model resolver returned an invalid reasoning effort. Expected provider-default, none, minimal, low, medium, high, or xhigh.`);let n=e.modelContextWindowTokens;if(n!==void 0&&(!Number.isInteger(n)||n<=0))throw Error(`Dynamic model resolver returned an invalid modelContextWindowTokens value. Expected a positive integer.`);if(typeof e.model==`string`&&e.model.trim()===``)throw Error(`Dynamic model resolver returned an empty model id.`)}function normalizeDynamicModelSelection(e){return isModelSelectionDefinition(e)?e:{model:e}}function isModelSelectionDefinition(e){return typeof e==`object`&&!!e&&`model`in e&&!isRuntimeLanguageModel(e)}function validateRuntimeLanguageModel(e){if(!isRuntimeLanguageModel(e))throw new InvalidRuntimeModelSelectionError(`Dynamic model resolver returned an invalid model. Return an AI Gateway model id string, an AI SDK language model, or { model, modelContextWindowTokens?, modelOptions? }.`)}function parseProviderOptionsRecord(e){if(e===void 0)return;let t={};for(let[n,r]of Object.entries(e))t[n]=parseJsonObject(r);return t}export{InvalidRuntimeModelSelectionError,loadDynamicRuntimeModelDefinition,resolveRuntimeModelReference,resolveRuntimeModelSelection,shouldMockAuthoredRuntimeModels};
@@ -9,6 +9,7 @@ interface RuntimeCompilerArtifactPaths {
9
9
  readonly diagnosticsPath: string;
10
10
  readonly discoveryManifestPath: string;
11
11
  readonly discoveryDirectoryPath: string;
12
+ readonly modelMetadataPath: string;
12
13
  readonly moduleMapPath: string;
13
14
  readonly sandboxPreparedArtifactsPath: string;
14
15
  }
@@ -1 +1 @@
1
- function resolveRuntimeCompilerArtifactPaths(e){let t=normalizeFilesystemPath(e),n=`${t}/.eve/discovery`,r=`${t}/.eve/compile`;return{appRoot:t,compiledManifestPath:`${r}/compiled-agent-manifest.json`,compileDirectoryPath:r,compileMetadataPath:`${r}/compile-metadata.json`,diagnosticsPath:`${n}/diagnostics.json`,discoveryDirectoryPath:n,discoveryManifestPath:`${n}/agent-discovery-manifest.json`,moduleMapPath:`${r}/module-map.mjs`,sandboxPreparedArtifactsPath:`${r}/sandbox-prepared-artifacts.json`}}function normalizeFilesystemPath(e){let t=e.replaceAll(`\\`,`/`);return t===`/`?t:t.replace(/\/+$/,``)}export{resolveRuntimeCompilerArtifactPaths};
1
+ function resolveRuntimeCompilerArtifactPaths(e){let t=normalizeFilesystemPath(e),n=`${t}/.eve/discovery`,r=`${t}/.eve/compile`;return{appRoot:t,compiledManifestPath:`${r}/compiled-agent-manifest.json`,compileDirectoryPath:r,compileMetadataPath:`${r}/compile-metadata.json`,diagnosticsPath:`${n}/diagnostics.json`,discoveryDirectoryPath:n,discoveryManifestPath:`${n}/agent-discovery-manifest.json`,modelMetadataPath:`${r}/model-metadata.json`,moduleMapPath:`${r}/module-map.mjs`,sandboxPreparedArtifactsPath:`${r}/sandbox-prepared-artifacts.json`}}function normalizeFilesystemPath(e){let t=e.replaceAll(`\\`,`/`);return t===`/`?t:t.replace(/\/+$/,``)}export{resolveRuntimeCompilerArtifactPaths};
@@ -1,6 +1,7 @@
1
1
  import type { CompileMetadata } from "#compiler/artifacts.js";
2
2
  import type { CompiledAgentManifest } from "#compiler/manifest.js";
3
3
  import type { CompiledModuleMap } from "#compiler/module-map.js";
4
+ import type { ModelMetadata } from "#internal/model-catalog.js";
4
5
  import type { SandboxPreparedArtifactsManifest } from "#shared/sandbox-prepared-artifacts.js";
5
6
  /**
6
7
  * Bundled compiled artifacts installed by Nitro when authored runtime state is
@@ -9,6 +10,7 @@ import type { SandboxPreparedArtifactsManifest } from "#shared/sandbox-prepared-
9
10
  export interface BundledCompiledArtifacts {
10
11
  manifest: CompiledAgentManifest;
11
12
  metadata?: CompileMetadata;
13
+ modelMetadata?: ModelMetadata;
12
14
  moduleMap: CompiledModuleMap;
13
15
  sandboxPreparedArtifacts?: SandboxPreparedArtifactsManifest;
14
16
  }
@@ -1 +1 @@
1
- import{createRuntimeSession,getActiveRuntimeSession,setRuntimeSessionCompiledArtifacts,withRuntimeSession}from"#runtime/sessions/runtime-session.js";function installBundledCompiledArtifacts(e){setRuntimeSessionCompiledArtifacts(getActiveRuntimeSession(),{manifest:e.manifest,metadata:e.metadata,moduleMap:e.moduleMap,sandboxPreparedArtifacts:e.sandboxPreparedArtifacts})}async function withBundledCompiledArtifacts(e,t){let n=createRuntimeSession(e.sessionId??`bundled-compiled-artifacts`);return await withRuntimeSession(n,async()=>(installBundledCompiledArtifacts(e),await t()))}function readBundledCompiledArtifacts(){return getActiveRuntimeSession().compiledArtifacts}export{installBundledCompiledArtifacts,readBundledCompiledArtifacts,withBundledCompiledArtifacts};
1
+ import{createRuntimeSession,getActiveRuntimeSession,setRuntimeSessionCompiledArtifacts,withRuntimeSession}from"#runtime/sessions/runtime-session.js";function installBundledCompiledArtifacts(e){setRuntimeSessionCompiledArtifacts(getActiveRuntimeSession(),{manifest:e.manifest,metadata:e.metadata,modelMetadata:e.modelMetadata,moduleMap:e.moduleMap,sandboxPreparedArtifacts:e.sandboxPreparedArtifacts})}async function withBundledCompiledArtifacts(e,t){let n=createRuntimeSession(e.sessionId??`bundled-compiled-artifacts`);return await withRuntimeSession(n,async()=>(installBundledCompiledArtifacts(e),await t()))}function readBundledCompiledArtifacts(){return getActiveRuntimeSession().compiledArtifacts}export{installBundledCompiledArtifacts,readBundledCompiledArtifacts,withBundledCompiledArtifacts};
@@ -0,0 +1,4 @@
1
+ import { type ModelMetadata } from "#internal/model-catalog.js";
2
+ import type { RuntimeCompiledArtifactsSource } from "#runtime/compiled-artifacts-source.js";
3
+ /** Loads the model metadata snapshot the build baked into its compiled artifacts. */
4
+ export declare function loadModelMetadata(source: RuntimeCompiledArtifactsSource): Promise<ModelMetadata>;
@@ -0,0 +1 @@
1
+ import{readFile}from"node:fs/promises";import{resolveRuntimeCompilerArtifactPaths}from"#runtime/loaders/artifact-paths.js";import{modelMetadataSchema}from"#internal/model-catalog.js";import{readBundledCompiledArtifacts}from"#runtime/loaders/bundled-artifacts.js";async function loadModelMetadata(e){if(e.kind===`bundled`){let e=readBundledCompiledArtifacts()?.modelMetadata;if(e===void 0)throw Error("The bundled compiled artifacts have no model metadata. Rebuild with `eve build`.");return e}let t=resolveRuntimeCompilerArtifactPaths(e.appRoot).modelMetadataPath;try{return modelMetadataSchema.parse(JSON.parse(await readFile(t,`utf8`)))}catch(e){throw e instanceof Error&&`code`in e&&e.code===`ENOENT`?Error(`The compiled artifacts have no model metadata at "${t}". Rebuild with \`eve build\`, or restart \`eve dev\`.`,{cause:e}):e}}export{loadModelMetadata};
@@ -1 +1 @@
1
- import{normalizeAgentDefinition}from"#internal/authored-definition/core.js";import{createResolvedModuleSourceRef,loadResolvedModuleExport}from"#runtime/resolve-helpers.js";import{resolveConnectionDefinition}from"#runtime/resolve-connection.js";import{resolveDynamicDefinition}from"#runtime/resolve-dynamic.js";import{resolveChannelDefinition}from"#runtime/resolve-channel.js";import{resolveHookDefinition}from"#runtime/resolve-hook.js";import{resolveSandboxDefinition}from"#runtime/resolve-sandbox.js";import{resolveToolDefinition}from"#runtime/resolve-tool.js";import{resolveMemoryDefinition}from"#runtime/resolve-memory.js";async function resolveAgent(e){let t=e.manifest.skills.map(t=>({...t,owner:requireCompiledSourceOwner(e.manifest,t),metadata:t.metadata===void 0?void 0:{...t.metadata}})),n=await Promise.all(e.manifest.channelRoutes.effective.map(t=>resolveChannelDefinition(t,e.moduleMap,e.nodeId))),r=await Promise.all(e.manifest.tools.map(t=>resolveToolDefinition(t,e.moduleMap,e.nodeId,requireBindingOwner(e.manifest,t.sourceId)))),i={moduleMap:e.moduleMap,nodeId:e.nodeId},a=await Promise.all(e.manifest.dynamicConnections.map(e=>resolveDynamicDefinition(e,{...i,kindLabel:`dynamic connection`}))),o=await Promise.all((e.manifest.dynamicInstructions??[]).map(e=>resolveDynamicDefinition(e,{...i,kindLabel:`dynamic instructions`}))),s=await Promise.all((e.manifest.dynamicSkills??[]).map(e=>resolveDynamicDefinition(e,{...i,kindLabel:`dynamic skill`}))),c=await Promise.all(e.manifest.dynamicTools.map(e=>resolveDynamicDefinition(e,{...i,kindLabel:`dynamic tool`}))),l=await Promise.all(e.manifest.hooks.map(t=>resolveHookDefinition(t,e.moduleMap,e.nodeId))),u=await Promise.all(e.manifest.connections.map(t=>resolveConnectionDefinition(t,e.moduleMap,e.nodeId))),d=await Promise.all(e.manifest.memories.map(t=>resolveMemoryDefinition(t,e.moduleMap,e.nodeId))),f=await resolveSandboxDefinition(e.manifest.sandbox,e.moduleMap,e.nodeId),p=e.manifest.instructions.map(t=>createResolvedInstructionsDefinition(e.manifest,t)),m=e.manifest.workspaceResourceRoot,h={channels:n,connections:u,dynamicConnectionResolvers:a,dynamicInstructionsResolvers:o,dynamicSkillResolvers:s,dynamicToolResolvers:c,hooks:l,instructions:p,metadata:{agentRoot:e.manifest.agentRoot,appRoot:e.manifest.appRoot,diagnosticsSummary:e.manifest.diagnosticsSummary},memories:d,sandbox:f,workspaceResourceRoot:m,skills:t,tools:r,workspaceSpec:{rootEntries:[...m.rootEntries]}};return`config`in e.manifest?{...h,config:createResolvedAgentConfig(e.manifest,await loadSessionUsageLimit(e.manifest,e.moduleMap,e.nodeId))}:h}async function loadSessionUsageLimit(e,t,n){let r=e.config.source;if(e.config.limits?.sessionUsage!==!0||r===void 0)return;let i=await loadResolvedModuleExport({definition:r,kindLabel:`agent config`,moduleMap:t,nodeId:n});return normalizeAgentDefinition(i,`Expected the authored agent config export "${r.exportName??`default`}" from "${r.logicalPath}" to match the public eve shape.`).limits?.sessionUsage}function requireBindingOwner(e,t){let n=e.bindings[t];if(n===void 0)throw Error(`Compiled source "${t}" has no binding.`);return n.owner}function createResolvedInstructionsDefinition(e,t){return{content:t.content,name:t.name,owner:requireCompiledSourceOwner(e,t),logicalPath:t.logicalPath,role:t.role,sourceId:t.sourceId,sourceKind:t.sourceKind}}function requireCompiledSourceOwner(e,t){let n=e.bindings[t.sourceId]?.owner??t.owner;if(n===void 0)throw Error(`Compiled source "${t.sourceId}" has no owner.`);return n}function createResolvedAgentConfig(e,t){let n={name:e.config.name};if(e.config.defaultTools!==void 0&&(n.defaultTools=e.config.defaultTools),e.config.description!==void 0&&(n.description=e.config.description),e.config.compaction!==void 0){let t={};e.config.compaction.model!==void 0&&(t.model=e.config.compaction.model.source===void 0?{contextWindowTokens:e.config.compaction.model.contextWindowTokens,id:e.config.compaction.model.id,maxOutputTokens:e.config.compaction.model.maxOutputTokens,providerOptions:e.config.compaction.model.providerOptions}:{contextWindowTokens:e.config.compaction.model.contextWindowTokens,id:e.config.compaction.model.id,maxOutputTokens:e.config.compaction.model.maxOutputTokens,providerOptions:e.config.compaction.model.providerOptions,source:{exportName:e.config.compaction.model.source.exportName,sourceKind:`module`,logicalPath:e.config.compaction.model.source.logicalPath,sourceId:e.config.compaction.model.source.sourceId},sourceField:e.config.compaction.model.sourceField}),e.config.compaction.thresholdPercent!==void 0&&(t.thresholdPercent=e.config.compaction.thresholdPercent),n.compaction=t}if(e.config.experimental!==void 0&&(n.experimental={workflow:e.config.experimental.workflow===void 0?void 0:{modelCallsPerStep:e.config.experimental.workflow.modelCallsPerStep,retention:e.config.experimental.workflow.retention,world:e.config.experimental.workflow.world}}),e.config.reasoning!==void 0&&(n.reasoning=e.config.reasoning),e.config.source!==void 0&&(n.source=createResolvedModuleSourceRef(e.config.source)),e.config.tool!==void 0&&(n.tool=e.config.tool),e.config.limits!==void 0&&(n.limits={sessionTimeoutMs:e.config.limits.sessionTimeoutMs,sessionUsage:t}),e.config.dynamicModel!==void 0)return{...n,dynamicModel:createResolvedModuleSourceRef(e.config.dynamicModel)};let r=e.config.model;return{...n,model:r.source===void 0?{id:r.id,contextWindowTokens:r.contextWindowTokens,maxOutputTokens:r.maxOutputTokens,providerOptions:r.providerOptions}:{contextWindowTokens:r.contextWindowTokens,id:r.id,maxOutputTokens:r.maxOutputTokens,promptCache:r.promptCache,providerOptions:r.providerOptions,source:{exportName:r.source.exportName,sourceKind:`module`,logicalPath:r.source.logicalPath,sourceId:r.source.sourceId}}}}export{resolveAgent};
1
+ import{normalizeAgentDefinition}from"#internal/authored-definition/core.js";import{createResolvedModuleSourceRef,loadResolvedModuleExport}from"#runtime/resolve-helpers.js";import{resolveConnectionDefinition}from"#runtime/resolve-connection.js";import{resolveDynamicDefinition}from"#runtime/resolve-dynamic.js";import{resolveChannelDefinition}from"#runtime/resolve-channel.js";import{resolveHookDefinition}from"#runtime/resolve-hook.js";import{resolveSandboxDefinition}from"#runtime/resolve-sandbox.js";import{resolveToolDefinition}from"#runtime/resolve-tool.js";import{resolveMemoryDefinition}from"#runtime/resolve-memory.js";async function resolveAgent(e){let t=e.manifest.skills.map(t=>({...t,owner:requireCompiledSourceOwner(e.manifest,t),metadata:t.metadata===void 0?void 0:{...t.metadata}})),n=await Promise.all(e.manifest.channelRoutes.effective.map(t=>resolveChannelDefinition(t,e.moduleMap,e.nodeId))),r=await Promise.all(e.manifest.tools.map(t=>resolveToolDefinition(t,e.moduleMap,e.nodeId,requireBindingOwner(e.manifest,t.sourceId)))),i={moduleMap:e.moduleMap,nodeId:e.nodeId},a=await Promise.all(e.manifest.dynamicConnections.map(e=>resolveDynamicDefinition(e,{...i,kindLabel:`dynamic connection`}))),o=await Promise.all((e.manifest.dynamicInstructions??[]).map(e=>resolveDynamicDefinition(e,{...i,kindLabel:`dynamic instructions`}))),s=await Promise.all((e.manifest.dynamicSkills??[]).map(e=>resolveDynamicDefinition(e,{...i,kindLabel:`dynamic skill`}))),c=await Promise.all(e.manifest.dynamicTools.map(e=>resolveDynamicDefinition(e,{...i,kindLabel:`dynamic tool`}))),l=await Promise.all(e.manifest.hooks.map(t=>resolveHookDefinition(t,e.moduleMap,e.nodeId))),u=await Promise.all(e.manifest.connections.map(t=>resolveConnectionDefinition(t,e.moduleMap,e.nodeId))),d=await Promise.all(e.manifest.memories.map(t=>resolveMemoryDefinition(t,e.moduleMap,e.nodeId))),f=await resolveSandboxDefinition(e.manifest.sandbox,e.moduleMap,e.nodeId),p=e.manifest.instructions.map(t=>createResolvedInstructionsDefinition(e.manifest,t)),m=e.manifest.workspaceResourceRoot,h={channels:n,connections:u,dynamicConnectionResolvers:a,dynamicInstructionsResolvers:o,dynamicSkillResolvers:s,dynamicToolResolvers:c,hooks:l,instructions:p,metadata:{agentRoot:e.manifest.agentRoot,appRoot:e.manifest.appRoot,diagnosticsSummary:e.manifest.diagnosticsSummary},memories:d,sandbox:f,workspaceResourceRoot:m,skills:t,tools:r,workspaceSpec:{rootEntries:[...m.rootEntries]}};return`config`in e.manifest?{...h,config:createResolvedAgentConfig(e.manifest,await loadSessionUsageLimit(e.manifest,e.moduleMap,e.nodeId))}:h}async function loadSessionUsageLimit(e,t,n){let r=e.config.source;if(e.config.limits?.sessionUsage!==!0||r===void 0)return;let i=await loadResolvedModuleExport({definition:r,kindLabel:`agent config`,moduleMap:t,nodeId:n});return normalizeAgentDefinition(i,`Expected the authored agent config export "${r.exportName??`default`}" from "${r.logicalPath}" to match the public eve shape.`).limits?.sessionUsage}function requireBindingOwner(e,t){let n=e.bindings[t];if(n===void 0)throw Error(`Compiled source "${t}" has no binding.`);return n.owner}function createResolvedInstructionsDefinition(e,t){return{content:t.content,name:t.name,owner:requireCompiledSourceOwner(e,t),logicalPath:t.logicalPath,role:t.role,sourceId:t.sourceId,sourceKind:t.sourceKind}}function requireCompiledSourceOwner(e,t){let n=e.bindings[t.sourceId]?.owner??t.owner;if(n===void 0)throw Error(`Compiled source "${t.sourceId}" has no owner.`);return n}function createResolvedAgentConfig(e,t){let n={name:e.config.name};if(e.config.defaultTools!==void 0&&(n.defaultTools=e.config.defaultTools),e.config.description!==void 0&&(n.description=e.config.description),e.config.compaction!==void 0){let t={};e.config.compaction.model!==void 0&&(t.model=e.config.compaction.model.source===void 0?{contextWindowTokens:e.config.compaction.model.contextWindowTokens,id:e.config.compaction.model.id,providerOptions:e.config.compaction.model.providerOptions}:{contextWindowTokens:e.config.compaction.model.contextWindowTokens,id:e.config.compaction.model.id,providerOptions:e.config.compaction.model.providerOptions,source:{exportName:e.config.compaction.model.source.exportName,sourceKind:`module`,logicalPath:e.config.compaction.model.source.logicalPath,sourceId:e.config.compaction.model.source.sourceId},sourceField:e.config.compaction.model.sourceField}),e.config.compaction.thresholdPercent!==void 0&&(t.thresholdPercent=e.config.compaction.thresholdPercent),n.compaction=t}if(e.config.experimental!==void 0&&(n.experimental={workflow:e.config.experimental.workflow===void 0?void 0:{modelCallsPerStep:e.config.experimental.workflow.modelCallsPerStep,retention:e.config.experimental.workflow.retention,world:e.config.experimental.workflow.world}}),e.config.reasoning!==void 0&&(n.reasoning=e.config.reasoning),e.config.source!==void 0&&(n.source=createResolvedModuleSourceRef(e.config.source)),e.config.tool!==void 0&&(n.tool=e.config.tool),e.config.limits!==void 0&&(n.limits={sessionTimeoutMs:e.config.limits.sessionTimeoutMs,sessionUsage:t}),e.config.dynamicModel!==void 0)return{...n,dynamicModel:createResolvedModuleSourceRef(e.config.dynamicModel)};let r=e.config.model;return{...n,model:r.source===void 0?{id:r.id,contextWindowTokens:r.contextWindowTokens,providerOptions:r.providerOptions}:{contextWindowTokens:r.contextWindowTokens,id:r.id,promptCache:r.promptCache,providerOptions:r.providerOptions,source:{exportName:r.source.exportName,sourceKind:`module`,logicalPath:r.source.logicalPath,sourceId:r.source.sourceId}}}}export{resolveAgent};
@@ -1,4 +1,5 @@
1
1
  import type { CompiledModuleMap } from "#compiler/module-map.js";
2
+ import type { ModelMetadata } from "#internal/model-catalog.js";
2
3
  import type { RuntimeTurnAgent } from "#runtime/agent/bootstrap.js";
3
4
  import type { RuntimeAdapterRegistry } from "#runtime/channels/registry.js";
4
5
  import { type RuntimeCompiledArtifactsSource } from "#runtime/compiled-artifacts-source.js";
@@ -10,6 +11,8 @@ export interface CompiledRuntimeAgentBundle {
10
11
  readonly adapterRegistry: RuntimeAdapterRegistry;
11
12
  readonly compiledArtifactsSource: RuntimeCompiledArtifactsSource;
12
13
  readonly graph: ResolvedAgentGraphBundle;
14
+ /** The build's model metadata snapshot, read on first use; runtime selections resolve from it. */
15
+ readonly modelMetadata: () => Promise<ModelMetadata>;
13
16
  readonly moduleMap: CompiledModuleMap;
14
17
  /**
15
18
  * Id of the active node in the graph. `undefined` for root bundles.
@@ -1 +1 @@
1
- import{resolveRuntimeCompiledArtifactsVersionedCacheKey}from"#runtime/cache-key.js";import{getRuntimeCompiledArtifactsCacheKey}from"#runtime/compiled-artifacts-source.js";import{loadCompiledManifest}from"#runtime/loaders/manifest.js";import{getActiveRuntimeSession}from"#runtime/sessions/runtime-session.js";import{resolvePackageSourceFilePath}from"#internal/application/package.js";import{pathToFileURL}from"node:url";import{getResolvedRuntimeAgentNode}from"#runtime/graph.js";import{resolveRuntimeAgentGraph}from"#runtime/resolve-agent-graph.js";import{createRuntimeAdapterRegistry}from"#runtime/channels/registry.js";import{loadCompiledModuleMap}from"#runtime/loaders/module-map.js";const isCacheDisabled=process.env.EVE_DISABLE_AGENT_CACHE===`1`,DEVELOPMENT_RUNTIME_SNAPSHOT_SEGMENT=/\/\.eve\/(?:eval-servers\/[^/]+\/)?dev-runtime\/snapshots\//;function isDevelopmentRuntimeSnapshotRoot(e){return DEVELOPMENT_RUNTIME_SNAPSHOT_SEGMENT.test(e.replaceAll(`\\`,`/`))}function normalizeCompiledArtifactsSource(e){return e.kind!==`disk`||e.moduleMapLoaderPath!==void 0||!isDevelopmentRuntimeSnapshotRoot(e.appRoot)?e:{...e,moduleMapLoaderPath:resolvePackageSourceFilePath(`src/internal/authored-module-map-loader.ts`)}}async function loadFullBundle(e){let t=normalizeCompiledArtifactsSource(e),[n,r]=await Promise.all([loadCompiledManifest({compiledArtifactsSource:t}),loadRuntimeCompiledModuleMap(t)]),i=await resolveRuntimeAgentGraph({manifest:n,moduleMap:r}),a=i.root;return{adapterRegistry:createRuntimeAdapterRegistry({channels:collectResolvedChannels(i)}),compiledArtifactsSource:t,graph:i,moduleMap:r,resolvedAgent:a.agent,subagentRegistry:a.subagentRegistry,toolRegistry:a.toolRegistry,turnAgent:a.turnAgent}}async function loadRuntimeCompiledModuleMap(e){return e.kind===`disk`&&e.moduleMapLoaderPath!==void 0?await loadAuthoredSourceCompiledModuleMap(e):await loadCompiledModuleMap({compiledArtifactsSource:e})}async function loadAuthoredSourceCompiledModuleMap(e){if(e.moduleMapLoaderPath===void 0)throw Error(`Authored-source module map loading requires "moduleMapLoaderPath" in the compiled artifacts source.`);return await(await import(pathToFileURL(e.moduleMapLoaderPath).href)).loadCompiledModuleMapFromAuthoredSource({compiledArtifactsSource:e})}async function getOrLoadFullBundle(e){let t=normalizeCompiledArtifactsSource(e);if(isCacheDisabled)return loadFullBundle(t);let n=getActiveRuntimeSession(),r=getRuntimeCompiledArtifactsCacheKey(t),i=await resolveRuntimeCompiledArtifactsVersionedCacheKey(t),a=n.bundleCacheKeyBySourceKey.get(r);a!==void 0&&a!==i&&n.bundleCache.delete(a),n.bundleCacheKeyBySourceKey.set(r,i);let o=n.bundleCache.get(i);if(o!==void 0)return o;let s=loadFullBundle(t).catch(e=>{throw n.bundleCache.delete(i),n.bundleCacheKeyBySourceKey.get(r)===i&&n.bundleCacheKeyBySourceKey.delete(r),e});return n.bundleCache.set(i,s),s}async function getCompiledRuntimeAgentBundle(e){let t=await getOrLoadFullBundle(e.compiledArtifactsSource);if(e.nodeId===void 0)return t;let n=getResolvedRuntimeAgentNode(t.graph,e.nodeId);return{adapterRegistry:t.adapterRegistry,compiledArtifactsSource:t.compiledArtifactsSource,graph:{nodesByNodeId:t.graph.nodesByNodeId,root:n},moduleMap:t.moduleMap,nodeId:e.nodeId,resolvedAgent:n.agent,subagentRegistry:n.subagentRegistry,toolRegistry:n.toolRegistry,turnAgent:n.turnAgent}}function clearCompiledRuntimeAgentBundleCache(){let e=getActiveRuntimeSession();e.bundleCache.clear(),e.bundleCacheKeyBySourceKey.clear()}function collectResolvedChannels(e){let t=new Map;for(let n of e.nodesByNodeId.values())for(let e of n.channels)t.set(`${e.sourceId}:${e.name}`,e);return[...t.values()]}export{clearCompiledRuntimeAgentBundleCache,getCompiledRuntimeAgentBundle};
1
+ import{resolveRuntimeCompiledArtifactsVersionedCacheKey}from"#runtime/cache-key.js";import{getRuntimeCompiledArtifactsCacheKey}from"#runtime/compiled-artifacts-source.js";import{loadCompiledManifest}from"#runtime/loaders/manifest.js";import{getActiveRuntimeSession}from"#runtime/sessions/runtime-session.js";import{resolvePackageSourceFilePath}from"#internal/application/package.js";import{pathToFileURL}from"node:url";import{getResolvedRuntimeAgentNode}from"#runtime/graph.js";import{resolveRuntimeAgentGraph}from"#runtime/resolve-agent-graph.js";import{createRuntimeAdapterRegistry}from"#runtime/channels/registry.js";import{loadModelMetadata}from"#runtime/loaders/model-metadata.js";import{loadCompiledModuleMap}from"#runtime/loaders/module-map.js";const isCacheDisabled=process.env.EVE_DISABLE_AGENT_CACHE===`1`,DEVELOPMENT_RUNTIME_SNAPSHOT_SEGMENT=/\/\.eve\/(?:eval-servers\/[^/]+\/)?dev-runtime\/snapshots\//;function isDevelopmentRuntimeSnapshotRoot(e){return DEVELOPMENT_RUNTIME_SNAPSHOT_SEGMENT.test(e.replaceAll(`\\`,`/`))}function normalizeCompiledArtifactsSource(e){return e.kind!==`disk`||e.moduleMapLoaderPath!==void 0||!isDevelopmentRuntimeSnapshotRoot(e.appRoot)?e:{...e,moduleMapLoaderPath:resolvePackageSourceFilePath(`src/internal/authored-module-map-loader.ts`)}}async function loadFullBundle(e){let t=normalizeCompiledArtifactsSource(e),[n,r]=await Promise.all([loadCompiledManifest({compiledArtifactsSource:t}),loadRuntimeCompiledModuleMap(t)]),i=await resolveRuntimeAgentGraph({manifest:n,moduleMap:r}),a=i.root,o;return{adapterRegistry:createRuntimeAdapterRegistry({channels:collectResolvedChannels(i)}),compiledArtifactsSource:t,graph:i,modelMetadata:()=>(o??=loadModelMetadata(t).catch(e=>{throw o=void 0,e}),o),moduleMap:r,resolvedAgent:a.agent,subagentRegistry:a.subagentRegistry,toolRegistry:a.toolRegistry,turnAgent:a.turnAgent}}async function loadRuntimeCompiledModuleMap(e){return e.kind===`disk`&&e.moduleMapLoaderPath!==void 0?await loadAuthoredSourceCompiledModuleMap(e):await loadCompiledModuleMap({compiledArtifactsSource:e})}async function loadAuthoredSourceCompiledModuleMap(e){if(e.moduleMapLoaderPath===void 0)throw Error(`Authored-source module map loading requires "moduleMapLoaderPath" in the compiled artifacts source.`);return await(await import(pathToFileURL(e.moduleMapLoaderPath).href)).loadCompiledModuleMapFromAuthoredSource({compiledArtifactsSource:e})}async function getOrLoadFullBundle(e){let t=normalizeCompiledArtifactsSource(e);if(isCacheDisabled)return loadFullBundle(t);let n=getActiveRuntimeSession(),r=getRuntimeCompiledArtifactsCacheKey(t),i=await resolveRuntimeCompiledArtifactsVersionedCacheKey(t),a=n.bundleCacheKeyBySourceKey.get(r);a!==void 0&&a!==i&&n.bundleCache.delete(a),n.bundleCacheKeyBySourceKey.set(r,i);let o=n.bundleCache.get(i);if(o!==void 0)return o;let s=loadFullBundle(t).catch(e=>{throw n.bundleCache.delete(i),n.bundleCacheKeyBySourceKey.get(r)===i&&n.bundleCacheKeyBySourceKey.delete(r),e});return n.bundleCache.set(i,s),s}async function getCompiledRuntimeAgentBundle(e){let t=await getOrLoadFullBundle(e.compiledArtifactsSource);if(e.nodeId===void 0)return t;let n=getResolvedRuntimeAgentNode(t.graph,e.nodeId);return{adapterRegistry:t.adapterRegistry,compiledArtifactsSource:t.compiledArtifactsSource,graph:{nodesByNodeId:t.graph.nodesByNodeId,root:n},modelMetadata:t.modelMetadata,moduleMap:t.moduleMap,nodeId:e.nodeId,resolvedAgent:n.agent,subagentRegistry:n.subagentRegistry,toolRegistry:n.toolRegistry,turnAgent:n.turnAgent}}function clearCompiledRuntimeAgentBundleCache(){let e=getActiveRuntimeSession();e.bundleCache.clear(),e.bundleCacheKeyBySourceKey.clear()}function collectResolvedChannels(e){let t=new Map;for(let n of e.nodesByNodeId.values())for(let e of n.channels)t.set(`${e.sourceId}:${e.name}`,e);return[...t.values()]}export{clearCompiledRuntimeAgentBundleCache,getCompiledRuntimeAgentBundle};
@@ -1,6 +1,6 @@
1
1
  import type { ContextAccessor } from "#context/key.js";
2
2
  import type { RuntimeModelReference } from "#runtime/agent/bootstrap.js";
3
- import type { RuntimeModelCatalog } from "#runtime/agent/model-catalog.js";
3
+ import type { ModelMetadata } from "#internal/model-catalog.js";
4
4
  import { type AgentLimitsDefinition, type AgentReasoningDefinition, type AgentToolExposure } from "#shared/agent-definition.js";
5
5
  export interface DynamicSubagentAgentConfig {
6
6
  readonly compaction?: {
@@ -16,7 +16,7 @@ export interface DynamicSubagentAgentConfig {
16
16
  }
17
17
  export type DynamicSubagentModelReference = RuntimeModelReference;
18
18
  export declare function normalizeDynamicSubagentAgentConfig(input: {
19
- readonly catalog?: RuntimeModelCatalog;
19
+ readonly modelMetadata: () => Promise<ModelMetadata>;
20
20
  readonly name: string;
21
21
  readonly state: ContextAccessor;
22
22
  readonly value: unknown;
@@ -1 +1 @@
1
- import{isDynamicModelDefinition}from"#shared/agent-definition.js";import{normalizeAgentDefinition}from"#internal/authored-definition/core.js";import{resolveRuntimeModelSelection}from"#runtime/agent/resolve-model.js";import{getEffectiveModelSelection}from"#reactions/kinds/model.js";async function normalizeDynamicSubagentAgentConfig(e){let t=`Dynamic subagent "${e.name}" must return defineAgent(...), defineRemoteAgent(...), or null.`,n=normalizeAgentDefinition(e.value,t);if(!n.description)throw Error(`${t} The "description" field is required.`);if(n.build!==void 0)throw Error(`${t} The "build" field cannot be selected at runtime. Declare packaging configuration such as build.externalDependencies on the root agent in agent/agent.ts.`);if(n.defaultTools!==void 0)throw Error(`${t} The "defaultTools" field cannot be selected at runtime.`);if(n.experimental!==void 0)throw Error(`${t} The "experimental" field cannot be selected at runtime.`);if(isDynamicModelDefinition(n.model))throw Error(`${t} The returned "model" must be static.`);if(n.limits?.sessionUsage!==void 0)throw Error(`${t} The "limits.sessionUsage" field cannot be selected at runtime; the root agent's \`sessionUsage\` applies.`);let r={description:n.description,model:await normalizeDurableModelSelection({catalog:e.catalog,selection:{model:n.model,modelContextWindowTokens:n.modelContextWindowTokens??parentContextWindow(e.state,n.model),modelOptions:n.modelOptions},state:e.state})};if(n.compaction!==void 0){let t={};n.compaction.model!==void 0&&(t.model=await normalizeDurableModelSelection({catalog:e.catalog,selection:{model:n.compaction.model,modelContextWindowTokens:n.compaction.modelContextWindowTokens,modelOptions:n.modelOptions},state:e.state})),n.compaction.thresholdPercent!==void 0&&(t.thresholdPercent=n.compaction.thresholdPercent),r.compaction=t}return n.limits!==void 0&&(r.limits=n.limits),n.reasoning!==void 0&&(r.reasoning=n.reasoning),n.tool!==void 0&&(r.tool=n.tool),r}async function normalizeDurableModelSelection(e){return(await resolveRuntimeModelSelection({catalog:e.catalog,durability:`durable`,selection:e.selection,state:e.state})).reference}function parentContextWindow(e,t){if(typeof t!=`string`)return;let n=getEffectiveModelSelection(e)?.reference;return n?.id===t?n.contextWindowTokens:void 0}export{normalizeDynamicSubagentAgentConfig};
1
+ import{isDynamicModelDefinition}from"#shared/agent-definition.js";import{normalizeAgentDefinition}from"#internal/authored-definition/core.js";import{resolveRuntimeModelSelection}from"#runtime/agent/resolve-model.js";import{getEffectiveModelSelection}from"#reactions/kinds/model.js";async function normalizeDynamicSubagentAgentConfig(e){let t=`Dynamic subagent "${e.name}" must return defineAgent(...), defineRemoteAgent(...), or null.`,n=normalizeAgentDefinition(e.value,t);if(!n.description)throw Error(`${t} The "description" field is required.`);if(n.build!==void 0)throw Error(`${t} The "build" field cannot be selected at runtime. Declare packaging configuration such as build.externalDependencies on the root agent in agent/agent.ts.`);if(n.defaultTools!==void 0)throw Error(`${t} The "defaultTools" field cannot be selected at runtime.`);if(n.experimental!==void 0)throw Error(`${t} The "experimental" field cannot be selected at runtime.`);if(isDynamicModelDefinition(n.model))throw Error(`${t} The returned "model" must be static.`);if(n.limits?.sessionUsage!==void 0)throw Error(`${t} The "limits.sessionUsage" field cannot be selected at runtime; the root agent's \`sessionUsage\` applies.`);let r={description:n.description,model:await normalizeDurableModelSelection({modelMetadata:e.modelMetadata,selection:{model:n.model,modelContextWindowTokens:n.modelContextWindowTokens??parentContextWindow(e.state,n.model),modelOptions:n.modelOptions}})};if(n.compaction!==void 0){let t={};n.compaction.model!==void 0&&(t.model=await normalizeDurableModelSelection({modelMetadata:e.modelMetadata,selection:{model:n.compaction.model,modelContextWindowTokens:n.compaction.modelContextWindowTokens,modelOptions:n.modelOptions}})),n.compaction.thresholdPercent!==void 0&&(t.thresholdPercent=n.compaction.thresholdPercent),r.compaction=t}return n.limits!==void 0&&(r.limits=n.limits),n.reasoning!==void 0&&(r.reasoning=n.reasoning),n.tool!==void 0&&(r.tool=n.tool),r}async function normalizeDurableModelSelection(e){return(await resolveRuntimeModelSelection({durability:`durable`,modelMetadata:e.modelMetadata,selection:e.selection})).reference}function parentContextWindow(e,t){if(typeof t!=`string`)return;let n=getEffectiveModelSelection(e)?.reference;return n?.id===t?n.contextWindowTokens:void 0}export{normalizeDynamicSubagentAgentConfig};
@@ -1 +1 @@
1
- async function agentToolServeWorkflow(e,t){"use workflow";let n=t.agent(t.toolName),r=sendToAgent(n,await e()),i=e();for(;;){let a=await nextCallOrResult(i,r);if(a.kind===`call`){r=await forwardCall(n,r,a.call),i=e();continue}if(!r.signal.aborted){if(a.result.status===`failed`)throw Error(`The agent's turn failed: ${a.result.error.message}\nThis task has ended; to retry, call ${t.toolName} without taskId.`);let o=e();if(o!==i){r=sendToAgent(n,await i),i=o;continue}t.reply(a.result.reply??``)}r=sendToAgent(n,await i),i=e()}}async function agentWithModelServeWorkflow(e,t){"use workflow";let n=await e(),r=n.input.model.trim();if(r===``)throw TypeError(`agent model must not be empty.`);let i=t.agent(`agent`,{model:r}),a=sendToModelAgent(i,n,r),o=e();for(;;){let n=await nextModelCallOrResult(o,a);if(n.kind===`call`){a=await forwardModelCall(i,a,n.call,r),o=e();continue}if(!a.signal.aborted){if(n.result.status===`failed`)throw Error(`The agent's turn failed: ${n.result.error.message}\nThis task has ended; to retry, call ${t.toolName} without taskId.`);let s=e();if(s!==o){a=sendToModelAgent(i,await o,r),o=s;continue}t.reply(n.result.reply??``)}a=sendToModelAgent(i,await o,r),o=e()}}function sendToAgent(e,t){return{result:e.send(t.input.message,{signal:t.abortSignal}).then(e=>e.result()),signal:t.abortSignal}}function sendToModelAgent(e,t,n){if(t.input.model!==n)throw Error(`An agent task keeps the model it started with. This task has ended; start a new task to use another model.`);return{result:e.send(t.input.message,{signal:t.abortSignal}).then(e=>e.result()),signal:t.abortSignal}}async function nextCallOrResult(e,t){return await Promise.race([t.result.then(e=>({kind:`result`,result:e})),e.then(e=>({call:e,kind:`call`}))])}async function nextModelCallOrResult(e,t){return await Promise.race([t.result.then(e=>({kind:`result`,result:e})),e.then(e=>({call:e,kind:`call`}))])}async function forwardCall(e,t,n){return t.signal.aborted&&await t.result.catch(()=>void 0),sendToAgent(e,n)}async function forwardModelCall(e,t,n,r){return t.signal.aborted&&await t.result.catch(()=>void 0),sendToModelAgent(e,n,r)}agentToolServeWorkflow.workflowId=`workflow//eve//agentToolServeWorkflow`,agentWithModelServeWorkflow.workflowId=`workflow//eve@0.84.0//agentWithModelServeWorkflow`;export{agentToolServeWorkflow,agentWithModelServeWorkflow};
1
+ async function agentToolServeWorkflow(e,t){"use workflow";let n=t.agent(t.toolName),r=sendToAgent(n,await e()),i=e();for(;;){let a=await nextCallOrResult(i,r);if(a.kind===`call`){r=await forwardCall(n,r,a.call),i=e();continue}if(!r.signal.aborted){if(a.result.status===`failed`)throw Error(`The agent's turn failed: ${a.result.error.message}\nThis task has ended; to retry, call ${t.toolName} without taskId.`);let o=e();if(o!==i){r=sendToAgent(n,await i),i=o;continue}t.reply(a.result.reply??``)}r=sendToAgent(n,await i),i=e()}}async function agentWithModelServeWorkflow(e,t){"use workflow";let n=await e(),r=n.input.model.trim();if(r===``)throw TypeError(`agent model must not be empty.`);let i=t.agent(`agent`,{model:r}),a=sendToModelAgent(i,n,r),o=e();for(;;){let n=await nextModelCallOrResult(o,a);if(n.kind===`call`){a=await forwardModelCall(i,a,n.call,r),o=e();continue}if(!a.signal.aborted){if(n.result.status===`failed`)throw Error(`The agent's turn failed: ${n.result.error.message}\nThis task has ended; to retry, call ${t.toolName} without taskId.`);let s=e();if(s!==o){a=sendToModelAgent(i,await o,r),o=s;continue}t.reply(n.result.reply??``)}a=sendToModelAgent(i,await o,r),o=e()}}function sendToAgent(e,t){return{result:e.send(t.input.message,{signal:t.abortSignal}).then(e=>e.result()),signal:t.abortSignal}}function sendToModelAgent(e,t,n){if(t.input.model!==n)throw Error(`An agent task keeps the model it started with. This task has ended; start a new task to use another model.`);return{result:e.send(t.input.message,{signal:t.abortSignal}).then(e=>e.result()),signal:t.abortSignal}}async function nextCallOrResult(e,t){return await Promise.race([t.result.then(e=>({kind:`result`,result:e})),e.then(e=>({call:e,kind:`call`}))])}async function nextModelCallOrResult(e,t){return await Promise.race([t.result.then(e=>({kind:`result`,result:e})),e.then(e=>({call:e,kind:`call`}))])}async function forwardCall(e,t,n){return t.signal.aborted&&await t.result.catch(()=>void 0),sendToAgent(e,n)}async function forwardModelCall(e,t,n,r){return t.signal.aborted&&await t.result.catch(()=>void 0),sendToModelAgent(e,n,r)}agentToolServeWorkflow.workflowId=`workflow//eve//agentToolServeWorkflow`,agentWithModelServeWorkflow.workflowId=`workflow//eve@0.85.0//agentWithModelServeWorkflow`;export{agentToolServeWorkflow,agentWithModelServeWorkflow};
@@ -23,9 +23,11 @@ export interface SandboxConnection<Extensions extends object = {}> {
23
23
  * Runs `command` as a Bash login-shell script (`bash -lc`) in
24
24
  * `workingDirectory`, with the sandbox's environment plus `env`. `env`
25
25
  * holds only the per-call variables. Aborting kills the process tree.
26
+ * With `stdin`, return a process with a writable `stdin` or throw.
26
27
  */
27
28
  spawn(options: {
28
29
  readonly signal?: AbortSignal;
30
+ readonly stdin?: boolean;
29
31
  readonly command: string;
30
32
  readonly env: Readonly<Record<string, string>>;
31
33
  readonly workingDirectory: string;
@@ -1 +1 @@
1
- import{readFile}from"node:fs/promises";import{join}from"node:path";import{resolveDiscoveryProject}from"#discover/project.js";import pc from"#compiled/picocolors/index.js";import{parseModelHelper}from"#shared/model-helper.js";import{discoverAgent}from"#discover/discover-agent.js";import{formatLanguageModelGatewayId}from"#internal/runtime-model.js";import{CHATGPT_MODEL_SELECTION_PREFIX}from"#shared/chatgpt-model.js";import{createCompiledRuntimeModelCatalogLoader}from"#compiler/model-catalog.js";import{readModelSelectionFromSource}from"#source-change/apply-model-selection.js";import{createStaticSourceChange}from"#source-change/static-source-change.js";function formatApplyModelSettingsOutcome(e){return e.kind===`rejected`?e.message:e.kind===`unchanged`?`Model settings are already up to date.`:e.changed.length===1&&e.changed[0]===`model`&&e.model!==void 0?`Model changed to ${pc.bold(e.model)}. Live on your next prompt.`:`Model settings updated: ${e.changed.map(t=>t===`model`?`model ${e.model??`updated`}`:t===`reasoning`?`reasoning ${e.reasoning??`provider default`}`:`Fast mode ${e.fastMode?`on`:`off`}`).join(`, `)}. Live on your next prompt.`}async function changeAgentModelSettings(e){let{appRoot:t,patch:n}=e;if(n.model.kind===`set`){let e=await validateModelSlug(t,n.model.value);if(e!==null)return{kind:`rejected`,message:e}}let r=await resolveDiscoveryProject(t),{manifest:i}=await discoverAgent(r),a=await createStaticSourceChange(i).updateModelSettings(n);if(a.kind===`bail`)return{kind:`rejected`,message:`Couldn't edit ${a.at.logicalPath}: ${a.reason}. Change the model settings by hand.`};if(a.changed.length===0)return{kind:`unchanged`};let o={kind:`changed`,changed:a.changed};return n.model.kind===`set`&&(o.model=n.model.value),n.reasoning.kind!==`keep`&&(o.reasoning=n.reasoning.kind===`set`?n.reasoning.value:null),n.gatewayServiceTier.kind!==`keep`&&(o.fastMode=n.gatewayServiceTier.kind===`set`),o}async function changeAgentModel(e){let{appRoot:t,slug:n}=e,r=await validateModelSlug(t,n);return r===null?changeValidatedAgentModel(e):{kind:`rejected`,message:r}}async function changeValidatedAgentModel(e){let{appRoot:t,slug:n}=e,r=await resolveDiscoveryProject(t),{manifest:i}=await discoverAgent(r),a=await createStaticSourceChange(i).updateModelName(n);return a.kind===`bail`?{kind:`rejected`,message:`Couldn't edit ${a.at.logicalPath}: ${a.reason}. Change \`model\` by hand.`}:a.from===a.to?{kind:`unchanged`,model:a.to}:{kind:`changed`,to:a.to}}async function validateModelSlug(e,t){if(parseModelHelper(t)!==void 0)return null;if(t.startsWith(CHATGPT_MODEL_SELECTION_PREFIX))return"Choose a bare OpenAI model id after `chatgpt/`.";if(!t.includes(`/`))return`\`${t}\` isn't a provider/model id (e.g. anthropic/claude-sonnet-5).`;let n=createCompiledRuntimeModelCatalogLoader(e);try{if(await n.getModelLimits(formatLanguageModelGatewayId(t))===null)return`I couldn't confirm \`${t}\` in the AI Gateway model catalog, so I didn't change agent.ts.`}catch{return null}return null}async function readAuthoredModelSelection(e){let t=await resolveDiscoveryProject(e),{manifest:n}=await discoverAgent(t);if(!n.configModule)return;let r=await readFile(join(t.agentRoot,n.configModule.logicalPath),`utf8`);return readModelSelectionFromSource(r)}export{changeAgentModel,changeAgentModelSettings,changeValidatedAgentModel,formatApplyModelSettingsOutcome,readAuthoredModelSelection,validateModelSlug};
1
+ import{readFile}from"node:fs/promises";import{join}from"node:path";import{resolveDiscoveryProject}from"#discover/project.js";import pc from"#compiled/picocolors/index.js";import{parseModelHelper}from"#shared/model-helper.js";import{createCompiledRuntimeModelCatalogLoader}from"#compiler/model-catalog.js";import{discoverAgent}from"#discover/discover-agent.js";import{formatLanguageModelGatewayId}from"#internal/runtime-model.js";import{CHATGPT_MODEL_SELECTION_PREFIX}from"#shared/chatgpt-model.js";import{readModelSelectionFromSource}from"#source-change/apply-model-selection.js";import{createStaticSourceChange}from"#source-change/static-source-change.js";function formatApplyModelSettingsOutcome(e){return e.kind===`rejected`?e.message:e.kind===`unchanged`?`Model settings are already up to date.`:e.changed.length===1&&e.changed[0]===`model`&&e.model!==void 0?`Model changed to ${pc.bold(e.model)}. Live on your next prompt.`:`Model settings updated: ${e.changed.map(t=>t===`model`?`model ${e.model??`updated`}`:t===`reasoning`?`reasoning ${e.reasoning??`provider default`}`:`Fast mode ${e.fastMode?`on`:`off`}`).join(`, `)}. Live on your next prompt.`}async function changeAgentModelSettings(e){let{appRoot:t,patch:n}=e;if(n.model.kind===`set`){let e=await validateModelSlug(t,n.model.value);if(e!==null)return{kind:`rejected`,message:e}}let r=await resolveDiscoveryProject(t),{manifest:i}=await discoverAgent(r),a=await createStaticSourceChange(i).updateModelSettings(n);if(a.kind===`bail`)return{kind:`rejected`,message:`Couldn't edit ${a.at.logicalPath}: ${a.reason}. Change the model settings by hand.`};if(a.changed.length===0)return{kind:`unchanged`};let o={kind:`changed`,changed:a.changed};return n.model.kind===`set`&&(o.model=n.model.value),n.reasoning.kind!==`keep`&&(o.reasoning=n.reasoning.kind===`set`?n.reasoning.value:null),n.gatewayServiceTier.kind!==`keep`&&(o.fastMode=n.gatewayServiceTier.kind===`set`),o}async function changeAgentModel(e){let{appRoot:t,slug:n}=e,r=await validateModelSlug(t,n);return r===null?changeValidatedAgentModel(e):{kind:`rejected`,message:r}}async function changeValidatedAgentModel(e){let{appRoot:t,slug:n}=e,r=await resolveDiscoveryProject(t),{manifest:i}=await discoverAgent(r),a=await createStaticSourceChange(i).updateModelName(n);return a.kind===`bail`?{kind:`rejected`,message:`Couldn't edit ${a.at.logicalPath}: ${a.reason}. Change \`model\` by hand.`}:a.from===a.to?{kind:`unchanged`,model:a.to}:{kind:`changed`,to:a.to}}async function validateModelSlug(e,t){if(parseModelHelper(t)!==void 0)return null;if(t.startsWith(CHATGPT_MODEL_SELECTION_PREFIX))return"Choose a bare OpenAI model id after `chatgpt/`.";if(!t.includes(`/`))return`\`${t}\` isn't a provider/model id (e.g. anthropic/claude-sonnet-5).`;let n=createCompiledRuntimeModelCatalogLoader(e);try{if(await n.getModelLimits(formatLanguageModelGatewayId(t))===null)return`I couldn't confirm \`${t}\` in the AI Gateway model catalog, so I didn't change agent.ts.`}catch{return null}return null}async function readAuthoredModelSelection(e){let t=await resolveDiscoveryProject(e),{manifest:n}=await discoverAgent(t);if(!n.configModule)return;let r=await readFile(join(t.agentRoot,n.configModule.logicalPath),`utf8`);return readModelSelectionFromSource(r)}export{changeAgentModel,changeAgentModelSettings,changeValidatedAgentModel,formatApplyModelSettingsOutcome,readAuthoredModelSelection,validateModelSlug};
@@ -5,7 +5,7 @@ export { type AnySetupBox, runHeadless, runInteractive, type RunnerOptions, type
5
5
  export { createPrompter, type MultiSelectOptions, type NoteTone, type Prompter, type PrompterValue, type SelectCommonOptions, type SelectOption, type SingleSelectOptions, } from "./prompter.js";
6
6
  export { createHeadlessPrompter, formatHeadlessEvent, type HeadlessEvent, type HeadlessLogSink, type HeadlessNextStep, HeadlessPromptError, } from "./headless.js";
7
7
  export { createPromptCommandOutput, type PromptCommandLog } from "./cli/index.js";
8
- export { getPackageManagerStrategy, runPackageManagerInstall, runPnpmInstall, runVercel, spawnPackageManager, spawnPnpm, type PackageManagerStrategy, type RunPackageManagerOptions, type RunPnpmOptions, type RunVercelOptions, } from "./primitives/index.js";
8
+ export { getPackageManagerStrategy, runPackageManagerInstall, runPnpmInstall, runVercel, spawnPackageManager, spawnPnpm, type PackageManagerStrategy, type RunPackageManagerOptions, type RunVercelOptions, } from "./primitives/index.js";
9
9
  export { detectDeployment, detectProjectResolution, projectProductionUrlFromResolution, type DeploymentInfo, type DeploymentState, type ProjectResolution, } from "./project-resolution.js";
10
10
  export { runVercelEnvPull } from "./run-vercel-link.js";
11
11
  export { inspectSlackbotConnectors, provisionSlackbot, reconcileSlackUid, type ProvisionSlackbotResult, type SlackbotConnectorInspection, type SlackConnectorCandidate, type SlackConnectorSelection, } from "./slackbot.js";
@@ -1,4 +1,4 @@
1
- export { eveDevArguments, packageManagerInstallFailureMessage, packageManagerInstallSucceeded, runPackageManagerInstall, runPnpmInstall, spawnPackageManager, spawnPnpm, type PackageManagerInstallResult, type RunInstallOptions, type RunPackageManagerOptions, type RunPnpmOptions, } from "./pm/run.js";
1
+ export { eveDevArguments, packageManagerInstallFailureMessage, packageManagerInstallSucceeded, runPackageManagerInstall, runPnpmInstall, spawnPackageManager, spawnPnpm, type PackageManagerInstallResult, type RunInstallOptions, type RunPackageManagerOptions, } from "./pm/run.js";
2
2
  export { resultSucceeded, type PackageManagerProcessResult, type PackageManagerProcessTermination, } from "./pm/process-result.js";
3
3
  export { getPackageManagerStrategy, type PackageManagerConfigurationResult, type PackageManagerInvocation, type PackageManagerStrategy, } from "./pm/index.js";
4
4
  export { captureVercel, runVercel, type RunVercelOptions, type VercelCaptureFailure, type VercelCaptureResult, } from "./run-vercel.js";
@@ -13,8 +13,6 @@ export interface RunPackageManagerOptions {
13
13
  /** Closes stdin so the child cannot contend with a parent-owned TUI. */
14
14
  nonInteractive?: boolean;
15
15
  }
16
- /** @deprecated Use {@link RunPackageManagerOptions}. */
17
- export type RunPnpmOptions = RunPackageManagerOptions;
18
16
  /** Runs one package-manager command and returns its complete process evidence. */
19
17
  export declare function spawnPackageManager(kind: PackageManagerKind, projectRoot: string, args: readonly string[], options?: RunPackageManagerOptions): Promise<PackageManagerProcessResult>;
20
18
  export interface RunInstallOptions extends RunPackageManagerOptions, PackageManagerInstallOptions {
@@ -1,4 +1,4 @@
1
- import{pinnedNodeEngineMajor}from"../../node-engine.js";import{parseChatGptModelSelection}from"../../../shared/chatgpt-model.js";import{SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS}from"../update/module-files.js";import{pathExists,writeTextFile}from"../files.js";import{blockingCreateInPlaceEntries}from"../create-in-place.js";import{DEFAULT_CONNECT_PACKAGE_VERSION,resolveVersionToken}from"../version-tokens.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.js";import{WEB_CHANNEL_TEMPLATES}from"./web-template.js";import{AGENT_INSTRUCTIONS_TEMPLATE}from"./instructions-template.js";import{SCAFFOLDED_AGENT_PATHS}from"./agent-paths.js";import{mkdir,readdir,stat}from"node:fs/promises";import{basename,join,resolve}from"node:path";const CURRENT_DIRECTORY_PROJECT_NAME=`.`,DEFAULT_AI_PACKAGE_VERSION=`^7.0.137`,DEFAULT_ZOD_PACKAGE_VERSION=`4.5.4`,DEFAULT_EVE_PACKAGE_CONTRACT={version:`0.84.0`,nodeEngine:`>=24`};function resolveEvePackageContract(e=DEFAULT_EVE_PACKAGE_CONTRACT){return{version:resolveVersionToken(`evePackage.version`,e.version),nodeEngine:resolveVersionToken(`evePackage.nodeEngine`,e.nodeEngine)}}function modelProviderSlug(e){let t=(e.split(`/`)[0]??``).replaceAll(/[^A-Za-z0-9._-]/gu,``);return t.length>0?t:`anthropic`}function byokProviderEnvVar(e){let t=modelProviderSlug(e).toUpperCase().replaceAll(/[^A-Z0-9]/gu,`_`);return`${/^[0-9]/.test(t)?`_`:``}${t}_API_KEY`}function agentTemplateFiles(e,t){return{[SCAFFOLDED_AGENT_PATHS.config]:renderAgentTemplate(e,t),[SCAFFOLDED_AGENT_PATHS.channel]:WEB_CHANNEL_TEMPLATES.default,[SCAFFOLDED_AGENT_PATHS.instructions]:AGENT_INSTRUCTIONS_TEMPLATE}}function renderAgentTemplate(e,t){let n=parseChatGptModelSelection(e);return n===void 0?BASE_AGENT_TEMPLATE.replaceAll(`__EVE_INIT_MODEL__`,e).replaceAll(`__EVE_INIT_REASONING__`,reasoningTemplateLine(t)):`import { defineAgent } from "eve";\nimport { chatgpt } from "eve/models/openai";\n\nexport default defineAgent({\n model: chatgpt(${JSON.stringify(n)}),\n${reasoningTemplateLine(t)}});\n`}function reasoningTemplateLine(e){return e===void 0||e===`provider-default`?``:` reasoning: "${e}",\n`}function renderTemplate(e,t){return e===BASE_AGENT_TEMPLATE&&parseChatGptModelSelection(t.model)!==void 0?renderAgentTemplate(t.model,t.reasoning):e.replaceAll(`__EVE_INIT_APP_NAME__`,t.appName).replaceAll(`__EVE_INIT_MODEL__`,t.model).replaceAll(`__EVE_INIT_REASONING__`,reasoningTemplateLine(t.reasoning)).replaceAll(`__EVE_INIT_BYOK_PROVIDER__`,modelProviderSlug(t.model)).replaceAll(`__EVE_INIT_BYOK_ENV_VAR__`,byokProviderEnvVar(t.model)).replaceAll(`__EVE_INIT_PACKAGE_VERSION__`,formatEveDependencySpecifier(t.eveVersion)).replaceAll(`__EVE_INIT_AI_SDK_VERSION__`,t.aiPackageVersion).replaceAll(`__EVE_INIT_CONNECT_VERSION__`,t.connectPackageVersion).replaceAll(`__EVE_INIT_ZOD_VERSION__`,t.zodPackageVersion).replaceAll(`__EVE_INIT_TYPESCRIPT_VERSION__`,t.typescriptPackageVersion).replaceAll(`__EVE_INIT_TYPES_NODE_VERSION__`,t.nodeTypesVersion).replaceAll(`__EVE_INIT_NODE_ENGINE__`,t.nodeEngine)}function formatEveDependencySpecifier(e){return/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z-.]+)?$/.test(e)?`^${e}`:e}const BASE_AGENT_TEMPLATE=`import { defineAgent } from "eve";
1
+ import{pinnedNodeEngineMajor}from"../../node-engine.js";import{parseChatGptModelSelection}from"../../../shared/chatgpt-model.js";import{SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS}from"../update/module-files.js";import{pathExists,writeTextFile}from"../files.js";import{blockingCreateInPlaceEntries}from"../create-in-place.js";import{DEFAULT_CONNECT_PACKAGE_VERSION,resolveVersionToken}from"../version-tokens.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.js";import{WEB_CHANNEL_TEMPLATES}from"./web-template.js";import{AGENT_INSTRUCTIONS_TEMPLATE}from"./instructions-template.js";import{SCAFFOLDED_AGENT_PATHS}from"./agent-paths.js";import{mkdir,readdir,stat}from"node:fs/promises";import{basename,join,resolve}from"node:path";const CURRENT_DIRECTORY_PROJECT_NAME=`.`,DEFAULT_AI_PACKAGE_VERSION=`^7.0.137`,DEFAULT_ZOD_PACKAGE_VERSION=`4.5.4`,DEFAULT_EVE_PACKAGE_CONTRACT={version:`0.85.0`,nodeEngine:`>=24`};function resolveEvePackageContract(e=DEFAULT_EVE_PACKAGE_CONTRACT){return{version:resolveVersionToken(`evePackage.version`,e.version),nodeEngine:resolveVersionToken(`evePackage.nodeEngine`,e.nodeEngine)}}function modelProviderSlug(e){let t=(e.split(`/`)[0]??``).replaceAll(/[^A-Za-z0-9._-]/gu,``);return t.length>0?t:`anthropic`}function byokProviderEnvVar(e){let t=modelProviderSlug(e).toUpperCase().replaceAll(/[^A-Z0-9]/gu,`_`);return`${/^[0-9]/.test(t)?`_`:``}${t}_API_KEY`}function agentTemplateFiles(e,t){return{[SCAFFOLDED_AGENT_PATHS.config]:renderAgentTemplate(e,t),[SCAFFOLDED_AGENT_PATHS.channel]:WEB_CHANNEL_TEMPLATES.default,[SCAFFOLDED_AGENT_PATHS.instructions]:AGENT_INSTRUCTIONS_TEMPLATE}}function renderAgentTemplate(e,t){let n=parseChatGptModelSelection(e);return n===void 0?BASE_AGENT_TEMPLATE.replaceAll(`__EVE_INIT_MODEL__`,e).replaceAll(`__EVE_INIT_REASONING__`,reasoningTemplateLine(t)):`import { defineAgent } from "eve";\nimport { chatgpt } from "eve/models/openai";\n\nexport default defineAgent({\n model: chatgpt(${JSON.stringify(n)}),\n${reasoningTemplateLine(t)}});\n`}function reasoningTemplateLine(e){return e===void 0||e===`provider-default`?``:` reasoning: "${e}",\n`}function renderTemplate(e,t){return e===BASE_AGENT_TEMPLATE&&parseChatGptModelSelection(t.model)!==void 0?renderAgentTemplate(t.model,t.reasoning):e.replaceAll(`__EVE_INIT_APP_NAME__`,t.appName).replaceAll(`__EVE_INIT_MODEL__`,t.model).replaceAll(`__EVE_INIT_REASONING__`,reasoningTemplateLine(t.reasoning)).replaceAll(`__EVE_INIT_BYOK_PROVIDER__`,modelProviderSlug(t.model)).replaceAll(`__EVE_INIT_BYOK_ENV_VAR__`,byokProviderEnvVar(t.model)).replaceAll(`__EVE_INIT_PACKAGE_VERSION__`,formatEveDependencySpecifier(t.eveVersion)).replaceAll(`__EVE_INIT_AI_SDK_VERSION__`,t.aiPackageVersion).replaceAll(`__EVE_INIT_CONNECT_VERSION__`,t.connectPackageVersion).replaceAll(`__EVE_INIT_ZOD_VERSION__`,t.zodPackageVersion).replaceAll(`__EVE_INIT_TYPESCRIPT_VERSION__`,t.typescriptPackageVersion).replaceAll(`__EVE_INIT_TYPES_NODE_VERSION__`,t.nodeTypesVersion).replaceAll(`__EVE_INIT_NODE_ENGINE__`,t.nodeEngine)}function formatEveDependencySpecifier(e){return/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z-.]+)?$/.test(e)?`^${e}`:e}const BASE_AGENT_TEMPLATE=`import { defineAgent } from "eve";
2
2
 
3
3
  export default defineAgent({
4
4
  model: "__EVE_INIT_MODEL__",
@@ -68,7 +68,6 @@ export type ModelRouting = {
68
68
  export type InternalAgentModelDefinition = {
69
69
  id: string;
70
70
  contextWindowTokens?: number;
71
- maxOutputTokens?: number;
72
71
  source?: ModuleSourceRef;
73
72
  /** Field of the `source` agent config export that holds this model; absent means `model`. */
74
73
  sourceField?: "compaction.model";
@@ -2,9 +2,10 @@ import { type ChannelCors } from "#channel/cors.js";
2
2
  import type { MessageContent } from "#shared/message-content.js";
3
3
  import type { ChannelReceiveContext } from "#channel/channel-operations.js";
4
4
  import type { RouteDefinition } from "#channel/routes.js";
5
+ import type { SessionSendOptions } from "#channel/session.js";
5
6
  import type { ChannelContext } from "#shared/channel-context.js";
6
7
  import type { Delivery } from "#shared/delivery.js";
7
- import type { SessionAuthContext, TurnPolicy } from "#channel/types.js";
8
+ import type { TurnPolicy } from "#channel/types.js";
8
9
  import type { ChannelDelivery, ChannelDeliveryReplacement } from "#shared/channel-delivery.js";
9
10
  import type { UploadPolicyInput } from "#public/channels/upload-policy.js";
10
11
  import type { AudienceContext } from "#shared/conversation-context.js";
@@ -34,11 +35,10 @@ export type FetchFileFunction = (url: string, context?: FetchFileContext) => Pro
34
35
  * Input passed to a channel's `receive` callback when another channel or
35
36
  * schedule proactively routes a message to it.
36
37
  */
37
- export interface GenericReceiveInput<TReceiveTarget = Record<string, unknown>> {
38
+ export type GenericReceiveInput<TReceiveTarget = Record<string, unknown>> = SessionSendOptions & {
38
39
  readonly message: MessageContent;
39
40
  readonly target: Readonly<TReceiveTarget>;
40
- readonly auth: SessionAuthContext | null;
41
- }
41
+ };
42
42
  /**
43
43
  * The object passed to {@link defineChannel}. `routes` is required; `state`
44
44
  * seeds durable adapter state, `context` builds the per-step `ctx.channel`
@@ -16,10 +16,14 @@ export interface SandboxCommandResult {
16
16
  }
17
17
  /** Options for starting a process without waiting for it to exit. */
18
18
  export interface SandboxSpawnOptions extends SandboxRunOptions {
19
+ /** Opens a writable `stdin` on the process. Rejects on providers without stdin support. */
20
+ stdin?: boolean;
19
21
  }
20
22
  /** A running process with byte streams and explicit lifecycle operations. */
21
23
  export interface SandboxProcess {
22
24
  readonly pid?: number;
25
+ /** Present when spawned with `stdin: true`. Closing it sends EOF. */
26
+ readonly stdin?: WritableStream<Uint8Array>;
23
27
  readonly stdout: ReadableStream<Uint8Array>;
24
28
  readonly stderr: ReadableStream<Uint8Array>;
25
29
  wait(): PromiseLike<{
@@ -1 +1 @@
1
- import{createErrorId,createLogger}from"#internal/logging.js";import{ContinuationTokenKey,SessionIdKey,SessionInboxKey}from"#context/keys.js";import{relayedInteractionEvents}from"#harness/interaction-relay.js";import{SUBAGENT_ADAPTER_KIND,isSubagentAdapterState}from"#subagents/adapter-state.js";const log=createLogger(`execution.subagent-adapter`),SUBAGENT_ADAPTER={kind:SUBAGENT_ADAPTER_KIND,async"interaction.opened"(e,t){await relay(e,t)},async"interaction.settled"(e,t){await relay(e,t)},async"response.admitted"(e,t){await relay(e,t)},async"response.settled"(e,t){await relay(e,t)}};async function relay(e,t){let n=t.state;if(!isSubagentAdapterState(n)||t.view===void 0)return;let r=t.ctx.require(SessionIdKey),i=relayedInteractionEvents(t.view,e,r);i.length!==0&&await forwardToParentStep({hookPayload:{callId:n.callId,childSessionId:r,events:i,kind:`subagent-interaction`,subagentName:n.subagentName,...i.some(e=>e.type===`interaction.opened`&&e.data.request.kind!==`sign-in`)&&{route:{childContinuationToken:t.ctx.require(ContinuationTokenKey),...t.ctx.get(SessionInboxKey)!==void 0&&{childSessionInbox:t.ctx.get(SessionInboxKey)},...t.inputSource!==void 0&&{inputSource:t.inputSource}}}},parentContinuationToken:n.parentContinuationToken})}async function forwardToParentStep(e){"use step";try{let{resumeHook:t}=await import(`#internal/workflow/runtime.js`);await t(e.parentContinuationToken,e.hookPayload)}catch(t){throw log.warn(`failed to forward a child's interaction to its parent`,{callId:e.hookPayload.callId,childSessionId:e.hookPayload.childSessionId,errorId:createErrorId(),eventTypes:e.hookPayload.events.map(e=>e.type),parentContinuationToken:e.parentContinuationToken,subagentName:e.hookPayload.subagentName,error:t}),t}}export{SUBAGENT_ADAPTER};
1
+ import{createErrorId,createLogger}from"#internal/logging.js";import{ContinuationTokenKey,SessionIdKey,SessionInboxKey}from"#context/keys.js";import{relayedInteractionEvents}from"#harness/interaction-relay.js";import{formatCapabilityError}from"#internal/capability-error.js";import{SUBAGENT_ADAPTER_KIND,isSubagentAdapterState}from"#subagents/adapter-state.js";const log=createLogger(`execution.subagent-adapter`),SUBAGENT_ADAPTER={kind:SUBAGENT_ADAPTER_KIND,async"interaction.opened"(e,t){await relay(e,t)},async"interaction.settled"(e,t){await relay(e,t)},async"response.admitted"(e,t){await relay(e,t)},async"response.settled"(e,t){await relay(e,t)}};async function relay(e,t){let n=t.state;if(!isSubagentAdapterState(n)||t.view===void 0)return;let r=t.ctx.require(SessionIdKey),i=relayedInteractionEvents(t.view,e,r);i.length!==0&&await forwardToParentStep({hookPayload:{callId:n.callId,childSessionId:r,events:i,kind:`subagent-interaction`,subagentName:n.subagentName,...i.some(e=>e.type===`interaction.opened`&&e.data.request.kind!==`sign-in`)&&{route:{childContinuationToken:t.ctx.require(ContinuationTokenKey),...t.ctx.get(SessionInboxKey)!==void 0&&{childSessionInbox:t.ctx.get(SessionInboxKey)},...t.inputSource!==void 0&&{inputSource:t.inputSource}}}},parentContinuationToken:n.parentContinuationToken})}async function forwardToParentStep(e){"use step";try{let{resumeHook:t}=await import(`#internal/workflow/runtime.js`);await t(e.parentContinuationToken,e.hookPayload)}catch(t){throw log.warn(`failed to forward a child's interaction to its parent`,{callId:e.hookPayload.callId,childSessionId:e.hookPayload.childSessionId,errorId:createErrorId(),eventTypes:e.hookPayload.events.map(e=>e.type),subagentName:e.hookPayload.subagentName,error:formatCapabilityError(t,[e.parentContinuationToken,e.hookPayload.route?.childContinuationToken])}),t}}export{SUBAGENT_ADAPTER};
@@ -1 +1 @@
1
- import{createLogger}from"#internal/logging.js";import{SessionCallbackKey}from"#context/keys.js";import{toErrorMessage}from"#shared/errors.js";import{parseJsonValue}from"#shared/json.js";import{ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{resumeHook}from"#internal/workflow/runtime.js";import{REMOTE_CALLBACK_NOT_PENDING,REMOTE_CALLBACK_NOT_PENDING_MESSAGE}from"#protocol/remote-agent-protocol.js";import{parseSessionCallback}from"#channel/session-callback.js";import{deserializeContext}from"#context/serialize.js";import{postSessionCallbackRequest}from"#execution/session-callback-request.js";import{HookNotFoundError}from"#compiled/@workflow/errors/index.js";import{SUBAGENT_ADAPTER_KIND,isSubagentAdapterState}from"#subagents/adapter-state.js";const log=createLogger(`execution.delegated-parent-notification`),SUBAGENT_EXECUTION_FAILED=`SUBAGENT_EXECUTION_FAILED`,ZERO_TOKEN_USAGE={cacheReadTokens:0,cacheWriteTokens:0,inputTokens:0,outputTokens:0};async function notifyTurnCallerStep(e){"use step";if(e.caller===void 0)return;let t=createSettledTurnResult({caller:e.caller,lifecycle:e.lifecycle,sessionId:e.sessionId,settled:e.settled});if(e.caller.replyTo.kind===`callback`){await postSettledTurnCallback({result:t,sessionId:e.sessionId,url:e.caller.replyTo.url});return}await resumeSettledTurnHook(e.caller.replyTo.token,t)}async function notifyCancelledTaskCallerStep(e){"use step";let t=e.usage??ZERO_TOKEN_USAGE,n={code:SUBAGENT_EXECUTION_FAILED,message:`The agent invocation was cancelled.`},r={callId:e.caller.callId,isError:!0,kind:`subagent-result`,origin:`child`,outcome:{kind:`parked`,result:{kind:`cancelled`},usageDelta:t},output:n,subagentName:e.caller.subagentName},i=e.usage===void 0?r:{...r,usage:e.usage};if(e.caller.replyTo.kind===`callback`){await postSettledTurnCallback({result:i,sessionId:e.sessionId,url:e.caller.replyTo.url});return}await resumeSettledTurnHook(e.caller.replyTo.token,i)}function createSettledTurnResult(e){let t=e.settled.usage??ZERO_TOKEN_USAGE;if(e.settled.isError===!0){let n={code:SUBAGENT_EXECUTION_FAILED,message:toErrorMessage(e.settled.output)};return{callId:e.caller.callId,isError:!0,kind:`subagent-result`,origin:`child`,outcome:{kind:e.lifecycle,result:{error:n,kind:`failed`},usageDelta:t},output:n,subagentName:e.caller.subagentName}}let n=parseJsonValue(e.settled.output),r={callId:e.caller.callId,kind:`subagent-result`,origin:`child`,outcome:{kind:e.lifecycle,result:{kind:`succeeded`,output:n},usageDelta:t},output:n,subagentName:e.caller.subagentName};return e.settled.usage===void 0?r:{...r,usage:e.settled.usage}}async function resolveInitialTurnCallerStep(e){"use step";let t=e.serializedContext[SessionCallbackKey.name];if(t!==void 0){let e=parseSessionCallback(t);if(!e.ok)throw Error(`Serialized session callback is invalid.`,{cause:e.cause});return{callId:e.callback.callId,replyTo:{kind:`callback`,token:e.callback.token,url:e.callback.url},subagentName:e.callback.subagentName}}let n=(await deserializeContext(e.serializedContext)).get(ChannelKey);if(n?.kind===SUBAGENT_ADAPTER_KIND&&isSubagentAdapterState(n.state))return{callId:n.state.callId,replyTo:{kind:`hook`,token:n.state.parentContinuationToken},subagentName:n.state.subagentName}}function bindTurnCallerContext(e,t){if(e===void 0)return t;if(e.replyTo.kind===`callback`){let n={callId:e.callId,subagentName:e.subagentName,token:e.replyTo.token,url:e.replyTo.url};return{...t,[SessionCallbackKey.name]:n}}let n=t[ChannelKey.name];if(typeof n!=`object`||!n||Reflect.get(n,`kind`)!==SUBAGENT_ADAPTER_KIND||!isSubagentAdapterState(Reflect.get(n,`state`)))throw Error(`Delegated local turn is missing its subagent adapter binding.`);let r={...Reflect.get(n,`state`),callId:e.callId,parentContinuationToken:e.replyTo.token,subagentName:e.subagentName};return{...t,[ChannelKey.name]:{...n,state:r}}}async function postSettledTurnCallback(e){let{sessionId:t}=e;if(e.result.isError===!0){await postCallbackPayload({payload:{callId:e.result.callId,error:e.result.output,kind:`turn.failed`,outcome:e.result.outcome,sessionId:t,subagentName:e.result.subagentName},url:e.url});return}await postCallbackPayload({payload:{callId:e.result.callId,kind:`turn.completed`,outcome:e.result.outcome,output:e.result.output,sessionId:t,subagentName:e.result.subagentName},url:e.url})}const NOT_PENDING_RETRY_DELAYS_MS=[250,500,1e3,2e3,4e3];async function postCallbackPayload(e){for(let t=0;;t+=1){let n=await postSessionCallbackRequest({body:e.payload,url:e.url});if(n.ok)return;if(!await isCallbackNotPending(n))throw Error(`Turn callback failed with HTTP ${n.status}.`);let r=NOT_PENDING_RETRY_DELAYS_MS[t];if(r===void 0){log.warn(`turn caller no longer waits for this result`,{kind:Reflect.get(e.payload,`kind`)});return}await new Promise(e=>setTimeout(e,r))}}async function isCallbackNotPending(e){if(e.status!==404)return!1;let t=await e.json().catch(()=>void 0);return typeof t!=`object`||!t?!1:Reflect.get(t,`code`)===REMOTE_CALLBACK_NOT_PENDING||Reflect.get(t,`error`)===REMOTE_CALLBACK_NOT_PENDING_MESSAGE}async function resumeSettledTurnHook(e,t){try{await resumeHook(e,{kind:`runtime-action-result`,results:[t]})}catch(n){if(!HookNotFoundError.is(n))throw n;log.warn(`turn caller hook no longer exists`,{callId:t.callId,callerToken:e})}}export{NOT_PENDING_RETRY_DELAYS_MS,bindTurnCallerContext,notifyCancelledTaskCallerStep,notifyTurnCallerStep,resolveInitialTurnCallerStep};
1
+ import{createLogger}from"#internal/logging.js";import{SessionCallbackKey}from"#context/keys.js";import{toErrorMessage}from"#shared/errors.js";import{parseJsonValue}from"#shared/json.js";import{ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{resumeHook}from"#internal/workflow/runtime.js";import{REMOTE_CALLBACK_NOT_PENDING,REMOTE_CALLBACK_NOT_PENDING_MESSAGE}from"#protocol/remote-agent-protocol.js";import{parseSessionCallback}from"#channel/session-callback.js";import{deserializeContext}from"#context/serialize.js";import{postSessionCallbackRequest}from"#execution/session-callback-request.js";import{HookNotFoundError}from"#compiled/@workflow/errors/index.js";import{SUBAGENT_ADAPTER_KIND,isSubagentAdapterState}from"#subagents/adapter-state.js";const log=createLogger(`execution.delegated-parent-notification`),SUBAGENT_EXECUTION_FAILED=`SUBAGENT_EXECUTION_FAILED`,ZERO_TOKEN_USAGE={cacheReadTokens:0,cacheWriteTokens:0,inputTokens:0,outputTokens:0};async function notifyTurnCallerStep(e){"use step";if(e.caller===void 0)return;let t=createSettledTurnResult({caller:e.caller,lifecycle:e.lifecycle,sessionId:e.sessionId,settled:e.settled});if(e.caller.replyTo.kind===`callback`){await postSettledTurnCallback({result:t,sessionId:e.sessionId,url:e.caller.replyTo.url});return}await resumeSettledTurnHook(e.caller.replyTo.token,t)}async function notifyCancelledTaskCallerStep(e){"use step";let t=e.usage??ZERO_TOKEN_USAGE,n={code:SUBAGENT_EXECUTION_FAILED,message:`The agent invocation was cancelled.`},r={callId:e.caller.callId,isError:!0,kind:`subagent-result`,origin:`child`,outcome:{kind:`parked`,result:{kind:`cancelled`},usageDelta:t},output:n,subagentName:e.caller.subagentName},i=e.usage===void 0?r:{...r,usage:e.usage};if(e.caller.replyTo.kind===`callback`){await postSettledTurnCallback({result:i,sessionId:e.sessionId,url:e.caller.replyTo.url});return}await resumeSettledTurnHook(e.caller.replyTo.token,i)}function createSettledTurnResult(e){let t=e.settled.usage??ZERO_TOKEN_USAGE;if(e.settled.isError===!0){let n={code:SUBAGENT_EXECUTION_FAILED,message:toErrorMessage(e.settled.output)};return{callId:e.caller.callId,isError:!0,kind:`subagent-result`,origin:`child`,outcome:{kind:e.lifecycle,result:{error:n,kind:`failed`},usageDelta:t},output:n,subagentName:e.caller.subagentName}}let n=parseJsonValue(e.settled.output),r={callId:e.caller.callId,kind:`subagent-result`,origin:`child`,outcome:{kind:e.lifecycle,result:{kind:`succeeded`,output:n},usageDelta:t},output:n,subagentName:e.caller.subagentName};return e.settled.usage===void 0?r:{...r,usage:e.settled.usage}}async function resolveInitialTurnCallerStep(e){"use step";let t=e.serializedContext[SessionCallbackKey.name];if(t!==void 0){let e=parseSessionCallback(t);if(!e.ok)throw Error(`Serialized session callback is invalid.`,{cause:e.cause});return{callId:e.callback.callId,replyTo:{kind:`callback`,token:e.callback.token,url:e.callback.url},subagentName:e.callback.subagentName}}let n=(await deserializeContext(e.serializedContext)).get(ChannelKey);if(n?.kind===SUBAGENT_ADAPTER_KIND&&isSubagentAdapterState(n.state))return{callId:n.state.callId,replyTo:{kind:`hook`,token:n.state.parentContinuationToken},subagentName:n.state.subagentName}}function bindTurnCallerContext(e,t){if(e===void 0)return t;if(e.replyTo.kind===`callback`){let n={callId:e.callId,subagentName:e.subagentName,token:e.replyTo.token,url:e.replyTo.url};return{...t,[SessionCallbackKey.name]:n}}let n=t[ChannelKey.name];if(typeof n!=`object`||!n||Reflect.get(n,`kind`)!==SUBAGENT_ADAPTER_KIND||!isSubagentAdapterState(Reflect.get(n,`state`)))throw Error(`Delegated local turn is missing its subagent adapter binding.`);let r={...Reflect.get(n,`state`),callId:e.callId,parentContinuationToken:e.replyTo.token,subagentName:e.subagentName};return{...t,[ChannelKey.name]:{...n,state:r}}}async function postSettledTurnCallback(e){let{sessionId:t}=e;if(e.result.isError===!0){await postCallbackPayload({payload:{callId:e.result.callId,error:e.result.output,kind:`turn.failed`,outcome:e.result.outcome,sessionId:t,subagentName:e.result.subagentName},url:e.url});return}await postCallbackPayload({payload:{callId:e.result.callId,kind:`turn.completed`,outcome:e.result.outcome,output:e.result.output,sessionId:t,subagentName:e.result.subagentName},url:e.url})}const NOT_PENDING_RETRY_DELAYS_MS=[250,500,1e3,2e3,4e3];async function postCallbackPayload(e){for(let t=0;;t+=1){let n=await postSessionCallbackRequest({body:e.payload,url:e.url});if(n.ok)return;if(!await isCallbackNotPending(n))throw Error(`Turn callback failed with HTTP ${n.status}.`);let r=NOT_PENDING_RETRY_DELAYS_MS[t];if(r===void 0){log.warn(`turn caller no longer waits for this result`,{kind:Reflect.get(e.payload,`kind`)});return}await new Promise(e=>setTimeout(e,r))}}async function isCallbackNotPending(e){if(e.status!==404)return!1;let t=await e.json().catch(()=>void 0);return typeof t!=`object`||!t?!1:Reflect.get(t,`code`)===REMOTE_CALLBACK_NOT_PENDING||Reflect.get(t,`error`)===REMOTE_CALLBACK_NOT_PENDING_MESSAGE}async function resumeSettledTurnHook(e,t){try{await resumeHook(e,{kind:`runtime-action-result`,results:[t]})}catch(e){if(!HookNotFoundError.is(e))throw e;log.warn(`turn caller hook no longer exists`,{callId:t.callId})}}export{NOT_PENDING_RETRY_DELAYS_MS,bindTurnCallerContext,notifyCancelledTaskCallerStep,notifyTurnCallerStep,resolveInitialTurnCallerStep};
@@ -1,3 +1,3 @@
1
- import { n as signInEnding, t as useEveAgent } from "../chunks/use-eve-agent-DWjyzplb.js";
1
+ import { n as signInEnding, t as useEveAgent } from "../chunks/use-eve-agent-DCLFi26P.js";
2
2
 
3
3
  export { signInEnding, useEveAgent };
@@ -1,3 +1,3 @@
1
- import { t as useEveAgent } from "../chunks/use-eve-agent-DWjyzplb.js";
1
+ import { t as useEveAgent } from "../chunks/use-eve-agent-DCLFi26P.js";
2
2
 
3
3
  export { useEveAgent };
@@ -3,6 +3,8 @@ import type { ToolExecutionOptions } from "ai";
3
3
  import type { HistoryMessage as ModelMessage } from "#shared/history-message.js";
4
4
  import type { StandardJSONSchemaV1, StandardSchemaV1 } from "#compiled/@standard-schema/spec/index.js";
5
5
  import type { Approval } from "#approval/definition.js";
6
+ import type { CrossChannelToFn } from "#channel/cross-channel-receive.js";
7
+ import type { InstrumentationChannel } from "#shared/instrumentation-channel.js";
6
8
  import type { SessionAuthContext } from "#channel/types.js";
7
9
  import type { SessionContext } from "#context/session-context.js";
8
10
  import type { JsonObject } from "#shared/json.js";
@@ -165,6 +167,25 @@ export type ToolContext = SessionContext & {
165
167
  * token returned by {@link getToken}.
166
168
  */
167
169
  requireAuth(provider: ToolAuthProvider, options?: ToolAuthOptions): never;
170
+ /**
171
+ * Starts or continues a session on one of the agent's channels, as a route
172
+ * handler's `ctx.to()` does: `ctx.to(slack, target).send(message, options)`
173
+ * runs the channel's `receive()` hook and returns the delivery. The session
174
+ * belongs to the channel, not this one, and keeps running after the tool
175
+ * returns. The tool runs again when its step retries, so pass
176
+ * `` idempotencyKey: `${ctx.session.id}:${ctx.callId}` `` to deliver once.
177
+ * `callId` alone is unique only within this session, and every sender to the
178
+ * destination shares its keys. Throws in a delegated
179
+ * session: a subagent, a root copy, or a remote agent call.
180
+ */
181
+ readonly to: CrossChannelToFn;
182
+ /**
183
+ * The channel serving the calling session, as hooks and dynamic resolvers
184
+ * read it: the channel's `kind`, the session's `continuationToken` there, and
185
+ * what the channel's `metadata(state)` hook projects, such as a Slack
186
+ * thread's `channelId` and `threadTs`.
187
+ */
188
+ readonly channel: InstrumentationChannel;
168
189
  /**
169
190
  * The person who approved this call. Present only when the call runs after a
170
191
  * person approved it; absent for calls that needed no approval.
@@ -1 +1 @@
1
- async function executeAskQuestionTool(e,t){"use workflow";return toAskQuestionOutput(await t.ask(toAskQuestionRequest(e)))}function toAskQuestionRequest(e){let t=e.options?.map(e=>({description:e.description,id:e.label,label:e.label}));return{allowFreeform:!0,display:t===void 0?`text`:`select`,prompt:e.question,...t!==void 0&&{options:t}}}function toAskQuestionOutput(e){switch(e.status){case`answered`:return{answer:e.optionId??e.text??``,status:`answered`};case`cancelled`:return{interrupted:!0};case`unavailable`:return{status:`unavailable`}}}executeAskQuestionTool.workflowId=`workflow//eve@0.84.0//executeAskQuestionTool`;export{executeAskQuestionTool,toAskQuestionOutput,toAskQuestionRequest};
1
+ async function executeAskQuestionTool(e,t){"use workflow";return toAskQuestionOutput(await t.ask(toAskQuestionRequest(e)))}function toAskQuestionRequest(e){let t=e.options?.map(e=>({description:e.description,id:e.label,label:e.label}));return{allowFreeform:!0,display:t===void 0?`text`:`select`,prompt:e.question,...t!==void 0&&{options:t}}}function toAskQuestionOutput(e){switch(e.status){case`answered`:return{answer:e.optionId??e.text??``,status:`answered`};case`cancelled`:return{interrupted:!0};case`unavailable`:return{status:`unavailable`}}}executeAskQuestionTool.workflowId=`workflow//eve@0.85.0//executeAskQuestionTool`;export{executeAskQuestionTool,toAskQuestionOutput,toAskQuestionRequest};
@@ -1 +1 @@
1
- import{sleep}from"#compiled/@workflow/core/index.js";async function executeSleepTool(e,t){"use workflow";if(t.abortSignal.aborted)return{interrupted:!0};let n=new Promise(e=>t.abortSignal.addEventListener(`abort`,()=>e(`interrupted`),{once:!0})),r=sleep(Math.ceil(e.seconds*1e3)).then(()=>`elapsed`);return await Promise.race([r,n])===`elapsed`?{waitedSeconds:e.seconds}:{interrupted:!0}}executeSleepTool.workflowId=`workflow//eve@0.84.0//executeSleepTool`;export{executeSleepTool};
1
+ import{sleep}from"#compiled/@workflow/core/index.js";async function executeSleepTool(e,t){"use workflow";if(t.abortSignal.aborted)return{interrupted:!0};let n=new Promise(e=>t.abortSignal.addEventListener(`abort`,()=>e(`interrupted`),{once:!0})),r=sleep(Math.ceil(e.seconds*1e3)).then(()=>`elapsed`);return await Promise.race([r,n])===`elapsed`?{waitedSeconds:e.seconds}:{interrupted:!0}}executeSleepTool.workflowId=`workflow//eve@0.85.0//executeSleepTool`;export{executeSleepTool};