@xenosystem/agent-sdk 0.10.38 → 0.10.39

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 (57) hide show
  1. package/dist/artifacts/index.cjs +9 -9
  2. package/dist/artifacts/index.js +9 -9
  3. package/dist/artifacts/metafile-cjs.json +1 -1
  4. package/dist/artifacts/metafile-esm.json +1 -1
  5. package/dist/automation/index.cjs +8 -8
  6. package/dist/automation/index.d.cts +10 -0
  7. package/dist/automation/index.d.ts +10 -0
  8. package/dist/automation/index.js +9 -9
  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/electron/index.cjs +221 -200
  14. package/dist/electron/index.d.cts +91 -1
  15. package/dist/electron/index.d.ts +91 -1
  16. package/dist/electron/index.js +221 -200
  17. package/dist/electron/metafile-cjs.json +1 -1
  18. package/dist/electron/metafile-esm.json +1 -1
  19. package/dist/index.cjs +396 -371
  20. package/dist/index.d.cts +134 -4
  21. package/dist/index.d.ts +134 -4
  22. package/dist/index.js +397 -372
  23. package/dist/intelligence/index.cjs +9 -9
  24. package/dist/intelligence/index.js +9 -9
  25. package/dist/intelligence/metafile-cjs.json +1 -1
  26. package/dist/intelligence/metafile-esm.json +1 -1
  27. package/dist/mcp/index.d.cts +10 -0
  28. package/dist/mcp/index.d.ts +10 -0
  29. package/dist/metafile-cjs.json +1 -1
  30. package/dist/metafile-esm.json +1 -1
  31. package/dist/providers/index.cjs +9 -9
  32. package/dist/providers/index.js +9 -9
  33. package/dist/providers/metafile-cjs.json +1 -1
  34. package/dist/providers/metafile-esm.json +1 -1
  35. package/dist/recipes/index.cjs +2 -2
  36. package/dist/recipes/index.js +2 -2
  37. package/dist/recipes/metafile-cjs.json +1 -1
  38. package/dist/recipes/metafile-esm.json +1 -1
  39. package/dist/research/index.cjs +3 -3
  40. package/dist/research/index.js +3 -3
  41. package/dist/research/metafile-cjs.json +1 -1
  42. package/dist/research/metafile-esm.json +1 -1
  43. package/dist/session/index.cjs +25 -25
  44. package/dist/session/index.js +25 -25
  45. package/dist/session/metafile-cjs.json +1 -1
  46. package/dist/session/metafile-esm.json +1 -1
  47. package/dist/sharing/index.cjs +4 -4
  48. package/dist/sharing/index.js +4 -4
  49. package/dist/sharing/metafile-cjs.json +1 -1
  50. package/dist/sharing/metafile-esm.json +1 -1
  51. package/dist/utils/index.cjs +23 -23
  52. package/dist/utils/index.d.cts +15 -1
  53. package/dist/utils/index.d.ts +15 -1
  54. package/dist/utils/index.js +23 -23
  55. package/dist/utils/metafile-cjs.json +1 -1
  56. package/dist/utils/metafile-esm.json +1 -1
  57. package/package.json +3 -3
@@ -1,10 +1,10 @@
1
- "use strict";var oe=Object.create;var _=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var ie=Object.getOwnPropertyNames;var ae=Object.getPrototypeOf,ce=Object.prototype.hasOwnProperty;var pe=(e,t)=>{for(var n in t)_(e,n,{get:t[n],enumerable:!0})},W=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ie(t))!ce.call(e,o)&&o!==n&&_(e,o,{get:()=>t[o],enumerable:!(r=se(t,o))||r.enumerable});return e};var de=(e,t,n)=>(n=e!=null?oe(ae(e)):{},W(t||!e||!e.__esModule?_(n,"default",{value:e,enumerable:!0}):n,e)),ue=e=>W(_({},"__esModule",{value:!0}),e);var Ke={};pe(Ke,{XENO_REPOSITORY_INDEX_SCHEMA_VERSION:()=>C,XenoRepositoryIndexFileStore:()=>K,buildXenoRepositoryIndex:()=>G,buildXenoRepositoryIndexWithEmbeddings:()=>be,detectRepositoryDocumentKind:()=>J,detectRepositoryLanguage:()=>q,inspectXenoRepositoryFreshness:()=>we,inspectXenoRepositorySymbol:()=>Re,searchXenoRepositoryIndex:()=>xe,validateXenoRepositoryIndex:()=>X});module.exports=ue(Ke);var C="xeno.repository-index.v1";var D=require("node:crypto");var le=120,me=24e3,fe=4096,he=64,ge={c:"c",cc:"cpp",cjs:"javascript",cpp:"cpp",cs:"csharp",css:"css",cxx:"cpp",go:"go",h:"c",hpp:"cpp",html:"html",java:"java",js:"javascript",json:"json",jsx:"javascriptreact",kt:"kotlin",kts:"kotlin",md:"markdown",mdx:"markdown",mjs:"javascript",php:"php",py:"python",rb:"ruby",rs:"rust",sh:"shell",sql:"sql",svelte:"svelte",swift:"swift",toml:"toml",ts:"typescript",tsx:"typescriptreact",vue:"vue",yaml:"yaml",yml:"yaml"},ye=new Set(["a","an","and","are","as","at","be","by","for","from","has","have","if","in","is","it","of","on","or","that","the","this","to","was","were","will","with","true","false","null","const","let","var","return","export","import","function","class","interface","type","public","private"]);function G(e,t={}){let n=e.map(ze).sort(je),r=P(t.createdAt??t.updatedAt??new Date().toISOString(),"createdAt"),o=P(t.updatedAt??r,"updatedAt"),a=A(t.chunkLines??le,20,1e3,"chunkLines"),i=A(t.maxChunkChars??me,1e3,256e3,"maxChunkChars"),s=[],d=[],p=[],m=new Map;for(let c of n){let f=ee(c.content),x=b(f),w=S("file",`${c.workspaceId}:${g(c.path)}`),y=c.language?.trim().toLowerCase()||q(c.path),F=c.kind??J(c.path,y),L=Ie(w,f,a,i),H=ke(f,y).map(h=>({symbolId:S("symbol",`${w}:${h.kind}:${h.name}:${h.line}`),fileId:w,workspaceId:c.workspaceId,path:g(c.path),name:h.name,qualifiedName:`${g(c.path)}#${h.name}`,kind:h.kind,language:y,startLine:h.line,endLine:h.line,exported:h.exported,...h.signature?{signature:h.signature}:{}})),re={fileId:w,workspaceId:c.workspaceId,root:c.root,path:g(c.path),language:y,kind:F,size:c.size,mtimeMs:c.mtimeMs,contentHash:x,lineCount:Oe(f),chunks:L,symbolIds:H.map(h=>h.symbolId),...c.git?{git:Z(c.git)}:{}};s.push(re),d.push(...H),m.set(w,Ee(f,y));for(let h of H)p.push(N("defines",w,h.symbolId,h.path,h.startLine,`Defines ${h.kind} ${h.name}`,1))}let k=Se(s);for(let c of s)for(let f of m.get(c.fileId)??[]){let x=$e(c,f.specifier,k);x&&p.push(N("imports",c.fileId,x.fileId,c.path,f.line,`Imports ${f.specifier}`,.98))}p.push(...ve(s)),p.push(...Fe(s));let u=Me(n),l=Le(p),B={workspaces:new Set(s.map(c=>c.workspaceId)).size,files:s.length,chunks:s.reduce((c,f)=>c+f.chunks.length,0),symbols:d.length,relationships:l.length,embeddedChunks:s.reduce((c,f)=>c+f.chunks.filter(x=>x.embedding).length,0),sourceBytes:s.reduce((c,f)=>c+f.size,0)},E=[...new Map(n.map(c=>[c.workspaceId,c])).values()].map(c=>({workspaceId:c.workspaceId,root:c.root,...c.git?{git:Z(c.git)}:{},indexedAt:o})).sort((c,f)=>c.workspaceId.localeCompare(f.workspaceId)),v={schemaVersion:C,indexId:t.indexId?.trim()||`repo_index_${(0,D.randomUUID)()}`,revision:A(t.revision??1,1,Number.MAX_SAFE_INTEGER,"revision"),createdAt:r,updatedAt:o,sourceFingerprint:u,producer:{id:t.producer?.id?.trim()||"xeno-agent-sdk",...t.producer?.version?{version:t.producer.version.trim()}:{}},workspaces:E,files:s,symbols:d,relationships:l,stats:B};return{...v,indexHash:b($(v))}}async function be(e,t,n={}){if(!t.id.trim()||!t.model.trim())throw new Error("Repository embedding provider identity is required");let r=G(e,n),o=await Promise.all(r.files.map(async d=>({...d,chunks:await Promise.all(d.chunks.map(async p=>{let m=Y(await t.embed({workspaceId:d.workspaceId,path:d.path,startLine:p.startLine,endLine:p.endLine,content:p.content,contentHash:p.contentHash}));if(m.contentHash!==p.contentHash)throw new Error(`Repository embedding content hash mismatch for ${d.path}:${p.startLine}`);if(m.model!==t.model)throw new Error(`Repository embedding model mismatch for ${d.path}:${p.startLine}`);return{...p,embedding:m}}))}))),a={...r,files:o,stats:{...r.stats,embeddedChunks:o.reduce((d,p)=>d+p.chunks.filter(m=>m.embedding).length,0)}},{indexHash:i,...s}=a;return{...a,indexHash:b($(s))}}function xe(e,t){X(e);let n=t.query.trim();if(!n||n.length>8192)throw new Error("Repository search query must contain 1-8192 characters");let r=t.mode??"hybrid",o=t.queryEmbedding?Y(t.queryEmbedding):void 0,a=[...new Set(V(n))].slice(0,he),i=He(e.symbols,u=>u.fileId),s=_e(e.files),d=Math.max(1,e.stats.chunks),p=[],m=0;for(let u of e.files)if(!(t.workspaceIds?.length&&!t.workspaceIds.includes(u.workspaceId))&&!(t.kinds?.length&&!t.kinds.includes(u.kind))&&!(t.languages?.length&&!t.languages.includes(u.language)))for(let l of u.chunks){m+=1;let B=a.filter(y=>(l.terms[y]??0)>0),E=r==="semantic"?0:Ce(l,a,s,d),v=!!(o&&l.embedding&&o.model===l.embedding.model&&o.dimensions===l.embedding.dimensions),c=r==="lexical"||!v?0:Ae(o?.vector,l.embedding?.vector),f=(i.get(u.fileId)??[]).filter(y=>{let F=y.name.toLowerCase();return a.some(L=>F===L||F.includes(L))}),x=f.length*1.5,w=r==="lexical"?E+x:r==="semantic"?c+x:E*.65+c*6*.35+x;w<=0||p.push({resultId:l.chunkId,workspaceId:u.workspaceId,path:u.path,kind:u.kind,language:u.language,startLine:l.startLine,endLine:l.endLine,snippet:Ne(l.content,a),score:O(w),lexicalScore:O(E),semanticScore:O(c),matchedTerms:B,symbolIds:f.map(y=>y.symbolId),provenance:{indexId:e.indexId,indexRevision:e.revision,indexHash:e.indexHash,sourceFingerprint:e.sourceFingerprint,contentHash:l.contentHash,...u.git?{git:u.git}:{}}})}let k=A(t.limit??20,1,100,"limit");return p.sort((u,l)=>l.score-u.score||u.path.localeCompare(l.path)||u.startLine-l.startLine),{query:{...t,query:n,mode:r},results:p.slice(0,k),totalCandidates:m,semanticAvailable:!!(o&&e.files.some(u=>u.chunks.some(l=>l.embedding?.model===o.model&&l.embedding.dimensions===o.dimensions))),index:{indexId:e.indexId,revision:e.revision,indexHash:e.indexHash,updatedAt:e.updatedAt}}}function Re(e,t){X(e);let n=e.symbols.find(s=>s.symbolId===t||s.qualifiedName===t),r=n?.symbolId??t,o=e.relationships.filter(s=>s.toId===r||n&&s.toId===n.fileId),a=e.relationships.filter(s=>s.fromId===r||n&&s.fromId===n.fileId),i=new Set([...o.map(s=>s.fromId),...a.map(s=>s.toId)]);return{...n?{symbol:n}:{},incoming:o,outgoing:a,relatedSymbols:e.symbols.filter(s=>i.has(s.symbolId)),relatedFiles:e.files.filter(s=>i.has(s.fileId)||s.fileId===n?.fileId)}}function we(e,t,n=new Date().toISOString()){X(e);let r=new Map(e.files.map(p=>[`${p.workspaceId}:${p.path}`,p])),o=new Map(t.map(p=>[`${p.workspaceId}:${g(p.path)}`,p])),a=[],i=[],s=[];for(let[p,m]of o){let k=r.get(p);k?(m.contentHash?m.contentHash!==k.contentHash:m.size!==k.size||m.mtimeMs!==k.mtimeMs)&&i.push(m.path):a.push(m.path)}for(let[p,m]of r)o.has(p)||s.push(m.path);let d=De(t);return{state:a.length||i.length||s.length?"stale":"fresh",checkedAt:P(n,"checkedAt"),added:a.sort(),changed:i.sort(),removed:s.sort(),sourceFingerprint:d,indexedSourceFingerprint:e.sourceFingerprint}}function X(e){if(e.schemaVersion!==C)throw new Error("Unsupported repository index schema");if(!e.indexId||!Number.isInteger(e.revision)||e.revision<1)throw new Error("Repository index identity is invalid");let t=new Set;for(let i of e.files){if(t.has(i.fileId))throw new Error(`Duplicate repository file ID: ${i.fileId}`);t.add(i.fileId),Q(i.path)}let n=new Set;for(let i of e.symbols){if(!t.has(i.fileId))throw new Error(`Repository symbol references unknown file: ${i.symbolId}`);if(n.has(i.symbolId))throw new Error(`Duplicate repository symbol ID: ${i.symbolId}`);n.add(i.symbolId)}let r=new Set([...t,...n]);for(let i of e.relationships)if(!r.has(i.fromId)||!r.has(i.toId))throw new Error(`Repository relationship ${i.relationshipId} is dangling`);let{indexHash:o,...a}=e;if(b($(a))!==e.indexHash)throw new Error("Repository index hash mismatch");return e}function q(e){let t=g(e).split("/").pop()??"",n=t.includes(".")?t.split(".").pop()?.toLowerCase()??"":"";return ge[n]??"text"}function J(e,t=q(e)){let n=g(e).toLowerCase();return/(^|\/)(test|tests|spec|specs|__tests__)(\/|$)|\.(test|spec)\.[^/]+$/u.test(n)?"test":t==="markdown"||/(^|\/)(docs?|documentation)(\/|$)/u.test(n)?"documentation":["json","yaml","toml"].includes(t)||/(^|\/)(\.github|config)(\/|$)/u.test(n)?"configuration":["typescript","typescriptreact","javascript","javascriptreact","python","go","rust","java","csharp","c","cpp","ruby","php","swift","kotlin","shell","sql"].includes(t)?"source":/\.(png|jpe?g|gif|webp|svg|ico|woff2?|ttf|mp[34]|wav)$/u.test(n)?"asset":"other"}function Ie(e,t,n,r){let o=t.split(`
1
+ "use strict";var ae=Object.create;var _=Object.defineProperty;var ce=Object.getOwnPropertyDescriptor;var de=Object.getOwnPropertyNames;var pe=Object.getPrototypeOf,ue=Object.prototype.hasOwnProperty;var le=(e,t)=>{for(var n in t)_(e,n,{get:t[n],enumerable:!0})},Z=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of de(t))!ue.call(e,o)&&o!==n&&_(e,o,{get:()=>t[o],enumerable:!(r=ce(t,o))||r.enumerable});return e};var me=(e,t,n)=>(n=e!=null?ae(pe(e)):{},Z(t||!e||!e.__esModule?_(n,"default",{value:e,enumerable:!0}):n,e)),fe=e=>Z(_({},"__esModule",{value:!0}),e);var Ue={};le(Ue,{XENO_REPOSITORY_INDEX_SCHEMA_VERSION:()=>L,XenoRepositoryIndexFileStore:()=>W,buildXenoRepositoryIndex:()=>G,buildXenoRepositoryIndexWithEmbeddings:()=>we,detectRepositoryDocumentKind:()=>Y,detectRepositoryLanguage:()=>P,inspectXenoRepositoryFreshness:()=>Ee,inspectXenoRepositorySymbol:()=>ke,searchXenoRepositoryIndex:()=>Ie,validateXenoRepositoryIndex:()=>E});module.exports=fe(Ue);var L="xeno.repository-index.v1";var z=require("node:crypto");var he=120,ge=24e3,ye=4096,be=64,xe={c:"c",cc:"cpp",cjs:"javascript",cpp:"cpp",cs:"csharp",css:"css",cxx:"cpp",go:"go",h:"c",hpp:"cpp",html:"html",java:"java",js:"javascript",json:"json",jsx:"javascriptreact",kt:"kotlin",kts:"kotlin",md:"markdown",mdx:"markdown",mjs:"javascript",php:"php",py:"python",rb:"ruby",rs:"rust",sh:"shell",sql:"sql",svelte:"svelte",swift:"swift",toml:"toml",ts:"typescript",tsx:"typescriptreact",vue:"vue",yaml:"yaml",yml:"yaml"},Re=new Set(["a","an","and","are","as","at","be","by","for","from","has","have","if","in","is","it","of","on","or","that","the","this","to","was","were","will","with","true","false","null","const","let","var","return","export","import","function","class","interface","type","public","private"]);function G(e,t={}){let n=e.map(Oe).sort(Ke),r=q(t.createdAt??t.updatedAt??new Date().toISOString(),"createdAt"),o=q(t.updatedAt??r,"updatedAt"),a=M(t.chunkLines??he,20,1e3,"chunkLines"),i=M(t.maxChunkChars??ge,1e3,256e3,"maxChunkChars"),s=[],p=[],d=[],m=new Map;for(let c of n){let f=te(c.content),x=b(f),w=X("file",`${c.workspaceId}:${g(c.path)}`),y=c.language?.trim().toLowerCase()||P(c.path),F=c.kind??Y(c.path,y),C=Se(w,f,a,i),O=Xe(f,y).map(h=>({symbolId:X("symbol",`${w}:${h.kind}:${h.name}:${h.line}`),fileId:w,workspaceId:c.workspaceId,path:g(c.path),name:h.name,qualifiedName:`${g(c.path)}#${h.name}`,kind:h.kind,language:y,startLine:h.line,endLine:h.line,exported:h.exported,...h.signature?{signature:h.signature}:{}})),ie={fileId:w,workspaceId:c.workspaceId,root:c.root,path:g(c.path),language:y,kind:F,size:c.size,mtimeMs:c.mtimeMs,contentHash:x,lineCount:Pe(f),chunks:C,symbolIds:O.map(h=>h.symbolId),...c.git?{git:U(c.git)}:{}};s.push(ie),p.push(...O),m.set(w,$e(f,y));for(let h of O)d.push(N("defines",w,h.symbolId,h.path,h.startLine,`Defines ${h.kind} ${h.name}`,1))}let k=Fe(s);for(let c of s)for(let f of m.get(c.fileId)??[]){let x=Ce(c,f.specifier,k);x&&d.push(N("imports",c.fileId,x.fileId,c.path,f.line,`Imports ${f.specifier}`,.98))}d.push(..._e(s)),d.push(...Le(s));let u=De(n),l=Me(d),B={workspaces:new Set(s.map(c=>c.workspaceId)).size,files:s.length,chunks:s.reduce((c,f)=>c+f.chunks.length,0),symbols:p.length,relationships:l.length,embeddedChunks:s.reduce((c,f)=>c+f.chunks.filter(x=>x.embedding).length,0),sourceBytes:s.reduce((c,f)=>c+f.size,0)},S=[...new Map(n.map(c=>[c.workspaceId,c])).values()].map(c=>({workspaceId:c.workspaceId,root:c.root,...c.git?{git:U(c.git)}:{},indexedAt:o})).sort((c,f)=>c.workspaceId.localeCompare(f.workspaceId)),$={schemaVersion:L,indexId:t.indexId?.trim()||`repo_index_${(0,z.randomUUID)()}`,revision:M(t.revision??1,1,Number.MAX_SAFE_INTEGER,"revision"),createdAt:r,updatedAt:o,sourceFingerprint:u,producer:{id:t.producer?.id?.trim()||"xeno-agent-sdk",...t.producer?.version?{version:t.producer.version.trim()}:{}},workspaces:S,files:s,symbols:p,relationships:l,stats:B};return{...$,indexHash:b(v($))}}async function we(e,t,n={}){if(!t.id.trim()||!t.model.trim())throw new Error("Repository embedding provider identity is required");let r=G(e,n),o=await Promise.all(r.files.map(async p=>({...p,chunks:await Promise.all(p.chunks.map(async d=>{let m=V(await t.embed({workspaceId:p.workspaceId,path:p.path,startLine:d.startLine,endLine:d.endLine,content:d.content,contentHash:d.contentHash}));if(m.contentHash!==d.contentHash)throw new Error(`Repository embedding content hash mismatch for ${p.path}:${d.startLine}`);if(m.model!==t.model)throw new Error(`Repository embedding model mismatch for ${p.path}:${d.startLine}`);return{...d,embedding:m}}))}))),a={...r,files:o,stats:{...r.stats,embeddedChunks:o.reduce((p,d)=>p+d.chunks.filter(m=>m.embedding).length,0)}},{indexHash:i,...s}=a;return{...a,indexHash:b(v(s))}}function Ie(e,t){E(e);let n=t.query.trim();if(!n||n.length>8192)throw new Error("Repository search query must contain 1-8192 characters");let r=t.mode??"hybrid",o=t.queryEmbedding?V(t.queryEmbedding):void 0,a=[...new Set(Q(n))].slice(0,be),i=qe(e.symbols,u=>u.fileId),s=Ne(e.files),p=Math.max(1,e.stats.chunks),d=[],m=0;for(let u of e.files)if(!(t.workspaceIds?.length&&!t.workspaceIds.includes(u.workspaceId))&&!(t.kinds?.length&&!t.kinds.includes(u.kind))&&!(t.languages?.length&&!t.languages.includes(u.language)))for(let l of u.chunks){m+=1;let B=a.filter(y=>(l.terms[y]??0)>0),S=r==="semantic"?0:Ae(l,a,s,p),$=!!(o&&l.embedding&&o.model===l.embedding.model&&o.dimensions===l.embedding.dimensions),c=r==="lexical"||!$?0:ze(o?.vector,l.embedding?.vector),f=(i.get(u.fileId)??[]).filter(y=>{let F=y.name.toLowerCase();return a.some(C=>F===C||F.includes(C))}),x=f.length*1.5,w=r==="lexical"?S+x:r==="semantic"?c+x:S*.65+c*6*.35+x;w<=0||d.push({resultId:l.chunkId,workspaceId:u.workspaceId,path:u.path,kind:u.kind,language:u.language,startLine:l.startLine,endLine:l.endLine,snippet:Te(l.content,a),score:H(w),lexicalScore:H(S),semanticScore:H(c),matchedTerms:B,symbolIds:f.map(y=>y.symbolId),provenance:{indexId:e.indexId,indexRevision:e.revision,indexHash:e.indexHash,sourceFingerprint:e.sourceFingerprint,contentHash:l.contentHash,...u.git?{git:u.git}:{}}})}let k=M(t.limit??20,1,100,"limit");return d.sort((u,l)=>l.score-u.score||u.path.localeCompare(l.path)||u.startLine-l.startLine),{query:{...t,query:n,mode:r},results:d.slice(0,k),totalCandidates:m,semanticAvailable:!!(o&&e.files.some(u=>u.chunks.some(l=>l.embedding?.model===o.model&&l.embedding.dimensions===o.dimensions))),index:{indexId:e.indexId,revision:e.revision,indexHash:e.indexHash,updatedAt:e.updatedAt}}}function ke(e,t){E(e);let n=e.symbols.find(s=>s.symbolId===t||s.qualifiedName===t),r=n?.symbolId??t,o=e.relationships.filter(s=>s.toId===r||n&&s.toId===n.fileId),a=e.relationships.filter(s=>s.fromId===r||n&&s.fromId===n.fileId),i=new Set([...o.map(s=>s.fromId),...a.map(s=>s.toId)]);return{...n?{symbol:n}:{},incoming:o,outgoing:a,relatedSymbols:e.symbols.filter(s=>i.has(s.symbolId)),relatedFiles:e.files.filter(s=>i.has(s.fileId)||s.fileId===n?.fileId)}}function Ee(e,t,n=new Date().toISOString()){E(e);let r=new Map(e.files.map(d=>[`${d.workspaceId}:${d.path}`,d])),o=new Map(t.map(d=>[`${d.workspaceId}:${g(d.path)}`,d])),a=[],i=[],s=[];for(let[d,m]of o){let k=r.get(d);k?(m.contentHash?m.contentHash!==k.contentHash:m.size!==k.size||m.mtimeMs!==k.mtimeMs)&&i.push(m.path):a.push(m.path)}for(let[d,m]of r)o.has(d)||s.push(m.path);let p=Be(t);return{state:a.length||i.length||s.length?"stale":"fresh",checkedAt:q(n,"checkedAt"),added:a.sort(),changed:i.sort(),removed:s.sort(),sourceFingerprint:p,indexedSourceFingerprint:e.sourceFingerprint}}function E(e){if(e.schemaVersion!==L)throw new Error("Unsupported repository index schema");if(!e.indexId||!Number.isInteger(e.revision)||e.revision<1)throw new Error("Repository index identity is invalid");let t=new Set;for(let i of e.files){if(t.has(i.fileId))throw new Error(`Duplicate repository file ID: ${i.fileId}`);t.add(i.fileId),ee(i.path)}let n=new Set;for(let i of e.symbols){if(!t.has(i.fileId))throw new Error(`Repository symbol references unknown file: ${i.symbolId}`);if(n.has(i.symbolId))throw new Error(`Duplicate repository symbol ID: ${i.symbolId}`);n.add(i.symbolId)}let r=new Set([...t,...n]);for(let i of e.relationships)if(!r.has(i.fromId)||!r.has(i.toId))throw new Error(`Repository relationship ${i.relationshipId} is dangling`);let{indexHash:o,...a}=e;if(b(v(a))!==e.indexHash)throw new Error("Repository index hash mismatch");return e}function P(e){let t=g(e).split("/").pop()??"",n=t.includes(".")?t.split(".").pop()?.toLowerCase()??"":"";return xe[n]??"text"}function Y(e,t=P(e)){let n=g(e).toLowerCase();return/(^|\/)(test|tests|spec|specs|__tests__)(\/|$)|\.(test|spec)\.[^/]+$/u.test(n)?"test":t==="markdown"||/(^|\/)(docs?|documentation)(\/|$)/u.test(n)?"documentation":["json","yaml","toml"].includes(t)||/(^|\/)(\.github|config)(\/|$)/u.test(n)?"configuration":["typescript","typescriptreact","javascript","javascriptreact","python","go","rust","java","csharp","c","cpp","ruby","php","swift","kotlin","shell","sql"].includes(t)?"source":/\.(png|jpe?g|gif|webp|svg|ico|woff2?|ttf|mp[34]|wav)$/u.test(n)?"asset":"other"}function Se(e,t,n,r){let o=t.split(`
2
2
  `),a=[],i=0;for(;i<o.length;){let s=Math.min(o.length,i+n);for(;s>i+1&&o.slice(i,s).join(`
3
- `).length>r;)s-=1;let d=o.slice(i,s).join(`
4
- `),p=b(d);a.push({chunkId:S("chunk",`${e}:${i+1}:${s}:${p}`),startLine:i+1,endLine:Math.max(i+1,s),content:d,contentHash:p,terms:Be(d)}),i=s}return a.length?a:[{chunkId:S("chunk",`${e}:1:1:${b("")}`),startLine:1,endLine:1,content:"",contentHash:b(""),terms:{}}]}function ke(e,t){let n=[],r=e.split(`
5
- `),o=Xe(t);return r.forEach((a,i)=>{for(let s of o){let d=s.expression.exec(a);if(d?.groups?.name){n.push({name:d.groups.name,kind:s.kind,line:i+1,exported:/\b(export|public|pub)\b/u.test(a),signature:a.trim().slice(0,1e3)});break}}}),n.slice(0,2e4)}function Xe(e){return e==="markdown"?[{kind:"heading",expression:/^#{1,6}\s+(?<name>.+?)\s*$/u}]:e==="python"?[{kind:"class",expression:/^\s*class\s+(?<name>[A-Za-z_][\w]*)/u},{kind:"function",expression:/^\s*(?:async\s+)?def\s+(?<name>[A-Za-z_][\w]*)/u}]:e==="go"?[{kind:"function",expression:/^\s*func\s+(?:\([^)]*\)\s*)?(?<name>[A-Za-z_][\w]*)/u},{kind:"type",expression:/^\s*type\s+(?<name>[A-Za-z_][\w]*)/u}]:e==="rust"?[{kind:"function",expression:/^\s*(?:pub(?:\([^)]*\))?\s+)?(?:async\s+)?fn\s+(?<name>[A-Za-z_][\w]*)/u},{kind:"class",expression:/^\s*(?:pub(?:\([^)]*\))?\s+)?struct\s+(?<name>[A-Za-z_][\w]*)/u},{kind:"enum",expression:/^\s*(?:pub(?:\([^)]*\))?\s+)?enum\s+(?<name>[A-Za-z_][\w]*)/u},{kind:"interface",expression:/^\s*(?:pub(?:\([^)]*\))?\s+)?trait\s+(?<name>[A-Za-z_][\w]*)/u}]:[{kind:"class",expression:/^\s*(?:export\s+)?(?:default\s+)?(?:abstract\s+)?class\s+(?<name>[A-Za-z_$][\w$]*)/u},{kind:"interface",expression:/^\s*(?:export\s+)?interface\s+(?<name>[A-Za-z_$][\w$]*)/u},{kind:"type",expression:/^\s*(?:export\s+)?type\s+(?<name>[A-Za-z_$][\w$]*)/u},{kind:"enum",expression:/^\s*(?:export\s+)?(?:const\s+)?enum\s+(?<name>[A-Za-z_$][\w$]*)/u},{kind:"function",expression:/^\s*(?:export\s+)?(?:default\s+)?(?:async\s+)?function\s*\*?\s*(?<name>[A-Za-z_$][\w$]*)/u},{kind:"variable",expression:/^\s*(?:export\s+)?(?:const|let|var)\s+(?<name>[A-Za-z_$][\w$]*)/u}]}function Ee(e,t){let n=[];return e.split(`
6
- `).forEach((r,o)=>{let a=t==="python"?/^\s*(?:from\s+(?<from>[.\w]+)\s+import|import\s+(?<plain>[.\w]+))/u.exec(r):/(?:\bfrom\s*|\brequire\s*\(\s*|\bimport\s*\(\s*)["'](?<module>[^"']+)["']/u.exec(r),i=a?.groups?.module??a?.groups?.from??a?.groups?.plain;i&&n.push({specifier:i,line:o+1})}),n.slice(0,2e4)}function Se(e){let t=new Map;for(let n of e){let r=`${n.workspaceId}:${M(n.path)}`;t.set(r,n),t.set(`${n.workspaceId}:${n.path}`,n),t.set(`${n.workspaceId}:${M(n.path)}/index`,n)}return t}function $e(e,t,n){if(!t.startsWith("."))return;let o=[...e.path.split("/").slice(0,-1),...t.replace(/\\/gu,"/").split("/")],a=[];for(let s of o)!s||s==="."||(s===".."?a.pop():a.push(s));let i=a.join("/");return n.get(`${e.workspaceId}:${i}`)??n.get(`${e.workspaceId}:${M(i)}`)??n.get(`${e.workspaceId}:${i}/index`)}function ve(e){let t=[],n=new Map;for(let r of e.filter(o=>o.kind==="source")){let o=U(r.path),a=`${r.workspaceId}:${o}`;n.set(a,[...n.get(a)??[],r])}for(let r of e.filter(o=>o.kind==="test")){let o=n.get(`${r.workspaceId}:${U(r.path)}`)??[];for(let a of o.slice(0,8))t.push(N("tests",r.fileId,a.fileId,r.path,void 0,`Test ownership inferred for ${a.path}`,.8))}return t}function Fe(e){let t=[],n=e.filter(r=>r.kind!=="documentation");for(let r of e.filter(o=>o.kind==="documentation")){let o=r.chunks.map(a=>a.content).join(`
7
- `).toLowerCase();for(let a of n){let i=a.path.toLowerCase(),s=i.split("/").pop()??i;if(!(!o.includes(i)&&(s.length<5||!o.includes(s)))&&(t.push(N("documents",r.fileId,a.fileId,r.path,void 0,`Documentation references ${a.path}`,.85)),t.length>=5e4))return t}}return t}function N(e,t,n,r,o,a,i){return{relationshipId:S("relationship",`${e}:${t}:${n}:${o??0}`),kind:e,fromId:t,toId:n,confidence:i,evidence:{path:r,...o?{line:o}:{},summary:a}}}function Le(e){return[...new Map(e.map(t=>[t.relationshipId,t])).values()].sort((t,n)=>t.relationshipId.localeCompare(n.relationshipId))}function _e(e){let t=new Map;for(let n of e)for(let r of n.chunks)for(let o of Object.keys(r.terms))t.set(o,(t.get(o)??0)+1);return t}function Ce(e,t,n,r){let o=Object.values(e.terms).reduce((i,s)=>i+s,0),a=0;for(let i of t){let s=e.terms[i]??0;if(!s)continue;let d=n.get(i)??0,p=Math.log(1+(r-d+.5)/(d+.5));a+=p*(s*2.2/(s+1.2*(.25+.75*o/350)))}return a}function Ae(e,t){if(!e||!t||e.length===0||e.length!==t.length)return 0;let n=0,r=0,o=0;for(let a=0;a<e.length;a+=1){let i=e[a]??0,s=t[a]??0;n+=i*s,r+=i*i,o+=s*s}return r&&o?n/Math.sqrt(r*o):0}function Ne(e,t){let n=e.replace(/\s+/gu," ").trim();if(n.length<=600)return n;let r=n.toLowerCase(),o=t.map(d=>r.indexOf(d)).filter(d=>d>=0),a=o.length?Math.min(...o):0,i=Math.max(0,a-180),s=Math.min(n.length,i+600);return`${i?"\u2026":""}${n.slice(i,s)}${s<n.length?"\u2026":""}`}function Me(e){return b($(e.map(t=>({workspaceId:t.workspaceId,root:t.root,path:g(t.path),size:t.size,mtimeMs:t.mtimeMs,contentHash:b(ee(t.content)),git:t.git}))))}function De(e){return b($([...e].map(t=>({workspaceId:t.workspaceId,path:g(t.path),size:t.size,mtimeMs:t.mtimeMs,contentHash:t.contentHash})).sort((t,n)=>`${t.workspaceId}:${t.path}`.localeCompare(`${n.workspaceId}:${n.path}`))))}function ze(e){if(!e.workspaceId.trim())throw new Error("Repository source workspaceId is required");if(!e.root.trim())throw new Error("Repository source root is required");if(Q(e.path),!Number.isFinite(e.size)||e.size<0)throw new Error(`Repository source size is invalid: ${e.path}`);if(!Number.isFinite(e.mtimeMs)||e.mtimeMs<0)throw new Error(`Repository source mtimeMs is invalid: ${e.path}`);if(Buffer.byteLength(e.content,"utf8")>4*1024*1024)throw new Error(`Repository source exceeds 4 MiB: ${e.path}`);return{...e,workspaceId:e.workspaceId.trim(),root:e.root.trim(),path:g(e.path)}}function Y(e){if(!e.model.trim()||!Number.isInteger(e.dimensions)||e.dimensions<1||e.dimensions>65536)throw new Error("Repository embedding metadata is invalid");if(e.vector.length!==e.dimensions||e.vector.some(t=>!Number.isFinite(t)))throw new Error("Repository embedding vector is invalid");return{...e,model:e.model.trim(),vector:[...e.vector]}}function Z(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>typeof t=="string"&&t.trim()).map(([t,n])=>[t,String(n).trim()]))}function V(e){return(e.normalize("NFKC").toLowerCase().match(/[\p{L}\p{N}_$.-]{2,}/gu)??[]).flatMap(t=>Te(t)).filter(t=>t.length>=2&&!ye.has(t))}function Te(e){let n=e.replace(/([a-z0-9])([A-Z])/gu,"$1 $2").replace(/[.$/_-]+/gu," ").toLowerCase().split(/\s+/u).filter(Boolean);return n.length>1?[e.toLowerCase(),...n]:n}function Be(e){let t=new Map;for(let n of V(e))if(t.set(n,(t.get(n)??0)+1),t.size>=fe)break;return Object.fromEntries([...t.entries()].sort(([n],[r])=>n.localeCompare(r)))}function He(e,t){let n=new Map;for(let r of e)n.set(t(r),[...n.get(t(r))??[],r]);return n}function U(e){return M(g(e).split("/").pop()??e).replace(/\.(test|spec)$/u,"").replace(/[-_]?(tests?|specs?)$/u,"")}function M(e){return e.replace(/\.(d\.)?(c|m)?(js|ts)x?$|\.(py|go|rs|java|cs|cpp|cxx|cc|c|h|hpp|rb|php|swift|kt|kts|md|mdx)$/u,"")}function Q(e){let t=g(e);if(!t||t.startsWith("/")||/^[A-Za-z]:\//u.test(t)||t.split("/").includes(".."))throw new Error(`Repository path must be relative and confined: ${e}`);return t}function g(e){return e.replace(/\\/gu,"/").replace(/^\.\//u,"").replace(/\/{2,}/gu,"/")}function ee(e){return e.replace(/\r\n?/gu,`
8
- `)}function Oe(e){return e?e.split(`
9
- `).length:1}function je(e,t){return`${e.workspaceId}:${e.path}`.localeCompare(`${t.workspaceId}:${t.path}`)}function S(e,t){return`${e}_${b(t).slice(0,24)}`}function b(e){return(0,D.createHash)("sha256").update(e,"utf8").digest("hex")}function $(e){return JSON.stringify(j(e))}function j(e){return Array.isArray(e)?e.map(j):!e||typeof e!="object"?e:Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0).sort(([t],[n])=>t.localeCompare(n)).map(([t,n])=>[t,j(n)]))}function A(e,t,n,r){if(!Number.isInteger(e)||e<t||e>n)throw new Error(`${r} must be an integer between ${t} and ${n}`);return e}function P(e,t){if(!Number.isFinite(Date.parse(e)))throw new Error(`${t} must be an ISO timestamp`);return e}function O(e){return Math.round(e*1e6)/1e6}var ne=require("node:crypto"),I=require("node:fs/promises"),T=require("node:path");var R=de(require("node:fs/promises"),1);var Pe=new Set(["EACCES","EBUSY","EPERM"]),qe=[10,20,40,80,160,320,640];async function te(e,t){for(let n=0;;n+=1)try{await R.rename(e,t);return}catch(r){let o=r.code,a=qe[n];if(process.platform!=="win32"||!o||!Pe.has(o)||a===void 0)throw r;await new Promise(i=>setTimeout(i,a))}}var z=512*1024*1024,K=class{path;constructor(t){this.path=(0,T.resolve)(t)}async exists(){try{return(await(0,I.stat)(this.path)).isFile()}catch{return!1}}async load(){let t=await(0,I.stat)(this.path);if(!t.isFile())throw new Error("Repository index path is not a regular file");if(t.size>z)throw new Error(`Repository index exceeds ${z} bytes`);let n;try{n=JSON.parse(await(0,I.readFile)(this.path,"utf8"))}catch(r){throw new Error(`Repository index is invalid JSON: ${r instanceof Error?r.message:String(r)}`)}return X(n)}async save(t){X(t);let n=`${JSON.stringify(t)}
10
- `;if(Buffer.byteLength(n,"utf8")>z)throw new Error(`Repository index exceeds ${z} bytes`);await(0,I.mkdir)((0,T.dirname)(this.path),{recursive:!0,mode:448});let r=`${this.path}.${process.pid}.${(0,ne.randomUUID)()}.tmp`;await(0,I.writeFile)(r,n,{encoding:"utf8",mode:384,flag:"wx"}),await te(r,this.path)}};0&&(module.exports={XENO_REPOSITORY_INDEX_SCHEMA_VERSION,XenoRepositoryIndexFileStore,buildXenoRepositoryIndex,buildXenoRepositoryIndexWithEmbeddings,detectRepositoryDocumentKind,detectRepositoryLanguage,inspectXenoRepositoryFreshness,inspectXenoRepositorySymbol,searchXenoRepositoryIndex,validateXenoRepositoryIndex});
3
+ `).length>r;)s-=1;let p=o.slice(i,s).join(`
4
+ `),d=b(p);a.push({chunkId:X("chunk",`${e}:${i+1}:${s}:${d}`),startLine:i+1,endLine:Math.max(i+1,s),content:p,contentHash:d,terms:je(p)}),i=s}return a.length?a:[{chunkId:X("chunk",`${e}:1:1:${b("")}`),startLine:1,endLine:1,content:"",contentHash:b(""),terms:{}}]}function Xe(e,t){let n=[],r=e.split(`
5
+ `),o=ve(t);return r.forEach((a,i)=>{for(let s of o){let p=s.expression.exec(a);if(p?.groups?.name){n.push({name:p.groups.name,kind:s.kind,line:i+1,exported:/\b(export|public|pub)\b/u.test(a),signature:a.trim().slice(0,1e3)});break}}}),n.slice(0,2e4)}function ve(e){return e==="markdown"?[{kind:"heading",expression:/^#{1,6}\s+(?<name>.+?)\s*$/u}]:e==="python"?[{kind:"class",expression:/^\s*class\s+(?<name>[A-Za-z_][\w]*)/u},{kind:"function",expression:/^\s*(?:async\s+)?def\s+(?<name>[A-Za-z_][\w]*)/u}]:e==="go"?[{kind:"function",expression:/^\s*func\s+(?:\([^)]*\)\s*)?(?<name>[A-Za-z_][\w]*)/u},{kind:"type",expression:/^\s*type\s+(?<name>[A-Za-z_][\w]*)/u}]:e==="rust"?[{kind:"function",expression:/^\s*(?:pub(?:\([^)]*\))?\s+)?(?:async\s+)?fn\s+(?<name>[A-Za-z_][\w]*)/u},{kind:"class",expression:/^\s*(?:pub(?:\([^)]*\))?\s+)?struct\s+(?<name>[A-Za-z_][\w]*)/u},{kind:"enum",expression:/^\s*(?:pub(?:\([^)]*\))?\s+)?enum\s+(?<name>[A-Za-z_][\w]*)/u},{kind:"interface",expression:/^\s*(?:pub(?:\([^)]*\))?\s+)?trait\s+(?<name>[A-Za-z_][\w]*)/u}]:[{kind:"class",expression:/^\s*(?:export\s+)?(?:default\s+)?(?:abstract\s+)?class\s+(?<name>[A-Za-z_$][\w$]*)/u},{kind:"interface",expression:/^\s*(?:export\s+)?interface\s+(?<name>[A-Za-z_$][\w$]*)/u},{kind:"type",expression:/^\s*(?:export\s+)?type\s+(?<name>[A-Za-z_$][\w$]*)/u},{kind:"enum",expression:/^\s*(?:export\s+)?(?:const\s+)?enum\s+(?<name>[A-Za-z_$][\w$]*)/u},{kind:"function",expression:/^\s*(?:export\s+)?(?:default\s+)?(?:async\s+)?function\s*\*?\s*(?<name>[A-Za-z_$][\w$]*)/u},{kind:"variable",expression:/^\s*(?:export\s+)?(?:const|let|var)\s+(?<name>[A-Za-z_$][\w$]*)/u}]}function $e(e,t){let n=[];return e.split(`
6
+ `).forEach((r,o)=>{let a=t==="python"?/^\s*(?:from\s+(?<from>[.\w]+)\s+import|import\s+(?<plain>[.\w]+))/u.exec(r):/(?:\bfrom\s*|\brequire\s*\(\s*|\bimport\s*\(\s*)["'](?<module>[^"']+)["']/u.exec(r),i=a?.groups?.module??a?.groups?.from??a?.groups?.plain;i&&n.push({specifier:i,line:o+1})}),n.slice(0,2e4)}function Fe(e){let t=new Map;for(let n of e){let r=`${n.workspaceId}:${A(n.path)}`;t.set(r,n),t.set(`${n.workspaceId}:${n.path}`,n),t.set(`${n.workspaceId}:${A(n.path)}/index`,n)}return t}function Ce(e,t,n){if(!t.startsWith("."))return;let o=[...e.path.split("/").slice(0,-1),...t.replace(/\\/gu,"/").split("/")],a=[];for(let s of o)!s||s==="."||(s===".."?a.pop():a.push(s));let i=a.join("/");return n.get(`${e.workspaceId}:${i}`)??n.get(`${e.workspaceId}:${A(i)}`)??n.get(`${e.workspaceId}:${i}/index`)}function _e(e){let t=[],n=new Map;for(let r of e.filter(o=>o.kind==="source")){let o=J(r.path),a=`${r.workspaceId}:${o}`;n.set(a,[...n.get(a)??[],r])}for(let r of e.filter(o=>o.kind==="test")){let o=n.get(`${r.workspaceId}:${J(r.path)}`)??[];for(let a of o.slice(0,8))t.push(N("tests",r.fileId,a.fileId,r.path,void 0,`Test ownership inferred for ${a.path}`,.8))}return t}function Le(e){let t=[],n=e.filter(r=>r.kind!=="documentation");for(let r of e.filter(o=>o.kind==="documentation")){let o=r.chunks.map(a=>a.content).join(`
7
+ `).toLowerCase();for(let a of n){let i=a.path.toLowerCase(),s=i.split("/").pop()??i;if(!(!o.includes(i)&&(s.length<5||!o.includes(s)))&&(t.push(N("documents",r.fileId,a.fileId,r.path,void 0,`Documentation references ${a.path}`,.85)),t.length>=5e4))return t}}return t}function N(e,t,n,r,o,a,i){return{relationshipId:X("relationship",`${e}:${t}:${n}:${o??0}`),kind:e,fromId:t,toId:n,confidence:i,evidence:{path:r,...o?{line:o}:{},summary:a}}}function Me(e){return[...new Map(e.map(t=>[t.relationshipId,t])).values()].sort((t,n)=>t.relationshipId.localeCompare(n.relationshipId))}function Ne(e){let t=new Map;for(let n of e)for(let r of n.chunks)for(let o of Object.keys(r.terms))t.set(o,(t.get(o)??0)+1);return t}function Ae(e,t,n,r){let o=Object.values(e.terms).reduce((i,s)=>i+s,0),a=0;for(let i of t){let s=e.terms[i]??0;if(!s)continue;let p=n.get(i)??0,d=Math.log(1+(r-p+.5)/(p+.5));a+=d*(s*2.2/(s+1.2*(.25+.75*o/350)))}return a}function ze(e,t){if(!e||!t||e.length===0||e.length!==t.length)return 0;let n=0,r=0,o=0;for(let a=0;a<e.length;a+=1){let i=e[a]??0,s=t[a]??0;n+=i*s,r+=i*i,o+=s*s}return r&&o?n/Math.sqrt(r*o):0}function Te(e,t){let n=e.replace(/\s+/gu," ").trim();if(n.length<=600)return n;let r=n.toLowerCase(),o=t.map(p=>r.indexOf(p)).filter(p=>p>=0),a=o.length?Math.min(...o):0,i=Math.max(0,a-180),s=Math.min(n.length,i+600);return`${i?"\u2026":""}${n.slice(i,s)}${s<n.length?"\u2026":""}`}function De(e){return b(v(e.map(t=>({workspaceId:t.workspaceId,root:t.root,path:g(t.path),size:t.size,mtimeMs:t.mtimeMs,contentHash:b(te(t.content)),git:t.git}))))}function Be(e){return b(v([...e].map(t=>({workspaceId:t.workspaceId,path:g(t.path),size:t.size,mtimeMs:t.mtimeMs,contentHash:t.contentHash})).sort((t,n)=>`${t.workspaceId}:${t.path}`.localeCompare(`${n.workspaceId}:${n.path}`))))}function Oe(e){if(!e.workspaceId.trim())throw new Error("Repository source workspaceId is required");if(!e.root.trim())throw new Error("Repository source root is required");if(ee(e.path),!Number.isFinite(e.size)||e.size<0)throw new Error(`Repository source size is invalid: ${e.path}`);if(!Number.isFinite(e.mtimeMs)||e.mtimeMs<0)throw new Error(`Repository source mtimeMs is invalid: ${e.path}`);if(Buffer.byteLength(e.content,"utf8")>4*1024*1024)throw new Error(`Repository source exceeds 4 MiB: ${e.path}`);return{...e,workspaceId:e.workspaceId.trim(),root:e.root.trim(),path:g(e.path)}}function V(e){if(!e.model.trim()||!Number.isInteger(e.dimensions)||e.dimensions<1||e.dimensions>65536)throw new Error("Repository embedding metadata is invalid");if(e.vector.length!==e.dimensions||e.vector.some(t=>!Number.isFinite(t)))throw new Error("Repository embedding vector is invalid");return{...e,model:e.model.trim(),vector:[...e.vector]}}function U(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>typeof t=="string"&&t.trim()).map(([t,n])=>[t,String(n).trim()]))}function Q(e){return(e.normalize("NFKC").toLowerCase().match(/[\p{L}\p{N}_$.-]{2,}/gu)??[]).flatMap(t=>He(t)).filter(t=>t.length>=2&&!Re.has(t))}function He(e){let n=e.replace(/([a-z0-9])([A-Z])/gu,"$1 $2").replace(/[.$/_-]+/gu," ").toLowerCase().split(/\s+/u).filter(Boolean);return n.length>1?[e.toLowerCase(),...n]:n}function je(e){let t=new Map;for(let n of Q(e))if(t.set(n,(t.get(n)??0)+1),t.size>=ye)break;return Object.fromEntries([...t.entries()].sort(([n],[r])=>n.localeCompare(r)))}function qe(e,t){let n=new Map;for(let r of e)n.set(t(r),[...n.get(t(r))??[],r]);return n}function J(e){return A(g(e).split("/").pop()??e).replace(/\.(test|spec)$/u,"").replace(/[-_]?(tests?|specs?)$/u,"")}function A(e){return e.replace(/\.(d\.)?(c|m)?(js|ts)x?$|\.(py|go|rs|java|cs|cpp|cxx|cc|c|h|hpp|rb|php|swift|kt|kts|md|mdx)$/u,"")}function ee(e){let t=g(e);if(!t||t.startsWith("/")||/^[A-Za-z]:\//u.test(t)||t.split("/").includes(".."))throw new Error(`Repository path must be relative and confined: ${e}`);return t}function g(e){return e.replace(/\\/gu,"/").replace(/^\.\//u,"").replace(/\/{2,}/gu,"/")}function te(e){return e.replace(/\r\n?/gu,`
8
+ `)}function Pe(e){return e?e.split(`
9
+ `).length:1}function Ke(e,t){return`${e.workspaceId}:${e.path}`.localeCompare(`${t.workspaceId}:${t.path}`)}function X(e,t){return`${e}_${b(t).slice(0,24)}`}function b(e){return(0,z.createHash)("sha256").update(e,"utf8").digest("hex")}function v(e){return JSON.stringify(j(e))}function j(e){return Array.isArray(e)?e.map(j):!e||typeof e!="object"?e:Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0).sort(([t],[n])=>t.localeCompare(n)).map(([t,n])=>[t,j(n)]))}function M(e,t,n,r){if(!Number.isInteger(e)||e<t||e>n)throw new Error(`${r} must be an integer between ${t} and ${n}`);return e}function q(e,t){if(!Number.isFinite(Date.parse(e)))throw new Error(`${t} must be an ISO timestamp`);return e}function H(e){return Math.round(e*1e6)/1e6}var se=require("node:crypto"),I=require("node:fs/promises"),D=require("node:path");var R=me(require("node:fs/promises"),1);var ne=Symbol.for("@xenosystem/agent-sdk/file-cache"),re=globalThis,K=re[ne]??{entries:new Map,counters:{reads:0,hits:0}};re[ne]=K;var et=K.entries,tt=K.counters;var We=new Set(["EACCES","EBUSY","EPERM"]),Ze=[10,20,40,80,160,320,640];async function oe(e,t){for(let n=0;;n+=1)try{await R.rename(e,t);return}catch(r){let o=r.code,a=Ze[n];if(process.platform!=="win32"||!o||!We.has(o)||a===void 0)throw r;await new Promise(i=>setTimeout(i,a))}}var T=512*1024*1024,W=class{path;constructor(t){this.path=(0,D.resolve)(t)}async exists(){try{return(await(0,I.stat)(this.path)).isFile()}catch{return!1}}async load(){let t=await(0,I.stat)(this.path);if(!t.isFile())throw new Error("Repository index path is not a regular file");if(t.size>T)throw new Error(`Repository index exceeds ${T} bytes`);let n;try{n=JSON.parse(await(0,I.readFile)(this.path,"utf8"))}catch(r){throw new Error(`Repository index is invalid JSON: ${r instanceof Error?r.message:String(r)}`)}return E(n)}async save(t){E(t);let n=`${JSON.stringify(t)}
10
+ `;if(Buffer.byteLength(n,"utf8")>T)throw new Error(`Repository index exceeds ${T} bytes`);await(0,I.mkdir)((0,D.dirname)(this.path),{recursive:!0,mode:448});let r=`${this.path}.${process.pid}.${(0,se.randomUUID)()}.tmp`;await(0,I.writeFile)(r,n,{encoding:"utf8",mode:384,flag:"wx"}),await oe(r,this.path)}};0&&(module.exports={XENO_REPOSITORY_INDEX_SCHEMA_VERSION,XenoRepositoryIndexFileStore,buildXenoRepositoryIndex,buildXenoRepositoryIndexWithEmbeddings,detectRepositoryDocumentKind,detectRepositoryLanguage,inspectXenoRepositoryFreshness,inspectXenoRepositorySymbol,searchXenoRepositoryIndex,validateXenoRepositoryIndex});
@@ -1,10 +1,10 @@
1
- var D="xeno.repository-index.v1";import{createHash as Y,randomUUID as V}from"node:crypto";var Q=120,ee=24e3,te=4096,ne=64,re={c:"c",cc:"cpp",cjs:"javascript",cpp:"cpp",cs:"csharp",css:"css",cxx:"cpp",go:"go",h:"c",hpp:"cpp",html:"html",java:"java",js:"javascript",json:"json",jsx:"javascriptreact",kt:"kotlin",kts:"kotlin",md:"markdown",mdx:"markdown",mjs:"javascript",php:"php",py:"python",rb:"ruby",rs:"rust",sh:"shell",sql:"sql",svelte:"svelte",swift:"swift",toml:"toml",ts:"typescript",tsx:"typescriptreact",vue:"vue",yaml:"yaml",yml:"yaml"},oe=new Set(["a","an","and","are","as","at","be","by","for","from","has","have","if","in","is","it","of","on","or","that","the","this","to","was","were","will","with","true","false","null","const","let","var","return","export","import","function","class","interface","type","public","private"]);function se(e,t={}){let n=e.map(Ie).sort($e),r=B(t.createdAt??t.updatedAt??new Date().toISOString(),"createdAt"),i=B(t.updatedAt??r,"updatedAt"),a=L(t.chunkLines??Q,20,1e3,"chunkLines"),s=L(t.maxChunkChars??ee,1e3,256e3,"maxChunkChars"),o=[],d=[],p=[],m=new Map;for(let c of n){let f=W(c.content),x=b(f),w=E("file",`${c.workspaceId}:${g(c.path)}`),y=c.language?.trim().toLowerCase()||j(c.path),v=c.kind??ie(c.path,y),F=ae(w,f,a,s),M=ce(f,y).map(h=>({symbolId:E("symbol",`${w}:${h.kind}:${h.name}:${h.line}`),fileId:w,workspaceId:c.workspaceId,path:g(c.path),name:h.name,qualifiedName:`${g(c.path)}#${h.name}`,kind:h.kind,language:y,startLine:h.line,endLine:h.line,exported:h.exported,...h.signature?{signature:h.signature}:{}})),J={fileId:w,workspaceId:c.workspaceId,root:c.root,path:g(c.path),language:y,kind:v,size:c.size,mtimeMs:c.mtimeMs,contentHash:x,lineCount:Se(f),chunks:F,symbolIds:M.map(h=>h.symbolId),...c.git?{git:H(c.git)}:{}};o.push(J),d.push(...M),m.set(w,de(f,y));for(let h of M)p.push(_("defines",w,h.symbolId,h.path,h.startLine,`Defines ${h.kind} ${h.name}`,1))}let I=ue(o);for(let c of o)for(let f of m.get(c.fileId)??[]){let x=le(c,f.specifier,I);x&&p.push(_("imports",c.fileId,x.fileId,c.path,f.line,`Imports ${f.specifier}`,.98))}p.push(...me(o)),p.push(...fe(o));let u=Re(n),l=he(p),N={workspaces:new Set(o.map(c=>c.workspaceId)).size,files:o.length,chunks:o.reduce((c,f)=>c+f.chunks.length,0),symbols:d.length,relationships:l.length,embeddedChunks:o.reduce((c,f)=>c+f.chunks.filter(x=>x.embedding).length,0),sourceBytes:o.reduce((c,f)=>c+f.size,0)},X=[...new Map(n.map(c=>[c.workspaceId,c])).values()].map(c=>({workspaceId:c.workspaceId,root:c.root,...c.git?{git:H(c.git)}:{},indexedAt:i})).sort((c,f)=>c.workspaceId.localeCompare(f.workspaceId)),$={schemaVersion:D,indexId:t.indexId?.trim()||`repo_index_${V()}`,revision:L(t.revision??1,1,Number.MAX_SAFE_INTEGER,"revision"),createdAt:r,updatedAt:i,sourceFingerprint:u,producer:{id:t.producer?.id?.trim()||"xeno-agent-sdk",...t.producer?.version?{version:t.producer.version.trim()}:{}},workspaces:X,files:o,symbols:d,relationships:l,stats:N};return{...$,indexHash:b(S($))}}async function He(e,t,n={}){if(!t.id.trim()||!t.model.trim())throw new Error("Repository embedding provider identity is required");let r=se(e,n),i=await Promise.all(r.files.map(async d=>({...d,chunks:await Promise.all(d.chunks.map(async p=>{let m=P(await t.embed({workspaceId:d.workspaceId,path:d.path,startLine:p.startLine,endLine:p.endLine,content:p.content,contentHash:p.contentHash}));if(m.contentHash!==p.contentHash)throw new Error(`Repository embedding content hash mismatch for ${d.path}:${p.startLine}`);if(m.model!==t.model)throw new Error(`Repository embedding model mismatch for ${d.path}:${p.startLine}`);return{...p,embedding:m}}))}))),a={...r,files:i,stats:{...r.stats,embeddedChunks:i.reduce((d,p)=>d+p.chunks.filter(m=>m.embedding).length,0)}},{indexHash:s,...o}=a;return{...a,indexHash:b(S(o))}}function Oe(e,t){k(e);let n=t.query.trim();if(!n||n.length>8192)throw new Error("Repository search query must contain 1-8192 characters");let r=t.mode??"hybrid",i=t.queryEmbedding?P(t.queryEmbedding):void 0,a=[...new Set(q(n))].slice(0,ne),s=Ee(e.symbols,u=>u.fileId),o=ge(e.files),d=Math.max(1,e.stats.chunks),p=[],m=0;for(let u of e.files)if(!(t.workspaceIds?.length&&!t.workspaceIds.includes(u.workspaceId))&&!(t.kinds?.length&&!t.kinds.includes(u.kind))&&!(t.languages?.length&&!t.languages.includes(u.language)))for(let l of u.chunks){m+=1;let N=a.filter(y=>(l.terms[y]??0)>0),X=r==="semantic"?0:ye(l,a,o,d),$=!!(i&&l.embedding&&i.model===l.embedding.model&&i.dimensions===l.embedding.dimensions),c=r==="lexical"||!$?0:be(i?.vector,l.embedding?.vector),f=(s.get(u.fileId)??[]).filter(y=>{let v=y.name.toLowerCase();return a.some(F=>v===F||v.includes(F))}),x=f.length*1.5,w=r==="lexical"?X+x:r==="semantic"?c+x:X*.65+c*6*.35+x;w<=0||p.push({resultId:l.chunkId,workspaceId:u.workspaceId,path:u.path,kind:u.kind,language:u.language,startLine:l.startLine,endLine:l.endLine,snippet:xe(l.content,a),score:z(w),lexicalScore:z(X),semanticScore:z(c),matchedTerms:N,symbolIds:f.map(y=>y.symbolId),provenance:{indexId:e.indexId,indexRevision:e.revision,indexHash:e.indexHash,sourceFingerprint:e.sourceFingerprint,contentHash:l.contentHash,...u.git?{git:u.git}:{}}})}let I=L(t.limit??20,1,100,"limit");return p.sort((u,l)=>l.score-u.score||u.path.localeCompare(l.path)||u.startLine-l.startLine),{query:{...t,query:n,mode:r},results:p.slice(0,I),totalCandidates:m,semanticAvailable:!!(i&&e.files.some(u=>u.chunks.some(l=>l.embedding?.model===i.model&&l.embedding.dimensions===i.dimensions))),index:{indexId:e.indexId,revision:e.revision,indexHash:e.indexHash,updatedAt:e.updatedAt}}}function je(e,t){k(e);let n=e.symbols.find(o=>o.symbolId===t||o.qualifiedName===t),r=n?.symbolId??t,i=e.relationships.filter(o=>o.toId===r||n&&o.toId===n.fileId),a=e.relationships.filter(o=>o.fromId===r||n&&o.fromId===n.fileId),s=new Set([...i.map(o=>o.fromId),...a.map(o=>o.toId)]);return{...n?{symbol:n}:{},incoming:i,outgoing:a,relatedSymbols:e.symbols.filter(o=>s.has(o.symbolId)),relatedFiles:e.files.filter(o=>s.has(o.fileId)||o.fileId===n?.fileId)}}function Pe(e,t,n=new Date().toISOString()){k(e);let r=new Map(e.files.map(p=>[`${p.workspaceId}:${p.path}`,p])),i=new Map(t.map(p=>[`${p.workspaceId}:${g(p.path)}`,p])),a=[],s=[],o=[];for(let[p,m]of i){let I=r.get(p);I?(m.contentHash?m.contentHash!==I.contentHash:m.size!==I.size||m.mtimeMs!==I.mtimeMs)&&s.push(m.path):a.push(m.path)}for(let[p,m]of r)i.has(p)||o.push(m.path);let d=we(t);return{state:a.length||s.length||o.length?"stale":"fresh",checkedAt:B(n,"checkedAt"),added:a.sort(),changed:s.sort(),removed:o.sort(),sourceFingerprint:d,indexedSourceFingerprint:e.sourceFingerprint}}function k(e){if(e.schemaVersion!==D)throw new Error("Unsupported repository index schema");if(!e.indexId||!Number.isInteger(e.revision)||e.revision<1)throw new Error("Repository index identity is invalid");let t=new Set;for(let s of e.files){if(t.has(s.fileId))throw new Error(`Duplicate repository file ID: ${s.fileId}`);t.add(s.fileId),K(s.path)}let n=new Set;for(let s of e.symbols){if(!t.has(s.fileId))throw new Error(`Repository symbol references unknown file: ${s.symbolId}`);if(n.has(s.symbolId))throw new Error(`Duplicate repository symbol ID: ${s.symbolId}`);n.add(s.symbolId)}let r=new Set([...t,...n]);for(let s of e.relationships)if(!r.has(s.fromId)||!r.has(s.toId))throw new Error(`Repository relationship ${s.relationshipId} is dangling`);let{indexHash:i,...a}=e;if(b(S(a))!==e.indexHash)throw new Error("Repository index hash mismatch");return e}function j(e){let t=g(e).split("/").pop()??"",n=t.includes(".")?t.split(".").pop()?.toLowerCase()??"":"";return re[n]??"text"}function ie(e,t=j(e)){let n=g(e).toLowerCase();return/(^|\/)(test|tests|spec|specs|__tests__)(\/|$)|\.(test|spec)\.[^/]+$/u.test(n)?"test":t==="markdown"||/(^|\/)(docs?|documentation)(\/|$)/u.test(n)?"documentation":["json","yaml","toml"].includes(t)||/(^|\/)(\.github|config)(\/|$)/u.test(n)?"configuration":["typescript","typescriptreact","javascript","javascriptreact","python","go","rust","java","csharp","c","cpp","ruby","php","swift","kotlin","shell","sql"].includes(t)?"source":/\.(png|jpe?g|gif|webp|svg|ico|woff2?|ttf|mp[34]|wav)$/u.test(n)?"asset":"other"}function ae(e,t,n,r){let i=t.split(`
1
+ var z="xeno.repository-index.v1";import{createHash as ee,randomUUID as te}from"node:crypto";var ne=120,re=24e3,oe=4096,se=64,ie={c:"c",cc:"cpp",cjs:"javascript",cpp:"cpp",cs:"csharp",css:"css",cxx:"cpp",go:"go",h:"c",hpp:"cpp",html:"html",java:"java",js:"javascript",json:"json",jsx:"javascriptreact",kt:"kotlin",kts:"kotlin",md:"markdown",mdx:"markdown",mjs:"javascript",php:"php",py:"python",rb:"ruby",rs:"rust",sh:"shell",sql:"sql",svelte:"svelte",swift:"swift",toml:"toml",ts:"typescript",tsx:"typescriptreact",vue:"vue",yaml:"yaml",yml:"yaml"},ae=new Set(["a","an","and","are","as","at","be","by","for","from","has","have","if","in","is","it","of","on","or","that","the","this","to","was","were","will","with","true","false","null","const","let","var","return","export","import","function","class","interface","type","public","private"]);function ce(e,t={}){let n=e.map(Se).sort(Ce),r=B(t.createdAt??t.updatedAt??new Date().toISOString(),"createdAt"),i=B(t.updatedAt??r,"updatedAt"),a=C(t.chunkLines??ne,20,1e3,"chunkLines"),s=C(t.maxChunkChars??re,1e3,256e3,"maxChunkChars"),o=[],p=[],d=[],m=new Map;for(let c of n){let f=Z(c.content),x=b(f),w=S("file",`${c.workspaceId}:${g(c.path)}`),y=c.language?.trim().toLowerCase()||q(c.path),$=c.kind??de(c.path,y),F=pe(w,f,a,s),A=ue(f,y).map(h=>({symbolId:S("symbol",`${w}:${h.kind}:${h.name}:${h.line}`),fileId:w,workspaceId:c.workspaceId,path:g(c.path),name:h.name,qualifiedName:`${g(c.path)}#${h.name}`,kind:h.kind,language:y,startLine:h.line,endLine:h.line,exported:h.exported,...h.signature?{signature:h.signature}:{}})),Q={fileId:w,workspaceId:c.workspaceId,root:c.root,path:g(c.path),language:y,kind:$,size:c.size,mtimeMs:c.mtimeMs,contentHash:x,lineCount:Fe(f),chunks:F,symbolIds:A.map(h=>h.symbolId),...c.git?{git:H(c.git)}:{}};o.push(Q),p.push(...A),m.set(w,me(f,y));for(let h of A)d.push(_("defines",w,h.symbolId,h.path,h.startLine,`Defines ${h.kind} ${h.name}`,1))}let I=fe(o);for(let c of o)for(let f of m.get(c.fileId)??[]){let x=he(c,f.specifier,I);x&&d.push(_("imports",c.fileId,x.fileId,c.path,f.line,`Imports ${f.specifier}`,.98))}d.push(...ge(o)),d.push(...ye(o));let u=ke(n),l=be(d),N={workspaces:new Set(o.map(c=>c.workspaceId)).size,files:o.length,chunks:o.reduce((c,f)=>c+f.chunks.length,0),symbols:p.length,relationships:l.length,embeddedChunks:o.reduce((c,f)=>c+f.chunks.filter(x=>x.embedding).length,0),sourceBytes:o.reduce((c,f)=>c+f.size,0)},E=[...new Map(n.map(c=>[c.workspaceId,c])).values()].map(c=>({workspaceId:c.workspaceId,root:c.root,...c.git?{git:H(c.git)}:{},indexedAt:i})).sort((c,f)=>c.workspaceId.localeCompare(f.workspaceId)),v={schemaVersion:z,indexId:t.indexId?.trim()||`repo_index_${te()}`,revision:C(t.revision??1,1,Number.MAX_SAFE_INTEGER,"revision"),createdAt:r,updatedAt:i,sourceFingerprint:u,producer:{id:t.producer?.id?.trim()||"xeno-agent-sdk",...t.producer?.version?{version:t.producer.version.trim()}:{}},workspaces:E,files:o,symbols:p,relationships:l,stats:N};return{...v,indexHash:b(X(v))}}async function qe(e,t,n={}){if(!t.id.trim()||!t.model.trim())throw new Error("Repository embedding provider identity is required");let r=ce(e,n),i=await Promise.all(r.files.map(async p=>({...p,chunks:await Promise.all(p.chunks.map(async d=>{let m=P(await t.embed({workspaceId:p.workspaceId,path:p.path,startLine:d.startLine,endLine:d.endLine,content:d.content,contentHash:d.contentHash}));if(m.contentHash!==d.contentHash)throw new Error(`Repository embedding content hash mismatch for ${p.path}:${d.startLine}`);if(m.model!==t.model)throw new Error(`Repository embedding model mismatch for ${p.path}:${d.startLine}`);return{...d,embedding:m}}))}))),a={...r,files:i,stats:{...r.stats,embeddedChunks:i.reduce((p,d)=>p+d.chunks.filter(m=>m.embedding).length,0)}},{indexHash:s,...o}=a;return{...a,indexHash:b(X(o))}}function Pe(e,t){k(e);let n=t.query.trim();if(!n||n.length>8192)throw new Error("Repository search query must contain 1-8192 characters");let r=t.mode??"hybrid",i=t.queryEmbedding?P(t.queryEmbedding):void 0,a=[...new Set(K(n))].slice(0,se),s=$e(e.symbols,u=>u.fileId),o=xe(e.files),p=Math.max(1,e.stats.chunks),d=[],m=0;for(let u of e.files)if(!(t.workspaceIds?.length&&!t.workspaceIds.includes(u.workspaceId))&&!(t.kinds?.length&&!t.kinds.includes(u.kind))&&!(t.languages?.length&&!t.languages.includes(u.language)))for(let l of u.chunks){m+=1;let N=a.filter(y=>(l.terms[y]??0)>0),E=r==="semantic"?0:Re(l,a,o,p),v=!!(i&&l.embedding&&i.model===l.embedding.model&&i.dimensions===l.embedding.dimensions),c=r==="lexical"||!v?0:we(i?.vector,l.embedding?.vector),f=(s.get(u.fileId)??[]).filter(y=>{let $=y.name.toLowerCase();return a.some(F=>$===F||$.includes(F))}),x=f.length*1.5,w=r==="lexical"?E+x:r==="semantic"?c+x:E*.65+c*6*.35+x;w<=0||d.push({resultId:l.chunkId,workspaceId:u.workspaceId,path:u.path,kind:u.kind,language:u.language,startLine:l.startLine,endLine:l.endLine,snippet:Ie(l.content,a),score:T(w),lexicalScore:T(E),semanticScore:T(c),matchedTerms:N,symbolIds:f.map(y=>y.symbolId),provenance:{indexId:e.indexId,indexRevision:e.revision,indexHash:e.indexHash,sourceFingerprint:e.sourceFingerprint,contentHash:l.contentHash,...u.git?{git:u.git}:{}}})}let I=C(t.limit??20,1,100,"limit");return d.sort((u,l)=>l.score-u.score||u.path.localeCompare(l.path)||u.startLine-l.startLine),{query:{...t,query:n,mode:r},results:d.slice(0,I),totalCandidates:m,semanticAvailable:!!(i&&e.files.some(u=>u.chunks.some(l=>l.embedding?.model===i.model&&l.embedding.dimensions===i.dimensions))),index:{indexId:e.indexId,revision:e.revision,indexHash:e.indexHash,updatedAt:e.updatedAt}}}function Ke(e,t){k(e);let n=e.symbols.find(o=>o.symbolId===t||o.qualifiedName===t),r=n?.symbolId??t,i=e.relationships.filter(o=>o.toId===r||n&&o.toId===n.fileId),a=e.relationships.filter(o=>o.fromId===r||n&&o.fromId===n.fileId),s=new Set([...i.map(o=>o.fromId),...a.map(o=>o.toId)]);return{...n?{symbol:n}:{},incoming:i,outgoing:a,relatedSymbols:e.symbols.filter(o=>s.has(o.symbolId)),relatedFiles:e.files.filter(o=>s.has(o.fileId)||o.fileId===n?.fileId)}}function We(e,t,n=new Date().toISOString()){k(e);let r=new Map(e.files.map(d=>[`${d.workspaceId}:${d.path}`,d])),i=new Map(t.map(d=>[`${d.workspaceId}:${g(d.path)}`,d])),a=[],s=[],o=[];for(let[d,m]of i){let I=r.get(d);I?(m.contentHash?m.contentHash!==I.contentHash:m.size!==I.size||m.mtimeMs!==I.mtimeMs)&&s.push(m.path):a.push(m.path)}for(let[d,m]of r)i.has(d)||o.push(m.path);let p=Ee(t);return{state:a.length||s.length||o.length?"stale":"fresh",checkedAt:B(n,"checkedAt"),added:a.sort(),changed:s.sort(),removed:o.sort(),sourceFingerprint:p,indexedSourceFingerprint:e.sourceFingerprint}}function k(e){if(e.schemaVersion!==z)throw new Error("Unsupported repository index schema");if(!e.indexId||!Number.isInteger(e.revision)||e.revision<1)throw new Error("Repository index identity is invalid");let t=new Set;for(let s of e.files){if(t.has(s.fileId))throw new Error(`Duplicate repository file ID: ${s.fileId}`);t.add(s.fileId),W(s.path)}let n=new Set;for(let s of e.symbols){if(!t.has(s.fileId))throw new Error(`Repository symbol references unknown file: ${s.symbolId}`);if(n.has(s.symbolId))throw new Error(`Duplicate repository symbol ID: ${s.symbolId}`);n.add(s.symbolId)}let r=new Set([...t,...n]);for(let s of e.relationships)if(!r.has(s.fromId)||!r.has(s.toId))throw new Error(`Repository relationship ${s.relationshipId} is dangling`);let{indexHash:i,...a}=e;if(b(X(a))!==e.indexHash)throw new Error("Repository index hash mismatch");return e}function q(e){let t=g(e).split("/").pop()??"",n=t.includes(".")?t.split(".").pop()?.toLowerCase()??"":"";return ie[n]??"text"}function de(e,t=q(e)){let n=g(e).toLowerCase();return/(^|\/)(test|tests|spec|specs|__tests__)(\/|$)|\.(test|spec)\.[^/]+$/u.test(n)?"test":t==="markdown"||/(^|\/)(docs?|documentation)(\/|$)/u.test(n)?"documentation":["json","yaml","toml"].includes(t)||/(^|\/)(\.github|config)(\/|$)/u.test(n)?"configuration":["typescript","typescriptreact","javascript","javascriptreact","python","go","rust","java","csharp","c","cpp","ruby","php","swift","kotlin","shell","sql"].includes(t)?"source":/\.(png|jpe?g|gif|webp|svg|ico|woff2?|ttf|mp[34]|wav)$/u.test(n)?"asset":"other"}function pe(e,t,n,r){let i=t.split(`
2
2
  `),a=[],s=0;for(;s<i.length;){let o=Math.min(i.length,s+n);for(;o>s+1&&i.slice(s,o).join(`
3
- `).length>r;)o-=1;let d=i.slice(s,o).join(`
4
- `),p=b(d);a.push({chunkId:E("chunk",`${e}:${s+1}:${o}:${p}`),startLine:s+1,endLine:Math.max(s+1,o),content:d,contentHash:p,terms:Xe(d)}),s=o}return a.length?a:[{chunkId:E("chunk",`${e}:1:1:${b("")}`),startLine:1,endLine:1,content:"",contentHash:b(""),terms:{}}]}function ce(e,t){let n=[],r=e.split(`
5
- `),i=pe(t);return r.forEach((a,s)=>{for(let o of i){let d=o.expression.exec(a);if(d?.groups?.name){n.push({name:d.groups.name,kind:o.kind,line:s+1,exported:/\b(export|public|pub)\b/u.test(a),signature:a.trim().slice(0,1e3)});break}}}),n.slice(0,2e4)}function pe(e){return e==="markdown"?[{kind:"heading",expression:/^#{1,6}\s+(?<name>.+?)\s*$/u}]:e==="python"?[{kind:"class",expression:/^\s*class\s+(?<name>[A-Za-z_][\w]*)/u},{kind:"function",expression:/^\s*(?:async\s+)?def\s+(?<name>[A-Za-z_][\w]*)/u}]:e==="go"?[{kind:"function",expression:/^\s*func\s+(?:\([^)]*\)\s*)?(?<name>[A-Za-z_][\w]*)/u},{kind:"type",expression:/^\s*type\s+(?<name>[A-Za-z_][\w]*)/u}]:e==="rust"?[{kind:"function",expression:/^\s*(?:pub(?:\([^)]*\))?\s+)?(?:async\s+)?fn\s+(?<name>[A-Za-z_][\w]*)/u},{kind:"class",expression:/^\s*(?:pub(?:\([^)]*\))?\s+)?struct\s+(?<name>[A-Za-z_][\w]*)/u},{kind:"enum",expression:/^\s*(?:pub(?:\([^)]*\))?\s+)?enum\s+(?<name>[A-Za-z_][\w]*)/u},{kind:"interface",expression:/^\s*(?:pub(?:\([^)]*\))?\s+)?trait\s+(?<name>[A-Za-z_][\w]*)/u}]:[{kind:"class",expression:/^\s*(?:export\s+)?(?:default\s+)?(?:abstract\s+)?class\s+(?<name>[A-Za-z_$][\w$]*)/u},{kind:"interface",expression:/^\s*(?:export\s+)?interface\s+(?<name>[A-Za-z_$][\w$]*)/u},{kind:"type",expression:/^\s*(?:export\s+)?type\s+(?<name>[A-Za-z_$][\w$]*)/u},{kind:"enum",expression:/^\s*(?:export\s+)?(?:const\s+)?enum\s+(?<name>[A-Za-z_$][\w$]*)/u},{kind:"function",expression:/^\s*(?:export\s+)?(?:default\s+)?(?:async\s+)?function\s*\*?\s*(?<name>[A-Za-z_$][\w$]*)/u},{kind:"variable",expression:/^\s*(?:export\s+)?(?:const|let|var)\s+(?<name>[A-Za-z_$][\w$]*)/u}]}function de(e,t){let n=[];return e.split(`
6
- `).forEach((r,i)=>{let a=t==="python"?/^\s*(?:from\s+(?<from>[.\w]+)\s+import|import\s+(?<plain>[.\w]+))/u.exec(r):/(?:\bfrom\s*|\brequire\s*\(\s*|\bimport\s*\(\s*)["'](?<module>[^"']+)["']/u.exec(r),s=a?.groups?.module??a?.groups?.from??a?.groups?.plain;s&&n.push({specifier:s,line:i+1})}),n.slice(0,2e4)}function ue(e){let t=new Map;for(let n of e){let r=`${n.workspaceId}:${C(n.path)}`;t.set(r,n),t.set(`${n.workspaceId}:${n.path}`,n),t.set(`${n.workspaceId}:${C(n.path)}/index`,n)}return t}function le(e,t,n){if(!t.startsWith("."))return;let i=[...e.path.split("/").slice(0,-1),...t.replace(/\\/gu,"/").split("/")],a=[];for(let o of i)!o||o==="."||(o===".."?a.pop():a.push(o));let s=a.join("/");return n.get(`${e.workspaceId}:${s}`)??n.get(`${e.workspaceId}:${C(s)}`)??n.get(`${e.workspaceId}:${s}/index`)}function me(e){let t=[],n=new Map;for(let r of e.filter(i=>i.kind==="source")){let i=O(r.path),a=`${r.workspaceId}:${i}`;n.set(a,[...n.get(a)??[],r])}for(let r of e.filter(i=>i.kind==="test")){let i=n.get(`${r.workspaceId}:${O(r.path)}`)??[];for(let a of i.slice(0,8))t.push(_("tests",r.fileId,a.fileId,r.path,void 0,`Test ownership inferred for ${a.path}`,.8))}return t}function fe(e){let t=[],n=e.filter(r=>r.kind!=="documentation");for(let r of e.filter(i=>i.kind==="documentation")){let i=r.chunks.map(a=>a.content).join(`
7
- `).toLowerCase();for(let a of n){let s=a.path.toLowerCase(),o=s.split("/").pop()??s;if(!(!i.includes(s)&&(o.length<5||!i.includes(o)))&&(t.push(_("documents",r.fileId,a.fileId,r.path,void 0,`Documentation references ${a.path}`,.85)),t.length>=5e4))return t}}return t}function _(e,t,n,r,i,a,s){return{relationshipId:E("relationship",`${e}:${t}:${n}:${i??0}`),kind:e,fromId:t,toId:n,confidence:s,evidence:{path:r,...i?{line:i}:{},summary:a}}}function he(e){return[...new Map(e.map(t=>[t.relationshipId,t])).values()].sort((t,n)=>t.relationshipId.localeCompare(n.relationshipId))}function ge(e){let t=new Map;for(let n of e)for(let r of n.chunks)for(let i of Object.keys(r.terms))t.set(i,(t.get(i)??0)+1);return t}function ye(e,t,n,r){let i=Object.values(e.terms).reduce((s,o)=>s+o,0),a=0;for(let s of t){let o=e.terms[s]??0;if(!o)continue;let d=n.get(s)??0,p=Math.log(1+(r-d+.5)/(d+.5));a+=p*(o*2.2/(o+1.2*(.25+.75*i/350)))}return a}function be(e,t){if(!e||!t||e.length===0||e.length!==t.length)return 0;let n=0,r=0,i=0;for(let a=0;a<e.length;a+=1){let s=e[a]??0,o=t[a]??0;n+=s*o,r+=s*s,i+=o*o}return r&&i?n/Math.sqrt(r*i):0}function xe(e,t){let n=e.replace(/\s+/gu," ").trim();if(n.length<=600)return n;let r=n.toLowerCase(),i=t.map(d=>r.indexOf(d)).filter(d=>d>=0),a=i.length?Math.min(...i):0,s=Math.max(0,a-180),o=Math.min(n.length,s+600);return`${s?"\u2026":""}${n.slice(s,o)}${o<n.length?"\u2026":""}`}function Re(e){return b(S(e.map(t=>({workspaceId:t.workspaceId,root:t.root,path:g(t.path),size:t.size,mtimeMs:t.mtimeMs,contentHash:b(W(t.content)),git:t.git}))))}function we(e){return b(S([...e].map(t=>({workspaceId:t.workspaceId,path:g(t.path),size:t.size,mtimeMs:t.mtimeMs,contentHash:t.contentHash})).sort((t,n)=>`${t.workspaceId}:${t.path}`.localeCompare(`${n.workspaceId}:${n.path}`))))}function Ie(e){if(!e.workspaceId.trim())throw new Error("Repository source workspaceId is required");if(!e.root.trim())throw new Error("Repository source root is required");if(K(e.path),!Number.isFinite(e.size)||e.size<0)throw new Error(`Repository source size is invalid: ${e.path}`);if(!Number.isFinite(e.mtimeMs)||e.mtimeMs<0)throw new Error(`Repository source mtimeMs is invalid: ${e.path}`);if(Buffer.byteLength(e.content,"utf8")>4*1024*1024)throw new Error(`Repository source exceeds 4 MiB: ${e.path}`);return{...e,workspaceId:e.workspaceId.trim(),root:e.root.trim(),path:g(e.path)}}function P(e){if(!e.model.trim()||!Number.isInteger(e.dimensions)||e.dimensions<1||e.dimensions>65536)throw new Error("Repository embedding metadata is invalid");if(e.vector.length!==e.dimensions||e.vector.some(t=>!Number.isFinite(t)))throw new Error("Repository embedding vector is invalid");return{...e,model:e.model.trim(),vector:[...e.vector]}}function H(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>typeof t=="string"&&t.trim()).map(([t,n])=>[t,String(n).trim()]))}function q(e){return(e.normalize("NFKC").toLowerCase().match(/[\p{L}\p{N}_$.-]{2,}/gu)??[]).flatMap(t=>ke(t)).filter(t=>t.length>=2&&!oe.has(t))}function ke(e){let n=e.replace(/([a-z0-9])([A-Z])/gu,"$1 $2").replace(/[.$/_-]+/gu," ").toLowerCase().split(/\s+/u).filter(Boolean);return n.length>1?[e.toLowerCase(),...n]:n}function Xe(e){let t=new Map;for(let n of q(e))if(t.set(n,(t.get(n)??0)+1),t.size>=te)break;return Object.fromEntries([...t.entries()].sort(([n],[r])=>n.localeCompare(r)))}function Ee(e,t){let n=new Map;for(let r of e)n.set(t(r),[...n.get(t(r))??[],r]);return n}function O(e){return C(g(e).split("/").pop()??e).replace(/\.(test|spec)$/u,"").replace(/[-_]?(tests?|specs?)$/u,"")}function C(e){return e.replace(/\.(d\.)?(c|m)?(js|ts)x?$|\.(py|go|rs|java|cs|cpp|cxx|cc|c|h|hpp|rb|php|swift|kt|kts|md|mdx)$/u,"")}function K(e){let t=g(e);if(!t||t.startsWith("/")||/^[A-Za-z]:\//u.test(t)||t.split("/").includes(".."))throw new Error(`Repository path must be relative and confined: ${e}`);return t}function g(e){return e.replace(/\\/gu,"/").replace(/^\.\//u,"").replace(/\/{2,}/gu,"/")}function W(e){return e.replace(/\r\n?/gu,`
8
- `)}function Se(e){return e?e.split(`
9
- `).length:1}function $e(e,t){return`${e.workspaceId}:${e.path}`.localeCompare(`${t.workspaceId}:${t.path}`)}function E(e,t){return`${e}_${b(t).slice(0,24)}`}function b(e){return Y("sha256").update(e,"utf8").digest("hex")}function S(e){return JSON.stringify(T(e))}function T(e){return Array.isArray(e)?e.map(T):!e||typeof e!="object"?e:Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0).sort(([t],[n])=>t.localeCompare(n)).map(([t,n])=>[t,T(n)]))}function L(e,t,n,r){if(!Number.isInteger(e)||e<t||e>n)throw new Error(`${r} must be an integer between ${t} and ${n}`);return e}function B(e,t){if(!Number.isFinite(Date.parse(e)))throw new Error(`${t} must be an ISO timestamp`);return e}function z(e){return Math.round(e*1e6)/1e6}import{randomUUID as Le}from"node:crypto";import{mkdir as _e,readFile as Ce,stat as U,writeFile as Ae}from"node:fs/promises";import{dirname as Ne,resolve as Me}from"node:path";import*as R from"node:fs/promises";var ve=new Set(["EACCES","EBUSY","EPERM"]),Fe=[10,20,40,80,160,320,640];async function Z(e,t){for(let n=0;;n+=1)try{await R.rename(e,t);return}catch(r){let i=r.code,a=Fe[n];if(process.platform!=="win32"||!i||!ve.has(i)||a===void 0)throw r;await new Promise(s=>setTimeout(s,a))}}var A=512*1024*1024,G=class{path;constructor(t){this.path=Me(t)}async exists(){try{return(await U(this.path)).isFile()}catch{return!1}}async load(){let t=await U(this.path);if(!t.isFile())throw new Error("Repository index path is not a regular file");if(t.size>A)throw new Error(`Repository index exceeds ${A} bytes`);let n;try{n=JSON.parse(await Ce(this.path,"utf8"))}catch(r){throw new Error(`Repository index is invalid JSON: ${r instanceof Error?r.message:String(r)}`)}return k(n)}async save(t){k(t);let n=`${JSON.stringify(t)}
10
- `;if(Buffer.byteLength(n,"utf8")>A)throw new Error(`Repository index exceeds ${A} bytes`);await _e(Ne(this.path),{recursive:!0,mode:448});let r=`${this.path}.${process.pid}.${Le()}.tmp`;await Ae(r,n,{encoding:"utf8",mode:384,flag:"wx"}),await Z(r,this.path)}};export{D as XENO_REPOSITORY_INDEX_SCHEMA_VERSION,G as XenoRepositoryIndexFileStore,se as buildXenoRepositoryIndex,He as buildXenoRepositoryIndexWithEmbeddings,ie as detectRepositoryDocumentKind,j as detectRepositoryLanguage,Pe as inspectXenoRepositoryFreshness,je as inspectXenoRepositorySymbol,Oe as searchXenoRepositoryIndex,k as validateXenoRepositoryIndex};
3
+ `).length>r;)o-=1;let p=i.slice(s,o).join(`
4
+ `),d=b(p);a.push({chunkId:S("chunk",`${e}:${s+1}:${o}:${d}`),startLine:s+1,endLine:Math.max(s+1,o),content:p,contentHash:d,terms:ve(p)}),s=o}return a.length?a:[{chunkId:S("chunk",`${e}:1:1:${b("")}`),startLine:1,endLine:1,content:"",contentHash:b(""),terms:{}}]}function ue(e,t){let n=[],r=e.split(`
5
+ `),i=le(t);return r.forEach((a,s)=>{for(let o of i){let p=o.expression.exec(a);if(p?.groups?.name){n.push({name:p.groups.name,kind:o.kind,line:s+1,exported:/\b(export|public|pub)\b/u.test(a),signature:a.trim().slice(0,1e3)});break}}}),n.slice(0,2e4)}function le(e){return e==="markdown"?[{kind:"heading",expression:/^#{1,6}\s+(?<name>.+?)\s*$/u}]:e==="python"?[{kind:"class",expression:/^\s*class\s+(?<name>[A-Za-z_][\w]*)/u},{kind:"function",expression:/^\s*(?:async\s+)?def\s+(?<name>[A-Za-z_][\w]*)/u}]:e==="go"?[{kind:"function",expression:/^\s*func\s+(?:\([^)]*\)\s*)?(?<name>[A-Za-z_][\w]*)/u},{kind:"type",expression:/^\s*type\s+(?<name>[A-Za-z_][\w]*)/u}]:e==="rust"?[{kind:"function",expression:/^\s*(?:pub(?:\([^)]*\))?\s+)?(?:async\s+)?fn\s+(?<name>[A-Za-z_][\w]*)/u},{kind:"class",expression:/^\s*(?:pub(?:\([^)]*\))?\s+)?struct\s+(?<name>[A-Za-z_][\w]*)/u},{kind:"enum",expression:/^\s*(?:pub(?:\([^)]*\))?\s+)?enum\s+(?<name>[A-Za-z_][\w]*)/u},{kind:"interface",expression:/^\s*(?:pub(?:\([^)]*\))?\s+)?trait\s+(?<name>[A-Za-z_][\w]*)/u}]:[{kind:"class",expression:/^\s*(?:export\s+)?(?:default\s+)?(?:abstract\s+)?class\s+(?<name>[A-Za-z_$][\w$]*)/u},{kind:"interface",expression:/^\s*(?:export\s+)?interface\s+(?<name>[A-Za-z_$][\w$]*)/u},{kind:"type",expression:/^\s*(?:export\s+)?type\s+(?<name>[A-Za-z_$][\w$]*)/u},{kind:"enum",expression:/^\s*(?:export\s+)?(?:const\s+)?enum\s+(?<name>[A-Za-z_$][\w$]*)/u},{kind:"function",expression:/^\s*(?:export\s+)?(?:default\s+)?(?:async\s+)?function\s*\*?\s*(?<name>[A-Za-z_$][\w$]*)/u},{kind:"variable",expression:/^\s*(?:export\s+)?(?:const|let|var)\s+(?<name>[A-Za-z_$][\w$]*)/u}]}function me(e,t){let n=[];return e.split(`
6
+ `).forEach((r,i)=>{let a=t==="python"?/^\s*(?:from\s+(?<from>[.\w]+)\s+import|import\s+(?<plain>[.\w]+))/u.exec(r):/(?:\bfrom\s*|\brequire\s*\(\s*|\bimport\s*\(\s*)["'](?<module>[^"']+)["']/u.exec(r),s=a?.groups?.module??a?.groups?.from??a?.groups?.plain;s&&n.push({specifier:s,line:i+1})}),n.slice(0,2e4)}function fe(e){let t=new Map;for(let n of e){let r=`${n.workspaceId}:${L(n.path)}`;t.set(r,n),t.set(`${n.workspaceId}:${n.path}`,n),t.set(`${n.workspaceId}:${L(n.path)}/index`,n)}return t}function he(e,t,n){if(!t.startsWith("."))return;let i=[...e.path.split("/").slice(0,-1),...t.replace(/\\/gu,"/").split("/")],a=[];for(let o of i)!o||o==="."||(o===".."?a.pop():a.push(o));let s=a.join("/");return n.get(`${e.workspaceId}:${s}`)??n.get(`${e.workspaceId}:${L(s)}`)??n.get(`${e.workspaceId}:${s}/index`)}function ge(e){let t=[],n=new Map;for(let r of e.filter(i=>i.kind==="source")){let i=j(r.path),a=`${r.workspaceId}:${i}`;n.set(a,[...n.get(a)??[],r])}for(let r of e.filter(i=>i.kind==="test")){let i=n.get(`${r.workspaceId}:${j(r.path)}`)??[];for(let a of i.slice(0,8))t.push(_("tests",r.fileId,a.fileId,r.path,void 0,`Test ownership inferred for ${a.path}`,.8))}return t}function ye(e){let t=[],n=e.filter(r=>r.kind!=="documentation");for(let r of e.filter(i=>i.kind==="documentation")){let i=r.chunks.map(a=>a.content).join(`
7
+ `).toLowerCase();for(let a of n){let s=a.path.toLowerCase(),o=s.split("/").pop()??s;if(!(!i.includes(s)&&(o.length<5||!i.includes(o)))&&(t.push(_("documents",r.fileId,a.fileId,r.path,void 0,`Documentation references ${a.path}`,.85)),t.length>=5e4))return t}}return t}function _(e,t,n,r,i,a,s){return{relationshipId:S("relationship",`${e}:${t}:${n}:${i??0}`),kind:e,fromId:t,toId:n,confidence:s,evidence:{path:r,...i?{line:i}:{},summary:a}}}function be(e){return[...new Map(e.map(t=>[t.relationshipId,t])).values()].sort((t,n)=>t.relationshipId.localeCompare(n.relationshipId))}function xe(e){let t=new Map;for(let n of e)for(let r of n.chunks)for(let i of Object.keys(r.terms))t.set(i,(t.get(i)??0)+1);return t}function Re(e,t,n,r){let i=Object.values(e.terms).reduce((s,o)=>s+o,0),a=0;for(let s of t){let o=e.terms[s]??0;if(!o)continue;let p=n.get(s)??0,d=Math.log(1+(r-p+.5)/(p+.5));a+=d*(o*2.2/(o+1.2*(.25+.75*i/350)))}return a}function we(e,t){if(!e||!t||e.length===0||e.length!==t.length)return 0;let n=0,r=0,i=0;for(let a=0;a<e.length;a+=1){let s=e[a]??0,o=t[a]??0;n+=s*o,r+=s*s,i+=o*o}return r&&i?n/Math.sqrt(r*i):0}function Ie(e,t){let n=e.replace(/\s+/gu," ").trim();if(n.length<=600)return n;let r=n.toLowerCase(),i=t.map(p=>r.indexOf(p)).filter(p=>p>=0),a=i.length?Math.min(...i):0,s=Math.max(0,a-180),o=Math.min(n.length,s+600);return`${s?"\u2026":""}${n.slice(s,o)}${o<n.length?"\u2026":""}`}function ke(e){return b(X(e.map(t=>({workspaceId:t.workspaceId,root:t.root,path:g(t.path),size:t.size,mtimeMs:t.mtimeMs,contentHash:b(Z(t.content)),git:t.git}))))}function Ee(e){return b(X([...e].map(t=>({workspaceId:t.workspaceId,path:g(t.path),size:t.size,mtimeMs:t.mtimeMs,contentHash:t.contentHash})).sort((t,n)=>`${t.workspaceId}:${t.path}`.localeCompare(`${n.workspaceId}:${n.path}`))))}function Se(e){if(!e.workspaceId.trim())throw new Error("Repository source workspaceId is required");if(!e.root.trim())throw new Error("Repository source root is required");if(W(e.path),!Number.isFinite(e.size)||e.size<0)throw new Error(`Repository source size is invalid: ${e.path}`);if(!Number.isFinite(e.mtimeMs)||e.mtimeMs<0)throw new Error(`Repository source mtimeMs is invalid: ${e.path}`);if(Buffer.byteLength(e.content,"utf8")>4*1024*1024)throw new Error(`Repository source exceeds 4 MiB: ${e.path}`);return{...e,workspaceId:e.workspaceId.trim(),root:e.root.trim(),path:g(e.path)}}function P(e){if(!e.model.trim()||!Number.isInteger(e.dimensions)||e.dimensions<1||e.dimensions>65536)throw new Error("Repository embedding metadata is invalid");if(e.vector.length!==e.dimensions||e.vector.some(t=>!Number.isFinite(t)))throw new Error("Repository embedding vector is invalid");return{...e,model:e.model.trim(),vector:[...e.vector]}}function H(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>typeof t=="string"&&t.trim()).map(([t,n])=>[t,String(n).trim()]))}function K(e){return(e.normalize("NFKC").toLowerCase().match(/[\p{L}\p{N}_$.-]{2,}/gu)??[]).flatMap(t=>Xe(t)).filter(t=>t.length>=2&&!ae.has(t))}function Xe(e){let n=e.replace(/([a-z0-9])([A-Z])/gu,"$1 $2").replace(/[.$/_-]+/gu," ").toLowerCase().split(/\s+/u).filter(Boolean);return n.length>1?[e.toLowerCase(),...n]:n}function ve(e){let t=new Map;for(let n of K(e))if(t.set(n,(t.get(n)??0)+1),t.size>=oe)break;return Object.fromEntries([...t.entries()].sort(([n],[r])=>n.localeCompare(r)))}function $e(e,t){let n=new Map;for(let r of e)n.set(t(r),[...n.get(t(r))??[],r]);return n}function j(e){return L(g(e).split("/").pop()??e).replace(/\.(test|spec)$/u,"").replace(/[-_]?(tests?|specs?)$/u,"")}function L(e){return e.replace(/\.(d\.)?(c|m)?(js|ts)x?$|\.(py|go|rs|java|cs|cpp|cxx|cc|c|h|hpp|rb|php|swift|kt|kts|md|mdx)$/u,"")}function W(e){let t=g(e);if(!t||t.startsWith("/")||/^[A-Za-z]:\//u.test(t)||t.split("/").includes(".."))throw new Error(`Repository path must be relative and confined: ${e}`);return t}function g(e){return e.replace(/\\/gu,"/").replace(/^\.\//u,"").replace(/\/{2,}/gu,"/")}function Z(e){return e.replace(/\r\n?/gu,`
8
+ `)}function Fe(e){return e?e.split(`
9
+ `).length:1}function Ce(e,t){return`${e.workspaceId}:${e.path}`.localeCompare(`${t.workspaceId}:${t.path}`)}function S(e,t){return`${e}_${b(t).slice(0,24)}`}function b(e){return ee("sha256").update(e,"utf8").digest("hex")}function X(e){return JSON.stringify(D(e))}function D(e){return Array.isArray(e)?e.map(D):!e||typeof e!="object"?e:Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0).sort(([t],[n])=>t.localeCompare(n)).map(([t,n])=>[t,D(n)]))}function C(e,t,n,r){if(!Number.isInteger(e)||e<t||e>n)throw new Error(`${r} must be an integer between ${t} and ${n}`);return e}function B(e,t){if(!Number.isFinite(Date.parse(e)))throw new Error(`${t} must be an ISO timestamp`);return e}function T(e){return Math.round(e*1e6)/1e6}import{randomUUID as Me}from"node:crypto";import{mkdir as Ne,readFile as Ae,stat as Y,writeFile as ze}from"node:fs/promises";import{dirname as Te,resolve as De}from"node:path";import*as R from"node:fs/promises";var U=Symbol.for("@xenosystem/agent-sdk/file-cache"),J=globalThis,O=J[U]??{entries:new Map,counters:{reads:0,hits:0}};J[U]=O;var Ue=O.entries,Je=O.counters;var _e=new Set(["EACCES","EBUSY","EPERM"]),Le=[10,20,40,80,160,320,640];async function G(e,t){for(let n=0;;n+=1)try{await R.rename(e,t);return}catch(r){let i=r.code,a=Le[n];if(process.platform!=="win32"||!i||!_e.has(i)||a===void 0)throw r;await new Promise(s=>setTimeout(s,a))}}var M=512*1024*1024,V=class{path;constructor(t){this.path=De(t)}async exists(){try{return(await Y(this.path)).isFile()}catch{return!1}}async load(){let t=await Y(this.path);if(!t.isFile())throw new Error("Repository index path is not a regular file");if(t.size>M)throw new Error(`Repository index exceeds ${M} bytes`);let n;try{n=JSON.parse(await Ae(this.path,"utf8"))}catch(r){throw new Error(`Repository index is invalid JSON: ${r instanceof Error?r.message:String(r)}`)}return k(n)}async save(t){k(t);let n=`${JSON.stringify(t)}
10
+ `;if(Buffer.byteLength(n,"utf8")>M)throw new Error(`Repository index exceeds ${M} bytes`);await Ne(Te(this.path),{recursive:!0,mode:448});let r=`${this.path}.${process.pid}.${Me()}.tmp`;await ze(r,n,{encoding:"utf8",mode:384,flag:"wx"}),await G(r,this.path)}};export{z as XENO_REPOSITORY_INDEX_SCHEMA_VERSION,V as XenoRepositoryIndexFileStore,ce as buildXenoRepositoryIndex,qe as buildXenoRepositoryIndexWithEmbeddings,de as detectRepositoryDocumentKind,q as detectRepositoryLanguage,We as inspectXenoRepositoryFreshness,Ke as inspectXenoRepositorySymbol,Pe as searchXenoRepositoryIndex,k as validateXenoRepositoryIndex};
@@ -1 +1 @@
1
- {"inputs":{"src/intelligence/types.ts":{"bytes":5352,"imports":[],"format":"esm"},"src/intelligence/repository-index.ts":{"bytes":33925,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/intelligence/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/utils/fs.ts":{"bytes":13746,"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/intelligence/file-store.ts":{"bytes":1879,"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/intelligence/repository-index.ts","kind":"import-statement","original":"./repository-index.js"}],"format":"esm"},"src/intelligence/index.ts":{"bytes":100,"imports":[{"path":"src/intelligence/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/intelligence/repository-index.ts","kind":"import-statement","original":"./repository-index.js"},{"path":"src/intelligence/file-store.ts","kind":"import-statement","original":"./file-store.js"}],"format":"esm"}},"outputs":{"dist/intelligence/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}],"exports":[],"entryPoint":"src/intelligence/index.ts","inputs":{"src/intelligence/index.ts":{"bytesInOutput":402},"src/intelligence/types.ts":{"bytesInOutput":33},"src/intelligence/repository-index.ts":{"bytesInOutput":16437},"src/intelligence/file-store.ts":{"bytesInOutput":960},"src/utils/fs.ts":{"bytesInOutput":319}},"bytes":19054}}}
1
+ {"inputs":{"src/intelligence/types.ts":{"bytes":5352,"imports":[],"format":"esm"},"src/intelligence/repository-index.ts":{"bytes":33925,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/intelligence/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/utils/file-cache.ts":{"bytes":6195,"imports":[{"path":"node:fs","kind":"import-statement","external":true}],"format":"esm"},"src/utils/fs.ts":{"bytes":13885,"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},{"path":"src/utils/file-cache.ts","kind":"import-statement","original":"./file-cache.js"}],"format":"esm"},"src/intelligence/file-store.ts":{"bytes":1879,"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/intelligence/repository-index.ts","kind":"import-statement","original":"./repository-index.js"}],"format":"esm"},"src/intelligence/index.ts":{"bytes":100,"imports":[{"path":"src/intelligence/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/intelligence/repository-index.ts","kind":"import-statement","original":"./repository-index.js"},{"path":"src/intelligence/file-store.ts","kind":"import-statement","original":"./file-store.js"}],"format":"esm"}},"outputs":{"dist/intelligence/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}],"exports":[],"entryPoint":"src/intelligence/index.ts","inputs":{"src/intelligence/index.ts":{"bytesInOutput":402},"src/intelligence/types.ts":{"bytesInOutput":33},"src/intelligence/repository-index.ts":{"bytesInOutput":16440},"src/intelligence/file-store.ts":{"bytesInOutput":960},"src/utils/fs.ts":{"bytesInOutput":319},"src/utils/file-cache.ts":{"bytesInOutput":162}},"bytes":19219}}}
@@ -1 +1 @@
1
- {"inputs":{"src/intelligence/types.ts":{"bytes":5352,"imports":[],"format":"esm"},"src/intelligence/repository-index.ts":{"bytes":33925,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/intelligence/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/utils/fs.ts":{"bytes":13746,"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/intelligence/file-store.ts":{"bytes":1879,"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/intelligence/repository-index.ts","kind":"import-statement","original":"./repository-index.js"}],"format":"esm"},"src/intelligence/index.ts":{"bytes":100,"imports":[{"path":"src/intelligence/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/intelligence/repository-index.ts","kind":"import-statement","original":"./repository-index.js"},{"path":"src/intelligence/file-store.ts","kind":"import-statement","original":"./file-store.js"}],"format":"esm"}},"outputs":{"dist/intelligence/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}],"exports":["XENO_REPOSITORY_INDEX_SCHEMA_VERSION","XenoRepositoryIndexFileStore","buildXenoRepositoryIndex","buildXenoRepositoryIndexWithEmbeddings","detectRepositoryDocumentKind","detectRepositoryLanguage","inspectXenoRepositoryFreshness","inspectXenoRepositorySymbol","searchXenoRepositoryIndex","validateXenoRepositoryIndex"],"entryPoint":"src/intelligence/index.ts","inputs":{"src/intelligence/types.ts":{"bytesInOutput":33},"src/intelligence/index.ts":{"bytesInOutput":0},"src/intelligence/repository-index.ts":{"bytesInOutput":16433},"src/intelligence/file-store.ts":{"bytesInOutput":968},"src/utils/fs.ts":{"bytesInOutput":313}},"bytes":18109}}}
1
+ {"inputs":{"src/intelligence/types.ts":{"bytes":5352,"imports":[],"format":"esm"},"src/intelligence/repository-index.ts":{"bytes":33925,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"src/intelligence/types.ts","kind":"import-statement","original":"./types.js"}],"format":"esm"},"src/utils/file-cache.ts":{"bytes":6195,"imports":[{"path":"node:fs","kind":"import-statement","external":true}],"format":"esm"},"src/utils/fs.ts":{"bytes":13885,"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},{"path":"src/utils/file-cache.ts","kind":"import-statement","original":"./file-cache.js"}],"format":"esm"},"src/intelligence/file-store.ts":{"bytes":1879,"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/intelligence/repository-index.ts","kind":"import-statement","original":"./repository-index.js"}],"format":"esm"},"src/intelligence/index.ts":{"bytes":100,"imports":[{"path":"src/intelligence/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/intelligence/repository-index.ts","kind":"import-statement","original":"./repository-index.js"},{"path":"src/intelligence/file-store.ts","kind":"import-statement","original":"./file-store.js"}],"format":"esm"}},"outputs":{"dist/intelligence/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}],"exports":["XENO_REPOSITORY_INDEX_SCHEMA_VERSION","XenoRepositoryIndexFileStore","buildXenoRepositoryIndex","buildXenoRepositoryIndexWithEmbeddings","detectRepositoryDocumentKind","detectRepositoryLanguage","inspectXenoRepositoryFreshness","inspectXenoRepositorySymbol","searchXenoRepositoryIndex","validateXenoRepositoryIndex"],"entryPoint":"src/intelligence/index.ts","inputs":{"src/intelligence/types.ts":{"bytesInOutput":33},"src/intelligence/index.ts":{"bytesInOutput":0},"src/intelligence/repository-index.ts":{"bytesInOutput":16439},"src/intelligence/file-store.ts":{"bytesInOutput":968},"src/utils/fs.ts":{"bytesInOutput":313},"src/utils/file-cache.ts":{"bytesInOutput":156}},"bytes":18271}}}
@@ -750,6 +750,11 @@ interface MemoryManagerOptions {
750
750
  maxCharsPerSession?: number;
751
751
  };
752
752
  }
753
+ interface PromptMemoryBundle {
754
+ resolved: ResolvedMemory;
755
+ projectSessionContext?: ProjectSessionContext;
756
+ prompt: string;
757
+ }
753
758
  type MemoryAccessScope = "none" | "session" | "project" | "user";
754
759
  declare class MemoryManager {
755
760
  private cwd;
@@ -776,6 +781,11 @@ declare class MemoryManager {
776
781
  maxTokens?: number;
777
782
  maxCharsPerSession?: number;
778
783
  }): Promise<ProjectSessionContext>;
784
+ private readRecentTranscriptExcerpt;
785
+ loadPromptBundle(options?: {
786
+ excludeSessionId?: string;
787
+ includeProjectSessionContext?: boolean;
788
+ }): Promise<PromptMemoryBundle>;
779
789
  private filterProjectSessions;
780
790
  private normalizePath;
781
791
  private extractRecentTranscriptExcerpt;
@@ -750,6 +750,11 @@ interface MemoryManagerOptions {
750
750
  maxCharsPerSession?: number;
751
751
  };
752
752
  }
753
+ interface PromptMemoryBundle {
754
+ resolved: ResolvedMemory;
755
+ projectSessionContext?: ProjectSessionContext;
756
+ prompt: string;
757
+ }
753
758
  type MemoryAccessScope = "none" | "session" | "project" | "user";
754
759
  declare class MemoryManager {
755
760
  private cwd;
@@ -776,6 +781,11 @@ declare class MemoryManager {
776
781
  maxTokens?: number;
777
782
  maxCharsPerSession?: number;
778
783
  }): Promise<ProjectSessionContext>;
784
+ private readRecentTranscriptExcerpt;
785
+ loadPromptBundle(options?: {
786
+ excludeSessionId?: string;
787
+ includeProjectSessionContext?: boolean;
788
+ }): Promise<PromptMemoryBundle>;
779
789
  private filterProjectSessions;
780
790
  private normalizePath;
781
791
  private extractRecentTranscriptExcerpt;