@inkeep/open-knowledge 0.10.0 → 0.10.1-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/assets/skills/discovery/SKILL.md +1 -1
  2. package/dist/assets/skills/project/SKILL.md +1 -1
  3. package/dist/cli.mjs +39 -40
  4. package/dist/constants-B45M40rx.mjs +2 -0
  5. package/dist/index.mjs +1 -1
  6. package/dist/{init-C-JifwEm.mjs → init-BQldYl_j.mjs} +3 -3
  7. package/dist/init-DKP6EDgg.mjs +1 -0
  8. package/dist/loader-DaI1oEpk.mjs +1 -0
  9. package/dist/{loader-DYJhIg5U.mjs → loader-Dv8cLHe5.mjs} +2 -2
  10. package/dist/{preview-CG5C712c.mjs → preview-Bj-ZPQTB.mjs} +2 -2
  11. package/dist/preview-CvqEQ2uu.mjs +1 -0
  12. package/dist/public/assets/{ActivityModeContent-DUcYHbIo.js → ActivityModeContent-UY1y3Xj6.js} +1 -1
  13. package/dist/public/assets/{DocumentContext-BMFT2k_y.js → DocumentContext-Cnk29mEx.js} +1 -1
  14. package/dist/public/assets/{SettingsDialogBody-DUB7Be0M.js → SettingsDialogBody-CbC9w0WE.js} +1 -1
  15. package/dist/public/assets/{SourceEditor-NuqcNnnQ.js → SourceEditor-C9msETk8.js} +1 -1
  16. package/dist/public/assets/{config-validation-events-BNceQeM2.js → config-validation-events-BdpeA0wR.js} +1 -1
  17. package/dist/public/assets/{index-BUIBMYs5.js → index-CCZM1n4u.js} +4 -4
  18. package/dist/public/assets/{telemetry-impl-BCjHJnNa.js → telemetry-impl-aspahMYR.js} +1 -1
  19. package/dist/public/assets/{typing-burst-detector-C-vAHUwY.js → typing-burst-detector-o75X2Euj.js} +1 -1
  20. package/dist/public/index.html +4 -4
  21. package/dist/{repair-launch-json-DFBWIp_2.mjs → repair-launch-json-21W6ZyTC.mjs} +2 -2
  22. package/dist/{repair-mcp-configs-BZ5j2f4N.mjs → repair-mcp-configs-CxHEoxpY.mjs} +2 -2
  23. package/dist/{src-BX-ipJD9.mjs → src-CS4lDD6h.mjs} +2 -2
  24. package/dist/start-DdWzGG1a.mjs +1 -0
  25. package/dist/{start-CrGSyGS2.mjs → start-DeUqsR6i.mjs} +2 -2
  26. package/package.json +2 -1
  27. package/dist/constants-DfoUZtqY.mjs +0 -2
  28. package/dist/init-bD4lWQ2B.mjs +0 -1
  29. package/dist/loader-DznbAjEH.mjs +0 -1
  30. package/dist/preview-BEJ6SfIa.mjs +0 -1
  31. package/dist/start-DIcFlFoz.mjs +0 -1
package/dist/cli.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{o as e}from"./chunk-FK9Q3tQk.mjs";import{t}from"./esm-CEs3LWY3.mjs";import{$i as n,Ai as r,Er as i,Gi as a,Jr as o,Ki as s,Pi as c,Qi as l,Ta as u,Vi as d,Zi as f,ea as p,f as m,ia as h,ki as g,n as _,qi as v,s as y,sa as b,ua as x,wa as S,wn as ee}from"./server-lock-BpjJj3OD-BPX9iz2A.mjs";import{a as te,n as C,r as ne,t as re}from"./gh-detect-Bl7eyodQ.mjs";import{n as ie,r as ae,t as w}from"./dist-bundle-BK4P1EQn.mjs";import{B as oe,C as se,E as ce,F as le,H as ue,I as de,L as fe,M as pe,N as me,P as he,R as ge,S as _e,T as ve,V as ye,b as be,u as xe,v as Se,w as Ce,z as we}from"./init-C-JifwEm.mjs";import{r as Te}from"./git-handle-BSAUg1L_-Bn2h-fYS.mjs";import{Bi as Ee,C as De,Ct as Oe,Er as ke,Fi as Ae,Fn as je,Fr as T,Gi as Me,Ii as Ne,Ki as Pe,Kn as Fe,Li as Ie,Mn as Le,Mr as Re,N as ze,P as Be,Ri as Ve,Rr as He,Ui as Ue,Wt as We,X as Ge,Yi as Ke,Z as qe,Zr as Je,_ as Ye,bt as Xe,cn as Ze,dr as Qe,et as $e,fr as et,g as tt,gr as nt,gt as rt,it,jt as at,nn as ot,nt as st,pt as ct,qi as lt,qt as ut,rt as dt,sn as ft,w as pt,xn as mt,zi as ht}from"./dist-jSj9zzv0.mjs";import{t as gt}from"./yazl-DjRp4wSy.mjs";import{a as _t,c as vt,f as yt,i as bt,o as xt,p as St,s as Ct}from"./src-BX-ipJD9.mjs";import{n as wt,t as Tt}from"./constants-DfoUZtqY.mjs";import{n as Et,t as Dt}from"./loader-DYJhIg5U.mjs";import{_ as Ot,b as kt,f as At,h as jt,v as Mt,y as Nt}from"./start-CrGSyGS2.mjs";import{c as Pt,i as E,n as D,o as O,r as k,s as A,t as j}from"./colors-BtKMHmBX.mjs";import{n as Ft}from"./repair-skills-CxXhBfwl.mjs";import{execSync as It,spawn as M,spawnSync as N}from"node:child_process";import{accessSync as Lt,closeSync as Rt,constants as zt,cpSync as Bt,createWriteStream as Vt,existsSync as P,mkdirSync as F,mkdtempSync as Ht,openSync as Ut,readFileSync as I,readdirSync as Wt,realpathSync as Gt,rmSync as Kt,statSync as qt,unlinkSync as Jt,writeFileSync as L}from"node:fs";import Yt,{basename as R,dirname as Xt,join as z,relative as Zt,resolve as B,sep as Qt}from"node:path";import $t from"node:process";import{arch as en,freemem as tn,homedir as nn,platform as rn,release as an,tmpdir as on,totalmem as sn,type as cn,uptime as ln}from"node:os";import{fileURLToPath as un}from"node:url";import{AsyncLocalStorage as dn,AsyncResource as fn}from"node:async_hooks";import{stripVTControlCharacters as pn,styleText as V}from"node:util";import*as mn from"node:readline";import{createHash as hn,randomUUID as gn}from"node:crypto";import{rm as _n}from"node:fs/promises";import{setTimeout as vn}from"node:timers/promises";import{createInterface as yn}from"node:readline/promises";async function bn(e,t,n){let r=xn(await Sn(e)).host??``;if(!r)return 1;let i=await n.get(r);if(i==null)return 1;let a=e=>e.replace(/[\r\n]/g,``);return t.write(`username=${a(i.login)}\npassword=${a(i.token)}\n`),0}function xn(e){let t={};for(let n of e.split(`
2
+ import{o as e}from"./chunk-FK9Q3tQk.mjs";import{t}from"./esm-CEs3LWY3.mjs";import{$i as n,Ai as r,Er as i,Gi as a,Jr as o,Ki as s,Pi as c,Qi as l,Ta as u,Vi as d,Zi as f,ea as p,f as m,ia as h,ki as g,n as _,qi as v,s as y,sa as b,ua as x,wa as S,wn as ee}from"./server-lock-BpjJj3OD-BPX9iz2A.mjs";import{a as te,n as C,r as ne,t as re}from"./gh-detect-Bl7eyodQ.mjs";import{n as ie,r as ae,t as w}from"./dist-bundle-BK4P1EQn.mjs";import{B as oe,C as se,E as ce,F as le,H as ue,I as de,L as fe,M as pe,N as me,P as he,R as ge,S as _e,T as ve,V as ye,b as be,u as xe,v as Se,w as Ce,z as we}from"./init-BQldYl_j.mjs";import{r as Te}from"./git-handle-BSAUg1L_-Bn2h-fYS.mjs";import{Bi as Ee,C as De,Ct as Oe,Er as ke,Fi as Ae,Fn as je,Fr as T,Gi as Me,Ii as Ne,Ki as Pe,Kn as Fe,Li as Ie,Mn as Le,Mr as Re,N as ze,P as Be,Ri as Ve,Rr as He,Ui as Ue,Wt as We,X as Ge,Yi as Ke,Z as qe,Zr as Je,_ as Ye,bt as Xe,cn as Ze,dr as Qe,et as $e,fr as et,g as tt,gr as nt,gt as rt,it,jt as at,nn as ot,nt as st,pt as ct,qi as lt,qt as ut,rt as dt,sn as ft,w as pt,xn as mt,zi as ht}from"./dist-jSj9zzv0.mjs";import{t as gt}from"./yazl-DjRp4wSy.mjs";import{a as _t,c as vt,f as yt,i as bt,o as xt,p as St,s as Ct}from"./src-CS4lDD6h.mjs";import{n as wt,t as Tt}from"./constants-B45M40rx.mjs";import{n as Et,t as Dt}from"./loader-Dv8cLHe5.mjs";import{_ as Ot,b as kt,f as At,h as jt,v as Mt,y as Nt}from"./start-DeUqsR6i.mjs";import{c as Pt,i as E,n as D,o as O,r as k,s as A,t as j}from"./colors-BtKMHmBX.mjs";import{n as Ft}from"./repair-skills-CxXhBfwl.mjs";import{execSync as It,spawn as M,spawnSync as N}from"node:child_process";import{accessSync as Lt,closeSync as Rt,constants as zt,cpSync as Bt,createWriteStream as Vt,existsSync as P,mkdirSync as F,mkdtempSync as Ht,openSync as Ut,readFileSync as I,readdirSync as Wt,realpathSync as Gt,rmSync as Kt,statSync as qt,unlinkSync as Jt,writeFileSync as L}from"node:fs";import Yt,{basename as R,dirname as Xt,join as z,relative as Zt,resolve as B,sep as Qt}from"node:path";import $t from"node:process";import{arch as en,freemem as tn,homedir as nn,platform as rn,release as an,tmpdir as on,totalmem as sn,type as cn,uptime as ln}from"node:os";import{fileURLToPath as un}from"node:url";import{AsyncLocalStorage as dn,AsyncResource as fn}from"node:async_hooks";import{stripVTControlCharacters as pn,styleText as V}from"node:util";import*as mn from"node:readline";import{createHash as hn,randomUUID as gn}from"node:crypto";import{rm as _n}from"node:fs/promises";import{setTimeout as vn}from"node:timers/promises";import{createInterface as yn}from"node:readline/promises";async function bn(e,t,n){let r=xn(await Sn(e)).host??``;if(!r)return 1;let i=await n.get(r);if(i==null)return 1;let a=e=>e.replace(/[\r\n]/g,``);return t.write(`username=${a(i.login)}\npassword=${a(i.token)}\n`),0}function xn(e){let t={};for(let n of e.split(`
3
3
  `)){let e=n.trim();if(e===``)continue;let r=e.indexOf(`=`);r!==-1&&(t[e.slice(0,r)]=e.slice(r+1))}return t}function Sn(e){return new Promise((t,n)=>{let r=[];e.on(`data`,e=>r.push(e)),e.on(`end`,()=>t(Buffer.concat(r).toString(`utf-8`))),e.on(`error`,n)})}function Cn(e){let n=new t(`git-credential`);return n.description(`Git credential helper (git credential-helper protocol)`),n.command(`get`).description(`Lookup credentials from TokenStore (called by git)`).action(async()=>{let t=await e(),n=await bn(process.stdin,process.stdout,t);process.exit(n)}),n}function wn(e){let t=e.endpoint.DEFAULTS;return/^https:\/\/(api\.)?github\.com$/.test(t.baseUrl)?`https://github.com`:t.baseUrl.replace(`/api/v3`,``)}async function Tn(e,t,n){let r={baseUrl:wn(e),headers:{accept:`application/json`},...n},i=await e(t,r);if(`error`in i.data){let n=new ie(`${i.data.error_description} (${i.data.error}, ${i.data.error_uri})`,400,{request:e.endpoint.merge(t,r)});throw n.response=i,n}return i}async function En(e){let t=e.request||w,n={client_id:e.clientId};return`scopes`in e&&Array.isArray(e.scopes)&&(n.scope=e.scopes.join(` `)),Tn(t,`POST /login/device/code`,n)}async function Dn(e){let t=await Tn(e.request||w,`POST /login/oauth/access_token`,{client_id:e.clientId,device_code:e.code,grant_type:`urn:ietf:params:oauth:grant-type:device_code`}),n={clientType:e.clientType,clientId:e.clientId,token:t.data.access_token,scopes:t.data.scope.split(/\s+/).filter(Boolean)};if(`clientSecret`in e&&(n.clientSecret=e.clientSecret),e.clientType===`github-app`){if(`refresh_token`in t.data){let e=new Date(t.headers.date).getTime();n.refreshToken=t.data.refresh_token,n.expiresAt=On(e,t.data.expires_in),n.refreshTokenExpiresAt=On(e,t.data.refresh_token_expires_in)}delete n.scopes}return{...t,authentication:n}}function On(e,t){return new Date(e+t*1e3).toISOString()}async function kn(e,t){let n=An(e,t.auth);if(n)return n;let{data:r}=await En({clientType:e.clientType,clientId:e.clientId,request:t.request||e.request,scopes:t.auth.scopes||e.scopes});await e.onVerification(r);let i=await Mn(t.request||e.request,e.clientId,e.clientType,r);return e.authentication=i,i}function An(e,t){if(t.refresh===!0||!e.authentication)return!1;if(e.clientType===`github-app`)return e.authentication;let n=e.authentication;return(`scopes`in t&&t.scopes||e.scopes).join(` `)===n.scopes.join(` `)?n:!1}async function jn(e){await new Promise(t=>setTimeout(t,e*1e3))}async function Mn(e,t,n,r){try{let i={clientId:t,request:e,code:r.device_code},{authentication:a}=n===`oauth-app`?await Dn({...i,clientType:`oauth-app`}):await Dn({...i,clientType:`github-app`});return{type:`token`,tokenType:`oauth`,...a}}catch(i){if(!i.response)throw i;let a=i.response.data.error;if(a===`authorization_pending`)return await jn(r.interval),Mn(e,t,n,r);if(a===`slow_down`)return await jn(r.interval+7),Mn(e,t,n,r);throw i}}async function Nn(e,t){return kn(e,{auth:t})}async function Pn(e,t,n,r){let i=t.endpoint.merge(n,r);if(/\/login\/(oauth\/access_token|device\/code)$/.test(i.url))return t(i);let{token:a}=await kn(e,{request:t,auth:{type:`oauth`}});return i.headers.authorization=`token ${a}`,t(i)}var Fn=`0.0.0-development`;function In(e){let t=e.request||w.defaults({headers:{"user-agent":`octokit-auth-oauth-device.js/${Fn} ${ae()}`}}),{request:n=t,...r}=e,i=e.clientType===`github-app`?{...r,clientType:`github-app`,request:n}:{...r,clientType:`oauth-app`,request:n,scopes:e.scopes||[]};if(!e.clientId)throw Error(`[@octokit/auth-oauth-device] "clientId" option must be set (https://github.com/octokit/auth-oauth-device.js#usage)`);if(!e.onVerification)throw Error(`[@octokit/auth-oauth-device] "onVerification" option must be a function (https://github.com/octokit/auth-oauth-device.js#usage)`);return Object.assign(Nn.bind(null,i),{hook:Pn.bind(null,i)})}async function Ln(e){let{clientId:t,scopes:n=[`repo`,`read:user`,`user:email`],onVerification:r,host:i}=e,a=i&&i!==`github.com`?`https://${i}/api/v3`:`https://api.github.com`,o=In({clientType:`oauth-app`,clientId:t,scopes:n,onVerification:async e=>{await r({verificationUri:e.verification_uri,userCode:e.user_code,expiresIn:e.expires_in,interval:e.interval})},request:a===`https://api.github.com`?void 0:(await import(`./dist-bundle-CjV1Pdeo.mjs`)).request.defaults({baseUrl:a})}),s;try{s=await o({type:`oauth`})}catch(e){if(e instanceof Error){let t=e.message.toLowerCase();throw t.includes(`access_denied`)?Error(`Device-flow authorization was denied.`):t.includes(`expired_token`)||t.includes(`timeout`)||t.includes(`timed out`)?Error(`Device-flow code expired before authorization — please try again.`):Error(`GitHub sign-in failed: ${e.message}`)}throw e}return{token:s.token,tokenType:s.tokenType,scopes:s.scopes??[]}}const Rn={invalid_type:`invalid_type`,too_big:`too_big`,too_small:`too_small`,invalid_format:`invalid_format`,not_multiple_of:`not_multiple_of`,unrecognized_keys:`unrecognized_keys`,invalid_union:`invalid_union`,invalid_key:`invalid_key`,invalid_element:`invalid_element`,invalid_value:`invalid_value`,custom:`custom`};var zn;(function(e){})(zn||={});function Bn(e){return x(d,e)}function Vn(){return process.env.OPEN_KNOWLEDGE_GITHUB_CLIENT_ID??`Ov23liqlSd0V1MwR6rhI`}const Hn=new Set([`gitlab.com`,`bitbucket.org`,`codeberg.org`,`gitea.com`,`sr.ht`,`sourcehut.org`]);function H(e){let t=e.toLowerCase().replace(/:\d+$/,``);Hn.has(t)&&(process.stderr.write(`Error: ${e} is not a GitHub host. Only GitHub and GitHub Enterprise Server are supported.\n`),process.exit(1))}function Un(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function Wn(e,t,n=Ln){let r=Vn(),{host:i,json:a}=e;H(i),a||process.stderr.write(`Logging in to ${i}\n`);let o=await n({clientId:r,host:i===`github.com`?void 0:i,onVerification:e=>{e.userCode,e.verificationUri,a?Un(!0,{type:`verification`,user_code:e.userCode,verification_uri:e.verificationUri,expires_in:e.expiresIn}):process.stderr.write(`Open: ${e.verificationUri}\nEnter code: ${e.userCode}\n`)}}),s=`unknown`,c,l;try{let e=i===`github.com`?`https://api.github.com`:`https://${i}/api/v3`,t=await fetch(`${e}/user`,{headers:{Authorization:`Bearer ${o.token}`,"User-Agent":`open-knowledge-cli`,Accept:`application/vnd.github+json`}});if(t.ok){let e=await t.json();s=e.login??s,c=e.name??void 0,l=e.email??void 0}}catch{}await t.set(i,s,o.token,{gitProtocol:`https`,name:c,email:l}),a?Un(!0,{type:`complete`,host:i,login:s}):process.stderr.write(`✓ Logged in as ${s} on ${i}\n`)}function Gn(e){return new t(`login`).description(`Authenticate with GitHub via Device Flow`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{await Wn(t,await e())})}const Kn=e=>e.name===`enter`||e.name===`return`;var qn=class extends Error{name=`AbortPromptError`;message=`Prompt was aborted`;constructor(e){super(),this.cause=e?.cause}},Jn=class extends Error{name=`CancelPromptError`;message=`Prompt was canceled`},Yn=class extends Error{name=`ExitPromptError`},Xn=class extends Error{name=`HookError`},Zn=class extends Error{name=`ValidationError`};const Qn=new dn;function $n(e){return{rl:e,hooks:[],hooksCleanup:[],hooksEffect:[],index:0,handleChange(){}}}function er(e,t){let n=$n(e);return Qn.run(n,()=>{function e(e){n.handleChange=()=>{n.index=0,e()},n.handleChange()}return t(e)})}function U(){let e=Qn.getStore();if(!e)throw new Xn(`[Inquirer] Hook functions can only be called from within a prompt`);return e}function tr(){return U().rl}function nr(e){return fn.bind((...t)=>{let n=U(),r=!1,i=n.handleChange;n.handleChange=()=>{r=!0};let a=e(...t);return r&&i(),n.handleChange=i,a})}function rr(e){let t=U(),{index:n}=t,r=e({get(){return t.hooks[n]},set(e){t.hooks[n]=e},initialized:n in t.hooks});return t.index++,r}function ir(){U().handleChange()}const ar={queue(e){let t=U(),{index:n}=t;t.hooksEffect.push(()=>{t.hooksCleanup[n]?.();let r=e(tr());if(r!=null&&typeof r!=`function`)throw new Zn(`useEffect return value must be a cleanup function or nothing.`);t.hooksCleanup[n]=r})},run(){let e=U();nr(()=>{e.hooksEffect.forEach(e=>{e()}),e.hooksEffect.length=0})()},clearAll(){let e=U();e.hooksCleanup.forEach(e=>{e?.()}),e.hooksEffect.length=0,e.hooksCleanup.length=0}};function or(e){return typeof e==`function`}function W(e){return rr(t=>{let n=fn.bind(function(e){t.get()!==e&&(t.set(e),ir())});if(t.initialized)return[t.get(),n];let r=or(e)?e():e;return t.set(r),[r,n]})}function sr(e,t){rr(n=>{let r=n.get();(!Array.isArray(r)||t.some((e,t)=>!Object.is(e,r[t])))&&ar.queue(e),n.set(t)})}const cr={prefix:{idle:V(`blue`,`?`),done:V(`green`,ue.tick)},spinner:{interval:80,frames:[`⠋`,`⠙`,`⠹`,`⠸`,`⠼`,`⠴`,`⠦`,`⠧`,`⠇`,`⠏`].map(e=>V(`yellow`,e))},style:{answer:e=>V(`cyan`,e),message:e=>V(`bold`,e),error:e=>V(`red`,`> ${e}`),defaultAnswer:e=>V(`dim`,`(${e})`),help:e=>V(`dim`,e),highlight:e=>V(`cyan`,e),key:e=>V(`cyan`,V(`bold`,`<${e}>`))}};function lr(e){if(typeof e!=`object`||!e)return!1;let t=e;for(;Object.getPrototypeOf(t)!==null;)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t}function ur(...e){let t={};for(let n of e)for(let[e,r]of Object.entries(n)){let n=t[e];t[e]=lr(n)&&lr(r)?ur(n,r):r}return t}function dr(...e){return ur(cr,...e.filter(e=>e!=null))}function fr({status:e=`idle`,theme:t}){let[n,r]=W(!1),[i,a]=W(0),{prefix:o,spinner:s}=dr(t);return sr(()=>{if(e===`loading`){let e,t=-1,n=setTimeout(()=>{r(!0),e=setInterval(()=>{t+=1,a(t%s.frames.length)},s.interval)},300);return()=>{clearTimeout(n),clearInterval(e)}}else r(!1)},[e]),n?s.frames[i]:typeof o==`string`?o:o[e===`loading`?`idle`:e]??o.idle}function pr(e){return W({current:e})[0]}function mr(e){let t=pr(e);t.current=e,sr(e=>{let n=!1,r=nr((r,i)=>{n||t.current(i,e)});return e.input.on(`keypress`,r),()=>{n=!0,e.input.removeListener(`keypress`,r)}},[])}var hr=e(ye(),1);function gr(e,t){return e.split(`
4
4
  `).flatMap(e=>oe(e,t,{trim:!1,hard:!0}).split(`
5
5
  `).map(e=>e.trimEnd())).join(`
@@ -14,22 +14,21 @@ import{o as e}from"./chunk-FK9Q3tQk.mjs";import{t}from"./esm-CEs3LWY3.mjs";impor
14
14
  `),process.exit(1));let o=r===`github.com`?void 0:`https://${r}/api/v3`,s=new K({auth:a,...o?{baseUrl:o}:{}}),c=`unknown`,l,u;try{let{data:e}=await s.users.getAuthenticated();c=e.login,l=e.name??void 0,u=e.email??void 0}catch{process.stderr.write(`Token validation failed
15
15
  `),process.exit(1)}await t.set(r,c,a,{gitProtocol:`https`,name:l,email:u}),i?process.stdout.write(`${JSON.stringify({type:`complete`,host:r,login:c})}\n`):process.stderr.write(`✓ PAT stored for ${c} on ${r}\n`)}function Si(e){return new t(`pat`).description(`Store a Personal Access Token`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{await xi(t,await e())})}async function Ci(e,t,n=re){let r=n(e);return r.available&&r.token?r.token:(await t.get(e))?.token??null}async function wi(e,t){let{host:n,json:r}=e;H(n);let i=await Ci(n,t);i??(process.stderr.write(`Not logged in to ${n}\n`),process.exit(1));let a=n===`github.com`?void 0:`https://${n}/api/v3`,o=new K({auth:i,...a?{baseUrl:a}:{}}),s=[];for await(let e of o.paginate.iterator(o.repos.listForAuthenticatedUser,{per_page:100,sort:`updated`}))for(let t of e.data)s.push({full_name:t.full_name,clone_url:t.clone_url,private:t.private});if(r)process.stdout.write(`${JSON.stringify({type:`repos`,host:n,repos:s})}\n`);else for(let e of s)process.stdout.write(`${e.full_name} ${e.clone_url}\n`)}function Ti(e){return new t(`repos`).description(`List accessible repositories`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{await wi(t,await e())})}async function Ei(e){let{host:t}=e,{touched:n}=await C(t);if(n.length===0){process.stderr.write(`Not signed in to ${t}\n`);return}process.stderr.write(`✓ Signed out from ${t}\n`),n.includes(`keychain`)&&process.stderr.write(` cleared from OS keychain
16
16
  `),n.includes(`file`)&&process.stderr.write(` cleared from ~/.ok/auth.yml
17
- `)}function Di(){return new t(`signout`).description(`Remove stored credentials`).option(`--host <host>`,`GitHub hostname`,`github.com`).action(async e=>{await Ei(e)})}async function Oi(e,t,n=re){let r=n(e);if(r.available&&r.token)return{tier:`A`,token:r.token};let i=await t.get(e);return i==null?{tier:`none`}:{tier:i.gitProtocol===`ssh`?`C`:`B`,token:i.token}}async function ki(e,t){let{host:n,json:r}=e;H(n);let i=await Oi(n,t);i.tier===`none`&&(r?process.stdout.write(`${JSON.stringify({type:`status`,host:n,authenticated:!1})}\n`):process.stderr.write(`Not logged in to ${n}\n`),process.exit(1));let a=n===`github.com`?void 0:`https://${n}/api/v3`,o=new K({auth:i.token,...a?{baseUrl:a}:{}});try{let{data:e}=await o.users.getAuthenticated();r?process.stdout.write(`${JSON.stringify({type:`status`,host:n,authenticated:!0,tier:i.tier,login:e.login,name:e.name,email:e.email})}\n`):process.stderr.write(`✓ Logged in as ${e.login} on ${n}\n`)}catch{r?process.stdout.write(JSON.stringify({type:`status`,host:n,authenticated:!1,error:`token invalid`})+`
18
- `):process.stderr.write(`✗ Token invalid for ${n}\n`),process.exit(1)}}function Ai(e){return new t(`status`).description(`Show authentication status`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{await ki(t,await e())})}function ji(){let e=new t(`auth`);e.description(`GitHub authentication management`);let n=()=>ne();return e.addCommand(Gn(n)),e.addCommand(Ai(n)),e.addCommand(Ti(n)),e.addCommand(Di()),e.addCommand(Si(n)),e.addCommand(Cn(n)),e}const Mi=[{name:`macos-home-path`,regex:/\/Users\/[^/]+\//g,replacement:`~/`},{name:`linux-home-path`,regex:/\/home\/[^/]+\//g,replacement:`~/`},{name:`github-pat`,regex:/\b(ghp_|gho_|ghu_|ghs_|ghr_)[A-Za-z0-9]{36,}\b/g,replacement:`[REDACTED-GH-PAT]`},{name:`aws-access-key`,regex:/\b(AKIA|ASIA|ABIA)[A-Z2-7]{16}\b/g,replacement:`[REDACTED-AWS-KEY]`},{name:`anthropic-key`,regex:/\bsk-ant-api03-[A-Za-z0-9_-]{20,}\b/g,replacement:`[REDACTED-ANTHROPIC]`},{name:`openai-key`,regex:/\bsk-[A-Za-z0-9]{20,}\b/g,replacement:`[REDACTED-OPENAI]`},{name:`bearer-token`,regex:/([Aa]uthorization:\s*[Bb]earer\s+)\S+/g,replacement:`$1[REDACTED]`},{name:`jwt`,regex:/eyJ[A-Za-z0-9_-]{8,}\.eyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}/g,replacement:`[REDACTED-JWT]`},{name:`url-credentials`,regex:/:\/\/[^/\s:@]+:[^/\s:@]+@/g,replacement:`://[REDACTED]@`}],Ni=Mi.map(e=>e.name);function Pi(e){let t=new Set,n=0;return{redacted:e.split(`
19
- `).map(e=>{let r=e;for(let{name:e,regex:i,replacement:a}of Mi)i.lastIndex=0,i.test(r)&&(t.add(e),n++,i.lastIndex=0,r=r.replace(i,a));return r}).join(`
20
- `),patterns:[...t],lineCount:n}}const Fi=z(nn(),`.ok`,`logs`),Ii=z(nn(),`.ok`,`bug-reports`);function Li(e){let t=z(e,`.ok`,`config.yml`);if(P(t))try{let e=I(t,`utf8`).match(/^\s*name:\s*['"]?(.+?)['"]?\s*$/m);if(e?.[1])return e[1]}catch{}return P(z(e,`.ok`))?hn(`sha256`).update(B(e)).digest(`hex`).slice(0,12):null}function Ri(){let e={timestamp:new Date().toISOString(),platform:rn(),osType:cn(),osRelease:an(),hostname:`[redacted]`,uptime:ln(),freeMem:tn(),totalMem:sn(),nodeVersion:process.version,bunVersion:process.versions.bun??null,v8Version:process.versions.v8??null,pid:process.pid};try{e.macosVersion=It(`sw_vers -productVersion 2>/dev/null`,{encoding:`utf8`}).trim()}catch{}try{let t=z(__dirname,`..`,`..`,`package.json`);P(t)&&(e.okVersion=JSON.parse(I(t,`utf8`)).version)}catch{}return e}function zi(e){if(!P(Fi))return{files:[],dir:Fi};let t=Wt(Fi).filter(e=>e.endsWith(`.log`)||/\.log\.\d+$/.test(e)).map(e=>z(Fi,e));if(e&&t.length>0){let n=t.filter(t=>{try{return I(t,`utf8`).includes(`"project":"${e}"`)}catch{return!0}});n.length>0&&(t=n)}return{files:t,dir:Fi}}function Bi(e){let t=z(e,`.ok`,`local`);return P(t)?{files:[`server.lock`,`last-spawn-error.log`].map(e=>z(t,e)).filter(e=>P(e)),dir:t}:{files:[],dir:null}}function Vi(e){let t=z(e,`.ok`,`local`,`logs`);return P(t)?{files:[`server-current.jsonl`,`server-prev.jsonl`].map(e=>z(t,e)).filter(e=>P(e)),dir:t}:{files:[],dir:null}}async function Hi(t){let n=pu();F(Ii,{recursive:!0});let r=z(Ii,`${new Date().toISOString().replace(/[:.]/g,`-`)}-bugreport.zip`);n?.info({projectSlug:t.projectSlug},`gathering diagnostic data`);let i=Ri(),{files:a}=zi(t.projectSlug),{files:o}=Bi(t.cwd),{files:s}=Vi(t.cwd);n?.info({logFileCount:a.length,lockFileCount:o.length,localSinkFileCount:s.length},`files collected`);let c=[],l=[],{ZipFile:u}=await import(`./yazl-CJayzk0b.mjs`).then(t=>e(t.default,1)),d=new u;for(let e of a)try{let{redacted:t,patterns:n,lineCount:r}=Pi(I(e,`utf8`)),i=`logs/${R(e)}`;d.addBuffer(Buffer.from(t,`utf8`),i),l.push(i),n.length>0&&c.push({file:i,lineCount:r,patterns:n})}catch{}for(let e of o)try{let{redacted:t,patterns:n,lineCount:r}=Pi(I(e,`utf8`)),i=`lockdir/${R(e)}`;d.addBuffer(Buffer.from(t,`utf8`),i),l.push(i),n.length>0&&c.push({file:i,lineCount:r,patterns:n})}catch{}for(let e of s)try{let{redacted:t,patterns:n,lineCount:r}=Pi(I(e,`utf8`)),i=`local-logs/${R(e)}`;d.addBuffer(Buffer.from(t,`utf8`),i),l.push(i),n.length>0&&c.push({file:i,lineCount:r,patterns:n})}catch{}let f=JSON.stringify(i,null,2);d.addBuffer(Buffer.from(f,`utf8`),`sysinfo.json`),l.push(`sysinfo.json`);let p={generatedAt:new Date().toISOString(),disciplineVersion:`1.0.0`,projectSlug:t.projectSlug,files:l,redactions:c,sysinfo:i};d.addBuffer(Buffer.from(JSON.stringify(p,null,2),`utf8`),`MANIFEST.json`);let m=c.reduce((e,t)=>e+t.lineCount,0),h=[`# Bug Report Bundle`,``,`Generated: ${p.generatedAt}`,`Project: ${t.projectSlug??`(unscoped)`}`,`Discipline version: ${p.disciplineVersion}`,``,`## Contents`,``,...l.map(e=>`- ${e}`),``,`## Privacy`,``,`This bundle was auto-redacted before packaging.`,`Patterns checked: ${Ni.join(`, `)}`,m>0?`${m} line(s) were scrubbed across ${c.length} file(s).`:`No redactions were needed.`,`See MANIFEST.json for the full redaction audit report.`,``,`This bundle is safe to attach to a GitHub issue.`].join(`
21
- `);d.addBuffer(Buffer.from(h,`utf8`),`README.md`),d.end();let g=Vt(r);if(d.outputStream.pipe(g),await new Promise((e,t)=>{g.on(`close`,e),g.on(`error`,t)}),n?.info({bundlePath:r,fileCount:l.length,redactionCount:m},`bundle written`),process.stdout.write(`${r}\n`),m>0&&process.stderr.write(`ok bug-report: ${m} line(s) auto-redacted across ${c.length} file(s)\n`),!t.noReveal&&rn()===`darwin`)try{M(`/usr/bin/open`,[`-R`,r],{detached:!0,stdio:`ignore`}).unref()}catch{}return r}function Ui(){return new t(`bug-report`).description(`Generate a diagnostic bundle for bug reporting`).option(`--reveal`,`Reveal the bundle in Finder (default: true)`,!0).option(`--no-reveal`,`Do not reveal the bundle in Finder`).action(async e=>{let t=process.cwd(),n=Li(t);try{await Hi({projectSlug:n,cwd:t,noReveal:!e.reveal})}catch(e){let t=e instanceof Error?e.message:String(e);process.stderr.write(`ok bug-report: failed — ${t}\n`),process.exitCode=1}})}function Wi(e,t){let n=[];for(let[r,i]of[[`server`,e],[`ui`,t]])(i.status===`dead-pid`||i.status===`corrupt`)&&n.push({name:r,lockPath:i.lockPath,reason:i.status});return{prune:n}}function Gi(e){let t=e.inspect??(t=>St(e.lockDir,t)),n=e.unlink??(e=>Jt(e)),r=e.log??(e=>console.log(e)),i=e.error??(e=>console.error(e)),a=Wi(t(`server`),t(`ui`));if(a.prune.length===0)return r(`No stale locks.`),{pruned:[],failed:[]};let o=[],s=[];for(let e of a.prune)try{n(e.lockPath),o.push(e)}catch(t){s.push({target:e,error:t instanceof Error?t.message:String(t)})}if(o.length>0){let e=o.map(e=>`${e.name} (${e.reason})`).join(`, `);r(`Pruned ${o.length} stale lock${o.length===1?``:`s`}: ${e}`)}return s.length>0&&i(`Failed to prune: ${s.map(({target:e,error:t})=>`${e.name} (${e.lockPath}): ${t}`).join(`; `)}`),{pruned:o,failed:s}}function Ki(e){return new t(`clean`).description(`Prune stale / corrupt open-knowledge lock files (never touches live locks)`).action(()=>{e(),Gi({lockDir:T(process.cwd())}).failed.length>0&&(process.exitCode=1)})}async function qi(e,t,n={},r=re){if(!n.skipGhDetect&&r().available)return{tier:`A`,credentialArgs:[`-c`,`credential.helper=!gh auth git-credential`]};let i=await t.get(e);return i==null?{tier:`none`,credentialArgs:[]}:{tier:i.gitProtocol===`ssh`?`C`:`B`,credentialArgs:[`-c`,`credential.helper=!open-knowledge auth git-credential`]}}async function Ji(e,t,n=fetch){let r=new AbortController,i=setTimeout(()=>r.abort(),5e3);try{return(await n(`https://api.github.com/repos/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,{signal:r.signal,headers:{"User-Agent":`open-knowledge-cli`,Accept:`application/vnd.github+json`}})).status===200}catch{return!1}finally{clearTimeout(i)}}const Yi=[[`count`,0,10],[`compress`,10,20],[`receiv`,20,60],[`resolv`,60,100]];function Xi(e){let t=/^([\w ]+):\s+(\d+)%/.exec(e.trim());if(!t)return null;let n=t[1].toLowerCase(),r=Number(t[2]);for(let[e,i,a]of Yi)if(n.includes(e))return{stage:t[1],pct:Math.round(i+r/100*(a-i))};return null}function q(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}function Zi(e){return typeof e!=`string`||e.length===0?[`--progress`]:[`--progress`,`-b`,e]}const Qi=o;async function $i(e){try{return await e.clone(Zi(e.branch)),{fellBack:!1}}catch(t){if(e.branch!==null&&Qi(t))return e.onFallback(e.branch),await e.clone(Zi(null)),{fellBack:!0};throw t}}function ea(e,t,n){return e===`https`&&t===`github.com`&&n}async function ta(e,t,n,r=process.cwd()){let i=yt(e);if(!i)throw Error(`Invalid git URL: ${e}`);let a=t.dir?B(r,t.dir):B(r,i.name);if(P(a)&&Wt(a).length>0)throw Error(`Target directory is not empty: ${a}`);let o=te(),s=i.protocol===`https`&&i.hostname===`github.com`?await Ji(i.owner,i.name):!1,c=ea(i.protocol,i.hostname,s)?{tier:`none`,credentialArgs:[]}:await qi(i.hostname,o,{}),l=Te({baseDir:r,config:c.credentialArgs.length>=2?[c.credentialArgs[1]]:[],unsafe:{allowUnsafeCredentialHelper:!0}}).env({GIT_TERMINAL_PROMPT:`0`}),u=-1;l.outputHandler((e,n,r)=>{r.on(`data`,e=>{let n=e.toString(`utf-8`);for(let e of n.split(`
22
- `)){let n=Xi(e);n&&n.pct!==u&&(u=n.pct,q(t.json,{type:`progress`,pct:n.pct,stage:n.stage}),t.json||process.stderr.write(`\r Cloning ${n.pct}%`))}})}),await $i({branch:typeof t.branch==`string`&&t.branch.length>0?t.branch:null,clone:t=>l.clone(e,a,t),onFallback:e=>{q(t.json,{type:`branch-fallback`,branch:e}),t.json||process.stderr.write(`\n Branch '${e}' not found upstream cloning default branch instead.\n`)}}),t.json||process.stderr.write(`
23
- `);try{let{runInit:e}=await import(`./init-bD4lWQ2B.mjs`),n=await e({cwd:a,mcp:!1});if(n.contentUpdated.length>0){let e=`auto-init: updated ${n.contentUpdated.join(`, `)}`;t.json?q(!0,{type:`warning`,message:e}):process.stderr.write(` ${e}\n`)}}catch(e){let n=e instanceof Error?e.message:String(e);t.json?q(!0,{type:`warning`,message:`auto-init: ${n}`}):process.stderr.write(` auto-init: ${n}\n`)}try{na(a)}catch(e){let n=e instanceof Error?e.message:String(e);t.json?q(!0,{type:`warning`,message:`git-exclude: ${n}`}):process.stderr.write(` git-exclude: ${n}\n`)}return a}function na(e){let t=be(e,[`.ok/`]);return t.kind===`no-exclude`?`no-exclude`:t.kind===`refused-tracked`?`already-present`:t.appended.length>0?`appended`:`already-present`}function ra(e){return new t(`clone`).description(`Clone a git repository and open it`).argument(`<url>`,`Repository URL or owner/repo shorthand`).argument(`[dir]`,`Target directory (default: ./<repo-name>)`).option(`--json`,`Output JSONL progress events`,!1).option(`-b, --branch <branch>`,`Branch to check out (falls back to default if missing)`).action(async(t,n,r)=>{let i=e();try{let a=await ta(t,{json:r.json,dir:n,branch:r.branch??null},i);if(r.json)q(!0,{type:`complete`,dir:a});else{process.stderr.write(`✓ Cloned to ${a}\n`),process.chdir(a);let{startCommand:t}=await import(`./start-DIcFlFoz.mjs`);await t(e).parseAsync([],{from:`user`})}}catch(e){let t=e instanceof Error?e.message:String(e);r.json?q(!0,{type:`error`,message:t}):process.stderr.write(`✗ ${t}\n`),process.exitCode=1}})}var ia=u();const aa=[[`sync`],[`persistence`,`debounceMs`],[`persistence`,`maxDebounceMs`],[`server`,`port`],...r.map(e=>e.path)];function oa(e={}){let t=e.log??(e=>console.error(e)),n=e.error??(e=>console.error(e)),r=e.loadConfigFn??Et;try{let{sources:n}=r(e.cwd);return t(`✓ Configuration valid (sources: ${n.length===0?`defaults only`:n.join(`, `)})`),{ok:!0}}catch(e){return n(e instanceof Error?e.message:String(e)),{ok:!1}}}function sa(e){let t=(0,ia.parseDocument)(I(e,`utf-8`));if(t.errors.length>0)throw Error(`Could not parse ${e}: ${t.errors.map(e=>e.message).join(`; `)}`);let n=[];for(let e of aa)t.hasIn(e)&&n.push(e.join(`.`));return n}function ca(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function la(e){let t={};for(let n of e){let e=t;for(let t=0;t<n.length-1;t++){let r=n[t],i=e[r],a=ca(i)?i:{};e[r]=a,e=a}e[n[n.length-1]]=null}return t}async function ua(e={}){let t=e.log??(e=>console.log(e)),n=e.error??(e=>console.error(e)),r=e.scope??`both`,i=e.dryRun??!1,a=e.cwd??process.cwd(),o=e.writeConfigPatchFn??Me,s=[];(r===`project`||r===`both`)&&s.push({scope:`project`,absPath:Ue(`project`,a,e.homedirOverride)}),(r===`user`||r===`both`)&&s.push({scope:`user`,absPath:Ue(`user`,a,e.homedirOverride)});let l=[],u=!0;for(let{scope:t,absPath:n}of s){if(!P(n)){l.push({path:n,scope:t,found:[],removed:[]});continue}let r;try{r=sa(n)}catch(e){let r=e instanceof Error?e.message:String(e);l.push({path:n,scope:t,found:[],removed:[],error:r}),u=!1;continue}if(r.length===0||i){l.push({path:n,scope:t,found:r,removed:[]});continue}let s=await o({cwd:a,scope:t,patch:la(aa.filter(e=>r.includes(e.join(`.`)))),homedirOverride:e.homedirOverride});if(!s.ok){l.push({path:n,scope:t,found:r,removed:[],error:c(s.error)}),u=!1;continue}l.push({path:n,scope:t,found:r,removed:r})}for(let e of l)e.error&&n(`✗ ${e.path}: ${e.error}`);let d=l.some(e=>e.error!==void 0),f=l.reduce((e,t)=>e+t.found.length,0);if(f===0&&!d)t(`No deprecated fields found.`);else if(f>0)for(let e of l)e.error||(e.found.length===0?t(` ${e.path}: no deprecated fields`):t(i?`[dry-run] ${e.path}: would remove ${e.found.length} field(s): ${e.found.join(`, `)}`:`✓ ${e.path}: removed ${e.removed.length} field(s): ${e.removed.join(`, `)}`));return{outcomes:l,ok:u}}function da(){let e=new t(`config`).description(`Inspect and maintain Open Knowledge configuration files`);return e.command(`validate`).description(`Validate the merged config (defaults → user → project)`).action(()=>{oa({}).ok||(process.exitCode=1)}),e.command(`migrate`).description(`Remove deprecated config fields from config.yml idempotently (every removed key in the registry — content.*, folders, appearance.editorModeDefault, server.host, etc. — plus the silently-dropped sync.*, persistence.*, server.port)`).option(`--scope <scope>`,`Which scope to migrate: project | user | both`,`both`).option(`--dry-run`,`Preview without writing`,!1).action(async e=>{let t=e.scope;if(t!==`project`&&t!==`user`&&t!==`both`){console.error(`Invalid --scope: ${t}. Expected: project | user | both`),process.exitCode=2;return}(await ua({scope:t,dryRun:e.dryRun})).ok||(process.exitCode=1)}),e}var fa=e(gt(),1),J=e(Pt(),1);const pa=new Set([`doc.name`]);function ma(e){return`doc:${hn(`blake2b512`,{outputLength:32}).update(e).digest(`hex`).slice(0,8)}`}function ha(e,t,n){let r=e.docNameMap[n];if(r===void 0){e.docNameMap[n]=t;return}if(r===t)return;let i=e.docNameCollisions[n];i?i.includes(t)||i.push(t):e.docNameCollisions[n]=[t]}function ga(e,t){let n=t.originalToHashed.get(e);if(n!==void 0)return n;let r=ma(e);return t.originalToHashed.set(e,r),ha(t,e,r),r}function _a(e,t){return t.length===0||!e.includes(t)?e:e.split(t).join(`<CONTENT_DIR>`)}function va(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ya(e,t){if(typeof e==`string`)return _a(e,t.contentDir);if(Array.isArray(e))return e.map(e=>ya(e,t));if(!va(e))return e;let n=typeof e.key==`string`&&pa.has(e.key)&&va(e.value)&&typeof e.value.stringValue==`string`?e.value.stringValue:null,r={};for(let[i,a]of Object.entries(e))if(n!==null&&i===`value`&&va(a)){let e=ga(n,t);r[i]={...a,stringValue:e}}else pa.has(i)&&typeof a==`string`?r[i]=ga(a,t):r[i]=ya(a,t);return r}function ba(e,t){if(t.originalToHashed.size===0)return e;let n=Array.from(t.originalToHashed.entries()).sort(([e],[t])=>t.length-e.length),r=e;for(let[e,t]of n)e.length!==0&&r.includes(e)&&(r=r.split(e).join(t));return r}function xa(e,t){let n=I(e,`utf-8`);if(n.length===0)return;let r=n.endsWith(`
17
+ `)}function Di(){return new t(`signout`).description(`Remove stored credentials`).option(`--host <host>`,`GitHub hostname`,`github.com`).action(async e=>{await Ei(e)})}async function Oi(e,t,n=re){let r=n(e);if(r.available&&r.token)return{tier:`A`,token:r.token};let i=await t.get(e);return i==null?{tier:`none`}:{tier:i.gitProtocol===`ssh`?`C`:`B`,token:i.token}}function ki(e,t,n){return{type:`status`,host:e,backend:t,...n}}async function Ai(e,t){let{host:n,json:r}=e;H(n);let i=t.backend,a=await Oi(n,t);a.tier===`none`&&(r?process.stdout.write(`${JSON.stringify(ki(n,i,{authenticated:!1}))}\n`):process.stderr.write(`Not logged in to ${n}\n`),process.exit(1));let o=n===`github.com`?void 0:`https://${n}/api/v3`,s=new K({auth:a.token,...o?{baseUrl:o}:{}});try{let{data:e}=await s.users.getAuthenticated();r?process.stdout.write(`${JSON.stringify(ki(n,i,{authenticated:!0,tier:a.tier,login:e.login,name:e.name,email:e.email}))}\n`):process.stderr.write(`✓ Logged in as ${e.login} on ${n}\n`)}catch{r?process.stdout.write(`${JSON.stringify(ki(n,i,{authenticated:!1,error:`token invalid`}))}\n`):process.stderr.write(`✗ Token invalid for ${n}\n`),process.exit(1)}}function ji(e){return new t(`status`).description(`Show authentication status`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{await Ai(t,await e())})}function Mi(){let e=new t(`auth`);e.description(`GitHub authentication management`);let n=()=>ne();return e.addCommand(Gn(n)),e.addCommand(ji(n)),e.addCommand(Ti(n)),e.addCommand(Di()),e.addCommand(Si(n)),e.addCommand(Cn(n)),e}const Ni=[{name:`macos-home-path`,regex:/\/Users\/[^/]+\//g,replacement:`~/`},{name:`linux-home-path`,regex:/\/home\/[^/]+\//g,replacement:`~/`},{name:`github-pat`,regex:/\b(ghp_|gho_|ghu_|ghs_|ghr_)[A-Za-z0-9]{36,}\b/g,replacement:`[REDACTED-GH-PAT]`},{name:`aws-access-key`,regex:/\b(AKIA|ASIA|ABIA)[A-Z2-7]{16}\b/g,replacement:`[REDACTED-AWS-KEY]`},{name:`anthropic-key`,regex:/\bsk-ant-api03-[A-Za-z0-9_-]{20,}\b/g,replacement:`[REDACTED-ANTHROPIC]`},{name:`openai-key`,regex:/\bsk-[A-Za-z0-9]{20,}\b/g,replacement:`[REDACTED-OPENAI]`},{name:`bearer-token`,regex:/([Aa]uthorization:\s*[Bb]earer\s+)\S+/g,replacement:`$1[REDACTED]`},{name:`jwt`,regex:/eyJ[A-Za-z0-9_-]{8,}\.eyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}/g,replacement:`[REDACTED-JWT]`},{name:`url-credentials`,regex:/:\/\/[^/\s:@]+:[^/\s:@]+@/g,replacement:`://[REDACTED]@`}],Pi=Ni.map(e=>e.name);function Fi(e){let t=new Set,n=0;return{redacted:e.split(`
18
+ `).map(e=>{let r=e;for(let{name:e,regex:i,replacement:a}of Ni)i.lastIndex=0,i.test(r)&&(t.add(e),n++,i.lastIndex=0,r=r.replace(i,a));return r}).join(`
19
+ `),patterns:[...t],lineCount:n}}const Ii=z(nn(),`.ok`,`logs`),Li=z(nn(),`.ok`,`bug-reports`);function Ri(e){let t=z(e,`.ok`,`config.yml`);if(P(t))try{let e=I(t,`utf8`).match(/^\s*name:\s*['"]?(.+?)['"]?\s*$/m);if(e?.[1])return e[1]}catch{}return P(z(e,`.ok`))?hn(`sha256`).update(B(e)).digest(`hex`).slice(0,12):null}function zi(){let e={timestamp:new Date().toISOString(),platform:rn(),osType:cn(),osRelease:an(),hostname:`[redacted]`,uptime:ln(),freeMem:tn(),totalMem:sn(),nodeVersion:process.version,bunVersion:process.versions.bun??null,v8Version:process.versions.v8??null,pid:process.pid};try{e.macosVersion=It(`sw_vers -productVersion 2>/dev/null`,{encoding:`utf8`}).trim()}catch{}try{let t=z(__dirname,`..`,`..`,`package.json`);P(t)&&(e.okVersion=JSON.parse(I(t,`utf8`)).version)}catch{}return e}function Bi(e){if(!P(Ii))return{files:[],dir:Ii};let t=Wt(Ii).filter(e=>e.endsWith(`.log`)||/\.log\.\d+$/.test(e)).map(e=>z(Ii,e));if(e&&t.length>0){let n=t.filter(t=>{try{return I(t,`utf8`).includes(`"project":"${e}"`)}catch{return!0}});n.length>0&&(t=n)}return{files:t,dir:Ii}}function Vi(e){let t=z(e,`.ok`,`local`);return P(t)?{files:[`server.lock`,`last-spawn-error.log`].map(e=>z(t,e)).filter(e=>P(e)),dir:t}:{files:[],dir:null}}function Hi(e){let t=z(e,`.ok`,`local`,`logs`);return P(t)?{files:[`server-current.jsonl`,`server-prev.jsonl`].map(e=>z(t,e)).filter(e=>P(e)),dir:t}:{files:[],dir:null}}async function Ui(t){let n=mu();F(Li,{recursive:!0});let r=z(Li,`${new Date().toISOString().replace(/[:.]/g,`-`)}-bugreport.zip`);n?.info({projectSlug:t.projectSlug},`gathering diagnostic data`);let i=zi(),{files:a}=Bi(t.projectSlug),{files:o}=Vi(t.cwd),{files:s}=Hi(t.cwd);n?.info({logFileCount:a.length,lockFileCount:o.length,localSinkFileCount:s.length},`files collected`);let c=[],l=[],{ZipFile:u}=await import(`./yazl-CJayzk0b.mjs`).then(t=>e(t.default,1)),d=new u;for(let e of a)try{let{redacted:t,patterns:n,lineCount:r}=Fi(I(e,`utf8`)),i=`logs/${R(e)}`;d.addBuffer(Buffer.from(t,`utf8`),i),l.push(i),n.length>0&&c.push({file:i,lineCount:r,patterns:n})}catch{}for(let e of o)try{let{redacted:t,patterns:n,lineCount:r}=Fi(I(e,`utf8`)),i=`lockdir/${R(e)}`;d.addBuffer(Buffer.from(t,`utf8`),i),l.push(i),n.length>0&&c.push({file:i,lineCount:r,patterns:n})}catch{}for(let e of s)try{let{redacted:t,patterns:n,lineCount:r}=Fi(I(e,`utf8`)),i=`local-logs/${R(e)}`;d.addBuffer(Buffer.from(t,`utf8`),i),l.push(i),n.length>0&&c.push({file:i,lineCount:r,patterns:n})}catch{}let f=JSON.stringify(i,null,2);d.addBuffer(Buffer.from(f,`utf8`),`sysinfo.json`),l.push(`sysinfo.json`);let p={generatedAt:new Date().toISOString(),disciplineVersion:`1.0.0`,projectSlug:t.projectSlug,files:l,redactions:c,sysinfo:i};d.addBuffer(Buffer.from(JSON.stringify(p,null,2),`utf8`),`MANIFEST.json`);let m=c.reduce((e,t)=>e+t.lineCount,0),h=[`# Bug Report Bundle`,``,`Generated: ${p.generatedAt}`,`Project: ${t.projectSlug??`(unscoped)`}`,`Discipline version: ${p.disciplineVersion}`,``,`## Contents`,``,...l.map(e=>`- ${e}`),``,`## Privacy`,``,`This bundle was auto-redacted before packaging.`,`Patterns checked: ${Pi.join(`, `)}`,m>0?`${m} line(s) were scrubbed across ${c.length} file(s).`:`No redactions were needed.`,`See MANIFEST.json for the full redaction audit report.`,``,`This bundle is safe to attach to a GitHub issue.`].join(`
20
+ `);d.addBuffer(Buffer.from(h,`utf8`),`README.md`),d.end();let g=Vt(r);if(d.outputStream.pipe(g),await new Promise((e,t)=>{g.on(`close`,e),g.on(`error`,t)}),n?.info({bundlePath:r,fileCount:l.length,redactionCount:m},`bundle written`),process.stdout.write(`${r}\n`),m>0&&process.stderr.write(`ok bug-report: ${m} line(s) auto-redacted across ${c.length} file(s)\n`),!t.noReveal&&rn()===`darwin`)try{M(`/usr/bin/open`,[`-R`,r],{detached:!0,stdio:`ignore`}).unref()}catch{}return r}function Wi(){return new t(`bug-report`).description(`Generate a diagnostic bundle for bug reporting`).option(`--reveal`,`Reveal the bundle in Finder (default: true)`,!0).option(`--no-reveal`,`Do not reveal the bundle in Finder`).action(async e=>{let t=process.cwd(),n=Ri(t);try{await Ui({projectSlug:n,cwd:t,noReveal:!e.reveal})}catch(e){let t=e instanceof Error?e.message:String(e);process.stderr.write(`ok bug-report: failed — ${t}\n`),process.exitCode=1}})}function Gi(e,t){let n=[];for(let[r,i]of[[`server`,e],[`ui`,t]])(i.status===`dead-pid`||i.status===`corrupt`)&&n.push({name:r,lockPath:i.lockPath,reason:i.status});return{prune:n}}function Ki(e){let t=e.inspect??(t=>St(e.lockDir,t)),n=e.unlink??(e=>Jt(e)),r=e.log??(e=>console.log(e)),i=e.error??(e=>console.error(e)),a=Gi(t(`server`),t(`ui`));if(a.prune.length===0)return r(`No stale locks.`),{pruned:[],failed:[]};let o=[],s=[];for(let e of a.prune)try{n(e.lockPath),o.push(e)}catch(t){s.push({target:e,error:t instanceof Error?t.message:String(t)})}if(o.length>0){let e=o.map(e=>`${e.name} (${e.reason})`).join(`, `);r(`Pruned ${o.length} stale lock${o.length===1?``:`s`}: ${e}`)}return s.length>0&&i(`Failed to prune: ${s.map(({target:e,error:t})=>`${e.name} (${e.lockPath}): ${t}`).join(`; `)}`),{pruned:o,failed:s}}function qi(e){return new t(`clean`).description(`Prune stale / corrupt open-knowledge lock files (never touches live locks)`).action(()=>{e(),Ki({lockDir:T(process.cwd())}).failed.length>0&&(process.exitCode=1)})}async function Ji(e,t,n={},r=re){if(!n.skipGhDetect&&r().available)return{tier:`A`,credentialArgs:[`-c`,`credential.helper=!gh auth git-credential`]};let i=await t.get(e);return i==null?{tier:`none`,credentialArgs:[]}:{tier:i.gitProtocol===`ssh`?`C`:`B`,credentialArgs:[`-c`,`credential.helper=!open-knowledge auth git-credential`]}}async function Yi(e,t,n=fetch){let r=new AbortController,i=setTimeout(()=>r.abort(),5e3);try{return(await n(`https://api.github.com/repos/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,{signal:r.signal,headers:{"User-Agent":`open-knowledge-cli`,Accept:`application/vnd.github+json`}})).status===200}catch{return!1}finally{clearTimeout(i)}}const Xi=[[`count`,0,10],[`compress`,10,20],[`receiv`,20,60],[`resolv`,60,100]];function Zi(e){let t=/^([\w ]+):\s+(\d+)%/.exec(e.trim());if(!t)return null;let n=t[1].toLowerCase(),r=Number(t[2]);for(let[e,i,a]of Xi)if(n.includes(e))return{stage:t[1],pct:Math.round(i+r/100*(a-i))};return null}function q(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}function Qi(e){return typeof e!=`string`||e.length===0?[`--progress`]:[`--progress`,`-b`,e]}const $i=o;async function ea(e){try{return await e.clone(Qi(e.branch)),{fellBack:!1}}catch(t){if(e.branch!==null&&$i(t))return e.onFallback(e.branch),await e.clone(Qi(null)),{fellBack:!0};throw t}}function ta(e,t,n){return e===`https`&&t===`github.com`&&n}async function na(e,t,n,r=process.cwd()){let i=yt(e);if(!i)throw Error(`Invalid git URL: ${e}`);let a=t.dir?B(r,t.dir):B(r,i.name);if(P(a)&&Wt(a).length>0)throw Error(`Target directory is not empty: ${a}`);let o=te(),s=i.protocol===`https`&&i.hostname===`github.com`?await Yi(i.owner,i.name):!1,c=ta(i.protocol,i.hostname,s)?{tier:`none`,credentialArgs:[]}:await Ji(i.hostname,o,{}),l=Te({baseDir:r,config:c.credentialArgs.length>=2?[c.credentialArgs[1]]:[],unsafe:{allowUnsafeCredentialHelper:!0}}).env({GIT_TERMINAL_PROMPT:`0`}),u=-1;l.outputHandler((e,n,r)=>{r.on(`data`,e=>{let n=e.toString(`utf-8`);for(let e of n.split(`
21
+ `)){let n=Zi(e);n&&n.pct!==u&&(u=n.pct,q(t.json,{type:`progress`,pct:n.pct,stage:n.stage}),t.json||process.stderr.write(`\r Cloning ${n.pct}%`))}})}),await ea({branch:typeof t.branch==`string`&&t.branch.length>0?t.branch:null,clone:t=>l.clone(e,a,t),onFallback:e=>{q(t.json,{type:`branch-fallback`,branch:e}),t.json||process.stderr.write(`\n Branch '${e}' not found upstream cloning default branch instead.\n`)}}),t.json||process.stderr.write(`
22
+ `);try{let{runInit:e}=await import(`./init-DKP6EDgg.mjs`),n=await e({cwd:a,mcp:!1});if(n.contentUpdated.length>0){let e=`auto-init: updated ${n.contentUpdated.join(`, `)}`;t.json?q(!0,{type:`warning`,message:e}):process.stderr.write(` ${e}\n`)}}catch(e){let n=e instanceof Error?e.message:String(e);t.json?q(!0,{type:`warning`,message:`auto-init: ${n}`}):process.stderr.write(` auto-init: ${n}\n`)}try{ra(a)}catch(e){let n=e instanceof Error?e.message:String(e);t.json?q(!0,{type:`warning`,message:`git-exclude: ${n}`}):process.stderr.write(` git-exclude: ${n}\n`)}return a}function ra(e){let t=be(e,[`.ok/`]);return t.kind===`no-exclude`?`no-exclude`:t.kind===`refused-tracked`?`already-present`:t.appended.length>0?`appended`:`already-present`}function ia(e){return new t(`clone`).description(`Clone a git repository and open it`).argument(`<url>`,`Repository URL or owner/repo shorthand`).argument(`[dir]`,`Target directory (default: ./<repo-name>)`).option(`--json`,`Output JSONL progress events`,!1).option(`-b, --branch <branch>`,`Branch to check out (falls back to default if missing)`).action(async(t,n,r)=>{let i=e();try{let a=await na(t,{json:r.json,dir:n,branch:r.branch??null},i);if(r.json)q(!0,{type:`complete`,dir:a});else{process.stderr.write(`✓ Cloned to ${a}\n`),process.chdir(a);let{startCommand:t}=await import(`./start-DdWzGG1a.mjs`);await t(e).parseAsync([],{from:`user`})}}catch(e){let t=e instanceof Error?e.message:String(e);r.json?q(!0,{type:`error`,message:t}):process.stderr.write(`✗ ${t}\n`),process.exitCode=1}})}var aa=u();const oa=[[`sync`],[`persistence`,`debounceMs`],[`persistence`,`maxDebounceMs`],[`server`,`port`],...r.map(e=>e.path)];function sa(e={}){let t=e.log??(e=>console.error(e)),n=e.error??(e=>console.error(e)),r=e.loadConfigFn??Et;try{let{sources:n}=r(e.cwd);return t(`✓ Configuration valid (sources: ${n.length===0?`defaults only`:n.join(`, `)})`),{ok:!0}}catch(e){return n(e instanceof Error?e.message:String(e)),{ok:!1}}}function ca(e){let t=(0,aa.parseDocument)(I(e,`utf-8`));if(t.errors.length>0)throw Error(`Could not parse ${e}: ${t.errors.map(e=>e.message).join(`; `)}`);let n=[];for(let e of oa)t.hasIn(e)&&n.push(e.join(`.`));return n}function la(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ua(e){let t={};for(let n of e){let e=t;for(let t=0;t<n.length-1;t++){let r=n[t],i=e[r],a=la(i)?i:{};e[r]=a,e=a}e[n[n.length-1]]=null}return t}async function da(e={}){let t=e.log??(e=>console.log(e)),n=e.error??(e=>console.error(e)),r=e.scope??`both`,i=e.dryRun??!1,a=e.cwd??process.cwd(),o=e.writeConfigPatchFn??Me,s=[];(r===`project`||r===`both`)&&s.push({scope:`project`,absPath:Ue(`project`,a,e.homedirOverride)}),(r===`user`||r===`both`)&&s.push({scope:`user`,absPath:Ue(`user`,a,e.homedirOverride)});let l=[],u=!0;for(let{scope:t,absPath:n}of s){if(!P(n)){l.push({path:n,scope:t,found:[],removed:[]});continue}let r;try{r=ca(n)}catch(e){let r=e instanceof Error?e.message:String(e);l.push({path:n,scope:t,found:[],removed:[],error:r}),u=!1;continue}if(r.length===0||i){l.push({path:n,scope:t,found:r,removed:[]});continue}let s=await o({cwd:a,scope:t,patch:ua(oa.filter(e=>r.includes(e.join(`.`)))),homedirOverride:e.homedirOverride});if(!s.ok){l.push({path:n,scope:t,found:r,removed:[],error:c(s.error)}),u=!1;continue}l.push({path:n,scope:t,found:r,removed:r})}for(let e of l)e.error&&n(`✗ ${e.path}: ${e.error}`);let d=l.some(e=>e.error!==void 0),f=l.reduce((e,t)=>e+t.found.length,0);if(f===0&&!d)t(`No deprecated fields found.`);else if(f>0)for(let e of l)e.error||(e.found.length===0?t(` ${e.path}: no deprecated fields`):t(i?`[dry-run] ${e.path}: would remove ${e.found.length} field(s): ${e.found.join(`, `)}`:`✓ ${e.path}: removed ${e.removed.length} field(s): ${e.removed.join(`, `)}`));return{outcomes:l,ok:u}}function fa(){let e=new t(`config`).description(`Inspect and maintain Open Knowledge configuration files`);return e.command(`validate`).description(`Validate the merged config (defaults → user → project)`).action(()=>{sa({}).ok||(process.exitCode=1)}),e.command(`migrate`).description(`Remove deprecated config fields from config.yml idempotently (every removed key in the registry — content.*, folders, appearance.editorModeDefault, server.host, etc. — plus the silently-dropped sync.*, persistence.*, server.port)`).option(`--scope <scope>`,`Which scope to migrate: project | user | both`,`both`).option(`--dry-run`,`Preview without writing`,!1).action(async e=>{let t=e.scope;if(t!==`project`&&t!==`user`&&t!==`both`){console.error(`Invalid --scope: ${t}. Expected: project | user | both`),process.exitCode=2;return}(await da({scope:t,dryRun:e.dryRun})).ok||(process.exitCode=1)}),e}var pa=e(gt(),1),J=e(Pt(),1);const ma=new Set([`doc.name`]);function ha(e){return`doc:${hn(`blake2b512`,{outputLength:32}).update(e).digest(`hex`).slice(0,8)}`}function ga(e,t,n){let r=e.docNameMap[n];if(r===void 0){e.docNameMap[n]=t;return}if(r===t)return;let i=e.docNameCollisions[n];i?i.includes(t)||i.push(t):e.docNameCollisions[n]=[t]}function _a(e,t){let n=t.originalToHashed.get(e);if(n!==void 0)return n;let r=ha(e);return t.originalToHashed.set(e,r),ga(t,e,r),r}function va(e,t){return t.length===0||!e.includes(t)?e:e.split(t).join(`<CONTENT_DIR>`)}function ya(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ba(e,t){if(typeof e==`string`)return va(e,t.contentDir);if(Array.isArray(e))return e.map(e=>ba(e,t));if(!ya(e))return e;let n=typeof e.key==`string`&&ma.has(e.key)&&ya(e.value)&&typeof e.value.stringValue==`string`?e.value.stringValue:null,r={};for(let[i,a]of Object.entries(e))if(n!==null&&i===`value`&&ya(a)){let e=_a(n,t);r[i]={...a,stringValue:e}}else ma.has(i)&&typeof a==`string`?r[i]=_a(a,t):r[i]=ba(a,t);return r}function xa(e,t){if(t.originalToHashed.size===0)return e;let n=Array.from(t.originalToHashed.entries()).sort(([e],[t])=>t.length-e.length),r=e;for(let[e,t]of n)e.length!==0&&r.includes(e)&&(r=r.split(e).join(t));return r}function Sa(e,t){let n=I(e,`utf-8`);if(n.length===0)return;let r=n.endsWith(`
24
23
  `),i=n.split(`
25
- `),a=[];for(let e=0;e<i.length;e++){let n=i[e]??``;if(!(e===i.length-1&&n===``)){if(n.length===0){a.push(``);continue}try{let e=ya(JSON.parse(n),t);a.push(JSON.stringify(e))}catch{a.push(n)}}}L(e,r?`${a.join(`
24
+ `),a=[];for(let e=0;e<i.length;e++){let n=i[e]??``;if(!(e===i.length-1&&n===``)){if(n.length===0){a.push(``);continue}try{let e=ba(JSON.parse(n),t);a.push(JSON.stringify(e))}catch{a.push(n)}}}L(e,r?`${a.join(`
26
25
  `)}\n`:a.join(`
27
- `))}function Sa(e,t){let n=I(e,`utf-8`);if(n.trim().length!==0)try{let r=ya(JSON.parse(n),t),i=n.endsWith(`
26
+ `))}function Ca(e,t){let n=I(e,`utf-8`);if(n.trim().length!==0)try{let r=ba(JSON.parse(n),t),i=n.endsWith(`
28
27
  `)?`
29
- `:``;L(e,`${JSON.stringify(r,null,2)}${i}`)}catch{let r=ba(_a(n,t.contentDir),t);r!==n&&L(e,r)}}function Ca(e,t){let n=I(e,`utf-8`),r=_a(n,t.contentDir);r!==n&&L(e,r)}function wa(e){try{return Wt(e,{withFileTypes:!0}).filter(e=>e.isFile()).map(t=>z(e,t.name))}catch{return[]}}const Ta=new Set([`agent-presence.json`,`runtime.json`]);function Ea(e){let t={contentDir:e.contentDir,docNameMap:{},originalToHashed:new Map,docNameCollisions:{}};for(let n of[`telemetry`,`logs`,`process`])for(let r of wa(z(e.stagingDir,n)))r.endsWith(`.jsonl`)?xa(r,t):r.endsWith(`.json`)?Sa(r,t):Ca(r,t);for(let n of wa(z(e.stagingDir,`state`))){let e=R(n);Ta.has(e)?Sa(n,t):Ca(n,t)}return{docNameMap:t.docNameMap,docNameCollisions:t.docNameCollisions}}const Da=[`.ok`,`local`,`telemetry`],Oa=[`.ok`,`local`,`logs`],ka=`spans-current.jsonl`,Aa=`spans-prev.jsonl`,ja=`server-current.jsonl`,Ma=`server-prev.jsonl`;function Na(e){return z(e,...Da,ka)}function Pa(e){return z(e,...Da,Aa)}function Fa(e){return z(e,...Oa,ja)}function Ia(e){return z(e,...Oa,Ma)}async function La(e){try{let t=await fetch(`http://127.0.0.1:${e}/api/metrics/agent-presence`,{signal:AbortSignal.timeout(1e3)});return t.ok?await t.text():null}catch{return null}}function Ra(e){let t=z(e,`.git`,`ok`);if(!P(t))return null;let n=N(`git`,[`-C`,t,`log`,`--oneline`,`-50`],{encoding:`utf-8`,timeout:2e3});return n.error||n.status!==0?null:n.stdout??``}function za(){let e=process.env.OK_DESKTOP_VERSION,t=process.env.OK_DESKTOP_PACKAGED,n=process.env.OK_DESKTOP_CHANNEL;return e===void 0||t===void 0||n===void 0?null:{electronVersion:e,packaged:t===`1`||t.toLowerCase()===`true`,channel:n}}function Ba(){return{nodeVersion:process.version,platform:rn(),arch:en()}}function Va(){return process.env.OTEL_SDK_DISABLED===`false`}function Ha(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Ua(e){if(!P(e))return{};let t;try{t=(0,ia.parse)(I(e,`utf-8`))}catch(t){return console.warn(`[ok diagnose bundle] failed to parse ${e} for manifest config; manifest will report schema defaults. Reason: ${t instanceof Error?t.message:String(t)}`),{}}if(!Ha(t))return{};let n=t.telemetry;if(!Ha(n))return{};let r=n.localSink;return Ha(r)?r:{}}function Wa(e){return typeof e==`boolean`?e:void 0}function Ga(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?e:void 0}function Ka(e){if(Ha(e))return Ga(e.maxBytes)}function qa(e){let t=Ua(Ue(`project`,e)),n=Ua(Ue(`project-local`,e));return{enabled:Wa(n.enabled)??Wa(t.enabled)??!0,spansMaxBytes:Ka(n.spans)??Ka(t.spans)??52428800,logsMaxBytes:Ka(n.logs)??Ka(t.logs)??26214400}}function Ja(e){return hn(`sha256`).update(e).digest(`hex`)}function Ya(e){let t=I(e),n=0;for(let e=0;e<t.length;e++)t[e]===10&&n++;return n}function Xa(e){let t=I(e,`utf-8`),n=`"doc.name"`,r=0,i=t.indexOf(n);for(;i!==-1;)r++,i=t.indexOf(n,i+10);return r}function Y(e,t){return P(e)?(F(Xt(t),{recursive:!0}),Bt(e,t),!0):!1}function Za(e){let t=[],n=e=>{let r=Wt(e,{withFileTypes:!0});for(let i of r){let r=z(e,i.name);i.isDirectory()?n(r):i.isFile()&&t.push(r)}};return n(e),t.sort()}const Qa=new Set([`.jsonl`]);function $a(e){let t=e.lastIndexOf(`.`);return t===-1?!1:Qa.has(e.slice(t))}function eo(e,t){return Zt(e,t).split(Qt).join(`/`)}async function to(e){let t=B(e.contentDir),n=B(e.projectDir??e.contentDir),r=e.deps??{},i=r.fetchAgentPresence??La,a=r.readShadowHead??Ra,o=r.now??(()=>new Date),s=r.okVersion??(()=>wt),c=r.readDesktopEnv??za,l=r.readRuntime??Ba,u=r.isOtlpPushEnabled??Va,d=Ht(z(on(),`ok-bundle-`));F(z(d,`telemetry`),{recursive:!0}),F(z(d,`logs`),{recursive:!0}),F(z(d,`state`),{recursive:!0}),Y(Na(n),z(d,`telemetry`,ka)),Y(Pa(n),z(d,`telemetry`,Aa)),Y(Fa(n),z(d,`logs`,ja)),Y(Ia(n),z(d,`logs`,Ma));let f=z(n,`.ok`,`local`),p=z(f,`server.lock`),m=`not-running`,h=`no server.lock`,g=null;if(P(p)){Y(p,z(d,`state`,`server.lock`));try{let e=I(p,`utf-8`),t=JSON.parse(e);typeof t.port==`number`?g=t.port:h=`lock present but no port`}catch{h=`lock present but unparseable`}}if(g!==null){let e=await i(g);e===null?h=`agent-presence endpoint at :${g} unreachable`:(L(z(d,`state`,`agent-presence.json`),e),m=`running`,h=``)}let _=a(t);_!==null&&L(z(d,`state`,`shadow-head.txt`),_),Y(z(f,`last-spawn-error.log`),z(d,`state`,`last-spawn-error.log`));let v=l(),y=c(),b={ok:{version:s(),nodeVersion:v.nodeVersion,platform:v.platform,arch:v.arch},host:{desktop:y}};L(z(d,`state`,`runtime.json`),`${JSON.stringify(b,null,2)}\n`);let x=m===`running`?`running
30
- `:`not-running (${h})\n`;if(L(z(d,`state`,`server-status.txt`),x),e.processDir&&P(e.processDir)){let t=z(d,`process`);F(t,{recursive:!0}),Bt(e.processDir,t,{recursive:!0})}let S=null;e.redact===!0&&(S=Ea({stagingDir:d,contentDir:t}));let ee=qa(n),te=Za(d),C=[],ne=0,re=0;for(let e of te){let t=eo(d,e),n=qt(e).size,r=$a(t)?Ya(e):0;C.push({path:t,bytes:n,lines:r}),ne+=n,t.startsWith(`telemetry/`)&&$a(t)&&(re+=Xa(e))}let ie={schemaVersion:1,createdAt:o().toISOString(),ok:{version:s(),nodeVersion:v.nodeVersion,platform:v.platform,arch:v.arch},host:{desktop:y},contentDir:{pathSha256:Ja(t),absolutePath:S===null?t:`<CONTENT_DIR>`},telemetry:{localSink:ee,otlpPushEnabled:u()},redaction:S===null?{applied:!1,docNameMapSidecar:null}:Object.keys(S.docNameCollisions).length>0?{applied:!0,docNameMapSidecar:null,docNameCollisions:S.docNameCollisions}:{applied:!0,docNameMapSidecar:null},serverStatus:m,files:C};L(z(d,`manifest.json`),`${JSON.stringify(ie,null,2)}\n`);let ae=te.some(e=>{try{return I(e,`utf-8`).includes(t)}catch{return!1}}),w={totalBytes:ne,fileCount:C.length,docNameCount:re,contentDirVisible:ae,redacted:S!==null},oe=!1;return{stagingDir:d,manifest:ie,summary:w,redactionMapPayload:S===null?null:{docNameMap:S.docNameMap,docNameCollisions:S.docNameCollisions},cleanup:()=>{oe||(oe=!0,Kt(d,{recursive:!0,force:!0}))}}}async function no(e){let{collected:t,outputPath:n}=e,r=Xt(n);if(!P(r))throw Error(`ok diagnose bundle: parent directory does not exist: ${r}. Create it or pass --out with an existing parent.`);if(t.redactionMapPayload!==null){let e=`${R(n,`.zip`)}.docnames.json`,r={...t.manifest,redaction:{...t.manifest.redaction,applied:!0,docNameMapSidecar:e}};L(z(t.stagingDir,`manifest.json`),`${JSON.stringify(r,null,2)}\n`)}let i=new fa.ZipFile,a=Za(t.stagingDir);for(let e of a){let n=eo(t.stagingDir,e);i.addFile(e,n)}i.end(),t.redactionMapPayload!==null&&L(z(r,`${R(n,`.zip`)}.docnames.json`),`${JSON.stringify({docNameMap:t.redactionMapPayload.docNameMap,docNameCollisions:t.redactionMapPayload.docNameCollisions},null,2)}\n`,{mode:384});let o=Vt(n);return i.outputStream.pipe(o),await new Promise((e,t)=>{o.on(`close`,e),o.on(`error`,t),i.outputStream.on(`error`,t)}),n}function ro(){let e=N(`bun`,[`--version`],{encoding:`utf-8`,timeout:5e3,env:{...process.env,LANG:`C`,LC_ALL:`C`}});return e.error?{ok:!1,error:e.error.message}:e.signal===`SIGTERM`?{ok:!1,error:`probe timed out`}:e.status===0?{ok:!0,version:e.stdout.trim()}:{ok:!1,error:e.stderr?.trim()||`exit code ${e.status}`}}function io(e={}){let t=e.probe??ro;return{name:`bun`,run:async()=>{let e=t();return e.ok?{name:`bun`,status:`pass`,summary:`bun ${e.version}`}:{name:`bun`,status:`fail`,summary:`bun not found on PATH`,remediation:`Install Bun: https://bun.sh/docs/installation`,detail:e.error}}}}function ao(e={}){let t=e.loader??Et;return{name:`config-yaml`,run:async e=>{if(!P(B(e.cwd,`.ok`,`config.yml`)))return{name:`config-yaml`,status:`warn`,summary:`.ok/${Tt} not found (project not initialized)`,remediation:"Run `ok init` to scaffold the project."};try{let{config:n,sources:r}=t(e.cwd);return{name:`config-yaml`,status:`pass`,summary:`parses; content.dir = ${n.content.dir}`,detail:`sources: ${r.join(`, `)}`}}catch(e){let t=e instanceof Error?e.message:String(e);return{name:`config-yaml`,status:`fail`,summary:`.ok/${Tt} failed to parse`,detail:t}}}}}function oo(e){try{return Lt(e,zt.W_OK),{writable:!0}}catch(e){return{writable:!1,reason:e instanceof Error?e.message:String(e)}}}function so(e={}){let t=e.loader??Et,n=e.probeWritable??oo;return{name:`content-dir`,run:async e=>{if(!P(B(e.cwd,`.ok`,`config.yml`)))return{name:`content-dir`,status:`warn`,summary:`project not initialized`,remediation:"Run `ok init` to scaffold the project."};let r;try{let{config:n}=t(e.cwd);r=B(e.cwd,n.content.dir)}catch(e){return{name:`content-dir`,status:`fail`,summary:`content.dir unresolved (config invalid)`,detail:e instanceof Error?e.message:String(e)}}if(!P(r))return{name:`content-dir`,status:`fail`,summary:`content.dir does not exist: ${r}`,remediation:`Create the directory or fix \`content.dir\` in .ok/${Tt}.`};if(!qt(r).isDirectory())return{name:`content-dir`,status:`fail`,summary:`content.dir is not a directory: ${r}`};let i=n(r);return i.writable?{name:`content-dir`,status:`pass`,summary:`${r} (writable)`}:{name:`content-dir`,status:`fail`,summary:`content.dir is not writable: ${r}`,detail:i.reason}}}}function co(e={}){let t=e.assert??rt;return{name:`git`,run:async()=>{try{let e=t();return{name:`git`,status:`pass`,summary:`git ${e.version} (${e.source} — ${e.resolvedPath})`}}catch(e){if(e instanceof De)return{name:`git`,status:`fail`,summary:`git not found`,remediation:e.guidance.options.map(e=>`${e.label}: ${e.command}`).join(` / `),detail:e.message};if(e instanceof pt)return{name:`git`,status:`fail`,summary:`git ${e.detected} is older than required ${e.required}`,remediation:e.guidance.options.map(e=>`${e.label}: ${e.command}`).join(` / `),detail:e.message};throw e}}}}function lo(e){let t=N(`codesign`,[`--verify`,`--deep`,`--strict`,e],{encoding:`utf-8`,timeout:5e3,env:{...process.env,LANG:`C`,LC_ALL:`C`}});return t.error?{ok:!1,stderr:t.error.message}:t.signal===`SIGTERM`?{ok:!1,stderr:`codesign probe timed out`}:{ok:t.status===0,stderr:(t.stderr??``).trim()}}function uo(e={}){let t=e.platform??process.platform,n=e.execPath??process.execPath,r=e.codesignVerify??lo;return{name:`macos-codesig`,run:async()=>{if(t!==`darwin`)return{name:`macos-codesig`,status:`pass`,summary:`skipped on ${t} (macOS-only check)`};let e=n.indexOf(`/Contents/MacOS/`);if(e===-1)return{name:`macos-codesig`,status:`pass`,summary:`dev mode (no app bundle)`};let i=n.slice(0,e);if(i.startsWith(`/private/var/folders/`))return{name:`macos-codesig`,status:`fail`,summary:`app is running translocated (quarantine sandbox)`,remediation:`Drag Open Knowledge.app to /Applications/ and re-launch.`,detail:`bundlePath: ${i}`};let a=r(i);return a.ok?{name:`macos-codesig`,status:`pass`,summary:`signed bundle at ${i}`}:{name:`macos-codesig`,status:`fail`,summary:`codesign --verify failed`,remediation:`Re-download Open Knowledge from the official releases page.`,detail:`bundlePath: ${i}\n${a.stderr}`}}}}const fo=[`git`,`bun`,`config-yaml`,`content-dir`,`server-lock`,`shadow-repo`,`macos-codesig`];function po(e){return fo.includes(e)}async function mo(e,t,n={}){let r=n.timeoutMs??5e3,i,a=Math.round(r/1e3);try{let n=new Promise(t=>{i=setTimeout(()=>{t({name:e.name,status:`fail`,summary:`check timed out after ${a}s`})},r)}),o=e.run(t),s=await Promise.race([o,n]);return o.catch(()=>{}),s}catch(t){let n=t instanceof Error?t.message:String(t);return{name:e.name,status:`fail`,summary:`check crashed: ${n}`}}finally{i!==void 0&&clearTimeout(i)}}async function ho(e,t,n={}){let r=[];for(let i of e)r.push(await mo(i,t,n));return r}function go(e={}){let t=e.inspect??St;return{name:`server-lock`,run:async e=>{let n=T(e.cwd);if(!P(n))return{name:`server-lock`,status:`pass`,summary:"no server lock (no `.ok/local/` yet)"};let r=t(n,`server`);switch(r.status){case`missing`:return{name:`server-lock`,status:`pass`,summary:`no server holding the lock`};case`alive`:return{name:`server-lock`,status:`fail`,summary:`server lock held by pid ${r.lock.pid} on this host`,remediation:"Stop the other Open Knowledge process or run `ok stop`.",detail:`lockPath: ${r.lockPath}; port: ${r.lock.port}; started: ${r.lock.startedAt}`};case`foreign-host`:return{name:`server-lock`,status:`warn`,summary:`lock claimed by ${r.lock.hostname} (foreign host)`,remediation:`Run \`ok clean\` to prune the stale lock at ${B(n,`server.lock`)}.`,detail:`lockPath: ${r.lockPath}; pid: ${r.lock.pid}`};case`dead-pid`:return{name:`server-lock`,status:`warn`,summary:`stale lock for non-existent pid ${r.lock.pid}`,remediation:"Run `ok clean` to prune.",detail:`lockPath: ${r.lockPath}`};case`corrupt`:return{name:`server-lock`,status:`warn`,summary:`server.lock is corrupt (unparseable or invalid pid)`,remediation:`Delete ${r.lockPath} and rerun.`};default:return r}}}}function _o(e={}){let t=e.resolve??Ke;return{name:`shadow-repo`,run:async e=>{if(!P(B(e.cwd,`.git`)))return{name:`shadow-repo`,status:`warn`,summary:`no .git/ at project root (shadow repo not initialized)`,remediation:"Run `ok start` once to initialize the shadow repo."};let n;try{n=t(e.cwd)}catch(e){if(e instanceof lt||e instanceof Pe)return{name:`shadow-repo`,status:`fail`,summary:`cannot resolve shadow gitdir: ${e.message}`};throw e}if(!P(n))return{name:`shadow-repo`,status:`warn`,summary:`shadow repo at ${n} not yet initialized`,remediation:"Run `ok start` once to initialize the shadow repo."};let r=B(n,`HEAD`);if(!P(r))return{name:`shadow-repo`,status:`fail`,summary:`shadow repo at ${n} is missing HEAD`};let i;try{i=I(r,`utf-8`).trim()}catch(e){return{name:`shadow-repo`,status:`fail`,summary:`cannot read shadow HEAD: ${e instanceof Error?e.message:String(e)}`}}return{name:`shadow-repo`,status:`pass`,summary:`${n} (HEAD: ${i})`}}}}function vo(){return[co(),io(),ao(),so(),go(),_o(),uo()]}function yo(e){switch(e){case`pass`:return J.default.green(`✓`);case`warn`:return J.default.yellow(`!`);case`fail`:return J.default.red(`✗`)}}function bo(e,t){let n=[`[${yo(e.status)}] ${e.name}: ${e.summary}`];if(e.remediation!==void 0&&e.status!==`pass`&&n.push(` → ${e.remediation}`),t&&e.detail!==void 0)for(let t of e.detail.split(`
31
- `))n.push(` ${J.default.dim(t)}`);return n}function xo(e){let t=e.filter(e=>e.status===`fail`).length,n=e.filter(e=>e.status===`warn`).length;if(t===0&&n===0)return`All checks passed`;let r=[];return t>0&&r.push(`${t} error${t===1?``:`s`}`),n>0&&r.push(`${n} warning${n===1?``:`s`}`),r.join(`, `)}async function So(e,t={}){let n=t.checks??vo(),r=t.stdout??(e=>console.log(e)),i=t.stderr??(e=>console.error(e)),a=e.quiet??!1,o=e.json??!1,s=e.verbose??!1,c;if(e.check!==void 0){if(!po(e.check))return i(J.default.red(`unknown check '${e.check}'. Valid: ${fo.join(`, `)}`)),2;let t=e.check,r=n.find(e=>e.name===t);if(!r)return i(J.default.red(`internal error: check '${e.check}' not registered`)),2;c=[r]}else c=[...n];let l={cwd:e.cwd},u=await ho(c,l,t.timeoutMs===void 0?{}:{timeoutMs:t.timeoutMs});if(!a)if(o)for(let e of u)r(JSON.stringify(e));else{for(let e of u)for(let t of bo(e,s))r(t);r(``),r(xo(u))}return u.some(e=>e.status===`fail`)?1:0}function Co(){return new t(`health`).description(`Run environment health checks (${fo.join(`, `)})`).option(`--json`,`Emit NDJSON (one CheckResult per line)`).option(`--verbose`,`Include detail field + probe context in human-readable output`).option(`--check <name>`,`Run only the named check. One of: ${fo.join(`, `)}`).option(`--quiet`,`Suppress output; exit code only`).action(async e=>{let t=await So({cwd:process.cwd(),json:e.json,verbose:e.verbose,check:e.check,quiet:e.quiet});process.exit(t)})}function wo(e){let t=N(`ps`,[`-p`,String(e),`-o`,`%cpu=,%mem=,rss=,vsz=`],{encoding:`utf-8`,timeout:2e3});if(t.error||!t.stdout?.trim())return null;let[n,r,i,a]=t.stdout.trim().split(/\s+/),o=Number.parseFloat(n??``),s=Number.parseFloat(r??``),c=Number.parseInt(i??``,10),l=Number.parseInt(a??``,10);return Number.isNaN(o)||Number.isNaN(s)||Number.isNaN(c)||Number.isNaN(l)?null:{ts:new Date().toISOString(),pid:e,cpuPercent:o,memPercent:s,rssKb:c,vszKb:l}}function To(e){let t=N(`lsof`,[`-p`,String(e)],{encoding:`utf-8`,timeout:5e3});return t.error||!t.stdout?null:t.stdout}function Eo(e){let t=[];for(let n of e.split(`
32
- `)){let e=n.match(/127\.0\.0\.1:(\d+)\s*\(LISTEN\)/);if(e){let n=Number.parseInt(e[1]??``,10);Number.isNaN(n)||t.push(n)}}return t}function Do(e){let t=N(`curl`,[`-s`,`--max-time`,`2`,`http://127.0.0.1:${e}/json/list`],{encoding:`utf-8`,timeout:3e3});if(t.error||!t.stdout?.trim())return null;try{let e=JSON.parse(t.stdout);return Array.isArray(e)?e:null}catch{return null}}function Oo(e,t,n){let r=z(Ht(z(on(),`ok-cdp-`)),`profiler.mjs`);return L(r,`import { writeFileSync } from 'node:fs';
28
+ `:``;L(e,`${JSON.stringify(r,null,2)}${i}`)}catch{let r=xa(va(n,t.contentDir),t);r!==n&&L(e,r)}}function wa(e,t){let n=I(e,`utf-8`),r=va(n,t.contentDir);r!==n&&L(e,r)}function Ta(e){try{return Wt(e,{withFileTypes:!0}).filter(e=>e.isFile()).map(t=>z(e,t.name))}catch{return[]}}const Ea=new Set([`agent-presence.json`,`runtime.json`]);function Da(e){let t={contentDir:e.contentDir,docNameMap:{},originalToHashed:new Map,docNameCollisions:{}};for(let n of[`telemetry`,`logs`,`process`])for(let r of Ta(z(e.stagingDir,n)))r.endsWith(`.jsonl`)?Sa(r,t):r.endsWith(`.json`)?Ca(r,t):wa(r,t);for(let n of Ta(z(e.stagingDir,`state`))){let e=R(n);Ea.has(e)?Ca(n,t):wa(n,t)}return{docNameMap:t.docNameMap,docNameCollisions:t.docNameCollisions}}const Oa=[`.ok`,`local`,`telemetry`],ka=[`.ok`,`local`,`logs`],Aa=`spans-current.jsonl`,ja=`spans-prev.jsonl`,Ma=`server-current.jsonl`,Na=`server-prev.jsonl`;function Pa(e){return z(e,...Oa,Aa)}function Fa(e){return z(e,...Oa,ja)}function Ia(e){return z(e,...ka,Ma)}function La(e){return z(e,...ka,Na)}async function Ra(e){try{let t=await fetch(`http://127.0.0.1:${e}/api/metrics/agent-presence`,{signal:AbortSignal.timeout(1e3)});return t.ok?await t.text():null}catch{return null}}function za(e){let t=z(e,`.git`,`ok`);if(!P(t))return null;let n=N(`git`,[`-C`,t,`log`,`--oneline`,`-50`],{encoding:`utf-8`,timeout:2e3});return n.error||n.status!==0?null:n.stdout??``}function Ba(){let e=process.env.OK_DESKTOP_VERSION,t=process.env.OK_DESKTOP_PACKAGED,n=process.env.OK_DESKTOP_CHANNEL;return e===void 0||t===void 0||n===void 0?null:{electronVersion:e,packaged:t===`1`||t.toLowerCase()===`true`,channel:n}}function Va(){return{nodeVersion:process.version,platform:rn(),arch:en()}}function Ha(){return process.env.OTEL_SDK_DISABLED===`false`}function Ua(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Wa(e){if(!P(e))return{};let t;try{t=(0,aa.parse)(I(e,`utf-8`))}catch(t){return console.warn(`[ok diagnose bundle] failed to parse ${e} for manifest config; manifest will report schema defaults. Reason: ${t instanceof Error?t.message:String(t)}`),{}}if(!Ua(t))return{};let n=t.telemetry;if(!Ua(n))return{};let r=n.localSink;return Ua(r)?r:{}}function Ga(e){return typeof e==`boolean`?e:void 0}function Ka(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?e:void 0}function qa(e){if(Ua(e))return Ka(e.maxBytes)}function Ja(e){let t=Wa(Ue(`project`,e)),n=Wa(Ue(`project-local`,e));return{enabled:Ga(n.enabled)??Ga(t.enabled)??!0,spansMaxBytes:qa(n.spans)??qa(t.spans)??52428800,logsMaxBytes:qa(n.logs)??qa(t.logs)??26214400}}function Ya(e){return hn(`sha256`).update(e).digest(`hex`)}function Xa(e){let t=I(e),n=0;for(let e=0;e<t.length;e++)t[e]===10&&n++;return n}function Za(e){let t=I(e,`utf-8`),n=`"doc.name"`,r=0,i=t.indexOf(n);for(;i!==-1;)r++,i=t.indexOf(n,i+10);return r}function Y(e,t){return P(e)?(F(Xt(t),{recursive:!0}),Bt(e,t),!0):!1}function Qa(e){let t=[],n=e=>{let r=Wt(e,{withFileTypes:!0});for(let i of r){let r=z(e,i.name);i.isDirectory()?n(r):i.isFile()&&t.push(r)}};return n(e),t.sort()}const $a=new Set([`.jsonl`]);function eo(e){let t=e.lastIndexOf(`.`);return t===-1?!1:$a.has(e.slice(t))}function to(e,t){return Zt(e,t).split(Qt).join(`/`)}async function no(e){let t=B(e.contentDir),n=B(e.projectDir??e.contentDir),r=e.deps??{},i=r.fetchAgentPresence??Ra,a=r.readShadowHead??za,o=r.now??(()=>new Date),s=r.okVersion??(()=>wt),c=r.readDesktopEnv??Ba,l=r.readRuntime??Va,u=r.isOtlpPushEnabled??Ha,d=Ht(z(on(),`ok-bundle-`));F(z(d,`telemetry`),{recursive:!0}),F(z(d,`logs`),{recursive:!0}),F(z(d,`state`),{recursive:!0}),Y(Pa(n),z(d,`telemetry`,Aa)),Y(Fa(n),z(d,`telemetry`,ja)),Y(Ia(n),z(d,`logs`,Ma)),Y(La(n),z(d,`logs`,Na));let f=z(n,`.ok`,`local`),p=z(f,`server.lock`),m=`not-running`,h=`no server.lock`,g=null;if(P(p)){Y(p,z(d,`state`,`server.lock`));try{let e=I(p,`utf-8`),t=JSON.parse(e);typeof t.port==`number`?g=t.port:h=`lock present but no port`}catch{h=`lock present but unparseable`}}if(g!==null){let e=await i(g);e===null?h=`agent-presence endpoint at :${g} unreachable`:(L(z(d,`state`,`agent-presence.json`),e),m=`running`,h=``)}let _=a(t);_!==null&&L(z(d,`state`,`shadow-head.txt`),_),Y(z(f,`last-spawn-error.log`),z(d,`state`,`last-spawn-error.log`));let v=l(),y=c(),b={ok:{version:s(),nodeVersion:v.nodeVersion,platform:v.platform,arch:v.arch},host:{desktop:y}};L(z(d,`state`,`runtime.json`),`${JSON.stringify(b,null,2)}\n`);let x=m===`running`?`running
29
+ `:`not-running (${h})\n`;if(L(z(d,`state`,`server-status.txt`),x),e.processDir&&P(e.processDir)){let t=z(d,`process`);F(t,{recursive:!0}),Bt(e.processDir,t,{recursive:!0})}let S=null;e.redact===!0&&(S=Da({stagingDir:d,contentDir:t}));let ee=Ja(n),te=Qa(d),C=[],ne=0,re=0;for(let e of te){let t=to(d,e),n=qt(e).size,r=eo(t)?Xa(e):0;C.push({path:t,bytes:n,lines:r}),ne+=n,t.startsWith(`telemetry/`)&&eo(t)&&(re+=Za(e))}let ie={schemaVersion:1,createdAt:o().toISOString(),ok:{version:s(),nodeVersion:v.nodeVersion,platform:v.platform,arch:v.arch},host:{desktop:y},contentDir:{pathSha256:Ya(t),absolutePath:S===null?t:`<CONTENT_DIR>`},telemetry:{localSink:ee,otlpPushEnabled:u()},redaction:S===null?{applied:!1,docNameMapSidecar:null}:Object.keys(S.docNameCollisions).length>0?{applied:!0,docNameMapSidecar:null,docNameCollisions:S.docNameCollisions}:{applied:!0,docNameMapSidecar:null},serverStatus:m,files:C};L(z(d,`manifest.json`),`${JSON.stringify(ie,null,2)}\n`);let ae=te.some(e=>{try{return I(e,`utf-8`).includes(t)}catch{return!1}}),w={totalBytes:ne,fileCount:C.length,docNameCount:re,contentDirVisible:ae,redacted:S!==null},oe=!1;return{stagingDir:d,manifest:ie,summary:w,redactionMapPayload:S===null?null:{docNameMap:S.docNameMap,docNameCollisions:S.docNameCollisions},cleanup:()=>{oe||(oe=!0,Kt(d,{recursive:!0,force:!0}))}}}async function ro(e){let{collected:t,outputPath:n}=e,r=Xt(n);if(!P(r))throw Error(`ok diagnose bundle: parent directory does not exist: ${r}. Create it or pass --out with an existing parent.`);if(t.redactionMapPayload!==null){let e=`${R(n,`.zip`)}.docnames.json`,r={...t.manifest,redaction:{...t.manifest.redaction,applied:!0,docNameMapSidecar:e}};L(z(t.stagingDir,`manifest.json`),`${JSON.stringify(r,null,2)}\n`)}let i=new pa.ZipFile,a=Qa(t.stagingDir);for(let e of a){let n=to(t.stagingDir,e);i.addFile(e,n)}i.end(),t.redactionMapPayload!==null&&L(z(r,`${R(n,`.zip`)}.docnames.json`),`${JSON.stringify({docNameMap:t.redactionMapPayload.docNameMap,docNameCollisions:t.redactionMapPayload.docNameCollisions},null,2)}\n`,{mode:384});let o=Vt(n);return i.outputStream.pipe(o),await new Promise((e,t)=>{o.on(`close`,e),o.on(`error`,t),i.outputStream.on(`error`,t)}),n}function io(){let e=N(`bun`,[`--version`],{encoding:`utf-8`,timeout:5e3,env:{...process.env,LANG:`C`,LC_ALL:`C`}});return e.error?{ok:!1,error:e.error.message}:e.signal===`SIGTERM`?{ok:!1,error:`probe timed out`}:e.status===0?{ok:!0,version:e.stdout.trim()}:{ok:!1,error:e.stderr?.trim()||`exit code ${e.status}`}}function ao(e={}){let t=e.probe??io;return{name:`bun`,run:async()=>{let e=t();return e.ok?{name:`bun`,status:`pass`,summary:`bun ${e.version}`}:{name:`bun`,status:`fail`,summary:`bun not found on PATH`,remediation:`Install Bun: https://bun.sh/docs/installation`,detail:e.error}}}}function oo(e={}){let t=e.loader??Et;return{name:`config-yaml`,run:async e=>{if(!P(B(e.cwd,`.ok`,`config.yml`)))return{name:`config-yaml`,status:`warn`,summary:`.ok/${Tt} not found (project not initialized)`,remediation:"Run `ok init` to scaffold the project."};try{let{config:n,sources:r}=t(e.cwd);return{name:`config-yaml`,status:`pass`,summary:`parses; content.dir = ${n.content.dir}`,detail:`sources: ${r.join(`, `)}`}}catch(e){let t=e instanceof Error?e.message:String(e);return{name:`config-yaml`,status:`fail`,summary:`.ok/${Tt} failed to parse`,detail:t}}}}}function so(e){try{return Lt(e,zt.W_OK),{writable:!0}}catch(e){return{writable:!1,reason:e instanceof Error?e.message:String(e)}}}function co(e={}){let t=e.loader??Et,n=e.probeWritable??so;return{name:`content-dir`,run:async e=>{if(!P(B(e.cwd,`.ok`,`config.yml`)))return{name:`content-dir`,status:`warn`,summary:`project not initialized`,remediation:"Run `ok init` to scaffold the project."};let r;try{let{config:n}=t(e.cwd);r=B(e.cwd,n.content.dir)}catch(e){return{name:`content-dir`,status:`fail`,summary:`content.dir unresolved (config invalid)`,detail:e instanceof Error?e.message:String(e)}}if(!P(r))return{name:`content-dir`,status:`fail`,summary:`content.dir does not exist: ${r}`,remediation:`Create the directory or fix \`content.dir\` in .ok/${Tt}.`};if(!qt(r).isDirectory())return{name:`content-dir`,status:`fail`,summary:`content.dir is not a directory: ${r}`};let i=n(r);return i.writable?{name:`content-dir`,status:`pass`,summary:`${r} (writable)`}:{name:`content-dir`,status:`fail`,summary:`content.dir is not writable: ${r}`,detail:i.reason}}}}function lo(e={}){let t=e.assert??rt;return{name:`git`,run:async()=>{try{let e=t();return{name:`git`,status:`pass`,summary:`git ${e.version} (${e.source} — ${e.resolvedPath})`}}catch(e){if(e instanceof De)return{name:`git`,status:`fail`,summary:`git not found`,remediation:e.guidance.options.map(e=>`${e.label}: ${e.command}`).join(` / `),detail:e.message};if(e instanceof pt)return{name:`git`,status:`fail`,summary:`git ${e.detected} is older than required ${e.required}`,remediation:e.guidance.options.map(e=>`${e.label}: ${e.command}`).join(` / `),detail:e.message};throw e}}}}function uo(e){let t=N(`codesign`,[`--verify`,`--deep`,`--strict`,e],{encoding:`utf-8`,timeout:5e3,env:{...process.env,LANG:`C`,LC_ALL:`C`}});return t.error?{ok:!1,stderr:t.error.message}:t.signal===`SIGTERM`?{ok:!1,stderr:`codesign probe timed out`}:{ok:t.status===0,stderr:(t.stderr??``).trim()}}function fo(e={}){let t=e.platform??process.platform,n=e.execPath??process.execPath,r=e.codesignVerify??uo;return{name:`macos-codesig`,run:async()=>{if(t!==`darwin`)return{name:`macos-codesig`,status:`pass`,summary:`skipped on ${t} (macOS-only check)`};let e=n.indexOf(`/Contents/MacOS/`);if(e===-1)return{name:`macos-codesig`,status:`pass`,summary:`dev mode (no app bundle)`};let i=n.slice(0,e);if(i.startsWith(`/private/var/folders/`))return{name:`macos-codesig`,status:`fail`,summary:`app is running translocated (quarantine sandbox)`,remediation:`Drag Open Knowledge.app to /Applications/ and re-launch.`,detail:`bundlePath: ${i}`};let a=r(i);return a.ok?{name:`macos-codesig`,status:`pass`,summary:`signed bundle at ${i}`}:{name:`macos-codesig`,status:`fail`,summary:`codesign --verify failed`,remediation:`Re-download Open Knowledge from the official releases page.`,detail:`bundlePath: ${i}\n${a.stderr}`}}}}const po=[`git`,`bun`,`config-yaml`,`content-dir`,`server-lock`,`shadow-repo`,`macos-codesig`];function mo(e){return po.includes(e)}async function ho(e,t,n={}){let r=n.timeoutMs??5e3,i,a=Math.round(r/1e3);try{let n=new Promise(t=>{i=setTimeout(()=>{t({name:e.name,status:`fail`,summary:`check timed out after ${a}s`})},r)}),o=e.run(t),s=await Promise.race([o,n]);return o.catch(()=>{}),s}catch(t){let n=t instanceof Error?t.message:String(t);return{name:e.name,status:`fail`,summary:`check crashed: ${n}`}}finally{i!==void 0&&clearTimeout(i)}}async function go(e,t,n={}){let r=[];for(let i of e)r.push(await ho(i,t,n));return r}function _o(e={}){let t=e.inspect??St;return{name:`server-lock`,run:async e=>{let n=T(e.cwd);if(!P(n))return{name:`server-lock`,status:`pass`,summary:"no server lock (no `.ok/local/` yet)"};let r=t(n,`server`);switch(r.status){case`missing`:return{name:`server-lock`,status:`pass`,summary:`no server holding the lock`};case`alive`:return{name:`server-lock`,status:`fail`,summary:`server lock held by pid ${r.lock.pid} on this host`,remediation:"Stop the other Open Knowledge process or run `ok stop`.",detail:`lockPath: ${r.lockPath}; port: ${r.lock.port}; started: ${r.lock.startedAt}`};case`foreign-host`:return{name:`server-lock`,status:`warn`,summary:`lock claimed by ${r.lock.hostname} (foreign host)`,remediation:`Run \`ok clean\` to prune the stale lock at ${B(n,`server.lock`)}.`,detail:`lockPath: ${r.lockPath}; pid: ${r.lock.pid}`};case`dead-pid`:return{name:`server-lock`,status:`warn`,summary:`stale lock for non-existent pid ${r.lock.pid}`,remediation:"Run `ok clean` to prune.",detail:`lockPath: ${r.lockPath}`};case`corrupt`:return{name:`server-lock`,status:`warn`,summary:`server.lock is corrupt (unparseable or invalid pid)`,remediation:`Delete ${r.lockPath} and rerun.`};default:return r}}}}function vo(e={}){let t=e.resolve??Ke;return{name:`shadow-repo`,run:async e=>{if(!P(B(e.cwd,`.git`)))return{name:`shadow-repo`,status:`warn`,summary:`no .git/ at project root (shadow repo not initialized)`,remediation:"Run `ok start` once to initialize the shadow repo."};let n;try{n=t(e.cwd)}catch(e){if(e instanceof lt||e instanceof Pe)return{name:`shadow-repo`,status:`fail`,summary:`cannot resolve shadow gitdir: ${e.message}`};throw e}if(!P(n))return{name:`shadow-repo`,status:`warn`,summary:`shadow repo at ${n} not yet initialized`,remediation:"Run `ok start` once to initialize the shadow repo."};let r=B(n,`HEAD`);if(!P(r))return{name:`shadow-repo`,status:`fail`,summary:`shadow repo at ${n} is missing HEAD`};let i;try{i=I(r,`utf-8`).trim()}catch(e){return{name:`shadow-repo`,status:`fail`,summary:`cannot read shadow HEAD: ${e instanceof Error?e.message:String(e)}`}}return{name:`shadow-repo`,status:`pass`,summary:`${n} (HEAD: ${i})`}}}}function yo(){return[lo(),ao(),oo(),co(),_o(),vo(),fo()]}function bo(e){switch(e){case`pass`:return J.default.green(`✓`);case`warn`:return J.default.yellow(`!`);case`fail`:return J.default.red(`✗`)}}function xo(e,t){let n=[`[${bo(e.status)}] ${e.name}: ${e.summary}`];if(e.remediation!==void 0&&e.status!==`pass`&&n.push(` → ${e.remediation}`),t&&e.detail!==void 0)for(let t of e.detail.split(`
30
+ `))n.push(` ${J.default.dim(t)}`);return n}function So(e){let t=e.filter(e=>e.status===`fail`).length,n=e.filter(e=>e.status===`warn`).length;if(t===0&&n===0)return`All checks passed`;let r=[];return t>0&&r.push(`${t} error${t===1?``:`s`}`),n>0&&r.push(`${n} warning${n===1?``:`s`}`),r.join(`, `)}async function Co(e,t={}){let n=t.checks??yo(),r=t.stdout??(e=>console.log(e)),i=t.stderr??(e=>console.error(e)),a=e.quiet??!1,o=e.json??!1,s=e.verbose??!1,c;if(e.check!==void 0){if(!mo(e.check))return i(J.default.red(`unknown check '${e.check}'. Valid: ${po.join(`, `)}`)),2;let t=e.check,r=n.find(e=>e.name===t);if(!r)return i(J.default.red(`internal error: check '${e.check}' not registered`)),2;c=[r]}else c=[...n];let l={cwd:e.cwd},u=await go(c,l,t.timeoutMs===void 0?{}:{timeoutMs:t.timeoutMs});if(!a)if(o)for(let e of u)r(JSON.stringify(e));else{for(let e of u)for(let t of xo(e,s))r(t);r(``),r(So(u))}return u.some(e=>e.status===`fail`)?1:0}function wo(){return new t(`health`).description(`Run environment health checks (${po.join(`, `)})`).option(`--json`,`Emit NDJSON (one CheckResult per line)`).option(`--verbose`,`Include detail field + probe context in human-readable output`).option(`--check <name>`,`Run only the named check. One of: ${po.join(`, `)}`).option(`--quiet`,`Suppress output; exit code only`).action(async e=>{let t=await Co({cwd:process.cwd(),json:e.json,verbose:e.verbose,check:e.check,quiet:e.quiet});process.exit(t)})}function To(e){let t=N(`ps`,[`-p`,String(e),`-o`,`%cpu=,%mem=,rss=,vsz=`],{encoding:`utf-8`,timeout:2e3});if(t.error||!t.stdout?.trim())return null;let[n,r,i,a]=t.stdout.trim().split(/\s+/),o=Number.parseFloat(n??``),s=Number.parseFloat(r??``),c=Number.parseInt(i??``,10),l=Number.parseInt(a??``,10);return Number.isNaN(o)||Number.isNaN(s)||Number.isNaN(c)||Number.isNaN(l)?null:{ts:new Date().toISOString(),pid:e,cpuPercent:o,memPercent:s,rssKb:c,vszKb:l}}function Eo(e){let t=N(`lsof`,[`-p`,String(e)],{encoding:`utf-8`,timeout:5e3});return t.error||!t.stdout?null:t.stdout}function Do(e){let t=[];for(let n of e.split(`
31
+ `)){let e=n.match(/127\.0\.0\.1:(\d+)\s*\(LISTEN\)/);if(e){let n=Number.parseInt(e[1]??``,10);Number.isNaN(n)||t.push(n)}}return t}function Oo(e){let t=N(`curl`,[`-s`,`--max-time`,`2`,`http://127.0.0.1:${e}/json/list`],{encoding:`utf-8`,timeout:3e3});if(t.error||!t.stdout?.trim())return null;try{let e=JSON.parse(t.stdout);return Array.isArray(e)?e:null}catch{return null}}function ko(e,t,n){let r=z(Ht(z(on(),`ok-cdp-`)),`profiler.mjs`);return L(r,`import { writeFileSync } from 'node:fs';
33
32
  const ws = new WebSocket(${JSON.stringify(e)});
34
33
  let id = 0;
35
34
  const send = (m) => ws.send(JSON.stringify({ id: ++id, method: m }));
@@ -48,42 +47,42 @@ ws.addEventListener('message', ({ data }) => {
48
47
  ws.addEventListener('close', () => process.exit(0));
49
48
  ws.addEventListener('error', () => process.exit(1));
50
49
  setTimeout(() => process.exit(2), ${t+1e4});
51
- `),r}async function ko(e,t,n,r,i){let a=Oo(e,t,z(r,`cpu.cpuprofile`)),o=!1,s=M(process.execPath,[a],{stdio:`ignore`}),c=setInterval(()=>{let e=wo(n);e&&i(e)},1e3);await new Promise(e=>{s.once(`close`,t=>{o=t===0,e()}),setTimeout(()=>{s.kill(),e()},t+12e3)}),clearInterval(c);try{Kt(z(a,`..`),{recursive:!0,force:!0})}catch{}return o}function Ao(e){let t;try{t=JSON.parse(e)}catch{return`(could not parse profile)`}let n=new Map(t.nodes.map(e=>[e.id,e])),r=new Map;for(let e of t.nodes)for(let t of e.children??[])r.set(t,e.id);let i=new Map;for(let e of t.samples??[])i.set(e,(i.get(e)??0)+1);let a=t.samples?.length??0,o=t.endTime!=null&&t.startTime!=null?((t.endTime-t.startTime)/1e3).toFixed(2):`?`,s=[...i.entries()].sort((e,t)=>t[1]-e[1]).slice(0,10),c=[`samples ${a} duration_ms ${o}`,``,`Top leaf nodes`];for(let[e,t]of s){let r=n.get(e);if(!r)continue;let i=a>0?(t/a*100).toFixed(1):`0.0`,{functionName:o,url:s,lineNumber:l,columnNumber:u}=r.callFrame;c.push(` ${t} ${i}% id=${e} ${o||`(anonymous)`} ${s}:${l}:${u} hit=${r.hitCount??0}`)}c.push(``,`Top stacks`);let l=e=>{let t=[],i=e;for(;i!=null;){let e=n.get(i);if(!e)break;let{functionName:a,url:o,lineNumber:s,columnNumber:c}=e.callFrame;t.unshift(` ${a||`(anonymous)`} ${o} ${s} ${c}`),i=r.get(i)}return t};for(let[e,t]of s.slice(0,5)){let n=a>0?(t/a*100).toFixed(1):`0.0`;c.push(``,`--- ${t} ${n}%`,...l(e))}return c.join(`
52
- `)}async function jo(e,t={}){let{pid:n,cpuProfileSecs:r=15,noInspector:i=!1}=e,a=t.log??(e=>console.log(e)),o=t.discover??xt,s=t.inspect??St,c=t.resolveCommand??Ct,l=t.resolveUsage??vt,u=t.collectLsofFn??To,d=t.getEndpoints??Do,f=t.profiler??ko,p=t.isAlive??(e=>{try{return process.kill(e,0),!0}catch(e){return e.code===`EPERM`}}),m=t.sendSignal??((e,t)=>{process.kill(e,t)}),h=t.sleep??(e=>new Promise(t=>setTimeout(t,e))),g=r*1e3;if(!p(n)){a(J.default.red(`No process with pid ${n} found.`));return}let _=await o(),v=null,y=null;for(let e of _){let t=s(e,`server`);if(t.status!==`missing`&&t.status!==`corrupt`&&t.lock.pid===n){v=t.lock.worktreeRoot,y={lockDir:e,state:t.status,lockPath:t.lockPath,lock:t.lock};break}}let b=new Date().toISOString().replace(/[:.]/g,`-`),x=e.output?e.output:v?z(v,`.ok`,`local`,`diagnostics`,`process-${n}-${b}`):z(process.cwd(),`ok-diagnose-${n}-${b}`);try{F(x,{recursive:!0})}catch(e){a(J.default.red(`Cannot create output directory ${x}: ${e.message}`));return}a(J.default.bold(`Diagnosing pid ${n}`)),a(`Output: ${x}`),a(``);let S=(e,t)=>{L(z(x,e),t),a(` wrote ${e}`)},ee=c(n),te=l(n);S(`metadata.json`,JSON.stringify({capturedAt:new Date().toISOString(),pid:n,command:ee,usage:te,lockInfo:y},null,2)),a(` sampling lsof`);let C=u(n);if(C&&S(`lsof.txt`,C),!i){let e=C?Eo(C).find(e=>e>=9229&&e<=9299)??9229:9229,t=d(e);if(!t||t.length===0){a(` no inspector on :${e}, sending SIGUSR1 to pid ${n}`);try{m(n,`SIGUSR1`),await h(2e3),t=d(e)}catch(e){a(J.default.yellow(` SIGUSR1 delivery failed: ${e.message}`))}}if(t&&t.length>0){S(`inspector-endpoints.json`,JSON.stringify(t,null,2));let e=t[0].webSocketDebuggerUrl;if(e){a(` capturing ${r}s CPU profile`);let t=[];await f(e,g,n,x,e=>t.push(e))?a(` wrote cpu.cpuprofile`):a(J.default.yellow(` CPU profile capture failed`)),t.length>0&&S(`process-stats.jsonl`,`${t.map(e=>JSON.stringify(e)).join(`
53
- `)}\n`);try{S(`stacks.txt`,Ao(I(z(x,`cpu.cpuprofile`),`utf-8`)))}catch(e){a(J.default.yellow(` stacks.txt skipped: ${e.message}`))}}}else a(J.default.yellow(` Node inspector unavailable — skipping CPU profile`))}a(``),a(J.default.yellow(`⚠ Before sharing, review what each file contains:`)),a(` metadata.json — content directory paths, lock file locations, CPU/MEM at capture time`),a(` lsof.txt — all open files, network connections, and private paths for this process`),a(` inspector-endpoints.json — Node debugger metadata (titles, URLs)`),a(` cpu.cpuprofile — function names and source file paths from your Node process`),a(` stacks.txt — call stacks derived from cpu.cpuprofile; includes source paths`),a(` process-stats.jsonl — CPU/MEM/RSS numbers only; safe to share`),a(``),a(`Bundle: ${J.default.bold(x)}`)}async function Mo(e){let t=yn({input:process.stdin,output:process.stdout});try{return(await t.question(e)).trim()}finally{t.close()}}async function No(e){let t=Ht(z(on(),`ok-bundle-process-`));return await jo({pid:e,output:t}),t}function Po(e){if(e<1024)return`${e} B`;let t=e/1024;if(t<1024)return`${t.toFixed(1)} KB`;let n=t/1024;return n<1024?`${n.toFixed(1)} MB`:`${(n/1024).toFixed(1)} GB`}function Fo(e){let t=e.trim().toLowerCase();return t===`y`||t===`yes`}function Io(e,t,n){let{summary:r,manifest:i}=t;e(``),e(J.default.bold(`ok diagnose bundle — content summary`)),e(``),e(` Files: ${r.fileCount}`),e(` Total size: ${Po(r.totalBytes)} uncompressed`),e(` doc.name attributes: ${r.docNameCount} occurrence(s) in telemetry${r.redacted?` (values hashed)`:``}`),e(` Content-dir path: ${r.contentDirVisible?`visible (${i.contentDir.absolutePath})`:`not visible`}`),e(` Redacted: ${r.redacted?`yes`:`no`}`),e(` Server status: ${i.serverStatus}`),e(` Output: ${n}`),e(``)}async function Lo(e,t={}){let n=t.log??(e=>console.log(e)),r=t.prompt??Mo,i=t.runProcessDiagnose??No,a=t.now??(()=>new Date),o;if(e.out!==void 0){o=e.out;let t=Xt(o);if(!P(t))throw Error(`ok diagnose bundle: --out parent directory does not exist: ${t}. Create it first.`)}else{let t=a().toISOString().replace(/[:.]/g,`-`),n=z(e.contentDir,`.ok`,`local`,`diagnostics`);F(n,{recursive:!0}),o=z(n,`bundle-${t}.zip`)}let s;e.pid!==void 0&&(n(J.default.dim(`Running ok diagnose process ${e.pid} into a temp dir`)),s=await i(e.pid));let c=await to({contentDir:e.contentDir,projectDir:e.projectDir,processDir:s,redact:e.redact===!0,deps:t.collectDeps});try{return c.manifest.serverStatus===`not-running`&&n(J.default.yellow(` server not running — live state unavailable`)),Io(n,c,o),e.yes!==!0&&!Fo(await r(`Write bundle? [y/N]: `))?(n(J.default.dim(`Aborted; no bundle written.`)),{outputPath:null,declined:!0}):(await no({collected:c,outputPath:o}),n(J.default.bold(`Bundle: ${o}`)),{outputPath:o,declined:!1})}finally{if(c.cleanup(),s!==void 0)try{Kt(s,{recursive:!0,force:!0})}catch{}}}function Ro(){let e=new t(`diagnose`).description(`Diagnostic utilities for open-knowledge processes`);return e.command(`process`).description(`Capture a diagnostic bundle (metadata, lsof, CPU profile) for a running process`).argument(`<pid>`,`Process ID to diagnose`).option(`--cpu-profile <seconds>`,`CPU profile duration (default: 15)`,`15`).option(`--output <dir>`,`Output directory`).option(`--no-inspector`,`Collect metadata only; skip Node inspector and CPU profile`).action(async(e,t)=>{let n=Number.parseInt(e,10);(Number.isNaN(n)||n<=0)&&(console.error(J.default.red(`Invalid pid '${e}': must be a positive integer`)),process.exit(1));let r=Number.parseInt(t.cpuProfile,10);(Number.isNaN(r)||r<=0)&&(console.error(J.default.red(`--cpu-profile must be a positive integer`)),process.exit(1)),await jo({pid:n,cpuProfileSecs:r,output:t.output,noInspector:!t.inspector})}),e.addCommand(Co()),e.command(`bundle`).description(`Capture a support bundle (telemetry + logs + server state) into a zip suitable for bug reports`).option(`--pid <pid>`,"Include `ok diagnose process <pid>` output under process/ in the bundle").option(`--out <path>`,`Write the zip to this path instead of the default location`).option(`--yes`,`Skip the y/N prompt`).option(`--redact`,`Hash doc names and strip the content-dir prefix from the staged bundle`).action(async e=>{let t;e.pid!==void 0&&(t=Number.parseInt(e.pid,10),(Number.isNaN(t)||t<=0)&&(console.error(J.default.red(`Invalid --pid '${e.pid}': must be a positive integer`)),process.exit(1)));try{let{loadConfig:n}=await import(`./loader-DznbAjEH.mjs`),{resolveContentDir:r}=await import(`./dist-CaLi0vY9.mjs`),i=process.cwd(),{config:a}=n(i);await Lo({contentDir:r(a,i),projectDir:i,pid:t,out:e.out,yes:e.yes===!0,redact:e.redact===!0})}catch(e){let t=e instanceof Error?e.message:String(e);console.error(J.default.red(t)),process.exit(1)}}),e}async function zo(){if(!process.stdin.isTTY){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString(`utf-8`).trim()}return(await Dr({message:`Enter embeddings API key:`})).trim()}function Bo(e){return nt(e)}async function Vo(){return(await ot()).file?{present:!0,source:`file`}:process.env.OK_EMBEDDINGS_API_KEY?{present:!0,source:`env`}:{present:!1,source:null}}async function Ho(e){try{let t=m(T(e));if(!t||t.port<=0||!y(t.pid))return null;let n=await fetch(`http://127.0.0.1:${t.port}/api/semantic-status`,{signal:AbortSignal.timeout(1500)});if(!n.ok)return null;let r=await n.json();return typeof r.embedded!=`number`||typeof r.total!=`number`?null:{embedded:r.embedded,total:r.total}}catch{return null}}function Uo(){return new t(`set-key`).description(`Store the embeddings provider API key in ~/.ok/secrets.yml`).action(async()=>{let e=await zo();if(!e){process.stderr.write(`No key provided.
50
+ `),r}async function Ao(e,t,n,r,i){let a=ko(e,t,z(r,`cpu.cpuprofile`)),o=!1,s=M(process.execPath,[a],{stdio:`ignore`}),c=setInterval(()=>{let e=To(n);e&&i(e)},1e3);await new Promise(e=>{s.once(`close`,t=>{o=t===0,e()}),setTimeout(()=>{s.kill(),e()},t+12e3)}),clearInterval(c);try{Kt(z(a,`..`),{recursive:!0,force:!0})}catch{}return o}function jo(e){let t;try{t=JSON.parse(e)}catch{return`(could not parse profile)`}let n=new Map(t.nodes.map(e=>[e.id,e])),r=new Map;for(let e of t.nodes)for(let t of e.children??[])r.set(t,e.id);let i=new Map;for(let e of t.samples??[])i.set(e,(i.get(e)??0)+1);let a=t.samples?.length??0,o=t.endTime!=null&&t.startTime!=null?((t.endTime-t.startTime)/1e3).toFixed(2):`?`,s=[...i.entries()].sort((e,t)=>t[1]-e[1]).slice(0,10),c=[`samples ${a} duration_ms ${o}`,``,`Top leaf nodes`];for(let[e,t]of s){let r=n.get(e);if(!r)continue;let i=a>0?(t/a*100).toFixed(1):`0.0`,{functionName:o,url:s,lineNumber:l,columnNumber:u}=r.callFrame;c.push(` ${t} ${i}% id=${e} ${o||`(anonymous)`} ${s}:${l}:${u} hit=${r.hitCount??0}`)}c.push(``,`Top stacks`);let l=e=>{let t=[],i=e;for(;i!=null;){let e=n.get(i);if(!e)break;let{functionName:a,url:o,lineNumber:s,columnNumber:c}=e.callFrame;t.unshift(` ${a||`(anonymous)`} ${o} ${s} ${c}`),i=r.get(i)}return t};for(let[e,t]of s.slice(0,5)){let n=a>0?(t/a*100).toFixed(1):`0.0`;c.push(``,`--- ${t} ${n}%`,...l(e))}return c.join(`
51
+ `)}async function Mo(e,t={}){let{pid:n,cpuProfileSecs:r=15,noInspector:i=!1}=e,a=t.log??(e=>console.log(e)),o=t.discover??xt,s=t.inspect??St,c=t.resolveCommand??Ct,l=t.resolveUsage??vt,u=t.collectLsofFn??Eo,d=t.getEndpoints??Oo,f=t.profiler??Ao,p=t.isAlive??(e=>{try{return process.kill(e,0),!0}catch(e){return e.code===`EPERM`}}),m=t.sendSignal??((e,t)=>{process.kill(e,t)}),h=t.sleep??(e=>new Promise(t=>setTimeout(t,e))),g=r*1e3;if(!p(n)){a(J.default.red(`No process with pid ${n} found.`));return}let _=await o(),v=null,y=null;for(let e of _){let t=s(e,`server`);if(t.status!==`missing`&&t.status!==`corrupt`&&t.lock.pid===n){v=t.lock.worktreeRoot,y={lockDir:e,state:t.status,lockPath:t.lockPath,lock:t.lock};break}}let b=new Date().toISOString().replace(/[:.]/g,`-`),x=e.output?e.output:v?z(v,`.ok`,`local`,`diagnostics`,`process-${n}-${b}`):z(process.cwd(),`ok-diagnose-${n}-${b}`);try{F(x,{recursive:!0})}catch(e){a(J.default.red(`Cannot create output directory ${x}: ${e.message}`));return}a(J.default.bold(`Diagnosing pid ${n}`)),a(`Output: ${x}`),a(``);let S=(e,t)=>{L(z(x,e),t),a(` wrote ${e}`)},ee=c(n),te=l(n);S(`metadata.json`,JSON.stringify({capturedAt:new Date().toISOString(),pid:n,command:ee,usage:te,lockInfo:y},null,2)),a(` sampling lsof`);let C=u(n);if(C&&S(`lsof.txt`,C),!i){let e=C?Do(C).find(e=>e>=9229&&e<=9299)??9229:9229,t=d(e);if(!t||t.length===0){a(` no inspector on :${e}, sending SIGUSR1 to pid ${n}`);try{m(n,`SIGUSR1`),await h(2e3),t=d(e)}catch(e){a(J.default.yellow(` SIGUSR1 delivery failed: ${e.message}`))}}if(t&&t.length>0){S(`inspector-endpoints.json`,JSON.stringify(t,null,2));let e=t[0].webSocketDebuggerUrl;if(e){a(` capturing ${r}s CPU profile`);let t=[];await f(e,g,n,x,e=>t.push(e))?a(` wrote cpu.cpuprofile`):a(J.default.yellow(` CPU profile capture failed`)),t.length>0&&S(`process-stats.jsonl`,`${t.map(e=>JSON.stringify(e)).join(`
52
+ `)}\n`);try{S(`stacks.txt`,jo(I(z(x,`cpu.cpuprofile`),`utf-8`)))}catch(e){a(J.default.yellow(` stacks.txt skipped: ${e.message}`))}}}else a(J.default.yellow(` Node inspector unavailable — skipping CPU profile`))}a(``),a(J.default.yellow(`⚠ Before sharing, review what each file contains:`)),a(` metadata.json — content directory paths, lock file locations, CPU/MEM at capture time`),a(` lsof.txt — all open files, network connections, and private paths for this process`),a(` inspector-endpoints.json — Node debugger metadata (titles, URLs)`),a(` cpu.cpuprofile — function names and source file paths from your Node process`),a(` stacks.txt — call stacks derived from cpu.cpuprofile; includes source paths`),a(` process-stats.jsonl — CPU/MEM/RSS numbers only; safe to share`),a(``),a(`Bundle: ${J.default.bold(x)}`)}async function No(e){let t=yn({input:process.stdin,output:process.stdout});try{return(await t.question(e)).trim()}finally{t.close()}}async function Po(e){let t=Ht(z(on(),`ok-bundle-process-`));return await Mo({pid:e,output:t}),t}function Fo(e){if(e<1024)return`${e} B`;let t=e/1024;if(t<1024)return`${t.toFixed(1)} KB`;let n=t/1024;return n<1024?`${n.toFixed(1)} MB`:`${(n/1024).toFixed(1)} GB`}function Io(e){let t=e.trim().toLowerCase();return t===`y`||t===`yes`}function Lo(e,t,n){let{summary:r,manifest:i}=t;e(``),e(J.default.bold(`ok diagnose bundle — content summary`)),e(``),e(` Files: ${r.fileCount}`),e(` Total size: ${Fo(r.totalBytes)} uncompressed`),e(` doc.name attributes: ${r.docNameCount} occurrence(s) in telemetry${r.redacted?` (values hashed)`:``}`),e(` Content-dir path: ${r.contentDirVisible?`visible (${i.contentDir.absolutePath})`:`not visible`}`),e(` Redacted: ${r.redacted?`yes`:`no`}`),e(` Server status: ${i.serverStatus}`),e(` Output: ${n}`),e(``)}async function Ro(e,t={}){let n=t.log??(e=>console.log(e)),r=t.prompt??No,i=t.runProcessDiagnose??Po,a=t.now??(()=>new Date),o;if(e.out!==void 0){o=e.out;let t=Xt(o);if(!P(t))throw Error(`ok diagnose bundle: --out parent directory does not exist: ${t}. Create it first.`)}else{let t=a().toISOString().replace(/[:.]/g,`-`),n=z(e.contentDir,`.ok`,`local`,`diagnostics`);F(n,{recursive:!0}),o=z(n,`bundle-${t}.zip`)}let s;e.pid!==void 0&&(n(J.default.dim(`Running ok diagnose process ${e.pid} into a temp dir`)),s=await i(e.pid));let c=await no({contentDir:e.contentDir,projectDir:e.projectDir,processDir:s,redact:e.redact===!0,deps:t.collectDeps});try{return c.manifest.serverStatus===`not-running`&&n(J.default.yellow(` server not running — live state unavailable`)),Lo(n,c,o),e.yes!==!0&&!Io(await r(`Write bundle? [y/N]: `))?(n(J.default.dim(`Aborted; no bundle written.`)),{outputPath:null,declined:!0}):(await ro({collected:c,outputPath:o}),n(J.default.bold(`Bundle: ${o}`)),{outputPath:o,declined:!1})}finally{if(c.cleanup(),s!==void 0)try{Kt(s,{recursive:!0,force:!0})}catch{}}}function zo(){let e=new t(`diagnose`).description(`Diagnostic utilities for open-knowledge processes`);return e.command(`process`).description(`Capture a diagnostic bundle (metadata, lsof, CPU profile) for a running process`).argument(`<pid>`,`Process ID to diagnose`).option(`--cpu-profile <seconds>`,`CPU profile duration (default: 15)`,`15`).option(`--output <dir>`,`Output directory`).option(`--no-inspector`,`Collect metadata only; skip Node inspector and CPU profile`).action(async(e,t)=>{let n=Number.parseInt(e,10);(Number.isNaN(n)||n<=0)&&(console.error(J.default.red(`Invalid pid '${e}': must be a positive integer`)),process.exit(1));let r=Number.parseInt(t.cpuProfile,10);(Number.isNaN(r)||r<=0)&&(console.error(J.default.red(`--cpu-profile must be a positive integer`)),process.exit(1)),await Mo({pid:n,cpuProfileSecs:r,output:t.output,noInspector:!t.inspector})}),e.addCommand(wo()),e.command(`bundle`).description(`Capture a support bundle (telemetry + logs + server state) into a zip suitable for bug reports`).option(`--pid <pid>`,"Include `ok diagnose process <pid>` output under process/ in the bundle").option(`--out <path>`,`Write the zip to this path instead of the default location`).option(`--yes`,`Skip the y/N prompt`).option(`--redact`,`Hash doc names and strip the content-dir prefix from the staged bundle`).action(async e=>{let t;e.pid!==void 0&&(t=Number.parseInt(e.pid,10),(Number.isNaN(t)||t<=0)&&(console.error(J.default.red(`Invalid --pid '${e.pid}': must be a positive integer`)),process.exit(1)));try{let{loadConfig:n}=await import(`./loader-DaI1oEpk.mjs`),{resolveContentDir:r}=await import(`./dist-CaLi0vY9.mjs`),i=process.cwd(),{config:a}=n(i);await Ro({contentDir:r(a,i),projectDir:i,pid:t,out:e.out,yes:e.yes===!0,redact:e.redact===!0})}catch(e){let t=e instanceof Error?e.message:String(e);console.error(J.default.red(t)),process.exit(1)}}),e}async function Bo(){if(!process.stdin.isTTY){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString(`utf-8`).trim()}return(await Dr({message:`Enter embeddings API key:`})).trim()}function Vo(e){return nt(e)}async function Ho(){return(await ot()).file?{present:!0,source:`file`}:process.env.OK_EMBEDDINGS_API_KEY?{present:!0,source:`env`}:{present:!1,source:null}}async function Uo(e){try{let t=m(T(e));if(!t||t.port<=0||!y(t.pid))return null;let n=await fetch(`http://127.0.0.1:${t.port}/api/semantic-status`,{signal:AbortSignal.timeout(1500)});if(!n.ok)return null;let r=await n.json();return typeof r.embedded!=`number`||typeof r.total!=`number`?null:{embedded:r.embedded,total:r.total}}catch{return null}}function Wo(){return new t(`set-key`).description(`Store the embeddings provider API key in ~/.ok/secrets.yml`).action(async()=>{let e=await Bo();if(!e){process.stderr.write(`No key provided.
54
53
  `),process.exitCode=1;return}await We().set(e),process.stderr.write(`✓ Embeddings API key stored in ~/.ok/secrets.yml (0600, this machine only).
55
54
  Now enable it per project — the easiest path is OK Desktop → Settings → This
56
55
  project → Search (a toggle with an egress-confirmation prompt), or run
57
56
  \`ok embeddings enable\` in the project folder.
58
- `)})}function Wo(){return new t(`clear-key`).description(`Remove the stored embeddings provider API key`).action(async()=>{let{touched:e}=await at();if(e.length===0){process.stderr.write(`No stored embeddings key found.
59
- `);return}process.stderr.write(`✓ Embeddings API key cleared (${e.join(`, `)}).\n`)})}function Go(e,n){return new t(e).description(`Turn semantic search ${n?`on`:`off`} for this project (project-local)`).option(`--cwd <path>`,`Project directory (defaults to the current directory)`).action(async t=>{let r=B(t.cwd??process.cwd()),i=await Me({cwd:r,scope:`project-local`,patch:{search:{semantic:{enabled:n}}}});if(!i.ok){process.stderr.write(`Failed to ${e} semantic search — ${c(i.error)}\n`),process.exitCode=1;return}if(process.stderr.write(`✓ Semantic search ${n?`enabled`:`disabled`} for ${r}\n`),n){let{present:e}=await Vo();e||process.stderr.write(" Note: no API key set yet — run `ok embeddings set-key`. Until then, search stays lexical.\n")}})}function Ko(){return new t(`status`).description(`Show semantic-search capability: key presence, enabled, coverage, provider`).option(`--cwd <path>`,`Project directory (defaults to the current directory)`).option(`--json`,`Output JSON`,!1).action(async e=>{let t=B(e.cwd??process.cwd()),n=Bo(t),{present:r,source:i}=await Vo(),a=n.enabled&&r,o=a?await Ho(t):null;if(e.json){process.stdout.write(`${JSON.stringify({project:t,machine:{keyPresent:r,keySource:i},project_config:{enabled:n.enabled,capable:a,coverage:o?{embedded:o.embedded,total:o.total}:null,provider:{baseUrl:n.baseUrl,model:n.model,dimensions:n.dimensions??null}}})}\n`);return}let s=r?`set — ${i===`env`?`environment (${Ye})`:`~/.ok/secrets.yml`}`:`not set`,c=a?o?`${o.embedded} / ${o.total} pages embedded`:`server not running — start it to index (or it has not embedded yet)`:null,l=[`Semantic search`,` project: ${t}`,``,` This machine (all projects):`,` API key: ${s}`,``,` This project:`,` enabled: ${n.enabled?`yes`:`no`}`,` capability: ${a?`AVAILABLE`:`unavailable (search stays lexical)`}`,...c?[` coverage: ${c}`]:[],` provider: ${n.baseUrl}`,` model: ${n.model}`,` dimensions: ${n.dimensions??`native (1536)`}`],u=[];r||u.push(`Set a key: ok embeddings set-key (or export ${Ye})`),n.enabled||u.push(`Enable it: ok embeddings enable (in this project folder)`),u.length>0&&l.push(``,...u.map(e=>` ${e}`)),process.stdout.write(`${l.join(`
60
- `)}\n`)})}function qo(){return new t(`embeddings`).description(`Manage the semantic-search embeddings provider key + status`).addCommand(Uo()).addCommand(Wo()).addCommand(Go(`enable`,!0)).addCommand(Go(`disable`,!1)).addCommand(Ko())}const Jo=[` 1. ${j(`Customize`)} (sidebar) → ${j(`Skills`)}`,` 2. Click the ${j(`+`)} button`,` 3. Click ${j(`Create skill`)}`,` 4. Click ${j(`Upload skill`)}`,` 5. Pick ${j(`openknowledge.skill`)} from Downloads`],Yo=E(` Open the Claude Desktop App, then: ${j(`Customize → Skills → + → Create skill → Upload skill`)} → pick the file.`);function Xo(e){let t=[O(`Built ${e.outputPath}`),D(` ${e.size} bytes • sha256 ${e.sha256?.slice(0,12)}…`)];return e.handoffError&&t.push(A(` Handoff failed: ${e.handoffError.message}`)),t.push(Yo),t.join(`
61
- `)}function Zo(e){let t=e.skillVersion??`unknown`,n=e.recordedAt??`unknown`;return[E(`Open Knowledge skill ${j(`v${t}`)} already delivered to Claude Desktop.`),D(` Recorded at ${n} in ~/.ok/skill-state.yml`),D(` Use ${j(`--force`)} to rebuild and re-open the install dialog.`)].join(`
62
- `)}function Qo(e){let t=e.skillVersion?` • Skill v${e.skillVersion}`:``;return[O(`Built ${e.outputPath}`),D(` ${e.size} bytes • sha256 ${e.sha256?.slice(0,12)}…${t}`),E(` Claude Desktop App opened. Now upload the file manually:`),...Jo,D(` If Claude Desktop didn't open, open it and start at step 1. The file is at ${e.outputPath}`)].join(`
63
- `)}function $o(e){return`${k(`Error:`)} ${e.buildError??`unknown build failure`}`}async function es(e={}){let t=await Xe(e);return t.status===`failed`?{...t,message:$o(t),exitCode:1}:t.status===`skip-current`?{...t,message:Zo(t),exitCode:0}:t.status===`installed`?{...t,message:Qo(t),exitCode:0}:{...t,message:Xo(t),exitCode:0}}function ts(){return new t(`install-skill`).description("Build openknowledge.skill and open the Claude Desktop App so you can upload it for Claude Chat & Cowork. Not needed for Claude — `ok init` covers that separately.").option(`--out <path>`,`Custom output path (default: ~/Downloads/openknowledge.skill)`).option(`--no-open`,`Build the file but skip the OS file-association handoff`).option(`--force`,`Bypass the install-state gate and rebuild unconditionally`).action(async e=>{let t=await es({out:e.out,noOpen:!e.open,force:e.force??!1});process.stdout.write(`${t.message}\n`),t.exitCode!==0&&process.exit(t.exitCode)})}const ns=z(`Contents`,`Resources`,`cli`,`bin`,`ok.sh`),rs=/Contents\/Resources\/cli\/dist\/cli\.mjs$/;function is(e,t,n){return e===`darwin`?[z(t,`Applications`,`Open Knowledge.app`,ns),z(`/Applications`,`Open Knowledge.app`,ns)].find(e=>n.existsSync(e))??null:null}function as(e,t,n){if(n!==`darwin`)return{proxy:!1,suppressedBy:`platform`};let r=e.OK_BUNDLE_PROXY?.toLowerCase();return r===`0`||r===`false`?{proxy:!1,suppressedBy:`env`}:t.includes(`--no-bundle-proxy`)?{proxy:!1,suppressedBy:`flag`}:typeof t[1]==`string`&&rs.test(t[1])?{proxy:!1,suppressedBy:`self`}:{proxy:!0,suppressedBy:null}}function os(e){e.stderr.write(`${JSON.stringify({event:`mcp-bundle-proxy`,mode:e.mode,bundlePath:e.bundlePath,reason:e.reason,hint:`Suppress with --no-bundle-proxy or OK_BUNDLE_PROXY=0.`})}\n`)}function ss(e){os({stderr:e.stderr,mode:`bundled`,bundlePath:e.bundlePath,reason:null});let t=e.spawnImpl??M,n=e.exitProcess??(e=>process.exit(e)),r=e.now??(()=>Date.now()),i=r(),a=e.startupFailureWindowMs??1e3;return new Promise((o,s)=>{let c=t(e.bundlePath,e.argv.filter(e=>e!==`--no-bundle-proxy`),{env:{...e.env,OK_BUNDLE_PROXY:`0`},stdio:`inherit`}),l=e=>{c.kill(e)},u=()=>{process.off(`SIGTERM`,l),process.off(`SIGINT`,l)};process.on(`SIGTERM`,l),process.on(`SIGINT`,l),c.once(`error`,e=>{u(),s(e)}),c.once(`exit`,(e,t)=>{if(u(),t){s(Error(`bundle process exited by signal ${t}`));return}let o=e??0,c=r()-i;if(o!==0&&c<=a){s(Error(`bundle process exited during startup with code ${o}`));return}n(o)})})}function cs(e){let t=e.scheduler??{setTimeout:(e,t)=>globalThis.setTimeout(e,t),clearTimeout:e=>globalThis.clearTimeout(e)},n=e.initialBackoffMs??1e3,r=e.maxBackoffMs??3e4,i=e.rng??Math.random,a=e.createWebSocket??(e=>new WebSocket(e)),o=e.logger??null,s=e.log,c=null,l=null,u=!1,d=n;function f(e,t,n){try{o?o[e](t,n):s?.(t)}catch{}}function p(){if(u)return;l!==null&&t.clearTimeout(l);let e=d;d=Math.min(d*2,r);let n=i(),a=Math.max(1,Math.floor(e*(1-n/2)));f(`debug`,`scheduling reconnect`,{backoffMs:a,ceilMs:e}),l=t.setTimeout(()=>{l=null,m().catch(e=>f(`warn`,`reconnect failed`,{error:String(e)}))},a)}async function m(){if(u)return;let t;try{t=await e.resolveWsUrl()}catch(e){f(`warn`,`resolveWsUrl threw`,{error:String(e)}),p();return}if(!t){p();return}let r=e.connectionId?`&connectionId=${encodeURIComponent(e.connectionId)}`:``,i=e.connectionId&&e.displayName!==void 0&&e.clientName!==void 0&&e.colorSeed!==void 0?`&displayName=${encodeURIComponent(e.displayName)}&clientName=${encodeURIComponent(e.clientName)}&colorSeed=${encodeURIComponent(e.colorSeed)}`:``,o=`${t}/collab/keepalive?pid=${process.pid}${r}${i}`;try{c=a(o)}catch(e){f(`warn`,`WebSocket constructor failed`,{url:o,error:String(e)}),c=null,p();return}c.addEventListener(`open`,()=>{f(`info`,`connected`,{url:t}),d=n}),c.addEventListener(`close`,()=>{u||(f(`info`,`disconnected`,{url:t}),c=null,p())}),c.addEventListener(`error`,()=>{f(`debug`,`websocket error observed`,{url:t,readyState:c?.readyState,reason:`error-event`})})}return queueMicrotask(()=>{m().catch(e=>f(`warn`,`initial connect failed`,{error:String(e)}))}),{close:()=>{if(!u&&(u=!0,l!==null&&(t.clearTimeout(l),l=null),c)){try{c.close()}catch{}c=null}},isConnected:()=>c!==null&&c.readyState===1}}var ls=class{append(e){this._buffer=this._buffer?Buffer.concat([this._buffer,e]):e}readMessage(){if(!this._buffer)return null;let e=this._buffer.indexOf(`
64
- `);if(e===-1)return null;let t=this._buffer.toString(`utf8`,0,e).replace(/\r$/,``);return this._buffer=this._buffer.subarray(e+1),us(t)}clear(){this._buffer=void 0}};function us(e){return Ne.parse(JSON.parse(e))}function ds(e){return JSON.stringify(e)+`
65
- `}var fs=class{constructor(e=$t.stdin,t=$t.stdout){this._stdin=e,this._stdout=t,this._readBuffer=new ls,this._started=!1,this._ondata=e=>{this._readBuffer.append(e),this.processReadBuffer()},this._onerror=e=>{this.onerror?.(e)}}async start(){if(this._started)throw Error(`StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.`);this._started=!0,this._stdin.on(`data`,this._ondata),this._stdin.on(`error`,this._onerror)}processReadBuffer(){for(;;)try{let e=this._readBuffer.readMessage();if(e===null)break;this.onmessage?.(e)}catch(e){this.onerror?.(e)}}async close(){this._stdin.off(`data`,this._ondata),this._stdin.off(`error`,this._onerror),this._stdin.listenerCount(`data`)===0&&this._stdin.pause(),this._readBuffer.clear(),this.onclose?.()}send(e){return new Promise(t=>{let n=ds(e);this._stdout.write(n)?t():this._stdout.once(`drain`,t)})}};function ps(e){if(e.platform!==`darwin`)return{kind:`unchanged`};let t;try{t=e.realpath(e.bundleAnchorPath)}catch(e){return{kind:`unreadable`,reason:e instanceof Error?e.message:String(e)}}let n;try{n=e.statInode(t)}catch(e){return{kind:`unreadable`,reason:e instanceof Error?e.message:String(e)}}return n===e.currentInode?{kind:`unchanged`}:{kind:`replaced`,currentInode:e.currentInode,onDiskInode:n}}function ms(e){let t=e.setInterval??setInterval,n=e.clearInterval??clearInterval,r=e.intervalMs??3e5,i=!0,a=!1,o=!1,s=t(()=>{if(!i)return;let t;try{t=e.detect()}catch(t){e.log(`bundle identity check threw unexpectedly (contract violation): ${t instanceof Error?t.message:String(t)}`);return}if(t.kind===`unreadable`){o||(o=!0,e.log(`bundle identity check unreadable${t.reason?`: ${t.reason}`:``} — will retry on next tick`));return}o&&(o=!1,e.log(`bundle identity check recovered from unreadable`)),t.kind!==`unchanged`&&(i=!1,e.onReplaced(t))},r);return typeof s.unref==`function`&&s.unref(),{stop:()=>{a||(a=!0,i=!1,n(s))}}}function hs(e,t){let n;try{n=t.realpathSync(e)}catch(e){t.log(`[mcp] bundle identity boot capture unreadable (realpath failed): ${e instanceof Error?e.message:String(e)}`);return}let r;try{r=t.statInoSync(n)}catch(e){t.log(`[mcp] bundle identity boot capture unreadable (stat failed): ${e instanceof Error?e.message:String(e)}`);return}return{resolvedPath:n,inode:r}}function gs(e){let t=e.scheduler??{setInterval:(e,t)=>globalThis.setInterval(e,t),clearInterval:e=>globalThis.clearInterval(e)},n=e.getPpid();if(n<=1)return{stop:()=>{}};let r=!1,i=t.setInterval(()=>{if(r)return;let a=e.getPpid();a!==n&&(r=!0,t.clearInterval(i),e.onHostGone(`host process exited (ppid ${n} -> ${a})`))},e.intervalMs??1e3);return i.unref?.(),{stop:()=>t.clearInterval(i)}}function _s(e){let t=t=>{try{e.log(t)}catch{}},n=e.transport.onclose;e.transport.onclose=()=>{t(`[mcp] stdio transport closed (internal shutdown)`),n?.()},e.stdin.once(`end`,()=>t(`[mcp] stdin EOF (host closed pipe)`)),e.stdin.once(`close`,()=>t(`[mcp] stdin closed`)),e.process.on(`exit`,e=>{t(`[mcp] exit code=${e}`)}),e.process.on(`uncaughtExceptionMonitor`,(e,n)=>{t(`[mcp] uncaughtException origin=${n}: ${e instanceof Error?e.stack??e.message:String(e)}`)})}function vs(e){return e?e instanceof Headers?Object.fromEntries(e.entries()):Array.isArray(e)?Object.fromEntries(e):{...e}:{}}function ys(e=fetch,t){return t?async(n,r)=>e(n,{...t,...r,headers:r?.headers?{...vs(t.headers),...vs(r.headers)}:t.headers}):e}let bs;bs=globalThis.crypto?.webcrypto??globalThis.crypto??import(`node:crypto`).then(e=>e.webcrypto);async function xs(e){return(await bs).getRandomValues(new Uint8Array(e))}async function Ss(e){let t=``;for(;t.length<e;){let n=await xs(e-t.length);for(let e of n)e<198&&(t+=`abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~`[e%66])}return t}async function Cs(e){return await Ss(e)}async function ws(e){let t=await(await bs).subtle.digest(`SHA-256`,new TextEncoder().encode(e));return btoa(String.fromCharCode(...new Uint8Array(t))).replace(/\//g,`_`).replace(/\+/g,`-`).replace(/=/g,``)}async function Ts(e){if(e||=43,e<43||e>128)throw`Expected a length between 43 and 128. Received ${e}.`;let t=await Cs(e);return{code_verifier:t,code_challenge:await ws(t)}}const X=b().superRefine((e,t)=>{if(!URL.canParse(e))return t.addIssue({code:Rn.custom,message:`URL must be parseable`,fatal:!0}),S}).refine(e=>{let t=new URL(e);return t.protocol!==`javascript:`&&t.protocol!==`data:`&&t.protocol!==`vbscript:`},{message:`URL cannot use javascript:, data:, or vbscript: scheme`}),Es=l({resource:h().url(),authorization_servers:s(X).optional(),jwks_uri:h().url().optional(),scopes_supported:s(h()).optional(),bearer_methods_supported:s(h()).optional(),resource_signing_alg_values_supported:s(h()).optional(),resource_name:h().optional(),resource_documentation:h().optional(),resource_policy_uri:h().url().optional(),resource_tos_uri:h().url().optional(),tls_client_certificate_bound_access_tokens:v().optional(),authorization_details_types_supported:s(h()).optional(),dpop_signing_alg_values_supported:s(h()).optional(),dpop_bound_access_tokens_required:v().optional()}),Ds=l({issuer:h(),authorization_endpoint:X,token_endpoint:X,registration_endpoint:X.optional(),scopes_supported:s(h()).optional(),response_types_supported:s(h()),response_modes_supported:s(h()).optional(),grant_types_supported:s(h()).optional(),token_endpoint_auth_methods_supported:s(h()).optional(),token_endpoint_auth_signing_alg_values_supported:s(h()).optional(),service_documentation:X.optional(),revocation_endpoint:X.optional(),revocation_endpoint_auth_methods_supported:s(h()).optional(),revocation_endpoint_auth_signing_alg_values_supported:s(h()).optional(),introspection_endpoint:h().optional(),introspection_endpoint_auth_methods_supported:s(h()).optional(),introspection_endpoint_auth_signing_alg_values_supported:s(h()).optional(),code_challenge_methods_supported:s(h()).optional(),client_id_metadata_document_supported:v().optional()}),Os=p({...l({issuer:h(),authorization_endpoint:X,token_endpoint:X,userinfo_endpoint:X.optional(),jwks_uri:X,registration_endpoint:X.optional(),scopes_supported:s(h()).optional(),response_types_supported:s(h()),response_modes_supported:s(h()).optional(),grant_types_supported:s(h()).optional(),acr_values_supported:s(h()).optional(),subject_types_supported:s(h()),id_token_signing_alg_values_supported:s(h()),id_token_encryption_alg_values_supported:s(h()).optional(),id_token_encryption_enc_values_supported:s(h()).optional(),userinfo_signing_alg_values_supported:s(h()).optional(),userinfo_encryption_alg_values_supported:s(h()).optional(),userinfo_encryption_enc_values_supported:s(h()).optional(),request_object_signing_alg_values_supported:s(h()).optional(),request_object_encryption_alg_values_supported:s(h()).optional(),request_object_encryption_enc_values_supported:s(h()).optional(),token_endpoint_auth_methods_supported:s(h()).optional(),token_endpoint_auth_signing_alg_values_supported:s(h()).optional(),display_values_supported:s(h()).optional(),claim_types_supported:s(h()).optional(),claims_supported:s(h()).optional(),service_documentation:h().optional(),claims_locales_supported:s(h()).optional(),ui_locales_supported:s(h()).optional(),claims_parameter_supported:v().optional(),request_parameter_supported:v().optional(),request_uri_parameter_supported:v().optional(),require_request_uri_registration:v().optional(),op_policy_uri:X.optional(),op_tos_uri:X.optional(),client_id_metadata_document_supported:v().optional()}).shape,...Ds.pick({code_challenge_methods_supported:!0}).shape}),ks=p({access_token:h(),id_token:h().optional(),token_type:h(),expires_in:Bn().optional(),scope:h().optional(),refresh_token:h().optional()}).strip(),As=p({error:h(),error_description:h().optional(),error_uri:h().optional()}),js=X.optional().or(f(``).transform(()=>void 0)),Ms=p({redirect_uris:s(X),token_endpoint_auth_method:h().optional(),grant_types:s(h()).optional(),response_types:s(h()).optional(),client_name:h().optional(),client_uri:X.optional(),logo_uri:js,scope:h().optional(),contacts:s(h()).optional(),tos_uri:js,policy_uri:h().optional(),jwks_uri:X.optional(),jwks:a().optional(),software_id:h().optional(),software_version:h().optional(),software_statement:h().optional()}).strip(),Ns=p({client_id:h(),client_secret:h().optional(),client_id_issued_at:n().optional(),client_secret_expires_at:n().optional()}).strip(),Ps=Ms.merge(Ns);p({error:h(),error_description:h().optional()}).strip(),p({token:h(),token_type_hint:h().optional()}).strip();function Fs(e){let t=typeof e==`string`?new URL(e):new URL(e.href);return t.hash=``,t}function Is({requestedResource:e,configuredResource:t}){let n=typeof e==`string`?new URL(e):new URL(e.href),r=typeof t==`string`?new URL(t):new URL(t.href);if(n.origin!==r.origin||n.pathname.length<r.pathname.length)return!1;let i=n.pathname.endsWith(`/`)?n.pathname:n.pathname+`/`,a=r.pathname.endsWith(`/`)?r.pathname:r.pathname+`/`;return i.startsWith(a)}var Z=class extends Error{constructor(e,t){super(e),this.errorUri=t,this.name=this.constructor.name}toResponseObject(){let e={error:this.errorCode,error_description:this.message};return this.errorUri&&(e.error_uri=this.errorUri),e}get errorCode(){return this.constructor.errorCode}},Ls=class extends Z{};Ls.errorCode=`invalid_request`;var Rs=class extends Z{};Rs.errorCode=`invalid_client`;var zs=class extends Z{};zs.errorCode=`invalid_grant`;var Bs=class extends Z{};Bs.errorCode=`unauthorized_client`;var Vs=class extends Z{};Vs.errorCode=`unsupported_grant_type`;var Hs=class extends Z{};Hs.errorCode=`invalid_scope`;var Us=class extends Z{};Us.errorCode=`access_denied`;var Ws=class extends Z{};Ws.errorCode=`server_error`;var Gs=class extends Z{};Gs.errorCode=`temporarily_unavailable`;var Ks=class extends Z{};Ks.errorCode=`unsupported_response_type`;var qs=class extends Z{};qs.errorCode=`unsupported_token_type`;var Js=class extends Z{};Js.errorCode=`invalid_token`;var Ys=class extends Z{};Ys.errorCode=`method_not_allowed`;var Xs=class extends Z{};Xs.errorCode=`too_many_requests`;var Zs=class extends Z{};Zs.errorCode=`invalid_client_metadata`;var Qs=class extends Z{};Qs.errorCode=`insufficient_scope`;var $s=class extends Z{};$s.errorCode=`invalid_target`;const ec={[Ls.errorCode]:Ls,[Rs.errorCode]:Rs,[zs.errorCode]:zs,[Bs.errorCode]:Bs,[Vs.errorCode]:Vs,[Hs.errorCode]:Hs,[Us.errorCode]:Us,[Ws.errorCode]:Ws,[Gs.errorCode]:Gs,[Ks.errorCode]:Ks,[qs.errorCode]:qs,[Js.errorCode]:Js,[Ys.errorCode]:Ys,[Xs.errorCode]:Xs,[Zs.errorCode]:Zs,[Qs.errorCode]:Qs,[$s.errorCode]:$s};var tc=class extends Error{constructor(e){super(e??`Unauthorized`)}};function nc(e){return[`client_secret_basic`,`client_secret_post`,`none`].includes(e)}const rc=`code`,ic=`S256`;function ac(e,t){let n=e.client_secret!==void 0;return`token_endpoint_auth_method`in e&&e.token_endpoint_auth_method&&nc(e.token_endpoint_auth_method)&&(t.length===0||t.includes(e.token_endpoint_auth_method))?e.token_endpoint_auth_method:t.length===0?n?`client_secret_basic`:`none`:n&&t.includes(`client_secret_basic`)?`client_secret_basic`:n&&t.includes(`client_secret_post`)?`client_secret_post`:t.includes(`none`)?`none`:n?`client_secret_post`:`none`}function oc(e,t,n,r){let{client_id:i,client_secret:a}=t;switch(e){case`client_secret_basic`:sc(i,a,n);return;case`client_secret_post`:cc(i,a,r);return;case`none`:lc(i,r);return;default:throw Error(`Unsupported client authentication method: ${e}`)}}function sc(e,t,n){if(!t)throw Error(`client_secret_basic authentication requires a client_secret`);let r=btoa(`${e}:${t}`);n.set(`Authorization`,`Basic ${r}`)}function cc(e,t,n){n.set(`client_id`,e),t&&n.set(`client_secret`,t)}function lc(e,t){t.set(`client_id`,e)}async function uc(e){let t=e instanceof Response?e.status:void 0,n=e instanceof Response?await e.text():e;try{let{error:e,error_description:t,error_uri:r}=As.parse(JSON.parse(n));return new(ec[e]||Ws)(t||``,r)}catch(e){return new Ws(`${t?`HTTP ${t}: `:``}Invalid OAuth error response: ${e}. Raw body: ${n}`)}}async function dc(e,t){try{return await fc(e,t)}catch(n){if(n instanceof Rs||n instanceof Bs)return await e.invalidateCredentials?.(`all`),await fc(e,t);if(n instanceof zs)return await e.invalidateCredentials?.(`tokens`),await fc(e,t);throw n}}async function fc(e,{serverUrl:t,authorizationCode:n,scope:r,resourceMetadataUrl:i,fetchFn:a}){let o=await e.discoveryState?.(),s,c,l,u=i;if(!u&&o?.resourceMetadataUrl&&(u=new URL(o.resourceMetadataUrl)),o?.authorizationServerUrl){if(c=o.authorizationServerUrl,s=o.resourceMetadata,l=o.authorizationServerMetadata??await wc(c,{fetchFn:a}),!s)try{s=await _c(t,{resourceMetadataUrl:u},a)}catch{}(l!==o.authorizationServerMetadata||s!==o.resourceMetadata)&&await e.saveDiscoveryState?.({authorizationServerUrl:String(c),resourceMetadataUrl:u?.toString(),resourceMetadata:s,authorizationServerMetadata:l})}else{let n=await Tc(t,{resourceMetadataUrl:u,fetchFn:a});c=n.authorizationServerUrl,l=n.authorizationServerMetadata,s=n.resourceMetadata,await e.saveDiscoveryState?.({authorizationServerUrl:String(c),resourceMetadataUrl:u?.toString(),resourceMetadata:s,authorizationServerMetadata:l})}let d=await mc(t,e,s),f=r||s?.scopes_supported?.join(` `)||e.clientMetadata.scope,p=await Promise.resolve(e.clientInformation());if(!p){if(n!==void 0)throw Error(`Existing OAuth client information is required when exchanging an authorization code`);let t=l?.client_id_metadata_document_supported===!0,r=e.clientMetadataUrl;if(r&&!pc(r))throw new Zs(`clientMetadataUrl must be a valid HTTPS URL with a non-root pathname, got: ${r}`);if(t&&r)p={client_id:r},await e.saveClientInformation?.(p);else{if(!e.saveClientInformation)throw Error(`OAuth client information must be saveable for dynamic registration`);let t=await jc(c,{metadata:l,clientMetadata:e.clientMetadata,scope:f,fetchFn:a});await e.saveClientInformation(t),p=t}}let m=!e.redirectUrl;if(n!==void 0||m){let t=await Ac(e,c,{metadata:l,resource:d,authorizationCode:n,fetchFn:a});return await e.saveTokens(t),`AUTHORIZED`}let h=await e.tokens();if(h?.refresh_token)try{let t=await kc(c,{metadata:l,clientInformation:p,refreshToken:h.refresh_token,resource:d,addClientAuthentication:e.addClientAuthentication,fetchFn:a});return await e.saveTokens(t),`AUTHORIZED`}catch(e){if(!(!(e instanceof Z)||e instanceof Ws))throw e}let g=e.state?await e.state():void 0,{authorizationUrl:_,codeVerifier:v}=await Ec(c,{metadata:l,clientInformation:p,state:g,redirectUrl:e.redirectUrl,scope:f,resource:d});return await e.saveCodeVerifier(v),await e.redirectToAuthorization(_),`REDIRECT`}function pc(e){if(!e)return!1;try{let t=new URL(e);return t.protocol===`https:`&&t.pathname!==`/`}catch{return!1}}async function mc(e,t,n){let r=Fs(e);if(t.validateResourceURL)return await t.validateResourceURL(r,n?.resource);if(n){if(!Is({requestedResource:r,configuredResource:n.resource}))throw Error(`Protected resource ${n.resource} does not match expected ${r} (or origin)`);return new URL(n.resource)}}function hc(e){let t=e.headers.get(`WWW-Authenticate`);if(!t)return{};let[n,r]=t.split(` `);if(n.toLowerCase()!==`bearer`||!r)return{};let i=gc(e,`resource_metadata`)||void 0,a;if(i)try{a=new URL(i)}catch{}let o=gc(e,`scope`)||void 0,s=gc(e,`error`)||void 0;return{resourceMetadataUrl:a,scope:o,error:s}}function gc(e,t){let n=e.headers.get(`WWW-Authenticate`);if(!n)return null;let r=RegExp(`${t}=(?:"([^"]+)"|([^\\s,]+))`),i=n.match(r);return i?i[1]||i[2]:null}async function _c(e,t,n=fetch){let r=await Sc(e,`oauth-protected-resource`,n,{protocolVersion:t?.protocolVersion,metadataUrl:t?.resourceMetadataUrl});if(!r||r.status===404)throw await r?.body?.cancel(),Error(`Resource server does not implement OAuth 2.0 Protected Resource Metadata.`);if(!r.ok)throw await r.body?.cancel(),Error(`HTTP ${r.status} trying to load well-known OAuth protected resource metadata.`);return Es.parse(await r.json())}async function vc(e,t,n=fetch){try{return await n(e,{headers:t})}catch(r){if(r instanceof TypeError)return t?vc(e,void 0,n):void 0;throw r}}function yc(e,t=``,n={}){return t.endsWith(`/`)&&(t=t.slice(0,-1)),n.prependPathname?`${t}/.well-known/${e}`:`/.well-known/${e}${t}`}async function bc(e,t,n=fetch){return await vc(e,{"MCP-Protocol-Version":t},n)}function xc(e,t){return!e||e.status>=400&&e.status<500&&t!==`/`}async function Sc(e,t,n,r){let i=new URL(e),a=r?.protocolVersion??`2025-11-25`,o;if(r?.metadataUrl)o=new URL(r.metadataUrl);else{let e=yc(t,i.pathname);o=new URL(e,r?.metadataServerUrl??i),o.search=i.search}let s=await bc(o,a,n);return!r?.metadataUrl&&xc(s,i.pathname)&&(s=await bc(new URL(`/.well-known/${t}`,i),a,n)),s}function Cc(e){let t=typeof e==`string`?new URL(e):e,n=t.pathname!==`/`,r=[];if(!n)return r.push({url:new URL(`/.well-known/oauth-authorization-server`,t.origin),type:`oauth`}),r.push({url:new URL(`/.well-known/openid-configuration`,t.origin),type:`oidc`}),r;let i=t.pathname;return i.endsWith(`/`)&&(i=i.slice(0,-1)),r.push({url:new URL(`/.well-known/oauth-authorization-server${i}`,t.origin),type:`oauth`}),r.push({url:new URL(`/.well-known/openid-configuration${i}`,t.origin),type:`oidc`}),r.push({url:new URL(`${i}/.well-known/openid-configuration`,t.origin),type:`oidc`}),r}async function wc(e,{fetchFn:t=fetch,protocolVersion:n=Ie}={}){let r={"MCP-Protocol-Version":n,Accept:`application/json`},i=Cc(e);for(let{url:e,type:n}of i){let i=await vc(e,r,t);if(i){if(!i.ok){if(await i.body?.cancel(),i.status>=400&&i.status<500)continue;throw Error(`HTTP ${i.status} trying to load ${n===`oauth`?`OAuth`:`OpenID provider`} metadata from ${e}`)}return n===`oauth`?Ds.parse(await i.json()):Os.parse(await i.json())}}}async function Tc(e,t){let n,r;try{n=await _c(e,{resourceMetadataUrl:t?.resourceMetadataUrl},t?.fetchFn),n.authorization_servers&&n.authorization_servers.length>0&&(r=n.authorization_servers[0])}catch{}r||=String(new URL(`/`,e));let i=await wc(r,{fetchFn:t?.fetchFn});return{authorizationServerUrl:r,authorizationServerMetadata:i,resourceMetadata:n}}async function Ec(e,{metadata:t,clientInformation:n,redirectUrl:r,scope:i,state:a,resource:o}){let s;if(t){if(s=new URL(t.authorization_endpoint),!t.response_types_supported.includes(rc))throw Error(`Incompatible auth server: does not support response type ${rc}`);if(t.code_challenge_methods_supported&&!t.code_challenge_methods_supported.includes(ic))throw Error(`Incompatible auth server: does not support code challenge method ${ic}`)}else s=new URL(`/authorize`,e);let c=await Ts(),l=c.code_verifier,u=c.code_challenge;return s.searchParams.set(`response_type`,rc),s.searchParams.set(`client_id`,n.client_id),s.searchParams.set(`code_challenge`,u),s.searchParams.set(`code_challenge_method`,ic),s.searchParams.set(`redirect_uri`,String(r)),a&&s.searchParams.set(`state`,a),i&&s.searchParams.set(`scope`,i),i?.includes(`offline_access`)&&s.searchParams.append(`prompt`,`consent`),o&&s.searchParams.set(`resource`,o.href),{authorizationUrl:s,codeVerifier:l}}function Dc(e,t,n){return new URLSearchParams({grant_type:`authorization_code`,code:e,code_verifier:t,redirect_uri:String(n)})}async function Oc(e,{metadata:t,tokenRequestParams:n,clientInformation:r,addClientAuthentication:i,resource:a,fetchFn:o}){let s=t?.token_endpoint?new URL(t.token_endpoint):new URL(`/token`,e),c=new Headers({"Content-Type":`application/x-www-form-urlencoded`,Accept:`application/json`});a&&n.set(`resource`,a.href),i?await i(c,n,s,t):r&&oc(ac(r,t?.token_endpoint_auth_methods_supported??[]),r,c,n);let l=await(o??fetch)(s,{method:`POST`,headers:c,body:n});if(!l.ok)throw await uc(l);return ks.parse(await l.json())}async function kc(e,{metadata:t,clientInformation:n,refreshToken:r,resource:i,addClientAuthentication:a,fetchFn:o}){return{refresh_token:r,...await Oc(e,{metadata:t,tokenRequestParams:new URLSearchParams({grant_type:`refresh_token`,refresh_token:r}),clientInformation:n,addClientAuthentication:a,resource:i,fetchFn:o})}}async function Ac(e,t,{metadata:n,resource:r,authorizationCode:i,fetchFn:a}={}){let o=e.clientMetadata.scope,s;if(e.prepareTokenRequest&&(s=await e.prepareTokenRequest(o)),!s){if(!i)throw Error(`Either provider.prepareTokenRequest() or authorizationCode is required`);if(!e.redirectUrl)throw Error(`redirectUrl is required for authorization_code flow`);s=Dc(i,await e.codeVerifier(),e.redirectUrl)}let c=await e.clientInformation();return Oc(t,{metadata:n,tokenRequestParams:s,clientInformation:c??void 0,addClientAuthentication:e.addClientAuthentication,resource:r,fetchFn:a})}async function jc(e,{metadata:t,clientMetadata:n,scope:r,fetchFn:i}){let a;if(t){if(!t.registration_endpoint)throw Error(`Incompatible auth server: does not support dynamic client registration`);a=new URL(t.registration_endpoint)}else a=new URL(`/register`,e);let o=await(i??fetch)(a,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({...n,...r===void 0?{}:{scope:r}})});if(!o.ok)throw await uc(o);return Ps.parse(await o.json())}var Mc=class extends Error{constructor(e,t){super(e),this.name=`ParseError`,this.type=t.type,this.field=t.field,this.value=t.value,this.line=t.line}};function Nc(e){}function Pc(e){if(typeof e==`function`)throw TypeError("`callbacks` must be an object, got a function instead. Did you mean `{onEvent: fn}`?");let{onEvent:t=Nc,onError:n=Nc,onRetry:r=Nc,onComment:i}=e,a=``,o=!0,s,c=``,l=``;function u(e){let t=o?e.replace(/^\xEF\xBB\xBF/,``):e,[n,r]=Fc(`${a}${t}`);for(let e of n)d(e);a=r,o=!1}function d(e){if(e===``){p();return}if(e.startsWith(`:`)){i&&i(e.slice(e.startsWith(`: `)?2:1));return}let t=e.indexOf(`:`);if(t!==-1){let n=e.slice(0,t),r=e[t+1]===` `?2:1;f(n,e.slice(t+r),e);return}f(e,``,e)}function f(e,t,i){switch(e){case`event`:l=t;break;case`data`:c=`${c}${t}
66
- `;break;case`id`:s=t.includes(`\0`)?void 0:t;break;case`retry`:/^\d+$/.test(t)?r(parseInt(t,10)):n(new Mc(`Invalid \`retry\` value: "${t}"`,{type:`invalid-retry`,value:t,line:i}));break;default:n(new Mc(`Unknown field "${e.length>20?`${e.slice(0,20)}\u2026`:e}"`,{type:`unknown-field`,field:e,value:t,line:i}));break}}function p(){c.length>0&&t({id:s,event:l||void 0,data:c.endsWith(`
67
- `)?c.slice(0,-1):c}),s=void 0,c=``,l=``}function m(e={}){a&&e.consume&&d(a),o=!0,s=void 0,c=``,l=``,a=``}return{feed:u,reset:m}}function Fc(e){let t=[],n=``,r=0;for(;r<e.length;){let i=e.indexOf(`\r`,r),a=e.indexOf(`
57
+ `)})}function Go(){return new t(`clear-key`).description(`Remove the stored embeddings provider API key`).action(async()=>{let{touched:e}=await at();if(e.length===0){process.stderr.write(`No stored embeddings key found.
58
+ `);return}process.stderr.write(`✓ Embeddings API key cleared (${e.join(`, `)}).\n`)})}function Ko(e,n){return new t(e).description(`Turn semantic search ${n?`on`:`off`} for this project (project-local)`).option(`--cwd <path>`,`Project directory (defaults to the current directory)`).action(async t=>{let r=B(t.cwd??process.cwd()),i=await Me({cwd:r,scope:`project-local`,patch:{search:{semantic:{enabled:n}}}});if(!i.ok){process.stderr.write(`Failed to ${e} semantic search — ${c(i.error)}\n`),process.exitCode=1;return}if(process.stderr.write(`✓ Semantic search ${n?`enabled`:`disabled`} for ${r}\n`),n){let{present:e}=await Ho();e||process.stderr.write(" Note: no API key set yet — run `ok embeddings set-key`. Until then, search stays lexical.\n")}})}function qo(){return new t(`status`).description(`Show semantic-search capability: key presence, enabled, coverage, provider`).option(`--cwd <path>`,`Project directory (defaults to the current directory)`).option(`--json`,`Output JSON`,!1).action(async e=>{let t=B(e.cwd??process.cwd()),n=Vo(t),{present:r,source:i}=await Ho(),a=n.enabled&&r,o=a?await Uo(t):null;if(e.json){process.stdout.write(`${JSON.stringify({project:t,machine:{keyPresent:r,keySource:i},project_config:{enabled:n.enabled,capable:a,coverage:o?{embedded:o.embedded,total:o.total}:null,provider:{baseUrl:n.baseUrl,model:n.model,dimensions:n.dimensions??null}}})}\n`);return}let s=r?`set — ${i===`env`?`environment (${Ye})`:`~/.ok/secrets.yml`}`:`not set`,c=a?o?`${o.embedded} / ${o.total} pages embedded`:`server not running — start it to index (or it has not embedded yet)`:null,l=[`Semantic search`,` project: ${t}`,``,` This machine (all projects):`,` API key: ${s}`,``,` This project:`,` enabled: ${n.enabled?`yes`:`no`}`,` capability: ${a?`AVAILABLE`:`unavailable (search stays lexical)`}`,...c?[` coverage: ${c}`]:[],` provider: ${n.baseUrl}`,` model: ${n.model}`,` dimensions: ${n.dimensions??`native (1536)`}`],u=[];r||u.push(`Set a key: ok embeddings set-key (or export ${Ye})`),n.enabled||u.push(`Enable it: ok embeddings enable (in this project folder)`),u.length>0&&l.push(``,...u.map(e=>` ${e}`)),process.stdout.write(`${l.join(`
59
+ `)}\n`)})}function Jo(){return new t(`embeddings`).description(`Manage the semantic-search embeddings provider key + status`).addCommand(Wo()).addCommand(Go()).addCommand(Ko(`enable`,!0)).addCommand(Ko(`disable`,!1)).addCommand(qo())}const Yo=[` 1. ${j(`Customize`)} (sidebar) → ${j(`Skills`)}`,` 2. Click the ${j(`+`)} button`,` 3. Click ${j(`Create skill`)}`,` 4. Click ${j(`Upload skill`)}`,` 5. Pick ${j(`openknowledge.skill`)} from Downloads`],Xo=E(` Open the Claude Desktop App, then: ${j(`Customize → Skills → + → Create skill → Upload skill`)} → pick the file.`);function Zo(e){let t=[O(`Built ${e.outputPath}`),D(` ${e.size} bytes • sha256 ${e.sha256?.slice(0,12)}…`)];return e.handoffError&&t.push(A(` Handoff failed: ${e.handoffError.message}`)),t.push(Xo),t.join(`
60
+ `)}function Qo(e){let t=e.skillVersion??`unknown`,n=e.recordedAt??`unknown`;return[E(`Open Knowledge skill ${j(`v${t}`)} already delivered to Claude Desktop.`),D(` Recorded at ${n} in ~/.ok/skill-state.yml`),D(` Use ${j(`--force`)} to rebuild and re-open the install dialog.`)].join(`
61
+ `)}function $o(e){let t=e.skillVersion?` • Skill v${e.skillVersion}`:``;return[O(`Built ${e.outputPath}`),D(` ${e.size} bytes • sha256 ${e.sha256?.slice(0,12)}…${t}`),E(` Claude Desktop App opened. Now upload the file manually:`),...Yo,D(` If Claude Desktop didn't open, open it and start at step 1. The file is at ${e.outputPath}`)].join(`
62
+ `)}function es(e){return`${k(`Error:`)} ${e.buildError??`unknown build failure`}`}async function ts(e={}){let t=await Xe(e);return t.status===`failed`?{...t,message:es(t),exitCode:1}:t.status===`skip-current`?{...t,message:Qo(t),exitCode:0}:t.status===`installed`?{...t,message:$o(t),exitCode:0}:{...t,message:Zo(t),exitCode:0}}function ns(){return new t(`install-skill`).description("Build openknowledge.skill and open the Claude Desktop App so you can upload it for Claude Chat & Cowork. Not needed for Claude — `ok init` covers that separately.").option(`--out <path>`,`Custom output path (default: ~/Downloads/openknowledge.skill)`).option(`--no-open`,`Build the file but skip the OS file-association handoff`).option(`--force`,`Bypass the install-state gate and rebuild unconditionally`).action(async e=>{let t=await ts({out:e.out,noOpen:!e.open,force:e.force??!1});process.stdout.write(`${t.message}\n`),t.exitCode!==0&&process.exit(t.exitCode)})}const rs=z(`Contents`,`Resources`,`cli`,`bin`,`ok.sh`),is=/Contents\/Resources\/cli\/dist\/cli\.mjs$/;function as(e,t,n){return e===`darwin`?[z(t,`Applications`,`Open Knowledge.app`,rs),z(`/Applications`,`Open Knowledge.app`,rs)].find(e=>n.existsSync(e))??null:null}function os(e,t,n){if(n!==`darwin`)return{proxy:!1,suppressedBy:`platform`};let r=e.OK_BUNDLE_PROXY?.toLowerCase();return r===`0`||r===`false`?{proxy:!1,suppressedBy:`env`}:t.includes(`--no-bundle-proxy`)?{proxy:!1,suppressedBy:`flag`}:typeof t[1]==`string`&&is.test(t[1])?{proxy:!1,suppressedBy:`self`}:{proxy:!0,suppressedBy:null}}function ss(e){e.stderr.write(`${JSON.stringify({event:`mcp-bundle-proxy`,mode:e.mode,bundlePath:e.bundlePath,reason:e.reason,hint:`Suppress with --no-bundle-proxy or OK_BUNDLE_PROXY=0.`})}\n`)}function cs(e){ss({stderr:e.stderr,mode:`bundled`,bundlePath:e.bundlePath,reason:null});let t=e.spawnImpl??M,n=e.exitProcess??(e=>process.exit(e)),r=e.now??(()=>Date.now()),i=r(),a=e.startupFailureWindowMs??1e3;return new Promise((o,s)=>{let c=t(e.bundlePath,e.argv.filter(e=>e!==`--no-bundle-proxy`),{env:{...e.env,OK_BUNDLE_PROXY:`0`},stdio:`inherit`}),l=e=>{c.kill(e)},u=()=>{process.off(`SIGTERM`,l),process.off(`SIGINT`,l)};process.on(`SIGTERM`,l),process.on(`SIGINT`,l),c.once(`error`,e=>{u(),s(e)}),c.once(`exit`,(e,t)=>{if(u(),t){s(Error(`bundle process exited by signal ${t}`));return}let o=e??0,c=r()-i;if(o!==0&&c<=a){s(Error(`bundle process exited during startup with code ${o}`));return}n(o)})})}function ls(e){let t=e.scheduler??{setTimeout:(e,t)=>globalThis.setTimeout(e,t),clearTimeout:e=>globalThis.clearTimeout(e)},n=e.initialBackoffMs??1e3,r=e.maxBackoffMs??3e4,i=e.rng??Math.random,a=e.createWebSocket??(e=>new WebSocket(e)),o=e.logger??null,s=e.log,c=null,l=null,u=!1,d=n;function f(e,t,n){try{o?o[e](t,n):s?.(t)}catch{}}function p(){if(u)return;l!==null&&t.clearTimeout(l);let e=d;d=Math.min(d*2,r);let n=i(),a=Math.max(1,Math.floor(e*(1-n/2)));f(`debug`,`scheduling reconnect`,{backoffMs:a,ceilMs:e}),l=t.setTimeout(()=>{l=null,m().catch(e=>f(`warn`,`reconnect failed`,{error:String(e)}))},a)}async function m(){if(u)return;let t;try{t=await e.resolveWsUrl()}catch(e){f(`warn`,`resolveWsUrl threw`,{error:String(e)}),p();return}if(!t){p();return}let r=e.connectionId?`&connectionId=${encodeURIComponent(e.connectionId)}`:``,i=e.connectionId&&e.displayName!==void 0&&e.clientName!==void 0&&e.colorSeed!==void 0?`&displayName=${encodeURIComponent(e.displayName)}&clientName=${encodeURIComponent(e.clientName)}&colorSeed=${encodeURIComponent(e.colorSeed)}`:``,o=`${t}/collab/keepalive?pid=${process.pid}${r}${i}`;try{c=a(o)}catch(e){f(`warn`,`WebSocket constructor failed`,{url:o,error:String(e)}),c=null,p();return}c.addEventListener(`open`,()=>{f(`info`,`connected`,{url:t}),d=n}),c.addEventListener(`close`,()=>{u||(f(`info`,`disconnected`,{url:t}),c=null,p())}),c.addEventListener(`error`,()=>{f(`debug`,`websocket error observed`,{url:t,readyState:c?.readyState,reason:`error-event`})})}return queueMicrotask(()=>{m().catch(e=>f(`warn`,`initial connect failed`,{error:String(e)}))}),{close:()=>{if(!u&&(u=!0,l!==null&&(t.clearTimeout(l),l=null),c)){try{c.close()}catch{}c=null}},isConnected:()=>c!==null&&c.readyState===1}}var us=class{append(e){this._buffer=this._buffer?Buffer.concat([this._buffer,e]):e}readMessage(){if(!this._buffer)return null;let e=this._buffer.indexOf(`
63
+ `);if(e===-1)return null;let t=this._buffer.toString(`utf8`,0,e).replace(/\r$/,``);return this._buffer=this._buffer.subarray(e+1),ds(t)}clear(){this._buffer=void 0}};function ds(e){return Ne.parse(JSON.parse(e))}function fs(e){return JSON.stringify(e)+`
64
+ `}var ps=class{constructor(e=$t.stdin,t=$t.stdout){this._stdin=e,this._stdout=t,this._readBuffer=new us,this._started=!1,this._ondata=e=>{this._readBuffer.append(e),this.processReadBuffer()},this._onerror=e=>{this.onerror?.(e)}}async start(){if(this._started)throw Error(`StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.`);this._started=!0,this._stdin.on(`data`,this._ondata),this._stdin.on(`error`,this._onerror)}processReadBuffer(){for(;;)try{let e=this._readBuffer.readMessage();if(e===null)break;this.onmessage?.(e)}catch(e){this.onerror?.(e)}}async close(){this._stdin.off(`data`,this._ondata),this._stdin.off(`error`,this._onerror),this._stdin.listenerCount(`data`)===0&&this._stdin.pause(),this._readBuffer.clear(),this.onclose?.()}send(e){return new Promise(t=>{let n=fs(e);this._stdout.write(n)?t():this._stdout.once(`drain`,t)})}};function ms(e){if(e.platform!==`darwin`)return{kind:`unchanged`};let t;try{t=e.realpath(e.bundleAnchorPath)}catch(e){return{kind:`unreadable`,reason:e instanceof Error?e.message:String(e)}}let n;try{n=e.statInode(t)}catch(e){return{kind:`unreadable`,reason:e instanceof Error?e.message:String(e)}}return n===e.currentInode?{kind:`unchanged`}:{kind:`replaced`,currentInode:e.currentInode,onDiskInode:n}}function hs(e){let t=e.setInterval??setInterval,n=e.clearInterval??clearInterval,r=e.intervalMs??3e5,i=!0,a=!1,o=!1,s=t(()=>{if(!i)return;let t;try{t=e.detect()}catch(t){e.log(`bundle identity check threw unexpectedly (contract violation): ${t instanceof Error?t.message:String(t)}`);return}if(t.kind===`unreadable`){o||(o=!0,e.log(`bundle identity check unreadable${t.reason?`: ${t.reason}`:``} — will retry on next tick`));return}o&&(o=!1,e.log(`bundle identity check recovered from unreadable`)),t.kind!==`unchanged`&&(i=!1,e.onReplaced(t))},r);return typeof s.unref==`function`&&s.unref(),{stop:()=>{a||(a=!0,i=!1,n(s))}}}function gs(e,t){let n;try{n=t.realpathSync(e)}catch(e){t.log(`[mcp] bundle identity boot capture unreadable (realpath failed): ${e instanceof Error?e.message:String(e)}`);return}let r;try{r=t.statInoSync(n)}catch(e){t.log(`[mcp] bundle identity boot capture unreadable (stat failed): ${e instanceof Error?e.message:String(e)}`);return}return{resolvedPath:n,inode:r}}function _s(e){let t=e.scheduler??{setInterval:(e,t)=>globalThis.setInterval(e,t),clearInterval:e=>globalThis.clearInterval(e)},n=e.getPpid();if(n<=1)return{stop:()=>{}};let r=!1,i=t.setInterval(()=>{if(r)return;let a=e.getPpid();a!==n&&(r=!0,t.clearInterval(i),e.onHostGone(`host process exited (ppid ${n} -> ${a})`))},e.intervalMs??1e3);return i.unref?.(),{stop:()=>t.clearInterval(i)}}function vs(e){let t=t=>{try{e.log(t)}catch{}},n=e.transport.onclose;e.transport.onclose=()=>{t(`[mcp] stdio transport closed (internal shutdown)`),n?.()},e.stdin.once(`end`,()=>t(`[mcp] stdin EOF (host closed pipe)`)),e.stdin.once(`close`,()=>t(`[mcp] stdin closed`)),e.process.on(`exit`,e=>{t(`[mcp] exit code=${e}`)}),e.process.on(`uncaughtExceptionMonitor`,(e,n)=>{t(`[mcp] uncaughtException origin=${n}: ${e instanceof Error?e.stack??e.message:String(e)}`)})}function ys(e){return e?e instanceof Headers?Object.fromEntries(e.entries()):Array.isArray(e)?Object.fromEntries(e):{...e}:{}}function bs(e=fetch,t){return t?async(n,r)=>e(n,{...t,...r,headers:r?.headers?{...ys(t.headers),...ys(r.headers)}:t.headers}):e}let xs;xs=globalThis.crypto?.webcrypto??globalThis.crypto??import(`node:crypto`).then(e=>e.webcrypto);async function Ss(e){return(await xs).getRandomValues(new Uint8Array(e))}async function Cs(e){let t=``;for(;t.length<e;){let n=await Ss(e-t.length);for(let e of n)e<198&&(t+=`abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~`[e%66])}return t}async function ws(e){return await Cs(e)}async function Ts(e){let t=await(await xs).subtle.digest(`SHA-256`,new TextEncoder().encode(e));return btoa(String.fromCharCode(...new Uint8Array(t))).replace(/\//g,`_`).replace(/\+/g,`-`).replace(/=/g,``)}async function Es(e){if(e||=43,e<43||e>128)throw`Expected a length between 43 and 128. Received ${e}.`;let t=await ws(e);return{code_verifier:t,code_challenge:await Ts(t)}}const X=b().superRefine((e,t)=>{if(!URL.canParse(e))return t.addIssue({code:Rn.custom,message:`URL must be parseable`,fatal:!0}),S}).refine(e=>{let t=new URL(e);return t.protocol!==`javascript:`&&t.protocol!==`data:`&&t.protocol!==`vbscript:`},{message:`URL cannot use javascript:, data:, or vbscript: scheme`}),Ds=l({resource:h().url(),authorization_servers:s(X).optional(),jwks_uri:h().url().optional(),scopes_supported:s(h()).optional(),bearer_methods_supported:s(h()).optional(),resource_signing_alg_values_supported:s(h()).optional(),resource_name:h().optional(),resource_documentation:h().optional(),resource_policy_uri:h().url().optional(),resource_tos_uri:h().url().optional(),tls_client_certificate_bound_access_tokens:v().optional(),authorization_details_types_supported:s(h()).optional(),dpop_signing_alg_values_supported:s(h()).optional(),dpop_bound_access_tokens_required:v().optional()}),Os=l({issuer:h(),authorization_endpoint:X,token_endpoint:X,registration_endpoint:X.optional(),scopes_supported:s(h()).optional(),response_types_supported:s(h()),response_modes_supported:s(h()).optional(),grant_types_supported:s(h()).optional(),token_endpoint_auth_methods_supported:s(h()).optional(),token_endpoint_auth_signing_alg_values_supported:s(h()).optional(),service_documentation:X.optional(),revocation_endpoint:X.optional(),revocation_endpoint_auth_methods_supported:s(h()).optional(),revocation_endpoint_auth_signing_alg_values_supported:s(h()).optional(),introspection_endpoint:h().optional(),introspection_endpoint_auth_methods_supported:s(h()).optional(),introspection_endpoint_auth_signing_alg_values_supported:s(h()).optional(),code_challenge_methods_supported:s(h()).optional(),client_id_metadata_document_supported:v().optional()}),ks=p({...l({issuer:h(),authorization_endpoint:X,token_endpoint:X,userinfo_endpoint:X.optional(),jwks_uri:X,registration_endpoint:X.optional(),scopes_supported:s(h()).optional(),response_types_supported:s(h()),response_modes_supported:s(h()).optional(),grant_types_supported:s(h()).optional(),acr_values_supported:s(h()).optional(),subject_types_supported:s(h()),id_token_signing_alg_values_supported:s(h()),id_token_encryption_alg_values_supported:s(h()).optional(),id_token_encryption_enc_values_supported:s(h()).optional(),userinfo_signing_alg_values_supported:s(h()).optional(),userinfo_encryption_alg_values_supported:s(h()).optional(),userinfo_encryption_enc_values_supported:s(h()).optional(),request_object_signing_alg_values_supported:s(h()).optional(),request_object_encryption_alg_values_supported:s(h()).optional(),request_object_encryption_enc_values_supported:s(h()).optional(),token_endpoint_auth_methods_supported:s(h()).optional(),token_endpoint_auth_signing_alg_values_supported:s(h()).optional(),display_values_supported:s(h()).optional(),claim_types_supported:s(h()).optional(),claims_supported:s(h()).optional(),service_documentation:h().optional(),claims_locales_supported:s(h()).optional(),ui_locales_supported:s(h()).optional(),claims_parameter_supported:v().optional(),request_parameter_supported:v().optional(),request_uri_parameter_supported:v().optional(),require_request_uri_registration:v().optional(),op_policy_uri:X.optional(),op_tos_uri:X.optional(),client_id_metadata_document_supported:v().optional()}).shape,...Os.pick({code_challenge_methods_supported:!0}).shape}),As=p({access_token:h(),id_token:h().optional(),token_type:h(),expires_in:Bn().optional(),scope:h().optional(),refresh_token:h().optional()}).strip(),js=p({error:h(),error_description:h().optional(),error_uri:h().optional()}),Ms=X.optional().or(f(``).transform(()=>void 0)),Ns=p({redirect_uris:s(X),token_endpoint_auth_method:h().optional(),grant_types:s(h()).optional(),response_types:s(h()).optional(),client_name:h().optional(),client_uri:X.optional(),logo_uri:Ms,scope:h().optional(),contacts:s(h()).optional(),tos_uri:Ms,policy_uri:h().optional(),jwks_uri:X.optional(),jwks:a().optional(),software_id:h().optional(),software_version:h().optional(),software_statement:h().optional()}).strip(),Ps=p({client_id:h(),client_secret:h().optional(),client_id_issued_at:n().optional(),client_secret_expires_at:n().optional()}).strip(),Fs=Ns.merge(Ps);p({error:h(),error_description:h().optional()}).strip(),p({token:h(),token_type_hint:h().optional()}).strip();function Is(e){let t=typeof e==`string`?new URL(e):new URL(e.href);return t.hash=``,t}function Ls({requestedResource:e,configuredResource:t}){let n=typeof e==`string`?new URL(e):new URL(e.href),r=typeof t==`string`?new URL(t):new URL(t.href);if(n.origin!==r.origin||n.pathname.length<r.pathname.length)return!1;let i=n.pathname.endsWith(`/`)?n.pathname:n.pathname+`/`,a=r.pathname.endsWith(`/`)?r.pathname:r.pathname+`/`;return i.startsWith(a)}var Z=class extends Error{constructor(e,t){super(e),this.errorUri=t,this.name=this.constructor.name}toResponseObject(){let e={error:this.errorCode,error_description:this.message};return this.errorUri&&(e.error_uri=this.errorUri),e}get errorCode(){return this.constructor.errorCode}},Rs=class extends Z{};Rs.errorCode=`invalid_request`;var zs=class extends Z{};zs.errorCode=`invalid_client`;var Bs=class extends Z{};Bs.errorCode=`invalid_grant`;var Vs=class extends Z{};Vs.errorCode=`unauthorized_client`;var Hs=class extends Z{};Hs.errorCode=`unsupported_grant_type`;var Us=class extends Z{};Us.errorCode=`invalid_scope`;var Ws=class extends Z{};Ws.errorCode=`access_denied`;var Gs=class extends Z{};Gs.errorCode=`server_error`;var Ks=class extends Z{};Ks.errorCode=`temporarily_unavailable`;var qs=class extends Z{};qs.errorCode=`unsupported_response_type`;var Js=class extends Z{};Js.errorCode=`unsupported_token_type`;var Ys=class extends Z{};Ys.errorCode=`invalid_token`;var Xs=class extends Z{};Xs.errorCode=`method_not_allowed`;var Zs=class extends Z{};Zs.errorCode=`too_many_requests`;var Qs=class extends Z{};Qs.errorCode=`invalid_client_metadata`;var $s=class extends Z{};$s.errorCode=`insufficient_scope`;var ec=class extends Z{};ec.errorCode=`invalid_target`;const tc={[Rs.errorCode]:Rs,[zs.errorCode]:zs,[Bs.errorCode]:Bs,[Vs.errorCode]:Vs,[Hs.errorCode]:Hs,[Us.errorCode]:Us,[Ws.errorCode]:Ws,[Gs.errorCode]:Gs,[Ks.errorCode]:Ks,[qs.errorCode]:qs,[Js.errorCode]:Js,[Ys.errorCode]:Ys,[Xs.errorCode]:Xs,[Zs.errorCode]:Zs,[Qs.errorCode]:Qs,[$s.errorCode]:$s,[ec.errorCode]:ec};var nc=class extends Error{constructor(e){super(e??`Unauthorized`)}};function rc(e){return[`client_secret_basic`,`client_secret_post`,`none`].includes(e)}const ic=`code`,ac=`S256`;function oc(e,t){let n=e.client_secret!==void 0;return`token_endpoint_auth_method`in e&&e.token_endpoint_auth_method&&rc(e.token_endpoint_auth_method)&&(t.length===0||t.includes(e.token_endpoint_auth_method))?e.token_endpoint_auth_method:t.length===0?n?`client_secret_basic`:`none`:n&&t.includes(`client_secret_basic`)?`client_secret_basic`:n&&t.includes(`client_secret_post`)?`client_secret_post`:t.includes(`none`)?`none`:n?`client_secret_post`:`none`}function sc(e,t,n,r){let{client_id:i,client_secret:a}=t;switch(e){case`client_secret_basic`:cc(i,a,n);return;case`client_secret_post`:lc(i,a,r);return;case`none`:uc(i,r);return;default:throw Error(`Unsupported client authentication method: ${e}`)}}function cc(e,t,n){if(!t)throw Error(`client_secret_basic authentication requires a client_secret`);let r=btoa(`${e}:${t}`);n.set(`Authorization`,`Basic ${r}`)}function lc(e,t,n){n.set(`client_id`,e),t&&n.set(`client_secret`,t)}function uc(e,t){t.set(`client_id`,e)}async function dc(e){let t=e instanceof Response?e.status:void 0,n=e instanceof Response?await e.text():e;try{let{error:e,error_description:t,error_uri:r}=js.parse(JSON.parse(n));return new(tc[e]||Gs)(t||``,r)}catch(e){return new Gs(`${t?`HTTP ${t}: `:``}Invalid OAuth error response: ${e}. Raw body: ${n}`)}}async function fc(e,t){try{return await pc(e,t)}catch(n){if(n instanceof zs||n instanceof Vs)return await e.invalidateCredentials?.(`all`),await pc(e,t);if(n instanceof Bs)return await e.invalidateCredentials?.(`tokens`),await pc(e,t);throw n}}async function pc(e,{serverUrl:t,authorizationCode:n,scope:r,resourceMetadataUrl:i,fetchFn:a}){let o=await e.discoveryState?.(),s,c,l,u=i;if(!u&&o?.resourceMetadataUrl&&(u=new URL(o.resourceMetadataUrl)),o?.authorizationServerUrl){if(c=o.authorizationServerUrl,s=o.resourceMetadata,l=o.authorizationServerMetadata??await Tc(c,{fetchFn:a}),!s)try{s=await vc(t,{resourceMetadataUrl:u},a)}catch{}(l!==o.authorizationServerMetadata||s!==o.resourceMetadata)&&await e.saveDiscoveryState?.({authorizationServerUrl:String(c),resourceMetadataUrl:u?.toString(),resourceMetadata:s,authorizationServerMetadata:l})}else{let n=await Ec(t,{resourceMetadataUrl:u,fetchFn:a});c=n.authorizationServerUrl,l=n.authorizationServerMetadata,s=n.resourceMetadata,await e.saveDiscoveryState?.({authorizationServerUrl:String(c),resourceMetadataUrl:u?.toString(),resourceMetadata:s,authorizationServerMetadata:l})}let d=await hc(t,e,s),f=r||s?.scopes_supported?.join(` `)||e.clientMetadata.scope,p=await Promise.resolve(e.clientInformation());if(!p){if(n!==void 0)throw Error(`Existing OAuth client information is required when exchanging an authorization code`);let t=l?.client_id_metadata_document_supported===!0,r=e.clientMetadataUrl;if(r&&!mc(r))throw new Qs(`clientMetadataUrl must be a valid HTTPS URL with a non-root pathname, got: ${r}`);if(t&&r)p={client_id:r},await e.saveClientInformation?.(p);else{if(!e.saveClientInformation)throw Error(`OAuth client information must be saveable for dynamic registration`);let t=await Mc(c,{metadata:l,clientMetadata:e.clientMetadata,scope:f,fetchFn:a});await e.saveClientInformation(t),p=t}}let m=!e.redirectUrl;if(n!==void 0||m){let t=await jc(e,c,{metadata:l,resource:d,authorizationCode:n,fetchFn:a});return await e.saveTokens(t),`AUTHORIZED`}let h=await e.tokens();if(h?.refresh_token)try{let t=await Ac(c,{metadata:l,clientInformation:p,refreshToken:h.refresh_token,resource:d,addClientAuthentication:e.addClientAuthentication,fetchFn:a});return await e.saveTokens(t),`AUTHORIZED`}catch(e){if(!(!(e instanceof Z)||e instanceof Gs))throw e}let g=e.state?await e.state():void 0,{authorizationUrl:_,codeVerifier:v}=await Dc(c,{metadata:l,clientInformation:p,state:g,redirectUrl:e.redirectUrl,scope:f,resource:d});return await e.saveCodeVerifier(v),await e.redirectToAuthorization(_),`REDIRECT`}function mc(e){if(!e)return!1;try{let t=new URL(e);return t.protocol===`https:`&&t.pathname!==`/`}catch{return!1}}async function hc(e,t,n){let r=Is(e);if(t.validateResourceURL)return await t.validateResourceURL(r,n?.resource);if(n){if(!Ls({requestedResource:r,configuredResource:n.resource}))throw Error(`Protected resource ${n.resource} does not match expected ${r} (or origin)`);return new URL(n.resource)}}function gc(e){let t=e.headers.get(`WWW-Authenticate`);if(!t)return{};let[n,r]=t.split(` `);if(n.toLowerCase()!==`bearer`||!r)return{};let i=_c(e,`resource_metadata`)||void 0,a;if(i)try{a=new URL(i)}catch{}let o=_c(e,`scope`)||void 0,s=_c(e,`error`)||void 0;return{resourceMetadataUrl:a,scope:o,error:s}}function _c(e,t){let n=e.headers.get(`WWW-Authenticate`);if(!n)return null;let r=RegExp(`${t}=(?:"([^"]+)"|([^\\s,]+))`),i=n.match(r);return i?i[1]||i[2]:null}async function vc(e,t,n=fetch){let r=await Cc(e,`oauth-protected-resource`,n,{protocolVersion:t?.protocolVersion,metadataUrl:t?.resourceMetadataUrl});if(!r||r.status===404)throw await r?.body?.cancel(),Error(`Resource server does not implement OAuth 2.0 Protected Resource Metadata.`);if(!r.ok)throw await r.body?.cancel(),Error(`HTTP ${r.status} trying to load well-known OAuth protected resource metadata.`);return Ds.parse(await r.json())}async function yc(e,t,n=fetch){try{return await n(e,{headers:t})}catch(r){if(r instanceof TypeError)return t?yc(e,void 0,n):void 0;throw r}}function bc(e,t=``,n={}){return t.endsWith(`/`)&&(t=t.slice(0,-1)),n.prependPathname?`${t}/.well-known/${e}`:`/.well-known/${e}${t}`}async function xc(e,t,n=fetch){return await yc(e,{"MCP-Protocol-Version":t},n)}function Sc(e,t){return!e||e.status>=400&&e.status<500&&t!==`/`}async function Cc(e,t,n,r){let i=new URL(e),a=r?.protocolVersion??`2025-11-25`,o;if(r?.metadataUrl)o=new URL(r.metadataUrl);else{let e=bc(t,i.pathname);o=new URL(e,r?.metadataServerUrl??i),o.search=i.search}let s=await xc(o,a,n);return!r?.metadataUrl&&Sc(s,i.pathname)&&(s=await xc(new URL(`/.well-known/${t}`,i),a,n)),s}function wc(e){let t=typeof e==`string`?new URL(e):e,n=t.pathname!==`/`,r=[];if(!n)return r.push({url:new URL(`/.well-known/oauth-authorization-server`,t.origin),type:`oauth`}),r.push({url:new URL(`/.well-known/openid-configuration`,t.origin),type:`oidc`}),r;let i=t.pathname;return i.endsWith(`/`)&&(i=i.slice(0,-1)),r.push({url:new URL(`/.well-known/oauth-authorization-server${i}`,t.origin),type:`oauth`}),r.push({url:new URL(`/.well-known/openid-configuration${i}`,t.origin),type:`oidc`}),r.push({url:new URL(`${i}/.well-known/openid-configuration`,t.origin),type:`oidc`}),r}async function Tc(e,{fetchFn:t=fetch,protocolVersion:n=Ie}={}){let r={"MCP-Protocol-Version":n,Accept:`application/json`},i=wc(e);for(let{url:e,type:n}of i){let i=await yc(e,r,t);if(i){if(!i.ok){if(await i.body?.cancel(),i.status>=400&&i.status<500)continue;throw Error(`HTTP ${i.status} trying to load ${n===`oauth`?`OAuth`:`OpenID provider`} metadata from ${e}`)}return n===`oauth`?Os.parse(await i.json()):ks.parse(await i.json())}}}async function Ec(e,t){let n,r;try{n=await vc(e,{resourceMetadataUrl:t?.resourceMetadataUrl},t?.fetchFn),n.authorization_servers&&n.authorization_servers.length>0&&(r=n.authorization_servers[0])}catch{}r||=String(new URL(`/`,e));let i=await Tc(r,{fetchFn:t?.fetchFn});return{authorizationServerUrl:r,authorizationServerMetadata:i,resourceMetadata:n}}async function Dc(e,{metadata:t,clientInformation:n,redirectUrl:r,scope:i,state:a,resource:o}){let s;if(t){if(s=new URL(t.authorization_endpoint),!t.response_types_supported.includes(ic))throw Error(`Incompatible auth server: does not support response type ${ic}`);if(t.code_challenge_methods_supported&&!t.code_challenge_methods_supported.includes(ac))throw Error(`Incompatible auth server: does not support code challenge method ${ac}`)}else s=new URL(`/authorize`,e);let c=await Es(),l=c.code_verifier,u=c.code_challenge;return s.searchParams.set(`response_type`,ic),s.searchParams.set(`client_id`,n.client_id),s.searchParams.set(`code_challenge`,u),s.searchParams.set(`code_challenge_method`,ac),s.searchParams.set(`redirect_uri`,String(r)),a&&s.searchParams.set(`state`,a),i&&s.searchParams.set(`scope`,i),i?.includes(`offline_access`)&&s.searchParams.append(`prompt`,`consent`),o&&s.searchParams.set(`resource`,o.href),{authorizationUrl:s,codeVerifier:l}}function Oc(e,t,n){return new URLSearchParams({grant_type:`authorization_code`,code:e,code_verifier:t,redirect_uri:String(n)})}async function kc(e,{metadata:t,tokenRequestParams:n,clientInformation:r,addClientAuthentication:i,resource:a,fetchFn:o}){let s=t?.token_endpoint?new URL(t.token_endpoint):new URL(`/token`,e),c=new Headers({"Content-Type":`application/x-www-form-urlencoded`,Accept:`application/json`});a&&n.set(`resource`,a.href),i?await i(c,n,s,t):r&&sc(oc(r,t?.token_endpoint_auth_methods_supported??[]),r,c,n);let l=await(o??fetch)(s,{method:`POST`,headers:c,body:n});if(!l.ok)throw await dc(l);return As.parse(await l.json())}async function Ac(e,{metadata:t,clientInformation:n,refreshToken:r,resource:i,addClientAuthentication:a,fetchFn:o}){return{refresh_token:r,...await kc(e,{metadata:t,tokenRequestParams:new URLSearchParams({grant_type:`refresh_token`,refresh_token:r}),clientInformation:n,addClientAuthentication:a,resource:i,fetchFn:o})}}async function jc(e,t,{metadata:n,resource:r,authorizationCode:i,fetchFn:a}={}){let o=e.clientMetadata.scope,s;if(e.prepareTokenRequest&&(s=await e.prepareTokenRequest(o)),!s){if(!i)throw Error(`Either provider.prepareTokenRequest() or authorizationCode is required`);if(!e.redirectUrl)throw Error(`redirectUrl is required for authorization_code flow`);s=Oc(i,await e.codeVerifier(),e.redirectUrl)}let c=await e.clientInformation();return kc(t,{metadata:n,tokenRequestParams:s,clientInformation:c??void 0,addClientAuthentication:e.addClientAuthentication,resource:r,fetchFn:a})}async function Mc(e,{metadata:t,clientMetadata:n,scope:r,fetchFn:i}){let a;if(t){if(!t.registration_endpoint)throw Error(`Incompatible auth server: does not support dynamic client registration`);a=new URL(t.registration_endpoint)}else a=new URL(`/register`,e);let o=await(i??fetch)(a,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({...n,...r===void 0?{}:{scope:r}})});if(!o.ok)throw await dc(o);return Fs.parse(await o.json())}var Nc=class extends Error{constructor(e,t){super(e),this.name=`ParseError`,this.type=t.type,this.field=t.field,this.value=t.value,this.line=t.line}};function Pc(e){}function Fc(e){if(typeof e==`function`)throw TypeError("`callbacks` must be an object, got a function instead. Did you mean `{onEvent: fn}`?");let{onEvent:t=Pc,onError:n=Pc,onRetry:r=Pc,onComment:i}=e,a=``,o=!0,s,c=``,l=``;function u(e){let t=o?e.replace(/^\xEF\xBB\xBF/,``):e,[n,r]=Ic(`${a}${t}`);for(let e of n)d(e);a=r,o=!1}function d(e){if(e===``){p();return}if(e.startsWith(`:`)){i&&i(e.slice(e.startsWith(`: `)?2:1));return}let t=e.indexOf(`:`);if(t!==-1){let n=e.slice(0,t),r=e[t+1]===` `?2:1;f(n,e.slice(t+r),e);return}f(e,``,e)}function f(e,t,i){switch(e){case`event`:l=t;break;case`data`:c=`${c}${t}
65
+ `;break;case`id`:s=t.includes(`\0`)?void 0:t;break;case`retry`:/^\d+$/.test(t)?r(parseInt(t,10)):n(new Nc(`Invalid \`retry\` value: "${t}"`,{type:`invalid-retry`,value:t,line:i}));break;default:n(new Nc(`Unknown field "${e.length>20?`${e.slice(0,20)}\u2026`:e}"`,{type:`unknown-field`,field:e,value:t,line:i}));break}}function p(){c.length>0&&t({id:s,event:l||void 0,data:c.endsWith(`
66
+ `)?c.slice(0,-1):c}),s=void 0,c=``,l=``}function m(e={}){a&&e.consume&&d(a),o=!0,s=void 0,c=``,l=``,a=``}return{feed:u,reset:m}}function Ic(e){let t=[],n=``,r=0;for(;r<e.length;){let i=e.indexOf(`\r`,r),a=e.indexOf(`
68
67
  `,r),o=-1;if(i!==-1&&a!==-1?o=Math.min(i,a):i===-1?a!==-1&&(o=a):o=i===e.length-1?-1:i,o===-1){n=e.slice(r);break}else{let n=e.slice(r,o);t.push(n),r=o+1,e[r-1]===`\r`&&e[r]===`
69
- `&&r++}}return[t,n]}var Ic=class extends TransformStream{constructor({onError:e,onRetry:t,onComment:n}={}){let r;super({start(i){r=Pc({onEvent:e=>{i.enqueue(e)},onError(t){e===`terminate`?i.error(t):typeof e==`function`&&e(t)},onRetry:t,onComment:n})},transform(e){r.feed(e)}})}};const Lc={initialReconnectionDelay:1e3,maxReconnectionDelay:3e4,reconnectionDelayGrowFactor:1.5,maxRetries:2};var Rc=class extends Error{constructor(e,t){super(`Streamable HTTP error: ${t}`),this.code=e}},zc=class{constructor(e,t){this._hasCompletedAuthFlow=!1,this._url=e,this._resourceMetadataUrl=void 0,this._scope=void 0,this._requestInit=t?.requestInit,this._authProvider=t?.authProvider,this._fetch=t?.fetch,this._fetchWithInit=ys(t?.fetch,t?.requestInit),this._sessionId=t?.sessionId,this._reconnectionOptions=t?.reconnectionOptions??Lc}async _authThenStart(){if(!this._authProvider)throw new tc(`No auth provider`);let e;try{e=await dc(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})}catch(e){throw this.onerror?.(e),e}if(e!==`AUTHORIZED`)throw new tc;return await this._startOrAuthSse({resumptionToken:void 0})}async _commonHeaders(){let e={};if(this._authProvider){let t=await this._authProvider.tokens();t&&(e.Authorization=`Bearer ${t.access_token}`)}this._sessionId&&(e[`mcp-session-id`]=this._sessionId),this._protocolVersion&&(e[`mcp-protocol-version`]=this._protocolVersion);let t=vs(this._requestInit?.headers);return new Headers({...e,...t})}async _startOrAuthSse(e){let{resumptionToken:t}=e;try{let n=await this._commonHeaders();n.set(`Accept`,`text/event-stream`),t&&n.set(`last-event-id`,t);let r=await(this._fetch??fetch)(this._url,{method:`GET`,headers:n,signal:this._abortController?.signal});if(!r.ok){if(await r.body?.cancel(),r.status===401&&this._authProvider)return await this._authThenStart();if(r.status===405)return;throw new Rc(r.status,`Failed to open SSE stream: ${r.statusText}`)}this._handleSseStream(r.body,e,!0)}catch(e){throw this.onerror?.(e),e}}_getNextReconnectionDelay(e){if(this._serverRetryMs!==void 0)return this._serverRetryMs;let t=this._reconnectionOptions.initialReconnectionDelay,n=this._reconnectionOptions.reconnectionDelayGrowFactor,r=this._reconnectionOptions.maxReconnectionDelay;return Math.min(t*n**+e,r)}_scheduleReconnection(e,t=0){let n=this._reconnectionOptions.maxRetries;if(t>=n){this.onerror?.(Error(`Maximum reconnection attempts (${n}) exceeded.`));return}let r=this._getNextReconnectionDelay(t);this._reconnectionTimeout=setTimeout(()=>{this._startOrAuthSse(e).catch(n=>{this.onerror?.(Error(`Failed to reconnect SSE stream: ${n instanceof Error?n.message:String(n)}`)),this._scheduleReconnection(e,t+1)})},r)}_handleSseStream(e,t,n){if(!e)return;let{onresumptiontoken:r,replayMessageId:i}=t,a,o=!1,s=!1;(async()=>{try{let t=e.pipeThrough(new TextDecoderStream).pipeThrough(new Ic({onRetry:e=>{this._serverRetryMs=e}})).getReader();for(;;){let{value:e,done:n}=await t.read();if(n)break;if(e.id&&(a=e.id,o=!0,r?.(e.id)),e.data&&(!e.event||e.event===`message`))try{let t=Ne.parse(JSON.parse(e.data));Ee(t)&&(s=!0,i!==void 0&&(t.id=i)),this.onmessage?.(t)}catch(e){this.onerror?.(e)}}(n||o)&&!s&&this._abortController&&!this._abortController.signal.aborted&&this._scheduleReconnection({resumptionToken:a,onresumptiontoken:r,replayMessageId:i},0)}catch(e){if(this.onerror?.(Error(`SSE stream disconnected: ${e}`)),(n||o)&&!s&&this._abortController&&!this._abortController.signal.aborted)try{this._scheduleReconnection({resumptionToken:a,onresumptiontoken:r,replayMessageId:i},0)}catch(e){this.onerror?.(Error(`Failed to reconnect: ${e instanceof Error?e.message:String(e)}`))}}})()}async start(){if(this._abortController)throw Error(`StreamableHTTPClientTransport already started! If using Client class, note that connect() calls start() automatically.`);this._abortController=new AbortController}async finishAuth(e){if(!this._authProvider)throw new tc(`No auth provider`);if(await dc(this._authProvider,{serverUrl:this._url,authorizationCode:e,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})!==`AUTHORIZED`)throw new tc(`Failed to authorize`)}async close(){this._reconnectionTimeout&&=(clearTimeout(this._reconnectionTimeout),void 0),this._abortController?.abort(),this.onclose?.()}async send(e,t){try{let{resumptionToken:n,onresumptiontoken:r}=t||{};if(n){this._startOrAuthSse({resumptionToken:n,replayMessageId:ht(e)?e.id:void 0}).catch(e=>this.onerror?.(e));return}let i=await this._commonHeaders();i.set(`content-type`,`application/json`),i.set(`accept`,`application/json, text/event-stream`);let a={...this._requestInit,method:`POST`,headers:i,body:JSON.stringify(e),signal:this._abortController?.signal},o=await(this._fetch??fetch)(this._url,a),s=o.headers.get(`mcp-session-id`);if(s&&(this._sessionId=s),!o.ok){let t=await o.text().catch(()=>null);if(o.status===401&&this._authProvider){if(this._hasCompletedAuthFlow)throw new Rc(401,`Server returned 401 after successful authentication`);let{resourceMetadataUrl:t,scope:n}=hc(o);if(this._resourceMetadataUrl=t,this._scope=n,await dc(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})!==`AUTHORIZED`)throw new tc;return this._hasCompletedAuthFlow=!0,this.send(e)}if(o.status===403&&this._authProvider){let{resourceMetadataUrl:t,scope:n,error:r}=hc(o);if(r===`insufficient_scope`){let r=o.headers.get(`WWW-Authenticate`);if(this._lastUpscopingHeader===r)throw new Rc(403,`Server returned 403 after trying upscoping`);if(n&&(this._scope=n),t&&(this._resourceMetadataUrl=t),this._lastUpscopingHeader=r??void 0,await dc(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetch})!==`AUTHORIZED`)throw new tc;return this.send(e)}}throw new Rc(o.status,`Error POSTing to endpoint: ${t}`)}if(this._hasCompletedAuthFlow=!1,this._lastUpscopingHeader=void 0,o.status===202){await o.body?.cancel(),Ve(e)&&this._startOrAuthSse({resumptionToken:void 0}).catch(e=>this.onerror?.(e));return}let c=(Array.isArray(e)?e:[e]).filter(e=>`method`in e&&`id`in e&&e.id!==void 0).length>0,l=o.headers.get(`content-type`);if(c)if(l?.includes(`text/event-stream`))this._handleSseStream(o.body,{onresumptiontoken:r},!1);else if(l?.includes(`application/json`)){let e=await o.json(),t=Array.isArray(e)?e.map(e=>Ne.parse(e)):[Ne.parse(e)];for(let e of t)this.onmessage?.(e)}else throw await o.body?.cancel(),new Rc(-1,`Unexpected content type: ${l}`);else await o.body?.cancel()}catch(e){throw this.onerror?.(e),e}}get sessionId(){return this._sessionId}async terminateSession(){if(this._sessionId)try{let e=await this._commonHeaders(),t={...this._requestInit,method:`DELETE`,headers:e,signal:this._abortController?.signal},n=await(this._fetch??fetch)(this._url,t);if(await n.body?.cancel(),!n.ok&&n.status!==405)throw new Rc(n.status,`Failed to terminate session: ${n.statusText}`);this._sessionId=void 0}catch(e){throw this.onerror?.(e),e}}setProtocolVersion(e){this._protocolVersion=e}get protocolVersion(){return this._protocolVersion}async resumeStream(e,t){await this._startOrAuthSse({resumptionToken:e,onresumptiontoken:t?.onresumptiontoken})}};function Bc(e){return(t,n)=>{if((n?.method??`GET`).toUpperCase()===`GET`)return globalThis.fetch(t,n);let r=new AbortController,i=setTimeout(()=>r.abort(Error(`MCP request timed out after ${e}ms`)),e),a=n?.signal instanceof AbortSignal?AbortSignal.any([n.signal,r.signal]):r.signal;return globalThis.fetch(t,{...n,signal:a}).finally(()=>clearTimeout(i))}}function Vc(e){if(e===void 0||e===``)return;let t=Number.parseInt(e,10);if(!(Number.isNaN(t)||t<=0))return t}function Hc(e){return e===`0.0.0.0`||e===`::`?`localhost`:e.includes(`:`)&&!e.startsWith(`[`)?`[${e}]`:e}function Uc(e,t){return`http://${Hc(e)}:${t}/mcp`}function Wc(e,t){return`ws://${Hc(e)}:${t}`}function Gc(e){let t=new URL(e);return t.protocol=t.protocol===`https:`?`wss:`:`ws:`,t.pathname=``,t.search=``,t.hash=``,t.toString().replace(/\/$/,``)}function Kc(e,t){if(!(!e||e.port<=0)&&t(e.pid))return e.port}function qc(e){return P(e)?I(e,`utf-8`).trim():``}function Jc(e,t){return`server did not start within ${e}ms${t?` stderr:\n${t}`:``}`}function Yc(e){if(e&&typeof e==`object`&&`method`in e&&`id`in e)return e.id}function Xc(e){if(!e||typeof e!=`object`||!(`result`in e))return;let t=e.result;if(!t||typeof t!=`object`||!(`protocolVersion`in t))return;let n=t.protocolVersion;return typeof n==`string`?n:void 0}function Zc(e,t){return{jsonrpc:`2.0`,id:e,error:{code:-32e3,message:t instanceof Error?t.message:String(t)}}}async function Qc(e){let t=e.readLock??(()=>m(e.lockDir)),n=e.isAlive??y,r=e.sleep??(e=>vn(e)),i=e.spawn??M,a=e.readErrorLog??qc,o=e.openErrorLog??(e=>Ut(e,`w`)),s=e.closeFd??Rt,c=e.timeoutMs??5e3,l=e.pollIntervalMs??100;if(e.portOverride!==void 0){let t=Number.parseInt(e.portOverride,10);if(Number.isNaN(t)||t<=0)throw Error(`invalid --port value '${e.portOverride}' — HTTP MCP shim requires a positive port`);return Uc(`localhost`,t)}let u=Kc(t(),n);if(u!==void 0)return Uc(`localhost`,u);if(e.envAutoStart===`0`)throw Error(`Open Knowledge server is not running and OK_MCP_AUTOSTART=0 disables auto-start.`);P(e.lockDir)||F(e.lockDir,{recursive:!0});let d=z(e.lockDir,ee),f=o(d),p,h,g=Ot();try{try{p=i(g.command,[...g.prefixArgs,`start`],{detached:!0,stdio:[`ignore`,`ignore`,f],cwd:e.contentDir,env:{...process.env,OK_LOCK_KIND:`mcp-spawned`,ELECTRON_RUN_AS_NODE:`1`}}),p.on(`error`,e=>{h=e instanceof Error?e.message:String(e)}),p.unref()}catch(e){h=e instanceof Error?e.message:String(e)}}finally{try{s(f)}catch{}}let _=Date.now()+c;for(;Date.now()<_;){if(h){let e=a(d),t=e?` stderr:\n${e}`:``;throw Error(`spawn failed: ${h}${t}`)}await r(l);let e=Kc(t(),n);if(e!==void 0)return Uc(`localhost`,e)}if(h){let e=a(d),t=e?` stderr:\n${e}`:``;throw Error(`spawn failed: ${h}${t}`)}throw Error(Jc(c,a(d)))}function $c(e,t){if(e.portOverride!==void 0)return Gc(t);let n=e.readLock??(()=>m(e.lockDir)),r=e.isAlive??y,i=Kc(n(),r);if(i!==void 0)return Wc(`localhost`,i)}async function el(e,t={}){let n=t.stderr??process.stderr,r=t.requestTimeoutMs??12e4,a=t.createStdioTransport?t.createStdioTransport(t.stdin,t.stdout):new fs(t.stdin,t.stdout),o=t.createHttpTransport?t.createHttpTransport(new URL(e)):new zc(new URL(e),{fetch:Bc(r),requestInit:{headers:{...i({kind:`mcp`,runtimeVersion:_}),...t.connectionId===void 0?{}:{[ze]:t.connectionId}}}}),s=!1,c=async()=>{s||(s=!0,t.onclose?.(),await Promise.allSettled([a.close(),o.close()]))};a.onerror=e=>{n.write(`[mcp-shim] stdio error: ${e.message}\n`)},o.onerror=e=>{n.write(`[mcp-shim] HTTP transport error: ${e.message}\n`)},a.onclose=()=>{c()},o.onclose=()=>{c()};let l=Promise.resolve();a.onmessage=e=>{l=l.then(async()=>{try{await o.send(e)}catch(t){let r=Yc(e);if(r===void 0){n.write(`[mcp-shim] failed to forward stdio notification: ${t instanceof Error?t.message:String(t)}\n`);return}await a.send(Zc(r,t)).catch(e=>{n.write(`[mcp-shim] failed to write stdio error response: ${e instanceof Error?e.message:String(e)}\n`)})}}).catch(e=>{n.write(`[mcp-shim] unexpected stdio forwarding failure: ${e instanceof Error?e.message:String(e)}\n`)})},o.onmessage=e=>{let t=Xc(e);t&&o.setProtocolVersion?.(t),a.send(e).catch(e=>{n.write(`[mcp-shim] failed to write stdio response: ${e instanceof Error?e.message:String(e)}\n`)})};try{await o.start(),await a.start()}catch(e){throw await c(),e}return{close:c}}async function tl(e){let t=e.stderr??process.stderr,n=e.bridgeFn??el,r=await Qc(e),i=e.createConnectionId?.()??gn(),a=!1,o=(e.startKeepalive??cs)({connectionId:i,resolveWsUrl:async()=>$c(e,r),log:e=>t.write(`[mcp-shim] keepalive: ${e}\n`)});t.write(`[mcp-shim] proxying stdio to ${r}\n`);let s;try{s=await n(r,{stderr:t,connectionId:i,onclose:()=>{a||(o.close(),process.exit(0))}})}catch(e){throw o.close(),e}let c=()=>{a=!0,o.close(),s.close().finally(()=>{process.exit(0)})};process.once(`SIGINT`,c),process.once(`SIGTERM`,c)}const nl=un(import.meta.url);function rl(e){let t=B(e);for(;;){if(Fe(t))return t;let n=Xt(t);if(n===t)throw Error(`No Open Knowledge project found at or above ${e}. Pass an explicit \`cwd\` argument that points inside an OK project (a directory with a \`${g}\`).`);t=n}}function il(e){try{let t=new URL(e);return t.protocol===`file:`?un(t):void 0}catch{return}}async function al(e){if(!e.getClientCapabilities()?.roots)return;let t;try{t=await e.listRoots()}catch(t){e.log?.(`listRoots fallback failed: ${t instanceof Error?t.message:String(t)}`);return}let n=t.roots??[];if(n.length!==1)return;let r=il(n[0].uri);return r===void 0&&e.log?.(`single root URI not usable as fs path: ${n[0].uri}`),r}async function ol(e,t){if(e!==void 0)return rl(e);let n=await t();if(n!==void 0)return rl(n);throw Error("`cwd` is required for tool calls against the global MCP server. Pass an absolute path inside an Open Knowledge project, or have the MCP client advertise a single root.")}async function sl(e){let t=process.stderr,n=e.spawnTimeoutMs??Vc(process.env.OK_MCP_SPAWN_TIMEOUT_MS),r=e.envAutoStart??process.env.OK_MCP_AUTOSTART,i=Dt({startupCwd:e.startupCwd,startupConfig:e.startupConfig}),a=new Ae({name:Be,version:_},{instructions:Oe({dir:`.`})});je(a);let o=gn(),s={current:{connectionId:o,displayName:o,colorSeed:o}},c=new Map,l=e=>{if(c.has(e))return;let n=mt(e),r=s.current,i=cs({connectionId:o,displayName:r.displayName,clientName:r.clientInfo?.name??r.displayName,colorSeed:r.colorSeed,resolveWsUrl:async()=>$c({lockDir:n,contentDir:e},``),log:n=>t.write(`[mcp] keepalive[${e}]: ${n}\n`)});c.set(e,i)},u=()=>al({getClientCapabilities:()=>a.server.getClientCapabilities(),listRoots:()=>a.server.listRoots(),log:e=>t.write(`[mcp] ${e}\n`)}),d=e=>ol(e,u),f=async e=>{let t;if(e===void 0){let e=await u();if(e===void 0)return;t=rl(e)}else t=rl(e);let a=await i(t),o=await Qc({lockDir:mt(t),contentDir:Re(a,t),envAutoStart:r,...n===void 0?{}:{timeoutMs:n}});return l(t),o.replace(/\/mcp$/,``)};a.server.oninitialized=()=>{let e=a.server.getClientVersion(),t=Je(e?.name,o);s.current={connectionId:o,clientInfo:e?{name:t,version:e.version}:void 0,displayName:t,colorSeed:t}},ke(a,{serverUrl:f,resolveCwd:d,config:i,identityRef:s});let p=new fs,m=!1,h,g,v=async()=>{if(m)return;m=!0,h?.stop(),g?.stop();for(let e of c.values())try{e.close()}catch(e){t.write(`[mcp] keepalive close error: ${e instanceof Error?e.message:String(e)}\n`)}c.clear();let e=await Promise.allSettled([a.close(),p.close()]);for(let n of e)if(n.status===`rejected`){let e=n.reason;t.write(`[mcp] shutdown close error: ${e instanceof Error?e.message:String(e)}\n`)}};await a.connect(p),t.write(`[mcp] global stdio server ready (per-call project routing)
68
+ `&&r++}}return[t,n]}var Lc=class extends TransformStream{constructor({onError:e,onRetry:t,onComment:n}={}){let r;super({start(i){r=Fc({onEvent:e=>{i.enqueue(e)},onError(t){e===`terminate`?i.error(t):typeof e==`function`&&e(t)},onRetry:t,onComment:n})},transform(e){r.feed(e)}})}};const Rc={initialReconnectionDelay:1e3,maxReconnectionDelay:3e4,reconnectionDelayGrowFactor:1.5,maxRetries:2};var zc=class extends Error{constructor(e,t){super(`Streamable HTTP error: ${t}`),this.code=e}},Bc=class{constructor(e,t){this._hasCompletedAuthFlow=!1,this._url=e,this._resourceMetadataUrl=void 0,this._scope=void 0,this._requestInit=t?.requestInit,this._authProvider=t?.authProvider,this._fetch=t?.fetch,this._fetchWithInit=bs(t?.fetch,t?.requestInit),this._sessionId=t?.sessionId,this._reconnectionOptions=t?.reconnectionOptions??Rc}async _authThenStart(){if(!this._authProvider)throw new nc(`No auth provider`);let e;try{e=await fc(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})}catch(e){throw this.onerror?.(e),e}if(e!==`AUTHORIZED`)throw new nc;return await this._startOrAuthSse({resumptionToken:void 0})}async _commonHeaders(){let e={};if(this._authProvider){let t=await this._authProvider.tokens();t&&(e.Authorization=`Bearer ${t.access_token}`)}this._sessionId&&(e[`mcp-session-id`]=this._sessionId),this._protocolVersion&&(e[`mcp-protocol-version`]=this._protocolVersion);let t=ys(this._requestInit?.headers);return new Headers({...e,...t})}async _startOrAuthSse(e){let{resumptionToken:t}=e;try{let n=await this._commonHeaders();n.set(`Accept`,`text/event-stream`),t&&n.set(`last-event-id`,t);let r=await(this._fetch??fetch)(this._url,{method:`GET`,headers:n,signal:this._abortController?.signal});if(!r.ok){if(await r.body?.cancel(),r.status===401&&this._authProvider)return await this._authThenStart();if(r.status===405)return;throw new zc(r.status,`Failed to open SSE stream: ${r.statusText}`)}this._handleSseStream(r.body,e,!0)}catch(e){throw this.onerror?.(e),e}}_getNextReconnectionDelay(e){if(this._serverRetryMs!==void 0)return this._serverRetryMs;let t=this._reconnectionOptions.initialReconnectionDelay,n=this._reconnectionOptions.reconnectionDelayGrowFactor,r=this._reconnectionOptions.maxReconnectionDelay;return Math.min(t*n**+e,r)}_scheduleReconnection(e,t=0){let n=this._reconnectionOptions.maxRetries;if(t>=n){this.onerror?.(Error(`Maximum reconnection attempts (${n}) exceeded.`));return}let r=this._getNextReconnectionDelay(t);this._reconnectionTimeout=setTimeout(()=>{this._startOrAuthSse(e).catch(n=>{this.onerror?.(Error(`Failed to reconnect SSE stream: ${n instanceof Error?n.message:String(n)}`)),this._scheduleReconnection(e,t+1)})},r)}_handleSseStream(e,t,n){if(!e)return;let{onresumptiontoken:r,replayMessageId:i}=t,a,o=!1,s=!1;(async()=>{try{let t=e.pipeThrough(new TextDecoderStream).pipeThrough(new Lc({onRetry:e=>{this._serverRetryMs=e}})).getReader();for(;;){let{value:e,done:n}=await t.read();if(n)break;if(e.id&&(a=e.id,o=!0,r?.(e.id)),e.data&&(!e.event||e.event===`message`))try{let t=Ne.parse(JSON.parse(e.data));Ee(t)&&(s=!0,i!==void 0&&(t.id=i)),this.onmessage?.(t)}catch(e){this.onerror?.(e)}}(n||o)&&!s&&this._abortController&&!this._abortController.signal.aborted&&this._scheduleReconnection({resumptionToken:a,onresumptiontoken:r,replayMessageId:i},0)}catch(e){if(this.onerror?.(Error(`SSE stream disconnected: ${e}`)),(n||o)&&!s&&this._abortController&&!this._abortController.signal.aborted)try{this._scheduleReconnection({resumptionToken:a,onresumptiontoken:r,replayMessageId:i},0)}catch(e){this.onerror?.(Error(`Failed to reconnect: ${e instanceof Error?e.message:String(e)}`))}}})()}async start(){if(this._abortController)throw Error(`StreamableHTTPClientTransport already started! If using Client class, note that connect() calls start() automatically.`);this._abortController=new AbortController}async finishAuth(e){if(!this._authProvider)throw new nc(`No auth provider`);if(await fc(this._authProvider,{serverUrl:this._url,authorizationCode:e,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})!==`AUTHORIZED`)throw new nc(`Failed to authorize`)}async close(){this._reconnectionTimeout&&=(clearTimeout(this._reconnectionTimeout),void 0),this._abortController?.abort(),this.onclose?.()}async send(e,t){try{let{resumptionToken:n,onresumptiontoken:r}=t||{};if(n){this._startOrAuthSse({resumptionToken:n,replayMessageId:ht(e)?e.id:void 0}).catch(e=>this.onerror?.(e));return}let i=await this._commonHeaders();i.set(`content-type`,`application/json`),i.set(`accept`,`application/json, text/event-stream`);let a={...this._requestInit,method:`POST`,headers:i,body:JSON.stringify(e),signal:this._abortController?.signal},o=await(this._fetch??fetch)(this._url,a),s=o.headers.get(`mcp-session-id`);if(s&&(this._sessionId=s),!o.ok){let t=await o.text().catch(()=>null);if(o.status===401&&this._authProvider){if(this._hasCompletedAuthFlow)throw new zc(401,`Server returned 401 after successful authentication`);let{resourceMetadataUrl:t,scope:n}=gc(o);if(this._resourceMetadataUrl=t,this._scope=n,await fc(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})!==`AUTHORIZED`)throw new nc;return this._hasCompletedAuthFlow=!0,this.send(e)}if(o.status===403&&this._authProvider){let{resourceMetadataUrl:t,scope:n,error:r}=gc(o);if(r===`insufficient_scope`){let r=o.headers.get(`WWW-Authenticate`);if(this._lastUpscopingHeader===r)throw new zc(403,`Server returned 403 after trying upscoping`);if(n&&(this._scope=n),t&&(this._resourceMetadataUrl=t),this._lastUpscopingHeader=r??void 0,await fc(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetch})!==`AUTHORIZED`)throw new nc;return this.send(e)}}throw new zc(o.status,`Error POSTing to endpoint: ${t}`)}if(this._hasCompletedAuthFlow=!1,this._lastUpscopingHeader=void 0,o.status===202){await o.body?.cancel(),Ve(e)&&this._startOrAuthSse({resumptionToken:void 0}).catch(e=>this.onerror?.(e));return}let c=(Array.isArray(e)?e:[e]).filter(e=>`method`in e&&`id`in e&&e.id!==void 0).length>0,l=o.headers.get(`content-type`);if(c)if(l?.includes(`text/event-stream`))this._handleSseStream(o.body,{onresumptiontoken:r},!1);else if(l?.includes(`application/json`)){let e=await o.json(),t=Array.isArray(e)?e.map(e=>Ne.parse(e)):[Ne.parse(e)];for(let e of t)this.onmessage?.(e)}else throw await o.body?.cancel(),new zc(-1,`Unexpected content type: ${l}`);else await o.body?.cancel()}catch(e){throw this.onerror?.(e),e}}get sessionId(){return this._sessionId}async terminateSession(){if(this._sessionId)try{let e=await this._commonHeaders(),t={...this._requestInit,method:`DELETE`,headers:e,signal:this._abortController?.signal},n=await(this._fetch??fetch)(this._url,t);if(await n.body?.cancel(),!n.ok&&n.status!==405)throw new zc(n.status,`Failed to terminate session: ${n.statusText}`);this._sessionId=void 0}catch(e){throw this.onerror?.(e),e}}setProtocolVersion(e){this._protocolVersion=e}get protocolVersion(){return this._protocolVersion}async resumeStream(e,t){await this._startOrAuthSse({resumptionToken:e,onresumptiontoken:t?.onresumptiontoken})}};function Vc(e){return(t,n)=>{if((n?.method??`GET`).toUpperCase()===`GET`)return globalThis.fetch(t,n);let r=new AbortController,i=setTimeout(()=>r.abort(Error(`MCP request timed out after ${e}ms`)),e),a=n?.signal instanceof AbortSignal?AbortSignal.any([n.signal,r.signal]):r.signal;return globalThis.fetch(t,{...n,signal:a}).finally(()=>clearTimeout(i))}}function Hc(e){if(e===void 0||e===``)return;let t=Number.parseInt(e,10);if(!(Number.isNaN(t)||t<=0))return t}function Uc(e){return e===`0.0.0.0`||e===`::`?`localhost`:e.includes(`:`)&&!e.startsWith(`[`)?`[${e}]`:e}function Wc(e,t){return`http://${Uc(e)}:${t}/mcp`}function Gc(e,t){return`ws://${Uc(e)}:${t}`}function Kc(e){let t=new URL(e);return t.protocol=t.protocol===`https:`?`wss:`:`ws:`,t.pathname=``,t.search=``,t.hash=``,t.toString().replace(/\/$/,``)}function qc(e,t){if(!(!e||e.port<=0)&&t(e.pid))return e.port}function Jc(e){return P(e)?I(e,`utf-8`).trim():``}function Yc(e,t){return`server did not start within ${e}ms${t?` stderr:\n${t}`:``}`}function Xc(e){if(e&&typeof e==`object`&&`method`in e&&`id`in e)return e.id}function Zc(e){if(!e||typeof e!=`object`||!(`result`in e))return;let t=e.result;if(!t||typeof t!=`object`||!(`protocolVersion`in t))return;let n=t.protocolVersion;return typeof n==`string`?n:void 0}function Qc(e,t){return{jsonrpc:`2.0`,id:e,error:{code:-32e3,message:t instanceof Error?t.message:String(t)}}}async function $c(e){let t=e.readLock??(()=>m(e.lockDir)),n=e.isAlive??y,r=e.sleep??(e=>vn(e)),i=e.spawn??M,a=e.readErrorLog??Jc,o=e.openErrorLog??(e=>Ut(e,`w`)),s=e.closeFd??Rt,c=e.timeoutMs??5e3,l=e.pollIntervalMs??100;if(e.portOverride!==void 0){let t=Number.parseInt(e.portOverride,10);if(Number.isNaN(t)||t<=0)throw Error(`invalid --port value '${e.portOverride}' — HTTP MCP shim requires a positive port`);return Wc(`localhost`,t)}let u=qc(t(),n);if(u!==void 0)return Wc(`localhost`,u);if(e.envAutoStart===`0`)throw Error(`Open Knowledge server is not running and OK_MCP_AUTOSTART=0 disables auto-start.`);P(e.lockDir)||F(e.lockDir,{recursive:!0});let d=z(e.lockDir,ee),f=o(d),p,h,g=Ot();try{try{p=i(g.command,[...g.prefixArgs,`start`],{detached:!0,stdio:[`ignore`,`ignore`,f],cwd:e.contentDir,env:{...process.env,OK_LOCK_KIND:`mcp-spawned`,ELECTRON_RUN_AS_NODE:`1`}}),p.on(`error`,e=>{h=e instanceof Error?e.message:String(e)}),p.unref()}catch(e){h=e instanceof Error?e.message:String(e)}}finally{try{s(f)}catch{}}let _=Date.now()+c;for(;Date.now()<_;){if(h){let e=a(d),t=e?` stderr:\n${e}`:``;throw Error(`spawn failed: ${h}${t}`)}await r(l);let e=qc(t(),n);if(e!==void 0)return Wc(`localhost`,e)}if(h){let e=a(d),t=e?` stderr:\n${e}`:``;throw Error(`spawn failed: ${h}${t}`)}throw Error(Yc(c,a(d)))}function el(e,t){if(e.portOverride!==void 0)return Kc(t);let n=e.readLock??(()=>m(e.lockDir)),r=e.isAlive??y,i=qc(n(),r);if(i!==void 0)return Gc(`localhost`,i)}async function tl(e,t={}){let n=t.stderr??process.stderr,r=t.requestTimeoutMs??12e4,a=t.createStdioTransport?t.createStdioTransport(t.stdin,t.stdout):new ps(t.stdin,t.stdout),o=t.createHttpTransport?t.createHttpTransport(new URL(e)):new Bc(new URL(e),{fetch:Vc(r),requestInit:{headers:{...i({kind:`mcp`,runtimeVersion:_}),...t.connectionId===void 0?{}:{[ze]:t.connectionId}}}}),s=!1,c=async()=>{s||(s=!0,t.onclose?.(),await Promise.allSettled([a.close(),o.close()]))};a.onerror=e=>{n.write(`[mcp-shim] stdio error: ${e.message}\n`)},o.onerror=e=>{n.write(`[mcp-shim] HTTP transport error: ${e.message}\n`)},a.onclose=()=>{c()},o.onclose=()=>{c()};let l=Promise.resolve();a.onmessage=e=>{l=l.then(async()=>{try{await o.send(e)}catch(t){let r=Xc(e);if(r===void 0){n.write(`[mcp-shim] failed to forward stdio notification: ${t instanceof Error?t.message:String(t)}\n`);return}await a.send(Qc(r,t)).catch(e=>{n.write(`[mcp-shim] failed to write stdio error response: ${e instanceof Error?e.message:String(e)}\n`)})}}).catch(e=>{n.write(`[mcp-shim] unexpected stdio forwarding failure: ${e instanceof Error?e.message:String(e)}\n`)})},o.onmessage=e=>{let t=Zc(e);t&&o.setProtocolVersion?.(t),a.send(e).catch(e=>{n.write(`[mcp-shim] failed to write stdio response: ${e instanceof Error?e.message:String(e)}\n`)})};try{await o.start(),await a.start()}catch(e){throw await c(),e}return{close:c}}async function nl(e){let t=e.stderr??process.stderr,n=e.bridgeFn??tl,r=await $c(e),i=e.createConnectionId?.()??gn(),a=!1,o=(e.startKeepalive??ls)({connectionId:i,resolveWsUrl:async()=>el(e,r),log:e=>t.write(`[mcp-shim] keepalive: ${e}\n`)});t.write(`[mcp-shim] proxying stdio to ${r}\n`);let s;try{s=await n(r,{stderr:t,connectionId:i,onclose:()=>{a||(o.close(),process.exit(0))}})}catch(e){throw o.close(),e}let c=()=>{a=!0,o.close(),s.close().finally(()=>{process.exit(0)})};process.once(`SIGINT`,c),process.once(`SIGTERM`,c)}const rl=un(import.meta.url);function il(e){let t=B(e);for(;;){if(Fe(t))return t;let n=Xt(t);if(n===t)throw Error(`No Open Knowledge project found at or above ${e}. Pass an explicit \`cwd\` argument that points inside an OK project (a directory with a \`${g}\`).`);t=n}}function al(e){try{let t=new URL(e);return t.protocol===`file:`?un(t):void 0}catch{return}}async function ol(e){if(!e.getClientCapabilities()?.roots)return;let t;try{t=await e.listRoots()}catch(t){e.log?.(`listRoots fallback failed: ${t instanceof Error?t.message:String(t)}`);return}let n=t.roots??[];if(n.length!==1)return;let r=al(n[0].uri);return r===void 0&&e.log?.(`single root URI not usable as fs path: ${n[0].uri}`),r}async function sl(e,t){if(e!==void 0)return il(e);let n=await t();if(n!==void 0)return il(n);throw Error("`cwd` is required for tool calls against the global MCP server. Pass an absolute path inside an Open Knowledge project, or have the MCP client advertise a single root.")}async function cl(e){let t=process.stderr,n=e.spawnTimeoutMs??Hc(process.env.OK_MCP_SPAWN_TIMEOUT_MS),r=e.envAutoStart??process.env.OK_MCP_AUTOSTART,i=Dt({startupCwd:e.startupCwd,startupConfig:e.startupConfig}),a=new Ae({name:Be,version:_},{instructions:Oe({dir:`.`})});je(a);let o=gn(),s={current:{connectionId:o,displayName:o,colorSeed:o}},c=new Map,l=e=>{if(c.has(e))return;let n=mt(e),r=s.current,i=ls({connectionId:o,displayName:r.displayName,clientName:r.clientInfo?.name??r.displayName,colorSeed:r.colorSeed,resolveWsUrl:async()=>el({lockDir:n,contentDir:e},``),log:n=>t.write(`[mcp] keepalive[${e}]: ${n}\n`)});c.set(e,i)},u=()=>ol({getClientCapabilities:()=>a.server.getClientCapabilities(),listRoots:()=>a.server.listRoots(),log:e=>t.write(`[mcp] ${e}\n`)}),d=e=>sl(e,u),f=async e=>{let t;if(e===void 0){let e=await u();if(e===void 0)return;t=il(e)}else t=il(e);let a=await i(t),o=await $c({lockDir:mt(t),contentDir:Re(a,t),envAutoStart:r,...n===void 0?{}:{timeoutMs:n}});return l(t),o.replace(/\/mcp$/,``)};a.server.oninitialized=()=>{let e=a.server.getClientVersion(),t=Je(e?.name,o);s.current={connectionId:o,clientInfo:e?{name:t,version:e.version}:void 0,displayName:t,colorSeed:t}},ke(a,{serverUrl:f,resolveCwd:d,config:i,identityRef:s});let p=new ps,m=!1,h,g,v=async()=>{if(m)return;m=!0,h?.stop(),g?.stop();for(let e of c.values())try{e.close()}catch(e){t.write(`[mcp] keepalive close error: ${e instanceof Error?e.message:String(e)}\n`)}c.clear();let e=await Promise.allSettled([a.close(),p.close()]);for(let n of e)if(n.status===`rejected`){let e=n.reason;t.write(`[mcp] shutdown close error: ${e instanceof Error?e.message:String(e)}\n`)}};await a.connect(p),t.write(`[mcp] global stdio server ready (per-call project routing)
70
69
  `);let y=!1,b=()=>{y||(y=!0,setTimeout(()=>{t.write(`[mcp] shutdown deadline (5s) reached — forcing exit(1)
71
70
  `),process.exit(1)},5e3).unref(),v().finally(()=>{process.exit(0)}))};if(process.once(`SIGINT`,b),process.once(`SIGTERM`,b),process.stdin.on(`end`,()=>{t.write(`[mcp] stdin end — host disconnected, shutting down
72
- `),b()}),process.stdin.on(`error`,e=>{t.write(`[mcp] stdin error (${e instanceof Error?e.message:String(e)}) — host disconnected, shutting down\n`),b()}),g=gs({getPpid:()=>process.ppid,onHostGone:e=>{t.write(`[mcp] ${e} — shutting down\n`),b()}}),_s({log:e=>t.write(`${e}\n`),transport:p,process,stdin:process.stdin}),process.platform===`darwin`){let e=hs(nl,{realpathSync:Gt,statInoSync:e=>qt(e).ino,log:e=>t.write(`${e}\n`)});if(e!==void 0){t.write(`[mcp] bundle identity anchor=${e.resolvedPath} inode=${e.inode} version=${_}\n`);let{resolvedPath:n,inode:r}=e;h=ms({detect:()=>ps({bundleAnchorPath:nl,currentInode:r,platform:process.platform,realpath:Gt,statInode:e=>qt(e).ino}),onReplaced:e=>{t.write(`[mcp] bundle replaced anchor=${n} bootInode=${e.currentInode} onDiskInode=${e.onDiskInode} version=${_} — exiting for host respawn\n`),b()},log:e=>t.write(`[mcp] ${e}\n`)})}}return{close:v}}function cl(e){return new t(`mcp`).description(`Start MCP stdio server for project knowledge base`).option(`-p, --port <port>`,`Override per-call routing and proxy stdio to this HTTP MCP port (skips bundle proxy)`,void 0).option(`--no-bundle-proxy`,`Run the npm-fetched MCP server in-process instead of proxying to the macOS Desktop bundle (equivalent: OK_BUNDLE_PROXY=0)`).action(async t=>{try{let n=e(),r=process.cwd();if(t.port!==void 0){let e=Vc(process.env.OK_MCP_SPAWN_TIMEOUT_MS);await tl({lockDir:``,contentDir:``,portOverride:t.port,envAutoStart:process.env.OK_MCP_AUTOSTART,timeoutMs:e});return}let i=t.bundleProxy===!1?[...process.argv,`--no-bundle-proxy`]:process.argv,a=as(process.env,i,process.platform);if(a.proxy){let e=is(process.platform,nn(),{existsSync:P});if(e===null)os({stderr:process.stderr,mode:`fallback-absent`,bundlePath:null,reason:`no installed Open Knowledge.app bundle found`});else try{await ss({bundlePath:e,argv:process.argv.slice(2),env:process.env,stderr:process.stderr});return}catch(t){os({stderr:process.stderr,mode:`fallback-exec-failed`,bundlePath:e,reason:t instanceof Error?t.message:String(t)})}}else{let e=a.suppressedBy===`env`?`suppressed-env`:a.suppressedBy===`flag`?`suppressed-flag`:a.suppressedBy===`self`?`suppressed-self`:`suppressed-platform`;os({stderr:process.stderr,mode:e,bundlePath:null,reason:null})}await sl({startupCwd:r,startupConfig:n})}catch(e){process.stderr.write(`MCP server failed to start: ${e instanceof Error?e.message:String(e)}\n`),process.exitCode=1}})}function ll(e){let t={...e};return delete t.ELECTRON_RUN_AS_NODE,t}function ul(e=()=>Nt(Mt())){return{detectBundlePath:()=>e().bundlePath??null,resolveBaseUrl:e=>He({lockDir:T(e)}).baseUrl,openTarget:e=>{M(`open`,[e],{detached:!0,stdio:`ignore`,env:ll(process.env)}).unref()},log:e=>process.stdout.write(`${e}\n`),error:e=>process.stderr.write(`${e}\n`)}}function dl(e,t,n){let r=B(t.project??process.cwd()),i=t.folder===!0||/\/+$/.test(e),a=e.replace(/\/+$/,``);if(!a)return n.error("Nothing to open: pass a doc path (e.g. `ok open specs/foo/SPEC`)."),1;if(a.startsWith(`/`)||a.includes(`\\`)||a.split(`/`).includes(`..`))return n.error(`Invalid name "${a}": must be a relative path with no '..' segments, leading '/', or backslashes.`),1;if(i){let e=n.resolveBaseUrl(r);if(!e)return n.error(`No Open Knowledge UI is running for ${r}. Folder preview requires a running UI — start one with \`ok ui\`, then retry.`),1;let t=`${e}/#/${Ze(a)}`;return n.openTarget(t),n.log(`Opening folder ${a} in your browser: ${t}`),0}if(n.detectBundlePath()){let e=`openknowledge://open?project=${encodeURIComponent(r)}&doc=${encodeURIComponent(a)}`;return n.openTarget(e),n.log(`Opening ${a} in the Open Knowledge desktop app.`),0}let o=n.resolveBaseUrl(r);if(o){let e=`${o}/#/${ft(a)}`;return n.openTarget(e),n.log(`Opening ${a} in your browser: ${e}`),0}return n.error("No Open Knowledge desktop app found and no UI is running. Install OK Desktop, or start a UI with `ok ui`, then retry."),1}function fl(){return new t(`open`).description(`Open a doc in the OK Desktop app (folders open in the browser)`).argument(`<doc>`,`Extension-less doc path (e.g. specs/foo/SPEC), or a folder path with --folder`).option(`--folder`,`Treat <doc> as a folder and open the folder route in the browser`).option(`--project <dir>`,`Project root (defaults to the current directory)`).action((e,t)=>{process.exitCode=dl(e,t,ul())})}function pl(e){return new t(`preview`).description(`Show what content the watcher will track (read-only)`).action(async()=>{let{previewContent:t,formatPreviewBlock:n}=await import(`./preview-BEJ6SfIa.mjs`),r=e(),i=process.cwd(),a=Re(r,i),o;try{o=t({projectDir:i,contentDir:a})}catch(e){console.error(`Content preview failed: ${e instanceof Error?e.message:String(e)}`),process.exitCode=1;return}process.stdout.write(`${n(o,i)}\n`),o.totalCount===0&&o.warnings.length>0&&(process.exitCode=1)})}function ml(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function hl(e,t,n=process.cwd()){let r=e.op??`sync`,a=m(T(n));if(a&&a.port>0){let t=`http://127.0.0.1:${a.port}/api/sync/trigger`;e.json||process.stderr.write(`Triggering ${r} via running server (port ${a.port})\n`);try{let n=await fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`,...i({kind:`cli`,runtimeVersion:_})},body:JSON.stringify({op:r})});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.title??e.error??e.message??`Server responded with ${n.status}`)}ml(e.json,{type:`triggered`,op:r,port:a.port}),e.json||process.stderr.write(`✓ ${r} triggered\n`);return}catch(t){let n=t instanceof Error?t.message:String(t);e.json||process.stderr.write(`Server trigger failed (${n}), running directly\n`)}}e.json||process.stderr.write(`Running ${r} directly (no live server)\n`);let o=Te({baseDir:n});if(r===`sync`||r===`pull`){ml(e.json,{type:`step`,step:`pull`});let t=await o.pull();ml(e.json,{type:`pull`,summary:t.summary}),e.json||process.stderr.write(` pull: ${t.summary.changes} changes\n`)}(r===`sync`||r===`push`)&&(ml(e.json,{type:`step`,step:`push`}),await o.push(),ml(e.json,{type:`push`,ok:!0}),e.json||process.stderr.write(` push: ok
73
- `)),ml(e.json,{type:`complete`,op:r}),e.json||process.stderr.write(`✓ ${r} complete\n`)}function gl(e){return new t(`sync`).description(`Commit, pull, and push to the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await hl({json:t.json,op:`sync`},e())}catch(e){let n=e instanceof Error?e.message:String(e);t.json?process.stdout.write(`${JSON.stringify({type:`error`,message:n})}\n`):process.stderr.write(`✗ sync failed: ${n}\n`),process.exit(1)}})}function _l(e){return new t(`pull`).description(`Pull changes from the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await hl({json:t.json,op:`pull`},e())}catch(e){let n=e instanceof Error?e.message:String(e);t.json?process.stdout.write(`${JSON.stringify({type:`error`,message:n})}\n`):process.stderr.write(`✗ pull failed: ${n}\n`),process.exit(1)}})}function vl(e){return new t(`push`).description(`Push commits to the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await hl({json:t.json,op:`push`},e())}catch(e){let n=e instanceof Error?e.message:String(e);t.json?process.stdout.write(`${JSON.stringify({type:`error`,message:n})}\n`):process.stderr.write(`✗ push failed: ${n}\n`),process.exit(1)}})}function yl(e){return typeof e==`string`&&qe.includes(e)}async function bl(e={}){let t=B(e.cwd??process.cwd()),n=e.pack??`knowledge-base`;if(!Ge[n])return{status:`failed`,message:`${k(`Error:`)} Unknown pack "${n}". Available: ${qe.join(`, `)}`,exitCode:1};let r;try{r=await Qe({projectDir:t,rootDir:e.root,packId:n})}catch(e){return e instanceof $e?{status:`prerequisite-missing`,message:`${k(`Error:`)} ${e.message}`,exitCode:1}:{status:`failed`,message:`${k(`Error:`)} ${e instanceof Error?e.message:String(e)}`,exitCode:1}}if(r.created.length===0){let e=Ge[n].name;return{status:`no-op`,message:`${O(`Your ${e} pack is already seeded.`)}\n${D(`Nothing to do.`)}`,plan:r,exitCode:0}}if(e.dryRun)return{status:`dry-run`,message:`${j(`Plan (dry-run — no changes made):`)}\n\n${Sl(r,t)}`,plan:r,exitCode:0};if(!e.yes&&!await Cl(`${j(`Plan:`)}\n\n${Sl(r,t)}\n\n${j(`Apply?`)} ${D(`[Y/n] `)}`,e.confirmStream))return{status:`cancelled`,message:D(`Cancelled.`),plan:r,exitCode:0};let i=await ct(r,{projectDir:t,packId:n});if(i.errors.length>0){let e=i.errors.map(e=>` ${k(`✗`)} ${e.path}: ${e.error}`);return{status:`failed`,message:[`${A(`Applied`)} ${i.applied} entries, ${A(String(i.errors.length))} error(s):`,...e].join(`
74
- `),plan:r,exitCode:1}}let a=Ge[n].name,o=i.packSkillsInstalled.length>0?`\n${D(`Installed the ${a} skill for: ${i.packSkillsInstalled.join(`, `)}`)}`:``;return{status:`applied`,message:`${O(`✓ Seeded ${a}`)} ${D(`(${i.applied} entries, ${i.durationMs}ms)`)}${o}`,plan:r,exitCode:0}}function xl(){let e=[j(`Available packs:`)];for(let t of qe){let n=Ge[t];e.push(` ${O(t)} ${D(`—`)} ${n.name}: ${n.description}`)}return e.join(`
75
- `)}function Sl(e,t){let n=[],r=e.created.filter(e=>e.kind===`folder`),i=e.created.filter(e=>e.kind===`file`);if(r.length>0){n.push(j(`Folders to create:`));for(let e of r)n.push(` ${O(`+`)} ${E(Zt(t,B(t,e.path))||e.path)}${D(`/`)}`)}if(i.length>0){n.length>0&&n.push(``),n.push(j(`Files to create:`));for(let e of i)n.push(` ${O(`+`)} ${E(Zt(t,B(t,e.path))||e.path)}`)}if(e.skipped.length>0){n.length>0&&n.push(``),n.push(D(`Already present (skipped):`));for(let t of e.skipped)n.push(` ${D(`· ${t.path} (${t.reason})`)}`)}if(e.warnings.length>0){n.length>0&&n.push(``),n.push(A(`Warnings:`));for(let t of e.warnings)n.push(` ${A(`!`)} ${t}`)}return n.join(`
76
- `)}async function Cl(e,t){let n=yn({input:t??process.stdin,output:process.stdout});try{let t=(await n.question(e)).trim().toLowerCase();return t===``||t===`y`||t===`yes`}finally{n.close()}}function wl(){return new t(`seed`).description(`Scaffold a starter pack into the project. Defaults to "${tt}" — the Karpathy three-layer knowledge base. Use --pack to pick a different pack (run with --list-packs to see all). Use --root to place pack folders inside a subfolder instead of the project root.`).argument(`[path]`,`Project directory (defaults to cwd)`).option(`-p, --pack <id>`,`Starter pack to scaffold. One of: ${qe.join(`, `)}. Defaults to "${tt}".`).option(`-r, --root <path>`,`Subfolder (relative to the project dir) to scaffold into — created if missing. Defaults to the project root when omitted in non-interactive runs; prompts on a TTY.`).option(`--list-packs`,`List available starter packs and exit.`).option(`-y, --yes`,`Skip confirmation prompt`).option(`--dry-run`,`Print the plan and exit without writing`).action(async(e,t)=>{if(t.listPacks){process.stdout.write(`${xl()}\n`);return}if(t.pack!==void 0&&!yl(t.pack)){process.stderr.write(`${k(`Error:`)} Unknown pack "${t.pack}". Available: ${qe.join(`, `)}\n`),process.exitCode=1;return}let n=await bl({cwd:e??process.cwd(),pack:t.pack,root:t.root,yes:t.yes,dryRun:t.dryRun});process.stdout.write(`${n.message}\n`),n.exitCode!==0&&(process.exitCode=n.exitCode)})}async function Tl(e,t,n){try{return await e.repos.get({owner:t,repo:n}),{kind:`ok`,available:!1}}catch(e){let t=e.status;return t===404?{kind:`ok`,available:!0}:t===401?{kind:`auth-required`}:{kind:`network`}}}async function El(e,t){let{host:n,owner:r,name:i,json:a}=e;H(n);let o=await Ci(n,t);if(o==null){if(a){process.stdout.write(`${JSON.stringify({type:`error`,code:`auth-required`})}\n`);return}process.stderr.write(`Not logged in to ${n}\n`),process.exit(1)}let s=n===`github.com`?void 0:`https://${n}/api/v3`,c=await Tl(new K({auth:o,...s?{baseUrl:s}:{}}),r,i);if(c.kind===`ok`){a?process.stdout.write(`${JSON.stringify({type:`name-check`,available:c.available})}\n`):process.stdout.write(c.available?`available
71
+ `),b()}),process.stdin.on(`error`,e=>{t.write(`[mcp] stdin error (${e instanceof Error?e.message:String(e)}) — host disconnected, shutting down\n`),b()}),g=_s({getPpid:()=>process.ppid,onHostGone:e=>{t.write(`[mcp] ${e} — shutting down\n`),b()}}),vs({log:e=>t.write(`${e}\n`),transport:p,process,stdin:process.stdin}),process.platform===`darwin`){let e=gs(rl,{realpathSync:Gt,statInoSync:e=>qt(e).ino,log:e=>t.write(`${e}\n`)});if(e!==void 0){t.write(`[mcp] bundle identity anchor=${e.resolvedPath} inode=${e.inode} version=${_}\n`);let{resolvedPath:n,inode:r}=e;h=hs({detect:()=>ms({bundleAnchorPath:rl,currentInode:r,platform:process.platform,realpath:Gt,statInode:e=>qt(e).ino}),onReplaced:e=>{t.write(`[mcp] bundle replaced anchor=${n} bootInode=${e.currentInode} onDiskInode=${e.onDiskInode} version=${_} — exiting for host respawn\n`),b()},log:e=>t.write(`[mcp] ${e}\n`)})}}return{close:v}}function ll(e){return new t(`mcp`).description(`Start MCP stdio server for project knowledge base`).option(`-p, --port <port>`,`Override per-call routing and proxy stdio to this HTTP MCP port (skips bundle proxy)`,void 0).option(`--no-bundle-proxy`,`Run the npm-fetched MCP server in-process instead of proxying to the macOS Desktop bundle (equivalent: OK_BUNDLE_PROXY=0)`).action(async t=>{try{let n=e(),r=process.cwd();if(t.port!==void 0){let e=Hc(process.env.OK_MCP_SPAWN_TIMEOUT_MS);await nl({lockDir:``,contentDir:``,portOverride:t.port,envAutoStart:process.env.OK_MCP_AUTOSTART,timeoutMs:e});return}let i=t.bundleProxy===!1?[...process.argv,`--no-bundle-proxy`]:process.argv,a=os(process.env,i,process.platform);if(a.proxy){let e=as(process.platform,nn(),{existsSync:P});if(e===null)ss({stderr:process.stderr,mode:`fallback-absent`,bundlePath:null,reason:`no installed Open Knowledge.app bundle found`});else try{await cs({bundlePath:e,argv:process.argv.slice(2),env:process.env,stderr:process.stderr});return}catch(t){ss({stderr:process.stderr,mode:`fallback-exec-failed`,bundlePath:e,reason:t instanceof Error?t.message:String(t)})}}else{let e=a.suppressedBy===`env`?`suppressed-env`:a.suppressedBy===`flag`?`suppressed-flag`:a.suppressedBy===`self`?`suppressed-self`:`suppressed-platform`;ss({stderr:process.stderr,mode:e,bundlePath:null,reason:null})}await cl({startupCwd:r,startupConfig:n})}catch(e){process.stderr.write(`MCP server failed to start: ${e instanceof Error?e.message:String(e)}\n`),process.exitCode=1}})}function ul(e){let t={...e};return delete t.ELECTRON_RUN_AS_NODE,t}function dl(e=()=>Nt(Mt())){return{detectBundlePath:()=>e().bundlePath??null,resolveBaseUrl:e=>He({lockDir:T(e)}).baseUrl,openTarget:e=>{M(`open`,[e],{detached:!0,stdio:`ignore`,env:ul(process.env)}).unref()},log:e=>process.stdout.write(`${e}\n`),error:e=>process.stderr.write(`${e}\n`)}}function fl(e,t,n){let r=B(t.project??process.cwd()),i=t.folder===!0||/\/+$/.test(e),a=e.replace(/\/+$/,``);if(!a)return n.error("Nothing to open: pass a doc path (e.g. `ok open specs/foo/SPEC`)."),1;if(a.startsWith(`/`)||a.includes(`\\`)||a.split(`/`).includes(`..`))return n.error(`Invalid name "${a}": must be a relative path with no '..' segments, leading '/', or backslashes.`),1;if(i){let e=n.resolveBaseUrl(r);if(!e)return n.error(`No Open Knowledge UI is running for ${r}. Folder preview requires a running UI — start one with \`ok ui\`, then retry.`),1;let t=`${e}/#/${Ze(a)}`;return n.openTarget(t),n.log(`Opening folder ${a} in your browser: ${t}`),0}if(n.detectBundlePath()){let e=`openknowledge://open?project=${encodeURIComponent(r)}&doc=${encodeURIComponent(a)}`;return n.openTarget(e),n.log(`Opening ${a} in the Open Knowledge desktop app.`),0}let o=n.resolveBaseUrl(r);if(o){let e=`${o}/#/${ft(a)}`;return n.openTarget(e),n.log(`Opening ${a} in your browser: ${e}`),0}return n.error("No Open Knowledge desktop app found and no UI is running. Install OK Desktop, or start a UI with `ok ui`, then retry."),1}function pl(){return new t(`open`).description(`Open a doc in the OK Desktop app (folders open in the browser)`).argument(`<doc>`,`Extension-less doc path (e.g. specs/foo/SPEC), or a folder path with --folder`).option(`--folder`,`Treat <doc> as a folder and open the folder route in the browser`).option(`--project <dir>`,`Project root (defaults to the current directory)`).action((e,t)=>{process.exitCode=fl(e,t,dl())})}function ml(e){return new t(`preview`).description(`Show what content the watcher will track (read-only)`).action(async()=>{let{previewContent:t,formatPreviewBlock:n}=await import(`./preview-CvqEQ2uu.mjs`),r=e(),i=process.cwd(),a=Re(r,i),o;try{o=t({projectDir:i,contentDir:a})}catch(e){console.error(`Content preview failed: ${e instanceof Error?e.message:String(e)}`),process.exitCode=1;return}process.stdout.write(`${n(o,i)}\n`),o.totalCount===0&&o.warnings.length>0&&(process.exitCode=1)})}function hl(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function gl(e,t,n=process.cwd()){let r=e.op??`sync`,a=m(T(n));if(a&&a.port>0){let t=`http://127.0.0.1:${a.port}/api/sync/trigger`;e.json||process.stderr.write(`Triggering ${r} via running server (port ${a.port})\n`);try{let n=await fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`,...i({kind:`cli`,runtimeVersion:_})},body:JSON.stringify({op:r})});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.title??e.error??e.message??`Server responded with ${n.status}`)}hl(e.json,{type:`triggered`,op:r,port:a.port}),e.json||process.stderr.write(`✓ ${r} triggered\n`);return}catch(t){let n=t instanceof Error?t.message:String(t);e.json||process.stderr.write(`Server trigger failed (${n}), running directly\n`)}}e.json||process.stderr.write(`Running ${r} directly (no live server)\n`);let o=Te({baseDir:n});if(r===`sync`||r===`pull`){hl(e.json,{type:`step`,step:`pull`});let t=await o.pull();hl(e.json,{type:`pull`,summary:t.summary}),e.json||process.stderr.write(` pull: ${t.summary.changes} changes\n`)}(r===`sync`||r===`push`)&&(hl(e.json,{type:`step`,step:`push`}),await o.push(),hl(e.json,{type:`push`,ok:!0}),e.json||process.stderr.write(` push: ok
72
+ `)),hl(e.json,{type:`complete`,op:r}),e.json||process.stderr.write(`✓ ${r} complete\n`)}function _l(e){return new t(`sync`).description(`Commit, pull, and push to the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await gl({json:t.json,op:`sync`},e())}catch(e){let n=e instanceof Error?e.message:String(e);t.json?process.stdout.write(`${JSON.stringify({type:`error`,message:n})}\n`):process.stderr.write(`✗ sync failed: ${n}\n`),process.exit(1)}})}function vl(e){return new t(`pull`).description(`Pull changes from the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await gl({json:t.json,op:`pull`},e())}catch(e){let n=e instanceof Error?e.message:String(e);t.json?process.stdout.write(`${JSON.stringify({type:`error`,message:n})}\n`):process.stderr.write(`✗ pull failed: ${n}\n`),process.exit(1)}})}function yl(e){return new t(`push`).description(`Push commits to the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await gl({json:t.json,op:`push`},e())}catch(e){let n=e instanceof Error?e.message:String(e);t.json?process.stdout.write(`${JSON.stringify({type:`error`,message:n})}\n`):process.stderr.write(`✗ push failed: ${n}\n`),process.exit(1)}})}function bl(e){return typeof e==`string`&&qe.includes(e)}async function xl(e={}){let t=B(e.cwd??process.cwd()),n=e.pack??`knowledge-base`;if(!Ge[n])return{status:`failed`,message:`${k(`Error:`)} Unknown pack "${n}". Available: ${qe.join(`, `)}`,exitCode:1};let r;try{r=await Qe({projectDir:t,rootDir:e.root,packId:n})}catch(e){return e instanceof $e?{status:`prerequisite-missing`,message:`${k(`Error:`)} ${e.message}`,exitCode:1}:{status:`failed`,message:`${k(`Error:`)} ${e instanceof Error?e.message:String(e)}`,exitCode:1}}if(r.created.length===0){let e=Ge[n].name;return{status:`no-op`,message:`${O(`Your ${e} pack is already seeded.`)}\n${D(`Nothing to do.`)}`,plan:r,exitCode:0}}if(e.dryRun)return{status:`dry-run`,message:`${j(`Plan (dry-run — no changes made):`)}\n\n${Cl(r,t)}`,plan:r,exitCode:0};if(!e.yes&&!await wl(`${j(`Plan:`)}\n\n${Cl(r,t)}\n\n${j(`Apply?`)} ${D(`[Y/n] `)}`,e.confirmStream))return{status:`cancelled`,message:D(`Cancelled.`),plan:r,exitCode:0};let i=await ct(r,{projectDir:t,packId:n});if(i.errors.length>0){let e=i.errors.map(e=>` ${k(`✗`)} ${e.path}: ${e.error}`);return{status:`failed`,message:[`${A(`Applied`)} ${i.applied} entries, ${A(String(i.errors.length))} error(s):`,...e].join(`
73
+ `),plan:r,exitCode:1}}let a=Ge[n].name,o=i.packSkillsInstalled.length>0?`\n${D(`Installed the ${a} skill for: ${i.packSkillsInstalled.join(`, `)}`)}`:``;return{status:`applied`,message:`${O(`✓ Seeded ${a}`)} ${D(`(${i.applied} entries, ${i.durationMs}ms)`)}${o}`,plan:r,exitCode:0}}function Sl(){let e=[j(`Available packs:`)];for(let t of qe){let n=Ge[t];e.push(` ${O(t)} ${D(`—`)} ${n.name}: ${n.description}`)}return e.join(`
74
+ `)}function Cl(e,t){let n=[],r=e.created.filter(e=>e.kind===`folder`),i=e.created.filter(e=>e.kind===`file`);if(r.length>0){n.push(j(`Folders to create:`));for(let e of r)n.push(` ${O(`+`)} ${E(Zt(t,B(t,e.path))||e.path)}${D(`/`)}`)}if(i.length>0){n.length>0&&n.push(``),n.push(j(`Files to create:`));for(let e of i)n.push(` ${O(`+`)} ${E(Zt(t,B(t,e.path))||e.path)}`)}if(e.skipped.length>0){n.length>0&&n.push(``),n.push(D(`Already present (skipped):`));for(let t of e.skipped)n.push(` ${D(`· ${t.path} (${t.reason})`)}`)}if(e.warnings.length>0){n.length>0&&n.push(``),n.push(A(`Warnings:`));for(let t of e.warnings)n.push(` ${A(`!`)} ${t}`)}return n.join(`
75
+ `)}async function wl(e,t){let n=yn({input:t??process.stdin,output:process.stdout});try{let t=(await n.question(e)).trim().toLowerCase();return t===``||t===`y`||t===`yes`}finally{n.close()}}function Tl(){return new t(`seed`).description(`Scaffold a starter pack into the project. Defaults to "${tt}" — the Karpathy three-layer knowledge base. Use --pack to pick a different pack (run with --list-packs to see all). Use --root to place pack folders inside a subfolder instead of the project root.`).argument(`[path]`,`Project directory (defaults to cwd)`).option(`-p, --pack <id>`,`Starter pack to scaffold. One of: ${qe.join(`, `)}. Defaults to "${tt}".`).option(`-r, --root <path>`,`Subfolder (relative to the project dir) to scaffold into — created if missing. Defaults to the project root when omitted in non-interactive runs; prompts on a TTY.`).option(`--list-packs`,`List available starter packs and exit.`).option(`-y, --yes`,`Skip confirmation prompt`).option(`--dry-run`,`Print the plan and exit without writing`).action(async(e,t)=>{if(t.listPacks){process.stdout.write(`${Sl()}\n`);return}if(t.pack!==void 0&&!bl(t.pack)){process.stderr.write(`${k(`Error:`)} Unknown pack "${t.pack}". Available: ${qe.join(`, `)}\n`),process.exitCode=1;return}let n=await xl({cwd:e??process.cwd(),pack:t.pack,root:t.root,yes:t.yes,dryRun:t.dryRun});process.stdout.write(`${n.message}\n`),n.exitCode!==0&&(process.exitCode=n.exitCode)})}async function El(e,t,n){try{return await e.repos.get({owner:t,repo:n}),{kind:`ok`,available:!1}}catch(e){let t=e.status;return t===404?{kind:`ok`,available:!0}:t===401?{kind:`auth-required`}:{kind:`network`}}}async function Dl(e,t){let{host:n,owner:r,name:i,json:a}=e;H(n);let o=await Ci(n,t);if(o==null){if(a){process.stdout.write(`${JSON.stringify({type:`error`,code:`auth-required`})}\n`);return}process.stderr.write(`Not logged in to ${n}\n`),process.exit(1)}let s=n===`github.com`?void 0:`https://${n}/api/v3`,c=await El(new K({auth:o,...s?{baseUrl:s}:{}}),r,i);if(c.kind===`ok`){a?process.stdout.write(`${JSON.stringify({type:`name-check`,available:c.available})}\n`):process.stdout.write(c.available?`available
77
76
  `:`taken
78
- `);return}if(a){process.stdout.write(`${JSON.stringify({type:`error`,code:c.kind})}\n`);return}process.stderr.write(`✗ share name-check failed: ${c.kind}\n`),process.exit(1)}function Dl(e){return new t(`name-check`).description(`Check if owner/name is available on GitHub`).requiredOption(`--owner <owner>`,`GitHub owner (user or org)`).requiredOption(`--name <name>`,`Repository name`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{await El(t,await e())})}async function Ol(e){try{let t=[],n=await e.users.getAuthenticated();t.push({login:n.data.login,kind:`user`,avatarUrl:n.data.avatar_url});for await(let n of e.paginate.iterator(e.orgs.listMembershipsForAuthenticatedUser,{state:`active`,per_page:100}))for(let e of n.data)(e.permissions?.can_create_repository===!0||e.role===`admin`)&&t.push({login:e.organization.login,kind:`org`,avatarUrl:e.organization.avatar_url??void 0});return{kind:`ok`,owners:t}}catch(e){return e.status===401?{kind:`auth-required`}:{kind:`network`}}}async function kl(e,t){let{host:n,json:r}=e;H(n);let i=await Ci(n,t);if(i==null){if(r){process.stdout.write(`${JSON.stringify({type:`error`,code:`auth-required`})}\n`);return}process.stderr.write(`Not logged in to ${n}\n`),process.exit(1)}let a=n===`github.com`?void 0:`https://${n}/api/v3`,o=await Ol(new K({auth:i,...a?{baseUrl:a}:{}}));if(o.kind===`ok`){if(r)process.stdout.write(`${JSON.stringify({type:`owners`,owners:o.owners})}\n`);else for(let e of o.owners)process.stdout.write(`${e.kind}\t${e.login}\n`);return}if(r){process.stdout.write(`${JSON.stringify({type:`error`,code:o.kind})}\n`);return}process.stderr.write(`✗ share owners failed: ${o.kind}\n`),process.exit(1)}function Al(e){return new t(`owners`).description(`List GitHub owners eligible to host a new repository`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{await kl(t,await e())})}function jl(e){let t=e,n=t.status,r=t.response?.data,i=t.response?.headers,a=`${r?.message??r?.errors?.map(e=>e.message??``).join(`
79
- `)??``}\n${t.message??``}`.toLowerCase();return n===401?`auth-required`:n===403?i?.[`x-github-sso`]||a.includes(`saml`)||a.includes(`sso`)?`saml-sso`:`network`:n===422&&(r?.errors?.some(e=>e.field===`name`)||a.includes(`already exists`)||a.includes(`name already exists`))?`name-conflict`:`network`}async function Ml(e){let{octokit:t,ownerLogin:n,ownerKind:r,name:i,visibility:a,description:o}=e,s=a===`private`;if(r===`user`){let{data:e}=await t.repos.createForAuthenticatedUser({name:i,private:s,...o?{description:o}:{}});return{cloneUrl:e.clone_url,defaultBranch:e.default_branch??`main`}}let{data:c}=await t.repos.createInOrg({org:n,name:i,visibility:a,...o?{description:o}:{}});return{cloneUrl:c.clone_url,defaultBranch:c.default_branch??`main`}}async function Nl(e,t,n){try{let{data:r}=await e.repos.get({owner:t,repo:n});return{cloneUrl:r.clone_url,defaultBranch:r.default_branch??`main`}}catch{return null}}async function Pl(e,t){return(await e.users.getAuthenticated()).data.login.toLowerCase()===t.toLowerCase()?`user`:`org`}function Fl(e){return Te({baseDir:e,unsafe:{allowUnsafeCredentialHelper:!0}}).env({GIT_TERMINAL_PROMPT:`0`})}function Il(e,t){if(!e.startsWith(`https://`))return e;try{if(new URL(e).hostname!==`github.com`)return e}catch{return e}return e.replace(`https://`,`https://x-access-token:${t}@`)}const Ll={ensureOkScaffold:e=>{Le(e)},gitFactory:Fl};async function Rl(e){let t={...Ll,...e.deps},n=B(e.projectDir),r;if(e.ownerKind)r=e.ownerKind;else try{r=await Pl(e.octokit,e.body.owner)}catch(e){return{kind:`error`,code:jl(e)}}try{t.ensureOkScaffold(n)}catch{return{kind:`error`,code:`init-failed`}}let i=t.gitFactory(n);if(!P(z(n,`.git`)))try{await i.init()}catch{return{kind:`error`,code:`init-failed`}}let a;try{a=await Ml({octokit:e.octokit,ownerLogin:e.body.owner,ownerKind:r,name:e.body.name,visibility:e.body.visibility,description:e.body.description})}catch(t){if(jl(t)===`name-conflict`){let t=await Nl(e.octokit,e.body.owner,e.body.name);if(t===null)return{kind:`error`,code:`name-conflict`};a=t}else return{kind:`error`,code:jl(t)}}try{await i.addRemote(`origin`,a.cloneUrl)}catch(e){if(!String(e.message??``).toLowerCase().includes(`remote origin already exists`))return{kind:`error`,code:`push-failed`}}let o=!1;try{await i.raw([`rev-parse`,`--verify`,`HEAD`])}catch{o=!0}if(o)try{await i.add(`.`),await i.raw([`commit`,`--allow-empty`,`-m`,`Initial commit`])}catch{return{kind:`error`,code:`init-failed`}}let s=Il(a.cloneUrl,e.token);try{await i.raw([`push`,s,`HEAD:refs/heads/${a.defaultBranch}`])}catch(e){let t=String(e.message??``).toLowerCase();return t.includes(`saml`)||t.includes(`sso`)?{kind:`error`,code:`saml-sso`}:{kind:`error`,code:`push-failed`}}try{await i.raw([`update-ref`,`refs/remotes/origin/${a.defaultBranch}`,`HEAD`])}catch{}return{kind:`ok`,value:{ownerLogin:e.body.owner,repoName:e.body.name,cloneUrl:a.cloneUrl,defaultBranch:a.defaultBranch}}}function zl(e,t){if(!e){t.kind===`ok`?process.stdout.write(`✓ Published ${t.value.cloneUrl}\n`):(process.stderr.write(`✗ share publish failed: ${t.code}\n`),process.exit(1));return}if(t.kind===`ok`){process.stdout.write(`${JSON.stringify({type:`publish`,...t.value})}\n`);return}process.stdout.write(`${JSON.stringify({type:`error`,code:t.code})}\n`)}async function Bl(e,t){let{host:n,owner:r,name:i,visibility:a,description:o,projectDir:s,json:c}=e;H(n);let l=await Ci(n,t);if(l==null){zl(c,{kind:`error`,code:`auth-required`});return}let u=n===`github.com`?void 0:`https://${n}/api/v3`,d=new K({auth:l,...u?{baseUrl:u}:{}});try{It(`git config user.email`,{cwd:s,stdio:`ignore`})}catch{process.env.GIT_AUTHOR_NAME??=`Open Knowledge`,process.env.GIT_AUTHOR_EMAIL??=`noreply@inkeep.com`,process.env.GIT_COMMITTER_NAME??=`Open Knowledge`,process.env.GIT_COMMITTER_EMAIL??=`noreply@inkeep.com`}zl(c,await Rl({octokit:d,token:l,projectDir:s,body:{owner:r,name:i,visibility:a,description:o}}))}function Vl(e){return new t(`publish`).description(`Publish a no-remote project to GitHub`).requiredOption(`--owner <owner>`,`GitHub owner (user or org)`).requiredOption(`--name <name>`,`Repository name`).requiredOption(`--visibility <visibility>`,`public or private`).option(`--description <description>`,`Repository description`).requiredOption(`--project-dir <projectDir>`,`Path to the project on disk`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{t.visibility!==`public`&&t.visibility!==`private`&&(process.stderr.write(`✗ visibility must be 'public' or 'private'
80
- `),process.exit(1)),await Bl(t,await e())})}function Hl(){let e=new t(`share`);e.description(`Sharing flow operations (owners, name-check, publish)`);let n=()=>ne();return e.addCommand(Al(n)),e.addCommand(Dl(n)),e.addCommand(Vl(n)),e}function Ul(){return new t(`share`).description(`Switch this project to shared mode (commit OK config alongside content)`).option(`--project <dir>`,`Project root (defaults to cwd)`).option(`--json`,`Output JSON`,!1).action(async e=>{let t=B(e.project??process.cwd()),n=ve(t),r=ce(t,se(t));if(r.kind===`no-exclude`){Wl(e.json,t,r.reason);return}let i=ve(t);if(e.json){let e={type:`sharing-share`,projectRoot:t,mode:i,removed:r.removed};process.stdout.write(`${JSON.stringify(e)}\n`);return}if(n===`shared`){process.stderr.write(`${E(`Sharing mode is already`)} ${j(`shared`)} ${E(`— nothing to do.`)}\n`);return}process.stderr.write(`${O(`✓`)} ${j(`Sharing mode set to`)} ${O(`shared`)}\n`),process.stderr.write(` Removed OK paths from ${j(`.git/info/exclude`)}; commit the files to share with teammates.\n`)})}function Wl(e,t,n){if(e){process.stdout.write(`${JSON.stringify({type:`sharing-share`,projectRoot:t,mode:`no-git`,removed:[],reason:n})}\n`);return}process.stderr.write(`${A({"no-git":`No git repository here — sharing mode does not apply.`,"no-info-dir":`The gitdir's info/ folder is absent; cannot toggle sharing mode.`,"malformed-pointer":"The .git pointer file is malformed (stale worktree). Run `git worktree prune` and try again.",inaccessible:`The .git path is inaccessible (permissions or mount issue).`}[n])}\n`)}function Gl(){return new t(`status`).description(`Print the current sharing mode and the OK paths in .git/info/exclude`).option(`--project <dir>`,`Project root (defaults to cwd)`).option(`--json`,`Output JSON`,!1).action(async e=>{let t=B(e.project??process.cwd()),n=ve(t),r=[..._e(t)],i=Ce(t,se(t)).tracked;if(e.json){let e={type:`sharing-status`,projectRoot:t,mode:n,excluded:r,trackedUpstream:i};process.stdout.write(`${JSON.stringify(e)}\n`);return}let a=[];if(a.push(`Open Knowledge sharing mode: ${Kl(n)}`),a.push(``),a.push(`Excluded from git via ${j(`.git/info/exclude`)}:`),r.length===0)a.push(` (none)`);else for(let e of r)a.push(` ${e}`);if(a.push(``),a.push(`Other OK paths exist but are tracked upstream:`),i.length===0)a.push(` (none)`);else for(let e of i)a.push(` ${e}`);a.push(``),a.push(`Toggle with: ${E(n===`local-only`?`ok config-sharing share`:`ok config-sharing unshare`)}`),process.stdout.write(`${a.join(`
81
- `)}\n`)})}function Kl(e){switch(e){case`shared`:return O(`shared`);case`local-only`:return O(`local-only`);case`no-git`:return A(`no-git (not a git repository)`)}}function ql(){return new t(`unshare`).description(`Switch this project to local-only mode (add OK artifacts to .git/info/exclude so they stay out of git)`).option(`--project <dir>`,`Project root (defaults to cwd)`).option(`--json`,`Output JSON`,!1).action(async e=>{let t=B(e.project??process.cwd()),n=be(t,se(t));if(n.kind===`refused-tracked`){if(e.json){let e={type:`sharing-unshare`,projectRoot:t,mode:`refused-tracked`,tracked:n.tracked,remediation:n.remediation};process.stdout.write(`${JSON.stringify(e)}\n`)}else process.stderr.write(`${n.remediation}\n`);process.exitCode=1;return}if(n.kind===`no-exclude`){Jl(e.json,t,n.reason);return}let r=ve(t);if(e.json){let e={type:`sharing-unshare`,projectRoot:t,mode:r,appended:n.appended,alreadyPresent:n.alreadyPresent};process.stdout.write(`${JSON.stringify(e)}\n`);return}if(n.appended.length===0){process.stderr.write(`${j(`Sharing mode is already`)} ${O(`local-only`)} ${j(`— nothing to do.`)}\n`);return}process.stderr.write(`${O(`✓`)} ${j(`Sharing mode set to`)} ${O(`local-only`)}\n`),process.stderr.write(` Added ${n.appended.length} path(s) to ${j(`.git/info/exclude`)} (per-clone, not committed).\n`)})}function Jl(e,t,n){if(e){process.stdout.write(`${JSON.stringify({type:`sharing-unshare`,projectRoot:t,mode:`no-git`,appended:[],alreadyPresent:[],reason:n})}\n`);return}process.stderr.write(`${A({"no-git":`No git repository here — sharing mode does not apply.`,"no-info-dir":`The gitdir's info/ folder is absent; cannot toggle sharing mode.`,"malformed-pointer":"The .git pointer file is malformed (stale worktree). Run `git worktree prune` and try again.",inaccessible:`The .git path is inaccessible (permissions or mount issue).`}[n])}\n`)}function Yl(){let e=new t(`config-sharing`);return e.description(`Manage Open Knowledge's git-sharing mode (share OK config with the team, or keep local-only on this machine)`),e.addCommand(Ul()),e.addCommand(ql()),e.addCommand(Gl()),e}const Xl=new Set([`--cwd`,`--log-level`]);function Zl(e){let t=[],n=null,r=!1;for(let i=0;i<e.length;i++){let a=e[i];if(a===`--help`||a===`-h`||a===`--version`||a===`-V`){r=!0;break}if(a===`--cwd`||a===`--log-level`){a===`--cwd`&&(n=e[i+1]??null),i++;continue}if(a.startsWith(`--cwd=`)){n=a.slice(6);continue}if(!a.startsWith(`--log-level=`)&&!(a===`--no-color`||a===`--color`)){if(a.startsWith(`-`)){Xl.has(a)&&i++;continue}t.push(a)}}return{operands:t,cwd:n,sawTerminalFlag:r}}function Ql(e,t){if(e.length===0)return null;let n=e[0];return n===`open`&&e[1]!==void 0&&t.isFileish(e[1])?e[1]:t.knownSubcommands.has(n)?null:t.isFileish(n)?n:null}function $l(e){return/\.(md|mdx)$/i.test(e)}function eu(e){let t={...e};return delete t.ELECTRON_RUN_AS_NODE,t}function tu(e=()=>Nt(Mt())){return{prepare:et,detectBundlePath:()=>e().bundlePath??null,openTarget:e=>{M(`open`,[e],{detached:!0,stdio:`ignore`,env:eu(process.env)}).unref()},runProjectOpen:(e,t)=>dl(e,{project:t},ul()),runBrowserOpen:e=>iu(e),log:e=>process.stdout.write(`${e}\n`),error:e=>process.stderr.write(`${e}\n`)}}async function nu(e,t){let n;try{n=t.prepare(e)}catch(e){if(e instanceof dt||e instanceof st||e instanceof it)return t.error(e.message),1;throw e}if(n.mode===`project`)return t.runProjectOpen(n.docName,n.projectRoot);if(t.detectBundlePath()){let e=`openknowledge://open?file=${encodeURIComponent(n.canonicalFilePath)}`;return t.openTarget(e),t.log(`Opening ${n.singleDocRelPath} in the Open Knowledge desktop app.`),0}return await t.runBrowserOpen(n),0}function ru(){let e=import.meta.dirname??new URL(`.`,import.meta.url).pathname;return[B(e,`public`),B(e,`../../app/dist`),B(e,`../../../app/dist`)].find(e=>P(e))}async function iu(e){let{createEphemeralProjectDir:t}=await import(`./dist-CaLi0vY9.mjs`),{loadConfig:n}=await import(`./index.mjs`),{bootStartServer:r,resolveHost:i}=await import(`./start-DIcFlFoz.mjs`),{openBrowser:a}=await import(`./open-browser-C6LU_1mt.mjs`),o=ru();o||(process.stderr.write("Open Knowledge UI assets were not found. Reinstall @inkeep/open-knowledge, or build the app (`bun run build`) in a monorepo checkout.\n"),process.exit(1));let s=t(e.contentDir),c=!1,l,u=async()=>{if(!c){c=!0;try{await l?.destroy()}catch{}try{await _n(s,{recursive:!0,force:!0})}catch{}}},d=()=>{u().then(()=>process.exit(0))};process.once(`SIGINT`,d),process.once(`SIGTERM`,d);let{config:f}=n(s),p=i({},process.env);try{l=await r({config:f,cwd:s,host:p,port:0,projectDir:s,singleFile:e.canonicalFilePath,serveContentAssets:!0,reactShellDistDir:o})}catch(t){await u(),process.stderr.write(`Failed to open ${e.singleDocRelPath}: ${t instanceof Error?t.message:String(t)}\n`),process.exit(1)}let m=`http://${p}:${l.port}/#/${ft(e.docName)}`;process.stdout.write(`Opening ${e.singleDocRelPath} in your browser: ${m}\n`),process.stdout.write(`Press Ctrl-C to close the session.
82
- `),a(m),await new Promise(()=>{})}function au(e,t){return{server:ou(`server`,e),ui:ou(`ui`,t)}}function ou(e,t){switch(t.status){case`missing`:return{name:e,state:`missing`,alive:!1};case`corrupt`:return{name:e,state:`corrupt`,alive:!1};case`foreign-host`:return{name:e,state:`foreign-host`,pid:t.lock.pid,port:t.lock.port,startedAt:t.lock.startedAt,host:t.lock.hostname,alive:`unknown`};case`dead-pid`:return{name:e,state:`dead-pid`,pid:t.lock.pid,port:t.lock.port,startedAt:t.lock.startedAt,host:t.lock.hostname,alive:!1};case`alive`:return{name:e,state:`alive`,pid:t.lock.pid,port:t.lock.port,startedAt:t.lock.startedAt,host:t.lock.hostname,alive:!0}}}function su(e){return`${cu(e.server)}\n${cu(e.ui)}`}function cu(e){let t=e.name===`server`?`server`:`ui `;return e.state===`missing`?`${t} not running`:e.state===`corrupt`?`${t} lock file corrupt — run \`ok clean\``:e.state===`foreign-host`?`${t} foreign host (${e.host}) pid=${e.pid} port=${e.port}`:e.state===`dead-pid`?`${t} stale (dead pid=${e.pid}) — run \`ok clean\``:`${t} alive pid=${e.pid} port=${e.port} started=${e.startedAt}`}function lu(e){let t=e.inspect??(t=>St(e.lockDir,t)),n=e.log??(e=>console.log(e)),r=au(t(`server`),t(`ui`));return e.json?n(JSON.stringify(r,null,2)):n(su(r)),r}function uu(e){return new t(`status`).description(`Show live state of the server + ui lockfiles for this project`).option(`--json`,`Emit structured JSON instead of formatted text`).action(t=>{e(),lu({lockDir:T(process.cwd()),json:t.json===!0})})}function du(e){return[e,`Copyright (C) 2026 Inkeep, Inc.`,`License GPL-3.0-or-later: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.`,`This is free software: you are free to change and redistribute it.`,`There is NO WARRANTY, to the extent permitted by law.`].join(`
83
- `)}process.argv.includes(`--no-color`)?(process.env.NO_COLOR=`1`,delete process.env.FORCE_COLOR):process.argv.includes(`--color`)&&(process.env.FORCE_COLOR=`1`,delete process.env.NO_COLOR);const Q=new t;let $,fu;function pu(){return fu}Q.name(`open-knowledge`).description(`Local-first knowledge base with CRDT collaboration`).usage(`[options] [file | command]`).version(du(wt)).option(`--cwd <path>`,`Working directory`).option(`--log-level <level>`,`Log level`,`info`).option(`--no-color`,`Disable color output`).option(`--color`,`Force color output`).hook(`preAction`,e=>{let t=e.opts().cwd;t!==void 0&&process.chdir(t);let{config:n}=Et(t);$=n;let r=e.args?.[0]??e.name()??`cli`;fu=ut({name:`cli`,project:n.project?.name??void 0}),fu.info({command:r,cwd:process.cwd()},`cli command started`)}),Q.action(async()=>{if(Nt(Mt()).available){kt({spawn:M});return}await At($,{})});const mu=jt(()=>$);Q.addCommand(mu);const hu=cl(()=>$);Q.addCommand(hu),Q.addCommand(xe()),Q.addCommand(wl()),Q.addCommand(ts()),Q.addCommand(Ft());const gu=pl(()=>$);Q.addCommand(gu);const _u=Se(()=>$);Q.addCommand(_u),Q.addCommand(fl()),Q.addCommand(bt(()=>$)),Q.addCommand(Ki(()=>$)),Q.addCommand(uu(()=>$)),Q.addCommand(_t()),Q.addCommand(Ro()),Q.addCommand(Ui()),Q.addCommand(da()),Q.addCommand(ji()),Q.addCommand(qo()),Q.addCommand(ra(()=>$)),Q.addCommand(gl(()=>$)),Q.addCommand(vl(()=>$)),Q.addCommand(_l(()=>$)),Q.addCommand(Hl()),Q.addCommand(Yl()),Q.addHelpText(`after`,`
77
+ `);return}if(a){process.stdout.write(`${JSON.stringify({type:`error`,code:c.kind})}\n`);return}process.stderr.write(`✗ share name-check failed: ${c.kind}\n`),process.exit(1)}function Ol(e){return new t(`name-check`).description(`Check if owner/name is available on GitHub`).requiredOption(`--owner <owner>`,`GitHub owner (user or org)`).requiredOption(`--name <name>`,`Repository name`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{await Dl(t,await e())})}async function kl(e){try{let t=[],n=await e.users.getAuthenticated();t.push({login:n.data.login,kind:`user`,avatarUrl:n.data.avatar_url});for await(let n of e.paginate.iterator(e.orgs.listMembershipsForAuthenticatedUser,{state:`active`,per_page:100}))for(let e of n.data)(e.permissions?.can_create_repository===!0||e.role===`admin`)&&t.push({login:e.organization.login,kind:`org`,avatarUrl:e.organization.avatar_url??void 0});return{kind:`ok`,owners:t}}catch(e){return e.status===401?{kind:`auth-required`}:{kind:`network`}}}async function Al(e,t){let{host:n,json:r}=e;H(n);let i=await Ci(n,t);if(i==null){if(r){process.stdout.write(`${JSON.stringify({type:`error`,code:`auth-required`})}\n`);return}process.stderr.write(`Not logged in to ${n}\n`),process.exit(1)}let a=n===`github.com`?void 0:`https://${n}/api/v3`,o=await kl(new K({auth:i,...a?{baseUrl:a}:{}}));if(o.kind===`ok`){if(r)process.stdout.write(`${JSON.stringify({type:`owners`,owners:o.owners})}\n`);else for(let e of o.owners)process.stdout.write(`${e.kind}\t${e.login}\n`);return}if(r){process.stdout.write(`${JSON.stringify({type:`error`,code:o.kind})}\n`);return}process.stderr.write(`✗ share owners failed: ${o.kind}\n`),process.exit(1)}function jl(e){return new t(`owners`).description(`List GitHub owners eligible to host a new repository`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{await Al(t,await e())})}function Ml(e){let t=e,n=t.status,r=t.response?.data,i=t.response?.headers,a=`${r?.message??r?.errors?.map(e=>e.message??``).join(`
78
+ `)??``}\n${t.message??``}`.toLowerCase();return n===401?`auth-required`:n===403?i?.[`x-github-sso`]||a.includes(`saml`)||a.includes(`sso`)?`saml-sso`:`network`:n===422&&(r?.errors?.some(e=>e.field===`name`)||a.includes(`already exists`)||a.includes(`name already exists`))?`name-conflict`:`network`}async function Nl(e){let{octokit:t,ownerLogin:n,ownerKind:r,name:i,visibility:a,description:o}=e,s=a===`private`;if(r===`user`){let{data:e}=await t.repos.createForAuthenticatedUser({name:i,private:s,...o?{description:o}:{}});return{cloneUrl:e.clone_url,defaultBranch:e.default_branch??`main`}}let{data:c}=await t.repos.createInOrg({org:n,name:i,visibility:a,...o?{description:o}:{}});return{cloneUrl:c.clone_url,defaultBranch:c.default_branch??`main`}}async function Pl(e,t,n){try{let{data:r}=await e.repos.get({owner:t,repo:n});return{cloneUrl:r.clone_url,defaultBranch:r.default_branch??`main`}}catch{return null}}async function Fl(e,t){return(await e.users.getAuthenticated()).data.login.toLowerCase()===t.toLowerCase()?`user`:`org`}function Il(e){return Te({baseDir:e,unsafe:{allowUnsafeCredentialHelper:!0}}).env({GIT_TERMINAL_PROMPT:`0`})}function Ll(e,t){if(!e.startsWith(`https://`))return e;try{if(new URL(e).hostname!==`github.com`)return e}catch{return e}return e.replace(`https://`,`https://x-access-token:${t}@`)}const Rl={ensureOkScaffold:e=>{Le(e)},gitFactory:Il};async function zl(e){let t={...Rl,...e.deps},n=B(e.projectDir),r;if(e.ownerKind)r=e.ownerKind;else try{r=await Fl(e.octokit,e.body.owner)}catch(e){return{kind:`error`,code:Ml(e)}}try{t.ensureOkScaffold(n)}catch{return{kind:`error`,code:`init-failed`}}let i=t.gitFactory(n);if(!P(z(n,`.git`)))try{await i.init()}catch{return{kind:`error`,code:`init-failed`}}let a;try{a=await Nl({octokit:e.octokit,ownerLogin:e.body.owner,ownerKind:r,name:e.body.name,visibility:e.body.visibility,description:e.body.description})}catch(t){if(Ml(t)===`name-conflict`){let t=await Pl(e.octokit,e.body.owner,e.body.name);if(t===null)return{kind:`error`,code:`name-conflict`};a=t}else return{kind:`error`,code:Ml(t)}}try{await i.addRemote(`origin`,a.cloneUrl)}catch(e){if(!String(e.message??``).toLowerCase().includes(`remote origin already exists`))return{kind:`error`,code:`push-failed`}}let o=!1;try{await i.raw([`rev-parse`,`--verify`,`HEAD`])}catch{o=!0}if(o)try{await i.add(`.`),await i.raw([`commit`,`--allow-empty`,`-m`,`Initial commit`])}catch{return{kind:`error`,code:`init-failed`}}let s=Ll(a.cloneUrl,e.token);try{await i.raw([`push`,s,`HEAD:refs/heads/${a.defaultBranch}`])}catch(e){let t=String(e.message??``).toLowerCase();return t.includes(`saml`)||t.includes(`sso`)?{kind:`error`,code:`saml-sso`}:{kind:`error`,code:`push-failed`}}try{await i.raw([`update-ref`,`refs/remotes/origin/${a.defaultBranch}`,`HEAD`])}catch{}return{kind:`ok`,value:{ownerLogin:e.body.owner,repoName:e.body.name,cloneUrl:a.cloneUrl,defaultBranch:a.defaultBranch}}}function Bl(e,t){if(!e){t.kind===`ok`?process.stdout.write(`✓ Published ${t.value.cloneUrl}\n`):(process.stderr.write(`✗ share publish failed: ${t.code}\n`),process.exit(1));return}if(t.kind===`ok`){process.stdout.write(`${JSON.stringify({type:`publish`,...t.value})}\n`);return}process.stdout.write(`${JSON.stringify({type:`error`,code:t.code})}\n`)}async function Vl(e,t){let{host:n,owner:r,name:i,visibility:a,description:o,projectDir:s,json:c}=e;H(n);let l=await Ci(n,t);if(l==null){Bl(c,{kind:`error`,code:`auth-required`});return}let u=n===`github.com`?void 0:`https://${n}/api/v3`,d=new K({auth:l,...u?{baseUrl:u}:{}});try{It(`git config user.email`,{cwd:s,stdio:`ignore`})}catch{process.env.GIT_AUTHOR_NAME??=`Open Knowledge`,process.env.GIT_AUTHOR_EMAIL??=`noreply@inkeep.com`,process.env.GIT_COMMITTER_NAME??=`Open Knowledge`,process.env.GIT_COMMITTER_EMAIL??=`noreply@inkeep.com`}Bl(c,await zl({octokit:d,token:l,projectDir:s,body:{owner:r,name:i,visibility:a,description:o}}))}function Hl(e){return new t(`publish`).description(`Publish a no-remote project to GitHub`).requiredOption(`--owner <owner>`,`GitHub owner (user or org)`).requiredOption(`--name <name>`,`Repository name`).requiredOption(`--visibility <visibility>`,`public or private`).option(`--description <description>`,`Repository description`).requiredOption(`--project-dir <projectDir>`,`Path to the project on disk`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{t.visibility!==`public`&&t.visibility!==`private`&&(process.stderr.write(`✗ visibility must be 'public' or 'private'
79
+ `),process.exit(1)),await Vl(t,await e())})}function Ul(){let e=new t(`share`);e.description(`Sharing flow operations (owners, name-check, publish)`);let n=()=>ne();return e.addCommand(jl(n)),e.addCommand(Ol(n)),e.addCommand(Hl(n)),e}function Wl(){return new t(`share`).description(`Switch this project to shared mode (commit OK config alongside content)`).option(`--project <dir>`,`Project root (defaults to cwd)`).option(`--json`,`Output JSON`,!1).action(async e=>{let t=B(e.project??process.cwd()),n=ve(t),r=ce(t,se(t));if(r.kind===`no-exclude`){Gl(e.json,t,r.reason);return}let i=ve(t);if(e.json){let e={type:`sharing-share`,projectRoot:t,mode:i,removed:r.removed};process.stdout.write(`${JSON.stringify(e)}\n`);return}if(n===`shared`){process.stderr.write(`${E(`Sharing mode is already`)} ${j(`shared`)} ${E(`— nothing to do.`)}\n`);return}process.stderr.write(`${O(`✓`)} ${j(`Sharing mode set to`)} ${O(`shared`)}\n`),process.stderr.write(` Removed OK paths from ${j(`.git/info/exclude`)}; commit the files to share with teammates.\n`)})}function Gl(e,t,n){if(e){process.stdout.write(`${JSON.stringify({type:`sharing-share`,projectRoot:t,mode:`no-git`,removed:[],reason:n})}\n`);return}process.stderr.write(`${A({"no-git":`No git repository here — sharing mode does not apply.`,"no-info-dir":`The gitdir's info/ folder is absent; cannot toggle sharing mode.`,"malformed-pointer":"The .git pointer file is malformed (stale worktree). Run `git worktree prune` and try again.",inaccessible:`The .git path is inaccessible (permissions or mount issue).`}[n])}\n`)}function Kl(){return new t(`status`).description(`Print the current sharing mode and the OK paths in .git/info/exclude`).option(`--project <dir>`,`Project root (defaults to cwd)`).option(`--json`,`Output JSON`,!1).action(async e=>{let t=B(e.project??process.cwd()),n=ve(t),r=[..._e(t)],i=Ce(t,se(t)).tracked;if(e.json){let e={type:`sharing-status`,projectRoot:t,mode:n,excluded:r,trackedUpstream:i};process.stdout.write(`${JSON.stringify(e)}\n`);return}let a=[];if(a.push(`Open Knowledge sharing mode: ${ql(n)}`),a.push(``),a.push(`Excluded from git via ${j(`.git/info/exclude`)}:`),r.length===0)a.push(` (none)`);else for(let e of r)a.push(` ${e}`);if(a.push(``),a.push(`Other OK paths exist but are tracked upstream:`),i.length===0)a.push(` (none)`);else for(let e of i)a.push(` ${e}`);a.push(``),a.push(`Toggle with: ${E(n===`local-only`?`ok config-sharing share`:`ok config-sharing unshare`)}`),process.stdout.write(`${a.join(`
80
+ `)}\n`)})}function ql(e){switch(e){case`shared`:return O(`shared`);case`local-only`:return O(`local-only`);case`no-git`:return A(`no-git (not a git repository)`)}}function Jl(){return new t(`unshare`).description(`Switch this project to local-only mode (add OK artifacts to .git/info/exclude so they stay out of git)`).option(`--project <dir>`,`Project root (defaults to cwd)`).option(`--json`,`Output JSON`,!1).action(async e=>{let t=B(e.project??process.cwd()),n=be(t,se(t));if(n.kind===`refused-tracked`){if(e.json){let e={type:`sharing-unshare`,projectRoot:t,mode:`refused-tracked`,tracked:n.tracked,remediation:n.remediation};process.stdout.write(`${JSON.stringify(e)}\n`)}else process.stderr.write(`${n.remediation}\n`);process.exitCode=1;return}if(n.kind===`no-exclude`){Yl(e.json,t,n.reason);return}let r=ve(t);if(e.json){let e={type:`sharing-unshare`,projectRoot:t,mode:r,appended:n.appended,alreadyPresent:n.alreadyPresent};process.stdout.write(`${JSON.stringify(e)}\n`);return}if(n.appended.length===0){process.stderr.write(`${j(`Sharing mode is already`)} ${O(`local-only`)} ${j(`— nothing to do.`)}\n`);return}process.stderr.write(`${O(`✓`)} ${j(`Sharing mode set to`)} ${O(`local-only`)}\n`),process.stderr.write(` Added ${n.appended.length} path(s) to ${j(`.git/info/exclude`)} (per-clone, not committed).\n`)})}function Yl(e,t,n){if(e){process.stdout.write(`${JSON.stringify({type:`sharing-unshare`,projectRoot:t,mode:`no-git`,appended:[],alreadyPresent:[],reason:n})}\n`);return}process.stderr.write(`${A({"no-git":`No git repository here — sharing mode does not apply.`,"no-info-dir":`The gitdir's info/ folder is absent; cannot toggle sharing mode.`,"malformed-pointer":"The .git pointer file is malformed (stale worktree). Run `git worktree prune` and try again.",inaccessible:`The .git path is inaccessible (permissions or mount issue).`}[n])}\n`)}function Xl(){let e=new t(`config-sharing`);return e.description(`Manage Open Knowledge's git-sharing mode (share OK config with the team, or keep local-only on this machine)`),e.addCommand(Wl()),e.addCommand(Jl()),e.addCommand(Kl()),e}const Zl=new Set([`--cwd`,`--log-level`]);function Ql(e){let t=[],n=null,r=!1;for(let i=0;i<e.length;i++){let a=e[i];if(a===`--help`||a===`-h`||a===`--version`||a===`-V`){r=!0;break}if(a===`--cwd`||a===`--log-level`){a===`--cwd`&&(n=e[i+1]??null),i++;continue}if(a.startsWith(`--cwd=`)){n=a.slice(6);continue}if(!a.startsWith(`--log-level=`)&&!(a===`--no-color`||a===`--color`)){if(a.startsWith(`-`)){Zl.has(a)&&i++;continue}t.push(a)}}return{operands:t,cwd:n,sawTerminalFlag:r}}function $l(e,t){if(e.length===0)return null;let n=e[0];return n===`open`&&e[1]!==void 0&&t.isFileish(e[1])?e[1]:t.knownSubcommands.has(n)?null:t.isFileish(n)?n:null}function eu(e){return/\.(md|mdx)$/i.test(e)}function tu(e){let t={...e};return delete t.ELECTRON_RUN_AS_NODE,t}function nu(e=()=>Nt(Mt())){return{prepare:et,detectBundlePath:()=>e().bundlePath??null,openTarget:e=>{M(`open`,[e],{detached:!0,stdio:`ignore`,env:tu(process.env)}).unref()},runProjectOpen:(e,t)=>fl(e,{project:t},dl()),runBrowserOpen:e=>au(e),log:e=>process.stdout.write(`${e}\n`),error:e=>process.stderr.write(`${e}\n`)}}async function ru(e,t){let n;try{n=t.prepare(e)}catch(e){if(e instanceof dt||e instanceof st||e instanceof it)return t.error(e.message),1;throw e}if(n.mode===`project`)return t.runProjectOpen(n.docName,n.projectRoot);if(t.detectBundlePath()){let e=`openknowledge://open?file=${encodeURIComponent(n.canonicalFilePath)}`;return t.openTarget(e),t.log(`Opening ${n.singleDocRelPath} in the Open Knowledge desktop app.`),0}return await t.runBrowserOpen(n),0}function iu(){let e=import.meta.dirname??new URL(`.`,import.meta.url).pathname;return[B(e,`public`),B(e,`../../app/dist`),B(e,`../../../app/dist`)].find(e=>P(e))}async function au(e){let{createEphemeralProjectDir:t}=await import(`./dist-CaLi0vY9.mjs`),{loadConfig:n}=await import(`./index.mjs`),{bootStartServer:r,resolveHost:i}=await import(`./start-DdWzGG1a.mjs`),{openBrowser:a}=await import(`./open-browser-C6LU_1mt.mjs`),o=iu();o||(process.stderr.write("Open Knowledge UI assets were not found. Reinstall @inkeep/open-knowledge, or build the app (`bun run build`) in a monorepo checkout.\n"),process.exit(1));let s=t(e.contentDir),c=!1,l,u=async()=>{if(!c){c=!0;try{await l?.destroy()}catch{}try{await _n(s,{recursive:!0,force:!0})}catch{}}},d=()=>{u().then(()=>process.exit(0))};process.once(`SIGINT`,d),process.once(`SIGTERM`,d);let{config:f}=n(s),p=i({},process.env);try{l=await r({config:f,cwd:s,host:p,port:0,projectDir:s,singleFile:e.canonicalFilePath,serveContentAssets:!0,reactShellDistDir:o})}catch(t){await u(),process.stderr.write(`Failed to open ${e.singleDocRelPath}: ${t instanceof Error?t.message:String(t)}\n`),process.exit(1)}let m=`http://${p}:${l.port}/#/${ft(e.docName)}`;process.stdout.write(`Opening ${e.singleDocRelPath} in your browser: ${m}\n`),process.stdout.write(`Press Ctrl-C to close the session.
81
+ `),a(m),await new Promise(()=>{})}function ou(e,t){return{server:su(`server`,e),ui:su(`ui`,t)}}function su(e,t){switch(t.status){case`missing`:return{name:e,state:`missing`,alive:!1};case`corrupt`:return{name:e,state:`corrupt`,alive:!1};case`foreign-host`:return{name:e,state:`foreign-host`,pid:t.lock.pid,port:t.lock.port,startedAt:t.lock.startedAt,host:t.lock.hostname,alive:`unknown`};case`dead-pid`:return{name:e,state:`dead-pid`,pid:t.lock.pid,port:t.lock.port,startedAt:t.lock.startedAt,host:t.lock.hostname,alive:!1};case`alive`:return{name:e,state:`alive`,pid:t.lock.pid,port:t.lock.port,startedAt:t.lock.startedAt,host:t.lock.hostname,alive:!0}}}function cu(e){return`${lu(e.server)}\n${lu(e.ui)}`}function lu(e){let t=e.name===`server`?`server`:`ui `;return e.state===`missing`?`${t} not running`:e.state===`corrupt`?`${t} lock file corrupt — run \`ok clean\``:e.state===`foreign-host`?`${t} foreign host (${e.host}) pid=${e.pid} port=${e.port}`:e.state===`dead-pid`?`${t} stale (dead pid=${e.pid}) — run \`ok clean\``:`${t} alive pid=${e.pid} port=${e.port} started=${e.startedAt}`}function uu(e){let t=e.inspect??(t=>St(e.lockDir,t)),n=e.log??(e=>console.log(e)),r=ou(t(`server`),t(`ui`));return e.json?n(JSON.stringify(r,null,2)):n(cu(r)),r}function du(e){return new t(`status`).description(`Show live state of the server + ui lockfiles for this project`).option(`--json`,`Emit structured JSON instead of formatted text`).action(t=>{e(),uu({lockDir:T(process.cwd()),json:t.json===!0})})}function fu(e){return[e,`Copyright (C) 2026 Inkeep, Inc.`,`License GPL-3.0-or-later: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.`,`This is free software: you are free to change and redistribute it.`,`There is NO WARRANTY, to the extent permitted by law.`].join(`
82
+ `)}process.argv.includes(`--no-color`)?(process.env.NO_COLOR=`1`,delete process.env.FORCE_COLOR):process.argv.includes(`--color`)&&(process.env.FORCE_COLOR=`1`,delete process.env.NO_COLOR);const Q=new t;let $,pu;function mu(){return pu}Q.name(`open-knowledge`).description(`Local-first knowledge base with CRDT collaboration`).usage(`[options] [file | command]`).version(fu(wt)).option(`--cwd <path>`,`Working directory`).option(`--log-level <level>`,`Log level`,`info`).option(`--no-color`,`Disable color output`).option(`--color`,`Force color output`).hook(`preAction`,e=>{let t=e.opts().cwd;t!==void 0&&process.chdir(t);let{config:n}=Et(t);$=n;let r=e.args?.[0]??e.name()??`cli`;pu=ut({name:`cli`,project:n.project?.name??void 0}),pu.info({command:r,cwd:process.cwd()},`cli command started`)}),Q.action(async()=>{if(Nt(Mt()).available){kt({spawn:M});return}await At($,{})});const hu=jt(()=>$);Q.addCommand(hu);const gu=ll(()=>$);Q.addCommand(gu),Q.addCommand(xe()),Q.addCommand(Tl()),Q.addCommand(ns()),Q.addCommand(Ft());const _u=ml(()=>$);Q.addCommand(_u);const vu=Se(()=>$);Q.addCommand(vu),Q.addCommand(pl()),Q.addCommand(bt(()=>$)),Q.addCommand(qi(()=>$)),Q.addCommand(du(()=>$)),Q.addCommand(_t()),Q.addCommand(zo()),Q.addCommand(Wi()),Q.addCommand(fa()),Q.addCommand(Mi()),Q.addCommand(Jo()),Q.addCommand(ia(()=>$)),Q.addCommand(_l(()=>$)),Q.addCommand(yl(()=>$)),Q.addCommand(vl(()=>$)),Q.addCommand(Ul()),Q.addCommand(Xl()),Q.addHelpText(`after`,`
84
83
  Examples:
85
84
  ok Launch the desktop app (or start a local server if it isn't installed)
86
85
  ok notes.md Open a single markdown file in the editor
87
86
  ok ./specs/foo/SPEC.md Open a file inside a project, focused on that doc
88
- ok open ./start.md Open a file whose name collides with a subcommand`);{let e=Zl(process.argv.slice(2));if(!e.sawTerminalFlag){let t=e.cwd?B(e.cwd):process.cwd(),n=new Set(Q.commands.map(e=>e.name())),r=Ql(e.operands,{knownSubcommands:n,isFileish:e=>$l(e)||P(B(t,e))});if(r!==null){let e=await nu(B(t,r),tu());process.exit(e)}}}await Q.parseAsync(process.argv,{from:`node`});export{pu as getCliLogger};
87
+ ok open ./start.md Open a file whose name collides with a subcommand`);{let e=Ql(process.argv.slice(2));if(!e.sawTerminalFlag){let t=e.cwd?B(e.cwd):process.cwd(),n=new Set(Q.commands.map(e=>e.name())),r=$l(e.operands,{knownSubcommands:n,isFileish:e=>eu(e)||P(B(t,e))});if(r!==null){let e=await ru(B(t,r),nu());process.exit(e)}}}await Q.parseAsync(process.argv,{from:`node`});export{mu as getCliLogger};
89
88
  //# sourceMappingURL=cli.mjs.map