@xenosystem/agent-sdk 0.10.44 → 0.10.45
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/dist/agents/index.cjs +11 -8
- package/dist/agents/index.js +11 -8
- package/dist/agents/metafile-cjs.json +1 -1
- package/dist/agents/metafile-esm.json +1 -1
- package/dist/artifacts/index.cjs +1 -1
- package/dist/artifacts/index.js +1 -1
- package/dist/automation/index.cjs +1 -1
- package/dist/automation/index.d.cts +3 -0
- package/dist/automation/index.d.ts +3 -0
- package/dist/automation/index.js +1 -1
- package/dist/automation/metafile-cjs.json +1 -1
- package/dist/automation/metafile-esm.json +1 -1
- package/dist/control-plane/index.cjs +1 -1
- package/dist/control-plane/index.js +1 -1
- package/dist/electron/index.cjs +172 -172
- package/dist/electron/index.d.cts +4 -0
- package/dist/electron/index.d.ts +4 -0
- package/dist/electron/index.js +151 -151
- package/dist/electron/metafile-cjs.json +1 -1
- package/dist/electron/metafile-esm.json +1 -1
- package/dist/index.cjs +348 -343
- package/dist/index.d.cts +9 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.js +347 -342
- package/dist/mcp/index.d.cts +3 -0
- package/dist/mcp/index.d.ts +3 -0
- package/dist/metafile-cjs.json +1 -1
- package/dist/metafile-esm.json +1 -1
- package/dist/session/index.cjs +1 -1
- package/dist/session/index.js +1 -1
- package/dist/skills/index.cjs +8 -5
- package/dist/skills/index.js +8 -5
- package/dist/skills/metafile-cjs.json +1 -1
- package/dist/skills/metafile-esm.json +1 -1
- package/dist/utils/index.cjs +19 -16
- package/dist/utils/index.js +19 -16
- package/dist/utils/metafile-cjs.json +1 -1
- package/dist/utils/metafile-esm.json +1 -1
- package/package.json +1 -1
package/dist/agents/index.cjs
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
"use strict";var q=Object.defineProperty;var Pe=Object.getOwnPropertyDescriptor;var Ae=Object.getOwnPropertyNames;var we=Object.prototype.hasOwnProperty;var be=(e,
|
|
2
|
-
`)
|
|
3
|
-
|
|
1
|
+
"use strict";var q=Object.defineProperty;var Pe=Object.getOwnPropertyDescriptor;var Ae=Object.getOwnPropertyNames;var we=Object.prototype.hasOwnProperty;var be=(e,n)=>{for(var r in n)q(e,r,{get:n[r],enumerable:!0})},xe=(e,n,r,t)=>{if(n&&typeof n=="object"||typeof n=="function")for(let i of Ae(n))!we.call(e,i)&&i!==r&&q(e,i,{get:()=>n[i],enumerable:!(t=Pe(n,i))||t.enumerable});return e};var ke=e=>xe(q({},"__esModule",{value:!0}),e);var cn={};be(cn,{AGENT_PROFILE_EXTERNAL_ACTIONS:()=>G,AgentDefinitionLoader:()=>N,AgentDefinitionResolver:()=>X,AgentProfileValidationError:()=>A,XENO_AGENT_PROFILE_SCHEMA_VERSION:()=>B,agentDefinitionFromProfile:()=>ln,agentProfileFromDefinition:()=>ye,compileAgentProfile:()=>me,createAgentDefinitionFile:()=>ze,createAgentDefinitionPromptSection:()=>He,getProjectAgentDefinitionDirs:()=>le,getProjectAgentDefinitionsDir:()=>ae,getUserAgentDefinitionsDir:()=>F,isValidAgentDefinitionName:()=>K,listBuiltInAgentProfiles:()=>sn,renderAgentDefinition:()=>Je,renderAgentDefinitions:()=>Ue,resolveAgentDefinition:()=>Ke,resolveAgentProfile:()=>an,resolveAgentToolPolicy:()=>M,resolveBuiltInAgentProfile:()=>ge,scanAgentDefinitions:()=>V,toAgentDefinitionMetadata:()=>Ge,validateAgentDefinition:()=>ce,validateAgentMcpServers:()=>D});module.exports=ke(cn);var g=require("node:fs"),p=require("node:path");function ne(e){let n=Se(e);return{frontmatter:n.frontmatter,content:n.content.trim()}}function Se(e){let n=e.replace(/^\uFEFF/,"");if(!n.startsWith("---"))return{frontmatter:{},content:e};let r=n.search(/\r?\n/);if(r<0||n.slice(0,r).trim()!=="---")return{frontmatter:{},content:e};let t=n.slice(r+(n[r]==="\r"?2:1)),i=t.match(/(?:^|\r?\n)---[ \t]*(?:\r?\n|$)/);if(!i||i.index===void 0)throw new Error("YAML frontmatter is not closed.");let o=t.slice(0,i.index),l=i[0],s=i.index+l.length;return{frontmatter:re(o),content:t.slice(s)}}function re(e){let n={},r=e.split(/\r?\n/);for(let t=0;t<r.length;t+=1){let i=r[t];if(!i.trim()||i.trimStart().startsWith("#"))continue;if(/^\s/.test(i))throw new Error(`Unexpected indentation at line ${t+1}.`);let o=Te(i,t+1);if(o.key==="<<")throw new Error("YAML merge keys are not supported.");let l=o.value.match(/^([|>])([+-]?)$/);if(l){let a=ve(r,t+1,l[1],l[2]??"");n[o.key]=a.value,t=a.nextIndex-1;continue}if(o.value!==""){n[o.key]=te(o.value,t+1);continue}let s=De(r,t+1);n[o.key]=s.value,t=s.nextIndex-1}return n}function ve(e,n,r,t){let i=[],o=n;for(;o<e.length;o+=1){let c=e[o];if(c.trim()===""){i.push("");continue}if(!/^\s/.test(c))break;i.push(c)}let l=i.filter(c=>c.trim()!=="").map(c=>c.match(/^ */)[0].length),s=l.length>0?Math.min(...l):0,a=i.map(c=>c.trim()===""?"":c.slice(s));for(;a.length>0&&a[a.length-1]==="";)a.pop();let f;return r==="|"?f=a.join(`
|
|
2
|
+
`):(f="",a.forEach((c,u)=>{if(u===0){f=c;return}let m=a[u-1];c===""?f+=`
|
|
3
|
+
`:m===""?f+=c:f+=" "+c})),{value:t==="-"?f:f+`
|
|
4
|
+
`,nextIndex:o}}function De(e,n){let r=[],t=n;for(;t<e.length;t+=1){let o=e[t];if(!o.trim()){r.push(o);continue}if(!/^\s/.test(o))break;r.push(o.replace(/^ {2}/,""))}let i=r.filter(o=>o.trim()&&!o.trimStart().startsWith("#"));return i.length===0?{value:{},nextIndex:t}:i.every(o=>o.trimStart().startsWith("- "))?{value:i.map((o,l)=>te(o.trimStart().slice(2),n+l+1)),nextIndex:t}:{value:re(r.join(`
|
|
5
|
+
`)),nextIndex:t}}function Te(e,n){let r=e.indexOf(":");if(r<=0)throw new Error(`Invalid YAML line ${n}.`);let t=e.slice(0,r).trim(),i=e.slice(r+1).trim();if(!t)throw new Error(`Invalid YAML key at line ${n}.`);return{key:t,value:i}}function te(e,n){if(e==="")return"";if(e==="[]")return[];if(e==="{}")return{};if(e==="true")return!0;if(e==="false")return!1;if(e==="null"||e==="~")return null;if(/^-?\d+(?:\.\d+)?$/.test(e))return Number(e);if(e.startsWith('"'))return ee(e,n);if(e.startsWith("'")){if(!e.endsWith("'"))throw new Error(`Unclosed quoted scalar at line ${n}.`);return e.slice(1,-1).replace(/''/g,"'")}if(e.startsWith("[")||e.startsWith("{"))return ee(e,n);if(e.includes("[")||e.includes("]")||e.includes("{")||e.includes("}"))throw new Error(`Unsupported YAML scalar at line ${n}.`);return e}function ee(e,n){try{return JSON.parse(e)}catch{throw new Error(`Invalid YAML scalar at line ${n}.`)}}var w=require("node:os");var v=require("node:path");var gn=(0,w.platform)();var yn=(0,w.release)(),hn=(0,w.homedir)();function oe(){let e=process.env.XENO_AGENT_HOME?.trim();return e?(0,v.resolve)(e):(0,v.resolve)((0,w.homedir)(),".xeno-agent")}var Ee=/^[a-z][a-z0-9_-]{0,63}$/;function Ie(){return oe()}function F(e=Ie()){return(0,p.join)(e,"agents")}function se(e){return(0,p.resolve)(e)}function Oe(e){let n=(0,p.dirname)(e);return n===e?e:n}function le(e=process.cwd()){let n=se(e),r=[],t=n;for(;;){let o=(0,p.join)(t,".claude","agents"),l=(0,p.join)(t,".xeno","agents");r.push({...(0,g.existsSync)(o)?{claude:o}:{},...(0,g.existsSync)(l)?{xeno:l}:{}});let s=Oe(t);if(s===t)break;t=s}r.reverse();let i=[];for(let o of r)o.claude&&i.push(o.claude),o.xeno&&i.push(o.xeno);return i}function ae(e=process.cwd()){return(0,p.join)(se(e),".xeno","agents")}function Re(e){return(0,g.existsSync)(e)?(0,g.readdirSync)(e,{withFileTypes:!0}).filter(n=>n.isFile()&&n.name.toLowerCase().endsWith(".md")).map(n=>(0,p.join)(e,n.name)).sort((n,r)=>n.localeCompare(r)):[]}function k(e){if(typeof e!="string")return;let n=e.trim();return n.length>0?n:void 0}function S(e){return Array.isArray(e)?e.map(n=>String(n).trim()).filter(Boolean):typeof e=="string"?e.split(",").map(n=>n.trim()).filter(Boolean):[]}function $e(e){if(typeof e=="boolean")return e;if(typeof e!="string")return;let n=e.trim().toLowerCase();if(["1","true","yes","on"].includes(n))return!0;if(["0","false","no","off"].includes(n))return!1}function Ce(e){return(0,p.parse)((0,p.basename)(e)).name.toLowerCase()}function K(e){return Ee.test(e)}function Ne(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Me(e){if(typeof e!="string")return;let n=e.trim().toLowerCase();if(n==="inherit")return"inherit";if(n==="none"||n==="off"||n==="disabled")return"none";if(n==="read"||n==="readonly"||n==="read-only")return"readOnly";if(n==="default"||n==="standard")return"default";if(n==="full"||n==="fullaccess"||n==="full-access")return"fullAccess"}function je(e){if(e===void 0)return;if(typeof e=="string"||Array.isArray(e)){let o=S(e);return o.length>0?{allow:o}:void 0}if(!Ne(e))return;let n=S(e.allow),r=S(e.deny),t=Me(e.mode),i={};return t&&(i.mode=t),n.length>0&&(i.allow=n),r.length>0&&(i.deny=r),Object.keys(i).length>0?i:void 0}var ie=1e8,_e=10080*60*1e3;function Be(e){let n=e["max-tokens"]??e.maxTokens,r=e.deadline,t={};if(n!=null&&n!==""){let i=String(n).trim(),o=Number(i);if(!/^[1-9][0-9]*$/.test(i)||!Number.isSafeInteger(o)||o>ie)throw new Error(`Invalid max-tokens "${i}". Use a whole number from 1 to ${ie}.`);t.maxTokens=o}if(r!=null&&r!==""){let i=String(r).trim(),o=/^([1-9][0-9]*)(ms|s|m|h)?$/.exec(i),l=o?{ms:1,s:1e3,m:6e4,h:36e5}[o[2]??"s"]:0,s=o?Number(o[1])*l:Number.NaN;if(!Number.isSafeInteger(s)||s>_e)throw new Error(`Invalid deadline "${i}". Use a duration such as 90s, 30m or 2h, at most 7 days.`);t.deadlineMs=s}return Object.keys(t).length>0?t:void 0}function Le(e){let n=$e(e.worktree??e.defaultWorktreeIsolation);if(n===!0)return"worktree";if(n===!1)return"none";let r=k(e.isolation)?.toLowerCase();if(r==="worktree")return"worktree";if(r==="none"||r==="off"||r==="disabled")return"none"}function D(e){if(!Array.isArray(e)||e.length>256||e.some(n=>typeof n!="string"||n.trim().length===0||n.length>128||/[\p{Cc}\p{Cs}]/u.test(n)))throw new Error("mcp-servers must be a bounded array of exact configured server names.");return[...new Set(e)]}function ce(e){let n=[];return K(e.name)||n.push(`Invalid agent name "${e.name}". Use 1-64 lowercase letters, digits, hyphens, or underscores, starting with a letter.`),e.prompt.trim().length===0&&n.push("Agent definition body is empty."),n}function qe(e,n,r){let t=(0,g.readFileSync)(e,"utf8"),i=ne(t),o=i.frontmatter,l=Ce(e),s=k(o.name)?.toLowerCase()??l,a=i.content.trim(),f=ce({name:s,prompt:a});if(f.length>0)throw new Error(f.join(" "));let c=k(o.description),u=k(o.model),m=k(o.color),P=k(o.memory??o.memoryScope),b=Le(o),E=je(o.tools),I=Be(o);if(Object.hasOwn(o,"mcp-servers")&&Object.hasOwn(o,"mcpServers"))throw new Error("Declare mcp-servers only once; conflicting aliases are refused.");let O=Object.hasOwn(o,"mcp-servers")?o["mcp-servers"]:o.mcpServers,R=O===void 0?void 0:D(O);return{name:s,scope:n,path:e,...c?{description:c}:{},...u?{model:u}:{},...m?{color:m}:{},...P?{memory:P}:{},...b?{isolation:b}:{},tags:S(o.tags),skills:S(o.skills),hooks:S(o.hooks),...R!==void 0?{mcpServers:R}:{},prompt:a,active:!0,priority:r,...E?{toolPolicy:E}:{},...I?{budget:I}:{}}}function $(e,n,r,t,i){for(let o of Re(e))try{t.push(qe(o,n,r))}catch(l){i.push({path:o,scope:n,message:l instanceof Error?l.message:String(l)})}}function Xe(e){let n=new Map;for(let r of e){let t=n.get(r.name);(!t||r.priority>t.priority)&&n.set(r.name,r)}return n}function Fe(e,n){let r=n.get(e.name),t=r?.path===e.path;return{name:e.name,scope:e.scope,path:e.path,...e.description?{description:e.description}:{},...e.model?{model:e.model}:{},...e.color?{color:e.color}:{},...e.memory?{memory:e.memory}:{},...e.isolation?{isolation:e.isolation}:{},tags:e.tags,skills:e.skills,hooks:e.hooks,...e.mcpServers!==void 0?{mcpServers:[...e.mcpServers]}:{},prompt:e.prompt,active:t,...e.toolPolicy?{toolPolicy:e.toolPolicy}:{},...e.budget?{budget:{...e.budget}}:{},...!t&&r?{shadowedBy:{name:r.name,scope:r.scope,path:r.path}}:{}}}function V(e=process.cwd(),n={}){let r=n.cwd??e,t=n.userDir??F(n.agentHome),i=n.projectDirs??le(r),o=n.pluginDirs??[],l=n.builtInDirs??[],s=[],a=[];n.includeUser!==!1&&$(t,"user",0,s,a),n.includeProject!==!1&&i.forEach((u,m)=>$(u,"project",100+m,s,a)),n.includePlugins&&o.forEach((u,m)=>$(u,"plugin",1e3+m,s,a)),n.includeBuiltIns&&l.forEach((u,m)=>$(u,"built-in",2e3+m,s,a));let f=Xe(s),c=s.map(u=>Fe(u,f));return c.sort((u,m)=>{if(u.active!==m.active)return u.active?-1:1;let P=u.name.localeCompare(m.name);return P!==0?P:u.path.localeCompare(m.path)}),{definitions:c,issues:a,searchPaths:{...n.includeUser!==!1?{user:t}:{},project:n.includeProject===!1?[]:i,plugin:n.includePlugins?o:[],builtIn:n.includeBuiltIns?l:[]}}}function Ke(e,n=process.cwd(),r={}){let t=e.trim().toLowerCase(),i=V(n,r);return{definition:i.definitions.find(o=>o.active&&o.name===t)??null,scan:i}}var N=class{constructor(n={}){this.options=n}options;scan(n=this.options.cwd??process.cwd()){return V(n,this.options)}},X=class{constructor(n=new N){this.loader=n}loader;resolve(n,r=process.cwd()){let t=this.loader.scan(r),i=n.trim().toLowerCase();return{definition:t.definitions.find(o=>o.active&&o.name===i)??null,scan:t}}};function C(e){if(!e||e.length===0)return;let n=Array.from(new Set(e.map(r=>r.trim()).filter(Boolean)));return n.length>0?n:void 0}function Ve(e,n){if(!e&&!n)return;if(!e)return C(n);if(!n)return C(e);let r=new Set(n);return C(e.filter(t=>r.has(t)))}function We(e,n){let r={none:0,readOnly:1,default:2,fullAccess:3,inherit:4},t=n??"inherit",i=e??"inherit";return r[t]<=r[i]?t:i}function M(e,n={}){let r=e.toolPolicy??{},t={mode:We(r.mode,n.mode)},i=Ve(n.allow,r.allow),o=C([...n.deny??[],...r.deny??[]]);return i&&(t.allow=i),o&&(t.deny=o),t}function He(e){return{name:`custom-agent:${e.name}`,order:20,provide(){let n=["","","# Custom Agent",`Active agent: ${e.name}`,`Definition scope: ${e.scope}`,`Definition path: ${e.path}`];return e.description&&n.push(`Description: ${e.description}`),n.push("",e.prompt),n.join(`
|
|
6
|
+
`)}}}function Ge(e){return{name:e.name,scope:e.scope,path:e.path,...e.description?{description:e.description}:{},...e.model?{model:e.model}:{},...e.color?{color:e.color}:{},...e.memory?{memory:e.memory}:{},...e.isolation?{isolation:e.isolation}:{},tags:e.tags,skills:e.skills,hooks:e.hooks,...e.mcpServers!==void 0?{mcpServers:[...e.mcpServers]}:{},active:e.active,...e.toolPolicy?{toolPolicy:e.toolPolicy}:{},...e.budget?{budget:{...e.budget}}:{},...e.shadowedBy?{shadowedBy:e.shadowedBy}:{}}}function x(e,n){return e.length>=n?e:e+" ".repeat(n-e.length)}function Ue(e,n){let r=[];if(e.length===0)r.push("No custom agent definitions found.");else{r.push(`${x("name",22)} ${x("scope",8)} ${x("status",9)} description`),r.push(`${"-".repeat(22)} ${"-".repeat(8)} ${"-".repeat(9)} ${"-".repeat(32)}`);for(let t of e){let i=t.active?"active":"shadowed";r.push(`${x(t.name,22)} ${x(t.scope,8)} ${x(i,9)} ${t.description??""}`)}}if(n.length>0){r.push("","Invalid definitions:");for(let t of n)r.push(`- ${t.path}: ${t.message}`)}return r.join(`
|
|
4
7
|
`)+`
|
|
5
|
-
`}function
|
|
6
|
-
`)}function
|
|
7
|
-
`);return(0,g.writeFileSync)(t,a,"utf8"),t}var ue=require("node:crypto");var B=2,G=["publish","deploy","push","send","purchase","sign","file-legal","change-infrastructure"],A=class extends Error{constructor(
|
|
8
|
-
`)}}}function me(e,
|
|
8
|
+
`}function Je(e){let n=[`Agent: ${e.name}`,`Scope: ${e.scope}`,`Path: ${e.path}`,`Status: ${e.active?"active":"shadowed"}`];return e.description&&n.push(`Description: ${e.description}`),e.model&&n.push(`Model: ${e.model}`),e.color&&n.push(`Color: ${e.color}`),e.memory&&n.push(`Memory: ${e.memory}`),e.isolation&&n.push(`Isolation: ${e.isolation}`),e.tags.length>0&&n.push(`Tags: ${e.tags.join(", ")}`),e.skills.length>0&&n.push(`Skills: ${e.skills.join(", ")}`),e.hooks.length>0&&n.push(`Hooks: ${e.hooks.join(", ")}`),e.mcpServers!==void 0&&n.push(`MCP servers: ${e.mcpServers.join(", ")||"(none)"}`),e.toolPolicy&&n.push(`Tools: ${JSON.stringify(e.toolPolicy)}`),e.budget?.maxTokens!==void 0&&n.push(`Token budget: ${e.budget.maxTokens}`),e.budget?.deadlineMs!==void 0&&n.push(`Deadline: ${e.budget.deadlineMs} ms`),e.shadowedBy&&n.push(`Shadowed by: ${e.shadowedBy.scope} ${e.shadowedBy.path}`),n.push("",e.prompt,""),n.join(`
|
|
9
|
+
`)}function ze(e){let n=e.name.trim().toLowerCase();if(!K(n))throw new Error(`Invalid agent name "${e.name}". Use 1-64 lowercase letters, digits, hyphens, or underscores, starting with a letter.`);let r=e.scope==="user"?F(e.agentHome):ae(e.cwd??process.cwd());(0,g.mkdirSync)(r,{recursive:!0});let t=(0,p.join)(r,`${n}.md`);if((0,g.existsSync)(t)&&!e.force)throw new Error(`Agent definition already exists: ${t}`);let i=e.description?.trim()||`${n} custom agent`,o=e.mcpServers===void 0?void 0:D(e.mcpServers),l=e.prompt?.trim()||`You are ${n}. Replace this paragraph with precise operating instructions, constraints, tools policy, verification expectations, and the kind of work this agent should own.`,a=[...["---",`name: ${n}`,`description: ${JSON.stringify(i)}`,...e.model?.trim()?[`model: ${JSON.stringify(e.model.trim())}`]:[],...e.color?.trim()?[`color: ${JSON.stringify(e.color.trim())}`]:[],...e.memory?.trim()?[`memory: ${JSON.stringify(e.memory.trim())}`]:[],...e.isolation?[`isolation: ${e.isolation}`]:[],"tags: []",...e.skills&&e.skills.length>0?[`skills: ${JSON.stringify(e.skills)}`]:[],...e.hooks&&e.hooks.length>0?[`hooks: ${JSON.stringify(e.hooks)}`]:[],...o!==void 0?[`mcp-servers: ${JSON.stringify(o)}`]:[],...e.toolPolicy?["tools:",...e.toolPolicy.mode?[` mode: ${e.toolPolicy.mode}`]:[],...e.toolPolicy.allow&&e.toolPolicy.allow.length>0?[` allow: ${JSON.stringify(e.toolPolicy.allow)}`]:[],...e.toolPolicy.deny&&e.toolPolicy.deny.length>0?[` deny: ${JSON.stringify(e.toolPolicy.deny)}`]:[]]:[],"---"],"",l,""].join(`
|
|
10
|
+
`);return(0,g.writeFileSync)(t,a,"utf8"),t}var ue=require("node:crypto");var B=2,G=["publish","deploy","push","send","purchase","sign","file-legal","change-infrastructure"],A=class extends Error{constructor(n){super(n),this.name="AgentProfileValidationError"}},Ye=/^[a-z][a-z0-9_-]{0,63}$/,j=G;function y(e){return Array.from(new Set((e??[]).map(n=>n.trim()).filter(Boolean)))}function Qe(e,n){if(e===void 0)return n===void 0?void 0:y(n);if(n===void 0)return y(e);let r=new Set(n);return y(e.filter(t=>r.has(t)))}function Ze(e,n){if(e===void 0)return;let r=new Set(n);return e.filter(t=>!r.has(t))}function W(e,n,r){let t=n===void 0?null:new Set(n),i=new Set(r??[]);return e===void 0?n===void 0?void 0:y(n).filter(o=>!i.has(o)):y(e).filter(o=>(t===null||t.has(o))&&!i.has(o))}function _(e,n,r){return r[e]<=r[n]?e:n}function en(e,n,r){return r[e]>=r[n]?e:n}function H(e){return Array.isArray(e)?e.map(H):!e||typeof e!="object"?e:Object.fromEntries(Object.entries(e).sort(([n],[r])=>n.localeCompare(r)).map(([n,r])=>[n,H(r)]))}function nn(e){return(0,ue.createHash)("sha256").update(JSON.stringify(H(e))).digest("hex")}function T(e){return structuredClone(e)}function de(e,n){return e.overrides?.[n]??e.default}function rn(e,n){let r={deny:0,ask:1,allow:2},t=new Set(e.requireCurrentTurnApproval),i=Object.fromEntries(j.map(a=>[a,de(e,a)]));for(let a of n){let f=a.externalActions;if(f){for(let c of j){let u=f.overrides?.[c]??f.default;u&&(i[c]=_(i[c],u,r))}for(let c of f.requireCurrentTurnApproval??[])t.add(c)}}let l=new Set(Object.values(i)).size===1?i.publish:"deny",s={};for(let a of j)i[a]!==l&&(s[a]=i[a]);return{default:l,...Object.keys(s).length>0?{overrides:s}:{},requireCurrentTurnApproval:[...t].filter(a=>i[a]!=="deny").sort()}}function fe(e){if(e.schemaVersion!==B)throw new A(`Unsupported agent profile schema: ${String(e.schemaVersion)}.`);if(!Ye.test(e.id))throw new A(`Invalid agent profile id: ${e.id}.`);if(!e.version.trim())throw new A(`Agent profile ${e.id} has no version.`);if(!e.displayName.trim()||!e.description.trim()||!e.prompt.trim())throw new A(`Agent profile ${e.id} requires displayName, description, and prompt.`);if(e.execution.allowedModes.length===0)throw new A(`Agent profile ${e.id} allows no collaboration modes.`);if(!e.execution.allowedModes.includes(e.execution.defaultMode))throw new A(`Agent profile ${e.id} default mode must be included in allowedModes.`)}function tn(e,n,r,t,i,o){return{name:`agent-profile:${e.id}`,order:20,provide(){let l=j.map(s=>`${s}=${de(n.externalActions,s)}`).join(", ");return["","","# XENO Agent Profile",`Profile: ${e.displayName} (${e.id}@${e.version})`,`Profile fingerprint: ${o}`,`Role: ${e.description}`,`Collaboration mode: ${t.defaultMode}`,`Isolation: ${t.isolation}`,`Memory: ${r.scope}; soul=${r.soul}`,`Permission profile ceiling: ${n.permissionProfile}`,`External actions: ${l}`,n.externalActions.requireCurrentTurnApproval.length>0?`Current-turn approval required for: ${n.externalActions.requireCurrentTurnApproval.join(", ")}`:"Current-turn approval required for: none",i.evidence.length>0?`Completion evidence: ${i.evidence.join(", ")}`:"Completion evidence: task-dependent",i.requirePrimarySources?"Use primary sources for factual claims and cite them near the claim.":"",i.requireCurrentInformation?"Verify time-sensitive claims against current authoritative information.":"",i.requireHumanReview?"Do not represent the result as professional approval; require human review before consequential use.":"",t.defaultDryRun?"Default to preview or dry-run. Do not perform external state changes without the required approval.":"","",e.prompt,"","Stop conditions:",...i.stopConditions.map(s=>`- ${s}`)].filter(s=>s!=="").join(`
|
|
11
|
+
`)}}}function me(e,n={}){fe(e);let r=T(e),t=n.boundaries??[],i=T(r.capabilities.tools),o=r.capabilities.skills.allow?y(r.capabilities.skills.allow):void 0,l=new Set(y(r.capabilities.skills.deny)),s=y(r.capabilities.hooks),a=new Set,f=r.capabilities.mcpServers?y(r.capabilities.mcpServers):void 0,c=r.capabilities.delegatedAgents?y(r.capabilities.delegatedAgents):void 0,u=r.capabilities.permissionProfile,m=r.memory.scope,P=r.memory.soul,b=r.execution.isolation,E={"read-only":0,default:1,"trusted-dev":2},I={none:0,session:1,project:2,user:3},O={disabled:0,read:1,learn:2},R={none:0,worktree:1,container:2};for(let d of t){d.tools&&(i=M({toolPolicy:i},d.tools)),o=Qe(o,d.skills?.allow);for(let L of d.skills?.deny??[])l.add(L);s=W(s,d.hooks?.allow,void 0)??[];for(let L of d.hooks?.require??[])a.add(L);f=W(f,d.mcpServers?.allow,d.mcpServers?.deny),c=W(c,d.delegatedAgents?.allow,d.delegatedAgents?.deny),d.permissionProfile&&(u=_(u,d.permissionProfile,E)),d.maximumMemoryScope&&(m=_(m,d.maximumMemoryScope,I)),d.maximumSoulMode&&(P=_(P,d.maximumSoulMode,O)),d.requiredIsolation&&(b=en(b,d.requiredIsolation,R))}let U=[...l].sort();u==="read-only"&&(i=M({toolPolicy:i},{mode:"readOnly",deny:["WebSearch","WebFetch"]})),o=Ze(o,U);let he=y(r.capabilities.skills.preload).filter(d=>!l.has(d)).filter(d=>o===void 0||o.includes(d));s=y([...s,...a]);let J={tools:i,skills:{preload:he,...o!==void 0?{allow:o}:{},deny:U},hooks:s,...f!==void 0?{mcpServers:f}:{},...c!==void 0?{delegatedAgents:c}:{},permissionProfile:u,externalActions:rn(r.capabilities.externalActions,t)},z={...r.memory,scope:m,soul:P},Y={...r.execution,isolation:b},Q={schemaVersion:B,profile:r,boundarySources:t.map(d=>d.source),capabilities:J,memory:z,execution:Y,completion:r.completion},Z=nn(Q);return{...Q,fingerprint:Z,promptSection:tn(r,J,z,Y,r.completion,Z)}}function h(e){return{schemaVersion:B,id:e.id,version:"1.0.0",displayName:e.displayName,description:e.description,kind:e.kind??"primary",prompt:e.prompt,capabilities:{tools:e.toolPolicy??{mode:"inherit"},skills:{preload:e.skills??[],...e.skillAllow?{allow:e.skillAllow}:{},deny:[]},hooks:[],permissionProfile:e.permissionProfile??"default",externalActions:{default:e.externalDefault??"ask",...e.externalOverrides?{overrides:e.externalOverrides}:{},requireCurrentTurnApproval:e.currentTurnApproval??[]}},memory:{scope:e.memoryScope??"project",role:e.id,soul:e.soul??"read"},execution:{defaultMode:e.defaultMode??"chat",allowedModes:e.allowedModes??["chat","plan","execute","review"],isolation:e.isolation??"none",allowBackground:e.allowBackground??!0,planForComplexTasks:e.planForComplexTasks??!0,defaultDryRun:e.defaultDryRun??!1},completion:{evidence:e.evidence??[],requirePrimarySources:e.primarySources??!1,requireCurrentInformation:e.currentInformation??!1,requireHumanReview:e.humanReview??!1,stopConditions:e.stopConditions??["The requested outcome is complete and required evidence has been reported.","A real authorization, information, or external-state blocker prevents safe progress."]},presentation:{label:e.displayName,color:e.color,glyph:e.glyph},tags:y(e.tags)}}var pe=[h({id:"assistant",displayName:"Assistant",description:"General-purpose XENO collaborator for mixed research, planning, and implementation work.",prompt:["Work as a thoughtful generalist. Establish the user's actual outcome, inspect relevant context, and take scoped action.","Escalate into a narrower specialist profile when domain risk or task depth warrants it."].join(`
|
|
9
12
|
`),toolPolicy:{mode:"inherit"},skills:[],memoryScope:"user",evidence:["file-references"],currentTurnApproval:[...G],color:"cyan",glyph:"\u25A0",tags:["general","primary"]}),h({id:"swe",displayName:"Software Engineer",description:"Repository-aware software engineer for careful implementation, debugging, refactoring, and verification.",prompt:["Inspect the repository before editing. Follow project instructions and preserve unrelated work.","Trace the smallest root cause, implement the narrowest coherent change, and verify from focused checks outward.","Do not claim completion without concrete test, typecheck, build, or runtime evidence appropriate to the risk."].join(`
|
|
10
13
|
`),toolPolicy:{mode:"default"},skills:["debug","run","verify"],permissionProfile:"trusted-dev",soul:"learn",evidence:["file-references","tests","typecheck","build","diff"],currentTurnApproval:["publish","deploy","push","change-infrastructure"],color:"green",glyph:"\u25C6",tags:["engineering","implementation"]}),h({id:"reviewer",displayName:"Code Reviewer",description:"Read-only reviewer focused on correctness, regressions, safety, tests, and maintainability.",prompt:["Lead with concrete findings ordered by severity. Cite exact file locations and explain impact.","Do not edit code. Distinguish confirmed defects from risks and questions. State when no material finding is present."].join(`
|
|
11
14
|
`),kind:"subagent",toolPolicy:{mode:"readOnly"},skills:["code-review","verify"],permissionProfile:"read-only",memoryScope:"session",soul:"read",allowedModes:["chat","review"],defaultMode:"review",evidence:["file-references","diff"],externalDefault:"deny",color:"yellow",glyph:"\u25C7",tags:["engineering","review","read-only"]}),h({id:"writer",displayName:"Writer",description:"Audience-aware writer and editor for clear, accurate, structurally coherent content.",prompt:["Determine audience, purpose, voice, format, and source constraints before drafting.","Preserve factual meaning, avoid invented claims, and revise for clarity, rhythm, consistency, and usefulness."].join(`
|
|
@@ -14,4 +17,4 @@
|
|
|
14
17
|
`),toolPolicy:{mode:"default",allow:["Read","Glob","Grep","LS","Write","Edit","WebSearch","WebFetch","Think","AskUser","Skill"]},skills:["verify"],evidence:["sources","file-references","diff"],currentTurnApproval:["send","publish","change-infrastructure"],color:"cyan",glyph:"\u25A3",tags:["product","planning"]}),h({id:"ci",displayName:"CI Engineer",description:"Continuous-integration specialist for reproducing, repairing, and hardening automated gates.",prompt:["Identify the exact failing job and command. Reproduce it locally or in an equivalent immutable environment before patching.","Fix only the underlying failure, retain logs as evidence, and rerun the matching gate before broader validation."].join(`
|
|
15
18
|
`),toolPolicy:{mode:"default"},skills:["ci-repair","debug","run","verify"],permissionProfile:"trusted-dev",soul:"learn",evidence:["tests","typecheck","build","diff"],currentTurnApproval:["push","deploy","change-infrastructure"],color:"green",glyph:"\u25A4",tags:["engineering","ci","automation"]}),h({id:"devops",displayName:"DevOps and Release",description:"Dry-run-first infrastructure and release specialist with explicit external-action gates.",prompt:["Inspect the release or infrastructure contract first. Build an immutable candidate and produce reproducible evidence.","Default to plan, preview, dry-run, and local verification. Never publish, deploy, push, sign, purchase, or mutate infrastructure unless the current user turn explicitly authorizes that exact action and target.","For releases, preserve SDK-before-CLI dependency order and verify the public artifact after publication."].join(`
|
|
16
19
|
`),toolPolicy:{mode:"default"},skills:["release","run","verify"],permissionProfile:"default",memoryScope:"project",soul:"learn",isolation:"worktree",defaultMode:"plan",defaultDryRun:!0,evidence:["tests","build","diff","deployment-proof","human-review"],humanReview:!0,currentTurnApproval:["publish","deploy","push","purchase","sign","change-infrastructure"],color:"yellow",glyph:"\u2B22",tags:["devops","release","infrastructure"]}),h({id:"legal-research",displayName:"Legal Research",description:"Restricted legal-information researcher that produces sourced analysis for qualified human review.",prompt:["Identify jurisdiction, effective date, parties, and the precise legal question before analyzing it.","Use current primary legal sources wherever possible. Cite each material proposition and distinguish law, interpretation, uncertainty, and practical next steps.","Provide legal information, not professional representation. Never sign, file, submit, contact a party, accept terms, or make a payment."].join(`
|
|
17
|
-
`),toolPolicy:{mode:"readOnly"},skills:["verify"],permissionProfile:"default",memoryScope:"session",soul:"disabled",allowedModes:["chat","plan","review"],defaultMode:"review",evidence:["sources","human-review"],primarySources:!0,currentInformation:!0,humanReview:!0,externalDefault:"deny",color:"red",glyph:"\xA7",tags:["legal","research","restricted","read-only"],stopConditions:["The jurisdiction or effective date is unknown and materially changes the answer.","The task requires legal representation, filing, signature, payment, or contact with a third party.","The sourced analysis is complete and clearly marked for qualified human review."]})],
|
|
20
|
+
`),toolPolicy:{mode:"readOnly"},skills:["verify"],permissionProfile:"default",memoryScope:"session",soul:"disabled",allowedModes:["chat","plan","review"],defaultMode:"review",evidence:["sources","human-review"],primarySources:!0,currentInformation:!0,humanReview:!0,externalDefault:"deny",color:"red",glyph:"\xA7",tags:["legal","research","restricted","read-only"],stopConditions:["The jurisdiction or effective date is unknown and materially changes the answer.","The task requires legal representation, filing, signature, payment, or contact with a third party.","The sourced analysis is complete and clearly marked for qualified human review."]})],on={general:"assistant",software:"swe",engineer:"swe","software-engineer":"swe",review:"reviewer","code-reviewer":"reviewer",qa:"research","q-and-a":"research",researcher:"research","product-manager":"product","ci-cd":"ci",cicd:"ci",release:"devops","devops-release":"devops",legal:"legal-research"};function sn(){return pe.map(T)}function ge(e){let n=e.trim().toLowerCase(),r=on[n]??n,t=pe.find(i=>i.id===r);return t?T(t):null}function ye(e){let n=e.memory?.trim().toLowerCase(),r=n==="none"||n==="session"||n==="project"||n==="user"?n:"project",t=h({id:e.name,displayName:e.name,description:e.description??`Custom XENO agent ${e.name}.`,prompt:e.prompt,toolPolicy:e.toolPolicy??{mode:"inherit"},skills:e.skills,memoryScope:r,isolation:e.isolation??"none",color:e.color??"cyan",glyph:"\u25A0",tags:["custom",...e.tags]});return e.model&&(t.model={preferred:e.model}),t.capabilities.hooks=[...e.hooks],e.mcpServers!==void 0&&(t.capabilities.mcpServers=D(e.mcpServers)),t}function ln(e){return fe(e),{name:e.id,scope:"built-in",path:`builtin:xeno-agent-profile/${e.id}@${e.version}`,description:e.description,...e.model?.preferred?{model:e.model.preferred}:{},color:e.presentation.color,memory:e.memory.scope,isolation:e.execution.isolation==="container"?"worktree":e.execution.isolation,tags:[...e.tags],skills:[...e.capabilities.skills.preload],hooks:[...e.capabilities.hooks],...e.capabilities.mcpServers!==void 0?{mcpServers:[...e.capabilities.mcpServers]}:{},active:!0,toolPolicy:T(e.capabilities.tools),prompt:e.prompt}}function an(e){let n=e.definition?ye(e.definition):ge(e.name);return n?me(n,{boundaries:e.boundaries}):null}0&&(module.exports={AGENT_PROFILE_EXTERNAL_ACTIONS,AgentDefinitionLoader,AgentDefinitionResolver,AgentProfileValidationError,XENO_AGENT_PROFILE_SCHEMA_VERSION,agentDefinitionFromProfile,agentProfileFromDefinition,compileAgentProfile,createAgentDefinitionFile,createAgentDefinitionPromptSection,getProjectAgentDefinitionDirs,getProjectAgentDefinitionsDir,getUserAgentDefinitionsDir,isValidAgentDefinitionName,listBuiltInAgentProfiles,renderAgentDefinition,renderAgentDefinitions,resolveAgentDefinition,resolveAgentProfile,resolveAgentToolPolicy,resolveBuiltInAgentProfile,scanAgentDefinitions,toAgentDefinitionMetadata,validateAgentDefinition,validateAgentMcpServers});
|
package/dist/agents/index.js
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import{existsSync as O,mkdirSync as
|
|
2
|
-
`)
|
|
3
|
-
|
|
1
|
+
import{existsSync as O,mkdirSync as ye,readFileSync as he,readdirSync as Pe,writeFileSync as Ae}from"node:fs";import{basename as we,dirname as be,join as x,parse as xe,resolve as ke}from"node:path";function G(e){let n=ue(e);return{frontmatter:n.frontmatter,content:n.content.trim()}}function ue(e){let n=e.replace(/^\uFEFF/,"");if(!n.startsWith("---"))return{frontmatter:{},content:e};let r=n.search(/\r?\n/);if(r<0||n.slice(0,r).trim()!=="---")return{frontmatter:{},content:e};let t=n.slice(r+(n[r]==="\r"?2:1)),i=t.match(/(?:^|\r?\n)---[ \t]*(?:\r?\n|$)/);if(!i||i.index===void 0)throw new Error("YAML frontmatter is not closed.");let o=t.slice(0,i.index),l=i[0],s=i.index+l.length;return{frontmatter:U(o),content:t.slice(s)}}function U(e){let n={},r=e.split(/\r?\n/);for(let t=0;t<r.length;t+=1){let i=r[t];if(!i.trim()||i.trimStart().startsWith("#"))continue;if(/^\s/.test(i))throw new Error(`Unexpected indentation at line ${t+1}.`);let o=me(i,t+1);if(o.key==="<<")throw new Error("YAML merge keys are not supported.");let l=o.value.match(/^([|>])([+-]?)$/);if(l){let a=de(r,t+1,l[1],l[2]??"");n[o.key]=a.value,t=a.nextIndex-1;continue}if(o.value!==""){n[o.key]=J(o.value,t+1);continue}let s=fe(r,t+1);n[o.key]=s.value,t=s.nextIndex-1}return n}function de(e,n,r,t){let i=[],o=n;for(;o<e.length;o+=1){let c=e[o];if(c.trim()===""){i.push("");continue}if(!/^\s/.test(c))break;i.push(c)}let l=i.filter(c=>c.trim()!=="").map(c=>c.match(/^ */)[0].length),s=l.length>0?Math.min(...l):0,a=i.map(c=>c.trim()===""?"":c.slice(s));for(;a.length>0&&a[a.length-1]==="";)a.pop();let f;return r==="|"?f=a.join(`
|
|
2
|
+
`):(f="",a.forEach((c,u)=>{if(u===0){f=c;return}let m=a[u-1];c===""?f+=`
|
|
3
|
+
`:m===""?f+=c:f+=" "+c})),{value:t==="-"?f:f+`
|
|
4
|
+
`,nextIndex:o}}function fe(e,n){let r=[],t=n;for(;t<e.length;t+=1){let o=e[t];if(!o.trim()){r.push(o);continue}if(!/^\s/.test(o))break;r.push(o.replace(/^ {2}/,""))}let i=r.filter(o=>o.trim()&&!o.trimStart().startsWith("#"));return i.length===0?{value:{},nextIndex:t}:i.every(o=>o.trimStart().startsWith("- "))?{value:i.map((o,l)=>J(o.trimStart().slice(2),n+l+1)),nextIndex:t}:{value:U(r.join(`
|
|
5
|
+
`)),nextIndex:t}}function me(e,n){let r=e.indexOf(":");if(r<=0)throw new Error(`Invalid YAML line ${n}.`);let t=e.slice(0,r).trim(),i=e.slice(r+1).trim();if(!t)throw new Error(`Invalid YAML key at line ${n}.`);return{key:t,value:i}}function J(e,n){if(e==="")return"";if(e==="[]")return[];if(e==="{}")return{};if(e==="true")return!0;if(e==="false")return!1;if(e==="null"||e==="~")return null;if(/^-?\d+(?:\.\d+)?$/.test(e))return Number(e);if(e.startsWith('"'))return H(e,n);if(e.startsWith("'")){if(!e.endsWith("'"))throw new Error(`Unclosed quoted scalar at line ${n}.`);return e.slice(1,-1).replace(/''/g,"'")}if(e.startsWith("[")||e.startsWith("{"))return H(e,n);if(e.includes("[")||e.includes("]")||e.includes("{")||e.includes("}"))throw new Error(`Unsupported YAML scalar at line ${n}.`);return e}function H(e,n){try{return JSON.parse(e)}catch{throw new Error(`Invalid YAML scalar at line ${n}.`)}}import{homedir as Y,platform as pe,release as ge}from"node:os";import{delimiter as an,join as cn,resolve as z}from"node:path";var dn=pe();var fn=ge(),mn=Y();function Q(){let e=process.env.XENO_AGENT_HOME?.trim();return e?z(e):z(Y(),".xeno-agent")}var Se=/^[a-z][a-z0-9_-]{0,63}$/;function ve(){return Q()}function ne(e=ve()){return x(e,"agents")}function re(e){return ke(e)}function De(e){let n=be(e);return n===e?e:n}function Te(e=process.cwd()){let n=re(e),r=[],t=n;for(;;){let o=x(t,".claude","agents"),l=x(t,".xeno","agents");r.push({...O(o)?{claude:o}:{},...O(l)?{xeno:l}:{}});let s=De(t);if(s===t)break;t=s}r.reverse();let i=[];for(let o of r)o.claude&&i.push(o.claude),o.xeno&&i.push(o.xeno);return i}function Ee(e=process.cwd()){return x(re(e),".xeno","agents")}function Ie(e){return O(e)?Pe(e,{withFileTypes:!0}).filter(n=>n.isFile()&&n.name.toLowerCase().endsWith(".md")).map(n=>x(e,n.name)).sort((n,r)=>n.localeCompare(r)):[]}function w(e){if(typeof e!="string")return;let n=e.trim();return n.length>0?n:void 0}function b(e){return Array.isArray(e)?e.map(n=>String(n).trim()).filter(Boolean):typeof e=="string"?e.split(",").map(n=>n.trim()).filter(Boolean):[]}function Oe(e){if(typeof e=="boolean")return e;if(typeof e!="string")return;let n=e.trim().toLowerCase();if(["1","true","yes","on"].includes(n))return!0;if(["0","false","no","off"].includes(n))return!1}function Re(e){return xe(we(e)).name.toLowerCase()}function te(e){return Se.test(e)}function $e(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ce(e){if(typeof e!="string")return;let n=e.trim().toLowerCase();if(n==="inherit")return"inherit";if(n==="none"||n==="off"||n==="disabled")return"none";if(n==="read"||n==="readonly"||n==="read-only")return"readOnly";if(n==="default"||n==="standard")return"default";if(n==="full"||n==="fullaccess"||n==="full-access")return"fullAccess"}function Ne(e){if(e===void 0)return;if(typeof e=="string"||Array.isArray(e)){let o=b(e);return o.length>0?{allow:o}:void 0}if(!$e(e))return;let n=b(e.allow),r=b(e.deny),t=Ce(e.mode),i={};return t&&(i.mode=t),n.length>0&&(i.allow=n),r.length>0&&(i.deny=r),Object.keys(i).length>0?i:void 0}var Z=1e8,Me=10080*60*1e3;function je(e){let n=e["max-tokens"]??e.maxTokens,r=e.deadline,t={};if(n!=null&&n!==""){let i=String(n).trim(),o=Number(i);if(!/^[1-9][0-9]*$/.test(i)||!Number.isSafeInteger(o)||o>Z)throw new Error(`Invalid max-tokens "${i}". Use a whole number from 1 to ${Z}.`);t.maxTokens=o}if(r!=null&&r!==""){let i=String(r).trim(),o=/^([1-9][0-9]*)(ms|s|m|h)?$/.exec(i),l=o?{ms:1,s:1e3,m:6e4,h:36e5}[o[2]??"s"]:0,s=o?Number(o[1])*l:Number.NaN;if(!Number.isSafeInteger(s)||s>Me)throw new Error(`Invalid deadline "${i}". Use a duration such as 90s, 30m or 2h, at most 7 days.`);t.deadlineMs=s}return Object.keys(t).length>0?t:void 0}function _e(e){let n=Oe(e.worktree??e.defaultWorktreeIsolation);if(n===!0)return"worktree";if(n===!1)return"none";let r=w(e.isolation)?.toLowerCase();if(r==="worktree")return"worktree";if(r==="none"||r==="off"||r==="disabled")return"none"}function R(e){if(!Array.isArray(e)||e.length>256||e.some(n=>typeof n!="string"||n.trim().length===0||n.length>128||/[\p{Cc}\p{Cs}]/u.test(n)))throw new Error("mcp-servers must be a bounded array of exact configured server names.");return[...new Set(e)]}function Be(e){let n=[];return te(e.name)||n.push(`Invalid agent name "${e.name}". Use 1-64 lowercase letters, digits, hyphens, or underscores, starting with a letter.`),e.prompt.trim().length===0&&n.push("Agent definition body is empty."),n}function Le(e,n,r){let t=he(e,"utf8"),i=G(t),o=i.frontmatter,l=Re(e),s=w(o.name)?.toLowerCase()??l,a=i.content.trim(),f=Be({name:s,prompt:a});if(f.length>0)throw new Error(f.join(" "));let c=w(o.description),u=w(o.model),m=w(o.color),y=w(o.memory??o.memoryScope),P=_e(o),S=Ne(o.tools),v=je(o);if(Object.hasOwn(o,"mcp-servers")&&Object.hasOwn(o,"mcpServers"))throw new Error("Declare mcp-servers only once; conflicting aliases are refused.");let D=Object.hasOwn(o,"mcp-servers")?o["mcp-servers"]:o.mcpServers,T=D===void 0?void 0:R(D);return{name:s,scope:n,path:e,...c?{description:c}:{},...u?{model:u}:{},...m?{color:m}:{},...y?{memory:y}:{},...P?{isolation:P}:{},tags:b(o.tags),skills:b(o.skills),hooks:b(o.hooks),...T!==void 0?{mcpServers:T}:{},prompt:a,active:!0,priority:r,...S?{toolPolicy:S}:{},...v?{budget:v}:{}}}function E(e,n,r,t,i){for(let o of Ie(e))try{t.push(Le(o,n,r))}catch(l){i.push({path:o,scope:n,message:l instanceof Error?l.message:String(l)})}}function qe(e){let n=new Map;for(let r of e){let t=n.get(r.name);(!t||r.priority>t.priority)&&n.set(r.name,r)}return n}function Xe(e,n){let r=n.get(e.name),t=r?.path===e.path;return{name:e.name,scope:e.scope,path:e.path,...e.description?{description:e.description}:{},...e.model?{model:e.model}:{},...e.color?{color:e.color}:{},...e.memory?{memory:e.memory}:{},...e.isolation?{isolation:e.isolation}:{},tags:e.tags,skills:e.skills,hooks:e.hooks,...e.mcpServers!==void 0?{mcpServers:[...e.mcpServers]}:{},prompt:e.prompt,active:t,...e.toolPolicy?{toolPolicy:e.toolPolicy}:{},...e.budget?{budget:{...e.budget}}:{},...!t&&r?{shadowedBy:{name:r.name,scope:r.scope,path:r.path}}:{}}}function oe(e=process.cwd(),n={}){let r=n.cwd??e,t=n.userDir??ne(n.agentHome),i=n.projectDirs??Te(r),o=n.pluginDirs??[],l=n.builtInDirs??[],s=[],a=[];n.includeUser!==!1&&E(t,"user",0,s,a),n.includeProject!==!1&&i.forEach((u,m)=>E(u,"project",100+m,s,a)),n.includePlugins&&o.forEach((u,m)=>E(u,"plugin",1e3+m,s,a)),n.includeBuiltIns&&l.forEach((u,m)=>E(u,"built-in",2e3+m,s,a));let f=qe(s),c=s.map(u=>Xe(u,f));return c.sort((u,m)=>{if(u.active!==m.active)return u.active?-1:1;let y=u.name.localeCompare(m.name);return y!==0?y:u.path.localeCompare(m.path)}),{definitions:c,issues:a,searchPaths:{...n.includeUser!==!1?{user:t}:{},project:n.includeProject===!1?[]:i,plugin:n.includePlugins?o:[],builtIn:n.includeBuiltIns?l:[]}}}function An(e,n=process.cwd(),r={}){let t=e.trim().toLowerCase(),i=oe(n,r);return{definition:i.definitions.find(o=>o.active&&o.name===t)??null,scan:i}}var M=class{constructor(n={}){this.options=n}options;scan(n=this.options.cwd??process.cwd()){return oe(n,this.options)}},ee=class{constructor(n=new M){this.loader=n}loader;resolve(n,r=process.cwd()){let t=this.loader.scan(r),i=n.trim().toLowerCase();return{definition:t.definitions.find(o=>o.active&&o.name===i)??null,scan:t}}};function I(e){if(!e||e.length===0)return;let n=Array.from(new Set(e.map(r=>r.trim()).filter(Boolean)));return n.length>0?n:void 0}function Fe(e,n){if(!e&&!n)return;if(!e)return I(n);if(!n)return I(e);let r=new Set(n);return I(e.filter(t=>r.has(t)))}function Ke(e,n){let r={none:0,readOnly:1,default:2,fullAccess:3,inherit:4},t=n??"inherit",i=e??"inherit";return r[t]<=r[i]?t:i}function j(e,n={}){let r=e.toolPolicy??{},t={mode:Ke(r.mode,n.mode)},i=Fe(n.allow,r.allow),o=I([...n.deny??[],...r.deny??[]]);return i&&(t.allow=i),o&&(t.deny=o),t}function wn(e){return{name:`custom-agent:${e.name}`,order:20,provide(){let n=["","","# Custom Agent",`Active agent: ${e.name}`,`Definition scope: ${e.scope}`,`Definition path: ${e.path}`];return e.description&&n.push(`Description: ${e.description}`),n.push("",e.prompt),n.join(`
|
|
6
|
+
`)}}}function bn(e){return{name:e.name,scope:e.scope,path:e.path,...e.description?{description:e.description}:{},...e.model?{model:e.model}:{},...e.color?{color:e.color}:{},...e.memory?{memory:e.memory}:{},...e.isolation?{isolation:e.isolation}:{},tags:e.tags,skills:e.skills,hooks:e.hooks,...e.mcpServers!==void 0?{mcpServers:[...e.mcpServers]}:{},active:e.active,...e.toolPolicy?{toolPolicy:e.toolPolicy}:{},...e.budget?{budget:{...e.budget}}:{},...e.shadowedBy?{shadowedBy:e.shadowedBy}:{}}}function A(e,n){return e.length>=n?e:e+" ".repeat(n-e.length)}function xn(e,n){let r=[];if(e.length===0)r.push("No custom agent definitions found.");else{r.push(`${A("name",22)} ${A("scope",8)} ${A("status",9)} description`),r.push(`${"-".repeat(22)} ${"-".repeat(8)} ${"-".repeat(9)} ${"-".repeat(32)}`);for(let t of e){let i=t.active?"active":"shadowed";r.push(`${A(t.name,22)} ${A(t.scope,8)} ${A(i,9)} ${t.description??""}`)}}if(n.length>0){r.push("","Invalid definitions:");for(let t of n)r.push(`- ${t.path}: ${t.message}`)}return r.join(`
|
|
4
7
|
`)+`
|
|
5
|
-
`}function
|
|
6
|
-
`)}function
|
|
7
|
-
`);return
|
|
8
|
-
`)}}}function
|
|
8
|
+
`}function kn(e){let n=[`Agent: ${e.name}`,`Scope: ${e.scope}`,`Path: ${e.path}`,`Status: ${e.active?"active":"shadowed"}`];return e.description&&n.push(`Description: ${e.description}`),e.model&&n.push(`Model: ${e.model}`),e.color&&n.push(`Color: ${e.color}`),e.memory&&n.push(`Memory: ${e.memory}`),e.isolation&&n.push(`Isolation: ${e.isolation}`),e.tags.length>0&&n.push(`Tags: ${e.tags.join(", ")}`),e.skills.length>0&&n.push(`Skills: ${e.skills.join(", ")}`),e.hooks.length>0&&n.push(`Hooks: ${e.hooks.join(", ")}`),e.mcpServers!==void 0&&n.push(`MCP servers: ${e.mcpServers.join(", ")||"(none)"}`),e.toolPolicy&&n.push(`Tools: ${JSON.stringify(e.toolPolicy)}`),e.budget?.maxTokens!==void 0&&n.push(`Token budget: ${e.budget.maxTokens}`),e.budget?.deadlineMs!==void 0&&n.push(`Deadline: ${e.budget.deadlineMs} ms`),e.shadowedBy&&n.push(`Shadowed by: ${e.shadowedBy.scope} ${e.shadowedBy.path}`),n.push("",e.prompt,""),n.join(`
|
|
9
|
+
`)}function Sn(e){let n=e.name.trim().toLowerCase();if(!te(n))throw new Error(`Invalid agent name "${e.name}". Use 1-64 lowercase letters, digits, hyphens, or underscores, starting with a letter.`);let r=e.scope==="user"?ne(e.agentHome):Ee(e.cwd??process.cwd());ye(r,{recursive:!0});let t=x(r,`${n}.md`);if(O(t)&&!e.force)throw new Error(`Agent definition already exists: ${t}`);let i=e.description?.trim()||`${n} custom agent`,o=e.mcpServers===void 0?void 0:R(e.mcpServers),l=e.prompt?.trim()||`You are ${n}. Replace this paragraph with precise operating instructions, constraints, tools policy, verification expectations, and the kind of work this agent should own.`,a=[...["---",`name: ${n}`,`description: ${JSON.stringify(i)}`,...e.model?.trim()?[`model: ${JSON.stringify(e.model.trim())}`]:[],...e.color?.trim()?[`color: ${JSON.stringify(e.color.trim())}`]:[],...e.memory?.trim()?[`memory: ${JSON.stringify(e.memory.trim())}`]:[],...e.isolation?[`isolation: ${e.isolation}`]:[],"tags: []",...e.skills&&e.skills.length>0?[`skills: ${JSON.stringify(e.skills)}`]:[],...e.hooks&&e.hooks.length>0?[`hooks: ${JSON.stringify(e.hooks)}`]:[],...o!==void 0?[`mcp-servers: ${JSON.stringify(o)}`]:[],...e.toolPolicy?["tools:",...e.toolPolicy.mode?[` mode: ${e.toolPolicy.mode}`]:[],...e.toolPolicy.allow&&e.toolPolicy.allow.length>0?[` allow: ${JSON.stringify(e.toolPolicy.allow)}`]:[],...e.toolPolicy.deny&&e.toolPolicy.deny.length>0?[` deny: ${JSON.stringify(e.toolPolicy.deny)}`]:[]]:[],"---"],"",l,""].join(`
|
|
10
|
+
`);return Ae(t,a,"utf8"),t}import{createHash as Ve}from"node:crypto";var L=2,ie=["publish","deploy","push","send","purchase","sign","file-legal","change-infrastructure"],h=class extends Error{constructor(n){super(n),this.name="AgentProfileValidationError"}},We=/^[a-z][a-z0-9_-]{0,63}$/,$=ie;function p(e){return Array.from(new Set((e??[]).map(n=>n.trim()).filter(Boolean)))}function He(e,n){if(e===void 0)return n===void 0?void 0:p(n);if(n===void 0)return p(e);let r=new Set(n);return p(e.filter(t=>r.has(t)))}function Ge(e,n){if(e===void 0)return;let r=new Set(n);return e.filter(t=>!r.has(t))}function _(e,n,r){let t=n===void 0?null:new Set(n),i=new Set(r??[]);return e===void 0?n===void 0?void 0:p(n).filter(o=>!i.has(o)):p(e).filter(o=>(t===null||t.has(o))&&!i.has(o))}function C(e,n,r){return r[e]<=r[n]?e:n}function Ue(e,n,r){return r[e]>=r[n]?e:n}function B(e){return Array.isArray(e)?e.map(B):!e||typeof e!="object"?e:Object.fromEntries(Object.entries(e).sort(([n],[r])=>n.localeCompare(r)).map(([n,r])=>[n,B(r)]))}function Je(e){return Ve("sha256").update(JSON.stringify(B(e))).digest("hex")}function k(e){return structuredClone(e)}function se(e,n){return e.overrides?.[n]??e.default}function ze(e,n){let r={deny:0,ask:1,allow:2},t=new Set(e.requireCurrentTurnApproval),i=Object.fromEntries($.map(a=>[a,se(e,a)]));for(let a of n){let f=a.externalActions;if(f){for(let c of $){let u=f.overrides?.[c]??f.default;u&&(i[c]=C(i[c],u,r))}for(let c of f.requireCurrentTurnApproval??[])t.add(c)}}let l=new Set(Object.values(i)).size===1?i.publish:"deny",s={};for(let a of $)i[a]!==l&&(s[a]=i[a]);return{default:l,...Object.keys(s).length>0?{overrides:s}:{},requireCurrentTurnApproval:[...t].filter(a=>i[a]!=="deny").sort()}}function le(e){if(e.schemaVersion!==L)throw new h(`Unsupported agent profile schema: ${String(e.schemaVersion)}.`);if(!We.test(e.id))throw new h(`Invalid agent profile id: ${e.id}.`);if(!e.version.trim())throw new h(`Agent profile ${e.id} has no version.`);if(!e.displayName.trim()||!e.description.trim()||!e.prompt.trim())throw new h(`Agent profile ${e.id} requires displayName, description, and prompt.`);if(e.execution.allowedModes.length===0)throw new h(`Agent profile ${e.id} allows no collaboration modes.`);if(!e.execution.allowedModes.includes(e.execution.defaultMode))throw new h(`Agent profile ${e.id} default mode must be included in allowedModes.`)}function Ye(e,n,r,t,i,o){return{name:`agent-profile:${e.id}`,order:20,provide(){let l=$.map(s=>`${s}=${se(n.externalActions,s)}`).join(", ");return["","","# XENO Agent Profile",`Profile: ${e.displayName} (${e.id}@${e.version})`,`Profile fingerprint: ${o}`,`Role: ${e.description}`,`Collaboration mode: ${t.defaultMode}`,`Isolation: ${t.isolation}`,`Memory: ${r.scope}; soul=${r.soul}`,`Permission profile ceiling: ${n.permissionProfile}`,`External actions: ${l}`,n.externalActions.requireCurrentTurnApproval.length>0?`Current-turn approval required for: ${n.externalActions.requireCurrentTurnApproval.join(", ")}`:"Current-turn approval required for: none",i.evidence.length>0?`Completion evidence: ${i.evidence.join(", ")}`:"Completion evidence: task-dependent",i.requirePrimarySources?"Use primary sources for factual claims and cite them near the claim.":"",i.requireCurrentInformation?"Verify time-sensitive claims against current authoritative information.":"",i.requireHumanReview?"Do not represent the result as professional approval; require human review before consequential use.":"",t.defaultDryRun?"Default to preview or dry-run. Do not perform external state changes without the required approval.":"","",e.prompt,"","Stop conditions:",...i.stopConditions.map(s=>`- ${s}`)].filter(s=>s!=="").join(`
|
|
11
|
+
`)}}}function Qe(e,n={}){le(e);let r=k(e),t=n.boundaries??[],i=k(r.capabilities.tools),o=r.capabilities.skills.allow?p(r.capabilities.skills.allow):void 0,l=new Set(p(r.capabilities.skills.deny)),s=p(r.capabilities.hooks),a=new Set,f=r.capabilities.mcpServers?p(r.capabilities.mcpServers):void 0,c=r.capabilities.delegatedAgents?p(r.capabilities.delegatedAgents):void 0,u=r.capabilities.permissionProfile,m=r.memory.scope,y=r.memory.soul,P=r.execution.isolation,S={"read-only":0,default:1,"trusted-dev":2},v={none:0,session:1,project:2,user:3},D={disabled:0,read:1,learn:2},T={none:0,worktree:1,container:2};for(let d of t){d.tools&&(i=j({toolPolicy:i},d.tools)),o=He(o,d.skills?.allow);for(let N of d.skills?.deny??[])l.add(N);s=_(s,d.hooks?.allow,void 0)??[];for(let N of d.hooks?.require??[])a.add(N);f=_(f,d.mcpServers?.allow,d.mcpServers?.deny),c=_(c,d.delegatedAgents?.allow,d.delegatedAgents?.deny),d.permissionProfile&&(u=C(u,d.permissionProfile,S)),d.maximumMemoryScope&&(m=C(m,d.maximumMemoryScope,v)),d.maximumSoulMode&&(y=C(y,d.maximumSoulMode,D)),d.requiredIsolation&&(P=Ue(P,d.requiredIsolation,T))}let q=[...l].sort();u==="read-only"&&(i=j({toolPolicy:i},{mode:"readOnly",deny:["WebSearch","WebFetch"]})),o=Ge(o,q);let ce=p(r.capabilities.skills.preload).filter(d=>!l.has(d)).filter(d=>o===void 0||o.includes(d));s=p([...s,...a]);let X={tools:i,skills:{preload:ce,...o!==void 0?{allow:o}:{},deny:q},hooks:s,...f!==void 0?{mcpServers:f}:{},...c!==void 0?{delegatedAgents:c}:{},permissionProfile:u,externalActions:ze(r.capabilities.externalActions,t)},F={...r.memory,scope:m,soul:y},K={...r.execution,isolation:P},V={schemaVersion:L,profile:r,boundarySources:t.map(d=>d.source),capabilities:X,memory:F,execution:K,completion:r.completion},W=Je(V);return{...V,fingerprint:W,promptSection:Ye(r,X,F,K,r.completion,W)}}function g(e){return{schemaVersion:L,id:e.id,version:"1.0.0",displayName:e.displayName,description:e.description,kind:e.kind??"primary",prompt:e.prompt,capabilities:{tools:e.toolPolicy??{mode:"inherit"},skills:{preload:e.skills??[],...e.skillAllow?{allow:e.skillAllow}:{},deny:[]},hooks:[],permissionProfile:e.permissionProfile??"default",externalActions:{default:e.externalDefault??"ask",...e.externalOverrides?{overrides:e.externalOverrides}:{},requireCurrentTurnApproval:e.currentTurnApproval??[]}},memory:{scope:e.memoryScope??"project",role:e.id,soul:e.soul??"read"},execution:{defaultMode:e.defaultMode??"chat",allowedModes:e.allowedModes??["chat","plan","execute","review"],isolation:e.isolation??"none",allowBackground:e.allowBackground??!0,planForComplexTasks:e.planForComplexTasks??!0,defaultDryRun:e.defaultDryRun??!1},completion:{evidence:e.evidence??[],requirePrimarySources:e.primarySources??!1,requireCurrentInformation:e.currentInformation??!1,requireHumanReview:e.humanReview??!1,stopConditions:e.stopConditions??["The requested outcome is complete and required evidence has been reported.","A real authorization, information, or external-state blocker prevents safe progress."]},presentation:{label:e.displayName,color:e.color,glyph:e.glyph},tags:p(e.tags)}}var ae=[g({id:"assistant",displayName:"Assistant",description:"General-purpose XENO collaborator for mixed research, planning, and implementation work.",prompt:["Work as a thoughtful generalist. Establish the user's actual outcome, inspect relevant context, and take scoped action.","Escalate into a narrower specialist profile when domain risk or task depth warrants it."].join(`
|
|
9
12
|
`),toolPolicy:{mode:"inherit"},skills:[],memoryScope:"user",evidence:["file-references"],currentTurnApproval:[...ie],color:"cyan",glyph:"\u25A0",tags:["general","primary"]}),g({id:"swe",displayName:"Software Engineer",description:"Repository-aware software engineer for careful implementation, debugging, refactoring, and verification.",prompt:["Inspect the repository before editing. Follow project instructions and preserve unrelated work.","Trace the smallest root cause, implement the narrowest coherent change, and verify from focused checks outward.","Do not claim completion without concrete test, typecheck, build, or runtime evidence appropriate to the risk."].join(`
|
|
10
13
|
`),toolPolicy:{mode:"default"},skills:["debug","run","verify"],permissionProfile:"trusted-dev",soul:"learn",evidence:["file-references","tests","typecheck","build","diff"],currentTurnApproval:["publish","deploy","push","change-infrastructure"],color:"green",glyph:"\u25C6",tags:["engineering","implementation"]}),g({id:"reviewer",displayName:"Code Reviewer",description:"Read-only reviewer focused on correctness, regressions, safety, tests, and maintainability.",prompt:["Lead with concrete findings ordered by severity. Cite exact file locations and explain impact.","Do not edit code. Distinguish confirmed defects from risks and questions. State when no material finding is present."].join(`
|
|
11
14
|
`),kind:"subagent",toolPolicy:{mode:"readOnly"},skills:["code-review","verify"],permissionProfile:"read-only",memoryScope:"session",soul:"read",allowedModes:["chat","review"],defaultMode:"review",evidence:["file-references","diff"],externalDefault:"deny",color:"yellow",glyph:"\u25C7",tags:["engineering","review","read-only"]}),g({id:"writer",displayName:"Writer",description:"Audience-aware writer and editor for clear, accurate, structurally coherent content.",prompt:["Determine audience, purpose, voice, format, and source constraints before drafting.","Preserve factual meaning, avoid invented claims, and revise for clarity, rhythm, consistency, and usefulness."].join(`
|
|
@@ -14,4 +17,4 @@ import{existsSync as O,mkdirSync as ge,readFileSync as ye,readdirSync as he,writ
|
|
|
14
17
|
`),toolPolicy:{mode:"default",allow:["Read","Glob","Grep","LS","Write","Edit","WebSearch","WebFetch","Think","AskUser","Skill"]},skills:["verify"],evidence:["sources","file-references","diff"],currentTurnApproval:["send","publish","change-infrastructure"],color:"cyan",glyph:"\u25A3",tags:["product","planning"]}),g({id:"ci",displayName:"CI Engineer",description:"Continuous-integration specialist for reproducing, repairing, and hardening automated gates.",prompt:["Identify the exact failing job and command. Reproduce it locally or in an equivalent immutable environment before patching.","Fix only the underlying failure, retain logs as evidence, and rerun the matching gate before broader validation."].join(`
|
|
15
18
|
`),toolPolicy:{mode:"default"},skills:["ci-repair","debug","run","verify"],permissionProfile:"trusted-dev",soul:"learn",evidence:["tests","typecheck","build","diff"],currentTurnApproval:["push","deploy","change-infrastructure"],color:"green",glyph:"\u25A4",tags:["engineering","ci","automation"]}),g({id:"devops",displayName:"DevOps and Release",description:"Dry-run-first infrastructure and release specialist with explicit external-action gates.",prompt:["Inspect the release or infrastructure contract first. Build an immutable candidate and produce reproducible evidence.","Default to plan, preview, dry-run, and local verification. Never publish, deploy, push, sign, purchase, or mutate infrastructure unless the current user turn explicitly authorizes that exact action and target.","For releases, preserve SDK-before-CLI dependency order and verify the public artifact after publication."].join(`
|
|
16
19
|
`),toolPolicy:{mode:"default"},skills:["release","run","verify"],permissionProfile:"default",memoryScope:"project",soul:"learn",isolation:"worktree",defaultMode:"plan",defaultDryRun:!0,evidence:["tests","build","diff","deployment-proof","human-review"],humanReview:!0,currentTurnApproval:["publish","deploy","push","purchase","sign","change-infrastructure"],color:"yellow",glyph:"\u2B22",tags:["devops","release","infrastructure"]}),g({id:"legal-research",displayName:"Legal Research",description:"Restricted legal-information researcher that produces sourced analysis for qualified human review.",prompt:["Identify jurisdiction, effective date, parties, and the precise legal question before analyzing it.","Use current primary legal sources wherever possible. Cite each material proposition and distinguish law, interpretation, uncertainty, and practical next steps.","Provide legal information, not professional representation. Never sign, file, submit, contact a party, accept terms, or make a payment."].join(`
|
|
17
|
-
`),toolPolicy:{mode:"readOnly"},skills:["verify"],permissionProfile:"default",memoryScope:"session",soul:"disabled",allowedModes:["chat","plan","review"],defaultMode:"review",evidence:["sources","human-review"],primarySources:!0,currentInformation:!0,humanReview:!0,externalDefault:"deny",color:"red",glyph:"\xA7",tags:["legal","research","restricted","read-only"],stopConditions:["The jurisdiction or effective date is unknown and materially changes the answer.","The task requires legal representation, filing, signature, payment, or contact with a third party.","The sourced analysis is complete and clearly marked for qualified human review."]})],
|
|
20
|
+
`),toolPolicy:{mode:"readOnly"},skills:["verify"],permissionProfile:"default",memoryScope:"session",soul:"disabled",allowedModes:["chat","plan","review"],defaultMode:"review",evidence:["sources","human-review"],primarySources:!0,currentInformation:!0,humanReview:!0,externalDefault:"deny",color:"red",glyph:"\xA7",tags:["legal","research","restricted","read-only"],stopConditions:["The jurisdiction or effective date is unknown and materially changes the answer.","The task requires legal representation, filing, signature, payment, or contact with a third party.","The sourced analysis is complete and clearly marked for qualified human review."]})],Ze={general:"assistant",software:"swe",engineer:"swe","software-engineer":"swe",review:"reviewer","code-reviewer":"reviewer",qa:"research","q-and-a":"research",researcher:"research","product-manager":"product","ci-cd":"ci",cicd:"ci",release:"devops","devops-release":"devops",legal:"legal-research"};function En(){return ae.map(k)}function en(e){let n=e.trim().toLowerCase(),r=Ze[n]??n,t=ae.find(i=>i.id===r);return t?k(t):null}function nn(e){let n=e.memory?.trim().toLowerCase(),r=n==="none"||n==="session"||n==="project"||n==="user"?n:"project",t=g({id:e.name,displayName:e.name,description:e.description??`Custom XENO agent ${e.name}.`,prompt:e.prompt,toolPolicy:e.toolPolicy??{mode:"inherit"},skills:e.skills,memoryScope:r,isolation:e.isolation??"none",color:e.color??"cyan",glyph:"\u25A0",tags:["custom",...e.tags]});return e.model&&(t.model={preferred:e.model}),t.capabilities.hooks=[...e.hooks],e.mcpServers!==void 0&&(t.capabilities.mcpServers=R(e.mcpServers)),t}function In(e){return le(e),{name:e.id,scope:"built-in",path:`builtin:xeno-agent-profile/${e.id}@${e.version}`,description:e.description,...e.model?.preferred?{model:e.model.preferred}:{},color:e.presentation.color,memory:e.memory.scope,isolation:e.execution.isolation==="container"?"worktree":e.execution.isolation,tags:[...e.tags],skills:[...e.capabilities.skills.preload],hooks:[...e.capabilities.hooks],...e.capabilities.mcpServers!==void 0?{mcpServers:[...e.capabilities.mcpServers]}:{},active:!0,toolPolicy:k(e.capabilities.tools),prompt:e.prompt}}function On(e){let n=e.definition?nn(e.definition):en(e.name);return n?Qe(n,{boundaries:e.boundaries}):null}export{ie as AGENT_PROFILE_EXTERNAL_ACTIONS,M as AgentDefinitionLoader,ee as AgentDefinitionResolver,h as AgentProfileValidationError,L as XENO_AGENT_PROFILE_SCHEMA_VERSION,In as agentDefinitionFromProfile,nn as agentProfileFromDefinition,Qe as compileAgentProfile,Sn as createAgentDefinitionFile,wn as createAgentDefinitionPromptSection,Te as getProjectAgentDefinitionDirs,Ee as getProjectAgentDefinitionsDir,ne as getUserAgentDefinitionsDir,te as isValidAgentDefinitionName,En as listBuiltInAgentProfiles,kn as renderAgentDefinition,xn as renderAgentDefinitions,An as resolveAgentDefinition,On as resolveAgentProfile,j as resolveAgentToolPolicy,en as resolveBuiltInAgentProfile,oe as scanAgentDefinitions,bn as toAgentDefinitionMetadata,Be as validateAgentDefinition,R as validateAgentMcpServers};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"src/utils/yaml.ts":{"bytes":
|
|
1
|
+
{"inputs":{"src/utils/yaml.ts":{"bytes":7264,"imports":[],"format":"esm"},"src/runtime/process-tree-kill.ts":{"bytes":9124,"imports":[{"path":"node:child_process","kind":"import-statement","external":true}],"format":"esm"},"src/utils/platform.ts":{"bytes":9633,"imports":[{"path":"node:os","kind":"import-statement","external":true},{"path":"node:child_process","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"src/runtime/process-tree-kill.ts","kind":"import-statement","original":"../runtime/process-tree-kill.js"}],"format":"esm"},"src/agents/definitions.ts":{"bytes":25020,"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"src/utils/yaml.ts","kind":"import-statement","original":"../utils/yaml.js"},{"path":"src/utils/platform.ts","kind":"import-statement","original":"../utils/platform.js"}],"format":"esm"},"src/agents/profiles.ts":{"bytes":33891,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/agents/definitions.ts","kind":"import-statement","original":"./definitions.js"}],"format":"esm"},"src/agents/index.ts":{"bytes":65,"imports":[{"path":"src/agents/definitions.ts","kind":"import-statement","original":"./definitions.js"},{"path":"src/agents/profiles.ts","kind":"import-statement","original":"./profiles.js"}],"format":"esm"}},"outputs":{"dist/agents/index.cjs":{"imports":[{"path":"node:fs","kind":"require-call","external":true},{"path":"node:path","kind":"require-call","external":true},{"path":"node:os","kind":"require-call","external":true},{"path":"node:path","kind":"require-call","external":true},{"path":"node:crypto","kind":"require-call","external":true}],"exports":[],"entryPoint":"src/agents/index.ts","inputs":{"src/agents/index.ts":{"bytesInOutput":852},"src/agents/definitions.ts":{"bytesInOutput":10723},"src/utils/yaml.ts":{"bytesInOutput":2831},"src/utils/platform.ts":{"bytesInOutput":245},"src/agents/profiles.ts":{"bytesInOutput":15567}},"bytes":31322}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"src/utils/yaml.ts":{"bytes":
|
|
1
|
+
{"inputs":{"src/utils/yaml.ts":{"bytes":7264,"imports":[],"format":"esm"},"src/runtime/process-tree-kill.ts":{"bytes":9124,"imports":[{"path":"node:child_process","kind":"import-statement","external":true}],"format":"esm"},"src/utils/platform.ts":{"bytes":9633,"imports":[{"path":"node:os","kind":"import-statement","external":true},{"path":"node:child_process","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"src/runtime/process-tree-kill.ts","kind":"import-statement","original":"../runtime/process-tree-kill.js"}],"format":"esm"},"src/agents/definitions.ts":{"bytes":25020,"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"src/utils/yaml.ts","kind":"import-statement","original":"../utils/yaml.js"},{"path":"src/utils/platform.ts","kind":"import-statement","original":"../utils/platform.js"}],"format":"esm"},"src/agents/profiles.ts":{"bytes":33891,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/agents/definitions.ts","kind":"import-statement","original":"./definitions.js"}],"format":"esm"},"src/agents/index.ts":{"bytes":65,"imports":[{"path":"src/agents/definitions.ts","kind":"import-statement","original":"./definitions.js"},{"path":"src/agents/profiles.ts","kind":"import-statement","original":"./profiles.js"}],"format":"esm"}},"outputs":{"dist/agents/index.js":{"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"node:crypto","kind":"import-statement","external":true}],"exports":["AGENT_PROFILE_EXTERNAL_ACTIONS","AgentDefinitionLoader","AgentDefinitionResolver","AgentProfileValidationError","XENO_AGENT_PROFILE_SCHEMA_VERSION","agentDefinitionFromProfile","agentProfileFromDefinition","compileAgentProfile","createAgentDefinitionFile","createAgentDefinitionPromptSection","getProjectAgentDefinitionDirs","getProjectAgentDefinitionsDir","getUserAgentDefinitionsDir","isValidAgentDefinitionName","listBuiltInAgentProfiles","renderAgentDefinition","renderAgentDefinitions","resolveAgentDefinition","resolveAgentProfile","resolveAgentToolPolicy","resolveBuiltInAgentProfile","scanAgentDefinitions","toAgentDefinitionMetadata","validateAgentDefinition","validateAgentMcpServers"],"entryPoint":"src/agents/index.ts","inputs":{"src/agents/definitions.ts":{"bytesInOutput":10666},"src/utils/yaml.ts":{"bytesInOutput":2821},"src/utils/platform.ts":{"bytesInOutput":247},"src/agents/index.ts":{"bytesInOutput":0},"src/agents/profiles.ts":{"bytesInOutput":15568}},"bytes":30102}}}
|
package/dist/artifacts/index.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";var Sn=Object.create;var we=Object.defineProperty;var _n=Object.getOwnPropertyDescriptor;var xn=Object.getOwnPropertyNames;var Tn=Object.getPrototypeOf,kn=Object.prototype.hasOwnProperty;var Cn=(t,e)=>{for(var n in e)we(t,n,{get:e[n],enumerable:!0})},Tt=(t,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of xn(e))!kn.call(t,o)&&o!==n&&we(t,o,{get:()=>e[o],enumerable:!(i=_n(e,o))||i.enumerable});return t};var Nn=(t,e,n)=>(n=t!=null?Sn(Tn(t)):{},Tt(e||!t||!t.__esModule?we(n,"default",{value:t,enumerable:!0}):n,t)),Pn=t=>Tt(we({},"__esModule",{value:!0}),t);var tr={};Cn(tr,{FileXenoArtifactRepository:()=>Ze,InMemoryXenoArtifactRepository:()=>ne,XENO_ARTIFACT_ACTOR_KINDS:()=>je,XENO_ARTIFACT_FILE_REPOSITORY_SCHEMA_VERSION:()=>nt,XENO_ARTIFACT_SCHEMA_VERSION:()=>v,XENO_ARTIFACT_SENSITIVITIES:()=>He,XENO_ARTIFACT_STATES:()=>Me,XENO_BUILTIN_ARTIFACT_KINDS:()=>Le,XENO_EVIDENCE_EDGE_TYPES:()=>ce,XENO_EVIDENCE_GRAPH_SCHEMA_VERSION:()=>Ee,XENO_EVIDENCE_NODE_TYPES:()=>ae,XENO_PAGE_ENTRY:()=>V,XENO_PAGE_MAX_BYTES:()=>wn,XENO_PAGE_MAX_FILES:()=>Et,XENO_REVIEW_DIMENSIONS:()=>fn,XENO_REVIEW_EVIDENCE_KINDS:()=>pn,XENO_REVIEW_REPORT_SCHEMA_VERSION:()=>mt,XENO_SPEC_EXECUTION_SCHEMA_VERSION:()=>ge,XENO_SPEC_SCHEMA_VERSION:()=>oe,XenoArtifactRepositoryError:()=>u,XenoArtifactReviewService:()=>ie,XenoArtifactStateTransitionError:()=>Xe,XenoArtifactValidationError:()=>K,XenoDiffParseError:()=>T,XenoEvidenceGraphBuilder:()=>Ue,XenoEvidenceGraphValidationError:()=>_e,XenoMultiAgentReviewCoordinator:()=>lt,XenoPageStore:()=>Rt,XenoReviewValidationError:()=>b,XenoSpecLifecycleService:()=>ct,XenoSpecValidationError:()=>R,assertValidXenoArtifact:()=>X,assertValidXenoEvidenceGraph:()=>te,assertValidXenoReviewPack:()=>ht,assertValidXenoReviewReport:()=>ye,assertValidXenoReviewTarget:()=>gt,assertValidXenoSpecDocument:()=>$e,assertValidXenoSpecExecution:()=>ut,assertXenoArtifactStateTransition:()=>pe,buildXenoArtifactReviewAnchor:()=>at,canTransitionXenoArtifactState:()=>$t,canonicalizeArtifactJson:()=>C,defaultXenoReviewPack:()=>Ci,detectXenoSpecDrift:()=>bi,extractPageTitle:()=>En,legacyAgentArtifactToXenoArtifact:()=>Bi,normalizePagePath:()=>Xt,normalizeRepositoryRelativePath:()=>nn,pageContentType:()=>De,parseUnifiedDiff:()=>rt,sha256ArtifactBytes:()=>k,sha256ArtifactJson:()=>N,summarizeXenoArtifactReview:()=>be,toolEvidenceToXenoArtifact:()=>Ji,turnDiffSummaryToXenoArtifact:()=>Ui,unifiedDiffToXenoArtifact:()=>ot,validateXenoArtifact:()=>Pt,validateXenoArtifactReviewEvent:()=>Re,validateXenoEvidenceGraph:()=>Vt,validateXenoSpecDocument:()=>on,xenoArtifactToDiffDocument:()=>st,xenoArtifactToLegacyAgentArtifact:()=>qi,xenoArtifactToReviewReport:()=>Pi,xenoArtifactToSpecDocument:()=>ft,xenoArtifactToSpecExecution:()=>sn,xenoArtifactToToolEvidence:()=>zi,xenoArtifactToTurnDiffSummary:()=>Wi,xenoReviewReportToArtifact:()=>Ni,xenoReviewReportToGitHubComments:()=>$i,xenoSpecArtifactIds:()=>re,xenoSpecExecutionToArtifact:()=>pt,xenoSpecToArtifactBundle:()=>dt});module.exports=Pn(tr);var v=1,Ee=1,Le=["plan","requirements","design","task-graph","patch","diff","file","document","diagram","screenshot","recording","browser-snapshot","test-report","review-report","security-report","performance-report","release-report","sbom","provenance","attestation","page"],Me=["draft","pending_review","approved","rejected","superseded","archived"],He=["public","internal","confidential","restricted"],je=["agent","tool","user","system","integration"],ae=["requirement","design-decision","risk","task","agent","run","tool-call","edit","commit","test-case","test-run","finding","approval","artifact","release","claim"],ce=["decomposes","depends_on","implements","changes","tests","verifies","finds","fixes","reviews","approves","rejects","supersedes","derived_from","produced_by","supports_claim","contradicts_claim","released_as"];var Je=require("node:buffer");var kt=require("node:crypto");function k(t){return{algorithm:"sha256",value:(0,kt.createHash)("sha256").update(t).digest("hex")}}function C(t){return JSON.stringify(Be(t,new Set))}function N(t){return k(C(t))}function Be(t,e){if(t===null||typeof t!="object"){if(typeof t=="number"&&!Number.isFinite(t))throw new TypeError("Artifact JSON cannot contain non-finite numbers");return t}if(e.has(t))throw new TypeError("Artifact JSON cannot contain cycles");if(e.add(t),Array.isArray(t)){let i=t.map(o=>Be(o,e));return e.delete(t),i}let n={};for(let i of Object.keys(t).sort((o,r)=>o.localeCompare(r))){let o=t[i];if(o===void 0)throw new TypeError(`Artifact JSON property ${i} is undefined`);n[i]=Be(o,e)}return e.delete(t),n}var $n=/^[a-z0-9][a-z0-9._/-]{0,127}$/,qe="custom:";function U(t,e=qe){return t.startsWith(e)?$n.test(t.slice(e.length)):!1}var K=class extends Error{code="ARTIFACT_INVALID";issues;constructor(e,n){super(e),this.name="XenoArtifactValidationError",this.issues=n.map(i=>({...i}))}},Xe=class extends Error{constructor(n,i){super(`Artifact state cannot transition from ${n} to ${i}`);this.fromState=n;this.toState=i;this.name="XenoArtifactStateTransitionError"}fromState;toState;code="ARTIFACT_STATE_TRANSITION_INVALID"},On={draft:["pending_review","superseded","archived"],pending_review:["approved","rejected","superseded","archived"],approved:["superseded","archived"],rejected:["superseded","archived"],superseded:["archived"],archived:[]},Vn="[\\u0000-\\u001f\\u007f]",Dn=new RegExp(Vn),Ct=/^[a-f0-9]{64}$/,Fn=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,Ln=new Set(Me),Mn=new Set(He),Hn=new Set(je),jn=new Set(Le),Bn=new Set(ae),qn=new Set(ce);function p(t,e,n,i){t.push({path:e,code:n,message:i})}function l(t,e,n,i=1024){return typeof t!="string"||t.trim().length===0?(p(n,e,"required_string","Value must be a non-empty string"),!1):(t.length>i&&p(n,e,"string_too_long",`Value must not exceed ${i} characters`),Dn.test(t)&&p(n,e,"control_character","Value must not contain control characters"),!0)}function de(t,e,n){t!==void 0&&(!Number.isFinite(Date.parse(t))||!t.includes("T"))&&p(n,e,"invalid_timestamp","Value must be an ISO 8601 timestamp")}function W(t,e,n,i){typeof t=="string"&&t.startsWith(e)&&(U(t,e)||p(i,n,"invalid_custom_name",`Custom name after ${e} is invalid`))}function Nt(t,e,n){if(!t||typeof t!="object"){p(n,e,"missing_actor","Actor is required");return}l(t.kind,`${e}.kind`,n,64),Hn.has(t.kind)||p(n,`${e}.kind`,"unknown_actor_kind","Actor kind is not supported"),l(t.id,`${e}.id`,n,512),t?.displayName!==void 0&&l(t.displayName,`${e}.displayName`,n,512),t?.profileFingerprint!==void 0&&!/^[a-f0-9]{64}$/.test(t.profileFingerprint)&&p(n,`${e}.profileFingerprint`,"invalid_fingerprint","Profile fingerprint must be 64 lowercase hexadecimal characters")}function ze(t,e,n){if(!t||typeof t!="object"){p(n,e,"invalid_anchor","Anchor must be an object");return}switch(t.kind){case"file":l(t.path,`${e}.path`,n,4096);break;case"source-line":l(t.path,`${e}.path`,n,4096),(!Number.isInteger(t.startLine)||t.startLine<1)&&p(n,`${e}.startLine`,"invalid_line","startLine must be a positive integer"),t.endLine!==void 0&&(!Number.isInteger(t.endLine)||t.endLine<t.startLine)&&p(n,`${e}.endLine`,"invalid_line_range","endLine must be greater than or equal to startLine");break;case"diff-hunk":l(t.path,`${e}.path`,n,4096),l(t.hunkId,`${e}.hunkId`,n,512);break;case"symbol":l(t.path,`${e}.path`,n,4096),l(t.symbol,`${e}.symbol`,n,1024);break;case"dom-node":l(t.pageId,`${e}.pageId`,n,512),!t.selector&&!t.accessibilityId&&!t.snapshotArtifactId&&p(n,e,"missing_dom_locator","DOM anchors require a selector, accessibility ID, or snapshot artifact ID");break;case"timeline":l(t.recordingArtifactId,`${e}.recordingArtifactId`,n,512),(!Number.isFinite(t.startMs)||t.startMs<0)&&p(n,`${e}.startMs`,"invalid_time","startMs must be a non-negative finite number"),t.endMs!==void 0&&(!Number.isFinite(t.endMs)||t.endMs<t.startMs)&&p(n,`${e}.endMs`,"invalid_time_range","endMs must be greater than or equal to startMs");break;case"region":l(t.mediaArtifactId,`${e}.mediaArtifactId`,n,512),[t.x,t.y,t.width,t.height].every(Number.isFinite)?(t.width<=0||t.height<=0)&&p(n,e,"invalid_region_size","Region width and height must be positive"):p(n,e,"invalid_region","Region coordinates must be finite numbers");break;case"artifact":l(t.artifactId,`${e}.artifactId`,n,512);break;default:typeof t.kind!="string"||!t.kind.startsWith("custom:")?p(n,`${e}.kind`,"unknown_anchor","Anchor kind is not supported"):W(t.kind,"custom:",`${e}.kind`,n)}}function fe(t,e,n,i){if(!(t===null||typeof t=="string"||typeof t=="boolean")){if(typeof t=="number"){Number.isFinite(t)||p(n,e,"non_finite_number","JSON numbers must be finite");return}if(typeof t!="object"){p(n,e,"non_json_value","Value must be JSON-serializable");return}if(i.has(t)){p(n,e,"cyclic_value","Value must not contain cycles");return}if(i.add(t),Array.isArray(t))t.forEach((o,r)=>fe(o,`${e}[${r}]`,n,i));else for(let[o,r]of Object.entries(t))r===void 0?p(n,`${e}.${o}`,"undefined_value","Undefined is not valid JSON"):fe(r,`${e}.${o}`,n,i);i.delete(t)}}function Pt(t){let e=[];if(!t||typeof t!="object")return[{path:"$",code:"invalid_artifact",message:"Artifact must be an object"}];if(t.schemaVersion!==1&&p(e,"schemaVersion","unsupported_schema",`schemaVersion must be ${1}`),l(t.artifactId,"artifactId",e,512),(!Number.isInteger(t.revision)||t.revision<1)&&p(e,"revision","invalid_revision","revision must be a positive integer"),l(t.kind,"kind",e,160),typeof t.kind=="string"&&!jn.has(t.kind)&&!t.kind.startsWith("custom:")&&p(e,"kind","unknown_artifact_kind","Artifact kind is not supported"),W(t.kind,"custom:","kind",e),l(t.title,"title",e,1024),t.description!==void 0&&l(t.description,"description",e,32768),l(t.state,"state",e,64),Ln.has(t.state)||p(e,"state","unknown_state","Artifact state is not supported"),l(t.createdAt,"createdAt",e,128),de(t.createdAt,"createdAt",e),de(t.updatedAt,"updatedAt",e),t.updatedAt&&Number.isFinite(Date.parse(t.createdAt))&&Date.parse(t.updatedAt)<Date.parse(t.createdAt)&&p(e,"updatedAt","timestamp_order","updatedAt must not precede createdAt"),l(t.mediaType,"mediaType",e,255),l(t.sensitivity,"sensitivity",e,64),Mn.has(t.sensitivity)||p(e,"sensitivity","unknown_sensitivity","Sensitivity is not supported"),t.identity)for(let[i,o]of Object.entries(t.identity))o!==void 0&&l(o,`identity.${i}`,e,512);if(!t.content||typeof t.content!="object")p(e,"content","missing_content","content descriptor is required");else{!t.content.hash||typeof t.content.hash!="object"?p(e,"content.hash","missing_hash","content hash is required"):(l(t.content.hash.algorithm,"content.hash.algorithm",e,128),W(t.content.hash.algorithm,"custom:","content.hash.algorithm",e),typeof t.content.hash.algorithm=="string"&&t.content.hash.algorithm!=="sha256"&&!t.content.hash.algorithm.startsWith("custom:")&&p(e,"content.hash.algorithm","unknown_hash_algorithm","Hash algorithm is not supported"),l(t.content.hash.value,"content.hash.value",e,512),t.content.hash.algorithm==="sha256"&&!Ct.test(t.content.hash.value)&&p(e,"content.hash.value","invalid_sha256","SHA-256 hash must be 64 lowercase hexadecimal characters")),(!Number.isSafeInteger(t.content.sizeBytes)||t.content.sizeBytes<0)&&p(e,"content.sizeBytes","invalid_size","sizeBytes must be a non-negative safe integer");let i=t.content.storage;if(!i||typeof i!="object")p(e,"content.storage","missing_storage","storage reference is required");else if(i.type==="inline")if(i.text===void 0==(i.base64===void 0))p(e,"content.storage","invalid_inline_storage","Inline storage requires exactly one of text or base64");else{let o;i.text!==void 0?o=Je.Buffer.from(i.text,"utf8"):i.base64!==void 0&&(Fn.test(i.base64)?o=Je.Buffer.from(i.base64,"base64"):p(e,"content.storage.base64","invalid_base64","Inline base64 content is malformed")),o&&t.content.sizeBytes!==o.byteLength&&p(e,"content.sizeBytes","content_size_mismatch","sizeBytes does not match inline content"),o&&t.content.hash.algorithm==="sha256"&&k(o).value!==t.content.hash.value&&p(e,"content.hash.value","content_hash_mismatch","Hash does not match inline content")}else i.type==="file"?l(i.path,"content.storage.path",e,4096):i.type==="blob"?l(i.uri,"content.storage.uri",e,8192):i.type==="git"?(l(i.commit,"content.storage.commit",e,512),l(i.path,"content.storage.path",e,4096)):i.type==="url"?(l(i.url,"content.storage.url",e,8192),de(i.expiresAt,"content.storage.expiresAt",e)):i.type==="external"?(l(i.provider,"content.storage.provider",e,255),l(i.locator,"content.storage.locator",e,8192)):p(e,"content.storage.type","unknown_storage","Storage type is not supported");t.content.encoding!==void 0&&(typeof t.content.encoding!="string"||t.content.encoding!=="utf8"&&t.content.encoding!=="base64"&&t.content.encoding!=="binary"&&!t.content.encoding.startsWith("custom:"))&&p(e,"content.encoding","unknown_encoding","Content encoding is not supported"),W(t.content.encoding,"custom:","content.encoding",e)}!t.provenance||typeof t.provenance!="object"?p(e,"provenance","missing_provenance","provenance is required"):(Nt(t.provenance.producer,"provenance.producer",e),t.provenance.capabilityLeaseIds?.forEach((i,o)=>l(i,`provenance.capabilityLeaseIds[${o}]`,e,512)),t.provenance.sourceArtifactIds?.forEach((i,o)=>l(i,`provenance.sourceArtifactIds[${o}]`,e,512)),t.provenance.attributes&&fe(t.provenance.attributes,"provenance.attributes",e,new Set));let n=new Set;return t.relationships?.forEach((i,o)=>{let r=`relationships[${o}]`;l(i.relation,`${r}.relation`,e,160),typeof i.relation=="string"&&!qn.has(i.relation)&&!i.relation.startsWith("custom:")&&p(e,`${r}.relation`,"unknown_relationship","Relationship type is not supported"),W(i.relation,"custom:",`${r}.relation`,e),l(i.target?.type,`${r}.target.type`,e,160),typeof i.target?.type=="string"&&!Bn.has(i.target.type)&&!i.target.type.startsWith("custom:")&&p(e,`${r}.target.type`,"unknown_reference_type","Evidence reference type is not supported"),W(i.target?.type,"custom:",`${r}.target.type`,e),l(i.target?.id,`${r}.target.id`,e,512);let s=`${i.relation}:${i.target?.type}:${i.target?.id}:${i.target?.revision??""}`;n.has(s)&&p(e,r,"duplicate_relationship","Duplicate relationship"),n.add(s),i.attributes&&fe(i.attributes,`${r}.attributes`,e,new Set)}),t.anchors?.forEach((i,o)=>ze(i,`anchors[${o}]`,e)),t.revision===1&&t.predecessorRevision!==void 0&&p(e,"predecessorRevision","unexpected_predecessor","First revision cannot have a predecessor"),t.revision>1&&(!Number.isInteger(t.predecessorRevision)||(t.predecessorRevision??0)>=t.revision)&&p(e,"predecessorRevision","invalid_predecessor","Later revisions require an earlier predecessor revision"),de(t.retention?.retainUntil,"retention.retainUntil",e),t.retention?.legalHold!==void 0&&typeof t.retention.legalHold!="boolean"&&p(e,"retention.legalHold","invalid_boolean","legalHold must be a boolean"),t.extensions&&fe(t.extensions,"extensions",e,new Set),e}function X(t){let e=Pt(t);if(e.length>0)throw new K("XENO artifact validation failed",e)}function $t(t,e){return On[t].includes(e)}function pe(t,e){if(!$t(t,e))throw new Xe(t,e)}function Re(t,e){let n=[];return t.schemaVersion!==1&&p(n,"schemaVersion","unsupported_schema",`schemaVersion must be ${1}`),l(t.eventId,"eventId",n,512),l(t.artifactId,"artifactId",n,512),(!Number.isInteger(t.artifactRevision)||t.artifactRevision<1)&&p(n,"artifactRevision","invalid_revision","artifactRevision must be a positive integer"),(!Number.isInteger(t.sequence)||t.sequence<1)&&p(n,"sequence","invalid_sequence","sequence must be a positive integer"),l(t.recordedAt,"recordedAt",n,128),de(t.recordedAt,"recordedAt",n),Nt(t.actor,"actor",n),!t.artifactHash||typeof t.artifactHash!="object"?p(n,"artifactHash","missing_hash","Artifact hash is required"):(l(t.artifactHash.algorithm,"artifactHash.algorithm",n,128),W(t.artifactHash.algorithm,"custom:","artifactHash.algorithm",n),l(t.artifactHash.value,"artifactHash.value",n,512),t.artifactHash.algorithm==="sha256"&&!Ct.test(t.artifactHash.value)&&p(n,"artifactHash.value","invalid_sha256","SHA-256 hash must be 64 lowercase hexadecimal characters"),typeof t.artifactHash.algorithm=="string"&&t.artifactHash.algorithm!=="sha256"&&!t.artifactHash.algorithm.startsWith("custom:")&&p(n,"artifactHash.algorithm","unknown_hash_algorithm","Hash algorithm is not supported")),["review-requested","comment-added","comment-resolved","comment-reopened","decision-recorded","review-withdrawn"].includes(t.type)||p(n,"type","unknown_review_event","Review event type is not supported"),t.type==="comment-added"?(l(t.commentId,"commentId",n,512),l(t.body,"body",n,65536),t.anchor&&ze(t.anchor,"anchor",n)):t.type==="comment-resolved"||t.type==="comment-reopened"?l(t.commentId,"commentId",n,512):t.type==="decision-recorded"&&(["approved","rejected","changes_requested"].includes(t.decision)||p(n,"decision","unknown_review_decision","Review decision is not supported"),t.scope&&ze(t.scope,"scope",n)),e&&(t.artifactId!==e.artifactId&&p(n,"artifactId","artifact_mismatch","Review event targets a different artifact"),t.artifactRevision!==e.revision&&p(n,"artifactRevision","revision_mismatch","Review event targets a different revision"),t.artifactHash&&(t.artifactHash.algorithm!==e.content.hash.algorithm||t.artifactHash.value!==e.content.hash.value)&&p(n,"artifactHash","hash_mismatch","Review event hash does not match the artifact revision")),n}function be(t){let e="not_requested",n,i,o,r=0,s=new Set,d=new Set;for(let a of[...t].sort((c,f)=>c.sequence-f.sequence))o=a.recordedAt,a.type==="review-requested"?e="pending":a.type==="review-withdrawn"?e="withdrawn":a.type==="comment-added"?(s.add(a.commentId),d.delete(a.commentId),e==="not_requested"&&(e="pending")):a.type==="comment-resolved"?d.add(a.commentId):a.type==="comment-reopened"?d.delete(a.commentId):a.type==="decision-recorded"&&(a.scope?r+=1:(n=a.decision,i=a.eventId,e=a.decision));return{status:e,totalComments:s.size,unresolvedComments:[...s].filter(a=>!d.has(a)).length,...n?{latestDecision:n}:{},...i?{latestDecisionEventId:i}:{},...r>0?{scopedDecisionCount:r}:{},...o?{lastReviewedAt:o}:{}}}var _e=class extends Error{code="EVIDENCE_GRAPH_INVALID";issues;constructor(e){super("XENO evidence graph validation failed"),this.name="XenoEvidenceGraphValidationError",this.issues=e.map(n=>({...n}))}},Jn=new Set(["depends_on","decomposes","supersedes"]),zn=new Set(ae),Un=new Set(ce);function A(t,e,n,i){t.push({path:e,code:n,message:i})}function ue(t){return t.includes("T")&&Number.isFinite(Date.parse(t))}function Ot(t,e){return t.startsWith(qe)?U(t):e.has(t)}function Vt(t){let e=[];if(!t||typeof t!="object")return[{path:"$",code:"invalid_graph",message:"Evidence graph must be an object"}];t.schemaVersion!==1&&A(e,"schemaVersion","unsupported_schema",`schemaVersion must be ${1}`),(typeof t.graphId!="string"||t.graphId.trim().length===0)&&A(e,"graphId","required_string","graphId must be a non-empty string"),(!Number.isInteger(t.version)||t.version<1)&&A(e,"version","invalid_version","version must be a positive integer"),ue(t.createdAt)||A(e,"createdAt","invalid_timestamp","createdAt must be an ISO 8601 timestamp"),ue(t.updatedAt)||A(e,"updatedAt","invalid_timestamp","updatedAt must be an ISO 8601 timestamp"),ue(t.createdAt)&&ue(t.updatedAt)&&Date.parse(t.updatedAt)<Date.parse(t.createdAt)&&A(e,"updatedAt","timestamp_order","updatedAt must not precede createdAt");let n=new Map;Array.isArray(t.nodes)||A(e,"nodes","invalid_nodes","nodes must be an array"),(Array.isArray(t.nodes)?t.nodes:[]).forEach((f,g)=>{let y=`nodes[${g}]`;typeof f.id!="string"||f.id.trim().length===0?A(e,`${y}.id`,"required_string","Node ID must be a non-empty string"):n.has(f.id)?A(e,`${y}.id`,"duplicate_node",`Node ID ${f.id} is duplicated`):n.set(f.id,f),(typeof f.type!="string"||!Ot(f.type,zn))&&A(e,`${y}.type`,"invalid_node_type","Node type is invalid"),f.artifactRevision!==void 0&&(!Number.isInteger(f.artifactRevision)||f.artifactRevision<1)&&A(e,`${y}.artifactRevision`,"invalid_revision","artifactRevision must be a positive integer")});let i=new Set,o=new Set;Array.isArray(t.edges)||A(e,"edges","invalid_edges","edges must be an array"),(Array.isArray(t.edges)?t.edges:[]).forEach((f,g)=>{let y=`edges[${g}]`;typeof f.id!="string"||f.id.trim().length===0?A(e,`${y}.id`,"required_string","Edge ID must be a non-empty string"):i.has(f.id)&&A(e,`${y}.id`,"duplicate_edge",`Edge ID ${f.id} is duplicated`),i.add(f.id),(typeof f.type!="string"||!Ot(f.type,Un))&&A(e,`${y}.type`,"invalid_edge_type","Edge type is invalid");let D=`${f.type}:${f.from}:${f.to}`;o.has(D)&&A(e,y,"duplicate_edge_identity","Equivalent evidence edge is duplicated"),o.add(D),n.has(f.from)||A(e,`${y}.from`,"dangling_reference",`Source node ${f.from} does not exist`),n.has(f.to)||A(e,`${y}.to`,"dangling_reference",`Target node ${f.to} does not exist`),f.from===f.to&&A(e,y,"self_edge","Evidence edges cannot point to the same node"),ue(f.createdAt)||A(e,`${y}.createdAt`,"invalid_timestamp","createdAt must be an ISO 8601 timestamp")});let r=(Array.isArray(t.edges)?t.edges:[]).filter(f=>Jn.has(f.type)),s=new Map;for(let f of r){let g=s.get(f.from)??[];g.push(f.to),s.set(f.from,g)}let d=new Set,a=new Set,c=f=>{if(d.has(f))return!0;if(a.has(f))return!1;d.add(f);for(let g of s.get(f)??[])if(c(g))return!0;return d.delete(f),a.add(f),!1};for(let f of n.keys())if(c(f)){A(e,"edges","cyclic_graph","Dependency, decomposition, and supersession edges must be acyclic");break}return e}function te(t){let e=Vt(t);if(e.length>0)throw new _e(e)}var Ue=class{now;graph;constructor(e){if("schemaVersion"in e)te(e),this.now=()=>new Date().toISOString(),this.graph=Se(e);else{this.now=e.now??(()=>new Date().toISOString());let n=this.now();this.graph={schemaVersion:1,graphId:e.graphId,version:1,createdAt:n,updatedAt:n,nodes:[],edges:[]},te(this.graph)}}addNode(e){let n=Se(this.graph);return n.nodes.push(Dt(e)),this.touch(n),te(n),this.graph=n,this}addEdge(e){let n=Se(this.graph);return n.edges.push(Ft(e)),this.touch(n),te(n),this.graph=n,this}build(){return te(this.graph),Se(this.graph)}touch(e){e.version+=1,e.updatedAt=this.now()}};function Dt(t){return{...t,...t.attributes?{attributes:structuredClone(t.attributes)}:{}}}function Ft(t){return{...t,...t.producer?{producer:{...t.producer}}:{},...t.attributes?{attributes:structuredClone(t.attributes)}:{}}}function Se(t){return{...t,nodes:t.nodes.map(Dt),edges:t.edges.map(Ft)}}var u=class extends Error{constructor(n,i,o,r){super(i,r);this.code=n;this.detail=o;this.name="XenoArtifactRepositoryError"}code;detail},ne=class{records=new Map;currentRevisions=new Map;now;idFactory;eventIds=new Set;idCounter=0;constructor(e={}){this.now=e.now??(()=>new Date().toISOString()),this.idFactory=e.idFactory??(n=>(this.idCounter+=1,`${n}_${Date.now().toString(36)}_${this.idCounter.toString(36)}`)),e.initialState&&this.hydrate(e.initialState)}exportState(){let e=[...this.records.values()].flatMap(n=>[...n.values()]).sort(Lt).map(n=>({artifact:le(n.artifact),recordVersion:n.recordVersion,lifecycleEvents:structuredClone(n.lifecycleEvents),reviewEvents:structuredClone(n.reviewEvents)}));return{schemaVersion:1,records:e}}async create(e){if(X(e),this.assertInitialState(e),e.revision!==1)throw new u("ARTIFACT_REVISION_INVALID","A new artifact must begin at revision 1",{artifactId:e.artifactId,revision:e.revision});if(this.records.has(e.artifactId))throw new u("ARTIFACT_ALREADY_EXISTS",`Artifact ${e.artifactId} already exists`,{artifactId:e.artifactId});let n=le(e),i=this.createLifecycleEvent({artifact:n,sequence:1,actor:n.provenance.producer,fromState:null,toState:n.state,reason:"artifact-created"}),o={artifact:n,recordVersion:1,lifecycleEvents:[i],reviewEvents:[]};return this.records.set(n.artifactId,new Map([[n.revision,o]])),this.currentRevisions.set(n.artifactId,n.revision),G(o)}async createRevision(e,n={}){X(e),this.assertInitialState(e);let i=this.getMutable(e.artifactId);this.assertVersion(i,n.expectedRecordVersion);let o=i.artifact.revision+1;if(e.revision!==o||e.predecessorRevision!==i.artifact.revision)throw new u("ARTIFACT_REVISION_INVALID",`Revision ${e.revision} does not follow current revision ${i.artifact.revision}`,{artifactId:e.artifactId,currentRevision:i.artifact.revision,requestedRevision:e.revision});if(Kn(e,i.artifact))throw new u("ARTIFACT_CONTENT_UNCHANGED","A new artifact revision must have a different content hash",{artifactId:e.artifactId,revision:e.revision});if(i.artifact.state==="archived")throw new u("ARTIFACT_REVISION_INVALID","Archived artifacts cannot receive new revisions",{artifactId:e.artifactId,revision:i.artifact.revision});if(i.artifact.state!=="superseded"){pe(i.artifact.state,"superseded");let a=this.now(),c=this.createLifecycleEvent({artifact:i.artifact,sequence:i.lifecycleEvents.length+1,actor:n.actor??e.provenance.producer,fromState:i.artifact.state,toState:"superseded",reason:n.reason??`superseded-by-revision-${e.revision}`,recordedAt:a});i.artifact.state="superseded",i.artifact.updatedAt=a,i.lifecycleEvents.push(c),i.recordVersion+=1}let r=le(e),s=this.createLifecycleEvent({artifact:r,sequence:1,actor:n.actor??r.provenance.producer,fromState:null,toState:r.state,reason:n.reason??`revision-created-from-${i.artifact.revision}`}),d={artifact:r,recordVersion:1,lifecycleEvents:[s],reviewEvents:[]};return this.records.get(r.artifactId)?.set(r.revision,d),this.currentRevisions.set(r.artifactId,r.revision),G(d)}async get(e,n){let i=this.records.get(e);if(!i)return;let o=n??this.currentRevisions.get(e);if(o===void 0)return;let r=i.get(o);return r?G(r):void 0}async require(e,n){let i=await this.get(e,n);if(!i)throw new u("ARTIFACT_NOT_FOUND",`Artifact ${e}${n===void 0?"":` revision ${n}`} was not found`,{artifactId:e,...n===void 0?{}:{revision:n}});return i}async list(e={}){let n=[];for(let[i,o]of this.records)if(!(e.artifactIds&&!e.artifactIds.includes(i)))if(e.includeSuperseded)n.push(...o.values());else{let r=this.currentRevisions.get(i);if(r!==void 0){let s=o.get(r);s&&n.push(s)}}return n.filter(i=>Gn(i.artifact,e)).sort(Lt).map(G)}async listRevisions(e){let n=this.records.get(e);return n?[...n.values()].sort((i,o)=>i.artifact.revision-o.artifact.revision).map(G):[]}async transition(e){let n=this.getMutable(e.artifactId,e.revision);if(this.assertVersion(n,e.expectedRecordVersion),pe(n.artifact.state,e.toState),e.toState==="approved"||e.toState==="rejected"){let s=e.reviewEventId?n.reviewEvents.find(a=>a.eventId===e.reviewEventId&&a.type==="decision-recorded"):void 0,d=be(n.reviewEvents);if(!s||s.decision!==e.toState||d.latestDecisionEventId!==s.eventId)throw new u("ARTIFACT_REVIEW_DECISION_REQUIRED",`Transition to ${e.toState} requires a matching decision event`,{artifactId:e.artifactId,revision:n.artifact.revision});if(e.toState==="approved"&&d.unresolvedComments>0)throw new u("ARTIFACT_UNRESOLVED_COMMENTS",`Artifact has ${d.unresolvedComments} unresolved review comment(s)`,{artifactId:e.artifactId,revision:n.artifact.revision,unresolvedComments:d.unresolvedComments})}let i=this.now(),o=n.artifact.state,r=this.createLifecycleEvent({artifact:n.artifact,sequence:n.lifecycleEvents.length+1,actor:e.actor,fromState:o,toState:e.toState,reason:e.reason,reviewEventId:e.reviewEventId,recordedAt:i});return n.artifact.state=e.toState,n.artifact.updatedAt=i,n.lifecycleEvents.push(r),n.recordVersion+=1,G(n)}async appendReviewEvent(e){let n=e.event,i=this.getMutable(n.artifactId,n.artifactRevision);if(this.assertVersion(i,e.expectedRecordVersion),i.artifact.state==="archived"||i.artifact.state==="superseded")throw new u("ARTIFACT_REVIEW_INVALID",`Cannot append review events to a ${i.artifact.state} artifact revision`,{artifactId:n.artifactId,revision:n.artifactRevision});if(this.assertReviewCommentState(i,n),(n.type==="review-requested"||n.type==="review-withdrawn"||n.type==="decision-recorded")&&i.artifact.state!=="pending_review")throw new u("ARTIFACT_REVIEW_INVALID",`${n.type} requires an artifact in pending_review state`,{artifactId:n.artifactId,revision:n.artifactRevision});let o={...structuredClone(n),schemaVersion:1,eventId:this.nextEventId("review_event"),sequence:i.reviewEvents.length+1,recordedAt:this.now()},r=Re(o,i.artifact);if(r.length>0)throw new K("XENO artifact review event validation failed",r);return i.reviewEvents.push(o),i.recordVersion+=1,G(i)}getMutable(e,n){let i=this.records.get(e),o=n??this.currentRevisions.get(e),r=o===void 0?void 0:i?.get(o);if(!r)throw new u("ARTIFACT_NOT_FOUND",`Artifact ${e}${n===void 0?"":` revision ${n}`} was not found`,{artifactId:e,...n===void 0?{}:{revision:n}});return r}assertVersion(e,n){if(n!==void 0&&n!==e.recordVersion)throw new u("ARTIFACT_CONFLICT",`Expected record version ${n}, found ${e.recordVersion}`,{artifactId:e.artifact.artifactId,revision:e.artifact.revision,expectedRecordVersion:n,actualRecordVersion:e.recordVersion})}assertInitialState(e){if(e.state!=="draft"&&e.state!=="pending_review")throw new u("ARTIFACT_REVISION_INVALID","New artifact revisions must begin in draft or pending_review state",{artifactId:e.artifactId,revision:e.revision})}assertReviewCommentState(e,n){if(n.type==="comment-added"){if(e.reviewEvents.some(r=>r.type==="comment-added"&&r.commentId===n.commentId))throw new u("ARTIFACT_REVIEW_INVALID",`Comment ${n.commentId} already exists`);if(n.parentCommentId&&!e.reviewEvents.some(r=>r.type==="comment-added"&&r.commentId===n.parentCommentId))throw new u("ARTIFACT_REVIEW_INVALID",`Parent comment ${n.parentCommentId} does not exist`);return}if(n.type!=="comment-resolved"&&n.type!=="comment-reopened")return;if(!e.reviewEvents.some(r=>r.type==="comment-added"&&r.commentId===n.commentId))throw new u("ARTIFACT_REVIEW_INVALID",`Comment ${n.commentId} does not exist`);let o=Yn(e.reviewEvents,n.commentId);if(n.type==="comment-resolved"&&o.resolved)throw new u("ARTIFACT_REVIEW_INVALID",`Comment ${n.commentId} is already resolved`);if(n.type==="comment-reopened"&&!o.resolved)throw new u("ARTIFACT_REVIEW_INVALID",`Comment ${n.commentId} is not resolved`)}createLifecycleEvent(e){return{schemaVersion:1,eventId:this.nextEventId("artifact_event"),artifactId:e.artifact.artifactId,revision:e.artifact.revision,sequence:e.sequence,recordedAt:e.recordedAt??this.now(),actor:{...e.actor},fromState:e.fromState,toState:e.toState,...e.reason?{reason:e.reason}:{},...e.reviewEventId?{reviewEventId:e.reviewEventId}:{}}}nextEventId(e){let n=this.idFactory(e);if(typeof n!="string"||n.trim().length===0||this.eventIds.has(n))throw new u("ARTIFACT_CONFLICT",`Event ID factory produced an invalid or duplicate ${e} ID`);return this.eventIds.add(n),n}hydrate(e){if(e.schemaVersion!==1||!Array.isArray(e.records))throw new u("ARTIFACT_REVISION_INVALID","Artifact repository state has an unsupported schema or record collection");let n=[...e.records].sort((i,o)=>i.artifact.artifactId.localeCompare(o.artifact.artifactId)||i.artifact.revision-o.artifact.revision);for(let i of n){let o=Wn(i,this.eventIds),r=this.records.get(o.artifact.artifactId);if(r||(r=new Map,this.records.set(o.artifact.artifactId,r)),r.has(o.artifact.revision))throw new u("ARTIFACT_REVISION_INVALID",`Duplicate persisted revision ${o.artifact.artifactId}:${o.artifact.revision}`);r.set(o.artifact.revision,o),this.currentRevisions.set(o.artifact.artifactId,o.artifact.revision)}for(let[i,o]of this.records){let r=[...o.values()].sort((s,d)=>s.artifact.revision-d.artifact.revision);for(let s=0;s<r.length;s+=1){let d=r[s],a=s+1;if(d.artifact.revision!==a)throw new u("ARTIFACT_REVISION_INVALID",`Persisted artifact ${i} is missing revision ${a}`);if(s===0&&d.artifact.predecessorRevision!==void 0)throw new u("ARTIFACT_REVISION_INVALID",`Initial revision for ${i} cannot declare a predecessor`);if(s>0&&d.artifact.predecessorRevision!==a-1)throw new u("ARTIFACT_REVISION_INVALID",`Persisted revision ${i}:${a} has an invalid predecessor`);if(s<r.length-1&&d.artifact.state!=="superseded")throw new u("ARTIFACT_REVISION_INVALID",`Non-current revision ${i}:${a} must be superseded`)}}}};function Wn(t,e){if(X(t.artifact),!Number.isInteger(t.recordVersion)||t.recordVersion<1)throw new u("ARTIFACT_REVISION_INVALID","Persisted artifact recordVersion must be a positive integer",{artifactId:t.artifact.artifactId,revision:t.artifact.revision});if(!Array.isArray(t.lifecycleEvents)||t.lifecycleEvents.length===0||!Array.isArray(t.reviewEvents))throw new u("ARTIFACT_REVISION_INVALID","Persisted artifact records require lifecycle and review event arrays",{artifactId:t.artifact.artifactId,revision:t.artifact.revision});let n=t.lifecycleEvents.length+t.reviewEvents.length;if(t.recordVersion!==n)throw new u("ARTIFACT_REVISION_INVALID",`Persisted record version ${t.recordVersion} does not match ${n} mutations`,{artifactId:t.artifact.artifactId,revision:t.artifact.revision});let i=null;for(let r=0;r<t.lifecycleEvents.length;r+=1){let s=t.lifecycleEvents[r];if(s.schemaVersion!==1||s.artifactId!==t.artifact.artifactId||s.revision!==t.artifact.revision||s.sequence!==r+1||s.fromState!==i||typeof s.eventId!="string"||s.eventId.length===0||e.has(s.eventId)||!Number.isFinite(Date.parse(s.recordedAt)))throw new u("ARTIFACT_REVISION_INVALID",`Persisted lifecycle event ${r+1} is invalid`,{artifactId:t.artifact.artifactId,revision:t.artifact.revision});if(i===null){if(s.toState!=="draft"&&s.toState!=="pending_review")throw new u("ARTIFACT_REVISION_INVALID","A persisted artifact must begin in draft or pending_review state",{artifactId:t.artifact.artifactId,revision:t.artifact.revision})}else pe(i,s.toState);e.add(s.eventId),i=s.toState}if(i!==t.artifact.state)throw new u("ARTIFACT_REVISION_INVALID","Persisted artifact state does not match its lifecycle tail",{artifactId:t.artifact.artifactId,revision:t.artifact.revision});let o=new Map;for(let r=0;r<t.reviewEvents.length;r+=1){let s=t.reviewEvents[r];if(s.sequence!==r+1||e.has(s.eventId))throw new u("ARTIFACT_REVIEW_INVALID",`Persisted review event ${r+1} has an invalid sequence or duplicate ID`,{artifactId:t.artifact.artifactId,revision:t.artifact.revision});let d=Re(s,t.artifact);if(d.length>0)throw new K("Persisted XENO artifact review event validation failed",d);if(s.type==="comment-added"){if(o.has(s.commentId)||s.parentCommentId!==void 0&&!o.has(s.parentCommentId))throw new u("ARTIFACT_REVIEW_INVALID",`Persisted comment ${s.commentId} has an invalid identity or parent`);o.set(s.commentId,!1)}else if(s.type==="comment-resolved"||s.type==="comment-reopened"){let a=o.get(s.commentId);if(a===void 0||s.type==="comment-resolved"&&a||s.type==="comment-reopened"&&!a)throw new u("ARTIFACT_REVIEW_INVALID",`Persisted comment transition for ${s.commentId} is invalid`);o.set(s.commentId,s.type==="comment-resolved")}e.add(s.eventId)}return{artifact:le(t.artifact),recordVersion:t.recordVersion,lifecycleEvents:structuredClone(t.lifecycleEvents),reviewEvents:structuredClone(t.reviewEvents)}}function Kn(t,e){return t.content.hash.algorithm===e.content.hash.algorithm&&t.content.hash.value===e.content.hash.value}function Gn(t,e){return!(e.kinds&&!e.kinds.includes(t.kind)||e.states&&!e.states.includes(t.state)||e.runId&&t.identity?.runId!==e.runId||e.sessionId&&t.identity?.sessionId!==e.sessionId||e.turnId&&t.identity?.turnId!==e.turnId||e.taskId&&t.identity?.taskId!==e.taskId||e.workspaceId&&t.identity?.workspaceId!==e.workspaceId||e.repositoryId&&t.identity?.repositoryId!==e.repositoryId||e.producerId&&t.provenance.producer.id!==e.producerId||e.sensitivity&&!e.sensitivity.includes(t.sensitivity))}function Lt(t,e){return t.artifact.createdAt.localeCompare(e.artifact.createdAt)||t.artifact.artifactId.localeCompare(e.artifact.artifactId)||t.artifact.revision-e.artifact.revision}function Yn(t,e){let n=!1;for(let i of t)(i.type==="comment-resolved"||i.type==="comment-reopened")&&i.commentId===e&&(n=i.type==="comment-resolved");return{resolved:n}}function le(t){return structuredClone(t)}function G(t){return{artifact:le(t.artifact),recordVersion:t.recordVersion,etag:`${t.artifact.artifactId}:${t.artifact.revision}:${t.recordVersion}`,lifecycleEvents:structuredClone(t.lifecycleEvents),reviewEvents:structuredClone(t.reviewEvents),reviewSummary:be(t.reviewEvents)}}var tt=require("node:crypto"),P=require("node:fs/promises"),M=require("node:path");var L=Nn(require("node:fs/promises"),1);var Mt=Symbol.for("@xenosystem/agent-sdk/file-cache"),Ht=globalThis,We=Ht[Mt]??{entries:new Map,counters:{reads:0,hits:0}};Ht[Mt]=We;var vr=We.entries,yr=We.counters;var Zn=new Set(["EACCES","EBUSY","EPERM"]),Qn=[10,20,40,80,160,320,640];async function jt(t,e){for(let n=0;;n+=1)try{await L.rename(t,e);return}catch(i){let o=i.code,r=Qn[n];if(process.platform!=="win32"||!o||!Zn.has(o)||r===void 0)throw i;await new Promise(s=>setTimeout(s,r))}}var H=require("node:fs"),Ke=require("node:os"),qt=require("node:path");function ei(){return new Date().toISOString()}function ti(){return new Date(Date.now()-Math.floor(process.uptime()*1e3)).toISOString()}function Jt(t){try{return JSON.parse((0,H.readFileSync)(t,"utf8"))}catch{return null}}function ni(t){if(!t||t<=0)return!1;try{return process.kill(t,0),!0}catch{return!1}}function ii(t){return t.hostname!==(0,Ke.hostname)()?!0:ni(t.pid)}function Bt(t,e){(0,H.mkdirSync)((0,qt.dirname)(t),{recursive:!0}),(0,H.writeFileSync)(t,JSON.stringify(e,null,2)+`
|
|
2
|
-
`,{encoding:"utf8",flag:"wx"})}function ri(t,e){let n=Jt(t);n?.pid!==e.pid||n.hostname!==e.hostname||(0,H.rmSync)(t,{force:!0})}function zt(t,e,n){let i=ei(),o={schemaVersion:1,name:e,pid:process.pid,hostname:(0,Ke.hostname)(),processStartedAt:ti(),version:n,acquiredAt:i,updatedAt:i};try{Bt(t,o)}catch(r){if(r.code!=="EEXIST")throw r;let d=Jt(t);if(d&&ii(d))throw new Error(`${e} is already locked by PID ${d.pid} on ${d.hostname}.`);(0,H.rmSync)(t,{force:!0}),Bt(t,o)}return{record:o,release:()=>{ri(t,o)}}}var Ut="0.10.
|
|
2
|
+
`,{encoding:"utf8",flag:"wx"})}function ri(t,e){let n=Jt(t);n?.pid!==e.pid||n.hostname!==e.hostname||(0,H.rmSync)(t,{force:!0})}function zt(t,e,n){let i=ei(),o={schemaVersion:1,name:e,pid:process.pid,hostname:(0,Ke.hostname)(),processStartedAt:ti(),version:n,acquiredAt:i,updatedAt:i};try{Bt(t,o)}catch(r){if(r.code!=="EEXIST")throw r;let d=Jt(t);if(d&&ii(d))throw new Error(`${e} is already locked by PID ${d.pid} on ${d.hostname}.`);(0,H.rmSync)(t,{force:!0}),Bt(t,o)}return{record:o,release:()=>{ri(t,o)}}}var Ut="0.10.45";var nt=1,oi="repository.v1.json",si=5e3,ai=20,ci=64*1024*1024,Ze=class{directory;snapshotPath;backupPath;lockPath;now;lockTimeoutMs;lockRetryMs;maxSnapshotBytes;onRecovery;mutationTail=Promise.resolve();constructor(e){if(!e||typeof e.directory!="string"||e.directory.trim().length===0)throw new TypeError("Artifact repository directory is required");let n=e.snapshotFileName??oi;if((0,M.basename)(n)!==n||!/^[A-Za-z0-9_.-]+$/.test(n))throw new TypeError("Artifact snapshot filename must be a safe basename");this.directory=(0,M.resolve)(e.directory),this.snapshotPath=(0,M.join)(this.directory,n),this.backupPath=`${this.snapshotPath}.bak`,this.lockPath=`${this.snapshotPath}.lock`,this.now=e.now??(()=>new Date().toISOString()),this.lockTimeoutMs=Ge(e.lockTimeoutMs,si,100,6e4,"lockTimeoutMs"),this.lockRetryMs=Ge(e.lockRetryMs,ai,1,1e3,"lockRetryMs"),this.maxSnapshotBytes=Ge(e.maxSnapshotBytes,ci,1024,1024*1024*1024,"maxSnapshotBytes"),this.onRecovery=e.onRecovery}async create(e){return this.mutate(n=>n.create(e))}async createRevision(e,n){return this.mutate(i=>i.createRevision(e,n))}async get(e,n){return(await this.load()).repository.get(e,n)}async require(e,n){return(await this.load()).repository.require(e,n)}async list(e){return(await this.load()).repository.list(e)}async listRevisions(e){return(await this.load()).repository.listRevisions(e)}async transition(e){return this.mutate(n=>n.transition(e))}async appendReviewEvent(e){return this.mutate(n=>n.appendReviewEvent(e))}async inspectSnapshot(){return this.readSnapshot(this.snapshotPath,!0)}async mutate(e){return this.enqueueMutation(async()=>{let n=await this.acquireLock();try{let i=await this.load(),o=await e(i.repository);return await this.persist(i),o}finally{n.release()}})}async enqueueMutation(e){let n=this.mutationTail.then(e,e);return this.mutationTail=n.then(()=>{},()=>{}),n}async acquireLock(){let e=Date.now(),n;for(;Date.now()-e<=this.lockTimeoutMs;)try{return zt(this.lockPath,`artifact-repository:${(0,M.basename)(this.snapshotPath)}`,Ut)}catch(i){if(!(i instanceof Error)||!/already locked by PID/.test(i.message))throw i;n=i,await li(this.lockRetryMs)}throw new u("ARTIFACT_PERSISTENCE_LOCKED",`Artifact repository remained locked for ${this.lockTimeoutMs}ms`,{snapshotPath:this.snapshotPath},{cause:n})}async load(){let e,n,i=!1;try{n=await this.readSnapshot(this.snapshotPath,!1)}catch(r){e=xe(r)}if(!n&&(e||await ui(this.backupPath)))try{let r=await this.readSnapshot(this.backupPath,!0);r&&(this.onRecovery?.({snapshotPath:this.snapshotPath,backupPath:this.backupPath,reason:e?.message??"primary snapshot missing"}),n=r,i=!0)}catch(r){throw e?new u("ARTIFACT_PERSISTENCE_CORRUPT","Artifact repository primary and backup snapshots are unreadable",{snapshotPath:this.snapshotPath,backupPath:this.backupPath},{cause:new AggregateError([e,xe(r)])}):r}if(!n&&e)throw e;let o=n?.state??{schemaVersion:1,records:[]};return{repository:new ne({now:this.now,idFactory:r=>`${r}_${(0,tt.randomUUID)()}`,initialState:o}),generation:n?.generation??0,createdAt:n?.createdAt??this.now(),hasSnapshot:n!==void 0,recoveredFromBackup:i,...n?{sourceSnapshot:n}:{}}}async persist(e){let n=this.now(),o={...{schemaVersion:nt,generation:e.generation,createdAt:e.createdAt,updatedAt:n,state:e.repository.exportState()},generation:e.generation+1},r=fi(o),s=`${JSON.stringify(r,null,2)}
|
|
3
3
|
`;if(Buffer.byteLength(s,"utf8")>this.maxSnapshotBytes)throw new u("ARTIFACT_PERSISTENCE_IO",`Artifact repository snapshot exceeds ${this.maxSnapshotBytes} bytes`,{snapshotPath:this.snapshotPath,maxSnapshotBytes:this.maxSnapshotBytes});await(0,P.mkdir)(this.directory,{recursive:!0,mode:448}),e.hasSnapshot&&!e.recoveredFromBackup&&e.sourceSnapshot&&await Wt(this.backupPath,`${JSON.stringify(e.sourceSnapshot,null,2)}
|
|
4
4
|
`),await Wt(this.snapshotPath,s)}async readSnapshot(e,n){let i;try{i=await(0,P.stat)(e)}catch(o){if(!n&&Qe(o,"ENOENT")||n&&Qe(o,"ENOENT"))return;throw et("Unable to inspect artifact repository snapshot",e,o)}if(!i.isFile()||i.size>this.maxSnapshotBytes)throw new u("ARTIFACT_PERSISTENCE_CORRUPT","Artifact repository snapshot is not a bounded regular file",{snapshotPath:e,sizeBytes:i.size,maxSnapshotBytes:this.maxSnapshotBytes});try{let o=await(0,P.readFile)(e);if(o.byteLength>this.maxSnapshotBytes)throw new Error("snapshot grew beyond the configured size limit while reading");return di(JSON.parse(o.toString("utf8")),e)}catch(o){throw o instanceof u?o:et("Unable to parse artifact repository snapshot",e,o,!0)}}};function di(t,e){if(!Ye(t)||t.schemaVersion!==nt||!Number.isInteger(t.generation)||t.generation<0||typeof t.createdAt!="string"||!Number.isFinite(Date.parse(t.createdAt))||typeof t.updatedAt!="string"||!Number.isFinite(Date.parse(t.updatedAt))||!Ye(t.state)||t.state.schemaVersion!==1||!Array.isArray(t.state.records)||!Ye(t.checksum)||t.checksum.algorithm!=="sha256"||typeof t.checksum.value!="string")throw new u("ARTIFACT_PERSISTENCE_CORRUPT","Artifact repository snapshot envelope is invalid",{snapshotPath:e});let n=t,i=pi(n),o=Kt(i);if(n.checksum.value!==o)throw new u("ARTIFACT_PERSISTENCE_CORRUPT","Artifact repository snapshot checksum does not match its payload",{snapshotPath:e});return new ne({initialState:n.state}),structuredClone(n)}function fi(t){return{...structuredClone(t),checksum:{algorithm:"sha256",value:Kt(t)}}}function pi(t){return{schemaVersion:t.schemaVersion,generation:t.generation,createdAt:t.createdAt,updatedAt:t.updatedAt,state:t.state}}function Kt(t){return k(JSON.stringify(t)).value}async function Wt(t,e){await(0,P.mkdir)((0,M.dirname)(t),{recursive:!0,mode:448});let n=`${t}.tmp.${process.pid}.${(0,tt.randomUUID)()}`,i;try{i=await(0,P.open)(n,"wx",384),await i.writeFile(e,{encoding:"utf8"}),await i.sync(),await i.close(),i=void 0,await jt(n,t);try{let o=await(0,P.open)((0,M.dirname)(t),"r");try{await o.sync()}finally{await o.close()}}catch{}}finally{i&&await i.close().catch(()=>{}),await(0,P.unlink)(n).catch(()=>{})}}function Ge(t,e,n,i,o){if(t===void 0)return e;if(!Number.isInteger(t)||t<n||t>i)throw new TypeError(`${o} must be an integer between ${n} and ${i}`);return t}function Ye(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Qe(t,e){return t instanceof Error&&t.code===e}async function ui(t){try{return(await(0,P.stat)(t)).isFile()}catch(e){if(Qe(e,"ENOENT"))return!1;throw et("Unable to inspect artifact repository backup",t,e)}}function xe(t){return t instanceof Error?t:new Error(String(t))}function et(t,e,n,i=!1){return new u(i?"ARTIFACT_PERSISTENCE_CORRUPT":"ARTIFACT_PERSISTENCE_IO",`${t}: ${xe(n).message}`,{snapshotPath:e},{cause:xe(n)})}function li(t){return new Promise(e=>setTimeout(e,t))}var it=require("node:buffer");var mi=16*1024*1024,hi=5e3,gi=1e5,vi=1e6,yi=/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@(?:\s?(.*))?$/,T=class extends Error{constructor(n,i){super(i===void 0?n:`${n} at diff line ${i}`);this.line=i;this.name="XenoDiffParseError"}line;code="XENO_DIFF_INVALID"};function rt(t,e={}){if(typeof t!="string")throw new TypeError("Unified diff must be a string");let n=Te(e.maxBytes,mi,1024,256*1024*1024,"maxBytes"),i=Te(e.maxFiles,hi,1,1e5,"maxFiles"),o=Te(e.maxHunks,gi,1,1e6,"maxHunks"),r=Te(e.maxLines,vi,1,5e6,"maxLines");if(it.Buffer.byteLength(t,"utf8")>n)throw new T(`Unified diff exceeds ${n} bytes`);let s=t.replace(/\r\n/g,`
|
|
5
5
|
`).replace(/\r/g,`
|