@inkeep/open-knowledge 0.39.0-beta.0 → 0.39.0-beta.1
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-DRffYtyG.mjs → acp-harness-probe-BtCFgpt9.mjs} +2 -2
- package/dist/assets/skills/discovery/SKILL.md +1 -1
- package/dist/assets/skills/project/SKILL.md +1 -1
- package/dist/cli.mjs +7 -7
- package/dist/constants-geQohyDW.mjs +2 -0
- package/dist/index.mjs +1 -1
- package/dist/{init-Dmg3ybh1.mjs → init-BDsdA_o5.mjs} +3 -3
- package/dist/init-UpwZfJC9.mjs +1 -0
- package/dist/{launch-json-removal-CGwOLOD-.mjs → launch-json-removal-DvHJ0pIl.mjs} +2 -2
- package/dist/{loader-Bgac1Kxs.mjs → loader-Cvfiqwbx.mjs} +2 -2
- package/dist/loader-D5j7kLJN.mjs +1 -0
- package/dist/{open-browser-DRGRnTps.mjs → open-browser-BAGk1RTK.mjs} +2 -2
- package/dist/{preview-MVPDXYHt.mjs → preview-DlS48lyQ.mjs} +2 -2
- package/dist/preview-MJbgqGrR.mjs +1 -0
- package/dist/{repair-launch-json-m9kFVWWv.mjs → repair-launch-json-DUkhIhmI.mjs} +2 -2
- package/dist/{repair-mcp-configs-DS_GKazS.mjs → repair-mcp-configs-CKxdm8Dd.mjs} +2 -2
- package/dist/repair-skills-D2vECWae.mjs +1 -0
- package/dist/{repair-skills-BRJAX3GC.mjs → repair-skills-hgtdKE41.mjs} +2 -2
- package/dist/{src-CfkR1g4Z.mjs → src-BNWCeu4P.mjs} +1 -1
- package/dist/{src-Ccn_LO-D.mjs → src-CNWv2m7o.mjs} +2 -2
- package/dist/{src-BNTrvpdT.mjs → src-CaRd1QSi.mjs} +2 -2
- package/dist/start-BKZeR4jl.mjs +1 -0
- package/dist/{start-CLDUfTCS.mjs → start-BZulfzdD.mjs} +2 -2
- package/dist/{write-project-skill-DWSfv1tt.mjs → write-project-skill-CnAZrDt1.mjs} +2 -2
- package/package.json +4 -4
- package/dist/constants-CkhmCRIA.mjs +0 -2
- package/dist/init-DbJe5zj2.mjs +0 -1
- package/dist/loader-CedtNgJX.mjs +0 -1
- package/dist/preview-BFoZK0g1.mjs +0 -1
- package/dist/repair-skills-Dm_mCXLT.mjs +0 -1
- package/dist/start-DyFK7VPt.mjs +0 -1
|
@@ -121,7 +121,7 @@ Karpathy's insight: "The tedious part of maintaining a knowledge base is not the
|
|
|
121
121
|
`,`
|
|
122
122
|
`).replaceAll(`\r`,`
|
|
123
123
|
`).split(`
|
|
124
|
-
`),s=[],c=new Set,l=null,u=(e,t,n)=>{c.has(e)||(c.add(e),s.push({href:e,resolvedTo:t,reason:n}))},d=e=>{let n=e.trim();if(n.startsWith(`#`))return;let a=ir(n,t);if(!a){u(n,null,`unresolvable`);return}if(a.kind===`doc`){i.has(a.docName)||u(n,a.docName,`no-such-doc`);return}if(a.kind===`asset`){if(!r)return;let e=Rr(a.url,t);if(e===null){u(n,null,`unresolvable`);return}r(e)||u(n,e,`no-such-file`);return}},f=(e,t)=>{let n=vn(e,t);!n||n.kind!==`doc`||i.has(n.docName)||u(`[[${e}${t?`#${t}`:``}]]`,n.docName,`no-such-doc`)};for(let e of o){if(l){AV(e,l)&&(l=null);continue}let t=kV(e);if(t){l=t;continue}let n=jV(e);for(;n<e.length;){if(e[n]===`\\`&&n+1<e.length){n+=2;continue}if(e[n]==="`"){let t=MV(e,n);if(t){n=t.nextIndex;continue}}if(e[n]===`[`&&e[n+1]===`[`){let t=NV(e,n);if(t){f(t.target,t.anchor),n=t.nextIndex;continue}}if(e[n]===`[`&&e[n-1]!==`!`){let t=IV(e,n);if(t){d(t.href),n=t.nextIndex;continue}}n++}}return s}function WV(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}))])),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))]))}}function GV(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 KV(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}]))])),forward:new Map(Object.entries(e.forward??{}).map(([e,t])=>[e,new Set(t)])),externalForward:t,externalBackward:GV(t)}}var qV=class{projectDir;contentDir;contentFilter;states=new Map;mtimesByBranch=new Map;activeBranch=`main`;constructor(e){this.projectDir=e.projectDir,this.contentDir=e.contentDir,this.contentFilter=e.contentFilter,this.states.set(this.activeBranch,xV())}getState(e=this.activeBranch){let t=this.states.get(e);return t||(t=xV(),this.states.set(e,t)),t}structuralBundleNeighbors(e,t=this.activeBranch){let n=SV(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=SV(t);n?.kind===`reference`&&n.skillDocName===e&&r.add(t)}else i.forward.has(n.skillDocName)&&r.add(n.skillDocName);return r}getActiveBranch(){return this.activeBranch}switchBranch(e){this.activeBranch=e,this.getState(e)}cachePath(e=this.activeBranch){return z(nN(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.externalForward.set(e,new Map)}registerGlobalSkillBundleNode(e,t=this.activeBranch){bt(e)&&this.registerNodeOnly(e,t)}updateDocument(e,t,n=[],r=this.activeBranch){if(Jx(e))return;if(bt(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.externalForward.set(e,c);for(let n of t){if(!n.target)continue;let t=Be(n.target)??n.target;s.add(t);let r=i.backward.get(t);r||(r=new Map,i.backward.set(t,r)),r.set(e,CV(r.get(e),{anchor:n.anchor,snippet:n.snippet}))}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{body:r}=cn(t),i=BV(r,e),a=zV(r,e),o=VV(r),s=HV(r,e),c=new Set(i.map(e=>e.target)),l=[...i,...a.filter(e=>!c.has(e.target))],u=new Set(o.map(e=>e.url)),d=[...o,...s.filter(e=>!u.has(e.url))];this.updateDocument(e,l,d,n)}catch(t){bV.warn({docName:e,err:t},`Failed to scan ${e} for link extraction`),this.deleteDocument(e,n)}}deleteDocument(e,t=this.activeBranch){if(Jx(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.externalForward.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.structuralBundleNeighbors(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.structuralBundleNeighbors(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.structuralBundleNeighbors(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=SV(e);t?.kind===`reference`&&i.add(t.skillDocName)}let a=e=>{let t=SV(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){let r=this.getState(n),i=new Set(e),a=t?.length?new Set(t):null;return[...r.backward.entries()].filter(([e,t])=>{if(i.has(e)||r.forward.has(e))return!1;if(!a)return t.size>0;for(let e of t.keys())if(a.has(e))return!0;return!1}).map(([e,t])=>({target:e,sources:[...t.entries()].filter(([e])=>!a||a.has(e)).map(([e,t])=>({source:e,anchor:t.anchor,snippet:t.snippet})).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)}getLinkGraph(e=this.activeBranch){let t=this.getState(e),n=new Map,r=[];for(let[e,i]of t.forward){n.set(e,{kind:`doc`,id:e,docName:e,anchor:wV(t.backward.get(e))});for(let a of i)n.set(a,{kind:`doc`,id:a,docName:a,anchor:wV(t.backward.get(a))}),r.push({source:e,target:a})}for(let[e,i]of t.externalForward){n.set(e,{kind:`doc`,id:e,docName:e,anchor:wV(t.backward.get(e))});for(let[t,a]of i){let i=TV(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(SV(i)?.kind===`skill`)for(let a of this.structuralBundleNeighbors(i,e))t.forward.get(i)?.has(a)||t.forward.get(a)?.has(i)||(n.set(i,{kind:`doc`,id:i,docName:i,anchor:wV(t.backward.get(i))}),n.set(a,{kind:`doc`,id:a,docName:a,anchor:wV(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=EV(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)c.add(t);for(let t of r.externalForward.get(e.nodeId)?.keys()??[])c.add(TV(t));for(let t of r.backward.get(e.nodeId)?.keys()??[])c.add(t);for(let t of this.structuralBundleNeighbors(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=TV(n);a.has(t)&&c.push({source:e,target:t})}for(let e of a)if(SV(e)?.kind===`skill`)for(let t of this.structuralBundleNeighbors(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=EV(e);return t?{kind:`external`,id:e,url:t,label:i.get(t)??null}:{kind:`doc`,id:e,docName:e,anchor:wV(r.backward.get(e))}}),links:c}}async saveToDisk(e=this.activeBranch){let t=this.cachePath(e);Yc(Pc(t),{recursive:!0});let n=this.getState(e),r=this.mtimesByBranch.get(e),i={...WV(n),...r?{mtimes:Object.fromEntries(r)}:{}};await Cl(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 yl(t,`utf-8`),r=JSON.parse(n);return this.states.set(e,KV(r)),r.mtimes?this.mtimesByBranch.set(e,new Map(Object.entries(r.mtimes))):this.mtimesByBranch.delete(e),!0}catch(t){return bV.warn({branch:e,err:t},`Failed to load cache for ${e}`),!1}}clear(e=this.activeBranch){this.states.set(e,xV()),this.mtimesByBranch.delete(e)}async rebuildFromDisk(e=this.activeBranch){return yV(`backlink`,`full`,()=>this.rebuildFromDiskUnspanned(e))}async rebuildFromDiskUnspanned(e){let t=xV(),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([Sl(t),yl(t,`utf-8`)]);return{docName:e,mtimeMs:n.mtimeMs,markdown:r}}));for(let e of i){if(e.status===`rejected`){bV.warn({err:e.reason},`Failed to rebuild entry`);continue}let{docName:r,mtimeMs:i,markdown:a}=e.value;n.set(r,i);let{body:o}=cn(a),s=BV(o,r),c=zV(o,r),l=VV(o),u=HV(o,r),d=new Set(s.map(e=>e.target)),f=[...s,...c.filter(e=>!d.has(e.target))],p=new Set(l.map(e=>e.url)),m=[...l,...u.filter(e=>!p.has(e.url))],h=new Set,g=new Map;t.forward.set(r,h),t.externalForward.set(r,g);for(let e of f){if(!e.target)continue;let n=Be(e.target)??e.target;h.add(n);let i=t.backward.get(n);i||(i=new Map,t.backward.set(n,i)),i.set(r,CV(i.get(r),{anchor:e.anchor,snippet:e.snippet}))}for(let e of m){if(!e.url)continue;g.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 bl(e,{withFileTypes:!0})}catch(t){bV.warn({dir:e,err:t},`Failed to read directory ${e}`);return}for(let r of n){let n=L(e,r.name);if(r.isDirectory()){let e=yk(R(this.contentDir,n));if(this.contentFilter&&e&&this.contentFilter.isDirExcluded(e))continue;await this.walkForPaths(n,t)}else if(r.isFile()&&Zx(r.name)){let e=yk(R(this.contentDir,n));if(this.contentFilter?.isExcluded(e))continue;t.push({docName:$x(e),filePath:n})}}}async reconcileWithDisk(e=this.activeBranch){return yV(`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:[]};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 Sl(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 yl(t,`utf-8`)})));for(let t of r){if(t.status===`rejected`){bV.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)bt(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}}async ingestGlobalSkillBundles(e,t=this.activeBranch){let n=new Set;for(let r of e){if(!B(r))continue;let e;try{e=await bl(r,{withFileTypes:!0})}catch(e){bV.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=L(r,e),o=Ft(`global`,e);B(L(a,`SKILL.md`))&&bt(o)&&(this.registerNodeOnly(o,t),n.add(o));let s=[];await this.walkGlobalSkillReferences(L(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())bt(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 bl(e,{withFileTypes:!0})}catch(t){t?.code!==`ENOENT`&&bV.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(L(e,a.name),t,i,r);else if(a.isFile()&&Zx(a.name)){let e=$x(i);r.push({docName:`${dr}global/${t}/references/${e}`})}}}};let JV,YV;function XV(e=new Date().toISOString()){JV={startedAt:e},YV=performance.now()}function ZV(){if(YV!==void 0)return Math.round(performance.now()-YV)}function QV(e,t){JV&&(JV[e]=t)}function $V(e,t){JV&&(JV[e]=t)}function eH(){return JV}function tH(e,t){let n=XE(e.summary);if(n.kind===`invalid`)return{kind:`invalid-summary`};let r=rh(e),i=t?.()??null;return r.rawAgentId!==void 0&&r.writerId!==void 0?{kind:`agent`,writerId:r.writerId,displayName:r.displayName,colorSeed:r.colorSeed??r.rawAgentId,clientName:r.clientName,clientVersion:r.clientVersion,label:r.label,actor:{principalId:i?.id,agentType:nh(r.clientName),clientName:r.clientName,clientVersion:r.clientVersion,label:r.label},summary:n}:i?{kind:`principal`,writerId:i.id,displayName:i.display_name,colorSeed:i.id,actor:{principalId:i.id},summary:n}:{kind:`anonymous`,summary:n}}function nH(e){try{return ol(z(e,xa)).isFile()}catch(e){let t=e?.code;if(t===`ENOENT`||t===`ENOTDIR`)return!1;throw e}}function rH(e){let t=z(e),n=0;for(;n<30;){let e=!1;try{e=nH(t)}catch{e=!1}if(e)return{rootPath:t,distance:n};let r=Pc(t);if(r===t)return null;t=r,n+=1}return null}async function iH(e,t){let{git:n}=ko(e),[r,i]=await Promise.allSettled([oO(n),aO(n,[`diff`,`--name-only`,`HEAD..${t}`])]);if(i.status===`rejected`)throw i.reason;if(r.status===`rejected`)throw r.reason;let a=r.value,o=i.value,s=new Set(a);if(s.size===0||o.length===0)return{conflicts:!1,files:[]};let c=new Set;for(let e of o)s.has(e)&&c.add(e);return c.size===0?{conflicts:!1,files:[]}:{conflicts:!0,files:Array.from(c).sort()}}function aH(e,t){if(typeof e!=`string`)return!1;if(e.length===0)return t===`folder`;if(e.startsWith(`/`)||e.includes(`\\`)||/[\x00-\x1F\x7F]/.test(e))return!1;for(let t of e.split(`/`))if(t.length===0||t===`..`||t===`.git`)return!1;return!0}async function oH(e,t,n,r){let{git:i}=ko(e);await i.raw([`rev-parse`,`--git-dir`]);let a=(async()=>{try{let e=(await i.raw([`symbolic-ref`,`HEAD`])).trim(),t=/^refs\/heads\/(.+)$/.exec(e);return{detached:!1,currentBranch:t?t[1]:null,currentHeadSha:null}}catch{let e=(await i.raw([`rev-parse`,`--short=7`,`HEAD`])).trim();return e.length===0?{detached:!1,currentBranch:null,currentHeadSha:null}:{detached:!0,currentBranch:null,currentHeadSha:e}}})(),o=a.then(async e=>{if(r===`folder`&&n===``)return!0;let t=e.detached?`HEAD`:e.currentBranch;if(!t)return!1;try{return await i.raw([`cat-file`,`-e`,`${t}:${n}`]),!0}catch{return!1}}),s=i.raw([`rev-parse`,`--verify`,`refs/heads/${t}`]).then(()=>!0).catch(()=>!1),c=(async()=>{let e=`origin/${t}`;if(await i.raw([`rev-parse`,`--verify`,e]).then(()=>!0).catch(()=>!1))return r===`folder`&&n===``?!0:i.raw([`cat-file`,`-e`,`${e}:${n}`]).then(()=>!0).catch(()=>!1)})(),l=iH(e,t).catch(e=>(cH(e)||I(`git-branch-info`).warn({branch:t,err:e},`action=dirty-overlap-failed branch=${t} error=${iR(e)}`),{conflicts:!1,files:[]})),[u,d,f,p,m]=await Promise.all([a,o,s,l,c]);return u.detached?{detached:!0,currentBranch:null,currentHeadSha:u.currentHeadSha,shareTargetExists:d,dirtyConflicts:p,branchIsLocal:f,shareTargetOnOriginBranch:m}:{detached:!1,currentBranch:u.currentBranch,currentHeadSha:null,shareTargetExists:d,dirtyConflicts:p,branchIsLocal:f,shareTargetOnOriginBranch:m}}const sH=`git-branch-info`;function cH(e){let t=e instanceof Error?e.message:String(e);return/unknown revision|bad revision|ambiguous argument/i.test(t)}const lH=I(`git-checkout`),uH=/'[^']+' is already (?:checked out|used by worktree) at '([^']+)'/;function dH(e){let t=(e instanceof Error?e.message:typeof e==`string`?e:``).match(uH);if(t===null)return{held:!1};let n=t[1];if(n===void 0||n.length===0)return{held:!1};let r;try{r=nl(n)}catch{r=n}return{held:!0,path:r}}const fH=`git-checkout`,pH=Bt;async function mH(e,t,n){if(n?.fastForward&&await hH(e,t)===`diverged`)return{ok:!1,reason:`ff-diverged`};let{git:r}=ko(e),i=await r.raw([`rev-parse`,`--verify`,`refs/heads/${t}`]).then(()=>!0).catch(()=>!1);if(!i)try{await r.raw([`fetch`,`origin`,t])}catch(e){return{ok:!1,reason:pH(e)?`branch-not-found`:`fetch-failed`}}let a=await iH(e,i?t:`origin/${t}`);if(a.conflicts)return{ok:!1,reason:`dirty-conflict`,files:a.files};try{return await r.raw([`checkout`,t]),{ok:!0}}catch(e){let n=dH(e);return n.held?(lH.warn({branch:t,heldAt:n.path},`reason=branch-in-other-worktree branch=${t} held_at=${n.path}`),{ok:!1,reason:`branch-in-other-worktree`,otherWorktreePath:n.path}):(lH.warn({branch:t,err:e},`action=checkout-failed branch=${t} error=${iR(e)}`),{ok:!1,reason:`checkout-failed`})}}async function hH(e,t){let{git:n}=ko(e,{timeoutMs:15e3}),r=e=>n.raw([`rev-parse`,`--verify`,e]).then(e=>e.trim()).catch(()=>null);try{await n.raw([`fetch`,`origin`,t])}catch(e){return lH.warn({branch:t,err:e},`action=ff-fetch-failed branch=${t} error=${iR(e)}`),`unavailable`}let i=await r(`refs/remotes/origin/${t}`);if(!i)return`unavailable`;let a=await r(`refs/heads/${t}`);if(!a||a===i)return`up-to-date`;let o=await n.raw([`merge-base`,a,i]).then(e=>e.trim()).catch(()=>``);if(o===a){try{await n.raw([`fetch`,`origin`,`${t}:${t}`])}catch(e){return lH.warn({branch:t,err:e},`action=ff-advance-failed branch=${t} error=${iR(e)}`),`unavailable`}return await r(`refs/heads/${t}`)===i?`advanced`:`unavailable`}return o===i?`up-to-date`:`diverged`}const gH=(e,t,n)=>{let r=Ac(`git`,[`config`,n===`worktree`?`--worktree`:n===`local`?`--local`:`--global`,t],AA({cwd:e,encoding:`utf-8`,timeout:5e3}));return r.status!==0||!r.stdout?null:r.stdout.trim()||null};function _H(e){let t=Ac(`git`,[`rev-parse`,`--git-dir`],AA({cwd:e,encoding:`utf-8`,timeout:5e3})),n=Ac(`git`,[`rev-parse`,`--git-common-dir`],AA({cwd:e,encoding:`utf-8`,timeout:5e3}));return t.status!==0||n.status!==0?!1:z(e,t.stdout.trim())!==z(e,n.stdout.trim())}function vH(e){let t=Ac(`git`,[`config`,`--local`,`--get`,`extensions.worktreeConfig`],AA({cwd:e,encoding:`utf-8`,timeout:5e3}));if(t.status===0&&/^(true|yes|on|1)$/i.test(t.stdout.trim()))return;let n=Ac(`git`,[`config`,`--local`,`extensions.worktreeConfig`,`true`],AA({cwd:e,encoding:`utf-8`,timeout:5e3}));if(n.status!==0){let e=n.stderr?.trim()??``,t=n.error?` [${n.error.message}]`:``;throw Error(`failed to enable extensions.worktreeConfig: ${e}${t}`)}}async function yH(e,t,n,r=gH){let i=r(e,`user.name`,`worktree`),a=r(e,`user.email`,`worktree`);if(i&&a)return{name:i,email:a};let o=r(e,`user.name`,`local`),s=r(e,`user.email`,`local`);if(o&&s)return{name:o,email:s};let c=r(e,`user.name`,`global`),l=r(e,`user.email`,`global`);if(c&&l)return{name:c,email:l};if(t&&n){let e=await t.get(n);if(e){let t=e.name??e.login,n=e.email??`${e.login}@users.noreply.github.com`;if(t)return{name:t,email:n}}}return null}function bH(e,t,n){let r=`--local`;_H(e)&&(vH(e),r=`--worktree`);let i=(t,n)=>{let i=Ac(`git`,[`config`,r,t,n],AA({cwd:e,encoding:`utf-8`,timeout:5e3}));if(i.status!==0){let e=i.stderr?.trim()??``,n=i.error?` [${i.error.message}]`:``;throw Error(`git config ${r} ${t} failed: ${e}${n}`)}};i(`user.name`,t),i(`user.email`,n)}function xH(e,t){return async(n,r,...i)=>{try{await e(n,r,...i)}catch(e){if(e instanceof he||e instanceof Error&&e.name===`BridgeMergeContentLossError`)throw e;G(r,500,`urn:ok:error:internal-server-error`,t.title??`Internal server error.`,{handler:t.handler,cause:e})}}}function SH(e,t){let n=Object.keys(e).join(`, `);return async(r,i)=>{let a=r.method===void 0?void 0:e[r.method];if(a){await a(r,i);return}G(i,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:t.handler,extraHeaders:{Allow:n}})}}const CH=`config.yml`;function wH(e,t){let n;try{n=Jc(e)}catch(e){if(e.code===`ENOENT`)return;throw e}if(n.isSymbolicLink())throw Error(`Refusing to follow symlink at ${t} (${e}). An untrusted upstream may have committed this symlink to redirect writes outside the project. Remove the symlink and re-run.`)}function TH(e){let[t=`0`,n=`0`]=e.split(`.`);return`${t.length>0?t:`0`}.${n.length>0?n:`0`}`}function EH(e){return/^[A-Za-z0-9._\-/]+$/.test(e)?e:JSON.stringify(e)}function DH(e,t){let n=`# yaml-language-server: $schema=https://unpkg.com/@inkeep/open-knowledge@latest/dist/schemas/${pa}/config.project.schema.json
|
|
124
|
+
`),s=[],c=new Set,l=null,u=(e,t,n)=>{c.has(e)||(c.add(e),s.push({href:e,resolvedTo:t,reason:n}))},d=e=>{let n=e.trim();if(n.startsWith(`#`))return;let a=ir(n,t);if(!a){u(n,null,`unresolvable`);return}if(a.kind===`doc`){i.has(a.docName)||u(n,a.docName,`no-such-doc`);return}if(a.kind===`asset`){if(!r)return;let e=Rr(a.url,t);if(e===null){u(n,null,`unresolvable`);return}r(e)||u(n,e,`no-such-file`);return}},f=(e,t)=>{let n=vn(e,t);!n||n.kind!==`doc`||i.has(n.docName)||u(`[[${e}${t?`#${t}`:``}]]`,n.docName,`no-such-doc`)};for(let e of o){if(l){AV(e,l)&&(l=null);continue}let t=kV(e);if(t){l=t;continue}let n=jV(e);for(;n<e.length;){if(e[n]===`\\`&&n+1<e.length){n+=2;continue}if(e[n]==="`"){let t=MV(e,n);if(t){n=t.nextIndex;continue}}if(e[n]===`[`&&e[n+1]===`[`){let t=NV(e,n);if(t){f(t.target,t.anchor),n=t.nextIndex;continue}}if(e[n]===`[`&&e[n-1]!==`!`){let t=IV(e,n);if(t){d(t.href),n=t.nextIndex;continue}}n++}}return s}function WV(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}))])),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))]))}}function GV(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 KV(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}]))])),forward:new Map(Object.entries(e.forward??{}).map(([e,t])=>[e,new Set(t)])),externalForward:t,externalBackward:GV(t)}}var qV=class{projectDir;contentDir;contentFilter;states=new Map;mtimesByBranch=new Map;activeBranch=`main`;constructor(e){this.projectDir=e.projectDir,this.contentDir=e.contentDir,this.contentFilter=e.contentFilter,this.states.set(this.activeBranch,xV())}getState(e=this.activeBranch){let t=this.states.get(e);return t||(t=xV(),this.states.set(e,t)),t}structuralBundleNeighbors(e,t=this.activeBranch){let n=SV(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=SV(t);n?.kind===`reference`&&n.skillDocName===e&&r.add(t)}else i.forward.has(n.skillDocName)&&r.add(n.skillDocName);return r}getActiveBranch(){return this.activeBranch}switchBranch(e){this.activeBranch=e,this.getState(e)}cachePath(e=this.activeBranch){return z(nN(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.externalForward.set(e,new Map)}registerGlobalSkillBundleNode(e,t=this.activeBranch){bt(e)&&this.registerNodeOnly(e,t)}updateDocument(e,t,n=[],r=this.activeBranch){if(Jx(e))return;if(bt(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.externalForward.set(e,c);for(let n of t){if(!n.target)continue;let t=Be(n.target)??n.target;s.add(t);let r=i.backward.get(t);r||(r=new Map,i.backward.set(t,r)),r.set(e,CV(r.get(e),{anchor:n.anchor,snippet:n.snippet}))}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{body:r}=cn(t),i=BV(r,e),a=zV(r,e),o=VV(r),s=HV(r,e),c=new Set(i.map(e=>e.target)),l=[...i,...a.filter(e=>!c.has(e.target))],u=new Set(o.map(e=>e.url)),d=[...o,...s.filter(e=>!u.has(e.url))];this.updateDocument(e,l,d,n)}catch(t){bV.warn({docName:e,err:t},`Failed to scan ${e} for link extraction`),this.deleteDocument(e,n)}}deleteDocument(e,t=this.activeBranch){if(Jx(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.externalForward.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.structuralBundleNeighbors(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.structuralBundleNeighbors(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.structuralBundleNeighbors(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=SV(e);t?.kind===`reference`&&i.add(t.skillDocName)}let a=e=>{let t=SV(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){let r=this.getState(n),i=new Set(e),a=t?.length?new Set(t):null;return[...r.backward.entries()].filter(([e,t])=>{if(i.has(e)||r.forward.has(e))return!1;if(!a)return t.size>0;for(let e of t.keys())if(a.has(e))return!0;return!1}).map(([e,t])=>({target:e,sources:[...t.entries()].filter(([e])=>!a||a.has(e)).map(([e,t])=>({source:e,anchor:t.anchor,snippet:t.snippet})).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)}getLinkGraph(e=this.activeBranch){let t=this.getState(e),n=new Map,r=[];for(let[e,i]of t.forward){n.set(e,{kind:`doc`,id:e,docName:e,anchor:wV(t.backward.get(e))});for(let a of i)n.set(a,{kind:`doc`,id:a,docName:a,anchor:wV(t.backward.get(a))}),r.push({source:e,target:a})}for(let[e,i]of t.externalForward){n.set(e,{kind:`doc`,id:e,docName:e,anchor:wV(t.backward.get(e))});for(let[t,a]of i){let i=TV(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(SV(i)?.kind===`skill`)for(let a of this.structuralBundleNeighbors(i,e))t.forward.get(i)?.has(a)||t.forward.get(a)?.has(i)||(n.set(i,{kind:`doc`,id:i,docName:i,anchor:wV(t.backward.get(i))}),n.set(a,{kind:`doc`,id:a,docName:a,anchor:wV(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=EV(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)c.add(t);for(let t of r.externalForward.get(e.nodeId)?.keys()??[])c.add(TV(t));for(let t of r.backward.get(e.nodeId)?.keys()??[])c.add(t);for(let t of this.structuralBundleNeighbors(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=TV(n);a.has(t)&&c.push({source:e,target:t})}for(let e of a)if(SV(e)?.kind===`skill`)for(let t of this.structuralBundleNeighbors(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=EV(e);return t?{kind:`external`,id:e,url:t,label:i.get(t)??null}:{kind:`doc`,id:e,docName:e,anchor:wV(r.backward.get(e))}}),links:c}}async saveToDisk(e=this.activeBranch){let t=this.cachePath(e);Yc(Pc(t),{recursive:!0});let n=this.getState(e),r=this.mtimesByBranch.get(e),i={...WV(n),...r?{mtimes:Object.fromEntries(r)}:{}};await Cl(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 yl(t,`utf-8`),r=JSON.parse(n);return this.states.set(e,KV(r)),r.mtimes?this.mtimesByBranch.set(e,new Map(Object.entries(r.mtimes))):this.mtimesByBranch.delete(e),!0}catch(t){return bV.warn({branch:e,err:t},`Failed to load cache for ${e}`),!1}}clear(e=this.activeBranch){this.states.set(e,xV()),this.mtimesByBranch.delete(e)}async rebuildFromDisk(e=this.activeBranch){return yV(`backlink`,`full`,()=>this.rebuildFromDiskUnspanned(e))}async rebuildFromDiskUnspanned(e){let t=xV(),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([Sl(t),yl(t,`utf-8`)]);return{docName:e,mtimeMs:n.mtimeMs,markdown:r}}));for(let e of i){if(e.status===`rejected`){bV.warn({err:e.reason},`Failed to rebuild entry`);continue}let{docName:r,mtimeMs:i,markdown:a}=e.value;n.set(r,i);let{body:o}=cn(a),s=BV(o,r),c=zV(o,r),l=VV(o),u=HV(o,r),d=new Set(s.map(e=>e.target)),f=[...s,...c.filter(e=>!d.has(e.target))],p=new Set(l.map(e=>e.url)),m=[...l,...u.filter(e=>!p.has(e.url))],h=new Set,g=new Map;t.forward.set(r,h),t.externalForward.set(r,g);for(let e of f){if(!e.target)continue;let n=Be(e.target)??e.target;h.add(n);let i=t.backward.get(n);i||(i=new Map,t.backward.set(n,i)),i.set(r,CV(i.get(r),{anchor:e.anchor,snippet:e.snippet}))}for(let e of m){if(!e.url)continue;g.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 bl(e,{withFileTypes:!0})}catch(t){bV.warn({dir:e,err:t},`Failed to read directory ${e}`);return}for(let r of n){let n=L(e,r.name);if(r.isDirectory()){let e=yk(R(this.contentDir,n));if(this.contentFilter&&e&&this.contentFilter.isDirExcluded(e))continue;await this.walkForPaths(n,t)}else if(r.isFile()&&Zx(r.name)){let e=yk(R(this.contentDir,n));if(this.contentFilter?.isExcluded(e))continue;t.push({docName:$x(e),filePath:n})}}}async reconcileWithDisk(e=this.activeBranch){return yV(`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:[]};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 Sl(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 yl(t,`utf-8`)})));for(let t of r){if(t.status===`rejected`){bV.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)bt(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}}async ingestGlobalSkillBundles(e,t=this.activeBranch){let n=new Set;for(let r of e){if(!B(r))continue;let e;try{e=await bl(r,{withFileTypes:!0})}catch(e){bV.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=L(r,e),o=Ft(`global`,e);B(L(a,`SKILL.md`))&&bt(o)&&(this.registerNodeOnly(o,t),n.add(o));let s=[];await this.walkGlobalSkillReferences(L(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())bt(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 bl(e,{withFileTypes:!0})}catch(t){t?.code!==`ENOENT`&&bV.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(L(e,a.name),t,i,r);else if(a.isFile()&&Zx(a.name)){let e=$x(i);r.push({docName:`${dr}global/${t}/references/${e}`})}}}};let JV,YV;function XV(e=new Date().toISOString()){JV={startedAt:e},YV=performance.now()}function ZV(){if(YV!==void 0)return Math.round(performance.now()-YV)}function QV(e,t){JV&&(JV[e]=t)}function $V(e,t){JV&&(JV[e]=t)}function eH(){return JV}function tH(e,t){let n=XE(e.summary);if(n.kind===`invalid`)return{kind:`invalid-summary`};let r=rh(e),i=t?.()??null;return r.rawAgentId!==void 0&&r.writerId!==void 0?{kind:`agent`,writerId:r.writerId,displayName:r.displayName,colorSeed:r.colorSeed??r.rawAgentId,clientName:r.clientName,clientVersion:r.clientVersion,label:r.label,actor:{principalId:i?.id,agentType:nh(r.clientName),clientName:r.clientName,clientVersion:r.clientVersion,label:r.label},summary:n}:i?{kind:`principal`,writerId:i.id,displayName:i.display_name,colorSeed:i.id,actor:{principalId:i.id},summary:n}:{kind:`anonymous`,summary:n}}function nH(e){try{return ol(z(e,xa)).isFile()}catch(e){let t=e?.code;if(t===`ENOENT`||t===`ENOTDIR`)return!1;throw e}}function rH(e){let t=z(e),n=0;for(;n<30;){let e=!1;try{e=nH(t)}catch{e=!1}if(e)return{rootPath:t,distance:n};let r=Pc(t);if(r===t)return null;t=r,n+=1}return null}async function iH(e,t){let{git:n}=ko(e),[r,i]=await Promise.allSettled([oO(n),aO(n,[`diff`,`--name-only`,`HEAD..${t}`])]);if(i.status===`rejected`)throw i.reason;if(r.status===`rejected`)throw r.reason;let a=r.value,o=i.value,s=new Set(a);if(s.size===0||o.length===0)return{conflicts:!1,files:[]};let c=new Set;for(let e of o)s.has(e)&&c.add(e);return c.size===0?{conflicts:!1,files:[]}:{conflicts:!0,files:Array.from(c).sort()}}function aH(e,t){if(typeof e!=`string`)return!1;if(e.length===0)return t===`folder`;if(e.startsWith(`/`)||e.includes(`\\`)||/[\x00-\x1F\x7F]/.test(e))return!1;for(let t of e.split(`/`))if(t.length===0||t===`..`||t===`.git`)return!1;return!0}async function oH(e,t,n,r){let{git:i}=ko(e);await i.raw([`rev-parse`,`--git-dir`]);let a=(async()=>{try{let e=(await i.raw([`symbolic-ref`,`HEAD`])).trim(),t=/^refs\/heads\/(.+)$/.exec(e);return{detached:!1,currentBranch:t?t[1]:null,currentHeadSha:null}}catch{let e=(await i.raw([`rev-parse`,`--short=7`,`HEAD`])).trim();return e.length===0?{detached:!1,currentBranch:null,currentHeadSha:null}:{detached:!0,currentBranch:null,currentHeadSha:e}}})(),o=a.then(async e=>{if(r===`folder`&&n===``)return!0;let t=e.detached?`HEAD`:e.currentBranch;if(!t)return!1;try{return await i.raw([`cat-file`,`-e`,`${t}:${n}`]),!0}catch{return!1}}),s=i.raw([`rev-parse`,`--verify`,`refs/heads/${t}`]).then(()=>!0).catch(()=>!1),c=(async()=>{let e=`origin/${t}`;if(await i.raw([`rev-parse`,`--verify`,e]).then(()=>!0).catch(()=>!1))return r===`folder`&&n===``?!0:i.raw([`cat-file`,`-e`,`${e}:${n}`]).then(()=>!0).catch(()=>!1)})(),l=iH(e,t).catch(e=>(cH(e)||I(`git-branch-info`).warn({branch:t,err:e},`action=dirty-overlap-failed branch=${t} error=${iR(e)}`),{conflicts:!1,files:[]})),[u,d,f,p,m]=await Promise.all([a,o,s,l,c]);return u.detached?{detached:!0,currentBranch:null,currentHeadSha:u.currentHeadSha,shareTargetExists:d,dirtyConflicts:p,branchIsLocal:f,shareTargetOnOriginBranch:m}:{detached:!1,currentBranch:u.currentBranch,currentHeadSha:null,shareTargetExists:d,dirtyConflicts:p,branchIsLocal:f,shareTargetOnOriginBranch:m}}const sH=`git-branch-info`;function cH(e){let t=e instanceof Error?e.message:String(e);return/unknown revision|bad revision|ambiguous argument/i.test(t)}const lH=I(`git-checkout`),uH=/'[^']+' is already (?:checked out|used by worktree) at '([^']+)'/;function dH(e){let t=(e instanceof Error?e.message:typeof e==`string`?e:``).match(uH);if(t===null)return{held:!1};let n=t[1];if(n===void 0||n.length===0)return{held:!1};let r;try{r=nl(n)}catch{r=n}return{held:!0,path:r}}const fH=`git-checkout`,pH=Bt;async function mH(e,t,n){if(n?.fastForward&&await hH(e,t)===`diverged`)return{ok:!1,reason:`ff-diverged`};let{git:r}=ko(e),i=await r.raw([`rev-parse`,`--verify`,`refs/heads/${t}`]).then(()=>!0).catch(()=>!1);if(!i)try{await r.raw([`fetch`,`origin`,t])}catch(e){return{ok:!1,reason:pH(e)?`branch-not-found`:`fetch-failed`}}let a=await iH(e,i?t:`origin/${t}`);if(a.conflicts)return{ok:!1,reason:`dirty-conflict`,files:a.files};try{return await r.raw([`checkout`,t]),{ok:!0}}catch(e){let n=dH(e);return n.held?(lH.warn({branch:t,heldAt:n.path},`reason=branch-in-other-worktree branch=${t} held_at=${n.path}`),{ok:!1,reason:`branch-in-other-worktree`,otherWorktreePath:n.path}):(lH.warn({branch:t,err:e},`action=checkout-failed branch=${t} error=${iR(e)}`),{ok:!1,reason:`checkout-failed`})}}async function hH(e,t){let{git:n}=ko(e,{timeoutMs:15e3}),r=e=>n.raw([`rev-parse`,`--verify`,e]).then(e=>e.trim()).catch(()=>null);try{await n.raw([`fetch`,`origin`,t])}catch(e){return lH.warn({branch:t,err:e},`action=ff-fetch-failed branch=${t} error=${iR(e)}`),`unavailable`}let i=await r(`refs/remotes/origin/${t}`);if(!i)return`unavailable`;let a=await r(`refs/heads/${t}`);if(!a||a===i)return`up-to-date`;let o=await n.raw([`merge-base`,a,i]).then(e=>e.trim()).catch(()=>``);if(o===a){try{await n.raw([`fetch`,`origin`,`${t}:${t}`])}catch(e){return lH.warn({branch:t,err:e},`action=ff-advance-failed branch=${t} error=${iR(e)}`),`unavailable`}return await r(`refs/heads/${t}`)===i?`advanced`:`unavailable`}return o===i?`up-to-date`:`diverged`}const gH=(e,t)=>{let n=Ac(`git`,[`config`,`--get`,t],AA({cwd:e,encoding:`utf-8`,timeout:5e3}));return n.status!==0||!n.stdout?null:n.stdout.trim()||null};function _H(e){let t=Ac(`git`,[`rev-parse`,`--git-dir`],AA({cwd:e,encoding:`utf-8`,timeout:5e3})),n=Ac(`git`,[`rev-parse`,`--git-common-dir`],AA({cwd:e,encoding:`utf-8`,timeout:5e3}));return t.status!==0||n.status!==0?!1:z(e,t.stdout.trim())!==z(e,n.stdout.trim())}function vH(e){let t=Ac(`git`,[`config`,`--local`,`--get`,`extensions.worktreeConfig`],AA({cwd:e,encoding:`utf-8`,timeout:5e3}));if(t.status===0&&/^(true|yes|on|1)$/i.test(t.stdout.trim()))return;let n=Ac(`git`,[`config`,`--local`,`extensions.worktreeConfig`,`true`],AA({cwd:e,encoding:`utf-8`,timeout:5e3}));if(n.status!==0){let e=n.stderr?.trim()??``,t=n.error?` [${n.error.message}]`:``;throw Error(`failed to enable extensions.worktreeConfig: ${e}${t}`)}}async function yH(e,t,n,r=gH){let i=r(e,`user.name`),a=r(e,`user.email`);if(i&&a)return{name:i,email:a};if(t&&n){let e=await t.get(n);if(e){let t=e.name??e.login,n=e.email??`${e.login}@users.noreply.github.com`;if(t)return{name:t,email:n}}}return null}function bH(e,t,n){let r=`--local`;_H(e)&&(vH(e),r=`--worktree`);let i=(t,n)=>{let i=Ac(`git`,[`config`,r,t,n],AA({cwd:e,encoding:`utf-8`,timeout:5e3}));if(i.status!==0){let e=i.stderr?.trim()??``,n=i.error?` [${i.error.message}]`:``;throw Error(`git config ${r} ${t} failed: ${e}${n}`)}};i(`user.name`,t),i(`user.email`,n)}function xH(e,t){return async(n,r,...i)=>{try{await e(n,r,...i)}catch(e){if(e instanceof he||e instanceof Error&&e.name===`BridgeMergeContentLossError`)throw e;G(r,500,`urn:ok:error:internal-server-error`,t.title??`Internal server error.`,{handler:t.handler,cause:e})}}}function SH(e,t){let n=Object.keys(e).join(`, `);return async(r,i)=>{let a=r.method===void 0?void 0:e[r.method];if(a){await a(r,i);return}G(i,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:t.handler,extraHeaders:{Allow:n}})}}const CH=`config.yml`;function wH(e,t){let n;try{n=Jc(e)}catch(e){if(e.code===`ENOENT`)return;throw e}if(n.isSymbolicLink())throw Error(`Refusing to follow symlink at ${t} (${e}). An untrusted upstream may have committed this symlink to redirect writes outside the project. Remove the symlink and re-run.`)}function TH(e){let[t=`0`,n=`0`]=e.split(`.`);return`${t.length>0?t:`0`}.${n.length>0?n:`0`}`}function EH(e){return/^[A-Za-z0-9._\-/]+$/.test(e)?e:JSON.stringify(e)}function DH(e,t){let n=`# yaml-language-server: $schema=https://unpkg.com/@inkeep/open-knowledge@latest/dist/schemas/${pa}/config.project.schema.json
|
|
125
125
|
# OpenKnowledge — project configuration
|
|
126
126
|
#
|
|
127
127
|
# This file overrides built-in defaults for this project. Every key below
|
|
@@ -3261,4 +3261,4 @@ Incremental by default — don't re-read the whole repo.
|
|
|
3261
3261
|
`)){let r=n.trim();if(r===``)continue;if(r.startsWith(`C\0`)){let[,e,t]=r.split(`\0`);o=e&&t?{name:e,email:t}:null;continue}if(!o||!r.endsWith(`.md`)&&!r.endsWith(`.mdx`))continue;let a=z(e,r);if(!SM(a,t))continue;let s=Bk(a,t);i.has(s)||B(a)&&i.set(s,o)}return i}function w9(e){C9();let{contentDir:t,projectDir:n=t,quiet:r=!0,debounce:i=2e3,maxDebounce:a=1e4,gitEnabled:o=!0,commitDebounceMs:s=3e4,wipRef:l=`refs/wip/main`,configHomedirOverride:u,enableTestRoutes:d=!1,shadowRepo:f,contentRoot:p,destroyTimeoutMs:m=1e4,localOpCliArgs:h,skipStateManifestCheck:g=!1,singleDocRelPath:_,ephemeral:v=!1}=e,y=I(`server`);function b(){let e=Va({absPath:Wa(`project`,n),sideline:!1,warn:e=>y.warn({message:e},`[config] could not read project config`)});if(!e.valid){let t=Ta(e.error)&&e.error.code===`SCHEMA_INVALID`?e.error.issues.filter(e=>e.path.map(String).join(`.`)===`content.attachmentFolderPath`):[];if(t.length>0){let e=t.map(e=>e.message).join(`; `);throw Error(`Invalid content.attachmentFolderPath in project config: ${e}`)}y.warn({},`[config] committed content.attachmentFolderPath unavailable (project config invalid) — using default attachment placement`)}return e.value.content.attachmentFolderPath??`./`}function x(){let e=Va({absPath:Wa(`project-local`,n),sideline:!1,warn:e=>y.warn({message:e},`[config] could not read project-local config`)}),t=e.value.autoSync?.enabled;if(t!=null)return t===!0;e.valid||y.warn({},`[config] project-local autoSync.enabled unavailable (config invalid) — falling back to the committed project default`);let r=Va({absPath:Wa(`project`,n),sideline:!1,warn:e=>y.warn({message:e},`[config] could not read project config`)});return r.valid||y.warn({},`[config] committed autoSync.default unavailable (project config invalid) — defaulting to disabled`),r.value.autoSync?.default===!0}function S(){let e=Va({absPath:Wa(`project`,n),sideline:!1,warn:e=>y.warn({message:e},`[config] could not read project config for linter`)}).value.contentRules;return e?Wn(e):Gr}function C(){return vF(n,{configHomedirOverride:u,onWarn:e=>y.warn({message:e},`[config] could not read project-local config`)})}function w(){let e=Va({absPath:Wa(`project-local`,n,u),sideline:!1,warn:e=>y.warn({message:e},`[config] could not read project-local config`)});return e.valid?e.value.linkPreviews?.enabled===!0:!1}function te(e){return`${fF(e.baseUrl)}|${e.model}|${e.dimensions??1536}`}function ne(e){let t;(e===`__config__/project`||e===`__local__/project`)&&(t=x(),st?.setEnabled(t).catch(n=>{y.warn({err:n,enabled:t,docName:e},`[sync] failed to apply autoSync.enabled from config`)}));let n=C();we.applyConfig({enabled:n.enabled,providerFingerprint:te(n)}),y.info({docName:e,autoSyncEnabled:t,semanticEnabled:n.enabled},`[config] applied persisted config to in-process consumers`)}go();let re=Ml(),ie=nN(n),T=new wu({localDir:ie,log:I(`acp-registry`)}),oe=new gu(ie,I(`acp-permissions`));if(Uo(ie,{port:e.port??0,worktreeRoot:n,kind:e.lockKind??`interactive`,capabilities:[`http`,`ws`]}),!g)try{a9({lockDir:ie,shadowRepoDir:Yl(n)})}catch(e){throw Po(ie),e}let se=Xr(),ce=(e,t)=>se.resolveEmbed(e,t),le=(e,n)=>{let r=se.resolveEmbed(e,n);if(!r&&e.includes(`/`)&&(r=e.replace(/^\.?\//,``)),!r)return null;let i=z(t,r);if(!bk(i,z(t)))return null;try{let e=ol(i);return e.isFile()?e.size:null}catch{return null}},ue,fe,E,pe,me,he,ge,_e,ve=null,ye=null,be=null,xe=null,Se=null,Ce=C(),we=new Hae({loadEmbedder:e.embedderLoader??(()=>{let t=C();return Nae({keyStore:e.embeddingsKeyStore??null,config:{baseUrl:t.baseUrl,model:t.model,dimensions:t.dimensions}})}),cacheDir:L(nN(n),`embeddings`),enabled:Ce.enabled,providerFingerprint:te(Ce)}),Te=null,Ee=new Set,De=!1,Oe=[],ke,Ae,je,Me=new Promise((e,t)=>{Ae=e,je=t});function Ne(e){ve?.signal(e)}let Pe=null;function Fe(){Pe!==null&&clearTimeout(Pe),Pe=setTimeout(()=>{Pe=null,fe.saveToDisk().catch(e=>{I(`backlinks`).warn({err:e},`Failed to persist debounced cache`)}),E.saveToDisk().catch(e=>{I(`tag-index`).warn({err:e},`Failed to persist debounced tag snapshot`)})},2e3)}let Ie=null,Le=!1,Re=()=>{try{X7(n,ze.entries())}catch(e){y.warn({err:e},`[removed-docs-journal] failed to persist removal journal`)}},ze=new Zhe(void 0,{onEviction:()=>mre(),onSizeChange:e=>hre(e),onMutate:()=>{!Le||Ie!==null||(Ie=setTimeout(()=>{Ie=null,Re()},2e3))}});for(let[e,r]of ege(n))qx(e)||Yq(e)&&([`.md`,`.mdx`].some(n=>{let r=z(t,`${e}${n}`);return bk(r,z(t))&&B(r)})||ze.restore(e,r));Le=!0;let Be=(e,t)=>{qx(e)||ze.setRenamed(e,t)},Ve=e=>{if(!qx(e)){if(ze.peek(e)?.kind===`renamed`){console.info(JSON.stringify({event:`recently-removed-docs-unpaired-delete-suppressed`,docName:e,source:`watcher-delete`}));return}ze.setDeleted(e)}},He=e=>{qx(e)||ze.delete(e)};try{ue=VI({projectDir:n,contentDir:t,singleDocRelPath:_,onAfterRebuild:()=>{fe.rebuildFromDisk(EM()).catch(e=>{I(`server-factory`).warn({err:e},`[content-filter] backlink-index rebuild failed after onAfterRebuild`)}),E.init().catch(e=>{I(`server-factory`).warn({err:e},`[content-filter] tag-index rebuild failed after onAfterRebuild`)}),cA(at).then(({prunedFiles:e,prunedFolders:t})=>{let n=e+t;n>0?I(`server-factory`).info({pruned:n,prunedFiles:e,prunedFolders:t},`[content-filter] reconciled file indexes after onAfterRebuild`):I(`server-factory`).debug({prunedFiles:e,prunedFolders:t},`[content-filter] file index reconcile completed after onAfterRebuild (no entries pruned; rescan may have added entries)`)}).catch(e=>{I(`server-factory`).warn({err:e},`[content-filter] file index reconcile failed after onAfterRebuild`)})}}),fe=new qV({projectDir:n,contentDir:t,contentFilter:ue}),E=new x9({projectDir:n,contentDir:t,contentFilter:ue}),(async()=>{await E.loadFromDisk()?await E.reconcileWithDisk():await E.init()})().catch(e=>{I(`server-factory`).warn({err:e},`[server-factory] tag-index warm boot failed; continuing with empty index`)}),pe={current:f},me=o?Khe({getShadow:()=>pe.current??null,getCurrentBranch:()=>ot?.getLastKnownBranch()??null,contentRoot:p??``,projectGitDir:Jl(n)??void 0,isWriterLive:e=>{if(!be&&!_e)return I(`server-factory`).debug({writerId:e},`[server-factory] isWriterLive called before liveness deps populated — treating writer as dead`),!1;if(be?.getPresenceMap()[e])return!0;let t=e.startsWith(`agent-`)?e.slice(6):e;for(let e of _e?.sessionsForConnection(t)??[])return!0;return!1}}):void 0,he=IM({contentDir:t,projectDir:n,gitEnabled:o,commitDebounceMs:s,wipRef:l,shadowRef:pe,ephemeral:v,contentRoot:p,backlinkIndex:fe,configHomedirOverride:u,getCurrentBranch:()=>ot?.getLastKnownBranch()??null,resolveEmbed:ce,resolveSize:le,getPrincipal:()=>Te,onAgentCommit:()=>ve?.signal(`session-activity`),onFlushCommit:()=>me?.noteFlushCommit(),onDiskFlush:(e,t,n,r)=>{ve?.emitDiskAck(e,t),!qx(e)&&UM(r,n)&&(xe?.(),Ne(`files`))},onConfigRejected:(e,t)=>ve?.emitConfigValidationRejected(e,t),onConfigPersisted:ne,isRecentlyRemoved:e=>ze.has(e),mdManager:e.mdManager}),ge=new hhe({quiet:r,debounce:i,maxDebounce:a,extensions:[he.extension]});let c=ge;Oe.push(Bj(()=>c.documents.size),Vj(()=>he.getQueueDepths()),Uj(()=>{let e=0;for(let t of c.documents.values())e+=t.directConnectionsCount;return{websocket:c.getConnectionsCount()-e,direct:e}})),Gj(),v||(Se=Yhe({getLoadedDocuments:()=>c.documents,forceStore:(e,t)=>he.forceStore(e,t),readDiskBytes:e=>{let n=xM(e,t),r,i;try{r=nl(n),i=ol(r).size}catch(t){let n=Ko(t);if(n===`ENOENT`)return null;throw n===`ELOOP`?new G7(`symlink cycle at content path: ${e}`):t}if(!SM(r,t))throw new G7(`symlink-escape: ${n} resolves outside the content dir`);if(i>524288)throw new G7(`document exceeds the open byte limit: ${e}`);try{return V(r,`utf-8`)}catch(e){if(Ko(e)===`ENOENT`)return null;throw e}},graceMs:e.stalenessGraceMs,sweepIntervalMs:e.stalenessSweepIntervalMs}));let m=ge.shouldUnloadDocument.bind(ge);ge.shouldUnloadDocument=e=>{if(Ee.has(e)||De&&m(e))return!0;let t=e.name;return qx(t)||DM(t)!==void 0||e.getXmlFragment(`default`).length!==0||e.getText(`source`).length!==0?!1:m(e)},ke=async e=>{Ee.add(e);try{await ge.unloadDocument(e)}finally{Ee.delete(e)}},ve=new Xx(ge),ye=new Mw(ge),be=new Nw(ge),_e=new lC(ge);let g=_e;Oe.push(Wj(()=>({active:g.liveSessionCount,limit:g.sessionLimit})));let y=A7({backlinkIndex:fe,tagIndex:E,signalChannel:Ne});ge.configuration.extensions.push(y),ge.configuration.extensions.push({__kind:`principal-auth`,async onAuthenticate(e){let t=e.token,n=mD(t),r=n?.expectedServerInstanceId;if(typeof r==`string`&&r.length>0&&r!==re)throw new pD(`server-instance-mismatch`,`server instance mismatch: client claimed ${r}, this server is ${re}`);let i=n?.expectedBranch,a=EM();if(typeof i==`string`&&i.length>0&&i!==a)throw new pD(`branch-mismatch`,`branch mismatch: client claimed ${i}, server is on ${a}`);if(!n)return;let o=e.context;typeof n.principalId==`string`&&(Te&&n.principalId===Te.id?o.principalId=Te.id:Te?console.warn(JSON.stringify({event:`principal-token-mismatch`,claimed:n.principalId,loaded:Te.id})):o.principalId=n.principalId),typeof n.tabSessionId==`string`&&(o.tabSessionId=n.tabSessionId),o.kind=`human`}}),ge.configuration.extensions.push({__kind:`config-doc-admission-guard`,async onAuthenticate(e){if(!Wx(e.documentName)&&!Gx(e.documentName))return;let t=e.request,n=t.socket?.remoteAddress;if(n!==void 0&&!_W(n))throw Error(`config-doc admission requires loopback peer (peer=${n}, doc=${e.documentName})`);let r=e.requestHeaders,i=(r&&typeof r.get==`function`?r.get(`host`):null)??t.headers?.host??void 0;if(!vW(i))throw Error(`config-doc admission requires loopback Host header (host=${i??`<absent>`}, doc=${e.documentName})`)}});let x=z(t);function ee(e){if(!Yq(e))return null;let t=z(x,aS(e));return bk(t,x)?t:null}ge.configuration.extensions.push({__kind:`removal-redirect-guard`,async onAuthenticate(e){await Qhe(e.documentName,{recentlyRemovedDocs:ze,resolveFilePath:ee,fileExists:B})}}),ge.configuration.extensions.push({__kind:`doc-lineage-guard`,async onAuthenticate(e){let t=mD(e.token);The(e.documentName,t?.expectedDocLineageEpoch,{getLoadedDoc:e=>ge.documents.get(e)})}}),ge.configuration.extensions.push({__kind:`system-doc-broadcast-guard`,async beforeHandleMessage(e){if(e.documentName!==`__system__`)return;let t=new r7(e.update);if(t.readVarString(),t.readVarUint()===m7.BroadcastStateless)throw Error(`inbound BroadcastStateless on ${de} rejected — server-only channel`)}});let te=Zq({hocuspocus:ge,sessionManager:_e,contentDir:t,contentFilter:ue,serverInstanceId:re,getFileIndex:()=>at?at.getFileIndex():new Map,getAttachmentFolderPath:b,getAllFilesIndex:()=>at?at.getAllFilesIndex():new Map,getFileIndexGeneration:()=>at?.getFileIndexGeneration()??0,mutateFileIndex:e=>at?.mutateFileIndex(e),getFolderIndex:()=>at?at.getFolderIndex():new Map,getAliasMap:()=>at?at.getAliasMap():new Map,getFolderAliasIndex:()=>at?at.getFolderAliasIndex():new Map,rescanFiles:()=>at?.rescanFromDisk(),enableTestRoutes:d,shadowRef:pe,flushGitCommit:()=>he.flushPendingGitCommit(),flushContributors:()=>he.flushContributors(),takeStoreFailure:e=>he.takeStoreFailure(e),takeStoreDivergence:e=>he.takeStoreDivergence(e),markAgentWriteStore:e=>he.markAgentWriteStore(e),getCurrentBranch:()=>ot?.getLastKnownBranch()??null,getDiskAckSVs:()=>ve?.getLatestDiskAckSVsAsBase64()??{},contentRoot:p,backlinkIndex:fe,tagIndex:E,signalChannel:Ne,agentFocusBroadcaster:ye,agentPresenceBroadcaster:be,onAgentWrite:e.onAgentWrite,getSyncEngine:()=>st,localOpCliArgs:h,projectDir:n,resolveEmbed:ce,getPrincipal:()=>Te,acpRegistry:T,loadAcpCustomAgents:()=>Tu(ie,I(`acp-registry`)),homeDirOverride:u,forceUnloadDocument:ke,ready:Me,recentlyRemovedDocs:ze,serializeDoc:qe,evictManagedArtifactLkg:e=>{he.managedArtifactCtx.lkgCache.delete(e)},semanticSearch:we,getSemanticSimilarityFloor:()=>C().similarityFloor,getLinterBaseConfig:()=>S(),getLinkPreviewsEnabled:w,embeddingsSecretsFile:hF(u),ephemeral:v,onReferencedAssetsCacheInvalidator:e=>{xe=e}});ge.configuration.extensions.push(te),ge.configuration.extensions.push(Q7({mdManager:Ra,schema:La,shadowRef:pe,contentRoot:p,getCurrentBranch:()=>ot?.getLastKnownBranch()??null,resolveEmbed:ce,resolveSize:le})),ge.configuration.extensions.push(Fge()),ge.configuration.extensions.push(whe({getSyncEngine:()=>st,projectDir:n,contentDir:t}))}catch(e){for(let e of Oe.splice(0))e();throw Se?.dispose(),Se=null,Po(ie),e}let Ue=null,We=new Map,Ge=[];function Ke(e,t){let n=z(e,`rescue`),r=z(n,aS(t));return bk(r,n)?r:null}function qe(e){let t=ge.documents.get(e);return t?ok(t):null}let Je=(e,t)=>rk(ge,e,t,ce,le);function Ye(e){if(!hS(e))return;let t=e.getMap(`lifecycle`);t.delete(`status`),t.delete(`reason`)}let Xe=e=>{if(!e)return;let t=`[[${e}]]`;for(let[n]of ge.documents){if(qx(n))continue;let r=ge.documents.get(n);if(!r)continue;let i=r.getText(`source`).toString();if(i.includes(t))try{r.transact(()=>{nk(r,i,ce,n)},tk)}catch(t){y.error({err:t,docName:n,assetBasename:e},`[asset-event] failed to re-render ${n} for asset basename ${e}`)}}},Ze=null,Qe=e=>{e&&(Ze===null&&(Ze=new Set,setImmediate(()=>{let e=Ze;if(Ze=null,e)try{for(let t of e)Xe(t)}catch(t){y.error({err:t,basenames:[...e]},`[asset-event] dedup rerender pass crashed`)}})),Ze.add(e))};function $e(e){switch(e.kind){case`rename`:return e.newDocName;case`asset-create`:case`asset-delete`:case`folder-create`:case`folder-delete`:case`file-create`:case`file-update`:case`file-delete`:return e.relativePath;case`create`:case`update`:case`delete`:case`conflict`:return e.docName;default:return Sk(e)}}async function et(e){try{switch(e.kind){case`create`:y.info({docName:e.docName},`[reconcile] create: ${e.docName}`),fe.updateDocumentFromMarkdown(e.docName,e.content),Fe(),E.updateDocumentFromMarkdown(e.docName,e.content),Ne(`files`),Ne(`backlinks`),Ne(`graph`),Ne(`tags`),He(e.docName);break;case`update`:{let{docName:t,content:n}=e,r=ge.documents.get(t);if(!r){fe.updateDocumentFromMarkdown(t,n),Fe(),E.updateDocumentFromMarkdown(t,n),Ne(`backlinks`),Ne(`graph`),Ne(`tags`);return}let i=DM(t)??``,a=qe(t)??i,o=XD({docName:t,base:i,ours:a,theirs:n}),s=kk(i).slice(0,6),c=kk(a).slice(0,6),l=kk(n).slice(0,6);switch(y.info({docName:t,base:s,ours:c,theirs:l,result:o.kind},`[reconcile] ${t} base=${s} ours=${c} theirs=${l} result=${o.kind}`),o.kind){case`noop`:Ye(r),fe.updateDocumentFromMarkdown(t,n),Fe(),E.updateDocumentFromMarkdown(t,n),Ne(`backlinks`),Ne(`graph`),Ne(`tags`);break;case`clean`:try{Je(t,o.newContent),OM(t,o.newContent),wx(),Ye(r),fe.updateDocumentFromMarkdown(t,n),Fe(),E.updateDocumentFromMarkdown(t,n),Ne(`backlinks`),Ne(`graph`),Ne(`tags`)}catch(e){y.error({err:e,docName:t},`[reconcile] failed to apply clean content to Y.Doc for ${t}`),OM(t,n),Ye(r)}break;case`merged`:try{Je(t,o.newContent),OM(t,n),wx(),Ye(r),fe.updateDocumentFromMarkdown(t,n),Fe(),E.updateDocumentFromMarkdown(t,n),Ne(`backlinks`),Ne(`graph`),Ne(`tags`)}catch(e){y.error({err:e,docName:t},`[reconcile] failed to apply merged content to Y.Doc for ${t}`),OM(t,n),Ye(r)}break;case`conflicts`:try{Je(t,o.newContent),OM(t,o.newContent),wx(),Tx(),fe.updateDocumentFromMarkdown(t,n),Fe(),E.updateDocumentFromMarkdown(t,n),Ne(`backlinks`),Ne(`graph`),Ne(`tags`)}catch(e){y.error({err:e,docName:t},`[reconcile] failed to apply conflict content to Y.Doc for ${t}`),OM(t,n)}{let e=r.getMap(`lifecycle`);e.set(`status`,`conflict`),e.set(`reason`,`merged-with-markers`)}break;case`refused`:{Tx();let e=r.getMap(`lifecycle`);e.set(`status`,`conflict`),e.set(`reason`,o.reason);break}}break}case`delete`:{let{docName:t}=e,n=ge.documents.get(t);if(!n){fe.deleteDocument(t),Fe(),E.deleteDocument(t),Ne(`files`),Ne(`backlinks`),Ne(`graph`),Ne(`tags`),Ve(t),console.info(JSON.stringify({event:`recently-removed-docs-populate`,docName:t,kind:`deleted`,source:`watcher-delete`}));return}let r=DM(t)??``,i=qe(t)??``,a=i!==r;if(a&&pe.current){let e=pe.current,n=ot?.getLastKnownBranch()??`main`;queueMicrotask(()=>{UO(e,p??``,{kind:`external-change-rescue`,docName:t,contents:i,label:`External change recovered @ ${new Date().toISOString()}`,branch:n,metadata:{incomingDiskSha:``}}).then(()=>{Dx(),y.info({docName:t},`[reconcile] rescue checkpoint saved (delete): ${t}`)}).catch(e=>{y.error({docName:t,err:e},`[reconcile] rescue checkpoint write failed: ${t}`)})})}n.getMap(`lifecycle`).set(`status`,`deleted-upstream`),kM(t),fe.deleteDocument(t),Fe(),E.deleteDocument(t),y.info({docName:t,isDirty:a},`[reconcile] delete: ${t} (dirty=${a})`),ge.closeConnections(t),await ke(n),Ne(`files`),Ne(`backlinks`),Ne(`graph`),Ne(`tags`),Ve(t),console.info(JSON.stringify({event:`recently-removed-docs-populate`,docName:t,kind:`deleted`,source:`watcher-delete`}));break}case`rename`:{let{oldDocName:t,newDocName:n,content:r}=e,i=ge.documents.get(t);if(kM(t),OM(n,r),fe.renameDocument(t,n,r),Fe(),E.renameDocument(t,n,r),i){let e=i.getMap(`lifecycle`);e.set(`status`,`renamed`),e.set(`newPath`,n)}y.info({oldDocName:t,newDocName:n},`[reconcile] rename: ${t} → ${n}`),Ne(`files`),Ne(`backlinks`),Ne(`graph`),Ne(`tags`),Be(t,n),console.info(JSON.stringify({event:`recently-removed-docs-populate`,from:t,to:n,kind:`renamed`,source:`watcher-rename`}));break}case`conflict`:{let{docName:t}=e,n=ge.documents.get(t);if(!n)return;let r=qe(t);r===null?y.warn({docName:t},`[reconcile] case 'conflict': serializeDoc returned null for ${t}; reconciledBase snapshot skipped — post-resolution reconcile may degrade to 3-way merge`):OM(t,r);let i=n.getMap(`lifecycle`);i.set(`status`,`conflict`),i.set(`reason`,`conflict-markers`),y.info({docName:t},`[reconcile] conflict markers detected: ${t}`);break}case`asset-create`:se.add(e.relativePath),Ne(`files`),Qe(Mc(e.relativePath));break;case`asset-delete`:se.remove(e.relativePath),Ne(`files`),Qe(Mc(e.relativePath));break;case`folder-create`:case`folder-delete`:Ne(`files`);break;case`file-create`:case`file-update`:case`file-delete`:Ne(`files`);break;default:Sk(e)}}catch(t){let n=$e(e);y.error({err:t,kind:e.kind,label:n},`[reconcile] failed to handle ${e.kind} for ${n}`)}}let tt=[];async function nt(e){if(PM()){tt.push(e);return}await et(e)}async function rt(){let e=tt.splice(0,tt.length);for(let t of e)await et(t)}let at=null,ot=null,st=null,ct=null;async function lt(e){if(ge.documents.size===0)return;let t=!1,n=new Promise(e=>{ge.configuration.extensions.push({async afterUnloadDocument({instance:n}){!t&&n.getDocumentsCount()===0&&(t=!0,e())}})}),r=Array.from(ge.documents.keys());ge.closeConnections(),ge.flushPendingStores();for(let e of ge.documents.values())e.getConnectionsCount()===0&&ge.unloadDocument(e).catch(t=>{console.warn(JSON.stringify({event:`ok-shutdown-unload-document-failed`,docName:e.name,reason:t instanceof Error?t.message:String(t)}))});let i,a=new Promise((n,a)=>{i=setTimeout(()=>{t=!0;let n=Array.from(ge.documents.keys()),i=[],o=[];if(pe.current){for(let e of n)if(!qx(e))try{let t=qe(e);if(t===null){y.warn({docName:e},`[rescue] skipping ${e} — document dropped from map mid-rescue`),o.push(e);continue}let n=Ke(pe.current.gitDir,e);if(!n){y.warn({docName:e,gitDir:pe.current.gitDir},`[rescue] path-traversal guard rejected docName: ${e}`),o.push(e);continue}Yc(Pc(n),{recursive:!0}),cl(n,t,`utf-8`),Dx(),i.push(e),y.info({docName:e},`[rescue] rescue buffer saved on flush timeout: ${e}`)}catch(t){o.push(e),y.error({err:t,docName:e},`[rescue] failed to write rescue buffer for ${e}`)}}else y.warn({stillLoadedCount:n.length},`[rescue] shadow repo unavailable at flush timeout — ${n.length} doc(s) will be lost: [${n.join(`, `)}]`),o.push(...n);let s=i.length>0||o.length>0?` — rescued [${i.join(`, `)}]${o.length>0?`, lost [${o.join(`, `)}]`:``}`:``;a(Error(`flushAllStoresAndWait timeout after ${e}ms — ${n.length}/${r.length} docs did not unload: [${n.join(`, `)}]${s}`))},e)});try{await Promise.race([n,a])}finally{i!==void 0&&clearTimeout(i)}}async function ut(){return ct||(ct=(async()=>{let e=Date.now(),t=[];De=!0;for(let e of Oe.splice(0))e();try{await Se?.dispose()}catch(e){y.warn({err:e},`[server] staleness watchdog drain failed during destroy`)}Se=null;try{Wo(ie)}catch(e){y.warn({err:e},`[server] failed to mark server.lock draining`)}if(Pe!==null&&(clearTimeout(Pe),Pe=null),E.close(),Ie!==null&&(clearTimeout(Ie),Ie=null),Le)try{X7(n,ze.entries())}catch(e){y.warn({err:e},`[removed-docs-journal] failed to persist removal journal during shutdown`),t.push({phase:`removed-docs-journal-flush`,error:String(e)})}let r,i=await Promise.race([Me.then(()=>`completed`,e=>(y.debug({err:e},`[server] init incomplete during shutdown`),`failed`)),new Promise(e=>{r=setTimeout(()=>e(`timeout`),5e3)})]);r!==void 0&&clearTimeout(r),i===`timeout`&&y.warn({},`[server] init did not complete within 5s during shutdown`);let a=ge.documents.size;me?.destroy();try{try{try{ot&&=(await ot.unsubscribe(),null),at&&=(await at.unsubscribe(),null);for(let{docName:e,cleanup:t}of Ge)try{await t()}catch(t){y.warn({err:t,docName:e},`[server] failed to stop config-file-watcher for ${e}`)}Ge.length=0}catch(e){t.push({phase:`watcher-unsubscribe`,error:e instanceof Error?e.message:String(e)}),y.error({err:e},`[server] shutdown phase-1 watcher unsubscribe failed`)}try{ve?.destroy(),be?.destroy(),Ue&&=(await Ue.disconnect(),null);for(let[e,t]of We)try{await t.disconnect()}catch(t){y.warn({err:t,docName:e},`[server] failed to disconnect ${e} during shutdown`)}We.clear()}catch(e){t.push({phase:`cc1-teardown`,error:e instanceof Error?e.message:String(e)}),y.error({err:e},`[server] shutdown phase-1b CC1 teardown failed`)}try{await _e.closeAll()}catch(e){t.push({phase:`agent-session-drain`,error:e instanceof Error?e.message:String(e)}),y.error({err:e},`[server] shutdown phase-2 agent session drain failed`)}try{await Fre()}catch(e){t.push({phase:`parse-pool-teardown`,error:e instanceof Error?e.message:String(e)}),y.error({err:e},`[server] shutdown phase-2b parse pool teardown failed`)}try{await lt(m)}catch(e){t.push({phase:`flush-all-stores`,error:e instanceof Error?e.message:String(e)}),y.error({err:e},`[server] shutdown phase-3 flush failed`)}let e;try{await Promise.race([(async()=>{await he.flushPendingGitCommit(),await he.waitForPendingCommits()})(),new Promise((t,n)=>{e=setTimeout(()=>n(Error(`L2 git flush timeout`)),m)})])}catch(e){t.push({phase:`git-commit-flush`,error:e instanceof Error?e.message:String(e)}),y.error({err:e},`[server] shutdown phase-4 git commit flush failed`)}finally{e!==void 0&&clearTimeout(e)}try{st&&=(await st.destroy(),null)}catch(e){t.push({phase:`sync-engine-stop`,error:e instanceof Error?e.message:String(e)}),y.error({err:e},`[server] shutdown sync-engine-stop failed`)}}finally{if(pe.current){try{let e=(await Eo({baseDir:n,timeout:{block:5e3}}).revparse(`HEAD`)).trim();e&&cl(z(pe.current.gitDir,`last-known-head`),e,`utf-8`)}catch{}try{wO(pe.current)}catch(e){t.push({phase:`shadow-repo-release`,error:e instanceof Error?e.message:String(e)}),y.error({err:e},`[server] shutdown phase-5 destroyShadowRepo failed`)}}let r=Date.now()-e;t.length===0?y.info({documentCount:a,durationMs:r},`[server] shutdown flushed ${a} documents in ${r}ms`):y.warn({documentCount:a,durationMs:r,phaseErrors:t},`[server] shutdown flushed ${a} documents in ${r}ms with ${t.length} phase error(s)`)}}finally{try{Po(ie,{deferUnlinkToExit:!0})}catch(e){t.push({phase:`server-lock-release`,error:e instanceof Error?e.message:String(e)}),y.error({err:e},`[server] shutdown phase-6 releaseServerLock failed`)}try{await ho()}catch(e){t.push({phase:`telemetry-shutdown`,error:e instanceof Error?e.message:String(e)})}}})(),ct)}let dt=[];async function ft(){try{Te=await K7(n),y.info({principalId:Te.id},`[server] principal loaded`)}catch(e){y.warn({err:e},`[server] principal load failed — browser writes will use SERVICE_WRITER`)}if(!pe.current)try{pe.current=await CO(n),y.info({gitDir:pe.current.gitDir},`[server] history repo initialized at ${pe.current.gitDir}`)}catch(e){y.error({err:e},`[server] history repo init failed`),dt.push(`shadow-repo`)}if(pe.current){let e=null;try{e=WA(pe.current.gitDir),pj(pe.current.gitDir,e),YA(pe.current.gitDir,e),y.info({entries:e.byTo.size},`[server] rename log loaded (${e.byTo.size} entries)`)}catch(e){y.warn({err:e},`[rename-log] boot-time load/sweep failed; rename history unavailable`)}if(e){let t=1e4;try{await Promise.race([mj(pe.current,e,{rebuild:!0}),new Promise((e,n)=>setTimeout(()=>n(Error(`boot-time GC exceeded ${t}ms`)),t))])}catch(e){y.warn({err:e},`[rename-log] boot-time GC/rebuild failed; index loaded without GC`)}}try{await me?.runBootMaintenance()}catch(e){y.warn({err:e},`[shadow-maintenance] boot maintenance failed (non-fatal)`)}}if(pe.current)try{await bO(pe.current).raw(`rev-parse`,`--git-dir`)}catch(e){let t=e instanceof Error?e.message:String(e);if(t.includes(`not a git repository`)||t.includes(`invalid object`)){y.warn({},`[server] history repo appears corrupted — reinitializing`);try{pe.current=await CO(n)}catch(e){y.error({err:e},`[server] history repo reinit failed`),pe.current=void 0,dt.includes(`shadow-repo`)||dt.push(`shadow-repo`)}}else y.error({err:e},`[server] history repo check failed (transient?)`)}if(pe.current)try{let e=z(pe.current.gitDir,`last-known-head`),t=null;try{t=V(e,`utf-8`).trim()||null}catch{}let r=null;try{r=(await Eo({baseDir:n,timeout:{block:1e4}}).revparse(`HEAD`)).trim()||null}catch{}if(r!==null){if(r!==t){let e=`main`;try{let t=(await Eo({baseDir:n,timeout:{block:1e4}}).raw(`rev-parse`,`--abbrev-ref`,`HEAD`)).trim();t&&t!==`HEAD`&&(e=t)}catch{}y.info({lastKnownHead:t,currentHead:r,branch:e},`[head-drift] lastKnownHead=${t??`null`}, currentHead=${r}, action=import`);try{await zO(pe.current,p??``,t,r,e),Ex()}catch(e){y.warn({err:e},`[head-drift] commitUpstreamImport failed — continuing`)}}else y.info({currentHead:r},`[head-drift] lastKnownHead=${t??`null`}, currentHead=${r}, action=noop`);try{cl(e,r,`utf-8`)}catch(e){y.warn({err:e},`[head-drift] failed to write last-known-head`)}}}catch(e){y.warn({err:e},`[head-drift] check failed — continuing`)}try{let e=RW(t,n);if(e.recovered&&e.journal){let t=e.journal.version===2?e.journal.fromPath:e.journal.sourceDocName,n=e.journal.version===2?e.journal.toPath:e.journal.destinationDocName;y.warn({journalVersion:e.journal.version,fromPath:t,toPath:n,restoredDocNames:e.restoredDocNames},`[managed-rename] recovered pending rename ${t} -> ${n}`)}}catch(e){y.error({err:e},`[server] managed rename recovery failed`),dt.push(`managed-rename-recovery`)}try{let e=mV(n);(e.deleted>0||e.errors>0)&&y.info({scanned:e.scanned,deleted:e.deleted,errors:e.errors},`[upload-tempfile-sweep] swept ${e.deleted} orphan tempfile(s)`)}catch(e){y.error({err:e},`[server] upload-tempfile sweep failed`),dt.push(`upload-tempfile-sweep`)}try{Ue=await ge.openDirectConnection(de),ve?.emitServerInfo(re,EM())}catch(e){y.error({err:e},`[server] failed to open __system__ direct connection — CC1 push disabled`),dt.push(`cc1-push`)}let r=v?[]:ae;for(let e of r)try{let t=await ge.openDirectConnection(e);We.set(e,t)}catch(t){y.error({err:t,docName:e},`[server] failed to open ${e} direct connection — config bind degraded`),dt.push(`config-doc:${e}`)}let i=new Map([[it,Wa(`project`,n)],[_r,Wa(`project-local`,n)],[c,Wa(`user`,n,u)]]);for(let e of r){let t=i.get(e);if(t)try{y.info({docName:e,path:t},`[config-file-watcher] starting`);let n=await xhe(t,t=>{let n=ge.documents.get(e);y.info({docName:e,hasDocument:n!==void 0,contentLength:t.length},`[config-file-watcher] file changed`);let r=zD(n??null,e,t,he.configPersistenceCtx);y.info({docName:e,outcome:r},`[config-file-watcher] applyExternalConfigChange outcome`),ne(e)});Ge.push({docName:e,cleanup:n}),y.info({docName:e,path:t},`[config-file-watcher] started`)}catch(n){y.warn({err:n,docName:e,path:t},`[config-file-watcher] failed to start for ${e}`),dt.push(`config-file-watcher:${e}`)}}if(!v){let e=(e,t)=>{let n=_A(e,he.managedArtifactCtx);if(!n)return;let r=bA(ge.documents.get(n)??null,n,t,he.managedArtifactCtx);y.info({docName:n,outcome:r},`[managed-artifact-watcher] external change`),bt(n)&&fe.ingestGlobalSkillBundles(pA(he.managedArtifactCtx),EM()).then(()=>{Ne(`backlinks`),Ne(`graph`)}).catch(e=>{y.warn({err:e,docName:n},`[backlinks] global skill bundle re-ingest failed`)})};try{let t=pA(he.managedArtifactCtx),n=await U7(t,e);Ge.push({docName:`__skill-files__`,cleanup:n}),y.info({roots:t},`[managed-artifact-watcher] skills started`)}catch(e){y.warn({err:e},`[managed-artifact-watcher] skills failed to start`),dt.push(`managed-artifact-watcher:skills`)}try{let t=new Set([``]);try{for(let e of aP(n).templates)t.add(e.source_folder)}catch(e){y.warn({err:e},`[managed-artifact-watcher] template enumeration failed; root only`)}let r=[...t].map(e=>e?z(n,e,`.ok`,`templates`):z(n,`.ok`,`templates`)),i=await U7(r,e,Jhe);Ge.push({docName:`__template-files__`,cleanup:i}),y.info({rootCount:r.length},`[managed-artifact-watcher] templates started`)}catch(e){y.warn({err:e},`[managed-artifact-watcher] templates failed to start`),dt.push(`managed-artifact-watcher:templates`)}}try{let e=z(t,`.okignore`),r=z(n,`.gitignore`),i=null;try{let e=Ac(`git`,[`rev-parse`,`--git-common-dir`],AA({cwd:n,encoding:`utf-8`,timeout:5e3}));if(e.status===0&&e.stdout){let t=L(z(n,e.stdout.trim()),`info`,`exclude`);B(Pc(t))&&(i=t)}}catch{}let a=i?[e,r,i]:[e,r],o=y;o.info({okignorePath:e,gitignorePath:r,gitInfoExcludePath:i,ephemeral:v},`[ignore-watcher] starting multi-path watcher for .okignore + .gitignore (+ .git/info/exclude when present)`);let s=v?null:await She(a,(t,r)=>{(async()=>{if(t===e)try{let e=zD(ge.documents.get(`__config__/okignore`)??null,ee,r,he.configPersistenceCtx);o.info({docName:ee,outcome:e},`[ignore-watcher] applyExternalConfigChange outcome`)}catch(e){o.error({err:e,changedPath:R(n,t)},`[ignore-watcher] applyExternalConfigChange failed; rebuild proceeds independently`)}let i=await ue.rebuildIgnorePatterns();if(i.ok)o.info({changedPath:R(n,t),patternCount:i.patternCount,nestedFileCount:i.nestedFileCount,durationMs:i.durationMs},`[ignore-watcher] rebuild succeeded — broadcasting files channel`),ve?.signal(`files`);else{let e=R(n,t)||`.`;o.warn({changedPath:e,error:i.error.message},`[ignore-watcher] rebuild failed — emitting config-ignore-nested-error`),ve?.emitConfigIgnoreNestedError(e,i.error.message)}})().catch(e=>{o.error({err:e,changedPath:R(n,t)||`.`},`[ignore-watcher] handler threw`)})});s&&(Ge.push({docName:`__ignore-files__`,cleanup:s}),o.info({okignorePath:e,gitignorePath:r},`[ignore-watcher] multi-path watcher started`))}catch(e){y.warn({err:e,projectDir:n,contentDir:t},`[ignore-watcher] failed to start multi-path watcher`),dt.push(`ignore-files-watcher`)}let a=k7(n).branch??`main`;TM(a),fe.switchBranch(a);let o=performance.now();try{await Ka(`ok.boot.indexes`,void 0,async()=>{let e=EM();try{if(await fe.loadFromDisk(e)){let t=await fe.reconcileWithDisk(e);(t.added>0||t.updated>0||t.deleted>0)&&y.info({added:t.added,updated:t.updated,deleted:t.deleted},`[backlinks] startup reconcile: offline changes applied`);let n=0;for(let e of t.deletedDocNames)qx(e)||ze.peek(e)?.kind!==`renamed`&&(ze.setDeleted(e),n++);n>0&&y.info({count:n},`[removal-guard] tombstoned docs deleted while the server was down`)}else await fe.rebuildFromDisk(e);try{await fe.ingestGlobalSkillBundles(pA(he.managedArtifactCtx),e)}catch(t){y.warn({err:t,branch:e},`[backlinks] global skill bundle ingest failed`)}fe.saveToDisk().catch(t=>{I(`backlinks`).warn({branch:e,err:t},`Failed to persist startup cache for ${e}`)})}catch(t){y.error({err:t,branch:e},`[backlinks] startup init failed; index will populate incrementally via watcher`)}let n=performance.now();at=await Ka(`ok.boot.seed-walk`,void 0,async()=>sA(t,nt,ue)),QV(`seedWalkMs`,Math.round(performance.now()-n));{let e=z(t),n=0;for(let[t]of ze.entries()){if(!Yq(t))continue;let r=z(e,`${t}${iS(t)}`);bk(r,e)&&B(r)&&(ze.delete(t),n++)}n>0&&y.info({count:n},`[removal-guard] dropped journaled removal entries whose file re-appeared while the server was down`)}try{let e=await E.reconcileWithDisk();(e.added>0||e.updated>0||e.deleted>0)&&y.info(e,`[tag-index] startup reconcile: offline changes applied`),E.saveToDisk().catch(e=>{I(`tag-index`).warn({err:e},`Failed to persist startup tag snapshot`)})}catch(e){y.error({err:e},`[tag-index] startup reconcile failed; tag index updates incrementally via watcher events`),dt.push(`tag-index`)}let r=0;try{_===void 0?await eJ({contentDir:t,contentFilter:ue,basenameIndex:se,onSkip:(e,t,n)=>{r++,y.warn({reason:e,code:t,path:n},`[basename-index] skipped entry during seed (${e}${t?` ${t}`:``})`)}}):$q({contentDir:t,basenameIndex:se,onSkip:(e,t,n)=>{r++,y.warn({reason:e,code:t,path:n},`[basename-index] skipped entry during single-file seed (${e}${t?` ${t}`:``})`)}}),r>0&&(y.warn({count:r},`[basename-index] startup seed completed with ${r} skipped entries — embeds under inaccessible subtrees will not resolve`),dt.push(`basename-index-partial`))}catch(e){y.error({err:e},`[basename-index] startup seed failed`),dt.push(`basename-index`)}})}catch(e){y.error({err:e},`[server] disk bridge watcher failed to start`),dt.push(`file-watcher`)}finally{QV(`indexesMs`,Math.round(performance.now()-o)),at&&$V(`fileCount`,at.getFileIndex().size)}try{ot=await Ahe(n,async({trigger:e})=>{if(y.info({trigger:e},`[batch] begin trigger=${e}`),kne(),ge.flushPendingStores(),await he.flushPendingGitCommit(),NM(!0),pe.current){let e=EM(),t=k7(n).branch??e,r=[];for(let[e,t]of ge.documents){if(qx(e))continue;let n=null;if(t.transact(()=>{n=qe(e)},zge),n===null)continue;let i=DM(e)??n;r.push({docName:e,markdown:n,diskSnapshot:i})}if(r.length>0)try{let n=await YO(pe.current,e,LO.id,r,t);n&&(Mne(),y.info({count:r.length,branch:e,sha:n.slice(0,8)},`[history] parked ${r.length} docs on ${e} → ${n.slice(0,8)}`))}catch(e){y.error({err:e},`[shadow] park failed`)}}},async e=>{let r=tt.length,i=e.newBranch??`main`;if(y.info({kind:e.batchKind,headMoved:e.headMoved,docs:r,timeout:!!e.timeout},`[batch] end kind=${e.batchKind} headMoved=${e.headMoved} docs=${r}${e.timeout?` timeout`:``}`),e.batchKind===`within-branch`){if(NM(!1),await rt(),e.headMoved&&e.newHead){let r=Vge(n,z(t),e.oldHead,e.newHead);if(r.size>0){Gie(r.keys());for(let[e,t]of r)VD(e,Bee(t.email),t.name,t.email,lu(e));await he.flushContributors()}}if(await he.flushDeferredStores(`within-branch`),st!==null)try{await st.reconcileConflictsFromGit()}catch(e){y.warn({err:e},`[head-watcher] sync engine conflict reconcile failed`)}}else{jne(),tt.splice(0,tt.length),TM(i),Pe!==null&&(clearTimeout(Pe),Pe=null),fe.switchBranch(i),ue.rebuildDirCount();try{let e=0;se.clear(),await eJ({contentDir:t,contentFilter:ue,basenameIndex:se,onSkip:(t,n,r)=>{e++,y.warn({reason:t,code:n,path:r,branch:i},`[basename-index] skipped entry during branch-switch reseed (${t}${n?` ${n}`:``})`)}}),e>0&&(y.warn({count:e,branch:i},`[basename-index] branch-switch reseed completed with ${e} skipped entries — embeds under inaccessible subtrees will not resolve on this branch`),dt.includes(`basename-index-partial`)||dt.push(`basename-index-partial`))}catch(e){y.error({err:e,branch:i},`[basename-index] branch-switch reseed failed`)}for(let[e,n]of ge.documents)if(!qx(e))try{let r=xM(e,t);if(!B(r)){let t=DM(e)??``,r=qe(e)??``;if(r!==t&&pe.current){let t=pe.current;queueMicrotask(()=>{UO(t,p??``,{kind:`external-change-rescue`,docName:e,contents:r,label:`External change recovered @ ${new Date().toISOString()}`,branch:i,metadata:{incomingDiskSha:``}}).then(()=>{Dx(),y.info({docName:e},`[reconcile] rescue checkpoint saved on branch switch: ${e}`)}).catch(t=>{y.error({docName:e,err:t},`[reconcile] rescue checkpoint write failed: ${e}`)})})}n.getMap(`lifecycle`).set(`status`,`deleted-upstream`),y.info({docName:e,branch:i},`[branch-switch] tombstone: ${e} (not on ${i})`);continue}let a=V(r,`utf-8`);Je(e,a),OM(e,a),y.info({docName:e},`[branch-switch] reset: ${e}`)}catch(t){y.error({err:t,docName:e},`[branch-switch] failed to reset ${e}`)}y.info({branch:i,docCount:ge.documents.size},`[branch-switch] loaded branch ${i} (${ge.documents.size} docs)`);try{if(await fe.loadFromDisk(i)){let e=await fe.reconcileWithDisk(i);(e.added>0||e.updated>0||e.deleted>0)&&y.info(e,`[backlinks] branch-switch reconcile for ${i}`)}else await fe.rebuildFromDisk(i);try{await fe.ingestGlobalSkillBundles(pA(he.managedArtifactCtx),i)}catch(e){y.warn({err:e,branch:i},`[backlinks] branch-switch global skill bundle ingest failed`)}fe.saveToDisk(i).catch(e=>{I(`backlinks`).warn({branch:i,err:e},`Failed to persist branch cache for ${i}`)})}catch(e){y.error({err:e,branch:i},`[backlinks] branch-switch rebuild failed; backlinks may be stale`)}try{let e=await E.reconcileWithDisk();(e.added>0||e.updated>0||e.deleted>0)&&y.info(e,`[tag-index] branch-switch reconcile for ${i}`)}catch(e){y.warn({err:e,branch:i},`[tag-index] branch-switch reconcile failed; falling back to full rebuild`),await E.init()}if(E.saveToDisk().catch(e=>{I(`tag-index`).warn({branch:i,err:e},`Failed to persist tag snapshot after branch switch`)}),pe.current&&e.batchKind===`cross-branch`){let e=0;for(let[t]of ge.documents)if(!qx(t))try{let n=await ZO(pe.current,i,LO.id,t);if(!n||n.markdown===n.diskSnapshot)continue;let r=DM(t);if(!r)continue;let a=XD({docName:t,base:n.diskSnapshot,ours:n.markdown,theirs:r});switch(a.kind){case`merged`:case`clean`:Je(t,a.newContent),OM(t,a.newContent),e++;break;case`conflicts`:Je(t,a.newContent),OM(t,a.newContent),Tx(),e++;{let e=ge.documents.get(t);if(e){let t=e.getMap(`lifecycle`);t.set(`status`,`conflict`),t.set(`reason`,`merged-with-markers`)}}break;case`noop`:case`refused`:break}}catch(e){y.error({err:e,docName:t},`[branch-switch] restore WIP failed for ${t}`)}e>0&&y.info({count:e,branch:i},`[branch-switch] restored ${e} parked docs on ${i}`)}if(e.oldBranch?.startsWith(`detached-`)&&pe.current)try{let t=bO(pe.current),n=(await t.raw(`for-each-ref`,`refs/wip/${e.oldBranch}/`,`--format=%(refname)`)).trim();n&&(await hO(pe.current).withMutator(async()=>{for(let e of n.split(`
|
|
3262
3262
|
`))e&&await t.raw(`update-ref`,`-d`,e)}),y.info({context:e.oldBranch},`[branch-switch] cleaned up detached context ${e.oldBranch}`))}catch(e){y.error({err:e},`[branch-switch] detached cleanup failed`)}NM(!1),await he.flushDeferredStores(`discard-stale`),ve?.emitBranchSwitched(i)}if(e.headMoved&&e.newHead&&pe.current&&r>0){let t=p??`.`;try{let n=await zO(pe.current,t,e.oldHead,e.newHead,i);Ex(),y.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){y.error({err:e},`[shadow] upstream-import failed`)}}})}catch(e){y.error({err:e},`[server] HEAD watcher failed to start`),dt.push(`head-watcher`)}function s(e){for(let r of e)try{let e=yk(R(t,L(n,r)));if(e.startsWith(`..`))continue;let i=$x(e),a=ge.documents.get(i);if(!a)continue;let o=qe(i);o===null?y.warn({docName:i,file:r},`[sync] content conflict: serializeDoc returned null; reconciledBase snapshot skipped`):OM(i,o);let s=a.getMap(`lifecycle`);s.set(`status`,`conflict`),s.set(`reason`,`sync-merge-conflict`),y.info({docName:i,file:r},`[sync] marked loaded content conflict`)}catch(e){y.warn({err:e,file:r},`[sync] failed to mark loaded content conflict`)}}let l=Bge(h);try{st=new Nge({projectDir:n,contentDir:t,contentFilter:ue,contentRoot:p,syncEnabled:x(),credentialArgs:l,cc1Broadcaster:ve,detectGh:e.detectGh,tokenStore:e.tokenStore,checkPushPermissionFn:e.checkPushPermissionFn,setBatchInProgress:e=>{NM(e),e||he.flushDeferredStores(`within-branch`).catch(e=>{y.error({err:e},`[persistence] deferred store drain failed after sync batch`)})},onStateChange:e=>{y.info({state:e},`[sync] state → ${e}`)},onContentConflictsDetected:s,onAutoDisable:async e=>{y.warn({reason:e},`[sync] auto-disabled — persisting to project-local config`);let t=await ro({cwd:n,scope:`project-local`,patch:{autoSync:{enabled:!1}}});t.ok||y.error({result:t,reason:e,humanError:ma(t.error),configPath:Wa(`project-local`,n)},`[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 st.start()}catch(e){y.warn({err:e},`[server] SyncEngine failed to start — sync disabled`),st=null}Ne(`files`),Ne(`backlinks`),Ne(`graph`),Ne(`tags`);let d=ZV();d!==void 0&&QV(`readyMs`,d)}return ft().then(Ae,je),{hocuspocus:ge,sessionManager:_e,cc1Broadcaster:ve,agentFocusBroadcaster:ye,agentPresenceBroadcaster:be,maintenanceCoordinator:me,contentFilter:ue,basenameIndex:se,serverInstanceId:re,destroy:ut,ready:Me,degraded:dt,lockDir:ie,get syncEngine(){return st},resolveEmbed:ce,acpRegistry:T,acpPermissions:oe}}function T9(e){return e/1048576}function Hge(){let e=process.memoryUsage();return{schemaVersion:1,capturedAt:new Date().toISOString(),snapshot:{rssMb:T9(e.rss),heapTotalMb:T9(e.heapTotal),heapUsedMb:T9(e.heapUsed),externalMb:T9(e.external),arrayBuffersMb:T9(e.arrayBuffers)}}}let E9=null,D9=null,O9=null;const k9=1e6;let A9=null,j9=null;Ga(()=>{E9=null,D9=null,O9=null,A9?.disable(),A9=null,j9=null});function Uge(){if(E9)return;let e=_o().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}=Hge();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`})}),E9=e}function Wge(){if(!D9){let e=_o().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(!A9){A9=wee({resolution:20}),A9.enable();return}e.observe(A9.percentile(50)/k9,{stat:`p50`}),e.observe(A9.percentile(99)/k9,{stat:`p99`}),A9.reset()}),D9=e}if(!O9){let e=_o().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=j9;if(j9={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`}))}),O9=e}}let M9=null,N9=!1;function P9(e=process.env){return e.OK_BRIDGE_TOLERANCE_TELEMETRY===`1`}function F9(e){if(!P9())return;let t=nN(e);M9=new Co({currentPath:z(t,`tolerance-telemetry.jsonl`),previousPath:z(t,`tolerance-telemetry.prev.jsonl`),maxBytes:8388608}),Mi(e=>{let t={event:`bridge-tolerance-fire`,timestamp:e.timestamp,class:e.className,document:e.documentName??null,codeUnitPosition:e.codeUnitPosition,severity:e.severity};M9?.append(`${JSON.stringify(t)}\n`).catch(e=>{N9||(N9=!0,I(`tolerance-telemetry`).warn({err:e instanceof Error?e:Error(String(e))},`append failed; further failures are silent`))})})}async function I9(){Mi(null),await M9?.drain(),M9=null,N9=!1}Fa();const Gge=[`server.lock`,`ui.lock`,`state.json`,`principal.json`,`sync-state.json`,`conflicts.json`,`last-spawn-error.log`],Kge=[`cache`,`tmp`];function qge(e){let t=z(e,_a);if(!(()=>{if(!B(t))return!0;try{return el(t).length===0}catch{return!0}})())return[];let n=[];for(let t of Gge)B(z(e,t))&&n.push(t);for(let t of Kge){let r=z(e,t);try{B(r)&&ol(r).isDirectory()&&n.push(`${t}/`)}catch{}}return n}function Jge(e){let t=ql(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 L9=Number(process.env.OK_DESTROY_STEP_TIMEOUT_MS)||5e3;async function Yge(e){XV();let t=e.projectDir??e.contentDir,n=_J({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}`)}yo.configure({pinoConfig:{fileSink:n.logs,redactPaths:t}})}go({localSink:n?.telemetry}),F9(t),Uge(),Wge();let{kind:r,gitdir:i}=Jge(e.projectDir??e.contentDir),a={"ok.worktree.kind":r};i!==null&&(a[`ok.worktree.gitdir`]=oo(i));let o=lJ(t),s=process.env.OK_STARTUP_TRACEPARENT,c=()=>Ka(`ok.boot`,{attributes:a},async()=>Xge(e)),l=()=>{if(s)try{let e=Na.extract(Ia.active(),{traceparent:s});return Ia.with(e,c)}catch(e){I(`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 Xge(e){let t=e.skipAutoInit??!1,n=e.attachUiSibling??!0,r=e.idleShutdownMs,i=e.log??I(`boot`),a=process.env.OK_LOCK_KIND===`mcp-spawned`||process.env.OK_LOCK_KIND===`interactive`?process.env.OK_LOCK_KIND:void 0,o=e.lockKind??a??`interactive`,{createServer:s}=await import(`node:http`),{markServerLockDraining:c,releaseServerLock:l,updateServerLockPort:u}=await import(`./server-lock-C_4LRuVM.mjs`),d=!1;if(!t&&e.autoInitFn)try{d=!!await e.autoInitFn()}catch(e){i.warn({err:e},`autoInitFn failed`)}let f=e.projectDir??e.contentDir,p=z(f,`.ok`);if(!B(z(p,`config.yml`)))throw new E5(B(p)?`config`:`okdir`,f);let m=z(p,`.gitignore`);B(m)||I(`boot`).warn({path:m},"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 h=e.gitPreflight??Vz;try{e.gitEnabled!==!1&&h()}catch(e){if(e instanceof Rz||e instanceof zz){let t=e instanceof zz?e.detected:``,n=e instanceof zz?`too_old`:`not_available`;tW(e),i.warn({event:`git_preflight_fail`,platform:e.platform,reason:n,detectedVersion:t},n===`not_available`?`git binary not found`:`git binary too old`),process.stderr.write(`${e.message}\n`)}throw await ho(),await Promise.race([I9(),new Promise(e=>setTimeout(e,L9))]),e}let g=qge(p);g.length>0&&I(`boot`).warn({files:g},`Found legacy runtime files at .ok/${g.join(`, `)}. Delete .ok/ and re-init — these files moved to .ok/${_a}/.`);let _=w9({contentDir:e.contentDir,projectDir:e.projectDir,contentRoot:e.contentRoot,port:e.port,host:e.host,quiet:e.quiet??!1,debounce:e.debounce,maxDebounce:e.maxDebounce,gitEnabled:e.gitEnabled,commitDebounceMs:e.commitDebounceMs,wipRef:e.wipRef,enableTestRoutes:e.enableTestRoutes,shadowRepo:e.shadowRepo,destroyTimeoutMs:e.destroyTimeoutMs,localOpCliArgs:e.localOpCliArgs,onAgentWrite:e.onAgentWrite,lockKind:o,skipStateManifestCheck:e.skipStateManifestCheck,detectGh:e.detectGh,tokenStore:e.tokenStore,embeddingsKeyStore:e.embeddingsKeyStore,singleDocRelPath:e.singleDocRelPath,ephemeral:e.ephemeral}),{hocuspocus:v,destroy:y,ready:b,degraded:x,lockDir:S,sessionManager:C,agentFocusBroadcaster:w,agentPresenceBroadcaster:ee,maintenanceCoordinator:te}=_,ne=(()=>{let t=e.host??`localhost`;return t===`0.0.0.0`||t===`::`?`localhost`:t.includes(`:`)&&!t.startsWith(`[`)?`[${t}]`:t})(),re=e.port??0,ie=e.ephemeral?void 0:b5({contentDir:e.contentDir,projectDir:e.projectDir??e.contentDir,config:e.config,getServerUrl:()=>`http://${ne}:${re}`,log:i}),T=s();T.headersTimeout=3e4,T.requestTimeout=6e4;let ae=e.serveContentAssets===!1?void 0:eN({contentFilter:_.contentFilter,contentSirv:Jo(e.contentDir,{dev:!0,dotfiles:!1}),inlineExtensions:Ki,assetExtensions:zi,blocklistExtensions:Yi}),oe=!1;if(e.reactShellDistDir)try{eV(S,{port:0,worktreeRoot:e.projectDir??e.contentDir}),oe=!0}catch(e){if(e instanceof $B)i.info({event:`ui-lock-yielded-to-live-holder`,pid:process.pid,existingPid:e.existing.pid,existingPort:e.existing.port,lockDir:S},`ui.lock already held by a live process — yielding (advertisement is fulfilled)`);else throw await y().catch(()=>{}),l(S),e}let se=e.reactShellDistDir?Jo(e.reactShellDistDir,{single:!0,gzip:!0,immutable:!0}):void 0,ce=e.ephemeral?null:new kw({contentDir:e.contentDir,localDir:S,registry:_.acpRegistry,permissions:_.acpPermissions,sessionManager:C,agentPresenceBroadcaster:ee,resolveEmbed:_.resolveEmbed,isExcludedPath:e=>_.contentFilter.isExcluded(e),isIgnoredPath:e=>_.contentFilter.isPathIgnored(e),getLoadedDocText:e=>v.documents.get(e)?.getText(`source`).toString()??null,getServerUrl:()=>`http://${ne}:${re}`,getMcpStdioCommand:()=>Ow(e.localOpCliArgs,re),probeHarnessManagedMcpEntry:e.probeHarnessManagedMcpEntry,log:i});ce!==null&&await ce.init();let le=S5({httpServer:T,hocuspocus:v,mcpHttpHandler:ie,log:i,sessionManager:C,agentFocusBroadcaster:w,agentPresenceBroadcaster:ee,maintenanceCoordinator:te,keepaliveGraceMs:e.keepaliveGraceMs,contentAssetMiddleware:ae,reactShellMiddleware:se,ephemeral:e.ephemeral,acpThreadManager:ce}),ue=async()=>{throw Error(`bootServer: destroy() invoked before initialization — boot did not complete`)},de=null;r!==null&&(de=uJ({httpServer:T,thresholdMs:r??18e5,log:i,onShutdown:(e.idleShutdownHandler??(e=>async()=>{await e()}))(async()=>{await ue()})})),await R9({hocuspocus:v,projectDir:e.projectDir??e.contentDir,log:i});try{await new Promise((t,n)=>{let r=e=>n(e);T.once(`error`,r),T.listen(e.port,e.host,()=>{T.removeListener(`error`,r),t()})})}catch(e){if(oe)try{rV(S)}catch(e){i.warn({err:e},`releaseUiLock failed during listen-error cleanup`)}throw await y().catch(()=>{}),l(S),e}let fe=ZV();fe!==void 0&&QV(`httpListenMs`,fe);let E=T.address(),pe=typeof E==`object`&&E?E.port:e.port??0;if(re=pe,u(S,pe),oe&&tV(S,pe),n&&e.spawnUiSiblingFn)try{await e.spawnUiSiblingFn({lockDir:S,log:i})}catch(e){i.warn({err:e},`spawnUiSiblingFn failed`)}let me=!1,he=async(e,t)=>{let n;try{await Promise.race([t(),new Promise((t,r)=>{n=setTimeout(()=>{r(Error(`${e} timed out after ${L9}ms`))},L9),n.unref?.()})])}finally{n!==void 0&&clearTimeout(n)}};ue=async()=>{if(me)return;me=!0;let e=[],t=async(t,n)=>{try{await he(t,n)}catch(n){e.push(n),i.warn({err:n,step:t},`bootServer destroy step failed`)}};try{c(S),oe&&iV(S)}catch(e){i.warn({err:e,step:`markLocksDraining`},`bootServer destroy step failed`)}try{de?.detach()}catch(t){e.push(t),i.warn({err:t,step:`idleHandle.detach`},`bootServer destroy step failed`)}if(ce!==null&&await t(`acpThreads.destroy`,()=>ce.destroy()),await t(`mount.shutdown`,()=>le.shutdown()),ie!==void 0&&await t(`mcpHttpHandler.close`,()=>ie.close()),await t(`mount.wss.close`,()=>new Promise((e,t)=>{le.wss.close(n=>n?t(n):e())})),await t(`httpServer.closeAllConnections`,async()=>{T.closeAllConnections?.()}),await t(`httpServer.close`,()=>new Promise((e,t)=>{T.close(n=>n&&n.code!==`ERR_SERVER_NOT_RUNNING`?t(n):e())})),await t(`destroyHocuspocus`,()=>y()),oe&&await t(`releaseUiLock`,async()=>rV(S,{deferUnlinkToExit:!0})),await t(`shutdownTelemetry`,()=>ho()),await t(`teardownToleranceTelemetry`,()=>I9()),await t(`flushLogFileSinks`,()=>yo.flushAllFileSinks()),e.length>0)throw AggregateError(e,`bootServer destroy completed with errors`)};try{let t=await GB({projectDir:f,skillsRoot:z(e.contentDir,`.ok`,`skills`)}),n=t.healed.length+t.adopted.length+t.replaced.length+t.collided.length+t.orphansRemoved.length;n>0&&i.info?.({event:`installed-skills-reconciled`,healed:t.healed.length,adopted:t.adopted.length,replaced:t.replaced.length,collided:t.collided.length,orphansRemoved:t.orphansRemoved.length},`Reconciled ${n} editor skill entr${n===1?`y`:`ies`} to the symlink model.`)}catch(e){i.warn?.({event:`installed-skills-reconcile-failed`,err:e},`Installed-skills reconcile failed (non-fatal).`)}return{httpServer:T,destroy:ue,lockDir:S,contentDir:e.contentDir,port:pe,ready:b,degraded:x,didAutoInit:d,serverInstance:_,acpThreadManager:ce}}async function R9(e){let{hocuspocus:t,projectDir:n,log:r}=e,i,a;try{i=new rJ(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=null;try{let e=Jl(n),t=e?L(e,`MERGE_HEAD`):null;if(!t||!B(t)){i.clear(),console.warn(JSON.stringify({event:`lifecycle-restore-cleared-stale-conflicts`,reason:`no-merge-head`,count:a.length}));return}let r=Oo({baseDir:n,timeout:{block:5e3}});o=new Set(await aO(r,[`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(o!==null){let e=0;for(let t of a)o.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?.has(e.file)),a.length===0)return}for(let e of a){let n=$x(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 Zge=oa;function Qge(e={}){let t=e.home??dl(),n=e.platformName??process.platform,r=e.env??process.env;return n===`darwin`?B(L(t,`Library`,`Application Support`,`Claude`)):n===`win32`?B(L(r.APPDATA??L(t,`AppData`,`Roaming`),`Claude`)):!1}var z9=t(So(),1);const B9=L(dl(),`.ok`,`logs`),$ge=[`authorization`,`password`,`token`,`apiKey`,`secret`,`*.authorization`,`*.password`,`*.token`,`*.apiKey`,`*.secret`];function e_e(){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 t_e(e){Yc(e,{recursive:!0})}function V9(){return new Date().toISOString().slice(0,10)}function n_e(e){try{if(ol(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{rl(n,r)}catch{}}try{sl(`${e}.3`)}catch{}}function r_e(e){try{let t=Date.now(),n=10080*60*1e3,r=el(e).filter(e=>e.endsWith(`.log`)||/\.log\.\d+$/.test(e)).map(t=>{try{let n=ol(L(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{sl(L(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{sl(L(e,t.name)),a-=t.size}catch{}}}catch{}}function i_e(e){t_e(B9);let t=V9(),n=e.filePath??L(B9,`${e.name}.${t}.log`);n_e(n),(e._setTimeout??setTimeout)(()=>r_e(B9),5e3).unref();let r=z9.default.destination({dest:n,append:!0,sync:!0});return(0,z9.default)({level:e_e(),name:e.name,redact:{paths:$ge,censor:`[REDACTED]`},base:{pid:process.pid,hostname:void 0,runtime:`cli`,project:e.project??`<no-project>`},timestamp:z9.default.stdTimeFunctions.isoTime,...e.additionalOptions},r)}function a_e(e,t=250){return new Promise(n=>{if(!e){n();return}let r=e[z9.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 o_e(e){return L(B9,`${e}.${V9()}.log`)}function s_e(){return B9}function c_e(e){let t=z(e),n=0;for(;n<30;){let e=!1;try{e=B(z(t,`.git`))}catch{e=!1}if(e)return{gitRoot:t,distance:n};let r=Pc(t);if(r===t)return null;t=r,n+=1}return null}const H9=Rl(Oc),U9=I(`project-git`);var W9=class extends Error{stderr;constructor(e,t=``,n){super(e,n),this.name=`ProjectGitInitError`,this.stderr=t}};async function l_e(e,t){try{let{stdout:n}=await H9(e,[`rev-parse`,`--is-inside-work-tree`],AA({cwd:t,encoding:`utf-8`}));return n.trim()===`true`}catch{return!1}}async function u_e(e){let t=z(e),n=z(t,`.git`),r=z(n,`HEAD`),i=!1;if(B(n)){if(!ol(n).isDirectory()||B(r))return{didInit:!1};U9.info({},`detected partial .git/ — running git init to repair`),i=!0}let a;try{a=Vz()}catch(e){throw e instanceof Rz||e instanceof zz?(tW(e),U9.warn({event:`git_preflight_fail`,platform:e.platform,reason:e instanceof zz?`too_old`:`not_available`,detectedVersion:e instanceof zz?e.detected:``},e instanceof zz?`git binary too old`:`git binary not found`)):U9.warn({event:`git_preflight_unexpected_error`,err:e},`unexpected error during git preflight`),e}let o=a.resolvedPath;if(!i&&await l_e(o,t))return{didInit:!1};let s=``;try{s=(await H9(o,[`init`,`--initial-branch=main`,t],AA({encoding:`utf-8`}))).stderr??``}catch(e){let n=typeof e==`object`&&e&&`stderr`in e?String(e.stderr??``):``;throw new W9(`git init failed at ${t}: ${e instanceof Error?e.message:String(e)}`,n,{cause:e})}if(!B(r))throw new W9(`git init reported success but ${n}/HEAD is missing (partial init detected)`,s);return i?(U9.info({path:t},`backfilled missing .git/HEAD`),{didInit:!0,repaired:!0}):(U9.info({path:t,branch:`main`},`initialized .git/`),{didInit:!0})}const G9=I(`project-skill-git`),K9=/^[0-9a-f]{40}$/,d_e=Tn.map(e=>e.replace(/\/$/,``));async function f_e(e){let t=Jl(e);if(t===null)return{kind:`skipped`,reason:`no-git`};if(g_e(t))return{kind:`skipped`,reason:`operation-in-progress`};let n=ko(e);if((await q9(n)).length===0)return{kind:`nothing-tracked`};try{return await Do(async()=>{let t=await p_e(n);if(t===null)return{kind:`skipped`,reason:`detached-head`};let r=await m_e(n);if(r===null)return{kind:`skipped`,reason:`unborn-head`};let i=await q9(n);if(i.length===0)return{kind:`nothing-tracked`};let a=ko(e,{gitIndexFile:L(ml(),`ok-untrack-idx-${process.pid}-${Date.now()}.idx`)});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 h_e(n,r);if(s!==null&&s===o)return{kind:`nothing-tracked`};let c=await yH(e),l=c?.name??`OpenKnowledge`,u=c?.email??`sync@open-knowledge.local`;jo(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 \`${Ti}\` 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(!K9.test(f))return G9.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 G9.info({branch:t,err:J9(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){G9.info({err:J9(e)},`real-index reset after untrack failed (cosmetic)`)}return G9.info({dirs:i,commitSha:f},`untracked project-skill projection`),{kind:`untracked`,dirs:i,commitSha:f}})}catch(e){return{kind:`failed`,error:J9(e)}}}async function q9(e){let t=[];for(let n of d_e){let r=``;try{r=(await e.git.raw([`ls-files`,`--`,n])).trim()}catch{r=``}r.length>0&&t.push(n)}return t}async function p_e(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 m_e(e){try{let t=(await e.git.raw([`rev-parse`,`--verify`,`HEAD`])).trim();return K9.test(t)?t:null}catch{return null}}async function h_e(e,t){try{let n=(await e.git.raw([`rev-parse`,`${t}^{tree}`])).trim();return K9.test(n)?n:null}catch{return null}}function g_e(e){return B(L(e,`MERGE_HEAD`))||B(L(e,`rebase-merge`))||B(L(e,`rebase-apply`))||B(L(e,`CHERRY_PICK_HEAD`))||B(L(e,`REVERT_HEAD`))}function J9(e){return e instanceof Error?e.message:String(e)}async function __e(e,t){let n;try{n=Dc(t).resolve(e)}catch(e){if(e?.code===`MODULE_NOT_FOUND`)return;throw e}for(let t=Pc(n),r=0;r<32;r+=1){let n=L(t,`package.json`);if(B(n))try{let t=JSON.parse(await yl(n,`utf-8`));if(t.name===e&&typeof t.version==`string`)return t.version}catch{}let r=Pc(t);if(r===t)return;t=r}}const v_e=[{regex:/\/Users\/[^/]+\//g,replacement:`~/`},{regex:/\/home\/[^/]+\//g,replacement:`~/`},{regex:/C:\\\\Users\\\\[^\\\\]+\\\\/g,replacement:`~\\`},{regex:/C:\\Users\\[^\\]+\\/g,replacement:`~\\`}];function Y9(e){if(e===void 0)return;let t=e;for(let{regex:e,replacement:n}of v_e)t=t.replace(e,n);return t}function X9(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:Y9(e.message)??``,stack:Y9(e.stack),code:e.code,cause:e.cause===void 0?void 0:X9(e.cause,t+1,n)};if(e==null)return{name:`UnknownError`,message:String(e)};if(typeof e==`string`)return{name:`StringError`,message:Y9(e)??e};if(typeof e==`object`){let r=e;return{name:String(r.name??`ObjectError`),message:Y9(String(r.message??``))??``,stack:Y9(r.stack),code:r.code,cause:r.cause===void 0?void 0:X9(r.cause,t+1,n)}}return{name:`UnknownError`,message:String(e)}}var Z9=class extends Error{constructor(e){super(`File not found: ${e}`),this.filePath=e,this.name=`SingleFileNotFoundError`}},Q9=class extends Error{constructor(e){super(`Not a file: ${e}. \`ok <file>\` opens a single markdown file.`),this.filePath=e,this.name=`SingleFileNotAFileError`}},$9=class extends Error{constructor(e){super(`OpenKnowledge edits markdown files (.md / .mdx): ${e}`),this.filePath=e,this.name=`SingleFileNotMarkdownError`}};function y_e(e){if(!Zx(e))throw new $9(e);let t;try{t=nl(z(e))}catch(t){throw t.code===`ENOENT`?new Z9(e):t}if(!ol(t).isFile())throw new Q9(e);let n=Pc(t),r=rH(n);if(r){let e=r.rootPath;return{mode:`project`,projectRoot:e,docName:$x(R(b_e(e),t).split(zc).join(`/`)),canonicalFilePath:t}}let i=Mc(t);return{mode:`ephemeral`,canonicalFilePath:t,contentDir:n,singleDocRelPath:i,docName:$x(i)}}function b_e(e){return z(e,Va({absPath:Wa(`project`,e),sideline:!1,warn:()=>{}}).value.content?.dir??`.`)}function x_e(e){let t=Xc(z(ml(),`ok-ephemeral-`)),n=z(t,`.ok`);return Yc(n,{recursive:!0}),cl(z(n,`config.yml`),`# Ephemeral single-file session (\`ok <file>\`). Throwaway — safe to delete.\ncontent:\n dir: ${JSON.stringify(e)}\n`,`utf-8`),cl(z(n,`.gitignore`),`local/
|
|
3263
3263
|
`,`utf-8`),t}export{p4 as $,jx as $i,yL as $n,AO as $r,IH as $t,r9 as A,Mw as Ai,uz as An,Jj as Ar,ZW as At,k7 as B,QS as Bi,BR as Bn,Bk as Br,vW as Bt,w9 as C,lD as Ci,Pz as Cn,Dae as Cr,bG as Ct,n9 as D,mD as Di,fz as Dn,eN as Dr,sG as Dt,$7 as E,Sie as Ei,gz as En,rN as Er,qW as Et,Hhe as F,Lre as Fi,nz as Fn,Jk as Fr,eG as Ft,b5 as G,Wx as Gi,GL as Gn,Tk as Gr,tW as Gt,E5 as H,G as Hi,VR as Hn,qk as Hr,aW as Ht,z7 as I,oC as Ii,ez as In,kk as Ir,rG as It,y4 as J,qx as Ji,kL as Jn,ik as Jr,qU as Jt,_5 as K,Jx as Ki,AL as Kn,tk as Kr,ZU as Kt,R7 as L,lC as Li,KR as Ln,Ok as Lr,$W as Lt,Q7 as M,kw as Mi,pz as Mn,pM as Mr,oG as Mt,K7 as N,ww as Ni,dz as Nn,AA as Nr,lG as Nt,a9 as O,ZE as Oi,mz as On,IM as Or,aG as Ot,L7 as P,Ow as Pi,tz as Pn,Sk as Pr,tG as Pt,$oe as Q,Rx as Qi,CL as Qn,LO as Qr,DH as Qt,jhe as R,iC as Ri,$R as Rn,Yk as Rr,UW as Rt,I9 as S,pD as Si,Mz as Sn,Eae as Sr,nq as St,x9 as T,dD as Ti,Ez as Tn,tN as Tr,fG as Tt,S5 as U,pS as Ui,HR as Un,sA as Ur,rW as Ut,T5 as V,mS as Vi,IR as Vn,Dk as Vr,_W as Vt,C5 as W,Xx as Wi,pR as Wn,Kk as Wr,eW as Wt,x4 as X,Hx as Xi,xL as Xn,FO as Xr,jH as Xt,b4 as Y,Ux as Yi,SL as Yn,KO as Yr,CH as Yt,E4 as Z,Bx as Zi,wL as Zn,IO as Zr,MH as Zt,Zge as _,WD as _i,Bz as _n,gF as _r,UK as _t,y_e as a,wu as aa,GO as ai,qV as an,Boe as ar,B2 as at,F9 as b,HD as bi,Fz as bn,Iae as br,dq as bt,f_e as c,gu as ca,QO as ci,eV as cn,FF as cr,H0 as ct,c_e as d,tu as da,JD as di,tV as dn,IF as dr,eZ as dt,Sre as ea,zO as ei,NH as en,mL as er,f4 as et,i_e as f,Yl as fa,XD as fi,Rz as fn,LF as fr,kX as ft,Qge as g,Kie as gi,iB as gn,vF as gr,eJ as gt,s_e as h,GD as hi,Vz as hn,EF as hr,tJ as ht,x_e as i,$m as ia,CO as ii,nH as in,VI as ir,$2 as it,i9 as j,jw as ji,lz as jn,Yj as jr,QW as jt,e9 as k,Nw as ki,hz as kn,xM as kr,cG as kt,W9 as l,Ql as la,bO as li,nV as ln,PF as lr,LX as lt,o_e as m,Vl as ma,Jie as mi,Iz as mn,CF as mr,uJ as mt,Z9 as n,Zm as na,NO as ni,PH as nn,fL as nr,Z2 as nt,X9 as o,_u as oa,HO as oi,BV as on,pI as or,R2 as ot,a_e as p,Hl as pa,YD as pi,zz as pn,MF as pr,NX as pt,a5 as q,Gx as qi,jL as qn,rk as qr,XU as qt,$9 as r,eh as ra,qO as ri,rH as rn,pL as rr,Q2 as rt,__e as s,Tu as sa,UO as si,$B as sn,fI as sr,z2 as st,Q9 as t,Qm as ta,EO as ti,TH as tn,vL as tr,a4 as tt,u_e as u,Zl as ua,qD as ui,rV as un,RF as ur,dX as ut,Yge as v,VD as vi,qz as vn,_F as vr,HK as vt,C9 as w,fD as wi,kz as wn,nN as wr,_G as wt,P9 as x,uD as xi,Nz as xn,Fae as xr,Zq as xt,R9 as y,UD as yi,Uz as yn,Pae as yr,uq as yt,A7 as z,aC as zi,zR as zn,Gk as zr,WW as zt};
|
|
3264
|
-
//# sourceMappingURL=src-
|
|
3264
|
+
//# sourceMappingURL=src-CaRd1QSi.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as e,f as t,r as n}from"./start-BZulfzdD.mjs";export{n as bootStartServer,t as resolveHost,e as startCommand};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{L as e,P as t}from"./src-FuRMJntf.mjs";import{Nr as n,a as r,in as i,xr as a}from"./src-BNTrvpdT.mjs";import{S as o,x as s}from"./write-project-skill-DWSfv1tt.mjs";import{a as c,n as l,t as u}from"./acp-harness-probe-DRffYtyG.mjs";import{n as d}from"./constants-CkhmCRIA.mjs";import{spawn as f}from"node:child_process";import{basename as p,dirname as m,join as h,win32 as g}from"node:path";import{closeSync as _,existsSync as v,mkdirSync as y,openSync as b,statSync as x}from"node:fs";import{homedir as S}from"node:os";import{rm as C}from"node:fs/promises";import{setTimeout as w}from"node:timers/promises";function T(e){let t={...e};return delete t.ELECTRON_RUN_AS_NODE,t}function E(e,t,r={}){let i=(r.spawn??f)(e,[...t],n({detached:!0,stdio:`ignore`,env:T(r.env??process.env)}));return i.unref(),i}const D=`OpenKnowledge.app`,O=`/Applications/${D}`;function k(){return{platform:process.platform,env:process.env,execPath:process.execPath,isTTY:process.stdout.isTTY,statSync:e=>{try{return x(e,{throwIfNoEntry:!1})??null}catch{return null}}}}function A(e){if(e.env.ELECTRON_RUN_AS_NODE===`1`){let t=/(.+?\.app)\/Contents\/MacOS\//.exec(e.execPath);if(t?.[1])return t[1]}if(j(e,O))return O;let t=h(e.homeDir??S(),`Applications`,D);return j(e,t)?t:null}function j(e,t){return M(e,h(t,`Contents`,`MacOS`,`OpenKnowledge`))}function M(e,t){try{let n=e.statSync(t);return n&&typeof n.isFile==`function`?n.isFile():!1}catch{return!1}}const N=[`@inkeepopen-knowledge-desktop`,`OpenKnowledge`];function P(e){if(e.env.ELECTRON_RUN_AS_NODE===`1`&&/\\OpenKnowledge\.exe$/i.test(e.execPath))return e.execPath;let t=e.env.LOCALAPPDATA;if(t)for(let n of N){let r=g.join(t,`Programs`,n,`OpenKnowledge.exe`);if(M(e,r))return r}return null}function F(e){if(e.env.ELECTRON_RUN_AS_NODE===`1`&&e.execPath.endsWith(`/openknowledge`))return e.execPath;let t=`/opt/OpenKnowledge/openknowledge`;return M(e,t)?t:null}function I(e){if(e.env.OK_FORCE_BROWSER===`1`)return{available:!1,reason:`force-browser`};if(e.platform!==`darwin`&&e.platform!==`win32`&&e.platform!==`linux`)return{available:!1,reason:`unsupported-platform`};let t;try{t=e.platform===`darwin`?A(e):e.platform===`win32`?P(e):F(e)}catch{return{available:!1,reason:`stat-error`}}return t?e.env.OK_FORCE_DESKTOP===`1`?{available:!0,reason:`available`,bundlePath:t}:!(e.isTTY===!0||e.platform===`win32`&&e.isTTY===void 0&&!e.env.CI)||e.env.SSH_CONNECTION||e.env.SSH_TTY||e.platform===`linux`&&!e.env.DISPLAY&&!e.env.WAYLAND_DISPLAY?{available:!1,reason:`headless`,bundlePath:t}:{available:!0,reason:`available`,bundlePath:t}:{available:!1,reason:`no-bundle`}}function L(e,t){let n=e.log??(e=>console.error(e)),r=e.platform??process.platform;if(n("Launching OpenKnowledge desktop (use `ok start` for the browser server, or `OK_FORCE_BROWSER=1` to always skip)"),r===`darwin`){E(`open`,[`-b`,`com.inkeep.open-knowledge`],{spawn:e.spawn});return}let i=t?.bundlePath;if(!i){n(`Desktop launch skipped: no resolved desktop executable (caller bug).`);return}E(i,[],{spawn:e.spawn})}function R(e=`no-bundle`){switch(e){case`no-bundle`:return`Desktop app not found (checked the standard install locations for this OS). Install it, or omit --mode for browser mode.`;case`darwin-only`:case`unsupported-platform`:return`Desktop app is not available on this platform. Use --mode=browser, or omit --mode for the server fallback.`;case`headless`:return`Desktop launch is gated in headless contexts (CI, SSH, non-TTY stdout). Set OK_FORCE_DESKTOP=1 to override, or use --mode=browser.`;case`force-browser`:return`OK_FORCE_BROWSER=1 is set — desktop dispatch is disabled. Unset it to use --mode=app.`;case`stat-error`:return`Failed to inspect the desktop install (filesystem error). Check permissions or use --mode=browser.`;case`available`:return`Desktop app appears available but launch dispatch did not fire (caller bug).`}}function z(e){return h(m(e),`..`,`Frameworks`,`OpenKnowledge Server.app`,`Contents`,`MacOS`,`OpenKnowledge Helper`)}const B=/\/[^/]+\.app\/Contents\/MacOS\/[^/]+$/;function ee(e){if(e.platform!==`darwin`||!B.test(e.execPath))return null;let t=z(e.execPath);return e.exists(t)?t:null}function V(e={}){let t=e.execPath??process.execPath,n=e.platform??process.platform,r=e.argv??process.argv,i=e.exists??v,a=r[1];return a?{command:ee({execPath:t,platform:n,exists:i})??t,prefixArgs:[a]}:(console.warn(`[self-spawn] process.argv[1] is empty — falling back to \`npx -y @inkeep/open-knowledge@latest\`. This re-introduces the registry-fetch surface that re-exec was fixing. Observed argv: ${JSON.stringify(r)}`),{command:`npx`,prefixArgs:[`-y`,`@inkeep/open-knowledge@latest`]})}function te(e,t){return e.host??t.HOST??`127.0.0.1`}function H(e){let t=p(e).replace(/[^\x20-\x7E]/g,``).trim().slice(0,64);return`open-knowledge-server ${t.length>0?t:`unknown`}`}var U=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}};function W(e){return e.uiLock?e.isAlive(e.uiLock.pid)?{action:`skip`,reason:`alive`,pid:e.uiLock.pid,port:e.uiLock.port}:{action:`spawn`,reason:`stale`,stalePid:e.uiLock.pid}:{action:`spawn`,reason:`absent`}}function G(t){v(t.lockDir)||y(t.lockDir,{recursive:!0});let n=b(h(t.lockDir,e),`w`),r=t.spawn??f,{PORT:i,...a}=process.env,o=V();try{let e=r(o.command,[...o.prefixArgs,...t.args??[`ui`]],{detached:!0,stdio:[`ignore`,`ignore`,n],windowsHide:!0,cwd:t.cwd,env:{...a,ELECTRON_RUN_AS_NODE:`1`}});return e.unref(),e}finally{try{_(n)}catch{}}}function K(e,t,n){return e??(n===void 0?t:void 0)}function q(e,t){return e!==void 0&&t!==null&&t.port>0&&t.draining!==!0}function J(e,t,n){return e??+(t!=null&&!n)}async function Y(e){let t=e.spawn??f,n=V(),{PORT:r,...i}=process.env,a=t(n.command,[...n.prefixArgs,`ui`,`--port`,String(e.uiPort)],{cwd:e.cwd,stdio:`inherit`,windowsHide:!0,env:{...i,ELECTRON_RUN_AS_NODE:`1`}}),o=!1,s=e=>{o=!0;try{a.kill(e)}catch{}},c=()=>s(`SIGINT`),l=()=>s(`SIGTERM`);process.once(`SIGINT`,c),process.once(`SIGTERM`,l),await new Promise(e=>{a.on(`exit`,(t,n)=>{process.exitCode=J(t,n,o),e()}),a.on(`error`,t=>{console.error(`[start] connect fallback: failed to spawn ok ui — ${t instanceof Error?t.message:String(t)}`),process.exitCode=1,e()})}),process.removeListener(`SIGINT`,c),process.removeListener(`SIGTERM`,l)}async function X(e){let t=e.now()+e.timeoutMs;for(;e.now()<t;){let t=e.readUiLock();if(t&&t.port>0)return t.port;await e.sleep(e.pollIntervalMs)}let n=e.readUiLock();return n&&n.port>0?n.port:null}const ne=t;function Z(e,t,n=e=>C(e,{recursive:!0,force:!0})){return async()=>{try{await e()}finally{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`)}}}}function Q(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 $(e){let t=e.sigtermGraceMs??ne,n=e.sigtermPollIntervalMs??200,r=e.sleep??(e=>w(e)),i=e.reason??`teardown`;try{let a=e.readUiLock(),o=e.spawnedUiPid();if(a&&e.isAlive(a.pid)&&a.pid!==o)e.log?.info({pid:a.pid,port:a.port,spawnedUiPid:o},`${i}: ui.lock holder is not our spawned sibling — leaving it alone`);else if(a&&e.isAlive(a.pid))try{e.killPid(a.pid,`SIGTERM`),e.log?.info({pid:a.pid,port:a.port},`${i}: SIGTERM UI sibling`);let o=Date.now()+t;for(;Date.now()<o&&e.isAlive(a.pid);)await r(n);if(e.isAlive(a.pid))try{e.killPid(a.pid,`SIGKILL`),e.log?.warn({pid:a.pid,graceMs:t},`${i}: SIGTERM grace expired — escalated to SIGKILL`)}catch(t){e.log?.error({pid:a.pid,err:t},`${i}: SIGKILL failed`)}}catch(t){e.log?.warn({pid:a.pid,err:t},`${i}: failed to SIGTERM UI sibling`)}}catch(t){e.log?.warn({err:t},`${i}: UI lookup failed; proceeding`)}}function re(e){let{destroy:t,...n}=e;return async()=>{await $({...n,reason:`idle-shutdown`}),await t()}}async function ie(e){let{config:t,cwd:n,host:o}=e,s=e.skipAutoInit??!1,d=e.skipUiAutoSpawn??!1,f=e.idleThresholdMs??18e5,{existsSync:p,mkdirSync:m}=await import(`node:fs`),{basename:h,dirname:g}=await import(`node:path`),{bootServer:_,getLogger:v,isProcessAlive:y,readUiLock:b,resolveContentDir:x,resolveLockDir:S,waitForServerLockDrain:C}=await import(`./src-CfkR1g4Z.mjs`),T=e.log??v(`start`),E=e.singleFile!==void 0,D=e.projectDir??n,O=E?r(e.singleFile).canonicalFilePath:void 0,k=O?g(O):void 0,A=O?h(O):void 0;if(!E){if(!s&&!i(n))throw new U(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`))&&T.warn({event:e},`[start] reclaim sweep reported a problem`)};try{(e.repairMcpConfigsFn??(await import(`./repair-mcp-configs-DS_GKazS.mjs`)).repairMcpConfigs)({projectDir:n,reclaimDisableEnv:t,logger:r})}catch(e){T.warn({err:e},`[start] mcp-config repair sweep failed; continuing`)}try{(e.repairLaunchJsonFn??(await import(`./repair-launch-json-m9kFVWWv.mjs`)).repairLaunchJson)({projectDir:n,reclaimDisableEnv:t,logger:r})}catch(e){T.warn({err:e},`[start] launch.json repair sweep failed; continuing`)}try{await(e.repairSkillsFn??(await import(`./repair-skills-Dm_mCXLT.mjs`)).repairSkills)({projectDir:n,reclaimDisableEnv:t,logger:r})}catch(e){T.warn({err:e},`[start] skill repair sweep failed; continuing`)}}let j=k??x(t,n);!E&&!p(j)&&(m(j,{recursive:!0}),T.info({contentDir:j},`Created content directory`));let M=null,N=null,P=async({lockDir:t})=>{if(M=W({uiLock:b(t),isAlive:y}),M.action===`spawn`&&!d)try{let r=e.uiPort===void 0?void 0:[`ui`,`--port`,String(e.uiPort)];N=G({lockDir:t,cwd:n,spawn:e.spawn,args:r}).pid??null,T.info({reason:M.reason,uiPort:e.uiPort},`[start] auto-spawned ok ui sibling`)}catch(e){console.warn(`[start] failed to auto-spawn ok ui: ${e instanceof Error?e.message:String(e)}`)}else M.action===`skip`&&T.info({port:M.port,pid:M.pid},`UI already running at port ${M.port}`)},F=e.reactShellDistDir===void 0,I=c(),L=a();{let e=S(E?D:n),t=Date.now(),r=await C(e);r!==`no-drain`&&T.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`)}let R=await _({config:t,contentDir:j,projectDir:E?D:n,contentRoot:E?void 0:t.content.dir,port:e.port,host:o,quiet:!1,detectGh:l,tokenStore:I,embeddingsKeyStore:L,...E?{ephemeral:!0,singleDocRelPath:A,gitEnabled:!1,gitPreflight:()=>({ok:!0,version:`0.0.0`,resolvedPath:`git`,source:`PATH`})}:{},localOpCliArgs:[process.execPath,process.argv[1]],probeHarnessManagedMcpEntry:(e,t)=>u(e,t),attachUiSibling:F,idleShutdownMs:f,skipAutoInit:!0,...F?{spawnUiSiblingFn:P}:{},idleShutdownHandler:t=>{let n=re({readUiLock:()=>b(R.lockDir),spawnedUiPid:()=>N,isAlive:y,killPid:(e,t)=>{process.kill(e,t)},destroy:t,log:T});return Q(E?Z(n,D):n,{log:T,exit:e.idleExit})},log:T,...e.serveContentAssets===void 0?{}:{serveContentAssets:e.serveContentAssets},...e.reactShellDistDir?{reactShellDistDir:e.reactShellDistDir}:{}});M||={action:`skip`,reason:`alive`,pid:0,port:0};let z=M,B=null;if(z.action===`skip`)B=z.port>0?z.port:null;else if(!d){let t=e.uiBindTimeoutMs??3e3;B=await X({readUiLock:()=>b(R.lockDir),now:Date.now,sleep:e=>w(e),timeoutMs:t,pollIntervalMs:50}),B===null&&T.warn({timeoutMs:t},`[start] ok ui did not bind within timeout — banner falls back to API URL`)}return{httpServer:R.httpServer,destroy:R.destroy,lockDir:R.lockDir,contentDir:j,port:R.port,ready:R.ready,degraded:R.degraded,uiSpawnDecision:M,spawnedUiPid:N,resolvedUiPort:B}}function ae(e){if(e===`browser`||e===`app`)return e;throw new o(`--mode must be 'browser' or 'app'`)}function oe(e){let t=Number.parseInt(e,10);if(Number.isNaN(t)||t<1||t>65535)throw new o(`--ui-port must be a port number between 1 and 65535`);return t}function se(e){return e.OK_CONSOLE_LEVEL!==void 0||e.LOG_LEVEL!==void 0?null:`warn`}function ce(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 le(e,t){let n=se(process.env);n!==null&&(process.env.OK_CONSOLE_LEVEL=n);let{renderBanner:r}=await import(`./banner-_FQsQkvC.mjs`),{accent:i,dim:a,error:o,warning:s}=await import(`./colors-CUOU_72x.mjs`),c=process.cwd(),l=e;process.title=H(c);let u=te(t,process.env),f=t.port===void 0?void 0:Number(t.port),p=process.env.PORT?Number(process.env.PORT):void 0,m=t.uiPort===void 0?void 0:Number(t.uiPort),h=K(f,p,m);if(m!==void 0){let{readServerLock:e,resolveLockDir:t}=await import(`./src-CfkR1g4Z.mjs`);if(q(m,e(t(c)))){await Y({cwd:c,uiPort:m});return}}let g;try{g=await ie({config:l,cwd:c,host:u,port:h,...m===void 0?{}:{uiPort:m},...t.serveContentAssets===void 0?{}:{serveContentAssets:t.serveContentAssets},...t.reactShellDistDir?{reactShellDistDir:t.reactShellDistDir}:{},...t.singleFile?{singleFile:t.singleFile}:{},...t.projectDir?{projectDir:t.projectDir}:{}})}catch(e){e instanceof U&&(console.error(o(e.message)),process.exit(1));let t=await import(`./src-CfkR1g4Z.mjs`);if((e instanceof t.GitNotAvailableError||e instanceof t.GitTooOldError)&&process.exit(78),(e instanceof t.SingleFileNotFoundError||e instanceof t.SingleFileNotAFileError||e instanceof t.SingleFileNotMarkdownError)&&(console.error(o(e.message)),process.exit(1)),m!==void 0&&ue(e,t)){await Y({cwd:c,uiPort:m});return}let n=de(e,c,t);n!==null&&(console.error(o(n)),process.exit(1)),console.error(`${o(`Failed to start:`)} ${e instanceof Error?e.stack??e.message:String(e)}`),process.exit(1)}let _=!1,v=async e=>{if(_)return;_=!0;let[t,...n]=ce(e);console.log(i(`\n${t}`));for(let e of n)console.log(a(` ${e}`));if(g.spawnedUiPid!==null)try{let{getLogger:e,isProcessAlive:t,readUiLock:n}=await import(`./src-CfkR1g4Z.mjs`);await $({readUiLock:()=>n(g.lockDir),spawnedUiPid:()=>g.spawnedUiPid,isAlive:t,killPid:(e,t)=>process.kill(e,t),log:e(`start`),reason:`shutdown`})}catch(e){console.error(`${o(`ui sibling teardown failed:`)} ${e instanceof Error?e.stack??e.message:String(e)}`)}try{await g.destroy()}catch(e){console.error(`${o(`destroy() failed:`)} ${e instanceof Error?e.stack??e.message:String(e)}`),process.exitCode=1}process.exit(process.exitCode??0)};process.once(`SIGINT`,()=>{v(`SIGINT`)}),process.once(`SIGTERM`,()=>{v(`SIGTERM`)});let y=`http://${u}:${g.port}`,b=u===`0.0.0.0`||u===`::`?`http://0.0.0.0:${g.port}`:void 0,x=g.resolvedUiPort,S=x!==null&&x>0?`http://${u}:${x}`:y;console.log(r({name:`open-knowledge`,version:d,localUrl:S,apiUrl:S===y?void 0:y,networkUrl:b,nextSteps:[`Open the Editor URL in your browser to start editing.`]}));let C={"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`};g.ready.then(async()=>{if(g.degraded.length>0){console.log();for(let e of g.degraded){let t=C[e]??`${e} (check server logs for details)`;console.warn(` ${s(`⚠`)} ${s(e)}: ${a(t)}`)}console.log()}if(t.open){let{openBrowser:e}=await import(`./open-browser-DRGRnTps.mjs`);e(S)}}).catch(e=>{console.error(` ${o(`Server initialization failed:`)} ${e instanceof Error?e.message:String(e)}`)})}function ue(e,t){let n=t.ServerLockCollisionError;return n!==void 0&&e instanceof n}function de(e,t,n){let r=n.ServerLockCollisionError;if(r===void 0||!(e instanceof r))return null;try{let e=h(t,`.ok`),r=n.readServerLock(e);return r?r.kind===`interactive`?`OpenKnowledge desktop is currently running on this project. Quit it or use --cwd to point elsewhere.`:r.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`.":"OpenKnowledge server is already running on this project — check `ok status` or `ok stop`."}catch{return null}}function fe(e){return new s(`start`).description(`Start the knowledge base collab server`).option(`-p, --port <port>`,`Server port`,void 0).option(`--ui-port <port>`,`Pin the ok ui sibling to <port> and connect (not exit) if a server already runs here — the worktree-preview recipe path`,oe).option(`-H, --host <host>`,`Server host`,void 0).option(`--open`,`Open browser after start`).option(`--mode <mode>`,`Force dispatch mode: 'browser' or 'app'`,ae).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> (suppresses ok ui sibling)`).option(`--single-file <path>`,`No-project ephemeral single-file mode: scope the server to one markdown file (git + MCP off)`).option(`--project-dir <dir>`,`Throwaway project root for --single-file (where ephemeral .ok/ state lives)`).action(async t=>{let n=e();if(t.mode===`app`){t.open&&(process.stderr.write(`error: option '--mode=app' cannot be combined with '--open' (--open opens a browser tab against the local server, which app mode does not boot)
|
|
1
|
+
import{L as e,P as t}from"./src-FuRMJntf.mjs";import{Nr as n,a as r,in as i,xr as a}from"./src-CaRd1QSi.mjs";import{S as o,x as s}from"./write-project-skill-CnAZrDt1.mjs";import{a as c,n as l,t as u}from"./acp-harness-probe-BtCFgpt9.mjs";import{n as d}from"./constants-geQohyDW.mjs";import{spawn as f}from"node:child_process";import{basename as p,dirname as m,join as h,win32 as g}from"node:path";import{closeSync as _,existsSync as v,mkdirSync as y,openSync as b,statSync as x}from"node:fs";import{homedir as S}from"node:os";import{rm as C}from"node:fs/promises";import{setTimeout as w}from"node:timers/promises";function T(e){let t={...e};return delete t.ELECTRON_RUN_AS_NODE,t}function E(e,t,r={}){let i=(r.spawn??f)(e,[...t],n({detached:!0,stdio:`ignore`,env:T(r.env??process.env)}));return i.unref(),i}const D=`OpenKnowledge.app`,O=`/Applications/${D}`;function k(){return{platform:process.platform,env:process.env,execPath:process.execPath,isTTY:process.stdout.isTTY,statSync:e=>{try{return x(e,{throwIfNoEntry:!1})??null}catch{return null}}}}function A(e){if(e.env.ELECTRON_RUN_AS_NODE===`1`){let t=/(.+?\.app)\/Contents\/MacOS\//.exec(e.execPath);if(t?.[1])return t[1]}if(j(e,O))return O;let t=h(e.homeDir??S(),`Applications`,D);return j(e,t)?t:null}function j(e,t){return M(e,h(t,`Contents`,`MacOS`,`OpenKnowledge`))}function M(e,t){try{let n=e.statSync(t);return n&&typeof n.isFile==`function`?n.isFile():!1}catch{return!1}}const N=[`@inkeepopen-knowledge-desktop`,`OpenKnowledge`];function P(e){if(e.env.ELECTRON_RUN_AS_NODE===`1`&&/\\OpenKnowledge\.exe$/i.test(e.execPath))return e.execPath;let t=e.env.LOCALAPPDATA;if(t)for(let n of N){let r=g.join(t,`Programs`,n,`OpenKnowledge.exe`);if(M(e,r))return r}return null}function F(e){if(e.env.ELECTRON_RUN_AS_NODE===`1`&&e.execPath.endsWith(`/openknowledge`))return e.execPath;let t=`/opt/OpenKnowledge/openknowledge`;return M(e,t)?t:null}function I(e){if(e.env.OK_FORCE_BROWSER===`1`)return{available:!1,reason:`force-browser`};if(e.platform!==`darwin`&&e.platform!==`win32`&&e.platform!==`linux`)return{available:!1,reason:`unsupported-platform`};let t;try{t=e.platform===`darwin`?A(e):e.platform===`win32`?P(e):F(e)}catch{return{available:!1,reason:`stat-error`}}return t?e.env.OK_FORCE_DESKTOP===`1`?{available:!0,reason:`available`,bundlePath:t}:!(e.isTTY===!0||e.platform===`win32`&&e.isTTY===void 0&&!e.env.CI)||e.env.SSH_CONNECTION||e.env.SSH_TTY||e.platform===`linux`&&!e.env.DISPLAY&&!e.env.WAYLAND_DISPLAY?{available:!1,reason:`headless`,bundlePath:t}:{available:!0,reason:`available`,bundlePath:t}:{available:!1,reason:`no-bundle`}}function L(e,t){let n=e.log??(e=>console.error(e)),r=e.platform??process.platform;if(n("Launching OpenKnowledge desktop (use `ok start` for the browser server, or `OK_FORCE_BROWSER=1` to always skip)"),r===`darwin`){E(`open`,[`-b`,`com.inkeep.open-knowledge`],{spawn:e.spawn});return}let i=t?.bundlePath;if(!i){n(`Desktop launch skipped: no resolved desktop executable (caller bug).`);return}E(i,[],{spawn:e.spawn})}function R(e=`no-bundle`){switch(e){case`no-bundle`:return`Desktop app not found (checked the standard install locations for this OS). Install it, or omit --mode for browser mode.`;case`darwin-only`:case`unsupported-platform`:return`Desktop app is not available on this platform. Use --mode=browser, or omit --mode for the server fallback.`;case`headless`:return`Desktop launch is gated in headless contexts (CI, SSH, non-TTY stdout). Set OK_FORCE_DESKTOP=1 to override, or use --mode=browser.`;case`force-browser`:return`OK_FORCE_BROWSER=1 is set — desktop dispatch is disabled. Unset it to use --mode=app.`;case`stat-error`:return`Failed to inspect the desktop install (filesystem error). Check permissions or use --mode=browser.`;case`available`:return`Desktop app appears available but launch dispatch did not fire (caller bug).`}}function z(e){return h(m(e),`..`,`Frameworks`,`OpenKnowledge Server.app`,`Contents`,`MacOS`,`OpenKnowledge Helper`)}const B=/\/[^/]+\.app\/Contents\/MacOS\/[^/]+$/;function ee(e){if(e.platform!==`darwin`||!B.test(e.execPath))return null;let t=z(e.execPath);return e.exists(t)?t:null}function V(e={}){let t=e.execPath??process.execPath,n=e.platform??process.platform,r=e.argv??process.argv,i=e.exists??v,a=r[1];return a?{command:ee({execPath:t,platform:n,exists:i})??t,prefixArgs:[a]}:(console.warn(`[self-spawn] process.argv[1] is empty — falling back to \`npx -y @inkeep/open-knowledge@latest\`. This re-introduces the registry-fetch surface that re-exec was fixing. Observed argv: ${JSON.stringify(r)}`),{command:`npx`,prefixArgs:[`-y`,`@inkeep/open-knowledge@latest`]})}function te(e,t){return e.host??t.HOST??`127.0.0.1`}function H(e){let t=p(e).replace(/[^\x20-\x7E]/g,``).trim().slice(0,64);return`open-knowledge-server ${t.length>0?t:`unknown`}`}var U=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}};function W(e){return e.uiLock?e.isAlive(e.uiLock.pid)?{action:`skip`,reason:`alive`,pid:e.uiLock.pid,port:e.uiLock.port}:{action:`spawn`,reason:`stale`,stalePid:e.uiLock.pid}:{action:`spawn`,reason:`absent`}}function G(t){v(t.lockDir)||y(t.lockDir,{recursive:!0});let n=b(h(t.lockDir,e),`w`),r=t.spawn??f,{PORT:i,...a}=process.env,o=V();try{let e=r(o.command,[...o.prefixArgs,...t.args??[`ui`]],{detached:!0,stdio:[`ignore`,`ignore`,n],windowsHide:!0,cwd:t.cwd,env:{...a,ELECTRON_RUN_AS_NODE:`1`}});return e.unref(),e}finally{try{_(n)}catch{}}}function K(e,t,n){return e??(n===void 0?t:void 0)}function q(e,t){return e!==void 0&&t!==null&&t.port>0&&t.draining!==!0}function J(e,t,n){return e??+(t!=null&&!n)}async function Y(e){let t=e.spawn??f,n=V(),{PORT:r,...i}=process.env,a=t(n.command,[...n.prefixArgs,`ui`,`--port`,String(e.uiPort)],{cwd:e.cwd,stdio:`inherit`,windowsHide:!0,env:{...i,ELECTRON_RUN_AS_NODE:`1`}}),o=!1,s=e=>{o=!0;try{a.kill(e)}catch{}},c=()=>s(`SIGINT`),l=()=>s(`SIGTERM`);process.once(`SIGINT`,c),process.once(`SIGTERM`,l),await new Promise(e=>{a.on(`exit`,(t,n)=>{process.exitCode=J(t,n,o),e()}),a.on(`error`,t=>{console.error(`[start] connect fallback: failed to spawn ok ui — ${t instanceof Error?t.message:String(t)}`),process.exitCode=1,e()})}),process.removeListener(`SIGINT`,c),process.removeListener(`SIGTERM`,l)}async function X(e){let t=e.now()+e.timeoutMs;for(;e.now()<t;){let t=e.readUiLock();if(t&&t.port>0)return t.port;await e.sleep(e.pollIntervalMs)}let n=e.readUiLock();return n&&n.port>0?n.port:null}const ne=t;function Z(e,t,n=e=>C(e,{recursive:!0,force:!0})){return async()=>{try{await e()}finally{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`)}}}}function Q(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 $(e){let t=e.sigtermGraceMs??ne,n=e.sigtermPollIntervalMs??200,r=e.sleep??(e=>w(e)),i=e.reason??`teardown`;try{let a=e.readUiLock(),o=e.spawnedUiPid();if(a&&e.isAlive(a.pid)&&a.pid!==o)e.log?.info({pid:a.pid,port:a.port,spawnedUiPid:o},`${i}: ui.lock holder is not our spawned sibling — leaving it alone`);else if(a&&e.isAlive(a.pid))try{e.killPid(a.pid,`SIGTERM`),e.log?.info({pid:a.pid,port:a.port},`${i}: SIGTERM UI sibling`);let o=Date.now()+t;for(;Date.now()<o&&e.isAlive(a.pid);)await r(n);if(e.isAlive(a.pid))try{e.killPid(a.pid,`SIGKILL`),e.log?.warn({pid:a.pid,graceMs:t},`${i}: SIGTERM grace expired — escalated to SIGKILL`)}catch(t){e.log?.error({pid:a.pid,err:t},`${i}: SIGKILL failed`)}}catch(t){e.log?.warn({pid:a.pid,err:t},`${i}: failed to SIGTERM UI sibling`)}}catch(t){e.log?.warn({err:t},`${i}: UI lookup failed; proceeding`)}}function re(e){let{destroy:t,...n}=e;return async()=>{await $({...n,reason:`idle-shutdown`}),await t()}}async function ie(e){let{config:t,cwd:n,host:o}=e,s=e.skipAutoInit??!1,d=e.skipUiAutoSpawn??!1,f=e.idleThresholdMs??18e5,{existsSync:p,mkdirSync:m}=await import(`node:fs`),{basename:h,dirname:g}=await import(`node:path`),{bootServer:_,getLogger:v,isProcessAlive:y,readUiLock:b,resolveContentDir:x,resolveLockDir:S,waitForServerLockDrain:C}=await import(`./src-BNWCeu4P.mjs`),T=e.log??v(`start`),E=e.singleFile!==void 0,D=e.projectDir??n,O=E?r(e.singleFile).canonicalFilePath:void 0,k=O?g(O):void 0,A=O?h(O):void 0;if(!E){if(!s&&!i(n))throw new U(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`))&&T.warn({event:e},`[start] reclaim sweep reported a problem`)};try{(e.repairMcpConfigsFn??(await import(`./repair-mcp-configs-CKxdm8Dd.mjs`)).repairMcpConfigs)({projectDir:n,reclaimDisableEnv:t,logger:r})}catch(e){T.warn({err:e},`[start] mcp-config repair sweep failed; continuing`)}try{(e.repairLaunchJsonFn??(await import(`./repair-launch-json-DUkhIhmI.mjs`)).repairLaunchJson)({projectDir:n,reclaimDisableEnv:t,logger:r})}catch(e){T.warn({err:e},`[start] launch.json repair sweep failed; continuing`)}try{await(e.repairSkillsFn??(await import(`./repair-skills-D2vECWae.mjs`)).repairSkills)({projectDir:n,reclaimDisableEnv:t,logger:r})}catch(e){T.warn({err:e},`[start] skill repair sweep failed; continuing`)}}let j=k??x(t,n);!E&&!p(j)&&(m(j,{recursive:!0}),T.info({contentDir:j},`Created content directory`));let M=null,N=null,P=async({lockDir:t})=>{if(M=W({uiLock:b(t),isAlive:y}),M.action===`spawn`&&!d)try{let r=e.uiPort===void 0?void 0:[`ui`,`--port`,String(e.uiPort)];N=G({lockDir:t,cwd:n,spawn:e.spawn,args:r}).pid??null,T.info({reason:M.reason,uiPort:e.uiPort},`[start] auto-spawned ok ui sibling`)}catch(e){console.warn(`[start] failed to auto-spawn ok ui: ${e instanceof Error?e.message:String(e)}`)}else M.action===`skip`&&T.info({port:M.port,pid:M.pid},`UI already running at port ${M.port}`)},F=e.reactShellDistDir===void 0,I=c(),L=a();{let e=S(E?D:n),t=Date.now(),r=await C(e);r!==`no-drain`&&T.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`)}let R=await _({config:t,contentDir:j,projectDir:E?D:n,contentRoot:E?void 0:t.content.dir,port:e.port,host:o,quiet:!1,detectGh:l,tokenStore:I,embeddingsKeyStore:L,...E?{ephemeral:!0,singleDocRelPath:A,gitEnabled:!1,gitPreflight:()=>({ok:!0,version:`0.0.0`,resolvedPath:`git`,source:`PATH`})}:{},localOpCliArgs:[process.execPath,process.argv[1]],probeHarnessManagedMcpEntry:(e,t)=>u(e,t),attachUiSibling:F,idleShutdownMs:f,skipAutoInit:!0,...F?{spawnUiSiblingFn:P}:{},idleShutdownHandler:t=>{let n=re({readUiLock:()=>b(R.lockDir),spawnedUiPid:()=>N,isAlive:y,killPid:(e,t)=>{process.kill(e,t)},destroy:t,log:T});return Q(E?Z(n,D):n,{log:T,exit:e.idleExit})},log:T,...e.serveContentAssets===void 0?{}:{serveContentAssets:e.serveContentAssets},...e.reactShellDistDir?{reactShellDistDir:e.reactShellDistDir}:{}});M||={action:`skip`,reason:`alive`,pid:0,port:0};let z=M,B=null;if(z.action===`skip`)B=z.port>0?z.port:null;else if(!d){let t=e.uiBindTimeoutMs??3e3;B=await X({readUiLock:()=>b(R.lockDir),now:Date.now,sleep:e=>w(e),timeoutMs:t,pollIntervalMs:50}),B===null&&T.warn({timeoutMs:t},`[start] ok ui did not bind within timeout — banner falls back to API URL`)}return{httpServer:R.httpServer,destroy:R.destroy,lockDir:R.lockDir,contentDir:j,port:R.port,ready:R.ready,degraded:R.degraded,uiSpawnDecision:M,spawnedUiPid:N,resolvedUiPort:B}}function ae(e){if(e===`browser`||e===`app`)return e;throw new o(`--mode must be 'browser' or 'app'`)}function oe(e){let t=Number.parseInt(e,10);if(Number.isNaN(t)||t<1||t>65535)throw new o(`--ui-port must be a port number between 1 and 65535`);return t}function se(e){return e.OK_CONSOLE_LEVEL!==void 0||e.LOG_LEVEL!==void 0?null:`warn`}function ce(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 le(e,t){let n=se(process.env);n!==null&&(process.env.OK_CONSOLE_LEVEL=n);let{renderBanner:r}=await import(`./banner-_FQsQkvC.mjs`),{accent:i,dim:a,error:o,warning:s}=await import(`./colors-CUOU_72x.mjs`),c=process.cwd(),l=e;process.title=H(c);let u=te(t,process.env),f=t.port===void 0?void 0:Number(t.port),p=process.env.PORT?Number(process.env.PORT):void 0,m=t.uiPort===void 0?void 0:Number(t.uiPort),h=K(f,p,m);if(m!==void 0){let{readServerLock:e,resolveLockDir:t}=await import(`./src-BNWCeu4P.mjs`);if(q(m,e(t(c)))){await Y({cwd:c,uiPort:m});return}}let g;try{g=await ie({config:l,cwd:c,host:u,port:h,...m===void 0?{}:{uiPort:m},...t.serveContentAssets===void 0?{}:{serveContentAssets:t.serveContentAssets},...t.reactShellDistDir?{reactShellDistDir:t.reactShellDistDir}:{},...t.singleFile?{singleFile:t.singleFile}:{},...t.projectDir?{projectDir:t.projectDir}:{}})}catch(e){e instanceof U&&(console.error(o(e.message)),process.exit(1));let t=await import(`./src-BNWCeu4P.mjs`);if((e instanceof t.GitNotAvailableError||e instanceof t.GitTooOldError)&&process.exit(78),(e instanceof t.SingleFileNotFoundError||e instanceof t.SingleFileNotAFileError||e instanceof t.SingleFileNotMarkdownError)&&(console.error(o(e.message)),process.exit(1)),m!==void 0&&ue(e,t)){await Y({cwd:c,uiPort:m});return}let n=de(e,c,t);n!==null&&(console.error(o(n)),process.exit(1)),console.error(`${o(`Failed to start:`)} ${e instanceof Error?e.stack??e.message:String(e)}`),process.exit(1)}let _=!1,v=async e=>{if(_)return;_=!0;let[t,...n]=ce(e);console.log(i(`\n${t}`));for(let e of n)console.log(a(` ${e}`));if(g.spawnedUiPid!==null)try{let{getLogger:e,isProcessAlive:t,readUiLock:n}=await import(`./src-BNWCeu4P.mjs`);await $({readUiLock:()=>n(g.lockDir),spawnedUiPid:()=>g.spawnedUiPid,isAlive:t,killPid:(e,t)=>process.kill(e,t),log:e(`start`),reason:`shutdown`})}catch(e){console.error(`${o(`ui sibling teardown failed:`)} ${e instanceof Error?e.stack??e.message:String(e)}`)}try{await g.destroy()}catch(e){console.error(`${o(`destroy() failed:`)} ${e instanceof Error?e.stack??e.message:String(e)}`),process.exitCode=1}process.exit(process.exitCode??0)};process.once(`SIGINT`,()=>{v(`SIGINT`)}),process.once(`SIGTERM`,()=>{v(`SIGTERM`)});let y=`http://${u}:${g.port}`,b=u===`0.0.0.0`||u===`::`?`http://0.0.0.0:${g.port}`:void 0,x=g.resolvedUiPort,S=x!==null&&x>0?`http://${u}:${x}`:y;console.log(r({name:`open-knowledge`,version:d,localUrl:S,apiUrl:S===y?void 0:y,networkUrl:b,nextSteps:[`Open the Editor URL in your browser to start editing.`]}));let C={"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`};g.ready.then(async()=>{if(g.degraded.length>0){console.log();for(let e of g.degraded){let t=C[e]??`${e} (check server logs for details)`;console.warn(` ${s(`⚠`)} ${s(e)}: ${a(t)}`)}console.log()}if(t.open){let{openBrowser:e}=await import(`./open-browser-BAGk1RTK.mjs`);e(S)}}).catch(e=>{console.error(` ${o(`Server initialization failed:`)} ${e instanceof Error?e.message:String(e)}`)})}function ue(e,t){let n=t.ServerLockCollisionError;return n!==void 0&&e instanceof n}function de(e,t,n){let r=n.ServerLockCollisionError;if(r===void 0||!(e instanceof r))return null;try{let e=h(t,`.ok`),r=n.readServerLock(e);return r?r.kind===`interactive`?`OpenKnowledge desktop is currently running on this project. Quit it or use --cwd to point elsewhere.`:r.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`.":"OpenKnowledge server is already running on this project — check `ok status` or `ok stop`."}catch{return null}}function fe(e){return new s(`start`).description(`Start the knowledge base collab server`).option(`-p, --port <port>`,`Server port`,void 0).option(`--ui-port <port>`,`Pin the ok ui sibling to <port> and connect (not exit) if a server already runs here — the worktree-preview recipe path`,oe).option(`-H, --host <host>`,`Server host`,void 0).option(`--open`,`Open browser after start`).option(`--mode <mode>`,`Force dispatch mode: 'browser' or 'app'`,ae).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> (suppresses ok ui sibling)`).option(`--single-file <path>`,`No-project ephemeral single-file mode: scope the server to one markdown file (git + MCP off)`).option(`--project-dir <dir>`,`Throwaway project root for --single-file (where ephemeral .ok/ state lives)`).action(async t=>{let n=e();if(t.mode===`app`){t.open&&(process.stderr.write(`error: option '--mode=app' cannot be combined with '--open' (--open opens a browser tab against the local server, which app mode does not boot)
|
|
2
2
|
`),process.exit(2));let e=[];if(t.port!==void 0&&e.push(`--port`),t.uiPort!==void 0&&e.push(`--ui-port`),t.host!==void 0&&e.push(`--host`),e.length>0){let t=process.env.OK_LOG_LEVEL??`info`;(t===`debug`||t===`trace`)&&console.error(`--mode=app: ignoring ${e.join(`, `)}`)}let n=I(k());if(n.available){L({spawn:f},n);return}console.error(R(n.reason)),process.exit(1)}await le(n,t)})}export{k as C,E,V as S,L as T,fe as _,J as a,Z as b,H as c,K as d,te as f,G as g,q as h,re as i,ce as l,le as m,X as n,Y as o,se as p,ie as r,W as s,U as t,ue as u,$ as v,I as w,Q as x,de as y};
|
|
3
|
-
//# sourceMappingURL=start-
|
|
3
|
+
//# sourceMappingURL=start-BZulfzdD.mjs.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{i as e,o as t,t as n}from"./chunk-DTipWd-i.mjs";import{ha as r,ma as i,sa as a,va as o}from"./src-FuRMJntf.mjs";import{Hn as s,Ln as c,Vn as l,nr as u}from"./src-
|
|
1
|
+
import{i as e,o as t,t as n}from"./chunk-DTipWd-i.mjs";import{ha as r,ma as i,sa as a,va as o}from"./src-FuRMJntf.mjs";import{Hn as s,Ln as c,Vn as l,nr as u}from"./src-CaRd1QSi.mjs";import{basename as d,dirname as f,isAbsolute as p,join as m,posix as h,relative as g,resolve as _,sep as v,win32 as y}from"node:path";import{cpSync as ee,existsSync as b,lstatSync as te,mkdirSync as ne,readFileSync as re,realpathSync as x,rmSync as S,statSync as ie}from"node:fs";import{homedir as C}from"node:os";var w=n((e=>{var t=class extends Error{constructor(e,t,n){super(n),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name,this.code=t,this.exitCode=e,this.nestedError=void 0}},n=class extends t{constructor(e){super(1,`commander.invalidArgument`,e),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name}};e.CommanderError=t,e.InvalidArgumentError=n})),T=n((e=>{let{InvalidArgumentError:t}=w();var n=class{constructor(e,t){switch(this.description=t||``,this.variadic=!1,this.parseArg=void 0,this.defaultValue=void 0,this.defaultValueDescription=void 0,this.argChoices=void 0,e[0]){case`<`:this.required=!0,this._name=e.slice(1,-1);break;case`[`:this.required=!1,this._name=e.slice(1,-1);break;default:this.required=!0,this._name=e;break}this._name.endsWith(`...`)&&(this.variadic=!0,this._name=this._name.slice(0,-3))}name(){return this._name}_collectValue(e,t){return t===this.defaultValue||!Array.isArray(t)?[e]:(t.push(e),t)}default(e,t){return this.defaultValue=e,this.defaultValueDescription=t,this}argParser(e){return this.parseArg=e,this}choices(e){return this.argChoices=e.slice(),this.parseArg=(e,n)=>{if(!this.argChoices.includes(e))throw new t(`Allowed choices are ${this.argChoices.join(`, `)}.`);return this.variadic?this._collectValue(e,n):e},this}argRequired(){return this.required=!0,this}argOptional(){return this.required=!1,this}};function r(e){let t=e.name()+(e.variadic===!0?`...`:``);return e.required?`<`+t+`>`:`[`+t+`]`}e.Argument=n,e.humanReadableArgName=r})),E=n((e=>{let{humanReadableArgName:t}=T();var n=class{constructor(){this.helpWidth=void 0,this.minWidthToWrap=40,this.sortSubcommands=!1,this.sortOptions=!1,this.showGlobalOptions=!1}prepareContext(e){this.helpWidth=this.helpWidth??e.helpWidth??80}visibleCommands(e){let t=e.commands.filter(e=>!e._hidden),n=e._getHelpCommand();return n&&!n._hidden&&t.push(n),this.sortSubcommands&&t.sort((e,t)=>e.name().localeCompare(t.name())),t}compareOptions(e,t){let n=e=>e.short?e.short.replace(/^-/,``):e.long.replace(/^--/,``);return n(e).localeCompare(n(t))}visibleOptions(e){let t=e.options.filter(e=>!e.hidden),n=e._getHelpOption();if(n&&!n.hidden){let r=n.short&&e._findOption(n.short),i=n.long&&e._findOption(n.long);!r&&!i?t.push(n):n.long&&!i?t.push(e.createOption(n.long,n.description)):n.short&&!r&&t.push(e.createOption(n.short,n.description))}return this.sortOptions&&t.sort(this.compareOptions),t}visibleGlobalOptions(e){if(!this.showGlobalOptions)return[];let t=[];for(let n=e.parent;n;n=n.parent){let e=n.options.filter(e=>!e.hidden);t.push(...e)}return this.sortOptions&&t.sort(this.compareOptions),t}visibleArguments(e){return e._argsDescription&&e.registeredArguments.forEach(t=>{t.description=t.description||e._argsDescription[t.name()]||``}),e.registeredArguments.find(e=>e.description)?e.registeredArguments:[]}subcommandTerm(e){let n=e.registeredArguments.map(e=>t(e)).join(` `);return e._name+(e._aliases[0]?`|`+e._aliases[0]:``)+(e.options.length?` [options]`:``)+(n?` `+n:``)}optionTerm(e){return e.flags}argumentTerm(e){return e.name()}longestSubcommandTermLength(e,t){return t.visibleCommands(e).reduce((e,n)=>Math.max(e,this.displayWidth(t.styleSubcommandTerm(t.subcommandTerm(n)))),0)}longestOptionTermLength(e,t){return t.visibleOptions(e).reduce((e,n)=>Math.max(e,this.displayWidth(t.styleOptionTerm(t.optionTerm(n)))),0)}longestGlobalOptionTermLength(e,t){return t.visibleGlobalOptions(e).reduce((e,n)=>Math.max(e,this.displayWidth(t.styleOptionTerm(t.optionTerm(n)))),0)}longestArgumentTermLength(e,t){return t.visibleArguments(e).reduce((e,n)=>Math.max(e,this.displayWidth(t.styleArgumentTerm(t.argumentTerm(n)))),0)}commandUsage(e){let t=e._name;e._aliases[0]&&(t=t+`|`+e._aliases[0]);let n=``;for(let t=e.parent;t;t=t.parent)n=t.name()+` `+n;return n+t+` `+e.usage()}commandDescription(e){return e.description()}subcommandDescription(e){return e.summary()||e.description()}optionDescription(e){let t=[];if(e.argChoices&&t.push(`choices: ${e.argChoices.map(e=>JSON.stringify(e)).join(`, `)}`),e.defaultValue!==void 0&&(e.required||e.optional||e.isBoolean()&&typeof e.defaultValue==`boolean`)&&t.push(`default: ${e.defaultValueDescription||JSON.stringify(e.defaultValue)}`),e.presetArg!==void 0&&e.optional&&t.push(`preset: ${JSON.stringify(e.presetArg)}`),e.envVar!==void 0&&t.push(`env: ${e.envVar}`),t.length>0){let n=`(${t.join(`, `)})`;return e.description?`${e.description} ${n}`:n}return e.description}argumentDescription(e){let t=[];if(e.argChoices&&t.push(`choices: ${e.argChoices.map(e=>JSON.stringify(e)).join(`, `)}`),e.defaultValue!==void 0&&t.push(`default: ${e.defaultValueDescription||JSON.stringify(e.defaultValue)}`),t.length>0){let n=`(${t.join(`, `)})`;return e.description?`${e.description} ${n}`:n}return e.description}formatItemList(e,t,n){return t.length===0?[]:[n.styleTitle(e),...t,``]}groupItems(e,t,n){let r=new Map;return e.forEach(e=>{let t=n(e);r.has(t)||r.set(t,[])}),t.forEach(e=>{let t=n(e);r.has(t)||r.set(t,[]),r.get(t).push(e)}),r}formatHelp(e,t){let n=t.padWidth(e,t),r=t.helpWidth??80;function i(e,r){return t.formatItem(e,n,r,t)}let a=[`${t.styleTitle(`Usage:`)} ${t.styleUsage(t.commandUsage(e))}`,``],o=t.commandDescription(e);o.length>0&&(a=a.concat([t.boxWrap(t.styleCommandDescription(o),r),``]));let s=t.visibleArguments(e).map(e=>i(t.styleArgumentTerm(t.argumentTerm(e)),t.styleArgumentDescription(t.argumentDescription(e))));if(a=a.concat(this.formatItemList(`Arguments:`,s,t)),this.groupItems(e.options,t.visibleOptions(e),e=>e.helpGroupHeading??`Options:`).forEach((e,n)=>{let r=e.map(e=>i(t.styleOptionTerm(t.optionTerm(e)),t.styleOptionDescription(t.optionDescription(e))));a=a.concat(this.formatItemList(n,r,t))}),t.showGlobalOptions){let n=t.visibleGlobalOptions(e).map(e=>i(t.styleOptionTerm(t.optionTerm(e)),t.styleOptionDescription(t.optionDescription(e))));a=a.concat(this.formatItemList(`Global Options:`,n,t))}return this.groupItems(e.commands,t.visibleCommands(e),e=>e.helpGroup()||`Commands:`).forEach((e,n)=>{let r=e.map(e=>i(t.styleSubcommandTerm(t.subcommandTerm(e)),t.styleSubcommandDescription(t.subcommandDescription(e))));a=a.concat(this.formatItemList(n,r,t))}),a.join(`
|
|
2
2
|
`)}displayWidth(e){return r(e).length}styleTitle(e){return e}styleUsage(e){return e.split(` `).map(e=>e===`[options]`?this.styleOptionText(e):e===`[command]`?this.styleSubcommandText(e):e[0]===`[`||e[0]===`<`?this.styleArgumentText(e):this.styleCommandText(e)).join(` `)}styleCommandDescription(e){return this.styleDescriptionText(e)}styleOptionDescription(e){return this.styleDescriptionText(e)}styleSubcommandDescription(e){return this.styleDescriptionText(e)}styleArgumentDescription(e){return this.styleDescriptionText(e)}styleDescriptionText(e){return e}styleOptionTerm(e){return this.styleOptionText(e)}styleSubcommandTerm(e){return e.split(` `).map(e=>e===`[options]`?this.styleOptionText(e):e[0]===`[`||e[0]===`<`?this.styleArgumentText(e):this.styleSubcommandText(e)).join(` `)}styleArgumentTerm(e){return this.styleArgumentText(e)}styleOptionText(e){return e}styleArgumentText(e){return e}styleSubcommandText(e){return e}styleCommandText(e){return e}padWidth(e,t){return Math.max(t.longestOptionTermLength(e,t),t.longestGlobalOptionTermLength(e,t),t.longestSubcommandTermLength(e,t),t.longestArgumentTermLength(e,t))}preformatted(e){return/\n[^\S\r\n]/.test(e)}formatItem(e,t,n,r){let i=` `.repeat(2);if(!n)return i+e;let a=e.padEnd(t+e.length-r.displayWidth(e)),o=(this.helpWidth??80)-t-2-2,s;return s=o<this.minWidthToWrap||r.preformatted(n)?n:r.boxWrap(n,o).replace(/\n/g,`
|
|
3
3
|
`+` `.repeat(t+2)),i+a+` `.repeat(2)+s.replace(/\n/g,`\n${i}`)}boxWrap(e,t){if(t<this.minWidthToWrap)return e;let n=e.split(/\r\n|\n/),r=/[\s]*[^\s]+/g,i=[];return n.forEach(e=>{let n=e.match(r);if(n===null){i.push(``);return}let a=[n.shift()],o=this.displayWidth(a[0]);n.forEach(e=>{let n=this.displayWidth(e);if(o+n<=t){a.push(e),o+=n;return}i.push(a.join(``));let r=e.trimStart();a=[r],o=this.displayWidth(r)}),i.push(a.join(``))}),i.join(`
|
|
4
4
|
`)}};function r(e){return e.replace(/\x1b\[\d*(;\d*)*m/g,``)}e.Help=n,e.stripColor=r})),D=n((e=>{let{InvalidArgumentError:t}=w();var n=class{constructor(e,t){this.flags=e,this.description=t||``,this.required=e.includes(`<`),this.optional=e.includes(`[`),this.variadic=/\w\.\.\.[>\]]$/.test(e),this.mandatory=!1;let n=a(e);this.short=n.shortFlag,this.long=n.longFlag,this.negate=!1,this.long&&(this.negate=this.long.startsWith(`--no-`)),this.defaultValue=void 0,this.defaultValueDescription=void 0,this.presetArg=void 0,this.envVar=void 0,this.parseArg=void 0,this.hidden=!1,this.argChoices=void 0,this.conflictsWith=[],this.implied=void 0,this.helpGroupHeading=void 0}default(e,t){return this.defaultValue=e,this.defaultValueDescription=t,this}preset(e){return this.presetArg=e,this}conflicts(e){return this.conflictsWith=this.conflictsWith.concat(e),this}implies(e){let t=e;return typeof e==`string`&&(t={[e]:!0}),this.implied=Object.assign(this.implied||{},t),this}env(e){return this.envVar=e,this}argParser(e){return this.parseArg=e,this}makeOptionMandatory(e=!0){return this.mandatory=!!e,this}hideHelp(e=!0){return this.hidden=!!e,this}_collectValue(e,t){return t===this.defaultValue||!Array.isArray(t)?[e]:(t.push(e),t)}choices(e){return this.argChoices=e.slice(),this.parseArg=(e,n)=>{if(!this.argChoices.includes(e))throw new t(`Allowed choices are ${this.argChoices.join(`, `)}.`);return this.variadic?this._collectValue(e,n):e},this}name(){return this.long?this.long.replace(/^--/,``):this.short.replace(/^-/,``)}attributeName(){return this.negate?i(this.name().replace(/^no-/,``)):i(this.name())}helpGroup(e){return this.helpGroupHeading=e,this}is(e){return this.short===e||this.long===e}isBoolean(){return!this.required&&!this.optional&&!this.negate}},r=class{constructor(e){this.positiveOptions=new Map,this.negativeOptions=new Map,this.dualOptions=new Set,e.forEach(e=>{e.negate?this.negativeOptions.set(e.attributeName(),e):this.positiveOptions.set(e.attributeName(),e)}),this.negativeOptions.forEach((e,t)=>{this.positiveOptions.has(t)&&this.dualOptions.add(t)})}valueFromOption(e,t){let n=t.attributeName();if(!this.dualOptions.has(n))return!0;let r=this.negativeOptions.get(n).presetArg,i=r===void 0?!1:r;return t.negate===(i===e)}};function i(e){return e.split(`-`).reduce((e,t)=>e+t[0].toUpperCase()+t.slice(1))}function a(e){let t,n,r=/^-[^-]$/,i=/^--[^-]/,a=e.split(/[ |,]+/).concat(`guard`);if(r.test(a[0])&&(t=a.shift()),i.test(a[0])&&(n=a.shift()),!t&&r.test(a[0])&&(t=a.shift()),!t&&i.test(a[0])&&(t=n,n=a.shift()),a[0].startsWith(`-`)){let t=a[0],n=`option creation failed due to '${t}' in option flags '${e}'`;throw/^-[^-][^-]/.test(t)?Error(`${n}
|
|
@@ -53,4 +53,4 @@ foreach ($d in $dirs) {
|
|
|
53
53
|
}
|
|
54
54
|
[Console]::Error.WriteLine('OpenKnowledge: install Node.js 24+ (npm i -g @inkeep/open-knowledge), then restart your editor')
|
|
55
55
|
exit 127`,F=`// ok-pi-bridge`,I=`${F}-v1`,ve=`ok-pi-managed-extension`;function ye(e){if(typeof e!=`object`||!e)return!1;let t=e;if(t.command===`/bin/sh`){if(!Array.isArray(t.args)||t.args[0]!==`-l`||t.args[1]!==`-c`)return!1;let e=t.args[2];return typeof e==`string`&&e.includes(`# ok-mcp-v2`)}if(t.command===`powershell`){if(!Array.isArray(t.args)||t.args[0]!==`-NoProfile`||t.args[1]!==`-NonInteractive`||t.args[2]!==`-Command`)return!1;let e=t.args[3];return typeof e==`string`&&e.includes(`# ok-mcp-win-v1`)}if(t.type===`local`&&Array.isArray(t.command)){if(t.command[0]===`/bin/sh`){if(t.command[1]!==`-l`||t.command[2]!==`-c`)return!1;let e=t.command[3];return typeof e==`string`&&e.includes(`# ok-mcp-v2`)}if(t.command[0]===`powershell`){if(t.command[1]!==`-NoProfile`||t.command[2]!==`-NonInteractive`||t.command[3]!==`-Command`)return!1;let e=t.command[4];return typeof e==`string`&&e.includes(`# ok-mcp-win-v1`)}return!1}if(t.command===`ok-pi-managed-extension`){if(!Array.isArray(t.args))return!1;let e=t.args[0];return typeof e==`string`&&e.startsWith(I)}return!1}function L(e=process.argv[1]){if(!e)throw Error(`Cannot infer the local CLI entry for --dev-mcp because process.argv[1] is empty.`);let t=_(e);if(d(t)===`cli.mjs`&&d(f(t))===`dist`)return t;let n=t.split(v),r=n.lastIndexOf(`packages`);if(r===-1||n[r+1]!==`cli`)throw Error(`Cannot infer the repo root for --dev-mcp from ${t}. Run the local CLI from this repo so the built dist path can be derived.`);let i=n.slice(0,r);return m(i.length===0?v:i.join(v),`packages`,`cli`,`dist`,`cli.mjs`)}function R(e={}){return e.mode===`dev`?{command:j,args:[L(),`mcp`],env:{...M}}:(e.platformName??process.platform)===`win32`?{command:`powershell`,args:[`-NoProfile`,`-NonInteractive`,`-Command`,P]}:{command:`/bin/sh`,args:[`-l`,`-c`,N]}}function be(e={}){return e.mode===`dev`?{type:`local`,enabled:!0,command:[j,L(),`mcp`],environment:{...M}}:(e.platformName??process.platform)===`win32`?{type:`local`,enabled:!0,command:[`powershell`,`-NoProfile`,`-NonInteractive`,`-Command`,P]}:{type:`local`,enabled:!0,command:[`/bin/sh`,`-l`,`-c`,N]}}function xe(e){if(typeof e!=`object`||!e)return!1;let t=e;return z(t,R({mode:`published`,platformName:`darwin`}))||z(t,R({mode:`published`,platformName:`win32`}))}function z(e,t){return Object.keys(e).length===Object.keys(t).length?Se(e,t):!1}function Se(e,t){if(e.command!==t.command)return!1;let n=t.args;return!Array.isArray(n)||!Array.isArray(e.args)||e.args.length!==n.length?!1:e.args.every((e,t)=>e===n[t])}function B(e,t){let n=e=>typeof e==`string`&&e.includes(`# ok-mcp`);return t===`/bin/sh`?e[0]===`-l`&&e[1]===`-c`&&n(e[2]):t===`powershell`?e[0]===`-NoProfile`&&e[1]===`-NonInteractive`&&e[2]===`-Command`&&n(e[3]):!1}function Ce(e){if(typeof e!=`object`||!e)return!1;let t=e;return t.enabled===!1||typeof t.command!=`string`||!Array.isArray(t.args)?!1:B(t.args,t.command)}function we(e){if(typeof e!=`object`||!e)return!1;let t=e;if(t.type!==`local`||t.enabled===!1||!Array.isArray(t.command))return!1;let[n,...r]=t.command;return typeof n==`string`&&B(r,n)}function V(e){return e===`win32`?y:h}function Te(e={}){let t=e.platformName??process.platform,n=e.home??C(),r=e.env??process.env,i=V(t);return t===`darwin`?i.join(n,`Library`,`Application Support`):t===`win32`?r.APPDATA??i.join(n,`AppData`,`Roaming`):r.XDG_CONFIG_HOME??i.join(n,`.config`)}function Ee(e={}){let t=e.platformName??process.platform,n=e.home??C();return V(t).join(n,`.claude.json`)}function H(e={}){let t=e.platformName??process.platform,n=e.home??C(),r=e.env??process.env;if(t===`darwin`)return h.join(n,`Library`,`Application Support`,`Claude`,`claude_desktop_config.json`);if(t===`win32`){let e=r.APPDATA??y.join(n,`AppData`,`Roaming`);return y.join(e,`Claude`,`claude_desktop_config.json`)}throw Error(`Claude Desktop is not available on ${t}. Supported: macOS, Windows.`)}function U(e={}){let t=e.platformName??process.platform,n=e.home??C();return V(t).join(n,`.cursor`,`mcp.json`)}function De(e={}){let t=e.platformName??process.platform,n=e.home??C();return(e.env??process.env).CODEX_HOME??V(t).join(n,`.codex`)}function W(e={}){return V(e.platformName??process.platform).join(De(e),`config.toml`)}function G(e={}){let t=e.platformName??process.platform,n=e.home??C(),r=(e.env??process.env).COPILOT_HOME??V(t).join(n,`.copilot`);return V(t).join(r,`mcp-config.json`)}function Oe(e={}){let t=e.platformName??process.platform,n=e.home??C(),r=e.env??process.env,i=V(t);if(t===`win32`){let e=r.APPDATA??i.join(n,`AppData`,`Roaming`);return i.join(e,`opencode`)}let a=r.XDG_CONFIG_HOME??i.join(n,`.config`);return i.join(a,`opencode`)}function K(e={}){return V(e.platformName??process.platform).join(Oe(e),`opencode.json`)}function ke(e={}){let t=e.platformName??process.platform,n=e.home??C();return V(t).join(n,`.openclaw`,`openclaw.json`)}function Ae(e={}){let t=e.platformName??process.platform,n=e.home??C();return V(t).join(n,`.hermes`,`config.yaml`)}function je(e={}){let t=e.platformName??process.platform,n=e.home??C();return(e.env??process.env).PI_CODING_AGENT_DIR??V(t).join(n,`.pi`,`agent`)}function Me(e={}){let t=e.platformName??process.platform,n=e.home??C();return V(t).join(n,`.gemini`,`config`,`mcp_config.json`)}function Ne(e,t){let n=V(t),r=n.join(e,`.lmstudio`,`mcp.json`),i=n.join(e,`.cache`,`lm-studio`,`mcp.json`);return t===`darwin`?[i,r]:[r,i]}function q(e={}){let t=e.platformName??process.platform,n=Ne(e.home??C(),t);return n.find(e=>b(e))||n.find(e=>b(f(e)))||n[0]}const J={claude:{id:`claude`,label:k.claude,configPath:(e,t)=>Ee({home:t}),format:`json`,topLevelKey:`mcpServers`,serverName:()=>a,buildEntry:(e,t)=>R(t),scope:`global`,detectPath:(e,t)=>m(t??C(),`.claude`),projectConfigPath:e=>m(e,`.mcp.json`),projectSkillPath:e=>m(e,`.claude`,`skills`,`open-knowledge`,`SKILL.md`)},"claude-desktop":{id:`claude-desktop`,label:k[`claude-desktop`],configPath:(e,t)=>H({home:t}),format:`json`,topLevelKey:`mcpServers`,serverName:()=>a,buildEntry:(e,t)=>R(t),scope:`global`,detectPath:(e,t)=>f(H({home:t}))},cursor:{id:`cursor`,label:k.cursor,configPath:(e,t)=>U({home:t}),format:`json`,topLevelKey:`mcpServers`,serverName:()=>a,buildEntry:(e,t)=>R(t),scope:`global`,detectPath:(e,t)=>f(U({home:t})),projectConfigPath:e=>m(e,`.cursor`,`mcp.json`),projectSkillPath:e=>m(e,`.cursor`,`skills`,`open-knowledge`,`SKILL.md`)},codex:{id:`codex`,label:k.codex,configPath:(e,t)=>W({home:t}),format:`toml`,topLevelKey:`mcp_servers`,serverName:()=>a,buildEntry:(e,t)=>R(t),scope:`global`,detectPath:(e,t)=>f(W({home:t})),projectConfigPath:e=>m(e,`.codex`,`config.toml`),projectSkillPath:e=>m(e,`.codex`,`skills`,`open-knowledge`,`SKILL.md`)},copilot:{id:`copilot`,label:k.copilot,configPath:(e,t)=>G({home:t}),format:`json`,topLevelKey:`mcpServers`,serverName:()=>a,buildEntry:(e,t)=>R(t),scope:`global`,detectPath:(e,t)=>f(G({home:t})),projectSkillPath:e=>m(e,`.github`,`skills`,`open-knowledge`,`SKILL.md`)},opencode:{id:`opencode`,label:k.opencode,configPath:(e,t)=>K({home:t}),format:`json`,topLevelKey:`mcp`,serverName:()=>a,buildEntry:(e,t)=>be(t),scope:`global`,detectPath:(e,t)=>f(K({home:t})),projectConfigPath:e=>m(e,`opencode.json`),projectSkillPath:e=>m(e,`.opencode`,`skills`,`open-knowledge`,`SKILL.md`)},openclaw:{id:`openclaw`,label:k.openclaw,configPath:(e,t)=>ke({home:t}),format:`json`,topLevelKey:`mcp`,serverMapSubKey:`servers`,serverName:()=>a,buildEntry:(e,t)=>R(t),scope:`global`,detectPath:(e,t)=>m(t??C(),`.openclaw`),offerOnlyWhenDetected:!0},pi:{id:`pi`,label:k.pi,configPath:()=>{throw Error("Pi has no user-global MCP config; OK's integration is the project-scoped bridge extension at .pi/extensions/open-knowledge.ts (run `ok init` in the project).")},format:`file`,topLevelKey:`mcpServers`,serverName:()=>a,buildEntry:()=>{throw Error(`Pi has no MCP entry shape; the managed bridge file is built by buildPiExtensionSource (integrations/pi-extension.ts).`)},scope:`project`,detectPath:(e,t)=>je({home:t}),projectConfigPath:e=>m(e,`.pi`,`extensions`,`open-knowledge.ts`),projectSkillPath:e=>m(e,`.pi`,`skills`,`open-knowledge`,`SKILL.md`)},antigravity:{id:`antigravity`,label:k.antigravity,configPath:(e,t)=>Me({home:t}),format:`json`,topLevelKey:`mcpServers`,serverName:()=>a,buildEntry:(e,t)=>R(t),scope:`global`,detectPath:(e,t)=>m(t??C(),`.gemini`),offerOnlyWhenDetected:!0},"lm-studio":{id:`lm-studio`,label:k[`lm-studio`],configPath:(e,t)=>q({home:t}),format:`json`,topLevelKey:`mcpServers`,serverName:()=>a,buildEntry:(e,t)=>R(t),scope:`global`,detectPath:(e,t)=>f(q({home:t})),offerOnlyWhenDetected:!0},hermes:{id:`hermes`,label:k.hermes,configPath:(e,t)=>Ae({home:t}),format:`yaml`,topLevelKey:`mcp_servers`,serverName:()=>a,buildEntry:(e,t)=>R(t),scope:`global`,detectPath:(e,t)=>m(t??C(),`.hermes`),offerOnlyWhenDetected:!0}};function Pe(e){let t=e.filter(e=>!Object.hasOwn(J,e));if(t.length>0)throw Error(`Unknown editor(s): ${t.join(`, `)}. Valid options: ${O.join(`, `)}`);return e.map(e=>J[e])}function Y(e){let t=[];for(let n of s){let r=l[n];t.push({path:m(e,`.agents`,`skills`,r),bundleId:n,scope:`central`});for(let i of A)t.push({path:m(e,i.hostDir,`skills`,r),bundleId:n,scope:`host`,hostDir:i.hostDir})}return t}function Fe(e,t){let n=[];for(let r of Y(e))if(r.bundleId===t)try{S(r.path,{recursive:!0,force:!0})}catch(e){n.push(e instanceof Error?e:Error(String(e)))}if(n.length>0)throw AggregateError(n,`Failed to remove ${n.length} path(s) for ${t}`)}function X(e,t){let n;try{n=te(e)}catch(e){if(e.code!==`ENOENT`)throw e}if(n?.isSymbolicLink())throw Error(`Refusing to write through a symbolic link at ${e}. Remove the symlink and re-run project setup.`);Q(e,t)}function Z(e,t){Q(e,t)}function Q(e,t){let n;try{n=x(t)}catch{n=_(t)}let r=f(e);for(;r.length>1&&r!==v;){let t;try{t=x(r)}catch(e){if(e.code===`ENOENT`){r=f(r);continue}throw e}let i=g(n,t);if(i===``||!i.startsWith(`..`)&&!p(i))return;throw Error(`Refusing to write at ${e}: ancestor ${r} resolves to ${t}, which is outside the project directory ${n}. A symbolic link in the path likely escapes the project. Remove the symlink and re-run project setup.`)}}function $(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Ie(e,t,n){try{if(ie(n).size>10485760)return!1}catch{return!1}let r;try{r=re(n,`utf-8`)}catch{return!1}let i=[],a=u(r.charCodeAt(0)===65279?r.slice(1):r,i,{allowTrailingComma:!0,disallowComments:!1});if(i.length>0||!$(a))return!1;let o=a[e.topLevelKey];if(!$(o))return!1;let s=e.serverMapSubKey?o[e.serverMapSubKey]:o;return $(s)?$(s[e.serverName(t)]):!1}function Le(e,t,n={}){if(e.id!==`copilot`)return!0;try{return Ie(e,t,e.configPath(t,n.home))}catch{return!1}}function Re(e,t,n={}){let r=e.projectSkillPath?.(t);if(!r)return{editorId:e.id,label:e.label,action:`skipped-unsupported`,path:``};if(!Le(e,t,n))return{editorId:e.id,label:e.label,action:`skipped-prerequisite`,path:r};try{let n=c(`project`,{checkDesktop:!0}),i=f(r);X(i,t);let a=b(r)?`overwritten`:`written`;return S(i,{recursive:!0,force:!0}),ne(f(i),{recursive:!0}),ee(n,i,{recursive:!0}),{editorId:e.id,label:e.label,action:a,path:r}}catch(t){return{editorId:e.id,label:e.label,action:`failed`,path:r,error:t instanceof Error?t.message:String(t)}}}function ze(e,t){let n=e.projectSkillPath?.(t);if(!n)return{editorId:e.id,label:e.label,action:`skipped-unsupported`,path:``};try{let r=f(n);return b(n)?(Z(r,t),S(r,{recursive:!0,force:!0}),{editorId:e.id,label:e.label,action:`removed`,path:n}):{editorId:e.id,label:e.label,action:`not-present`,path:n}}catch(t){return{editorId:e.id,label:e.label,action:`failed`,path:n,error:t instanceof Error?t.message:String(t)}}}export{ge as C,fe as S,xe as _,Fe as a,Pe as b,k as c,F as d,I as f,ye as g,Ce as h,Re as i,J as l,R as m,Z as n,Y as o,ve as p,ze as r,O as s,X as t,A as u,we as v,me as x,Te as y};
|
|
56
|
-
//# sourceMappingURL=write-project-skill-
|
|
56
|
+
//# sourceMappingURL=write-project-skill-CnAZrDt1.mjs.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@inkeep/open-knowledge",
|
|
3
|
-
"version": "0.39.0-beta.
|
|
3
|
+
"version": "0.39.0-beta.1",
|
|
4
4
|
"license": "GPL-3.0-or-later",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|
|
@@ -61,10 +61,10 @@
|
|
|
61
61
|
"ajv-formats": "^3.0.1",
|
|
62
62
|
"tsdown": "^0.21.7",
|
|
63
63
|
"typescript": "^5.9.3",
|
|
64
|
-
"@inkeep/open-knowledge-
|
|
65
|
-
"@inkeep/open-knowledge-
|
|
64
|
+
"@inkeep/open-knowledge-core": "0.39.0-beta.1",
|
|
65
|
+
"@inkeep/open-knowledge-app": "0.39.0-beta.1",
|
|
66
66
|
"@inkeep/open-knowledge-native-config": "0.0.0",
|
|
67
|
-
"@inkeep/open-knowledge-server": "0.39.0-beta.
|
|
67
|
+
"@inkeep/open-knowledge-server": "0.39.0-beta.1"
|
|
68
68
|
},
|
|
69
69
|
"scripts": {
|
|
70
70
|
"build:cli": "tsdown",
|
package/dist/init-DbJe5zj2.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{g as e}from"./init-Dmg3ybh1.mjs";export{e as runInit};
|
package/dist/loader-CedtNgJX.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./loader-Bgac1Kxs.mjs";export{e as loadConfig};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e,t}from"./preview-MVPDXYHt.mjs";export{t as formatPreviewBlock,e as previewContent};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./repair-skills-BRJAX3GC.mjs";export{e as repairSkills};
|
package/dist/start-DyFK7VPt.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as e,f as t,r as n}from"./start-CLDUfTCS.mjs";export{n as bootStartServer,t as resolveHost,e as startCommand};
|