@inkeep/open-knowledge 0.9.0-beta.22 → 0.9.0-beta.24

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 (45) 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 +16 -16
  4. package/dist/constants-9KdejJJk.mjs +2 -0
  5. package/dist/dist-6fxKGDDG.mjs +1 -0
  6. package/dist/{dist-C0bgQKk4.mjs → dist-CMscG2kI.mjs} +13 -13
  7. package/dist/{gh-detect-Ca37qZlN.mjs → gh-detect-BA7tlPzY.mjs} +2 -2
  8. package/dist/index.mjs +1 -1
  9. package/dist/{init-CwSdEGNM.mjs → init-3vdjsD8n.mjs} +12 -12
  10. package/dist/init-SeSpPYyd.mjs +1 -0
  11. package/dist/loader-BfOwIuJm.mjs +1 -0
  12. package/dist/{loader-COr1zlN9.mjs → loader-Ct0fXEwV.mjs} +3 -3
  13. package/dist/preview-BsZRww7n.mjs +1 -0
  14. package/dist/{preview-DVy-YKKf.mjs → preview-DjZKbFER.mjs} +2 -2
  15. package/dist/public/assets/{ActivityModeContent-C7Z-n8A1.js → ActivityModeContent-Bxcs90sA.js} +1 -1
  16. package/dist/public/assets/{DocumentContext-BmNVf8NM.js → DocumentContext-BRXoFr4h.js} +1 -1
  17. package/dist/public/assets/{GraphPanel-Dlar3b3E.js → GraphPanel-BQnBMuDr.js} +1 -1
  18. package/dist/public/assets/{SettingsDialogBody-DtmoEQS6.js → SettingsDialogBody-DCpd0ER8.js} +1 -1
  19. package/dist/public/assets/{SourceEditor-COwSygjD.js → SourceEditor-CtE4ldVf.js} +1 -1
  20. package/dist/public/assets/{config-validation-events-DW1G7fm8.js → config-validation-events-BTJ4iVvQ.js} +1 -1
  21. package/dist/public/assets/index-BWTUeE0E.js +1914 -0
  22. package/dist/public/assets/{prop-types-4DNJo3AQ.js → prop-types-DwD6I1dQ.js} +2 -2
  23. package/dist/public/assets/{target-navigation-intent-D_uGB7Jf.js → target-navigation-intent-DlNT3oFU.js} +1 -1
  24. package/dist/public/assets/{typing-burst-detector-DS39R_MN.js → typing-burst-detector-B1zWXLjM.js} +1 -1
  25. package/dist/public/index.html +6 -6
  26. package/dist/{repair-launch-json-BvN7r9yO.mjs → repair-launch-json-7FOwbAcW.mjs} +2 -2
  27. package/dist/{repair-mcp-configs-BcOJj_Yn.mjs → repair-mcp-configs-qfOY67T9.mjs} +2 -2
  28. package/dist/{repair-skills-C9Tqo3vY.mjs → repair-skills-BWMZ934r.mjs} +2 -2
  29. package/dist/repair-skills-CDU8Q-Im.mjs +1 -0
  30. package/dist/{server-lock-BpjJj3OD-BBIfkUrm.mjs → server-lock-BpjJj3OD-C5eNAMGL.mjs} +3 -3
  31. package/dist/server-lock-CyhBidkz-mFPU94zN.mjs +1 -0
  32. package/dist/{src-Cc2Acbo-.mjs → src-D6ZUNOMR.mjs} +2 -2
  33. package/dist/{start-uaBgkDP1.mjs → start-BSRuwjn3.mjs} +2 -2
  34. package/dist/start-Bo002mgJ.mjs +1 -0
  35. package/dist/{write-project-skill-BXkbUzj3.mjs → write-project-skill-Cvfo2jEi.mjs} +2 -2
  36. package/package.json +1 -1
  37. package/dist/constants-CUUoYHEz.mjs +0 -2
  38. package/dist/dist-TZ6oxvUJ.mjs +0 -1
  39. package/dist/init-B4X8HU7E.mjs +0 -1
  40. package/dist/loader-CQapvccd.mjs +0 -1
  41. package/dist/preview-Bq4KqKL_.mjs +0 -1
  42. package/dist/public/assets/index-IuqEr_SL.js +0 -1914
  43. package/dist/repair-skills-DImV6pX2.mjs +0 -1
  44. package/dist/server-lock-CyhBidkz-Cz0kVQ20.mjs +0 -1
  45. package/dist/start-k_QkRG0i.mjs +0 -1
@@ -3,7 +3,7 @@ name: open-knowledge-discovery
3
3
  description: "Read when the user asks what Open Knowledge is, wants to install it on a repository, wants to share an Open Knowledge project with collaborators, or asks how `ok init` / `ok install-skill` / OK Desktop set up a project. Do NOT load to perform Open Knowledge reads/writes — the runtime guidance for editing markdown inside an initialized OK project ships as a separate project-local skill at `.claude/skills/open-knowledge/` whenever `ok init` runs. If the user appears to be editing markdown inside a `.ok/` project and this is the only OK skill loaded, advise them to re-run `ok init` to install the project-local skill."
4
4
  compatibility: "Any agent host — no MCP server required. Pure discovery + install guidance."
5
5
  metadata:
6
- version: "0.9.0-beta.22"
6
+ version: "0.9.0-beta.24"
7
7
  author: "Inkeep"
8
8
  repository: "https://github.com/inkeep/open-knowledge"
9
9
  ---
@@ -3,7 +3,7 @@ name: open-knowledge
3
3
  description: "MUST invoke before reading or editing any `.md` / `.mdx` file, and before any `mcp__open-knowledge__*` tool call (`exec`, `search`, `write_document`, `edit_document`, and the rest). This skill is installed into the repository by `ok init`, so its presence alone means this is an Open Knowledge project — its runtime contract governs every markdown file here, with no need to probe for a `.ok/` directory. Authoritative agent-runtime contract; supersedes the overlapping MCP server `instructions` echo."
4
4
  compatibility: "Claude Code, Claude Desktop, Claude Cowork, Claude.ai web. Requires Open Knowledge MCP server + code execution."
5
5
  metadata:
6
- version: "0.9.0-beta.22"
6
+ version: "0.9.0-beta.24"
7
7
  author: "Inkeep"
8
8
  repository: "https://github.com/inkeep/open-knowledge"
9
9
  ---
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{Bi as n,Br as r,Cn as i,Fi as a,Hi as o,Hr as s,Ki as c,Ni as l,Pi as u,Qi as d,Vi as f,Yi as p,f as m,fa as h,ki as g,n as _,pa as v,s as y,xi as ee,yr as b,zi as x}from"./server-lock-BpjJj3OD-BBIfkUrm.mjs";import{a as te,n as ne,r as S,t as re}from"./gh-detect-Ca37qZlN.mjs";import{n as ie,r as ae,t as C}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-CwSdEGNM.mjs";import{r as Te}from"./git-handle-uz8TUFSi-DaMTjKLA.mjs";import{A as Ee,Di as De,It as Oe,J as ke,Mn as Ae,Nr as je,Oi as Me,Si as Ne,Ti as Pe,Xn as Fe,Z as Ie,_i as Le,at as Re,b as ze,bi as Be,ct as Ve,ft as He,h as Ue,hr as We,ht as Ge,j as Ke,ji as qe,ki as Je,lr as Ye,q as Xe,sn as Ze,vi as Qe,vn as $e,vr as et,x as tt,xi as nt,xn as rt,yi as it}from"./dist-C0bgQKk4.mjs";import{t as at}from"./yazl-DjRp4wSy.mjs";import{a as ot,c as st,d as ct,i as lt,o as ut,s as dt,u as ft}from"./src-Cc2Acbo-.mjs";import{n as pt,t as mt}from"./constants-CUUoYHEz.mjs";import{n as ht,t as gt}from"./loader-COr1zlN9.mjs";import{_ as _t,b as vt,f as yt,h as bt,v as xt,y as St}from"./start-uaBgkDP1.mjs";import{c as Ct,i as w,n as T,o as E,r as D,s as O,t as k}from"./colors-BtKMHmBX.mjs";import{n as wt}from"./repair-skills-C9Tqo3vY.mjs";import{execSync as Tt,spawn as Et,spawnSync as A}from"node:child_process";import Dt,{basename as Ot,dirname as kt,join as j,relative as At,resolve as M,sep as jt}from"node:path";import{accessSync as Mt,closeSync as Nt,constants as Pt,cpSync as Ft,createWriteStream as It,existsSync as N,mkdirSync as P,mkdtempSync as Lt,openSync as Rt,readFileSync as F,readdirSync as zt,realpathSync as Bt,rmSync as Vt,statSync as Ht,unlinkSync as Ut,writeFileSync as I}from"node:fs";import Wt from"node:process";import{arch as Gt,freemem as Kt,homedir as qt,platform as Jt,release as Yt,tmpdir as Xt,totalmem as Zt,type as Qt,uptime as $t}from"node:os";import{fileURLToPath as en}from"node:url";import{AsyncLocalStorage as tn,AsyncResource as nn}from"node:async_hooks";import{stripVTControlCharacters as rn,styleText as L}from"node:util";import*as an from"node:readline";import{createHash as on,randomUUID as sn}from"node:crypto";import{setTimeout as cn}from"node:timers/promises";import{createInterface as ln}from"node:readline/promises";async function un(e,t,n){let r=dn(await fn(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 dn(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{Bi as n,Br as r,Cn as i,Fi as a,Hi as o,Hr as s,Ki as c,Ni as l,Pi as u,Qi as d,Vi as f,Yi as p,f as m,fa as h,ki as g,n as _,pa as v,s as y,xi as ee,yr as b,zi as x}from"./server-lock-BpjJj3OD-C5eNAMGL.mjs";import{a as te,n as ne,r as S,t as re}from"./gh-detect-BA7tlPzY.mjs";import{n as ie,r as ae,t as C}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-3vdjsD8n.mjs";import{r as Te}from"./git-handle-uz8TUFSi-DaMTjKLA.mjs";import{A as Ee,Ai as De,Ci as Oe,Cn as ke,Di as Ae,Fr as je,J as Me,Ni as Ne,Pn as Pe,Qn as Fe,Rt as Ie,Si as Le,Z as Re,_r as ze,_t as Be,b as Ve,bi as He,bn as Ue,br as We,dr as Ge,h as Ke,j as qe,ji as Je,ki as Ye,ln as Xe,mt as Ze,q as Qe,st as $e,ut as et,wi as tt,x as nt,xi as rt,yi as it}from"./dist-CMscG2kI.mjs";import{t as at}from"./yazl-DjRp4wSy.mjs";import{a as ot,c as st,d as ct,i as lt,o as ut,s as dt,u as ft}from"./src-D6ZUNOMR.mjs";import{n as pt,t as mt}from"./constants-9KdejJJk.mjs";import{n as ht,t as gt}from"./loader-Ct0fXEwV.mjs";import{_ as _t,b as vt,f as yt,h as bt,v as xt,y as St}from"./start-BSRuwjn3.mjs";import{c as Ct,i as w,n as T,o as E,r as D,s as O,t as k}from"./colors-BtKMHmBX.mjs";import{n as wt}from"./repair-skills-BWMZ934r.mjs";import{execSync as Tt,spawn as Et,spawnSync as A}from"node:child_process";import Dt,{basename as Ot,dirname as kt,join as j,relative as At,resolve as M,sep as jt}from"node:path";import{accessSync as Mt,closeSync as Nt,constants as Pt,cpSync as Ft,createWriteStream as It,existsSync as N,mkdirSync as P,mkdtempSync as Lt,openSync as Rt,readFileSync as F,readdirSync as zt,realpathSync as Bt,rmSync as Vt,statSync as Ht,unlinkSync as Ut,writeFileSync as I}from"node:fs";import Wt from"node:process";import{arch as Gt,freemem as Kt,homedir as qt,platform as Jt,release as Yt,tmpdir as Xt,totalmem as Zt,type as Qt,uptime as $t}from"node:os";import{fileURLToPath as en}from"node:url";import{AsyncLocalStorage as tn,AsyncResource as nn}from"node:async_hooks";import{stripVTControlCharacters as rn,styleText as L}from"node:util";import*as an from"node:readline";import{createHash as on,randomUUID as sn}from"node:crypto";import{setTimeout as cn}from"node:timers/promises";import{createInterface as ln}from"node:readline/promises";async function un(e,t,n){let r=dn(await fn(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 dn(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 fn(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 pn(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 un(process.stdin,process.stdout,t);process.exit(n)}),n}function mn(e){let t=e.endpoint.DEFAULTS;return/^https:\/\/(api\.)?github\.com$/.test(t.baseUrl)?`https://github.com`:t.baseUrl.replace(`/api/v3`,``)}async function hn(e,t,n){let r={baseUrl:mn(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 gn(e){let t=e.request||C,n={client_id:e.clientId};return`scopes`in e&&Array.isArray(e.scopes)&&(n.scope=e.scopes.join(` `)),hn(t,`POST /login/device/code`,n)}async function _n(e){let t=await hn(e.request||C,`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=vn(e,t.data.expires_in),n.refreshTokenExpiresAt=vn(e,t.data.refresh_token_expires_in)}delete n.scopes}return{...t,authentication:n}}function vn(e,t){return new Date(e+t*1e3).toISOString()}async function yn(e,t){let n=bn(e,t.auth);if(n)return n;let{data:r}=await gn({clientType:e.clientType,clientId:e.clientId,request:t.request||e.request,scopes:t.auth.scopes||e.scopes});await e.onVerification(r);let i=await Sn(t.request||e.request,e.clientId,e.clientType,r);return e.authentication=i,i}function bn(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 xn(e){await new Promise(t=>setTimeout(t,e*1e3))}async function Sn(e,t,n,r){try{let i={clientId:t,request:e,code:r.device_code},{authentication:a}=n===`oauth-app`?await _n({...i,clientType:`oauth-app`}):await _n({...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 xn(r.interval),Sn(e,t,n,r);if(a===`slow_down`)return await xn(r.interval+7),Sn(e,t,n,r);throw i}}async function Cn(e,t){return yn(e,{auth:t})}async function wn(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 yn(e,{request:t,auth:{type:`oauth`}});return i.headers.authorization=`token ${a}`,t(i)}var Tn=`0.0.0-development`;function En(e){let t=e.request||C.defaults({headers:{"user-agent":`octokit-auth-oauth-device.js/${Tn} ${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(Cn.bind(null,i),{hook:wn.bind(null,i)})}async function Dn(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=En({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 On={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 kn;(function(e){})(kn||={});function An(e){return d(g,e)}function jn(){return process.env.OPEN_KNOWLEDGE_GITHUB_CLIENT_ID??`Ov23liqlSd0V1MwR6rhI`}const Mn=new Set([`gitlab.com`,`bitbucket.org`,`codeberg.org`,`gitea.com`,`sr.ht`,`sourcehut.org`]);function R(e){let t=e.toLowerCase().replace(/:\d+$/,``);Mn.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 Nn(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function Pn(e,t,n=Dn){let r=jn(),{host:i,json:a}=e;R(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?Nn(!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?Nn(!0,{type:`complete`,host:i,login:s}):process.stderr.write(`✓ Logged in as ${s} on ${i}\n`)}function Fn(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 Pn(t,await e())})}const In=e=>e.name===`enter`||e.name===`return`;var Ln=class extends Error{name=`AbortPromptError`;message=`Prompt was aborted`;constructor(e){super(),this.cause=e?.cause}},Rn=class extends Error{name=`CancelPromptError`;message=`Prompt was canceled`},zn=class extends Error{name=`ExitPromptError`},Bn=class extends Error{name=`HookError`},Vn=class extends Error{name=`ValidationError`};const Hn=new tn;function Un(e){return{rl:e,hooks:[],hooksCleanup:[],hooksEffect:[],index:0,handleChange(){}}}function Wn(e,t){let n=Un(e);return Hn.run(n,()=>{function e(e){n.handleChange=()=>{n.index=0,e()},n.handleChange()}return t(e)})}function z(){let e=Hn.getStore();if(!e)throw new Bn(`[Inquirer] Hook functions can only be called from within a prompt`);return e}function Gn(){return z().rl}function Kn(e){return nn.bind((...t)=>{let n=z(),r=!1,i=n.handleChange;n.handleChange=()=>{r=!0};let a=e(...t);return r&&i(),n.handleChange=i,a})}function qn(e){let t=z(),{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 Jn(){z().handleChange()}const Yn={queue(e){let t=z(),{index:n}=t;t.hooksEffect.push(()=>{t.hooksCleanup[n]?.();let r=e(Gn());if(r!=null&&typeof r!=`function`)throw new Vn(`useEffect return value must be a cleanup function or nothing.`);t.hooksCleanup[n]=r})},run(){let e=z();Kn(()=>{e.hooksEffect.forEach(e=>{e()}),e.hooksEffect.length=0})()},clearAll(){let e=z();e.hooksCleanup.forEach(e=>{e?.()}),e.hooksEffect.length=0,e.hooksCleanup.length=0}};function Xn(e){return typeof e==`function`}function B(e){return qn(t=>{let n=nn.bind(function(e){t.get()!==e&&(t.set(e),Jn())});if(t.initialized)return[t.get(),n];let r=Xn(e)?e():e;return t.set(r),[r,n]})}function Zn(e,t){qn(n=>{let r=n.get();(!Array.isArray(r)||t.some((e,t)=>!Object.is(e,r[t])))&&Yn.queue(e),n.set(t)})}const Qn={prefix:{idle:L(`blue`,`?`),done:L(`green`,ue.tick)},spinner:{interval:80,frames:[`⠋`,`⠙`,`⠹`,`⠸`,`⠼`,`⠴`,`⠦`,`⠧`,`⠇`,`⠏`].map(e=>L(`yellow`,e))},style:{answer:e=>L(`cyan`,e),message:e=>L(`bold`,e),error:e=>L(`red`,`> ${e}`),defaultAnswer:e=>L(`dim`,`(${e})`),help:e=>L(`dim`,e),highlight:e=>L(`cyan`,e),key:e=>L(`cyan`,L(`bold`,`<${e}>`))}};function $n(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 er(...e){let t={};for(let n of e)for(let[e,r]of Object.entries(n)){let n=t[e];t[e]=$n(n)&&$n(r)?er(n,r):r}return t}function tr(...e){return er(Qn,...e.filter(e=>e!=null))}function nr({status:e=`idle`,theme:t}){let[n,r]=B(!1),[i,a]=B(0),{prefix:o,spinner:s}=tr(t);return Zn(()=>{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 rr(e){return B({current:e})[0]}function ir(e){let t=rr(e);t.current=e,Zn(e=>{let n=!1,r=Kn((r,i)=>{n||t.current(i,e)});return e.input.on(`keypress`,r),()=>{n=!0,e.input.removeListener(`keypress`,r)}},[])}var ar=e(ye(),1);function or(e,t){return e.split(`
4
4
  `).flatMap(e=>oe(e,t,{trim:!1,hard:!0}).split(`
5
5
  `).map(e=>e.trimEnd())).join(`
@@ -18,16 +18,16 @@ import{o as e}from"./chunk-FK9Q3tQk.mjs";import{t}from"./esm-CEs3LWY3.mjs";impor
18
18
  `):process.stderr.write(`✗ Token invalid for ${n}\n`),process.exit(1)}}function bi(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 yi(t,await e())})}function xi(){let e=new t(`auth`);e.description(`GitHub authentication management`);let n=()=>S();return e.addCommand(Fn(n)),e.addCommand(bi(n)),e.addCommand(hi(n)),e.addCommand(_i()),e.addCommand(fi(n)),e.addCommand(pn(n)),e}const Si=[{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]@`}],Ci=Si.map(e=>e.name);function wi(e){let t=new Set,n=0;return{redacted:e.split(`
19
19
  `).map(e=>{let r=e;for(let{name:e,regex:i,replacement:a}of Si)i.lastIndex=0,i.test(r)&&(t.add(e),n++,i.lastIndex=0,r=r.replace(i,a));return r}).join(`
20
20
  `),patterns:[...t],lineCount:n}}const Ti=j(qt(),`.ok`,`logs`),Ei=j(qt(),`.ok`,`bug-reports`);function Di(e){let t=j(e,`.ok`,`config.yml`);if(N(t))try{let e=F(t,`utf8`).match(/^\s*name:\s*['"]?(.+?)['"]?\s*$/m);if(e?.[1])return e[1]}catch{}return N(j(e,`.ok`))?on(`sha256`).update(M(e)).digest(`hex`).slice(0,12):null}function Oi(){let e={timestamp:new Date().toISOString(),platform:Jt(),osType:Qt(),osRelease:Yt(),hostname:`[redacted]`,uptime:$t(),freeMem:Kt(),totalMem:Zt(),nodeVersion:process.version,bunVersion:process.versions.bun??null,v8Version:process.versions.v8??null,pid:process.pid};try{e.macosVersion=Tt(`sw_vers -productVersion 2>/dev/null`,{encoding:`utf8`}).trim()}catch{}try{let t=j(__dirname,`..`,`..`,`package.json`);N(t)&&(e.okVersion=JSON.parse(F(t,`utf8`)).version)}catch{}return e}function ki(e){if(!N(Ti))return{files:[],dir:Ti};let t=zt(Ti).filter(e=>e.endsWith(`.log`)||/\.log\.\d+$/.test(e)).map(e=>j(Ti,e));if(e&&t.length>0){let n=t.filter(t=>{try{return F(t,`utf8`).includes(`"project":"${e}"`)}catch{return!0}});n.length>0&&(t=n)}return{files:t,dir:Ti}}function Ai(e){let t=j(e,`.ok`,`local`);return N(t)?{files:[`server.lock`,`last-spawn-error.log`].map(e=>j(t,e)).filter(e=>N(e)),dir:t}:{files:[],dir:null}}function ji(e){let t=j(e,`.ok`,`local`,`logs`);return N(t)?{files:[`server-current.jsonl`,`server-prev.jsonl`].map(e=>j(t,e)).filter(e=>N(e)),dir:t}:{files:[],dir:null}}async function Mi(t){let n=Ol();P(Ei,{recursive:!0});let r=j(Ei,`${new Date().toISOString().replace(/[:.]/g,`-`)}-bugreport.zip`);n?.info({projectSlug:t.projectSlug},`gathering diagnostic data`);let i=Oi(),{files:a}=ki(t.projectSlug),{files:o}=Ai(t.cwd),{files:s}=ji(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}=wi(F(e,`utf8`)),i=`logs/${Ot(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}=wi(F(e,`utf8`)),i=`lockdir/${Ot(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}=wi(F(e,`utf8`)),i=`local-logs/${Ot(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: ${Ci.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=It(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&&Jt()===`darwin`)try{Et(`/usr/bin/open`,[`-R`,r],{detached:!0,stdio:`ignore`}).unref()}catch{}return r}function Ni(){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=Di(t);try{await Mi({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 Pi(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 Fi(e){let t=e.inspect??(t=>ct(e.lockDir,t)),n=e.unlink??(e=>Ut(e)),r=e.log??(e=>console.log(e)),i=e.error??(e=>console.error(e)),a=Pi(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 Ii(e){return new t(`clean`).description(`Prune stale / corrupt open-knowledge lock files (never touches live locks)`).action(()=>{e(),Fi({lockDir:et(process.cwd())}).failed.length>0&&(process.exitCode=1)})}async function Li(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 Ri(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 zi=[[`count`,0,10],[`compress`,10,20],[`receiv`,20,60],[`resolv`,60,100]];function Bi(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 zi)if(n.includes(e))return{stage:t[1],pct:Math.round(i+r/100*(a-i))};return null}function U(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}function Vi(e){return typeof e!=`string`||e.length===0?[`--progress`]:[`--progress`,`-b`,e]}const Hi=s;async function Ui(e){try{return await e.clone(Vi(e.branch)),{fellBack:!1}}catch(t){if(e.branch!==null&&Hi(t))return e.onFallback(e.branch),await e.clone(Vi(null)),{fellBack:!0};throw t}}function Wi(e,t,n){return e===`https`&&t===`github.com`&&n}async function Gi(e,t,n,r=process.cwd()){let i=ft(e);if(!i)throw Error(`Invalid git URL: ${e}`);let a=t.dir?M(r,t.dir):M(r,i.name);if(N(a)&&zt(a).length>0)throw Error(`Target directory is not empty: ${a}`);let o=te(),s=i.protocol===`https`&&i.hostname===`github.com`?await Ri(i.owner,i.name):!1,c=Wi(i.protocol,i.hostname,s)?{tier:`none`,credentialArgs:[]}:await Li(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
+ `);d.addBuffer(Buffer.from(h,`utf8`),`README.md`),d.end();let g=It(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&&Jt()===`darwin`)try{Et(`/usr/bin/open`,[`-R`,r],{detached:!0,stdio:`ignore`}).unref()}catch{}return r}function Ni(){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=Di(t);try{await Mi({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 Pi(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 Fi(e){let t=e.inspect??(t=>ct(e.lockDir,t)),n=e.unlink??(e=>Ut(e)),r=e.log??(e=>console.log(e)),i=e.error??(e=>console.error(e)),a=Pi(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 Ii(e){return new t(`clean`).description(`Prune stale / corrupt open-knowledge lock files (never touches live locks)`).action(()=>{e(),Fi({lockDir:We(process.cwd())}).failed.length>0&&(process.exitCode=1)})}async function Li(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 Ri(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 zi=[[`count`,0,10],[`compress`,10,20],[`receiv`,20,60],[`resolv`,60,100]];function Bi(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 zi)if(n.includes(e))return{stage:t[1],pct:Math.round(i+r/100*(a-i))};return null}function U(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}function Vi(e){return typeof e!=`string`||e.length===0?[`--progress`]:[`--progress`,`-b`,e]}const Hi=s;async function Ui(e){try{return await e.clone(Vi(e.branch)),{fellBack:!1}}catch(t){if(e.branch!==null&&Hi(t))return e.onFallback(e.branch),await e.clone(Vi(null)),{fellBack:!0};throw t}}function Wi(e,t,n){return e===`https`&&t===`github.com`&&n}async function Gi(e,t,n,r=process.cwd()){let i=ft(e);if(!i)throw Error(`Invalid git URL: ${e}`);let a=t.dir?M(r,t.dir):M(r,i.name);if(N(a)&&zt(a).length>0)throw Error(`Target directory is not empty: ${a}`);let o=te(),s=i.protocol===`https`&&i.hostname===`github.com`?await Ri(i.owner,i.name):!1,c=Wi(i.protocol,i.hostname,s)?{tier:`none`,credentialArgs:[]}:await Li(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
22
  `)){let n=Bi(e);n&&n.pct!==u&&(u=n.pct,U(t.json,{type:`progress`,pct:n.pct,stage:n.stage}),t.json||process.stderr.write(`\r Cloning ${n.pct}%`))}})}),await Ui({branch:typeof t.branch==`string`&&t.branch.length>0?t.branch:null,clone:t=>l.clone(e,a,t),onFallback:e=>{U(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-B4X8HU7E.mjs`),n=await e({cwd:a,mcp:!1});if(n.contentUpdated.length>0){let e=`auto-init: updated ${n.contentUpdated.join(`, `)}`;t.json?U(!0,{type:`warning`,message:e}):process.stderr.write(` ${e}\n`)}}catch(e){let n=e instanceof Error?e.message:String(e);t.json?U(!0,{type:`warning`,message:`auto-init: ${n}`}):process.stderr.write(` auto-init: ${n}\n`)}try{Ki(a)}catch(e){let n=e instanceof Error?e.message:String(e);t.json?U(!0,{type:`warning`,message:`git-exclude: ${n}`}):process.stderr.write(` git-exclude: ${n}\n`)}return a}function Ki(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 qi(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 Gi(t,{json:r.json,dir:n,branch:r.branch??null},i);if(r.json)U(!0,{type:`complete`,dir:a});else{process.stderr.write(`✓ Cloned to ${a}\n`),process.chdir(a);let{startCommand:t}=await import(`./start-k_QkRG0i.mjs`);await t(e).parseAsync([],{from:`user`})}}catch(e){let t=e instanceof Error?e.message:String(e);r.json?U(!0,{type:`error`,message:t}):process.stderr.write(`✗ ${t}\n`),process.exitCode=1}})}var Ji=v();const Yi=[[`sync`],[`persistence`,`debounceMs`],[`persistence`,`maxDebounceMs`],[`server`,`port`],[`content`,`include`],[`content`,`exclude`]];function Xi(e={}){let t=e.log??(e=>console.error(e)),n=e.error??(e=>console.error(e)),r=e.loadConfigFn??ht;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 Zi(e){let t=(0,Ji.parseDocument)(F(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 Yi)t.hasIn(e)&&n.push(e.join(`.`));return n}function Qi(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function $i(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=Qi(i)?i:{};e[r]=a,e=a}e[n[n.length-1]]=null}return t}async function ea(e={}){let t=e.log??(e=>console.log(e)),n=e.error??(e=>console.error(e)),i=e.scope??`both`,a=e.dryRun??!1,o=e.cwd??process.cwd(),s=e.writeConfigPatchFn??De,c=[];(i===`project`||i===`both`)&&c.push({scope:`project`,absPath:Pe(`project`,o,e.homedirOverride)}),(i===`user`||i===`both`)&&c.push({scope:`user`,absPath:Pe(`user`,o,e.homedirOverride)});let l=[],u=!0;for(let{scope:t,absPath:n}of c){if(!N(n)){l.push({path:n,scope:t,found:[],removed:[]});continue}let i;try{i=Zi(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(i.length===0||a){l.push({path:n,scope:t,found:i,removed:[]});continue}let c=await s({cwd:o,scope:t,patch:$i(Yi.filter(e=>i.includes(e.join(`.`)))),homedirOverride:e.homedirOverride});if(!c.ok){l.push({path:n,scope:t,found:i,removed:[],error:r(c.error)}),u=!1;continue}l.push({path:n,scope:t,found:i,removed:i})}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(a?`[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 ta(){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(()=>{Xi({}).ok||(process.exitCode=1)}),e.command(`migrate`).description(`Remove deprecated config fields (sync.*, persistence.{debounceMs,maxDebounceMs}, server.port, content.{include,exclude}) idempotently`).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 ea({scope:t,dryRun:e.dryRun})).ok||(process.exitCode=1)}),e}var na=e(at(),1),W=e(Ct(),1);const ra=new Set([`doc.name`]);function ia(e){return`doc:${on(`blake2b512`,{outputLength:32}).update(e).digest(`hex`).slice(0,8)}`}function aa(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 oa(e,t){let n=t.originalToHashed.get(e);if(n!==void 0)return n;let r=ia(e);return t.originalToHashed.set(e,r),aa(t,e,r),r}function sa(e,t){return t.length===0||!e.includes(t)?e:e.split(t).join(`<CONTENT_DIR>`)}function ca(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function la(e,t){if(typeof e==`string`)return sa(e,t.contentDir);if(Array.isArray(e))return e.map(e=>la(e,t));if(!ca(e))return e;let n=typeof e.key==`string`&&ra.has(e.key)&&ca(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`&&ca(a)){let e=oa(n,t);r[i]={...a,stringValue:e}}else ra.has(i)&&typeof a==`string`?r[i]=oa(a,t):r[i]=la(a,t);return r}function ua(e,t){let n=F(e,`utf-8`);if(n.length===0)return;let r=n.endsWith(`
23
+ `);try{let{runInit:e}=await import(`./init-SeSpPYyd.mjs`),n=await e({cwd:a,mcp:!1});if(n.contentUpdated.length>0){let e=`auto-init: updated ${n.contentUpdated.join(`, `)}`;t.json?U(!0,{type:`warning`,message:e}):process.stderr.write(` ${e}\n`)}}catch(e){let n=e instanceof Error?e.message:String(e);t.json?U(!0,{type:`warning`,message:`auto-init: ${n}`}):process.stderr.write(` auto-init: ${n}\n`)}try{Ki(a)}catch(e){let n=e instanceof Error?e.message:String(e);t.json?U(!0,{type:`warning`,message:`git-exclude: ${n}`}):process.stderr.write(` git-exclude: ${n}\n`)}return a}function Ki(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 qi(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 Gi(t,{json:r.json,dir:n,branch:r.branch??null},i);if(r.json)U(!0,{type:`complete`,dir:a});else{process.stderr.write(`✓ Cloned to ${a}\n`),process.chdir(a);let{startCommand:t}=await import(`./start-Bo002mgJ.mjs`);await t(e).parseAsync([],{from:`user`})}}catch(e){let t=e instanceof Error?e.message:String(e);r.json?U(!0,{type:`error`,message:t}):process.stderr.write(`✗ ${t}\n`),process.exitCode=1}})}var Ji=v();const Yi=[[`sync`],[`persistence`,`debounceMs`],[`persistence`,`maxDebounceMs`],[`server`,`port`],[`content`,`include`],[`content`,`exclude`]];function Xi(e={}){let t=e.log??(e=>console.error(e)),n=e.error??(e=>console.error(e)),r=e.loadConfigFn??ht;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 Zi(e){let t=(0,Ji.parseDocument)(F(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 Yi)t.hasIn(e)&&n.push(e.join(`.`));return n}function Qi(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function $i(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=Qi(i)?i:{};e[r]=a,e=a}e[n[n.length-1]]=null}return t}async function ea(e={}){let t=e.log??(e=>console.log(e)),n=e.error??(e=>console.error(e)),i=e.scope??`both`,a=e.dryRun??!1,o=e.cwd??process.cwd(),s=e.writeConfigPatchFn??Ye,c=[];(i===`project`||i===`both`)&&c.push({scope:`project`,absPath:Ae(`project`,o,e.homedirOverride)}),(i===`user`||i===`both`)&&c.push({scope:`user`,absPath:Ae(`user`,o,e.homedirOverride)});let l=[],u=!0;for(let{scope:t,absPath:n}of c){if(!N(n)){l.push({path:n,scope:t,found:[],removed:[]});continue}let i;try{i=Zi(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(i.length===0||a){l.push({path:n,scope:t,found:i,removed:[]});continue}let c=await s({cwd:o,scope:t,patch:$i(Yi.filter(e=>i.includes(e.join(`.`)))),homedirOverride:e.homedirOverride});if(!c.ok){l.push({path:n,scope:t,found:i,removed:[],error:r(c.error)}),u=!1;continue}l.push({path:n,scope:t,found:i,removed:i})}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(a?`[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 ta(){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(()=>{Xi({}).ok||(process.exitCode=1)}),e.command(`migrate`).description(`Remove deprecated config fields (sync.*, persistence.{debounceMs,maxDebounceMs}, server.port, content.{include,exclude}) idempotently`).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 ea({scope:t,dryRun:e.dryRun})).ok||(process.exitCode=1)}),e}var na=e(at(),1),W=e(Ct(),1);const ra=new Set([`doc.name`]);function ia(e){return`doc:${on(`blake2b512`,{outputLength:32}).update(e).digest(`hex`).slice(0,8)}`}function aa(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 oa(e,t){let n=t.originalToHashed.get(e);if(n!==void 0)return n;let r=ia(e);return t.originalToHashed.set(e,r),aa(t,e,r),r}function sa(e,t){return t.length===0||!e.includes(t)?e:e.split(t).join(`<CONTENT_DIR>`)}function ca(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function la(e,t){if(typeof e==`string`)return sa(e,t.contentDir);if(Array.isArray(e))return e.map(e=>la(e,t));if(!ca(e))return e;let n=typeof e.key==`string`&&ra.has(e.key)&&ca(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`&&ca(a)){let e=oa(n,t);r[i]={...a,stringValue:e}}else ra.has(i)&&typeof a==`string`?r[i]=oa(a,t):r[i]=la(a,t);return r}function ua(e,t){let n=F(e,`utf-8`);if(n.length===0)return;let r=n.endsWith(`
24
24
  `),i=n.split(`
25
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=la(JSON.parse(n),t);a.push(JSON.stringify(e))}catch{a.push(n)}}}I(e,r?`${a.join(`
26
26
  `)}\n`:a.join(`
27
27
  `))}function da(e,t){let n=F(e,`utf-8`);if(n.trim().length!==0)try{let r=la(JSON.parse(n),t),i=n.endsWith(`
28
28
  `)?`
29
- `:``;I(e,`${JSON.stringify(r,null,2)}${i}`)}catch{let r=sa(n,t.contentDir);r!==n&&I(e,r)}}function fa(e,t){let n=F(e,`utf-8`),r=sa(n,t.contentDir);r!==n&&I(e,r)}function pa(e){try{return zt(e,{withFileTypes:!0}).filter(e=>e.isFile()).map(t=>j(e,t.name))}catch{return[]}}const ma=new Set([`agent-presence.json`,`runtime.json`]);function ha(e){let t={contentDir:e.contentDir,docNameMap:{},originalToHashed:new Map,docNameCollisions:{}};for(let n of[`telemetry`,`logs`,`process`])for(let r of pa(j(e.stagingDir,n)))r.endsWith(`.jsonl`)?ua(r,t):r.endsWith(`.json`)?da(r,t):fa(r,t);for(let n of pa(j(e.stagingDir,`state`))){let e=n.slice(n.lastIndexOf(`/`)+1);ma.has(e)?da(n,t):fa(n,t)}return{docNameMap:t.docNameMap,docNameCollisions:t.docNameCollisions}}const ga=[`.ok`,`local`,`telemetry`],_a=[`.ok`,`local`,`logs`],va=`spans-current.jsonl`,ya=`spans-prev.jsonl`,ba=`server-current.jsonl`,xa=`server-prev.jsonl`;function Sa(e){return j(e,...ga,va)}function Ca(e){return j(e,...ga,ya)}function wa(e){return j(e,..._a,ba)}function Ta(e){return j(e,..._a,xa)}async function Ea(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 Da(e){let t=j(e,`.git`,`ok`);if(!N(t))return null;let n=A(`git`,[`-C`,t,`log`,`--oneline`,`-50`],{encoding:`utf-8`,timeout:2e3});return n.error||n.status!==0?null:n.stdout??``}function Oa(){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 ka(){return{nodeVersion:process.version,platform:Jt(),arch:Gt()}}function Aa(){return process.env.OTEL_SDK_DISABLED===`false`}function ja(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Ma(e){if(!N(e))return{};let t;try{t=(0,Ji.parse)(F(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(!ja(t))return{};let n=t.telemetry;if(!ja(n))return{};let r=n.localSink;return ja(r)?r:{}}function Na(e){return typeof e==`boolean`?e:void 0}function Pa(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?e:void 0}function Fa(e){if(ja(e))return Pa(e.maxBytes)}function Ia(e){let t=Ma(Pe(`project`,e)),n=Ma(Pe(`project-local`,e));return{enabled:Na(n.enabled)??Na(t.enabled)??!0,spansMaxBytes:Fa(n.spans)??Fa(t.spans)??52428800,logsMaxBytes:Fa(n.logs)??Fa(t.logs)??26214400}}function La(e){return on(`sha256`).update(e).digest(`hex`)}function Ra(e){let t=F(e),n=0;for(let e=0;e<t.length;e++)t[e]===10&&n++;return n}function za(e){let t=F(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 G(e,t){return N(e)?(P(kt(t),{recursive:!0}),Ft(e,t),!0):!1}function Ba(e){let t=[],n=e=>{let r=zt(e,{withFileTypes:!0});for(let i of r){let r=j(e,i.name);i.isDirectory()?n(r):i.isFile()&&t.push(r)}};return n(e),t.sort()}const Va=new Set([`.jsonl`]);function Ha(e){let t=e.lastIndexOf(`.`);return t===-1?!1:Va.has(e.slice(t))}function Ua(e,t){return At(e,t).split(jt).join(`/`)}async function Wa(e){let t=M(e.contentDir),n=e.deps??{},r=n.fetchAgentPresence??Ea,i=n.readShadowHead??Da,a=n.now??(()=>new Date),o=n.okVersion??(()=>pt),s=n.readDesktopEnv??Oa,c=n.readRuntime??ka,l=n.isOtlpPushEnabled??Aa,u=Lt(j(Xt(),`ok-bundle-`));P(j(u,`telemetry`),{recursive:!0}),P(j(u,`logs`),{recursive:!0}),P(j(u,`state`),{recursive:!0}),G(Sa(t),j(u,`telemetry`,va)),G(Ca(t),j(u,`telemetry`,ya)),G(wa(t),j(u,`logs`,ba)),G(Ta(t),j(u,`logs`,xa));let d=j(t,`.ok`,`local`),f=j(d,`server.lock`),p=`not-running`,m=`no server.lock`,h=null;if(N(f)){G(f,j(u,`state`,`server.lock`));try{let e=F(f,`utf-8`),t=JSON.parse(e);typeof t.port==`number`?h=t.port:m=`lock present but no port`}catch{m=`lock present but unparseable`}}if(h!==null){let e=await r(h);e===null?m=`agent-presence endpoint at :${h} unreachable`:(I(j(u,`state`,`agent-presence.json`),e),p=`running`,m=``)}let g=i(t);g!==null&&I(j(u,`state`,`shadow-head.txt`),g),G(j(d,`last-spawn-error.log`),j(u,`state`,`last-spawn-error.log`));let _=c(),v=s(),y={ok:{version:o(),nodeVersion:_.nodeVersion,platform:_.platform,arch:_.arch},host:{desktop:v}};I(j(u,`state`,`runtime.json`),`${JSON.stringify(y,null,2)}\n`);let ee=p===`running`?`running
30
- `:`not-running (${m})\n`;if(I(j(u,`state`,`server-status.txt`),ee),e.processDir&&N(e.processDir)){let t=j(u,`process`);P(t,{recursive:!0}),Ft(e.processDir,t,{recursive:!0})}let b=null;e.redact===!0&&(b=ha({stagingDir:u,contentDir:t}));let x=Ia(e.projectDir??t),te=Ba(u),ne=[],S=0,re=0;for(let e of te){let t=Ua(u,e),n=Ht(e).size,r=Ha(t)?Ra(e):0;ne.push({path:t,bytes:n,lines:r}),S+=n,t.startsWith(`telemetry/`)&&Ha(t)&&(re+=za(e))}let ie={schemaVersion:1,createdAt:a().toISOString(),ok:{version:o(),nodeVersion:_.nodeVersion,platform:_.platform,arch:_.arch},host:{desktop:v},contentDir:{pathSha256:La(t),absolutePath:b===null?t:`<CONTENT_DIR>`},telemetry:{localSink:x,otlpPushEnabled:l()},redaction:b===null?{applied:!1,docNameMapSidecar:null}:Object.keys(b.docNameCollisions).length>0?{applied:!0,docNameMapSidecar:null,docNameCollisions:b.docNameCollisions}:{applied:!0,docNameMapSidecar:null},serverStatus:p,files:ne};I(j(u,`manifest.json`),`${JSON.stringify(ie,null,2)}\n`);let ae=te.some(e=>{try{return F(e,`utf-8`).includes(t)}catch{return!1}}),C={totalBytes:S,fileCount:ne.length,docNameCount:re,contentDirVisible:ae,redacted:b!==null},oe=!1;return{stagingDir:u,manifest:ie,summary:C,redactionMapPayload:b===null?null:{docNameMap:b.docNameMap,docNameCollisions:b.docNameCollisions},cleanup:()=>{oe||(oe=!0,Vt(u,{recursive:!0,force:!0}))}}}async function Ga(e){let{collected:t,outputPath:n}=e,r=kt(n);if(!N(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=`${Ot(n,`.zip`)}.docnames.json`,r={...t.manifest,redaction:{...t.manifest.redaction,applied:!0,docNameMapSidecar:e}};I(j(t.stagingDir,`manifest.json`),`${JSON.stringify(r,null,2)}\n`)}let i=new na.ZipFile,a=Ba(t.stagingDir);for(let e of a){let n=Ua(t.stagingDir,e);i.addFile(e,n)}i.end(),t.redactionMapPayload!==null&&I(j(r,`${Ot(n,`.zip`)}.docnames.json`),`${JSON.stringify({docNameMap:t.redactionMapPayload.docNameMap,docNameCollisions:t.redactionMapPayload.docNameCollisions},null,2)}\n`,{mode:384});let o=It(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 Ka(){let e=A(`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 qa(e={}){let t=e.probe??Ka;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 Ja(e={}){let t=e.loader??ht;return{name:`config-yaml`,run:async e=>{if(!N(M(e.cwd,`.ok`,`config.yml`)))return{name:`config-yaml`,status:`warn`,summary:`.ok/${mt} 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/${mt} failed to parse`,detail:t}}}}}function Ya(e){try{return Mt(e,Pt.W_OK),{writable:!0}}catch(e){return{writable:!1,reason:e instanceof Error?e.message:String(e)}}}function Xa(e={}){let t=e.loader??ht,n=e.probeWritable??Ya;return{name:`content-dir`,run:async e=>{if(!N(M(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=M(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(!N(r))return{name:`content-dir`,status:`fail`,summary:`content.dir does not exist: ${r}`,remediation:`Create the directory or fix \`content.dir\` in .ok/${mt}.`};if(!Ht(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 Za(e={}){let t=e.assert??Ve;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 ze)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 tt)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 Qa(e){let t=A(`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 $a(e={}){let t=e.platform??process.platform,n=e.execPath??process.execPath,r=e.codesignVerify??Qa;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 eo=[`git`,`bun`,`config-yaml`,`content-dir`,`server-lock`,`shadow-repo`,`macos-codesig`];function to(e){return eo.includes(e)}async function no(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 ro(e,t,n={}){let r=[];for(let i of e)r.push(await no(i,t,n));return r}function io(e={}){let t=e.inspect??ct;return{name:`server-lock`,run:async e=>{let n=et(e.cwd);if(!N(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 ${M(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 ao(e={}){let t=e.resolve??qe;return{name:`shadow-repo`,run:async e=>{if(!N(M(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 Je||e instanceof Me)return{name:`shadow-repo`,status:`fail`,summary:`cannot resolve shadow gitdir: ${e.message}`};throw e}if(!N(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=M(n,`HEAD`);if(!N(r))return{name:`shadow-repo`,status:`fail`,summary:`shadow repo at ${n} is missing HEAD`};let i;try{i=F(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 oo(){return[Za(),qa(),Ja(),Xa(),io(),ao(),$a()]}function so(e){switch(e){case`pass`:return W.default.green(`✓`);case`warn`:return W.default.yellow(`!`);case`fail`:return W.default.red(`✗`)}}function co(e,t){let n=[`[${so(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(`
29
+ `:``;I(e,`${JSON.stringify(r,null,2)}${i}`)}catch{let r=sa(n,t.contentDir);r!==n&&I(e,r)}}function fa(e,t){let n=F(e,`utf-8`),r=sa(n,t.contentDir);r!==n&&I(e,r)}function pa(e){try{return zt(e,{withFileTypes:!0}).filter(e=>e.isFile()).map(t=>j(e,t.name))}catch{return[]}}const ma=new Set([`agent-presence.json`,`runtime.json`]);function ha(e){let t={contentDir:e.contentDir,docNameMap:{},originalToHashed:new Map,docNameCollisions:{}};for(let n of[`telemetry`,`logs`,`process`])for(let r of pa(j(e.stagingDir,n)))r.endsWith(`.jsonl`)?ua(r,t):r.endsWith(`.json`)?da(r,t):fa(r,t);for(let n of pa(j(e.stagingDir,`state`))){let e=n.slice(n.lastIndexOf(`/`)+1);ma.has(e)?da(n,t):fa(n,t)}return{docNameMap:t.docNameMap,docNameCollisions:t.docNameCollisions}}const ga=[`.ok`,`local`,`telemetry`],_a=[`.ok`,`local`,`logs`],va=`spans-current.jsonl`,ya=`spans-prev.jsonl`,ba=`server-current.jsonl`,xa=`server-prev.jsonl`;function Sa(e){return j(e,...ga,va)}function Ca(e){return j(e,...ga,ya)}function wa(e){return j(e,..._a,ba)}function Ta(e){return j(e,..._a,xa)}async function Ea(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 Da(e){let t=j(e,`.git`,`ok`);if(!N(t))return null;let n=A(`git`,[`-C`,t,`log`,`--oneline`,`-50`],{encoding:`utf-8`,timeout:2e3});return n.error||n.status!==0?null:n.stdout??``}function Oa(){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 ka(){return{nodeVersion:process.version,platform:Jt(),arch:Gt()}}function Aa(){return process.env.OTEL_SDK_DISABLED===`false`}function ja(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Ma(e){if(!N(e))return{};let t;try{t=(0,Ji.parse)(F(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(!ja(t))return{};let n=t.telemetry;if(!ja(n))return{};let r=n.localSink;return ja(r)?r:{}}function Na(e){return typeof e==`boolean`?e:void 0}function Pa(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?e:void 0}function Fa(e){if(ja(e))return Pa(e.maxBytes)}function Ia(e){let t=Ma(Ae(`project`,e)),n=Ma(Ae(`project-local`,e));return{enabled:Na(n.enabled)??Na(t.enabled)??!0,spansMaxBytes:Fa(n.spans)??Fa(t.spans)??52428800,logsMaxBytes:Fa(n.logs)??Fa(t.logs)??26214400}}function La(e){return on(`sha256`).update(e).digest(`hex`)}function Ra(e){let t=F(e),n=0;for(let e=0;e<t.length;e++)t[e]===10&&n++;return n}function za(e){let t=F(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 G(e,t){return N(e)?(P(kt(t),{recursive:!0}),Ft(e,t),!0):!1}function Ba(e){let t=[],n=e=>{let r=zt(e,{withFileTypes:!0});for(let i of r){let r=j(e,i.name);i.isDirectory()?n(r):i.isFile()&&t.push(r)}};return n(e),t.sort()}const Va=new Set([`.jsonl`]);function Ha(e){let t=e.lastIndexOf(`.`);return t===-1?!1:Va.has(e.slice(t))}function Ua(e,t){return At(e,t).split(jt).join(`/`)}async function Wa(e){let t=M(e.contentDir),n=e.deps??{},r=n.fetchAgentPresence??Ea,i=n.readShadowHead??Da,a=n.now??(()=>new Date),o=n.okVersion??(()=>pt),s=n.readDesktopEnv??Oa,c=n.readRuntime??ka,l=n.isOtlpPushEnabled??Aa,u=Lt(j(Xt(),`ok-bundle-`));P(j(u,`telemetry`),{recursive:!0}),P(j(u,`logs`),{recursive:!0}),P(j(u,`state`),{recursive:!0}),G(Sa(t),j(u,`telemetry`,va)),G(Ca(t),j(u,`telemetry`,ya)),G(wa(t),j(u,`logs`,ba)),G(Ta(t),j(u,`logs`,xa));let d=j(t,`.ok`,`local`),f=j(d,`server.lock`),p=`not-running`,m=`no server.lock`,h=null;if(N(f)){G(f,j(u,`state`,`server.lock`));try{let e=F(f,`utf-8`),t=JSON.parse(e);typeof t.port==`number`?h=t.port:m=`lock present but no port`}catch{m=`lock present but unparseable`}}if(h!==null){let e=await r(h);e===null?m=`agent-presence endpoint at :${h} unreachable`:(I(j(u,`state`,`agent-presence.json`),e),p=`running`,m=``)}let g=i(t);g!==null&&I(j(u,`state`,`shadow-head.txt`),g),G(j(d,`last-spawn-error.log`),j(u,`state`,`last-spawn-error.log`));let _=c(),v=s(),y={ok:{version:o(),nodeVersion:_.nodeVersion,platform:_.platform,arch:_.arch},host:{desktop:v}};I(j(u,`state`,`runtime.json`),`${JSON.stringify(y,null,2)}\n`);let ee=p===`running`?`running
30
+ `:`not-running (${m})\n`;if(I(j(u,`state`,`server-status.txt`),ee),e.processDir&&N(e.processDir)){let t=j(u,`process`);P(t,{recursive:!0}),Ft(e.processDir,t,{recursive:!0})}let b=null;e.redact===!0&&(b=ha({stagingDir:u,contentDir:t}));let x=Ia(e.projectDir??t),te=Ba(u),ne=[],S=0,re=0;for(let e of te){let t=Ua(u,e),n=Ht(e).size,r=Ha(t)?Ra(e):0;ne.push({path:t,bytes:n,lines:r}),S+=n,t.startsWith(`telemetry/`)&&Ha(t)&&(re+=za(e))}let ie={schemaVersion:1,createdAt:a().toISOString(),ok:{version:o(),nodeVersion:_.nodeVersion,platform:_.platform,arch:_.arch},host:{desktop:v},contentDir:{pathSha256:La(t),absolutePath:b===null?t:`<CONTENT_DIR>`},telemetry:{localSink:x,otlpPushEnabled:l()},redaction:b===null?{applied:!1,docNameMapSidecar:null}:Object.keys(b.docNameCollisions).length>0?{applied:!0,docNameMapSidecar:null,docNameCollisions:b.docNameCollisions}:{applied:!0,docNameMapSidecar:null},serverStatus:p,files:ne};I(j(u,`manifest.json`),`${JSON.stringify(ie,null,2)}\n`);let ae=te.some(e=>{try{return F(e,`utf-8`).includes(t)}catch{return!1}}),C={totalBytes:S,fileCount:ne.length,docNameCount:re,contentDirVisible:ae,redacted:b!==null},oe=!1;return{stagingDir:u,manifest:ie,summary:C,redactionMapPayload:b===null?null:{docNameMap:b.docNameMap,docNameCollisions:b.docNameCollisions},cleanup:()=>{oe||(oe=!0,Vt(u,{recursive:!0,force:!0}))}}}async function Ga(e){let{collected:t,outputPath:n}=e,r=kt(n);if(!N(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=`${Ot(n,`.zip`)}.docnames.json`,r={...t.manifest,redaction:{...t.manifest.redaction,applied:!0,docNameMapSidecar:e}};I(j(t.stagingDir,`manifest.json`),`${JSON.stringify(r,null,2)}\n`)}let i=new na.ZipFile,a=Ba(t.stagingDir);for(let e of a){let n=Ua(t.stagingDir,e);i.addFile(e,n)}i.end(),t.redactionMapPayload!==null&&I(j(r,`${Ot(n,`.zip`)}.docnames.json`),`${JSON.stringify({docNameMap:t.redactionMapPayload.docNameMap,docNameCollisions:t.redactionMapPayload.docNameCollisions},null,2)}\n`,{mode:384});let o=It(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 Ka(){let e=A(`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 qa(e={}){let t=e.probe??Ka;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 Ja(e={}){let t=e.loader??ht;return{name:`config-yaml`,run:async e=>{if(!N(M(e.cwd,`.ok`,`config.yml`)))return{name:`config-yaml`,status:`warn`,summary:`.ok/${mt} 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/${mt} failed to parse`,detail:t}}}}}function Ya(e){try{return Mt(e,Pt.W_OK),{writable:!0}}catch(e){return{writable:!1,reason:e instanceof Error?e.message:String(e)}}}function Xa(e={}){let t=e.loader??ht,n=e.probeWritable??Ya;return{name:`content-dir`,run:async e=>{if(!N(M(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=M(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(!N(r))return{name:`content-dir`,status:`fail`,summary:`content.dir does not exist: ${r}`,remediation:`Create the directory or fix \`content.dir\` in .ok/${mt}.`};if(!Ht(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 Za(e={}){let t=e.assert??et;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 Ve)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 nt)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 Qa(e){let t=A(`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 $a(e={}){let t=e.platform??process.platform,n=e.execPath??process.execPath,r=e.codesignVerify??Qa;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 eo=[`git`,`bun`,`config-yaml`,`content-dir`,`server-lock`,`shadow-repo`,`macos-codesig`];function to(e){return eo.includes(e)}async function no(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 ro(e,t,n={}){let r=[];for(let i of e)r.push(await no(i,t,n));return r}function io(e={}){let t=e.inspect??ct;return{name:`server-lock`,run:async e=>{let n=We(e.cwd);if(!N(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 ${M(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 ao(e={}){let t=e.resolve??Ne;return{name:`shadow-repo`,run:async e=>{if(!N(M(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 Je||e instanceof De)return{name:`shadow-repo`,status:`fail`,summary:`cannot resolve shadow gitdir: ${e.message}`};throw e}if(!N(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=M(n,`HEAD`);if(!N(r))return{name:`shadow-repo`,status:`fail`,summary:`shadow repo at ${n} is missing HEAD`};let i;try{i=F(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 oo(){return[Za(),qa(),Ja(),Xa(),io(),ao(),$a()]}function so(e){switch(e){case`pass`:return W.default.green(`✓`);case`warn`:return W.default.yellow(`!`);case`fail`:return W.default.red(`✗`)}}function co(e,t){let n=[`[${so(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
31
  `))n.push(` ${W.default.dim(t)}`);return n}function lo(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 uo(e,t={}){let n=t.checks??oo(),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(!to(e.check))return i(W.default.red(`unknown check '${e.check}'. Valid: ${eo.join(`, `)}`)),2;let t=e.check,r=n.find(e=>e.name===t);if(!r)return i(W.default.red(`internal error: check '${e.check}' not registered`)),2;c=[r]}else c=[...n];let l={cwd:e.cwd},u=await ro(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 co(e,s))r(t);r(``),r(lo(u))}return u.some(e=>e.status===`fail`)?1:0}function fo(){return new t(`health`).description(`Run environment health checks (${eo.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: ${eo.join(`, `)}`).option(`--quiet`,`Suppress output; exit code only`).action(async e=>{let t=await uo({cwd:process.cwd(),json:e.json,verbose:e.verbose,check:e.check,quiet:e.quiet});process.exit(t)})}function po(e){let t=A(`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 mo(e){let t=A(`lsof`,[`-p`,String(e)],{encoding:`utf-8`,timeout:5e3});return t.error||!t.stdout?null:t.stdout}function ho(e){let t=[];for(let n of e.split(`
32
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 go(e){let t=A(`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 _o(e,t,n){let r=j(Lt(j(Xt(),`ok-cdp-`)),`profiler.mjs`);return I(r,`import { writeFileSync } from 'node:fs';
33
33
  const ws = new WebSocket(${JSON.stringify(e)});
@@ -50,25 +50,25 @@ ws.addEventListener('error', () => process.exit(1));
50
50
  setTimeout(() => process.exit(2), ${t+1e4});
51
51
  `),r}async function vo(e,t,n,r,i){let a=_o(e,t,j(r,`cpu.cpuprofile`)),o=!1,s=Et(process.execPath,[a],{stdio:`ignore`}),c=setInterval(()=>{let e=po(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{Vt(j(a,`..`),{recursive:!0,force:!0})}catch{}return o}function yo(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
52
  `)}async function bo(e,t={}){let{pid:n,cpuProfileSecs:r=15,noInspector:i=!1}=e,a=t.log??(e=>console.log(e)),o=t.discover??ut,s=t.inspect??ct,c=t.resolveCommand??dt,l=t.resolveUsage??st,u=t.collectLsofFn??mo,d=t.getEndpoints??go,f=t.profiler??vo,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(W.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 ee=new Date().toISOString().replace(/[:.]/g,`-`),b=e.output?e.output:v?j(v,`.ok`,`local`,`diagnostics`,`process-${n}-${ee}`):j(process.cwd(),`ok-diagnose-${n}-${ee}`);try{P(b,{recursive:!0})}catch(e){a(W.default.red(`Cannot create output directory ${b}: ${e.message}`));return}a(W.default.bold(`Diagnosing pid ${n}`)),a(`Output: ${b}`),a(``);let x=(e,t)=>{I(j(b,e),t),a(` wrote ${e}`)},te=c(n),ne=l(n);x(`metadata.json`,JSON.stringify({capturedAt:new Date().toISOString(),pid:n,command:te,usage:ne,lockInfo:y},null,2)),a(` sampling lsof`);let S=u(n);if(S&&x(`lsof.txt`,S),!i){let e=S?ho(S).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(W.default.yellow(` SIGUSR1 delivery failed: ${e.message}`))}}if(t&&t.length>0){x(`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,b,e=>t.push(e))?a(` wrote cpu.cpuprofile`):a(W.default.yellow(` CPU profile capture failed`)),t.length>0&&x(`process-stats.jsonl`,`${t.map(e=>JSON.stringify(e)).join(`
53
- `)}\n`);try{x(`stacks.txt`,yo(F(j(b,`cpu.cpuprofile`),`utf-8`)))}catch(e){a(W.default.yellow(` stacks.txt skipped: ${e.message}`))}}}else a(W.default.yellow(` Node inspector unavailable — skipping CPU profile`))}a(``),a(W.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: ${W.default.bold(b)}`)}async function xo(e){let t=ln({input:process.stdin,output:process.stdout});try{return(await t.question(e)).trim()}finally{t.close()}}async function So(e){let t=Lt(j(Xt(),`ok-bundle-process-`));return await bo({pid:e,output:t}),t}function Co(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 wo(e){let t=e.trim().toLowerCase();return t===`y`||t===`yes`}function To(e,t,n){let{summary:r,manifest:i}=t;e(``),e(W.default.bold(`ok diagnose bundle — content summary`)),e(``),e(` Files: ${r.fileCount}`),e(` Total size: ${Co(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 Eo(e,t={}){let n=t.log??(e=>console.log(e)),r=t.prompt??xo,i=t.runProcessDiagnose??So,a=t.now??(()=>new Date),o;if(e.out!==void 0){o=e.out;let t=kt(o);if(!N(t))throw Error(`ok diagnose bundle: --out parent directory does not exist: ${t}. Create it first.`)}else{let t=a().toISOString().replace(/[:.]/g,`-`),n=j(e.contentDir,`.ok`,`local`,`diagnostics`);P(n,{recursive:!0}),o=j(n,`bundle-${t}.zip`)}let s;e.pid!==void 0&&(n(W.default.dim(`Running ok diagnose process ${e.pid} into a temp dir`)),s=await i(e.pid));let c=await Wa({contentDir:e.contentDir,projectDir:e.projectDir,processDir:s,redact:e.redact===!0,deps:t.collectDeps});try{return c.manifest.serverStatus===`not-running`&&n(W.default.yellow(` server not running — live state unavailable`)),To(n,c,o),e.yes!==!0&&!wo(await r(`Write bundle? [y/N]: `))?(n(W.default.dim(`Aborted; no bundle written.`)),{outputPath:null,declined:!0}):(await Ga({collected:c,outputPath:o}),n(W.default.bold(`Bundle: ${o}`)),{outputPath:o,declined:!1})}finally{if(c.cleanup(),s!==void 0)try{Vt(s,{recursive:!0,force:!0})}catch{}}}function Do(){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(W.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(W.default.red(`--cpu-profile must be a positive integer`)),process.exit(1)),await bo({pid:n,cpuProfileSecs:r,output:t.output,noInspector:!t.inspector})}),e.addCommand(fo()),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(W.default.red(`Invalid --pid '${e.pid}': must be a positive integer`)),process.exit(1)));try{let{loadConfig:n}=await import(`./loader-CQapvccd.mjs`),{resolveContentDir:r}=await import(`./dist-TZ6oxvUJ.mjs`),i=process.cwd(),{config:a}=n(i);await Eo({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(W.default.red(t)),process.exit(1)}}),e}const Oo=[` 1. ${k(`Customize`)} (sidebar) → ${k(`Skills`)}`,` 2. Click the ${k(`+`)} button`,` 3. Click ${k(`Create skill`)}`,` 4. Click ${k(`Upload skill`)}`,` 5. Pick ${k(`openknowledge.skill`)} from Downloads`],ko=w(` Open the Claude Desktop App, then: ${k(`Customize → Skills → + → Create skill → Upload skill`)} → pick the file.`);function Ao(e){let t=[E(`Built ${e.outputPath}`),T(` ${e.size} bytes • sha256 ${e.sha256?.slice(0,12)}…`)];return e.handoffError&&t.push(O(` Handoff failed: ${e.handoffError.message}`)),t.push(ko),t.join(`
53
+ `)}\n`);try{x(`stacks.txt`,yo(F(j(b,`cpu.cpuprofile`),`utf-8`)))}catch(e){a(W.default.yellow(` stacks.txt skipped: ${e.message}`))}}}else a(W.default.yellow(` Node inspector unavailable — skipping CPU profile`))}a(``),a(W.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: ${W.default.bold(b)}`)}async function xo(e){let t=ln({input:process.stdin,output:process.stdout});try{return(await t.question(e)).trim()}finally{t.close()}}async function So(e){let t=Lt(j(Xt(),`ok-bundle-process-`));return await bo({pid:e,output:t}),t}function Co(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 wo(e){let t=e.trim().toLowerCase();return t===`y`||t===`yes`}function To(e,t,n){let{summary:r,manifest:i}=t;e(``),e(W.default.bold(`ok diagnose bundle — content summary`)),e(``),e(` Files: ${r.fileCount}`),e(` Total size: ${Co(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 Eo(e,t={}){let n=t.log??(e=>console.log(e)),r=t.prompt??xo,i=t.runProcessDiagnose??So,a=t.now??(()=>new Date),o;if(e.out!==void 0){o=e.out;let t=kt(o);if(!N(t))throw Error(`ok diagnose bundle: --out parent directory does not exist: ${t}. Create it first.`)}else{let t=a().toISOString().replace(/[:.]/g,`-`),n=j(e.contentDir,`.ok`,`local`,`diagnostics`);P(n,{recursive:!0}),o=j(n,`bundle-${t}.zip`)}let s;e.pid!==void 0&&(n(W.default.dim(`Running ok diagnose process ${e.pid} into a temp dir`)),s=await i(e.pid));let c=await Wa({contentDir:e.contentDir,projectDir:e.projectDir,processDir:s,redact:e.redact===!0,deps:t.collectDeps});try{return c.manifest.serverStatus===`not-running`&&n(W.default.yellow(` server not running — live state unavailable`)),To(n,c,o),e.yes!==!0&&!wo(await r(`Write bundle? [y/N]: `))?(n(W.default.dim(`Aborted; no bundle written.`)),{outputPath:null,declined:!0}):(await Ga({collected:c,outputPath:o}),n(W.default.bold(`Bundle: ${o}`)),{outputPath:o,declined:!1})}finally{if(c.cleanup(),s!==void 0)try{Vt(s,{recursive:!0,force:!0})}catch{}}}function Do(){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(W.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(W.default.red(`--cpu-profile must be a positive integer`)),process.exit(1)),await bo({pid:n,cpuProfileSecs:r,output:t.output,noInspector:!t.inspector})}),e.addCommand(fo()),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(W.default.red(`Invalid --pid '${e.pid}': must be a positive integer`)),process.exit(1)));try{let{loadConfig:n}=await import(`./loader-BfOwIuJm.mjs`),{resolveContentDir:r}=await import(`./dist-6fxKGDDG.mjs`),i=process.cwd(),{config:a}=n(i);await Eo({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(W.default.red(t)),process.exit(1)}}),e}const Oo=[` 1. ${k(`Customize`)} (sidebar) → ${k(`Skills`)}`,` 2. Click the ${k(`+`)} button`,` 3. Click ${k(`Create skill`)}`,` 4. Click ${k(`Upload skill`)}`,` 5. Pick ${k(`openknowledge.skill`)} from Downloads`],ko=w(` Open the Claude Desktop App, then: ${k(`Customize → Skills → + → Create skill → Upload skill`)} → pick the file.`);function Ao(e){let t=[E(`Built ${e.outputPath}`),T(` ${e.size} bytes • sha256 ${e.sha256?.slice(0,12)}…`)];return e.handoffError&&t.push(O(` Handoff failed: ${e.handoffError.message}`)),t.push(ko),t.join(`
54
54
  `)}function jo(e){let t=e.skillVersion??`unknown`,n=e.recordedAt??`unknown`;return[w(`Open Knowledge skill ${k(`v${t}`)} already delivered to Claude Desktop.`),T(` Recorded at ${n} in ~/.ok/skill-state.yml`),T(` Use ${k(`--force`)} to rebuild and re-open the install dialog.`)].join(`
55
55
  `)}function Mo(e){let t=e.skillVersion?` • Skill v${e.skillVersion}`:``;return[E(`Built ${e.outputPath}`),T(` ${e.size} bytes • sha256 ${e.sha256?.slice(0,12)}…${t}`),w(` Claude Desktop App opened. Now upload the file manually:`),...Oo,T(` If Claude Desktop didn't open, open it and start at step 1. The file is at ${e.outputPath}`)].join(`
56
- `)}function No(e){return`${D(`Error:`)} ${e.buildError??`unknown build failure`}`}async function Po(e={}){let t=await He(e);return t.status===`failed`?{...t,message:No(t),exitCode:1}:t.status===`skip-current`?{...t,message:jo(t),exitCode:0}:t.status===`installed`?{...t,message:Mo(t),exitCode:0}:{...t,message:Ao(t),exitCode:0}}function Fo(){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 Po({out:e.out,noOpen:!e.open,force:e.force??!1});process.stdout.write(`${t.message}\n`),t.exitCode!==0&&process.exit(t.exitCode)})}const Io=j(`Contents`,`Resources`,`cli`,`bin`,`ok.sh`),Lo=/Contents\/Resources\/cli\/dist\/cli\.mjs$/;function Ro(e,t,n){return e===`darwin`?[j(t,`Applications`,`Open Knowledge.app`,Io),j(`/Applications`,`Open Knowledge.app`,Io)].find(e=>n.existsSync(e))??null:null}function zo(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`&&Lo.test(t[1])?{proxy:!1,suppressedBy:`self`}:{proxy:!0,suppressedBy:null}}function Bo(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 Vo(e){Bo({stderr:e.stderr,mode:`bundled`,bundlePath:e.bundlePath,reason:null});let t=e.spawnImpl??Et,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 Ho(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 Uo=class{append(e){this._buffer=this._buffer?Buffer.concat([this._buffer,e]):e}readMessage(){if(!this._buffer)return null;let e=this._buffer.indexOf(`
57
- `);if(e===-1)return null;let t=this._buffer.toString(`utf8`,0,e).replace(/\r$/,``);return this._buffer=this._buffer.subarray(e+1),Wo(t)}clear(){this._buffer=void 0}};function Wo(e){return Qe.parse(JSON.parse(e))}function Go(e){return JSON.stringify(e)+`
58
- `}var Ko=class{constructor(e=Wt.stdin,t=Wt.stdout){this._stdin=e,this._stdout=t,this._readBuffer=new Uo,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=Go(e);this._stdout.write(n)?t():this._stdout.once(`drain`,t)})}};function qo(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 Jo(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 Yo(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 Xo(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 Zo(e){return e?e instanceof Headers?Object.fromEntries(e.entries()):Array.isArray(e)?Object.fromEntries(e):{...e}:{}}function Qo(e=fetch,t){return t?async(n,r)=>e(n,{...t,...r,headers:r?.headers?{...Zo(t.headers),...Zo(r.headers)}:t.headers}):e}let $o;$o=globalThis.crypto?.webcrypto??globalThis.crypto??import(`node:crypto`).then(e=>e.webcrypto);async function es(e){return(await $o).getRandomValues(new Uint8Array(e))}async function ts(e){let t=``;for(;t.length<e;){let n=await es(e-t.length);for(let e of n)e<198&&(t+=`abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~`[e%66])}return t}async function ns(e){return await ts(e)}async function rs(e){let t=await(await $o).subtle.digest(`SHA-256`,new TextEncoder().encode(e));return btoa(String.fromCharCode(...new Uint8Array(t))).replace(/\//g,`_`).replace(/\+/g,`-`).replace(/=/g,``)}async function is(e){if(e||=43,e<43||e>128)throw`Expected a length between 43 and 128. Received ${e}.`;let t=await ns(e);return{code_verifier:t,code_challenge:await rs(t)}}const K=p().superRefine((e,t)=>{if(!URL.canParse(e))return t.addIssue({code:On.custom,message:`URL must be parseable`,fatal:!0}),h}).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`}),as=n({resource:c().url(),authorization_servers:u(K).optional(),jwks_uri:c().url().optional(),scopes_supported:u(c()).optional(),bearer_methods_supported:u(c()).optional(),resource_signing_alg_values_supported:u(c()).optional(),resource_name:c().optional(),resource_documentation:c().optional(),resource_policy_uri:c().url().optional(),resource_tos_uri:c().url().optional(),tls_client_certificate_bound_access_tokens:a().optional(),authorization_details_types_supported:u(c()).optional(),dpop_signing_alg_values_supported:u(c()).optional(),dpop_bound_access_tokens_required:a().optional()}),os=n({issuer:c(),authorization_endpoint:K,token_endpoint:K,registration_endpoint:K.optional(),scopes_supported:u(c()).optional(),response_types_supported:u(c()),response_modes_supported:u(c()).optional(),grant_types_supported:u(c()).optional(),token_endpoint_auth_methods_supported:u(c()).optional(),token_endpoint_auth_signing_alg_values_supported:u(c()).optional(),service_documentation:K.optional(),revocation_endpoint:K.optional(),revocation_endpoint_auth_methods_supported:u(c()).optional(),revocation_endpoint_auth_signing_alg_values_supported:u(c()).optional(),introspection_endpoint:c().optional(),introspection_endpoint_auth_methods_supported:u(c()).optional(),introspection_endpoint_auth_signing_alg_values_supported:u(c()).optional(),code_challenge_methods_supported:u(c()).optional(),client_id_metadata_document_supported:a().optional()}),ss=o({...n({issuer:c(),authorization_endpoint:K,token_endpoint:K,userinfo_endpoint:K.optional(),jwks_uri:K,registration_endpoint:K.optional(),scopes_supported:u(c()).optional(),response_types_supported:u(c()),response_modes_supported:u(c()).optional(),grant_types_supported:u(c()).optional(),acr_values_supported:u(c()).optional(),subject_types_supported:u(c()),id_token_signing_alg_values_supported:u(c()),id_token_encryption_alg_values_supported:u(c()).optional(),id_token_encryption_enc_values_supported:u(c()).optional(),userinfo_signing_alg_values_supported:u(c()).optional(),userinfo_encryption_alg_values_supported:u(c()).optional(),userinfo_encryption_enc_values_supported:u(c()).optional(),request_object_signing_alg_values_supported:u(c()).optional(),request_object_encryption_alg_values_supported:u(c()).optional(),request_object_encryption_enc_values_supported:u(c()).optional(),token_endpoint_auth_methods_supported:u(c()).optional(),token_endpoint_auth_signing_alg_values_supported:u(c()).optional(),display_values_supported:u(c()).optional(),claim_types_supported:u(c()).optional(),claims_supported:u(c()).optional(),service_documentation:c().optional(),claims_locales_supported:u(c()).optional(),ui_locales_supported:u(c()).optional(),claims_parameter_supported:a().optional(),request_parameter_supported:a().optional(),request_uri_parameter_supported:a().optional(),require_request_uri_registration:a().optional(),op_policy_uri:K.optional(),op_tos_uri:K.optional(),client_id_metadata_document_supported:a().optional()}).shape,...os.pick({code_challenge_methods_supported:!0}).shape}),cs=o({access_token:c(),id_token:c().optional(),token_type:c(),expires_in:An().optional(),scope:c().optional(),refresh_token:c().optional()}).strip(),ls=o({error:c(),error_description:c().optional(),error_uri:c().optional()}),us=K.optional().or(x(``).transform(()=>void 0)),ds=o({redirect_uris:u(K),token_endpoint_auth_method:c().optional(),grant_types:u(c()).optional(),response_types:u(c()).optional(),client_name:c().optional(),client_uri:K.optional(),logo_uri:us,scope:c().optional(),contacts:u(c()).optional(),tos_uri:us,policy_uri:c().optional(),jwks_uri:K.optional(),jwks:l().optional(),software_id:c().optional(),software_version:c().optional(),software_statement:c().optional()}).strip(),fs=o({client_id:c(),client_secret:c().optional(),client_id_issued_at:f().optional(),client_secret_expires_at:f().optional()}).strip(),ps=ds.merge(fs);o({error:c(),error_description:c().optional()}).strip(),o({token:c(),token_type_hint:c().optional()}).strip();function ms(e){let t=typeof e==`string`?new URL(e):new URL(e.href);return t.hash=``,t}function hs({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 q=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}},gs=class extends q{};gs.errorCode=`invalid_request`;var _s=class extends q{};_s.errorCode=`invalid_client`;var vs=class extends q{};vs.errorCode=`invalid_grant`;var ys=class extends q{};ys.errorCode=`unauthorized_client`;var bs=class extends q{};bs.errorCode=`unsupported_grant_type`;var xs=class extends q{};xs.errorCode=`invalid_scope`;var Ss=class extends q{};Ss.errorCode=`access_denied`;var J=class extends q{};J.errorCode=`server_error`;var Cs=class extends q{};Cs.errorCode=`temporarily_unavailable`;var ws=class extends q{};ws.errorCode=`unsupported_response_type`;var Ts=class extends q{};Ts.errorCode=`unsupported_token_type`;var Es=class extends q{};Es.errorCode=`invalid_token`;var Ds=class extends q{};Ds.errorCode=`method_not_allowed`;var Os=class extends q{};Os.errorCode=`too_many_requests`;var ks=class extends q{};ks.errorCode=`invalid_client_metadata`;var As=class extends q{};As.errorCode=`insufficient_scope`;var js=class extends q{};js.errorCode=`invalid_target`;const Ms={[gs.errorCode]:gs,[_s.errorCode]:_s,[vs.errorCode]:vs,[ys.errorCode]:ys,[bs.errorCode]:bs,[xs.errorCode]:xs,[Ss.errorCode]:Ss,[J.errorCode]:J,[Cs.errorCode]:Cs,[ws.errorCode]:ws,[Ts.errorCode]:Ts,[Es.errorCode]:Es,[Ds.errorCode]:Ds,[Os.errorCode]:Os,[ks.errorCode]:ks,[As.errorCode]:As,[js.errorCode]:js};var Y=class extends Error{constructor(e){super(e??`Unauthorized`)}};function Ns(e){return[`client_secret_basic`,`client_secret_post`,`none`].includes(e)}const Ps=`code`,Fs=`S256`;function Is(e,t){let n=e.client_secret!==void 0;return`token_endpoint_auth_method`in e&&e.token_endpoint_auth_method&&Ns(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 Ls(e,t,n,r){let{client_id:i,client_secret:a}=t;switch(e){case`client_secret_basic`:Rs(i,a,n);return;case`client_secret_post`:zs(i,a,r);return;case`none`:Bs(i,r);return;default:throw Error(`Unsupported client authentication method: ${e}`)}}function Rs(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 zs(e,t,n){n.set(`client_id`,e),t&&n.set(`client_secret`,t)}function Bs(e,t){t.set(`client_id`,e)}async function Vs(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}=ls.parse(JSON.parse(n));return new(Ms[e]||J)(t||``,r)}catch(e){return new J(`${t?`HTTP ${t}: `:``}Invalid OAuth error response: ${e}. Raw body: ${n}`)}}async function Hs(e,t){try{return await Us(e,t)}catch(n){if(n instanceof _s||n instanceof ys)return await e.invalidateCredentials?.(`all`),await Us(e,t);if(n instanceof vs)return await e.invalidateCredentials?.(`tokens`),await Us(e,t);throw n}}async function Us(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 Js(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 nc(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 Gs(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&&!Ws(r))throw new ks(`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 cc(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 sc(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 oc(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 q)||e instanceof J))throw e}let g=e.state?await e.state():void 0,{authorizationUrl:_,codeVerifier:v}=await rc(c,{metadata:l,clientInformation:p,state:g,redirectUrl:e.redirectUrl,scope:f,resource:d});return await e.saveCodeVerifier(v),await e.redirectToAuthorization(_),`REDIRECT`}function Ws(e){if(!e)return!1;try{let t=new URL(e);return t.protocol===`https:`&&t.pathname!==`/`}catch{return!1}}async function Gs(e,t,n){let r=ms(e);if(t.validateResourceURL)return await t.validateResourceURL(r,n?.resource);if(n){if(!hs({requestedResource:r,configuredResource:n.resource}))throw Error(`Protected resource ${n.resource} does not match expected ${r} (or origin)`);return new URL(n.resource)}}function Ks(e){let t=e.headers.get(`WWW-Authenticate`);if(!t)return{};let[n,r]=t.split(` `);if(n.toLowerCase()!==`bearer`||!r)return{};let i=qs(e,`resource_metadata`)||void 0,a;if(i)try{a=new URL(i)}catch{}let o=qs(e,`scope`)||void 0,s=qs(e,`error`)||void 0;return{resourceMetadataUrl:a,scope:o,error:s}}function qs(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 Js(e,t,n=fetch){let r=await $s(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 as.parse(await r.json())}async function Ys(e,t,n=fetch){try{return await n(e,{headers:t})}catch(r){if(r instanceof TypeError)return t?Ys(e,void 0,n):void 0;throw r}}function Xs(e,t=``,n={}){return t.endsWith(`/`)&&(t=t.slice(0,-1)),n.prependPathname?`${t}/.well-known/${e}`:`/.well-known/${e}${t}`}async function Zs(e,t,n=fetch){return await Ys(e,{"MCP-Protocol-Version":t},n)}function Qs(e,t){return!e||e.status>=400&&e.status<500&&t!==`/`}async function $s(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=Xs(t,i.pathname);o=new URL(e,r?.metadataServerUrl??i),o.search=i.search}let s=await Zs(o,a,n);return!r?.metadataUrl&&Qs(s,i.pathname)&&(s=await Zs(new URL(`/.well-known/${t}`,i),a,n)),s}function ec(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=it}={}){let r={"MCP-Protocol-Version":n,Accept:`application/json`},i=ec(e);for(let{url:e,type:n}of i){let i=await Ys(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()):ss.parse(await i.json())}}}async function nc(e,t){let n,r;try{n=await Js(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 rc(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(Ps))throw Error(`Incompatible auth server: does not support response type ${Ps}`);if(t.code_challenge_methods_supported&&!t.code_challenge_methods_supported.includes(Fs))throw Error(`Incompatible auth server: does not support code challenge method ${Fs}`)}else s=new URL(`/authorize`,e);let c=await is(),l=c.code_verifier,u=c.code_challenge;return s.searchParams.set(`response_type`,Ps),s.searchParams.set(`client_id`,n.client_id),s.searchParams.set(`code_challenge`,u),s.searchParams.set(`code_challenge_method`,Fs),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 ic(e,t,n){return new URLSearchParams({grant_type:`authorization_code`,code:e,code_verifier:t,redirect_uri:String(n)})}async function ac(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&&Ls(Is(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 Vs(l);return cs.parse(await l.json())}async function oc(e,{metadata:t,clientInformation:n,refreshToken:r,resource:i,addClientAuthentication:a,fetchFn:o}){return{refresh_token:r,...await ac(e,{metadata:t,tokenRequestParams:new URLSearchParams({grant_type:`refresh_token`,refresh_token:r}),clientInformation:n,addClientAuthentication:a,resource:i,fetchFn:o})}}async function sc(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=ic(i,await e.codeVerifier(),e.redirectUrl)}let c=await e.clientInformation();return ac(t,{metadata:n,tokenRequestParams:s,clientInformation:c??void 0,addClientAuthentication:e.addClientAuthentication,resource:r,fetchFn:a})}async function cc(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 Vs(o);return ps.parse(await o.json())}var lc=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 uc(e){}function dc(e){if(typeof e==`function`)throw TypeError("`callbacks` must be an object, got a function instead. Did you mean `{onEvent: fn}`?");let{onEvent:t=uc,onError:n=uc,onRetry:r=uc,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}
56
+ `)}function No(e){return`${D(`Error:`)} ${e.buildError??`unknown build failure`}`}async function Po(e={}){let t=await Ze(e);return t.status===`failed`?{...t,message:No(t),exitCode:1}:t.status===`skip-current`?{...t,message:jo(t),exitCode:0}:t.status===`installed`?{...t,message:Mo(t),exitCode:0}:{...t,message:Ao(t),exitCode:0}}function Fo(){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 Po({out:e.out,noOpen:!e.open,force:e.force??!1});process.stdout.write(`${t.message}\n`),t.exitCode!==0&&process.exit(t.exitCode)})}const Io=j(`Contents`,`Resources`,`cli`,`bin`,`ok.sh`),Lo=/Contents\/Resources\/cli\/dist\/cli\.mjs$/;function Ro(e,t,n){return e===`darwin`?[j(t,`Applications`,`Open Knowledge.app`,Io),j(`/Applications`,`Open Knowledge.app`,Io)].find(e=>n.existsSync(e))??null:null}function zo(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`&&Lo.test(t[1])?{proxy:!1,suppressedBy:`self`}:{proxy:!0,suppressedBy:null}}function Bo(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 Vo(e){Bo({stderr:e.stderr,mode:`bundled`,bundlePath:e.bundlePath,reason:null});let t=e.spawnImpl??Et,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 Ho(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 Uo=class{append(e){this._buffer=this._buffer?Buffer.concat([this._buffer,e]):e}readMessage(){if(!this._buffer)return null;let e=this._buffer.indexOf(`
57
+ `);if(e===-1)return null;let t=this._buffer.toString(`utf8`,0,e).replace(/\r$/,``);return this._buffer=this._buffer.subarray(e+1),Wo(t)}clear(){this._buffer=void 0}};function Wo(e){return He.parse(JSON.parse(e))}function Go(e){return JSON.stringify(e)+`
58
+ `}var Ko=class{constructor(e=Wt.stdin,t=Wt.stdout){this._stdin=e,this._stdout=t,this._readBuffer=new Uo,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=Go(e);this._stdout.write(n)?t():this._stdout.once(`drain`,t)})}};function qo(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 Jo(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 Yo(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 Xo(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 Zo(e){return e?e instanceof Headers?Object.fromEntries(e.entries()):Array.isArray(e)?Object.fromEntries(e):{...e}:{}}function Qo(e=fetch,t){return t?async(n,r)=>e(n,{...t,...r,headers:r?.headers?{...Zo(t.headers),...Zo(r.headers)}:t.headers}):e}let $o;$o=globalThis.crypto?.webcrypto??globalThis.crypto??import(`node:crypto`).then(e=>e.webcrypto);async function es(e){return(await $o).getRandomValues(new Uint8Array(e))}async function ts(e){let t=``;for(;t.length<e;){let n=await es(e-t.length);for(let e of n)e<198&&(t+=`abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~`[e%66])}return t}async function ns(e){return await ts(e)}async function rs(e){let t=await(await $o).subtle.digest(`SHA-256`,new TextEncoder().encode(e));return btoa(String.fromCharCode(...new Uint8Array(t))).replace(/\//g,`_`).replace(/\+/g,`-`).replace(/=/g,``)}async function is(e){if(e||=43,e<43||e>128)throw`Expected a length between 43 and 128. Received ${e}.`;let t=await ns(e);return{code_verifier:t,code_challenge:await rs(t)}}const K=p().superRefine((e,t)=>{if(!URL.canParse(e))return t.addIssue({code:On.custom,message:`URL must be parseable`,fatal:!0}),h}).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`}),as=n({resource:c().url(),authorization_servers:u(K).optional(),jwks_uri:c().url().optional(),scopes_supported:u(c()).optional(),bearer_methods_supported:u(c()).optional(),resource_signing_alg_values_supported:u(c()).optional(),resource_name:c().optional(),resource_documentation:c().optional(),resource_policy_uri:c().url().optional(),resource_tos_uri:c().url().optional(),tls_client_certificate_bound_access_tokens:a().optional(),authorization_details_types_supported:u(c()).optional(),dpop_signing_alg_values_supported:u(c()).optional(),dpop_bound_access_tokens_required:a().optional()}),os=n({issuer:c(),authorization_endpoint:K,token_endpoint:K,registration_endpoint:K.optional(),scopes_supported:u(c()).optional(),response_types_supported:u(c()),response_modes_supported:u(c()).optional(),grant_types_supported:u(c()).optional(),token_endpoint_auth_methods_supported:u(c()).optional(),token_endpoint_auth_signing_alg_values_supported:u(c()).optional(),service_documentation:K.optional(),revocation_endpoint:K.optional(),revocation_endpoint_auth_methods_supported:u(c()).optional(),revocation_endpoint_auth_signing_alg_values_supported:u(c()).optional(),introspection_endpoint:c().optional(),introspection_endpoint_auth_methods_supported:u(c()).optional(),introspection_endpoint_auth_signing_alg_values_supported:u(c()).optional(),code_challenge_methods_supported:u(c()).optional(),client_id_metadata_document_supported:a().optional()}),ss=o({...n({issuer:c(),authorization_endpoint:K,token_endpoint:K,userinfo_endpoint:K.optional(),jwks_uri:K,registration_endpoint:K.optional(),scopes_supported:u(c()).optional(),response_types_supported:u(c()),response_modes_supported:u(c()).optional(),grant_types_supported:u(c()).optional(),acr_values_supported:u(c()).optional(),subject_types_supported:u(c()),id_token_signing_alg_values_supported:u(c()),id_token_encryption_alg_values_supported:u(c()).optional(),id_token_encryption_enc_values_supported:u(c()).optional(),userinfo_signing_alg_values_supported:u(c()).optional(),userinfo_encryption_alg_values_supported:u(c()).optional(),userinfo_encryption_enc_values_supported:u(c()).optional(),request_object_signing_alg_values_supported:u(c()).optional(),request_object_encryption_alg_values_supported:u(c()).optional(),request_object_encryption_enc_values_supported:u(c()).optional(),token_endpoint_auth_methods_supported:u(c()).optional(),token_endpoint_auth_signing_alg_values_supported:u(c()).optional(),display_values_supported:u(c()).optional(),claim_types_supported:u(c()).optional(),claims_supported:u(c()).optional(),service_documentation:c().optional(),claims_locales_supported:u(c()).optional(),ui_locales_supported:u(c()).optional(),claims_parameter_supported:a().optional(),request_parameter_supported:a().optional(),request_uri_parameter_supported:a().optional(),require_request_uri_registration:a().optional(),op_policy_uri:K.optional(),op_tos_uri:K.optional(),client_id_metadata_document_supported:a().optional()}).shape,...os.pick({code_challenge_methods_supported:!0}).shape}),cs=o({access_token:c(),id_token:c().optional(),token_type:c(),expires_in:An().optional(),scope:c().optional(),refresh_token:c().optional()}).strip(),ls=o({error:c(),error_description:c().optional(),error_uri:c().optional()}),us=K.optional().or(x(``).transform(()=>void 0)),ds=o({redirect_uris:u(K),token_endpoint_auth_method:c().optional(),grant_types:u(c()).optional(),response_types:u(c()).optional(),client_name:c().optional(),client_uri:K.optional(),logo_uri:us,scope:c().optional(),contacts:u(c()).optional(),tos_uri:us,policy_uri:c().optional(),jwks_uri:K.optional(),jwks:l().optional(),software_id:c().optional(),software_version:c().optional(),software_statement:c().optional()}).strip(),fs=o({client_id:c(),client_secret:c().optional(),client_id_issued_at:f().optional(),client_secret_expires_at:f().optional()}).strip(),ps=ds.merge(fs);o({error:c(),error_description:c().optional()}).strip(),o({token:c(),token_type_hint:c().optional()}).strip();function ms(e){let t=typeof e==`string`?new URL(e):new URL(e.href);return t.hash=``,t}function hs({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 q=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}},gs=class extends q{};gs.errorCode=`invalid_request`;var _s=class extends q{};_s.errorCode=`invalid_client`;var vs=class extends q{};vs.errorCode=`invalid_grant`;var ys=class extends q{};ys.errorCode=`unauthorized_client`;var bs=class extends q{};bs.errorCode=`unsupported_grant_type`;var xs=class extends q{};xs.errorCode=`invalid_scope`;var Ss=class extends q{};Ss.errorCode=`access_denied`;var J=class extends q{};J.errorCode=`server_error`;var Cs=class extends q{};Cs.errorCode=`temporarily_unavailable`;var ws=class extends q{};ws.errorCode=`unsupported_response_type`;var Ts=class extends q{};Ts.errorCode=`unsupported_token_type`;var Es=class extends q{};Es.errorCode=`invalid_token`;var Ds=class extends q{};Ds.errorCode=`method_not_allowed`;var Os=class extends q{};Os.errorCode=`too_many_requests`;var ks=class extends q{};ks.errorCode=`invalid_client_metadata`;var As=class extends q{};As.errorCode=`insufficient_scope`;var js=class extends q{};js.errorCode=`invalid_target`;const Ms={[gs.errorCode]:gs,[_s.errorCode]:_s,[vs.errorCode]:vs,[ys.errorCode]:ys,[bs.errorCode]:bs,[xs.errorCode]:xs,[Ss.errorCode]:Ss,[J.errorCode]:J,[Cs.errorCode]:Cs,[ws.errorCode]:ws,[Ts.errorCode]:Ts,[Es.errorCode]:Es,[Ds.errorCode]:Ds,[Os.errorCode]:Os,[ks.errorCode]:ks,[As.errorCode]:As,[js.errorCode]:js};var Y=class extends Error{constructor(e){super(e??`Unauthorized`)}};function Ns(e){return[`client_secret_basic`,`client_secret_post`,`none`].includes(e)}const Ps=`code`,Fs=`S256`;function Is(e,t){let n=e.client_secret!==void 0;return`token_endpoint_auth_method`in e&&e.token_endpoint_auth_method&&Ns(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 Ls(e,t,n,r){let{client_id:i,client_secret:a}=t;switch(e){case`client_secret_basic`:Rs(i,a,n);return;case`client_secret_post`:zs(i,a,r);return;case`none`:Bs(i,r);return;default:throw Error(`Unsupported client authentication method: ${e}`)}}function Rs(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 zs(e,t,n){n.set(`client_id`,e),t&&n.set(`client_secret`,t)}function Bs(e,t){t.set(`client_id`,e)}async function Vs(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}=ls.parse(JSON.parse(n));return new(Ms[e]||J)(t||``,r)}catch(e){return new J(`${t?`HTTP ${t}: `:``}Invalid OAuth error response: ${e}. Raw body: ${n}`)}}async function Hs(e,t){try{return await Us(e,t)}catch(n){if(n instanceof _s||n instanceof ys)return await e.invalidateCredentials?.(`all`),await Us(e,t);if(n instanceof vs)return await e.invalidateCredentials?.(`tokens`),await Us(e,t);throw n}}async function Us(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 Js(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 nc(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 Gs(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&&!Ws(r))throw new ks(`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 cc(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 sc(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 oc(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 q)||e instanceof J))throw e}let g=e.state?await e.state():void 0,{authorizationUrl:_,codeVerifier:v}=await rc(c,{metadata:l,clientInformation:p,state:g,redirectUrl:e.redirectUrl,scope:f,resource:d});return await e.saveCodeVerifier(v),await e.redirectToAuthorization(_),`REDIRECT`}function Ws(e){if(!e)return!1;try{let t=new URL(e);return t.protocol===`https:`&&t.pathname!==`/`}catch{return!1}}async function Gs(e,t,n){let r=ms(e);if(t.validateResourceURL)return await t.validateResourceURL(r,n?.resource);if(n){if(!hs({requestedResource:r,configuredResource:n.resource}))throw Error(`Protected resource ${n.resource} does not match expected ${r} (or origin)`);return new URL(n.resource)}}function Ks(e){let t=e.headers.get(`WWW-Authenticate`);if(!t)return{};let[n,r]=t.split(` `);if(n.toLowerCase()!==`bearer`||!r)return{};let i=qs(e,`resource_metadata`)||void 0,a;if(i)try{a=new URL(i)}catch{}let o=qs(e,`scope`)||void 0,s=qs(e,`error`)||void 0;return{resourceMetadataUrl:a,scope:o,error:s}}function qs(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 Js(e,t,n=fetch){let r=await $s(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 as.parse(await r.json())}async function Ys(e,t,n=fetch){try{return await n(e,{headers:t})}catch(r){if(r instanceof TypeError)return t?Ys(e,void 0,n):void 0;throw r}}function Xs(e,t=``,n={}){return t.endsWith(`/`)&&(t=t.slice(0,-1)),n.prependPathname?`${t}/.well-known/${e}`:`/.well-known/${e}${t}`}async function Zs(e,t,n=fetch){return await Ys(e,{"MCP-Protocol-Version":t},n)}function Qs(e,t){return!e||e.status>=400&&e.status<500&&t!==`/`}async function $s(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=Xs(t,i.pathname);o=new URL(e,r?.metadataServerUrl??i),o.search=i.search}let s=await Zs(o,a,n);return!r?.metadataUrl&&Qs(s,i.pathname)&&(s=await Zs(new URL(`/.well-known/${t}`,i),a,n)),s}function ec(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=rt}={}){let r={"MCP-Protocol-Version":n,Accept:`application/json`},i=ec(e);for(let{url:e,type:n}of i){let i=await Ys(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()):ss.parse(await i.json())}}}async function nc(e,t){let n,r;try{n=await Js(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 rc(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(Ps))throw Error(`Incompatible auth server: does not support response type ${Ps}`);if(t.code_challenge_methods_supported&&!t.code_challenge_methods_supported.includes(Fs))throw Error(`Incompatible auth server: does not support code challenge method ${Fs}`)}else s=new URL(`/authorize`,e);let c=await is(),l=c.code_verifier,u=c.code_challenge;return s.searchParams.set(`response_type`,Ps),s.searchParams.set(`client_id`,n.client_id),s.searchParams.set(`code_challenge`,u),s.searchParams.set(`code_challenge_method`,Fs),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 ic(e,t,n){return new URLSearchParams({grant_type:`authorization_code`,code:e,code_verifier:t,redirect_uri:String(n)})}async function ac(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&&Ls(Is(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 Vs(l);return cs.parse(await l.json())}async function oc(e,{metadata:t,clientInformation:n,refreshToken:r,resource:i,addClientAuthentication:a,fetchFn:o}){return{refresh_token:r,...await ac(e,{metadata:t,tokenRequestParams:new URLSearchParams({grant_type:`refresh_token`,refresh_token:r}),clientInformation:n,addClientAuthentication:a,resource:i,fetchFn:o})}}async function sc(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=ic(i,await e.codeVerifier(),e.redirectUrl)}let c=await e.clientInformation();return ac(t,{metadata:n,tokenRequestParams:s,clientInformation:c??void 0,addClientAuthentication:e.addClientAuthentication,resource:r,fetchFn:a})}async function cc(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 Vs(o);return ps.parse(await o.json())}var lc=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 uc(e){}function dc(e){if(typeof e==`function`)throw TypeError("`callbacks` must be an object, got a function instead. Did you mean `{onEvent: fn}`?");let{onEvent:t=uc,onError:n=uc,onRetry:r=uc,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}
59
59
  `;break;case`id`:s=t.includes(`\0`)?void 0:t;break;case`retry`:/^\d+$/.test(t)?r(parseInt(t,10)):n(new lc(`Invalid \`retry\` value: "${t}"`,{type:`invalid-retry`,value:t,line:i}));break;default:n(new lc(`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(`
60
60
  `)?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(`
61
61
  `,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]===`
62
- `&&r++}}return[t,n]}var pc=class extends TransformStream{constructor({onError:e,onRetry:t,onComment:n}={}){let r;super({start(i){r=dc({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 mc={initialReconnectionDelay:1e3,maxReconnectionDelay:3e4,reconnectionDelayGrowFactor:1.5,maxRetries:2};var X=class extends Error{constructor(e,t){super(`Streamable HTTP error: ${t}`),this.code=e}},hc=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=Qo(t?.fetch,t?.requestInit),this._sessionId=t?.sessionId,this._reconnectionOptions=t?.reconnectionOptions??mc}async _authThenStart(){if(!this._authProvider)throw new Y(`No auth provider`);let e;try{e=await Hs(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 Y;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=Zo(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 X(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 pc({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=Qe.parse(JSON.parse(e.data));Ne(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 Y(`No auth provider`);if(await Hs(this._authProvider,{serverUrl:this._url,authorizationCode:e,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})!==`AUTHORIZED`)throw new Y(`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:nt(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 X(401,`Server returned 401 after successful authentication`);let{resourceMetadataUrl:t,scope:n}=Ks(o);if(this._resourceMetadataUrl=t,this._scope=n,await Hs(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})!==`AUTHORIZED`)throw new Y;return this._hasCompletedAuthFlow=!0,this.send(e)}if(o.status===403&&this._authProvider){let{resourceMetadataUrl:t,scope:n,error:r}=Ks(o);if(r===`insufficient_scope`){let r=o.headers.get(`WWW-Authenticate`);if(this._lastUpscopingHeader===r)throw new X(403,`Server returned 403 after trying upscoping`);if(n&&(this._scope=n),t&&(this._resourceMetadataUrl=t),this._lastUpscopingHeader=r??void 0,await Hs(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetch})!==`AUTHORIZED`)throw new Y;return this.send(e)}}throw new X(o.status,`Error POSTing to endpoint: ${t}`)}if(this._hasCompletedAuthFlow=!1,this._lastUpscopingHeader=void 0,o.status===202){await o.body?.cancel(),Be(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=>Qe.parse(e)):[Qe.parse(e)];for(let e of t)this.onmessage?.(e)}else throw await o.body?.cancel(),new X(-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 X(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 gc(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 _c(e){if(e===void 0||e===``)return;let t=Number.parseInt(e,10);if(!(Number.isNaN(t)||t<=0))return t}function vc(e){return e===`0.0.0.0`||e===`::`?`localhost`:e.includes(`:`)&&!e.startsWith(`[`)?`[${e}]`:e}function yc(e,t){return`http://${vc(e)}:${t}/mcp`}function bc(e,t){return`ws://${vc(e)}:${t}`}function xc(e){let t=new URL(e);return t.protocol=t.protocol===`https:`?`wss:`:`ws:`,t.pathname=``,t.search=``,t.hash=``,t.toString().replace(/\/$/,``)}function Sc(e,t){if(!(!e||e.port<=0)&&t(e.pid))return e.port}function Cc(e){return N(e)?F(e,`utf-8`).trim():``}function wc(e,t){return`server did not start within ${e}ms${t?` stderr:\n${t}`:``}`}function Tc(e){if(e&&typeof e==`object`&&`method`in e&&`id`in e)return e.id}function Ec(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 Dc(e,t){return{jsonrpc:`2.0`,id:e,error:{code:-32e3,message:t instanceof Error?t.message:String(t)}}}async function Oc(e){let t=e.readLock??(()=>m(e.lockDir)),n=e.isAlive??y,r=e.sleep??(e=>cn(e)),a=e.spawn??Et,o=e.readErrorLog??Cc,s=e.openErrorLog??(e=>Rt(e,`w`)),c=e.closeFd??Nt,l=e.timeoutMs??5e3,u=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 yc(`localhost`,t)}let d=Sc(t(),n);if(d!==void 0)return yc(`localhost`,d);if(e.envAutoStart===`0`)throw Error(`Open Knowledge server is not running and OK_MCP_AUTOSTART=0 disables auto-start.`);N(e.lockDir)||P(e.lockDir,{recursive:!0});let f=j(e.lockDir,i),p=s(f),h,g,_=_t();try{try{h=a(_.command,[..._.prefixArgs,`start`],{detached:!0,stdio:[`ignore`,`ignore`,p],cwd:e.contentDir,env:{...process.env,OK_LOCK_KIND:`mcp-spawned`,ELECTRON_RUN_AS_NODE:`1`}}),h.on(`error`,e=>{g=e instanceof Error?e.message:String(e)}),h.unref()}catch(e){g=e instanceof Error?e.message:String(e)}}finally{try{c(p)}catch{}}let v=Date.now()+l;for(;Date.now()<v;){if(g){let e=o(f),t=e?` stderr:\n${e}`:``;throw Error(`spawn failed: ${g}${t}`)}await r(u);let e=Sc(t(),n);if(e!==void 0)return yc(`localhost`,e)}if(g){let e=o(f),t=e?` stderr:\n${e}`:``;throw Error(`spawn failed: ${g}${t}`)}throw Error(wc(l,o(f)))}function kc(e,t){if(e.portOverride!==void 0)return xc(t);let n=e.readLock??(()=>m(e.lockDir)),r=e.isAlive??y,i=Sc(n(),r);if(i!==void 0)return bc(`localhost`,i)}async function Ac(e,t={}){let n=t.stderr??process.stderr,r=t.requestTimeoutMs??12e4,i=t.createStdioTransport?t.createStdioTransport(t.stdin,t.stdout):new Ko(t.stdin,t.stdout),a=t.createHttpTransport?t.createHttpTransport(new URL(e)):new hc(new URL(e),{fetch:gc(r),requestInit:{headers:{...b({kind:`mcp`,runtimeVersion:_}),...t.connectionId===void 0?{}:{[Ee]:t.connectionId}}}}),o=!1,s=async()=>{o||(o=!0,t.onclose?.(),await Promise.allSettled([i.close(),a.close()]))};i.onerror=e=>{n.write(`[mcp-shim] stdio error: ${e.message}\n`)},a.onerror=e=>{n.write(`[mcp-shim] HTTP transport error: ${e.message}\n`)},i.onclose=()=>{s()},a.onclose=()=>{s()};let c=Promise.resolve();i.onmessage=e=>{c=c.then(async()=>{try{await a.send(e)}catch(t){let r=Tc(e);if(r===void 0){n.write(`[mcp-shim] failed to forward stdio notification: ${t instanceof Error?t.message:String(t)}\n`);return}await i.send(Dc(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`)})},a.onmessage=e=>{let t=Ec(e);t&&a.setProtocolVersion?.(t),i.send(e).catch(e=>{n.write(`[mcp-shim] failed to write stdio response: ${e instanceof Error?e.message:String(e)}\n`)})};try{await a.start(),await i.start()}catch(e){throw await s(),e}return{close:s}}async function jc(e){let t=e.stderr??process.stderr,n=e.bridgeFn??Ac,r=await Oc(e),i=e.createConnectionId?.()??sn(),a=!1,o=(e.startKeepalive??Ho)({connectionId:i,resolveWsUrl:async()=>kc(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 Mc=en(import.meta.url);function Nc(e){let t=M(e);for(;;){if(Ae(t))return t;let n=kt(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 \`${ee}\`).`);t=n}}function Pc(e){try{let t=new URL(e);return t.protocol===`file:`?en(t):void 0}catch{return}}async function Fc(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=Pc(n[0].uri);return r===void 0&&e.log?.(`single root URI not usable as fs path: ${n[0].uri}`),r}async function Ic(e,t){if(e!==void 0)return Nc(e);let n=await t();if(n!==void 0)return Nc(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 Lc(e){let t=process.stderr,n=e.spawnTimeoutMs??_c(process.env.OK_MCP_SPAWN_TIMEOUT_MS),r=e.envAutoStart??process.env.OK_MCP_AUTOSTART,i=gt({startupCwd:e.startupCwd,startupConfig:e.startupConfig}),a=new Le({name:Ke,version:_},{instructions:Ge({dir:`.`})});rt(a);let o=sn(),s={current:{connectionId:o,displayName:o,colorSeed:o}},c=new Map,l=e=>{if(c.has(e))return;let n=Ze(e),r=s.current,i=Ho({connectionId:o,displayName:r.displayName,clientName:r.clientInfo?.name??r.displayName,colorSeed:r.colorSeed,resolveWsUrl:async()=>kc({lockDir:n,contentDir:e},``),log:n=>t.write(`[mcp] keepalive[${e}]: ${n}\n`)});c.set(e,i)},u=()=>Fc({getClientCapabilities:()=>a.server.getClientCapabilities(),listRoots:()=>a.server.listRoots(),log:e=>t.write(`[mcp] ${e}\n`)}),d=e=>Ic(e,u),f=async e=>{let t;if(e===void 0){let e=await u();if(e===void 0)return;t=Nc(e)}else t=Nc(e);let a=await i(t),o=await Oc({lockDir:Ze(t),contentDir:We(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}},Ye(a,{serverUrl:f,resolveCwd:d,config:i,identityRef:s});let p=new Ko,m=!1,h,g=async()=>{if(m)return;m=!0,h?.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)
62
+ `&&r++}}return[t,n]}var pc=class extends TransformStream{constructor({onError:e,onRetry:t,onComment:n}={}){let r;super({start(i){r=dc({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 mc={initialReconnectionDelay:1e3,maxReconnectionDelay:3e4,reconnectionDelayGrowFactor:1.5,maxRetries:2};var X=class extends Error{constructor(e,t){super(`Streamable HTTP error: ${t}`),this.code=e}},hc=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=Qo(t?.fetch,t?.requestInit),this._sessionId=t?.sessionId,this._reconnectionOptions=t?.reconnectionOptions??mc}async _authThenStart(){if(!this._authProvider)throw new Y(`No auth provider`);let e;try{e=await Hs(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 Y;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=Zo(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 X(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 pc({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=He.parse(JSON.parse(e.data));tt(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 Y(`No auth provider`);if(await Hs(this._authProvider,{serverUrl:this._url,authorizationCode:e,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})!==`AUTHORIZED`)throw new Y(`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:Oe(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 X(401,`Server returned 401 after successful authentication`);let{resourceMetadataUrl:t,scope:n}=Ks(o);if(this._resourceMetadataUrl=t,this._scope=n,await Hs(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})!==`AUTHORIZED`)throw new Y;return this._hasCompletedAuthFlow=!0,this.send(e)}if(o.status===403&&this._authProvider){let{resourceMetadataUrl:t,scope:n,error:r}=Ks(o);if(r===`insufficient_scope`){let r=o.headers.get(`WWW-Authenticate`);if(this._lastUpscopingHeader===r)throw new X(403,`Server returned 403 after trying upscoping`);if(n&&(this._scope=n),t&&(this._resourceMetadataUrl=t),this._lastUpscopingHeader=r??void 0,await Hs(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetch})!==`AUTHORIZED`)throw new Y;return this.send(e)}}throw new X(o.status,`Error POSTing to endpoint: ${t}`)}if(this._hasCompletedAuthFlow=!1,this._lastUpscopingHeader=void 0,o.status===202){await o.body?.cancel(),Le(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=>He.parse(e)):[He.parse(e)];for(let e of t)this.onmessage?.(e)}else throw await o.body?.cancel(),new X(-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 X(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 gc(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 _c(e){if(e===void 0||e===``)return;let t=Number.parseInt(e,10);if(!(Number.isNaN(t)||t<=0))return t}function vc(e){return e===`0.0.0.0`||e===`::`?`localhost`:e.includes(`:`)&&!e.startsWith(`[`)?`[${e}]`:e}function yc(e,t){return`http://${vc(e)}:${t}/mcp`}function bc(e,t){return`ws://${vc(e)}:${t}`}function xc(e){let t=new URL(e);return t.protocol=t.protocol===`https:`?`wss:`:`ws:`,t.pathname=``,t.search=``,t.hash=``,t.toString().replace(/\/$/,``)}function Sc(e,t){if(!(!e||e.port<=0)&&t(e.pid))return e.port}function Cc(e){return N(e)?F(e,`utf-8`).trim():``}function wc(e,t){return`server did not start within ${e}ms${t?` stderr:\n${t}`:``}`}function Tc(e){if(e&&typeof e==`object`&&`method`in e&&`id`in e)return e.id}function Ec(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 Dc(e,t){return{jsonrpc:`2.0`,id:e,error:{code:-32e3,message:t instanceof Error?t.message:String(t)}}}async function Oc(e){let t=e.readLock??(()=>m(e.lockDir)),n=e.isAlive??y,r=e.sleep??(e=>cn(e)),a=e.spawn??Et,o=e.readErrorLog??Cc,s=e.openErrorLog??(e=>Rt(e,`w`)),c=e.closeFd??Nt,l=e.timeoutMs??5e3,u=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 yc(`localhost`,t)}let d=Sc(t(),n);if(d!==void 0)return yc(`localhost`,d);if(e.envAutoStart===`0`)throw Error(`Open Knowledge server is not running and OK_MCP_AUTOSTART=0 disables auto-start.`);N(e.lockDir)||P(e.lockDir,{recursive:!0});let f=j(e.lockDir,i),p=s(f),h,g,_=_t();try{try{h=a(_.command,[..._.prefixArgs,`start`],{detached:!0,stdio:[`ignore`,`ignore`,p],cwd:e.contentDir,env:{...process.env,OK_LOCK_KIND:`mcp-spawned`,ELECTRON_RUN_AS_NODE:`1`}}),h.on(`error`,e=>{g=e instanceof Error?e.message:String(e)}),h.unref()}catch(e){g=e instanceof Error?e.message:String(e)}}finally{try{c(p)}catch{}}let v=Date.now()+l;for(;Date.now()<v;){if(g){let e=o(f),t=e?` stderr:\n${e}`:``;throw Error(`spawn failed: ${g}${t}`)}await r(u);let e=Sc(t(),n);if(e!==void 0)return yc(`localhost`,e)}if(g){let e=o(f),t=e?` stderr:\n${e}`:``;throw Error(`spawn failed: ${g}${t}`)}throw Error(wc(l,o(f)))}function kc(e,t){if(e.portOverride!==void 0)return xc(t);let n=e.readLock??(()=>m(e.lockDir)),r=e.isAlive??y,i=Sc(n(),r);if(i!==void 0)return bc(`localhost`,i)}async function Ac(e,t={}){let n=t.stderr??process.stderr,r=t.requestTimeoutMs??12e4,i=t.createStdioTransport?t.createStdioTransport(t.stdin,t.stdout):new Ko(t.stdin,t.stdout),a=t.createHttpTransport?t.createHttpTransport(new URL(e)):new hc(new URL(e),{fetch:gc(r),requestInit:{headers:{...b({kind:`mcp`,runtimeVersion:_}),...t.connectionId===void 0?{}:{[Ee]:t.connectionId}}}}),o=!1,s=async()=>{o||(o=!0,t.onclose?.(),await Promise.allSettled([i.close(),a.close()]))};i.onerror=e=>{n.write(`[mcp-shim] stdio error: ${e.message}\n`)},a.onerror=e=>{n.write(`[mcp-shim] HTTP transport error: ${e.message}\n`)},i.onclose=()=>{s()},a.onclose=()=>{s()};let c=Promise.resolve();i.onmessage=e=>{c=c.then(async()=>{try{await a.send(e)}catch(t){let r=Tc(e);if(r===void 0){n.write(`[mcp-shim] failed to forward stdio notification: ${t instanceof Error?t.message:String(t)}\n`);return}await i.send(Dc(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`)})},a.onmessage=e=>{let t=Ec(e);t&&a.setProtocolVersion?.(t),i.send(e).catch(e=>{n.write(`[mcp-shim] failed to write stdio response: ${e instanceof Error?e.message:String(e)}\n`)})};try{await a.start(),await i.start()}catch(e){throw await s(),e}return{close:s}}async function jc(e){let t=e.stderr??process.stderr,n=e.bridgeFn??Ac,r=await Oc(e),i=e.createConnectionId?.()??sn(),a=!1,o=(e.startKeepalive??Ho)({connectionId:i,resolveWsUrl:async()=>kc(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 Mc=en(import.meta.url);function Nc(e){let t=M(e);for(;;){if(Pe(t))return t;let n=kt(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 \`${ee}\`).`);t=n}}function Pc(e){try{let t=new URL(e);return t.protocol===`file:`?en(t):void 0}catch{return}}async function Fc(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=Pc(n[0].uri);return r===void 0&&e.log?.(`single root URI not usable as fs path: ${n[0].uri}`),r}async function Ic(e,t){if(e!==void 0)return Nc(e);let n=await t();if(n!==void 0)return Nc(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 Lc(e){let t=process.stderr,n=e.spawnTimeoutMs??_c(process.env.OK_MCP_SPAWN_TIMEOUT_MS),r=e.envAutoStart??process.env.OK_MCP_AUTOSTART,i=gt({startupCwd:e.startupCwd,startupConfig:e.startupConfig}),a=new it({name:qe,version:_},{instructions:Be({dir:`.`})});ke(a);let o=sn(),s={current:{connectionId:o,displayName:o,colorSeed:o}},c=new Map,l=e=>{if(c.has(e))return;let n=Xe(e),r=s.current,i=Ho({connectionId:o,displayName:r.displayName,clientName:r.clientInfo?.name??r.displayName,colorSeed:r.colorSeed,resolveWsUrl:async()=>kc({lockDir:n,contentDir:e},``),log:n=>t.write(`[mcp] keepalive[${e}]: ${n}\n`)});c.set(e,i)},u=()=>Fc({getClientCapabilities:()=>a.server.getClientCapabilities(),listRoots:()=>a.server.listRoots(),log:e=>t.write(`[mcp] ${e}\n`)}),d=e=>Ic(e,u),f=async e=>{let t;if(e===void 0){let e=await u();if(e===void 0)return;t=Nc(e)}else t=Nc(e);let a=await i(t),o=await Oc({lockDir:Xe(t),contentDir:ze(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}},Ge(a,{serverUrl:f,resolveCwd:d,config:i,identityRef:s});let p=new Ko,m=!1,h,g=async()=>{if(m)return;m=!0,h?.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)
63
63
  `);let v=!1,y=()=>{v||(v=!0,setTimeout(()=>{t.write(`[mcp] shutdown deadline (5s) reached — forcing exit(1)
64
- `),process.exit(1)},5e3).unref(),g().finally(()=>{process.exit(0)}))};if(process.once(`SIGINT`,y),process.once(`SIGTERM`,y),Xo({log:e=>t.write(`${e}\n`),transport:p,process,stdin:process.stdin}),process.platform===`darwin`){let e=Yo(Mc,{realpathSync:Bt,statInoSync:e=>Ht(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=Jo({detect:()=>qo({bundleAnchorPath:Mc,currentInode:r,platform:process.platform,realpath:Bt,statInode:e=>Ht(e).ino}),onReplaced:e=>{t.write(`[mcp] bundle replaced anchor=${n} bootInode=${e.currentInode} onDiskInode=${e.onDiskInode} version=${_} — exiting for host respawn\n`),y()},log:e=>t.write(`[mcp] ${e}\n`)})}}return{close:g}}function Rc(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=_c(process.env.OK_MCP_SPAWN_TIMEOUT_MS);await jc({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=zo(process.env,i,process.platform);if(a.proxy){let e=Ro(process.platform,qt(),{existsSync:N});if(e===null)Bo({stderr:process.stderr,mode:`fallback-absent`,bundlePath:null,reason:`no installed Open Knowledge.app bundle found`});else try{await Vo({bundlePath:e,argv:process.argv.slice(2),env:process.env,stderr:process.stderr});return}catch(t){Bo({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`;Bo({stderr:process.stderr,mode:e,bundlePath:null,reason:null})}await Lc({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 zc(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-Bq4KqKL_.mjs`),r=e(),i=process.cwd(),a=We(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 Z(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function Bc(e,t,n=process.cwd()){let r=e.op??`sync`,i=m(et(n));if(i&&i.port>0){let t=`http://127.0.0.1:${i.port}/api/sync/trigger`;e.json||process.stderr.write(`Triggering ${r} via running server (port ${i.port})\n`);try{let n=await fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`,...b({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}`)}Z(e.json,{type:`triggered`,op:r,port:i.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 a=Te({baseDir:n});if(r===`sync`||r===`pull`){Z(e.json,{type:`step`,step:`pull`});let t=await a.pull();Z(e.json,{type:`pull`,summary:t.summary}),e.json||process.stderr.write(` pull: ${t.summary.changes} changes\n`)}(r===`sync`||r===`push`)&&(Z(e.json,{type:`step`,step:`push`}),await a.push(),Z(e.json,{type:`push`,ok:!0}),e.json||process.stderr.write(` push: ok
65
- `)),Z(e.json,{type:`complete`,op:r}),e.json||process.stderr.write(`✓ ${r} complete\n`)}function Vc(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 Bc({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 Hc(e){return new t(`pull`).description(`Pull changes from the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await Bc({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 Uc(e){return new t(`push`).description(`Push commits to the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await Bc({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 Wc(e){return typeof e==`string`&&ke.includes(e)}async function Gc(e={}){let t=M(e.cwd??process.cwd()),n=e.pack??`knowledge-base`;if(!Xe[n])return{status:`failed`,message:`${D(`Error:`)} Unknown pack "${n}". Available: ${ke.join(`, `)}`,exitCode:1};let r;try{r=await Fe({projectDir:t,rootDir:e.root,packId:n})}catch(e){return e instanceof Ie?{status:`prerequisite-missing`,message:`${D(`Error:`)} ${e.message}`,exitCode:1}:{status:`failed`,message:`${D(`Error:`)} ${e instanceof Error?e.message:String(e)}`,exitCode:1}}if(r.created.length===0){let e=Xe[n].name;return{status:`no-op`,message:`${E(`Your ${e} pack is already seeded.`)}\n${T(`Nothing to do.`)}`,plan:r,exitCode:0}}if(e.dryRun)return{status:`dry-run`,message:`${k(`Plan (dry-run — no changes made):`)}\n\n${qc(r,t)}`,plan:r,exitCode:0};if(!e.yes&&!await Jc(`${k(`Plan:`)}\n\n${qc(r,t)}\n\n${k(`Apply?`)} ${T(`[Y/n] `)}`,e.confirmStream))return{status:`cancelled`,message:T(`Cancelled.`),plan:r,exitCode:0};let i=await Re(r,{projectDir:t,packId:n});if(i.errors.length>0){let e=i.errors.map(e=>` ${D(`✗`)} ${e.path}: ${e.error}`);return{status:`failed`,message:[`${O(`Applied`)} ${i.applied} entries, ${O(String(i.errors.length))} error(s):`,...e].join(`
66
- `),plan:r,exitCode:1}}let a=Xe[n].name;return{status:`applied`,message:`${E(`✓ Seeded ${a}`)} ${T(`(${i.applied} entries, ${i.durationMs}ms)`)}`,plan:r,exitCode:0}}function Kc(){let e=[k(`Available packs:`)];for(let t of ke){let n=Xe[t];e.push(` ${E(t)} ${T(`—`)} ${n.name}: ${n.description}`)}return e.join(`
64
+ `),process.exit(1)},5e3).unref(),g().finally(()=>{process.exit(0)}))};if(process.once(`SIGINT`,y),process.once(`SIGTERM`,y),Xo({log:e=>t.write(`${e}\n`),transport:p,process,stdin:process.stdin}),process.platform===`darwin`){let e=Yo(Mc,{realpathSync:Bt,statInoSync:e=>Ht(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=Jo({detect:()=>qo({bundleAnchorPath:Mc,currentInode:r,platform:process.platform,realpath:Bt,statInode:e=>Ht(e).ino}),onReplaced:e=>{t.write(`[mcp] bundle replaced anchor=${n} bootInode=${e.currentInode} onDiskInode=${e.onDiskInode} version=${_} — exiting for host respawn\n`),y()},log:e=>t.write(`[mcp] ${e}\n`)})}}return{close:g}}function Rc(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=_c(process.env.OK_MCP_SPAWN_TIMEOUT_MS);await jc({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=zo(process.env,i,process.platform);if(a.proxy){let e=Ro(process.platform,qt(),{existsSync:N});if(e===null)Bo({stderr:process.stderr,mode:`fallback-absent`,bundlePath:null,reason:`no installed Open Knowledge.app bundle found`});else try{await Vo({bundlePath:e,argv:process.argv.slice(2),env:process.env,stderr:process.stderr});return}catch(t){Bo({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`;Bo({stderr:process.stderr,mode:e,bundlePath:null,reason:null})}await Lc({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 zc(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-BsZRww7n.mjs`),r=e(),i=process.cwd(),a=ze(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 Z(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function Bc(e,t,n=process.cwd()){let r=e.op??`sync`,i=m(We(n));if(i&&i.port>0){let t=`http://127.0.0.1:${i.port}/api/sync/trigger`;e.json||process.stderr.write(`Triggering ${r} via running server (port ${i.port})\n`);try{let n=await fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`,...b({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}`)}Z(e.json,{type:`triggered`,op:r,port:i.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 a=Te({baseDir:n});if(r===`sync`||r===`pull`){Z(e.json,{type:`step`,step:`pull`});let t=await a.pull();Z(e.json,{type:`pull`,summary:t.summary}),e.json||process.stderr.write(` pull: ${t.summary.changes} changes\n`)}(r===`sync`||r===`push`)&&(Z(e.json,{type:`step`,step:`push`}),await a.push(),Z(e.json,{type:`push`,ok:!0}),e.json||process.stderr.write(` push: ok
65
+ `)),Z(e.json,{type:`complete`,op:r}),e.json||process.stderr.write(`✓ ${r} complete\n`)}function Vc(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 Bc({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 Hc(e){return new t(`pull`).description(`Pull changes from the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await Bc({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 Uc(e){return new t(`push`).description(`Push commits to the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await Bc({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 Wc(e){return typeof e==`string`&&Me.includes(e)}async function Gc(e={}){let t=M(e.cwd??process.cwd()),n=e.pack??`knowledge-base`;if(!Qe[n])return{status:`failed`,message:`${D(`Error:`)} Unknown pack "${n}". Available: ${Me.join(`, `)}`,exitCode:1};let r;try{r=await Fe({projectDir:t,rootDir:e.root,packId:n})}catch(e){return e instanceof Re?{status:`prerequisite-missing`,message:`${D(`Error:`)} ${e.message}`,exitCode:1}:{status:`failed`,message:`${D(`Error:`)} ${e instanceof Error?e.message:String(e)}`,exitCode:1}}if(r.created.length===0){let e=Qe[n].name;return{status:`no-op`,message:`${E(`Your ${e} pack is already seeded.`)}\n${T(`Nothing to do.`)}`,plan:r,exitCode:0}}if(e.dryRun)return{status:`dry-run`,message:`${k(`Plan (dry-run — no changes made):`)}\n\n${qc(r,t)}`,plan:r,exitCode:0};if(!e.yes&&!await Jc(`${k(`Plan:`)}\n\n${qc(r,t)}\n\n${k(`Apply?`)} ${T(`[Y/n] `)}`,e.confirmStream))return{status:`cancelled`,message:T(`Cancelled.`),plan:r,exitCode:0};let i=await $e(r,{projectDir:t,packId:n});if(i.errors.length>0){let e=i.errors.map(e=>` ${D(`✗`)} ${e.path}: ${e.error}`);return{status:`failed`,message:[`${O(`Applied`)} ${i.applied} entries, ${O(String(i.errors.length))} error(s):`,...e].join(`
66
+ `),plan:r,exitCode:1}}let a=Qe[n].name;return{status:`applied`,message:`${E(`✓ Seeded ${a}`)} ${T(`(${i.applied} entries, ${i.durationMs}ms)`)}`,plan:r,exitCode:0}}function Kc(){let e=[k(`Available packs:`)];for(let t of Me){let n=Qe[t];e.push(` ${E(t)} ${T(`—`)} ${n.name}: ${n.description}`)}return e.join(`
67
67
  `)}function qc(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(k(`Folders to create:`));for(let e of r)n.push(` ${E(`+`)} ${w(At(t,M(t,e.path))||e.path)}${T(`/`)}`)}if(i.length>0){n.length>0&&n.push(``),n.push(k(`Files to create:`));for(let e of i)n.push(` ${E(`+`)} ${w(At(t,M(t,e.path))||e.path)}`)}if(e.skipped.length>0){n.length>0&&n.push(``),n.push(T(`Already present (skipped):`));for(let t of e.skipped)n.push(` ${T(`· ${t.path} (${t.reason})`)}`)}if(e.warnings.length>0){n.length>0&&n.push(``),n.push(O(`Warnings:`));for(let t of e.warnings)n.push(` ${O(`!`)} ${t}`)}return n.join(`
68
- `)}async function Jc(e,t){let n=ln({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 Yc(){return new t(`seed`).description(`Scaffold a starter pack into the project. Defaults to "${Ue}" — 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: ${ke.join(`, `)}. Defaults to "${Ue}".`).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(`${Kc()}\n`);return}if(t.pack!==void 0&&!Wc(t.pack)){process.stderr.write(`${D(`Error:`)} Unknown pack "${t.pack}". Available: ${ke.join(`, `)}\n`),process.exitCode=1;return}let n=await Gc({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 Xc(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 Zc(e,t){let{host:n,owner:r,name:i,json:a}=e;R(n);let o=await pi(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 Xc(new H({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
68
+ `)}async function Jc(e,t){let n=ln({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 Yc(){return new t(`seed`).description(`Scaffold a starter pack into the project. Defaults to "${Ke}" — 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: ${Me.join(`, `)}. Defaults to "${Ke}".`).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(`${Kc()}\n`);return}if(t.pack!==void 0&&!Wc(t.pack)){process.stderr.write(`${D(`Error:`)} Unknown pack "${t.pack}". Available: ${Me.join(`, `)}\n`),process.exitCode=1;return}let n=await Gc({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 Xc(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 Zc(e,t){let{host:n,owner:r,name:i,json:a}=e;R(n);let o=await pi(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 Xc(new H({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
69
69
  `:`taken
70
70
  `);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 Qc(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 Zc(t,await e())})}async function $c(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 el(e,t){let{host:n,json:r}=e;R(n);let i=await pi(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 $c(new H({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 tl(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 el(t,await e())})}function nl(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(`
71
- `)??``}\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 rl(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 il(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 al(e,t){return(await e.users.getAuthenticated()).data.login.toLowerCase()===t.toLowerCase()?`user`:`org`}function ol(e){return Te({baseDir:e,unsafe:{allowUnsafeCredentialHelper:!0}}).env({GIT_TERMINAL_PROMPT:`0`})}function sl(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 cl={ensureOkScaffold:e=>{$e(e)},gitFactory:ol};async function ll(e){let t={...cl,...e.deps},n=M(e.projectDir),r;if(e.ownerKind)r=e.ownerKind;else try{r=await al(e.octokit,e.body.owner)}catch(e){return{kind:`error`,code:nl(e)}}try{t.ensureOkScaffold(n)}catch{return{kind:`error`,code:`init-failed`}}let i=t.gitFactory(n);if(!N(j(n,`.git`)))try{await i.init()}catch{return{kind:`error`,code:`init-failed`}}let a;try{a=await rl({octokit:e.octokit,ownerLogin:e.body.owner,ownerKind:r,name:e.body.name,visibility:e.body.visibility,description:e.body.description})}catch(t){if(nl(t)===`name-conflict`){let t=await il(e.octokit,e.body.owner,e.body.name);if(t===null)return{kind:`error`,code:`name-conflict`};a=t}else return{kind:`error`,code:nl(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=sl(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 ul(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 dl(e,t){let{host:n,owner:r,name:i,visibility:a,description:o,projectDir:s,json:c}=e;R(n);let l=await pi(n,t);if(l==null){ul(c,{kind:`error`,code:`auth-required`});return}let u=n===`github.com`?void 0:`https://${n}/api/v3`,d=new H({auth:l,...u?{baseUrl:u}:{}});try{Tt(`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`}ul(c,await ll({octokit:d,token:l,projectDir:s,body:{owner:r,name:i,visibility:a,description:o}}))}function fl(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'
71
+ `)??``}\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 rl(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 il(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 al(e,t){return(await e.users.getAuthenticated()).data.login.toLowerCase()===t.toLowerCase()?`user`:`org`}function ol(e){return Te({baseDir:e,unsafe:{allowUnsafeCredentialHelper:!0}}).env({GIT_TERMINAL_PROMPT:`0`})}function sl(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 cl={ensureOkScaffold:e=>{Ue(e)},gitFactory:ol};async function ll(e){let t={...cl,...e.deps},n=M(e.projectDir),r;if(e.ownerKind)r=e.ownerKind;else try{r=await al(e.octokit,e.body.owner)}catch(e){return{kind:`error`,code:nl(e)}}try{t.ensureOkScaffold(n)}catch{return{kind:`error`,code:`init-failed`}}let i=t.gitFactory(n);if(!N(j(n,`.git`)))try{await i.init()}catch{return{kind:`error`,code:`init-failed`}}let a;try{a=await rl({octokit:e.octokit,ownerLogin:e.body.owner,ownerKind:r,name:e.body.name,visibility:e.body.visibility,description:e.body.description})}catch(t){if(nl(t)===`name-conflict`){let t=await il(e.octokit,e.body.owner,e.body.name);if(t===null)return{kind:`error`,code:`name-conflict`};a=t}else return{kind:`error`,code:nl(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=sl(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 ul(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 dl(e,t){let{host:n,owner:r,name:i,visibility:a,description:o,projectDir:s,json:c}=e;R(n);let l=await pi(n,t);if(l==null){ul(c,{kind:`error`,code:`auth-required`});return}let u=n===`github.com`?void 0:`https://${n}/api/v3`,d=new H({auth:l,...u?{baseUrl:u}:{}});try{Tt(`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`}ul(c,await ll({octokit:d,token:l,projectDir:s,body:{owner:r,name:i,visibility:a,description:o}}))}function fl(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'
72
72
  `),process.exit(1)),await dl(t,await e())})}function pl(){let e=new t(`share`);e.description(`Sharing flow operations (owners, name-check, publish)`);let n=()=>S();return e.addCommand(tl(n)),e.addCommand(Qc(n)),e.addCommand(fl(n)),e}function ml(){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=M(e.project??process.cwd()),n=ve(t),r=ce(t,se(t));if(r.kind===`no-exclude`){hl(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(`${w(`Sharing mode is already`)} ${k(`shared`)} ${w(`— nothing to do.`)}\n`);return}process.stderr.write(`${E(`✓`)} ${k(`Sharing mode set to`)} ${E(`shared`)}\n`),process.stderr.write(` Removed OK paths from ${k(`.git/info/exclude`)}; commit the files to share with teammates.\n`)})}function hl(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(`${O({"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=M(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: ${_l(n)}`),a.push(``),a.push(`Excluded from git via ${k(`.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: ${w(n===`local-only`?`ok config-sharing share`:`ok config-sharing unshare`)}`),process.stdout.write(`${a.join(`
73
- `)}\n`)})}function _l(e){switch(e){case`shared`:return E(`shared`);case`local-only`:return E(`local-only`);case`no-git`:return O(`no-git (not a git repository)`)}}function vl(){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=M(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(`${k(`Sharing mode is already`)} ${E(`local-only`)} ${k(`— nothing to do.`)}\n`);return}process.stderr.write(`${E(`✓`)} ${k(`Sharing mode set to`)} ${E(`local-only`)}\n`),process.stderr.write(` Added ${n.appended.length} path(s) to ${k(`.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(`${O({"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 bl(){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(ml()),e.addCommand(vl()),e.addCommand(gl()),e}function xl(e,t){return{server:Sl(`server`,e),ui:Sl(`ui`,t)}}function Sl(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 Cl(e){return`${wl(e.server)}\n${wl(e.ui)}`}function wl(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 Tl(e){let t=e.inspect??(t=>ct(e.lockDir,t)),n=e.log??(e=>console.log(e)),r=xl(t(`server`),t(`ui`));return e.json?n(JSON.stringify(r,null,2)):n(Cl(r)),r}function El(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(),Tl({lockDir:et(process.cwd()),json:t.json===!0})})}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 $,Dl;function Ol(){return Dl}Q.name(`open-knowledge`).description(`Local-first knowledge base with CRDT collaboration`).version(pt).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}=ht(t);$=n;let r=e.args?.[0]??e.name()??`cli`;Dl=Oe({name:`cli`,project:n.project?.name??void 0}),Dl.info({command:r,cwd:process.cwd()},`cli command started`)}),Q.action(async()=>{if(St(xt()).available){vt({spawn:Et});return}await yt($,{})});const kl=bt(()=>$);Q.addCommand(kl);const Al=Rc(()=>$);Q.addCommand(Al),Q.addCommand(xe()),Q.addCommand(Yc()),Q.addCommand(Fo()),Q.addCommand(wt());const jl=zc(()=>$);Q.addCommand(jl);const Ml=Se(()=>$);Q.addCommand(Ml),Q.addCommand(lt(()=>$)),Q.addCommand(Ii(()=>$)),Q.addCommand(El(()=>$)),Q.addCommand(ot()),Q.addCommand(Do()),Q.addCommand(Ni()),Q.addCommand(ta()),Q.addCommand(xi()),Q.addCommand(qi(()=>$)),Q.addCommand(Vc(()=>$)),Q.addCommand(Uc(()=>$)),Q.addCommand(Hc(()=>$)),Q.addCommand(pl()),Q.addCommand(bl()),await Q.parseAsync(process.argv,{from:`node`});export{Ol as getCliLogger};
73
+ `)}\n`)})}function _l(e){switch(e){case`shared`:return E(`shared`);case`local-only`:return E(`local-only`);case`no-git`:return O(`no-git (not a git repository)`)}}function vl(){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=M(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(`${k(`Sharing mode is already`)} ${E(`local-only`)} ${k(`— nothing to do.`)}\n`);return}process.stderr.write(`${E(`✓`)} ${k(`Sharing mode set to`)} ${E(`local-only`)}\n`),process.stderr.write(` Added ${n.appended.length} path(s) to ${k(`.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(`${O({"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 bl(){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(ml()),e.addCommand(vl()),e.addCommand(gl()),e}function xl(e,t){return{server:Sl(`server`,e),ui:Sl(`ui`,t)}}function Sl(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 Cl(e){return`${wl(e.server)}\n${wl(e.ui)}`}function wl(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 Tl(e){let t=e.inspect??(t=>ct(e.lockDir,t)),n=e.log??(e=>console.log(e)),r=xl(t(`server`),t(`ui`));return e.json?n(JSON.stringify(r,null,2)):n(Cl(r)),r}function El(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(),Tl({lockDir:We(process.cwd()),json:t.json===!0})})}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 $,Dl;function Ol(){return Dl}Q.name(`open-knowledge`).description(`Local-first knowledge base with CRDT collaboration`).version(pt).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}=ht(t);$=n;let r=e.args?.[0]??e.name()??`cli`;Dl=Ie({name:`cli`,project:n.project?.name??void 0}),Dl.info({command:r,cwd:process.cwd()},`cli command started`)}),Q.action(async()=>{if(St(xt()).available){vt({spawn:Et});return}await yt($,{})});const kl=bt(()=>$);Q.addCommand(kl);const Al=Rc(()=>$);Q.addCommand(Al),Q.addCommand(xe()),Q.addCommand(Yc()),Q.addCommand(Fo()),Q.addCommand(wt());const jl=zc(()=>$);Q.addCommand(jl);const Ml=Se(()=>$);Q.addCommand(Ml),Q.addCommand(lt(()=>$)),Q.addCommand(Ii(()=>$)),Q.addCommand(El(()=>$)),Q.addCommand(ot()),Q.addCommand(Do()),Q.addCommand(Ni()),Q.addCommand(ta()),Q.addCommand(xi()),Q.addCommand(qi(()=>$)),Q.addCommand(Vc(()=>$)),Q.addCommand(Uc(()=>$)),Q.addCommand(Hc(()=>$)),Q.addCommand(pl()),Q.addCommand(bl()),await Q.parseAsync(process.argv,{from:`node`});export{Ol as getCliLogger};
74
74
  //# sourceMappingURL=cli.mjs.map
@@ -0,0 +1,2 @@
1
+ import"./server-lock-BpjJj3OD-C5eNAMGL.mjs";var e=`0.9.0-beta.24`;const t=`config.yml`,n=e;export{n,t};
2
+ //# sourceMappingURL=constants-9KdejJJk.mjs.map