experimental-ash 0.20.0 → 0.20.1
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 +8 -0
- package/dist/src/chunks/{dev-authored-source-watcher-NA8BZIXr.js → dev-authored-source-watcher-BR7XYOW0.js} +1 -1
- package/dist/src/chunks/host-Dxf7CGaE.js +22 -0
- package/dist/src/chunks/paths-BcM3el4Q.js +88 -0
- package/dist/src/chunks/{prewarm-Bz6Jr9J1.js → prewarm-vAT2QBqc.js} +1 -1
- package/dist/src/cli/commands/info.js +1 -1
- package/dist/src/cli/run.js +1 -1
- package/dist/src/evals/cli/eval.js +1 -1
- package/dist/src/harness/model-call-error.d.ts +14 -0
- package/dist/src/harness/model-call-error.js +199 -15
- package/dist/src/harness/tool-loop.js +79 -17
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/internal/application/paths.d.ts +5 -1
- package/dist/src/internal/application/paths.js +49 -9
- package/dist/src/internal/workflow-bundle/builder-support.js +33 -1
- package/package.json +1 -1
- package/dist/src/chunks/host-DOH_6p0f.js +0 -22
- package/dist/src/chunks/paths-CbL9m08U.js +0 -88
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import{i as e}from"./chunk-8L7ocgPr.js";import{t}from"./gray-matter-BxS7ZG-J.js";import{c as n,d as r,f as i,l as a,o,p as s,s as c,t as l,u}from"./authored-module-loader-XcFLnl49.js";import{n as d,t as f}from"./guards-CjJ3lmju.js";import{t as p}from"./errors-DsO9xmQL.js";import{n as m,o as h,r as g,t as _}from"./package-DmsQgn4v.js";import{a as v,b as ee,i as te,n as ne,o as re,r as ie,s as ae,t as oe,u as se,y as ce}from"./types-MZUhN0Zy.js";import{t as le}from"./runtime-model-BWu6M_hq.js";import{z as y}from"#compiled/zod/index.js";import{basename as ue,dirname as b,join as x,posix as de,relative as fe,resolve as S,sep as pe}from"node:path";import{access as me,cp as he,mkdir as C,readFile as ge,readdir as _e,rm as ve,stat as ye,writeFile as w}from"node:fs/promises";import{createHash as be}from"node:crypto";import{existsSync as xe,readFileSync as Se,readdirSync as Ce,rmSync as we}from"node:fs";import{pathToFileURL as Te}from"node:url";import"#compiled/@workflow/errors/index.js";import{resumeHook as Ee}from"#compiled/@workflow/core/runtime.js";import{AsyncLocalStorage as De}from"node:async_hooks";import{SpanStatusCode as Oe,trace as ke}from"#compiled/@opentelemetry/api/index.js";import{getErrorMessage as Ae}from"#compiled/@ai-sdk/provider/index.js";import{inspect as je}from"node:util";import{fromError as Me}from"#compiled/zod-validation-error/index.js";import{createRemoteJWKSet as Ne,decodeJwt as Pe,jwtVerify as Fe}from"#compiled/jose/index.js";import Ie from"#compiled/turndown/index.js";const Le=y.union([y.literal(`error`),y.literal(`warning`)]);y.object({code:y.string(),message:y.string(),severity:Le,sourcePath:y.string()}).strict();const Re=y.object({errors:y.number().finite(),warnings:y.number().finite()}).strict();function ze(e){return e}function T(e){return ze({...e,severity:`error`})}function Be(e){return ze({...e,severity:`warning`})}function Ve(e){return e.reduce((e,t)=>(t.severity===`error`?e.errors+=1:e.warnings+=1,e),{errors:0,warnings:0})}function He(e){return e.some(e=>e.severity===`error`)}const Ue=[`.cts`,`.mts`,`.cjs`,`.mjs`,`.ts`,`.js`],We=[`package.json`,`vercel.json`],Ge=[`agent.ts`,`agent.cts`,`agent.mts`,`agent.js`,`agent.cjs`,`agent.mjs`,`instructions.md`,`instructions.ts`,`instructions.cts`,`instructions.mts`,`instructions.js`,`instructions.cjs`,`instructions.mjs`,`system.md`,`system.ts`,`system.cts`,`system.mts`,`system.js`,`system.cjs`,`system.mjs`],Ke=[`channels`,`connections`,`hooks`,`lib`,`sandbox`,`skills`,`tools`,`schedules`,`subagents`],qe=[`agent.ts`,`agent.cts`,`agent.mts`,`agent.js`,`agent.cjs`,`agent.mjs`,`instructions.md`,`instructions.ts`,`instructions.cts`,`instructions.mts`,`instructions.js`,`instructions.cjs`,`instructions.mjs`,`system.md`,`system.ts`,`system.cts`,`system.mts`,`system.js`,`system.cjs`,`system.mjs`],Je=[`hooks`,`lib`,`sandbox`,`skills`,`tools`,`subagents`],Ye=[`SKILL.md`],Xe=[`scripts`,`references`,`assets`],Ze=new Set(We);new Set(Ge),new Set(Ke),new Set(qe),new Set(Je),new Set(Ye),new Set(Xe);function E(e){return e.isDirectory()?`directory`:e.isFile()?`file`:`other`}function Qe(e,t){return t===`file`&&Ze.has(e)}function $e(e,t){if(t===`file`)return k(e,`agent`)?`agent-config-module`:e===`instructions.md`?`instructions-markdown`:k(e,`instructions`)?`instructions-module`:e===`system.md`?`system-markdown`:k(e,`system`)?`system-module`:`unknown`;if(t===`directory`){if(e===`channels`)return`channels-directory`;if(e===`connections`)return`connections-directory`;if(e===`hooks`)return`hooks-directory`;if(e===`lib`)return`lib-directory`;if(e===`skills`)return`skills-directory`;if(e===`sandbox`)return`sandbox-directory`;if(e===`tools`)return`tools-directory`;if(e===`schedules`)return`schedules-directory`;if(e===`subagents`)return`subagents-directory`}return`unknown`}function et(e,t){if(t===`file`)return k(e,`agent`)?`agent-config-module`:e===`instructions.md`?`instructions-markdown`:k(e,`instructions`)?`instructions-module`:e===`system.md`?`system-markdown`:k(e,`system`)?`system-module`:`unknown`;if(t===`directory`){if(e===`connections`)return`connections-directory`;if(e===`hooks`)return`hooks-directory`;if(e===`lib`)return`lib-directory`;if(e===`sandbox`)return`sandbox-directory`;if(e===`skills`)return`skills-directory`;if(e===`tools`)return`tools-directory`;if(e===`subagents`)return`subagents-directory`;if(e===`schedules`)return`invalid-schedules-directory`}return`unknown`}function tt(e,t){if(t===`file`)return e===`SKILL.md`?`skill-markdown`:`skill-resource`;if(t===`directory`){if(e===`scripts`)return`skill-scripts-directory`;if(e===`references`)return`skill-references-directory`;if(e===`assets`)return`skill-assets-directory`}return`skill-resource`}function nt(e,t){if(t===`directory`)return`skill-package-directory`;if(t===`file`){if(e.endsWith(`.md`))return`flat-skill-markdown`;if(O(e)!==null)return`flat-skill-module`}return`unknown`}function D(e){return e.replaceAll(pe,`/`).replace(/^\.\//,``).replace(/^\/+/,``)}function O(e){for(let t of Ue)if(e.endsWith(t)&&e.length>t.length)return e.slice(0,-t.length);return null}function k(e,t){return O(e)===t}function A(e){let t=D(e),n=t.lastIndexOf(`/`),r=t.lastIndexOf(`.`);return r===-1||r<n?t:t.slice(0,r)}var rt=e(t(),1);function it(e,t){let r=c(e,t);if(n(r,[`build`,`compaction`,`description`,`metadata`,`model`,`modelContextWindowTokens`,`modelOptions`],t),r.model===void 0)throw Error(`${t} The "model" field is required.`);let a={model:r.model};r.description!==void 0&&(a.description=u(r.description,t));let o=i(r,`metadata`,t);return o!==void 0&&(a.metadata=o),r.compaction!==void 0&&(a.compaction=ct(r.compaction,t)),r.build!==void 0&&(a.build=ot(r.build,t)),r.modelOptions!==void 0&&(a.modelOptions=st(r.modelOptions,t)),r.modelContextWindowTokens!==void 0&&(a.modelContextWindowTokens=at(r.modelContextWindowTokens,t)),a}function at(e,t){if(typeof e!=`number`||!Number.isInteger(e)||e<=0)throw Error(t);return e}function ot(e,t){let r=c(e,t);n(r,[`externalDependencies`],t);let i={};if(r.externalDependencies!==void 0){if(!Array.isArray(r.externalDependencies))throw Error(t);i.externalDependencies=Object.freeze(r.externalDependencies.map(e=>u(e,t)))}return i}function st(e,t){let r=c(e,t);n(r,[`providerOptions`],t);let i=r.providerOptions;return i===void 0?{}:{providerOptions:a(i,t)}}function ct(e,t){let r=c(e,t);n(r,[`model`,`modelContextWindowTokens`,`thresholdPercent`],t);let i={};if(r.model!==void 0&&(i.model=r.model),r.modelContextWindowTokens!==void 0&&(i.modelContextWindowTokens=at(r.modelContextWindowTokens,t)),r.thresholdPercent!==void 0){let e=r.thresholdPercent;if(typeof e!=`number`||!Number.isFinite(e)||e<0||e>1)throw Error(t);i.thresholdPercent=e}return i}function lt(e,t){let r=c(e,t);return n(r,[`markdown`],t),{markdown:u(r.markdown,t)}}function ut(e,t){let r=c(e,t);n(r,[`description`,`license`,`markdown`,`metadata`],t);let a={description:u(r.description,t),markdown:u(r.markdown,t)},o=r.license,s=i(r,`metadata`,t);return o!==void 0&&(a.license=u(o,t)),s!==void 0&&(a.metadata=s),a}function dt(e,t){let r=c(e,t);n(r,[`cron`,`markdown`,`run`],t);let i=u(r.cron,t),a=r.markdown!==void 0,s=r.run!==void 0;if(a&&s)throw Error(`${t} Pass either "markdown" (fire-and-forget) or "run" (handler) — not both.`);if(!a&&!s)throw Error(`${t} Must provide either "markdown" (fire-and-forget) or "run" (handler).`);let l={cron:i};return a?l.markdown=u(r.markdown,t):l.run=o(r.run,t),l}function ft(e){return e}function pt(e){return e}function mt(e){return e}const ht=/^---\r?\n[\s\S]*?\r?\n---(?:\r?\n|$)/;function gt(e){if(!rt.default.test(e))return{hasFrontmatter:!1,frontmatter:{},markdown:e};let t;try{t=(0,rt.default)(e)}catch(t){throw bt(e)&&!xt(e)?Error(`Markdown frontmatter is missing a closing delimiter.`):t}if(!d(t.data))throw Error(`Markdown frontmatter must parse to an object.`);return{hasFrontmatter:!0,frontmatter:t.data,markdown:St(t.content)}}function _t(e){return mt(lt({markdown:e},`Expected authored instructions markdown to match the public Ash shape.`))}function vt(e){let t=gt(e);if(!t.hasFrontmatter)throw Error(`Schedule markdown must start with YAML frontmatter declaring "cron".`);if(`run`in t.frontmatter)throw Error('Markdown-form schedules do not support the "run" frontmatter key. Use a TypeScript schedule (`<name>.ts`) to author a handler.');return ft(dt({...t.frontmatter,markdown:t.markdown},`Expected authored schedule markdown to match the public Ash shape.`))}function yt(e,t={}){let n=gt(e),r=t.slug;if(r===void 0&&!n.hasFrontmatter)throw Error(`Skill markdown must start with YAML frontmatter.`);let i=Tt(n.frontmatter),a=Et(i.description,`description`),o=r===void 0?Dt(i.description,`description`):a??t.description??kt(n.markdown,r),s={...i,description:o,markdown:n.markdown};return Ct(s,i),pt(ut(s,`Expected authored skill markdown to match the public Ash shape.`))}function bt(e){return e.startsWith(`---
|
|
2
|
+
`)||e.startsWith(`---\r
|
|
3
|
+
`)}function xt(e){return ht.test(e)}function St(e){return e.replace(/^\r?\n/u,``)}function Ct(e,t){let n=Et(t.license,`license`);n!==void 0&&(e.license=n);let r=Ot(t.metadata,`metadata`);r!==void 0&&(e.metadata=r)}const wt=[`name`];function Tt(e){let t={...e};for(let e of wt)delete t[e];return t}function Et(e,t){if(e!=null){if(typeof e!=`string`)throw Error(`Expected "${t}" frontmatter to be a string.`);return e}}function Dt(e,t){let n=Et(e,t);if(n===void 0)throw Error(`Missing required "${t}" frontmatter.`);return n}function Ot(e,t){if(e==null)return;if(!d(e))throw Error(`Expected "${t}" frontmatter to be an object.`);let n=Object.entries(e).map(([e,n])=>{if(typeof n!=`string`)throw Error(`Expected "${t}.${e}" frontmatter to be a string.`);return[e,n]});return Object.fromEntries(n)}function kt(e,t){let n=e.split(/\r?\n/u).map(e=>e.trim()).find(e=>e!==``&&!e.startsWith("```"));return n===void 0?`Instructions for the ${t} skill.`:n.replace(/^[#>*\-\s]+/u,``).trim()||`Instructions for the ${t} skill.`}function At(e){let t=S(e.appRoot),n=S(e.agentRoot),r={agentId:e.agentId??jt(t,n,e.packageName),agentRoot:n,appRoot:t,channels:[...e.channels??[]],connections:[...e.connections??[]],diagnosticsSummary:Ve(e.diagnostics??[]),hooks:[...e.hooks??[]],lib:[...e.lib??[]],kind:`ash-agent-discovery-manifest`,sandbox:e.sandbox??null,sandboxWorkspaces:[...e.sandboxWorkspaces??[]],schedules:[...e.schedules??[]],skills:[...e.skills??[]],tools:[...e.tools??[]],version:12,subagents:[...e.subagents??[]]};return e.configModule!==void 0&&(r.configModule=e.configModule),e.instructions!==void 0&&(r.instructions=e.instructions),r}function jt(e,t,n){let r=D(fe(e,t));return r===``||r===`.`||r===`agent`?n??ue(e):ue(t)}function j(e){return D(e)}function M(e){let t=D(e.logicalPath),n={sourceKind:`module`,logicalPath:t,sourceId:e.sourceId??j(t)};return e.exportName!==void 0&&(n.exportName=e.exportName),n}function Mt(e){return{...M(e),connectionName:e.connectionName}}function Nt(e){let t=D(e.logicalPath);return{entryPath:e.entryPath,logicalPath:t,manifest:e.manifest,rootPath:e.rootPath,sourceId:e.sourceId??j(t),subagentId:e.subagentId}}function Pt(e){let t={description:e.description,sourceKind:`skill-package`,logicalPath:D(e.logicalPath),markdown:e.markdown,name:e.name,rootPath:e.rootPath,skillFilePath:e.skillFilePath,skillId:e.skillId,sourceId:e.sourceId};return e.assetsPath!==void 0&&(t.assetsPath=e.assetsPath),e.license!==void 0&&(t.license=e.license),e.metadata!==void 0&&(t.metadata={...e.metadata}),e.referencesPath!==void 0&&(t.referencesPath=e.referencesPath),e.scriptsPath!==void 0&&(t.scriptsPath=e.scriptsPath),t}async function Ft(e){let t=D(e.logicalPath);return{definition:e.lower(await e.source.readTextFile(e.sourcePath),{name:A(t)}),sourceKind:`markdown`,logicalPath:t,sourceId:j(t)}}function It(e,t){let n={moduleFileNames:[]};for(let r of e)if(r.isFile()){if(t.markdownFileName!==void 0&&r.name===t.markdownFileName){n.markdownFileName=r.name;continue}t.moduleBaseName!==void 0&&O(r.name)===t.moduleBaseName&&n.moduleFileNames.push(r.name)}return n.moduleFileNames.sort((e,t)=>e.localeCompare(t)),n}function Lt(e,t){let n=new Map;for(let r of e){if(!r.isFile())continue;let e=t.allowMarkdown?Rt(r.name):null,i=t.allowModules?O(r.name):null,a=e??i;if(a===null)continue;let o=n.get(a);if(o===void 0&&(o={moduleFileNames:[],slotName:a},n.set(a,o)),e!==null){o.markdownFileName=r.name;continue}i!==null&&o.moduleFileNames.push(r.name)}return[...n.values()].map(e=>(e.moduleFileNames.sort((e,t)=>e.localeCompare(t)),e)).sort((e,t)=>e.slotName.localeCompare(t.slotName))}function Rt(e){return!e.endsWith(`.md`)||e.length<=3?null:e.slice(0,-3)}async function N(e){let t=x(e.rootPath,e.directoryName),n=e.rootEntries.find(t=>t.name===e.directoryName);if(n===void 0)return{diagnostics:[],sources:[]};if(!n.isDirectory())return{diagnostics:[T({code:e.invalidDirectoryCode,message:e.invalidDirectoryMessage,sourcePath:t})],sources:[]};let r=[],i=[];return await zt({allowMarkdown:e.allowMarkdown===!0,diagnostics:r,markdownLowerer:e.allowMarkdown===!0?e.markdownLowerer:void 0,projectSource:e.source,recursive:e.recursive,relativeDirectory:e.directoryName,rootDirectoryPath:t,sources:i,subdirectoryRelative:``,unsupportedEntryCode:e.unsupportedEntryCode,unsupportedEntryMessage:e.unsupportedEntryMessage,unsupportedFileCode:e.unsupportedFileCode,unsupportedFileMessage:e.unsupportedFileMessage,validateSegment:e.validateSegment}),{diagnostics:r,sources:i}}async function zt(e){let t=e.subdirectoryRelative===``?e.rootDirectoryPath:x(e.rootDirectoryPath,e.subdirectoryRelative),n=await P(e.projectSource,t);e.recursive&&await Bt(e,n,t),(e.unsupportedFileCode!==void 0||e.unsupportedEntryCode!==void 0)&&Vt(e,n,t),await Ht(e,n,t)}async function Bt(e,t,n){for(let r of t){if(!r.isDirectory())continue;let t=x(n,r.name);if(e.validateSegment!==void 0){let n=e.validateSegment(r.name,t);if(n!==null){e.diagnostics.push(n);continue}}await zt({allowMarkdown:e.allowMarkdown,diagnostics:e.diagnostics,markdownLowerer:e.markdownLowerer,projectSource:e.projectSource,recursive:e.recursive,relativeDirectory:e.relativeDirectory,rootDirectoryPath:e.rootDirectoryPath,sources:e.sources,subdirectoryRelative:e.subdirectoryRelative===``?r.name:x(e.subdirectoryRelative,r.name),unsupportedEntryCode:e.unsupportedEntryCode,unsupportedEntryMessage:e.unsupportedEntryMessage,unsupportedFileCode:e.unsupportedFileCode,unsupportedFileMessage:e.unsupportedFileMessage,validateSegment:e.validateSegment})}}function Vt(e,t,n){for(let r of t){let t=E(r),i=x(n,r.name);if(t===`directory`)continue;if(t===`other`){e.unsupportedEntryCode!==void 0&&e.diagnostics.push(T({code:e.unsupportedEntryCode,message:e.unsupportedEntryMessage?.(i,e.relativeDirectory)??`Expected "${i}" to be a regular file or directory within "${e.relativeDirectory}/".`,sourcePath:i}));continue}if(e.unsupportedFileCode===void 0)continue;let a=O(r.name)!==null,o=e.allowMarkdown&&r.name.endsWith(`.md`);a||o||e.diagnostics.push(T({code:e.unsupportedFileCode,message:e.unsupportedFileMessage?.(i,e.relativeDirectory)??`Expected "${i}" to be a supported authored source within "${e.relativeDirectory}/".`,sourcePath:i}))}}async function Ht(e,t,n){for(let r of Lt(t,{allowMarkdown:e.allowMarkdown,allowModules:!0})){let t=e.subdirectoryRelative===``?r.slotName:x(e.subdirectoryRelative,r.slotName),i=D(x(e.relativeDirectory,t));if(e.validateSegment!==void 0){let t=r.markdownFileName??r.moduleFileNames[0]??r.slotName,i=e.validateSegment(r.slotName,x(n,t));if(i!==null){e.diagnostics.push(i);continue}}if(r.markdownFileName!==void 0&&r.moduleFileNames.length>0){e.diagnostics.push(rn(n,i,[r.markdownFileName,...r.moduleFileNames]));continue}if(r.moduleFileNames.length>1){e.diagnostics.push(an(n,i,r.moduleFileNames));continue}if(r.markdownFileName!==void 0){let t=e.subdirectoryRelative===``?r.markdownFileName:x(e.subdirectoryRelative,r.markdownFileName),n=D(x(e.relativeDirectory,t));if(e.markdownLowerer===void 0)continue;let i=await Ft({logicalPath:n,lower:e.markdownLowerer,source:e.projectSource,sourcePath:x(e.rootDirectoryPath,t)});e.sources.push(i);continue}let[a]=r.moduleFileNames;if(a===void 0)continue;let o=e.subdirectoryRelative===``?a:x(e.subdirectoryRelative,a);e.sources.push(M({logicalPath:D(x(e.relativeDirectory,o))}))}}const Ut=`discover/module-slot-collision`,Wt=`discover/tools-directory-invalid`,Gt=/^[a-zA-Z][a-zA-Z0-9_-]{0,63}$/,Kt=/^[a-z][a-z0-9-]{0,63}$/,qt=/^(\.?[a-z][a-z0-9-]{0,63}|\[[a-zA-Z][a-zA-Z0-9_]{0,63}\])$/,Jt=/^[a-zA-Z][a-zA-Z0-9_-]{0,63}$/;async function P(e,t){let n=[...await e.readDirectory(t)];return n.sort((e,t)=>e.name.localeCompare(t.name)),n}async function Yt(e){let t=await Xt({markdownFileName:`instructions.md`,moduleBaseName:`instructions`,rootEntries:e.rootEntries,rootPath:e.rootPath,slotLabel:`instructions`,source:e.source});if(t.diagnostics.length>0||t.source!==void 0)return{diagnostics:t.diagnostics,instructions:t.source};let n=await Xt({markdownFileName:`system.md`,moduleBaseName:`system`,rootEntries:e.rootEntries,rootPath:e.rootPath,slotLabel:`system`,source:e.source});if(n.source!==void 0){let t=n.source.sourceKind===`markdown`?`system.md`:n.source.logicalPath;return{diagnostics:[Be({code:`discover/deprecated-system-slot`,message:`The "${t}" slot is deprecated. Rename it to "${t.replace(/^system/,`instructions`)}" — the runtime still loads the legacy slot for now, but support will be removed in a future release.`,sourcePath:x(e.rootPath,t)}),...n.diagnostics],instructions:n.source}}return n.diagnostics.length>0?{diagnostics:n.diagnostics}:{diagnostics:[T({code:`discover/required-instructions-missing`,message:`Expected one authored instructions prompt source at "instructions.md", "instructions.ts", "instructions.cts", "instructions.mts", "instructions.js", "instructions.cjs", or "instructions.mjs".`,sourcePath:e.rootPath})]}}async function Xt(e){let t=It(e.rootEntries,{markdownFileName:e.markdownFileName,moduleBaseName:e.moduleBaseName});if(t.markdownFileName!==void 0&&t.moduleFileNames.length>0)return{diagnostics:[rn(e.rootPath,e.slotLabel,[t.markdownFileName,...t.moduleFileNames])]};if(t.moduleFileNames.length>1)return{diagnostics:[an(e.rootPath,e.slotLabel,t.moduleFileNames)]};if(t.markdownFileName!==void 0)return{diagnostics:[],source:await Ft({logicalPath:e.markdownFileName,lower:_t,source:e.source,sourcePath:x(e.rootPath,t.markdownFileName)})};let[n]=t.moduleFileNames;return n===void 0?{diagnostics:[]}:{diagnostics:[],source:M({logicalPath:n})}}function Zt(e){let t=It(e.rootEntries,{moduleBaseName:e.slotName});if(t.moduleFileNames.length>1)return{diagnostics:[an(e.rootPath,e.slotName,t.moduleFileNames)]};let[n]=t.moduleFileNames;return n===void 0?e.missingDiagnostic===void 0?{diagnostics:[]}:{diagnostics:[T({code:e.missingDiagnostic.code,message:e.missingDiagnostic.message,sourcePath:e.rootPath})]}:{diagnostics:[],module:M({logicalPath:n})}}function Qt(e,t){return Gt.test(e)?null:T({code:`discover/tool-name-invalid`,message:`Tool filename "${e}" is not a legal tool name. Expected ASCII letters, digits, underscores, and dashes only, starting with a letter, up to 64 characters.`,sourcePath:t})}function $t(e,t){return Kt.test(e)?null:T({code:`discover/connection-name-invalid`,message:`Connection filename "${e}" is not a legal connection name. Expected lowercase ASCII letters, digits, and dashes only, starting with a letter, up to 64 characters.`,sourcePath:t})}function en(e,t){return qt.test(e)?null:T({code:`discover/channel-name-invalid`,message:`Channel path segment "${e}" is not a legal channel name. Expected lowercase kebab-case (\`my-channel\`), optionally with a leading dot (\`.well-known\`), or a path parameter form (\`[sessionId]\`).`,sourcePath:t})}function tn(e,t){return Jt.test(e)?null:T({code:`discover/hook-name-invalid`,message:`Hook path segment "${e}" is not a legal hook name. Expected ASCII letters, digits, underscores, and dashes only, starting with a letter, up to 64 characters.`,sourcePath:t})}function nn(e){return e.rootEntries.flatMap(t=>!t.isDirectory()||e.classifyEntry(t.name,E(t))!==`unknown`?[]:[Be({code:`discover/unsupported-directory`,message:e.createUnsupportedDirectoryMessage(t.name),sourcePath:x(e.rootPath,t.name)})])}function rn(e,t,n){return T({code:`discover/slot-collision`,message:`Found conflicting authored sources for "${t}": ${on(n)}.`,sourcePath:e})}function an(e,t,n){return T({code:Ut,message:`Found multiple authored module sources for "${t}": ${on(n)}.`,sourcePath:e})}function on(e){return e.map(e=>`"${e}"`).join(`, `)}async function sn(e){let t=`connections`,n=x(e.rootPath,t),r=e.rootEntries.find(e=>e.name===t);if(r===void 0)return{connections:[],diagnostics:[]};if(!r.isDirectory())return{connections:[],diagnostics:[T({code:`discover/connections-directory-invalid`,message:`Expected "${n}" to be a directory of authored connections.`,sourcePath:n})]};let i=await P(e.source,n),a=[],o=[],s=new Set;for(let e of Lt(i,{allowMarkdown:!1,allowModules:!0})){let r=D(x(t,e.slotName));if(e.moduleFileNames.length>1){s.add(e.slotName),o.push(an(n,r,e.moduleFileNames));continue}let[i]=e.moduleFileNames;if(i===void 0)continue;s.add(e.slotName);let c=$t(e.slotName,x(n,i));if(c!==null){o.push(c);continue}a.push(Mt({connectionName:e.slotName,logicalPath:x(t,i)}))}for(let r of i){if(!r.isDirectory())continue;let i=r.name,c=x(n,i);if(s.has(i)){o.push(T({code:`discover/connection-file-folder-collision`,message:`Connection "${i}" is defined twice. Found both file-form "connections/${i}.ts" and folder-form "connections/${i}/". Use one form, not both.`,sourcePath:c}));let e=a.findIndex(e=>e.connectionName===i);e!==-1&&a.splice(e,1);continue}let l=$t(i,c);if(l!==null){o.push(l);continue}let u=cn(await P(e.source,c));if(u.length>1){o.push(T({code:Ut,message:`Found multiple connection definition modules inside "${D(x(t,i))}": `+u.map(e=>`"${e}"`).join(`, `),sourcePath:c}));continue}let[d]=u;if(d===void 0){o.push(T({code:`discover/connection-folder-empty`,message:`Connection folder "connections/${i}/" contains no "connection.ts" definition. Add "connections/${i}/connection.ts" or use the file form "connections/${i}.ts".`,sourcePath:c}));continue}a.push(Mt({connectionName:i,logicalPath:x(t,i,d)}))}return{connections:a,diagnostics:o}}function cn(e){let t=e.filter(e=>e.isFile()),n=[];for(let e of Lt(t,{allowMarkdown:!1,allowModules:!0}))e.slotName===`connection`&&n.push(...e.moduleFileNames);return n}const ln=`discover/lib-entry-unsupported`;async function un(e){let t=await N({directoryName:`lib`,invalidDirectoryCode:`discover/lib-directory-invalid`,invalidDirectoryMessage:`Expected "${e.agentRoot}/lib" to be a directory of authored helper modules.`,recursive:!0,rootEntries:e.rootEntries,rootPath:e.agentRoot,source:e.source,unsupportedEntryCode:ln,unsupportedEntryMessage:e=>`Expected "${e}" to be a supported authored module within "lib/".`,unsupportedFileCode:ln,unsupportedFileMessage:e=>`Expected "${e}" to be a supported authored module within "lib/".`});return{diagnostics:t.diagnostics,lib:t.sources}}function dn(){return{kind:`disk`,async readDirectory(e){return await _e(e,{withFileTypes:!0})},async readTextFile(e){return await ge(e,`utf8`)},async stat(e){try{let t=await ye(e);return t.isDirectory()?`directory`:t.isFile()?`file`:`other`}catch{return`missing`}}}}const F=`sandbox`,fn=`workspace`,pn=`sandbox`;async function mn(e){let t=[],n=e.rootEntries.find(e=>e.name===F);if(n===void 0)return hn({diagnostics:t,rootEntries:e.rootEntries,rootPath:e.rootPath});let r=x(e.rootPath,F);if(!n.isDirectory())return t.push(T({code:`discover/sandbox-directory-invalid`,message:`Expected "${r}" to be the sandbox folder.`,sourcePath:r})),{diagnostics:t,sandbox:null,sandboxWorkspace:null};let i=await P(e.source,r),a=gn(i),o=i.find(e=>e.name===fn&&e.isDirectory());if(a.length>1)return t.push(T({code:Ut,message:`Found multiple sandbox definition modules inside "${D(F)}": `+a.map(e=>`"${e}"`).join(`, `),sourcePath:r})),{diagnostics:t,sandbox:null,sandboxWorkspace:null};let[s]=a,c=s!==void 0,l=o!==void 0;if(!c&&!l)return t.push(T({code:`discover/sandbox-folder-empty`,message:`Sandbox folder "sandbox/" contains neither a "sandbox.<ext>" definition nor a "workspace/" subdirectory. Add one or the other, or remove the folder.`,sourcePath:r})),{diagnostics:t,sandbox:null,sandboxWorkspace:null};let u=null;c&&(u=M({logicalPath:x(F,s)}));let d=null;if(l){let n=x(r,fn),i=D(x(F,fn)),a=await vn(e.source,n);a===null?d={logicalPath:i,rootEntries:await _n(e.source,n),sourceId:j(i),sourcePath:n}:t.push(a)}return{diagnostics:t,sandbox:u,sandboxWorkspace:d}}function hn(e){let t=It(e.rootEntries,{moduleBaseName:pn});if(t.moduleFileNames.length>1)return e.diagnostics.push(T({code:Ut,message:`Found multiple top-level sandbox definition modules: `+t.moduleFileNames.map(e=>`"${e}"`).join(`, `),sourcePath:e.rootPath})),{diagnostics:e.diagnostics,sandbox:null,sandboxWorkspace:null};let[n]=t.moduleFileNames;return n===void 0?{diagnostics:e.diagnostics,sandbox:null,sandboxWorkspace:null}:{diagnostics:e.diagnostics,sandbox:M({logicalPath:n}),sandboxWorkspace:null}}function gn(e){let t=e.filter(e=>e.isFile()),n=[];for(let e of Lt(t,{allowMarkdown:!1,allowModules:!0}))e.slotName===pn&&n.push(...e.moduleFileNames);return n}async function _n(e,t){let n=await P(e,t),r=[];for(let e of n){if(e.isDirectory()){r.push(`${e.name}/`);continue}e.isFile()&&r.push(e.name)}return r}async function vn(e,t){return(await P(e,t)).find(e=>e.name===`skills`)===void 0?null:T({code:`discover/sandbox-workspace-skills-reserved`,message:`"sandbox/workspace/skills/" is reserved for the framework skill discovery. Move skill files under "agent/skills/" instead, or rename the subtree.`,sourcePath:x(t,`skills`)})}const yn=`discover/skill-frontmatter-invalid`;async function bn(e){let t=e.source??dn(),n=S(e.agentRoot),r=S(e.skillsDirectoryPath??x(n,`skills`)),i=D(e.skillsLogicalPath??fe(n,r)),a=await t.stat(r);if(a===`missing`)return{diagnostics:[],skills:[]};if(a!==`directory`)return{diagnostics:[T({code:`discover/skills-directory-invalid`,message:`Expected "${r}" to be a directory of authored skills.`,sourcePath:r})],skills:[]};let o=[],s=new Set,c=new Map,l=await P(t,r);for(let e of l){let n=await xn({entryName:e.name,entryType:E(e),skillsDirectoryPath:r,skillsLogicalPath:i,source:t});if(o.push(...n.diagnostics),n.skill===null||n.skillId===null||s.has(n.skillId))continue;let a=c.get(n.skillId);if(a!==void 0){o.push(T({code:`discover/skill-collision`,message:`Found conflicting authored skill sources for "${n.skillId}": "${a.logicalPath}" and "${n.logicalPath}".`,sourcePath:x(r,n.skillId)})),s.add(n.skillId),c.delete(n.skillId);continue}c.set(n.skillId,{logicalPath:n.logicalPath,skill:n.skill})}return{diagnostics:o,skills:[...c.values()].map(e=>e.skill)}}async function xn(e){let t=x(e.skillsDirectoryPath,e.entryName);switch(nt(e.entryName,e.entryType)){case`skill-package-directory`:return Sn({logicalSkillsPath:e.skillsLogicalPath,skillId:e.entryName,skillRootPath:t,source:e.source});case`flat-skill-markdown`:return Cn({logicalSkillsPath:e.skillsLogicalPath,skillFileName:e.entryName,skillFilePath:t,source:e.source});case`flat-skill-module`:return wn({logicalSkillsPath:e.skillsLogicalPath,skillFileName:e.entryName});default:return{diagnostics:[T({code:`discover/skill-entry-not-directory`,message:`Expected "${t}" to be a skill directory containing SKILL.md or a flat ".md", ".ts", ".cts", ".mts", ".js", ".cjs", or ".mjs" skill file.`,sourcePath:t})],logicalPath:D(x(e.skillsLogicalPath,e.entryName)),skill:null,skillId:null}}}async function Sn(e){let t=x(e.skillRootPath,`SKILL.md`),n=D(x(e.logicalSkillsPath,e.skillId,`SKILL.md`));if(await e.source.stat(t)!==`file`)return{diagnostics:[T({code:`discover/skill-markdown-missing`,message:`Expected "${t}" to exist for the "${e.skillId}" skill.`,sourcePath:e.skillRootPath})],logicalPath:n,skill:null,skillId:null};let r;try{r=yt(await e.source.readTextFile(t))}catch(e){return{diagnostics:[T({code:yn,message:En(t,e),sourcePath:t})],logicalPath:n,skill:null,skillId:null}}let i=await Tn(e.source,e.skillRootPath),a={description:r.description,logicalPath:n,markdown:r.markdown,name:e.skillId,rootPath:e.skillRootPath,skillFilePath:t,skillId:e.skillId,sourceId:j(n)};return i.assetsPath!==void 0&&(a.assetsPath=i.assetsPath),r.license!==void 0&&(a.license=r.license),r.metadata!==void 0&&(a.metadata=r.metadata),i.referencesPath!==void 0&&(a.referencesPath=i.referencesPath),i.scriptsPath!==void 0&&(a.scriptsPath=i.scriptsPath),{diagnostics:[],logicalPath:n,skill:Pt(a),skillId:e.skillId}}async function Cn(e){let t=Dn(e.skillFileName),n=D(x(e.logicalSkillsPath,e.skillFileName)),r;try{r=yt(await e.source.readTextFile(e.skillFilePath),{slug:t})}catch(t){return{diagnostics:[T({code:yn,message:En(e.skillFilePath,t),sourcePath:e.skillFilePath})],logicalPath:n,skill:null,skillId:null}}return{diagnostics:[],logicalPath:n,skill:{definition:r,sourceKind:`markdown`,logicalPath:n,sourceId:j(n)},skillId:t}}async function wn(e){let t=O(e.skillFileName),n=D(x(e.logicalSkillsPath,e.skillFileName));return t===null?{diagnostics:[],logicalPath:n,skill:null,skillId:null}:{diagnostics:[],logicalPath:n,skill:M({logicalPath:n}),skillId:t}}async function Tn(e,t){let n=await e.readDirectory(t),r={};for(let e of n)if(e.isDirectory())switch(tt(e.name,E(e))){case`skill-assets-directory`:r.assetsPath=x(t,e.name);break;case`skill-references-directory`:r.referencesPath=x(t,e.name);break;case`skill-scripts-directory`:r.scriptsPath=x(t,e.name);break;default:break}return r}function En(e,t){return`Invalid authored skill frontmatter in "${e}": ${p(t)}`}function Dn(e){return e.endsWith(`.md`)?e.slice(0,-3):e}async function On(e){let t=e.source??dn(),n=S(e.agentRoot),r=S(e.subagentsDirectoryPath??x(n,`subagents`)),i=D(e.subagentsLogicalPath??fe(n,r)),a=await t.stat(r);if(a===`missing`)return{diagnostics:[],subagents:[]};if(a!==`directory`)return{diagnostics:[T({code:`discover/subagents-directory-invalid`,message:`Expected "${r}" to be a directory of authored subagents.`,sourcePath:r})],subagents:[]};let o=await P(t,r),s=[],c=[];for(let n of o){if(!n.isDirectory())continue;let a=await kn({appRoot:e.appRoot,source:t,subagentId:n.name,subagentLogicalPath:x(i,n.name),subagentRoot:x(r,n.name)});s.push(...a.diagnostics),c.push(a.subagent)}return{diagnostics:s,subagents:c}}async function kn(e){let t=[],n=await P(e.source,e.subagentRoot);t.push(...nn({classifyEntry:et,createUnsupportedDirectoryMessage(e){return`Ignoring unsupported directory "${e}/" in the local subagent root.`},rootEntries:n,rootPath:e.subagentRoot}));let r=await Yt({rootEntries:n,rootPath:e.subagentRoot,source:e.source});t.push(...r.diagnostics);let i=Zt({missingDiagnostic:{code:`discover/required-subagent-config-module-missing`,message:`Expected one authored subagent config module at "agent.ts", "agent.cts", "agent.mts", "agent.js", "agent.cjs", or "agent.mjs".`},rootEntries:n,rootPath:e.subagentRoot,slotName:`agent`});t.push(...i.diagnostics);let a=await sn({rootEntries:n,rootPath:e.subagentRoot,source:e.source});t.push(...a.diagnostics);let o=await mn({rootEntries:n,rootPath:e.subagentRoot,source:e.source});t.push(...o.diagnostics);let s=await N({directoryName:`tools`,invalidDirectoryCode:Wt,invalidDirectoryMessage:`Expected "${x(e.subagentRoot,`tools`)}" to be a directory of authored tools.`,recursive:!0,rootEntries:n,rootPath:e.subagentRoot,source:e.source,validateSegment:Qt});t.push(...s.diagnostics);let c=await N({directoryName:`hooks`,invalidDirectoryCode:Mn,invalidDirectoryMessage:`Expected "${x(e.subagentRoot,`hooks`)}" to be a directory of authored hooks.`,recursive:!0,rootEntries:n,rootPath:e.subagentRoot,source:e.source,validateSegment:tn});t.push(...c.diagnostics);let l=await un({agentRoot:e.subagentRoot,rootEntries:n,source:e.source});t.push(...l.diagnostics),t.push(...An(e.subagentRoot,n));let u=await bn({agentRoot:e.subagentRoot,source:e.source});t.push(...u.diagnostics);let d=await On({agentRoot:e.subagentRoot,appRoot:e.appRoot,source:e.source});t.push(...d.diagnostics);let f={agentRoot:e.subagentRoot,appRoot:e.appRoot,connections:a.connections,diagnostics:t,hooks:c.sources,lib:l.lib,instructions:r.instructions,sandbox:o.sandbox,sandboxWorkspaces:o.sandboxWorkspace===null?[]:[o.sandboxWorkspace],skills:u.skills,tools:s.sources,subagents:d.subagents};i.module!==void 0&&(f.configModule=i.module);let p=At(f);return{diagnostics:t,subagent:Nt({entryPath:e.subagentRoot,logicalPath:e.subagentLogicalPath,manifest:p,rootPath:e.subagentRoot,subagentId:e.subagentId})}}function An(e,t){return t.flatMap(t=>et(t.name,E(t))===`invalid-schedules-directory`?[T({code:`discover/local-subagent-schedules-invalid`,message:`Local subagent packages cannot define schedules at "${x(e,t.name)}".`,sourcePath:x(e,t.name)})]:[])}async function jn(e){let t=await N({allowMarkdown:!0,directoryName:`schedules`,invalidDirectoryCode:`discover/schedules-directory-invalid`,invalidDirectoryMessage:`Expected "${x(e.agentRoot,`schedules`)}" to be a directory of authored schedules.`,markdownLowerer:e=>vt(e),recursive:!0,rootEntries:e.rootEntries,rootPath:e.agentRoot,source:e.source,unsupportedFileCode:`discover/schedule-file-unsupported`,unsupportedFileMessage:e=>`Expected "${e}" to be a TypeScript or markdown schedule file within "schedules/".`});return{diagnostics:t.diagnostics,schedules:t.sources}}const Mn=`discover/hooks-directory-invalid`;async function Nn(e){let t=e.source??dn(),n=S(e.appRoot),r=S(e.agentRoot),i=[],a=await Pn(t,n),o=await P(t,r);i.push(...nn({classifyEntry:$e,createUnsupportedDirectoryMessage(e){return`Ignoring unsupported directory "${e}/" in the agent root.`},rootEntries:o,rootPath:r}));let s=await Yt({rootEntries:o,rootPath:r,source:t});i.push(...s.diagnostics);let c=Zt({rootEntries:o,rootPath:r,slotName:`agent`});i.push(...c.diagnostics);let l=await N({directoryName:`channels`,invalidDirectoryCode:`discover/channels-directory-invalid`,invalidDirectoryMessage:`Expected "${x(r,`channels`)}" to be a directory of authored channels.`,recursive:!0,rootEntries:o,rootPath:r,source:t,validateSegment:en});i.push(...l.diagnostics);let u=await un({agentRoot:r,rootEntries:o,source:t});i.push(...u.diagnostics);let d=await jn({agentRoot:r,rootEntries:o,source:t});i.push(...d.diagnostics);let f=await sn({rootEntries:o,rootPath:r,source:t});i.push(...f.diagnostics);let p=await mn({rootEntries:o,rootPath:r,source:t});i.push(...p.diagnostics);let m=await N({directoryName:`tools`,invalidDirectoryCode:Wt,invalidDirectoryMessage:`Expected "${x(r,`tools`)}" to be a directory of authored tools.`,recursive:!0,rootEntries:o,rootPath:r,source:t,validateSegment:Qt});i.push(...m.diagnostics);let h=await N({directoryName:`hooks`,invalidDirectoryCode:Mn,invalidDirectoryMessage:`Expected "${x(r,`hooks`)}" to be a directory of authored hooks.`,recursive:!0,rootEntries:o,rootPath:r,source:t,validateSegment:tn});i.push(...h.diagnostics);let g=await bn({agentRoot:r,source:t});i.push(...g.diagnostics);let _=await On({agentRoot:r,appRoot:n,source:t});i.push(..._.diagnostics);let v={agentRoot:r,appRoot:n,channels:l.sources,connections:f.connections,packageName:a,diagnostics:i,hooks:h.sources,lib:u.lib,instructions:s.instructions,sandbox:p.sandbox,sandboxWorkspaces:p.sandboxWorkspace===null?[]:[p.sandboxWorkspace],schedules:d.schedules,skills:g.skills,tools:m.sources,subagents:_.subagents};return c.module!==void 0&&(v.configModule=c.module),{diagnostics:i,manifest:At(v)}}async function Pn(e,t){try{let n=x(t,`package.json`),r=JSON.parse(await e.readTextFile(n)).name;if(typeof r!=`string`||r.length===0)return;let i=r.lastIndexOf(`/`);return i===-1?r:r.slice(i+1)}catch{return}}var Fn=class extends Error{diagnostic;constructor(e){super(e.message),this.name=`DiscoveryProjectResolutionError`,this.diagnostic=e}};async function In(e=process.cwd(),t={}){let n=t.source??dn(),r=await Ln(n,e),i=r;for(;;){let e=await Rn(n,i);if(e!==null)return e;let t=await zn(n,i);if(t!==null)return t;if(await Bn(n,i))return{agentRoot:i,appRoot:i,layout:`flat`};let r=b(i);if(r===i)break;i=r}throw new Fn(T({code:`discover/project-not-found`,message:`Could not resolve an Ash agent root from "${r}".`,sourcePath:r}))}async function Ln(e,t){let n=S(t);return await e.stat(n)===`directory`?n:b(n)}async function Rn(e,t){if(ue(t)!==`agent`)return null;let n=b(t);return await Vn(e,n)?{agentRoot:t,appRoot:n,layout:`nested`}:null}async function zn(e,t){if(!await Vn(e,t))return null;let n=x(t,`agent`);return await Un(e,n)?{agentRoot:n,appRoot:t,layout:`nested`}:null}async function Bn(e,t){let n=await Hn(e,t);return Array.from(n.entries()).some(([e,t])=>{let n=$e(e,t);return n!==`unknown`&&n!==`lib-directory`})}async function Vn(e,t){let n=await Hn(e,t);return Array.from(n.entries()).some(([e,t])=>Qe(e,t))}async function Hn(e,t){if(await e.stat(t)!==`directory`)return new Map;let n=await e.readDirectory(t);return new Map(n.map(e=>[e.name,E(e)]))}async function Un(e,t){return await e.stat(t)===`directory`}const Wn=`ash-agent-compiled-manifest`,I=`__root__`,Gn=y.object({exportName:y.string().optional(),sourceKind:y.literal(`module`),logicalPath:y.string(),sourceId:y.string()}).strict(),Kn=y.union([y.literal(`GET`),y.literal(`POST`),y.literal(`PUT`),y.literal(`DELETE`),y.literal(`PATCH`)]),qn=y.object({kind:y.literal(`channel`),name:y.string(),logicalPath:y.string(),method:Kn,urlPath:y.string(),sourceId:y.string(),sourceKind:y.literal(`module`),exportName:y.string().optional(),adapterKind:y.string().optional()}).strict(),Jn=y.object({kind:y.literal(`disabled`),name:y.string(),logicalPath:y.string()}).strict(),Yn=y.union([qn,Jn]),Xn=y.object({contextWindowTokens:y.number().int().positive().optional(),id:y.string(),source:Gn.optional(),providerOptions:ce.optional()}).strict(),Zn=y.object({externalDependencies:y.array(y.string()).optional()}).strict(),Qn=y.object({model:Xn.optional(),thresholdPercent:y.number().finite().min(0).max(1).optional()}).strict(),$n=y.object({build:Zn.optional(),compaction:Qn.optional(),description:y.string().optional(),metadata:y.record(y.string(),y.string()),model:Xn,name:y.string(),source:Gn.optional()}).strict(),er=y.object({name:y.string(),logicalPath:y.string(),markdown:y.string(),sourceId:y.string(),sourceKind:y.union([y.literal(`markdown`),y.literal(`module`)])}).strict(),tr={name:y.string(),description:y.string(),license:y.string().optional(),markdown:y.string(),metadata:y.record(y.string(),y.string()).optional(),sourceId:y.string(),logicalPath:y.string()},nr=y.discriminatedUnion(`sourceKind`,[y.object({...tr,sourceKind:y.literal(`markdown`)}).strict(),y.object({...tr,sourceKind:y.literal(`module`),exportName:y.string().optional()}).strict(),y.object({...tr,sourceKind:y.literal(`skill-package`),skillId:y.string(),skillFilePath:y.string(),rootPath:y.string(),assetsPath:y.string().optional(),referencesPath:y.string().optional(),scriptsPath:y.string().optional()}).strict()]),rr=y.object({cron:y.string(),hasRun:y.boolean(),name:y.string(),logicalPath:y.string(),markdown:y.string().optional(),sourceId:y.string(),sourceKind:y.union([y.literal(`markdown`),y.literal(`module`)])}).strict(),ir=y.object({description:y.string().optional(),exportName:y.string().optional(),logicalPath:y.string(),sourceId:y.string(),sourceKind:y.literal(`module`)}).strict(),ar=y.object({logicalPath:y.string(),rootEntries:y.array(y.string()).readonly(),sourceId:y.string(),sourcePath:y.string()}).strict(),or=y.object({logicalPath:y.string(),rootEntries:y.array(y.string()).readonly()}).strict(),sr=y.object({connectionName:y.string(),description:y.string(),exportName:y.string().optional(),logicalPath:y.string(),sourceId:y.string(),sourceKind:y.literal(`module`),url:y.string(),vercelConnect:y.object({connector:y.string()}).strict().optional()}).strict(),cr=y.object({description:y.string(),exportName:y.string().optional(),inputSchema:ce.nullable(),logicalPath:y.string(),name:y.string(),sourceId:y.string(),sourceKind:y.literal(`module`)}).strict(),lr=y.object({exportName:y.string().optional(),logicalPath:y.string(),slug:y.string(),sourceId:y.string(),sourceKind:y.literal(`module`)}).strict(),ur=y.object({agentRoot:y.string(),appRoot:y.string(),channels:y.array(Yn),config:$n,connections:y.array(sr),diagnosticsSummary:Re,disabledFrameworkTools:y.array(y.string()).readonly(),hooks:y.array(lr),sandbox:ir.nullable(),sandboxWorkspaces:y.array(ar),schedules:y.array(rr),skills:y.array(nr).readonly(),instructions:er.optional(),tools:y.array(cr),workspaceResourceRoot:or}).strict(),dr=y.object({agent:ur,description:y.string(),entryPath:y.string(),logicalPath:y.string(),name:y.string(),nodeId:y.string(),rootPath:y.string(),sourceId:y.string(),sourceKind:y.literal(`module`),exportName:y.string().optional()}).strict(),fr=y.object({childNodeId:y.string(),parentNodeId:y.string()}).strict(),pr=y.object({agentRoot:y.string(),appRoot:y.string(),channels:y.array(Yn),config:$n,connections:y.array(sr),diagnosticsSummary:Re,disabledFrameworkTools:y.array(y.string()).readonly(),hooks:y.array(lr),kind:y.literal(Wn),sandbox:ir.nullable(),sandboxWorkspaces:y.array(ar),schedules:y.array(rr),skills:y.array(nr).readonly(),subagentEdges:y.array(fr),subagents:y.array(dr),instructions:er.optional(),tools:y.array(cr),version:y.literal(22),workspaceResourceRoot:or}).strict();function mr(e){let t={agentRoot:e.agentRoot,appRoot:e.appRoot,channels:[...e.channels??[]],connections:[...e.connections??[]],config:{build:e.config.build===void 0?void 0:{externalDependencies:e.config.build.externalDependencies===void 0?void 0:[...e.config.build.externalDependencies]},compaction:{model:e.config.compaction?.model===void 0?void 0:vr(e.config.compaction.model),thresholdPercent:e.config.compaction?.thresholdPercent},description:e.config.description,metadata:{...e.config.metadata},model:vr(e.config.model),name:e.config.name,source:e.config.source===void 0?void 0:{...e.config.source}},diagnosticsSummary:e.diagnosticsSummary??{errors:0,warnings:0},disabledFrameworkTools:[...e.disabledFrameworkTools??[]],hooks:[...e.hooks??[]],sandbox:e.sandbox??null,sandboxWorkspaces:[...e.sandboxWorkspaces??[]],schedules:[...e.schedules??[]],skills:[...e.skills??[]],tools:[...e.tools??[]],workspaceResourceRoot:e.workspaceResourceRoot??{logicalPath:``,rootEntries:hr({sandboxWorkspaces:e.sandboxWorkspaces,skills:e.skills})}};return e.instructions!==void 0&&(t.instructions=e.instructions),t}function hr(e){let t=new Set;(e.skills??[]).length>0&&t.add(`skills/`);for(let n of e.sandboxWorkspaces??[])for(let e of n.rootEntries)t.add(e);return[...t].sort((e,t)=>e.localeCompare(t))}function gr(e,t){return e===`__root__`?t:`${e}::${t}`}function _r(e){return{...mr(e),kind:Wn,subagentEdges:[...e.subagentEdges??[]],subagents:[...e.subagents??[]],version:22}}function vr(e){return e.contextWindowTokens===void 0&&e.source===void 0&&e.providerOptions===void 0?{id:e.id}:e.source===void 0?e.providerOptions===void 0?{contextWindowTokens:e.contextWindowTokens,id:e.id}:{contextWindowTokens:e.contextWindowTokens,id:e.id,providerOptions:{...e.providerOptions}}:e.contextWindowTokens===void 0&&e.providerOptions===void 0?{id:e.id,source:{...e.source}}:{contextWindowTokens:e.contextWindowTokens,id:e.id,providerOptions:e.providerOptions===void 0?void 0:{...e.providerOptions},source:{...e.source}}}const yr=/^\/?[A-Za-z]:[\\/]/,br=/^\\\\[^\\]/,xr=/(\b(?:from|import)\s*(?:\(\s*)?)(["'])([A-Za-z]:[\\/][^"'\n\r]*)\2/g;function Sr(e){return yr.test(e)||br.test(e)}function Cr(e){let t=e.replaceAll(`\\`,`/`);return t.startsWith(`//`)?new URL(`file:${t}`).href:(/^\/[A-Za-z]:\//.test(t)&&(t=t.slice(1)),new URL(`file:///${t}`).href)}function wr(e){let t=e.indexOf(`?`),n=e.indexOf(`#`),r=t===-1?n:n===-1?t:Math.min(t,n);return r===-1?{path:e,suffix:``}:{path:e.slice(0,r),suffix:e.slice(r)}}function Tr(e){if(e.startsWith(`file://`))return e;let{path:t,suffix:n}=wr(e);return Sr(t)?`${Cr(t)}${n}`:e.replaceAll(`\\`,`/`)}function Er(e){return JSON.stringify(Tr(e))}function Dr(e){return e.replace(xr,(e,t,n,r)=>`${t}${n}${Tr(r)}${n}`)}const Or=y.object({modules:y.record(y.string(),y.object({}).passthrough())}).strict(),kr=y.object({nodes:y.record(y.string(),Or)}).strict();function Ar(e){let t=Ir(e.moduleMapPath),n=e.importSpecifierStyle??`relative`,r=0,i=[jr({agentRoot:e.manifest.agentRoot,importSpecifierStyle:n,manifest:e.manifest,moduleMapDirectory:t,nextBindingName(){return`module_${r++}`},nodeId:I}),...[...e.manifest.subagents].sort((e,t)=>e.nodeId.localeCompare(t.nodeId)).map(e=>jr({agentRoot:e.agent.agentRoot,importSpecifierStyle:n,manifest:e.agent,moduleMapDirectory:t,nextBindingName(){return`module_${r++}`},nodeId:e.nodeId}))],a=i.flatMap(e=>e.modules.map(e=>`import * as ${e.bindingName} from ${JSON.stringify(e.importSpecifier)};`));return[`// Generated by Ash. Do not edit by hand.`,``,...a,...a.length>0?[``]:[],`export const moduleMap = ${Pr(i)};`,``,`export default moduleMap;`,``].join(`
|
|
4
|
+
`)}function jr(e){return{modules:Mr(e.manifest).sort((e,t)=>e.sourceId.localeCompare(t.sourceId)).map(t=>({bindingName:e.nextBindingName(),importSpecifier:Nr({fromDirectory:e.moduleMapDirectory,importSpecifierStyle:e.importSpecifierStyle,targetPath:Lr(e.agentRoot,t.logicalPath)}),sourceId:t.sourceId})),nodeId:e.nodeId}}function Mr(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});for(let n of e.schedules)n.sourceKind!==`module`||!n.hasRun||t.set(n.sourceId,{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 Nr(e){if(e.importSpecifierStyle===`absolute`)return Tr(zr(e.targetPath));let t=Rr(e.fromDirectory,e.targetPath);return t.startsWith(`.`)?t:`./${t}`}function Pr(e){return Fr([{key:`nodes`,value:Fr(e.map(e=>({key:e.nodeId,value:Fr([{key:`modules`,value:Fr(e.modules.map(e=>({key:e.sourceId,value:e.bindingName})))}],3)})))}],0)}function Fr(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
|
+
`,`\n${r}`)}`).join(`,
|
|
6
|
+
`),`${n}})`].join(`
|
|
7
|
+
`)}function Ir(e){let t=L(e);return t.segments.length===0?t.root.length===0?`.`:t.root:Br(t.root,t.segments.slice(0,-1))}function Lr(e,t){let n=L(e),r=L(t);return r.root.length>0?Br(r.root,r.segments):Br(n.root,[...n.segments,...r.segments])}function Rr(e,t){let n=L(e),r=L(t);if(n.root!==r.root)return zr(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 zr(e){let t=L(e);return Br(t.root,t.segments)}function L(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 Br(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 Vr=`ash-model-catalog-cache`,Hr=y.object({provider:y.string().min(1),providerModelId:y.string().min(1),contextWindowTokens:y.number().int().nonnegative().optional(),maxOutputTokens:y.number().int().nonnegative().optional()}).passthrough(),Ur=y.object({slug:y.string().min(1),providers:y.array(Hr).min(1)}).passthrough(),Wr=y.object({models:y.array(Ur),providerAliases:y.record(y.string(),y.string())}).passthrough();y.object({contextWindowTokens:y.number().int().positive(),maxOutputTokens:y.number().int().positive().optional()}).strict();const Gr=y.object({fetchedAt:y.string(),kind:y.literal(Vr),models:y.array(Ur),providerAliases:y.record(y.string(),y.string()),version:y.literal(2)}).strict(),Kr=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 qr(e){return x(e,`.ash`,`cache`,`model-catalog.json`)}function Jr(e){let t=null,n=null,r=null,i=async()=>(t??=Xr(e),await t),a=async()=>{if(n!==null)throw n;if(r!==null)return await r;r=Yr(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&&$r(e))return e;try{return await a()}catch{return e===null?null:e}};return{async getModelLimits(e){let t=ei(e),n=await o();if(n!==null){let e=Zr(n.models,t);if(e)for(let t of e.providers){let e=Qr(t);if(e!==null)return e}}return Kr.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=ei(t);for(let e of n.models)for(let t of e.providers)if(t.provider===i&&ei(t.providerModelId)===a){let n=Qr(t);if(n!==null)return{slug:e.slug,limits:n}}return null}}}async function Yr(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=Wr.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:Vr,models:n.data.models,providerAliases:n.data.providerAliases,version:2};try{let t=qr(e);await C(x(e,`.ash`,`cache`),{recursive:!0}),await w(t,`${JSON.stringify(r,null,2)}\n`,`utf8`)}catch{}return r}async function Xr(e){try{let t=await ge(qr(e),`utf8`),n=Gr.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 Zr(e,t){return e.find(e=>e.slug===t)}function Qr(e){return e.contextWindowTokens===void 0||e.contextWindowTokens<=0?null:{contextWindowTokens:e.contextWindowTokens,...e.maxOutputTokens!==void 0&&e.maxOutputTokens>0&&{maxOutputTokens:e.maxOutputTokens}}}function $r(e){let t=Date.parse(e.fetchedAt);return Number.isFinite(t)?Date.now()-t<=864e5:!1}function ei(e){return e.endsWith(`-thinking`)?e.slice(0,-9):e}async function R(e){let t=r(await l(x(e.agentRoot,e.source.logicalPath)),e.source);try{return await s(t)}catch(t){throw Error(`Failed to execute the ${e.kind} export "${e.source.exportName??`default`}" from "${e.source.logicalPath}": ${p(t)}`)}}var ti=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 ni(e,t){if(e.configModule===void 0)throw new ti(e.agentId);let n=it(await R({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 ri({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 ri({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 ri(e){if(typeof e.value==`string`)return await ii({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 ii(i,e)}async function ii(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}". ${p(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 ai(e){return typeof e==`object`&&!!e&&e.__kind===`ash:channel`}function oi(e,t){if(!ai(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 si(e){return typeof e==`object`&&!!e&&e.kind===`ash:disabled-channel`}async function ci(e,t){let n=await R({agentRoot:e,kind:`channel`,source:t}),r=A(t.logicalPath).replace(/^channels\//,``);if(si(n))return{kind:`disabled`,name:r,logicalPath:t.logicalPath};let i=oi(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:li(i.adapter)}))}function li(e){if(typeof e!=`object`||!e)return;let t=e.kind;return typeof t==`string`&&t.length>0?t:void 0}function ui(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 di(e,t,n=`auth`){let r=ui(e,n);if(r!==void 0)throw Error(`${t} ${r}`);let i=e,a=fi(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 fi(e){if(typeof e!=`object`||!e)return;let t=e.connector;if(!(typeof t!=`string`||t.length===0))return{connector:t}}const pi=[`approval`,`auth`,`description`,`headers`,`tools`,`url`],mi=[`completeAuthorization`,`getToken`,`principalType`,`startAuthorization`,`vercelConnect`];function hi(e,t){let r=c(e,t);n(r,pi,t),gi(r,t),_i(r,t);let i=vi(r,t),a=yi(r,t),o=bi(r,t);if(i!==void 0&&a!==void 0&&typeof a!=`function`&&Object.keys(a).some(e=>e.toLowerCase()===`authorization`))throw Error(`${t} "headers" must not include an "Authorization" key when "auth" is also provided.`);let s={description:r.description,url:r.url};if(i!==void 0&&(s.auth=i),a!==void 0&&(s.headers=a),o!==void 0&&(s.tools=o),r.approval!==void 0){if(typeof r.approval!=`function`)throw Error(`${t} The "approval" field must be a function when provided.`);s.approval=r.approval}return s}function gi(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 _i(e,t){if(typeof e.description!=`string`||e.description.length===0)throw Error(`${t} The "description" field must be a non-empty string.`)}function vi(e,t){if(e.auth===void 0)return;let r=c(e.auth,`${t} The "auth" field must be an object with a "getToken" method.`);return n(r,mi,`${t} The "auth" field`),di(r,t)}function yi(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 bi(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?(xi(n.allow,`${t} The "tools.allow"`),{allow:n.allow}):(xi(n.block,`${t} The "tools.block"`),{block:n.block})}function xi(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 Si(e,t){let n=hi(await R({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=Ci(n.auth);return i!==void 0&&(r.vercelConnect=i),r}function Ci(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 wi(e){return{exportName:e.exportName,logicalPath:e.logicalPath,slug:A(e.logicalPath).replace(/^hooks\//,``),sourceId:e.sourceId,sourceKind:`module`}}function Ti(e){let t;function n(){return t===void 0&&(t=e()),t}return{get name(){return n().name},create(e){return n().create(e)},async prewarm(e){await n().prewarm(e)}}}function Ei(e,t){let r=c(e,t);n(r,[`backend`,`bootstrap`,`description`,`onSession`],t);let i={};if(r.backend!==void 0&&(i.backend=Di(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=o(r.bootstrap,t)),r.onSession!==void 0&&(i.onSession=o(r.onSession,t)),i}function Di(e,t){if(typeof e==`function`)return Ti(e);let n=c(e,`${t} The "backend" field must be a SandboxBackend value (use vercelBackend(), localBackend(), or your own factory) or a zero-arg function returning one.`);if(typeof n.name!=`string`||n.name.length===0)throw Error(`${t} The "backend" value must expose a non-empty string "name" identifier.`);if(typeof n.create!=`function`)throw Error(`${t} The "backend" value must expose a "create" function.`);if(n.prewarm!==void 0&&typeof n.prewarm!=`function`)throw Error(`${t} The "backend.prewarm" property must be a function when set.`);return n}async function Oi(e,t){return{description:Ei(await R({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 ki(e,t){let n=t.sourceKind===`markdown`?lt(t.definition,`Expected the compiled instructions definition at "${t.logicalPath}" to match the public Ash shape.`):lt(await R({agentRoot:e,kind:`instructions`,source:t}),`Expected the instructions export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Ash shape.`);return{name:A(t.logicalPath),logicalPath:t.logicalPath,markdown:n.markdown,sourceId:t.sourceId,sourceKind:t.sourceKind}}async function Ai(e,t){let n=t.sourceKind===`markdown`?dt(t.definition,`Expected the compiled schedule definition at "${t.logicalPath}" to match the public Ash shape.`):dt(await R({agentRoot:e,kind:`schedule`,source:t}),`Expected the schedule export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Ash shape.`),r={cron:n.cron,hasRun:n.run!==void 0,logicalPath:t.logicalPath,name:ji(t.logicalPath),sourceId:t.sourceId,sourceKind:t.sourceKind};return n.markdown===void 0?r:{...r,markdown:n.markdown.trim()}}function ji(e){return A(e).replace(/^schedules\//,``)}async function Mi(e,t){if(t.sourceKind===`skill-package`)return Ni(t);let n=t.sourceKind===`markdown`?ut(t.definition,`Expected the compiled skill definition at "${t.logicalPath}" to match the public Ash shape.`):ut(await R({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:A(t.logicalPath).replace(/^skills\//,``),sourceId:t.sourceId,sourceKind:t.sourceKind}}function Ni(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 Pi(e){let t=[],n=[];for(let r of e.subagents){let i=await Fi({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 Fi(e){let t=gr(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 Pi({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 Ii(e){return typeof e==`object`&&!!e&&e.kind===`ash:disabled-tool`}function Li(e){return e&&typeof e==`object`&&`~standard`in e?e[`~standard`].jsonSchema.input({target:`draft-07`}):JSON.parse(JSON.stringify(e))}function Ri(e,t){if(Ii(e))return{kind:`disabled`};let r=c(e,t);n(r,[`description`,`execute`,`inputSchema`,`needsApproval`,`onCompact`,`retentionPolicy`,`toModelOutput`],t);let i=r.inputSchema===void 0?null:Li(r.inputSchema),a={description:u(r.description,t),execute:o(r.execute,t),inputSchema:i};if(r.onCompact!==void 0&&o(r.onCompact,t),r.needsApproval!==void 0&&o(r.needsApproval,t),r.retentionPolicy!==void 0){let e=r.retentionPolicy;if(e!==`auto`&&e!==`keep`&&typeof e!=`function`)throw Error(`${t} Expected \`retentionPolicy\` to be "auto", "keep", or a function.`)}return r.toModelOutput!==void 0&&o(r.toModelOutput,t),{kind:`tool`,definition:a}}async function zi(e,t){let n=Ri(await R({agentRoot:e,kind:`tool`,source:t}),`Expected the tool export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Ash shape.`),r=A(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 Bi(e){let t={modelCatalog:Jr(e.appRoot)},[n,r]=await Promise.all([Vi(e,t),Pi({appRoot:e.appRoot,compileAgentNodeManifest:Vi,context:t,parentNodeId:I,subagents:e.subagents})]);return _r({...n,subagentEdges:r.edges,subagents:r.nodes})}async function Vi(e,t){let n=await Promise.all(e.tools.map(t=>zi(e.agentRoot,t))),r=[],i=[];for(let e of n)e.kind===`tool`?r.push(e.definition):i.push(e.name);let a=(await Promise.all(e.channels.map(t=>ci(e.agentRoot,t)))).flat();return mr({agentRoot:e.agentRoot,appRoot:e.appRoot,channels:a,config:await ni(e,t),connections:await Promise.all(e.connections.map(t=>Si(e.agentRoot,t))),diagnosticsSummary:e.diagnosticsSummary,disabledFrameworkTools:i,hooks:e.hooks.map(e=>wi(e)),sandbox:e.sandbox===null?null:await Oi(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=>Ai(e.agentRoot,t))),skills:await Promise.all(e.skills.map(t=>Mi(e.agentRoot,t))),instructions:e.instructions===void 0?void 0:await ki(e.agentRoot,e.instructions),tools:r})}const Hi=`workspace-resources`;async function Ui(e){let t=x(e.compileDirectoryPath,Hi);await ve(t,{force:!0,recursive:!0});let n=await Gi({nodeId:I,resourcesRoot:t,manifest:e.manifest}),r=await Promise.all(e.manifest.subagents.map(async e=>({...e,agent:await Gi({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 Wi(e,t){return{logicalPath:D(x(Hi,t)),rootEntries:hr({sandboxWorkspaces:e.sandboxWorkspaces,skills:e.skills})}}async function Gi(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=x(e.resourcesRoot,e.nodeId);await C(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 Ki({nodeRoot:t,skill:n});return{...e.manifest,workspaceResourceRoot:Wi(e.manifest,e.nodeId)}}async function Ki(e){let t=x(e.nodeRoot,`skills`,e.skill.name);if(e.skill.sourceKind===`skill-package`){await he(e.skill.rootPath,t,{recursive:!0});return}let n=x(t,`SKILL.md`);await C(b(n),{recursive:!0}),await w(n,e.skill.markdown)}function qi(e){let t=S(e),n=x(t,`.ash`,`discovery`),r=x(t,`.ash`,`compile`);return{appRoot:t,compiledManifestPath:x(r,`compiled-agent-manifest.json`),compileDirectoryPath:r,compileMetadataPath:x(r,`compile-metadata.json`),diagnosticsPath:x(n,`diagnostics.json`),discoveryManifestPath:x(n,`agent-discovery-manifest.json`),discoveryDirectoryPath:n,moduleMapPath:x(r,`module-map.mjs`)}}function Ji(e){return{diagnostics:[...e],kind:`ash-discovery-diagnostics`,summary:Ve(e),version:1}}function Yi(e){let t=_(),n=Zi(e.discoveryManifestJson),r=Zi(e.diagnosticsArtifactJson),i=Zi(e.moduleMapSource);return{compile:{moduleMap:{path:$i(e.appRoot,e.paths.moduleMapPath),sha256:i}},discovery:{diagnostics:{path:$i(e.appRoot,e.paths.diagnosticsPath),sha256:r},manifest:{path:$i(e.appRoot,e.paths.discoveryManifestPath),sha256:n},sourceGraphHash:Zi(`${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 Xi(e){let t=qi(e.appRoot),n=Ji(e.diagnostics),r=await Ui({compileDirectoryPath:t.compileDirectoryPath,manifest:await Bi(e.manifest)}),i=Qi(r),a=Qi(e.manifest),o=Qi(n),s=Ar({manifest:r,moduleMapPath:t.moduleMapPath}),c=Yi({appRoot:e.appRoot,diagnosticsArtifactJson:o,diagnosticsSummary:n.summary,discoveryManifestJson:a,moduleMapSource:s,paths:t}),l=Qi(c);return await C(t.discoveryDirectoryPath,{recursive:!0}),await C(t.compileDirectoryPath,{recursive:!0}),await Promise.all([w(t.compiledManifestPath,i),w(t.diagnosticsPath,o),w(t.discoveryManifestPath,a),w(t.moduleMapPath,s),w(t.compileMetadataPath,l)]),{compiledManifest:r,diagnosticsArtifact:n,metadata:c,moduleMapSource:s,paths:t}}function Zi(e){return be(`sha256`).update(e).digest(`hex`)}function Qi(e){return`${JSON.stringify(e,null,2)}\n`}function $i(e,t){return D(fe(S(e),t))}var ea=class extends Error{result;constructor(e){super(ra({diagnostics:e.diagnostics,diagnosticsPath:e.paths.diagnosticsPath})),this.name=`CompileAgentError`,this.result=e}};async function ta(e={}){let t=e.source??dn(),n=await In(e.startPath,{source:t}),r=await Nn({...n,source:t}),i=await Xi({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(He(r.diagnostics))throw new ea(a);return na(r.diagnostics),a}function na(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 ra(e){let t=Ve(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
|
+
`);n.push(`Discovery diagnostics:`);for(let t of e.diagnostics)n.push(`- ${ia(t.severity)}: ${t.message}`),n.push(` source: ${t.sourcePath}`);return n.join(`
|
|
9
|
+
`)}function ia(e){return e===`error`?`Error`:`Warning`}const aa=Symbol.for(`experimental-ash.context-key-registry`),oa=globalThis;oa[aa]===void 0&&(oa[aa]=new Map);const sa=oa[aa];var z=class{name;codec;constructor(e,t={}){this.name=e,this.codec=t.codec,sa.set(e,this)}};const ca=Symbol.for(`experimental-ash.context-storage`),la=globalThis;la[ca]===void 0&&(la[ca]=new De);const ua=la[ca];function B(){let e=ua.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 da(e){return{debug(t,n){_a(`debug`,e,t,n)},info(t,n){_a(`info`,e,t,n)},warn(t,n){_a(`warn`,e,t,n)},error(t,n){_a(`error`,e,t,n),ya(t,n)}}}function fa(){return crypto.randomUUID()}function pa(e,t){let n={errorId:t??fa(),message:ha(e)},r=ma(e);return r!==void 0&&(n.name=r),n.detail=ba(e),n}function ma(e){if(e instanceof Error)return e.name===`Error`?void 0:e.name;if(d(e)&&f(e.name)&&e.name!==`Error`)return e.name}function ha(e){return d(e)&&!(e instanceof Error)&&typeof e.message==`string`?e.message:Ae(e)}function ga(e,t){let n=t instanceof Error?t.message:Ae(t),r=t instanceof Error?t.name:`Error`;e.setStatus({code:Oe.ERROR,message:n}),e.recordException({message:n,name:r,stack:ba(t)})}function _a(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,va(r))}function va(e){let t={};for(let[n,r]of Object.entries(e))if(r!==void 0){if(r instanceof Error){t[n]=pa(r);continue}t[n]=r}return t}function ya(e,t){let n=ke.getActiveSpan();if(n===void 0)return;let r=t?.error;if(r instanceof Error){ga(n,r);return}n.addEvent(e,t?va(t):void 0)}function ba(e){return xa(je(e,{breakLength:1/0,compact:!1,depth:10,maxStringLength:8192}),16384)}function xa(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 Sa(e){if(e.message!==void 0)return{inputResponses:e.inputResponses,message:e.message,modelContext:e.modelContext};if(e.inputResponses!==void 0&&e.inputResponses.length>0)return{inputResponses:e.inputResponses,modelContext:e.modelContext};if(e.modelContext!==void 0&&e.modelContext.length>0)return{modelContext:e.modelContext}}function Ca(e){return e.kind??`unknown`}const wa={kind:`http`};new z(`ash.auth`),new z(`ash.initiatorAuth`);const Ta=new z(`ash.sessionId`),Ea=new z(`ash.continuationToken`);new z(`ash.mode`),new z(`ash.parentSession`),new z(`ash.capabilities`),new z(`ash.sessionPrepared`);const Da={kind:`schedule`},Oa=da(`execution.subagent-adapter`),ka=new Map;function Aa(e){return ka.get(e)}function ja(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 Ma={kind:`subagent`,async"input.requested"(e,t){let n=t.state;ja(n)&&await Na({hookPayload:{callId:n.callId,childContinuationToken:t.ctx.require(Ea),childSessionId:t.ctx.require(Ta),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 Na(e){"use step";let t=Aa(e.hookPayload.childContinuationToken);try{if(t!==void 0){t(e.hookPayload);return}await Ee(e.parentContinuationToken,e.hookPayload)}catch(t){let n=fa();throw Oa.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 V=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)}},Pa=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 V(this.registry,n.duplicateMessage??`Duplicate ${this.registry} name "${e}".`,{...n.location,entryName:e});if(this._reserved.has(e))throw new V(this.registry,n.reservedMessage??`${Fa(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 Fa(e){return e.length===0?e:e.charAt(0).toUpperCase()+e.slice(1)}const Ia=[wa,Ma,Da],La=new Set([`kind`,`state`,`deliver`,`contextProviders`,`createAdapterContext`,`fetchFile`]);function Ra(e){let t=new Map,n=new Set;for(let e of Ia){let r=Ba(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=Ba(i,e);if(n.has(a)){if(Va(i))throw new V(`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 za(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 Ba(e,t){let n=Ca(e);if(n===`unknown`)throw new V(`adapter`,"Adapters must declare a non-empty `kind` field.",{entryName:`unknown`,logicalPath:t?.logicalPath,sourceId:t?.sourceId});return n}function Va(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(!La.has(t)&&typeof n==`function`)return!0;return!1}function Ha(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 Ua(e){return e.kind===`disk`?e.appRoot:void 0}function Wa(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 H(e){let t=Ga(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 Ga(e){let t=e.replaceAll(`\\`,`/`);return t===`/`?t:t.replace(/\/+$/,``)}function Ka(e){return Me(e,{prefix:void 0}).message}function qa(e=`test-session`){return{bundleCache:new Map,bundleCacheKeyBySourceKey:new Map,compiledArtifacts:null,id:e}}const Ja=Symbol.for(`experimental-ash.runtime-session-storage`),Ya=Symbol.for(`experimental-ash.runtime-session-default`),U=globalThis;U[Ja]===void 0&&(U[Ja]=new De);const Xa=U[Ja];function Za(){return U[Ya]===void 0&&(U[Ya]=qa(`process-default`)),U[Ya]}function Qa(){return Xa.getStore()??Za()}function $a(){return Qa().compiledArtifacts}const eo=y.object({path:y.string(),sha256:y.string()}).strict(),to=y.object({compile:y.object({moduleMap:eo}).strict(),discovery:y.object({diagnostics:eo,manifest:eo,sourceGraphHash:y.string(),summary:y.object({errors:y.number().finite(),warnings:y.number().finite()}).strict()}).strict(),generator:y.object({name:y.string(),version:y.string()}).strict(),kind:y.literal(`ash-compile-metadata`),status:y.union([y.literal(`failed`),y.literal(`ready`)]),version:y.literal(5)}).strict();var no=class extends Error{metadataPath;constructor(e,t){super(e),this.name=`LoadCompileMetadataError`,t!==void 0&&(this.metadataPath=t)}};async function ro(e){let t=e.metadataPath??(e.compiledArtifactsSource.kind===`disk`?H(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 no(ao(e),t)}return io(n,t)}let n=$a()?.metadata;return n===void 0?null:io(n,`bundled compile metadata`)}function io(e,t){let n=to.safeParse(e);if(!n.success)throw new no(`Expected "${t}" to contain valid Ash compile metadata. ${Ka(n.error)}`,t);return n.data}function ao(e){return e instanceof Error?e.message:`Unknown compile metadata load failure.`}async function oo(e){let t=Wa(e),n=await so(e);try{let r=(await ro({compiledArtifactsSource:e}))?.discovery.sourceGraphHash;return r===void 0||r.length===0?n===void 0?t:`${t}:mtime-${co(n)}`:n===void 0?`${t}:${r}`:`${t}:${r}:mtime-${co(n)}`}catch{return n===void 0?t:`${t}:mtime-${co(n)}`}}async function so(e){if(e.kind!==`disk`)return;let{stat:t}=await import(`node:fs/promises`),{compileMetadataPath:n}=H(e.appRoot);try{return(await t(n)).mtimeMs}catch{return}}function co(e){return Math.floor(e).toString(36)}const lo=`__root__`;function uo(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 fo=`bundled compiled manifest`;var po=class extends Error{manifestPath;constructor(e,t){super(e),this.name=`LoadCompiledManifestError`,t!==void 0&&(this.manifestPath=t)}};async function mo(e){let t=e.manifestPath??(e.compiledArtifactsSource.kind===`disk`?H(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 po(go(e),t)}return ho(n,t)}let n=$a();if(n!==null)return ho(n.manifest,fo);throw new po(`Compiled manifest is unavailable without an app root or bundled compiled artifacts.`,fo)}function ho(e,t){let n=pr.safeParse(e);if(!n.success)throw new po(`Expected "${t}" to contain a valid compiled Ash agent manifest. ${Ka(n.error)}`,t);return n.data}function go(e){return e instanceof Error?e.message:`Unknown manifest load failure.`}const _o=`bundled compiled module map`;var vo=class extends Error{moduleMapPath;constructor(e,t){super(e),this.name=`LoadCompiledModuleMapError`,t!==void 0&&(this.moduleMapPath=t)}};async function yo(e){let t=e.moduleMapPath??(e.compiledArtifactsSource.kind===`disk`?H(e.compiledArtifactsSource.appRoot).moduleMapPath:void 0);if(t!==void 0){let e=So(t);try{let n=await import(e);return bo(n.moduleMap??n.default,t)}catch(e){throw new vo(xo(e),t)}}let n=$a();if(n!==null)return bo(n.moduleMap,_o);throw new vo(`Compiled module map is unavailable without an app root or bundled compiled artifacts.`,_o)}function bo(e,t){let n=kr.safeParse(e);if(!n.success)throw new vo(`Expected "${t}" to export a valid compiled Ash module map. ${Ka(n.error)}`,t);return n.data}function xo(e){return e instanceof Error?e.message:`Unknown module-map load failure.`}function So(e){let t=e.replaceAll(`\\`,`/`);return/^[A-Za-z]:\//.test(t)?`file:///${encodeURI(t)}`:t.startsWith(`/`)?`file://${encodeURI(t)}`:t}const W=`/workspace`;function Co(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=>wo(e))].join(`
|
|
10
|
+
`)}function wo(e){return`- ${e.name}: ${e.description} (path: ${W}/skills/${e.name}/SKILL.md)`}function To(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 \`${W}\`.`,`- Root entries under ${W}/:`,...e.rootEntries.map(e=>` - ${e}`),`- Treat \`${W}\` 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 Eo(e){return e instanceof Error&&e.name===`ConnectionAuthorizationRequiredError`}function Do(e){return e instanceof Error&&e.name===`ConnectionAuthorizationFailedError`}function Oo(e){return e?.startAuthorization!==void 0}const ko=Object.freeze({__ashPlaceholder:`connection-authorization`}),Ao=new z(`ash.pendingConnectionToolCalls`);function jo(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 Mo(e,t){return`${e}__${t}`}const No=da(`framework.connection-search`),Po=new z(`ash.connectionRegistry`),Fo=new z(`ash.pendingConnectionAuthorizations`),Io=new z(`ash.discoveredConnectionTools`),Lo={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 Ro(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(Io,{byConnection:{}}),e.set(Fo,[]),e.set(Ao,[]),{}},sourceId:`ash:connection-search-tool`,sourceKind:`module`};async function Ro(e,t){let n=B(),r=n.get(Po);if(r===void 0)return[];let i=e.limit??10,a=zo(e.keywords),o=[],s=[],c=e.connection!==void 0&&e.connection!==``?r.getConnections().filter(t=>t.connectionName===e.connection):r.getConnections(),l={...n.get(Io)?.byConnection},u=[];for(let e of c){let t;try{t=await r.getClient(e.connectionName).getToolMetadata()}catch(t){if(Eo(t)){u.push({connectionName:e.connectionName,description:e.description}),s.push({connection:e.connectionName,description:e.description,needsAuthorization:!0});continue}if(Do(t)){No.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`;No.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=Bo(a,n);t>0&&o.push({item:{connection:e.connectionName,description:n.description,inputSchema:n.inputSchema,qualifiedName:Mo(e.connectionName,n.name),tool:n.name},score:t})}}n.set(Io,{byConnection:l});let d=[];if(u.length>0){for(let e of u)Ho(n,e);d=u.map(e=>e.connectionName).filter(e=>Vo(r,e))}if(d.length>0&&t?.toolCallId!==void 0){let r=n.get(Ao);return n.set(Ao,jo(r,[{args:e,connectionNames:d,kind:`connection-discover`,toolCallId:t.toolCallId,toolName:`connection_search`}])),ko}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 zo(e){return e.toLowerCase().split(/[\s_\-./]+/).filter(e=>e.length>1)}function Bo(e,t){let n=zo(t.name),r=zo(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 Vo(e,t){return e===void 0?!1:Oo(e.getConnections().find(e=>e.connectionName===t)?.authorization)}function Ho(e,t){let n=e.get(Fo)??[];n.some(e=>e.connectionName===t.connectionName)||e.set(Fo,[...n,t])}const Uo=Lo.name;function Wo(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 ${Uo} 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 Go(e){return[...Ko(e.instructions),...qo(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.`]:[],...Jo(e.connections),...Yo(e.skills)]}function Ko(e){if(e===void 0)return[];let t=e.markdown.trim();return t.length===0?[]:[`Instructions (${e.name})\n${t}`]}function qo(e){if(e===void 0)return[];let t=To(e);return t===void 0?[]:[t]}function Jo(e){return!e||e.length===0?[]:[Wo(e)]}function Yo(e){if(!e||e.length===0)return[];let t=Co(e);return t===null?[]:[t]}function Xo(e){let t=e.agent,n=Zo(t);return{id:t.config.name,instructions:Go({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 Zo(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 Qo=new Set([`aud`,`exp`,`iat`,`iss`,`jti`,`nbf`,`sub`]);function $o(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 es(e){let t=$o(e);return Object.freeze(Object.fromEntries(Object.entries(t).filter(([e])=>!Qo.has(e))))}function ts(e,t){let n=$o(e);if(t.subjects!==void 0){let n=typeof e.sub==`string`?e.sub:null;if(n===null||!t.subjects.some(e=>rs(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 ns(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=$o(e.payload);return{attributes:es(e.payload),authenticator:e.authenticator,claims:r,issuer:t,principalId:`${t}:${n}`,principalType:e.principalType,subject:n}}function rs(e,t){if(!e.includes(`*`))return e===t;let n=e.replaceAll(/[.+?^${}()|[\]\\]/g,`\\$&`).replaceAll(`*`,`.*`);return RegExp(`^${n}$`).test(t)}const is=y.object({issuer:y.string().optional(),jwks_uri:y.string().url()}).passthrough(),as=new Map,os=new Map;async function ss(e){let t;try{t=await cs(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 Fe(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&&us({issuer:e.strategy.issuer,payload:n.payload}),i=r&&ds({payload:n.payload});return!r&&!ts(n.payload,e.strategy)?{kind:`caller-not-allowed`}:{kind:`authenticated`,principal:ns({authenticator:`oidc`,payload:n.payload,principalType:i?`runtime`:`service`})}}catch{return{kind:`not-authenticated`}}}async function cs(e){let t=await ls(e.discoveryUrl),n=os.get(t.jwks_uri);if(n!==void 0)return n;let r=Ne(new URL(t.jwks_uri));return os.set(t.jwks_uri,r),r}async function ls(e){let t=as.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 is.parse(await e.json())}).catch(t=>{throw as.delete(e),t});return as.set(e,n),await n}function us(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 ds(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 fs(e){return{attributes:e.attributes,authenticator:e.authenticator,issuer:e.issuer,principalId:e.principalId,principalType:e.principalType,subject:e.subject}}const G=da(`auth.vercel-oidc`);async function ps(e,t){return e===null||e.length===0?{kind:`not-authenticated`}:await ss({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 ms(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 hs(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`,gs(e));return Response.json({code:n,error:r,ok:!1},{headers:a,status:t})}function gs(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}="${_s(t)}"`).join(`, `);return`${e.scheme} ${t}`}function _s(e){return e.replaceAll(`\\`,`\\\\`).replaceAll(`"`,`\\"`)}function vs(){return()=>void 0}async function ys(e,t={}){if(e===null||e.length===0)return G.debug(`Rejected request without a bearer token.`),{ok:!1};let n=xs(e);if(n===null)return G.debug(`Rejected token that failed to decode as a JWT.`),{ok:!1};if(!n.issuer.startsWith(`https://oidc.vercel.com/`))return G.debug(`Rejected token whose issuer is not a Vercel OIDC issuer.`,{issuer:n.issuer}),{ok:!1};if(n.audiences.length===0)return G.debug(`Rejected token with no audience claim.`,{issuer:n.issuer}),{ok:!1};let r=await ps(e,{acceptCurrentVercelProject:!0,audiences:n.audiences,issuer:n.issuer,subjects:t.subjects??[]});return r.kind===`authenticated`?(G.debug(`Accepted Vercel OIDC token.`,{issuer:n.issuer,principalType:r.principal.principalType,subject:r.principal.subject}),{ok:!0,sessionAuth:fs(r.principal)}):(G.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 bs(e={}){return async t=>{let n=await ys(ms(t.headers.get(`authorization`)),e);return n.ok?n.sessionAuth:null}}function xs(e){let t;try{t=Pe(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 Ss(e){return Number.isFinite(e)&&Number.isInteger(e)&&e>=0}function Cs(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: ${p(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`||!Ss(o))throw Error(`AttachmentRef payload "size" must be a non-negative integer. Got: ${JSON.stringify(o)}.`);return{params:a,size:o}}function ws(e){return e instanceof URL&&e.protocol===`ash-attachment:`}function Ts(e){return typeof Buffer<`u`&&Buffer.isBuffer(e)||e instanceof Uint8Array||e instanceof ArrayBuffer?e.byteLength:typeof e==`string`?Es(e):ws(e)?Cs(e).size??null:e instanceof URL&&e.protocol===`data:`?Es(e.href):null}function Es(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 Ds(r);try{return Buffer.byteLength(decodeURIComponent(r),`utf8`)}catch{return Buffer.byteLength(r,`utf8`)}}return/^https?:\/\//.test(e)?null:Ds(e)}function Ds(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 Os=Object.freeze({allowedMediaTypes:`*`,maxBytes:25*1024*1024});function ks(e,t=Os){if(e===`disabled`)return`disabled`;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 As(e,t){if(t===`disabled`)return!1;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 js(e,t){if(t===`disabled`||!As(e.mediaType,t)){let n={allowedMediaTypes:t===`disabled`||t.allowedMediaTypes===`*`?[]:[...t.allowedMediaTypes],kind:`disallowed-media-type`,mediaType:e.mediaType};return e.filename===void 0?n:{...n,filename:e.filename}}let n=Ts(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 Ms(e,t){if(typeof e==`string`)return[];let n=[];for(let r of e){if(r.type!==`file`)continue;let e=js(r,t);e!==null&&n.push(e)}return n}function Ns(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 Ps(e,t){return{method:`POST`,path:e,handler:t}}function Fs(e,t){return{method:`GET`,path:e,handler:t}}function Is(e){let t=Ls(e);return{__kind:`ash:channel`,routes:e.routes,adapter:t,receive:e.receive}}function Ls(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,i=t.session;return{...n?e.context(r,i):{},state:r,ctx:t.ctx,session:i}},deliver(e){return Sa(e)},...a}}function Rs(e){let t=ks(e.uploadPolicy);return Is({routes:[Ps(`/ash/v1/session`,async(n,{send:r})=>{let i=await zs(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=Bs(o);if(s instanceof Response)return s;let c=Ws(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`,[v]:u.id},status:202})}),Ps(`/ash/v1/session/:sessionId`,async(n,{send:r,getSession:i,params:a})=>{let o=await zs(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=Vs(l);if(u instanceof Response)return u;let d=Ws(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`,[v]:f.id},status:200})}),Fs(`/ash/v1/session/:sessionId/stream`,async(t,{getSession:n,params:r})=>{let i=await zs(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=Ks(t);if(o instanceof Response)return o;try{let e=qs(await n(a).getEventStream({startIndex:o}));return new Response(e,{headers:{"cache-control":`no-store`,"content-type":ie,[v]:a,[re]:te,[ae]:`14`}})}catch{return Response.json({error:`Session not found.`,ok:!1},{status:404})}})]})}async function zs(e,t){let n=await e(t);return n===null?hs({challenges:[{scheme:`Bearer`}]}):n??null}function Bs(e){let t=Hs(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 Vs(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=Hs(e.message);if(n instanceof Response)return n;let r=Gs(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 Hs(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=Us(n);if(e instanceof Response)return e;t.push(e)}return t}function Us(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 Ws(e,t){if(!e.message)return null;let n=Ms(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:Ns(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 Gs(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 Ks(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 qs(e){let t=new TextEncoder;return e.pipeThrough(new TransformStream({transform(e,n){n.enqueue(t.encode(`${JSON.stringify(e)}\n`))}}))}function Js(){return new Response(`<!doctype html>
|
|
14
|
+
<html lang="en">
|
|
15
|
+
<head>
|
|
16
|
+
<meta charset="utf-8" />
|
|
17
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
18
|
+
<title>Authorization complete</title>
|
|
19
|
+
<style>
|
|
20
|
+
:root {
|
|
21
|
+
color-scheme: light dark;
|
|
22
|
+
--bg: #fafafa;
|
|
23
|
+
--fg: #111111;
|
|
24
|
+
--muted: #525252;
|
|
25
|
+
--card-bg: #ffffff;
|
|
26
|
+
--card-border: #e5e5e5;
|
|
27
|
+
}
|
|
28
|
+
@media (prefers-color-scheme: dark) {
|
|
29
|
+
:root {
|
|
30
|
+
--bg: #0a0a0a;
|
|
31
|
+
--fg: #fafafa;
|
|
32
|
+
--muted: #a3a3a3;
|
|
33
|
+
--card-bg: #171717;
|
|
34
|
+
--card-border: #262626;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
body {
|
|
38
|
+
margin: 0;
|
|
39
|
+
min-height: 100vh;
|
|
40
|
+
display: grid;
|
|
41
|
+
place-items: center;
|
|
42
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
|
|
43
|
+
background: var(--bg);
|
|
44
|
+
color: var(--fg);
|
|
45
|
+
}
|
|
46
|
+
.card {
|
|
47
|
+
max-width: 28rem;
|
|
48
|
+
padding: 2rem 2.25rem;
|
|
49
|
+
border: 1px solid var(--card-border);
|
|
50
|
+
border-radius: 12px;
|
|
51
|
+
background: var(--card-bg);
|
|
52
|
+
color: var(--fg);
|
|
53
|
+
text-align: center;
|
|
54
|
+
}
|
|
55
|
+
h1 { font-size: 1.25rem; margin: 0 0 0.5rem; color: var(--fg); }
|
|
56
|
+
p { margin: 0; color: var(--muted); line-height: 1.5; }
|
|
57
|
+
</style>
|
|
58
|
+
</head>
|
|
59
|
+
<body>
|
|
60
|
+
<main class="card">
|
|
61
|
+
<h1>Authorization complete</h1>
|
|
62
|
+
<p>You can close this tab and return to your app.</p>
|
|
63
|
+
</main>
|
|
64
|
+
</body>
|
|
65
|
+
</html>`,{headers:{"cache-control":`no-store`,"content-type":`text/html; charset=utf-8`},status:200})}const Ys=[`GET`,`POST`];function Xs(){return Ys.map(e=>Qs(e))}function Zs(){return new Set(Ys.map($s))}function Qs(e){let t=$s(e);return{name:t,method:e,urlPath:se,fetch:ec,logicalPath:`framework://channels/${t}`,sourceId:`ash:framework:connection-callback-${e.toLowerCase()}`,sourceKind:`module`}}function $s(e){return`.well-known/ash/v1/connections/callback/${e.toLowerCase()}`}async function ec(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 tc(e);try{await Ee(r,i)}catch{return Response.json({error:`Connection callback not pending.`,ok:!1},{status:404})}return Js()}async function tc(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 nc(){let e=Rs({auth:ic()}),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(...Xs()),t}function rc(){return new Set([`ash`,...Zs()])}function ic(){return process.env.VERCEL?bs():vs()}const ac=oe.omit({action:!0,display:!0,requestId:!0}),{$schema:oc,...sc}=y.toJSONSchema(ac),cc={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:sc,logicalPath:`ash:framework/ask-question`,name:`ask_question`,sourceId:`ash:ask-question-tool`,sourceKind:`module`};async function K(){let e=B().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 lc(e){if(!e.startsWith(`/`))throw Error(`filePath must be an absolute path. Received: "${e}". Use an absolute path such as /workspace/foo.ts.`)}function uc(e){return fc(e,`head`)}function dc(e){return fc(e,`tail`)}function fc(e,t){let n=e.split(`
|
|
66
|
+
`),r=mc(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=pc(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 pc(e){return e.length<=2e3?e:e.slice(0,2e3)+` [truncated]`}function mc(e){return e.length>0&&e[e.length-1]===``?e.length-1:e.length}async function hc(e){let t=await(await K()).runCommand({command:e.command}),n=dc(t.stdout),r=dc(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 gc={additionalProperties:!1,properties:{command:{description:`The shell command to execute.`,type:`string`}},required:[`command`],type:`object`};async function _c(e){return hc(e)}const vc={description:`Execute a shell command in the shared workspace environment.`,execute:_c,inputSchema:gc,logicalPath:`ash:framework/bash`,name:`bash`,sourceId:`ash:bash-tool`,sourceKind:`module`},yc=new z(`ash.readFile`);function q(e){return de.normalize(e)}function bc(e){return e}function xc(e){let t=be(`sha256`).update(e.content,`utf8`).digest(`hex`);return{byteLength:Buffer.byteLength(e.content,`utf8`),contentHash:t,filePath:e.filePath}}function Sc(e,t,n){let r=e.ensure(yc,()=>({byTarget:{}}));e.set(yc,{byTarget:{...r.byTarget,[t]:n}})}function Cc(e){e.set(yc,{byTarget:{}})}const wc=new Map;async function Tc(e){let t=wc.get(e.id);if(t!==void 0)return t;let n=Ec(e);wc.set(e.id,n);try{return await n}catch{return wc.delete(e.id),!1}}async function Ec(e){return(await e.runCommand({command:`command -v rg >/dev/null 2>&1`})).exitCode===0}function J(e){return`'${e.replace(/'/g,`'\\''`)}'`}async function Dc(e){let t=e.path??`/workspace`;lc(t);let n=q(t),r=Math.min(Math.max(1,e.limit??100),1e3),i=await K(),a=await Tc(i)?Oc({normalizedPath:n,pattern:e.pattern}):kc({normalizedPath:n,pattern:e.pattern}),o=await i.runCommand({command:a});if(o.exitCode!==0&&o.exitCode!==1)throw jc(a,o.exitCode,o.stderr);let s=o.stdout.split(`
|
|
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=q(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 Oc(e){return[`rg --files --hidden`,`--glob '!.git/*'`,`--glob ${J(e.pattern)}`,`-- ${J(e.normalizedPath)}`].join(` `)}function kc(e){let t=Ac(e.pattern),n=t.includes(`/`)?`-path ${J(`*/${t}`)}`:`-name ${J(t)}`;return[`find ${J(e.normalizedPath)}`,`-type f`,`-not -path '*/.git/*'`,n].join(` `)}function Ac(e){let t=e.replaceAll(`**`,`*`);for(;t.startsWith(`*/`);)t=t.slice(2);return t}function jc(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 Mc={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 Nc(e){return Dc(e)}const Pc={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:Nc,inputSchema:Mc,logicalPath:`ash:framework/glob`,name:`glob`,sourceId:`ash:glob-tool`,sourceKind:`module`};async function Fc(e){let t=e.path??`/workspace`;lc(t);let n=q(t),r=Math.min(Math.max(1,e.limit??100),1e3),i=e.context!==void 0&&e.context>0?e.context:0,a=await K(),o=await Tc(a)?Ic({contextLines:i,effectiveLimit:r,glob:e.glob,ignoreCase:e.ignoreCase??!1,literal:e.literal??!1,normalizedPath:n,pattern:e.pattern}):Lc({contextLines:i,effectiveLimit:r,glob:e.glob,ignoreCase:e.ignoreCase??!1,literal:e.literal??!1,normalizedPath:n,pattern:e.pattern}),s=await a.runCommand({command:o});if(s.exitCode!==0&&s.exitCode!==1)throw zc(o,s.exitCode,s.stderr);let c=s.stdout;return c.trim().length===0?{content:`No matches found`,matchCount:0,path:n,truncated:!1}:Rc({effectiveLimit:r,normalizedPath:n,stdout:c})}function Ic(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 ${J(e.glob)}`),e.contextLines>0&&t.push(`--context ${e.contextLines}`),t.push(`--max-count ${e.effectiveLimit}`),t.push(`--`),t.push(J(e.pattern)),t.push(J(e.normalizedPath)),t.join(` `)}function Lc(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=${J(e.glob)}`),e.contextLines>0&&t.push(`-C ${e.contextLines}`),t.push(`-m ${e.effectiveLimit}`),t.push(`--`),t.push(J(e.pattern)),t.push(J(e.normalizedPath)),t.join(` `)}function Rc(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=pc(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 zc(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 Bc={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 Vc(e){return Fc(e)}const Hc={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:Vc,inputSchema:Bc,logicalPath:`ash:framework/grep`,name:`grep`,sourceId:`ash:grep-tool`,sourceKind:`module`};async function Uc(e){let{filePath:t,offset:n,limit:r}=e;lc(t);let i=await K(),a=q(t),o=n??1,s=r??2e3;if(o<1)throw Error(`offset must be >= 1. Received: ${o}.`);let c=await i.readTextFile({path: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=xc({content:c,filePath:a}),f=bc(a);Sc(B(),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}: ${pc(h[e]??``)}`,n=Buffer.byteLength(t,`utf8`)+1;if(_+n>51200&&g.length>0){v=!0;break}g.push(t),_+=n}let ee=g.join(`
|
|
75
|
+
`),te=o+g.length-1;return te<u||v?{content:ee,nextOffset:te+1,path:a,totalLines:u,truncated:!0}:{content:ee,path:a,totalLines:u,truncated:!1}}const Wc={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 Gc(e){return Uc(e)}const Kc={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:Gc,inputSchema:Wc,logicalPath:`ash:framework/read-file`,name:`read_file`,onCompact({ctx:e}){return Cc(e),{}},sourceId:`ash:read-file-tool`,sourceKind:`module`},qc=/^---\r?\n[\s\S]*?\r?\n---\r?\n?/;function Jc(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 Yc(e,t){Jc(t);let n=await Xc(e),r=Zc(t,`SKILL.md`),i=await n.readTextFile({path:r});if(i===null)throw Error(`No skill named "${t}" at ${r}.`);return i.replace(qc,``)}async function Xc(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 Zc(e,t){return`${W}/skills/${e}/${t}`}async function Qc(e){let t=B().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 Yc(t,n)}const $c={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=>Qc(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`},el=new z(`ash.todo`);function tl(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 nl(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 rl(e){let t=B(),{todos:n}=e??{};if(n!==void 0){let e={items:[...n]};return t.set(el,e),nl(e)}return nl(t.ensure(el,()=>({items:[]})))}const il={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=>rl(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(el);if(t===void 0||t.items.length===0)return{};let n=tl(t);return n===void 0?{}:{messages:[{content:n,role:`user`}]}},sourceId:`ash:todo-tool`,sourceKind:`module`};function al(e){let t=new Ie({bulletListMarker:`-`,codeBlockStyle:`fenced`,emDelimiter:`*`,headingStyle:`atx`,hr:`---`});return t.remove([`script`,`style`,`meta`,`link`]),t.turndown(e)}function ol(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
|
+
`),t=t.replace(/<br\s*\/?>/gi,`
|
|
80
|
+
`),t=t.replace(/<[^>]+>/g,``),t=ll(t),t=t.split(`
|
|
81
|
+
`).map(e=>e.replace(/[ \t]+/g,` `).trim()).join(`
|
|
82
|
+
`).replace(/\n{3,}/g,`
|
|
83
|
+
|
|
84
|
+
`).trim(),t}const sl={"&":`&`,">":`>`,"<":`<`," ":` `,""":`"`,"'":`'`,"'":`'`,"/":`/`},cl=new RegExp(Object.keys(sl).join(`|`),`gi`);function ll(e){return e.replace(cl,e=>sl[e.toLowerCase()]??e)}const ul=5*1024*1024;async function dl(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=fl(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":h},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)>ul)throw Error(`Response too large (exceeds 5 MB limit).`);let u=await c.arrayBuffer();if(u.byteLength>ul)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?al(p):n===`text`&&f?ol(p):p;let{output:g,truncated:_}=uc(m);return{content:g,contentType:d,truncated:_,url:t}}function fl(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 pl(e){return dl(e)}const ml={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:pl,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`},hl={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 gl(e){let{filePath:t,content:n}=e;lc(t);let r=await K(),i=B(),a=q(t),o=bc(a),s=await r.readTextFile({path:t});if(s===null)return await r.writeTextFile({content:n,path:t}),Sc(i,o,xc({content:n,filePath:a})),{existed:!1,path:a};let c=i.ensure(yc,()=>({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=xc({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({content:n,path:t}),Sc(i,o,xc({content:n,filePath:a})),{existed:!0,path:a}}const _l={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 vl(e){return gl(e)}const yl=[cc,vc,Pc,Hc,Kc,{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:vl,inputSchema:_l,logicalPath:`ash:framework/write-file`,name:`write_file`,sourceId:`ash:write-file-tool`,sourceKind:`module`},il,ml,hl,$c,Lo],bl=new Map([[Lo,e=>e.hasConnections]]);function xl(e){return yl.filter(t=>{let n=bl.get(t);return n===void 0||n(e)})}function Sl(){return new Set(yl.map(e=>e.name))}function Cl(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 Y=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 wl(e){return{exportName:e.exportName,logicalPath:e.logicalPath,sourceId:e.sourceId,sourceKind:`module`}}async function X(e){let t=e.nodeId??`__root__`,n=e.moduleMap.nodes[t]?.modules[e.definition.sourceId];if(n===void 0)throw new Y(`Missing compiled module namespace for ${e.kindLabel} source "${e.definition.sourceId}" in node "${t}".`,{logicalPath:e.definition.logicalPath,sourceId:e.definition.sourceId});return await s(r(c(n,`Missing compiled module namespace for ${e.kindLabel} source "${e.definition.sourceId}" in node "${t}".`),{exportName:e.definition.exportName,logicalPath:e.definition.logicalPath}))}async function Tl(e,t,n){try{let r=oi(await X({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=wl({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,definition:r,adapter:o,...i}}catch(t){throw t instanceof Y?t:new Y(`Failed to attach the channel definition from "${e.logicalPath}": ${p(t)}`,{logicalPath:e.logicalPath,sourceId:e.sourceId})}}async function El(e,t,n){try{let r=c(await X({definition:e,kindLabel:`connection`,moduleMap:t,nodeId:n}),`Expected the connection export "${e.exportName??`default`}" from "${e.logicalPath}" to return an object.`),i=r.auth!==void 0,a=r.headers!==void 0,o={connectionName:e.connectionName,description:e.description,exportName:e.exportName,logicalPath:e.logicalPath,sourceId:e.sourceId,sourceKind:`module`,url:e.url};if(i)try{o.authorization=di(r.auth,`Connection "${e.connectionName}" at "${e.logicalPath}":`)}catch(t){throw new Y(p(t),{logicalPath:e.logicalPath,sourceId:e.sourceId})}return a&&(o.headers=r.headers),r.tools!==void 0&&(o.tools=r.tools),typeof r.approval==`function`&&(o.approval=r.approval),o}catch(t){throw t instanceof Y?t:new Y(`Failed to resolve connection "${e.connectionName}" from "${e.logicalPath}": ${p(t)}`,{logicalPath:e.logicalPath,sourceId:e.sourceId})}}async function Dl(e,t,n){try{let r=c(await X({definition:e,kindLabel:`hook`,moduleMap:t,nodeId:n}),Z(e,`to return an object`)),i={},a={},s=r.lifecycle;if(s!==void 0){let t=c(s,Z(e,"to expose `lifecycle` as an object"));for(let n of[`session`,`turn`]){let r=t[n];r!==void 0&&(i[n]=o(r,Z(e,`to provide a function for "lifecycle.${n}"`)))}}let l=r.events;if(l!==void 0){let t=c(l,Z(e,"to expose `events` as an object"));for(let[n,r]of Object.entries(t))r!==void 0&&(a[n]=o(r,Z(e,`to provide a function for "events.${n}"`)))}return{events:a,exportName:e.exportName,lifecycle:i,logicalPath:e.logicalPath,slug:e.slug,sourceId:e.sourceId,sourceKind:`module`}}catch(t){throw t instanceof Y?t:new Y(`Failed to attach hook handlers from "${e.logicalPath}": ${p(t)}`,{logicalPath:e.logicalPath,sourceId:e.sourceId})}}function Z(e,t){return`Expected the hook export "${e.exportName??`default`}" from "${e.logicalPath}" ${t}.`}var Ol=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 kl(e){let t=[];for await(let n of e)t.push(n);return Buffer.concat(t)}function Al(e){return new ReadableStream({start(t){t.enqueue(e),t.close()}})}function Q(e){return{id:e.id,resolvePath(t){return e.resolvePath(t)},async runCommand(t){return await e.runCommand(t)},async readFile(t){return await e.readFile({abortSignal:t.abortSignal,path:e.resolvePath(t.path)})},async readBinaryFile(t){let n=await e.readFile({abortSignal:t.abortSignal,path:e.resolvePath(t.path)});return n===null?null:await kl(n)},async readTextFile(t){jl(t);let n=await e.readFile({abortSignal:t.abortSignal,path:e.resolvePath(t.path)});return n===null?null:Nl(Pl(await kl(n),t.encoding??`utf-8`),t)},async writeFile(t){await e.writeFile({abortSignal:t.abortSignal,content:t.content,path:e.resolvePath(t.path)})},async writeBinaryFile(t){await e.writeFile({abortSignal:t.abortSignal,content:Al(t.content),path:e.resolvePath(t.path)})},async writeTextFile(t){let n=Fl(t.content,t.encoding??`utf-8`);await e.writeFile({abortSignal:t.abortSignal,content:Al(n),path:e.resolvePath(t.path)})}}}function jl(e){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 Ml(e){let t=[],n=0;for(let r=0;r<e.length;r++)e[r]===`\r`?r+1<e.length&&e[r+1]===`
|
|
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 Nl(e,t){if(t.startLine===void 0&&t.endLine===void 0)return e;let n=Ml(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 Pl(e,t){return t===`utf-8`||t===`utf8`?new TextDecoder(`utf-8`,{fatal:!0}).decode(e):Buffer.from(e.buffer,e.byteOffset,e.byteLength).toString(t)}function Fl(e,t){return t===`utf-8`||t===`utf8`?new TextEncoder().encode(e):Buffer.from(e,t)}function Il(e={}){return{name:`local`,async prewarm(e){let t=Hl(fd(e.runtimeContext.appRoot),e.templateKey);if(await Xl(t))return;let n=await Ll({sessionKey:e.templateKey,snapshotPath:t}),r=Q(zl(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({content:t.content,path:t.path}):await r.writeBinaryFile({content:t.content,path:t.path});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=fd(e.runtimeContext.appRoot),n=await Jl(Hl(t,e.templateKey));if(n===null)throw new Ol({backendName:`local`,templateKey:e.templateKey});let r=Zl(e.existingMetadata)??Ul(t,e.sessionKey);return await Xl(r)||await Yl(r,n),Rl(await Ll({sessionKey:e.sessionKey,snapshotPath:r}))}}}async function Ll(e){let{Bash:t,InMemoryFs:n}=await import(`#compiled/just-bash/index.js`),r=await Jl(e.snapshotPath),i=new n(Wl(r));await Gl(i),await Kl(i,r?.entries??[]);let a=new t({cwd:W,env:r?.env,fs:i,network:{dangerouslyAllowFullInternetAccess:!0}});return{async captureSnapshot(){let t=await ql({filesystem:i,sandbox:a});return await Yl(e.snapshotPath,t),{snapshotPath:e.snapshotPath}},async dispose(){await a.dispose?.()},async executeCommand(e){if(e.abortSignal?.aborted)throw new DOMException(`The operation was aborted.`,`AbortError`);let t=e.workingDirectory===void 0?e.command:`( cd ${J(e.workingDirectory)} && ${e.command} )`,n=a.exec(t),r=e.abortSignal?await Bl(n,e.abortSignal):await n;return{exitCode:r.exitCode,stderr:r.stderr,stdout:r.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=b(t.path);await i.mkdir(e,{recursive:!0}),await i.writeFile(t.path,t.content)}}}}function Rl(e){let t=Q(zl(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 zl(e){return{id:e.sessionKey,resolvePath:Vl,async runCommand(t){return await e.executeCommand(t)},async readFile(t){let n=await e.readFileBytes(t.path);return n===null?null:Al(n)},async writeFile(t){let n=await kl(t.content);await e.writeFiles([{content:n,path:t.path}])}}}async function Bl(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 Vl(e){return e.startsWith(`/`)?e:`${W}/${e}`}function Hl(e,t){return x(e,`local`,`templates`,`${t}.json`)}function Ul(e,t){return x(e,`local`,`sessions`,`${t}.json`)}function Wl(e){let t={};for(let n of e?.entries??[])n.kind===`file`&&(t[n.path]=Buffer.from(n.contentBase64,`base64`));return t}async function Gl(e){await e.mkdir(W,{recursive:!0})}async function Kl(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 ql(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 Jl(e){if(!await Xl(e))return null;let t=JSON.parse(await ge(e,`utf8`));return t.version===1?t:null}async function Yl(e,t){await C(b(e),{recursive:!0}),await w(e,`${JSON.stringify(t,null,2)}\n`)}async function Xl(e){try{return await me(e),!0}catch{return!1}}function Zl(e){let t=e?.snapshotPath;return typeof t==`string`?t:void 0}function Ql(e){return Il({createOptions:e})}function $l(e={}){let t=e.loadSandboxModule??(async()=>await import(`#compiled/@vercel/sandbox/index.js`)),n={timeout:gu,...e.createOptions},r=new Map;return{name:`vercel`,async create(e){let i=fu(n.tags,e.tags),a;try{a=await eu({loadSandboxModule:t,prewarmedTemplates:r,templateKey:e.templateKey})}catch(t){throw Ol.is(t)?t:Error(`Failed to read sandbox template "${e.templateKey}": ${hu(t)}`,{cause:t})}let o;try{o=await nu({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}": ${hu(t)}`,{cause:t})}return ru(o,e.sessionKey)},async prewarm(e){let i;try{i=await tu({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}": ${hu(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 eu(e){let t=e.prewarmedTemplates.get(e.templateKey);if(t!==void 0)return t;let n=await lu(await e.loadSandboxModule(),e.templateKey);if(n===null||typeof n.currentSnapshotId!=`string`)throw new Ol({backendName:`vercel`,templateKey:e.templateKey});return{sandboxName:n.name,snapshotId:n.currentSnapshotId,templateKey:e.templateKey}}async function tu(e){let t=await e.loadSandboxModule(),n=await lu(t,e.templateKey),r=fu(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 pu(n,r);if(typeof n.currentSnapshotId==`string`&&n.currentSnapshotId.length>0)return{sandboxName:n.name,snapshotId:n.currentSnapshotId,templateKey:e.templateKey};await ou(n,e.createOptions);let i=Q(iu(n,e.templateKey));e.bootstrap!==void 0&&await e.bootstrap({use:async e=>(e!==void 0&&await n.update(e),i)});for(let t of e.seedFiles)typeof t.content==`string`?await i.writeTextFile({content:t.content,path:t.path}):await i.writeBinaryFile({content:t.content,path:t.path});let a=await n.snapshot();return{sandboxName:n.name,snapshotId:a.snapshotId,templateKey:e.templateKey}}async function nu(e){let t=du(e.existingMetadata)??e.sessionKey,n=await lu(e.sandboxModule,t);if(n!==null)return await pu(n,e.tags),n;let{runtime:r,...i}=e.createOptions,a={...i,name:t,persistent:!0,source:{snapshotId:e.snapshotId,type:`snapshot`}};return e.tags!==void 0&&(a.tags=e.tags),await e.sandboxModule.Sandbox.create(a)}function ru(e,t){return{session:Q(iu(e,t)),useSessionFn:async n=>(n!==void 0&&await e.update(n),Q(iu(e,t))),async captureState(){return{backendName:`vercel`,metadata:{sandboxName:e.name},sessionKey:t}},async dispose(){}}}function iu(e,t){return{id:t,resolvePath:au,async runCommand(t){let n=await e.runCommand({args:[`-lc`,t.command],cmd:`bash`,cwd:t.workingDirectory??`/workspace`,signal:t.abortSignal}),[r,i]=await Promise.all([n.stdout(),n.stderr()]);return{exitCode:n.exitCode,stderr:i,stdout:r}},async readFile(t){return await e.readFile({path:t.path})??null},async writeFile(t){let n=await kl(t.content);await e.writeFiles([{content:n,path:t.path}])}}}function au(e){return e.startsWith(`/`)?e:`${W}/${e}`}async function ou(e,t){await su(e,{failureMessage:`Failed to initialize Vercel sandbox workspace.`,script:`mkdir -p ${W} && chown ${cu}:${cu} ${W}`}),t.networkPolicy!==`deny-all`&&await su(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 su(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 cu=`vercel-sandbox`;async function lu(e,t){try{return await e.Sandbox.get({name:t})}catch(e){if(uu(e))return null;throw Error(`Failed to look up Vercel sandbox "${t}": ${hu(e)}`,{cause:e})}}function uu(e){return e instanceof Error?(e.response?.status??e.cause?.response?.status)===404:!1}function du(e){let t=e?.sandboxName;return typeof t==`string`?t:void 0}function fu(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>_u)throw Error(`Vercel Sandbox supports at most ${_u} tags. Ash reserves "agent", "channel", and "sessionId"; remove or consolidate custom tags passed to vercelBackend().`);return n}}async function pu(e,t){t===void 0||mu(e.tags,t)||await e.update({tags:t})}function mu(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 hu(e){return e instanceof Error?e.message:String(e)}const gu=1800*1e3,_u=5;function vu(e){return $l({createOptions:e})}function yu(e){return Ti(()=>process.env.VERCEL?vu(e?.vercel):Ql(e?.local))}async function bu(e,t,n){try{let r=c(await X({definition:e,kindLabel:`sandbox`,moduleMap:t,nodeId:n}),`Expected the sandbox export "${e.exportName??`default`}" from "${e.logicalPath}" to return an object.`);return{backend:xu(r.backend,e.logicalPath),bootstrap:r.bootstrap,description:e.description,exportName:e.exportName,logicalPath:e.logicalPath,onSession:r.onSession,sourceId:e.sourceId,sourceKind:`module`}}catch(t){throw t instanceof Y?t:new Y(`Failed to attach the sandbox lifecycle handlers from "${e.logicalPath}": ${p(t)}`,{logicalPath:e.logicalPath,sourceId:e.sourceId})}}function xu(e,t){if(e===void 0)return yu();if(typeof e==`function`)return Ti(e);if(typeof e!=`object`||!e)throw new Y(`Sandbox "${t}" exposed a non-object "backend" field. Use vercelBackend(), localBackend(), another factory that returns a SandboxBackend value, or a zero-arg callback returning one.`,{logicalPath:t});let n=e;if(typeof n.name!=`string`||n.name.length===0)throw new Y(`Sandbox "${t}" backend is missing a non-empty string "name" identifier.`,{logicalPath:t});if(typeof n.create!=`function`)throw new Y(`Sandbox "${t}" backend is missing a "create" function.`,{logicalPath:t});return n}async function Su(e,t,n){try{let r=c(await X({definition:e,kindLabel:`tool`,moduleMap:t,nodeId:n}),$(e,`to return an object`)),i=o(r.execute,$(e,`to provide an execute function`));return{description:e.description,execute:i,exportName:e.exportName,inputSchema:e.inputSchema,logicalPath:e.logicalPath,name:e.name,sourceId:e.sourceId,sourceKind:`module`,...Cu(r,e)}}catch(t){throw t instanceof Y?t:new Y(`Failed to attach the tool execute function from "${e.logicalPath}": ${p(t)}`,{logicalPath:e.logicalPath,sourceId:e.sourceId})}}function Cu(e,t){let n={};e.onCompact!==void 0&&(n.onCompact=o(e.onCompact,$(t,`to provide an onCompact function`))),e.needsApproval!==void 0&&(n.needsApproval=o(e.needsApproval,$(t,`to provide a needsApproval function`)));let r=wu(e,t);return r!==void 0&&(n.retentionPolicy=r),e.toModelOutput!==void 0&&(n.toModelOutput=o(e.toModelOutput,$(t,`to provide a toModelOutput function`))),e.inputSchema!==void 0&&Tu(e.inputSchema)&&(n.inputStandardSchema=e.inputSchema),n}function wu(e,t){let n=e.retentionPolicy;if(n!==void 0){if(n===`auto`||n===`keep`||typeof n==`function`)return n;throw new Y($(t,`to set retentionPolicy to "auto", "keep", or a function`),{logicalPath:t.logicalPath,sourceId:t.sourceId})}}function $(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 Tl(t,e.moduleMap,e.nodeId))}let i=await Promise.all(e.manifest.tools.map(t=>Su(t,e.moduleMap,e.nodeId))),a=await Promise.all(e.manifest.hooks.map(t=>Dl(t,e.moduleMap,e.nodeId))),o=await Promise.all(e.manifest.connections.map(t=>El(t,e.moduleMap,e.nodeId))),s=e.manifest.sandbox===null?null:await bu(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=wl(e.config.source)),t}function ku(e){return{sandbox:{definition:e.authoredSandbox??Au(),workspaceResourceRoot:e.workspaceResourceRoot}}}function Au(){return{backend:yu(),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 Pa(`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 V(`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 Pa(`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:I,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=xl({hasConnections:r}),a=r?Ku(i,n.connections):i,o=new Set(a.map(e=>e.name)),s=Sl(),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=rc();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=[...nc().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:Cl(n.hooks),nodeId:t,sandboxRegistry:h,sourceId:e.sourceId,subagentRegistry:g,toolRegistry:u,turnAgent:Xo({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__`?lo:e}const Gu=Lo.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([mo({compiledArtifactsSource:e}),Yu(e)]),r=await zu({manifest:t,moduleMap:n}),i=r.root;return{adapterRegistry:Ra({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 yo({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(Te(e.moduleMapLoaderPath).href)).loadCompiledModuleMapFromAuthoredSource({compiledArtifactsSource:e})}async function Zu(e){if(qu)return Ju(e);let t=Qa(),n=Wa(e),r=await oo(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=uo(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=Qa();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 z(`ash.channel`,{codec:{serialize(e){return{kind:Ca(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 za(n.adapterRegistry,e)}}});const td=new z(`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 z(`ash.session`);const nd=new z(`ash.sandbox`),rd=_(),id={workflowId:`workflow//${rd.name}@${rd.version}//workflowEntry`};function ad(e=process.cwd()){return S(e)}function od(e){return be(`sha256`).update(e).digest(`hex`).slice(0,12)}function sd(){return!!process.env.VERCEL}function cd(e,t=`all`){let n=x(e,`.ash`,`nitro`);return t===`all`?n:x(n,t)}function ld(e,t){return x(e,`.ash`,`nitro-output`,t)}function ud(e){let t=x(m(),`.ash`,`workflow-cache`);return dd(t),x(t,od(e))}function dd(e){if(!xe(e))return;let t=_().version,n;try{n=Ce(e)}catch{return}for(let r of n){let n=x(e,r),i=x(n,`ash-cache.json`);if(xe(i))try{let e=JSON.parse(Se(i,`utf8`));typeof e.ashVersion==`string`&&e.ashVersion!==t&&we(n,{force:!0,recursive:!0})}catch{}}}function fd(e){return x(e,`.ash`,`sandbox-cache`)}function pd(e){return sd()?x(e,`.vercel`,`output`):x(e,`.output`)}function md(e){return{appRoot:e,outputDir:pd(e),workflowId:id.workflowId,workflowBuildDir:ud(e),workflowSourceDir:g(`src/execution`)}}export{Tr as C,Fn as D,I as E,Ar as S,Er as T,Wa as _,ud as a,ti as b,rc as c,mo as d,lo as f,Ua as g,Ha as h,ld as i,nc as l,H as m,ad as n,$u as o,ro as p,cd as r,zu as s,md as t,W as u,ea as v,Dr as w,Mr as x,ta as y};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{E as e,S as t,T as n,_ as r,a as i,c as a,d as o,g as s,h as c,l,m as u,p as ee,s as te,u as d,x as f,y as p}from"./paths-
|
|
1
|
+
import{E as e,S as t,T as n,_ as r,a as i,c as a,d as o,g as s,h as c,l,m as u,p as ee,s as te,u as d,x as f,y as p}from"./paths-BcM3el4Q.js";import{t as m}from"./authored-module-loader-XcFLnl49.js";import{t as h}from"./errors-DsO9xmQL.js";import{i as g,t as _}from"./package-DmsQgn4v.js";import{join as v,posix as y}from"node:path";import{mkdir as ne,readFile as re,readdir as ie,realpath as b,writeFile as x}from"node:fs/promises";import{createHash as S}from"node:crypto";import{existsSync as C}from"node:fs";function w(e){return e.dev?{appRoot:e.appRoot,dev:e.dev,moduleMapLoaderPath:g(`src/internal/authored-module-map-loader.ts`)}:{appRoot:e.appRoot,dev:e.dev}}const T=`#ash-channel/`;function E(e){let t=e.compileResult.manifest.channels,n=new Set,r=[],i=new Set,o=a();for(let e of t){if(e.kind===`disabled`){if(!o.has(e.name))throw Error(`agent/channels/${e.name}.ts exports disableRoute() but "${e.name}" is not a framework channel. Rename the file to one of: ${[...o].sort().join(`, `)}.`);i.add(e.name);continue}n.add(e.name),r.push({method:e.method,route:e.urlPath})}let s=l().filter(e=>!n.has(e.name)&&!i.has(e.name)).map(e=>({method:e.method,route:e.urlPath})),c=new Set,u=[];for(let e of[...s,...r]){let t=k(e);c.has(t)||(c.add(t),u.push(e))}return u}function D(e,t){for(let n of t.registrations)A(e,{artifactsConfig:t.artifactsConfig,method:n.method,route:n.route})}function O(e,t){return N(t.previous,t.next)?!1:(j(e),D(e,{artifactsConfig:t.artifactsConfig,registrations:t.next}),e.routing.sync(),!0)}function k(e){return`${e.method.toUpperCase()} ${e.route}`}function A(e,t){let r=k(t),i=`${T}${r}`,a=n(g(`src/internal/nitro/routes/channel-dispatch.ts`));e.options.handlers.push({handler:i,method:t.method,route:t.route}),e.options.virtual[i]=[`import { dispatchChannelRequest } from ${a};`,`const config = ${JSON.stringify(t.artifactsConfig)};`,`export default (event) => dispatchChannelRequest(event, ${JSON.stringify(r)}, config);`].join(`
|
|
2
2
|
`)}function j(e){for(let t=e.options.handlers.length-1;t>=0;--t){let n=e.options.handlers[t];n!==void 0&&M(n)&&e.options.handlers.splice(t,1)}for(let t of Object.keys(e.options.virtual))t.startsWith(T)&&delete e.options.virtual[t]}function M(e){return e.handler.startsWith(T)}function N(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n+=1){let r=e[n],i=t[n];if(r===void 0||i===void 0||r.method!==i.method||r.route!==i.route)return!1}return!0}const P=`ash.schedule.`;var F=class extends Error{scheduleId;sourceId;taskName;constructor(e,t={}){super(e),this.name=`ScheduleRegistrationError`,t.scheduleId!==void 0&&(this.scheduleId=t.scheduleId),t.sourceId!==void 0&&(this.sourceId=t.sourceId),t.taskName!==void 0&&(this.taskName=t.taskName)}};function I(e){let t=e.map(e=>({cron:e.cron,description:`Run Ash schedule "${e.name}" from "${e.logicalPath}".`,logicalPath:e.logicalPath,scheduleId:e.name,sourceId:e.sourceId,taskName:R(e.sourceId)})).sort((e,t)=>e.sourceId.localeCompare(t.sourceId));return L(t),t}function L(e){let t=new Map;for(let n of e){let e=t.get(n.scheduleId);if(e===void 0){t.set(n.scheduleId,n);continue}throw new F(`Duplicate authored schedule id "${n.scheduleId}" found in "${e.logicalPath}" and "${n.logicalPath}".`,{scheduleId:n.scheduleId,sourceId:n.sourceId,taskName:n.taskName})}}function R(e){return`${P}${Buffer.from(e,`utf8`).toString(`base64url`)}`}const z=`#ash-schedule-task/`;function B(e,t){if(t.registrations.length!==0){e.options.experimental.tasks=!0;for(let n of t.registrations)U(e,{artifactsConfig:t.artifactsConfig,dispatchModulePath:t.dispatchModulePath,registration:n})}}function V(e,t){let n=!G(t.previous,t.next);return H(e),B(e,{artifactsConfig:t.artifactsConfig,dispatchModulePath:t.dispatchModulePath,registrations:t.next}),n}function H(e){for(let t of Object.keys(e.options.tasks))t.startsWith(`ash.schedule.`)&&delete e.options.tasks[t];for(let t of Object.keys(e.options.virtual))t.startsWith(z)&&delete e.options.virtual[t];for(let[t,n]of Object.entries(e.options.scheduledTasks)){let r=W(n).filter(e=>!e.startsWith(P));if(r.length===0){delete e.options.scheduledTasks[t];continue}if(r.length===1){let[n]=r;n!==void 0&&(e.options.scheduledTasks[t]=n);continue}e.options.scheduledTasks[t]=r}}function U(e,t){let r=`${z}${t.registration.taskName}`,i=n(t.dispatchModulePath);e.options.tasks[t.registration.taskName]={description:t.registration.description,handler:r},e.options.virtual[r]=[`import { dispatchScheduleTask } from ${i};`,`const config = ${JSON.stringify(t.artifactsConfig)};`,`export default {`,` meta: { description: ${JSON.stringify(t.registration.description)} },`,` async run(event) {`,` return { result: await dispatchScheduleTask(event.name, config) };`,` },`,`};`].join(`
|
|
3
3
|
`),ae(e,t.registration.cron,t.registration.taskName)}function ae(e,t,n){let r=e.options.scheduledTasks[t];if(r===void 0){e.options.scheduledTasks[t]=n;return}if(typeof r==`string`){e.options.scheduledTasks[t]=[r,n];return}r.includes(n)||r.push(n)}function W(e){return typeof e==`string`?[e]:[...e]}function G(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n+=1){let r=e[n],i=t[n];if(r===void 0||i===void 0||r.cron!==i.cron||r.description!==i.description||r.logicalPath!==i.logicalPath||r.scheduleId!==i.scheduleId||r.sourceId!==i.sourceId||r.taskName!==i.taskName)return!1}return!0}async function K(e){return[...e.manifest.schedules].map(e=>{let t={cron:e.cron,hasRun:e.hasRun,logicalPath:e.logicalPath,name:e.name,sourceId:e.sourceId,sourceKind:e.sourceKind};return e.markdown===void 0?t:{...t,markdown:e.markdown}})}async function q(e){return await K({manifest:await o({compiledArtifactsSource:e.compiledArtifactsSource})})}async function J(e){let t=v(e.outDir,`compiled-artifacts-bootstrap.mjs`),n=v(e.outDir,`compiled-artifacts-instrumentation.mjs`),r=se(e.compileResult.manifest.agentRoot);await ne(e.outDir,{recursive:!0}),await x(t,await le({compileResult:e.compileResult,installModulePath:g(`src/runtime/loaders/bundled-artifacts.ts`),moduleMapPath:t,metadata:e.compileResult.metadata})),r!==void 0&&await x(n,ue({agentName:e.compileResult.manifest.config.name,instrumentationPath:r,registerConfigPath:g(`src/harness/instrumentation-config.ts`)}));let i={bootstrapPath:t};return r!==void 0&&(i.instrumentationPluginPath=n,i.instrumentationSourcePath=r),i}const oe=[`.ts`,`.mts`,`.js`,`.mjs`];function se(e){for(let t of oe){let n=v(e,`instrumentation${t}`);if(C(n))return n}}function ce(e){return e.replace(/^export const moduleMap = /m,`const moduleMap = `).replace(/\nexport default moduleMap;\n?$/,`
|
|
4
4
|
`)}async function le(e){let r=ce(t({importSpecifierStyle:`absolute`,manifest:e.compileResult.manifest,moduleMapPath:e.moduleMapPath})).trim();return[`// Generated by Ash. Do not edit by hand.`,`import { installBundledCompiledArtifacts } from ${n(e.installModulePath)};`,``,r,``,`const metadata = ${JSON.stringify(e.metadata,null,2)};`,``,`const manifest = ${JSON.stringify(e.compileResult.manifest,null,2)};`,``,`export function installCompiledArtifactsBootstrap() {`,` installBundledCompiledArtifacts({`,` manifest,`,` metadata,`,` moduleMap,`,` });`,`}`,``,`installCompiledArtifactsBootstrap();`,``,`// Default export satisfies the Nitro plugin contract so this file`,`// can be used directly as a Nitro plugin without a separate wrapper.`,`export default function installCompiledArtifactsPlugin() {`,` // Already installed on import above.`,`}`,``,`export async function __ashInstallCompiledArtifactsStep() {`,` "use step";`,` return null;`,`}`,``].join(`
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{D as e,b as t,t as n,v as r,y as i}from"../../chunks/paths-
|
|
1
|
+
import{D as e,b as t,t as n,v as r,y as i}from"../../chunks/paths-BcM3el4Q.js";import{d as a,f as o,h as s}from"../../chunks/types-MZUhN0Zy.js";import{createCliTheme as c,renderCliBanner as l,renderCliSection as u}from"../ui/output.js";async function d(e){let t=await f(e);return{application:n(t?.project.appRoot??e),compiledState:t,messaging:{createSessionRoutePath:o,continueSessionRoutePattern:a,streamRoutePattern:s}}}async function f(n){try{return await i({startPath:n})}catch(n){if(n instanceof r)return n.result;if(n instanceof e||n instanceof t)return null;throw n}}function p(e,t){return`${e} ${t}${e===1?``:`s`}`}function m(e,t){return`${`${e} error${e===1?``:`s`}`}, ${`${t} warning${t===1?``:`s`}`}`}function h(e){switch(e){case`ready`:return`success`;case`failed`:return`danger`;default:return`warning`}}async function g(e,t){let n=await d(t),r=n.compiledState,i=n.application,a=c(),o=[{label:`App Root`,value:i.appRoot}],s=[{label:`Workflow Build`,value:i.workflowBuildDir},{label:`Output`,value:i.outputDir}],f=[];r===null?o.push({label:`Compile`,tone:`warning`,value:`unavailable`}):(o.push({label:`Agent Root`,value:r.project.agentRoot},{label:`Layout`,value:r.project.layout},{label:`Compile`,tone:h(r.metadata.status),value:r.metadata.status},{label:`Diagnostics`,tone:r.metadata.discovery.summary.errors>0?`danger`:r.metadata.discovery.summary.warnings>0?`warning`:`success`,value:m(r.metadata.discovery.summary.errors,r.metadata.discovery.summary.warnings)},{label:`Instructions`,value:r.manifest.instructions?.logicalPath??`none`},{label:`Skills`,value:p(r.manifest.skills.length,`skill`)}),s.unshift({label:`Compiled Manifest`,value:r.paths.compiledManifestPath},{label:`Discovery Manifest`,value:r.paths.discoveryManifestPath},{label:`Diagnostics`,value:r.paths.diagnosticsPath},{label:`Module Map`,value:r.paths.moduleMapPath},{label:`Metadata`,value:r.paths.compileMetadataPath}),f.push(r.manifest.instructions===void 0?{label:`Instructions`,value:`No instructions prompt discovered.`}:{label:`Instructions`,value:r.manifest.instructions.logicalPath})),e.log([l(a,{subtitle:`Resolved application paths and the active message contract.`,title:`Ash Info`}),``,u(a,{rows:o,title:`Application`}),``,u(a,{rows:s,title:`Artifacts`}),...r===null?[]:[``,u(a,{rows:f,title:`Instructions`})],``,u(a,{rows:[{label:`Workflow ID`,value:i.workflowId},{label:`Source Dir`,value:i.workflowSourceDir},{label:`Create`,tone:`info`,value:`POST ${n.messaging.createSessionRoutePath}`},{label:`Continue`,tone:`info`,value:`POST ${n.messaging.continueSessionRoutePattern}`},{label:`Stream`,tone:`info`,value:`GET ${n.messaging.streamRoutePattern}`}],title:`Messaging`})].join(`
|
|
2
2
|
`))}export{g as printApplicationInfo};
|
package/dist/src/cli/run.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{t as e}from"../chunks/package-DmsQgn4v.js";import{createCliTheme as t,renderCliTaggedLine as n}from"./ui/output.js";import{i as r,n as i,r as a,t as o}from"../chunks/url-BVRhVE2O.js";import{resolve as s}from"node:path";async function c(){return(await import(`../chunks/host-
|
|
1
|
+
import{t as e}from"../chunks/package-DmsQgn4v.js";import{createCliTheme as t,renderCliTaggedLine as n}from"./ui/output.js";import{i as r,n as i,r as a,t as o}from"../chunks/url-BVRhVE2O.js";import{resolve as s}from"node:path";async function c(){return(await import(`../chunks/host-Dxf7CGaE.js`).then(e=>e.t)).buildHost}async function l(){return(await import(`./commands/info.js`)).printApplicationInfo}async function u(){return(await import(`./dev/repl.js`)).runDevelopmentRepl}async function d(){return(await import(`../evals/cli/eval.js`)).runEvalCommand}async function f(){return(await import(`../chunks/host-Dxf7CGaE.js`).then(e=>e.t)).startHost}function p(e=process.cwd()){return s(e)}function m(e){return`Ash (v${e})`}function h(e){return e.name()===`info`||e.name()===`dev`}async function g(e){await new Promise((t,n)=>{let r=!1,i=()=>{process.off(`SIGINT`,a),process.off(`SIGTERM`,a)},a=()=>{r||(r=!0,i(),e.close().then(t,n))};process.once(`SIGINT`,a),process.once(`SIGTERM`,a)})}function _(e){if(!/^-?\d+$/.test(e))throw new r(`Expected a numeric port, received "${e}".`);let t=Number(e);if(!Number.isInteger(t))throw new r(`Expected a numeric port, received "${e}".`);if(t<0||t>65535)throw new r(`Expected a port between 0 and 65535, received "${e}".`);return t}function v(){return!!(process.stdin.isTTY&&process.stdout.isTTY)}function y(e){let t=e[1];return e[0]!==`dev`||e.length!==2||t===void 0||t.startsWith(`-`)?[...e]:[`dev`,`--url`,t]}function b(e){if(e.url){if(e.host!==void 0)throw new r(`The --host option cannot be used with --url.`);if(e.port!==void 0)throw new r(`The --port option cannot be used with --url.`);if(e.repl===!1)throw new r(`The --no-repl option cannot be used with --url.`);return e.url}}function x(r,a){let s=p(),y=e().version,x=new i,S=t();return x.name(`ash`).description(`Build and run an Ash application.`).version(y).showHelpAfterError().exitOverride().hook(`preAction`,(e,t)=>{h(t)&&r.log(m(y))}).configureOutput({writeErr:e=>{r.error(e.trimEnd())},writeOut:e=>{r.log(e.trimEnd())}}),x.command(`build`).description(`Build the current Ash application.`).action(async()=>{let{loadDevelopmentEnvironmentFiles:e}=await import(`./dev/environment.js`);e(s);let t=await(a.buildHost??await c())(s);r.log(n(S,{message:`built output at ${t}`,tag:`build`,tone:`success`}))}),x.command(`dev`).description(`Start the Ash development server or connect the REPL to an existing URL.`).option(`--host <host>`,`Host interface to bind`).option(`--no-repl`,`Start the server without the interactive REPL`).option(`--port <port>`,`Port to listen on (defaults to $PORT, then 3000)`,_).option(`--schedules`,`Run scheduled tasks during development (off by default)`).option(`-u, --url <url>`,`Connect the REPL to an existing server URL`,o).addHelpText(`after`,`
|
|
2
2
|
You can also pass a bare URL as the only argument, for example: ash dev https://example.com
|
|
3
3
|
`).action(async e=>{let t=b(e),{loadDevelopmentEnvironmentFiles:i}=await import(`./dev/environment.js`);if(i(s),t){if(r.log(n(S,{message:`REPL connecting to ${t}`,tag:`dev`,tone:`info`})),!v()){r.log(n(S,{message:`Interactive REPL disabled because the current terminal is not a TTY.`,tag:`dev`,tone:`warning`}));return}r.log(``),await(a.runDevelopmentRepl??await u())({serverUrl:t});return}let o=await(a.startHost??await f())(s,{host:e.host,port:e.port,schedules:e.schedules===!0}),c=!1,l=async()=>{c||(c=!0,await o.close())};try{if(r.log(n(S,{message:`server listening at ${o.url}`,tag:`dev`,tone:`success`})),e.repl===!1)return await g({close:l});if(!v())return r.log(n(S,{message:`Interactive REPL disabled because the current terminal is not a TTY.`,tag:`dev`,tone:`warning`})),await g({close:l});r.log(``),await(a.runDevelopmentRepl??await u())({serverUrl:o.url})}finally{await l()}}),x.command(`info`).description(`Print resolved application information.`).action(async()=>{await(a.printApplicationInfo??await l())(r,s)}),x.command(`eval`).description(`Run eval suites against an Ash agent.`).option(`--suite <id...>`,`Suite IDs to run (repeatable)`).option(`--all`,`Run all discovered suites`).option(`--url <url>`,`Remote agent URL (skip local host startup)`).option(`--timeout <ms>`,`Per-case timeout in milliseconds`).option(`--max-concurrency <n>`,`Max concurrent case executions per suite`).option(`--json`,`Output results as JSON`).option(`--list-suites`,`List discovered suites and exit`).option(`--skip-report`,`Skip suite-defined reporters (e.g. Braintrust)`).action(async e=>{await(a.runEvalCommand??await d())(e,r)}),x}async function S(e=process.argv.slice(2),t=console,n={}){let r=x(t,n),i=e.length===0?[`info`]:y(e);try{await r.parseAsync(i,{from:`user`})}catch(e){if(e instanceof a){if(e.exitCode===0)return;throw Error(e.message)}throw e}}export{S as runCli};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"../../chunks/paths-
|
|
1
|
+
import{n as e}from"../../chunks/paths-BcM3el4Q.js";import{loadDevelopmentEnvironmentFiles as t}from"../../cli/dev/environment.js";import{a as n,n as r,t as i}from"../../chunks/client-CKsU8Li3.js";import{n as a}from"../../chunks/host-Dxf7CGaE.js";import{discoverAndImportSuites as o,discoverSuiteFiles as s,importSuiteFile as c}from"../runner/discover.js";import{executeSuite as l}from"../runner/execute-suite.js";import{ConsoleReporter as u}from"../runner/reporters/console.js";var d=n();function f(e,t){e.command(`eval`).description(`Run eval suites against an Ash agent.`).option(`--suite <id...>`,`Suite IDs to run (repeatable)`).option(`--all`,`Run all discovered suites`).option(`--url <url>`,`Remote agent URL (skip local host startup)`).option(`--timeout <ms>`,`Per-case timeout in milliseconds`).option(`--max-concurrency <n>`,`Max concurrent case executions per suite`).option(`--json`,`Output results as JSON`).option(`--list-suites`,`List discovered suites and exit`).option(`--skip-report`,`Skip suite-defined reporters (e.g. Braintrust)`).action(async e=>{await p(e,t)})}async function p(n,r){let i=e();if(t(i),n.listSuites){await y(i,r);return}let s=n.suite,c=await o(i,s);if(c.length===0){s&&s.length>0?r.error(`No suites found matching: ${s.join(`, `)}`):r.error(`No eval suites found. Create suite files under evals/ with the *.eval.ts extension.`),process.exitCode=1;return}let u,d;n.url?d={kind:`remote`,url:n.url}:(u=await a(i,{host:`127.0.0.1`,port:0}),d={kind:`local`,url:u.url});let f=m(d);try{let e=[];for(let t of c){let r=_(t,n),a=v(r,{json:n.json===!0,skipReport:n.skipReport===!0}),o=await l({suite:r,target:d,reporters:a,appRoot:i,client:f});e.push(o)}n.json&&r.log(JSON.stringify(e,null,2)),e.some(e=>e.errored>0)&&(process.exitCode=1)}finally{u&&await u.close()}process.exit(process.exitCode??0)}function m(e){if(e.kind===`local`)return new i({host:e.url});let t={},n=process.env.VERCEL_AUTOMATION_BYPASS_SECRET?.trim();return n&&(t[r]=n),new i({auth:h(),headers:Object.keys(t).length>0?t:void 0,host:e.url})}function h(){let e=process.env.ASH_EVAL_AUTH_TOKEN?.trim();return e?{bearer:e}:{bearer:g}}async function g(){try{let e=(await(0,d.getVercelOidcToken)()).trim();if(e.length>0)return e}catch{}return process.env.VERCEL_OIDC_TOKEN?.trim()??``}function _(e,t){let n=t.maxConcurrency?Number.parseInt(t.maxConcurrency,10):void 0,r=t.timeout?Number.parseInt(t.timeout,10):void 0;if(n===void 0&&r===void 0)return e;let i={...e};return n!==void 0&&(i.maxConcurrency=n),r!==void 0&&(i.timeoutMs=r),i}function v(e,t){let n=t.json?[]:[new u];return!t.skipReport&&e.reporters&&n.push(...e.reporters),n}async function y(e,t){let n=await s(e);if(n.length===0){t.log(`No eval suites found.`);return}t.log(`Found ${n.length} eval suite file(s):\n`);for(let r of n){let n=await c(e,r);t.log(` ${n.id}${n.description?` - ${n.description}`:``}`)}}export{f as registerEvalCommand,p as runEvalCommand};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { JsonObject } from "#shared/json.js";
|
|
1
2
|
/**
|
|
2
3
|
* One human-readable summary of a known model-call configuration failure.
|
|
3
4
|
*
|
|
@@ -17,6 +18,19 @@ export interface ModelCallConfigErrorSummary {
|
|
|
17
18
|
* so the caller falls back to the raw SDK message.
|
|
18
19
|
*/
|
|
19
20
|
export declare function summarizeKnownModelCallConfigError(error: unknown): ModelCallConfigErrorSummary | null;
|
|
21
|
+
/**
|
|
22
|
+
* Returns a concise summary for known model-call request failures that are not
|
|
23
|
+
* configuration errors. These failures happen before the agent can produce a
|
|
24
|
+
* response, so the user-facing message should avoid implying a bad tool call.
|
|
25
|
+
*/
|
|
26
|
+
export declare function summarizeKnownModelCallRequestError(error: unknown): ModelCallConfigErrorSummary | null;
|
|
27
|
+
/**
|
|
28
|
+
* Extracts compact, structured diagnostics from AI SDK / AI Gateway model-call
|
|
29
|
+
* errors. The full SDK error can include very large request bodies (especially
|
|
30
|
+
* tool schemas), so this shape lifts the important upstream response fields into
|
|
31
|
+
* `step.failed.details` before any inspector output gets truncated.
|
|
32
|
+
*/
|
|
33
|
+
export declare function extractModelCallErrorDetails(error: unknown): JsonObject;
|
|
20
34
|
/**
|
|
21
35
|
* Classifies a model-call failure into the runtime's recovery policy.
|
|
22
36
|
*/
|