eve 0.20.0 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/dist/src/channel/types.d.ts +9 -5
- package/dist/src/chunks/{use-eve-agent-Dvy_Wjvq.js → use-eve-agent-CM24ZUEI.js} +48 -34
- package/dist/src/chunks/{use-eve-agent-Bh1NmXO9.js → use-eve-agent-CxcKypLZ.js} +48 -34
- package/dist/src/client/index.d.ts +1 -1
- package/dist/src/client/message-reducer-types.d.ts +11 -3
- package/dist/src/client/message-reducer.js +1 -1
- package/dist/src/compiler/manifest.js +1 -1
- package/dist/src/compiler/normalize-agent-config.js +1 -1
- package/dist/src/compiler/workspace-resources.js +1 -1
- package/dist/src/context/dynamic-skill-lifecycle.js +1 -1
- package/dist/src/context/keys.d.ts +0 -1
- package/dist/src/context/keys.js +1 -1
- package/dist/src/discover/sandbox.d.ts +0 -6
- package/dist/src/discover/sandbox.js +1 -1
- package/dist/src/execution/create-session-step.d.ts +2 -1
- package/dist/src/execution/create-session-step.js +1 -1
- package/dist/src/execution/delegated-parent-notification.d.ts +6 -0
- package/dist/src/execution/delegated-parent-notification.js +1 -1
- package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
- package/dist/src/execution/dispatch-workflow-runtime-actions-step.js +1 -1
- package/dist/src/execution/durable-session-store.d.ts +1 -0
- package/dist/src/execution/next-driver-action.d.ts +3 -0
- package/dist/src/execution/node-step.d.ts +6 -0
- package/dist/src/execution/node-step.js +1 -1
- package/dist/src/execution/run-session-limits.d.ts +21 -0
- package/dist/src/execution/run-session-limits.js +1 -0
- package/dist/src/execution/runtime-context.js +1 -1
- package/dist/src/execution/sandbox/bindings/local-backend-utils.d.ts +1 -1
- package/dist/src/execution/sandbox/bindings/local-backend-utils.js +1 -1
- package/dist/src/execution/sandbox/bindings/vercel.js +1 -1
- package/dist/src/execution/sandbox/prewarm.js +1 -1
- package/dist/src/execution/session-callback-step.d.ts +6 -0
- package/dist/src/execution/session-callback-step.js +1 -1
- package/dist/src/execution/session.d.ts +14 -3
- package/dist/src/execution/session.js +2 -4
- package/dist/src/execution/skills/instructions.d.ts +8 -4
- package/dist/src/execution/skills/instructions.js +2 -2
- package/dist/src/execution/subagent-tool.d.ts +7 -0
- package/dist/src/execution/subagent-tool.js +1 -1
- package/dist/src/execution/subagent-usage-span.d.ts +9 -0
- package/dist/src/execution/subagent-usage-span.js +1 -0
- package/dist/src/execution/turn-execution-cursor.d.ts +2 -0
- package/dist/src/execution/turn-workflow.js +1 -1
- package/dist/src/execution/workflow-entry.d.ts +1 -0
- package/dist/src/execution/workflow-entry.js +1 -1
- package/dist/src/execution/workflow-runtime.js +1 -1
- package/dist/src/execution/workflow-skill-root.d.ts +6 -0
- package/dist/src/execution/workflow-skill-root.js +1 -0
- package/dist/src/execution/workflow-steps.d.ts +3 -0
- package/dist/src/execution/workflow-steps.js +1 -1
- package/dist/src/harness/advertised-tools.d.ts +1 -0
- package/dist/src/harness/advertised-tools.js +1 -1
- package/dist/src/harness/input-requests.d.ts +8 -0
- package/dist/src/harness/input-requests.js +1 -1
- package/dist/src/harness/runtime-actions.js +1 -1
- package/dist/src/harness/session-limit-continuation.d.ts +55 -0
- package/dist/src/harness/session-limit-continuation.js +1 -0
- package/dist/src/harness/session-limit-enforcement.d.ts +55 -0
- package/dist/src/harness/session-limit-enforcement.js +1 -0
- package/dist/src/harness/subagent-depth.d.ts +1 -4
- package/dist/src/harness/subagent-depth.js +1 -1
- package/dist/src/harness/subagent-token-budget.d.ts +14 -0
- package/dist/src/harness/subagent-token-budget.js +1 -0
- package/dist/src/harness/tool-loop.js +1 -1
- package/dist/src/harness/turn-tag-state.d.ts +31 -0
- package/dist/src/harness/turn-tag-state.js +1 -1
- package/dist/src/harness/types.d.ts +21 -4
- package/dist/src/harness/workflow-sandbox.d.ts +1 -0
- package/dist/src/harness/workflow-sandbox.js +1 -1
- package/dist/src/harness/workflow-subagent-limit.d.ts +38 -0
- package/dist/src/harness/workflow-subagent-limit.js +1 -0
- package/dist/src/harness/workflow-tool-description.d.ts +6 -1
- package/dist/src/harness/workflow-tool-description.js +5 -3
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/internal/authored-definition/core.js +1 -1
- package/dist/src/internal/authored-definition/schema-backed.js +1 -1
- package/dist/src/protocol/message.d.ts +19 -2
- package/dist/src/protocol/message.js +2 -2
- package/dist/src/public/channels/chat-sdk/chatSdkChannel.d.ts +34 -3
- package/dist/src/public/channels/chat-sdk/chatSdkChannel.js +2 -2
- package/dist/src/public/channels/chat-sdk/index.d.ts +2 -0
- package/dist/src/public/channels/chat-sdk/index.js +1 -1
- package/dist/src/public/channels/chat-sdk/messageToUserContent.d.ts +13 -0
- package/dist/src/public/channels/chat-sdk/messageToUserContent.js +1 -0
- package/dist/src/public/channels/chat-sdk/notImplemented.d.ts +7 -0
- package/dist/src/public/channels/chat-sdk/notImplemented.js +1 -0
- package/dist/src/public/channels/slack/api.d.ts +14 -12
- package/dist/src/public/channels/slack/api.js +1 -1
- package/dist/src/public/definitions/tool.d.ts +37 -0
- package/dist/src/public/definitions/tool.js +1 -1
- package/dist/src/public/tools/index.d.ts +1 -1
- package/dist/src/public/tools/index.js +1 -1
- package/dist/src/runtime/actions/types.d.ts +9 -0
- package/dist/src/runtime/actions/types.js +1 -1
- package/dist/src/runtime/agent/bootstrap.d.ts +2 -0
- package/dist/src/runtime/agent/bootstrap.js +1 -1
- package/dist/src/runtime/resolve-agent.js +1 -1
- package/dist/src/runtime/sandbox/keys.js +1 -1
- package/dist/src/runtime/sandbox/template-plan.js +1 -1
- package/dist/src/runtime/session-callback-route.js +1 -1
- package/dist/src/runtime/skills/sandbox-access.d.ts +1 -1
- package/dist/src/runtime/skills/sandbox-access.js +1 -1
- package/dist/src/runtime/workspace/seed-files.js +1 -1
- package/dist/src/setup/scaffold/create/project.js +1 -1
- package/dist/src/setup/scaffold/create/web-template.d.ts +2 -2
- package/dist/src/setup/scaffold/create/web-template.js +77 -3
- package/dist/src/shared/agent-definition.d.ts +31 -3
- package/dist/src/shared/skill-package.d.ts +2 -2
- package/dist/src/shared/skill-package.js +1 -1
- package/dist/src/shared/skill-paths.d.ts +28 -0
- package/dist/src/shared/skill-paths.js +2 -0
- package/dist/src/shared/token-usage.d.ts +22 -0
- package/dist/src/shared/token-usage.js +1 -0
- package/dist/src/svelte/index.js +1 -1
- package/dist/src/svelte/use-eve-agent.js +1 -1
- package/dist/src/vue/index.js +1 -1
- package/dist/src/vue/use-eve-agent.js +1 -1
- package/docs/agent-config.md +32 -15
- package/docs/channels/chat-sdk.mdx +209 -0
- package/docs/channels/meta.json +1 -0
- package/docs/concepts/context-control.md +2 -2
- package/docs/concepts/default-harness.md +10 -0
- package/docs/concepts/sessions-runs-and-streaming.md +1 -1
- package/docs/guides/client/messages.mdx +4 -0
- package/docs/guides/client/streaming.mdx +17 -12
- package/docs/guides/dynamic-workflows.md +87 -0
- package/docs/guides/frontend/overview.mdx +5 -1
- package/docs/guides/meta.json +1 -0
- package/docs/guides/remote-agents.md +1 -0
- package/docs/reference/project-layout.md +5 -4
- package/docs/reference/typescript-api.md +26 -26
- package/docs/sandbox.mdx +1 -1
- package/docs/skills.mdx +3 -1
- package/docs/subagents.mdx +2 -1
- package/package.json +1 -1
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { RuntimeActionRequest } from "#runtime/actions/types.js";
|
|
2
|
+
import type { WorkflowSandboxInterrupt } from "#shared/workflow-sandbox.js";
|
|
3
|
+
/**
|
|
4
|
+
* Default for `limits.maxSubagents`: the maximum number of subagent (and
|
|
5
|
+
* remote-agent) calls one `Workflow` tool invocation may dispatch.
|
|
6
|
+
*/
|
|
7
|
+
export declare const DEFAULT_WORKFLOW_MAX_SUBAGENTS = 100;
|
|
8
|
+
/**
|
|
9
|
+
* Partition of one workflow interrupt's pending runtime actions against the
|
|
10
|
+
* invocation's subagent budget. `allowed` actions may dispatch; `blocked`
|
|
11
|
+
* actions must resolve with an error result instead of starting a child.
|
|
12
|
+
*/
|
|
13
|
+
export type WorkflowSubagentDispatchPlan = {
|
|
14
|
+
readonly allowed: readonly RuntimeActionRequest[];
|
|
15
|
+
readonly blocked: readonly RuntimeActionRequest[];
|
|
16
|
+
readonly maxSubagents: number;
|
|
17
|
+
readonly usedCalls: number;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Counts the subagent calls this Workflow invocation has already resolved.
|
|
21
|
+
*
|
|
22
|
+
* Every host tool bridged into the workflow sandbox is a subagent or
|
|
23
|
+
* remote-agent call, so each fulfilled or rejected `tool` ledger entry is one
|
|
24
|
+
* consumed call. Entries still `interrupted` are the pending actions being
|
|
25
|
+
* planned, not consumed budget.
|
|
26
|
+
*/
|
|
27
|
+
export declare function countResolvedWorkflowSubagentCalls(interrupt: WorkflowSandboxInterrupt): number;
|
|
28
|
+
/**
|
|
29
|
+
* Splits the pending actions of one workflow interrupt into the prefix that
|
|
30
|
+
* still fits the invocation's `maxSubagents` budget and the remainder that
|
|
31
|
+
* must be blocked. Actions keep ledger order so results pair with the
|
|
32
|
+
* sandbox program's call order.
|
|
33
|
+
*/
|
|
34
|
+
export declare function planWorkflowSubagentDispatch(input: {
|
|
35
|
+
readonly actions: readonly RuntimeActionRequest[];
|
|
36
|
+
readonly interrupt: WorkflowSandboxInterrupt;
|
|
37
|
+
readonly maxSubagents?: number;
|
|
38
|
+
}): WorkflowSubagentDispatchPlan;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const DEFAULT_WORKFLOW_MAX_SUBAGENTS=100;function countResolvedWorkflowSubagentCalls(e){let t=0;for(let n of e.continuation.ledger)n.kind===`tool`&&n.status!==`interrupted`&&(t+=1);return t}function planWorkflowSubagentDispatch(e){let t=e.maxSubagents??100,n=countResolvedWorkflowSubagentCalls(e.interrupt),r=Math.max(0,t-n);return{allowed:e.actions.slice(0,r),blocked:e.actions.slice(r),maxSubagents:t,usedCalls:n}}export{DEFAULT_WORKFLOW_MAX_SUBAGENTS,countResolvedWorkflowSubagentCalls,planWorkflowSubagentDispatch};
|
|
@@ -13,5 +13,10 @@
|
|
|
13
13
|
* framing.
|
|
14
14
|
*
|
|
15
15
|
* @param toolNames - Names of the agent functions callable inside the sandbox.
|
|
16
|
+
* @param options - `maxSubagents`: the invocation's subagent-call budget
|
|
17
|
+
* (defaults to {@link DEFAULT_WORKFLOW_MAX_SUBAGENTS}), surfaced so the
|
|
18
|
+
* model sizes its fan-out to fit.
|
|
16
19
|
*/
|
|
17
|
-
export declare function workflowToolDescription(toolNames: readonly string[]
|
|
20
|
+
export declare function workflowToolDescription(toolNames: readonly string[], options?: {
|
|
21
|
+
readonly maxSubagents?: number;
|
|
22
|
+
}): string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
function workflowToolDescription(
|
|
1
|
+
import{DEFAULT_WORKFLOW_MAX_SUBAGENTS}from"#harness/workflow-subagent-limit.js";function workflowToolDescription(t,n){let r=n?.maxSubagents??DEFAULT_WORKFLOW_MAX_SUBAGENTS,i=t.length>0?t:[`agent`],a=i.map(e=>`\`${e}\``).join(`, `),o=i.filter(e=>e!==`agent`),s=o.length>0?`\n\nDeclared subagents use the same API — e.g. \`const note = await ${agentAccess(o[0])}({ message: "..." });\`.`:``;return`Use \`Workflow\` when a task needs JavaScript to coordinate multiple child-agent calls as one durable step. It is an orchestration tool, not a general-purpose tool runner.
|
|
2
2
|
|
|
3
3
|
Use \`Workflow\` for:
|
|
4
4
|
- fan-out or map-reduce over a list, especially when the number of calls comes from runtime data;
|
|
@@ -14,7 +14,9 @@ Do not use \`Workflow\` when:
|
|
|
14
14
|
|
|
15
15
|
Workflow earns its overhead when code materially controls call count, concurrency, ordering, data flow, or aggregation. Put the complete orchestration in one JavaScript program and return the final JSON-serializable value.
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
One Workflow program may dispatch at most ${String(r)} agent calls in total (sequential and parallel calls alike); calls beyond that budget fail with \`WORKFLOW_SUBAGENT_LIMIT_REACHED\` instead of running. Size fan-outs to fit the budget.
|
|
18
|
+
|
|
19
|
+
The only callable operations are these agents — no filesystem, network, shell, or other tools: ${a}. Call them only through the \`tools\` object, using the exact member syntax in the API reference below. Each call is async and resolves to the child's result, or a typed object when you pass an \`outputSchema\`. Sequence with \`await\`, run agents concurrently with \`Promise.all([...])\`, and use \`map\`/\`filter\`/\`flatMap\` to build calls and combine results. The program's return value becomes the tool result.
|
|
18
20
|
|
|
19
21
|
Example — fan out across areas with \`agent\`, then pipe the results into a synthesis step:
|
|
20
22
|
\`\`\`js
|
|
@@ -32,4 +34,4 @@ const verdict = await tools.agent({
|
|
|
32
34
|
outputSchema: { type: "object", properties: { verdict: { type: "string" }, blocking: { type: "boolean" } } },
|
|
33
35
|
});
|
|
34
36
|
return verdict;
|
|
35
|
-
\`\`\`${
|
|
37
|
+
\`\`\`${s}`}function agentAccess(e){return/^[A-Za-z_$][A-Za-z0-9_$]*$/u.test(e)?`tools.${e}`:`tools[${JSON.stringify(e)}]`}export{workflowToolDescription};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createRequire}from"node:module";import{existsSync,readFileSync,realpathSync}from"node:fs";import{basename,dirname,join}from"node:path";import{EVE_PACKAGE_NAME}from"#internal/package-name.js";import{fileURLToPath}from"node:url";let cachedPackageInfo;const BUNDLED_FALLBACK_PACKAGE_VERSION=`0.
|
|
1
|
+
import{createRequire}from"node:module";import{existsSync,readFileSync,realpathSync}from"node:fs";import{basename,dirname,join}from"node:path";import{EVE_PACKAGE_NAME}from"#internal/package-name.js";import{fileURLToPath}from"node:url";let cachedPackageInfo;const BUNDLED_FALLBACK_PACKAGE_VERSION=`0.21.0`,WORKFLOW_MODULE_ALIASES={"workflow/errors":`src/compiled/@workflow/errors/index.js`,"workflow/internal/private":`src/compiled/@workflow/core/private.js`};function resolveFallbackPackageVersion(){return BUNDLED_FALLBACK_PACKAGE_VERSION.startsWith(`__`)?`0.0.0`:BUNDLED_FALLBACK_PACKAGE_VERSION}const FALLBACK_PACKAGE_INFO={name:EVE_PACKAGE_NAME,version:resolveFallbackPackageVersion()};function resolveCurrentModulePath(){return typeof __filename==`string`?__filename:resolveCurrentModulePathFromStack()}function resolveCurrentModulePathFromStack(){let e=Error.prepareStackTrace;try{Error.prepareStackTrace=(e,t)=>t;let e=Error().stack?.[0]?.getFileName();if(typeof e!=`string`||e.length===0)throw Error(`Failed to resolve the current module path from the stack trace.`);return e.startsWith(`file:`)?fileURLToPath(e):e}finally{Error.prepareStackTrace=e}}const require=createRequire(resolveCurrentModulePath());function isBuildOutputPackageRoot(e){return basename(e)===`dist`&&existsSync(join(dirname(e),`package.json`))}function resolvePackageBuildRoot(){let e=dirname(realpathSync(resolveCurrentModulePath()));for(;;){if(isBuildOutputPackageRoot(e))return e;let t=dirname(e);if(t===e)return null;e=t}}function findNearestPackageRoot(e){let n=e;for(;;){if(existsSync(join(n,`package.json`))&&!isBuildOutputPackageRoot(n))return n;let r=dirname(n);if(r===n)throw Error(`Failed to resolve package root from "${e}".`);n=r}}function resolvePackageRoot(){return findNearestPackageRoot(dirname(realpathSync(resolveCurrentModulePath())))}function tryResolvePackageRoot(){try{return resolvePackageRoot()}catch{return}}function rewriteSourceFilePathForBuild(e){return e.replace(/\.[cm]?tsx?$/,`.js`)}function resolvePackageSourceFilePath(e){let t=resolvePackageBuildRoot();return t===null?join(resolvePackageRoot(),e):join(t,rewriteSourceFilePathForBuild(e))}function resolvePackageSourceDirectoryPath(e){let t=resolvePackageBuildRoot();return join(t===null?resolvePackageRoot():t,e)}function resolvePackageDependencyPath(e){return require.resolve(e)}function resolvePackageCompiledFilePath(e){let t=resolvePackageBuildRoot();return t===null?join(resolvePackageRoot(),`.generated`,`compiled`,e.replace(/^src\/compiled\//,``)):join(t,e)}function normalizeInstalledPackageInfo(e){let t=e;if(!(typeof t.name!=`string`||typeof t.version!=`string`))return{name:t.name,version:t.version}}function tryReadInstalledPackageInfo(e,t){let r=normalizeInstalledPackageInfo(JSON.parse(readFileSync(e,`utf8`)));if(r?.name===t)return r}function resolveInstalledPackageInfo(){if(cachedPackageInfo)return cachedPackageInfo;let e=tryResolvePackageRoot(),t=e===void 0?void 0:tryReadInstalledPackageInfo(join(e,`package.json`),EVE_PACKAGE_NAME);if(t)return cachedPackageInfo=t,cachedPackageInfo;try{let e=tryReadInstalledPackageInfo(require.resolve(`${EVE_PACKAGE_NAME}/package.json`),EVE_PACKAGE_NAME);if(e)return cachedPackageInfo=e,cachedPackageInfo}catch{}return cachedPackageInfo={...FALLBACK_PACKAGE_INFO},cachedPackageInfo}function readWorkflowVersionFromManifest(e){let t=e;for(let e of[t.devDependencies,t.dependencies,t.peerDependencies]){let t=e?.[`@workflow/core`];if(typeof t==`string`&&t.trim().length>0)return t}}function resolveExpectedWorkflowVersion(){let e=tryResolvePackageRoot();if(e!==void 0)try{return readWorkflowVersionFromManifest(JSON.parse(readFileSync(join(e,`package.json`),`utf8`)))}catch{}try{return readWorkflowVersionFromManifest(JSON.parse(readFileSync(require.resolve(`${EVE_PACKAGE_NAME}/package.json`),`utf8`)))}catch{return}}function resolveWorkflowModulePath(e){if(e===`workflow`)return resolvePackageSourceFilePath(`src/internal/workflow/index.ts`);if(e===`workflow/api`||e===`workflow/runtime`)return resolvePackageSourceFilePath(`src/internal/workflow/runtime.ts`);if(e===`workflow/internal/builtins`)return resolvePackageSourceFilePath(`src/internal/workflow/builtins.ts`);let t=WORKFLOW_MODULE_ALIASES[e];return t===void 0?require.resolve(e):resolvePackageCompiledFilePath(t)}export{resolveExpectedWorkflowVersion,resolveInstalledPackageInfo,resolvePackageDependencyPath,resolvePackageRoot,resolvePackageSourceDirectoryPath,resolvePackageSourceFilePath,resolveWorkflowModulePath};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{expectFunction,expectObjectRecord,expectOnlyKnownKeys,expectProviderOptions,expectString,getOptionalStringRecordProperty}from"#internal/authored-module.js";function normalizeAgentDefinition(e,r){let a=expectObjectRecord(e,r);if(expectOnlyKnownKeys(a,[`build`,`compaction`,`description`,`experimental`,`limits`,`model`,`modelContextWindowTokens`,`modelOptions`,`outputSchema`,`reasoning`],r),a.model===void 0)throw Error(`${r} The "model" field is required.`);let o={model:a.model};return a.description!==void 0&&(o.description=expectString(a.description,r)),a.compaction!==void 0&&(o.compaction=normalizeAgentCompactionDefinition(a.compaction,r)),a.build!==void 0&&(o.build=normalizeAgentBuildDefinition(a.build,r)),a.experimental!==void 0&&(o.experimental=normalizeAgentExperimentalDefinition(a.experimental,r)),a.modelOptions!==void 0&&(o.modelOptions=normalizeAgentModelOptions(a.modelOptions,r)),a.modelContextWindowTokens!==void 0&&(o.modelContextWindowTokens=expectPositiveInteger(a.modelContextWindowTokens,r)),a.outputSchema!==void 0&&(o.outputSchema=a.outputSchema),a.reasoning!==void 0&&(o.reasoning=normalizeAgentReasoningDefinition(a.reasoning,r)),a.limits!==void 0&&(o.limits=normalizeAgentLimitsDefinition(a.limits,r)),o}function normalizeAgentReasoningDefinition(e,t){let n=expectString(e,t);switch(n){case`provider-default`:case`none`:case`minimal`:case`low`:case`medium`:case`high`:case`xhigh`:return n;default:throw Error(t)}}function expectPositiveInteger(e,t){if(typeof e!=`number`||!Number.isInteger(e)||e<=0)throw Error(t);return e}function normalizeAgentLimitsDefinition(e,r){let i=expectObjectRecord(e,r);expectOnlyKnownKeys(i,[`maxInputTokensPerSession`,`maxOutputTokensPerSession`,`maxSubagentDepth`],r);let a={};return i.maxInputTokensPerSession!==void 0&&(a.maxInputTokensPerSession=
|
|
1
|
+
import{expectFunction,expectObjectRecord,expectOnlyKnownKeys,expectProviderOptions,expectString,getOptionalStringRecordProperty}from"#internal/authored-module.js";function normalizeAgentDefinition(e,r){let a=expectObjectRecord(e,r);if(expectOnlyKnownKeys(a,[`build`,`compaction`,`description`,`experimental`,`limits`,`model`,`modelContextWindowTokens`,`modelOptions`,`outputSchema`,`reasoning`],r),a.model===void 0)throw Error(`${r} The "model" field is required.`);let o={model:a.model};return a.description!==void 0&&(o.description=expectString(a.description,r)),a.compaction!==void 0&&(o.compaction=normalizeAgentCompactionDefinition(a.compaction,r)),a.build!==void 0&&(o.build=normalizeAgentBuildDefinition(a.build,r)),a.experimental!==void 0&&(o.experimental=normalizeAgentExperimentalDefinition(a.experimental,r)),a.modelOptions!==void 0&&(o.modelOptions=normalizeAgentModelOptions(a.modelOptions,r)),a.modelContextWindowTokens!==void 0&&(o.modelContextWindowTokens=expectPositiveInteger(a.modelContextWindowTokens,r)),a.outputSchema!==void 0&&(o.outputSchema=a.outputSchema),a.reasoning!==void 0&&(o.reasoning=normalizeAgentReasoningDefinition(a.reasoning,r)),a.limits!==void 0&&(o.limits=normalizeAgentLimitsDefinition(a.limits,r)),o}function normalizeAgentReasoningDefinition(e,t){let n=expectString(e,t);switch(n){case`provider-default`:case`none`:case`minimal`:case`low`:case`medium`:case`high`:case`xhigh`:return n;default:throw Error(t)}}function expectPositiveInteger(e,t){if(typeof e!=`number`||!Number.isInteger(e)||e<=0)throw Error(t);return e}function expectPositiveIntegerOrFalse(e,t){return e===!1?!1:expectPositiveInteger(e,t)}function normalizeAgentLimitsDefinition(e,r){let i=expectObjectRecord(e,r);expectOnlyKnownKeys(i,[`maxInputTokensPerSession`,`maxOutputTokensPerSession`,`maxSubagentDepth`,`maxSubagents`],r);let a={};return i.maxInputTokensPerSession!==void 0&&(a.maxInputTokensPerSession=expectPositiveIntegerOrFalse(i.maxInputTokensPerSession,r)),i.maxOutputTokensPerSession!==void 0&&(a.maxOutputTokensPerSession=expectPositiveIntegerOrFalse(i.maxOutputTokensPerSession,r)),i.maxSubagentDepth!==void 0&&(a.maxSubagentDepth=expectPositiveInteger(i.maxSubagentDepth,r)),i.maxSubagents!==void 0&&(a.maxSubagents=expectPositiveInteger(i.maxSubagents,r)),a}function normalizeAgentBuildDefinition(e,r){let a=expectObjectRecord(e,r);expectOnlyKnownKeys(a,[`externalDependencies`],r);let o={};if(a.externalDependencies!==void 0){if(!Array.isArray(a.externalDependencies))throw Error(r);o.externalDependencies=Object.freeze(a.externalDependencies.map(e=>expectString(e,r)))}return o}function normalizeAgentWorkflowDefinition(e,r){let i=expectObjectRecord(e,r);expectOnlyKnownKeys(i,[`world`],r);let a={};return i.world!==void 0&&(a.world=normalizeAgentWorkflowWorldDefinition(i.world,r)),a}function normalizeAgentWorkflowWorldDefinition(e,t){let n=expectString(e,t);if(n.trim()===``)throw Error(`${t} "experimental.workflow.world" must be a non-empty package name.`);return n}function normalizeAgentExperimentalDefinition(e,r){let i=expectObjectRecord(e,r);expectOnlyKnownKeys(i,[`workflow`],r);let a={};return i.workflow!==void 0&&(a.workflow=normalizeAgentWorkflowDefinition(i.workflow,r)),a}function normalizeAgentModelOptions(e,i){let a=expectObjectRecord(e,i);expectOnlyKnownKeys(a,[`providerOptions`],i);let o=a.providerOptions;return o===void 0?{}:{providerOptions:expectProviderOptions(o,i)}}function normalizeAgentCompactionDefinition(e,r){let i=expectObjectRecord(e,r);expectOnlyKnownKeys(i,[`model`,`modelContextWindowTokens`,`thresholdPercent`],r);let a={};if(i.model!==void 0&&(a.model=i.model),i.modelContextWindowTokens!==void 0&&(a.modelContextWindowTokens=expectPositiveInteger(i.modelContextWindowTokens,r)),i.thresholdPercent!==void 0){let e=i.thresholdPercent;if(typeof e!=`number`||!Number.isFinite(e)||e<0||e>1)throw Error(r);a.thresholdPercent=e}return a}function normalizeInstructionsDefinition(e,r){let a=expectObjectRecord(e,r);return expectOnlyKnownKeys(a,[`markdown`],r),{markdown:expectString(a.markdown,r)}}function normalizeSkillDefinition(e,r){let o=expectObjectRecord(e,r);expectOnlyKnownKeys(o,[`description`,`files`,`license`,`markdown`,`metadata`],r);let s={description:expectString(o.description,r),markdown:expectString(o.markdown,r)},c=o.license,l=getOptionalStringRecordProperty(o,`metadata`,r);return c!==void 0&&(s.license=expectString(c,r)),l!==void 0&&(s.metadata=l),o.files!==void 0&&(s.files=normalizeSkillFiles(o.files,r)),s}function normalizeSkillFiles(e,n){let r=expectObjectRecord(e,n),i={};for(let[e,t]of Object.entries(r)){if(typeof t==`string`||t instanceof Uint8Array){i[e]=t;continue}throw Error(`${n} Expected skill file "${e}" to be a string or Uint8Array.`)}return i}function normalizeScheduleDefinition(r,a){let o=expectObjectRecord(r,a);expectOnlyKnownKeys(o,[`cron`,`markdown`,`run`],a);let s=expectString(o.cron,a),c=o.markdown!==void 0,l=o.run!==void 0;if(c&&l)throw Error(`${a} Pass either "markdown" (fire-and-forget) or "run" (handler) — not both.`);if(!c&&!l)throw Error(`${a} Must provide either "markdown" (fire-and-forget) or "run" (handler).`);let u={cron:s};return c?u.markdown=expectString(o.markdown,a):u.run=expectFunction(o.run,a),u}export{normalizeAgentDefinition,normalizeInstructionsDefinition,normalizeScheduleDefinition,normalizeSkillDefinition};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{expectFunction,expectObjectRecord,expectOnlyKnownKeys,expectString}from"#internal/authored-module.js";import{isDynamicSentinel}from"#shared/dynamic-tool-definition.js";import{normalizeJsonSchemaDefinition}from"#internal/json-schema.js";import{isDisabledToolSentinel}from"#public/definitions/tool.js";function
|
|
1
|
+
import{expectFunction,expectObjectRecord,expectOnlyKnownKeys,expectString}from"#internal/authored-module.js";import{isDynamicSentinel}from"#shared/dynamic-tool-definition.js";import{normalizeJsonSchemaDefinition}from"#internal/json-schema.js";import{isDisabledToolSentinel,isEnableWorkflowToolSentinel}from"#public/definitions/tool.js";function normalizeToolDefinition(e,t){if(isDynamicSentinel(e))return{kind:`dynamic-tool`,eventNames:Object.keys(e.events)};if(isDisabledToolSentinel(e))return{kind:`disabled`};if(isEnableWorkflowToolSentinel(e))return{kind:`enable-workflow`};let n=expectObjectRecord(e,t);expectOnlyKnownKeys(n,[`auth`,`description`,`execute`,`inputSchema`,`approval`,`outputSchema`,`toModelOutput`],t);let r=n.inputSchema===void 0?null:normalizeJsonSchemaDefinition(n.inputSchema),i=n.outputSchema===void 0?void 0:normalizeJsonSchemaDefinition(n.outputSchema,`output`),a={description:expectString(n.description,t),execute:expectFunction(n.execute,t),inputSchema:r};return i!==void 0&&(a.outputSchema=i),n.approval!==void 0&&expectFunction(n.approval,t),n.toModelOutput!==void 0&&expectFunction(n.toModelOutput,t),n.auth!==void 0&&expectFunction(expectObjectRecord(n.auth,t).getToken,t),{kind:`tool`,definition:a}}export{normalizeToolDefinition};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import type { FileUIPart, ProviderMetadata, TextUIPart, UserContent } from "ai";
|
|
1
2
|
import type { ConnectionAuthorizationChallenge } from "#public/connections/errors.js";
|
|
2
|
-
import type { ProviderMetadata, UserContent } from "ai";
|
|
3
3
|
import type { RuntimeActionRequest, RuntimeActionResult } from "#runtime/actions/types.js";
|
|
4
4
|
import type { InputRequest, InputResponse } from "#runtime/input/types.js";
|
|
5
5
|
import type { JsonObject, JsonValue } from "#shared/json.js";
|
|
@@ -8,7 +8,7 @@ export declare const EVE_STREAM_FORMAT_HEADER = "x-eve-stream-format";
|
|
|
8
8
|
export declare const EVE_STREAM_VERSION_HEADER = "x-eve-stream-version";
|
|
9
9
|
export declare const EVE_MESSAGE_STREAM_CONTENT_TYPE = "application/x-ndjson; charset=utf-8";
|
|
10
10
|
export declare const EVE_MESSAGE_STREAM_FORMAT = "ndjson";
|
|
11
|
-
export declare const EVE_MESSAGE_STREAM_VERSION = "
|
|
11
|
+
export declare const EVE_MESSAGE_STREAM_VERSION = "18";
|
|
12
12
|
/**
|
|
13
13
|
* eve-owned finish reason for one completed assistant step.
|
|
14
14
|
*
|
|
@@ -132,15 +132,32 @@ export interface TurnStartedStreamEvent {
|
|
|
132
132
|
}
|
|
133
133
|
/**
|
|
134
134
|
* Stream event emitted when the runtime receives one normalized user message.
|
|
135
|
+
*
|
|
136
|
+
* `message` is the existing flattened text summary. `parts` carries the
|
|
137
|
+
* structured projection current emitters provide for clients that render
|
|
138
|
+
* attachments.
|
|
135
139
|
*/
|
|
136
140
|
export interface MessageReceivedStreamEvent {
|
|
137
141
|
data: {
|
|
138
142
|
message: string;
|
|
143
|
+
parts?: readonly MessageReceivedPart[];
|
|
139
144
|
sequence: number;
|
|
140
145
|
turnId: string;
|
|
141
146
|
};
|
|
142
147
|
type: "message.received";
|
|
143
148
|
}
|
|
149
|
+
/**
|
|
150
|
+
* One structured part of a received user message.
|
|
151
|
+
*
|
|
152
|
+
* This mirrors the AI SDK UI text/file part surface, narrowed to renderable
|
|
153
|
+
* metadata only. Raw bytes and framework-internal sandbox paths are never
|
|
154
|
+
* projected; `url` is optional because it is present only for client-resolvable
|
|
155
|
+
* `http(s)` and `data:` URLs.
|
|
156
|
+
*/
|
|
157
|
+
export type MessageReceivedPart = Readonly<Pick<TextUIPart, "text" | "type">> | (Readonly<Pick<FileUIPart, "filename" | "mediaType" | "type">> & {
|
|
158
|
+
readonly size?: number;
|
|
159
|
+
readonly url?: FileUIPart["url"];
|
|
160
|
+
});
|
|
144
161
|
/**
|
|
145
162
|
* Stream event emitted when the model requests one or more actions.
|
|
146
163
|
*
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const EVE_SESSION_ID_HEADER=`x-eve-session-id`,EVE_STREAM_FORMAT_HEADER=`x-eve-stream-format`,EVE_STREAM_VERSION_HEADER=`x-eve-stream-version`,EVE_MESSAGE_STREAM_CONTENT_TYPE=`application/x-ndjson; charset=utf-8`,EVE_MESSAGE_STREAM_FORMAT=`ndjson`,EVE_MESSAGE_STREAM_VERSION=`
|
|
2
|
-
`)}function createActionsRequestedEvent(e){return{data:{actions:e.actions,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`actions.requested`}}function createAuthorizationRequiredEvent(e){let t={description:e.description,name:e.name,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.authorization!==void 0&&(t.authorization=e.authorization),e.webhookUrl!==void 0&&(t.webhookUrl=e.webhookUrl),{data:t,type:`authorization.required`}}function createAuthorizationCompletedEvent(e){let t={name:e.name,outcome:e.outcome,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.authorization!==void 0&&(t.authorization=e.authorization),e.reason!==void 0&&(t.reason=e.reason),{data:t,type:`authorization.completed`}}function createInputRequestedEvent(e){return{data:{requests:e.requests,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`input.requested`}}function createActionResultEvent(e){let t=e.rejected===!0?{error:buildActionResultError(e.result),status:`rejected`}:normalizeActionResultOutcome(e.result);return{data:{error:t.error,result:e.result,sequence:e.sequence,stepIndex:e.stepIndex,status:t.status,turnId:e.turnId},type:`action.result`}}function createSubagentCalledEvent(e){return{data:{callId:e.callId,childSessionId:e.childSessionId,sessionId:e.sessionId,sequence:e.sequence,name:e.name,remote:e.remote,toolName:e.toolName,turnId:e.turnId,workflowId:e.workflowId},type:`subagent.called`}}function createMessageAppendedEvent(e){return{data:{messageDelta:e.messageDelta,messageSoFar:e.messageSoFar,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`message.appended`}}function createReasoningAppendedEvent(e){return{data:{reasoningDelta:e.reasoningDelta,reasoningSoFar:e.reasoningSoFar,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`reasoning.appended`}}function createMessageCompletedEvent(e){return{data:{finishReason:e.finishReason??`stop`,message:e.message,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`message.completed`}}function createReasoningCompletedEvent(e){return{data:{reasoning:e.reasoning,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`reasoning.completed`}}function createResultCompletedEvent(e){return{data:{result:e.result,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`result.completed`}}function createStepStartedEvent(e){return{data:{sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`step.started`}}function createStepCompletedEvent(e){let t={finishReason:e.finishReason,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.usage!==void 0&&(t.usage=e.usage),e.providerMetadata!==void 0&&(t.providerMetadata=e.providerMetadata),{data:t,type:`step.completed`}}function createStepFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`step.failed`}}function createTurnCompletedEvent(e){return{data:{sequence:e.sequence,turnId:e.turnId},type:`turn.completed`}}function createTurnFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sequence:e.sequence,turnId:e.turnId},type:`turn.failed`}}function createCompactionRequestedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,sessionId:e.sessionId,turnId:e.turnId,usageInputTokens:e.usageInputTokens??null},type:`compaction.requested`}}function createCompactionCompletedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,sessionId:e.sessionId,turnId:e.turnId},type:`compaction.completed`}}function createSessionWaitingEvent(){return{data:{wait:`next-user-message`},type:`session.waiting`}}function createSessionFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sessionId:e.sessionId},type:`session.failed`}}function createSessionCompletedEvent(){return{type:`session.completed`}}function timestampHandleMessageStreamEvent(e,t=new Date().toISOString()){return{...e,meta:{at:t}}}function encodeMessageStreamEvent(e){return textEncoder.encode(`${JSON.stringify(e)}\n`)}function normalizeActionResultOutcome(e){if(e.isError===!0)return{error:buildActionResultError(e),status:`failed`};let t=readActionResultOutputError(e.output);return t===void 0?{status:`completed`}:{error:t,status:`failed`}}function buildActionResultError(e){let t=readActionResultOutputError(e.output);return t===void 0?{code:`ACTION_RESULT_FAILED`,message:formatActionResultOutput(e.output)}:t}function readActionResultOutputError(e){let t=parseActionResultOutputRecord(e);if(t===void 0)return;let n=typeof t.code==`string`&&t.code.length>0?t.code:void 0,r=typeof t.message==`string`&&t.message.length>0?t.message:void 0;if(!(n===void 0||r===void 0))return{code:n,message:r}}function parseActionResultOutputRecord(e){if(typeof e==`object`&&e)return e;if(typeof e!=`string`)return;let t=e.trim();if(t.length!==0)try{let e=JSON.parse(t);if(typeof e==`object`&&e)return e}catch{return}}function formatActionResultOutput(e){if(typeof e==`string`)return e;let t=JSON.stringify(e);return typeof t==`string`&&t.length>0?t:`Action failed.`}export{EVE_MESSAGE_STREAM_CONTENT_TYPE,EVE_MESSAGE_STREAM_FORMAT,EVE_MESSAGE_STREAM_VERSION,EVE_SESSION_ID_HEADER,EVE_STREAM_FORMAT_HEADER,EVE_STREAM_VERSION_HEADER,createActionResultEvent,createActionsRequestedEvent,createAuthorizationCompletedEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createInputRequestedEvent,createMessageAppendedEvent,createMessageCompletedEvent,createMessageReceivedEvent,createReasoningAppendedEvent,createReasoningCompletedEvent,createResultCompletedEvent,createSessionCompletedEvent,createSessionFailedEvent,createSessionStartedEvent,createSessionWaitingEvent,createStepCompletedEvent,createStepFailedEvent,createStepStartedEvent,createSubagentCalledEvent,createTurnCompletedEvent,createTurnFailedEvent,createTurnStartedEvent,encodeMessageStreamEvent,isCurrentTurnBoundaryEvent,isTurnFailureEvent,timestampHandleMessageStreamEvent};
|
|
1
|
+
import{deserializeUrlFilePart,hasInternalRefScheme,isSerializedUrlFilePart}from"#internal/attachments/url-refs.js";import{decodeSandboxRef,isSandboxRefUrl}from"#internal/attachments/sandbox-refs.js";const EVE_SESSION_ID_HEADER=`x-eve-session-id`,EVE_STREAM_FORMAT_HEADER=`x-eve-stream-format`,EVE_STREAM_VERSION_HEADER=`x-eve-stream-version`,EVE_MESSAGE_STREAM_CONTENT_TYPE=`application/x-ndjson; charset=utf-8`,EVE_MESSAGE_STREAM_FORMAT=`ndjson`,EVE_MESSAGE_STREAM_VERSION=`18`,textEncoder=new TextEncoder;function isCurrentTurnBoundaryEvent(e){return e.type===`session.completed`||e.type===`session.failed`||e.type===`session.waiting`}function isTurnFailureEvent(e){return e.type===`session.failed`||e.type===`step.failed`||e.type===`turn.failed`}function createSessionStartedEvent(e){let t={};return e?.invocation!==void 0&&(t.invocation=e.invocation),e?.runtime!==void 0&&(t.runtime=e.runtime),{data:t,type:`session.started`}}function createTurnStartedEvent(e){return{data:{sequence:e.sequence,turnId:e.turnId},type:`turn.started`}}function createMessageReceivedEvent(e){return{data:{message:summarizeUserContent(e.message),parts:projectUserContentParts(e.message),sequence:e.sequence,turnId:e.turnId},type:`message.received`}}function summarizeUserContent(e){if(typeof e==`string`)return e;let t=[];for(let n of e)if(n.type===`text`)t.push(n.text);else if(n.type===`file`){let e=n.filename??n.mediaType;t.push(`[file: ${e} (${n.mediaType})]`)}else n.type===`image`&&t.push(`[image: ${n.mediaType??`image`}]`);return t.join(`
|
|
2
|
+
`)}function projectUserContentParts(e){if(typeof e==`string`)return[{text:e,type:`text`}];let t=[];for(let n of e)n.type===`text`?t.push({text:n.text,type:`text`}):n.type===`file`?t.push(projectFileLikePart(n.data,n.mediaType,n.filename)):n.type===`image`&&t.push(projectFileLikePart(n.image,n.mediaType??`application/octet-stream`,void 0));return t}function projectFileLikePart(e,t,n){if(isSandboxRefUrl(e)){let t=decodeSandboxRef(e);return createProjectedFilePart({filename:basenameOf(n??t.path),mediaType:t.mediaType,size:t.size})}let i=projectTaggedFileData(e,t,n);if(i!==void 0)return i;let a=byteLengthOf(e);return createProjectedFilePart(a===void 0?{filename:n,mediaType:t,...clientUrlFragment(e)}:{filename:n,mediaType:t,size:a})}function projectTaggedFileData(e,t,n){if(isTaggedFileData(e))switch(e.type){case`data`:{let r=byteLengthOf(e.data);return createProjectedFilePart(r===void 0?{filename:n,mediaType:t}:{filename:n,mediaType:t,size:r})}case`reference`:case`text`:return createProjectedFilePart({filename:n,mediaType:t});case`url`:return createProjectedFilePart({filename:n,mediaType:t,...clientUrlFragment(e.url)})}}function createProjectedFilePart(e){let t={mediaType:e.mediaType,type:`file`};return e.filename!==void 0&&(t.filename=e.filename),e.size!==void 0&&(t.size=e.size),e.url!==void 0&&(t.url=e.url),t}function isTaggedFileData(e){if(typeof e!=`object`||!e)return!1;let t=e.type;return t===`data`||t===`reference`||t===`text`||t===`url`}function byteLengthOf(e){if(e instanceof Uint8Array||e instanceof ArrayBuffer)return e.byteLength}function clientUrlFragment(r){if(isSerializedUrlFilePart(r))try{let t=deserializeUrlFilePart(r);return isClientResolvableUrl(t)?{url:t.href}:{}}catch{return{}}if(r instanceof URL)return isClientResolvableUrl(r)?{url:r.href}:{};if(typeof r!=`string`||hasInternalRefScheme(r))return{};if(r.startsWith(`data:`))return{url:r};try{let e=new URL(r);return isClientResolvableUrl(e)?{url:e.href}:{}}catch{return{}}}function isClientResolvableUrl(e){return e.protocol===`http:`||e.protocol===`https:`||e.protocol===`data:`}function basenameOf(e){let t=e.replaceAll(`\\`,`/`),n=t.slice(t.lastIndexOf(`/`)+1);return n.length>0?n:e}function createActionsRequestedEvent(e){return{data:{actions:e.actions,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`actions.requested`}}function createAuthorizationRequiredEvent(e){let t={description:e.description,name:e.name,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.authorization!==void 0&&(t.authorization=e.authorization),e.webhookUrl!==void 0&&(t.webhookUrl=e.webhookUrl),{data:t,type:`authorization.required`}}function createAuthorizationCompletedEvent(e){let t={name:e.name,outcome:e.outcome,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.authorization!==void 0&&(t.authorization=e.authorization),e.reason!==void 0&&(t.reason=e.reason),{data:t,type:`authorization.completed`}}function createInputRequestedEvent(e){return{data:{requests:e.requests,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`input.requested`}}function createActionResultEvent(e){let t=e.rejected===!0?{error:buildActionResultError(e.result),status:`rejected`}:normalizeActionResultOutcome(e.result);return{data:{error:t.error,result:e.result,sequence:e.sequence,stepIndex:e.stepIndex,status:t.status,turnId:e.turnId},type:`action.result`}}function createSubagentCalledEvent(e){return{data:{callId:e.callId,childSessionId:e.childSessionId,sessionId:e.sessionId,sequence:e.sequence,name:e.name,remote:e.remote,toolName:e.toolName,turnId:e.turnId,workflowId:e.workflowId},type:`subagent.called`}}function createMessageAppendedEvent(e){return{data:{messageDelta:e.messageDelta,messageSoFar:e.messageSoFar,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`message.appended`}}function createReasoningAppendedEvent(e){return{data:{reasoningDelta:e.reasoningDelta,reasoningSoFar:e.reasoningSoFar,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`reasoning.appended`}}function createMessageCompletedEvent(e){return{data:{finishReason:e.finishReason??`stop`,message:e.message,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`message.completed`}}function createReasoningCompletedEvent(e){return{data:{reasoning:e.reasoning,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`reasoning.completed`}}function createResultCompletedEvent(e){return{data:{result:e.result,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`result.completed`}}function createStepStartedEvent(e){return{data:{sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`step.started`}}function createStepCompletedEvent(e){let t={finishReason:e.finishReason,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId};return e.usage!==void 0&&(t.usage=e.usage),e.providerMetadata!==void 0&&(t.providerMetadata=e.providerMetadata),{data:t,type:`step.completed`}}function createStepFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},type:`step.failed`}}function createTurnCompletedEvent(e){return{data:{sequence:e.sequence,turnId:e.turnId},type:`turn.completed`}}function createTurnFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sequence:e.sequence,turnId:e.turnId},type:`turn.failed`}}function createCompactionRequestedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,sessionId:e.sessionId,turnId:e.turnId,usageInputTokens:e.usageInputTokens??null},type:`compaction.requested`}}function createCompactionCompletedEvent(e){return{data:{modelId:e.modelId,sequence:e.sequence,sessionId:e.sessionId,turnId:e.turnId},type:`compaction.completed`}}function createSessionWaitingEvent(){return{data:{wait:`next-user-message`},type:`session.waiting`}}function createSessionFailedEvent(e){return{data:{code:e.code,details:e.details,message:e.message,sessionId:e.sessionId},type:`session.failed`}}function createSessionCompletedEvent(){return{type:`session.completed`}}function timestampHandleMessageStreamEvent(e,t=new Date().toISOString()){return{...e,meta:{at:t}}}function encodeMessageStreamEvent(e){return textEncoder.encode(`${JSON.stringify(e)}\n`)}function normalizeActionResultOutcome(e){if(e.isError===!0)return{error:buildActionResultError(e),status:`failed`};let t=readActionResultOutputError(e.output);return t===void 0?{status:`completed`}:{error:t,status:`failed`}}function buildActionResultError(e){let t=readActionResultOutputError(e.output);return t===void 0?{code:`ACTION_RESULT_FAILED`,message:formatActionResultOutput(e.output)}:t}function readActionResultOutputError(e){let t=parseActionResultOutputRecord(e);if(t===void 0)return;let n=typeof t.code==`string`&&t.code.length>0?t.code:void 0,r=typeof t.message==`string`&&t.message.length>0?t.message:void 0;if(!(n===void 0||r===void 0))return{code:n,message:r}}function parseActionResultOutputRecord(e){if(typeof e==`object`&&e)return e;if(typeof e!=`string`)return;let t=e.trim();if(t.length!==0)try{let e=JSON.parse(t);if(typeof e==`object`&&e)return e}catch{return}}function formatActionResultOutput(e){if(typeof e==`string`)return e;let t=JSON.stringify(e);return typeof t==`string`&&t.length>0?t:`Action failed.`}export{EVE_MESSAGE_STREAM_CONTENT_TYPE,EVE_MESSAGE_STREAM_FORMAT,EVE_MESSAGE_STREAM_VERSION,EVE_SESSION_ID_HEADER,EVE_STREAM_FORMAT_HEADER,EVE_STREAM_VERSION_HEADER,createActionResultEvent,createActionsRequestedEvent,createAuthorizationCompletedEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createInputRequestedEvent,createMessageAppendedEvent,createMessageCompletedEvent,createMessageReceivedEvent,createReasoningAppendedEvent,createReasoningCompletedEvent,createResultCompletedEvent,createSessionCompletedEvent,createSessionFailedEvent,createSessionStartedEvent,createSessionWaitingEvent,createStepCompletedEvent,createStepFailedEvent,createStepStartedEvent,createSubagentCalledEvent,createTurnCompletedEvent,createTurnFailedEvent,createTurnStartedEvent,encodeMessageStreamEvent,isCurrentTurnBoundaryEvent,isTurnFailureEvent,timestampHandleMessageStreamEvent};
|
|
@@ -7,10 +7,25 @@ type ChatSdkSendInput = Parameters<SendFn<ChatSdkChannelState>>[0];
|
|
|
7
7
|
/**
|
|
8
8
|
* Durable channel state used by `chatSdkChannel`. Stores the last Chat SDK
|
|
9
9
|
* thread for the Eve session so event handlers can post replies without
|
|
10
|
-
* depending on hidden Chat SDK subscription state
|
|
10
|
+
* depending on hidden Chat SDK subscription state, plus the bookkeeping the
|
|
11
|
+
* default handlers use to stream assistant output and surface typing status.
|
|
11
12
|
*/
|
|
12
13
|
export interface ChatSdkChannelState extends Record<string, unknown> {
|
|
13
14
|
thread: SerializedThread | null;
|
|
15
|
+
/** Message id of the in-flight streamed assistant post (edit fallback). */
|
|
16
|
+
anchorMessageId?: string | null;
|
|
17
|
+
/**
|
|
18
|
+
* Whether `adapter.editMessage` works for this session. Set to `false` once
|
|
19
|
+
* an edit throws {@link isNotImplemented}, which disables streaming edits for
|
|
20
|
+
* the rest of the session.
|
|
21
|
+
*/
|
|
22
|
+
editSupported?: boolean;
|
|
23
|
+
/** Epoch ms of the last streaming edit, used to throttle edits. */
|
|
24
|
+
lastEditAtMs?: number | null;
|
|
25
|
+
/** Buffered first line of a tool-call message, surfaced as typing status. */
|
|
26
|
+
pendingToolCallMessage?: string | null;
|
|
27
|
+
/** Step index the current stream anchor belongs to (resets per step). */
|
|
28
|
+
streamStepIndex?: number | null;
|
|
14
29
|
}
|
|
15
30
|
/**
|
|
16
31
|
* Thread selector accepted by `chatSdkChannel().receive`. Pass a serialized
|
|
@@ -40,6 +55,10 @@ export interface ChatSdkChannelContext<TAdapters extends ChatSdkAdapters = ChatS
|
|
|
40
55
|
readonly bot: Chat<TAdapters>;
|
|
41
56
|
readonly thread: Thread | null;
|
|
42
57
|
state: ChatSdkChannelState;
|
|
58
|
+
/** Whether streamed deltas are delivered via a post+edit fallback. */
|
|
59
|
+
readonly streaming: boolean;
|
|
60
|
+
/** Minimum interval between streaming edits, in ms. */
|
|
61
|
+
readonly streamingEditIntervalMs: number;
|
|
43
62
|
}
|
|
44
63
|
/** Event-handler context for `chatSdkChannel`, including Eve session helpers. */
|
|
45
64
|
export interface ChatSdkEventContext<TAdapters extends ChatSdkAdapters = ChatSdkAdapters> extends ChatSdkChannelContext<TAdapters>, ChannelSessionOps {
|
|
@@ -74,8 +93,8 @@ export interface ChatSdkChannelConfig<TAdapters extends ChatSdkAdapters = ChatSd
|
|
|
74
93
|
/** Map of Chat SDK adapter name to adapter instance. */
|
|
75
94
|
readonly adapters: TAdapters;
|
|
76
95
|
/**
|
|
77
|
-
* Base route for generated adapter webhooks. Defaults to `/eve/v1
|
|
78
|
-
*
|
|
96
|
+
* Base route for generated adapter webhooks. Defaults to `/eve/v1`, so an
|
|
97
|
+
* adapter named `slack` mounts at `/eve/v1/slack`.
|
|
79
98
|
*/
|
|
80
99
|
readonly route?: string;
|
|
81
100
|
/**
|
|
@@ -98,6 +117,18 @@ export interface ChatSdkChannelConfig<TAdapters extends ChatSdkAdapters = ChatSd
|
|
|
98
117
|
* resolver when continued sessions should keep user or tenant auth.
|
|
99
118
|
*/
|
|
100
119
|
readonly resolveInputAuth?: (event: ActionEvent) => SessionAuthContext | null | Promise<SessionAuthContext | null>;
|
|
120
|
+
/**
|
|
121
|
+
* Whether the default handlers stream assistant output by posting an initial
|
|
122
|
+
* message and editing it as deltas arrive. Defaults to `true`. Set to `false`
|
|
123
|
+
* for adapters that only deliver a single message per turn (e.g. email), so
|
|
124
|
+
* replies post once on completion.
|
|
125
|
+
*/
|
|
126
|
+
readonly streaming?: boolean;
|
|
127
|
+
/**
|
|
128
|
+
* Minimum interval between streaming edits, in ms. Defaults to `1000`. Only
|
|
129
|
+
* used when `streaming` is enabled and the adapter supports editing.
|
|
130
|
+
*/
|
|
131
|
+
readonly streamingEditIntervalMs?: number;
|
|
101
132
|
}
|
|
102
133
|
/** Concrete channel value returned on `bridge.channel`. */
|
|
103
134
|
export interface ChatSdkChannel extends Channel<ChatSdkChannelState, ChatSdkReceiveTarget, ChatSdkInstrumentationMetadata> {
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{createLogger,extractErrorId,formatErrorHint}from"#internal/logging.js";import{ContextContainer,contextStorage}from"#context/container.js";import{ContextKey}from"#context/key.js";import{Actions,Button,Card,CardText,Chat,Message,ThreadImpl}from"#compiled/chat/index.js";import{POST,defineChannel}from"#public/definitions/defineChannel.js";const log=createLogger(`chat-sdk.channel`),ActiveWebhookKey=new ContextKey(`chat-sdk.active-webhook`);function chatSdkChannel(e){let t=new Chat(e),n=e.inputActionPrefix??`eve_input:`,a={...defaultEvents(n),...e.events};return t.onAction(async r=>{let i=decodeInputAction(r.actionId,n,r.value);if(i){if(!r.thread)throw Error(`chatSdkChannel input actions require a thread on the Chat SDK action event.`);await bridgeSend(t,{inputResponses:[i]},{auth:e.resolveInputAuth?await e.resolveInputAuth(r):null,thread:r.thread})}}),{bot:t,channel:defineChannel({kindHint:`chat-sdk`,state:initialState(),metadata:metadataFromState,context(e){return{bot:t,state:e,thread:threadFromState(t,e)}},routes:adapterNames(e.adapters).map(n=>POST(routeForAdapter(n,e),async(a,o)=>{let s=t.webhooks[n],c=new ContextContainer;return c.setVirtualContext(ActiveWebhookKey,{send:o.send}),contextStorage.run(c,()=>s(a,{...e.webhook,waitUntil(e){o.waitUntil(e)}}))})),async receive(e,{send:n}){let r=serializeReceiveTarget(t,e.target);return n(e.message,{auth:e.auth,continuationToken:r.id,state:{thread:r}})},events:
|
|
1
|
+
import{createLogger,extractErrorId,formatErrorHint}from"#internal/logging.js";import{ContextContainer,contextStorage}from"#context/container.js";import{ContextKey}from"#context/key.js";import{Actions,Button,Card,CardText,Chat,Message,ThreadImpl}from"#compiled/chat/index.js";import{isNotImplemented}from"#public/channels/chat-sdk/notImplemented.js";import{POST,defineChannel}from"#public/definitions/defineChannel.js";const log=createLogger(`chat-sdk.channel`),ActiveWebhookKey=new ContextKey(`chat-sdk.active-webhook`);function chatSdkChannel(e){let t=new Chat(e),n=e.inputActionPrefix??`eve_input:`,a=e.streaming??!0,o=e.streamingEditIntervalMs??1e3,s={...defaultEvents(n),...e.events};return t.onAction(async r=>{let i=decodeInputAction(r.actionId,n,r.value);if(i){if(!r.thread)throw Error(`chatSdkChannel input actions require a thread on the Chat SDK action event.`);await bridgeSend(t,{inputResponses:[i]},{auth:e.resolveInputAuth?await e.resolveInputAuth(r):null,thread:r.thread})}}),{bot:t,channel:defineChannel({kindHint:`chat-sdk`,state:initialState(),metadata:metadataFromState,context(e){return{bot:t,state:e,streaming:a,streamingEditIntervalMs:o,thread:threadFromState(t,e)}},routes:adapterNames(e.adapters).map(n=>POST(routeForAdapter(n,e),async(a,o)=>{let s=t.webhooks[n],c=new ContextContainer;return c.setVirtualContext(ActiveWebhookKey,{send:o.send}),contextStorage.run(c,()=>s(a,{...e.webhook,waitUntil(e){o.waitUntil(e)}}))})),async receive(e,{send:n}){let r=serializeReceiveTarget(t,e.target);return n(e.message,{auth:e.auth,continuationToken:r.id,state:{thread:r}})},events:s}),send(e,n){return bridgeSend(t,e,n)}}}function defaultEvents(e){return{async"turn.started"(e,t,n){t.state.pendingToolCallMessage=null,clearStream(t.state),await safeStartTyping(t.thread,`Working...`)},async"actions.requested"(e,t,n){let r=t.state.pendingToolCallMessage;if(t.state.pendingToolCallMessage=null,r){await safeStartTyping(t.thread,truncate(r));return}let i=e.actions.map(e=>e.kind===`tool-call`?e.toolName:e.kind);await safeStartTyping(t.thread,truncate(`Running ${i.join(`, `)}...`))},async"message.appended"(e,t,n){if(!t.thread||!e.messageSoFar||!canStream(t))return;let r=t.state.anchorMessageId;if(!r||t.state.streamStepIndex!==e.stepIndex){let n=await t.thread.post({markdown:e.messageSoFar});t.state.anchorMessageId=n.id,t.state.streamStepIndex=e.stepIndex,t.state.lastEditAtMs=Date.now();return}let i=t.state.lastEditAtMs??0;if(!(Date.now()-i<t.streamingEditIntervalMs))try{await editMessage(t.thread,r,e.messageSoFar),t.state.lastEditAtMs=Date.now()}catch(e){if(!isNotImplemented(e))throw e;t.state.editSupported=!1,clearStream(t.state)}},async"input.requested"(t,n,r){!n.thread||t.requests.length===0||await n.thread.post(renderInputRequests(t.requests,e))},async"message.completed"(e,t,n){if(e.finishReason===`tool-calls`){t.state.pendingToolCallMessage=e.message?firstNonEmptyLine(e.message)??null:null,e.message?await finalizeStreamedMessage(t,e.message,!1):clearStream(t.state);return}if(t.state.pendingToolCallMessage=null,!e.message){clearStream(t.state);return}await finalizeStreamedMessage(t,e.message,!0)},async"turn.failed"(e,t,n){await postFailure(t.thread,`I hit an error while handling your request`,e)},async"session.failed"(e,t){await postFailure(t.thread,`This session could not recover from an error`,e)}}}async function safeStartTyping(e,t){if(e)try{await e.startTyping(t)}catch(e){if(!isNotImplemented(e))throw e}}async function editMessage(e,t,n){await e.adapter.editMessage(e.id,t,{markdown:n})}async function finalizeStreamedMessage(e,t,n){let r=e.thread;if(!r){clearStream(e.state);return}let i=e.state.anchorMessageId;if(canStream(e)&&i)try{await editMessage(r,i,t)}catch(i){if(!isNotImplemented(i))throw i;e.state.editSupported=!1,n&&await r.post({markdown:t})}else n&&await r.post({markdown:t});clearStream(e.state)}function canStream(e){return e.streaming&&e.state.editSupported!==!1}function clearStream(e){e.anchorMessageId=null,e.lastEditAtMs=null,e.streamStepIndex=null}function firstNonEmptyLine(e){for(let t of e.split(/\r?\n/u)){let e=t.trim();if(e.length>0)return e}}function truncate(e,t=80){return e.length<=t?e:`${e.slice(0,t-1)}\u2026`}function renderInputRequests(e,t){return Card({children:e.flatMap(e=>renderInputRequest(e,t))})}function renderInputRequest(e,t){let n=[CardText(e.prompt)];return e.options&&e.options.length>0?(n.push(Actions(e.options.map(n=>Button({id:encodeInputAction(t,e.requestId,n.id),label:n.label,style:n.style,value:n.id})))),n):(n.push(CardText(`This request needs a freeform answer. Continue from the Eve session UI.`)),n)}async function postFailure(e,r,i){if(!e)return;let a=formatErrorHint(i),o=extractErrorId(i.details);await e.post([`${r}${a}.`,`Please try again, rephrase, or reach out if it keeps failing.`,...o?[`Error id: ${o}`]:[]].join(`
|
|
2
2
|
|
|
3
|
-
`))}async function bridgeSend(e,t,n){let r=contextStorage.getStore()?.get(ActiveWebhookKey);if(!r)throw Error(`chatSdkChannel().send can only run during a Chat SDK webhook handler for this bridge.`);let a=serializeThread(e,n.thread,n.adapterName),o={auth:n.auth??null,continuationToken:a.id,state:{thread:a}};return n.callback&&(o.callback=n.callback),n.mode&&(o.mode=n.mode),n.title&&(o.title=n.title),r.send(t,o)}function initialState(){return{thread:null}}function metadataFromState(e){return{adapterName:e.thread?.adapterName??null,channelId:e.thread?.channelId??null,isDM:e.thread?.isDM??null,threadId:e.thread?.id??null}}function threadFromState(e,t){if(!t.thread)return null;try{let n=t.thread;return new ThreadImpl({adapter:e.getAdapter(n.adapterName),channelId:n.channelId,channelVisibility:n.channelVisibility,currentMessage:n.currentMessage?Message.fromJSON(n.currentMessage):void 0,id:n.id,isDM:n.isDM,stateAdapter:e.getState()})}catch(e){return log.warn(`failed to rebuild Chat SDK thread from channel state`,{error:e}),null}}function serializeReceiveTarget(e,t){if(t.thread)return t.thread;if(!t.threadId)throw Error(`chatSdkChannel().receive requires target.thread or target.threadId.`);return serializeThread(e,t.threadId,t.adapterName)}function serializeThread(e,t,n){if(typeof t==`string`){let r=n??inferAdapterName(t),i=e.getAdapter(r);return{_type:`chat:Thread`,adapterName:r,channelId:i.channelIdFromThreadId(t),channelVisibility:i.getChannelVisibility?.(t),id:t,isDM:!1}}return isSerializedThread(t)?t:t.toJSON()}function isSerializedThread(e){return`_type`in e&&e._type===`chat:Thread`}function inferAdapterName(e){let t=e.indexOf(`:`);if(t<=0)throw Error(`chatSdkChannel string thread references require options.adapterName.`);return e.slice(0,t)}function adapterNames(e){return Object.keys(e)}function routeForAdapter(e,t){return t.routes?.[e]||`${(t.route??`/eve/v1
|
|
3
|
+
`))}async function bridgeSend(e,t,n){let r=contextStorage.getStore()?.get(ActiveWebhookKey);if(!r)throw Error(`chatSdkChannel().send can only run during a Chat SDK webhook handler for this bridge.`);let a=serializeThread(e,n.thread,n.adapterName),o={auth:n.auth??null,continuationToken:a.id,state:{thread:a}};return n.callback&&(o.callback=n.callback),n.mode&&(o.mode=n.mode),n.title&&(o.title=n.title),r.send(t,o)}function initialState(){return{thread:null}}function metadataFromState(e){return{adapterName:e.thread?.adapterName??null,channelId:e.thread?.channelId??null,isDM:e.thread?.isDM??null,threadId:e.thread?.id??null}}function threadFromState(e,t){if(!t.thread)return null;try{let n=t.thread;return new ThreadImpl({adapter:e.getAdapter(n.adapterName),channelId:n.channelId,channelVisibility:n.channelVisibility,currentMessage:n.currentMessage?Message.fromJSON(n.currentMessage):void 0,id:n.id,isDM:n.isDM,stateAdapter:e.getState()})}catch(e){return log.warn(`failed to rebuild Chat SDK thread from channel state`,{error:e}),null}}function serializeReceiveTarget(e,t){if(t.thread)return t.thread;if(!t.threadId)throw Error(`chatSdkChannel().receive requires target.thread or target.threadId.`);return serializeThread(e,t.threadId,t.adapterName)}function serializeThread(e,t,n){if(typeof t==`string`){let r=n??inferAdapterName(t),i=e.getAdapter(r);return{_type:`chat:Thread`,adapterName:r,channelId:i.channelIdFromThreadId(t),channelVisibility:i.getChannelVisibility?.(t),id:t,isDM:!1}}return isSerializedThread(t)?t:t.toJSON()}function isSerializedThread(e){return`_type`in e&&e._type===`chat:Thread`}function inferAdapterName(e){let t=e.indexOf(`:`);if(t<=0)throw Error(`chatSdkChannel string thread references require options.adapterName.`);return e.slice(0,t)}function adapterNames(e){return Object.keys(e)}function routeForAdapter(e,t){return t.routes?.[e]||`${(t.route??`/eve/v1`).replace(/\/$/u,``)}/${e}`}function encodeInputAction(e,t,n){return`${e}${encodeURIComponent(t)}:${encodeURIComponent(n)}`}function decodeInputAction(e,t,n){if(!e.startsWith(t))return null;let r=e.slice(t.length),i=r.indexOf(`:`);if(i<=0)return null;try{let e=decodeURIComponent(r.slice(0,i));return{optionId:n??decodeURIComponent(r.slice(i+1)),requestId:e}}catch{return null}}export{chatSdkChannel};
|
|
@@ -1 +1,3 @@
|
|
|
1
1
|
export { chatSdkChannel, type ChatSdkChannel, type ChatSdkChannelBridge, type ChatSdkChannelConfig, type ChatSdkChannelContext, type ChatSdkChannelEvents, type ChatSdkChannelState, type ChatSdkEventContext, type ChatSdkInstrumentationMetadata, type ChatSdkReceiveTarget, type ChatSdkSendOptions, } from "#public/channels/chat-sdk/chatSdkChannel.js";
|
|
2
|
+
export { messageToUserContent } from "#public/channels/chat-sdk/messageToUserContent.js";
|
|
3
|
+
export { isNotImplemented } from "#public/channels/chat-sdk/notImplemented.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{chatSdkChannel}from"#public/channels/chat-sdk/chatSdkChannel.js";export{chatSdkChannel};
|
|
1
|
+
import{isNotImplemented}from"#public/channels/chat-sdk/notImplemented.js";import{chatSdkChannel}from"#public/channels/chat-sdk/chatSdkChannel.js";import{messageToUserContent}from"#public/channels/chat-sdk/messageToUserContent.js";export{chatSdkChannel,isNotImplemented,messageToUserContent};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { UserContent } from "ai";
|
|
2
|
+
import type { Message } from "#compiled/chat/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Converts a Chat SDK `Message` into the input shape `chatSdkChannel().send`
|
|
5
|
+
* accepts.
|
|
6
|
+
*
|
|
7
|
+
* Returns `message.text` when the message has no attachments. When attachments
|
|
8
|
+
* are present, returns an AI SDK `UserContent` array: the text (when non-empty)
|
|
9
|
+
* followed by one `file` part per attachment that exposes a URL. Attachments
|
|
10
|
+
* without a URL are skipped, and a message whose only attachments lack URLs
|
|
11
|
+
* falls back to `message.text`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function messageToUserContent(message: Message): string | UserContent;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function messageToUserContent(e){let t=e.attachments??[];if(t.length===0)return e.text;let n=[];e.text&&n.push({text:e.text,type:`text`});for(let e of t)e.url&&n.push({data:new URL(e.url),filename:e.name,mediaType:e.mimeType??`application/octet-stream`,type:`file`});return n.length>0?n:e.text}export{messageToUserContent};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* True when `error` signals a Chat SDK operation the active adapter does not
|
|
3
|
+
* support. Matched by both `name` and `code` so optional capabilities such as
|
|
4
|
+
* typing indicators and streaming edits can degrade gracefully instead of
|
|
5
|
+
* failing the whole event handler.
|
|
6
|
+
*/
|
|
7
|
+
export declare function isNotImplemented(error: unknown): boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function isNotImplemented(e){return e instanceof Error&&(e.name===`NotImplementedError`||e.code===`NOT_IMPLEMENTED`)}export{isNotImplemented};
|
|
@@ -70,14 +70,15 @@ export interface SlackPostedMessage {
|
|
|
70
70
|
* - The channel uploads each file via Slack's modern
|
|
71
71
|
* `files.getUploadURLExternal` → POST bytes → `files.completeUploadExternal`
|
|
72
72
|
* flow.
|
|
73
|
-
* - For `{
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
* - For `{ blocks }` / `{ card }`: the
|
|
77
|
-
* via `chat.postMessage`, then the files are uploaded as a
|
|
73
|
+
* - For `{ text }`: the text becomes the file post's `initial_comment`,
|
|
74
|
+
* producing a single Slack message with text and files. Slack
|
|
75
|
+
* interprets `initial_comment` as mrkdwn.
|
|
76
|
+
* - For `{ markdown }` / `{ blocks }` / `{ card }`: the message lands
|
|
77
|
+
* first via `chat.postMessage`, then the files are uploaded as a
|
|
78
78
|
* follow-up message in the same thread. Slack has no native way to
|
|
79
|
-
* attach arbitrary files inside
|
|
80
|
-
*
|
|
79
|
+
* attach arbitrary files inside those message surfaces, and
|
|
80
|
+
* `initial_comment` cannot render Slack's full Markdown table/header
|
|
81
|
+
* support.
|
|
81
82
|
*/
|
|
82
83
|
interface SlackPostWithFiles {
|
|
83
84
|
readonly files?: readonly FileUpload[];
|
|
@@ -164,10 +165,10 @@ export interface SlackThread {
|
|
|
164
165
|
* becomes `{ card }`. Otherwise pass a {@link SlackPostInput}
|
|
165
166
|
* explicitly, any variant of which may carry `files`.
|
|
166
167
|
*
|
|
167
|
-
* With `files`, the channel runs Slack's three-step upload flow
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
*
|
|
168
|
+
* With `files`, the channel runs Slack's three-step upload flow. The
|
|
169
|
+
* `{ text }` variant attaches files with the text as the upload
|
|
170
|
+
* comment; `{ markdown }`, `{ blocks }`, and `{ card }` post the
|
|
171
|
+
* message first and upload files as a follow-up in the same thread.
|
|
171
172
|
*/
|
|
172
173
|
post(message: string | CardElement | SlackPostInput): Promise<SlackPostedMessage>;
|
|
173
174
|
/**
|
|
@@ -251,7 +252,8 @@ interface SlackBinding {
|
|
|
251
252
|
* Auto-anchor: when the binding starts without a `threadTs`, the first
|
|
252
253
|
* `chat.postMessage` adopts its own `ts` as the thread root, updating the
|
|
253
254
|
* live `threadTs` and firing `onThreadTsChanged` so the caller can
|
|
254
|
-
* persist the anchor. Ephemerals and
|
|
255
|
+
* persist the anchor. Ephemerals and upload-only file posts do not
|
|
256
|
+
* anchor.
|
|
255
257
|
*/
|
|
256
258
|
export declare function buildSlackBinding(input: {
|
|
257
259
|
readonly botToken: SlackBotToken | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createLogger,logError}from"#internal/logging.js";import{isCardElement}from"#compiled/chat/index.js";import{callSlackApi as callSlackApi$1,fetchSlackThreadReplies,postSlackEphemeral,postSlackMessage,resolveSlackBotToken as resolveSlackBotToken$1,uploadSlackFiles}from"#compiled/@chat-adapter/slack/api.js";import{cardToBlocks,cardToFallbackText}from"#public/channels/slack/blocks.js";import{truncateTypingStatus}from"#public/channels/slack/limits.js";import{
|
|
1
|
+
import{createLogger,logError}from"#internal/logging.js";import{isCardElement}from"#compiled/chat/index.js";import{callSlackApi as callSlackApi$1,fetchSlackThreadReplies,postSlackEphemeral,postSlackMessage,resolveSlackBotToken as resolveSlackBotToken$1,uploadSlackFiles}from"#compiled/@chat-adapter/slack/api.js";import{cardToBlocks,cardToFallbackText}from"#public/channels/slack/blocks.js";import{truncateTypingStatus}from"#public/channels/slack/limits.js";import{rewriteBareMentions,slackMrkdwnToGfm}from"#public/channels/slack/mrkdwn.js";const log=createLogger(`slack.api`);function slackContinuationToken(e,t){return`${e}:${t}`}async function resolveSlackBotToken(e){let t=e??process.env.SLACK_BOT_TOKEN;if(!t)throw Error(`SLACK_BOT_TOKEN is required.`);return resolveSlackBotToken$1(t)}async function callSlackApi(e){return callSlackApi$1(e.operation,normalizeSlackApiBody(e.body),createSlackApiOptions(e.botToken))}function createSlackRequester(e){return(t,n)=>callSlackApi({botToken:e,operation:t,body:n})}function buildSlackBinding(e){let n=createSlackRequester(e.botToken),r=[],s=e.threadTs;function handleMessageTs(t){s||t===s||(s=t,e.onThreadTsChanged?.(t))}async function uploadFiles(t,n){let r=n?.channelId??e.channelId,i=n?.threadTs??s;return uploadSlackFiles(t.map(toSlackFileUpload),{...createSlackApiOptions(e.botToken),channelId:r||void 0,initialComment:n?.initialComment,threadTs:i||void 0})}return{thread:{recentMessages:r,async post(t){let n=normalizePostInput(t),r=n.files??[],i=`blocks`in n||`card`in n||`markdown`in n;if(r.length>0&&!i){let e=await uploadFiles(r,{initialComment:`text`in n?rewriteBareMentions(n.text):void 0});return{id:Array.isArray(e.raw.files)&&e.raw.files.length>0?String(e.raw.files[0].id??``):``,raw:e.raw}}let a=await postSlackMessage(buildPostMessageOptions(n,e.channelId,s,e.botToken)),c=a.id;if(handleMessageTs(c),r.length>0&&i)try{await uploadFiles(r)}catch(e){log.warn(`file upload after message post failed`,{error:e})}return{id:c,raw:a.raw}},async postEphemeral(t,n){let r=await postSlackEphemeral({...buildPostMessageOptions(normalizePostInput(n),e.channelId,s,e.botToken),user:t});return{id:r.id,raw:r.raw}},async postDirectMessage(t,r){let i=await n(`conversations.open`,{users:t}),a=i.ok===!0?i.channel?.id:void 0;if(typeof a!=`string`||a.length===0)throw Error(`Slack conversations.open failed: ${i.error??`unknown_error`}`);let s=await postSlackMessage(buildPostMessageOptions(normalizePostInput(r),a,``,e.botToken));return{id:s.id,raw:s.raw}},async startTyping(r){if(!(!e.channelId||!s))try{let t=r===void 0?``:truncateTypingStatus(r),i={channel_id:e.channelId,thread_ts:s,status:t};t.length>0&&(i.loading_messages=[t]);let a=await n(`assistant.threads.setStatus`,i);a.ok!==!0&&log.warn(`assistant.threads.setStatus returned not-ok`,{error:a.error})}catch(n){logError(log,`startTyping threw — swallowed`,n,{channelId:e.channelId})}},async refresh(){if(r.length=0,!(!e.channelId||!s))try{let t=await fetchSlackThreadReplies({...createSlackApiOptions(e.botToken),channel:e.channelId,limit:50,ts:s});for(let e of t.messages)r.push(parseThreadMessage(e,s))}catch(n){logError(log,`refresh threw — swallowed`,n,{channelId:e.channelId})}},mentionUser(e){return`<@${e}>`}},slack:{channelId:e.channelId,get threadTs(){return s},teamId:e.teamId,request:n,uploadFiles}}}function normalizePostInput(e){return typeof e==`string`?{markdown:e}:isCardElement(e)?{card:e}:e}function buildPostMessageOptions(e,t,n,r){let i={...createSlackApiOptions(r),channel:t,threadTs:n||void 0,unfurlLinks:!1,unfurlMedia:!1};return`card`in e?(i.blocks=cardToBlocks(e.card),i.text=e.fallbackText??cardToFallbackText(e.card),i):`blocks`in e?(i.blocks=[...e.blocks],e.text!==void 0&&(i.text=e.text),i):`markdown`in e?(i.markdownText=rewriteBareMentions(e.markdown),i):(i.text=rewriteBareMentions(e.text),i)}function createSlackApiOptions(e){return{token:()=>resolveSlackBotToken(e)}}function normalizeSlackApiBody(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:{}}function toSlackFileUpload(e){return{data:normalizeFileData(e.data),filename:e.filename}}function normalizeFileData(e){if(e instanceof ArrayBuffer||typeof Blob<`u`&&e instanceof Blob)return e;if(ArrayBuffer.isView(e)){let t=e;return new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}return e}function parseThreadMessage(e,t){let n=typeof e.text==`string`?e.text:``,r=typeof e.ts==`string`?e.ts:``,i=typeof e.thread_ts==`string`?e.thread_ts:t,a=typeof e.user==`string`?e.user:void 0,o=typeof e.bot_id==`string`?e.bot_id:void 0;return{text:n,markdown:slackMrkdwnToGfm(n),user:a,botId:o,ts:r,threadTs:i,isMe:o!==void 0,raw:e}}export{buildSlackBinding,callSlackApi,resolveSlackBotToken,slackContinuationToken};
|
|
@@ -216,3 +216,40 @@ export declare function disableTool(): DisabledToolSentinel;
|
|
|
216
216
|
* produced by {@link disableTool}.
|
|
217
217
|
*/
|
|
218
218
|
export declare function isDisabledToolSentinel(value: unknown): value is DisabledToolSentinel;
|
|
219
|
+
/**
|
|
220
|
+
* Marker discriminator written into the {@link ExperimentalWorkflow} opt-in
|
|
221
|
+
* sentinel.
|
|
222
|
+
*/
|
|
223
|
+
declare const ENABLE_WORKFLOW_TOOL_SENTINEL_KIND = "eve:enable-workflow-tool";
|
|
224
|
+
/**
|
|
225
|
+
* Marker value re-exported as the default export of a file in `agent/tools/`
|
|
226
|
+
* (conventionally `agent/tools/workflow.ts`) to enable the framework `Workflow`
|
|
227
|
+
* orchestration tool. The tool is off unless this marker is present,
|
|
228
|
+
* mirroring the {@link disableTool} opt-out in reverse.
|
|
229
|
+
*/
|
|
230
|
+
export interface EnableWorkflowToolSentinel {
|
|
231
|
+
readonly kind: typeof ENABLE_WORKFLOW_TOOL_SENTINEL_KIND;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Opt-in marker for the framework `Workflow` tool, an isolated JavaScript sandbox whose
|
|
235
|
+
* only callable operations are this agent's subagents and remote agents, for
|
|
236
|
+
* orchestrating them from model-authored JavaScript. Re-export it as the
|
|
237
|
+
* default export of `agent/tools/workflow.ts`:
|
|
238
|
+
*
|
|
239
|
+
* ```ts
|
|
240
|
+
* export { ExperimentalWorkflow as default } from "eve/tools";
|
|
241
|
+
* ```
|
|
242
|
+
*
|
|
243
|
+
* Only the root session sees the `Workflow` tool — delegated subagent sessions
|
|
244
|
+
* never get it — and one Workflow program may dispatch at most
|
|
245
|
+
* `limits.maxSubagents` subagent calls (default 100).
|
|
246
|
+
*
|
|
247
|
+
* The capability is experimental. The resulting model-facing tool is still
|
|
248
|
+
* called `Workflow`.
|
|
249
|
+
*/
|
|
250
|
+
export declare const ExperimentalWorkflow: EnableWorkflowToolSentinel;
|
|
251
|
+
/**
|
|
252
|
+
* Type guard: returns whether `value` is the {@link ExperimentalWorkflow}
|
|
253
|
+
* opt-in sentinel.
|
|
254
|
+
*/
|
|
255
|
+
export declare function isEnableWorkflowToolSentinel(value: unknown): value is EnableWorkflowToolSentinel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{DYNAMIC_SENTINEL_KIND,TOOL_BRAND}from"#shared/dynamic-tool-definition.js";import{stampDefinitionKey}from"#public/tool-result-narrowing.js";function defineTool(e){if(e.auth!==void 0)throw Error(`defineTool: The "auth" field is no longer supported. Pass auth providers inline to ctx.getToken(provider) or ctx.requireAuth(provider).`);return Object.assign(e,{[TOOL_BRAND]:!0}),stampDefinitionKey(e,`tool:${e.description}`),e}function defineDynamic(t){let n={kind:DYNAMIC_SENTINEL_KIND,events:t.events};return stampDefinitionKey(n,`dynamic:${Object.keys(t.events).join(`,`)}`),n}const DISABLED_TOOL_SENTINEL_KIND=`eve:disabled-tool`;function disableTool(){return{kind:DISABLED_TOOL_SENTINEL_KIND}}function isDisabledToolSentinel(e){return typeof e==`object`&&!!e&&e.kind===DISABLED_TOOL_SENTINEL_KIND}export{defineDynamic,defineTool,disableTool,isDisabledToolSentinel};
|
|
1
|
+
import{DYNAMIC_SENTINEL_KIND,TOOL_BRAND}from"#shared/dynamic-tool-definition.js";import{stampDefinitionKey}from"#public/tool-result-narrowing.js";function defineTool(e){if(e.auth!==void 0)throw Error(`defineTool: The "auth" field is no longer supported. Pass auth providers inline to ctx.getToken(provider) or ctx.requireAuth(provider).`);return Object.assign(e,{[TOOL_BRAND]:!0}),stampDefinitionKey(e,`tool:${e.description}`),e}function defineDynamic(t){let n={kind:DYNAMIC_SENTINEL_KIND,events:t.events};return stampDefinitionKey(n,`dynamic:${Object.keys(t.events).join(`,`)}`),n}const DISABLED_TOOL_SENTINEL_KIND=`eve:disabled-tool`;function disableTool(){return{kind:DISABLED_TOOL_SENTINEL_KIND}}function isDisabledToolSentinel(e){return typeof e==`object`&&!!e&&e.kind===DISABLED_TOOL_SENTINEL_KIND}const ENABLE_WORKFLOW_TOOL_SENTINEL_KIND=`eve:enable-workflow-tool`,ExperimentalWorkflow=Object.freeze({kind:ENABLE_WORKFLOW_TOOL_SENTINEL_KIND});function isEnableWorkflowToolSentinel(e){return typeof e==`object`&&!!e&&e.kind===ENABLE_WORKFLOW_TOOL_SENTINEL_KIND}export{ExperimentalWorkflow,defineDynamic,defineTool,disableTool,isDisabledToolSentinel,isEnableWorkflowToolSentinel};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tool authoring helpers for `agent/tools/*.ts` files.
|
|
3
3
|
*/
|
|
4
|
-
export { type DisabledToolSentinel, defineDynamic, defineTool, disableTool, isDisabledToolSentinel, type ToolAuthOptions, type ToolAuthProvider, type ToolDefinition, type ToolContext, type ToolModelOutput, } from "#public/definitions/tool.js";
|
|
4
|
+
export { type DisabledToolSentinel, type EnableWorkflowToolSentinel, defineDynamic, defineTool, disableTool, isDisabledToolSentinel, isEnableWorkflowToolSentinel, ExperimentalWorkflow, type ToolAuthOptions, type ToolAuthProvider, type ToolDefinition, type ToolContext, type ToolModelOutput, } from "#public/definitions/tool.js";
|
|
5
5
|
export type { Approval, ApprovalContext, ApprovalStatus } from "#public/definitions/approval.js";
|
|
6
6
|
export type { DynamicToolEntry, DynamicEvents, DynamicToolEvents, DynamicResolveContext, DynamicSentinel, DynamicToolSet, DynamicToolResult, } from "#shared/dynamic-tool-definition.js";
|
|
7
7
|
export { type SessionContext } from "#public/definitions/callback-context.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{defineDynamic,defineTool,disableTool,isDisabledToolSentinel}from"#public/definitions/tool.js";import{toolResultFrom}from"#public/tool-result-narrowing.js";import{defineBashTool}from"#public/tools/define-bash-tool.js";import{defineGlobTool}from"#public/tools/define-glob-tool.js";import{defineGrepTool}from"#public/tools/define-grep-tool.js";import{defineReadFileTool}from"#public/tools/define-read-file-tool.js";import{defineWriteFileTool}from"#public/tools/define-write-file-tool.js";export{defineBashTool,defineDynamic,defineGlobTool,defineGrepTool,defineReadFileTool,defineTool,defineWriteFileTool,disableTool,isDisabledToolSentinel,toolResultFrom};
|
|
1
|
+
import{ExperimentalWorkflow,defineDynamic,defineTool,disableTool,isDisabledToolSentinel,isEnableWorkflowToolSentinel}from"#public/definitions/tool.js";import{toolResultFrom}from"#public/tool-result-narrowing.js";import{defineBashTool}from"#public/tools/define-bash-tool.js";import{defineGlobTool}from"#public/tools/define-glob-tool.js";import{defineGrepTool}from"#public/tools/define-grep-tool.js";import{defineReadFileTool}from"#public/tools/define-read-file-tool.js";import{defineWriteFileTool}from"#public/tools/define-write-file-tool.js";export{ExperimentalWorkflow,defineBashTool,defineDynamic,defineGlobTool,defineGrepTool,defineReadFileTool,defineTool,defineWriteFileTool,disableTool,isDisabledToolSentinel,isEnableWorkflowToolSentinel,toolResultFrom};
|
|
@@ -113,6 +113,9 @@ declare const runtimeToolResultActionResultSchema: z.ZodObject<{
|
|
|
113
113
|
}, z.core.$strict>;
|
|
114
114
|
/**
|
|
115
115
|
* Runtime-owned subagent result projected back into a harness resume call.
|
|
116
|
+
*
|
|
117
|
+
* `usage` carries the completed child session's token totals so the
|
|
118
|
+
* caller can attribute the subagent's spend.
|
|
116
119
|
*/
|
|
117
120
|
export type RuntimeSubagentResultActionResult = z.infer<typeof runtimeSubagentResultActionResultSchema>;
|
|
118
121
|
/**
|
|
@@ -124,6 +127,12 @@ declare const runtimeSubagentResultActionResultSchema: z.ZodObject<{
|
|
|
124
127
|
kind: z.ZodLiteral<"subagent-result">;
|
|
125
128
|
output: z.ZodType<import("../../shared/json.ts").JsonValue, unknown, z.core.$ZodTypeInternals<import("../../shared/json.ts").JsonValue, unknown>>;
|
|
126
129
|
subagentName: z.ZodString;
|
|
130
|
+
usage: z.ZodOptional<z.ZodObject<{
|
|
131
|
+
cacheReadTokens: z.ZodNumber;
|
|
132
|
+
cacheWriteTokens: z.ZodNumber;
|
|
133
|
+
inputTokens: z.ZodNumber;
|
|
134
|
+
outputTokens: z.ZodNumber;
|
|
135
|
+
}, z.core.$strip>>;
|
|
127
136
|
}, z.core.$strict>;
|
|
128
137
|
/**
|
|
129
138
|
* Runtime-owned action result produced by framework-owned loading code.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z}from"#compiled/zod/index.js";import{jsonObjectSchema,jsonValueSchema}from"#shared/json-schemas.js";const runtimeToolCallActionRequestSchema=z.object({callId:z.string(),input:jsonObjectSchema,kind:z.literal(`tool-call`),toolName:z.string()}).strict(),runtimeSubagentCallActionRequestSchema=z.object({callId:z.string(),description:z.string(),input:jsonObjectSchema,kind:z.literal(`subagent-call`),name:z.string(),nodeId:z.string(),subagentName:z.string()}).strict(),runtimeRemoteAgentCallActionRequestSchema=z.object({callId:z.string(),description:z.string(),input:jsonObjectSchema,kind:z.literal(`remote-agent-call`),name:z.string(),nodeId:z.string(),remoteAgentName:z.string()}).strict(),runtimeLoadSkillActionRequestSchema=z.object({callId:z.string(),input:jsonObjectSchema,kind:z.literal(`load-skill`)}).strict(),runtimeActionRequestSchema=z.discriminatedUnion(`kind`,[runtimeLoadSkillActionRequestSchema,runtimeRemoteAgentCallActionRequestSchema,runtimeSubagentCallActionRequestSchema,runtimeToolCallActionRequestSchema]);z.object({callId:z.string(),isError:z.boolean().optional(),kind:z.literal(`tool-result`),output:jsonValueSchema,toolName:z.string()}).strict(),z.object({callId:z.string(),isError:z.boolean().optional(),kind:z.literal(`subagent-result`),output:jsonValueSchema,subagentName:z.string()}).strict(),z.object({callId:z.string(),isError:z.boolean().optional(),kind:z.literal(`load-skill-result`),output:jsonValueSchema,name:z.string().optional()}).strict();export{runtimeActionRequestSchema,runtimeRemoteAgentCallActionRequestSchema,runtimeToolCallActionRequestSchema};
|
|
1
|
+
import{z}from"#compiled/zod/index.js";import{jsonObjectSchema,jsonValueSchema}from"#shared/json-schemas.js";import{tokenUsageSchema}from"#shared/token-usage.js";const runtimeToolCallActionRequestSchema=z.object({callId:z.string(),input:jsonObjectSchema,kind:z.literal(`tool-call`),toolName:z.string()}).strict(),runtimeSubagentCallActionRequestSchema=z.object({callId:z.string(),description:z.string(),input:jsonObjectSchema,kind:z.literal(`subagent-call`),name:z.string(),nodeId:z.string(),subagentName:z.string()}).strict(),runtimeRemoteAgentCallActionRequestSchema=z.object({callId:z.string(),description:z.string(),input:jsonObjectSchema,kind:z.literal(`remote-agent-call`),name:z.string(),nodeId:z.string(),remoteAgentName:z.string()}).strict(),runtimeLoadSkillActionRequestSchema=z.object({callId:z.string(),input:jsonObjectSchema,kind:z.literal(`load-skill`)}).strict(),runtimeActionRequestSchema=z.discriminatedUnion(`kind`,[runtimeLoadSkillActionRequestSchema,runtimeRemoteAgentCallActionRequestSchema,runtimeSubagentCallActionRequestSchema,runtimeToolCallActionRequestSchema]);z.object({callId:z.string(),isError:z.boolean().optional(),kind:z.literal(`tool-result`),output:jsonValueSchema,toolName:z.string()}).strict(),z.object({callId:z.string(),isError:z.boolean().optional(),kind:z.literal(`subagent-result`),output:jsonValueSchema,subagentName:z.string(),usage:tokenUsageSchema.optional()}).strict(),z.object({callId:z.string(),isError:z.boolean().optional(),kind:z.literal(`load-skill-result`),output:jsonValueSchema,name:z.string().optional()}).strict();export{runtimeActionRequestSchema,runtimeRemoteAgentCallActionRequestSchema,runtimeToolCallActionRequestSchema};
|
|
@@ -2,6 +2,7 @@ import type { PreparedRuntimeTool } from "#runtime/sessions/turn.js";
|
|
|
2
2
|
import type { ResolvedAgent } from "#runtime/types.js";
|
|
3
3
|
import type { WorkspaceRuntimeSpec } from "#runtime/workspace/types.js";
|
|
4
4
|
import type { InternalAgentModelDefinition } from "#shared/agent-definition.js";
|
|
5
|
+
import type { AvailableSkillDescription } from "#execution/skills/instructions.js";
|
|
5
6
|
/**
|
|
6
7
|
* Fixed internal model reference used only by the framework-owned bootstrap
|
|
7
8
|
* runtime path.
|
|
@@ -15,6 +16,7 @@ export type RuntimeModelReference = Readonly<InternalAgentModelDefinition>;
|
|
|
15
16
|
* Minimal runtime-owned agent shape prepared for one harness turn.
|
|
16
17
|
*/
|
|
17
18
|
export interface RuntimeTurnAgent {
|
|
19
|
+
readonly availableSkills?: readonly AvailableSkillDescription[];
|
|
18
20
|
readonly id: string;
|
|
19
21
|
readonly instructions: readonly string[];
|
|
20
22
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{composeRuntimeBasePrompt}from"#runtime/prompt/compose.js";const BOOTSTRAP_RUNTIME_MODEL_ID=`eve-bootstrap-model`,BOOTSTRAP_RUNTIME_SYSTEM_PROMPT=`You are the eve bootstrap agent. Be concise, stay grounded in the current conversation, and do not assume tools are available unless the runtime provides them.`;function createResolvedRuntimeTurnAgent(
|
|
1
|
+
import{composeRuntimeBasePrompt}from"#runtime/prompt/compose.js";const BOOTSTRAP_RUNTIME_MODEL_ID=`eve-bootstrap-model`,BOOTSTRAP_RUNTIME_SYSTEM_PROMPT=`You are the eve bootstrap agent. Be concise, stay grounded in the current conversation, and do not assume tools are available unless the runtime provides them.`;function createResolvedRuntimeTurnAgent(t){let n=t.agent;return{availableSkills:n.skills.map(e=>({description:e.description,name:e.name})),id:n.config.name,instructions:composeRuntimeBasePrompt({connections:n.connections,instructions:n.instructions,toolsAvailable:t.tools.length>0,workspaceSpec:n.workspaceSpec}),compactionModel:n.config.compaction?.model,model:n.config.model,nodeId:t.nodeId,outputSchema:n.config.outputSchema,reasoning:n.config.reasoning,tools:[...t.tools],workspaceSpec:n.workspaceSpec}}export{BOOTSTRAP_RUNTIME_MODEL_ID,BOOTSTRAP_RUNTIME_SYSTEM_PROMPT,createResolvedRuntimeTurnAgent};
|