@inkeep/open-knowledge 0.69.2 → 0.69.3

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 (71) hide show
  1. package/dist/{acp-harness-probe-DPWErMNt.mjs → acp-harness-probe-651kV0nc.mjs} +1 -1
  2. package/dist/cli.mjs +6 -6
  3. package/dist/constants-DC9vpl05.mjs +1 -0
  4. package/dist/index.mjs +1 -1
  5. package/dist/{init-Dg1nR7qI.mjs → init-3YO-nWrp.mjs} +2 -2
  6. package/dist/init-Do0GyR_Y.mjs +1 -0
  7. package/dist/{launch-json-removal-Cml7d6ek.mjs → launch-json-removal-CB-qXbRG.mjs} +1 -1
  8. package/dist/loader-3_Q4hGc7.mjs +1 -0
  9. package/dist/{loader-B8821Dtx.mjs → loader-Cm-57kov.mjs} +1 -1
  10. package/dist/{preview-Db2B9Yme.mjs → preview-DS9XJQTQ.mjs} +1 -1
  11. package/dist/preview-ZuQGGPiB.mjs +1 -0
  12. package/dist/public/assets/{ActivityModeContent-D-gOyyIg.js → ActivityModeContent-CPmYa1Up.js} +1 -1
  13. package/dist/public/assets/{AddPropertiesButton-DMepIRAv.js → AddPropertiesButton-D0EzN88f.js} +1 -1
  14. package/dist/public/assets/{AgentDiffPane-ZCO1qj1L.js → AgentDiffPane-B0NabzXN.js} +1 -1
  15. package/dist/public/assets/{CodeMirrorPropInput-DY70O775.js → CodeMirrorPropInput-BKRUt0AM.js} +1 -1
  16. package/dist/public/assets/{DocumentContext-vBNJ-Cdr.js → DocumentContext-DSDBTCsW.js} +1 -1
  17. package/dist/public/assets/{EditorModeToggle-Bm-mLnCb.js → EditorModeToggle-BQcU0IHw.js} +1 -1
  18. package/dist/public/assets/{EnableSyncConfirmDialog-BFcf4emo.js → EnableSyncConfirmDialog-BmB0rCwF.js} +1 -1
  19. package/dist/public/assets/{ExcalidrawDocEditor-ByygowKy.js → ExcalidrawDocEditor-dfmdpAWK.js} +1 -1
  20. package/dist/public/assets/FeedbackForm-9FDMFmM6.js +1 -0
  21. package/dist/public/assets/{ImportSkillDialog-D8Y7cySO.js → ImportSkillDialog-BcejzZCF.js} +1 -1
  22. package/dist/public/assets/{LintConfigEditor-qw85cybs.js → LintConfigEditor-DIumV0d5.js} +1 -1
  23. package/dist/public/assets/ManagedArtifactProperties-BhSCHEl5.js +1 -0
  24. package/dist/public/assets/{ManagedArtifactProperties-BZNiVx42.js → ManagedArtifactProperties-mV2OaDK7.js} +1 -1
  25. package/dist/public/assets/{MermaidDocEditor-cvNMIn9f.js → MermaidDocEditor-Cacj53kr.js} +1 -1
  26. package/dist/public/assets/{PropertyDisplayRow-CjzV4-Vt.js → PropertyDisplayRow-CvMZrJ69.js} +1 -1
  27. package/dist/public/assets/{SchemaConfigEditor-njM43CFG.js → SchemaConfigEditor-B2j2xLBe.js} +1 -1
  28. package/dist/public/assets/{SessionsHost-C1RzXIMS.js → SessionsHost-BYemgNeQ.js} +2 -2
  29. package/dist/public/assets/{SettingsDialogBody-DTvvW_Zx.js → SettingsDialogBody-D2Y8F1A4.js} +1 -1
  30. package/dist/public/assets/{ShareReceiveMissDialog-C9ecBdyq.js → ShareReceiveMissDialog-B_8SRuGt.js} +1 -1
  31. package/dist/public/assets/{SkillInstallMenu-Cdo0N4rZ.js → SkillInstallMenu-B_JY2l56.js} +1 -1
  32. package/dist/public/assets/{SkillToolbarControls-CFhVVqUX.js → SkillToolbarControls--wh5StwC.js} +1 -1
  33. package/dist/public/assets/{SourceEditor-BKtF1CXz.js → SourceEditor-DdsftfwB.js} +1 -1
  34. package/dist/public/assets/{TerminalWindowApp-HnSyl8Yq.js → TerminalWindowApp-CfyR4Ux3.js} +1 -1
  35. package/dist/public/assets/{TextDocEditor-C1pZKMJy.js → TextDocEditor-DIxL_oxD.js} +1 -1
  36. package/dist/public/assets/{ThreadView-BM18mhAx.js → ThreadView-CY5TQyPp.js} +1 -1
  37. package/dist/public/assets/{TimelineDiffPane-BygEanlK.js → TimelineDiffPane-Bna9Euk9.js} +1 -1
  38. package/dist/public/assets/{agent-diff-store-CPizJ_eo.js → agent-diff-store-DrJ7gtl5.js} +1 -1
  39. package/dist/public/assets/{auth-state-cache-BYTdrNrU.js → auth-state-cache-C9JTTIdB.js} +1 -1
  40. package/dist/public/assets/{client-version-SQ-LgVkc.js → client-version-Bi2hbRr3.js} +1 -1
  41. package/dist/public/assets/{comment-chips-Cbbf5tPC.js → comment-chips-pQCYp2--.js} +1 -1
  42. package/dist/public/assets/{config-provider-2yYopfHI.js → config-provider-DHXifCEA.js} +1 -1
  43. package/dist/public/assets/{doc-undo-manager-CgPwSDHm.js → doc-undo-manager-CpdN7MCP.js} +1 -1
  44. package/dist/public/assets/{index-DwCyPcFR.js → index-B7hGCEsI.js} +7 -7
  45. package/dist/public/assets/{pending-receive-nav-store-DcN0rbT1.js → pending-receive-nav-store-CGd2XEQS.js} +1 -1
  46. package/dist/public/assets/{progress-pgO8UB4m.js → progress-Dj1ei5F9.js} +1 -1
  47. package/dist/public/assets/{selection-context-Bc6kodP9.js → selection-context-CJ-3kbx4.js} +1 -1
  48. package/dist/public/assets/{src-tCMUadGy.js → src-B7gG6vO-.js} +1 -1
  49. package/dist/public/assets/{telemetry-impl-D8b0Lz4E.js → telemetry-impl-CTWwzUC_.js} +1 -1
  50. package/dist/public/assets/{telemetry-startup-tdRVaPoP.js → telemetry-startup-yTZTZDQT.js} +1 -1
  51. package/dist/public/assets/{typing-burst-detector-BWyPshFG.js → typing-burst-detector-BsSbTDha.js} +1 -1
  52. package/dist/public/assets/{use-activity-panel-CRfGEqEf.js → use-activity-panel-CSEkLDlF.js} +1 -1
  53. package/dist/public/assets/{use-open-skill-DVsmIGYC.js → use-open-skill-fLiYfI01.js} +1 -1
  54. package/dist/public/assets/{use-terminal-enabled-3oU29-6-.js → use-terminal-enabled-B1RkZcKn.js} +1 -1
  55. package/dist/public/assets/{use-timeline-entry-diff-CweASqOk.js → use-timeline-entry-diff-DNccWaZW.js} +1 -1
  56. package/dist/public/index.html +19 -19
  57. package/dist/{repair-launch-json-C6TqIIff.mjs → repair-launch-json-Ewj6TPAB.mjs} +1 -1
  58. package/dist/{repair-mcp-configs-DM3bQZGz.mjs → repair-mcp-configs-CaxSRCXk.mjs} +1 -1
  59. package/dist/{src-OKp7leaD.mjs → src-9mzQh4Co.mjs} +1 -1
  60. package/dist/src-y3GVfDV1.mjs +1 -0
  61. package/dist/start-CdgXY25v.mjs +1 -0
  62. package/dist/{start-D4DOcvE_.mjs → start-Dv2L6HOw.mjs} +2 -2
  63. package/package.json +4 -4
  64. package/dist/constants-BELBopI6.mjs +0 -1
  65. package/dist/init-BHTd_ERi.mjs +0 -1
  66. package/dist/loader-kQE4qvYg.mjs +0 -1
  67. package/dist/preview-DE8o_7W6.mjs +0 -1
  68. package/dist/public/assets/FeedbackForm-C0Fr0P-p.js +0 -1
  69. package/dist/public/assets/ManagedArtifactProperties-Cw5KWGzG.js +0 -1
  70. package/dist/src-CQoldCaL.mjs +0 -1
  71. package/dist/start-cn3uDrUj.mjs +0 -1
@@ -1,4 +1,4 @@
1
- import{$l as e}from"./md-manager-BGnqyqi1-eohu_6wW.mjs";import{$a as t,Do as n,Eo as r,xo as i}from"./dist-rXSsjKu4.mjs";import{b as a,g as o,m as s,p as c,s as l}from"./resolve-project-root-Dyi1SFSV.mjs";import{S as ee,T as u,d as te,o as d,v as f,x as p}from"./init-Dg1nR7qI.mjs";import{t as m}from"./is-object-BGze3w87.mjs";import{spawn as h}from"node:child_process";import{basename as ne,dirname as g,join as _,resolve as v,win32 as y}from"node:path";import{existsSync as b,mkdirSync as x,readFileSync as S,readdirSync as C,statSync as w,writeFileSync as T}from"node:fs";import{homedir as E}from"node:os";var D=e();const O=`open-knowledge`;function k(e){try{e()}catch{}}var A=class{backend=`keyring`;onKeychainRead;constructor(e){this.onKeychainRead=e}async get(e){let{Entry:t}=await import(`@napi-rs/keyring`),n;try{n=new t(O,e).getPassword()}catch(t){return k(()=>this.onKeychainRead?.({kind:`read-error`,host:e,error:t instanceof Error?t.name:`unknown`})),null}if(n==null)return k(()=>this.onKeychainRead?.({kind:`absent`,host:e})),null;try{return JSON.parse(n)}catch{return k(()=>this.onKeychainRead?.({kind:`corrupt-entry`,host:e,error:`corrupt-entry`})),null}}async set(e,t,n,r){let{Entry:i}=await import(`@napi-rs/keyring`),a=new i(O,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(O,e).deletePassword()}catch{}}},j=class{backend=`file`;authFile;constructor(e){this.authFile=e??_(E(),`.ok`,`auth.yml`)}read(){if(!b(this.authFile))return{};try{let e=S(this.authFile,`utf-8`);return(0,D.parse)(e)??{}}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=g(this.authFile);b(t)||x(t,{recursive:!0,mode:448}),T(this.authFile,(0,D.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)}},M=class{backend=`keyring`;keychain;file;constructor(e,t){this.keychain=e,this.file=t}async get(e){let t=await this.keychain.get(e);if(t!=null)return t;let n=await this.file.get(e);if(n==null)return null;try{await this.keychain.set(e,n.login,n.token,{gitProtocol:n.gitProtocol,name:n.name,email:n.email}),await this.file.clear(e),process.stderr.write(`[auth] migrated ${e} credential from ~/.ok/auth.yml to the OS keychain\n`)}catch{}return n}set(e,t,n,r){return this.keychain.set(e,t,n,r)}async clear(e){await this.keychain.clear(e),await this.file.get(e)!=null&&await this.file.clear(e)}};async function N(e,t){try{let{Entry:n}=await import(`@napi-rs/keyring`);return new n(O,`__probe__`),process.stderr.write(`[auth] token storage: OS keychain
1
+ import{$l as e}from"./md-manager-BGnqyqi1-eohu_6wW.mjs";import{$a as t,Do as n,Eo as r,xo as i}from"./dist-rXSsjKu4.mjs";import{b as a,g as o,m as s,p as c,s as l}from"./resolve-project-root-Dyi1SFSV.mjs";import{S as ee,T as u,d as te,o as d,v as f,x as p}from"./init-3YO-nWrp.mjs";import{t as m}from"./is-object-BGze3w87.mjs";import{spawn as h}from"node:child_process";import{basename as ne,dirname as g,join as _,resolve as v,win32 as y}from"node:path";import{existsSync as b,mkdirSync as x,readFileSync as S,readdirSync as C,statSync as w,writeFileSync as T}from"node:fs";import{homedir as E}from"node:os";var D=e();const O=`open-knowledge`;function k(e){try{e()}catch{}}var A=class{backend=`keyring`;onKeychainRead;constructor(e){this.onKeychainRead=e}async get(e){let{Entry:t}=await import(`@napi-rs/keyring`),n;try{n=new t(O,e).getPassword()}catch(t){return k(()=>this.onKeychainRead?.({kind:`read-error`,host:e,error:t instanceof Error?t.name:`unknown`})),null}if(n==null)return k(()=>this.onKeychainRead?.({kind:`absent`,host:e})),null;try{return JSON.parse(n)}catch{return k(()=>this.onKeychainRead?.({kind:`corrupt-entry`,host:e,error:`corrupt-entry`})),null}}async set(e,t,n,r){let{Entry:i}=await import(`@napi-rs/keyring`),a=new i(O,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(O,e).deletePassword()}catch{}}},j=class{backend=`file`;authFile;constructor(e){this.authFile=e??_(E(),`.ok`,`auth.yml`)}read(){if(!b(this.authFile))return{};try{let e=S(this.authFile,`utf-8`);return(0,D.parse)(e)??{}}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=g(this.authFile);b(t)||x(t,{recursive:!0,mode:448}),T(this.authFile,(0,D.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)}},M=class{backend=`keyring`;keychain;file;constructor(e,t){this.keychain=e,this.file=t}async get(e){let t=await this.keychain.get(e);if(t!=null)return t;let n=await this.file.get(e);if(n==null)return null;try{await this.keychain.set(e,n.login,n.token,{gitProtocol:n.gitProtocol,name:n.name,email:n.email}),await this.file.clear(e),process.stderr.write(`[auth] migrated ${e} credential from ~/.ok/auth.yml to the OS keychain\n`)}catch{}return n}set(e,t,n,r){return this.keychain.set(e,t,n,r)}async clear(e){await this.keychain.clear(e),await this.file.get(e)!=null&&await this.file.clear(e)}};async function N(e,t){try{let{Entry:n}=await import(`@napi-rs/keyring`);return new n(O,`__probe__`),process.stderr.write(`[auth] token storage: OS keychain
2
2
  `),k(()=>t?.onBackendSelected?.({backend:`keyring`})),new M(new A(t?.onKeychainRead),new j(e))}catch(n){let r=n instanceof Error?`${n.name}: ${n.message}`:String(n);return process.stderr.write(`[auth] token storage: file (~/.ok/auth.yml) — OS keychain unavailable: ${r}\n`),k(()=>t?.onBackendSelected?.({backend:`file`,reason:r})),new j(e)}}function P(e){let t=null;return function(){if(t)return t;let n=2e3;return t=(async()=>{let t=null,r=new Promise(r=>{t=setTimeout(()=>{process.stderr.write(`[auth] token storage: keyring init exceeded ${n}ms; falling back to file (~/.ok/auth.yml)\n`),r(new j(e))},n)});try{return await Promise.race([N(e),r])}catch{return new j(e)}finally{t!==null&&clearTimeout(t)}})(),t}}function re(e){let t=P(e);return{async get(e){let n=await(await t()).get(e);return n===null?null:{token:n.token,login:n.login}}}}function F(e){let t=P(e);return{backend:`file`,async get(e){return(await t()).get(e)},async set(e,n,r,i){return(await t()).set(e,n,r,i)},async clear(e){return(await t()).clear(e)}}}async function I(e,t){let n=[],r=new j(t);await r.get(e)!=null&&(await r.clear(e),n.push(`file`));let i;try{let{Entry:t}=await import(`@napi-rs/keyring`);new t(O,`__probe__`);let r,a=await new A(e=>{e.kind===`read-error`&&(r=e.error??`read-error`)}).get(e);if(r!==void 0)i=r;else if(a!=null)try{new t(O,e).deletePassword(),n.push(`keychain`)}catch(e){i=e instanceof Error?e.name:`delete-error`}}catch{}return{touched:n,keychainError:i}}function L(e){let t={...e};return delete t.ELECTRON_RUN_AS_NODE,t}function R(e){let t=e?.code;return t===`ENOENT`||t===`EACCES`||t===`EPERM`?{ok:!1,reason:`not-installed`}:{ok:!1,reason:`spawn-error`}}function z(e){return t({detached:!0,stdio:`ignore`,shell:!1,env:L(e)})}function B(e,t,n={}){let r=(n.spawn??h)(e,[...t],z(n.env??process.env));return r.unref(),r}function V(e,t,n={}){let r=n.spawn??h,i=n.timeoutMs??2e3;return new Promise(a=>{let o=!1,s=e=>{o||(o=!0,a(e))},c=setTimeout(()=>s({ok:!1,reason:`timeout`}),i);try{let i=r(e,[...t],z(n.env??process.env));i.once(`error`,e=>{clearTimeout(c),s(R(e))}),i.once(`spawn`,()=>{clearTimeout(c),s({ok:!0})});try{i.unref()}catch{}}catch(e){clearTimeout(c),s(R(e))}})}const H=`com.inkeep.open-knowledge`,U=`OpenKnowledge.app`,W=`/Applications/${U}`;function G(){return{platform:process.platform,env:process.env,execPath:process.execPath,isTTY:process.stdout.isTTY,statSync:e=>{try{return w(e,{throwIfNoEntry:!1})??null}catch{return null}}}}function K(e){if(e.env.ELECTRON_RUN_AS_NODE===`1`){let t=/(.+?\.app)\/Contents\/MacOS\//.exec(e.execPath);if(t?.[1])return t[1]}if(q(e,W))return W;let t=e.homeDir??E(),n=_(t,`Applications`,U);return q(e,n)?n:null}function q(e,t){return J(e,_(t,`Contents`,`MacOS`,`OpenKnowledge`))}function J(e,t){try{let n=e.statSync(t);return n?typeof n.isFile==`function`&&n.isFile():!1}catch{return!1}}const Y=[`@inkeepopen-knowledge-desktop`,`OpenKnowledge`];function ie(e){if(e.env.ELECTRON_RUN_AS_NODE===`1`&&/\\OpenKnowledge\.exe$/i.test(e.execPath))return e.execPath;let t=e.env.LOCALAPPDATA;if(t)for(let n of Y){let r=y.join(t,`Programs`,n,`OpenKnowledge.exe`);if(J(e,r))return r}return null}function ae(e){if(e.env.ELECTRON_RUN_AS_NODE===`1`&&e.execPath.endsWith(`/openknowledge`))return e.execPath;let t=`/opt/OpenKnowledge/openknowledge`;return J(e,t)?t:null}function oe(e){if(e.env.OK_FORCE_BROWSER===`1`)return{available:!1,reason:`force-browser`};if(e.platform!==`darwin`&&e.platform!==`win32`&&e.platform!==`linux`)return{available:!1,reason:`unsupported-platform`};let t;try{t=e.platform===`darwin`?K(e):e.platform===`win32`?ie(e):ae(e)}catch{return{available:!1,reason:`stat-error`}}return t?e.env.OK_FORCE_DESKTOP===`1`?{available:!0,reason:`available`,bundlePath:t}:!(e.isTTY===!0||e.platform===`win32`&&e.isTTY===void 0&&!e.env.CI)||e.env.SSH_CONNECTION||e.env.SSH_TTY||e.platform===`linux`&&!e.env.DISPLAY&&!e.env.WAYLAND_DISPLAY?{available:!1,reason:`headless`,bundlePath:t}:{available:!0,reason:`available`,bundlePath:t}:{available:!1,reason:`no-bundle`}}function se(e,t){let n=e.log??(e=>console.error(e)),r=e.platform??process.platform;if(n("Launching OpenKnowledge desktop (use `ok start` for the browser server, or `OK_FORCE_BROWSER=1` to always skip)"),r===`darwin`){B(`open`,[`-b`,H],{spawn:e.spawn});return}let i=t?.bundlePath;if(!i){n(`Desktop launch skipped: no resolved desktop executable (caller bug).`);return}B(i,[],{spawn:e.spawn})}function ce(e=`no-bundle`){switch(e){case`no-bundle`:return`Desktop app not found (checked the standard install locations for this OS). Install it from https://openknowledge.ai/download, or omit --mode for browser mode.`;case`darwin-only`:case`unsupported-platform`:return`Desktop app is not available on this platform. Use --mode=browser, or omit --mode for the server fallback.`;case`headless`:return`Desktop launch is gated in headless contexts (CI, SSH, non-TTY stdout). Set OK_FORCE_DESKTOP=1 to override, or use --mode=browser.`;case`force-browser`:return`OK_FORCE_BROWSER=1 is set — desktop dispatch is disabled. Unset it to use --mode=app.`;case`stat-error`:return`Failed to inspect the desktop install (filesystem error). Check permissions or use --mode=browser.`;case`available`:return`Desktop app appears available but launch dispatch did not fire (caller bug).`}}function X(e,t){let n=v(e),r=t===void 0?a():a({home:t,env:{}});return{cwd:n,bridgePath:l.pi.projectConfigPath?.(n)??``,trustPath:_(r,`trust.json`)}}function Z(e,t,n){let r=d(l.pi,e,n,t);if(r.kind===`absent`)return{state:`absent`,text:null};if(r.kind!==`present`)return{state:`unreadable`,text:null};let i=r.entry,a=Array.isArray(i.args)&&typeof i.args[0]==`string`?i.args[0]:null;return s(i)?{state:`own-current`,text:a}:ee(i)?{state:`own-stale`,text:a}:{state:`foreign`,text:a}}function Q(e,t){let n;try{n=S(e,`utf-8`)}catch(e){let t=e.code;return t===`ENOENT`||t===`ENOTDIR`?{state:`untrusted`,entries:{},trailingNewline:!1}:{state:`unreadable`,entries:null,trailingNewline:!1}}if(n.trim()===``)return{state:`untrusted`,entries:{},trailingNewline:!1};let r;try{r=JSON.parse(n)}catch{return{state:`unreadable`,entries:null,trailingNewline:!1}}return m(r)?{state:r[t]===!0?`trusted`:`untrusted`,entries:r,trailingNewline:n.endsWith(`
3
3
  `)}:{state:`unreadable`,entries:null,trailingNewline:!1}}function le(e,t){let n=X(e,t),r=Z(n.cwd,n.bridgePath,t).state,i=Q(n.trustPath,n.cwd).state;return{...n,bridge:r,trust:i,bridgeLoadable:(r===`own-current`||r===`own-stale`)&&i===`trusted`,otherExtensions:$(n.bridgePath).names}}function $(e){let t=g(e),n=ne(e);try{return{names:C(t).filter(e=>e!==n&&e.endsWith(`.ts`)).sort(),verified:!0}}catch(e){let t=e.code;return{names:[],verified:t===`ENOENT`||t===`ENOTDIR`}}}async function ue(e,t={mode:`published`},n){let r=X(e,n),i=Z(r.cwd,r.bridgePath,n);if(i.state===`foreign`)return{...r,ok:!1,bridge:`refused-foreign`,trust:`skipped`};if(i.state===`unreadable`)return{...r,ok:!1,bridge:`refused-unreadable`,trust:`skipped`};let a;if(i.state===`absent`)a=`written`;else{let e;try{e=p(t)}catch{e=void 0}a=e!==void 0&&i.text===e?`unchanged`:`refreshed`}if(a!==`unchanged`){let e=f(l.pi,r.cwd,t,n,r.bridgePath);if(e.action!==`written`&&e.action!==`overwritten`)return{...r,ok:!1,bridge:`failed`,trust:`skipped`,error:e.error??`bridge write ${e.action}`}}let o=await de(r.trustPath,r.cwd);return{...r,ok:o.action===`already-trusted`||o.action===`added`,bridge:a,trust:o.action,...o.error===void 0?{}:{error:o.error}}}async function de(e,t){try{x(g(e),{recursive:!0})}catch(e){return{action:`failed`,error:e instanceof Error?e.message:String(e)}}let n={action:`added`};try{await r(`${e}.lock`,async()=>{let r=Q(e,t);if(r.state===`trusted`){n.action=`already-trusted`;return}if(r.entries===null){n.action=`refused-unreadable`;return}let a={...r.entries,[t]:!0},o=JSON.stringify(a,null,2)+(r.trailingNewline?`
4
4
  `:``),s=u(e);i(e,o,s===void 0?void 0:{mode:s}),n.action=`added`})}catch(e){return{action:`failed`,error:e instanceof Error?e.message:String(e)}}return n.action===`refused-unreadable`?{action:`refused-unreadable`,error:`trust store is not a readable JSON object`}:{action:n.action}}function fe(e,t){let r=X(e,t),a=$(r.bridgePath);if(!a.verified)return{action:`kept-unverified`,error:`could not read the Pi extensions folder`};if(a.names.length>0)return{action:`kept-shared`};if(!b(r.trustPath))return{action:`not-present`};let o={action:`removed`};try{n(`${r.trustPath}.lock`,()=>{let e=Q(r.trustPath,r.cwd);if(e.entries===null){o.action=e.state===`unreadable`?`refused-unreadable`:`not-present`;return}if(!(r.cwd in e.entries)){o.action=`not-present`;return}let t={...e.entries};delete t[r.cwd];let n=JSON.stringify(t,null,2)+(e.trailingNewline?`
package/dist/cli.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{o as e}from"./rolldown-runtime-tZXQYakl.mjs";import{$l as t,Ao as n,Bc as r,Bs as i,Cs as a,Dc as o,El as s,Go as c,Hi as l,Ki as u,Kl as d,Lu as f,Mt as p,Na as m,Os as h,Q as g,Tu as _,Vc as v,Vn as y,Wo as b,Y as x,Ys as S,Zc as C,_s as ee,al as w,au as T,bs as te,cl as ne,dc as E,du as re,ec as ie,eo as ae,eu as oe,fu as se,iu as ce,lo as le,ma as ue,mo as de,mu as D,nn as fe,no as pe,oc as me,os as he,ou as O,pu as ge,sl as _e,ua as ve,vo as ye,vu as k,xu as be,zs as xe}from"./md-manager-BGnqyqi1-eohu_6wW.mjs";import{$a as A,$n as Se,$r as Ce,Ao as we,Bn as Te,C as Ee,Co as De,F as Oe,Fi as ke,Hr as Ae,In as je,Ji as Me,Mo as Ne,Mt as Pe,Oo as Fe,P as Ie,Pi as Le,Pt as Re,So as ze,St as Be,T as Ve,Ti as He,To as Ue,Tr as We,Uo as Ge,Vn as Ke,Vr as qe,Vt as Je,Wa as Ye,Wi as Xe,Xi as j,Yi as Ze,Zi as Qe,Zn as $e,_i as et,_r as tt,b as nt,bn as rt,bo as it,br as at,bt as ot,cn as st,co as ct,d as lt,do as ut,dt,ei as ft,en as pt,fn as mt,fo as ht,ft as gt,ga as _t,gi as vt,gt as yt,ha as bt,hi as xt,jo as St,jr as Ct,ko as wt,lo as Tt,mi as Et,mn as Dt,na as Ot,ni as kt,ot as At,pn as jt,po as Mt,q as Nt,rr as Pt,si as Ft,sn as It,sr as Lt,uo as Rt,vn as zt,wi as Bt,wr as Vt,xo as Ht,xt as Ut,yo as Wt,yt as Gt,z as Kt,zn as qt}from"./dist-rXSsjKu4.mjs";import{a as Jt,r as Yt,s as Xt,x as M}from"./resolve-project-root-Dyi1SFSV.mjs";import{C as Zt,S as Qt,_ as $t,a as en,b as tn,c as nn,d as rn,g as an,h as on,i as sn,l as cn,m as ln,n as un,o as dn,p as fn,r as pn,s as mn,t as hn,u as gn,v as _n,w as vn,x as yn,y as bn}from"./src-OKp7leaD.mjs";import{c as xn,i as N,n as P,o as F,r as I,s as L,t as R}from"./colors-r_owlCuY.mjs";import{c as Sn,d as Cn,f as wn,h as Tn,o as En,p as Dn,s as On,u as kn}from"./acp-harness-probe-DPWErMNt.mjs";import{n as An,r as jn,t as Mn}from"./dist-bundle-T0gq9zHH.mjs";import{A as Nn,B as Pn,C as Fn,F as In,H as Ln,I as Rn,L as zn,M as Bn,N as Vn,O as Hn,P as Un,R as Wn,T as Gn,V as Kn,j as qn,u as Jn,w as Yn,z as Xn}from"./init-Dg1nR7qI.mjs";import{E as Zn,S as Qn,y as $n}from"./start-D4DOcvE_.mjs";import{n as er,t as tr}from"./constants-BELBopI6.mjs";import{n as nr,t as rr}from"./loader-B8821Dtx.mjs";import{i as ir}from"./skill-teardown-BIi-5NQJ.mjs";import{t as ar}from"./launch-json-removal-Cml7d6ek.mjs";import{n as or}from"./repair-skills-hGJGjJEr.mjs";import{execFile as sr,execFileSync as cr,execSync as lr,spawn as ur,spawnSync as dr}from"node:child_process";import{basename as fr,dirname as z,isAbsolute as pr,join as B,posix as mr,relative as V,resolve as H,sep as hr}from"node:path";import gr from"node:process";import{fileURLToPath as _r}from"node:url";import{accessSync as vr,appendFileSync as yr,closeSync as br,constants as xr,existsSync as U,lstatSync as Sr,mkdirSync as Cr,mkdtempSync as wr,readFileSync as W,readdirSync as Tr,readlinkSync as Er,realpathSync as Dr,renameSync as Or,rmSync as kr,statSync as G,unlinkSync as K,writeFileSync as Ar}from"node:fs";import{homedir as jr,platform as Mr,tmpdir as Nr}from"node:os";import{rm as Pr}from"node:fs/promises";import{randomUUID as Fr}from"node:crypto";import{promisify as Ir}from"node:util";import{setTimeout as Lr}from"node:timers/promises";import{createInterface as Rr}from"node:readline/promises";const zr={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 Br;Br||={};function Vr(e){return _(oe,e)}async function Hr(e){let{projectDir:t,contentDir:r,baseConfig:i,targetPath:a,fix:o=!1}=e,s=[],c=zt({projectDir:t,contentDir:r}),l=new Set,u=e=>{l.has(e)||(l.add(e),s.push(e))},d=st(t,i,u),f=m(d,{mode:`lint`}),p=[],h=e=>{p.push(e)},g=new Map,_=e=>{let t=z(e),n=g.get(t);if(n)return n;let i=Qe(r,e,u),a=It(d,i);return g.set(t,a),a},v=[],y=Ur(a,r);y.kind===`file`?v.push(V(r,y.path)):b(y.path);function b(e){let t;try{t=Tr(e,{withFileTypes:!0})}catch(t){s.push(`could not read directory ${V(r,e)||`.`}: ${Gr(t)}`);return}for(let n of t){if(n.name.startsWith(`.`))continue;let t=B(e,n.name),i=V(r,t);if(n.isDirectory()){if(c.isDirExcluded(i))continue;b(t)}else if(n.isFile()){if(!Wr(n.name)||c.isExcluded(i))continue;v.push(i)}}}v.sort();let x=[],S=0,C=0,ee=0;for(let e of v){let t=B(r,e),i;try{i=W(t,`utf-8`)}catch(t){s.push(`could not read ${e}: ${Gr(t)}`);continue}let a=_(e),c=!1;if(o&&a.enabled){let n=ae(i,a,e,h);if(n!==i){let r=`${t}.tmp.${process.pid}.${Date.now()}`;try{Ar(r,n,`utf-8`),Or(r,t),i=n,c=!0,ee++}catch(t){try{K(r)}catch{}s.push(`could not write fix to ${e}: ${Gr(t)}`)}}}let l=await n(i,a,e,h);for(let e of l)e.severity===`error`?S++:C++;x.push({file:e,diagnostics:l,fixed:c})}return s.push(...te(p)),{contentDir:r,files:x,warnings:s,fileCount:v.length,errorCount:S,warningCount:C,fixedCount:ee,ran:f}}function Ur(e,t){if(e===void 0||e===``)return{kind:`dir`,path:t};let n=pr(e)?e:H(t,e);try{if(G(n).isFile())return{kind:`file`,path:n}}catch{}return{kind:`dir`,path:n}}function Wr(e){let t=e.toLowerCase();return y.some(e=>t.endsWith(e))}function Gr(e){return e instanceof Error?e.message:String(e)}function Kr(e){return new M(`lint`).description(`Lint markdown content (headless) — whole project, a folder, or a single file`).argument(`[path]`,`Folder or file to lint, relative to where you run the command`).option(`--json`,`Emit structured JSON instead of formatted text`).option(`--fix`,`Auto-fix fixable issues in place (markdownlint rules only)`).option(`--errors-only`,`Exit non-zero only on error-severity problems (findings are warning-severity unless your .markdownlint.* assigns a rule "error")`).action(async(t,n)=>{let r=e(),i=process.cwd(),o=Xe(r,i),s=t===void 0?void 0:qr(t,tn()),c=r.contentRules,l=await Hr({projectDir:i,contentDir:o,baseConfig:c?a(c):x,targetPath:s,fix:n.fix===!0});n.json===!0?process.stdout.write(`${JSON.stringify(l,null,2)}\n`):process.stdout.write(`${Xr(l)}\n`),(n.errorsOnly===!0?l.errorCount>0:Jr(l))&&(process.exitCode=1)})}function qr(e,t){return H(t,e)}function Jr(e){return e.errorCount>0||e.warningCount>0}function Yr(e){let t=[R(e.file)+(e.fixed?P(` (fixed)`):``)];for(let n of e.diagnostics){let e=P(`${n.range.start.line+1}:${n.range.start.character+1}`.padEnd(7)),r=n.severity===`error`?I(`error `):L(`warning`);t.push(` ${e} ${r} ${n.message} ${P(`${n.source}/${n.code}`)}`)}return t.push(``),t}function Xr(e){let t=[];for(let n of e.files)n.diagnostics.length>0&&t.push(...Yr(n));let n=e.errorCount+e.warningCount;if(n===0)t.push(F(`✓ No problems in ${e.fileCount} file${e.fileCount===1?``:`s`}.`));else{let r=[`${n} problem${n===1?``:`s`}`];r.push(`${e.errorCount} error${e.errorCount===1?``:`s`}`),r.push(`${e.warningCount} warning${e.warningCount===1?``:`s`}`),t.push(`${I(r[0]??``)} (${r[1]}, ${r[2]}) across ${e.fileCount} file${e.fileCount===1?``:`s`}.`)}if(e.fixedCount>0&&t.push(P(`Fixed ${e.fixedCount} file${e.fixedCount===1?``:`s`}.`)),t.push(...h(e.ran).map(e=>P(e))),e.warnings.length>0){t.push(``);for(let n of e.warnings)t.push(L(`! ${n}`))}return t.join(`
2
+ import{o as e}from"./rolldown-runtime-tZXQYakl.mjs";import{$l as t,Ao as n,Bc as r,Bs as i,Cs as a,Dc as o,El as s,Go as c,Hi as l,Ki as u,Kl as d,Lu as f,Mt as p,Na as m,Os as h,Q as g,Tu as _,Vc as v,Vn as y,Wo as b,Y as x,Ys as S,Zc as C,_s as ee,al as w,au as T,bs as te,cl as ne,dc as E,du as re,ec as ie,eo as ae,eu as oe,fu as se,iu as ce,lo as le,ma as ue,mo as de,mu as D,nn as fe,no as pe,oc as me,os as he,ou as O,pu as ge,sl as _e,ua as ve,vo as ye,vu as k,xu as be,zs as xe}from"./md-manager-BGnqyqi1-eohu_6wW.mjs";import{$a as A,$n as Se,$r as Ce,Ao as we,Bn as Te,C as Ee,Co as De,F as Oe,Fi as ke,Hr as Ae,In as je,Ji as Me,Mo as Ne,Mt as Pe,Oo as Fe,P as Ie,Pi as Le,Pt as Re,So as ze,St as Be,T as Ve,Ti as He,To as Ue,Tr as We,Uo as Ge,Vn as Ke,Vr as qe,Vt as Je,Wa as Ye,Wi as Xe,Xi as j,Yi as Ze,Zi as Qe,Zn as $e,_i as et,_r as tt,b as nt,bn as rt,bo as it,br as at,bt as ot,cn as st,co as ct,d as lt,do as ut,dt,ei as ft,en as pt,fn as mt,fo as ht,ft as gt,ga as _t,gi as vt,gt as yt,ha as bt,hi as xt,jo as St,jr as Ct,ko as wt,lo as Tt,mi as Et,mn as Dt,na as Ot,ni as kt,ot as At,pn as jt,po as Mt,q as Nt,rr as Pt,si as Ft,sn as It,sr as Lt,uo as Rt,vn as zt,wi as Bt,wr as Vt,xo as Ht,xt as Ut,yo as Wt,yt as Gt,z as Kt,zn as qt}from"./dist-rXSsjKu4.mjs";import{a as Jt,r as Yt,s as Xt,x as M}from"./resolve-project-root-Dyi1SFSV.mjs";import{C as Zt,S as Qt,_ as $t,a as en,b as tn,c as nn,d as rn,g as an,h as on,i as sn,l as cn,m as ln,n as un,o as dn,p as fn,r as pn,s as mn,t as hn,u as gn,v as _n,w as vn,x as yn,y as bn}from"./src-9mzQh4Co.mjs";import{c as xn,i as N,n as P,o as F,r as I,s as L,t as R}from"./colors-r_owlCuY.mjs";import{c as Sn,d as Cn,f as wn,h as Tn,o as En,p as Dn,s as On,u as kn}from"./acp-harness-probe-651kV0nc.mjs";import{n as An,r as jn,t as Mn}from"./dist-bundle-T0gq9zHH.mjs";import{A as Nn,B as Pn,C as Fn,F as In,H as Ln,I as Rn,L as zn,M as Bn,N as Vn,O as Hn,P as Un,R as Wn,T as Gn,V as Kn,j as qn,u as Jn,w as Yn,z as Xn}from"./init-3YO-nWrp.mjs";import{E as Zn,S as Qn,y as $n}from"./start-Dv2L6HOw.mjs";import{n as er,t as tr}from"./constants-DC9vpl05.mjs";import{n as nr,t as rr}from"./loader-Cm-57kov.mjs";import{i as ir}from"./skill-teardown-BIi-5NQJ.mjs";import{t as ar}from"./launch-json-removal-CB-qXbRG.mjs";import{n as or}from"./repair-skills-hGJGjJEr.mjs";import{execFile as sr,execFileSync as cr,execSync as lr,spawn as ur,spawnSync as dr}from"node:child_process";import{basename as fr,dirname as z,isAbsolute as pr,join as B,posix as mr,relative as V,resolve as H,sep as hr}from"node:path";import gr from"node:process";import{fileURLToPath as _r}from"node:url";import{accessSync as vr,appendFileSync as yr,closeSync as br,constants as xr,existsSync as U,lstatSync as Sr,mkdirSync as Cr,mkdtempSync as wr,readFileSync as W,readdirSync as Tr,readlinkSync as Er,realpathSync as Dr,renameSync as Or,rmSync as kr,statSync as G,unlinkSync as K,writeFileSync as Ar}from"node:fs";import{homedir as jr,platform as Mr,tmpdir as Nr}from"node:os";import{rm as Pr}from"node:fs/promises";import{randomUUID as Fr}from"node:crypto";import{promisify as Ir}from"node:util";import{setTimeout as Lr}from"node:timers/promises";import{createInterface as Rr}from"node:readline/promises";const zr={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 Br;Br||={};function Vr(e){return _(oe,e)}async function Hr(e){let{projectDir:t,contentDir:r,baseConfig:i,targetPath:a,fix:o=!1}=e,s=[],c=zt({projectDir:t,contentDir:r}),l=new Set,u=e=>{l.has(e)||(l.add(e),s.push(e))},d=st(t,i,u),f=m(d,{mode:`lint`}),p=[],h=e=>{p.push(e)},g=new Map,_=e=>{let t=z(e),n=g.get(t);if(n)return n;let i=Qe(r,e,u),a=It(d,i);return g.set(t,a),a},v=[],y=Ur(a,r);y.kind===`file`?v.push(V(r,y.path)):b(y.path);function b(e){let t;try{t=Tr(e,{withFileTypes:!0})}catch(t){s.push(`could not read directory ${V(r,e)||`.`}: ${Gr(t)}`);return}for(let n of t){if(n.name.startsWith(`.`))continue;let t=B(e,n.name),i=V(r,t);if(n.isDirectory()){if(c.isDirExcluded(i))continue;b(t)}else if(n.isFile()){if(!Wr(n.name)||c.isExcluded(i))continue;v.push(i)}}}v.sort();let x=[],S=0,C=0,ee=0;for(let e of v){let t=B(r,e),i;try{i=W(t,`utf-8`)}catch(t){s.push(`could not read ${e}: ${Gr(t)}`);continue}let a=_(e),c=!1;if(o&&a.enabled){let n=ae(i,a,e,h);if(n!==i){let r=`${t}.tmp.${process.pid}.${Date.now()}`;try{Ar(r,n,`utf-8`),Or(r,t),i=n,c=!0,ee++}catch(t){try{K(r)}catch{}s.push(`could not write fix to ${e}: ${Gr(t)}`)}}}let l=await n(i,a,e,h);for(let e of l)e.severity===`error`?S++:C++;x.push({file:e,diagnostics:l,fixed:c})}return s.push(...te(p)),{contentDir:r,files:x,warnings:s,fileCount:v.length,errorCount:S,warningCount:C,fixedCount:ee,ran:f}}function Ur(e,t){if(e===void 0||e===``)return{kind:`dir`,path:t};let n=pr(e)?e:H(t,e);try{if(G(n).isFile())return{kind:`file`,path:n}}catch{}return{kind:`dir`,path:n}}function Wr(e){let t=e.toLowerCase();return y.some(e=>t.endsWith(e))}function Gr(e){return e instanceof Error?e.message:String(e)}function Kr(e){return new M(`lint`).description(`Lint markdown content (headless) — whole project, a folder, or a single file`).argument(`[path]`,`Folder or file to lint, relative to where you run the command`).option(`--json`,`Emit structured JSON instead of formatted text`).option(`--fix`,`Auto-fix fixable issues in place (markdownlint rules only)`).option(`--errors-only`,`Exit non-zero only on error-severity problems (findings are warning-severity unless your .markdownlint.* assigns a rule "error")`).action(async(t,n)=>{let r=e(),i=process.cwd(),o=Xe(r,i),s=t===void 0?void 0:qr(t,tn()),c=r.contentRules,l=await Hr({projectDir:i,contentDir:o,baseConfig:c?a(c):x,targetPath:s,fix:n.fix===!0});n.json===!0?process.stdout.write(`${JSON.stringify(l,null,2)}\n`):process.stdout.write(`${Xr(l)}\n`),(n.errorsOnly===!0?l.errorCount>0:Jr(l))&&(process.exitCode=1)})}function qr(e,t){return H(t,e)}function Jr(e){return e.errorCount>0||e.warningCount>0}function Yr(e){let t=[R(e.file)+(e.fixed?P(` (fixed)`):``)];for(let n of e.diagnostics){let e=P(`${n.range.start.line+1}:${n.range.start.character+1}`.padEnd(7)),r=n.severity===`error`?I(`error `):L(`warning`);t.push(` ${e} ${r} ${n.message} ${P(`${n.source}/${n.code}`)}`)}return t.push(``),t}function Xr(e){let t=[];for(let n of e.files)n.diagnostics.length>0&&t.push(...Yr(n));let n=e.errorCount+e.warningCount;if(n===0)t.push(F(`✓ No problems in ${e.fileCount} file${e.fileCount===1?``:`s`}.`));else{let r=[`${n} problem${n===1?``:`s`}`];r.push(`${e.errorCount} error${e.errorCount===1?``:`s`}`),r.push(`${e.warningCount} warning${e.warningCount===1?``:`s`}`),t.push(`${I(r[0]??``)} (${r[1]}, ${r[2]}) across ${e.fileCount} file${e.fileCount===1?``:`s`}.`)}if(e.fixedCount>0&&t.push(P(`Fixed ${e.fixedCount} file${e.fixedCount===1?``:`s`}.`)),t.push(...h(e.ran).map(e=>P(e))),e.warnings.length>0){t.push(``);for(let n of e.warnings)t.push(L(`! ${n}`))}return t.join(`
3
3
  `)}const Zr={out:e=>process.stdout.write(`${e}\n`),err:e=>process.stderr.write(`${e}\n`)};function Qr(e){return new M(`audit`).description(`Unified validation audit (markdown lint + broken internal links) via the running project server`).argument(`[path]`,`Folder or file to audit, relative to where you run the command`).option(`--json`,`Emit the full structured JSON response instead of formatted text`).option(`--errors-only`,`Exit non-zero only on error-severity problems (broken links default to warnings; the project's validation.links setting can raise them to errors)`).action(async(t,n)=>{let r=await $r(t,n,e(),process.cwd(),tn());r!==0&&(process.exitCode=r)})}async function $r(e,t,n,r,i,a=Zr){let o=Xe(n,r),s;if(e!==void 0){let t=ei(e,i,o);if(t===null)return a.err(`Path is outside the content directory (${o}): ${e}`),1;s=t===``?void 0:t}let c=He(j(r));if(!c||c.port<=0)return a.err("OpenKnowledge server is not running — the links validator needs the live backlink index. Start it with `ok start` (or open OK Desktop) and re-run. For headless lint-only checks, use `ok lint`."),1;let l=s===void 0?``:`?path=${encodeURIComponent(s)}`,d;try{d=await fetch(`http://127.0.0.1:${c.port}/api/audit${l}`,{headers:ue({kind:`cli`,runtimeVersion:At})})}catch(e){return a.err(`Could not reach the OpenKnowledge server on port ${c.port}: ${String(e)}`),1}if(!d.ok){let e=await d.json().catch(()=>({}));return a.err(`Audit failed: ${e.title??e.error??e.message??`server responded with ${d.status}`}`),1}let f=u.safeParse(await d.json().catch(()=>null));if(!f.success){let e=f.error.issues.map(e=>`${e.path.join(`.`)}: ${e.message}`).join(`; `);return a.err(`Audit failed: unexpected response shape from the server. Schema issues: ${e}`),1}let p=f.data;return t.json===!0?a.out(JSON.stringify(p,null,2)):a.out(Xr(ti(p))),+(t.errorsOnly===!0?p.errorCount>0:p.errorCount+p.warningCount>0)}function ei(e,t,n){let r=V(n,H(t,e));return r===``?``:r.startsWith(`..`)||pr(r)?null:r.split(hr).join(`/`)}function ti(e){return{files:e.files.map(e=>({file:e.file,fixed:!1,diagnostics:e.diagnostics})),warnings:e.warnings,fileCount:e.fileCount,errorCount:e.errorCount,warningCount:e.warningCount,fixedCount:0,ran:e.ran}}async function ni(e,t,n,r){let i=ri(await ii(e)).host??``,a=e=>e.replace(/[\r\n]/g,``);if(!i)return r?.log?.warn({outcome:`no-host`,backend:n.backend},`[auth] git-credential get`),1;let o=process.env.OK_GH_TOKEN,s=process.env.OK_GH_TOKEN_HOST;if(o&&s===i)return r?.log?.debug({host:i,outcome:`gh-env-token`,backend:n.backend,relayLogin:process.env.OK_GH_TOKEN_LOGIN},`[auth] git-credential get`),t.write(`username=x-access-token\npassword=${a(o)}\n`),0;let c=await n.get(i),l=r?.getDiag?.(),u=c==null?l?.kind??`absent`:`found`;if(r?.log){let e={host:i,outcome:u,backend:n.backend,...l?.error?{keychainError:l.error}:{}};u===`found`?r.log.debug(e,`[auth] git-credential get`):r.log.warn(e,`[auth] git-credential get`)}return c==null?1:(t.write(`username=${a(c.login)}\npassword=${a(c.token)}\n`),0)}function ri(e){let t={};for(let n of e.split(`
4
4
  `)){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 ii(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 ai(e,t){let n=new M(`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 n=t?.();try{let t,r=await e({onKeychainRead:e=>{t=e},onBackendSelected:e=>{e.backend===`file`&&e.reason&&n?.warn({backend:`file`,reason:e.reason},`[auth] token storage fallback`)}}),i=await ni(process.stdin,process.stdout,r,{log:n,getDiag:()=>t});await Se(n),process.exit(i)}catch(e){n?.error({err:e},`[auth] git-credential get: unexpected error`),await Se(n),process.exit(1)}}),n}function oi(e){let t=e.endpoint.DEFAULTS;return/^https:\/\/(api\.)?github\.com$/.test(t.baseUrl)?`https://github.com`:t.baseUrl.replace(`/api/v3`,``)}async function si(e,t,n){let r={baseUrl:oi(e),headers:{accept:`application/json`},...n},i=await e(t,r);if(`error`in i.data){let n=new An(`${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 ci(e){let t=e.request||Mn,n={client_id:e.clientId};return`scopes`in e&&Array.isArray(e.scopes)&&(n.scope=e.scopes.join(` `)),si(t,`POST /login/device/code`,n)}async function li(e){let t=await si(e.request||Mn,`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=ui(e,t.data.expires_in),n.refreshTokenExpiresAt=ui(e,t.data.refresh_token_expires_in)}delete n.scopes}return{...t,authentication:n}}function ui(e,t){return new Date(e+t*1e3).toISOString()}async function di(e,t){let n=fi(e,t.auth);if(n)return n;let{data:r}=await ci({clientType:e.clientType,clientId:e.clientId,request:t.request||e.request,scopes:t.auth.scopes||e.scopes});await e.onVerification(r);let i=await mi(t.request||e.request,e.clientId,e.clientType,r);return e.authentication=i,i}function fi(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}async function pi(e){await new Promise(t=>setTimeout(t,e*1e3))}async function mi(e,t,n,r){try{let i={clientId:t,request:e,code:r.device_code},{authentication:a}=n===`oauth-app`?await li({...i,clientType:`oauth-app`}):await li({...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 pi(r.interval),mi(e,t,n,r);if(a===`slow_down`)return await pi(r.interval+7),mi(e,t,n,r);throw i}}async function hi(e,t){return di(e,{auth:t})}async function gi(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 di(e,{request:t,auth:{type:`oauth`}});return i.headers.authorization=`token ${a}`,t(i)}var _i=`0.0.0-development`;function vi(e){let t=e.request||Mn.defaults({headers:{"user-agent":`octokit-auth-oauth-device.js/${_i} ${jn()}`}}),{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(hi.bind(null,i),{hook:gi.bind(null,i)})}async function yi(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=vi({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-Dl9Hkg-Q.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??[]}}function bi(){return process.env.OPEN_KNOWLEDGE_GITHUB_CLIENT_ID??`Ov23liqlSd0V1MwR6rhI`}function xi(e){let t=e.toLowerCase().replace(/:\d+$/,``);p.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 Si(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function Ci(e,t,n=yi){let r=bi(),{host:i,json:a}=e;xi(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?Si(!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?Si(!0,{type:`complete`,host:i,login:s}):process.stderr.write(`✓ Logged in as ${s} on ${i}\n`)}function wi(e){return new M(`login`).description(`Authenticate with GitHub via Device Flow`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname (default: workspace origin host)`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{let n=t.host??Ft(process.cwd()),r=await e();await Ci({...t,host:n},r)})}const Ti={style:{maskedText:`[input is masked]`}};var Ei=Rn((e,t)=>{let{validate:n=()=>!0}=e,r=Pn(Ti,e.theme),[i,a]=Kn(`idle`),[o,s]=Kn(),[c,l]=Kn(``),u=Xn({status:i,theme:r});Wn(async(e,r)=>{if(i===`idle`){if(Ln(e)){let e=c;a(`loading`);let i=await n(e);i===!0?(l(e),a(`done`),t(e)):(r.write(c),s(i||`You must provide a valid value`),a(`idle`))}else l(r.line),s(void 0)}});let d=r.style.message(e.message,i),f=``,p;e.mask?f=(typeof e.mask==`string`?e.mask:`*`).repeat(c.length):i!==`done`&&(p=`${r.style.help(r.style.maskedText)}${zn}`),i===`done`&&(f=r.style.answer(f));let m=``;return o&&(m=r.style.error(o)),[[u,d,e.mask?f:p].join(` `),m]});function Di(e,t,n,r){if(typeof n!=`function`)throw Error(`method for before hook must be a function`);return r||={},Array.isArray(t)?t.reverse().reduce((t,n)=>Di.bind(null,e,n,t,r),n)():Promise.resolve().then(()=>e.registry[t]?e.registry[t].reduce((e,t)=>t.hook.bind(null,e,r),n)():n(r))}function Oi(e,t,n,r){let i=r;e.registry[n]||(e.registry[n]=[]),t===`before`&&(r=(e,t)=>Promise.resolve().then(i.bind(null,t)).then(e.bind(null,t))),t===`after`&&(r=(e,t)=>{let n;return Promise.resolve().then(e.bind(null,t)).then(e=>(n=e,i(n,t))).then(()=>n)}),t===`error`&&(r=(e,t)=>Promise.resolve().then(e.bind(null,t)).catch(e=>i(e,t))),e.registry[n].push({hook:r,orig:i})}function ki(e,t,n){if(!e.registry[t])return;let r=e.registry[t].map(e=>e.orig).indexOf(n);r!==-1&&e.registry[t].splice(r,1)}const Ai=Function.bind,ji=Ai.bind(Ai);function Mi(e,t,n){let r=ji(ki,null).apply(null,n?[t,n]:[t]);e.api={remove:r},e.remove=r,[`before`,`error`,`after`,`wrap`].forEach(r=>{let i=n?[t,r,n]:[t,r];e[r]=e.api[r]=ji(Oi,null).apply(null,i)})}function Ni(){let e=Symbol(`Singular`),t={registry:{}},n=Di.bind(null,t,e);return Mi(n,t,e),n}function Pi(){let e={registry:{}},t=Di.bind(null,e);return Mi(t,e),t}var Fi={Singular:Ni,Collection:Pi},Ii=`0.0.0-development`;function Li(e){return`Request failed due to following response errors:
5
5
  `+e.errors.map(e=>` - ${e.message}`).join(`
@@ -8,9 +8,9 @@ import{o as e}from"./rolldown-runtime-tZXQYakl.mjs";import{$l as t,Ao as n,Bc as
8
8
  `),n.includes(`file`)&&process.stderr.write(` cleared from ~/.ok/auth.yml
9
9
  `)}function Aa(){return new M(`signout`).description(`Remove stored credentials`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname (default: workspace origin host)`).action(async e=>{let t=e.host??Ft(process.cwd());await ka({...e,host:t})})}async function ja(e,t,n=Zn){let r=n(e);if(r.available&&r.token)return{tier:`A`,token:r.token};let i=await t.get(e);return i==null?{tier:`none`}:{tier:i.gitProtocol===`ssh`?`C`:`B`,token:i.token}}function Ma(e,t,n){return{type:`status`,host:e,backend:t,...n}}async function Na(e,t){let{host:n,json:r}=e;xi(n);let i=t.backend,a=await ja(n,t);a.tier===`none`&&(r?process.stdout.write(`${JSON.stringify(Ma(n,i,{authenticated:!1}))}\n`):process.stderr.write(`Not logged in to ${n}\n`),process.exit(1));let o=n===`github.com`?void 0:`https://${n}/api/v3`,s=new ya({auth:a.token,...o?{baseUrl:o}:{}});try{let{data:e}=await s.users.getAuthenticated();r?process.stdout.write(`${JSON.stringify(Ma(n,i,{authenticated:!0,tier:a.tier,login:e.login,name:e.name,email:e.email}))}\n`):process.stderr.write(`✓ Logged in as ${e.login} on ${n}\n`)}catch(e){let t=Sa(e,n);r?process.stdout.write(`${JSON.stringify(Ma(n,i,{authenticated:!1,error:t.message}))}\n`):process.stderr.write(`✗ ${t.message}\n`),process.exit(1)}}function Pa(e){return new M(`status`).description(`Show authentication status`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname (default: workspace origin host)`).option(`--json`,`Output JSON`,!1).action(async t=>{let n=t.host??Ft(process.cwd());await Na({...t,host:n},await e())})}function Fa(e){let t=new M(`auth`);t.description(`GitHub authentication management`);let n=e=>Dn(void 0,e);return t.addCommand(wi(n)),t.addCommand(Pa(n)),t.addCommand(Oa(n)),t.addCommand(Aa()),t.addCommand(Ta(n)),t.addCommand(ai(n,e)),t}function Ia(e,t=Mr(),n=kn){try{t===`darwin`?n(`/usr/bin/open`,[`-R`,e]):n(t===`win32`?`explorer.exe`:`xdg-open`,[z(e)])}catch{}}function La(){return new M(`bug-report`).description(`Generate a diagnostic bundle for bug reporting`).option(`--reveal`,`Reveal the bundle in your file manager (default: true)`,!0).option(`--no-reveal`,`Do not reveal the bundle in your file manager`).action(async e=>{try{let{zipPath:t,summary:n}=await nn({level:`standard`,projectDir:process.cwd(),redact:!0,outputPath:rn(),logger:Zt()});process.stdout.write(`${t}\n`),n.redactedLineCount>0&&process.stderr.write(`ok bug-report: ${n.redactedLineCount} line(s) auto-redacted across ${n.redactions.length} file(s)\n`),e.reveal&&Ia(t)}catch(e){let t=e instanceof Error?e.message:String(e);process.stderr.write(`ok bug-report: failed — ${t}\n`),process.exitCode=1}})}function Ra(e){let t=[];return(e.status===`dead-pid`||e.status===`corrupt`)&&t.push({name:`server`,lockPath:e.lockPath,reason:e.status}),{prune:t}}function za(e){let t=e.inspect??(()=>mn(e.lockDir,`server`)),n=e.unlink??(e=>K(e)),r=e.log??(e=>console.log(e)),i=e.error??(e=>console.error(e)),a=Ra(t());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 Ba(e){return new M(`clean`).description(`Prune a stale / corrupt open-knowledge lock file (never touches live locks)`).action(()=>{e(),za({lockDir:j(process.cwd())}).failed.length>0&&(process.exitCode=1)})}function Va(e){return`credential.helper=!${e.map(ee).join(` `)} auth git-credential`}async function Ha(e,t,n={},r=Zn){let i=[`credential.helper=`,Va(n.selfCliArgs??[`open-knowledge`])];if(!n.skipGhDetect){let t=r(e,{login:n.login});if(t.available&&t.token)return{tier:`A`,gitConfig:i,relayToken:{token:t.token,host:e,...t.resolvedLogin?{login:t.resolvedLogin}:{}}}}let a=await t.get(e);return a==null?{tier:`none`,gitConfig:[]}:{tier:a.gitProtocol===`ssh`?`C`:`B`,gitConfig:i}}async function Ua(e,t,n=fetch){let r=new AbortController,i=setTimeout(()=>r.abort(),5e3);try{return(await n(`https://api.github.com/repos/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,{signal:r.signal,headers:{"User-Agent":`open-knowledge-cli`,Accept:`application/vnd.github+json`}})).status===200}catch{return!1}finally{clearTimeout(i)}}const Wa=[[`count`,0,10],[`compress`,10,20],[`receiv`,20,60],[`resolv`,60,100]];function Ga(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 Wa)if(n.includes(e))return{stage:t[1],pct:Math.round(i+r/100*(a-i))};return null}function q(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}function Ka(e=process.env){let t={};for(let[n,r]of Object.entries(e))r!==void 0&&(t[n]=r);return t.GIT_TERMINAL_PROMPT=`0`,t.LANG=`C`,t.LC_ALL=`C`,t}function qa(e,t=process.env){let n=Ka(t);return e.relayToken?(n.OK_GH_TOKEN=e.relayToken.token,n.OK_GH_TOKEN_HOST=e.relayToken.host,e.relayToken.login?n.OK_GH_TOKEN_LOGIN=e.relayToken.login:delete n.OK_GH_TOKEN_LOGIN):(delete n.OK_GH_TOKEN,delete n.OK_GH_TOKEN_HOST,delete n.OK_GH_TOKEN_LOGIN),n}function Ja(e=process.argv,t=process.execPath){let n=e[1];return n?[t,n]:[t]}function Ya(e){return typeof e!=`string`||e.length===0?[`--progress`]:[`--progress`,`-b`,e]}const Xa=de;async function Za(e){try{return await e.clone(Ya(e.branch)),{fellBack:!1}}catch(t){if(e.branch!==null&&Xa(t))return e.onFallback(e.branch),await e.clone(Ya(null)),{fellBack:!0};throw t}}function Qa(e,t){return{baseDir:e,config:t,unsafe:{allowUnsafeCredentialHelper:!0,allowUnsafePager:!0,allowUnsafeSshCommand:!0,allowUnsafeAskPass:!0,allowUnsafeEditor:!0}}}function $a(e,t,n){return e===`https`&&t===`github.com`&&n}function eo(e){if(e===void 0)return null;let{declaredLogin:t,declaredSource:n}=e,r;switch(n){case`remote-url`:r=`The clone URL names ${t}`;break;case`credential-config`:r=`Your Git credential configuration names ${t}`;break;default:r=`Your Git configuration names ${t}`}return`⚠ ${r}, but the GitHub CLI couldn't confirm that account — the clone used its active account.\n Run \`gh auth status\` to see which account that is. If ${t} is listed as active, nothing is wrong; confirming an account by name needs GitHub CLI 2.40 or newer.\n`}async function to(e,t,n={}){let r=dn(e);if(!r)throw Error(`Invalid git URL: ${oo(e)}`);let i=Ze(e,{cwd:n.cwd,_readCredentialUrlMatch:n._readCredentialUrlMatch}),a=await Ha(i.host??r.hostname,t,{selfCliArgs:n.selfCliArgs,login:i.login},n._detectGhFn),o=i.login!==void 0&&a.tier===`A`&&!bt(a.relayToken?.login,i.login)?{declaredLogin:i.login,declaredSource:i.source}:void 0;return{auth:a,...o===void 0?{}:{declaredMiss:o}}}function no(e,t){let n=`${t.owner}/${t.name}`;return e===n||e===`${n}.git`?`https://${t.hostname}/${n}`:e}async function ro(e,t,n,r=process.cwd()){let i=dn(e);if(!i)throw Error(`Invalid git URL: ${oo(e)}`);let a=no(e,i),o=t.dir?H(r,t.dir):H(r,i.name);if(U(o)&&Tr(o).length>0)throw Error(`Target directory is not empty: ${o}`);Re();let s=Tn(),c=i.protocol===`https`&&i.hostname===`github.com`&&await Ua(i.owner,i.name),l=$a(i.protocol,i.hostname,c)?{auth:{tier:`none`,gitConfig:[]}}:await to(a,s,{selfCliArgs:Ja(),cwd:r,...t._detectGhFn?{_detectGhFn:t._detectGhFn}:{}}),u=l.auth;if(t.onAuthResolved?.({tier:u.tier,login:u.relayToken?.login}),!t.json){let e=eo(l.declaredMiss);e&&process.stderr.write(e)}let d=qa(u),f=Qa(r,u.gitConfig),p=it(f).env(d),m=-1;p.outputHandler((e,n,r)=>{r.on(`data`,e=>{let n=e.toString(`utf-8`);for(let e of n.split(`
10
10
  `)){let n=Ga(e);n&&n.pct!==m&&(m=n.pct,q(t.json,{type:`progress`,pct:n.pct,stage:n.stage}),t.json||process.stderr.write(`\r Cloning ${n.pct}%`))}})}),await Za({branch:typeof t.branch==`string`&&t.branch.length>0?t.branch:null,clone:e=>p.clone(a,o,e),onFallback:e=>{q(t.json,{type:`branch-fallback`,branch:e}),t.json||process.stderr.write(`\n Branch '${e}' not found upstream — cloning default branch instead.\n`)}}),t.json||process.stderr.write(`
11
- `);try{let{runInit:e}=await import(`./init-BHTd_ERi.mjs`),n=await e({cwd:o,mcp:!1});if(n.contentUpdated.length>0){let e=`auto-init: updated ${n.contentUpdated.join(`, `)}`;t.json?q(!0,{type:`warning`,message:e}):process.stderr.write(` ${e}\n`)}}catch(e){let n=e instanceof Error?e.message:String(e);t.json?q(!0,{type:`warning`,message:`auto-init: ${n}`}):process.stderr.write(` auto-init: ${n}\n`)}try{io(o)}catch(e){let n=e instanceof Error?e.message:String(e);t.json?q(!0,{type:`warning`,message:`git-exclude: ${n}`}):process.stderr.write(` git-exclude: ${n}\n`)}return o}function io(e){let t=Hn(e,[`.ok/`]);return t.kind===`no-exclude`?`no-exclude`:t.kind===`refused-tracked`?`already-present`:t.appended.length>0?`appended`:`already-present`}const ao=/^[A-Za-z0-9._/:@-]+$/;function oo(e){return e.replace(/^([a-z][a-z0-9+.-]*:\/\/)([^/]*)@/i,(e,t,n)=>{let r=n.indexOf(`:`),i=r===-1?n:n.slice(0,r);return i!==``&&kt(i)!==void 0?`${t}${i}@`:t})}function so(e){return ao.test(e)?e:ee(e)}function co(e,t){let n=typeof t==`string`&&t.length>0?` -b ${so(t)}`:``;return`ok clone ${so(e)}${n}`}function lo(e){let t=ve(e.error);if(t.kind!==`auth`)return null;let n=oo(e.url);if(ye(t)){let t=co(n,e.branch);return[`✗ Couldn't clone ${n} — authentication is required.`,``,` To fix:`,` 1. Run: ok auth login`,` 2. Then re-run: ${t}`].join(`
11
+ `);try{let{runInit:e}=await import(`./init-Do0GyR_Y.mjs`),n=await e({cwd:o,mcp:!1});if(n.contentUpdated.length>0){let e=`auto-init: updated ${n.contentUpdated.join(`, `)}`;t.json?q(!0,{type:`warning`,message:e}):process.stderr.write(` ${e}\n`)}}catch(e){let n=e instanceof Error?e.message:String(e);t.json?q(!0,{type:`warning`,message:`auto-init: ${n}`}):process.stderr.write(` auto-init: ${n}\n`)}try{io(o)}catch(e){let n=e instanceof Error?e.message:String(e);t.json?q(!0,{type:`warning`,message:`git-exclude: ${n}`}):process.stderr.write(` git-exclude: ${n}\n`)}return o}function io(e){let t=Hn(e,[`.ok/`]);return t.kind===`no-exclude`?`no-exclude`:t.kind===`refused-tracked`?`already-present`:t.appended.length>0?`appended`:`already-present`}const ao=/^[A-Za-z0-9._/:@-]+$/;function oo(e){return e.replace(/^([a-z][a-z0-9+.-]*:\/\/)([^/]*)@/i,(e,t,n)=>{let r=n.indexOf(`:`),i=r===-1?n:n.slice(0,r);return i!==``&&kt(i)!==void 0?`${t}${i}@`:t})}function so(e){return ao.test(e)?e:ee(e)}function co(e,t){let n=typeof t==`string`&&t.length>0?` -b ${so(t)}`:``;return`ok clone ${so(e)}${n}`}function lo(e){let t=ve(e.error);if(t.kind!==`auth`)return null;let n=oo(e.url);if(ye(t)){let t=co(n,e.branch);return[`✗ Couldn't clone ${n} — authentication is required.`,``,` To fix:`,` 1. Run: ok auth login`,` 2. Then re-run: ${t}`].join(`
12
12
  `)}return t.subclass===`403`?`✗ Access denied when cloning ${n}${typeof e.principal==`string`&&e.principal.length>0?` (signed in as @${e.principal} — may lack access)`:``}. Check that your account has access to the repository.`:t.subclass===`ssh-auth`?`✗ Couldn't clone ${n} over SSH — authentication failed. Check that your SSH key is added to your GitHub account and the host key is trusted, or clone the HTTPS URL instead.`:t.subclass===`not-found-as-identity`?`✗ Repository not found when cloning ${n}. It may not exist, or the account used may not have access.${typeof e.resolvedLogin==`string`&&e.resolvedLogin.length>0?` Authenticated as ${e.resolvedLogin}.`:``}`:["✗ Your GitHub token is missing required OAuth scopes — likely the `repo` scope.",``,` To fix:`," 1. Create a token with `repo` scope at https://github.com/settings/tokens",` 2. Run: ok auth pat`,` 3. Then re-run: ${co(n,e.branch)}`].join(`
13
- `)}function uo(e){let t=Le(e.error instanceof Error?e.error.message:String(e.error));if(e.json){e.emit({type:`error`,message:t});return}let n=lo({error:e.error,url:e.url,branch:e.branch,principal:e.principal,resolvedLogin:e.resolvedLogin});e.printStderr(`${n??`✗ ${t}`}\n`)}async function fo(e,t){let n=(await e.get(t))?.login;return n&&n!==`unknown`?n:null}async function po(e){let t=ve(e.error),n=e.auth?.tier===`A`?e.auth:void 0,r=null;if(!e.json&&t.kind===`auth`&&t.subclass===`403`){if(n)r=n.login??null;else if(e.auth?.tier!==`none`){let t=dn(e.url);t&&(r=await(e.resolvePrincipal??(e=>fo(Tn(),e)))(t.hostname))}}uo({error:e.error,url:e.url,branch:e.branch,json:e.json,principal:r,resolvedLogin:n?.login??null,emit:e.emit,printStderr:e.printStderr})}function mo(e){return new M(`clone`).description(`Clone a git repository and open it`).argument(`<url>`,`Repository URL or owner/repo shorthand`).argument(`[dir]`,`Target directory (default: ./<repo-name>)`).option(`--json`,`Output JSONL progress events`,!1).option(`-b, --branch <branch>`,`Branch to check out (falls back to default if missing)`).action(async(t,n,r)=>{let i=e(),a;try{let o=await ro(t,{json:r.json,dir:n,branch:r.branch??null,onAuthResolved:e=>{a=e}},i);if(r.json)q(!0,{type:`complete`,dir:o});else{process.stderr.write(`✓ Cloned to ${o}\n`),process.chdir(o);let{startCommand:t}=await import(`./start-cn3uDrUj.mjs`);await t(e).parseAsync([],{from:`user`})}}catch(e){if(e instanceof Ie||e instanceof Oe){r.json?q(!0,{type:`error`,message:e.message}):process.stderr.write(`${e.message}\n`),process.exitCode=78;return}await po({error:e,url:t,branch:r.branch??null,json:r.json,auth:a,emit:e=>q(!0,e),printStderr:e=>process.stderr.write(e)}),process.exitCode=1}})}var ho=t();const go=[[`sync`],[`persistence`,`debounceMs`],[`persistence`,`maxDebounceMs`],...S.map(e=>e.path)];function _o(e){return De({absPath:Ue(`project-local`,e),sideline:!1}).diagnostics}function vo(e={}){let t=e.log??(e=>console.error(e)),n=e.error??(e=>console.error(e)),r=e.loadConfigFn??nr;try{let{sources:n,diagnostics:i,sidelined:a}=r(e.cwd),o=(e.readProjectLocalFn??_o)(e.cwd??process.cwd()),s=[...i,...o],c=n.length===0?`defaults only`:n.join(`, `),l=s.filter(e=>e.code!==`REMOVED_KEY`);l.length===0?t(`✓ Configuration valid (sources: ${c})`):t(`! Configuration loaded, but ${l.length} config layer(s) had issues (sources: ${c})`);for(let e of s)t(``),t(E(e));for(let{from:e,to:n}of a)t(``),t(`Moved ${e} aside to ${n} so defaults could be used. Restore it once fixed.`);return{ok:!0}}catch(e){return n(e instanceof Error?e.message:String(e)),{ok:!1}}}function yo(e){let t=W(e,`utf-8`),n=(0,ho.parseDocument)(t);if(n.errors.length>0)throw Error(`Could not parse ${e}: ${n.errors.map(e=>e.message).join(`; `)}`);let r=[];for(let e of go)n.hasIn(e)&&r.push(e.join(`.`));return r}function bo(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function xo(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=bo(i)?i:{};e[r]=a,e=a}e[n[n.length-1]]=null}return t}function So(e){switch(e){case`project`:return[`project`];case`project-local`:return[`project-local`];case`user`:return[`user`];case`both`:return[`project`,`user`];case`all`:return[`project`,`project-local`,`user`]}}async function Co(e={}){let t=e.log??(e=>console.log(e)),n=e.error??(e=>console.error(e)),r=e.scope??`all`,i=e.dryRun??!1,a=e.cwd??process.cwd(),o=e.writeConfigPatchFn??Fe,s=So(r).map(t=>({scope:t,absPath:Ue(t,a,e.homedirOverride)})),c=[],l=!0;for(let{scope:t,absPath:n}of s){if(!U(n)){c.push({path:n,scope:t,found:[],removed:[]});continue}let r;try{r=yo(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:xo(go.filter(e=>r.includes(e.join(`.`)))),homedirOverride:e.homedirOverride});if(!s.ok){c.push({path:n,scope:t,found:r,removed:[],error:E(s.error)}),l=!1;continue}c.push({path:n,scope:t,found:r,removed:r})}for(let e of c)e.error&&n(`✗ ${e.path}: ${e.error}`);let u=c.some(e=>e.error!==void 0),d=c.reduce((e,t)=>e+t.found.length,0);if(d===0&&!u)t(`No deprecated fields found.`);else if(d>0)for(let e of c)e.error||(e.found.length===0?t(` ${e.path}: no deprecated fields`):t(i?`[dry-run] ${e.path}: would remove ${e.found.length} field(s): ${e.found.join(`, `)}`:`✓ ${e.path}: removed ${e.removed.length} field(s): ${e.removed.join(`, `)}`));return{outcomes:c,ok:l}}const wo=`project | project-local | user | all`,To=new Set(Object.keys({project:!0,"project-local":!0,user:!0,both:!0,all:!0}));function Eo(e){return e!==`config`}function Do(){let e=new M(`config`).description(`Inspect and maintain OpenKnowledge configuration files`);return e.command(`validate`).description(`Validate the merged config (defaults → user → project)`).action(()=>{vo({}).ok||(process.exitCode=1)}),e.command(`migrate`).description(`Remove deprecated config fields from config.yml idempotently (every removed key in the registry — content.*, folders, appearance.editorModeDefault, server.host, etc. — plus the silently-dropped sync.*, persistence.*)`).option(`--scope <scope>`,`Which scope to migrate: ${wo}`,`all`).option(`--dry-run`,`Preview without writing`,!1).action(async e=>{let t=String(e.scope);if(!To.has(t)){console.error(`Invalid --scope: ${t}. Expected: ${wo}`),process.exitCode=2;return}(await Co({scope:t,dryRun:e.dryRun})).ok||(process.exitCode=1)}),e}const Oo=[` 1. ${R(`Customize`)} (sidebar) → ${R(`Skills`)}`,` 2. Click the ${R(`+`)} button`,` 3. Click ${R(`Create skill`)}`,` 4. Click ${R(`Upload skill`)}`,` 5. Pick ${R(`openknowledge.skill`)} from Downloads`],ko=N(` Open the Claude Desktop App, then: ${R(`Customize → Skills → + → Create skill → Upload skill`)} → pick the file.`);function Ao(e){let t=[F(`Built ${e.outputPath}`),P(` ${e.size} bytes • sha256 ${e.sha256?.slice(0,12)}…`)];return e.handoffError&&t.push(L(` Handoff failed: ${e.handoffError.message}`)),t.push(ko),t.join(`
13
+ `)}function uo(e){let t=Le(e.error instanceof Error?e.error.message:String(e.error));if(e.json){e.emit({type:`error`,message:t});return}let n=lo({error:e.error,url:e.url,branch:e.branch,principal:e.principal,resolvedLogin:e.resolvedLogin});e.printStderr(`${n??`✗ ${t}`}\n`)}async function fo(e,t){let n=(await e.get(t))?.login;return n&&n!==`unknown`?n:null}async function po(e){let t=ve(e.error),n=e.auth?.tier===`A`?e.auth:void 0,r=null;if(!e.json&&t.kind===`auth`&&t.subclass===`403`){if(n)r=n.login??null;else if(e.auth?.tier!==`none`){let t=dn(e.url);t&&(r=await(e.resolvePrincipal??(e=>fo(Tn(),e)))(t.hostname))}}uo({error:e.error,url:e.url,branch:e.branch,json:e.json,principal:r,resolvedLogin:n?.login??null,emit:e.emit,printStderr:e.printStderr})}function mo(e){return new M(`clone`).description(`Clone a git repository and open it`).argument(`<url>`,`Repository URL or owner/repo shorthand`).argument(`[dir]`,`Target directory (default: ./<repo-name>)`).option(`--json`,`Output JSONL progress events`,!1).option(`-b, --branch <branch>`,`Branch to check out (falls back to default if missing)`).action(async(t,n,r)=>{let i=e(),a;try{let o=await ro(t,{json:r.json,dir:n,branch:r.branch??null,onAuthResolved:e=>{a=e}},i);if(r.json)q(!0,{type:`complete`,dir:o});else{process.stderr.write(`✓ Cloned to ${o}\n`),process.chdir(o);let{startCommand:t}=await import(`./start-CdgXY25v.mjs`);await t(e).parseAsync([],{from:`user`})}}catch(e){if(e instanceof Ie||e instanceof Oe){r.json?q(!0,{type:`error`,message:e.message}):process.stderr.write(`${e.message}\n`),process.exitCode=78;return}await po({error:e,url:t,branch:r.branch??null,json:r.json,auth:a,emit:e=>q(!0,e),printStderr:e=>process.stderr.write(e)}),process.exitCode=1}})}var ho=t();const go=[[`sync`],[`persistence`,`debounceMs`],[`persistence`,`maxDebounceMs`],...S.map(e=>e.path)];function _o(e){return De({absPath:Ue(`project-local`,e),sideline:!1}).diagnostics}function vo(e={}){let t=e.log??(e=>console.error(e)),n=e.error??(e=>console.error(e)),r=e.loadConfigFn??nr;try{let{sources:n,diagnostics:i,sidelined:a}=r(e.cwd),o=(e.readProjectLocalFn??_o)(e.cwd??process.cwd()),s=[...i,...o],c=n.length===0?`defaults only`:n.join(`, `),l=s.filter(e=>e.code!==`REMOVED_KEY`);l.length===0?t(`✓ Configuration valid (sources: ${c})`):t(`! Configuration loaded, but ${l.length} config layer(s) had issues (sources: ${c})`);for(let e of s)t(``),t(E(e));for(let{from:e,to:n}of a)t(``),t(`Moved ${e} aside to ${n} so defaults could be used. Restore it once fixed.`);return{ok:!0}}catch(e){return n(e instanceof Error?e.message:String(e)),{ok:!1}}}function yo(e){let t=W(e,`utf-8`),n=(0,ho.parseDocument)(t);if(n.errors.length>0)throw Error(`Could not parse ${e}: ${n.errors.map(e=>e.message).join(`; `)}`);let r=[];for(let e of go)n.hasIn(e)&&r.push(e.join(`.`));return r}function bo(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function xo(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=bo(i)?i:{};e[r]=a,e=a}e[n[n.length-1]]=null}return t}function So(e){switch(e){case`project`:return[`project`];case`project-local`:return[`project-local`];case`user`:return[`user`];case`both`:return[`project`,`user`];case`all`:return[`project`,`project-local`,`user`]}}async function Co(e={}){let t=e.log??(e=>console.log(e)),n=e.error??(e=>console.error(e)),r=e.scope??`all`,i=e.dryRun??!1,a=e.cwd??process.cwd(),o=e.writeConfigPatchFn??Fe,s=So(r).map(t=>({scope:t,absPath:Ue(t,a,e.homedirOverride)})),c=[],l=!0;for(let{scope:t,absPath:n}of s){if(!U(n)){c.push({path:n,scope:t,found:[],removed:[]});continue}let r;try{r=yo(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:xo(go.filter(e=>r.includes(e.join(`.`)))),homedirOverride:e.homedirOverride});if(!s.ok){c.push({path:n,scope:t,found:r,removed:[],error:E(s.error)}),l=!1;continue}c.push({path:n,scope:t,found:r,removed:r})}for(let e of c)e.error&&n(`✗ ${e.path}: ${e.error}`);let u=c.some(e=>e.error!==void 0),d=c.reduce((e,t)=>e+t.found.length,0);if(d===0&&!u)t(`No deprecated fields found.`);else if(d>0)for(let e of c)e.error||(e.found.length===0?t(` ${e.path}: no deprecated fields`):t(i?`[dry-run] ${e.path}: would remove ${e.found.length} field(s): ${e.found.join(`, `)}`:`✓ ${e.path}: removed ${e.removed.length} field(s): ${e.removed.join(`, `)}`));return{outcomes:c,ok:l}}const wo=`project | project-local | user | all`,To=new Set(Object.keys({project:!0,"project-local":!0,user:!0,both:!0,all:!0}));function Eo(e){return e!==`config`}function Do(){let e=new M(`config`).description(`Inspect and maintain OpenKnowledge configuration files`);return e.command(`validate`).description(`Validate the merged config (defaults → user → project)`).action(()=>{vo({}).ok||(process.exitCode=1)}),e.command(`migrate`).description(`Remove deprecated config fields from config.yml idempotently (every removed key in the registry — content.*, folders, appearance.editorModeDefault, server.host, etc. — plus the silently-dropped sync.*, persistence.*)`).option(`--scope <scope>`,`Which scope to migrate: ${wo}`,`all`).option(`--dry-run`,`Preview without writing`,!1).action(async e=>{let t=String(e.scope);if(!To.has(t)){console.error(`Invalid --scope: ${t}. Expected: ${wo}`),process.exitCode=2;return}(await Co({scope:t,dryRun:e.dryRun})).ok||(process.exitCode=1)}),e}const Oo=[` 1. ${R(`Customize`)} (sidebar) → ${R(`Skills`)}`,` 2. Click the ${R(`+`)} button`,` 3. Click ${R(`Create skill`)}`,` 4. Click ${R(`Upload skill`)}`,` 5. Pick ${R(`openknowledge.skill`)} from Downloads`],ko=N(` Open the Claude Desktop App, then: ${R(`Customize → Skills → + → Create skill → Upload skill`)} → pick the file.`);function Ao(e){let t=[F(`Built ${e.outputPath}`),P(` ${e.size} bytes • sha256 ${e.sha256?.slice(0,12)}…`)];return e.handoffError&&t.push(L(` Handoff failed: ${e.handoffError.message}`)),t.push(ko),t.join(`
14
14
  `)}function jo(e){let t=e.skillVersion??`unknown`,n=e.recordedAt??`unknown`;return[N(`OpenKnowledge skill ${R(`v${t}`)} already delivered to Claude Desktop.`),P(` Recorded at ${n} in ~/.ok/skill-state.yml`),P(` Use ${R(`--force`)} to rebuild and re-open the install dialog.`)].join(`
15
15
  `)}function Mo(e){let t=e.skillVersion?` • Skill v${e.skillVersion}`:``;return[F(`Built ${e.outputPath}`),P(` ${e.size} bytes • sha256 ${e.sha256?.slice(0,12)}…${t}`),N(` Claude Desktop App opened. Now upload the file manually:`),...Oo,P(` If Claude Desktop didn't open, open it and start at step 1. The file is at ${e.outputPath}`)].join(`
16
16
  `)}function No(e){return`${I(`Error:`)} ${e.buildError??`unknown build failure`}`}async function Po(e={}){let t=await Je(e);return t.status===`failed`?{...t,message:No(t),exitCode:1}:t.status===`skip-current`?{...t,message:jo(t),exitCode:0}:t.status===`installed`?{...t,message:Mo(t),exitCode:0}:{...t,message:Ao(t),exitCode:0}}function Fo(){return new M(`cowork`).description("Build openknowledge.skill and open the Claude Desktop App so you can upload it for Claude Chat & Cowork. (Advanced/rarely needed — `ok init` already wires Claude.)").option(`--out <path>`,`Custom output path (default: ~/Downloads/openknowledge.skill)`).option(`--no-open`,`Build the file but skip the OS file-association handoff`).option(`--force`,`Bypass the install-state gate and rebuild unconditionally`).action(async e=>{let t=await Po({out:e.out,noOpen:!e.open,force:e.force??!1});process.stdout.write(`${t.message}\n`),t.exitCode!==0&&process.exit(t.exitCode)})}async function Io(e,t){let n=Rr({input:t??process.stdin,output:process.stderr});try{let t=(await n.question(e)).trim().toLowerCase();return t===`y`||t===`yes`}finally{n.close()}}const Lo=/^# >>> open-knowledge cli >>>\n[\s\S]*?^# <<< open-knowledge cli <<<\n?/m;function Ro(e){return B(e,`Library`,`Application Support`,`OpenKnowledge`,`path-install.json`)}const zo={existsSync:e=>U(e),readFileSync:(e,t)=>W(e,t),lstatSync:e=>Sr(e),readlinkSync:e=>Er(e)};function Bo(e,t=zo){let n=Ro(e);if(!t.existsSync(n))return null;try{let e=JSON.parse(t.readFileSync(n,`utf8`));return e?.version===1?e:null}catch{return null}}function Vo(e){let t=e.replace(Lo,``);return{text:t,changed:t!==e,emptyAfter:t.trim()===``}}function Ho(e,t,n=zo){try{return n.lstatSync(e).isSymbolicLink()?n.readlinkSync(e)===t:!1}catch{return!1}}function J(e,t){return e===t?`~`:e.startsWith(`${t}/`)?`~${e.slice(t.length)}`:e}function Uo(e){return hr===`/`?e:e.split(hr).join(`/`)}function Wo(e,t,n=`This project`){let r=[];r.push({kind:`stop-server`,group:n,label:`Stop the project server (if running)`,lockDir:j(e)});let i=new Set;for(let a of Jt){let o=Xt[a];if(!o.projectConfigPath)continue;let s=o.projectConfigPath(e);i.add(Uo(V(e,s))),r.push({kind:`mcp-entry`,group:n,label:`Remove OK's MCP entry from ${o.label} (${Uo(V(e,s))})`,editorId:a,scope:`project`,cwd:e,home:t,configPath:s})}r.push({kind:`launch-entry`,group:n,label:`Remove OK's entry from .claude/launch.json`,projectRoot:e}),r.push({kind:`git-exclude`,group:n,label:`Remove OK paths from .git/info/exclude`,projectRoot:e});let a=new Set([...Bn(e),...qn(e),...ne]);for(let t of a){let a=t.replace(/\/$/,``);i.has(a)||a!==`.claude/launch.json`&&r.push({kind:`remove-path`,group:n,label:`Remove ${t}`,path:B(e,a),containWithin:e})}try{r.push({kind:`remove-path`,group:n,label:`Remove the OK shadow repo (.git/ok/)`,path:Ne(e)})}catch{}return r}function Go(e,t){return{scope:`deinit`,ops:Wo(e,t)}}function Ko(e){let{home:t,platform:n,host:r,lockDirs:i,marker:a,recentDeinitProjectRoots:o,purgeContent:s}=e,c=[];for(let e of i)c.push({kind:`stop-server`,group:`Running servers`,label:`Stop server at ${J(B(e,`..`,`..`),t)}`,lockDir:e});c.push({kind:`keychain-token`,group:`Credentials`,label:`Remove the GitHub credential (${r}) from the OS keychain + auth.yml`,host:r}),c.push({kind:`embeddings-key`,group:`Credentials`,label:`Remove all embeddings API keys (secrets.yml)`}),c.push(...Jo(a,t));for(let e of Jt){let n=Xt[e],r;try{r=n.configPath(``,t)}catch{continue}c.push({kind:`mcp-entry`,group:`Editor MCP configs`,label:`Remove OK's MCP entry from ${n.label} (${J(r,t)})`,editorId:e,scope:`user`,cwd:t,home:t,configPath:r})}for(let e of ir(t))c.push({kind:`remove-path`,group:`Skill bundles`,label:`Remove ${J(e.path,t)}`,path:e.path});c.push(...Yo(t,n,e.env));for(let e of o)c.push(...Wo(e,t,`Project: ${fr(e)}`));return c.push({kind:`remove-path`,group:`Global directory`,label:s?`Remove ~/.ok (including user-authored skills)`:`Remove ~/.ok (keeping ~/.ok/skills)`,path:B(t,`.ok`),preserve:s?void 0:[`skills`]}),{scope:`uninstall`,ops:c}}function qo(e){return[B(e,`.zshrc`),B(e,`.bash_profile`),B(e,`.config`,`fish`,`conf.d`,`open-knowledge.fish`)]}function Jo(e,t){let n=[],r=new Set([...qo(t),...e?.rcFiles??[]]);for(let e of r)U(e)&&n.push({kind:`shell-block`,group:`Shell PATH`,label:`Strip the OK block from ${J(e,t)}`,rcFile:e});for(let r of e?.extraSymlinks??[])n.push({kind:`extra-symlink`,group:`Shell PATH`,label:`Remove the ok symlink at ${J(r.path,t)}`,path:r.path,target:r.target});return n}function Yo(e,t,n){let r={home:e,platformName:t,env:n},i=$t(r),a=an(r),o=[{kind:`remove-path`,group:`Application data`,label:`Remove ${J(i,e)}`,path:i}];if(t===`darwin`){let t=$t({...r,productName:on});o.push({kind:`remove-path`,group:`Application data`,label:`Remove ${J(t,e)} (only if it is OpenKnowledge's)`,path:t,requireOurState:!0})}return o.push({kind:`remove-path`,group:`Application data`,label:`Remove ${J(a,e)}`,path:a}),o}async function Xo(e,t={}){let n=t.clearToken??wn,r=t.clearEmbeddingsKey??pt,i=t.stopServer??(async e=>{let t=await un({lockDir:e,force:!0,log:()=>{},error:()=>{}});return{stopped:t.stopped.length,failed:t.failed.map(e=>({pid:e.target.pid,error:e.error}))}}),a=[];for(let t of e.ops)try{a.push(await Qo(t,{clearToken:n,clearEmbeddingsKey:r,stopServer:i}))}catch(e){a.push({op:t,status:`failed`,detail:e instanceof Error?e.message:String(e)})}return{results:a,removed:a.filter(e=>e.status===`removed`),failed:a.filter(e=>e.status===`failed`)}}async function Zo(e,t=hn){let n=[];for(let r of e.ops){if(r.kind!==`stop-server`)continue;let e=await t(r.lockDir);e!==null&&e!==0&&n.push(`${e} collaboration client${e===1?``:`s`} (editor window${e===1?``:`s`} or agents) ${e===1?`is`:`are`} connected to the server at ${r.lockDir}. Those windows will stop working, and restarting will NOT recover them — this removes the project state they depend on.`)}return n}async function Qo(e,t){switch(e.kind){case`stop-server`:{let{stopped:n,failed:r}=await t.stopServer(e.lockDir);return r.length>0?{op:e,status:`failed`,detail:`could not stop the server (${r.map(e=>`pid ${e.pid}: ${e.error}`).join(`; `)}); a process may still be using files that were removed`}:{op:e,status:n>0?`removed`:`not-present`}}case`keychain-token`:{let{touched:n,keychainError:r}=await t.clearToken(e.host);return r?{op:e,status:`failed`,detail:`keychain unreachable (${r}); remove manually: Keychain Access → service "open-knowledge"`}:{op:e,status:n.length>0?`removed`:`not-present`}}case`embeddings-key`:{let{touched:n}=await t.clearEmbeddingsKey();return{op:e,status:n.length>0?`removed`:`not-present`}}case`shell-block`:{if(!U(e.rcFile))return{op:e,status:`not-present`};let{text:t,changed:n,emptyAfter:r}=Vo(W(e.rcFile,`utf-8`));return n?r?(kr(e.rcFile,{force:!0}),{op:e,status:`removed`,detail:`file removed (was OK-owned)`}):(Ht(e.rcFile,t,{mode:Gn(e.rcFile)}),{op:e,status:`removed`}):{op:e,status:`not-present`}}case`extra-symlink`:return Ho(e.path,e.target)?(K(e.path),{op:e,status:`removed`}):{op:e,status:`not-present`};case`mcp-entry`:{let t=en(Xt[e.editorId],e.cwd,e.home,e.configPath);switch(t.kind){case`removed`:switch(t.trust){case void 0:case`removed`:case`not-present`:return{op:e,status:`removed`};case`kept-shared`:return{op:e,status:`removed`,detail:`kept Pi's folder trust — another extension there still needs it`};case`kept-unverified`:return{op:e,status:`removed`,detail:`kept Pi's folder trust — couldn't read the extensions folder to see what else needs it`};default:return{op:e,status:`failed`,detail:`removed the bridge file, but couldn't revoke Pi's folder trust (${t.trust})${t.trustError===void 0?``:`: ${t.trustError}`}`}}case`not-present`:return{op:e,status:`not-present`};case`left-foreign`:return{op:e,status:`skipped`,detail:`left a non-OK server in place`};case`declined`:return{op:e,status:`skipped`,detail:`declined (${t.reason})`};default:throw Error(`unhandled mcp-remove outcome: ${t.kind}`)}}case`launch-entry`:{let t=ar(e.projectRoot);switch(t.kind){case`removed`:return{op:e,status:`removed`};case`not-present`:return{op:e,status:`not-present`};case`declined`:return{op:e,status:`skipped`,detail:`declined (unparseable)`};default:throw Error(`unhandled launch-remove outcome: ${t.kind}`)}}case`git-exclude`:{if(Nn(e.projectRoot).length===0)return{op:e,status:`not-present`};let t=In(e.projectRoot,Bn(e.projectRoot));return t.kind===`no-exclude`?t.reason===`inaccessible`?{op:e,status:`failed`,detail:`could not write .git/info/exclude (inaccessible)`}:{op:e,status:`not-present`,detail:t.reason}:{op:e,status:t.removed.length>0?`removed`:`not-present`}}case`remove-path`:return $o(e)}}function $o(e){if(e.requireOurState&&!bn(e.path))return{op:e,status:`skipped`,detail:`not verified as OpenKnowledge — left untouched`};e.containWithin&&Yt(e.path,e.containWithin);let t;try{t=Sr(e.path)}catch(e){if(e.code!==`ENOENT`)throw e}if(!t)return{op:e,status:`not-present`};if(t.isSymbolicLink())return K(e.path),{op:e,status:`removed`};if(e.preserve&&e.preserve.length>0){let t=new Set(e.preserve),n=!1;for(let r of Tr(e.path))t.has(r)||(kr(B(e.path,r),{recursive:!0,force:!0}),n=!0);return{op:e,status:n?`removed`:`not-present`}}return kr(e.path,{recursive:!0,force:!0}),{op:e,status:`removed`}}function es(e){let t=new Map;for(let n of e){let e=t.get(n.group)??[];e.push(n),t.set(n.group,e)}return t}function ts(e){if(e.ops.length===0)return P(`Nothing to remove.`);let t=[];for(let[n,r]of es(e.ops)){t.length>0&&t.push(``),t.push(R(`${n}:`));for(let e of r)t.push(` ${L(`-`)} ${e.label}`)}return t.join(`
@@ -40,7 +40,7 @@ ws.addEventListener('error', () => process.exit(1));
40
40
  setTimeout(() => process.exit(2), ${t+1e4});
41
41
  `),i}async function Fs(e,t,n,r,i){let a=Ps(e,t,B(r,`cpu.cpuprofile`)),o=!1,s=ur(process.execPath,[a],A({stdio:`ignore`})),c=setInterval(()=>{let e=As(n);e&&i(e)},1e3);await new Promise(e=>{s.once(`close`,t=>{o=t===0,e()}),setTimeout(()=>{s.kill(),e()},t+12e3)}),clearInterval(c);try{kr(B(a,`..`),{recursive:!0,force:!0})}catch{}return o}function Is(e){let t;try{t=JSON.parse(e)}catch{return`(could not parse profile)`}let n=new Map(t.nodes.map(e=>[e.id,e])),r=new Map;for(let e of t.nodes)for(let t of e.children??[])r.set(t,e.id);let i=new Map;for(let e of t.samples??[])i.set(e,(i.get(e)??0)+1);let a=t.samples?.length??0,o=t.endTime!=null&&t.startTime!=null?((t.endTime-t.startTime)/1e3).toFixed(2):`?`,s=[...i.entries()].sort((e,t)=>t[1]-e[1]).slice(0,10),c=[`samples ${a} duration_ms ${o}`,``,`Top leaf nodes`];for(let[e,t]of s){let r=n.get(e);if(!r)continue;let i=a>0?(t/a*100).toFixed(1):`0.0`,{functionName:o,url:s,lineNumber:l,columnNumber:u}=r.callFrame;c.push(` ${t} ${i}% id=${e} ${o||`(anonymous)`} ${s}:${l}:${u} hit=${r.hitCount??0}`)}c.push(``,`Top stacks`);let l=e=>{let t=[],i=e;for(;i!=null;){let e=n.get(i);if(!e)break;let{functionName:a,url:o,lineNumber:s,columnNumber:c}=e.callFrame;t.unshift(` ${a||`(anonymous)`} ${o} ${s} ${c}`),i=r.get(i)}return t};for(let[e,t]of s.slice(0,5)){let n=a>0?(t/a*100).toFixed(1):`0.0`;c.push(``,`--- ${t} ${n}%`,...l(e))}return c.join(`
42
42
  `)}async function Ls(e,t={}){let{pid:n,cpuProfileSecs:r=15,noInspector:i=!1}=e,a=t.log??(e=>console.log(e)),o=t.discover??je,s=t.inspect??(e=>mn(e,`server`)),c=t.resolveCommand??vt,l=t.resolveUsage??et,u=t.collectLsofFn??js,d=t.getEndpoints??Ns,f=t.profiler??Fs,p=t.isAlive??(e=>{try{return process.kill(e,0),!0}catch(e){return e.code===`EPERM`}}),m=t.sendSignal??((e,t)=>{process.kill(e,t)}),h=t.sleep??(e=>new Promise(t=>setTimeout(t,e))),g=r*1e3;if(!p(n)){a(Y.default.red(`No process with pid ${n} found.`));return}let _=await o(),v=null,y=null;for(let e of _){let t=s(e);if(t.status!==`missing`&&t.status!==`corrupt`&&t.lock.pid===n){v=t.lock.worktreeRoot,y={lockDir:e,state:t.status,lockPath:t.lockPath,lock:t.lock};break}}let b=new Date().toISOString().replace(/[:.]/g,`-`),x=e.output?e.output:v?B(v,`.ok`,`local`,`diagnostics`,`process-${n}-${b}`):B(process.cwd(),`ok-diagnose-${n}-${b}`);try{Cr(x,{recursive:!0})}catch(e){a(Y.default.red(`Cannot create output directory ${x}: ${e.message}`));return}a(Y.default.bold(`Diagnosing pid ${n}`)),a(`Output: ${x}`),a(``);let S=(e,t)=>{Ar(B(x,e),t),a(` wrote ${e}`)},C=c(n),ee=l(n);S(`metadata.json`,JSON.stringify({capturedAt:new Date().toISOString(),pid:n,command:C,usage:ee,lockInfo:y},null,2)),a(` sampling lsof`);let w=u(n);if(w&&S(`lsof.txt`,w),!i){let e=w?Ms(w).find(e=>e>=9229&&e<=9299)??9229:9229,t=d(e);if(!t||t.length===0){a(` no inspector on :${e}, sending SIGUSR1 to pid ${n}`);try{m(n,`SIGUSR1`),await h(2e3),t=d(e)}catch(e){a(Y.default.yellow(` SIGUSR1 delivery failed: ${e.message}`))}}if(t&&t.length>0){S(`inspector-endpoints.json`,JSON.stringify(t,null,2));let e=t[0].webSocketDebuggerUrl;if(e){a(` capturing ${r}s CPU profile`);let t=[];await f(e,g,n,x,e=>t.push(e))?a(` wrote cpu.cpuprofile`):a(Y.default.yellow(` CPU profile capture failed`)),t.length>0&&S(`process-stats.jsonl`,`${t.map(e=>JSON.stringify(e)).join(`
43
- `)}\n`);try{S(`stacks.txt`,Is(W(B(x,`cpu.cpuprofile`),`utf-8`)))}catch(e){a(Y.default.yellow(` stacks.txt skipped: ${e.message}`))}}}else a(Y.default.yellow(` Node inspector unavailable — skipping CPU profile`))}a(``),a(Y.default.yellow(`⚠ Before sharing, review what each file contains:`)),a(` metadata.json — content directory paths, lock file locations, CPU/MEM at capture time`),a(` lsof.txt — all open files, network connections, and private paths for this process`),a(` inspector-endpoints.json — Node debugger metadata (titles, URLs)`),a(` cpu.cpuprofile — function names and source file paths from your Node process`),a(` stacks.txt — call stacks derived from cpu.cpuprofile; includes source paths`),a(` process-stats.jsonl — CPU/MEM/RSS numbers only; safe to share`),a(``),a(`Bundle: ${Y.default.bold(x)}`)}async function Rs(e){let t=Rr({input:process.stdin,output:process.stdout});try{return(await t.question(e)).trim()}finally{t.close()}}async function zs(e){let t=wr(B(Nr(),`ok-bundle-process-`));return await Ls({pid:e,output:t}),t}function Bs(e){if(e<1024)return`${e} B`;let t=e/1024;if(t<1024)return`${t.toFixed(1)} KB`;let n=t/1024;return n<1024?`${n.toFixed(1)} MB`:`${(n/1024).toFixed(1)} GB`}function Vs(e){let t=e.trim().toLowerCase();return t===`y`||t===`yes`}function Hs(e){let{summary:t,manifest:n}=e;return t.redacted?t.contentDirVisible?`masked as <CONTENT_DIR>, but still present in some files`:`masked as <CONTENT_DIR>`:t.contentDirVisible?`visible (${n.contentDir.absolutePath})`:`not present`}function Us(e,t){let n=e.manifest.redaction.secretScrub;return n===void 0?Y.default.yellow(t>0?`NOT scrubbed (--no-redact): tokens and keys ship verbatim, crash reports excepted`:`NOT scrubbed (--no-redact): tokens and keys ship verbatim`):`scrubbed known credential formats (${n.redactedLineCount} line(s) across ${n.redactions.length} file(s))`}function Ws(e,t,n,r){let{summary:i,manifest:a}=t;e(``),e(Y.default.bold(`ok diagnose bundle — what leaves this machine`)),e(``),e(` Files: ${i.fileCount}`),e(` Total size: ${Bs(i.totalBytes)} uncompressed`),e(` Document names: included in cleartext (${i.docNameCount} doc.name occurrence(s) in telemetry)`),e(` Content-dir path: ${Hs(t)}`),e(` Credentials: ${Us(t,i.stagedDiagnosticReports)}`),e(` Server status: ${a.serverStatus}`),e(` macOS crash reports: ${ln(r,i.stagedDiagnosticReports)}`),i.stagedDiagnosticReports>0&&(e(` each carrying machine details macOS puts in every report: the`),e(` account uid, the Mac model, and the name of the process that`),e(` launched this app, which on a managed machine can be internal`),e(` tooling.`),e(` Rewritten on the way in: escaped path separators normalised so`),e(` the scrub can read them, and the identifiers that would link`),e(` this machine's bundles to each other replaced.`),e(` Not byte-identical to the files macOS wrote, on any tier and`),e(` regardless of --no-redact. A report of ours still names the`),e(` processes it was running alongside.`)),e(` Output: ${n}`),e(``)}async function Gs(e,t={}){let n=t.log??(e=>console.log(e)),r=t.prompt??Rs,i=t.runProcessDiagnose??zs,a=t.now??(()=>new Date),o;if(e.out!==void 0){o=e.out;let t=z(o);if(!U(t))throw Error(`ok diagnose bundle: --out parent directory does not exist: ${t}. Create it first.`)}else{let t=a().toISOString().replace(/[:.]/g,`-`),n=B(e.contentDir,`.ok`,`local`,`diagnostics`);Cr(n,{recursive:!0}),o=B(n,`bundle-${t}.zip`)}let s;e.pid!==void 0&&(n(Y.default.dim(`Running ok diagnose process ${e.pid} into a temp dir`)),s=await i(e.pid));let c=e.redact!==!1,l=fn(t.diagnosticReportsDir??B(jr(),`Library`,`Logs`,`DiagnosticReports`),a()),u=await cn({contentDir:e.contentDir,projectDir:e.projectDir,processDir:s,redact:c,scrubSecrets:c,diagnosticReports:l,deps:t.collectDeps});try{return u.manifest.serverStatus===`not-running`&&n(Y.default.yellow(` server not running — live state unavailable`)),Ws(n,u,o,l),e.yes!==!0&&!Vs(await r(`Write bundle? [y/N]: `))?(n(Y.default.dim(`Aborted; no bundle written.`)),{outputPath:null,declined:!0}):(await gn({collected:u,outputPath:o}),n(Y.default.bold(`Bundle: ${o}`)),{outputPath:o,declined:!1})}finally{if(u.cleanup(),s!==void 0)try{kr(s,{recursive:!0,force:!0})}catch{}}}function Ks(){let e=new M(`diagnose`).description(`Diagnostic utilities for open-knowledge processes`);return e.command(`process`).description(`Capture a diagnostic bundle (metadata, lsof, CPU profile) for a running process`).argument(`<pid>`,`Process ID to diagnose`).option(`--cpu-profile <seconds>`,`CPU profile duration (default: 15)`,`15`).option(`--output <dir>`,`Output directory`).option(`--no-inspector`,`Collect metadata only; skip Node inspector and CPU profile`).action(async(e,t)=>{let n=Number.parseInt(e,10);(Number.isNaN(n)||n<=0)&&(console.error(Y.default.red(`Invalid pid '${e}': must be a positive integer`)),process.exit(1));let r=Number.parseInt(t.cpuProfile,10);(Number.isNaN(r)||r<=0)&&(console.error(Y.default.red(`--cpu-profile must be a positive integer`)),process.exit(1)),await Ls({pid:n,cpuProfileSecs:r,output:t.output,noInspector:!t.inspector})}),e.addCommand(ks()),e.command(`bundle`).description(`Capture a support bundle (telemetry + logs + server state) into a zip suitable for bug reports`).option(`--pid <pid>`,"Include `ok diagnose process <pid>` output under process/ in the bundle").option(`--out <path>`,`Write the zip to this path instead of the default location`).option(`--yes`,`Skip the y/N prompt`).option(`--no-redact`,`Write a raw bundle: skip credential scrubbing and content-dir path masking`).option(`--redact`,`Scrub credentials and mask the content-dir path (the default)`).action(async e=>{let t;e.pid!==void 0&&(t=Number.parseInt(e.pid,10),(Number.isNaN(t)||t<=0)&&(console.error(Y.default.red(`Invalid --pid '${e.pid}': must be a positive integer`)),process.exit(1)));try{let{loadConfig:n}=await import(`./loader-kQE4qvYg.mjs`),{resolveContentDir:r}=await import(`./dist-D-X0Yg3B.mjs`),i=process.cwd(),{config:a}=n(i);await Gs({contentDir:r(a,i),projectDir:i,pid:t,out:e.out,yes:e.yes===!0,redact:e.redact})}catch(e){let t=e instanceof Error?e.message:String(e);console.error(Y.default.red(t)),process.exit(1)}}),e}async function qs(){if(!process.stdin.isTTY){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString(`utf-8`).trim()}return(await Ei({message:`Enter embeddings provider API key:`})).trim()}function Js(e){return Bt(e)}async function Ys(e,t){let n=await Me(rt(),e,t);return n.apiKey?{present:!0,notRequired:!1,source:n.source}:{present:!1,notRequired:n.keyless,source:null}}async function Xs(e){try{let t=He(j(e));if(!t||t.port<=0||!qe(t.pid))return null;let n=await fetch(`http://127.0.0.1:${t.port}/api/semantic-status`,{signal:AbortSignal.timeout(1500)});if(!n.ok)return null;let r=await n.json();return typeof r.embedded!=`number`||typeof r.total!=`number`?null:{embedded:r.embedded,total:r.total}}catch{return null}}function Zs(){return new M(`set-key`).description(`Store the embeddings API key for THIS project's configured endpoint`).option(`--cwd <path>`,`Project directory (defaults to the current directory)`).action(async e=>{let t=await qs();if(!t){process.stderr.write(`No key provided.
43
+ `)}\n`);try{S(`stacks.txt`,Is(W(B(x,`cpu.cpuprofile`),`utf-8`)))}catch(e){a(Y.default.yellow(` stacks.txt skipped: ${e.message}`))}}}else a(Y.default.yellow(` Node inspector unavailable — skipping CPU profile`))}a(``),a(Y.default.yellow(`⚠ Before sharing, review what each file contains:`)),a(` metadata.json — content directory paths, lock file locations, CPU/MEM at capture time`),a(` lsof.txt — all open files, network connections, and private paths for this process`),a(` inspector-endpoints.json — Node debugger metadata (titles, URLs)`),a(` cpu.cpuprofile — function names and source file paths from your Node process`),a(` stacks.txt — call stacks derived from cpu.cpuprofile; includes source paths`),a(` process-stats.jsonl — CPU/MEM/RSS numbers only; safe to share`),a(``),a(`Bundle: ${Y.default.bold(x)}`)}async function Rs(e){let t=Rr({input:process.stdin,output:process.stdout});try{return(await t.question(e)).trim()}finally{t.close()}}async function zs(e){let t=wr(B(Nr(),`ok-bundle-process-`));return await Ls({pid:e,output:t}),t}function Bs(e){if(e<1024)return`${e} B`;let t=e/1024;if(t<1024)return`${t.toFixed(1)} KB`;let n=t/1024;return n<1024?`${n.toFixed(1)} MB`:`${(n/1024).toFixed(1)} GB`}function Vs(e){let t=e.trim().toLowerCase();return t===`y`||t===`yes`}function Hs(e){let{summary:t,manifest:n}=e;return t.redacted?t.contentDirVisible?`masked as <CONTENT_DIR>, but still present in some files`:`masked as <CONTENT_DIR>`:t.contentDirVisible?`visible (${n.contentDir.absolutePath})`:`not present`}function Us(e,t){let n=e.manifest.redaction.secretScrub;return n===void 0?Y.default.yellow(t>0?`NOT scrubbed (--no-redact): tokens and keys ship verbatim, crash reports excepted`:`NOT scrubbed (--no-redact): tokens and keys ship verbatim`):`scrubbed known credential formats (${n.redactedLineCount} line(s) across ${n.redactions.length} file(s))`}function Ws(e,t,n,r){let{summary:i,manifest:a}=t;e(``),e(Y.default.bold(`ok diagnose bundle — what leaves this machine`)),e(``),e(` Files: ${i.fileCount}`),e(` Total size: ${Bs(i.totalBytes)} uncompressed`),e(` Document names: included in cleartext (${i.docNameCount} doc.name occurrence(s) in telemetry)`),e(` Content-dir path: ${Hs(t)}`),e(` Credentials: ${Us(t,i.stagedDiagnosticReports)}`),e(` Server status: ${a.serverStatus}`),e(` macOS crash reports: ${ln(r,i.stagedDiagnosticReports)}`),i.stagedDiagnosticReports>0&&(e(` each carrying machine details macOS puts in every report: the`),e(` account uid, the Mac model, and the name of the process that`),e(` launched this app, which on a managed machine can be internal`),e(` tooling.`),e(` Rewritten on the way in: escaped path separators normalised so`),e(` the scrub can read them, and the identifiers that would link`),e(` this machine's bundles to each other replaced.`),e(` Not byte-identical to the files macOS wrote, on any tier and`),e(` regardless of --no-redact. A report of ours still names the`),e(` processes it was running alongside.`)),e(` Output: ${n}`),e(``)}async function Gs(e,t={}){let n=t.log??(e=>console.log(e)),r=t.prompt??Rs,i=t.runProcessDiagnose??zs,a=t.now??(()=>new Date),o;if(e.out!==void 0){o=e.out;let t=z(o);if(!U(t))throw Error(`ok diagnose bundle: --out parent directory does not exist: ${t}. Create it first.`)}else{let t=a().toISOString().replace(/[:.]/g,`-`),n=B(e.contentDir,`.ok`,`local`,`diagnostics`);Cr(n,{recursive:!0}),o=B(n,`bundle-${t}.zip`)}let s;e.pid!==void 0&&(n(Y.default.dim(`Running ok diagnose process ${e.pid} into a temp dir`)),s=await i(e.pid));let c=e.redact!==!1,l=fn(t.diagnosticReportsDir??B(jr(),`Library`,`Logs`,`DiagnosticReports`),a()),u=await cn({contentDir:e.contentDir,projectDir:e.projectDir,processDir:s,redact:c,scrubSecrets:c,diagnosticReports:l,deps:t.collectDeps});try{return u.manifest.serverStatus===`not-running`&&n(Y.default.yellow(` server not running — live state unavailable`)),Ws(n,u,o,l),e.yes!==!0&&!Vs(await r(`Write bundle? [y/N]: `))?(n(Y.default.dim(`Aborted; no bundle written.`)),{outputPath:null,declined:!0}):(await gn({collected:u,outputPath:o}),n(Y.default.bold(`Bundle: ${o}`)),{outputPath:o,declined:!1})}finally{if(u.cleanup(),s!==void 0)try{kr(s,{recursive:!0,force:!0})}catch{}}}function Ks(){let e=new M(`diagnose`).description(`Diagnostic utilities for open-knowledge processes`);return e.command(`process`).description(`Capture a diagnostic bundle (metadata, lsof, CPU profile) for a running process`).argument(`<pid>`,`Process ID to diagnose`).option(`--cpu-profile <seconds>`,`CPU profile duration (default: 15)`,`15`).option(`--output <dir>`,`Output directory`).option(`--no-inspector`,`Collect metadata only; skip Node inspector and CPU profile`).action(async(e,t)=>{let n=Number.parseInt(e,10);(Number.isNaN(n)||n<=0)&&(console.error(Y.default.red(`Invalid pid '${e}': must be a positive integer`)),process.exit(1));let r=Number.parseInt(t.cpuProfile,10);(Number.isNaN(r)||r<=0)&&(console.error(Y.default.red(`--cpu-profile must be a positive integer`)),process.exit(1)),await Ls({pid:n,cpuProfileSecs:r,output:t.output,noInspector:!t.inspector})}),e.addCommand(ks()),e.command(`bundle`).description(`Capture a support bundle (telemetry + logs + server state) into a zip suitable for bug reports`).option(`--pid <pid>`,"Include `ok diagnose process <pid>` output under process/ in the bundle").option(`--out <path>`,`Write the zip to this path instead of the default location`).option(`--yes`,`Skip the y/N prompt`).option(`--no-redact`,`Write a raw bundle: skip credential scrubbing and content-dir path masking`).option(`--redact`,`Scrub credentials and mask the content-dir path (the default)`).action(async e=>{let t;e.pid!==void 0&&(t=Number.parseInt(e.pid,10),(Number.isNaN(t)||t<=0)&&(console.error(Y.default.red(`Invalid --pid '${e.pid}': must be a positive integer`)),process.exit(1)));try{let{loadConfig:n}=await import(`./loader-3_Q4hGc7.mjs`),{resolveContentDir:r}=await import(`./dist-D-X0Yg3B.mjs`),i=process.cwd(),{config:a}=n(i);await Gs({contentDir:r(a,i),projectDir:i,pid:t,out:e.out,yes:e.yes===!0,redact:e.redact})}catch(e){let t=e instanceof Error?e.message:String(e);console.error(Y.default.red(t)),process.exit(1)}}),e}async function qs(){if(!process.stdin.isTTY){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString(`utf-8`).trim()}return(await Ei({message:`Enter embeddings provider API key:`})).trim()}function Js(e){return Bt(e)}async function Ys(e,t){let n=await Me(rt(),e,t);return n.apiKey?{present:!0,notRequired:!1,source:n.source}:{present:!1,notRequired:n.keyless,source:null}}async function Xs(e){try{let t=He(j(e));if(!t||t.port<=0||!qe(t.pid))return null;let n=await fetch(`http://127.0.0.1:${t.port}/api/semantic-status`,{signal:AbortSignal.timeout(1500)});if(!n.ok)return null;let r=await n.json();return typeof r.embedded!=`number`||typeof r.total!=`number`?null:{embedded:r.embedded,total:r.total}}catch{return null}}function Zs(){return new M(`set-key`).description(`Store the embeddings API key for THIS project's configured endpoint`).option(`--cwd <path>`,`Project directory (defaults to the current directory)`).action(async e=>{let t=await qs();if(!t){process.stderr.write(`No key provided.
44
44
  `),process.exitCode=1;return}let n=H(e.cwd??process.cwd()),{baseUrl:r}=Js(n);try{await rt().setForProject(n,r,t)}catch(e){process.stderr.write(`Failed to store the embeddings key: ${e instanceof Error?e.message:String(e)}\n`),process.exitCode=1;return}process.stderr.write(`✓ Embeddings API key stored for ${r}\n (kept in ~/.ok/secrets.yml, 0600, this machine only — never in the project).
45
45
  Enable semantic search with \`ok embeddings enable\`, or in
46
46
  OK Desktop → Settings → This project → Search.
@@ -75,7 +75,7 @@ ${t}`,d++;break;case`id`:l=t.includes(`\0`)?void 0:t;break;case`retry`:/^\d+$/.t
75
75
  `).replace(/\n+$/,``);return e.endsWith(`
76
76
  `)?`${c}\n`:c}function ld(e){return e.replace(/\r\n|\r|\n/g,`<br>`).replace(/\|/g,`\\|`)}function ud(e){return/\s/.test(e)?`<${e}>`:e}function dd(e,t={}){let{header:n,rows:r}=Pu(e),i=n.length;if(i===0)return{table:``,columns:0,wide:!1};let a=t.wideThreshold??15,o=t.titleColumn??0;return{table:[`| ${n.map(ld).join(` | `)} |`,`| ${n.map(()=>`---`).join(` | `)} |`,...r.map(e=>`| ${n.map((n,r)=>{let i=e[r]??``,a=ld(i);if(r===o&&t.linkForTitle&&i.trim()!==``){let e=t.linkForTitle(i);if(e)return`[${a}](${ud(e)})`}return a}).join(` | `)} |`)].join(`
77
77
  `),columns:i,wide:i>a}}function fd(e,t){let n=e.match(/^#\s+(.+)$/m);return n?n[1].trim():t}function pd(e,t){return`# ${e}\n\n${t}\n`}const md=[`links`,`frontmatter`,`callouts`,`images`,`tables`],hd=/\.mdx?$/i;function gd(e){return{isNotionExport:e,transforms:{links:0,frontmatter:0,callouts:0,images:0,tables:0},assetsExtracted:0,stubsCreated:0,csvsRemoved:0,wideTables:[],ambiguousTitleLinks:0,unreadable:[],filesChanged:0}}function _d(e,t={}){let n=t.selected??new Set(md),r=td(e);if(!r&&!t.force)return{changes:[],assets:[],deletions:[],report:gd(!1)};let i=gd(r),a=Qu(e),o=Uu(a,{onUnreadable:e=>i.unreadable.push(e)}),s=n.has(`tables`),c=new Map,l=new Set;for(let e of o){e.stubPath&&l.add(e.stubPath);for(let t of e.rowFiles)c.set(t,e)}let u=[],d=[],f=[];for(let e of a){if(!hd.test(e)||s&&l.has(e))continue;let r;try{r=W(e,`utf8`)}catch{i.unreadable.push(e);continue}let a=r,o=(e,t)=>{a!==t&&(i.transforms[e]+=1)};if(n.has(`images`)){let n=a,r=Nu(a,fr(e),{strip:t.stripBase64});a=r.markdown;for(let t of r.assets)d.push({path:B(z(e),t.filename),bytes:t.bytes});i.assetsExtracted+=r.assets.length,o(`images`,n)}if(n.has(`callouts`)){let e=a;a=ku(a),o(`callouts`,e)}if(n.has(`frontmatter`)){let t=c.get(e);if(t){let e=a;a=cd(a,t.propertyKeys),o(`frontmatter`,e)}}if(n.has(`links`)){let e=a;a=Zu(a,{redirectCsv:s}),o(`links`,e)}a!==r&&u.push({path:e,content:a})}if(s)for(let e of o){let r=dd(e.csvText,{linkForTitle:t=>{let n=Bu(e.folderIndex,t);return n.ambiguous&&(i.ambiguousTitleLinks+=1),n.path?V(z(e.stubTargetPath),n.path):null}});if(r.columns===0)continue;let a=e.stubPath??e.stubTargetPath,o=null;if(e.stubPath)try{o=W(e.stubPath,`utf8`)}catch{i.unreadable.push(e.stubPath);continue}let c=pd(o===null?e.fallbackTitle:fd(o,e.fallbackTitle),r.table);n.has(`links`)&&(c=Zu(c,{redirectCsv:s})),r.wide&&i.wideTables.push(a),o===null?(u.push({path:a,content:c}),i.stubsCreated+=1,i.transforms.tables+=1):c!==o&&(u.push({path:a,content:c}),i.transforms.tables+=1),t.removeCsv&&(f.push(e.csvPath),i.csvsRemoved+=1)}return i.filesChanged=new Set(u.map(e=>e.path)).size,{changes:u,assets:d,deletions:f,report:i}}function vd(e){for(let t of e.assets)Cr(z(t.path),{recursive:!0}),Ar(t.path,t.bytes);for(let t of e.changes)Cr(z(t.path),{recursive:!0}),Ar(t.path,t.content,`utf8`);for(let t of e.deletions)try{K(t)}catch(e){if(e.code!==`ENOENT`)throw e}}const yd={images:`Inline base64 images extracted`,callouts:`Notion <aside> callouts converted`,frontmatter:`Row properties lifted to frontmatter`,tables:`Databases rendered as tables`,links:`Internal links decoded`},bd=[`images`,`callouts`,`frontmatter`,`tables`,`links`];function xd(e,t){let n=[];n.push(t.applied?`Applied Notion cleanup in ${t.dir}`:`Dry run — no changes written (${t.dir})`);for(let t of bd)n.push(` ${yd[t]}: ${e.transforms[t]}`);return n.push(` Assets written: ${e.assetsExtracted}`),e.stubsCreated>0&&n.push(` Database pages created (CSVs without a stub): ${e.stubsCreated}`),e.csvsRemoved>0&&n.push(` CSV files removed: ${e.csvsRemoved}`),n.push(` Files changed: ${e.filesChanged}`),e.ambiguousTitleLinks>0&&n.push(` Ambiguous title links left as plain text: ${e.ambiguousTitleLinks}`),e.wideTables.length>0&&n.push(` Wide tables (>15 columns): ${e.wideTables.length}`),e.unreadable.length>0&&n.push(` Skipped unreadable files: ${e.unreadable.length}`),!t.applied&&e.filesChanged+e.assetsExtracted+e.csvsRemoved>0&&(n.push(``),n.push(`Re-run with --apply to write these changes.`)),n.join(`
78
- `)}function Sd(e,t){return JSON.stringify({applied:t.applied,...e},null,2)}function Cd(e){let t=new Set(md);return e.split(`,`).map(e=>e.trim()).filter(e=>e.length>0).map(e=>{if(!t.has(e))throw Error(`Unknown transform "${e}". Valid transforms: ${md.join(`, `)}`);return e})}function wd(e,t){let n=new Set(md);if(e&&(n=new Set(Cd(e))),t)for(let e of Cd(t))n.delete(e);return n}function Td(){let e=new M(`migrate`).description(`Migrate content from other tools into Open Knowledge`);return e.command(`notion [dir]`).description(`Clean up a Notion "Markdown & CSV" export in place (dry-run unless --apply)`).option(`--apply`,`write changes to disk (default: dry-run preview)`).option(`--strip-base64`,`delete inline base64 images instead of extracting them to files`).option(`--remove-csv`,`delete each "_all.csv" once its table page exists (destructive)`).option(`--only <transforms>`,`run only these transforms (comma-separated: links,frontmatter,callouts,images,tables)`).option(`--skip <transforms>`,`skip these transforms (comma-separated)`).option(`--force`,`run even if the directory is not detected as a Notion export`).option(`--json`,`print a machine-readable JSON report`).action((e,t)=>{let n=H(e??process.cwd()),r;try{r=wd(t.only,t.skip)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exitCode=2;return}let i=_d(n,{selected:r,stripBase64:t.stripBase64??!1,removeCsv:t.removeCsv??!1,force:t.force??!1}),{report:a}=i;if(!a.isNotionExport&&!t.force){t.json?console.log(JSON.stringify({refused:!0,reason:`not-a-notion-export`,dir:n},null,2)):console.error(`Not a Notion export: ${n}\nNo id-suffixed pages, "_all.csv", or inline base64 images were found. Re-run with --force to override.`),process.exitCode=2;return}if(t.apply)try{vd(i)}catch(e){console.error(`Failed to apply changes: ${e instanceof Error?e.message:String(e)}`),process.exitCode=4;return}console.log(t.json?Sd(a,{applied:t.apply??!1}):xd(a,{applied:t.apply??!1,dir:n})),a.filesChanged===0&&a.assetsExtracted===0&&i.deletions.length===0?process.exitCode=1:t.apply&&(a.ambiguousTitleLinks>0||a.wideTables.length>0)&&(process.exitCode=3)}),e}function Ed(e,t,n){return t===`darwin`?n&&e.startsWith(`openknowledge://`)?{command:`/usr/bin/open`,args:[`-a`,n,e]}:{command:`/usr/bin/open`,args:[e]}:t===`win32`?e.startsWith(`http://`)||e.startsWith(`https://`)?{command:`explorer.exe`,args:[e]}:{command:`rundll32.exe`,args:[`url.dll,FileProtocolHandler`,e]}:{command:`xdg-open`,args:[e]}}function Dd(e,t={}){let n=Ed(e,t.platform??process.platform,t.desktopBundlePath);return Cn(n.command,n.args,{spawn:t.spawn,env:t.env,timeoutMs:t.timeoutMs})}function Od(e,t,n=process.platform){let r=Ed(t,n).command;switch(e){case`not-installed`:return`${r} is not installed or cannot be executed`;case`timeout`:return`${r} did not start in time`;case`spawn-error`:return`${r} could not be started`}}function kd(e=()=>On(En())){return{detectBundlePath:()=>e().bundlePath??null,resolveBaseUrl:e=>Ot({lockDir:j(e)}).baseUrl,classifyName:(e,t)=>{let n=B(e,t);try{return G(n).isDirectory()?`folder`:`doc`}catch(e){let t=e?.code;return t!==`ENOENT`&&t!==`ENOTDIR`&&process.stderr.write(`[ok open] statSync failed for ${n} (${t??`unknown`}); treating as a doc\n`),`doc`}},openTarget:Dd,findAncestorProject:e=>$e(z(H(e)))?.rootPath??null,isProjectRoot:e=>$e(e)?.distance===0,enclosingProject:e=>$e(H(e))?.rootPath??null,log:e=>process.stdout.write(`${e}\n`),error:e=>process.stderr.write(`${e}\n`)}}function Ad(e){return e.startsWith(`/`)||e.includes(`\\`)||e.split(`/`).includes(`..`)}function jd(e){return e.error("No OpenKnowledge desktop app found and no UI is running. Install it from https://openknowledge.ai/download, or run `ok start` to serve the editor, then retry."),1}async function Md(e,t,n,r,i,a){let o=await i.openTarget(e,a?{desktopBundlePath:a}:{});if(!o.ok)return i.error(`Could not open ${e}: ${Od(o.reason,e)}.`),1;if(i.log(t),!r)return i.log(`Working directory: ${n} (not an OpenKnowledge project).`),0;i.log(`Project: ${n}`);let s=i.findAncestorProject(n);return s!==null&&i.log(`Note: this project (${n}) is nested inside another OpenKnowledge project at ${s}. Pass --project to choose explicitly.`),0}async function Nd(e,t,n){let r=t.project!==void 0,i=r?null:n.enclosingProject(process.cwd()),a=H(t.project??i??process.cwd()),o=r||i!==null,s=e.replace(/\/+$/,``);if(r&&!n.isProjectRoot(a))return n.error(`Cannot open with --project ${a}: no .ok/config.yml there, so it is not an OpenKnowledge project.`),1;if(!s)return n.error("Nothing to open: pass a doc, folder, or skill name (e.g. `ok open specs/foo/SPEC`)."),1;if(Ad(s))return n.error(`Invalid name "${s}": must be a relative path with no '..' segments, leading '/', or backslashes.`),1;if(t.skill===!0){let e=t.scope??`project`;if(!w.includes(e))return n.error(`Invalid --scope "${t.scope}": expected one of ${w.join(`, `)}.`),1;let r=n.detectBundlePath();if(r)return Md(`openknowledge://open?project=${encodeURIComponent(a)}&doc=${encodeURIComponent(`__skill__/${e}/${s}`)}`,`Opening skill ${s} (${e}) in the OpenKnowledge desktop app.`,a,o,n,r);let i=n.resolveBaseUrl(a);if(i){let t=`${i}/#/${Ke(e,s)}`;return Md(t,`Opening skill ${s} (${e}) in your browser: ${t}`,a,o,n)}return jd(n)}let c=/\/+$/.test(e)||n.classifyName(a,s)===`folder`,l=n.detectBundlePath();if(c){if(l)return Md(`openknowledge://open?project=${encodeURIComponent(a)}&folder=${encodeURIComponent(s)}`,`Opening folder ${s} in the OpenKnowledge desktop app.`,a,o,n,l);let e=n.resolveBaseUrl(a);if(e){let t=`${e}/#/${Te(s)}`;return Md(t,`Opening folder ${s} in your browser: ${t}`,a,o,n)}return jd(n)}if(l)return Md(`openknowledge://open?project=${encodeURIComponent(a)}&doc=${encodeURIComponent(s)}`,`Opening ${s} in the OpenKnowledge desktop app.`,a,o,n,l);let u=n.resolveBaseUrl(a);if(u){let e=`${u}/#/${qt(s)}`;return Md(e,`Opening ${s} in your browser: ${e}`,a,o,n)}return jd(n)}function Pd(){return new M(`open`).description(`Open a doc, folder, or skill in the OK Desktop app (falls back to the browser UI). Docs and folders are auto-detected — no flag needed.`).argument(`<name>`,`Doc path (specs/foo/SPEC), folder path (specs/foo or specs/foo/), or a skill name with --skill`).option(`--skill`,`Open <name> as a skill in the skill editor`).option(`--scope <scope>`,`Skill scope when --skill is set: ${w.join(` | `)}`,`project`).option(`--project <dir>`,`Project root (defaults to the project enclosing the current directory)`).action(async(e,t)=>{process.exitCode=await Nd(e,t,kd())})}function Fd(e){return new M(`preview`).description(`Show what content the watcher will track (read-only)`).action(async()=>{let{previewContent:t,formatPreviewBlock:n}=await import(`./preview-DE8o_7W6.mjs`),r=e(),i=process.cwd(),a=Xe(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 Id(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function Ld(e,t,n=process.cwd()){let r=e.op??`sync`,i=j(n),a=He(i);if(a&&a.port>0){let t=`http://127.0.0.1:${a.port}/api/sync/trigger`;e.json||process.stderr.write(`Triggering ${r} via running server (port ${a.port})\n`);try{let n=await fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`,...ue({kind:`cli`,runtimeVersion:At})},body:JSON.stringify({op:r})});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.title??e.error??e.message??`Server responded with ${n.status}`)}Id(e.json,{type:`triggered`,op:r,port:a.port}),e.json||process.stderr.write(`✓ ${r} triggered\n`);return}catch(t){let n=t instanceof Error?t.message:String(t);e.json||process.stderr.write(`Server trigger failed (${n}), running directly\n`)}}e.json||process.stderr.write(`Running ${r} directly (no live server)\n`);let o=it({baseDir:n});if(r===`sync`||r===`pull`){Id(e.json,{type:`step`,step:`pull`});let t=await o.pull();Id(e.json,{type:`pull`,summary:t.summary}),e.json||process.stderr.write(` pull: ${t.summary.changes} changes\n`)}(r===`sync`||r===`push`)&&(Id(e.json,{type:`step`,step:`push`}),await o.push(),Id(e.json,{type:`push`,ok:!0}),e.json||process.stderr.write(` push: ok
78
+ `)}function Sd(e,t){return JSON.stringify({applied:t.applied,...e},null,2)}function Cd(e){let t=new Set(md);return e.split(`,`).map(e=>e.trim()).filter(e=>e.length>0).map(e=>{if(!t.has(e))throw Error(`Unknown transform "${e}". Valid transforms: ${md.join(`, `)}`);return e})}function wd(e,t){let n=new Set(md);if(e&&(n=new Set(Cd(e))),t)for(let e of Cd(t))n.delete(e);return n}function Td(){let e=new M(`migrate`).description(`Migrate content from other tools into Open Knowledge`);return e.command(`notion [dir]`).description(`Clean up a Notion "Markdown & CSV" export in place (dry-run unless --apply)`).option(`--apply`,`write changes to disk (default: dry-run preview)`).option(`--strip-base64`,`delete inline base64 images instead of extracting them to files`).option(`--remove-csv`,`delete each "_all.csv" once its table page exists (destructive)`).option(`--only <transforms>`,`run only these transforms (comma-separated: links,frontmatter,callouts,images,tables)`).option(`--skip <transforms>`,`skip these transforms (comma-separated)`).option(`--force`,`run even if the directory is not detected as a Notion export`).option(`--json`,`print a machine-readable JSON report`).action((e,t)=>{let n=H(e??process.cwd()),r;try{r=wd(t.only,t.skip)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exitCode=2;return}let i=_d(n,{selected:r,stripBase64:t.stripBase64??!1,removeCsv:t.removeCsv??!1,force:t.force??!1}),{report:a}=i;if(!a.isNotionExport&&!t.force){t.json?console.log(JSON.stringify({refused:!0,reason:`not-a-notion-export`,dir:n},null,2)):console.error(`Not a Notion export: ${n}\nNo id-suffixed pages, "_all.csv", or inline base64 images were found. Re-run with --force to override.`),process.exitCode=2;return}if(t.apply)try{vd(i)}catch(e){console.error(`Failed to apply changes: ${e instanceof Error?e.message:String(e)}`),process.exitCode=4;return}console.log(t.json?Sd(a,{applied:t.apply??!1}):xd(a,{applied:t.apply??!1,dir:n})),a.filesChanged===0&&a.assetsExtracted===0&&i.deletions.length===0?process.exitCode=1:t.apply&&(a.ambiguousTitleLinks>0||a.wideTables.length>0)&&(process.exitCode=3)}),e}function Ed(e,t,n){return t===`darwin`?n&&e.startsWith(`openknowledge://`)?{command:`/usr/bin/open`,args:[`-a`,n,e]}:{command:`/usr/bin/open`,args:[e]}:t===`win32`?e.startsWith(`http://`)||e.startsWith(`https://`)?{command:`explorer.exe`,args:[e]}:{command:`rundll32.exe`,args:[`url.dll,FileProtocolHandler`,e]}:{command:`xdg-open`,args:[e]}}function Dd(e,t={}){let n=Ed(e,t.platform??process.platform,t.desktopBundlePath);return Cn(n.command,n.args,{spawn:t.spawn,env:t.env,timeoutMs:t.timeoutMs})}function Od(e,t,n=process.platform){let r=Ed(t,n).command;switch(e){case`not-installed`:return`${r} is not installed or cannot be executed`;case`timeout`:return`${r} did not start in time`;case`spawn-error`:return`${r} could not be started`}}function kd(e=()=>On(En())){return{detectBundlePath:()=>e().bundlePath??null,resolveBaseUrl:e=>Ot({lockDir:j(e)}).baseUrl,classifyName:(e,t)=>{let n=B(e,t);try{return G(n).isDirectory()?`folder`:`doc`}catch(e){let t=e?.code;return t!==`ENOENT`&&t!==`ENOTDIR`&&process.stderr.write(`[ok open] statSync failed for ${n} (${t??`unknown`}); treating as a doc\n`),`doc`}},openTarget:Dd,findAncestorProject:e=>$e(z(H(e)))?.rootPath??null,isProjectRoot:e=>$e(e)?.distance===0,enclosingProject:e=>$e(H(e))?.rootPath??null,log:e=>process.stdout.write(`${e}\n`),error:e=>process.stderr.write(`${e}\n`)}}function Ad(e){return e.startsWith(`/`)||e.includes(`\\`)||e.split(`/`).includes(`..`)}function jd(e){return e.error("No OpenKnowledge desktop app found and no UI is running. Install it from https://openknowledge.ai/download, or run `ok start` to serve the editor, then retry."),1}async function Md(e,t,n,r,i,a){let o=await i.openTarget(e,a?{desktopBundlePath:a}:{});if(!o.ok)return i.error(`Could not open ${e}: ${Od(o.reason,e)}.`),1;if(i.log(t),!r)return i.log(`Working directory: ${n} (not an OpenKnowledge project).`),0;i.log(`Project: ${n}`);let s=i.findAncestorProject(n);return s!==null&&i.log(`Note: this project (${n}) is nested inside another OpenKnowledge project at ${s}. Pass --project to choose explicitly.`),0}async function Nd(e,t,n){let r=t.project!==void 0,i=r?null:n.enclosingProject(process.cwd()),a=H(t.project??i??process.cwd()),o=r||i!==null,s=e.replace(/\/+$/,``);if(r&&!n.isProjectRoot(a))return n.error(`Cannot open with --project ${a}: no .ok/config.yml there, so it is not an OpenKnowledge project.`),1;if(!s)return n.error("Nothing to open: pass a doc, folder, or skill name (e.g. `ok open specs/foo/SPEC`)."),1;if(Ad(s))return n.error(`Invalid name "${s}": must be a relative path with no '..' segments, leading '/', or backslashes.`),1;if(t.skill===!0){let e=t.scope??`project`;if(!w.includes(e))return n.error(`Invalid --scope "${t.scope}": expected one of ${w.join(`, `)}.`),1;let r=n.detectBundlePath();if(r)return Md(`openknowledge://open?project=${encodeURIComponent(a)}&doc=${encodeURIComponent(`__skill__/${e}/${s}`)}`,`Opening skill ${s} (${e}) in the OpenKnowledge desktop app.`,a,o,n,r);let i=n.resolveBaseUrl(a);if(i){let t=`${i}/#/${Ke(e,s)}`;return Md(t,`Opening skill ${s} (${e}) in your browser: ${t}`,a,o,n)}return jd(n)}let c=/\/+$/.test(e)||n.classifyName(a,s)===`folder`,l=n.detectBundlePath();if(c){if(l)return Md(`openknowledge://open?project=${encodeURIComponent(a)}&folder=${encodeURIComponent(s)}`,`Opening folder ${s} in the OpenKnowledge desktop app.`,a,o,n,l);let e=n.resolveBaseUrl(a);if(e){let t=`${e}/#/${Te(s)}`;return Md(t,`Opening folder ${s} in your browser: ${t}`,a,o,n)}return jd(n)}if(l)return Md(`openknowledge://open?project=${encodeURIComponent(a)}&doc=${encodeURIComponent(s)}`,`Opening ${s} in the OpenKnowledge desktop app.`,a,o,n,l);let u=n.resolveBaseUrl(a);if(u){let e=`${u}/#/${qt(s)}`;return Md(e,`Opening ${s} in your browser: ${e}`,a,o,n)}return jd(n)}function Pd(){return new M(`open`).description(`Open a doc, folder, or skill in the OK Desktop app (falls back to the browser UI). Docs and folders are auto-detected — no flag needed.`).argument(`<name>`,`Doc path (specs/foo/SPEC), folder path (specs/foo or specs/foo/), or a skill name with --skill`).option(`--skill`,`Open <name> as a skill in the skill editor`).option(`--scope <scope>`,`Skill scope when --skill is set: ${w.join(` | `)}`,`project`).option(`--project <dir>`,`Project root (defaults to the project enclosing the current directory)`).action(async(e,t)=>{process.exitCode=await Nd(e,t,kd())})}function Fd(e){return new M(`preview`).description(`Show what content the watcher will track (read-only)`).action(async()=>{let{previewContent:t,formatPreviewBlock:n}=await import(`./preview-ZuQGGPiB.mjs`),r=e(),i=process.cwd(),a=Xe(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 Id(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function Ld(e,t,n=process.cwd()){let r=e.op??`sync`,i=j(n),a=He(i);if(a&&a.port>0){let t=`http://127.0.0.1:${a.port}/api/sync/trigger`;e.json||process.stderr.write(`Triggering ${r} via running server (port ${a.port})\n`);try{let n=await fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`,...ue({kind:`cli`,runtimeVersion:At})},body:JSON.stringify({op:r})});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.title??e.error??e.message??`Server responded with ${n.status}`)}Id(e.json,{type:`triggered`,op:r,port:a.port}),e.json||process.stderr.write(`✓ ${r} triggered\n`);return}catch(t){let n=t instanceof Error?t.message:String(t);e.json||process.stderr.write(`Server trigger failed (${n}), running directly\n`)}}e.json||process.stderr.write(`Running ${r} directly (no live server)\n`);let o=it({baseDir:n});if(r===`sync`||r===`pull`){Id(e.json,{type:`step`,step:`pull`});let t=await o.pull();Id(e.json,{type:`pull`,summary:t.summary}),e.json||process.stderr.write(` pull: ${t.summary.changes} changes\n`)}(r===`sync`||r===`push`)&&(Id(e.json,{type:`step`,step:`push`}),await o.push(),Id(e.json,{type:`push`,ok:!0}),e.json||process.stderr.write(` push: ok
79
79
  `)),Id(e.json,{type:`complete`,op:r}),e.json||process.stderr.write(`✓ ${r} complete\n`)}function Rd(e){return new M(`sync`).description(`Commit, pull, and push to the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await Ld({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 zd(e){return new M(`pull`).description(`Pull changes from the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await Ld({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 Bd(e){return new M(`push`).description(`Push commits to the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await Ld({json:t.json,op:`push`},e())}catch(e){let n=e instanceof Error?e.message:String(e);t.json?process.stdout.write(`${JSON.stringify({type:`error`,message:n})}\n`):process.stderr.write(`✗ push failed: ${n}\n`),process.exit(1)}})}function Vd(e,t){if(e.packSkillHomeRefusal===void 0)return``;if(e.packSkillHomeRefusal===`home-escapes-project`)return`\n${L(`!`)} The ${t} skills were not installed: this project's skill folder is a symlink pointing outside the project, and Open Knowledge will not write through it. Replace it with a real directory inside the project, then run \`ok seed\` again.`;let n=[...new Set([v,..._e.map(e=>C[e])].filter(e=>e!==null).map(d))].map(e=>`${e}/`);return`\n${L(`!`)} The ${t} skills were not installed: this project has no agent folder for them. Open Knowledge only writes skills into a folder that already exists (${n.join(`, `)}) and never creates one for you. Create the folder your agent uses, then run \`ok seed\` again to install them.`}function Hd(e){return typeof e==`string`&&gt.includes(e)}async function Ud(e={}){let t=H(e.cwd??process.cwd()),n=e.pack??`knowledge-base`;if(!dt[n])return{status:`failed`,message:`${I(`Error:`)} Unknown pack "${n}". Available: ${gt.join(`, `)}`,exitCode:1};let r;try{r=await Et({projectDir:t,rootDir:e.root,packId:n,skipPrerequisite:e.dryRun===!0})}catch(e){return e instanceof yt?{status:`prerequisite-missing`,message:`${I(`Error:`)} ${e.message}`,exitCode:1}:{status:`failed`,message:`${I(`Error:`)} ${e instanceof Error?e.message:String(e)}`,exitCode:1}}if(!b(r)){let e=dt[n].name,t=(r.packSkills??[]).filter(e=>e.conflict).map(e=>`\n${L(`!`)} Skill "${e.name}" is your own — the pack's version is not installed. Rename yours to install the pack's version.`).join(``),i=Vd(r,e);return{status:`no-op`,message:`${F(`Your ${e} pack is already seeded.`)}${i}${t}${i===``?`\n${P(`Nothing to do.`)}`:``}`,plan:r,exitCode:0}}if(e.dryRun){let e=Pt(dt[n]);return{status:`dry-run`,message:`${R(`Reference this pack for inspiration (dry-run — no changes made):`)}\n\n${e}\n\n${R(`Plan:`)}\n\n${Gd(r,t)}`,plan:r,exitCode:0}}if(!e.yes&&!await Kd(`${R(`Plan:`)}\n\n${Gd(r,t)}\n\n${R(`Apply?`)} ${P(`[Y/n] `)}`,e.confirmStream))return{status:`cancelled`,message:P(`Cancelled.`),plan:r,exitCode:0};let i=await Pe(r,{projectDir:t,packId:n});if(i.errors.length>0){let e=i.errors.map(e=>` ${I(`✗`)} ${e.path}: ${e.error}`);return{status:`failed`,message:[`${L(`Applied`)} ${i.applied} entries, ${L(String(i.errors.length))} error(s):`,...e].join(`
80
80
  `),plan:r,exitCode:1}}let a=dt[n].name,o=i.packSkillsInstalled.length>0?`\n${P(`Installed the ${a} skills for: ${i.packSkillsInstalled.join(`, `)}`)}`:``,s=i.pluginsEnabled.length>0?`\n${P(`Enabled plugin(s) included with this pack: ${i.pluginsEnabled.join(`, `)} — turn off any time in Settings.`)}`:``,c=(i.packSkillConflicts??[]).map(e=>e.hosts===void 0||e.hosts.length===0?`\n${L(`!`)} Skill "${e.name}" was not installed — you already have your own skill with that name. Rename yours if you want the pack's version.`:`\n${L(`!`)} Skill "${e.name}" was not installed for ${e.hosts.join(`, `)} — you already have your own skill with that name there. Rename yours if you want the pack's version.`).join(``);return{status:`applied`,message:`${F(`✓ Seeded ${a}`)} ${P(`(${i.applied} entries, ${i.durationMs}ms)`)}${o}${s}${Vd(r,a)}${c}`,plan:r,exitCode:0}}function Wd(){let e=[R(`Available packs:`)];for(let t of gt){let n=dt[t];e.push(` ${F(t)} ${P(`—`)} ${n.name}: ${n.description}`)}return e.join(`
81
81
  `)}function Gd(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(R(`Folders to create:`));for(let e of r)n.push(` ${F(`+`)} ${N(V(t,H(t,e.path))||e.path)}${P(`/`)}`)}if(i.length>0){n.length>0&&n.push(``),n.push(R(`Files to create:`));for(let e of i)n.push(` ${F(`+`)} ${N(V(t,H(t,e.path))||e.path)}`)}if(e.skipped.length>0){n.length>0&&n.push(``),n.push(P(`Already present (skipped):`));for(let t of e.skipped)n.push(` ${P(`· ${t.path} (${t.reason})`)}`)}if(e.warnings.length>0){n.length>0&&n.push(``),n.push(L(`Warnings:`));for(let t of e.warnings)n.push(` ${L(`!`)} ${t}`)}let a=(e.packSkills??[]).filter(e=>e.conflict);if(a.length>0){n.length>0&&n.push(``),n.push(L(`Name collisions:`));for(let e of a)n.push(` ${L(`!`)} Skill "${e.name}" is your own — the pack's version will not be installed. Rename yours to install the pack's version.`)}return n.join(`
@@ -84,7 +84,7 @@ ${t}`,d++;break;case`id`:l=t.includes(`\0`)?void 0:t;break;case`retry`:/^\d+$/.t
84
84
  `);return}if(a){process.stdout.write(`${JSON.stringify({type:`error`,code:c.kind})}\n`);return}process.stderr.write(`✗ share name-check failed: ${c.kind}\n`),process.exit(1)}function Xd(e){return new M(`name-check`).description(`Check if owner/name is available on GitHub`).requiredOption(`--owner <owner>`,`GitHub owner (user or org)`).requiredOption(`--name <name>`,`Repository name`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{await Yd(t,await e())})}async function Zd(e){try{let t=[],n=await e.users.getAuthenticated();t.push({login:n.data.login,kind:`user`,avatarUrl:n.data.avatar_url});for await(let n of e.paginate.iterator(e.orgs.listMembershipsForAuthenticatedUser,{state:`active`,per_page:100}))for(let e of n.data)(e.permissions?.can_create_repository===!0||e.role===`admin`)&&t.push({login:e.organization.login,kind:`org`,avatarUrl:e.organization.avatar_url??void 0});return{kind:`ok`,owners:t}}catch(e){return e.status===401?{kind:`auth-required`}:{kind:`network`}}}async function Qd(e,t){let{host:n,json:r}=e;xi(n);let i=await Ea(n,t);if(i==null){if(r){process.stdout.write(`${JSON.stringify({type:`error`,code:`auth-required`})}\n`);return}process.stderr.write(`Not logged in to ${n}\n`),process.exit(1)}let a=n===`github.com`?void 0:`https://${n}/api/v3`,o=await Zd(new ya({auth:i,...a?{baseUrl:a}:{}}));if(o.kind===`ok`){if(r)process.stdout.write(`${JSON.stringify({type:`owners`,owners:o.owners})}\n`);else for(let e of o.owners)process.stdout.write(`${e.kind}\t${e.login}\n`);return}if(r){process.stdout.write(`${JSON.stringify({type:`error`,code:o.kind})}\n`);return}process.stderr.write(`✗ share owners failed: ${o.kind}\n`),process.exit(1)}function $d(e){return new M(`owners`).description(`List GitHub owners eligible to host a new repository`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{await Qd(t,await e())})}function ef(e){let t=e,n=t.status,r=t.response?.data,i=t.response?.headers,a=`${r?.message??r?.errors?.map(e=>e.message??``).join(`
85
85
  `)??``}\n${t.message??``}`.toLowerCase();return n===401?`auth-required`:n===403?i?.[`x-github-sso`]||a.includes(`saml`)||a.includes(`sso`)?`saml-sso`:`network`:n===422&&(r?.errors?.some(e=>e.field===`name`)||a.includes(`already exists`)||a.includes(`name already exists`))?`name-conflict`:`network`}async function tf(e){let{octokit:t,ownerLogin:n,ownerKind:r,name:i,visibility:a,description:o}=e,s=a===`private`;if(r===`user`){let{data:e}=await t.repos.createForAuthenticatedUser({name:i,private:s,...o?{description:o}:{}});return{cloneUrl:e.clone_url,defaultBranch:e.default_branch??`main`}}let{data:c}=await t.repos.createInOrg({org:n,name:i,visibility:a,...o?{description:o}:{}});return{cloneUrl:c.clone_url,defaultBranch:c.default_branch??`main`}}async function nf(e,t,n){try{let{data:r}=await e.repos.get({owner:t,repo:n});return{cloneUrl:r.clone_url,defaultBranch:r.default_branch??`main`}}catch{return null}}async function rf(e,t){return(await e.users.getAuthenticated()).data.login.toLowerCase()===t.toLowerCase()?`user`:`org`}function af(e){return it(Qa(e,[])).env(Ka())}function of(e,t){if(!e.startsWith(`https://`))return e;try{if(new URL(e).hostname!==`github.com`)return e}catch{return e}return e.replace(`https://`,`https://x-access-token:${t}@`)}const sf={ensureOkScaffold:e=>{at(e)},gitFactory:af};async function cf(e){let t={...sf,...e.deps},n=H(e.projectDir),r;if(e.ownerKind)r=e.ownerKind;else try{r=await rf(e.octokit,e.body.owner)}catch(e){return{kind:`error`,code:ef(e)}}try{t.ensureOkScaffold(n)}catch{return{kind:`error`,code:`init-failed`}}let i=t.gitFactory(n),a=B(n,`.git`);if(!U(a))try{await i.init()}catch{return{kind:`error`,code:`init-failed`}}let o;try{o=await tf({octokit:e.octokit,ownerLogin:e.body.owner,ownerKind:r,name:e.body.name,visibility:e.body.visibility,description:e.body.description})}catch(t){if(ef(t)===`name-conflict`){let t=await nf(e.octokit,e.body.owner,e.body.name);if(t===null)return{kind:`error`,code:`name-conflict`};o=t}else return{kind:`error`,code:ef(t)}}try{await i.addRemote(`origin`,o.cloneUrl)}catch(e){if(!String(e.message??``).toLowerCase().includes(`remote origin already exists`))return{kind:`error`,code:`push-failed`}}let s=!1;try{await i.raw([`rev-parse`,`--verify`,`HEAD`])}catch{s=!0}if(s)try{await i.add(`.`),await i.raw([`commit`,`--allow-empty`,`-m`,`Initial commit`])}catch{return{kind:`error`,code:`init-failed`}}let c=of(o.cloneUrl,e.token);try{await i.raw([`push`,c,`HEAD:refs/heads/${o.defaultBranch}`])}catch(e){let t=String(e.message??``).toLowerCase();return t.includes(`saml`)||t.includes(`sso`)?{kind:`error`,code:`saml-sso`}:{kind:`error`,code:`push-failed`}}try{await i.raw([`update-ref`,`refs/remotes/origin/${o.defaultBranch}`,`HEAD`])}catch{}return{kind:`ok`,value:{ownerLogin:e.body.owner,repoName:e.body.name,cloneUrl:o.cloneUrl,defaultBranch:o.defaultBranch}}}function lf(e,t){if(!e){t.kind===`ok`?process.stdout.write(`✓ Published ${t.value.cloneUrl}\n`):(process.stderr.write(`✗ share publish failed: ${t.code}\n`),process.exit(1));return}if(t.kind===`ok`){process.stdout.write(`${JSON.stringify({type:`publish`,...t.value})}\n`);return}process.stdout.write(`${JSON.stringify({type:`error`,code:t.code})}\n`)}async function uf(e,t){let{host:n,owner:r,name:i,visibility:a,description:o,projectDir:s,json:c}=e;if(xi(n),Ct(s)){process.stderr.write(`${new Kt(H(s)).message}\n`),process.exitCode=64;return}let l=await Ea(n,t);if(l==null){lf(c,{kind:`error`,code:`auth-required`});return}let u=n===`github.com`?void 0:`https://${n}/api/v3`,d=new ya({auth:l,...u?{baseUrl:u}:{}});try{lr(`git config user.email`,A({cwd:s,stdio:`ignore`}))}catch{process.env.GIT_AUTHOR_NAME??=`OpenKnowledge`,process.env.GIT_AUTHOR_EMAIL??=`noreply@inkeep.com`,process.env.GIT_COMMITTER_NAME??=`OpenKnowledge`,process.env.GIT_COMMITTER_EMAIL??=`noreply@inkeep.com`}lf(c,await cf({octokit:d,token:l,projectDir:s,body:{owner:r,name:i,visibility:a,description:o}}))}function df(e){return new M(`publish`).description(`Publish a no-remote project to GitHub`).requiredOption(`--owner <owner>`,`GitHub owner (user or org)`).requiredOption(`--name <name>`,`Repository name`).requiredOption(`--visibility <visibility>`,`public or private`).option(`--description <description>`,`Repository description`).requiredOption(`--project-dir <projectDir>`,`Path to the project on disk`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{t.visibility!==`public`&&t.visibility!==`private`&&(process.stderr.write(`✗ visibility must be 'public' or 'private'
86
86
  `),process.exit(1)),await uf(t,await e())})}function ff(){let e=new M(`share`);e.description(`Sharing flow operations (owners, name-check, publish)`);let t=()=>Dn();return e.addCommand($d(t)),e.addCommand(Xd(t)),e.addCommand(df(t)),e}function pf(e){if(e.length!==0){process.stderr.write(` Cleared ${e.length} stale entry(s) left by an older version:\n`);for(let t of e)process.stderr.write(` ${t}\n`)}}function mf(){return new M(`unshare`).description(`Switch this project to local-only mode (add OK artifacts to .git/info/exclude so they stay out of git)`).option(`--project <dir>`,`Project root (defaults to cwd)`).option(`--json`,`Output JSON`,!1).action(async e=>{let t=H(e.project??process.cwd()),n=Bn(t),r=Hn(t,n);if(r.kind===`refused-tracked`){if(e.json){let e={type:`sharing-unshare`,projectRoot:t,mode:`refused-tracked`,tracked:r.tracked,remediation:r.remediation};process.stdout.write(`${JSON.stringify(e)}\n`)}else process.stderr.write(`${r.remediation}\n`);process.exitCode=1;return}if(r.kind===`no-exclude`){hf(e.json,t,r.reason);return}let i=Un(t);if(e.json){let e={type:`sharing-unshare`,projectRoot:t,mode:i,appended:r.appended,alreadyPresent:r.alreadyPresent,removed:r.removed};process.stdout.write(`${JSON.stringify(e)}\n`);return}if(r.appended.length===0){if(r.removed.length>0){process.stderr.write(`${F(`✓`)} ${R(`Sharing mode is already`)} ${F(`local-only`)}${R(`.`)}\n`),pf(r.removed);return}process.stderr.write(`${R(`Sharing mode is already`)} ${F(`local-only`)} ${R(`— nothing to do.`)}\n`);return}process.stderr.write(`${F(`✓`)} ${R(`Sharing mode set to`)} ${F(`local-only`)}\n`),process.stderr.write(` Added ${r.appended.length} path(s) to ${R(`.git/info/exclude`)} (per-clone, not committed).\n`),pf(r.removed)})}function hf(e,t,n){if(e){process.stdout.write(`${JSON.stringify({type:`sharing-unshare`,projectRoot:t,mode:`no-git`,appended:[],alreadyPresent:[],reason:n})}\n`);return}process.stderr.write(`${L({"no-git":`No git repository here — sharing mode does not apply.`,"no-info-dir":`The gitdir's info/ folder is absent; cannot toggle sharing mode.`,"malformed-pointer":"The .git pointer file is malformed (stale worktree). Run `git worktree prune` and try again.",inaccessible:`The .git path is inaccessible (permissions or mount issue).`}[n])}\n`)}function gf(){return new M(`share`).description(`Switch this project to shared mode (commit OK config alongside content)`).option(`--project <dir>`,`Project root (defaults to cwd)`).option(`--json`,`Output JSON`,!1).action(async e=>{let t=H(e.project??process.cwd()),n=Un(t),r=Bn(t),i=In(t,r);if(i.kind===`no-exclude`){_f(e.json,t,i.reason);return}let a=Un(t);if(e.json){let e={type:`sharing-share`,projectRoot:t,mode:a,removed:i.removed};process.stdout.write(`${JSON.stringify(e)}\n`);return}if(n===`shared`){if(i.removed.length>0){process.stderr.write(`${F(`✓`)} ${N(`Sharing mode is already`)} ${R(`shared`)}${N(`.`)}\n`),pf(i.removed);return}process.stderr.write(`${N(`Sharing mode is already`)} ${R(`shared`)} ${N(`— nothing to do.`)}\n`);return}process.stderr.write(`${F(`✓`)} ${R(`Sharing mode set to`)} ${F(`shared`)}\n`),process.stderr.write(` Removed OK paths from ${R(`.git/info/exclude`)}; commit the files to share with teammates.\n`)})}function _f(e,t,n){if(e){process.stdout.write(`${JSON.stringify({type:`sharing-share`,projectRoot:t,mode:`no-git`,removed:[],reason:n})}\n`);return}process.stderr.write(`${L({"no-git":`No git repository here — sharing mode does not apply.`,"no-info-dir":`The gitdir's info/ folder is absent; cannot toggle sharing mode.`,"malformed-pointer":"The .git pointer file is malformed (stale worktree). Run `git worktree prune` and try again.",inaccessible:`The .git path is inaccessible (permissions or mount issue).`}[n])}\n`)}function vf(){return new M(`status`).description(`Print the current sharing mode and the OK paths in .git/info/exclude`).option(`--project <dir>`,`Project root (defaults to cwd)`).option(`--json`,`Output JSON`,!1).action(async e=>{let t=H(e.project??process.cwd()),n=Un(t),r=[...Nn(t)],i=Vn(t,Bn(t)).tracked;if(e.json){let e={type:`sharing-status`,projectRoot:t,mode:n,excluded:r,trackedUpstream:i};process.stdout.write(`${JSON.stringify(e)}\n`);return}let a=[];if(a.push(`OpenKnowledge sharing mode: ${yf(n)}`),a.push(``),a.push(`Excluded from git via ${R(`.git/info/exclude`)}:`),r.length===0)a.push(` (none)`);else for(let e of r)a.push(` ${e}`);if(a.push(``),a.push(`Other OK paths exist but are tracked upstream:`),i.length===0)a.push(` (none)`);else for(let e of i)a.push(` ${e}`);a.push(``),a.push(`Toggle with: ${N(n===`local-only`?`ok config-sharing share`:`ok config-sharing unshare`)}`),process.stdout.write(`${a.join(`
87
- `)}\n`)})}function yf(e){switch(e){case`shared`:return F(`shared`);case`local-only`:return F(`local-only`);case`no-git`:return L(`no-git (not a git repository)`)}}function bf(){let e=new M(`config-sharing`);return e.description(`Manage OpenKnowledge's git-sharing mode (share OK config with the team, or keep local-only on this machine)`),e.addCommand(gf()),e.addCommand(mf()),e.addCommand(vf()),e}const xf=new Set([`--cwd`,`--log-level`,`--project`,`--scope`]);function Sf(e){let t=[],n=null,r=null,i=!1;for(let a=0;a<e.length;a++){let o=e[a];if(o===`--help`||o===`-h`||o===`--version`||o===`-V`){i=!0;break}if(xf.has(o)){let t=e[a+1]??null;o===`--cwd`&&(n=t),o===`--project`&&(r=t),a++;continue}if(o.startsWith(`--cwd=`)){n=o.slice(6);continue}if(o.startsWith(`--project=`)){r=o.slice(10);continue}o.startsWith(`-`)||t.push(o)}return{operands:t,cwd:n,project:r,sawTerminalFlag:i}}function Cf(e,t){if(e.length===0)return null;let n=e[0];return n===`open`&&e[1]!==void 0&&t.isFileish(e[1])?e[1]:t.knownSubcommands.has(n)?null:t.isFileish(n)?n:null}function wf(e){return/\.(md|mdx)$/i.test(e)}function Tf(e,t){if(wf(t))return!0;try{return G(e).isFile()}catch(t){let n=t?.code;return n!==`ENOENT`&&n!==`ENOTDIR`&&process.stderr.write(`[ok] statSync failed for ${e} (${n??`unknown`}); treating as non-fileish\n`),!1}}function Ef(e,t){let n=Sf(e);if(n.sawTerminalFlag)return null;let r=n.cwd?t.resolvePath(t.cwd,n.cwd):t.cwd,i=Cf(n.operands,{knownSubcommands:t.knownSubcommands,isFileish:e=>t.isFileish(t.resolvePath(r,e),e)});return i===null?null:{absPath:t.resolvePath(r,i),projectRoot:n.project===null?null:t.resolvePath(r,n.project)}}function Df(e=()=>On(En())){return{prepare:xt,detectBundlePath:()=>e().bundlePath??null,openTarget:Dd,runProjectOpen:(e,t)=>Nd(e,{project:t},kd()),runBrowserOpen:e=>kf(e),log:e=>process.stdout.write(`${e}\n`),error:e=>process.stderr.write(`${e}\n`)}}async function Of(e,t,n={}){let r;try{r=t.prepare(e,{projectRoot:n.projectRoot})}catch(e){if(e instanceof ot||e instanceof Gt||e instanceof Ut||e instanceof Be)return t.error(e.message),1;throw e}if(r.mode===`project`)return await t.runProjectOpen(r.docName,r.projectRoot);let i=t.detectBundlePath();if(i){let e=`openknowledge://open?file=${encodeURIComponent(r.canonicalFilePath)}`,n=await t.openTarget(e,{desktopBundlePath:i});return n.ok?(t.log(`Opening ${r.singleDocRelPath} in the OpenKnowledge desktop app.`),0):(t.error(`Could not open the OpenKnowledge desktop app: ${Od(n.reason,e)}.`),1)}return await t.runBrowserOpen(r),0}async function kf(e){let{createEphemeralProjectDir:t}=await import(`./dist-D-X0Yg3B.mjs`),{loadConfig:n}=await import(`./src-CQoldCaL.mjs`),{bootStartServer:r,resolveBundledReactShellDir:i,resolveHost:a}=await import(`./start-cn3uDrUj.mjs`),{openBrowser:o}=await import(`./open-browser-DTJSqTQH.mjs`),s=i();s||(process.stderr.write("OpenKnowledge UI assets were not found. Reinstall @inkeep/open-knowledge, or build the app (`bun run build`) in a monorepo checkout.\n"),process.exit(1));let c=t(e.contentDir),l=!1,u,d=async()=>{if(!l){l=!0;try{await u?.destroy(`external-signal`)}catch{}try{await Pr(c,{recursive:!0,force:!0})}catch{}}},f=()=>{d().then(()=>process.exit(0))};process.once(`SIGINT`,f),process.once(`SIGTERM`,f);let{config:p}=n(c),m=a({},process.env);try{u=await r({config:p,cwd:c,host:m,port:0,projectDir:c,singleFile:e.canonicalFilePath,serveContentAssets:!0,reactShellDistDir:s,idleThresholdMs:6e5})}catch(t){await d(),process.stderr.write(`Failed to open ${e.singleDocRelPath}: ${t instanceof Error?t.message:String(t)}\n`),process.exit(1)}let h=`http://${m}:${u.port}/#/${qt(e.docName)}`;process.env.OK_SINGLE_FILE_NO_OPEN===`1`?process.stdout.write(`Serving ${e.singleDocRelPath} (headless) at: ${h}\n`):(process.stdout.write(`Opening ${e.singleDocRelPath} in your browser: ${h}\n`),process.stdout.write(`Press Ctrl-C to close the session.
87
+ `)}\n`)})}function yf(e){switch(e){case`shared`:return F(`shared`);case`local-only`:return F(`local-only`);case`no-git`:return L(`no-git (not a git repository)`)}}function bf(){let e=new M(`config-sharing`);return e.description(`Manage OpenKnowledge's git-sharing mode (share OK config with the team, or keep local-only on this machine)`),e.addCommand(gf()),e.addCommand(mf()),e.addCommand(vf()),e}const xf=new Set([`--cwd`,`--log-level`,`--project`,`--scope`]);function Sf(e){let t=[],n=null,r=null,i=!1;for(let a=0;a<e.length;a++){let o=e[a];if(o===`--help`||o===`-h`||o===`--version`||o===`-V`){i=!0;break}if(xf.has(o)){let t=e[a+1]??null;o===`--cwd`&&(n=t),o===`--project`&&(r=t),a++;continue}if(o.startsWith(`--cwd=`)){n=o.slice(6);continue}if(o.startsWith(`--project=`)){r=o.slice(10);continue}o.startsWith(`-`)||t.push(o)}return{operands:t,cwd:n,project:r,sawTerminalFlag:i}}function Cf(e,t){if(e.length===0)return null;let n=e[0];return n===`open`&&e[1]!==void 0&&t.isFileish(e[1])?e[1]:t.knownSubcommands.has(n)?null:t.isFileish(n)?n:null}function wf(e){return/\.(md|mdx)$/i.test(e)}function Tf(e,t){if(wf(t))return!0;try{return G(e).isFile()}catch(t){let n=t?.code;return n!==`ENOENT`&&n!==`ENOTDIR`&&process.stderr.write(`[ok] statSync failed for ${e} (${n??`unknown`}); treating as non-fileish\n`),!1}}function Ef(e,t){let n=Sf(e);if(n.sawTerminalFlag)return null;let r=n.cwd?t.resolvePath(t.cwd,n.cwd):t.cwd,i=Cf(n.operands,{knownSubcommands:t.knownSubcommands,isFileish:e=>t.isFileish(t.resolvePath(r,e),e)});return i===null?null:{absPath:t.resolvePath(r,i),projectRoot:n.project===null?null:t.resolvePath(r,n.project)}}function Df(e=()=>On(En())){return{prepare:xt,detectBundlePath:()=>e().bundlePath??null,openTarget:Dd,runProjectOpen:(e,t)=>Nd(e,{project:t},kd()),runBrowserOpen:e=>kf(e),log:e=>process.stdout.write(`${e}\n`),error:e=>process.stderr.write(`${e}\n`)}}async function Of(e,t,n={}){let r;try{r=t.prepare(e,{projectRoot:n.projectRoot})}catch(e){if(e instanceof ot||e instanceof Gt||e instanceof Ut||e instanceof Be)return t.error(e.message),1;throw e}if(r.mode===`project`)return await t.runProjectOpen(r.docName,r.projectRoot);let i=t.detectBundlePath();if(i){let e=`openknowledge://open?file=${encodeURIComponent(r.canonicalFilePath)}`,n=await t.openTarget(e,{desktopBundlePath:i});return n.ok?(t.log(`Opening ${r.singleDocRelPath} in the OpenKnowledge desktop app.`),0):(t.error(`Could not open the OpenKnowledge desktop app: ${Od(n.reason,e)}.`),1)}return await t.runBrowserOpen(r),0}async function kf(e){let{createEphemeralProjectDir:t}=await import(`./dist-D-X0Yg3B.mjs`),{loadConfig:n}=await import(`./src-y3GVfDV1.mjs`),{bootStartServer:r,resolveBundledReactShellDir:i,resolveHost:a}=await import(`./start-CdgXY25v.mjs`),{openBrowser:o}=await import(`./open-browser-DTJSqTQH.mjs`),s=i();s||(process.stderr.write("OpenKnowledge UI assets were not found. Reinstall @inkeep/open-knowledge, or build the app (`bun run build`) in a monorepo checkout.\n"),process.exit(1));let c=t(e.contentDir),l=!1,u,d=async()=>{if(!l){l=!0;try{await u?.destroy(`external-signal`)}catch{}try{await Pr(c,{recursive:!0,force:!0})}catch{}}},f=()=>{d().then(()=>process.exit(0))};process.once(`SIGINT`,f),process.once(`SIGTERM`,f);let{config:p}=n(c),m=a({},process.env);try{u=await r({config:p,cwd:c,host:m,port:0,projectDir:c,singleFile:e.canonicalFilePath,serveContentAssets:!0,reactShellDistDir:s,idleThresholdMs:6e5})}catch(t){await d(),process.stderr.write(`Failed to open ${e.singleDocRelPath}: ${t instanceof Error?t.message:String(t)}\n`),process.exit(1)}let h=`http://${m}:${u.port}/#/${qt(e.docName)}`;process.env.OK_SINGLE_FILE_NO_OPEN===`1`?process.stdout.write(`Serving ${e.singleDocRelPath} (headless) at: ${h}\n`):(process.stdout.write(`Opening ${e.singleDocRelPath} in your browser: ${h}\n`),process.stdout.write(`Press Ctrl-C to close the session.
88
88
  `),o(h)),await new Promise(()=>{})}function Af(){let e=new M(`skills`).description(`Manage Open Knowledge skills for this project.`);return e.command(`installed`).description(`List every skill installed across all your agents (read-only).`).option(`--json`,`Emit the raw enumeration as JSON.`).action(e=>{let t=H(process.cwd()),n=St($e(t)?.rootPath??t),r=Wt({projectDir:n}),i={...r,skills:r.skills.filter(e=>s(e.provenance,n))};if(e.json){process.stdout.write(`${JSON.stringify(i,null,2)}\n`);return}if(i.skills.length===0){process.stdout.write(`${P(`No installed skills found across any agent.`)}\n`);return}process.stdout.write(`${R(`${i.skills.length} installed skill(s):`)}\n`);for(let e of i.skills){let t=e.provenance.version?P(` v${e.provenance.version}`):``,n=[e.inert.commands&&`commands`,e.inert.hooks&&`hooks`,e.inert.mcp&&`mcp`].filter(Boolean),r=n.length>0?P(` [${n.join(`, `)}]`):``;process.stdout.write(` ${F(e.name)}${t} ${P(e.sourceHarnesses.join(`, `))}${r}\n`)}process.stdout.write(`\n${R(`${i.packs.length} pack(s):`)}\n`);for(let e of i.packs)process.stdout.write(` ${N(e.name)} ${P(`v${e.version}`)} — ${e.skills.length} skill(s)\n`)}),e.command(`import <source>`).description(`Import a skill into this project as versioned content (github owner/repo, a git URL, or a local path).`).option(`--skill <name>`,`Pick one skill from a multi-skill source.`).option(`--scope <scope>`,`project (default) or global.`,`project`).action(async(e,t)=>{let n=j(process.cwd()),r=mn(n,`server`);if(r.status!==`alive`){process.stderr.write(`${I(`Error:`)} no running Open Knowledge server for this project. Start it with ${R(`ok start`)} and retry.\n`),process.exitCode=1;return}let i;try{i=await fetch(`http://127.0.0.1:${r.lock.port}/api/skill/import`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({source:e,...t.skill?{skill:t.skill}:{},scope:t.scope===`global`?`global`:`project`})})}catch(e){let t=e instanceof Error?e.message:String(e);process.stderr.write(`${I(`Error:`)} could not reach the server: ${t}\n`),process.exitCode=1;return}let a=await i.json().catch(()=>({}));if(!i.ok){let e=a.detail??a.title??`HTTP ${i.status}`;process.stderr.write(`${I(`Import failed:`)} ${e}\n`),process.exitCode=1;return}let o=a.name;if(a.alreadyImported){process.stdout.write(`${N(`Already imported:`)} ${R(o)} (identical content).\n`);return}let s=a.provenance??{},c=a.collisionRenamedFrom;process.stdout.write(`${F(`Imported`)} ${R(o)}${c?P(` (renamed from ${c} — name was taken)`):``} from ${P(s.source??e)}${s.publisher?P(` · ${s.publisher}`):``}.\n${P(`Saved as versioned content in this project's skill home. Scripts shown, never run. Use the skill's install menu (or the install MCP verb) to add it to your other editors.`)}\n`);for(let e of a.warnings??[])process.stdout.write(` ${P(`! ${e}`)}\n`)}),e}function jf(e){return{server:Mf(`server`,e),ui:e.status===`alive`&&Ce(e.lock)?{name:`ui`,state:`alive`,pid:e.lock.pid,port:e.lock.port,startedAt:e.lock.startedAt,host:e.lock.hostname,alive:!0,servedByServer:!0}:{name:`ui`,state:`missing`,alive:!1}}}function Mf(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 Nf(e){return`${Pf(e.server)}\n${Pf(e.ui)}`}function Pf(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\``:e.servedByServer===!0?`${t} served by server pid=${e.pid} port=${e.port}`:`${t} alive pid=${e.pid} port=${e.port} started=${e.startedAt}`}function Ff(e){let t=e.inspect??(()=>mn(e.lockDir,`server`)),n=e.log??(e=>console.log(e)),r=jf(t());return e.json?n(JSON.stringify(r,null,2)):n(Nf(r)),r}function If(e){return new M(`status`).description(`Show whether the server and UI are running for this project`).option(`--json`,`Emit structured JSON instead of formatted text`).action(t=>{e(),Ff({lockDir:j(process.cwd()),json:t.json===!0})})}function Lf(e){if(e.yes===!0||e.json===!0)return!1;let t=e.stdinIsTTY??process.stdin.isTTY,n=e.stdoutIsTTY??process.stdout.isTTY;return t===!0&&n===!0}async function Rf(e,t){let n=Rr({input:e.input,output:e.output});try{return(await n.question(t)).trim()}finally{n.close()}}async function zf(e={}){let t={input:e.input??process.stdin,output:e.output??process.stderr};t.output.write(P(`
89
89
  What you share is sent to the OpenKnowledge team.
90
90
  `));let n=await Fn({message:`Before you go, mind sharing why? (optional)`,default:null,pageSize:l.length+1,choices:[...l.map(e=>({name:e.label,value:e.value})),{name:`Skip, I'd rather not say`,value:null}]},t);if(n===null)return{};let r=await Rf(t,P(`Anything else we should know? (optional) `)),i=await Rf(t,P(`Email, if we may follow up (optional) `));return{reason:n,note:r||void 0,email:i||void 0}}async function Bf(e){if(!Lf(e))return`not-prompted`;let t;try{t=await(e.collect??(()=>zf(e)))()}catch{return`failed`}return le(t)?((e.output??process.stderr).write(`\n${R(`Thank you. We read every response.`)}\n\n`),(await(e.submit??c)({...t,source:`cli_uninstall`,appVersion:e.appVersion,platform:e.platform})).ok?`submitted`:`undelivered`):`skipped`}function Vf(e,t,n=Hf,r=U,i={}){let a=[],o=i.platform??process.platform,s=i.env??process.env;if(o===`darwin`)for(let t of[`/Applications/OpenKnowledge.app`,B(e,`Applications`,`OpenKnowledge.app`)])r(t)&&a.push({method:`app`,label:`OK Desktop (${t})`,instruction:`Move ${t} to the Trash (or: rm -rf "${t}")`});else if(o===`win32`){let e=s.LOCALAPPDATA;if(e)for(let t of[`@inkeepopen-knowledge-desktop`,`OpenKnowledge`]){let n=B(e,`Programs`,t,`OpenKnowledge.exe`);if(r(n)){a.push({method:`app`,label:`OK Desktop (${n})`,instruction:`Uninstall from Windows Settings → Apps → Installed apps → OpenKnowledge`});break}}}else o===`linux`&&r(`/opt/OpenKnowledge/openknowledge`)&&a.push({method:`app`,label:`OK Desktop (/opt/OpenKnowledge)`,instruction:`Remove with your package manager: sudo apt remove openknowledge (Debian/Ubuntu) or sudo dnf remove OpenKnowledge (Fedora/RHEL)`});return n([`ls`,`-g`,`--depth=0`,`@inkeep/open-knowledge`])?.includes(`@inkeep/open-knowledge@`)&&a.push({method:`npm-global`,label:`npm global install`,instruction:`npm uninstall -g @inkeep/open-knowledge`}),t&&/[/\\]_npx[/\\]/.test(t)&&a.push({method:`npx`,label:`npx (ephemeral)`,instruction:`Nothing to uninstall — npx runs from a temporary cache. (Optional: npm cache clean --force)`}),a}function Hf(e){try{return cr(`npm`,e,A({encoding:`utf-8`,timeout:5e3,stdio:[`ignore`,`pipe`,`ignore`]}))}catch{return null}}const Uf=`━`.repeat(64);function Wf(e,t=process.platform){let n=[L(Uf),R(` One more step — remove the OpenKnowledge app itself`),P(` (OpenKnowledge can't delete its own running binary — do this by hand.)`),``];if(e.length===0){let e=t===`win32`?`uninstall from Settings → Apps → Installed apps → OpenKnowledge`:t===`linux`?`remove the openknowledge package with your package manager (apt / dnf)`:`move /Applications/OpenKnowledge.app to the Trash`;n.push(P(` Install method not detected. If you installed it, remove it via:`)),n.push(` ${N(`OK Desktop`)} — ${e}`),n.push(` ${N(`npm global`)} — npm uninstall -g @inkeep/open-knowledge`),n.push(` ${N(`npx`)} — nothing to remove (runs from a temporary cache)`)}else for(let t of e)n.push(` ${N(t.label)}`),n.push(` ${t.instruction}`);return n.push(L(Uf)),n.join(`
@@ -0,0 +1 @@
1
+ import"./md-manager-BGnqyqi1-eohu_6wW.mjs";var e=`0.69.3`;const t=`config.yml`,n=e;export{n,t};
package/dist/index.mjs CHANGED
@@ -1527,6 +1527,6 @@ export default function okBridge(pi: {
1527
1527
  `);te(e,o)}function M9(e,t){let n=x(e,`utf-8`);if(n.trim().length!==0)try{let r=A9(JSON.parse(n),t),i=n.endsWith(`
1528
1528
  `)?`
1529
1529
  `:``;te(e,`${JSON.stringify(r,null,2)}${i}`)}catch{let r=k9(n,t.contentDir);r!==n&&te(e,r)}}function N9(e,t){let n=x(e,`utf-8`),r=k9(n,t.contentDir);r!==n&&te(e,r)}function P9(e){try{return C(e,{withFileTypes:!0}).filter(e=>e.isFile()).map(t=>N(e,t.name))}catch{return[]}}const iEe=new Set([`agent-presence.json`,`agent-effects.json`,`runtime.json`]);function F9(e){return/\.log\.\d+$/.test(e)}function aEe(e){return e.endsWith(`.jsonl`)||e.endsWith(`.log`)||F9(e)}const oEe=[`telemetry`,`logs`,`process`,`diagnostic-reports`];function sEe(e){let t={contentDir:e.contentDir};for(let n of oEe)for(let r of P9(N(e.stagingDir,n)))aEe(r)?j9(r,t):r.endsWith(`.json`)?M9(r,t):N9(r,t);for(let n of P9(N(e.stagingDir,`state`))){let e=fe(n);n.endsWith(`.jsonl`)?j9(n,t):iEe.has(e)?M9(n,t):N9(n,t)}}const I9=[`.ok`,`local`,`telemetry`],L9=[`.ok`,`local`,`logs`],R9=[`.ok`,`local`,`loss-capture`],z9=`spans-current.jsonl`,B9=`spans-prev.jsonl`,V9=`server-current.jsonl`,H9=`server-prev.jsonl`,U9=`loss-current.jsonl`,W9=`loss-prev.jsonl`;function cEe(e){return N(e,...I9,z9)}function lEe(e){return N(e,...I9,B9)}function uEe(e){return N(e,...L9,V9)}function dEe(e){return N(e,...L9,H9)}function fEe(e){return N(e,...R9,U9)}function pEe(e){return N(e,...R9,W9)}const G9=1e3;async function mEe(e){try{let t=await fetch(`http://127.0.0.1:${e}/api/metrics/agent-presence`,{signal:AbortSignal.timeout(G9)});return t.ok?await t.text():null}catch{return null}}async function hEe(e){try{let t=await fetch(`http://127.0.0.1:${e}/api/metrics/agent-effects`,{signal:AbortSignal.timeout(G9)});return t.ok?await t.text():null}catch{return null}}async function gEe(e){try{let t=await fetch(`http://127.0.0.1:${e}/api/metrics/watcher-recent`,{signal:AbortSignal.timeout(G9)});return t.ok?await t.text():null}catch{return null}}function _Ee(e){try{let t=JSON.parse(e);if(typeof t!=`object`||!t)return null;let n=t.decisions;return Array.isArray(n)?n.length===0?``:`${n.map(e=>JSON.stringify(e)).join(`
1530
- `)}\n`:null}catch{return null}}function vEe(e){let t=N(e,`.git`,`ok`);if(!h(t))return null;let n=l(`git`,[`-C`,t,`log`,`--oneline`,`-50`],W8({encoding:`utf-8`,timeout:2e3}));return n.error||n.status!==0?null:n.stdout??``}function yEe(e){let t=N(e,`.git`,`ok`);if(!h(t))return null;let n=l(`git`,[`-C`,t,`for-each-ref`,`--sort=-creatordate`,`--count=50`,`--format=%(refname)%09%(creatordate:iso-strict)%09%(contents:subject)`,`refs/checkpoints/`],W8({encoding:`utf-8`,timeout:2e3}));return n.error||n.status!==0?null:n.stdout??``}function K9(){let e=process.env.OK_DESKTOP_VERSION,t=process.env.OK_DESKTOP_PACKAGED,n=process.env.OK_DESKTOP_CHANNEL;return e===void 0||t===void 0||n===void 0?null:{electronVersion:e,packaged:t===`1`||t.toLowerCase()===`true`,channel:n}}function bEe(){return{nodeVersion:process.version,platform:k(),arch:re()}}function xEe(){return process.env.OTEL_SDK_DISABLED===`false`}function q9(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function J9(e){if(!h(e))return{};let t;try{t=(0,rn.parse)(x(e,`utf-8`))}catch(t){return console.warn(`[ok diagnose bundle] failed to parse ${e} for manifest config; manifest will report schema defaults. Reason: ${t instanceof Error?t.message:String(t)}`),{}}if(!q9(t))return{};let n=t.telemetry;if(!q9(n))return{};let r=n.localSink;return q9(r)?r:{}}function Y9(e){return typeof e==`boolean`?e:void 0}function SEe(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?e:void 0}function X9(e){if(q9(e))return SEe(e.maxBytes)}function CEe(e){let t=J9(z$(`project`,e)),n=J9(z$(`project-local`,e));return{enabled:Y9(n.enabled)??Y9(t.enabled)??!0,spansMaxBytes:X9(n.spans)??X9(t.spans)??52428800,logsMaxBytes:X9(n.logs)??X9(t.logs)??26214400}}function wEe(e){return je(`sha256`).update(e).digest(`hex`)}function TEe(e){let t=x(e),n=0;for(let e=0;e<t.length;e++)t[e]===10&&n++;return n}const EEe=[`"doc.name"`,`"docName"`];function DEe(e){let t=x(e,`utf-8`),n=0;for(let e of EEe){let r=t.indexOf(e);for(;r!==-1;)n++,r=t.indexOf(e,r+e.length)}return n}function Z9(e,t){if(!h(e))return!1;try{return _(pe(t),{recursive:!0}),e.endsWith(`.ips`)?te(t,a9(x(e,`utf-8`))):p(e,t),!0}catch{return!1}}function Q9(e){let t=[],n=e=>{let r=C(e,{withFileTypes:!0});for(let i of r){let r=N(e,i.name);i.isDirectory()?n(r):i.isFile()&&t.push(r)}};return n(e),t.sort()}const OEe=new Set([`.jsonl`]);function kEe(e){let t=e.lastIndexOf(`.`);return t!==-1&&OEe.has(e.slice(t))}const AEe=new Set([`.jsonl`,`.json`,`.txt`,`.log`,`.lock`,`.yaml`,`.yml`,`.ips`]);function jEe(e){if(F9(e))return!0;let t=e.lastIndexOf(`.`);return t!==-1&&AEe.has(e.slice(t))}function MEe(e){let t=[];for(let n of Q9(e)){let r=$9(e,n);if(!jEe(r))continue;let{redacted:i,patterns:a,lineCount:o}=OB(x(n,`utf-8`));a.length!==0&&(te(n,i),t.push({file:r,lineCount:o,patterns:a}))}return{redactions:t,redactedLineCount:t.reduce((e,t)=>e+t.lineCount,0)}}function $9(e,t){return _e(e,t).split(ye).join(`/`)}async function NEe(e){let t=ve(e.contentDir),n=ve(e.projectDir??e.contentDir),r=e.deps??{},i=r.fetchAgentPresence??mEe,a=r.fetchAgentEffects??hEe,o=r.fetchWatcherRecent??gEe,s=r.readShadowHead??vEe,c=r.readCheckpointRefs??yEe,l=r.now??(()=>new Date),u=r.okVersion??(()=>`0.69.2`),d=r.readDesktopEnv??K9,f=r.readLanguage??O9,m=r.readRuntime??bEe,g=r.isOtlpPushEnabled??xEe,y=v(N(le(),`ok-bundle-`));try{_(N(y,`telemetry`),{recursive:!0}),_(N(y,`logs`),{recursive:!0}),_(N(y,`state`),{recursive:!0}),Z9(cEe(n),N(y,`telemetry`,z9)),Z9(lEe(n),N(y,`telemetry`,B9)),Z9(uEe(n),N(y,`logs`,V9)),Z9(dEe(n),N(y,`logs`,H9));for(let t of e.userLogFiles??[])Z9(t,N(y,`logs`,fe(t)));for(let t of e.userStateFiles??[])Z9(t,N(y,sR,fe(t)));let v=0;for(let t of e.diagnosticReports?.files??[])Z9(t,N(y,`diagnostic-reports`,fe(t)))&&(v+=1);let b=N(n,`.ok`,`local`),S=N(b,`server.lock`),C=`not-running`,w=`no server.lock`,T=null;if(h(S)){Z9(S,N(y,`state`,`server.lock`));try{let e=x(S,`utf-8`),t=JSON.parse(e);typeof t.port==`number`?T=t.port:w=`lock present but no port`}catch{w=`lock present but unparseable`}}if(T!==null){let e=await i(T);e===null?w=`agent-presence endpoint at :${T} unreachable`:(te(N(y,`state`,`agent-presence.json`),e),C=`running`,w=``);let t=await a(T);t!==null&&te(N(y,`state`,`agent-effects.json`),t);let n=await o(T);if(n!==null){let e=_Ee(n);e!==null&&te(N(y,`state`,`watcher-recent.jsonl`),e)}}let E=s(t);E!==null&&te(N(y,`state`,`shadow-head.txt`),E);let ee=c(t);ee!==null&&te(N(y,`state`,`checkpoint-refs.txt`),ee),Z9(fEe(n),N(y,`state`,U9)),Z9(pEe(n),N(y,`state`,W9)),Z9(N(b,`last-spawn-error.log`),N(y,`state`,`last-spawn-error.log`)),Z9(N(b,nu),N(y,`state`,nu)),Z9(N(b,ru),N(y,`state`,ru));let ne=m(),re=d(),ie=f(),ae={ok:{version:u(),nodeVersion:ne.nodeVersion,platform:ne.platform,arch:ne.arch},host:{desktop:re,language:ie}};te(N(y,`state`,`runtime.json`),`${JSON.stringify(ae,null,2)}\n`);let oe=C===`running`?`running
1530
+ `)}\n`:null}catch{return null}}function vEe(e){let t=N(e,`.git`,`ok`);if(!h(t))return null;let n=l(`git`,[`-C`,t,`log`,`--oneline`,`-50`],W8({encoding:`utf-8`,timeout:2e3}));return n.error||n.status!==0?null:n.stdout??``}function yEe(e){let t=N(e,`.git`,`ok`);if(!h(t))return null;let n=l(`git`,[`-C`,t,`for-each-ref`,`--sort=-creatordate`,`--count=50`,`--format=%(refname)%09%(creatordate:iso-strict)%09%(contents:subject)`,`refs/checkpoints/`],W8({encoding:`utf-8`,timeout:2e3}));return n.error||n.status!==0?null:n.stdout??``}function K9(){let e=process.env.OK_DESKTOP_VERSION,t=process.env.OK_DESKTOP_PACKAGED,n=process.env.OK_DESKTOP_CHANNEL;return e===void 0||t===void 0||n===void 0?null:{electronVersion:e,packaged:t===`1`||t.toLowerCase()===`true`,channel:n}}function bEe(){return{nodeVersion:process.version,platform:k(),arch:re()}}function xEe(){return process.env.OTEL_SDK_DISABLED===`false`}function q9(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function J9(e){if(!h(e))return{};let t;try{t=(0,rn.parse)(x(e,`utf-8`))}catch(t){return console.warn(`[ok diagnose bundle] failed to parse ${e} for manifest config; manifest will report schema defaults. Reason: ${t instanceof Error?t.message:String(t)}`),{}}if(!q9(t))return{};let n=t.telemetry;if(!q9(n))return{};let r=n.localSink;return q9(r)?r:{}}function Y9(e){return typeof e==`boolean`?e:void 0}function SEe(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?e:void 0}function X9(e){if(q9(e))return SEe(e.maxBytes)}function CEe(e){let t=J9(z$(`project`,e)),n=J9(z$(`project-local`,e));return{enabled:Y9(n.enabled)??Y9(t.enabled)??!0,spansMaxBytes:X9(n.spans)??X9(t.spans)??52428800,logsMaxBytes:X9(n.logs)??X9(t.logs)??26214400}}function wEe(e){return je(`sha256`).update(e).digest(`hex`)}function TEe(e){let t=x(e),n=0;for(let e=0;e<t.length;e++)t[e]===10&&n++;return n}const EEe=[`"doc.name"`,`"docName"`];function DEe(e){let t=x(e,`utf-8`),n=0;for(let e of EEe){let r=t.indexOf(e);for(;r!==-1;)n++,r=t.indexOf(e,r+e.length)}return n}function Z9(e,t){if(!h(e))return!1;try{return _(pe(t),{recursive:!0}),e.endsWith(`.ips`)?te(t,a9(x(e,`utf-8`))):p(e,t),!0}catch{return!1}}function Q9(e){let t=[],n=e=>{let r=C(e,{withFileTypes:!0});for(let i of r){let r=N(e,i.name);i.isDirectory()?n(r):i.isFile()&&t.push(r)}};return n(e),t.sort()}const OEe=new Set([`.jsonl`]);function kEe(e){let t=e.lastIndexOf(`.`);return t!==-1&&OEe.has(e.slice(t))}const AEe=new Set([`.jsonl`,`.json`,`.txt`,`.log`,`.lock`,`.yaml`,`.yml`,`.ips`]);function jEe(e){if(F9(e))return!0;let t=e.lastIndexOf(`.`);return t!==-1&&AEe.has(e.slice(t))}function MEe(e){let t=[];for(let n of Q9(e)){let r=$9(e,n);if(!jEe(r))continue;let{redacted:i,patterns:a,lineCount:o}=OB(x(n,`utf-8`));a.length!==0&&(te(n,i),t.push({file:r,lineCount:o,patterns:a}))}return{redactions:t,redactedLineCount:t.reduce((e,t)=>e+t.lineCount,0)}}function $9(e,t){return _e(e,t).split(ye).join(`/`)}async function NEe(e){let t=ve(e.contentDir),n=ve(e.projectDir??e.contentDir),r=e.deps??{},i=r.fetchAgentPresence??mEe,a=r.fetchAgentEffects??hEe,o=r.fetchWatcherRecent??gEe,s=r.readShadowHead??vEe,c=r.readCheckpointRefs??yEe,l=r.now??(()=>new Date),u=r.okVersion??(()=>`0.69.3`),d=r.readDesktopEnv??K9,f=r.readLanguage??O9,m=r.readRuntime??bEe,g=r.isOtlpPushEnabled??xEe,y=v(N(le(),`ok-bundle-`));try{_(N(y,`telemetry`),{recursive:!0}),_(N(y,`logs`),{recursive:!0}),_(N(y,`state`),{recursive:!0}),Z9(cEe(n),N(y,`telemetry`,z9)),Z9(lEe(n),N(y,`telemetry`,B9)),Z9(uEe(n),N(y,`logs`,V9)),Z9(dEe(n),N(y,`logs`,H9));for(let t of e.userLogFiles??[])Z9(t,N(y,`logs`,fe(t)));for(let t of e.userStateFiles??[])Z9(t,N(y,sR,fe(t)));let v=0;for(let t of e.diagnosticReports?.files??[])Z9(t,N(y,`diagnostic-reports`,fe(t)))&&(v+=1);let b=N(n,`.ok`,`local`),S=N(b,`server.lock`),C=`not-running`,w=`no server.lock`,T=null;if(h(S)){Z9(S,N(y,`state`,`server.lock`));try{let e=x(S,`utf-8`),t=JSON.parse(e);typeof t.port==`number`?T=t.port:w=`lock present but no port`}catch{w=`lock present but unparseable`}}if(T!==null){let e=await i(T);e===null?w=`agent-presence endpoint at :${T} unreachable`:(te(N(y,`state`,`agent-presence.json`),e),C=`running`,w=``);let t=await a(T);t!==null&&te(N(y,`state`,`agent-effects.json`),t);let n=await o(T);if(n!==null){let e=_Ee(n);e!==null&&te(N(y,`state`,`watcher-recent.jsonl`),e)}}let E=s(t);E!==null&&te(N(y,`state`,`shadow-head.txt`),E);let ee=c(t);ee!==null&&te(N(y,`state`,`checkpoint-refs.txt`),ee),Z9(fEe(n),N(y,`state`,U9)),Z9(pEe(n),N(y,`state`,W9)),Z9(N(b,`last-spawn-error.log`),N(y,`state`,`last-spawn-error.log`)),Z9(N(b,nu),N(y,`state`,nu)),Z9(N(b,ru),N(y,`state`,ru));let ne=m(),re=d(),ie=f(),ae={ok:{version:u(),nodeVersion:ne.nodeVersion,platform:ne.platform,arch:ne.arch},host:{desktop:re,language:ie}};te(N(y,`state`,`runtime.json`),`${JSON.stringify(ae,null,2)}\n`);let oe=C===`running`?`running
1531
1531
  `:`not-running (${w})\n`;te(N(y,`state`,`server-status.txt`),oe);let se=e.diagnosticReports===void 0?`not-collected (no collection attempted)`:i9(e.diagnosticReports,v);if(te(N(y,`state`,`diagnostic-reports-status.txt`),`${se}\n`),e.processDir&&h(e.processDir)){let t=N(y,`process`);_(t,{recursive:!0}),p(e.processDir,t,{recursive:!0})}let k=e.redact===!0;k&&sEe({stagingDir:y,contentDir:t}),e.note&&te(N(y,`note.txt`),e.note);let ce=null;e.scrubSecrets===!0&&(ce=MEe(y));for(let t of e.extraFiles??[])Z9(t.sourcePath,N(y,`extra`,t.zipName??fe(t.sourcePath)))||r.logger?.warn({sourcePath:t.sourcePath},`extra file missing; omitted from bundle`);let le=CEe(n),ue=Q9(y),A=[],j=0,de=0;for(let e of ue){let t=$9(y,e),n=O(e).size,r=kEe(t)?TEe(e):0;A.push({path:t,bytes:n,lines:r}),j+=n,(t.startsWith(`telemetry/`)||t.startsWith(`logs/`))&&(de+=DEe(e))}let pe={applied:k};ce!==null&&(pe.secretScrub=ce);let me={schemaVersion:2,createdAt:l().toISOString(),ok:{version:u(),nodeVersion:ne.nodeVersion,platform:ne.platform,arch:ne.arch},host:{desktop:re,language:ie},contentDir:{pathSha256:wEe(t),absolutePath:k?`<CONTENT_DIR>`:t},telemetry:{localSink:le,otlpPushEnabled:g()},redaction:pe,serverStatus:C,files:A};te(N(y,`manifest.json`),`${JSON.stringify(me,null,2)}\n`);let M=ue.some(e=>{try{return x(e,`utf-8`).includes(t)}catch{return!1}}),he={stagedDiagnosticReports:v,totalBytes:j,fileCount:A.length,docNameCount:de,contentDirVisible:M,redacted:k},ge=!1;return{stagingDir:y,manifest:me,summary:he,cleanup:()=>{ge||(ge=!0,D(y,{recursive:!0,force:!0}))}}}catch(e){throw D(y,{recursive:!0,force:!0}),e}}async function PEe(e){let{collected:t,outputPath:n}=e,r=pe(n);if(!h(r))throw Error(`ok diagnose bundle: parent directory does not exist: ${r}. Create it or pass --out with an existing parent.`);let i=new Pye.ZipFile,a=Q9(t.stagingDir);for(let e of a){let n=$9(t.stagingDir,e);i.addFile(e,n)}i.end();let o=m(n);return i.outputStream.pipe(o),await new Promise((e,t)=>{o.on(`close`,e),o.on(`error`,t),i.outputStream.on(`error`,t)}),n}function FEe(e,t){let n=N(e,`.ok`,`config.yml`);if(h(n))try{let t=(0,rn.parse)(x(n,`utf-8`)),r=D7(t)?t.content:void 0,i=D7(r)?r.dir:void 0;if(typeof i==`string`&&i.length>0)return ve(e,i)}catch(e){t?.warn({configPath:n,err:e},`bug-report: failed to read .ok/config.yml; falling back to project root as content dir`)}return ve(e)}async function IEe(e,t,n,r,i){let a=s9(t,e.logger),o=await NEe({contentDir:FEe(t,e.logger),projectDir:t,redact:e.redact,scrubSecrets:e.redact,note:e.note,extraFiles:e.extraFiles,userLogFiles:[...STe(a,e.userLogsDir??N(oe(),`.ok`,`logs`)),...l9(e.cachesDir??N(oe(),`Library`,`Caches`))],userStateFiles:u9(e.bugReportsDir??o9()),diagnosticReports:i,deps:{readDesktopEnv:n,readLanguage:r,logger:e.logger}});try{_(pe(e.outputPath),{recursive:!0}),await PEe({collected:o,outputPath:e.outputPath});let t=o.manifest.redaction.secretScrub;return{zipPath:e.outputPath,summary:{level:`full`,systemWide:!1,projectSlug:a,files:o.manifest.files.map(e=>e.path),redactions:t?.redactions??[],redactedLineCount:t?.redactedLineCount??0,generatedAt:o.manifest.createdAt}}}finally{o.cleanup()}}async function LEe(e){let{projectDir:t}=e,n=e.readDesktopEnv??K9,r=e.readLanguage??O9,i=()=>vTe(e.diagnosticReportsDir??N(oe(),`Library`,`Logs`,`DiagnosticReports`),new Date);if(e.level===`full`&&t!==void 0)return IEe(e,t,n,r,i());let{zipPath:a,summary:o}=await DTe({projectDir:t,redact:e.redact,revealDocNames:e.level===`full`,outputPath:e.outputPath,userLogsDir:e.userLogsDir,shipItLogFiles:l9(e.cachesDir??N(oe(),`Library`,`Caches`)),bugReportLedgerFiles:u9(e.bugReportsDir??o9()),diagnosticReports:e.level===`full`?i():void 0,logger:e.logger,note:e.note,extraFiles:e.extraFiles,desktop:n(),language:r()});return{zipPath:a,summary:{level:e.level,systemWide:t===void 0,projectSlug:o.projectSlug,files:o.files,redactions:o.redactions,redactedLineCount:o.redactedLineCount,generatedAt:o.generatedAt}}}export{j5 as ALL_EDITOR_IDS,M5 as EDITOR_LABELS,$5 as EDITOR_TARGETS,xCe as HOSTS_WITH_USER_SKILL_DIR,nTe as LAUNCH_CONFIG_NAME,qTe as PATH_SHIM_BEGIN,YTe as PATH_SHIM_BLOCK_RE,JTe as PATH_SHIM_END,Lwe as addOkPathsToGitExclude,y7 as assertProjectPathSafe,V5 as buildManagedServerEntry,LTe as buildMcpConfigDeclineEvent,RTe as buildMcpConfigMigrateEvent,n9 as classifyExistingMcpEntry,LEe as collectReportBundle,cn as createTokenStore,yTe as defaultBugReportZipPath,Be as detectGh,Ue as detectGhAccounts,sTe as detectInstalledEditors,FCe as editorConfigPathDisplay,PCe as editorEntryLocator,kTe as ensurePiBridge,I7 as formatTrackedRemediation,Bwe as getExcludedOkPaths,P7 as getInstalledSkillProjectionPaths,Iwe as getNativeTomlMcpEditor,N7 as getOkArtifactPaths,z5 as isEntryUpToDate,H5 as isOwnManagedEntry,WTe as loadConfig,un as makeLazyProbeTokenStore,o9 as okBugReportsDir,w9 as parseGitHubBlobUrl,GTe as parseGitHubShareUrl,T9 as parseGitHubTreeUrl,C9 as parseGitUrl,XTe as pathInstallMarkerPath,hwe as previewContent,lTe as probeOwnManagedEditorMcpEntry,OTe as probePiBridgeState,F7 as probeTrackedOkPaths,e9 as readExistingMcpEntry,zwe as readSharingMode,OB as redactContent,Rwe as removeOkPathsFromGitExclude,NTe as removeOwnMcpEntry,Twe as removeProjectSkill,QTe as removeUserGlobalSkillBundle,xwe as resolveProjectRoot,VTe as runStop,y9 as truncatePriorEntry,D9 as userGlobalSkillBundleTargets,KTe as validateLocalFolderForShare,$7 as writeEditorMcpConfig,tEe as writeProjectAiIntegrations,S7 as writeProjectSkill,oTe as writeUserMcpConfigs};
1532
1532
  //# sourceMappingURL=index.mjs.map