eve 0.79.1 → 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.
- package/CHANGELOG.md +39 -0
- package/dist/src/channel/pending-authorization.d.ts +10 -0
- package/dist/src/channel/pending-authorization.js +1 -0
- package/dist/src/compiled/.vendor-stamp.json +7 -7
- package/dist/src/compiled/@chat-adapter/slack/api.d.ts +6 -0
- package/dist/src/compiled/@chat-adapter/slack/api.js +1 -1
- package/dist/src/compiled/@chat-adapter/slack/blocks.js +1 -1
- package/dist/src/compiled/@chat-adapter/slack/format.js +1 -1
- package/dist/src/compiled/@chat-adapter/slack/index.d.ts +14 -8
- package/dist/src/compiled/@chat-adapter/slack/index.js +33 -32
- package/dist/src/compiled/@chat-adapter/twilio/index.d.ts +37 -1
- package/dist/src/compiled/@chat-adapter/twilio/index.js +2 -2
- package/dist/src/compiled/@eve/tracing/index.js +1 -1
- package/dist/src/compiled/@eve/tracing/otel.js +1 -1
- package/dist/src/compiled/@linqapp/chat-sdk-adapter/index.js +1 -1
- package/dist/src/compiled/@photon-ai/chat-adapter-imessage/index.js +1 -1
- package/dist/src/compiled/@vercel/connect/index.js +5 -5
- package/dist/src/compiled/@vercel/connect/token.d.ts +11 -1
- package/dist/src/compiled/_chunks/node/chunk-NBSLXVG3-Bt7pDfyn.js +12 -0
- package/dist/src/compiled/_chunks/node/dist-BKsV21Vu.js +6 -0
- package/dist/src/compiled/_chunks/node/dist-CO_n_hUa.js +98 -0
- package/dist/src/compiled/_chunks/workflow/{mcp-C01bDEX-.js → mcp-Bwx_LQ4q.js} +4 -4
- package/dist/src/compiled/chat/index.js +1 -1
- package/dist/src/compiler/extension-compatibility.d.ts +18 -18
- package/dist/src/compiler/extension-compatibility.js +1 -1
- package/dist/src/compiler/manifest.d.ts +8 -4
- package/dist/src/compiler/manifest.js +1 -1
- package/dist/src/compiler/normalize-connection.js +1 -1
- package/dist/src/compiler/normalize-manifest.js +1 -1
- package/dist/src/context/schedule-collection-tools.js +1 -1
- package/dist/src/execution/catalog/connection-auth.d.ts +4 -2
- package/dist/src/execution/catalog/connection-auth.js +1 -1
- package/dist/src/execution/catalog/connection-entry.js +1 -1
- package/dist/src/execution/dynamic-workflow/tool.js +1 -1
- package/dist/src/execution/proxied-deliver-step.js +1 -1
- package/dist/src/execution/publish-session-events.d.ts +13 -3
- package/dist/src/execution/publish-session-events.js +1 -1
- package/dist/src/execution/sandbox/bindings/microsandbox-runtime.js +1 -1
- package/dist/src/execution/session/active-turn.d.ts +2 -1
- package/dist/src/execution/session/active-turn.js +1 -1
- package/dist/src/execution/session/entry.js +1 -1
- package/dist/src/execution/session/turn-step.js +1 -1
- package/dist/src/execution/session/turn.d.ts +1 -0
- package/dist/src/execution/session/turn.js +1 -1
- package/dist/src/execution/session-event-stream.js +1 -1
- package/dist/src/execution/stable-workflow-names.d.ts +2 -0
- package/dist/src/execution/stable-workflow-names.js +1 -1
- package/dist/src/execution/tasks/task-id-input.js +1 -1
- package/dist/src/execution/tools/agent-router-workflow.js +1 -1
- package/dist/src/execution/tools/workflow/apply-run-messages-step.d.ts +6 -2
- package/dist/src/execution/tools/workflow/apply-run-messages-step.js +1 -1
- package/dist/src/execution/tools/workflow/body.d.ts +10 -1
- package/dist/src/execution/tools/workflow/body.js +1 -1
- package/dist/src/execution/tools/workflow/owner-inbox.js +1 -1
- package/dist/src/execution/tools/workflow/serve.js +1 -1
- package/dist/src/execution/web-fetch/execute.js +1 -1
- package/dist/src/execution/workflow-runtime.d.ts +6 -0
- package/dist/src/execution/workflow-runtime.js +1 -1
- package/dist/src/extensions/git/extension/extension.d.ts +3 -1
- package/dist/src/extensions/git/extension/extension.js +1 -1
- package/dist/src/extensions/git/extension/lib/gh-tool.js +1 -1
- package/dist/src/extensions/git/extension/lib/github-shell.d.ts +14 -0
- package/dist/src/extensions/git/extension/lib/github-shell.js +1 -1
- package/dist/src/harness/action-result-helpers.js +1 -1
- package/dist/src/harness/attachment-staging.js +1 -1
- package/dist/src/harness/compaction/engine.js +3 -1
- package/dist/src/harness/compaction/prompt.d.ts +7 -0
- package/dist/src/harness/compaction/prompt.js +1 -1
- package/dist/src/harness/hitl/approvals.js +1 -1
- package/dist/src/harness/hitl/approved-calls.js +1 -1
- package/dist/src/harness/input-request-resolution.d.ts +2 -1
- package/dist/src/harness/input-request-resolution.js +1 -1
- package/dist/src/harness/model-call/call.js +1 -1
- package/dist/src/harness/model-call/errors.d.ts +2 -2
- package/dist/src/harness/model-call/recovery.d.ts +2 -3
- package/dist/src/instrumentation/native-events.js +1 -1
- package/dist/src/instrumentation/session-init.d.ts +2 -1
- package/dist/src/instrumentation/session-init.js +1 -1
- package/dist/src/internal/application/optional-package-import.d.ts +5 -0
- package/dist/src/internal/application/optional-package-import.js +1 -1
- package/dist/src/internal/application/stamped-package-version.js +1 -1
- package/dist/src/internal/authored-definition/connection.js +1 -1
- package/dist/src/internal/authored-definition/schedule-collection.js +1 -1
- package/dist/src/internal/nitro/host/application-route-registry.d.ts +7 -2
- package/dist/src/internal/nitro/host/application-route-registry.js +1 -1
- package/dist/src/internal/nitro/host/configure-nitro-routes.js +1 -1
- package/dist/src/internal/nitro/host/start-production-server.js +2 -2
- package/dist/src/internal/nitro/routes/channel-request-instrumentation.d.ts +3 -1
- package/dist/src/internal/nitro/routes/channel-request-instrumentation.js +1 -1
- package/dist/src/internal/nitro/routes/connection-events.d.ts +5 -0
- package/dist/src/internal/nitro/routes/connection-events.js +1 -0
- package/dist/src/internal/workflow-bundle/builder.js +1 -1
- package/dist/src/internal/workflow-bundle/dynamic-tool-ast-references.js +1 -1
- package/dist/src/protocol/message.d.ts +2 -0
- package/dist/src/protocol/message.js +1 -1
- package/dist/src/public/channels/slack/blocks.js +2 -2
- package/dist/src/public/channels/teams/authorization.d.ts +53 -0
- package/dist/src/public/channels/teams/authorization.js +1 -0
- package/dist/src/public/channels/teams/defaults.js +2 -2
- package/dist/src/public/channels/teams/hitl.d.ts +2 -1
- package/dist/src/public/channels/teams/teamsChannel.js +1 -1
- package/dist/src/public/channels/telegram/authorization-callback.js +1 -1
- package/dist/src/public/connections/index.d.ts +1 -0
- package/dist/src/public/definitions/connections/events.d.ts +43 -0
- package/dist/src/public/definitions/connections/events.js +1 -0
- package/dist/src/public/definitions/connections/mcp.d.ts +3 -0
- package/dist/src/public/next/index.js +1 -1
- package/dist/src/public/next/server.d.ts +11 -2
- package/dist/src/public/next/server.js +1 -1
- package/dist/src/public/schedules/subscription.d.ts +4 -3
- package/dist/src/runtime/connections/events/actions.d.ts +17 -0
- package/dist/src/runtime/connections/events/actions.js +1 -0
- package/dist/src/runtime/connections/events/delivery.d.ts +10 -0
- package/dist/src/runtime/connections/events/delivery.js +1 -0
- package/dist/src/runtime/connections/events/dispatch-step.d.ts +20 -0
- package/dist/src/runtime/connections/events/dispatch-step.js +1 -0
- package/dist/src/runtime/connections/events/lifecycle-step.d.ts +42 -0
- package/dist/src/runtime/connections/events/lifecycle-step.js +1 -0
- package/dist/src/runtime/connections/events/owner.d.ts +38 -0
- package/dist/src/runtime/connections/events/owner.js +1 -0
- package/dist/src/runtime/connections/events/path.d.ts +4 -0
- package/dist/src/runtime/connections/events/path.js +1 -0
- package/dist/src/runtime/connections/events/state.d.ts +37 -0
- package/dist/src/runtime/connections/events/state.js +1 -0
- package/dist/src/runtime/connections/events/workflow.d.ts +28 -0
- package/dist/src/runtime/connections/events/workflow.js +1 -0
- package/dist/src/runtime/connections/mcp-client.d.ts +4 -2
- package/dist/src/runtime/connections/mcp-client.js +1 -1
- package/dist/src/runtime/connections/openapi-client.js +1 -1
- package/dist/src/runtime/connections/scoped-authorization.js +1 -1
- package/dist/src/runtime/resolve-connection.js +1 -1
- package/dist/src/runtime/schedules/collection-client.d.ts +0 -2
- package/dist/src/runtime/schedules/collection-client.js +1 -1
- package/dist/src/runtime/types.d.ts +11 -0
- package/dist/src/setup/scaffold/create/add-to-project.js +1 -1
- package/dist/src/setup/scaffold/create/project.js +2 -2
- package/dist/src/setup/scaffold/update/channels.js +1 -1
- package/dist/src/setup/scaffold/update/connections.js +2 -2
- package/dist/src/setup/scaffold/version-tokens.d.ts +1 -1
- package/dist/src/setup/scaffold/version-tokens.js +1 -1
- package/dist/src/shared/action-types.d.ts +1 -0
- package/dist/src/shared/action-types.js +1 -1
- package/dist/src/shared/agent-definition.d.ts +12 -4
- package/dist/src/shared/connection-events.d.ts +84 -0
- package/dist/src/shared/connection-events.js +1 -0
- package/dist/src/shared/connection-types.d.ts +10 -0
- package/dist/src/shared/validate-authorization.js +1 -1
- package/dist/src/tools/provided/ask-question-workflow.js +1 -1
- package/dist/src/tools/provided/no-reply.d.ts +5 -0
- package/dist/src/tools/provided/sleep-workflow.js +1 -1
- package/dist/src/tools/signature.d.ts +4 -2
- package/dist/src/tools/signature.js +1 -1
- package/dist/src/tracing/eve/connection-events.d.ts +25 -0
- package/dist/src/tracing/eve/connection-events.js +1 -0
- package/dist/src/tracing/eve/install-instrumentation-runtime.js +1 -1
- package/dist/src/tracing/eve/mcp.d.ts +1 -0
- package/dist/src/tracing/eve/mcp.js +1 -1
- package/dist/src/tracing/eve/otel-declaration.d.ts +5 -0
- package/docs/agent-config.md +38 -13
- package/docs/channels/teams.mdx +6 -0
- package/docs/code-extension.mdx +28 -0
- package/docs/concepts/built-in-tools.md +3 -1
- package/docs/connections/mcp.mdx +105 -0
- package/docs/guides/hooks.md +4 -0
- package/docs/guides/instrumentation/instrumentation.mdx +2 -0
- package/docs/guides/instrumentation/otel.mdx +10 -0
- package/docs/sandbox/vercel.mdx +46 -0
- package/package.json +7 -7
- package/dist/src/compiled/_chunks/node/chunk-6QHBXN7B-gl4n6nmi.js +0 -12
- package/dist/src/compiled/_chunks/node/dist-DYDVZ-FS.js +0 -98
- package/dist/src/compiled/_chunks/node/dist-iEFkK9qw.js +0 -6
|
@@ -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
|
|
46
|
-
*
|
|
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
|
-
*
|
|
37
|
-
*
|
|
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 +1 @@
|
|
|
1
|
-
import{contextStorage}from"#context/container.js";import{rememberInstrumentationActionScope,rememberInstrumentationInputScope,takeInstrumentationActionScopeForCall,takeInstrumentationInputScope}from"#instrumentation/state.js";import{RuntimeActionSettlementTimesKey}from"#harness/runtime-action-settlement-state.js";import{isRuntimeWorkflowToolAction}from"#shared/action-types.js";import{actionIdempotencyKey,inputIdempotencyKey,sessionIdempotencyKey,toolCallIdempotencyKey,turnIdempotencyKey}from"#instrumentation/lifecycle.js";import{instrumentChannelDelivery}from"#instrumentation/channel-delivery.js";function createInstrumentationHandleEvent(e){if(e.hooks===void 0)return e.handleEvent;if(e.handleEvent===void 0)return;let t=e.handleEvent,n=e.hooks,r=new Set,i=new Set,a=e.turnId;return async(o,s)=>{let c=Date.now();await t(o,s);let l=toLifecycleEvent(o,e,a);if(o.type===`turn.started`&&(a=o.data.turnId),o.type===`turn.cancelled`||o.type===`turn.completed`||o.type===`turn.failed`||o.type===`session.completed`||o.type===`session.failed`){let e=contextStorage.getStore();e!==void 0&&await instrumentChannelDelivery({ctx:e,error:o.type===`turn.failed`||o.type===`session.failed`?Error(o.data.message):void 0,errorCode:o.type===`turn.failed`||o.type===`session.failed`?o.data.code:void 0,hooks:n,includeTurn:o.type===`turn.cancelled`||o.type===`turn.completed`||o.type===`turn.failed`||o.type===`session.failed`,outcome:o.type===`turn.failed`||o.type===`session.failed`?`failed`:o.type===`turn.cancelled`?`cancelled`:`completed`})}l!==void 0&&await n.publish(l),o.type===`actions.requested`?await publishActionStarts(o,e,n,r,c):o.type===`action.result`?await publishActionTerminal(o,e,n):o.type===`input.requested`&&await publishInputStarts(o,e,n,i)}}async function publishInputStarts(e,t,n,r){let i=t.getAttemptScope?.();if(i===void 0)return;let a=n.capturesOutputs??n.capturesContent;for(let o of e.data.requests){let s=inputIdempotencyKey(t.sessionId,e.data.turnId,o.requestId);r.has(s)||(r.add(s),rememberInstrumentationInputScope(s,i),await n.publish(Object.freeze({action:Object.freeze({callId:o.action.callId,name:o.action.toolName}),idempotencyKey:s,kind:o.kind,request:a?Object.freeze({allowFreeform:o.allowFreeform,display:o.display,options:o.options,prompt:o.prompt}):void 0,requestId:o.requestId,scope:i,type:`input.requested`})))}}async function publishInputResolutions(e){let t=e.hooks.capturesInputs??e.hooks.capturesContent;for(let n of e.batch.inputs){let r=inputIdempotencyKey(e.sessionId,e.batch.event.turnId,n.request.requestId),i=takeInstrumentationInputScope(r);i!==void 0&&await e.hooks.publish(Object.freeze({idempotencyKey:r,kind:n.request.kind,outcome:n.outcome,requestId:n.request.requestId,response:!t||n.response===void 0?void 0:Object.freeze({optionId:n.response.optionId,text:n.response.text}),scope:i,type:`input.resolved`}))}}async function publishActionStarts(e,t,n,r,i){let a=t.getAttemptScope?.();if(a===void 0)return;let o=n.capturesInputs??n.capturesContent;for(let s of e.data.actions){let c=isRuntimeWorkflowToolAction(s)||s.kind===`subagent-call`||s.kind===`remote-agent-call`,l=actionIdempotencyKey(t.sessionId,e.data.turnId,s.callId);r.has(l)||(r.add(l),rememberInstrumentationActionScope(l,a,c?{type:`tool.call.started`,callId:s.callId,toolName:actionName(s),frameworkTool:isFrameworkAction(s,t),scope:a,idempotencyKey:toolCallIdempotencyKey(a,s.callId,0),startedAtMs:Date.now(),input:o?s.input:void 0}:void 0),await n.publish(Object.freeze({callId:s.callId,startedAtMs:i,idempotencyKey:l,input:o?s.input:void 0,...c?{isWorkflowTool:!0}:void 0,kind:s.kind===`workflow-tool-call`?`tool-call`:s.kind,toolName:actionName(s),frameworkTool:isFrameworkAction(s,t),scope:a,type:`tool.call.started`})))}}async function publishActionTerminal(e,t,n){let r=takeInstrumentationActionScopeForCall(t.sessionId,e.data.result.callId);if(r===void 0)return;let{idempotencyKey:i,scope:a}=r,o=n.capturesOutputs??n.capturesContent;if(e.data.status===`completed`){await n.publish(Object.freeze({acceptedAtMs:contextStorage.getStore()?.get(RuntimeActionSettlementTimesKey)?.[e.data.result.callId],idempotencyKey:i,outcome:`completed`,output:Object.freeze(o?{output:e.data.result.output,type:`result`}:{type:`result`}),scope:a,type:`tool.call.completed`,usage:actionUsage(e.data.result)}));return}let s=o?e.data.error===void 0?e.data.result.output:
|
|
1
|
+
import{contextStorage}from"#context/container.js";import{rememberInstrumentationActionScope,rememberInstrumentationInputScope,takeInstrumentationActionScopeForCall,takeInstrumentationInputScope}from"#instrumentation/state.js";import{RuntimeActionSettlementTimesKey}from"#harness/runtime-action-settlement-state.js";import{isRuntimeWorkflowToolAction}from"#shared/action-types.js";import{actionIdempotencyKey,inputIdempotencyKey,sessionIdempotencyKey,toolCallIdempotencyKey,turnIdempotencyKey}from"#instrumentation/lifecycle.js";import{instrumentChannelDelivery}from"#instrumentation/channel-delivery.js";function createInstrumentationHandleEvent(e){if(e.hooks===void 0)return e.handleEvent;if(e.handleEvent===void 0)return;let t=e.handleEvent,n=e.hooks,r=new Set,i=new Set,a=e.turnId;return async(o,s)=>{let c=Date.now();await t(o,s);let l=toLifecycleEvent(o,e,a);if(o.type===`turn.started`&&(a=o.data.turnId),o.type===`turn.cancelled`||o.type===`turn.completed`||o.type===`turn.failed`||o.type===`session.completed`||o.type===`session.failed`){let e=contextStorage.getStore();e!==void 0&&await instrumentChannelDelivery({ctx:e,error:o.type===`turn.failed`||o.type===`session.failed`?Error(o.data.message):void 0,errorCode:o.type===`turn.failed`||o.type===`session.failed`?o.data.code:void 0,hooks:n,includeTurn:o.type===`turn.cancelled`||o.type===`turn.completed`||o.type===`turn.failed`||o.type===`session.failed`,outcome:o.type===`turn.failed`||o.type===`session.failed`?`failed`:o.type===`turn.cancelled`?`cancelled`:`completed`})}l!==void 0&&await n.publish(l),o.type===`actions.requested`?await publishActionStarts(o,e,n,r,c):o.type===`action.result`?await publishActionTerminal(o,e,n):o.type===`input.requested`&&await publishInputStarts(o,e,n,i)}}async function publishInputStarts(e,t,n,r){let i=t.getAttemptScope?.();if(i===void 0)return;let a=n.capturesOutputs??n.capturesContent;for(let o of e.data.requests){let s=inputIdempotencyKey(t.sessionId,e.data.turnId,o.requestId);r.has(s)||(r.add(s),rememberInstrumentationInputScope(s,i),await n.publish(Object.freeze({action:Object.freeze({callId:o.action.callId,name:o.action.toolName}),idempotencyKey:s,kind:o.kind,request:a?Object.freeze({allowFreeform:o.allowFreeform,display:o.display,options:o.options,prompt:o.prompt}):void 0,requestId:o.requestId,scope:i,type:`input.requested`})))}}async function publishInputResolutions(e){let t=e.hooks.capturesInputs??e.hooks.capturesContent;for(let n of e.batch.inputs){let r=inputIdempotencyKey(e.sessionId,e.batch.event.turnId,n.request.requestId),i=takeInstrumentationInputScope(r);i!==void 0&&await e.hooks.publish(Object.freeze({idempotencyKey:r,kind:n.request.kind,outcome:n.outcome,requestId:n.request.requestId,response:!t||n.response===void 0?void 0:Object.freeze({optionId:n.response.optionId,text:n.response.text}),scope:i,type:`input.resolved`}))}}async function publishActionStarts(e,t,n,r,i){let a=t.getAttemptScope?.();if(a===void 0)return;let o=n.capturesInputs??n.capturesContent;for(let s of e.data.actions){let c=isRuntimeWorkflowToolAction(s)||s.kind===`subagent-call`||s.kind===`remote-agent-call`,l=actionIdempotencyKey(t.sessionId,e.data.turnId,s.callId);r.has(l)||(r.add(l),rememberInstrumentationActionScope(l,a,c?{type:`tool.call.started`,callId:s.callId,toolName:actionName(s),frameworkTool:isFrameworkAction(s,t),scope:a,idempotencyKey:toolCallIdempotencyKey(a,s.callId,0),startedAtMs:Date.now(),input:o?s.input:void 0}:void 0),await n.publish(Object.freeze({callId:s.callId,startedAtMs:i,idempotencyKey:l,input:o?s.input:void 0,...c?{isWorkflowTool:!0}:void 0,kind:s.kind===`workflow-tool-call`?`tool-call`:s.kind,toolName:actionName(s),frameworkTool:isFrameworkAction(s,t),scope:a,type:`tool.call.started`})))}}async function publishActionTerminal(e,t,n){let r=takeInstrumentationActionScopeForCall(t.sessionId,e.data.result.callId);if(r===void 0)return;let{idempotencyKey:i,scope:a}=r,o=n.capturesOutputs??n.capturesContent;if(e.data.status===`completed`){await n.publish(Object.freeze({acceptedAtMs:contextStorage.getStore()?.get(RuntimeActionSettlementTimesKey)?.[e.data.result.callId],idempotencyKey:i,outcome:`completed`,output:Object.freeze(o?{output:e.data.result.output,type:`result`}:{type:`result`}),scope:a,type:`tool.call.completed`,usage:actionUsage(e.data.result)}));return}let s=o?e.data.error===void 0?e.data.result.output:toThrownError(e.data.error):void 0;await n.publish(Object.freeze({acceptedAtMs:contextStorage.getStore()?.get(RuntimeActionSettlementTimesKey)?.[e.data.result.callId],error:s,errorCode:e.data.error?.code,idempotencyKey:i,outcome:e.data.status,scope:a,type:`tool.call.failed`,usage:actionUsage(e.data.result)}))}function toThrownError({code:e,message:t,name:n}){let r=Object.assign(Error(t),{code:e});return n!==void 0&&(r.name=n),r}function actionUsage(e){if(e.kind!==`subagent-result`||e.origin!==`child`||e.usage===void 0)return;let t={inputTokenDetails:{cacheReadTokens:e.usage.cacheReadTokens,cacheWriteTokens:e.usage.cacheWriteTokens},inputTokens:e.usage.inputTokens,outputTokens:e.usage.outputTokens};return e.usage.costUsd!==void 0&&(t.costUsd=e.usage.costUsd),t}function isFrameworkAction(e,t){return e.kind===`load-skill`||t.isFrameworkTool?.(actionName(e))===!0}function actionName(e){return e.kind===`tool-call`||e.kind===`workflow-tool-call`?e.toolName:e.name}function toLifecycleEvent(e,t,n){switch(e.type){case`session.started`:return{agentName:t.agentName,channelAudience:t.channelAudience,channelKind:t.channelKind,idempotencyKey:sessionIdempotencyKey(t.sessionId),parentLineage:t.parentLineage,parentTraceContext:t.parentTraceContext,rootSessionId:t.rootSessionId??t.sessionId,traceSessionId:t.traceSessionId,scheduleId:t.scheduleId,sessionId:t.sessionId,title:t.title,type:`session.started`};case`session.completed`:case`session.waiting`:return{idempotencyKey:sessionIdempotencyKey(t.sessionId),sessionId:t.sessionId,turnId:n,type:e.type};case`session.failed`:return{error:Error(e.data.message),idempotencyKey:sessionIdempotencyKey(t.sessionId),sessionId:t.sessionId,turnId:n,type:`session.failed`};case`turn.started`:return{idempotencyKey:turnIdempotencyKey(t.sessionId,e.data.turnId),parentLineage:t.parentLineage,parentTraceContext:t.parentTraceContext,rootSessionId:t.rootSessionId??t.sessionId,traceSessionId:t.traceSessionId,sequence:e.data.sequence,sessionId:t.sessionId,turnId:e.data.turnId,type:`turn.started`};case`turn.completed`:case`turn.cancelled`:return{idempotencyKey:turnIdempotencyKey(t.sessionId,e.data.turnId),sessionId:t.sessionId,turnId:e.data.turnId,type:e.type};case`turn.failed`:return{error:Error(e.data.message),idempotencyKey:turnIdempotencyKey(t.sessionId,e.data.turnId),sessionId:t.sessionId,turnId:e.data.turnId,type:`turn.failed`};default:return}}export{createInstrumentationHandleEvent,publishInputResolutions};
|
|
@@ -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
|
-
}):
|
|
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};
|
|
@@ -7,3 +7,8 @@ export declare function resolveInstalledEnginePackageEntrypointHref(input: {
|
|
|
7
7
|
readonly appRoot: string;
|
|
8
8
|
readonly packageName: string;
|
|
9
9
|
}): Promise<string>;
|
|
10
|
+
/** Reads the version of an optional package installed in the application. */
|
|
11
|
+
export declare function readInstalledPackageVersion(input: {
|
|
12
|
+
readonly appRoot: string;
|
|
13
|
+
readonly packageName: string;
|
|
14
|
+
}): Promise<string | undefined>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readFile}from"node:fs/promises";import{existsSync}from"node:fs";import{dirname,join}from"node:path";import{pathToFileURL}from"node:url";async function importInstalledEnginePackage(e){return await import(await resolveInstalledEnginePackageEntrypointHref(e))}async function resolveInstalledEnginePackageEntrypointHref(e){let t=findInstalledPackageRoot(e),n=join(t,`package.json`),r=resolvePackageEntryPoint(JSON.parse(await readFile(n,`utf8`)));if(r.startsWith(`/`))throw Error(`Invalid absolute entrypoint for optional package "${e.packageName}".`);return pathToFileURL(join(t,r)).href}function findInstalledPackageRoot(e){let t=e.packageName.split(`/`),n=[],r=e.appRoot;for(;;){let i=join(r,`node_modules`,...t);if(n.push(i),existsSync(join(i,`package.json`)))return i;let a=dirname(r);if(a===r)throw Error(`Could not find installed optional dependency "${e.packageName}". Checked: ${n.join(`, `)}`);r=a}}function resolvePackageEntryPoint(e){let t=readDotExport(e.exports);return t===void 0?typeof e.module==`string`&&e.module.length>0?e.module:typeof e.main==`string`&&e.main.length>0?e.main:`index.js`:t}function readDotExport(e){if(typeof e==`string`&&e.length>0)return e;if(typeof e!=`object`||!e)return;let t=`.`in e?e[`.`]:e;if(typeof t==`string`&&t.length>0)return t;if(typeof t!=`object`||!t)return;let n=t;if(typeof n.import==`string`&&n.import.length>0)return n.import;if(typeof n.default==`string`&&n.default.length>0)return n.default}export{importInstalledEnginePackage,resolveInstalledEnginePackageEntrypointHref};
|
|
1
|
+
import{readFile}from"node:fs/promises";import{existsSync}from"node:fs";import{dirname,join}from"node:path";import{pathToFileURL}from"node:url";async function importInstalledEnginePackage(e){return await import(await resolveInstalledEnginePackageEntrypointHref(e))}async function resolveInstalledEnginePackageEntrypointHref(e){let t=findInstalledPackageRoot(e),n=join(t,`package.json`),r=resolvePackageEntryPoint(JSON.parse(await readFile(n,`utf8`)));if(r.startsWith(`/`))throw Error(`Invalid absolute entrypoint for optional package "${e.packageName}".`);return pathToFileURL(join(t,r)).href}async function readInstalledPackageVersion(e){let t=join(findInstalledPackageRoot(e),`package.json`),n=JSON.parse(await readFile(t,`utf8`));return typeof n.version==`string`?n.version:void 0}function findInstalledPackageRoot(e){let t=e.packageName.split(`/`),n=[],r=e.appRoot;for(;;){let i=join(r,`node_modules`,...t);if(n.push(i),existsSync(join(i,`package.json`)))return i;let a=dirname(r);if(a===r)throw Error(`Could not find installed optional dependency "${e.packageName}". Checked: ${n.join(`, `)}`);r=a}}function resolvePackageEntryPoint(e){let t=readDotExport(e.exports);return t===void 0?typeof e.module==`string`&&e.module.length>0?e.module:typeof e.main==`string`&&e.main.length>0?e.main:`index.js`:t}function readDotExport(e){if(typeof e==`string`&&e.length>0)return e;if(typeof e!=`object`||!e)return;let t=`.`in e?e[`.`]:e;if(typeof t==`string`&&t.length>0)return t;if(typeof t!=`object`||!t)return;let n=t;if(typeof n.import==`string`&&n.import.length>0)return n.import;if(typeof n.default==`string`&&n.default.length>0)return n.default}export{importInstalledEnginePackage,readInstalledPackageVersion,resolveInstalledEnginePackageEntrypointHref};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const STAMPED_PACKAGE_VERSION=`0.
|
|
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&&
|
|
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 =
|
|
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,3 +1,3 @@
|
|
|
1
1
|
import{createConnection,createServer}from"node:net";import{existsSync}from"node:fs";import{join,resolve}from"node:path";import{loadDevelopmentEnvironmentFiles}from"#cli/dev/environment.js";import{spawn}from"node:child_process";import{setTimeout}from"node:timers/promises";const HEALTH_TIMEOUT_MS=6e4,LOCAL_SERVER_URL_PATTERN=/https?:\/\/(?:\[[^\]\s]+\]|[^\s/:[\]]+)(?::\d+)?/,WILDCARD_LISTEN_HOSTNAMES=new Set([`[::]`,`::`,`0.0.0.0`]);function resolveOutputServerEntry(e){return join(resolve(e),`.output`,`server`,`index.mjs`)}function readEnvironmentPort(){let e=process.env.PORT;if(e===void 0||e.trim()===``)return;let t=Number(e);if(!Number.isInteger(t)||t<0||t>65535)throw Error(`Invalid PORT environment variable "${e}". Expected an integer between 0 and 65535.`);return t}function normalizeServerClientUrl(e){let t=new URL(e);return WILDCARD_LISTEN_HOSTNAMES.has(t.hostname)&&(t.hostname=`127.0.0.1`),t.toString()}function formatClientHost(e){return WILDCARD_LISTEN_HOSTNAMES.has(e)?`127.0.0.1`:e.includes(`:`)&&!e.startsWith(`[`)?`[${e}]`:e}function createKnownPortUrl(e){return`http://${formatClientHost(e.host)}:${String(e.port)}/`}async function resolveListenPort(e){if(e.port!==0)return e.port;let t=createServer();return await new Promise((n,r)=>{t.once(`error`,r),t.listen(0,e.host,()=>{let e=t.address();t.close(t=>{if(t){r(t);return}if(e===null||typeof e==`string`){r(Error(`Failed to resolve an available port for eve start.`));return}n(e.port)})})})}function parseServerUrlFromOutput(e){let t=LOCAL_SERVER_URL_PATTERN.exec(e);if(t!==null)return normalizeServerClientUrl(t[0])}async function isListening(e){let t=new URL(e),n=Number(t.port||(t.protocol===`https:`?443:80));return await new Promise(e=>{let r=createConnection({host:t.hostname,port:n}),finish=t=>{r.destroy(),e(t)};r.setTimeout(2e3,()=>finish(!1)),r.once(`connect`,()=>finish(!0)),r.once(`error`,()=>finish(!1))})}async function waitForReady(e){let t=Date.now()+HEALTH_TIMEOUT_MS;for(;Date.now()<t;){let t=e.getStartError();if(t!==void 0)throw t;let n=parseServerUrlFromOutput(e.getOutput()),r=n??e.knownUrl;if(r!==void 0&&(n!==void 0||await isListening(r)))return new URL(r).toString();if(e.child.exitCode!==null||e.child.signalCode!==null)throw Error(`Built server process exited (code=${String(e.child.exitCode)}, signal=${String(e.child.signalCode)}) before printing its URL.`);await setTimeout(250)}throw Error([`Built server did not become ready within ${HEALTH_TIMEOUT_MS/1e3}s.`,`Output:`,e.getOutput()].join(`
|
|
2
|
-
`))}async function terminate(e){e.exitCode!==null||e.killed||(e.kill(`SIGTERM`),await Promise.race([once(e,`exit`),setTimeout(2e4).then(()=>`timeout`)])===`timeout`&&e.exitCode===null&&(e.kill(`SIGKILL`),await once(e,`exit`)),e.stdout?.destroy(),e.stderr?.destroy())}function once(e,t){return new Promise(n=>{e.once(t,()=>n())})}async function startProductionServer(e,t={}){let n=resolve(e),r=resolveOutputServerEntry(n);if(!existsSync(r))throw Error(`Missing eve build output at ${r}. Run "eve build" before "eve start".`);await loadDevelopmentEnvironmentFiles(n);let i=t.host??`0.0.0.0`,a=await resolveListenPort({host:i,port:t.port??readEnvironmentPort()??3e3}),o=createKnownPortUrl({host:i,port:a}),s=``,c=!1,l,u=spawn(process.execPath,[r],{cwd:n,env:{...process.env,HOST:i,NITRO_HOST:i,NITRO_PORT:String(a),PORT:String(a)},stdio:[`ignore`,`pipe`,`pipe`]});
|
|
3
|
-
`)))})});
|
|
2
|
+
`))}async function terminate(e){e.exitCode!==null||e.killed||(e.kill(`SIGTERM`),await Promise.race([once(e,`exit`),setTimeout(2e4).then(()=>`timeout`)])===`timeout`&&e.exitCode===null&&(e.kill(`SIGKILL`),await once(e,`exit`)),e.stdout?.destroy(),e.stderr?.destroy())}function once(e,t){return new Promise(n=>{e.once(t,()=>n())})}async function startProductionServer(e,t={}){let n=resolve(e),r=resolveOutputServerEntry(n);if(!existsSync(r))throw Error(`Missing eve build output at ${r}. Run "eve build" before "eve start".`);await loadDevelopmentEnvironmentFiles(n);let i=t.host??`0.0.0.0`,a=await resolveListenPort({host:i,port:t.port??readEnvironmentPort()??3e3}),o=createKnownPortUrl({host:i,port:a}),s=``,c=!1,l=!1,u,d=spawn(process.execPath,[r],{cwd:n,env:{...process.env,HOST:i,NITRO_HOST:i,NITRO_PORT:String(a),PORT:String(a)},stdio:[`ignore`,`pipe`,`pipe`]});d.stdout?.on(`data`,e=>{c||(s+=e.toString(`utf8`)),process.stdout.write(e)}),d.stderr?.on(`data`,e=>{c||(s+=e.toString(`utf8`)),process.stderr.write(e)});let f=new Promise((e,t)=>{d.once(`error`,e=>{u=e,t(e)}),d.once(`exit`,(n,r)=>{if(l||n===0){e();return}t(Error([`Built server process exited unexpectedly (code=${String(n)}, signal=${String(r)}).`,s].join(`
|
|
3
|
+
`)))})});f.catch(()=>void 0);try{let e=await waitForReady({child:d,getStartError:()=>u,getOutput:()=>s,knownUrl:o});return c=!0,s=``,{async close(){l=!0,await terminate(d)},url:e,async wait(){await f}}}catch(e){throw l=!0,await terminate(d),e instanceof Error&&e.name===`AbortError`?Error(`Timed out waiting for built eve server to respond.`,{cause:e}):e}}export{startProductionServer};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { type Span, type SpanContext } from "#compiled/@opentelemetry/api/index.js";
|
|
1
2
|
export interface ChannelRequestTrace {
|
|
2
|
-
readonly reference:
|
|
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(
|
|
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 @@
|
|
|
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};
|
|
@@ -73,6 +73,8 @@ export type ActionResultStatus = "completed" | "failed" | "rejected";
|
|
|
73
73
|
export interface ActionResultError {
|
|
74
74
|
readonly code: string;
|
|
75
75
|
readonly message: string;
|
|
76
|
+
/** The `name` of the error a tool threw, such as `"QuotaError"`. */
|
|
77
|
+
readonly name?: string;
|
|
76
78
|
}
|
|
77
79
|
/**
|
|
78
80
|
* Invocation metadata attached to the `session.started` event for one child
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import{deserializeUrlFilePart,hasInternalRefScheme,isSerializedUrlFilePart}from"#internal/attachments/url-refs.js";import{createEveSessionStreamRoutePath,createEveSubagentStreamRoutePath}from"#protocol/routes.js";import{decodeSandboxRef,isSandboxRefUrl}from"#internal/attachments/sandbox-refs.js";import{getKnownByteLength}from"#internal/attachments/data.js";import{createEventId}from"#protocol/event-id.js";const EVE_SESSION_ID_HEADER=`x-eve-session-id`,EVE_STREAM_FORMAT_HEADER=`x-eve-stream-format`,EVE_STREAM_TAIL_INDEX_HEADER=`x-eve-stream-tail-index`,EVE_STREAM_VERSION_HEADER=`x-eve-stream-version`,EVE_MESSAGE_STREAM_CONTENT_TYPE=`application/x-ndjson; charset=utf-8`,EVE_MESSAGE_STREAM_FORMAT=`ndjson`,EVE_MESSAGE_STREAM_VERSION=`26`,EVE_STREAM_CONTROL_VERSION=`1`,EVE_STREAM_CONTROL_VERSION_QUERY=`streamControlVersion`,EVE_STREAM_LEASE_ENDED_CONTROL={$eve:`stream.lease-ended`,version:1},textEncoder=new TextEncoder;function isCurrentTurnBoundaryEvent(e){return e.type===`session.completed`||e.type===`session.failed`||e.type===`session.waiting`}function isTurnFailureEvent(e){return e.type===`session.failed`||e.type===`step.failed`||e.type===`turn.failed`}function createSessionStartedEvent(e){let t={};return e?.invocation!==void 0&&(t.invocation=e.invocation),e?.predecessor!==void 0&&(t.predecessor=e.predecessor),e?.runtime!==void 0&&(t.runtime=e.runtime),e?.trace!==void 0&&(t.trace=e.trace),{data:t,type:`session.started`}}function createTurnStartedEvent(e){let t={sequence:e.sequence,turnId:e.turnId};return e.trace!==void 0&&(t.trace=e.trace),{data:t,type:`turn.started`}}function createMessageReceivedEvent(e){return{data:{message:summarizeUserContent(e.message),parts:projectUserContentParts(e.message),sequence:e.sequence,turnId:e.turnId},type:`message.received`}}function summarizeUserContent(e){if(typeof e==`string`)return e;let t=[];for(let n of e)if(n.type===`text`)t.push(n.text);else if(n.type===`file`){let e=n.filename??n.mediaType;t.push(`[file: ${e} (${n.mediaType})]`)}else n.type===`image`&&t.push(`[image: ${n.mediaType??`image`}]`);return t.join(`
|
|
2
|
-
`)}function projectUserContentParts(e){if(typeof e==`string`)return[{text:e,type:`text`}];let t=[];for(let n of e)n.type===`text`?t.push({text:n.text,type:`text`}):n.type===`file`?t.push(projectFileLikePart(n.data,n.mediaType,n.filename)):n.type===`image`&&t.push(projectFileLikePart(n.image,n.mediaType??`application/octet-stream`,void 0));return t}function projectFileLikePart(e,t,n){if(isSandboxRefUrl(e)){let t=decodeSandboxRef(e);return createProjectedFilePart({filename:basenameOf(n??t.path),mediaType:t.mediaType,size:t.size})}let r=projectTaggedFileData(e,t,n);if(r!==void 0)return r;let i=clientUrlFragment(e);if(i.url!==void 0)return createProjectedFilePart({filename:n,mediaType:t,...i});let a=getKnownByteLength(e);return createProjectedFilePart(a===null?{filename:n,mediaType:t}:{filename:n,mediaType:t,size:a})}function projectTaggedFileData(e,t,n){if(isTaggedFileData(e))switch(e.type){case`data`:{let r=byteLengthOf(e.data);return createProjectedFilePart(r===void 0?{filename:n,mediaType:t}:{filename:n,mediaType:t,size:r})}case`reference`:case`text`:return createProjectedFilePart({filename:n,mediaType:t});case`url`:return createProjectedFilePart({filename:n,mediaType:t,...clientUrlFragment(e.url)})}}function createProjectedFilePart(e){let t={mediaType:e.mediaType,type:`file`};return e.filename!==void 0&&(t.filename=e.filename),e.size!==void 0&&(t.size=e.size),e.url!==void 0&&(t.url=e.url),t}function isTaggedFileData(e){if(typeof e!=`object`||!e)return!1;let t=e.type;return t===`data`||t===`reference`||t===`text`||t===`url`}function byteLengthOf(e){if(e instanceof Uint8Array||e instanceof ArrayBuffer)return e.byteLength}function clientUrlFragment(e){if(isSerializedUrlFilePart(e))try{let t=deserializeUrlFilePart(e);return isClientResolvableUrl(t)?{url:t.href}:{}}catch{return{}}if(e instanceof URL)return isClientResolvableUrl(e)?{url:e.href}:{};if(typeof e!=`string`||hasInternalRefScheme(e))return{};try{let t=new URL(e);return isClientResolvableUrl(t)?{url:t.href}:{}}catch{return{}}}function isClientResolvableUrl(e){return e.protocol===`http:`||e.protocol===`https:`}function basenameOf(e){let t=e.replaceAll(`\\`,`/`),n=t.slice(t.lastIndexOf(`/`)+1);return n.length>0?n:e}function createActionsRequestedEvent(e){return{data:{actions:e.actions,...optionalPresentation(e.presentation),sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`actions.requested`}}function optionalPresentation(e){return e===void 0?{}:{presentation:e}}function createActionInputAppendedEvent(e){return{data:{callId:e.callId,inputTextDelta:e.inputTextDelta,sequence:e.sequence,stepIndex:e.stepIndex,toolName:e.toolName,turnId:e.turnId},type:`action.input.appended`}}function createAuthorizationRequiredEvent(e){let t={description:e.description,name:e.name,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.attemptId!==void 0&&(t.attemptId=e.attemptId),e.authorization!==void 0&&(t.authorization=e.authorization),e.candidateId!==void 0&&(t.candidateId=e.candidateId),e.principalId!==void 0&&(t.principalId=e.principalId),e.webhookUrl!==void 0&&(t.webhookUrl=e.webhookUrl),e.taskId!==void 0&&(t.taskId=e.taskId),{data:t,type:`authorization.required`}}function createAuthorizationCompletedEvent(e){let t={name:e.name,outcome:e.outcome,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.attemptId!==void 0&&(t.attemptId=e.attemptId),e.authorization!==void 0&&(t.authorization=e.authorization),e.candidateId!==void 0&&(t.candidateId=e.candidateId),e.principalId!==void 0&&(t.principalId=e.principalId),e.reason!==void 0&&(t.reason=e.reason),e.taskId!==void 0&&(t.taskId=e.taskId),{data:t,type:`authorization.completed`}}function createApprovalCandidateEvent(e){return{data:e,type:`approval.candidate`}}function createApprovalSettledEvent(e){return{data:e,type:`approval.settled`}}function createInputRequestedEvent(e){let t={requests:e.requests,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.callId!==void 0&&(t.callId=e.callId),e.taskId!==void 0&&(t.taskId=e.taskId),{data:t,type:`input.requested`}}function createInputResolvedEvent(e){return{data:{resolutions:e.resolutions,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`input.resolved`}}function createActionResultEvent(e){let t=e.rejected===!0?{error:buildActionResultError(e.result),status:`rejected`}:normalizeActionResultOutcome(e.result);return{data:{error:t.error,...optionalPresentation(e.presentation),result:e.result,sequence:e.sequence,status:t.status,stepIndex:e.stepIndex,turnId:e.turnId},type:`action.result`}}function createActionPartialEvent(e){return{data:{...optionalPresentation(e.presentation),result:e.result,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`action.partial`}}function createTaskStartedEvent(e){return{data:{callId:e.callId,kind:e.kind,name:e.name,taskId:e.taskId,turnId:e.turnId},type:`task.started`}}function createTaskSettledEvent(e){let t={callId:e.callId,...e.kind!==void 0&&{kind:e.kind},...e.name!==void 0&&{name:e.name},status:e.status,taskId:e.taskId,turnId:e.turnId};return e.output!==void 0&&(t.output=e.output),e.error!==void 0&&(t.error=e.error),e.cancel!==void 0&&(t.cancel=e.cancel),{data:t,type:`task.settled`}}function createAgentStartedEvent(e){let t={callId:e.callId,turnId:e.turnId,name:e.name,sessionId:e.sessionId,streamPath:createEveSessionStreamRoutePath(e.sessionId)};return e.taskId!==void 0&&(t.taskId=e.taskId),e.remote!==void 0&&(t.remote=e.remote,t.streamPath=createEveSubagentStreamRoutePath({callId:e.callId,childSessionId:e.sessionId,parentSessionId:e.parentSessionId})),{data:t,type:`agent.started`}}function createMessageAppendedEvent(e){return{data:{messageDelta:e.messageDelta,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`message.appended`}}function createReasoningAppendedEvent(e){return{data:{reasoningDelta:e.reasoningDelta,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`reasoning.appended`}}function createMessageCompletedEvent(e){return{data:{finishReason:e.finishReason??`stop`,message:e.message,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`message.completed`}}function createReasoningCompletedEvent(e){return{data:{reasoning:e.reasoning,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`reasoning.completed`}}function createResultCompletedEvent(e){return{data:{result:e.result,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`result.completed`}}function createStepStartedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`step.started`}}function createStepCompletedEvent(e){let t={finishReason:e.finishReason,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.usage!==void 0&&(t.usage=e.usage),e.providerMetadata!==void 0&&(t.providerMetadata=e.providerMetadata),{data:t,type:`step.completed`}}function createStepFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`step.failed`}}function createTurnCompletedEvent(e){return{data:{sequence:e.sequence,turnId:e.turnId},type:`turn.completed`}}function createTurnWaitingEvent(e){return{data:{on:e.on,sequence:e.sequence,turnId:e.turnId,...e.usage!==void 0&&{usage:e.usage}},type:`turn.waiting`}}function createTurnFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sequence:e.sequence,terminal:e.terminal,turnId:e.turnId},type:`turn.failed`}}function createTurnCancelledEvent(e){return{data:{sequence:e.sequence,turnId:e.turnId},type:`turn.cancelled`}}function createContextClearedEvent(e){return{data:{sequence:e.sequence,sessionId:e.sessionId,turnId:e.turnId},type:`context.cleared`}}function createCompactionRequestedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,sessionId:e.sessionId,stepIndex:e.stepIndex,turnId:e.turnId,usageInputTokens:e.usageInputTokens??null},type:`compaction.requested`}}function createCompactionCompletedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,sessionId:e.sessionId,stepIndex:e.stepIndex,turnId:e.turnId},type:`compaction.completed`}}function createSessionWaitingEvent(e){return{data:{continuationToken:``,...e!==void 0&&{usage:e},wait:`next-user-message`},type:`session.waiting`}}function createSessionFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sessionId:e.sessionId,...e.usage!==void 0&&{usage:e.usage}},type:`session.failed`}}function createSessionCompletedEvent(e){return e===void 0?{type:`session.completed`}:{data:{usage:e},type:`session.completed`}}function stampMessageStreamEvent(e,t){let n={at:new Date().toISOString(),id:createEventId()};return t!==void 0&&t.length>0&&(n.deliveryIds=t),{...e,meta:n}}function encodeMessageStreamEvent(e){return textEncoder.encode(`${JSON.stringify(e)}\n`)}function normalizeActionResultOutcome(e){let t=readActionResultOutputError(e.output);return e.isError===!0?{error:buildActionResultError(e),status:`failed`}:t===void 0?{status:`completed`}:{error:t,status:`failed`}}function buildActionResultError(e){let t=readActionResultOutputError(e.output);return t===void 0?{code:`ACTION_RESULT_FAILED`,message:formatActionResultOutput(e.output)}:t}function readActionResultOutputError(e){let t=parseActionResultOutputRecord(e);if(t===void 0)return;let n=typeof t.code==`string`&&t.code.length>0?t.code:void 0,r=typeof t.message==`string`&&t.message.length>0?t.message:void 0;if(n!==void 0&&r!==void 0)return{code:n,message:r}}function parseActionResultOutputRecord(e){if(typeof e==`object`&&e)return e;if(typeof e!=`string`)return;let t=e.trim();if(t.length!==0)try{let e=JSON.parse(t);if(typeof e==`object`&&e)return e}catch{return}}function formatActionResultOutput(e){if(typeof e==`string`)return e;let t=JSON.stringify(e);return typeof t==`string`&&t.length>0?t:`Action failed.`}export{EVE_MESSAGE_STREAM_CONTENT_TYPE,EVE_MESSAGE_STREAM_FORMAT,EVE_MESSAGE_STREAM_VERSION,EVE_SESSION_ID_HEADER,EVE_STREAM_CONTROL_VERSION,EVE_STREAM_CONTROL_VERSION_QUERY,EVE_STREAM_FORMAT_HEADER,EVE_STREAM_LEASE_ENDED_CONTROL,EVE_STREAM_TAIL_INDEX_HEADER,EVE_STREAM_VERSION_HEADER,createActionInputAppendedEvent,createActionPartialEvent,createActionResultEvent,createActionsRequestedEvent,createAgentStartedEvent,createApprovalCandidateEvent,createApprovalSettledEvent,createAuthorizationCompletedEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createContextClearedEvent,createInputRequestedEvent,createInputResolvedEvent,createMessageAppendedEvent,createMessageCompletedEvent,createMessageReceivedEvent,createReasoningAppendedEvent,createReasoningCompletedEvent,createResultCompletedEvent,createSessionCompletedEvent,createSessionFailedEvent,createSessionStartedEvent,createSessionWaitingEvent,createStepCompletedEvent,createStepFailedEvent,createStepStartedEvent,createTaskSettledEvent,createTaskStartedEvent,createTurnCancelledEvent,createTurnCompletedEvent,createTurnFailedEvent,createTurnStartedEvent,createTurnWaitingEvent,encodeMessageStreamEvent,isCurrentTurnBoundaryEvent,isTurnFailureEvent,stampMessageStreamEvent};
|
|
2
|
+
`)}function projectUserContentParts(e){if(typeof e==`string`)return[{text:e,type:`text`}];let t=[];for(let n of e)n.type===`text`?t.push({text:n.text,type:`text`}):n.type===`file`?t.push(projectFileLikePart(n.data,n.mediaType,n.filename)):n.type===`image`&&t.push(projectFileLikePart(n.image,n.mediaType??`application/octet-stream`,void 0));return t}function projectFileLikePart(e,t,n){if(isSandboxRefUrl(e)){let t=decodeSandboxRef(e);return createProjectedFilePart({filename:basenameOf(n??t.path),mediaType:t.mediaType,size:t.size})}let r=projectTaggedFileData(e,t,n);if(r!==void 0)return r;let i=clientUrlFragment(e);if(i.url!==void 0)return createProjectedFilePart({filename:n,mediaType:t,...i});let a=getKnownByteLength(e);return createProjectedFilePart(a===null?{filename:n,mediaType:t}:{filename:n,mediaType:t,size:a})}function projectTaggedFileData(e,t,n){if(isTaggedFileData(e))switch(e.type){case`data`:{let r=byteLengthOf(e.data);return createProjectedFilePart(r===void 0?{filename:n,mediaType:t}:{filename:n,mediaType:t,size:r})}case`reference`:case`text`:return createProjectedFilePart({filename:n,mediaType:t});case`url`:return createProjectedFilePart({filename:n,mediaType:t,...clientUrlFragment(e.url)})}}function createProjectedFilePart(e){let t={mediaType:e.mediaType,type:`file`};return e.filename!==void 0&&(t.filename=e.filename),e.size!==void 0&&(t.size=e.size),e.url!==void 0&&(t.url=e.url),t}function isTaggedFileData(e){if(typeof e!=`object`||!e)return!1;let t=e.type;return t===`data`||t===`reference`||t===`text`||t===`url`}function byteLengthOf(e){if(e instanceof Uint8Array||e instanceof ArrayBuffer)return e.byteLength}function clientUrlFragment(e){if(isSerializedUrlFilePart(e))try{let t=deserializeUrlFilePart(e);return isClientResolvableUrl(t)?{url:t.href}:{}}catch{return{}}if(e instanceof URL)return isClientResolvableUrl(e)?{url:e.href}:{};if(typeof e!=`string`||hasInternalRefScheme(e))return{};try{let t=new URL(e);return isClientResolvableUrl(t)?{url:t.href}:{}}catch{return{}}}function isClientResolvableUrl(e){return e.protocol===`http:`||e.protocol===`https:`}function basenameOf(e){let t=e.replaceAll(`\\`,`/`),n=t.slice(t.lastIndexOf(`/`)+1);return n.length>0?n:e}function createActionsRequestedEvent(e){return{data:{actions:e.actions,...optionalPresentation(e.presentation),sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`actions.requested`}}function optionalPresentation(e){return e===void 0?{}:{presentation:e}}function createActionInputAppendedEvent(e){return{data:{callId:e.callId,inputTextDelta:e.inputTextDelta,sequence:e.sequence,stepIndex:e.stepIndex,toolName:e.toolName,turnId:e.turnId},type:`action.input.appended`}}function createAuthorizationRequiredEvent(e){let t={description:e.description,name:e.name,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.attemptId!==void 0&&(t.attemptId=e.attemptId),e.authorization!==void 0&&(t.authorization=e.authorization),e.candidateId!==void 0&&(t.candidateId=e.candidateId),e.principalId!==void 0&&(t.principalId=e.principalId),e.webhookUrl!==void 0&&(t.webhookUrl=e.webhookUrl),e.taskId!==void 0&&(t.taskId=e.taskId),{data:t,type:`authorization.required`}}function createAuthorizationCompletedEvent(e){let t={name:e.name,outcome:e.outcome,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.attemptId!==void 0&&(t.attemptId=e.attemptId),e.authorization!==void 0&&(t.authorization=e.authorization),e.candidateId!==void 0&&(t.candidateId=e.candidateId),e.principalId!==void 0&&(t.principalId=e.principalId),e.reason!==void 0&&(t.reason=e.reason),e.taskId!==void 0&&(t.taskId=e.taskId),{data:t,type:`authorization.completed`}}function createApprovalCandidateEvent(e){return{data:e,type:`approval.candidate`}}function createApprovalSettledEvent(e){return{data:e,type:`approval.settled`}}function createInputRequestedEvent(e){let t={requests:e.requests,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.callId!==void 0&&(t.callId=e.callId),e.taskId!==void 0&&(t.taskId=e.taskId),{data:t,type:`input.requested`}}function createInputResolvedEvent(e){return{data:{resolutions:e.resolutions,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`input.resolved`}}function createActionResultEvent(e){let t=e.rejected===!0?{error:buildActionResultError(e.result),status:`rejected`}:normalizeActionResultOutcome(e.result);return{data:{error:t.error,...optionalPresentation(e.presentation),result:e.result,sequence:e.sequence,status:t.status,stepIndex:e.stepIndex,turnId:e.turnId},type:`action.result`}}function createActionPartialEvent(e){return{data:{...optionalPresentation(e.presentation),result:e.result,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`action.partial`}}function createTaskStartedEvent(e){return{data:{callId:e.callId,kind:e.kind,name:e.name,taskId:e.taskId,turnId:e.turnId},type:`task.started`}}function createTaskSettledEvent(e){let t={callId:e.callId,...e.kind!==void 0&&{kind:e.kind},...e.name!==void 0&&{name:e.name},status:e.status,taskId:e.taskId,turnId:e.turnId};return e.output!==void 0&&(t.output=e.output),e.error!==void 0&&(t.error=e.error),e.cancel!==void 0&&(t.cancel=e.cancel),{data:t,type:`task.settled`}}function createAgentStartedEvent(e){let t={callId:e.callId,turnId:e.turnId,name:e.name,sessionId:e.sessionId,streamPath:createEveSessionStreamRoutePath(e.sessionId)};return e.taskId!==void 0&&(t.taskId=e.taskId),e.remote!==void 0&&(t.remote=e.remote,t.streamPath=createEveSubagentStreamRoutePath({callId:e.callId,childSessionId:e.sessionId,parentSessionId:e.parentSessionId})),{data:t,type:`agent.started`}}function createMessageAppendedEvent(e){return{data:{messageDelta:e.messageDelta,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`message.appended`}}function createReasoningAppendedEvent(e){return{data:{reasoningDelta:e.reasoningDelta,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`reasoning.appended`}}function createMessageCompletedEvent(e){return{data:{finishReason:e.finishReason??`stop`,message:e.message,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`message.completed`}}function createReasoningCompletedEvent(e){return{data:{reasoning:e.reasoning,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`reasoning.completed`}}function createResultCompletedEvent(e){return{data:{result:e.result,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`result.completed`}}function createStepStartedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`step.started`}}function createStepCompletedEvent(e){let t={finishReason:e.finishReason,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.usage!==void 0&&(t.usage=e.usage),e.providerMetadata!==void 0&&(t.providerMetadata=e.providerMetadata),{data:t,type:`step.completed`}}function createStepFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`step.failed`}}function createTurnCompletedEvent(e){return{data:{sequence:e.sequence,turnId:e.turnId},type:`turn.completed`}}function createTurnWaitingEvent(e){return{data:{on:e.on,sequence:e.sequence,turnId:e.turnId,...e.usage!==void 0&&{usage:e.usage}},type:`turn.waiting`}}function createTurnFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sequence:e.sequence,terminal:e.terminal,turnId:e.turnId},type:`turn.failed`}}function createTurnCancelledEvent(e){return{data:{sequence:e.sequence,turnId:e.turnId},type:`turn.cancelled`}}function createContextClearedEvent(e){return{data:{sequence:e.sequence,sessionId:e.sessionId,turnId:e.turnId},type:`context.cleared`}}function createCompactionRequestedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,sessionId:e.sessionId,stepIndex:e.stepIndex,turnId:e.turnId,usageInputTokens:e.usageInputTokens??null},type:`compaction.requested`}}function createCompactionCompletedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,sessionId:e.sessionId,stepIndex:e.stepIndex,turnId:e.turnId},type:`compaction.completed`}}function createSessionWaitingEvent(e){return{data:{continuationToken:``,...e!==void 0&&{usage:e},wait:`next-user-message`},type:`session.waiting`}}function createSessionFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sessionId:e.sessionId,...e.usage!==void 0&&{usage:e.usage}},type:`session.failed`}}function createSessionCompletedEvent(e){return e===void 0?{type:`session.completed`}:{data:{usage:e},type:`session.completed`}}function stampMessageStreamEvent(e,t){let n={at:new Date().toISOString(),id:createEventId()};return t!==void 0&&t.length>0&&(n.deliveryIds=t),{...e,meta:n}}function encodeMessageStreamEvent(e){return textEncoder.encode(`${JSON.stringify(e)}\n`)}function normalizeActionResultOutcome(e){return e.isError===!0?{error:buildActionResultError(e),status:`failed`}:{status:`completed`}}function buildActionResultError(e){let t=readActionResultOutputError(e.output)??{code:`ACTION_RESULT_FAILED`,message:formatActionResultOutput(e.output)};return e.kind===`tool-result`&&e.errorName!==void 0?{...t,name:e.errorName}:t}function readActionResultOutputError(e){let t=parseActionResultOutputRecord(e);if(t===void 0)return;let n=typeof t.code==`string`&&t.code.length>0?t.code:void 0,r=typeof t.message==`string`&&t.message.length>0?t.message:void 0;if(n!==void 0&&r!==void 0)return{code:n,message:r}}function parseActionResultOutputRecord(e){if(typeof e==`object`&&e)return e;if(typeof e!=`string`)return;let t=e.trim();if(t.length!==0)try{let e=JSON.parse(t);if(typeof e==`object`&&e)return e}catch{return}}function formatActionResultOutput(e){if(typeof e==`string`)return e;let t=JSON.stringify(e);return typeof t==`string`&&t.length>0?t:`Action failed.`}export{EVE_MESSAGE_STREAM_CONTENT_TYPE,EVE_MESSAGE_STREAM_FORMAT,EVE_MESSAGE_STREAM_VERSION,EVE_SESSION_ID_HEADER,EVE_STREAM_CONTROL_VERSION,EVE_STREAM_CONTROL_VERSION_QUERY,EVE_STREAM_FORMAT_HEADER,EVE_STREAM_LEASE_ENDED_CONTROL,EVE_STREAM_TAIL_INDEX_HEADER,EVE_STREAM_VERSION_HEADER,createActionInputAppendedEvent,createActionPartialEvent,createActionResultEvent,createActionsRequestedEvent,createAgentStartedEvent,createApprovalCandidateEvent,createApprovalSettledEvent,createAuthorizationCompletedEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createContextClearedEvent,createInputRequestedEvent,createInputResolvedEvent,createMessageAppendedEvent,createMessageCompletedEvent,createMessageReceivedEvent,createReasoningAppendedEvent,createReasoningCompletedEvent,createResultCompletedEvent,createSessionCompletedEvent,createSessionFailedEvent,createSessionStartedEvent,createSessionWaitingEvent,createStepCompletedEvent,createStepFailedEvent,createStepStartedEvent,createTaskSettledEvent,createTaskStartedEvent,createTurnCancelledEvent,createTurnCompletedEvent,createTurnFailedEvent,createTurnStartedEvent,createTurnWaitingEvent,encodeMessageStreamEvent,isCurrentTurnBoundaryEvent,isTurnFailureEvent,stampMessageStreamEvent};
|
|
@@ -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(
|
|
2
|
-
`).trim()}function
|
|
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};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Teams connection sign-in cards. A sign-in link is a credential: whoever
|
|
3
|
+
* completes it binds their account to the person who asked. Outside personal
|
|
4
|
+
* chats the shared card carries no link or code, only an `Action.Execute`
|
|
5
|
+
* button; Teams shows the invoke's response card to the presser alone, and
|
|
6
|
+
* eve answers with the challenge only when the presser is that person.
|
|
7
|
+
*/
|
|
8
|
+
import type { Session } from "#channel/session.js";
|
|
9
|
+
import type { SessionAuthContext } from "#channel/types.js";
|
|
10
|
+
import type { AuthorizationRequiredStreamEvent } from "#protocol/message.js";
|
|
11
|
+
import type { TeamsChannelAccount, TeamsMessageBody } from "#public/channels/teams/api.js";
|
|
12
|
+
import type { TeamsInvokeActivity } from "#public/channels/teams/inbound.js";
|
|
13
|
+
import { type JsonObject } from "#shared/json.js";
|
|
14
|
+
type AuthorizationRequired = AuthorizationRequiredStreamEvent["data"];
|
|
15
|
+
/** Identifies one sign-in attempt from the shared card's button press. */
|
|
16
|
+
export interface TeamsAuthorizationReveal {
|
|
17
|
+
readonly attemptId?: string;
|
|
18
|
+
readonly name: string;
|
|
19
|
+
readonly replyToActivityId?: string;
|
|
20
|
+
}
|
|
21
|
+
/** A connection's display name for its sign-in cards (`linear` → `Linear`). */
|
|
22
|
+
export declare function teamsAuthorizationDisplayName(event: {
|
|
23
|
+
readonly authorization?: {
|
|
24
|
+
readonly displayName?: string;
|
|
25
|
+
};
|
|
26
|
+
readonly name: string;
|
|
27
|
+
}): string;
|
|
28
|
+
/** The full sign-in card, link and code included, for the person signing in alone. */
|
|
29
|
+
export declare function renderTeamsAuthorizationPrompt(event: AuthorizationRequired, options: {
|
|
30
|
+
readonly adaptiveCardVersion: string;
|
|
31
|
+
readonly requester: string | undefined;
|
|
32
|
+
}): TeamsMessageBody;
|
|
33
|
+
/** The shared sign-in card: who must sign in, and a button that shows them the challenge. */
|
|
34
|
+
export declare function renderTeamsAuthorizationStatus(event: AuthorizationRequired, options: {
|
|
35
|
+
readonly adaptiveCardVersion: string;
|
|
36
|
+
readonly replyToActivityId: string | undefined;
|
|
37
|
+
readonly requester: string | undefined;
|
|
38
|
+
}): TeamsMessageBody;
|
|
39
|
+
/** Reads the sign-in attempt a shared card's button names, or `null` for other invokes. */
|
|
40
|
+
export declare function readTeamsAuthorizationReveal(activity: TeamsInvokeActivity): TeamsAuthorizationReveal | null;
|
|
41
|
+
/**
|
|
42
|
+
* Answers a press of the shared card's button. The challenge comes from the
|
|
43
|
+
* session's own stream and goes back only when the presser's principal is the
|
|
44
|
+
* one that must sign in; nothing the card carries is trusted for identity.
|
|
45
|
+
*/
|
|
46
|
+
export declare function answerTeamsAuthorizationReveal(input: {
|
|
47
|
+
readonly adaptiveCardVersion: string;
|
|
48
|
+
readonly auth: SessionAuthContext | null;
|
|
49
|
+
readonly presser: TeamsChannelAccount;
|
|
50
|
+
readonly resolveSession: () => Promise<Session | undefined>;
|
|
51
|
+
readonly reveal: TeamsAuthorizationReveal;
|
|
52
|
+
}): Promise<JsonObject>;
|
|
53
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createLogger}from"#internal/logging.js";import{isObject}from"#shared/guards.js";import{displayProperName}from"#shared/display-name.js";import{parseJsonObject}from"#shared/json.js";import{findPendingAuthorization}from"#channel/pending-authorization.js";import{TEAMS_ADAPTIVE_CARD_CONTENT_TYPE,teamsInvokeResponse}from"#public/channels/teams/hitl.js";const log=createLogger(`teams.authorization`),NOT_YOURS=`Only the person who needs to sign in can open this sign-in.`,TEAMS_AUTHORIZATION_DATA_KEY=`eve_authorization`;function teamsAuthorizationDisplayName(e){return e.authorization?.displayName??displayProperName(e.name)}function renderTeamsAuthorizationPrompt(e,t){let n=teamsAuthorizationDisplayName(e),r=e.authorization?.url,i=e.authorization?.instructions,a=e.authorization?.userCode,o=a?`If ${n} asks for a confirmation code, enter ${a}.`:void 0,s=[r?`Authorization required for ${n}: ${r}`:`Authorization required for ${n}.`,i,o].filter(Boolean).join(` `);return{attachments:[adaptiveCard(t.adaptiveCardVersion,{actions:r?[{title:`Sign in with ${n}`,type:`Action.OpenUrl`,url:r}]:[],body:[heading(`Authorization required for ${n}`),textBlock(t.requester?`Requested by ${t.requester}.`:`No triggering user is available for a private prompt.`),...[i,o].filter(e=>!!e).map(e=>textBlock(e))]})],text:s}}function renderTeamsAuthorizationStatus(e,t){let n=teamsAuthorizationDisplayName(e),r=t.requester?`${t.requester} must sign in to continue. Only they can open the sign-in.`:`Only the person who needs to sign in can open it.`,i={attemptId:e.attemptId,name:e.name,replyToActivityId:t.replyToActivityId},a=`Authorization required for ${n}. ${r}`;return{attachments:[adaptiveCard(t.adaptiveCardVersion,{actions:[{data:{[TEAMS_AUTHORIZATION_DATA_KEY]:i},title:`Sign in`,type:`Action.Execute`,verb:`eve.authorization.reveal`}],body:[heading(`Authorization required for ${n}`),textBlock(r)]})],text:a}}function readTeamsAuthorizationReveal(e){let t=isObject(e.value?.action)?e.value.action:null,n=(t&&isObject(t.data)?t.data:null)?.[TEAMS_AUTHORIZATION_DATA_KEY];return!isObject(n)||typeof n.name!=`string`?null:{attemptId:typeof n.attemptId==`string`?n.attemptId:void 0,name:n.name,replyToActivityId:typeof n.replyToActivityId==`string`?n.replyToActivityId:void 0}}async function answerTeamsAuthorizationReveal(e){if(e.auth===null)return teamsInvokeResponse({message:NOT_YOURS});let{name:t,attemptId:n}=e.reveal,r;try{let i=await e.resolveSession();r=i&&await findPendingAuthorization(i,e=>e.name===t&&e.attemptId===n)}catch(e){log.error(`Teams sign-in lookup failed`,{error:e})}if(r===void 0)return teamsInvokeResponse({message:`This sign-in is no longer active.`});if(e.auth.principalId!==r.principalId)return teamsInvokeResponse({message:NOT_YOURS});let i=renderTeamsAuthorizationPrompt(r,{adaptiveCardVersion:e.adaptiveCardVersion,requester:e.presser.name??e.presser.id});return parseJsonObject({statusCode:200,type:TEAMS_ADAPTIVE_CARD_CONTENT_TYPE,value:i.attachments?.[0]?.content})}function adaptiveCard(e,t){return{content:parseJsonObject({$schema:`http://adaptivecards.io/schemas/adaptive-card.json`,...t,type:`AdaptiveCard`,version:e}),contentType:TEAMS_ADAPTIVE_CARD_CONTENT_TYPE}}function heading(e){return{text:e,type:`TextBlock`,weight:`Bolder`,wrap:!0}}function textBlock(e){return{text:e,type:`TextBlock`,wrap:!0}}export{answerTeamsAuthorizationReveal,readTeamsAuthorizationReveal,renderTeamsAuthorizationPrompt,renderTeamsAuthorizationStatus,teamsAuthorizationDisplayName};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{extractErrorId,formatErrorHint}from"#internal/logging.js";import{displayProperName}from"#shared/display-name.js";import{
|
|
1
|
+
import{extractErrorId,formatErrorHint}from"#internal/logging.js";import{displayProperName}from"#shared/display-name.js";import{resolvedPromptAnswer}from"#channel/resolved-prompt.js";import{splitTeamsMessageText}from"#public/channels/teams/api.js";import{renderAnsweredInputRequestMessage,renderInputRequestMessage}from"#public/channels/teams/hitl.js";import{renderTeamsAuthorizationPrompt,renderTeamsAuthorizationStatus,teamsAuthorizationDisplayName}from"#public/channels/teams/authorization.js";function defaultTeamsAuth(e){let t=e.tenantId,n={activity_id:e.id,conversation_id:e.conversation.id,scope:e.scope,user_id:e.from.id};e.from.name!==void 0&&(n.user_name=e.from.name),e.from.aadObjectId!==void 0&&(n.aad_object_id=e.from.aadObjectId),t!==void 0&&(n.tenant_id=t),e.teamId!==void 0&&(n.team_id=e.teamId),e.teamsChannelId!==void 0&&(n.channel_id=e.teamsChannelId);let r=t?`teams:${t}:${e.from.id}`:`teams:${e.from.id}`;return{attributes:n,authenticator:`teams-activity`,issuer:t?`teams:${t}`:`teams`,principalId:r,principalType:e.from.role===`bot`?`service`:`user`,subject:e.from.aadObjectId}}async function defaultOnMessage(e,t){return t.from.role===`bot`||t.from.id===t.recipient.id||t.scope!==`personal`&&!t.isBotMentioned?null:(await e.thread.startTyping(),{auth:defaultTeamsAuth(t)})}const defaultEvents={async"turn.started"(e,t,n){await t.thread.startTyping()},async"actions.requested"(e,t,n){await t.thread.startTyping()},async"input.requested"(e,t,n){for(let n of e.requests){let e=await t.thread.post(renderInputRequestMessage(n,{adaptiveCardVersion:t.adaptiveCardVersion,replyToActivityId:t.teams.replyToActivityId}));if(!e.id)continue;let r={activityId:e.id,prompt:n.prompt};t.state.pendingPromptCards={...t.state.pendingPromptCards,[n.requestId]:n.kind===`question`?{...r,options:(n.options??[]).map(({id:e,label:t})=>({id:e,label:t}))}:r}}},async"approval.settled"(e,t,n){let r=t.state.pendingPromptCards??{},i=r[e.requestId];if(i===void 0)return;let a=t.state.approvalResponderAccounts?.[e.responderPrincipalId],o=e.outcome===`approved`?`Approved`:`Cancelled`,s=a?.name??a?.id;await t.thread.update(i.activityId,renderAnsweredInputRequestMessage({includeText:!1,label:s===void 0?o:`${o} by ${s}`,prompt:i.prompt}));let c={...r};delete c[e.requestId],t.state.pendingPromptCards=c},async"input.resolved"(e,t,n){for(let n of e.resolutions){let e=t.state.pendingPromptCards??{},r=e[n.requestId];if(r===void 0)continue;await t.thread.update(r.activityId,renderAnsweredInputRequestMessage({includeText:!1,label:resolvedPromptAnswer(n,r.options),prompt:r.prompt}));let{[n.requestId]:i,...a}=e;t.state.pendingPromptCards=a}},async"message.completed"(e,t,n){if(e.finishReason!==`tool-calls`&&e.message)for(let n of splitTeamsMessageText(e.message))await t.thread.post(n)},async"session.failed"(e,t){let n=formatErrorHint(e),r=extractErrorId(e.details);await t.thread.post([`This session could not recover from an error${n}.`,``,`Start a new Teams conversation to continue.`,...r?[``,`Error id: ${r}`]:[]].join(`
|
|
2
2
|
`))},async"turn.failed"(e,t,n){if(e.terminal)return;let r=formatErrorHint(e),i=extractErrorId(e.details);await t.thread.post([`I hit an error while handling your request${r}.`,``,`Please try again, rephrase, or reach out if it keeps failing.`,...i?[``,`Error id: ${i}`]:[]].join(`
|
|
3
|
-
`))},async"authorization.required"(e,t,n){let r=
|
|
3
|
+
`))},async"authorization.required"(e,t,n){let r=signInAccount(e,t.state),i={adaptiveCardVersion:t.adaptiveCardVersion,replyToActivityId:t.teams.replyToActivityId,requester:r?r.name??r.id:void 0},a=await t.thread.post(t.state.conversationType===`personal`?renderTeamsAuthorizationPrompt(e,i):renderTeamsAuthorizationStatus(e,i));a.id&&(t.state.pendingAuthActivityId=a.id)},async"authorization.completed"(e,t,n){e.outcome===`authorized`&&await t.thread.startTyping();let r=t.state.pendingAuthActivityId;if(!r)return;let i=buildAuthCompletedText({displayName:teamsAuthorizationDisplayName(e),outcome:e.outcome,reason:e.reason});await t.thread.update(r,renderAnsweredInputRequestMessage({prompt:i})),t.state.pendingAuthActivityId=null}};function signInAccount(e,t){let n=e.principalId===void 0?void 0:t.approvalResponderAccounts?.[e.principalId];return n===void 0?e.candidateId===void 0?t.triggeringUser:null:n}function formatConnectionDisplayName(e){return displayProperName(e)}function buildAuthCompletedText(e){if(e.outcome===`authorized`)return`${e.displayName} connected.`;let t=e.reason===void 0?``:` (${e.reason})`;return`${e.displayName} authorization ${e.outcome}${t}.`}function teamsMentionUser(e){let t=e.name??e.id;return{mentioned:{id:e.id,name:e.name},text:`<at>${t}</at>`,type:`mention`}}export{buildAuthCompletedText,defaultEvents,defaultOnMessage,defaultTeamsAuth,formatConnectionDisplayName,teamsMentionUser};
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import { type InputRequest, type ValidatedInputResponse } from "#shared/input.js";
|
|
5
5
|
import type { TeamsActivity } from "#public/channels/teams/inbound.js";
|
|
6
6
|
import type { TeamsAttachment, TeamsMessageBody } from "#public/channels/teams/api.js";
|
|
7
|
+
import { type JsonObject } from "#shared/json.js";
|
|
7
8
|
/** Adaptive Card attachment content type used by Teams. */
|
|
8
9
|
export declare const TEAMS_ADAPTIVE_CARD_CONTENT_TYPE = "application/vnd.microsoft.card.adaptive";
|
|
9
10
|
/** Hidden data property used by eve HITL Adaptive Card actions. */
|
|
@@ -59,4 +60,4 @@ export declare function readTeamsInputReplyToActivityId(activity: TeamsActivity)
|
|
|
59
60
|
export declare function teamsInvokeResponse(input?: {
|
|
60
61
|
readonly message?: string;
|
|
61
62
|
readonly statusCode?: number;
|
|
62
|
-
}):
|
|
63
|
+
}): JsonObject;
|