experimental-ash 0.6.2 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -4
- package/dist/docs/internals/discovery.md +2 -2
- package/dist/docs/internals/mechanical-invariants.md +1 -1
- package/dist/docs/internals/testing.md +1 -1
- package/dist/docs/public/README.md +1 -1
- package/dist/docs/public/agent-ts.md +2 -2
- package/dist/docs/public/channels/README.md +1 -1
- package/dist/docs/public/context-control.md +20 -20
- package/dist/docs/public/getting-started.md +1 -1
- package/dist/docs/public/project-layout.md +21 -21
- package/dist/docs/public/schedules.md +1 -1
- package/dist/docs/public/skills.md +3 -3
- package/dist/docs/public/subagents.md +3 -3
- package/dist/docs/public/typescript-api.md +2 -2
- package/dist/src/chunks/{dev-authored-source-watcher-MDHwWfTE.js → dev-authored-source-watcher-HzOplr1S.js} +1 -1
- package/dist/src/chunks/{host-CDvE1sV_.js → host-Ca8xvEQ1.js} +2 -2
- package/dist/src/chunks/paths-BiY7uVwD.js +88 -0
- package/dist/src/chunks/{prewarm-CCU5VjXa.js → prewarm-DiZ_sYLy.js} +1 -1
- package/dist/src/cli/commands/info.js +1 -1
- package/dist/src/cli/run.js +1 -1
- package/dist/src/compiler/compile-agent.js +10 -0
- package/dist/src/compiler/manifest.d.ts +8 -7
- package/dist/src/compiler/manifest.js +5 -5
- package/dist/src/compiler/normalize-instructions.d.ts +12 -0
- package/dist/src/compiler/normalize-instructions.js +28 -0
- package/dist/src/compiler/normalize-manifest.js +3 -3
- package/dist/src/discover/discover-agent.d.ts +2 -2
- package/dist/src/discover/discover-agent.js +5 -5
- package/dist/src/discover/discover-subagent.js +4 -4
- package/dist/src/discover/filesystem.d.ts +4 -4
- package/dist/src/discover/filesystem.js +30 -0
- package/dist/src/discover/grammar.d.ts +21 -7
- package/dist/src/discover/grammar.js +79 -21
- package/dist/src/discover/manifest.d.ts +11 -8
- package/dist/src/discover/manifest.js +2 -2
- package/dist/src/evals/cli/eval.js +1 -1
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/internal/authored-definition/core.d.ts +7 -6
- package/dist/src/internal/authored-definition/core.js +6 -5
- package/dist/src/internal/nitro/routes/home-page/build-home-page-response.d.ts +5 -5
- package/dist/src/internal/nitro/routes/home-page/build-home-page-response.js +16 -15
- package/dist/src/internal/nitro/routes/home-page/load-home-page-data.d.ts +2 -2
- package/dist/src/internal/nitro/routes/web-ui/assets/{index-z8flAc4k.js → index-BQa8fbHJ.js} +1 -1
- package/dist/src/internal/nitro/routes/web-ui/index.html +1 -1
- package/dist/src/public/definitions/instructions.d.ts +29 -0
- package/dist/src/public/definitions/instructions.js +12 -0
- package/dist/src/public/helpers/markdown.d.ts +5 -5
- package/dist/src/public/helpers/markdown.js +7 -7
- package/dist/src/public/instructions/index.d.ts +8 -0
- package/dist/src/public/instructions/index.js +6 -0
- package/dist/src/runtime/agent/bootstrap.js +3 -3
- package/dist/src/runtime/prompt/compose.d.ts +5 -4
- package/dist/src/runtime/prompt/compose.js +6 -6
- package/dist/src/runtime/resolve-agent.js +10 -10
- package/dist/src/runtime/types.d.ts +10 -7
- package/package.json +9 -4
- package/dist/src/chunks/paths-D1gMcyWw.js +0 -88
- package/dist/src/compiler/normalize-system.d.ts +0 -11
- package/dist/src/compiler/normalize-system.js +0 -27
- package/dist/src/public/definitions/system.d.ts +0 -16
- package/dist/src/public/definitions/system.js +0 -7
- package/dist/src/public/system/index.d.ts +0 -4
- package/dist/src/public/system/index.js +0 -4
- /package/dist/src/cli/templates/init-app/agent/{system.md → instructions.md} +0 -0
|
@@ -1,88 +0,0 @@
|
|
|
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,m as o,n as s,p as c,s as l,t as u,u as d}from"./authored-module-loader-CqZSviWm.js";import{n as f,t as p}from"./guards-CjJ3lmju.js";import{t as m}from"./errors-DsO9xmQL.js";import{n as h,o as g,r as _,t as v}from"./package-DmsQgn4v.js";import{a as y,b as ee,i as te,n as ne,o as re,r as ie,s as ae,t as oe,u as se,x as ce}from"./types-D9Uv7nU4.js";import{t as le}from"./runtime-model-BWu6M_hq.js";import{z as b}from"#compiled/zod/index.js";import{basename as ue,dirname as x,join as S,posix as de,relative as fe,resolve as C,sep as pe}from"node:path";import{access as me,cp as he,mkdir as w,readFile as ge,readdir as _e,rm as ve,stat as ye,writeFile as T}from"node:fs/promises";import{createHash as be}from"node:crypto";import{pathToFileURL as xe}from"node:url";import{resumeHook as Se}from"#compiled/@workflow/core/runtime.js";import{AsyncLocalStorage as Ce}from"node:async_hooks";import{SpanStatusCode as we,trace as Te}from"#compiled/@opentelemetry/api/index.js";import{getErrorMessage as Ee}from"#compiled/@ai-sdk/provider/index.js";import{inspect as De}from"node:util";import{fromError as Oe}from"#compiled/zod-validation-error/index.js";import{createRemoteJWKSet as ke,decodeJwt as Ae,jwtVerify as je}from"#compiled/jose/index.js";import Me from"#compiled/turndown/index.js";const Ne=b.union([b.literal(`error`),b.literal(`warning`)]);b.object({code:b.string(),message:b.string(),severity:Ne,sourcePath:b.string()}).strict();const Pe=b.object({errors:b.number().finite(),warnings:b.number().finite()}).strict();function Fe(e){return e}function E(e){return Fe({...e,severity:`error`})}function Ie(e){return Fe({...e,severity:`warning`})}function Le(e){return e.reduce((e,t)=>(t.severity===`error`?e.errors+=1:e.warnings+=1,e),{errors:0,warnings:0})}function Re(e){return e.some(e=>e.severity===`error`)}const ze=[`.cts`,`.mts`,`.cjs`,`.mjs`,`.ts`,`.js`],Be=[`package.json`,`vercel.json`],Ve=[`agent.ts`,`agent.cts`,`agent.mts`,`agent.js`,`agent.cjs`,`agent.mjs`,`system.md`,`system.ts`,`system.cts`,`system.mts`,`system.js`,`system.cjs`,`system.mjs`],He=[`channels`,`connections`,`hooks`,`lib`,`sandbox`,`skills`,`tools`,`schedules`,`subagents`],Ue=[`agent.ts`,`agent.cts`,`agent.mts`,`agent.js`,`agent.cjs`,`agent.mjs`,`system.md`,`system.ts`,`system.cts`,`system.mts`,`system.js`,`system.cjs`,`system.mjs`],We=[`hooks`,`lib`,`sandbox`,`skills`,`tools`,`subagents`],Ge=[`SKILL.md`],Ke=[`scripts`,`references`,`assets`],qe=new Set(Be);new Set(Ve),new Set(He),new Set(Ue),new Set(We),new Set(Ge),new Set(Ke);function D(e){return e.isDirectory()?`directory`:e.isFile()?`file`:`other`}function Je(e,t){return t===`file`&&qe.has(e)}function Ye(e,t){if(t===`file`)return $e(e,`agent`)?`agent-config-module`:e===`system.md`?`system-markdown`:$e(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 Xe(e,t){if(t===`file`)return $e(e,`agent`)?`agent-config-module`:e===`system.md`?`system-markdown`:$e(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 Ze(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 Qe(e,t){if(t===`directory`)return`skill-package-directory`;if(t===`file`){if(e.endsWith(`.md`))return`flat-skill-markdown`;if(k(e)!==null)return`flat-skill-module`}return`unknown`}function O(e){return e.replaceAll(pe,`/`).replace(/^\.\//,``).replace(/^\/+/,``)}function k(e){for(let t of ze)if(e.endsWith(t)&&e.length>t.length)return e.slice(0,-t.length);return null}function $e(e,t){return k(e)===t}function A(e){let t=O(e),n=t.lastIndexOf(`/`),r=t.lastIndexOf(`.`);return r===-1||r<n?t:t.slice(0,r)}var et=e(t(),1);function tt(e,t){let i=n(e,t);if(a(i,[`build`,`compaction`,`description`,`metadata`,`model`,`modelContextWindowTokens`,`modelOptions`],t),i.model===void 0)throw Error(`${t} The "model" field is required.`);let o={model:i.model};i.description!==void 0&&(o.description=r(i.description,t));let s=c(i,`metadata`,t);return s!==void 0&&(o.metadata=s),i.compaction!==void 0&&(o.compaction=at(i.compaction,t)),i.build!==void 0&&(o.build=rt(i.build,t)),i.modelOptions!==void 0&&(o.modelOptions=it(i.modelOptions,t)),i.modelContextWindowTokens!==void 0&&(o.modelContextWindowTokens=nt(i.modelContextWindowTokens,t)),o}function nt(e,t){if(typeof e!=`number`||!Number.isInteger(e)||e<=0)throw Error(t);return e}function rt(e,t){let i=n(e,t);a(i,[`externalDependencies`],t);let o={};if(i.externalDependencies!==void 0){if(!Array.isArray(i.externalDependencies))throw Error(t);o.externalDependencies=Object.freeze(i.externalDependencies.map(e=>r(e,t)))}return o}function it(e,t){let r=n(e,t);a(r,[`providerOptions`],t);let i=r.providerOptions;return i===void 0?{}:{providerOptions:d(i,t)}}function at(e,t){let r=n(e,t);a(r,[`model`,`modelContextWindowTokens`,`thresholdPercent`],t);let i={};if(r.model!==void 0&&(i.model=r.model),r.modelContextWindowTokens!==void 0&&(i.modelContextWindowTokens=nt(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 ot(e,t){let i=n(e,t);return a(i,[`markdown`],t),{markdown:r(i.markdown,t)}}function st(e,t){let i=n(e,t);a(i,[`description`,`license`,`markdown`,`metadata`],t);let o={description:r(i.description,t),markdown:r(i.markdown,t)},s=i.license,l=c(i,`metadata`,t);return s!==void 0&&(o.license=r(s,t)),l!==void 0&&(o.metadata=l),o}function ct(e,t){let i=n(e,t);a(i,[`channel`,`cron`,`markdown`],t);let o={cron:r(i.cron,t),markdown:r(i.markdown,t)};return i.channel!==void 0&&i.channel!==null&&(o.channel=i.channel),o}function lt(e){return e}function ut(e){return e}function dt(e){return e}const ft=/^---\r?\n[\s\S]*?\r?\n---(?:\r?\n|$)/;function pt(e){if(!et.default.test(e))return{hasFrontmatter:!1,frontmatter:{},markdown:e};let t;try{t=(0,et.default)(e)}catch(t){throw _t(e)&&!vt(e)?Error(`Markdown frontmatter is missing a closing delimiter.`):t}if(!f(t.data))throw Error(`Markdown frontmatter must parse to an object.`);return{hasFrontmatter:!0,frontmatter:t.data,markdown:yt(t.content)}}function mt(e){return dt(ot({markdown:e},`Expected authored system markdown to match the public Ash shape.`))}function ht(e){let t=pt(e);if(!t.hasFrontmatter)throw Error(`Schedule markdown must start with YAML frontmatter declaring "cron".`);if(`channel`in t.frontmatter)throw Error('Markdown-form schedules do not support the "channel" frontmatter key. Use a TypeScript schedule (`<name>.ts`) to deliver to a channel.');return lt(ct({...t.frontmatter,markdown:t.markdown},`Expected authored schedule markdown to match the public Ash shape.`))}function gt(e,t={}){let n=pt(e),r=t.slug;if(r===void 0&&!n.hasFrontmatter)throw Error(`Skill markdown must start with YAML frontmatter.`);let i=St(n.frontmatter),a=Ct(i.description,`description`),o=r===void 0?wt(i.description,`description`):a??t.description??Et(n.markdown,r),s={...i,description:o,markdown:n.markdown};return bt(s,i),ut(st(s,`Expected authored skill markdown to match the public Ash shape.`))}function _t(e){return e.startsWith(`---
|
|
2
|
-
`)||e.startsWith(`---\r
|
|
3
|
-
`)}function vt(e){return ft.test(e)}function yt(e){return e.replace(/^\r?\n/u,``)}function bt(e,t){let n=Ct(t.license,`license`);n!==void 0&&(e.license=n);let r=Tt(t.metadata,`metadata`);r!==void 0&&(e.metadata=r)}const xt=[`name`];function St(e){let t={...e};for(let e of xt)delete t[e];return t}function Ct(e,t){if(e!=null){if(typeof e!=`string`)throw Error(`Expected "${t}" frontmatter to be a string.`);return e}}function wt(e,t){let n=Ct(e,t);if(n===void 0)throw Error(`Missing required "${t}" frontmatter.`);return n}function Tt(e,t){if(e==null)return;if(!f(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 Et(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 Dt(e){let t=C(e.appRoot),n=C(e.agentRoot),r={agentId:e.agentId??Ot(t,n,e.packageName),agentRoot:n,appRoot:t,channels:[...e.channels??[]],connections:[...e.connections??[]],diagnosticsSummary:Le(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.system!==void 0&&(r.system=e.system),r}function Ot(e,t,n){let r=O(fe(e,t));return r===``||r===`.`||r===`agent`?n??ue(e):ue(t)}function j(e){return O(e)}function M(e){let t=O(e.logicalPath),n={sourceKind:`module`,logicalPath:t,sourceId:e.sourceId??j(t)};return e.exportName!==void 0&&(n.exportName=e.exportName),n}function kt(e){return{...M(e),connectionName:e.connectionName}}function At(e){let t=O(e.logicalPath);return{entryPath:e.entryPath,logicalPath:t,manifest:e.manifest,rootPath:e.rootPath,sourceId:e.sourceId??j(t),subagentId:e.subagentId}}function jt(e){let t={description:e.description,sourceKind:`skill-package`,logicalPath:O(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 Mt(e){let t=O(e.logicalPath);return{definition:e.lower(await e.source.readTextFile(e.sourcePath),{name:A(t)}),sourceKind:`markdown`,logicalPath:t,sourceId:j(t)}}function Nt(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&&k(r.name)===t.moduleBaseName&&n.moduleFileNames.push(r.name)}return n.moduleFileNames.sort((e,t)=>e.localeCompare(t)),n}function Pt(e,t){let n=new Map;for(let r of e){if(!r.isFile())continue;let e=t.allowMarkdown?Ft(r.name):null,i=t.allowModules?k(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 Ft(e){return!e.endsWith(`.md`)||e.length<=3?null:e.slice(0,-3)}async function N(e){let t=S(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:[E({code:e.invalidDirectoryCode,message:e.invalidDirectoryMessage,sourcePath:t})],sources:[]};let r=[],i=[];return await It({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 It(e){let t=e.subdirectoryRelative===``?e.rootDirectoryPath:S(e.rootDirectoryPath,e.subdirectoryRelative),n=await P(e.projectSource,t);e.recursive&&await Lt(e,n,t),(e.unsupportedFileCode!==void 0||e.unsupportedEntryCode!==void 0)&&Rt(e,n,t),await zt(e,n,t)}async function Lt(e,t,n){for(let r of t){if(!r.isDirectory())continue;let t=S(n,r.name);if(e.validateSegment!==void 0){let n=e.validateSegment(r.name,t);if(n!==null){e.diagnostics.push(n);continue}}await It({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:S(e.subdirectoryRelative,r.name),unsupportedEntryCode:e.unsupportedEntryCode,unsupportedEntryMessage:e.unsupportedEntryMessage,unsupportedFileCode:e.unsupportedFileCode,unsupportedFileMessage:e.unsupportedFileMessage,validateSegment:e.validateSegment})}}function Rt(e,t,n){for(let r of t){let t=D(r),i=S(n,r.name);if(t===`directory`)continue;if(t===`other`){e.unsupportedEntryCode!==void 0&&e.diagnostics.push(E({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=k(r.name)!==null,o=e.allowMarkdown&&r.name.endsWith(`.md`);a||o||e.diagnostics.push(E({code:e.unsupportedFileCode,message:e.unsupportedFileMessage?.(i,e.relativeDirectory)??`Expected "${i}" to be a supported authored source within "${e.relativeDirectory}/".`,sourcePath:i}))}}async function zt(e,t,n){for(let r of Pt(t,{allowMarkdown:e.allowMarkdown,allowModules:!0})){let t=e.subdirectoryRelative===``?r.slotName:S(e.subdirectoryRelative,r.slotName),i=O(S(e.relativeDirectory,t));if(e.validateSegment!==void 0){let t=r.markdownFileName??r.moduleFileNames[0]??r.slotName,i=e.validateSegment(r.slotName,S(n,t));if(i!==null){e.diagnostics.push(i);continue}}if(r.markdownFileName!==void 0&&r.moduleFileNames.length>0){e.diagnostics.push($t(n,i,[r.markdownFileName,...r.moduleFileNames]));continue}if(r.moduleFileNames.length>1){e.diagnostics.push(en(n,i,r.moduleFileNames));continue}if(r.markdownFileName!==void 0){let t=e.subdirectoryRelative===``?r.markdownFileName:S(e.subdirectoryRelative,r.markdownFileName),n=O(S(e.relativeDirectory,t));if(e.markdownLowerer===void 0)continue;let i=await Mt({logicalPath:n,lower:e.markdownLowerer,source:e.projectSource,sourcePath:S(e.rootDirectoryPath,t)});e.sources.push(i);continue}let[a]=r.moduleFileNames;if(a===void 0)continue;let o=e.subdirectoryRelative===``?a:S(e.subdirectoryRelative,a);e.sources.push(M({logicalPath:O(S(e.relativeDirectory,o))}))}}const Bt=`discover/module-slot-collision`,Vt=`discover/tools-directory-invalid`,Ht=/^[a-zA-Z][a-zA-Z0-9_-]{0,63}$/,Ut=/^[a-z][a-z0-9-]{0,63}$/,Wt=/^(\.?[a-z][a-z0-9-]{0,63}|\[[a-zA-Z][a-zA-Z0-9_]{0,63}\])$/,Gt=/^[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 Kt(e){let t=Nt(e.rootEntries,{markdownFileName:`system.md`,moduleBaseName:`system`});if(t.markdownFileName!==void 0&&t.moduleFileNames.length>0)return{diagnostics:[$t(e.rootPath,`system`,[t.markdownFileName,...t.moduleFileNames])]};if(t.moduleFileNames.length>1)return{diagnostics:[en(e.rootPath,`system`,t.moduleFileNames)]};if(t.markdownFileName!==void 0)return{diagnostics:[],system:await Mt({logicalPath:`system.md`,lower:mt,source:e.source,sourcePath:S(e.rootPath,t.markdownFileName)})};let[n]=t.moduleFileNames;return n===void 0?{diagnostics:[E({code:`discover/required-system-missing`,message:`Expected one authored system prompt source at "system.md", "system.ts", "system.cts", "system.mts", "system.js", "system.cjs", or "system.mjs".`,sourcePath:e.rootPath})]}:{diagnostics:[],system:M({logicalPath:n})}}function qt(e){let t=Nt(e.rootEntries,{moduleBaseName:e.slotName});if(t.moduleFileNames.length>1)return{diagnostics:[en(e.rootPath,e.slotName,t.moduleFileNames)]};let[n]=t.moduleFileNames;return n===void 0?e.missingDiagnostic===void 0?{diagnostics:[]}:{diagnostics:[E({code:e.missingDiagnostic.code,message:e.missingDiagnostic.message,sourcePath:e.rootPath})]}:{diagnostics:[],module:M({logicalPath:n})}}function Jt(e,t){return Ht.test(e)?null:E({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 Yt(e,t){return Ut.test(e)?null:E({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 Xt(e,t){return Wt.test(e)?null:E({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 Zt(e,t){return Gt.test(e)?null:E({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 Qt(e){return e.rootEntries.flatMap(t=>!t.isDirectory()||e.classifyEntry(t.name,D(t))!==`unknown`?[]:[Ie({code:`discover/unsupported-directory`,message:e.createUnsupportedDirectoryMessage(t.name),sourcePath:S(e.rootPath,t.name)})])}function $t(e,t,n){return E({code:`discover/slot-collision`,message:`Found conflicting authored sources for "${t}": ${tn(n)}.`,sourcePath:e})}function en(e,t,n){return E({code:Bt,message:`Found multiple authored module sources for "${t}": ${tn(n)}.`,sourcePath:e})}function tn(e){return e.map(e=>`"${e}"`).join(`, `)}async function nn(e){let t=`connections`,n=S(e.rootPath,t),r=e.rootEntries.find(e=>e.name===t);if(r===void 0)return{connections:[],diagnostics:[]};if(!r.isDirectory())return{connections:[],diagnostics:[E({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 Pt(i,{allowMarkdown:!1,allowModules:!0})){let r=O(S(t,e.slotName));if(e.moduleFileNames.length>1){s.add(e.slotName),o.push(en(n,r,e.moduleFileNames));continue}let[i]=e.moduleFileNames;if(i===void 0)continue;s.add(e.slotName);let c=Yt(e.slotName,S(n,i));if(c!==null){o.push(c);continue}a.push(kt({connectionName:e.slotName,logicalPath:S(t,i)}))}for(let r of i){if(!r.isDirectory())continue;let i=r.name,c=S(n,i);if(s.has(i)){o.push(E({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=Yt(i,c);if(l!==null){o.push(l);continue}let u=rn(await P(e.source,c));if(u.length>1){o.push(E({code:Bt,message:`Found multiple connection definition modules inside "${O(S(t,i))}": `+u.map(e=>`"${e}"`).join(`, `),sourcePath:c}));continue}let[d]=u;if(d===void 0){o.push(E({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(kt({connectionName:i,logicalPath:S(t,i,d)}))}return{connections:a,diagnostics:o}}function rn(e){let t=e.filter(e=>e.isFile()),n=[];for(let e of Pt(t,{allowMarkdown:!1,allowModules:!0}))e.slotName===`connection`&&n.push(...e.moduleFileNames);return n}const an=`discover/lib-entry-unsupported`;async function on(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:an,unsupportedEntryMessage:e=>`Expected "${e}" to be a supported authored module within "lib/".`,unsupportedFileCode:an,unsupportedFileMessage:e=>`Expected "${e}" to be a supported authored module within "lib/".`});return{diagnostics:t.diagnostics,lib:t.sources}}function F(){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 I=`sandbox`,sn=`workspace`,cn=`sandbox`;async function ln(e){let t=[],n=e.rootEntries.find(e=>e.name===I);if(n===void 0)return un({diagnostics:t,rootEntries:e.rootEntries,rootPath:e.rootPath});let r=S(e.rootPath,I);if(!n.isDirectory())return t.push(E({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=dn(i),o=i.find(e=>e.name===sn&&e.isDirectory());if(a.length>1)return t.push(E({code:Bt,message:`Found multiple sandbox definition modules inside "${O(I)}": `+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(E({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:S(I,s)}));let d=null;if(l){let n=S(r,sn),i=O(S(I,sn)),a=await pn(e.source,n);a===null?d={logicalPath:i,rootEntries:await fn(e.source,n),sourceId:j(i),sourcePath:n}:t.push(a)}return{diagnostics:t,sandbox:u,sandboxWorkspace:d}}function un(e){let t=Nt(e.rootEntries,{moduleBaseName:cn});if(t.moduleFileNames.length>1)return e.diagnostics.push(E({code:Bt,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 dn(e){let t=e.filter(e=>e.isFile()),n=[];for(let e of Pt(t,{allowMarkdown:!1,allowModules:!0}))e.slotName===cn&&n.push(...e.moduleFileNames);return n}async function fn(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 pn(e,t){return(await P(e,t)).find(e=>e.name===`skills`)===void 0?null:E({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:S(t,`skills`)})}const mn=`discover/skill-frontmatter-invalid`;async function hn(e){let t=e.source??F(),n=C(e.agentRoot),r=C(e.skillsDirectoryPath??S(n,`skills`)),i=O(e.skillsLogicalPath??fe(n,r)),a=await t.stat(r);if(a===`missing`)return{diagnostics:[],skills:[]};if(a!==`directory`)return{diagnostics:[E({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 gn({entryName:e.name,entryType:D(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(E({code:`discover/skill-collision`,message:`Found conflicting authored skill sources for "${n.skillId}": "${a.logicalPath}" and "${n.logicalPath}".`,sourcePath:S(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 gn(e){let t=S(e.skillsDirectoryPath,e.entryName);switch(Qe(e.entryName,e.entryType)){case`skill-package-directory`:return _n({logicalSkillsPath:e.skillsLogicalPath,skillId:e.entryName,skillRootPath:t,source:e.source});case`flat-skill-markdown`:return vn({logicalSkillsPath:e.skillsLogicalPath,skillFileName:e.entryName,skillFilePath:t,source:e.source});case`flat-skill-module`:return yn({logicalSkillsPath:e.skillsLogicalPath,skillFileName:e.entryName});default:return{diagnostics:[E({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:O(S(e.skillsLogicalPath,e.entryName)),skill:null,skillId:null}}}async function _n(e){let t=S(e.skillRootPath,`SKILL.md`),n=O(S(e.logicalSkillsPath,e.skillId,`SKILL.md`));if(await e.source.stat(t)!==`file`)return{diagnostics:[E({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=gt(await e.source.readTextFile(t))}catch(e){return{diagnostics:[E({code:mn,message:xn(t,e),sourcePath:t})],logicalPath:n,skill:null,skillId:null}}let i=await bn(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:jt(a),skillId:e.skillId}}async function vn(e){let t=Sn(e.skillFileName),n=O(S(e.logicalSkillsPath,e.skillFileName)),r;try{r=gt(await e.source.readTextFile(e.skillFilePath),{slug:t})}catch(t){return{diagnostics:[E({code:mn,message:xn(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 yn(e){let t=k(e.skillFileName),n=O(S(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 bn(e,t){let n=await e.readDirectory(t),r={};for(let e of n)if(e.isDirectory())switch(Ze(e.name,D(e))){case`skill-assets-directory`:r.assetsPath=S(t,e.name);break;case`skill-references-directory`:r.referencesPath=S(t,e.name);break;case`skill-scripts-directory`:r.scriptsPath=S(t,e.name);break;default:break}return r}function xn(e,t){return`Invalid authored skill frontmatter in "${e}": ${m(t)}`}function Sn(e){return e.endsWith(`.md`)?e.slice(0,-3):e}async function Cn(e){let t=e.source??F(),n=C(e.agentRoot),r=C(e.subagentsDirectoryPath??S(n,`subagents`)),i=O(e.subagentsLogicalPath??fe(n,r)),a=await t.stat(r);if(a===`missing`)return{diagnostics:[],subagents:[]};if(a!==`directory`)return{diagnostics:[E({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 wn({appRoot:e.appRoot,source:t,subagentId:n.name,subagentLogicalPath:S(i,n.name),subagentRoot:S(r,n.name)});s.push(...a.diagnostics),c.push(a.subagent)}return{diagnostics:s,subagents:c}}async function wn(e){let t=[],n=await P(e.source,e.subagentRoot);t.push(...Qt({classifyEntry:Xe,createUnsupportedDirectoryMessage(e){return`Ignoring unsupported directory "${e}/" in the local subagent root.`},rootEntries:n,rootPath:e.subagentRoot}));let r=await Kt({rootEntries:n,rootPath:e.subagentRoot,source:e.source});t.push(...r.diagnostics);let i=qt({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 nn({rootEntries:n,rootPath:e.subagentRoot,source:e.source});t.push(...a.diagnostics);let o=await ln({rootEntries:n,rootPath:e.subagentRoot,source:e.source});t.push(...o.diagnostics);let s=await N({directoryName:`tools`,invalidDirectoryCode:Vt,invalidDirectoryMessage:`Expected "${S(e.subagentRoot,`tools`)}" to be a directory of authored tools.`,recursive:!0,rootEntries:n,rootPath:e.subagentRoot,source:e.source,validateSegment:Jt});t.push(...s.diagnostics);let c=await N({directoryName:`hooks`,invalidDirectoryCode:Dn,invalidDirectoryMessage:`Expected "${S(e.subagentRoot,`hooks`)}" to be a directory of authored hooks.`,recursive:!0,rootEntries:n,rootPath:e.subagentRoot,source:e.source,validateSegment:Zt});t.push(...c.diagnostics);let l=await on({agentRoot:e.subagentRoot,rootEntries:n,source:e.source});t.push(...l.diagnostics),t.push(...Tn(e.subagentRoot,n));let u=await hn({agentRoot:e.subagentRoot,source:e.source});t.push(...u.diagnostics);let d=await Cn({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,system:r.system,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=Dt(f);return{diagnostics:t,subagent:At({entryPath:e.subagentRoot,logicalPath:e.subagentLogicalPath,manifest:p,rootPath:e.subagentRoot,subagentId:e.subagentId})}}function Tn(e,t){return t.flatMap(t=>Xe(t.name,D(t))===`invalid-schedules-directory`?[E({code:`discover/local-subagent-schedules-invalid`,message:`Local subagent packages cannot define schedules at "${S(e,t.name)}".`,sourcePath:S(e,t.name)})]:[])}async function En(e){let t=await N({allowMarkdown:!0,directoryName:`schedules`,invalidDirectoryCode:`discover/schedules-directory-invalid`,invalidDirectoryMessage:`Expected "${S(e.agentRoot,`schedules`)}" to be a directory of authored schedules.`,markdownLowerer:e=>ht(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 Dn=`discover/hooks-directory-invalid`;async function On(e){let t=e.source??F(),n=C(e.appRoot),r=C(e.agentRoot),i=[],a=await kn(t,n),o=await P(t,r);i.push(...Qt({classifyEntry:Ye,createUnsupportedDirectoryMessage(e){return`Ignoring unsupported directory "${e}/" in the agent root.`},rootEntries:o,rootPath:r}));let s=await Kt({rootEntries:o,rootPath:r,source:t});i.push(...s.diagnostics);let c=qt({rootEntries:o,rootPath:r,slotName:`agent`});i.push(...c.diagnostics);let l=await N({directoryName:`channels`,invalidDirectoryCode:`discover/channels-directory-invalid`,invalidDirectoryMessage:`Expected "${S(r,`channels`)}" to be a directory of authored channels.`,recursive:!0,rootEntries:o,rootPath:r,source:t,validateSegment:Xt});i.push(...l.diagnostics);let u=await on({agentRoot:r,rootEntries:o,source:t});i.push(...u.diagnostics);let d=await En({agentRoot:r,rootEntries:o,source:t});i.push(...d.diagnostics);let f=await nn({rootEntries:o,rootPath:r,source:t});i.push(...f.diagnostics);let p=await ln({rootEntries:o,rootPath:r,source:t});i.push(...p.diagnostics);let m=await N({directoryName:`tools`,invalidDirectoryCode:Vt,invalidDirectoryMessage:`Expected "${S(r,`tools`)}" to be a directory of authored tools.`,recursive:!0,rootEntries:o,rootPath:r,source:t,validateSegment:Jt});i.push(...m.diagnostics);let h=await N({directoryName:`hooks`,invalidDirectoryCode:Dn,invalidDirectoryMessage:`Expected "${S(r,`hooks`)}" to be a directory of authored hooks.`,recursive:!0,rootEntries:o,rootPath:r,source:t,validateSegment:Zt});i.push(...h.diagnostics);let g=await hn({agentRoot:r,source:t});i.push(...g.diagnostics);let _=await Cn({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,system:s.system,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:Dt(v)}}async function kn(e,t){try{let n=S(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 An=class extends Error{diagnostic;constructor(e){super(e.message),this.name=`DiscoveryProjectResolutionError`,this.diagnostic=e}};async function jn(e=process.cwd(),t={}){let n=t.source??F(),r=await Mn(n,e),i=r;for(;;){let e=await Nn(n,i);if(e!==null)return e;let t=await Pn(n,i);if(t!==null)return t;if(await Fn(n,i))return{agentRoot:i,appRoot:i,layout:`flat`};let r=x(i);if(r===i)break;i=r}throw new An(E({code:`discover/project-not-found`,message:`Could not resolve an Ash agent root from "${r}".`,sourcePath:r}))}async function Mn(e,t){let n=C(t);return await e.stat(n)===`directory`?n:x(n)}async function Nn(e,t){if(ue(t)!==`agent`)return null;let n=x(t);return await In(e,n)?{agentRoot:t,appRoot:n,layout:`nested`}:null}async function Pn(e,t){if(!await In(e,t))return null;let n=S(t,`agent`);return await Rn(e,n)?{agentRoot:n,appRoot:t,layout:`nested`}:null}async function Fn(e,t){let n=await Ln(e,t);return Array.from(n.entries()).some(([e,t])=>{let n=Ye(e,t);return n!==`unknown`&&n!==`lib-directory`})}async function In(e,t){let n=await Ln(e,t);return Array.from(n.entries()).some(([e,t])=>Je(e,t))}async function Ln(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,D(e)]))}async function Rn(e,t){return await e.stat(t)===`directory`}const zn=`ash-agent-compiled-manifest`,L=`__root__`,Bn=b.object({exportName:b.string().optional(),sourceKind:b.literal(`module`),logicalPath:b.string(),sourceId:b.string()}).strict(),Vn=b.union([b.literal(`GET`),b.literal(`POST`),b.literal(`PUT`),b.literal(`DELETE`),b.literal(`PATCH`)]),Hn=b.object({kind:b.literal(`channel`),name:b.string(),logicalPath:b.string(),method:Vn,urlPath:b.string(),sourceId:b.string(),sourceKind:b.literal(`module`),exportName:b.string().optional()}).strict(),Un=b.object({kind:b.literal(`disabled`),name:b.string(),logicalPath:b.string()}).strict(),Wn=b.union([Hn,Un]),Gn=b.object({contextWindowTokens:b.number().int().positive().optional(),id:b.string(),source:Bn.optional(),providerOptions:ee.optional()}).strict(),Kn=b.object({externalDependencies:b.array(b.string()).optional()}).strict(),qn=b.object({model:Gn.optional(),thresholdPercent:b.number().finite().min(0).max(1).optional()}).strict(),Jn=b.object({build:Kn.optional(),compaction:qn.optional(),description:b.string().optional(),metadata:b.record(b.string(),b.string()),model:Gn,name:b.string(),source:Bn.optional()}).strict(),Yn=b.object({name:b.string(),logicalPath:b.string(),markdown:b.string(),sourceId:b.string(),sourceKind:b.union([b.literal(`markdown`),b.literal(`module`)])}).strict(),Xn={name:b.string(),description:b.string(),license:b.string().optional(),markdown:b.string(),metadata:b.record(b.string(),b.string()).optional(),sourceId:b.string(),logicalPath:b.string()},Zn=b.discriminatedUnion(`sourceKind`,[b.object({...Xn,sourceKind:b.literal(`markdown`)}).strict(),b.object({...Xn,sourceKind:b.literal(`module`),exportName:b.string().optional()}).strict(),b.object({...Xn,sourceKind:b.literal(`skill-package`),skillId:b.string(),skillFilePath:b.string(),rootPath:b.string(),assetsPath:b.string().optional(),referencesPath:b.string().optional(),scriptsPath:b.string().optional()}).strict()]),Qn=b.object({name:b.string(),args:b.record(b.string(),b.unknown())}).strict(),$n=b.object({channel:Qn.optional(),cron:b.string(),name:b.string(),logicalPath:b.string(),markdown:b.string(),sourceId:b.string(),sourceKind:b.union([b.literal(`markdown`),b.literal(`module`)])}).strict(),er=b.object({description:b.string().optional(),exportName:b.string().optional(),logicalPath:b.string(),sourceId:b.string(),sourceKind:b.literal(`module`)}).strict(),tr=b.object({logicalPath:b.string(),rootEntries:b.array(b.string()).readonly(),sourceId:b.string(),sourcePath:b.string()}).strict(),nr=b.object({logicalPath:b.string(),rootEntries:b.array(b.string()).readonly()}).strict(),rr=b.object({connectionName:b.string(),description:b.string(),exportName:b.string().optional(),logicalPath:b.string(),sourceId:b.string(),sourceKind:b.literal(`module`),url:b.string()}).strict(),ir=b.object({description:b.string(),exportName:b.string().optional(),inputSchema:ee.nullable(),logicalPath:b.string(),name:b.string(),sourceId:b.string(),sourceKind:b.literal(`module`)}).strict(),ar=b.object({exportName:b.string().optional(),logicalPath:b.string(),slug:b.string(),sourceId:b.string(),sourceKind:b.literal(`module`)}).strict(),or=b.object({agentRoot:b.string(),appRoot:b.string(),channels:b.array(Wn),config:Jn,connections:b.array(rr),diagnosticsSummary:Pe,disabledFrameworkTools:b.array(b.string()).readonly(),hooks:b.array(ar),sandbox:er.nullable(),sandboxWorkspaces:b.array(tr),schedules:b.array($n),skills:b.array(Zn).readonly(),system:Yn.optional(),tools:b.array(ir),workspaceResourceRoot:nr}).strict(),sr=b.object({agent:or,description:b.string(),entryPath:b.string(),logicalPath:b.string(),name:b.string(),nodeId:b.string(),rootPath:b.string(),sourceId:b.string(),sourceKind:b.literal(`module`),exportName:b.string().optional()}).strict(),cr=b.object({childNodeId:b.string(),parentNodeId:b.string()}).strict(),lr=b.object({agentRoot:b.string(),appRoot:b.string(),channels:b.array(Wn),config:Jn,connections:b.array(rr),diagnosticsSummary:Pe,disabledFrameworkTools:b.array(b.string()).readonly(),hooks:b.array(ar),kind:b.literal(zn),sandbox:er.nullable(),sandboxWorkspaces:b.array(tr),schedules:b.array($n),skills:b.array(Zn).readonly(),subagentEdges:b.array(cr),subagents:b.array(sr),system:Yn.optional(),tools:b.array(ir),version:b.literal(22),workspaceResourceRoot:nr}).strict();function ur(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:mr(e.config.compaction.model),thresholdPercent:e.config.compaction?.thresholdPercent},description:e.config.description,metadata:{...e.config.metadata},model:mr(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:dr({sandboxWorkspaces:e.sandboxWorkspaces,skills:e.skills})}};return e.system!==void 0&&(t.system=e.system),t}function dr(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 fr(e,t){return e===`__root__`?t:`${e}::${t}`}function pr(e){return{...ur(e),kind:zn,subagentEdges:[...e.subagentEdges??[]],subagents:[...e.subagents??[]],version:22}}function mr(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 hr=/^\/?[A-Za-z]:[\\/]/,gr=/^\\\\[^\\]/,_r=/(\b(?:from|import)\s*(?:\(\s*)?)(["'])([A-Za-z]:[\\/][^"'\n\r]*)\2/g;function vr(e){return hr.test(e)||gr.test(e)}function yr(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 br(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 xr(e){if(e.startsWith(`file://`))return e;let{path:t,suffix:n}=br(e);return vr(t)?`${yr(t)}${n}`:e.replaceAll(`\\`,`/`)}function Sr(e){return JSON.stringify(xr(e))}function Cr(e){return e.replace(_r,(e,t,n,r)=>`${t}${n}${xr(r)}${n}`)}const wr=b.object({modules:b.record(b.string(),b.object({}).passthrough())}).strict(),Tr=b.object({nodes:b.record(b.string(),wr)}).strict();function Er(e){let t=Mr(e.moduleMapPath),n=e.importSpecifierStyle??`relative`,r=0,i=[Dr({agentRoot:e.manifest.agentRoot,importSpecifierStyle:n,manifest:e.manifest,moduleMapDirectory:t,nextBindingName(){return`module_${r++}`},nodeId:L}),...[...e.manifest.subagents].sort((e,t)=>e.nodeId.localeCompare(t.nodeId)).map(e=>Dr({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 = ${Ar(i)};`,``,`export default moduleMap;`,``].join(`
|
|
4
|
-
`)}function Dr(e){return{modules:Or(e.manifest).sort((e,t)=>e.sourceId.localeCompare(t.sourceId)).map(t=>({bindingName:e.nextBindingName(),importSpecifier:kr({fromDirectory:e.moduleMapDirectory,importSpecifierStyle:e.importSpecifierStyle,targetPath:Nr(e.agentRoot,t.logicalPath)}),sourceId:t.sourceId})),nodeId:e.nodeId}}function Or(e){let t=new Map;e.config.source!==void 0&&t.set(e.config.source.sourceId,e.config.source),e.config.model.source!==void 0&&t.set(e.config.model.source.sourceId,e.config.model.source);for(let n of e.channels)n.kind!==`disabled`&&t.set(n.sourceId,{exportName:n.exportName,sourceKind:`module`,logicalPath:n.logicalPath,sourceId:n.sourceId});for(let n of e.connections)t.set(n.sourceId,{exportName:n.exportName,sourceKind:`module`,logicalPath:n.logicalPath,sourceId:n.sourceId});for(let n of e.tools)t.set(n.sourceId,{exportName:n.exportName,sourceKind:`module`,logicalPath:n.logicalPath,sourceId:n.sourceId});for(let n of e.hooks)t.set(n.sourceId,{exportName:n.exportName,sourceKind:`module`,logicalPath:n.logicalPath,sourceId:n.sourceId});return e.sandbox!==null&&t.set(e.sandbox.sourceId,{exportName:e.sandbox.exportName,sourceKind:`module`,logicalPath:e.sandbox.logicalPath,sourceId:e.sandbox.sourceId}),[...t.values()]}function kr(e){if(e.importSpecifierStyle===`absolute`)return xr(Fr(e.targetPath));let t=Pr(e.fromDirectory,e.targetPath);return t.startsWith(`.`)?t:`./${t}`}function Ar(e){return jr([{key:`nodes`,value:jr(e.map(e=>({key:e.nodeId,value:jr([{key:`modules`,value:jr(e.modules.map(e=>({key:e.sourceId,value:e.bindingName})))}],3)})))}],0)}function jr(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 Mr(e){let t=R(e);return t.segments.length===0?t.root.length===0?`.`:t.root:Ir(t.root,t.segments.slice(0,-1))}function Nr(e,t){let n=R(e),r=R(t);return r.root.length>0?Ir(r.root,r.segments):Ir(n.root,[...n.segments,...r.segments])}function Pr(e,t){let n=R(e),r=R(t);if(n.root!==r.root)return Fr(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 Fr(e){let t=R(e);return Ir(t.root,t.segments)}function R(e){let t=e.replaceAll(`\\`,`/`),n=``,r=t,i=t.match(/^[A-Za-z]:/);i===null?t.startsWith(`/`)&&(n=`/`,r=t.slice(1)):(n=i[0],r=t.slice(n.length),r.startsWith(`/`)&&(n=`${n}/`,r=r.slice(1)));let a=[];for(let e of r.split(`/`))if(!(e.length===0||e===`.`)){if(e===`..`){if(a.length>0&&a[a.length-1]!==`..`){a.pop();continue}n.length===0&&a.push(e);continue}a.push(e)}return{root:n,segments:a}}function Ir(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 Lr=`ash-model-catalog-cache`,Rr=b.object({provider:b.string().min(1),providerModelId:b.string().min(1),contextWindowTokens:b.number().int().nonnegative().optional(),maxOutputTokens:b.number().int().nonnegative().optional()}).passthrough(),zr=b.object({slug:b.string().min(1),providers:b.array(Rr).min(1)}).passthrough(),Br=b.object({models:b.array(zr),providerAliases:b.record(b.string(),b.string())}).passthrough();b.object({contextWindowTokens:b.number().int().positive(),maxOutputTokens:b.number().int().positive().optional()}).strict();const Vr=b.object({fetchedAt:b.string(),kind:b.literal(Lr),models:b.array(zr),providerAliases:b.record(b.string(),b.string()),version:b.literal(2)}).strict(),Hr=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 Ur(e){return S(e,`.ash`,`cache`,`model-catalog.json`)}function Wr(e){let t=null,n=null,r=null,i=async()=>(t??=Kr(e),await t),a=async()=>{if(n!==null)throw n;if(r!==null)return await r;r=Gr(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&&Yr(e))return e;try{return await a()}catch{return e===null?null:e}};return{async getModelLimits(e){let t=Xr(e),n=await o();if(n!==null){let e=qr(n.models,t);if(e)for(let t of e.providers){let e=Jr(t);if(e!==null)return e}}return Hr.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=Xr(t);for(let e of n.models)for(let t of e.providers)if(t.provider===i&&Xr(t.providerModelId)===a){let n=Jr(t);if(n!==null)return{slug:e.slug,limits:n}}return null}}}async function Gr(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=Br.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:Lr,models:n.data.models,providerAliases:n.data.providerAliases,version:2};try{let t=Ur(e);await w(S(e,`.ash`,`cache`),{recursive:!0}),await T(t,`${JSON.stringify(r,null,2)}\n`,`utf8`)}catch{}return r}async function Kr(e){try{let t=await ge(Ur(e),`utf8`),n=Vr.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 qr(e,t){return e.find(e=>e.slug===t)}function Jr(e){return e.contextWindowTokens===void 0||e.contextWindowTokens<=0?null:{contextWindowTokens:e.contextWindowTokens,...e.maxOutputTokens!==void 0&&e.maxOutputTokens>0&&{maxOutputTokens:e.maxOutputTokens}}}function Yr(e){let t=Date.parse(e.fetchedAt);return Number.isFinite(t)?Date.now()-t<=864e5:!1}function Xr(e){return e.endsWith(`-thinking`)?e.slice(0,-9):e}async function z(e){let t=i(await u(S(e.agentRoot,e.source.logicalPath)),e.source);try{return await o(t)}catch(t){throw Error(`Failed to execute the ${e.kind} export "${e.source.exportName??`default`}" from "${e.source.logicalPath}": ${m(t)}`)}}var Zr=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 Qr(e,t){if(e.configModule===void 0)throw new Zr(e.agentId);let n=tt(await z({agentRoot:e.agentRoot,kind:`agent config`,source:e.configModule}),`Expected the agent config export "${e.configModule.exportName??`default`}" from "${e.configModule.logicalPath}" to match the public Ash shape.`),r=await $r({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 $r({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 $r(e){if(typeof e.value==`string`)return await ei({id:le(e.value),providerOptions:e.providerOptions===void 0?void 0:ce(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:ce(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 ei(i,e)}async function ei(e,t){if(t.contextWindowTokens!==void 0)return{...e,contextWindowTokens:t.contextWindowTokens};let n;try{n=await t.modelCatalog.getModelLimits(e.id)}catch(n){if(!t.requireContextWindowTokens)return e;throw Error(`Failed to load AI Gateway model metadata for ${t.purpose} "${e.id}". ${m(n)}`)}if(n===null){if(!t.requireContextWindowTokens)return e;throw Error(`Cannot compile agent compaction because ${t.purpose} "${e.id}" does not have known AI Gateway context window metadata.`)}return{...e,contextWindowTokens:n.contextWindowTokens}}const ti=new Set([`GET`,`POST`,`PUT`,`DELETE`,`PATCH`]);function ni(e){return typeof e==`object`&&!!e&&e.__kind===`ash:channel`}function ri(e,t){if(ni(e))return e;let r=n(e,t);a(r,[`adapter`,`fetch`,`method`,`receive`],t);let i=l(r.fetch,t),o;if(r.method!==void 0){if(typeof r.method!=`string`||!ti.has(r.method))throw Error(t);o=r.method}let s=r.adapter,c=typeof r.receive==`function`?r.receive:void 0;return o===void 0?{adapter:s,fetch:i,receive:c}:{adapter:s,fetch:i,method:o,receive:c}}function ii(e){return typeof e==`object`&&!!e&&e.kind===`ash:disabled-channel`}function ai(e){return`/${e.split(`/`).map(oi).join(`/`)}`}function oi(e){return e.startsWith(`[`)&&e.endsWith(`]`)?`:${e.slice(1,-1)}`:e}async function si(e,t){let n=await z({agentRoot:e,kind:`channel`,source:t}),r=A(t.logicalPath).replace(/^channels\//,``);if(ii(n))return{kind:`disabled`,name:r,logicalPath:t.logicalPath};let i=ri(n,`Expected the channel export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Ash shape.`);return ni(i)?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})):{kind:`channel`,name:r,logicalPath:t.logicalPath,method:i.method??`POST`,urlPath:ai(r),sourceId:t.sourceId,sourceKind:`module`,exportName:t.exportName}}async function ci(e,t){let n=new Map;for(let r of t){let t=await z({agentRoot:e,kind:`channel`,source:r});if(ii(t))continue;let i=A(r.logicalPath).replace(/^channels\//,``);typeof t==`object`&&t&&(n.set(t,i),s(C(S(e,r.logicalPath)),t))}return n}function li(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 ui(e,t,n=`auth`){let r=li(e,n);if(r!==void 0)throw Error(`${t} ${r}`);let i=e;return i.startAuthorization!==void 0&&i.completeAuthorization!==void 0?{completeAuthorization:i.completeAuthorization,getToken:i.getToken,principalType:`user`,startAuthorization:i.startAuthorization}:{getToken:i.getToken,principalType:i.principalType??`app`}}const di=[`approval`,`auth`,`description`,`headers`,`tools`,`url`],fi=[`completeAuthorization`,`getToken`,`principalType`,`startAuthorization`];function pi(e,t){let r=n(e,t);a(r,di,t),mi(r,t),hi(r,t);let i=gi(r,t),o=_i(r,t),s=vi(r,t);if(i!==void 0&&o!==void 0&&typeof o!=`function`&&Object.keys(o).some(e=>e.toLowerCase()===`authorization`))throw Error(`${t} "headers" must not include an "Authorization" key when "auth" is also provided.`);let c={description:r.description,url:r.url};if(i!==void 0&&(c.auth=i),o!==void 0&&(c.headers=o),s!==void 0&&(c.tools=s),r.approval!==void 0){if(typeof r.approval!=`function`)throw Error(`${t} The "approval" field must be a function when provided.`);c.approval=r.approval}return c}function mi(e,t){if(typeof e.url!=`string`||!URL.canParse(e.url))throw Error(`${t} The "url" field must be a valid URL.`);let n=new URL(e.url);if(n.protocol!==`https:`&&n.protocol!==`http:`)throw Error(`${t} The "url" field must use the http or https protocol, got "${n.protocol}".`)}function hi(e,t){if(typeof e.description!=`string`||e.description.length===0)throw Error(`${t} The "description" field must be a non-empty string.`)}function gi(e,t){if(e.auth===void 0)return;let r=n(e.auth,`${t} The "auth" field must be an object with a "getToken" method.`);return a(r,fi,`${t} The "auth" field`),ui(r,t)}function _i(e,t){if(e.headers===void 0)return;if(typeof e.headers==`function`)return e.headers;if(typeof e.headers!=`object`||e.headers===null||Array.isArray(e.headers))throw Error(`${t} The "headers" field must be a plain object or a function.`);let n=e.headers;for(let[e,r]of Object.entries(n)){let n=typeof r;if(n!==`string`&&n!==`function`&&n!==`object`||n===`object`&&(r===null||typeof r.then!=`function`))throw Error(`${t} The "headers.${e}" value must be a string, Promise, or function.`)}return n}function vi(e,t){if(e.tools===void 0)return;if(typeof e.tools!=`object`||e.tools===null||Array.isArray(e.tools))throw Error(`${t} The "tools" field must specify either "allow" or "block".`);let n=e.tools,r=`allow`in n,i=`block`in n;if(r&&i)throw Error(`${t} The "tools" field must specify either "allow" or "block", not both.`);if(!r&&!i)throw Error(`${t} The "tools" field must specify either "allow" or "block".`);return r?(yi(n.allow,`${t} The "tools.allow"`),{allow:n.allow}):(yi(n.block,`${t} The "tools.block"`),{block:n.block})}function yi(e,t){if(!Array.isArray(e))throw Error(`${t} field must be an array of strings.`);for(let n=0;n<e.length;n++)if(typeof e[n]!=`string`)throw Error(`${t}[${n}] must be a string.`)}async function bi(e,t){let n=pi(await z({agentRoot:e,kind:`connection`,source:t}),`Expected the connection export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Ash shape.`);return{connectionName:t.connectionName,description:n.description,exportName:t.exportName,logicalPath:t.logicalPath,sourceId:t.sourceId,sourceKind:`module`,url:n.url}}function xi(e){return{exportName:e.exportName,logicalPath:e.logicalPath,slug:A(e.logicalPath).replace(/^hooks\//,``),sourceId:e.sourceId,sourceKind:`module`}}function Si(e,t){let r=n(e,t);a(r,[`backend`,`bootstrap`,`description`,`onSession`],t);let i={};if(r.backend!==void 0&&(i.backend=Ci(r.backend,t)),r.description!==void 0){if(typeof r.description!=`string`)throw Error(`${t} The "description" field must be a string when set.`);i.description=r.description}return r.bootstrap!==void 0&&(i.bootstrap=l(r.bootstrap,t)),r.onSession!==void 0&&(i.onSession=l(r.onSession,t)),i}function Ci(e,t){let r=n(e,`${t} The "backend" field must be a SandboxBackend value (use vercelBackend(), localBackend(), or your own factory).`);if(typeof r.name!=`string`||r.name.length===0)throw Error(`${t} The "backend" value must expose a non-empty string "name" identifier.`);if(typeof r.create!=`function`)throw Error(`${t} The "backend" value must expose a "create" function.`);if(r.prewarm!==void 0&&typeof r.prewarm!=`function`)throw Error(`${t} The "backend.prewarm" property must be a function when set.`);return r}async function wi(e,t){return{description:Si(await z({agentRoot:e,kind:`sandbox`,source:t}),`Expected the sandbox export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Ash shape.`).description,exportName:t.exportName,logicalPath:t.logicalPath,sourceId:t.sourceId,sourceKind:`module`}}async function Ti(e,t){let n=t.sourceKind===`markdown`?ot(t.definition,`Expected the compiled system definition at "${t.logicalPath}" to match the public Ash shape.`):ot(await z({agentRoot:e,kind:`system`,source:t}),`Expected the system 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 Ei(e,t,n){let r=t.sourceKind===`markdown`?ct(t.definition,`Expected the compiled schedule definition at "${t.logicalPath}" to match the public Ash shape.`):ct(await z({agentRoot:e,kind:`schedule`,source:t}),`Expected the schedule export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Ash shape.`),i={cron:r.cron,logicalPath:t.logicalPath,markdown:r.markdown.trim(),name:Oi(t.logicalPath),sourceId:t.sourceId,sourceKind:t.sourceKind};return r.channel!==void 0&&(i.channel=Di({channel:r.channel,channelIdentityMap:n,logicalPath:t.logicalPath})),i}function Di(e){let t=e.channel,n=t.__route??t,r=t.args??{},i=e.channelIdentityMap.get(n);if(!i&&typeof t.name==`string`&&(i=t.name),!i)throw Error(`Schedule at "${e.logicalPath}" references a channel that was not discovered in agent/channels/. Import a channel module or pass { name: "<channel-name>", args: { ... } } as the channel field.`);return{name:i,args:r}}function Oi(e){return A(e).replace(/^schedules\//,``)}async function ki(e,t){if(t.sourceKind===`skill-package`)return Ai(t);let n=t.sourceKind===`markdown`?st(t.definition,`Expected the compiled skill definition at "${t.logicalPath}" to match the public Ash shape.`):st(await z({agentRoot:e,kind:`skill`,source:t}),`Expected the skill export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Ash shape.`);return{description:n.description,license:n.license,logicalPath:t.logicalPath,markdown:n.markdown,metadata:n.metadata===void 0?void 0:{...n.metadata},name:A(t.logicalPath).replace(/^skills\//,``),sourceId:t.sourceId,sourceKind:t.sourceKind}}function Ai(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 ji(e){let t=[],n=[];for(let r of e.subagents){let i=await Mi({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 Mi(e){let t=fr(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 ji({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 Ni(e){return typeof e==`object`&&!!e&&e.kind===`ash:disabled-tool`}function Pi(e){return e&&typeof e==`object`&&`~standard`in e?e[`~standard`].jsonSchema.input({target:`draft-07`}):JSON.parse(JSON.stringify(e))}function Fi(e,t){if(Ni(e))return{kind:`disabled`};let i=n(e,t);a(i,[`description`,`execute`,`inputSchema`,`needsApproval`,`onCompact`],t);let o=i.inputSchema===void 0?null:Pi(i.inputSchema),s={description:r(i.description,t),execute:l(i.execute,t),inputSchema:o};return i.onCompact!==void 0&&l(i.onCompact,t),i.needsApproval!==void 0&&l(i.needsApproval,t),{kind:`tool`,definition:s}}async function Ii(e,t){let n=Fi(await z({agentRoot:e,kind:`tool`,source:t}),`Expected the tool export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Ash shape.`),r=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 Li(e){let t={modelCatalog:Wr(e.appRoot)},[n,r]=await Promise.all([Ri(e,t),ji({appRoot:e.appRoot,compileAgentNodeManifest:Ri,context:t,parentNodeId:L,subagents:e.subagents})]);return pr({...n,subagentEdges:r.edges,subagents:r.nodes})}async function Ri(e,t){let n=await Promise.all(e.tools.map(t=>Ii(e.agentRoot,t))),r=[],i=[];for(let e of n)e.kind===`tool`?r.push(e.definition):i.push(e.name);let[a,o]=await Promise.all([Promise.all(e.channels.map(t=>si(e.agentRoot,t))),ci(e.agentRoot,e.channels)]),s=a.flat();return ur({agentRoot:e.agentRoot,appRoot:e.appRoot,channels:s,config:await Qr(e,t),connections:await Promise.all(e.connections.map(t=>bi(e.agentRoot,t))),diagnosticsSummary:e.diagnosticsSummary,disabledFrameworkTools:i,hooks:e.hooks.map(e=>xi(e)),sandbox:e.sandbox===null?null:await wi(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=>Ei(e.agentRoot,t,o))),skills:await Promise.all(e.skills.map(t=>ki(e.agentRoot,t))),system:e.system===void 0?void 0:await Ti(e.agentRoot,e.system),tools:r})}const zi=`workspace-resources`;async function Bi(e){let t=S(e.compileDirectoryPath,zi);await ve(t,{force:!0,recursive:!0});let n=await Hi({nodeId:L,resourcesRoot:t,manifest:e.manifest}),r=await Promise.all(e.manifest.subagents.map(async e=>({...e,agent:await Hi({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 Vi(e,t){return{logicalPath:O(S(zi,t)),rootEntries:dr({sandboxWorkspaces:e.sandboxWorkspaces,skills:e.skills})}}async function Hi(e){for(let t of e.manifest.sandboxWorkspaces)if(t.rootEntries.some(e=>e===`skills/`||e===`skills`))throw Error(`Sandbox workspace "${t.logicalPath}" cannot define "skills" because Ash manages that workspace entry.`);let t=S(e.resourcesRoot,e.nodeId);await w(t,{recursive:!0});for(let n of e.manifest.sandboxWorkspaces)await he(n.sourcePath,t,{recursive:!0});for(let n of e.manifest.skills)await Ui({nodeRoot:t,skill:n});return{...e.manifest,workspaceResourceRoot:Vi(e.manifest,e.nodeId)}}async function Ui(e){let t=S(e.nodeRoot,`skills`,e.skill.name);if(e.skill.sourceKind===`skill-package`){await he(e.skill.rootPath,t,{recursive:!0});return}let n=S(t,`SKILL.md`);await w(x(n),{recursive:!0}),await T(n,e.skill.markdown)}function Wi(e){let t=C(e),n=S(t,`.ash`,`discovery`),r=S(t,`.ash`,`compile`);return{appRoot:t,compiledManifestPath:S(r,`compiled-agent-manifest.json`),compileDirectoryPath:r,compileMetadataPath:S(r,`compile-metadata.json`),diagnosticsPath:S(n,`diagnostics.json`),discoveryManifestPath:S(n,`agent-discovery-manifest.json`),discoveryDirectoryPath:n,moduleMapPath:S(r,`module-map.mjs`)}}function Gi(e){return{diagnostics:[...e],kind:`ash-discovery-diagnostics`,summary:Le(e),version:1}}function Ki(e){let t=v(),n=Ji(e.discoveryManifestJson),r=Ji(e.diagnosticsArtifactJson),i=Ji(e.moduleMapSource);return{compile:{moduleMap:{path:Xi(e.appRoot,e.paths.moduleMapPath),sha256:i}},discovery:{diagnostics:{path:Xi(e.appRoot,e.paths.diagnosticsPath),sha256:r},manifest:{path:Xi(e.appRoot,e.paths.discoveryManifestPath),sha256:n},sourceGraphHash:Ji(`${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 qi(e){let t=Wi(e.appRoot),n=Gi(e.diagnostics),r=await Bi({compileDirectoryPath:t.compileDirectoryPath,manifest:await Li(e.manifest)}),i=Yi(r),a=Yi(e.manifest),o=Yi(n),s=Er({manifest:r,moduleMapPath:t.moduleMapPath}),c=Ki({appRoot:e.appRoot,diagnosticsArtifactJson:o,diagnosticsSummary:n.summary,discoveryManifestJson:a,moduleMapSource:s,paths:t}),l=Yi(c);return await w(t.discoveryDirectoryPath,{recursive:!0}),await w(t.compileDirectoryPath,{recursive:!0}),await Promise.all([T(t.compiledManifestPath,i),T(t.diagnosticsPath,o),T(t.discoveryManifestPath,a),T(t.moduleMapPath,s),T(t.compileMetadataPath,l)]),{compiledManifest:r,diagnosticsArtifact:n,metadata:c,moduleMapSource:s,paths:t}}function Ji(e){return be(`sha256`).update(e).digest(`hex`)}function Yi(e){return`${JSON.stringify(e,null,2)}\n`}function Xi(e,t){return O(fe(C(e),t))}var Zi=class extends Error{result;constructor(e){super($i({diagnostics:e.diagnostics,diagnosticsPath:e.paths.diagnosticsPath})),this.name=`CompileAgentError`,this.result=e}};async function Qi(e={}){let t=e.source??F(),n=await jn(e.startPath,{source:t}),r=await On({...n,source:t}),i=await qi({appRoot:n.appRoot,diagnostics:r.diagnostics,manifest:r.manifest}),a={diagnostics:r.diagnostics,manifest:i.compiledManifest,metadata:i.metadata,paths:i.paths,project:n};if(Re(r.diagnostics))throw new Zi(a);return a}function $i(e){let t=Le(e.diagnostics),n=[`Discovery failed with ${t.errors} error(s) and ${t.warnings} warning(s).`];if(e.diagnosticsPath!==void 0&&n.push(`Diagnostics artifact: ${e.diagnosticsPath}`),e.diagnostics.length===0)return n.join(`
|
|
8
|
-
`);n.push(`Discovery diagnostics:`);for(let t of e.diagnostics)n.push(`- ${ea(t.severity)}: ${t.message}`),n.push(` source: ${t.sourcePath}`);return n.join(`
|
|
9
|
-
`)}function ea(e){return e===`error`?`Error`:`Warning`}const ta=new Map;var B=class{name;codec;constructor(e,t={}){this.name=e,this.codec=t.codec,ta.set(e,this)}};const na=Symbol.for(`experimental-ash.context-storage`),ra=globalThis;ra[na]===void 0&&(ra[na]=new Ce);const ia=ra[na];function V(){let e=ia.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 aa(e){return{debug(t,n){da(`debug`,e,t,n)},info(t,n){da(`info`,e,t,n)},warn(t,n){da(`warn`,e,t,n)},error(t,n){da(`error`,e,t,n),pa(t,n)}}}function oa(){return crypto.randomUUID()}function sa(e,t){let n={errorId:t??oa(),message:la(e)},r=ca(e);return r!==void 0&&(n.name=r),n.detail=ma(e),n}function ca(e){if(e instanceof Error)return e.name===`Error`?void 0:e.name;if(f(e)&&p(e.name)&&e.name!==`Error`)return e.name}function la(e){return f(e)&&!(e instanceof Error)&&typeof e.message==`string`?e.message:Ee(e)}function ua(e,t){let n=t instanceof Error?t.message:Ee(t),r=t instanceof Error?t.name:`Error`;e.setStatus({code:we.ERROR,message:n}),e.recordException({message:n,name:r,stack:ma(t)})}function da(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,fa(r))}function fa(e){let t={};for(let[n,r]of Object.entries(e))if(r!==void 0){if(r instanceof Error){t[n]=sa(r);continue}t[n]=r}return t}function pa(e,t){let n=Te.getActiveSpan();if(n===void 0)return;let r=t?.error;if(r instanceof Error){ua(n,r);return}n.addEvent(e,t?fa(t):void 0)}function ma(e){return ha(De(e,{breakLength:1/0,compact:!1,depth:10,maxStringLength:8192}),16384)}function ha(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 ga(e){if(e.message!==void 0)return{inputResponses:e.inputResponses,message:e.message};if(e.inputResponses!==void 0&&e.inputResponses.length>0)return{inputResponses:e.inputResponses}}function _a(e){return e.kind??`unknown`}new B(`ash.auth`),new B(`ash.initiatorAuth`);const va=new B(`ash.sessionId`),ya=new B(`ash.continuationToken`);new B(`ash.mode`),new B(`ash.parentSession`),new B(`ash.capabilities`),new B(`ash.sessionPrepared`);const ba=aa(`execution.subagent-adapter`),xa=new Map;function Sa(e){return xa.get(e)}function Ca(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 wa={kind:`subagent`,async"input.requested"(e,t){let n=t.state;Ca(n)&&await Ta({hookPayload:{callId:n.callId,childContinuationToken:t.ctx.require(ya),childSessionId:t.ctx.require(va),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 Ta(e){"use step";let t=Sa(e.hookPayload.childContinuationToken);try{if(t!==void 0){t(e.hookPayload);return}await Se(e.parentContinuationToken,e.hookPayload)}catch(t){let n=oa();throw ba.warn(`failed to forward proxied HITL batch to parent`,{callId:e.hookPayload.callId,childContinuationToken:e.hookPayload.childContinuationToken,childSessionId:e.hookPayload.childSessionId,errorId:n,parentContinuationToken:e.parentContinuationToken,subagentName:e.hookPayload.subagentName,error:t}),t}}var H=class extends Error{registry;entryName;logicalPath;sourceId;constructor(e,t,n={}){super(t),this.name=`RuntimeRegistryError`,this.registry=e,n.entryName!==void 0&&(this.entryName=n.entryName),n.logicalPath!==void 0&&(this.logicalPath=n.logicalPath),n.sourceId!==void 0&&(this.sourceId=n.sourceId)}},Ea=class{registry;_entries=new Map;_reserved;constructor(e,t=[]){this.registry=e,this._reserved=new Set(t)}get size(){return this._entries.size}has(e){return this._entries.has(e)}get(e){return this._entries.get(e)??null}asMap(){return this._entries}register(e,t,n={}){if(this._entries.has(e))throw new H(this.registry,n.duplicateMessage??`Duplicate ${this.registry} name "${e}".`,{...n.location,entryName:e});if(this._reserved.has(e))throw new H(this.registry,n.reservedMessage??`${Da(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 Da(e){return e.length===0?e:e.charAt(0).toUpperCase()+e.slice(1)}const Oa=[{kind:`http`},wa],ka=new Set([`kind`,`state`,`deliver`,`contextProviders`,`createAdapterContext`,`attachments`]);function Aa(e){let t=new Map,n=new Set;for(let e of Oa){let r=Ma(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=Ma(i,e);if(n.has(a)){if(Na(i))throw new H(`adapter`,`Channel adapter kind "${a}" is reserved by the framework. A route-declared adapter may share a framework kind only as a pass-through with no \`deliver\` hook, event handlers, \`attachments\` resolver, \`contextProviders\`, or \`createAdapterContext\` factory. Use a custom \`kind\` to add channel-specific behavior.`,{...e,entryName:a});continue}t.set(a,i)}return{adaptersByKind:t}}function ja(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 Ma(e,t){let n=_a(e);if(n===`unknown`)throw new H(`adapter`,"Adapters must declare a non-empty `kind` field.",{entryName:`unknown`,logicalPath:t?.logicalPath,sourceId:t?.sourceId});return n}function Na(e){if(e.deliver!==void 0||e.attachments!==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(!ka.has(t)&&typeof n==`function`)return!0;return!1}function Pa(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 Fa(e){return e.kind===`disk`?e.appRoot:void 0}function Ia(e){return e.kind===`disk`?e.moduleMapLoadMode===void 0?`disk:${e.appRoot}`:e.moduleMapLoaderPath===void 0?`disk:${e.appRoot}:${e.moduleMapLoadMode}`:`disk:${e.appRoot}:${e.moduleMapLoadMode}:${e.moduleMapLoaderPath}`:`bundled`}function U(e){let t=La(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 La(e){let t=e.replaceAll(`\\`,`/`);return t===`/`?t:t.replace(/\/+$/,``)}function Ra(e){return Oe(e,{prefix:void 0}).message}function za(e=`test-session`){return{bundleCache:new Map,bundleCacheKeyBySourceKey:new Map,compiledArtifacts:null,id:e}}const Ba=Symbol.for(`experimental-ash.runtime-session-storage`),Va=Symbol.for(`experimental-ash.runtime-session-default`),W=globalThis;W[Ba]===void 0&&(W[Ba]=new Ce);const Ha=W[Ba];function Ua(){return W[Va]===void 0&&(W[Va]=za(`process-default`)),W[Va]}function Wa(){return Ha.getStore()??Ua()}function Ga(){return Wa().compiledArtifacts}const Ka=b.object({path:b.string(),sha256:b.string()}).strict(),qa=b.object({compile:b.object({moduleMap:Ka}).strict(),discovery:b.object({diagnostics:Ka,manifest:Ka,sourceGraphHash:b.string(),summary:b.object({errors:b.number().finite(),warnings:b.number().finite()}).strict()}).strict(),generator:b.object({name:b.string(),version:b.string()}).strict(),kind:b.literal(`ash-compile-metadata`),status:b.union([b.literal(`failed`),b.literal(`ready`)]),version:b.literal(5)}).strict();var Ja=class extends Error{metadataPath;constructor(e,t){super(e),this.name=`LoadCompileMetadataError`,t!==void 0&&(this.metadataPath=t)}};async function Ya(e){let t=e.metadataPath??(e.compiledArtifactsSource.kind===`disk`?U(e.compiledArtifactsSource.appRoot).compileMetadataPath:void 0);if(t!==void 0){let{readFile:e}=await import(`node:fs/promises`),n;try{n=JSON.parse(await e(t,`utf8`))}catch(e){throw new Ja(Za(e),t)}return Xa(n,t)}let n=Ga()?.metadata;return n===void 0?null:Xa(n,`bundled compile metadata`)}function Xa(e,t){let n=qa.safeParse(e);if(!n.success)throw new Ja(`Expected "${t}" to contain valid Ash compile metadata. ${Ra(n.error)}`,t);return n.data}function Za(e){return e instanceof Error?e.message:`Unknown compile metadata load failure.`}async function Qa(e){let t=Ia(e),n=await $a(e);try{let r=(await Ya({compiledArtifactsSource:e}))?.discovery.sourceGraphHash;return r===void 0||r.length===0?n===void 0?t:`${t}:mtime-${eo(n)}`:n===void 0?`${t}:${r}`:`${t}:${r}:mtime-${eo(n)}`}catch{return n===void 0?t:`${t}:mtime-${eo(n)}`}}async function $a(e){if(e.kind!==`disk`)return;let{stat:t}=await import(`node:fs/promises`),{compileMetadataPath:n}=U(e.appRoot);try{return(await t(n)).mtimeMs}catch{return}}function eo(e){return Math.floor(e).toString(36)}const to=`__root__`;function no(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 ro=`bundled compiled manifest`;var io=class extends Error{manifestPath;constructor(e,t){super(e),this.name=`LoadCompiledManifestError`,t!==void 0&&(this.manifestPath=t)}};async function ao(e){let t=e.manifestPath??(e.compiledArtifactsSource.kind===`disk`?U(e.compiledArtifactsSource.appRoot).compiledManifestPath:void 0);if(t!==void 0){let{readFile:e}=await import(`node:fs/promises`),n;try{n=JSON.parse(await e(t,`utf8`))}catch(e){throw new io(so(e),t)}return oo(n,t)}let n=Ga();if(n!==null)return oo(n.manifest,ro);throw new io(`Compiled manifest is unavailable without an app root or bundled compiled artifacts.`,ro)}function oo(e,t){let n=lr.safeParse(e);if(!n.success)throw new io(`Expected "${t}" to contain a valid compiled Ash agent manifest. ${Ra(n.error)}`,t);return n.data}function so(e){return e instanceof Error?e.message:`Unknown manifest load failure.`}const co=`bundled compiled module map`;var lo=class extends Error{moduleMapPath;constructor(e,t){super(e),this.name=`LoadCompiledModuleMapError`,t!==void 0&&(this.moduleMapPath=t)}};async function uo(e){let t=e.moduleMapPath??(e.compiledArtifactsSource.kind===`disk`?U(e.compiledArtifactsSource.appRoot).moduleMapPath:void 0);if(t!==void 0){let e=mo(t);try{let n=await import(e);return fo(n.moduleMap??n.default,t)}catch(e){throw new lo(po(e),t)}}let n=Ga();if(n!==null)return fo(n.moduleMap,co);throw new lo(`Compiled module map is unavailable without an app root or bundled compiled artifacts.`,co)}function fo(e,t){let n=Tr.safeParse(e);if(!n.success)throw new lo(`Expected "${t}" to export a valid compiled Ash module map. ${Ra(n.error)}`,t);return n.data}function po(e){return e instanceof Error?e.message:`Unknown module-map load failure.`}function mo(e){let t=e.replaceAll(`\\`,`/`);return/^[A-Za-z]:\//.test(t)?`file:///${encodeURI(t)}`:t.startsWith(`/`)?`file://${encodeURI(t)}`:t}const G=`/workspace`;function ho(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=>go(e))].join(`
|
|
10
|
-
`)}function go(e){return`- ${e.name}: ${e.description} (path: ${G}/skills/${e.name}/SKILL.md)`}function _o(e){if(e.rootEntries.length!==0)return[`Workspace`,`- You have access to authored files mounted at the workspace root for this run.`,`- The live workspace root visible to \`bash\` in this run is \`${G}\`.`,`- Root entries under ${G}/:`,...e.rootEntries.map(e=>` - ${e}`),`- Treat \`${G}\` as the workspace root for this run unless a \`bash\` call shows otherwise.`,"- For questions about workspace paths or file availability, verify with `bash` first using commands like `pwd`, `ls`, and `find`.","- Use the `bash` tool with `ls`, `find`, and `rg` to inspect deeper contents when needed.",`- Do not claim these files are unavailable unless a workspace or tool call actually fails.`].join(`
|
|
11
|
-
`)}function vo(e){return e instanceof Error&&e.name===`ConnectionAuthorizationRequiredError`}function yo(e){return e instanceof Error&&e.name===`ConnectionAuthorizationFailedError`}function bo(e){return e?.startAuthorization!==void 0}const xo=Object.freeze({__ashPlaceholder:`connection-authorization`}),So=new B(`ash.pendingConnectionToolCalls`);function Co(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 wo(e,t){return`${e}__${t}`}const To=aa(`framework.connection-search`),Eo=new B(`ash.connectionRegistry`),Do=new B(`ash.pendingConnectionAuthorizations`),Oo=new B(`ash.discoveredConnectionTools`),ko={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 Ao(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(Oo,{byConnection:{}}),e.set(Do,[]),e.set(So,[]),{}},sourceId:`ash:connection-search-tool`,sourceKind:`module`};async function Ao(e,t){let n=V(),r=n.get(Eo);if(r===void 0)return[];let i=e.limit??10,a=jo(e.keywords),o=[],s=[],c=e.connection!==void 0&&e.connection!==``?r.getConnections().filter(t=>t.connectionName===e.connection):r.getConnections(),l={...n.get(Oo)?.byConnection},u=[];for(let e of c){let t;try{t=await r.getClient(e.connectionName).getToolMetadata()}catch(t){if(vo(t)){u.push({connectionName:e.connectionName,description:e.description}),s.push({connection:e.connectionName,description:e.description,needsAuthorization:!0});continue}if(yo(t)){To.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`;To.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=Mo(a,n);t>0&&o.push({item:{connection:e.connectionName,description:n.description,inputSchema:n.inputSchema,qualifiedName:wo(e.connectionName,n.name),tool:n.name},score:t})}}n.set(Oo,{byConnection:l});let d=[];if(u.length>0){for(let e of u)Po(n,e);d=u.map(e=>e.connectionName).filter(e=>No(r,e))}if(d.length>0&&t?.toolCallId!==void 0){let r=n.get(So);return n.set(So,Co(r,[{args:e,connectionNames:d,kind:`connection-discover`,toolCallId:t.toolCallId,toolName:`connection_search`}])),xo}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 jo(e){return e.toLowerCase().split(/[\s_\-./]+/).filter(e=>e.length>1)}function Mo(e,t){let n=jo(t.name),r=jo(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 No(e,t){return e===void 0?!1:bo(e.getConnections().find(e=>e.connectionName===t)?.authorization)}function Po(e,t){let n=e.get(Do)??[];n.some(e=>e.connectionName===t.connectionName)||e.set(Do,[...n,t])}const Fo=ko.name;function Io(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 ${Fo} 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 Lo(e){return[...Ro(e.system),...zo(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.`]:[],...Bo(e.connections),...Vo(e.skills)]}function Ro(e){if(e===void 0)return[];let t=e.markdown.trim();return t.length===0?[]:[`System (${e.name})\n${t}`]}function zo(e){if(e===void 0)return[];let t=_o(e);return t===void 0?[]:[t]}function Bo(e){return!e||e.length===0?[]:[Io(e)]}function Vo(e){if(!e||e.length===0)return[];let t=ho(e);return t===null?[]:[t]}function Ho(e){let t=e.agent,n=Uo(t);return{id:t.config.name,instructions:Lo({connections:t.connections,system:t.system,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 Uo(e){let t={};return Object.keys(e.config.metadata).length>0&&(t.configMetadata={...e.config.metadata}),e.system!==void 0&&(t.systemName=e.system.name),e.skills.length>0&&(t.skillNames=e.skills.map(e=>e.name)),Object.keys(t).length>0?t:void 0}const Wo=new Set([`aud`,`exp`,`iat`,`iss`,`jti`,`nbf`,`sub`]);function Go(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 Ko(e){let t=Go(e);return Object.freeze(Object.fromEntries(Object.entries(t).filter(([e])=>!Wo.has(e))))}function qo(e,t){let n=Go(e);if(t.subjects!==void 0){let n=typeof e.sub==`string`?e.sub:null;if(n===null||!t.subjects.some(e=>Yo(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 Jo(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=Go(e.payload);return{attributes:Ko(e.payload),authenticator:e.authenticator,claims:r,issuer:t,principalId:`${t}:${n}`,principalType:e.principalType,subject:n}}function Yo(e,t){if(!e.includes(`*`))return e===t;let n=e.replaceAll(/[.+?^${}()|[\]\\]/g,`\\$&`).replaceAll(`*`,`.*`);return RegExp(`^${n}$`).test(t)}const Xo=b.object({issuer:b.string().optional(),jwks_uri:b.string().url()}).passthrough(),Zo=new Map,Qo=new Map;async function $o(e){let t;try{t=await es(e.strategy)}catch(e){return{kind:`misconfigured`,message:`Failed to load OIDC discovery metadata. ${e instanceof Error?e.message:`Unknown discovery failure.`}`}}try{let n=await je(e.token,t,{audience:[...e.strategy.audiences],clockTolerance:e.strategy.clockSkewSeconds,issuer:e.strategy.issuer});if(typeof n.payload.sub!=`string`||n.payload.sub.length===0)return{kind:`not-authenticated`};let r=e.strategy.acceptCurrentVercelProject&&ns({issuer:e.strategy.issuer,payload:n.payload}),i=r&&rs({payload:n.payload});return!r&&!qo(n.payload,e.strategy)?{kind:`caller-not-allowed`}:{kind:`authenticated`,principal:Jo({authenticator:`oidc`,payload:n.payload,principalType:i?`runtime`:`service`})}}catch{return{kind:`not-authenticated`}}}async function es(e){let t=await ts(e.discoveryUrl),n=Qo.get(t.jwks_uri);if(n!==void 0)return n;let r=ke(new URL(t.jwks_uri));return Qo.set(t.jwks_uri,r),r}async function ts(e){let t=Zo.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 Xo.parse(await e.json())}).catch(t=>{throw Zo.delete(e),t});return Zo.set(e,n),await n}function ns(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 rs(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 is(e){return{attributes:e.attributes,authenticator:e.authenticator,issuer:e.issuer,principalId:e.principalId,principalType:e.principalType,subject:e.subject}}const K=aa(`auth.vercel-oidc`);async function as(e,t){return e===null||e.length===0?{kind:`not-authenticated`}:await $o({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 os(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 ss(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`,cs(e));return Response.json({code:n,error:r,ok:!1},{headers:a,status:t})}function cs(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}="${ls(t)}"`).join(`, `);return`${e.scheme} ${t}`}function ls(e){return e.replaceAll(`\\`,`\\\\`).replaceAll(`"`,`\\"`)}function us(){return()=>void 0}async function ds(e,t={}){if(e===null||e.length===0)return K.debug(`Rejected request without a bearer token.`),{ok:!1};let n=ps(e);if(n===null)return K.debug(`Rejected token that failed to decode as a JWT.`),{ok:!1};if(!n.issuer.startsWith(`https://oidc.vercel.com/`))return K.debug(`Rejected token whose issuer is not a Vercel OIDC issuer.`,{issuer:n.issuer}),{ok:!1};if(n.audiences.length===0)return K.debug(`Rejected token with no audience claim.`,{issuer:n.issuer}),{ok:!1};let r=await as(e,{acceptCurrentVercelProject:!0,audiences:n.audiences,issuer:n.issuer,subjects:t.subjects??[]});return r.kind===`authenticated`?(K.debug(`Accepted Vercel OIDC token.`,{issuer:n.issuer,principalType:r.principal.principalType,subject:r.principal.subject}),{ok:!0,sessionAuth:is(r.principal)}):(K.debug(`Rejected Vercel OIDC token after verification.`,{audiences:n.audiences,issuer:n.issuer,reason:r.kind,subjectsConfigured:(t.subjects??[]).length>0,...r.kind===`misconfigured`?{detail:r.message}:{}}),{ok:!1})}function fs(e={}){return async t=>{let n=await ds(os(t.headers.get(`authorization`)),e);return n.ok?n.sessionAuth:null}}function ps(e){let t;try{t=Ae(e)}catch{return null}return typeof t.iss!=`string`||t.iss.length===0?null:{audiences:typeof t.aud==`string`?[t.aud]:Array.isArray(t.aud)?t.aud.filter(e=>typeof e==`string`):[],issuer:t.iss}}function ms(e){return Number.isFinite(e)&&Number.isInteger(e)&&e>=0}function hs(e){if(e.protocol!==`ash-attachment:`)throw Error(`AttachmentRef URL must use scheme "ash-attachment:". Got: "${e.protocol}".`);let t=e.searchParams.get(`v`);if(t!==`1`)throw Error(`AttachmentRef wire format version must be "1". Got: ${t===null?`missing`:JSON.stringify(t)}.`);let n=e.searchParams.get(`p`);if(n===null||n===``)throw Error(`AttachmentRef URL is missing the required "p" payload query param.`);let r;try{let e=Buffer.from(n,`base64url`).toString(`utf8`);r=JSON.parse(e)}catch(e){throw Error(`AttachmentRef payload is not valid base64url-encoded JSON: ${m(e)}`)}if(typeof r!=`object`||!r||Array.isArray(r))throw Error(`AttachmentRef payload must decode to a JSON object.`);let i=r;if(!(`params`in i))throw Error(`AttachmentRef payload is missing the required "params" field.`);let a=i.params;if(!(`size`in i))return{params:a};let o=i.size;if(typeof o!=`number`||!ms(o))throw Error(`AttachmentRef payload "size" must be a non-negative integer. Got: ${JSON.stringify(o)}.`);return{params:a,size:o}}function gs(e){return e instanceof URL&&e.protocol===`ash-attachment:`}function _s(e){return typeof Buffer<`u`&&Buffer.isBuffer(e)||e instanceof Uint8Array||e instanceof ArrayBuffer?e.byteLength:typeof e==`string`?vs(e):gs(e)?hs(e).size??null:e instanceof URL&&e.protocol===`data:`?vs(e.href):null}function vs(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 ys(r);try{return Buffer.byteLength(decodeURIComponent(r),`utf8`)}catch{return Buffer.byteLength(r,`utf8`)}}return/^https?:\/\//.test(e)?null:ys(e)}function ys(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 bs=Object.freeze({allowedMediaTypes:`*`,maxBytes:25*1024*1024});function xs(e,t=bs){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 Ss(e,t){if(t.allowedMediaTypes===`*`)return!0;let n=e.toLowerCase();for(let e of t.allowedMediaTypes){let t=e.toLowerCase();if(t===n)return!0;if(t.endsWith(`/*`)){let e=t.slice(0,-1);if(n.startsWith(e))return!0}}return!1}function Cs(e,t){if(!Ss(e.mediaType,t)){let n={allowedMediaTypes:t.allowedMediaTypes===`*`?[]:[...t.allowedMediaTypes],kind:`disallowed-media-type`,mediaType:e.mediaType};return e.filename===void 0?n:{...n,filename:e.filename}}let n=_s(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 ws(e,t){if(typeof e==`string`)return[];let n=[];for(let r of e){if(r.type!==`file`)continue;let e=Cs(r,t);e!==null&&n.push(e)}return n}function Ts(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 Es(e,t){return{method:`POST`,path:e,handler:t}}function Ds(e,t){return{method:`GET`,path:e,handler:t}}function Os(e){let t=ks(e);return{__kind:`ash:channel`,routes:e.routes,adapter:t,receive:e.receive}}function ks(e){let t=e.state!=null,n=e.context!=null,r=t||n,i={},a=!1,o=[`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`],s=e.events;for(let e of o){let t=s?.[e];t&&(a=!0,i[e]=(e,n)=>t(e,n))}return!r&&!a?{kind:`http`}:{kind:`defineChannel`,state:t?{...e.state}:{},createAdapterContext(t){let r=t.state;return{...n?e.context(r):{},state:r,ctx:t.ctx,session:{id:``,continuationToken:``,auth:null,initiatorAuth:null,setContinuationToken(e){}}}},deliver(e){return ga(e)},...i}}function As(e){let t=xs(e.uploadPolicy);return Os({routes:[Es(`/ash/v1/session`,async(n,{send:r})=>{let i=await js(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=Ms(o);if(s instanceof Response)return s;let c=Is(s,t);if(c!==null)return c;let l=`http:${crypto.randomUUID()}`,u=await r(typeof s.message==`string`?s.message:s.message?JSON.stringify(s.message):``,{auth:a,continuationToken:l});return Response.json({continuationToken:u.continuationToken,ok:!0,sessionId:u.id},{headers:{"cache-control":`no-store`,[y]:u.id},status:202})}),Es(`/ash/v1/session/:sessionId`,async(n,{send:r,getSession:i,params:a})=>{let o=await js(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=Ns(l);if(u instanceof Response)return u;let d=Is(u,t);if(d!==null)return d;let f=await r({inputResponses:u.inputResponses,message:u.message},{auth:s,continuationToken:u.continuationToken});return Response.json({ok:!0,sessionId:f.id},{headers:{"cache-control":`no-store`,[y]:f.id},status:200})}),Ds(`/ash/v1/session/:sessionId/stream`,async(t,{getSession:n,params:r})=>{let i=await js(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=Rs(t);if(o instanceof Response)return o;try{let e=zs(await n(a).getEventStream({startIndex:o}));return new Response(e,{headers:{"cache-control":`no-store`,"content-type":ie,[y]:a,[re]:te,[ae]:`14`}})}catch{return Response.json({error:`Session not found.`,ok:!1},{status:404})}})]})}async function js(e,t){let n=await e(t);return n===null?ss({challenges:[{scheme:`Bearer`}]}):n??null}function Ms(e){let t=Ps(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 Ns(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=Ps(e.message);if(n instanceof Response)return n;let r=Ls(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 Ps(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=Fs(n);if(e instanceof Response)return e;t.push(e)}return t}function Fs(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 Is(e,t){if(!e.message)return null;let n=ws(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:Ts(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 Ls(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 Rs(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 zs(e){let t=new TextEncoder;return e.pipeThrough(new TransformStream({transform(e,n){n.enqueue(t.encode(`${JSON.stringify(e)}\n`))}}))}function Bs(){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 Vs=[`GET`,`POST`];function Hs(){return Vs.map(e=>Ws(e))}function Us(){return new Set(Vs.map(Gs))}function Ws(e){let t=Gs(e);return{name:t,method:e,urlPath:se,fetch:Ks,logicalPath:`framework://channels/${t}`,sourceId:`ash:framework:connection-callback-${e.toLowerCase()}`,sourceKind:`module`}}function Gs(e){return`.well-known/ash/v1/connections/callback/${e.toLowerCase()}`}async function Ks(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 qs(e);try{await Se(r,i)}catch{return Response.json({error:`Connection callback not pending.`,ok:!1},{status:404})}return Bs()}async function qs(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}}const Js=`default`;function Ys(){let e=As({auth:Zs()}),t=[];for(let n of e.routes)t.push({name:Js,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(...Hs()),t}function Xs(){return new Set([Js,...Us()])}function Zs(){return process.env.VERCEL?fs():us()}const Qs=oe.omit({action:!0,display:!0,requestId:!0}),{$schema:$s,...ec}=b.toJSONSchema(Qs),tc={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:ec,logicalPath:`ash:framework/ask-question`,name:`ask_question`,sourceId:`ash:ask-question-tool`,sourceKind:`module`};async function q(){let e=V().get(Ju);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 nc(e){if(!e.startsWith(`/`))throw Error(`filePath must be an absolute path. Received: "${e}". Use an absolute path such as /workspace/foo.ts.`)}function rc(e){return ac(e,`head`)}function ic(e){return ac(e,`tail`)}function ac(e,t){let n=e.split(`
|
|
66
|
-
`),r=sc(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=oc(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 oc(e){return e.length<=2e3?e:e.slice(0,2e3)+` [truncated]`}function sc(e){return e.length>0&&e[e.length-1]===``?e.length-1:e.length}async function cc(e){let t=await(await q()).runCommand(e.command),n=ic(t.stdout),r=ic(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 lc={additionalProperties:!1,properties:{command:{description:`The shell command to execute.`,type:`string`}},required:[`command`],type:`object`};async function uc(e){return cc(e)}const dc={description:`Execute a shell command in the shared workspace environment.`,execute:uc,inputSchema:lc,logicalPath:`ash:framework/bash`,name:`bash`,sourceId:`ash:bash-tool`,sourceKind:`module`},fc=new B(`ash.readFile`);function J(e){return de.normalize(e)}function pc(e){return e}function mc(e){let t=be(`sha256`).update(e.content,`utf8`).digest(`hex`);return{byteLength:Buffer.byteLength(e.content,`utf8`),contentHash:t,filePath:e.filePath}}function hc(e,t,n){let r=e.ensure(fc,()=>({byTarget:{}}));e.set(fc,{byTarget:{...r.byTarget,[t]:n}})}function gc(e){e.set(fc,{byTarget:{}})}const _c=new Map;async function vc(e){let t=_c.get(e.id);if(t!==void 0)return t;let n=yc(e);_c.set(e.id,n);try{return await n}catch{return _c.delete(e.id),!1}}async function yc(e){return(await e.runCommand(`command -v rg >/dev/null 2>&1`)).exitCode===0}function Y(e){return`'${e.replace(/'/g,`'\\''`)}'`}async function bc(e){let t=e.path??`/workspace`;nc(t);let n=J(t),r=Math.min(Math.max(1,e.limit??100),1e3),i=await q(),a=await vc(i)?xc({normalizedPath:n,pattern:e.pattern}):Sc({normalizedPath:n,pattern:e.pattern}),o=await i.runCommand(a);if(o.exitCode!==0&&o.exitCode!==1)throw wc(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=J(e),n=Buffer.byteLength(t,`utf8`)+1;if(d+n>51200&&u.length>0){f=!0;break}u.push(t),d+=n}if(u.length===0)return{content:`No files found`,count:0,path:n,truncated:!1};let p=c||f,m=[...u];return p&&(m.push(``),m.push(`(Results truncated: showing first ${u.length} results out of more. Use a more specific path or pattern to narrow results.)`)),{content:m.join(`
|
|
69
|
-
`),count:u.length,path:n,truncated:p}}function xc(e){return[`rg --files --hidden`,`--glob '!.git/*'`,`--glob ${Y(e.pattern)}`,`-- ${Y(e.normalizedPath)}`].join(` `)}function Sc(e){let t=Cc(e.pattern),n=t.includes(`/`)?`-path ${Y(`*/${t}`)}`:`-name ${Y(t)}`;return[`find ${Y(e.normalizedPath)}`,`-type f`,`-not -path '*/.git/*'`,n].join(` `)}function Cc(e){let t=e.replaceAll(`**`,`*`);for(;t.startsWith(`*/`);)t=t.slice(2);return t}function wc(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 Tc={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 Ec(e){return bc(e)}const Dc={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:Ec,inputSchema:Tc,logicalPath:`ash:framework/glob`,name:`glob`,sourceId:`ash:glob-tool`,sourceKind:`module`};async function Oc(e){let t=e.path??`/workspace`;nc(t);let n=J(t),r=Math.min(Math.max(1,e.limit??100),1e3),i=e.context!==void 0&&e.context>0?e.context:0,a=await q(),o=await vc(a)?kc({contextLines:i,effectiveLimit:r,glob:e.glob,ignoreCase:e.ignoreCase??!1,literal:e.literal??!1,normalizedPath:n,pattern:e.pattern}):Ac({contextLines:i,effectiveLimit:r,glob:e.glob,ignoreCase:e.ignoreCase??!1,literal:e.literal??!1,normalizedPath:n,pattern:e.pattern}),s=await a.runCommand(o);if(s.exitCode!==0&&s.exitCode!==1)throw Mc(o,s.exitCode,s.stderr);let c=s.stdout;return c.trim().length===0?{content:`No matches found`,matchCount:0,path:n,truncated:!1}:jc({effectiveLimit:r,normalizedPath:n,stdout:c})}function kc(e){let t=[`rg`,`--line-number`,`--color=never`,`--hidden`,`--glob '!.git/*'`];return e.ignoreCase&&t.push(`--ignore-case`),e.literal&&t.push(`--fixed-strings`),e.glob!==void 0&&t.push(`--glob ${Y(e.glob)}`),e.contextLines>0&&t.push(`--context ${e.contextLines}`),t.push(`--max-count ${e.effectiveLimit}`),t.push(`--`),t.push(Y(e.pattern)),t.push(Y(e.normalizedPath)),t.join(` `)}function Ac(e){let t=[`grep`,`-r`,`-n`,`--color=never`,`--exclude-dir=.git`];return e.ignoreCase&&t.push(`-i`),e.literal?t.push(`-F`):t.push(`-E`),e.glob!==void 0&&t.push(`--include=${Y(e.glob)}`),e.contextLines>0&&t.push(`-C ${e.contextLines}`),t.push(`-m ${e.effectiveLimit}`),t.push(`--`),t.push(Y(e.pattern)),t.push(Y(e.normalizedPath)),t.join(` `)}function jc(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=oc(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 Mc(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 Nc={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 Pc(e){return Oc(e)}const Fc={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:Pc,inputSchema:Nc,logicalPath:`ash:framework/grep`,name:`grep`,sourceId:`ash:grep-tool`,sourceKind:`module`};async function Ic(e){let{filePath:t,offset:n,limit:r}=e;nc(t);let i=await q(),a=J(t),o=n??1,s=r??2e3;if(o<1)throw Error(`offset must be >= 1. Received: ${o}.`);let c=await i.readFile(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=mc({content:c,filePath:a}),f=pc(a);hc(V(),f,d);let p=o-1,m=Math.min(p+s,u),h=l.slice(p,m),g=[],_=0,v=!1;for(let e=0;e<h.length;e++){let t=`${o+e}: ${oc(h[e]??``)}`,n=Buffer.byteLength(t,`utf8`)+1;if(_+n>51200&&g.length>0){v=!0;break}g.push(t),_+=n}let y=g.join(`
|
|
75
|
-
`),ee=o+g.length-1;return ee<u||v?{content:y,nextOffset:ee+1,path:a,totalLines:u,truncated:!0}:{content:y,path:a,totalLines:u,truncated:!1}}const Lc={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 Rc(e){return Ic(e)}const zc={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:Rc,inputSchema:Lc,logicalPath:`ash:framework/read-file`,name:`read_file`,onCompact({ctx:e}){return gc(e),{}},sourceId:`ash:read-file-tool`,sourceKind:`module`},Bc=/^---\r?\n[\s\S]*?\r?\n---\r?\n?/;function Vc(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 Hc(e,t){Vc(t);let n=await Uc(e),r=Wc(t,`SKILL.md`),i=await n.readFile(r);if(i===null)throw Error(`No skill named "${t}" at ${r}.`);return i.replace(Bc,``)}async function Uc(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 Wc(e,t){return`${G}/skills/${e}/${t}`}async function Gc(e){let t=V().get(Ju);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 Hc(t,n)}const Kc={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=>Gc(e),inputSchema:{additionalProperties:!1,properties:{skill:{description:`Available skill name or id.`,type:`string`}},required:[`skill`],type:`object`},logicalPath:`ash:framework/load-skill`,name:`load_skill`,retentionPolicy:`keep`,sourceId:`ash:load-skill-tool`,sourceKind:`module`},qc=new B(`ash.todo`);function Jc(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 Yc(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 Xc(e){let t=V(),{todos:n}=e??{};if(n!==void 0){let e={items:[...n]};return t.set(qc,e),Yc(e)}return Yc(t.ensure(qc,()=>({items:[]})))}const Zc={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=>Xc(e??{}),inputSchema:{additionalProperties:!1,properties:{todos:{description:`The updated todo list. Omit to read the current list without modifying it.`,items:{additionalProperties:!1,properties:{content:{description:`Brief description of the task.`,type:`string`},priority:{description:`Priority level of the task.`,enum:[`high`,`medium`,`low`],type:`string`},status:{description:`Current status of the task.`,enum:[`pending`,`in_progress`,`completed`,`cancelled`],type:`string`}},required:[`content`,`status`,`priority`],type:`object`},type:`array`}},type:`object`},logicalPath:`ash:framework/todo`,name:`todo`,onCompact({ctx:e}){let t=e.get(qc);if(t===void 0||t.items.length===0)return{};let n=Jc(t);return n===void 0?{}:{messages:[{content:n,role:`user`}]}},sourceId:`ash:todo-tool`,sourceKind:`module`};function Qc(e){let t=new Me({bulletListMarker:`-`,codeBlockStyle:`fenced`,emDelimiter:`*`,headingStyle:`atx`,hr:`---`});return t.remove([`script`,`style`,`meta`,`link`]),t.turndown(e)}function $c(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=nl(t),t=t.split(`
|
|
81
|
-
`).map(e=>e.replace(/[ \t]+/g,` `).trim()).join(`
|
|
82
|
-
`).replace(/\n{3,}/g,`
|
|
83
|
-
|
|
84
|
-
`).trim(),t}const el={"&":`&`,">":`>`,"<":`<`," ":` `,""":`"`,"'":`'`,"'":`'`,"/":`/`},tl=new RegExp(Object.keys(el).join(`|`),`gi`);function nl(e){return e.replace(tl,e=>el[e.toLowerCase()]??e)}const rl=5*1024*1024;async function il(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=al(n),s=await fetch(t,{headers:o,signal:a}),c=s.status===403&&s.headers.get(`cf-mitigated`)===`challenge`?await fetch(t,{headers:{...o,"User-Agent":g},signal:a}):s;if(!c.ok)throw Error(`Request failed with status code: ${c.status}`);let l=c.headers.get(`content-length`);if(l!==null&&parseInt(l,10)>rl)throw Error(`Response too large (exceeds 5 MB limit).`);let u=await c.arrayBuffer();if(u.byteLength>rl)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?Qc(p):n===`text`&&f?$c(p):p;let{output:h,truncated:_}=rc(m);return{content:h,contentType:d,truncated:_,url:t}}function al(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 ol(e){return il(e)}const sl={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:ol,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`},cl={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 ll(e){let{filePath:t,content:n}=e;nc(t);let r=await q(),i=V(),a=J(t),o=pc(a),s=await r.readFile(t);if(s===null)return await r.writeFile(t,n),hc(i,o,mc({content:n,filePath:a})),{existed:!1,path:a};let c=i.ensure(fc,()=>({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=mc({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.writeFile(t,n),hc(i,o,mc({content:n,filePath:a})),{existed:!0,path:a}}const ul={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 dl(e){return ll(e)}const fl=[tc,dc,Dc,Fc,zc,{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:dl,inputSchema:ul,logicalPath:`ash:framework/write-file`,name:`write_file`,sourceId:`ash:write-file-tool`,sourceKind:`module`},Zc,sl,cl,Kc,ko],pl=new Map([[ko,e=>e.hasConnections]]);function ml(e){return fl.filter(t=>{let n=pl.get(t);return n===void 0||n(e)})}function hl(){return new Set(fl.map(e=>e.name))}function gl(e){let t=[],n=[],r=new Map,i=[];for(let a of e){let e=a.lifecycle.session;e!==void 0&&t.push({slug:a.slug,handler:e});let o=a.lifecycle.turn;o!==void 0&&n.push({slug:a.slug,handler:o});for(let[e,t]of Object.entries(a.events)){let n={slug:a.slug,handler:t,eventType:e};if(e===`*`)i.push(n);else{let t=r.get(e)??[];t.push(n),r.set(e,t)}}}return{session:t,turn:n,streamEventsByType:r,streamEventsWildcard:i}}var X=class extends Error{logicalPath;sourceId;constructor(e,t={}){super(e),this.name=`ResolveAgentError`,t.logicalPath!==void 0&&(this.logicalPath=t.logicalPath),t.sourceId!==void 0&&(this.sourceId=t.sourceId)}};function _l(e){return{exportName:e.exportName,logicalPath:e.logicalPath,sourceId:e.sourceId,sourceKind:`module`}}async function Z(e){let t=e.nodeId??`__root__`,r=e.moduleMap.nodes[t]?.modules[e.definition.sourceId];if(r===void 0)throw new X(`Missing compiled module namespace for ${e.kindLabel} source "${e.definition.sourceId}" in node "${t}".`,{logicalPath:e.definition.logicalPath,sourceId:e.definition.sourceId});return await o(i(n(r,`Missing compiled module namespace for ${e.kindLabel} source "${e.definition.sourceId}" in node "${t}".`),{exportName:e.definition.exportName,logicalPath:e.definition.logicalPath}))}async function vl(e,t,n){try{let r=ri(await Z({definition:e,kindLabel:`channel`,moduleMap:t,nodeId:n}),`Expected the channel export "${e.exportName??`default`}" from "${e.logicalPath}" to match the public Ash shape.`),i=_l({exportName:e.exportName,logicalPath:e.logicalPath,sourceId:e.sourceId});if(ni(r)){let t=r.routes.find(t=>t.method.toUpperCase()===e.method.toUpperCase()&&t.path===e.urlPath),n=r.adapter;return n&&n.kind!==`http`&&(n.kind=`channel:${e.name}`),{name:e.name,method:e.method,urlPath:e.urlPath,fetch:async(e,n)=>t?t.handler(e,n):Response.json({error:`No matching route handler.`,ok:!1},{status:404}),handler:t?.handler,receive:r.receive,adapter:n,...i}}return{name:e.name,method:e.method,urlPath:e.urlPath,fetch:r.fetch,receive:r.receive,adapter:r.adapter,...i}}catch(t){throw t instanceof X?t:new X(`Failed to attach the channel definition from "${e.logicalPath}": ${m(t)}`,{logicalPath:e.logicalPath,sourceId:e.sourceId})}}async function yl(e,t,r){try{let i=n(await Z({definition:e,kindLabel:`connection`,moduleMap:t,nodeId:r}),`Expected the connection export "${e.exportName??`default`}" from "${e.logicalPath}" to return an object.`),a=i.auth!==void 0,o=i.headers!==void 0,s={connectionName:e.connectionName,description:e.description,exportName:e.exportName,logicalPath:e.logicalPath,sourceId:e.sourceId,sourceKind:`module`,url:e.url};if(a)try{s.authorization=ui(i.auth,`Connection "${e.connectionName}" at "${e.logicalPath}":`)}catch(t){throw new X(m(t),{logicalPath:e.logicalPath,sourceId:e.sourceId})}return o&&(s.headers=i.headers),i.tools!==void 0&&(s.tools=i.tools),typeof i.approval==`function`&&(s.approval=i.approval),s}catch(t){throw t instanceof X?t:new X(`Failed to resolve connection "${e.connectionName}" from "${e.logicalPath}": ${m(t)}`,{logicalPath:e.logicalPath,sourceId:e.sourceId})}}async function bl(e,t,r){try{let i=n(await Z({definition:e,kindLabel:`hook`,moduleMap:t,nodeId:r}),Q(e,`to return an object`)),a={},o={},s=i.lifecycle;if(s!==void 0){let t=n(s,Q(e,"to expose `lifecycle` as an object"));for(let n of[`session`,`turn`]){let r=t[n];r!==void 0&&(a[n]=l(r,Q(e,`to provide a function for "lifecycle.${n}"`)))}}let c=i.events;if(c!==void 0){let t=n(c,Q(e,"to expose `events` as an object"));for(let[n,r]of Object.entries(t))r!==void 0&&(o[n]=l(r,Q(e,`to provide a function for "events.${n}"`)))}return{events:o,exportName:e.exportName,lifecycle:a,logicalPath:e.logicalPath,slug:e.slug,sourceId:e.sourceId,sourceKind:`module`}}catch(t){throw t instanceof X?t:new X(`Failed to attach hook handlers from "${e.logicalPath}": ${m(t)}`,{logicalPath:e.logicalPath,sourceId:e.sourceId})}}function Q(e,t){return`Expected the hook export "${e.exportName??`default`}" from "${e.logicalPath}" ${t}.`}var xl=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}};function $(e){return{id:e.id,async readFile(t,n){Sl(n);let r=e.resolvePath(t),i=await e.readFileRaw(r);return i===null?null:wl(i,n)},async readFileBytes(t){let n=e.resolvePath(t);return await e.readFileBytes(n)},resolvePath(t){return e.resolvePath(t)},async runCommand(t,n){return await e.runCommand(t,n)},async writeFile(t,n){let r=e.resolvePath(t);await e.writeFileRaw(r,n)}}}function Sl(e){if(e===void 0)return;let{startLine:t,endLine:n}=e;if(t!==void 0&&(!Number.isInteger(t)||t<1))throw Error(`startLine must be a positive integer (1-based).`);if(n!==void 0&&(!Number.isInteger(n)||n<1))throw Error(`endLine must be a positive integer (1-based).`);if(t!==void 0&&n!==void 0&&t>n)throw Error(`startLine must not be greater than endLine.`)}function Cl(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 wl(e,t){if(t?.startLine===void 0&&t?.endLine===void 0)return e;let n=Cl(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 Tl(){return{name:`local`,async prewarm(e){let t=Ml(rd(e.runtimeContext.appRoot),e.templateKey);if(await Bl(t))return;let n=await El({sessionKey:e.templateKey,snapshotPath:t}),r=$(kl(n));try{e.bootstrap!==void 0&&await e.bootstrap({use:async()=>r});for(let t of e.seedFiles)await r.writeFile(t.path,t.content);if(await n.captureSnapshot()===null)throw Error(`Failed to capture local sandbox template state for "${e.templateKey}".`)}finally{await n.dispose()}},async create(e){let t=rd(e.runtimeContext.appRoot),n=await Rl(Ml(t,e.templateKey));if(n===null)throw new xl({backendName:`local`,templateKey:e.templateKey});let r=Vl(e.existingMetadata)??Nl(t,e.sessionKey);return await Bl(r)||await zl(r,n),Ol(await El({sessionKey:e.sessionKey,snapshotPath:r}))}}}async function El(e){let{Bash:t,InMemoryFs:n}=await import(`#compiled/just-bash/index.js`),r=await Rl(e.snapshotPath),i=new n(Pl(r));await Fl(i),await Il(i,r?.entries??[]);let a=new t({cwd:G,env:r?.env,fs:i,network:{dangerouslyAllowFullInternetAccess:!0}});return{async captureSnapshot(){let t=await Ll({filesystem:i,sandbox:a});return await zl(e.snapshotPath,t),{snapshotPath:e.snapshotPath}},async dispose(){await a.dispose?.()},async executeCommand(e,t){if(t?.abortSignal?.aborted)throw new DOMException(`The operation was aborted.`,`AbortError`);let n=t?.workingDirectory===void 0?e:`( cd ${Y(t.workingDirectory)} && ${e} )`,r=a.exec(n),i=t?.abortSignal?await Al(r,t.abortSignal):await r;return{exitCode:i.exitCode,stderr:i.stderr,stdout:i.stdout}},async readFileBytes(e){let t;try{t=await i.readFileBuffer(e)}catch{return null}return Buffer.from(t)},async readFileText(e){let t;try{t=await i.readFileBuffer(e)}catch{return null}return new TextDecoder(`utf-8`,{fatal:!0}).decode(t)},sessionKey:e.sessionKey,snapshotPath:e.snapshotPath,async writeFiles(e){for(let t of e){let e=x(t.path);await i.mkdir(e,{recursive:!0}),await i.writeFile(t.path,t.content)}}}}function Dl(e){if(e.networkPolicy!==void 0&&e.networkPolicy!==`allow-all`)throw Error(`Unsupported networkPolicy. Local sandbox supports only 'allow-all'.`);if(e.resources!==void 0)throw Error(`Local sandbox does not support resources.`);if(e.timeout!==void 0)throw Error(`Local sandbox does not support timeout.`);if(e.tags!==void 0)throw Error(`Local sandbox does not support tags.`)}function Ol(e){let t=$(kl(e));return{session:t,useSessionFn:async e=>(e!==void 0&&Dl(e),t),async captureState(){return{backendName:`local`,metadata:await e.captureSnapshot()??{},sessionKey:e.sessionKey}},async dispose(){await e.dispose()}}}function kl(e){return{id:e.sessionKey,readFileBytes:t=>e.readFileBytes(t),readFileRaw:t=>e.readFileText(t),resolvePath:jl,runCommand:(t,n)=>e.executeCommand(t,n),writeFileRaw:(t,n)=>e.writeFiles([{path:t,content:n}])}}async function Al(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 jl(e){return e.startsWith(`/`)?e:`${G}/${e}`}function Ml(e,t){return S(e,`local`,`templates`,`${t}.json`)}function Nl(e,t){return S(e,`local`,`sessions`,`${t}.json`)}function Pl(e){let t={};for(let n of e?.entries??[])n.kind===`file`&&(t[n.path]=Buffer.from(n.contentBase64,`base64`));return t}async function Fl(e){await e.mkdir(G,{recursive:!0})}async function Il(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 Ll(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 Rl(e){if(!await Bl(e))return null;let t=JSON.parse(await ge(e,`utf8`));return t.version===1?t:null}async function zl(e,t){await w(x(e),{recursive:!0}),await T(e,`${JSON.stringify(t,null,2)}\n`)}async function Bl(e){try{return await me(e),!0}catch{return!1}}function Vl(e){let t=e?.snapshotPath;return typeof t==`string`?t:void 0}function Hl(){return Tl()}function Ul(e={}){let t=e.loadSandboxModule??(async()=>await import(`#compiled/@vercel/sandbox/index.js`)),n={timeout:su},r=new Map;return{name:`vercel`,async create(e){let i=ru(n.tags,e.tags),a;try{a=await Wl({loadSandboxModule:t,prewarmedTemplates:r,templateKey:e.templateKey})}catch(t){throw xl.is(t)?t:Error(`Failed to read sandbox template "${e.templateKey}": ${ou(t)}`,{cause:t})}let o;try{o=await Kl({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}": ${ou(t)}`,{cause:t})}return ql(o,e.sessionKey)},async prewarm(e){let i;try{i=await Gl({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}": ${ou(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 Wl(e){let t=e.prewarmedTemplates.get(e.templateKey);if(t!==void 0)return t;let n=await eu(await e.loadSandboxModule(),e.templateKey);if(n===null||typeof n.currentSnapshotId!=`string`)throw new xl({backendName:`vercel`,templateKey:e.templateKey});return{sandboxName:n.name,snapshotId:n.currentSnapshotId,templateKey:e.templateKey}}async function Gl(e){let t=await e.loadSandboxModule(),n=await eu(t,e.templateKey),r=ru(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 iu(n,r);if(typeof n.currentSnapshotId==`string`&&n.currentSnapshotId.length>0)return{sandboxName:n.name,snapshotId:n.currentSnapshotId,templateKey:e.templateKey};await Zl(n,e.createOptions);let i=$(Yl(n,e.templateKey));e.bootstrap!==void 0&&await e.bootstrap({use:async()=>i});for(let t of e.seedFiles)await i.writeFile(t.path,t.content);let a=await n.snapshot();return{sandboxName:n.name,snapshotId:a.snapshotId,templateKey:e.templateKey}}async function Kl(e){let t=nu(e.existingMetadata)??e.sessionKey,n=await eu(e.sandboxModule,t);if(n!==null)return await iu(n,e.tags),n;let r={...e.createOptions,name:t,persistent:!0,source:{snapshotId:e.snapshotId,type:`snapshot`}};return e.tags!==void 0&&(r.tags=e.tags),await e.sandboxModule.Sandbox.create(r)}function ql(e,t){return{session:$(Yl(e,t)),useSessionFn:async n=>{if(n!==void 0){let t={};n.networkPolicy!==void 0&&(t.networkPolicy=n.networkPolicy),n.resources!==void 0&&(t.resources=n.resources),n.timeout!==void 0&&(t.timeout=n.timeout),n.tags!==void 0&&(t.tags=n.tags),Object.keys(t).length>0&&await e.update(t)}return Jl(e,t)},async captureState(){return{backendName:`vercel`,metadata:{sandboxName:e.name},sessionKey:t}},async dispose(){}}}function Jl(e,t){return{...$(Yl(e,t)),get name(){return e.name},get persistent(){return e.persistent},get status(){return e.status},get networkPolicy(){return e.networkPolicy},get tags(){return e.tags},async update(t){await e.update(t)},async stop(t){await e.stop(t)},async snapshot(t){return await e.snapshot(t)},domain(t){return e.domain(t)}}}function Yl(e,t){return{id:t,async readFileBytes(t){let n=await e.readFileToBuffer({path:t});return n===null?null:Buffer.isBuffer(n)?n:Buffer.from(n)},async readFileRaw(t){let n=await e.readFileToBuffer({path:t});return n===null?null:new TextDecoder(`utf-8`,{fatal:!0}).decode(n)},resolvePath:Xl,async runCommand(t,n){let r=await e.runCommand({args:[`-lc`,t],cmd:`bash`,cwd:n?.workingDirectory??`/workspace`,signal:n?.abortSignal}),[i,a]=await Promise.all([r.stdout(),r.stderr()]);return{exitCode:r.exitCode,stderr:a,stdout:i}},async writeFileRaw(t,n){let r=typeof n==`string`?Buffer.from(n,`utf8`):n;await e.writeFiles([{content:r,path:t}])}}}function Xl(e){return e.startsWith(`/`)?e:`${G}/${e}`}async function Zl(e,t){await Ql(e,{failureMessage:`Failed to initialize Vercel sandbox workspace.`,script:`mkdir -p ${G} && chown ${$l}:${$l} ${G}`}),t.networkPolicy!==`deny-all`&&await Ql(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 Ql(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 $l=`vercel-sandbox`;async function eu(e,t){try{return await e.Sandbox.get({name:t})}catch(e){if(tu(e))return null;throw Error(`Failed to look up Vercel sandbox "${t}": ${ou(e)}`,{cause:e})}}function tu(e){return e instanceof Error?(e.response?.status??e.cause?.response?.status)===404:!1}function nu(e){let t=e?.sandboxName;return typeof t==`string`?t:void 0}function ru(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>cu)throw Error(`Vercel Sandbox supports at most ${cu} tags. Ash reserves "agent", "channel", and "sessionId"; remove or consolidate custom tags passed to vercelBackend().`);return n}}async function iu(e,t){t===void 0||au(e.tags,t)||await e.update({tags:t})}function au(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 ou(e){return e instanceof Error?e.message:String(e)}const su=1800*1e3,cu=5;function lu(){return Ul()}function uu(){let e;function t(){return e===void 0&&(e=process.env.VERCEL?lu():Hl()),e}return{get name(){return t().name},create(e){return t().create(e)},async prewarm(e){await t().prewarm(e)}}}async function du(e,t,r){try{let i=n(await Z({definition:e,kindLabel:`sandbox`,moduleMap:t,nodeId:r}),`Expected the sandbox export "${e.exportName??`default`}" from "${e.logicalPath}" to return an object.`);return{backend:fu(i.backend,e.logicalPath),bootstrap:i.bootstrap,description:e.description,exportName:e.exportName,logicalPath:e.logicalPath,onSession:i.onSession,sourceId:e.sourceId,sourceKind:`module`}}catch(t){throw t instanceof X?t:new X(`Failed to attach the sandbox lifecycle handlers from "${e.logicalPath}": ${m(t)}`,{logicalPath:e.logicalPath,sourceId:e.sourceId})}}function fu(e,t){if(e===void 0)return uu();if(typeof e!=`object`||!e)throw new X(`Sandbox "${t}" exposed a non-object "backend" field. Use vercelBackend(), localBackend(), or another factory that returns a SandboxBackend value.`,{logicalPath:t});let n=e;if(typeof n.name!=`string`||n.name.length===0)throw new X(`Sandbox "${t}" backend is missing a non-empty string "name" identifier.`,{logicalPath:t});if(typeof n.create!=`function`)throw new X(`Sandbox "${t}" backend is missing a "create" function.`,{logicalPath:t});return n}async function pu(e,t,r){try{let i=n(await Z({definition:e,kindLabel:`tool`,moduleMap:t,nodeId:r}),gu(e,`to return an object`)),a=l(i.execute,gu(e,`to provide an execute function`));return{description:e.description,execute:a,exportName:e.exportName,inputSchema:e.inputSchema,logicalPath:e.logicalPath,name:e.name,sourceId:e.sourceId,sourceKind:`module`,...mu(i,e)}}catch(t){throw t instanceof X?t:new X(`Failed to attach the tool execute function from "${e.logicalPath}": ${m(t)}`,{logicalPath:e.logicalPath,sourceId:e.sourceId})}}function mu(e,t){let n={};e.onCompact!==void 0&&(n.onCompact=l(e.onCompact,gu(t,`to provide an onCompact function`))),e.needsApproval!==void 0&&(n.needsApproval=l(e.needsApproval,gu(t,`to provide a needsApproval function`)));let r=hu(e,t);return r!==void 0&&(n.retentionPolicy=r),e.inputSchema!==void 0&&_u(e.inputSchema)&&(n.inputStandardSchema=e.inputSchema),n}function hu(e,t){let n=e.retentionPolicy;if(n!==void 0){if(n===`auto`||n===`keep`||typeof n==`function`)return n;throw new X(gu(t,`to set retentionPolicy to "auto", "keep", or a function`),{logicalPath:t.logicalPath,sourceId:t.sourceId})}}function gu(e,t){return`Expected the tool export "${e.exportName??`default`}" from "${e.logicalPath}" ${t}.`}function _u(e){return typeof e==`object`&&!!e&&`~standard`in e&&typeof e[`~standard`]==`object`}async function vu(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 vl(t,e.moduleMap,e.nodeId))}let i=await Promise.all(e.manifest.tools.map(t=>pu(t,e.moduleMap,e.nodeId))),a=await Promise.all(e.manifest.hooks.map(t=>bl(t,e.moduleMap,e.nodeId))),o=await Promise.all(e.manifest.connections.map(t=>yl(t,e.moduleMap,e.nodeId))),s=e.manifest.sandbox===null?null:await du(e.manifest.sandbox,e.moduleMap,e.nodeId),c=yu(e.manifest.system),l=e.manifest.workspaceResourceRoot,u={channels:n,config:bu(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,system:c}}function yu(e){if(e!==void 0)return{name:e.name,logicalPath:e.logicalPath,markdown:e.markdown,sourceId:e.sourceId,sourceKind:e.sourceKind}}function bu(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=_l(e.config.source)),t}function xu(e){return{sandbox:{definition:e.authoredSandbox??Su(),workspaceResourceRoot:e.workspaceResourceRoot}}}function Su(){return{backend:uu(),logicalPath:`ash:framework/default-sandbox`,sourceId:`ash:default-sandbox`,sourceKind:`module`}}const Cu=`load_skill`,wu=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 Tu(e){let t=[],n=new Ea(`subagent`,e.reservedToolNames??[]),r=new Map;for(let i of e.subagents){let e={logicalPath:i.logicalPath,sourceId:i.sourceId};if(r.has(i.nodeId))throw new H(`subagent`,`Found multiple runtime subagents mapped to node id "${i.nodeId}".`,{...e,entryName:i.name});let a=Eu(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 Eu(e){return{description:e.description,inputSchema:wu,kind:`subagent`,logicalPath:e.logicalPath,name:e.name,nodeId:e.nodeId,sourceId:e.sourceId}}async function Du(e,t={}){let n=[],r=new Ea(`tool`,t.reservedToolNames??[]);for(let t of e.tools){let e=await Ou(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 Ou(e){return{description:e.description,inputSchema:await ku(e),kind:`authored-tool`,logicalPath:e.logicalPath,name:e.name,sourceId:e.sourceId}}async function ku(e){return e.inputSchema}var Au=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 ju(e){let t=new Map,n=Fu(e.manifest),r=new Map(e.manifest.subagents.map(e=>[e.nodeId,e]));return{nodesByNodeId:t,root:await Mu({childNodeIdsByParentNodeId:n,manifest:e.manifest,moduleMap:e.moduleMap,nodeId:L,nodesByNodeId:t,subagentNodesById:r})}}async function Mu(e){let t=Iu(e.nodeId);if(e.nodesByNodeId.has(t))throw new Au(`Found multiple runtime agent nodes for node id "${t}".`,{nodeId:t,sourceId:e.sourceId});let n=await vu({manifest:e.manifest,moduleMap:e.moduleMap,nodeId:e.nodeId}),r=n.connections.length>0,i=ml({hasConnections:r}),a=r?Ru(i,n.connections):i,o=new Set(a.map(e=>e.name)),s=hl(),c=new Set(n.tools.map(e=>e.name));for(let r of n.disabledFrameworkTools)if(!s.has(r))throw new Au(`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 Du({tools:[...a.filter(e=>!c.has(e.name)&&!l.has(e.name)),...n.tools]},{reservedToolNames:o.has(`load_skill`)||c.has(`load_skill`)?[]:[Cu]}),d=new Set(n.channels.map(e=>e.name)),f=Xs();for(let r of n.disabledFrameworkChannels)if(!f.has(r))throw new Au(`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=[...Ys().filter(e=>!d.has(e.name)&&!p.has(e.name)),...n.channels],h=xu({authoredSandbox:n.sandbox,workspaceResourceRoot:n.workspaceResourceRoot}),g=Tu({reservedToolNames:[Cu,...u.preparedTools.map(e=>e.name)],subagents:await Nu({childNodeIdsByParentNodeId:e.childNodeIdsByParentNodeId,moduleMap:e.moduleMap,nodesByNodeId:e.nodesByNodeId,parentNodeId:e.nodeId,subagentNodesById:e.subagentNodesById})}),_={agent:n,channels:m,hookRegistry:gl(n.hooks),nodeId:t,sandboxRegistry:h,sourceId:e.sourceId,subagentRegistry:g,toolRegistry:u,turnAgent:Ho({agent:n,nodeId:t,tools:[...u.preparedTools,...g.preparedTools]})};return e.nodesByNodeId.set(t,_),_}async function Nu(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 Au(`Missing compiled subagent node "${r}" while resolving runtime subagents.`,{nodeId:Iu(e.parentNodeId),sourceId:r});t.push(await Pu({childNodeIdsByParentNodeId:e.childNodeIdsByParentNodeId,moduleMap:e.moduleMap,nodesByNodeId:e.nodesByNodeId,sourceRef:n,subagentNodesById:e.subagentNodesById}))}return t}async function Pu(e){let t={description:e.sourceRef.description,logicalPath:e.sourceRef.logicalPath,name:e.sourceRef.name,nodeId:Iu(e.sourceRef.nodeId),sourceId:e.sourceRef.sourceId,sourceKind:`module`};return await Mu({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 Fu(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 Iu(e){return e===`__root__`?to:e}const Lu=ko.name;function Ru(e,t){let n=t.map(e=>e.connectionName).join(`, `);return e.map(e=>e.name===Lu?{...e,description:`${e.description} Available connections: ${n}.`}:e)}const zu=process.env.ASH_DISABLE_AGENT_CACHE===`1`;async function Bu(e){let[t,n]=await Promise.all([ao({compiledArtifactsSource:e}),Vu(e)]),r=await ju({manifest:t,moduleMap:n}),i=r.root;return{adapterRegistry:Aa({channels:Ku(r)}),compiledArtifactsSource:e,graph:r,hookRegistry:i.hookRegistry,moduleMap:n,resolvedAgent:i.agent,subagentRegistry:i.subagentRegistry,toolRegistry:i.toolRegistry,turnAgent:i.turnAgent}}async function Vu(e){return e.kind===`disk`&&e.moduleMapLoadMode===`authored-source`?await Hu(e):await uo({compiledArtifactsSource:e})}async function Hu(e){if(e.moduleMapLoaderPath===void 0)throw Error(`Authored-source module map loading requires "moduleMapLoaderPath" in the compiled artifacts source.`);return await(await import(xe(e.moduleMapLoaderPath).href)).loadCompiledModuleMapFromAuthoredSource({compiledArtifactsSource:e})}async function Uu(e){if(zu)return Bu(e);let t=Wa(),n=Ia(e),r=await Qa(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=Bu(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 Wu(e){let t=await Uu(e.compiledArtifactsSource);if(e.nodeId===void 0)return t;let n=no(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 Gu(){let e=Wa();e.bundleCache.clear(),e.bundleCacheKeyBySourceKey.clear()}function Ku(e){let t=new Map;for(let n of e.nodesByNodeId.values())for(let e of n.channels)t.set(`${e.sourceId}:${e.name}`,e);return[...t.values()]}new B(`ash.channel`,{codec:{serialize(e){return{kind:_a(e),state:e.state?{...e.state}:{}}},deserialize(e,t){let n=t.get(qu);if(n===void 0)throw Error(`Cannot deserialize "ash.channel" before "ash.bundle". The runtime bundle must be present in context.`);return ja(n.adapterRegistry,e)}}});const qu=new B(`ash.bundle`,{codec:{serialize:e=>({nodeId:e.nodeId,source:e.compiledArtifactsSource}),deserialize:e=>{let{source:t,nodeId:n}=e;return Wu({compiledArtifactsSource:t,nodeId:n})}}});new B(`ash.session`);const Ju=new B(`ash.sandbox`),Yu=v(),Xu={workflowId:`workflow//${Yu.name}@${Yu.version}//workflowEntry`};function Zu(e=process.cwd()){return C(e)}function Qu(e){return be(`sha256`).update(e).update(`\0`).update(Xu.workflowId).digest(`hex`).slice(0,12)}function $u(){return!!process.env.VERCEL}function ed(e,t=`all`){let n=S(e,`.ash`,`nitro`);return t===`all`?n:S(n,t)}function td(e,t){return S(e,`.ash`,`nitro-output`,t)}function nd(e){return S(h(),`.ash`,`workflow-cache`,Qu(e))}function rd(e){return S(e,`.ash`,`sandbox-cache`)}function id(e){return $u()?S(e,`.vercel`,`output`):S(e,`.output`)}function ad(e){return{appRoot:e,outputDir:id(e),workflowId:Xu.workflowId,workflowBuildDir:nd(e),workflowSourceDir:_(`src/execution`)}}export{xr as C,An as D,L as E,Er as S,Sr as T,Ia as _,nd as a,Zr as b,Xs as c,ao as d,to as f,Fa as g,Pa as h,td as i,Ys as l,U as m,Zu as n,Gu as o,Ya as p,ed as r,ju as s,ad as t,G as u,Zi as v,Cr as w,Or as x,Qi as y};
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { SystemSourceRef } from "#discover/manifest.js";
|
|
2
|
-
import type { CompiledSystem } from "#compiler/manifest.js";
|
|
3
|
-
/**
|
|
4
|
-
* Compiles one authored system prompt source (markdown or module-backed
|
|
5
|
-
* `defineSystem`) into the normalized shape consumed by the runtime.
|
|
6
|
-
*
|
|
7
|
-
* Module-backed system sources execute once at build time — the resulting
|
|
8
|
-
* markdown is captured into the compiled manifest. There is no per-session
|
|
9
|
-
* re-evaluation at runtime.
|
|
10
|
-
*/
|
|
11
|
-
export declare function compileSystem(agentRoot: string, source: SystemSourceRef): Promise<CompiledSystem>;
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { stripLogicalPathExtension } from "#discover/filesystem.js";
|
|
2
|
-
import { normalizeSystemDefinition } from "#internal/authored-definition/core.js";
|
|
3
|
-
import { loadModuleBackedDefinition } from "#compiler/normalize-helpers.js";
|
|
4
|
-
/**
|
|
5
|
-
* Compiles one authored system prompt source (markdown or module-backed
|
|
6
|
-
* `defineSystem`) into the normalized shape consumed by the runtime.
|
|
7
|
-
*
|
|
8
|
-
* Module-backed system sources execute once at build time — the resulting
|
|
9
|
-
* markdown is captured into the compiled manifest. There is no per-session
|
|
10
|
-
* re-evaluation at runtime.
|
|
11
|
-
*/
|
|
12
|
-
export async function compileSystem(agentRoot, source) {
|
|
13
|
-
const definition = source.sourceKind === "markdown"
|
|
14
|
-
? normalizeSystemDefinition(source.definition, `Expected the compiled system definition at "${source.logicalPath}" to match the public Ash shape.`)
|
|
15
|
-
: normalizeSystemDefinition(await loadModuleBackedDefinition({
|
|
16
|
-
agentRoot,
|
|
17
|
-
kind: "system",
|
|
18
|
-
source,
|
|
19
|
-
}), `Expected the system export "${source.exportName ?? "default"}" from "${source.logicalPath}" to match the public Ash shape.`);
|
|
20
|
-
return {
|
|
21
|
-
name: stripLogicalPathExtension(source.logicalPath),
|
|
22
|
-
logicalPath: source.logicalPath,
|
|
23
|
-
markdown: definition.markdown,
|
|
24
|
-
sourceId: source.sourceId,
|
|
25
|
-
sourceKind: source.sourceKind,
|
|
26
|
-
};
|
|
27
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Public definition for a system prompt authored in markdown or TypeScript.
|
|
3
|
-
*
|
|
4
|
-
* Authored at the agent root as either `system.md` or
|
|
5
|
-
* `system.{ts,cts,mts,js,cjs,mjs}`. Module-backed system sources execute once
|
|
6
|
-
* at build time — the resulting markdown is captured into the compiled
|
|
7
|
-
* manifest. Authored definitions do not carry a `name` field.
|
|
8
|
-
*/
|
|
9
|
-
export interface SystemDefinition {
|
|
10
|
-
markdown: string;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Defines a system prompt in TypeScript using the same shape discovery
|
|
14
|
-
* produces from markdown.
|
|
15
|
-
*/
|
|
16
|
-
export declare function defineSystem<TSystem extends SystemDefinition>(definition: TSystem): TSystem;
|
|
File without changes
|