@xenosystem/agent-sdk 0.10.29 → 0.10.31

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.
Files changed (65) hide show
  1. package/dist/artifacts/index.cjs +6 -6
  2. package/dist/artifacts/index.js +7 -7
  3. package/dist/artifacts/metafile-cjs.json +1 -1
  4. package/dist/artifacts/metafile-esm.json +1 -1
  5. package/dist/automation/index.cjs +1 -1
  6. package/dist/automation/index.d.cts +6 -2
  7. package/dist/automation/index.d.ts +6 -2
  8. package/dist/automation/index.js +1 -1
  9. package/dist/automation/metafile-cjs.json +1 -1
  10. package/dist/automation/metafile-esm.json +1 -1
  11. package/dist/control-plane/index.cjs +1 -1
  12. package/dist/control-plane/index.js +1 -1
  13. package/dist/coordination/index.cjs +2 -2
  14. package/dist/coordination/index.d.cts +9 -3
  15. package/dist/coordination/index.d.ts +9 -3
  16. package/dist/coordination/index.js +2 -2
  17. package/dist/coordination/metafile-cjs.json +1 -1
  18. package/dist/coordination/metafile-esm.json +1 -1
  19. package/dist/electron/index.cjs +199 -178
  20. package/dist/electron/index.d.cts +20 -2
  21. package/dist/electron/index.d.ts +20 -2
  22. package/dist/electron/index.js +199 -178
  23. package/dist/electron/metafile-cjs.json +1 -1
  24. package/dist/electron/metafile-esm.json +1 -1
  25. package/dist/hosted/index.cjs +1 -1
  26. package/dist/hosted/index.js +1 -1
  27. package/dist/hosted/metafile-cjs.json +1 -1
  28. package/dist/hosted/metafile-esm.json +1 -1
  29. package/dist/index.cjs +374 -353
  30. package/dist/index.d.cts +93 -13
  31. package/dist/index.d.ts +93 -13
  32. package/dist/index.js +375 -354
  33. package/dist/intelligence/index.cjs +5 -5
  34. package/dist/intelligence/index.js +6 -6
  35. package/dist/intelligence/metafile-cjs.json +1 -1
  36. package/dist/intelligence/metafile-esm.json +1 -1
  37. package/dist/mcp/index.d.cts +6 -2
  38. package/dist/mcp/index.d.ts +6 -2
  39. package/dist/metafile-cjs.json +1 -1
  40. package/dist/metafile-esm.json +1 -1
  41. package/dist/providers/metafile-cjs.json +1 -1
  42. package/dist/providers/metafile-esm.json +1 -1
  43. package/dist/recipes/metafile-cjs.json +1 -1
  44. package/dist/recipes/metafile-esm.json +1 -1
  45. package/dist/research/metafile-cjs.json +1 -1
  46. package/dist/research/metafile-esm.json +1 -1
  47. package/dist/session/index.cjs +22 -22
  48. package/dist/session/index.d.cts +15 -0
  49. package/dist/session/index.d.ts +15 -0
  50. package/dist/session/index.js +22 -22
  51. package/dist/session/metafile-cjs.json +1 -1
  52. package/dist/session/metafile-esm.json +1 -1
  53. package/dist/sharing/index.cjs +2 -2
  54. package/dist/sharing/index.js +3 -3
  55. package/dist/sharing/metafile-cjs.json +1 -1
  56. package/dist/sharing/metafile-esm.json +1 -1
  57. package/dist/skills/index.d.cts +5 -1
  58. package/dist/skills/index.d.ts +5 -1
  59. package/dist/utils/index.cjs +19 -18
  60. package/dist/utils/index.d.cts +5 -2
  61. package/dist/utils/index.d.ts +5 -2
  62. package/dist/utils/index.js +19 -18
  63. package/dist/utils/metafile-cjs.json +1 -1
  64. package/dist/utils/metafile-esm.json +1 -1
  65. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
1
  "use strict";var oe=Object.create;var I=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var ce=Object.getPrototypeOf,de=Object.prototype.hasOwnProperty;var ue=(e,t)=>{for(var r in t)I(e,r,{get:t[r],enumerable:!0})},$=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of ae(t))!de.call(e,i)&&i!==r&&I(e,i,{get:()=>t[i],enumerable:!(n=se(t,i))||n.enumerable});return e};var le=(e,t,r)=>(r=e!=null?oe(ce(e)):{},$(t||!e||!e.__esModule?I(r,"default",{value:e,enumerable:!0}):r,e)),fe=e=>$(I({},"__esModule",{value:!0}),e);var Ue={};ue(Ue,{FileXenoShareRegistry:()=>V,XENO_HANDOFF_SCHEMA_VERSION:()=>v,XENO_SHARE_REGISTRY_SCHEMA_VERSION:()=>x,XENO_SHARE_SCHEMA_VERSION:()=>A,createXenoSecureShare:()=>ke,createXenoSessionHandoff:()=>ve,createXenoShareSigningIdentity:()=>Re,publicKeyFingerprint:()=>_,redactXenoShareValue:()=>T,signSharePayload:()=>J,verifyXenoSecureShare:()=>Ae,verifyXenoSessionHandoff:()=>Pe});module.exports=fe(Ue);var A=2,v=1,x=1;var ge=/(?:^|[_-])(api[_-]?key|access[_-]?token|refresh[_-]?token|id[_-]?token|auth(?:orization)?|bearer|secret|password|passwd|credential|cookie|private[_-]?key|client[_-]?secret)(?:$|[_-])/i,pe=/\b([A-Z][A-Z0-9_]*(?:TOKEN|SECRET|PASSWORD|PASSWD|API_KEY|PRIVATE_KEY|CLIENT_SECRET)[A-Z0-9_]*)\s*=\s*([^\s"']+)/g,he=/\b(Bearer\s+)[A-Za-z0-9._~+/=-]{8,}/gi,me=/\b(?:sk-[A-Za-z0-9_-]{16,}|gh[pousr]_[A-Za-z0-9_]{20,}|github_pat_[A-Za-z0-9_]{20,}|xox[baprs]-[A-Za-z0-9-]{16,}|AKIA[0-9A-Z]{16})\b/g,ye=/-----BEGIN (?:RSA |EC |OPENSSH |)PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH |)PRIVATE KEY-----/g,Se=/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/gi,we=/([?&#](?:access_token|refresh_token|token|key|secret|password|api[_-]?key|signature)=)[^&#\s]+/gi;function T(e,t={}){let r={options:{...t,redactEmails:t.redactEmails??!0,maxDepth:t.maxDepth??48,maxStringLength:t.maxStringLength??2e5,maxEvents:t.maxEvents??256},seen:new Set,events:[],byCategory:{},total:0};return{value:P(e,"$","",0,r),report:{schemaVersion:1,total:r.total,byCategory:r.byCategory,events:r.events,eventsTruncated:r.total>r.events.length}}}function h(e,t,r){e.total+=1,e.byCategory[r]=(e.byCategory[r]??0)+1,e.events.length<e.options.maxEvents&&e.events.push({path:t,category:r})}function P(e,t,r,n,i){if(ge.test(r))return e!=null&&e!==""&&h(i,t,"secret-field"),e==null||e===""?null:"[redacted]";if(n>i.options.maxDepth)return h(i,t,"truncated"),"[redacted:depth-limit]";if(e===null||typeof e=="boolean")return e;if(typeof e=="number")return Number.isFinite(e)?e:String(e);if(typeof e=="bigint")return e.toString();if(typeof e=="string")return Ie(e,t,i);if(e instanceof Date)return e.toISOString();if(e instanceof Uint8Array)return h(i,t,"binary"),`[redacted:binary:${e.byteLength}-bytes]`;if(Array.isArray(e)){if(i.seen.has(e))return h(i,t,"cycle"),"[redacted:cycle]";i.seen.add(e);let o=e.map((s,a)=>P(s,`${t}[${a}]`,"",n+1,i));return i.seen.delete(e),o}if(e&&typeof e=="object"){if(i.seen.has(e))return h(i,t,"cycle"),"[redacted:cycle]";i.seen.add(e);let o={};for(let[s,a]of Object.entries(e))o[s]=P(a,`${t}.${Ee(s)}`,s,n+1,i);return i.seen.delete(e),o}return null}function Ie(e,t,r){let n=e;return n=p(n,ye,"[redacted:private-key]",t,"private-key",r),n=p(n,he,"$1[redacted]",t,"authorization",r),n=p(n,me,"[redacted:credential]",t,"credential-pattern",r),n=p(n,pe,"$1=[redacted]",t,"environment-secret",r),n=p(n,we,"$1[redacted]",t,"url-secret",r),r.options.redactEmails&&(n=p(n,Se,"[redacted:email]",t,"email",r)),n=F(n,r.options.workspaceRoot,"<workspace>",t,"workspace-path",r),n=F(n,r.options.homeDirectory,"<home>",t,"home-path",r),n.length>r.options.maxStringLength&&(h(r,t,"truncated"),n=`${n.slice(0,r.options.maxStringLength)}
2
- [truncated]`),n}function p(e,t,r,n,i,o){t.lastIndex=0;let s=0,a=e.replace(t,(...d)=>(s+=1,r.includes("$1")?r.replace("$1",String(d[1]??"")):r));for(let d=0;d<s;d+=1)h(o,n,i);return t.lastIndex=0,a}function F(e,t,r,n,i,o){let s=t?.trim().replace(/[\\/]+$/,"");if(!s)return e;let a=new RegExp(xe(s).replace(/[\\/]+/g,"[\\\\/]"),process.platform==="win32"?"gi":"g");return p(e,a,r,n,i,o)}function xe(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ee(e){return e.replace(/[^A-Za-z0-9_-]/g,"_")}var c=require("node:crypto");function S(e){return JSON.stringify(C(e,new Set))}function C(e,t){if(e===null||typeof e!="object"){if(typeof e=="number"&&!Number.isFinite(e))throw new TypeError("Artifact JSON cannot contain non-finite numbers");return e}if(t.has(e))throw new TypeError("Artifact JSON cannot contain cycles");if(t.add(e),Array.isArray(e)){let n=e.map(i=>C(i,t));return t.delete(e),n}let r={};for(let n of Object.keys(e).sort((i,o)=>i.localeCompare(o))){let i=e[n];if(i===void 0)throw new TypeError(`Artifact JSON property ${n} is undefined`);r[n]=C(i,t)}return t.delete(e),r}function w(e,t={}){for(let r of e){let n=r.codePointAt(0);if(n===127)return!0;if(!(n>31)&&!(n===9&&t.allowTab===!0)&&!((n===10||n===13)&&t.allowLineBreaks===!0))return!0}return!1}var Xe=10080*60*1e3,be=365*24*60*60*1e3;function Re(){let{publicKey:e,privateKey:t}=(0,c.generateKeyPairSync)("ed25519"),r=e.export({type:"spki",format:"pem"}).toString(),n=t.export({type:"pkcs8",format:"pem"}).toString();return{keyId:_(r),publicKeyPem:r,privateKeyPem:n}}function _(e){let t=(0,c.createPublicKey)(e).export({type:"spki",format:"der"});return`ed25519:${(0,c.createHash)("sha256").update(t).digest("hex").slice(0,32)}`}function ke(e){let t=e.now??new Date,r=t.toISOString(),n=M(t,e.expiresAt,e.ttlMs),i=(0,c.randomBytes)(32).toString("base64url"),o=T(e.content,e.redaction),s=e.visibility??"private";He(s,e.workspaceId,e.teamId,e.allowedPrincipalIds);let a={schemaVersion:2,kind:"xeno-secure-share",shareId:u(e.shareId??`share_${(0,c.randomUUID)()}`,"shareId"),createdAt:r,expiresAt:n,issuer:j(e.issuer),session:q({...e.session,name:e.session.name??e.name}),access:{mode:"read-only",visibility:s,...e.workspaceId?{workspaceId:u(e.workspaceId,"workspaceId")}:{},...e.teamId?{teamId:u(e.teamId,"teamId")}:{},...e.allowedPrincipalIds?.length?{allowedPrincipalIds:X(e.allowedPrincipalIds,"allowedPrincipalIds")}:{},capabilityToken:{algorithm:"sha256",hash:Z(i)}},content:o.value,references:z(e.references??[]),redaction:o.report};return{envelope:J(a,e.signingIdentity),capabilityToken:i,url:Oe(e.baseUrl,a.shareId,i)}}function J(e,t){if(t.keyId!==_(t.publicKeyPem))throw new Error("Signing identity keyId does not match public key");let r=B(e,t);return{payload:e,signature:r}}function Ae(e,t={}){let r=[],n=!1,i=!1;if(e?.payload?.kind!=="xeno-secure-share"||e.payload.schemaVersion!==2)r.push("Unsupported secure-share envelope");else{let L=U(t.trustedPublicKeys,e.signature.keyId),D=L??(t.allowEmbeddedPublicKey===!1?void 0:e.signature.publicKeySpki);if(i=!!L,!D)r.push("No trusted or embedded issuer public key is available");else try{n=K(e.payload,e.signature,D),n||r.push("Share signature is invalid")}catch(k){r.push(k instanceof Error?k.message:String(k))}}let o=(t.now??new Date).getTime(),s=Date.parse(e?.payload?.expiresAt??""),d=t.revokedShareIds?.has(e?.payload?.shareId??"")??!1?"revoked":Number.isFinite(s)&&s<=o?"expired":"active";d==="revoked"&&r.push("Share has been revoked"),d==="expired"&&r.push("Share has expired");let y=Te(e?.payload,t.capabilityToken);y||r.push("Capability token is missing or invalid");let R=Ce(e?.payload,t.principal);return R||r.push("Principal is outside the share audience"),{valid:n&&y&&R&&d==="active",integrityValid:n,issuerTrusted:i,capabilityValid:y,audienceAllowed:R,status:d,errors:r}}function ve(e){let t=e.now??new Date,r={schemaVersion:1,kind:"xeno-session-handoff",handoffId:u(e.handoffId??`handoff_${(0,c.randomUUID)()}`,"handoffId"),createdAt:t.toISOString(),expiresAt:M(t,e.expiresAt,e.ttlMs??1440*60*1e3),issuer:j(e.issuer),source:q(e.source),target:_e(e.target),resume:Ne(e.resume),authority:Ve(e.authority),references:z(e.references??[]),...e.shareId?{shareId:u(e.shareId,"shareId")}:{}};return{payload:r,signature:B(r,e.signingIdentity)}}function Pe(e,t={}){let r=[];if(e?.payload?.kind!=="xeno-session-handoff"||e.payload.schemaVersion!==1)return{valid:!1,integrityValid:!1,issuerTrusted:!1,expired:!1,errors:["Unsupported handoff envelope"]};let n=U(t.trustedPublicKeys,e.signature.keyId),i=n??(t.allowEmbeddedPublicKey===!1?void 0:e.signature.publicKeySpki),o=!!n,s=!1;if(!i)r.push("No trusted or embedded issuer public key is available");else try{s=K(e.payload,e.signature,i),s||r.push("Handoff signature is invalid")}catch(d){r.push(d instanceof Error?d.message:String(d))}let a=Date.parse(e.payload.expiresAt)<=(t.now??new Date).getTime();return a&&r.push("Handoff has expired"),{valid:s&&!a,integrityValid:s,issuerTrusted:o,expired:a,errors:r}}function B(e,t){let r=S(e),n=(0,c.sign)(null,Buffer.from(r),(0,c.createPrivateKey)(t.privateKeyPem)).toString("base64");return{algorithm:"ed25519",keyId:t.keyId,value:n,publicKeySpki:t.publicKeyPem}}function K(e,t,r){if(t.algorithm!=="ed25519")return!1;let n=Buffer.from(t.value,"base64");if(n.toString("base64")!==t.value)throw new Error("Signature is not canonical base64");return(0,c.verify)(null,Buffer.from(S(e)),(0,c.createPublicKey)(r),n)}function Te(e,t){if(!e||!t)return!1;let r=Buffer.from(e.access.capabilityToken.hash,"hex"),n=Buffer.from(Z(t),"hex");return r.length===n.length&&(0,c.timingSafeEqual)(r,n)}function Ce(e,t){if(!e)return!1;let r=e.access;return r.allowedPrincipalIds?.length&&(!t?.id||!r.allowedPrincipalIds.includes(t.id))?!1:r.visibility==="workspace"?!!(t?.workspaceId&&t.workspaceId===r.workspaceId):r.visibility==="team"?!!(r.teamId&&t?.teamIds?.includes(r.teamId)):r.visibility==="private"?!!(t?.id&&t.id===e.issuer.id):r.visibility==="link"}function Oe(e,t,r){let n=new URL(e??"xeno://share/");if(n.username||n.password)throw new Error("Share base URL cannot contain credentials");if(n.protocol!=="https:"&&n.protocol!=="xeno:")throw new Error("Share base URL must use https: or xeno:");return n.pathname=`${n.pathname.replace(/\/$/,"")}/${encodeURIComponent(t)}`,n.search="",n.hash=new URLSearchParams({access_token:r}).toString(),n.toString()}function M(e,t,r=Xe){let n=t?new Date(t):new Date(e.getTime()+r);if(!Number.isFinite(n.getTime()))throw new Error("expiresAt must be a valid timestamp");let i=n.getTime()-e.getTime();if(i<=0)throw new Error("expiresAt must be in the future");if(i>be)throw new Error("Share and handoff expiry cannot exceed 365 days");return n.toISOString()}function j(e){return{id:u(e.id,"issuer.id"),...e.displayName?.trim()?{displayName:e.displayName.trim().slice(0,160)}:{},...e.workspaceId?{workspaceId:u(e.workspaceId,"issuer.workspaceId")}:{},...e.teamId?{teamId:u(e.teamId,"issuer.teamId")}:{}}}function q(e){let t={name:E(e.name,"session.name",200),surface:e.surface};for(let r of["sessionId","runId","hostedRunId","conversationId","parentSessionId","forkedFromSessionId","forkedAtEventId"])e[r]&&(t[r]=u(e[r],`session.${r}`));if(!t.sessionId&&!t.runId&&!t.hostedRunId&&!t.conversationId)throw new Error("Session identity requires sessionId, runId, hostedRunId, or conversationId");return e.git&&(t.git={...e.git.repositoryId?{repositoryId:u(e.git.repositoryId,"git.repositoryId")}:{},...e.git.remoteUrl?{remoteUrl:O(e.git.remoteUrl,"git.remoteUrl")}:{},...e.git.branch?{branch:E(e.git.branch,"git.branch",300)}:{},...e.git.commit?{commit:Y(e.git.commit,"git.commit")}:{},...e.git.pullRequest?{pullRequest:{provider:e.git.pullRequest.provider,repository:E(e.git.pullRequest.repository,"git.pullRequest.repository",300),number:Le(e.git.pullRequest.number,"git.pullRequest.number"),...e.git.pullRequest.url?{url:O(e.git.pullRequest.url,"git.pullRequest.url")}:{}}}:{}}),t}function z(e){let t=new Set;return e.map(r=>{let n=`${r.kind}:${r.id}`;if(t.has(n))throw new Error(`Duplicate share reference: ${n}`);return t.add(n),{kind:r.kind,id:u(r.id,"reference.id"),...r.title?.trim()?{title:r.title.trim().slice(0,300)}:{},...r.uri?{uri:O(r.uri,"reference.uri")}:{},...r.hash?{hash:Y(r.hash,"reference.hash")}:{}}})}function _e(e){return{surface:e.surface,...e.workspaceId?{workspaceId:u(e.workspaceId,"target.workspaceId")}:{},...e.teamId?{teamId:u(e.teamId,"target.teamId")}:{},...e.environmentId?{environmentId:u(e.environmentId,"target.environmentId")}:{},...e.repositoryId?{repositoryId:u(e.repositoryId,"target.repositoryId")}:{}}}function Ne(e){let t={};for(let r of["sessionId","runId","hostedRunId","checkpointId","transcriptEventId"])e[r]&&(t[r]=u(e[r],`resume.${r}`));if(e.artifactIds?.length&&(t.artifactIds=X(e.artifactIds,"resume.artifactIds")),e.taskIds?.length&&(t.taskIds=X(e.taskIds,"resume.taskIds")),!Object.keys(t).length)throw new Error("Handoff resume point cannot be empty");return t}function Ve(e){return{filesystem:e.filesystem,network:e.network,externalActions:e.externalActions,secretRefs:X(e.secretRefs,"authority.secretRefs")}}function He(e,t,r,n){if(e==="workspace"&&!t)throw new Error("workspace visibility requires workspaceId");if(e==="team"&&!r)throw new Error("team visibility requires teamId");if(e==="private"&&n?.length)throw new Error("private shares cannot add allowed principals; use link/workspace/team visibility")}function U(e,t){if(!e)return;let r=e;return typeof r.get=="function"?r.get(t):e[t]}function Z(e){return(0,c.createHash)("sha256").update(e).digest("hex")}function X(e,t){return[...new Set(e.map(r=>u(r,t)))].sort()}function u(e,t){let r=e.trim();if(!r||r.length>500||w(r))throw new Error(`${t} is invalid`);return r}function Y(e,t){let r=e.trim();if(!/^[A-Za-z0-9:+._-]{7,256}$/.test(r))throw new Error(`${t} is invalid`);return r}function E(e,t,r){let n=e.trim();if(!n||n.length>r||w(n,{allowTab:!0,allowLineBreaks:!0}))throw new Error(`${t} is invalid`);return n}function Le(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new Error(`${t} must be a positive integer`);return e}function O(e,t){let r=E(e,t,2e3),n=new URL(r);if(n.username||n.password)throw new Error(`${t} cannot contain credentials`);if(!["https:","xeno:","artifact:","urn:"].includes(n.protocol))throw new Error(`${t} uses an unsupported scheme`);return n.toString()}var H=require("node:crypto"),l=require("node:fs/promises"),m=require("node:path");var f=le(require("node:fs/promises"),1);var De=new Set(["EACCES","EBUSY","EPERM"]),$e=[10,20,40,80,160,320,640];async function W(e,t){for(let r=0;;r+=1)try{await f.rename(e,t);return}catch(n){let i=n.code,o=$e[r];if(process.platform!=="win32"||!i||!De.has(i)||o===void 0)throw n;await new Promise(s=>setTimeout(s,o))}}var g=require("node:fs"),N=require("node:os"),Q=require("node:path");function Fe(){return new Date().toISOString()}function Je(){return new Date(Date.now()-Math.floor(process.uptime()*1e3)).toISOString()}function ee(e){try{return JSON.parse((0,g.readFileSync)(e,"utf8"))}catch{return null}}function Be(e){if(!e||e<=0)return!1;try{return process.kill(e,0),!0}catch{return!1}}function Ke(e){return e.hostname!==(0,N.hostname)()?!0:Be(e.pid)}function G(e,t){(0,g.mkdirSync)((0,Q.dirname)(e),{recursive:!0}),(0,g.writeFileSync)(e,JSON.stringify(t,null,2)+`
2
+ [truncated]`),n}function p(e,t,r,n,i,o){t.lastIndex=0;let s=0,a=e.replace(t,(...d)=>(s+=1,r.includes("$1")?r.replace("$1",String(d[1]??"")):r));for(let d=0;d<s;d+=1)h(o,n,i);return t.lastIndex=0,a}function F(e,t,r,n,i,o){let s=t?.trim().replace(/[\\/]+$/,"");if(!s)return e;let a=new RegExp(xe(s).replace(/[\\/]+/g,"[\\\\/]"),process.platform==="win32"?"gi":"g");return p(e,a,r,n,i,o)}function xe(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ee(e){return e.replace(/[^A-Za-z0-9_-]/g,"_")}var c=require("node:crypto");function S(e){return JSON.stringify(C(e,new Set))}function C(e,t){if(e===null||typeof e!="object"){if(typeof e=="number"&&!Number.isFinite(e))throw new TypeError("Artifact JSON cannot contain non-finite numbers");return e}if(t.has(e))throw new TypeError("Artifact JSON cannot contain cycles");if(t.add(e),Array.isArray(e)){let n=e.map(i=>C(i,t));return t.delete(e),n}let r={};for(let n of Object.keys(e).sort((i,o)=>i.localeCompare(o))){let i=e[n];if(i===void 0)throw new TypeError(`Artifact JSON property ${n} is undefined`);r[n]=C(i,t)}return t.delete(e),r}function w(e,t={}){for(let r of e){let n=r.codePointAt(0);if(n===127)return!0;if(!(n>31)&&!(n===9&&t.allowTab===!0)&&!((n===10||n===13)&&t.allowLineBreaks===!0))return!0}return!1}var Xe=10080*60*1e3,be=365*24*60*60*1e3;function Re(){let{publicKey:e,privateKey:t}=(0,c.generateKeyPairSync)("ed25519"),r=e.export({type:"spki",format:"pem"}).toString(),n=t.export({type:"pkcs8",format:"pem"}).toString();return{keyId:_(r),publicKeyPem:r,privateKeyPem:n}}function _(e){let t=(0,c.createPublicKey)(e).export({type:"spki",format:"der"});return`ed25519:${(0,c.createHash)("sha256").update(t).digest("hex").slice(0,32)}`}function ke(e){let t=e.now??new Date,r=t.toISOString(),n=M(t,e.expiresAt,e.ttlMs),i=(0,c.randomBytes)(32).toString("base64url"),o=T(e.content,e.redaction),s=e.visibility??"private";Le(s,e.workspaceId,e.teamId,e.allowedPrincipalIds);let a={schemaVersion:2,kind:"xeno-secure-share",shareId:u(e.shareId??`share_${(0,c.randomUUID)()}`,"shareId"),createdAt:r,expiresAt:n,issuer:j(e.issuer),session:q({...e.session,name:e.session.name??e.name}),access:{mode:"read-only",visibility:s,...e.workspaceId?{workspaceId:u(e.workspaceId,"workspaceId")}:{},...e.teamId?{teamId:u(e.teamId,"teamId")}:{},...e.allowedPrincipalIds?.length?{allowedPrincipalIds:X(e.allowedPrincipalIds,"allowedPrincipalIds")}:{},capabilityToken:{algorithm:"sha256",hash:Z(i)}},content:o.value,references:z(e.references??[]),redaction:o.report};return{envelope:J(a,e.signingIdentity),capabilityToken:i,url:Oe(e.baseUrl,a.shareId,i)}}function J(e,t){if(t.keyId!==_(t.publicKeyPem))throw new Error("Signing identity keyId does not match public key");let r=B(e,t);return{payload:e,signature:r}}function Ae(e,t={}){let r=[],n=!1,i=!1;if(e?.payload?.kind!=="xeno-secure-share"||e.payload.schemaVersion!==2)r.push("Unsupported secure-share envelope");else{let H=U(t.trustedPublicKeys,e.signature.keyId),D=H??(t.allowEmbeddedPublicKey===!1?void 0:e.signature.publicKeySpki);if(i=!!H,!D)r.push("No trusted or embedded issuer public key is available");else try{n=K(e.payload,e.signature,D),n||r.push("Share signature is invalid")}catch(k){r.push(k instanceof Error?k.message:String(k))}}let o=(t.now??new Date).getTime(),s=Date.parse(e?.payload?.expiresAt??""),d=t.revokedShareIds?.has(e?.payload?.shareId??"")??!1?"revoked":Number.isFinite(s)&&s<=o?"expired":"active";d==="revoked"&&r.push("Share has been revoked"),d==="expired"&&r.push("Share has expired");let y=Te(e?.payload,t.capabilityToken);y||r.push("Capability token is missing or invalid");let R=Ce(e?.payload,t.principal);return R||r.push("Principal is outside the share audience"),{valid:n&&y&&R&&d==="active",integrityValid:n,issuerTrusted:i,capabilityValid:y,audienceAllowed:R,status:d,errors:r}}function ve(e){let t=e.now??new Date,r={schemaVersion:1,kind:"xeno-session-handoff",handoffId:u(e.handoffId??`handoff_${(0,c.randomUUID)()}`,"handoffId"),createdAt:t.toISOString(),expiresAt:M(t,e.expiresAt,e.ttlMs??1440*60*1e3),issuer:j(e.issuer),source:q(e.source),target:_e(e.target),resume:Ne(e.resume),authority:Ve(e.authority),references:z(e.references??[]),...e.shareId?{shareId:u(e.shareId,"shareId")}:{}};return{payload:r,signature:B(r,e.signingIdentity)}}function Pe(e,t={}){let r=[];if(e?.payload?.kind!=="xeno-session-handoff"||e.payload.schemaVersion!==1)return{valid:!1,integrityValid:!1,issuerTrusted:!1,expired:!1,errors:["Unsupported handoff envelope"]};let n=U(t.trustedPublicKeys,e.signature.keyId),i=n??(t.allowEmbeddedPublicKey===!1?void 0:e.signature.publicKeySpki),o=!!n,s=!1;if(!i)r.push("No trusted or embedded issuer public key is available");else try{s=K(e.payload,e.signature,i),s||r.push("Handoff signature is invalid")}catch(d){r.push(d instanceof Error?d.message:String(d))}let a=Date.parse(e.payload.expiresAt)<=(t.now??new Date).getTime();return a&&r.push("Handoff has expired"),{valid:s&&!a,integrityValid:s,issuerTrusted:o,expired:a,errors:r}}function B(e,t){let r=S(e),n=(0,c.sign)(null,Buffer.from(r),(0,c.createPrivateKey)(t.privateKeyPem)).toString("base64");return{algorithm:"ed25519",keyId:t.keyId,value:n,publicKeySpki:t.publicKeyPem}}function K(e,t,r){if(t.algorithm!=="ed25519")return!1;let n=Buffer.from(t.value,"base64");if(n.toString("base64")!==t.value)throw new Error("Signature is not canonical base64");return(0,c.verify)(null,Buffer.from(S(e)),(0,c.createPublicKey)(r),n)}function Te(e,t){if(!e||!t)return!1;let r=Buffer.from(e.access.capabilityToken.hash,"hex"),n=Buffer.from(Z(t),"hex");return r.length===n.length&&(0,c.timingSafeEqual)(r,n)}function Ce(e,t){if(!e)return!1;let r=e.access;return r.allowedPrincipalIds?.length&&(!t?.id||!r.allowedPrincipalIds.includes(t.id))?!1:r.visibility==="workspace"?!!(t?.workspaceId&&t.workspaceId===r.workspaceId):r.visibility==="team"?!!(r.teamId&&t?.teamIds?.includes(r.teamId)):r.visibility==="private"?!!(t?.id&&t.id===e.issuer.id):r.visibility==="link"}function Oe(e,t,r){let n=new URL(e??"xeno://share/");if(n.username||n.password)throw new Error("Share base URL cannot contain credentials");if(n.protocol!=="https:"&&n.protocol!=="xeno:")throw new Error("Share base URL must use https: or xeno:");return n.pathname=`${n.pathname.replace(/\/$/,"")}/${encodeURIComponent(t)}`,n.search="",n.hash=new URLSearchParams({access_token:r}).toString(),n.toString()}function M(e,t,r=Xe){let n=t?new Date(t):new Date(e.getTime()+r);if(!Number.isFinite(n.getTime()))throw new Error("expiresAt must be a valid timestamp");let i=n.getTime()-e.getTime();if(i<=0)throw new Error("expiresAt must be in the future");if(i>be)throw new Error("Share and handoff expiry cannot exceed 365 days");return n.toISOString()}function j(e){return{id:u(e.id,"issuer.id"),...e.displayName?.trim()?{displayName:e.displayName.trim().slice(0,160)}:{},...e.workspaceId?{workspaceId:u(e.workspaceId,"issuer.workspaceId")}:{},...e.teamId?{teamId:u(e.teamId,"issuer.teamId")}:{}}}function q(e){let t={name:E(e.name,"session.name",200),surface:e.surface};for(let r of["sessionId","runId","hostedRunId","conversationId","parentSessionId","forkedFromSessionId","forkedAtEventId"])e[r]&&(t[r]=u(e[r],`session.${r}`));if(!t.sessionId&&!t.runId&&!t.hostedRunId&&!t.conversationId)throw new Error("Session identity requires sessionId, runId, hostedRunId, or conversationId");return e.git&&(t.git={...e.git.repositoryId?{repositoryId:u(e.git.repositoryId,"git.repositoryId")}:{},...e.git.remoteUrl?{remoteUrl:O(e.git.remoteUrl,"git.remoteUrl")}:{},...e.git.branch?{branch:E(e.git.branch,"git.branch",300)}:{},...e.git.commit?{commit:W(e.git.commit,"git.commit")}:{},...e.git.pullRequest?{pullRequest:{provider:e.git.pullRequest.provider,repository:E(e.git.pullRequest.repository,"git.pullRequest.repository",300),number:He(e.git.pullRequest.number,"git.pullRequest.number"),...e.git.pullRequest.url?{url:O(e.git.pullRequest.url,"git.pullRequest.url")}:{}}}:{}}),t}function z(e){let t=new Set;return e.map(r=>{let n=`${r.kind}:${r.id}`;if(t.has(n))throw new Error(`Duplicate share reference: ${n}`);return t.add(n),{kind:r.kind,id:u(r.id,"reference.id"),...r.title?.trim()?{title:r.title.trim().slice(0,300)}:{},...r.uri?{uri:O(r.uri,"reference.uri")}:{},...r.hash?{hash:W(r.hash,"reference.hash")}:{}}})}function _e(e){return{surface:e.surface,...e.workspaceId?{workspaceId:u(e.workspaceId,"target.workspaceId")}:{},...e.teamId?{teamId:u(e.teamId,"target.teamId")}:{},...e.environmentId?{environmentId:u(e.environmentId,"target.environmentId")}:{},...e.repositoryId?{repositoryId:u(e.repositoryId,"target.repositoryId")}:{}}}function Ne(e){let t={};for(let r of["sessionId","runId","hostedRunId","checkpointId","transcriptEventId"])e[r]&&(t[r]=u(e[r],`resume.${r}`));if(e.artifactIds?.length&&(t.artifactIds=X(e.artifactIds,"resume.artifactIds")),e.taskIds?.length&&(t.taskIds=X(e.taskIds,"resume.taskIds")),!Object.keys(t).length)throw new Error("Handoff resume point cannot be empty");return t}function Ve(e){return{filesystem:e.filesystem,network:e.network,externalActions:e.externalActions,secretRefs:X(e.secretRefs,"authority.secretRefs")}}function Le(e,t,r,n){if(e==="workspace"&&!t)throw new Error("workspace visibility requires workspaceId");if(e==="team"&&!r)throw new Error("team visibility requires teamId");if(e==="private"&&n?.length)throw new Error("private shares cannot add allowed principals; use link/workspace/team visibility")}function U(e,t){if(!e)return;let r=e;return typeof r.get=="function"?r.get(t):e[t]}function Z(e){return(0,c.createHash)("sha256").update(e).digest("hex")}function X(e,t){return[...new Set(e.map(r=>u(r,t)))].sort()}function u(e,t){let r=e.trim();if(!r||r.length>500||w(r))throw new Error(`${t} is invalid`);return r}function W(e,t){let r=e.trim();if(!/^[A-Za-z0-9:+._-]{7,256}$/.test(r))throw new Error(`${t} is invalid`);return r}function E(e,t,r){let n=e.trim();if(!n||n.length>r||w(n,{allowTab:!0,allowLineBreaks:!0}))throw new Error(`${t} is invalid`);return n}function He(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new Error(`${t} must be a positive integer`);return e}function O(e,t){let r=E(e,t,2e3),n=new URL(r);if(n.username||n.password)throw new Error(`${t} cannot contain credentials`);if(!["https:","xeno:","artifact:","urn:"].includes(n.protocol))throw new Error(`${t} uses an unsupported scheme`);return n.toString()}var L=require("node:crypto"),l=require("node:fs/promises"),m=require("node:path");var f=le(require("node:fs/promises"),1);var De=new Set(["EACCES","EBUSY","EPERM"]),$e=[10,20,40,80,160,320,640];async function Y(e,t){for(let r=0;;r+=1)try{await f.rename(e,t);return}catch(n){let i=n.code,o=$e[r];if(process.platform!=="win32"||!i||!De.has(i)||o===void 0)throw n;await new Promise(s=>setTimeout(s,o))}}var g=require("node:fs"),N=require("node:os"),Q=require("node:path");function Fe(){return new Date().toISOString()}function Je(){return new Date(Date.now()-Math.floor(process.uptime()*1e3)).toISOString()}function ee(e){try{return JSON.parse((0,g.readFileSync)(e,"utf8"))}catch{return null}}function Be(e){if(!e||e<=0)return!1;try{return process.kill(e,0),!0}catch{return!1}}function Ke(e){return e.hostname!==(0,N.hostname)()?!0:Be(e.pid)}function G(e,t){(0,g.mkdirSync)((0,Q.dirname)(e),{recursive:!0}),(0,g.writeFileSync)(e,JSON.stringify(t,null,2)+`
3
3
  `,{encoding:"utf8",flag:"wx"})}function Me(e,t){let r=ee(e);r?.pid!==t.pid||r.hostname!==t.hostname||(0,g.rmSync)(e,{force:!0})}function te(e,t,r){let n=Fe(),i={schemaVersion:1,name:t,pid:process.pid,hostname:(0,N.hostname)(),processStartedAt:Je(),version:r,acquiredAt:n,updatedAt:n};try{G(e,i)}catch(o){if(o.code!=="EEXIST")throw o;let a=ee(e);if(a&&Ke(a))throw new Error(`${t} is already locked by PID ${a.pid} on ${a.hostname}.`);(0,g.rmSync)(e,{force:!0}),G(e,i)}return{record:i,release:()=>{Me(e,i)}}}var V=class{directory;snapshotPath;lockPath;now;constructor(t){this.directory=(0,m.resolve)(t.directory),this.snapshotPath=(0,m.join)(this.directory,"registry.json"),this.lockPath=(0,m.join)(this.directory,"registry.lock"),this.now=t.now??(()=>new Date)}async register(t,r="created"){return this.mutate(n=>{let i=n.records.find(s=>s.shareId===t.payload.shareId);if(i){if(b(i.envelope)!==b(t))throw new Error(`Share ${t.payload.shareId} already exists with different content`);return{snapshot:n,result:i}}let o={shareId:t.payload.shareId,envelope:t,status:Date.parse(t.payload.expiresAt)<=this.now().getTime()?"expired":"active",registeredAt:this.now().toISOString(),origin:r};return{snapshot:re(n,[...n.records,o],this.now()),result:o}})}async revoke(t,r,n){return this.mutate(i=>{let o=i.records.findIndex(y=>y.shareId===t);if(o<0)throw new Error(`Share not found: ${t}`);let s=i.records[o];if(s.status==="revoked")return{snapshot:i,result:s};let a={...s,status:"revoked",revokedAt:this.now().toISOString(),revokedBy:ne(r,"actor"),revocationReason:ne(n,"reason")},d=[...i.records];return d[o]=a,{snapshot:re(i,d,this.now()),result:a}})}async get(t){return(await this.load()).records.find(r=>r.shareId===t)??null}async list(){let t=this.now().getTime();return(await this.load()).records.map(r=>r.status==="active"&&Date.parse(r.envelope.payload.expiresAt)<=t?{...r,status:"expired"}:r).sort((r,n)=>n.registeredAt.localeCompare(r.registeredAt))}async revokedIds(){return new Set((await this.list()).filter(t=>t.status==="revoked").map(t=>t.shareId))}async load(){try{let t=await(0,l.readFile)(this.snapshotPath,"utf8"),r=JSON.parse(t);return qe(r),r}catch(t){if(t.code==="ENOENT")return je(this.now());throw t}}async mutate(t){await(0,l.mkdir)(this.directory,{recursive:!0,mode:448});let r=te(this.lockPath,"xeno secure-share registry","1");try{let n=await this.load(),{snapshot:i,result:o}=t(n);return i!==n&&await ze(this.snapshotPath,`${JSON.stringify(i,null,2)}
4
- `),o}finally{r.release()}}};function je(e){return ie({schemaVersion:1,generation:0,updatedAt:e.toISOString(),records:[]})}function re(e,t,r){return ie({schemaVersion:1,generation:e.generation+1,updatedAt:r.toISOString(),records:[...t].sort((n,i)=>n.shareId.localeCompare(i.shareId))})}function ie(e){return{...e,checksum:{algorithm:"sha256",value:(0,H.createHash)("sha256").update(b(e)).digest("hex")}}}function qe(e){if(e.schemaVersion!==1||!Array.isArray(e.records))throw new Error("Invalid secure-share registry snapshot");let{checksum:t,...r}=e,n=(0,H.createHash)("sha256").update(b(r)).digest("hex");if(t?.algorithm!=="sha256"||t.value!==n)throw new Error("Secure-share registry checksum mismatch");let i=new Set;for(let o of e.records){if(o.shareId!==o.envelope?.payload?.shareId)throw new Error("Secure-share registry identity mismatch");if(i.has(o.shareId))throw new Error(`Duplicate secure-share registry record: ${o.shareId}`);i.add(o.shareId)}}async function ze(e,t){await(0,l.mkdir)((0,m.dirname)(e),{recursive:!0,mode:448});let r=`${e}.${process.pid}.${Date.now()}.tmp`,n;try{n=await(0,l.open)(r,"wx",384),await n.writeFile(t,"utf8"),await n.sync(),await n.close(),n=void 0,await W(r,e),await(0,l.chmod)(e,384).catch(()=>{})}finally{n&&await n.close().catch(()=>{}),await(0,l.unlink)(r).catch(()=>{})}}function b(e){return S(e)}function ne(e,t){let r=e.trim();if(!r||r.length>500||w(r))throw new Error(`${t} is invalid`);return r}0&&(module.exports={FileXenoShareRegistry,XENO_HANDOFF_SCHEMA_VERSION,XENO_SHARE_REGISTRY_SCHEMA_VERSION,XENO_SHARE_SCHEMA_VERSION,createXenoSecureShare,createXenoSessionHandoff,createXenoShareSigningIdentity,publicKeyFingerprint,redactXenoShareValue,signSharePayload,verifyXenoSecureShare,verifyXenoSessionHandoff});
4
+ `),o}finally{r.release()}}};function je(e){return ie({schemaVersion:1,generation:0,updatedAt:e.toISOString(),records:[]})}function re(e,t,r){return ie({schemaVersion:1,generation:e.generation+1,updatedAt:r.toISOString(),records:[...t].sort((n,i)=>n.shareId.localeCompare(i.shareId))})}function ie(e){return{...e,checksum:{algorithm:"sha256",value:(0,L.createHash)("sha256").update(b(e)).digest("hex")}}}function qe(e){if(e.schemaVersion!==1||!Array.isArray(e.records))throw new Error("Invalid secure-share registry snapshot");let{checksum:t,...r}=e,n=(0,L.createHash)("sha256").update(b(r)).digest("hex");if(t?.algorithm!=="sha256"||t.value!==n)throw new Error("Secure-share registry checksum mismatch");let i=new Set;for(let o of e.records){if(o.shareId!==o.envelope?.payload?.shareId)throw new Error("Secure-share registry identity mismatch");if(i.has(o.shareId))throw new Error(`Duplicate secure-share registry record: ${o.shareId}`);i.add(o.shareId)}}async function ze(e,t){await(0,l.mkdir)((0,m.dirname)(e),{recursive:!0,mode:448});let r=`${e}.${process.pid}.${Date.now()}.tmp`,n;try{n=await(0,l.open)(r,"wx",384),await n.writeFile(t,"utf8"),await n.sync(),await n.close(),n=void 0,await Y(r,e),await(0,l.chmod)(e,384).catch(()=>{})}finally{n&&await n.close().catch(()=>{}),await(0,l.unlink)(r).catch(()=>{})}}function b(e){return S(e)}function ne(e,t){let r=e.trim();if(!r||r.length>500||w(r))throw new Error(`${t} is invalid`);return r}0&&(module.exports={FileXenoShareRegistry,XENO_HANDOFF_SCHEMA_VERSION,XENO_SHARE_REGISTRY_SCHEMA_VERSION,XENO_SHARE_SCHEMA_VERSION,createXenoSecureShare,createXenoSessionHandoff,createXenoShareSigningIdentity,publicKeyFingerprint,redactXenoShareValue,signSharePayload,verifyXenoSecureShare,verifyXenoSessionHandoff});
@@ -1,4 +1,4 @@
1
1
  var E=2,X=1,m=1;var ne=/(?:^|[_-])(api[_-]?key|access[_-]?token|refresh[_-]?token|id[_-]?token|auth(?:orization)?|bearer|secret|password|passwd|credential|cookie|private[_-]?key|client[_-]?secret)(?:$|[_-])/i,ie=/\b([A-Z][A-Z0-9_]*(?:TOKEN|SECRET|PASSWORD|PASSWD|API_KEY|PRIVATE_KEY|CLIENT_SECRET)[A-Z0-9_]*)\s*=\s*([^\s"']+)/g,oe=/\b(Bearer\s+)[A-Za-z0-9._~+/=-]{8,}/gi,se=/\b(?:sk-[A-Za-z0-9_-]{16,}|gh[pousr]_[A-Za-z0-9_]{20,}|github_pat_[A-Za-z0-9_]{20,}|xox[baprs]-[A-Za-z0-9-]{16,}|AKIA[0-9A-Z]{16})\b/g,ae=/-----BEGIN (?:RSA |EC |OPENSSH |)PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH |)PRIVATE KEY-----/g,ce=/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/gi,de=/([?&#](?:access_token|refresh_token|token|key|secret|password|api[_-]?key|signature)=)[^&#\s]+/gi;function T(e,t={}){let r={options:{...t,redactEmails:t.redactEmails??!0,maxDepth:t.maxDepth??48,maxStringLength:t.maxStringLength??2e5,maxEvents:t.maxEvents??256},seen:new Set,events:[],byCategory:{},total:0};return{value:b(e,"$","",0,r),report:{schemaVersion:1,total:r.total,byCategory:r.byCategory,events:r.events,eventsTruncated:r.total>r.events.length}}}function f(e,t,r){e.total+=1,e.byCategory[r]=(e.byCategory[r]??0)+1,e.events.length<e.options.maxEvents&&e.events.push({path:t,category:r})}function b(e,t,r,n,i){if(ne.test(r))return e!=null&&e!==""&&f(i,t,"secret-field"),e==null||e===""?null:"[redacted]";if(n>i.options.maxDepth)return f(i,t,"truncated"),"[redacted:depth-limit]";if(e===null||typeof e=="boolean")return e;if(typeof e=="number")return Number.isFinite(e)?e:String(e);if(typeof e=="bigint")return e.toString();if(typeof e=="string")return ue(e,t,i);if(e instanceof Date)return e.toISOString();if(e instanceof Uint8Array)return f(i,t,"binary"),`[redacted:binary:${e.byteLength}-bytes]`;if(Array.isArray(e)){if(i.seen.has(e))return f(i,t,"cycle"),"[redacted:cycle]";i.seen.add(e);let o=e.map((s,a)=>b(s,`${t}[${a}]`,"",n+1,i));return i.seen.delete(e),o}if(e&&typeof e=="object"){if(i.seen.has(e))return f(i,t,"cycle"),"[redacted:cycle]";i.seen.add(e);let o={};for(let[s,a]of Object.entries(e))o[s]=b(a,`${t}.${fe(s)}`,s,n+1,i);return i.seen.delete(e),o}return null}function ue(e,t,r){let n=e;return n=l(n,ae,"[redacted:private-key]",t,"private-key",r),n=l(n,oe,"$1[redacted]",t,"authorization",r),n=l(n,se,"[redacted:credential]",t,"credential-pattern",r),n=l(n,ie,"$1=[redacted]",t,"environment-secret",r),n=l(n,de,"$1[redacted]",t,"url-secret",r),r.options.redactEmails&&(n=l(n,ce,"[redacted:email]",t,"email",r)),n=P(n,r.options.workspaceRoot,"<workspace>",t,"workspace-path",r),n=P(n,r.options.homeDirectory,"<home>",t,"home-path",r),n.length>r.options.maxStringLength&&(f(r,t,"truncated"),n=`${n.slice(0,r.options.maxStringLength)}
2
- [truncated]`),n}function l(e,t,r,n,i,o){t.lastIndex=0;let s=0,a=e.replace(t,(...c)=>(s+=1,r.includes("$1")?r.replace("$1",String(c[1]??"")):r));for(let c=0;c<s;c+=1)f(o,n,i);return t.lastIndex=0,a}function P(e,t,r,n,i,o){let s=t?.trim().replace(/[\\/]+$/,"");if(!s)return e;let a=new RegExp(le(s).replace(/[\\/]+/g,"[\\\\/]"),process.platform==="win32"?"gi":"g");return l(e,a,r,n,i,o)}function le(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function fe(e){return e.replace(/[^A-Za-z0-9_-]/g,"_")}import{createHash as C,createPrivateKey as ge,createPublicKey as O,generateKeyPairSync as pe,randomBytes as he,randomUUID as _,sign as me,timingSafeEqual as ye,verify as Se}from"node:crypto";function p(e){return JSON.stringify(R(e,new Set))}function R(e,t){if(e===null||typeof e!="object"){if(typeof e=="number"&&!Number.isFinite(e))throw new TypeError("Artifact JSON cannot contain non-finite numbers");return e}if(t.has(e))throw new TypeError("Artifact JSON cannot contain cycles");if(t.add(e),Array.isArray(e)){let n=e.map(i=>R(i,t));return t.delete(e),n}let r={};for(let n of Object.keys(e).sort((i,o)=>i.localeCompare(o))){let i=e[n];if(i===void 0)throw new TypeError(`Artifact JSON property ${n} is undefined`);r[n]=R(i,t)}return t.delete(e),r}function h(e,t={}){for(let r of e){let n=r.codePointAt(0);if(n===127)return!0;if(!(n>31)&&!(n===9&&t.allowTab===!0)&&!((n===10||n===13)&&t.allowLineBreaks===!0))return!0}return!1}var we=10080*60*1e3,Ie=365*24*60*60*1e3;function ot(){let{publicKey:e,privateKey:t}=pe("ed25519"),r=e.export({type:"spki",format:"pem"}).toString(),n=t.export({type:"pkcs8",format:"pem"}).toString();return{keyId:N(r),publicKeyPem:r,privateKeyPem:n}}function N(e){let t=O(e).export({type:"spki",format:"der"});return`ed25519:${C("sha256").update(t).digest("hex").slice(0,32)}`}function st(e){let t=e.now??new Date,r=t.toISOString(),n=L(t,e.expiresAt,e.ttlMs),i=he(32).toString("base64url"),o=T(e.content,e.redaction),s=e.visibility??"private";ve(s,e.workspaceId,e.teamId,e.allowedPrincipalIds);let a={schemaVersion:2,kind:"xeno-secure-share",shareId:d(e.shareId??`share_${_()}`,"shareId"),createdAt:r,expiresAt:n,issuer:D(e.issuer),session:$({...e.session,name:e.session.name??e.name}),access:{mode:"read-only",visibility:s,...e.workspaceId?{workspaceId:d(e.workspaceId,"workspaceId")}:{},...e.teamId?{teamId:d(e.teamId,"teamId")}:{},...e.allowedPrincipalIds?.length?{allowedPrincipalIds:S(e.allowedPrincipalIds,"allowedPrincipalIds")}:{},capabilityToken:{algorithm:"sha256",hash:B(i)}},content:o.value,references:F(e.references??[]),redaction:o.report};return{envelope:xe(a,e.signingIdentity),capabilityToken:i,url:be(e.baseUrl,a.shareId,i)}}function xe(e,t){if(t.keyId!==N(t.publicKeyPem))throw new Error("Signing identity keyId does not match public key");let r=V(e,t);return{payload:e,signature:r}}function at(e,t={}){let r=[],n=!1,i=!1;if(e?.payload?.kind!=="xeno-secure-share"||e.payload.schemaVersion!==2)r.push("Unsupported secure-share envelope");else{let A=J(t.trustedPublicKeys,e.signature.keyId),v=A??(t.allowEmbeddedPublicKey===!1?void 0:e.signature.publicKeySpki);if(i=!!A,!v)r.push("No trusted or embedded issuer public key is available");else try{n=H(e.payload,e.signature,v),n||r.push("Share signature is invalid")}catch(x){r.push(x instanceof Error?x.message:String(x))}}let o=(t.now??new Date).getTime(),s=Date.parse(e?.payload?.expiresAt??""),c=t.revokedShareIds?.has(e?.payload?.shareId??"")??!1?"revoked":Number.isFinite(s)&&s<=o?"expired":"active";c==="revoked"&&r.push("Share has been revoked"),c==="expired"&&r.push("Share has expired");let g=Ee(e?.payload,t.capabilityToken);g||r.push("Capability token is missing or invalid");let I=Xe(e?.payload,t.principal);return I||r.push("Principal is outside the share audience"),{valid:n&&g&&I&&c==="active",integrityValid:n,issuerTrusted:i,capabilityValid:g,audienceAllowed:I,status:c,errors:r}}function ct(e){let t=e.now??new Date,r={schemaVersion:1,kind:"xeno-session-handoff",handoffId:d(e.handoffId??`handoff_${_()}`,"handoffId"),createdAt:t.toISOString(),expiresAt:L(t,e.expiresAt,e.ttlMs??1440*60*1e3),issuer:D(e.issuer),source:$(e.source),target:Re(e.target),resume:ke(e.resume),authority:Ae(e.authority),references:F(e.references??[]),...e.shareId?{shareId:d(e.shareId,"shareId")}:{}};return{payload:r,signature:V(r,e.signingIdentity)}}function dt(e,t={}){let r=[];if(e?.payload?.kind!=="xeno-session-handoff"||e.payload.schemaVersion!==1)return{valid:!1,integrityValid:!1,issuerTrusted:!1,expired:!1,errors:["Unsupported handoff envelope"]};let n=J(t.trustedPublicKeys,e.signature.keyId),i=n??(t.allowEmbeddedPublicKey===!1?void 0:e.signature.publicKeySpki),o=!!n,s=!1;if(!i)r.push("No trusted or embedded issuer public key is available");else try{s=H(e.payload,e.signature,i),s||r.push("Handoff signature is invalid")}catch(c){r.push(c instanceof Error?c.message:String(c))}let a=Date.parse(e.payload.expiresAt)<=(t.now??new Date).getTime();return a&&r.push("Handoff has expired"),{valid:s&&!a,integrityValid:s,issuerTrusted:o,expired:a,errors:r}}function V(e,t){let r=p(e),n=me(null,Buffer.from(r),ge(t.privateKeyPem)).toString("base64");return{algorithm:"ed25519",keyId:t.keyId,value:n,publicKeySpki:t.publicKeyPem}}function H(e,t,r){if(t.algorithm!=="ed25519")return!1;let n=Buffer.from(t.value,"base64");if(n.toString("base64")!==t.value)throw new Error("Signature is not canonical base64");return Se(null,Buffer.from(p(e)),O(r),n)}function Ee(e,t){if(!e||!t)return!1;let r=Buffer.from(e.access.capabilityToken.hash,"hex"),n=Buffer.from(B(t),"hex");return r.length===n.length&&ye(r,n)}function Xe(e,t){if(!e)return!1;let r=e.access;return r.allowedPrincipalIds?.length&&(!t?.id||!r.allowedPrincipalIds.includes(t.id))?!1:r.visibility==="workspace"?!!(t?.workspaceId&&t.workspaceId===r.workspaceId):r.visibility==="team"?!!(r.teamId&&t?.teamIds?.includes(r.teamId)):r.visibility==="private"?!!(t?.id&&t.id===e.issuer.id):r.visibility==="link"}function be(e,t,r){let n=new URL(e??"xeno://share/");if(n.username||n.password)throw new Error("Share base URL cannot contain credentials");if(n.protocol!=="https:"&&n.protocol!=="xeno:")throw new Error("Share base URL must use https: or xeno:");return n.pathname=`${n.pathname.replace(/\/$/,"")}/${encodeURIComponent(t)}`,n.search="",n.hash=new URLSearchParams({access_token:r}).toString(),n.toString()}function L(e,t,r=we){let n=t?new Date(t):new Date(e.getTime()+r);if(!Number.isFinite(n.getTime()))throw new Error("expiresAt must be a valid timestamp");let i=n.getTime()-e.getTime();if(i<=0)throw new Error("expiresAt must be in the future");if(i>Ie)throw new Error("Share and handoff expiry cannot exceed 365 days");return n.toISOString()}function D(e){return{id:d(e.id,"issuer.id"),...e.displayName?.trim()?{displayName:e.displayName.trim().slice(0,160)}:{},...e.workspaceId?{workspaceId:d(e.workspaceId,"issuer.workspaceId")}:{},...e.teamId?{teamId:d(e.teamId,"issuer.teamId")}:{}}}function $(e){let t={name:y(e.name,"session.name",200),surface:e.surface};for(let r of["sessionId","runId","hostedRunId","conversationId","parentSessionId","forkedFromSessionId","forkedAtEventId"])e[r]&&(t[r]=d(e[r],`session.${r}`));if(!t.sessionId&&!t.runId&&!t.hostedRunId&&!t.conversationId)throw new Error("Session identity requires sessionId, runId, hostedRunId, or conversationId");return e.git&&(t.git={...e.git.repositoryId?{repositoryId:d(e.git.repositoryId,"git.repositoryId")}:{},...e.git.remoteUrl?{remoteUrl:k(e.git.remoteUrl,"git.remoteUrl")}:{},...e.git.branch?{branch:y(e.git.branch,"git.branch",300)}:{},...e.git.commit?{commit:K(e.git.commit,"git.commit")}:{},...e.git.pullRequest?{pullRequest:{provider:e.git.pullRequest.provider,repository:y(e.git.pullRequest.repository,"git.pullRequest.repository",300),number:Pe(e.git.pullRequest.number,"git.pullRequest.number"),...e.git.pullRequest.url?{url:k(e.git.pullRequest.url,"git.pullRequest.url")}:{}}}:{}}),t}function F(e){let t=new Set;return e.map(r=>{let n=`${r.kind}:${r.id}`;if(t.has(n))throw new Error(`Duplicate share reference: ${n}`);return t.add(n),{kind:r.kind,id:d(r.id,"reference.id"),...r.title?.trim()?{title:r.title.trim().slice(0,300)}:{},...r.uri?{uri:k(r.uri,"reference.uri")}:{},...r.hash?{hash:K(r.hash,"reference.hash")}:{}}})}function Re(e){return{surface:e.surface,...e.workspaceId?{workspaceId:d(e.workspaceId,"target.workspaceId")}:{},...e.teamId?{teamId:d(e.teamId,"target.teamId")}:{},...e.environmentId?{environmentId:d(e.environmentId,"target.environmentId")}:{},...e.repositoryId?{repositoryId:d(e.repositoryId,"target.repositoryId")}:{}}}function ke(e){let t={};for(let r of["sessionId","runId","hostedRunId","checkpointId","transcriptEventId"])e[r]&&(t[r]=d(e[r],`resume.${r}`));if(e.artifactIds?.length&&(t.artifactIds=S(e.artifactIds,"resume.artifactIds")),e.taskIds?.length&&(t.taskIds=S(e.taskIds,"resume.taskIds")),!Object.keys(t).length)throw new Error("Handoff resume point cannot be empty");return t}function Ae(e){return{filesystem:e.filesystem,network:e.network,externalActions:e.externalActions,secretRefs:S(e.secretRefs,"authority.secretRefs")}}function ve(e,t,r,n){if(e==="workspace"&&!t)throw new Error("workspace visibility requires workspaceId");if(e==="team"&&!r)throw new Error("team visibility requires teamId");if(e==="private"&&n?.length)throw new Error("private shares cannot add allowed principals; use link/workspace/team visibility")}function J(e,t){if(!e)return;let r=e;return typeof r.get=="function"?r.get(t):e[t]}function B(e){return C("sha256").update(e).digest("hex")}function S(e,t){return[...new Set(e.map(r=>d(r,t)))].sort()}function d(e,t){let r=e.trim();if(!r||r.length>500||h(r))throw new Error(`${t} is invalid`);return r}function K(e,t){let r=e.trim();if(!/^[A-Za-z0-9:+._-]{7,256}$/.test(r))throw new Error(`${t} is invalid`);return r}function y(e,t,r){let n=e.trim();if(!n||n.length>r||h(n,{allowTab:!0,allowLineBreaks:!0}))throw new Error(`${t} is invalid`);return n}function Pe(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new Error(`${t} must be a positive integer`);return e}function k(e,t){let r=y(e,t,2e3),n=new URL(r);if(n.username||n.password)throw new Error(`${t} cannot contain credentials`);if(!["https:","xeno:","artifact:","urn:"].includes(n.protocol))throw new Error(`${t} uses an unsupported scheme`);return n.toString()}import{createHash as ee}from"node:crypto";import{chmod as Je,mkdir as te,open as Be,readFile as Ke,unlink as Me}from"node:fs/promises";import{dirname as je,join as Y,resolve as qe}from"node:path";import*as u from"node:fs/promises";var Te=new Set(["EACCES","EBUSY","EPERM"]),Ce=[10,20,40,80,160,320,640];async function M(e,t){for(let r=0;;r+=1)try{await u.rename(e,t);return}catch(n){let i=n.code,o=Ce[r];if(process.platform!=="win32"||!i||!Te.has(i)||o===void 0)throw n;await new Promise(s=>setTimeout(s,o))}}import{mkdirSync as Oe,readFileSync as _e,rmSync as q,writeFileSync as Ne}from"node:fs";import{hostname as z}from"node:os";import{dirname as Ve}from"node:path";function He(){return new Date().toISOString()}function Le(){return new Date(Date.now()-Math.floor(process.uptime()*1e3)).toISOString()}function U(e){try{return JSON.parse(_e(e,"utf8"))}catch{return null}}function De(e){if(!e||e<=0)return!1;try{return process.kill(e,0),!0}catch{return!1}}function $e(e){return e.hostname!==z()?!0:De(e.pid)}function j(e,t){Oe(Ve(e),{recursive:!0}),Ne(e,JSON.stringify(t,null,2)+`
3
- `,{encoding:"utf8",flag:"wx"})}function Fe(e,t){let r=U(e);r?.pid!==t.pid||r.hostname!==t.hostname||q(e,{force:!0})}function Z(e,t,r){let n=He(),i={schemaVersion:1,name:t,pid:process.pid,hostname:z(),processStartedAt:Le(),version:r,acquiredAt:n,updatedAt:n};try{j(e,i)}catch(o){if(o.code!=="EEXIST")throw o;let a=U(e);if(a&&$e(a))throw new Error(`${t} is already locked by PID ${a.pid} on ${a.hostname}.`);q(e,{force:!0}),j(e,i)}return{record:i,release:()=>{Fe(e,i)}}}var W=class{directory;snapshotPath;lockPath;now;constructor(t){this.directory=qe(t.directory),this.snapshotPath=Y(this.directory,"registry.json"),this.lockPath=Y(this.directory,"registry.lock"),this.now=t.now??(()=>new Date)}async register(t,r="created"){return this.mutate(n=>{let i=n.records.find(s=>s.shareId===t.payload.shareId);if(i){if(w(i.envelope)!==w(t))throw new Error(`Share ${t.payload.shareId} already exists with different content`);return{snapshot:n,result:i}}let o={shareId:t.payload.shareId,envelope:t,status:Date.parse(t.payload.expiresAt)<=this.now().getTime()?"expired":"active",registeredAt:this.now().toISOString(),origin:r};return{snapshot:G(n,[...n.records,o],this.now()),result:o}})}async revoke(t,r,n){return this.mutate(i=>{let o=i.records.findIndex(g=>g.shareId===t);if(o<0)throw new Error(`Share not found: ${t}`);let s=i.records[o];if(s.status==="revoked")return{snapshot:i,result:s};let a={...s,status:"revoked",revokedAt:this.now().toISOString(),revokedBy:Q(r,"actor"),revocationReason:Q(n,"reason")},c=[...i.records];return c[o]=a,{snapshot:G(i,c,this.now()),result:a}})}async get(t){return(await this.load()).records.find(r=>r.shareId===t)??null}async list(){let t=this.now().getTime();return(await this.load()).records.map(r=>r.status==="active"&&Date.parse(r.envelope.payload.expiresAt)<=t?{...r,status:"expired"}:r).sort((r,n)=>n.registeredAt.localeCompare(r.registeredAt))}async revokedIds(){return new Set((await this.list()).filter(t=>t.status==="revoked").map(t=>t.shareId))}async load(){try{let t=await Ke(this.snapshotPath,"utf8"),r=JSON.parse(t);return Ue(r),r}catch(t){if(t.code==="ENOENT")return ze(this.now());throw t}}async mutate(t){await te(this.directory,{recursive:!0,mode:448});let r=Z(this.lockPath,"xeno secure-share registry","1");try{let n=await this.load(),{snapshot:i,result:o}=t(n);return i!==n&&await Ze(this.snapshotPath,`${JSON.stringify(i,null,2)}
4
- `),o}finally{r.release()}}};function ze(e){return re({schemaVersion:1,generation:0,updatedAt:e.toISOString(),records:[]})}function G(e,t,r){return re({schemaVersion:1,generation:e.generation+1,updatedAt:r.toISOString(),records:[...t].sort((n,i)=>n.shareId.localeCompare(i.shareId))})}function re(e){return{...e,checksum:{algorithm:"sha256",value:ee("sha256").update(w(e)).digest("hex")}}}function Ue(e){if(e.schemaVersion!==1||!Array.isArray(e.records))throw new Error("Invalid secure-share registry snapshot");let{checksum:t,...r}=e,n=ee("sha256").update(w(r)).digest("hex");if(t?.algorithm!=="sha256"||t.value!==n)throw new Error("Secure-share registry checksum mismatch");let i=new Set;for(let o of e.records){if(o.shareId!==o.envelope?.payload?.shareId)throw new Error("Secure-share registry identity mismatch");if(i.has(o.shareId))throw new Error(`Duplicate secure-share registry record: ${o.shareId}`);i.add(o.shareId)}}async function Ze(e,t){await te(je(e),{recursive:!0,mode:448});let r=`${e}.${process.pid}.${Date.now()}.tmp`,n;try{n=await Be(r,"wx",384),await n.writeFile(t,"utf8"),await n.sync(),await n.close(),n=void 0,await M(r,e),await Je(e,384).catch(()=>{})}finally{n&&await n.close().catch(()=>{}),await Me(r).catch(()=>{})}}function w(e){return p(e)}function Q(e,t){let r=e.trim();if(!r||r.length>500||h(r))throw new Error(`${t} is invalid`);return r}export{W as FileXenoShareRegistry,X as XENO_HANDOFF_SCHEMA_VERSION,m as XENO_SHARE_REGISTRY_SCHEMA_VERSION,E as XENO_SHARE_SCHEMA_VERSION,st as createXenoSecureShare,ct as createXenoSessionHandoff,ot as createXenoShareSigningIdentity,N as publicKeyFingerprint,T as redactXenoShareValue,xe as signSharePayload,at as verifyXenoSecureShare,dt as verifyXenoSessionHandoff};
2
+ [truncated]`),n}function l(e,t,r,n,i,o){t.lastIndex=0;let s=0,a=e.replace(t,(...c)=>(s+=1,r.includes("$1")?r.replace("$1",String(c[1]??"")):r));for(let c=0;c<s;c+=1)f(o,n,i);return t.lastIndex=0,a}function P(e,t,r,n,i,o){let s=t?.trim().replace(/[\\/]+$/,"");if(!s)return e;let a=new RegExp(le(s).replace(/[\\/]+/g,"[\\\\/]"),process.platform==="win32"?"gi":"g");return l(e,a,r,n,i,o)}function le(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function fe(e){return e.replace(/[^A-Za-z0-9_-]/g,"_")}import{createHash as C,createPrivateKey as ge,createPublicKey as O,generateKeyPairSync as pe,randomBytes as he,randomUUID as _,sign as me,timingSafeEqual as ye,verify as Se}from"node:crypto";function p(e){return JSON.stringify(R(e,new Set))}function R(e,t){if(e===null||typeof e!="object"){if(typeof e=="number"&&!Number.isFinite(e))throw new TypeError("Artifact JSON cannot contain non-finite numbers");return e}if(t.has(e))throw new TypeError("Artifact JSON cannot contain cycles");if(t.add(e),Array.isArray(e)){let n=e.map(i=>R(i,t));return t.delete(e),n}let r={};for(let n of Object.keys(e).sort((i,o)=>i.localeCompare(o))){let i=e[n];if(i===void 0)throw new TypeError(`Artifact JSON property ${n} is undefined`);r[n]=R(i,t)}return t.delete(e),r}function h(e,t={}){for(let r of e){let n=r.codePointAt(0);if(n===127)return!0;if(!(n>31)&&!(n===9&&t.allowTab===!0)&&!((n===10||n===13)&&t.allowLineBreaks===!0))return!0}return!1}var we=10080*60*1e3,Ie=365*24*60*60*1e3;function ot(){let{publicKey:e,privateKey:t}=pe("ed25519"),r=e.export({type:"spki",format:"pem"}).toString(),n=t.export({type:"pkcs8",format:"pem"}).toString();return{keyId:N(r),publicKeyPem:r,privateKeyPem:n}}function N(e){let t=O(e).export({type:"spki",format:"der"});return`ed25519:${C("sha256").update(t).digest("hex").slice(0,32)}`}function st(e){let t=e.now??new Date,r=t.toISOString(),n=H(t,e.expiresAt,e.ttlMs),i=he(32).toString("base64url"),o=T(e.content,e.redaction),s=e.visibility??"private";ve(s,e.workspaceId,e.teamId,e.allowedPrincipalIds);let a={schemaVersion:2,kind:"xeno-secure-share",shareId:d(e.shareId??`share_${_()}`,"shareId"),createdAt:r,expiresAt:n,issuer:D(e.issuer),session:$({...e.session,name:e.session.name??e.name}),access:{mode:"read-only",visibility:s,...e.workspaceId?{workspaceId:d(e.workspaceId,"workspaceId")}:{},...e.teamId?{teamId:d(e.teamId,"teamId")}:{},...e.allowedPrincipalIds?.length?{allowedPrincipalIds:S(e.allowedPrincipalIds,"allowedPrincipalIds")}:{},capabilityToken:{algorithm:"sha256",hash:B(i)}},content:o.value,references:F(e.references??[]),redaction:o.report};return{envelope:xe(a,e.signingIdentity),capabilityToken:i,url:be(e.baseUrl,a.shareId,i)}}function xe(e,t){if(t.keyId!==N(t.publicKeyPem))throw new Error("Signing identity keyId does not match public key");let r=V(e,t);return{payload:e,signature:r}}function at(e,t={}){let r=[],n=!1,i=!1;if(e?.payload?.kind!=="xeno-secure-share"||e.payload.schemaVersion!==2)r.push("Unsupported secure-share envelope");else{let A=J(t.trustedPublicKeys,e.signature.keyId),v=A??(t.allowEmbeddedPublicKey===!1?void 0:e.signature.publicKeySpki);if(i=!!A,!v)r.push("No trusted or embedded issuer public key is available");else try{n=L(e.payload,e.signature,v),n||r.push("Share signature is invalid")}catch(x){r.push(x instanceof Error?x.message:String(x))}}let o=(t.now??new Date).getTime(),s=Date.parse(e?.payload?.expiresAt??""),c=t.revokedShareIds?.has(e?.payload?.shareId??"")??!1?"revoked":Number.isFinite(s)&&s<=o?"expired":"active";c==="revoked"&&r.push("Share has been revoked"),c==="expired"&&r.push("Share has expired");let g=Ee(e?.payload,t.capabilityToken);g||r.push("Capability token is missing or invalid");let I=Xe(e?.payload,t.principal);return I||r.push("Principal is outside the share audience"),{valid:n&&g&&I&&c==="active",integrityValid:n,issuerTrusted:i,capabilityValid:g,audienceAllowed:I,status:c,errors:r}}function ct(e){let t=e.now??new Date,r={schemaVersion:1,kind:"xeno-session-handoff",handoffId:d(e.handoffId??`handoff_${_()}`,"handoffId"),createdAt:t.toISOString(),expiresAt:H(t,e.expiresAt,e.ttlMs??1440*60*1e3),issuer:D(e.issuer),source:$(e.source),target:Re(e.target),resume:ke(e.resume),authority:Ae(e.authority),references:F(e.references??[]),...e.shareId?{shareId:d(e.shareId,"shareId")}:{}};return{payload:r,signature:V(r,e.signingIdentity)}}function dt(e,t={}){let r=[];if(e?.payload?.kind!=="xeno-session-handoff"||e.payload.schemaVersion!==1)return{valid:!1,integrityValid:!1,issuerTrusted:!1,expired:!1,errors:["Unsupported handoff envelope"]};let n=J(t.trustedPublicKeys,e.signature.keyId),i=n??(t.allowEmbeddedPublicKey===!1?void 0:e.signature.publicKeySpki),o=!!n,s=!1;if(!i)r.push("No trusted or embedded issuer public key is available");else try{s=L(e.payload,e.signature,i),s||r.push("Handoff signature is invalid")}catch(c){r.push(c instanceof Error?c.message:String(c))}let a=Date.parse(e.payload.expiresAt)<=(t.now??new Date).getTime();return a&&r.push("Handoff has expired"),{valid:s&&!a,integrityValid:s,issuerTrusted:o,expired:a,errors:r}}function V(e,t){let r=p(e),n=me(null,Buffer.from(r),ge(t.privateKeyPem)).toString("base64");return{algorithm:"ed25519",keyId:t.keyId,value:n,publicKeySpki:t.publicKeyPem}}function L(e,t,r){if(t.algorithm!=="ed25519")return!1;let n=Buffer.from(t.value,"base64");if(n.toString("base64")!==t.value)throw new Error("Signature is not canonical base64");return Se(null,Buffer.from(p(e)),O(r),n)}function Ee(e,t){if(!e||!t)return!1;let r=Buffer.from(e.access.capabilityToken.hash,"hex"),n=Buffer.from(B(t),"hex");return r.length===n.length&&ye(r,n)}function Xe(e,t){if(!e)return!1;let r=e.access;return r.allowedPrincipalIds?.length&&(!t?.id||!r.allowedPrincipalIds.includes(t.id))?!1:r.visibility==="workspace"?!!(t?.workspaceId&&t.workspaceId===r.workspaceId):r.visibility==="team"?!!(r.teamId&&t?.teamIds?.includes(r.teamId)):r.visibility==="private"?!!(t?.id&&t.id===e.issuer.id):r.visibility==="link"}function be(e,t,r){let n=new URL(e??"xeno://share/");if(n.username||n.password)throw new Error("Share base URL cannot contain credentials");if(n.protocol!=="https:"&&n.protocol!=="xeno:")throw new Error("Share base URL must use https: or xeno:");return n.pathname=`${n.pathname.replace(/\/$/,"")}/${encodeURIComponent(t)}`,n.search="",n.hash=new URLSearchParams({access_token:r}).toString(),n.toString()}function H(e,t,r=we){let n=t?new Date(t):new Date(e.getTime()+r);if(!Number.isFinite(n.getTime()))throw new Error("expiresAt must be a valid timestamp");let i=n.getTime()-e.getTime();if(i<=0)throw new Error("expiresAt must be in the future");if(i>Ie)throw new Error("Share and handoff expiry cannot exceed 365 days");return n.toISOString()}function D(e){return{id:d(e.id,"issuer.id"),...e.displayName?.trim()?{displayName:e.displayName.trim().slice(0,160)}:{},...e.workspaceId?{workspaceId:d(e.workspaceId,"issuer.workspaceId")}:{},...e.teamId?{teamId:d(e.teamId,"issuer.teamId")}:{}}}function $(e){let t={name:y(e.name,"session.name",200),surface:e.surface};for(let r of["sessionId","runId","hostedRunId","conversationId","parentSessionId","forkedFromSessionId","forkedAtEventId"])e[r]&&(t[r]=d(e[r],`session.${r}`));if(!t.sessionId&&!t.runId&&!t.hostedRunId&&!t.conversationId)throw new Error("Session identity requires sessionId, runId, hostedRunId, or conversationId");return e.git&&(t.git={...e.git.repositoryId?{repositoryId:d(e.git.repositoryId,"git.repositoryId")}:{},...e.git.remoteUrl?{remoteUrl:k(e.git.remoteUrl,"git.remoteUrl")}:{},...e.git.branch?{branch:y(e.git.branch,"git.branch",300)}:{},...e.git.commit?{commit:K(e.git.commit,"git.commit")}:{},...e.git.pullRequest?{pullRequest:{provider:e.git.pullRequest.provider,repository:y(e.git.pullRequest.repository,"git.pullRequest.repository",300),number:Pe(e.git.pullRequest.number,"git.pullRequest.number"),...e.git.pullRequest.url?{url:k(e.git.pullRequest.url,"git.pullRequest.url")}:{}}}:{}}),t}function F(e){let t=new Set;return e.map(r=>{let n=`${r.kind}:${r.id}`;if(t.has(n))throw new Error(`Duplicate share reference: ${n}`);return t.add(n),{kind:r.kind,id:d(r.id,"reference.id"),...r.title?.trim()?{title:r.title.trim().slice(0,300)}:{},...r.uri?{uri:k(r.uri,"reference.uri")}:{},...r.hash?{hash:K(r.hash,"reference.hash")}:{}}})}function Re(e){return{surface:e.surface,...e.workspaceId?{workspaceId:d(e.workspaceId,"target.workspaceId")}:{},...e.teamId?{teamId:d(e.teamId,"target.teamId")}:{},...e.environmentId?{environmentId:d(e.environmentId,"target.environmentId")}:{},...e.repositoryId?{repositoryId:d(e.repositoryId,"target.repositoryId")}:{}}}function ke(e){let t={};for(let r of["sessionId","runId","hostedRunId","checkpointId","transcriptEventId"])e[r]&&(t[r]=d(e[r],`resume.${r}`));if(e.artifactIds?.length&&(t.artifactIds=S(e.artifactIds,"resume.artifactIds")),e.taskIds?.length&&(t.taskIds=S(e.taskIds,"resume.taskIds")),!Object.keys(t).length)throw new Error("Handoff resume point cannot be empty");return t}function Ae(e){return{filesystem:e.filesystem,network:e.network,externalActions:e.externalActions,secretRefs:S(e.secretRefs,"authority.secretRefs")}}function ve(e,t,r,n){if(e==="workspace"&&!t)throw new Error("workspace visibility requires workspaceId");if(e==="team"&&!r)throw new Error("team visibility requires teamId");if(e==="private"&&n?.length)throw new Error("private shares cannot add allowed principals; use link/workspace/team visibility")}function J(e,t){if(!e)return;let r=e;return typeof r.get=="function"?r.get(t):e[t]}function B(e){return C("sha256").update(e).digest("hex")}function S(e,t){return[...new Set(e.map(r=>d(r,t)))].sort()}function d(e,t){let r=e.trim();if(!r||r.length>500||h(r))throw new Error(`${t} is invalid`);return r}function K(e,t){let r=e.trim();if(!/^[A-Za-z0-9:+._-]{7,256}$/.test(r))throw new Error(`${t} is invalid`);return r}function y(e,t,r){let n=e.trim();if(!n||n.length>r||h(n,{allowTab:!0,allowLineBreaks:!0}))throw new Error(`${t} is invalid`);return n}function Pe(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new Error(`${t} must be a positive integer`);return e}function k(e,t){let r=y(e,t,2e3),n=new URL(r);if(n.username||n.password)throw new Error(`${t} cannot contain credentials`);if(!["https:","xeno:","artifact:","urn:"].includes(n.protocol))throw new Error(`${t} uses an unsupported scheme`);return n.toString()}import{createHash as ee}from"node:crypto";import{chmod as Je,mkdir as te,open as Be,readFile as Ke,unlink as Me}from"node:fs/promises";import{dirname as je,join as W,resolve as qe}from"node:path";import*as u from"node:fs/promises";var Te=new Set(["EACCES","EBUSY","EPERM"]),Ce=[10,20,40,80,160,320,640];async function M(e,t){for(let r=0;;r+=1)try{await u.rename(e,t);return}catch(n){let i=n.code,o=Ce[r];if(process.platform!=="win32"||!i||!Te.has(i)||o===void 0)throw n;await new Promise(s=>setTimeout(s,o))}}import{mkdirSync as Oe,readFileSync as _e,rmSync as q,writeFileSync as Ne}from"node:fs";import{hostname as z}from"node:os";import{dirname as Ve}from"node:path";function Le(){return new Date().toISOString()}function He(){return new Date(Date.now()-Math.floor(process.uptime()*1e3)).toISOString()}function U(e){try{return JSON.parse(_e(e,"utf8"))}catch{return null}}function De(e){if(!e||e<=0)return!1;try{return process.kill(e,0),!0}catch{return!1}}function $e(e){return e.hostname!==z()?!0:De(e.pid)}function j(e,t){Oe(Ve(e),{recursive:!0}),Ne(e,JSON.stringify(t,null,2)+`
3
+ `,{encoding:"utf8",flag:"wx"})}function Fe(e,t){let r=U(e);r?.pid!==t.pid||r.hostname!==t.hostname||q(e,{force:!0})}function Z(e,t,r){let n=Le(),i={schemaVersion:1,name:t,pid:process.pid,hostname:z(),processStartedAt:He(),version:r,acquiredAt:n,updatedAt:n};try{j(e,i)}catch(o){if(o.code!=="EEXIST")throw o;let a=U(e);if(a&&$e(a))throw new Error(`${t} is already locked by PID ${a.pid} on ${a.hostname}.`);q(e,{force:!0}),j(e,i)}return{record:i,release:()=>{Fe(e,i)}}}var Y=class{directory;snapshotPath;lockPath;now;constructor(t){this.directory=qe(t.directory),this.snapshotPath=W(this.directory,"registry.json"),this.lockPath=W(this.directory,"registry.lock"),this.now=t.now??(()=>new Date)}async register(t,r="created"){return this.mutate(n=>{let i=n.records.find(s=>s.shareId===t.payload.shareId);if(i){if(w(i.envelope)!==w(t))throw new Error(`Share ${t.payload.shareId} already exists with different content`);return{snapshot:n,result:i}}let o={shareId:t.payload.shareId,envelope:t,status:Date.parse(t.payload.expiresAt)<=this.now().getTime()?"expired":"active",registeredAt:this.now().toISOString(),origin:r};return{snapshot:G(n,[...n.records,o],this.now()),result:o}})}async revoke(t,r,n){return this.mutate(i=>{let o=i.records.findIndex(g=>g.shareId===t);if(o<0)throw new Error(`Share not found: ${t}`);let s=i.records[o];if(s.status==="revoked")return{snapshot:i,result:s};let a={...s,status:"revoked",revokedAt:this.now().toISOString(),revokedBy:Q(r,"actor"),revocationReason:Q(n,"reason")},c=[...i.records];return c[o]=a,{snapshot:G(i,c,this.now()),result:a}})}async get(t){return(await this.load()).records.find(r=>r.shareId===t)??null}async list(){let t=this.now().getTime();return(await this.load()).records.map(r=>r.status==="active"&&Date.parse(r.envelope.payload.expiresAt)<=t?{...r,status:"expired"}:r).sort((r,n)=>n.registeredAt.localeCompare(r.registeredAt))}async revokedIds(){return new Set((await this.list()).filter(t=>t.status==="revoked").map(t=>t.shareId))}async load(){try{let t=await Ke(this.snapshotPath,"utf8"),r=JSON.parse(t);return Ue(r),r}catch(t){if(t.code==="ENOENT")return ze(this.now());throw t}}async mutate(t){await te(this.directory,{recursive:!0,mode:448});let r=Z(this.lockPath,"xeno secure-share registry","1");try{let n=await this.load(),{snapshot:i,result:o}=t(n);return i!==n&&await Ze(this.snapshotPath,`${JSON.stringify(i,null,2)}
4
+ `),o}finally{r.release()}}};function ze(e){return re({schemaVersion:1,generation:0,updatedAt:e.toISOString(),records:[]})}function G(e,t,r){return re({schemaVersion:1,generation:e.generation+1,updatedAt:r.toISOString(),records:[...t].sort((n,i)=>n.shareId.localeCompare(i.shareId))})}function re(e){return{...e,checksum:{algorithm:"sha256",value:ee("sha256").update(w(e)).digest("hex")}}}function Ue(e){if(e.schemaVersion!==1||!Array.isArray(e.records))throw new Error("Invalid secure-share registry snapshot");let{checksum:t,...r}=e,n=ee("sha256").update(w(r)).digest("hex");if(t?.algorithm!=="sha256"||t.value!==n)throw new Error("Secure-share registry checksum mismatch");let i=new Set;for(let o of e.records){if(o.shareId!==o.envelope?.payload?.shareId)throw new Error("Secure-share registry identity mismatch");if(i.has(o.shareId))throw new Error(`Duplicate secure-share registry record: ${o.shareId}`);i.add(o.shareId)}}async function Ze(e,t){await te(je(e),{recursive:!0,mode:448});let r=`${e}.${process.pid}.${Date.now()}.tmp`,n;try{n=await Be(r,"wx",384),await n.writeFile(t,"utf8"),await n.sync(),await n.close(),n=void 0,await M(r,e),await Je(e,384).catch(()=>{})}finally{n&&await n.close().catch(()=>{}),await Me(r).catch(()=>{})}}function w(e){return p(e)}function Q(e,t){let r=e.trim();if(!r||r.length>500||h(r))throw new Error(`${t} is invalid`);return r}export{Y as FileXenoShareRegistry,X as XENO_HANDOFF_SCHEMA_VERSION,m as XENO_SHARE_REGISTRY_SCHEMA_VERSION,E as XENO_SHARE_SCHEMA_VERSION,st as createXenoSecureShare,ct as createXenoSessionHandoff,ot as createXenoShareSigningIdentity,N as publicKeyFingerprint,T as redactXenoShareValue,xe as signSharePayload,at as verifyXenoSecureShare,dt as verifyXenoSessionHandoff};
@@ -1 +1 @@
1
- {"inputs":{"src/sharing/types.ts":{"bytes":5121,"imports":[],"format":"esm"},"src/sharing/redaction.ts":{"bytes":6716,"imports":[],"format":"esm"},"src/artifacts/hash.ts":{"bytes":1489,"imports":[{"path":"node:crypto","kind":"import-statement","external":true}],"format":"esm"},"src/utils/text-security.ts":{"bytes":809,"imports":[],"format":"esm"},"src/sharing/protocol.ts":{"bytes":19325,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"../artifacts/hash.js"},{"path":"src/utils/text-security.ts","kind":"import-statement","original":"../utils/text-security.js"},{"path":"src/sharing/redaction.ts","kind":"import-statement","original":"./redaction.js"},{"path":"src/sharing/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/utils/fs.ts":{"bytes":11685,"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/control-plane/lock.ts":{"bytes":2496,"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/sharing/file-registry.ts":{"bytes":7359,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"src/utils/fs.ts","kind":"import-statement","original":"../utils/fs.js"},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"../artifacts/hash.js"},{"path":"src/control-plane/lock.ts","kind":"import-statement","original":"../control-plane/lock.js"},{"path":"src/utils/text-security.ts","kind":"import-statement","original":"../utils/text-security.js"},{"path":"src/sharing/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/sharing/index.ts":{"bytes":127,"imports":[{"path":"src/sharing/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/sharing/redaction.ts","kind":"import-statement","original":"./redaction.js"},{"path":"src/sharing/protocol.ts","kind":"import-statement","original":"./protocol.js"},{"path":"src/sharing/file-registry.ts","kind":"import-statement","original":"./file-registry.js"}],"format":"esm"}},"outputs":{"dist/sharing/index.cjs":{"imports":[{"path":"node:crypto","kind":"require-call","external":true},{"path":"node:crypto","kind":"require-call","external":true},{"path":"node:fs/promises","kind":"require-call","external":true},{"path":"node:path","kind":"require-call","external":true},{"path":"node:fs/promises","kind":"require-call","external":true},{"path":"node:fs","kind":"require-call","external":true},{"path":"node:os","kind":"require-call","external":true},{"path":"node:path","kind":"require-call","external":true}],"exports":[],"entryPoint":"src/sharing/index.ts","inputs":{"src/sharing/index.ts":{"bytesInOutput":413},"src/sharing/types.ts":{"bytesInOutput":16},"src/sharing/redaction.ts":{"bytesInOutput":3216},"src/sharing/protocol.ts":{"bytesInOutput":9109},"src/artifacts/hash.ts":{"bytesInOutput":559},"src/utils/text-security.ts":{"bytesInOutput":179},"src/sharing/file-registry.ts":{"bytesInOutput":3490},"src/utils/fs.ts":{"bytesInOutput":318},"src/control-plane/lock.ts":{"bytesInOutput":1059}},"bytes":19260}}}
1
+ {"inputs":{"src/sharing/types.ts":{"bytes":5121,"imports":[],"format":"esm"},"src/sharing/redaction.ts":{"bytes":6716,"imports":[],"format":"esm"},"src/artifacts/hash.ts":{"bytes":1489,"imports":[{"path":"node:crypto","kind":"import-statement","external":true}],"format":"esm"},"src/utils/text-security.ts":{"bytes":809,"imports":[],"format":"esm"},"src/sharing/protocol.ts":{"bytes":19325,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"../artifacts/hash.js"},{"path":"src/utils/text-security.ts","kind":"import-statement","original":"../utils/text-security.js"},{"path":"src/sharing/redaction.ts","kind":"import-statement","original":"./redaction.js"},{"path":"src/sharing/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/utils/fs.ts":{"bytes":13355,"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/control-plane/lock.ts":{"bytes":2496,"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/sharing/file-registry.ts":{"bytes":7359,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"src/utils/fs.ts","kind":"import-statement","original":"../utils/fs.js"},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"../artifacts/hash.js"},{"path":"src/control-plane/lock.ts","kind":"import-statement","original":"../control-plane/lock.js"},{"path":"src/utils/text-security.ts","kind":"import-statement","original":"../utils/text-security.js"},{"path":"src/sharing/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/sharing/index.ts":{"bytes":127,"imports":[{"path":"src/sharing/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/sharing/redaction.ts","kind":"import-statement","original":"./redaction.js"},{"path":"src/sharing/protocol.ts","kind":"import-statement","original":"./protocol.js"},{"path":"src/sharing/file-registry.ts","kind":"import-statement","original":"./file-registry.js"}],"format":"esm"}},"outputs":{"dist/sharing/index.cjs":{"imports":[{"path":"node:crypto","kind":"require-call","external":true},{"path":"node:crypto","kind":"require-call","external":true},{"path":"node:fs/promises","kind":"require-call","external":true},{"path":"node:path","kind":"require-call","external":true},{"path":"node:fs/promises","kind":"require-call","external":true},{"path":"node:fs","kind":"require-call","external":true},{"path":"node:os","kind":"require-call","external":true},{"path":"node:path","kind":"require-call","external":true}],"exports":[],"entryPoint":"src/sharing/index.ts","inputs":{"src/sharing/index.ts":{"bytesInOutput":413},"src/sharing/types.ts":{"bytesInOutput":16},"src/sharing/redaction.ts":{"bytesInOutput":3216},"src/sharing/protocol.ts":{"bytesInOutput":9109},"src/artifacts/hash.ts":{"bytesInOutput":559},"src/utils/text-security.ts":{"bytesInOutput":179},"src/sharing/file-registry.ts":{"bytesInOutput":3490},"src/utils/fs.ts":{"bytesInOutput":318},"src/control-plane/lock.ts":{"bytesInOutput":1059}},"bytes":19260}}}
@@ -1 +1 @@
1
- {"inputs":{"src/sharing/types.ts":{"bytes":5121,"imports":[],"format":"esm"},"src/sharing/redaction.ts":{"bytes":6716,"imports":[],"format":"esm"},"src/artifacts/hash.ts":{"bytes":1489,"imports":[{"path":"node:crypto","kind":"import-statement","external":true}],"format":"esm"},"src/utils/text-security.ts":{"bytes":809,"imports":[],"format":"esm"},"src/sharing/protocol.ts":{"bytes":19325,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"../artifacts/hash.js"},{"path":"src/utils/text-security.ts","kind":"import-statement","original":"../utils/text-security.js"},{"path":"src/sharing/redaction.ts","kind":"import-statement","original":"./redaction.js"},{"path":"src/sharing/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/utils/fs.ts":{"bytes":11685,"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/control-plane/lock.ts":{"bytes":2496,"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/sharing/file-registry.ts":{"bytes":7359,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"src/utils/fs.ts","kind":"import-statement","original":"../utils/fs.js"},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"../artifacts/hash.js"},{"path":"src/control-plane/lock.ts","kind":"import-statement","original":"../control-plane/lock.js"},{"path":"src/utils/text-security.ts","kind":"import-statement","original":"../utils/text-security.js"},{"path":"src/sharing/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/sharing/index.ts":{"bytes":127,"imports":[{"path":"src/sharing/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/sharing/redaction.ts","kind":"import-statement","original":"./redaction.js"},{"path":"src/sharing/protocol.ts","kind":"import-statement","original":"./protocol.js"},{"path":"src/sharing/file-registry.ts","kind":"import-statement","original":"./file-registry.js"}],"format":"esm"}},"outputs":{"dist/sharing/index.js":{"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"exports":["FileXenoShareRegistry","XENO_HANDOFF_SCHEMA_VERSION","XENO_SHARE_REGISTRY_SCHEMA_VERSION","XENO_SHARE_SCHEMA_VERSION","createXenoSecureShare","createXenoSessionHandoff","createXenoShareSigningIdentity","publicKeyFingerprint","redactXenoShareValue","signSharePayload","verifyXenoSecureShare","verifyXenoSessionHandoff"],"entryPoint":"src/sharing/index.ts","inputs":{"src/sharing/types.ts":{"bytesInOutput":16},"src/sharing/index.ts":{"bytesInOutput":0},"src/sharing/redaction.ts":{"bytesInOutput":3216},"src/sharing/protocol.ts":{"bytesInOutput":9080},"src/artifacts/hash.ts":{"bytesInOutput":559},"src/utils/text-security.ts":{"bytesInOutput":179},"src/sharing/file-registry.ts":{"bytesInOutput":3478},"src/utils/fs.ts":{"bytesInOutput":313},"src/control-plane/lock.ts":{"bytesInOutput":1041}},"bytes":18252}}}
1
+ {"inputs":{"src/sharing/types.ts":{"bytes":5121,"imports":[],"format":"esm"},"src/sharing/redaction.ts":{"bytes":6716,"imports":[],"format":"esm"},"src/artifacts/hash.ts":{"bytes":1489,"imports":[{"path":"node:crypto","kind":"import-statement","external":true}],"format":"esm"},"src/utils/text-security.ts":{"bytes":809,"imports":[],"format":"esm"},"src/sharing/protocol.ts":{"bytes":19325,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"../artifacts/hash.js"},{"path":"src/utils/text-security.ts","kind":"import-statement","original":"../utils/text-security.js"},{"path":"src/sharing/redaction.ts","kind":"import-statement","original":"./redaction.js"},{"path":"src/sharing/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/utils/fs.ts":{"bytes":13355,"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/control-plane/lock.ts":{"bytes":2496,"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/sharing/file-registry.ts":{"bytes":7359,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"src/utils/fs.ts","kind":"import-statement","original":"../utils/fs.js"},{"path":"src/artifacts/hash.ts","kind":"import-statement","original":"../artifacts/hash.js"},{"path":"src/control-plane/lock.ts","kind":"import-statement","original":"../control-plane/lock.js"},{"path":"src/utils/text-security.ts","kind":"import-statement","original":"../utils/text-security.js"},{"path":"src/sharing/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/sharing/index.ts":{"bytes":127,"imports":[{"path":"src/sharing/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/sharing/redaction.ts","kind":"import-statement","original":"./redaction.js"},{"path":"src/sharing/protocol.ts","kind":"import-statement","original":"./protocol.js"},{"path":"src/sharing/file-registry.ts","kind":"import-statement","original":"./file-registry.js"}],"format":"esm"}},"outputs":{"dist/sharing/index.js":{"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"exports":["FileXenoShareRegistry","XENO_HANDOFF_SCHEMA_VERSION","XENO_SHARE_REGISTRY_SCHEMA_VERSION","XENO_SHARE_SCHEMA_VERSION","createXenoSecureShare","createXenoSessionHandoff","createXenoShareSigningIdentity","publicKeyFingerprint","redactXenoShareValue","signSharePayload","verifyXenoSecureShare","verifyXenoSessionHandoff"],"entryPoint":"src/sharing/index.ts","inputs":{"src/sharing/types.ts":{"bytesInOutput":16},"src/sharing/index.ts":{"bytesInOutput":0},"src/sharing/redaction.ts":{"bytesInOutput":3216},"src/sharing/protocol.ts":{"bytesInOutput":9080},"src/artifacts/hash.ts":{"bytesInOutput":559},"src/utils/text-security.ts":{"bytesInOutput":179},"src/sharing/file-registry.ts":{"bytesInOutput":3478},"src/utils/fs.ts":{"bytesInOutput":313},"src/control-plane/lock.ts":{"bytesInOutput":1041}},"bytes":18252}}}
@@ -156,6 +156,10 @@ interface ToolExecutionContext {
156
156
  operationId?: string;
157
157
  reportProgress?: (event: ToolProgressUpdate) => void;
158
158
  authorization?: ToolAuthorizationReceipt;
159
+ ownerSessionId?: string;
160
+ }
161
+ interface ToolPolicyProjectionContext {
162
+ ownerSessionId?: string;
159
163
  }
160
164
  type ToolExecutor = (input: Record<string, unknown>, context?: ToolExecutionContext) => Promise<ToolResult>;
161
165
  interface ToolPolicyProjection {
@@ -169,7 +173,7 @@ interface RegisteredTool {
169
173
  definition: ToolDefinition;
170
174
  execute: ToolExecutor;
171
175
  readOnly?: boolean;
172
- projectPolicyInput?: (input: Record<string, unknown>) => ToolPolicyProjection | {
176
+ projectPolicyInput?: (input: Record<string, unknown>, context?: ToolPolicyProjectionContext) => ToolPolicyProjection | {
173
177
  error: ToolResult;
174
178
  };
175
179
  }
@@ -156,6 +156,10 @@ interface ToolExecutionContext {
156
156
  operationId?: string;
157
157
  reportProgress?: (event: ToolProgressUpdate) => void;
158
158
  authorization?: ToolAuthorizationReceipt;
159
+ ownerSessionId?: string;
160
+ }
161
+ interface ToolPolicyProjectionContext {
162
+ ownerSessionId?: string;
159
163
  }
160
164
  type ToolExecutor = (input: Record<string, unknown>, context?: ToolExecutionContext) => Promise<ToolResult>;
161
165
  interface ToolPolicyProjection {
@@ -169,7 +173,7 @@ interface RegisteredTool {
169
173
  definition: ToolDefinition;
170
174
  execute: ToolExecutor;
171
175
  readOnly?: boolean;
172
- projectPolicyInput?: (input: Record<string, unknown>) => ToolPolicyProjection | {
176
+ projectPolicyInput?: (input: Record<string, unknown>, context?: ToolPolicyProjectionContext) => ToolPolicyProjection | {
173
177
  error: ToolResult;
174
178
  };
175
179
  }
@@ -1,24 +1,25 @@
1
- "use strict";var ht=Object.create;var E=Object.defineProperty;var xt=Object.getOwnPropertyDescriptor;var yt=Object.getOwnPropertyNames;var wt=Object.getPrototypeOf,bt=Object.prototype.hasOwnProperty;var Et=(t,e)=>{for(var n in e)E(t,n,{get:e[n],enumerable:!0})},B=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of yt(e))!bt.call(t,o)&&o!==n&&E(t,o,{get:()=>e[o],enumerable:!(r=xt(e,o))||r.enumerable});return t};var S=(t,e,n)=>(n=t!=null?ht(wt(t)):{},B(e||!t||!t.__esModule?E(n,"default",{value:t,enumerable:!0}):n,t)),Rt=t=>B(E({},"__esModule",{value:!0}),t);var nn={};Et(nn,{ApiTransientError:()=>b,HOME_DIR:()=>te,IS_LINUX:()=>Qt,IS_MAC:()=>Zt,IS_WINDOWS:()=>Z,LogLevel:()=>V,OS_VERSION:()=>Vt,PLATFORM:()=>T,accountTextTokens:()=>_e,appendDurableLine:()=>St,appendLine:()=>_t,benchmarkLeakError:()=>He,buildToolResultBlock:()=>tn,buildToolResultText:()=>gt,calculateCost:()=>Oe,commandMentionsBenchmarkLeak:()=>Je,conservativeTokenAccountingAdapter:()=>ot,copyTextToClipboard:()=>Be,createSafeRegex:()=>fe,debug:()=>me,decodeTextBuffer:()=>j,deleteDir:()=>Ft,deleteFile:()=>Dt,detectLineEnding:()=>q,detectPreferredLineEnding:()=>Nt,detectTextEncoding:()=>D,encodeTextBuffer:()=>W,ensureDir:()=>R,error:()=>xe,estimateTokens:()=>it,estimateTokensForModel:()=>rt,existsSync:()=>Bt,filterBenchmarkLeakPaths:()=>ze,findSimilarFile:()=>Ot,fitsInBudget:()=>$e,formatCost:()=>Le,getAgentHome:()=>ee,getBenchmarkReferenceOverwriteHint:()=>Ye,getBoolean:()=>ce,getConfigDir:()=>ne,getLogLevel:()=>pe,getNumber:()=>ue,getProjectConfigDir:()=>re,getRetryErrorContext:()=>N,getShellName:()=>oe,getString:()=>ae,getToolResultTransportContent:()=>Ke,hasDir:()=>At,hasDisallowedAsciiControlCharacter:()=>en,hasFile:()=>Tt,hasFrontmatter:()=>Ht,hasNonTextToolResultContent:()=>Qe,hasTransientStatusMention:()=>et,info:()=>ge,isBenchmarkLeakPath:()=>O,isBenchmarkMode:()=>v,isGitRepo:()=>ie,isPathSafe:()=>G,isRetryableError:()=>nt,listDirs:()=>It,listFiles:()=>Pt,normalizeLineEndings:()=>X,normalizeXenoRequestContext:()=>Ee,parseDocument:()=>Xt,parseJsonLines:()=>qt,readFileSafe:()=>Ct,readIfExists:()=>Lt,readTextFile:()=>z,remainingBudget:()=>Ne,renameReplacingWithRetry:()=>I,safeJsonParse:()=>jt,safeJsonStringify:()=>Wt,safeRegexTest:()=>le,safeResolvePath:()=>Kt,setLogLevel:()=>de,stringifyDocument:()=>zt,toTransportAssistantBlocks:()=>Ve,toolAssistantContentToText:()=>pt,toolResultContentToText:()=>Ge,truncateToTokens:()=>Se,validateRegexPattern:()=>Q,validateRequired:()=>se,warn:()=>he,withRetry:()=>Me,writeAtomic:()=>P,writeTextFile:()=>$t,xenoRequestContextHeaders:()=>Re});module.exports=Rt(nn);var w=require("node:fs"),h=require("node:fs"),c=S(require("node:fs/promises"),1),a=S(require("node:path"),1);function Tt(t){try{return(0,h.existsSync)(t)&&(0,h.statSync)(t).isFile()}catch{return!1}}function At(t){try{return(0,h.existsSync)(t)&&(0,h.statSync)(t).isDirectory()}catch{return!1}}function Ct(t,e=""){try{return(0,w.readFileSync)(t,"utf-8")}catch{return e}}async function R(t){await c.mkdir(t,{recursive:!0})}async function P(t,e){let n=a.dirname(t);await R(n);let r=Math.random().toString(36).substring(2,15),o=`${t}.tmp.${process.pid}.${r}`;try{await c.writeFile(o,e),await I(o,t)}finally{try{await c.unlink(o)}catch{}}}var kt=new Set(["EACCES","EBUSY","EPERM"]),Mt=[10,20,40,80,160,320,640];async function I(t,e){for(let n=0;;n+=1)try{await c.rename(t,e);return}catch(r){let o=r.code,i=Mt[n];if(process.platform!=="win32"||!o||!kt.has(o)||i===void 0)throw r;await new Promise(s=>setTimeout(s,i))}}async function _t(t,e){let n=a.dirname(t);await R(n),await c.appendFile(t,e+`
2
- `,"utf-8")}async function St(t,e){let n=a.dirname(t);await R(n);let r=await c.open(t,"a");try{await r.writeFile(e+`
3
- `,"utf-8"),await r.sync()}finally{await r.close()}}function D(t){return t.length>=3&&t[0]===239&&t[1]===187&&t[2]===191?"utf8-bom":t.length>=2&&t[0]===255&&t[1]===254?"utf16le":t.length>=2&&t[0]===254&&t[1]===255?"utf16be":"utf8"}function F(t){let e=Buffer.from(t);for(let n=0;n+1<e.length;n+=2){let r=e[n];e[n]=e[n+1],e[n+1]=r}return e}function j(t,e){switch(e){case"utf8-bom":return t.subarray(3).toString("utf8");case"utf16le":return t.subarray(2).toString("utf16le");case"utf16be":return F(t.subarray(2)).toString("utf16le");default:return t.toString("utf8")}}function W(t,e){switch(e){case"utf8-bom":return Buffer.concat([Buffer.from([239,187,191]),Buffer.from(t,"utf8")]);case"utf16le":return Buffer.concat([Buffer.from([255,254]),Buffer.from(t,"utf16le")]);case"utf16be":return Buffer.concat([Buffer.from([254,255]),F(Buffer.from(t,"utf16le"))]);default:return Buffer.from(t,"utf8")}}function q(t){return t.includes(`\r
4
- `)?"CRLF":"LF"}function X(t,e){let n=t.replace(/\r\n/g,`
1
+ "use strict";var wt=Object.create;var T=Object.defineProperty;var bt=Object.getOwnPropertyDescriptor;var Et=Object.getOwnPropertyNames;var Rt=Object.getPrototypeOf,Tt=Object.prototype.hasOwnProperty;var At=(t,e)=>{for(var n in e)T(t,n,{get:e[n],enumerable:!0})},P=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Et(e))!Tt.call(t,o)&&o!==n&&T(t,o,{get:()=>e[o],enumerable:!(r=bt(e,o))||r.enumerable});return t};var $=(t,e,n)=>(n=t!=null?wt(Rt(t)):{},P(e||!t||!t.__esModule?T(n,"default",{value:t,enumerable:!0}):n,t)),Ct=t=>P(T({},"__esModule",{value:!0}),t);var un={};At(un,{ApiTransientError:()=>b,HOME_DIR:()=>ie,IS_LINUX:()=>re,IS_MAC:()=>ne,IS_WINDOWS:()=>V,LogLevel:()=>et,OS_VERSION:()=>oe,PLATFORM:()=>C,accountTextTokens:()=>Oe,appendDurableLine:()=>Nt,appendLine:()=>vt,benchmarkLeakError:()=>Ke,buildToolResultBlock:()=>sn,buildToolResultText:()=>xt,calculateCost:()=>De,commandMentionsBenchmarkLeak:()=>Ze,conservativeTokenAccountingAdapter:()=>st,copyTextToClipboard:()=>je,createSafeRegex:()=>ge,debug:()=>we,decodeTextBuffer:()=>q,deleteDir:()=>Xt,deleteFile:()=>qt,detectLineEnding:()=>z,detectPreferredLineEnding:()=>Bt,detectTextEncoding:()=>j,encodeTextBuffer:()=>X,ensureDir:()=>A,error:()=>Re,estimateTokens:()=>at,estimateTokensForModel:()=>it,existsSync:()=>Ft,filterBenchmarkLeakPaths:()=>Ge,findSimilarFile:()=>It,fitsInBudget:()=>Be,formatCost:()=>Fe,getAgentHome:()=>se,getBenchmarkReferenceOverwriteHint:()=>Qe,getBoolean:()=>me,getConfigDir:()=>ae,getLogLevel:()=>ye,getNumber:()=>pe,getProjectConfigDir:()=>ue,getRetryErrorContext:()=>N,getShellName:()=>ce,getString:()=>de,getToolResultTransportContent:()=>en,hasDir:()=>Mt,hasDisallowedAsciiControlCharacter:()=>an,hasFile:()=>kt,hasFrontmatter:()=>Gt,hasMixedLineEndings:()=>Ot,hasNonTextToolResultContent:()=>rn,hasTransientStatusMention:()=>rt,info:()=>be,isBenchmarkLeakPath:()=>L,isBenchmarkMode:()=>O,isGitRepo:()=>fe,isPathSafe:()=>Z,isRetryableError:()=>ot,listDirs:()=>Wt,listFiles:()=>jt,normalizeLineEndings:()=>H,normalizeXenoRequestContext:()=>ke,parseDocument:()=>Yt,parseJsonLines:()=>Jt,pathIdentityKey:()=>ee,readFileSafe:()=>_t,readIfExists:()=>Dt,readTextFile:()=>J,remainingBudget:()=>Pe,renameReplacingWithRetry:()=>F,safeJsonParse:()=>zt,safeJsonStringify:()=>Ht,safeRegexTest:()=>he,safeResolvePath:()=>te,setLogLevel:()=>xe,stringifyDocument:()=>Ut,toTransportAssistantBlocks:()=>on,toolAssistantContentToText:()=>gt,toolResultContentToText:()=>tn,truncateToTokens:()=>Le,validateRegexPattern:()=>tt,validateRequired:()=>le,warn:()=>Ee,withRetry:()=>Ne,writeAtomic:()=>D,writeTextFile:()=>Lt,xenoRequestContextHeaders:()=>Me});module.exports=Ct(un);var w=require("node:fs"),g=require("node:fs"),u=$(require("node:fs/promises"),1),a=$(require("node:path"),1);function kt(t){try{return(0,g.existsSync)(t)&&(0,g.statSync)(t).isFile()}catch{return!1}}function Mt(t){try{return(0,g.existsSync)(t)&&(0,g.statSync)(t).isDirectory()}catch{return!1}}function _t(t,e=""){try{return(0,w.readFileSync)(t,"utf-8")}catch{return e}}async function A(t){await u.mkdir(t,{recursive:!0})}async function D(t,e){let n=a.dirname(t);await A(n);let r=Math.random().toString(36).substring(2,15),o=`${t}.tmp.${process.pid}.${r}`;try{await u.writeFile(o,e),await F(o,t)}finally{try{await u.unlink(o)}catch{}}}var St=new Set(["EACCES","EBUSY","EPERM"]),$t=[10,20,40,80,160,320,640];async function F(t,e){for(let n=0;;n+=1)try{await u.rename(t,e);return}catch(r){let o=r.code,i=$t[n];if(process.platform!=="win32"||!o||!St.has(o)||i===void 0)throw r;await new Promise(s=>setTimeout(s,i))}}async function vt(t,e){let n=a.dirname(t);await A(n),await u.appendFile(t,e+`
2
+ `,"utf-8")}async function Nt(t,e){let n=a.dirname(t);await A(n);let r=await u.open(t,"a");try{await r.writeFile(e+`
3
+ `,"utf-8"),await r.sync()}finally{await r.close()}}function j(t){return t.length>=3&&t[0]===239&&t[1]===187&&t[2]===191?"utf8-bom":t.length>=2&&t[0]===255&&t[1]===254?"utf16le":t.length>=2&&t[0]===254&&t[1]===255?"utf16be":"utf8"}function W(t){let e=Buffer.from(t);for(let n=0;n+1<e.length;n+=2){let r=e[n];e[n]=e[n+1],e[n+1]=r}return e}function q(t,e){switch(e){case"utf8-bom":return t.subarray(3).toString("utf8");case"utf16le":return t.subarray(2).toString("utf16le");case"utf16be":return W(t.subarray(2)).toString("utf16le");default:return t.toString("utf8")}}function X(t,e){switch(e){case"utf8-bom":return Buffer.concat([Buffer.from([239,187,191]),Buffer.from(t,"utf8")]);case"utf16le":return Buffer.concat([Buffer.from([255,254]),Buffer.from(t,"utf16le")]);case"utf16be":return Buffer.concat([Buffer.from([254,255]),W(Buffer.from(t,"utf16le"))]);default:return Buffer.from(t,"utf8")}}function z(t){return t.includes(`\r
4
+ `)?"CRLF":"LF"}function H(t,e){let n=t.replace(/\r\n/g,`
5
5
  `);return e==="CRLF"?n.replace(/\n/g,`\r
6
- `):n}async function z(t){let e=await c.readFile(t),n=D(e),r=j(e,n);return{content:r,encoding:n,lineEnding:q(r),sizeBytes:e.length}}async function $t(t,e,n){let r=X(e,n?.lineEnding??"LF");await P(t,W(r,n?.encoding??"utf8"))}async function Nt(t){let e=new Set,n=a.resolve(t);for(;!e.has(n);){e.add(n);try{let o=(0,w.readdirSync)(n,{withFileTypes:!0}).filter(i=>i.isFile()).map(i=>i.name).sort();for(let i of o){if(i.startsWith("."))continue;let s=a.extname(i).toLowerCase();if([".ts",".tsx",".js",".jsx",".json",".md",".txt",".yaml",".yml",".css",".html",".xml",".sh",".ps1"].includes(s))try{let u=a.join(n,i),f=await z(u);if(f.content.length>0)return f.lineEnding}catch{}}}catch{}let r=a.dirname(n);if(r===n)break;n=r}return"LF"}function vt(t,e,n){let r=[],o=[{dir:t,depth:0}],i=new Set;for(;o.length>0&&r.length<n;){let s=o.shift();if(!i.has(s.dir)){i.add(s.dir);try{let u=(0,w.readdirSync)(s.dir,{withFileTypes:!0});for(let f of u){let d=a.join(s.dir,f.name);if(f.isFile()){if(r.push(d),r.length>=n)break;continue}f.isDirectory()&&s.depth<e&&!f.name.startsWith(".")&&f.name!=="node_modules"&&o.push({dir:d,depth:s.depth+1})}}catch{}}}return r}function Ot(t){try{let e=a.dirname(t),n=a.basename(t,a.extname(t)).toLowerCase(),r=a.basename(t).toLowerCase(),i=[e,a.dirname(e)].flatMap(u=>vt(u,2,500)),s=null;for(let u of i){let f=a.basename(u).toLowerCase(),d=a.basename(u,a.extname(u)).toLowerCase(),g=null;if(f===r?g=0:d===n?g=1:(f.includes(n)||n.includes(d))&&(g=2),g===null)continue;let _=a.relative(e,u).split(a.sep).length,L=g+_*.01;(!s||L<s.score)&&(s={filePath:u,score:L})}return s?.filePath??null}catch{}return null}async function Lt(t){try{return await c.readFile(t,"utf-8")}catch(e){if(e.code==="ENOENT")return null;throw e}}function Bt(t){return(0,h.existsSync)(t)}async function Pt(t,e){try{let r=(await c.readdir(t,{withFileTypes:!0})).filter(o=>o.isFile()).map(o=>a.join(t,o.name));return e&&(r=r.filter(o=>e.test(a.basename(o)))),r}catch(n){if(n.code==="ENOENT")return[];throw n}}async function It(t){try{return(await c.readdir(t,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>a.join(t,n.name))}catch(e){if(e.code==="ENOENT")return[];throw e}}async function Dt(t){try{await c.unlink(t)}catch(e){if(e.code!=="ENOENT")throw e}}async function Ft(t){try{await c.rm(t,{recursive:!0,force:!0})}catch(e){if(e.code!=="ENOENT")throw e}}function jt(t,e){try{return JSON.parse(t)}catch{return e}}function Wt(t,e="{}"){try{return JSON.stringify(t)}catch{return e}}function qt(t){let e=[];for(let n of t.split(`
7
- `)){let r=n.trim();if(r)try{e.push(JSON.parse(r))}catch{}}return e}function Xt(t){let e=Jt(t);return{frontmatter:e.frontmatter,content:e.content.trim()}}function zt(t,e){let n=Object.fromEntries(Object.entries(t).filter(([r,o])=>o!==void 0));return["---",U(n),"---","",e].join(`
8
- `)}function Ht(t){return t.trimStart().startsWith("---")}function Jt(t){let e=t.replace(/^\uFEFF/,"");if(!e.startsWith("---"))return{frontmatter:{},content:t};let n=e.search(/\r?\n/);if(n<0||e.slice(0,n).trim()!=="---")return{frontmatter:{},content:t};let r=e.slice(n+(e[n]==="\r"?2:1)),o=r.match(/(?:^|\r?\n)---[ \t]*(?:\r?\n|$)/);if(!o||o.index===void 0)throw new Error("YAML frontmatter is not closed.");let i=r.slice(0,o.index),s=o[0],u=o.index+s.length;return{frontmatter:J(i),content:r.slice(u)}}function J(t){let e={},n=t.split(/\r?\n/);for(let r=0;r<n.length;r+=1){let o=n[r];if(!o.trim()||o.trimStart().startsWith("#"))continue;if(/^\s/.test(o))throw new Error(`Unexpected indentation at line ${r+1}.`);let i=Ut(o,r+1);if(i.key==="<<")throw new Error("YAML merge keys are not supported.");if(i.value!==""){e[i.key]=Y(i.value,r+1);continue}let s=Yt(n,r+1);e[i.key]=s.value,r=s.nextIndex-1}return e}function Yt(t,e){let n=[],r=e;for(;r<t.length;r+=1){let i=t[r];if(!i.trim()){n.push(i);continue}if(!/^\s/.test(i))break;n.push(i.replace(/^ {2}/,""))}let o=n.filter(i=>i.trim()&&!i.trimStart().startsWith("#"));return o.length===0?{value:{},nextIndex:r}:o.every(i=>i.trimStart().startsWith("- "))?{value:o.map((i,s)=>Y(i.trimStart().slice(2),e+s+1)),nextIndex:r}:{value:J(n.join(`
9
- `)),nextIndex:r}}function Ut(t,e){let n=t.indexOf(":");if(n<=0)throw new Error(`Invalid YAML line ${e}.`);let r=t.slice(0,n).trim(),o=t.slice(n+1).trim();if(!r)throw new Error(`Invalid YAML key at line ${e}.`);return{key:r,value:o}}function Y(t,e){if(t==="")return"";if(t==="[]")return[];if(t==="{}")return{};if(t==="true")return!0;if(t==="false")return!1;if(t==="null"||t==="~")return null;if(/^-?\d+(?:\.\d+)?$/.test(t))return Number(t);if(t.startsWith('"'))return H(t,e);if(t.startsWith("'")){if(!t.endsWith("'"))throw new Error(`Unclosed quoted scalar at line ${e}.`);return t.slice(1,-1).replace(/''/g,"'")}if(t.startsWith("[")||t.startsWith("{"))return H(t,e);if(t.includes("[")||t.includes("]")||t.includes("{")||t.includes("}"))throw new Error(`Unsupported YAML scalar at line ${e}.`);return t}function H(t,e){try{return JSON.parse(t)}catch{throw new Error(`Invalid YAML scalar at line ${e}.`)}}function U(t,e=""){return Object.entries(t).map(([n,r])=>Gt(n,r,e)).join(`
10
- `)}function Gt(t,e,n){return Array.isArray(e)?`${n}${t}: ${JSON.stringify(e)}`:e&&typeof e=="object"?`${n}${t}:
11
- ${U(e,`${n} `)}`:`${n}${t}: ${JSON.stringify(e)}`}var l=S(require("path"),1);function G(t,e){let n=l.resolve(t),r=l.resolve(t,e);return r===n?!0:n===l.parse(n).root?r.startsWith(n):r.startsWith(n+l.sep)}function Kt(t,e){if(l.isAbsolute(e))return l.resolve(e);if(!G(t,e))throw new Error(`PathSecurity: Path traversal attempt detected: ${e}`);return l.resolve(t,e)}var p=require("node:os"),K=require("node:child_process"),x=require("node:path"),T=(0,p.platform)(),Z=T==="win32",Zt=T==="darwin",Qt=T==="linux",Vt=(0,p.release)(),te=(0,p.homedir)();function ee(){let t=process.env.XENO_AGENT_HOME?.trim();return t?(0,x.resolve)(t):(0,x.resolve)((0,p.homedir)(),".xeno-agent")}function ne(){let t=process.env.XENO_CONFIG_DIR?.trim();return t?(0,x.resolve)(t):(0,x.resolve)((0,p.homedir)(),".xeno-code")}function re(t){return(0,x.resolve)(t,".xeno-code")}function oe(){return Z?"powershell":process.env.SHELL?.split("/").pop()??"bash"}function ie(t){try{return(0,K.execSync)("git rev-parse --is-inside-work-tree",{cwd:t,stdio:"ignore"}),!0}catch{return!1}}function se(t,e){for(let n of e)if(t[n]===void 0||t[n]===null||t[n]==="")return`Missing required parameter: ${n}`;return null}function ae(t,e,n){let r=t[e];if(r==null){if(n!==void 0)return n;throw new Error(`Missing required parameter: ${e}`)}if(typeof r!="string")throw new Error(`Parameter ${e} must be a string, got ${typeof r}`);return r}function ue(t,e,n){let r=t[e];if(r==null){if(n!==void 0)return n;throw new Error(`Missing required parameter: ${e}`)}if(typeof r!="number")throw new Error(`Parameter ${e} must be a number, got ${typeof r}`);if(isNaN(r))throw new Error(`Parameter ${e} is NaN`);return r}function ce(t,e,n){let r=t[e];if(r==null){if(n!==void 0)return n;throw new Error(`Missing required parameter: ${e}`)}if(typeof r!="boolean")throw new Error(`Parameter ${e} must be a boolean, got ${typeof r}`);return r}function Q(t){if(t.length>5e3)return"Pattern too long (max 5000 characters)";let n=[/(\.\*){3,}/,/(\+\+|\*\*)/,/(.*\+.*\+.*\+)/];for(let r of n)if(r.test(t))return"Pattern contains potentially unsafe constructs that could cause excessive backtracking";return null}function fe(t,e,n=5e3){let r=Q(t);if(r)throw new Error(r);try{return new RegExp(t,e)}catch(o){let i=o instanceof Error?o.message:String(o);throw new Error(`Invalid regex pattern: ${i}`)}}function le(t,e,n=1e3){if(e.length>1e5)throw new Error(`Input too large for safe regex test (${e.length} chars, max 100000)`);return t.test(e)}var V=(i=>(i[i.DEBUG=0]="DEBUG",i[i.INFO=1]="INFO",i[i.WARN=2]="WARN",i[i.ERROR=3]="ERROR",i[i.SILENT=4]="SILENT",i))(V||{}),y=1;function de(t){y=t}function pe(){return y}function m(){return new Date().toISOString()}function me(t,e){y<=0&&(e!==void 0?process.stderr.write(`[${m()}] DEBUG: ${t} ${A(e)}
6
+ `):n}function Ot(t){return t.includes(`\r
7
+ `)?/(^|[^\r])\n/.test(t):!1}async function J(t){let e=await u.readFile(t),n=j(e),r=q(e,n);return{content:r,encoding:n,lineEnding:z(r),sizeBytes:e.length}}async function Lt(t,e,n){let r=n?.preserveLineEndings?e:H(e,n?.lineEnding??"LF");await D(t,X(r,n?.encoding??"utf8"))}async function Bt(t){let e=new Set,n=a.resolve(t);for(;!e.has(n);){e.add(n);try{let o=(0,w.readdirSync)(n,{withFileTypes:!0}).filter(i=>i.isFile()).map(i=>i.name).sort();for(let i of o){if(i.startsWith("."))continue;let s=a.extname(i).toLowerCase();if([".ts",".tsx",".js",".jsx",".json",".md",".txt",".yaml",".yml",".css",".html",".xml",".sh",".ps1"].includes(s))try{let l=a.join(n,i),c=await J(l);if(c.content.length>0)return c.lineEnding}catch{}}}catch{}let r=a.dirname(n);if(r===n)break;n=r}return"LF"}function Pt(t,e,n){let r=[],o=[{dir:t,depth:0}],i=new Set;for(;o.length>0&&r.length<n;){let s=o.shift();if(!i.has(s.dir)){i.add(s.dir);try{let l=(0,w.readdirSync)(s.dir,{withFileTypes:!0});for(let c of l){let f=a.join(s.dir,c.name);if(c.isFile()){if(r.push(f),r.length>=n)break;continue}c.isDirectory()&&s.depth<e&&!c.name.startsWith(".")&&c.name!=="node_modules"&&o.push({dir:f,depth:s.depth+1})}}catch{}}}return r}function I(t,e){let n=a.relative(t,e);return n===""||!n.startsWith("..")&&!a.isAbsolute(n)}function It(t,e){try{let n=a.dirname(t),r=a.basename(t,a.extname(t)).toLowerCase(),o=a.basename(t).toLowerCase(),i=[n,a.dirname(n)],s=e!==void 0&&I(e,t)?e:void 0,l=i.flatMap(f=>Pt(f,2,500)).filter(f=>s===void 0||I(s,f)),c=null;for(let f of l){let E=a.basename(f).toLowerCase(),R=a.basename(f,a.extname(f)).toLowerCase(),y=null;if(E===o?y=0:R===r?y=1:(E.includes(r)||r.includes(R))&&(y=2),y===null)continue;let yt=a.relative(n,f).split(a.sep).length,B=y+yt*.01;(!c||B<c.score)&&(c={filePath:f,score:B})}return c?.filePath??null}catch{}return null}async function Dt(t){try{return await u.readFile(t,"utf-8")}catch(e){if(e.code==="ENOENT")return null;throw e}}function Ft(t){return(0,g.existsSync)(t)}async function jt(t,e){try{let r=(await u.readdir(t,{withFileTypes:!0})).filter(o=>o.isFile()).map(o=>a.join(t,o.name));return e&&(r=r.filter(o=>e.test(a.basename(o)))),r}catch(n){if(n.code==="ENOENT")return[];throw n}}async function Wt(t){try{return(await u.readdir(t,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>a.join(t,n.name))}catch(e){if(e.code==="ENOENT")return[];throw e}}async function qt(t){try{await u.unlink(t)}catch(e){if(e.code!=="ENOENT")throw e}}async function Xt(t){try{await u.rm(t,{recursive:!0,force:!0})}catch(e){if(e.code!=="ENOENT")throw e}}function zt(t,e){try{return JSON.parse(t)}catch{return e}}function Ht(t,e="{}"){try{return JSON.stringify(t)}catch{return e}}function Jt(t){let e=[];for(let n of t.split(`
8
+ `)){let r=n.trim();if(r)try{e.push(JSON.parse(r))}catch{}}return e}function Yt(t){let e=Kt(t);return{frontmatter:e.frontmatter,content:e.content.trim()}}function Ut(t,e){let n=Object.fromEntries(Object.entries(t).filter(([r,o])=>o!==void 0));return["---",K(n),"---","",e].join(`
9
+ `)}function Gt(t){return t.trimStart().startsWith("---")}function Kt(t){let e=t.replace(/^\uFEFF/,"");if(!e.startsWith("---"))return{frontmatter:{},content:t};let n=e.search(/\r?\n/);if(n<0||e.slice(0,n).trim()!=="---")return{frontmatter:{},content:t};let r=e.slice(n+(e[n]==="\r"?2:1)),o=r.match(/(?:^|\r?\n)---[ \t]*(?:\r?\n|$)/);if(!o||o.index===void 0)throw new Error("YAML frontmatter is not closed.");let i=r.slice(0,o.index),s=o[0],l=o.index+s.length;return{frontmatter:U(i),content:r.slice(l)}}function U(t){let e={},n=t.split(/\r?\n/);for(let r=0;r<n.length;r+=1){let o=n[r];if(!o.trim()||o.trimStart().startsWith("#"))continue;if(/^\s/.test(o))throw new Error(`Unexpected indentation at line ${r+1}.`);let i=Qt(o,r+1);if(i.key==="<<")throw new Error("YAML merge keys are not supported.");if(i.value!==""){e[i.key]=G(i.value,r+1);continue}let s=Zt(n,r+1);e[i.key]=s.value,r=s.nextIndex-1}return e}function Zt(t,e){let n=[],r=e;for(;r<t.length;r+=1){let i=t[r];if(!i.trim()){n.push(i);continue}if(!/^\s/.test(i))break;n.push(i.replace(/^ {2}/,""))}let o=n.filter(i=>i.trim()&&!i.trimStart().startsWith("#"));return o.length===0?{value:{},nextIndex:r}:o.every(i=>i.trimStart().startsWith("- "))?{value:o.map((i,s)=>G(i.trimStart().slice(2),e+s+1)),nextIndex:r}:{value:U(n.join(`
10
+ `)),nextIndex:r}}function Qt(t,e){let n=t.indexOf(":");if(n<=0)throw new Error(`Invalid YAML line ${e}.`);let r=t.slice(0,n).trim(),o=t.slice(n+1).trim();if(!r)throw new Error(`Invalid YAML key at line ${e}.`);return{key:r,value:o}}function G(t,e){if(t==="")return"";if(t==="[]")return[];if(t==="{}")return{};if(t==="true")return!0;if(t==="false")return!1;if(t==="null"||t==="~")return null;if(/^-?\d+(?:\.\d+)?$/.test(t))return Number(t);if(t.startsWith('"'))return Y(t,e);if(t.startsWith("'")){if(!t.endsWith("'"))throw new Error(`Unclosed quoted scalar at line ${e}.`);return t.slice(1,-1).replace(/''/g,"'")}if(t.startsWith("[")||t.startsWith("{"))return Y(t,e);if(t.includes("[")||t.includes("]")||t.includes("{")||t.includes("}"))throw new Error(`Unsupported YAML scalar at line ${e}.`);return t}function Y(t,e){try{return JSON.parse(t)}catch{throw new Error(`Invalid YAML scalar at line ${e}.`)}}function K(t,e=""){return Object.entries(t).map(([n,r])=>Vt(n,r,e)).join(`
11
+ `)}function Vt(t,e,n){return Array.isArray(e)?`${n}${t}: ${JSON.stringify(e)}`:e&&typeof e=="object"?`${n}${t}:
12
+ ${K(e,`${n} `)}`:`${n}${t}: ${JSON.stringify(e)}`}var d=$(require("path"),1);function Z(t,e){let n=d.resolve(t),r=d.resolve(t,e);return r===n?!0:n===d.parse(n).root?r.startsWith(n):r.startsWith(n+d.sep)}function te(t,e){if(d.isAbsolute(e))return d.resolve(e);if(!Z(t,e))throw new Error(`PathSecurity: Path traversal attempt detected: ${e}`);return d.resolve(t,e)}function ee(t,e=process.platform){let n=d.resolve(t);return e==="win32"?n.toLowerCase():n}var p=require("node:os"),Q=require("node:child_process"),h=require("node:path"),C=(0,p.platform)(),V=C==="win32",ne=C==="darwin",re=C==="linux",oe=(0,p.release)(),ie=(0,p.homedir)();function se(){let t=process.env.XENO_AGENT_HOME?.trim();return t?(0,h.resolve)(t):(0,h.resolve)((0,p.homedir)(),".xeno-agent")}function ae(){let t=process.env.XENO_CONFIG_DIR?.trim();return t?(0,h.resolve)(t):(0,h.resolve)((0,p.homedir)(),".xeno-code")}function ue(t){return(0,h.resolve)(t,".xeno-code")}function ce(){return V?"powershell":process.env.SHELL?.split("/").pop()??"bash"}function fe(t){try{return(0,Q.execSync)("git rev-parse --is-inside-work-tree",{cwd:t,stdio:"ignore"}),!0}catch{return!1}}function le(t,e){for(let n of e)if(t[n]===void 0||t[n]===null||t[n]==="")return`Missing required parameter: ${n}`;return null}function de(t,e,n){let r=t[e];if(r==null){if(n!==void 0)return n;throw new Error(`Missing required parameter: ${e}`)}if(typeof r!="string")throw new Error(`Parameter ${e} must be a string, got ${typeof r}`);return r}function pe(t,e,n){let r=t[e];if(r==null){if(n!==void 0)return n;throw new Error(`Missing required parameter: ${e}`)}if(typeof r!="number")throw new Error(`Parameter ${e} must be a number, got ${typeof r}`);if(isNaN(r))throw new Error(`Parameter ${e} is NaN`);return r}function me(t,e,n){let r=t[e];if(r==null){if(n!==void 0)return n;throw new Error(`Missing required parameter: ${e}`)}if(typeof r!="boolean")throw new Error(`Parameter ${e} must be a boolean, got ${typeof r}`);return r}function tt(t){if(t.length>5e3)return"Pattern too long (max 5000 characters)";let n=[/(\.\*){3,}/,/(\+\+|\*\*)/,/(.*\+.*\+.*\+)/];for(let r of n)if(r.test(t))return"Pattern contains potentially unsafe constructs that could cause excessive backtracking";return null}function ge(t,e,n=5e3){let r=tt(t);if(r)throw new Error(r);try{return new RegExp(t,e)}catch(o){let i=o instanceof Error?o.message:String(o);throw new Error(`Invalid regex pattern: ${i}`)}}function he(t,e,n=1e3){if(e.length>1e5)throw new Error(`Input too large for safe regex test (${e.length} chars, max 100000)`);return t.test(e)}var et=(i=>(i[i.DEBUG=0]="DEBUG",i[i.INFO=1]="INFO",i[i.WARN=2]="WARN",i[i.ERROR=3]="ERROR",i[i.SILENT=4]="SILENT",i))(et||{}),x=1;function xe(t){x=t}function ye(){return x}function m(){return new Date().toISOString()}function we(t,e){x<=0&&(e!==void 0?process.stderr.write(`[${m()}] DEBUG: ${t} ${k(e)}
12
13
  `):process.stderr.write(`[${m()}] DEBUG: ${t}
13
- `))}function ge(t,e){y<=1&&(e!==void 0?process.stderr.write(`[${m()}] INFO: ${t} ${A(e)}
14
+ `))}function be(t,e){x<=1&&(e!==void 0?process.stderr.write(`[${m()}] INFO: ${t} ${k(e)}
14
15
  `):process.stderr.write(`[${m()}] INFO: ${t}
15
- `))}function he(t,e){y<=2&&(e!==void 0?process.stderr.write(`[${m()}] WARN: ${t} ${A(e)}
16
+ `))}function Ee(t,e){x<=2&&(e!==void 0?process.stderr.write(`[${m()}] WARN: ${t} ${k(e)}
16
17
  `):process.stderr.write(`[${m()}] WARN: ${t}
17
- `))}function xe(t,e){y<=3&&(e!==void 0?process.stderr.write(`[${m()}] ERROR: ${t} ${A(e)}
18
+ `))}function Re(t,e){x<=3&&(e!==void 0?process.stderr.write(`[${m()}] ERROR: ${t} ${k(e)}
18
19
  `):process.stderr.write(`[${m()}] ERROR: ${t}
19
- `))}function A(t){if(t==null)return"";if(t instanceof Error)return t.message;if(typeof t=="string")return t;try{return JSON.stringify(t)}catch{return String(t)}}var ye=/^[A-Za-z0-9:._*-]{1,64}$/,we=/^[A-Za-z0-9_-][A-Za-z0-9 _-]{0,30}[A-Za-z0-9_-]$/,be=/^[0-9][0-9A-Za-z.+-]{0,40}$/;function Ee(t){if(!t||typeof t!="object")throw new TypeError("requestContext must be an object");let e=Object.keys(t).filter(r=>r!=="surface"&&r!=="client");if(e.length>0)throw new TypeError(`requestContext does not accept: ${e.join(", ")}`);if(typeof t.surface!="string"||!ye.test(t.surface))throw new TypeError("requestContext.surface must match /^[A-Za-z0-9:._*-]{1,64}$/");if(t.client===void 0)return Object.freeze({surface:t.surface});let n=t.client;if(!n||typeof n!="object"||Object.keys(n).some(r=>r!=="name"&&r!=="version"))throw new TypeError("requestContext.client must be { name, version }");if(typeof n.name!="string"||!we.test(n.name))throw new TypeError("requestContext.client.name must be 2-32 characters of letters, digits, space, _ or -");if(typeof n.version!="string"||!be.test(n.version))throw new TypeError("requestContext.client.version must start with a digit, e.g. 1.2.3");return Object.freeze({surface:t.surface,client:Object.freeze({name:n.name,version:n.version})})}function Re(t){return t?{"X-Xeno-Surface":t.surface,...t.client?{"X-Xeno-Client":`${t.client.name}/${t.client.version}`}:{}}:{}}var b=class extends Error{statusCode;body;retryAfterMs;requestId;cfRay;constructor(e,n={}){super(e),this.name="ApiTransientError",this.statusCode=n.statusCode,this.retryAfterMs=n.retryAfterMs,this.requestId=n.requestId,this.cfRay=n.cfRay}},C={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4,jitterMs:300};function k(t,e){let n=process.env[t],r=n?Number.parseInt(n,10):Number.NaN;return!Number.isFinite(r)||r<0?e:r}function Te(t={}){let e=Math.max(0,t.maxRetries??k("XENO_API_MAX_RETRIES",C.maxRetries)),n=Math.max(50,t.baseDelayMs??k("XENO_API_BASE_DELAY_MS",C.baseDelayMs)),r=Math.max(n,t.maxDelayMs??k("XENO_API_MAX_DELAY_MS",C.maxDelayMs)),o=Math.max(0,t.jitterMs??k("XENO_API_RETRY_JITTER_MS",C.jitterMs));return{maxRetries:e,baseDelayMs:n,maxDelayMs:r,jitterMs:o}}function Ae(t,e,n){if(e.retryAfterMs&&e.retryAfterMs>0)return Math.min(e.retryAfterMs,n.maxDelayMs);let r=Math.min(n.baseDelayMs*Math.pow(2,t),n.maxDelayMs),o=Math.floor(Math.random()*n.jitterMs);return Math.min(r+o,n.maxDelayMs)}function tt(t){let e=t.toLowerCase();return e.includes("rate limit")||e.includes("too many requests")||e.includes("429")}function Ce(t){let e=t.toLowerCase();return e.includes("network")||e.includes("timeout")||e.includes("fetch failed")||e.includes("socket hang up")||e.includes("econnreset")||e.includes("eai_again")||e.includes("enotfound")||e.includes("econnrefused")||e.includes("tls")||e.includes("temporarily unavailable")}function N(t){if(t instanceof b)return{statusCode:t.statusCode,retryAfterMs:t.retryAfterMs,requestId:t.requestId,cfRay:t.cfRay};if(!(t instanceof Error))return{};let e=t;if(e.statusCode!==void 0||e.retryAfterMs!==void 0||e.requestId!==void 0||e.cfRay!==void 0)return{statusCode:e.statusCode,retryAfterMs:e.retryAfterMs,requestId:e.requestId,cfRay:e.cfRay};let n=t.message.toLowerCase();return tt(n)?{statusCode:429}:{}}var $="408|425|429|500|502|503|504";function et(t){let e=new RegExp(`(?:\\bstatus(?:[ _-]?code)?\\b\\s*[=:]?\\s*|\\bhttp\\b\\s*|\\bapi\\b\\s*|\\bcode\\b\\s*[=:]\\s*|\\berror\\b\\s*)(?:${$})\\b`,"i"),n=new RegExp(`\\b(?:${$})\\s+(?:internal|bad\\s+gateway|service\\s+unavailable|gateway\\s+time|request\\s+time|too\\s+early|too\\s+many)`,"i"),r=new RegExp(`^\\s*(?:${$})\\b`);return e.test(t)||n.test(t)||r.test(t)}function nt(t){if(t&&typeof t=="object"&&"retryable"in t)return t.retryable===!0;if(t instanceof b){let{statusCode:e}=N(t);if(e)return e===429||e>=500||e===408||e===409||e===425}if(t instanceof Error){let e=t.name?.toLowerCase()??"";return e==="aborterror"||e==="agentinterruptederror"||t.message.toLowerCase().includes("aborted")||t.message.toLowerCase().includes("interrupted")?!1:et(t.message)?!0:tt(t.message)||Ce(t.message.toLowerCase())}return!1}function ke(t){if(t.onAbort)return t.onAbort();let e=new Error("The operation was aborted");return e.name="AbortError",e}async function Me(t,e={}){let n=Te(e),r;for(let o=0;o<=n.maxRetries;o++)try{if(e.signal?.aborted)throw ke(e);return e.onBeforeAttempt?.(o),await t()}catch(i){if(r=i,!(e.shouldRetry?e.shouldRetry(i,o):nt(i))||o===n.maxRetries)throw i;let u=N(i),f=Ae(o,u,n),d=e.getDelayMs?.(i,o,f),g=typeof d=="number"&&d>=0?d:f;await new Promise(_=>setTimeout(_,g))}throw r}var rt=(t,e)=>{if(!t)return 0;let n=e.toLowerCase(),r=n.includes("claude")?3.5:n.includes("gemini")?3.8:(/(^|[/_-])(gpt|o\d)/.test(n),4),o=[...t].filter(s=>s.codePointAt(0)>127).length,i=Math.ceil(t.length/r);return Math.max(1,i+Math.ceil(o*.35))},ot=Object.freeze({id:"xeno-conservative-v1",source:"estimated",countText:rt,countImage:({detail:t})=>t==="high"?2e3:t==="low"?512:1200,safetyMarginRatio:t=>{let e=t.toLowerCase();return e.includes("claude")?.12:e.includes("gemini")?.14:/(^|[/_-])(gpt|o\d)/.test(e)?.1:.18}});function _e(t,e,n=ot){return{tokens:Math.max(0,Math.ceil(n.countText(t,e))),source:n.source,adapterId:n.id}}function it(t){return t?Math.ceil(t.length/4):0}function Se(t,e){if(!t||e<=0)return"";let n=e*4;if(t.length<=n)return t;let r=t.slice(0,n),o=r.lastIndexOf(" ");return o>n*.8&&(r=r.slice(0,o)),r+"..."}function $e(t,e){return it(t)<=e}function Ne(t,e){return Math.max(0,e-t)}var ve={"claude-opus-4-6-thinking":{input:15,output:75},"claude-opus-4-6":{input:15,output:75},"claude-opus-4-5-thinking":{input:15,output:75},"claude-sonnet-4-6":{input:3,output:15},"claude-sonnet-4-5-thinking":{input:3,output:15},"claude-sonnet-4-5":{input:3,output:15},"gemini-2.5-flash":{input:.15,output:.6},"gemini-2.5-flash-lite":{input:.075,output:.3},"gemini-3-flash":{input:.15,output:.6},"gemini-3-pro-high":{input:1.25,output:5},"gpt-5":{input:5,output:15},"gpt-5-codex":{input:5,output:15},"gpt-5.1":{input:5,output:15},"gpt-5.1-codex":{input:5,output:15},"gpt-5.2":{input:5,output:15},"gpt-5.2-codex":{input:5,output:15},"kimi-k2":{input:.6,output:2.4},"kimi-k2-thinking":{input:.6,output:2.4},"kimi-k2.5":{input:.6,output:2.4}};function Oe(t,e,n){let r=ve[t];return r?e/1e6*r.input+n/1e6*r.output:0}function Le(t){return t<=0?"$0.00":t<.001?"<$0.001":t<.01?`$${t.toFixed(4)}`:t<1?`$${t.toFixed(3)}`:`$${t.toFixed(2)}`}var st=require("node:child_process");function Be(t){let e=process.platform==="win32"?[{command:"clip.exe",args:[]}]:process.platform==="darwin"?[{command:"pbcopy",args:[]}]:[{command:"wl-copy",args:[]},{command:"xclip",args:["-selection","clipboard"]},{command:"xsel",args:["--clipboard","--input"]}],n=null;for(let r of e)try{let o=(0,st.spawnSync)(r.command,r.args,{input:t,encoding:"utf8"});if(o.error){n=o.error.message;continue}if(o.status===0)return;n=o.stderr||o.stdout||`exit ${o.status}`}catch(o){n=o instanceof Error?o.message:String(o)}throw new Error(`Clipboard copy failed${n?`: ${n}`:""}`)}function ut(t){return t.replace(/\\/g,"/").toLowerCase()}var Pe=["golden","solution","answer","expected"],Ie=["expected","golden","reference","answer","answers"],De=new Set([";","&&","||","|"]);function ct(t){return ut(t).replace(/^\.\/+/,"").split("/").map(e=>e.trim()).filter(e=>e.length>0)}function Fe(t){return Pe.some(e=>t.includes(e))}function at(t){return Ie.some(e=>t.includes(e))}function ft(t){return t.split("::",1)[0]?.split("?",1)[0]?.split("#",1)[0]??t}function M(t){let e=t.trim().replace(/^[({]+/,"").replace(/[),;]+$/,"");return(e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'"))&&(e=e.slice(1,-1)),e}function je(t){return t.match(/"[^"]*"|'[^']*'|&&|\|\||[;|]|[^\s;|&]+/g)?.map(M).filter(e=>e.length>0)??[]}function lt(t){let e=ct(t),n=ft(e.at(-1)??"");return at(n)||e.some(r=>at(r))}function dt(t){let e=ut(M(t));return!e||e==="/dev/null"||e.startsWith("/tmp/")||e.startsWith("tmp/")||e.startsWith("/var/tmp/")||e.startsWith("var/tmp/")?!1:e.startsWith("/app/")||e.startsWith("./")?!0:!e.startsWith("/")}function We(t){return/[\\/]/.test(t)||/\.[A-Za-z0-9]{1,8}$/.test(t)}function qe(t){let e=je(t);for(let n=0;n<e.length;n+=1){let r=e[n]?.toLowerCase();if(r!=="cp"&&r!=="mv"&&r!=="rsync"&&r!=="install")continue;let o=[];for(let s=n+1;s<e.length;s+=1){let u=e[s];if(!u||De.has(u))break;u!=="--"&&(u.startsWith("-")||o.push(u))}if(o.length<2)continue;let i=o.at(-1);if(dt(i)){for(let s of o.slice(0,-1))if(We(s)&&lt(s))return{sourcePath:s,destinationPath:i,operation:r}}}return null}function Xe(t){let e=[/\bcat\s+(?:"([^"]+)"|'([^']+)'|([^\s;&|]+))\s*>\s*(?:"([^"]+)"|'([^']+)'|([^\s;&|]+))/i,/\bdd\b[\s\S]*?\bif=(?:"([^"]+)"|'([^']+)'|([^\s;&|]+))[\s\S]*?\bof=(?:"([^"]+)"|'([^']+)'|([^\s;&|]+))/i];for(let n of e){let r=t.match(n);if(!r)continue;let o=M(r[1]??r[2]??r[3]??""),i=M(r[4]??r[5]??r[6]??"");if(!(!o||!i)&&lt(o)&&dt(i))return{sourcePath:o,destinationPath:i,operation:n.source.startsWith("\\bdd")?"dd":"redirect"}}return null}function v(){return process.env.XENO_BENCHMARK_MODE?.trim().toLowerCase()==="terminal-bench"}function O(t){let e=ct(t);if(e.includes("solution")||e.includes("xeno-audit")||e.includes(".xeno")&&e.includes("audit"))return!0;let n=ft(e.at(-1)??"");return e.includes("tests")&&Fe(n)}function ze(t){return v()?t.filter(e=>!O(e)):t}function He(t){return`Benchmark safety: access to verifier answer or benchmark trace artifacts is blocked (${t}). Use task inputs and verifier logic, not golden, solution, or agent audit files.`}function Je(t){return t.split(/[\s"'`;|&]+/).map(e=>e.trim()).filter(e=>e.length>0&&/[\\/]/.test(e)).some(e=>O(e))}function Ye(t){if(!v())return null;let e=qe(t)??Xe(t);return e?["[xeno guidance]",`Benchmark safety blocked ${e.operation} from reference-like source ${e.sourcePath} to protected destination ${e.destinationPath}.`,"Do not copy expected, golden, reference, or answer files over task inputs or submission artifacts to make validation pass.","If a previous check polluted an input, restore/regenerate the original source input, then rerun the actual script or program under test."].join(`
20
- `):null}function Ue(t){return/^data:([^;,]+)[;,]/i.exec(t.trim())?.[1]}function pt(t){let e=[];for(let n of t){if(n.type==="text"){e.push(n.text);continue}if(n.type==="image_url"){e.push(`[image ${Ue(n.image_url.url)??"unknown"}]`);continue}let r=n.text??n.data;if(r&&r.trim().length>0){e.push(r);continue}let o=n.uri??n.mimeType??"resource";e.push(`[resource ${o}]`)}return e.join(`
20
+ `))}function k(t){if(t==null)return"";if(t instanceof Error)return t.message;if(typeof t=="string")return t;try{return JSON.stringify(t)}catch{return String(t)}}var Te=/^[A-Za-z0-9:._*-]{1,64}$/,Ae=/^[A-Za-z0-9_-][A-Za-z0-9 _-]{0,30}[A-Za-z0-9_-]$/,Ce=/^[0-9][0-9A-Za-z.+-]{0,40}$/;function ke(t){if(!t||typeof t!="object")throw new TypeError("requestContext must be an object");let e=Object.keys(t).filter(r=>r!=="surface"&&r!=="client");if(e.length>0)throw new TypeError(`requestContext does not accept: ${e.join(", ")}`);if(typeof t.surface!="string"||!Te.test(t.surface))throw new TypeError("requestContext.surface must match /^[A-Za-z0-9:._*-]{1,64}$/");if(t.client===void 0)return Object.freeze({surface:t.surface});let n=t.client;if(!n||typeof n!="object"||Object.keys(n).some(r=>r!=="name"&&r!=="version"))throw new TypeError("requestContext.client must be { name, version }");if(typeof n.name!="string"||!Ae.test(n.name))throw new TypeError("requestContext.client.name must be 2-32 characters of letters, digits, space, _ or -");if(typeof n.version!="string"||!Ce.test(n.version))throw new TypeError("requestContext.client.version must start with a digit, e.g. 1.2.3");return Object.freeze({surface:t.surface,client:Object.freeze({name:n.name,version:n.version})})}function Me(t){return t?{"X-Xeno-Surface":t.surface,...t.client?{"X-Xeno-Client":`${t.client.name}/${t.client.version}`}:{}}:{}}var b=class extends Error{statusCode;body;retryAfterMs;requestId;cfRay;constructor(e,n={}){super(e),this.name="ApiTransientError",this.statusCode=n.statusCode,this.retryAfterMs=n.retryAfterMs,this.requestId=n.requestId,this.cfRay=n.cfRay}},M={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4,jitterMs:300};function _(t,e){let n=process.env[t],r=n?Number.parseInt(n,10):Number.NaN;return!Number.isFinite(r)||r<0?e:r}function _e(t={}){let e=Math.max(0,t.maxRetries??_("XENO_API_MAX_RETRIES",M.maxRetries)),n=Math.max(50,t.baseDelayMs??_("XENO_API_BASE_DELAY_MS",M.baseDelayMs)),r=Math.max(n,t.maxDelayMs??_("XENO_API_MAX_DELAY_MS",M.maxDelayMs)),o=Math.max(0,t.jitterMs??_("XENO_API_RETRY_JITTER_MS",M.jitterMs));return{maxRetries:e,baseDelayMs:n,maxDelayMs:r,jitterMs:o}}function Se(t,e,n){if(e.retryAfterMs&&e.retryAfterMs>0)return Math.min(e.retryAfterMs,n.maxDelayMs);let r=Math.min(n.baseDelayMs*Math.pow(2,t),n.maxDelayMs),o=Math.floor(Math.random()*n.jitterMs);return Math.min(r+o,n.maxDelayMs)}function nt(t){let e=t.toLowerCase();return e.includes("rate limit")||e.includes("too many requests")||e.includes("429")}function $e(t){let e=t.toLowerCase();return e.includes("network")||e.includes("timeout")||e.includes("fetch failed")||e.includes("socket hang up")||e.includes("econnreset")||e.includes("eai_again")||e.includes("enotfound")||e.includes("econnrefused")||e.includes("tls")||e.includes("temporarily unavailable")}function N(t){if(t instanceof b)return{statusCode:t.statusCode,retryAfterMs:t.retryAfterMs,requestId:t.requestId,cfRay:t.cfRay};if(!(t instanceof Error))return{};let e=t;if(e.statusCode!==void 0||e.retryAfterMs!==void 0||e.requestId!==void 0||e.cfRay!==void 0)return{statusCode:e.statusCode,retryAfterMs:e.retryAfterMs,requestId:e.requestId,cfRay:e.cfRay};let n=t.message.toLowerCase();return nt(n)?{statusCode:429}:{}}var v="408|425|429|500|502|503|504";function rt(t){let e=new RegExp(`(?:\\bstatus(?:[ _-]?code)?\\b\\s*[=:]?\\s*|\\bhttp\\b\\s*|\\bapi\\b\\s*|\\bcode\\b\\s*[=:]\\s*|\\berror\\b\\s*)(?:${v})\\b`,"i"),n=new RegExp(`\\b(?:${v})\\s+(?:internal|bad\\s+gateway|service\\s+unavailable|gateway\\s+time|request\\s+time|too\\s+early|too\\s+many)`,"i"),r=new RegExp(`^\\s*(?:${v})\\b`);return e.test(t)||n.test(t)||r.test(t)}function ot(t){if(t&&typeof t=="object"&&"retryable"in t)return t.retryable===!0;if(t instanceof b){let{statusCode:e}=N(t);if(e)return e===429||e>=500||e===408||e===409||e===425}if(t instanceof Error){let e=t.name?.toLowerCase()??"";return e==="aborterror"||e==="agentinterruptederror"||t.message.toLowerCase().includes("aborted")||t.message.toLowerCase().includes("interrupted")?!1:rt(t.message)?!0:nt(t.message)||$e(t.message.toLowerCase())}return!1}function ve(t){if(t.onAbort)return t.onAbort();let e=new Error("The operation was aborted");return e.name="AbortError",e}async function Ne(t,e={}){let n=_e(e),r;for(let o=0;o<=n.maxRetries;o++)try{if(e.signal?.aborted)throw ve(e);return e.onBeforeAttempt?.(o),await t()}catch(i){if(r=i,!(e.shouldRetry?e.shouldRetry(i,o):ot(i))||o===n.maxRetries)throw i;let l=N(i),c=Se(o,l,n),f=e.getDelayMs?.(i,o,c),E=typeof f=="number"&&f>=0?f:c;await new Promise(R=>setTimeout(R,E))}throw r}var it=(t,e)=>{if(!t)return 0;let n=e.toLowerCase(),r=n.includes("claude")?3.5:n.includes("gemini")?3.8:(/(^|[/_-])(gpt|o\d)/.test(n),4),o=[...t].filter(s=>s.codePointAt(0)>127).length,i=Math.ceil(t.length/r);return Math.max(1,i+Math.ceil(o*.35))},st=Object.freeze({id:"xeno-conservative-v1",source:"estimated",countText:it,countImage:({detail:t})=>t==="high"?2e3:t==="low"?512:1200,safetyMarginRatio:t=>{let e=t.toLowerCase();return e.includes("claude")?.12:e.includes("gemini")?.14:/(^|[/_-])(gpt|o\d)/.test(e)?.1:.18}});function Oe(t,e,n=st){return{tokens:Math.max(0,Math.ceil(n.countText(t,e))),source:n.source,adapterId:n.id}}function at(t){return t?Math.ceil(t.length/4):0}function Le(t,e){if(!t||e<=0)return"";let n=e*4;if(t.length<=n)return t;let r=t.slice(0,n),o=r.lastIndexOf(" ");return o>n*.8&&(r=r.slice(0,o)),r+"..."}function Be(t,e){return at(t)<=e}function Pe(t,e){return Math.max(0,e-t)}var Ie={"claude-opus-4-6-thinking":{input:15,output:75},"claude-opus-4-6":{input:15,output:75},"claude-opus-4-5-thinking":{input:15,output:75},"claude-sonnet-4-6":{input:3,output:15},"claude-sonnet-4-5-thinking":{input:3,output:15},"claude-sonnet-4-5":{input:3,output:15},"gemini-2.5-flash":{input:.15,output:.6},"gemini-2.5-flash-lite":{input:.075,output:.3},"gemini-3-flash":{input:.15,output:.6},"gemini-3-pro-high":{input:1.25,output:5},"gpt-5":{input:5,output:15},"gpt-5-codex":{input:5,output:15},"gpt-5.1":{input:5,output:15},"gpt-5.1-codex":{input:5,output:15},"gpt-5.2":{input:5,output:15},"gpt-5.2-codex":{input:5,output:15},"kimi-k2":{input:.6,output:2.4},"kimi-k2-thinking":{input:.6,output:2.4},"kimi-k2.5":{input:.6,output:2.4}};function De(t,e,n){let r=Ie[t];return r?e/1e6*r.input+n/1e6*r.output:0}function Fe(t){return t<=0?"$0.00":t<.001?"<$0.001":t<.01?`$${t.toFixed(4)}`:t<1?`$${t.toFixed(3)}`:`$${t.toFixed(2)}`}var ut=require("node:child_process");function je(t){let e=process.platform==="win32"?[{command:"clip.exe",args:[]}]:process.platform==="darwin"?[{command:"pbcopy",args:[]}]:[{command:"wl-copy",args:[]},{command:"xclip",args:["-selection","clipboard"]},{command:"xsel",args:["--clipboard","--input"]}],n=null;for(let r of e)try{let o=(0,ut.spawnSync)(r.command,r.args,{input:t,encoding:"utf8"});if(o.error){n=o.error.message;continue}if(o.status===0)return;n=o.stderr||o.stdout||`exit ${o.status}`}catch(o){n=o instanceof Error?o.message:String(o)}throw new Error(`Clipboard copy failed${n?`: ${n}`:""}`)}function ft(t){return t.replace(/\\/g,"/").toLowerCase()}var We=["golden","solution","answer","expected"],qe=["expected","golden","reference","answer","answers"],Xe=new Set([";","&&","||","|"]);function lt(t){return ft(t).replace(/^\.\/+/,"").split("/").map(e=>e.trim()).filter(e=>e.length>0)}function ze(t){return We.some(e=>t.includes(e))}function ct(t){return qe.some(e=>t.includes(e))}function dt(t){return t.split("::",1)[0]?.split("?",1)[0]?.split("#",1)[0]??t}function S(t){let e=t.trim().replace(/^[({]+/,"").replace(/[),;]+$/,"");return(e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'"))&&(e=e.slice(1,-1)),e}function He(t){return t.match(/"[^"]*"|'[^']*'|&&|\|\||[;|]|[^\s;|&]+/g)?.map(S).filter(e=>e.length>0)??[]}function pt(t){let e=lt(t),n=dt(e.at(-1)??"");return ct(n)||e.some(r=>ct(r))}function mt(t){let e=ft(S(t));return!e||e==="/dev/null"||e.startsWith("/tmp/")||e.startsWith("tmp/")||e.startsWith("/var/tmp/")||e.startsWith("var/tmp/")?!1:e.startsWith("/app/")||e.startsWith("./")?!0:!e.startsWith("/")}function Je(t){return/[\\/]/.test(t)||/\.[A-Za-z0-9]{1,8}$/.test(t)}function Ye(t){let e=He(t);for(let n=0;n<e.length;n+=1){let r=e[n]?.toLowerCase();if(r!=="cp"&&r!=="mv"&&r!=="rsync"&&r!=="install")continue;let o=[];for(let s=n+1;s<e.length;s+=1){let l=e[s];if(!l||Xe.has(l))break;l!=="--"&&(l.startsWith("-")||o.push(l))}if(o.length<2)continue;let i=o.at(-1);if(mt(i)){for(let s of o.slice(0,-1))if(Je(s)&&pt(s))return{sourcePath:s,destinationPath:i,operation:r}}}return null}function Ue(t){let e=[/\bcat\s+(?:"([^"]+)"|'([^']+)'|([^\s;&|]+))\s*>\s*(?:"([^"]+)"|'([^']+)'|([^\s;&|]+))/i,/\bdd\b[\s\S]*?\bif=(?:"([^"]+)"|'([^']+)'|([^\s;&|]+))[\s\S]*?\bof=(?:"([^"]+)"|'([^']+)'|([^\s;&|]+))/i];for(let n of e){let r=t.match(n);if(!r)continue;let o=S(r[1]??r[2]??r[3]??""),i=S(r[4]??r[5]??r[6]??"");if(!(!o||!i)&&pt(o)&&mt(i))return{sourcePath:o,destinationPath:i,operation:n.source.startsWith("\\bdd")?"dd":"redirect"}}return null}function O(){return process.env.XENO_BENCHMARK_MODE?.trim().toLowerCase()==="terminal-bench"}function L(t){let e=lt(t);if(e.includes("solution")||e.includes("xeno-audit")||e.includes(".xeno")&&e.includes("audit"))return!0;let n=dt(e.at(-1)??"");return e.includes("tests")&&ze(n)}function Ge(t){return O()?t.filter(e=>!L(e)):t}function Ke(t){return`Benchmark safety: access to verifier answer or benchmark trace artifacts is blocked (${t}). Use task inputs and verifier logic, not golden, solution, or agent audit files.`}function Ze(t){return t.split(/[\s"'`;|&]+/).map(e=>e.trim()).filter(e=>e.length>0&&/[\\/]/.test(e)).some(e=>L(e))}function Qe(t){if(!O())return null;let e=Ye(t)??Ue(t);return e?["[xeno guidance]",`Benchmark safety blocked ${e.operation} from reference-like source ${e.sourcePath} to protected destination ${e.destinationPath}.`,"Do not copy expected, golden, reference, or answer files over task inputs or submission artifacts to make validation pass.","If a previous check polluted an input, restore/regenerate the original source input, then rerun the actual script or program under test."].join(`
21
+ `):null}function Ve(t){return/^data:([^;,]+)[;,]/i.exec(t.trim())?.[1]}function gt(t){let e=[];for(let n of t){if(n.type==="text"){e.push(n.text);continue}if(n.type==="image_url"){e.push(`[image ${Ve(n.image_url.url)??"unknown"}]`);continue}let r=n.text??n.data;if(r&&r.trim().length>0){e.push(r);continue}let o=n.uri??n.mimeType??"resource";e.push(`[resource ${o}]`)}return e.join(`
21
22
 
22
- `).trim()}function mt(t){let e=t.trim();return e.length>0?[{type:"text",text:e}]:[]}function Ge(t){return typeof t=="string"?t:pt(t)}function gt(t){if(t.success)return t.output;let e=[`Error: ${t.error??"Tool execution failed"}`];return t.output.trim().length>0&&e.push(t.output),e.join(`
23
- `)}function Ke(t){let e=t.assistant_content&&t.assistant_content.length>0?t.assistant_content:typeof t.content=="string"?mt(t.content):t.content,n=t.assistant_only_content??[],r=Ze(t),o=[...e,...n,...r?[r]:[]];return o.length>0?o:t.content}function Ze(t){let e=t.operation;if(!e)return null;let n=t.evidence??e.evidence??[],r=n.filter(i=>i.status==="verified").length,o=n.filter(i=>i.status==="failed").length;return{type:"text",text:["[xeno_operation]",`operation_id: ${e.operationId}`,`state: ${e.state}`,`terminal: ${e.terminal?"yes":"no"}`,`completion_policy: ${e.completionPolicy}`,e.taskId?`task_id: ${e.taskId}`:null,e.completionReason?`completion_reason: ${e.completionReason}`:null,`evidence: ${r} verified, ${o} failed`,t.retryable===void 0?null:`retryable: ${t.retryable?"yes":"no"}`,"[/xeno_operation]"].filter(i=>!!i).join(`
24
- `)}}function Qe(t){return Array.isArray(t)&&t.some(e=>e.type!=="text")}function Ve(t){return typeof t=="string"?mt(t):t}function tn(t,e){return{type:"tool_result",tool_use_id:t,content:gt(e),...e.assistantContent&&e.assistantContent.length>0?{assistant_content:e.assistantContent}:{},...e.assistantOnlyContent&&e.assistantOnlyContent.length>0?{assistant_only_content:e.assistantOnlyContent}:{},is_error:!e.success,...e.operation?{operation:e.operation}:{},...e.evidence&&e.evidence.length>0?{evidence:e.evidence}:{},...e.webContext?{web_context:e.webContext}:{},...e.retryable!==void 0?{retryable:e.retryable}:{}}}function en(t,e={}){for(let n of t){let r=n.codePointAt(0);if(r===127)return!0;if(!(r>31)&&!(r===9&&e.allowTab===!0)&&!((r===10||r===13)&&e.allowLineBreaks===!0))return!0}return!1}0&&(module.exports={ApiTransientError,HOME_DIR,IS_LINUX,IS_MAC,IS_WINDOWS,LogLevel,OS_VERSION,PLATFORM,accountTextTokens,appendDurableLine,appendLine,benchmarkLeakError,buildToolResultBlock,buildToolResultText,calculateCost,commandMentionsBenchmarkLeak,conservativeTokenAccountingAdapter,copyTextToClipboard,createSafeRegex,debug,decodeTextBuffer,deleteDir,deleteFile,detectLineEnding,detectPreferredLineEnding,detectTextEncoding,encodeTextBuffer,ensureDir,error,estimateTokens,estimateTokensForModel,existsSync,filterBenchmarkLeakPaths,findSimilarFile,fitsInBudget,formatCost,getAgentHome,getBenchmarkReferenceOverwriteHint,getBoolean,getConfigDir,getLogLevel,getNumber,getProjectConfigDir,getRetryErrorContext,getShellName,getString,getToolResultTransportContent,hasDir,hasDisallowedAsciiControlCharacter,hasFile,hasFrontmatter,hasNonTextToolResultContent,hasTransientStatusMention,info,isBenchmarkLeakPath,isBenchmarkMode,isGitRepo,isPathSafe,isRetryableError,listDirs,listFiles,normalizeLineEndings,normalizeXenoRequestContext,parseDocument,parseJsonLines,readFileSafe,readIfExists,readTextFile,remainingBudget,renameReplacingWithRetry,safeJsonParse,safeJsonStringify,safeRegexTest,safeResolvePath,setLogLevel,stringifyDocument,toTransportAssistantBlocks,toolAssistantContentToText,toolResultContentToText,truncateToTokens,validateRegexPattern,validateRequired,warn,withRetry,writeAtomic,writeTextFile,xenoRequestContextHeaders});
23
+ `).trim()}function ht(t){let e=t.trim();return e.length>0?[{type:"text",text:e}]:[]}function tn(t){return typeof t=="string"?t:gt(t)}function xt(t){if(t.success)return t.output;let e=[`Error: ${t.error??"Tool execution failed"}`];return t.output.trim().length>0&&e.push(t.output),e.join(`
24
+ `)}function en(t){let e=t.assistant_content&&t.assistant_content.length>0?t.assistant_content:typeof t.content=="string"?ht(t.content):t.content,n=t.assistant_only_content??[],r=nn(t),o=[...e,...n,...r?[r]:[]];return o.length>0?o:t.content}function nn(t){let e=t.operation;if(!e)return null;let n=t.evidence??e.evidence??[],r=n.filter(i=>i.status==="verified").length,o=n.filter(i=>i.status==="failed").length;return{type:"text",text:["[xeno_operation]",`operation_id: ${e.operationId}`,`state: ${e.state}`,`terminal: ${e.terminal?"yes":"no"}`,`completion_policy: ${e.completionPolicy}`,e.taskId?`task_id: ${e.taskId}`:null,e.completionReason?`completion_reason: ${e.completionReason}`:null,`evidence: ${r} verified, ${o} failed`,t.retryable===void 0?null:`retryable: ${t.retryable?"yes":"no"}`,"[/xeno_operation]"].filter(i=>!!i).join(`
25
+ `)}}function rn(t){return Array.isArray(t)&&t.some(e=>e.type!=="text")}function on(t){return typeof t=="string"?ht(t):t}function sn(t,e){return{type:"tool_result",tool_use_id:t,content:xt(e),...e.assistantContent&&e.assistantContent.length>0?{assistant_content:e.assistantContent}:{},...e.assistantOnlyContent&&e.assistantOnlyContent.length>0?{assistant_only_content:e.assistantOnlyContent}:{},is_error:!e.success,...e.operation?{operation:e.operation}:{},...e.evidence&&e.evidence.length>0?{evidence:e.evidence}:{},...e.webContext?{web_context:e.webContext}:{},...e.retryable!==void 0?{retryable:e.retryable}:{}}}function an(t,e={}){for(let n of t){let r=n.codePointAt(0);if(r===127)return!0;if(!(r>31)&&!(r===9&&e.allowTab===!0)&&!((r===10||r===13)&&e.allowLineBreaks===!0))return!0}return!1}0&&(module.exports={ApiTransientError,HOME_DIR,IS_LINUX,IS_MAC,IS_WINDOWS,LogLevel,OS_VERSION,PLATFORM,accountTextTokens,appendDurableLine,appendLine,benchmarkLeakError,buildToolResultBlock,buildToolResultText,calculateCost,commandMentionsBenchmarkLeak,conservativeTokenAccountingAdapter,copyTextToClipboard,createSafeRegex,debug,decodeTextBuffer,deleteDir,deleteFile,detectLineEnding,detectPreferredLineEnding,detectTextEncoding,encodeTextBuffer,ensureDir,error,estimateTokens,estimateTokensForModel,existsSync,filterBenchmarkLeakPaths,findSimilarFile,fitsInBudget,formatCost,getAgentHome,getBenchmarkReferenceOverwriteHint,getBoolean,getConfigDir,getLogLevel,getNumber,getProjectConfigDir,getRetryErrorContext,getShellName,getString,getToolResultTransportContent,hasDir,hasDisallowedAsciiControlCharacter,hasFile,hasFrontmatter,hasMixedLineEndings,hasNonTextToolResultContent,hasTransientStatusMention,info,isBenchmarkLeakPath,isBenchmarkMode,isGitRepo,isPathSafe,isRetryableError,listDirs,listFiles,normalizeLineEndings,normalizeXenoRequestContext,parseDocument,parseJsonLines,pathIdentityKey,readFileSafe,readIfExists,readTextFile,remainingBudget,renameReplacingWithRetry,safeJsonParse,safeJsonStringify,safeRegexTest,safeResolvePath,setLogLevel,stringifyDocument,toTransportAssistantBlocks,toolAssistantContentToText,toolResultContentToText,truncateToTokens,validateRegexPattern,validateRequired,warn,withRetry,writeAtomic,writeTextFile,xenoRequestContextHeaders});
@@ -20,13 +20,15 @@ declare function decodeTextBuffer(buffer: Buffer, encoding: TextEncoding): strin
20
20
  declare function encodeTextBuffer(content: string, encoding: TextEncoding): Buffer;
21
21
  declare function detectLineEnding(content: string): LineEnding;
22
22
  declare function normalizeLineEndings(content: string, lineEnding: LineEnding): string;
23
+ declare function hasMixedLineEndings(content: string): boolean;
23
24
  declare function readTextFile(filePath: string): Promise<TextFileContents>;
24
25
  declare function writeTextFile(filePath: string, content: string, options?: {
25
26
  encoding?: TextEncoding;
26
27
  lineEnding?: LineEnding;
28
+ preserveLineEndings?: boolean;
27
29
  }): Promise<void>;
28
30
  declare function detectPreferredLineEnding(baseDir: string): Promise<LineEnding>;
29
- declare function findSimilarFile(filePath: string): string | null;
31
+ declare function findSimilarFile(filePath: string, boundary?: string): string | null;
30
32
  declare function readIfExists(filePath: string): Promise<string | null>;
31
33
  declare function existsSync(filePath: string): boolean;
32
34
  declare function listFiles(dir: string, pattern?: RegExp): Promise<string[]>;
@@ -45,6 +47,7 @@ declare function stringifyDocument(frontmatter: Record<string, unknown>, content
45
47
  declare function hasFrontmatter(raw: string): boolean;
46
48
  declare function isPathSafe(basePath: string, targetPath: string): boolean;
47
49
  declare function safeResolvePath(basePath: string, targetPath: string): string;
50
+ declare function pathIdentityKey(filePath: string, platform?: NodeJS.Platform): string;
48
51
  declare const PLATFORM: NodeJS.Platform;
49
52
  declare const IS_WINDOWS: boolean;
50
53
  declare const IS_MAC: boolean;
@@ -296,4 +299,4 @@ interface XenoAsciiControlCharacterPolicy {
296
299
  allowLineBreaks?: boolean;
297
300
  }
298
301
  declare function hasDisallowedAsciiControlCharacter(value: string, policy?: XenoAsciiControlCharacterPolicy): boolean;
299
- export { ApiTransientError, HOME_DIR, IS_LINUX, IS_MAC, IS_WINDOWS, type LineEnding, LogLevel, OS_VERSION, PLATFORM, type ParsedDocument, type RetryErrorContext, type RetryOptions, type TextEncoding, type TextFileContents, type TokenAccountingAdapter, type TokenAccountingResult, type TokenAccountingSource, type TokenEstimator, type XenoAsciiControlCharacterPolicy, type XenoRequestContext, accountTextTokens, appendDurableLine, appendLine, benchmarkLeakError, buildToolResultBlock, buildToolResultText, calculateCost, commandMentionsBenchmarkLeak, conservativeTokenAccountingAdapter, copyTextToClipboard, createSafeRegex, debug, decodeTextBuffer, deleteDir, deleteFile, detectLineEnding, detectPreferredLineEnding, detectTextEncoding, encodeTextBuffer, ensureDir, error, estimateTokens, estimateTokensForModel, existsSync, filterBenchmarkLeakPaths, findSimilarFile, fitsInBudget, formatCost, getAgentHome, getBenchmarkReferenceOverwriteHint, getBoolean, getConfigDir, getLogLevel, getNumber, getProjectConfigDir, getRetryErrorContext, getShellName, getString, getToolResultTransportContent, hasDir, hasDisallowedAsciiControlCharacter, hasFile, hasFrontmatter, hasNonTextToolResultContent, hasTransientStatusMention, info, isBenchmarkLeakPath, isBenchmarkMode, isGitRepo, isPathSafe, isRetryableError, listDirs, listFiles, normalizeLineEndings, normalizeXenoRequestContext, parseDocument, parseJsonLines, readFileSafe, readIfExists, readTextFile, remainingBudget, renameReplacingWithRetry, safeJsonParse, safeJsonStringify, safeRegexTest, safeResolvePath, setLogLevel, stringifyDocument, toTransportAssistantBlocks, toolAssistantContentToText, toolResultContentToText, truncateToTokens, validateRegexPattern, validateRequired, warn, withRetry, writeAtomic, writeTextFile, xenoRequestContextHeaders };
302
+ export { ApiTransientError, HOME_DIR, IS_LINUX, IS_MAC, IS_WINDOWS, type LineEnding, LogLevel, OS_VERSION, PLATFORM, type ParsedDocument, type RetryErrorContext, type RetryOptions, type TextEncoding, type TextFileContents, type TokenAccountingAdapter, type TokenAccountingResult, type TokenAccountingSource, type TokenEstimator, type XenoAsciiControlCharacterPolicy, type XenoRequestContext, accountTextTokens, appendDurableLine, appendLine, benchmarkLeakError, buildToolResultBlock, buildToolResultText, calculateCost, commandMentionsBenchmarkLeak, conservativeTokenAccountingAdapter, copyTextToClipboard, createSafeRegex, debug, decodeTextBuffer, deleteDir, deleteFile, detectLineEnding, detectPreferredLineEnding, detectTextEncoding, encodeTextBuffer, ensureDir, error, estimateTokens, estimateTokensForModel, existsSync, filterBenchmarkLeakPaths, findSimilarFile, fitsInBudget, formatCost, getAgentHome, getBenchmarkReferenceOverwriteHint, getBoolean, getConfigDir, getLogLevel, getNumber, getProjectConfigDir, getRetryErrorContext, getShellName, getString, getToolResultTransportContent, hasDir, hasDisallowedAsciiControlCharacter, hasFile, hasFrontmatter, hasMixedLineEndings, hasNonTextToolResultContent, hasTransientStatusMention, info, isBenchmarkLeakPath, isBenchmarkMode, isGitRepo, isPathSafe, isRetryableError, listDirs, listFiles, normalizeLineEndings, normalizeXenoRequestContext, parseDocument, parseJsonLines, pathIdentityKey, readFileSafe, readIfExists, readTextFile, remainingBudget, renameReplacingWithRetry, safeJsonParse, safeJsonStringify, safeRegexTest, safeResolvePath, setLogLevel, stringifyDocument, toTransportAssistantBlocks, toolAssistantContentToText, toolResultContentToText, truncateToTokens, validateRegexPattern, validateRequired, warn, withRetry, writeAtomic, writeTextFile, xenoRequestContextHeaders };
@@ -20,13 +20,15 @@ declare function decodeTextBuffer(buffer: Buffer, encoding: TextEncoding): strin
20
20
  declare function encodeTextBuffer(content: string, encoding: TextEncoding): Buffer;
21
21
  declare function detectLineEnding(content: string): LineEnding;
22
22
  declare function normalizeLineEndings(content: string, lineEnding: LineEnding): string;
23
+ declare function hasMixedLineEndings(content: string): boolean;
23
24
  declare function readTextFile(filePath: string): Promise<TextFileContents>;
24
25
  declare function writeTextFile(filePath: string, content: string, options?: {
25
26
  encoding?: TextEncoding;
26
27
  lineEnding?: LineEnding;
28
+ preserveLineEndings?: boolean;
27
29
  }): Promise<void>;
28
30
  declare function detectPreferredLineEnding(baseDir: string): Promise<LineEnding>;
29
- declare function findSimilarFile(filePath: string): string | null;
31
+ declare function findSimilarFile(filePath: string, boundary?: string): string | null;
30
32
  declare function readIfExists(filePath: string): Promise<string | null>;
31
33
  declare function existsSync(filePath: string): boolean;
32
34
  declare function listFiles(dir: string, pattern?: RegExp): Promise<string[]>;
@@ -45,6 +47,7 @@ declare function stringifyDocument(frontmatter: Record<string, unknown>, content
45
47
  declare function hasFrontmatter(raw: string): boolean;
46
48
  declare function isPathSafe(basePath: string, targetPath: string): boolean;
47
49
  declare function safeResolvePath(basePath: string, targetPath: string): string;
50
+ declare function pathIdentityKey(filePath: string, platform?: NodeJS.Platform): string;
48
51
  declare const PLATFORM: NodeJS.Platform;
49
52
  declare const IS_WINDOWS: boolean;
50
53
  declare const IS_MAC: boolean;
@@ -296,4 +299,4 @@ interface XenoAsciiControlCharacterPolicy {
296
299
  allowLineBreaks?: boolean;
297
300
  }
298
301
  declare function hasDisallowedAsciiControlCharacter(value: string, policy?: XenoAsciiControlCharacterPolicy): boolean;
299
- export { ApiTransientError, HOME_DIR, IS_LINUX, IS_MAC, IS_WINDOWS, type LineEnding, LogLevel, OS_VERSION, PLATFORM, type ParsedDocument, type RetryErrorContext, type RetryOptions, type TextEncoding, type TextFileContents, type TokenAccountingAdapter, type TokenAccountingResult, type TokenAccountingSource, type TokenEstimator, type XenoAsciiControlCharacterPolicy, type XenoRequestContext, accountTextTokens, appendDurableLine, appendLine, benchmarkLeakError, buildToolResultBlock, buildToolResultText, calculateCost, commandMentionsBenchmarkLeak, conservativeTokenAccountingAdapter, copyTextToClipboard, createSafeRegex, debug, decodeTextBuffer, deleteDir, deleteFile, detectLineEnding, detectPreferredLineEnding, detectTextEncoding, encodeTextBuffer, ensureDir, error, estimateTokens, estimateTokensForModel, existsSync, filterBenchmarkLeakPaths, findSimilarFile, fitsInBudget, formatCost, getAgentHome, getBenchmarkReferenceOverwriteHint, getBoolean, getConfigDir, getLogLevel, getNumber, getProjectConfigDir, getRetryErrorContext, getShellName, getString, getToolResultTransportContent, hasDir, hasDisallowedAsciiControlCharacter, hasFile, hasFrontmatter, hasNonTextToolResultContent, hasTransientStatusMention, info, isBenchmarkLeakPath, isBenchmarkMode, isGitRepo, isPathSafe, isRetryableError, listDirs, listFiles, normalizeLineEndings, normalizeXenoRequestContext, parseDocument, parseJsonLines, readFileSafe, readIfExists, readTextFile, remainingBudget, renameReplacingWithRetry, safeJsonParse, safeJsonStringify, safeRegexTest, safeResolvePath, setLogLevel, stringifyDocument, toTransportAssistantBlocks, toolAssistantContentToText, toolResultContentToText, truncateToTokens, validateRegexPattern, validateRequired, warn, withRetry, writeAtomic, writeTextFile, xenoRequestContextHeaders };
302
+ export { ApiTransientError, HOME_DIR, IS_LINUX, IS_MAC, IS_WINDOWS, type LineEnding, LogLevel, OS_VERSION, PLATFORM, type ParsedDocument, type RetryErrorContext, type RetryOptions, type TextEncoding, type TextFileContents, type TokenAccountingAdapter, type TokenAccountingResult, type TokenAccountingSource, type TokenEstimator, type XenoAsciiControlCharacterPolicy, type XenoRequestContext, accountTextTokens, appendDurableLine, appendLine, benchmarkLeakError, buildToolResultBlock, buildToolResultText, calculateCost, commandMentionsBenchmarkLeak, conservativeTokenAccountingAdapter, copyTextToClipboard, createSafeRegex, debug, decodeTextBuffer, deleteDir, deleteFile, detectLineEnding, detectPreferredLineEnding, detectTextEncoding, encodeTextBuffer, ensureDir, error, estimateTokens, estimateTokensForModel, existsSync, filterBenchmarkLeakPaths, findSimilarFile, fitsInBudget, formatCost, getAgentHome, getBenchmarkReferenceOverwriteHint, getBoolean, getConfigDir, getLogLevel, getNumber, getProjectConfigDir, getRetryErrorContext, getShellName, getString, getToolResultTransportContent, hasDir, hasDisallowedAsciiControlCharacter, hasFile, hasFrontmatter, hasMixedLineEndings, hasNonTextToolResultContent, hasTransientStatusMention, info, isBenchmarkLeakPath, isBenchmarkMode, isGitRepo, isPathSafe, isRetryableError, listDirs, listFiles, normalizeLineEndings, normalizeXenoRequestContext, parseDocument, parseJsonLines, pathIdentityKey, readFileSafe, readIfExists, readTextFile, remainingBudget, renameReplacingWithRetry, safeJsonParse, safeJsonStringify, safeRegexTest, safeResolvePath, setLogLevel, stringifyDocument, toTransportAssistantBlocks, toolAssistantContentToText, toolResultContentToText, truncateToTokens, validateRegexPattern, validateRequired, warn, withRetry, writeAtomic, writeTextFile, xenoRequestContextHeaders };