@inkeep/open-knowledge 0.4.0-beta.18 → 0.4.0-beta.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/assets/skills/open-knowledge/SKILL.md +1 -1
  2. package/dist/cli.mjs +5 -5
  3. package/dist/constants-DTqDNUS7.mjs +2 -0
  4. package/dist/{dist-RAy2NfOX.mjs → dist-Bfxmzk9L.mjs} +2 -2
  5. package/dist/{dist-DfIz2LcA.mjs → dist-Cp4ojTBN.mjs} +2 -2
  6. package/dist/{dist-CeydCXIY.mjs → dist-tZe2rFf6.mjs} +1 -1
  7. package/dist/index.mjs +1 -1
  8. package/dist/{init-CHeuJpGC.mjs → init-Bzm3Bj4h.mjs} +3 -3
  9. package/dist/init-IWUnv882.mjs +1 -0
  10. package/dist/{loader-C8IjdTUq.mjs → loader--zxukDZu.mjs} +2 -2
  11. package/dist/loader-DQvI2UUK.mjs +1 -0
  12. package/dist/preview-BHYdZs7Y.mjs +1 -0
  13. package/dist/{preview-9nTEbdox.mjs → preview-XajysOgG.mjs} +2 -2
  14. package/dist/public/assets/{ActivityModeContent-WITVydyg.js → ActivityModeContent-yyI5Ntgt.js} +1 -1
  15. package/dist/public/assets/{DocumentContext-FwLaR_pb.js → DocumentContext-CYTEDpXo.js} +14 -14
  16. package/dist/public/assets/{GraphPanel-BYxZ6mOr.js → GraphPanel-BcD5weL7.js} +1 -1
  17. package/dist/public/assets/{OutlinePanel-DktI5hU_.js → OutlinePanel-CF0ZjNeY.js} +1 -1
  18. package/dist/public/assets/{SettingsPane-CEKKjs0_.js → SettingsPane-Dm4UYL47.js} +1 -1
  19. package/dist/public/assets/{SourceEditor-B7V3PE4E.js → SourceEditor-BUirRa42.js} +1 -1
  20. package/dist/public/assets/{config-validation-events-ZEbhIRmP.js → config-validation-events-DzZGJLSM.js} +1 -1
  21. package/dist/public/assets/{doc-hash-CfmBVnag.js → doc-hash-DHxBgWbt.js} +1 -1
  22. package/dist/public/assets/{index-uWtLvm2S.js → index-5PB1Kr-b.js} +77 -77
  23. package/dist/public/assets/{index-C-Lx_3XB.css → index-C9d50jCr.css} +1 -1
  24. package/dist/public/assets/{target-navigation-intent-CNDuSbLi.js → target-navigation-intent-CnzRZgNc.js} +1 -1
  25. package/dist/public/assets/{tooltip-csUfbEtd.js → tooltip-BKAA9nHy.js} +1 -1
  26. package/dist/public/index.html +8 -8
  27. package/dist/src-BQP6s1V9.mjs +1 -0
  28. package/dist/{start-CYO0oCRi.mjs → start-BX5MJMSW.mjs} +2 -2
  29. package/dist/start-BwVlC9Wk.mjs +1 -0
  30. package/package.json +1 -1
  31. package/dist/constants-BAB6M22P.mjs +0 -2
  32. package/dist/init-Ce-UT9pd.mjs +0 -1
  33. package/dist/loader-3tXPnOZ-.mjs +0 -1
  34. package/dist/preview-p9A3YHaJ.mjs +0 -1
  35. package/dist/src-DPnYDstF.mjs +0 -1
  36. package/dist/start-BsKclRv-.mjs +0 -1
@@ -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.18"
6
+ version: "0.4.0-beta.20"
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{Bt as n,E as r,Gt as i,Jt as a,Mt as o,Nt as s,Ot as c,Pt as l,Q as u,Rt as d,T as f,Vt as p,W as m,Zt as h,dn as g,n as ee,un as _,zt as v}from"./dist-DfIz2LcA.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 ie,m as ae,p as oe,r as se,v as w,x as ce,y as le}from"./init-CHeuJpGC.mjs";import{c as ue,f as T,l as de,s as E}from"./server-lock-D7DXNVql-BRVVzA6T.mjs";import{i as fe}from"./git-handle-DwfYp_z--CfyPz4Dz.mjs";import{$ as pe,B as me,En as D,J as he,Kt as ge,Nt as _e,T as ve,Xt as ye,cr as be,fr as xe,kn as O,ln as Se,lr as Ce,or as we,pr as Te,qt as Ee,sr as De,ur as Oe}from"./dist-RAy2NfOX.mjs";import{n as ke}from"./constants-BAB6M22P.mjs";import{t as Ae}from"./loader-C8IjdTUq.mjs";import{d as je,f as Me,l as Ne,m as Pe,p as Fe,s as Ie}from"./start-CYO0oCRi.mjs";import{c as Le,i as k,n as A,o as j,r as Re,s as ze,t as M}from"./colors-BNufdynn.mjs";import"./src-DPnYDstF.mjs";import{execFileSync as Be,spawn as Ve,spawnSync as N}from"node:child_process";import He,{basename as Ue,dirname as We,join as P,relative as Ge,resolve as F}from"node:path";import{closeSync as Ke,existsSync as I,mkdirSync as qe,mkdtempSync as Je,openSync as Ye,readFileSync as L,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 R}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=g();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??P(tt(),`.ok`,`auth.yml`)}read(){if(!I(this.authFile))return{};try{return(0,mt.parse)(L(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);I(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{Bt as n,E as r,Gt as i,Jt as a,Mt as o,Nt as s,Ot as c,Pt as l,Q as u,Rt as d,T as f,Vt as p,W as m,Zt as h,dn as g,n as ee,un as _,zt as v}from"./dist-Cp4ojTBN.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 ie,m as ae,p as oe,r as se,v as w,x as ce,y as le}from"./init-Bzm3Bj4h.mjs";import{c as ue,f as T,l as de,s as E}from"./server-lock-D7DXNVql-BRVVzA6T.mjs";import{i as fe}from"./git-handle-DwfYp_z--CfyPz4Dz.mjs";import{$ as pe,B as me,En as D,J as he,Kt as ge,Nt as _e,T as ve,Xt as ye,cr as be,fr as xe,kn as O,ln as Se,lr as Ce,or as we,pr as Te,qt as Ee,sr as De,ur as Oe}from"./dist-Bfxmzk9L.mjs";import{n as ke}from"./constants-DTqDNUS7.mjs";import{t as Ae}from"./loader--zxukDZu.mjs";import{d as je,f as Me,l as Ne,m as Pe,p as Fe,s as Ie}from"./start-BX5MJMSW.mjs";import{c as Le,i as k,n as A,o as j,r as Re,s as ze,t as M}from"./colors-BNufdynn.mjs";import"./src-BQP6s1V9.mjs";import{execFileSync as Be,spawn as Ve,spawnSync as N}from"node:child_process";import He,{basename as Ue,dirname as We,join as P,relative as Ge,resolve as F}from"node:path";import{closeSync as Ke,existsSync as I,mkdirSync as qe,mkdtempSync as Je,openSync as Ye,readFileSync as L,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 R}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=g();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??P(tt(),`.ok`,`auth.yml`)}read(){if(!I(this.authFile))return{};try{return(0,mt.parse)(L(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);I(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 h(c,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 z(){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 z().rl}function nn(e){return at.bind((...t)=>{let n=z(),r=!1,i=n.handleChange;n.handleChange=()=>{r=!0};let a=e(...t);return r&&i(),n.handleChange=i,a})}function rn(e){let t=z(),{index:n}=t,r=e({get(){return t.hooks[n]},set(e){t.hooks[n]=e},initialized:n in t.hooks});return t.index++,r}function an(){z().handleChange()}const on={queue(e){let t=z(),{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=z();nn(()=>{e.hooksEffect.forEach(e=>{e()}),e.hooksEffect.length=0})()},clearAll(){let e=z();e.hooksCleanup.forEach(e=>{e?.()}),e.hooksEffect.length=0,e.hooksCleanup.length=0}};function sn(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=sn(e)?e():e;return t.set(r),[r,n]})}function cn(e,t){rn(n=>{let r=n.get();(!Array.isArray(r)||t.some((e,t)=>!Object.is(e,r[t])))&&on.queue(e),n.set(t)})}const ln={prefix:{idle:R(`blue`,`?`),done:R(`green`,ne.tick)},spinner:{interval:80,frames:[`⠋`,`⠙`,`⠹`,`⠸`,`⠼`,`⠴`,`⠦`,`⠧`,`⠇`,`⠏`].map(e=>R(`yellow`,e))},style:{answer:e=>R(`cyan`,e),message:e=>R(`bold`,e),error:e=>R(`red`,`> ${e}`),defaultAnswer:e=>R(`dim`,`(${e})`),help:e=>R(`dim`,e),highlight:e=>R(`cyan`,e),key:e=>R(`cyan`,R(`bold`,`<${e}>`))}};function un(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 dn(...e){let t={};for(let n of e)for(let[e,r]of Object.entries(n)){let n=t[e];t[e]=un(n)&&un(r)?dn(n,r):r}return t}function fn(...e){return dn(ln,...e.filter(e=>e!=null))}function pn({status:e=`idle`,theme:t}){let[n,r]=B(!1),[i,a]=B(0),{prefix:o,spinner:s}=fn(t);return cn(()=>{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 mn(e){return B({current:e})[0]}function hn(e){let t=mn(e);t.current=e,cn(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 gn=e(ce(),1);function _n(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 wr(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 Cr(t,await e())})}async function Tr(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 Sr({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 Er(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 Tr(t,await e())})}async function Dr(e,t){let{host:n}=e;await t.clear(n),process.stderr.write(`✓ Signed out from ${n}\n`)}function Or(e){return new t(`signout`).description(`Remove stored credentials`).option(`--host <host>`,`GitHub hostname`,`github.com`).action(async t=>{await Dr(t,await e())})}async function kr(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 Sr({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 Ar(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 kr(t,await e())})}function jr(){let e=new t(`auth`);e.description(`GitHub authentication management`);let n=()=>vt();return e.addCommand(Gt(n)),e.addCommand(Ar(n)),e.addCommand(Er(n)),e.addCommand(Or(n)),e.addCommand(wr(n)),e.addCommand(St(n)),e}function H(e,t,n={}){let r=de(e,t);if(!I(r))return{status:`missing`,lockPath:r};let i;try{i=JSON.parse(L(r,`utf-8`))}catch{return{status:`corrupt`,lockPath:r}}if(!i||typeof i!=`object`||!ue(i.pid))return{status:`corrupt`,lockPath:r};let a=i,o=n.host??nt();return a.hostname===o?(n.isAlive??E)(a.pid)?{status:`alive`,lockPath:r,lock:a}:{status:`dead-pid`,lockPath:r,lock:a}:{status:`foreign-host`,lockPath:r,lock:a}}function Mr(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 Nr(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=Mr(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 Pr(e){return new t(`clean`).description(`Prune stale / corrupt open-knowledge lock files (never touches live locks)`).action(()=>{Nr({lockDir:O(D(e(),process.cwd()))}).failed.length>0&&(process.exitCode=1)})}function Fr(){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 Ir(e,t,n={},r=Fr){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 Lr(e){return e.replace(/:\d+$/,``)}function Rr(e){let t=e.trim();if(!t)return null;{let e=/^https?:\/\/([^/?#]+)\/([\w.\-~%]+)\/([\w.\-~%]+?)(?:\.git)?\/?$/.exec(t);if(e)return{protocol:`https`,hostname:Lr(e[1]),owner:e[2],name:e[3]}}{let e=/^ssh:\/\/(?:[\w.-]+@)?([^/?#]+)\/([\w.\-~%]+)\/([\w.\-~%]+?)(?:\.git)?\/?$/.exec(t);if(e)return{protocol:`ssh`,hostname:Lr(e[1]),owner:e[2],name:e[3]}}{let e=/^git:\/\/([^/?#]+)\/([\w.\-~%]+)\/([\w.\-~%]+?)(?:\.git)?\/?$/.exec(t);if(e)return{protocol:`git`,hostname:Lr(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 zr=[[`count`,0,10],[`compress`,10,20],[`receiv`,20,60],[`resolv`,60,100]];function Br(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 zr)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 Vr(e,t,n,r=process.cwd()){let i=Rr(e);if(!i)throw Error(`Invalid git URL: ${e}`);let a=t.dir?F(r,t.dir):F(r,i.name);if(I(a)&&Xe(a).length>0)throw Error(`Target directory is not empty: ${a}`);let o=await vt(),s=await Ir(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=Br(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-Ce-UT9pd.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{Hr(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 Hr(e){let t=P(e,`.git`,`info`,`exclude`);if(!I(t))return`no-exclude`;let n=L(t,`utf-8`),r=new Set([`.ok`,`.ok/`,`/.ok`,`/.ok/`]);return n.split(`
20
+ `);try{let{runInit:e}=await import(`./init-IWUnv882.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{Hr(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 Hr(e){let t=P(e,`.git`,`info`,`exclude`);if(!I(t))return`no-exclude`;let n=L(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 Ur(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 Vr(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-BsKclRv-.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 Wr=[[`sync`],[`persistence`,`debounceMs`],[`persistence`,`maxDebounceMs`],[`server`,`port`],[`content`,`include`],[`content`,`exclude`]];function Gr(e={}){let t=e.log??(e=>console.error(e)),n=e.error??(e=>console.error(e)),r=e.loadConfigFn??Ae;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 Kr(e){let t=(0,mt.parseDocument)(L(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 Wr)t.hasIn(e)&&n.push(e.join(`.`));return n}function qr(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Jr(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=qr(i)?i:{};e[r]=a,e=a}e[n[n.length-1]]=null}return t}async function Yr(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??Te,s=[];(r===`project`||r===`both`)&&s.push({scope:`project`,absPath:xe(`project`,a,e.homedirOverride)}),(r===`user`||r===`both`)&&s.push({scope:`user`,absPath:xe(`user`,a,e.homedirOverride)});let c=[],l=!0;for(let{scope:t,absPath:n}of s){if(!I(n)){c.push({path:n,scope:t,found:[],removed:[]});continue}let r;try{r=Kr(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:Jr(Wr.filter(e=>r.includes(e.join(`.`)))),homedirOverride:e.homedirOverride});if(!s.ok){c.push({path:n,scope:t,found:r,removed:[],error:u(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 d=c.some(e=>e.error!==void 0),f=c.reduce((e,t)=>e+t.found.length,0);if(f===0&&!d)t(`No deprecated fields found.`);else if(f>0)for(let e of 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 Xr(){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(()=>{Gr({}).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 Yr({scope:t,dryRun:e.dryRun})).ok||(process.exitCode=1)}),e}var W=e(Le(),1);const G=2e3,Zr=[/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 Qr(e){return Zr.some(t=>t.test(e))}async function $r(){let e=N(`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=ei(t);if(n.length>0||t.trim()===``)return n}let t=N(`ps`,[`-axo`,`pid,command`],{encoding:`utf-8`,timeout:G});return t.error!=null||!t.stdout?[]:ti(t.stdout)}function ei(e){let t=[];for(let n of e.split(`
23
+ `}.ok/\n`,`utf-8`),`appended`)}function Ur(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 Vr(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-BwVlC9Wk.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 Wr=[[`sync`],[`persistence`,`debounceMs`],[`persistence`,`maxDebounceMs`],[`server`,`port`],[`content`,`include`],[`content`,`exclude`]];function Gr(e={}){let t=e.log??(e=>console.error(e)),n=e.error??(e=>console.error(e)),r=e.loadConfigFn??Ae;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 Kr(e){let t=(0,mt.parseDocument)(L(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 Wr)t.hasIn(e)&&n.push(e.join(`.`));return n}function qr(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Jr(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=qr(i)?i:{};e[r]=a,e=a}e[n[n.length-1]]=null}return t}async function Yr(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??Te,s=[];(r===`project`||r===`both`)&&s.push({scope:`project`,absPath:xe(`project`,a,e.homedirOverride)}),(r===`user`||r===`both`)&&s.push({scope:`user`,absPath:xe(`user`,a,e.homedirOverride)});let c=[],l=!0;for(let{scope:t,absPath:n}of s){if(!I(n)){c.push({path:n,scope:t,found:[],removed:[]});continue}let r;try{r=Kr(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:Jr(Wr.filter(e=>r.includes(e.join(`.`)))),homedirOverride:e.homedirOverride});if(!s.ok){c.push({path:n,scope:t,found:r,removed:[],error:u(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 d=c.some(e=>e.error!==void 0),f=c.reduce((e,t)=>e+t.found.length,0);if(f===0&&!d)t(`No deprecated fields found.`);else if(f>0)for(let e of 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 Xr(){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(()=>{Gr({}).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 Yr({scope:t,dryRun:e.dryRun})).ok||(process.exitCode=1)}),e}var W=e(Le(),1);const G=2e3,Zr=[/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 Qr(e){return Zr.some(t=>t.test(e))}async function $r(){let e=N(`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=ei(t);if(n.length>0||t.trim()===``)return n}let t=N(`ps`,[`-axo`,`pid,command`],{encoding:`utf-8`,timeout:G});return t.error!=null||!t.stdout?[]:ti(t.stdout)}function ei(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)&&Qr(a)&&t.push(o)}return t}function ti(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)&&Qr(o)&&t.push(s)}return t}function ni(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 ri(e){let t=N(`ps`,[`-p`,String(e),`-o`,`command=`],{encoding:`utf-8`,timeout:G});return t.error!=null||!t.stdout?null:t.stdout.trim()||null}function ii(e){let t=N(`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 ai(e){let t=N(`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 oi(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 Va=class extends TransformStream{constructor({onError:e,onRetry:t,onComment:n}={}){let r;super({start(i){r=za({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 Ha={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}},Ua=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=Ei(t?.fetch,t?.requestInit),this._sessionId=t?.sessionId,this._reconnectionOptions=t?.reconnectionOptions??Ha}async _authThenStart(){if(!this._authProvider)throw new Y(`No auth provider`);let e;try{e=await ga(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=Ti(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 Va({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=we.parse(JSON.parse(e.data));Oe(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 ga(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}=ba(o);if(this._resourceMetadataUrl=t,this._scope=n,await ga(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}=ba(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 ga(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetch})!==`AUTHORIZED`)throw new Y;return this.send(e)}}throw new X(o.status,`Error POSTing to endpoint: ${t}`)}if(this._hasCompletedAuthFlow=!1,this._lastUpscopingHeader=void 0,o.status===202){await o.body?.cancel(),be(e)&&this._startOrAuthSse({resumptionToken:void 0}).catch(e=>this.onerror?.(e));return}let c=(Array.isArray(e)?e:[e]).filter(e=>`method`in e&&`id`in e&&e.id!==void 0).length>0,l=o.headers.get(`content-type`);if(c)if(l?.includes(`text/event-stream`))this._handleSseStream(o.body,{onresumptiontoken:r},!1);else if(l?.includes(`application/json`)){let e=await o.json(),t=Array.isArray(e)?e.map(e=>we.parse(e)):[we.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})}},Wa=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),Ga(t)}clear(){this._buffer=void 0}};function Ga(e){return we.parse(JSON.parse(e))}function Ka(e){return JSON.stringify(e)+`
58
- `}var qa=class{constructor(e=et.stdin,t=et.stdout){this._stdin=e,this._stdout=t,this._readBuffer=new Wa,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=Ka(e);this._stdout.write(n)?t():this._stdout.once(`drain`,t)})}};function Ja(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 Ya(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 Xa(e){if(e===void 0||e===``)return;let t=Number.parseInt(e,10);if(!(Number.isNaN(t)||t<=0))return t}function Za(e){return e===`0.0.0.0`||e===`::`?`localhost`:e.includes(`:`)&&!e.startsWith(`[`)?`[${e}]`:e}function Qa(e,t){return`http://${Za(e)}:${t}/mcp`}function $a(e,t){return`ws://${Za(e)}:${t}`}function eo(e){let t=new URL(e);return t.protocol=t.protocol===`https:`?`wss:`:`ws:`,t.pathname=``,t.search=``,t.hash=``,t.toString().replace(/\/$/,``)}function to(e,t){if(!(!e||e.port<=0)&&t(e.pid))return e.port}function no(e){return I(e)?L(e,`utf-8`).trim():``}function ro(e,t){return`server did not start within ${e}ms${t?` stderr:\n${t}`:``}`}function io(e){if(e&&typeof e==`object`&&`method`in e&&`id`in e)return e.id}function ao(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 oo(e,t){return{jsonrpc:`2.0`,id:e,error:{code:-32e3,message:t instanceof Error?t.message:String(t)}}}async function so(e){let t=e.readLock??(()=>T(e.lockDir)),n=e.isAlive??E,r=e.sleep??(e=>ut(e)),i=e.spawn??Ve,a=e.readErrorLog??no,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 Qa(`localhost`,t)}let u=to(t(),n);if(u!==void 0)return Qa(`localhost`,u);if(e.envAutoStart===`0`)throw Error(`Open Knowledge server is not running and OK_MCP_AUTOSTART=0 disables auto-start.`);I(e.lockDir)||qe(e.lockDir,{recursive:!0});let d=P(e.lockDir,`last-spawn-error.log`),f=o(d),p,m,h=je();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=to(t(),n);if(e!==void 0)return Qa(`localhost`,e)}if(m){let e=a(d),t=e?` stderr:\n${e}`:``;throw Error(`spawn failed: ${m}${t}`)}throw Error(ro(c,a(d)))}function co(e,t){if(e.portOverride!==void 0)return eo(t);let n=e.readLock??(()=>T(e.lockDir)),r=e.isAlive??E,i=to(n(),r);if(i!==void 0)return $a(`localhost`,i)}async function lo(e,t={}){let n=t.stderr??process.stderr,r=t.requestTimeoutMs??12e4,i=t.createStdioTransport?t.createStdioTransport(t.stdin,t.stdout):new qa(t.stdin,t.stdout),a=t.createHttpTransport?t.createHttpTransport(new URL(e)):new Ua(new URL(e),{fetch:Ya(r),...t.connectionId===void 0?{}:{requestInit:{headers:{[ve]:t.connectionId}}}}),o=!1,s=async()=>{o||(o=!0,t.onclose?.(),await Promise.allSettled([i.close(),a.close()]))};i.onerror=e=>{n.write(`[mcp-shim] stdio error: ${e.message}\n`)},a.onerror=e=>{n.write(`[mcp-shim] HTTP transport error: ${e.message}\n`)},i.onclose=()=>{s()},a.onclose=()=>{s()};let c=Promise.resolve();i.onmessage=e=>{c=c.then(async()=>{try{await a.send(e)}catch(t){let r=io(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(oo(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=ao(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 uo(e){let t=e.stderr??process.stderr,n=e.bridgeFn??lo,r=await so(e),i=e.createConnectionId?.()??ct(),a=!1,o=(e.startKeepalive??Ja)({connectionId:i,resolveWsUrl:async()=>co(e,r),log:e=>t.write(`[mcp-shim] keepalive: ${e}\n`)});t.write(`[mcp-shim] proxying stdio to ${r}\n`);let s;try{s=await n(r,{stderr:t,connectionId:i,onclose:()=>{a||(o.close(),process.exit(0))}})}catch(e){throw o.close(),e}let c=()=>{a=!0,o.close(),s.close().finally(()=>{process.exit(0)})};process.once(`SIGINT`,c),process.once(`SIGTERM`,c)}function fo(e,t){return t===void 0?!I(F(e,`.ok`)):!1}function po(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(fo(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=D(n,r),a=Xa(process.env.OK_MCP_SPAWN_TIMEOUT_MS);await uo({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 mo(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-p9A3YHaJ.mjs`),r=e(),i=process.cwd(),a=D(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 ho(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 go(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:ni(r),command:r}}function _o(e){switch(e){case`alive`:return`running`;case`dead-pid`:return`stale`;case`foreign-host`:return`foreign`;default:return e}}function vo(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 yo(e){return e==null?`—`:`${e.cpuPercent.toFixed(1)}% / ${e.memPercent.toFixed(1)}%`}function bo(e){return`${yo(e.server.usage)} | ${yo(e.ui?.usage??null)}`}function xo(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 So(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,xo(e),bo(e),_o(e.server.status),String(e.server.pid),ho(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=vo(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 qa=class{constructor(e=et.stdin,t=et.stdout){this._stdin=e,this._stdout=t,this._readBuffer=new Wa,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=Ka(e);this._stdout.write(n)?t():this._stdout.once(`drain`,t)})}};function Ja(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 Ya(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 Xa(e){if(e===void 0||e===``)return;let t=Number.parseInt(e,10);if(!(Number.isNaN(t)||t<=0))return t}function Za(e){return e===`0.0.0.0`||e===`::`?`localhost`:e.includes(`:`)&&!e.startsWith(`[`)?`[${e}]`:e}function Qa(e,t){return`http://${Za(e)}:${t}/mcp`}function $a(e,t){return`ws://${Za(e)}:${t}`}function eo(e){let t=new URL(e);return t.protocol=t.protocol===`https:`?`wss:`:`ws:`,t.pathname=``,t.search=``,t.hash=``,t.toString().replace(/\/$/,``)}function to(e,t){if(!(!e||e.port<=0)&&t(e.pid))return e.port}function no(e){return I(e)?L(e,`utf-8`).trim():``}function ro(e,t){return`server did not start within ${e}ms${t?` stderr:\n${t}`:``}`}function io(e){if(e&&typeof e==`object`&&`method`in e&&`id`in e)return e.id}function ao(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 oo(e,t){return{jsonrpc:`2.0`,id:e,error:{code:-32e3,message:t instanceof Error?t.message:String(t)}}}async function so(e){let t=e.readLock??(()=>T(e.lockDir)),n=e.isAlive??E,r=e.sleep??(e=>ut(e)),i=e.spawn??Ve,a=e.readErrorLog??no,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 Qa(`localhost`,t)}let u=to(t(),n);if(u!==void 0)return Qa(`localhost`,u);if(e.envAutoStart===`0`)throw Error(`Open Knowledge server is not running and OK_MCP_AUTOSTART=0 disables auto-start.`);I(e.lockDir)||qe(e.lockDir,{recursive:!0});let d=P(e.lockDir,`last-spawn-error.log`),f=o(d),p,m,h=je();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=to(t(),n);if(e!==void 0)return Qa(`localhost`,e)}if(m){let e=a(d),t=e?` stderr:\n${e}`:``;throw Error(`spawn failed: ${m}${t}`)}throw Error(ro(c,a(d)))}function co(e,t){if(e.portOverride!==void 0)return eo(t);let n=e.readLock??(()=>T(e.lockDir)),r=e.isAlive??E,i=to(n(),r);if(i!==void 0)return $a(`localhost`,i)}async function lo(e,t={}){let n=t.stderr??process.stderr,r=t.requestTimeoutMs??12e4,i=t.createStdioTransport?t.createStdioTransport(t.stdin,t.stdout):new qa(t.stdin,t.stdout),a=t.createHttpTransport?t.createHttpTransport(new URL(e)):new Ua(new URL(e),{fetch:Ya(r),...t.connectionId===void 0?{}:{requestInit:{headers:{[ve]:t.connectionId}}}}),o=!1,s=async()=>{o||(o=!0,t.onclose?.(),await Promise.allSettled([i.close(),a.close()]))};i.onerror=e=>{n.write(`[mcp-shim] stdio error: ${e.message}\n`)},a.onerror=e=>{n.write(`[mcp-shim] HTTP transport error: ${e.message}\n`)},i.onclose=()=>{s()},a.onclose=()=>{s()};let c=Promise.resolve();i.onmessage=e=>{c=c.then(async()=>{try{await a.send(e)}catch(t){let r=io(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(oo(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=ao(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 uo(e){let t=e.stderr??process.stderr,n=e.bridgeFn??lo,r=await so(e),i=e.createConnectionId?.()??ct(),a=!1,o=(e.startKeepalive??Ja)({connectionId:i,resolveWsUrl:async()=>co(e,r),log:e=>t.write(`[mcp-shim] keepalive: ${e}\n`)});t.write(`[mcp-shim] proxying stdio to ${r}\n`);let s;try{s=await n(r,{stderr:t,connectionId:i,onclose:()=>{a||(o.close(),process.exit(0))}})}catch(e){throw o.close(),e}let c=()=>{a=!0,o.close(),s.close().finally(()=>{process.exit(0)})};process.once(`SIGINT`,c),process.once(`SIGTERM`,c)}function fo(e,t){return t===void 0?!I(F(e,`.ok`)):!1}function po(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(fo(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=D(n,r),a=Xa(process.env.OK_MCP_SPAWN_TIMEOUT_MS);await uo({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 mo(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-BHYdZs7Y.mjs`),r=e(),i=process.cwd(),a=D(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 ho(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 go(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:ni(r),command:r}}function _o(e){switch(e){case`alive`:return`running`;case`dead-pid`:return`stale`;case`foreign-host`:return`foreign`;default:return e}}function vo(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 yo(e){return e==null?`—`:`${e.cpuPercent.toFixed(1)}% / ${e.memPercent.toFixed(1)}%`}function bo(e){return`${yo(e.server.usage)} | ${yo(e.ui?.usage??null)}`}function xo(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 So(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,xo(e),bo(e),_o(e.server.status),String(e.server.pid),ho(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=vo(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 Co(e={}){let t=e.discover??si,n=e.inspect??H,r=e.log??(e=>console.log(e)),i=e.resolveCommand??ri,a=e.resolveUsage??ii,o=await t(),s=[];for(let e of o){let t=n(e,`server`),r=n(e,`ui`),o=go(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(So(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 wo(){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 Co({all:t.all===!0||e===`all`,json:t.json===!0})})}function Z(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function To(e,t,n=process.cwd()){let r=e.op??`sync`,i=T(O(D(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 Eo(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 To({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 Do(e){return new t(`pull`).description(`Pull changes from the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await To({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 Oo(e){return new t(`push`).description(`Push commits to the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await To({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 ko(e={}){let t=F(e.cwd??process.cwd()),n;try{n=await Se({projectDir:t,rootDir:e.root})}catch(e){return e instanceof me?{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:`${j(`Your knowledge base is already seeded.`)}\n${A(`Nothing to do.`)}`,plan:n,exitCode:0};if(e.dryRun)return{status:`dry-run`,message:`${M(`Plan (dry-run — no changes made):`)}\n\n${Ao(n,t)}`,plan:n,exitCode:0};if(!e.yes&&!await jo(`${M(`Plan:`)}\n\n${Ao(n,t)}\n\n${M(`Apply?`)} ${A(`[Y/n] `)}`,e.confirmStream))return{status:`cancelled`,message:A(`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:`${j(`✓ Seeded knowledge base`)} ${A(`(${r.applied} entries, ${r.durationMs}ms)`)}`,plan:n,exitCode:0}}function Ao(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(M(`Folders to create:`));for(let e of r)n.push(` ${j(`+`)} ${k(Ge(t,F(t,e.path))||e.path)}${A(`/`)}`)}if(i.length>0){n.length>0&&n.push(``),n.push(M(`Files to create:`));for(let e of i)n.push(` ${j(`+`)} ${k(Ge(t,F(t,e.path))||e.path)}`)}if(e.skipped.length>0){n.length>0&&n.push(``),n.push(A(`Already present (skipped):`));for(let t of e.skipped)n.push(` ${A(`· ${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 jo(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 Mo(){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 ko({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 No(e,t){return{server:Po(`server`,e),ui:Po(`ui`,t)}}function Po(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 Fo(e){return`${Io(e.server)}\n${Io(e.ui)}`}function Io(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 Lo(e){let t=e.inspect??(t=>H(e.lockDir,t)),n=e.log??(e=>console.log(e)),r=No(t(`server`),t(`ui`));return e.json?n(JSON.stringify(r,null,2)):n(Fo(r)),r}function Ro(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=>{Lo({lockDir:O(D(e(),process.cwd())),json:t.json===!0})})}function zo(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 Bo(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=zo(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 Vo(e){let t=await si(),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 Ho(e){let t=Bo({lockDir:e});return t.failed.length>0&&(process.exitCode=1),t}function Uo(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=Bo({lockDir:O(D(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 Co({});return}if(n===`all`){let e=await si();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`||(Ho(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 Vo(e);if(t===null){console.log(`No running open-knowledge server found with port or PID ${e}.`);return}Ho(t);return}Ho(O(n))})}const Wo=1e4;function Go(e,t){let n=e.socket?.remoteAddress;if(n!==void 0&&!ye(n))return Ko(t,`loopback-required`),!0;if(!Ee(e.headers.host))return Ko(t,`host-header-not-allowed`),!0;let r=e.headers.origin;return r!==void 0&&!ge(r)?(Ko(t,`origin-not-allowed`),!0):!1}function Ko(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 qo=[`connection`,`keep-alive`,`proxy-authenticate`,`proxy-authorization`,`te`,`trailer`,`transfer-encoding`,`upgrade`,`cookie`,`set-cookie`];async function Jo(e){let t=e.upstreamTimeoutMs??Wo,n=dt((n,r)=>{Go(n,r)||Xo(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 Yo(e,t,n){Xo(e,t,n.upstreamHost,n.upstreamPort,n.upstreamTimeoutMs??Wo)}function Xo(e,t,n,r,i){let a={...e.headers};delete a.host;for(let e of qo)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 qo)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 Zo(e){await Promise.all(e.map(e=>new Promise(t=>{e.close(()=>t())})))}async function Qo(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-CeydCXIY.mjs`),{default:d}=await import(`./build-B6buVrsB.mjs`),{resolveContentDir:p,resolveLockDir:h}=await import(`./dist-CeydCXIY.mjs`),g=p(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?d(te,{single:!0,gzip:!0,immutable:!0,extensions:[]}):null,b=t(g)?o({contentFilter:s({projectDir:e.cwd,contentDir:g}),contentSirv:d(g,{dotfiles:!1,dev:!0,extensions:[]}),inlineExtensions:r,assetExtensions:ee,blocklistExtensions:f}):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/`)&&Go(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}Yo(e,t,{upstreamHost:`localhost`,upstreamPort:r.port});return}if(b){b(e,t,()=>{y?y(e,t):$o(t)});return}if(y){y(e,t);return}$o(t)}},re=e.host===void 0?[`::1`,`127.0.0.1`]:[e.host],C=[],ie=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(ie,e,()=>{t.off(`error`,i);let e=t.address();typeof e==`object`&&e&&(ie=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 ae=ie;ne=ae,u(_,ae);let oe=e.scheduler??m,se=e.safetyNetMs??432e5,w=null,ce=!1,le=!1,ue=()=>{ce||(ce=!0,w!==null&&(oe.clearTimeout(w),w=null))},T=()=>{if(ue(),!le){le=!0;try{l(_)}catch{}}},de=()=>{ce||se<=0||(w!==null&&(oe.clearTimeout(w),w=null),w=oe.setTimeout(()=>{w=null,console.warn(`[ui] safety-net (${se}ms) reached — shutting down (D-025 backstop)`);try{e.onSafetyNet?.()}catch{}for(let e of C)try{e.close()}catch{}T()},se))},E=()=>{ce||se<=0||de()};return x=E,de(),{httpServers:C,port:ae,release:T,detachSafetyNet:ue,nudgeSafetyNet:E}}function $o(e){e.writeHead(404),e.end(`Not found`)}function es(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 ts(e){let t=e.readLock??(async()=>{let{readUiLock:t}=await import(`./dist-CeydCXIY.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 Jo({listenPort:e.requestedPort,host:e.host,upstreamHost:`localhost`,upstreamPort:r}),upstreamPort:r}}function ns(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-CeydCXIY.mjs`),{resolveContentDir:i,resolveLockDir:a}=await import(`./dist-CeydCXIY.mjs`),o=e(),s=t.host,c;try{c=es(t.port,process.env.PORT)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exitCode=1;return}try{let e=await Qo({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)}};Zo(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 ts({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(ke).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}=Ae(t);$=n}),Q.action(async()=>{if(Fe(Me()).available){Pe({spawn:Ve});return}await Ie($,{})});const rs=Ne(()=>$);Q.addCommand(rs);const is=po(()=>$);Q.addCommand(is),Q.addCommand(se()),Q.addCommand(Mo()),Q.addCommand(wi());const as=mo(()=>$);Q.addCommand(as);const os=ns(()=>$);Q.addCommand(os),Q.addCommand(Uo(()=>$)),Q.addCommand(Pr(()=>$)),Q.addCommand(Ro(()=>$)),Q.addCommand(wo()),Q.addCommand(gi()),Q.addCommand(Xr()),Q.addCommand(jr()),Q.addCommand(Ur(()=>$)),Q.addCommand(Eo(()=>$)),Q.addCommand(Oo(()=>$)),Q.addCommand(Do(()=>$)),await Q.parseAsync();export{};
62
+ `)}async function jo(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 Mo(){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 ko({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 No(e,t){return{server:Po(`server`,e),ui:Po(`ui`,t)}}function Po(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 Fo(e){return`${Io(e.server)}\n${Io(e.ui)}`}function Io(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 Lo(e){let t=e.inspect??(t=>H(e.lockDir,t)),n=e.log??(e=>console.log(e)),r=No(t(`server`),t(`ui`));return e.json?n(JSON.stringify(r,null,2)):n(Fo(r)),r}function Ro(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=>{Lo({lockDir:O(D(e(),process.cwd())),json:t.json===!0})})}function zo(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 Bo(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=zo(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 Vo(e){let t=await si(),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 Ho(e){let t=Bo({lockDir:e});return t.failed.length>0&&(process.exitCode=1),t}function Uo(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=Bo({lockDir:O(D(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 Co({});return}if(n===`all`){let e=await si();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`||(Ho(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 Vo(e);if(t===null){console.log(`No running open-knowledge server found with port or PID ${e}.`);return}Ho(t);return}Ho(O(n))})}const Wo=1e4;function Go(e,t){let n=e.socket?.remoteAddress;if(n!==void 0&&!ye(n))return Ko(t,`loopback-required`),!0;if(!Ee(e.headers.host))return Ko(t,`host-header-not-allowed`),!0;let r=e.headers.origin;return r!==void 0&&!ge(r)?(Ko(t,`origin-not-allowed`),!0):!1}function Ko(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 qo=[`connection`,`keep-alive`,`proxy-authenticate`,`proxy-authorization`,`te`,`trailer`,`transfer-encoding`,`upgrade`,`cookie`,`set-cookie`];async function Jo(e){let t=e.upstreamTimeoutMs??Wo,n=dt((n,r)=>{Go(n,r)||Xo(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 Yo(e,t,n){Xo(e,t,n.upstreamHost,n.upstreamPort,n.upstreamTimeoutMs??Wo)}function Xo(e,t,n,r,i){let a={...e.headers};delete a.host;for(let e of qo)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 qo)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 Zo(e){await Promise.all(e.map(e=>new Promise(t=>{e.close(()=>t())})))}async function Qo(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-tZe2rFf6.mjs`),{default:d}=await import(`./build-B6buVrsB.mjs`),{resolveContentDir:p,resolveLockDir:h}=await import(`./dist-tZe2rFf6.mjs`),g=p(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?d(te,{single:!0,gzip:!0,immutable:!0,extensions:[]}):null,b=t(g)?o({contentFilter:s({projectDir:e.cwd,contentDir:g}),contentSirv:d(g,{dotfiles:!1,dev:!0,extensions:[]}),inlineExtensions:r,assetExtensions:ee,blocklistExtensions:f}):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/`)&&Go(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}Yo(e,t,{upstreamHost:`localhost`,upstreamPort:r.port});return}if(b){b(e,t,()=>{y?y(e,t):$o(t)});return}if(y){y(e,t);return}$o(t)}},re=e.host===void 0?[`::1`,`127.0.0.1`]:[e.host],C=[],ie=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(ie,e,()=>{t.off(`error`,i);let e=t.address();typeof e==`object`&&e&&(ie=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 ae=ie;ne=ae,u(_,ae);let oe=e.scheduler??m,se=e.safetyNetMs??432e5,w=null,ce=!1,le=!1,ue=()=>{ce||(ce=!0,w!==null&&(oe.clearTimeout(w),w=null))},T=()=>{if(ue(),!le){le=!0;try{l(_)}catch{}}},de=()=>{ce||se<=0||(w!==null&&(oe.clearTimeout(w),w=null),w=oe.setTimeout(()=>{w=null,console.warn(`[ui] safety-net (${se}ms) reached — shutting down (D-025 backstop)`);try{e.onSafetyNet?.()}catch{}for(let e of C)try{e.close()}catch{}T()},se))},E=()=>{ce||se<=0||de()};return x=E,de(),{httpServers:C,port:ae,release:T,detachSafetyNet:ue,nudgeSafetyNet:E}}function $o(e){e.writeHead(404),e.end(`Not found`)}function es(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 ts(e){let t=e.readLock??(async()=>{let{readUiLock:t}=await import(`./dist-tZe2rFf6.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 Jo({listenPort:e.requestedPort,host:e.host,upstreamHost:`localhost`,upstreamPort:r}),upstreamPort:r}}function ns(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-tZe2rFf6.mjs`),{resolveContentDir:i,resolveLockDir:a}=await import(`./dist-tZe2rFf6.mjs`),o=e(),s=t.host,c;try{c=es(t.port,process.env.PORT)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exitCode=1;return}try{let e=await Qo({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)}};Zo(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 ts({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(ke).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}=Ae(t);$=n}),Q.action(async()=>{if(Fe(Me()).available){Pe({spawn:Ve});return}await Ie($,{})});const rs=Ne(()=>$);Q.addCommand(rs);const is=po(()=>$);Q.addCommand(is),Q.addCommand(se()),Q.addCommand(Mo()),Q.addCommand(wi());const as=mo(()=>$);Q.addCommand(as);const os=ns(()=>$);Q.addCommand(os),Q.addCommand(Uo(()=>$)),Q.addCommand(Pr(()=>$)),Q.addCommand(Ro(()=>$)),Q.addCommand(wo()),Q.addCommand(gi()),Q.addCommand(Xr()),Q.addCommand(jr()),Q.addCommand(Ur(()=>$)),Q.addCommand(Eo(()=>$)),Q.addCommand(Oo(()=>$)),Q.addCommand(Do(()=>$)),await Q.parseAsync(process.argv,{from:`node`});export{};
63
63
  //# sourceMappingURL=cli.mjs.map
@@ -0,0 +1,2 @@
1
+ import"./dist-Cp4ojTBN.mjs";var e=`0.4.0-beta.20`;const t=`config.yml`,n=e;export{n,t};
2
+ //# sourceMappingURL=constants-DTqDNUS7.mjs.map
@@ -1,4 +1,4 @@
1
- import{a as __toCommonJS,i as __require$1,n as __esmMin,o as __toESM$1,r as __exportAll,t as __commonJSMin$1}from"./chunk-FK9Q3tQk.mjs";import{$ as iconFromClientName,$t as meta$1,A as SKILL_STATE_TARGETS,At as _enum,B as createCodeFenceTracker,Bt as number,Ct as locateIssue,D as MarkdownManager,Dt as withConfigSpanSync,E as INLINE_RENDERABLE_EXTENSIONS,Et as withConfigSpan,F as applyIncrementalDiff,Ft as custom,G as detectAppliedToleranceClasses,Gt as string,H as createWorkspaceSearchCorpus,Ht as optional,I as classifyMarkdownHref,It as discriminatedUnion,J as extractFrontmatterTags,K as emptySkillState,Kt as union,L as classifyWikiLinkTarget,Lt as intersection,M as SYSTEM_DOC_NAME,N as SkillStateSchema,Nt as array,O as ORPHAN_MODES,P as applyFastDiff,Pt as boolean,Q as humanFormat,Qt as describe$1,R as colorFromSeed,Rt as literal,S as DEFAULT_DEDUP_MODE,St as applyPatchToDocument,Tt as validatePatchScopes,U as createWorkspaceSearchDocument,Ut as preprocess,V as createTagInTextRegex,Vt as object$1,W as defaultScheduler,Wt as record,X as getParseHealth,Xt as toJSONSchema,Y as getHeadingSlug,Yt as datetime,Z as getWikiLinkText,_ as CONFIG_DOC_NAMES,_t as Fragment,a as CC1BranchSwitchedPayloadSchema,an as safeParseAsync$1,at as prependFrontmatter,b as CONFIG_DOC_NAME_PROJECT_LOCAL,bt as LOCAL_DIR,c as CC1DerivedViewPayloadSchema,cn as normalizeParams,ct as resolveInternalHref,d as CC1_CHANNEL_BRANCH_SWITCHED,dn as require_dist$2,dt as stripFrontmatter,en as $ZodObject,et as isKnownConfigError,f as CC1_CHANNEL_CONFIG_IGNORE_NESTED_ERROR,ft as tagsMatchingPrefix,g as CC1_CONTRACT_VERSION,gt as PluginKey,h as CC1_CHANNEL_SERVER_INFO,ht as getSchema,i as BridgeMergeContentLossError,in as safeParse$1,it as normalizeBridge,j as SKILL_STATE_VERSION_RE,jt as _null,k as SKILL_STATE_REL,kt as ZodOptional$1,l as CC1DiskAckPayloadSchema,ln as $constructor,lt as searchWorkspaceCorpus,m as CC1_CHANNEL_DISK_ACK,mt as unwrapFrontmatterFences,n as ASSET_EXTENSIONS,nn as parse$1,nt as mediaKindForSidebarAssetExtension,o as CC1ConfigIgnoreNestedErrorPayloadSchema,on as clone,ot as readFmMap,p as CC1_CHANNEL_CONFIG_VALIDATION_REJECTED,pt as toWikiLinkSlug,q as expandTagToHierarchy,qt as unknown,r as BridgeInvariantViolationError,rn as parseAsync,rt as mergeThreeWay,s as CC1ConfigValidationRejectedPayloadSchema,sn as defineLazy,st as resolveAssetProjectPath,t as AGENT_ICON_COLORS,tn as $ZodType,tt as isOrphanMode,u as CC1ServerInfoPayloadSchema,ut as sharedExtensions,v as CONFIG_DOC_NAME_OKIGNORE,vt as CONFIG_SCHEMA_MAJOR_PATH,wt as toConfigIssue,x as CONFIG_DOC_NAME_USER,xt as addConfigSpanEvent,y as CONFIG_DOC_NAME_PROJECT,yt as ConfigSchema$1,z as createBasenameIndex,zt as looseObject}from"./dist-DfIz2LcA.mjs";import{a as metrics,c as SpanStatusCode,i as propagation,l as SpanKind,n as init_esm$2,o as diag,r as trace,s as context,t as esm_exports$2}from"./esm-BbkJd7ro.mjs";import{a as acquireProcessLock,c as isValidLockPid,f as readServerLock,g as updateProcessLockPort,m as releaseServerLock,n as RUNTIME_VERSION,o as acquireServerLock,p as releaseProcessLock,s as isProcessAlive,t as ProcessLockCollisionError,u as readProcessLock}from"./server-lock-D7DXNVql-BRVVzA6T.mjs";import{a as require_src$15,i as esm_default,r as withParentLock,t as createGitInstance}from"./git-handle-DwfYp_z--CfyPz4Dz.mjs";import{r as diffLines,t as createPatch}from"./libesm-YL3Bqolr.mjs";import{n as mimes}from"./mrmime-C2W7cgq2.mjs";import{t as b1}from"./chunk-YNYSPYQ5-DesxOVHh.mjs";import{a as c,c as h,d as m,f as p,h as x,i as b,l as i,m as v,n as C,o as d,p as u,r as a,s as f,t as $$1,u as l}from"./chunk-GFQRA5P5-DnjwTqP3.mjs";import{A as gt,B as wt,C as _i$1,D as da$1,E as bt,F as pe,H as zi$1,I as qi,L as us$1,M as ma$1,N as mt$1,O as di$1,P as pa$1,S as X$1,T as bl,V as xi$1,_ as Ti$1,a as Fi$1,b as W$1,c as M,d as P,f as Pt$1,g as T,h as Sl,i as En$1,j as he,k as ga$1,l as Nl,m as Se,n as Bi$1,o as Fs$1,p as R,r as Ci$1,s as G$1,t as Al,u as Oi$1,v as V,w as be,x as Wi$1,y as Vi$1,z as wl}from"./chunk-FEIOJCZD-C25Und0M.mjs";import{a as d$1,c as m$1,d as y,i as c$1,l as p$1,n as N,o as f$1,r as P$1,s as h$1,t as $$2,u as v$1}from"./chunk-XHM67O4N-akBjDPaR.mjs";import{n as l$1,r as o,t as h$2}from"./chunk-R6VWJ2ZL-FwG_Za20.mjs";import{r as o$1}from"./chunk-CWQS3NFK-Co4ALolT.mjs";import"./chunk-DXB73IDG-DIKSLkPq.mjs";import{n as d$2,t as _$1}from"./chunk-5QMZ5MUS-CAp625aG.mjs";import{n as u$1,t as b$1}from"./chunk-A5O5YHGN-DvJz5Cpw.mjs";import{n,r,t as c$2}from"./chunk-OJDRYQWQ-ikvLWpfV.mjs";import{r as x$1,t as a$1}from"./chunk-24IMIIXA-B6yIPkk2.mjs";import{n as n$1}from"./chunk-3THT3N7L-DztAF386.mjs";import{t as n$2}from"./chunk-44UOCSGV-CaFxJDHm.mjs";import{createRequire}from"node:module";import{execFile,spawn,spawnSync}from"node:child_process";import*as U from"node:path";import{basename,dirname,extname,isAbsolute,join,normalize,posix,relative,resolve,sep,win32}from"node:path";import*as I from"node:fs";import{appendFileSync,closeSync,createReadStream,createWriteStream,existsSync,linkSync,lstatSync,mkdirSync,openSync,readFile,readFileSync,readSync,readdirSync,realpathSync,renameSync,rmSync,rmdirSync,statSync,unlinkSync,writeFileSync}from"node:fs";import{homedir,hostname,platform,tmpdir}from"node:os";import{URLSearchParams as URLSearchParams$1,fileURLToPath}from"node:url";import{AsyncLocalStorage}from"node:async_hooks";import{promisify}from"node:util";import{Readable}from"stream";import{Transform}from"node:stream";import crypto$1,{createHash,randomUUID,webcrypto}from"node:crypto";import crypto$2 from"crypto";import*as zlib$2 from"zlib";import{access,constants,mkdir,readFile as readFile$1,readdir,realpath,rename,stat as stat$1,writeFile}from"node:fs/promises";import{performance as performance$1}from"node:perf_hooks";import{pipeline}from"node:stream/promises";import{setTimeout as setTimeout$1}from"node:timers/promises";import{Http2ServerRequest,constants as constants$1}from"http2";import{lookup}from"node:dns";import{createServer}from"node:http";const WRITER_ID_RE=/^(agent-[^/]+|principal-[^/]+|file-system|git-upstream|openknowledge-service)$/;function resolveGitDirDetailed(e){let t=resolve(e,`.git`),s;try{s=statSync(t)}catch(e){let s=e.code;return s===`ENOENT`||s===`ENOTDIR`?{kind:`absent`}:{kind:`inaccessible`,gitPath:t,cause:e}}if(s.isDirectory())return{kind:`directory`,path:t};if(s.isFile()){let s;try{s=readFileSync(t,`utf-8`).trim()}catch(e){return{kind:`malformed-pointer`,gitPath:t,target:``,cause:e}}let g=s.match(/^gitdir:\s*(.+)$/);return g?{kind:`linked`,path:resolve(e,g[1])}:{kind:`malformed-pointer`,gitPath:t,target:``}}return{kind:`absent`}}function resolveGitDir(e){let t=resolveGitDirDetailed(e);return t.kind===`directory`||t.kind===`linked`?t.path:null}function resolveShadowDir(e){let t=resolveGitDirDetailed(e);switch(t.kind){case`directory`:return resolve(t.path,`ok`);case`linked`:if(!existsSync(t.path))throw new MalformedGitPointerError(resolve(e,`.git`),t.path);return resolve(t.path,`ok`);case`malformed-pointer`:throw new MalformedGitPointerError(t.gitPath,t.target,{cause:t.cause});case`inaccessible`:throw new GitDirAccessError(t.gitPath,{cause:t.cause});case`absent`:return resolve(e,`.git/ok`)}}var MalformedGitPointerError=class extends Error{gitPointerPath;resolvedTarget;constructor(e,t,s){let g=t?`references a missing or unreadable gitdir at ${t}`:`is unreadable or has no valid gitdir: pointer`;super(`\`.git\` pointer at ${e} ${g}. Run \`git worktree prune\` from the source repo and try again.`,s),this.name=`MalformedGitPointerError`,this.gitPointerPath=e,this.resolvedTarget=t}},GitDirAccessError=class extends Error{gitPath;constructor(e,t){let s=t?.cause!==void 0&&t.cause!==null&&typeof t.cause==`object`&&`code`in t.cause&&typeof t.cause.code==`string`?` (${t.cause.code})`:``;super(`Cannot access \`.git\` at ${e}${s}. Check filesystem permissions and that the volume is mounted.`,t),this.name=`GitDirAccessError`,this.gitPath=e}};function getShadowRepoPath(e){let t;try{t=resolveShadowDir(e)}catch(e){if(e instanceof MalformedGitPointerError||e instanceof GitDirAccessError)return null;throw e}return existsSync(resolve(t,`HEAD`))?t:null}function getWipRefPattern(e){return`refs/wip/${e}/`}const OK_CONTRIBUTORS_PREFIX=`ok-contributors: `;function parseContributors(e){if(!e)return[];let t=[];for(let s of e.split(`
1
+ import{a as __toCommonJS,i as __require$1,n as __esmMin,o as __toESM$1,r as __exportAll,t as __commonJSMin$1}from"./chunk-FK9Q3tQk.mjs";import{$ as iconFromClientName,$t as meta$1,A as SKILL_STATE_TARGETS,At as _enum,B as createCodeFenceTracker,Bt as number,Ct as locateIssue,D as MarkdownManager,Dt as withConfigSpanSync,E as INLINE_RENDERABLE_EXTENSIONS,Et as withConfigSpan,F as applyIncrementalDiff,Ft as custom,G as detectAppliedToleranceClasses,Gt as string,H as createWorkspaceSearchCorpus,Ht as optional,I as classifyMarkdownHref,It as discriminatedUnion,J as extractFrontmatterTags,K as emptySkillState,Kt as union,L as classifyWikiLinkTarget,Lt as intersection,M as SYSTEM_DOC_NAME,N as SkillStateSchema,Nt as array,O as ORPHAN_MODES,P as applyFastDiff,Pt as boolean,Q as humanFormat,Qt as describe$1,R as colorFromSeed,Rt as literal,S as DEFAULT_DEDUP_MODE,St as applyPatchToDocument,Tt as validatePatchScopes,U as createWorkspaceSearchDocument,Ut as preprocess,V as createTagInTextRegex,Vt as object$1,W as defaultScheduler,Wt as record,X as getParseHealth,Xt as toJSONSchema,Y as getHeadingSlug,Yt as datetime,Z as getWikiLinkText,_ as CONFIG_DOC_NAMES,_t as Fragment,a as CC1BranchSwitchedPayloadSchema,an as safeParseAsync$1,at as prependFrontmatter,b as CONFIG_DOC_NAME_PROJECT_LOCAL,bt as LOCAL_DIR,c as CC1DerivedViewPayloadSchema,cn as normalizeParams,ct as resolveInternalHref,d as CC1_CHANNEL_BRANCH_SWITCHED,dn as require_dist$2,dt as stripFrontmatter,en as $ZodObject,et as isKnownConfigError,f as CC1_CHANNEL_CONFIG_IGNORE_NESTED_ERROR,ft as tagsMatchingPrefix,g as CC1_CONTRACT_VERSION,gt as PluginKey,h as CC1_CHANNEL_SERVER_INFO,ht as getSchema,i as BridgeMergeContentLossError,in as safeParse$1,it as normalizeBridge,j as SKILL_STATE_VERSION_RE,jt as _null,k as SKILL_STATE_REL,kt as ZodOptional$1,l as CC1DiskAckPayloadSchema,ln as $constructor,lt as searchWorkspaceCorpus,m as CC1_CHANNEL_DISK_ACK,mt as unwrapFrontmatterFences,n as ASSET_EXTENSIONS,nn as parse$1,nt as mediaKindForSidebarAssetExtension,o as CC1ConfigIgnoreNestedErrorPayloadSchema,on as clone,ot as readFmMap,p as CC1_CHANNEL_CONFIG_VALIDATION_REJECTED,pt as toWikiLinkSlug,q as expandTagToHierarchy,qt as unknown,r as BridgeInvariantViolationError,rn as parseAsync,rt as mergeThreeWay,s as CC1ConfigValidationRejectedPayloadSchema,sn as defineLazy,st as resolveAssetProjectPath,t as AGENT_ICON_COLORS,tn as $ZodType,tt as isOrphanMode,u as CC1ServerInfoPayloadSchema,ut as sharedExtensions,v as CONFIG_DOC_NAME_OKIGNORE,vt as CONFIG_SCHEMA_MAJOR_PATH,wt as toConfigIssue,x as CONFIG_DOC_NAME_USER,xt as addConfigSpanEvent,y as CONFIG_DOC_NAME_PROJECT,yt as ConfigSchema$1,z as createBasenameIndex,zt as looseObject}from"./dist-Cp4ojTBN.mjs";import{a as metrics,c as SpanStatusCode,i as propagation,l as SpanKind,n as init_esm$2,o as diag,r as trace,s as context,t as esm_exports$2}from"./esm-BbkJd7ro.mjs";import{a as acquireProcessLock,c as isValidLockPid,f as readServerLock,g as updateProcessLockPort,m as releaseServerLock,n as RUNTIME_VERSION,o as acquireServerLock,p as releaseProcessLock,s as isProcessAlive,t as ProcessLockCollisionError,u as readProcessLock}from"./server-lock-D7DXNVql-BRVVzA6T.mjs";import{a as require_src$15,i as esm_default,r as withParentLock,t as createGitInstance}from"./git-handle-DwfYp_z--CfyPz4Dz.mjs";import{r as diffLines,t as createPatch}from"./libesm-YL3Bqolr.mjs";import{n as mimes}from"./mrmime-C2W7cgq2.mjs";import{t as b1}from"./chunk-YNYSPYQ5-DesxOVHh.mjs";import{a as c,c as h,d as m,f as p,h as x,i as b,l as i,m as v,n as C,o as d,p as u,r as a,s as f,t as $$1,u as l}from"./chunk-GFQRA5P5-DnjwTqP3.mjs";import{A as gt,B as wt,C as _i$1,D as da$1,E as bt,F as pe,H as zi$1,I as qi,L as us$1,M as ma$1,N as mt$1,O as di$1,P as pa$1,S as X$1,T as bl,V as xi$1,_ as Ti$1,a as Fi$1,b as W$1,c as M,d as P,f as Pt$1,g as T,h as Sl,i as En$1,j as he,k as ga$1,l as Nl,m as Se,n as Bi$1,o as Fs$1,p as R,r as Ci$1,s as G$1,t as Al,u as Oi$1,v as V,w as be,x as Wi$1,y as Vi$1,z as wl}from"./chunk-FEIOJCZD-C25Und0M.mjs";import{a as d$1,c as m$1,d as y,i as c$1,l as p$1,n as N,o as f$1,r as P$1,s as h$1,t as $$2,u as v$1}from"./chunk-XHM67O4N-akBjDPaR.mjs";import{n as l$1,r as o,t as h$2}from"./chunk-R6VWJ2ZL-FwG_Za20.mjs";import{r as o$1}from"./chunk-CWQS3NFK-Co4ALolT.mjs";import"./chunk-DXB73IDG-DIKSLkPq.mjs";import{n as d$2,t as _$1}from"./chunk-5QMZ5MUS-CAp625aG.mjs";import{n as u$1,t as b$1}from"./chunk-A5O5YHGN-DvJz5Cpw.mjs";import{n,r,t as c$2}from"./chunk-OJDRYQWQ-ikvLWpfV.mjs";import{r as x$1,t as a$1}from"./chunk-24IMIIXA-B6yIPkk2.mjs";import{n as n$1}from"./chunk-3THT3N7L-DztAF386.mjs";import{t as n$2}from"./chunk-44UOCSGV-CaFxJDHm.mjs";import{createRequire}from"node:module";import{execFile,spawn,spawnSync}from"node:child_process";import*as U from"node:path";import{basename,dirname,extname,isAbsolute,join,normalize,posix,relative,resolve,sep,win32}from"node:path";import*as I from"node:fs";import{appendFileSync,closeSync,createReadStream,createWriteStream,existsSync,linkSync,lstatSync,mkdirSync,openSync,readFile,readFileSync,readSync,readdirSync,realpathSync,renameSync,rmSync,rmdirSync,statSync,unlinkSync,writeFileSync}from"node:fs";import{homedir,hostname,platform,tmpdir}from"node:os";import{URLSearchParams as URLSearchParams$1,fileURLToPath}from"node:url";import{AsyncLocalStorage}from"node:async_hooks";import{promisify}from"node:util";import{Readable}from"stream";import{Transform}from"node:stream";import crypto$1,{createHash,randomUUID,webcrypto}from"node:crypto";import crypto$2 from"crypto";import*as zlib$2 from"zlib";import{access,constants,mkdir,readFile as readFile$1,readdir,realpath,rename,stat as stat$1,writeFile}from"node:fs/promises";import{performance as performance$1}from"node:perf_hooks";import{pipeline}from"node:stream/promises";import{setTimeout as setTimeout$1}from"node:timers/promises";import{Http2ServerRequest,constants as constants$1}from"http2";import{lookup}from"node:dns";import{createServer}from"node:http";const WRITER_ID_RE=/^(agent-[^/]+|principal-[^/]+|file-system|git-upstream|openknowledge-service)$/;function resolveGitDirDetailed(e){let t=resolve(e,`.git`),s;try{s=statSync(t)}catch(e){let s=e.code;return s===`ENOENT`||s===`ENOTDIR`?{kind:`absent`}:{kind:`inaccessible`,gitPath:t,cause:e}}if(s.isDirectory())return{kind:`directory`,path:t};if(s.isFile()){let s;try{s=readFileSync(t,`utf-8`).trim()}catch(e){return{kind:`malformed-pointer`,gitPath:t,target:``,cause:e}}let g=s.match(/^gitdir:\s*(.+)$/);return g?{kind:`linked`,path:resolve(e,g[1])}:{kind:`malformed-pointer`,gitPath:t,target:``}}return{kind:`absent`}}function resolveGitDir(e){let t=resolveGitDirDetailed(e);return t.kind===`directory`||t.kind===`linked`?t.path:null}function resolveShadowDir(e){let t=resolveGitDirDetailed(e);switch(t.kind){case`directory`:return resolve(t.path,`ok`);case`linked`:if(!existsSync(t.path))throw new MalformedGitPointerError(resolve(e,`.git`),t.path);return resolve(t.path,`ok`);case`malformed-pointer`:throw new MalformedGitPointerError(t.gitPath,t.target,{cause:t.cause});case`inaccessible`:throw new GitDirAccessError(t.gitPath,{cause:t.cause});case`absent`:return resolve(e,`.git/ok`)}}var MalformedGitPointerError=class extends Error{gitPointerPath;resolvedTarget;constructor(e,t,s){let g=t?`references a missing or unreadable gitdir at ${t}`:`is unreadable or has no valid gitdir: pointer`;super(`\`.git\` pointer at ${e} ${g}. Run \`git worktree prune\` from the source repo and try again.`,s),this.name=`MalformedGitPointerError`,this.gitPointerPath=e,this.resolvedTarget=t}},GitDirAccessError=class extends Error{gitPath;constructor(e,t){let s=t?.cause!==void 0&&t.cause!==null&&typeof t.cause==`object`&&`code`in t.cause&&typeof t.cause.code==`string`?` (${t.cause.code})`:``;super(`Cannot access \`.git\` at ${e}${s}. Check filesystem permissions and that the volume is mounted.`,t),this.name=`GitDirAccessError`,this.gitPath=e}};function getShadowRepoPath(e){let t;try{t=resolveShadowDir(e)}catch(e){if(e instanceof MalformedGitPointerError||e instanceof GitDirAccessError)return null;throw e}return existsSync(resolve(t,`HEAD`))?t:null}function getWipRefPattern(e){return`refs/wip/${e}/`}const OK_CONTRIBUTORS_PREFIX=`ok-contributors: `;function parseContributors(e){if(!e)return[];let t=[];for(let s of e.split(`
2
2
  `)){let e=s.trim();if(e.startsWith(OK_CONTRIBUTORS_PREFIX))try{let s=JSON.parse(e.slice(17));if(typeof s==`object`&&s&&`id`in s&&typeof s.id==`string`&&`name`in s&&typeof s.name==`string`&&`docs`in s&&Array.isArray(s.docs)&&s.docs.every(e=>typeof e==`string`)&&(!(`colorSeed`in s)||typeof s.colorSeed==`string`)){let e=s;if(`summaries`in e){let t=e.summaries;(!Array.isArray(t)||!t.every(e=>typeof e==`string`))&&delete e.summaries}t.push(s)}}catch{}}return t}const OK_CHECKPOINT_PREFIX=`ok-checkpoint-v1: `;function parseCheckpoint(e){if(!e)return null;for(let t of e.split(`
3
3
  `)){let e=t.trim();if(!e.startsWith(OK_CHECKPOINT_PREFIX))continue;let s;try{s=JSON.parse(e.slice(18))}catch{return null}if(typeof s!=`object`||!s)return null;let g=s,S=g.kind,w=g.metadata;if(typeof w!=`object`||!w)return null;let E=typeof g.docName==`string`?g.docName:null,D=typeof g.size==`number`&&Number.isFinite(g.size)?g.size:null;if(S===`bridge-merge-loss`){let e=w;return Array.isArray(e.lostSubstrings)&&e.lostSubstrings.every(e=>typeof e==`string`)?{kind:`bridge-merge-loss`,docName:E,size:D,metadata:{lostSubstrings:e.lostSubstrings}}:null}if(S===`external-change-rescue`){let e=w;return typeof e.incomingDiskSha==`string`?{kind:`external-change-rescue`,docName:E,size:D,metadata:{incomingDiskSha:e.incomingDiskSha}}:null}return null}return null}function formatCheckpointBodyLine(e){let t={kind:e.kind,metadata:e.metadata};return e.docName!==null&&(t.docName=e.docName),e.size!==null&&(t.size=e.size),`${OK_CHECKPOINT_PREFIX}${JSON.stringify(t)}`}const OK_ACTOR_PREFIX=`ok-actor: `;function formatOkActor(e){let{summaries:t,previous_paths:s,...g}=e,S={...g};return t&&t.length>0&&(S.summaries=t),s&&s.length>0&&(S.previous_paths=s),`${OK_ACTOR_PREFIX}${JSON.stringify(S)}`}function parseOkActorObject(e){if(e.v!==1||!(`display_name`in e)||typeof e.display_name!=`string`||!(`docs`in e)||!Array.isArray(e.docs))return null;let t=typeof e.principal==`string`?e.principal:null,s=typeof e.agent_session==`string`?e.agent_session:null,g;if(typeof e.writer_id==`string`&&e.writer_id.length>0)g=e.writer_id;else if(s)g=`agent-${s}`;else if(t)g=t;else switch(e.display_name){case`File System`:g=`file-system`;break;case`Git (upstream)`:g=`git-upstream`;break;default:g=`openknowledge-service`}let S=`summaries`in e&&Array.isArray(e.summaries)&&e.summaries.every(e=>typeof e==`string`)?e.summaries:void 0,w=parsePreviousPaths(e);return{v:1,writer_id:g,principal:t,agent_session:s,agent_type:typeof e.agent_type==`string`?e.agent_type:null,client_name:typeof e.client_name==`string`?e.client_name:null,client_version:typeof e.client_version==`string`?e.client_version:null,label:typeof e.label==`string`?e.label:null,display_name:e.display_name,color_seed:typeof e.color_seed==`string`?e.color_seed:`unknown`,docs:e.docs.filter(e=>typeof e==`string`),...S&&S.length>0?{summaries:S}:{},...w&&w.length>0?{previous_paths:w}:{}}}function parsePreviousPaths(e){if(!(`previous_paths`in e)||!Array.isArray(e.previous_paths))return;let t=[];for(let s of e.previous_paths){if(typeof s!=`object`||!s)continue;let e=s;typeof e.from!=`string`||typeof e.to!=`string`||t.push({from:e.from,to:e.to})}return t}function parseOkActors(e){if(!e)return[];let t=[];for(let s of e.split(`
4
4
  `)){let e=s.trim();if(!e.startsWith(OK_ACTOR_PREFIX))continue;let g;try{g=JSON.parse(e.slice(10))}catch{continue}if(typeof g!=`object`||!g)continue;let S=parseOkActorObject(g);S&&t.push(S)}return t}function okActorToShadowContributor(e){let t={v:1,id:e.writer_id,name:e.display_name,colorSeed:e.color_seed,docs:e.docs};return e.summaries&&e.summaries.length>0&&(t.summaries=e.summaries),t}function readContributors(e){let t=parseOkActors(e);return t.length>0?t.map(okActorToShadowContributor):parseContributors(e)}function formatWipSubject(e){return e.length===0?`wip: auto-save`:e.length===1?`wip: ${e[0]}`:`wip: ${e.length} docs`}function formatReconcileSubject(e){return`reconcile: ${e}`}function formatRollbackSubject(e,t){return`rollback: ${e} to ${t.slice(0,7)}`}function formatParkSubject(e,t){return`park: ${e} -> ${t}`}function formatRenameSubject(e,t){return`rename: ${e} -> ${t}`}function formatCheckpointSubject(e){return`checkpoint: ${e}`}function formatImportSubject(e,t){return e?`import: from ${e.slice(0,8)}..${t.slice(0,8)}`:`import: initial at ${t.slice(0,8)}`}const SUBJECT_LINE_BREAK_RE=RegExp(`[\\r\\n\\v\\f\\u0085\\u2028\\u2029]`,`g`);function stripLineBreaks(e){return e.replace(SUBJECT_LINE_BREAK_RE,` `)}function composeCommitSubject(e,t){let s=stripLineBreaks(e);if(t.length===0)return s;if(t.length>=2)return`${s} (${t.length} edits)`;let[g]=t;if(g===void 0)return s;let S=stripLineBreaks(g),w=`${s} — ${S}`;if(w.length<=72)return w;let E=`${s} — `,D=72-E.length-1;return D<=0?w.slice(0,72):`${E}${S.slice(0,D)}…`}function parseWriterId(e){return WRITER_ID_RE.test(e)?e.startsWith(`agent-`)?{id:e,classification:`agent`,isAgent:!0}:e.startsWith(`principal-`)?{id:e,classification:`principal`,isAgent:!1}:e===`file-system`?{id:e,classification:`classified-file-system`,isAgent:null}:e===`git-upstream`?{id:e,classification:`classified-git-upstream`,isAgent:null}:e===`openknowledge-service`?{id:e,classification:`classified-openknowledge-service`,isAgent:null}:{id:e,classification:`unknown`,isAgent:null}:{id:e,classification:`unknown`,isAgent:null}}var require_err_helpers=__commonJSMin$1(((e,t)=>{let s=e=>e&&typeof e.message==`string`,g=e=>{if(!e)return;let t=e.cause;if(typeof t==`function`){let t=e.cause();return s(t)?t:void 0}else return s(t)?t:void 0},S=(e,t)=>{if(!s(e))return``;let w=e.stack||``;if(t.has(e))return w+`
@@ -1618,4 +1618,4 @@ In headless mode, write the recap into the research article's "Further reading"
1618
1618
  `).split(`
1619
1619
  `),s=[],g=!1,S=``;for(let e of t){let t=/^\s{0,3}([`~]{3,})/.exec(e);if(t){g?RegExp(`^\\s{0,3}${S[0]==="`"?"`":`~`}{${S.length},}\\s*$`).test(e)&&(g=!1,S=``):(g=!0,S=t[1]);continue}if(g)continue;let w=stripInlineCodeSpans(e);for(TAG_VALUE_RE.lastIndex=0;;){let e=TAG_VALUE_RE.exec(w);if(e===null)break;let t=e[2];t&&s.push(t)}}return s}var TagIndex=class{contentDir;contentFilter;state=createEmptyState();constructor(e){this.contentDir=e.contentDir,this.contentFilter=e.contentFilter}updateDocumentFromMarkdown(e,t){if(!(isSystemDoc(e)||isConfigDoc(e)))try{let{frontmatter:s,body:g}=stripFrontmatter(t),S=extractFrontmatterTags(s?unwrapFrontmatterFences(s):``),w=extractInlineTagsFromBody(g),E=new Set([...S,...w]),D=new Set;for(let e of E)for(let t of expandTagToHierarchy(e))D.add(t);this.applyDocSnapshot(e,E,D)}catch(t){console.warn(`[tag-index] Failed to scan ${e} for tag extraction:`,t),this.deleteDocument(e)}}deleteDocument(e){if(isSystemDoc(e)||isConfigDoc(e))return;let t=this.state.byDoc.get(e);if(t){for(let s of t){let t=this.state.byTag.get(s);t&&(t.delete(e),t.size===0&&this.state.byTag.delete(s))}this.state.byDoc.delete(e),this.state.byDocLiteral.delete(e)}}renameDocument(e,t,s){this.deleteDocument(e),this.updateDocumentFromMarkdown(t,s)}getDocsForTag(e){let t=this.state.byTag.get(e);return t?[...t].sort((e,t)=>e.localeCompare(t)):[]}getDocsForTagWithMatches(e){let t=this.state.byTag.get(e);if(!t)return[];let s=[];for(let g of t){let t=this.state.byDocLiteral.get(g);if(!t)continue;let S=tagsMatchingPrefix(t,e);s.push({docName:g,matchingTags:[...S].sort((e,t)=>e.localeCompare(t))})}return s.sort((e,t)=>e.docName.localeCompare(t.docName))}getAllTags(){let e=[...this.state.byTag.entries()],t=e.map(([e])=>e),s=new Set;for(let e of t){let t=e.indexOf(`/`);t>0&&s.add(e.slice(0,t));let g=t;for(;g>0;)s.add(e.slice(0,g)),g=e.indexOf(`/`,g+1)}return e.map(([e,t])=>({name:e,count:t.size,isLeaf:!s.has(e)})).sort((e,t)=>e.name.localeCompare(t.name))}init(){if(this.state=createEmptyState(),!existsSync(this.contentDir))return;let e=this.listDocsWithPaths();for(let{docName:t,filePath:s}of e)try{let e=readFileSync(s,`utf-8`);this.updateDocumentFromMarkdown(t,e)}catch(e){console.warn(`[tag-index] Failed to read ${t} during init:`,e)}}applyDocSnapshot(e,t,s){let g=this.state.byDoc.get(e)??new Set;for(let t of g){if(s.has(t))continue;let g=this.state.byTag.get(t);g&&(g.delete(e),g.size===0&&this.state.byTag.delete(t))}for(let t of s){let s=this.state.byTag.get(t);s||(s=new Set,this.state.byTag.set(t,s)),s.add(e)}s.size===0?(this.state.byDoc.delete(e),this.state.byDocLiteral.delete(e)):(this.state.byDoc.set(e,s),this.state.byDocLiteral.set(e,t))}listDocsWithPaths(){let e=[];this.walkContentDir(this.contentDir,e),e.sort((e,t)=>e.docName===t.docName?t.filePath.localeCompare(e.filePath):e.docName.localeCompare(t.docName));let t=new Set;return e.filter(({docName:e})=>t.has(e)?!1:(t.add(e),!0))}walkContentDir(e,t){let s;try{s=readdirSync(e,{withFileTypes:!0})}catch(t){console.warn(`[tag-index] Failed to read directory ${e}:`,t);return}for(let g of s){let s=join(e,g.name);if(g.isDirectory()){let e=relative(this.contentDir,s);if(this.contentFilter&&e&&this.contentFilter.isDirExcluded(e))continue;this.walkContentDir(s,t);continue}if(!g.isFile()||!isSupportedDocFile(g.name))continue;let S=relative(this.contentDir,s);this.contentFilter?.isExcluded(S)||t.push({docName:stripDocExtension(S),filePath:s})}}};const PARK_SNAPSHOT_ORIGIN=(()=>{let e=Object.freeze({origin:`park-snapshot`,paired:!0});return Object.freeze({source:`local`,skipStoreHooks:!1,context:e})})();function createServer$1(e){let{contentDir:t,projectDir:s=t,quiet:g=!0,debounce:S=2e3,maxDebounce:w=1e4,gitEnabled:E=!0,commitDebounceMs:D=3e4,wipRef:O=`refs/wip/main`,configHomedirOverride:k,enableTestRoutes:j=!1,shadowRepo:F,contentRoot:L,destroyTimeoutMs:B=1e4,localOpCliArgs:H,skipStateManifestCheck:q=!1}=e,J=getLogger(`server`);function Y(){let e=readConfigSafely({absPath:resolveConfigPath(`project-local`,s),sideline:!1,warn:e=>J.warn({message:e},`[config] could not read project-local config`)}),t=e.value.autoSync?.enabled;return t==null?(e.valid||J.warn({},`[config] project-local autoSync.enabled unavailable (config invalid) — falling back to project config`),readConfigSafely({absPath:resolveConfigPath(`project`,s),sideline:!1,warn:e=>J.warn({message:e},`[config] could not read project config`)}).value.autoSync?.enabled===!0):t===!0}initTelemetry();let ee=randomUUID(),te=getLocalDir(t);if(acquireServerLock(te,{port:e.port??0,worktreeRoot:s,kind:e.lockKind??`interactive`,capabilities:[`http`,`ws`]}),!q)try{assertCompatibleStateManifest({lockDir:te,shadowRepoDir:resolveShadowDir(s)})}catch(e){throw releaseServerLock(te),e}let ne=createBasenameIndex(),ae=(e,t)=>ne.resolveEmbed(e,t),oe,se,ce,ue,de,fe,me,ge=null,_e=null,ve=null,ye=null,Ce=new Set,we=!1,Te;function De(e){ge?.signal(e)}let je=2e3,Me=null;function Pe(){Me!==null&&clearTimeout(Me),Me=setTimeout(()=>{Me=null,se.saveToDisk().catch(e=>{console.warn(`[backlinks] Failed to persist debounced cache:`,e)})},2e3)}try{oe=createContentFilter({projectDir:s,contentDir:t,onAfterRebuild:()=>{se.rebuildFromDisk(getActiveBranch()).catch(e=>{getLogger(`server-factory`).warn({err:e},`[content-filter] backlink-index rebuild failed after onAfterRebuild`)});try{ce.init()}catch(e){getLogger(`server-factory`).warn({err:e},`[content-filter] tag-index rebuild failed after onAfterRebuild`)}try{let e=at?.pruneFileIndexNowExcluded()??0;e>0&&getLogger(`server-factory`).info({pruned:e},`[content-filter] pruned now-excluded entries from fileIndex`)}catch(e){getLogger(`server-factory`).warn({err:e},`[content-filter] fileIndex prune failed after onAfterRebuild`)}}}),se=new BacklinkIndex({projectDir:s,contentDir:t,contentFilter:oe}),ce=new TagIndex({contentDir:t,contentFilter:oe});try{ce.init()}catch(e){console.warn(`[server-factory] tag-index init failed; continuing with empty index:`,e)}ue={current:F},de=createPersistenceExtension({contentDir:t,projectDir:s,gitEnabled:E,commitDebounceMs:D,wipRef:O,shadowRef:ue,contentRoot:L,backlinkIndex:se,configHomedirOverride:k,getCurrentBranch:()=>st?.getLastKnownBranch()??null,resolveEmbed:ae,getPrincipal:()=>ye,onAgentCommit:()=>ge?.signal(`session-activity`),onDiskFlush:(e,t)=>ge?.emitDiskAck(e,t),onConfigRejected:(e,t)=>ge?.emitConfigValidationRejected(e,t)}),fe=new Hocuspocus({quiet:g,debounce:S,maxDebounce:w,extensions:[de.extension]});let B=fe.shouldUnloadDocument.bind(fe);fe.shouldUnloadDocument=e=>{if((we||Ce.has(e))&&B(e))return!0;let t=e.name;return isSystemDoc(t)||isConfigDoc(t)||getReconciledBase(t)!==void 0||e.getXmlFragment(`default`).length!==0||e.getText(`source`).length!==0?!1:B(e)},Te=async e=>{Ce.add(e);try{await fe.unloadDocument(e)}finally{Ce.delete(e)}},ge=new CC1Broadcaster(fe),_e=new AgentFocusBroadcaster(fe),ve=new AgentPresenceBroadcaster(fe),me=new AgentSessionManager(fe);let q=createLiveDerivedIndexExtension({backlinkIndex:se,tagIndex:ce,signalChannel:De});fe.configuration.extensions.push(q),fe.configuration.extensions.push({__kind:`principal-auth`,async onAuthenticate(e){let t=e.token,s=parseHocuspocusAuthToken(t),g=s?.expectedServerInstanceId;if(typeof g==`string`&&g.length>0&&g!==ee)throw new HocuspocusAuthRejection(`server-instance-mismatch`,`server instance mismatch: client claimed ${g}, this server is ${ee}`);let S=s?.expectedBranch,w=getActiveBranch();if(typeof S==`string`&&S.length>0&&S!==w)throw new HocuspocusAuthRejection(`branch-mismatch`,`branch mismatch: client claimed ${S}, server is on ${w}`);if(!s)return;let E=e.context;typeof s.principalId==`string`&&(ye&&s.principalId===ye.id?E.principalId=ye.id:ye?console.warn(JSON.stringify({event:`principal-token-mismatch`,claimed:s.principalId,loaded:ye.id})):E.principalId=s.principalId),typeof s.tabSessionId==`string`&&(E.tabSessionId=s.tabSessionId),E.kind=`human`}}),fe.configuration.extensions.push({__kind:`config-doc-admission-guard`,async onAuthenticate(e){if(!isConfigDoc(e.documentName))return;let t=e.request,s=t.socket?.remoteAddress;if(s!==void 0&&!isLoopbackAddress(s))throw Error(`config-doc admission requires loopback peer (peer=${s}, doc=${e.documentName})`);let g=e.requestHeaders,S=(g&&typeof g.get==`function`?g.get(`host`):null)??t.headers?.host??void 0;if(!isAllowedWorkspaceHostHeader(S))throw Error(`config-doc admission requires loopback Host header (host=${S??`<absent>`}, doc=${e.documentName})`)}}),fe.configuration.extensions.push({__kind:`system-doc-broadcast-guard`,async beforeHandleMessage(e){if(e.documentName!==`__system__`)return;let t=new IncomingMessage(e.update);if(t.readVarString(),t.readVarUint()===MessageType.BroadcastStateless)throw Error(`inbound BroadcastStateless on ${SYSTEM_DOC_NAME} rejected — server-only channel`)}});let J=createApiExtension({hocuspocus:fe,sessionManager:me,contentDir:t,contentFilter:oe,serverInstanceId:ee,getFileIndex:()=>at?at.getFileIndex():new Map,getAliasMap:()=>at?at.getAliasMap():new Map,enableTestRoutes:j,shadowRef:ue,flushGitCommit:()=>de.flushPendingGitCommit(),flushContributors:()=>de.flushContributors(),getCurrentBranch:()=>st?.getLastKnownBranch()??null,getDiskAckSVs:()=>ge?.getLatestDiskAckSVsAsBase64()??{},contentRoot:L,backlinkIndex:se,tagIndex:ce,signalChannel:De,agentFocusBroadcaster:_e,agentPresenceBroadcaster:ve,onAgentWrite:e.onAgentWrite,getSyncEngine:()=>vt,localOpCliArgs:H,projectDir:s,resolveEmbed:ae,getPrincipal:()=>ye,forceUnloadDocument:Te});fe.configuration.extensions.push(J),fe.configuration.extensions.push(createServerObserverExtension({mdManager,schema,shadowRef:ue,contentRoot:L,getCurrentBranch:()=>st?.getLastKnownBranch()??null,resolveEmbed:ae}))}catch(e){throw releaseServerLock(te),e}let Ie=null,Re=new Map,ze=[];function Be(e,t){let s=resolve(e,`rescue`),g=resolve(s,`${t}${getDocExtension(t)}`);return g.startsWith(`${s}/`)?g:null}function Ve(e){let t=fe.documents.get(e);if(!t)return null;let{frontmatter:s,body:g}=stripFrontmatter(t.getText(`source`).toString());return prependFrontmatter(s,g)}let Ue=(e,t)=>applyExternalChange(fe,e,t,ae),We=e=>{if(!e)return;let t=`[[${e}]]`;for(let[s]of fe.documents){if(isSystemDoc(s)||isConfigDoc(s))continue;let g=fe.documents.get(s);if(!g)continue;let S=g.getText(`source`).toString();if(S.includes(t))try{g.transact(()=>{applyDiskContentToDoc(g,S,ae,s)},FILE_WATCHER_ORIGIN)}catch(t){J.error({err:t,docName:s,assetBasename:e},`[asset-event] failed to re-render ${s} for asset basename ${e}`)}}},Ge=null,Ke=e=>{e&&(Ge===null&&(Ge=new Set,setImmediate(()=>{let e=Ge;if(Ge=null,e)try{for(let t of e)We(t)}catch(t){J.error({err:t,basenames:[...e]},`[asset-event] dedup rerender pass crashed`)}})),Ge.add(e))};function Xe(e){switch(e.kind){case`rename`:return e.newDocName;case`asset-create`:case`asset-delete`:return e.relativePath;default:return e.docName}}async function $e(e){try{switch(e.kind){case`create`:J.info({docName:e.docName},`[reconcile] create: ${e.docName}`),se.updateDocumentFromMarkdown(e.docName,e.content),Pe(),ce.updateDocumentFromMarkdown(e.docName,e.content),De(`files`),De(`backlinks`),De(`graph`),De(`tags`);break;case`update`:{let{docName:t,content:s}=e,g=fe.documents.get(t);if(!g){se.updateDocumentFromMarkdown(t,s),Pe(),ce.updateDocumentFromMarkdown(t,s),De(`backlinks`),De(`graph`),De(`tags`);return}let S=getReconciledBase(t)??``,w=Ve(t)??S,E=reconcile({docName:t,base:S,ours:w,theirs:s}),D=contentHash(S).slice(0,6),O=contentHash(w).slice(0,6),k=contentHash(s).slice(0,6);switch(J.info({docName:t,base:D,ours:O,theirs:k,result:E.kind},`[reconcile] ${t} base=${D} ours=${O} theirs=${k} result=${E.kind}`),E.kind){case`noop`:se.updateDocumentFromMarkdown(t,s),Pe(),ce.updateDocumentFromMarkdown(t,s),De(`backlinks`),De(`graph`),De(`tags`);break;case`clean`:try{Ue(t,E.newContent),setReconciledBase(t,E.newContent),incrementReconcile(),se.updateDocumentFromMarkdown(t,s),Pe(),ce.updateDocumentFromMarkdown(t,s),De(`backlinks`),De(`graph`),De(`tags`)}catch(e){J.error({err:e,docName:t},`[reconcile] failed to apply clean content to Y.Doc for ${t}`),setReconciledBase(t,s)}break;case`merged`:try{Ue(t,E.newContent),setReconciledBase(t,E.newContent),incrementReconcile(),se.updateDocumentFromMarkdown(t,s),Pe(),ce.updateDocumentFromMarkdown(t,s),De(`backlinks`),De(`graph`),De(`tags`)}catch(e){J.error({err:e,docName:t},`[reconcile] failed to apply merged content to Y.Doc for ${t}`),setReconciledBase(t,s)}break;case`conflicts`:try{Ue(t,E.newContent),setReconciledBase(t,E.newContent),incrementReconcile(),incrementConflict(),se.updateDocumentFromMarkdown(t,s),Pe(),ce.updateDocumentFromMarkdown(t,s),De(`backlinks`),De(`graph`),De(`tags`)}catch(e){J.error({err:e,docName:t},`[reconcile] failed to apply conflict content to Y.Doc for ${t}`),setReconciledBase(t,s)}break;case`refused`:{incrementConflict();let e=g.getMap(`lifecycle`);e.set(`status`,`conflict`),e.set(`reason`,E.reason);break}}break}case`delete`:{let{docName:t}=e,s=fe.documents.get(t);if(!s){se.deleteDocument(t),Pe(),ce.deleteDocument(t),De(`files`),De(`backlinks`),De(`graph`),De(`tags`);return}let g=getReconciledBase(t)??``,S=Ve(t)??``,w=S!==g;if(w&&ue.current){let e=ue.current,s=st?.getLastKnownBranch()??`main`;queueMicrotask(()=>{saveInMemoryCheckpoint(e,L??``,{kind:`external-change-rescue`,docName:t,contents:S,label:`External change recovered @ ${new Date().toISOString()}`,branch:s,metadata:{incomingDiskSha:``}}).then(()=>{incrementRescueBuffer(),J.info({docName:t},`[reconcile] rescue checkpoint saved (delete): ${t}`)}).catch(e=>{J.error({docName:t,err:e},`[reconcile] rescue checkpoint write failed: ${t}`)})})}s.getMap(`lifecycle`).set(`status`,`deleted-upstream`),deleteReconciledBase(t),se.deleteDocument(t),Pe(),ce.deleteDocument(t),J.info({docName:t,isDirty:w},`[reconcile] delete: ${t} (dirty=${w})`),fe.closeConnections(t),await Te(s),De(`files`),De(`backlinks`),De(`graph`),De(`tags`);break}case`rename`:{let{oldDocName:t,newDocName:s,content:g}=e,S=fe.documents.get(t);if(deleteReconciledBase(t),setReconciledBase(s,g),se.renameDocument(t,s,g),Pe(),ce.renameDocument(t,s,g),S){let e=S.getMap(`lifecycle`);e.set(`status`,`renamed`),e.set(`newPath`,s)}J.info({oldDocName:t,newDocName:s},`[reconcile] rename: ${t} → ${s}`),De(`files`),De(`backlinks`),De(`graph`),De(`tags`);break}case`conflict`:{let{docName:t}=e,s=fe.documents.get(t);if(!s)return;let g=s.getMap(`lifecycle`);g.set(`status`,`conflict`),g.set(`reason`,`conflict-markers`),J.info({docName:t},`[reconcile] conflict markers detected: ${t}`);break}case`asset-create`:ne.add(e.relativePath),De(`files`),Ke(basename(e.relativePath));break;case`asset-delete`:ne.remove(e.relativePath),De(`files`),Ke(basename(e.relativePath));break;default:assertNeverDiskEvent(e)}}catch(t){let s=Xe(e);J.error({err:t,kind:e.kind,label:s},`[reconcile] failed to handle ${e.kind} for ${s}`)}}let nt=[];async function rt(e){if(isBatchInProgress()){nt.push(e);return}await $e(e)}async function it(){let e=nt.splice(0,nt.length);for(let t of e)await $e(t)}let at=null,st=null,vt=null,Tt=null;async function Et(e){if(fe.documents.size===0)return;let t=!1,s=new Promise(e=>{fe.configuration.extensions.push({async afterUnloadDocument({instance:s}){!t&&s.getDocumentsCount()===0&&(t=!0,e())}})}),g=Array.from(fe.documents.keys());fe.closeConnections(),fe.flushPendingStores();for(let e of fe.documents.values())e.getConnectionsCount()===0&&fe.unloadDocument(e).catch(t=>{console.warn(JSON.stringify({event:`ok-shutdown-unload-document-failed`,docName:e.name,reason:t instanceof Error?t.message:String(t)}))});let S,w=new Promise((s,w)=>{S=setTimeout(()=>{t=!0;let s=Array.from(fe.documents.keys()),S=[],E=[];if(ue.current){for(let e of s)if(!(isSystemDoc(e)||isConfigDoc(e)))try{let t=Ve(e);if(t===null){J.warn({docName:e},`[rescue] skipping ${e} — document dropped from map mid-rescue`),E.push(e);continue}let s=Be(ue.current.gitDir,e);if(!s){J.warn({docName:e,gitDir:ue.current.gitDir},`[rescue] path-traversal guard rejected docName: ${e}`),E.push(e);continue}mkdirSync(dirname(s),{recursive:!0}),writeFileSync(s,t,`utf-8`),incrementRescueBuffer(),S.push(e),J.info({docName:e},`[rescue] rescue buffer saved on flush timeout: ${e}`)}catch(t){E.push(e),J.error({err:t,docName:e},`[rescue] failed to write rescue buffer for ${e}`)}}else J.warn({stillLoadedCount:s.length},`[rescue] shadow repo unavailable at flush timeout — ${s.length} doc(s) will be lost: [${s.join(`, `)}]`),E.push(...s);let D=S.length>0||E.length>0?` — rescued [${S.join(`, `)}]${E.length>0?`, lost [${E.join(`, `)}]`:``}`:``;w(Error(`flushAllStoresAndWait timeout after ${e}ms — ${s.length}/${g.length} docs did not unload: [${s.join(`, `)}]${D}`))},e)});try{await Promise.race([s,w])}finally{S!==void 0&&clearTimeout(S)}}async function Dt(){return Tt||(Tt=(async()=>{let e=Date.now(),t=[];we=!0,Me!==null&&(clearTimeout(Me),Me=null);let g,S=await Promise.race([Ft.then(()=>`completed`,e=>(J.debug({err:e},`[server] init incomplete during shutdown`),`failed`)),new Promise(e=>{g=setTimeout(()=>e(`timeout`),5e3)})]);g!==void 0&&clearTimeout(g),S===`timeout`&&J.warn({},`[server] init did not complete within 5s during shutdown`);let w=fe.documents.size;try{try{try{st&&=(await st.unsubscribe(),null),at&&=(await at.unsubscribe(),null);for(let{docName:e,cleanup:t}of ze)try{await t()}catch(t){J.warn({err:t,docName:e},`[server] failed to stop config-file-watcher for ${e}`)}ze.length=0}catch(e){t.push({phase:`watcher-unsubscribe`,error:e instanceof Error?e.message:String(e)}),J.error({err:e},`[server] shutdown phase-1 watcher unsubscribe failed`)}try{ge?.destroy(),ve?.destroy(),Ie&&=(await Ie.disconnect(),null);for(let[e,t]of Re)try{await t.disconnect()}catch(t){J.warn({err:t,docName:e},`[server] failed to disconnect ${e} during shutdown`)}Re.clear()}catch(e){t.push({phase:`cc1-teardown`,error:e instanceof Error?e.message:String(e)}),J.error({err:e},`[server] shutdown phase-1b CC1 teardown failed`)}try{await me.closeAll()}catch(e){t.push({phase:`agent-session-drain`,error:e instanceof Error?e.message:String(e)}),J.error({err:e},`[server] shutdown phase-2 agent session drain failed`)}try{await Et(B)}catch(e){t.push({phase:`flush-all-stores`,error:e instanceof Error?e.message:String(e)}),J.error({err:e},`[server] shutdown phase-3 flush failed`)}let e;try{await Promise.race([(async()=>{await de.flushPendingGitCommit(),await de.waitForPendingCommits()})(),new Promise((t,s)=>{e=setTimeout(()=>s(Error(`L2 git flush timeout`)),B)})])}catch(e){t.push({phase:`git-commit-flush`,error:e instanceof Error?e.message:String(e)}),J.error({err:e},`[server] shutdown phase-4 git commit flush failed`)}finally{e!==void 0&&clearTimeout(e)}try{vt&&=(await vt.destroy(),null)}catch(e){t.push({phase:`sync-engine-stop`,error:e instanceof Error?e.message:String(e)}),J.error({err:e},`[server] shutdown sync-engine-stop failed`)}}finally{if(ue.current){try{let e=(await esm_default({baseDir:s,timeout:{block:5e3}}).revparse(`HEAD`)).trim();e&&writeFileSync(resolve(ue.current.gitDir,`last-known-head`),e,`utf-8`)}catch{}try{destroyShadowRepo(ue.current)}catch(e){t.push({phase:`shadow-repo-release`,error:e instanceof Error?e.message:String(e)}),J.error({err:e},`[server] shutdown phase-5 destroyShadowRepo failed`)}}let g=Date.now()-e;t.length===0?J.info({documentCount:w,durationMs:g},`[server] shutdown flushed ${w} documents in ${g}ms`):J.warn({documentCount:w,durationMs:g,phaseErrors:t},`[server] shutdown flushed ${w} documents in ${g}ms with ${t.length} phase error(s)`)}}finally{try{releaseServerLock(te)}catch(e){t.push({phase:`server-lock-release`,error:e instanceof Error?e.message:String(e)}),J.error({err:e},`[server] shutdown phase-6 releaseServerLock failed`)}try{await shutdownTelemetry()}catch(e){t.push({phase:`telemetry-shutdown`,error:e instanceof Error?e.message:String(e)})}}})(),Tt)}let jt=[];async function Mt(){try{ye=await loadPrincipal(t),J.info({principalId:ye.id},`[server] principal loaded`)}catch(e){J.warn({err:e},`[server] principal load failed — browser writes will use SERVICE_WRITER`)}if(!ue.current)try{ue.current=await initShadowRepo(s),J.info({gitDir:ue.current.gitDir},`[server] history repo initialized at ${ue.current.gitDir}`)}catch(e){J.error({err:e},`[server] history repo init failed`),jt.push(`shadow-repo`)}if(ue.current){let e=null;try{e=loadRenameLogIndex(ue.current.gitDir),sweepLazyPopOrphans(ue.current.gitDir,e),setRenameLogIndex(ue.current.gitDir,e),J.info({entries:e.byTo.size},`[server] rename log loaded (${e.byTo.size} entries)`)}catch(e){J.warn({err:e},`[rename-log] boot-time load/sweep failed; rename history unavailable`)}if(e){let t=1e4;try{await Promise.race([gcRenameLog(ue.current,e,{rebuild:!0}),new Promise((e,s)=>setTimeout(()=>s(Error(`boot-time GC exceeded ${t}ms`)),t))])}catch(e){J.warn({err:e},`[rename-log] boot-time GC/rebuild failed; index loaded without GC`)}}}if(ue.current)try{await shadowGit(ue.current).raw(`rev-parse`,`--git-dir`)}catch(e){let t=e instanceof Error?e.message:String(e);if(t.includes(`not a git repository`)||t.includes(`invalid object`)){J.warn({},`[server] history repo appears corrupted — reinitializing`);try{ue.current=await initShadowRepo(s)}catch(e){J.error({err:e},`[server] history repo reinit failed`),ue.current=void 0,jt.includes(`shadow-repo`)||jt.push(`shadow-repo`)}}else J.error({err:e},`[server] history repo check failed (transient?)`)}if(ue.current)try{let e=resolve(ue.current.gitDir,`last-known-head`),t=null;try{t=readFileSync(e,`utf-8`).trim()||null}catch{}let g=null;try{g=(await esm_default({baseDir:s,timeout:{block:1e4}}).revparse(`HEAD`)).trim()||null}catch{}if(g!==null){if(g!==t){let e=`main`;try{let t=(await esm_default({baseDir:s,timeout:{block:1e4}}).raw(`rev-parse`,`--abbrev-ref`,`HEAD`)).trim();t&&t!==`HEAD`&&(e=t)}catch{}J.info({lastKnownHead:t,currentHead:g,branch:e},`[head-drift] lastKnownHead=${t??`null`}, currentHead=${g}, action=import`);try{await commitUpstreamImport(ue.current,L??``,t,g,e),incrementUpstreamImport()}catch(e){J.warn({err:e},`[head-drift] commitUpstreamImport failed — continuing`)}}else J.info({currentHead:g},`[head-drift] lastKnownHead=${t??`null`}, currentHead=${g}, action=noop`);try{writeFileSync(e,g,`utf-8`)}catch(e){J.warn({err:e},`[head-drift] failed to write last-known-head`)}}}catch(e){J.warn({err:e},`[head-drift] check failed — continuing`)}try{let e=recoverPendingManagedRename(t);if(e.recovered&&e.journal){let t=e.journal.version===2?e.journal.fromPath:e.journal.sourceDocName,s=e.journal.version===2?e.journal.toPath:e.journal.destinationDocName;J.warn({journalVersion:e.journal.version,fromPath:t,toPath:s,restoredDocNames:e.restoredDocNames},`[managed-rename] recovered pending rename ${t} -> ${s}`)}}catch(e){J.error({err:e},`[server] managed rename recovery failed`),jt.push(`managed-rename-recovery`)}try{let e=cleanupOrphanUploadTempfiles(t);(e.deleted>0||e.errors>0)&&J.info({scanned:e.scanned,deleted:e.deleted,errors:e.errors},`[upload-tempfile-sweep] swept ${e.deleted} orphan tempfile(s)`)}catch(e){J.error({err:e},`[server] upload-tempfile sweep failed`),jt.push(`upload-tempfile-sweep`)}try{Ie=await fe.openDirectConnection(SYSTEM_DOC_NAME),ge?.emitServerInfo(ee,getActiveBranch())}catch(e){J.error({err:e},`[server] failed to open __system__ direct connection — CC1 push disabled`),jt.push(`cc1-push`)}for(let e of CONFIG_DOC_NAMES)try{let t=await fe.openDirectConnection(e);Re.set(e,t)}catch(t){J.error({err:t,docName:e},`[server] failed to open ${e} direct connection — config bind degraded`),jt.push(`config-doc:${e}`)}let e=new Map([[CONFIG_DOC_NAME_PROJECT,resolveConfigPath(`project`,s)],[CONFIG_DOC_NAME_PROJECT_LOCAL,resolveConfigPath(`project-local`,s)],[CONFIG_DOC_NAME_USER,resolveConfigPath(`user`,s,k)]]);for(let t of CONFIG_DOC_NAMES){let s=e.get(t);if(s)try{J.info({docName:t,path:s},`[config-file-watcher] starting`);let e=await startConfigFileWatcher(s,e=>{let s=fe.documents.get(t);J.info({docName:t,hasDocument:s!==void 0,contentLength:e.length},`[config-file-watcher] file changed`);let g=applyExternalConfigChange(s??null,t,e,de.configPersistenceCtx);if(J.info({docName:t,outcome:g},`[config-file-watcher] applyExternalConfigChange outcome`),t===`__config__/project`||t===`__local__/project`){let e=Y();vt?.setEnabled(e).catch(t=>{J.warn({err:t,enabled:e},`[sync] failed to apply autoSync.enabled from config`)})}});ze.push({docName:t,cleanup:e}),J.info({docName:t,path:s},`[config-file-watcher] started`)}catch(e){J.warn({err:e,docName:t,path:s},`[config-file-watcher] failed to start for ${t}`),jt.push(`config-file-watcher:${t}`)}}try{let e=resolve(t,`.okignore`),g=resolve(s,`.gitignore`),S=J;S.info({okignorePath:e,gitignorePath:g},`[ignore-watcher] starting multi-path watcher for .okignore + .gitignore`);let w=await startMultiPathConfigFileWatcher([e,g],(t,g)=>{(async()=>{if(t===e)try{let e=applyExternalConfigChange(fe.documents.get(`__config__/okignore`)??null,CONFIG_DOC_NAME_OKIGNORE,g,de.configPersistenceCtx);S.info({docName:CONFIG_DOC_NAME_OKIGNORE,outcome:e},`[ignore-watcher] applyExternalConfigChange outcome`)}catch(e){S.error({err:e,changedPath:relative(s,t)},`[ignore-watcher] applyExternalConfigChange failed; rebuild proceeds independently`)}let w=await oe.rebuildIgnorePatterns();if(w.ok)S.info({changedPath:relative(s,t),patternCount:w.patternCount,nestedFileCount:w.nestedFileCount,durationMs:w.durationMs},`[ignore-watcher] rebuild succeeded — broadcasting files channel`),ge?.signal(`files`);else{let e=relative(s,t)||`.`;S.warn({changedPath:e,error:w.error.message},`[ignore-watcher] rebuild failed — emitting config-ignore-nested-error`),ge?.emitConfigIgnoreNestedError(e,w.error.message)}})().catch(e=>{S.error({err:e,changedPath:relative(s,t)||`.`},`[ignore-watcher] handler threw`)})});ze.push({docName:`__ignore-files__`,cleanup:w}),S.info({okignorePath:e,gitignorePath:g},`[ignore-watcher] multi-path watcher started`)}catch(e){J.warn({err:e,projectDir:s,contentDir:t},`[ignore-watcher] failed to start multi-path watcher`),jt.push(`ignore-files-watcher`)}let g=resolveGitDir(s),S=g?readBranchFromHead(g)??`main`:`main`;switchReconciledBaseScope(S),se.switchBranch(S);try{{let e=getActiveBranch();try{if(await se.loadFromDisk(e)){let t=await se.reconcileWithDisk(e);(t.added>0||t.updated>0||t.deleted>0)&&J.info(t,`[backlinks] startup reconcile: offline changes applied`)}else await se.rebuildFromDisk(e);se.saveToDisk().catch(t=>{console.warn(`[backlinks] Failed to persist startup cache for ${e}:`,t)})}catch(t){J.error({err:t,branch:e},`[backlinks] startup init failed; index will populate incrementally via watcher`)}}at=await startWatcher(t,rt,oe),ce.init();let e=0;try{seedBasenameIndex({contentDir:t,contentFilter:oe,basenameIndex:ne,onSkip:(t,s,g)=>{e++,J.warn({reason:t,code:s,path:g},`[basename-index] skipped entry during seed (${t}${s?` ${s}`:``})`)}}),e>0&&(J.warn({count:e},`[basename-index] startup seed completed with ${e} skipped entries — embeds under inaccessible subtrees will not resolve`),jt.push(`basename-index-partial`))}catch(e){J.error({err:e},`[basename-index] startup seed failed`),jt.push(`basename-index`)}}catch(e){J.error({err:e},`[server] disk bridge watcher failed to start`),jt.push(`file-watcher`)}try{st=await startHeadWatcher(s,async({trigger:e})=>{if(J.info({trigger:e},`[batch] begin trigger=${e}`),incrementBatch(),fe.flushPendingStores(),await de.flushPendingGitCommit(),setBatchInProgress(!0),ue.current){let e=getActiveBranch(),t=resolveGitDir(s),g=t?readBranchFromHead(t)??e:e,S=[];for(let[e,t]of fe.documents){if(isSystemDoc(e)||isConfigDoc(e))continue;let s=null;if(t.transact(()=>{s=Ve(e)},PARK_SNAPSHOT_ORIGIN),s===null)continue;let g=getReconciledBase(e)??s;S.push({docName:e,markdown:s,diskSnapshot:g})}if(S.length>0)try{let t=await parkBranch(ue.current,e,SERVICE_WRITER.id,S,g);t&&(incrementPark(),J.info({count:S.length,branch:e,sha:t.slice(0,8)},`[history] parked ${S.length} docs on ${e} → ${t.slice(0,8)}`))}catch(e){J.error({err:e},`[shadow] park failed`)}}},async e=>{let s=nt.length,g=e.newBranch??`main`;if(J.info({kind:e.batchKind,headMoved:e.headMoved,docs:s,timeout:!!e.timeout},`[batch] end kind=${e.batchKind} headMoved=${e.headMoved} docs=${s}${e.timeout?` timeout`:``}`),e.batchKind===`within-branch`)setBatchInProgress(!1),await it(),await de.flushDeferredStores(`within-branch`);else{incrementBranchSwitch(),nt.splice(0,nt.length),switchReconciledBaseScope(g),Me!==null&&(clearTimeout(Me),Me=null),se.switchBranch(g),oe.rebuildDirCount();try{let e=0;ne.clear(),seedBasenameIndex({contentDir:t,contentFilter:oe,basenameIndex:ne,onSkip:(t,s,S)=>{e++,J.warn({reason:t,code:s,path:S,branch:g},`[basename-index] skipped entry during branch-switch reseed (${t}${s?` ${s}`:``})`)}}),e>0&&(J.warn({count:e,branch:g},`[basename-index] branch-switch reseed completed with ${e} skipped entries — embeds under inaccessible subtrees will not resolve on this branch`),jt.includes(`basename-index-partial`)||jt.push(`basename-index-partial`))}catch(e){J.error({err:e,branch:g},`[basename-index] branch-switch reseed failed`)}for(let[e,s]of fe.documents)if(!(isSystemDoc(e)||isConfigDoc(e)))try{let S=safeContentPath(e,t);if(!existsSync(S)){let t=getReconciledBase(e)??``,S=Ve(e)??``;if(S!==t&&ue.current){let t=ue.current;queueMicrotask(()=>{saveInMemoryCheckpoint(t,L??``,{kind:`external-change-rescue`,docName:e,contents:S,label:`External change recovered @ ${new Date().toISOString()}`,branch:g,metadata:{incomingDiskSha:``}}).then(()=>{incrementRescueBuffer(),J.info({docName:e},`[reconcile] rescue checkpoint saved on branch switch: ${e}`)}).catch(t=>{J.error({docName:e,err:t},`[reconcile] rescue checkpoint write failed: ${e}`)})})}s.getMap(`lifecycle`).set(`status`,`deleted-upstream`),J.info({docName:e,branch:g},`[branch-switch] tombstone: ${e} (not on ${g})`);continue}let w=readFileSync(S,`utf-8`);Ue(e,w),setReconciledBase(e,w),J.info({docName:e},`[branch-switch] reset: ${e}`)}catch(t){J.error({err:t,docName:e},`[branch-switch] failed to reset ${e}`)}J.info({branch:g,docCount:fe.documents.size},`[branch-switch] loaded branch ${g} (${fe.documents.size} docs)`);try{if(await se.loadFromDisk(g)){let e=await se.reconcileWithDisk(g);(e.added>0||e.updated>0||e.deleted>0)&&J.info(e,`[backlinks] branch-switch reconcile for ${g}`)}else await se.rebuildFromDisk(g);se.saveToDisk(g).catch(e=>{console.warn(`[backlinks] Failed to persist branch cache for ${g}:`,e)})}catch(e){J.error({err:e,branch:g},`[backlinks] branch-switch rebuild failed; backlinks may be stale`)}if(ce.init(),ue.current&&e.batchKind===`cross-branch`){let e=0;for(let[t]of fe.documents)if(!(isSystemDoc(t)||isConfigDoc(t)))try{let s=await readParkedState(ue.current,g,SERVICE_WRITER.id,t);if(!s||s.markdown===s.diskSnapshot)continue;let S=getReconciledBase(t);if(!S)continue;let w=reconcile({docName:t,base:s.diskSnapshot,ours:s.markdown,theirs:S});switch(w.kind){case`merged`:case`clean`:Ue(t,w.newContent),setReconciledBase(t,w.newContent),e++;break;case`conflicts`:Ue(t,w.newContent),setReconciledBase(t,w.newContent),incrementConflict(),e++;break;case`noop`:case`refused`:break}}catch(e){J.error({err:e,docName:t},`[branch-switch] restore WIP failed for ${t}`)}e>0&&J.info({count:e,branch:g},`[branch-switch] restored ${e} parked docs on ${g}`)}if(e.oldBranch?.startsWith(`detached-`)&&ue.current)try{let t=shadowGit(ue.current),s=(await t.raw(`for-each-ref`,`refs/wip/${e.oldBranch}/`,`--format=%(refname)`)).trim();if(s){for(let e of s.split(`
1620
1620
  `))e&&await t.raw(`update-ref`,`-d`,e);J.info({context:e.oldBranch},`[branch-switch] cleaned up detached context ${e.oldBranch}`)}}catch(e){J.error({err:e},`[branch-switch] detached cleanup failed`)}setBatchInProgress(!1),await de.flushDeferredStores(`discard-stale`),ge?.emitBranchSwitched(g)}if(e.headMoved&&e.newHead&&ue.current&&s>0){let t=L??`.`;try{let s=await commitUpstreamImport(ue.current,t,e.oldHead,e.newHead,g);incrementUpstreamImport(),J.info({oldHead:e.oldHead?.slice(0,8)??`null`,newHead:e.newHead.slice(0,8),sha:s.slice(0,8)},`[history] upstream-import from ${e.oldHead?.slice(0,8)??`null`}..${e.newHead.slice(0,8)} → ${s.slice(0,8)}`)}catch(e){J.error({err:e},`[shadow] upstream-import failed`)}}})}catch(e){J.error({err:e},`[server] HEAD watcher failed to start`),jt.push(`head-watcher`)}let w=H?.[0]??`open-knowledge`,E=[`-c`,`credential.helper=!${H&&H.length>1?H.join(` `):w} auth git-credential`];try{vt=new SyncEngine({projectDir:s,contentDir:t,contentFilter:oe,contentRoot:L,syncEnabled:Y(),credentialArgs:E,cc1Broadcaster:ge,setBatchInProgress:e=>{setBatchInProgress(e),e||de.flushDeferredStores(`within-branch`).catch(e=>{J.error({err:e},`[persistence] deferred store drain failed after sync batch`)})},onStateChange:e=>{J.info({state:e},`[sync] state → ${e}`)},onAutoDisable:async e=>{J.warn({reason:e},`[sync] auto-disabled — persisting to project-local config`);let t=await writeConfigPatch({cwd:s,scope:`project-local`,patch:{autoSync:{enabled:!1}}});t.ok||J.error({result:t,reason:e,humanError:humanFormat(t.error),configPath:resolveConfigPath(`project-local`,s)},`[sync] failed to persist auto-disable — next restart WILL re-enable sync and re-trigger the same failure. Check permissions on the config path.`)}}),await vt.start()}catch(e){J.warn({err:e},`[server] SyncEngine failed to start — sync disabled`),vt=null}}let Ft=Mt();return{hocuspocus:fe,sessionManager:me,cc1Broadcaster:ge,agentFocusBroadcaster:_e,agentPresenceBroadcaster:ve,contentFilter:oe,basenameIndex:ne,serverInstanceId:ee,destroy:Dt,ready:Ft,degraded:jt,lockDir:te,get syncEngine(){return vt}}}const LEGACY_RUNTIME_FILENAMES=[`server.lock`,`ui.lock`,`state.json`,`principal.json`,`sync-state.json`,`conflicts.json`,`last-spawn-error.log`],LEGACY_RUNTIME_DIRNAMES=[`cache`,`tmp`];function findLegacyRuntimeFiles(e){let t=resolve(e,LOCAL_DIR);if(!(()=>{if(!existsSync(t))return!0;try{return readdirSync(t).length===0}catch{return!0}})())return[];let s=[];for(let t of LEGACY_RUNTIME_FILENAMES)existsSync(resolve(e,t))&&s.push(t);for(let t of LEGACY_RUNTIME_DIRNAMES){let g=resolve(e,t);try{existsSync(g)&&statSync(g).isDirectory()&&s.push(`${t}/`)}catch{}}return s}function computeWorktreeAttributes(e){let t=resolveGitDirDetailed(e);switch(t.kind){case`directory`:return{kind:`main`,gitdir:t.path};case`linked`:return{kind:`linked`,gitdir:t.path};case`malformed-pointer`:return{kind:`linked`,gitdir:null};case`inaccessible`:case`absent`:return{kind:`main`,gitdir:null}}}const DEFAULT_IDLE_THRESHOLD_MS=1800*1e3,DESTROY_STEP_TIMEOUT_MS=5e3;async function bootServer(e){initTelemetry();let{kind:t,gitdir:s}=computeWorktreeAttributes(e.projectDir??e.contentDir),g={"ok.worktree.kind":t};return s!==null&&(g[`ok.worktree.gitdir`]=normalizeFsPath(s)),withSpan(`ok.boot`,{attributes:g},async()=>bootServerInner(e))}async function bootServerInner(e){let t=e.skipAutoInit??!1,s=e.attachUiSibling??!0,g=e.idleShutdownMs,S=e.log??getLogger(`boot`),w=process.env.OK_LOCK_KIND===`mcp-spawned`||process.env.OK_LOCK_KIND===`interactive`?process.env.OK_LOCK_KIND:void 0,E=e.lockKind??w??`interactive`,{createServer:D}=await import(`node:http`),{updateServerLockPort:O}=await import(`./server-lock-D7DXNVql-B5nINglj.mjs`).then(e=>e.a),k=!1;if(!t&&e.autoInitFn)try{k=!!await e.autoInitFn()}catch(e){S.warn({err:e},`autoInitFn failed`)}let j=e.projectDir??e.contentDir,F=resolve(j,`.ok`);if(!existsSync(resolve(F,`config.yml`)))throw new MissingOkConfigError(existsSync(F)?`config`:`okdir`,j);existsSync(resolve(F,`.gitignore`))||console.warn("[boot] Note: .ok/.gitignore is missing — per-machine state files in .ok/ may show up as untracked changes. Run `ok init` to add the recommended ignore entries.");let L=findLegacyRuntimeFiles(F);L.length>0&&console.warn(`[boot] Found legacy runtime files at .ok/${L.join(`, `)}. Delete .ok/ and re-init — these files moved to .ok/${LOCAL_DIR}/.`);let B=createServer$1({contentDir:e.contentDir,projectDir:e.projectDir,contentRoot:e.contentRoot,port:e.port,host:e.host,quiet:e.quiet??!1,debounce:e.debounce,maxDebounce:e.maxDebounce,gitEnabled:e.gitEnabled,commitDebounceMs:e.commitDebounceMs,wipRef:e.wipRef,enableTestRoutes:e.enableTestRoutes,shadowRepo:e.shadowRepo,destroyTimeoutMs:e.destroyTimeoutMs,localOpCliArgs:e.localOpCliArgs,onAgentWrite:e.onAgentWrite,lockKind:E,skipStateManifestCheck:e.skipStateManifestCheck}),{hocuspocus:H,destroy:q,ready:J,degraded:Y,lockDir:ee,sessionManager:te,agentFocusBroadcaster:ne,agentPresenceBroadcaster:ae}=B,oe=(()=>{let t=e.host??`localhost`;return t===`0.0.0.0`||t===`::`?`localhost`:t.includes(`:`)&&!t.startsWith(`[`)?`[${t}]`:t})(),se=e.port??0,ce=createMcpHttpHandler({contentDir:e.contentDir,projectDir:e.projectDir??e.contentDir,config:e.config,getServerUrl:()=>`http://${oe}:${se}`,log:S}),ue=D(),de=mountMcpAndApi({httpServer:ue,hocuspocus:H,mcpHttpHandler:ce,log:S,sessionManager:te,agentFocusBroadcaster:ne,agentPresenceBroadcaster:ae,keepaliveGraceMs:e.keepaliveGraceMs}),fe=null;g!==null&&(fe=attachIdleShutdown({httpServer:ue,thresholdMs:g??DEFAULT_IDLE_THRESHOLD_MS,log:S,onShutdown:(e.idleShutdownHandler??(e=>async()=>{await e()}))(async()=>{await q()})})),await new Promise((t,s)=>{let g=e=>s(e);ue.once(`error`,g),ue.listen(e.port,e.host,()=>{ue.removeListener(`error`,g),t()})});let me=ue.address(),ge=typeof me==`object`&&me?me.port:e.port??0;if(se=ge,O(ee,ge),s&&e.spawnUiSiblingFn)try{await e.spawnUiSiblingFn({lockDir:ee,log:S})}catch(e){S.warn({err:e},`spawnUiSiblingFn failed`)}let _e=!1,ve=async(e,t)=>{let s;try{await Promise.race([t(),new Promise((t,g)=>{s=setTimeout(()=>{g(Error(`${e} timed out after ${DESTROY_STEP_TIMEOUT_MS}ms`))},DESTROY_STEP_TIMEOUT_MS),s.unref?.()})])}finally{s!==void 0&&clearTimeout(s)}};return{httpServer:ue,destroy:async()=>{if(_e)return;_e=!0;let e=[],t=async(t,s)=>{try{await ve(t,s)}catch(s){e.push(s),S.warn({err:s,step:t},`bootServer destroy step failed`)}};try{fe?.detach()}catch(t){e.push(t),S.warn({err:t,step:`idleHandle.detach`},`bootServer destroy step failed`)}if(await t(`mount.shutdown`,()=>de.shutdown()),await t(`mcpHttpHandler.close`,()=>ce.close()),await t(`mount.wss.close`,()=>new Promise((e,t)=>{de.wss.close(s=>s?t(s):e())})),await t(`httpServer.closeAllConnections`,async()=>{ue.closeAllConnections?.()}),await t(`httpServer.close`,()=>new Promise((e,t)=>{ue.close(s=>s&&s.code!==`ERR_SERVER_NOT_RUNNING`?t(s):e())})),await t(`destroyHocuspocus`,()=>q()),await t(`shutdownTelemetry`,()=>shutdownTelemetry()),e.length>0)throw AggregateError(e,`bootServer destroy completed with errors`)},lockDir:ee,contentDir:e.contentDir,port:ge,ready:J,degraded:Y,didAutoInit:k,serverInstance:B}}const ConfigSchema=ConfigSchema$1;function detectClaudeDesktopPresence(e={}){let t=e.home??homedir(),s=e.platformName??process.platform,g=e.env??process.env;return s===`darwin`?existsSync(join(t,`Library`,`Application Support`,`Claude`)):s===`win32`?existsSync(join(g.APPDATA??join(t,`AppData`,`Roaming`),`Claude`)):!1}const execFileAsync=promisify(execFile);var ProjectGitInitError=class extends Error{stderr;constructor(e,t=``,s){super(e,s),this.name=`ProjectGitInitError`,this.stderr=t}};async function isInsideExistingWorkTree(e){try{let{stdout:t}=await execFileAsync(`git`,[`rev-parse`,`--is-inside-work-tree`],{cwd:e});return t.trim()===`true`}catch{return!1}}async function ensureProjectGit(e){let t=resolve(e),s=resolve(t,`.git`);if(existsSync(s)||await isInsideExistingWorkTree(t))return{didInit:!1};let g=``;try{g=(await execFileAsync(`git`,[`init`,`--initial-branch=main`,t])).stderr??``}catch(e){let s=typeof e==`object`&&e&&`stderr`in e?String(e.stderr??``):``;throw new ProjectGitInitError(`git init failed at ${t}: ${e instanceof Error?e.message:String(e)}`,s,{cause:e})}if(!existsSync(resolve(s,`HEAD`)))throw new ProjectGitInitError(`git init reported success but ${s}/HEAD is missing (partial init detected)`,g);return console.log(`[project-git] initialized .git/ at ${t} (branch: main)`),{didInit:!0}}async function resolvePackageVersion(e,t){let s;try{s=createRequire(t).resolve(e)}catch(e){if(e?.code===`MODULE_NOT_FOUND`)return;throw e}for(let t=dirname(s),g=0;g<32;g+=1){let s=join(t,`package.json`);if(existsSync(s))try{let t=JSON.parse(await readFile$1(s,`utf-8`));if(t.name===e&&typeof t.version==`string`)return t.version}catch{}let g=dirname(t);if(g===t)return;t=g}}export{buildAndOpenSkill as $,validateCloneInputs as $n,isSelfWrite as $t,OBSERVER_SYNC_ORIGIN as A,resolvePackageVersion as An,formatContributors as At,SeedPrerequisiteError as B,safetyCheckpoint as Bn,incrementCollabSocketFilteredError as Bt,MANAGED_RENAME_ORIGIN as C,removeLastKnownHash as Cn,createServerObserverExtension as Ct,MISSING_OK_CONFIG_MESSAGE as D,resolveCursorBinaryDefault as Dn,ensureProjectGit as Dt,MCP_SERVER_NAME as E,resolveContentDir as En,detectProjectShape as Et,SKILL_INSTALL_EVENTS_FILE_REL as F,runCloneSubprocess as Fn,getMeter as Ft,acquireUiLock as G,shadowGit as Gn,installUserSkill as Gt,StateManifestError as H,saveVersion as Hn,initShadowRepo as Ht,STARTER_FOLDERS as I,runDeviceFlowSubprocess as In,getMetrics as It,applySeed as J,startWatcher as Jn,isConfigDoc as Jt,applyAgentMarkdownWrite as K,shutdownTelemetry as Kn,isAllowedApiOrigin as Kt,STARTER_FOLDER_FRONTMATTER_FILENAME as L,runWithMcpLogger as Ln,getTracer as Lt,ProjectGitInitError as M,rewriteWikiLinksForDocumentRename as Mn,getCurrentMcpLogger as Mt,ROLLBACK_ORIGIN as N,runAuthReposSubprocess as Nn,getLocalDir as Nt,McpLogger as O,resolveCursorSpawnInvocation as On,evictStaleTrackerEntries as Ot,SERVICE_WRITER as P,runAuthStatusSubprocess as Pn,getLogger as Pt,bootServer as Q,validateAgentId as Qn,isPathWithinDir as Qt,STARTER_TEMPLATES as R,safeContentPath as Rn,handleCollabSocketError as Rt,LOG_MD_TEMPLATE as S,releaseUiLock as Sn,createServer$1 as St,MCP_CONNECTION_ID_HEADER as T,resolveBundledSkillDir as Tn,detectClaudeDesktopPresence as Tt,TagIndex as U,seedBasenameIndex as Un,initTelemetry as Ut,SeedRootDirError as V,saveInMemoryCheckpoint as Vn,incrementServerObserverFire as Vt,UiLockCollisionError as W,setActiveSpanAttributes as Wn,installTestLoggers as Wt,assertNeverDiskEvent as X,updateLastKnownHash as Xn,isLoopbackAddress as Xt,assertCompatibleStateManifest as Y,toBroadcasterKey as Yn,isHocuspocusAuthRejectionReason as Yt,attachIdleShutdown as Z,updateUiLockPort as Zn,isPairedWriteOrigin as Zt,HOCUSPOCUS_AUTH_REJECTION_REASONS as _,readUiLock as _n,createExternalChangeHandler as _t,AgentPresenceBroadcaster as a,mountMcpAndApi as an,writeTracker as ar,classifyEvents as at,INSTALLED_AGENTS_SCHEMES as b,recordSkillInstallEvent as bn,createOsProbe as bt,BacklinkIndex as c,pathToDocName as cn,isInitializedNotification as cr,commitWip as ct,CURSOR_BUNDLE_PATHS_BY_PLATFORM as d,readBranchFromHead as dn,readConfigSafely as dr,contentHash as dt,isSystemDoc as en,validateSkillZip as er,buildExecResult as et,ConfigSchema as f,readServerPackageVersion as fn,resolveConfigPath as fr,contributorCount as ft,GIT_UPSTREAM_WRITER as g,readTargetVersion as gn,createContentFilterAsync as gt,FILE_WATCHER_ORIGIN as h,readTargetRecordedAt as hn,MalformedGitPointerError as hr,createContentFilter as ht,AgentFocusBroadcaster as i,loggerFactory as in,writeTargetVersion as ir,buildWipTree as it,PinoLogger as j,rewriteMarkdownLinksForDocumentRename as jn,gcCheckpointRefs as jt,MissingOkConfigError as k,resolveLockDir as kn,extractWikiLinksFromMarkdown as kt,CC1Broadcaster as l,planSeed as ln,isJSONRPCRequest as lr,commitWipFromTree as lt,FILE_SYSTEM_WRITER as m,readStateManifest as mn,GitDirAccessError as mr,createAssetServeMiddleware as mt,AGENT_ID_RE as n,listRescueCheckpoints as nn,withSpanSync as nr,buildSkillZip as nt,AgentSessionCapacityError as o,parseHocuspocusAuthToken as on,JSONRPCMessageSchema as or,clearContributors as ot,DEFAULT_CHECKPOINT_RETENTION as p,readSkillInstallStateSnapshot as pn,writeConfigPatch as pr,createApiExtension as pt,applyExternalChange as q,splitMarkdownBlocks as qn,isAllowedWorkspaceHostHeader as qt,AGENT_WRITE_ORIGIN as r,loadPrincipal as rn,writeStateManifest as rr,buildStarterFolderFrontmatterYaml as rt,AgentSessionManager as s,parseKeepaliveConnectionId as sn,LATEST_PROTOCOL_VERSION as sr,commitUpstreamImport as st,AGENT_ID_MAX_LEN as t,lastKnownHash as tn,withSpan as tr,buildReadResult as tt,CONFLICT_MARKER_RE as u,readAllTargets as un,isJSONRPCResultResponse as ur,containsConflictMarkers as ut,HocuspocusAuthRejection as v,reconcile as vn,createLiveDerivedIndexExtension as vt,MAX_AGENT_SESSIONS as w,resetMetrics as wn,createTestLogger as wt,LIVE_DERIVED_INDEX_DEBOUNCE_MS as x,registerWrite as xn,createPersistenceExtension as xt,HocuspocusAuthTokenSchema as y,recordContributor as yn,createMcpHttpHandler as yt,STATE_MANIFEST_FILENAME as z,safeSubdir as zn,handleSpawnCursor as zt};
1621
- //# sourceMappingURL=dist-RAy2NfOX.mjs.map
1621
+ //# sourceMappingURL=dist-Bfxmzk9L.mjs.map