@inkeep/open-knowledge 0.4.0-beta.6 → 0.4.0-beta.9

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.
@@ -3,7 +3,7 @@ name: open-knowledge
3
3
  description: "MUST invoke when the project contains a .ok/ directory — before any read or edit of .md / .mdx files, any mcp__open-knowledge__ tool call, and any write_document / edit_document. Skip if no .ok/ — not an Open Knowledge project. Carries preview-attach (open preview browser at session start; one-shot on `action: attach-preview-once`), STOP rules for native Read/Grep/Edit on in-scope markdown, grounding rules (every factual claim needs a source), standard markdown linking with get_dead_links verification, image sourcing + alt-text + source-citation rules, folder-first organization with opt-in nested .ok/ frontmatter + templates, and the anti-pattern table. Authoritative — MCP server instructions and AGENTS.md overlap but do not substitute for the full attach rule, grounding rule, media rules, dead-link verification, and failure-mode guidance carried only here."
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.4.0-beta.6"
6
+ version: "0.4.0-beta.9"
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{At as n,C as r,Ft as i,Gt as a,Ht as o,It as s,Jt as c,Lt as l,Rt as u,S as d,Tt as f,V as p,Y as m,cn as h,jt as g,kt as _,n as ee,sn as v}from"./dist-DVM7wH81.mjs";import{n as te,r as y,t as b}from"./dist-bundle-BSdjl7Rj.mjs";import{S as ne,_ as x,b as S,f as re,g as C,h as w,m as ie,p as ae,r as oe,v as T,x as E,y as se}from"./init-B7qJnXKB.mjs";import{c as ce,f as le,l as ue,s as de}from"./server-lock-D7DXNVql-BRVVzA6T.mjs";import{i as fe}from"./git-handle-DwfYp_z--CfyPz4Dz.mjs";import{$n as pe,Bt as me,G as he,L as ge,Ot as _e,Qn as ve,Vt as ye,Wt as be,X as xe,Zn as Se,bn as D,er as Ce,ir as we,nn as Te,rr as Ee,tr as De,yn as O}from"./dist-B6pNPboH.mjs";import{n as Oe}from"./constants-Dc6GZ6j9.mjs";import{t as ke}from"./loader-BQf8AJXb.mjs";import{d as Ae,f as je,l as Me,m as Ne,p as Pe,s as Fe}from"./start-D6Ip3u6P.mjs";import{c as Ie,i as Le,n as k,o as A,r as Re,s as ze,t as j}from"./colors-BNufdynn.mjs";import"./src-Cak39c0B.mjs";import{execFileSync as Be,spawn as Ve,spawnSync as M}from"node:child_process";import He,{basename as Ue,dirname as We,join as N,relative as Ge,resolve as P}from"node:path";import{closeSync as Ke,existsSync as F,mkdirSync as qe,mkdtempSync as Je,openSync as Ye,readFileSync as I,readdirSync as Xe,rmSync as Ze,unlinkSync as Qe,writeFileSync as $e}from"node:fs";import et from"node:process";import{homedir as tt,hostname as nt,tmpdir as rt}from"node:os";import{AsyncLocalStorage as it,AsyncResource as at}from"node:async_hooks";import{stripVTControlCharacters as ot,styleText as L}from"node:util";import*as st from"node:readline";import{randomUUID as ct}from"node:crypto";import{realpath as lt}from"node:fs/promises";import{setTimeout as ut}from"node:timers/promises";import{createServer as dt,request as ft}from"node:http";import{createInterface as pt}from"node:readline/promises";var mt=h();const ht=`open-knowledge`;var gt=class{backend=`keyring`;async get(e){let{Entry:t}=await import(`@napi-rs/keyring`);try{let n=new t(ht,e).getPassword();return n==null?null:JSON.parse(n)}catch{return null}}async set(e,t,n,r){let{Entry:i}=await import(`@napi-rs/keyring`),a=new i(ht,e),o={login:t,token:n,...r};a.setPassword(JSON.stringify(o))}async clear(e){let{Entry:t}=await import(`@napi-rs/keyring`);try{new t(ht,e).deletePassword()}catch{}}},_t=class{backend=`file`;authFile;constructor(e){this.authFile=e??N(tt(),`.ok`,`auth.yml`)}read(){if(!F(this.authFile))return{};try{return(0,mt.parse)(I(this.authFile,`utf-8`))??{}}catch(e){let t=e instanceof Error?e.message:`unknown error`;return process.stderr.write(`[auth] Failed to parse ${this.authFile}: ${t}. Starting with empty credentials.\n`),{}}}write(e){let t=We(this.authFile);F(t)||qe(t,{recursive:!0,mode:448}),$e(this.authFile,(0,mt.stringify)(e),{mode:384})}async get(e){return this.read()[e]??null}async set(e,t,n,r){let i=this.read();i[e]={login:t,token:n,...r},this.write(i)}async clear(e){let t=this.read();delete t[e],this.write(t)}};async function vt(e){try{let{Entry:e}=await import(`@napi-rs/keyring`);return new e(ht,`__probe__`),process.stderr.write(`[auth] token storage: OS keychain
2
+ import{o as e}from"./chunk-FK9Q3tQk.mjs";import{t}from"./esm-CEs3LWY3.mjs";import{At as n,C as r,Ft as i,Gt as a,Ht as o,It as s,Jt as c,Lt as l,Rt as u,S as d,Tt as f,V as p,Y as m,cn as h,jt as g,kt as _,n as ee,sn as v}from"./dist-DVM7wH81.mjs";import{n as te,r as y,t as b}from"./dist-bundle-BSdjl7Rj.mjs";import{S as ne,_ as x,b as S,f as re,g as C,h as w,m as ie,p as ae,r as oe,v as T,x as E,y as se}from"./init-Cw_1Ay1s.mjs";import{c as ce,f as le,l as ue,s as de}from"./server-lock-D7DXNVql-BRVVzA6T.mjs";import{i as fe}from"./git-handle-DwfYp_z--CfyPz4Dz.mjs";import{$n as pe,Bt as me,G as he,L as ge,Ot as _e,Qn as ve,Vt as ye,Wt as be,X as xe,Zn as Se,bn as D,er as Ce,ir as we,nn as Te,rr as Ee,tr as De,yn as O}from"./dist-ou5qina8.mjs";import{n as Oe}from"./constants-CswmjLU5.mjs";import{t as ke}from"./loader-BTC8Ab4t.mjs";import{d as Ae,f as je,l as Me,m as Ne,p as Pe,s as Fe}from"./start-BDIOjX_O.mjs";import{c as Ie,i as Le,n as k,o as A,r as Re,s as ze,t as j}from"./colors-BNufdynn.mjs";import"./src-DXx7F2B7.mjs";import{execFileSync as Be,spawn as Ve,spawnSync as M}from"node:child_process";import He,{basename as Ue,dirname as We,join as N,relative as Ge,resolve as P}from"node:path";import{closeSync as Ke,existsSync as F,mkdirSync as qe,mkdtempSync as Je,openSync as Ye,readFileSync as I,readdirSync as Xe,rmSync as Ze,unlinkSync as Qe,writeFileSync as $e}from"node:fs";import et from"node:process";import{homedir as tt,hostname as nt,tmpdir as rt}from"node:os";import{AsyncLocalStorage as it,AsyncResource as at}from"node:async_hooks";import{stripVTControlCharacters as ot,styleText as L}from"node:util";import*as st from"node:readline";import{randomUUID as ct}from"node:crypto";import{realpath as lt}from"node:fs/promises";import{setTimeout as ut}from"node:timers/promises";import{createServer as dt,request as ft}from"node:http";import{createInterface as pt}from"node:readline/promises";var mt=h();const ht=`open-knowledge`;var gt=class{backend=`keyring`;async get(e){let{Entry:t}=await import(`@napi-rs/keyring`);try{let n=new t(ht,e).getPassword();return n==null?null:JSON.parse(n)}catch{return null}}async set(e,t,n,r){let{Entry:i}=await import(`@napi-rs/keyring`),a=new i(ht,e),o={login:t,token:n,...r};a.setPassword(JSON.stringify(o))}async clear(e){let{Entry:t}=await import(`@napi-rs/keyring`);try{new t(ht,e).deletePassword()}catch{}}},_t=class{backend=`file`;authFile;constructor(e){this.authFile=e??N(tt(),`.ok`,`auth.yml`)}read(){if(!F(this.authFile))return{};try{return(0,mt.parse)(I(this.authFile,`utf-8`))??{}}catch(e){let t=e instanceof Error?e.message:`unknown error`;return process.stderr.write(`[auth] Failed to parse ${this.authFile}: ${t}. Starting with empty credentials.\n`),{}}}write(e){let t=We(this.authFile);F(t)||qe(t,{recursive:!0,mode:448}),$e(this.authFile,(0,mt.stringify)(e),{mode:384})}async get(e){return this.read()[e]??null}async set(e,t,n,r){let i=this.read();i[e]={login:t,token:n,...r},this.write(i)}async clear(e){let t=this.read();delete t[e],this.write(t)}};async function vt(e){try{let{Entry:e}=await import(`@napi-rs/keyring`);return new e(ht,`__probe__`),process.stderr.write(`[auth] token storage: OS keychain
3
3
  `),new gt}catch{return process.stderr.write(`[auth] token storage: file (~/.ok/auth.yml)
4
4
  `),new _t(e)}}async function yt(e,t,n){let r=bt(await xt(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 bt(e){let t={};for(let n of e.split(`
5
5
  `)){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 xt(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 St(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 yt(process.stdin,process.stdout,t);process.exit(n)}),n}function Ct(e){let t=e.endpoint.DEFAULTS;return/^https:\/\/(api\.)?github\.com$/.test(t.baseUrl)?`https://github.com`:t.baseUrl.replace(`/api/v3`,``)}async function wt(e,t,n){let r={baseUrl:Ct(e),headers:{accept:`application/json`},...n},i=await e(t,r);if(`error`in i.data){let n=new te(`${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 Tt(e){let t=e.request||b,n={client_id:e.clientId};return`scopes`in e&&Array.isArray(e.scopes)&&(n.scope=e.scopes.join(` `)),wt(t,`POST /login/device/code`,n)}async function Et(e){let t=await wt(e.request||b,`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=Dt(e,t.data.expires_in),n.refreshTokenExpiresAt=Dt(e,t.data.refresh_token_expires_in)}delete n.scopes}return{...t,authentication:n}}function Dt(e,t){return new Date(e+t*1e3).toISOString()}async function Ot(e,t){let n=kt(e,t.auth);if(n)return n;let{data:r}=await Tt({clientType:e.clientType,clientId:e.clientId,request:t.request||e.request,scopes:t.auth.scopes||e.scopes});await e.onVerification(r);let i=await jt(t.request||e.request,e.clientId,e.clientType,r);return e.authentication=i,i}function kt(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 At(e){await new Promise(t=>setTimeout(t,e*1e3))}async function jt(e,t,n,r){try{let i={clientId:t,request:e,code:r.device_code},{authentication:a}=n===`oauth-app`?await Et({...i,clientType:`oauth-app`}):await Et({...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 At(r.interval),jt(e,t,n,r);if(a===`slow_down`)return await At(r.interval+7),jt(e,t,n,r);throw i}}async function Mt(e,t){return Ot(e,{auth:t})}async function Nt(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 Ot(e,{request:t,auth:{type:`oauth`}});return i.headers.authorization=`token ${a}`,t(i)}var Pt=`0.0.0-development`;function Ft(e){let t=e.request||b.defaults({headers:{"user-agent":`octokit-auth-oauth-device.js/${Pt} ${y()}`}}),{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(Mt.bind(null,i),{hook:Nt.bind(null,i)})}async function It(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=Ft({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-BmF5_Mcp.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 Lt={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 Rt;(function(e){})(Rt||={});function zt(e){return c(f,e)}function Bt(){return process.env.OPEN_KNOWLEDGE_GITHUB_CLIENT_ID??`Ov23liqlSd0V1MwR6rhI`}const Vt=new Set([`gitlab.com`,`bitbucket.org`,`codeberg.org`,`gitea.com`,`sr.ht`,`sourcehut.org`]);function Ht(e){let t=e.toLowerCase().replace(/:\d+$/,``);Vt.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 Ut(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function Wt(e,t,n=It){let r=Bt(),{host:i,json:a}=e;Ht(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?Ut(!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?Ut(!0,{type:`complete`,host:i,login:s}):process.stderr.write(`✓ Logged in as ${s} on ${i}\n`)}function Gt(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 Wt(t,await e())})}const Kt=e=>e.name===`enter`||e.name===`return`;var qt=class extends Error{name=`AbortPromptError`;message=`Prompt was aborted`;constructor(e){super(),this.cause=e?.cause}},Jt=class extends Error{name=`CancelPromptError`;message=`Prompt was canceled`},Yt=class extends Error{name=`ExitPromptError`},Xt=class extends Error{name=`HookError`},Zt=class extends Error{name=`ValidationError`};const Qt=new it;function $t(e){return{rl:e,hooks:[],hooksCleanup:[],hooksEffect:[],index:0,handleChange(){}}}function en(e,t){let n=$t(e);return Qt.run(n,()=>{function e(e){n.handleChange=()=>{n.index=0,e()},n.handleChange()}return t(e)})}function R(){let e=Qt.getStore();if(!e)throw new Xt(`[Inquirer] Hook functions can only be called from within a prompt`);return e}function tn(){return R().rl}function nn(e){return at.bind((...t)=>{let n=R(),r=!1,i=n.handleChange;n.handleChange=()=>{r=!0};let a=e(...t);return r&&i(),n.handleChange=i,a})}function rn(e){let t=R(),{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 an(){R().handleChange()}const z={queue(e){let t=R(),{index:n}=t;t.hooksEffect.push(()=>{t.hooksCleanup[n]?.();let r=e(tn());if(r!=null&&typeof r!=`function`)throw new Zt(`useEffect return value must be a cleanup function or nothing.`);t.hooksCleanup[n]=r})},run(){let e=R();nn(()=>{e.hooksEffect.forEach(e=>{e()}),e.hooksEffect.length=0})()},clearAll(){let e=R();e.hooksCleanup.forEach(e=>{e?.()}),e.hooksEffect.length=0,e.hooksCleanup.length=0}};function on(e){return typeof e==`function`}function B(e){return rn(t=>{let n=at.bind(function(e){t.get()!==e&&(t.set(e),an())});if(t.initialized)return[t.get(),n];let r=on(e)?e():e;return t.set(r),[r,n]})}function sn(e,t){rn(n=>{let r=n.get();(!Array.isArray(r)||t.some((e,t)=>!Object.is(e,r[t])))&&z.queue(e),n.set(t)})}const cn={prefix:{idle:L(`blue`,`?`),done:L(`green`,ne.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 ln(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 un(...e){let t={};for(let n of e)for(let[e,r]of Object.entries(n)){let n=t[e];t[e]=ln(n)&&ln(r)?un(n,r):r}return t}function dn(...e){return un(cn,...e.filter(e=>e!=null))}function fn({status:e=`idle`,theme:t}){let[n,r]=B(!1),[i,a]=B(0),{prefix:o,spinner:s}=dn(t);return sn(()=>{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 pn(e){return B({current:e})[0]}function mn(e){let t=pn(e);t.current=e,sn(e=>{let n=!1,r=nn((r,i)=>{n||t.current(i,e)});return e.input.on(`keypress`,r),()=>{n=!0,e.input.removeListener(`keypress`,r)}},[])}var hn=e(E(),1);function gn(e,t){return e.split(`
@@ -17,10 +17,10 @@ import{o as e}from"./chunk-FK9Q3tQk.mjs";import{t}from"./esm-CEs3LWY3.mjs";impor
17
17
  `),process.exit(1)}await t.set(r,c,a,{gitProtocol:`https`,name:l,email:u}),i?process.stdout.write(`${JSON.stringify({type:`complete`,host:r,login:c})}\n`):process.stderr.write(`✓ PAT stored for ${c} on ${r}\n`)}function Cr(e){return new t(`pat`).description(`Store a Personal Access Token`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{await Sr(t,await e())})}async function wr(e,t){let{host:n,json:r}=e;Ht(n);let i=await t.get(n);i??(process.stderr.write(`Not logged in to ${n}\n`),process.exit(1));let a=n===`github.com`?void 0:`https://${n}/api/v3`,o=new xr({auth:i.token,...a?{baseUrl:a}:{}}),s=[];for await(let e of o.paginate.iterator(o.repos.listForAuthenticatedUser,{per_page:100,sort:`updated`}))for(let t of e.data)s.push({full_name:t.full_name,clone_url:t.clone_url,private:t.private});if(r)process.stdout.write(`${JSON.stringify({type:`repos`,host:n,repos:s})}\n`);else for(let e of s)process.stdout.write(`${e.full_name} ${e.clone_url}\n`)}function Tr(e){return new t(`repos`).description(`List accessible repositories`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{await wr(t,await e())})}async function Er(e,t){let{host:n}=e;await t.clear(n),process.stderr.write(`✓ Signed out from ${n}\n`)}function Dr(e){return new t(`signout`).description(`Remove stored credentials`).option(`--host <host>`,`GitHub hostname`,`github.com`).action(async t=>{await Er(t,await e())})}async function Or(e,t){let{host:n,json:r}=e;Ht(n);let i=await t.get(n);i??(r?process.stdout.write(`${JSON.stringify({type:`status`,host:n,authenticated:!1})}\n`):process.stderr.write(`Not logged in to ${n}\n`),process.exit(1));let a=n===`github.com`?void 0:`https://${n}/api/v3`,o=new xr({auth:i.token,...a?{baseUrl:a}:{}});try{let{data:e}=await o.users.getAuthenticated();r?process.stdout.write(`${JSON.stringify({type:`status`,host:n,authenticated:!0,login:e.login,name:e.name,email:e.email})}\n`):process.stderr.write(`✓ Logged in as ${e.login} on ${n}\n`)}catch{r?process.stdout.write(JSON.stringify({type:`status`,host:n,authenticated:!1,error:`token invalid`})+`
18
18
  `):process.stderr.write(`✗ Token invalid for ${n}\n`),process.exit(1)}}function kr(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 Or(t,await e())})}function Ar(){let e=new t(`auth`);e.description(`GitHub authentication management`);let n=()=>vt();return e.addCommand(Gt(n)),e.addCommand(kr(n)),e.addCommand(Tr(n)),e.addCommand(Dr(n)),e.addCommand(Cr(n)),e.addCommand(St(n)),e}function H(e,t,n={}){let r=ue(e,t);if(!F(r))return{status:`missing`,lockPath:r};let i;try{i=JSON.parse(I(r,`utf-8`))}catch{return{status:`corrupt`,lockPath:r}}if(!i||typeof i!=`object`||!ce(i.pid))return{status:`corrupt`,lockPath:r};let a=i,o=n.host??nt();return a.hostname===o?(n.isAlive??de)(a.pid)?{status:`alive`,lockPath:r,lock:a}:{status:`dead-pid`,lockPath:r,lock:a}:{status:`foreign-host`,lockPath:r,lock:a}}function jr(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 Mr(e){let t=e.inspect??(t=>H(e.lockDir,t)),n=e.unlink??(e=>Qe(e)),r=e.log??(e=>console.log(e)),i=e.error??(e=>console.error(e)),a=jr(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 Nr(e){return new t(`clean`).description(`Prune stale / corrupt open-knowledge lock files (never touches live locks)`).action(()=>{Mr({lockDir:D(O(e(),process.cwd()))}).failed.length>0&&(process.exitCode=1)})}function Pr(){try{let e=Be(`gh`,[`auth`,`token`],{encoding:`utf-8`,stdio:[`ignore`,`pipe`,`pipe`],timeout:5e3}).trim();return e.length===0?{available:!1}:{available:!0,token:e}}catch{return{available:!1}}}async function Fr(e,t,n={},r=Pr){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`]}}function Ir(e){return e.replace(/:\d+$/,``)}function Lr(e){let t=e.trim();if(!t)return null;{let e=/^https?:\/\/([^/?#]+)\/([\w.\-~%]+)\/([\w.\-~%]+?)(?:\.git)?\/?$/.exec(t);if(e)return{protocol:`https`,hostname:Ir(e[1]),owner:e[2],name:e[3]}}{let e=/^ssh:\/\/(?:[\w.-]+@)?([^/?#]+)\/([\w.\-~%]+)\/([\w.\-~%]+?)(?:\.git)?\/?$/.exec(t);if(e)return{protocol:`ssh`,hostname:Ir(e[1]),owner:e[2],name:e[3]}}{let e=/^git:\/\/([^/?#]+)\/([\w.\-~%]+)\/([\w.\-~%]+?)(?:\.git)?\/?$/.exec(t);if(e)return{protocol:`git`,hostname:Ir(e[1]),owner:e[2],name:e[3]}}{let e=/^(?:[\w.-]+@)?([\w.-]+):([\w.\-~%]+)\/([\w.\-~%]+?)(?:\.git)?$/.exec(t);if(e?.[1].includes(`.`)||e&&t.startsWith(`git@`))return{protocol:`ssh`,hostname:e[1],owner:e[2],name:e[3]}}{let e=/^git:([\w.-]+)\/([\w.\-~%]+)\/([\w.\-~%]+?)(?:\.git)?\/?$/.exec(t);if(e)return{protocol:`git`,hostname:e[1],owner:e[2],name:e[3]}}if(!t.includes(`://`)&&!t.includes(`@`)&&!t.startsWith(`/`)){let e=/^([\w.-]+)\/([\w.\-~%]+?)(?:\.git)?$/.exec(t);if(e)return{protocol:`https`,hostname:`github.com`,owner:e[1],name:e[2]}}return null}const Rr=[[`count`,0,10],[`compress`,10,20],[`receiv`,20,60],[`resolv`,60,100]];function zr(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 Rr)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`)}async function Br(e,t,n,r=process.cwd()){let i=Lr(e);if(!i)throw Error(`Invalid git URL: ${e}`);let a=t.dir?P(r,t.dir):P(r,i.name);if(F(a)&&Xe(a).length>0)throw Error(`Target directory is not empty: ${a}`);let o=await vt(),s=await Fr(i.hostname,o,{}),c=fe({baseDir:r,config:s.credentialArgs.length>=2?[s.credentialArgs[1]]:[],unsafe:{allowUnsafeCredentialHelper:!0}}).env({GIT_TERMINAL_PROMPT:`0`}),l=-1;c.outputHandler((e,n,r)=>{r.on(`data`,e=>{let n=e.toString(`utf-8`);for(let e of n.split(`
19
19
  `)){let n=zr(e);n&&n.pct!==l&&(l=n.pct,U(t.json,{type:`progress`,pct:n.pct,stage:n.stage}),t.json||process.stderr.write(`\r Cloning… ${n.pct}%`))}})}),await c.clone(e,a,[`--progress`]),t.json||process.stderr.write(`
20
- `);try{let{runInit:e}=await import(`./init-DiH9oQ6_.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{Vr(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 Vr(e){let t=N(e,`.git`,`info`,`exclude`);if(!F(t))return`no-exclude`;let n=I(t,`utf-8`),r=new Set([`.ok`,`.ok/`,`/.ok`,`/.ok/`]);return n.split(`
20
+ `);try{let{runInit:e}=await import(`./init-C90VliDt.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{Vr(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 Vr(e){let t=N(e,`.git`,`info`,`exclude`);if(!F(t))return`no-exclude`;let n=I(t,`utf-8`),r=new Set([`.ok`,`.ok/`,`/.ok`,`/.ok/`]);return n.split(`
21
21
  `).map(e=>e.trim()).some(e=>r.has(e))?`already-present`:($e(t,`${n}${n.length===0||n.endsWith(`
22
22
  `)?``:`
23
- `}.ok/\n`,`utf-8`),`appended`)}function Hr(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).action(async(t,n,r)=>{let i=e();try{let a=await Br(t,{json:r.json,dir:n},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-BXk7J0Kh.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}})}const Ur=[[`sync`],[`persistence`,`debounceMs`],[`persistence`,`maxDebounceMs`],[`server`,`port`],[`content`,`include`],[`content`,`exclude`]];function Wr(e={}){let t=e.log??(e=>console.error(e)),n=e.error??(e=>console.error(e)),r=e.loadConfigFn??ke;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 Gr(e){let t=(0,mt.parseDocument)(I(e,`utf-8`));if(t.errors.length>0)throw Error(`Could not parse ${e}: ${t.errors.map(e=>e.message).join(`; `)}`);let n=[];for(let e of Ur)t.hasIn(e)&&n.push(e.join(`.`));return n}function Kr(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function qr(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=Kr(i)?i:{};e[r]=a,e=a}e[n[n.length-1]]=null}return t}async function Jr(e={}){let t=e.log??(e=>console.log(e)),n=e.error??(e=>console.error(e)),r=e.scope??`both`,i=e.dryRun??!1,a=e.cwd??process.cwd(),o=e.writeConfigPatchFn??we,s=[];(r===`project`||r===`both`)&&s.push({scope:`project`,absPath:Ee(`project`,a,e.homedirOverride)}),(r===`user`||r===`both`)&&s.push({scope:`user`,absPath:Ee(`user`,a,e.homedirOverride)});let c=[],l=!0;for(let{scope:t,absPath:n}of s){if(!F(n)){c.push({path:n,scope:t,found:[],removed:[]});continue}let r;try{r=Gr(n)}catch(e){let r=e instanceof Error?e.message:String(e);c.push({path:n,scope:t,found:[],removed:[],error:r}),l=!1;continue}if(r.length===0||i){c.push({path:n,scope:t,found:r,removed:[]});continue}let s=await o({cwd:a,scope:t,patch:qr(Ur.filter(e=>r.includes(e.join(`.`)))),homedirOverride:e.homedirOverride});if(!s.ok){c.push({path:n,scope:t,found:r,removed:[],error:m(s.error)}),l=!1;continue}c.push({path:n,scope:t,found:r,removed:r})}for(let e of c)e.error&&n(`✗ ${e.path}: ${e.error}`);let u=c.some(e=>e.error!==void 0),d=c.reduce((e,t)=>e+t.found.length,0);if(d===0&&!u)t(`No deprecated fields found.`);else if(d>0)for(let e of c)e.error||(e.found.length===0?t(` ${e.path}: no deprecated fields`):t(i?`[dry-run] ${e.path}: would remove ${e.found.length} field(s): ${e.found.join(`, `)}`:`✓ ${e.path}: removed ${e.removed.length} field(s): ${e.removed.join(`, `)}`));return{outcomes:c,ok:l}}function Yr(){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(()=>{Wr({}).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 Jr({scope:t,dryRun:e.dryRun})).ok||(process.exitCode=1)}),e}var W=e(Ie(),1);const G=2e3,Xr=[/cli\.mjs/,/(^|[\s/])(open-knowledge|ok)\s+(start|mcp|ui)(\s|$)/,/(^|[\s/])bun([\s/]).*?(run dev|packages\/app|vite|hocuspocus)/,/(^|[\s/])node([\s/]).*?(packages\/(cli|app)|vite|hocuspocus)/];function Zr(e){return Xr.some(t=>t.test(e))}async function Qr(){let e=M(`pgrep`,[`-a`,`-f`,`cli\\.mjs|open-knowledge|(^|[ /])ok[ ]+(start|mcp|ui)([ ]|$)|packages/(cli|app)|hocuspocus|vite`],{encoding:`utf-8`,timeout:G});if(!(e.error!=null&&e.error.code===`ENOENT`)){let t=e.stdout??``,n=$r(t);if(n.length>0||t.trim()===``)return n}let t=M(`ps`,[`-axo`,`pid,command`],{encoding:`utf-8`,timeout:G});return t.error!=null||!t.stdout?[]:ei(t.stdout)}function $r(e){let t=[];for(let n of e.split(`
23
+ `}.ok/\n`,`utf-8`),`appended`)}function Hr(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).action(async(t,n,r)=>{let i=e();try{let a=await Br(t,{json:r.json,dir:n},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-DmOxN4Ez.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}})}const Ur=[[`sync`],[`persistence`,`debounceMs`],[`persistence`,`maxDebounceMs`],[`server`,`port`],[`content`,`include`],[`content`,`exclude`]];function Wr(e={}){let t=e.log??(e=>console.error(e)),n=e.error??(e=>console.error(e)),r=e.loadConfigFn??ke;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 Gr(e){let t=(0,mt.parseDocument)(I(e,`utf-8`));if(t.errors.length>0)throw Error(`Could not parse ${e}: ${t.errors.map(e=>e.message).join(`; `)}`);let n=[];for(let e of Ur)t.hasIn(e)&&n.push(e.join(`.`));return n}function Kr(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function qr(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=Kr(i)?i:{};e[r]=a,e=a}e[n[n.length-1]]=null}return t}async function Jr(e={}){let t=e.log??(e=>console.log(e)),n=e.error??(e=>console.error(e)),r=e.scope??`both`,i=e.dryRun??!1,a=e.cwd??process.cwd(),o=e.writeConfigPatchFn??we,s=[];(r===`project`||r===`both`)&&s.push({scope:`project`,absPath:Ee(`project`,a,e.homedirOverride)}),(r===`user`||r===`both`)&&s.push({scope:`user`,absPath:Ee(`user`,a,e.homedirOverride)});let c=[],l=!0;for(let{scope:t,absPath:n}of s){if(!F(n)){c.push({path:n,scope:t,found:[],removed:[]});continue}let r;try{r=Gr(n)}catch(e){let r=e instanceof Error?e.message:String(e);c.push({path:n,scope:t,found:[],removed:[],error:r}),l=!1;continue}if(r.length===0||i){c.push({path:n,scope:t,found:r,removed:[]});continue}let s=await o({cwd:a,scope:t,patch:qr(Ur.filter(e=>r.includes(e.join(`.`)))),homedirOverride:e.homedirOverride});if(!s.ok){c.push({path:n,scope:t,found:r,removed:[],error:m(s.error)}),l=!1;continue}c.push({path:n,scope:t,found:r,removed:r})}for(let e of c)e.error&&n(`✗ ${e.path}: ${e.error}`);let u=c.some(e=>e.error!==void 0),d=c.reduce((e,t)=>e+t.found.length,0);if(d===0&&!u)t(`No deprecated fields found.`);else if(d>0)for(let e of c)e.error||(e.found.length===0?t(` ${e.path}: no deprecated fields`):t(i?`[dry-run] ${e.path}: would remove ${e.found.length} field(s): ${e.found.join(`, `)}`:`✓ ${e.path}: removed ${e.removed.length} field(s): ${e.removed.join(`, `)}`));return{outcomes:c,ok:l}}function Yr(){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(()=>{Wr({}).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 Jr({scope:t,dryRun:e.dryRun})).ok||(process.exitCode=1)}),e}var W=e(Ie(),1);const G=2e3,Xr=[/cli\.mjs/,/(^|[\s/])(open-knowledge|ok)\s+(start|mcp|ui)(\s|$)/,/(^|[\s/])bun([\s/]).*?(run dev|packages\/app|vite|hocuspocus)/,/(^|[\s/])node([\s/]).*?(packages\/(cli|app)|vite|hocuspocus)/];function Zr(e){return Xr.some(t=>t.test(e))}async function Qr(){let e=M(`pgrep`,[`-a`,`-f`,`cli\\.mjs|open-knowledge|(^|[ /])ok[ ]+(start|mcp|ui)([ ]|$)|packages/(cli|app)|hocuspocus|vite`],{encoding:`utf-8`,timeout:G});if(!(e.error!=null&&e.error.code===`ENOENT`)){let t=e.stdout??``,n=$r(t);if(n.length>0||t.trim()===``)return n}let t=M(`ps`,[`-axo`,`pid,command`],{encoding:`utf-8`,timeout:G});return t.error!=null||!t.stdout?[]:ei(t.stdout)}function $r(e){let t=[];for(let n of e.split(`
24
24
  `)){let e=n.trim();if(!e)continue;let r=e.indexOf(` `);if(r===-1)continue;let i=e.slice(0,r),a=e.slice(r+1),o=Number.parseInt(i,10);!Number.isNaN(o)&&Zr(a)&&t.push(o)}return t}function ei(e){let t=[],n=e.split(`
25
25
  `);for(let e=1;e<n.length;e++){let r=n[e]?.trim();if(!r)continue;let i=r.indexOf(` `);if(i===-1)continue;let a=r.slice(0,i),o=r.slice(i+1).trim(),s=Number.parseInt(a,10);!Number.isNaN(s)&&Zr(o)&&t.push(s)}return t}function ti(e){let t=e.trim().split(/\s+/).filter(Boolean);for(let e of t){if(e.startsWith(`@`))continue;let t=Ue(e);if(t===`open-knowledge`||t===`ok`||e.endsWith(`/packages/cli/src/cli.ts`)||e.endsWith(`/packages/cli/dist/cli.mjs`)||t===`cli.mjs`||t===`cli.ts`)return e}return null}function ni(e){let t=M(`ps`,[`-p`,String(e),`-o`,`command=`],{encoding:`utf-8`,timeout:G});return t.error!=null||!t.stdout?null:t.stdout.trim()||null}function ri(e){let t=M(`ps`,[`-p`,String(e),`-o`,`%cpu=,%mem=`],{encoding:`utf-8`,timeout:G});if(t.error!=null||!t.stdout)return null;let[n,r]=t.stdout.trim().split(/\s+/),i=Number.parseFloat(n??``),a=Number.parseFloat(r??``);return Number.isNaN(i)||Number.isNaN(a)?null:{cpuPercent:i,memPercent:a}}async function ii(e){let t=M(`lsof`,[`-p`,String(e),`-a`,`-d`,`cwd`,`-Fn`],{encoding:`utf-8`,timeout:G});if(t.error!=null)return null;let n=t.stdout??``;for(let e of n.split(`
26
26
  `))if(e.startsWith(`n`)&&e.length>1)return e.slice(1);return null}function ai(e){let t=[],n=e.split(`
@@ -55,9 +55,9 @@ setTimeout(() => process.exit(2), ${t+1e4});
55
55
  `,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]===`
56
56
  `&&r++}}return[t,n]}var Ba=class extends TransformStream{constructor({onError:e,onRetry:t,onComment:n}={}){let r;super({start(i){r=Ra({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 Va={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}},Ha=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=Ti(t?.fetch,t?.requestInit),this._sessionId=t?.sessionId,this._reconnectionOptions=t?.reconnectionOptions??Va}async _authThenStart(){if(!this._authProvider)throw new Y(`No auth provider`);let e;try{e=await ha(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=wi(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 Ba({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=Se.parse(JSON.parse(e.data));De(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 ha(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:Ce(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}=ya(o);if(this._resourceMetadataUrl=t,this._scope=n,await ha(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}=ya(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 ha(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(),pe(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=>Se.parse(e)):[Se.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})}},Ua=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
57
  `);if(e===-1)return null;let t=this._buffer.toString(`utf8`,0,e).replace(/\r$/,``);return this._buffer=this._buffer.subarray(e+1),Wa(t)}clear(){this._buffer=void 0}};function Wa(e){return Se.parse(JSON.parse(e))}function Ga(e){return JSON.stringify(e)+`
58
- `}var Ka=class{constructor(e=et.stdin,t=et.stdout){this._stdin=e,this._stdout=t,this._readBuffer=new Ua,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=Ga(e);this._stdout.write(n)?t():this._stdout.once(`drain`,t)})}};function qa(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.createWebSocket??(e=>new WebSocket(e)),a=e.logger??null,o=e.log,s=null,c=null,l=!1,u=n;function d(e,t,n){try{a?a[e](t,n):o?.(t)}catch{}}function f(){if(l)return;c!==null&&t.clearTimeout(c);let e=u;u=Math.min(u*2,r),d(`debug`,`scheduling reconnect`,{backoffMs:e}),c=t.setTimeout(()=>{c=null,p().catch(e=>d(`warn`,`reconnect failed`,{error:String(e)}))},e)}async function p(){if(l)return;let t;try{t=await e.resolveWsUrl()}catch(e){d(`warn`,`resolveWsUrl threw`,{error:String(e)}),f();return}if(!t){f();return}let r=e.connectionId?`&connectionId=${encodeURIComponent(e.connectionId)}`:``,a=`${t}/collab/keepalive?pid=${process.pid}${r}`;try{s=i(a)}catch(e){d(`warn`,`WebSocket constructor failed`,{url:a,error:String(e)}),s=null,f();return}s.addEventListener(`open`,()=>{d(`info`,`connected`,{url:t}),u=n}),s.addEventListener(`close`,()=>{l||(d(`info`,`disconnected`,{url:t}),s=null,f())}),s.addEventListener(`error`,()=>{d(`debug`,`websocket error observed`,{url:t,readyState:s?.readyState,reason:`error-event`})})}return queueMicrotask(()=>{p().catch(e=>d(`warn`,`initial connect failed`,{error:String(e)}))}),{close:()=>{if(!l&&(l=!0,c!==null&&(t.clearTimeout(c),c=null),s)){try{s.close()}catch{}s=null}},isConnected:()=>s!==null&&s.readyState===1}}function Ja(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 Ya(e){if(e===void 0||e===``)return;let t=Number.parseInt(e,10);if(!(Number.isNaN(t)||t<=0))return t}function Xa(e){return e===`0.0.0.0`||e===`::`?`localhost`:e.includes(`:`)&&!e.startsWith(`[`)?`[${e}]`:e}function Za(e,t){return`http://${Xa(e)}:${t}/mcp`}function Qa(e,t){return`ws://${Xa(e)}:${t}`}function $a(e){let t=new URL(e);return t.protocol=t.protocol===`https:`?`wss:`:`ws:`,t.pathname=``,t.search=``,t.hash=``,t.toString().replace(/\/$/,``)}function eo(e,t){if(!(!e||e.port<=0)&&t(e.pid))return e.port}function to(e){return F(e)?I(e,`utf-8`).trim():``}function no(e,t){return`server did not start within ${e}ms${t?` stderr:\n${t}`:``}`}function ro(e){if(e&&typeof e==`object`&&`method`in e&&`id`in e)return e.id}function io(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 ao(e,t){return{jsonrpc:`2.0`,id:e,error:{code:-32e3,message:t instanceof Error?t.message:String(t)}}}async function oo(e){let t=e.readLock??(()=>le(e.lockDir)),n=e.isAlive??de,r=e.sleep??(e=>ut(e)),i=e.spawn??Ve,a=e.readErrorLog??to,o=e.openErrorLog??(e=>Ye(e,`w`)),s=e.closeFd??Ke,c=e.timeoutMs??5e3,l=e.pollIntervalMs??100;if(e.portOverride!==void 0){let t=Number.parseInt(e.portOverride,10);if(Number.isNaN(t)||t<=0)throw Error(`invalid --port value '${e.portOverride}' — HTTP MCP shim requires a positive port`);return Za(`localhost`,t)}let u=eo(t(),n);if(u!==void 0)return Za(`localhost`,u);if(e.envAutoStart===`0`)throw Error(`Open Knowledge server is not running and OK_MCP_AUTOSTART=0 disables auto-start.`);F(e.lockDir)||qe(e.lockDir,{recursive:!0});let d=N(e.lockDir,`last-spawn-error.log`),f=o(d),p,m,h=Ae();try{try{p=i(h.command,[...h.prefixArgs,`start`],{detached:!0,stdio:[`ignore`,`ignore`,f],cwd:e.contentDir,env:{...process.env,OK_LOCK_KIND:`mcp-spawned`}}),p.on(`error`,e=>{m=e instanceof Error?e.message:String(e)}),p.unref()}catch(e){m=e instanceof Error?e.message:String(e)}}finally{try{s(f)}catch{}}let g=Date.now()+c;for(;Date.now()<g;){if(m){let e=a(d),t=e?` stderr:\n${e}`:``;throw Error(`spawn failed: ${m}${t}`)}await r(l);let e=eo(t(),n);if(e!==void 0)return Za(`localhost`,e)}if(m){let e=a(d),t=e?` stderr:\n${e}`:``;throw Error(`spawn failed: ${m}${t}`)}throw Error(no(c,a(d)))}function so(e,t){if(e.portOverride!==void 0)return $a(t);let n=e.readLock??(()=>le(e.lockDir)),r=e.isAlive??de,i=eo(n(),r);if(i!==void 0)return Qa(`localhost`,i)}async function co(e,t={}){let n=t.stderr??process.stderr,r=t.requestTimeoutMs??12e4,i=t.createStdioTransport?t.createStdioTransport(t.stdin,t.stdout):new Ka(t.stdin,t.stdout),a=t.createHttpTransport?t.createHttpTransport(new URL(e)):new Ha(new URL(e),{fetch:Ja(r)}),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=ro(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(ao(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=io(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 lo(e){let t=e.stderr??process.stderr,n=e.bridgeFn??co,r=await oo(e),i=e.createConnectionId?.()??ct(),a=!1,o=(e.startKeepalive??qa)({connectionId:i,resolveWsUrl:async()=>so(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,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)}function uo(e,t){return t===void 0?!F(P(e,`.ok`)):!1}function fo(e){return new t(`mcp`).description(`Start MCP stdio server for project knowledge base`).option(`-p, --port <port>`,`Override port discovery and proxy to this HTTP MCP port`,void 0).action(async t=>{try{let n=e(),r=process.cwd();if(uo(r,t.port)){process.stderr.write(`[mcp] ${r} is not an Open Knowledge project (no .ok/); exiting. Run \`ok init\` to scaffold one.\n`),process.exitCode=1;return}let i=O(n,r),a=Ya(process.env.OK_MCP_SPAWN_TIMEOUT_MS);await lo({lockDir:_e(i),contentDir:i,portOverride:t.port,envAutoStart:process.env.OK_MCP_AUTOSTART,timeoutMs:a})}catch(e){process.stderr.write(`MCP server failed to start: ${e instanceof Error?e.message:String(e)}\n`),process.exitCode=1}})}function po(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-CN1rHXBb.mjs`),r=e(),i=process.cwd(),a=O(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 mo(e,t=Date.now()){let n=new Date(e).getTime();if(Number.isNaN(n))return`—`;let r=t-n,i=Math.floor(r/1e3);if(i<60)return`${i}s`;let a=Math.floor(i/60);if(a<60)return`${a}m ago`;let o=Math.floor(a/60);return o<24?`${o}h ago`:`${Math.floor(o/24)}d ago`}function ho(e,t,n,r,i,a){if(t.status===`missing`||t.status===`corrupt`)return null;let o=t.lock,s=null;if(n.status!==`missing`&&n.status!==`corrupt`){let e=n.lock;s={port:e.port,status:n.status,pid:e.pid,startedAt:e.startedAt,usage:a}}return{directory:o.worktreeRoot,server:{port:o.port,status:t.status,pid:o.pid,startedAt:o.startedAt,usage:i},ui:s,hostname:o.hostname,lockPath:t.lockPath,binary:r==null?null:ti(r),command:r}}function go(e){switch(e){case`alive`:return`running`;case`dead-pid`:return`stale`;case`foreign-host`:return`foreign`;default:return e}}function _o(e,t){switch(e){case`alive`:return W.default.green(t);case`dead-pid`:return W.default.yellow(t);case`foreign-host`:return W.default.cyan(t);default:return t}}function vo(e){return e==null?`—`:`${e.cpuPercent.toFixed(1)}% / ${e.memPercent.toFixed(1)}%`}function yo(e){return`${vo(e.server.usage)} | ${vo(e.ui?.usage??null)}`}function bo(e){return`${e.server.port===0?`(starting)`:String(e.server.port)} / ${e.ui==null||e.ui.status===`dead-pid`||e.ui.status===`foreign-host`?`—`:String(e.ui.port)}`}function xo(e){if(e.length===0)return`No open-knowledge servers found.`;let t=[`DIRECTORY`,`PORTS (API/UI)`,`CPU/MEM (API | UI)`,`STATUS`,`PID`,`STARTED`,`BINARY`],n=e.map(e=>[e.directory,bo(e),yo(e),go(e.server.status),String(e.server.pid),mo(e.server.startedAt),e.binary??`—`]),r=t.length,i=t.map(e=>e.length);for(let e of n)for(let t=0;t<r;t++)i[t]=Math.max(i[t]??0,(e[t]??``).length);let a=t.map((e,t)=>e.padEnd(i[t]??0)).join(` `).trimEnd(),o=e.map((e,t)=>{let a=n[t]??[],o=[];for(let t=0;t<r;t++){let n=(a[t]??``).padEnd(i[t]??0);if(t===3){let r=a[t]??``;n=_o(e.server.status,r)+` `.repeat(Math.max(0,(i[t]??0)-r.length))}o.push(n)}return o.join(` `).trimEnd()}),s=W.default.dim(`To stop a server: ok stop <port|pid|directory|all>`);return[a,...o,``,s].join(`
58
+ `}var Ka=class{constructor(e=et.stdin,t=et.stdout){this._stdin=e,this._stdout=t,this._readBuffer=new Ua,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=Ga(e);this._stdout.write(n)?t():this._stdout.once(`drain`,t)})}};function qa(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.createWebSocket??(e=>new WebSocket(e)),a=e.logger??null,o=e.log,s=null,c=null,l=!1,u=n;function d(e,t,n){try{a?a[e](t,n):o?.(t)}catch{}}function f(){if(l)return;c!==null&&t.clearTimeout(c);let e=u;u=Math.min(u*2,r),d(`debug`,`scheduling reconnect`,{backoffMs:e}),c=t.setTimeout(()=>{c=null,p().catch(e=>d(`warn`,`reconnect failed`,{error:String(e)}))},e)}async function p(){if(l)return;let t;try{t=await e.resolveWsUrl()}catch(e){d(`warn`,`resolveWsUrl threw`,{error:String(e)}),f();return}if(!t){f();return}let r=e.connectionId?`&connectionId=${encodeURIComponent(e.connectionId)}`:``,a=`${t}/collab/keepalive?pid=${process.pid}${r}`;try{s=i(a)}catch(e){d(`warn`,`WebSocket constructor failed`,{url:a,error:String(e)}),s=null,f();return}s.addEventListener(`open`,()=>{d(`info`,`connected`,{url:t}),u=n}),s.addEventListener(`close`,()=>{l||(d(`info`,`disconnected`,{url:t}),s=null,f())}),s.addEventListener(`error`,()=>{d(`debug`,`websocket error observed`,{url:t,readyState:s?.readyState,reason:`error-event`})})}return queueMicrotask(()=>{p().catch(e=>d(`warn`,`initial connect failed`,{error:String(e)}))}),{close:()=>{if(!l&&(l=!0,c!==null&&(t.clearTimeout(c),c=null),s)){try{s.close()}catch{}s=null}},isConnected:()=>s!==null&&s.readyState===1}}function Ja(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 Ya(e){if(e===void 0||e===``)return;let t=Number.parseInt(e,10);if(!(Number.isNaN(t)||t<=0))return t}function Xa(e){return e===`0.0.0.0`||e===`::`?`localhost`:e.includes(`:`)&&!e.startsWith(`[`)?`[${e}]`:e}function Za(e,t){return`http://${Xa(e)}:${t}/mcp`}function Qa(e,t){return`ws://${Xa(e)}:${t}`}function $a(e){let t=new URL(e);return t.protocol=t.protocol===`https:`?`wss:`:`ws:`,t.pathname=``,t.search=``,t.hash=``,t.toString().replace(/\/$/,``)}function eo(e,t){if(!(!e||e.port<=0)&&t(e.pid))return e.port}function to(e){return F(e)?I(e,`utf-8`).trim():``}function no(e,t){return`server did not start within ${e}ms${t?` stderr:\n${t}`:``}`}function ro(e){if(e&&typeof e==`object`&&`method`in e&&`id`in e)return e.id}function io(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 ao(e,t){return{jsonrpc:`2.0`,id:e,error:{code:-32e3,message:t instanceof Error?t.message:String(t)}}}async function oo(e){let t=e.readLock??(()=>le(e.lockDir)),n=e.isAlive??de,r=e.sleep??(e=>ut(e)),i=e.spawn??Ve,a=e.readErrorLog??to,o=e.openErrorLog??(e=>Ye(e,`w`)),s=e.closeFd??Ke,c=e.timeoutMs??5e3,l=e.pollIntervalMs??100;if(e.portOverride!==void 0){let t=Number.parseInt(e.portOverride,10);if(Number.isNaN(t)||t<=0)throw Error(`invalid --port value '${e.portOverride}' — HTTP MCP shim requires a positive port`);return Za(`localhost`,t)}let u=eo(t(),n);if(u!==void 0)return Za(`localhost`,u);if(e.envAutoStart===`0`)throw Error(`Open Knowledge server is not running and OK_MCP_AUTOSTART=0 disables auto-start.`);F(e.lockDir)||qe(e.lockDir,{recursive:!0});let d=N(e.lockDir,`last-spawn-error.log`),f=o(d),p,m,h=Ae();try{try{p=i(h.command,[...h.prefixArgs,`start`],{detached:!0,stdio:[`ignore`,`ignore`,f],cwd:e.contentDir,env:{...process.env,OK_LOCK_KIND:`mcp-spawned`}}),p.on(`error`,e=>{m=e instanceof Error?e.message:String(e)}),p.unref()}catch(e){m=e instanceof Error?e.message:String(e)}}finally{try{s(f)}catch{}}let g=Date.now()+c;for(;Date.now()<g;){if(m){let e=a(d),t=e?` stderr:\n${e}`:``;throw Error(`spawn failed: ${m}${t}`)}await r(l);let e=eo(t(),n);if(e!==void 0)return Za(`localhost`,e)}if(m){let e=a(d),t=e?` stderr:\n${e}`:``;throw Error(`spawn failed: ${m}${t}`)}throw Error(no(c,a(d)))}function so(e,t){if(e.portOverride!==void 0)return $a(t);let n=e.readLock??(()=>le(e.lockDir)),r=e.isAlive??de,i=eo(n(),r);if(i!==void 0)return Qa(`localhost`,i)}async function co(e,t={}){let n=t.stderr??process.stderr,r=t.requestTimeoutMs??12e4,i=t.createStdioTransport?t.createStdioTransport(t.stdin,t.stdout):new Ka(t.stdin,t.stdout),a=t.createHttpTransport?t.createHttpTransport(new URL(e)):new Ha(new URL(e),{fetch:Ja(r)}),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=ro(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(ao(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=io(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 lo(e){let t=e.stderr??process.stderr,n=e.bridgeFn??co,r=await oo(e),i=e.createConnectionId?.()??ct(),a=!1,o=(e.startKeepalive??qa)({connectionId:i,resolveWsUrl:async()=>so(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,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)}function uo(e,t){return t===void 0?!F(P(e,`.ok`)):!1}function fo(e){return new t(`mcp`).description(`Start MCP stdio server for project knowledge base`).option(`-p, --port <port>`,`Override port discovery and proxy to this HTTP MCP port`,void 0).action(async t=>{try{let n=e(),r=process.cwd();if(uo(r,t.port)){process.stderr.write(`[mcp] ${r} is not an Open Knowledge project (no .ok/); exiting. Run \`ok init\` to scaffold one.\n`),process.exitCode=1;return}let i=O(n,r),a=Ya(process.env.OK_MCP_SPAWN_TIMEOUT_MS);await lo({lockDir:_e(i),contentDir:i,portOverride:t.port,envAutoStart:process.env.OK_MCP_AUTOSTART,timeoutMs:a})}catch(e){process.stderr.write(`MCP server failed to start: ${e instanceof Error?e.message:String(e)}\n`),process.exitCode=1}})}function po(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-CGUMKfC0.mjs`),r=e(),i=process.cwd(),a=O(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 mo(e,t=Date.now()){let n=new Date(e).getTime();if(Number.isNaN(n))return`—`;let r=t-n,i=Math.floor(r/1e3);if(i<60)return`${i}s`;let a=Math.floor(i/60);if(a<60)return`${a}m ago`;let o=Math.floor(a/60);return o<24?`${o}h ago`:`${Math.floor(o/24)}d ago`}function ho(e,t,n,r,i,a){if(t.status===`missing`||t.status===`corrupt`)return null;let o=t.lock,s=null;if(n.status!==`missing`&&n.status!==`corrupt`){let e=n.lock;s={port:e.port,status:n.status,pid:e.pid,startedAt:e.startedAt,usage:a}}return{directory:o.worktreeRoot,server:{port:o.port,status:t.status,pid:o.pid,startedAt:o.startedAt,usage:i},ui:s,hostname:o.hostname,lockPath:t.lockPath,binary:r==null?null:ti(r),command:r}}function go(e){switch(e){case`alive`:return`running`;case`dead-pid`:return`stale`;case`foreign-host`:return`foreign`;default:return e}}function _o(e,t){switch(e){case`alive`:return W.default.green(t);case`dead-pid`:return W.default.yellow(t);case`foreign-host`:return W.default.cyan(t);default:return t}}function vo(e){return e==null?`—`:`${e.cpuPercent.toFixed(1)}% / ${e.memPercent.toFixed(1)}%`}function yo(e){return`${vo(e.server.usage)} | ${vo(e.ui?.usage??null)}`}function bo(e){return`${e.server.port===0?`(starting)`:String(e.server.port)} / ${e.ui==null||e.ui.status===`dead-pid`||e.ui.status===`foreign-host`?`—`:String(e.ui.port)}`}function xo(e){if(e.length===0)return`No open-knowledge servers found.`;let t=[`DIRECTORY`,`PORTS (API/UI)`,`CPU/MEM (API | UI)`,`STATUS`,`PID`,`STARTED`,`BINARY`],n=e.map(e=>[e.directory,bo(e),yo(e),go(e.server.status),String(e.server.pid),mo(e.server.startedAt),e.binary??`—`]),r=t.length,i=t.map(e=>e.length);for(let e of n)for(let t=0;t<r;t++)i[t]=Math.max(i[t]??0,(e[t]??``).length);let a=t.map((e,t)=>e.padEnd(i[t]??0)).join(` `).trimEnd(),o=e.map((e,t)=>{let a=n[t]??[],o=[];for(let t=0;t<r;t++){let n=(a[t]??``).padEnd(i[t]??0);if(t===3){let r=a[t]??``;n=_o(e.server.status,r)+` `.repeat(Math.max(0,(i[t]??0)-r.length))}o.push(n)}return o.join(` `).trimEnd()}),s=W.default.dim(`To stop a server: ok stop <port|pid|directory|all>`);return[a,...o,``,s].join(`
59
59
  `)}async function So(e={}){let t=e.discover??oi,n=e.inspect??H,r=e.log??(e=>console.log(e)),i=e.resolveCommand??ni,a=e.resolveUsage??ri,o=await t(),s=[];for(let e of o){let t=n(e,`server`),r=n(e,`ui`),o=ho(e,t,r,t.status===`missing`||t.status===`corrupt`?null:i(t.lock.pid),t.status===`missing`||t.status===`corrupt`?null:a(t.lock.pid),r.status===`missing`||r.status===`corrupt`?null:a(r.lock.pid));o!=null&&s.push(o)}if(e.json){r(JSON.stringify(s,null,2));return}r(xo(e.all?s.filter(e=>e.server.status===`alive`||e.server.status===`dead-pid`||e.server.status===`foreign-host`):s.filter(e=>e.server.status===`alive`)))}function Co(){return new t(`ps`).description(`List all running open-knowledge servers`).argument(`[modifier]`,`"all" to include stale/foreign entries`).option(`--all`,`Include stale (dead-pid) and foreign-host entries`).option(`--json`,`Emit structured JSON (always includes all statuses)`).action(async(e,t)=>{await So({all:t.all===!0||e===`all`,json:t.json===!0})})}function Z(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function wo(e,t,n=process.cwd()){let r=e.op??`sync`,i=le(D(O(t,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`},body:JSON.stringify({op:r})});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error??`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=fe({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
60
60
  `)),Z(e.json,{type:`complete`,op:r}),e.json||process.stderr.write(`✓ ${r} complete\n`)}function To(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 wo({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 Eo(e){return new t(`pull`).description(`Pull changes from the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await wo({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 Do(e){return new t(`push`).description(`Push commits to the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await wo({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)}})}async function Oo(e={}){let t=P(e.cwd??process.cwd()),n;try{n=await Te({projectDir:t,rootDir:e.root})}catch(e){return e instanceof ge?{status:`prerequisite-missing`,message:`${Re(`Error:`)} ${e.message}`,exitCode:1}:{status:`failed`,message:`${Re(`Error:`)} ${e instanceof Error?e.message:String(e)}`,exitCode:1}}if(n.created.length===0)return{status:`no-op`,message:`${A(`Your knowledge base is already seeded.`)}\n${k(`Nothing to do.`)}`,plan:n,exitCode:0};if(e.dryRun)return{status:`dry-run`,message:`${j(`Plan (dry-run — no changes made):`)}\n\n${ko(n,t)}`,plan:n,exitCode:0};if(!e.yes&&!await Ao(`${j(`Plan:`)}\n\n${ko(n,t)}\n\n${j(`Apply?`)} ${k(`[Y/n] `)}`,e.confirmStream))return{status:`cancelled`,message:k(`Cancelled.`),plan:n,exitCode:0};let r=await he(n,{projectDir:t});if(r.errors.length>0){let e=r.errors.map(e=>` ${Re(`✗`)} ${e.path}: ${e.error}`);return{status:`failed`,message:[`${ze(`Applied`)} ${r.applied} entries, ${ze(String(r.errors.length))} error(s):`,...e].join(`
61
61
  `),plan:n,exitCode:1}}return{status:`applied`,message:`${A(`✓ Seeded knowledge base`)} ${k(`(${r.applied} entries, ${r.durationMs}ms)`)}`,plan:n,exitCode:0}}function ko(e,t){let n=[],r=e.created.filter(e=>e.kind===`folder`),i=e.created.filter(e=>e.kind===`file`);if(r.length>0){n.push(j(`Folders to create:`));for(let e of r)n.push(` ${A(`+`)} ${Le(Ge(t,P(t,e.path))||e.path)}${k(`/`)}`)}if(i.length>0){n.length>0&&n.push(``),n.push(j(`Files to create:`));for(let e of i)n.push(` ${A(`+`)} ${Le(Ge(t,P(t,e.path))||e.path)}`)}if(e.skipped.length>0){n.length>0&&n.push(``),n.push(k(`Already present (skipped):`));for(let t of e.skipped)n.push(` ${k(`· ${t.path} (${t.reason})`)}`)}if(e.warnings.length>0){n.length>0&&n.push(``),n.push(ze(`Warnings:`));for(let t of e.warnings)n.push(` ${ze(`!`)} ${t}`)}return n.join(`
62
- `)}async function Ao(e,t){let n=pt({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 jo(){return new t(`seed`).description(`Scaffold the Karpathy three-layer knowledge-base structure (external-sources/, research/, articles/) + log.md + per-folder .ok/frontmatter.yml defaults. Use --root to place them inside a subfolder instead of the project root.`).argument(`[path]`,`Project directory (defaults to cwd)`).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(`-y, --yes`,`Skip confirmation prompt`).option(`--dry-run`,`Print the plan and exit without writing`).action(async(e,t)=>{let n=await Oo({cwd:e??process.cwd(),root:t.root,yes:t.yes,dryRun:t.dryRun});process.stdout.write(`${n.message}\n`),n.exitCode!==0&&(process.exitCode=n.exitCode)})}function Mo(e,t){return{server:No(`server`,e),ui:No(`ui`,t)}}function No(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 Po(e){return`${Fo(e.server)}\n${Fo(e.ui)}`}function Fo(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 Io(e){let t=e.inspect??(t=>H(e.lockDir,t)),n=e.log??(e=>console.log(e)),r=Mo(t(`server`),t(`ui`));return e.json?n(JSON.stringify(r,null,2)):n(Po(r)),r}function Lo(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=>{Io({lockDir:D(O(e(),process.cwd())),json:t.json===!0})})}function Ro(e,t){let n=[];return e.status===`alive`&&n.push({name:`server`,pid:e.lock.pid,port:e.lock.port}),t.status===`alive`&&n.push({name:`ui`,pid:t.lock.pid,port:t.lock.port}),{targets:n}}function zo(e){let t=e.inspect??(t=>H(e.lockDir,t)),n=e.kill??((e,t)=>process.kill(e,t)),r=e.log??(e=>console.log(e)),i=e.error??(e=>console.error(e)),a=Ro(t(`server`),t(`ui`));if(a.targets.length===0)return r(`No running open-knowledge processes.`),{stopped:[],failed:[],hadTargets:!1};let o=[],s=[];for(let e of a.targets)try{n(e.pid,`SIGTERM`),o.push(e)}catch(t){s.push({target:e,error:t instanceof Error?t.message:String(t)})}return o.length>0&&r(`Stopped: ${o.map(e=>`${e.name} (pid=${e.pid}, port=${e.port})`).join(`, `)}`),s.length>0&&i(`Failed to stop: ${s.map(({target:e,error:t})=>`${e.name} (pid=${e.pid}): ${t}`).join(`; `)}`),{stopped:o,failed:s,hadTargets:!0}}async function Bo(e){let t=await oi(),n=null;for(let r of t){let t=H(r,`server`),i=H(r,`ui`);if(t.status===`alive`&&t.lock.port===e||i.status===`alive`&&i.lock.port===e)return r;n===null&&(t.status===`alive`&&t.lock.pid===e||i.status===`alive`&&i.lock.pid===e)&&(n=r)}return n}function Vo(e){let t=zo({lockDir:e});return t.failed.length>0&&(process.exitCode=1),t}function Ho(e){return new t(`stop`).description(`Stop open-knowledge server(s). With no argument: stops the server for the current directory. Pass a port number, a directory path, or "all" to target globally.`).argument(`[target...]`,`port number, directory path (spaces OK), or "all"`).action(async t=>{let n=t.length===0?void 0:t.join(` `);if(n===void 0){let t=zo({lockDir:D(O(e(),process.cwd())),log:()=>{}});if(t.hadTargets){if(t.stopped.length>0){let e=t.stopped.map(e=>`${e.name} (pid=${e.pid}, port=${e.port})`).join(`, `);console.log(`Stopped: ${e}`)}t.failed.length>0&&(process.exitCode=1)}else await So({});return}if(n===`all`){let e=await oi();if(e.length===0){console.log(`No running open-knowledge servers found.`);return}let t=0;for(let n of e){let e=H(n,`server`),r=H(n,`ui`);e.status!==`alive`&&r.status!==`alive`||(Vo(n),t++)}t===0&&console.log(`No running open-knowledge servers found.`);return}if(/^\d+$/.test(n)){let e=Number.parseInt(n,10),t=await Bo(e);if(t===null){console.log(`No running open-knowledge server found with port or PID ${e}.`);return}Vo(t);return}Vo(D(n))})}const Uo=1e4;function Wo(e,t){let n=e.socket?.remoteAddress;if(n!==void 0&&!be(n))return Go(t,`loopback-required`),!0;if(!ye(e.headers.host))return Go(t,`host-header-not-allowed`),!0;let r=e.headers.origin;return r!==void 0&&!me(r)?(Go(t,`origin-not-allowed`),!0):!1}function Go(e,t){e.writeHead(403,{"Content-Type":`application/json`,"Cache-Control":`no-store`,"X-Content-Type-Options":`nosniff`}),e.end(JSON.stringify({ok:!1,error:t}))}const Ko=[`connection`,`keep-alive`,`proxy-authenticate`,`proxy-authorization`,`te`,`trailer`,`transfer-encoding`,`upgrade`,`cookie`,`set-cookie`];async function qo(e){let t=e.upstreamTimeoutMs??Uo,n=dt((n,r)=>{Wo(n,r)||Yo(n,r,e.upstreamHost,e.upstreamPort,t)});await new Promise((t,r)=>{let i=e=>r(e);n.once(`error`,i),n.listen(e.listenPort,e.host,()=>{n.off(`error`,i),t()})});let r=n.address();return{httpServer:n,port:typeof r==`object`&&r?r.port:e.listenPort,close:()=>new Promise(e=>{n.close(()=>e())})}}function Jo(e,t,n){Yo(e,t,n.upstreamHost,n.upstreamPort,n.upstreamTimeoutMs??Uo)}function Yo(e,t,n,r,i){let a={...e.headers};delete a.host;for(let e of Ko)delete a[e];e.setTimeout(3e4,()=>{if(t.headersSent)try{t.end()}catch{}else try{t.writeHead(408,{"Content-Type":`text/plain`}),t.end(`Request Timeout`)}catch{}try{e.socket?.destroy()}catch{}});let o=ft({host:n,port:r,method:e.method,path:e.url,headers:{...a,host:`${n}:${r}`}},e=>{let n={...e.headers};for(let e of Ko)delete n[e];t.writeHead(e.statusCode??502,n),e.pipe(t),e.once(`error`,()=>{try{t.end()}catch{}})});i>0&&o.setTimeout(i,()=>{if(!t.headersSent)t.writeHead(504,{"Content-Type":`text/plain`}),t.end(`Gateway Timeout`);else try{t.end()}catch{}o.destroy()}),o.on(`error`,()=>{if(!t.headersSent)t.writeHead(502,{"Content-Type":`text/plain`}),t.end(`Bad Gateway`);else try{t.end()}catch{}}),e.on(`error`,()=>{o.destroy()}),e.pipe(o)}async function Xo(e){await Promise.all(e.map(e=>new Promise(t=>{e.close(()=>t())})))}async function Zo(e){let{existsSync:t}=await import(`node:fs`),{createServer:n}=await import(`node:http`),{resolve:i}=await import(`node:path`),{acquireUiLock:a,createAssetServeMiddleware:o,createContentFilter:s,readServerLock:c,releaseUiLock:l,updateUiLockPort:u}=await import(`./dist-DXLSMgBY.mjs`),{default:f}=await import(`./build-B6buVrsB.mjs`),{resolveContentDir:m,resolveLockDir:h}=await import(`./dist-DXLSMgBY.mjs`),g=m(e.config,e.cwd),_=h(g);a(_,{port:0,worktreeRoot:e.cwd});let v=import.meta.dirname??new URL(`.`,import.meta.url).pathname,te=[i(v,`public`),i(v,`../../app/dist`),i(v,`../../../app/dist`)].find(e=>t(e)),y=te?f(te,{single:!0,gzip:!0,immutable:!0,extensions:[]}):null,b=t(g)?o({contentFilter:s({projectDir:e.cwd,contentDir:g}),contentSirv:f(g,{dotfiles:!1,dev:!0,extensions:[]}),inlineExtensions:r,assetExtensions:ee,blocklistExtensions:d}):null,ne=e.port,x=null,S=(e,t)=>{let n=e.url?.split(`?`)[0];if((n===`/`||n===``)&&(e.url=`/index.html`),!(n?.startsWith(`/api/`)&&Wo(e,t))){if(n===`/api/config`&&(e.method===`GET`||e.method===`HEAD`)){x?.();let n=c(_),r=n&&n.port>0?`ws://localhost:${n.port}/collab`:null,i=JSON.stringify({collabUrl:r,previewUrl:null,port:ne});t.setHeader(`Content-Type`,`application/json`),t.setHeader(`Cache-Control`,`no-store`),t.setHeader(`X-Content-Type-Options`,`nosniff`),t.statusCode=200,e.method===`HEAD`?t.end():t.end(i);return}if(n?.startsWith(`/api/`)){x?.();let r=c(_);if(!r||r.port<=0){t.writeHead(503,{"Content-Type":`application/json`,"Cache-Control":`no-store`}),t.end(JSON.stringify({error:"Collab server not running. Start `ok start` or run `ok status`.",path:n}));return}Jo(e,t,{upstreamHost:`localhost`,upstreamPort:r.port});return}if(b){b(e,t,()=>{y?y(e,t):Qo(t)});return}if(y){y(e,t);return}Qo(t)}},re=e.host===void 0?[`::1`,`127.0.0.1`]:[e.host],C=[],w=e.port;try{for(let e of re){let t=n(S);C.push(t),await new Promise((n,r)=>{let i=e=>r(e);t.once(`error`,i),t.listen(w,e,()=>{t.off(`error`,i);let e=t.address();typeof e==`object`&&e&&(w=e.port),n()})})}}catch(e){await Promise.all(C.map(e=>new Promise(t=>{try{e.close(()=>t())}catch{t()}})));try{l(_)}catch{}throw e}let ie=w;ne=ie,u(_,ie);let ae=e.scheduler??p,oe=e.safetyNetMs??432e5,T=null,E=!1,se=!1,ce=()=>{E||(E=!0,T!==null&&(ae.clearTimeout(T),T=null))},le=()=>{if(ce(),!se){se=!0;try{l(_)}catch{}}},ue=()=>{E||oe<=0||(T!==null&&(ae.clearTimeout(T),T=null),T=ae.setTimeout(()=>{T=null,console.warn(`[ui] safety-net (${oe}ms) reached — shutting down (D-025 backstop)`);try{e.onSafetyNet?.()}catch{}for(let e of C)try{e.close()}catch{}le()},oe))},de=()=>{E||oe<=0||ue()};return x=de,ue(),{httpServers:C,port:ie,release:le,detachSafetyNet:ce,nudgeSafetyNet:de}}function Qo(e){e.writeHead(404),e.end(`Not found`)}function $o(e,t){if(e!==void 0){let t=Number.parseInt(e,10);if(Number.isNaN(t)||t<0||t>65535)throw Error(`Invalid --port value '${e}'`);return t}if(t!==void 0&&t!==``){let e=Number.parseInt(t,10);if(Number.isNaN(e)||e<0||e>65535)throw Error(`Invalid PORT env value '${t}'`);return e}return 0}async function es(e){let t=e.readLock??(async()=>{let{readUiLock:t}=await import(`./dist-DXLSMgBY.mjs`);return t(e.lockDir)}),n=await t();if(!n)throw Error(`UI lock collision reported but the lock disappeared before handling — retry acquiring.`);if(n.port===e.requestedPort&&n.port>0)return{mode:`already-running`,port:n.port};let r=n.port;if(r===0){let n=Date.now()+(e.pollDeadlineMs??2e3),i=e.pollIntervalMs??100;for(;Date.now()<n;){await new Promise(e=>{setTimeout(e,i)});let e=await t();if(e&&e.port>0){r=e.port;break}}if(r===0)throw Error("UI did not bind within 2s; run `ok clean`");if(r===e.requestedPort)return{mode:`already-running`,port:r}}return{mode:`proxy`,handle:await qo({listenPort:e.requestedPort,host:e.host,upstreamHost:`localhost`,upstreamPort:r}),upstreamPort:r}}function ts(e){return new t(`ui`).description(`Serve the Open Knowledge React editor UI`).option(`-p, --port <port>`,`UI port (default: $PORT env or 0 / kernel-allocated)`).option(`-H, --host <host>`,"UI host. Default: two-socket loopback bind (`[::1]` + `127.0.0.1`) so cross-family collisions fail loud (D-033). Pass an explicit host (e.g. `127.0.0.1`, `0.0.0.0`) to bind a single socket on that host.").action(async t=>{let{dim:n}=await import(`./colors-T3xmlXQT.mjs`),{UiLockCollisionError:r}=await import(`./dist-DXLSMgBY.mjs`),{resolveContentDir:i,resolveLockDir:a}=await import(`./dist-DXLSMgBY.mjs`),o=e(),s=t.host,c;try{c=$o(t.port,process.env.PORT)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exitCode=1;return}try{let e=await Zo({config:o,cwd:process.cwd(),port:c,host:s}),t=s===void 0||s===`::`||s===`0.0.0.0`?`localhost`:s;console.log(`${n(`[ui]`)} listening on http://${t}:${e.port}`);let r=!1,i=t=>{if(r)return;r=!0,console.log(n(`\n[ui] Shutting down (${t})...`)),e.detachSafetyNet();let i=()=>{try{e.release()}finally{process.exit(process.exitCode??0)}};Xo(e.httpServers).then(i,i),setTimeout(i,2e3).unref()};process.once(`SIGINT`,()=>i(`SIGINT`)),process.once(`SIGTERM`,()=>i(`SIGTERM`));return}catch(e){if(!(e instanceof r))throw e;let t=a(i(o,process.cwd())),l=s??`localhost`,u;try{u=await es({requestedPort:c,host:l,lockDir:t})}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}u.mode===`already-running`&&(console.log(`UI already running at http://${l}:${u.port}`),process.exit(0)),console.log(`UI running at http://${l}:${u.upstreamPort}; acting as HTTP proxy on port ${u.handle.port}`);let d=!1,f=e=>{d||(d=!0,console.log(n(`\n[ui-proxy] Shutting down (${e})...`)),u.handle.close().finally(()=>process.exit(process.exitCode??0)),setTimeout(()=>process.exit(process.exitCode??0),2e3).unref())};process.once(`SIGINT`,()=>f(`SIGINT`)),process.once(`SIGTERM`,()=>f(`SIGTERM`))}})}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 $;Q.name(`open-knowledge`).description(`Local-first knowledge base with CRDT collaboration`).version(Oe).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}=ke(t);$=n}),Q.action(async()=>{if(Pe(je()).available){Ne({spawn:Ve});return}await Fe($,{})});const ns=Me(()=>$);Q.addCommand(ns);const rs=fo(()=>$);Q.addCommand(rs),Q.addCommand(oe()),Q.addCommand(jo()),Q.addCommand(Ci());const is=po(()=>$);Q.addCommand(is);const as=ts(()=>$);Q.addCommand(as),Q.addCommand(Ho(()=>$)),Q.addCommand(Nr(()=>$)),Q.addCommand(Lo(()=>$)),Q.addCommand(Co()),Q.addCommand(hi()),Q.addCommand(Yr()),Q.addCommand(Ar()),Q.addCommand(Hr(()=>$)),Q.addCommand(To(()=>$)),Q.addCommand(Do(()=>$)),Q.addCommand(Eo(()=>$)),await Q.parseAsync();export{};
62
+ `)}async function Ao(e,t){let n=pt({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 jo(){return new t(`seed`).description(`Scaffold the Karpathy three-layer knowledge-base structure (external-sources/, research/, articles/) + log.md + per-folder .ok/frontmatter.yml defaults. Use --root to place them inside a subfolder instead of the project root.`).argument(`[path]`,`Project directory (defaults to cwd)`).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(`-y, --yes`,`Skip confirmation prompt`).option(`--dry-run`,`Print the plan and exit without writing`).action(async(e,t)=>{let n=await Oo({cwd:e??process.cwd(),root:t.root,yes:t.yes,dryRun:t.dryRun});process.stdout.write(`${n.message}\n`),n.exitCode!==0&&(process.exitCode=n.exitCode)})}function Mo(e,t){return{server:No(`server`,e),ui:No(`ui`,t)}}function No(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 Po(e){return`${Fo(e.server)}\n${Fo(e.ui)}`}function Fo(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 Io(e){let t=e.inspect??(t=>H(e.lockDir,t)),n=e.log??(e=>console.log(e)),r=Mo(t(`server`),t(`ui`));return e.json?n(JSON.stringify(r,null,2)):n(Po(r)),r}function Lo(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=>{Io({lockDir:D(O(e(),process.cwd())),json:t.json===!0})})}function Ro(e,t){let n=[];return e.status===`alive`&&n.push({name:`server`,pid:e.lock.pid,port:e.lock.port}),t.status===`alive`&&n.push({name:`ui`,pid:t.lock.pid,port:t.lock.port}),{targets:n}}function zo(e){let t=e.inspect??(t=>H(e.lockDir,t)),n=e.kill??((e,t)=>process.kill(e,t)),r=e.log??(e=>console.log(e)),i=e.error??(e=>console.error(e)),a=Ro(t(`server`),t(`ui`));if(a.targets.length===0)return r(`No running open-knowledge processes.`),{stopped:[],failed:[],hadTargets:!1};let o=[],s=[];for(let e of a.targets)try{n(e.pid,`SIGTERM`),o.push(e)}catch(t){s.push({target:e,error:t instanceof Error?t.message:String(t)})}return o.length>0&&r(`Stopped: ${o.map(e=>`${e.name} (pid=${e.pid}, port=${e.port})`).join(`, `)}`),s.length>0&&i(`Failed to stop: ${s.map(({target:e,error:t})=>`${e.name} (pid=${e.pid}): ${t}`).join(`; `)}`),{stopped:o,failed:s,hadTargets:!0}}async function Bo(e){let t=await oi(),n=null;for(let r of t){let t=H(r,`server`),i=H(r,`ui`);if(t.status===`alive`&&t.lock.port===e||i.status===`alive`&&i.lock.port===e)return r;n===null&&(t.status===`alive`&&t.lock.pid===e||i.status===`alive`&&i.lock.pid===e)&&(n=r)}return n}function Vo(e){let t=zo({lockDir:e});return t.failed.length>0&&(process.exitCode=1),t}function Ho(e){return new t(`stop`).description(`Stop open-knowledge server(s). With no argument: stops the server for the current directory. Pass a port number, a directory path, or "all" to target globally.`).argument(`[target...]`,`port number, directory path (spaces OK), or "all"`).action(async t=>{let n=t.length===0?void 0:t.join(` `);if(n===void 0){let t=zo({lockDir:D(O(e(),process.cwd())),log:()=>{}});if(t.hadTargets){if(t.stopped.length>0){let e=t.stopped.map(e=>`${e.name} (pid=${e.pid}, port=${e.port})`).join(`, `);console.log(`Stopped: ${e}`)}t.failed.length>0&&(process.exitCode=1)}else await So({});return}if(n===`all`){let e=await oi();if(e.length===0){console.log(`No running open-knowledge servers found.`);return}let t=0;for(let n of e){let e=H(n,`server`),r=H(n,`ui`);e.status!==`alive`&&r.status!==`alive`||(Vo(n),t++)}t===0&&console.log(`No running open-knowledge servers found.`);return}if(/^\d+$/.test(n)){let e=Number.parseInt(n,10),t=await Bo(e);if(t===null){console.log(`No running open-knowledge server found with port or PID ${e}.`);return}Vo(t);return}Vo(D(n))})}const Uo=1e4;function Wo(e,t){let n=e.socket?.remoteAddress;if(n!==void 0&&!be(n))return Go(t,`loopback-required`),!0;if(!ye(e.headers.host))return Go(t,`host-header-not-allowed`),!0;let r=e.headers.origin;return r!==void 0&&!me(r)?(Go(t,`origin-not-allowed`),!0):!1}function Go(e,t){e.writeHead(403,{"Content-Type":`application/json`,"Cache-Control":`no-store`,"X-Content-Type-Options":`nosniff`}),e.end(JSON.stringify({ok:!1,error:t}))}const Ko=[`connection`,`keep-alive`,`proxy-authenticate`,`proxy-authorization`,`te`,`trailer`,`transfer-encoding`,`upgrade`,`cookie`,`set-cookie`];async function qo(e){let t=e.upstreamTimeoutMs??Uo,n=dt((n,r)=>{Wo(n,r)||Yo(n,r,e.upstreamHost,e.upstreamPort,t)});await new Promise((t,r)=>{let i=e=>r(e);n.once(`error`,i),n.listen(e.listenPort,e.host,()=>{n.off(`error`,i),t()})});let r=n.address();return{httpServer:n,port:typeof r==`object`&&r?r.port:e.listenPort,close:()=>new Promise(e=>{n.close(()=>e())})}}function Jo(e,t,n){Yo(e,t,n.upstreamHost,n.upstreamPort,n.upstreamTimeoutMs??Uo)}function Yo(e,t,n,r,i){let a={...e.headers};delete a.host;for(let e of Ko)delete a[e];e.setTimeout(3e4,()=>{if(t.headersSent)try{t.end()}catch{}else try{t.writeHead(408,{"Content-Type":`text/plain`}),t.end(`Request Timeout`)}catch{}try{e.socket?.destroy()}catch{}});let o=ft({host:n,port:r,method:e.method,path:e.url,headers:{...a,host:`${n}:${r}`}},e=>{let n={...e.headers};for(let e of Ko)delete n[e];t.writeHead(e.statusCode??502,n),e.pipe(t),e.once(`error`,()=>{try{t.end()}catch{}})});i>0&&o.setTimeout(i,()=>{if(!t.headersSent)t.writeHead(504,{"Content-Type":`text/plain`}),t.end(`Gateway Timeout`);else try{t.end()}catch{}o.destroy()}),o.on(`error`,()=>{if(!t.headersSent)t.writeHead(502,{"Content-Type":`text/plain`}),t.end(`Bad Gateway`);else try{t.end()}catch{}}),e.on(`error`,()=>{o.destroy()}),e.pipe(o)}async function Xo(e){await Promise.all(e.map(e=>new Promise(t=>{e.close(()=>t())})))}async function Zo(e){let{existsSync:t}=await import(`node:fs`),{createServer:n}=await import(`node:http`),{resolve:i}=await import(`node:path`),{acquireUiLock:a,createAssetServeMiddleware:o,createContentFilter:s,readServerLock:c,releaseUiLock:l,updateUiLockPort:u}=await import(`./dist-BToVkFhc.mjs`),{default:f}=await import(`./build-B6buVrsB.mjs`),{resolveContentDir:m,resolveLockDir:h}=await import(`./dist-BToVkFhc.mjs`),g=m(e.config,e.cwd),_=h(g);a(_,{port:0,worktreeRoot:e.cwd});let v=import.meta.dirname??new URL(`.`,import.meta.url).pathname,te=[i(v,`public`),i(v,`../../app/dist`),i(v,`../../../app/dist`)].find(e=>t(e)),y=te?f(te,{single:!0,gzip:!0,immutable:!0,extensions:[]}):null,b=t(g)?o({contentFilter:s({projectDir:e.cwd,contentDir:g}),contentSirv:f(g,{dotfiles:!1,dev:!0,extensions:[]}),inlineExtensions:r,assetExtensions:ee,blocklistExtensions:d}):null,ne=e.port,x=null,S=(e,t)=>{let n=e.url?.split(`?`)[0];if((n===`/`||n===``)&&(e.url=`/index.html`),!(n?.startsWith(`/api/`)&&Wo(e,t))){if(n===`/api/config`&&(e.method===`GET`||e.method===`HEAD`)){x?.();let n=c(_),r=n&&n.port>0?`ws://localhost:${n.port}/collab`:null,i=JSON.stringify({collabUrl:r,previewUrl:null,port:ne});t.setHeader(`Content-Type`,`application/json`),t.setHeader(`Cache-Control`,`no-store`),t.setHeader(`X-Content-Type-Options`,`nosniff`),t.statusCode=200,e.method===`HEAD`?t.end():t.end(i);return}if(n?.startsWith(`/api/`)){x?.();let r=c(_);if(!r||r.port<=0){t.writeHead(503,{"Content-Type":`application/json`,"Cache-Control":`no-store`}),t.end(JSON.stringify({error:"Collab server not running. Start `ok start` or run `ok status`.",path:n}));return}Jo(e,t,{upstreamHost:`localhost`,upstreamPort:r.port});return}if(b){b(e,t,()=>{y?y(e,t):Qo(t)});return}if(y){y(e,t);return}Qo(t)}},re=e.host===void 0?[`::1`,`127.0.0.1`]:[e.host],C=[],w=e.port;try{for(let e of re){let t=n(S);C.push(t),await new Promise((n,r)=>{let i=e=>r(e);t.once(`error`,i),t.listen(w,e,()=>{t.off(`error`,i);let e=t.address();typeof e==`object`&&e&&(w=e.port),n()})})}}catch(e){await Promise.all(C.map(e=>new Promise(t=>{try{e.close(()=>t())}catch{t()}})));try{l(_)}catch{}throw e}let ie=w;ne=ie,u(_,ie);let ae=e.scheduler??p,oe=e.safetyNetMs??432e5,T=null,E=!1,se=!1,ce=()=>{E||(E=!0,T!==null&&(ae.clearTimeout(T),T=null))},le=()=>{if(ce(),!se){se=!0;try{l(_)}catch{}}},ue=()=>{E||oe<=0||(T!==null&&(ae.clearTimeout(T),T=null),T=ae.setTimeout(()=>{T=null,console.warn(`[ui] safety-net (${oe}ms) reached — shutting down (D-025 backstop)`);try{e.onSafetyNet?.()}catch{}for(let e of C)try{e.close()}catch{}le()},oe))},de=()=>{E||oe<=0||ue()};return x=de,ue(),{httpServers:C,port:ie,release:le,detachSafetyNet:ce,nudgeSafetyNet:de}}function Qo(e){e.writeHead(404),e.end(`Not found`)}function $o(e,t){if(e!==void 0){let t=Number.parseInt(e,10);if(Number.isNaN(t)||t<0||t>65535)throw Error(`Invalid --port value '${e}'`);return t}if(t!==void 0&&t!==``){let e=Number.parseInt(t,10);if(Number.isNaN(e)||e<0||e>65535)throw Error(`Invalid PORT env value '${t}'`);return e}return 0}async function es(e){let t=e.readLock??(async()=>{let{readUiLock:t}=await import(`./dist-BToVkFhc.mjs`);return t(e.lockDir)}),n=await t();if(!n)throw Error(`UI lock collision reported but the lock disappeared before handling — retry acquiring.`);if(n.port===e.requestedPort&&n.port>0)return{mode:`already-running`,port:n.port};let r=n.port;if(r===0){let n=Date.now()+(e.pollDeadlineMs??2e3),i=e.pollIntervalMs??100;for(;Date.now()<n;){await new Promise(e=>{setTimeout(e,i)});let e=await t();if(e&&e.port>0){r=e.port;break}}if(r===0)throw Error("UI did not bind within 2s; run `ok clean`");if(r===e.requestedPort)return{mode:`already-running`,port:r}}return{mode:`proxy`,handle:await qo({listenPort:e.requestedPort,host:e.host,upstreamHost:`localhost`,upstreamPort:r}),upstreamPort:r}}function ts(e){return new t(`ui`).description(`Serve the Open Knowledge React editor UI`).option(`-p, --port <port>`,`UI port (default: $PORT env or 0 / kernel-allocated)`).option(`-H, --host <host>`,"UI host. Default: two-socket loopback bind (`[::1]` + `127.0.0.1`) so cross-family collisions fail loud (D-033). Pass an explicit host (e.g. `127.0.0.1`, `0.0.0.0`) to bind a single socket on that host.").action(async t=>{let{dim:n}=await import(`./colors-T3xmlXQT.mjs`),{UiLockCollisionError:r}=await import(`./dist-BToVkFhc.mjs`),{resolveContentDir:i,resolveLockDir:a}=await import(`./dist-BToVkFhc.mjs`),o=e(),s=t.host,c;try{c=$o(t.port,process.env.PORT)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exitCode=1;return}try{let e=await Zo({config:o,cwd:process.cwd(),port:c,host:s}),t=s===void 0||s===`::`||s===`0.0.0.0`?`localhost`:s;console.log(`${n(`[ui]`)} listening on http://${t}:${e.port}`);let r=!1,i=t=>{if(r)return;r=!0,console.log(n(`\n[ui] Shutting down (${t})...`)),e.detachSafetyNet();let i=()=>{try{e.release()}finally{process.exit(process.exitCode??0)}};Xo(e.httpServers).then(i,i),setTimeout(i,2e3).unref()};process.once(`SIGINT`,()=>i(`SIGINT`)),process.once(`SIGTERM`,()=>i(`SIGTERM`));return}catch(e){if(!(e instanceof r))throw e;let t=a(i(o,process.cwd())),l=s??`localhost`,u;try{u=await es({requestedPort:c,host:l,lockDir:t})}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}u.mode===`already-running`&&(console.log(`UI already running at http://${l}:${u.port}`),process.exit(0)),console.log(`UI running at http://${l}:${u.upstreamPort}; acting as HTTP proxy on port ${u.handle.port}`);let d=!1,f=e=>{d||(d=!0,console.log(n(`\n[ui-proxy] Shutting down (${e})...`)),u.handle.close().finally(()=>process.exit(process.exitCode??0)),setTimeout(()=>process.exit(process.exitCode??0),2e3).unref())};process.once(`SIGINT`,()=>f(`SIGINT`)),process.once(`SIGTERM`,()=>f(`SIGTERM`))}})}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 $;Q.name(`open-knowledge`).description(`Local-first knowledge base with CRDT collaboration`).version(Oe).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}=ke(t);$=n}),Q.action(async()=>{if(Pe(je()).available){Ne({spawn:Ve});return}await Fe($,{})});const ns=Me(()=>$);Q.addCommand(ns);const rs=fo(()=>$);Q.addCommand(rs),Q.addCommand(oe()),Q.addCommand(jo()),Q.addCommand(Ci());const is=po(()=>$);Q.addCommand(is);const as=ts(()=>$);Q.addCommand(as),Q.addCommand(Ho(()=>$)),Q.addCommand(Nr(()=>$)),Q.addCommand(Lo(()=>$)),Q.addCommand(Co()),Q.addCommand(hi()),Q.addCommand(Yr()),Q.addCommand(Ar()),Q.addCommand(Hr(()=>$)),Q.addCommand(To(()=>$)),Q.addCommand(Do(()=>$)),Q.addCommand(Eo(()=>$)),await Q.parseAsync();export{};
63
63
  //# sourceMappingURL=cli.mjs.map
@@ -0,0 +1,2 @@
1
+ import"./dist-DVM7wH81.mjs";var e=`0.4.0-beta.9`;const t=`config.yml`,n=e;export{n,t};
2
+ //# sourceMappingURL=constants-CswmjLU5.mjs.map
@@ -1 +1 @@
1
- import{D as e,F as t,Q as n,T as r,X as i,k as a,m as o}from"./dist-DVM7wH81.mjs";import{_ as s,a as c,c as l,d as u,f as d,g as f,i as p,l as m,m as h,n as g,o as _,p as v,r as y,s as b,t as x,u as S}from"./server-lock-D7DXNVql-BRVVzA6T.mjs";import{$ as C,$t as w,A as T,An as E,At as D,B as O,Bn as k,Bt as A,C as j,Cn as M,Ct as N,D as P,Dn as F,Dt as I,E as L,En as R,Et as z,F as B,Fn as V,Ft as H,G as U,Gn as W,Gt as G,H as K,Hn as q,Ht as J,I as Y,In as X,It as Z,J as Q,Jn as $,Jt as ee,K as te,Kn as ne,Kt as re,L as ie,Ln as ae,Lt as oe,M as se,Mn as ce,Mt as le,N as ue,Nn as de,Nt as fe,O as pe,On as me,Ot as he,P as ge,Pn as _e,Pt as ve,Q as ye,Qt as be,R as xe,Rn as Se,Rt as Ce,S as we,Sn as Te,St as Ee,T as De,Tn as Oe,Tt as ke,U as Ae,Un as je,Ut as Me,V as Ne,Vn as Pe,Vt as Fe,W as Ie,Wn as Le,Wt as Re,X as ze,Xn as Be,Xt as Ve,Y as He,Yn as Ue,Yt as We,Z as Ge,Zt as Ke,_ as qe,_n as Je,_t as Ye,a as Xe,an as Ze,ar as Qe,at as $e,b as et,bn as tt,bt as nt,c as rt,cn as it,ct as at,d as ot,dn as st,dt as ct,en as lt,et as ut,f as dt,fn as ft,ft as pt,g as mt,gn as ht,gt,h as _t,hn as vt,ht as yt,i as bt,in as xt,it as St,j as Ct,jn as wt,jt as Tt,k as Et,kn as Dt,kt as Ot,l as kt,ln as At,lt as jt,m as Mt,mn as Nt,mt as Pt,n as Ft,nn as It,nt as Lt,o as Rt,on as zt,or as Bt,ot as Vt,p as Ht,pn as Ut,pt as Wt,q as Gt,qn as Kt,qt,r as Jt,rn as Yt,rt as Xt,s as Zt,sn as Qt,st as $t,t as en,tn,tt as nn,u as rn,un as an,ut as on,v as sn,vn as cn,vt as ln,w as un,wn as dn,wt as fn,x as pn,xn as mn,xt as hn,y as gn,yn as _n,yt as vn,z as yn,zn as bn,zt as xn}from"./dist-B6pNPboH.mjs";export{en as AGENT_ID_MAX_LEN,Ft as AGENT_ID_RE,Jt as AGENT_WRITE_ORIGIN,bt as AgentFocusBroadcaster,Xe as AgentPresenceBroadcaster,Rt as AgentSessionCapacityError,Zt as AgentSessionManager,rt as BacklinkIndex,kt as CC1Broadcaster,o as CC1_CONTRACT_VERSION,rn as CONFLICT_MARKER_RE,ot as ConfigSchema,dt as DEFAULT_CHECKPOINT_RETENTION,Ht as FILE_SYSTEM_WRITER,Mt as FILE_WATCHER_ORIGIN,_t as GIT_UPSTREAM_WRITER,Qe as GitDirAccessError,mt as HOCUSPOCUS_AUTH_REJECTION_REASONS,qe as HocuspocusAuthRejection,sn as HocuspocusAuthTokenSchema,gn as LIVE_DERIVED_INDEX_DEBOUNCE_MS,et as LOG_MD_TEMPLATE,pn as MANAGED_RENAME_ORIGIN,we as MAX_AGENT_SESSIONS,j as MCP_SERVER_NAME,un as MISSING_OK_CONFIG_MESSAGE,Bt as MalformedGitPointerError,De as McpLogger,L as MissingOkConfigError,P as OBSERVER_SYNC_ORIGIN,r as ORPHAN_MODES,pe as PinoLogger,x as ProcessLockCollisionError,Et as ProjectGitInitError,T as ROLLBACK_ORIGIN,g as RUNTIME_VERSION,Ct as SERVICE_WRITER,se as SKILL_INSTALL_EVENTS_FILE_REL,e as SKILL_STATE_TARGETS,ue as STARTER_FOLDERS,ge as STARTER_FOLDER_FRONTMATTER_FILENAME,B as STARTER_TEMPLATES,Y as STATE_MANIFEST_FILENAME,y as STATE_SCHEMA_VERSION,a as SYSTEM_DOC_NAME,ie as SeedPrerequisiteError,xe as SeedRootDirError,p as ServerLockCollisionError,yn as StateManifestError,O as TagIndex,Ne as UiLockCollisionError,c as acquireProcessLock,_ as acquireServerLock,K as acquireUiLock,Ae as applyAgentMarkdownWrite,Ie as applyExternalChange,U as applySeed,te as assertCompatibleStateManifest,Gt as assertNeverDiskEvent,Q as attachIdleShutdown,He as bootServer,ze as buildAndOpenSkill,Ge as buildExecResult,ye as buildReadResult,C as buildSkillZip,ut as buildStarterFolderFrontmatterYaml,nn as buildWipTree,Lt as classifyEvents,Xt as clearContributors,t as colorFromSeed,St as commitUpstreamImport,$e as commitWip,Vt as commitWipFromTree,$t as containsConflictMarkers,at as contentHash,jt as contributorCount,on as createApiExtension,ct as createAssetServeMiddleware,pt as createContentFilter,Wt as createExternalChangeHandler,Pt as createLiveDerivedIndexExtension,yt as createMcpHttpHandler,gt as createPersistenceExtension,Ye as createServer,ln as createServerObserverExtension,vn as createTestLogger,nt as detectClaudeDesktopPresence,hn as detectProjectShape,Ee as ensureProjectGit,N as evictStaleTrackerEntries,fn as extractWikiLinksFromMarkdown,ke as formatContributors,z as gcCheckpointRefs,I as getCurrentMcpLogger,he as getLocalDir,Ot as getLogger,D as getMeter,Tt as getMetrics,le as getTracer,fe as handleCollabSocketError,i as iconFromClientName,ve as incrementCollabSocketFilteredError,H as incrementServerObserverFire,Z as initShadowRepo,oe as initTelemetry,Ce as installTestLoggers,xn as installUserSkill,A as isAllowedApiOrigin,Fe as isAllowedWorkspaceHostHeader,J as isConfigDoc,Me as isHocuspocusAuthRejectionReason,Re as isLoopbackAddress,n as isOrphanMode,G as isPairedWriteOrigin,b as isProcessAlive,re as isSelfWrite,qt as isSystemDoc,l as isValidLockPid,ee as lastKnownHash,We as listRescueCheckpoints,Ve as loadPrincipal,m as lockFilePath,Ke as loggerFactory,be as mountMcpAndApi,w as parseHocuspocusAuthToken,lt as parseKeepaliveConnectionId,tn as pathToDocName,It as planSeed,Yt as readAllTargets,xt as readBranchFromHead,S as readProcessLock,u as readProcessLockDetailed,d as readServerLock,Ze as readServerPackageVersion,zt as readSkillInstallStateSnapshot,Qt as readStateManifest,it as readTargetRecordedAt,At as readTargetVersion,an as readUiLock,st as reconcile,ft as recordContributor,Ut as recordSkillInstallEvent,Nt as registerWrite,v as releaseProcessLock,h as releaseServerLock,vt as releaseUiLock,ht as removeLastKnownHash,Je as resetMetrics,cn as resolveBundledSkillDir,_n as resolveContentDir,tt as resolveLockDir,mn as resolvePackageVersion,Te as rewriteMarkdownLinksForDocumentRename,M as rewriteWikiLinksForDocumentRename,dn as runAuthReposSubprocess,Oe as runAuthStatusSubprocess,R as runCloneSubprocess,F as runDeviceFlowSubprocess,me as runWithMcpLogger,Dt as safeContentPath,E as safeSubdir,wt as safetyCheckpoint,ce as saveInMemoryCheckpoint,de as saveVersion,_e as seedBasenameIndex,V as setActiveSpanAttributes,X as shadowGit,ae as shutdownTelemetry,Se as splitMarkdownBlocks,bn as startWatcher,k as toBroadcasterKey,Pe as updateLastKnownHash,f as updateProcessLockPort,s as updateServerLockPort,q as updateUiLockPort,je as validateAgentId,Le as validateCloneInputs,W as validateSkillZip,ne as withSpan,Kt as withSpanSync,$ as writeStateManifest,Ue as writeTargetVersion,Be as writeTracker};
1
+ import{D as e,F as t,Q as n,T as r,X as i,k as a,m as o}from"./dist-DVM7wH81.mjs";import{_ as s,a as c,c as l,d as u,f as d,g as f,i as p,l as m,m as h,n as g,o as _,p as v,r as y,s as b,t as x,u as S}from"./server-lock-D7DXNVql-BRVVzA6T.mjs";import{$ as C,$t as w,A as T,An as E,At as D,B as O,Bn as k,Bt as A,C as j,Cn as M,Ct as N,D as P,Dn as F,Dt as I,E as L,En as R,Et as z,F as B,Fn as V,Ft as H,G as U,Gn as W,Gt as G,H as K,Hn as q,Ht as J,I as Y,In as X,It as Z,J as Q,Jn as $,Jt as ee,K as te,Kn as ne,Kt as re,L as ie,Ln as ae,Lt as oe,M as se,Mn as ce,Mt as le,N as ue,Nn as de,Nt as fe,O as pe,On as me,Ot as he,P as ge,Pn as _e,Pt as ve,Q as ye,Qt as be,R as xe,Rn as Se,Rt as Ce,S as we,Sn as Te,St as Ee,T as De,Tn as Oe,Tt as ke,U as Ae,Un as je,Ut as Me,V as Ne,Vn as Pe,Vt as Fe,W as Ie,Wn as Le,Wt as Re,X as ze,Xn as Be,Xt as Ve,Y as He,Yn as Ue,Yt as We,Z as Ge,Zt as Ke,_ as qe,_n as Je,_t as Ye,a as Xe,an as Ze,ar as Qe,at as $e,b as et,bn as tt,bt as nt,c as rt,cn as it,ct as at,d as ot,dn as st,dt as ct,en as lt,et as ut,f as dt,fn as ft,ft as pt,g as mt,gn as ht,gt,h as _t,hn as vt,ht as yt,i as bt,in as xt,it as St,j as Ct,jn as wt,jt as Tt,k as Et,kn as Dt,kt as Ot,l as kt,ln as At,lt as jt,m as Mt,mn as Nt,mt as Pt,n as Ft,nn as It,nt as Lt,o as Rt,on as zt,or as Bt,ot as Vt,p as Ht,pn as Ut,pt as Wt,q as Gt,qn as Kt,qt,r as Jt,rn as Yt,rt as Xt,s as Zt,sn as Qt,st as $t,t as en,tn,tt as nn,u as rn,un as an,ut as on,v as sn,vn as cn,vt as ln,w as un,wn as dn,wt as fn,x as pn,xn as mn,xt as hn,y as gn,yn as _n,yt as vn,z as yn,zn as bn,zt as xn}from"./dist-ou5qina8.mjs";export{en as AGENT_ID_MAX_LEN,Ft as AGENT_ID_RE,Jt as AGENT_WRITE_ORIGIN,bt as AgentFocusBroadcaster,Xe as AgentPresenceBroadcaster,Rt as AgentSessionCapacityError,Zt as AgentSessionManager,rt as BacklinkIndex,kt as CC1Broadcaster,o as CC1_CONTRACT_VERSION,rn as CONFLICT_MARKER_RE,ot as ConfigSchema,dt as DEFAULT_CHECKPOINT_RETENTION,Ht as FILE_SYSTEM_WRITER,Mt as FILE_WATCHER_ORIGIN,_t as GIT_UPSTREAM_WRITER,Qe as GitDirAccessError,mt as HOCUSPOCUS_AUTH_REJECTION_REASONS,qe as HocuspocusAuthRejection,sn as HocuspocusAuthTokenSchema,gn as LIVE_DERIVED_INDEX_DEBOUNCE_MS,et as LOG_MD_TEMPLATE,pn as MANAGED_RENAME_ORIGIN,we as MAX_AGENT_SESSIONS,j as MCP_SERVER_NAME,un as MISSING_OK_CONFIG_MESSAGE,Bt as MalformedGitPointerError,De as McpLogger,L as MissingOkConfigError,P as OBSERVER_SYNC_ORIGIN,r as ORPHAN_MODES,pe as PinoLogger,x as ProcessLockCollisionError,Et as ProjectGitInitError,T as ROLLBACK_ORIGIN,g as RUNTIME_VERSION,Ct as SERVICE_WRITER,se as SKILL_INSTALL_EVENTS_FILE_REL,e as SKILL_STATE_TARGETS,ue as STARTER_FOLDERS,ge as STARTER_FOLDER_FRONTMATTER_FILENAME,B as STARTER_TEMPLATES,Y as STATE_MANIFEST_FILENAME,y as STATE_SCHEMA_VERSION,a as SYSTEM_DOC_NAME,ie as SeedPrerequisiteError,xe as SeedRootDirError,p as ServerLockCollisionError,yn as StateManifestError,O as TagIndex,Ne as UiLockCollisionError,c as acquireProcessLock,_ as acquireServerLock,K as acquireUiLock,Ae as applyAgentMarkdownWrite,Ie as applyExternalChange,U as applySeed,te as assertCompatibleStateManifest,Gt as assertNeverDiskEvent,Q as attachIdleShutdown,He as bootServer,ze as buildAndOpenSkill,Ge as buildExecResult,ye as buildReadResult,C as buildSkillZip,ut as buildStarterFolderFrontmatterYaml,nn as buildWipTree,Lt as classifyEvents,Xt as clearContributors,t as colorFromSeed,St as commitUpstreamImport,$e as commitWip,Vt as commitWipFromTree,$t as containsConflictMarkers,at as contentHash,jt as contributorCount,on as createApiExtension,ct as createAssetServeMiddleware,pt as createContentFilter,Wt as createExternalChangeHandler,Pt as createLiveDerivedIndexExtension,yt as createMcpHttpHandler,gt as createPersistenceExtension,Ye as createServer,ln as createServerObserverExtension,vn as createTestLogger,nt as detectClaudeDesktopPresence,hn as detectProjectShape,Ee as ensureProjectGit,N as evictStaleTrackerEntries,fn as extractWikiLinksFromMarkdown,ke as formatContributors,z as gcCheckpointRefs,I as getCurrentMcpLogger,he as getLocalDir,Ot as getLogger,D as getMeter,Tt as getMetrics,le as getTracer,fe as handleCollabSocketError,i as iconFromClientName,ve as incrementCollabSocketFilteredError,H as incrementServerObserverFire,Z as initShadowRepo,oe as initTelemetry,Ce as installTestLoggers,xn as installUserSkill,A as isAllowedApiOrigin,Fe as isAllowedWorkspaceHostHeader,J as isConfigDoc,Me as isHocuspocusAuthRejectionReason,Re as isLoopbackAddress,n as isOrphanMode,G as isPairedWriteOrigin,b as isProcessAlive,re as isSelfWrite,qt as isSystemDoc,l as isValidLockPid,ee as lastKnownHash,We as listRescueCheckpoints,Ve as loadPrincipal,m as lockFilePath,Ke as loggerFactory,be as mountMcpAndApi,w as parseHocuspocusAuthToken,lt as parseKeepaliveConnectionId,tn as pathToDocName,It as planSeed,Yt as readAllTargets,xt as readBranchFromHead,S as readProcessLock,u as readProcessLockDetailed,d as readServerLock,Ze as readServerPackageVersion,zt as readSkillInstallStateSnapshot,Qt as readStateManifest,it as readTargetRecordedAt,At as readTargetVersion,an as readUiLock,st as reconcile,ft as recordContributor,Ut as recordSkillInstallEvent,Nt as registerWrite,v as releaseProcessLock,h as releaseServerLock,vt as releaseUiLock,ht as removeLastKnownHash,Je as resetMetrics,cn as resolveBundledSkillDir,_n as resolveContentDir,tt as resolveLockDir,mn as resolvePackageVersion,Te as rewriteMarkdownLinksForDocumentRename,M as rewriteWikiLinksForDocumentRename,dn as runAuthReposSubprocess,Oe as runAuthStatusSubprocess,R as runCloneSubprocess,F as runDeviceFlowSubprocess,me as runWithMcpLogger,Dt as safeContentPath,E as safeSubdir,wt as safetyCheckpoint,ce as saveInMemoryCheckpoint,de as saveVersion,_e as seedBasenameIndex,V as setActiveSpanAttributes,X as shadowGit,ae as shutdownTelemetry,Se as splitMarkdownBlocks,bn as startWatcher,k as toBroadcasterKey,Pe as updateLastKnownHash,f as updateProcessLockPort,s as updateServerLockPort,q as updateUiLockPort,je as validateAgentId,Le as validateCloneInputs,W as validateSkillZip,ne as withSpan,Kt as withSpanSync,$ as writeStateManifest,Ue as writeTargetVersion,Be as writeTracker};