eve 0.27.7 → 0.27.9
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 +18 -0
- package/dist/src/cli/commands/register-registry-commands.d.ts +12 -0
- package/dist/src/cli/commands/register-registry-commands.js +1 -0
- package/dist/src/cli/commands/registry-project.d.ts +10 -0
- package/dist/src/cli/commands/registry-project.js +1 -0
- package/dist/src/cli/commands/registry.d.ts +21 -0
- package/dist/src/cli/commands/registry.js +1 -0
- package/dist/src/cli/commands/trace.d.ts +32 -0
- package/dist/src/cli/commands/trace.js +6 -0
- package/dist/src/cli/run.js +3 -2
- package/dist/src/compiled/.vendor-stamp.json +4 -1
- package/dist/src/compiled/@ai-sdk/otel/index.js +3 -3
- package/dist/src/compiled/@opentelemetry/api/index.d.ts +23 -5
- package/dist/src/compiled/@opentelemetry/otlp-transformer/LICENSE +201 -0
- package/dist/src/compiled/@opentelemetry/otlp-transformer/index.d.ts +3 -0
- package/dist/src/compiled/@opentelemetry/otlp-transformer/index.js +1 -0
- package/dist/src/compiled/@vercel/otel/LICENSE +21 -0
- package/dist/src/compiled/@vercel/otel/index.d.ts +16 -0
- package/dist/src/compiled/@vercel/otel/index.js +17 -0
- package/dist/src/compiled/@workflow/world-vercel/index.js +7 -7
- package/dist/src/compiled/_chunks/workflow/chunk-5MU5Z6L3-BYQ2wtp-.js +1 -0
- package/dist/src/compiled/_chunks/workflow/chunk-NWCAEW5Y-Dp6gZq6P.js +1 -0
- package/dist/src/compiled/_chunks/workflow/getMachineId-bsd-WEBNKY2R-Cls8BaDr.js +1 -0
- package/dist/src/compiled/_chunks/workflow/getMachineId-darwin-LT47KAXP-Bpw5H-nL.js +2 -0
- package/dist/src/compiled/_chunks/workflow/getMachineId-linux-LTVQO6VW-CpqQTfzr.js +1 -0
- package/dist/src/compiled/_chunks/workflow/getMachineId-unsupported-UKWBA27G-2_M88Nra.js +1 -0
- package/dist/src/compiled/_chunks/workflow/getMachineId-win-NLJKOPY6-D0EDY-ev.js +1 -0
- package/dist/src/compiled/shadcn-registry/LICENSE.md +21 -0
- package/dist/src/compiled/shadcn-registry/index.d.ts +56 -0
- package/dist/src/compiled/shadcn-registry/index.js +33491 -0
- package/dist/src/compiler/extension-compatibility.d.ts +4 -4
- package/dist/src/compiler/extension-compatibility.js +1 -1
- package/dist/src/execution/node-step.js +1 -1
- package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
- package/dist/src/execution/turn-workflow.js +1 -1
- package/dist/src/execution/web-fetch/request.d.ts +14 -0
- package/dist/src/execution/web-fetch/request.js +1 -0
- package/dist/src/execution/web-fetch/tool.js +1 -1
- package/dist/src/execution/workflow-steps.js +1 -1
- package/dist/src/harness/agent-otel-provider.d.ts +49 -0
- package/dist/src/harness/agent-otel-provider.js +1 -0
- package/dist/src/harness/agent-trace-context-store.d.ts +12 -0
- package/dist/src/harness/agent-trace-context-store.js +1 -0
- package/dist/src/harness/agent-trace-span-processor.d.ts +12 -0
- package/dist/src/harness/agent-trace-span-processor.js +1 -0
- package/dist/src/harness/ai-sdk-hook-bridge.d.ts +4 -0
- package/dist/src/harness/ai-sdk-hook-bridge.js +1 -0
- package/dist/src/harness/compaction-prompt.d.ts +7 -0
- package/dist/src/harness/compaction-prompt.js +1 -1
- package/dist/src/harness/compaction.js +1 -1
- package/dist/src/harness/instrumentation-lifecycle.d.ts +142 -0
- package/dist/src/harness/instrumentation-lifecycle.js +1 -0
- package/dist/src/harness/instrumentation-native-events.d.ts +12 -0
- package/dist/src/harness/instrumentation-native-events.js +1 -0
- package/dist/src/harness/instrumentation-runtime.d.ts +13 -0
- package/dist/src/harness/instrumentation-runtime.js +1 -0
- package/dist/src/harness/local-instrumentation-runtime.d.ts +7 -0
- package/dist/src/harness/local-instrumentation-runtime.js +1 -0
- package/dist/src/harness/local-trace-span-processor.d.ts +10 -0
- package/dist/src/harness/local-trace-span-processor.js +1 -0
- package/dist/src/harness/otel-integration.d.ts +3 -0
- package/dist/src/harness/otel-integration.js +1 -1
- package/dist/src/harness/tool-loop.js +2 -2
- package/dist/src/harness/tool-model-output.d.ts +40 -0
- package/dist/src/harness/tool-model-output.js +1 -0
- package/dist/src/harness/tools.js +1 -1
- package/dist/src/harness/types.d.ts +6 -0
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
- package/dist/src/internal/nitro/host/local-tracing-runtime-plugin.d.ts +1 -0
- package/dist/src/internal/nitro/host/local-tracing-runtime-plugin.js +1 -0
- package/dist/src/packages/eve-catalog/src/index.js +1 -1
- package/dist/src/public/definitions/tool.d.ts +1 -1
- package/dist/src/public/tools/index.d.ts +2 -1
- package/dist/src/public/tools/index.js +1 -1
- package/dist/src/public/tools/output-builders.d.ts +53 -0
- package/dist/src/public/tools/output-builders.js +1 -0
- package/dist/src/runtime/framework-tools/web-fetch.js +1 -1
- package/dist/src/setup/scaffold/channels-catalog.d.ts +2 -0
- package/dist/src/setup/scaffold/channels-catalog.js +1 -1
- 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/shared/network-address.d.ts +6 -0
- package/dist/src/shared/network-address.js +1 -1
- package/dist/src/shared/tool-definition.d.ts +29 -0
- package/docs/channels/overview.mdx +2 -2
- package/docs/connections/overview.mdx +1 -1
- package/docs/extensions.md +1 -0
- package/docs/guides/instrumentation.md +17 -7
- package/docs/guides/state.md +1 -1
- package/docs/install-integrations.mdx +108 -0
- package/docs/meta.json +1 -0
- package/docs/patterns/multi-tenant-memory.md +1 -1
- package/docs/reference/cli.md +32 -1
- package/docs/tools/overview.mdx +29 -0
- package/package.json +9 -4
|
@@ -11,13 +11,13 @@ declare const EXTENSION_CAPABILITY_CONTRACTS: {
|
|
|
11
11
|
readonly dropped: {};
|
|
12
12
|
};
|
|
13
13
|
readonly tool: {
|
|
14
|
-
readonly current:
|
|
15
|
-
readonly supported: readonly [1, 2];
|
|
14
|
+
readonly current: 3;
|
|
15
|
+
readonly supported: readonly [1, 2, 3];
|
|
16
16
|
readonly dropped: {};
|
|
17
17
|
};
|
|
18
18
|
readonly dynamicTool: {
|
|
19
|
-
readonly current:
|
|
20
|
-
readonly supported: readonly [1, 2, 3];
|
|
19
|
+
readonly current: 4;
|
|
20
|
+
readonly supported: readonly [1, 2, 3, 4];
|
|
21
21
|
readonly dropped: {};
|
|
22
22
|
};
|
|
23
23
|
readonly connection: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z}from"#compiled/zod/index.js";import{join}from"node:path";import{readFile,writeFile}from"node:fs/promises";import{formatValidationError}from"#runtime/validation.js";const EXTENSION_COMPATIBILITY_MANIFEST_KIND=`eve-extension`,EXTENSION_COMPATIBILITY_MANIFEST_FORMAT_VERSION=1,EXTENSION_COMPATIBILITY_MANIFEST_FILENAME=`_manifest.json`,EXTENSION_CAPABILITY_CONTRACTS={extension:{current:1,supported:[1],dropped:{}},tool:{current:
|
|
1
|
+
import{z}from"#compiled/zod/index.js";import{join}from"node:path";import{readFile,writeFile}from"node:fs/promises";import{formatValidationError}from"#runtime/validation.js";const EXTENSION_COMPATIBILITY_MANIFEST_KIND=`eve-extension`,EXTENSION_COMPATIBILITY_MANIFEST_FORMAT_VERSION=1,EXTENSION_COMPATIBILITY_MANIFEST_FILENAME=`_manifest.json`,EXTENSION_CAPABILITY_CONTRACTS={extension:{current:1,supported:[1],dropped:{}},tool:{current:3,supported:[1,2,3],dropped:{}},dynamicTool:{current:4,supported:[1,2,3,4],dropped:{}},connection:{current:2,supported:[1,2],dropped:{}},hook:{current:2,supported:[1,2],dropped:{}},skill:{current:1,supported:[1],dropped:{}},dynamicSkill:{current:1,supported:[1],dropped:{}},instructions:{current:1,supported:[1],dropped:{}},dynamicInstructions:{current:1,supported:[1],dropped:{}},config:{current:1,supported:[1],dropped:{}},state:{current:2,supported:[1,2],dropped:{}}},EXTENSION_CAPABILITY_VERSIONS=Object.fromEntries(Object.entries(EXTENSION_CAPABILITY_CONTRACTS).map(([e,t])=>[e,t.current])),EXTENSION_CAPABILITY_SUPPORT=Object.keys(EXTENSION_CAPABILITY_CONTRACTS).reduce((e,t)=>(e[t]=EXTENSION_CAPABILITY_CONTRACTS[t].supported,e),{}),extensionCompatibilityManifestSchema=z.object({kind:z.literal(EXTENSION_COMPATIBILITY_MANIFEST_KIND),formatVersion:z.literal(1),builtWithEve:z.string().min(1),requires:z.record(z.string(),z.number().int().positive())}).strict();function serializeExtensionCompatibilityManifest(e){return`${JSON.stringify(e,null,2)}\n`}function parseExtensionCompatibilityManifest(e,t){let n;try{n=JSON.parse(e)}catch(e){throw Error(`Extension compatibility manifest "${t}" is not valid JSON: ${e instanceof Error?e.message:String(e)}`)}let r=extensionCompatibilityManifestSchema.safeParse(n);if(!r.success)throw Error(`Extension compatibility manifest "${t}" is invalid. ${formatValidationError(r.error)}`);return r.data}async function readExtensionCompatibilityManifest(e){return parseExtensionCompatibilityManifest(await readFile(e,`utf8`),e)}async function writeExtensionCompatibilityManifest(e,n){await writeFile(join(e,EXTENSION_COMPATIBILITY_MANIFEST_FILENAME),serializeExtensionCompatibilityManifest(n),`utf8`)}function findUnsupportedExtensionCapabilities(e,t=EXTENSION_CAPABILITY_SUPPORT){return Object.entries(e.requires).flatMap(([e,n])=>{let r=Object.hasOwn(t,e)?t[e]??[]:[];return r.includes(n)?[]:[{capability:e,requiredVersion:n,supportedVersions:r}]}).sort((e,t)=>e.capability.localeCompare(t.capability))}export{EXTENSION_CAPABILITY_SUPPORT,EXTENSION_CAPABILITY_VERSIONS,EXTENSION_COMPATIBILITY_MANIFEST_FILENAME,EXTENSION_COMPATIBILITY_MANIFEST_FORMAT_VERSION,EXTENSION_COMPATIBILITY_MANIFEST_KIND,findUnsupportedExtensionCapabilities,parseExtensionCompatibilityManifest,readExtensionCompatibilityManifest,serializeExtensionCompatibilityManifest,writeExtensionCompatibilityManifest};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createLogger}from"#internal/logging.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{UNSPECIFIED_INPUT_SCHEMA,toInputSchema,toOutputSchema}from"#shared/tool-schema.js";import{createToolExecuteWithAuth}from"#execution/tool-auth.js";import{resolveRuntimeModelReference}from"#runtime/agent/resolve-model.js";import{dispatchDynamicModelEvent}from"#context/dynamic-model-lifecycle.js";import{createToolLoopHarness}from"#harness/tool-loop.js";import{AGENT_TOOL_DESCRIPTION,AGENT_TOOL_NAME}from"#runtime/framework-tools/agent.js";import{ROOT_RUNTIME_AGENT_NODE_ID}from"#runtime/graph.js";import{SUBAGENT_TOOL_INPUT_SCHEMA}from"#runtime/subagents/registry.js";import{findRegisteredRuntimeTool}from"#runtime/tools/registry.js";import{preserveFrameworkStateOnCompaction}from"#execution/compaction.js";const log=createLogger(`execution.node-step`);function createExecutionNodeStep(e){let t=createRuntimeModelResolver(e.modelResolutionScope),n=e.node.turnAgent.dynamicModel===void 0?void 0:createRuntimeDynamicModelEventDispatcher(e.modelResolutionScope,e.node.turnAgent.dynamicModel),r=createNodeHarnessTools({node:e.node})
|
|
1
|
+
import{createLogger}from"#internal/logging.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{UNSPECIFIED_INPUT_SCHEMA,toInputSchema,toOutputSchema}from"#shared/tool-schema.js";import{createToolExecuteWithAuth}from"#execution/tool-auth.js";import{resolveRuntimeModelReference}from"#runtime/agent/resolve-model.js";import{dispatchDynamicModelEvent}from"#context/dynamic-model-lifecycle.js";import{createToolLoopHarness}from"#harness/tool-loop.js";import{getInstrumentationRuntime}from"#harness/instrumentation-runtime.js";import{AGENT_TOOL_DESCRIPTION,AGENT_TOOL_NAME}from"#runtime/framework-tools/agent.js";import{ROOT_RUNTIME_AGENT_NODE_ID}from"#runtime/graph.js";import{SUBAGENT_TOOL_INPUT_SCHEMA}from"#runtime/subagents/registry.js";import{findRegisteredRuntimeTool}from"#runtime/tools/registry.js";import{preserveFrameworkStateOnCompaction}from"#execution/compaction.js";const log=createLogger(`execution.node-step`);function createExecutionNodeStep(e){let t=createRuntimeModelResolver(e.modelResolutionScope),n=e.node.turnAgent.dynamicModel===void 0?void 0:createRuntimeDynamicModelEventDispatcher(e.modelResolutionScope,e.node.turnAgent.dynamicModel),r=createNodeHarnessTools({node:e.node}),i=getInstrumentationRuntime(),a=createToolLoopHarness({abortSignal:e.abortSignal,capabilities:e.capabilities,workflow:e.node.agent.workflowTool!==void 0,workflowMaxSubagents:e.workflowMaxSubagents,handleEvent:e.handleEvent,instrumentation:i,mode:e.mode,onCompaction:preserveFrameworkStateOnCompaction,dispatchDynamicModelEvent:n,resolveModel:t,runtimeIdentity:buildRuntimeIdentity(e.node),tools:r});return i===void 0?a:async(e,t)=>{try{return await a(e,t)}finally{await i.forceFlush()}}}function buildRuntimeIdentity(e){let n=resolveInstalledPackageInfo(),r={agentId:e.turnAgent.id,agentName:e.agent.config?.name,eveVersion:n.version,modelId:e.turnAgent.dynamicModel===void 0?e.turnAgent.model.id:`dynamic:${e.turnAgent.model.id}`},i=process.env.VERCEL_GIT_COMMIT_SHA?.trim(),a=process.env.VERCEL_GIT_COMMIT_REF?.trim(),o=process.env.VERCEL_DEPLOYMENT_CREATED_AT?.trim();return i||a||o?{...r,build:{deployedAt:o||void 0,gitBranch:a||void 0,gitSha:i||void 0}}:r}function createRuntimeModelResolver(e){return t=>resolveRuntimeModelReference(t,e)}function createRuntimeDynamicModelEventDispatcher(e,t){return n=>dispatchDynamicModelEvent({ctx:n.ctx,dynamicModel:t,event:n.event,fallback:n.fallback,messages:n.messages,scope:e})}function createNodeHarnessTools(e){let t=new Map;for(let n of e.node.turnAgent.tools){let r=resolveHarnessToolDefinition({node:e.node,tool:n});r!==null&&t.set(n.name,r)}return e.node.nodeId===ROOT_RUNTIME_AGENT_NODE_ID&&!e.node.agent.disabledFrameworkTools.includes(AGENT_TOOL_NAME)&&!t.has(AGENT_TOOL_NAME)&&t.set(AGENT_TOOL_NAME,{description:AGENT_TOOL_DESCRIPTION,inputSchema:SUBAGENT_TOOL_INPUT_SCHEMA,name:AGENT_TOOL_NAME,runtimeAction:{kind:`subagent-call`,nodeId:e.node.nodeId,subagentName:AGENT_TOOL_NAME}}),t}function resolveHarnessToolDefinition(e){if(e.tool.kind===`subagent`||e.tool.kind===`remote`){let t=e.tool.kind===`remote`?{kind:`remote-agent-call`,nodeId:e.tool.nodeId,remoteAgentName:e.tool.name,subagentName:e.tool.name}:{kind:`subagent-call`,nodeId:e.tool.nodeId,subagentName:e.tool.name};return{description:e.tool.description??``,inputSchema:toInputSchema(e.tool.inputSchema)??UNSPECIFIED_INPUT_SCHEMA,name:e.tool.name,outputSchema:toOutputSchema(e.tool.outputSchema),runtimeAction:t}}let t=findRegisteredRuntimeTool(e.node.toolRegistry,e.tool.name);if(t===null)return log.warn(`declared tool is not registered — omitting from toolset`,{toolName:e.tool.name,nodeId:e.node.nodeId}),null;let a=t.definition,o=a.sourceId.startsWith(`eve:`),s=a.execute;return{approvalKey:a.approvalKey,description:a.description,execute:resolveAuthoredExecute({isFrameworkTool:o,rawExecute:s,scope:a.name}),inputSchema:a.inputSchema??UNSPECIFIED_INPUT_SCHEMA,name:a.name,approval:a.approval,outputSchema:a.outputSchema,toModelOutput:a.toModelOutput}}function resolveAuthoredExecute(e){let{isFrameworkTool:t,rawExecute:n,scope:r}=e;return n===void 0?void 0:t?n:createToolExecuteWithAuth({execute:n,scope:r})}export{buildRuntimeIdentity,createExecutionNodeStep,createNodeHarnessTools};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{callAdapterEventHandler}from"#channel/adapter.js";import{encodeMessageStreamEvent,timestampHandleMessageStreamEvent}from"#protocol/message.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{getHarnessEmissionState,isHarnessBetweenTurns,setHarnessEmissionState}from"#harness/emission.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import{createDurableSessionState,readDurableSession}from"#execution/durable-session-store.js";import{clearPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{hydrateDurableSession}from"#execution/session.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{clearPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{clearAllProxyInputRequests,hasProxyInputRequests}from"#harness/proxy-input-requests.js";import{setChannelContext}from"#execution/channel-context.js";import{dispatchStreamEventHooks}from"#context/hook-lifecycle.js";import{withContextScope}from"#context/run-step.js";import{reconcileSessionContinuationToken}from"#execution/reconcile-session-continuation-token.js";import{emitCancelledTurn}from"#harness/cancelled-turn-emission.js";async function settleCancelledTurnStep(r){"use step";let i=await readDurableSession(r.sessionState),a=await deserializeContext(r.serializedContext),o=a.require(ChannelKey),s=buildAdapterContext(o,a),c=a.require(BundleKey),l=hydrateDurableSession({compactionOverrides:{thresholdPercent:c.resolvedAgent.config.compaction?.thresholdPercent},durable:i,turnAgent:c.turnAgent}),
|
|
1
|
+
import{callAdapterEventHandler}from"#channel/adapter.js";import{encodeMessageStreamEvent,timestampHandleMessageStreamEvent}from"#protocol/message.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{getHarnessEmissionState,isHarnessBetweenTurns,setHarnessEmissionState}from"#harness/emission.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import{createDurableSessionState,readDurableSession}from"#execution/durable-session-store.js";import{clearPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{hydrateDurableSession}from"#execution/session.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{clearPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{clearAllProxyInputRequests,hasProxyInputRequests}from"#harness/proxy-input-requests.js";import{getInstrumentationRuntime}from"#harness/instrumentation-runtime.js";import{setChannelContext}from"#execution/channel-context.js";import{dispatchStreamEventHooks}from"#context/hook-lifecycle.js";import{withContextScope}from"#context/run-step.js";import{reconcileSessionContinuationToken}from"#execution/reconcile-session-continuation-token.js";import{activeTurnId}from"#harness/active-turn-id.js";import{emitCancelledTurn}from"#harness/cancelled-turn-emission.js";import{createInstrumentationHandleEvent}from"#harness/instrumentation-native-events.js";async function settleCancelledTurnStep(r){"use step";let i=await readDurableSession(r.sessionState),a=await deserializeContext(r.serializedContext),o=a.require(ChannelKey),s=buildAdapterContext(o,a),c=a.require(BundleKey),l=getInstrumentationRuntime(),u=hydrateDurableSession({compactionOverrides:{thresholdPercent:c.resolvedAgent.config.compaction?.thresholdPercent},durable:i,turnAgent:c.turnAgent}),d=getHarnessEmissionState(i.state);if(!(isHarnessBetweenTurns(u)&&hasProxyInputRequests(i.state))){let e=r.parentWritable.getWriter();try{let t=await withContextScope(a,u,async t=>{let baseEmit=async t=>{let n=await callAdapterEventHandler(o,t,s);setChannelContext(a,{...o,state:{...s.state}}),await e.write(encodeMessageStreamEvent(timestampHandleMessageStreamEvent(n))),await dispatchStreamEventHooks({ctx:a,event:n,registry:c.hookRegistry})};return{result:await emitCancelledTurn(createInstrumentationHandleEvent({agentName:c.resolvedAgent.config.name,handleEvent:baseEmit,hooks:l?.hooks,sessionId:u.sessionId,turnId:activeTurnId(d)})??baseEmit,d,t.continuationToken),session:t}});d=t.result,u=t.session}finally{await l?.forceFlush(),e.releaseLock()}}let f=reconcileSessionContinuationToken(a,setHarnessEmissionState(clearAllProxyInputRequests(clearPendingWorkflowInterrupt(clearPendingRuntimeActionBatch(u))),d));return{serializedContext:serializeContext(a),sessionState:createDurableSessionState({session:f})}}export{settleCancelledTurnStep};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{resolveRuntimeActionResultsForKeys}from"#harness/runtime-actions.js";import{dispatchRuntimeActionsStep}from"#execution/dispatch-runtime-actions-step.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{turnStep}from"#execution/workflow-steps.js";import{createHook,getWorkflowMetadata}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,disposeHook,isHookConflictError}from"#execution/hook-ownership.js";import{normalizeSerializableError}from"#execution/workflow-errors.js";import{sendTurnControlStep}from"#execution/turn-control-protocol.js";import{cancelDescendantTurnsStep}from"#execution/cancel-descendant-turns-step.js";import{dispatchWorkflowRuntimeActionsStep}from"#execution/dispatch-workflow-runtime-actions-step.js";import{migrateTurnWorkflowInput}from"#execution/durable-session-migrations/turn-workflow.js";import{routeDeliverToChildren}from"#execution/route-child-delivery.js";import{runProxySubagentEventStep}from"#execution/subagent-event-proxy-step.js";import{createTurnCancellationControl}from"#execution/turn-cancellation-control.js";import{TurnExecutionCursor}from"#execution/turn-execution-cursor.js";
|
|
1
|
+
import{resolveRuntimeActionResultsForKeys}from"#harness/runtime-actions.js";import{dispatchRuntimeActionsStep}from"#execution/dispatch-runtime-actions-step.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{turnStep}from"#execution/workflow-steps.js";import{createHook,getWorkflowMetadata}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,disposeHook,isHookConflictError}from"#execution/hook-ownership.js";import{activeTurnId}from"#harness/active-turn-id.js";import{normalizeSerializableError}from"#execution/workflow-errors.js";import{sendTurnControlStep}from"#execution/turn-control-protocol.js";import{cancelDescendantTurnsStep}from"#execution/cancel-descendant-turns-step.js";import{dispatchWorkflowRuntimeActionsStep}from"#execution/dispatch-workflow-runtime-actions-step.js";import{migrateTurnWorkflowInput}from"#execution/durable-session-migrations/turn-workflow.js";import{routeDeliverToChildren}from"#execution/route-child-delivery.js";import{runProxySubagentEventStep}from"#execution/subagent-event-proxy-step.js";import{createTurnCancellationControl}from"#execution/turn-cancellation-control.js";import{TurnExecutionCursor}from"#execution/turn-execution-cursor.js";const TASK_MODE_WAIT_ERROR_MESSAGE="Task mode cannot wait for follow-up input (`next: null`).";function canSettleCancelledTurnAsPark(e){return e.mode===`conversation`||e.stepInput.sessionState.continuationToken!==``}async function turnWorkflow(e){"use workflow";let t=migrateTurnWorkflowInput(e);return t.driverCapabilities?.turnInbox===!0?runTurnOwnedWorkflow(t):runLegacyTurnWorkflow(t)}async function runTurnOwnedWorkflow(e){let c=createHook({token:`${e.completionToken}:inbox`}),l=c[Symbol.asyncIterator](),u=new TurnExecutionCursor({controlToken:e.completionToken,parentWritable:e.stepInput.parentWritable,serializedContext:e.stepInput.serializedContext,sessionState:e.stepInput.sessionState}),d=0,nextDeliveryRequestId=()=>`${c.token}:delivery:${String(d++)}`,f=[],p=e.stepInput.input,m=!1,h;try{try{await claimHookOwnership(c),m=!0}catch(e){if(isHookConflictError(e))return;throw e}for(e.driverCapabilities?.cancelledTurnSettle===!0&&canSettleCancelledTurnAsPark(e)&&(h=await createTurnCancellationControl({expectedTurnId:activeTurnId(e.stepInput.sessionState.emissionState),sessionId:e.stepInput.sessionState.sessionId}));;){let i=await turnStep(u.createStepInput(p,h?.signal));if(i.action===`cancelled`){await cancelDescendantTurnsStep({serializedContext:u.serializedContext,sessionState:u.sessionState}),await h?.dispose(),await u.finish({sessionState:u.sessionState},{cancelled:!0,kind:`park`},f);return}if(i.action===`done`){await h?.dispose(),await u.finish(i,{kind:`done`,output:i.output??``,isError:i.isError,usage:i.usage},f);return}let o=i.action===`dispatch-workflow-runtime-actions`||i.action===`park`?i.pendingRuntimeActionKeys:void 0;if(o!==void 0){await u.adopt(i);let e=await(i.action===`dispatch-workflow-runtime-actions`?dispatchWorkflowRuntimeActionsStep:dispatchRuntimeActionsStep)({callbackBaseUrl:resolveWorkflowCallbackBaseUrl(getWorkflowMetadata().url),parentContinuationToken:c.token,parentWritable:u.parentWritable,serializedContext:u.serializedContext,sessionState:u.sessionState});await u.adopt(e);let r=await waitForRuntimeActionResults({bufferedDeliveries:f,cancellation:h,cursor:u,inboxToken:c.token,initialResults:e.results,iterator:l,nextDeliveryRequestId,pendingActionKeys:o});if(r===`cancelled`){p=void 0;continue}p={kind:`runtime-action-result`,results:r};continue}if(i.action===`park`){if(!(i.hasPendingAuthorization||i.hasPendingInputBatch&&e.capabilities?.requestInput===!0||e.mode===`conversation`))throw Error(TASK_MODE_WAIT_ERROR_MESSAGE);await h?.dispose(),await u.finish(i,{authorizationNames:i.authorizationNames,kind:`park`},f);return}await u.adopt(i),p=void 0}}catch(e){throw await u.send({error:normalizeSerializableError(e),kind:`turn-error`}),e}finally{h!==void 0&&await h.dispose(),m&&await disposeHook(c)}}async function waitForRuntimeActionResults(t){let n,r=[...t.initialResults];for(;;){let i=resolveRuntimeActionResultsForKeys({pendingKeys:t.pendingActionKeys,results:r});if(i!==void 0)return n!==void 0&&await t.cursor.send({kind:`turn-delivery-cancelled`,requestId:n}),i;t.cursor.sessionState.hasProxyInputRequests&&n===void 0&&(n=t.nextDeliveryRequestId(),await t.cursor.send({continuationToken:t.cursor.sessionState.continuationToken,inboxToken:t.inboxToken,kind:`turn-delivery-request`,requestId:n}));let a=t.iterator.next();a.catch(()=>{});let o=await(t.cancellation===void 0?a:Promise.race([a,t.cancellation.requested]));if(o===`cancel`)return n!==void 0&&await t.cursor.send({kind:`turn-delivery-cancelled`,requestId:n}),`cancelled`;if(o.done)throw Error(`Turn inbox closed before runtime actions completed.`);let s=o.value;if(s.kind===`runtime-action-result`){r.push(...s.results);continue}if(s.kind===`subagent-input-request`||s.kind===`subagent-authorization-event`){let e=await runProxySubagentEventStep({hookPayload:s,parentWritable:t.cursor.parentWritable,serializedContext:t.cursor.serializedContext,sessionState:t.cursor.sessionState});await t.cursor.adopt(e);continue}if(s.kind===`driver-delivery`&&s.requestId===n){await t.cursor.send({kind:`turn-delivery-accepted`,requestId:s.requestId}),n=void 0;let e=await routeDeliverToChildren({auth:s.delivery.auth,parentWritable:t.cursor.parentWritable,payloads:s.delivery.payloads,sessionState:t.cursor.sessionState});e!==void 0&&t.bufferedDeliveries.push({...s.delivery,payloads:[e]})}}}async function runLegacyTurnWorkflow(e){let t=e.stepInput;try{for(;;){let n=await turnStep(t);if(n.action===`done`){await sendTurnControlStep({controlToken:e.completionToken,payload:{action:{kind:`done`,output:n.output??``,isError:n.isError,serializedContext:n.serializedContext,sessionState:n.sessionState,usage:n.usage},kind:`turn-result`}});return}if(n.action===`dispatch-workflow-runtime-actions`){await sendTurnControlStep({controlToken:e.completionToken,payload:{action:{kind:`dispatch-workflow-runtime-actions`,pendingActionKeys:n.pendingRuntimeActionKeys,serializedContext:n.serializedContext,sessionState:n.sessionState},kind:`turn-result`}});return}if(n.action===`park`){let t=n.pendingRuntimeActionKeys;if(!(t!==void 0||n.hasPendingAuthorization||n.hasPendingInputBatch&&e.capabilities?.requestInput===!0||e.mode===`conversation`))throw Error(TASK_MODE_WAIT_ERROR_MESSAGE);let r=t===void 0?{kind:`park`,serializedContext:n.serializedContext,sessionState:n.sessionState,authorizationNames:n.authorizationNames}:{kind:`dispatch-runtime-actions`,pendingActionKeys:t,serializedContext:n.serializedContext,sessionState:n.sessionState};await sendTurnControlStep({controlToken:e.completionToken,payload:{action:r,kind:`turn-result`}});return}t={input:void 0,parentWritable:t.parentWritable,serializedContext:n.serializedContext,sessionState:n.sessionState}}}catch(t){throw await sendTurnControlStep({controlToken:e.completionToken,payload:{error:normalizeSerializableError(t),kind:`turn-error`}}),t}}export{turnWorkflow};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Options for an SSRF-safe HTTPS request. */
|
|
2
|
+
export interface PublicUrlRequestOptions {
|
|
3
|
+
readonly headers: Readonly<Record<string, string>>;
|
|
4
|
+
readonly maxResponseSize: number;
|
|
5
|
+
readonly signal: AbortSignal;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Requests an untrusted HTTPS URL while preventing access to non-public
|
|
9
|
+
* network destinations.
|
|
10
|
+
*
|
|
11
|
+
* The socket lookup rejects the hostname if any resolved address is non-public
|
|
12
|
+
* and connects using those exact results.
|
|
13
|
+
*/
|
|
14
|
+
export declare function requestPublicUrl(urlText: string, options: PublicUrlRequestOptions): Promise<Response>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{isLoopbackHostname,isPrivateOrReservedIpAddress}from"#shared/network-address.js";import{lookup}from"node:dns";import{isIP}from"node:net";import{Agent}from"undici";const REDIRECT_STATUSES=new Set([301,302,303,307,308]),UNSAFE_DESTINATION_ERROR=`URL must not target localhost, private, link-local, or reserved IP addresses.`;async function requestPublicUrl(e,t){let n=parseHttpsUrl(e),{dispatcher:r,response:i}=await requestOnce(n,t);try{let e=i.headers.get(`location`);if(e!==null&&REDIRECT_STATUSES.has(i.status)){await cancelResponseBody(i);let t=parseHttpsUrl(new URL(e,n).toString());throw Error(`Request redirected to ${t.toString()}. Call web_fetch again with that URL.`)}return await consumeResponse(i,t.maxResponseSize)}finally{await r.close()}}function parseHttpsUrl(e){let t;try{t=new URL(e)}catch{throw Error(`URL must be a valid absolute https:// URL.`)}if(t.protocol!==`https:`)throw Error(`URL must start with https://`);return t}async function requestOnce(e,t){assertPublicHostname(e.hostname);let n=new Agent({connect:{lookup:createPublicLookup()}});try{let r={dispatcher:n,headers:t.headers,redirect:`manual`,signal:t.signal};return{dispatcher:n,response:await fetch(e,r)}}catch(e){throw await n.close(),e}}function assertPublicHostname(t){let n=t.replace(/^\[(.*)\]$/u,`$1`);if(isIP(n)!==0){assertPublicAddress(n);return}if(isLoopbackHostname(n))throw Error(UNSAFE_DESTINATION_ERROR)}function assertPublicAddress(e){if(isPrivateOrReservedIpAddress(e))throw Error(UNSAFE_DESTINATION_ERROR)}function createPublicLookup(){return(e,t,r)=>{lookup(e,{all:!0,verbatim:!0},(n,i)=>{if(n!==null){r(n,``,0);return}try{for(let{address:e}of i)assertPublicAddress(e)}catch(e){r(e,``,0);return}let a=t.family===void 0||t.family===0?i:i.filter(({family:e})=>e===t.family);if(a.length===0){let t=Error(`Unable to resolve URL hostname "${e}" in the requested IP family.`);Object.assign(t,{code:`ENOTFOUND`}),r(t,``,0);return}if(t.all===!0){r(null,a);return}let o=a[0];r(null,o.address,o.family)})}}async function consumeResponse(e,t){let n=parseContentLength(e.headers.get(`content-length`));if(n!==void 0&&n>t)throw await cancelResponseBody(e),createResponseTooLargeError();let r=await readBoundedBody(e,t),i=r.byteLength===0?null:Uint8Array.from(r).buffer;return new Response(i,{headers:e.headers,status:e.status,statusText:e.statusText})}function parseContentLength(e){if(e===null)return;let t=Number.parseInt(e,10);return Number.isFinite(t)&&t>=0?t:void 0}async function readBoundedBody(e,t){if(e.body===null)return new Uint8Array;let n=e.body.getReader(),r=[],i=0;try{for(;;){let{done:e,value:a}=await n.read();if(e)break;if(i+=a.byteLength,i>t)throw await n.cancel(),createResponseTooLargeError();r.push(a)}}finally{n.releaseLock()}let a=new Uint8Array(i),o=0;for(let e of r)a.set(e,o),o+=e.byteLength;return a}async function cancelResponseBody(e){try{await e.body?.cancel()}catch{}}function createResponseTooLargeError(){return Error(`Response too large (exceeds 5 MB limit).`)}export{requestPublicUrl};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{truncateHead}from"#execution/sandbox/truncate-output.js";import{EVE_PACKAGE_NAME}from"#internal/package-name.js";import{convertHtmlToMarkdown,extractTextFromHtml}from"#execution/web-fetch/html.js";const MAX_RESPONSE_SIZE=5*1024*1024;async function executeWebFetchTool(n,r){let{url:i,format:a=`markdown`,timeout:o}=n
|
|
1
|
+
import{truncateHead}from"#execution/sandbox/truncate-output.js";import{EVE_PACKAGE_NAME}from"#internal/package-name.js";import{convertHtmlToMarkdown,extractTextFromHtml}from"#execution/web-fetch/html.js";import{requestPublicUrl}from"#execution/web-fetch/request.js";const MAX_RESPONSE_SIZE=5*1024*1024;async function executeWebFetchTool(n,r){let{url:i,format:a=`markdown`,timeout:o}=n,s=Math.min(o===void 0?3e4:o*1e3,12e4),c=AbortSignal.timeout(s),l=r?.abortSignal===void 0?c:AbortSignal.any([r.abortSignal,c]),u=buildHeaders(a),d=await requestPublicUrl(i,{headers:u,maxResponseSize:MAX_RESPONSE_SIZE,signal:l}),f=d.status===403&&d.headers.get(`cf-mitigated`)===`challenge`?await requestPublicUrl(i,{headers:{...u,"User-Agent":EVE_PACKAGE_NAME},maxResponseSize:MAX_RESPONSE_SIZE,signal:l}):d;if(!f.ok)throw Error(`Request failed with status code: ${f.status}`);let p=await f.arrayBuffer(),m=f.headers.get(`content-type`)??``,h=m.includes(`text/html`),g=new TextDecoder().decode(p),_;_=a===`markdown`&&h?convertHtmlToMarkdown(g):a===`text`&&h?extractTextFromHtml(g):g;let{output:v,truncated:y}=truncateHead(_);return{content:v,contentType:m,truncated:y,url:i}}function buildHeaders(e){let t;return t=e===`markdown`?`text/markdown;q=1.0, text/x-markdown;q=0.9, text/plain;q=0.8, text/html;q=0.7, */*;q=0.1`:e===`text`?`text/plain;q=1.0, text/markdown;q=0.9, text/html;q=0.8, */*;q=0.1`:`text/html;q=1.0, application/xhtml+xml;q=0.9, text/plain;q=0.8, text/markdown;q=0.7, */*;q=0.1`,{Accept:t,"Accept-Language":`en-US,en;q=0.9`,"User-Agent":`Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36`}}export{executeWebFetchTool};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{callAdapterEventHandler,defaultDeliverResult}from"#channel/adapter.js";import{AuthKey,CapabilitiesKey,ModeKey,SessionDynamicToolRuntimeRevisionKey}from"#context/keys.js";import{createAuthorizationCompletedEvent,createSessionStartedEvent,encodeMessageStreamEvent,timestampHandleMessageStreamEvent}from"#protocol/message.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{getHarnessEmissionState}from"#harness/emission.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import{createDurableSessionState,readDurableSession}from"#execution/durable-session-store.js";import{createWorkflowRuntime,requestWorkflowTurnCancellation,startWorkflowPreferLatest,turnWorkflowReference}from"#execution/workflow-runtime.js";import{getPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{hydrateDurableSession,refreshSessionFromTurnAgent}from"#execution/session.js";import{resumeHook}from"#internal/workflow/runtime.js";import{coalesceTurnInputs}from"#harness/messages.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{getPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getRuntimeActionKeysFromWorkflowInterrupt,isWorkflowRuntimeActionInterrupt}from"#harness/workflow-runtime-action-state.js";import{dispatchDynamicModelEvent}from"#context/dynamic-model-lifecycle.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{setChannelContext}from"#execution/channel-context.js";import{dispatchStreamEventHooks}from"#context/hook-lifecycle.js";import{runStep}from"#context/run-step.js";import{reconcileSessionContinuationToken}from"#execution/reconcile-session-continuation-token.js";import{routeDeliverPayload}from"#execution/subagent-hitl-proxy.js";import{CallbackBaseUrlKey,PendingAuthorizationResultKey,clearPendingAuthorization,getPendingAuthorization}from"#harness/authorization.js";import{isSessionLimitDecline,isTurnCancellation,throwIfTurnAborted}from"#harness/turn-cancellation.js";import{createTurnWorkflowInput}from"#execution/durable-session-migrations/turn-workflow.js";import{buildTurnAttributes,readRootSessionId}from"#execution/eve-workflow-attributes.js";import{normalizeEveAttributes}from"#runtime/attributes/normalize.js";import{dispatchDynamicInstructionEvent}from"#context/dynamic-instruction-lifecycle.js";import{dispatchDynamicSkillEvent}from"#context/dynamic-skill-lifecycle.js";import{dispatchDynamicToolEvent,refreshDynamicSessionToolsForRuntimeRevision}from"#context/dynamic-tool-lifecycle.js";import{hasPendingInputBatch}from"#harness/input-requests.js";import{getTurnUsageState,toUsage}from"#harness/turn-tag-state.js";import{getRuntimeActionRequestKey}from"#runtime/actions/keys.js";import{buildRuntimeIdentity,createExecutionNodeStep}from"#execution/node-step.js";import{recordSubagentUsageSpans}from"#execution/subagent-usage-span.js";import{resolveRuntimeCompiledArtifactsVersionedCacheKey}from"#runtime/cache-key.js";async function turnStep(a){"use step";let o=a,s=await readDurableSession(o.sessionState),c=await deserializeContext(o.serializedContext),l=c.require(ChannelKey),u=c.require(BundleKey);try{let{getWorkflowMetadata:e}=await import(`#compiled/@workflow/core/index.js`),t=e();typeof t.url==`string`&&c.set(CallbackBaseUrlKey,resolveWorkflowCallbackBaseUrl(t.url))}catch{}let d=getPendingAuthorization(s.state),f;if(d&&o.input?.kind===`deliver`){let e=[],t=[],n=[];for(let r of o.input.payloads){let i=r.authorizationCallback;if(i){let n=d.challenges.find(e=>e.name===i.connectionName);n&&(e.push({name:n.name,resume:n.resume,callback:i.callback,hookUrl:n.hookUrl}),t.push({name:n.name,authorization:n.challenge}))}else n.push(r)}e.length>0&&(c.set(PendingAuthorizationResultKey,e),s={...s,state:clearPendingAuthorization(s.state,e.map(e=>e.name))},f=t,o=n.length>0?{...o,input:{...o.input,payloads:n}}:{...o,input:void 0})}o.input?.kind===`deliver`&&o.input.auth!==void 0&&c.set(AuthKey,o.input.auth??null);let p=hydrateDurableSession({compactionOverrides:{thresholdPercent:u.resolvedAgent.config.compaction?.thresholdPercent},durable:s,turnAgent:u.turnAgent}),m=buildAdapterContext(l,c),h;if(o.input?.kind===`deliver`){let e=[];for(let n of o.input.payloads){let r=l.deliver?await l.deliver(n,m):defaultDeliverResult(n);r!=null&&e.push(r)}h=e.length===0?void 0:e.reduce(coalesceTurnInputs)}else o.input?.kind===`runtime-action-result`&&(recordSubagentUsageSpans(o.input.results),h={runtimeActionResults:o.input.results});if(o.input?.kind===`deliver`&&setChannelContext(c,{...l,state:{...m.state}}),o.input?.kind===`deliver`&&h===void 0){let e=reconcileSessionContinuationToken(c,p),t=serializeContext(c),n=e===p?o.sessionState:createDurableSessionState({session:e});return{action:`park`,...derivePendingState(e),serializedContext:t,sessionState:n}}let g=u.hookRegistry,_=u.resolvedAgent.dynamicInstructionsResolvers??[],v=u.resolvedAgent.dynamicSkillResolvers??[],y=u.resolvedAgent.dynamicToolResolvers??[],b=buildRuntimeIdentity(u.graph.root),x=process.env.VERCEL_DEPLOYMENT_ID?.trim(),S=x?`deployment:${x}`:await resolveRuntimeCompiledArtifactsVersionedCacheKey(u.compiledArtifactsSource);getHarnessEmissionState(p.state).sessionStarted?await refreshDynamicSessionToolsForRuntimeRevision({ctx:c,resolvers:y,event:createSessionStartedEvent({runtime:b}),messages:p.history,runtimeRevision:S}):c.set(SessionDynamicToolRuntimeRevisionKey,S);let C=o.parentWritable.getWriter(),emit=async t=>{let n=await callAdapterEventHandler(l,t,m);return setChannelContext(c,{...l,state:{...m.state}}),await C.write(encodeMessageStreamEvent(timestampHandleMessageStreamEvent(n))),n},handleEvent=async(e,t)=>{let n=await emit(e);await dispatchStreamEventHooks({ctx:c,registry:g,event:n}),n.type!==`step.started`&&await dispatchDynamicModelEvent({ctx:c,dynamicModel:u.turnAgent.dynamicModel,event:n,fallback:u.turnAgent.model,messages:t??[],scope:{moduleMap:u.moduleMap,nodeId:u.nodeId}}),await dispatchDynamicToolEvent({ctx:c,resolvers:y,event:n,messages:t??[]}),await dispatchDynamicSkillEvent({ctx:c,resolvers:v,event:n,messages:t??[]}),await dispatchDynamicInstructionEvent({ctx:c,resolvers:_,event:n,messages:t??[]})},w=c.require(ModeKey),T;try{throwIfTurnAborted(o.abortSignal),T=await runStep(c,p,async e=>{let t=resolveEffectiveOutputSchema({agentOutputSchema:u.turnAgent.outputSchema,input:h,mode:w,session:e});if(f){let e=getHarnessEmissionState(t.state);for(let{name:t,authorization:n}of f)await handleEvent(createAuthorizationCompletedEvent({authorization:n,name:t,outcome:`authorized`,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId}))}let n=c.get(CapabilitiesKey);return(async(e,t)=>{let r=refreshSessionFromTurnAgent({compactionOverrides:{thresholdPercent:u.resolvedAgent.config.compaction?.thresholdPercent},session:e,turnAgent:u.turnAgent});return createExecutionNodeStep({abortSignal:o.abortSignal,capabilities:n,createRuntime:createWorkflowRuntime,handleEvent,mode:w,modelResolutionScope:{moduleMap:u.moduleMap,nodeId:u.nodeId},node:u.graph.root,workflowMaxSubagents:r.workflowMaxSubagents})(r,t)})(t,h)})}catch(e){if(!isTurnCancellation(e))throw e;if(C.releaseLock(),isSessionLimitDecline(e)){let e=readRootSessionId(o.serializedContext);e!==void 0&&await requestWorkflowTurnCancellation({sessionId:e})}return{action:`cancelled`,serializedContext:o.serializedContext,sessionState:o.sessionState}}let E=reconcileSessionContinuationToken(c,T.session),D=serializeContext(c);T={...T,session:E};let O=createDurableSessionState({session:T.session});if(T.next!==null&&typeof T.next==`object`&&`done`in T.next){await C.close();let e=getTurnUsageState(T.session.state)?.session;return{action:`done`,output:T.next.output,isError:T.next.isError,serializedContext:D,sessionState:O,usage:e===void 0?void 0:toUsage(e)}}if(T.next===null){C.releaseLock();let e=getPendingWorkflowInterrupt(T.session.state);return e!==void 0&&isWorkflowRuntimeActionInterrupt(e.interrupt)?{action:`dispatch-workflow-runtime-actions`,pendingRuntimeActionKeys:getRuntimeActionKeysFromWorkflowInterrupt(e.interrupt),serializedContext:D,sessionState:O}:{action:`park`,...derivePendingState(T.session),serializedContext:D,sessionState:O}}return C.releaseLock(),{action:`continue`,serializedContext:D,sessionState:O}}function derivePendingState(e){let t=getPendingRuntimeActionBatch(e.state),n=getPendingAuthorization(e.state),r={authorizationNames:n?.challenges.map(e=>e.name),hasPendingAuthorization:n!==void 0,hasPendingInputBatch:hasPendingInputBatch(e.state)};return t===void 0?r:{...r,pendingRuntimeActionKeys:t.actions.map(e=>getRuntimeActionRequestKey(e))}}function resolveEffectiveOutputSchema(e){let{agentOutputSchema:t,input:n,mode:r,session:i}=e;return n?.outputSchema===void 0?r===`task`&&i.outputSchema===void 0&&t!==void 0?{...i,outputSchema:t}:i:{...i,outputSchema:n.outputSchema}}async function routeProxiedDeliverStep(e){"use step";let t=await readDurableSession(e.sessionState),n=routeDeliverPayload({payload:e.payload,state:t.state});for(let t of n.forChildren)await resumeHook(t.childContinuationToken,{auth:e.auth,kind:`deliver`,payloads:[t.payload]});return{remainder:n.forSelf}}async function dispatchTurnStep(e){"use step";return{runId:(await startWorkflowPreferLatest(turnWorkflowReference,[createTurnWorkflowInput(e)],{allowReservedAttributes:!0,attributes:normalizeEveAttributes(buildTurnAttributes({parentSessionId:e.sessionState.sessionId,requestId:e.delivery.kind===`deliver`?e.delivery.requestId:void 0,rootSessionId:readRootSessionId(e.serializedContext)??e.sessionState.sessionId}))})).runId}}export{dispatchTurnStep,resolveEffectiveOutputSchema,routeProxiedDeliverStep,turnStep};
|
|
1
|
+
import{callAdapterEventHandler,defaultDeliverResult}from"#channel/adapter.js";import{AuthKey,CapabilitiesKey,ModeKey,SessionDynamicToolRuntimeRevisionKey}from"#context/keys.js";import{createAuthorizationCompletedEvent,createSessionStartedEvent,encodeMessageStreamEvent,timestampHandleMessageStreamEvent}from"#protocol/message.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{getHarnessEmissionState}from"#harness/emission.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import{createDurableSessionState,readDurableSession}from"#execution/durable-session-store.js";import{createWorkflowRuntime,requestWorkflowTurnCancellation,startWorkflowPreferLatest,turnWorkflowReference}from"#execution/workflow-runtime.js";import{getPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{hydrateDurableSession,refreshSessionFromTurnAgent}from"#execution/session.js";import{resumeHook}from"#internal/workflow/runtime.js";import{coalesceTurnInputs}from"#harness/messages.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{getPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getRuntimeActionKeysFromWorkflowInterrupt,isWorkflowRuntimeActionInterrupt}from"#harness/workflow-runtime-action-state.js";import{dispatchDynamicModelEvent}from"#context/dynamic-model-lifecycle.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{setChannelContext}from"#execution/channel-context.js";import{dispatchStreamEventHooks}from"#context/hook-lifecycle.js";import{runStep}from"#context/run-step.js";import{reconcileSessionContinuationToken}from"#execution/reconcile-session-continuation-token.js";import{routeDeliverPayload}from"#execution/subagent-hitl-proxy.js";import{CallbackBaseUrlKey,PendingAuthorizationResultKey,clearPendingAuthorization,getPendingAuthorization}from"#harness/authorization.js";import{isSessionLimitDecline,isTurnCancellation,throwIfTurnAborted}from"#harness/turn-cancellation.js";import{createTurnWorkflowInput}from"#execution/durable-session-migrations/turn-workflow.js";import{buildTurnAttributes,readRootSessionId}from"#execution/eve-workflow-attributes.js";import{normalizeEveAttributes}from"#runtime/attributes/normalize.js";import{dispatchDynamicInstructionEvent}from"#context/dynamic-instruction-lifecycle.js";import{dispatchDynamicSkillEvent}from"#context/dynamic-skill-lifecycle.js";import{dispatchDynamicToolEvent,refreshDynamicSessionToolsForRuntimeRevision}from"#context/dynamic-tool-lifecycle.js";import{preserveSerializedAgentTraceState}from"#harness/agent-trace-context-store.js";import{hasPendingInputBatch}from"#harness/input-requests.js";import{getTurnUsageState,toUsage}from"#harness/turn-tag-state.js";import{getRuntimeActionRequestKey}from"#runtime/actions/keys.js";import{buildRuntimeIdentity,createExecutionNodeStep}from"#execution/node-step.js";import{recordSubagentUsageSpans}from"#execution/subagent-usage-span.js";import{resolveRuntimeCompiledArtifactsVersionedCacheKey}from"#runtime/cache-key.js";async function turnStep(a){"use step";let o=a,s=await readDurableSession(o.sessionState),c=await deserializeContext(o.serializedContext),l=c.require(ChannelKey),u=c.require(BundleKey);try{let{getWorkflowMetadata:e}=await import(`#compiled/@workflow/core/index.js`),t=e();typeof t.url==`string`&&c.set(CallbackBaseUrlKey,resolveWorkflowCallbackBaseUrl(t.url))}catch{}let d=getPendingAuthorization(s.state),f;if(d&&o.input?.kind===`deliver`){let e=[],t=[],n=[];for(let r of o.input.payloads){let i=r.authorizationCallback;if(i){let n=d.challenges.find(e=>e.name===i.connectionName);n&&(e.push({name:n.name,resume:n.resume,callback:i.callback,hookUrl:n.hookUrl}),t.push({name:n.name,authorization:n.challenge}))}else n.push(r)}e.length>0&&(c.set(PendingAuthorizationResultKey,e),s={...s,state:clearPendingAuthorization(s.state,e.map(e=>e.name))},f=t,o=n.length>0?{...o,input:{...o.input,payloads:n}}:{...o,input:void 0})}o.input?.kind===`deliver`&&o.input.auth!==void 0&&c.set(AuthKey,o.input.auth??null);let p=hydrateDurableSession({compactionOverrides:{thresholdPercent:u.resolvedAgent.config.compaction?.thresholdPercent},durable:s,turnAgent:u.turnAgent}),m=buildAdapterContext(l,c),h;if(o.input?.kind===`deliver`){let e=[];for(let n of o.input.payloads){let r=l.deliver?await l.deliver(n,m):defaultDeliverResult(n);r!=null&&e.push(r)}h=e.length===0?void 0:e.reduce(coalesceTurnInputs)}else o.input?.kind===`runtime-action-result`&&(recordSubagentUsageSpans(o.input.results),h={runtimeActionResults:o.input.results});if(o.input?.kind===`deliver`&&setChannelContext(c,{...l,state:{...m.state}}),o.input?.kind===`deliver`&&h===void 0){let e=reconcileSessionContinuationToken(c,p),t=serializeContext(c),n=e===p?o.sessionState:createDurableSessionState({session:e});return{action:`park`,...derivePendingState(e),serializedContext:t,sessionState:n}}let g=u.hookRegistry,_=u.resolvedAgent.dynamicInstructionsResolvers??[],v=u.resolvedAgent.dynamicSkillResolvers??[],y=u.resolvedAgent.dynamicToolResolvers??[],b=buildRuntimeIdentity(u.graph.root),x=process.env.VERCEL_DEPLOYMENT_ID?.trim(),S=x?`deployment:${x}`:await resolveRuntimeCompiledArtifactsVersionedCacheKey(u.compiledArtifactsSource);getHarnessEmissionState(p.state).sessionStarted?await refreshDynamicSessionToolsForRuntimeRevision({ctx:c,resolvers:y,event:createSessionStartedEvent({runtime:b}),messages:p.history,runtimeRevision:S}):c.set(SessionDynamicToolRuntimeRevisionKey,S);let C=o.parentWritable.getWriter(),emit=async t=>{let n=await callAdapterEventHandler(l,t,m);return setChannelContext(c,{...l,state:{...m.state}}),await C.write(encodeMessageStreamEvent(timestampHandleMessageStreamEvent(n))),n},handleEvent=async(e,t)=>{let n=await emit(e);await dispatchStreamEventHooks({ctx:c,registry:g,event:n}),n.type!==`step.started`&&await dispatchDynamicModelEvent({ctx:c,dynamicModel:u.turnAgent.dynamicModel,event:n,fallback:u.turnAgent.model,messages:t??[],scope:{moduleMap:u.moduleMap,nodeId:u.nodeId}}),await dispatchDynamicToolEvent({ctx:c,resolvers:y,event:n,messages:t??[]}),await dispatchDynamicSkillEvent({ctx:c,resolvers:v,event:n,messages:t??[]}),await dispatchDynamicInstructionEvent({ctx:c,resolvers:_,event:n,messages:t??[]})},w=c.require(ModeKey),T;try{throwIfTurnAborted(o.abortSignal),T=await runStep(c,p,async e=>{let t=resolveEffectiveOutputSchema({agentOutputSchema:u.turnAgent.outputSchema,input:h,mode:w,session:e});if(f){let e=getHarnessEmissionState(t.state);for(let{name:t,authorization:n}of f)await handleEvent(createAuthorizationCompletedEvent({authorization:n,name:t,outcome:`authorized`,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId}))}let n=c.get(CapabilitiesKey);return(async(e,t)=>{let r=refreshSessionFromTurnAgent({compactionOverrides:{thresholdPercent:u.resolvedAgent.config.compaction?.thresholdPercent},session:e,turnAgent:u.turnAgent});return createExecutionNodeStep({abortSignal:o.abortSignal,capabilities:n,createRuntime:createWorkflowRuntime,handleEvent,mode:w,modelResolutionScope:{moduleMap:u.moduleMap,nodeId:u.nodeId},node:u.graph.root,workflowMaxSubagents:r.workflowMaxSubagents})(r,t)})(t,h)})}catch(e){if(!isTurnCancellation(e))throw e;if(C.releaseLock(),isSessionLimitDecline(e)){let e=readRootSessionId(o.serializedContext);e!==void 0&&await requestWorkflowTurnCancellation({sessionId:e})}return{action:`cancelled`,serializedContext:preserveSerializedAgentTraceState(o.serializedContext,serializeContext(c)),sessionState:o.sessionState}}let E=reconcileSessionContinuationToken(c,T.session),D=serializeContext(c);T={...T,session:E};let O=createDurableSessionState({session:T.session});if(T.next!==null&&typeof T.next==`object`&&`done`in T.next){await C.close();let e=getTurnUsageState(T.session.state)?.session;return{action:`done`,output:T.next.output,isError:T.next.isError,serializedContext:D,sessionState:O,usage:e===void 0?void 0:toUsage(e)}}if(T.next===null){C.releaseLock();let e=getPendingWorkflowInterrupt(T.session.state);return e!==void 0&&isWorkflowRuntimeActionInterrupt(e.interrupt)?{action:`dispatch-workflow-runtime-actions`,pendingRuntimeActionKeys:getRuntimeActionKeysFromWorkflowInterrupt(e.interrupt),serializedContext:D,sessionState:O}:{action:`park`,...derivePendingState(T.session),serializedContext:D,sessionState:O}}return C.releaseLock(),{action:`continue`,serializedContext:D,sessionState:O}}function derivePendingState(e){let t=getPendingRuntimeActionBatch(e.state),n=getPendingAuthorization(e.state),r={authorizationNames:n?.challenges.map(e=>e.name),hasPendingAuthorization:n!==void 0,hasPendingInputBatch:hasPendingInputBatch(e.state)};return t===void 0?r:{...r,pendingRuntimeActionKeys:t.actions.map(e=>getRuntimeActionRequestKey(e))}}function resolveEffectiveOutputSchema(e){let{agentOutputSchema:t,input:n,mode:r,session:i}=e;return n?.outputSchema===void 0?r===`task`&&i.outputSchema===void 0&&t!==void 0?{...i,outputSchema:t}:i:{...i,outputSchema:n.outputSchema}}async function routeProxiedDeliverStep(e){"use step";let t=await readDurableSession(e.sessionState),n=routeDeliverPayload({payload:e.payload,state:t.state});for(let t of n.forChildren)await resumeHook(t.childContinuationToken,{auth:e.auth,kind:`deliver`,payloads:[t.payload]});return{remainder:n.forSelf}}async function dispatchTurnStep(e){"use step";return{runId:(await startWorkflowPreferLatest(turnWorkflowReference,[createTurnWorkflowInput(e)],{allowReservedAttributes:!0,attributes:normalizeEveAttributes(buildTurnAttributes({parentSessionId:e.sessionState.sessionId,requestId:e.delivery.kind===`deliver`?e.delivery.requestId:void 0,rootSessionId:readRootSessionId(e.serializedContext)??e.sessionState.sessionId}))})).runId}}export{dispatchTurnStep,resolveEffectiveOutputSchema,routeProxiedDeliverStep,turnStep};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type SpanContext, type Tracer } from "#compiled/@opentelemetry/api/index.js";
|
|
2
|
+
import type { InstrumentationContextRunner, InstrumentationProviderDefinition, InstrumentationTurnTerminalEvent } from "#harness/instrumentation-lifecycle.js";
|
|
3
|
+
export interface AgentSessionTraceState {
|
|
4
|
+
readonly agentName?: string;
|
|
5
|
+
readonly channelKind?: string;
|
|
6
|
+
readonly context: SpanContext;
|
|
7
|
+
readonly pendingStarted: boolean;
|
|
8
|
+
readonly rootSessionId: string;
|
|
9
|
+
}
|
|
10
|
+
export interface AgentTurnTraceState {
|
|
11
|
+
readonly context: SpanContext;
|
|
12
|
+
readonly rootSessionId: string;
|
|
13
|
+
readonly sequence: number;
|
|
14
|
+
readonly terminal?: {
|
|
15
|
+
readonly error?: unknown;
|
|
16
|
+
readonly type: InstrumentationTurnTerminalEvent["type"];
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/** Provider-owned serializable storage for durable agent trace state. */
|
|
20
|
+
export interface AgentTraceStateStore {
|
|
21
|
+
deleteSession(sessionId: string): void | PromiseLike<void>;
|
|
22
|
+
deleteTurn(sessionId: string, turnId: string): void | PromiseLike<void>;
|
|
23
|
+
getSession(sessionId: string): AgentSessionTraceState | undefined | PromiseLike<AgentSessionTraceState | undefined>;
|
|
24
|
+
getTurn(sessionId: string, turnId: string): AgentTurnTraceState | undefined | PromiseLike<AgentTurnTraceState | undefined>;
|
|
25
|
+
setSession(sessionId: string, state: AgentSessionTraceState): void | PromiseLike<void>;
|
|
26
|
+
setTurn(sessionId: string, turnId: string, state: AgentTurnTraceState): void | PromiseLike<void>;
|
|
27
|
+
}
|
|
28
|
+
/** In-memory trace state used by tests and non-durable runtimes. */
|
|
29
|
+
export declare class InMemoryAgentTraceStateStore implements AgentTraceStateStore {
|
|
30
|
+
#private;
|
|
31
|
+
deleteSession(sessionId: string): void;
|
|
32
|
+
deleteTurn(sessionId: string, turnId: string): void;
|
|
33
|
+
getSession(sessionId: string): AgentSessionTraceState | undefined;
|
|
34
|
+
getTurn(sessionId: string, turnId: string): AgentTurnTraceState | undefined;
|
|
35
|
+
setSession(sessionId: string, state: AgentSessionTraceState): void;
|
|
36
|
+
setTurn(sessionId: string, turnId: string, state: AgentTurnTraceState): void;
|
|
37
|
+
}
|
|
38
|
+
export interface AgentOtelInstrumentationInput {
|
|
39
|
+
readonly frameworkVersion: string;
|
|
40
|
+
readonly stateStore: AgentTraceStateStore;
|
|
41
|
+
readonly tracer: Tracer;
|
|
42
|
+
}
|
|
43
|
+
/** OTel event definition and its trusted framework context runner. */
|
|
44
|
+
export interface AgentOtelInstrumentation {
|
|
45
|
+
readonly hook: InstrumentationProviderDefinition;
|
|
46
|
+
readonly runInContext: InstrumentationContextRunner;
|
|
47
|
+
}
|
|
48
|
+
/** Creates OTel instrumentation for eve's structural `agent.*` convention. */
|
|
49
|
+
export declare function createAgentOtelInstrumentation(input: AgentOtelInstrumentationInput): AgentOtelInstrumentation;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createHash}from"node:crypto";import{ROOT_CONTEXT,SpanStatusCode,context,trace}from"#compiled/@opentelemetry/api/index.js";var InMemoryAgentTraceStateStore=class{#e=new Map;#t=new Map;deleteSession(e){this.#e.delete(e)}deleteTurn(e,t){this.#t.delete(turnKey(e,t))}getSession(e){return this.#e.get(e)}getTurn(e,t){return this.#t.get(turnKey(e,t))}setSession(e,t){this.#e.set(e,t)}setTurn(e,t,n){this.#t.set(turnKey(e,t),n)}};function createAgentOtelInstrumentation(e){let t=new WeakMap,n=new WeakMap,onSessionStarted=async e=>{await ensureSessionContext(e)},onTurnStarted=async t=>{let n=await ensureSessionContext({agentName:void 0,channelKind:void 0,rootSessionId:t.rootSessionId,sessionId:t.sessionId,type:`session.started`}),r=e.tracer.startSpan(`agent.turn`,{attributes:{"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.name":n.agentName,"agent.root.session.id":t.rootSessionId,"agent.session.id":t.sessionId,"agent.turn.id":t.turnId,"agent.turn.sequence":t.sequence}},contextFromSpanContext(n.context));r.addEvent(`turn.started`),n.pendingStarted&&r.addEvent(`session.started`),await e.stateStore.setSession(t.sessionId,{...n,pendingStarted:!1}),await e.stateStore.setTurn(t.sessionId,t.turnId,{context:r.spanContext(),rootSessionId:t.rootSessionId,sequence:t.sequence}),r.end()},onAttemptStarted=async t=>{let r=await e.stateStore.getTurn(t.scope.sessionId,t.scope.turnId);if(r===void 0)return;let a=contextFromSpanContext(r.context),o=e.tracer.startSpan(`agent.step`,{attributes:{"agent.session.id":t.scope.sessionId,"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.root.session.id":t.scope.rootSessionId??t.scope.sessionId,"agent.step.attempt":t.scope.attemptIndex,"agent.step.index":t.scope.stepIndex,"agent.turn.id":t.scope.turnId,"agent.name":t.scope.functionId}},a);o.addEvent(`step.started`);let s=trace.setSpan(a,o),c=t.operation.operationId,l=e.tracer.startSpan(c,{attributes:{"gen_ai.operation.name":c,"gen_ai.provider.name":t.operation.provider,"gen_ai.request.model":t.operation.modelId}},s);n.set(t.scope,{operation:{context:trace.setSpan(s,l),name:c,span:l},step:{context:s,span:o}})},onAttemptTerminal=e=>{t.delete(e.scope);let r=n.get(e.scope);r!==void 0&&(r.step.span.addEvent(e.type===`attempt.completed`?`step.completed`:`step.failed`),e.type===`attempt.failed`&&(recordError(r.operation.span,e.error),recordError(r.step.span,e.error)),r.operation.span.end(),r.step.span.end(),n.delete(e.scope))},onTurnTerminal=async t=>{let n=await e.stateStore.getTurn(t.sessionId,t.turnId);n!==void 0&&await e.stateStore.setTurn(t.sessionId,t.turnId,{...n,terminal:{error:t.error,type:t.type}})},onSessionTransition=async t=>{if(t.turnId!==void 0){let n=await e.stateStore.getTurn(t.sessionId,t.turnId);if(n!==void 0){let r=e.tracer.startSpan(`agent.turn.terminal`,{attributes:{"agent.root.session.id":n.rootSessionId,"agent.session.id":t.sessionId,"agent.turn.id":t.turnId,"agent.turn.sequence":n.sequence}},contextFromSpanContext(n.context));n.terminal!==void 0&&(r.addEvent(n.terminal.type),n.terminal.type===`turn.failed`&&recordError(r,n.terminal.error)),r.addEvent(t.type),r.end(),await e.stateStore.deleteTurn(t.sessionId,t.turnId)}}(t.type===`session.completed`||t.type===`session.failed`)&&await e.stateStore.deleteSession(t.sessionId)},beforeModelCall=t=>{let r=n.get(t.scope);if(r===void 0)return;r.step.span.setAttribute(`agent.model.id`,t.source.modelId),r.step.span.setAttribute(`agent.model.provider`,t.source.provider);let a=e.tracer.startSpan(modelSpanName(r.operation.name),{attributes:{"gen_ai.operation.name":r.operation.name,"gen_ai.provider.name":t.source.provider,"gen_ai.request.model":t.source.modelId}},r.operation.context),o={context:trace.setSpan(r.operation.context,a),span:a};return getExecutionContexts(t.scope).models.set(t.id,o.context),o},afterModelCall=(e,r)=>{if(t.get(e.scope)?.models.delete(e.id),isSpanState(r)){if(e.type===`model.call.failed`)recordError(r.span,e.error);else{setUsage(r.span,e.source.usage);let t=n.get(e.scope);t!==void 0&&setUsage(t.step.span,e.source.usage)}r.span.end()}},beforeToolCall=t=>{let r=n.get(t.scope);if(r===void 0)return;let a=e.tracer.startSpan(`agent.action`,{attributes:{"agent.action.call_id":t.source.toolCall.toolCallId,"agent.action.kind":`tool`,"agent.action.name":t.source.toolCall.toolName,"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.root.session.id":t.scope.rootSessionId??t.scope.sessionId,"agent.session.id":t.scope.sessionId,"agent.step.attempt":t.scope.attemptIndex,"agent.step.index":t.scope.stepIndex,"agent.turn.id":t.scope.turnId}},r.step.context),o=trace.setSpan(r.step.context,a),s=e.tracer.startSpan(`ai.toolCall`,{attributes:{"gen_ai.operation.name":`execute_tool`,"gen_ai.tool.call.id":t.source.toolCall.toolCallId,"gen_ai.tool.name":t.source.toolCall.toolName}},o),c={context:trace.setSpan(o,s),span:a,toolSpan:s};return getExecutionContexts(t.scope).tools.set(t.id,c.context),c},afterToolCall=(e,n)=>{t.get(e.scope)?.tools.delete(e.id),isToolSpanState(n)&&(e.type===`tool.call.failed`?(recordError(n.toolSpan,e.error),recordError(n.span,e.error)):e.source.toolOutput.type!==`tool-result`&&(recordError(n.toolSpan,e.source.toolOutput.error),recordError(n.span,e.source.toolOutput.error)),n.toolSpan.end(),n.span.end())},ensureSessionContext=async t=>{let n=await e.stateStore.getSession(t.sessionId);return n===void 0&&(n={agentName:t.agentName,channelKind:t.channelKind,context:sessionTraceContext(t.sessionId),pendingStarted:!0,rootSessionId:t.rootSessionId},await e.stateStore.setSession(t.sessionId,n)),n};return{hook:{events:{"attempt.completed":onAttemptTerminal,"attempt.failed":onAttemptTerminal,"attempt.started":onAttemptStarted,"model.call":{after:afterModelCall,before:beforeModelCall},"session.completed":onSessionTransition,"session.failed":onSessionTransition,"session.started":onSessionStarted,"session.waiting":onSessionTransition,"tool.call":{after:afterToolCall,before:beforeToolCall},"turn.cancelled":onTurnTerminal,"turn.completed":onTurnTerminal,"turn.failed":onTurnTerminal,"turn.started":onTurnStarted}},runInContext(e,n){let i=t.get(e.scope),a=e.type===`model.call`?i?.models.get(e.id):i?.tools.get(e.id);return a===void 0?n():context.with(a,n)}};function getExecutionContexts(e){let n=t.get(e);return n===void 0&&(n={models:new Map,tools:new Map},t.set(e,n)),n}}function turnKey(e,t){return`${e}:${t}`}function sessionTraceContext(e){return{spanId:digestId(`eve:session-parent:${e}`,16),traceFlags:1,traceId:digestId(`eve:session:${e}`,32)}}function digestId(t,n){return createHash(`sha256`).update(t).digest(`hex`).slice(0,n)}function contextFromSpanContext(e){return trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext(e))}function isSpanState(e){return typeof e==`object`&&!!e&&`context`in e&&`span`in e}function isToolSpanState(e){return isSpanState(e)&&`toolSpan`in e}function modelSpanName(e){return e===`ai.generateText`?`ai.generateText.doGenerate`:`ai.streamText.doStream`}function setUsage(e,t){t.inputTokens!==void 0&&e.setAttribute(`agent.usage.input_tokens`,t.inputTokens),t.outputTokens!==void 0&&e.setAttribute(`agent.usage.output_tokens`,t.outputTokens)}function recordError(e,t){t instanceof Error?(e.recordException(t),e.setStatus({code:SpanStatusCode.ERROR,message:t.message})):e.setStatus({code:SpanStatusCode.ERROR})}export{InMemoryAgentTraceStateStore,createAgentOtelInstrumentation};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AgentSessionTraceState, AgentTraceStateStore, AgentTurnTraceState } from "#harness/agent-otel-provider.js";
|
|
2
|
+
/** Keeps only framework trace state from an interrupted step's context changes. */
|
|
3
|
+
export declare function preserveSerializedAgentTraceState(original: Record<string, unknown>, interrupted: Record<string, unknown>): Record<string, unknown>;
|
|
4
|
+
/** Durable trace state backed by eve's serialized Workflow context. */
|
|
5
|
+
export declare class ContextAgentTraceStateStore implements AgentTraceStateStore {
|
|
6
|
+
deleteSession(sessionId: string): void;
|
|
7
|
+
deleteTurn(sessionId: string, turnId: string): void;
|
|
8
|
+
getSession(sessionId: string): AgentSessionTraceState | undefined;
|
|
9
|
+
getTurn(sessionId: string, turnId: string): AgentTurnTraceState | undefined;
|
|
10
|
+
setSession(sessionId: string, value: AgentSessionTraceState): void;
|
|
11
|
+
setTurn(sessionId: string, turnId: string, value: AgentTurnTraceState): void;
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{contextStorage,loadContext}from"#context/container.js";import{ContextKey}from"#context/key.js";const AgentTraceContextKey=new ContextKey(`eve.harness.agentTrace`,{codec:{deserialize:deserializeState,serialize:serializeState}});function preserveSerializedAgentTraceState(e,t){let n=t[AgentTraceContextKey.name];return n===void 0?e:{...e,[AgentTraceContextKey.name]:n}}var ContextAgentTraceStateStore=class{deleteSession(e){updateState(t=>{let n={...t.sessions};return delete n[e],{...t,sessions:n}})}deleteTurn(e,t){updateState(n=>{let r={...n.turns};return delete r[turnKey(e,t)],{...n,turns:r}})}getSession(t){return contextStorage.getStore()?.get(AgentTraceContextKey)?.sessions[t]}getTurn(t,n){return contextStorage.getStore()?.get(AgentTraceContextKey)?.turns[turnKey(t,n)]}setSession(e,t){updateState(n=>({...n,sessions:{...n.sessions,[e]:t}}))}setTurn(e,t,n){updateState(r=>({...r,turns:{...r.turns,[turnKey(e,t)]:n}}))}};function updateState(e){loadContext().set(AgentTraceContextKey,t=>e(t??{sessions:{},turns:{}}))}function turnKey(e,t){return`${e}\0${t}`}function serializeState(e){return{sessions:Object.fromEntries(Object.entries(e.sessions).map(([e,t])=>[e,{...t,context:serializeSpanContext(t.context)}])),turns:Object.fromEntries(Object.entries(e.turns).map(([e,t])=>[e,{...t,context:serializeSpanContext(t.context),terminal:t.terminal===void 0?void 0:{error:serializeError(t.terminal.error),type:t.terminal.type}}]))}}function deserializeState(e){return isRecord(e)?{sessions:deserializeRecord(e.sessions,e=>{if(!(!isRecord(e)||!isSpanContext(e.context)))return{agentName:typeof e.agentName==`string`?e.agentName:void 0,channelKind:typeof e.channelKind==`string`?e.channelKind:void 0,context:e.context,pendingStarted:e.pendingStarted===!0,rootSessionId:typeof e.rootSessionId==`string`?e.rootSessionId:``}}),turns:deserializeRecord(e.turns,e=>{if(!(!isRecord(e)||!isSpanContext(e.context)))return{context:e.context,rootSessionId:typeof e.rootSessionId==`string`?e.rootSessionId:``,sequence:typeof e.sequence==`number`?e.sequence:0,terminal:deserializeTerminal(e.terminal)}})}:{sessions:{},turns:{}}}function deserializeRecord(e,t){if(!isRecord(e))return{};let n={};for(let[r,i]of Object.entries(e)){let e=t(i);e!==void 0&&(n[r]=e)}return n}function deserializeTerminal(e){if(!isRecord(e)||typeof e.type!=`string`)return;let t=e.type;if(isTurnTerminalType(t))return{error:deserializeError(e.error),type:t}}function serializeSpanContext(e){return{isRemote:e.isRemote,spanId:e.spanId,traceFlags:e.traceFlags,traceId:e.traceId}}function isSpanContext(e){return isRecord(e)&&typeof e.spanId==`string`&&typeof e.traceFlags==`number`&&typeof e.traceId==`string`}function serializeError(e){return e instanceof Error?{message:e.message,name:e.name,stack:e.stack}:void 0}function deserializeError(e){if(!isRecord(e)||typeof e.message!=`string`)return;let t=Error(e.message);return typeof e.name==`string`&&(t.name=e.name),typeof e.stack==`string`&&(t.stack=e.stack),t}function isTurnTerminalType(e){return e===`turn.cancelled`||e===`turn.completed`||e===`turn.failed`}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}export{ContextAgentTraceStateStore,preserveSerializedAgentTraceState};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SpanProcessor } from "#compiled/@vercel/otel/index.js";
|
|
2
|
+
/** Routes spans from agent-owned traces to provider-neutral child processors. */
|
|
3
|
+
export declare class AgentTraceSpanProcessor implements SpanProcessor {
|
|
4
|
+
#private;
|
|
5
|
+
constructor(children: readonly SpanProcessor[]);
|
|
6
|
+
forceFlush(): Promise<void>;
|
|
7
|
+
isAttached(): boolean;
|
|
8
|
+
onStart(span: unknown, parentContext: unknown): void;
|
|
9
|
+
onEnd(span: unknown): void;
|
|
10
|
+
releaseSession(sessionId: string): void;
|
|
11
|
+
shutdown(): Promise<void>;
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var AgentTraceSpanProcessor=class{#e;#t=new Set;#n=new Map;#r=!1;constructor(e){this.#e=e}async forceFlush(){await Promise.all(this.#e.map(e=>e.forceFlush()))}isAttached(){return this.#r}onStart(e,t){if(this.#r=!0,!isSpanLike(e))return;let n=e.attributes[`agent.session.id`];if(typeof n==`string`){let t=e.spanContext().traceId;this.#t.add(t),this.#n.set(n,t)}if(this.#i(e))for(let n of this.#e)n.onStart(e,t)}onEnd(e){if(!(!isSpanLike(e)||!this.#i(e)))for(let t of this.#e)t.onEnd(e)}releaseSession(e){let t=this.#n.get(e);t!==void 0&&(this.#t.delete(t),this.#n.delete(e))}async shutdown(){await Promise.all(this.#e.map(e=>e.shutdown()))}#i(e){return e.instrumentationScope?.name!==`workflow`&&this.#t.has(e.spanContext().traceId)}};function isSpanLike(e){return typeof e==`object`&&!!e&&`attributes`in e&&`spanContext`in e&&typeof e.spanContext==`function`}export{AgentTraceSpanProcessor};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Telemetry } from "ai";
|
|
2
|
+
import type { InstrumentationAttemptScope, InstrumentationContextRunner, InstrumentationHooks } from "#harness/instrumentation-lifecycle.js";
|
|
3
|
+
/** Creates one provider-neutral AI SDK bridge for one actual model attempt. */
|
|
4
|
+
export declare function createAiSdkHookBridge(scope: InstrumentationAttemptScope, hooks: InstrumentationHooks, runInContext?: InstrumentationContextRunner): Telemetry;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function createAiSdkHookBridge(e,t,n=directRunInContext){let r={modelIds:new Map,scope:e,toolIds:new Map};return{onStart(e){r.operationStart=snapshot(e)},async onStepStart(e){r.stepStart=snapshot(e);let n=toAttemptStarted(r);n!==void 0&&await t.publish(n)},async onLanguageModelCallStart(e){let n=createModelCallIdentity(r,e.callId);r.modelIds.set(e.callId,n);let i=toModelCallStarted(r,n,e);await t.before(`model.call`,i)},executeLanguageModelCall({callId:t,execute:i}){let a=r.modelIds.get(t);return a===void 0?i():n({id:a,scope:e,type:`model.call`},i)},async onLanguageModelCallEnd(e){let n=r.modelIds.get(e.callId);if(n===void 0)return;r.modelIds.delete(e.callId);let i=toModelCallCompleted(r,n,e);await t.after(`model.call`,i)},async onToolExecutionStart(e){let n=createToolCallIdentity(r,e.toolCall.toolCallId);r.toolIds.set(e.toolCall.toolCallId,n);let i=toToolCallStarted(r,n,e);await t.before(`tool.call`,i)},executeTool({toolCallId:t,execute:i}){let a=r.toolIds.get(t);return a===void 0?i():n({id:a,scope:e,type:`tool.call`},i)},async onToolExecutionEnd(e){let n=e.toolCall.toolCallId,i=r.toolIds.get(n);if(i===void 0)return;r.toolIds.delete(n);let a=toToolCallCompleted(r,i,e);await t.after(`tool.call`,a)},async onAbort(e){await failOpenOperations(e)},async onError(e){await failOpenOperations(e)}};async function failOpenOperations(n){let i=[];for(let a of r.modelIds.values())i.push(t.after(`model.call`,{error:n,id:a,scope:e,type:`model.call.failed`}));for(let a of r.toolIds.values())i.push(t.after(`tool.call`,{error:n,id:a,scope:e,type:`tool.call.failed`}));r.modelIds.clear(),r.toolIds.clear(),await Promise.all(i)}}const directRunInContext=(e,t)=>t();function snapshot(e){return Object.freeze({...e})}function toAttemptStarted(e){if(!(e.operationStart===void 0||e.stepStart===void 0))return{operation:e.operationStart,scope:e.scope,step:e.stepStart,type:`attempt.started`}}function createModelCallIdentity(e,t){return`${e.scope.attemptId}:model:${t}:${e.stepStart?.stepNumber??0}`}function toModelCallStarted(e,t,n){return{id:t,scope:e.scope,source:snapshot(n),type:`model.call.started`}}function toModelCallCompleted(e,t,n){return{id:t,scope:e.scope,source:snapshot(n),type:`model.call.completed`}}function createToolCallIdentity(e,t){return`${e.scope.attemptId}:tool:${t}:${e.stepStart?.stepNumber??0}`}function toToolCallStarted(e,t,n){return{id:t,scope:e.scope,source:snapshot(n),type:`tool.call.started`}}function toToolCallCompleted(e,t,n){return{id:t,scope:e.scope,source:snapshot(n),type:`tool.call.completed`}}export{createAiSdkHookBridge};
|
|
@@ -32,3 +32,10 @@ export declare function createCompactionPrompt(input: {
|
|
|
32
32
|
readonly transcriptBudgetTokens?: number;
|
|
33
33
|
}): CompactionPrompt;
|
|
34
34
|
export declare const TRANSCRIPT_PAYLOAD_LIMIT = 2000;
|
|
35
|
+
/**
|
|
36
|
+
* Replaces the file parts of a `content` tool output with their text stubs,
|
|
37
|
+
* leaving every other output shape untouched. History capping uses this so a
|
|
38
|
+
* capped content output can never carry — or truncate into — a raw payload;
|
|
39
|
+
* the stub matches the one the summarizer transcript renders.
|
|
40
|
+
*/
|
|
41
|
+
export declare function stubContentOutputFileParts(output: unknown): unknown;
|
|
@@ -23,4 +23,4 @@ Make completed work explicit so the next model does not repeat it. Keep complete
|
|
|
23
23
|
Large tool outputs are the main thing to compress: reduce each to the findings the next model needs — what was searched or read, what it established, and the exact identifiers involved — rather than reproducing the output. The next model cannot see the originals, so nothing it would need to act on may be lost.`}function formatCompactionTranscript(e){let t=e.filter(e=>e.content.trim().length>0).map(e=>`### ${e.role}\n${e.content.trim()}`);return t.length===0?`(empty)`:t.join(`
|
|
24
24
|
|
|
25
25
|
`)}function renderCompactionMessageContent(e,t){return typeof e.content==`string`?renderConversationText(e.content,t):e.content.map(e=>renderCompactionContentPart(e,t)).filter(e=>e.length>0).join(`
|
|
26
|
-
`).trim()}function renderCompactionContentPart(e,t){switch(e.type){case`text`:return renderConversationText(e.text,t);case`reasoning`:return``;case`file`:return e.filename
|
|
26
|
+
`).trim()}function renderCompactionContentPart(e,t){switch(e.type){case`text`:return renderConversationText(e.text,t);case`reasoning`:return``;case`file`:return renderAttachedFileStub(e.filename,e.mediaType);case`tool-call`:return renderTranscriptToolCall(e,t);case`tool-result`:return renderTranscriptToolResult(e,t);default:return``}}const TRANSCRIPT_PAYLOAD_LIMIT=2e3;function renderTranscriptToolCall(e,t){return renderToolCall(e,t===void 0?TRANSCRIPT_PAYLOAD_LIMIT:280)}function renderTranscriptToolResult(e,t){let n=t===void 0?TRANSCRIPT_PAYLOAD_LIMIT:280,r=e.isError?`errored`:`returned`,i=renderToolResultOutput(e.output,n);return i?`Tool ${e.toolName} ${r} ${i}`:`Tool ${e.toolName} ${r}`}function renderToolResultOutput(e,t){let n=contentToolOutputParts(e);return n===void 0?renderPayload(e,t):capText(n.map(e=>renderContentToolOutputPart(e,t)).filter(e=>e.length>0).join(` `),t)}function contentToolOutputParts(e){if(typeof e!=`object`||!e)return;let t=e;return t.type===`content`&&Array.isArray(t.value)?t.value:void 0}function stubContentOutputFileParts(e){let t=contentToolOutputParts(e);if(t===void 0)return e;let n=!1,r=t.map(e=>{if(typeof e!=`object`||!e)return e;let t=e;return t.type!==`file`&&t.type!==`media`?e:(n=!0,{text:renderAttachedFileStub(typeof t.filename==`string`?t.filename:void 0,typeof t.mediaType==`string`?t.mediaType:`unknown`),type:`text`})});return n?{type:`content`,value:r}:e}function renderContentToolOutputPart(e,t){if(typeof e!=`object`||!e)return renderPayload(e,t);let n=e;return n.type===`text`&&typeof n.text==`string`?n.text:n.type===`file`||n.type===`media`?renderAttachedFileStub(typeof n.filename==`string`?n.filename:void 0,typeof n.mediaType==`string`?n.mediaType:`unknown`):renderPayload(e,t)}function renderToolCall(e,t){let n=renderPayload(e.input,t);return n?`Called ${e.toolName} with ${n}`:`Called ${e.toolName}`}function renderPayload(e,t){return e===void 0?``:capText(JSON.stringify(e)??``,t)}function renderAttachedFileStub(e,t){return`Attached file ${e??`attachment`} (${t})`}function renderConversationText(e,t){return t===void 0?e.trim():capText(e,t)}function capText(e,t){let n=e.replace(/\s+/g,` `).trim();return n.length<=t?n:`${n.slice(0,t).trimEnd()}…`}export{COMPACTION_CHECKPOINT_MARKER,COMPACTION_PROMPT_ENVELOPE,COMPACTION_RESUMPTION_MESSAGE,TODO_COMPACTION_PRESERVATION_LABEL,TRANSCRIPT_PAYLOAD_LIMIT,createCompactionPrompt,stubContentOutputFileParts};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{generateText}from"ai";import{estimateTokens}from"#harness/token-estimate.js";import{COMPACTION_CHECKPOINT_MARKER,COMPACTION_PROMPT_ENVELOPE,COMPACTION_RESUMPTION_MESSAGE,TODO_COMPACTION_PRESERVATION_LABEL,TRANSCRIPT_PAYLOAD_LIMIT,createCompactionPrompt}from"#harness/compaction-prompt.js";const COMPACTION_PROMPT_OVERHEAD_TOKENS=estimateTokens([{content:COMPACTION_PROMPT_ENVELOPE.system,role:`system`},{content:COMPACTION_PROMPT_ENVELOPE.prompt,role:`user`}]);function getInputTokenCount(e,n){let r=n.lastKnownInputTokens,i=n.lastKnownPromptMessageCount;return r===void 0||i===void 0||!Number.isInteger(i)||i<0||i>e.length?estimateTokens(e):r+estimateTokens(e.slice(i))}function shouldCompact(e,t){return e.length>0&&getInputTokenCount(e,t)+COMPACTION_PROMPT_OVERHEAD_TOKENS>t.threshold}async function resolveCompactionModel(e){let t=e.compactionModelReference??e.modelReference;return{model:t===e.modelReference?e.model:await e.resolveModel(t),providerOptions:t.providerOptions}}const COMPACTION_HEURISTICS=[toolResultCapHeuristic];function toolResultCapHeuristic(e){let t=withResumptionGuard([...e.previousCheckpoint===void 0?[]:[{content:COMPACTION_CHECKPOINT_MARKER,role:`user`},{content:e.previousCheckpoint,role:`assistant`}],...capToolResults(e.older),...e.recent],e.conversation);return evaluateThreshold(t,e.config,`should-compact`).type===`within-limit`?{messages:t,type:`within-limit`}:{type:`insufficient`}}function evaluateThreshold(e,n,r){let i=r===`should-compact`?COMPACTION_PROMPT_OVERHEAD_TOKENS:0,a=estimateTokens(e)+i;return{estimatedTokens:a,type:a<=n.threshold?`within-limit`:`over-limit`}}async function compactMessages(t,r,i,a,o,c,
|
|
1
|
+
import{generateText}from"ai";import{estimateTokens}from"#harness/token-estimate.js";import{COMPACTION_CHECKPOINT_MARKER,COMPACTION_PROMPT_ENVELOPE,COMPACTION_RESUMPTION_MESSAGE,TODO_COMPACTION_PRESERVATION_LABEL,TRANSCRIPT_PAYLOAD_LIMIT,createCompactionPrompt,stubContentOutputFileParts}from"#harness/compaction-prompt.js";const COMPACTION_PROMPT_OVERHEAD_TOKENS=estimateTokens([{content:COMPACTION_PROMPT_ENVELOPE.system,role:`system`},{content:COMPACTION_PROMPT_ENVELOPE.prompt,role:`user`}]);function getInputTokenCount(e,n){let r=n.lastKnownInputTokens,i=n.lastKnownPromptMessageCount;return r===void 0||i===void 0||!Number.isInteger(i)||i<0||i>e.length?estimateTokens(e):r+estimateTokens(e.slice(i))}function shouldCompact(e,t){return e.length>0&&getInputTokenCount(e,t)+COMPACTION_PROMPT_OVERHEAD_TOKENS>t.threshold}async function resolveCompactionModel(e){let t=e.compactionModelReference??e.modelReference;return{model:t===e.modelReference?e.model:await e.resolveModel(t),providerOptions:t.providerOptions}}const COMPACTION_HEURISTICS=[toolResultCapHeuristic];function toolResultCapHeuristic(e){let t=withResumptionGuard([...e.previousCheckpoint===void 0?[]:[{content:COMPACTION_CHECKPOINT_MARKER,role:`user`},{content:e.previousCheckpoint,role:`assistant`}],...capToolResults(e.older),...e.recent],e.conversation);return evaluateThreshold(t,e.config,`should-compact`).type===`within-limit`?{messages:t,type:`within-limit`}:{type:`insufficient`}}function evaluateThreshold(e,n,r){let i=r===`should-compact`?COMPACTION_PROMPT_OVERHEAD_TOKENS:0,a=estimateTokens(e)+i;return{estimatedTokens:a,type:a<=n.threshold?`within-limit`:`over-limit`}}async function compactMessages(t,r,i,a,o,c,l){let{conversation:d,previousCheckpoint:f}=extractPreviousCheckpoint(t),p=selectRecentWindowSize(d,i);{let{older:e,recent:t}=splitMessagesForCompaction(d,p);if(e.length===0&&f===void 0)return keepNonToolResultMessages(t);for(let n of COMPACTION_HEURISTICS){let r=n({config:i,conversation:d,older:e,previousCheckpoint:f,recent:t});if(r.type===`within-limit`)return r.messages}}for(;;){let{older:t,recent:u}=splitMessagesForCompaction(d,p),m=createCompactionPrompt({messages:t,previousCheckpoint:f,transcriptBudgetTokens:i.threshold}),h=await generateText({abortSignal:l,headers:c,model:r,prompt:m.prompt,providerOptions:a,system:m.system,telemetry:o?{...o,functionId:`eve.compaction`}:void 0,temperature:0}),g=[{content:COMPACTION_CHECKPOINT_MARKER,role:`user`},{content:h.text,role:`assistant`}],_=withResumptionGuard([...g,...u],d);if(evaluateThreshold(_,i,`estimate`).type===`within-limit`)return _;let v=withResumptionGuard([...g,...keepNonToolResultMessages(u)],d);if(evaluateThreshold(v,i,`estimate`).type===`within-limit`||p===0)return v;--p}}function capToolResults(e){return e.map(e=>{if(e.role!==`tool`||typeof e.content==`string`)return e;let t=!1,n=e.content.map(e=>{if(e.type!==`tool-result`)return e;let n=stubContentOutputFileParts(e.output),r=JSON.stringify(n)??``;return r.length<=TRANSCRIPT_PAYLOAD_LIMIT?n===e.output?e:(t=!0,{...e,output:n}):(t=!0,{...e,output:{type:`text`,value:`[Truncated by eve: tool result reduced during context compaction. Re-run the tool if you need the full output.]\n\n${r.slice(0,TRANSCRIPT_PAYLOAD_LIMIT)}`}})});return t?{...e,content:n}:e})}function withResumptionGuard(e,t){let n=e.at(-1)?.role;if(n!==void 0&&n!==`assistant`)return e;let r=findLastRealUserMessage(t),a=r!==void 0&&e.some(e=>e.role===`user`&&e.content===r.content);return[...e,r!==void 0&&!a?r:{content:COMPACTION_RESUMPTION_MESSAGE,role:`user`}]}function findLastRealUserMessage(e){for(let t=e.length-1;t>=0;--t){let r=e[t];if(!(r?.role!==`user`||typeof r.content!=`string`)&&!(r.content===COMPACTION_RESUMPTION_MESSAGE||r.content===COMPACTION_CHECKPOINT_MARKER||r.content.startsWith(TODO_COMPACTION_PRESERVATION_LABEL)))return r}}function extractPreviousCheckpoint(e){let t=e[0],r=e[1];return t?.role!==`user`||t.content!==COMPACTION_CHECKPOINT_MARKER||r?.role!==`assistant`?{conversation:[...e],previousCheckpoint:void 0}:{conversation:e.slice(2),previousCheckpoint:assistantMessageText(r)}}function keepNonToolResultMessages(e){let t=[];for(let n of e)if(n.role!==`tool`){if(n.role===`assistant`){let e=assistantMessageText(n);e.length>0&&t.push({content:e,role:`assistant`});continue}t.push(n)}return t}function assistantMessageText(e){return typeof e.content==`string`?e.content.trim():e.content.filter(e=>e.type===`text`).map(e=>e.text).join(``).trim()}function selectRecentWindowSize(e,n){let r=Math.min(n.recentWindowSize,Math.max(e.length-1,0)),i=resolveCompactionSummaryReserve(n),a=0,o=0;for(let s=e.length-1;s>=0&&a<r;--s){let r=e[s];if(r===void 0)continue;let c=estimateTokens([r]);if(o+c+i>n.threshold)break;o+=c,a+=1}return a}function resolveCompactionSummaryReserve(e){return Math.min(2048,Math.max(64,Math.floor(e.threshold/4)))}function splitMessagesForCompaction(e,t){if(t<=0)return{older:[...e],recent:[]};let n=e.length-t;for(;n<e.length&&e[n]?.role===`tool`;)n+=1;return{older:e.slice(0,n),recent:e.slice(n)}}export{compactMessages,getInputTokenCount,resolveCompactionModel,shouldCompact};
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import type { Telemetry } from "ai";
|
|
2
|
+
type TelemetryEvent<TKey extends keyof Telemetry> = Parameters<NonNullable<Telemetry[TKey]>>[0];
|
|
3
|
+
/** Stable eve identity for one actual model attempt. */
|
|
4
|
+
export interface InstrumentationAttemptScope {
|
|
5
|
+
readonly attemptId: string;
|
|
6
|
+
readonly attemptIndex: number;
|
|
7
|
+
readonly functionId?: string;
|
|
8
|
+
readonly rootSessionId?: string;
|
|
9
|
+
readonly sessionId: string;
|
|
10
|
+
readonly stepIndex: number;
|
|
11
|
+
readonly turnId: string;
|
|
12
|
+
}
|
|
13
|
+
export interface InstrumentationAttemptStartedEvent {
|
|
14
|
+
readonly type: "attempt.started";
|
|
15
|
+
readonly scope: InstrumentationAttemptScope;
|
|
16
|
+
readonly operation: TelemetryEvent<"onStart">;
|
|
17
|
+
readonly step: TelemetryEvent<"onStepStart">;
|
|
18
|
+
}
|
|
19
|
+
export interface InstrumentationSessionStartedEvent {
|
|
20
|
+
readonly type: "session.started";
|
|
21
|
+
readonly agentName?: string;
|
|
22
|
+
readonly channelKind?: string;
|
|
23
|
+
readonly rootSessionId: string;
|
|
24
|
+
readonly sessionId: string;
|
|
25
|
+
}
|
|
26
|
+
export interface InstrumentationSessionTransitionEvent {
|
|
27
|
+
readonly type: "session.completed" | "session.failed" | "session.waiting";
|
|
28
|
+
readonly error?: unknown;
|
|
29
|
+
readonly sessionId: string;
|
|
30
|
+
readonly turnId?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface InstrumentationTurnStartedEvent {
|
|
33
|
+
readonly type: "turn.started";
|
|
34
|
+
readonly rootSessionId: string;
|
|
35
|
+
readonly sequence: number;
|
|
36
|
+
readonly sessionId: string;
|
|
37
|
+
readonly turnId: string;
|
|
38
|
+
}
|
|
39
|
+
export interface InstrumentationTurnTerminalEvent {
|
|
40
|
+
readonly type: "turn.cancelled" | "turn.completed" | "turn.failed";
|
|
41
|
+
readonly error?: unknown;
|
|
42
|
+
readonly sessionId: string;
|
|
43
|
+
readonly turnId: string;
|
|
44
|
+
}
|
|
45
|
+
export interface InstrumentationAttemptTerminalEvent {
|
|
46
|
+
readonly type: "attempt.completed" | "attempt.failed";
|
|
47
|
+
readonly error?: unknown;
|
|
48
|
+
readonly scope: InstrumentationAttemptScope;
|
|
49
|
+
}
|
|
50
|
+
export interface InstrumentationModelCallStartedEvent {
|
|
51
|
+
readonly type: "model.call.started";
|
|
52
|
+
readonly id: string;
|
|
53
|
+
readonly scope: InstrumentationAttemptScope;
|
|
54
|
+
readonly source: TelemetryEvent<"onLanguageModelCallStart">;
|
|
55
|
+
}
|
|
56
|
+
export interface InstrumentationModelCallCompletedEvent {
|
|
57
|
+
readonly type: "model.call.completed";
|
|
58
|
+
readonly id: string;
|
|
59
|
+
readonly scope: InstrumentationAttemptScope;
|
|
60
|
+
readonly source: TelemetryEvent<"onLanguageModelCallEnd">;
|
|
61
|
+
}
|
|
62
|
+
export interface InstrumentationModelCallFailedEvent {
|
|
63
|
+
readonly type: "model.call.failed";
|
|
64
|
+
readonly error: unknown;
|
|
65
|
+
readonly id: string;
|
|
66
|
+
readonly scope: InstrumentationAttemptScope;
|
|
67
|
+
}
|
|
68
|
+
export type InstrumentationModelCallTerminalEvent = InstrumentationModelCallCompletedEvent | InstrumentationModelCallFailedEvent;
|
|
69
|
+
export interface InstrumentationToolCallStartedEvent {
|
|
70
|
+
readonly type: "tool.call.started";
|
|
71
|
+
readonly id: string;
|
|
72
|
+
readonly scope: InstrumentationAttemptScope;
|
|
73
|
+
readonly source: TelemetryEvent<"onToolExecutionStart">;
|
|
74
|
+
}
|
|
75
|
+
export interface InstrumentationToolCallCompletedEvent {
|
|
76
|
+
readonly type: "tool.call.completed";
|
|
77
|
+
readonly id: string;
|
|
78
|
+
readonly scope: InstrumentationAttemptScope;
|
|
79
|
+
readonly source: TelemetryEvent<"onToolExecutionEnd">;
|
|
80
|
+
}
|
|
81
|
+
export interface InstrumentationToolCallFailedEvent {
|
|
82
|
+
readonly type: "tool.call.failed";
|
|
83
|
+
readonly error: unknown;
|
|
84
|
+
readonly id: string;
|
|
85
|
+
readonly scope: InstrumentationAttemptScope;
|
|
86
|
+
}
|
|
87
|
+
export type InstrumentationToolCallTerminalEvent = InstrumentationToolCallCompletedEvent | InstrumentationToolCallFailedEvent;
|
|
88
|
+
export interface RelatedLifecycleHook<TStart, TTerminal> {
|
|
89
|
+
readonly before?: (event: TStart) => unknown | PromiseLike<unknown>;
|
|
90
|
+
readonly after?: (event: TTerminal, state: unknown) => void | PromiseLike<void>;
|
|
91
|
+
}
|
|
92
|
+
/** Internal provider shape mirrored by the future public hook contract. */
|
|
93
|
+
export interface InstrumentationProviderDefinition {
|
|
94
|
+
readonly events?: {
|
|
95
|
+
readonly "model.call"?: RelatedLifecycleHook<InstrumentationModelCallStartedEvent, InstrumentationModelCallTerminalEvent>;
|
|
96
|
+
readonly "attempt.started"?: (event: InstrumentationAttemptStartedEvent) => void | PromiseLike<void>;
|
|
97
|
+
readonly "attempt.completed"?: (event: InstrumentationAttemptTerminalEvent) => void | PromiseLike<void>;
|
|
98
|
+
readonly "attempt.failed"?: (event: InstrumentationAttemptTerminalEvent) => void | PromiseLike<void>;
|
|
99
|
+
readonly "session.completed"?: (event: InstrumentationSessionTransitionEvent) => void | PromiseLike<void>;
|
|
100
|
+
readonly "session.failed"?: (event: InstrumentationSessionTransitionEvent) => void | PromiseLike<void>;
|
|
101
|
+
readonly "session.started"?: (event: InstrumentationSessionStartedEvent) => void | PromiseLike<void>;
|
|
102
|
+
readonly "session.waiting"?: (event: InstrumentationSessionTransitionEvent) => void | PromiseLike<void>;
|
|
103
|
+
readonly "tool.call"?: RelatedLifecycleHook<InstrumentationToolCallStartedEvent, InstrumentationToolCallTerminalEvent>;
|
|
104
|
+
readonly "turn.cancelled"?: (event: InstrumentationTurnTerminalEvent) => void | PromiseLike<void>;
|
|
105
|
+
readonly "turn.completed"?: (event: InstrumentationTurnTerminalEvent) => void | PromiseLike<void>;
|
|
106
|
+
readonly "turn.failed"?: (event: InstrumentationTurnTerminalEvent) => void | PromiseLike<void>;
|
|
107
|
+
readonly "turn.started"?: (event: InstrumentationTurnStartedEvent) => void | PromiseLike<void>;
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
export interface InstrumentationRelatedEventMap {
|
|
111
|
+
readonly "model.call": {
|
|
112
|
+
readonly start: InstrumentationModelCallStartedEvent;
|
|
113
|
+
readonly terminal: InstrumentationModelCallTerminalEvent;
|
|
114
|
+
};
|
|
115
|
+
readonly "tool.call": {
|
|
116
|
+
readonly start: InstrumentationToolCallStartedEvent;
|
|
117
|
+
readonly terminal: InstrumentationToolCallTerminalEvent;
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
export type InstrumentationRelatedEventName = keyof InstrumentationRelatedEventMap;
|
|
121
|
+
export type InstrumentationPointEvent = InstrumentationAttemptStartedEvent | InstrumentationAttemptTerminalEvent | InstrumentationSessionStartedEvent | InstrumentationSessionTransitionEvent | InstrumentationTurnStartedEvent | InstrumentationTurnTerminalEvent;
|
|
122
|
+
/** Trusted framework operation for activating context around AI SDK execution. */
|
|
123
|
+
export type InstrumentationContextRunner = <T>(operation: InstrumentationExecutionOperation, execute: () => PromiseLike<T>) => PromiseLike<T>;
|
|
124
|
+
/** Stable identity supplied only to a trusted framework context runner. */
|
|
125
|
+
export type InstrumentationExecutionOperation = {
|
|
126
|
+
readonly id: string;
|
|
127
|
+
readonly scope: InstrumentationAttemptScope;
|
|
128
|
+
readonly type: "model.call";
|
|
129
|
+
} | {
|
|
130
|
+
readonly id: string;
|
|
131
|
+
readonly scope: InstrumentationAttemptScope;
|
|
132
|
+
readonly type: "tool.call";
|
|
133
|
+
};
|
|
134
|
+
/** Provider-neutral hook operations consumed by the AI SDK bridge. */
|
|
135
|
+
export interface InstrumentationHooks {
|
|
136
|
+
after<TKey extends InstrumentationRelatedEventName>(name: TKey, event: InstrumentationRelatedEventMap[TKey]["terminal"]): Promise<void>;
|
|
137
|
+
before<TKey extends InstrumentationRelatedEventName>(name: TKey, event: InstrumentationRelatedEventMap[TKey]["start"]): Promise<void>;
|
|
138
|
+
publish(event: InstrumentationPointEvent): Promise<void>;
|
|
139
|
+
}
|
|
140
|
+
/** Creates failure-isolated hooks backed by an ordered provider list. */
|
|
141
|
+
export declare function createInstrumentationHooks(providers: readonly InstrumentationProviderDefinition[]): InstrumentationHooks;
|
|
142
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createLogger,formatError}from"#internal/logging.js";const log=createLogger(`harness.instrumentation-lifecycle`);function createInstrumentationHooks(e){let r=new WeakMap,publish=async t=>{for(let n of e){let e=n.events?.[t.type];if(e!==void 0)try{await e(t)}catch(e){warn(t.type,e)}}},before=async(t,n)=>{let i=r.get(n.scope)??new Map;r.set(n.scope,i);for(let[r,a]of e.entries()){let e=a.events?.[t]?.before;if(e!==void 0)try{let t=await e(n);i.set(relatedStateKey(r,n.id),t)}catch(e){warn(`${t}.before`,e)}}},after=async(t,n)=>{let i=r.get(n.scope);for(let[r,a]of e.entries()){let e=a.events?.[t]?.after,o=relatedStateKey(r,n.id);if(e===void 0||!i?.has(o))continue;let s=i.get(o);i.delete(o);try{await e(n,s)}catch(e){warn(`${t}.after`,e)}}},warn=(e,r)=>{log.warn(`instrumentation provider failed`,{boundary:e,error:formatError(r)})};return{after,before,publish}}function relatedStateKey(e,t){return`${e}:${t}`}export{createInstrumentationHooks};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { InstrumentationHooks } from "#harness/instrumentation-lifecycle.js";
|
|
2
|
+
import type { HandleEventFn } from "#harness/types.js";
|
|
3
|
+
export interface CreateInstrumentationHandleEventInput {
|
|
4
|
+
readonly agentName?: string;
|
|
5
|
+
readonly handleEvent?: HandleEventFn;
|
|
6
|
+
readonly hooks?: InstrumentationHooks;
|
|
7
|
+
readonly rootSessionId?: string;
|
|
8
|
+
readonly sessionId: string;
|
|
9
|
+
readonly turnId?: string;
|
|
10
|
+
}
|
|
11
|
+
/** Publishes eve-native lifecycle transitions after durable event acceptance. */
|
|
12
|
+
export declare function createInstrumentationHandleEvent(input: CreateInstrumentationHandleEventInput): HandleEventFn | undefined;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
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=e.turnId;return async(i,a)=>{await t(i,a);let o=toLifecycleEvent(i,e,r);i.type===`turn.started`&&(r=i.data.turnId),o!==void 0&&await n.publish(o)}}function toLifecycleEvent(e,t,n){switch(e.type){case`session.started`:return{agentName:t.agentName,rootSessionId:t.rootSessionId??t.sessionId,sessionId:t.sessionId,type:`session.started`};case`session.completed`:case`session.waiting`:return{sessionId:t.sessionId,turnId:n,type:e.type};case`session.failed`:return{error:Error(e.data.message),sessionId:t.sessionId,turnId:n,type:`session.failed`};case`turn.started`:return{rootSessionId:t.rootSessionId??t.sessionId,sequence:e.data.sequence,sessionId:t.sessionId,turnId:e.data.turnId,type:`turn.started`};case`turn.completed`:case`turn.cancelled`:return{sessionId:t.sessionId,turnId:e.data.turnId,type:e.type};case`turn.failed`:return{error:Error(e.data.message),sessionId:t.sessionId,turnId:e.data.turnId,type:`turn.failed`};default:return}}export{createInstrumentationHandleEvent};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { InstrumentationContextRunner, InstrumentationHooks } from "#harness/instrumentation-lifecycle.js";
|
|
2
|
+
/** Process-wide runtime consumed by every harness execution surface. */
|
|
3
|
+
export interface InstrumentationRuntime {
|
|
4
|
+
readonly forceFlush: () => Promise<void>;
|
|
5
|
+
readonly hooks: InstrumentationHooks;
|
|
6
|
+
readonly runInContext: InstrumentationContextRunner;
|
|
7
|
+
}
|
|
8
|
+
/** Instrumentation capabilities consumed inside one harness execution. */
|
|
9
|
+
export type HarnessInstrumentation = Pick<InstrumentationRuntime, "hooks" | "runInContext">;
|
|
10
|
+
/** Registers the process instrumentation runtime before agent execution begins. */
|
|
11
|
+
export declare function registerInstrumentationRuntime(runtime: InstrumentationRuntime): InstrumentationRuntime;
|
|
12
|
+
/** Returns the process instrumentation runtime, when one was installed. */
|
|
13
|
+
export declare function getInstrumentationRuntime(): InstrumentationRuntime | undefined;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const INSTRUMENTATION_RUNTIME_KEY=Symbol.for(`eve.instrumentation-runtime`),globalRuntime=globalThis;function registerInstrumentationRuntime(e){let t=globalRuntime[INSTRUMENTATION_RUNTIME_KEY];return t===void 0?(globalRuntime[INSTRUMENTATION_RUNTIME_KEY]=e,e):t}function getInstrumentationRuntime(){return globalRuntime[INSTRUMENTATION_RUNTIME_KEY]}export{getInstrumentationRuntime,registerInstrumentationRuntime};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type InstrumentationRuntime } from "#harness/instrumentation-runtime.js";
|
|
2
|
+
/** Installs the zero-config local OTel runtime once in an `eve dev` worker. */
|
|
3
|
+
export declare function installLocalInstrumentationRuntime(input: {
|
|
4
|
+
readonly appRoot: string;
|
|
5
|
+
readonly frameworkVersion: string;
|
|
6
|
+
readonly serviceName: string;
|
|
7
|
+
}): InstrumentationRuntime;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{getInstrumentationRuntime,registerInstrumentationRuntime}from"#harness/instrumentation-runtime.js";import{context,trace}from"#compiled/@opentelemetry/api/index.js";import{ContextAgentTraceStateStore}from"#harness/agent-trace-context-store.js";import{registerOTel}from"#compiled/@vercel/otel/index.js";import{createAgentOtelInstrumentation}from"#harness/agent-otel-provider.js";import{AgentTraceSpanProcessor}from"#harness/agent-trace-span-processor.js";import{createInstrumentationHooks}from"#harness/instrumentation-lifecycle.js";import{LocalTraceSpanProcessor}from"#harness/local-trace-span-processor.js";function installLocalInstrumentationRuntime(t){let n=getInstrumentationRuntime();if(n!==void 0)return n;let r=new AgentTraceSpanProcessor([new LocalTraceSpanProcessor(t.appRoot)]);registerOTel({autoDetectResources:!1,instrumentations:[],propagators:[`none`],serviceName:t.serviceName,spanProcessors:[r]});let i=trace.getTracer(`eve.registration`).startSpan(`eve.otel.registration`),a=trace.setSpan(context.active(),i),o=context.with(a,()=>trace.getActiveSpan()===i);if(i.end(),!r.isAttached()||!o)throw Error(`eve could not register OpenTelemetry because another runtime already exists.`);let s=createAgentOtelInstrumentation({frameworkVersion:t.frameworkVersion,stateStore:new ContextAgentTraceStateStore,tracer:trace.getTracer(`eve.agent`,t.frameworkVersion)}),c={events:{"session.completed":releaseSessionTrace,"session.failed":releaseSessionTrace}};return registerInstrumentationRuntime({forceFlush:()=>r.forceFlush(),hooks:createInstrumentationHooks([s.hook,c]),runInContext:s.runInContext});function releaseSessionTrace(e){r.releaseSession(e.sessionId)}}export{installLocalInstrumentationRuntime};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SpanProcessor } from "#compiled/@vercel/otel/index.js";
|
|
2
|
+
/** Persists spans from agent-owned traces as immutable OTLP/JSON segments. */
|
|
3
|
+
export declare class LocalTraceSpanProcessor implements SpanProcessor {
|
|
4
|
+
#private;
|
|
5
|
+
constructor(appRoot: string);
|
|
6
|
+
forceFlush(): Promise<void>;
|
|
7
|
+
onStart(): void;
|
|
8
|
+
onEnd(span: unknown): void;
|
|
9
|
+
shutdown(): Promise<void>;
|
|
10
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createLogger,formatError}from"#internal/logging.js";import{join}from"node:path";import{mkdir}from"node:fs/promises";import{JsonTraceSerializer}from"#compiled/@opentelemetry/otlp-transformer/index.js";import{atomicWriteFile}from"#shared/atomic-write-file.js";const log=createLogger(`harness.local-trace-span-processor`);var LocalTraceSpanProcessor=class{#e;#t=Promise.resolve();#n=!1;constructor(e){this.#e=e}forceFlush(){return this.#t}onStart(){}onEnd(e){if(!isReadableSpan(e))return;let{spanId:n,traceId:r}=e.spanContext();if(!isHexId(r,32)||!isHexId(n,16))return;let i=JsonTraceSerializer.serializeRequest([e]);i!==void 0&&(this.#t=this.#t.then(async()=>{let e=join(this.#e,`.eve`,`traces`,`v1`,r,`segments`);await mkdir(e,{recursive:!0}),await atomicWriteFile(join(e,`${n}.otlp.json`),i)}).catch(e=>{this.#n||(this.#n=!0,log.warn(`local trace persistence failed`,{error:formatError(e)}))}))}shutdown(){return this.forceFlush()}};function isReadableSpan(e){return typeof e==`object`&&!!e&&`attributes`in e&&`spanContext`in e&&typeof e.spanContext==`function`}function isHexId(e,t){return e.length===t&&/^[0-9a-f]+$/u.test(e)}export{LocalTraceSpanProcessor};
|