experimental-ash 0.14.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -0
- package/dist/src/chunks/{dev-authored-source-watcher-DA6pewzf.js → dev-authored-source-watcher-BmtpQdvr.js} +1 -1
- package/dist/src/chunks/{host-D_hajFPO.js → host-q4jM7D0h.js} +2 -2
- package/dist/src/chunks/{paths-BYaK6-t0.js → paths-ByH5Mnvt.js} +24 -24
- package/dist/src/chunks/{prewarm-QPhmJIsB.js → prewarm-BsHOevz0.js} +1 -1
- package/dist/src/cli/commands/info.js +1 -1
- package/dist/src/cli/run.js +1 -1
- package/dist/src/context/key.js +17 -2
- package/dist/src/evals/cli/eval.js +1 -1
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/internal/authored-definition/schema-backed.js +12 -5
- package/dist/src/internal/nitro/host/build-vercel-agent-summary.js +1 -0
- package/dist/src/protocol/vercel-agent-summary.d.ts +8 -1
- package/dist/src/protocol/vercel-agent-summary.js +1 -1
- package/dist/src/public/channels/slack/hitl.d.ts +4 -5
- package/dist/src/public/channels/slack/hitl.js +22 -11
- package/package.json +1 -1
|
@@ -4,13 +4,13 @@ import{i as e}from"./chunk-8L7ocgPr.js";import{t}from"./gray-matter-BxS7ZG-J.js"
|
|
|
4
4
|
`)}function Or(e){return{modules:kr(e.manifest).sort((e,t)=>e.sourceId.localeCompare(t.sourceId)).map(t=>({bindingName:e.nextBindingName(),importSpecifier:Ar({fromDirectory:e.moduleMapDirectory,importSpecifierStyle:e.importSpecifierStyle,targetPath:Pr(e.agentRoot,t.logicalPath)}),sourceId:t.sourceId})),nodeId:e.nodeId}}function kr(e){let t=new Map;e.config.source!==void 0&&t.set(e.config.source.sourceId,e.config.source),e.config.model.source!==void 0&&t.set(e.config.model.source.sourceId,e.config.model.source);for(let n of e.channels)n.kind!==`disabled`&&t.set(n.sourceId,{exportName:n.exportName,sourceKind:`module`,logicalPath:n.logicalPath,sourceId:n.sourceId});for(let n of e.connections)t.set(n.sourceId,{exportName:n.exportName,sourceKind:`module`,logicalPath:n.logicalPath,sourceId:n.sourceId});for(let n of e.tools)t.set(n.sourceId,{exportName:n.exportName,sourceKind:`module`,logicalPath:n.logicalPath,sourceId:n.sourceId});for(let n of e.hooks)t.set(n.sourceId,{exportName:n.exportName,sourceKind:`module`,logicalPath:n.logicalPath,sourceId:n.sourceId});return e.sandbox!==null&&t.set(e.sandbox.sourceId,{exportName:e.sandbox.exportName,sourceKind:`module`,logicalPath:e.sandbox.logicalPath,sourceId:e.sandbox.sourceId}),[...t.values()]}function Ar(e){if(e.importSpecifierStyle===`absolute`)return Sr(Ir(e.targetPath));let t=Fr(e.fromDirectory,e.targetPath);return t.startsWith(`.`)?t:`./${t}`}function jr(e){return Mr([{key:`nodes`,value:Mr(e.map(e=>({key:e.nodeId,value:Mr([{key:`modules`,value:Mr(e.modules.map(e=>({key:e.sourceId,value:e.bindingName})))}],3)})))}],0)}function Mr(e,t=1){if(e.length===0)return`Object.freeze({})`;let n=` `.repeat(t),r=` `.repeat(t+1);return[`Object.freeze({`,e.map(e=>`${r}${JSON.stringify(e.key)}: ${e.value.replaceAll(`
|
|
5
5
|
`,`\n${r}`)}`).join(`,
|
|
6
6
|
`),`${n}})`].join(`
|
|
7
|
-
`)}function Nr(e){let t=R(e);return t.segments.length===0?t.root.length===0?`.`:t.root:Lr(t.root,t.segments.slice(0,-1))}function Pr(e,t){let n=R(e),r=R(t);return r.root.length>0?Lr(r.root,r.segments):Lr(n.root,[...n.segments,...r.segments])}function Fr(e,t){let n=R(e),r=R(t);if(n.root!==r.root)return Ir(t);let i=0;for(;i<n.segments.length&&i<r.segments.length&&n.segments[i]===r.segments[i];)i+=1;let a=[...Array.from({length:n.segments.length-i},()=>`..`),...r.segments.slice(i)];return a.length===0?`.`:a.join(`/`)}function Ir(e){let t=R(e);return Lr(t.root,t.segments)}function R(e){let t=e.replaceAll(`\\`,`/`),n=``,r=t,i=t.match(/^[A-Za-z]:/);i===null?t.startsWith(`/`)&&(n=`/`,r=t.slice(1)):(n=i[0],r=t.slice(n.length),r.startsWith(`/`)&&(n=`${n}/`,r=r.slice(1)));let a=[];for(let e of r.split(`/`))if(!(e.length===0||e===`.`)){if(e===`..`){if(a.length>0&&a[a.length-1]!==`..`){a.pop();continue}n.length===0&&a.push(e);continue}a.push(e)}return{root:n,segments:a}}function Lr(e,t){return e===`/`?t.length===0?`/`:`/${t.join(`/`)}`:e.endsWith(`/`)?t.length===0?e:`${e}${t.join(`/`)}`:e.length>0?t.length===0?e:`${e}/${t.join(`/`)}`:t.length===0?`.`:t.join(`/`)}const Rr=`ash-model-catalog-cache`,zr=b.object({provider:b.string().min(1),providerModelId:b.string().min(1),contextWindowTokens:b.number().int().nonnegative().optional(),maxOutputTokens:b.number().int().nonnegative().optional()}).passthrough(),Br=b.object({slug:b.string().min(1),providers:b.array(zr).min(1)}).passthrough(),Vr=b.object({models:b.array(Br),providerAliases:b.record(b.string(),b.string())}).passthrough();b.object({contextWindowTokens:b.number().int().positive(),maxOutputTokens:b.number().int().positive().optional()}).strict();const Hr=b.object({fetchedAt:b.string(),kind:b.literal(Rr),models:b.array(Br),providerAliases:b.record(b.string(),b.string()),version:b.literal(2)}).strict(),Ur=new Map([[`anthropic/claude-opus-4.7`,{contextWindowTokens:2e5,maxOutputTokens:32e3}],[`openai/gpt-5.4`,{contextWindowTokens:4e5,maxOutputTokens:128e3}],[`openai/gpt-5.4-mini`,{contextWindowTokens:4e5,maxOutputTokens:128e3}]]);function Wr(e){return S(e,`.ash`,`cache`,`model-catalog.json`)}function Gr(e){let t=null,n=null,r=null,i=async()=>(t??=qr(e),await t),a=async()=>{if(n!==null)throw n;if(r!==null)return await r;r=Kr(e).then(e=>(t=Promise.resolve(e),e));try{return await r}catch(e){throw n=e,e}},o=async()=>{let e=await i();if(e!==null&&Xr(e))return e;try{return await a()}catch{return e===null?null:e}};return{async getModelLimits(e){let t=Zr(e),n=await o();if(n!==null){let e=Jr(n.models,t);if(e)for(let t of e.providers){let e=Yr(t);if(e!==null)return e}}return Ur.get(t)??null},async getByProviderModelId(e,t){let n=await o();if(n===null)return null;let r=e.split(`.`)[0],i=n.providerAliases[r]??r,a=Zr(t);for(let e of n.models)for(let t of e.providers)if(t.provider===i&&Zr(t.providerModelId)===a){let n=Yr(t);if(n!==null)return{slug:e.slug,limits:n}}return null}}}async function Kr(e){let t=await fetch(`https://ai-gateway.vercel.sh/v1/models/catalog`);if(!t.ok)throw Error(`AI Gateway model catalog request failed with HTTP ${t.status} ${t.statusText}.`);let n=Vr.safeParse(await t.json());if(!n.success)throw Error(`AI Gateway model catalog response did not match the expected schema.`);let r={fetchedAt:new Date().toISOString(),kind:Rr,models:n.data.models,providerAliases:n.data.providerAliases,version:2};try{let t=Wr(e);await w(S(e,`.ash`,`cache`),{recursive:!0}),await T(t,`${JSON.stringify(r,null,2)}\n`,`utf8`)}catch{}return r}async function qr(e){try{let t=await ge(Wr(e),`utf8`),n=Hr.safeParse(JSON.parse(t));return n.success?n.data:null}catch(e){return e instanceof Error&&`code`in e&&typeof e.code==`string`&&e.code,null}}function Jr(e,t){return e.find(e=>e.slug===t)}function Yr(e){return e.contextWindowTokens===void 0||e.contextWindowTokens<=0?null:{contextWindowTokens:e.contextWindowTokens,...e.maxOutputTokens!==void 0&&e.maxOutputTokens>0&&{maxOutputTokens:e.maxOutputTokens}}}function Xr(e){let t=Date.parse(e.fetchedAt);return Number.isFinite(t)?Date.now()-t<=864e5:!1}function Zr(e){return e.endsWith(`-thinking`)?e.slice(0,-9):e}async function z(e){let t=i(await u(S(e.agentRoot,e.source.logicalPath)),e.source);try{return await o(t)}catch(t){throw Error(`Failed to execute the ${e.kind} export "${e.source.exportName??`default`}" from "${e.source.logicalPath}": ${m(t)}`)}}var Qr=class extends Error{agentId;constructor(e){super(`Agent "${e}" does not have an agent.ts config module. The "model" field is required.`),this.name=`MissingAgentConfigModuleError`,this.agentId=e}};async function $r(e,t){if(e.configModule===void 0)throw new Qr(e.agentId);let n=et(await z({agentRoot:e.agentRoot,kind:`agent config`,source:e.configModule}),`Expected the agent config export "${e.configModule.exportName??`default`}" from "${e.configModule.logicalPath}" to match the public Ash shape.`),r=await ei({modelCatalog:t.modelCatalog,purpose:`the primary compaction trigger model`,requireContextWindowTokens:!0,contextWindowTokens:n.modelContextWindowTokens,providerOptions:n.modelOptions?.providerOptions,source:e.configModule,value:n.model}),i={},a={compaction:i,metadata:n.metadata??{},model:r,name:e.agentId};return n.description!==void 0&&(a.description=n.description),n.build!==void 0&&(a.build={externalDependencies:n.build.externalDependencies===void 0?void 0:[...n.build.externalDependencies]}),a.source={exportName:e.configModule.exportName,sourceKind:`module`,logicalPath:e.configModule.logicalPath,sourceId:e.configModule.sourceId},n.compaction?.model!==void 0&&(i.model=await ei({modelCatalog:t.modelCatalog,purpose:`the compaction summary model`,requireContextWindowTokens:!0,contextWindowTokens:n.compaction.modelContextWindowTokens,providerOptions:n.modelOptions?.providerOptions,source:e.configModule,value:n.compaction.model})),n.compaction?.thresholdPercent!==void 0&&(i.thresholdPercent=n.compaction.thresholdPercent),a}async function ei(e){if(typeof e.value==`string`)return await ti({id:le(e.value),providerOptions:e.providerOptions===void 0?void 0:ee(e.providerOptions)},e);let t=e.source;if(t===void 0)throw Error(`Expected ${e.purpose} to provide a valid AI SDK language model reference.`);let n=e.value,r=n.specificationVersion;if(r!==`v2`&&r!==`v3`&&r!==`v4`||typeof n.provider!=`string`||typeof n.modelId!=`string`||typeof n.doGenerate!=`function`||typeof n.doStream!=`function`)throw Error(`Expected the authored agent config export "${t.exportName??`default`}" from "${t.logicalPath}" to provide a valid AI SDK language model.`);let i={id:le(n),source:{exportName:t.exportName,sourceKind:`module`,logicalPath:t.logicalPath,sourceId:t.sourceId},providerOptions:e.providerOptions===void 0?void 0:ee(e.providerOptions)};if(e.contextWindowTokens===void 0){let t=await e.modelCatalog.getByProviderModelId(n.provider,n.modelId);if(t)return{...i,id:t.slug,contextWindowTokens:t.limits.contextWindowTokens}}return await ti(i,e)}async function ti(e,t){if(t.contextWindowTokens!==void 0)return{...e,contextWindowTokens:t.contextWindowTokens};let n;try{n=await t.modelCatalog.getModelLimits(e.id)}catch(n){if(!t.requireContextWindowTokens)return e;throw Error(`Failed to load AI Gateway model metadata for ${t.purpose} "${e.id}". ${m(n)}`)}if(n===null){if(!t.requireContextWindowTokens)return e;throw Error(`Cannot compile agent compaction because ${t.purpose} "${e.id}" does not have known AI Gateway context window metadata.`)}return{...e,contextWindowTokens:n.contextWindowTokens}}function ni(e){return typeof e==`object`&&!!e&&e.__kind===`ash:channel`}function ri(e,t){if(!ni(e))throw Error(`${t} Use \`defineChannel({ routes, ... })\` (or a wrapper like \`slackChannel\` / \`ashChannel\`) — bare \`{ fetch, receive? }\` channel objects are no longer supported.`);return e}function ii(e){return typeof e==`object`&&!!e&&e.kind===`ash:disabled-channel`}async function ai(e,t){let n=await z({agentRoot:e,kind:`channel`,source:t}),r=j(t.logicalPath).replace(/^channels\//,``);if(ii(n))return{kind:`disabled`,name:r,logicalPath:t.logicalPath};let i=ri(n,`Expected the channel export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Ash shape.`);return i.routes.map(e=>({kind:`channel`,name:r,logicalPath:t.logicalPath,method:e.method.toUpperCase(),urlPath:e.path,sourceId:t.sourceId,sourceKind:`module`,exportName:t.exportName,adapterKind:oi(i.adapter)}))}function oi(e){if(typeof e!=`object`||!e)return;let t=e.kind;return typeof t==`string`&&t.length>0?t:void 0}async function si(e,t){let n=new Map;for(let r of t){let t=await z({agentRoot:e,kind:`channel`,source:r});if(ii(t))continue;let i=j(r.logicalPath).replace(/^channels\//,``);typeof t==`object`&&t&&(n.set(t,i),s(C(S(e,r.logicalPath)),t))}return n}function ci(e,t=`auth`){if(typeof e!=`object`||!e)return`The "${t}" field must be an object with a "getToken" method.`;let n=e;if(typeof n.getToken!=`function`)return`The "${t}.getToken" field must be a function returning Promise<{ token }>.`;let r=n.startAuthorization!==void 0,i=n.completeAuthorization!==void 0;if(!r&&!i&&n.principalType!==void 0&&n.principalType!==`app`&&n.principalType!==`user`)return`The "${t}.principalType" field must be "app" or "user".`;if(r!==i)return`The "${t}" field must provide either both "startAuthorization" and "completeAuthorization" (interactive OAuth) or neither (getToken-only). Got only "${r?`startAuthorization`:`completeAuthorization`}".`;if(r&&typeof n.startAuthorization!=`function`)return`The "${t}.startAuthorization" field must be a function when provided.`;if(i&&typeof n.completeAuthorization!=`function`)return`The "${t}.completeAuthorization" field must be a function when provided.`;if(r&&n.principalType!==`user`)return`Interactive authorization (startAuthorization + completeAuthorization) is restricted to "principalType": "user" in v1. See D10 of research/connections/connection-principal-model.md for the rationale.`}function li(e,t,n=`auth`){let r=ci(e,n);if(r!==void 0)throw Error(`${t} ${r}`);let i=e,a=ui(i.vercelConnect);if(i.startAuthorization!==void 0&&i.completeAuthorization!==void 0){let e={completeAuthorization:i.completeAuthorization,getToken:i.getToken,principalType:`user`,startAuthorization:i.startAuthorization};return a===void 0?e:{...e,vercelConnect:a}}let o={getToken:i.getToken,principalType:i.principalType??`app`};return a===void 0?o:{...o,vercelConnect:a}}function ui(e){if(typeof e!=`object`||!e)return;let t=e.connector;if(!(typeof t!=`string`||t.length===0))return{connector:t}}const di=[`approval`,`auth`,`description`,`headers`,`tools`,`url`],fi=[`completeAuthorization`,`getToken`,`principalType`,`startAuthorization`,`vercelConnect`];function pi(e,t){let r=n(e,t);a(r,di,t),mi(r,t),hi(r,t);let i=gi(r,t),o=_i(r,t),s=vi(r,t);if(i!==void 0&&o!==void 0&&typeof o!=`function`&&Object.keys(o).some(e=>e.toLowerCase()===`authorization`))throw Error(`${t} "headers" must not include an "Authorization" key when "auth" is also provided.`);let c={description:r.description,url:r.url};if(i!==void 0&&(c.auth=i),o!==void 0&&(c.headers=o),s!==void 0&&(c.tools=s),r.approval!==void 0){if(typeof r.approval!=`function`)throw Error(`${t} The "approval" field must be a function when provided.`);c.approval=r.approval}return c}function mi(e,t){if(typeof e.url!=`string`||!URL.canParse(e.url))throw Error(`${t} The "url" field must be a valid URL.`);let n=new URL(e.url);if(n.protocol!==`https:`&&n.protocol!==`http:`)throw Error(`${t} The "url" field must use the http or https protocol, got "${n.protocol}".`)}function hi(e,t){if(typeof e.description!=`string`||e.description.length===0)throw Error(`${t} The "description" field must be a non-empty string.`)}function gi(e,t){if(e.auth===void 0)return;let r=n(e.auth,`${t} The "auth" field must be an object with a "getToken" method.`);return a(r,fi,`${t} The "auth" field`),li(r,t)}function _i(e,t){if(e.headers===void 0)return;if(typeof e.headers==`function`)return e.headers;if(typeof e.headers!=`object`||e.headers===null||Array.isArray(e.headers))throw Error(`${t} The "headers" field must be a plain object or a function.`);let n=e.headers;for(let[e,r]of Object.entries(n)){let n=typeof r;if(n!==`string`&&n!==`function`&&n!==`object`||n===`object`&&(r===null||typeof r.then!=`function`))throw Error(`${t} The "headers.${e}" value must be a string, Promise, or function.`)}return n}function vi(e,t){if(e.tools===void 0)return;if(typeof e.tools!=`object`||e.tools===null||Array.isArray(e.tools))throw Error(`${t} The "tools" field must specify either "allow" or "block".`);let n=e.tools,r=`allow`in n,i=`block`in n;if(r&&i)throw Error(`${t} The "tools" field must specify either "allow" or "block", not both.`);if(!r&&!i)throw Error(`${t} The "tools" field must specify either "allow" or "block".`);return r?(yi(n.allow,`${t} The "tools.allow"`),{allow:n.allow}):(yi(n.block,`${t} The "tools.block"`),{block:n.block})}function yi(e,t){if(!Array.isArray(e))throw Error(`${t} field must be an array of strings.`);for(let n=0;n<e.length;n++)if(typeof e[n]!=`string`)throw Error(`${t}[${n}] must be a string.`)}async function bi(e,t){let n=pi(await z({agentRoot:e,kind:`connection`,source:t}),`Expected the connection export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Ash shape.`),r={connectionName:t.connectionName,description:n.description,exportName:t.exportName,logicalPath:t.logicalPath,sourceId:t.sourceId,sourceKind:`module`,url:n.url},i=xi(n.auth);return i!==void 0&&(r.vercelConnect=i),r}function xi(e){if(typeof e!=`object`||!e)return;let t=e.vercelConnect;if(typeof t!=`object`||!t)return;let n=t.connector;if(!(typeof n!=`string`||n.length===0))return{connector:n}}function Si(e){return{exportName:e.exportName,logicalPath:e.logicalPath,slug:j(e.logicalPath).replace(/^hooks\//,``),sourceId:e.sourceId,sourceKind:`module`}}function Ci(e,t){let r=n(e,t);a(r,[`backend`,`bootstrap`,`description`,`onSession`],t);let i={};if(r.backend!==void 0&&(i.backend=wi(r.backend,t)),r.description!==void 0){if(typeof r.description!=`string`)throw Error(`${t} The "description" field must be a string when set.`);i.description=r.description}return r.bootstrap!==void 0&&(i.bootstrap=l(r.bootstrap,t)),r.onSession!==void 0&&(i.onSession=l(r.onSession,t)),i}function wi(e,t){let r=n(e,`${t} The "backend" field must be a SandboxBackend value (use vercelBackend(), localBackend(), or your own factory).`);if(typeof r.name!=`string`||r.name.length===0)throw Error(`${t} The "backend" value must expose a non-empty string "name" identifier.`);if(typeof r.create!=`function`)throw Error(`${t} The "backend" value must expose a "create" function.`);if(r.prewarm!==void 0&&typeof r.prewarm!=`function`)throw Error(`${t} The "backend.prewarm" property must be a function when set.`);return r}async function Ti(e,t){return{description:Ci(await z({agentRoot:e,kind:`sandbox`,source:t}),`Expected the sandbox export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Ash shape.`).description,exportName:t.exportName,logicalPath:t.logicalPath,sourceId:t.sourceId,sourceKind:`module`}}async function Ei(e,t){let n=t.sourceKind===`markdown`?at(t.definition,`Expected the compiled instructions definition at "${t.logicalPath}" to match the public Ash shape.`):at(await z({agentRoot:e,kind:`instructions`,source:t}),`Expected the instructions export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Ash shape.`);return{name:j(t.logicalPath),logicalPath:t.logicalPath,markdown:n.markdown,sourceId:t.sourceId,sourceKind:t.sourceKind}}async function Di(e,t,n){let r=t.sourceKind===`markdown`?st(t.definition,`Expected the compiled schedule definition at "${t.logicalPath}" to match the public Ash shape.`):st(await z({agentRoot:e,kind:`schedule`,source:t}),`Expected the schedule export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Ash shape.`),i={cron:r.cron,logicalPath:t.logicalPath,markdown:r.markdown.trim(),name:ki(t.logicalPath),sourceId:t.sourceId,sourceKind:t.sourceKind};return r.channel!==void 0&&(i.channel=Oi({channel:r.channel,channelIdentityMap:n,logicalPath:t.logicalPath})),i}function Oi(e){let t=e.channel,n=t.__route??t,r=t.args??{},i=e.channelIdentityMap.get(n);if(!i&&typeof t.name==`string`&&(i=t.name),!i)throw Error(`Schedule at "${e.logicalPath}" references a channel that was not discovered in agent/channels/. Import a channel module or pass { name: "<channel-name>", args: { ... } } as the channel field.`);return{name:i,args:r}}function ki(e){return j(e).replace(/^schedules\//,``)}async function Ai(e,t){if(t.sourceKind===`skill-package`)return ji(t);let n=t.sourceKind===`markdown`?ot(t.definition,`Expected the compiled skill definition at "${t.logicalPath}" to match the public Ash shape.`):ot(await z({agentRoot:e,kind:`skill`,source:t}),`Expected the skill export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Ash shape.`);return{description:n.description,license:n.license,logicalPath:t.logicalPath,markdown:n.markdown,metadata:n.metadata===void 0?void 0:{...n.metadata},name:j(t.logicalPath).replace(/^skills\//,``),sourceId:t.sourceId,sourceKind:t.sourceKind}}function ji(e){return{assetsPath:e.assetsPath,description:e.description,license:e.license,logicalPath:e.logicalPath,markdown:e.markdown,metadata:e.metadata===void 0?void 0:{...e.metadata},name:e.name,referencesPath:e.referencesPath,rootPath:e.rootPath,scriptsPath:e.scriptsPath,skillId:e.skillId,skillFilePath:e.skillFilePath,sourceId:e.sourceId,sourceKind:`skill-package`}}async function Mi(e){let t=[],n=[];for(let r of e.subagents){let i=await Ni({appRoot:e.appRoot,compileAgentNodeManifest:e.compileAgentNodeManifest,context:e.context,parentNodeId:e.parentNodeId,source:r});t.push(i.node,...i.descendants.nodes),n.push({childNodeId:i.node.nodeId,parentNodeId:e.parentNodeId},...i.descendants.edges)}return{edges:n,nodes:t}}async function Ni(e){let t=pr(e.parentNodeId,e.source.sourceId),n=e.source.subagentId,r=await e.compileAgentNodeManifest({...e.source.manifest,appRoot:e.appRoot},e.context),i=r.config.description;if(!i)throw Error(`Local subagent "${e.source.logicalPath}" is missing a "description" field on its agent config. Add \`description\` to \`defineAgent({ ... })\` so the parent agent can decide when to delegate to this subagent.`);return{descendants:await Mi({appRoot:e.appRoot,compileAgentNodeManifest:e.compileAgentNodeManifest,context:e.context,parentNodeId:t,subagents:e.source.manifest.subagents}),node:{agent:r,description:i,entryPath:e.source.entryPath,logicalPath:e.source.logicalPath,name:n,nodeId:t,rootPath:e.source.rootPath,sourceId:e.source.sourceId,sourceKind:`module`}}}function Pi(e){return typeof e==`object`&&!!e&&e.kind===`ash:disabled-tool`}function Fi(e){return e&&typeof e==`object`&&`~standard`in e?e[`~standard`].jsonSchema.input({target:`draft-07`}):JSON.parse(JSON.stringify(e))}function Ii(e,t){if(Pi(e))return{kind:`disabled`};let i=n(e,t);a(i,[`description`,`execute`,`inputSchema`,`needsApproval`,`onCompact`],t);let o=i.inputSchema===void 0?null:Fi(i.inputSchema),s={description:r(i.description,t),execute:l(i.execute,t),inputSchema:o};return i.onCompact!==void 0&&l(i.onCompact,t),i.needsApproval!==void 0&&l(i.needsApproval,t),{kind:`tool`,definition:s}}async function Li(e,t){let n=Ii(await z({agentRoot:e,kind:`tool`,source:t}),`Expected the tool export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Ash shape.`),r=j(t.logicalPath).replace(/^tools\//,``).replaceAll(`/`,`-`);return n.kind===`disabled`?{kind:`disabled`,name:r}:{kind:`tool`,definition:{description:n.definition.description,exportName:t.exportName,inputSchema:n.definition.inputSchema??null,logicalPath:t.logicalPath,name:r,sourceId:t.sourceId,sourceKind:`module`}}}async function Ri(e){let t={modelCatalog:Gr(e.appRoot)},[n,r]=await Promise.all([zi(e,t),Mi({appRoot:e.appRoot,compileAgentNodeManifest:zi,context:t,parentNodeId:L,subagents:e.subagents})]);return mr({...n,subagentEdges:r.edges,subagents:r.nodes})}async function zi(e,t){let n=await Promise.all(e.tools.map(t=>Li(e.agentRoot,t))),r=[],i=[];for(let e of n)e.kind===`tool`?r.push(e.definition):i.push(e.name);let[a,o]=await Promise.all([Promise.all(e.channels.map(t=>ai(e.agentRoot,t))),si(e.agentRoot,e.channels)]),s=a.flat();return dr({agentRoot:e.agentRoot,appRoot:e.appRoot,channels:s,config:await $r(e,t),connections:await Promise.all(e.connections.map(t=>bi(e.agentRoot,t))),diagnosticsSummary:e.diagnosticsSummary,disabledFrameworkTools:i,hooks:e.hooks.map(e=>Si(e)),sandbox:e.sandbox===null?null:await Ti(e.agentRoot,e.sandbox),sandboxWorkspaces:e.sandboxWorkspaces.map(e=>({logicalPath:e.logicalPath,rootEntries:[...e.rootEntries],sourceId:e.sourceId,sourcePath:e.sourcePath})),schedules:await Promise.all(e.schedules.map(t=>Di(e.agentRoot,t,o))),skills:await Promise.all(e.skills.map(t=>Ai(e.agentRoot,t))),instructions:e.instructions===void 0?void 0:await Ei(e.agentRoot,e.instructions),tools:r})}const Bi=`workspace-resources`;async function Vi(e){let t=S(e.compileDirectoryPath,Bi);await ve(t,{force:!0,recursive:!0});let n=await Ui({nodeId:L,resourcesRoot:t,manifest:e.manifest}),r=await Promise.all(e.manifest.subagents.map(async e=>({...e,agent:await Ui({nodeId:e.nodeId,resourcesRoot:t,manifest:e.agent})})));return{...n,kind:e.manifest.kind,subagentEdges:e.manifest.subagentEdges,subagents:r,version:e.manifest.version}}function Hi(e,t){return{logicalPath:O(S(Bi,t)),rootEntries:fr({sandboxWorkspaces:e.sandboxWorkspaces,skills:e.skills})}}async function Ui(e){for(let t of e.manifest.sandboxWorkspaces)if(t.rootEntries.some(e=>e===`skills/`||e===`skills`))throw Error(`Sandbox workspace "${t.logicalPath}" cannot define "skills" because Ash manages that workspace entry.`);let t=S(e.resourcesRoot,e.nodeId);await w(t,{recursive:!0});for(let n of e.manifest.sandboxWorkspaces)await he(n.sourcePath,t,{recursive:!0});for(let n of e.manifest.skills)await Wi({nodeRoot:t,skill:n});return{...e.manifest,workspaceResourceRoot:Hi(e.manifest,e.nodeId)}}async function Wi(e){let t=S(e.nodeRoot,`skills`,e.skill.name);if(e.skill.sourceKind===`skill-package`){await he(e.skill.rootPath,t,{recursive:!0});return}let n=S(t,`SKILL.md`);await w(x(n),{recursive:!0}),await T(n,e.skill.markdown)}function Gi(e){let t=C(e),n=S(t,`.ash`,`discovery`),r=S(t,`.ash`,`compile`);return{appRoot:t,compiledManifestPath:S(r,`compiled-agent-manifest.json`),compileDirectoryPath:r,compileMetadataPath:S(r,`compile-metadata.json`),diagnosticsPath:S(n,`diagnostics.json`),discoveryManifestPath:S(n,`agent-discovery-manifest.json`),discoveryDirectoryPath:n,moduleMapPath:S(r,`module-map.mjs`)}}function Ki(e){return{diagnostics:[...e],kind:`ash-discovery-diagnostics`,summary:Le(e),version:1}}function qi(e){let t=v(),n=Yi(e.discoveryManifestJson),r=Yi(e.diagnosticsArtifactJson),i=Yi(e.moduleMapSource);return{compile:{moduleMap:{path:Zi(e.appRoot,e.paths.moduleMapPath),sha256:i}},discovery:{diagnostics:{path:Zi(e.appRoot,e.paths.diagnosticsPath),sha256:r},manifest:{path:Zi(e.appRoot,e.paths.discoveryManifestPath),sha256:n},sourceGraphHash:Yi(`${n}:${r}:${i}`),summary:e.diagnosticsSummary},generator:{name:t.name,version:t.version},kind:`ash-compile-metadata`,status:e.diagnosticsSummary.errors>0?`failed`:`ready`,version:5}}async function Ji(e){let t=Gi(e.appRoot),n=Ki(e.diagnostics),r=await Vi({compileDirectoryPath:t.compileDirectoryPath,manifest:await Ri(e.manifest)}),i=Xi(r),a=Xi(e.manifest),o=Xi(n),s=Dr({manifest:r,moduleMapPath:t.moduleMapPath}),c=qi({appRoot:e.appRoot,diagnosticsArtifactJson:o,diagnosticsSummary:n.summary,discoveryManifestJson:a,moduleMapSource:s,paths:t}),l=Xi(c);return await w(t.discoveryDirectoryPath,{recursive:!0}),await w(t.compileDirectoryPath,{recursive:!0}),await Promise.all([T(t.compiledManifestPath,i),T(t.diagnosticsPath,o),T(t.discoveryManifestPath,a),T(t.moduleMapPath,s),T(t.compileMetadataPath,l)]),{compiledManifest:r,diagnosticsArtifact:n,metadata:c,moduleMapSource:s,paths:t}}function Yi(e){return be(`sha256`).update(e).digest(`hex`)}function Xi(e){return`${JSON.stringify(e,null,2)}\n`}function Zi(e,t){return O(fe(C(e),t))}var Qi=class extends Error{result;constructor(e){super(ta({diagnostics:e.diagnostics,diagnosticsPath:e.paths.diagnosticsPath})),this.name=`CompileAgentError`,this.result=e}};async function $i(e={}){let t=e.source??I(),n=await Mn(e.startPath,{source:t}),r=await kn({...n,source:t}),i=await Ji({appRoot:n.appRoot,diagnostics:r.diagnostics,manifest:r.manifest}),a={diagnostics:r.diagnostics,manifest:i.compiledManifest,metadata:i.metadata,paths:i.paths,project:n};if(Re(r.diagnostics))throw new Qi(a);return ea(r.diagnostics),a}function ea(e){let t=e.filter(e=>e.severity===`warning`);if(t.length!==0)for(let e of t)console.warn(`Warning [${e.code}]: ${e.message}\n source: ${e.sourcePath}`)}function ta(e){let t=Le(e.diagnostics),n=[`Discovery failed with ${t.errors} error(s) and ${t.warnings} warning(s).`];if(e.diagnosticsPath!==void 0&&n.push(`Diagnostics artifact: ${e.diagnosticsPath}`),e.diagnostics.length===0)return n.join(`
|
|
7
|
+
`)}function Nr(e){let t=R(e);return t.segments.length===0?t.root.length===0?`.`:t.root:Lr(t.root,t.segments.slice(0,-1))}function Pr(e,t){let n=R(e),r=R(t);return r.root.length>0?Lr(r.root,r.segments):Lr(n.root,[...n.segments,...r.segments])}function Fr(e,t){let n=R(e),r=R(t);if(n.root!==r.root)return Ir(t);let i=0;for(;i<n.segments.length&&i<r.segments.length&&n.segments[i]===r.segments[i];)i+=1;let a=[...Array.from({length:n.segments.length-i},()=>`..`),...r.segments.slice(i)];return a.length===0?`.`:a.join(`/`)}function Ir(e){let t=R(e);return Lr(t.root,t.segments)}function R(e){let t=e.replaceAll(`\\`,`/`),n=``,r=t,i=t.match(/^[A-Za-z]:/);i===null?t.startsWith(`/`)&&(n=`/`,r=t.slice(1)):(n=i[0],r=t.slice(n.length),r.startsWith(`/`)&&(n=`${n}/`,r=r.slice(1)));let a=[];for(let e of r.split(`/`))if(!(e.length===0||e===`.`)){if(e===`..`){if(a.length>0&&a[a.length-1]!==`..`){a.pop();continue}n.length===0&&a.push(e);continue}a.push(e)}return{root:n,segments:a}}function Lr(e,t){return e===`/`?t.length===0?`/`:`/${t.join(`/`)}`:e.endsWith(`/`)?t.length===0?e:`${e}${t.join(`/`)}`:e.length>0?t.length===0?e:`${e}/${t.join(`/`)}`:t.length===0?`.`:t.join(`/`)}const Rr=`ash-model-catalog-cache`,zr=b.object({provider:b.string().min(1),providerModelId:b.string().min(1),contextWindowTokens:b.number().int().nonnegative().optional(),maxOutputTokens:b.number().int().nonnegative().optional()}).passthrough(),Br=b.object({slug:b.string().min(1),providers:b.array(zr).min(1)}).passthrough(),Vr=b.object({models:b.array(Br),providerAliases:b.record(b.string(),b.string())}).passthrough();b.object({contextWindowTokens:b.number().int().positive(),maxOutputTokens:b.number().int().positive().optional()}).strict();const Hr=b.object({fetchedAt:b.string(),kind:b.literal(Rr),models:b.array(Br),providerAliases:b.record(b.string(),b.string()),version:b.literal(2)}).strict(),Ur=new Map([[`anthropic/claude-opus-4.7`,{contextWindowTokens:2e5,maxOutputTokens:32e3}],[`openai/gpt-5.4`,{contextWindowTokens:4e5,maxOutputTokens:128e3}],[`openai/gpt-5.4-mini`,{contextWindowTokens:4e5,maxOutputTokens:128e3}]]);function Wr(e){return S(e,`.ash`,`cache`,`model-catalog.json`)}function Gr(e){let t=null,n=null,r=null,i=async()=>(t??=qr(e),await t),a=async()=>{if(n!==null)throw n;if(r!==null)return await r;r=Kr(e).then(e=>(t=Promise.resolve(e),e));try{return await r}catch(e){throw n=e,e}},o=async()=>{let e=await i();if(e!==null&&Xr(e))return e;try{return await a()}catch{return e===null?null:e}};return{async getModelLimits(e){let t=Zr(e),n=await o();if(n!==null){let e=Jr(n.models,t);if(e)for(let t of e.providers){let e=Yr(t);if(e!==null)return e}}return Ur.get(t)??null},async getByProviderModelId(e,t){let n=await o();if(n===null)return null;let r=e.split(`.`)[0],i=n.providerAliases[r]??r,a=Zr(t);for(let e of n.models)for(let t of e.providers)if(t.provider===i&&Zr(t.providerModelId)===a){let n=Yr(t);if(n!==null)return{slug:e.slug,limits:n}}return null}}}async function Kr(e){let t=await fetch(`https://ai-gateway.vercel.sh/v1/models/catalog`);if(!t.ok)throw Error(`AI Gateway model catalog request failed with HTTP ${t.status} ${t.statusText}.`);let n=Vr.safeParse(await t.json());if(!n.success)throw Error(`AI Gateway model catalog response did not match the expected schema.`);let r={fetchedAt:new Date().toISOString(),kind:Rr,models:n.data.models,providerAliases:n.data.providerAliases,version:2};try{let t=Wr(e);await w(S(e,`.ash`,`cache`),{recursive:!0}),await T(t,`${JSON.stringify(r,null,2)}\n`,`utf8`)}catch{}return r}async function qr(e){try{let t=await ge(Wr(e),`utf8`),n=Hr.safeParse(JSON.parse(t));return n.success?n.data:null}catch(e){return e instanceof Error&&`code`in e&&typeof e.code==`string`&&e.code,null}}function Jr(e,t){return e.find(e=>e.slug===t)}function Yr(e){return e.contextWindowTokens===void 0||e.contextWindowTokens<=0?null:{contextWindowTokens:e.contextWindowTokens,...e.maxOutputTokens!==void 0&&e.maxOutputTokens>0&&{maxOutputTokens:e.maxOutputTokens}}}function Xr(e){let t=Date.parse(e.fetchedAt);return Number.isFinite(t)?Date.now()-t<=864e5:!1}function Zr(e){return e.endsWith(`-thinking`)?e.slice(0,-9):e}async function z(e){let t=i(await u(S(e.agentRoot,e.source.logicalPath)),e.source);try{return await o(t)}catch(t){throw Error(`Failed to execute the ${e.kind} export "${e.source.exportName??`default`}" from "${e.source.logicalPath}": ${m(t)}`)}}var Qr=class extends Error{agentId;constructor(e){super(`Agent "${e}" does not have an agent.ts config module. The "model" field is required.`),this.name=`MissingAgentConfigModuleError`,this.agentId=e}};async function $r(e,t){if(e.configModule===void 0)throw new Qr(e.agentId);let n=et(await z({agentRoot:e.agentRoot,kind:`agent config`,source:e.configModule}),`Expected the agent config export "${e.configModule.exportName??`default`}" from "${e.configModule.logicalPath}" to match the public Ash shape.`),r=await ei({modelCatalog:t.modelCatalog,purpose:`the primary compaction trigger model`,requireContextWindowTokens:!0,contextWindowTokens:n.modelContextWindowTokens,providerOptions:n.modelOptions?.providerOptions,source:e.configModule,value:n.model}),i={},a={compaction:i,metadata:n.metadata??{},model:r,name:e.agentId};return n.description!==void 0&&(a.description=n.description),n.build!==void 0&&(a.build={externalDependencies:n.build.externalDependencies===void 0?void 0:[...n.build.externalDependencies]}),a.source={exportName:e.configModule.exportName,sourceKind:`module`,logicalPath:e.configModule.logicalPath,sourceId:e.configModule.sourceId},n.compaction?.model!==void 0&&(i.model=await ei({modelCatalog:t.modelCatalog,purpose:`the compaction summary model`,requireContextWindowTokens:!0,contextWindowTokens:n.compaction.modelContextWindowTokens,providerOptions:n.modelOptions?.providerOptions,source:e.configModule,value:n.compaction.model})),n.compaction?.thresholdPercent!==void 0&&(i.thresholdPercent=n.compaction.thresholdPercent),a}async function ei(e){if(typeof e.value==`string`)return await ti({id:le(e.value),providerOptions:e.providerOptions===void 0?void 0:ee(e.providerOptions)},e);let t=e.source;if(t===void 0)throw Error(`Expected ${e.purpose} to provide a valid AI SDK language model reference.`);let n=e.value,r=n.specificationVersion;if(r!==`v2`&&r!==`v3`&&r!==`v4`||typeof n.provider!=`string`||typeof n.modelId!=`string`||typeof n.doGenerate!=`function`||typeof n.doStream!=`function`)throw Error(`Expected the authored agent config export "${t.exportName??`default`}" from "${t.logicalPath}" to provide a valid AI SDK language model.`);let i={id:le(n),source:{exportName:t.exportName,sourceKind:`module`,logicalPath:t.logicalPath,sourceId:t.sourceId},providerOptions:e.providerOptions===void 0?void 0:ee(e.providerOptions)};if(e.contextWindowTokens===void 0){let t=await e.modelCatalog.getByProviderModelId(n.provider,n.modelId);if(t)return{...i,id:t.slug,contextWindowTokens:t.limits.contextWindowTokens}}return await ti(i,e)}async function ti(e,t){if(t.contextWindowTokens!==void 0)return{...e,contextWindowTokens:t.contextWindowTokens};let n;try{n=await t.modelCatalog.getModelLimits(e.id)}catch(n){if(!t.requireContextWindowTokens)return e;throw Error(`Failed to load AI Gateway model metadata for ${t.purpose} "${e.id}". ${m(n)}`)}if(n===null){if(!t.requireContextWindowTokens)return e;throw Error(`Cannot compile agent compaction because ${t.purpose} "${e.id}" does not have known AI Gateway context window metadata.`)}return{...e,contextWindowTokens:n.contextWindowTokens}}function ni(e){return typeof e==`object`&&!!e&&e.__kind===`ash:channel`}function ri(e,t){if(!ni(e))throw Error(`${t} Use \`defineChannel({ routes, ... })\` (or a wrapper like \`slackChannel\` / \`ashChannel\`) — bare \`{ fetch, receive? }\` channel objects are no longer supported.`);return e}function ii(e){return typeof e==`object`&&!!e&&e.kind===`ash:disabled-channel`}async function ai(e,t){let n=await z({agentRoot:e,kind:`channel`,source:t}),r=j(t.logicalPath).replace(/^channels\//,``);if(ii(n))return{kind:`disabled`,name:r,logicalPath:t.logicalPath};let i=ri(n,`Expected the channel export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Ash shape.`);return i.routes.map(e=>({kind:`channel`,name:r,logicalPath:t.logicalPath,method:e.method.toUpperCase(),urlPath:e.path,sourceId:t.sourceId,sourceKind:`module`,exportName:t.exportName,adapterKind:oi(i.adapter)}))}function oi(e){if(typeof e!=`object`||!e)return;let t=e.kind;return typeof t==`string`&&t.length>0?t:void 0}async function si(e,t){let n=new Map;for(let r of t){let t=await z({agentRoot:e,kind:`channel`,source:r});if(ii(t))continue;let i=j(r.logicalPath).replace(/^channels\//,``);typeof t==`object`&&t&&(n.set(t,i),s(C(S(e,r.logicalPath)),t))}return n}function ci(e,t=`auth`){if(typeof e!=`object`||!e)return`The "${t}" field must be an object with a "getToken" method.`;let n=e;if(typeof n.getToken!=`function`)return`The "${t}.getToken" field must be a function returning Promise<{ token }>.`;let r=n.startAuthorization!==void 0,i=n.completeAuthorization!==void 0;if(!r&&!i&&n.principalType!==void 0&&n.principalType!==`app`&&n.principalType!==`user`)return`The "${t}.principalType" field must be "app" or "user".`;if(r!==i)return`The "${t}" field must provide either both "startAuthorization" and "completeAuthorization" (interactive OAuth) or neither (getToken-only). Got only "${r?`startAuthorization`:`completeAuthorization`}".`;if(r&&typeof n.startAuthorization!=`function`)return`The "${t}.startAuthorization" field must be a function when provided.`;if(i&&typeof n.completeAuthorization!=`function`)return`The "${t}.completeAuthorization" field must be a function when provided.`;if(r&&n.principalType!==`user`)return`Interactive authorization (startAuthorization + completeAuthorization) is restricted to "principalType": "user" in v1. See D10 of research/connections/connection-principal-model.md for the rationale.`}function li(e,t,n=`auth`){let r=ci(e,n);if(r!==void 0)throw Error(`${t} ${r}`);let i=e,a=ui(i.vercelConnect);if(i.startAuthorization!==void 0&&i.completeAuthorization!==void 0){let e={completeAuthorization:i.completeAuthorization,getToken:i.getToken,principalType:`user`,startAuthorization:i.startAuthorization};return a===void 0?e:{...e,vercelConnect:a}}let o={getToken:i.getToken,principalType:i.principalType??`app`};return a===void 0?o:{...o,vercelConnect:a}}function ui(e){if(typeof e!=`object`||!e)return;let t=e.connector;if(!(typeof t!=`string`||t.length===0))return{connector:t}}const di=[`approval`,`auth`,`description`,`headers`,`tools`,`url`],fi=[`completeAuthorization`,`getToken`,`principalType`,`startAuthorization`,`vercelConnect`];function pi(e,t){let r=n(e,t);a(r,di,t),mi(r,t),hi(r,t);let i=gi(r,t),o=_i(r,t),s=vi(r,t);if(i!==void 0&&o!==void 0&&typeof o!=`function`&&Object.keys(o).some(e=>e.toLowerCase()===`authorization`))throw Error(`${t} "headers" must not include an "Authorization" key when "auth" is also provided.`);let c={description:r.description,url:r.url};if(i!==void 0&&(c.auth=i),o!==void 0&&(c.headers=o),s!==void 0&&(c.tools=s),r.approval!==void 0){if(typeof r.approval!=`function`)throw Error(`${t} The "approval" field must be a function when provided.`);c.approval=r.approval}return c}function mi(e,t){if(typeof e.url!=`string`||!URL.canParse(e.url))throw Error(`${t} The "url" field must be a valid URL.`);let n=new URL(e.url);if(n.protocol!==`https:`&&n.protocol!==`http:`)throw Error(`${t} The "url" field must use the http or https protocol, got "${n.protocol}".`)}function hi(e,t){if(typeof e.description!=`string`||e.description.length===0)throw Error(`${t} The "description" field must be a non-empty string.`)}function gi(e,t){if(e.auth===void 0)return;let r=n(e.auth,`${t} The "auth" field must be an object with a "getToken" method.`);return a(r,fi,`${t} The "auth" field`),li(r,t)}function _i(e,t){if(e.headers===void 0)return;if(typeof e.headers==`function`)return e.headers;if(typeof e.headers!=`object`||e.headers===null||Array.isArray(e.headers))throw Error(`${t} The "headers" field must be a plain object or a function.`);let n=e.headers;for(let[e,r]of Object.entries(n)){let n=typeof r;if(n!==`string`&&n!==`function`&&n!==`object`||n===`object`&&(r===null||typeof r.then!=`function`))throw Error(`${t} The "headers.${e}" value must be a string, Promise, or function.`)}return n}function vi(e,t){if(e.tools===void 0)return;if(typeof e.tools!=`object`||e.tools===null||Array.isArray(e.tools))throw Error(`${t} The "tools" field must specify either "allow" or "block".`);let n=e.tools,r=`allow`in n,i=`block`in n;if(r&&i)throw Error(`${t} The "tools" field must specify either "allow" or "block", not both.`);if(!r&&!i)throw Error(`${t} The "tools" field must specify either "allow" or "block".`);return r?(yi(n.allow,`${t} The "tools.allow"`),{allow:n.allow}):(yi(n.block,`${t} The "tools.block"`),{block:n.block})}function yi(e,t){if(!Array.isArray(e))throw Error(`${t} field must be an array of strings.`);for(let n=0;n<e.length;n++)if(typeof e[n]!=`string`)throw Error(`${t}[${n}] must be a string.`)}async function bi(e,t){let n=pi(await z({agentRoot:e,kind:`connection`,source:t}),`Expected the connection export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Ash shape.`),r={connectionName:t.connectionName,description:n.description,exportName:t.exportName,logicalPath:t.logicalPath,sourceId:t.sourceId,sourceKind:`module`,url:n.url},i=xi(n.auth);return i!==void 0&&(r.vercelConnect=i),r}function xi(e){if(typeof e!=`object`||!e)return;let t=e.vercelConnect;if(typeof t!=`object`||!t)return;let n=t.connector;if(!(typeof n!=`string`||n.length===0))return{connector:n}}function Si(e){return{exportName:e.exportName,logicalPath:e.logicalPath,slug:j(e.logicalPath).replace(/^hooks\//,``),sourceId:e.sourceId,sourceKind:`module`}}function Ci(e,t){let r=n(e,t);a(r,[`backend`,`bootstrap`,`description`,`onSession`],t);let i={};if(r.backend!==void 0&&(i.backend=wi(r.backend,t)),r.description!==void 0){if(typeof r.description!=`string`)throw Error(`${t} The "description" field must be a string when set.`);i.description=r.description}return r.bootstrap!==void 0&&(i.bootstrap=l(r.bootstrap,t)),r.onSession!==void 0&&(i.onSession=l(r.onSession,t)),i}function wi(e,t){let r=n(e,`${t} The "backend" field must be a SandboxBackend value (use vercelBackend(), localBackend(), or your own factory).`);if(typeof r.name!=`string`||r.name.length===0)throw Error(`${t} The "backend" value must expose a non-empty string "name" identifier.`);if(typeof r.create!=`function`)throw Error(`${t} The "backend" value must expose a "create" function.`);if(r.prewarm!==void 0&&typeof r.prewarm!=`function`)throw Error(`${t} The "backend.prewarm" property must be a function when set.`);return r}async function Ti(e,t){return{description:Ci(await z({agentRoot:e,kind:`sandbox`,source:t}),`Expected the sandbox export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Ash shape.`).description,exportName:t.exportName,logicalPath:t.logicalPath,sourceId:t.sourceId,sourceKind:`module`}}async function Ei(e,t){let n=t.sourceKind===`markdown`?at(t.definition,`Expected the compiled instructions definition at "${t.logicalPath}" to match the public Ash shape.`):at(await z({agentRoot:e,kind:`instructions`,source:t}),`Expected the instructions export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Ash shape.`);return{name:j(t.logicalPath),logicalPath:t.logicalPath,markdown:n.markdown,sourceId:t.sourceId,sourceKind:t.sourceKind}}async function Di(e,t,n){let r=t.sourceKind===`markdown`?st(t.definition,`Expected the compiled schedule definition at "${t.logicalPath}" to match the public Ash shape.`):st(await z({agentRoot:e,kind:`schedule`,source:t}),`Expected the schedule export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Ash shape.`),i={cron:r.cron,logicalPath:t.logicalPath,markdown:r.markdown.trim(),name:ki(t.logicalPath),sourceId:t.sourceId,sourceKind:t.sourceKind};return r.channel!==void 0&&(i.channel=Oi({channel:r.channel,channelIdentityMap:n,logicalPath:t.logicalPath})),i}function Oi(e){let t=e.channel,n=t.__route??t,r=t.args??{},i=e.channelIdentityMap.get(n);if(!i&&typeof t.name==`string`&&(i=t.name),!i)throw Error(`Schedule at "${e.logicalPath}" references a channel that was not discovered in agent/channels/. Import a channel module or pass { name: "<channel-name>", args: { ... } } as the channel field.`);return{name:i,args:r}}function ki(e){return j(e).replace(/^schedules\//,``)}async function Ai(e,t){if(t.sourceKind===`skill-package`)return ji(t);let n=t.sourceKind===`markdown`?ot(t.definition,`Expected the compiled skill definition at "${t.logicalPath}" to match the public Ash shape.`):ot(await z({agentRoot:e,kind:`skill`,source:t}),`Expected the skill export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Ash shape.`);return{description:n.description,license:n.license,logicalPath:t.logicalPath,markdown:n.markdown,metadata:n.metadata===void 0?void 0:{...n.metadata},name:j(t.logicalPath).replace(/^skills\//,``),sourceId:t.sourceId,sourceKind:t.sourceKind}}function ji(e){return{assetsPath:e.assetsPath,description:e.description,license:e.license,logicalPath:e.logicalPath,markdown:e.markdown,metadata:e.metadata===void 0?void 0:{...e.metadata},name:e.name,referencesPath:e.referencesPath,rootPath:e.rootPath,scriptsPath:e.scriptsPath,skillId:e.skillId,skillFilePath:e.skillFilePath,sourceId:e.sourceId,sourceKind:`skill-package`}}async function Mi(e){let t=[],n=[];for(let r of e.subagents){let i=await Ni({appRoot:e.appRoot,compileAgentNodeManifest:e.compileAgentNodeManifest,context:e.context,parentNodeId:e.parentNodeId,source:r});t.push(i.node,...i.descendants.nodes),n.push({childNodeId:i.node.nodeId,parentNodeId:e.parentNodeId},...i.descendants.edges)}return{edges:n,nodes:t}}async function Ni(e){let t=pr(e.parentNodeId,e.source.sourceId),n=e.source.subagentId,r=await e.compileAgentNodeManifest({...e.source.manifest,appRoot:e.appRoot},e.context),i=r.config.description;if(!i)throw Error(`Local subagent "${e.source.logicalPath}" is missing a "description" field on its agent config. Add \`description\` to \`defineAgent({ ... })\` so the parent agent can decide when to delegate to this subagent.`);return{descendants:await Mi({appRoot:e.appRoot,compileAgentNodeManifest:e.compileAgentNodeManifest,context:e.context,parentNodeId:t,subagents:e.source.manifest.subagents}),node:{agent:r,description:i,entryPath:e.source.entryPath,logicalPath:e.source.logicalPath,name:n,nodeId:t,rootPath:e.source.rootPath,sourceId:e.source.sourceId,sourceKind:`module`}}}function Pi(e){return typeof e==`object`&&!!e&&e.kind===`ash:disabled-tool`}function Fi(e){return e&&typeof e==`object`&&`~standard`in e?e[`~standard`].jsonSchema.input({target:`draft-07`}):JSON.parse(JSON.stringify(e))}function Ii(e,t){if(Pi(e))return{kind:`disabled`};let i=n(e,t);a(i,[`description`,`execute`,`inputSchema`,`needsApproval`,`onCompact`,`retentionPolicy`],t);let o=i.inputSchema===void 0?null:Fi(i.inputSchema),s={description:r(i.description,t),execute:l(i.execute,t),inputSchema:o};if(i.onCompact!==void 0&&l(i.onCompact,t),i.needsApproval!==void 0&&l(i.needsApproval,t),i.retentionPolicy!==void 0){let e=i.retentionPolicy;if(e!==`auto`&&e!==`keep`&&typeof e!=`function`)throw Error(`${t} Expected \`retentionPolicy\` to be "auto", "keep", or a function.`)}return{kind:`tool`,definition:s}}async function Li(e,t){let n=Ii(await z({agentRoot:e,kind:`tool`,source:t}),`Expected the tool export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Ash shape.`),r=j(t.logicalPath).replace(/^tools\//,``).replaceAll(`/`,`-`);return n.kind===`disabled`?{kind:`disabled`,name:r}:{kind:`tool`,definition:{description:n.definition.description,exportName:t.exportName,inputSchema:n.definition.inputSchema??null,logicalPath:t.logicalPath,name:r,sourceId:t.sourceId,sourceKind:`module`}}}async function Ri(e){let t={modelCatalog:Gr(e.appRoot)},[n,r]=await Promise.all([zi(e,t),Mi({appRoot:e.appRoot,compileAgentNodeManifest:zi,context:t,parentNodeId:L,subagents:e.subagents})]);return mr({...n,subagentEdges:r.edges,subagents:r.nodes})}async function zi(e,t){let n=await Promise.all(e.tools.map(t=>Li(e.agentRoot,t))),r=[],i=[];for(let e of n)e.kind===`tool`?r.push(e.definition):i.push(e.name);let[a,o]=await Promise.all([Promise.all(e.channels.map(t=>ai(e.agentRoot,t))),si(e.agentRoot,e.channels)]),s=a.flat();return dr({agentRoot:e.agentRoot,appRoot:e.appRoot,channels:s,config:await $r(e,t),connections:await Promise.all(e.connections.map(t=>bi(e.agentRoot,t))),diagnosticsSummary:e.diagnosticsSummary,disabledFrameworkTools:i,hooks:e.hooks.map(e=>Si(e)),sandbox:e.sandbox===null?null:await Ti(e.agentRoot,e.sandbox),sandboxWorkspaces:e.sandboxWorkspaces.map(e=>({logicalPath:e.logicalPath,rootEntries:[...e.rootEntries],sourceId:e.sourceId,sourcePath:e.sourcePath})),schedules:await Promise.all(e.schedules.map(t=>Di(e.agentRoot,t,o))),skills:await Promise.all(e.skills.map(t=>Ai(e.agentRoot,t))),instructions:e.instructions===void 0?void 0:await Ei(e.agentRoot,e.instructions),tools:r})}const Bi=`workspace-resources`;async function Vi(e){let t=S(e.compileDirectoryPath,Bi);await ve(t,{force:!0,recursive:!0});let n=await Ui({nodeId:L,resourcesRoot:t,manifest:e.manifest}),r=await Promise.all(e.manifest.subagents.map(async e=>({...e,agent:await Ui({nodeId:e.nodeId,resourcesRoot:t,manifest:e.agent})})));return{...n,kind:e.manifest.kind,subagentEdges:e.manifest.subagentEdges,subagents:r,version:e.manifest.version}}function Hi(e,t){return{logicalPath:O(S(Bi,t)),rootEntries:fr({sandboxWorkspaces:e.sandboxWorkspaces,skills:e.skills})}}async function Ui(e){for(let t of e.manifest.sandboxWorkspaces)if(t.rootEntries.some(e=>e===`skills/`||e===`skills`))throw Error(`Sandbox workspace "${t.logicalPath}" cannot define "skills" because Ash manages that workspace entry.`);let t=S(e.resourcesRoot,e.nodeId);await w(t,{recursive:!0});for(let n of e.manifest.sandboxWorkspaces)await he(n.sourcePath,t,{recursive:!0});for(let n of e.manifest.skills)await Wi({nodeRoot:t,skill:n});return{...e.manifest,workspaceResourceRoot:Hi(e.manifest,e.nodeId)}}async function Wi(e){let t=S(e.nodeRoot,`skills`,e.skill.name);if(e.skill.sourceKind===`skill-package`){await he(e.skill.rootPath,t,{recursive:!0});return}let n=S(t,`SKILL.md`);await w(x(n),{recursive:!0}),await T(n,e.skill.markdown)}function Gi(e){let t=C(e),n=S(t,`.ash`,`discovery`),r=S(t,`.ash`,`compile`);return{appRoot:t,compiledManifestPath:S(r,`compiled-agent-manifest.json`),compileDirectoryPath:r,compileMetadataPath:S(r,`compile-metadata.json`),diagnosticsPath:S(n,`diagnostics.json`),discoveryManifestPath:S(n,`agent-discovery-manifest.json`),discoveryDirectoryPath:n,moduleMapPath:S(r,`module-map.mjs`)}}function Ki(e){return{diagnostics:[...e],kind:`ash-discovery-diagnostics`,summary:Le(e),version:1}}function qi(e){let t=v(),n=Yi(e.discoveryManifestJson),r=Yi(e.diagnosticsArtifactJson),i=Yi(e.moduleMapSource);return{compile:{moduleMap:{path:Zi(e.appRoot,e.paths.moduleMapPath),sha256:i}},discovery:{diagnostics:{path:Zi(e.appRoot,e.paths.diagnosticsPath),sha256:r},manifest:{path:Zi(e.appRoot,e.paths.discoveryManifestPath),sha256:n},sourceGraphHash:Yi(`${n}:${r}:${i}`),summary:e.diagnosticsSummary},generator:{name:t.name,version:t.version},kind:`ash-compile-metadata`,status:e.diagnosticsSummary.errors>0?`failed`:`ready`,version:5}}async function Ji(e){let t=Gi(e.appRoot),n=Ki(e.diagnostics),r=await Vi({compileDirectoryPath:t.compileDirectoryPath,manifest:await Ri(e.manifest)}),i=Xi(r),a=Xi(e.manifest),o=Xi(n),s=Dr({manifest:r,moduleMapPath:t.moduleMapPath}),c=qi({appRoot:e.appRoot,diagnosticsArtifactJson:o,diagnosticsSummary:n.summary,discoveryManifestJson:a,moduleMapSource:s,paths:t}),l=Xi(c);return await w(t.discoveryDirectoryPath,{recursive:!0}),await w(t.compileDirectoryPath,{recursive:!0}),await Promise.all([T(t.compiledManifestPath,i),T(t.diagnosticsPath,o),T(t.discoveryManifestPath,a),T(t.moduleMapPath,s),T(t.compileMetadataPath,l)]),{compiledManifest:r,diagnosticsArtifact:n,metadata:c,moduleMapSource:s,paths:t}}function Yi(e){return be(`sha256`).update(e).digest(`hex`)}function Xi(e){return`${JSON.stringify(e,null,2)}\n`}function Zi(e,t){return O(fe(C(e),t))}var Qi=class extends Error{result;constructor(e){super(ta({diagnostics:e.diagnostics,diagnosticsPath:e.paths.diagnosticsPath})),this.name=`CompileAgentError`,this.result=e}};async function $i(e={}){let t=e.source??I(),n=await Mn(e.startPath,{source:t}),r=await kn({...n,source:t}),i=await Ji({appRoot:n.appRoot,diagnostics:r.diagnostics,manifest:r.manifest}),a={diagnostics:r.diagnostics,manifest:i.compiledManifest,metadata:i.metadata,paths:i.paths,project:n};if(Re(r.diagnostics))throw new Qi(a);return ea(r.diagnostics),a}function ea(e){let t=e.filter(e=>e.severity===`warning`);if(t.length!==0)for(let e of t)console.warn(`Warning [${e.code}]: ${e.message}\n source: ${e.sourcePath}`)}function ta(e){let t=Le(e.diagnostics),n=[`Discovery failed with ${t.errors} error(s) and ${t.warnings} warning(s).`];if(e.diagnosticsPath!==void 0&&n.push(`Diagnostics artifact: ${e.diagnosticsPath}`),e.diagnostics.length===0)return n.join(`
|
|
8
8
|
`);n.push(`Discovery diagnostics:`);for(let t of e.diagnostics)n.push(`- ${na(t.severity)}: ${t.message}`),n.push(` source: ${t.sourcePath}`);return n.join(`
|
|
9
|
-
`)}function na(e){return e===`error`?`Error`:`Warning`}const ra=new Map;var B=class{name;codec;constructor(e,t={}){this.name=e,this.codec=t.codec,ra.set(e,this)}};const ia=Symbol.for(`experimental-ash.context-storage`),aa=globalThis;aa[ia]===void 0&&(aa[ia]=new Ce);const oa=aa[ia];function V(){let e=oa.getStore();if(e===void 0)throw Error(`No active Ash context. Call this function only from authored runtime code such as tools, steps, and model callbacks.`);return e}function sa(e){return{debug(t,n){pa(`debug`,e,t,n)},info(t,n){pa(`info`,e,t,n)},warn(t,n){pa(`warn`,e,t,n)},error(t,n){pa(`error`,e,t,n),ha(t,n)}}}function ca(){return crypto.randomUUID()}function la(e,t){let n={errorId:t??ca(),message:da(e)},r=ua(e);return r!==void 0&&(n.name=r),n.detail=ga(e),n}function ua(e){if(e instanceof Error)return e.name===`Error`?void 0:e.name;if(f(e)&&p(e.name)&&e.name!==`Error`)return e.name}function da(e){return f(e)&&!(e instanceof Error)&&typeof e.message==`string`?e.message:Ee(e)}function fa(e,t){let n=t instanceof Error?t.message:Ee(t),r=t instanceof Error?t.name:`Error`;e.setStatus({code:we.ERROR,message:n}),e.recordException({message:n,name:r,stack:ga(t)})}function pa(e,t,n,r){let i=e===`error`?console.error:e===`warn`?console.warn:console.log,a=`[ash:${t}] ${n}`;if(r===void 0){i(a);return}i(a,ma(r))}function ma(e){let t={};for(let[n,r]of Object.entries(e))if(r!==void 0){if(r instanceof Error){t[n]=la(r);continue}t[n]=r}return t}function ha(e,t){let n=Te.getActiveSpan();if(n===void 0)return;let r=t?.error;if(r instanceof Error){fa(n,r);return}n.addEvent(e,t?ma(t):void 0)}function ga(e){return _a(De(e,{breakLength:1/0,compact:!1,depth:10,maxStringLength:8192}),16384)}function _a(e,t){if(Buffer.byteLength(e,`utf8`)<=t)return e;let n=e.slice(0,t);for(;Buffer.byteLength(n,`utf8`)>t&&n.length>0;)n=n.slice(0,-1);return`${n}<…truncated>`}function va(e){if(e.message!==void 0)return{inputResponses:e.inputResponses,message:e.message};if(e.inputResponses!==void 0&&e.inputResponses.length>0)return{inputResponses:e.inputResponses}}function ya(e){return e.kind??`unknown`}const ba={kind:`http`},xa={kind:`schedule`};new B(`ash.auth`),new B(`ash.initiatorAuth`);const Sa=new B(`ash.sessionId`),Ca=new B(`ash.continuationToken`);new B(`ash.mode`),new B(`ash.parentSession`),new B(`ash.capabilities`),new B(`ash.sessionPrepared`);const wa=sa(`execution.subagent-adapter`),Ta=new Map;function Ea(e){return Ta.get(e)}function Da(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.callId==`string`&&t.callId.length>0&&typeof t.parentContinuationToken==`string`&&t.parentContinuationToken.length>0&&typeof t.parentSessionId==`string`&&typeof t.subagentName==`string`&&t.subagentName.length>0}const Oa={kind:`subagent`,async"input.requested"(e,t){let n=t.state;Da(n)&&await ka({hookPayload:{callId:n.callId,childContinuationToken:t.ctx.require(Ca),childSessionId:t.ctx.require(Sa),event:{requests:e.requests,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},kind:`subagent-input-request`,subagentName:n.subagentName},parentContinuationToken:n.parentContinuationToken})}};async function ka(e){"use step";let t=Ea(e.hookPayload.childContinuationToken);try{if(t!==void 0){t(e.hookPayload);return}await Se(e.parentContinuationToken,e.hookPayload)}catch(t){let n=ca();throw wa.warn(`failed to forward proxied HITL batch to parent`,{callId:e.hookPayload.callId,childContinuationToken:e.hookPayload.childContinuationToken,childSessionId:e.hookPayload.childSessionId,errorId:n,parentContinuationToken:e.parentContinuationToken,subagentName:e.hookPayload.subagentName,error:t}),t}}var H=class extends Error{registry;entryName;logicalPath;sourceId;constructor(e,t,n={}){super(t),this.name=`RuntimeRegistryError`,this.registry=e,n.entryName!==void 0&&(this.entryName=n.entryName),n.logicalPath!==void 0&&(this.logicalPath=n.logicalPath),n.sourceId!==void 0&&(this.sourceId=n.sourceId)}},Aa=class{registry;_entries=new Map;_reserved;constructor(e,t=[]){this.registry=e,this._reserved=new Set(t)}get size(){return this._entries.size}has(e){return this._entries.has(e)}get(e){return this._entries.get(e)??null}asMap(){return this._entries}register(e,t,n={}){if(this._entries.has(e))throw new H(this.registry,n.duplicateMessage??`Duplicate ${this.registry} name "${e}".`,{...n.location,entryName:e});if(this._reserved.has(e))throw new H(this.registry,n.reservedMessage??`${ja(this.registry)} "${e}" collides with another runtime-visible name.`,{...n.location,entryName:e});this._entries.set(e,t),this._reserved.add(e)}set(e,t){this._entries.set(e,t),this._reserved.add(e)}};function ja(e){return e.length===0?e:e.charAt(0).toUpperCase()+e.slice(1)}const Ma=[ba,Oa,xa],Na=new Set([`kind`,`state`,`deliver`,`contextProviders`,`createAdapterContext`,`fetchFile`]);function Pa(e){let t=new Map,n=new Set;for(let e of Ma){let r=Ia(e);n.add(r),t.set(r,e)}for(let r of e.channels){if(r.adapter===void 0)continue;let e={logicalPath:r.logicalPath,sourceId:r.sourceId},i=r.adapter,a=Ia(i,e);if(n.has(a)){if(La(i))throw new H(`adapter`,`Channel adapter kind "${a}" is reserved by the framework. A route-declared adapter may share a framework kind only as a pass-through with no \`deliver\` hook, event handlers, \`attachments\` resolver, \`contextProviders\`, or \`createAdapterContext\` factory. Use a custom \`kind\` to add channel-specific behavior.`,{...e,entryName:a});continue}t.set(a,i)}return{adaptersByKind:t}}function Fa(e,t){let n=t,r=e.adaptersByKind.get(n.kind);if(r===void 0)throw Error(`Unknown adapter kind: "${n.kind}". Declare the adapter on the route that starts this session so the runtime can rehydrate it.`);return{...r,state:n.state}}function Ia(e,t){let n=ya(e);if(n===`unknown`)throw new H(`adapter`,"Adapters must declare a non-empty `kind` field.",{entryName:`unknown`,logicalPath:t?.logicalPath,sourceId:t?.sourceId});return n}function La(e){if(e.deliver!==void 0||e.fetchFile!==void 0||e.createAdapterContext!==void 0||e.contextProviders!==void 0&&e.contextProviders.length>0)return!0;for(let[t,n]of Object.entries(e))if(!Na.has(t)&&typeof n==`function`)return!0;return!1}function Ra(e,t={}){return t.moduleMapLoadMode!==void 0||t.moduleMapLoaderPath!==void 0?{appRoot:e,kind:`disk`,moduleMapLoaderPath:t.moduleMapLoaderPath,moduleMapLoadMode:t.moduleMapLoadMode}:{appRoot:e,kind:`disk`}}function za(e){return e.kind===`disk`?e.appRoot:void 0}function Ba(e){return e.kind===`disk`?e.moduleMapLoadMode===void 0?`disk:${e.appRoot}`:e.moduleMapLoaderPath===void 0?`disk:${e.appRoot}:${e.moduleMapLoadMode}`:`disk:${e.appRoot}:${e.moduleMapLoadMode}:${e.moduleMapLoaderPath}`:`bundled`}function U(e){let t=Va(e),n=`${t}/.ash/discovery`,r=`${t}/.ash/compile`;return{appRoot:t,compiledManifestPath:`${r}/compiled-agent-manifest.json`,compileDirectoryPath:r,compileMetadataPath:`${r}/compile-metadata.json`,diagnosticsPath:`${n}/diagnostics.json`,discoveryDirectoryPath:n,discoveryManifestPath:`${n}/agent-discovery-manifest.json`,moduleMapPath:`${r}/module-map.mjs`}}function Va(e){let t=e.replaceAll(`\\`,`/`);return t===`/`?t:t.replace(/\/+$/,``)}function Ha(e){return Oe(e,{prefix:void 0}).message}function Ua(e=`test-session`){return{bundleCache:new Map,bundleCacheKeyBySourceKey:new Map,compiledArtifacts:null,id:e}}const Wa=Symbol.for(`experimental-ash.runtime-session-storage`),Ga=Symbol.for(`experimental-ash.runtime-session-default`),W=globalThis;W[Wa]===void 0&&(W[Wa]=new Ce);const Ka=W[Wa];function qa(){return W[Ga]===void 0&&(W[Ga]=Ua(`process-default`)),W[Ga]}function Ja(){return Ka.getStore()??qa()}function Ya(){return Ja().compiledArtifacts}const Xa=b.object({path:b.string(),sha256:b.string()}).strict(),Za=b.object({compile:b.object({moduleMap:Xa}).strict(),discovery:b.object({diagnostics:Xa,manifest:Xa,sourceGraphHash:b.string(),summary:b.object({errors:b.number().finite(),warnings:b.number().finite()}).strict()}).strict(),generator:b.object({name:b.string(),version:b.string()}).strict(),kind:b.literal(`ash-compile-metadata`),status:b.union([b.literal(`failed`),b.literal(`ready`)]),version:b.literal(5)}).strict();var Qa=class extends Error{metadataPath;constructor(e,t){super(e),this.name=`LoadCompileMetadataError`,t!==void 0&&(this.metadataPath=t)}};async function $a(e){let t=e.metadataPath??(e.compiledArtifactsSource.kind===`disk`?U(e.compiledArtifactsSource.appRoot).compileMetadataPath:void 0);if(t!==void 0){let{readFile:e}=await import(`node:fs/promises`),n;try{n=JSON.parse(await e(t,`utf8`))}catch(e){throw new Qa(to(e),t)}return eo(n,t)}let n=Ya()?.metadata;return n===void 0?null:eo(n,`bundled compile metadata`)}function eo(e,t){let n=Za.safeParse(e);if(!n.success)throw new Qa(`Expected "${t}" to contain valid Ash compile metadata. ${Ha(n.error)}`,t);return n.data}function to(e){return e instanceof Error?e.message:`Unknown compile metadata load failure.`}async function no(e){let t=Ba(e),n=await ro(e);try{let r=(await $a({compiledArtifactsSource:e}))?.discovery.sourceGraphHash;return r===void 0||r.length===0?n===void 0?t:`${t}:mtime-${io(n)}`:n===void 0?`${t}:${r}`:`${t}:${r}:mtime-${io(n)}`}catch{return n===void 0?t:`${t}:mtime-${io(n)}`}}async function ro(e){if(e.kind!==`disk`)return;let{stat:t}=await import(`node:fs/promises`),{compileMetadataPath:n}=U(e.appRoot);try{return(await t(n)).mtimeMs}catch{return}}function io(e){return Math.floor(e).toString(36)}const ao=`__root__`;function oo(e,t){if(t===void 0||t===`__root__`)return e.root;let n=e.nodesByNodeId.get(t);if(n===void 0)throw Error(`Missing runtime agent node for node id "${t}".`);return n}const so=`bundled compiled manifest`;var co=class extends Error{manifestPath;constructor(e,t){super(e),this.name=`LoadCompiledManifestError`,t!==void 0&&(this.manifestPath=t)}};async function lo(e){let t=e.manifestPath??(e.compiledArtifactsSource.kind===`disk`?U(e.compiledArtifactsSource.appRoot).compiledManifestPath:void 0);if(t!==void 0){let{readFile:e}=await import(`node:fs/promises`),n;try{n=JSON.parse(await e(t,`utf8`))}catch(e){throw new co(fo(e),t)}return uo(n,t)}let n=Ya();if(n!==null)return uo(n.manifest,so);throw new co(`Compiled manifest is unavailable without an app root or bundled compiled artifacts.`,so)}function uo(e,t){let n=ur.safeParse(e);if(!n.success)throw new co(`Expected "${t}" to contain a valid compiled Ash agent manifest. ${Ha(n.error)}`,t);return n.data}function fo(e){return e instanceof Error?e.message:`Unknown manifest load failure.`}const po=`bundled compiled module map`;var mo=class extends Error{moduleMapPath;constructor(e,t){super(e),this.name=`LoadCompiledModuleMapError`,t!==void 0&&(this.moduleMapPath=t)}};async function ho(e){let t=e.moduleMapPath??(e.compiledArtifactsSource.kind===`disk`?U(e.compiledArtifactsSource.appRoot).moduleMapPath:void 0);if(t!==void 0){let e=vo(t);try{let n=await import(e);return go(n.moduleMap??n.default,t)}catch(e){throw new mo(_o(e),t)}}let n=Ya();if(n!==null)return go(n.moduleMap,po);throw new mo(`Compiled module map is unavailable without an app root or bundled compiled artifacts.`,po)}function go(e,t){let n=Er.safeParse(e);if(!n.success)throw new mo(`Expected "${t}" to export a valid compiled Ash module map. ${Ha(n.error)}`,t);return n.data}function _o(e){return e instanceof Error?e.message:`Unknown module-map load failure.`}function vo(e){let t=e.replaceAll(`\\`,`/`);return/^[A-Za-z]:\//.test(t)?`file:///${encodeURI(t)}`:t.startsWith(`/`)?`file://${encodeURI(t)}`:t}const G=`/workspace`;function yo(e){return e.length===0?null:[`Available skills`,`Listed skills are available in this run. Do not claim a listed skill is inaccessible unless activation or workspace inspection actually fails.`,`If the user names a skill or the request clearly matches one of the descriptions below, call load_skill before proceeding.`,`If multiple skills match, activate the minimal set that covers the task. After activation, follow the returned instructions instead of improvising around them.`,`If activation fails, say so briefly and continue with the best fallback. Packaged sibling files under a skill path can be inspected with bash or read_file when needed.`,...e.map(e=>bo(e))].join(`
|
|
10
|
-
`)}function
|
|
11
|
-
`)}function
|
|
12
|
-
`)}function
|
|
13
|
-
A single tool or subagent call runs as one serial action. If you call multiple independent tools or subagents in one response, Ash treats that batch as parallel work. Only batch work that is independent and does not rely on another call in the same response.`]:[],...Wo(e.connections),...Go(e.skills)]}function Ho(e){if(e===void 0)return[];let t=e.markdown.trim();return t.length===0?[]:[`Instructions (${e.name})\n${t}`]}function Uo(e){if(e===void 0)return[];let t=xo(e);return t===void 0?[]:[t]}function Wo(e){return!e||e.length===0?[]:[Bo(e)]}function Go(e){if(!e||e.length===0)return[];let t=yo(e);return t===null?[]:[t]}function Ko(e){let t=e.agent,n=qo(t);return{id:t.config.name,instructions:Vo({connections:t.connections,instructions:t.instructions,skills:t.skills,toolsAvailable:e.tools.length>0,workspaceSpec:t.workspaceSpec}),compactionModel:t.config.compaction?.model,model:t.config.model,nodeId:e.nodeId,turnMetadata:n,tools:[...e.tools],workspaceSpec:t.workspaceSpec}}function qo(e){let t={};return Object.keys(e.config.metadata).length>0&&(t.configMetadata={...e.config.metadata}),e.instructions!==void 0&&(t.instructionsName=e.instructions.name),e.skills.length>0&&(t.skillNames=e.skills.map(e=>e.name)),Object.keys(t).length>0?t:void 0}const Jo=new Set([`aud`,`exp`,`iat`,`iss`,`jti`,`nbf`,`sub`]);function Yo(e){let t={};for(let[n,r]of Object.entries(e)){if(typeof r==`string`){t[n]=r;continue}Array.isArray(r)&&r.every(e=>typeof e==`string`)&&(t[n]=Object.freeze([...r]))}return Object.freeze(t)}function Xo(e){let t=Yo(e);return Object.freeze(Object.fromEntries(Object.entries(t).filter(([e])=>!Jo.has(e))))}function Zo(e,t){let n=Yo(e);if(t.subjects!==void 0){let n=typeof e.sub==`string`?e.sub:null;if(n===null||!t.subjects.some(e=>$o(e,n)))return!1}return t.claims===void 0?!0:Object.entries(t.claims).every(([e,t])=>{let r=n[e];return r===void 0?!1:typeof r==`string`?t.includes(r):r.some(e=>t.includes(e))})}function Qo(e){let t=typeof e.payload.iss==`string`?e.payload.iss:void 0,n=typeof e.payload.sub==`string`?e.payload.sub:void 0;if(t===void 0||n===void 0)throw Error(`Expected verified JWT payloads to include string iss and sub claims.`);let r=Yo(e.payload);return{attributes:Xo(e.payload),authenticator:e.authenticator,claims:r,issuer:t,principalId:`${t}:${n}`,principalType:e.principalType,subject:n}}function $o(e,t){if(!e.includes(`*`))return e===t;let n=e.replaceAll(/[.+?^${}()|[\]\\]/g,`\\$&`).replaceAll(`*`,`.*`);return RegExp(`^${n}$`).test(t)}const es=b.object({issuer:b.string().optional(),jwks_uri:b.string().url()}).passthrough(),ts=new Map,ns=new Map;async function rs(e){let t;try{t=await is(e.strategy)}catch(e){return{kind:`misconfigured`,message:`Failed to load OIDC discovery metadata. ${e instanceof Error?e.message:`Unknown discovery failure.`}`}}try{let n=await je(e.token,t,{audience:[...e.strategy.audiences],clockTolerance:e.strategy.clockSkewSeconds,issuer:e.strategy.issuer});if(typeof n.payload.sub!=`string`||n.payload.sub.length===0)return{kind:`not-authenticated`};let r=e.strategy.acceptCurrentVercelProject&&os({issuer:e.strategy.issuer,payload:n.payload}),i=r&&ss({payload:n.payload});return!r&&!Zo(n.payload,e.strategy)?{kind:`caller-not-allowed`}:{kind:`authenticated`,principal:Qo({authenticator:`oidc`,payload:n.payload,principalType:i?`runtime`:`service`})}}catch{return{kind:`not-authenticated`}}}async function is(e){let t=await as(e.discoveryUrl),n=ns.get(t.jwks_uri);if(n!==void 0)return n;let r=ke(new URL(t.jwks_uri));return ns.set(t.jwks_uri,r),r}async function as(e){let t=ts.get(e);if(t!==void 0)return await t;let n=fetch(e,{headers:{accept:`application/json`}}).then(async e=>{if(!e.ok)throw Error(`Discovery route returned HTTP ${e.status}.`);return es.parse(await e.json())}).catch(t=>{throw ts.delete(e),t});return ts.set(e,n),await n}function os(e){if(!e.issuer.startsWith(`https://oidc.vercel.com`))return!1;let t=process.env.VERCEL_PROJECT_ID?.trim();return t===void 0||t.length===0?!1:typeof e.payload.project_id==`string`&&e.payload.project_id===t}function ss(e){let t=(process.env.VERCEL_TARGET_ENV?.trim()??process.env.VERCEL_ENV?.trim())?.trim();return t===void 0||t.length===0?!1:typeof e.payload.environment==`string`&&e.payload.environment===t}function cs(e){return{attributes:e.attributes,authenticator:e.authenticator,issuer:e.issuer,principalId:e.principalId,principalType:e.principalType,subject:e.subject}}const K=sa(`auth.vercel-oidc`);async function ls(e,t){return e===null||e.length===0?{kind:`not-authenticated`}:await rs({strategy:{acceptCurrentVercelProject:t.acceptCurrentVercelProject,audiences:[...t.audiences],clockSkewSeconds:t.clockSkewSeconds??30,discoveryUrl:t.discoveryUrl??`${t.issuer.replace(/\/$/,``)}/.well-known/openid-configuration`,issuer:t.issuer,kind:`oidc`,...t.claims===void 0?{}:{claims:t.claims},...t.subjects===void 0?{}:{subjects:t.subjects}},token:e})}function us(e){if(e===null)return null;let t=/^Bearer\s+(.+)$/i.exec(e)?.[1]?.trim();return t===void 0||t.length===0?null:t}function ds(e={}){let t=e.status??401,n=e.code??(t===403?`forbidden`:`unauthorized`),r=e.message??(t===403?`Forbidden.`:`Authorization is required for this route.`),i=e.challenges??[],a=new Headers({"cache-control":`no-store`});for(let e of i)a.append(`www-authenticate`,fs(e));return Response.json({code:n,error:r,ok:!1},{headers:a,status:t})}function fs(e){if(e.parameters===void 0||Object.keys(e.parameters).length===0)return e.scheme;let t=Object.entries(e.parameters).map(([e,t])=>`${e}="${ps(t)}"`).join(`, `);return`${e.scheme} ${t}`}function ps(e){return e.replaceAll(`\\`,`\\\\`).replaceAll(`"`,`\\"`)}function ms(){return()=>void 0}async function hs(e,t={}){if(e===null||e.length===0)return K.debug(`Rejected request without a bearer token.`),{ok:!1};let n=_s(e);if(n===null)return K.debug(`Rejected token that failed to decode as a JWT.`),{ok:!1};if(!n.issuer.startsWith(`https://oidc.vercel.com/`))return K.debug(`Rejected token whose issuer is not a Vercel OIDC issuer.`,{issuer:n.issuer}),{ok:!1};if(n.audiences.length===0)return K.debug(`Rejected token with no audience claim.`,{issuer:n.issuer}),{ok:!1};let r=await ls(e,{acceptCurrentVercelProject:!0,audiences:n.audiences,issuer:n.issuer,subjects:t.subjects??[]});return r.kind===`authenticated`?(K.debug(`Accepted Vercel OIDC token.`,{issuer:n.issuer,principalType:r.principal.principalType,subject:r.principal.subject}),{ok:!0,sessionAuth:cs(r.principal)}):(K.debug(`Rejected Vercel OIDC token after verification.`,{audiences:n.audiences,issuer:n.issuer,reason:r.kind,subjectsConfigured:(t.subjects??[]).length>0,...r.kind===`misconfigured`?{detail:r.message}:{}}),{ok:!1})}function gs(e={}){return async t=>{let n=await hs(us(t.headers.get(`authorization`)),e);return n.ok?n.sessionAuth:null}}function _s(e){let t;try{t=Ae(e)}catch{return null}return typeof t.iss!=`string`||t.iss.length===0?null:{audiences:typeof t.aud==`string`?[t.aud]:Array.isArray(t.aud)?t.aud.filter(e=>typeof e==`string`):[],issuer:t.iss}}function vs(e){return Number.isFinite(e)&&Number.isInteger(e)&&e>=0}function ys(e){if(e.protocol!==`ash-attachment:`)throw Error(`AttachmentRef URL must use scheme "ash-attachment:". Got: "${e.protocol}".`);let t=e.searchParams.get(`v`);if(t!==`1`)throw Error(`AttachmentRef wire format version must be "1". Got: ${t===null?`missing`:JSON.stringify(t)}.`);let n=e.searchParams.get(`p`);if(n===null||n===``)throw Error(`AttachmentRef URL is missing the required "p" payload query param.`);let r;try{let e=Buffer.from(n,`base64url`).toString(`utf8`);r=JSON.parse(e)}catch(e){throw Error(`AttachmentRef payload is not valid base64url-encoded JSON: ${m(e)}`)}if(typeof r!=`object`||!r||Array.isArray(r))throw Error(`AttachmentRef payload must decode to a JSON object.`);let i=r;if(!(`params`in i))throw Error(`AttachmentRef payload is missing the required "params" field.`);let a=i.params;if(!(`size`in i))return{params:a};let o=i.size;if(typeof o!=`number`||!vs(o))throw Error(`AttachmentRef payload "size" must be a non-negative integer. Got: ${JSON.stringify(o)}.`);return{params:a,size:o}}function bs(e){return e instanceof URL&&e.protocol===`ash-attachment:`}function xs(e){return typeof Buffer<`u`&&Buffer.isBuffer(e)||e instanceof Uint8Array||e instanceof ArrayBuffer?e.byteLength:typeof e==`string`?Ss(e):bs(e)?ys(e).size??null:e instanceof URL&&e.protocol===`data:`?Ss(e.href):null}function Ss(e){if(e.startsWith(`data:`)){let t=e.indexOf(`,`);if(t===-1)return null;let n=e.slice(5,t),r=e.slice(t+1);if(n.endsWith(`;base64`))return Cs(r);try{return Buffer.byteLength(decodeURIComponent(r),`utf8`)}catch{return Buffer.byteLength(r,`utf8`)}}return/^https?:\/\//.test(e)?null:Cs(e)}function Cs(e){let t=e.trimEnd();if(t.length===0)return 0;let n=0;return t.endsWith(`==`)?n=2:t.endsWith(`=`)&&(n=1),Math.max(0,Math.floor(t.length*3/4)-n)}const ws=Object.freeze({allowedMediaTypes:`*`,maxBytes:25*1024*1024});function Ts(e,t=ws){if(e===void 0)return t;let n=e.maxBytes??t.maxBytes,r=e.allowedMediaTypes??t.allowedMediaTypes;if(n<0||!Number.isFinite(n))throw RangeError(`UploadPolicy.maxBytes must be a non-negative finite number. Received: ${String(n)}.`);return{allowedMediaTypes:r,maxBytes:n}}function Es(e,t){if(t.allowedMediaTypes===`*`)return!0;let n=e.toLowerCase();for(let e of t.allowedMediaTypes){let t=e.toLowerCase();if(t===n)return!0;if(t.endsWith(`/*`)){let e=t.slice(0,-1);if(n.startsWith(e))return!0}}return!1}function Ds(e,t){if(!Es(e.mediaType,t)){let n={allowedMediaTypes:t.allowedMediaTypes===`*`?[]:[...t.allowedMediaTypes],kind:`disallowed-media-type`,mediaType:e.mediaType};return e.filename===void 0?n:{...n,filename:e.filename}}let n=xs(e.data);if(n!==null&&n>t.maxBytes){let r={byteLength:n,kind:`too-large`,limit:t.maxBytes,mediaType:e.mediaType};return e.filename===void 0?r:{...r,filename:e.filename}}return null}function Os(e,t){if(typeof e==`string`)return[];let n=[];for(let r of e){if(r.type!==`file`)continue;let e=Ds(r,t);e!==null&&n.push(e)}return n}function ks(e){let t=e.filename??e.mediaType;if(e.kind===`too-large`)return`${t} (${e.byteLength} bytes) exceeds the ${e.limit}-byte upload limit.`;let n=e.allowedMediaTypes.length>0?` Allowed: ${e.allowedMediaTypes.join(`, `)}.`:``;return`${t} has media type "${e.mediaType}" which is not allowed by this route.${n}`}function As(e,t){return{method:`POST`,path:e,handler:t}}function js(e,t){return{method:`GET`,path:e,handler:t}}function Ms(e){let t=Ns(e);return{__kind:`ash:channel`,routes:e.routes,adapter:t,receive:e.receive}}function Ns(e){let t=e.state!=null,n=e.context!=null,r=e.fetchFile!==void 0,i=t||n,a={},o=!1,s=[`turn.started`,`actions.requested`,`action.result`,`message.completed`,`message.appended`,`input.requested`,`turn.failed`,`turn.completed`,`session.failed`,`session.completed`,`session.waiting`,`connection.authorization_required`,`connection.authorization_pending`,`connection.authorization_completed`],c=e.events;for(let e of s){let t=c?.[e];t&&(o=!0,a[e]=(e,n)=>t(e,n))}return!i&&!o&&!r?{kind:e.kindHint??`http`}:{kind:e.kindHint??`defineChannel`,state:t?{...e.state}:{},fetchFile:e.fetchFile,createAdapterContext(t){let r=t.state;return{...n?e.context(r):{},state:r,ctx:t.ctx,session:{id:``,continuationToken:``,auth:null,initiatorAuth:null,setContinuationToken(e){}}}},deliver(e){return va(e)},...a}}function Ps(e){let t=Ts(e.uploadPolicy);return Ms({routes:[As(`/ash/v1/session`,async(n,{send:r})=>{let i=await Fs(e.auth,n);if(i instanceof Response)return i;let a=i,o;try{o=await n.json()}catch{return Response.json({error:`Invalid JSON body.`,ok:!1},{status:400})}if(typeof o!=`object`||!o)return Response.json({error:`Expected a JSON object.`,ok:!1},{status:400});let s=Is(o);if(s instanceof Response)return s;let c=Bs(s,t);if(c!==null)return c;let l=`ash:${crypto.randomUUID()}`,u=await r(s.message,{auth:a,continuationToken:l});return Response.json({continuationToken:u.continuationToken,ok:!0,sessionId:u.id},{headers:{"cache-control":`no-store`,[y]:u.id},status:202})}),As(`/ash/v1/session/:sessionId`,async(n,{send:r,getSession:i,params:a})=>{let o=await Fs(e.auth,n);if(o instanceof Response)return o;let s=o,c=a.sessionId;if(!c)return Response.json({error:`Missing session id.`,ok:!1},{status:400});try{i(c)}catch{return Response.json({error:`Session not found.`,ok:!1},{status:404})}let l;try{l=await n.json()}catch{return Response.json({error:`Invalid JSON body.`,ok:!1},{status:400})}if(typeof l!=`object`||!l)return Response.json({error:`Expected a JSON object.`,ok:!1},{status:400});let u=Ls(l);if(u instanceof Response)return u;let d=Bs(u,t);if(d!==null)return d;let f=await r({inputResponses:u.inputResponses,message:u.message},{auth:s,continuationToken:u.continuationToken});return Response.json({ok:!0,sessionId:f.id},{headers:{"cache-control":`no-store`,[y]:f.id},status:200})}),js(`/ash/v1/session/:sessionId/stream`,async(t,{getSession:n,params:r})=>{let i=await Fs(e.auth,t);if(i instanceof Response)return i;let a=r.sessionId;if(!a)return Response.json({error:`Missing session id.`,ok:!1},{status:400});let o=Hs(t);if(o instanceof Response)return o;try{let e=Us(await n(a).getEventStream({startIndex:o}));return new Response(e,{headers:{"cache-control":`no-store`,"content-type":ie,[y]:a,[re]:te,[ae]:`14`}})}catch{return Response.json({error:`Session not found.`,ok:!1},{status:404})}})]})}async function Fs(e,t){let n=await e(t);return n===null?ds({challenges:[{scheme:`Bearer`}]}):n??null}function Is(e){let t=Rs(e.message);return t instanceof Response?t:t===void 0?Response.json({error:`Missing or empty 'message' field.`,ok:!1},{status:400}):{message:t}}function Ls(e){let t=typeof e.continuationToken==`string`&&e.continuationToken.length>0?e.continuationToken:void 0;if(t===void 0)return Response.json({error:`Missing or empty 'continuationToken' field.`,ok:!1},{status:400});let n=Rs(e.message);if(n instanceof Response)return n;let r=Vs(e.inputResponses);return r instanceof Response?r:n===void 0&&r===void 0?Response.json({error:`Expected a non-empty 'message', a non-empty 'inputResponses' array, or both.`,ok:!1},{status:400}):{message:n,continuationToken:t,inputResponses:r}}function Rs(e){if(e===void 0)return;if(typeof e==`string`)return e.length>0?e:void 0;if(!Array.isArray(e))return Response.json({error:`Expected 'message' to be a string or an array of text/file parts.`,ok:!1},{status:400});if(e.length===0)return;let t=[];for(let n of e){let e=zs(n);if(e instanceof Response)return e;t.push(e)}return t}function zs(e){if(typeof e!=`object`||!e)return Response.json({error:`Expected each message part to be an object.`,ok:!1},{status:400});let t=e;if(t.type===`text`)return typeof t.text!=`string`||t.text.length===0?Response.json({error:`Text parts require a non-empty 'text' string.`,ok:!1},{status:400}):{type:`text`,text:t.text};if(t.type===`file`){if(typeof t.mediaType!=`string`||t.mediaType.length===0)return Response.json({error:`File parts require a non-empty 'mediaType' string.`,ok:!1},{status:400});if(typeof t.data!=`string`)return Response.json({error:`File parts require a 'data' string (base64, data URL, or URL).`,ok:!1},{status:400});let e={type:`file`,mediaType:t.mediaType,data:t.data};return typeof t.filename==`string`&&t.filename.length>0&&(e.filename=t.filename),e}return Response.json({error:`Unsupported message part type "${String(t.type)}". Use 'text' or 'file'.`,ok:!1},{status:400})}function Bs(e,t){if(!e.message)return null;let n=Os(e.message,t);if(n.length===0)return null;let[r]=n;if(!r)return null;let i=r.kind===`too-large`?413:415;return Response.json({error:ks(r),ok:!1,violations:n.map(e=>e.kind===`too-large`?{byteLength:e.byteLength,filename:e.filename,kind:e.kind,limit:e.limit,mediaType:e.mediaType}:{allowedMediaTypes:e.allowedMediaTypes,filename:e.filename,kind:e.kind,mediaType:e.mediaType})},{status:i})}function Vs(e){if(e===void 0)return;if(!Array.isArray(e)||e.length===0)return Response.json({error:`Expected 'inputResponses' to be a non-empty array.`,ok:!1},{status:400});let t=e.filter(ne);return t.length===e.length?t:Response.json({error:`Expected every 'inputResponses' entry to match the HITL response schema.`,ok:!1},{status:400})}function Hs(e){let t=new URL(e.url).searchParams.get(`startIndex`);if(t===null)return;let n=Number.parseInt(t,10);return!Number.isSafeInteger(n)||n<0?Response.json({error:`Expected startIndex to be a non-negative integer.`,ok:!1},{status:400}):n}function Us(e){let t=new TextEncoder;return e.pipeThrough(new TransformStream({transform(e,n){n.enqueue(t.encode(`${JSON.stringify(e)}\n`))}}))}function Ws(){return new Response(`<!doctype html>
|
|
9
|
+
`)}function na(e){return e===`error`?`Error`:`Warning`}const ra=Symbol.for(`experimental-ash.context-key-registry`),ia=globalThis;ia[ra]===void 0&&(ia[ra]=new Map);const aa=ia[ra];var B=class{name;codec;constructor(e,t={}){this.name=e,this.codec=t.codec,aa.set(e,this)}};const oa=Symbol.for(`experimental-ash.context-storage`),sa=globalThis;sa[oa]===void 0&&(sa[oa]=new Ce);const ca=sa[oa];function V(){let e=ca.getStore();if(e===void 0)throw Error(`No active Ash context. Call this function only from authored runtime code such as tools, steps, and model callbacks.`);return e}function la(e){return{debug(t,n){ha(`debug`,e,t,n)},info(t,n){ha(`info`,e,t,n)},warn(t,n){ha(`warn`,e,t,n)},error(t,n){ha(`error`,e,t,n),_a(t,n)}}}function ua(){return crypto.randomUUID()}function da(e,t){let n={errorId:t??ua(),message:pa(e)},r=fa(e);return r!==void 0&&(n.name=r),n.detail=va(e),n}function fa(e){if(e instanceof Error)return e.name===`Error`?void 0:e.name;if(f(e)&&p(e.name)&&e.name!==`Error`)return e.name}function pa(e){return f(e)&&!(e instanceof Error)&&typeof e.message==`string`?e.message:Ee(e)}function ma(e,t){let n=t instanceof Error?t.message:Ee(t),r=t instanceof Error?t.name:`Error`;e.setStatus({code:we.ERROR,message:n}),e.recordException({message:n,name:r,stack:va(t)})}function ha(e,t,n,r){let i=e===`error`?console.error:e===`warn`?console.warn:console.log,a=`[ash:${t}] ${n}`;if(r===void 0){i(a);return}i(a,ga(r))}function ga(e){let t={};for(let[n,r]of Object.entries(e))if(r!==void 0){if(r instanceof Error){t[n]=da(r);continue}t[n]=r}return t}function _a(e,t){let n=Te.getActiveSpan();if(n===void 0)return;let r=t?.error;if(r instanceof Error){ma(n,r);return}n.addEvent(e,t?ga(t):void 0)}function va(e){return ya(De(e,{breakLength:1/0,compact:!1,depth:10,maxStringLength:8192}),16384)}function ya(e,t){if(Buffer.byteLength(e,`utf8`)<=t)return e;let n=e.slice(0,t);for(;Buffer.byteLength(n,`utf8`)>t&&n.length>0;)n=n.slice(0,-1);return`${n}<…truncated>`}function ba(e){if(e.message!==void 0)return{inputResponses:e.inputResponses,message:e.message};if(e.inputResponses!==void 0&&e.inputResponses.length>0)return{inputResponses:e.inputResponses}}function xa(e){return e.kind??`unknown`}const Sa={kind:`http`},Ca={kind:`schedule`};new B(`ash.auth`),new B(`ash.initiatorAuth`);const wa=new B(`ash.sessionId`),Ta=new B(`ash.continuationToken`);new B(`ash.mode`),new B(`ash.parentSession`),new B(`ash.capabilities`),new B(`ash.sessionPrepared`);const Ea=la(`execution.subagent-adapter`),Da=new Map;function Oa(e){return Da.get(e)}function ka(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.callId==`string`&&t.callId.length>0&&typeof t.parentContinuationToken==`string`&&t.parentContinuationToken.length>0&&typeof t.parentSessionId==`string`&&typeof t.subagentName==`string`&&t.subagentName.length>0}const Aa={kind:`subagent`,async"input.requested"(e,t){let n=t.state;ka(n)&&await ja({hookPayload:{callId:n.callId,childContinuationToken:t.ctx.require(Ta),childSessionId:t.ctx.require(wa),event:{requests:e.requests,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},kind:`subagent-input-request`,subagentName:n.subagentName},parentContinuationToken:n.parentContinuationToken})}};async function ja(e){"use step";let t=Oa(e.hookPayload.childContinuationToken);try{if(t!==void 0){t(e.hookPayload);return}await Se(e.parentContinuationToken,e.hookPayload)}catch(t){let n=ua();throw Ea.warn(`failed to forward proxied HITL batch to parent`,{callId:e.hookPayload.callId,childContinuationToken:e.hookPayload.childContinuationToken,childSessionId:e.hookPayload.childSessionId,errorId:n,parentContinuationToken:e.parentContinuationToken,subagentName:e.hookPayload.subagentName,error:t}),t}}var H=class extends Error{registry;entryName;logicalPath;sourceId;constructor(e,t,n={}){super(t),this.name=`RuntimeRegistryError`,this.registry=e,n.entryName!==void 0&&(this.entryName=n.entryName),n.logicalPath!==void 0&&(this.logicalPath=n.logicalPath),n.sourceId!==void 0&&(this.sourceId=n.sourceId)}},Ma=class{registry;_entries=new Map;_reserved;constructor(e,t=[]){this.registry=e,this._reserved=new Set(t)}get size(){return this._entries.size}has(e){return this._entries.has(e)}get(e){return this._entries.get(e)??null}asMap(){return this._entries}register(e,t,n={}){if(this._entries.has(e))throw new H(this.registry,n.duplicateMessage??`Duplicate ${this.registry} name "${e}".`,{...n.location,entryName:e});if(this._reserved.has(e))throw new H(this.registry,n.reservedMessage??`${Na(this.registry)} "${e}" collides with another runtime-visible name.`,{...n.location,entryName:e});this._entries.set(e,t),this._reserved.add(e)}set(e,t){this._entries.set(e,t),this._reserved.add(e)}};function Na(e){return e.length===0?e:e.charAt(0).toUpperCase()+e.slice(1)}const Pa=[Sa,Aa,Ca],Fa=new Set([`kind`,`state`,`deliver`,`contextProviders`,`createAdapterContext`,`fetchFile`]);function Ia(e){let t=new Map,n=new Set;for(let e of Pa){let r=Ra(e);n.add(r),t.set(r,e)}for(let r of e.channels){if(r.adapter===void 0)continue;let e={logicalPath:r.logicalPath,sourceId:r.sourceId},i=r.adapter,a=Ra(i,e);if(n.has(a)){if(za(i))throw new H(`adapter`,`Channel adapter kind "${a}" is reserved by the framework. A route-declared adapter may share a framework kind only as a pass-through with no \`deliver\` hook, event handlers, \`attachments\` resolver, \`contextProviders\`, or \`createAdapterContext\` factory. Use a custom \`kind\` to add channel-specific behavior.`,{...e,entryName:a});continue}t.set(a,i)}return{adaptersByKind:t}}function La(e,t){let n=t,r=e.adaptersByKind.get(n.kind);if(r===void 0)throw Error(`Unknown adapter kind: "${n.kind}". Declare the adapter on the route that starts this session so the runtime can rehydrate it.`);return{...r,state:n.state}}function Ra(e,t){let n=xa(e);if(n===`unknown`)throw new H(`adapter`,"Adapters must declare a non-empty `kind` field.",{entryName:`unknown`,logicalPath:t?.logicalPath,sourceId:t?.sourceId});return n}function za(e){if(e.deliver!==void 0||e.fetchFile!==void 0||e.createAdapterContext!==void 0||e.contextProviders!==void 0&&e.contextProviders.length>0)return!0;for(let[t,n]of Object.entries(e))if(!Fa.has(t)&&typeof n==`function`)return!0;return!1}function Ba(e,t={}){return t.moduleMapLoadMode!==void 0||t.moduleMapLoaderPath!==void 0?{appRoot:e,kind:`disk`,moduleMapLoaderPath:t.moduleMapLoaderPath,moduleMapLoadMode:t.moduleMapLoadMode}:{appRoot:e,kind:`disk`}}function Va(e){return e.kind===`disk`?e.appRoot:void 0}function Ha(e){return e.kind===`disk`?e.moduleMapLoadMode===void 0?`disk:${e.appRoot}`:e.moduleMapLoaderPath===void 0?`disk:${e.appRoot}:${e.moduleMapLoadMode}`:`disk:${e.appRoot}:${e.moduleMapLoadMode}:${e.moduleMapLoaderPath}`:`bundled`}function U(e){let t=Ua(e),n=`${t}/.ash/discovery`,r=`${t}/.ash/compile`;return{appRoot:t,compiledManifestPath:`${r}/compiled-agent-manifest.json`,compileDirectoryPath:r,compileMetadataPath:`${r}/compile-metadata.json`,diagnosticsPath:`${n}/diagnostics.json`,discoveryDirectoryPath:n,discoveryManifestPath:`${n}/agent-discovery-manifest.json`,moduleMapPath:`${r}/module-map.mjs`}}function Ua(e){let t=e.replaceAll(`\\`,`/`);return t===`/`?t:t.replace(/\/+$/,``)}function Wa(e){return Oe(e,{prefix:void 0}).message}function Ga(e=`test-session`){return{bundleCache:new Map,bundleCacheKeyBySourceKey:new Map,compiledArtifacts:null,id:e}}const Ka=Symbol.for(`experimental-ash.runtime-session-storage`),qa=Symbol.for(`experimental-ash.runtime-session-default`),W=globalThis;W[Ka]===void 0&&(W[Ka]=new Ce);const Ja=W[Ka];function Ya(){return W[qa]===void 0&&(W[qa]=Ga(`process-default`)),W[qa]}function Xa(){return Ja.getStore()??Ya()}function Za(){return Xa().compiledArtifacts}const Qa=b.object({path:b.string(),sha256:b.string()}).strict(),$a=b.object({compile:b.object({moduleMap:Qa}).strict(),discovery:b.object({diagnostics:Qa,manifest:Qa,sourceGraphHash:b.string(),summary:b.object({errors:b.number().finite(),warnings:b.number().finite()}).strict()}).strict(),generator:b.object({name:b.string(),version:b.string()}).strict(),kind:b.literal(`ash-compile-metadata`),status:b.union([b.literal(`failed`),b.literal(`ready`)]),version:b.literal(5)}).strict();var eo=class extends Error{metadataPath;constructor(e,t){super(e),this.name=`LoadCompileMetadataError`,t!==void 0&&(this.metadataPath=t)}};async function to(e){let t=e.metadataPath??(e.compiledArtifactsSource.kind===`disk`?U(e.compiledArtifactsSource.appRoot).compileMetadataPath:void 0);if(t!==void 0){let{readFile:e}=await import(`node:fs/promises`),n;try{n=JSON.parse(await e(t,`utf8`))}catch(e){throw new eo(ro(e),t)}return no(n,t)}let n=Za()?.metadata;return n===void 0?null:no(n,`bundled compile metadata`)}function no(e,t){let n=$a.safeParse(e);if(!n.success)throw new eo(`Expected "${t}" to contain valid Ash compile metadata. ${Wa(n.error)}`,t);return n.data}function ro(e){return e instanceof Error?e.message:`Unknown compile metadata load failure.`}async function io(e){let t=Ha(e),n=await ao(e);try{let r=(await to({compiledArtifactsSource:e}))?.discovery.sourceGraphHash;return r===void 0||r.length===0?n===void 0?t:`${t}:mtime-${oo(n)}`:n===void 0?`${t}:${r}`:`${t}:${r}:mtime-${oo(n)}`}catch{return n===void 0?t:`${t}:mtime-${oo(n)}`}}async function ao(e){if(e.kind!==`disk`)return;let{stat:t}=await import(`node:fs/promises`),{compileMetadataPath:n}=U(e.appRoot);try{return(await t(n)).mtimeMs}catch{return}}function oo(e){return Math.floor(e).toString(36)}const so=`__root__`;function co(e,t){if(t===void 0||t===`__root__`)return e.root;let n=e.nodesByNodeId.get(t);if(n===void 0)throw Error(`Missing runtime agent node for node id "${t}".`);return n}const lo=`bundled compiled manifest`;var uo=class extends Error{manifestPath;constructor(e,t){super(e),this.name=`LoadCompiledManifestError`,t!==void 0&&(this.manifestPath=t)}};async function fo(e){let t=e.manifestPath??(e.compiledArtifactsSource.kind===`disk`?U(e.compiledArtifactsSource.appRoot).compiledManifestPath:void 0);if(t!==void 0){let{readFile:e}=await import(`node:fs/promises`),n;try{n=JSON.parse(await e(t,`utf8`))}catch(e){throw new uo(mo(e),t)}return po(n,t)}let n=Za();if(n!==null)return po(n.manifest,lo);throw new uo(`Compiled manifest is unavailable without an app root or bundled compiled artifacts.`,lo)}function po(e,t){let n=ur.safeParse(e);if(!n.success)throw new uo(`Expected "${t}" to contain a valid compiled Ash agent manifest. ${Wa(n.error)}`,t);return n.data}function mo(e){return e instanceof Error?e.message:`Unknown manifest load failure.`}const ho=`bundled compiled module map`;var go=class extends Error{moduleMapPath;constructor(e,t){super(e),this.name=`LoadCompiledModuleMapError`,t!==void 0&&(this.moduleMapPath=t)}};async function _o(e){let t=e.moduleMapPath??(e.compiledArtifactsSource.kind===`disk`?U(e.compiledArtifactsSource.appRoot).moduleMapPath:void 0);if(t!==void 0){let e=bo(t);try{let n=await import(e);return vo(n.moduleMap??n.default,t)}catch(e){throw new go(yo(e),t)}}let n=Za();if(n!==null)return vo(n.moduleMap,ho);throw new go(`Compiled module map is unavailable without an app root or bundled compiled artifacts.`,ho)}function vo(e,t){let n=Er.safeParse(e);if(!n.success)throw new go(`Expected "${t}" to export a valid compiled Ash module map. ${Wa(n.error)}`,t);return n.data}function yo(e){return e instanceof Error?e.message:`Unknown module-map load failure.`}function bo(e){let t=e.replaceAll(`\\`,`/`);return/^[A-Za-z]:\//.test(t)?`file:///${encodeURI(t)}`:t.startsWith(`/`)?`file://${encodeURI(t)}`:t}const G=`/workspace`;function xo(e){return e.length===0?null:[`Available skills`,`Listed skills are available in this run. Do not claim a listed skill is inaccessible unless activation or workspace inspection actually fails.`,`If the user names a skill or the request clearly matches one of the descriptions below, call load_skill before proceeding.`,`If multiple skills match, activate the minimal set that covers the task. After activation, follow the returned instructions instead of improvising around them.`,`If activation fails, say so briefly and continue with the best fallback. Packaged sibling files under a skill path can be inspected with bash or read_file when needed.`,...e.map(e=>So(e))].join(`
|
|
10
|
+
`)}function So(e){return`- ${e.name}: ${e.description} (path: ${G}/skills/${e.name}/SKILL.md)`}function Co(e){if(e.rootEntries.length!==0)return[`Workspace`,`- You have access to authored files mounted at the workspace root for this run.`,`- The live workspace root visible to \`bash\` in this run is \`${G}\`.`,`- Root entries under ${G}/:`,...e.rootEntries.map(e=>` - ${e}`),`- Treat \`${G}\` as the workspace root for this run unless a \`bash\` call shows otherwise.`,"- For questions about workspace paths or file availability, verify with `bash` first using commands like `pwd`, `ls`, and `find`.","- Use the `bash` tool with `ls`, `find`, and `rg` to inspect deeper contents when needed.",`- Do not claim these files are unavailable unless a workspace or tool call actually fails.`].join(`
|
|
11
|
+
`)}function wo(e){return e instanceof Error&&e.name===`ConnectionAuthorizationRequiredError`}function To(e){return e instanceof Error&&e.name===`ConnectionAuthorizationFailedError`}function Eo(e){return e?.startAuthorization!==void 0}const Do=Object.freeze({__ashPlaceholder:`connection-authorization`}),Oo=new B(`ash.pendingConnectionToolCalls`);function ko(e,t){if(t.length===0)return e??[];let n=new Set,r=e??[];for(let e of r)n.add(e.toolCallId);let i=[...r];for(let e of t)n.has(e.toolCallId)||(n.add(e.toolCallId),i.push(e));return i}function Ao(e,t){return`${e}__${t}`}const jo=la(`framework.connection-search`),Mo=new B(`ash.connectionRegistry`),No=new B(`ash.pendingConnectionAuthorizations`),Po=new B(`ash.discoveredConnectionTools`),Fo={description:`Search for tools across your connections. Discovered tools become directly callable by their qualified name (e.g. linear__list_issues) in your next response.`,execute:async(e,t)=>{let n=typeof t==`object`&&t&&`toolCallId`in t?t.toolCallId:void 0;return Io(e,{toolCallId:typeof n==`string`?n:void 0})},inputSchema:{additionalProperties:!1,properties:{connection:{description:`Optional: limit search to a specific connection name.`,type:`string`},limit:{description:`Max results to return. Default 10.`,type:`number`},keywords:{description:`Search keywords and expanded aliases. Distill intent into keywords; avoid stop words like 'a', 'the', 'in'.`,type:`string`}},required:[`keywords`],type:`object`},logicalPath:`ash:framework/connection-search`,name:`connection_search`,onCompact({ctx:e}){return e.set(Po,{byConnection:{}}),e.set(No,[]),e.set(Oo,[]),{}},sourceId:`ash:connection-search-tool`,sourceKind:`module`};async function Io(e,t){let n=V(),r=n.get(Mo);if(r===void 0)return[];let i=e.limit??10,a=Lo(e.keywords),o=[],s=[],c=e.connection!==void 0&&e.connection!==``?r.getConnections().filter(t=>t.connectionName===e.connection):r.getConnections(),l={...n.get(Po)?.byConnection},u=[];for(let e of c){let t;try{t=await r.getClient(e.connectionName).getToolMetadata()}catch(t){if(wo(t)){u.push({connectionName:e.connectionName,description:e.description}),s.push({connection:e.connectionName,description:e.description,needsAuthorization:!0});continue}if(To(t)){jo.warn(`connection authorization failed`,{connection:e.connectionName,reason:t.reason,retryable:t.retryable,error:t}),s.push({connection:e.connectionName,description:e.description,error:`Authorization failed for ${e.connectionName}: ${t.message}`});continue}let n=t instanceof Error?t.message:`unknown error`;jo.warn(`failed to load connection tools`,{connection:e.connectionName,error:t instanceof Error?t:Error(n)}),s.push({connection:e.connectionName,description:e.description,error:`Failed to load tools for "${e.connectionName}": ${n}`});continue}l[e.connectionName]=t;for(let n of t){let t=Ro(a,n);t>0&&o.push({item:{connection:e.connectionName,description:n.description,inputSchema:n.inputSchema,qualifiedName:Ao(e.connectionName,n.name),tool:n.name},score:t})}}n.set(Po,{byConnection:l});let d=[];if(u.length>0){for(let e of u)Bo(n,e);d=u.map(e=>e.connectionName).filter(e=>zo(r,e))}if(d.length>0&&t?.toolCallId!==void 0){let r=n.get(Oo);return n.set(Oo,ko(r,[{args:e,connectionNames:d,kind:`connection-discover`,toolCallId:t.toolCallId,toolName:`connection_search`}])),Do}o.sort((e,t)=>t.score-e.score);let f=o.slice(0,i).map(e=>e.item);return f.length>0?[...f,...s]:c.map(e=>s.find(t=>t.connection===e.connectionName)||{connection:e.connectionName,description:e.description})}function Lo(e){return e.toLowerCase().split(/[\s_\-./]+/).filter(e=>e.length>1)}function Ro(e,t){let n=Lo(t.name),r=Lo(t.description),i=0;for(let t of e){for(let e of n)(e.includes(t)||t.includes(e))&&(i+=3);for(let e of r)(e.includes(t)||t.includes(e))&&(i+=1)}return i}function zo(e,t){return e===void 0?!1:Eo(e.getConnections().find(e=>e.connectionName===t)?.authorization)}function Bo(e,t){let n=e.get(No)??[];n.some(e=>e.connectionName===t.connectionName)||e.set(No,[...n,t])}const Vo=Fo.name;function Ho(e){return[`## Connections`,``,`You have direct access to the following external services through connected MCP servers.`,`When the user's request relates to any of these services, use them instead of web search or general knowledge.`,``,`Available connections:`,...e.map(e=>`- ${e.connectionName}: ${e.description}`),``,`Use ${Vo} to discover specific tools within a connection. Discovered tools become directly callable by their qualified name (e.g. linear__list_issues) in your next response.`].join(`
|
|
12
|
+
`)}function Uo(e){return[...Wo(e.instructions),...Go(e.workspaceSpec),...e.toolsAvailable?[`Tool execution
|
|
13
|
+
A single tool or subagent call runs as one serial action. If you call multiple independent tools or subagents in one response, Ash treats that batch as parallel work. Only batch work that is independent and does not rely on another call in the same response.`]:[],...Ko(e.connections),...qo(e.skills)]}function Wo(e){if(e===void 0)return[];let t=e.markdown.trim();return t.length===0?[]:[`Instructions (${e.name})\n${t}`]}function Go(e){if(e===void 0)return[];let t=Co(e);return t===void 0?[]:[t]}function Ko(e){return!e||e.length===0?[]:[Ho(e)]}function qo(e){if(!e||e.length===0)return[];let t=xo(e);return t===null?[]:[t]}function Jo(e){let t=e.agent,n=Yo(t);return{id:t.config.name,instructions:Uo({connections:t.connections,instructions:t.instructions,skills:t.skills,toolsAvailable:e.tools.length>0,workspaceSpec:t.workspaceSpec}),compactionModel:t.config.compaction?.model,model:t.config.model,nodeId:e.nodeId,turnMetadata:n,tools:[...e.tools],workspaceSpec:t.workspaceSpec}}function Yo(e){let t={};return Object.keys(e.config.metadata).length>0&&(t.configMetadata={...e.config.metadata}),e.instructions!==void 0&&(t.instructionsName=e.instructions.name),e.skills.length>0&&(t.skillNames=e.skills.map(e=>e.name)),Object.keys(t).length>0?t:void 0}const Xo=new Set([`aud`,`exp`,`iat`,`iss`,`jti`,`nbf`,`sub`]);function Zo(e){let t={};for(let[n,r]of Object.entries(e)){if(typeof r==`string`){t[n]=r;continue}Array.isArray(r)&&r.every(e=>typeof e==`string`)&&(t[n]=Object.freeze([...r]))}return Object.freeze(t)}function Qo(e){let t=Zo(e);return Object.freeze(Object.fromEntries(Object.entries(t).filter(([e])=>!Xo.has(e))))}function $o(e,t){let n=Zo(e);if(t.subjects!==void 0){let n=typeof e.sub==`string`?e.sub:null;if(n===null||!t.subjects.some(e=>ts(e,n)))return!1}return t.claims===void 0?!0:Object.entries(t.claims).every(([e,t])=>{let r=n[e];return r===void 0?!1:typeof r==`string`?t.includes(r):r.some(e=>t.includes(e))})}function es(e){let t=typeof e.payload.iss==`string`?e.payload.iss:void 0,n=typeof e.payload.sub==`string`?e.payload.sub:void 0;if(t===void 0||n===void 0)throw Error(`Expected verified JWT payloads to include string iss and sub claims.`);let r=Zo(e.payload);return{attributes:Qo(e.payload),authenticator:e.authenticator,claims:r,issuer:t,principalId:`${t}:${n}`,principalType:e.principalType,subject:n}}function ts(e,t){if(!e.includes(`*`))return e===t;let n=e.replaceAll(/[.+?^${}()|[\]\\]/g,`\\$&`).replaceAll(`*`,`.*`);return RegExp(`^${n}$`).test(t)}const ns=b.object({issuer:b.string().optional(),jwks_uri:b.string().url()}).passthrough(),rs=new Map,is=new Map;async function as(e){let t;try{t=await os(e.strategy)}catch(e){return{kind:`misconfigured`,message:`Failed to load OIDC discovery metadata. ${e instanceof Error?e.message:`Unknown discovery failure.`}`}}try{let n=await je(e.token,t,{audience:[...e.strategy.audiences],clockTolerance:e.strategy.clockSkewSeconds,issuer:e.strategy.issuer});if(typeof n.payload.sub!=`string`||n.payload.sub.length===0)return{kind:`not-authenticated`};let r=e.strategy.acceptCurrentVercelProject&&cs({issuer:e.strategy.issuer,payload:n.payload}),i=r&&ls({payload:n.payload});return!r&&!$o(n.payload,e.strategy)?{kind:`caller-not-allowed`}:{kind:`authenticated`,principal:es({authenticator:`oidc`,payload:n.payload,principalType:i?`runtime`:`service`})}}catch{return{kind:`not-authenticated`}}}async function os(e){let t=await ss(e.discoveryUrl),n=is.get(t.jwks_uri);if(n!==void 0)return n;let r=ke(new URL(t.jwks_uri));return is.set(t.jwks_uri,r),r}async function ss(e){let t=rs.get(e);if(t!==void 0)return await t;let n=fetch(e,{headers:{accept:`application/json`}}).then(async e=>{if(!e.ok)throw Error(`Discovery route returned HTTP ${e.status}.`);return ns.parse(await e.json())}).catch(t=>{throw rs.delete(e),t});return rs.set(e,n),await n}function cs(e){if(!e.issuer.startsWith(`https://oidc.vercel.com`))return!1;let t=process.env.VERCEL_PROJECT_ID?.trim();return t===void 0||t.length===0?!1:typeof e.payload.project_id==`string`&&e.payload.project_id===t}function ls(e){let t=(process.env.VERCEL_TARGET_ENV?.trim()??process.env.VERCEL_ENV?.trim())?.trim();return t===void 0||t.length===0?!1:typeof e.payload.environment==`string`&&e.payload.environment===t}function us(e){return{attributes:e.attributes,authenticator:e.authenticator,issuer:e.issuer,principalId:e.principalId,principalType:e.principalType,subject:e.subject}}const K=la(`auth.vercel-oidc`);async function ds(e,t){return e===null||e.length===0?{kind:`not-authenticated`}:await as({strategy:{acceptCurrentVercelProject:t.acceptCurrentVercelProject,audiences:[...t.audiences],clockSkewSeconds:t.clockSkewSeconds??30,discoveryUrl:t.discoveryUrl??`${t.issuer.replace(/\/$/,``)}/.well-known/openid-configuration`,issuer:t.issuer,kind:`oidc`,...t.claims===void 0?{}:{claims:t.claims},...t.subjects===void 0?{}:{subjects:t.subjects}},token:e})}function fs(e){if(e===null)return null;let t=/^Bearer\s+(.+)$/i.exec(e)?.[1]?.trim();return t===void 0||t.length===0?null:t}function ps(e={}){let t=e.status??401,n=e.code??(t===403?`forbidden`:`unauthorized`),r=e.message??(t===403?`Forbidden.`:`Authorization is required for this route.`),i=e.challenges??[],a=new Headers({"cache-control":`no-store`});for(let e of i)a.append(`www-authenticate`,ms(e));return Response.json({code:n,error:r,ok:!1},{headers:a,status:t})}function ms(e){if(e.parameters===void 0||Object.keys(e.parameters).length===0)return e.scheme;let t=Object.entries(e.parameters).map(([e,t])=>`${e}="${hs(t)}"`).join(`, `);return`${e.scheme} ${t}`}function hs(e){return e.replaceAll(`\\`,`\\\\`).replaceAll(`"`,`\\"`)}function gs(){return()=>void 0}async function _s(e,t={}){if(e===null||e.length===0)return K.debug(`Rejected request without a bearer token.`),{ok:!1};let n=ys(e);if(n===null)return K.debug(`Rejected token that failed to decode as a JWT.`),{ok:!1};if(!n.issuer.startsWith(`https://oidc.vercel.com/`))return K.debug(`Rejected token whose issuer is not a Vercel OIDC issuer.`,{issuer:n.issuer}),{ok:!1};if(n.audiences.length===0)return K.debug(`Rejected token with no audience claim.`,{issuer:n.issuer}),{ok:!1};let r=await ds(e,{acceptCurrentVercelProject:!0,audiences:n.audiences,issuer:n.issuer,subjects:t.subjects??[]});return r.kind===`authenticated`?(K.debug(`Accepted Vercel OIDC token.`,{issuer:n.issuer,principalType:r.principal.principalType,subject:r.principal.subject}),{ok:!0,sessionAuth:us(r.principal)}):(K.debug(`Rejected Vercel OIDC token after verification.`,{audiences:n.audiences,issuer:n.issuer,reason:r.kind,subjectsConfigured:(t.subjects??[]).length>0,...r.kind===`misconfigured`?{detail:r.message}:{}}),{ok:!1})}function vs(e={}){return async t=>{let n=await _s(fs(t.headers.get(`authorization`)),e);return n.ok?n.sessionAuth:null}}function ys(e){let t;try{t=Ae(e)}catch{return null}return typeof t.iss!=`string`||t.iss.length===0?null:{audiences:typeof t.aud==`string`?[t.aud]:Array.isArray(t.aud)?t.aud.filter(e=>typeof e==`string`):[],issuer:t.iss}}function bs(e){return Number.isFinite(e)&&Number.isInteger(e)&&e>=0}function xs(e){if(e.protocol!==`ash-attachment:`)throw Error(`AttachmentRef URL must use scheme "ash-attachment:". Got: "${e.protocol}".`);let t=e.searchParams.get(`v`);if(t!==`1`)throw Error(`AttachmentRef wire format version must be "1". Got: ${t===null?`missing`:JSON.stringify(t)}.`);let n=e.searchParams.get(`p`);if(n===null||n===``)throw Error(`AttachmentRef URL is missing the required "p" payload query param.`);let r;try{let e=Buffer.from(n,`base64url`).toString(`utf8`);r=JSON.parse(e)}catch(e){throw Error(`AttachmentRef payload is not valid base64url-encoded JSON: ${m(e)}`)}if(typeof r!=`object`||!r||Array.isArray(r))throw Error(`AttachmentRef payload must decode to a JSON object.`);let i=r;if(!(`params`in i))throw Error(`AttachmentRef payload is missing the required "params" field.`);let a=i.params;if(!(`size`in i))return{params:a};let o=i.size;if(typeof o!=`number`||!bs(o))throw Error(`AttachmentRef payload "size" must be a non-negative integer. Got: ${JSON.stringify(o)}.`);return{params:a,size:o}}function Ss(e){return e instanceof URL&&e.protocol===`ash-attachment:`}function Cs(e){return typeof Buffer<`u`&&Buffer.isBuffer(e)||e instanceof Uint8Array||e instanceof ArrayBuffer?e.byteLength:typeof e==`string`?ws(e):Ss(e)?xs(e).size??null:e instanceof URL&&e.protocol===`data:`?ws(e.href):null}function ws(e){if(e.startsWith(`data:`)){let t=e.indexOf(`,`);if(t===-1)return null;let n=e.slice(5,t),r=e.slice(t+1);if(n.endsWith(`;base64`))return Ts(r);try{return Buffer.byteLength(decodeURIComponent(r),`utf8`)}catch{return Buffer.byteLength(r,`utf8`)}}return/^https?:\/\//.test(e)?null:Ts(e)}function Ts(e){let t=e.trimEnd();if(t.length===0)return 0;let n=0;return t.endsWith(`==`)?n=2:t.endsWith(`=`)&&(n=1),Math.max(0,Math.floor(t.length*3/4)-n)}const Es=Object.freeze({allowedMediaTypes:`*`,maxBytes:25*1024*1024});function Ds(e,t=Es){if(e===void 0)return t;let n=e.maxBytes??t.maxBytes,r=e.allowedMediaTypes??t.allowedMediaTypes;if(n<0||!Number.isFinite(n))throw RangeError(`UploadPolicy.maxBytes must be a non-negative finite number. Received: ${String(n)}.`);return{allowedMediaTypes:r,maxBytes:n}}function Os(e,t){if(t.allowedMediaTypes===`*`)return!0;let n=e.toLowerCase();for(let e of t.allowedMediaTypes){let t=e.toLowerCase();if(t===n)return!0;if(t.endsWith(`/*`)){let e=t.slice(0,-1);if(n.startsWith(e))return!0}}return!1}function ks(e,t){if(!Os(e.mediaType,t)){let n={allowedMediaTypes:t.allowedMediaTypes===`*`?[]:[...t.allowedMediaTypes],kind:`disallowed-media-type`,mediaType:e.mediaType};return e.filename===void 0?n:{...n,filename:e.filename}}let n=Cs(e.data);if(n!==null&&n>t.maxBytes){let r={byteLength:n,kind:`too-large`,limit:t.maxBytes,mediaType:e.mediaType};return e.filename===void 0?r:{...r,filename:e.filename}}return null}function As(e,t){if(typeof e==`string`)return[];let n=[];for(let r of e){if(r.type!==`file`)continue;let e=ks(r,t);e!==null&&n.push(e)}return n}function js(e){let t=e.filename??e.mediaType;if(e.kind===`too-large`)return`${t} (${e.byteLength} bytes) exceeds the ${e.limit}-byte upload limit.`;let n=e.allowedMediaTypes.length>0?` Allowed: ${e.allowedMediaTypes.join(`, `)}.`:``;return`${t} has media type "${e.mediaType}" which is not allowed by this route.${n}`}function Ms(e,t){return{method:`POST`,path:e,handler:t}}function Ns(e,t){return{method:`GET`,path:e,handler:t}}function Ps(e){let t=Fs(e);return{__kind:`ash:channel`,routes:e.routes,adapter:t,receive:e.receive}}function Fs(e){let t=e.state!=null,n=e.context!=null,r=e.fetchFile!==void 0,i=t||n,a={},o=!1,s=[`turn.started`,`actions.requested`,`action.result`,`message.completed`,`message.appended`,`input.requested`,`turn.failed`,`turn.completed`,`session.failed`,`session.completed`,`session.waiting`,`connection.authorization_required`,`connection.authorization_pending`,`connection.authorization_completed`],c=e.events;for(let e of s){let t=c?.[e];t&&(o=!0,a[e]=(e,n)=>t(e,n))}return!i&&!o&&!r?{kind:e.kindHint??`http`}:{kind:e.kindHint??`defineChannel`,state:t?{...e.state}:{},fetchFile:e.fetchFile,createAdapterContext(t){let r=t.state;return{...n?e.context(r):{},state:r,ctx:t.ctx,session:{id:``,continuationToken:``,auth:null,initiatorAuth:null,setContinuationToken(e){}}}},deliver(e){return ba(e)},...a}}function Is(e){let t=Ds(e.uploadPolicy);return Ps({routes:[Ms(`/ash/v1/session`,async(n,{send:r})=>{let i=await Ls(e.auth,n);if(i instanceof Response)return i;let a=i,o;try{o=await n.json()}catch{return Response.json({error:`Invalid JSON body.`,ok:!1},{status:400})}if(typeof o!=`object`||!o)return Response.json({error:`Expected a JSON object.`,ok:!1},{status:400});let s=Rs(o);if(s instanceof Response)return s;let c=Hs(s,t);if(c!==null)return c;let l=`ash:${crypto.randomUUID()}`,u=await r(s.message,{auth:a,continuationToken:l});return Response.json({continuationToken:u.continuationToken,ok:!0,sessionId:u.id},{headers:{"cache-control":`no-store`,[y]:u.id},status:202})}),Ms(`/ash/v1/session/:sessionId`,async(n,{send:r,getSession:i,params:a})=>{let o=await Ls(e.auth,n);if(o instanceof Response)return o;let s=o,c=a.sessionId;if(!c)return Response.json({error:`Missing session id.`,ok:!1},{status:400});try{i(c)}catch{return Response.json({error:`Session not found.`,ok:!1},{status:404})}let l;try{l=await n.json()}catch{return Response.json({error:`Invalid JSON body.`,ok:!1},{status:400})}if(typeof l!=`object`||!l)return Response.json({error:`Expected a JSON object.`,ok:!1},{status:400});let u=zs(l);if(u instanceof Response)return u;let d=Hs(u,t);if(d!==null)return d;let f=await r({inputResponses:u.inputResponses,message:u.message},{auth:s,continuationToken:u.continuationToken});return Response.json({ok:!0,sessionId:f.id},{headers:{"cache-control":`no-store`,[y]:f.id},status:200})}),Ns(`/ash/v1/session/:sessionId/stream`,async(t,{getSession:n,params:r})=>{let i=await Ls(e.auth,t);if(i instanceof Response)return i;let a=r.sessionId;if(!a)return Response.json({error:`Missing session id.`,ok:!1},{status:400});let o=Ws(t);if(o instanceof Response)return o;try{let e=Gs(await n(a).getEventStream({startIndex:o}));return new Response(e,{headers:{"cache-control":`no-store`,"content-type":ie,[y]:a,[re]:te,[ae]:`14`}})}catch{return Response.json({error:`Session not found.`,ok:!1},{status:404})}})]})}async function Ls(e,t){let n=await e(t);return n===null?ps({challenges:[{scheme:`Bearer`}]}):n??null}function Rs(e){let t=Bs(e.message);return t instanceof Response?t:t===void 0?Response.json({error:`Missing or empty 'message' field.`,ok:!1},{status:400}):{message:t}}function zs(e){let t=typeof e.continuationToken==`string`&&e.continuationToken.length>0?e.continuationToken:void 0;if(t===void 0)return Response.json({error:`Missing or empty 'continuationToken' field.`,ok:!1},{status:400});let n=Bs(e.message);if(n instanceof Response)return n;let r=Us(e.inputResponses);return r instanceof Response?r:n===void 0&&r===void 0?Response.json({error:`Expected a non-empty 'message', a non-empty 'inputResponses' array, or both.`,ok:!1},{status:400}):{message:n,continuationToken:t,inputResponses:r}}function Bs(e){if(e===void 0)return;if(typeof e==`string`)return e.length>0?e:void 0;if(!Array.isArray(e))return Response.json({error:`Expected 'message' to be a string or an array of text/file parts.`,ok:!1},{status:400});if(e.length===0)return;let t=[];for(let n of e){let e=Vs(n);if(e instanceof Response)return e;t.push(e)}return t}function Vs(e){if(typeof e!=`object`||!e)return Response.json({error:`Expected each message part to be an object.`,ok:!1},{status:400});let t=e;if(t.type===`text`)return typeof t.text!=`string`||t.text.length===0?Response.json({error:`Text parts require a non-empty 'text' string.`,ok:!1},{status:400}):{type:`text`,text:t.text};if(t.type===`file`){if(typeof t.mediaType!=`string`||t.mediaType.length===0)return Response.json({error:`File parts require a non-empty 'mediaType' string.`,ok:!1},{status:400});if(typeof t.data!=`string`)return Response.json({error:`File parts require a 'data' string (base64, data URL, or URL).`,ok:!1},{status:400});let e={type:`file`,mediaType:t.mediaType,data:t.data};return typeof t.filename==`string`&&t.filename.length>0&&(e.filename=t.filename),e}return Response.json({error:`Unsupported message part type "${String(t.type)}". Use 'text' or 'file'.`,ok:!1},{status:400})}function Hs(e,t){if(!e.message)return null;let n=As(e.message,t);if(n.length===0)return null;let[r]=n;if(!r)return null;let i=r.kind===`too-large`?413:415;return Response.json({error:js(r),ok:!1,violations:n.map(e=>e.kind===`too-large`?{byteLength:e.byteLength,filename:e.filename,kind:e.kind,limit:e.limit,mediaType:e.mediaType}:{allowedMediaTypes:e.allowedMediaTypes,filename:e.filename,kind:e.kind,mediaType:e.mediaType})},{status:i})}function Us(e){if(e===void 0)return;if(!Array.isArray(e)||e.length===0)return Response.json({error:`Expected 'inputResponses' to be a non-empty array.`,ok:!1},{status:400});let t=e.filter(ne);return t.length===e.length?t:Response.json({error:`Expected every 'inputResponses' entry to match the HITL response schema.`,ok:!1},{status:400})}function Ws(e){let t=new URL(e.url).searchParams.get(`startIndex`);if(t===null)return;let n=Number.parseInt(t,10);return!Number.isSafeInteger(n)||n<0?Response.json({error:`Expected startIndex to be a non-negative integer.`,ok:!1},{status:400}):n}function Gs(e){let t=new TextEncoder;return e.pipeThrough(new TransformStream({transform(e,n){n.enqueue(t.encode(`${JSON.stringify(e)}\n`))}}))}function Ks(){return new Response(`<!doctype html>
|
|
14
14
|
<html lang="en">
|
|
15
15
|
<head>
|
|
16
16
|
<meta charset="utf-8" />
|
|
@@ -62,27 +62,27 @@ A single tool or subagent call runs as one serial action. If you call multiple i
|
|
|
62
62
|
<p>You can close this tab and return to your app.</p>
|
|
63
63
|
</main>
|
|
64
64
|
</body>
|
|
65
|
-
</html>`,{headers:{"cache-control":`no-store`,"content-type":`text/html; charset=utf-8`},status:200})}const
|
|
66
|
-
`),r=
|
|
67
|
-
`),outputLines:a.length,totalLines:r,truncated:a.length<r}}function
|
|
65
|
+
</html>`,{headers:{"cache-control":`no-store`,"content-type":`text/html; charset=utf-8`},status:200})}const qs=[`GET`,`POST`];function Js(){return qs.map(e=>Xs(e))}function Ys(){return new Set(qs.map(Zs))}function Xs(e){let t=Zs(e);return{name:t,method:e,urlPath:se,fetch:Qs,logicalPath:`framework://channels/${t}`,sourceId:`ash:framework:connection-callback-${e.toLowerCase()}`,sourceKind:`module`}}function Zs(e){return`.well-known/ash/v1/connections/callback/${e.toLowerCase()}`}async function Qs(e,t){let n=t.params.name,r=t.params.token;if(typeof n!=`string`||n.length===0)return Response.json({error:`Missing connection name.`,ok:!1},{status:400});if(typeof r!=`string`||r.length===0)return Response.json({error:`Missing callback token.`,ok:!1},{status:400});let i=await $s(e);try{await Se(r,i)}catch{return Response.json({error:`Connection callback not pending.`,ok:!1},{status:404})}return Ks()}async function $s(e){let t={};e.headers.forEach((e,n)=>{t[n]=e});let n=``;if(e.method!==`GET`&&e.method!==`HEAD`)try{n=await e.text()}catch{n=``}return{body:n,headers:t,method:e.method,url:e.url}}function ec(){let e=Is({auth:nc()}),t=[];for(let n of e.routes)t.push({name:`ash`,method:n.method.toUpperCase(),urlPath:n.path,fetch:async(e,t)=>n.handler(e,t),handler:n.handler,adapter:e.adapter,logicalPath:`framework://channels/${n.path}`,sourceId:`ash:framework:${n.method.toLowerCase()}-${n.path}`,sourceKind:`module`});return t.push(...Js()),t}function tc(){return new Set([`ash`,...Ys()])}function nc(){return process.env.VERCEL?vs():gs()}const rc=oe.omit({action:!0,display:!0,requestId:!0}),{$schema:ic,...ac}=b.toJSONSchema(rc),oc={description:`Ask the user a question and wait for their response before continuing. Use this when you need clarification or a choice from the user.`,inputSchema:ac,logicalPath:`ash:framework/ask-question`,name:`ask_question`,sourceId:`ash:ask-question-tool`,sourceKind:`module`};async function q(){let e=V().get(nd);if(e===void 0)throw Error(`This tool requires sandbox access on the runtime context. Ensure the step is running inside a managed runtime context with sandbox support.`);let t=await e.get();if(t===null)throw Error(`The sandbox is not available in the current runtime context.`);return t}function sc(e){if(!e.startsWith(`/`))throw Error(`filePath must be an absolute path. Received: "${e}". Use an absolute path such as /workspace/foo.ts.`)}function cc(e){return uc(e,`head`)}function lc(e){return uc(e,`tail`)}function uc(e,t){let n=e.split(`
|
|
66
|
+
`),r=fc(n),i=t===`head`,a=[],o=0,s=i?0:n.length-1,c=i?1:-1;for(let e=s;e>=0&&e<n.length&&a.length<2e3;e+=c){let t=dc(n[e]??``),r=Buffer.byteLength(t,`utf8`)+1;if(o+r>51200&&a.length>0)break;a.push(t),o+=r}return i||a.reverse(),{output:a.join(`
|
|
67
|
+
`),outputLines:a.length,totalLines:r,truncated:a.length<r}}function dc(e){return e.length<=2e3?e:e.slice(0,2e3)+` [truncated]`}function fc(e){return e.length>0&&e[e.length-1]===``?e.length-1:e.length}async function pc(e){let t=await(await q()).runCommand(e.command),n=lc(t.stdout),r=lc(t.stderr),i=n.truncated||r.truncated,a=n.output;n.truncated&&(a=`[stdout truncated: showing last ${n.outputLines} of ${n.totalLines} lines]\n`+a);let o=r.output;return r.truncated&&(o=`[stderr truncated: showing last ${r.outputLines} of ${r.totalLines} lines]\n`+o),{exitCode:t.exitCode,stderr:o,stdout:a,truncated:i}}const mc={additionalProperties:!1,properties:{command:{description:`The shell command to execute.`,type:`string`}},required:[`command`],type:`object`};async function hc(e){return pc(e)}const gc={description:`Execute a shell command in the shared workspace environment.`,execute:hc,inputSchema:mc,logicalPath:`ash:framework/bash`,name:`bash`,sourceId:`ash:bash-tool`,sourceKind:`module`},_c=new B(`ash.readFile`);function J(e){return de.normalize(e)}function vc(e){return e}function yc(e){let t=be(`sha256`).update(e.content,`utf8`).digest(`hex`);return{byteLength:Buffer.byteLength(e.content,`utf8`),contentHash:t,filePath:e.filePath}}function bc(e,t,n){let r=e.ensure(_c,()=>({byTarget:{}}));e.set(_c,{byTarget:{...r.byTarget,[t]:n}})}function xc(e){e.set(_c,{byTarget:{}})}const Sc=new Map;async function Cc(e){let t=Sc.get(e.id);if(t!==void 0)return t;let n=wc(e);Sc.set(e.id,n);try{return await n}catch{return Sc.delete(e.id),!1}}async function wc(e){return(await e.runCommand(`command -v rg >/dev/null 2>&1`)).exitCode===0}function Y(e){return`'${e.replace(/'/g,`'\\''`)}'`}async function Tc(e){let t=e.path??`/workspace`;sc(t);let n=J(t),r=Math.min(Math.max(1,e.limit??100),1e3),i=await q(),a=await Cc(i)?Ec({normalizedPath:n,pattern:e.pattern}):Dc({normalizedPath:n,pattern:e.pattern}),o=await i.runCommand(a);if(o.exitCode!==0&&o.exitCode!==1)throw kc(a,o.exitCode,o.stderr);let s=o.stdout.split(`
|
|
68
68
|
`).filter(e=>e.length>0),c=s.length>r,l=c?s.slice(0,r):s,u=[],d=0,f=!1;for(let e of l){let t=J(e),n=Buffer.byteLength(t,`utf8`)+1;if(d+n>51200&&u.length>0){f=!0;break}u.push(t),d+=n}if(u.length===0)return{content:`No files found`,count:0,path:n,truncated:!1};let p=c||f,m=[...u];return p&&(m.push(``),m.push(`(Results truncated: showing first ${u.length} results out of more. Use a more specific path or pattern to narrow results.)`)),{content:m.join(`
|
|
69
|
-
`),count:u.length,path:n,truncated:p}}function
|
|
70
|
-
`),execute:
|
|
71
|
-
`),n=[],r=0,i=0,a=!1;for(let e of t){if(e.length===0&&t.indexOf(e)===t.length-1)continue;e!==`--`&&e.length>0&&/^.+:\d+:/.test(e)&&i++;let o=
|
|
72
|
-
`);if(o){let t=[];i>=e.effectiveLimit&&t.push(`Match limit reached (${e.effectiveLimit}). Use a larger limit or more specific pattern.`),a&&t.push(`Output truncated due to size. Use a more specific path or pattern.`),s+=`\n\n[${t.join(` `)}]`}return{content:s,matchCount:i,path:e.normalizedPath,truncated:o}}function
|
|
73
|
-
`),execute:
|
|
74
|
-
`),u=l.length>0&&l[l.length-1]===``?l.length-1:l.length;if(u===0){if(o>1)throw Error(`offset ${o} is past the end of the file (0 lines). Use the default offset to read an empty file.`);return{content:``,path:a,totalLines:0,truncated:!1}}if(o>u)throw Error(`offset ${o} is past the end of the file (${u} lines).`);let d=
|
|
75
|
-
`),ee=o+g.length-1;return ee<u||v?{content:y,nextOffset:ee+1,path:a,totalLines:u,truncated:!0}:{content:y,path:a,totalLines:u,truncated:!1}}const
|
|
76
|
-
`),execute:
|
|
77
|
-
`)}`}function
|
|
78
|
-
`),execute:async e
|
|
69
|
+
`),count:u.length,path:n,truncated:p}}function Ec(e){return[`rg --files --hidden`,`--glob '!.git/*'`,`--glob ${Y(e.pattern)}`,`-- ${Y(e.normalizedPath)}`].join(` `)}function Dc(e){let t=Oc(e.pattern),n=t.includes(`/`)?`-path ${Y(`*/${t}`)}`:`-name ${Y(t)}`;return[`find ${Y(e.normalizedPath)}`,`-type f`,`-not -path '*/.git/*'`,n].join(` `)}function Oc(e){let t=e.replaceAll(`**`,`*`);for(;t.startsWith(`*/`);)t=t.slice(2);return t}function kc(e,t,n){let r=n.trim(),i=r.length>0?r:`no stderr output`;return Error(`glob failed (exit ${t}): ${i}\nCommand: ${e}`)}const Ac={additionalProperties:!1,properties:{limit:{description:`Maximum number of results to return. Defaults to 100.`,maximum:1e3,minimum:1,type:`integer`},path:{description:`The directory to search in. Defaults to /workspace. Must be an absolute path. Omit to use the default.`,type:`string`},pattern:{description:`The glob pattern to match files against (e.g. "**/*.ts", "src/**/*.js").`,type:`string`}},required:[`pattern`],type:`object`};async function jc(e){return Tc(e)}const Mc={description:[`Fast file pattern matching tool that works with any codebase size.`,``,`Usage:`,`- Supports glob patterns like "**/*.js" or "src/**/*.ts".`,`- Returns matching file paths.`,`- Use this tool when you need to find files by name patterns.`,`- If you are unsure of the correct file path, use the glob tool to look up filenames by glob pattern.`,`- Use the grep tool instead if you need to search file contents.`,`- Call this tool in parallel when you know there are multiple patterns to search for.`].join(`
|
|
70
|
+
`),execute:jc,inputSchema:Ac,logicalPath:`ash:framework/glob`,name:`glob`,sourceId:`ash:glob-tool`,sourceKind:`module`};async function Nc(e){let t=e.path??`/workspace`;sc(t);let n=J(t),r=Math.min(Math.max(1,e.limit??100),1e3),i=e.context!==void 0&&e.context>0?e.context:0,a=await q(),o=await Cc(a)?Pc({contextLines:i,effectiveLimit:r,glob:e.glob,ignoreCase:e.ignoreCase??!1,literal:e.literal??!1,normalizedPath:n,pattern:e.pattern}):Fc({contextLines:i,effectiveLimit:r,glob:e.glob,ignoreCase:e.ignoreCase??!1,literal:e.literal??!1,normalizedPath:n,pattern:e.pattern}),s=await a.runCommand(o);if(s.exitCode!==0&&s.exitCode!==1)throw Lc(o,s.exitCode,s.stderr);let c=s.stdout;return c.trim().length===0?{content:`No matches found`,matchCount:0,path:n,truncated:!1}:Ic({effectiveLimit:r,normalizedPath:n,stdout:c})}function Pc(e){let t=[`rg`,`--line-number`,`--color=never`,`--hidden`,`--glob '!.git/*'`];return e.ignoreCase&&t.push(`--ignore-case`),e.literal&&t.push(`--fixed-strings`),e.glob!==void 0&&t.push(`--glob ${Y(e.glob)}`),e.contextLines>0&&t.push(`--context ${e.contextLines}`),t.push(`--max-count ${e.effectiveLimit}`),t.push(`--`),t.push(Y(e.pattern)),t.push(Y(e.normalizedPath)),t.join(` `)}function Fc(e){let t=[`grep`,`-r`,`-n`,`--color=never`,`--exclude-dir=.git`];return e.ignoreCase&&t.push(`-i`),e.literal?t.push(`-F`):t.push(`-E`),e.glob!==void 0&&t.push(`--include=${Y(e.glob)}`),e.contextLines>0&&t.push(`-C ${e.contextLines}`),t.push(`-m ${e.effectiveLimit}`),t.push(`--`),t.push(Y(e.pattern)),t.push(Y(e.normalizedPath)),t.join(` `)}function Ic(e){let t=e.stdout.split(`
|
|
71
|
+
`),n=[],r=0,i=0,a=!1;for(let e of t){if(e.length===0&&t.indexOf(e)===t.length-1)continue;e!==`--`&&e.length>0&&/^.+:\d+:/.test(e)&&i++;let o=dc(e),s=Buffer.byteLength(o,`utf8`)+1;if(r+s>51200&&n.length>0){a=!0;break}n.push(o),r+=s}let o=a||i>=e.effectiveLimit,s=n.join(`
|
|
72
|
+
`);if(o){let t=[];i>=e.effectiveLimit&&t.push(`Match limit reached (${e.effectiveLimit}). Use a larger limit or more specific pattern.`),a&&t.push(`Output truncated due to size. Use a more specific path or pattern.`),s+=`\n\n[${t.join(` `)}]`}return{content:s,matchCount:i,path:e.normalizedPath,truncated:o}}function Lc(e,t,n){let r=n.trim(),i=r.length>0?r:`no stderr output`;return Error(`grep failed (exit ${t}): ${i}\nCommand: ${e}`)}const Rc={additionalProperties:!1,properties:{context:{description:`Number of surrounding context lines to include before and after each match. Defaults to 0.`,minimum:0,type:`integer`},glob:{description:`Filter files by glob pattern (e.g. "*.ts", "*.{ts,tsx}").`,type:`string`},ignoreCase:{description:`Perform case-insensitive search. Defaults to false.`,type:`boolean`},limit:{description:`Maximum number of matches to return per file. Defaults to 100.`,maximum:1e3,minimum:1,type:`integer`},literal:{description:`Treat the pattern as a literal string instead of a regular expression. Defaults to false.`,type:`boolean`},path:{description:`The directory or file to search in. Defaults to /workspace. Must be an absolute path. Omit to use the default.`,type:`string`},pattern:{description:`The regex pattern to search for in file contents (e.g. "log.*Error", "function\\s+\\w+").`,type:`string`}},required:[`pattern`],type:`object`};async function zc(e){return Nc(e)}const Bc={description:[`Fast content search tool that works with any codebase size.`,``,`Usage:`,`- Searches file contents using regular expressions.`,`- Supports full regex syntax (e.g. "log.*Error", "function\\s+\\w+").`,`- Filter files by pattern with the glob parameter (e.g. "*.js", "*.{ts,tsx}").`,`- Returns matching lines with file paths and line numbers.`,`- Use this tool when you need to find files containing specific patterns.`,`- Use the glob tool instead if you only need to find files by name.`,`- Call this tool in parallel when you have multiple independent searches.`,`- Any line longer than 2000 characters is truncated.`].join(`
|
|
73
|
+
`),execute:zc,inputSchema:Rc,logicalPath:`ash:framework/grep`,name:`grep`,sourceId:`ash:grep-tool`,sourceKind:`module`};async function Vc(e){let{filePath:t,offset:n,limit:r}=e;sc(t);let i=await q(),a=J(t),o=n??1,s=r??2e3;if(o<1)throw Error(`offset must be >= 1. Received: ${o}.`);let c=await i.readTextFile(t);if(c===null)throw Error(`File not found: ${t}. Verify the path exists and is accessible in the sandbox.`);if(c.includes(`\0`))throw Error(`File "${t}" contains NUL bytes and appears to be a binary file. read_file only supports text files.`);let l=c.split(`
|
|
74
|
+
`),u=l.length>0&&l[l.length-1]===``?l.length-1:l.length;if(u===0){if(o>1)throw Error(`offset ${o} is past the end of the file (0 lines). Use the default offset to read an empty file.`);return{content:``,path:a,totalLines:0,truncated:!1}}if(o>u)throw Error(`offset ${o} is past the end of the file (${u} lines).`);let d=yc({content:c,filePath:a}),f=vc(a);bc(V(),f,d);let p=o-1,m=Math.min(p+s,u),h=l.slice(p,m),g=[],_=0,v=!1;for(let e=0;e<h.length;e++){let t=`${o+e}: ${dc(h[e]??``)}`,n=Buffer.byteLength(t,`utf8`)+1;if(_+n>51200&&g.length>0){v=!0;break}g.push(t),_+=n}let y=g.join(`
|
|
75
|
+
`),ee=o+g.length-1;return ee<u||v?{content:y,nextOffset:ee+1,path:a,totalLines:u,truncated:!0}:{content:y,path:a,totalLines:u,truncated:!1}}const Hc={additionalProperties:!1,properties:{filePath:{description:`The absolute path to the file to read.`,type:`string`},limit:{description:`Maximum number of lines to return. Defaults to 2000.`,minimum:1,type:`integer`},offset:{description:`1-based line number to start from. Defaults to 1.`,minimum:1,type:`integer`}},required:[`filePath`],type:`object`};async function Uc(e){return Vc(e)}const Wc={description:[`Read a file from the local filesystem. If the path does not exist, an error is returned.`,``,`Usage:`,`- The filePath parameter should be an absolute path.`,`- By default, this tool returns up to 2000 lines from the start of the file.`,`- The offset parameter is the line number to start from (1-indexed).`,`- To read later sections, call this tool again with a larger offset.`,`- Use the grep tool to find specific content in large files or files with long lines.`,`- If you are unsure of the correct file path, use the glob tool to look up filenames by glob pattern.`,'- Contents are returned with each line prefixed by its line number as `<line>: <content>`. For example, if a file has contents "foo\\n", you will receive "1: foo\\n".',`- Any line longer than 2000 characters is truncated.`,`- Call this tool in parallel when you know there are multiple files you want to read.`,`- Avoid tiny repeated slices (30 line chunks). If you need more context, read a larger window.`].join(`
|
|
76
|
+
`),execute:Uc,inputSchema:Hc,logicalPath:`ash:framework/read-file`,name:`read_file`,onCompact({ctx:e}){return xc(e),{}},sourceId:`ash:read-file-tool`,sourceKind:`module`},Gc=/^---\r?\n[\s\S]*?\r?\n---\r?\n?/;function Kc(e){if(e.length===0||e.trim()!==e||e.startsWith(`.`)||e.includes(`/`)||e.includes(`\\`)||e.includes(`..`)||/^[A-Za-z]:/.test(e))throw Error(`Expected skill id to be a non-empty safe path segment without whitespace, separators, "." prefix, or "..".`)}async function qc(e,t){Kc(t);let n=await Jc(e),r=Yc(t,`SKILL.md`),i=await n.readTextFile(r);if(i===null)throw Error(`No skill named "${t}" at ${r}.`);return i.replace(Gc,``)}async function Jc(e){let t=await e.get();if(t===null)throw Error(`The sandbox is not available in the current authored runtime context.`);return t}function Yc(e,t){return`${G}/skills/${e}/${t}`}async function Xc(e){let t=V().get(nd);if(t===void 0)throw Error(`The load_skill tool requires sandbox access on the runtime context. Ensure the step is running inside a managed runtime context with sandbox support.`);let{skill:n}=e;return await qc(t,n)}const Zc={description:[`Load the full instructions for one available skill by name or id.`,`Use this tool when the request clearly matches a listed skill description or when the user explicitly asks for that skill.`,`Loading adds the skill instructions to the current turn.`,`Choose the "skill" value from the Available skills block.`].join(` `),execute:e=>Xc(e),inputSchema:{additionalProperties:!1,properties:{skill:{description:`Available skill name or id.`,type:`string`}},required:[`skill`],type:`object`},logicalPath:`ash:framework/load-skill`,name:`load_skill`,retentionPolicy:`keep`,sourceId:`ash:load-skill-tool`,sourceKind:`module`},Qc=new B(`ash.todo`);function $c(e){if(e.items.length!==0)return`[Your task list was preserved across context compaction]\n${e.items.map(e=>`- [${e.status===`completed`?`x`:e.status===`cancelled`?`-`:` `}] [${e.priority}] ${e.content}`).join(`
|
|
77
|
+
`)}`}function el(e){let{items:t}=e,n={cancelled:0,completed:0,in_progress:0,pending:0,total:t.length};for(let e of t)n[e.status]++;return{counts:n,todos:t}}function tl(e){let t=V(),{todos:n}=e??{};if(n!==void 0){let e={items:[...n]};return t.set(Qc,e),el(e)}return el(t.ensure(Qc,()=>({items:[]})))}const nl={description:[`Use this tool to create and manage a structured task list for the current session.`,`This helps you track progress, organize complex tasks, and demonstrate thoroughness.`,``,`When to use:`,`- Complex multistep tasks requiring 3 or more distinct steps`,`- When the user provides multiple tasks or a numbered list`,`- After receiving new instructions, to capture requirements`,`- After completing a task, to mark it complete and add follow-ups`,``,`When NOT to use:`,`- Single, straightforward tasks that need no tracking`,`- Purely conversational or informational requests`,``,`Usage:`,"- Call with `todos` to replace the entire list (full replacement write)","- Call without `todos` to read the current list",`- Both return the full current list with status counts`,`- Mark tasks in_progress when you start, completed when done`,`- Only have ONE task in_progress at a time`].join(`
|
|
78
|
+
`),execute:async e=>tl(e??{}),inputSchema:{additionalProperties:!1,properties:{todos:{description:`The updated todo list. Omit to read the current list without modifying it.`,items:{additionalProperties:!1,properties:{content:{description:`Brief description of the task.`,type:`string`},priority:{description:`Priority level of the task.`,enum:[`high`,`medium`,`low`],type:`string`},status:{description:`Current status of the task.`,enum:[`pending`,`in_progress`,`completed`,`cancelled`],type:`string`}},required:[`content`,`status`,`priority`],type:`object`},type:`array`}},type:`object`},logicalPath:`ash:framework/todo`,name:`todo`,onCompact({ctx:e}){let t=e.get(Qc);if(t===void 0||t.items.length===0)return{};let n=$c(t);return n===void 0?{}:{messages:[{content:n,role:`user`}]}},sourceId:`ash:todo-tool`,sourceKind:`module`};function rl(e){let t=new Me({bulletListMarker:`-`,codeBlockStyle:`fenced`,emDelimiter:`*`,headingStyle:`atx`,hr:`---`});return t.remove([`script`,`style`,`meta`,`link`]),t.turndown(e)}function il(e){let t=e;return t=t.replace(/<(script|style|noscript)\b[^>]*>[\s\S]*?<\/\1>/gi,``),t=t.replace(/<\/(p|div|br|h[1-6]|li|tr|blockquote|pre|section|article|header|footer|nav|aside|main|figure|figcaption|details|summary)>/gi,`
|
|
79
79
|
`),t=t.replace(/<br\s*\/?>/gi,`
|
|
80
|
-
`),t=t.replace(/<[^>]+>/g,``),t=
|
|
80
|
+
`),t=t.replace(/<[^>]+>/g,``),t=sl(t),t=t.split(`
|
|
81
81
|
`).map(e=>e.replace(/[ \t]+/g,` `).trim()).join(`
|
|
82
82
|
`).replace(/\n{3,}/g,`
|
|
83
83
|
|
|
84
|
-
`).trim(),t}const
|
|
85
|
-
`),execute:
|
|
86
|
-
`),execute:
|
|
84
|
+
`).trim(),t}const al={"&":`&`,">":`>`,"<":`<`," ":` `,""":`"`,"'":`'`,"'":`'`,"/":`/`},ol=new RegExp(Object.keys(al).join(`|`),`gi`);function sl(e){return e.replace(ol,e=>al[e.toLowerCase()]??e)}const cl=5*1024*1024;async function ll(e){let{url:t,format:n=`markdown`,timeout:r}=e;if(!t.startsWith(`http://`)&&!t.startsWith(`https://`))throw Error(`URL must start with http:// or https://`);let i=Math.min(r===void 0?3e4:r*1e3,12e4),a=AbortSignal.timeout(i),o=ul(n),s=await fetch(t,{headers:o,signal:a}),c=s.status===403&&s.headers.get(`cf-mitigated`)===`challenge`?await fetch(t,{headers:{...o,"User-Agent":g},signal:a}):s;if(!c.ok)throw Error(`Request failed with status code: ${c.status}`);let l=c.headers.get(`content-length`);if(l!==null&&parseInt(l,10)>cl)throw Error(`Response too large (exceeds 5 MB limit).`);let u=await c.arrayBuffer();if(u.byteLength>cl)throw Error(`Response too large (exceeds 5 MB limit).`);let d=c.headers.get(`content-type`)??``,f=d.includes(`text/html`),p=new TextDecoder().decode(u),m;m=n===`markdown`&&f?rl(p):n===`text`&&f?il(p):p;let{output:h,truncated:_}=cc(m);return{content:h,contentType:d,truncated:_,url:t}}function ul(e){let t;return t=e===`markdown`?`text/markdown;q=1.0, text/x-markdown;q=0.9, text/plain;q=0.8, text/html;q=0.7, */*;q=0.1`:e===`text`?`text/plain;q=1.0, text/markdown;q=0.9, text/html;q=0.8, */*;q=0.1`:`text/html;q=1.0, application/xhtml+xml;q=0.9, text/plain;q=0.8, text/markdown;q=0.7, */*;q=0.1`,{Accept:t,"Accept-Language":`en-US,en;q=0.9`,"User-Agent":`Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36`}}async function dl(e){return ll(e)}const fl={description:[`Fetch a webpage and return its content in the requested format. Use this to retrieve and analyze content from URLs.`,``,`Usage notes:`,`- The URL must be a fully-formed valid URL starting with http:// or https://`,`- HTML responses are automatically converted to markdown or plain text based on the requested format`,`- Format options: "markdown" (default), "text", or "html"`,`- Default timeout is 30 seconds (max 120 seconds)`,`- Maximum response size is 5 MB; content is further capped at the shared tool-output budget (50 KB / 2000 lines)`,`- This tool is read-only and does not modify any files`].join(`
|
|
85
|
+
`),execute:dl,inputSchema:{additionalProperties:!1,properties:{format:{description:`The format to return the content in (text, markdown, or html). HTML responses are automatically converted to the requested format. Defaults to "markdown".`,enum:[`markdown`,`text`,`html`],type:`string`},timeout:{description:`Optional timeout in seconds. Defaults to 30, max 120.`,type:`number`},url:{description:`The fully-formed URL to fetch content from. Must start with http:// or https://.`,type:`string`}},required:[`url`],type:`object`},logicalPath:`ash:framework/web-fetch`,name:`web_fetch`,sourceId:`ash:web-fetch-tool`,sourceKind:`module`},pl={description:`Search the web for real-time information. Use this to find up-to-date information about current events, recent developments, or topics that may have changed since the knowledge cutoff.`,inputSchema:null,logicalPath:`ash:framework/web-search`,name:`web_search`,sourceId:`ash:web-search-tool`,sourceKind:`module`};async function ml(e){let{filePath:t,content:n}=e;sc(t);let r=await q(),i=V(),a=J(t),o=vc(a),s=await r.readTextFile(t);if(s===null)return await r.writeTextFile(t,n),bc(i,o,yc({content:n,filePath:a})),{existed:!1,path:a};let c=i.ensure(_c,()=>({byTarget:{}})).byTarget[o];if(c===void 0)throw Error(`You must read file ${t} before overwriting it. Use the read_file tool first.`);let l=yc({content:s,filePath:a});if(l.contentHash!==c.contentHash||l.byteLength!==c.byteLength)throw Error(`File ${t} has been modified since it was last read. Please read the file again before modifying it.`);return await r.writeTextFile(t,n),bc(i,o,yc({content:n,filePath:a})),{existed:!0,path:a}}const hl={additionalProperties:!1,properties:{content:{description:`Complete replacement file contents.`,type:`string`},filePath:{description:`The absolute path to the file to write (must be absolute, not relative).`,type:`string`}},required:[`filePath`,`content`],type:`object`};async function gl(e){return ml(e)}const _l=[oc,gc,Mc,Bc,Wc,{description:[`Writes a file to the local filesystem.`,``,`Usage:`,`- This tool will overwrite the existing file if there is one at the provided path.`,`- If this is an existing file, you MUST use the read_file tool first to read the file's contents. This tool will fail if you did not read the file first.`,`- ALWAYS prefer editing existing files in the codebase. NEVER write new files unless explicitly required.`,`- NEVER proactively create documentation files (*.md) or README files. Only create documentation files if explicitly requested by the User.`,`- Only use emojis if the user explicitly requests it. Avoid writing emojis to files unless asked.`].join(`
|
|
86
|
+
`),execute:gl,inputSchema:hl,logicalPath:`ash:framework/write-file`,name:`write_file`,sourceId:`ash:write-file-tool`,sourceKind:`module`},nl,fl,pl,Zc,Fo],vl=new Map([[Fo,e=>e.hasConnections]]);function yl(e){return _l.filter(t=>{let n=vl.get(t);return n===void 0||n(e)})}function bl(){return new Set(_l.map(e=>e.name))}function xl(e){let t=[],n=[],r=new Map,i=[];for(let a of e){let e=a.lifecycle.session;e!==void 0&&t.push({slug:a.slug,handler:e});let o=a.lifecycle.turn;o!==void 0&&n.push({slug:a.slug,handler:o});for(let[e,t]of Object.entries(a.events)){let n={slug:a.slug,handler:t,eventType:e};if(e===`*`)i.push(n);else{let t=r.get(e)??[];t.push(n),r.set(e,t)}}}return{session:t,turn:n,streamEventsByType:r,streamEventsWildcard:i}}var X=class extends Error{logicalPath;sourceId;constructor(e,t={}){super(e),this.name=`ResolveAgentError`,t.logicalPath!==void 0&&(this.logicalPath=t.logicalPath),t.sourceId!==void 0&&(this.sourceId=t.sourceId)}};function Sl(e){return{exportName:e.exportName,logicalPath:e.logicalPath,sourceId:e.sourceId,sourceKind:`module`}}async function Z(e){let t=e.nodeId??`__root__`,r=e.moduleMap.nodes[t]?.modules[e.definition.sourceId];if(r===void 0)throw new X(`Missing compiled module namespace for ${e.kindLabel} source "${e.definition.sourceId}" in node "${t}".`,{logicalPath:e.definition.logicalPath,sourceId:e.definition.sourceId});return await o(i(n(r,`Missing compiled module namespace for ${e.kindLabel} source "${e.definition.sourceId}" in node "${t}".`),{exportName:e.definition.exportName,logicalPath:e.definition.logicalPath}))}async function Cl(e,t,n){try{let r=ri(await Z({definition:e,kindLabel:`channel`,moduleMap:t,nodeId:n}),`Expected the channel export "${e.exportName??`default`}" from "${e.logicalPath}" to match the public Ash shape.`),i=Sl({exportName:e.exportName,logicalPath:e.logicalPath,sourceId:e.sourceId}),a=r.routes.find(t=>t.method.toUpperCase()===e.method.toUpperCase()&&t.path===e.urlPath),o=r.adapter;return o&&o.kind!==`http`&&(o.kind=`channel:${e.name}`),{name:e.name,method:e.method,urlPath:e.urlPath,fetch:async(e,t)=>a?a.handler(e,t):Response.json({error:`No matching route handler.`,ok:!1},{status:404}),handler:a?.handler,receive:r.receive,adapter:o,...i}}catch(t){throw t instanceof X?t:new X(`Failed to attach the channel definition from "${e.logicalPath}": ${m(t)}`,{logicalPath:e.logicalPath,sourceId:e.sourceId})}}async function wl(e,t,r){try{let i=n(await Z({definition:e,kindLabel:`connection`,moduleMap:t,nodeId:r}),`Expected the connection export "${e.exportName??`default`}" from "${e.logicalPath}" to return an object.`),a=i.auth!==void 0,o=i.headers!==void 0,s={connectionName:e.connectionName,description:e.description,exportName:e.exportName,logicalPath:e.logicalPath,sourceId:e.sourceId,sourceKind:`module`,url:e.url};if(a)try{s.authorization=li(i.auth,`Connection "${e.connectionName}" at "${e.logicalPath}":`)}catch(t){throw new X(m(t),{logicalPath:e.logicalPath,sourceId:e.sourceId})}return o&&(s.headers=i.headers),i.tools!==void 0&&(s.tools=i.tools),typeof i.approval==`function`&&(s.approval=i.approval),s}catch(t){throw t instanceof X?t:new X(`Failed to resolve connection "${e.connectionName}" from "${e.logicalPath}": ${m(t)}`,{logicalPath:e.logicalPath,sourceId:e.sourceId})}}async function Tl(e,t,r){try{let i=n(await Z({definition:e,kindLabel:`hook`,moduleMap:t,nodeId:r}),Q(e,`to return an object`)),a={},o={},s=i.lifecycle;if(s!==void 0){let t=n(s,Q(e,"to expose `lifecycle` as an object"));for(let n of[`session`,`turn`]){let r=t[n];r!==void 0&&(a[n]=l(r,Q(e,`to provide a function for "lifecycle.${n}"`)))}}let c=i.events;if(c!==void 0){let t=n(c,Q(e,"to expose `events` as an object"));for(let[n,r]of Object.entries(t))r!==void 0&&(o[n]=l(r,Q(e,`to provide a function for "events.${n}"`)))}return{events:o,exportName:e.exportName,lifecycle:a,logicalPath:e.logicalPath,slug:e.slug,sourceId:e.sourceId,sourceKind:`module`}}catch(t){throw t instanceof X?t:new X(`Failed to attach hook handlers from "${e.logicalPath}": ${m(t)}`,{logicalPath:e.logicalPath,sourceId:e.sourceId})}}function Q(e,t){return`Expected the hook export "${e.exportName??`default`}" from "${e.logicalPath}" ${t}.`}var El=class e extends Error{backendName;templateKey;constructor(e){super(`Sandbox template "${e.templateKey}" is not provisioned for backend "${e.backendName}". Run \`ash build\` or invoke \`prewarmAppSandboxes()\` before serving traffic.`),this.name=`SandboxTemplateNotProvisionedError`,this.backendName=e.backendName,this.templateKey=e.templateKey}static is(t){return t instanceof e}};async function Dl(e){let t=[];for await(let n of e)t.push(n);return Buffer.concat(t)}function Ol(e){return new ReadableStream({start(t){t.enqueue(e),t.close()}})}function $(e){return{id:e.id,async readFile(t){return await e.readFile(e.resolvePath(t))},async readBinaryFile(t){let n=await e.readFile(e.resolvePath(t));return n===null?null:await Dl(n)},async readTextFile(t,n){kl(n);let r=await e.readFile(e.resolvePath(t));return r===null?null:jl(Ml(await Dl(r),n?.encoding??`utf-8`),n)},resolvePath(t){return e.resolvePath(t)},async runCommand(t,n){return await e.runCommand(t,n)},async writeFile(t,n){await e.writeFile(e.resolvePath(t),n)},async writeBinaryFile(t,n){await e.writeFile(e.resolvePath(t),Ol(n))},async writeTextFile(t,n,r){let i=Nl(n,r?.encoding??`utf-8`);await e.writeFile(e.resolvePath(t),Ol(i))}}}function kl(e){if(e===void 0)return;let{startLine:t,endLine:n}=e;if(t!==void 0&&(!Number.isInteger(t)||t<1))throw Error(`startLine must be a positive integer (1-based).`);if(n!==void 0&&(!Number.isInteger(n)||n<1))throw Error(`endLine must be a positive integer (1-based).`);if(t!==void 0&&n!==void 0&&t>n)throw Error(`startLine must not be greater than endLine.`)}function Al(e){let t=[],n=0;for(let r=0;r<e.length;r++)e[r]===`\r`?r+1<e.length&&e[r+1]===`
|
|
87
87
|
`?(t.push(e.slice(n,r+2)),n=r+2,r++):(t.push(e.slice(n,r+1)),n=r+1):e[r]===`
|
|
88
|
-
`&&(t.push(e.slice(n,r+1)),n=r+1);return n<e.length&&t.push(e.slice(n)),t}function kl(e,t){if(t?.startLine===void 0&&t?.endLine===void 0)return e;let n=Ol(e),r=n.length,i=t?.startLine??1,a=Math.min(t?.endLine??r,r);return i>r?``:n.slice(i-1,a).join(``)}function Al(e,t){return t===`utf-8`||t===`utf8`?new TextDecoder(`utf-8`,{fatal:!0}).decode(e):e.toString(t)}function jl(e,t){return t===`utf-8`||t===`utf8`?Buffer.from(new TextEncoder().encode(e)):Buffer.from(e,t)}function Ml(){return{name:`local`,async prewarm(e){let t=Rl(ld(e.runtimeContext.appRoot),e.templateKey);if(await Kl(t))return;let n=await Nl({sessionKey:e.templateKey,snapshotPath:t}),r=$(Fl(n));try{e.bootstrap!==void 0&&await e.bootstrap({use:async()=>r});for(let t of e.seedFiles)typeof t.content==`string`?await r.writeTextFile(t.path,t.content):await r.writeBinaryFile(t.path,t.content);if(await n.captureSnapshot()===null)throw Error(`Failed to capture local sandbox template state for "${e.templateKey}".`)}finally{await n.dispose()}},async create(e){let t=ld(e.runtimeContext.appRoot),n=await Wl(Rl(t,e.templateKey));if(n===null)throw new wl({backendName:`local`,templateKey:e.templateKey});let r=ql(e.existingMetadata)??zl(t,e.sessionKey);return await Kl(r)||await Gl(r,n),Pl(await Nl({sessionKey:e.sessionKey,snapshotPath:r}))}}}async function Nl(e){let{Bash:t,InMemoryFs:n}=await import(`#compiled/just-bash/index.js`),r=await Wl(e.snapshotPath),i=new n(Bl(r));await Vl(i),await Hl(i,r?.entries??[]);let a=new t({cwd:G,env:r?.env,fs:i,network:{dangerouslyAllowFullInternetAccess:!0}});return{async captureSnapshot(){let t=await Ul({filesystem:i,sandbox:a});return await Gl(e.snapshotPath,t),{snapshotPath:e.snapshotPath}},async dispose(){await a.dispose?.()},async executeCommand(e,t){if(t?.abortSignal?.aborted)throw new DOMException(`The operation was aborted.`,`AbortError`);let n=t?.workingDirectory===void 0?e:`( cd ${Y(t.workingDirectory)} && ${e} )`,r=a.exec(n),i=t?.abortSignal?await Il(r,t.abortSignal):await r;return{exitCode:i.exitCode,stderr:i.stderr,stdout:i.stdout}},async readFileBytes(e){let t;try{t=await i.readFileBuffer(e)}catch{return null}return Buffer.from(t)},async readFileText(e){let t;try{t=await i.readFileBuffer(e)}catch{return null}return new TextDecoder(`utf-8`,{fatal:!0}).decode(t)},sessionKey:e.sessionKey,snapshotPath:e.snapshotPath,async writeFiles(e){for(let t of e){let e=x(t.path);await i.mkdir(e,{recursive:!0}),await i.writeFile(t.path,t.content)}}}}function Pl(e){let t=$(Fl(e));return{session:t,useSessionFn:async()=>t,async captureState(){return{backendName:`local`,metadata:await e.captureSnapshot()??{},sessionKey:e.sessionKey}},async dispose(){await e.dispose()}}}function Fl(e){return{id:e.sessionKey,async readFile(t){let n=await e.readFileBytes(t);return n===null?null:El(n)},resolvePath:Ll,runCommand:(t,n)=>e.executeCommand(t,n),async writeFile(t,n){let r=await Tl(n);await e.writeFiles([{path:t,content:r}])}}}async function Il(e,t){return await new Promise((n,r)=>{let i=()=>{r(new DOMException(`The operation was aborted.`,`AbortError`))};if(t.aborted){i();return}t.addEventListener(`abort`,i,{once:!0}),e.then(e=>{t.removeEventListener(`abort`,i),n(e)},e=>{t.removeEventListener(`abort`,i),r(e)})})}function Ll(e){return e.startsWith(`/`)?e:`${G}/${e}`}function Rl(e,t){return S(e,`local`,`templates`,`${t}.json`)}function zl(e,t){return S(e,`local`,`sessions`,`${t}.json`)}function Bl(e){let t={};for(let n of e?.entries??[])n.kind===`file`&&(t[n.path]=Buffer.from(n.contentBase64,`base64`));return t}async function Vl(e){await e.mkdir(G,{recursive:!0})}async function Hl(e,t){let n=t.filter(e=>e.kind===`directory`).map(e=>e.path).sort((e,t)=>e.localeCompare(t));for(let t of n)t!==`/workspace`&&await e.mkdir(t,{recursive:!0})}async function Ul(e){let t=[],n=e.filesystem.getAllPaths().sort((e,t)=>e.localeCompare(t));for(let r of n){let n=await e.filesystem.stat(r);if(n.isSymbolicLink)continue;if(n.isDirectory){t.push({kind:`directory`,path:r});continue}if(!n.isFile)continue;let i=await e.filesystem.readFileBuffer(r);t.push({contentBase64:Buffer.from(i).toString(`base64`),kind:`file`,path:r})}return{entries:t,env:{...e.sandbox.getEnv()},version:1}}async function Wl(e){if(!await Kl(e))return null;let t=JSON.parse(await ge(e,`utf8`));return t.version===1?t:null}async function Gl(e,t){await w(x(e),{recursive:!0}),await T(e,`${JSON.stringify(t,null,2)}\n`)}async function Kl(e){try{return await me(e),!0}catch{return!1}}function ql(e){let t=e?.snapshotPath;return typeof t==`string`?t:void 0}function Jl(){return Ml()}function Yl(e={}){let t=e.loadSandboxModule??(async()=>await import(`#compiled/@vercel/sandbox/index.js`)),n={timeout:pu},r=new Map;return{name:`vercel`,async create(e){let i=lu(n.tags,e.tags),a;try{a=await Xl({loadSandboxModule:t,prewarmedTemplates:r,templateKey:e.templateKey})}catch(t){throw wl.is(t)?t:Error(`Failed to read sandbox template "${e.templateKey}": ${fu(t)}`,{cause:t})}let o;try{o=await Ql({createOptions:n,existingMetadata:e.existingMetadata,sandboxModule:await t(),sessionKey:e.sessionKey,snapshotId:a.snapshotId,tags:i})}catch(t){throw Error(`Failed to create sandbox session "${e.sessionKey}": ${fu(t)}`,{cause:t})}return $l(o,e.sessionKey)},async prewarm(e){let i;try{i=await Zl({bootstrap:e.bootstrap,createOptions:n,loadSandboxModule:t,seedFiles:e.seedFiles,templateKey:e.templateKey})}catch(t){throw Error(`Failed to prewarm Vercel sandbox template "${e.templateKey}": ${fu(t)}. Run \`vercel login\` and \`vercel link\` so the SDK can authenticate, or set VERCEL_TOKEN.`,{cause:t})}r.set(e.templateKey,i)}}}async function Xl(e){let t=e.prewarmedTemplates.get(e.templateKey);if(t!==void 0)return t;let n=await ou(await e.loadSandboxModule(),e.templateKey);if(n===null||typeof n.currentSnapshotId!=`string`)throw new wl({backendName:`vercel`,templateKey:e.templateKey});return{sandboxName:n.name,snapshotId:n.currentSnapshotId,templateKey:e.templateKey}}async function Zl(e){let t=await e.loadSandboxModule(),n=await ou(t,e.templateKey),r=lu(e.createOptions.tags,e.tags);if(n===null){let i={...e.createOptions,name:e.templateKey,persistent:!1};r!==void 0&&(i.tags=r),n=await t.Sandbox.create(i)}else await uu(n,r);if(typeof n.currentSnapshotId==`string`&&n.currentSnapshotId.length>0)return{sandboxName:n.name,snapshotId:n.currentSnapshotId,templateKey:e.templateKey};await ru(n,e.createOptions);let i=$(tu(n,e.templateKey));e.bootstrap!==void 0&&await e.bootstrap({use:async()=>i});for(let t of e.seedFiles)typeof t.content==`string`?await i.writeTextFile(t.path,t.content):await i.writeBinaryFile(t.path,t.content);let a=await n.snapshot();return{sandboxName:n.name,snapshotId:a.snapshotId,templateKey:e.templateKey}}async function Ql(e){let t=cu(e.existingMetadata)??e.sessionKey,n=await ou(e.sandboxModule,t);if(n!==null)return await uu(n,e.tags),n;let r={...e.createOptions,name:t,persistent:!0,source:{snapshotId:e.snapshotId,type:`snapshot`}};return e.tags!==void 0&&(r.tags=e.tags),await e.sandboxModule.Sandbox.create(r)}function $l(e,t){return{session:$(tu(e,t)),useSessionFn:async n=>(n!==void 0&&await e.update(n),eu(e,t)),async captureState(){return{backendName:`vercel`,metadata:{sandboxName:e.name},sessionKey:t}},async dispose(){}}}function eu(e,t){return{...$(tu(e,t)),get name(){return e.name},get persistent(){return e.persistent},get status(){return e.status},get networkPolicy(){return e.networkPolicy},get tags(){return e.tags},async update(t){await e.update(t)},async stop(t){await e.stop(t)},async snapshot(t){return await e.snapshot(t)},domain(t){return e.domain(t)}}}function tu(e,t){return{id:t,async readFile(t){return await e.readFile({path:t})??null},resolvePath:nu,async runCommand(t,n){let r=await e.runCommand({args:[`-lc`,t],cmd:`bash`,cwd:n?.workingDirectory??`/workspace`,signal:n?.abortSignal}),[i,a]=await Promise.all([r.stdout(),r.stderr()]);return{exitCode:r.exitCode,stderr:a,stdout:i}},async writeFile(t,n){let r=await Tl(n);await e.writeFiles([{content:r,path:t}])}}}function nu(e){return e.startsWith(`/`)?e:`${G}/${e}`}async function ru(e,t){await iu(e,{failureMessage:`Failed to initialize Vercel sandbox workspace.`,script:`mkdir -p ${G} && chown ${au}:${au} ${G}`}),t.networkPolicy!==`deny-all`&&await iu(e,{failureMessage:`Failed to install ripgrep in Vercel sandbox.`,script:`command -v rg >/dev/null 2>&1 || { dnf install -y spal-release && dnf install -y ripgrep; }`})}async function iu(e,t){let n=await e.runCommand({args:[`-lc`,t.script],cmd:`bash`,sudo:!0});if(n.exitCode!==0){let e=await n.stderr();throw Error(`${t.failureMessage} ${e}`.trim())}}const au=`vercel-sandbox`;async function ou(e,t){try{return await e.Sandbox.get({name:t})}catch(e){if(su(e))return null;throw Error(`Failed to look up Vercel sandbox "${t}": ${fu(e)}`,{cause:e})}}function su(e){return e instanceof Error?(e.response?.status??e.cause?.response?.status)===404:!1}function cu(e){let t=e?.sandboxName;return typeof t==`string`?t:void 0}function lu(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>mu)throw Error(`Vercel Sandbox supports at most ${mu} tags. Ash reserves "agent", "channel", and "sessionId"; remove or consolidate custom tags passed to vercelBackend().`);return n}}async function uu(e,t){t===void 0||du(e.tags,t)||await e.update({tags:t})}function du(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):!1}function fu(e){return e instanceof Error?e.message:String(e)}const pu=1800*1e3,mu=5;function hu(){return Yl()}function gu(){let e;function t(){return e===void 0&&(e=process.env.VERCEL?hu():Jl()),e}return{get name(){return t().name},create(e){return t().create(e)},async prewarm(e){await t().prewarm(e)}}}async function _u(e,t,r){try{let i=n(await Z({definition:e,kindLabel:`sandbox`,moduleMap:t,nodeId:r}),`Expected the sandbox export "${e.exportName??`default`}" from "${e.logicalPath}" to return an object.`);return{backend:vu(i.backend,e.logicalPath),bootstrap:i.bootstrap,description:e.description,exportName:e.exportName,logicalPath:e.logicalPath,onSession:i.onSession,sourceId:e.sourceId,sourceKind:`module`}}catch(t){throw t instanceof X?t:new X(`Failed to attach the sandbox lifecycle handlers from "${e.logicalPath}": ${m(t)}`,{logicalPath:e.logicalPath,sourceId:e.sourceId})}}function vu(e,t){if(e===void 0)return gu();if(typeof e!=`object`||!e)throw new X(`Sandbox "${t}" exposed a non-object "backend" field. Use vercelBackend(), localBackend(), or another factory that returns a SandboxBackend value.`,{logicalPath:t});let n=e;if(typeof n.name!=`string`||n.name.length===0)throw new X(`Sandbox "${t}" backend is missing a non-empty string "name" identifier.`,{logicalPath:t});if(typeof n.create!=`function`)throw new X(`Sandbox "${t}" backend is missing a "create" function.`,{logicalPath:t});return n}async function yu(e,t,r){try{let i=n(await Z({definition:e,kindLabel:`tool`,moduleMap:t,nodeId:r}),Su(e,`to return an object`)),a=l(i.execute,Su(e,`to provide an execute function`));return{description:e.description,execute:a,exportName:e.exportName,inputSchema:e.inputSchema,logicalPath:e.logicalPath,name:e.name,sourceId:e.sourceId,sourceKind:`module`,...bu(i,e)}}catch(t){throw t instanceof X?t:new X(`Failed to attach the tool execute function from "${e.logicalPath}": ${m(t)}`,{logicalPath:e.logicalPath,sourceId:e.sourceId})}}function bu(e,t){let n={};e.onCompact!==void 0&&(n.onCompact=l(e.onCompact,Su(t,`to provide an onCompact function`))),e.needsApproval!==void 0&&(n.needsApproval=l(e.needsApproval,Su(t,`to provide a needsApproval function`)));let r=xu(e,t);return r!==void 0&&(n.retentionPolicy=r),e.inputSchema!==void 0&&Cu(e.inputSchema)&&(n.inputStandardSchema=e.inputSchema),n}function xu(e,t){let n=e.retentionPolicy;if(n!==void 0){if(n===`auto`||n===`keep`||typeof n==`function`)return n;throw new X(Su(t,`to set retentionPolicy to "auto", "keep", or a function`),{logicalPath:t.logicalPath,sourceId:t.sourceId})}}function Su(e,t){return`Expected the tool export "${e.exportName??`default`}" from "${e.logicalPath}" ${t}.`}function Cu(e){return typeof e==`object`&&!!e&&`~standard`in e&&typeof e[`~standard`]==`object`}async function wu(e){let t=e.manifest.skills.map(e=>({...e,metadata:e.metadata===void 0?void 0:{...e.metadata}})),n=[],r=[];for(let t of e.manifest.channels){if(t.kind===`disabled`){r.push(t.name);continue}n.push(await xl(t,e.moduleMap,e.nodeId))}let i=await Promise.all(e.manifest.tools.map(t=>yu(t,e.moduleMap,e.nodeId))),a=await Promise.all(e.manifest.hooks.map(t=>Cl(t,e.moduleMap,e.nodeId))),o=await Promise.all(e.manifest.connections.map(t=>Sl(t,e.moduleMap,e.nodeId))),s=e.manifest.sandbox===null?null:await _u(e.manifest.sandbox,e.moduleMap,e.nodeId),c=Tu(e.manifest.instructions),l=e.manifest.workspaceResourceRoot,u={channels:n,config:Eu(e.manifest),connections:o,disabledFrameworkChannels:r,disabledFrameworkTools:[...e.manifest.disabledFrameworkTools],hooks:a,metadata:{agentRoot:e.manifest.agentRoot,appRoot:e.manifest.appRoot,diagnosticsSummary:e.manifest.diagnosticsSummary},sandbox:s,workspaceResourceRoot:l,skills:t,tools:i,workspaceSpec:{rootEntries:[...l.rootEntries]}};return c===void 0?u:{...u,instructions:c}}function Tu(e){if(e!==void 0)return{name:e.name,logicalPath:e.logicalPath,markdown:e.markdown,sourceId:e.sourceId,sourceKind:e.sourceKind}}function Eu(e){let t={metadata:{...e.config.metadata},model:e.config.model.source===void 0?{id:e.config.model.id,contextWindowTokens:e.config.model.contextWindowTokens,providerOptions:e.config.model.providerOptions}:{contextWindowTokens:e.config.model.contextWindowTokens,id:e.config.model.id,providerOptions:e.config.model.providerOptions,source:{exportName:e.config.model.source.exportName,sourceKind:`module`,logicalPath:e.config.model.source.logicalPath,sourceId:e.config.model.source.sourceId}},name:e.config.name};if(e.config.compaction!==void 0){let n={};e.config.compaction.model!==void 0&&(n.model=e.config.compaction.model.source===void 0?{contextWindowTokens:e.config.compaction.model.contextWindowTokens,id:e.config.compaction.model.id,providerOptions:e.config.compaction.model.providerOptions}:{contextWindowTokens:e.config.compaction.model.contextWindowTokens,id:e.config.compaction.model.id,providerOptions:e.config.compaction.model.providerOptions,source:{exportName:e.config.compaction.model.source.exportName,sourceKind:`module`,logicalPath:e.config.compaction.model.source.logicalPath,sourceId:e.config.compaction.model.source.sourceId}}),e.config.compaction.thresholdPercent!==void 0&&(n.thresholdPercent=e.config.compaction.thresholdPercent),t.compaction=n}return e.config.source!==void 0&&(t.source=bl(e.config.source)),t}function Du(e){return{sandbox:{definition:e.authoredSandbox??Ou(),workspaceResourceRoot:e.workspaceResourceRoot}}}function Ou(){return{backend:gu(),logicalPath:`ash:framework/default-sandbox`,sourceId:`ash:default-sandbox`,sourceKind:`module`}}const ku=`load_skill`,Au=Object.freeze({type:`object`,properties:Object.freeze({message:Object.freeze({type:`string`,description:`The message to send to the subagent. Provide all context the subagent needs to complete the task; the subagent does not see the parent's history.`})}),required:Object.freeze([`message`]),additionalProperties:!1});function ju(e){let t=[],n=new Aa(`subagent`,e.reservedToolNames??[]),r=new Map;for(let i of e.subagents){let e={logicalPath:i.logicalPath,sourceId:i.sourceId};if(r.has(i.nodeId))throw new H(`subagent`,`Found multiple runtime subagents mapped to node id "${i.nodeId}".`,{...e,entryName:i.name});let a=Mu(i),o={definition:i,prepared:a};n.register(i.name,o,{location:e,duplicateMessage:`Found multiple subagents named "${i.name}". Subagent names must be unique at runtime.`,reservedMessage:`Subagent "${i.name}" collides with another runtime-visible tool name.`}),t.push(a),r.set(i.nodeId,o)}return{preparedTools:t,subagentsByName:n.asMap(),subagentsByNodeId:r}}function Mu(e){return{description:e.description,inputSchema:Au,kind:`subagent`,logicalPath:e.logicalPath,name:e.name,nodeId:e.nodeId,sourceId:e.sourceId}}async function Nu(e,t={}){let n=[],r=new Aa(`tool`,t.reservedToolNames??[]);for(let t of e.tools){let e=await Pu(t);r.register(t.name,{definition:t,prepared:e},{location:{logicalPath:t.logicalPath,sourceId:t.sourceId},duplicateMessage:`Found multiple authored tools named "${t.name}". Tool names must be unique at runtime.`,reservedMessage:`Tool "${t.name}" collides with another runtime-visible tool name.`}),n.push(e)}return{preparedTools:n,toolsByName:r.asMap()}}async function Pu(e){return{description:e.description,inputSchema:await Fu(e),kind:`authored-tool`,logicalPath:e.logicalPath,name:e.name,sourceId:e.sourceId}}async function Fu(e){return e.inputSchema}var Iu=class extends Error{logicalPath;nodeId;sourceId;constructor(e,t={}){super(e),this.name=`ResolveRuntimeAgentGraphError`,t.logicalPath!==void 0&&(this.logicalPath=t.logicalPath),t.nodeId!==void 0&&(this.nodeId=t.nodeId),t.sourceId!==void 0&&(this.sourceId=t.sourceId)}};async function Lu(e){let t=new Map,n=Vu(e.manifest),r=new Map(e.manifest.subagents.map(e=>[e.nodeId,e]));return{nodesByNodeId:t,root:await Ru({childNodeIdsByParentNodeId:n,manifest:e.manifest,moduleMap:e.moduleMap,nodeId:L,nodesByNodeId:t,subagentNodesById:r})}}async function Ru(e){let t=Hu(e.nodeId);if(e.nodesByNodeId.has(t))throw new Iu(`Found multiple runtime agent nodes for node id "${t}".`,{nodeId:t,sourceId:e.sourceId});let n=await wu({manifest:e.manifest,moduleMap:e.moduleMap,nodeId:e.nodeId}),r=n.connections.length>0,i=_l({hasConnections:r}),a=r?Wu(i,n.connections):i,o=new Set(a.map(e=>e.name)),s=vl(),c=new Set(n.tools.map(e=>e.name));for(let r of n.disabledFrameworkTools)if(!s.has(r))throw new Iu(`agent/tools/${r}.ts exports disableTool() but "${r}" is not a framework tool. Rename the file to one of: ${[...s].sort().join(`, `)}.`,{nodeId:t,sourceId:e.sourceId});let l=new Set(n.disabledFrameworkTools),u=await Nu({tools:[...a.filter(e=>!c.has(e.name)&&!l.has(e.name)),...n.tools]},{reservedToolNames:o.has(`load_skill`)||c.has(`load_skill`)?[]:[ku]}),d=new Set(n.channels.map(e=>e.name)),f=$s();for(let r of n.disabledFrameworkChannels)if(!f.has(r))throw new Iu(`agent/channels/${r}.ts exports disableRoute() but "${r}" is not a framework channel. Rename the file to one of: ${[...f].sort().join(`, `)}.`,{nodeId:t,sourceId:e.sourceId});let p=new Set(n.disabledFrameworkChannels),m=[...Qs().filter(e=>!d.has(e.name)&&!p.has(e.name)),...n.channels],h=Du({authoredSandbox:n.sandbox,workspaceResourceRoot:n.workspaceResourceRoot}),g=ju({reservedToolNames:[ku,...u.preparedTools.map(e=>e.name)],subagents:await zu({childNodeIdsByParentNodeId:e.childNodeIdsByParentNodeId,moduleMap:e.moduleMap,nodesByNodeId:e.nodesByNodeId,parentNodeId:e.nodeId,subagentNodesById:e.subagentNodesById})}),_={agent:n,channels:m,hookRegistry:yl(n.hooks),nodeId:t,sandboxRegistry:h,sourceId:e.sourceId,subagentRegistry:g,toolRegistry:u,turnAgent:Ko({agent:n,nodeId:t,tools:[...u.preparedTools,...g.preparedTools]})};return e.nodesByNodeId.set(t,_),_}async function zu(e){let t=[],n=e.childNodeIdsByParentNodeId.get(e.parentNodeId)??[];for(let r of n){let n=e.subagentNodesById.get(r);if(n===void 0)throw new Iu(`Missing compiled subagent node "${r}" while resolving runtime subagents.`,{nodeId:Hu(e.parentNodeId),sourceId:r});t.push(await Bu({childNodeIdsByParentNodeId:e.childNodeIdsByParentNodeId,moduleMap:e.moduleMap,nodesByNodeId:e.nodesByNodeId,sourceRef:n,subagentNodesById:e.subagentNodesById}))}return t}async function Bu(e){let t={description:e.sourceRef.description,logicalPath:e.sourceRef.logicalPath,name:e.sourceRef.name,nodeId:Hu(e.sourceRef.nodeId),sourceId:e.sourceRef.sourceId,sourceKind:`module`};return await Ru({childNodeIdsByParentNodeId:e.childNodeIdsByParentNodeId,manifest:e.sourceRef.agent,moduleMap:e.moduleMap,nodeId:e.sourceRef.nodeId,nodesByNodeId:e.nodesByNodeId,sourceId:e.sourceRef.sourceId,subagentNodesById:e.subagentNodesById}),t}function Vu(e){let t=new Map;for(let n of e.subagentEdges){let e=t.get(n.parentNodeId);if(e===void 0){t.set(n.parentNodeId,[n.childNodeId]);continue}e.push(n.childNodeId)}return t}function Hu(e){return e===`__root__`?ao:e}const Uu=No.name;function Wu(e,t){let n=t.map(e=>e.connectionName).join(`, `);return e.map(e=>e.name===Uu?{...e,description:`${e.description} Available connections: ${n}.`}:e)}const Gu=process.env.ASH_DISABLE_AGENT_CACHE===`1`;async function Ku(e){let[t,n]=await Promise.all([lo({compiledArtifactsSource:e}),qu(e)]),r=await Lu({manifest:t,moduleMap:n}),i=r.root;return{adapterRegistry:Pa({channels:Qu(r)}),compiledArtifactsSource:e,graph:r,hookRegistry:i.hookRegistry,moduleMap:n,resolvedAgent:i.agent,subagentRegistry:i.subagentRegistry,toolRegistry:i.toolRegistry,turnAgent:i.turnAgent}}async function qu(e){return e.kind===`disk`&&e.moduleMapLoadMode===`authored-source`?await Ju(e):await ho({compiledArtifactsSource:e})}async function Ju(e){if(e.moduleMapLoaderPath===void 0)throw Error(`Authored-source module map loading requires "moduleMapLoaderPath" in the compiled artifacts source.`);return await(await import(xe(e.moduleMapLoaderPath).href)).loadCompiledModuleMapFromAuthoredSource({compiledArtifactsSource:e})}async function Yu(e){if(Gu)return Ku(e);let t=Ja(),n=Ba(e),r=await no(e),i=t.bundleCacheKeyBySourceKey.get(n);i!==void 0&&i!==r&&t.bundleCache.delete(i),t.bundleCacheKeyBySourceKey.set(n,r);let a=t.bundleCache.get(r);if(a!==void 0)return a;let o=Ku(e).catch(e=>{throw t.bundleCache.delete(r),t.bundleCacheKeyBySourceKey.get(n)===r&&t.bundleCacheKeyBySourceKey.delete(n),e});return t.bundleCache.set(r,o),o}async function Xu(e){let t=await Yu(e.compiledArtifactsSource);if(e.nodeId===void 0)return t;let n=oo(t.graph,e.nodeId);return{adapterRegistry:t.adapterRegistry,compiledArtifactsSource:t.compiledArtifactsSource,graph:{nodesByNodeId:t.graph.nodesByNodeId,root:n},hookRegistry:n.hookRegistry,moduleMap:t.moduleMap,nodeId:e.nodeId,resolvedAgent:n.agent,subagentRegistry:n.subagentRegistry,toolRegistry:n.toolRegistry,turnAgent:n.turnAgent}}function Zu(){let e=Ja();e.bundleCache.clear(),e.bundleCacheKeyBySourceKey.clear()}function Qu(e){let t=new Map;for(let n of e.nodesByNodeId.values())for(let e of n.channels)t.set(`${e.sourceId}:${e.name}`,e);return[...t.values()]}new B(`ash.channel`,{codec:{serialize(e){return{kind:ya(e),state:e.state?{...e.state}:{}}},deserialize(e,t){let n=t.get($u);if(n===void 0)throw Error(`Cannot deserialize "ash.channel" before "ash.bundle". The runtime bundle must be present in context.`);return Fa(n.adapterRegistry,e)}}});const $u=new B(`ash.bundle`,{codec:{serialize:e=>({nodeId:e.nodeId,source:e.compiledArtifactsSource}),deserialize:e=>{let{source:t,nodeId:n}=e;return Xu({compiledArtifactsSource:t,nodeId:n})}}});new B(`ash.session`);const ed=new B(`ash.sandbox`),td=v(),nd={workflowId:`workflow//${td.name}@${td.version}//workflowEntry`};function rd(e=process.cwd()){return C(e)}function id(e){return be(`sha256`).update(e).update(`\0`).update(nd.workflowId).digest(`hex`).slice(0,12)}function ad(){return!!process.env.VERCEL}function od(e,t=`all`){let n=S(e,`.ash`,`nitro`);return t===`all`?n:S(n,t)}function sd(e,t){return S(e,`.ash`,`nitro-output`,t)}function cd(e){return S(h(),`.ash`,`workflow-cache`,id(e))}function ld(e){return S(e,`.ash`,`sandbox-cache`)}function ud(e){return ad()?S(e,`.vercel`,`output`):S(e,`.output`)}function dd(e){return{appRoot:e,outputDir:ud(e),workflowId:nd.workflowId,workflowBuildDir:cd(e),workflowSourceDir:_(`src/execution`)}}export{Sr as C,jn as D,L as E,Dr as S,Cr as T,Ba as _,cd as a,Qr as b,$s as c,lo as d,ao as f,za as g,Ra as h,sd as i,Qs as l,U as m,rd as n,Zu as o,$a as p,od as r,Lu as s,dd as t,G as u,Qi as v,wr as w,kr as x,$i as y};
|
|
88
|
+
`&&(t.push(e.slice(n,r+1)),n=r+1);return n<e.length&&t.push(e.slice(n)),t}function jl(e,t){if(t?.startLine===void 0&&t?.endLine===void 0)return e;let n=Al(e),r=n.length,i=t?.startLine??1,a=Math.min(t?.endLine??r,r);return i>r?``:n.slice(i-1,a).join(``)}function Ml(e,t){return t===`utf-8`||t===`utf8`?new TextDecoder(`utf-8`,{fatal:!0}).decode(e):e.toString(t)}function Nl(e,t){return t===`utf-8`||t===`utf8`?Buffer.from(new TextEncoder().encode(e)):Buffer.from(e,t)}function Pl(){return{name:`local`,async prewarm(e){let t=Bl(dd(e.runtimeContext.appRoot),e.templateKey);if(await Jl(t))return;let n=await Fl({sessionKey:e.templateKey,snapshotPath:t}),r=$(Ll(n));try{e.bootstrap!==void 0&&await e.bootstrap({use:async()=>r});for(let t of e.seedFiles)typeof t.content==`string`?await r.writeTextFile(t.path,t.content):await r.writeBinaryFile(t.path,t.content);if(await n.captureSnapshot()===null)throw Error(`Failed to capture local sandbox template state for "${e.templateKey}".`)}finally{await n.dispose()}},async create(e){let t=dd(e.runtimeContext.appRoot),n=await Kl(Bl(t,e.templateKey));if(n===null)throw new El({backendName:`local`,templateKey:e.templateKey});let r=Yl(e.existingMetadata)??Vl(t,e.sessionKey);return await Jl(r)||await ql(r,n),Il(await Fl({sessionKey:e.sessionKey,snapshotPath:r}))}}}async function Fl(e){let{Bash:t,InMemoryFs:n}=await import(`#compiled/just-bash/index.js`),r=await Kl(e.snapshotPath),i=new n(Hl(r));await Ul(i),await Wl(i,r?.entries??[]);let a=new t({cwd:G,env:r?.env,fs:i,network:{dangerouslyAllowFullInternetAccess:!0}});return{async captureSnapshot(){let t=await Gl({filesystem:i,sandbox:a});return await ql(e.snapshotPath,t),{snapshotPath:e.snapshotPath}},async dispose(){await a.dispose?.()},async executeCommand(e,t){if(t?.abortSignal?.aborted)throw new DOMException(`The operation was aborted.`,`AbortError`);let n=t?.workingDirectory===void 0?e:`( cd ${Y(t.workingDirectory)} && ${e} )`,r=a.exec(n),i=t?.abortSignal?await Rl(r,t.abortSignal):await r;return{exitCode:i.exitCode,stderr:i.stderr,stdout:i.stdout}},async readFileBytes(e){let t;try{t=await i.readFileBuffer(e)}catch{return null}return Buffer.from(t)},async readFileText(e){let t;try{t=await i.readFileBuffer(e)}catch{return null}return new TextDecoder(`utf-8`,{fatal:!0}).decode(t)},sessionKey:e.sessionKey,snapshotPath:e.snapshotPath,async writeFiles(e){for(let t of e){let e=x(t.path);await i.mkdir(e,{recursive:!0}),await i.writeFile(t.path,t.content)}}}}function Il(e){let t=$(Ll(e));return{session:t,useSessionFn:async()=>t,async captureState(){return{backendName:`local`,metadata:await e.captureSnapshot()??{},sessionKey:e.sessionKey}},async dispose(){await e.dispose()}}}function Ll(e){return{id:e.sessionKey,async readFile(t){let n=await e.readFileBytes(t);return n===null?null:Ol(n)},resolvePath:zl,runCommand:(t,n)=>e.executeCommand(t,n),async writeFile(t,n){let r=await Dl(n);await e.writeFiles([{path:t,content:r}])}}}async function Rl(e,t){return await new Promise((n,r)=>{let i=()=>{r(new DOMException(`The operation was aborted.`,`AbortError`))};if(t.aborted){i();return}t.addEventListener(`abort`,i,{once:!0}),e.then(e=>{t.removeEventListener(`abort`,i),n(e)},e=>{t.removeEventListener(`abort`,i),r(e)})})}function zl(e){return e.startsWith(`/`)?e:`${G}/${e}`}function Bl(e,t){return S(e,`local`,`templates`,`${t}.json`)}function Vl(e,t){return S(e,`local`,`sessions`,`${t}.json`)}function Hl(e){let t={};for(let n of e?.entries??[])n.kind===`file`&&(t[n.path]=Buffer.from(n.contentBase64,`base64`));return t}async function Ul(e){await e.mkdir(G,{recursive:!0})}async function Wl(e,t){let n=t.filter(e=>e.kind===`directory`).map(e=>e.path).sort((e,t)=>e.localeCompare(t));for(let t of n)t!==`/workspace`&&await e.mkdir(t,{recursive:!0})}async function Gl(e){let t=[],n=e.filesystem.getAllPaths().sort((e,t)=>e.localeCompare(t));for(let r of n){let n=await e.filesystem.stat(r);if(n.isSymbolicLink)continue;if(n.isDirectory){t.push({kind:`directory`,path:r});continue}if(!n.isFile)continue;let i=await e.filesystem.readFileBuffer(r);t.push({contentBase64:Buffer.from(i).toString(`base64`),kind:`file`,path:r})}return{entries:t,env:{...e.sandbox.getEnv()},version:1}}async function Kl(e){if(!await Jl(e))return null;let t=JSON.parse(await ge(e,`utf8`));return t.version===1?t:null}async function ql(e,t){await w(x(e),{recursive:!0}),await T(e,`${JSON.stringify(t,null,2)}\n`)}async function Jl(e){try{return await me(e),!0}catch{return!1}}function Yl(e){let t=e?.snapshotPath;return typeof t==`string`?t:void 0}function Xl(){return Pl()}function Zl(e={}){let t=e.loadSandboxModule??(async()=>await import(`#compiled/@vercel/sandbox/index.js`)),n={timeout:hu},r=new Map;return{name:`vercel`,async create(e){let i=du(n.tags,e.tags),a;try{a=await Ql({loadSandboxModule:t,prewarmedTemplates:r,templateKey:e.templateKey})}catch(t){throw El.is(t)?t:Error(`Failed to read sandbox template "${e.templateKey}": ${mu(t)}`,{cause:t})}let o;try{o=await eu({createOptions:n,existingMetadata:e.existingMetadata,sandboxModule:await t(),sessionKey:e.sessionKey,snapshotId:a.snapshotId,tags:i})}catch(t){throw Error(`Failed to create sandbox session "${e.sessionKey}": ${mu(t)}`,{cause:t})}return tu(o,e.sessionKey)},async prewarm(e){let i;try{i=await $l({bootstrap:e.bootstrap,createOptions:n,loadSandboxModule:t,seedFiles:e.seedFiles,templateKey:e.templateKey})}catch(t){throw Error(`Failed to prewarm Vercel sandbox template "${e.templateKey}": ${mu(t)}. Run \`vercel login\` and \`vercel link\` so the SDK can authenticate, or set VERCEL_TOKEN.`,{cause:t})}r.set(e.templateKey,i)}}}async function Ql(e){let t=e.prewarmedTemplates.get(e.templateKey);if(t!==void 0)return t;let n=await cu(await e.loadSandboxModule(),e.templateKey);if(n===null||typeof n.currentSnapshotId!=`string`)throw new El({backendName:`vercel`,templateKey:e.templateKey});return{sandboxName:n.name,snapshotId:n.currentSnapshotId,templateKey:e.templateKey}}async function $l(e){let t=await e.loadSandboxModule(),n=await cu(t,e.templateKey),r=du(e.createOptions.tags,e.tags);if(n===null){let i={...e.createOptions,name:e.templateKey,persistent:!1};r!==void 0&&(i.tags=r),n=await t.Sandbox.create(i)}else await fu(n,r);if(typeof n.currentSnapshotId==`string`&&n.currentSnapshotId.length>0)return{sandboxName:n.name,snapshotId:n.currentSnapshotId,templateKey:e.templateKey};await au(n,e.createOptions);let i=$(ru(n,e.templateKey));e.bootstrap!==void 0&&await e.bootstrap({use:async()=>i});for(let t of e.seedFiles)typeof t.content==`string`?await i.writeTextFile(t.path,t.content):await i.writeBinaryFile(t.path,t.content);let a=await n.snapshot();return{sandboxName:n.name,snapshotId:a.snapshotId,templateKey:e.templateKey}}async function eu(e){let t=uu(e.existingMetadata)??e.sessionKey,n=await cu(e.sandboxModule,t);if(n!==null)return await fu(n,e.tags),n;let r={...e.createOptions,name:t,persistent:!0,source:{snapshotId:e.snapshotId,type:`snapshot`}};return e.tags!==void 0&&(r.tags=e.tags),await e.sandboxModule.Sandbox.create(r)}function tu(e,t){return{session:$(ru(e,t)),useSessionFn:async n=>(n!==void 0&&await e.update(n),nu(e,t)),async captureState(){return{backendName:`vercel`,metadata:{sandboxName:e.name},sessionKey:t}},async dispose(){}}}function nu(e,t){return{...$(ru(e,t)),get name(){return e.name},get persistent(){return e.persistent},get status(){return e.status},get networkPolicy(){return e.networkPolicy},get tags(){return e.tags},async update(t){await e.update(t)},async stop(t){await e.stop(t)},async snapshot(t){return await e.snapshot(t)},domain(t){return e.domain(t)}}}function ru(e,t){return{id:t,async readFile(t){return await e.readFile({path:t})??null},resolvePath:iu,async runCommand(t,n){let r=await e.runCommand({args:[`-lc`,t],cmd:`bash`,cwd:n?.workingDirectory??`/workspace`,signal:n?.abortSignal}),[i,a]=await Promise.all([r.stdout(),r.stderr()]);return{exitCode:r.exitCode,stderr:a,stdout:i}},async writeFile(t,n){let r=await Dl(n);await e.writeFiles([{content:r,path:t}])}}}function iu(e){return e.startsWith(`/`)?e:`${G}/${e}`}async function au(e,t){await ou(e,{failureMessage:`Failed to initialize Vercel sandbox workspace.`,script:`mkdir -p ${G} && chown ${su}:${su} ${G}`}),t.networkPolicy!==`deny-all`&&await ou(e,{failureMessage:`Failed to install ripgrep in Vercel sandbox.`,script:`command -v rg >/dev/null 2>&1 || { dnf install -y spal-release && dnf install -y ripgrep; }`})}async function ou(e,t){let n=await e.runCommand({args:[`-lc`,t.script],cmd:`bash`,sudo:!0});if(n.exitCode!==0){let e=await n.stderr();throw Error(`${t.failureMessage} ${e}`.trim())}}const su=`vercel-sandbox`;async function cu(e,t){try{return await e.Sandbox.get({name:t})}catch(e){if(lu(e))return null;throw Error(`Failed to look up Vercel sandbox "${t}": ${mu(e)}`,{cause:e})}}function lu(e){return e instanceof Error?(e.response?.status??e.cause?.response?.status)===404:!1}function uu(e){let t=e?.sandboxName;return typeof t==`string`?t:void 0}function du(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>gu)throw Error(`Vercel Sandbox supports at most ${gu} tags. Ash reserves "agent", "channel", and "sessionId"; remove or consolidate custom tags passed to vercelBackend().`);return n}}async function fu(e,t){t===void 0||pu(e.tags,t)||await e.update({tags:t})}function pu(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):!1}function mu(e){return e instanceof Error?e.message:String(e)}const hu=1800*1e3,gu=5;function _u(){return Zl()}function vu(){let e;function t(){return e===void 0&&(e=process.env.VERCEL?_u():Xl()),e}return{get name(){return t().name},create(e){return t().create(e)},async prewarm(e){await t().prewarm(e)}}}async function yu(e,t,r){try{let i=n(await Z({definition:e,kindLabel:`sandbox`,moduleMap:t,nodeId:r}),`Expected the sandbox export "${e.exportName??`default`}" from "${e.logicalPath}" to return an object.`);return{backend:bu(i.backend,e.logicalPath),bootstrap:i.bootstrap,description:e.description,exportName:e.exportName,logicalPath:e.logicalPath,onSession:i.onSession,sourceId:e.sourceId,sourceKind:`module`}}catch(t){throw t instanceof X?t:new X(`Failed to attach the sandbox lifecycle handlers from "${e.logicalPath}": ${m(t)}`,{logicalPath:e.logicalPath,sourceId:e.sourceId})}}function bu(e,t){if(e===void 0)return vu();if(typeof e!=`object`||!e)throw new X(`Sandbox "${t}" exposed a non-object "backend" field. Use vercelBackend(), localBackend(), or another factory that returns a SandboxBackend value.`,{logicalPath:t});let n=e;if(typeof n.name!=`string`||n.name.length===0)throw new X(`Sandbox "${t}" backend is missing a non-empty string "name" identifier.`,{logicalPath:t});if(typeof n.create!=`function`)throw new X(`Sandbox "${t}" backend is missing a "create" function.`,{logicalPath:t});return n}async function xu(e,t,r){try{let i=n(await Z({definition:e,kindLabel:`tool`,moduleMap:t,nodeId:r}),wu(e,`to return an object`)),a=l(i.execute,wu(e,`to provide an execute function`));return{description:e.description,execute:a,exportName:e.exportName,inputSchema:e.inputSchema,logicalPath:e.logicalPath,name:e.name,sourceId:e.sourceId,sourceKind:`module`,...Su(i,e)}}catch(t){throw t instanceof X?t:new X(`Failed to attach the tool execute function from "${e.logicalPath}": ${m(t)}`,{logicalPath:e.logicalPath,sourceId:e.sourceId})}}function Su(e,t){let n={};e.onCompact!==void 0&&(n.onCompact=l(e.onCompact,wu(t,`to provide an onCompact function`))),e.needsApproval!==void 0&&(n.needsApproval=l(e.needsApproval,wu(t,`to provide a needsApproval function`)));let r=Cu(e,t);return r!==void 0&&(n.retentionPolicy=r),e.inputSchema!==void 0&&Tu(e.inputSchema)&&(n.inputStandardSchema=e.inputSchema),n}function Cu(e,t){let n=e.retentionPolicy;if(n!==void 0){if(n===`auto`||n===`keep`||typeof n==`function`)return n;throw new X(wu(t,`to set retentionPolicy to "auto", "keep", or a function`),{logicalPath:t.logicalPath,sourceId:t.sourceId})}}function wu(e,t){return`Expected the tool export "${e.exportName??`default`}" from "${e.logicalPath}" ${t}.`}function Tu(e){return typeof e==`object`&&!!e&&`~standard`in e&&typeof e[`~standard`]==`object`}async function Eu(e){let t=e.manifest.skills.map(e=>({...e,metadata:e.metadata===void 0?void 0:{...e.metadata}})),n=[],r=[];for(let t of e.manifest.channels){if(t.kind===`disabled`){r.push(t.name);continue}n.push(await Cl(t,e.moduleMap,e.nodeId))}let i=await Promise.all(e.manifest.tools.map(t=>xu(t,e.moduleMap,e.nodeId))),a=await Promise.all(e.manifest.hooks.map(t=>Tl(t,e.moduleMap,e.nodeId))),o=await Promise.all(e.manifest.connections.map(t=>wl(t,e.moduleMap,e.nodeId))),s=e.manifest.sandbox===null?null:await yu(e.manifest.sandbox,e.moduleMap,e.nodeId),c=Du(e.manifest.instructions),l=e.manifest.workspaceResourceRoot,u={channels:n,config:Ou(e.manifest),connections:o,disabledFrameworkChannels:r,disabledFrameworkTools:[...e.manifest.disabledFrameworkTools],hooks:a,metadata:{agentRoot:e.manifest.agentRoot,appRoot:e.manifest.appRoot,diagnosticsSummary:e.manifest.diagnosticsSummary},sandbox:s,workspaceResourceRoot:l,skills:t,tools:i,workspaceSpec:{rootEntries:[...l.rootEntries]}};return c===void 0?u:{...u,instructions:c}}function Du(e){if(e!==void 0)return{name:e.name,logicalPath:e.logicalPath,markdown:e.markdown,sourceId:e.sourceId,sourceKind:e.sourceKind}}function Ou(e){let t={metadata:{...e.config.metadata},model:e.config.model.source===void 0?{id:e.config.model.id,contextWindowTokens:e.config.model.contextWindowTokens,providerOptions:e.config.model.providerOptions}:{contextWindowTokens:e.config.model.contextWindowTokens,id:e.config.model.id,providerOptions:e.config.model.providerOptions,source:{exportName:e.config.model.source.exportName,sourceKind:`module`,logicalPath:e.config.model.source.logicalPath,sourceId:e.config.model.source.sourceId}},name:e.config.name};if(e.config.compaction!==void 0){let n={};e.config.compaction.model!==void 0&&(n.model=e.config.compaction.model.source===void 0?{contextWindowTokens:e.config.compaction.model.contextWindowTokens,id:e.config.compaction.model.id,providerOptions:e.config.compaction.model.providerOptions}:{contextWindowTokens:e.config.compaction.model.contextWindowTokens,id:e.config.compaction.model.id,providerOptions:e.config.compaction.model.providerOptions,source:{exportName:e.config.compaction.model.source.exportName,sourceKind:`module`,logicalPath:e.config.compaction.model.source.logicalPath,sourceId:e.config.compaction.model.source.sourceId}}),e.config.compaction.thresholdPercent!==void 0&&(n.thresholdPercent=e.config.compaction.thresholdPercent),t.compaction=n}return e.config.source!==void 0&&(t.source=Sl(e.config.source)),t}function ku(e){return{sandbox:{definition:e.authoredSandbox??Au(),workspaceResourceRoot:e.workspaceResourceRoot}}}function Au(){return{backend:vu(),logicalPath:`ash:framework/default-sandbox`,sourceId:`ash:default-sandbox`,sourceKind:`module`}}const ju=`load_skill`,Mu=Object.freeze({type:`object`,properties:Object.freeze({message:Object.freeze({type:`string`,description:`The message to send to the subagent. Provide all context the subagent needs to complete the task; the subagent does not see the parent's history.`})}),required:Object.freeze([`message`]),additionalProperties:!1});function Nu(e){let t=[],n=new Ma(`subagent`,e.reservedToolNames??[]),r=new Map;for(let i of e.subagents){let e={logicalPath:i.logicalPath,sourceId:i.sourceId};if(r.has(i.nodeId))throw new H(`subagent`,`Found multiple runtime subagents mapped to node id "${i.nodeId}".`,{...e,entryName:i.name});let a=Pu(i),o={definition:i,prepared:a};n.register(i.name,o,{location:e,duplicateMessage:`Found multiple subagents named "${i.name}". Subagent names must be unique at runtime.`,reservedMessage:`Subagent "${i.name}" collides with another runtime-visible tool name.`}),t.push(a),r.set(i.nodeId,o)}return{preparedTools:t,subagentsByName:n.asMap(),subagentsByNodeId:r}}function Pu(e){return{description:e.description,inputSchema:Mu,kind:`subagent`,logicalPath:e.logicalPath,name:e.name,nodeId:e.nodeId,sourceId:e.sourceId}}async function Fu(e,t={}){let n=[],r=new Ma(`tool`,t.reservedToolNames??[]);for(let t of e.tools){let e=await Iu(t);r.register(t.name,{definition:t,prepared:e},{location:{logicalPath:t.logicalPath,sourceId:t.sourceId},duplicateMessage:`Found multiple authored tools named "${t.name}". Tool names must be unique at runtime.`,reservedMessage:`Tool "${t.name}" collides with another runtime-visible tool name.`}),n.push(e)}return{preparedTools:n,toolsByName:r.asMap()}}async function Iu(e){return{description:e.description,inputSchema:await Lu(e),kind:`authored-tool`,logicalPath:e.logicalPath,name:e.name,sourceId:e.sourceId}}async function Lu(e){return e.inputSchema}var Ru=class extends Error{logicalPath;nodeId;sourceId;constructor(e,t={}){super(e),this.name=`ResolveRuntimeAgentGraphError`,t.logicalPath!==void 0&&(this.logicalPath=t.logicalPath),t.nodeId!==void 0&&(this.nodeId=t.nodeId),t.sourceId!==void 0&&(this.sourceId=t.sourceId)}};async function zu(e){let t=new Map,n=Uu(e.manifest),r=new Map(e.manifest.subagents.map(e=>[e.nodeId,e]));return{nodesByNodeId:t,root:await Bu({childNodeIdsByParentNodeId:n,manifest:e.manifest,moduleMap:e.moduleMap,nodeId:L,nodesByNodeId:t,subagentNodesById:r})}}async function Bu(e){let t=Wu(e.nodeId);if(e.nodesByNodeId.has(t))throw new Ru(`Found multiple runtime agent nodes for node id "${t}".`,{nodeId:t,sourceId:e.sourceId});let n=await Eu({manifest:e.manifest,moduleMap:e.moduleMap,nodeId:e.nodeId}),r=n.connections.length>0,i=yl({hasConnections:r}),a=r?Ku(i,n.connections):i,o=new Set(a.map(e=>e.name)),s=bl(),c=new Set(n.tools.map(e=>e.name));for(let r of n.disabledFrameworkTools)if(!s.has(r))throw new Ru(`agent/tools/${r}.ts exports disableTool() but "${r}" is not a framework tool. Rename the file to one of: ${[...s].sort().join(`, `)}.`,{nodeId:t,sourceId:e.sourceId});let l=new Set(n.disabledFrameworkTools),u=await Fu({tools:[...a.filter(e=>!c.has(e.name)&&!l.has(e.name)),...n.tools]},{reservedToolNames:o.has(`load_skill`)||c.has(`load_skill`)?[]:[ju]}),d=new Set(n.channels.map(e=>e.name)),f=tc();for(let r of n.disabledFrameworkChannels)if(!f.has(r))throw new Ru(`agent/channels/${r}.ts exports disableRoute() but "${r}" is not a framework channel. Rename the file to one of: ${[...f].sort().join(`, `)}.`,{nodeId:t,sourceId:e.sourceId});let p=new Set(n.disabledFrameworkChannels),m=[...ec().filter(e=>!d.has(e.name)&&!p.has(e.name)),...n.channels],h=ku({authoredSandbox:n.sandbox,workspaceResourceRoot:n.workspaceResourceRoot}),g=Nu({reservedToolNames:[ju,...u.preparedTools.map(e=>e.name)],subagents:await Vu({childNodeIdsByParentNodeId:e.childNodeIdsByParentNodeId,moduleMap:e.moduleMap,nodesByNodeId:e.nodesByNodeId,parentNodeId:e.nodeId,subagentNodesById:e.subagentNodesById})}),_={agent:n,channels:m,hookRegistry:xl(n.hooks),nodeId:t,sandboxRegistry:h,sourceId:e.sourceId,subagentRegistry:g,toolRegistry:u,turnAgent:Jo({agent:n,nodeId:t,tools:[...u.preparedTools,...g.preparedTools]})};return e.nodesByNodeId.set(t,_),_}async function Vu(e){let t=[],n=e.childNodeIdsByParentNodeId.get(e.parentNodeId)??[];for(let r of n){let n=e.subagentNodesById.get(r);if(n===void 0)throw new Ru(`Missing compiled subagent node "${r}" while resolving runtime subagents.`,{nodeId:Wu(e.parentNodeId),sourceId:r});t.push(await Hu({childNodeIdsByParentNodeId:e.childNodeIdsByParentNodeId,moduleMap:e.moduleMap,nodesByNodeId:e.nodesByNodeId,sourceRef:n,subagentNodesById:e.subagentNodesById}))}return t}async function Hu(e){let t={description:e.sourceRef.description,logicalPath:e.sourceRef.logicalPath,name:e.sourceRef.name,nodeId:Wu(e.sourceRef.nodeId),sourceId:e.sourceRef.sourceId,sourceKind:`module`};return await Bu({childNodeIdsByParentNodeId:e.childNodeIdsByParentNodeId,manifest:e.sourceRef.agent,moduleMap:e.moduleMap,nodeId:e.sourceRef.nodeId,nodesByNodeId:e.nodesByNodeId,sourceId:e.sourceRef.sourceId,subagentNodesById:e.subagentNodesById}),t}function Uu(e){let t=new Map;for(let n of e.subagentEdges){let e=t.get(n.parentNodeId);if(e===void 0){t.set(n.parentNodeId,[n.childNodeId]);continue}e.push(n.childNodeId)}return t}function Wu(e){return e===`__root__`?so:e}const Gu=Fo.name;function Ku(e,t){let n=t.map(e=>e.connectionName).join(`, `);return e.map(e=>e.name===Gu?{...e,description:`${e.description} Available connections: ${n}.`}:e)}const qu=process.env.ASH_DISABLE_AGENT_CACHE===`1`;async function Ju(e){let[t,n]=await Promise.all([fo({compiledArtifactsSource:e}),Yu(e)]),r=await zu({manifest:t,moduleMap:n}),i=r.root;return{adapterRegistry:Ia({channels:ed(r)}),compiledArtifactsSource:e,graph:r,hookRegistry:i.hookRegistry,moduleMap:n,resolvedAgent:i.agent,subagentRegistry:i.subagentRegistry,toolRegistry:i.toolRegistry,turnAgent:i.turnAgent}}async function Yu(e){return e.kind===`disk`&&e.moduleMapLoadMode===`authored-source`?await Xu(e):await _o({compiledArtifactsSource:e})}async function Xu(e){if(e.moduleMapLoaderPath===void 0)throw Error(`Authored-source module map loading requires "moduleMapLoaderPath" in the compiled artifacts source.`);return await(await import(xe(e.moduleMapLoaderPath).href)).loadCompiledModuleMapFromAuthoredSource({compiledArtifactsSource:e})}async function Zu(e){if(qu)return Ju(e);let t=Xa(),n=Ha(e),r=await io(e),i=t.bundleCacheKeyBySourceKey.get(n);i!==void 0&&i!==r&&t.bundleCache.delete(i),t.bundleCacheKeyBySourceKey.set(n,r);let a=t.bundleCache.get(r);if(a!==void 0)return a;let o=Ju(e).catch(e=>{throw t.bundleCache.delete(r),t.bundleCacheKeyBySourceKey.get(n)===r&&t.bundleCacheKeyBySourceKey.delete(n),e});return t.bundleCache.set(r,o),o}async function Qu(e){let t=await Zu(e.compiledArtifactsSource);if(e.nodeId===void 0)return t;let n=co(t.graph,e.nodeId);return{adapterRegistry:t.adapterRegistry,compiledArtifactsSource:t.compiledArtifactsSource,graph:{nodesByNodeId:t.graph.nodesByNodeId,root:n},hookRegistry:n.hookRegistry,moduleMap:t.moduleMap,nodeId:e.nodeId,resolvedAgent:n.agent,subagentRegistry:n.subagentRegistry,toolRegistry:n.toolRegistry,turnAgent:n.turnAgent}}function $u(){let e=Xa();e.bundleCache.clear(),e.bundleCacheKeyBySourceKey.clear()}function ed(e){let t=new Map;for(let n of e.nodesByNodeId.values())for(let e of n.channels)t.set(`${e.sourceId}:${e.name}`,e);return[...t.values()]}new B(`ash.channel`,{codec:{serialize(e){return{kind:xa(e),state:e.state?{...e.state}:{}}},deserialize(e,t){let n=t.get(td);if(n===void 0)throw Error(`Cannot deserialize "ash.channel" before "ash.bundle". The runtime bundle must be present in context.`);return La(n.adapterRegistry,e)}}});const td=new B(`ash.bundle`,{codec:{serialize:e=>({nodeId:e.nodeId,source:e.compiledArtifactsSource}),deserialize:e=>{let{source:t,nodeId:n}=e;return Qu({compiledArtifactsSource:t,nodeId:n})}}});new B(`ash.session`);const nd=new B(`ash.sandbox`),rd=v(),id={workflowId:`workflow//${rd.name}@${rd.version}//workflowEntry`};function ad(e=process.cwd()){return C(e)}function od(e){return be(`sha256`).update(e).update(`\0`).update(id.workflowId).digest(`hex`).slice(0,12)}function sd(){return!!process.env.VERCEL}function cd(e,t=`all`){let n=S(e,`.ash`,`nitro`);return t===`all`?n:S(n,t)}function ld(e,t){return S(e,`.ash`,`nitro-output`,t)}function ud(e){return S(h(),`.ash`,`workflow-cache`,od(e))}function dd(e){return S(e,`.ash`,`sandbox-cache`)}function fd(e){return sd()?S(e,`.vercel`,`output`):S(e,`.output`)}function pd(e){return{appRoot:e,outputDir:fd(e),workflowId:id.workflowId,workflowBuildDir:ud(e),workflowSourceDir:_(`src/execution`)}}export{Sr as C,jn as D,L as E,Dr as S,Cr as T,Ha as _,ud as a,Qr as b,tc as c,fo as d,so as f,Va as g,Ba as h,ld as i,ec as l,U as m,ad as n,$u as o,to as p,cd as r,zu as s,pd as t,G as u,Qi as v,wr as w,kr as x,$i as y};
|