eve 0.79.2 → 0.80.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 (119) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/src/compiled/.vendor-stamp.json +6 -6
  3. package/dist/src/compiled/@chat-adapter/slack/api.d.ts +6 -0
  4. package/dist/src/compiled/@chat-adapter/slack/api.js +1 -1
  5. package/dist/src/compiled/@chat-adapter/slack/blocks.js +1 -1
  6. package/dist/src/compiled/@chat-adapter/slack/format.js +1 -1
  7. package/dist/src/compiled/@chat-adapter/slack/index.d.ts +14 -8
  8. package/dist/src/compiled/@chat-adapter/slack/index.js +33 -32
  9. package/dist/src/compiled/@chat-adapter/twilio/index.d.ts +37 -1
  10. package/dist/src/compiled/@chat-adapter/twilio/index.js +2 -2
  11. package/dist/src/compiled/@linqapp/chat-sdk-adapter/index.js +1 -1
  12. package/dist/src/compiled/@photon-ai/chat-adapter-imessage/index.js +1 -1
  13. package/dist/src/compiled/@vercel/connect/index.js +5 -5
  14. package/dist/src/compiled/@vercel/connect/token.d.ts +11 -1
  15. package/dist/src/compiled/_chunks/node/chunk-NBSLXVG3-Bt7pDfyn.js +12 -0
  16. package/dist/src/compiled/_chunks/node/dist-BKsV21Vu.js +6 -0
  17. package/dist/src/compiled/_chunks/node/dist-CO_n_hUa.js +98 -0
  18. package/dist/src/compiled/chat/index.js +1 -1
  19. package/dist/src/compiler/extension-compatibility.d.ts +6 -6
  20. package/dist/src/compiler/extension-compatibility.js +1 -1
  21. package/dist/src/compiler/manifest.d.ts +8 -4
  22. package/dist/src/compiler/manifest.js +1 -1
  23. package/dist/src/compiler/normalize-connection.js +1 -1
  24. package/dist/src/compiler/normalize-manifest.js +1 -1
  25. package/dist/src/context/schedule-collection-tools.js +1 -1
  26. package/dist/src/execution/catalog/connection-auth.d.ts +4 -2
  27. package/dist/src/execution/catalog/connection-auth.js +1 -1
  28. package/dist/src/execution/catalog/connection-entry.js +1 -1
  29. package/dist/src/execution/dynamic-workflow/tool.js +1 -1
  30. package/dist/src/execution/session/entry.js +1 -1
  31. package/dist/src/execution/session-event-stream.js +1 -1
  32. package/dist/src/execution/stable-workflow-names.d.ts +2 -0
  33. package/dist/src/execution/stable-workflow-names.js +1 -1
  34. package/dist/src/execution/tools/agent-router-workflow.js +1 -1
  35. package/dist/src/execution/web-fetch/execute.js +1 -1
  36. package/dist/src/execution/workflow-runtime.d.ts +6 -0
  37. package/dist/src/execution/workflow-runtime.js +1 -1
  38. package/dist/src/extensions/git/extension/extension.d.ts +3 -1
  39. package/dist/src/extensions/git/extension/extension.js +1 -1
  40. package/dist/src/extensions/git/extension/lib/gh-tool.js +1 -1
  41. package/dist/src/extensions/git/extension/lib/github-shell.d.ts +14 -0
  42. package/dist/src/extensions/git/extension/lib/github-shell.js +1 -1
  43. package/dist/src/harness/model-call/call.js +1 -1
  44. package/dist/src/harness/model-call/errors.d.ts +2 -2
  45. package/dist/src/harness/model-call/recovery.d.ts +2 -3
  46. package/dist/src/instrumentation/session-init.d.ts +2 -1
  47. package/dist/src/instrumentation/session-init.js +1 -1
  48. package/dist/src/internal/application/stamped-package-version.js +1 -1
  49. package/dist/src/internal/authored-definition/connection.js +1 -1
  50. package/dist/src/internal/authored-definition/schedule-collection.js +1 -1
  51. package/dist/src/internal/nitro/host/application-route-registry.d.ts +7 -2
  52. package/dist/src/internal/nitro/host/application-route-registry.js +1 -1
  53. package/dist/src/internal/nitro/host/configure-nitro-routes.js +1 -1
  54. package/dist/src/internal/nitro/routes/channel-request-instrumentation.d.ts +3 -1
  55. package/dist/src/internal/nitro/routes/channel-request-instrumentation.js +1 -1
  56. package/dist/src/internal/nitro/routes/connection-events.d.ts +5 -0
  57. package/dist/src/internal/nitro/routes/connection-events.js +1 -0
  58. package/dist/src/internal/workflow-bundle/builder.js +1 -1
  59. package/dist/src/internal/workflow-bundle/dynamic-tool-ast-references.js +1 -1
  60. package/dist/src/public/channels/slack/blocks.js +2 -2
  61. package/dist/src/public/connections/index.d.ts +1 -0
  62. package/dist/src/public/definitions/connections/events.d.ts +43 -0
  63. package/dist/src/public/definitions/connections/events.js +1 -0
  64. package/dist/src/public/definitions/connections/mcp.d.ts +3 -0
  65. package/dist/src/public/schedules/subscription.d.ts +4 -3
  66. package/dist/src/runtime/connections/events/actions.d.ts +17 -0
  67. package/dist/src/runtime/connections/events/actions.js +1 -0
  68. package/dist/src/runtime/connections/events/delivery.d.ts +10 -0
  69. package/dist/src/runtime/connections/events/delivery.js +1 -0
  70. package/dist/src/runtime/connections/events/dispatch-step.d.ts +20 -0
  71. package/dist/src/runtime/connections/events/dispatch-step.js +1 -0
  72. package/dist/src/runtime/connections/events/lifecycle-step.d.ts +42 -0
  73. package/dist/src/runtime/connections/events/lifecycle-step.js +1 -0
  74. package/dist/src/runtime/connections/events/owner.d.ts +38 -0
  75. package/dist/src/runtime/connections/events/owner.js +1 -0
  76. package/dist/src/runtime/connections/events/path.d.ts +4 -0
  77. package/dist/src/runtime/connections/events/path.js +1 -0
  78. package/dist/src/runtime/connections/events/state.d.ts +37 -0
  79. package/dist/src/runtime/connections/events/state.js +1 -0
  80. package/dist/src/runtime/connections/events/workflow.d.ts +28 -0
  81. package/dist/src/runtime/connections/events/workflow.js +1 -0
  82. package/dist/src/runtime/connections/mcp-client.d.ts +4 -2
  83. package/dist/src/runtime/connections/mcp-client.js +1 -1
  84. package/dist/src/runtime/connections/openapi-client.js +1 -1
  85. package/dist/src/runtime/connections/scoped-authorization.js +1 -1
  86. package/dist/src/runtime/resolve-connection.js +1 -1
  87. package/dist/src/runtime/schedules/collection-client.d.ts +0 -2
  88. package/dist/src/runtime/schedules/collection-client.js +1 -1
  89. package/dist/src/runtime/types.d.ts +11 -0
  90. package/dist/src/setup/scaffold/create/add-to-project.js +1 -1
  91. package/dist/src/setup/scaffold/create/project.js +2 -2
  92. package/dist/src/setup/scaffold/update/channels.js +1 -1
  93. package/dist/src/setup/scaffold/update/connections.js +2 -2
  94. package/dist/src/setup/scaffold/version-tokens.d.ts +1 -1
  95. package/dist/src/setup/scaffold/version-tokens.js +1 -1
  96. package/dist/src/shared/agent-definition.d.ts +12 -4
  97. package/dist/src/shared/connection-events.d.ts +84 -0
  98. package/dist/src/shared/connection-events.js +1 -0
  99. package/dist/src/shared/connection-types.d.ts +10 -0
  100. package/dist/src/shared/validate-authorization.js +1 -1
  101. package/dist/src/tools/provided/ask-question-workflow.js +1 -1
  102. package/dist/src/tools/provided/no-reply.d.ts +5 -0
  103. package/dist/src/tools/provided/sleep-workflow.js +1 -1
  104. package/dist/src/tracing/eve/connection-events.d.ts +25 -0
  105. package/dist/src/tracing/eve/connection-events.js +1 -0
  106. package/dist/src/tracing/eve/install-instrumentation-runtime.js +1 -1
  107. package/dist/src/tracing/eve/mcp.d.ts +1 -0
  108. package/dist/src/tracing/eve/mcp.js +1 -1
  109. package/dist/src/tracing/eve/otel-declaration.d.ts +5 -0
  110. package/docs/agent-config.md +38 -13
  111. package/docs/code-extension.mdx +28 -0
  112. package/docs/concepts/built-in-tools.md +2 -0
  113. package/docs/connections/mcp.mdx +105 -0
  114. package/docs/guides/instrumentation/otel.mdx +10 -0
  115. package/docs/sandbox/vercel.mdx +46 -0
  116. package/package.json +7 -7
  117. package/dist/src/compiled/_chunks/node/chunk-6QHBXN7B-gl4n6nmi.js +0 -12
  118. package/dist/src/compiled/_chunks/node/dist-DYDVZ-FS.js +0 -98
  119. package/dist/src/compiled/_chunks/node/dist-iEFkK9qw.js +0 -6
@@ -1 +1 @@
1
- import{normalizePersistedMessageStreamEvent}from"#protocol/message-version.js";import{getRun}from"#internal/workflow/runtime.js";import{parseNdjsonStream}from"#execution/ndjson-stream.js";function readSessionEventStream(e,t){return parseNdjsonStream(()=>getRun(e).getReadable({startIndex:t}),normalizePersistedEvent)}function readSessionEventHistory(e,t){let n=streamSessionEvents(e,{follow:!1,startIndex:t});return new ReadableStream({async pull(e){let t=await n.next();t.done?e.close():e.enqueue(t.value)},async cancel(){await n.return(void 0)}})}async function readSessionStreamTailIndex(e){let t=getRun(e).getReadable();try{return await t.getTailIndex()}finally{await t.cancel().catch(()=>{})}}async function*streamSessionEvents(e,t={}){let{follow:n=!0,signal:r}=t,i=t.startIndex??0;if(r?.aborted)return;let a,o=i;if((!n||i<0)&&(a=await readSessionStreamTailIndex(e),i<0&&(o=Math.max(0,a+1+i))),!n&&a!==void 0&&o>a)return;let s=readSessionEventStream(e,o).getReader(),cancel=()=>void s.cancel(r?.reason).catch(()=>{});r?.addEventListener(`abort`,cancel,{once:!0});try{let e=o;for(;!r?.aborted;){let{done:t,value:r}=await s.read();if(t||(yield r,!n&&a!==void 0&&e>=a))return;e+=1}}finally{r?.removeEventListener(`abort`,cancel),await s.cancel().catch(()=>{}),s.releaseLock()}}function normalizePersistedEvent(e){return normalizePersistedMessageStreamEvent(e)}export{readSessionEventHistory,readSessionEventStream,readSessionStreamTailIndex,streamSessionEvents};
1
+ import{normalizePersistedMessageStreamEvent}from"#protocol/message-version.js";import{getRun,getWorld}from"#internal/workflow/runtime.js";import{RunExpiredError}from"#compiled/@workflow/errors/index.js";import{parseNdjsonStream}from"#execution/ndjson-stream.js";function readSessionEventStream(e,t){return parseNdjsonStream(()=>getRun(e).getReadable({startIndex:t}),normalizePersistedEvent)}function readSessionEventHistory(e,t){let n=streamSessionEvents(e,{follow:!1,startIndex:t});return new ReadableStream({async pull(e){let t=await n.next();t.done?e.close():e.enqueue(t.value)},async cancel(){await n.return(void 0)}})}async function readSessionStreamTailIndex(e){let t=getRun(e).getReadable();try{let n=await getWorld(),[r,i]=await Promise.all([n.runs.get(e,{resolveData:`none`}),t.getTailIndex()]);if(r.expiredAt!==void 0&&r.expiredAt.getTime()<=Date.now())throw new RunExpiredError(`Session history is no longer available.`,e,r.status,r.expiredAt);return i}finally{await t.cancel().catch(()=>{})}}async function*streamSessionEvents(e,t={}){let{follow:n=!0,signal:r}=t,i=t.startIndex??0;if(r?.aborted)return;let a,o=i;if((!n||i<0)&&(a=await readSessionStreamTailIndex(e),i<0&&(o=Math.max(0,a+1+i))),!n&&a!==void 0&&o>a)return;let s=readSessionEventStream(e,o).getReader(),cancel=()=>void s.cancel(r?.reason).catch(()=>{});r?.addEventListener(`abort`,cancel,{once:!0});try{let e=o;for(;!r?.aborted;){let{done:t,value:r}=await s.read();if(t||(yield r,!n&&a!==void 0&&e>=a))return;e+=1}}finally{r?.removeEventListener(`abort`,cancel),await s.cancel().catch(()=>{}),s.releaseLock()}}function normalizePersistedEvent(e){return normalizePersistedMessageStreamEvent(e)}export{readSessionEventHistory,readSessionEventStream,readSessionStreamTailIndex,streamSessionEvents};
@@ -1,4 +1,6 @@
1
1
  export declare const WORKFLOW_ENTRY_NAME = "workflowEntry";
2
2
  export declare const SESSION_TIMEOUT_WORKFLOW_NAME = "sessionTimeoutWorkflow";
3
3
  export declare const WORKFLOW_TOOL_RUN_WORKFLOW_NAME = "workflowToolRunWorkflow";
4
+ export declare const CONNECTION_EVENT_WORKFLOW_NAME = "connectionEventWorkflow";
5
+ export declare const CONNECTION_EVENT_DELIVERY_WORKFLOW_NAME = "connectionEventDeliveryWorkflow";
4
6
  export declare const STABLE_WORKFLOW_NAMES: ReadonlySet<string>;
@@ -1 +1 @@
1
- const WORKFLOW_ENTRY_NAME=`workflowEntry`,SESSION_TIMEOUT_WORKFLOW_NAME=`sessionTimeoutWorkflow`,WORKFLOW_TOOL_RUN_WORKFLOW_NAME=`workflowToolRunWorkflow`,STABLE_WORKFLOW_NAMES=new Set([WORKFLOW_ENTRY_NAME,`turnWorkflow`,SESSION_TIMEOUT_WORKFLOW_NAME,WORKFLOW_TOOL_RUN_WORKFLOW_NAME]);export{SESSION_TIMEOUT_WORKFLOW_NAME,STABLE_WORKFLOW_NAMES,WORKFLOW_ENTRY_NAME,WORKFLOW_TOOL_RUN_WORKFLOW_NAME};
1
+ const WORKFLOW_ENTRY_NAME=`workflowEntry`,SESSION_TIMEOUT_WORKFLOW_NAME=`sessionTimeoutWorkflow`,WORKFLOW_TOOL_RUN_WORKFLOW_NAME=`workflowToolRunWorkflow`,CONNECTION_EVENT_WORKFLOW_NAME=`connectionEventWorkflow`,CONNECTION_EVENT_DELIVERY_WORKFLOW_NAME=`connectionEventDeliveryWorkflow`,STABLE_WORKFLOW_NAMES=new Set([WORKFLOW_ENTRY_NAME,`turnWorkflow`,SESSION_TIMEOUT_WORKFLOW_NAME,WORKFLOW_TOOL_RUN_WORKFLOW_NAME,CONNECTION_EVENT_WORKFLOW_NAME,CONNECTION_EVENT_DELIVERY_WORKFLOW_NAME]);export{CONNECTION_EVENT_DELIVERY_WORKFLOW_NAME,CONNECTION_EVENT_WORKFLOW_NAME,SESSION_TIMEOUT_WORKFLOW_NAME,STABLE_WORKFLOW_NAMES,WORKFLOW_ENTRY_NAME,WORKFLOW_TOOL_RUN_WORKFLOW_NAME};
@@ -1 +1 @@
1
- import{decide}from"#ai/decide.js";async function runAgentRouterTask(e,t){"use workflow";let n=await chooseTarget(e.message,descriptions(t),t.abortSignal),{message:r,status:i}=await(await t.agent(n).send(e.message,{signal:t.abortSignal})).result();if(i===`failed`)throw Error(`Agent "${n}" failed to handle the task.`);return r??null}async function chooseTarget(e,t,n){"use step";let r=Object.keys(t);if(r.length===0)throw Error(`agentRouter requires at least one available agent with a description.`);return r.length===1?r[0]:(await decide({abortSignal:n,state:{message:e},questions:{route:{type:`choice`,instructions:`Which subagent should handle this task?`,criteria:t}}})).answers.route.choice}function descriptions(e){return Object.fromEntries(Object.entries(e.agents).flatMap(([e,t])=>{let n=t.description.trim();return n.length===0?[]:[[e,n]]}))}runAgentRouterTask.workflowId=`workflow//eve@0.79.2//runAgentRouterTask`;export{runAgentRouterTask};
1
+ import{decide}from"#ai/decide.js";async function runAgentRouterTask(e,t){"use workflow";let n=await chooseTarget(e.message,descriptions(t),t.abortSignal),{message:r,status:i}=await(await t.agent(n).send(e.message,{signal:t.abortSignal})).result();if(i===`failed`)throw Error(`Agent "${n}" failed to handle the task.`);return r??null}async function chooseTarget(e,t,n){"use step";let r=Object.keys(t);if(r.length===0)throw Error(`agentRouter requires at least one available agent with a description.`);return r.length===1?r[0]:(await decide({abortSignal:n,state:{message:e},questions:{route:{type:`choice`,instructions:`Which subagent should handle this task?`,criteria:t}}})).answers.route.choice}function descriptions(e){return Object.fromEntries(Object.entries(e.agents).flatMap(([e,t])=>{let n=t.description.trim();return n.length===0?[]:[[e,n]]}))}runAgentRouterTask.workflowId=`workflow//eve@0.80.0//runAgentRouterTask`;export{runAgentRouterTask};
@@ -1 +1 @@
1
- import{truncateHead}from"#execution/sandbox/truncate-output.js";import{EVE_PACKAGE_NAME}from"#internal/package-name.js";import{convertHtmlToMarkdown,extractTextFromHtml}from"#execution/web-fetch/html.js";import{requestPublicUrl}from"#execution/web-fetch/request.js";const MAX_RESPONSE_SIZE=5242880;async function executeWebFetchTool(e,t){let{url:n,format:r=`markdown`,timeout:i}=e,a=Math.min(i===void 0?3e4:i*1e3,12e4),o=AbortSignal.timeout(a),s=t?.abortSignal===void 0?o:AbortSignal.any([t.abortSignal,o]),c=buildHeaders(r),l=await requestPublicUrl(n,{headers:c,maxResponseSize:MAX_RESPONSE_SIZE,signal:s}),u=l.status===403&&l.headers.get(`cf-mitigated`)===`challenge`?await requestPublicUrl(n,{headers:{...c,"User-Agent":EVE_PACKAGE_NAME},maxResponseSize:MAX_RESPONSE_SIZE,signal:s}):l,d=await u.arrayBuffer(),f=u.headers.get(`content-type`)??``,p=f.includes(`text/html`),m=new TextDecoder().decode(d),h;if(h=r===`markdown`&&p?convertHtmlToMarkdown(m):r===`text`&&p?extractTextFromHtml(m):m,!u.ok){let e=`Request failed with status code: ${u.status}`;h=h.length===0?e:`${e}\n\n${h}`}let{output:g,truncated:_}=truncateHead(h);return{content:g,contentType:f,truncated:_,url:n}}function buildHeaders(e){let t;return t=e===`markdown`?`text/markdown;q=1.0, text/x-markdown;q=0.9, text/plain;q=0.8, text/html;q=0.7, */*;q=0.1`:e===`text`?`text/plain;q=1.0, text/markdown;q=0.9, text/html;q=0.8, */*;q=0.1`:`text/html;q=1.0, application/xhtml+xml;q=0.9, text/plain;q=0.8, text/markdown;q=0.7, */*;q=0.1`,{Accept:t,"Accept-Language":`en-US,en;q=0.9`,"User-Agent":`Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36`}}export{executeWebFetchTool};
1
+ import{truncateHead}from"#execution/sandbox/truncate-output.js";import{EVE_PACKAGE_NAME}from"#internal/package-name.js";import{convertHtmlToMarkdown,extractTextFromHtml}from"#execution/web-fetch/html.js";import{requestPublicUrl}from"#execution/web-fetch/request.js";const MAX_RESPONSE_SIZE=5242880;async function executeWebFetchTool(e,t){let{url:n,format:r=`markdown`,timeout:i}=e,a=Math.min(i===void 0?3e4:i*1e3,12e4),o=AbortSignal.timeout(a),s=t?.abortSignal===void 0?o:AbortSignal.any([t.abortSignal,o]),c=buildHeaders(r),l=await requestPublicUrl(n,{headers:c,maxResponseSize:MAX_RESPONSE_SIZE,signal:s}),u=l.status===403&&l.headers.get(`cf-mitigated`)===`challenge`?await requestPublicUrl(n,{headers:{...c,"User-Agent":EVE_PACKAGE_NAME},maxResponseSize:MAX_RESPONSE_SIZE,signal:s}):l,d=await u.arrayBuffer(),f=u.headers.get(`content-type`)??``,p=new TextDecoder().decode(d),m=f.includes(`text/html`)||f.trim()===``&&/^\s*<(?:!doctype\s+html|html)[\s>]/i.test(p),h;if(h=r===`markdown`&&m?convertHtmlToMarkdown(p):r===`text`&&m?extractTextFromHtml(p):p,!u.ok){let e=`Request failed with status code: ${u.status}`;h=h.length===0?e:`${e}\n\n${h}`}let{output:g,truncated:_}=truncateHead(h);return{content:g,contentType:f,truncated:_,url:n}}function buildHeaders(e){let t;return t=e===`markdown`?`text/markdown;q=1.0, text/x-markdown;q=0.9, text/plain;q=0.8, text/html;q=0.7, */*;q=0.1`:e===`text`?`text/plain;q=1.0, text/markdown;q=0.9, text/html;q=0.8, */*;q=0.1`:`text/html;q=1.0, application/xhtml+xml;q=0.9, text/plain;q=0.8, text/markdown;q=0.7, */*;q=0.1`,{Accept:t,"Accept-Language":`en-US,en;q=0.9`,"User-Agent":`Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36`}}export{executeWebFetchTool};
@@ -24,6 +24,12 @@ export declare const sessionTimeoutWorkflowReference: {
24
24
  export declare const workflowToolRunWorkflowReference: {
25
25
  workflowId: string;
26
26
  };
27
+ export declare const connectionEventWorkflowReference: {
28
+ workflowId: string;
29
+ };
30
+ export declare const connectionEventDeliveryWorkflowReference: {
31
+ workflowId: string;
32
+ };
27
33
  /**
28
34
  * Creates a workflow-backed runtime whose current owner executes turns and
29
35
  * whose original run retains the public event stream across owner handoffs.
@@ -1 +1 @@
1
- import{createLogger,logError}from"#internal/logging.js";import{sessionCommandHookToken,sessionInboxHookToken}from"#execution/session-inbox/address.js";import{SessionPredecessorKey}from"#context/keys.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{walkCauseChain}from"#shared/errors.js";import{validateToolStubTargets}from"#tool-stubs/validate-targets.js";import{getHookByToken,getRun,getWorld,start}from"#internal/workflow/runtime.js";import{SessionStrandedError,describeStrandedSession}from"#channel/session-stranded-error.js";import{getCompiledRuntimeAgentBundle}from"#runtime/sessions/compiled-agent-cache.js";import{ROOT_RUNTIME_AGENT_NODE_ID}from"#runtime/graph.js";import{serializeContext}from"#context/serialize.js";import{AcceptedSessionIdentityError,SessionHandoffPendingError,logicalSessionToken,resolveSessionInbox,resumeSessionInbox}from"#execution/session-inbox/resume.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{context,trace}from"#compiled/@opentelemetry/api/index.js";import{EntityConflictError,HookNotFoundError,RunExpiredError,WorkflowRunNotFoundError}from"#compiled/@workflow/errors/index.js";import{StrandedSessionOwnerError,assertRunnableSessionInbox,findSessionHookHolder}from"#execution/session-inbox/owner.js";import{initializeSessionInstrumentation}from"#instrumentation/runtime.js";import{EVE_VERSION_ATTRIBUTE,buildSessionAttributes,buildSubagentRootAttributes,readParentLineage}from"#execution/eve-workflow-attributes.js";import{endStrandedSession}from"#execution/session-inbox/end-stranded-session.js";import{SESSION_HOOK_HANDOVER_TIMEOUT_MS,waitForSessionHooksRelease}from"#execution/session-inbox/hook-release.js";import{SESSION_TIMEOUT_WORKFLOW_NAME,WORKFLOW_ENTRY_NAME,WORKFLOW_TOOL_RUN_WORKFLOW_NAME}from"#execution/stable-workflow-names.js";import{normalizeEveAttributes}from"#runtime/attributes/normalize.js";import{buildRunContext}from"#execution/runtime-context.js";import{readSessionEventHistory,readSessionEventStream,readSessionStreamTailIndex}from"#execution/session-event-stream.js";import{SESSION_HANDOFF_VERSION}from"#execution/session/entry-input.js";import{buildInvocationAttributes}from"#internal/invocation/metadata.js";import{isAgentTraceContext}from"#tracing/eve/agent-trace-context.js";const EVE_PACKAGE_INFO=resolveInstalledPackageInfo(),STABLE_ID_BASE=EVE_PACKAGE_INFO.name,log=createLogger(`execution.workflow-runtime`),workflowEntryReference={workflowId:`workflow//${STABLE_ID_BASE}//${WORKFLOW_ENTRY_NAME}`},sessionTimeoutWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${SESSION_TIMEOUT_WORKFLOW_NAME}`},workflowToolRunWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${WORKFLOW_TOOL_RUN_WORKFLOW_NAME}`};function createWorkflowRuntime(e){let startSession=async(t,n)=>{let r=await getCompiledRuntimeAgentBundle({compiledArtifactsSource:e.compiledArtifactsSource,nodeId:e.nodeId});t.toolStubs!==void 0&&t.toolStubs.rootSessionId===void 0&&validateToolStubTargets(t.toolStubs.rules,r.graph);let i=buildRunContext({bundle:r,dynamicSubagentAgentConfig:e.dynamicSubagentAgentConfig,run:t});n!==void 0&&i.set(SessionPredecessorKey,n);let a=resolveEffectiveAgentRuntime(r,i);initializeSessionInstrumentation({agentName:a.turnAgent.id,ctx:i});let o=a.limits?.sessionTimeoutMs,s=r.resolvedAgent.config?.experimental?.workflow?.retention,c=serializeContext(i),l=readParentLineage(c),u={kind:`initial`,input:t.input,ownerDeploymentId:await resolveCurrentWorkflowDeploymentId(),serializedContext:c};t.limits!==void 0&&(u.limits=t.limits),t.continuationConflictCommand!==void 0&&(u.continuationConflictCommand=t.continuationConflictCommand),o!==void 0&&(u.sessionTimeoutMs=o),s!==void 0&&(u.retention=s);let d={...l.sessionId===void 0?buildSessionAttributes({serializedContext:c}):buildSubagentRootAttributes({identity:{nodeId:r.nodeId??ROOT_RUNTIME_AGENT_NODE_ID},parentCallId:l.callId,parentSessionId:l.sessionId,parentTurnId:l.turnId,rootSessionId:l.rootSessionId??l.sessionId,serializedContext:c}),...t.externalInvocation===void 0?{}:buildInvocationAttributes(t.externalInvocation)},f;try{let e={allowReservedAttributes:!0,attributes:normalizeEveAttributes(d)};s!==void 0&&(e.experimental_retention=s),f=await startWorkflowOnDeployment(workflowEntryReference,[u],u.ownerDeploymentId,e)}catch(e){throw logError(log,`failed to start workflow run`,e,{continuationToken:t.continuationToken}),e}let p,getEvents=()=>(p??=readSessionEventStream(f.runId),p);return{get events(){return getEvents()},sessionId:f.runId}};return{async createSession(e){return await startSession(e)},async dispatchContinuation(e){let{command:t,continuationToken:n,successor:r}=e;try{return await dispatchWorkflowCommand(n,t)}catch(e){if(!(e instanceof StrandedSessionOwnerError))throw e;if(t.kind!==`send`||r===void 0)return await settleStrandedCommand(n,t,e);if((t.payload.inputResponses?.length??0)>0)throw sessionStrandedError(e,`Its pending requests can no longer be answered; send a new message to start a fresh session.`);let i=await endStrandedSession(e,n,`message`);return{sessionId:(await startSession(r,{sessionId:i})).sessionId,status:`accepted`}}},async dispatchSession(e){return await dispatchWorkflowSessionCommand(e)},async getEventStream(e,t){if(t?.follow===!1)return readSessionEventHistory(e,t.startIndex);try{await assertRunnableSessionInbox(sessionInboxHookToken(sessionCommandHookToken(e)))}catch(e){throw e instanceof StrandedSessionOwnerError?sessionStrandedError(e):e}return readSessionEventStream(e,t?.startIndex)},async getStreamTailIndex(e){return await readSessionStreamTailIndex(e)},resolveContinuation}}async function startSessionOwnerStep(e){"use step";let{activationToken:t,anchorRunId:n,checkpoint:r,targetDeploymentId:i,...a}=e,o={...a,activationToken:t,checkpoint:r,handoffVersion:SESSION_HANDOFF_VERSION,kind:`handoff`,ownerDeploymentId:i,sessionWritable:getRun(n).getWritable(),sessionId:n};await startWorkflowOnDeployment(workflowEntryReference,[o],i,r.retention===void 0?void 0:{experimental_retention:r.retention})}async function dispatchWorkflowCommand(e,t){let n;try{let r=await resumeSessionInbox(e,t);n={runId:r.ownerRunId,sessionId:await r.sessionId}}catch(n){if(n instanceof StrandedSessionOwnerError)throw n;let r=t.kind===`send`&&typeof e!=`string`,i={status:`session_not_active`,retryable:!0};if(n instanceof SessionHandoffPendingError){if(r)return i;throw n}if(isInactiveCommandTarget(n))return r&&await isRunActive(e.sessionId)?i:inactiveCommandResult(t);throw logError(log,`failed to dispatch session command`,n,{command:t.kind,token:e}),n}return t.kind===`reset`&&await waitForSessionHooksRelease([sessionCommandHookToken(n.sessionId),logicalSessionToken(e)],n.runId),activeCommandResult(t,n.sessionId)}async function settleStrandedCommand(e,t,n){switch(t.kind){case`reset`:return{previousSessionId:await endStrandedSession(n,e,`reset`),status:`reset`};case`send`:case`clear`:throw sessionStrandedError(n);default:return inactiveCommandResult(t)}}function sessionStrandedError(e,t){let n=e.eveVersion===void 0?{}:{eveVersion:e.eveVersion};return new SessionStrandedError(n,describeStrandedSession(n,t))}function activeCommandResult(e,t){return e.kind===`reset`?{previousSessionId:t,status:`reset`}:e.kind===`send`&&e.delivery!==void 0?{sessionId:t,status:`accepted`,deliveryId:e.delivery.deliveryId}:{sessionId:t,status:`accepted`}}function inactiveCommandResult(e){return e.kind===`send`?{status:`session_not_active`}:e.kind===`cancel`?{status:`no_active_turn`}:{status:`no_active_session`}}async function dispatchWorkflowSessionCommand(e){let t={sessionId:e.sessionId};try{return await dispatchWorkflowCommand(t,e.command)}catch(n){if(!(n instanceof StrandedSessionOwnerError))throw n;return await settleStrandedCommand(t,e.command,n)}}async function isRunActive(e){try{let t=await getRun(e).status;return t===`pending`||t===`running`}catch(e){if(isInactiveCommandTarget(e))return!1;throw e}}function isInactiveCommandTarget(e){if(e instanceof AcceptedSessionIdentityError)return!1;if(HookNotFoundError.is(e))return!0;for(let t of walkCauseChain(e))if(WorkflowRunNotFoundError.is(t)||RunExpiredError.is(t)||EntityConflictError.is(t))return!0;return!1}async function resolveContinuation(e){try{return await resolveSessionInbox(e)}catch(t){if(HookNotFoundError.is(t))return;throw logError(log,`failed to resolve session by continuation token`,t,{continuationToken:e}),t}}async function waitForCommandHookOwner(e){let t=await pollUntil(async()=>{try{return normalizeWorkflowHook(await getHookByToken(e))}catch(e){if(!HookNotFoundError.is(e))throw e;return}},SESSION_HOOK_HANDOVER_TIMEOUT_MS);if(t===void 0)throw new HookNotFoundError(e);return t}async function waitForSessionInbox(e){let t=sessionInboxHookToken(sessionCommandHookToken(e)),n=await pollUntil(async()=>await findSessionHookHolder(t)!==void 0||!await hasRunEnded(e)&&void 0,SESSION_HOOK_HANDOVER_TIMEOUT_MS);if(n===void 0)throw Error(`Session "${e}" did not start taking commands within ${SESSION_HOOK_HANDOVER_TIMEOUT_MS/1e3} seconds.`);return n}async function pollUntil(e,t){let n=Date.now()+t;for(let t=20;;t=Math.min(t*2,200)){let r=await e();if(r!==void 0||Date.now()>=n)return r;await new Promise(e=>setTimeout(e,t))}}async function hasRunEnded(e){try{let t=await getRun(e).status;return t!==`pending`&&t!==`running`}catch(e){for(let t of walkCauseChain(e))if(WorkflowRunNotFoundError.is(t))return!1;if(isInactiveCommandTarget(e))return!0;throw e}}async function startWorkflowOnCurrentDeployment(e,t,n){return await startWorkflowOnDeployment(e,t,await resolveCurrentWorkflowDeploymentId(),n)}async function startWorkflowOnDeployment(e,t,n,r){return await withWorkflowStartContext(async()=>{if(n.length===0||n===`latest`)throw Error(`Workflow starts require an exact deployment id.`);return await start(e,t,{...r,allowReservedAttributes:!0,attributes:{...r?.attributes,[EVE_VERSION_ATTRIBUTE]:EVE_PACKAGE_INFO.version},deploymentId:n})})}async function resolveCurrentWorkflowDeploymentId(){let e=process.env.VERCEL_DEPLOYMENT_ID?.trim()||await(await getWorld()).getDeploymentId();if(e.length===0||e===`latest`)throw Error(`Workflow runtime could not resolve an exact deployment id.`);return e}async function withWorkflowStartContext(e){let t=context.active(),n=isAgentTraceContext(t)?trace.deleteSpan(t):t;return await context.with(n,e)}function normalizeWorkflowHook(e){if(typeof e!=`object`||!e||!(`runId`in e))throw Error(`Workflow hook did not include a run id.`);let t=e.runId;if(typeof t!=`string`||t.length===0)throw Error(`Workflow hook did not include a run id.`);return{runId:t}}export{createWorkflowRuntime,dispatchWorkflowSessionCommand,hasRunEnded,pollUntil,resolveContinuation,sessionTimeoutWorkflowReference,startSessionOwnerStep,startWorkflowOnCurrentDeployment,waitForCommandHookOwner,waitForSessionInbox,workflowEntryReference,workflowToolRunWorkflowReference};
1
+ import{createLogger,logError}from"#internal/logging.js";import{sessionCommandHookToken,sessionInboxHookToken}from"#execution/session-inbox/address.js";import{SessionPredecessorKey}from"#context/keys.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{walkCauseChain}from"#shared/errors.js";import{validateToolStubTargets}from"#tool-stubs/validate-targets.js";import{getHookByToken,getRun,getWorld,start}from"#internal/workflow/runtime.js";import{SessionStrandedError,describeStrandedSession}from"#channel/session-stranded-error.js";import{getCompiledRuntimeAgentBundle}from"#runtime/sessions/compiled-agent-cache.js";import{ROOT_RUNTIME_AGENT_NODE_ID}from"#runtime/graph.js";import{serializeContext}from"#context/serialize.js";import{AcceptedSessionIdentityError,SessionHandoffPendingError,logicalSessionToken,resolveSessionInbox,resumeSessionInbox}from"#execution/session-inbox/resume.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{context,trace}from"#compiled/@opentelemetry/api/index.js";import{EntityConflictError,HookNotFoundError,RunExpiredError,WorkflowRunNotFoundError}from"#compiled/@workflow/errors/index.js";import{StrandedSessionOwnerError,assertRunnableSessionInbox,findSessionHookHolder}from"#execution/session-inbox/owner.js";import{initializeSessionInstrumentation}from"#instrumentation/runtime.js";import{EVE_VERSION_ATTRIBUTE,buildSessionAttributes,buildSubagentRootAttributes,readParentLineage}from"#execution/eve-workflow-attributes.js";import{endStrandedSession}from"#execution/session-inbox/end-stranded-session.js";import{SESSION_HOOK_HANDOVER_TIMEOUT_MS,waitForSessionHooksRelease}from"#execution/session-inbox/hook-release.js";import{CONNECTION_EVENT_DELIVERY_WORKFLOW_NAME,CONNECTION_EVENT_WORKFLOW_NAME,SESSION_TIMEOUT_WORKFLOW_NAME,WORKFLOW_ENTRY_NAME,WORKFLOW_TOOL_RUN_WORKFLOW_NAME}from"#execution/stable-workflow-names.js";import{normalizeEveAttributes}from"#runtime/attributes/normalize.js";import{buildRunContext}from"#execution/runtime-context.js";import{readSessionEventHistory,readSessionEventStream,readSessionStreamTailIndex}from"#execution/session-event-stream.js";import{SESSION_HANDOFF_VERSION}from"#execution/session/entry-input.js";import{buildInvocationAttributes}from"#internal/invocation/metadata.js";import{isAgentTraceContext}from"#tracing/eve/agent-trace-context.js";const EVE_PACKAGE_INFO=resolveInstalledPackageInfo(),STABLE_ID_BASE=EVE_PACKAGE_INFO.name,log=createLogger(`execution.workflow-runtime`),workflowEntryReference={workflowId:`workflow//${STABLE_ID_BASE}//${WORKFLOW_ENTRY_NAME}`},sessionTimeoutWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${SESSION_TIMEOUT_WORKFLOW_NAME}`},workflowToolRunWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${WORKFLOW_TOOL_RUN_WORKFLOW_NAME}`},connectionEventWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${CONNECTION_EVENT_WORKFLOW_NAME}`},connectionEventDeliveryWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${CONNECTION_EVENT_DELIVERY_WORKFLOW_NAME}`};function createWorkflowRuntime(e){let startSession=async(t,n)=>{let r=await getCompiledRuntimeAgentBundle({compiledArtifactsSource:e.compiledArtifactsSource,nodeId:e.nodeId});t.toolStubs!==void 0&&t.toolStubs.rootSessionId===void 0&&validateToolStubTargets(t.toolStubs.rules,r.graph);let i=buildRunContext({bundle:r,dynamicSubagentAgentConfig:e.dynamicSubagentAgentConfig,run:t});n!==void 0&&i.set(SessionPredecessorKey,n);let a=resolveEffectiveAgentRuntime(r,i),o=initializeSessionInstrumentation({agentName:a.turnAgent.id,ctx:i}),s=a.limits?.sessionTimeoutMs,c=r.resolvedAgent.config?.experimental?.workflow?.retention??(o.action===`record`&&o.recordInputs&&o.recordOutputs?void 0:0),l=serializeContext(i),u=readParentLineage(l),d={kind:`initial`,input:t.input,ownerDeploymentId:await resolveCurrentWorkflowDeploymentId(),serializedContext:l};t.limits!==void 0&&(d.limits=t.limits),t.continuationConflictCommand!==void 0&&(d.continuationConflictCommand=t.continuationConflictCommand),s!==void 0&&(d.sessionTimeoutMs=s),c!==void 0&&(d.retention=c);let f={...u.sessionId===void 0?buildSessionAttributes({serializedContext:l}):buildSubagentRootAttributes({identity:{nodeId:r.nodeId??ROOT_RUNTIME_AGENT_NODE_ID},parentCallId:u.callId,parentSessionId:u.sessionId,parentTurnId:u.turnId,rootSessionId:u.rootSessionId??u.sessionId,serializedContext:l}),...t.externalInvocation===void 0?{}:buildInvocationAttributes(t.externalInvocation)},p;try{let e={allowReservedAttributes:!0,attributes:normalizeEveAttributes(f)};c!==void 0&&(e.experimental_retention=c),p=await startWorkflowOnDeployment(workflowEntryReference,[d],d.ownerDeploymentId,e)}catch(e){throw logError(log,`failed to start workflow run`,e,{continuationToken:t.continuationToken}),e}let m,getEvents=()=>(m??=readSessionEventStream(p.runId),m);return{get events(){return getEvents()},sessionId:p.runId}};return{async createSession(e){return await startSession(e)},async dispatchContinuation(e){let{command:t,continuationToken:n,successor:r}=e;try{return await dispatchWorkflowCommand(n,t)}catch(e){if(!(e instanceof StrandedSessionOwnerError))throw e;if(t.kind!==`send`||r===void 0)return await settleStrandedCommand(n,t,e);if((t.payload.inputResponses?.length??0)>0)throw sessionStrandedError(e,`Its pending requests can no longer be answered; send a new message to start a fresh session.`);let i=await endStrandedSession(e,n,`message`);return{sessionId:(await startSession(r,{sessionId:i})).sessionId,status:`accepted`}}},async dispatchSession(e){return await dispatchWorkflowSessionCommand(e)},async getEventStream(e,t){if(t?.follow===!1)return readSessionEventHistory(e,t.startIndex);try{await assertRunnableSessionInbox(sessionInboxHookToken(sessionCommandHookToken(e)))}catch(e){throw e instanceof StrandedSessionOwnerError?sessionStrandedError(e):e}return readSessionEventStream(e,t?.startIndex)},async getStreamTailIndex(e){return await readSessionStreamTailIndex(e)},resolveContinuation}}async function startSessionOwnerStep(e){"use step";let{activationToken:t,anchorRunId:n,checkpoint:r,targetDeploymentId:i,...a}=e,o={...a,activationToken:t,checkpoint:r,handoffVersion:SESSION_HANDOFF_VERSION,kind:`handoff`,ownerDeploymentId:i,sessionWritable:getRun(n).getWritable(),sessionId:n};await startWorkflowOnDeployment(workflowEntryReference,[o],i,r.retention===void 0?void 0:{experimental_retention:r.retention})}async function dispatchWorkflowCommand(e,t){let n;try{let r=await resumeSessionInbox(e,t);n={runId:r.ownerRunId,sessionId:await r.sessionId}}catch(n){if(n instanceof StrandedSessionOwnerError)throw n;let r=t.kind===`send`&&typeof e!=`string`,i={status:`session_not_active`,retryable:!0};if(n instanceof SessionHandoffPendingError){if(r)return i;throw n}if(isInactiveCommandTarget(n))return r&&await isRunActive(e.sessionId)?i:inactiveCommandResult(t);throw logError(log,`failed to dispatch session command`,n,{command:t.kind,token:e}),n}return t.kind===`reset`&&await waitForSessionHooksRelease([sessionCommandHookToken(n.sessionId),logicalSessionToken(e)],n.runId),activeCommandResult(t,n.sessionId)}async function settleStrandedCommand(e,t,n){switch(t.kind){case`reset`:return{previousSessionId:await endStrandedSession(n,e,`reset`),status:`reset`};case`send`:case`clear`:throw sessionStrandedError(n);default:return inactiveCommandResult(t)}}function sessionStrandedError(e,t){let n=e.eveVersion===void 0?{}:{eveVersion:e.eveVersion};return new SessionStrandedError(n,describeStrandedSession(n,t))}function activeCommandResult(e,t){return e.kind===`reset`?{previousSessionId:t,status:`reset`}:e.kind===`send`&&e.delivery!==void 0?{sessionId:t,status:`accepted`,deliveryId:e.delivery.deliveryId}:{sessionId:t,status:`accepted`}}function inactiveCommandResult(e){return e.kind===`send`?{status:`session_not_active`}:e.kind===`cancel`?{status:`no_active_turn`}:{status:`no_active_session`}}async function dispatchWorkflowSessionCommand(e){let t={sessionId:e.sessionId};try{return await dispatchWorkflowCommand(t,e.command)}catch(n){if(!(n instanceof StrandedSessionOwnerError))throw n;return await settleStrandedCommand(t,e.command,n)}}async function isRunActive(e){try{let t=await getRun(e).status;return t===`pending`||t===`running`}catch(e){if(isInactiveCommandTarget(e))return!1;throw e}}function isInactiveCommandTarget(e){if(e instanceof AcceptedSessionIdentityError)return!1;if(HookNotFoundError.is(e))return!0;for(let t of walkCauseChain(e))if(WorkflowRunNotFoundError.is(t)||RunExpiredError.is(t)||EntityConflictError.is(t))return!0;return!1}async function resolveContinuation(e){try{return await resolveSessionInbox(e)}catch(t){if(HookNotFoundError.is(t))return;throw logError(log,`failed to resolve session by continuation token`,t,{continuationToken:e}),t}}async function waitForCommandHookOwner(e){let t=await pollUntil(async()=>{try{return normalizeWorkflowHook(await getHookByToken(e))}catch(e){if(!HookNotFoundError.is(e))throw e;return}},SESSION_HOOK_HANDOVER_TIMEOUT_MS);if(t===void 0)throw new HookNotFoundError(e);return t}async function waitForSessionInbox(e){let t=sessionInboxHookToken(sessionCommandHookToken(e)),n=await pollUntil(async()=>await findSessionHookHolder(t)!==void 0||!await hasRunEnded(e)&&void 0,SESSION_HOOK_HANDOVER_TIMEOUT_MS);if(n===void 0)throw Error(`Session "${e}" did not start taking commands within ${SESSION_HOOK_HANDOVER_TIMEOUT_MS/1e3} seconds.`);return n}async function pollUntil(e,t){let n=Date.now()+t;for(let t=20;;t=Math.min(t*2,200)){let r=await e();if(r!==void 0||Date.now()>=n)return r;await new Promise(e=>setTimeout(e,t))}}async function hasRunEnded(e){try{let t=await getRun(e).status;return t!==`pending`&&t!==`running`}catch(e){for(let t of walkCauseChain(e))if(WorkflowRunNotFoundError.is(t))return!1;if(isInactiveCommandTarget(e))return!0;throw e}}async function startWorkflowOnCurrentDeployment(e,t,n){return await startWorkflowOnDeployment(e,t,await resolveCurrentWorkflowDeploymentId(),n)}async function startWorkflowOnDeployment(e,t,n,r){return await withWorkflowStartContext(async()=>{if(n.length===0||n===`latest`)throw Error(`Workflow starts require an exact deployment id.`);return await start(e,t,{...r,allowReservedAttributes:!0,attributes:{...r?.attributes,[EVE_VERSION_ATTRIBUTE]:EVE_PACKAGE_INFO.version},deploymentId:n})})}async function resolveCurrentWorkflowDeploymentId(){let e=process.env.VERCEL_DEPLOYMENT_ID?.trim()||await(await getWorld()).getDeploymentId();if(e.length===0||e===`latest`)throw Error(`Workflow runtime could not resolve an exact deployment id.`);return e}async function withWorkflowStartContext(e){let t=context.active(),n=isAgentTraceContext(t)?trace.deleteSpan(t):t;return await context.with(n,e)}function normalizeWorkflowHook(e){if(typeof e!=`object`||!e||!(`runId`in e))throw Error(`Workflow hook did not include a run id.`);let t=e.runId;if(typeof t!=`string`||t.length===0)throw Error(`Workflow hook did not include a run id.`);return{runId:t}}export{connectionEventDeliveryWorkflowReference,connectionEventWorkflowReference,createWorkflowRuntime,dispatchWorkflowSessionCommand,hasRunEnded,pollUntil,resolveContinuation,sessionTimeoutWorkflowReference,startSessionOwnerStep,startWorkflowOnCurrentDeployment,waitForCommandHookOwner,waitForSessionInbox,workflowEntryReference,workflowToolRunWorkflowReference};
@@ -1,12 +1,14 @@
1
1
  import { z } from "zod";
2
- import type { GitHubConfig } from "./lib/github-shell.ts";
2
+ import type { GitHubAuthorize, GitHubConfig } from "./lib/github-shell.ts";
3
3
  export type { GitHubLeaseRule } from "./lib/github-shell.ts";
4
+ export type { GitHubAuthorize, GitHubAuthorizeRequest } from "./lib/github-shell.ts";
4
5
  export type GitHubLeaseBroker = GitHubConfig["broker"];
5
6
  declare const _default: import("eve/extension").ExtensionHandle<z.ZodObject<{
6
7
  github: z.ZodOptional<z.ZodObject<{
7
8
  connector: z.ZodString;
8
9
  org: z.ZodString;
9
10
  broker: z.ZodCustom<(sandbox: import("../../../shared/sandbox-session.ts").SandboxSession, rules: Readonly<Record<string, readonly import("./lib/github-shell.ts").GitHubLeaseRule[]>> | null) => Promise<void>, (sandbox: import("../../../shared/sandbox-session.ts").SandboxSession, rules: Readonly<Record<string, readonly import("./lib/github-shell.ts").GitHubLeaseRule[]>> | null) => Promise<void>>;
11
+ authorize: z.ZodOptional<z.ZodCustom<GitHubAuthorize, GitHubAuthorize>>;
10
12
  }, z.core.$strip>>;
11
13
  }, z.core.$strip>>;
12
14
  export default _default;
@@ -1 +1 @@
1
- import{z}from"#compiled/zod/index.js";import{defineExtension}from"eve/extension";var extension_default=defineExtension({config:z.object({github:z.object({connector:z.string().min(1),org:z.string().min(1),broker:z.custom(e=>typeof e==`function`)}).optional()})});export{extension_default as default};
1
+ import{z}from"#compiled/zod/index.js";import{defineExtension}from"eve/extension";const fn=()=>z.custom(e=>typeof e==`function`);var extension_default=defineExtension({config:z.object({github:z.object({connector:z.string().min(1),org:z.string().min(1),broker:fn(),authorize:fn().optional()}).optional()})});export{extension_default as default};
@@ -1 +1 @@
1
- import{executeGitHubShell,githubShellApproval}from"./github-shell.js";import{githubShellInputSchema}from"./github-shell-schema.js";import{z}from"#compiled/zod/index.js";import{defineTool}from"eve/tools";const GH_TOOL_DESCRIPTION=`Run one authenticated GitHub command in the sandbox. The full gh CLI surface is available. Commands run without an approval prompt; description records the GitHub-side result the command intends to produce. Declare exactly one repository in the configured GitHub organization: Connect mints the real token for only that repository, and the sandbox process receives only a placeholder GH_TOKEN that the firewall exchanges on matching GitHub requests. GitHub rejects access outside the token's server-side repository scope; commands that explicitly name another repository with -R, --repo, --repo=, or a repository argument to gh repo clone, view, or fork are denied before minting. Use simple argv quoting only, never environment assignments, pipes, redirects, substitutions, or other shell syntax. gh alias and extension commands may execute local code, but remain sandboxed. Use git here only for authenticated fetch, pull, push, or ls-remote against a strictly validated origin, and use gh-signed-commit only with --repo. Use ordinary bash for local git status, diff, add, commit, and rebase.`;function defineGhTool(e,t=GH_TOOL_DESCRIPTION){return defineTool({description:t,approval:({toolInput:e})=>githubShellApproval(e),inputSchema:githubShellInputSchema,outputSchema:z.object({exitCode:z.number().int(),stderr:z.string(),stdout:z.string(),truncated:z.boolean()}),execute(t,n){return executeGitHubShell(t,e(),{getSandbox:()=>n.getSandbox(),sessionId:n.session.id})}})}export{GH_TOOL_DESCRIPTION,defineGhTool};
1
+ import{executeGitHubShell,githubShellApproval}from"./github-shell.js";import{githubShellInputSchema}from"./github-shell-schema.js";import{z}from"#compiled/zod/index.js";import{defineTool}from"eve/tools";const GH_TOOL_DESCRIPTION=`Run one authenticated GitHub command in the sandbox. The full gh CLI surface is available. Commands run without an approval prompt; description records the GitHub-side result the command intends to produce. Declare exactly one repository in the configured GitHub organization: Connect mints the real token for only that repository, and the sandbox process receives only a placeholder GH_TOKEN that the firewall exchanges on matching GitHub requests. GitHub rejects access outside the token's server-side repository scope; commands that explicitly name another repository with -R, --repo, --repo=, or a repository argument to gh repo clone, view, or fork are denied before minting. Use simple argv quoting only, never environment assignments, pipes, redirects, substitutions, or other shell syntax. gh alias and extension commands may execute local code, but remain sandboxed. Use git here only for authenticated fetch, pull, push, or ls-remote against a strictly validated origin, and use gh-signed-commit only with --repo. Use ordinary bash for local git status, diff, add, commit, and rebase.`;function defineGhTool(e,t=GH_TOOL_DESCRIPTION){return defineTool({description:t,approval:({toolInput:e})=>githubShellApproval(e),inputSchema:githubShellInputSchema,outputSchema:z.object({exitCode:z.number().int(),stderr:z.string(),stdout:z.string(),truncated:z.boolean()}),execute(t,n){return executeGitHubShell(t,e(),{auth:n.session.auth.current,getSandbox:()=>n.getSandbox(),sessionId:n.session.id})}})}export{GH_TOOL_DESCRIPTION,defineGhTool};
@@ -1,4 +1,5 @@
1
1
  import { getToken } from "@vercel/connect";
2
+ import type { SessionAuthContext } from "eve/context";
2
3
  import type { SandboxSession } from "eve/sandbox";
3
4
  export interface GitHubPermission {
4
5
  readonly access: "write";
@@ -18,10 +19,22 @@ export interface GitHubShellOutput {
18
19
  readonly truncated: boolean;
19
20
  }
20
21
  export interface GitHubConfig {
22
+ readonly authorize?: GitHubAuthorize;
21
23
  readonly broker: (sandbox: SandboxSession, rules: Readonly<Record<string, readonly GitHubLeaseRule[]>> | null) => Promise<void>;
22
24
  readonly connector: string;
23
25
  readonly org: string;
24
26
  }
27
+ /** What an `authorize` callback sees before a `gh` command runs. */
28
+ export interface GitHubAuthorizeRequest {
29
+ /** The session's current caller, or `null` when the session has none. */
30
+ readonly auth: SessionAuthContext | null;
31
+ /** The `owner/name` repository the command declared. */
32
+ readonly repository: string;
33
+ /** The repository-scoped GitHub App token minted for this command, for API lookups. */
34
+ readonly token: string;
35
+ }
36
+ /** Decides whether the session's caller may run a `gh` command against one repository. */
37
+ export type GitHubAuthorize = (request: GitHubAuthorizeRequest) => boolean | Promise<boolean>;
25
38
  export interface GitHubLeaseRule {
26
39
  readonly match?: {
27
40
  readonly headers?: readonly {
@@ -39,6 +52,7 @@ export interface GitHubLeaseRule {
39
52
  }[];
40
53
  }
41
54
  interface GitHubShellDependencies {
55
+ readonly auth?: SessionAuthContext | null;
42
56
  readonly getConnectToken?: typeof getToken;
43
57
  readonly getSandbox: () => Promise<SandboxSession>;
44
58
  /** Serializes credential leases per eve session; every `ctx.getSandbox()` call returns a new handle. */
@@ -1 +1 @@
1
- import{shellQuote}from"./shell.js";import{validateRepositoryRoot}from"./repository-root.js";import{GITHUB_TOOLING_PATHS}from"./tooling.js";import{posix}from"node:path";import{getToken}from"#compiled/@vercel/connect/index.js";const MAX_OUTPUT_BYTES=1e5,leaseQueues=new Map,ALLOWED_GIT_REMOTE_COMMANDS=new Set([`fetch`,`ls-remote`,`pull`,`push`]);function githubShellApproval(e){if(!e)return`not-applicable`;try{return validateGitHubShellInput(e),`not-applicable`}catch(e){return{type:`denied`,reason:e instanceof Error?e.message:`Invalid GitHub command.`}}}async function executeGitHubShell(e,t,n){if(!t)throw Error(`GitHub command access is not configured for this agent.`);let r=validateGitHubShellInput(e),i=await n.getSandbox(),a=resolveWorkingDirectory(i,e.workingDirectory);(r[0]===`git`||r[0]===`gh-signed-commit`)&&(a=await validateRepositoryRoot(i,a));let o=e.permissions[0].repositories,s=await assertCommandTargets(r,o,a,i),c=repositoryNames(o,t.org),l={authorizationDetails:[{type:`github_app_installation`,org:t.org,repositories:c}],subject:{type:`app`}},u=await(n.getConnectToken??getToken)(t.connector,l);if(!u)throw Error(`Connect returned an empty token for ${JSON.stringify(t.connector)}.`);let d=executablePath(r[0]),f=s?[`-c`,`protocol.allow=never`,`-c`,`protocol.https.allow=always`,r[1],`https://github.com/${s}.git`,...r.slice(3)]:r.slice(1),p=`cd ${shellQuote(a)} && exec ${shellQuote(d)} ${f.map(shellQuote).join(` `)}`,m=`Basic ${Buffer.from(`x-access-token:${u}`).toString(`base64`)}`,h=crypto.randomUUID(),g=`eve-github-${h}`,_=`/tmp/eve-code-gh-${h}`,v=`Basic ${Buffer.from(`x-access-token:${g}`).toString(`base64`)}`,y;try{y=await withGitHubCredentialLease(i,n.sessionId,{authorization:m,placeholder:g,placeholderAuthorization:v,token:u},()=>{let e={GH_CONFIG_DIR:_,GH_PROMPT_DISABLED:`1`};return r[0]!==`git`&&(e.GH_TOKEN=g),e.GIT_CONFIG_COUNT=`2`,e.GIT_CONFIG_KEY_0=`http.https://github.com/.extraheader`,e.GIT_CONFIG_VALUE_0=`Authorization: ${v}`,e.GIT_CONFIG_KEY_1=`core.hooksPath`,e.GIT_CONFIG_VALUE_1=`/dev/null`,e.GIT_TERMINAL_PROMPT=`0`,e.PATH=`/usr/local/bin:/usr/bin:/bin`,i.run({command:p,env:e})},t.broker)}finally{await i.removePath({path:_,recursive:!0,force:!0})}let b=sanitizeOutput(y.stdout,u,m),x=sanitizeOutput(y.stderr,u,m);return{exitCode:y.exitCode,stdout:b.value,stderr:x.value,truncated:b.truncated||x.truncated}}async function withGitHubCredentialLease(e,t,n,r,i){let a=leaseQueues.get(t)??Promise.resolve(),o,s=new Promise(e=>{o=e}),c=a.then(()=>s);leaseQueues.set(t,c),await a;try{return await i(e,{"api.github.com":[{match:{headers:[{key:{exact:`authorization`},value:{regex:`^(?:token|Bearer) ${n.placeholder}$`}}]},transform:[{headers:{authorization:`Bearer ${n.token}`}}]}],"github.com":[{match:{headers:[{key:{exact:`authorization`},value:{exact:n.placeholderAuthorization}}]},transform:[{headers:{authorization:n.authorization}}]}]}),await r()}finally{try{await i(e,null)}finally{o(),leaseQueues.get(t)===c&&leaseQueues.delete(t)}}}function parseCommand(e){let t=e.trim();if(!t)throw Error(`GitHub command must not be empty.`);let n=[],r=``,i=null,a=!1,o=!1;for(let e of t){if(a){r+=e,a=!1,o=!0;continue}if(e===`\\`&&i!==`single`){a=!0,o=!0;continue}if(i===`single`){e===`'`?i=null:r+=e;continue}if(i===`double`){if(e===`"`)i=null;else if(e===`$`||e==="`")throw unsupportedSyntax();else r+=e;continue}if(e===`'`)i=`single`,o=!0;else if(e===`"`)i=`double`,o=!0;else if(/\s/u.test(e))o&&=(n.push(r),r=``,!1);else if(";&|<>$`(){}".includes(e))throw unsupportedSyntax();else r+=e,o=!0}if(a||i)throw Error(`GitHub command contains an unfinished quote or escape.`);if(o&&n.push(r),n.length===0)throw Error(`GitHub command must not be empty.`);return n}function validateGitHubShellInput(e){let t=parseCommand(e.command),n=e.permissions[0];if(e.permissions.length!==1||n?.provider!==`github`)throw Error(`Exactly one GitHub permission is required.`);if(n.access!==`write`)throw Error(`GitHub App commands require explicit write-capable access.`);if(!e.description.trim())throw Error(`description must describe the intended result.`);let[r,i]=t;if(r===`gh`){if(!i)throw Error(`A gh subcommand is required.`)}else if(r===`git`){if(!i||!ALLOWED_GIT_REMOTE_COMMANDS.has(i))throw Error(`Authenticated git supports only fetch, ls-remote, pull, and push; clone with gh repo clone.`)}else if(r!==`gh-signed-commit`)throw Error(`GitHub commands must use gh, an authenticated git remote command, or gh-signed-commit.`);return t}async function assertCommandTargets(e,t,n,r){let i=new Set(t.map(e=>e.toLowerCase())),a,o;if(e[0]===`git`){if(e[2]!==`origin`)throw Error(`Authenticated git commands must use the validated origin remote.`);let t=e[1]===`push`,i=await r.run({command:`cd ${shellQuote(n)} && git remote get-url ${t?`--push `:``}origin`,env:{GIT_TERMINAL_PROMPT:`0`,PATH:`/usr/bin:/bin`}});if(i.exitCode!==0)throw Error(`Could not resolve the origin GitHub repository.`);a=repositoryFromRemote(i.stdout.trim()),o=[a]}else if(e[0]===`gh-signed-commit`){if(o=repoFlagTargets(e.slice(1)),o.length===0)throw Error(`gh-signed-commit requires an explicit --repo owner/repository target.`)}else o=repoFlagTargets(e.slice(1)),e[1]===`repo`&&(e[2]===`clone`||e[2]===`view`||e[2]===`fork`)&&e[3]&&!e[3].startsWith(`-`)&&o.push(canonicalRepository(e[3]));for(let e of o)if(!i.has(e.toLowerCase()))throw Error(`Command target ${JSON.stringify(e)} is not in the declared repositories.`);return a}function repoFlagTargets(e){let t=[];for(let n=0;n<e.length;n+=1){let r=e[n];if(r===`--repo`||r===`-R`){let i=e[n+1];if(!i)throw Error(`${r} requires an owner/repository value.`);t.push(canonicalRepository(i)),n+=1}else r?.startsWith(`--repo=`)&&t.push(canonicalRepository(r.slice(7)))}return t}function repositoryFromRemote(e){let t=/^https:\/\/github\.com\/([^/]+\/[^/]+?)(?:\.git)?$/iu.exec(e);if(t?.[1])return canonicalRepository(t[1]);let n=/^git@github\.com:([^/]+\/[^/]+?)(?:\.git)?$/iu.exec(e);if(n?.[1])return canonicalRepository(n[1]);throw Error(`The origin remote is not a canonical GitHub repository URL.`)}function canonicalRepository(e){let t=e.replace(/\.git$/iu,``);if(!/^[A-Za-z0-9-]+\/[A-Za-z0-9._-]+$/u.test(t))throw Error(`Invalid GitHub repository ${JSON.stringify(e)}.`);return t}function repositoryNames(e,t){if(e.length!==1)throw Error(`Exactly one GitHub repository is required.`);let n=new Set;for(let r of e){let e=/^([A-Za-z0-9-]+)\/([A-Za-z0-9._-]+)$/u.exec(r);if(!e)throw Error(`Invalid GitHub repository ${JSON.stringify(r)}.`);if(e[1]?.toLowerCase()!==t.toLowerCase())throw Error(`Repository ${JSON.stringify(r)} is outside ${t}.`);n.add(e[2])}if(n.size!==1)throw Error(`Exactly one GitHub repository is required.`);return[...n]}function executablePath(e){return e===`gh`?GITHUB_TOOLING_PATHS.ghReal:e===`gh-signed-commit`?GITHUB_TOOLING_PATHS.trustedSignedCommit:`git`}function resolveWorkingDirectory(e,t){let n=posix.resolve(`/`,e.resolvePath(``)),r=posix.resolve(`/`,e.resolvePath(t?.trim()||``));if(r!==n&&!r.startsWith(`${n}/`))throw Error(`GitHub command workingDirectory must stay inside the sandbox workspace.`);return r}function sanitizeOutput(e,t,n){let r=e.replaceAll(t,`[redacted]`).replaceAll(n,`[redacted]`);return Buffer.byteLength(r)<=MAX_OUTPUT_BYTES?{value:r,truncated:!1}:{value:`[output truncated: showing final ${MAX_OUTPUT_BYTES} bytes]\n${Buffer.from(r).subarray(-1e5).toString()}`,truncated:!0}}function unsupportedSyntax(){return Error(`GitHub commands support argv syntax only, not pipes, redirects, substitutions, or shell operators.`)}export{executeGitHubShell,githubShellApproval,parseCommand};
1
+ import{shellQuote}from"./shell.js";import{validateRepositoryRoot}from"./repository-root.js";import{GITHUB_TOOLING_PATHS}from"./tooling.js";import{posix}from"node:path";import{getToken}from"#compiled/@vercel/connect/index.js";const MAX_OUTPUT_BYTES=1e5,leaseQueues=new Map,ALLOWED_GIT_REMOTE_COMMANDS=new Set([`fetch`,`ls-remote`,`pull`,`push`]);function githubShellApproval(e){if(!e)return`not-applicable`;try{return validateGitHubShellInput(e),`not-applicable`}catch(e){return{type:`denied`,reason:e instanceof Error?e.message:`Invalid GitHub command.`}}}async function executeGitHubShell(e,t,n){if(!t)throw Error(`GitHub command access is not configured for this agent.`);let r=validateGitHubShellInput(e),i=await n.getSandbox(),a=resolveWorkingDirectory(i,e.workingDirectory);(r[0]===`git`||r[0]===`gh-signed-commit`)&&(a=await validateRepositoryRoot(i,a));let o=e.permissions[0].repositories,s=await assertCommandTargets(r,o,a,i),c=repositoryNames(o,t.org),l={authorizationDetails:[{type:`github_app_installation`,org:t.org,repositories:c}],subject:{type:`app`}},u=await(n.getConnectToken??getToken)(t.connector,l);if(!u)throw Error(`Connect returned an empty token for ${JSON.stringify(t.connector)}.`);let d=o[0];if(t.authorize&&!await t.authorize({auth:n.auth??null,repository:d,token:u}))throw Error(`The current caller is not authorized to access ${d}.`);let f=executablePath(r[0]),p=s?[`-c`,`protocol.allow=never`,`-c`,`protocol.https.allow=always`,r[1],`https://github.com/${s}.git`,...r.slice(3)]:r.slice(1),m=`cd ${shellQuote(a)} && exec ${shellQuote(f)} ${p.map(shellQuote).join(` `)}`,h=`Basic ${Buffer.from(`x-access-token:${u}`).toString(`base64`)}`,g=crypto.randomUUID(),_=`eve-github-${g}`,v=`/tmp/eve-code-gh-${g}`,y=`Basic ${Buffer.from(`x-access-token:${_}`).toString(`base64`)}`,b;try{b=await withGitHubCredentialLease(i,n.sessionId,{authorization:h,placeholder:_,placeholderAuthorization:y,token:u},()=>{let e={GH_CONFIG_DIR:v,GH_PROMPT_DISABLED:`1`};return r[0]!==`git`&&(e.GH_TOKEN=_),e.GIT_CONFIG_COUNT=`2`,e.GIT_CONFIG_KEY_0=`http.https://github.com/.extraheader`,e.GIT_CONFIG_VALUE_0=`Authorization: ${y}`,e.GIT_CONFIG_KEY_1=`core.hooksPath`,e.GIT_CONFIG_VALUE_1=`/dev/null`,e.GIT_TERMINAL_PROMPT=`0`,e.PATH=`/usr/local/bin:/usr/bin:/bin`,i.run({command:m,env:e})},t.broker)}finally{await i.removePath({path:v,recursive:!0,force:!0})}let x=sanitizeOutput(b.stdout,u,h),S=sanitizeOutput(b.stderr,u,h);return{exitCode:b.exitCode,stdout:x.value,stderr:S.value,truncated:x.truncated||S.truncated}}async function withGitHubCredentialLease(e,t,n,r,i){let a=leaseQueues.get(t)??Promise.resolve(),o,s=new Promise(e=>{o=e}),c=a.then(()=>s);leaseQueues.set(t,c),await a;try{return await i(e,{"api.github.com":[{match:{headers:[{key:{exact:`authorization`},value:{regex:`^(?:token|Bearer) ${n.placeholder}$`}}]},transform:[{headers:{authorization:`Bearer ${n.token}`}}]}],"github.com":[{match:{headers:[{key:{exact:`authorization`},value:{exact:n.placeholderAuthorization}}]},transform:[{headers:{authorization:n.authorization}}]}]}),await r()}finally{try{await i(e,null)}finally{o(),leaseQueues.get(t)===c&&leaseQueues.delete(t)}}}function parseCommand(e){let t=e.trim();if(!t)throw Error(`GitHub command must not be empty.`);let n=[],r=``,i=null,a=!1,o=!1;for(let e of t){if(a){r+=e,a=!1,o=!0;continue}if(e===`\\`&&i!==`single`){a=!0,o=!0;continue}if(i===`single`){e===`'`?i=null:r+=e;continue}if(i===`double`){if(e===`"`)i=null;else if(e===`$`||e==="`")throw unsupportedSyntax();else r+=e;continue}if(e===`'`)i=`single`,o=!0;else if(e===`"`)i=`double`,o=!0;else if(/\s/u.test(e))o&&=(n.push(r),r=``,!1);else if(";&|<>$`(){}".includes(e))throw unsupportedSyntax();else r+=e,o=!0}if(a||i)throw Error(`GitHub command contains an unfinished quote or escape.`);if(o&&n.push(r),n.length===0)throw Error(`GitHub command must not be empty.`);return n}function validateGitHubShellInput(e){let t=parseCommand(e.command),n=e.permissions[0];if(e.permissions.length!==1||n?.provider!==`github`)throw Error(`Exactly one GitHub permission is required.`);if(n.access!==`write`)throw Error(`GitHub App commands require explicit write-capable access.`);if(!e.description.trim())throw Error(`description must describe the intended result.`);let[r,i]=t;if(r===`gh`){if(!i)throw Error(`A gh subcommand is required.`)}else if(r===`git`){if(!i||!ALLOWED_GIT_REMOTE_COMMANDS.has(i))throw Error(`Authenticated git supports only fetch, ls-remote, pull, and push; clone with gh repo clone.`)}else if(r!==`gh-signed-commit`)throw Error(`GitHub commands must use gh, an authenticated git remote command, or gh-signed-commit.`);return t}async function assertCommandTargets(e,t,n,r){let i=new Set(t.map(e=>e.toLowerCase())),a,o;if(e[0]===`git`){if(e[2]!==`origin`)throw Error(`Authenticated git commands must use the validated origin remote.`);let t=e[1]===`push`,i=await r.run({command:`cd ${shellQuote(n)} && git remote get-url ${t?`--push `:``}origin`,env:{GIT_TERMINAL_PROMPT:`0`,PATH:`/usr/bin:/bin`}});if(i.exitCode!==0)throw Error(`Could not resolve the origin GitHub repository.`);a=repositoryFromRemote(i.stdout.trim()),o=[a]}else if(e[0]===`gh-signed-commit`){if(o=repoFlagTargets(e.slice(1)),o.length===0)throw Error(`gh-signed-commit requires an explicit --repo owner/repository target.`)}else o=repoFlagTargets(e.slice(1)),e[1]===`repo`&&(e[2]===`clone`||e[2]===`view`||e[2]===`fork`)&&e[3]&&!e[3].startsWith(`-`)&&o.push(canonicalRepository(e[3]));for(let e of o)if(!i.has(e.toLowerCase()))throw Error(`Command target ${JSON.stringify(e)} is not in the declared repositories.`);return a}function repoFlagTargets(e){let t=[];for(let n=0;n<e.length;n+=1){let r=e[n];if(r===`--repo`||r===`-R`){let i=e[n+1];if(!i)throw Error(`${r} requires an owner/repository value.`);t.push(canonicalRepository(i)),n+=1}else r?.startsWith(`--repo=`)&&t.push(canonicalRepository(r.slice(7)))}return t}function repositoryFromRemote(e){let t=/^https:\/\/github\.com\/([^/]+\/[^/]+?)(?:\.git)?$/iu.exec(e);if(t?.[1])return canonicalRepository(t[1]);let n=/^git@github\.com:([^/]+\/[^/]+?)(?:\.git)?$/iu.exec(e);if(n?.[1])return canonicalRepository(n[1]);throw Error(`The origin remote is not a canonical GitHub repository URL.`)}function canonicalRepository(e){let t=e.replace(/\.git$/iu,``);if(!/^[A-Za-z0-9-]+\/[A-Za-z0-9._-]+$/u.test(t))throw Error(`Invalid GitHub repository ${JSON.stringify(e)}.`);return t}function repositoryNames(e,t){if(e.length!==1)throw Error(`Exactly one GitHub repository is required.`);let n=new Set;for(let r of e){let e=/^([A-Za-z0-9-]+)\/([A-Za-z0-9._-]+)$/u.exec(r);if(!e)throw Error(`Invalid GitHub repository ${JSON.stringify(r)}.`);if(e[1]?.toLowerCase()!==t.toLowerCase())throw Error(`Repository ${JSON.stringify(r)} is outside ${t}.`);n.add(e[2])}if(n.size!==1)throw Error(`Exactly one GitHub repository is required.`);return[...n]}function executablePath(e){return e===`gh`?GITHUB_TOOLING_PATHS.ghReal:e===`gh-signed-commit`?GITHUB_TOOLING_PATHS.trustedSignedCommit:`git`}function resolveWorkingDirectory(e,t){let n=posix.resolve(`/`,e.resolvePath(``)),r=posix.resolve(`/`,e.resolvePath(t?.trim()||``));if(r!==n&&!r.startsWith(`${n}/`))throw Error(`GitHub command workingDirectory must stay inside the sandbox workspace.`);return r}function sanitizeOutput(e,t,n){let r=e.replaceAll(t,`[redacted]`).replaceAll(n,`[redacted]`);return Buffer.byteLength(r)<=MAX_OUTPUT_BYTES?{value:r,truncated:!1}:{value:`[output truncated: showing final ${MAX_OUTPUT_BYTES} bytes]\n${Buffer.from(r).subarray(-1e5).toString()}`,truncated:!0}}function unsupportedSyntax(){return Error(`GitHub commands support argv syntax only, not pipes, redirects, substitutions, or shell operators.`)}export{executeGitHubShell,githubShellApproval,parseCommand};
@@ -1 +1 @@
1
- import{buildGatewayAttributionHeaders,withGatewayTraceContext}from"./model.js";import{isEmptyModelResponse,rethrowNoOutputAsEmptyResponse}from"./recovery.js";import{modelInstructions,requestMessages,withTrailingUserNote}from"./request.js";import{answerSkippedToolCalls,appendMissingToolResultMessages,extractToolResultCallIds,withAccumulatedResponseMessages}from"./response.js";import{runModelCallWithRetries}from"./retry.js";import{logToolExecutionError,prepareModelTools}from"./tools.js";import{extractGatewayCostUsd,extractTokenUsageDelta}from"./usage.js";import{ToolLoopAgent,isStepCount}from"ai";import{createLogger,logError}from"#internal/logging.js";import{AuthKey,HistoryStateKey}from"#context/keys.js";import{REPLY_TOOL_NAME}from"#protocol/reply-tool.js";import{createStepCompletedEvent}from"#protocol/message.js";import{activeTurnId}from"#harness/session-machine/view.js";import{addTurnUsage}from"#harness/turn-tag-state.js";import{hydrateSandboxAttachments,moveToolResultFilesToUserMessages}from"#harness/attachment-staging.js";import{workingTaskIds}from"#execution/tasks/model-step.js";import{toEntryStep,toEntryStream,toEntryTelemetry}from"#harness/execute-call.js";import{discardAttempt}from"#harness/session-machine/transitions.js";import{throwIfTurnAborted}from"#harness/turn-cancellation.js";import{summarizeKnownError}from"#harness/semantic-errors/index.js";import{estimateTokens}from"#harness/token-estimate.js";import{requireSessionModelReference}from"#harness/types.js";import{ContentFilteredModelResponseError,EmptyModelResponseError,ModelStreamStalledError}from"#harness/model-call/errors.js";import{resolveModelProfile}from"#harness/model-profile.js";import{estimateRequestEnvelope}from"#harness/request-envelope.js";import{interruptStreamOnFailure}from"#harness/interruptible-stream.js";import{buildToolApproval}from"#harness/tools.js";import{emitStreamContent}from"#harness/emission.js";import{compactPrompt,projectPrompt,withClientContext}from"#harness/step/prompt.js";import{buildStepHooks,emitStepActions,readGatewayGenerationId}from"#harness/step-hooks.js";import{maybeCompact}from"#harness/compaction/step.js";const environment=process.env.NODE_ENV??`unknown`,log=createLogger(`harness.tool-loop`),MODEL_OUTPUT_TIMEOUT_MS=6e5;var ModelCaller=class{profile;attributionHeaders;projectedMessages;request;modelMessages=[];requestEnvelopeTokens=0;interruptedUsage;compactionFailure;attemptIndex=0;step;prompt;input;constructor(e,t,n){this.step=e,this.prompt=t,this.input=n,this.profile=resolveModelProfile(n.model,requireSessionModelReference(e.session).promptCache),this.attributionHeaders=buildGatewayAttributionHeaders(this.profile,e.config.runtimeIdentity),this.projectedMessages=n.projectedMessages,this.request=this.buildRequest()}async call(e){let t=new Map;return await runModelCallWithRetries(async n=>(n>1&&(await this.settleRetriedActions(t),t=new Map),await this.attempt({...e,suppressStepStartedEmission:n!==1||e.suppressStepStartedEmission},t)),{canRetry:()=>this.compactionFailure===void 0,sessionId:this.step.session.sessionId,turnId:this.step.position().turnId},this.input.generation.signal)}async settleRetriedActions(e){for(let[t,n]of e)await this.step.apply(discardAttempt(this.step.view(),{calls:[{callId:t,toolName:n}]})),e.delete(t)}throwIfCompactionFailed(){if(this.compactionFailure!==void 0)throw this.compactionFailure.error}async steered(){let{step:e}=this;return throwIfTurnAborted(e.config.abortSignal),e.ctx?.set(HistoryStateKey,this.request.historyState),this.interruptedUsage!==void 0&&(e.session=addTurnUsage(e.session,e.position().turnId,this.interruptedUsage)),await e.emit?.(createStepCompletedEvent({...e.position(),finishReason:`other`,usage:this.interruptedUsage})),{next:e.runStep,session:{...e.session,history:[...this.request.history]},steered:!0}}clearInterruptedUsage(){this.interruptedUsage=void 0}buildRequest(){return requestMessages(this.step,{catalog:this.input.catalog,hidesHeldText:this.input.hidesHeldText,messages:this.prompt.messages,pendingApprovalsNote:this.input.pendingApprovalsNote,projectedMessages:this.projectedMessages,turnMessages:this.input.turnMessages})}instructions(e){return modelInstructions({anthropicCache:this.profile.anthropicCache,extraSystemNote:e,session:this.step.session,systemMessages:this.request.systemMessages})}async prepare(e){let t=await prepareModelTools(this.step,{catalog:this.input.catalog,disabledProviderTools:e.disabledProviderTools,generation:this.input.generation,profile:this.profile});return this.request=this.buildRequest(),this.requestEnvelopeTokens=await estimateRequestEnvelope({history:this.projectedMessages,instructions:this.instructions(e.extraSystemNote),messages:withTrailingUserNote(this.request.nonSystemMessages,e.trailingUserNote),tools:t}),t}async compact(e,t){let{step:n,prompt:r}=this,{config:i}=n,a;try{if(a=await maybeCompact({abortSignal:i.abortSignal,auth:n.ctx?.get(AuthKey)??null,emissionState:n.position(),historyProjector:i.historyProjector,messages:[...r.messages],model:this.input.model,promptMessages:withClientContext(r),publish:n.publish,requestEnvelopeTokens:this.requestEnvelopeTokens,resolveModel:i.resolveModel,runtimeIdentity:i.runtimeIdentity,session:n.session,telemetry:n.instrumentation?.telemetry(),traceContextHeaders:n.instrumentation?.gatewayTraceContextHeaders}),a.failure!==void 0)throw a.failure.error}catch(e){throw this.compactionFailure={error:e},e}if(n.session=a.session,!a.compacted)return t;compactPrompt(n,r,a.messages);let{compaction:o}=n.session;return n.session={...n.session,compaction:{recentWindowSize:o.recentWindowSize,threshold:o.threshold,thresholdPercent:o.thresholdPercent}},this.projectedMessages=projectPrompt(n,r),await this.prepare(e)}async attempt(e,t){let{step:n}=this,{catalog:r,generation:i,model:a}=this.input,o=await this.compact(e,await this.prepare(e));this.requestEnvelopeTokens=Math.max(0,this.requestEnvelopeTokens-(estimateTokens(this.request.history)-estimateTokens(this.prompt.messages))),i.begin(),this.modelMessages=await hydrateSandboxAttachments(this.request.nonSystemMessages),this.profile.filesOutsideToolResults&&(this.modelMessages=moveToolResultFilesToUserMessages(this.modelMessages));let s=this.instructions(e.extraSystemNote),c=n.instrumentation?.resolveRuntimeContext({emissionState:n.position(),environment,modelInput:{instructions:s,messages:this.modelMessages},session:n.session})??{};e.retryReason&&(c[`eve.retry.reason`]=e.retryReason);let l=withTrailingUserNote(this.modelMessages,e.trailingUserNote),u=n.position(),d=n.instrumentation?.prepareAttempt({isFrameworkTool:e=>n.frameworkToolNames.has(e),attemptIndex:this.attemptIndex++,runtimeContext:c,stepIndex:u.stepIndex,turnId:activeTurnId(u)});this.input.setAttemptScope(d?.scope);let f=buildStepHooks({auth:n.ctx?.get(AuthKey)??null,profile:this.profile,session:n.session,startStep:e.suppressStepStartedEmission===!0?void 0:this.input.startStep}),p={headers:this.attributionHeaders,instructions:s,model:withGatewayTraceContext(a,this.profile,this.step.instrumentation?.gatewayTraceContextHeaders),onLanguageModelCallEnd:e=>{i.interrupted||(this.interruptedUsage=extractTokenUsageDelta({costUsd:extractGatewayCostUsd(e.providerMetadata),usage:e.usage}))},onToolExecutionEnd:e=>logToolExecutionError(e,r.resolve),onError(e){i.interrupted||summarizeKnownError(e.error)?.tags.includes(`config`)!==!0&&logError(log,`tool-loop stream error`,e.error)},onStepEnd:f.onStepEnd,onStepStart:f.onStepStart,prepareStep:f.prepareStep,reasoning:n.session.agent.modelReference?.reasoning??n.session.agent.reasoning,runtimeContext:c,stopWhen:isStepCount(1),telemetry:toEntryTelemetry(d?.telemetry,r.resolve),timeout:{chunkMs:MODEL_OUTPUT_TIMEOUT_MS,firstChunkMs:MODEL_OUTPUT_TIMEOUT_MS},toolApproval:buildToolApproval({abortSignal:i.signal,approvedTools:this.input.approvedTools,resolve:r.resolve}),tools:o},m=new ToolLoopAgent(p);try{let e=await this.stream(m,l,f.stepResult,t);return await d?.complete(),e}catch(e){if(i.interrupted?await d?.complete():await d?.fail(e),i.check(),isAbortError(e)&&!i.signal.aborted)throw new ModelStreamStalledError({cause:e});return rethrowNoOutputAsEmptyResponse(e)}}async stream(e,t,n,r){let{step:i}=this,{catalog:a,generation:o}=this.input,s=new Set([REPLY_TOOL_NAME]),c=await e.stream({abortSignal:o.signal,messages:t}),{emittedActionCallIds:l,handledInlineToolResultCallIds:u,invalidInputToolCallIds:d,inlineAuthorizationResults:f,trailingInlineToolResultParts:p}=await emitStreamContent(i.publish,i.position(),toEntryStream(interruptStreamOnFailure(c.fullStream,o.signal),a.resolve),{excludedActionToolNames:s,hidesHeldText:this.input.hidesHeldText&&workingTaskIds(i.session).length>0,tools:a,unsettledActionToolNames:r});throwIfTurnAborted(i.config.abortSignal),o.check();let[m,h]=toEntryStep(...await Promise.all([n,c.responseMessages]),a.resolve);assertUsableResponse(m,h,f.length>0||p.length>0);let g=answerSkippedToolCalls(m,a);await emitStepActions(i.publish,i.position(),g.length===0?m:withAccumulatedResponseMessages({stepResult:m,responseMessages:appendMissingToolResultMessages({append:g,responseMessages:m.response.messages})}),{emittedActionCallIds:l,excludedActionCallIds:d,excludedActionToolNames:s,handledInlineToolResultCallIds:u,tools:a});let _=new Map(m.toolResults.map(e=>[e.toolCallId,e]));for(let e of f)_.set(e.toolCallId,e);return withAccumulatedResponseMessages({invalidInputToolCallIds:d,responseMessages:appendMissingToolResultMessages({append:[...p,...answerSkippedToolCalls(m,a)],responseMessages:h}),stepResult:m,toolResults:[..._.values()]})}};function assertUsableResponse(e,t,n){if(e.finishReason===`content-filter`)throw new ContentFilteredModelResponseError(readGatewayGenerationId(e.providerMetadata));if(isEmptyModelResponse(e)&&extractToolResultCallIds(t).size===0&&!n)throw new EmptyModelResponseError}function isAbortError(e){return e instanceof Error&&(e.name===`AbortError`||e.name===`TimeoutError`)}export{ModelCaller};
1
+ import{buildGatewayAttributionHeaders,withGatewayTraceContext}from"./model.js";import{isEmptyModelResponse,rethrowNoOutputAsEmptyResponse}from"./recovery.js";import{modelInstructions,requestMessages,withTrailingUserNote}from"./request.js";import{answerSkippedToolCalls,appendMissingToolResultMessages,extractToolResultCallIds,withAccumulatedResponseMessages}from"./response.js";import{runModelCallWithRetries}from"./retry.js";import{logToolExecutionError,prepareModelTools}from"./tools.js";import{extractGatewayCostUsd,extractTokenUsageDelta}from"./usage.js";import{ToolLoopAgent,isStepCount}from"ai";import{createLogger,logError}from"#internal/logging.js";import{AuthKey,HistoryStateKey}from"#context/keys.js";import{REPLY_TOOL_NAME}from"#protocol/reply-tool.js";import{createStepCompletedEvent}from"#protocol/message.js";import{activeTurnId}from"#harness/session-machine/view.js";import{addTurnUsage}from"#harness/turn-tag-state.js";import{hydrateSandboxAttachments,moveToolResultFilesToUserMessages}from"#harness/attachment-staging.js";import{workingTaskIds}from"#execution/tasks/model-step.js";import{toEntryStep,toEntryStream,toEntryTelemetry}from"#harness/execute-call.js";import{discardAttempt}from"#harness/session-machine/transitions.js";import{throwIfTurnAborted}from"#harness/turn-cancellation.js";import{summarizeKnownError}from"#harness/semantic-errors/index.js";import{estimateTokens}from"#harness/token-estimate.js";import{requireSessionModelReference}from"#harness/types.js";import{ContentFilteredModelResponseError,EmptyModelResponseError,ModelStreamStalledError}from"#harness/model-call/errors.js";import{resolveModelProfile}from"#harness/model-profile.js";import{estimateRequestEnvelope}from"#harness/request-envelope.js";import{interruptStreamOnFailure}from"#harness/interruptible-stream.js";import{buildToolApproval}from"#harness/tools.js";import{emitStreamContent}from"#harness/emission.js";import{compactPrompt,projectPrompt,withClientContext}from"#harness/step/prompt.js";import{buildStepHooks,emitStepActions,readGatewayGenerationId}from"#harness/step-hooks.js";import{maybeCompact}from"#harness/compaction/step.js";const environment=process.env.NODE_ENV??`unknown`,log=createLogger(`harness.tool-loop`),MODEL_OUTPUT_TIMEOUT_MS=6e5;var ModelCaller=class{profile;attributionHeaders;projectedMessages;request;modelMessages=[];requestEnvelopeTokens=0;interruptedUsage;compactionFailure;attemptIndex=0;step;prompt;input;constructor(e,t,n){this.step=e,this.prompt=t,this.input=n,this.profile=resolveModelProfile(n.model,requireSessionModelReference(e.session).promptCache),this.attributionHeaders=buildGatewayAttributionHeaders(this.profile,e.config.runtimeIdentity),this.projectedMessages=n.projectedMessages,this.request=this.buildRequest()}async call(e){let t=new Map;return await runModelCallWithRetries(async n=>(n>1&&(await this.settleRetriedActions(t),t=new Map),await this.attempt({...e,suppressStepStartedEmission:n!==1||e.suppressStepStartedEmission},t)),{canRetry:()=>this.compactionFailure===void 0,sessionId:this.step.session.sessionId,turnId:this.step.position().turnId},this.input.generation.signal)}async settleRetriedActions(e){for(let[t,n]of e)await this.step.apply(discardAttempt(this.step.view(),{calls:[{callId:t,toolName:n}]})),e.delete(t)}throwIfCompactionFailed(){if(this.compactionFailure!==void 0)throw this.compactionFailure.error}async steered(){let{step:e}=this;return throwIfTurnAborted(e.config.abortSignal),e.ctx?.set(HistoryStateKey,this.request.historyState),this.interruptedUsage!==void 0&&(e.session=addTurnUsage(e.session,e.position().turnId,this.interruptedUsage)),await e.emit?.(createStepCompletedEvent({...e.position(),finishReason:`other`,usage:this.interruptedUsage})),{next:e.runStep,session:{...e.session,history:[...this.request.history]},steered:!0}}clearInterruptedUsage(){this.interruptedUsage=void 0}buildRequest(){return requestMessages(this.step,{catalog:this.input.catalog,hidesHeldText:this.input.hidesHeldText,messages:this.prompt.messages,pendingApprovalsNote:this.input.pendingApprovalsNote,projectedMessages:this.projectedMessages,turnMessages:this.input.turnMessages})}instructions(e){return modelInstructions({anthropicCache:this.profile.anthropicCache,extraSystemNote:e,session:this.step.session,systemMessages:this.request.systemMessages})}async prepare(e){let t=await prepareModelTools(this.step,{catalog:this.input.catalog,disabledProviderTools:e.disabledProviderTools,generation:this.input.generation,profile:this.profile});return this.request=this.buildRequest(),this.requestEnvelopeTokens=await estimateRequestEnvelope({history:this.projectedMessages,instructions:this.instructions(e.extraSystemNote),messages:withTrailingUserNote(this.request.nonSystemMessages,e.trailingUserNote),tools:t}),t}async compact(e,t){let{step:n,prompt:r}=this,{config:i}=n,a;try{if(a=await maybeCompact({abortSignal:i.abortSignal,auth:n.ctx?.get(AuthKey)??null,emissionState:n.position(),historyProjector:i.historyProjector,messages:[...r.messages],model:this.input.model,promptMessages:withClientContext(r),publish:n.publish,requestEnvelopeTokens:this.requestEnvelopeTokens,resolveModel:i.resolveModel,runtimeIdentity:i.runtimeIdentity,session:n.session,telemetry:n.instrumentation?.telemetry(),traceContextHeaders:n.instrumentation?.gatewayTraceContextHeaders}),a.failure!==void 0)throw a.failure.error}catch(e){throw this.compactionFailure={error:e},e}if(n.session=a.session,!a.compacted)return t;compactPrompt(n,r,a.messages);let{compaction:o}=n.session;return n.session={...n.session,compaction:{recentWindowSize:o.recentWindowSize,threshold:o.threshold,thresholdPercent:o.thresholdPercent}},this.projectedMessages=projectPrompt(n,r),await this.prepare(e)}async attempt(e,t){let{step:n}=this,{catalog:r,generation:i,model:a}=this.input,o=await this.compact(e,await this.prepare(e));this.requestEnvelopeTokens=Math.max(0,this.requestEnvelopeTokens-(estimateTokens(this.request.history)-estimateTokens(this.prompt.messages))),i.begin(),this.modelMessages=await hydrateSandboxAttachments(this.request.nonSystemMessages),this.profile.filesOutsideToolResults&&(this.modelMessages=moveToolResultFilesToUserMessages(this.modelMessages));let s=this.instructions(e.extraSystemNote),c=n.instrumentation?.resolveRuntimeContext({emissionState:n.position(),environment,modelInput:{instructions:s,messages:this.modelMessages},session:n.session})??{};e.retryReason&&(c[`eve.retry.reason`]=e.retryReason);let l=withTrailingUserNote(this.modelMessages,e.trailingUserNote),u=n.position(),d=n.instrumentation?.prepareAttempt({isFrameworkTool:e=>n.frameworkToolNames.has(e),attemptIndex:this.attemptIndex++,runtimeContext:c,stepIndex:u.stepIndex,turnId:activeTurnId(u)});this.input.setAttemptScope(d?.scope);let f=buildStepHooks({auth:n.ctx?.get(AuthKey)??null,profile:this.profile,session:n.session,startStep:e.suppressStepStartedEmission===!0?void 0:this.input.startStep}),p={headers:this.attributionHeaders,instructions:s,model:withGatewayTraceContext(a,this.profile,this.step.instrumentation?.gatewayTraceContextHeaders),onLanguageModelCallEnd:e=>{i.interrupted||(this.interruptedUsage=extractTokenUsageDelta({costUsd:extractGatewayCostUsd(e.providerMetadata),usage:e.usage}))},onToolExecutionEnd:e=>logToolExecutionError(e,r.resolve),onError(e){i.interrupted||summarizeKnownError(e.error)?.tags.includes(`config`)!==!0&&logError(log,`tool-loop stream error`,e.error)},onStepEnd:f.onStepEnd,onStepStart:f.onStepStart,prepareStep:f.prepareStep,reasoning:n.session.agent.modelReference?.reasoning??n.session.agent.reasoning,runtimeContext:c,stopWhen:isStepCount(1),telemetry:toEntryTelemetry(d?.telemetry,r.resolve),timeout:{chunkMs:MODEL_OUTPUT_TIMEOUT_MS,firstChunkMs:MODEL_OUTPUT_TIMEOUT_MS},toolApproval:buildToolApproval({abortSignal:i.signal,approvedTools:this.input.approvedTools,resolve:r.resolve}),tools:o},m=new ToolLoopAgent(p);try{let e=await this.stream(m,l,f.stepResult,t);return await d?.complete(),e}catch(e){if(i.interrupted?await d?.complete():await d?.fail(e),i.check(),isAbortError(e)&&!i.signal.aborted)throw new ModelStreamStalledError({cause:e});return rethrowNoOutputAsEmptyResponse(e)}}async stream(e,t,n,r){let{step:i}=this,{catalog:a,generation:o}=this.input,s=new Set([REPLY_TOOL_NAME]),c=await e.stream({abortSignal:o.signal,messages:t}),{emittedActionCallIds:l,handledInlineToolResultCallIds:u,invalidInputToolCallIds:d,inlineAuthorizationResults:f,trailingInlineToolResultParts:p}=await emitStreamContent(i.publish,i.position(),toEntryStream(interruptStreamOnFailure(c.fullStream,o.signal),a.resolve),{excludedActionToolNames:s,hidesHeldText:this.input.hidesHeldText&&workingTaskIds(i.session).length>0,tools:a,unsettledActionToolNames:r});throwIfTurnAborted(i.config.abortSignal),o.check();let[m,h]=toEntryStep(...await Promise.all([n,c.responseMessages]),a.resolve);assertUsableResponse(m,h,{allowEmptyStop:!i.hasDelegatedCaller,hasInlineResults:f.length>0||p.length>0});let g=answerSkippedToolCalls(m,a);await emitStepActions(i.publish,i.position(),g.length===0?m:withAccumulatedResponseMessages({stepResult:m,responseMessages:appendMissingToolResultMessages({append:g,responseMessages:m.response.messages})}),{emittedActionCallIds:l,excludedActionCallIds:d,excludedActionToolNames:s,handledInlineToolResultCallIds:u,tools:a});let _=new Map(m.toolResults.map(e=>[e.toolCallId,e]));for(let e of f)_.set(e.toolCallId,e);return withAccumulatedResponseMessages({invalidInputToolCallIds:d,responseMessages:appendMissingToolResultMessages({append:[...p,...answerSkippedToolCalls(m,a)],responseMessages:h}),stepResult:m,toolResults:[..._.values()]})}};function assertUsableResponse(e,t,n){if(e.finishReason===`content-filter`)throw new ContentFilteredModelResponseError(readGatewayGenerationId(e.providerMetadata));if(!(n.allowEmptyStop&&e.finishReason===`stop`)&&isEmptyModelResponse(e)&&extractToolResultCallIds(t).size===0&&!n.hasInlineResults)throw new EmptyModelResponseError}function isAbortError(e){return e instanceof Error&&(e.name===`AbortError`||e.name===`TimeoutError`)}export{ModelCaller};
@@ -42,8 +42,8 @@ export declare function extractModelCallErrorDetails(error: unknown): JsonObject
42
42
  /**
43
43
  * A model call that produced no content. Raised by the model caller from
44
44
  * either of its two triggers: `isEmptyModelResponse` (a completed step
45
- * with finishReason 'other' and no output — AI Gateway HTTP 200 whose
46
- * stream carries no content, no usage, and no error) or
45
+ * with no usable output — e.g. AI Gateway HTTP 200 whose stream carries no
46
+ * content, no usage, and no error, or a delegated session's empty reply) or
47
47
  * {@link isNoOutputGeneratedError} (the AI SDK rejecting a stream that
48
48
  * closed after metadata without output, normalized via the model call's
49
49
  * rethrow so both shapes funnel into one recovery).
@@ -33,9 +33,8 @@ export declare function recoverModelCall(input: {
33
33
  readonly error: unknown;
34
34
  }>;
35
35
  /**
36
- * True when a step produced no assistant text and no tool calls. A blank
37
- * response is ambiguous and must be retried instead of silently dropping a
38
- * HITL reply.
36
+ * Whether a step produced no assistant text or tool work. The caller decides
37
+ * whether a successful empty `stop` is usable for the session.
39
38
  */
40
39
  export declare function isEmptyModelResponse(step: HarnessStepResult): boolean;
41
40
  /**
@@ -1,5 +1,6 @@
1
1
  import type { ContextContainer } from "#context/container.js";
2
+ import { type InstrumentationDecision } from "#shared/instrumentation-decision.js";
2
3
  export declare function initializeSessionInstrumentation(input: {
3
4
  readonly agentName: string;
4
5
  readonly ctx: ContextContainer;
5
- }): void;
6
+ }): InstrumentationDecision;
@@ -1 +1 @@
1
- import{createLogger}from"#internal/logging.js";import{ConversationContextKey,resolveConversationContext}from"#shared/conversation-context.js";import{formatTraceContentCeiling,readForwardedTraceAssertion,traceContentCeilingToDecision}from"#shared/forwarded-trace-policy.js";import{AuthKey,ChannelInstrumentationKey,OtelTraceEnabledKey,ParentTraceContextKey,SessionTraceSeedKey}from"#context/keys.js";import{resolveInstrumentationEnvironment}from"#internal/application/dev-environment.js";import{isSampledTrace,resolveTracePolicy,resolveTracePolicyDecision}from"#shared/trace-policy.js";import{AgentSpanIdGenerator}from"#compiled/@eve/tracing/index.js";import{intersectInstrumentationDecisions,readInstrumentationDecision}from"#shared/instrumentation-decision.js";import{getInstrumentationRuntime}from"#instrumentation/runtime-global.js";const log=createLogger(`instrumentation.session-init`);function initializeSessionInstrumentation(e){let t=getInstrumentationRuntime(),n=e.ctx.get(ParentTraceContextKey),r=readForwardedTraceAssertion(n?.forwardedTracePolicy),i=e.ctx.get(ConversationContextKey),a=resolveConversationContext(i,{channelKind:e.ctx.get(ChannelInstrumentationKey)?.kind,environment:resolveInstrumentationEnvironment(),forwardedTracePolicy:r,principalType:e.ctx.get(AuthKey)?.principalType},{forwardedOverridesStored:!0}),o=allocateSessionTraceSeed({agentName:e.agentName,conversation:a,channelType:e.ctx.get(ChannelInstrumentationKey)?.channelType,forwardedTracePolicy:r,parentTraceContext:n,runtime:t});if(o!==void 0&&(e.ctx.set(SessionTraceSeedKey,o),r!==void 0&&log.info(`resolved forwarded trace policy`,{ceilingEffective:o.decision?.action===`record`?formatTraceContentCeiling(o.decision):`drop`,ceilingIn:formatTraceContentCeiling(r.ceiling),originAudience:r.originAudience}),r!==void 0&&n!==void 0)){let t={...n,decision:o.decision,traceFlags:o.traceFlags};delete t.forwardedTracePolicy,e.ctx.set(ParentTraceContextKey,t)}e.ctx.set(OtelTraceEnabledKey,t?.prepareSessionTrace!==void 0)}function allocateSessionTraceSeed(e){let localDecision=()=>resolveTracePolicy(e.runtime?.otelSettings?.tracePolicy,{agentName:e.agentName,...e.conversation});if(e.parentTraceContext!==void 0){let t=e.forwardedTracePolicy?traceContentCeilingToDecision(e.forwardedTracePolicy.ceiling):void 0,n=readInstrumentationDecision(e.parentTraceContext.decision),r=isSampledTrace(e.parentTraceContext)?t?n===void 0?t:intersectInstrumentationDecisions(t,n):n??resolveTracePolicyDecision(isSampledTrace(e.parentTraceContext),e.conversation):{action:`drop`},i=`isRemote`in e.parentTraceContext&&e.parentTraceContext.isRemote===!0,a=e.forwardedTracePolicy||i?intersectInstrumentationDecisions(r,localDecision()):r,o=e.runtime?.idGenerator??new AgentSpanIdGenerator;return{decision:a,...e.forwardedTracePolicy===void 0?void 0:{forwardedTracePolicy:e.forwardedTracePolicy},spanId:o.allocateSpanId(),traceFlags:a.action===`drop`?0:e.parentTraceContext.traceFlags,traceId:i?o.generateTraceId():e.parentTraceContext.traceId}}if(e.runtime?.prepareSessionTrace===void 0||e.runtime.idGenerator===void 0)return;let t=localDecision(),n=e.runtime.idGenerator.generateTraceId(),r=t.action===`record`;return{decision:t,spanId:e.runtime.idGenerator.allocateSpanId(),traceFlags:+!!r,traceId:n}}export{initializeSessionInstrumentation};
1
+ import{createLogger}from"#internal/logging.js";import{ConversationContextKey,resolveConversationContext}from"#shared/conversation-context.js";import{formatTraceContentCeiling,readForwardedTraceAssertion,traceContentCeilingToDecision}from"#shared/forwarded-trace-policy.js";import{AuthKey,ChannelInstrumentationKey,OtelTraceEnabledKey,ParentTraceContextKey,SessionTraceSeedKey}from"#context/keys.js";import{resolveInstrumentationEnvironment}from"#internal/application/dev-environment.js";import{isSampledTrace,resolveTracePolicy,resolveTracePolicyDecision}from"#shared/trace-policy.js";import{AgentSpanIdGenerator}from"#compiled/@eve/tracing/index.js";import{intersectInstrumentationDecisions,readInstrumentationDecision}from"#shared/instrumentation-decision.js";import{getInstrumentationRuntime}from"#instrumentation/runtime-global.js";const log=createLogger(`instrumentation.session-init`);function initializeSessionInstrumentation(e){let t=getInstrumentationRuntime(),n=e.ctx.get(ParentTraceContextKey),r=readForwardedTraceAssertion(n?.forwardedTracePolicy),i=e.ctx.get(ConversationContextKey),a=resolveConversationContext(i,{channelKind:e.ctx.get(ChannelInstrumentationKey)?.kind,environment:resolveInstrumentationEnvironment(),forwardedTracePolicy:r,principalType:e.ctx.get(AuthKey)?.principalType},{forwardedOverridesStored:!0}),o=allocateSessionTraceSeed({agentName:e.agentName,conversation:a,channelType:e.ctx.get(ChannelInstrumentationKey)?.channelType,forwardedTracePolicy:r,parentTraceContext:n,runtime:t});if(o!==void 0&&(e.ctx.set(SessionTraceSeedKey,o),r!==void 0&&log.info(`resolved forwarded trace policy`,{ceilingEffective:o.decision?.action===`record`?formatTraceContentCeiling(o.decision):`drop`,ceilingIn:formatTraceContentCeiling(r.ceiling),originAudience:r.originAudience}),r!==void 0&&n!==void 0)){let t={...n,decision:o.decision,traceFlags:o.traceFlags};delete t.forwardedTracePolicy,e.ctx.set(ParentTraceContextKey,t)}return e.ctx.set(OtelTraceEnabledKey,t?.prepareSessionTrace!==void 0),o?.decision??resolveTracePolicy(t?.otelSettings?.tracePolicy,{agentName:e.agentName,...a})}function allocateSessionTraceSeed(e){let localDecision=()=>resolveTracePolicy(e.runtime?.otelSettings?.tracePolicy,{agentName:e.agentName,...e.conversation});if(e.parentTraceContext!==void 0){let t=e.forwardedTracePolicy?traceContentCeilingToDecision(e.forwardedTracePolicy.ceiling):void 0,n=readInstrumentationDecision(e.parentTraceContext.decision),r=isSampledTrace(e.parentTraceContext)?t?n===void 0?t:intersectInstrumentationDecisions(t,n):n??resolveTracePolicyDecision(isSampledTrace(e.parentTraceContext),e.conversation):{action:`drop`},i=`isRemote`in e.parentTraceContext&&e.parentTraceContext.isRemote===!0,a=e.forwardedTracePolicy||i?intersectInstrumentationDecisions(r,localDecision()):r,o=e.runtime?.idGenerator??new AgentSpanIdGenerator;return{decision:a,...e.forwardedTracePolicy===void 0?void 0:{forwardedTracePolicy:e.forwardedTracePolicy},spanId:o.allocateSpanId(),traceFlags:a.action===`drop`?0:e.parentTraceContext.traceFlags,traceId:i?o.generateTraceId():e.parentTraceContext.traceId}}if(e.runtime?.prepareSessionTrace===void 0||e.runtime.idGenerator===void 0)return;let t=localDecision(),n=e.runtime.idGenerator.generateTraceId(),r=t.action===`record`;return{decision:t,spanId:e.runtime.idGenerator.allocateSpanId(),traceFlags:+!!r,traceId:n}}export{initializeSessionInstrumentation};
@@ -1 +1 @@
1
- const STAMPED_PACKAGE_VERSION=`0.79.2`;function readStampedPackageVersion(){return STAMPED_PACKAGE_VERSION.startsWith(`__`)?void 0:STAMPED_PACKAGE_VERSION}export{readStampedPackageVersion};
1
+ const STAMPED_PACKAGE_VERSION=`0.80.0`;function readStampedPackageVersion(){return STAMPED_PACKAGE_VERSION.startsWith(`__`)?void 0:STAMPED_PACKAGE_VERSION}export{readStampedPackageVersion};
@@ -1 +1 @@
1
- import{expectObjectRecord,expectOnlyKnownKeys}from"#internal/authored-module.js";import{parseJsonValue}from"#shared/json.js";import{normalizeApproval}from"#internal/authored-definition/approval.js";import{normalizeAuthorizationSpec}from"#shared/validate-authorization.js";const KNOWN_TOP_LEVEL_KEYS=[`approval`,`auth`,`description`,`forwardPrincipal`,`headers`,`instanceKey`,`protocolVersionDiscovery`,`toolCall`,`tools`,`url`],KNOWN_OPENAPI_TOP_LEVEL_KEYS=[`approval`,`auth`,`baseUrl`,`description`,`headers`,`instanceKey`,`operations`,`spec`,`toolCall`],KNOWN_AUTHORIZATION_KEYS=[`completeAuthorization`,`credentialOwner`,`evict`,`getToken`,`principalType`,`startAuthorization`,`vercelConnect`],KNOWN_TOOL_CALL_KEYS=[`providedArguments`];function normalizeMcpClientConnectionDefinition(e,t){let n=expectObjectRecord(e,t);expectOnlyKnownKeys(n,KNOWN_TOP_LEVEL_KEYS,t),validateUrl(n,t),validateDescription(n,t),validateInstanceKey(n,t);let r=normalizeAuthorization(n,t),i=normalizeHeaders(n,t),a=normalizeConnectionToolCall(n,t),o=normalizeToolFilter(n,t);if(r!==void 0&&i!==void 0&&typeof i!=`function`&&Object.keys(i).some(e=>e.toLowerCase()===`authorization`))throw Error(`${t} "headers" must not include an "Authorization" key when "auth" is also provided.`);let s={description:n.description,url:n.url};if(n.protocolVersionDiscovery!==void 0){if(typeof n.protocolVersionDiscovery!=`boolean`)throw Error(`${t} "protocolVersionDiscovery" must be a boolean.`);s.protocolVersionDiscovery=n.protocolVersionDiscovery}if(n.forwardPrincipal!==void 0){if(typeof n.forwardPrincipal!=`boolean`)throw Error(`${t} "forwardPrincipal" must be a boolean.`);s.forwardPrincipal=n.forwardPrincipal}return n.instanceKey!==void 0&&(s.instanceKey=n.instanceKey),r!==void 0&&(s.auth=r),i!==void 0&&(s.headers=i),a!==void 0&&(s.toolCall=a),o!==void 0&&(s.tools=o),n.approval!==void 0&&(s.approval=normalizeApproval(n.approval,t)),s}function normalizeConnectionToolCall(e,t){if(e.toolCall===void 0)return;let n=expectObjectRecord(e.toolCall,`${t} The "toolCall" field must be a plain object.`);if(expectOnlyKnownKeys(n,KNOWN_TOOL_CALL_KEYS,`${t} The "toolCall" field`),n.providedArguments===void 0)return{};let r=expectObjectRecord(n.providedArguments,`${t} The "toolCall.providedArguments" field must be a plain object.`);for(let[e,n]of Object.entries(r))if(typeof n!=`function`&&!(typeof n==`object`&&n&&typeof n.then==`function`))try{parseJsonValue(n)}catch{throw Error(`${t} The "toolCall.providedArguments.${e}" value must be JSON-serializable, a Promise, or a function.`)}return{providedArguments:r}}function normalizeOpenApiConnectionDefinition(e,t){let n=expectObjectRecord(e,t);expectOnlyKnownKeys(n,KNOWN_OPENAPI_TOP_LEVEL_KEYS,t),validateSpec(n,t),validateBaseUrl(n,t),validateDescription(n,t),validateInstanceKey(n,t);let r=normalizeAuthorization(n,t),i=normalizeHeaders(n,t),a=normalizeFilterField(n,`operations`,t),o=normalizeConnectionToolCall(n,t);if(r!==void 0&&i!==void 0&&typeof i!=`function`&&Object.keys(i).some(e=>e.toLowerCase()===`authorization`))throw Error(`${t} "headers" must not include an "Authorization" key when "auth" is also provided.`);let s={description:n.description,spec:n.spec};return n.baseUrl!==void 0&&(s.baseUrl=n.baseUrl),n.instanceKey!==void 0&&(s.instanceKey=n.instanceKey),r!==void 0&&(s.auth=r),i!==void 0&&(s.headers=i),o!==void 0&&(s.toolCall=o),a!==void 0&&(s.operations=a),n.approval!==void 0&&(s.approval=normalizeApproval(n.approval,t)),s}function validateSpec(e,t){let n=e.spec;if(typeof n==`string`){if(!URL.canParse(n))throw Error(`${t} The "spec" field must be a valid URL when provided as a string.`);let e=new URL(n);if(e.protocol!==`https:`&&e.protocol!==`http:`)throw Error(`${t} The "spec" URL must use the http or https protocol, got "${e.protocol}".`);return}if(typeof n!=`object`||!n||Array.isArray(n))throw Error(`${t} The "spec" field must be a URL string or an inline OpenAPI document object.`)}function validateBaseUrl(e,t){if(e.baseUrl===void 0)return;if(typeof e.baseUrl!=`string`||!URL.canParse(e.baseUrl))throw Error(`${t} The "baseUrl" field must be a valid URL when provided.`);let n=new URL(e.baseUrl);if(n.protocol!==`https:`&&n.protocol!==`http:`)throw Error(`${t} The "baseUrl" field must use the http or https protocol, got "${n.protocol}".`)}function validateUrl(e,t){if(typeof e.url!=`string`||!URL.canParse(e.url))throw Error(`${t} The "url" field must be a valid URL.`);let n=new URL(e.url);if(n.protocol!==`https:`&&n.protocol!==`http:`)throw Error(`${t} The "url" field must use the http or https protocol, got "${n.protocol}".`)}function validateDescription(e,t){if(typeof e.description!=`string`||e.description.length===0)throw Error(`${t} The "description" field must be a non-empty string.`)}function validateInstanceKey(e,t){if(e.instanceKey!==void 0&&(typeof e.instanceKey!=`string`||e.instanceKey.length===0))throw Error(`${t} The "instanceKey" field must be a non-empty string.`)}function normalizeAuthorization(e,t){if(e.auth===void 0)return;if(typeof e.auth==`function`)return e.auth;let n=expectObjectRecord(e.auth,`${t} The "auth" field must be an object with a "getToken" method or a function.`);return expectOnlyKnownKeys(n,KNOWN_AUTHORIZATION_KEYS,`${t} The "auth" field`),normalizeAuthorizationSpec(n,t)}function normalizeHeaders(e,t){if(e.headers===void 0)return;if(typeof e.headers==`function`)return e.headers;if(typeof e.headers!=`object`||e.headers===null||Array.isArray(e.headers))throw Error(`${t} The "headers" field must be a plain object or a function.`);let n=e.headers;for(let[e,r]of Object.entries(n)){let n=typeof r;if(n!==`string`&&n!==`function`&&n!==`object`||n===`object`&&(r===null||typeof r.then!=`function`))throw Error(`${t} The "headers.${e}" value must be a string, Promise, or function.`)}return n}function normalizeToolFilter(e,t){return normalizeFilterField(e,`tools`,t)}function normalizeFilterField(e,t,n){let r=e[t];if(r===void 0)return;if(typeof r!=`object`||!r||Array.isArray(r))throw Error(`${n} The "${t}" field must specify either "allow" or "block".`);let i=r,a=`allow`in i,o=`block`in i;if(a&&o)throw Error(`${n} The "${t}" field must specify either "allow" or "block", not both.`);if(!a&&!o)throw Error(`${n} The "${t}" field must specify either "allow" or "block".`);return a?(validateStringArray(i.allow,`${n} The "${t}.allow"`),{allow:i.allow}):(validateStringArray(i.block,`${n} The "${t}.block"`),{block:i.block})}function validateStringArray(e,t){if(!Array.isArray(e))throw Error(`${t} field must be an array of strings.`);for(let n=0;n<e.length;n++)if(typeof e[n]!=`string`)throw Error(`${t}[${n}] must be a string.`)}export{normalizeMcpClientConnectionDefinition,normalizeOpenApiConnectionDefinition};
1
+ import{expectObjectRecord,expectOnlyKnownKeys}from"#internal/authored-module.js";import{parseJsonValue}from"#shared/json.js";import{normalizeApproval}from"#internal/authored-definition/approval.js";import{normalizeAuthorizationSpec}from"#shared/validate-authorization.js";const KNOWN_TOP_LEVEL_KEYS=[`approval`,`auth`,`description`,`forwardPrincipal`,`experimental_events`,`headers`,`instanceKey`,`protocolVersionDiscovery`,`toolCall`,`tools`,`url`],KNOWN_OPENAPI_TOP_LEVEL_KEYS=[`approval`,`auth`,`baseUrl`,`description`,`headers`,`instanceKey`,`operations`,`spec`,`toolCall`],KNOWN_AUTHORIZATION_KEYS=[`completeAuthorization`,`credentialOwner`,`evict`,`getToken`,`principalType`,`startAuthorization`,`vercelConnect`],KNOWN_TOOL_CALL_KEYS=[`providedArguments`];function normalizeMcpClientConnectionDefinition(e,t){let n=expectObjectRecord(e,t);expectOnlyKnownKeys(n,KNOWN_TOP_LEVEL_KEYS,t),validateUrl(n,t),validateDescription(n,t),validateInstanceKey(n,t);let r=normalizeAuthorization(n,t),i=normalizeHeaders(n,t),a=normalizeConnectionToolCall(n,t),o=normalizeToolFilter(n,t);if(r!==void 0&&i!==void 0&&typeof i!=`function`&&Object.keys(i).some(e=>e.toLowerCase()===`authorization`))throw Error(`${t} "headers" must not include an "Authorization" key when "auth" is also provided.`);let s={description:n.description,url:n.url};if(n.experimental_events!==void 0){let e=expectObjectRecord(n.experimental_events,`${t} experimental_events must be an object.`);if(expectOnlyKnownKeys(e,[`onEvent`,`onGap`,`onTerminated`],t),typeof e.onEvent!=`function`||e.onGap!==void 0&&typeof e.onGap!=`function`||e.onTerminated!==void 0&&typeof e.onTerminated!=`function`)throw Error(`${t} experimental_events requires onEvent; onGap and onTerminated must be functions when provided.`);if(r===void 0||typeof r==`function`||r.vercelConnect?.experimental_events===void 0)throw Error(`${t} experimental_events requires a static Connect auth provider with the events bridge.`);s.experimental_events={onEvent:e.onEvent,onGap:e.onGap,onTerminated:e.onTerminated}}if(n.protocolVersionDiscovery!==void 0){if(typeof n.protocolVersionDiscovery!=`boolean`)throw Error(`${t} "protocolVersionDiscovery" must be a boolean.`);s.protocolVersionDiscovery=n.protocolVersionDiscovery}if(n.forwardPrincipal!==void 0){if(typeof n.forwardPrincipal!=`boolean`)throw Error(`${t} "forwardPrincipal" must be a boolean.`);s.forwardPrincipal=n.forwardPrincipal}return n.instanceKey!==void 0&&(s.instanceKey=n.instanceKey),r!==void 0&&(s.auth=r),i!==void 0&&(s.headers=i),a!==void 0&&(s.toolCall=a),o!==void 0&&(s.tools=o),n.approval!==void 0&&(s.approval=normalizeApproval(n.approval,t)),s}function normalizeConnectionToolCall(e,t){if(e.toolCall===void 0)return;let n=expectObjectRecord(e.toolCall,`${t} The "toolCall" field must be a plain object.`);if(expectOnlyKnownKeys(n,KNOWN_TOOL_CALL_KEYS,`${t} The "toolCall" field`),n.providedArguments===void 0)return{};let r=expectObjectRecord(n.providedArguments,`${t} The "toolCall.providedArguments" field must be a plain object.`);for(let[e,n]of Object.entries(r))if(typeof n!=`function`&&!(typeof n==`object`&&n&&typeof n.then==`function`))try{parseJsonValue(n)}catch{throw Error(`${t} The "toolCall.providedArguments.${e}" value must be JSON-serializable, a Promise, or a function.`)}return{providedArguments:r}}function normalizeOpenApiConnectionDefinition(e,t){let n=expectObjectRecord(e,t);expectOnlyKnownKeys(n,KNOWN_OPENAPI_TOP_LEVEL_KEYS,t),validateSpec(n,t),validateBaseUrl(n,t),validateDescription(n,t),validateInstanceKey(n,t);let r=normalizeAuthorization(n,t),i=normalizeHeaders(n,t),a=normalizeFilterField(n,`operations`,t),o=normalizeConnectionToolCall(n,t);if(r!==void 0&&i!==void 0&&typeof i!=`function`&&Object.keys(i).some(e=>e.toLowerCase()===`authorization`))throw Error(`${t} "headers" must not include an "Authorization" key when "auth" is also provided.`);let s={description:n.description,spec:n.spec};return n.baseUrl!==void 0&&(s.baseUrl=n.baseUrl),n.instanceKey!==void 0&&(s.instanceKey=n.instanceKey),r!==void 0&&(s.auth=r),i!==void 0&&(s.headers=i),o!==void 0&&(s.toolCall=o),a!==void 0&&(s.operations=a),n.approval!==void 0&&(s.approval=normalizeApproval(n.approval,t)),s}function validateSpec(e,t){let n=e.spec;if(typeof n==`string`){if(!URL.canParse(n))throw Error(`${t} The "spec" field must be a valid URL when provided as a string.`);let e=new URL(n);if(e.protocol!==`https:`&&e.protocol!==`http:`)throw Error(`${t} The "spec" URL must use the http or https protocol, got "${e.protocol}".`);return}if(typeof n!=`object`||!n||Array.isArray(n))throw Error(`${t} The "spec" field must be a URL string or an inline OpenAPI document object.`)}function validateBaseUrl(e,t){if(e.baseUrl===void 0)return;if(typeof e.baseUrl!=`string`||!URL.canParse(e.baseUrl))throw Error(`${t} The "baseUrl" field must be a valid URL when provided.`);let n=new URL(e.baseUrl);if(n.protocol!==`https:`&&n.protocol!==`http:`)throw Error(`${t} The "baseUrl" field must use the http or https protocol, got "${n.protocol}".`)}function validateUrl(e,t){if(typeof e.url!=`string`||!URL.canParse(e.url))throw Error(`${t} The "url" field must be a valid URL.`);let n=new URL(e.url);if(n.protocol!==`https:`&&n.protocol!==`http:`)throw Error(`${t} The "url" field must use the http or https protocol, got "${n.protocol}".`)}function validateDescription(e,t){if(typeof e.description!=`string`||e.description.length===0)throw Error(`${t} The "description" field must be a non-empty string.`)}function validateInstanceKey(e,t){if(e.instanceKey!==void 0&&(typeof e.instanceKey!=`string`||e.instanceKey.length===0))throw Error(`${t} The "instanceKey" field must be a non-empty string.`)}function normalizeAuthorization(e,t){if(e.auth===void 0)return;if(typeof e.auth==`function`)return e.auth;let n=expectObjectRecord(e.auth,`${t} The "auth" field must be an object with a "getToken" method or a function.`);return expectOnlyKnownKeys(n,KNOWN_AUTHORIZATION_KEYS,`${t} The "auth" field`),normalizeAuthorizationSpec(n,t)}function normalizeHeaders(e,t){if(e.headers===void 0)return;if(typeof e.headers==`function`)return e.headers;if(typeof e.headers!=`object`||e.headers===null||Array.isArray(e.headers))throw Error(`${t} The "headers" field must be a plain object or a function.`);let n=e.headers;for(let[e,r]of Object.entries(n)){let n=typeof r;if(n!==`string`&&n!==`function`&&n!==`object`||n===`object`&&(r===null||typeof r.then!=`function`))throw Error(`${t} The "headers.${e}" value must be a string, Promise, or function.`)}return n}function normalizeToolFilter(e,t){return normalizeFilterField(e,`tools`,t)}function normalizeFilterField(e,t,n){let r=e[t];if(r===void 0)return;if(typeof r!=`object`||!r||Array.isArray(r))throw Error(`${n} The "${t}" field must specify either "allow" or "block".`);let i=r,a=`allow`in i,o=`block`in i;if(a&&o)throw Error(`${n} The "${t}" field must specify either "allow" or "block", not both.`);if(!a&&!o)throw Error(`${n} The "${t}" field must specify either "allow" or "block".`);return a?(validateStringArray(i.allow,`${n} The "${t}.allow"`),{allow:i.allow}):(validateStringArray(i.block,`${n} The "${t}.block"`),{block:i.block})}function validateStringArray(e,t){if(!Array.isArray(e))throw Error(`${t} field must be an array of strings.`);for(let n=0;n<e.length;n++)if(typeof e[n]!=`string`)throw Error(`${t}[${n}] must be a string.`)}export{normalizeMcpClientConnectionDefinition,normalizeOpenApiConnectionDefinition};
@@ -1 +1 @@
1
- import{expectObjectRecord,expectOnlyKnownKeys}from"#internal/authored-module.js";import{isScheduleCollectionDefinition}from"#shared/schedule-collection-definition.js";const SCHEDULE_OPERATIONS=[`create`,`get`,`list`,`update`,`enable`,`disable`,`invoke`,`delete`],PROVIDER_KEYS=[`kind`,`create`,`list`,`get`,`update`,`enable`,`disable`,`invoke`,`delete`],PROVIDER_METHODS=PROVIDER_KEYS.filter(e=>e!==`kind`),DEFINITION_KEYS=[`description`,`provider`,`scope`,`inputSchema`,`preparePayload`,`run`,`auth`,`events`,`tool`,`approval`];function normalizeScheduleCollectionDefinition(e,t){if(!isScheduleCollectionDefinition(e))throw Error(t);let n=expectObjectRecord(e,t);if(expectOnlyKnownKeys(n,DEFINITION_KEYS,t),n.description!==void 0&&(typeof n.description!=`string`||n.description.trim()===``))throw Error(`${t} "description" must be a non-empty string when provided.`);let r=expectObjectRecord(n.inputSchema,`${t} "inputSchema" is required and must be a Standard Schema.`);if(typeof expectObjectRecord(r[`~standard`],`${t} "inputSchema" must be a Standard Schema.`).validate!=`function`)throw Error(`${t} "inputSchema" must supply a Standard Schema validate function.`);if(n.preparePayload!==void 0&&typeof n.preparePayload!=`function`)throw Error(`${t} "preparePayload" must be a function when provided.`);if(typeof n.run!=`function`)throw Error(`${t} "run" is required and must be a function.`);if(n.scope!==void 0&&typeof n.scope!=`function`)throw Error(`${t} "scope" must be a function when provided.`);if(typeof n.auth!=`function`)throw Error(`${t} "auth" is required and must be a function that resolves the schedule creator to execution auth.`);if(n.events!==void 0){let e=expectObjectRecord(n.events,`${t} "events" must be an object.`);expectOnlyKnownKeys(e,[`occurrence.dispatched`,`occurrence.failed`],`${t} "events"`);for(let[n,r]of Object.entries(e))if(r!==void 0&&typeof r!=`function`)throw Error(`${t} "events.${n}" must be a function.`)}let i=expectObjectRecord(n.provider,`${t} "provider" must be an object.`);if(expectOnlyKnownKeys(i,PROVIDER_KEYS,`${t} "provider"`),typeof i.kind!=`string`||i.kind.trim()===``)throw Error(`${t} provider.kind must be a non-empty string.`);for(let e of PROVIDER_METHODS)if(typeof i[e]!=`function`)throw Error(`${t} provider.${e} must be a function.`);if(n.tool!==void 0&&typeof n.tool!=`boolean`)throw Error(`${t} "tool" must be true or false; deferred tools are not supported yet.`);if(n.tool===!1&&n.approval!==void 0)throw Error(`${t} "approval" cannot be configured when tool is false.`);if(n.approval!==void 0){let e=expectObjectRecord(n.approval,`${t} "approval" must be an object.`);expectOnlyKnownKeys(e,SCHEDULE_OPERATIONS,`${t} "approval"`);for(let[n,r]of Object.entries(e))if(typeof r!=`function`&&(typeof r!=`object`||!r||typeof Reflect.get(r,`request`)!=`function`||Reflect.get(r,`response`)!==void 0&&typeof Reflect.get(r,`response`)!=`function`))throw Error(`${t} "approval.${n}" must be an approval policy.`)}return e}export{normalizeScheduleCollectionDefinition};
1
+ import{expectAgentToolExposure,expectObjectRecord,expectOnlyKnownKeys}from"#internal/authored-module.js";import{isScheduleCollectionDefinition}from"#shared/schedule-collection-definition.js";const SCHEDULE_OPERATIONS=[`create`,`get`,`list`,`update`,`enable`,`disable`,`invoke`,`delete`],PROVIDER_KEYS=[`kind`,`create`,`list`,`get`,`update`,`enable`,`disable`,`invoke`,`delete`],PROVIDER_METHODS=PROVIDER_KEYS.filter(e=>e!==`kind`),DEFINITION_KEYS=[`description`,`provider`,`scope`,`inputSchema`,`preparePayload`,`run`,`auth`,`events`,`tool`,`approval`];function normalizeScheduleCollectionDefinition(e,t){if(!isScheduleCollectionDefinition(e))throw Error(t);let n=expectObjectRecord(e,t);if(expectOnlyKnownKeys(n,DEFINITION_KEYS,t),n.description!==void 0&&(typeof n.description!=`string`||n.description.trim()===``))throw Error(`${t} "description" must be a non-empty string when provided.`);let r=expectObjectRecord(n.inputSchema,`${t} "inputSchema" is required and must be a Standard Schema.`);if(typeof expectObjectRecord(r[`~standard`],`${t} "inputSchema" must be a Standard Schema.`).validate!=`function`)throw Error(`${t} "inputSchema" must supply a Standard Schema validate function.`);if(n.preparePayload!==void 0&&typeof n.preparePayload!=`function`)throw Error(`${t} "preparePayload" must be a function when provided.`);if(typeof n.run!=`function`)throw Error(`${t} "run" is required and must be a function.`);if(n.scope!==void 0&&typeof n.scope!=`function`)throw Error(`${t} "scope" must be a function when provided.`);if(typeof n.auth!=`function`)throw Error(`${t} "auth" is required and must be a function that resolves the schedule creator to execution auth.`);if(n.events!==void 0){let e=expectObjectRecord(n.events,`${t} "events" must be an object.`);expectOnlyKnownKeys(e,[`occurrence.dispatched`,`occurrence.failed`],`${t} "events"`);for(let[n,r]of Object.entries(e))if(r!==void 0&&typeof r!=`function`)throw Error(`${t} "events.${n}" must be a function.`)}let i=expectObjectRecord(n.provider,`${t} "provider" must be an object.`);if(expectOnlyKnownKeys(i,PROVIDER_KEYS,`${t} "provider"`),typeof i.kind!=`string`||i.kind.trim()===``)throw Error(`${t} provider.kind must be a non-empty string.`);for(let e of PROVIDER_METHODS)if(typeof i[e]!=`function`)throw Error(`${t} provider.${e} must be a function.`);if(n.tool!==void 0&&expectAgentToolExposure(n.tool,t),n.tool===!1&&n.approval!==void 0)throw Error(`${t} "approval" cannot be configured when tool is false.`);if(n.approval!==void 0){let e=expectObjectRecord(n.approval,`${t} "approval" must be an object.`);expectOnlyKnownKeys(e,SCHEDULE_OPERATIONS,`${t} "approval"`);for(let[n,r]of Object.entries(e))if(typeof r!=`function`&&(typeof r!=`object`||!r||typeof Reflect.get(r,`request`)!=`function`||Reflect.get(r,`response`)!==void 0&&typeof Reflect.get(r,`response`)!=`function`))throw Error(`${t} "approval.${n}" must be an approval policy.`)}return e}export{normalizeScheduleCollectionDefinition};
@@ -18,7 +18,12 @@ export interface ApplicationChannelPreflightRoute {
18
18
  readonly path: string;
19
19
  readonly cors: NormalizedChannelCorsOptions;
20
20
  }
21
- export type ApplicationRouteRegistration = ApplicationChannelPreflightRoute | ApplicationChannelRoute | {
21
+ export type ApplicationRouteRegistration = {
22
+ readonly kind: "connection-event";
23
+ readonly method: "POST";
24
+ readonly path: string;
25
+ readonly connectionName: string;
26
+ } | ApplicationChannelPreflightRoute | ApplicationChannelRoute | {
22
27
  readonly kind: "development-artifacts";
23
28
  readonly method: "GET";
24
29
  readonly path: string;
@@ -38,7 +43,7 @@ export interface ApplicationRouteRegistry {
38
43
  }
39
44
  interface ApplicationRouteRegistryHost {
40
45
  readonly compileResult: {
41
- readonly manifest: Pick<CompiledAgentManifest, "channelRoutes">;
46
+ readonly manifest: Pick<CompiledAgentManifest, "channelRoutes"> & Partial<Pick<CompiledAgentManifest, "connections">>;
42
47
  };
43
48
  }
44
49
  /** Projects the compiler-owned route plan into Nitro registration records. */
@@ -1 +1 @@
1
- import{EVE_DEV_DISPATCH_SCHEDULE_ROUTE_PATTERN,EVE_DEV_RUNTIME_ARTIFACTS_ROUTE_PATH}from"#protocol/routes.js";import{EVE_WORKFLOW_FLOW_ROUTE_PATH}from"#internal/workflow-bundle/eve-service-route-output.js";function createApplicationRouteRegistry(e,t={}){let n=e.compileResult.manifest.channelRoutes,r=n.effective.map(e=>({cors:e.cors,method:e.method,route:e.urlPath})),i=[...n.effective.map(e=>({cors:e.cors,kind:`channel`,method:e.method,path:e.urlPath})),...n.preflight.map(e=>({cors:e.cors,kind:`channel-preflight`,method:`OPTIONS`,path:e.urlPath}))],a=[...i];return t.development===!0&&a.push({kind:`development-artifacts`,method:`GET`,path:EVE_DEV_RUNTIME_ARTIFACTS_ROUTE_PATH},{kind:`development-schedule`,method:`POST`,path:EVE_DEV_DISPATCH_SCHEDULE_ROUTE_PATTERN}),a.push({kind:`workflow`,method:`ALL`,path:EVE_WORKFLOW_FLOW_ROUTE_PATH}),{channelRegistrations:r,channelRoutes:i,routes:a}}function computeApplicationChannelRouteRegistrations(e){return createApplicationRouteRegistry(e).channelRegistrations}export{computeApplicationChannelRouteRegistrations,createApplicationRouteRegistry};
1
+ import{EVE_DEV_DISPATCH_SCHEDULE_ROUTE_PATTERN,EVE_DEV_RUNTIME_ARTIFACTS_ROUTE_PATH}from"#protocol/routes.js";import{EVE_WORKFLOW_FLOW_ROUTE_PATH}from"#internal/workflow-bundle/eve-service-route-output.js";import{connectionEventRoute}from"#runtime/connections/events/path.js";function createApplicationRouteRegistry(e,t={}){let n=e.compileResult.manifest.channelRoutes,r=n.effective.map(e=>({cors:e.cors,method:e.method,route:e.urlPath})),i=[...n.effective.map(e=>({cors:e.cors,kind:`channel`,method:e.method,path:e.urlPath})),...n.preflight.map(e=>({cors:e.cors,kind:`channel-preflight`,method:`OPTIONS`,path:e.urlPath}))],a=[...i];for(let t of e.compileResult.manifest.connections??[]){if(t.experimental_events!==!0)continue;let e=connectionEventRoute(t.connectionName);if(a.some(t=>t.path===e))throw Error(`Connection event receiver conflicts with an existing route: ${e}`);a.push({kind:`connection-event`,method:`POST`,path:e,connectionName:t.connectionName})}return t.development===!0&&a.push({kind:`development-artifacts`,method:`GET`,path:EVE_DEV_RUNTIME_ARTIFACTS_ROUTE_PATH},{kind:`development-schedule`,method:`POST`,path:EVE_DEV_DISPATCH_SCHEDULE_ROUTE_PATTERN}),a.push({kind:`workflow`,method:`ALL`,path:EVE_WORKFLOW_FLOW_ROUTE_PATH}),{channelRegistrations:r,channelRoutes:i,routes:a}}function computeApplicationChannelRouteRegistrations(e){return createApplicationRouteRegistry(e).channelRegistrations}export{computeApplicationChannelRouteRegistrations,createApplicationRouteRegistry};
@@ -1,3 +1,3 @@
1
1
  import{mkdir,writeFile}from"node:fs/promises";import{dirname,join,relative}from"node:path";import{resolvePackageRoot,resolvePackageSourceFilePath,resolveWorkflowModulePath}from"#internal/application/package.js";import{isVercelBuildEnvironment}from"#internal/application/paths.js";import{normalizeEsmImportSpecifier,stringifyEsmImportSpecifier}from"#internal/application/import-specifier.js";import{usesParentDevelopmentWorkflowWorld}from"#internal/workflow/development-world-protocol.js";import{createDevelopmentNitroArtifactsConfig,createProductionNitroArtifactsConfig}from"#internal/nitro/host/artifacts-config.js";import{createApplicationRouteRegistry}from"#internal/nitro/host/application-route-registry.js";import{WorkflowBundleBuilder}from"#internal/workflow-bundle/builder.js";import{deriveEveWorkflowQueuePrefix}from"#internal/workflow/queue-namespace.js";import{registerChannelVirtualHandlers}from"#internal/nitro/host/channel-routes.js";import{EVE_SCHEDULE_COLLECTION_CONSUMER_ROUTE_PATH,hasVercelScheduleCollections}from"#internal/schedules/consumer-route.js";function resolveNitroWorkflowBuildDirectory(e){return join(e.options.buildDir,`workflow`)}function createRelativeImportSpecifier(e,t){let n=relative(e,t).replaceAll(`\\`,`/`);return n.startsWith(`.`)?n:`./${n}`}async function addWorkflowFileHandler(e,t){let n=join(resolveNitroWorkflowBuildDirectory(e),`${t.bundleName}-handler.mjs`),r=dirname(n),i=createRelativeImportSpecifier(r,t.bundlePath),a=t.directHandlers??[],o=a.length>0&&t.workflowWorldPluginPath!==void 0?createRelativeImportSpecifier(r,t.workflowWorldPluginPath):void 0,s=a.map(e=>{let t=createRelativeImportSpecifier(r,e.bundlePath);return{importSpecifier:t,isOwnBundle:t===i,queuePrefix:e.queuePrefix}});await mkdir(r,{recursive:!0}),await writeFile(n,buildWorkflowFileHandlerSource({bundlePath:i,directHandlers:s,runtimeImportSpecifier:t.runtimeImportSpecifier,workflowWorldPluginImportSpecifier:o})),e.options.handlers.push({handler:n,route:t.route})}function buildWorkflowFileHandlerSource(e){let t=[`// Generated by eve. Do not edit by hand.`,`import { POST } from ${JSON.stringify(e.bundlePath)};`];if(e.directHandlers.length>0&&e.runtimeImportSpecifier!==void 0){let n=0,r=e.directHandlers.map(e=>{if(e.isOwnBundle)return{...e,binding:`POST`};let t=`__eveWorkflowDirectHandler${n}`;return n+=1,{...e,binding:t}});for(let e of r)e.isOwnBundle||t.push(`import { POST as ${e.binding} } from ${JSON.stringify(e.importSpecifier)};`);e.workflowWorldPluginImportSpecifier!==void 0&&t.push(`import ${JSON.stringify(e.workflowWorldPluginImportSpecifier)};`),t.push(`import { getWorld as __eveGetWorkflowWorld } from ${JSON.stringify(e.runtimeImportSpecifier)};`,``,`try {`,` const __eveWorkflowWorld = await __eveGetWorkflowWorld();`,` if (typeof __eveWorkflowWorld?.registerHandler === "function") {`);for(let e of r)t.push(` __eveWorkflowWorld.registerHandler(${JSON.stringify(e.queuePrefix)}, ${e.binding});`);t.push(` }`,`} catch (err) {`,` console.warn("[eve] Failed to register direct workflow queue handlers:", err);`,`}`)}return t.push(``,`export default async ({ req }) => {`,` return await POST(req);`,`};`,``),t.join(`
2
2
  `)}function addHostVirtualHandler(e,t){let n=`#eve-route${t.route}`,r=stringifyEsmImportSpecifier(t.modulePath);e.options.handlers.push({handler:n,method:t.method,route:t.route}),e.options.virtual[n]=[`import { ${t.handlerExport} } from ${r};`,`export default async (event) => ${t.handlerExport}(${t.args}, event.req);`].join(`
3
- `)}async function registerWorkflowArtifactBuildHook(e,t){let n=!0;await t(),e.hooks.hook(`build:before`,async()=>{if(n){n=!1;return}await t()})}function registerApplicationRoutes(e,t,n){for(let r of n.routes)switch(r.kind){case`channel`:case`channel-preflight`:registerChannelVirtualHandlers(e,{artifactsConfig:t,routes:[r]});break;case`development-artifacts`:addHostVirtualHandler(e,{args:JSON.stringify({appRoot:t.appRoot}),handlerExport:`handleDevRuntimeArtifactsRequest`,method:r.method,modulePath:resolvePackageSourceFilePath(`src/internal/nitro/routes/dev-runtime-artifacts.ts`),route:r.path});break;case`development-schedule`:addHostVirtualHandler(e,{args:JSON.stringify(t),handlerExport:`handleDevScheduleDispatchRequest`,method:r.method,modulePath:resolvePackageSourceFilePath(`src/internal/nitro/routes/dev-schedule-dispatch.ts`),route:r.path})}}function findWorkflowRoute(e){return e.routes.find(e=>e.kind===`workflow`)?.path}function createWorkflowDirectHandlerEntry(e,t){return{bundlePath:t,queuePrefix:deriveEveWorkflowQueuePrefix(e.compileResult.manifest.config.name)}}async function registerWorkflowRoute(e,t,n,r,i){await addWorkflowFileHandler(e,{bundleName:`workflows`,bundlePath:n,directHandlers:r,route:i,runtimeImportSpecifier:r.length===0?void 0:normalizeEsmImportSpecifier(resolveWorkflowModulePath(`workflow/runtime`)),workflowWorldPluginPath:t.compiledArtifacts.workflowWorldPluginPath})}async function configureDevelopmentNitroRoutes(e,t){let n=resolveNitroWorkflowBuildDirectory(e),r=new WorkflowBundleBuilder({authoredWorkflowModules:t.compiledArtifacts.authoredWorkflowModules,agentName:t.compileResult.manifest.config.name,appRoot:t.appRoot,compiledArtifactsBootstrapPath:t.compiledArtifacts.bootstrapPath,outDir:t.workflowBuildDir,rootDir:resolvePackageRoot(),watch:!0});await registerWorkflowArtifactBuildHook(e,async()=>{await r.build({nitroStepOutfile:join(n,`steps.mjs`),nitroWorkflowOutfile:join(n,`workflows.mjs`)})});let i=createDevelopmentNitroArtifactsConfig({appRoot:t.appRoot,configuredWorld:t.compileResult.manifest.config.experimental?.workflow?.world}),a=createApplicationRouteRegistry(t,{development:!0});registerApplicationRoutes(e,i,a);let o=join(n,`workflows.mjs`),s=[];usesParentDevelopmentWorkflowWorld(t.compileResult.manifest.config.experimental?.workflow?.world)||s.push(createWorkflowDirectHandlerEntry(t,o));let c=findWorkflowRoute(a);c!==void 0&&await registerWorkflowRoute(e,t,o,s,c),e.routing.sync()}async function configureProductionNitroRoutes(e,t){let n=new WorkflowBundleBuilder({authoredWorkflowModules:t.compiledArtifacts.authoredWorkflowModules,agentName:t.compileResult.manifest.config.name,appRoot:t.appRoot,compiledArtifactsBootstrapPath:t.compiledArtifacts.bootstrapPath,outDir:t.workflowBuildDir,rootDir:resolvePackageRoot(),watch:!1});await registerWorkflowArtifactBuildHook(e,async()=>{await n.build({nitroStepOutfile:join(resolveNitroWorkflowBuildDirectory(e),`steps.mjs`)})});let r=createApplicationRouteRegistry(t),i=createProductionNitroArtifactsConfig(t.appRoot);registerApplicationRoutes(e,i,r),isVercelBuildEnvironment()&&hasVercelScheduleCollections(t.compileResult.manifest)&&addHostVirtualHandler(e,{args:JSON.stringify(i),handlerExport:`handleScheduleCollectionConsumer`,method:`POST`,modulePath:resolvePackageSourceFilePath(`src/internal/nitro/routes/schedule-collection-consumer.ts`),route:EVE_SCHEDULE_COLLECTION_CONSUMER_ROUTE_PATH});let a=join(t.workflowBuildDir,`workflows.mjs`),o=t.compileResult.manifest.config.experimental?.workflow?.world!==void 0,s=!isVercelBuildEnvironment()&&o?[createWorkflowDirectHandlerEntry(t,a)]:[],c=findWorkflowRoute(r);c!==void 0&&await registerWorkflowRoute(e,t,a,s,c),e.routing.sync()}export{configureDevelopmentNitroRoutes,configureProductionNitroRoutes};
3
+ `)}async function registerWorkflowArtifactBuildHook(e,t){let n=!0;await t(),e.hooks.hook(`build:before`,async()=>{if(n){n=!1;return}await t()})}function registerApplicationRoutes(e,t,n){for(let r of n.routes)switch(r.kind){case`connection-event`:addHostVirtualHandler(e,{args:JSON.stringify({artifactsConfig:t,connectionName:r.connectionName}),handlerExport:`handleConnectionEventRequest`,method:r.method,modulePath:resolvePackageSourceFilePath(`src/internal/nitro/routes/connection-events.ts`),route:r.path});break;case`channel`:case`channel-preflight`:registerChannelVirtualHandlers(e,{artifactsConfig:t,routes:[r]});break;case`development-artifacts`:addHostVirtualHandler(e,{args:JSON.stringify({appRoot:t.appRoot}),handlerExport:`handleDevRuntimeArtifactsRequest`,method:r.method,modulePath:resolvePackageSourceFilePath(`src/internal/nitro/routes/dev-runtime-artifacts.ts`),route:r.path});break;case`development-schedule`:addHostVirtualHandler(e,{args:JSON.stringify(t),handlerExport:`handleDevScheduleDispatchRequest`,method:r.method,modulePath:resolvePackageSourceFilePath(`src/internal/nitro/routes/dev-schedule-dispatch.ts`),route:r.path})}}function findWorkflowRoute(e){return e.routes.find(e=>e.kind===`workflow`)?.path}function createWorkflowDirectHandlerEntry(e,t){return{bundlePath:t,queuePrefix:deriveEveWorkflowQueuePrefix(e.compileResult.manifest.config.name)}}async function registerWorkflowRoute(e,t,n,r,i){await addWorkflowFileHandler(e,{bundleName:`workflows`,bundlePath:n,directHandlers:r,route:i,runtimeImportSpecifier:r.length===0?void 0:normalizeEsmImportSpecifier(resolveWorkflowModulePath(`workflow/runtime`)),workflowWorldPluginPath:t.compiledArtifacts.workflowWorldPluginPath})}async function configureDevelopmentNitroRoutes(e,t){let n=resolveNitroWorkflowBuildDirectory(e),r=new WorkflowBundleBuilder({authoredWorkflowModules:t.compiledArtifacts.authoredWorkflowModules,agentName:t.compileResult.manifest.config.name,appRoot:t.appRoot,compiledArtifactsBootstrapPath:t.compiledArtifacts.bootstrapPath,outDir:t.workflowBuildDir,rootDir:resolvePackageRoot(),watch:!0});await registerWorkflowArtifactBuildHook(e,async()=>{await r.build({nitroStepOutfile:join(n,`steps.mjs`),nitroWorkflowOutfile:join(n,`workflows.mjs`)})});let i=createDevelopmentNitroArtifactsConfig({appRoot:t.appRoot,configuredWorld:t.compileResult.manifest.config.experimental?.workflow?.world}),a=createApplicationRouteRegistry(t,{development:!0});registerApplicationRoutes(e,i,a);let o=join(n,`workflows.mjs`),s=[];usesParentDevelopmentWorkflowWorld(t.compileResult.manifest.config.experimental?.workflow?.world)||s.push(createWorkflowDirectHandlerEntry(t,o));let c=findWorkflowRoute(a);c!==void 0&&await registerWorkflowRoute(e,t,o,s,c),e.routing.sync()}async function configureProductionNitroRoutes(e,t){let n=new WorkflowBundleBuilder({authoredWorkflowModules:t.compiledArtifacts.authoredWorkflowModules,agentName:t.compileResult.manifest.config.name,appRoot:t.appRoot,compiledArtifactsBootstrapPath:t.compiledArtifacts.bootstrapPath,outDir:t.workflowBuildDir,rootDir:resolvePackageRoot(),watch:!1});await registerWorkflowArtifactBuildHook(e,async()=>{await n.build({nitroStepOutfile:join(resolveNitroWorkflowBuildDirectory(e),`steps.mjs`)})});let r=createApplicationRouteRegistry(t),i=createProductionNitroArtifactsConfig(t.appRoot);registerApplicationRoutes(e,i,r),isVercelBuildEnvironment()&&hasVercelScheduleCollections(t.compileResult.manifest)&&addHostVirtualHandler(e,{args:JSON.stringify(i),handlerExport:`handleScheduleCollectionConsumer`,method:`POST`,modulePath:resolvePackageSourceFilePath(`src/internal/nitro/routes/schedule-collection-consumer.ts`),route:EVE_SCHEDULE_COLLECTION_CONSUMER_ROUTE_PATH});let a=join(t.workflowBuildDir,`workflows.mjs`),o=t.compileResult.manifest.config.experimental?.workflow?.world!==void 0,s=!isVercelBuildEnvironment()&&o?[createWorkflowDirectHandlerEntry(t,a)]:[],c=findWorkflowRoute(r);c!==void 0&&await registerWorkflowRoute(e,t,a,s,c),e.routing.sync()}export{configureDevelopmentNitroRoutes,configureProductionNitroRoutes};
@@ -1,5 +1,6 @@
1
+ import { type Span, type SpanContext } from "#compiled/@opentelemetry/api/index.js";
1
2
  export interface ChannelRequestTrace {
2
- readonly reference: import("@opentelemetry/api").SpanContext;
3
+ readonly reference: SpanContext;
3
4
  channel(input: {
4
5
  channelName?: string;
5
6
  channelKind?: string;
@@ -10,3 +11,4 @@ export declare function traceChannelRequest<T extends Response>(input: {
10
11
  readonly request: Request;
11
12
  readonly routeKey: string;
12
13
  }, handler: (operation: ChannelRequestTrace | undefined) => Promise<T>): Promise<T>;
14
+ export declare function traceConnectionEventRequest(request: Request, handler: (span: Span | undefined) => Promise<Response>): Promise<Response>;
@@ -1 +1 @@
1
- import{SpanKind,SpanStatusCode,context,propagation,trace}from"#compiled/@opentelemetry/api/index.js";import{getInstrumentationRuntime}from"#instrumentation/runtime.js";import{markAgentTraceContext}from"#tracing/eve/agent-trace-context.js";import{withErrorContent}from"#compiled/@eve/tracing/otel.js";const headersGetter={get:(e,t)=>e.get(t)??void 0,keys:e=>[...e.keys()]};async function traceChannelRequest(e,t){if(getInstrumentationRuntime()?.otelSettings?.traceChannelRequests!==!0)return t(void 0);let{request:n,routeKey:r}=e,i=propagation.extract(context.active(),n.headers,headersGetter),a=r.indexOf(` `),o;try{o=new URL(n.url)}catch{}let s=trace.getTracer(`eve.channel`).startSpan(`agent.channel.request`,{kind:SpanKind.SERVER,attributes:{"operation.name":`agent.channel.request`,"resource.name":`agent.channel.request`,"http.request.method":n.method,"http.route":a===-1?r:r.slice(a+1),"url.scheme":o?.protocol.replace(/:$/,``),"server.address":o?.hostname}},i),c={reference:s.spanContext(),channel(e){e.channelName!==void 0&&s.setAttribute(`agent.channel.name`,e.channelName),e.channelName!==void 0&&s.setAttribute(`eve.channel.name`,e.channelName),e.channelKind!==void 0&&s.setAttribute(`agent.channel.kind`,e.channelKind),e.channelKind!==void 0&&s.setAttribute(`eve.channel.kind`,e.channelKind)}};try{let e=await context.with(markAgentTraceContext(withErrorContent(trace.setSpan(i,s),!1)),()=>t(c));return s.setAttribute(`http.response.status_code`,e.status),e.status>=500&&s.setStatus({code:SpanStatusCode.ERROR}),e}catch(e){throw s.setStatus({code:SpanStatusCode.ERROR}),e}finally{s.end()}}export{traceChannelRequest};
1
+ import{SpanKind,SpanStatusCode,context,propagation,trace}from"#compiled/@opentelemetry/api/index.js";import{getInstrumentationRuntime}from"#instrumentation/runtime.js";import{markAgentTraceContext}from"#tracing/eve/agent-trace-context.js";import{withErrorContent}from"#compiled/@eve/tracing/otel.js";import{connectionEventDestination}from"#runtime/connections/events/path.js";const headersGetter={get:(e,t)=>e.get(t)??void 0,keys:e=>[...e.keys()]};async function traceChannelRequest(e,t){return traceRequest({...e,spanName:`agent.channel.request`},e=>t(e===void 0?void 0:{reference:e.spanContext(),channel(t){t.channelName!==void 0&&(e.setAttribute(`agent.channel.name`,t.channelName),e.setAttribute(`eve.channel.name`,t.channelName)),t.channelKind!==void 0&&(e.setAttribute(`agent.channel.kind`,t.channelKind),e.setAttribute(`eve.channel.kind`,t.channelKind))}}))}async function traceConnectionEventRequest(e,t){return traceRequest({request:e,routeKey:`POST ${connectionEventDestination(`:connectionName`).replace(`%3AconnectionName`,`:connectionName`)}`,spanName:`agent.connection.event.request`},t)}async function traceRequest(e,t){if(getInstrumentationRuntime()?.otelSettings?.traceChannelRequests!==!0)return t(void 0);let{request:n,routeKey:r}=e,i=propagation.extract(context.active(),n.headers,headersGetter),a=r.indexOf(` `),o;try{o=new URL(n.url)}catch{}let s=trace.getTracer(`eve.channel`).startSpan(e.spanName,{kind:SpanKind.SERVER,attributes:{"operation.name":e.spanName,"resource.name":e.spanName,"http.request.method":n.method,"http.route":a===-1?r:r.slice(a+1),"url.scheme":o?.protocol.replace(/:$/,``),"server.address":o?.hostname}},i);try{let e=await context.with(markAgentTraceContext(withErrorContent(trace.setSpan(i,s),!1)),()=>t(s));return s.setAttribute(`http.response.status_code`,e.status),e.status>=500&&s.setStatus({code:SpanStatusCode.ERROR}),e}catch(e){throw s.setStatus({code:SpanStatusCode.ERROR}),e}finally{s.end()}}export{traceChannelRequest,traceConnectionEventRequest};
@@ -0,0 +1,5 @@
1
+ import type { NitroArtifactsConfig } from "#internal/nitro/routes/runtime-artifacts.js";
2
+ export declare function handleConnectionEventRequest(input: {
3
+ artifactsConfig: NitroArtifactsConfig;
4
+ connectionName: string;
5
+ }, request: Request): Promise<Response>;
@@ -0,0 +1 @@
1
+ import{createLogger,logError}from"#internal/logging.js";import{isObject}from"#shared/guards.js";import{getCompiledRuntimeAgentBundle}from"#runtime/sessions/compiled-agent-cache.js";import{connectionEventDestination}from"#runtime/connections/events/path.js";import{resolveNitroCompiledArtifactsSource}from"#internal/nitro/routes/runtime-artifacts.js";import{traceConnectionEventRequest}from"#internal/nitro/routes/channel-request-instrumentation.js";import{connectionEventAttributes,connectionEventError,connectionEventTraceContext}from"#tracing/eve/connection-events.js";import{startConnectionEventDelivery}from"#runtime/connections/events/owner.js";async function handleConnectionEventRequest(e,t){return traceConnectionEventRequest(t,async n=>{if(t.method!==`POST`)return new Response(null,{status:405});let r=`load`,i={};try{let a=await getCompiledRuntimeAgentBundle({compiledArtifactsSource:resolveNitroCompiledArtifactsSource(e.artifactsConfig)}),o=a.resolvedAgent.connections.find(t=>t.connectionName===e.connectionName)?.experimental_events;if(o===void 0)return new Response(null,{status:404});r=`verify`;let s=await o.backend.verify(t,{path:connectionEventDestination(e.connectionName)}),c=s.context.eve;if(!isObject(c)||c.version!==1||typeof c.sessionId!=`string`||c.sessionId.length===0||c.sessionId.length>256||c.sessionId.includes(`:`)||typeof c.bindingId!=`string`||!/^[a-f0-9]{64}$/.test(c.bindingId))return new Response(null,{status:400});i=connectionEventAttributes({connectionName:e.connectionName,sessionId:c.sessionId,deliveryId:s.deliveryId,subscriptionId:s.subscriptionId});for(let[e,t]of Object.entries(i))n?.setAttribute(e,t);r=`handler`;let l=connectionEventTraceContext(n?.spanContext()),u=await startConnectionEventDelivery({kind:`connection-event`,connectionName:e.connectionName,bindingId:c.bindingId,delivery:s,requestTraceContext:l},a);return new Response(null,{status:u?202:410})}catch(e){return isObject(e)&&e.code===`invalid_delivery`?new Response(null,{status:401}):(logError(createLogger(`connection.events.receiver`),`connection event receipt failed`,connectionEventError(e),{...i,stage:r}),new Response(null,{status:503,headers:{"Retry-After":`5`}}))}})}export{handleConnectionEventRequest};
@@ -1,2 +1,2 @@
1
- import{mkdir,readFile,writeFile}from"node:fs/promises";import{dirname,join,resolve}from"node:path";import{resolvePackageSourceDirectoryPath,resolveWorkflowModulePath}from"#internal/application/package.js";import{buildSingleRolldownChunk}from"#internal/bundler/nitro-rolldown.js";import{createAuthoredPackageTsConfigPathsPlugin}from"#internal/authored-package-tsconfig-paths.js";import{createAuthoredRelativeExtensionResolverPlugin}from"#internal/authored-relative-extension-resolver.js";import{findWorkflowPatterns}from"#internal/workflow-bundle/workflow-builders.js";import{mapConcurrent}from"#shared/map-concurrent.js";import{onVendoredDependencyLog}from"#internal/bundler/vendored-dependency-log.js";import{prepareEveVersionedCacheDirectory,writeEveVersionedCacheMetadata}from"#internal/application/cache-metadata.js";import{WORKFLOW_BUILDER_DEFERRED_PACKAGES,WORKFLOW_STEP_EXTERNAL_PACKAGES}from"#internal/workflow-bundle/vercel-workflow-output.js";import{deriveEveWorkflowQueueNamespace}from"#internal/workflow/queue-namespace.js";import{runQueuedWorkflowBuild}from"#internal/workflow-bundle/build-queue.js";import{WORKFLOW_SOURCE_EXTENSIONS,WORKFLOW_VIRTUAL_ENTRY_ID,bundleFinalWorkflowOutput,collectWorkflowInputFiles,composeWorkflowDriverCode,convertClassesManifest,convertStepsManifest,convertWorkflowsManifest,createEvePackageImportsPlugin,createWorkflowDriverAliasPlugin,createWorkflowImport,createWorkflowNodeBuiltinGuardPlugin,createWorkflowPseudoPackagePlugin,createWorkflowTransformPlugin,createWorkflowVirtualEntryPlugin,mergeWorkflowManifest}from"#internal/workflow-bundle/builder-support.js";import{writeNitroStepEntrypoint}from"#internal/workflow-bundle/nitro-step-entry.js";var WorkflowBundleBuilder=class{#e;#t;#n;#r;config;constructor(e){let t=[resolvePackageSourceDirectoryPath(`src/execution`),resolvePackageSourceDirectoryPath(`src/runtime/subagents`),resolvePackageSourceDirectoryPath(`src/subagents`),resolvePackageSourceDirectoryPath(`src/tools/provided`)];e.includeTestFixtures===!0&&t.push(resolvePackageSourceDirectoryPath(`src/internal/testing`)),this.config={buildTarget:`standalone`,dirs:t,externalPackages:[...WORKFLOW_STEP_EXTERNAL_PACKAGES,...WORKFLOW_BUILDER_DEFERRED_PACKAGES],projectRoot:e.appRoot,watch:e.watch,workingDir:e.rootDir},this.#e=e.authoredWorkflowModules??{directiveModules:[],workflowModules:[]},this.#t=e.compiledArtifactsBootstrapPath,this.#n=e.outDir,this.#r=deriveEveWorkflowQueueNamespace(e.agentName)}async build(e={}){await runQueuedWorkflowBuild(this.#n,async()=>this.#i(e))}async#i(e){await prepareEveVersionedCacheDirectory(this.#n);let t=await this.#o();if(t.length===0)throw Error(`Expected framework workflow source files under eve's execution, runtime/subagents, subagents, or tools/provided source directories.`);let n=await this.findTsConfigPath();await mkdir(this.#n,{recursive:!0});let r=await this.discoverEntries(t),i=this.#e,a=mergeStepEntries(r,i),o=join(this.#n,`steps.mjs`),s=join(this.#n,`workflows.mjs`),c=e.nitroStepOutfile,l=e.nitroWorkflowOutfile,writeStepEntry=(e,t)=>writeNitroStepEntrypoint({builtinsPath:resolveWorkflowModulePath(`workflow/internal/builtins`),discoveredEntries:a,outfile:e,precomputedManifest:t,preferAbsoluteFileImports:!0,projectRoot:this.config.projectRoot??this.config.workingDir,sideEffectFiles:[this.#t],workingDir:this.config.workingDir}),u=await writeStepEntry(o);c!==void 0&&c!==o&&await writeStepEntry(c,u);let{manifest:d}=await this.createWorkflowsBundle({additionalOutputs:l===void 0||l===s?[]:[{outfile:l,stepRegistrationsPath:c??o}],appWorkflowFiles:i.workflowModules,frameworkSerdeFiles:r.discoveredSerdeFiles,frameworkWorkflowFiles:r.discoveredWorkflows,outfile:s,stepRegistrationsPath:o,tsconfigPath:n});await this.createManifest({workflowBundlePath:join(this.#n,`workflows.mjs`),manifestDir:this.#n,manifest:{steps:{...u.steps,...d.steps},workflows:{...u.workflows,...d.workflows},classes:{...u.classes,...d.classes}}}),await writeEveVersionedCacheMetadata(this.#n)}get transformProjectRoot(){return this.config.projectRoot??this.config.workingDir}async findTsConfigPath(){let e=this.transformProjectRoot;for(;;){for(let t of[`tsconfig.json`,`jsconfig.json`]){let n=join(e,t);try{return await readFile(n),n}catch(e){if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e}}let t=dirname(e);if(t===e)return;e=t}}async getInputFiles(){let e=this.config.dirs.map(e=>resolve(this.config.workingDir,e));return(await Promise.all(e.map(e=>collectWorkflowInputFiles(e)))).flat()}async discoverEntries(e){let t={discoveredSerdeFiles:[],discoveredSteps:[],discoveredWorkflows:[]},n=await mapConcurrent(e,async e=>{let t=await readFile(e,`utf8`);return{filePath:e,patterns:await findWorkflowPatterns(e,t)}});for(let{filePath:e,patterns:r}of n)r.hasUseStep&&t.discoveredSteps.push(e),r.hasUseWorkflow&&t.discoveredWorkflows.push(e),r.hasSerde&&t.discoveredSerdeFiles.push(e);return t}async createWorkflowsBundle({additionalOutputs:e=[],appWorkflowFiles:t,frameworkSerdeFiles:n,frameworkWorkflowFiles:r,outfile:i,stepRegistrationsPath:a,tsconfigPath:o}){let s={},c=await mapConcurrent([{label:`framework`,serdeFiles:n,workflowFiles:r},{label:`app`,serdeFiles:[],workflowFiles:t}],async e=>{let t={};return{code:await this.#a({...e,manifest:t,tsconfigPath:o}),manifest:t}});for(let e of c)mergeWorkflowManifest(s,e.manifest);let l=composeWorkflowDriverCode(c.map(e=>e.code));return await Promise.all([{outfile:i,stepRegistrationsPath:a},...e].map(e=>bundleFinalWorkflowOutput({code:l,outfile:e.outfile,queueNamespace:this.#r,stepRegistrationsPath:e.stepRegistrationsPath}))),{manifest:s}}async#a(e){let t=[...e.workflowFiles].sort(),n=new Set(t),r=[...e.serdeFiles].sort().filter(e=>!n.has(e));if(t.length===0&&r.length===0)return``;let i=[...t.map(e=>createWorkflowImport(e,this.config.workingDir)),...r.map(e=>createWorkflowImport(e,this.config.workingDir))].join(`
1
+ import{mkdir,readFile,writeFile}from"node:fs/promises";import{dirname,join,resolve}from"node:path";import{resolvePackageSourceDirectoryPath,resolveWorkflowModulePath}from"#internal/application/package.js";import{buildSingleRolldownChunk}from"#internal/bundler/nitro-rolldown.js";import{createAuthoredPackageTsConfigPathsPlugin}from"#internal/authored-package-tsconfig-paths.js";import{createAuthoredRelativeExtensionResolverPlugin}from"#internal/authored-relative-extension-resolver.js";import{findWorkflowPatterns}from"#internal/workflow-bundle/workflow-builders.js";import{mapConcurrent}from"#shared/map-concurrent.js";import{onVendoredDependencyLog}from"#internal/bundler/vendored-dependency-log.js";import{prepareEveVersionedCacheDirectory,writeEveVersionedCacheMetadata}from"#internal/application/cache-metadata.js";import{WORKFLOW_BUILDER_DEFERRED_PACKAGES,WORKFLOW_STEP_EXTERNAL_PACKAGES}from"#internal/workflow-bundle/vercel-workflow-output.js";import{deriveEveWorkflowQueueNamespace}from"#internal/workflow/queue-namespace.js";import{runQueuedWorkflowBuild}from"#internal/workflow-bundle/build-queue.js";import{WORKFLOW_SOURCE_EXTENSIONS,WORKFLOW_VIRTUAL_ENTRY_ID,bundleFinalWorkflowOutput,collectWorkflowInputFiles,composeWorkflowDriverCode,convertClassesManifest,convertStepsManifest,convertWorkflowsManifest,createEvePackageImportsPlugin,createWorkflowDriverAliasPlugin,createWorkflowImport,createWorkflowNodeBuiltinGuardPlugin,createWorkflowPseudoPackagePlugin,createWorkflowTransformPlugin,createWorkflowVirtualEntryPlugin,mergeWorkflowManifest}from"#internal/workflow-bundle/builder-support.js";import{writeNitroStepEntrypoint}from"#internal/workflow-bundle/nitro-step-entry.js";var WorkflowBundleBuilder=class{#e;#t;#n;#r;config;constructor(e){let t=[resolvePackageSourceDirectoryPath(`src/execution`),resolvePackageSourceDirectoryPath(`src/runtime/subagents`),resolvePackageSourceDirectoryPath(`src/runtime/connections/events`),resolvePackageSourceDirectoryPath(`src/subagents`),resolvePackageSourceDirectoryPath(`src/tools/provided`)];e.includeTestFixtures===!0&&t.push(resolvePackageSourceDirectoryPath(`src/internal/testing`)),this.config={buildTarget:`standalone`,dirs:t,externalPackages:[...WORKFLOW_STEP_EXTERNAL_PACKAGES,...WORKFLOW_BUILDER_DEFERRED_PACKAGES],projectRoot:e.appRoot,watch:e.watch,workingDir:e.rootDir},this.#e=e.authoredWorkflowModules??{directiveModules:[],workflowModules:[]},this.#t=e.compiledArtifactsBootstrapPath,this.#n=e.outDir,this.#r=deriveEveWorkflowQueueNamespace(e.agentName)}async build(e={}){await runQueuedWorkflowBuild(this.#n,async()=>this.#i(e))}async#i(e){await prepareEveVersionedCacheDirectory(this.#n);let t=await this.#o();if(t.length===0)throw Error(`Expected framework workflow source files under eve's execution, runtime/subagents, subagents, or tools/provided source directories.`);let n=await this.findTsConfigPath();await mkdir(this.#n,{recursive:!0});let r=await this.discoverEntries(t),i=this.#e,a=mergeStepEntries(r,i),o=join(this.#n,`steps.mjs`),s=join(this.#n,`workflows.mjs`),c=e.nitroStepOutfile,l=e.nitroWorkflowOutfile,writeStepEntry=(e,t)=>writeNitroStepEntrypoint({builtinsPath:resolveWorkflowModulePath(`workflow/internal/builtins`),discoveredEntries:a,outfile:e,precomputedManifest:t,preferAbsoluteFileImports:!0,projectRoot:this.config.projectRoot??this.config.workingDir,sideEffectFiles:[this.#t],workingDir:this.config.workingDir}),u=await writeStepEntry(o);c!==void 0&&c!==o&&await writeStepEntry(c,u);let{manifest:d}=await this.createWorkflowsBundle({additionalOutputs:l===void 0||l===s?[]:[{outfile:l,stepRegistrationsPath:c??o}],appWorkflowFiles:i.workflowModules,frameworkSerdeFiles:r.discoveredSerdeFiles,frameworkWorkflowFiles:r.discoveredWorkflows,outfile:s,stepRegistrationsPath:o,tsconfigPath:n});await this.createManifest({workflowBundlePath:join(this.#n,`workflows.mjs`),manifestDir:this.#n,manifest:{steps:{...u.steps,...d.steps},workflows:{...u.workflows,...d.workflows},classes:{...u.classes,...d.classes}}}),await writeEveVersionedCacheMetadata(this.#n)}get transformProjectRoot(){return this.config.projectRoot??this.config.workingDir}async findTsConfigPath(){let e=this.transformProjectRoot;for(;;){for(let t of[`tsconfig.json`,`jsconfig.json`]){let n=join(e,t);try{return await readFile(n),n}catch(e){if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e}}let t=dirname(e);if(t===e)return;e=t}}async getInputFiles(){let e=this.config.dirs.map(e=>resolve(this.config.workingDir,e));return(await Promise.all(e.map(e=>collectWorkflowInputFiles(e)))).flat()}async discoverEntries(e){let t={discoveredSerdeFiles:[],discoveredSteps:[],discoveredWorkflows:[]},n=await mapConcurrent(e,async e=>{let t=await readFile(e,`utf8`);return{filePath:e,patterns:await findWorkflowPatterns(e,t)}});for(let{filePath:e,patterns:r}of n)r.hasUseStep&&t.discoveredSteps.push(e),r.hasUseWorkflow&&t.discoveredWorkflows.push(e),r.hasSerde&&t.discoveredSerdeFiles.push(e);return t}async createWorkflowsBundle({additionalOutputs:e=[],appWorkflowFiles:t,frameworkSerdeFiles:n,frameworkWorkflowFiles:r,outfile:i,stepRegistrationsPath:a,tsconfigPath:o}){let s={},c=await mapConcurrent([{label:`framework`,serdeFiles:n,workflowFiles:r},{label:`app`,serdeFiles:[],workflowFiles:t}],async e=>{let t={};return{code:await this.#a({...e,manifest:t,tsconfigPath:o}),manifest:t}});for(let e of c)mergeWorkflowManifest(s,e.manifest);let l=composeWorkflowDriverCode(c.map(e=>e.code));return await Promise.all([{outfile:i,stepRegistrationsPath:a},...e].map(e=>bundleFinalWorkflowOutput({code:l,outfile:e.outfile,queueNamespace:this.#r,stepRegistrationsPath:e.stepRegistrationsPath}))),{manifest:s}}async#a(e){let t=[...e.workflowFiles].sort(),n=new Set(t),r=[...e.serdeFiles].sort().filter(e=>!n.has(e));if(t.length===0&&r.length===0)return``;let i=[...t.map(e=>createWorkflowImport(e,this.config.workingDir)),...r.map(e=>createWorkflowImport(e,this.config.workingDir))].join(`
2
2
  `);return(await buildSingleRolldownChunk(`${e.label} workflow driver chunk`,{cwd:this.config.workingDir,onLog(e,t,n){if(e===`warn`&&t.code===`UNRESOLVED_IMPORT`)throw Error(`Cannot build workflow bundle: ${t.message}`);onVendoredDependencyLog(e,t,n)},input:WORKFLOW_VIRTUAL_ENTRY_ID,platform:`neutral`,plugins:[createWorkflowVirtualEntryPlugin(i),createWorkflowPseudoPackagePlugin(),createWorkflowDriverAliasPlugin(this.config.workingDir),createAuthoredRelativeExtensionResolverPlugin({extensions:WORKFLOW_SOURCE_EXTENSIONS}),createAuthoredPackageTsConfigPathsPlugin({appPackageRoot:this.transformProjectRoot,extensions:WORKFLOW_SOURCE_EXTENSIONS}),createEvePackageImportsPlugin(this.config.workingDir,{workflowCondition:!0}),createWorkflowTransformPlugin({manifest:e.manifest,projectRoot:this.transformProjectRoot,sideEffectFiles:[...t,...r],workingDir:this.config.workingDir}),createWorkflowNodeBuiltinGuardPlugin()],resolve:{conditionNames:[`eve-source`,`workflow`],extensions:WORKFLOW_SOURCE_EXTENSIONS,mainFields:[`module`,`main`]},tsconfig:e.tsconfigPath??!1,output:{comments:!1,format:`cjs`,sourcemap:`inline`}})).code}async createManifest({manifest:e,manifestDir:t}){let n={version:`1.0.0`,steps:convertStepsManifest(e.steps),workflows:convertWorkflowsManifest(e.workflows),classes:convertClassesManifest(e.classes)},r=JSON.stringify(n,null,2);return await mkdir(t,{recursive:!0}),await writeFile(join(t,`manifest.json`),r),r}async#o(){return await this.getInputFiles()}};function mergeStepEntries(e,t){return{discoveredSerdeFiles:e.discoveredSerdeFiles,discoveredSteps:[...new Set([...e.discoveredSteps,...t.directiveModules])]}}export{WorkflowBundleBuilder};
@@ -1 +1 @@
1
- function findProperty(e,t){return e.properties?.find(e=>e.type===`Property`&&!e.computed&&(e.key?.type===`Identifier`?e.key.name===t:e.key?.value===t))}function walkNode(e,t){if(t(e))for(let n of Object.values(e))if(Array.isArray(n))for(let e of n)isAstNode(e)&&walkNode(e,t);else isAstNode(n)&&walkNode(n,t)}function getChildContext(e,t,n){return t===`typeAnnotation`||t===`returnType`||t===`typeParameters`||t===`typeArguments`?null:e.type===`VariableDeclarator`&&t===`id`||(e.type===`FunctionExpression`||e.type===`ArrowFunctionExpression`||e.type===`FunctionDeclaration`)&&(t===`id`||t===`params`)||e.type===`CatchClause`&&t===`param`||(e.type===`ClassDeclaration`||e.type===`ClassExpression`)&&t===`id`?`binding`:e.type===`Property`&&t===`key`?e.computed===!0?`reference`:null:e.type===`Property`&&t===`value`?n:e.type===`AssignmentPattern`?t===`right`?`reference`:n:(e.type===`ObjectPattern`||e.type===`ArrayPattern`||e.type===`RestElement`)&&(t===`properties`||t===`elements`||t===`argument`)?n:(e.type===`MemberExpression`||e.type===`OptionalMemberExpression`)&&t===`property`||(e.type===`MethodDefinition`||e.type===`PropertyDefinition`)&&t===`key`?e.computed===!0?`reference`:null:(e.type===`LabeledStatement`||e.type===`BreakStatement`||e.type===`ContinueStatement`)&&t===`label`?null:`reference`}function isRuntimeTypeScriptExpression(e){return e.type===`TSAsExpression`||e.type===`TSInstantiationExpression`||e.type===`TSNonNullExpression`||e.type===`TSSatisfiesExpression`||e.type===`TSTypeAssertion`}function isAstNode(e){return typeof e==`object`&&!!e&&typeof e.type==`string`}function findEveImportAliases(e,t){let n=new Set;return walkNode(e,e=>{if(e.type!==`ImportDeclaration`)return!0;let r=e.source?.value;if(typeof r!=`string`||r!==`eve`&&!r.startsWith(`eve/`))return!1;for(let r of e.specifiers??[]){if(r.type===`ImportNamespaceSpecifier`&&r.local?.name)for(let e of t)n.add(`${r.local.name}.${e}`);r.type===`ImportSpecifier`&&t.includes(String(r.imported?.name??r.imported?.value))&&r.local?.name&&n.add(r.local.name)}return!1}),n}function readDefinerName(e){if(e?.type===`Identifier`)return e.name;if(e?.type!==`MemberExpression`||e.object?.type!==`Identifier`)return;let t=e.computed?e.property?.value:e.property?.name;return typeof t==`string`?`${e.object.name}.${t}`:void 0}function collectPatternNames(e,t){if(e){if(e.type===`Identifier`&&e.name){t.push(e.name);return}if(e.type===`ObjectPattern`)for(let n of e.properties??[])collectPatternNames(n.type===`RestElement`?n.argument:n.value,t);if(e.type===`ArrayPattern`)for(let n of e.elements??[])collectPatternNames(n,t);e.type===`AssignmentPattern`&&collectPatternNames(e.left,t)}}function extractParamNames(e){let t=[];for(let n of e.params??[])collectPatternNames(n,t);return t}function isFunction(e){return e.type===`ArrowFunctionExpression`||e.type===`FunctionDeclaration`||e.type===`FunctionExpression`}function walkDefinerCalls(e,t,n){let walk=(e,r)=>{let i=e.arguments?.[0];if(e.type===`CallExpression`&&t.has(readDefinerName(e.callee)??``)&&e.arguments?.length===1&&i?.type===`ObjectExpression`){n(e,i,r);return}let a=e.type===`Program`?r:withScopeBindings(e,r);for(let t of Object.values(e))for(let e of Array.isArray(t)?t:[t])isAstNode(e)&&walk(e,a)};walk(e,new Set)}function collectFreeVariables(e){let t=new Set,visit=(e,n,r)=>{if(e.type?.startsWith(`TS`)){isRuntimeTypeScriptExpression(e)&&e.expression&&visit(e.expression,`reference`,r);return}e.type===`Identifier`&&e.name&&n===`reference`&&!r.has(e.name)&&t.add(e.name);let i=withScopeBindings(e,r);for(let[t,r]of Object.entries(e)){let a=getChildContext(e,t,n);if(a)for(let e of Array.isArray(r)?r:[r])isAstNode(e)&&visit(e,a,i)}};return visit(e,`reference`,new Set),t}function withScopeBindings(e,t){let n=scopeBindings(e);return n.length===0?t:new Set([...t,...n])}function scopeBindings(e){let t=[];if(isFunction(e)){e.type===`FunctionExpression`&&e.id?.name&&t.push(e.id.name);for(let n of e.params??[])collectPatternNames(n,t);isAstNode(e.body)&&collectVarNames(e.body,t)}else if(e.type===`BlockStatement`||e.type===`StaticBlock`)collectLexicalNames(e.body,t);else if(e.type===`SwitchStatement`)for(let n of e.cases??[])collectLexicalNames(n.consequent,t);else if(e.type===`ForStatement`||e.type===`ForInStatement`||e.type===`ForOfStatement`){let n=e.type===`ForStatement`?e.init:e.left;if(n?.type===`VariableDeclaration`&&n.kind!==`var`)for(let e of n.declarations??[])collectPatternNames(e.id,t)}else e.type===`CatchClause`?collectPatternNames(e.param??null,t):e.type===`ClassExpression`&&e.id?.name&&t.push(e.id.name);return t}function collectVarNames(e,t){walkNode(e,e=>{if(isFunction(e))return!1;if(e.type===`VariableDeclaration`&&e.kind===`var`)for(let n of e.declarations??[])collectPatternNames(n.id,t);return!0})}function collectLexicalNames(e,t){if(Array.isArray(e))for(let n of e)if(n.type===`VariableDeclaration`&&n.kind!==`var`)for(let e of n.declarations??[])collectPatternNames(e.id,t);else(n.type===`FunctionDeclaration`||n.type===`ClassDeclaration`||n.type===`TSEnumDeclaration`)&&n.id?.name&&t.push(n.id.name)}export{collectFreeVariables,collectPatternNames,extractParamNames,findEveImportAliases,findProperty,isAstNode,isFunction,readDefinerName,walkDefinerCalls,walkNode};
1
+ function findProperty(e,t){return e.properties?.find(e=>e.type===`Property`&&!e.computed&&(e.key?.type===`Identifier`?e.key.name===t:e.key?.value===t))}function walkNode(e,t){if(t(e))for(let n of Object.values(e))if(Array.isArray(n))for(let e of n)isAstNode(e)&&walkNode(e,t);else isAstNode(n)&&walkNode(n,t)}function getChildContext(e,t,n){return t===`typeAnnotation`||t===`returnType`||t===`typeParameters`||t===`typeArguments`?null:e.type===`VariableDeclarator`&&t===`id`||(e.type===`FunctionExpression`||e.type===`ArrowFunctionExpression`||e.type===`FunctionDeclaration`)&&(t===`id`||t===`params`)||e.type===`CatchClause`&&t===`param`||(e.type===`ClassDeclaration`||e.type===`ClassExpression`)&&t===`id`?`binding`:e.type===`Property`&&t===`key`?e.computed===!0?`reference`:null:e.type===`Property`&&t===`value`?n:e.type===`AssignmentPattern`?t===`right`?`reference`:n:(e.type===`ObjectPattern`||e.type===`ArrayPattern`||e.type===`RestElement`)&&(t===`properties`||t===`elements`||t===`argument`)?n:(e.type===`MemberExpression`||e.type===`OptionalMemberExpression`)&&t===`property`||(e.type===`MethodDefinition`||e.type===`PropertyDefinition`)&&t===`key`?e.computed===!0?`reference`:null:(e.type===`LabeledStatement`||e.type===`BreakStatement`||e.type===`ContinueStatement`)&&t===`label`?null:`reference`}function isRuntimeTypeScriptExpression(e){return e.type===`TSAsExpression`||e.type===`TSInstantiationExpression`||e.type===`TSNonNullExpression`||e.type===`TSSatisfiesExpression`||e.type===`TSTypeAssertion`}function isAstNode(e){return typeof e==`object`&&!!e&&typeof e.type==`string`}function findEveImportAliases(e,t){let n=new Set;return walkNode(e,e=>{if(e.type!==`ImportDeclaration`)return!0;let r=e.source?.value;if(typeof r!=`string`||r!==`eve`&&!r.startsWith(`eve/`))return!1;for(let r of e.specifiers??[]){if(r.type===`ImportNamespaceSpecifier`&&r.local?.name)for(let e of t)n.add(`${r.local.name}.${e}`);r.type===`ImportSpecifier`&&t.includes(String(r.imported?.name??r.imported?.value))&&r.local?.name&&n.add(r.local.name)}return!1}),n}function readDefinerName(e){if(e?.type===`Identifier`)return e.name;if(e?.type!==`MemberExpression`||e.object?.type!==`Identifier`)return;let t=e.computed?e.property?.value:e.property?.name;return typeof t==`string`?`${e.object.name}.${t}`:void 0}function collectPatternNames(e,t){if(e){if(e.type===`Identifier`&&e.name){t.push(e.name);return}if(e.type===`ObjectPattern`)for(let n of e.properties??[])collectPatternNames(n.type===`RestElement`?n.argument:n.value,t);if(e.type===`ArrayPattern`)for(let n of e.elements??[])collectPatternNames(n,t);e.type===`RestElement`&&collectPatternNames(e.argument,t),e.type===`AssignmentPattern`&&collectPatternNames(e.left,t)}}function extractParamNames(e){let t=[];for(let n of e.params??[])collectPatternNames(n,t);return t}function isFunction(e){return e.type===`ArrowFunctionExpression`||e.type===`FunctionDeclaration`||e.type===`FunctionExpression`}function walkDefinerCalls(e,t,n){let walk=(e,r)=>{let i=e.arguments?.[0];if(e.type===`CallExpression`&&t.has(readDefinerName(e.callee)??``)&&e.arguments?.length===1&&i?.type===`ObjectExpression`){n(e,i,r);return}let a=e.type===`Program`?r:withScopeBindings(e,r);for(let t of Object.values(e))for(let e of Array.isArray(t)?t:[t])isAstNode(e)&&walk(e,a)};walk(e,new Set)}function collectFreeVariables(e){let t=new Set,visit=(e,n,r)=>{if(e.type?.startsWith(`TS`)){isRuntimeTypeScriptExpression(e)&&e.expression&&visit(e.expression,`reference`,r);return}e.type===`Identifier`&&e.name&&n===`reference`&&!r.has(e.name)&&t.add(e.name);let i=withScopeBindings(e,r);for(let[t,r]of Object.entries(e)){let a=getChildContext(e,t,n);if(a)for(let e of Array.isArray(r)?r:[r])isAstNode(e)&&visit(e,a,i)}};return visit(e,`reference`,new Set),t}function withScopeBindings(e,t){let n=scopeBindings(e);return n.length===0?t:new Set([...t,...n])}function scopeBindings(e){let t=[];if(isFunction(e)){e.type===`FunctionExpression`&&e.id?.name&&t.push(e.id.name);for(let n of e.params??[])collectPatternNames(n,t);isAstNode(e.body)&&collectVarNames(e.body,t)}else if(e.type===`BlockStatement`||e.type===`StaticBlock`)collectLexicalNames(e.body,t);else if(e.type===`SwitchStatement`)for(let n of e.cases??[])collectLexicalNames(n.consequent,t);else if(e.type===`ForStatement`||e.type===`ForInStatement`||e.type===`ForOfStatement`){let n=e.type===`ForStatement`?e.init:e.left;if(n?.type===`VariableDeclaration`&&n.kind!==`var`)for(let e of n.declarations??[])collectPatternNames(e.id,t)}else e.type===`CatchClause`?collectPatternNames(e.param??null,t):e.type===`ClassExpression`&&e.id?.name&&t.push(e.id.name);return t}function collectVarNames(e,t){walkNode(e,e=>{if(isFunction(e))return!1;if(e.type===`VariableDeclaration`&&e.kind===`var`)for(let n of e.declarations??[])collectPatternNames(n.id,t);return!0})}function collectLexicalNames(e,t){if(Array.isArray(e))for(let n of e)if(n.type===`VariableDeclaration`&&n.kind!==`var`)for(let e of n.declarations??[])collectPatternNames(e.id,t);else(n.type===`FunctionDeclaration`||n.type===`ClassDeclaration`||n.type===`TSEnumDeclaration`)&&n.id?.name&&t.push(n.id.name)}export{collectFreeVariables,collectPatternNames,extractParamNames,findEveImportAliases,findProperty,isAstNode,isFunction,readDefinerName,walkDefinerCalls,walkNode};
@@ -1,2 +1,2 @@
1
- import{cardChildToFallbackText}from"#compiled/chat/index.js";import{cardToSlackBlocks}from"#compiled/@chat-adapter/slack/blocks.js";function cardToBlocks(e){return cardToSlackBlocks({...e,children:e.children.map(preserveLinkActionId)})}function cardToFallbackText(e){let t=[];e.title&&t.push(e.title),e.subtitle&&t.push(e.subtitle);for(let n of e.children){let e=cardChildToFallbackText(n);e&&t.push(e)}return t.join(`
2
- `).trim()}function preserveLinkActionId(e){return e.type===`section`?{...e,children:e.children.map(preserveLinkActionId)}:e.type===`actions`?{...e,children:e.children.map(e=>e.type===`link-button`&&e.id===void 0?{...e,id:`link:${e.url}`}:e)}:e}export{cardToBlocks,cardToFallbackText};
1
+ import{cardChildToFallbackText}from"#compiled/chat/index.js";import{cardToSlackBlocks}from"#compiled/@chat-adapter/slack/blocks.js";function cardToBlocks(e){return cardToSlackBlocks({...e,children:e.children.map(toSlackCardChild)})}function cardToFallbackText(e){let t=[];e.title&&t.push(e.title),e.subtitle&&t.push(e.subtitle);for(let n of e.children){let e=cardChildToFallbackText(n);e&&t.push(e)}return t.join(`
2
+ `).trim()}function toSlackCardChild(e){return e.type===`section`?{...e,children:e.children.map(toSlackCardChild)}:e.type===`text_input`?{content:e.label,type:`text`}:e.type===`actions`?{...e,children:e.children.map(e=>e.type===`link-button`&&e.id===void 0?{...e,id:`link:${e.url}`}:e)}:e}export{cardToBlocks,cardToFallbackText};