eve 0.52.3 → 0.52.4
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 +13 -0
- package/dist/src/cli/commands/registry-add-command.d.ts +3 -0
- package/dist/src/cli/commands/registry-add-command.js +1 -0
- package/dist/src/cli/commands/registry-metadata.d.ts +4 -1
- package/dist/src/cli/commands/registry-metadata.js +1 -1
- package/dist/src/cli/commands/registry.d.ts +1 -2
- package/dist/src/cli/commands/registry.js +1 -1
- package/dist/src/compiled/.vendor-stamp.json +1 -1
- package/dist/src/compiler/extension-compatibility.d.ts +2 -2
- package/dist/src/compiler/extension-compatibility.js +1 -1
- package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
- package/dist/src/evals/reporters/index.d.ts +1 -0
- package/dist/src/evals/reporters/index.js +1 -1
- package/dist/src/evals/runner/reporters/datadog.d.ts +137 -0
- package/dist/src/evals/runner/reporters/datadog.js +3 -0
- package/dist/src/execution/parked-delivery-wait.js +1 -1
- package/dist/src/execution/sandbox/bindings/vercel-options.d.ts +10 -0
- package/dist/src/execution/sandbox/bindings/vercel-options.js +1 -0
- package/dist/src/execution/sandbox/bindings/vercel.js +2 -1
- package/dist/src/execution/sandbox/shell-quote.d.ts +1 -12
- package/dist/src/execution/sandbox/shell-quote.js +1 -1
- package/dist/src/execution/session-command-inbox.js +1 -1
- package/dist/src/execution/tasks/child/workflow.js +1 -1
- package/dist/src/execution/tasks/parent/tool-execution.js +1 -1
- package/dist/src/execution/tool-auth.d.ts +4 -32
- package/dist/src/execution/tool-auth.js +1 -1
- package/dist/src/execution/tools/connection-search.js +2 -2
- package/dist/src/execution/tools/sleep-workflow.js +1 -1
- package/dist/src/execution/tools/subagent/accept-event-step.d.ts +1 -1
- package/dist/src/execution/tools/subagent/accept-event-step.js +1 -1
- package/dist/src/execution/tools/subagent/invoke-agent.js +1 -1
- package/dist/src/execution/tools/subagent/invoke-step.js +1 -1
- package/dist/src/execution/tools/workflow/ask.d.ts +3 -2
- package/dist/src/execution/tools/workflow/ask.js +1 -1
- package/dist/src/execution/tools/workflow/authorization-completion.d.ts +3 -0
- package/dist/src/execution/tools/workflow/authorization-completion.js +1 -0
- package/dist/src/execution/tools/workflow/body.d.ts +2 -0
- package/dist/src/execution/tools/workflow/body.js +1 -1
- package/dist/src/execution/tools/workflow/step-context.d.ts +31 -0
- package/dist/src/execution/tools/workflow/step-context.js +1 -0
- package/dist/src/execution/tools/workflow/step-execution.d.ts +3 -0
- package/dist/src/execution/tools/workflow/step-execution.js +1 -0
- package/dist/src/execution/tools/workflow/step.d.ts +3 -0
- package/dist/src/execution/tools/workflow/step.js +1 -0
- package/dist/src/execution/turn-workflow-tool-run.js +1 -1
- package/dist/src/execution/wire/session-inbox-contract.d.ts +7 -0
- package/dist/src/execution/wire/session-inbox-contract.js +1 -1
- package/dist/src/execution/wire/session-inbox-resume.d.ts +2 -0
- package/dist/src/execution/wire/session-inbox-resume.js +1 -1
- package/dist/src/harness/authorization.d.ts +5 -2
- package/dist/src/harness/authorization.js +1 -1
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/internal/authored-definition/connection.js +1 -1
- package/dist/src/internal/authored-package-boundary.js +1 -1
- package/dist/src/internal/vercel/build-command.d.ts +2 -1
- package/dist/src/internal/vercel/build-command.js +1 -1
- package/dist/src/internal/workflow-bundle/builder-support.js +1 -1
- package/dist/src/internal/workflow-bundle/workflow-builders.js +1 -1
- package/dist/src/internal/workflow-bundle/workflow-transformer.d.ts +3 -5
- package/dist/src/internal/workflow-bundle/workflow-transformer.js +4 -3
- package/dist/src/public/channels/github/checkout.js +1 -1
- package/dist/src/public/channels/slack/activity.js +1 -1
- package/dist/src/runtime/authorization-context.d.ts +14 -0
- package/dist/src/runtime/authorization-context.js +1 -0
- package/dist/src/runtime/connections/mcp-client.js +1 -1
- package/dist/src/runtime/connections/scoped-authorization.d.ts +18 -2
- package/dist/src/runtime/connections/scoped-authorization.js +1 -1
- package/dist/src/runtime/resolve-connection.js +1 -1
- package/dist/src/runtime/sandbox/keys.js +1 -1
- package/dist/src/sandbox/backends/default.d.ts +2 -0
- package/dist/src/sandbox/backends/default.js +1 -1
- package/dist/src/self-modification/agent.d.ts +5 -2
- package/dist/src/self-modification/agent.js +1 -1
- package/dist/src/self-modification/config.d.ts +52 -0
- package/dist/src/self-modification/config.js +1 -0
- package/dist/src/self-modification/credentials.d.ts +18 -0
- package/dist/src/self-modification/credentials.js +1 -0
- package/dist/src/self-modification/extension/eve-add.d.ts +7 -2
- package/dist/src/self-modification/extension/eve-add.js +1 -1
- package/dist/src/self-modification/extension/extension.d.ts +46 -1
- package/dist/src/self-modification/extension/extension.js +1 -1
- package/dist/src/self-modification/extension/instructions.js +23 -9
- package/dist/src/self-modification/extension/production-registry-add.d.ts +42 -0
- package/dist/src/self-modification/extension/production-registry-add.js +1 -0
- package/dist/src/self-modification/extension/tools/edit_file.js +1 -1
- package/dist/src/self-modification/extension/tools/publish.d.ts +7 -0
- package/dist/src/self-modification/extension/tools/publish.js +1 -0
- package/dist/src/self-modification/extension/tools/registry_add.d.ts +39 -7
- package/dist/src/self-modification/extension/tools/registry_add.js +1 -1
- package/dist/src/self-modification/extension/tools/search_registry.d.ts +1 -0
- package/dist/src/self-modification/extension/tools/search_registry.js +1 -1
- package/dist/src/self-modification/filesystem.js +1 -1
- package/dist/src/self-modification/git-workspace.d.ts +31 -0
- package/dist/src/self-modification/git-workspace.js +1 -0
- package/dist/src/self-modification/git.d.ts +6 -0
- package/dist/src/self-modification/git.js +1 -0
- package/dist/src/self-modification/github-publisher.d.ts +27 -0
- package/dist/src/self-modification/github-publisher.js +2 -0
- package/dist/src/self-modification/identifiers.d.ts +4 -0
- package/dist/src/self-modification/identifiers.js +1 -0
- package/dist/src/self-modification/mode.d.ts +4 -0
- package/dist/src/self-modification/mode.js +1 -0
- package/dist/src/self-modification/network-policy.d.ts +1 -0
- package/dist/src/self-modification/network-policy.js +1 -0
- package/dist/src/self-modification/proposal.d.ts +39 -0
- package/dist/src/self-modification/proposal.js +2 -0
- package/dist/src/self-modification/sandbox.d.ts +25 -1
- package/dist/src/self-modification/sandbox.js +1 -1
- package/dist/src/self-modification/setup.d.ts +34 -0
- package/dist/src/self-modification/setup.js +22 -0
- package/dist/src/self-modification/workspace-lock.d.ts +2 -0
- package/dist/src/self-modification/workspace-lock.js +1 -0
- package/dist/src/setup/integrations/registry.js +1 -1
- package/dist/src/setup/integrations/runner.js +1 -1
- package/dist/src/setup/integrations/self-modification/setup.d.ts +29 -0
- package/dist/src/setup/integrations/self-modification/setup.js +1 -0
- package/dist/src/setup/integrations/types.d.ts +2 -0
- package/dist/src/setup/integrations/types.js +1 -1
- package/dist/src/setup/scaffold/create/project.js +1 -1
- package/dist/src/shared/empty-delivery.js +1 -1
- package/dist/src/shared/git.d.ts +16 -0
- package/dist/src/shared/git.js +1 -0
- package/dist/src/shared/shell-quote.d.ts +2 -0
- package/dist/src/shared/shell-quote.js +1 -0
- package/dist/src/shared/vercel-services.js +1 -1
- package/dist/src/tasks/session-index.d.ts +1 -1
- package/dist/src/tasks/session-index.js +1 -1
- package/dist/src/tasks/session-task-cohorts.d.ts +10 -0
- package/dist/src/tasks/session-task-cohorts.js +1 -0
- package/dist/src/tools/workflow-definition.d.ts +5 -2
- package/docs/concepts/sessions-runs-and-streaming.md +2 -0
- package/docs/evals/reporters.mdx +20 -1
- package/docs/sandbox.mdx +2 -0
- package/docs/subagents/index.mdx +10 -0
- package/docs/tools/workflows.mdx +61 -2
- package/package.json +17 -1
- package/dist/src/self-modification/extension/source-lock.d.ts +0 -2
- package/dist/src/self-modification/extension/source-lock.js +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# eve
|
|
2
2
|
|
|
3
|
+
## 0.52.4
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 97fccac: Dynamic tools with non-durable presentation labels now remain available and fall back to their tool names.
|
|
8
|
+
- d74fdb4: Add a Datadog eval reporter that creates one LLM Observability Experiment per eve eval run and submits eval assertion metrics through the optional `dd-trace` package. Opted-in eval inputs are pushed as versioned dataset records and linked to their experiment rows. The integration is tested against the public dataset and external Experiment APIs in `dd-trace@6.13.0`.
|
|
9
|
+
- 8946bd5: Enable configured deployments to edit an agent source checkout and publish changes as draft GitHub pull requests. Registry setup installs official registry items in the disposable checkout, provisions a repository-scoped Vercel Connect GitHub connector, and can continue without secrets in headless environments; manual and self-hosted deployments can use a fine-grained GitHub PAT.
|
|
10
|
+
- dc73dee: Keep sandbox template and session keys stable across unrelated agent changes when bootstrap has no skill or workspace seed files. Existing affected sandboxes switch to the corrected key on first use after upgrading.
|
|
11
|
+
- b3ce510: Only suppress a response when the empty-delivery marker is the entire response, apart from surrounding whitespace. Replies that quote or explain the marker are now delivered and retained in conversation history.
|
|
12
|
+
- 22046b2: Combine adjacent queued successful sibling completions into one parent turn, reducing redundant model calls while retaining every result. Batching happens automatically without waiting for unfinished tasks.
|
|
13
|
+
- 6d12a70: Forward inherited activity observation when background tasks start local or remote subagents, so their tool activity appears beneath the task row.
|
|
14
|
+
- f85de0d: Workflow tools can use the same requester-scoped `ctx.getToken` and `ctx.requireAuth` as ordinary tools inside step helpers, automatically waiting for sign-in and retrying the interrupted step. In background workflows, these APIs require a supporting session driver; older conversations fail before calling the auth provider with an instruction to start a new session.
|
|
15
|
+
|
|
3
16
|
## 0.52.3
|
|
4
17
|
|
|
5
18
|
### Patch Changes
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { type RegistryCommandLogger } from "./registry-recovery.js";
|
|
2
|
+
/** Adds registry namespace mappings to the project's package.json. */
|
|
3
|
+
export declare function runRegistryAddCommand(logger: RegistryCommandLogger, appRoot: string, mappings: readonly string[]): Promise<void>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{addRegistryMappings}from"./registry-project.js";import{runRegistryAction}from"./registry-recovery.js";async function runRegistryAddCommand(e,t,n){await runRegistryAction(e,t,async()=>{let r=await addRegistryMappings(t,n);for(let t of r.skippedBuiltIn)e.log(`Skipped ${t} because it is built in.`);for(let t of r.skippedExisting)e.log(`Skipped ${t} because it is already configured.`);r.added.length>0&&e.log(`Added ${r.added.join(`, `)} to package.json.`)})}export{runRegistryAddCommand};
|
|
@@ -6,6 +6,7 @@ declare const EveRegistryMetadataSchema: z.ZodObject<{
|
|
|
6
6
|
"chat-sdk": "chat-sdk";
|
|
7
7
|
native: "native";
|
|
8
8
|
}>>;
|
|
9
|
+
hidden: z.ZodOptional<z.ZodLiteral<true>>;
|
|
9
10
|
install: z.ZodOptional<z.ZodObject<{
|
|
10
11
|
pnpm: z.ZodOptional<z.ZodObject<{
|
|
11
12
|
buildScripts: z.ZodArray<z.ZodObject<{
|
|
@@ -44,12 +45,13 @@ declare const EveRegistryMetadataSchema: z.ZodObject<{
|
|
|
44
45
|
default: z.ZodDefault<z.ZodBoolean>;
|
|
45
46
|
}, z.core.$strip>>>;
|
|
46
47
|
}, z.core.$strip>;
|
|
47
|
-
export type RegistrySearchMetadata = Pick<z.infer<typeof EveRegistryMetadataSchema>, "docs" | "implementation">;
|
|
48
|
+
export type RegistrySearchMetadata = Pick<z.infer<typeof EveRegistryMetadataSchema>, "docs" | "hidden" | "implementation">;
|
|
48
49
|
/** Parses eve-owned metadata from a registry item manifest. */
|
|
49
50
|
export declare function eveMetadataFromRegistryItem(item: unknown): {
|
|
50
51
|
requires?: string | undefined;
|
|
51
52
|
docs?: string | undefined;
|
|
52
53
|
implementation?: "chat-sdk" | "native" | undefined;
|
|
54
|
+
hidden?: true | undefined;
|
|
53
55
|
install?: {
|
|
54
56
|
pnpm?: {
|
|
55
57
|
buildScripts: {
|
|
@@ -81,6 +83,7 @@ export declare function parseRegistryPresentationManifest(input: unknown): {
|
|
|
81
83
|
requires?: string | undefined;
|
|
82
84
|
docs?: string | undefined;
|
|
83
85
|
implementation?: "chat-sdk" | "native" | undefined;
|
|
86
|
+
hidden?: true | undefined;
|
|
84
87
|
install?: {
|
|
85
88
|
pnpm?: {
|
|
86
89
|
buildScripts: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{RegistryPackageComponentSchema}from"./registry-package.js";import{z}from"#compiled/zod/index.js";const RegistrySetupSchema=z.object({package:z.string().min(1),bin:z.string().min(1),args:z.array(z.string()).default([])}),ExactPackageNameSchema=z.string().regex(/^(?:@[a-z0-9][a-z0-9._~-]*\/)?[a-z0-9][a-z0-9._~-]*$/u),PnpmBuildScriptPolicySchema=z.object({packages:z.array(ExactPackageNameSchema).min(1),optional:z.literal(!0),recommendedAction:z.literal(`ignore-optional`),reason:z.string().min(1)}),EveRegistryMetadataSchema=z.object({requires:z.string().optional(),docs:z.string().min(1).optional(),implementation:z.enum([`native`,`chat-sdk`]).optional(),install:z.object({pnpm:z.object({buildScripts:z.array(PnpmBuildScriptPolicySchema).min(1)}).optional()}).optional(),setup:z.union([RegistrySetupSchema,z.array(RegistrySetupSchema).min(1)]).transform(e=>Array.isArray(e)?e:[e]).optional(),components:z.array(RegistryPackageComponentSchema).min(1).optional()}),EveRegistryItemMetadataSchema=z.object({meta:z.object({eve:EveRegistryMetadataSchema.optional()}).optional()}),OfficialRegistryCatalogSchema=z.object({items:z.array(z.object({name:z.string().min(1),meta:z.object({eve:EveRegistryMetadataSchema.optional()}).optional()}))}),RegistryPresentationManifestSchema=EveRegistryItemMetadataSchema.extend({title:z.string().optional(),description:z.string().optional(),dependencies:z.array(z.string()).optional(),files:z.array(z.object({target:z.string()})).optional()});function eveMetadataFromRegistryItem(e){return EveRegistryItemMetadataSchema.parse(e).meta?.eve}function parseOfficialRegistrySearchMetadata(e){let{items:t}=OfficialRegistryCatalogSchema.parse(e),n=new Map;for(let e of t){let{docs:t,implementation:
|
|
1
|
+
import{RegistryPackageComponentSchema}from"./registry-package.js";import{z}from"#compiled/zod/index.js";const RegistrySetupSchema=z.object({package:z.string().min(1),bin:z.string().min(1),args:z.array(z.string()).default([])}),ExactPackageNameSchema=z.string().regex(/^(?:@[a-z0-9][a-z0-9._~-]*\/)?[a-z0-9][a-z0-9._~-]*$/u),PnpmBuildScriptPolicySchema=z.object({packages:z.array(ExactPackageNameSchema).min(1),optional:z.literal(!0),recommendedAction:z.literal(`ignore-optional`),reason:z.string().min(1)}),EveRegistryMetadataSchema=z.object({requires:z.string().optional(),docs:z.string().min(1).optional(),implementation:z.enum([`native`,`chat-sdk`]).optional(),hidden:z.literal(!0).optional(),install:z.object({pnpm:z.object({buildScripts:z.array(PnpmBuildScriptPolicySchema).min(1)}).optional()}).optional(),setup:z.union([RegistrySetupSchema,z.array(RegistrySetupSchema).min(1)]).transform(e=>Array.isArray(e)?e:[e]).optional(),components:z.array(RegistryPackageComponentSchema).min(1).optional()}),EveRegistryItemMetadataSchema=z.object({meta:z.object({eve:EveRegistryMetadataSchema.optional()}).optional()}),OfficialRegistryCatalogSchema=z.object({items:z.array(z.object({name:z.string().min(1),meta:z.object({eve:EveRegistryMetadataSchema.optional()}).optional()}))}),RegistryPresentationManifestSchema=EveRegistryItemMetadataSchema.extend({title:z.string().optional(),description:z.string().optional(),dependencies:z.array(z.string()).optional(),files:z.array(z.object({target:z.string()})).optional()});function eveMetadataFromRegistryItem(e){return EveRegistryItemMetadataSchema.parse(e).meta?.eve}function parseOfficialRegistrySearchMetadata(e){let{items:t}=OfficialRegistryCatalogSchema.parse(e),n=new Map;for(let e of t){let{docs:t,hidden:r,implementation:i}=e.meta?.eve??{};(t!==void 0||r!==void 0||i!==void 0)&&n.set(e.name,{docs:t,hidden:r,implementation:i})}return n}function parseRegistryPresentationManifest(e){return RegistryPresentationManifestSchema.safeParse(e).data}export{eveMetadataFromRegistryItem,parseOfficialRegistrySearchMetadata,parseRegistryPresentationManifest};
|
|
@@ -3,6 +3,7 @@ import type { RegistrySetupCompletion } from "#setup/registry-setup-protocol.js"
|
|
|
3
3
|
import { type RegistryCommandLogger } from "./registry-recovery.js";
|
|
4
4
|
import type { runRegistrySetupCommand } from "./registry-setup-command.js";
|
|
5
5
|
import { prepareWebRegistryProject } from "./registry-project.js";
|
|
6
|
+
export { runRegistryAddCommand } from "./registry-add-command.js";
|
|
6
7
|
export type { RegistryCommandLogger } from "./registry-recovery.js";
|
|
7
8
|
export interface AddCommandOptions {
|
|
8
9
|
skipInstall?: boolean;
|
|
@@ -81,8 +82,6 @@ export declare function installRegistryItem(appRoot: string, item: string, optio
|
|
|
81
82
|
}>;
|
|
82
83
|
/** Installs an official, configured, or URL-addressed registry item. */
|
|
83
84
|
export declare function runAddCommand(logger: RegistryCommandLogger, appRoot: string, item: string, options: RunAddCommandOptions, dependencies?: AddCommandDependencies): Promise<RegistrySetupCompletion | false | undefined>;
|
|
84
|
-
/** Adds registry namespace mappings to the project's package.json. */
|
|
85
|
-
export declare function runRegistryAddCommand(logger: RegistryCommandLogger, appRoot: string, mappings: readonly string[]): Promise<void>;
|
|
86
85
|
/** Lists registry items from every configured source or one selected source. */
|
|
87
86
|
export declare function runRegistryListCommand(logger: RegistryCommandLogger, appRoot: string, source?: string, options?: RegistryCommandOptions): Promise<void>;
|
|
88
87
|
/** Searches registry items across every configured source or one selected source. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{hasInteractiveTerminal}from"./preconditions.js";import{serializeHeadlessSetupEvent}from"./setup-headless.js";import{runDeclaredSetups}from"./registry-declared-setups.js";import{installRegistryItemTransaction}from"./registry-install-transaction.js";import{prepareDeclaredPnpmBuildPolicy}from"./registry-pnpm-build-policy-flow.js";import{runRegistryPackage}from"./registry-package.js";import{eveMetadataFromRegistryItem,parseOfficialRegistrySearchMetadata}from"./registry-metadata.js";import{printRegistrySearchResults,registryViewText}from"./registry-presentation.js";import{addRegistryMappings,assertCanInstallWebChat,prepareWebRegistryProject,readRegistryConfig}from"./registry-project.js";import{errorMessage,reportRegistryCompletion,resolveRegistryItemForAdd,runRegistryAction,setupReminder,setupResumeCommand}from"./registry-recovery.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{createPrompter}from"#setup/prompter.js";import{WizardCancelledError}from"#setup/step.js";import{addRegistryItems,getRegistryItems,searchRegistries}from"#compiled/shadcn-registry/index.js";import semver from"#compiled/semver/index.js";const defaultAddCommandDependencies={createPrompter,hasInteractiveTerminal,loadSetupCommandRunner:async()=>(await import(`./registry-setup-command.js`)).runRegistrySetupCommand,prepareWebRegistryProject};function resolveOfficialRegistryUrl(e=process.env.EVE_DEV_OFFICIAL_REGISTRY_URL){if(e===void 0)return`https://eve.dev/r`;let t;try{t=new URL(e)}catch{throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`)}if(t.protocol!==`http:`&&t.protocol!==`https:`)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`);if(t.username!==``||t.password!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include credentials.`);if(t.search!==``||t.hash!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include a query or fragment.`);return t.pathname=t.pathname.replace(/\/+$/,``),t.toString().replace(/\/$/,``)}const OFFICIAL_REGISTRY=resolveOfficialRegistryUrl(),OFFICIAL_CATALOG=`${OFFICIAL_REGISTRY}/registry.json`,SKILLS_REGISTRY=`@skills`;function itemAddress(e){return e.startsWith(`@`)||/^https?:\/\//.test(e)?e:`${OFFICIAL_REGISTRY}/${e}.json`}async function installOfficialRegistryItem(e,t,n={}){let r=await readEveRegistryConfig(e);await addRegistryItems([itemAddress(t)],{config:r,cwd:e,overwrite:n.overwrite})}function assertCompatibleEveVersion(e){if(e===void 0)return;let t=resolveInstalledPackageInfo().version;if(semver.validRange(e)===null)throw Error(`Registry item has an invalid eve version requirement: ${e}.`);if(!semver.subset(t,e))throw Error(`This registry item requires eve ${e}, but this project is using eve ${t}. Upgrade eve and run the command again.`)}function isOfficialItemAddress(e){return e.startsWith(`${OFFICIAL_REGISTRY}/`)}function withBuiltInRegistries(e){return{...e,registries:{[SKILLS_REGISTRY]:`https://www.skills.sh/r/{name}?agent=eve`,...e.registries}}}async function readEveRegistryConfig(e){return withBuiltInRegistries(await readRegistryConfig(e))}function configuredRegistrySources(e){return Object.keys(e.registries??{})}function validateRegistrySource(e){if(e!==void 0&&!e.startsWith(`@`)&&!/^https?:\/\//.test(e))throw Error(`Registry sources must be a namespace or URL: ${e}`)}async function loadOfficialSearchMetadata(){let e=await fetch(OFFICIAL_CATALOG);if(!e.ok)throw Error(`Could not read the eve registry (${e.status}).`);return parseOfficialRegistrySearchMetadata(await e.json())}function searchItemAddress(e){return e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument}function enrichSearchItem(e,t){let n=searchItemAddress(e);return{item:e,address:n,...t.get(n)}}function registrySourceLabel(e){return e===OFFICIAL_CATALOG?`eve`:e===SKILLS_REGISTRY?`skills.sh`:e}function searchPresentationSections(e,t,n){return e.flatMap(e=>{let r=t.get(e);return r===void 0?[]:[{label:registrySourceLabel(e),items:r.items.map(e=>enrichSearchItem(e,n)),total:r.pagination.total}]})}async function printAddSuggestions(e,t,n){try{let r=n.split(`/`).at(-1)||n,{resultsBySource:i,sources:a,metadataByAddress:o}=await searchRegistryCatalog(t,{limit:5,query:r}),s=searchPresentationSections(a,i,o);if(s.every(e=>e.items.length===0))return;e.log(`Did you mean?`),printRegistrySearchResults(e,{query:r,sections:s})}catch{}}async function searchRegistryCatalog(e,t){validateRegistrySource(t.source);let n=await readEveRegistryConfig(e),r=t.source?[t.source]:[OFFICIAL_CATALOG,...configuredRegistrySources(n).filter(e=>t.query!==void 0||e!==SKILLS_REGISTRY)],i=await Promise.all(r.map(async e=>{try{return{result:await searchRegistries([e],{config:n,limit:t.limit??100,query:t.query}),source:e}}catch(t){return{error:t,source:e}}})),a=[],o=new Map;for(let e of i)if(`error`in e)a.push({message:errorMessage(e.error),registry:e.source});else{let t=e.result.errors??[];if(a.push(...t),t.length===0){let t=e.result.items.filter(t=>t.registry===e.source);o.set(e.source,{...e.result,items:t,pagination:{...e.result.pagination,total:e.result.items.length===t.length?e.result.pagination.total:0}})}}let s=new Map(a.map(e=>[`${e.registry}\0${e.message}`,e])),c=o.has(OFFICIAL_CATALOG)?await loadOfficialSearchMetadata():new Map,l=o.get(OFFICIAL_CATALOG);l!==void 0&&l.items.sort((e,t)=>{let rank=e=>c.get(searchItemAddress(e))?.implementation===`native`?0:1;return rank(e)-rank(t)});let u=[...o.values()];return{config:n,result:{items:u.flatMap(e=>e.items),pagination:{hasMore:u.some(e=>e.pagination.hasMore),limit:t.limit??100,offset:0,total:u.reduce((e,t)=>e+t.pagination.total,0)},...s.size>0?{errors:[...s.values()]}:{}},resultsBySource:o,sources:r,metadataByAddress:c}}async function browseRegistryCatalog(e,t={}){let{result:n}=await searchRegistryCatalog(e,t);return{items:n.items.map(e=>{let t={address:e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument,name:e.name,source:e.registry===OFFICIAL_CATALOG?`Vercel`:e.registry};return e.title!==void 0&&(t.title=e.title),e.type!==void 0&&(t.type=e.type),e.description!==void 0&&(t.description=e.description),t}),total:n.pagination.total,errors:n.errors??[]}}async function browseRegistryItems(e,t,n,r,i={}){let{result:a,resultsBySource:o,sources:s,metadataByAddress:c}=await searchRegistryCatalog(t,{limit:i.limit,query:n,source:r}),l=a.errors??[];if(i.json||o.size>0){let t=a.items.map(e=>({...e,...c.get(searchItemAddress(e))})),r={query:n,sections:searchPresentationSections(s,o,c)};i.json&&(r.json={...a,items:t}),printRegistrySearchResults(e,r)}for(let t of l)e.error(`${t.registry}: ${t.message}`);l.length>0&&(process.exitCode=1)}async function getRegistryItemManifest(e,t){let n=await readEveRegistryConfig(e),r=await getRegistryItems([itemAddress(t)],{config:n});return r.length===1?r[0]:r}async function installRegistryItem(e,t,n={},r=defaultAddCommandDependencies){let i,a=[],o={error:e=>{i=e},log:e=>a.push(e)},s=process.exitCode,c=await runAddCommand(o,e,t,{...n,yes:n.prompter===void 0||n.yes,setupAuthorized:n.prompter!==void 0},r);if(process.exitCode=s,i!==void 0)throw Error(i);if(c===!1)throw new WizardCancelledError;let l={output:a};return c!==void 0&&(l.setup=c),l}async function runAddCommand(e,t,n,r,i=defaultAddCommandDependencies){return runRegistryAction(e,t,async()=>{let a=itemAddress(n);a===itemAddress(`channel/web`)&&await assertCanInstallWebChat(t);let o=await readEveRegistryConfig(t);if(r.skipInstall===!0){if(r.overwrite===!0)throw Error(`--overwrite cannot be used with --skip-install.`);if(r.skipSetup===!0)throw Error(`--skip-install cannot be used with --skip-setup.`);if(!isOfficialItemAddress(a))throw Error(`Setup flows are currently supported only for official eve registry items.`)}let s=await resolveRegistryItemForAdd(e,async()=>(await getRegistryItems([a],{config:o}))[0],()=>printAddSuggestions(e,t,n));if(!s.found)return;let c=s.item,l=isOfficialItemAddress(a)?eveMetadataFromRegistryItem(c):void 0;if(assertCompatibleEveVersion(l?.requires),l?.components!==void 0){if(!isOfficialItemAddress(a))throw Error(`Registry packages require the official eve registry.`);let s=await runRegistryPackage({logger:e,appRoot:t,item:n,components:l.components,config:o,options:r,dependencies:i,operations:{itemAddress,metadata:eveMetadataFromRegistryItem,assertCompatibleVersion:assertCompatibleEveVersion,runSetups:({item:n,setups:a,prompter:o})=>runDeclaredSetups({logger:e,appRoot:t,item:n,setups:a,options:{yes:r.yes,force:r.overwrite,nonInteractive:r.nonInteractive,answers:r.answers,prompter:o,signal:r.signal},dependencies:i,cancelledReminder:setupReminder(n,`cancelled`),resumeCommand:setupResumeCommand(n)}),setupReminder:e=>setupReminder(e,`skipped`)}});return reportRegistryCompletion(e,n,s,r)}if(r.skipInstall===!0){if(l?.setup===void 0)throw Error(`Registry item "${n}" does not declare a setup flow.`);let a=await runDeclaredSetups({logger:e,appRoot:t,item:n,setups:l.setup,options:r,dependencies:i,cancelledReminder:setupReminder(n,`cancelled`),resumeCommand:setupResumeCommand(n)});return reportRegistryCompletion(e,n,a,r)}if(!await prepareDeclaredPnpmBuildPolicy({logger:e,appRoot:t,item:n,policies:l?.install?.pnpm?.buildScripts,options:r}))return!1;if(a===itemAddress(`channel/web`)&&await(i.prepareWebRegistryProject??prepareWebRegistryProject)(t),await installRegistryItemTransaction({appRoot:t,item:n,registryItem:c,nonInteractive:r.nonInteractive,logger:e,install:async()=>{await addRegistryItems([a],{config:o,cwd:t,overwrite:r.overwrite,silent:r.silent})}}),l?.setup===void 0)return reportRegistryCompletion(e,n,{facts:[]},r);let u=i.hasInteractiveTerminal?.()??defaultAddCommandDependencies.hasInteractiveTerminal();if(r.nonInteractive&&e.log(serializeHeadlessSetupEvent({version:1,type:`progress`,message:r.skipInstall?`Setup ${n}`:`Installed ${n}`})),r.skipSetup===!0){if(r.nonInteractive)return reportRegistryCompletion(e,n,{facts:[]},r);e.log(setupReminder(n,`skipped`));return}if(!r.nonInteractive&&!r.yes&&!u&&r.setupAuthorized!==!0){e.log(setupReminder(n,`skipped`));return}if(!r.nonInteractive&&!r.yes&&r.setupAuthorized!==!0)try{if(await(r.prompter??i.createPrompter?.()??defaultAddCommandDependencies.createPrompter()).select({message:`Set up ${n} now?`,initialValue:`yes`,options:[{value:`yes`,label:`Yes`},{value:`no`,label:`No`}]})===`no`){e.log(setupReminder(n,`skipped`));return}}catch(t){if(!(t instanceof WizardCancelledError))throw t;e.log(setupReminder(n,`cancelled`));return}let d=await runDeclaredSetups({logger:e,appRoot:t,item:n,setups:l.setup,options:{...r,force:r.overwrite},dependencies:i,cancelledReminder:setupReminder(n,`cancelled`),resumeCommand:setupResumeCommand(n)});return reportRegistryCompletion(e,n,d,r)})}async function runRegistryAddCommand(e,t,n){await runRegistryAction(e,t,async()=>{let r=await addRegistryMappings(t,n);for(let t of r.skippedBuiltIn)e.log(`Skipped ${t} because it is built in.`);for(let t of r.skippedExisting)e.log(`Skipped ${t} because it is already configured.`);r.added.length>0&&e.log(`Added ${r.added.join(`, `)} to package.json.`)})}async function runRegistryListCommand(e,t,n,r={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,void 0,n,r))}async function runRegistrySearchCommand(e,t,n,r,i={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,n,r,{...i,limit:i.limit??10}))}async function runRegistryViewCommand(e,t,n,r={}){await runRegistryAction(e,t,async()=>{let i=await readEveRegistryConfig(t),a=await getRegistryItems([itemAddress(n)],{config:i}),o=a.length===1?a[0]:a;e.log(r.json?JSON.stringify(o,null,2):registryViewText(n,o))})}export{browseRegistryCatalog,getRegistryItemManifest,installOfficialRegistryItem,installRegistryItem,resolveOfficialRegistryUrl,runAddCommand,runRegistryAddCommand,runRegistryListCommand,runRegistrySearchCommand,runRegistryViewCommand};
|
|
1
|
+
import{hasInteractiveTerminal}from"./preconditions.js";import{serializeHeadlessSetupEvent}from"./setup-headless.js";import{assertCanInstallWebChat,prepareWebRegistryProject,readRegistryConfig}from"./registry-project.js";import{errorMessage,reportRegistryCompletion,resolveRegistryItemForAdd,runRegistryAction,setupReminder,setupResumeCommand}from"./registry-recovery.js";import{runRegistryAddCommand}from"./registry-add-command.js";import{runDeclaredSetups}from"./registry-declared-setups.js";import{installRegistryItemTransaction}from"./registry-install-transaction.js";import{prepareDeclaredPnpmBuildPolicy}from"./registry-pnpm-build-policy-flow.js";import{runRegistryPackage}from"./registry-package.js";import{eveMetadataFromRegistryItem,parseOfficialRegistrySearchMetadata}from"./registry-metadata.js";import{printRegistrySearchResults,registryViewText}from"./registry-presentation.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{createPrompter}from"#setup/prompter.js";import{WizardCancelledError}from"#setup/step.js";import{addRegistryItems,getRegistryItems,searchRegistries}from"#compiled/shadcn-registry/index.js";import semver from"#compiled/semver/index.js";const defaultAddCommandDependencies={createPrompter,hasInteractiveTerminal,loadSetupCommandRunner:async()=>(await import(`./registry-setup-command.js`)).runRegistrySetupCommand,prepareWebRegistryProject};function resolveOfficialRegistryUrl(e=process.env.EVE_DEV_OFFICIAL_REGISTRY_URL){if(e===void 0)return`https://eve.dev/r`;let t;try{t=new URL(e)}catch{throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`)}if(t.protocol!==`http:`&&t.protocol!==`https:`)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`);if(t.username!==``||t.password!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include credentials.`);if(t.search!==``||t.hash!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include a query or fragment.`);return t.pathname=t.pathname.replace(/\/+$/,``),t.toString().replace(/\/$/,``)}const OFFICIAL_REGISTRY=resolveOfficialRegistryUrl(),OFFICIAL_CATALOG=`${OFFICIAL_REGISTRY}/registry.json`,SKILLS_REGISTRY=`@skills`;function itemAddress(e){return e.startsWith(`@`)||/^https?:\/\//.test(e)?e:`${OFFICIAL_REGISTRY}/${e}.json`}async function installOfficialRegistryItem(e,t,n={}){let r=await readEveRegistryConfig(e);await addRegistryItems([itemAddress(t)],{config:r,cwd:e,overwrite:n.overwrite})}function assertCompatibleEveVersion(e){if(e===void 0)return;let t=resolveInstalledPackageInfo().version;if(semver.validRange(e)===null)throw Error(`Registry item has an invalid eve version requirement: ${e}.`);if(!semver.subset(t,e))throw Error(`This registry item requires eve ${e}, but this project is using eve ${t}. Upgrade eve and run the command again.`)}function isOfficialItemAddress(e){return e.startsWith(`${OFFICIAL_REGISTRY}/`)}function withBuiltInRegistries(e){return{...e,registries:{[SKILLS_REGISTRY]:`https://www.skills.sh/r/{name}?agent=eve`,...e.registries}}}async function readEveRegistryConfig(e){return withBuiltInRegistries(await readRegistryConfig(e))}function configuredRegistrySources(e){return Object.keys(e.registries??{})}function validateRegistrySource(e){if(e!==void 0&&!e.startsWith(`@`)&&!/^https?:\/\//.test(e))throw Error(`Registry sources must be a namespace or URL: ${e}`)}async function loadOfficialSearchMetadata(){let e=await fetch(OFFICIAL_CATALOG);if(!e.ok)throw Error(`Could not read the eve registry (${e.status}).`);return parseOfficialRegistrySearchMetadata(await e.json())}function searchItemAddress(e){return e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument}function enrichSearchItem(e,t){let n=searchItemAddress(e);return{item:e,address:n,...t.get(n)}}function registrySourceLabel(e){return e===OFFICIAL_CATALOG?`eve`:e===SKILLS_REGISTRY?`skills.sh`:e}function searchPresentationSections(e,t,n){return e.flatMap(e=>{let r=t.get(e);return r===void 0?[]:[{label:registrySourceLabel(e),items:r.items.map(e=>enrichSearchItem(e,n)),total:r.pagination.total}]})}async function printAddSuggestions(e,t,n){try{let r=n.split(`/`).at(-1)||n,{resultsBySource:i,sources:a,metadataByAddress:o}=await searchRegistryCatalog(t,{limit:5,query:r}),s=searchPresentationSections(a,i,o);if(s.every(e=>e.items.length===0))return;e.log(`Did you mean?`),printRegistrySearchResults(e,{query:r,sections:s})}catch{}}async function searchRegistryCatalog(e,t){validateRegistrySource(t.source);let n=await readEveRegistryConfig(e),r=t.source?[t.source]:[OFFICIAL_CATALOG,...configuredRegistrySources(n).filter(e=>t.query!==void 0||e!==SKILLS_REGISTRY)],i=await Promise.all(r.map(async e=>{try{return{result:await searchRegistries([e],{config:n,limit:t.limit??100,query:t.query}),source:e}}catch(t){return{error:t,source:e}}})),a=[],o=new Map;for(let e of i)if(`error`in e)a.push({message:errorMessage(e.error),registry:e.source});else{let t=e.result.errors??[];if(a.push(...t),t.length===0){let t=e.result.items.filter(t=>t.registry===e.source);o.set(e.source,{...e.result,items:t,pagination:{...e.result.pagination,total:e.result.items.length===t.length?e.result.pagination.total:0}})}}let s=new Map(a.map(e=>[`${e.registry}\0${e.message}`,e])),c=o.has(OFFICIAL_CATALOG)?await loadOfficialSearchMetadata():new Map,l=o.get(OFFICIAL_CATALOG);if(l!==void 0){let e=l.items.filter(e=>c.get(searchItemAddress(e))?.hidden!==!0);l.items=e,l.pagination={...l.pagination,total:e.length},l.items.sort((e,t)=>{let rank=e=>c.get(searchItemAddress(e))?.implementation===`native`?0:1;return rank(e)-rank(t)})}let u=[...o.values()];return{config:n,result:{items:u.flatMap(e=>e.items),pagination:{hasMore:u.some(e=>e.pagination.hasMore),limit:t.limit??100,offset:0,total:u.reduce((e,t)=>e+t.pagination.total,0)},...s.size>0?{errors:[...s.values()]}:{}},resultsBySource:o,sources:r,metadataByAddress:c}}async function browseRegistryCatalog(e,t={}){let{result:n}=await searchRegistryCatalog(e,t);return{items:n.items.map(e=>{let t={address:e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument,name:e.name,source:e.registry===OFFICIAL_CATALOG?`Vercel`:e.registry};return e.title!==void 0&&(t.title=e.title),e.type!==void 0&&(t.type=e.type),e.description!==void 0&&(t.description=e.description),t}),total:n.pagination.total,errors:n.errors??[]}}async function browseRegistryItems(e,t,n,r,i={}){let{result:a,resultsBySource:o,sources:s,metadataByAddress:c}=await searchRegistryCatalog(t,{limit:i.limit,query:n,source:r}),l=a.errors??[];if(i.json||o.size>0){let t=a.items.map(e=>({...e,...c.get(searchItemAddress(e))})),r={query:n,sections:searchPresentationSections(s,o,c)};i.json&&(r.json={...a,items:t}),printRegistrySearchResults(e,r)}for(let t of l)e.error(`${t.registry}: ${t.message}`);l.length>0&&(process.exitCode=1)}async function getRegistryItemManifest(e,t){let n=await readEveRegistryConfig(e),r=await getRegistryItems([itemAddress(t)],{config:n});return r.length===1?r[0]:r}async function installRegistryItem(e,t,n={},r=defaultAddCommandDependencies){let i,a=[],o={error:e=>{i=e},log:e=>a.push(e)},s=process.exitCode,c=await runAddCommand(o,e,t,{...n,yes:n.prompter===void 0||n.yes,setupAuthorized:n.prompter!==void 0},r);if(process.exitCode=s,i!==void 0)throw Error(i);if(c===!1)throw new WizardCancelledError;let l={output:a};return c!==void 0&&(l.setup=c),l}async function runAddCommand(e,t,n,r,i=defaultAddCommandDependencies){return runRegistryAction(e,t,async()=>{let a=itemAddress(n);a===itemAddress(`channel/web`)&&await assertCanInstallWebChat(t);let o=await readEveRegistryConfig(t);if(r.skipInstall===!0){if(r.overwrite===!0)throw Error(`--overwrite cannot be used with --skip-install.`);if(r.skipSetup===!0)throw Error(`--skip-install cannot be used with --skip-setup.`);if(!isOfficialItemAddress(a))throw Error(`Setup flows are currently supported only for official eve registry items.`)}let s=await resolveRegistryItemForAdd(e,async()=>(await getRegistryItems([a],{config:o}))[0],()=>printAddSuggestions(e,t,n));if(!s.found)return;let c=s.item,l=isOfficialItemAddress(a)?eveMetadataFromRegistryItem(c):void 0;if(assertCompatibleEveVersion(l?.requires),l?.components!==void 0){if(!isOfficialItemAddress(a))throw Error(`Registry packages require the official eve registry.`);let s=await runRegistryPackage({logger:e,appRoot:t,item:n,components:l.components,config:o,options:r,dependencies:i,operations:{itemAddress,metadata:eveMetadataFromRegistryItem,assertCompatibleVersion:assertCompatibleEveVersion,runSetups:({item:n,setups:a,prompter:o})=>runDeclaredSetups({logger:e,appRoot:t,item:n,setups:a,options:{yes:r.yes,force:r.overwrite,nonInteractive:r.nonInteractive,answers:r.answers,prompter:o,signal:r.signal},dependencies:i,cancelledReminder:setupReminder(n,`cancelled`),resumeCommand:setupResumeCommand(n)}),setupReminder:e=>setupReminder(e,`skipped`)}});return reportRegistryCompletion(e,n,s,r)}if(r.skipInstall===!0){if(l?.setup===void 0)throw Error(`Registry item "${n}" does not declare a setup flow.`);let a=await runDeclaredSetups({logger:e,appRoot:t,item:n,setups:l.setup,options:r,dependencies:i,cancelledReminder:setupReminder(n,`cancelled`),resumeCommand:setupResumeCommand(n)});return reportRegistryCompletion(e,n,a,r)}if(!await prepareDeclaredPnpmBuildPolicy({logger:e,appRoot:t,item:n,policies:l?.install?.pnpm?.buildScripts,options:r}))return!1;if(a===itemAddress(`channel/web`)&&await(i.prepareWebRegistryProject??prepareWebRegistryProject)(t),await installRegistryItemTransaction({appRoot:t,item:n,registryItem:c,nonInteractive:r.nonInteractive,logger:e,install:async()=>{await addRegistryItems([a],{config:o,cwd:t,overwrite:r.overwrite,silent:r.silent})}}),l?.setup===void 0)return reportRegistryCompletion(e,n,{facts:[]},r);let u=i.hasInteractiveTerminal?.()??defaultAddCommandDependencies.hasInteractiveTerminal();if(r.nonInteractive&&e.log(serializeHeadlessSetupEvent({version:1,type:`progress`,message:r.skipInstall?`Setup ${n}`:`Installed ${n}`})),r.skipSetup===!0){if(r.nonInteractive)return reportRegistryCompletion(e,n,{facts:[]},r);e.log(setupReminder(n,`skipped`));return}if(!r.nonInteractive&&!r.yes&&!u&&r.setupAuthorized!==!0){e.log(setupReminder(n,`skipped`));return}if(!r.nonInteractive&&!r.yes&&r.setupAuthorized!==!0)try{if(await(r.prompter??i.createPrompter?.()??defaultAddCommandDependencies.createPrompter()).select({message:`Set up ${n} now?`,initialValue:`yes`,options:[{value:`yes`,label:`Yes`},{value:`no`,label:`No`}]})===`no`){e.log(setupReminder(n,`skipped`));return}}catch(t){if(!(t instanceof WizardCancelledError))throw t;e.log(setupReminder(n,`cancelled`));return}let d=await runDeclaredSetups({logger:e,appRoot:t,item:n,setups:l.setup,options:{...r,force:r.overwrite},dependencies:i,cancelledReminder:setupReminder(n,`cancelled`),resumeCommand:setupResumeCommand(n)});return reportRegistryCompletion(e,n,d,r)})}async function runRegistryListCommand(e,t,n,r={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,void 0,n,r))}async function runRegistrySearchCommand(e,t,n,r,i={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,n,r,{...i,limit:i.limit??10}))}async function runRegistryViewCommand(e,t,n,r={}){await runRegistryAction(e,t,async()=>{let i=await readEveRegistryConfig(t),a=await getRegistryItems([itemAddress(n)],{config:i}),o=a.length===1?a[0]:a;e.log(r.json?JSON.stringify(o,null,2):registryViewText(n,o))})}export{browseRegistryCatalog,getRegistryItemManifest,installOfficialRegistryItem,installRegistryItem,resolveOfficialRegistryUrl,runAddCommand,runRegistryAddCommand,runRegistryListCommand,runRegistrySearchCommand,runRegistryViewCommand};
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"zod": "4.5.4",
|
|
54
54
|
"zod-validation-error": "5.0.0"
|
|
55
55
|
},
|
|
56
|
-
"scriptHash": "
|
|
56
|
+
"scriptHash": "e740f8c7ef9c2c6d66093b6e5f205d1f44d5c5ef5a04ddd68197b03c79cbe8e8",
|
|
57
57
|
"toolVersions": {
|
|
58
58
|
"rolldown": "1.2.7",
|
|
59
59
|
"typescript": "7.0.2"
|
|
@@ -11,8 +11,8 @@ declare const EXTENSION_CAPABILITY_CONTRACTS: {
|
|
|
11
11
|
readonly dropped: {};
|
|
12
12
|
};
|
|
13
13
|
readonly tool: {
|
|
14
|
-
readonly current:
|
|
15
|
-
readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 28, 29, 30, 31, 32];
|
|
14
|
+
readonly current: 33;
|
|
15
|
+
readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 28, 29, 30, 31, 32, 33];
|
|
16
16
|
readonly dropped: {
|
|
17
17
|
readonly 14: "TaskExec.delegated was removed; migrate to workflow-backed background tools";
|
|
18
18
|
readonly 15: "TaskExec replaces stageEffect with send";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readFile,writeFile}from"node:fs/promises";import{z}from"#compiled/zod/index.js";import{join}from"node:path";import{formatValidationError}from"#runtime/validation.js";const EXTENSION_COMPATIBILITY_MANIFEST_KIND=`eve-extension`,EXTENSION_COMPATIBILITY_MANIFEST_FORMAT_VERSION=2,EXTENSION_COMPATIBILITY_MANIFEST_FILENAME=`_manifest.json`,EXTENSION_CAPABILITY_CONTRACTS={extension:{current:1,supported:[1],dropped:{}},tool:{current:
|
|
1
|
+
import{readFile,writeFile}from"node:fs/promises";import{z}from"#compiled/zod/index.js";import{join}from"node:path";import{formatValidationError}from"#runtime/validation.js";const EXTENSION_COMPATIBILITY_MANIFEST_KIND=`eve-extension`,EXTENSION_COMPATIBILITY_MANIFEST_FORMAT_VERSION=2,EXTENSION_COMPATIBILITY_MANIFEST_FILENAME=`_manifest.json`,EXTENSION_CAPABILITY_CONTRACTS={extension:{current:1,supported:[1],dropped:{}},tool:{current:33,supported:[1,2,3,4,5,6,7,8,9,10,11,12,13,28,29,30,31,32,33],dropped:{14:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,15:`TaskExec replaces stageEffect with send`,16:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,17:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,18:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,19:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,20:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,21:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,22:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,23:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,24:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,25:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,26:`Background tools now use task yield descriptors`,27:`TaskExec.delegated was removed; migrate to workflow-backed background tools`}},dynamicTool:{current:31,supported:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,22,28,29,30,31],dropped:{21:`Message and reasoning append events now expose deltas instead of cumulative snapshots.`,23:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,24:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,25:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,26:`Background tools now use task yield descriptors`,27:`TaskExec.delegated was removed; migrate to workflow-backed background tools`}},channel:{current:19,supported:[1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19],dropped:{12:`Message and reasoning append events now expose deltas instead of cumulative snapshots.`}},schedule:{current:11,supported:[1,2,3,4,6,7,8,9,10,11],dropped:{5:`Message and reasoning append events now expose deltas instead of cumulative snapshots.`}},subagent:{current:10,supported:[3,4,6,7,8,9,10],dropped:{1:`Persistent subagent sessions are now the default and the experimental opt-in was removed`,2:`Persistent subagent sessions are now the default and the experimental opt-in was removed`,5:`Message and reasoning append events now expose deltas instead of cumulative snapshots.`}},connection:{current:15,supported:[1,2,3,4,5,6,7,8,11,12,13,14,15],dropped:{9:`Dynamic connection resolvers no longer receive conversation or channel continuation data`,10:`Message and reasoning append events now expose deltas instead of cumulative snapshots.`}},hook:{current:22,supported:[10,11,12,13,14,15,17,18,19,20,21,22],dropped:{1:`Model identity moved from session.started runtime metadata to step.started call attribution.`,2:`Model identity moved from session.started runtime metadata to step.started call attribution.`,3:`Model identity moved from session.started runtime metadata to step.started call attribution.`,4:`Model identity moved from session.started runtime metadata to step.started call attribution.`,5:`Model identity moved from session.started runtime metadata to step.started call attribution.`,6:`Model identity moved from session.started runtime metadata to step.started call attribution.`,7:`Model identity moved from session.started runtime metadata to step.started call attribution.`,8:`Model identity moved from session.started runtime metadata to step.started call attribution.`,9:`Model identity moved from session.started runtime metadata to step.started call attribution.`,16:`Message and reasoning append events now expose deltas instead of cumulative snapshots.`}},skill:{current:1,supported:[1],dropped:{}},dynamicSkill:{current:17,supported:[1,2,3,4,5,6,7,8,9,10,11,12,14,15,16,17],dropped:{13:`Message and reasoning append events now expose deltas instead of cumulative snapshots.`}},instructions:{current:2,supported:[1,2],dropped:{}},dynamicInstructions:{current:18,supported:[1,2,3,4,5,6,7,8,9,10,11,12,13,15,16,17,18],dropped:{14:`Message and reasoning append events now expose deltas instead of cumulative snapshots.`}},config:{current:1,supported:[1],dropped:{}},state:{current:5,supported:[1,2,3,4,5],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),{}),extensionCompatibilityManifestV1Schema=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(),extensionCompatibilityManifestV2Schema=extensionCompatibilityManifestV1Schema.extend({formatVersion:z.literal(2),build:z.object({externalDependencies:z.array(z.string().min(1)).readonly()}).strict().optional()}),extensionCompatibilityManifestSchema=z.union([extensionCompatibilityManifestV1Schema,extensionCompatibilityManifestV2Schema]);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,t){await writeFile(join(e,EXTENSION_COMPATIBILITY_MANIFEST_FILENAME),serializeExtensionCompatibilityManifest(t),`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{contextStorage}from"#context/container.js";import{SessionDynamicToolMetadataKey,SessionDynamicToolRuntimeRevisionKey,SessionIdKey,StepDynamicToolMetadataKey,TurnDynamicToolMetadataKey}from"#context/keys.js";import{toErrorMessage}from"#shared/errors.js";import{serializeInputSchema,serializeOutputSchema}from"#tools/schema.js";import{parseJsonObject}from"#shared/json.js";import{ALLOWED_DYNAMIC_TOOL_EVENTS}from"#dynamic/definition.js";import{isCurrentDynamicToolMetadata,toCurrentDynamicToolMetadataList}from"#context/dynamic-tool-metadata.js";import{clearDurableDynamicCallbacks,hasUnregisteredDurableDynamicCallbacks,readDurableDynamicToolCallbacks,registerDurableDynamicCallback}from"#tools/durable-callbacks.js";import{buildResolveContext}from"#context/dynamic-resolve-context.js";import{isWorkflowToolDefinition}from"#tools/workflow-definition.js";import{replayDynamicTools}from"#context/build-dynamic-tools.js";import{isBrandedToolEntry}from"#tools/dynamic.js";const log=createLogger(`dynamic-tools`);function qualifyDynamicToolNames(e,t,n){let r=Object.keys(n);if(r.length===0)return[];if(t){let t=r[0];return[{name:e.slug,entryKey:t,entry:n[t]}]}let i=e.extensionNamespace===void 0?``:`${e.extensionNamespace}__`;return r.map(e=>({entry:n[e],entryKey:e,name:`${i}${e}`}))}function replayDynamicSessionTools(e,t,n){return replayDynamicTools(e,{sessionId:n,scope:`session`})}function durableKeyForEvent(e){switch(e){case`session.started`:return SessionDynamicToolMetadataKey;case`turn.started`:return TurnDynamicToolMetadataKey;case`step.started`:return StepDynamicToolMetadataKey;default:return}}function readDynamicToolResult(e,t){let assertOrdinaryTool=t=>{if(isWorkflowToolDefinition(t))throw Error(`Dynamic tool resolver "${e.logicalPath}" cannot return defineWorkflowTool(). Workflow tools must be static tools; use defineTool() for dynamic entries.`)};if(assertOrdinaryTool(t),isBrandedToolEntry(t))return{entries:{_single:t},isSingle:!0};if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`Dynamic tool resolver "${e.logicalPath}" must return defineTool(), a map of defineTool() values, or null.`);let n={};for(let[r,i]of Object.entries(t)){if(assertOrdinaryTool(i),!isBrandedToolEntry(i))throw Error(`Dynamic tool resolver "${e.logicalPath}" returned "${r}" without defineTool(). Wrap every dynamic tool entry in defineTool().`);n[r]=i}return{entries:n,isSingle:!1}}function validateReference(e){if(e.stamped===void 0){if(e.required)throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" does not have a durable descriptor. Author the callback inline in transformed source or use an eve durable callback helper.`);return}let t=Object.keys(e.stamped).filter(e=>e!==`closure`&&e!==`callback`);if(t.includes(`stepId`))throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" was persisted by a pre-release eve version that identified callbacks by build offset. Start a new session to re-resolve it.`);if(t.length>0)throw Error(`Dynamic tool "${e.name}" has invalid ${e.phase} callback metadata: unknown key(s) ${t.join(`, `)}.`);if(typeof e.stamped.callback!=`function`)throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" does not have a durable descriptor. Author the callback inline in transformed source or use an eve durable callback helper.`);let n;try{n=parseJsonObject(e.stamped.closure)}catch(t){throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" has a non-serializable capture. ${toErrorMessage(t)}`)}return registerDurableDynamicCallback({callback:e.stamped.callback,phase:e.phase,owner:e.owner}),{closure:n}}function validateDurableDynamicToolCallbacks(e,t,n){let r=readDurableDynamicToolCallbacks(t)??{},i=Object.keys(r).filter(e=>e!==`execute`&&e!==`label`&&e!==`approvalKey`&&e!==`approvalRequest`&&e!==`approvalResponse`&&e!==`toModelOutput`);if(i.length>0)throw Error(`Dynamic tool "${e}" has unknown durable callback phase(s): ${i.join(`, `)}.`);let a=t.label?.complete!==void 0,o=t.label?.delta!==void 0,s=t.label?.start!==void 0,c=t.approval!==void 0,l=t.approval!==void 0&&typeof t.approval!=`function`&&t.approval.response!==void 0,u=validateReference({name:e,owner:n,phase:`execute`,stamped:r.execute,required:!0}),d=validateReference({name:e,owner:n,phase:`labelComplete`,stamped:r.label?.complete,required:a}),f=validateReference({name:e,owner:n,phase:`labelDelta`,stamped:r.label?.delta,required:o}),p=validateReference({name:e,owner:n,phase:`labelStart`,stamped:r.label?.start,required:s}),m=validateReference({name:e,owner:n,phase:`approvalKey`,stamped:r.approvalKey,required:t.approvalKey!==void 0}),h=validateReference({name:e,owner:n,phase:`approvalRequest`,stamped:r.approvalRequest,required:c}),g=validateReference({name:e,owner:n,phase:`approvalResponse`,stamped:r.approvalResponse,required:l}),_=validateReference({name:e,owner:n,phase:`toModelOutput`,stamped:r.toModelOutput,required:t.toModelOutput!==void 0}),v={execute:u};return(d!==void 0||f!==void 0||p!==void 0)&&(v.label={complete:d,delta:f,start:p}),m!==void 0&&(v.approvalKey=m),h!==void 0&&(v.approvalRequest=h),g!==void 0&&(v.approvalResponse=g),_!==void 0&&(v.toModelOutput=_),v}function createMetadata(e){return{callbacks:validateDurableDynamicToolCallbacks(e.name,e.entry,{sessionId:e.sessionId,scope:e.scope,resolverSlug:e.resolver.slug,entryKey:e.entryKey,name:e.name}),description:e.entry.description,execution:e.entry.execution===`background`?`background`:void 0,entryKey:e.entryKey,inputSchema:serializeInputSchema(e.entry.inputSchema),name:e.name,outputSchema:serializeOutputSchema(e.entry.outputSchema),resolverSlug:e.resolver.slug}}async function resolveToolsFromEvent(e,t,n,r){let i=e.require(SessionIdKey),a=n.type.split(`.`)[0],o=await Promise.allSettled(t.map(async t=>{let o=t.events[n.type];if(o===void 0)return null;clearDurableDynamicCallbacks(i,{scope:a,resolverSlug:t.slug});try{let s=await o(n,buildResolveContext(e,r));if(s==null)return null;let{entries:c,isSingle:l}=readDynamicToolResult(t,s);return{metadata:qualifyDynamicToolNames(t,l,c).map(({name:e,entryKey:n,entry:r})=>createMetadata({entry:r,entryKey:n,name:e,resolver:t,sessionId:i,scope:a})),resolver:t}}catch(e){throw clearDurableDynamicCallbacks(i,{scope:a,resolverSlug:t.slug}),e}})),s=[],c=new Map;for(let e of o){if(e.status===`rejected`){log.error(`Dynamic tool resolver (${n.type}) failed — skipping its complete result.`,{error:toErrorMessage(e.reason)});continue}if(e.value!==null){for(let t of e.value.metadata){let n=c.get(t.name);if(n!==void 0&&n!==e.value.resolver.slug)throw Error(`Dynamic tool "${t.name}" from resolver "${e.value.resolver.slug}" collides with dynamic resolver "${n}". Namespace the map key manually.`);c.set(t.name,e.value.resolver.slug)}s.push(...e.value.metadata)}}return{metadata:s}}const resolvedStepTools=new WeakMap;function stepCoordinate(e){return`${e.data.turnId}:${String(e.data.stepIndex)}`}function storeResolvedStepTools(e){e.ctx.set(StepDynamicToolMetadataKey,e.metadata);let t=stepCoordinate(e.event);resolvedStepTools.set(e.ctx,{coordinate:t,metadata:e.metadata})}async function resolveStepDynamicTools(e){let t=stepCoordinate(e.event),n=resolvedStepTools.get(e.ctx);if(n?.coordinate===t){e.ctx.set(StepDynamicToolMetadataKey,n.metadata);return}let r=e.resolvers.filter(e=>e.eventNames.includes(`step.started`)),{metadata:i}=r.length===0?{metadata:[]}:await resolveToolsFromEvent(e.ctx,r,e.event,e.messages);storeResolvedStepTools({ctx:e.ctx,event:e.event,metadata:i})}async function preparePersistedStepDynamicToolMetadata(e){let t=e.ctx.get(StepDynamicToolMetadataKey)??[],n=t.filter(isCurrentDynamicToolMetadata);if(n.length===t.length&&!hasUnregisteredDurableDynamicCallbacks(n,{sessionId:e.ctx.require(SessionIdKey),scope:`step`})){n.length>0&&storeResolvedStepTools({ctx:e.ctx,event:e.event,metadata:n});return}await resolveStepDynamicTools(e);let r=e.ctx.get(StepDynamicToolMetadataKey)??[];storeResolvedStepTools({ctx:e.ctx,event:e.event,metadata:toCurrentDynamicToolMetadataList(t,r.filter(isCurrentDynamicToolMetadata))})}async function dispatchDynamicToolEvent(e){if(e.event.type===`session.completed`){let t=e.ctx.get(SessionIdKey);t!==void 0&&clearDurableDynamicCallbacks(t);return}if(!ALLOWED_DYNAMIC_TOOL_EVENTS.has(e.event.type))return;if(e.event.type===`step.started`){await resolveStepDynamicTools({...e,event:e.event});return}e.event.type===`turn.started`&&e.ctx.set(StepDynamicToolMetadataKey,[]);let t=e.resolvers.filter(t=>t.eventNames.includes(e.event.type)),{metadata:n}=t.length===0?{metadata:[]}:await resolveToolsFromEvent(e.ctx,t,e.event,e.messages),r=durableKeyForEvent(e.event.type);if(r===void 0)return;if(e.event.type===`session.started`){e.ctx.set(SessionDynamicToolMetadataKey,n);return}let i=new Set(t.map(e=>e.slug)),a=(e.ctx.get(r)??[]).filter(e=>!i.has(e.resolverSlug));e.ctx.set(r,[...a,...n])}async function refreshDynamicSessionToolsForRuntimeRevision(e){let t=e.ctx.get(SessionDynamicToolMetadataKey)??[],n=t.filter(isCurrentDynamicToolMetadata),r=n.length!==t.length,i=e.ctx.get(SessionDynamicToolRuntimeRevisionKey)!==e.runtimeRevision;if(!i&&!r&&!hasUnregisteredDurableDynamicCallbacks(n,{sessionId:e.ctx.require(SessionIdKey),scope:`session`}))return;let a=e.resolvers.filter(e=>e.eventNames.includes(`session.started`)),{metadata:o}=a.length===0?{metadata:[]}:await resolveToolsFromEvent(e.ctx,a,e.event,e.messages);e.ctx.set(SessionDynamicToolMetadataKey,i?o:toCurrentDynamicToolMetadataList(t,o)),e.ctx.set(SessionDynamicToolRuntimeRevisionKey,e.runtimeRevision)}async function rebindMissingCompiledDynamicToolCallbacks(e){let t=e.ctx.get(TurnDynamicToolMetadataKey)??[],n=t.filter(t=>!isCurrentDynamicToolMetadata(t)||hasUnregisteredDurableDynamicCallbacks([t],{sessionId:e.ctx.require(SessionIdKey),scope:`turn`}));if(n.length===0)return;let r=new Set(n.map(e=>e.resolverSlug)),i=new Set(t.filter(e=>!isCurrentDynamicToolMetadata(e)).map(e=>e.resolverSlug)),a=e.resolvers.filter(e=>r.has(e.slug)&&(i.has(e.slug)||e.rebindMissingCallbacks===!0));if(a.length===0){e.ctx.set(TurnDynamicToolMetadataKey,toCurrentDynamicToolMetadataList(t));return}let o=await contextStorage.run(e.ctx,async()=>await resolveToolsFromEvent(e.ctx,a,e.event,e.messages)),s=toCurrentDynamicToolMetadataList(t,o.metadata);e.ctx.set(TurnDynamicToolMetadataKey,s);let c=s.filter(t=>n.some(e=>e.resolverSlug===t.resolverSlug&&e.name===t.name)&&hasUnregisteredDurableDynamicCallbacks([t],{sessionId:e.ctx.require(SessionIdKey),scope:`turn`}));if(c.length>0)throw Error(`Dynamic tool callback rebind did not restore: ${c.map(e=>e.name).join(`, `)}. The tool may have been renamed or removed.`)}export{dispatchDynamicToolEvent,preparePersistedStepDynamicToolMetadata,rebindMissingCompiledDynamicToolCallbacks,refreshDynamicSessionToolsForRuntimeRevision,replayDynamicSessionTools,resolveStepDynamicTools,validateDurableDynamicToolCallbacks};
|
|
1
|
+
import{createLogger}from"#internal/logging.js";import{contextStorage}from"#context/container.js";import{SessionDynamicToolMetadataKey,SessionDynamicToolRuntimeRevisionKey,SessionIdKey,StepDynamicToolMetadataKey,TurnDynamicToolMetadataKey}from"#context/keys.js";import{toErrorMessage}from"#shared/errors.js";import{serializeInputSchema,serializeOutputSchema}from"#tools/schema.js";import{parseJsonObject}from"#shared/json.js";import{ALLOWED_DYNAMIC_TOOL_EVENTS}from"#dynamic/definition.js";import{isCurrentDynamicToolMetadata,toCurrentDynamicToolMetadataList}from"#context/dynamic-tool-metadata.js";import{clearDurableDynamicCallbacks,hasUnregisteredDurableDynamicCallbacks,readDurableDynamicToolCallbacks,registerDurableDynamicCallback}from"#tools/durable-callbacks.js";import{buildResolveContext}from"#context/dynamic-resolve-context.js";import{isWorkflowToolDefinition}from"#tools/workflow-definition.js";import{replayDynamicTools}from"#context/build-dynamic-tools.js";import{isBrandedToolEntry}from"#tools/dynamic.js";const log=createLogger(`dynamic-tools`);function qualifyDynamicToolNames(e,t,n){let r=Object.keys(n);if(r.length===0)return[];if(t){let t=r[0];return[{name:e.slug,entryKey:t,entry:n[t]}]}let i=e.extensionNamespace===void 0?``:`${e.extensionNamespace}__`;return r.map(e=>({entry:n[e],entryKey:e,name:`${i}${e}`}))}function replayDynamicSessionTools(e,t,n){return replayDynamicTools(e,{sessionId:n,scope:`session`})}function durableKeyForEvent(e){switch(e){case`session.started`:return SessionDynamicToolMetadataKey;case`turn.started`:return TurnDynamicToolMetadataKey;case`step.started`:return StepDynamicToolMetadataKey;default:return}}function readDynamicToolResult(e,t){let assertOrdinaryTool=t=>{if(isWorkflowToolDefinition(t))throw Error(`Dynamic tool resolver "${e.logicalPath}" cannot return defineWorkflowTool(). Workflow tools must be static tools; use defineTool() for dynamic entries.`)};if(assertOrdinaryTool(t),isBrandedToolEntry(t))return{entries:{_single:t},isSingle:!0};if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`Dynamic tool resolver "${e.logicalPath}" must return defineTool(), a map of defineTool() values, or null.`);let n={};for(let[r,i]of Object.entries(t)){if(assertOrdinaryTool(i),!isBrandedToolEntry(i))throw Error(`Dynamic tool resolver "${e.logicalPath}" returned "${r}" without defineTool(). Wrap every dynamic tool entry in defineTool().`);n[r]=i}return{entries:n,isSingle:!1}}function validateReference(e){if(e.stamped===void 0){if(e.required)throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" does not have a durable descriptor. Author the callback inline in transformed source or use an eve durable callback helper.`);return}let t=Object.keys(e.stamped).filter(e=>e!==`closure`&&e!==`callback`);if(t.includes(`stepId`))throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" was persisted by a pre-release eve version that identified callbacks by build offset. Start a new session to re-resolve it.`);if(t.length>0)throw Error(`Dynamic tool "${e.name}" has invalid ${e.phase} callback metadata: unknown key(s) ${t.join(`, `)}.`);if(typeof e.stamped.callback!=`function`)throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" does not have a durable descriptor. Author the callback inline in transformed source or use an eve durable callback helper.`);let n;try{n=parseJsonObject(e.stamped.closure)}catch(t){throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" has a non-serializable capture. ${toErrorMessage(t)}`)}return registerDurableDynamicCallback({callback:e.stamped.callback,phase:e.phase,owner:e.owner}),{closure:n}}function validateDurableDynamicToolCallbacks(e,t,n){let r=readDurableDynamicToolCallbacks(t)??{},i=Object.keys(r).filter(e=>e!==`execute`&&e!==`label`&&e!==`approvalKey`&&e!==`approvalRequest`&&e!==`approvalResponse`&&e!==`toModelOutput`);if(i.length>0)throw Error(`Dynamic tool "${e}" has unknown durable callback phase(s): ${i.join(`, `)}.`);let a=t.approval!==void 0,o=t.approval!==void 0&&typeof t.approval!=`function`&&t.approval.response!==void 0,s=validateReference({name:e,owner:n,phase:`execute`,stamped:r.execute,required:!0}),c=validateReference({name:e,owner:n,phase:`labelComplete`,stamped:r.label?.complete,required:!1}),l=validateReference({name:e,owner:n,phase:`labelDelta`,stamped:r.label?.delta,required:!1}),u=validateReference({name:e,owner:n,phase:`labelStart`,stamped:r.label?.start,required:!1}),d=validateReference({name:e,owner:n,phase:`approvalKey`,stamped:r.approvalKey,required:t.approvalKey!==void 0}),f=validateReference({name:e,owner:n,phase:`approvalRequest`,stamped:r.approvalRequest,required:a}),p=validateReference({name:e,owner:n,phase:`approvalResponse`,stamped:r.approvalResponse,required:o}),m=validateReference({name:e,owner:n,phase:`toModelOutput`,stamped:r.toModelOutput,required:t.toModelOutput!==void 0}),h={execute:s};return(c!==void 0||l!==void 0||u!==void 0)&&(h.label={complete:c,delta:l,start:u}),d!==void 0&&(h.approvalKey=d),f!==void 0&&(h.approvalRequest=f),p!==void 0&&(h.approvalResponse=p),m!==void 0&&(h.toModelOutput=m),h}function createMetadata(e){return{callbacks:validateDurableDynamicToolCallbacks(e.name,e.entry,{sessionId:e.sessionId,scope:e.scope,resolverSlug:e.resolver.slug,entryKey:e.entryKey,name:e.name}),description:e.entry.description,execution:e.entry.execution===`background`?`background`:void 0,entryKey:e.entryKey,inputSchema:serializeInputSchema(e.entry.inputSchema),name:e.name,outputSchema:serializeOutputSchema(e.entry.outputSchema),resolverSlug:e.resolver.slug}}async function resolveToolsFromEvent(e,t,n,r){let i=e.require(SessionIdKey),a=n.type.split(`.`)[0],o=await Promise.allSettled(t.map(async t=>{let o=t.events[n.type];if(o===void 0)return null;clearDurableDynamicCallbacks(i,{scope:a,resolverSlug:t.slug});try{let s=await o(n,buildResolveContext(e,r));if(s==null)return null;let{entries:c,isSingle:l}=readDynamicToolResult(t,s);return{metadata:qualifyDynamicToolNames(t,l,c).map(({name:e,entryKey:n,entry:r})=>createMetadata({entry:r,entryKey:n,name:e,resolver:t,sessionId:i,scope:a})),resolver:t}}catch(e){throw clearDurableDynamicCallbacks(i,{scope:a,resolverSlug:t.slug}),e}})),s=[],c=new Map;for(let e of o){if(e.status===`rejected`){log.error(`Dynamic tool resolver (${n.type}) failed — skipping its complete result.`,{error:toErrorMessage(e.reason)});continue}if(e.value!==null){for(let t of e.value.metadata){let n=c.get(t.name);if(n!==void 0&&n!==e.value.resolver.slug)throw Error(`Dynamic tool "${t.name}" from resolver "${e.value.resolver.slug}" collides with dynamic resolver "${n}". Namespace the map key manually.`);c.set(t.name,e.value.resolver.slug)}s.push(...e.value.metadata)}}return{metadata:s}}const resolvedStepTools=new WeakMap;function stepCoordinate(e){return`${e.data.turnId}:${String(e.data.stepIndex)}`}function storeResolvedStepTools(e){e.ctx.set(StepDynamicToolMetadataKey,e.metadata);let t=stepCoordinate(e.event);resolvedStepTools.set(e.ctx,{coordinate:t,metadata:e.metadata})}async function resolveStepDynamicTools(e){let t=stepCoordinate(e.event),n=resolvedStepTools.get(e.ctx);if(n?.coordinate===t){e.ctx.set(StepDynamicToolMetadataKey,n.metadata);return}let r=e.resolvers.filter(e=>e.eventNames.includes(`step.started`)),{metadata:i}=r.length===0?{metadata:[]}:await resolveToolsFromEvent(e.ctx,r,e.event,e.messages);storeResolvedStepTools({ctx:e.ctx,event:e.event,metadata:i})}async function preparePersistedStepDynamicToolMetadata(e){let t=e.ctx.get(StepDynamicToolMetadataKey)??[],n=t.filter(isCurrentDynamicToolMetadata);if(n.length===t.length&&!hasUnregisteredDurableDynamicCallbacks(n,{sessionId:e.ctx.require(SessionIdKey),scope:`step`})){n.length>0&&storeResolvedStepTools({ctx:e.ctx,event:e.event,metadata:n});return}await resolveStepDynamicTools(e);let r=e.ctx.get(StepDynamicToolMetadataKey)??[];storeResolvedStepTools({ctx:e.ctx,event:e.event,metadata:toCurrentDynamicToolMetadataList(t,r.filter(isCurrentDynamicToolMetadata))})}async function dispatchDynamicToolEvent(e){if(e.event.type===`session.completed`){let t=e.ctx.get(SessionIdKey);t!==void 0&&clearDurableDynamicCallbacks(t);return}if(!ALLOWED_DYNAMIC_TOOL_EVENTS.has(e.event.type))return;if(e.event.type===`step.started`){await resolveStepDynamicTools({...e,event:e.event});return}e.event.type===`turn.started`&&e.ctx.set(StepDynamicToolMetadataKey,[]);let t=e.resolvers.filter(t=>t.eventNames.includes(e.event.type)),{metadata:n}=t.length===0?{metadata:[]}:await resolveToolsFromEvent(e.ctx,t,e.event,e.messages),r=durableKeyForEvent(e.event.type);if(r===void 0)return;if(e.event.type===`session.started`){e.ctx.set(SessionDynamicToolMetadataKey,n);return}let i=new Set(t.map(e=>e.slug)),a=(e.ctx.get(r)??[]).filter(e=>!i.has(e.resolverSlug));e.ctx.set(r,[...a,...n])}async function refreshDynamicSessionToolsForRuntimeRevision(e){let t=e.ctx.get(SessionDynamicToolMetadataKey)??[],n=t.filter(isCurrentDynamicToolMetadata),r=n.length!==t.length,i=e.ctx.get(SessionDynamicToolRuntimeRevisionKey)!==e.runtimeRevision;if(!i&&!r&&!hasUnregisteredDurableDynamicCallbacks(n,{sessionId:e.ctx.require(SessionIdKey),scope:`session`}))return;let a=e.resolvers.filter(e=>e.eventNames.includes(`session.started`)),{metadata:o}=a.length===0?{metadata:[]}:await resolveToolsFromEvent(e.ctx,a,e.event,e.messages);e.ctx.set(SessionDynamicToolMetadataKey,i?o:toCurrentDynamicToolMetadataList(t,o)),e.ctx.set(SessionDynamicToolRuntimeRevisionKey,e.runtimeRevision)}async function rebindMissingCompiledDynamicToolCallbacks(e){let t=e.ctx.get(TurnDynamicToolMetadataKey)??[],n=t.filter(t=>!isCurrentDynamicToolMetadata(t)||hasUnregisteredDurableDynamicCallbacks([t],{sessionId:e.ctx.require(SessionIdKey),scope:`turn`}));if(n.length===0)return;let r=new Set(n.map(e=>e.resolverSlug)),i=new Set(t.filter(e=>!isCurrentDynamicToolMetadata(e)).map(e=>e.resolverSlug)),a=e.resolvers.filter(e=>r.has(e.slug)&&(i.has(e.slug)||e.rebindMissingCallbacks===!0));if(a.length===0){e.ctx.set(TurnDynamicToolMetadataKey,toCurrentDynamicToolMetadataList(t));return}let o=await contextStorage.run(e.ctx,async()=>await resolveToolsFromEvent(e.ctx,a,e.event,e.messages)),s=toCurrentDynamicToolMetadataList(t,o.metadata);e.ctx.set(TurnDynamicToolMetadataKey,s);let c=s.filter(t=>n.some(e=>e.resolverSlug===t.resolverSlug&&e.name===t.name)&&hasUnregisteredDurableDynamicCallbacks([t],{sessionId:e.ctx.require(SessionIdKey),scope:`turn`}));if(c.length>0)throw Error(`Dynamic tool callback rebind did not restore: ${c.map(e=>e.name).join(`, `)}. The tool may have been renamed or removed.`)}export{dispatchDynamicToolEvent,preparePersistedStepDynamicToolMetadata,rebindMissingCompiledDynamicToolCallbacks,refreshDynamicSessionToolsForRuntimeRevision,replayDynamicSessionTools,resolveStepDynamicTools,validateDurableDynamicToolCallbacks};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { Braintrust, type BraintrustReporterConfig } from "#evals/runner/reporters/braintrust.js";
|
|
2
2
|
export { Console, type ConsoleReporterConfig } from "#evals/runner/reporters/console.js";
|
|
3
|
+
export { Datadog, type DatadogReporterConfig } from "#evals/runner/reporters/datadog.js";
|
|
3
4
|
export { JUnit, type JUnitReporterConfig } from "#evals/runner/reporters/junit.js";
|
|
4
5
|
export type { EvalReporter, EveEvalCompleteContext, EveEvalSessionStartEvent, EveEvalStartEvent, } from "#evals/runner/reporters/types.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Console}from"#evals/runner/reporters/console.js";import{JUnit}from"#evals/runner/reporters/junit.js";import{Braintrust}from"#evals/runner/reporters/braintrust.js";export{Braintrust,Console,JUnit};
|
|
1
|
+
import{Console}from"#evals/runner/reporters/console.js";import{JUnit}from"#evals/runner/reporters/junit.js";import{Braintrust}from"#evals/runner/reporters/braintrust.js";import{Datadog}from"#evals/runner/reporters/datadog.js";export{Braintrust,Console,Datadog,JUnit};
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import type { EvalReporter } from "#evals/runner/reporters/types.js";
|
|
2
|
+
/** Configuration for the Datadog reporter. */
|
|
3
|
+
export interface DatadogReporterConfig {
|
|
4
|
+
/** Datadog LLM Observability project name. Defaults to `DD_LLMOBS_PROJECT_NAME`, the configured ml_app, `DD_SERVICE`, or the first eval id. */
|
|
5
|
+
readonly projectName?: string;
|
|
6
|
+
/** Name for the dataset used by the experiment. Defaults to `<experimentName> dataset`. */
|
|
7
|
+
readonly datasetName?: string;
|
|
8
|
+
/** Name for the created experiment. Defaults to a timestamped eve eval run name. */
|
|
9
|
+
readonly experimentName?: string;
|
|
10
|
+
/** Optional experiment description. */
|
|
11
|
+
readonly description?: string;
|
|
12
|
+
/** Datadog service name used when the reporter initializes `dd-trace`. */
|
|
13
|
+
readonly service?: string;
|
|
14
|
+
/** Datadog env used when the reporter initializes `dd-trace`. */
|
|
15
|
+
readonly env?: string;
|
|
16
|
+
/** Datadog site used when the reporter initializes `dd-trace`. */
|
|
17
|
+
readonly site?: string;
|
|
18
|
+
/** LLM Observability ml_app used when the reporter initializes `dd-trace`. Defaults to `projectName`. */
|
|
19
|
+
readonly mlApp?: string;
|
|
20
|
+
/** Tags attached to the Datadog Experiment. */
|
|
21
|
+
readonly tags?: Readonly<Record<string, string>>;
|
|
22
|
+
/** JSON-serializable metadata attached to the Datadog Experiment. */
|
|
23
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
24
|
+
/** JSON-serializable Datadog Experiment config. */
|
|
25
|
+
readonly config?: Readonly<Record<string, unknown>>;
|
|
26
|
+
/** Include the first sent message, falling back to the eval description, in the experiment row and a linked dataset record. Defaults to false. */
|
|
27
|
+
readonly recordInputs?: boolean;
|
|
28
|
+
/** Include eval outputs in the synthetic experiment row output. Defaults to false. */
|
|
29
|
+
readonly recordOutputs?: boolean;
|
|
30
|
+
/** Include `metadata.expectedOutput`, `metadata.expected`, or `metadata.expected_output` on experiment rows. Defaults to false. */
|
|
31
|
+
readonly recordExpectedOutputs?: boolean;
|
|
32
|
+
/** Include raw assertion names as metric tags and failure messages in row metadata. Defaults to false. */
|
|
33
|
+
readonly recordAssertionDetails?: boolean;
|
|
34
|
+
/** Include execution error messages, which may contain application data. Defaults to false. */
|
|
35
|
+
readonly recordErrors?: boolean;
|
|
36
|
+
/** Console hook used for tests. */
|
|
37
|
+
readonly log?: (line: string) => void;
|
|
38
|
+
/** eve-owned client seam for tests and custom Datadog SDK wiring. */
|
|
39
|
+
readonly client?: DatadogExperimentsClient;
|
|
40
|
+
}
|
|
41
|
+
type DatadogJsonValue = string | number | boolean | null | DatadogJsonValue[] | {
|
|
42
|
+
[key: string]: DatadogJsonValue;
|
|
43
|
+
};
|
|
44
|
+
interface DatadogDatasetRecordInput {
|
|
45
|
+
inputData: DatadogJsonValue;
|
|
46
|
+
expectedOutput?: DatadogJsonValue;
|
|
47
|
+
metadata?: Record<string, DatadogJsonValue>;
|
|
48
|
+
tags?: string[];
|
|
49
|
+
}
|
|
50
|
+
interface DatadogDatasetRecord {
|
|
51
|
+
readonly id: string | null;
|
|
52
|
+
}
|
|
53
|
+
interface DatadogDataset {
|
|
54
|
+
id(): string | null;
|
|
55
|
+
name(): string;
|
|
56
|
+
version(): number | null;
|
|
57
|
+
records(): readonly DatadogDatasetRecord[];
|
|
58
|
+
url(): string | null;
|
|
59
|
+
push(): Promise<{
|
|
60
|
+
pushedCount: number;
|
|
61
|
+
totalCount: number;
|
|
62
|
+
}>;
|
|
63
|
+
}
|
|
64
|
+
interface DatadogExperimentsClient {
|
|
65
|
+
createDataset?(name: string, options?: {
|
|
66
|
+
projectName?: string;
|
|
67
|
+
description?: string;
|
|
68
|
+
records?: DatadogDatasetRecordInput[];
|
|
69
|
+
}): DatadogDataset;
|
|
70
|
+
startExperiment(options: DatadogStartExperimentOptions): Promise<DatadogExternalExperiment>;
|
|
71
|
+
}
|
|
72
|
+
interface DatadogStartExperimentOptions {
|
|
73
|
+
name: string;
|
|
74
|
+
projectName?: string;
|
|
75
|
+
description?: string;
|
|
76
|
+
tags?: Record<string, string>;
|
|
77
|
+
metadata?: Record<string, DatadogJsonValue>;
|
|
78
|
+
config?: Record<string, DatadogJsonValue>;
|
|
79
|
+
dataset?: {
|
|
80
|
+
id?: string;
|
|
81
|
+
version?: number;
|
|
82
|
+
name?: string;
|
|
83
|
+
description?: string;
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
interface DatadogExternalExperiment {
|
|
87
|
+
experimentId(): string;
|
|
88
|
+
url(): string | null;
|
|
89
|
+
submitSpan(row: DatadogExternalExperimentSpanInput): Promise<DatadogExternalExperimentSpan>;
|
|
90
|
+
submitEvaluationMetrics(span: Pick<DatadogExternalExperimentSpan, "experimentId" | "spanId" | "traceId">, metrics: DatadogEvaluationMetricInput[]): Promise<void>;
|
|
91
|
+
close(options?: {
|
|
92
|
+
status?: string;
|
|
93
|
+
error?: string | Error;
|
|
94
|
+
}): Promise<void>;
|
|
95
|
+
}
|
|
96
|
+
interface DatadogExternalExperimentSpanInput {
|
|
97
|
+
name?: string;
|
|
98
|
+
input?: DatadogJsonValue;
|
|
99
|
+
output?: DatadogJsonValue;
|
|
100
|
+
expectedOutput?: DatadogJsonValue;
|
|
101
|
+
metadata?: Record<string, DatadogJsonValue>;
|
|
102
|
+
tags?: Record<string, string>;
|
|
103
|
+
startedAt?: Date | string | number;
|
|
104
|
+
completedAt?: Date | string | number;
|
|
105
|
+
durationMs?: number;
|
|
106
|
+
error?: string | Error | {
|
|
107
|
+
type?: string;
|
|
108
|
+
name?: string;
|
|
109
|
+
message?: string;
|
|
110
|
+
stack?: string;
|
|
111
|
+
};
|
|
112
|
+
datasetRecordId?: string;
|
|
113
|
+
runId?: string;
|
|
114
|
+
runIteration?: number;
|
|
115
|
+
}
|
|
116
|
+
interface DatadogExternalExperimentSpan {
|
|
117
|
+
experimentId: string;
|
|
118
|
+
spanId: string;
|
|
119
|
+
traceId: string;
|
|
120
|
+
url: string | null;
|
|
121
|
+
}
|
|
122
|
+
interface DatadogEvaluationMetricInput {
|
|
123
|
+
label: string;
|
|
124
|
+
value?: DatadogJsonValue;
|
|
125
|
+
error?: string | Error;
|
|
126
|
+
timestamp?: Date | string | number;
|
|
127
|
+
tags?: Record<string, string>;
|
|
128
|
+
source?: string;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Creates an {@link EvalReporter} that uploads eval assertion scores to a
|
|
132
|
+
* Datadog LLM Observability Experiment. Requires the optional `dd-trace`
|
|
133
|
+
* package and `DD_API_KEY`/`DD_APP_KEY` credentials unless `config.client` is
|
|
134
|
+
* provided.
|
|
135
|
+
*/
|
|
136
|
+
export declare function Datadog(config?: DatadogReporterConfig): EvalReporter;
|
|
137
|
+
export {};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{createRequire}from"node:module";import{parseJsonValue}from"#shared/json.js";import{resolveLocalGitMetadata}from"#evals/runner/resolve-git-metadata.js";function Datadog(e={}){return new DatadogReporter(e)}var DatadogReporter=class{#e;#t=new Map;#n;#r;#i;#a;constructor(e){this.#e=e}async onRunStart(e,t){this.#n=void 0,this.#r=void 0,this.#i=void 0,this.#a=void 0,this.#t.clear();for(let t of e)this.#t.set(t.id,t);let n=await resolveDatadogClient(this.#e,e),r=resolveLocalGitMetadata(process.cwd()),i=this.#e.experimentName??defaultExperimentName(),a=resolveExperimentMetadata(e,t);r.sha&&(a.eveGitCommit=r.sha,a.eveGitBranch=r.branch),Object.assign(a,this.#e.metadata);let o={name:i,projectName:resolveProjectName(this.#e,e),description:this.#e.description,dataset:{name:this.#e.datasetName??`${i} dataset`},tags:resolveExperimentTags(this.#e,t),metadata:toDatadogJsonRecord(a),config:toDatadogJsonRecord(this.#e.config)};if(this.#e.recordInputs){if(!n.createDataset)throw Error(`The installed 'dd-trace' package does not expose tracer.llmobs.experiments.createDataset().`);this.#n=n,this.#r=o;return}this.#i=await n.startExperiment(o)}async onEvalComplete(e){!this.#e.recordInputs&&this.#i&&await this.#s(e)}async onRunComplete(e){try{if(this.#e.recordInputs&&await this.#o(e.results),!this.#i)return;let t=e.failed>0||e.errored>0;await this.#i.close({status:t?`failed`:`completed`,error:t?`${e.failed} failed, ${e.errored} errored`:void 0});let n=this.#e.log??console.log;this.#a&&n(`Datadog dataset URL: ${this.#a}\n`);let r=this.#i.url();r&&n(`Datadog experiment URL: ${r}\n`)}finally{this.#n=void 0,this.#r=void 0,this.#i=void 0,this.#a=void 0}}async#o(e){let t=this.#n,n=this.#r;if(!t?.createDataset||!n)return;let r=n.dataset?.name??`${n.name} dataset`,i=e.map(e=>{let t=this.#t.get(e.id),n={inputData:toDatadogJsonValue(resolveInput(e,t)),metadata:{eveEvalId:e.id}};if(this.#e.recordExpectedOutputs){let e=toOptionalDatadogJsonValue(resolveExpectedOutput(t));e!==void 0&&(n.expectedOutput=e)}return n}),a=t.createDataset(r,{projectName:n.projectName,description:this.#e.description??`Eve eval inputs for experiment '${n.name}'.`,records:i});await a.push();let o=a.id();if(!o)throw Error(`Datadog dataset '${r}' has no id after push().`);let s=a.records();if(s.length!==e.length)throw Error(`Datadog dataset '${r}' has ${s.length} records for ${e.length} eval results.`);let c={id:o,name:a.name()},l=a.version();l!==null&&(c.version=l),this.#a=a.url()??void 0,this.#i=await t.startExperiment({...n,dataset:c});for(let[t,n]of e.entries()){let e=s[t]?.id;if(!e)throw Error(`Datadog dataset record ${t+1} has no id after push().`);await this.#s(n,e)}}async#s(e,t){if(!this.#i)return;let n=this.#t.get(e.id),r={name:e.id,metadata:toDatadogJsonRecord(resolveResultMetadata(e,n,this.#e.recordAssertionDetails===!0)),tags:resolveResultTags(e,n),startedAt:e.startedAt,completedAt:e.completedAt,durationMs:elapsedMs(e.startedAt,e.completedAt)};this.#e.recordInputs&&(r.input=toOptionalDatadogJsonValue(resolveInput(e,n))),this.#e.recordOutputs&&(r.output=toOptionalDatadogJsonValue(e.result.output)),this.#e.recordExpectedOutputs&&(r.expectedOutput=toOptionalDatadogJsonValue(resolveExpectedOutput(n))),this.#e.recordErrors&&e.error!==void 0&&(r.error=e.error),t!==void 0&&(r.datasetRecordId=t);let i=await this.#i.submitSpan(r);await this.#i.submitEvaluationMetrics(i,resolveEvaluationMetrics(e,this.#e.recordAssertionDetails===!0))}};const DD_TRACE_PACKAGE=`dd-trace`,EXPECTED_OUTPUT_METADATA_KEYS=new Set([`expectedOutput`,`expected`,`expected_output`]),BUILT_IN_METRIC_LABELS=[`eve_tool_call_count`,`eve_subagent_call_count`,`eve_message_count`,`eve_reasoning_block_count`];async function resolveDatadogClient(e,t){if(e.client)return e.client;let n=await loadDatadogSdk(),r=resolveProjectName(e,t),i=n.init({service:e.service??process.env.DD_SERVICE??r,env:e.env??process.env.DD_ENV,site:e.site??process.env.DD_SITE,llmobs:{projectName:r,mlApp:e.mlApp??r,agentlessEnabled:!0}}).llmobs?.experiments;if(!i?.startExperiment)throw Error([`The installed 'dd-trace' package does not expose tracer.llmobs.experiments.startExperiment().`,`Update to a release compatible with dd-trace@6.13.0.`].join(`
|
|
2
|
+
`));return i}async function loadDatadogSdk(){try{return createRequire(`${process.cwd()}/package.json`)(DD_TRACE_PACKAGE)}catch{try{let e=await import(DD_TRACE_PACKAGE);return e.default??e}catch{throw Error([`The 'dd-trace' package is required for Datadog reporting but was not found.`,``,`Install the tested release with:`,` npm install dd-trace@6.13.0`].join(`
|
|
3
|
+
`))}}}function resolveProjectName(e,t){return e.projectName??process.env.DD_LLMOBS_PROJECT_NAME??e.mlApp??process.env.DD_LLMOBS_ML_APP??process.env.DD_SERVICE??t[0]?.id??`eve evals`}function defaultExperimentName(){return`eve evals ${new Date().toISOString()}`}function resolveExperimentTags(e,t){return{source:`eve`,target_kind:t.kind,...e.tags}}function resolveExperimentMetadata(e,t){let n={eveEvalIds:e.map(e=>e.id),eveTargetKind:t.kind,eveTimestamp:new Date().toISOString()},r=resolveTargetOrigin(t.url);return r!==void 0&&(n.eveTargetOrigin=r),n}function resolveTargetOrigin(e){try{let t=new URL(e).origin;return t===`null`?void 0:t}catch{return}}function resolveResultTags(e,t){let n={eval_id:e.id,eval_verdict:e.verdict,eval_status:e.result.status};return t?.tags?.length&&(n.eval_tags=t.tags.join(`,`)),n}function resolveInput(e,t){for(let t of e.result.events)if(t.type===`message.received`)return t.data.message;return t?.description??``}function resolveExpectedOutput(e){if(e?.metadata)return e.metadata.expectedOutput??e.metadata.expected??e.metadata.expected_output}function resolveResultMetadata(e,t,n){let r={};for(let[e,n]of Object.entries(t?.metadata??{}))EXPECTED_OUTPUT_METADATA_KEYS.has(e)||(r[e]=n);if(Object.assign(r,{eveSessionId:e.result.sessionId,eveStatus:e.result.status,eveVerdict:e.verdict,eveSkipReason:e.skipReason,eveToolCalls:e.result.derived.toolCalls.map(e=>e.name),eveSubagentCalls:e.result.derived.subagentCalls.map(e=>e.name),eveParked:e.result.derived.parked}),n){let t=e.assertions.filter(e=>!e.passed).map(e=>({name:e.name,message:e.message}));t.length>0&&(r.eveFailedAssertions=t)}return e.result.derived.failureCode&&(r.eveFailureCode=e.result.derived.failureCode),r}function resolveEvaluationMetrics(e,t){let n=[],r=new Set(BUILT_IN_METRIC_LABELS);for(let[i,a]of e.assertions.entries()){let e=a.severity===`gate`?`gate_${a.name}`:a.name,o={assertion_index:String(i+1),assertion_severity:a.severity,assertion_passed:String(a.passed)};t&&(o.assertion_name=a.name,o.assertion_label=e),n.push({label:reserveDatadogMetricLabel(toDatadogMetricLabel(e),r),value:a.score,tags:o})}return n.push({label:`eve_tool_call_count`,value:e.result.derived.toolCallCount},{label:`eve_subagent_call_count`,value:e.result.derived.subagentCallCount},{label:`eve_message_count`,value:e.result.derived.messageCount},{label:`eve_reasoning_block_count`,value:e.result.derived.reasoningBlockCount}),n}function toDatadogMetricLabel(e){return e.replace(/[^a-zA-Z0-9_-]+/g,`_`).replace(/^_+|_+$/g,``)||`metric`}function reserveDatadogMetricLabel(e,t){let n=e,r=2;for(;t.has(n);)n=`${e}_${r}`,r+=1;return t.add(n),n}function elapsedMs(e,t){let n=Date.parse(e),r=Date.parse(t);if(Number.isFinite(n)&&Number.isFinite(r))return Math.max(0,r-n)}function toOptionalDatadogJsonValue(e){return e===void 0?void 0:toDatadogJsonValue(e)}function toDatadogJsonRecord(e){if(e===void 0)return;let t={};for(let[n,r]of Object.entries(e))r!==void 0&&(t[n]=toDatadogJsonValue(r));return t}function toDatadogJsonValue(e){return cloneDatadogJsonValue(parseJsonValue(e))}function cloneDatadogJsonValue(e){if(Array.isArray(e))return e.map(e=>cloneDatadogJsonValue(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=cloneDatadogJsonValue(r);return t}return e}export{Datadog};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{coalesceDeliveries}from"#harness/messages.js";import{cancelAllIndexedSessionTasksStep}from"#execution/cancel-indexed-session-tasks-step.js";import{reportDroppedWirePayloadStep}from"#execution/report-dropped-wire-payload-step.js";import{SessionInboxWireError,sessionInboxWire}from"#execution/wire/session-inbox-wire.js";import{routeDeliverToChildren}from"#execution/route-child-delivery.js";async function nextTurnDelivery(e){if(e.awaitAuthorizationCallbacks!==!0)return await awaitNextTurnDelivery(e);e.commandInbox.setAuthorizationWindow(!0);try{return await awaitNextTurnDelivery(e)}finally{e.commandInbox.setAuthorizationWindow(!1)}}async function awaitNextTurnDelivery(e){let t=e.cancelledTaskIds??new Set,n=e.seenTaskDeliveries??new Set;for(;;){let r=await waitForNextSessionAction({bufferedDeliveries:e.bufferedDeliveries,bufferedSessionControls:e.bufferedSessionControls,cancelledTaskIds:t,commandInbox:e.commandInbox,deferDeliveries:e.deferDeliveries,seenTaskDeliveries:n,stateCursor:e.stateCursor});if(r.kind===`authorization`)return r;if(r.kind!==`delivery`)return{kind:r.kind};let i=r.delivery;if(i===null)return{kind:`closed`};let a=await routeDeliverToChildren({delivery:i,parentWritable:e.driverWritable,serializedContext:e.stateCursor.serializedContext,sessionState:e.stateCursor.sessionState});if(e.stateCursor.adoptState(a),a.kind===`cancel-turn`)return{kind:`cancel-turn`};if(a.remainder!==void 0)return{delivery:a.remainder,kind:`turn`}}}async function waitForNextSessionAction(e){let t=e.bufferedSessionControls.shift();if(t!==void 0)return{kind:t};for(;e.bufferedDeliveries[0]!==void 0&&isCancelledTaskDelivery(e.bufferedDeliveries[0],e.cancelledTaskIds);)e.bufferedDeliveries.shift();if(e.deferDeliveries!==!0&&!e.commandInbox.hasReadyAuthorization()&&e.bufferedDeliveries.length>0)return{delivery:takeBufferedTurnDelivery(e.bufferedDeliveries),kind:`delivery`};for(;;){let{result:t,source:n}=await e.commandInbox.nextWithSource();if(e.commandInbox.consumeNext(),n===`authorization`)return t.done?{closed:!0,kind:`authorization`,payloads:[]}:{closed:!1,kind:`authorization`,payloads:t.value.kind===`deliver`?t.value.payloads:[]};if(t.done)return{delivery:null,kind:`delivery`};if(t.value.kind===`runtime-action-result`)continue;let r;try{r=sessionInboxWire.decode(t.value)}catch(e){if(!(e instanceof SessionInboxWireError))throw e;await reportDroppedWirePayloadStep({detail:e.message,family:`session-inbox`});continue}if(r.kind===`session-timeout`)return{kind:`expired`};if(r.kind===`clear`||r.kind===`compact`||r.kind===`reset`)return{kind:r.kind};if(r.kind===`cancel`){if(`tasks`in r&&r.tasks===!0&&await cancelAllIndexedSessionTasksStep({serializedContext:e.stateCursor.serializedContext,sessionState:e.stateCursor.sessionState}),r.taskId!==void 0){e.cancelledTaskIds.add(r.taskId);let t=e.bufferedDeliveries.filter(t=>!isCancelledTaskDelivery(t,e.cancelledTaskIds));e.bufferedDeliveries.splice(0,e.bufferedDeliveries.length,...t)}continue}let i=r.taskDeliveryId??r.caller?.taskId;if(!(i!==void 0&&isCancelledTaskDeliveryId(i,e.cancelledTaskIds))){if(i!==void 0){if(e.seenTaskDeliveries.has(i))continue;e.seenTaskDeliveries.add(i)}if(e.deferDeliveries===!0){e.bufferedDeliveries.push(r);continue}return{delivery:r,kind:`delivery`}}}}function isCancelledTaskDelivery(e,t){let n=e.taskDeliveryId??e.caller?.taskId;return n!==void 0&&isCancelledTaskDeliveryId(n,t)}function isCancelledTaskDeliveryId(e,t){return[...t].some(t=>e===t||e.startsWith(`${t}:`))}function takeBufferedTurnDelivery(e){let
|
|
1
|
+
import{coalesceDeliveries}from"#harness/messages.js";import{cancelAllIndexedSessionTasksStep}from"#execution/cancel-indexed-session-tasks-step.js";import{reportDroppedWirePayloadStep}from"#execution/report-dropped-wire-payload-step.js";import{SessionInboxWireError,sessionInboxWire}from"#execution/wire/session-inbox-wire.js";import{routeDeliverToChildren}from"#execution/route-child-delivery.js";import{getSessionTaskCohorts}from"#tasks/session-task-cohorts.js";async function nextTurnDelivery(e){if(e.awaitAuthorizationCallbacks!==!0)return await awaitNextTurnDelivery(e);e.commandInbox.setAuthorizationWindow(!0);try{return await awaitNextTurnDelivery(e)}finally{e.commandInbox.setAuthorizationWindow(!1)}}async function awaitNextTurnDelivery(e){let t=e.cancelledTaskIds??new Set,n=e.seenTaskDeliveries??new Set;for(;;){let r=await waitForNextSessionAction({bufferedDeliveries:e.bufferedDeliveries,bufferedSessionControls:e.bufferedSessionControls,cancelledTaskIds:t,commandInbox:e.commandInbox,deferDeliveries:e.deferDeliveries,seenTaskDeliveries:n,stateCursor:e.stateCursor});if(r.kind===`authorization`)return r;if(r.kind!==`delivery`)return{kind:r.kind};let i=r.delivery;if(i===null)return{kind:`closed`};let a=await routeDeliverToChildren({delivery:i,parentWritable:e.driverWritable,serializedContext:e.stateCursor.serializedContext,sessionState:e.stateCursor.sessionState});if(e.stateCursor.adoptState(a),a.kind===`cancel-turn`)return{kind:`cancel-turn`};if(a.remainder!==void 0)return{delivery:a.remainder,kind:`turn`}}}async function waitForNextSessionAction(e){let t=e.bufferedSessionControls.shift();if(t!==void 0)return{kind:t};for(;e.bufferedDeliveries[0]!==void 0&&isCancelledTaskDelivery(e.bufferedDeliveries[0],e.cancelledTaskIds);)e.bufferedDeliveries.shift();if(e.deferDeliveries!==!0&&!e.commandInbox.hasReadyAuthorization()&&e.bufferedDeliveries.length>0)return{delivery:takeBufferedTurnDelivery(e.bufferedDeliveries,getSessionTaskCohorts(e.stateCursor.sessionState.snapshot?.session.state)),kind:`delivery`};for(;;){let{result:t,source:n}=await e.commandInbox.nextWithSource();if(e.commandInbox.consumeNext(),n===`authorization`)return t.done?{closed:!0,kind:`authorization`,payloads:[]}:{closed:!1,kind:`authorization`,payloads:t.value.kind===`deliver`?t.value.payloads:[]};if(t.done)return{delivery:null,kind:`delivery`};if(t.value.kind===`runtime-action-result`)continue;let r;try{r=sessionInboxWire.decode(t.value)}catch(e){if(!(e instanceof SessionInboxWireError))throw e;await reportDroppedWirePayloadStep({detail:e.message,family:`session-inbox`});continue}if(r.kind===`session-timeout`)return{kind:`expired`};if(r.kind===`clear`||r.kind===`compact`||r.kind===`reset`)return{kind:r.kind};if(r.kind===`cancel`){if(`tasks`in r&&r.tasks===!0&&await cancelAllIndexedSessionTasksStep({serializedContext:e.stateCursor.serializedContext,sessionState:e.stateCursor.sessionState}),r.taskId!==void 0){e.cancelledTaskIds.add(r.taskId);let t=e.bufferedDeliveries.filter(t=>!isCancelledTaskDelivery(t,e.cancelledTaskIds));e.bufferedDeliveries.splice(0,e.bufferedDeliveries.length,...t)}continue}let i=r.taskDeliveryId??r.caller?.taskId;if(!(i!==void 0&&isCancelledTaskDeliveryId(i,e.cancelledTaskIds))){if(i!==void 0){if(e.seenTaskDeliveries.has(i))continue;e.seenTaskDeliveries.add(i)}if(e.deferDeliveries===!0){e.bufferedDeliveries.push(r);continue}return{delivery:r,kind:`delivery`}}}}function isCancelledTaskDelivery(e,t){let n=e.taskDeliveryId??e.caller?.taskId;return n!==void 0&&isCancelledTaskDeliveryId(n,t)}function isCancelledTaskDeliveryId(e,t){return[...t].some(t=>e===t||e.startsWith(`${t}:`))}function takeBufferedTurnDelivery(e,t){let n=e.shift();if(n===void 0)throw Error(`Cannot take a turn delivery from an empty buffer.`);let r=[n],i=n.caller,a=completionCohort(n,t);for(;e.length>0;){let o=e[0];if(o===void 0||(n.taskDeliveryId!==void 0||o.taskDeliveryId!==void 0)&&(a===void 0||completionCohort(o,t)!==a)||i!==void 0&&o.caller!==void 0)break;let s=e.shift();if(s===void 0)throw Error(`Buffered turn delivery disappeared while partitioning.`);r.push(s),i??=s.caller}return coalesceDeliveries(r)}function completionCohort(e,t){if(e.caller===void 0&&e.taskDeliveryId?.endsWith(`:ready:completed`))return t.get(e.taskDeliveryId.slice(0,-16))}export{nextTurnDelivery};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { VercelCreateOptions } from "#execution/sandbox/bindings/vercel-sdk-types.js";
|
|
2
|
+
import type { SandboxBackendTags } from "#public/definitions/sandbox-backend.js";
|
|
3
|
+
export declare function resolveVercelSandboxTags(userTags: VercelCreateOptions["tags"], eveTags: SandboxBackendTags | undefined): Record<string, string> | undefined;
|
|
4
|
+
export declare function ensureVercelSandboxTags(sandbox: {
|
|
5
|
+
readonly tags?: Record<string, string>;
|
|
6
|
+
update(options: {
|
|
7
|
+
tags: Record<string, string>;
|
|
8
|
+
}): Promise<unknown>;
|
|
9
|
+
}, tags: Record<string, string> | undefined): Promise<void>;
|
|
10
|
+
export declare function errorMessage(error: unknown): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function resolveVercelSandboxTags(e,t){let n={};if(e!==void 0)for(let[t,r]of Object.entries(e))n[t]=r;if(t!==void 0)for(let[e,r]of Object.entries(t))n[e]=r;let r=Object.keys(n).length;if(r!==0){if(r>5)throw Error(`Vercel Sandbox supports at most 5 tags. eve reserves "agent", "channel", and "sessionId"; remove or consolidate custom tags passed to vercel().`);return n}}async function ensureVercelSandboxTags(e,t){t===void 0||areVercelSandboxTagsEqual(e.tags,t)||await e.update({tags:t})}function areVercelSandboxTagsEqual(e,t){let n=e??{},r=Object.entries(n),i=Object.entries(t);return r.length===i.length&&i.every(([e,t])=>n[e]===t)}function errorMessage(e){if(e instanceof Error){let t=e.json,n=e.text,r=typeof n==`string`&&n.length>0?n:t===void 0?void 0:JSON.stringify(t);return r===void 0?e.message:`${e.message}: ${r}`}return String(e)}export{ensureVercelSandboxTags,errorMessage,resolveVercelSandboxTags};
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
import{resolveSandboxModelPath}from"#shared/skill-paths.js";import{WORKSPACE_ROOT}from"#runtime/workspace/types.js";import{streamToBuffer}from"#execution/sandbox/stream-utils.js";import{createLoggingSandboxSession}from"#execution/sandbox/logging-session.js";import{buildSandboxSession}from"#execution/sandbox/session.js";import{SandboxTemplateNotProvisionedError}from"#public/definitions/sandbox-backend.js";import{adaptMultiplexedCommandToSandboxProcess}from"#execution/sandbox/multiplexed-command.js";import{applyInitialVercelNetworkPolicy,createVercelNetworkPolicySetter,ensureVercelSandboxBaseRuntime,withBaseSetupNetworkPolicy}from"#execution/sandbox/bindings/vercel-base-runtime.js";import{createVercelEveImageSandbox}from"#execution/sandbox/bindings/vercel-create-sdk.js";import{isVercelSandboxMissingError,isVercelSnapshotUnavailableError}from"#execution/sandbox/bindings/vercel-errors.js";import{getNamedVercelSandbox}from"#execution/sandbox/bindings/vercel-lookup.js";import{deleteVercelSandbox,stopVercelSandbox}from"#execution/sandbox/bindings/vercel-lifecycle.js";import{normalizeVercelReadStream}from"#execution/sandbox/bindings/vercel-read-stream.js";function createVercelSandbox(e={}){let t=e.loadSandboxModule??(async()=>await import(`#compiled/@vercel/sandbox-drives/index.js`)),n=e.loadDeleteSandboxModule??(async()=>await import(`#compiled/@vercel/sandbox/index.js`)),r={timeout:DEFAULT_SANDBOX_TIMEOUT_MS,...e.createOptions},i=e.createSandbox??createVercelEveImageSandbox,a=new Map;return{name:`vercel`,async create(o){let s=resolveVercelSandboxTags(r.tags,o.tags),c=o.templateKey===null?null:await readTemplateForCreate({createOptions:r,loadSandboxModule:t,prewarmedTemplates:a,templateKey:o.templateKey}),l=await t(),u;try{u=await ensureSession({createOptions:r,createSandbox:i,existingMetadata:o.existingMetadata,resolveSessionCreateOptions:e.resolveSessionCreateOptions,sandboxModule:l,sessionId:o.tags?.sessionId??o.sessionKey,sessionKey:o.sessionKey,snapshotId:c?.snapshotId,tags:s})}catch(e){throw c!==null&&(isVercelSnapshotUnavailableError(e)||isVercelSandboxMissingError(e))?(a.delete(c.templateKey),await(await getNamedVercelSandbox({createOptions:r,sandboxModule:l,sandboxName:c.sandboxName}))?.delete(),new SandboxTemplateNotProvisionedError({backendName:`vercel`,templateKey:c.templateKey})):Error(`Failed to create sandbox session "${o.sessionKey}": ${errorMessage(e)}`,{cause:e})}return await ensureVercelSandboxBaseRuntime(u.sandbox),c===null&&u.created&&await applyInitialVercelNetworkPolicy(u.sandbox,r.networkPolicy),createHandle({createOptions:r,loadDeleteSandboxModule:n,sandbox:u.sandbox,sessionKey:o.sessionKey})},async prewarm(e){let n;try{n=await ensureTemplateWithUnavailableRetry({bootstrap:e.bootstrap,createOptions:r,createSandbox:i,loadSandboxModule:t,log:e.log,seedFiles:e.seedFiles,templateKey:e.templateKey})}catch(t){throw Error(`Failed to prewarm Vercel sandbox template "${e.templateKey}": ${errorMessage(t)}`,{cause:t})}return a.set(e.templateKey,n.template),{reused:n.reused}}}}async function ensureTemplateWithUnavailableRetry(e){try{return await ensureTemplate(e)}catch(t){if(!isVercelSnapshotUnavailableError(t)&&!isVercelSandboxMissingError(t))throw t;return e.log?.(`cached template disappeared; rebuilding sandbox template`),await ensureTemplate(e)}}async function readTemplate(e){let t=e.prewarmedTemplates.get(e.templateKey);if(t!==void 0)return t;let n=await e.loadSandboxModule(),r=await getNamedVercelSandbox({createOptions:e.createOptions,sandboxModule:n,sandboxName:e.templateKey});if(r===null||typeof r.currentSnapshotId!=`string`)throw new SandboxTemplateNotProvisionedError({backendName:`vercel`,templateKey:e.templateKey});return{sandboxName:r.name,snapshotId:r.currentSnapshotId,templateKey:e.templateKey}}async function readTemplateForCreate(e){try{return await readTemplate(e)}catch(t){throw SandboxTemplateNotProvisionedError.is(t)?t:Error(`Failed to read sandbox template "${e.templateKey}": ${errorMessage(t)}`,{cause:t})}}async function ensureTemplate(e){let t=await e.loadSandboxModule(),n=await getNamedVercelSandbox({createOptions:e.createOptions,sandboxModule:t,sandboxName:e.templateKey}),r=resolveVercelSandboxTags(e.createOptions.tags,e.tags),i=extractAuthorSnapshotId(e.createOptions);if(n!==null&&isUnprovisionedTerminalTemplateSandbox(n,i)&&(await n.delete(),n=null),n===null?n=await e.createSandbox({sandboxModule:t,createOptions:withBaseSetupNetworkPolicy({...e.createOptions,name:e.templateKey,persistent:!1,tags:r})}):await ensureVercelSandboxTags(n,r),typeof n.currentSnapshotId==`string`&&n.currentSnapshotId.length>0&&n.currentSnapshotId!==i)return{reused:!0,template:{sandboxName:n.name,snapshotId:n.currentSnapshotId,templateKey:e.templateKey}};e.log?.(`preparing base runtime inside sandbox`),await ensureVercelSandboxBaseRuntime(n),await applyInitialVercelNetworkPolicy(n,e.createOptions.networkPolicy);let a=buildSandboxSession(createVercelInternalSandboxSession(n,e.templateKey),createVercelNetworkPolicySetter(n));await writeVercelSandboxSeedFiles({sandbox:n,seedFiles:e.seedFiles,session:a}),e.bootstrap!==void 0&&(e.log?.(`running sandbox bootstrap`),await e.bootstrap({use:async t=>(t!==void 0&&await n.update(t),createLoggingSandboxSession({log:e.log,session:a}))}));let o=await n.snapshot();return{reused:!1,template:{sandboxName:n.name,snapshotId:o.snapshotId,templateKey:e.templateKey}}}async function ensureSession(e){let t=getVercelSandboxName(e.existingMetadata)??e.sessionKey,n=await getNamedVercelSandbox({createOptions:e.createOptions,sandboxModule:e.sandboxModule,sandboxName:t});if(n!==null)return await ensureVercelSandboxTags(n,e.tags),{created:!1,sandbox:n};let r=createSessionCreateParams(e,t,await e.resolveSessionCreateOptions?.({session:{id:e.sessionId}}));return e.tags!==void 0&&(r.tags=e.tags),{created:!0,sandbox:await e.createSandbox({createOptions:r,sandboxModule:e.sandboxModule})}}function createSessionCreateParams(e,t,n={}){let r={...e.createOptions,...n};if(e.snapshotId===void 0)return withBaseSetupNetworkPolicy({...r,name:t,persistent:!0});let{image:i,runtime:a,source:o,...s}=r;return{...s,name:t,persistent:!0,source:{snapshotId:e.snapshotId,type:`snapshot`}}}function createHandle(e){let{sandbox:t,sessionKey:n}=e;return{session:buildSandboxSession(createVercelInternalSandboxSession(t,n),createVercelNetworkPolicySetter(t)),useSessionFn:async e=>(e!==void 0&&await t.update(e),buildSandboxSession(createVercelInternalSandboxSession(t,n),createVercelNetworkPolicySetter(t))),async captureState(){return{backendName:`vercel`,metadata:{sandboxName:t.name},sessionKey:n}},async delete(n){await deleteVercelSandbox({createOptions:e.createOptions,loadDeleteSandboxModule:e.loadDeleteSandboxModule,sandbox:t,signal:n?.abortSignal})},async stop(){await stopVercelSandbox(t)},async shutdown(){try{await stopVercelSandbox(t)}catch{}}}}function createVercelInternalSandboxSession(e,t){return{id:t,resolvePath:resolveVercelSandboxPath,async spawn(t){let n=await e.runCommand({args:[`-lc`,t.command],cmd:`bash`,cwd:t.workingDirectory??WORKSPACE_ROOT,detached:!0,env:t.env,signal:t.abortSignal});return adaptMultiplexedCommandToSandboxProcess({command:n,getOutput:e=>e.stream})},async readFile(t){return normalizeVercelReadStream(await e.readFile({path:t.path}))},async writeFile(t){let n=await streamToBuffer(t.content);await e.writeFiles([{content:n,path:t.
|
|
1
|
+
import{resolveSandboxModelPath}from"#shared/skill-paths.js";import{WORKSPACE_ROOT}from"#runtime/workspace/types.js";import{streamToBuffer}from"#execution/sandbox/stream-utils.js";import{createLoggingSandboxSession}from"#execution/sandbox/logging-session.js";import{buildSandboxSession}from"#execution/sandbox/session.js";import{SandboxTemplateNotProvisionedError}from"#public/definitions/sandbox-backend.js";import{adaptMultiplexedCommandToSandboxProcess}from"#execution/sandbox/multiplexed-command.js";import{applyInitialVercelNetworkPolicy,createVercelNetworkPolicySetter,ensureVercelSandboxBaseRuntime,withBaseSetupNetworkPolicy}from"#execution/sandbox/bindings/vercel-base-runtime.js";import{createVercelEveImageSandbox}from"#execution/sandbox/bindings/vercel-create-sdk.js";import{ensureVercelSandboxTags,errorMessage,resolveVercelSandboxTags}from"#execution/sandbox/bindings/vercel-options.js";import{isVercelSandboxMissingError,isVercelSnapshotUnavailableError}from"#execution/sandbox/bindings/vercel-errors.js";import{getNamedVercelSandbox}from"#execution/sandbox/bindings/vercel-lookup.js";import{deleteVercelSandbox,stopVercelSandbox}from"#execution/sandbox/bindings/vercel-lifecycle.js";import{normalizeVercelReadStream}from"#execution/sandbox/bindings/vercel-read-stream.js";function createVercelSandbox(e={}){let t=e.loadSandboxModule??(async()=>await import(`#compiled/@vercel/sandbox-drives/index.js`)),n=e.loadDeleteSandboxModule??(async()=>await import(`#compiled/@vercel/sandbox/index.js`)),r={timeout:DEFAULT_SANDBOX_TIMEOUT_MS,...e.createOptions},i=e.createSandbox??createVercelEveImageSandbox,a=new Map;return{name:`vercel`,async create(o){let s=resolveVercelSandboxTags(r.tags,o.tags),c=o.templateKey===null?null:await readTemplateForCreate({createOptions:r,loadSandboxModule:t,prewarmedTemplates:a,templateKey:o.templateKey}),l=await t(),u;try{u=await ensureSession({createOptions:r,createSandbox:i,existingMetadata:o.existingMetadata,resolveSessionCreateOptions:e.resolveSessionCreateOptions,sandboxModule:l,sessionId:o.tags?.sessionId??o.sessionKey,sessionKey:o.sessionKey,snapshotId:c?.snapshotId,tags:s})}catch(e){throw c!==null&&(isVercelSnapshotUnavailableError(e)||isVercelSandboxMissingError(e))?(a.delete(c.templateKey),await(await getNamedVercelSandbox({createOptions:r,sandboxModule:l,sandboxName:c.sandboxName}))?.delete(),new SandboxTemplateNotProvisionedError({backendName:`vercel`,templateKey:c.templateKey})):Error(`Failed to create sandbox session "${o.sessionKey}": ${errorMessage(e)}`,{cause:e})}return await ensureVercelSandboxBaseRuntime(u.sandbox),c===null&&u.created&&await applyInitialVercelNetworkPolicy(u.sandbox,r.networkPolicy),createHandle({createOptions:r,loadDeleteSandboxModule:n,sandbox:u.sandbox,sessionKey:o.sessionKey})},async prewarm(e){let n;try{n=await ensureTemplateWithUnavailableRetry({bootstrap:e.bootstrap,createOptions:r,createSandbox:i,loadSandboxModule:t,log:e.log,seedFiles:e.seedFiles,templateKey:e.templateKey})}catch(t){throw Error(`Failed to prewarm Vercel sandbox template "${e.templateKey}": ${errorMessage(t)}`,{cause:t})}return a.set(e.templateKey,n.template),{reused:n.reused}}}}async function ensureTemplateWithUnavailableRetry(e){try{return await ensureTemplate(e)}catch(t){if(!isVercelSnapshotUnavailableError(t)&&!isVercelSandboxMissingError(t))throw t;return e.log?.(`cached template disappeared; rebuilding sandbox template`),await ensureTemplate(e)}}async function readTemplate(e){let t=e.prewarmedTemplates.get(e.templateKey);if(t!==void 0)return t;let n=await e.loadSandboxModule(),r=await getNamedVercelSandbox({createOptions:e.createOptions,sandboxModule:n,sandboxName:e.templateKey});if(r===null||typeof r.currentSnapshotId!=`string`)throw new SandboxTemplateNotProvisionedError({backendName:`vercel`,templateKey:e.templateKey});return{sandboxName:r.name,snapshotId:r.currentSnapshotId,templateKey:e.templateKey}}async function readTemplateForCreate(e){try{return await readTemplate(e)}catch(t){throw SandboxTemplateNotProvisionedError.is(t)?t:Error(`Failed to read sandbox template "${e.templateKey}": ${errorMessage(t)}`,{cause:t})}}async function ensureTemplate(e){let t=await e.loadSandboxModule(),n=await getNamedVercelSandbox({createOptions:e.createOptions,sandboxModule:t,sandboxName:e.templateKey}),r=resolveVercelSandboxTags(e.createOptions.tags,e.tags),i=extractAuthorSnapshotId(e.createOptions);if(n!==null&&isUnprovisionedTerminalTemplateSandbox(n,i)&&(await n.delete(),n=null),n===null?n=await e.createSandbox({sandboxModule:t,createOptions:withBaseSetupNetworkPolicy({...e.createOptions,name:e.templateKey,persistent:!1,tags:r})}):await ensureVercelSandboxTags(n,r),typeof n.currentSnapshotId==`string`&&n.currentSnapshotId.length>0&&n.currentSnapshotId!==i)return{reused:!0,template:{sandboxName:n.name,snapshotId:n.currentSnapshotId,templateKey:e.templateKey}};e.log?.(`preparing base runtime inside sandbox`),await ensureVercelSandboxBaseRuntime(n),await applyInitialVercelNetworkPolicy(n,e.createOptions.networkPolicy);let a=buildSandboxSession(createVercelInternalSandboxSession(n,e.templateKey),createVercelNetworkPolicySetter(n));await writeVercelSandboxSeedFiles({sandbox:n,seedFiles:e.seedFiles,session:a}),e.bootstrap!==void 0&&(e.log?.(`running sandbox bootstrap`),await e.bootstrap({use:async t=>(t!==void 0&&await n.update(t),createLoggingSandboxSession({log:e.log,session:a}))}));let o=await n.snapshot();return{reused:!1,template:{sandboxName:n.name,snapshotId:o.snapshotId,templateKey:e.templateKey}}}async function ensureSession(e){let t=getVercelSandboxName(e.existingMetadata)??e.sessionKey,n=await getNamedVercelSandbox({createOptions:e.createOptions,sandboxModule:e.sandboxModule,sandboxName:t});if(n!==null)return await ensureVercelSandboxTags(n,e.tags),{created:!1,sandbox:n};let r=createSessionCreateParams(e,t,await e.resolveSessionCreateOptions?.({session:{id:e.sessionId}}));return e.tags!==void 0&&(r.tags=e.tags),{created:!0,sandbox:await e.createSandbox({createOptions:r,sandboxModule:e.sandboxModule})}}function createSessionCreateParams(e,t,n={}){let r={...e.createOptions,...n};if(e.snapshotId===void 0)return withBaseSetupNetworkPolicy({...r,name:t,persistent:!0});let{image:i,runtime:a,source:o,...s}=r;return{...s,name:t,persistent:!0,source:{snapshotId:e.snapshotId,type:`snapshot`}}}function createHandle(e){let{sandbox:t,sessionKey:n}=e;return{session:buildSandboxSession(createVercelInternalSandboxSession(t,n),createVercelNetworkPolicySetter(t)),useSessionFn:async e=>(e!==void 0&&await t.update(e),buildSandboxSession(createVercelInternalSandboxSession(t,n),createVercelNetworkPolicySetter(t))),async captureState(){return{backendName:`vercel`,metadata:{sandboxName:t.name},sessionKey:n}},async delete(n){await deleteVercelSandbox({createOptions:e.createOptions,loadDeleteSandboxModule:e.loadDeleteSandboxModule,sandbox:t,signal:n?.abortSignal})},async stop(){await stopVercelSandbox(t)},async shutdown(){try{await stopVercelSandbox(t)}catch{}}}}function createVercelInternalSandboxSession(e,t){return{id:t,resolvePath:resolveVercelSandboxPath,async spawn(t){let n=await e.runCommand({args:[`-lc`,t.command],cmd:`bash`,cwd:t.workingDirectory??WORKSPACE_ROOT,detached:!0,env:t.env,signal:t.abortSignal});return adaptMultiplexedCommandToSandboxProcess({command:n,getOutput:e=>e.stream})},async readFile(t){return normalizeVercelReadStream(await e.readFile({path:t.path}))},async writeFile(t){let n=await streamToBuffer(t.content),r=await resolveVercelWritePath(e,t.path,t.abortSignal);await e.writeFiles([{content:n,path:r}],{signal:t.abortSignal})},async removePath(t){await e.fs.rm(t.path,{force:t.force,recursive:t.recursive,signal:t.abortSignal})}}}async function writeVercelSandboxSeedFiles(e){if(e.seedFiles.length===0)return;let t=await Promise.all(e.seedFiles.map(async t=>({content:typeof t.content==`string`?Buffer.from(t.content):t.content,path:await resolveSandboxModelPath({path:t.path,sandbox:e.session})})));await e.sandbox.writeFiles(t)}function resolveVercelSandboxPath(e){return e.startsWith(`/`)?e:`${WORKSPACE_ROOT}/${e}`}async function resolveVercelWritePath(e,t,n){let r=await e.runCommand({args:[`-m`,`--`,t],cmd:`realpath`,signal:n}),i=(await r.stdout()).trim();if(r.exitCode!==0||!i.startsWith(`/`)||i.includes(`
|
|
2
|
+
`))throw Error(`Failed to resolve Vercel Sandbox write path: ${t}`);return i}function isUnprovisionedTerminalTemplateSandbox(e,t){let n=e.currentSnapshotId;return typeof n==`string`&&n.length>0&&n!==t?!1:e.status===`aborted`||e.status===`failed`||e.status===`stopped`}function extractAuthorSnapshotId(e){let t=e.source;if(t?.type===`snapshot`&&typeof t.snapshotId==`string`)return t.snapshotId}function getVercelSandboxName(e){let t=e?.sandboxName;return typeof t==`string`?t:void 0}const DEFAULT_SANDBOX_TIMEOUT_MS=18e5;export{createVercelSandbox};
|
|
@@ -1,12 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* Wraps a value in POSIX single-quotes, escaping any embedded single-quotes.
|
|
3
|
-
*
|
|
4
|
-
* Used by the `glob` and `grep` execution cores to safely embed model-supplied
|
|
5
|
-
* patterns, paths, and globs into shell commands run via `sandbox.run`.
|
|
6
|
-
*
|
|
7
|
-
* The quoting strategy is the standard POSIX approach: wrap the value in
|
|
8
|
-
* single-quotes and replace each embedded `'` with `'\''` (end the
|
|
9
|
-
* single-quoted string, insert an escaped single-quote, re-open
|
|
10
|
-
* single-quoting).
|
|
11
|
-
*/
|
|
12
|
-
export declare function shellQuote(value: string): string;
|
|
1
|
+
export { shellQuote } from "#shared/shell-quote.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
import{shellQuote}from"#shared/shell-quote.js";export{shellQuote};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{SESSION_INBOX_WIRE_VERSION,SESSION_INBOX_WIRE_VERSION_METADATA_KEY}from"#execution/wire/session-inbox-contract.js";import{createHook}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,disposeHook}from"#execution/hook-ownership.js";function createSessionCommandInbox(){let e,t,n,r=[],i=[],a=0,o=null,s,c,enqueue=e=>{i.push(e),i.sort((e,t)=>e.order-t.order),c?.(),c=void 0},arm=e=>{e.closed||e.pending||(e.pending=!0,e.resolved=void 0,(e.retired?Promise.resolve(e.hook).then(e=>({done:!1,value:e})):e.iterator.next()).then(t=>{let n={order:a++,result:t,state:e};e.resolved=n,e.enabled&&enqueue(n)},()=>{}))},enable=e=>{e.enabled=!0,e.resolved!==void 0&&enqueue(e.resolved)},createState=e=>{let t=createHook({metadata:{[SESSION_INBOX_WIRE_VERSION_METADATA_KEY]:SESSION_INBOX_WIRE_VERSION},token:e});return{closed:!1,enabled:!1,hook:t,iterator:t[Symbol.asyncIterator](),pending:!1,retired:!1}},states=()=>[e,t,n,...r].filter(e=>e!==void 0),nextRead=()=>{if(e===void 0)throw Error(`Cannot wait for session commands before claiming the stable inbox.`);if(o!==null)return o;let t=states();for(let e of t)arm(e);return t.every(e=>e.closed)?(s={order:a++,result:{done:!0,value:void 0},state:e},o=Promise.resolve(s.result),o):(o=(async()=>{for(;i.length===0;)await new Promise(e=>{c=e});let e=i.shift();return s=e,e.result})(),o)};return{async claimAuthorization(e){if(n!==void 0){if(n.hook.token===e)return;throw Error(`A session command inbox cannot change its authorization token.`)}let t=createState(e);await claimHookOwnership(t.hook),n=t},async claimStable(t){if(e!==void 0){if(e.hook.token===t)return;throw Error(`A session command inbox cannot change its stable token.`)}let n=createState(t);await claimHookOwnership(n.hook),enable(n),e=n},consumeNext(){if(s===void 0)throw Error(`Cannot consume a session command before it resolves.`);s.state.pending=!1,s.state.resolved=void 0,s.result.done&&(s.state.closed=!0),s=void 0,o=null},async dispose(){let r=[t,e,n].filter(e=>e!==void 0);t=void 0,e=void 0,n=void 0,await Promise.all(r.map(async e=>await disposeHook(e.hook)))},hasReadyAuthorization(){return n?.enabled!==!0||n.resolved===void 0?!1:s===void 0?i[0]?.state===n:s.state===n},next:nextRead,async nextWithSource(){return{result:await nextRead(),source:s!==void 0&&s.state===n?`authorization`:`session`}},setAuthorizationWindow(e){if(n===void 0){if(e)throw Error(`Cannot open the authorization window before claiming its hook.`);return}if(e){n.enabled||enable(n),s!==void 0&&s.state!==n&&n.resolved!==void 0&&n.resolved.order<s.order&&(enqueue(s),s=void 0,o=null),o!==null&&arm(n);return}n.enabled=!1;let t=i.findIndex(e=>e.state===n);t!==-1&&i.splice(t,1)},async rekeyContinuation(e){if(!e||t?.hook.token===e)return;let n=createState(e);if(t===void 0){await claimHookOwnership(n.hook),enable(n),t=n,o!==null&&arm(n);return}arm(n),await claimHookOwnership(n.hook),enable(n);let i=t;t=n,arm(i);try{await disposeHook(i.hook)}catch(e){t=void 0;try{await disposeHook(n.hook)}catch{}throw e}i.retired=!0,r.push(i)}}}export{createSessionCommandInbox};
|
|
1
|
+
import{SESSION_INBOX_WIRE_VERSION,SESSION_INBOX_WIRE_VERSION_METADATA_KEY,WORKFLOW_TASK_AUTHORIZATION_METADATA_KEY}from"#execution/wire/session-inbox-contract.js";import{createHook}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,disposeHook}from"#execution/hook-ownership.js";function createSessionCommandInbox(){let e,t,n,r=[],i=[],a=0,o=null,s,c,enqueue=e=>{i.push(e),i.sort((e,t)=>e.order-t.order),c?.(),c=void 0},arm=e=>{e.closed||e.pending||(e.pending=!0,e.resolved=void 0,(e.retired?Promise.resolve(e.hook).then(e=>({done:!1,value:e})):e.iterator.next()).then(t=>{let n={order:a++,result:t,state:e};e.resolved=n,e.enabled&&enqueue(n)},()=>{}))},enable=e=>{e.enabled=!0,e.resolved!==void 0&&enqueue(e.resolved)},createState=e=>{let t=createHook({metadata:{[SESSION_INBOX_WIRE_VERSION_METADATA_KEY]:SESSION_INBOX_WIRE_VERSION,[WORKFLOW_TASK_AUTHORIZATION_METADATA_KEY]:!0},token:e});return{closed:!1,enabled:!1,hook:t,iterator:t[Symbol.asyncIterator](),pending:!1,retired:!1}},states=()=>[e,t,n,...r].filter(e=>e!==void 0),nextRead=()=>{if(e===void 0)throw Error(`Cannot wait for session commands before claiming the stable inbox.`);if(o!==null)return o;let t=states();for(let e of t)arm(e);return t.every(e=>e.closed)?(s={order:a++,result:{done:!0,value:void 0},state:e},o=Promise.resolve(s.result),o):(o=(async()=>{for(;i.length===0;)await new Promise(e=>{c=e});let e=i.shift();return s=e,e.result})(),o)};return{async claimAuthorization(e){if(n!==void 0){if(n.hook.token===e)return;throw Error(`A session command inbox cannot change its authorization token.`)}let t=createState(e);await claimHookOwnership(t.hook),n=t},async claimStable(t){if(e!==void 0){if(e.hook.token===t)return;throw Error(`A session command inbox cannot change its stable token.`)}let n=createState(t);await claimHookOwnership(n.hook),enable(n),e=n},consumeNext(){if(s===void 0)throw Error(`Cannot consume a session command before it resolves.`);s.state.pending=!1,s.state.resolved=void 0,s.result.done&&(s.state.closed=!0),s=void 0,o=null},async dispose(){let r=[t,e,n].filter(e=>e!==void 0);t=void 0,e=void 0,n=void 0,await Promise.all(r.map(async e=>await disposeHook(e.hook)))},hasReadyAuthorization(){return n?.enabled!==!0||n.resolved===void 0?!1:s===void 0?i[0]?.state===n:s.state===n},next:nextRead,async nextWithSource(){return{result:await nextRead(),source:s!==void 0&&s.state===n?`authorization`:`session`}},setAuthorizationWindow(e){if(n===void 0){if(e)throw Error(`Cannot open the authorization window before claiming its hook.`);return}if(e){n.enabled||enable(n),s!==void 0&&s.state!==n&&n.resolved!==void 0&&n.resolved.order<s.order&&(enqueue(s),s=void 0,o=null),o!==null&&arm(n);return}n.enabled=!1;let t=i.findIndex(e=>e.state===n);t!==-1&&i.splice(t,1)},async rekeyContinuation(e){if(!e||t?.hook.token===e)return;let n=createState(e);if(t===void 0){await claimHookOwnership(n.hook),enable(n),t=n,o!==null&&arm(n);return}arm(n),await claimHookOwnership(n.hook),enable(n);let i=t;t=n,arm(i);try{await disposeHook(i.hook)}catch(e){t=void 0;try{await disposeHook(n.hook)}catch{}throw e}i.retired=!0,r.push(i)}}}export{createSessionCommandInbox};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createHook}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,isHookConflictError}from"#execution/hook-ownership.js";import{isReadyTaskStatus,isTerminalTaskStatus,readTaskInputRequestId}from"#tasks/types.js";import{appendTaskProgressStep,appendTaskViewStep,deliverTaskInputResponsesStep,wakeTaskAgentRequestParentStep,wakeTaskAuthorizationParentStep,wakeTaskMessageParentStep,wakeTaskParentStep,wakeTaskUpdateParentStep,wakeWorkflowTaskInputRequestParentStep}from"#execution/tasks/child/steps.js";import{createWorkflowBodyRef,executeWorkflowBody}from"#execution/tools/workflow/body.js";import{createChannelReader,raceChannelReads}from"#execution/tools/workflow/owner-channels.js";import{openWorkflowToolRunOwnerInbox}from"#execution/tools/workflow/owner.js";import{workflowToolRunOutcomeToTaskCommand,workflowToolRunReportToTaskPayload,workflowToolRunRequestToTaskInputRequest}from"#execution/tools/workflow/owner-inbox.js";import{applyTaskTransition}from"#tasks/transitions.js";async function taskRunWorkflow(e){"use workflow";let t=createHook({token:e.taskInboxToken}),n=openWorkflowToolRunOwnerInbox(),r=[n.reader,createChannelReader(`commands`,t)],i=e.initialView,a=!1,o=!1,s,c=[],l=0,u={messages:[],ownerRequests:[]},d=new Map,f=new AbortController,p,m=e.workflow===void 0,h;try{await claimHookOwnership(t)}catch(e){if(isHookConflictError(e))return;throw e}for(await appendTaskViewStep({activityObserver:e.activityObserver,view:i});h!==void 0&&l>=h.reportCount&&(m=!0,await applyPayload({command:workflowToolRunOutcomeToTaskCommand({from:createWorkflowBodyRef({...e.workflow,execution:`background`}),result:h.outcome}),kind:`task-command`}),h=void 0,i.status===`cancelled`&&a&&!o&&await wakeTaskParentStep({token:e.parentContinuationToken,view:i})),!isFinished();){let e=await raceChannelReads(p===void 0?r:[...r,p]);if(e.channel===`body`){if(p=void 0,e.next.done)continue;h=e.next.value;continue}if(e.next.done)return;if(e.channel===`workflow`){let t=e.next.value;if(t.kind===`report`){await applyPayload(workflowToolRunReportToTaskPayload(t,i.taskId,l++));continue}if(t.kind===`outcome`){await applyPayload({command:workflowToolRunOutcomeToTaskCommand(t),kind:`task-command`});continue}let n=t,r=n.request.kind;if(r===`agent-invoke`||r===`agent-settled`||r===`authorization-request`){await handleOwnerRequest(n);continue}n.requestCoordinates===void 0&&d.set(n.replyTo,{runId:n.from.runId}),await applyPayload(workflowToolRunRequestToTaskInputRequest(n));continue}await applyPayload(e.next.value)}function isFinished(){return isTerminalTaskStatus(i.status)&&a&&m}async function handleUpdate(t){if(i.metadata.kind===`subagent`){if(o)return;a&&!isTerminalTaskStatus(i.status)?await wakeTaskUpdateParentStep({token:e.parentContinuationToken,update:t,view:i}):c.push(t);return}await appendTaskProgressStep({progress:{callId:t.callId,kind:`task-progress`,taskId:i.taskId,update:t.message,updateIndex:t.updateIndex}})}async function handleMessage(t){if(!(o||isTerminalTaskStatus(i.status))){if(!a){u.messages.push(t);return}await wakeTaskMessageParentStep({message:t,taskId:i.taskId,token:e.parentContinuationToken})}}async function applyPayload(t){let r=t.kind===`task-command`&&t.command.kind===`ready`,c=t.kind===`task-command`&&t.command.kind===`reject-dispatch`;if((r||c)&&(a=!0),c&&(o=!0),(r||c)&&(c||isTerminalTaskStatus(i.status)?m=!0:e.workflow!==void 0&&p===void 0&&h===void 0&&!m&&(p=createChannelReader(`body`,awaitBodyResult(executeWorkflowBody({...e.workflow,execution:`background`,owner:n.owner},f.signal)))),await flushPendingTraffic()),t.kind===`task-input-request`&&(s=t),t.kind===`task-message`){await handleMessage(t);return}if(t.kind===`task-update`){await handleUpdate(t);return}let l;if(t.kind===`input-response`)l=i.status===`input_required`?await resolveAnsweredCommand(i,t,d.get(t.childContinuationToken)):void 0;else if(t.kind===`task-input-request`)l={inputRequests:t.requests??[t.request],kind:`require-input`};else if(t.kind===`task-command`)l=t.command;else return;if(l===void 0)return;if(r&&isTerminalTaskStatus(i.status)){await flushUpdates(!0),await wakeTaskParentStep({token:e.parentContinuationToken,view:i});return}let u=i
|
|
1
|
+
import{createHook}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,isHookConflictError}from"#execution/hook-ownership.js";import{isReadyTaskStatus,isTerminalTaskStatus,readTaskInputRequestId}from"#tasks/types.js";import{appendTaskProgressStep,appendTaskViewStep,deliverTaskInputResponsesStep,wakeTaskAgentRequestParentStep,wakeTaskAuthorizationParentStep,wakeTaskMessageParentStep,wakeTaskParentStep,wakeTaskUpdateParentStep,wakeWorkflowTaskInputRequestParentStep}from"#execution/tasks/child/steps.js";import{createWorkflowBodyRef,executeWorkflowBody}from"#execution/tools/workflow/body.js";import{resumeHookStep}from"#execution/tools/workflow/resume-hook-step.js";import{createChannelReader,raceChannelReads}from"#execution/tools/workflow/owner-channels.js";import{openWorkflowToolRunOwnerInbox}from"#execution/tools/workflow/owner.js";import{workflowToolRunOutcomeToTaskCommand,workflowToolRunReportToTaskPayload,workflowToolRunRequestToTaskInputRequest}from"#execution/tools/workflow/owner-inbox.js";import{applyTaskTransition}from"#tasks/transitions.js";async function taskRunWorkflow(e){"use workflow";let t=createHook({token:e.taskInboxToken}),n=openWorkflowToolRunOwnerInbox(),r=[n.reader,createChannelReader(`commands`,t)],i=e.initialView,a=!1,o=!1,s,c=[],l=0,u={messages:[],ownerRequests:[]},d=new Map,f=new AbortController,p,m=e.workflow===void 0,h;try{await claimHookOwnership(t)}catch(e){if(isHookConflictError(e))return;throw e}for(await appendTaskViewStep({activityObserver:e.activityObserver,view:i});h!==void 0&&l>=h.reportCount&&(m=!0,await applyPayload({command:workflowToolRunOutcomeToTaskCommand({from:createWorkflowBodyRef({...e.workflow,execution:`background`}),result:h.outcome}),kind:`task-command`}),h=void 0,i.status===`cancelled`&&a&&!o&&await wakeTaskParentStep({token:e.parentContinuationToken,view:i})),!isFinished();){let e=await raceChannelReads(p===void 0?r:[...r,p]);if(e.channel===`body`){if(p=void 0,e.next.done)continue;h=e.next.value;continue}if(e.next.done)return;if(e.channel===`workflow`){let t=e.next.value;if(t.kind===`report`){await applyPayload(workflowToolRunReportToTaskPayload(t,i.taskId,l++));continue}if(t.kind===`outcome`){await applyPayload({command:workflowToolRunOutcomeToTaskCommand(t),kind:`task-command`});continue}let n=t,r=n.request.kind;if(r===`agent-invoke`||r===`agent-settled`||r===`authorization-request`){await handleOwnerRequest(n);continue}n.requestCoordinates===void 0&&d.set(n.replyTo,{runId:n.from.runId}),await applyPayload(workflowToolRunRequestToTaskInputRequest(n));continue}await applyPayload(e.next.value)}function isFinished(){return isTerminalTaskStatus(i.status)&&a&&m}async function handleUpdate(t){if(i.metadata.kind===`subagent`){if(o)return;a&&!isTerminalTaskStatus(i.status)?await wakeTaskUpdateParentStep({token:e.parentContinuationToken,update:t,view:i}):c.push(t);return}await appendTaskProgressStep({progress:{callId:t.callId,kind:`task-progress`,taskId:i.taskId,update:t.message,updateIndex:t.updateIndex}})}async function handleMessage(t){if(!(o||isTerminalTaskStatus(i.status))){if(!a){u.messages.push(t);return}await wakeTaskMessageParentStep({message:t,taskId:i.taskId,token:e.parentContinuationToken})}}async function applyPayload(t){let r=t.kind===`task-command`&&t.command.kind===`ready`,c=t.kind===`task-command`&&t.command.kind===`reject-dispatch`;if((r||c)&&(a=!0),c&&(o=!0),(r||c)&&(c||isTerminalTaskStatus(i.status)?m=!0:e.workflow!==void 0&&p===void 0&&h===void 0&&!m&&(p=createChannelReader(`body`,awaitBodyResult(executeWorkflowBody({...e.workflow,execution:`background`,owner:n.owner},f.signal)))),await flushPendingTraffic()),t.kind===`task-input-request`&&(s=t),t.kind===`task-message`){await handleMessage(t);return}if(t.kind===`task-update`){await handleUpdate(t);return}let l;if(t.kind===`input-response`)l=i.status===`input_required`?await resolveAnsweredCommand(i,t,d.get(t.childContinuationToken)):void 0;else if(t.kind===`task-input-request`)l={inputRequests:t.requests??[t.request],kind:`require-input`};else if(t.kind===`task-command`)l=t.command;else return;if(l===void 0)return;if(r&&isTerminalTaskStatus(i.status)){await flushUpdates(!0),await wakeTaskParentStep({token:e.parentContinuationToken,view:i});return}let u=i;await transitionTask(l)&&(l.kind===`cancel`&&(f.abort(Error(`Task ${i.taskId} was cancelled.`)),p===void 0&&(m=!0)),isTerminalTaskStatus(i.status)||await flushUpdates(),s!==void 0&&a&&i.status===`input_required`?(await wakeWorkflowTaskInputRequestParentStep({request:s,taskId:i.taskId,token:e.parentContinuationToken}),s=void 0):!o&&a&&(l.kind!==`cancel`||m)&&(!isTerminalTaskStatus(u.status)&&isTerminalTaskStatus(i.status)||!isReadyTaskStatus(u.status)&&isReadyTaskStatus(i.status)&&s===void 0)&&await wakeTaskParentStep({token:e.parentContinuationToken,view:i}),i.status!==`input_required`&&(s=void 0))}async function flushUpdates(t=!1){if(!(!a||isTerminalTaskStatus(i.status)&&!t)){for(let t of c)await wakeTaskUpdateParentStep({token:e.parentContinuationToken,update:t,view:i});c=[]}}async function transitionTask(t){let n=applyTaskTransition(i,t);return n.action===`accepted`&&(i=n.view,await appendTaskViewStep({activityObserver:e.activityObserver,view:i}),!0)}async function handleOwnerRequest(t){if(!a){u.ownerRequests.push(t);return}let{request:n,replyTo:r}=t;if(n.kind===`authorization-request`&&n.event.childSessionId===t.from.runId){await handleStepAuthorization(n,r);return}if(!(o||isTerminalTaskStatus(i.status))){if(n.kind===`authorization-request`){await wakeTaskAuthorizationParentStep({request:n,taskId:i.taskId,token:e.parentContinuationToken});return}await wakeTaskAgentRequestParentStep({request:t,taskId:i.taskId,token:e.parentContinuationToken})}}async function handleStepAuthorization(t,n){let r=t.event.event,a=r.type===`authorization.completed`;if(!o&&(!isTerminalTaskStatus(i.status)||a)){let n=`attemptId`in r.data?r.data.attemptId:void 0;n!==void 0&&r.type===`authorization.required`?await transitionTask({kind:`require-input`,inputRequests:[...i.status===`input_required`?i.inputRequests:[],{kind:`authorization`,requestId:n,name:r.data.name}]}):n!==void 0&&await transitionTask({kind:`answered`,requestIds:[n]}),await wakeTaskAuthorizationParentStep({request:t,taskId:i.taskId,token:e.parentContinuationToken})}await resumeHookStep(n,null,{ifPresent:!0})}async function flushPendingTraffic(){if(!o)for(let t of u.messages)await wakeTaskMessageParentStep({message:t,taskId:i.taskId,token:e.parentContinuationToken});for(let e of u.ownerRequests)await handleOwnerRequest(e);u.messages.length=0,u.ownerRequests.length=0}}async function*awaitBodyResult(e){yield await e}async function resolveAnsweredCommand(e,t,n){if(t.taskId!==e.taskId)return;let r=new Set(e.inputRequests.flatMap(e=>{let t=readTaskInputRequestId(e);return t===void 0?[]:[t]})),i=t.inputResponses.map(e=>e.requestId).filter(e=>r.has(e));if(i.length!==0)return await deliverTaskInputResponsesStep({answer:t,answerHook:n,requestIds:i})===`delivered`?{kind:`answered`,requestIds:i}:void 0}taskRunWorkflow.workflowId=`workflow//eve//taskRunWorkflow`;export{taskRunWorkflow};
|