@inkeep/open-knowledge 0.63.0-beta.5 → 0.63.0-beta.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{acp-harness-probe-BhZDhCHH.mjs → acp-harness-probe-Badoo7pE.mjs} +2 -2
- package/dist/cli.mjs +6 -6
- package/dist/constants-CBe8qEst.mjs +2 -0
- package/dist/index.mjs +1 -1
- package/dist/{init-BJiAEJRN.mjs → init-CVh8966W.mjs} +3 -3
- package/dist/init-LgiNF3UM.mjs +1 -0
- package/dist/{launch-json-removal-BTACDKjC.mjs → launch-json-removal-D2OCVDzO.mjs} +2 -2
- package/dist/{loader-Byhpqy4O.mjs → loader-Bgd6mf5X.mjs} +2 -2
- package/dist/loader-CDcY-koS.mjs +1 -0
- package/dist/{open-browser-DSPmPYwI.mjs → open-browser-C8W8YLUr.mjs} +2 -2
- package/dist/preview-75utYQXd.mjs +1 -0
- package/dist/{preview-cgs8Mb4Y.mjs → preview-Cay-WE12.mjs} +2 -2
- package/dist/{repair-launch-json-DjL36K1Z.mjs → repair-launch-json-DMyIlqMg.mjs} +2 -2
- package/dist/{repair-mcp-configs-CjJ9wB0O.mjs → repair-mcp-configs-B7MZNI74.mjs} +2 -2
- package/dist/{repair-skills-D0WZx9LS.mjs → repair-skills-B7T9ybuC.mjs} +2 -2
- package/dist/repair-skills-D33RJQek.mjs +1 -0
- package/dist/{resolve-project-root-BwOq-T0U.mjs → resolve-project-root-BF1NyEri.mjs} +2 -2
- package/dist/{skill-teardown-DCN9mAh5.mjs → skill-teardown-B9-HO2ID.mjs} +2 -2
- package/dist/src-BzQcss02.mjs +1 -0
- package/dist/{src-BdjcQmsp.mjs → src-DQyTLMJF.mjs} +1 -1
- package/dist/{src-BsPYQ6MF.mjs → src-DqL4vQY1.mjs} +2 -2
- package/dist/{src-DZjt7Q8p.mjs → src-bhsVUHJJ.mjs} +2 -2
- package/dist/{start-D7t4syji.mjs → start-9nGFXqc5.mjs} +3 -3
- package/dist/start-cKjeIduD.mjs +1 -0
- package/package.json +5 -5
- package/dist/constants-DS_H70B6.mjs +0 -2
- package/dist/init-BbrBJj79.mjs +0 -1
- package/dist/loader-yCnnFf8w.mjs +0 -1
- package/dist/preview-BYNKv8Tc.mjs +0 -1
- package/dist/repair-skills-CdxyA-m-.mjs +0 -1
- package/dist/src-D6iCRSgq.mjs +0 -1
- package/dist/start-Bw1YV6bY.mjs +0 -1
|
@@ -98,7 +98,7 @@ import{i as e,o as t,t as n}from"./chunk-DTipWd-i.mjs";import{$t as r,A as i,At
|
|
|
98
98
|
`,`
|
|
99
99
|
`).replaceAll(`\r`,`
|
|
100
100
|
`).split(`
|
|
101
|
-
`),c=[],l=new Set,u=null,d=(e,t,n)=>{l.has(e)||(l.add(e),c.push({href:e,resolvedTo:t,reason:n}))},f=e=>{let n=e.trim();if(n.startsWith(`#`))return;let o=Sa(n,t);if(!o){d(n,null,`unresolvable`);return}if(o.kind===`doc`){!a.has(o.docName)&&i?.(o.docName)!==!0&&d(n,o.docName,`no-such-doc`);return}if(o.kind===`asset`){if(!r)return;let e=Ni(o.url,t,{literal:o.literal});if(e===null){d(n,null,`unresolvable`);return}r(e)||d(n,e,`no-such-file`);return}},p,m,h={pages:a,get pagesBySlug(){return p??=Fa(a,Pi),p},get pagesByBasename(){return m??=Eo(a,Pi),m}},g=(e,t)=>{let n=lo(e,t,h);!n||n.kind!==`doc`||ra(n.docName,h)===void 0&&i?.(n.docName)!==!0&&d(`[[${e}${t?`#${t}`:``}]]`,n.docName,`no-such-doc`)};for(let e of s){if(u){SR(e,u)&&(u=null);continue}let t=xR(e);if(t){u=t;continue}let n=CR(e);for(;n<e.length;){if(e[n]===`\\`&&n+1<e.length){n+=2;continue}if(e[n]==="`"){let t=wR(e,n);if(t){n=t.nextIndex;continue}}if(e[n]===`[`&&e[n+1]===`[`){let t=TR(e,n);if(t){g(t.target,t.anchor),n=t.nextIndex;continue}}if(e[n]===`[`&&e[n-1]!==`!`){let t=OR(e,n);if(t){f(t.href),n=t.nextIndex;continue}}n++}}return c}function zR(e){return{backward:Object.fromEntries([...e.backward.entries()].map(([e,t])=>[e,[...t.entries()].map(([e,t])=>({source:e,anchor:t.anchor,snippet:t.snippet,sourceForm:t.sourceForm,line:t.line,column:t.column,...t.rawWikiTarget===!0?{rawWikiTarget:!0}:{}}))])),forward:Object.fromEntries([...e.forward.entries()].map(([e,t])=>[e,[...t].sort()])),externalForward:Object.fromEntries([...e.externalForward.entries()].map(([e,t])=>[e,[...t.entries()].map(([e,t])=>({url:e,label:t.label,snippet:t.snippet})).sort((e,t)=>e.url.localeCompare(t.url))])),skillRefs:Object.fromEntries([...e.skillRefs.entries()].map(([e,t])=>[e,[...t].sort()]))}}function BR(e){let t=new Map;for(let[n,r]of e)for(let[e,i]of r){let r=t.get(e);r||(r=new Map,t.set(e,r)),r.set(n,i)}return t}function VR(e){return typeof e==`number`&&Number.isInteger(e)&&e>=0?e:void 0}function HR(e){let t=new Map(Object.entries(e.externalForward??{}).map(([e,t])=>[e,new Map(t.map(e=>[e.url,{label:e.label??null,snippet:e.snippet??null}]))]));return{backward:new Map(Object.entries(e.backward??{}).map(([e,t])=>[e,new Map(t.map(e=>[e.source,{anchor:e.anchor??null,snippet:e.snippet??null,sourceForm:e.sourceForm===`wiki`||e.sourceForm===`markdown`?e.sourceForm:void 0,line:VR(e.line),column:VR(e.column),rawWikiTarget:e.rawWikiTarget===!0}]))])),forward:new Map(Object.entries(e.forward??{}).map(([e,t])=>[e,new Set(t)])),externalForward:t,externalBackward:BR(t),skillRefs:new Map(Object.entries(e.skillRefs??{}).map(([e,t])=>[e,new Set(t)])),epoch:0}}function UR(e){let t=new Set;for(let n of e){let e=n.indexOf(`/`);for(;e!==-1;)t.add(n.slice(0,e)),e=n.indexOf(`/`,e+1)}return t}var WR=class{projectDir;contentDir;contentFilter;getFileOracle;states=new Map;mtimesByBranch=new Map;documentLookups=new WeakMap;activeBranch=`main`;constructor(e){this.projectDir=e.projectDir,this.contentDir=e.contentDir,this.contentFilter=e.contentFilter,this.getFileOracle=e.getFileOracle??(()=>void 0),this.states.set(this.activeBranch,fR())}getState(e=this.activeBranch){let t=this.states.get(e);return t||(t=fR(),this.states.set(e,t)),t}structuralBundleNeighbors(e,t=this.activeBranch){let n=mR(e),r=new Set;if(!n)return r;let i=this.getState(t);if(!i.forward.has(e))return r;if(n.kind===`skill`)for(let t of i.forward.keys()){let n=mR(t);n?.kind===`reference`&&n.skillDocName===e&&r.add(t)}else i.forward.has(n.skillDocName)&&r.add(n.skillDocName);return r}skillRefNeighbors(e,t=this.activeBranch){let n=new Set,r=this.getState(t);if(!r.forward.has(e))return n;let i=mR(e);if(!i)return n;let a=e.startsWith(Oo),o=r.skillRefs.get(e);if(o){for(let e of o)if(e!==i.name)if(a){let t=Za(`global`,e);r.forward.has(t)&&n.add(t)}else for(let t of r.forward.keys()){let r=mR(t);r?.kind===`skill`&&r.name===e&&!t.startsWith(`__skill__/`)&&n.add(t)}}if(i.kind===`skill`)for(let[t,o]of r.skillRefs)t===e||!o.has(i.name)||t.startsWith(`__skill__/`)===a&&r.forward.has(t)&&n.add(t);return n}bundleNeighbors(e,t=this.activeBranch){let n=this.structuralBundleNeighbors(e,t);for(let r of this.skillRefNeighbors(e,t))n.add(r);return n}recordSkillRefs(e,t,n=this.activeBranch){this.recordSkillRefsInto(this.getState(n),e,t)}recordSkillRefsInto(e,t,n){if(!mR(t))return;let r=ta(n);r.length===0?e.skillRefs.delete(t):e.skillRefs.set(t,new Set(r))}getActiveBranch(){return this.activeBranch}switchBranch(e){this.activeBranch=e,this.getState(e)}cachePath(e=this.activeBranch){return R(cA(this.projectDir),`cache`,e,`backlinks.json`)}registerNodeOnly(e,t=this.activeBranch){let n=this.getState(t),r=n.forward.get(e)??new Set,i=n.externalForward.get(e)??new Map;for(let t of r){let r=n.backward.get(t);r&&(r.delete(e),r.size===0&&n.backward.delete(t))}for(let t of i.keys()){let r=n.externalBackward.get(t);r&&(r.delete(e),r.size===0&&n.externalBackward.delete(t))}n.forward.set(e,new Set),n.epoch++,n.externalForward.set(e,new Map)}registerGlobalSkillBundleNode(e,t=this.activeBranch){fi(e)&&this.registerNodeOnly(e,t)}updateDocument(e,t,n=[],r=this.activeBranch){if(lS(e))return;if(fi(e)){this.registerNodeOnly(e,r);return}let i=this.getState(r),a=i.forward.get(e)??new Set,o=i.externalForward.get(e)??new Map;for(let t of a){let n=i.backward.get(t);n&&(n.delete(e),n.size===0&&i.backward.delete(t))}for(let t of o.keys()){let n=i.externalBackward.get(t);n&&(n.delete(e),n.size===0&&i.externalBackward.delete(t))}let s=new Set,c=new Map;i.forward.set(e,s),i.epoch++,i.externalForward.set(e,c);for(let n of t){if(!n.target)continue;s.add(n.target);let t=i.backward.get(n.target);t||(t=new Map,i.backward.set(n.target,t)),t.set(e,hR(t.get(e),{anchor:n.anchor,snippet:n.snippet,sourceForm:n.sourceForm,line:n.line,column:n.column,rawWikiTarget:n.rawWikiTarget===!0}))}for(let t of n){if(!t.url)continue;c.set(t.url,{label:t.label,snippet:t.snippet});let n=i.externalBackward.get(t.url);n||(n=new Map,i.externalBackward.set(t.url,n)),(!n.has(e)||!n.get(e)?.snippet&&t.snippet)&&n.set(e,{label:t.label,snippet:t.snippet})}}updateDocumentFromMarkdown(e,t,n=this.activeBranch){try{let{frontmatter:r,body:i}=ri(t),a=jR(r),o=FR(i,e,a).map(e=>({...e,sourceForm:`wiki`})),s=MR(i,e,a,this.getFileOracle()).map(e=>({...e,sourceForm:`markdown`})),c=IR(i),l=LR(i,e),u=new Set(o.map(e=>e.target)),d=[...o,...s.filter(e=>!u.has(e.target))],f=new Set(c.map(e=>e.url)),p=[...c,...l.filter(e=>!f.has(e.url))];this.recordSkillRefs(e,i,n),this.updateDocument(e,d,p,n)}catch(t){uR.warn({docName:e,err:t},`Failed to scan ${e} for link extraction`),this.deleteDocument(e,n)}}deleteDocument(e,t=this.activeBranch){if(lS(e))return;let n=this.getState(t),r=n.forward.get(e)??new Set,i=n.externalForward.get(e)??new Map;for(let t of r){let r=n.backward.get(t);r&&(r.delete(e),r.size===0&&n.backward.delete(t))}for(let t of i.keys()){let r=n.externalBackward.get(t);r&&(r.delete(e),r.size===0&&n.externalBackward.delete(t))}n.forward.delete(e),n.epoch++,n.externalForward.delete(e),n.skillRefs.delete(e)}renameDocument(e,t,n,r=this.activeBranch){this.deleteDocument(e,r),this.updateDocumentFromMarkdown(t,n,r)}getBacklinks(e,t=this.activeBranch){let n=this.getState(t).backward.get(e),r=new Map;if(n)for(let[e,t]of n)r.set(e,{source:e,anchor:t.anchor,snippet:t.snippet});for(let n of this.bundleNeighbors(e,t))r.has(n)||r.set(n,{source:n,anchor:null,snippet:null});return[...r.values()].sort((e,t)=>e.source.localeCompare(t.source))}getBacklinkCount(e,t=this.activeBranch){let n=this.getState(t).backward.get(e),r=this.bundleNeighbors(e,t);if(r.size===0)return n?.size??0;let i=new Set(n?.keys()??[]);for(let e of r)i.add(e);return i.size}getForwardLinks(e,t=this.activeBranch){let n=this.getState(t),r=new Set(n.forward.get(e)??new Set);for(let n of this.bundleNeighbors(e,t))r.add(n);return[...r].sort((e,t)=>e.localeCompare(t))}getForwardLinkEntries(e,t=this.activeBranch){let n=this.getState(t),r=this.getForwardLinks(e,t).map(t=>({kind:`doc`,target:t,anchor:n.backward.get(t)?.get(e)?.anchor??null,snippet:n.backward.get(t)?.get(e)?.snippet??null})),i=[...(n.externalForward.get(e)??new Map).entries()].map(([e,t])=>({kind:`external`,url:e,label:t.label,snippet:t.snippet})).sort((e,t)=>e.url.localeCompare(t.url));return[...r,...i]}getOrphans(e,t=`both`,n=this.activeBranch){let r=this.getState(n),i=new Set;for(let e of r.forward.keys()){let t=mR(e);t?.kind===`reference`&&i.add(t.skillDocName)}let a=e=>{let t=mR(e);return!t||!r.forward.has(e)?!1:t.kind===`skill`?i.has(e):r.forward.has(t.skillDocName)};return[...e].filter(e=>{let n=a(e),i=n||(r.backward.get(e)?.size??0)>0,o=n||(r.forward.get(e)?.size??0)>0;return t===`incoming`?!i:(t===`outgoing`||!i)&&!o}).sort((e,t)=>e.localeCompare(t))}getHubs(e=20,t=this.activeBranch){return[...this.getState(t).backward.entries()].map(([e,t])=>({docName:e,count:t.size})).sort((e,t)=>t.count===e.count?e.docName.localeCompare(t.docName):t.count-e.count).slice(0,e)}getIndexedDocNames(e=this.activeBranch){return[...this.getState(e).forward.keys()]}getDeadLinks(e,t,n=this.activeBranch,r){let i=this.getState(n),a=new Set(e),o=t?.length?new Set(t):null,s=UR([...a,...i.forward.keys()]);for(let e of r??[])s.add(e);return[...i.backward.entries()].filter(([e,t])=>{if(a.has(e)||i.forward.has(e)||s.has(e.replace(/\/+$/,``)))return!1;if(!o)return t.size>0;for(let e of t.keys())if(o.has(e))return!0;return!1}).map(([e,t])=>({target:e,sources:[...t.entries()].filter(([,e])=>e.rawWikiTarget!==!0).filter(([,t])=>t.sourceForm!==`wiki`||ra(e,this.documentLookup(n))===void 0).filter(([e])=>!o||o.has(e)).map(([e,t])=>({source:e,anchor:t.anchor,snippet:t.snippet,sourceForm:t.sourceForm,line:t.line,column:t.column})).sort((e,t)=>e.source.localeCompare(t.source))})).filter(e=>e.sources.length>0).sort((e,t)=>t.sources.length===e.sources.length?e.target.localeCompare(t.target):t.sources.length-e.sources.length)}documentLookup(e=this.activeBranch){let t=this.getState(e),n=this.documentLookups.get(t);if(n?.epoch===t.epoch)return n.lookup;let r=new Set(t.forward.keys()),i={pages:r,pagesBySlug:Fa(r,Pi),pagesByBasename:Eo(r,Pi)};return this.documentLookups.set(t,{epoch:t.epoch,lookup:i}),i}undecidedTargetResolves(e,t=this.activeBranch){return lo(e,null,this.documentLookup(t))?.kind===`doc`}getLinkGraph(e=this.activeBranch){let t=this.getState(e),n=new Map,r=[];for(let[i,a]of t.forward){n.set(i,{kind:`doc`,id:i,docName:i,anchor:gR(t.backward.get(i))});for(let o of a)pR(t,o)&&!this.undecidedTargetResolves(o,e)||(n.set(o,{kind:`doc`,id:o,docName:o,anchor:gR(t.backward.get(o))}),r.push({source:i,target:o}))}for(let[e,i]of t.externalForward){n.set(e,{kind:`doc`,id:e,docName:e,anchor:gR(t.backward.get(e))});for(let[t,a]of i){let i=_R(t);n.set(i,{kind:`external`,id:i,url:t,label:a.label}),r.push({source:e,target:i})}}for(let i of t.forward.keys())if(mR(i)?.kind===`skill`)for(let a of this.bundleNeighbors(i,e))t.forward.get(i)?.has(a)||t.forward.get(a)?.has(i)||(n.set(i,{kind:`doc`,id:i,docName:i,anchor:gR(t.backward.get(i))}),n.set(a,{kind:`doc`,id:a,docName:a,anchor:gR(t.backward.get(a))}),r.push({source:i,target:a}));return{nodes:[...n.values()].sort((e,t)=>e.id.localeCompare(t.id)),links:r}}getLinkGraphNeighborhood(e,t,n=this.activeBranch){let r=this.getState(n),i=new Map;for(let e of r.externalForward.values())for(let[t,n]of e)i.has(t)||i.set(t,n.label);let a=new Set([e]),o=[{nodeId:e,degree:0}],s=0;for(;s<o.length;){let e=o[s++];if(e.degree>=t)continue;let i=vR(e.nodeId),c=new Set;if(i)for(let e of r.externalBackward.get(i)?.keys()??[])c.add(e);else{for(let t of r.forward.get(e.nodeId)??new Set)pR(r,t)&&!this.undecidedTargetResolves(t,n)||c.add(t);for(let t of r.externalForward.get(e.nodeId)?.keys()??[])c.add(_R(t));for(let t of r.backward.get(e.nodeId)?.keys()??[])c.add(t);for(let t of this.bundleNeighbors(e.nodeId,n))c.add(t)}for(let t of c)a.has(t)||(a.add(t),o.push({nodeId:t,degree:e.degree+1}))}let c=[];for(let[e,t]of r.forward)if(a.has(e))for(let n of t)a.has(n)&&c.push({source:e,target:n});for(let[e,t]of r.externalForward)if(a.has(e))for(let n of t.keys()){let t=_R(n);a.has(t)&&c.push({source:e,target:t})}for(let e of a)if(mR(e)?.kind===`skill`)for(let t of this.bundleNeighbors(e,n))a.has(t)&&(r.forward.get(e)?.has(t)||r.forward.get(t)?.has(e)||c.push({source:e,target:t}));return{nodes:[...a].sort().map(e=>{let t=vR(e);return t?{kind:`external`,id:e,url:t,label:i.get(t)??null}:{kind:`doc`,id:e,docName:e,anchor:gR(r.backward.get(e))}}),links:c}}async saveToDisk(e=this.activeBranch){let t=this.cachePath(e);ku(F(t),{recursive:!0});let n=this.getState(e),r=this.mtimesByBranch.get(e),i={version:2,...zR(n),...r?{mtimes:Object.fromEntries(r)}:{}};await id(t,JSON.stringify(i,null,2),`utf-8`)}async loadFromDisk(e=this.activeBranch){let t=this.cachePath(e);if(!B(t))return!1;try{let n=await ed(t,`utf-8`),r=JSON.parse(n);return r.version===2?(this.states.set(e,HR(r)),r.mtimes?this.mtimesByBranch.set(e,new Map(Object.entries(r.mtimes))):this.mtimesByBranch.delete(e),!0):!1}catch(t){return uR.warn({branch:e,err:t},`Failed to load cache for ${e}`),!1}}clear(e=this.activeBranch){this.states.set(e,fR()),this.mtimesByBranch.delete(e)}async rebuildFromDisk(e=this.activeBranch){return cR(`backlink`,`full`,()=>this.rebuildFromDiskUnspanned(e))}async rebuildFromDiskUnspanned(e){let t=fR(),n=new Map,r=[];await this.walkForPaths(this.contentDir,r);let i=new Set,a=r.filter(({docName:e})=>i.has(e)?!1:(i.add(e),!0));for(let e=0;e<a.length;e+=50){let r=a.slice(e,e+50),i=await Promise.allSettled(r.map(async({docName:e,filePath:t})=>{let[n,r]=await Promise.all([rd(t),ed(t,`utf-8`)]);return{docName:e,mtimeMs:n.mtimeMs,markdown:r}}));for(let e of i){if(e.status===`rejected`){uR.warn({err:e.reason},`Failed to rebuild entry`);continue}let{docName:r,mtimeMs:i,markdown:a}=e.value;n.set(r,i);let{frontmatter:o,body:s}=ri(a),c=jR(o),l=FR(s,r,c).map(e=>({...e,sourceForm:`wiki`})),u=MR(s,r,c,this.getFileOracle()).map(e=>({...e,sourceForm:`markdown`})),d=IR(s),f=LR(s,r),p=new Set(l.map(e=>e.target)),m=[...l,...u.filter(e=>!p.has(e.target))],h=new Set(d.map(e=>e.url)),g=[...d,...f.filter(e=>!h.has(e.url))],_=new Set,v=new Map;this.recordSkillRefsInto(t,r,s),t.forward.set(r,_),t.epoch++,t.externalForward.set(r,v);for(let e of m){if(!e.target)continue;_.add(e.target);let n=t.backward.get(e.target);n||(n=new Map,t.backward.set(e.target,n)),n.set(r,hR(n.get(r),{anchor:e.anchor,snippet:e.snippet,sourceForm:e.sourceForm,line:e.line,column:e.column,rawWikiTarget:e.rawWikiTarget===!0}))}for(let e of g){if(!e.url)continue;v.set(e.url,{label:e.label,snippet:e.snippet});let n=t.externalBackward.get(e.url);n||(n=new Map,t.externalBackward.set(e.url,n)),n.set(r,{label:e.label,snippet:e.snippet})}}}this.states.set(e,t),this.mtimesByBranch.set(e,n)}async walkForPaths(e,t){let n;try{n=await td(e,{withFileTypes:!0})}catch(t){uR.warn({dir:e,err:t},`Failed to read directory ${e}`);return}for(let r of n){let n=I(e,r.name);if(r.isDirectory()){let e=uN(L(this.contentDir,n));if(this.contentFilter&&e&&this.contentFilter.isDirExcluded(e))continue;await this.walkForPaths(n,t)}else if(r.isFile()&&Wx(r.name)){let e=uN(L(this.contentDir,n));if(this.contentFilter?.isExcluded(e))continue;t.push({docName:Kx(e),filePath:n})}}}async reconcileWithDisk(e=this.activeBranch){return cR(`backlink`,`reconcile`,()=>this.reconcileWithDiskUnspanned(e),e=>({"index.added":e.added,"index.updated":e.updated,"index.deleted":e.deleted}))}async reconcileWithDiskUnspanned(e){if(!B(this.contentDir))return{added:0,updated:0,deleted:0,deletedDocNames:[],changedDocs:[]};let t=this.mtimesByBranch.get(e)??new Map,n=[];await this.walkForPaths(this.contentDir,n);let r=new Set,i=n.filter(({docName:e})=>r.has(e)?!1:(r.add(e),!0)),a=new Set(i.map(e=>e.docName)),o=new Map,s=0,c=0,l=[],u=await Promise.allSettled(i.map(async({docName:e,filePath:t})=>({docName:e,filePath:t,mtimeMs:(await rd(t)).mtimeMs})));for(let e of u){if(e.status===`rejected`)continue;let{docName:n,filePath:r,mtimeMs:i}=e.value,a=t.get(n);if(a!==void 0&&a===i){o.set(n,i);continue}l.push({docName:n,filePath:r,mtimeMs:i,isNew:a===void 0})}for(let t=0;t<l.length;t+=50){let n=l.slice(t,t+50),r=await Promise.allSettled(n.map(async({docName:e,filePath:t,mtimeMs:n,isNew:r})=>({docName:e,mtimeMs:n,isNew:r,markdown:await ed(t,`utf-8`)})));for(let t of r){if(t.status===`rejected`){uR.warn({err:t.reason},`Failed to reconcile file`);continue}let{docName:n,mtimeMs:r,isNew:i,markdown:a}=t.value;this.updateDocumentFromMarkdown(n,a,e),o.set(n,r),i?s++:c++}}let d=0,f=[],p=new Set([...t.keys(),...this.getState(e).forward.keys()]);for(let t of p)fi(t)||a.has(t)||(this.deleteDocument(t,e),d++,f.push(t));return this.mtimesByBranch.set(e,o),{added:s,updated:c,deleted:d,deletedDocNames:f,changedDocs:l.map(({docName:e,filePath:t})=>({docName:e,filePath:t}))}}async ingestGlobalSkillBundles(e,t=this.activeBranch){let n=new Set;for(let r of e){if(!B(r))continue;let e;try{e=await td(r,{withFileTypes:!0})}catch(e){uR.warn({root:r,err:e},`Failed to read global skills root ${r}`);continue}for(let i of e){if(!i.isDirectory())continue;let e=i.name,a=I(r,e),o=Za(`global`,e);if(B(I(a,`SKILL.md`))&&fi(o)){this.registerNodeOnly(o,t),n.add(o);try{let e=await ed(I(a,`SKILL.md`),`utf-8`);this.recordSkillRefs(o,ri(e).body,t)}catch(e){uR.warn({dir:a,err:e},`global skill ref-scan failed; edges skipped`)}}let s=[];await this.walkGlobalSkillReferences(I(a,`references`),e,``,s);for(let{docName:e}of s)this.registerNodeOnly(e,t),n.add(e)}}let r=[];for(let e of this.getState(t).forward.keys())fi(e)&&!n.has(e)&&r.push(e);for(let e of r)this.deleteDocument(e,t)}async walkGlobalSkillReferences(e,t,n,r){let i;try{i=await td(e,{withFileTypes:!0})}catch(t){t?.code!==`ENOENT`&&uR.warn({dir:e,err:t},`Failed to read skill references dir ${e}`);return}for(let a of i){let i=n?`${n}/${a.name}`:a.name;if(a.isDirectory())await this.walkGlobalSkillReferences(I(e,a.name),t,i,r);else if(a.isFile()&&Wx(a.name)){let e=Kx(i);r.push({docName:`${Oo}global/${t}/references/${e}`})}}}};function GR(e){return e.filter(e=>FF(e.occurrence))}function KR(e,t){let n=[],r=[];if(e.resolvedTarget!==null&&(e.targetKind===`document`?n.push(e.resolvedTarget):e.targetKind===`file`&&r.push(e.resolvedTarget)),e.occurrence.role===`link`){let i=Sa(e.occurrence.href,t);if(i?.kind===`doc`){n.push(i.docName);let a=Ni(e.occurrence.href,t,{literal:!1});a===i.docName&&r.push(a)}}return e.fallbackTarget!==null&&n.push(e.fallbackTarget),{docs:n,files:r}}function qR(e,t,n){let r=e.get(t);r||(r=new Set,e.set(t,r)),r.add(n)}function JR(e,t,n){let r=e.get(t);r&&(r.delete(n),r.size===0&&e.delete(t))}function YR(e){let t=[],n=Pi(e);return n&&t.push(`slug:${n}`),!e.includes(`/`)&&n&&t.push(`basename:${n}`),t.push(`folder:${e}`),t}function XR(e){let t=[],n=Pi(e);n&&t.push(`slug:${n}`);let r=Pi(e.slice(e.lastIndexOf(`/`)+1));r&&t.push(`basename:${r}`);let i=e.indexOf(`/`);for(;i!==-1;)t.push(`folder:${e.slice(0,i)}`),i=e.indexOf(`/`,i+1);return t}function ZR(e,t){return e.length===t.length?e.every((e,n)=>{let r=t[n];if(!r)return!1;let i=e.occurrence.reference,a=r.occurrence.reference;return e.targetKind===r.targetKind&&e.resolvedTarget===r.resolvedTarget&&e.status===r.status&&e.reason===r.reason&&e.resolutionMethod===r.resolutionMethod&&e.fallbackTarget===r.fallbackTarget&&e.occurrence.role===r.occurrence.role&&e.occurrence.sourceForm===r.occurrence.sourceForm&&e.occurrence.href===r.occurrence.href&&e.occurrence.range.start===r.occurrence.range.start&&e.occurrence.range.end===r.occurrence.range.end&&e.occurrence.line===r.occurrence.line&&e.occurrence.column===r.occurrence.column&&i?.label===a?.label&&i?.kind===a?.kind&&i?.definition.href===a?.definition.href&&i?.definition.repairRange.start===a?.definition.repairRange.start&&i?.definition.repairRange.end===a?.definition.repairRange.end}):!1}var QR=class e{contentDir;canonicalContentDir;contentFilter;readDocument;readDirectory;sourceAssessments=new Map;sourceDocDeps=new Map;sourceFileDeps=new Map;reverseByDoc=new Map;reverseByFile=new Map;reverseByTolerant=new Map;sourceTolerantDeps=new Map;documents=new Set;tolerantDocumentResolver=()=>null;files=new Set;generationValue=0;freshnessEpoch=0;readyValue=!1;closed=!1;folderPaths=new Set;injectedFolderPaths=new Set;inventory={hasDocument:e=>this.documents.has(e),hasFile:e=>this.files.has(e),resolveTolerantDocument:e=>this.tolerantDocumentResolver(e),hasFolder:e=>this.folderPaths.has(e)||this.injectedFolderPaths.has(e)};constructor(e){this.contentDir=e.contentDir;try{this.canonicalContentDir=H(e.contentDir)}catch{this.canonicalContentDir=e.contentDir}this.contentFilter=e.contentFilter,this.readDocument=e.readDocument??(e=>ed(e,`utf-8`)),this.readDirectory=e.readDirectory??(e=>td(e,{withFileTypes:!0}))}get generation(){return this.generationValue}isReady(){return this.readyValue}markUnavailable(){this.readyValue&&this.freshnessEpoch++,this.readyValue=!1}get freshnessToken(){return`${this.generationValue}:${this.freshnessEpoch}`}getAssessments(e){return this.sourceAssessments.get(e)??[]}getAssessmentsForSources(e){let t=e&&e.length>0?new Set(e):null,n=[];for(let[e,r]of this.sourceAssessments)t&&!t.has(e)||n.push({source:e,assessments:r});return n}getDocumentDependents(e){let t=new Set(this.reverseByDoc.get(e)??[]);for(let n of XR(e))for(let e of this.reverseByTolerant.get(n)??[])t.add(e);return[...t].sort((e,t)=>e.localeCompare(t))}getFileDependents(e){return[...this.reverseByFile.get(e)??[]].sort((e,t)=>e.localeCompare(t))}getStats(){let e=0;for(let t of this.sourceAssessments.values())e+=t.length;return{sources:this.sourceAssessments.size,occurrences:e,documentTargets:this.reverseByDoc.size,fileTargets:this.reverseByFile.size}}close(){this.closed=!0}setSource(e,t){return lS(e)?!1:lR(`local-target`,`source`,()=>{let n=this.sourceAssessments.get(e)??[],r=!this.documents.has(e);this.documents.add(e),r&&this.refreshTolerantDocumentIndexes();let i=GR(NF(DF(t),e,this.inventory)),a=!ZR(n,i);a&&this.applySourceAssessments(e,i);let o=r?this.reassessDocumentDependents(e):0,s=a||o>0;return s&&this.generationValue++,{changed:s,occurrences:i.length,affectedSources:o+ +!!a}},e=>({"index.occurrences":e.occurrences,"index.affected_sources":e.affectedSources})).changed}removeSource(e){return lS(e)?!1:lR(`local-target`,`document-target`,()=>{let t=this.sourceAssessments.get(e)?.length??0,n=t>0,r=this.documents.delete(e);r&&this.refreshTolerantDocumentIndexes(),this.applySourceAssessments(e,[]);let i=r?this.reassessDocumentDependents(e):0,a=n||i>0;return a&&this.generationValue++,{changed:a,occurrences:t,affectedSources:i+ +!!n}},e=>({"index.occurrences":e.occurrences,"index.affected_sources":e.affectedSources})).changed}renameSource(e,t,n){let r=this.removeSource(e),i=this.setSource(t,n);return r||i}setFileTarget(e,t){return lR(`local-target`,`file-target`,()=>{if(t===this.files.has(e))return{affected:0,occurrences:0};t?this.files.add(e):this.files.delete(e);let n=this.countFileOccurrences(e),r=this.reassessFileDependents(e);return r>0&&this.generationValue++,{affected:r,occurrences:n}},e=>({"index.occurrences":e.occurrences,"index.affected_sources":e.affected})).affected}reconcileDocumentTargets(e){let t=new Set(e),n=new Set;for(let e of this.documents)t.has(e)||n.add(e);for(let e of t)this.documents.has(e)||n.add(e);if(n.size===0)return 0;let r=new Set;for(let e of n){for(let t of this.reverseByDoc.get(e)??[])r.add(t);for(let t of XR(e))for(let e of this.reverseByTolerant.get(t)??[])r.add(e)}this.documents=t,this.refreshTolerantDocumentIndexes();let i=0;for(let e of r)this.reassessSource(e)&&i++;return i>0&&this.generationValue++,i}reconcileFolderTargets(e){let t=new Set(e),n=new Set;for(let e of this.injectedFolderPaths)t.has(e)||n.add(e);for(let e of t)this.injectedFolderPaths.has(e)||n.add(e);if(n.size===0)return 0;let r=new Set;for(let e of n)for(let t of this.reverseByTolerant.get(`folder:${e}`)??[])r.add(t);this.injectedFolderPaths=t;let i=0;for(let e of r)this.reassessSource(e)&&i++;return i>0&&this.generationValue++,i}reconcileFileTargets(e){return lR(`local-target`,`file-target`,()=>{let t=new Set(e),n=new Set;for(let e of this.files)t.has(e)||n.add(e);for(let e of t)this.files.has(e)||n.add(e);let r=new Set,i=0;for(let e of n){i+=this.countFileOccurrences(e);for(let t of this.reverseByFile.get(e)??[])r.add(t)}this.files=t;let a=0;for(let e of r)this.reassessSource(e)&&a++;return a>0&&this.generationValue++,{affected:a,occurrences:i}},e=>({"index.occurrences":e.occurrences,"index.affected_sources":e.affected})).affected}async reconcileDependentFileTargetsFromDisk(e){let t=[...this.reverseByFile.keys()],n=await Promise.all(t.map(e=>this.isAdmittedFileOnDisk(e))),r=0;for(let[i,a]of t.entries()){let t=n[i]??!1,o=this.setFileTarget(a,t);o>0&&e?.(a,t),r+=o}return r}async isAdmittedFileOnDisk(e){if(this.contentFilter?.isPathIgnored(e))return!1;try{let t=await nd(I(this.contentDir,e)),n=L(this.canonicalContentDir,t);return n===``||n===`..`||n.startsWith(`..${process.platform===`win32`?`\\`:`/`}`)||fu(n)?!1:(await rd(t)).isFile()}catch{return!1}}countFileOccurrences(e){let t=0;for(let n of this.reverseByFile.get(e)??[])for(let r of this.sourceAssessments.get(n)??[])KR(r,n).files.includes(e)&&t++;return t}rebuildFromDisk(e){return cR(`local-target`,`full`,()=>this.rebuildOnce(e),e=>({"index.sources":e.sources,"index.occurrences":e.occurrences,"index.affected_sources":e.sources}))}async rebuildOnce(t){let n=this.sourceAssessments.size>0;this.freshnessEpoch++,this.readyValue=!1;let r=new e({contentDir:this.contentDir,contentFilter:this.contentFilter,readDocument:this.readDocument,readDirectory:this.readDirectory}),i=await r.populateFromDisk(t);return this.sourceAssessments=r.sourceAssessments,this.sourceDocDeps=r.sourceDocDeps,this.sourceFileDeps=r.sourceFileDeps,this.reverseByDoc=r.reverseByDoc,this.reverseByFile=r.reverseByFile,this.reverseByTolerant=r.reverseByTolerant,this.sourceTolerantDeps=r.sourceTolerantDeps,this.documents=r.documents,this.tolerantDocumentResolver=r.tolerantDocumentResolver,this.folderPaths=r.folderPaths,this.injectedFolderPaths=r.injectedFolderPaths,this.files=r.files,this.readyValue=!0,(n||this.sourceAssessments.size>0)&&this.generationValue++,i}async populateFromDisk(e){for(let t of e.documentTargets)this.documents.add(t);for(let t of e.fileTargets)this.files.add(t);for(let t of e.folderTargets??[])this.injectedFolderPaths.add(t);if(this.refreshTolerantDocumentIndexes(),!B(this.contentDir))return this.readyValue=!0,{sources:0,occurrences:0};let t=await this.listDocsWithPaths();for(let{docName:e}of t)this.documents.add(e);this.refreshTolerantDocumentIndexes();let n=0;for(let e=0;e<t.length&&!this.closed;e+=50){let r=t.slice(e,e+50),i=await Promise.all(r.map(async({docName:e,filePath:t})=>({docName:e,markdown:await this.readDocument(t)})));for(let e of i){if(lS(e.docName))continue;let t=GR(NF(DF(e.markdown),e.docName,this.inventory));this.applySourceAssessments(e.docName,t),n+=t.length}}return this.readyValue=!0,{sources:this.sourceAssessments.size,occurrences:n}}applySourceAssessments(e,t){let n=new Set,r=new Set,i=new Set;for(let a of t){let{docs:t,files:o}=KR(a,e);for(let e of t)n.add(e);for(let e of o)r.add(e);if(a.targetKind===`document`&&a.resolvedTarget!==null&&(a.status!==`exact`||!this.documents.has(a.resolvedTarget)))for(let e of YR(a.resolvedTarget))i.add(e)}let a=this.sourceDocDeps.get(e);if(a)for(let t of a)n.has(t)||JR(this.reverseByDoc,t,e);for(let t of n)a?.has(t)||qR(this.reverseByDoc,t,e);let o=this.sourceFileDeps.get(e);if(o)for(let t of o)r.has(t)||JR(this.reverseByFile,t,e);for(let t of r)o?.has(t)||qR(this.reverseByFile,t,e);let s=this.sourceTolerantDeps.get(e);if(s)for(let t of s)i.has(t)||JR(this.reverseByTolerant,t,e);for(let t of i)s?.has(t)||qR(this.reverseByTolerant,t,e);if(t.length===0){this.sourceAssessments.delete(e),this.sourceDocDeps.delete(e),this.sourceFileDeps.delete(e),this.sourceTolerantDeps.delete(e);return}this.sourceAssessments.set(e,t),this.sourceDocDeps.set(e,n),this.sourceFileDeps.set(e,r),this.sourceTolerantDeps.set(e,i)}reassessSource(e){let t=this.sourceAssessments.get(e);if(!t)return!1;let n=NF(t.map(e=>e.occurrence),e,this.inventory);return ZR(t,n)?!1:(this.applySourceAssessments(e,n),!0)}reassessDocumentDependents(e){let t=new Set(this.reverseByDoc.get(e)??[]);for(let n of XR(e))for(let e of this.reverseByTolerant.get(n)??[])t.add(e);let n=0;for(let e of t)this.reassessSource(e)&&(n+=1);return n}reassessFileDependents(e){let t=[...this.reverseByFile.get(e)??[]],n=0;for(let e of t)this.reassessSource(e)&&(n+=1);return n}refreshTolerantDocumentIndexes(){this.tolerantDocumentResolver=OF(this.documents);let e=new Set;for(let t of this.documents){let n=t.indexOf(`/`);for(;n!==-1;)e.add(t.slice(0,n)),n=t.indexOf(`/`,n+1)}this.folderPaths=e}async listDocsWithPaths(){let e=[];await this.walkContentDir(this.contentDir,e),e.sort((e,t)=>e.docName===t.docName?t.filePath.localeCompare(e.filePath):e.docName.localeCompare(t.docName));let t=new Set;return e.filter(({docName:e})=>t.has(e)?!1:(t.add(e),!0))}async walkContentDir(e,t){let n=await this.readDirectory(e);for(let r of n){let n=I(e,r.name);if(r.isDirectory()){let e=uN(L(this.contentDir,n));if(this.contentFilter&&e&&this.contentFilter.isDirExcluded(e))continue;await this.walkContentDir(n,t);continue}if(!r.isFile()||!Wx(r.name))continue;let i=uN(L(this.contentDir,n));this.contentFilter?.isExcluded(i)||t.push({docName:Kx(i),filePath:n})}}};const $R=P(`tag-index`),ez=os();function tz(e){if(typeof e!=`object`||!e)return!1;let t=e;if(t.version!==1)return!1;let{docs:n,files:r}=t;if(typeof n!=`object`||!n||Array.isArray(n)||typeof r!=`object`||!r||Array.isArray(r))return!1;for(let e of Object.values(n))if(!Array.isArray(e)||!e.every(e=>typeof e==`string`&&e.length>0))return!1;for(let e of Object.values(r)){if(typeof e!=`object`||!e)return!1;let{mtimeMs:t,size:n}=e;if(typeof t!=`number`||typeof n!=`number`)return!1}return!0}function nz(){return{byTag:new Map,byDoc:new Map,byDocLiteral:new Map}}function rz(e){return e.replace(/`[^`]*`/g,``)}function iz(e){let t=e.replaceAll(`\r
|
|
101
|
+
`),c=[],l=new Set,u=null,d=(e,t,n)=>{l.has(e)||(l.add(e),c.push({href:e,resolvedTo:t,reason:n}))},f=e=>{let n=e.trim();if(n.startsWith(`#`))return;let o=Sa(n,t);if(!o){d(n,null,`unresolvable`);return}if(o.kind===`doc`){!a.has(o.docName)&&i?.(o.docName)!==!0&&d(n,o.docName,`no-such-doc`);return}if(o.kind===`asset`){if(!r)return;let e=Ni(o.url,t,{literal:o.literal});if(e===null){d(n,null,`unresolvable`);return}r(e)||d(n,e,`no-such-file`);return}},p,m,h={pages:a,get pagesBySlug(){return p??=Fa(a,Pi),p},get pagesByBasename(){return m??=Eo(a,Pi),m}},g=(e,t)=>{let n=lo(e,t,h);!n||n.kind!==`doc`||ra(n.docName,h)===void 0&&i?.(n.docName)!==!0&&d(`[[${e}${t?`#${t}`:``}]]`,n.docName,`no-such-doc`)};for(let e of s){if(u){SR(e,u)&&(u=null);continue}let t=xR(e);if(t){u=t;continue}let n=CR(e);for(;n<e.length;){if(e[n]===`\\`&&n+1<e.length){n+=2;continue}if(e[n]==="`"){let t=wR(e,n);if(t){n=t.nextIndex;continue}}if(e[n]===`[`&&e[n+1]===`[`){let t=TR(e,n);if(t){g(t.target,t.anchor),n=t.nextIndex;continue}}if(e[n]===`[`&&e[n-1]!==`!`){let t=OR(e,n);if(t){f(t.href),n=t.nextIndex;continue}}n++}}return c}function zR(e){return{backward:Object.fromEntries([...e.backward.entries()].map(([e,t])=>[e,[...t.entries()].map(([e,t])=>({source:e,anchor:t.anchor,snippet:t.snippet,sourceForm:t.sourceForm,line:t.line,column:t.column,...t.rawWikiTarget===!0?{rawWikiTarget:!0}:{}}))])),forward:Object.fromEntries([...e.forward.entries()].map(([e,t])=>[e,[...t].sort()])),externalForward:Object.fromEntries([...e.externalForward.entries()].map(([e,t])=>[e,[...t.entries()].map(([e,t])=>({url:e,label:t.label,snippet:t.snippet})).sort((e,t)=>e.url.localeCompare(t.url))])),skillRefs:Object.fromEntries([...e.skillRefs.entries()].map(([e,t])=>[e,[...t].sort()]))}}function BR(e){let t=new Map;for(let[n,r]of e)for(let[e,i]of r){let r=t.get(e);r||(r=new Map,t.set(e,r)),r.set(n,i)}return t}function VR(e){return typeof e==`number`&&Number.isInteger(e)&&e>=0?e:void 0}function HR(e){let t=new Map(Object.entries(e.externalForward??{}).map(([e,t])=>[e,new Map(t.map(e=>[e.url,{label:e.label??null,snippet:e.snippet??null}]))]));return{backward:new Map(Object.entries(e.backward??{}).map(([e,t])=>[e,new Map(t.map(e=>[e.source,{anchor:e.anchor??null,snippet:e.snippet??null,sourceForm:e.sourceForm===`wiki`||e.sourceForm===`markdown`?e.sourceForm:void 0,line:VR(e.line),column:VR(e.column),rawWikiTarget:e.rawWikiTarget===!0}]))])),forward:new Map(Object.entries(e.forward??{}).map(([e,t])=>[e,new Set(t)])),externalForward:t,externalBackward:BR(t),skillRefs:new Map(Object.entries(e.skillRefs??{}).map(([e,t])=>[e,new Set(t)])),epoch:0}}function UR(e){let t=new Set;for(let n of e){let e=n.indexOf(`/`);for(;e!==-1;)t.add(n.slice(0,e)),e=n.indexOf(`/`,e+1)}return t}var WR=class{projectDir;contentDir;contentFilter;getFileOracle;states=new Map;mtimesByBranch=new Map;documentLookups=new WeakMap;activeBranch=`main`;constructor(e){this.projectDir=e.projectDir,this.contentDir=e.contentDir,this.contentFilter=e.contentFilter,this.getFileOracle=e.getFileOracle??(()=>void 0),this.states.set(this.activeBranch,fR())}getState(e=this.activeBranch){let t=this.states.get(e);return t||(t=fR(),this.states.set(e,t)),t}structuralBundleNeighbors(e,t=this.activeBranch){let n=mR(e),r=new Set;if(!n)return r;let i=this.getState(t);if(!i.forward.has(e))return r;if(n.kind===`skill`)for(let t of i.forward.keys()){let n=mR(t);n?.kind===`reference`&&n.skillDocName===e&&r.add(t)}else i.forward.has(n.skillDocName)&&r.add(n.skillDocName);return r}skillRefNeighbors(e,t=this.activeBranch){let n=new Set,r=this.getState(t);if(!r.forward.has(e))return n;let i=mR(e);if(!i)return n;let a=e.startsWith(Oo),o=r.skillRefs.get(e);if(o){for(let e of o)if(e!==i.name)if(a){let t=Za(`global`,e);r.forward.has(t)&&n.add(t)}else for(let t of r.forward.keys()){let r=mR(t);r?.kind===`skill`&&r.name===e&&!t.startsWith(`__skill__/`)&&n.add(t)}}if(i.kind===`skill`)for(let[t,o]of r.skillRefs)t===e||!o.has(i.name)||t.startsWith(`__skill__/`)===a&&r.forward.has(t)&&n.add(t);return n}bundleNeighbors(e,t=this.activeBranch){let n=this.structuralBundleNeighbors(e,t);for(let r of this.skillRefNeighbors(e,t))n.add(r);return n}recordSkillRefs(e,t,n=this.activeBranch){this.recordSkillRefsInto(this.getState(n),e,t)}recordSkillRefsInto(e,t,n){if(!mR(t))return;let r=ta(n);r.length===0?e.skillRefs.delete(t):e.skillRefs.set(t,new Set(r))}getActiveBranch(){return this.activeBranch}switchBranch(e){this.activeBranch=e,this.getState(e)}cachePath(e=this.activeBranch){return R(cA(this.projectDir),`cache`,e,`backlinks.json`)}registerNodeOnly(e,t=this.activeBranch){let n=this.getState(t),r=n.forward.get(e)??new Set,i=n.externalForward.get(e)??new Map;for(let t of r){let r=n.backward.get(t);r&&(r.delete(e),r.size===0&&n.backward.delete(t))}for(let t of i.keys()){let r=n.externalBackward.get(t);r&&(r.delete(e),r.size===0&&n.externalBackward.delete(t))}n.forward.set(e,new Set),n.epoch++,n.externalForward.set(e,new Map)}registerGlobalSkillBundleNode(e,t=this.activeBranch){fi(e)&&this.registerNodeOnly(e,t)}updateDocument(e,t,n=[],r=this.activeBranch){if(lS(e))return;if(fi(e)){this.registerNodeOnly(e,r);return}let i=this.getState(r),a=i.forward.get(e)??new Set,o=i.externalForward.get(e)??new Map;for(let t of a){let n=i.backward.get(t);n&&(n.delete(e),n.size===0&&i.backward.delete(t))}for(let t of o.keys()){let n=i.externalBackward.get(t);n&&(n.delete(e),n.size===0&&i.externalBackward.delete(t))}let s=new Set,c=new Map;i.forward.set(e,s),i.epoch++,i.externalForward.set(e,c);for(let n of t){if(!n.target)continue;s.add(n.target);let t=i.backward.get(n.target);t||(t=new Map,i.backward.set(n.target,t)),t.set(e,hR(t.get(e),{anchor:n.anchor,snippet:n.snippet,sourceForm:n.sourceForm,line:n.line,column:n.column,rawWikiTarget:n.rawWikiTarget===!0}))}for(let t of n){if(!t.url)continue;c.set(t.url,{label:t.label,snippet:t.snippet});let n=i.externalBackward.get(t.url);n||(n=new Map,i.externalBackward.set(t.url,n)),(!n.has(e)||!n.get(e)?.snippet&&t.snippet)&&n.set(e,{label:t.label,snippet:t.snippet})}}updateDocumentFromMarkdown(e,t,n=this.activeBranch){try{let{frontmatter:r,body:i}=ri(t),a=jR(r),o=FR(i,e,a).map(e=>({...e,sourceForm:`wiki`})),s=MR(i,e,a,this.getFileOracle()).map(e=>({...e,sourceForm:`markdown`})),c=IR(i),l=LR(i,e),u=new Set(o.map(e=>e.target)),d=[...o,...s.filter(e=>!u.has(e.target))],f=new Set(c.map(e=>e.url)),p=[...c,...l.filter(e=>!f.has(e.url))];this.recordSkillRefs(e,i,n),this.updateDocument(e,d,p,n)}catch(t){uR.warn({docName:e,err:t},`Failed to scan ${e} for link extraction`),this.deleteDocument(e,n)}}deleteDocument(e,t=this.activeBranch){if(lS(e))return;let n=this.getState(t),r=n.forward.get(e)??new Set,i=n.externalForward.get(e)??new Map;for(let t of r){let r=n.backward.get(t);r&&(r.delete(e),r.size===0&&n.backward.delete(t))}for(let t of i.keys()){let r=n.externalBackward.get(t);r&&(r.delete(e),r.size===0&&n.externalBackward.delete(t))}n.forward.delete(e),n.epoch++,n.externalForward.delete(e),n.skillRefs.delete(e)}renameDocument(e,t,n,r=this.activeBranch){this.deleteDocument(e,r),this.updateDocumentFromMarkdown(t,n,r)}getBacklinks(e,t=this.activeBranch){let n=this.getState(t).backward.get(e),r=new Map;if(n)for(let[e,t]of n)r.set(e,{source:e,anchor:t.anchor,snippet:t.snippet});for(let n of this.bundleNeighbors(e,t))r.has(n)||r.set(n,{source:n,anchor:null,snippet:null});return[...r.values()].sort((e,t)=>e.source.localeCompare(t.source))}getBacklinkCount(e,t=this.activeBranch){let n=this.getState(t).backward.get(e),r=this.bundleNeighbors(e,t);if(r.size===0)return n?.size??0;let i=new Set(n?.keys()??[]);for(let e of r)i.add(e);return i.size}getForwardLinks(e,t=this.activeBranch){let n=this.getState(t),r=new Set(n.forward.get(e)??new Set);for(let n of this.bundleNeighbors(e,t))r.add(n);return[...r].sort((e,t)=>e.localeCompare(t))}getForwardLinkEntries(e,t=this.activeBranch){let n=this.getState(t),r=this.getForwardLinks(e,t).map(t=>({kind:`doc`,target:t,anchor:n.backward.get(t)?.get(e)?.anchor??null,snippet:n.backward.get(t)?.get(e)?.snippet??null})),i=[...(n.externalForward.get(e)??new Map).entries()].map(([e,t])=>({kind:`external`,url:e,label:t.label,snippet:t.snippet})).sort((e,t)=>e.url.localeCompare(t.url));return[...r,...i]}getOrphans(e,t=`both`,n=this.activeBranch){let r=this.getState(n),i=new Set;for(let e of r.forward.keys()){let t=mR(e);t?.kind===`reference`&&i.add(t.skillDocName)}let a=e=>{let t=mR(e);return!t||!r.forward.has(e)?!1:t.kind===`skill`?i.has(e):r.forward.has(t.skillDocName)};return[...e].filter(e=>{let n=a(e),i=n||(r.backward.get(e)?.size??0)>0,o=n||(r.forward.get(e)?.size??0)>0;return t===`incoming`?!i:(t===`outgoing`||!i)&&!o}).sort((e,t)=>e.localeCompare(t))}getHubs(e=20,t=this.activeBranch){return[...this.getState(t).backward.entries()].map(([e,t])=>({docName:e,count:t.size})).sort((e,t)=>t.count===e.count?e.docName.localeCompare(t.docName):t.count-e.count).slice(0,e)}getIndexedDocNames(e=this.activeBranch){return[...this.getState(e).forward.keys()]}getDeadLinks(e,t,n=this.activeBranch,r){let i=this.getState(n),a=new Set(e),o=t?.length?new Set(t):null,s=UR([...a,...i.forward.keys()]);for(let e of r??[])s.add(e);return[...i.backward.entries()].filter(([e,t])=>{if(a.has(e)||i.forward.has(e)||s.has(e.replace(/\/+$/,``)))return!1;if(!o)return t.size>0;for(let e of t.keys())if(o.has(e))return!0;return!1}).map(([e,t])=>({target:e,sources:[...t.entries()].filter(([,e])=>e.rawWikiTarget!==!0).filter(([,t])=>t.sourceForm!==`wiki`||ra(e,this.documentLookup(n))===void 0).filter(([e])=>!o||o.has(e)).map(([e,t])=>({source:e,anchor:t.anchor,snippet:t.snippet,sourceForm:t.sourceForm,line:t.line,column:t.column})).sort((e,t)=>e.source.localeCompare(t.source))})).filter(e=>e.sources.length>0).sort((e,t)=>t.sources.length===e.sources.length?e.target.localeCompare(t.target):t.sources.length-e.sources.length)}documentLookup(e=this.activeBranch){let t=this.getState(e),n=this.documentLookups.get(t);if(n?.epoch===t.epoch)return n.lookup;let r=new Set(t.forward.keys()),i={pages:r,pagesBySlug:Fa(r,Pi),pagesByBasename:Eo(r,Pi)};return this.documentLookups.set(t,{epoch:t.epoch,lookup:i}),i}undecidedTargetResolves(e,t=this.activeBranch){return lo(e,null,this.documentLookup(t))?.kind===`doc`}getLinkGraph(e=this.activeBranch){let t=this.getState(e),n=new Map,r=[];for(let[i,a]of t.forward){n.set(i,{kind:`doc`,id:i,docName:i,anchor:gR(t.backward.get(i))});for(let o of a)pR(t,o)&&!this.undecidedTargetResolves(o,e)||(n.set(o,{kind:`doc`,id:o,docName:o,anchor:gR(t.backward.get(o))}),r.push({source:i,target:o}))}for(let[e,i]of t.externalForward){n.set(e,{kind:`doc`,id:e,docName:e,anchor:gR(t.backward.get(e))});for(let[t,a]of i){let i=_R(t);n.set(i,{kind:`external`,id:i,url:t,label:a.label}),r.push({source:e,target:i})}}for(let i of t.forward.keys())if(mR(i)?.kind===`skill`)for(let a of this.bundleNeighbors(i,e))t.forward.get(i)?.has(a)||t.forward.get(a)?.has(i)||(n.set(i,{kind:`doc`,id:i,docName:i,anchor:gR(t.backward.get(i))}),n.set(a,{kind:`doc`,id:a,docName:a,anchor:gR(t.backward.get(a))}),r.push({source:i,target:a}));return{nodes:[...n.values()].sort((e,t)=>e.id.localeCompare(t.id)),links:r}}getLinkGraphNeighborhood(e,t,n=this.activeBranch){let r=this.getState(n),i=new Map;for(let e of r.externalForward.values())for(let[t,n]of e)i.has(t)||i.set(t,n.label);let a=new Set([e]),o=[{nodeId:e,degree:0}],s=0;for(;s<o.length;){let e=o[s++];if(e.degree>=t)continue;let i=vR(e.nodeId),c=new Set;if(i)for(let e of r.externalBackward.get(i)?.keys()??[])c.add(e);else{for(let t of r.forward.get(e.nodeId)??new Set)pR(r,t)&&!this.undecidedTargetResolves(t,n)||c.add(t);for(let t of r.externalForward.get(e.nodeId)?.keys()??[])c.add(_R(t));for(let t of r.backward.get(e.nodeId)?.keys()??[])c.add(t);for(let t of this.bundleNeighbors(e.nodeId,n))c.add(t)}for(let t of c)a.has(t)||(a.add(t),o.push({nodeId:t,degree:e.degree+1}))}let c=[];for(let[e,t]of r.forward)if(a.has(e))for(let n of t)a.has(n)&&c.push({source:e,target:n});for(let[e,t]of r.externalForward)if(a.has(e))for(let n of t.keys()){let t=_R(n);a.has(t)&&c.push({source:e,target:t})}for(let e of a)if(mR(e)?.kind===`skill`)for(let t of this.bundleNeighbors(e,n))a.has(t)&&(r.forward.get(e)?.has(t)||r.forward.get(t)?.has(e)||c.push({source:e,target:t}));return{nodes:[...a].sort().map(e=>{let t=vR(e);return t?{kind:`external`,id:e,url:t,label:i.get(t)??null}:{kind:`doc`,id:e,docName:e,anchor:gR(r.backward.get(e))}}),links:c}}async saveToDisk(e=this.activeBranch){let t=this.cachePath(e);ku(F(t),{recursive:!0});let n=this.getState(e),r=this.mtimesByBranch.get(e),i={version:2,...zR(n),...r?{mtimes:Object.fromEntries(r)}:{}};await id(t,JSON.stringify(i,null,2),`utf-8`)}async loadFromDisk(e=this.activeBranch){let t=this.cachePath(e);if(!B(t))return!1;try{let n=await ed(t,`utf-8`),r=JSON.parse(n);return r.version===2?(this.states.set(e,HR(r)),r.mtimes?this.mtimesByBranch.set(e,new Map(Object.entries(r.mtimes))):this.mtimesByBranch.delete(e),!0):!1}catch(t){return uR.warn({branch:e,err:t},`Failed to load cache for ${e}`),!1}}clear(e=this.activeBranch){this.states.set(e,fR()),this.mtimesByBranch.delete(e)}async rebuildFromDisk(e=this.activeBranch){return cR(`backlink`,`full`,()=>this.rebuildFromDiskUnspanned(e))}async rebuildFromDiskUnspanned(e){let t=fR(),n=new Map,r=[];await this.walkForPaths(this.contentDir,r);let i=new Set,a=r.filter(({docName:e})=>i.has(e)?!1:(i.add(e),!0));for(let e=0;e<a.length;e+=50){let r=a.slice(e,e+50),i=await Promise.allSettled(r.map(async({docName:e,filePath:t})=>{let[n,r]=await Promise.all([rd(t),ed(t,`utf-8`)]);return{docName:e,mtimeMs:n.mtimeMs,markdown:r}}));for(let e of i){if(e.status===`rejected`){uR.warn({err:e.reason},`Failed to rebuild entry`);continue}let{docName:r,mtimeMs:i,markdown:a}=e.value;n.set(r,i);let{frontmatter:o,body:s}=ri(a),c=jR(o),l=FR(s,r,c).map(e=>({...e,sourceForm:`wiki`})),u=MR(s,r,c,this.getFileOracle()).map(e=>({...e,sourceForm:`markdown`})),d=IR(s),f=LR(s,r),p=new Set(l.map(e=>e.target)),m=[...l,...u.filter(e=>!p.has(e.target))],h=new Set(d.map(e=>e.url)),g=[...d,...f.filter(e=>!h.has(e.url))],_=new Set,v=new Map;this.recordSkillRefsInto(t,r,s),t.forward.set(r,_),t.epoch++,t.externalForward.set(r,v);for(let e of m){if(!e.target)continue;_.add(e.target);let n=t.backward.get(e.target);n||(n=new Map,t.backward.set(e.target,n)),n.set(r,hR(n.get(r),{anchor:e.anchor,snippet:e.snippet,sourceForm:e.sourceForm,line:e.line,column:e.column,rawWikiTarget:e.rawWikiTarget===!0}))}for(let e of g){if(!e.url)continue;v.set(e.url,{label:e.label,snippet:e.snippet});let n=t.externalBackward.get(e.url);n||(n=new Map,t.externalBackward.set(e.url,n)),n.set(r,{label:e.label,snippet:e.snippet})}}}this.states.set(e,t),this.mtimesByBranch.set(e,n)}async walkForPaths(e,t){let n;try{n=await td(e,{withFileTypes:!0})}catch(t){uR.warn({dir:e,err:t},`Failed to read directory ${e}`);return}for(let r of n){let n=I(e,r.name);if(r.isDirectory()){let e=uN(L(this.contentDir,n));if(this.contentFilter&&e&&this.contentFilter.isDirExcluded(e))continue;await this.walkForPaths(n,t)}else if(r.isFile()&&Wx(r.name)){let e=uN(L(this.contentDir,n));if(this.contentFilter?.isExcluded(e))continue;t.push({docName:Kx(e),filePath:n})}}}async reconcileWithDisk(e=this.activeBranch){return cR(`backlink`,`reconcile`,()=>this.reconcileWithDiskUnspanned(e),e=>({"index.added":e.added,"index.updated":e.updated,"index.deleted":e.deleted}))}async reconcileWithDiskUnspanned(e){if(!B(this.contentDir))return{added:0,updated:0,deleted:0,deletedDocNames:[],changedDocs:[]};let t=this.mtimesByBranch.get(e)??new Map,n=[];await this.walkForPaths(this.contentDir,n);let r=new Set,i=n.filter(({docName:e})=>r.has(e)?!1:(r.add(e),!0)),a=new Set(i.map(e=>e.docName)),o=new Map,s=0,c=0,l=[],u=await Promise.allSettled(i.map(async({docName:e,filePath:t})=>({docName:e,filePath:t,mtimeMs:(await rd(t)).mtimeMs})));for(let e of u){if(e.status===`rejected`)continue;let{docName:n,filePath:r,mtimeMs:i}=e.value,a=t.get(n);if(a!==void 0&&a===i){o.set(n,i);continue}l.push({docName:n,filePath:r,mtimeMs:i,isNew:a===void 0})}for(let t=0;t<l.length;t+=50){let n=l.slice(t,t+50),r=await Promise.allSettled(n.map(async({docName:e,filePath:t,mtimeMs:n,isNew:r})=>({docName:e,mtimeMs:n,isNew:r,markdown:await ed(t,`utf-8`)})));for(let t of r){if(t.status===`rejected`){uR.warn({err:t.reason},`Failed to reconcile file`);continue}let{docName:n,mtimeMs:r,isNew:i,markdown:a}=t.value;this.updateDocumentFromMarkdown(n,a,e),o.set(n,r),i?s++:c++}}let d=0,f=[],p=new Set([...t.keys(),...this.getState(e).forward.keys()]);for(let t of p)fi(t)||a.has(t)||(this.deleteDocument(t,e),d++,f.push(t));return this.mtimesByBranch.set(e,o),{added:s,updated:c,deleted:d,deletedDocNames:f,changedDocs:l.map(({docName:e,filePath:t})=>({docName:e,filePath:t}))}}async ingestGlobalSkillBundles(e,t=this.activeBranch){let n=new Set;for(let r of e){if(!B(r))continue;let e;try{e=await td(r,{withFileTypes:!0})}catch(e){uR.warn({root:r,err:e},`Failed to read global skills root ${r}`);continue}for(let i of e){if(!i.isDirectory())continue;let e=i.name,a=I(r,e),o=Za(`global`,e);if(B(I(a,`SKILL.md`))&&fi(o)){this.registerNodeOnly(o,t),n.add(o);try{let e=await ed(I(a,`SKILL.md`),`utf-8`);this.recordSkillRefs(o,ri(e).body,t)}catch(e){uR.warn({dir:a,err:e},`global skill ref-scan failed; edges skipped`)}}let s=[];await this.walkGlobalSkillReferences(I(a,`references`),e,``,s);for(let{docName:e}of s)this.registerNodeOnly(e,t),n.add(e)}}let r=[];for(let e of this.getState(t).forward.keys())fi(e)&&!n.has(e)&&r.push(e);for(let e of r)this.deleteDocument(e,t)}async walkGlobalSkillReferences(e,t,n,r){let i;try{i=await td(e,{withFileTypes:!0})}catch(t){t?.code!==`ENOENT`&&uR.warn({dir:e,err:t},`Failed to read skill references dir ${e}`);return}for(let a of i){let i=n?`${n}/${a.name}`:a.name;if(a.isDirectory())await this.walkGlobalSkillReferences(I(e,a.name),t,i,r);else if(a.isFile()&&Wx(a.name)){let e=Kx(i);r.push({docName:`${Oo}global/${t}/references/${e}`})}}}};function GR(e){return e.filter(e=>FF(e.occurrence))}function KR(e,t){let n=[],r=[];if(e.resolvedTarget!==null&&(e.targetKind===`document`?n.push(e.resolvedTarget):e.targetKind===`file`&&r.push(e.resolvedTarget)),e.occurrence.role===`link`){let i=Sa(e.occurrence.href,t);if(i?.kind===`doc`){n.push(i.docName);let a=Ni(e.occurrence.href,t,{literal:!1});a===i.docName&&r.push(a)}}return e.fallbackTarget!==null&&n.push(e.fallbackTarget),{docs:n,files:r}}function qR(e,t,n){let r=e.get(t);r||(r=new Set,e.set(t,r)),r.add(n)}function JR(e,t,n){let r=e.get(t);r&&(r.delete(n),r.size===0&&e.delete(t))}function YR(e){let t=[],n=Pi(e);return n&&t.push(`slug:${n}`),!e.includes(`/`)&&n&&t.push(`basename:${n}`),t.push(`folder:${e}`),t}function XR(e){let t=[],n=Pi(e);n&&t.push(`slug:${n}`);let r=Pi(e.slice(e.lastIndexOf(`/`)+1));r&&t.push(`basename:${r}`);let i=e.indexOf(`/`);for(;i!==-1;)t.push(`folder:${e.slice(0,i)}`),i=e.indexOf(`/`,i+1);return t}function ZR(e,t){return e.length===t.length?e.every((e,n)=>{let r=t[n];if(!r)return!1;let i=e.occurrence.reference,a=r.occurrence.reference;return e.targetKind===r.targetKind&&e.resolvedTarget===r.resolvedTarget&&e.status===r.status&&e.reason===r.reason&&e.resolutionMethod===r.resolutionMethod&&e.fallbackTarget===r.fallbackTarget&&e.occurrence.role===r.occurrence.role&&e.occurrence.sourceForm===r.occurrence.sourceForm&&e.occurrence.href===r.occurrence.href&&e.occurrence.range.start===r.occurrence.range.start&&e.occurrence.range.end===r.occurrence.range.end&&e.occurrence.line===r.occurrence.line&&e.occurrence.column===r.occurrence.column&&i?.label===a?.label&&i?.kind===a?.kind&&i?.definition.href===a?.definition.href&&i?.definition.repairRange.start===a?.definition.repairRange.start&&i?.definition.repairRange.end===a?.definition.repairRange.end}):!1}var QR=class e{contentDir;canonicalContentDir;contentFilter;readDocument;readDirectory;sourceAssessments=new Map;sourceDocDeps=new Map;sourceFileDeps=new Map;reverseByDoc=new Map;reverseByFile=new Map;reverseByTolerant=new Map;sourceTolerantDeps=new Map;documents=new Set;tolerantDocumentResolver=()=>null;files=new Set;generationValue=0;freshnessEpoch=0;readyValue=!1;closed=!1;folderPaths=new Set;injectedFolderPaths=new Set;inventory={hasDocument:e=>this.documents.has(e),hasFile:e=>this.files.has(e),resolveTolerantDocument:e=>this.tolerantDocumentResolver(e),hasFolder:e=>this.folderPaths.has(e)||this.injectedFolderPaths.has(e)};constructor(e){this.contentDir=e.contentDir;try{this.canonicalContentDir=H(e.contentDir)}catch{this.canonicalContentDir=e.contentDir}this.contentFilter=e.contentFilter,this.readDocument=e.readDocument??(e=>ed(e,`utf-8`)),this.readDirectory=e.readDirectory??(e=>td(e,{withFileTypes:!0}))}get generation(){return this.generationValue}isReady(){return this.readyValue}markUnavailable(){this.readyValue&&this.freshnessEpoch++,this.readyValue=!1}get freshnessToken(){return`${this.generationValue}:${this.freshnessEpoch}`}getAssessments(e){return this.sourceAssessments.get(e)??[]}getAssessmentsForSources(e){let t=e&&e.length>0?new Set(e):null,n=[];for(let[e,r]of this.sourceAssessments)t&&!t.has(e)||n.push({source:e,assessments:r});return n}getDocumentDependents(e){let t=new Set(this.reverseByDoc.get(e)??[]);for(let n of XR(e))for(let e of this.reverseByTolerant.get(n)??[])t.add(e);return[...t].sort((e,t)=>e.localeCompare(t))}getFileDependents(e){return[...this.reverseByFile.get(e)??[]].sort((e,t)=>e.localeCompare(t))}getStats(){let e=0;for(let t of this.sourceAssessments.values())e+=t.length;return{sources:this.sourceAssessments.size,occurrences:e,documentTargets:this.reverseByDoc.size,fileTargets:this.reverseByFile.size}}close(){this.closed=!0}setSource(e,t){return lS(e)?!1:lR(`local-target`,`source`,()=>{let n=this.sourceAssessments.get(e)??[],r=!this.documents.has(e);this.documents.add(e),r&&this.refreshTolerantDocumentIndexes();let i=GR(NF(DF(t),e,this.inventory)),a=!ZR(n,i);a&&this.applySourceAssessments(e,i);let o=r?this.reassessDocumentDependents(e):0,s=a||o>0;return s&&this.generationValue++,{changed:s,occurrences:i.length,affectedSources:o+ +!!a}},e=>({"index.occurrences":e.occurrences,"index.affected_sources":e.affectedSources})).changed}removeSource(e){return lS(e)?!1:lR(`local-target`,`document-target`,()=>{let t=this.sourceAssessments.get(e)?.length??0,n=t>0,r=this.documents.delete(e);r&&this.refreshTolerantDocumentIndexes(),this.applySourceAssessments(e,[]);let i=r?this.reassessDocumentDependents(e):0,a=n||i>0;return a&&this.generationValue++,{changed:a,occurrences:t,affectedSources:i+ +!!n}},e=>({"index.occurrences":e.occurrences,"index.affected_sources":e.affectedSources})).changed}renameSource(e,t,n){let r=this.removeSource(e),i=this.setSource(t,n);return r||i}setFileTarget(e,t){return this.files.has(e)===t?0:lR(`local-target`,`file-target`,()=>{t?this.files.add(e):this.files.delete(e);let n=this.countFileOccurrences(e),r=this.reassessFileDependents(e);return r>0&&this.generationValue++,{affected:r,occurrences:n}},e=>({"index.occurrences":e.occurrences,"index.affected_sources":e.affected})).affected}reconcileDocumentTargets(e){let t=new Set(e),n=new Set;for(let e of this.documents)t.has(e)||n.add(e);for(let e of t)this.documents.has(e)||n.add(e);if(n.size===0)return 0;let r=new Set;for(let e of n){for(let t of this.reverseByDoc.get(e)??[])r.add(t);for(let t of XR(e))for(let e of this.reverseByTolerant.get(t)??[])r.add(e)}this.documents=t,this.refreshTolerantDocumentIndexes();let i=0;for(let e of r)this.reassessSource(e)&&i++;return i>0&&this.generationValue++,i}reconcileFolderTargets(e){let t=new Set(e),n=new Set;for(let e of this.injectedFolderPaths)t.has(e)||n.add(e);for(let e of t)this.injectedFolderPaths.has(e)||n.add(e);if(n.size===0)return 0;let r=new Set;for(let e of n)for(let t of this.reverseByTolerant.get(`folder:${e}`)??[])r.add(t);this.injectedFolderPaths=t;let i=0;for(let e of r)this.reassessSource(e)&&i++;return i>0&&this.generationValue++,i}reconcileFileTargets(e){let t=new Set(e),n=new Set;for(let e of this.files)t.has(e)||n.add(e);for(let e of t)this.files.has(e)||n.add(e);return n.size===0?0:lR(`local-target`,`file-target`,()=>{let e=new Set,r=0;for(let t of n){r+=this.countFileOccurrences(t);for(let n of this.reverseByFile.get(t)??[])e.add(n)}this.files=t;let i=0;for(let t of e)this.reassessSource(t)&&i++;return i>0&&this.generationValue++,{affected:i,occurrences:r}},e=>({"index.occurrences":e.occurrences,"index.affected_sources":e.affected})).affected}async reconcileDependentFileTargetsFromDisk(e){let t=[...this.reverseByFile.keys()],n=await Promise.all(t.map(e=>this.isAdmittedFileOnDisk(e))),r=0;for(let[i,a]of t.entries()){let t=n[i]??!1,o=this.setFileTarget(a,t);o>0&&e?.(a,t),r+=o}return r}async isAdmittedFileOnDisk(e){if(this.contentFilter?.isPathIgnored(e))return!1;try{let t=await nd(I(this.contentDir,e)),n=L(this.canonicalContentDir,t);return n===``||n===`..`||n.startsWith(`..${process.platform===`win32`?`\\`:`/`}`)||fu(n)?!1:(await rd(t)).isFile()}catch{return!1}}countFileOccurrences(e){let t=0;for(let n of this.reverseByFile.get(e)??[])for(let r of this.sourceAssessments.get(n)??[])KR(r,n).files.includes(e)&&t++;return t}rebuildFromDisk(e){return cR(`local-target`,`full`,()=>this.rebuildOnce(e),e=>({"index.sources":e.sources,"index.occurrences":e.occurrences,"index.affected_sources":e.sources}))}async rebuildOnce(t){let n=this.sourceAssessments.size>0;this.freshnessEpoch++,this.readyValue=!1;let r=new e({contentDir:this.contentDir,contentFilter:this.contentFilter,readDocument:this.readDocument,readDirectory:this.readDirectory}),i=await r.populateFromDisk(t);return this.sourceAssessments=r.sourceAssessments,this.sourceDocDeps=r.sourceDocDeps,this.sourceFileDeps=r.sourceFileDeps,this.reverseByDoc=r.reverseByDoc,this.reverseByFile=r.reverseByFile,this.reverseByTolerant=r.reverseByTolerant,this.sourceTolerantDeps=r.sourceTolerantDeps,this.documents=r.documents,this.tolerantDocumentResolver=r.tolerantDocumentResolver,this.folderPaths=r.folderPaths,this.injectedFolderPaths=r.injectedFolderPaths,this.files=r.files,this.readyValue=!0,(n||this.sourceAssessments.size>0)&&this.generationValue++,i}async populateFromDisk(e){for(let t of e.documentTargets)this.documents.add(t);for(let t of e.fileTargets)this.files.add(t);for(let t of e.folderTargets??[])this.injectedFolderPaths.add(t);if(this.refreshTolerantDocumentIndexes(),!B(this.contentDir))return this.readyValue=!0,{sources:0,occurrences:0};let t=await this.listDocsWithPaths();for(let{docName:e}of t)this.documents.add(e);this.refreshTolerantDocumentIndexes();let n=0;for(let e=0;e<t.length&&!this.closed;e+=50){let r=t.slice(e,e+50),i=await Promise.all(r.map(async({docName:e,filePath:t})=>({docName:e,markdown:await this.readDocument(t)})));for(let e of i){if(lS(e.docName))continue;let t=GR(NF(DF(e.markdown),e.docName,this.inventory));this.applySourceAssessments(e.docName,t),n+=t.length}}return this.readyValue=!0,{sources:this.sourceAssessments.size,occurrences:n}}applySourceAssessments(e,t){let n=new Set,r=new Set,i=new Set;for(let a of t){let{docs:t,files:o}=KR(a,e);for(let e of t)n.add(e);for(let e of o)r.add(e);if(a.targetKind===`document`&&a.resolvedTarget!==null&&(a.status!==`exact`||!this.documents.has(a.resolvedTarget)))for(let e of YR(a.resolvedTarget))i.add(e)}let a=this.sourceDocDeps.get(e);if(a)for(let t of a)n.has(t)||JR(this.reverseByDoc,t,e);for(let t of n)a?.has(t)||qR(this.reverseByDoc,t,e);let o=this.sourceFileDeps.get(e);if(o)for(let t of o)r.has(t)||JR(this.reverseByFile,t,e);for(let t of r)o?.has(t)||qR(this.reverseByFile,t,e);let s=this.sourceTolerantDeps.get(e);if(s)for(let t of s)i.has(t)||JR(this.reverseByTolerant,t,e);for(let t of i)s?.has(t)||qR(this.reverseByTolerant,t,e);if(t.length===0){this.sourceAssessments.delete(e),this.sourceDocDeps.delete(e),this.sourceFileDeps.delete(e),this.sourceTolerantDeps.delete(e);return}this.sourceAssessments.set(e,t),this.sourceDocDeps.set(e,n),this.sourceFileDeps.set(e,r),this.sourceTolerantDeps.set(e,i)}reassessSource(e){let t=this.sourceAssessments.get(e);if(!t)return!1;let n=NF(t.map(e=>e.occurrence),e,this.inventory);return ZR(t,n)?!1:(this.applySourceAssessments(e,n),!0)}reassessDocumentDependents(e){let t=new Set(this.reverseByDoc.get(e)??[]);for(let n of XR(e))for(let e of this.reverseByTolerant.get(n)??[])t.add(e);let n=0;for(let e of t)this.reassessSource(e)&&(n+=1);return n}reassessFileDependents(e){let t=[...this.reverseByFile.get(e)??[]],n=0;for(let e of t)this.reassessSource(e)&&(n+=1);return n}refreshTolerantDocumentIndexes(){this.tolerantDocumentResolver=OF(this.documents);let e=new Set;for(let t of this.documents){let n=t.indexOf(`/`);for(;n!==-1;)e.add(t.slice(0,n)),n=t.indexOf(`/`,n+1)}this.folderPaths=e}async listDocsWithPaths(){let e=[];await this.walkContentDir(this.contentDir,e),e.sort((e,t)=>e.docName===t.docName?t.filePath.localeCompare(e.filePath):e.docName.localeCompare(t.docName));let t=new Set;return e.filter(({docName:e})=>t.has(e)?!1:(t.add(e),!0))}async walkContentDir(e,t){let n=await this.readDirectory(e);for(let r of n){let n=I(e,r.name);if(r.isDirectory()){let e=uN(L(this.contentDir,n));if(this.contentFilter&&e&&this.contentFilter.isDirExcluded(e))continue;await this.walkContentDir(n,t);continue}if(!r.isFile()||!Wx(r.name))continue;let i=uN(L(this.contentDir,n));this.contentFilter?.isExcluded(i)||t.push({docName:Kx(i),filePath:n})}}};const $R=P(`tag-index`),ez=os();function tz(e){if(typeof e!=`object`||!e)return!1;let t=e;if(t.version!==1)return!1;let{docs:n,files:r}=t;if(typeof n!=`object`||!n||Array.isArray(n)||typeof r!=`object`||!r||Array.isArray(r))return!1;for(let e of Object.values(n))if(!Array.isArray(e)||!e.every(e=>typeof e==`string`&&e.length>0))return!1;for(let e of Object.values(r)){if(typeof e!=`object`||!e)return!1;let{mtimeMs:t,size:n}=e;if(typeof t!=`number`||typeof n!=`number`)return!1}return!0}function nz(){return{byTag:new Map,byDoc:new Map,byDocLiteral:new Map}}function rz(e){return e.replace(/`[^`]*`/g,``)}function iz(e){let t=e.replaceAll(`\r
|
|
102
102
|
`,`
|
|
103
103
|
`).split(`
|
|
104
104
|
`),n=[],r=!1,i=``;for(let e of t){let t=/^\s{0,3}([`~]{3,})/.exec(e);if(t){r?RegExp(`^\\s{0,3}${i[0]==="`"?"`":`~`}{${i.length},}\\s*$`).test(e)&&(r=!1,i=``):(r=!0,i=t[1]);continue}if(r)continue;let a=rz(e);for(ez.lastIndex=0;;){let e=ez.exec(a);if(e===null)break;let t=e[2];t&&n.push(t)}}return n}var az=class{contentDir;contentFilter;projectDir;state=nz();fileMeta=new Map;initChain=Promise.resolve();closed=!1;constructor(e){this.contentDir=e.contentDir,this.contentFilter=e.contentFilter,this.projectDir=e.projectDir}snapshotPath(){return this.projectDir?R(cA(this.projectDir),`cache`,`tags.json`):null}enqueue(e){let t=this.initChain.then(e);return this.initChain=t.then(()=>void 0,e=>{$R.warn({err:e},`queued tag-index task failed (chain cleared for next task)`)}),t}close(){return this.closed=!0,this.initChain}updateDocumentFromMarkdown(e,t){if(!lS(e))try{let{frontmatter:n,body:r}=ri(t),i=To(n?qa(n):``),a=iz(r),o=new Set([...i,...a]),s=new Set;for(let e of o)for(let t of $r(e))s.add(t);this.applyDocSnapshot(e,o,s)}catch(t){$R.warn({docName:e,err:t},`Failed to scan ${e} for tag extraction`),this.deleteDocument(e)}}deleteDocument(e){if(lS(e))return;let t=this.state.byDoc.get(e);if(t){for(let n of t){let t=this.state.byTag.get(n);t&&(t.delete(e),t.size===0&&this.state.byTag.delete(n))}this.state.byDoc.delete(e),this.state.byDocLiteral.delete(e)}}renameDocument(e,t,n){this.deleteDocument(e),this.updateDocumentFromMarkdown(t,n)}getDocsForTag(e){let t=this.state.byTag.get(e);return t?[...t].sort((e,t)=>e.localeCompare(t)):[]}getDocsForTagWithMatches(e){let t=this.state.byTag.get(e);if(!t)return[];let n=[];for(let r of t){let t=this.state.byDocLiteral.get(r);if(!t)continue;let i=Ha(t,e);n.push({docName:r,matchingTags:[...i].sort((e,t)=>e.localeCompare(t))})}return n.sort((e,t)=>e.docName.localeCompare(t.docName))}getAllTags(){let e=[...this.state.byTag.entries()],t=e.map(([e])=>e),n=new Set;for(let e of t){let t=e.indexOf(`/`);t>0&&n.add(e.slice(0,t));let r=t;for(;r>0;)n.add(e.slice(0,r)),r=e.indexOf(`/`,r+1)}return e.map(([e,t])=>({name:e,count:t.size,isLeaf:!n.has(e)})).sort((e,t)=>e.name.localeCompare(t.name))}init(){return this.enqueue(()=>cR(`tag`,`full`,()=>this.initOnce()))}async initOnce(){if(this.closed||(this.state=nz(),this.fileMeta=new Map,!B(this.contentDir)))return;let e=await this.listDocsWithPaths();for(let t=0;t<e.length;t+=50){let n=e.slice(t,t+50),r=await Promise.all(n.map(async({docName:e,filePath:t})=>{try{let[n,r]=await Promise.all([rd(t),ed(t,`utf-8`)]);return{docName:e,markdown:r,mtimeMs:n.mtimeMs,size:n.size}}catch(t){return $R.warn({docName:e,err:t},`Failed to read ${e} during init`),null}}));for(let e of r)if(e)try{this.updateDocumentFromMarkdown(e.docName,e.markdown),this.fileMeta.set(e.docName,{mtimeMs:e.mtimeMs,size:e.size})}catch(t){$R.warn({docName:e.docName,err:t},`Failed to index ${e.docName} during init`)}}}loadFromDisk(){return this.enqueue(()=>this.loadOnce())}async loadOnce(){if(this.closed)return!1;let e=this.snapshotPath();if(!e||!B(e))return!1;let t;try{t=JSON.parse(await ed(e,`utf-8`))}catch(e){return $R.warn({err:e},`Failed to load tag snapshot; falling back to full rebuild`),!1}if(!tz(t))return $R.warn({},`Tag snapshot failed validation; falling back to full rebuild`),!1;this.state=nz(),this.fileMeta=new Map(Object.entries(t.files));for(let[e,n]of Object.entries(t.docs)){if(lS(e))continue;let t=new Set(n),r=new Set;for(let e of t)for(let t of $r(e))r.add(t);this.applyDocSnapshot(e,t,r)}return!0}saveToDisk(){return this.enqueue(()=>this.saveOnce())}async saveOnce(){if(this.closed)return;let e=this.snapshotPath();if(!e)return;let t={version:1,docs:Object.fromEntries([...this.state.byDocLiteral.entries()].map(([e,t])=>[e,[...t].sort((e,t)=>e.localeCompare(t))])),files:Object.fromEntries(this.fileMeta)};await Ms(F(e),{recursive:!0}),await ks(e,JSON.stringify(t,null,2),`utf-8`)}reconcileWithDisk(){return this.enqueue(()=>cR(`tag`,`reconcile`,()=>this.reconcileOnce(),e=>({"index.added":e.added,"index.updated":e.updated,"index.deleted":e.deleted})))}async reconcileOnce(){if(this.closed||!B(this.contentDir))return{added:0,updated:0,deleted:0};let e=await this.listDocsWithPaths(),t=new Set(e.map(e=>e.docName)),n=new Map,r=0,i=0,a=[],o=await Promise.allSettled(e.map(async({docName:e,filePath:t})=>{let n=await rd(t);return{docName:e,filePath:t,meta:{mtimeMs:n.mtimeMs,size:n.size}}}));for(let e of o){if(e.status===`rejected`)continue;let{docName:t,filePath:r,meta:i}=e.value,o=this.fileMeta.get(t);if(o!==void 0&&o.mtimeMs===i.mtimeMs&&o.size===i.size){n.set(t,i);continue}a.push({docName:t,filePath:r,meta:i,isNew:o===void 0})}for(let e=0;e<a.length;e+=50){let t=a.slice(e,e+50),o=await Promise.allSettled(t.map(async({docName:e,meta:t,isNew:n,filePath:r})=>({docName:e,meta:t,isNew:n,markdown:await ed(r,`utf-8`)})));for(let e of o){if(e.status===`rejected`){$R.warn({err:e.reason},`Failed to reconcile file`);continue}let{docName:t,meta:a,isNew:o,markdown:s}=e.value;this.updateDocumentFromMarkdown(t,s),n.set(t,a),o?r++:i++}}let s=0,c=new Set([...this.fileMeta.keys(),...this.state.byDoc.keys()]);for(let e of c)t.has(e)||(this.deleteDocument(e),s++);return this.fileMeta=n,{added:r,updated:i,deleted:s}}applyDocSnapshot(e,t,n){let r=this.state.byDoc.get(e)??new Set;for(let t of r){if(n.has(t))continue;let r=this.state.byTag.get(t);r&&(r.delete(e),r.size===0&&this.state.byTag.delete(t))}for(let t of n){let n=this.state.byTag.get(t);n||(n=new Set,this.state.byTag.set(t,n)),n.add(e)}n.size===0?(this.state.byDoc.delete(e),this.state.byDocLiteral.delete(e)):(this.state.byDoc.set(e,n),this.state.byDocLiteral.set(e,t))}async listDocsWithPaths(){let e=[];await this.walkContentDir(this.contentDir,e),e.sort((e,t)=>e.docName===t.docName?t.filePath.localeCompare(e.filePath):e.docName.localeCompare(t.docName));let t=new Set;return e.filter(({docName:e})=>t.has(e)?!1:(t.add(e),!0))}async walkContentDir(e,t){let n;try{n=await td(e,{withFileTypes:!0})}catch(t){$R.warn({dir:e,err:t},`Failed to read directory ${e}`);return}for(let r of n){let n=I(e,r.name);if(r.isDirectory()){let e=uN(L(this.contentDir,n));if(this.contentFilter&&e&&this.contentFilter.isDirExcluded(e))continue;await this.walkContentDir(n,t);continue}if(!r.isFile()||!Wx(r.name))continue;let i=uN(L(this.contentDir,n));this.contentFilter?.isExcluded(i)||t.push({docName:Kx(i),filePath:n})}}};const oz=P(`derived-document-index`);function sz(e){return typeof e==`string`&&zn(e)}function cz(){let e;return{promise:new Promise(t=>{e=t}),resolve:e}}var lz=class extends Error{constructor(){super(`Derived document index is closed`),this.name=`DerivedDocumentIndexClosedError`}};function uz(e){return e instanceof lz}var dz=class extends Error{constructor(){super(`Local-target index is not ready`),this.name=`LocalTargetIndexNotReadyError`}};function fz(e){return e instanceof dz}var pz=class{testOnly;backlinkIndex;tagIndex;localTargetIndex;contentFilter;getGlobalSkillRoots;getLocalTargetInventory;signalChannel;onRecoveredFileTarget;startupAdmission=cz();readyBarrier=cz();tail=Promise.resolve();saveTimer=null;localTargetRebuildRetryTimer=null;localTargetFileExistenceTimer;localTargetRebuildRetryAttempt=0;graphFileTargetsSource=null;graphFileTargets=null;startupBranch=null;graphBuiltWithoutFileOracle=!1;saveTagsOnNextDebounce=!1;branchTransition=null;startupBegun=!1;startupSettled=!1;liveUpdateToken=0;lastSignaledLocalTargetGeneration=0;closed=!1;closePromise=null;constructor(e){this.backlinkIndex=new WR({projectDir:e.projectDir,contentDir:e.contentDir,contentFilter:e.contentFilter,getFileOracle:()=>this.graphFileOracle()}),this.tagIndex=new az({projectDir:e.projectDir,contentDir:e.contentDir,contentFilter:e.contentFilter}),this.localTargetIndex=new QR({contentDir:e.contentDir,contentFilter:e.contentFilter}),this.contentFilter=e.contentFilter,this.getGlobalSkillRoots=e.getGlobalSkillRoots,this.getLocalTargetInventory=e.getLocalTargetInventory??(()=>({documentTargets:[],fileTargets:[],folderTargets:[]})),this.signalChannel=e.signalChannel,this.onRecoveredFileTarget=e.onRecoveredFileTarget,this.testOnly={resetDocumentForTest:e=>this.resetDocumentForTest(e),rescanBacklinksForTest:()=>this.rescanBacklinksForTest()},this.localTargetFileExistenceTimer=setInterval(()=>{this.closed||!this.startupSettled||!this.localTargetIndex.isReady()||this.runCommand(async()=>{let e=await this.localTargetIndex.reconcileDependentFileTargetsFromDisk(this.onRecoveredFileTarget);this.maybeSignalLocalTargets(),e>0&&this.signalChannel(`files`)}).catch(e=>{this.closed||oz.warn({err:e},`[local-target] dependent file-existence sweep failed`)})},5e3),this.localTargetFileExistenceTimer.unref?.()}beginStartup(e){if(this.assertOpen(),this.startupBegun)throw Error(`Derived document index startup has already begun`);this.startupBegun=!0,this.startupBranch=e,this.backlinkIndex.switchBranch(e);let t=this.initializeBacklinks(e),n=this.warmTags();return this.tail=Promise.all([t.then(()=>void 0),n]).then(()=>void 0),this.startupAdmission.resolve(),{backlinksReady:t}}async settleStartupAfterWatcherSeed(){if(this.assertOpen(),!this.startupBegun)throw Error(`Derived document index startup has not begun`);if(this.startupSettled)throw Error(`Derived document index startup has already settled`);this.startupSettled=!0;try{return await this.enqueueInternal(async()=>{let e=!1;try{let e=await this.tagIndex.reconcileWithDisk();(e.added>0||e.updated>0||e.deleted>0)&&oz.info(e,`[tag-index] startup reconcile: offline changes applied`),await this.saveTagsLogOnly(`startup`)}catch(t){oz.error({err:t},`[tag-index] startup reconcile failed; tag index updates incrementally via watcher events`),e=!0}return await this.rebuildLocalTargets(`startup`)&&this.syncLocalTargetBaseline(),this.startupBranch!==null&&await this.reconcileGraphWithFileInventory(this.startupBranch),{tagIndexDegraded:e}})}finally{this.readyBarrier.resolve()}}async beginBranchSwitch(e){if(this.assertOpen(),this.branchTransition)throw Error(`Derived document index branch switch already active`);let t={branch:e,barrier:cz()};this.liveUpdateToken++,this.branchTransition=t,this.cancelScheduledSave();try{return await this.startupAdmission.promise,await this.readyBarrier.promise,this.assertOpen(),await this.enqueueInternal(async()=>{this.backlinkIndex.switchBranch(e)}),t}catch(e){throw this.releaseBranchTransition(t),e}}async settleBranchFromDisk(e){if(this.assertOpen(),this.branchTransition!==e)throw Error(`No derived document index branch switch is active`);try{await this.enqueueInternal(async()=>{let t=e.branch;if(await this.backlinkIndex.loadFromDisk(t)){let e=await this.backlinkIndex.reconcileWithDisk(t);(e.added>0||e.updated>0||e.deleted>0)&&oz.info(e,`[backlinks] branch-switch reconcile for ${t}`)}else await this.backlinkIndex.rebuildFromDisk(t);let n=!1,r;try{await this.backlinkIndex.ingestGlobalSkillBundles(this.getGlobalSkillRoots(),t)}catch(e){n=!0,r=e}await this.saveBacklinksLogOnly(`branch-switch`,t);try{let e=await this.tagIndex.reconcileWithDisk();(e.added>0||e.updated>0||e.deleted>0)&&oz.info(e,`[tag-index] branch-switch reconcile for ${t}`)}catch(e){oz.warn({err:e,branch:t},`[tag-index] branch-switch reconcile failed; falling back to full rebuild`),await this.tagIndex.init()}if(await this.saveTagsLogOnly(`branch-switch`),await this.rebuildLocalTargets(`branch-switch`)&&this.syncLocalTargetBaseline(),n)throw r})}finally{this.releaseBranchTransition(e)}}abortBranchSwitch(e){e&&this.releaseBranchTransition(e)}captureLiveUpdateToken(){return this.closed?null:this.liveUpdateToken}recordLiveDocument(e,t,n){return this.closed||n!==this.liveUpdateToken?Promise.resolve():this.runCommand(async()=>{n===this.liveUpdateToken&&(this.updateBoth(e,t),this.signalAllRelations())})}recordDurableStore(e,t){return this.runCommand(async()=>{this.updateBacklinks(e,t),this.scheduleSave(!1)})}recordDiskUpsert(e,t){return this.runCommand(async()=>{this.updateBoth(e,t),this.reconcileLocalTargetInventory(),this.scheduleSave(),this.signalAllRelations()})}recordDiskDelete(e){return this.runCommand(async()=>{this.deleteBoth(e),this.reconcileLocalTargetInventory(),this.scheduleSave(),this.signalAllRelations()})}recordDiskRename(e,t,n){return this.runCommand(async()=>{this.renameBoth(e,t,n),this.reconcileLocalTargetInventory(),this.scheduleSave(),this.signalAllRelations()})}recordFileTargetUpsert(e){return this.runCommand(async()=>{let t=this.reconcileLocalTargetInventory();(t===null||!t.fileTargets.includes(e))&&this.localTargetIndex.setFileTarget(e,!0),this.maybeSignalLocalTargets()})}recordFileTargetDelete(e){return this.runCommand(async()=>{let t=this.reconcileLocalTargetInventory();(t===null||t.fileTargets.includes(e))&&this.localTargetIndex.setFileTarget(e,!1),this.maybeSignalLocalTargets()})}recordDirectDocument(e,t){return this.recordDirectMutations([{kind:`upsert`,documentName:e,markdown:t}])}recordDirectDelete(e){return this.recordDirectMutations([{kind:`delete`,documentName:e}])}recordDirectRename(e,t,n){return this.recordDirectMutations([{kind:`rename`,oldDocumentName:e,newDocumentName:t,markdown:n}])}recordLinkRewrite(e,t){return this.recordDirectMutations([{kind:`link-rewrite`,documentName:e,markdown:t}])}recordDirectMutations(e){return e.length===0?Promise.resolve():this.runCommand(async()=>{let t=!1;for(let n of e)switch(n.kind){case`upsert`:this.updateBoth(n.documentName,n.markdown),t=!0;break;case`delete`:this.deleteBoth(n.documentName),t=!0;break;case`rename`:this.renameBoth(n.oldDocumentName,n.newDocumentName,n.markdown),t=!0;break;case`link-rewrite`:this.updateBacklinks(n.documentName,n.markdown);break}t?(this.reconcileLocalTargetInventory(),await this.saveBothLogOnly(`direct-batch`),this.signalAllRelations()):(await this.saveBacklinksLogOnly(`direct-batch`),this.signalBacklinks())})}refreshGlobalSkillNodes(){return this.runCommand(async()=>{await this.backlinkIndex.ingestGlobalSkillBundles(this.getGlobalSkillRoots()),this.reconcileLocalTargetInventory(),this.signalBacklinks()})}refreshContentScope(){return this.runCommand(async()=>{let e=this.backlinkIndex.getActiveBranch(),t=await this.backlinkIndex.reconcileWithDisk(e),n=!1,r;try{await this.backlinkIndex.ingestGlobalSkillBundles(this.getGlobalSkillRoots(),e)}catch(e){n=!0,r=e}await this.tagIndex.reconcileWithDisk(),this.reconcileLocalTargetInventory();for(let{docName:e,filePath:n}of t.changedDocs)try{this.localTargetIndex.setSource(e,await ed(n,`utf-8`))}catch{this.localTargetIndex.removeSource(e)}for(let e of t.deletedDocNames)this.localTargetIndex.removeSource(e);if(await this.saveBothLogOnly(`content-filter`,e),this.signalAllRelations(),n)throw r})}announceReadyViews(){this.assertOpen(),this.signalAllRelations()}getBacklinks(e){return this.runQuery(()=>this.backlinkIndex.getBacklinks(e))}getBacklinkCount(e){return this.runQuery(()=>this.backlinkIndex.getBacklinkCount(e))}getBacklinkCounts(e){return this.runQuery(()=>Object.fromEntries(e.map(e=>[e,this.backlinkIndex.getBacklinkCount(e)])))}getForwardLinkEntries(e){return this.runQuery(()=>this.backlinkIndex.getForwardLinkEntries(e))}getLinkGraphNeighborhood(e,t){return this.runQuery(()=>this.backlinkIndex.getLinkGraphNeighborhood(e,t))}getLinkGraph(){return this.runQuery(()=>this.backlinkIndex.getLinkGraph())}getHubs(e){return this.runQuery(()=>this.backlinkIndex.getHubs(e))}getOrphans(e,t){return this.runQuery(()=>this.backlinkIndex.getOrphans(e,t))}getDeadLinks(e,t){return this.runQuery(()=>this.backlinkIndex.getDeadLinks(e,t,void 0,this.getLocalTargetInventory()?.folderTargets))}getIndexedDocNames(){return this.runQuery(()=>this.backlinkIndex.getIndexedDocNames())}getAllTags(){return this.runQuery(()=>this.tagIndex.getAllTags())}getDocsForTagWithMatches(e){return this.runQuery(()=>this.tagIndex.getDocsForTagWithMatches(e))}getLocalTargetAssessments(e){return this.runLocalTargetQuery(()=>this.localTargetIndex.getAssessments(e))}getLocalTargetAssessmentsForSources(e){return this.runLocalTargetQuery(()=>this.localTargetIndex.getAssessmentsForSources(e))}getLocalTargetGeneration(){return this.runLocalTargetQuery(()=>this.localTargetIndex.generation)}readLocalTargetGeneration(){return this.localTargetIndex.freshnessToken}getLocalTargetStats(){return this.runLocalTargetQuery(()=>this.localTargetIndex.getStats())}getLocalTargetDocumentDependents(e){return this.runLocalTargetQuery(()=>this.localTargetIndex.getDocumentDependents(e))}getLocalTargetFileDependents(e){return this.runLocalTargetQuery(()=>this.localTargetIndex.getFileDependents(e))}close(){if(this.closePromise)return this.closePromise;let e=this.cancelScheduledSave();return e!==null&&this.enqueueInternal(()=>this.saveScheduledCache(e,`close-flush`)),this.closed=!0,clearInterval(this.localTargetFileExistenceTimer),this.cancelLocalTargetRebuildRetry(),this.localTargetIndex.close(),this.startupAdmission.resolve(),this.readyBarrier.resolve(),this.releaseBranchTransition(this.branchTransition),this.closePromise=this.tail.then(()=>this.tagIndex.close()).then(()=>void 0,()=>void 0),this.closePromise}resetDocumentForTest(e){return this.runCommand(async()=>{this.deleteBoth(e),await this.saveBothLogOnly(`test-reset`),this.signalAllRelations()})}rescanBacklinksForTest(){return this.runCommand(async()=>{let e=this.backlinkIndex.getActiveBranch();await this.backlinkIndex.rebuildFromDisk(e),await this.backlinkIndex.ingestGlobalSkillBundles(this.getGlobalSkillRoots(),e),this.reconcileLocalTargetInventory(),await this.saveBacklinksLogOnly(`test-rescan`,e),this.signalBacklinks()})}async initializeBacklinks(e){try{let t=[];if(this.graphFileOracle(),await this.backlinkIndex.loadFromDisk(e)){let n=await this.backlinkIndex.reconcileWithDisk(e);t=n.deletedDocNames,(n.added>0||n.updated>0||n.deleted>0)&&oz.info({added:n.added,updated:n.updated,deleted:n.deleted},`[backlinks] startup reconcile: offline changes applied`)}else await this.backlinkIndex.rebuildFromDisk(e);return await this.ingestGlobalSkillNodesLogOnly(e,`startup`),await this.saveBacklinksLogOnly(`startup`,e),{deletedDocNames:t,backlinkIndexDegraded:!1}}catch(t){return oz.error({err:t,branch:e},`[backlinks] startup init failed; index will populate incrementally via watcher`),{deletedDocNames:[],backlinkIndexDegraded:!0}}}async warmTags(){try{await this.tagIndex.loadFromDisk()?await this.tagIndex.reconcileWithDisk():await this.tagIndex.init()}catch(e){oz.warn({err:e},`[derived-document-index] tag-index warm boot failed; continuing with stale or empty index`)}}updateBoth(e,t){this.updateBacklinks(e,t),this.isAdmitted(e)?this.tagIndex.updateDocumentFromMarkdown(e,t):this.tagIndex.deleteDocument(e)}updateBacklinks(e,t){this.isAdmitted(e)?(this.backlinkIndex.updateDocumentFromMarkdown(e,t),this.localTargetIndex.setSource(e,t)):(this.backlinkIndex.deleteDocument(e),this.localTargetIndex.removeSource(e))}deleteBoth(e){this.backlinkIndex.deleteDocument(e),this.tagIndex.deleteDocument(e),this.localTargetIndex.removeSource(e)}renameBoth(e,t,n){this.isAdmitted(t)?(this.backlinkIndex.renameDocument(e,t,n),this.tagIndex.renameDocument(e,t,n),this.localTargetIndex.renameSource(e,t,n)):(this.backlinkIndex.deleteDocument(e),this.backlinkIndex.deleteDocument(t),this.tagIndex.deleteDocument(e),this.tagIndex.deleteDocument(t),this.localTargetIndex.removeSource(e),this.localTargetIndex.removeSource(t))}isAdmitted(e){return lS(e)?!1:iS(e)?!0:!this.contentFilter.isExcluded($x(e))}signalBacklinks(){this.signalChannel(`backlinks`),this.signalChannel(`graph`),this.maybeSignalLocalTargets()}signalAllRelations(){this.signalBacklinks(),this.signalChannel(`tags`)}maybeSignalLocalTargets(){let e=this.localTargetIndex.generation,t=e-this.lastSignaledLocalTargetGeneration;t!==0&&(sR(`local-target`,`signal`,t),this.lastSignaledLocalTargetGeneration=e,this.signalChannel(`local-targets`))}graphFileOracle(){let e=this.getLocalTargetInventory();if(!e){this.graphBuiltWithoutFileOracle=!0;return}this.graphFileTargetsSource!==e.fileTargets&&(this.graphFileTargetsSource=e.fileTargets,this.graphFileTargets=new Set(e.fileTargets));let t=this.graphFileTargets;return t?{hasFile:e=>t.has(e)}:void 0}async reconcileGraphWithFileInventory(e){if(this.graphBuiltWithoutFileOracle&&this.graphFileOracle()){this.graphBuiltWithoutFileOracle=!1;try{await this.backlinkIndex.rebuildFromDisk(e),await this.saveBacklinksLogOnly(`file-inventory-reconcile`,e),this.signalChannel(`backlinks`),this.signalChannel(`graph`)}catch(t){this.graphBuiltWithoutFileOracle=!0,oz.warn({err:t,branch:e},`[backlinks] file-inventory reconciliation failed; graph retains its startup extraction`)}}}async rebuildLocalTargets(e){try{let t=this.getLocalTargetInventory();if(t===null)return this.localTargetIndex.markUnavailable(),oz.warn({reason:e},`[local-target] watcher inventory unavailable; index remains not ready`),!1;let n={documentTargets:new Set([...this.backlinkIndex.getIndexedDocNames(),...t.documentTargets]),fileTargets:t.fileTargets};return await this.localTargetIndex.rebuildFromDisk(n),this.localTargetRebuildRetryAttempt=0,this.cancelLocalTargetRebuildRetry(),!0}catch(t){return oz.warn({err:t,reason:e},`[local-target] rebuild failed; retaining the last complete snapshot and scheduling recovery`),this.scheduleLocalTargetRebuildRetry(e),!1}}reconcileLocalTargetInventory(){let e=this.getLocalTargetInventory();return e===null?(this.localTargetIndex.markUnavailable(),null):(this.localTargetIndex.reconcileDocumentTargets(new Set([...this.backlinkIndex.getIndexedDocNames(),...e.documentTargets])),this.localTargetIndex.reconcileFileTargets(e.fileTargets),this.localTargetIndex.reconcileFolderTargets(e.folderTargets),e)}syncLocalTargetBaseline(){let e=this.localTargetIndex.generation,t=e-this.lastSignaledLocalTargetGeneration;t>0&&sR(`local-target`,`baseline`,t),this.lastSignaledLocalTargetGeneration=e}scheduleLocalTargetRebuildRetry(e){if(this.closed||this.localTargetRebuildRetryTimer!==null)return;let t=Math.min(1e3*2**this.localTargetRebuildRetryAttempt,3e4);this.localTargetRebuildRetryAttempt++,this.localTargetRebuildRetryTimer=setTimeout(()=>{this.localTargetRebuildRetryTimer=null,this.runCommand(async()=>{await this.rebuildLocalTargets(`retry:${e}`)&&this.maybeSignalLocalTargets()}).catch(t=>{this.closed||oz.warn({err:t,reason:e},`[local-target] recovery enqueue failed`)})},t),this.localTargetRebuildRetryTimer.unref?.()}cancelLocalTargetRebuildRetry(){this.localTargetRebuildRetryTimer!==null&&(clearTimeout(this.localTargetRebuildRetryTimer),this.localTargetRebuildRetryTimer=null)}scheduleSave(e=!0){let t=this.saveTagsOnNextDebounce||e;this.cancelScheduledSave(),this.saveTagsOnNextDebounce=t,this.saveTimer=setTimeout(()=>{this.saveTimer=null;let e=this.saveTagsOnNextDebounce;this.saveTagsOnNextDebounce=!1,this.enqueueInternal(()=>this.saveScheduledCache(e,`debounced`)).catch(e=>{oz.warn({err:e},`Failed to enqueue debounced derived-index cache save`)})},2e3)}cancelScheduledSave(){let e=this.saveTimer===null?null:this.saveTagsOnNextDebounce;return this.saveTimer!==null&&clearTimeout(this.saveTimer),this.saveTimer=null,this.saveTagsOnNextDebounce=!1,e}saveScheduledCache(e,t){return e?this.saveBothLogOnly(t):this.saveBacklinksLogOnly(`${t}-backlinks`)}releaseBranchTransition(e){let t=this.branchTransition;!e||t!==e||(this.branchTransition=null,t.barrier.resolve())}async saveBothLogOnly(e,t){await this.saveBacklinksLogOnly(e,t),await this.saveTagsLogOnly(e)}async saveBacklinksLogOnly(e,t){try{await this.backlinkIndex.saveToDisk(t)}catch(n){oz.warn({err:n,reason:e,branch:t},`Failed to persist backlink cache`)}}async saveTagsLogOnly(e){try{await this.tagIndex.saveToDisk()}catch(t){oz.warn({err:t,reason:e},`Failed to persist tag snapshot`)}}async ingestGlobalSkillNodesLogOnly(e,t){try{await this.backlinkIndex.ingestGlobalSkillBundles(this.getGlobalSkillRoots(),e)}catch(n){oz.warn({err:n,branch:e,reason:t},`Global skill bundle ingest failed`)}}async runCommand(e){return this.assertOpen(),await this.startupAdmission.promise,this.assertOpen(),this.enqueueAfterBranchAdmission(e)}async runQuery(e){return this.assertOpen(),await this.startupAdmission.promise,await this.readyBarrier.promise,this.assertOpen(),this.enqueueAfterBranchAdmission(e)}runLocalTargetQuery(e){return this.runQuery(()=>{if(!this.localTargetIndex.isReady())throw new dz;return e()})}async enqueueAfterBranchAdmission(e){for(;;){let t=this.branchTransition;if(!t)return this.assertOpen(),this.enqueueInternal(()=>(this.assertOpen(),e()));await t.barrier.promise,this.assertOpen()}}enqueueInternal(e){let t=this.tail.then(e);return this.tail=t.then(()=>void 0,e=>{uz(e)?oz.debug({err:e},`Derived document index operation rejected after close`):oz.warn({err:e},`Derived document index operation failed; queue remains available`)}),t}assertOpen(){if(this.closed)throw new lz}};const mz={source:`local`,skipStoreHooks:!0,context:{origin:`file-watcher`,paired:!0}};function hz(e,t,n,r,i,a){eb(e,t,`file-watcher`,n&&r?{resolveEmbed:n,resolveSize:i,sourcePath:r}:void 0,void 0,a)}const gz=/^(<{7} |={7}$|>{7} |\|{7} )/m;function _z(e){return gz.test(e)}function vz(e){let t=e.replace(/\n+$/,``);if(!t)return[];let n=t.split(`
|
|
@@ -2035,4 +2035,4 @@ native-divergence-injected
|
|
|
2035
2035
|
`))e&&await t.raw(`update-ref`,`-d`,e)}),b.info({context:e.oldBranch},`[branch-switch] cleaned up detached context ${e.oldBranch}`))}catch(e){b.error({err:e},`[branch-switch] detached cleanup failed`)}D(!1),await N.flushDeferredStores(`discard-stale`),t=!0,Oe?.emitBranchSwitched(i)}finally{ve.abortBranchSwitch(r),t||(D(!1),await N.flushDeferredStores(`discard-stale`))}}if(e.headMoved&&e.newHead&&ye.current&&t>0){let t=p??`.`;try{let n=await Px(ye.current,t,e.oldHead,e.newHead,i);Tb(),b.info({oldHead:e.oldHead?.slice(0,8)??`null`,newHead:e.newHead.slice(0,8),sha:n.slice(0,8)},`[history] upstream-import from ${e.oldHead?.slice(0,8)??`null`}..${e.newHead.slice(0,8)} → ${n.slice(0,8)}`)}catch(e){b.error({err:e},`[shadow] upstream-import failed`)}}})}catch(e){b.error({err:e},`[server] HEAD watcher failed to start`),fn.push(`head-watcher`)}function l(e){for(let t of e)try{let e=uN(L(n,I(r,t)));if(e.startsWith(`..`))continue;let i=Kx(e),a=Se.documents.get(i);if(!a)continue;let o=qt(i);o===null?b.warn({docName:i,file:t},`[sync] content conflict: serializeDoc returned null; reconciledBase snapshot skipped`):w(i,o);let s=a.getMap(`lifecycle`);s.set(`status`,`conflict`),s.set(`reason`,`sync-merge-conflict`),b.info({docName:i,file:t},`[sync] marked loaded content conflict`)}catch(e){b.warn({err:e,file:t},`[sync] failed to mark loaded content conflict`)}}function d(e){for(let t of e)try{let e=uN(L(n,I(r,t)));if(e.startsWith(`..`))continue;let i=Se.documents.get(Kx(e));i&&Yt(i)}catch(e){b.warn({err:e,file:t},`[sync] failed to clear resolved content conflict`)}}let f=hI(r);b.debug({resetAmbientCredentials:f,originKind:pI(r).kind},`[sync] ambient credential-chain reset decision at boot`);let m=hc(h,{resetAmbient:f}),g=O();g.mode!==`off`&&b.info({mode:g.mode,source:g.source},`[sync] mode active at boot`);try{cn=new oFe({projectDir:r,contentDir:n,contentFilter:he,contentRoot:p,mcpTomlEditor:e.mcpTomlEditor,mode:g.mode,pullIntervalSeconds:e.pullIntervalSeconds,pushIntervalSeconds:e.pushIntervalSeconds,credentialConfig:m,cc1Broadcaster:Oe,detectGh:e.detectGh,detectGhAccounts:e.detectGhAccounts,tokenStore:e.tokenStore,checkPushPermissionFn:e.checkPushPermissionFn,setBatchInProgress:e=>{D(e),e||N.flushDeferredStores(`within-branch`).catch(e=>{b.error({err:e},`[persistence] deferred store drain failed after sync batch`)})},onStateChange:e=>{b.info({state:e},`[sync] state → ${e}`)},onContentConflictsDetected:l,onContentConflictsResolved:d,checkpointBeforeStrandedConversion:async({branch:e,ahead:t})=>{let n=ye.current;n&&await Ix(n,p??``,{action:`pull-only-stranded-conversion`,context:{ahead:t}},e)},checkpointBeforeOverlayRestore:async({branch:e,paths:t})=>{let n=ye.current;n&&await Ix(n,p??``,{action:`pull-only-overlay-restore`,context:{paths:t}},e)},onAutoDisable:async e=>{b.warn({reason:e},`[sync] auto-disabled — persisting to project-local config`);let t=await bs({cwd:r,scope:`project-local`,patch:{autoSync:{enabled:!1}}});t.ok||b.error({result:t,reason:e,humanError:Te(t.error),configPath:zs(`project-local`,r)},`[sync] failed to persist auto-disable — next restart WILL re-enable sync and re-trigger the same failure. Check permissions on the config path.`)}}),await cn.start()}catch(e){b.warn({err:e},`[server] SyncEngine failed to start — sync disabled`),cn=null}Ye(`files`),ve.announceReadyViews();let _=JL();_!==void 0&&YL(`readyMs`,_),ae()}return pn().then(()=>{$e=!0,He(),ft(),vt()},e=>{et=!0,tt.abort(),lt({status:`failed`,indexCount:0}),ve.close(),Ke(),Ue(e)}),{hocuspocus:Se,durabilityState:x,sessionManager:Ce,nativeApi:we,localApi:Ee,cc1Broadcaster:Oe,agentFocusBroadcaster:Ae,agentPresenceBroadcaster:je,maintenanceCoordinator:M,contentFilter:he,basenameIndex:fe,serverInstanceId:le,destroy:dn,ready:We,generatedIndexSweepReady:ct,degraded:fn,lockDir:ue,get syncEngine(){return cn},getLinkPreviewsEnabled:A,resolveEmbed:pe,acpRegistry:de,acpPermissions:j}}function u9(e){return e/1048576}function fFe(){let e=process.memoryUsage();return{schemaVersion:1,capturedAt:new Date().toISOString(),snapshot:{rssMb:u9(e.rss),heapTotalMb:u9(e.heapTotal),heapUsedMb:u9(e.heapUsed),externalMb:u9(e.external),arrayBuffersMb:u9(e.arrayBuffers)}}}let d9=null,f9=null,p9=null;const m9=1e6;let h9=null,g9=null;Ds(()=>{d9=null,f9=null,p9=null,h9?.disable(),h9=null,g9=null});function pFe(){if(d9)return;let e=Qs().createObservableGauge(`ok.server.memory.usage_megabytes`,{description:`Server process memory by section. Bounded labels: section ∈ {heap_used, heap_total, rss, external, array_buffers}.`,unit:`MB`});e.addCallback(e=>{let{snapshot:t}=fFe();e.observe(t.heapUsedMb,{section:`heap_used`}),e.observe(t.heapTotalMb,{section:`heap_total`}),e.observe(t.rssMb,{section:`rss`}),e.observe(t.externalMb,{section:`external`}),e.observe(t.arrayBuffersMb,{section:`array_buffers`})}),d9=e}function mFe(){if(!f9){let e=Qs().createObservableGauge(`ok.server.event_loop.delay_ms`,{description:`Event-loop delay percentiles over the last export window. Bounded labels: stat ∈ {p50, p99}.`,unit:`ms`});e.addCallback(e=>{if(!h9){h9=bd({resolution:20}),h9.enable();return}e.observe(h9.percentile(50)/m9,{stat:`p50`}),e.observe(h9.percentile(99)/m9,{stat:`p99`}),h9.reset()}),f9=e}if(!p9){let e=Qs().createObservableGauge(`ok.server.cpu.utilization`,{description:`Process CPU time as a fraction of wall time since the previous export. Bounded labels: mode ∈ {user, system}.`,unit:`1`});e.addCallback(e=>{let t=process.cpuUsage(),n=process.hrtime.bigint(),r=g9;if(g9={cpu:t,hrtimeNs:n},!r)return;let i=Number(n-r.hrtimeNs)/1e3;i<=0||(e.observe((t.user-r.cpu.user)/i,{mode:`user`}),e.observe((t.system-r.cpu.system)/i,{mode:`system`}))}),p9=e}}const _9=P(`skill-migrate`);function v9(e){return[{host:`agents`,root:wi},...Object.entries(e).filter(e=>e[1]!==null).map(([e,t])=>({host:e,root:t}))].sort((e,t)=>{let n=ED.indexOf(e.host),r=ED.indexOf(t.host);return(n===-1?ED.length:n)-(r===-1?ED.length:r)||e.host.localeCompare(t.host)})}const hFe=v9(zt),gFe=v9(ln);function _Fe(e,t){return B(R(e,Mr(t)))}function vFe(e,t){Bs(F(t),{recursive:!0});try{Ns(e,t)}catch(n){if(!(n instanceof Error)||n.code!==`EXDEV`)throw n;Us(e,t,{recursive:!0}),Ws(e,{recursive:!0,force:!0})}}function yFe(e,t,n){let r=nL(e,t,n);switch(r.kind){case`absent`:return{kind:`absent`};case`other`:return{kind:`occupied`,by:`different`};case`symlink`:return r.resolution===`target`?{kind:`store-link`}:{kind:`occupied`,by:`foreign-link`};case`dir`:return r.identity===`different`?{kind:`occupied`,by:`different`}:{kind:`same-copy`}}}function y9(e,t){let n;try{n=H(R(e,`.ok`,`skills`))}catch{n=R(e,`.ok`,`skills`)}return new Set(t.filter(t=>{try{return!H(R(e,t.dir)).startsWith(n+z)}catch{return!0}}).map(e=>e.name))}async function b9(e){let{projectDir:t,skillsRoot:n}=e,r=e.inPlaceNames??new Set,i=e.hostRoots??hFe,a={migrated:[],skipped:[]};if(!B(n))return a;let o;try{o=Fu(n)}catch{return a}let s=L(t,n).split(z).join(`/`),c=new Set;for(let[e,n]of Object.entries(JY(t)))for(let t of n)t.path.split(`/`).slice(0,-1).join(`/`)===s&&c.add(e);for(let e of o)try{if(!So.test(e)||pk.has(e))continue;if(r.has(e)){a.skipped.push({name:e,reason:`placement-of-in-place`});continue}if(c.has(e)){a.skipped.push({name:e,reason:`recorded-placement`});continue}let o=R(n,e);if(!B(I(o,`SKILL.md`)))continue;let s=hD(o)?.contentHash;if(s===void 0)continue;let l=H(o),u=i.map(({host:n,root:r})=>{let i=R(t,r);return{host:n,root:r,path:I(i,e),escapes:uL(t,i),state:yFe(I(i,e),l,s)}}).filter(e=>!e.escapes),d=u.find(e=>e.state.kind===`store-link`||e.state.kind===`same-copy`)??u.find(e=>_Fe(t,e.root));if(!d){a.skipped.push({name:e,reason:`no-usable-target`});continue}if(d.state.kind===`occupied`){a.skipped.push({name:e,reason:`target-occupied:${d.root} (${d.state.by})`});continue}d.state.kind===`same-copy`?Ws(o,{recursive:!0,force:!0}):(d.state.kind===`store-link`&&Ws(d.path,{recursive:!0,force:!0}),vFe(o,d.path));for(let e of u)e===d||e.state.kind!==`store-link`||(Ws(e.path,{recursive:!0,force:!0}),Us(d.path,e.path,{recursive:!0}));await WN(t,e),a.migrated.push({name:e,to:`${d.root}/${e}`}),_9.info({skill:e,to:`${d.root}/${e}`},`migrated store skill in place`)}catch(t){a.skipped.push({name:e,reason:`error`}),_9.warn({err:t,skill:e},`store-skill migration skipped one entry after error`)}return a}const x9=P(`skill-reconcile`),bFe=pk;function S9(){let e=[];for(let t of nr){let n=zt[t];n!==null&&e.push({rel:n,editor:t})}return e.push({rel:wi,editor:null}),e}function xFe(e,t){let n=L(e,R(t));return fu(n)?R(t):n}function C9(e){let{frontmatter:t,body:n}=ri(e),r={};if(t!==``)try{let e=(0,QO.parse)(qa(t));e&&typeof e==`object`&&!Array.isArray(e)&&(r=e)}catch{}return{fm:r,body:n}}function SFe(e,t){let n=C9(e),r=C9(t);if(n.body!==r.body)return!1;for(let e of Object.keys(n.fm))if(e in r.fm&&JSON.stringify(n.fm[e])!==JSON.stringify(r.fm[e]))return!1;return!0}function w9(e,t){let n=T9(e),r=T9(t);if(n.length!==r.length)return!1;let i=0;for(let a=0;a<n.length;a+=1){if(n[a]!==r[a])return!1;let o=n[a],s=I(e,o),c=I(t,o);if(i+=Bu(s).size+Bu(c).size,i>1048576)return!1;let l=V(s),u=V(c);if(!l.equals(u)&&(o!==`SKILL.md`||!SFe(l.toString(`utf8`),u.toString(`utf8`))))return!1}return!0}function T9(e,t=``){let n=[];for(let r of Fu(e,{withFileTypes:!0})){let i=t?`${t}/${r.name}`:r.name;r.isDirectory()?n.push(...T9(I(e,r.name),i)):r.isFile()&&n.push(i)}return n.sort()}function E9(e,t,n){Ws(t,{recursive:!0,force:!0}),Bs(e,{recursive:!0}),Is(xFe(e,n),t,`dir`)}function D9(e,t){try{let n=Iu(e);return R(fu(n)?n:R(F(e),n))===R(t)}catch{return!1}}function CFe(e,t){try{let n=Iu(e),r=fu(n)?R(n):R(F(e),n);if(!B(r))return!1;let i=L(R(t),r);return i!==``&&(i.startsWith(`..`)||fu(i))}catch(t){return x9.warn({linkPath:e,err:t},`isForeignSymlink: could not resolve symlink; treating as reconcile-managed`),!1}}const wFe=[...nr,`agents`];function TFe(e){for(let t of wFe){let n=`-${t}`;if(e.length>n.length&&e.endsWith(n))return e.slice(0,-n.length)}return null}function EFe(e){let{projectDir:t,skillsRoot:n}=e;if(!B(n))return;let r;try{r=Fu(n)}catch{return}let i=S9();for(let e of r){let r=TFe(e);if(r===null)continue;let a=R(n,e),o=R(n,r);if(B(o))try{let n=Ou(a);if(n.isSymbolicLink()||!n.isDirectory()||!B(I(a,`SKILL.md`))||!B(I(o,`SKILL.md`))||!w9(o,a))continue;for(let{rel:n}of i){let r=R(t,n);if(uL(t,r))continue;let i=I(r,e);D9(i,a)&&E9(r,i,o)}Ws(a,{recursive:!0,force:!0}),x9.info({base:r,suffixed:e},`collapsed accreted suffix-duplicate skill into its base`)}catch(t){x9.warn({err:t,base:r,suffixed:e},`suffix-dupe collapse skipped one entry after error`)}}}async function DFe(e){let{projectDir:t,skillsRoot:n}=e,r={healed:[],replaced:[],orphansRemoved:[],skipped:[]},i=new Map,a=(e,t)=>{if(t===null)return;let n=i.get(e)??new Set;n.add(t),i.set(e,n)};for(let{rel:e,editor:i}of S9()){let o=R(t,e);if(!B(o)||uL(t,o))continue;let s;try{s=Fu(o)}catch(e){x9.warn({hostRoot:o,err:e},`reconcile: skipped unreadable host skills root`);continue}for(let e of s){if(bFe.has(e))continue;let t=I(o,e),s=R(n,e),c=B(s);try{let l=Ou(t);if(l.isSymbolicLink()){if(D9(t,s)&&c)continue;if(CFe(t,n)){r.skipped.push({name:e,editor:i});continue}c?(E9(o,t,s),r.healed.push({name:e,editor:i})):(Ws(t,{recursive:!0,force:!0}),r.orphansRemoved.push({name:e,editor:i}));continue}if(!l.isDirectory())continue;if(!So.test(e)){x9.warn({skill:e,editor:i},`reconcile: skipping host-dir entry with a non-skill name`);continue}if(c&&w9(t,s)){E9(o,t,s),r.replaced.push({name:e,editor:i}),a(e,i);continue}r.skipped.push({name:e,editor:i})}catch(t){x9.warn({err:t,skill:e,editor:i},`reconcile skipped one skill entry after error`)}}}if(i.size>0){let e=VN(t);for(let[r,a]of i){let i=R(n,r);if(!B(i))continue;let o=e.skills[r],s=Array.from(new Set([...o?.hosts??[],...a]));try{await UN(t,r,{hosts:s,scope:o?.scope??`project`,scripts:o?.scripts??aL(i,r).hasScripts,installedAt:o?.installedAt??new Date().toISOString()})}catch(e){x9.warn({err:e,skill:r},`reconcile marker update failed (non-fatal)`)}}}try{EFe({projectDir:t,skillsRoot:n})}catch(e){x9.warn({err:e},`suffix-dupe collapse pass failed (non-fatal)`)}return r}let O9=null,k9=!1;function A9(e=process.env){return e.OK_BRIDGE_TOLERANCE_TELEMETRY===`1`}function j9(e){if(!A9())return;let t=cA(e);O9=new ac({currentPath:R(t,`tolerance-telemetry.jsonl`),previousPath:R(t,`tolerance-telemetry.prev.jsonl`),maxBytes:8388608}),un(e=>{let t={event:`bridge-tolerance-fire`,timestamp:e.timestamp,class:e.className,document:e.documentName??null,codeUnitPosition:e.codeUnitPosition,severity:e.severity};O9?.append(`${JSON.stringify(t)}\n`).catch(e=>{k9||(k9=!0,P(`tolerance-telemetry`).warn({err:e instanceof Error?e:Error(String(e))},`append failed; further failures are silent`))})})}async function M9(){un(null),await O9?.drain(),O9=null,k9=!1}gs();const OFe=[`server.lock`,`ui.lock`,`state.json`,`principal.json`,`sync-state.json`,`conflicts.json`,`last-spawn-error.log`],kFe=[`cache`,`tmp`];function AFe(e){let t=R(e,ve);if(!(()=>{if(!B(t))return!0;try{return Fu(t).length===0}catch{return!0}})())return[];let n=[];for(let t of OFe)B(R(e,t))&&n.push(t);for(let t of kFe){let r=R(e,t);try{B(r)&&Bu(r).isDirectory()&&n.push(`${t}/`)}catch{}}return n}function jFe(e){let t=Id(e);switch(t.kind){case`directory`:return{kind:`main`,gitdir:t.path};case`linked`:return{kind:`linked`,gitdir:t.path};case`malformed-pointer`:return{kind:`linked`,gitdir:null};case`inaccessible`:case`absent`:return{kind:`main`,gitdir:null}}}const N9=Number(process.env.OK_DESTROY_STEP_TIMEOUT_MS)||5e3;async function MFe(e){Mge();let t=e.projectDir??e.contentDir,n=jbe({projectDir:t});if(n){let e=n.telemetry.attributeDenylist,t=[];for(let n of e){t.push(n);for(let e=1;e<=5;e++)t.push(`${`*.`.repeat(e)}${n}`)}tc.configure({pinoConfig:{fileSink:n.logs,redactPaths:t}})}Zs({localSink:n?.telemetry}),j9(t),pFe(),mFe();let{kind:r,gitdir:i}=jFe(e.projectDir??e.contentDir),a={"ok.worktree.kind":r};i!==null&&(a[`ok.worktree.gitdir`]=Hs(i));let o=kbe(t),s=process.env.OK_STARTUP_TRACEPARENT,c=()=>Os(`ok.boot`,{attributes:a},async()=>NFe(e)),l=()=>{if(s)try{let e=ms.extract(_s.active(),{traceparent:s});return _s.with(e,c)}catch(e){P(`boot`).warn({err:e},`ok.boot trace-join failed — starting unparented boot`)}return c()},u;try{u=await l()}catch(e){throw o.uninstall(),e}let d=u.destroy;return u.destroy=async()=>{try{await d()}finally{o.uninstall()}},u}async function NFe(e){let t=e.skipAutoInit??!1,n=e.log??P(`boot`),r=e.serverRuntime??{...is(e.config),allowExternal:!1},i=e.bind!==void 0&&e.bind.length>0?e.bind:[e.host??`127.0.0.1`];if((Bo(r)||!Jr(i))&&!r.allowExternal)throw new XB(`refusing to start: the server would bind a non-loopback address (${(Jr(i)?r.bind:i).join(`, `)}), which exposes this server beyond this machine. Consent with OK_ALLOW_EXTERNAL=1, or server.allowExternal: true in .ok/local/config.yml.`);let a=$B({serverRuntime:r});r.allowExternal&&!r.loopbackOnly&&r.externalUrl===void 0&&(a.bindLiterals.length===0?n.warn({bind:r.bind},`[ingress] server.allowExternal is set on a wildcard bind (0.0.0.0/::) with no server.externalUrl — external requests will be REFUSED (403 host-not-allowed) because no external Host name is admitted. Set server.externalUrl to the public origin clients dial (e.g. behind a reverse proxy or platform edge), or bind a specific address instead of a wildcard.`):n.info({bind:r.bind},`[ingress] server.allowExternal is set with no server.externalUrl — the bind-address literals are admitted as Host names (direct IP access). Set server.externalUrl to admit a hostname.`));let o=process.env.OK_LOCK_KIND===`mcp-spawned`||process.env.OK_LOCK_KIND===`interactive`?process.env.OK_LOCK_KIND:void 0,s=e.lockKind??o??`interactive`,{createServer:c}=await import(`node:http`),{markServerLockDraining:l,releaseServerLock:u,updateServerLockPort:d}=await import(`./server-lock-CJBewXA-.mjs`),f=!1;if(!t&&e.autoInitFn)try{f=!!await e.autoInitFn()}catch(e){n.warn({err:e},`autoInitFn failed`)}let p=e.projectDir??e.contentDir,m=R(p,`.ok`);if(!B(R(m,`config.yml`)))throw new t8(B(m)?`config`:`okdir`,p);let h=R(m,`.gitignore`);B(h)||P(`boot`).warn({path:h},"Note: .ok/.gitignore is missing — per-machine state files in .ok/ may show up as untracked changes. Run `ok init` to add the recommended ignore entries.");let g=e.gitPreflight??vw;try{e.gitEnabled!==!1&&g()}catch(e){if(e instanceof hw||e instanceof gw){let t=e instanceof gw?e.detected:``,r=e instanceof gw?`too_old`:`not_available`;TK(e),n.warn({event:`git_preflight_fail`,platform:e.platform,reason:r,detectedVersion:t},r===`not_available`?`git binary not found`:`git binary too old`),process.stderr.write(`${e.message}\n`)}throw await Xs(),await Promise.race([M9(),new Promise(e=>setTimeout(e,N9))]),e}let _=AFe(m);_.length>0&&P(`boot`).warn({files:_},`Found legacy runtime files at .ok/${_.join(`, `)}. Delete .ok/ and re-init — these files moved to .ok/${ve}/.`);let v=l9({contentDir:e.contentDir,projectDir:e.projectDir,ingressPolicy:a,contentRoot:e.contentRoot,port:e.port,host:e.host,quiet:e.quiet??!1,debounce:e.debounce,maxDebounce:e.maxDebounce,gitEnabled:e.gitEnabled,mcpTomlEditor:e.mcpTomlEditor,commitDebounceMs:e.commitDebounceMs,wipRef:e.wipRef,enableTestRoutes:e.enableTestRoutes,shadowRepo:e.shadowRepo,destroyTimeoutMs:e.destroyTimeoutMs,localOpCliArgs:e.localOpCliArgs,authStreamHeartbeatMs:e.authStreamHeartbeatMs,onAgentWrite:e.onAgentWrite,lockKind:s,capabilities:e.reactShellDistDir?[`http`,`ws`,`ui`]:[`http`,`ws`],skipStateManifestCheck:e.skipStateManifestCheck,detectGh:e.detectGh,detectGhAccounts:e.detectGhAccounts,tokenStore:e.tokenStore,embeddingsKeyStore:e.embeddingsKeyStore,singleDocRelPath:e.singleDocRelPath,ephemeral:e.ephemeral}),{hocuspocus:y,destroy:b,ready:x,degraded:S,lockDir:C,sessionManager:w,agentFocusBroadcaster:T,agentPresenceBroadcaster:E,maintenanceCoordinator:D}=v,ee=(()=>{let t=e.host??`localhost`;return t===`0.0.0.0`||t===`::`?`localhost`:t.includes(`:`)&&!t.startsWith(`[`)?`[${t}]`:t})(),O=e.port??0,ne=()=>`http://${ee}:${O}`,k=e.ephemeral?void 0:J6({contentDir:e.contentDir,projectDir:e.projectDir??e.contentDir,config:e.config,getServerUrl:()=>ne(),localApi:v.localApi,log:n}),re=c();re.headersTimeout=3e4,re.requestTimeout=6e4;let A=e.serveContentAssets===!1?void 0:vZ({contentFilter:v.contentFilter,contentSirv:jZ(e.contentDir,{dev:!0,dotfiles:!1}),inlineExtensions:ye,assetExtensions:te,blocklistExtensions:Me,ingressPolicy:a}),ie=e.reactShellDistDir?jZ(e.reactShellDistDir,{single:!0,gzip:!0,etag:!0,dev:!0}):void 0,ae=e.ephemeral?null:new hE({contentDir:e.contentDir,localDir:C,globalDir:R(Ku(),`.ok`),registry:v.acpRegistry,permissions:v.acpPermissions,sessionManager:w,agentPresenceBroadcaster:E,resolveEmbed:v.resolveEmbed,isExcludedPath:e=>v.contentFilter.isExcluded(e),isIgnoredPath:e=>v.contentFilter.isPathIgnored(e),getLoadedDocText:e=>y.documents.get(e)?.getText(`source`).toString()??null,getServerUrl:()=>ne(),getMcpStdioCommand:()=>mE(e.localOpCliArgs,O,{log:n}),probeHarnessManagedMcpEntry:e.probeHarnessManagedMcpEntry,probePiAcpBridge:e.probePiAcpBridge,ensurePiAcpBridge:e.ensurePiAcpBridge,log:n});ae!==null&&await ae.init();let oe=`pending`;x.then(()=>{oe=`ready`},()=>{oe=`failed`});let se=$6({httpServer:re,hocuspocus:y,nativeApi:v.nativeApi,mcpHttpHandler:k,ingressPolicy:a,health:{readiness:()=>oe,degraded:()=>S},log:n,sessionManager:w,agentFocusBroadcaster:T,agentPresenceBroadcaster:E,maintenanceCoordinator:D,keepaliveGraceMs:e.keepaliveGraceMs,contentAssetMiddleware:A,reactShellMiddleware:ie,ephemeral:e.ephemeral,acpThreadManager:ae}),ce=async()=>{throw Error(`bootServer: destroy() invoked before initialization — boot did not complete`)},le=null;e.idleShutdownMs!==null&&(le=IZ({httpServer:re,thresholdMs:e.idleShutdownMs??18e5,log:n,onShutdown:(e.idleShutdownHandler??(e=>async()=>{await e()}))(async()=>{await ce()})})),await P9({hocuspocus:y,projectDir:e.projectDir??e.contentDir,log:n});let ue=[...new Set(i)],de=ue[0],j=async()=>{await b().catch(e=>{n.warn({err:e},`destroyHocuspocus failed during listen-error cleanup`)}),u(C)},fe=(e,t,n)=>new Promise((r,i)=>{let a=e=>i(e);e.once(`error`,a),e.listen(t,n,()=>{e.removeListener(`error`,a),r()})});try{await fe(re,e.port??0,de??`127.0.0.1`)}catch(e){throw await j(),e}let pe=re.address(),me=typeof pe==`object`&&pe?pe.port:e.port??0,he=[];for(let e of ue.slice(1)){let t=c();t.headersTimeout=re.headersTimeout,t.requestTimeout=re.requestTimeout;for(let e of re.listeners(`request`))t.on(`request`,e);for(let e of re.listeners(`upgrade`))t.on(`upgrade`,e);try{await fe(t,me,e)}catch(t){n.error({err:t,failedAddress:e,port:me,alreadyBound:he.length+1},`[boot] secondary address bind failed — unwinding all listeners`);for(let e of[...he,re])e.closeAllConnections?.(),await new Promise(t=>{e.close(e=>{e&&n.warn({err:e},`[boot] listener close failed during unwind`),t()})});throw await j(),t}he.push(t)}let ge=JL();ge!==void 0&&YL(`httpListenMs`,ge);let _e=re.address(),M=typeof _e==`object`&&_e?_e.port:e.port??0;O=M,d(C,M,ne());let N=!1,be=async(e,t)=>{let n;try{await Promise.race([t(),new Promise((t,r)=>{n=setTimeout(()=>{r(Error(`${e} timed out after ${N9}ms`))},N9),n.unref?.()})])}finally{n!==void 0&&clearTimeout(n)}};ce=async()=>{if(N)return;N=!0,oe=`draining`;let e=[],t=async(t,r)=>{try{await be(t,r)}catch(r){e.push(r),n.warn({err:r,step:t},`bootServer destroy step failed`)}};try{l(C)}catch(e){n.warn({err:e,step:`markServerLockDraining`},`bootServer destroy step failed`)}try{le?.detach()}catch(t){e.push(t),n.warn({err:t,step:`idleHandle.detach`},`bootServer destroy step failed`)}if(ae!==null&&await t(`acpThreads.destroy`,()=>ae.destroy()),await t(`secondaryListeners.close`,async()=>{for(let e of he)e.closeAllConnections?.(),await new Promise(t=>{e.close(e=>{e&&n.warn({err:e},`[boot] secondary listener close failed during teardown`),t()})})}),await t(`mount.shutdown`,()=>se.shutdown()),k!==void 0&&await t(`mcpHttpHandler.close`,()=>k.close()),await t(`mount.wss.close`,()=>new Promise((e,t)=>{se.wss.close(n=>n?t(n):e())})),await t(`httpServer.closeAllConnections`,async()=>{re.closeAllConnections?.()}),await t(`httpServer.close`,()=>new Promise((e,t)=>{re.close(n=>n&&n.code!==`ERR_SERVER_NOT_RUNNING`?t(n):e())})),await t(`destroyHocuspocus`,()=>b()),await t(`shutdownTelemetry`,()=>Xs()),await t(`teardownToleranceTelemetry`,()=>M9()),await t(`flushLogFileSinks`,()=>tc.flushAllFileSinks()),e.length>0)throw AggregateError(e,`bootServer destroy completed with errors`)};try{let t=await b9({projectDir:p,skillsRoot:R(e.contentDir,`.ok`,`skills`),inPlaceNames:y9(e.contentDir,FL(e.contentDir))});t.migrated.length+t.skipped.length>0&&n.info?.({event:`store-skills-migrated-in-place`,migrated:t.migrated,skipped:t.skipped},`Migrated ${t.migrated.length} store skill(s) in place (${t.skipped.length} skipped).`)}catch(e){n.warn?.({err:e,event:`store-skill-migration-failed`},`Store-skill in-place migration failed (non-fatal).`)}try{let e=Ku(),t=await b9({projectDir:e,skillsRoot:R(e,`.ok`,`skills`),hostRoots:gFe,inPlaceNames:y9(e,IL(e))});t.migrated.length+t.skipped.length>0&&n.info?.({event:`global-store-skills-migrated-in-place`,migrated:t.migrated,skipped:t.skipped},`Migrated ${t.migrated.length} global store skill(s) in place (${t.skipped.length} skipped).`)}catch(e){n.warn?.({err:e,event:`global-store-skill-migration-failed`},`Global store-skill in-place migration failed (non-fatal).`)}try{let t=await DFe({projectDir:p,skillsRoot:R(e.contentDir,`.ok`,`skills`)}),r=t.healed.length+t.replaced.length+t.orphansRemoved.length;r>0&&n.info?.({event:`installed-skills-reconciled`,healed:t.healed.length,replaced:t.replaced.length,orphansRemoved:t.orphansRemoved.length},`Reconciled ${r} editor skill entr${r===1?`y`:`ies`} to the symlink model.`)}catch(e){n.warn?.({event:`installed-skills-reconcile-failed`,err:e},`Installed-skills reconcile failed (non-fatal).`)}return{httpServer:re,destroy:ce,lockDir:C,contentDir:e.contentDir,port:M,ready:x,generatedIndexSweepReady:v.generatedIndexSweepReady,degraded:S,didAutoInit:f,serverInstance:v,runtime:zje(v,{contentDir:e.contentDir,projectDir:p}),acpThreadManager:ae}}async function P9(e){let{hocuspocus:t,projectDir:n,log:r}=e,i,a;try{i=new NZ(n),a=i.list()}catch(e){r.warn({err:e,projectDir:n},`[boot] lifecycle restore: failed to read conflicts.json — skipping`);return}if(a.length===0)return;let o=e=>e.variant===`working-tree`,s=null;try{let e=Ld(n),t=e?I(e,`MERGE_HEAD`):null;if(!t||!B(t)){let e=a.filter(e=>!o(e));for(let t of e)i.removeConflict(t.file);if(a=a.filter(o),e.length>0&&console.warn(JSON.stringify({event:`lifecycle-restore-cleared-stale-conflicts`,reason:`no-merge-head`,count:e.length})),a.length===0)return}else{let e=dc({baseDir:n,timeout:{block:5e3}});s=new Set(await vb(e,[`diff`,`--name-only`,`--diff-filter=U`]))}}catch(e){r.warn({err:e,projectDir:n},`[boot] lifecycle restore: git unmerged probe failed — restoring all entries`)}if(s!==null){let e=0;for(let t of a)!o(t)&&!s.has(t.file)&&(i.removeConflict(t.file),e++);if(e>0&&console.warn(JSON.stringify({event:`lifecycle-restore-pruned-resolved-entries`,pruned:e,remaining:a.length-e})),a=a.filter(e=>o(e)||s?.has(e.file)),a.length===0)return}for(let e of a){let n=Kx(e.file),i=null,a=!1;try{i=await t.openDirectConnection(n);let e=i.document;if(!e)continue;let r=e.getMap(`lifecycle`);r.set(`status`,`conflict`),r.set(`reason`,`conflict-markers`),a=!0,console.warn(JSON.stringify({event:`lifecycle-restored-from-conflicts-json`,"doc.name":n}))}catch(e){r.warn({err:e,docName:n},`[boot] lifecycle restore: failed to set lifecycle for doc — skipping`)}finally{if(i)try{await i.disconnect()}catch(e){r.warn({err:e,docName:n,restored:a},`[boot] lifecycle restore: disconnect failed after lifecycle write`)}}}}const PFe=Fe;function FFe(e={}){let t=e.home??Ku(),n=e.platformName??process.platform,r=e.env??process.env;return n===`darwin`?B(I(t,`Library`,`Application Support`,`Claude`)):n===`win32`?B(I(r.APPDATA??I(t,`AppData`,`Roaming`),`Claude`)):!1}var F9=t(ic(),1);const I9=I(Ku(),`.ok`,`logs`),IFe=[`authorization`,`password`,`token`,`apiKey`,`secret`,`*.authorization`,`*.password`,`*.token`,`*.apiKey`,`*.secret`];function LFe(){let e=process.env.OK_LOG_LEVEL??process.env.LOG_LEVEL;if(e){let t=[`fatal`,`error`,`warn`,`info`,`debug`],n=e.toLowerCase();if(t.includes(n))return n}return process.env.NODE_ENV===`test`?`silent`:`info`}function RFe(e){ku(e,{recursive:!0})}function L9(){return new Date().toISOString().slice(0,10)}function zFe(e){try{if(Bu(e).size<5242880)return}catch{return}for(let t=2;t>=1;t--){let n=t===1?e:`${e}.${t-1}`,r=`${e}.${t}`;try{Lu(n,r)}catch{}}try{Vu(`${e}.3`)}catch{}}function BFe(e){try{let t=Date.now(),n=10080*60*1e3,r=Fu(e).filter(e=>e.endsWith(`.log`)||/\.log\.\d+$/.test(e)).map(t=>{try{let n=Bu(I(e,t));return{name:t,mtime:n.mtimeMs,size:n.size}}catch{return null}}).filter(Boolean);for(let i of r)if(t-i.mtime>n)try{Vu(I(e,i.name))}catch{}let i=r.filter(e=>t-e.mtime<=n).sort((e,t)=>e.mtime-t.mtime),a=i.reduce((e,t)=>e+t.size,0);for(let t of i){if(a<=47185920)break;try{Vu(I(e,t.name)),a-=t.size}catch{}}}catch{}}function VFe(e){RFe(I9);let t=L9(),n=e.filePath??I(I9,`${e.name}.${t}.log`);zFe(n),(e._setTimeout??setTimeout)(()=>BFe(I9),5e3).unref();let r=F9.default.destination({dest:n,append:!0,sync:!0});return(0,F9.default)({level:LFe(),name:e.name,redact:{paths:IFe,censor:`[REDACTED]`},base:{pid:process.pid,hostname:void 0,runtime:`cli`,project:e.project??`<no-project>`},timestamp:F9.default.stdTimeFunctions.isoTime,...e.additionalOptions},r)}function HFe(e,t=250){return new Promise(n=>{if(!e){n();return}let r=e[F9.default.symbols.streamSym],i=!1,a=()=>{i||(i=!0,n())};if(!r||typeof r.flushSync!=`function`){a();return}let o=()=>{try{r.flushSync?.()}catch{}a()},s=setTimeout(a,t);typeof s.unref==`function`&&s.unref(),typeof r.fd==`number`&&r.fd>=0?(clearTimeout(s),o()):typeof r.once==`function`?r.once(`ready`,()=>{clearTimeout(s),o()}):(clearTimeout(s),o())})}function UFe(e){return I(I9,`${e}.${L9()}.log`)}function WFe(){return I9}function GFe(e){let t=R(e),n=0;for(;n<30;){let e=!1;try{e=B(R(t,`.git`))}catch{e=!1}if(e)return{gitRoot:t,distance:n};let r=F(t);if(r===t)return null;t=r,n+=1}return null}const R9=Td(au),z9=P(`project-git`);var B9=class extends Error{stderr;constructor(e,t=``,n){super(e,n),this.name=`ProjectGitInitError`,this.stderr=t}};async function KFe(e,t){try{return await R9(e,[`var`,`GIT_COMMITTER_IDENT`],fw({cwd:t,encoding:`utf-8`})),!0}catch{return!1}}async function qFe(e,t){try{let{stdout:n}=await R9(e,[`for-each-ref`,`--count=1`,`refs/`],fw({cwd:t,encoding:`utf-8`}));return n.trim().length>0}catch(e){return z9.warn({path:t,stderr:V9(e)},`could not list refs — assuming history exists and skipping the initial commit`),!0}}function JFe(e){let t=R(e,`packed-refs`);if(B(t))try{if(V(t,`utf-8`).split(`
|
|
2036
2036
|
`).some(e=>e.trim()!==``&&!e.startsWith(`#`)))return!0}catch{return!0}try{return Fu(R(e,`refs/heads`)).length>0}catch{return!1}}function V9(e){let t=typeof e==`object`&&e?e:null,n=t?.stderr;return n==null?String(t?.message??e):Buffer.isBuffer(n)?n.toString(`utf-8`):String(n)}async function H9(e,t){if(await qFe(e,t))return;let n=[`commit`,`--allow-empty`,`--no-verify`,`--no-gpg-sign`,`-m`,`Initial commit`],r=await KFe(e,t),i=r?n:[`-c`,`user.name=Open Knowledge`,`-c`,`user.email=noreply@openknowledge.local`,...n];try{await R9(e,i,fw({cwd:t,encoding:`utf-8`})),r||z9.info({path:t},`created initial commit with fallback identity (git identity unset)`)}catch(e){z9.warn({path:t,stderr:V9(e)},`could not create initial commit`)}}async function YFe(e,t){try{let{stdout:n}=await R9(e,[`rev-parse`,`--is-inside-work-tree`],fw({cwd:t,encoding:`utf-8`}));return n.trim()===`true`}catch{return!1}}async function XFe(e){let t=R(e);GW(t);let n=R(t,`.git`),r=R(n,`HEAD`),i=!1,a=!1;if(B(n)){if(!Bu(n).isDirectory())return{didInit:!1};if(B(r)){if(JFe(n))return{didInit:!1};a=!0}else z9.info({},`detected partial .git/ — running git init to repair`),i=!0}let o;try{o=vw()}catch(e){throw e instanceof hw||e instanceof gw?(TK(e),z9.warn({event:`git_preflight_fail`,platform:e.platform,reason:e instanceof gw?`too_old`:`not_available`,detectedVersion:e instanceof gw?e.detected:``},e instanceof gw?`git binary too old`:`git binary not found`)):z9.warn({event:`git_preflight_unexpected_error`,err:e},`unexpected error during git preflight`),e}let s=o.resolvedPath;if(a)return await H9(s,t),{didInit:!1};if(!i&&await YFe(s,t))return{didInit:!1};let c=``;try{c=(await R9(s,[`init`,`--initial-branch=main`,t],fw({encoding:`utf-8`}))).stderr??``}catch(e){let n=typeof e==`object`&&e&&`stderr`in e?String(e.stderr??``):``;throw new B9(`git init failed at ${t}: ${e instanceof Error?e.message:String(e)}`,n,{cause:e})}if(!B(r))throw new B9(`git init reported success but ${n}/HEAD is missing (partial init detected)`,c);return await H9(s,t),i?(z9.info({path:t},`backfilled missing .git/HEAD`),{didInit:!0,repaired:!0}):(z9.info({path:t,branch:`main`},`initialized .git/`),{didInit:!0})}const U9=P(`project-skill-git`),W9=/^[0-9a-f]{40}$/,ZFe=ds.map(e=>e.replace(/\/$/,``));async function QFe(e){let t=Ld(e);if(t===null)return{kind:`skipped`,reason:`no-git`};if(nIe(t))return{kind:`skipped`,reason:`operation-in-progress`};let n=fc(e,{credentialConfig:[]});if((await G9(n)).length===0)return{kind:`nothing-tracked`};try{return await uc(async()=>{let t=await $Fe(n);if(t===null)return{kind:`skipped`,reason:`detached-head`};let r=await eIe(n);if(r===null)return{kind:`skipped`,reason:`unborn-head`};let i=await G9(n);if(i.length===0)return{kind:`nothing-tracked`};let a=fc(e,{gitIndexFile:I(Yu(),`ok-untrack-idx-${process.pid}-${Date.now()}.idx`),credentialConfig:[]});await a.git.raw([`read-tree`,r]),await a.git.raw([`rm`,`--cached`,`-r`,`--ignore-unmatch`,`--`,...i]);let o=(await a.git.raw([`write-tree`])).trim(),s=await tIe(n,r);if(s!==null&&s===o)return{kind:`nothing-tracked`};let c=await BB(e),l=c?.name??`OpenKnowledge`,u=c?.email??`sync@open-knowledge.local`;_c(a,{GIT_AUTHOR_NAME:l,GIT_AUTHOR_EMAIL:u,GIT_COMMITTER_NAME:l,GIT_COMMITTER_EMAIL:u});let d=`Stop tracking the OpenKnowledge project skill\n\nThe \`${st}\` skill is regenerated per machine and version-stamped per app build, so tracking it causes recurring sync conflicts. It is now git-ignored.`,f=(await a.git.raw([`commit-tree`,o,`-p`,r,`-m`,d])).trim();if(!W9.test(f))return U9.warn({raw:f},`commit-tree returned invalid SHA — aborting untrack`),{kind:`failed`,error:`commit-tree returned invalid SHA`};try{await n.git.raw([`update-ref`,`refs/heads/${t}`,f,r])}catch(e){return U9.info({branch:t,err:K9(e)},`update-ref CAS failed — ref moved, retry next open`),{kind:`skipped`,reason:`ref-race`}}try{await n.git.raw([`reset`,`-q`,f,`--`,...i])}catch(e){U9.info({err:K9(e)},`real-index reset after untrack failed (cosmetic)`)}return U9.info({dirs:i,commitSha:f},`untracked project-skill projection`),{kind:`untracked`,dirs:i,commitSha:f}})}catch(e){return{kind:`failed`,error:K9(e)}}}async function G9(e){let t=[];for(let n of ZFe){let r=``;try{r=(await e.git.raw([`ls-files`,`--`,n])).trim()}catch{r=``}r.length>0&&t.push(n)}return t}async function $Fe(e){try{let t=(await e.git.raw([`rev-parse`,`--abbrev-ref`,`HEAD`])).trim();return t.length===0||t===`HEAD`?null:t}catch{return null}}async function eIe(e){try{let t=(await e.git.raw([`rev-parse`,`--verify`,`HEAD`])).trim();return W9.test(t)?t:null}catch{return null}}async function tIe(e,t){try{let n=(await e.git.raw([`rev-parse`,`${t}^{tree}`])).trim();return W9.test(n)?n:null}catch{return null}}function nIe(e){return B(I(e,`MERGE_HEAD`))||B(I(e,`rebase-merge`))||B(I(e,`rebase-apply`))||B(I(e,`CHERRY_PICK_HEAD`))||B(I(e,`REVERT_HEAD`))}function K9(e){return e instanceof Error?e.message:String(e)}async function rIe(e,t){let n;try{n=iu(t).resolve(e)}catch(e){if(e?.code===`MODULE_NOT_FOUND`)return;throw e}for(let t=F(n),r=0;r<32;r+=1){let n=I(t,`package.json`);if(B(n))try{let t=JSON.parse(await ed(n,`utf-8`));if(t.name===e&&typeof t.version==`string`)return t.version}catch{}let r=F(t);if(r===t)return;t=r}}const iIe=[{regex:/\/Users\/[^/]+\//g,replacement:`~/`},{regex:/\/home\/[^/]+\//g,replacement:`~/`},{regex:/C:\\\\Users\\\\[^\\\\]+\\\\/g,replacement:`~\\`},{regex:/C:\\Users\\[^\\]+\\/g,replacement:`~\\`}];function q9(e){if(e===void 0)return;let t=e;for(let{regex:e,replacement:n}of iIe)t=t.replace(e,n);return t}function J9(e,t=0,n=new WeakSet){if(t>=5)return{name:`SerializedError.CauseDepthExceeded`,message:`cause chain depth > 5; truncated`};if(typeof e==`object`&&e){if(n.has(e))return{name:`SerializedError.CauseCycle`,message:`cyclic cause; truncated`};n.add(e)}if(e instanceof Error)return{name:e.name,message:q9(e.message)??``,stack:q9(e.stack),code:e.code,cause:e.cause===void 0?void 0:J9(e.cause,t+1,n)};if(e==null)return{name:`UnknownError`,message:String(e)};if(typeof e==`string`)return{name:`StringError`,message:q9(e)??e};if(typeof e==`object`){let r=e;return{name:String(r.name??`ObjectError`),message:q9(String(r.message??``))??``,stack:q9(r.stack),code:r.code,cause:r.cause===void 0?void 0:J9(r.cause,t+1,n)}}return{name:`UnknownError`,message:String(e)}}var Y9=class extends Error{constructor(e){super(`File not found: ${e}`),this.filePath=e,this.name=`SingleFileNotFoundError`}},X9=class extends Error{constructor(e){super(`Not a file: ${e}. \`ok <file>\` opens a single markdown file.`),this.filePath=e,this.name=`SingleFileNotAFileError`}},Z9=class extends Error{constructor(e){super(`OpenKnowledge edits markdown files (.md / .mdx): ${e}`),this.filePath=e,this.name=`SingleFileNotMarkdownError`}};function aIe(e){if(!Wx(e))throw new Z9(e);let t;try{t=H(R(e))}catch(t){throw t.code===`ENOENT`?new Y9(e):t}if(!Bu(t).isFile())throw new X9(e);let n=F(t),r=wB(n);if(r){let e=r.rootPath;return{mode:`project`,projectRoot:e,docName:Kx(L(oIe(e),t).split(z).join(`/`)),canonicalFilePath:t}}let i=lu(t);return{mode:`ephemeral`,canonicalFilePath:t,contentDir:n,singleDocRelPath:i,docName:Kx(i)}}function oIe(e){return R(e,Cs({absPath:zs(`project`,e),sideline:!1,warn:()=>{}}).value.content?.dir??`.`)}const Q9=`ok-ephemeral-`;function $9(e,t){let n=R(e,`.ok`);return ku(n,{recursive:!0}),Hu(R(n,`config.yml`),`# Ephemeral single-file session (\`ok <file>\`). Throwaway — safe to delete.\ncontent:\n dir: ${JSON.stringify(t)}\n`,`utf-8`),Hu(R(n,`.gitignore`),`local/
|
|
2037
2037
|
`,`utf-8`),e}function sIe(e){return $9(Au(R(Yu(),Q9)),e)}export{Y0 as $,lS as $i,tL as $n,_fe as $r,mJ as $t,j7 as A,rf as Aa,hw as Ai,CB as An,ZP as Ar,RX as At,e7 as B,lw as Bi,xB as Bn,xN as Br,vJ as Bt,A9 as C,cae as Ca,AE as Ci,nV as Cn,aF as Cr,xZ as Ct,X7 as D,df as Da,mE as Di,UB as Dn,eF as Dr,EZ as Dt,c9 as E,Zm as Ea,rE as Ei,WB as En,tF as Er,_be as Et,v7 as F,Ad as Fa,_w as Fi,aB as Fn,wN as Fr,hZ as Ft,e8 as G,RC as Gi,gz as Gn,ZM as Gr,CJ as Gt,K5 as H,Ele as Hi,Fz as Hn,yN as Hr,C_e as Ht,h7 as I,Cw as Ii,tB as In,CN as Ir,VX as It,Q6 as J,bS as Ji,vz as Jn,_M as Jr,EJ as Jt,t8 as K,zC as Ki,_z as Kn,xM as Kr,w_e as Kt,$5 as L,bw as Li,Xz as Ln,DN as Lr,M_e as Lt,k7 as M,Bd as Ma,pw as Mi,iB as Mn,JP as Mr,tbe as Mt,A7 as N,tf as Na,vw as Ni,zz as Nn,xP as Nr,nbe as Nt,T7 as O,af as Oa,Dw as Oi,HB as On,QP as Or,bZ as Ot,w7 as P,Rd as Pa,Ew as Pi,Rz as Pn,$pe as Pr,_Z as Pt,F6 as Q,rS as Qi,FR as Qn,Ofe as Qr,pJ as Qt,HNe as R,fw as Ri,Lz as Rn,TN as Rr,NJ as Rt,j9 as S,Use as Sa,ME as Si,JB as Sn,cF as Sr,TZ as St,l9 as T,Qm as Ta,hE as Ti,eV as Tn,$P as Tr,CZ as Tt,U5 as U,Dle as Ui,Cz as Un,fN as Ur,OJ as Ut,jNe as V,dw as Vi,nB as Vn,gN as Vr,T_e as Vt,B5 as W,ow as Wi,wz as Wn,QM as Wr,SJ as Wt,J6 as X,yS as Xi,az as Xn,Dfe as Xr,DJ as Xt,X6 as Y,G as Yi,mz as Yn,Afe as Yr,TJ as Yt,G6 as Z,fS as Zi,WR as Zn,kfe as Zr,wJ as Zt,WFe as _,bx as _a,fk as _i,UW as _n,mI as _r,y$ as _t,sIe as a,jx as aa,Zj as ai,bK as an,GI as ar,H0 as at,MFe as b,cx as ba,xk as bi,$B as bn,oF as br,DZ as bt,J9 as c,Px as ca,Yj as ci,eG as cn,UI as cr,rwe as ct,B9 as d,Bx as da,lA as di,aG as dn,WI as dr,O0 as dt,iS as ea,oM as ei,kK as en,$I as er,X0 as et,XFe as f,Cx as fa,jk as fi,nG as fn,kI as fr,A0 as ft,UFe as g,Vx as ga,gk as gi,GW as gn,lI as gr,xxe as gt,HFe as h,Lx as ha,hk as hi,HW as hn,TI as hr,i$ as ht,Z9 as i,Ax as ia,Zde as ii,xK as in,JI as ir,U0 as it,E7 as j,Vd as ja,gw as ji,Mz as jn,qP as jr,LX as jt,O7 as k,ff as ka,kw as ki,wB as kn,XP as kr,vZ as kt,rIe as l,Tx as la,cA as li,tG as ln,HI as lr,iwe as lt,VFe as m,Ix as ma,Ak as mi,rG as mn,OI as mr,E$ as mt,X9 as n,nS as na,$de as ni,wK as nn,rge as nr,n2 as nt,aIe as o,Mx as oa,Jj as oi,_K as on,KI as or,L0 as ot,GFe as p,Rx as pa,wk as pi,JW as pn,DI as pr,X1 as pt,$6 as q,$C as qi,yz as qn,bM as qr,kJ as qt,Y9 as r,zx as ra,Qj as ri,TK as rn,XI as rr,hwe as rt,$9 as s,Dx as sa,Xj as si,KW as sn,qI as sr,nwe as st,Q9 as t,cS as ta,pM as ti,DK as tn,cge as tr,Z0 as tt,QFe as u,kx as ua,sA as ui,XW as un,Yhe as ur,j0 as ut,FFe as v,fx as va,bk as vi,WW as vn,sI as vr,S$ as vt,M9 as w,Xm as wa,OE as wi,rV as wn,vme as wr,wZ as wt,P9 as x,Fb as xa,DO as xi,sV as xn,sF as xr,SZ as xt,PFe as y,ux as ya,_k as yi,XB as yn,xF as yr,IZ as yt,t7 as z,tw as zi,rB as zn,EN as zr,jJ as zt};
|
|
2038
|
-
//# sourceMappingURL=src-
|
|
2038
|
+
//# sourceMappingURL=src-bhsVUHJJ.mjs.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{j as e}from"./sleep-D4NlDISj.mjs";import{Cc as t,Tc as n,gc as r,wc as i,yc as a}from"./src-Bt6_UxL9.mjs";import{An as o,Qr as s,o as c,t as l}from"./src-
|
|
2
|
-
`)))}let O=o.port===void 0?void 0:Number(o.port),k=h.overrides.find(e=>e.envVar===`PORT`)?.value,A=O??k??s.server?.port,j=B({explicitDir:o.reactShellDistDir,only:o.only,findBundledDir:z}),M=j.dir;j.missingBundle&&console.warn(`bundled web UI not found — serving /api and /mcp only. Reinstall @inkeep/open-knowledge, or build packages/app in a source checkout.`);let N;try{N=await Q({config:s,cwd:m,host:C,port:A,bind:w,...o.serveContentAssets===void 0?{}:{serveContentAssets:o.serveContentAssets},...M?{reactShellDistDir:M}:{},idleThresholdMs:r(o.idleShutdown??E.idleShutdown),serverRuntime:E,...o.singleFile?{singleFile:o.singleFile}:{},...o.projectDir?{projectDir:o.projectDir}:{}})}catch(e){e instanceof q&&(console.error(f(e.message)),process.exit(1)),e instanceof J&&(console.error(f(e.message)),process.exit(1));let t=await import(`./src-
|
|
1
|
+
import{j as e}from"./sleep-D4NlDISj.mjs";import{Cc as t,Tc as n,gc as r,wc as i,yc as a}from"./src-Bt6_UxL9.mjs";import{An as o,Qr as s,o as c,t as l}from"./src-bhsVUHJJ.mjs";import{I as u,k as d}from"./fs-traced-Dm4NQ6S5.mjs";import{r as f}from"./server-lock-C0j1Yr_I.mjs";import{C as p,S as m,x as h}from"./resolve-project-root-BF1NyEri.mjs";import{c as g,f as _,g as v,l as y,n as b,o as x,p as S,r as C,s as w,t as T}from"./acp-harness-probe-Badoo7pE.mjs";import{y as E}from"./init-CVh8966W.mjs";import{n as D}from"./constants-CBe8qEst.mjs";import{spawn as O}from"node:child_process";import{basename as k,dirname as A,resolve as j}from"node:path";import{existsSync as M,realpathSync as N}from"node:fs";import{tmpdir as P}from"node:os";import{rm as F}from"node:fs/promises";import{setTimeout as I}from"node:timers/promises";function L(e,t){return e.bind?.[0]??t.HOST??`127.0.0.1`}function R(e){if(e===`server`)return e;throw new m(`--only must be 'server'`)}function z(e=M){let t=import.meta.dirname??new URL(`.`,import.meta.url).pathname;return[j(t,`public`),j(t,`../../app/dist`),j(t,`../../../app/dist`)].find(t=>e(t))}function B(e){if(e.explicitDir!==void 0)return{dir:e.explicitDir,missingBundle:!1};if(e.only===`server`)return{dir:void 0,missingBundle:!1};let t=e.findBundledDir();return{dir:t,missingBundle:t===void 0}}function V(t){if(t===`off`)return`off`;if(!e.test(t))throw new m(`--idle-shutdown must be 'off' or a duration like 90s, 30m, 2h`);return t}function H(e){return e===`localhost`||e===`::1`||e===`[::1]`||e.startsWith(`127.`)}function U(e){return!e.flagBindSet&&!e.okBindSet&&e.hostEnvSet&&e.fileBindCount>1}function W(e){return!e.openBrowser||e.ephemeral||e.only===`server`||!e.servesUi?!1:(e.explicitOn||H(e.host))&&e.isTTY}function ee(e,t){let n;try{n=new URL(t)}catch{throw new m(`${e} is not a valid URL: ${t}`)}if(n.protocol!==`http:`&&n.protocol!==`https:`)throw new m(`${e} must be an http(s) origin (got: ${t})`);return t}function G(e){return ee(`--external-url`,e)}function K(e){let t=k(e).replace(/[^\x20-\x7E]/g,``).trim().slice(0,64);return`open-knowledge-server ${t.length>0?t:`unknown`}`}var q=class extends Error{cwd;constructor(e){super("This directory isn't set up yet. Run `ok init` first, then `ok start` again."),this.name=`OkDirMissingError`,this.cwd=e}},J=class extends Error{projectDir;constructor(e){super(`--project-dir must be a throwaway ${l}* directory under the OS temp dir. Refusing to write ephemeral session state into ${e}. Omit --project-dir to let ok start create (and clean up) its own.`),this.name=`EphemeralProjectDirNotThrowawayError`,this.projectDir=e}};function Y(e,t={}){let n=t.tmpdirFn??P,r=t.realpathFn??N,i=e=>{try{return r(e)}catch(t){return t.code===`ENOENT`?j(e):null}},a=j(e),o;try{o=r(a)}catch(e){if(e.code===`ENOENT`){let e=i(A(a));o=e===null?null:j(e,k(a))}else o=null}if(o===null)return!1;let s=i(n());return s===null?!1:A(o)===s&&k(o).startsWith(`ok-ephemeral-`)}function X(e,t,n=e=>F(e,{recursive:!0,force:!0})){return async()=>{try{await e()}finally{if(Y(t))try{await n(t)}catch(e){process.stderr.write(`[start] ephemeral temp dir reap failed for ${t}: ${e instanceof Error?e.message:String(e)}\n`)}else process.stderr.write(`[start] leaving ${t} in place: only ${l}* dirs under the OS temp dir are removed on ephemeral teardown\n`)}}}function Z(e,t={}){let n=t.exit??(e=>process.exit(e)),r=t.getActiveHandles??(()=>{let e=process._getActiveHandles;return e?e.call(process):null});return async()=>{let i=!1;try{await e()}catch(e){i=!0,t.log?.error({err:e},`idle-shutdown: destroy failed — exiting anyway`)}finally{let e=null;try{let t=r();if(t!==null){e={};for(let n of t){let t=n?.constructor?.name??`unknown`;e[t]=(e[t]??0)+1}}}catch{e=null}t.log?.info({event:`idle-shutdown-exit`,exitCode:+!!i,openHandles:e??{},handlesAvailable:e!==null},`idle-shutdown: teardown finished — exiting process`),n(+!!i)}}}async function Q(e){let{config:t,cwd:n,host:r}=e,i=e.skipAutoInit??!1,a=e.idleThresholdMs===void 0?18e5:e.idleThresholdMs,{existsSync:l,mkdirSync:u}=await import(`node:fs`),{basename:d,dirname:f,resolve:p}=await import(`node:path`),{bootServer:m,createEphemeralProjectDir:h,getLogger:g,resolveContentDir:y,resolveLockDir:x,seedEphemeralProjectDir:w,waitForServerLockDrain:D}=await import(`./src-DQyTLMJF.mjs`),O=e.log??g(`start`),k=e.singleFile!==void 0,A=k?c(e.singleFile).canonicalFilePath:void 0,j=A?f(A):void 0,M=A?d(A):void 0,N,P=!1;if(j!==void 0)if(e.projectDir!==void 0){if(N=e.projectDir,!Y(N))throw new J(N);l(p(N,`.ok`,`config.yml`))||w(N,j)}else N=h(j),P=!0;let I=async()=>{if(!(!P||N===void 0)){if(!Y(N)){O.warn({ephemeralProjectDir:N},`[start] refusing to reap self-provisioned ephemeral dir: no longer resolves to an ok-ephemeral-* temp dir`);return}try{await F(N,{recursive:!0,force:!0})}catch(e){O.warn({err:e,ephemeralProjectDir:N},`[start] failed to reap self-provisioned ephemeral temp dir`)}}},L=N;if(!k){if(!i&&!o(n))throw new q(n);let t=process.env.OK_RECLAIM_DISABLE??null,r=e=>{let t=typeof e.event==`string`?e.event:``;(t.endsWith(`-failed`)||t.endsWith(`-error`)||t.endsWith(`-missing`))&&O.warn({event:e},`[start] reclaim sweep reported a problem`)};try{(e.repairMcpConfigsFn??(await import(`./repair-mcp-configs-B7MZNI74.mjs`)).repairMcpConfigs)({projectDir:n,reclaimDisableEnv:t,logger:r})}catch(e){O.warn({err:e},`[start] mcp-config repair sweep failed; continuing`)}try{(e.repairLaunchJsonFn??(await import(`./repair-launch-json-DMyIlqMg.mjs`)).repairLaunchJson)({projectDir:n,reclaimDisableEnv:t,logger:r})}catch(e){O.warn({err:e},`[start] launch.json repair sweep failed; continuing`)}try{await(e.repairSkillsFn??(await import(`./repair-skills-D33RJQek.mjs`)).repairSkills)({projectDir:n,reclaimDisableEnv:t,logger:r})}catch(e){O.warn({err:e},`[start] skill repair sweep failed; continuing`)}}let R=j??y(t,n);!k&&!l(R)&&(u(R,{recursive:!0}),O.info({contentDir:R},`Created content directory`));let z=v(),B=s(),V;try{{let e=x(N??n),t=Date.now(),r=await D(e);r!==`no-drain`&&O.info({event:`start-waited-for-draining-predecessor`,outcome:r,waitedMs:Date.now()-t,drainLockDir:e},r===`released`?`[start] predecessor server finished draining — proceeding`:`[start] predecessor server still draining after wait — proceeding to collide`)}V=await m({config:t,contentDir:R,projectDir:N??n,contentRoot:k?void 0:t.content.dir,port:e.port,host:r,quiet:!1,detectGh:_,detectGhAccounts:S,tokenStore:z,embeddingsKeyStore:B,mcpTomlEditor:E(),...k?{ephemeral:!0,singleDocRelPath:M,gitEnabled:!1,gitPreflight:()=>({ok:!0,version:`0.0.0`,resolvedPath:`git`,source:`PATH`})}:{},localOpCliArgs:[process.execPath,process.argv[1]],probeHarnessManagedMcpEntry:(e,t)=>T(e,t),probePiAcpBridge:e=>C(e),ensurePiAcpBridge:e=>b(e),idleShutdownMs:a,...e.serverRuntime===void 0?{}:{serverRuntime:e.serverRuntime},...e.bind===void 0?{}:{bind:e.bind},skipAutoInit:!0,idleShutdownHandler:t=>{let n=t;return Z(L===void 0?n:X(n,L),{log:O,exit:e.idleExit})},log:O,...e.serveContentAssets===void 0?{}:{serveContentAssets:e.serveContentAssets},...e.reactShellDistDir?{reactShellDistDir:e.reactShellDistDir}:{}})}catch(e){throw await I(),e}let H=V.destroy,U=P?async()=>{try{await H()}finally{await I()}}:H;return{httpServer:V.httpServer,destroy:U,lockDir:V.lockDir,contentDir:R,port:V.port,ready:V.ready,degraded:V.degraded}}function $(e,t,n=()=>u({absPath:d(`user`,process.cwd()),sideline:!1,warn:()=>{}}).value){return t===void 0?e:n()}function te(e){if(e===`browser`||e===`app`)return e;throw new m(`--mode must be 'browser' or 'app'`)}function ne(e){return e.OK_CONSOLE_LEVEL!==void 0||e.LOG_LEVEL!==void 0?null:`warn`}function re(e){let t=[`Stopping OpenKnowledge…`,`Saving pending changes and releasing the server lock — this can take a few seconds.`];return e===`SIGINT`&&t.push(`Press Ctrl+C again to force quit.`),t}async function ie(e,o){let s=$(e,o.singleFile),c=ne(process.env);c!==null&&(process.env.OK_CONSOLE_LEVEL=c);let{renderBanner:l}=await import(`./banner-B14xalho.mjs`),{accent:u,dim:d,error:f,warning:p}=await import(`./colors-CpP5E4wV.mjs`),m=process.cwd();process.title=K(m);let h;try{h=n(process.env)}catch(e){throw e instanceof t&&(console.error(f(e.message)),process.exit(78)),e}for(let e of h.diagnostics)console.warn(p(`[config] ${e.message}`));let g=i(s,h.layer),_=h.overrides.some(e=>e.envVar===`OK_BIND`),v=o.bind!==void 0&&o.bind.length>0?o.bind:void 0,y=process.env.HOST,b=y!==void 0&&y.trim()!==``?y:void 0,x=a(g),S=v??(_||b===void 0?[...x.bind]:[b]);U({flagBindSet:v!==void 0,okBindSet:_,hostEnvSet:b!==void 0,fileBindCount:x.bind.length})&&console.warn(p(`[config] HOST=${b} overrides server.bind — dropping the file-configured addresses (${x.bind.join(`, `)}). Use OK_BIND with a space-separated list to keep multiple binds.`));let C=S[0]??`127.0.0.1`,w=S,T=o.externalUrl,E=a(i(g,{server:{bind:w,...T===void 0?{}:{externalUrl:T}}}));if(E.allowExternal&&(!E.loopbackOnly||E.externalUrl)){let e=E.externalUrl??E.bind.join(`, `);console.warn(p([``,`⚠ EXTERNAL ACCESS ENABLED (server.allowExternal) — no server-side authentication.`,` This server is reachable beyond this machine (${e}). Anyone who can`,` reach it has FULL control of this knowledge base — sync, publishing, GitHub`,` credentials, and local operations (clone, sign-in, repo spawn).`,` Restrict who can reach it at the edge: a Tailscale ACL, a reverse proxy with`,` auth (Cloudflare Access, oauth2-proxy), or a firewall.`,``].join(`
|
|
2
|
+
`)))}let O=o.port===void 0?void 0:Number(o.port),k=h.overrides.find(e=>e.envVar===`PORT`)?.value,A=O??k??s.server?.port,j=B({explicitDir:o.reactShellDistDir,only:o.only,findBundledDir:z}),M=j.dir;j.missingBundle&&console.warn(`bundled web UI not found — serving /api and /mcp only. Reinstall @inkeep/open-knowledge, or build packages/app in a source checkout.`);let N;try{N=await Q({config:s,cwd:m,host:C,port:A,bind:w,...o.serveContentAssets===void 0?{}:{serveContentAssets:o.serveContentAssets},...M?{reactShellDistDir:M}:{},idleThresholdMs:r(o.idleShutdown??E.idleShutdown),serverRuntime:E,...o.singleFile?{singleFile:o.singleFile}:{},...o.projectDir?{projectDir:o.projectDir}:{}})}catch(e){e instanceof q&&(console.error(f(e.message)),process.exit(1)),e instanceof J&&(console.error(f(e.message)),process.exit(1));let t=await import(`./src-DQyTLMJF.mjs`);if((e instanceof t.GitNotAvailableError||e instanceof t.GitTooOldError)&&process.exit(78),e instanceof t.ExposureConsentError&&(console.error(f(e.message)),process.exit(78)),(e instanceof t.SingleFileNotFoundError||e instanceof t.SingleFileNotAFileError||e instanceof t.SingleFileNotMarkdownError)&&(console.error(f(e.message)),process.exit(1)),e instanceof t.MissingOkConfigError&&(console.error(f(e.message)),process.exit(1)),se(e,t)){let e=t.resolveLockDir(m),n=null;try{n=await ae({readServerLock:()=>t.readServerLock(e),now:Date.now,sleep:e=>I(e),timeoutMs:3e3,pollIntervalMs:50})}catch(e){process.stderr.write(`[start] spawn-or-reuse: lock poll failed (${e instanceof Error?e.message:String(e)}) — falling back to the collision message\n`)}if(n!==null){let[e,...t]=oe(n);console.log(u(e));for(let e of t)console.log(d(e));process.exit(0)}}let n=ce(e,m,t);n!==null&&(console.error(f(n)),process.exit(1)),console.error(`${f(`Failed to start:`)} ${e instanceof Error?e.stack??e.message:String(e)}`),process.exit(1)}let P=!1,F=async e=>{if(P)return;P=!0;let[t,...n]=re(e);console.log(u(`\n${t}`));for(let e of n)console.log(d(` ${e}`));try{await N.destroy()}catch(e){console.error(`${f(`destroy() failed:`)} ${e instanceof Error?e.stack??e.message:String(e)}`),process.exitCode=1}process.exit(process.exitCode??0)};process.once(`SIGINT`,()=>{F(`SIGINT`)}),process.once(`SIGTERM`,()=>{F(`SIGTERM`)});let L=`http://${C.includes(`:`)&&!C.startsWith(`[`)?`[${C}]`:C}:${N.port}`,R=C===`0.0.0.0`||C===`::`?`http://0.0.0.0:${N.port}`:void 0,V=L;console.log(l({name:`open-knowledge`,version:D,localUrl:V,networkUrl:R,nextSteps:[`Open the Editor URL in your browser to start editing.`]}));let H={"shadow-repo":`Version history and branch-switch safety unavailable`,"file-watcher":`External file changes will not sync to the editor`,"head-watcher":`Git branch switches may cause document inconsistency`};N.ready.then(async()=>{if(N.degraded.length>0){console.log();for(let e of N.degraded){let t=H[e]??`${e} (check server logs for details)`;console.warn(` ${p(`⚠`)} ${p(e)}: ${d(t)}`)}console.log()}if(W({openBrowser:o.openBrowser!==!1&&E.openBrowser,explicitOn:o.openBrowser!==!1&&g.server?.openBrowser===!0,host:C,isTTY:process.stdout.isTTY===!0,ephemeral:o.singleFile!==void 0,only:o.only,servesUi:M!==void 0})){let{openBrowser:e}=await import(`./open-browser-C8W8YLUr.mjs`);e(V)}}).catch(e=>{console.error(` ${f(`Server initialization failed:`)} ${e instanceof Error?e.message:String(e)}`)})}async function ae(e){let t=e.now()+e.timeoutMs,n=e.readServerLock();for(;n!==null&&n.draining!==!0&&n.port<=0&&e.now()<t;)await e.sleep(e.pollIntervalMs),n=e.readServerLock();return n===null||n.draining===!0||n.port<=0?null:f(n)&&n.url!==void 0?{url:n.url,kind:n.kind,pid:n.pid,servesUi:!0}:{url:n.url??`http://127.0.0.1:${n.port}`,kind:n.kind,pid:n.pid,servesUi:!1}}function oe(e){return[`${e.kind===`mcp-spawned`?`An MCP-spawned OpenKnowledge server is already running on this project`:`OpenKnowledge is already running on this project`} (pid ${e.pid}).`,` ${e.url}`,"Leaving it running — run `ok stop` first if you want a fresh server."]}function se(e,t){let n=t.ServerLockCollisionError;return n!==void 0&&e instanceof n}function ce(e,t,n){let r=n.ServerLockCollisionError;if(r===void 0||!(e instanceof r))return null;try{let e=n.readServerLock(n.resolveLockDir(t));return e&&e.kind===`mcp-spawned`?"An MCP-spawned server holds this lock; it should release on idle-shutdown (~30 min). Or run `ok stop`.":"OpenKnowledge server is already running on this project — check `ok status` or `ok stop`."}catch{return null}}function le(e){return new h(`start`).description(`Start the OpenKnowledge server (UI + API + MCP + collab on one port)`).option(`-p, --port <port>`,`Server port`,void 0).option(`--bind <address>`,`Bind address (repeatable; default 127.0.0.1 — loopback only)`,(e,t)=>[...t??[],e]).option(`--no-open-browser`,`Do not open the browser after start (interactive loopback starts open it by default)`).option(`--only <module>`,`Serve one module: 'server' (API + MCP only, no shell or browser)`,R).option(`--idle-shutdown <duration>`,`Shut the server down after this long with no connected clients ('off', or a duration like 90s, 30m, 2h; default 30m)`,V).option(`--mode <mode>`,`Force dispatch mode: 'browser' or 'app'`,te).option(`--serve-content-assets`,`Serve content assets from this server (now the default; kept for compatibility)`).option(`--react-shell-dist-dir <path>`,`Serve React shell from <path>`).addOption(new p(`--single-file <path>`,`No-project ephemeral single-file mode: scope the server to one markdown file (git + MCP off)`).hideHelp()).addOption(new p(`--project-dir <dir>`,`Throwaway project root for --single-file (where ephemeral .ok/ state lives)`).hideHelp()).option(`--external-url <url>`,`Canonical external origin clients dial (sets server.externalUrl for this run) — its host joins the Host/Origin allowlists (CORS + external-Host admission). External exposure additionally requires consent (OK_ALLOW_EXTERNAL=1 or server.allowExternal).`,G).action(async t=>{let n=e();if(t.only===`server`&&t.reactShellDistDir!==void 0&&(process.stderr.write(`error: option '--only server' cannot be combined with '--react-shell-dist-dir'
|
|
3
3
|
`),process.exit(2)),t.projectDir!==void 0&&t.singleFile===void 0&&(process.stderr.write(`error: option '--project-dir' requires '--single-file'
|
|
4
4
|
`),process.exit(2)),t.mode===`app`){let e=[];if(t.port!==void 0&&e.push(`--port`),t.bind!==void 0&&e.push(`--bind`),t.only!==void 0&&e.push(`--only`),t.idleShutdown!==void 0&&e.push(`--idle-shutdown`),t.openBrowser===!1&&e.push(`--no-open-browser`),t.externalUrl!==void 0&&e.push(`--external-url`),e.length>0){let t=process.env.OK_LOG_LEVEL??`info`;(t===`debug`||t===`trace`)&&console.error(`--mode=app: ignoring ${e.join(`, `)}`)}let n=w(x());if(n.available){g({spawn:O},n);return}console.error(y(n.reason)),process.exit(1)}await ie(n,t)})}export{ce as C,le as S,Z as T,ne as _,oe as a,W as b,Y as c,V as d,R as f,$ as g,ae as h,K as i,se as l,L as m,q as n,re as o,z as p,Q as r,H as s,J as t,G as u,B as v,X as w,U as x,ie as y};
|
|
5
|
-
//# sourceMappingURL=start-
|
|
5
|
+
//# sourceMappingURL=start-9nGFXqc5.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{S as e,m as t,p as n,r}from"./start-9nGFXqc5.mjs";export{r as bootStartServer,n as resolveBundledReactShellDir,t as resolveHost,e as startCommand};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@inkeep/open-knowledge",
|
|
3
|
-
"version": "0.63.0-beta.
|
|
3
|
+
"version": "0.63.0-beta.6",
|
|
4
4
|
"description": "Local-first, agent-friendly Markdown knowledge base with a cross-platform CLI and web editor",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"knowledge-base",
|
|
@@ -71,10 +71,10 @@
|
|
|
71
71
|
"ajv-formats": "^3.0.1",
|
|
72
72
|
"tsdown": "^0.21.7",
|
|
73
73
|
"typescript": "^5.9.3",
|
|
74
|
-
"@inkeep/open-knowledge-
|
|
75
|
-
"@inkeep/open-knowledge-
|
|
76
|
-
"@inkeep/open-knowledge-
|
|
77
|
-
"@inkeep/open-knowledge-
|
|
74
|
+
"@inkeep/open-knowledge-app": "0.63.0-beta.6",
|
|
75
|
+
"@inkeep/open-knowledge-server": "0.63.0-beta.6",
|
|
76
|
+
"@inkeep/open-knowledge-core": "0.63.0-beta.6",
|
|
77
|
+
"@inkeep/open-knowledge-native-config": "0.0.0"
|
|
78
78
|
},
|
|
79
79
|
"scripts": {
|
|
80
80
|
"build:cli": "rm -rf dist && tsdown",
|
package/dist/init-BbrBJj79.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./src-DZjt7Q8p.mjs";import{g as e}from"./init-BJiAEJRN.mjs";export{e as runInit};
|
package/dist/loader-yCnnFf8w.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./loader-Byhpqy4O.mjs";export{e as loadConfig};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e,t}from"./preview-cgs8Mb4Y.mjs";export{t as formatPreviewBlock,e as previewContent};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./repair-skills-D0WZx9LS.mjs";export{e as repairSkills};
|
package/dist/src-D6iCRSgq.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./src-Bt6_UxL9.mjs";import"./resolve-project-root-BwOq-T0U.mjs";import"./src-BsPYQ6MF.mjs";import"./acp-harness-probe-BhZDhCHH.mjs";import"./init-BJiAEJRN.mjs";import{n as e}from"./loader-Byhpqy4O.mjs";import"./skill-teardown-DCN9mAh5.mjs";import"./preview-cgs8Mb4Y.mjs";import"./mcp-migrate-event-9DFnNzHa.mjs";export{e as loadConfig};
|
package/dist/start-Bw1YV6bY.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{S as e,m as t,p as n,r}from"./start-D7t4syji.mjs";export{r as bootStartServer,n as resolveBundledReactShellDir,t as resolveHost,e as startCommand};
|