@inkeep/open-knowledge 0.59.0-beta.26 → 0.59.0-beta.27
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.
- package/dist/{acp-harness-probe-DYbo4bT-.mjs → acp-harness-probe-CHDRVQpq.mjs} +2 -2
- package/dist/cli.mjs +11 -11
- package/dist/config-schema.json +2 -36
- package/dist/config.project.schema.json +2 -36
- package/dist/constants-DSNC3wSl.mjs +2 -0
- package/dist/{fs-traced-6G_aFzgy.mjs → fs-traced-1KTQL4h-.mjs} +6 -6
- package/dist/fs-traced-Dak_kryQ.mjs +1 -0
- package/dist/git-handle-DmslHvlR.mjs +1 -0
- package/dist/{git-handle-BamU1o3R.mjs → git-handle-v3HRk0k0.mjs} +2 -2
- package/dist/index.d.mts +0 -5
- package/dist/index.mjs +144 -144
- package/dist/init-CcwKgR9R.mjs +1 -0
- package/dist/{init-B14cFSch.mjs → init-zTOfz-Hi.mjs} +3 -3
- package/dist/{launch-json-removal-D9Dn9ans.mjs → launch-json-removal-CK23LZq3.mjs} +2 -2
- package/dist/loader-Bbx1ChcV.mjs +1 -0
- package/dist/{loader-DlLkJi3f.mjs → loader-ChVnFNzU.mjs} +2 -2
- package/dist/md-manager-7voOTrzM.mjs +2 -0
- package/dist/{open-browser-CD86-cP6.mjs → open-browser-DD5VHxHl.mjs} +2 -2
- package/dist/parse-worker.mjs +1 -1
- package/dist/{preview-Dr5MviTF.mjs → preview-CIkhwrjV.mjs} +2 -2
- package/dist/preview-DcSm8SQu.mjs +1 -0
- package/dist/public/assets/{ActivityModeContent-BH3nUmKi.js → ActivityModeContent-DJkcYUFG.js} +1 -1
- package/dist/public/assets/{AgentDiffPane-ulYiZICp.js → AgentDiffPane-QpnE2RxP.js} +1 -1
- package/dist/public/assets/{AgentThreadClientBinder-DyRJbgYV.js → AgentThreadClientBinder-BNxw9YWy.js} +1 -1
- package/dist/public/assets/{CodeMirrorPropInput-D5dluJAa.js → CodeMirrorPropInput-DlJxY2cd.js} +1 -1
- package/dist/public/assets/{DocumentContext-C0nL2SXC.js → DocumentContext-BI0smsxZ.js} +1 -1
- package/dist/public/assets/{EditorModeToggle-CPc75zv0.js → EditorModeToggle-DVfUE-Hx.js} +1 -1
- package/dist/public/assets/{EnableSyncConfirmDialog-_4B5kdmf.js → EnableSyncConfirmDialog-CH3AktRr.js} +1 -1
- package/dist/public/assets/{ExcalidrawDocEditor-C5fCyPDa.js → ExcalidrawDocEditor-HqU6SXrF.js} +1 -1
- package/dist/public/assets/FeedbackForm-DfjQFt_o.js +1 -0
- package/dist/public/assets/{GraphPanel-DjOi0m6N.js → GraphPanel-MtHSCEEc.js} +1 -1
- package/dist/public/assets/{ImportSkillDialog-CfhVYZbV.js → ImportSkillDialog-DqbRbXfG.js} +1 -1
- package/dist/public/assets/{LintConfigEditor-BJZcVBKl.js → LintConfigEditor-DQQlzcbN.js} +1 -1
- package/dist/public/assets/{ManagedArtifactProperties-COaU0QeT.js → ManagedArtifactProperties-CPsIQVz8.js} +1 -1
- package/dist/public/assets/ManagedArtifactProperties-DkmtIVIZ.js +1 -0
- package/dist/public/assets/{MermaidDocEditor-B6o0wQi9.js → MermaidDocEditor-UIF1Y7PM.js} +1 -1
- package/dist/public/assets/{PropertyDisplayRow-CRD3p4U5.js → PropertyDisplayRow-BPCVo30u.js} +1 -1
- package/dist/public/assets/{ReportBugDialogBody-DI4KGY6b.js → ReportBugDialogBody-BoQrLPkN.js} +1 -1
- package/dist/public/assets/{SchemaConfigEditor-DWv0rRAz.js → SchemaConfigEditor-D5aVltyV.js} +1 -1
- package/dist/public/assets/{SessionsHost-4Dzze9r3.js → SessionsHost-B0WtFo-7.js} +2 -2
- package/dist/public/assets/{SettingsDialogBody-DCoAb0Bd.js → SettingsDialogBody-Cbsyvnqh.js} +1 -1
- package/dist/public/assets/{ShareBranchSwitchDialog-DzKK9STn.js → ShareBranchSwitchDialog-DxracRWc.js} +1 -1
- package/dist/public/assets/{ShareReceiveDialog-DH2fH5Ep.js → ShareReceiveDialog-Cfp4wdzT.js} +1 -1
- package/dist/public/assets/{ShareReceiveMissDialog-DUdi0fBR.js → ShareReceiveMissDialog-DxcAaxnj.js} +1 -1
- package/dist/public/assets/{SkillCostValue-CcR1g_YK.js → SkillCostValue-CDg_lpMT.js} +1 -1
- package/dist/public/assets/{SkillEditBanner-Bygl2n7y.js → SkillEditBanner-BEG94SMV.js} +1 -1
- package/dist/public/assets/{SkillInstallMenu-BVG38yZJ.js → SkillInstallMenu-xkIcUjyz.js} +1 -1
- package/dist/public/assets/{SkillOriginInline-wsT9RocF.js → SkillOriginInline-WxvVrIDh.js} +1 -1
- package/dist/public/assets/{SkillToolbarControls-BpFI6ORp.js → SkillToolbarControls-BvIlOBgX.js} +1 -1
- package/dist/public/assets/{SlidesToolbarControls-Bli5Kfnf.js → SlidesToolbarControls-DMGLRgXN.js} +1 -1
- package/dist/public/assets/{SourceEditor-DinqAqAo.js → SourceEditor-BoCr54OC.js} +1 -1
- package/dist/public/assets/{TerminalPanel-ByZlnAVD.js → TerminalPanel-B136_x01.js} +1 -1
- package/dist/public/assets/{TerminalWindowApp-DQNGwwgH.js → TerminalWindowApp-C7xQ_h9C.js} +1 -1
- package/dist/public/assets/{TextDocEditor-CPa4xvfB.js → TextDocEditor-DZYfekpd.js} +1 -1
- package/dist/public/assets/{ThreadView-kSlERwEa.js → ThreadView-DenCwvfW.js} +1 -1
- package/dist/public/assets/{TimelineDiffPane-DXgcXY3B.js → TimelineDiffPane-XlGr0GTw.js} +1 -1
- package/dist/public/assets/{agent-diff-store-CK_MxQ13.js → agent-diff-store-BVPptGby.js} +1 -1
- package/dist/public/assets/{auth-state-cache-BIQOr5wy.js → auth-state-cache-DWZvELXg.js} +1 -1
- package/dist/public/assets/client-version-D2k9ZCWX.js +1 -0
- package/dist/public/assets/{comment-chips-DS7pK-yD.js → comment-chips-D_lOHAKs.js} +1 -1
- package/dist/public/assets/{config-provider-mFv1sqH4.js → config-provider-CDwrJPp7.js} +1 -1
- package/dist/public/assets/{dist-C1cuuJXO2.js → dist-Cjt7VASv2.js} +38 -38
- package/dist/public/assets/{doc-paths-Bc7iTgnL.js → doc-paths-B8neiW-a.js} +1 -1
- package/dist/public/assets/{documents-events-ChHRY_IT.js → documents-events-XYcpMExe.js} +1 -1
- package/dist/public/assets/{file-tree-adapter-Cn1x6E2_.js → file-tree-adapter-D09K46if.js} +1 -1
- package/dist/public/assets/{file-tree-utils-CE3Y3N48.js → file-tree-utils-D46TNM8I.js} +1 -1
- package/dist/public/assets/{folder-config-api-Drl7C-wY.js → folder-config-api-BF1s5fn5.js} +1 -1
- package/dist/public/assets/i18n-DyGGRo1x.js +1 -0
- package/dist/public/assets/{index-yY_6Xj9r.js → index-DVAzmNmM.js} +7 -7
- package/dist/public/assets/{lint-config-client-BeZysGOL.js → lint-config-client-CexP4XjM.js} +1 -1
- package/dist/public/assets/{markdownlint-rule-browser-B7QG3apY.js → markdownlint-rule-browser-RW_wnt3c.js} +1 -1
- package/dist/public/assets/{navigation-targets-dmO4e4Qm.js → navigation-targets-B81SRxAl.js} +1 -1
- package/dist/public/assets/{open-managed-artifact-tab-D99Uwfo7.js → open-managed-artifact-tab-ONxSWsRO.js} +1 -1
- package/dist/public/assets/{pending-receive-nav-store-DY9saaUe.js → pending-receive-nav-store-EbqHz-1O.js} +1 -1
- package/dist/public/assets/{progress-D6Zw3AMw.js → progress-BNa6s6eY.js} +1 -1
- package/dist/public/assets/{prop-types-CekqkyBi.js → prop-types-Bi69iPbr.js} +1 -1
- package/dist/public/assets/{receive-store-C4_wYBmA.js → receive-store-DvP10j_m.js} +1 -1
- package/dist/public/assets/{selection-context-CoupzfPD.js → selection-context-BT0IXs_k.js} +1 -1
- package/dist/public/assets/{skill-actions-D9yzisvl.js → skill-actions-C6XMzsRk.js} +1 -1
- package/dist/public/assets/{skill-scope-BNRIoNFW.js → skill-scope-D_Zsy3lJ.js} +1 -1
- package/dist/public/assets/{skills-api-BHNlkzLI.js → skills-api-BM2BLHCX.js} +1 -1
- package/dist/public/assets/{src-7eans9jB.js → src-DMrqP3nT.js} +1 -1
- package/dist/public/assets/{tag-pill-input-9XCv-eGc.js → tag-pill-input-BFaMBmJa.js} +1 -1
- package/dist/public/assets/{target-navigation-intent-BHn4lUYz.js → target-navigation-intent-CWvy9cE2.js} +1 -1
- package/dist/public/assets/{telemetry-impl-T0tYRMlO.js → telemetry-impl-CuZ-qtZC.js} +1 -1
- package/dist/public/assets/{telemetry-startup-cht6PIz2.js → telemetry-startup-CSHPwDgJ.js} +1 -1
- package/dist/public/assets/{terminal-cli-display-C9RSSYZZ.js → terminal-cli-display-BbYqTPWX.js} +1 -1
- package/dist/public/assets/{terminal-launch-events-CJ5--wwM.js → terminal-launch-events-BPjoquS2.js} +1 -1
- package/dist/public/assets/{terminal-telemetry-g2Rame0f.js → terminal-telemetry-DxMhdnxk.js} +1 -1
- package/dist/public/assets/{typing-burst-detector-HcBOgWZw.js → typing-burst-detector-B7DPFEEZ.js} +1 -1
- package/dist/public/assets/{uninstall-OtG696J2.js → uninstall-DDXNRWQJ.js} +1 -1
- package/dist/public/assets/{use-activity-panel-DA5KxLH2.js → use-activity-panel-CsxwP-4j.js} +1 -1
- package/dist/public/assets/{use-apply-config-color-theme-g3ghtVU3.js → use-apply-config-color-theme-cAcJ-HL5.js} +1 -1
- package/dist/public/assets/{use-collab-url-C0l9GQW6.js → use-collab-url-C79vcmVC.js} +1 -1
- package/dist/public/assets/{use-live-xterm-theme-CURX_Vkk.js → use-live-xterm-theme-D63CLflu.js} +1 -1
- package/dist/public/assets/{use-open-skill-qA__uomh.js → use-open-skill-BXh-h1Gy.js} +1 -1
- package/dist/public/assets/{use-popular-skills-CkOc4ZFI.js → use-popular-skills-Dzx69gvR.js} +1 -1
- package/dist/public/assets/{use-settings-route-BzQtFbVz.js → use-settings-route-DT_sDrP6.js} +1 -1
- package/dist/public/assets/{use-skill-origin-BM7aK7w5.js → use-skill-origin-djszP4BX.js} +1 -1
- package/dist/public/assets/{use-terminal-enabled-mj1HMZEE.js → use-terminal-enabled-D8pfw24f.js} +1 -1
- package/dist/public/assets/{use-timeline-entry-diff-eQroikMP.js → use-timeline-entry-diff-CJndzyXq.js} +1 -1
- package/dist/public/assets/{use-workspace-uQYd5g6N.js → use-workspace-DanpYgc9.js} +1 -1
- package/dist/public/index.html +45 -45
- package/dist/public/uninstall.html +3 -3
- package/dist/{repair-launch-json-BCz2SZyH.mjs → repair-launch-json-CSJT9xyg.mjs} +2 -2
- package/dist/{repair-mcp-configs-NcGaQH45.mjs → repair-mcp-configs-DHHaYqN1.mjs} +2 -2
- package/dist/{repair-skills-CGrC_7UB.mjs → repair-skills-DTu-V4yJ.mjs} +2 -2
- package/dist/repair-skills-DpzyUqvM.mjs +1 -0
- package/dist/{resolve-project-root--qXrA21F.mjs → resolve-project-root-CjlK19bg.mjs} +2 -2
- package/dist/schemas/v0/config.project.schema.json +2 -36
- package/dist/server-lock-BZd8WJ5h.mjs +1 -0
- package/dist/{server-lock-BbnnWHQ-.mjs → server-lock-D3OwE6nq.mjs} +2 -2
- package/dist/{skill-teardown-BOfnXWGl.mjs → skill-teardown-dynTQKdJ.mjs} +2 -2
- package/dist/{sleep-CEs13Om_.mjs → sleep-DXvB05wr.mjs} +5 -5
- package/dist/src-BgcwWUW8.mjs +1 -0
- package/dist/{src-D8oYpCos.mjs → src-D81I39eV.mjs} +3 -3
- package/dist/{src-CUzcBQEu.mjs → src-DC0dXNgq.mjs} +248 -248
- package/dist/{src-oOfi47J8.mjs → src-DRQtLkln.mjs} +1 -1
- package/dist/src-UoW_X1C6.mjs +357 -0
- package/dist/start-CZTOPPJD.mjs +1 -0
- package/dist/start-Cxm5f8Vn.mjs +4 -0
- package/package.json +4 -4
- package/dist/constants-BfbnQ1zg.mjs +0 -2
- package/dist/fs-traced-C9RP1mJ2.mjs +0 -1
- package/dist/git-handle-B8IJwypU.mjs +0 -1
- package/dist/init-CyJV_J-z.mjs +0 -1
- package/dist/loader-DZrXpupn.mjs +0 -1
- package/dist/md-manager-CE7LjnX6.mjs +0 -2
- package/dist/preview-8qVct0-k.mjs +0 -1
- package/dist/public/assets/FeedbackForm-D_sc5CWU.js +0 -1
- package/dist/public/assets/ManagedArtifactProperties-DqkbIYRf.js +0 -1
- package/dist/public/assets/client-version-B8t572qZ.js +0 -1
- package/dist/public/assets/i18n-BphO6l4i.js +0 -1
- package/dist/repair-skills-Bxm3hryZ.mjs +0 -1
- package/dist/server-lock-DAYx4_kR.mjs +0 -1
- package/dist/src-RQsLXRLR.mjs +0 -1
- package/dist/src-_JbAf6nM.mjs +0 -357
- package/dist/start-AtCGtYSd.mjs +0 -1
- package/dist/start-BGvZNtV7.mjs +0 -8
package/dist/cli.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{o as e}from"./chunk-DTipWd-i.mjs";import{At as t,
|
|
2
|
+
import{o as e}from"./chunk-DTipWd-i.mjs";import{At as t,E as n,Ft as r,Ht as i,M as a,Ot as o,Rt as s,St as c,T as l,a as u,bt as d,c as f,ft as p,gt as m,jt as h,kt as g,p as _,tn as v,xt as y}from"./sleep-DXvB05wr.mjs";import{Aa as b,Bo as x,Bt as S,Cs as C,Ho as ee,Is as te,J as ne,Ko as re,Ms as ie,Os as ae,Tc as oe,Vo as se,Vt as ce,Ys as le,_s as ue,ca as de,fs as fe,is as pe,js as me,k as he,ka as ge,mc as _e,pt as ve,qa as ye,rs as be,sa as xe,st as Se,ys as Ce,zs as we}from"./src-UoW_X1C6.mjs";import{$ as Te,Ci as w,Cn as Ee,Da as De,Ea as Oe,F as ke,Fn as Ae,Ft as je,Ht as Me,I as Ne,It as Pe,J as Fe,L as Ie,Lt as Le,Mi as Re,Mr as ze,Oa as Be,P as Ve,Pn as He,Pr as Ue,Pt as We,Q as Ge,Si as Ke,Ta as qe,Vt as Je,Wr as Ye,X as Xe,Yt as Ze,Z as Qe,_ as $e,_n as et,_t as tt,a as nt,at as rt,bn as it,ci as at,dt as ot,ei as T,f as st,fi as ct,ft as lt,ht as ut,ii as dt,in as ft,ir as pt,ji as mt,jr as ht,kr as gt,lt as _t,mt as vt,n as yt,nn as bt,ot as xt,p as St,pi as Ct,pt as wt,r as Tt,rt as Et,si as Dt,st as Ot,t as kt,tn as At,ut as jt,w as Mt,wi as Nt,xi as Pt}from"./src-DC0dXNgq.mjs";import{A as Ft,F as It,I as Lt,k as Rt}from"./fs-traced-1KTQL4h-.mjs";import{s as zt}from"./git-handle-v3HRk0k0.mjs";import{S as Bt,a as Vt,b as E,d as Ht,r as Ut}from"./server-lock-D3OwE6nq.mjs";import{_ as Wt,a as Gt,b as D,r as Kt,s as qt,v as Jt}from"./resolve-project-root-CjlK19bg.mjs";import{b as Yt,c as Xt,d as Zt,f as Qt,g as $t,h as en,i as tn,l as nn,m as rn,n as an,o as on,p as sn,r as cn,t as ln,u as un,v as dn,y as fn}from"./src-D81I39eV.mjs";import{c as pn,i as O,n as k,o as A,r as j,s as M,t as N}from"./colors-DSyAT9Cz.mjs";import{a as mn,c as hn,d as gn,i as _n,l as vn,p as yn,r as bn,s as xn,u as Sn}from"./acp-harness-probe-CHDRVQpq.mjs";import{n as Cn,r as wn,t as Tn}from"./dist-bundle-EXrl9_Zm.mjs";import{A as En,B as Dn,C as On,D as kn,F as An,I as jn,L as Mn,M as Nn,N as Pn,P as Fn,R as In,S as Ln,V as Rn,j as zn,k as Bn,u as Vn,w as Hn,z as Un}from"./init-zTOfz-Hi.mjs";import{n as Wn,t as Gn}from"./constants-DSNC3wSl.mjs";import{n as Kn,t as qn}from"./loader-ChVnFNzU.mjs";import{g as Jn,y as Yn}from"./start-Cxm5f8Vn.mjs";import{i as Xn}from"./skill-teardown-dynTQKdJ.mjs";import{t as Zn}from"./launch-json-removal-CK23LZq3.mjs";import{n as Qn}from"./repair-skills-DTu-V4yJ.mjs";import{execFile as $n,execFileSync as er,execSync as tr,spawn as nr,spawnSync as rr}from"node:child_process";import{basename as ir,dirname as P,isAbsolute as ar,join as F,posix as or,relative as I,resolve as L,sep as sr}from"node:path";import cr from"node:process";import{fileURLToPath as lr}from"node:url";import{accessSync as ur,appendFileSync as dr,closeSync as fr,constants as pr,existsSync as R,lstatSync as mr,mkdirSync as z,mkdtempSync as hr,openSync as gr,readFileSync as B,readdirSync as _r,realpathSync as vr,renameSync as yr,rmSync as br,statSync as V,unlinkSync as H,writeFileSync as xr}from"node:fs";import{homedir as Sr,platform as Cr,tmpdir as wr}from"node:os";import{rm as Tr}from"node:fs/promises";import{randomUUID as Er}from"node:crypto";import{setTimeout as Dr}from"node:timers/promises";import{promisify as Or}from"node:util";import{createInterface as kr}from"node:readline/promises";const Ar={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 jr;(function(e){})(jr||={});function Mr(e){return i(m,e)}async function Nr(e){let{projectDir:t,contentDir:n,baseConfig:r,targetPath:i,fix:a=!1}=e,o=[],s=Ye({projectDir:t,contentDir:n}),c=new Set,l=e=>{c.has(e)||(c.add(e),o.push(e))},u=ze(t,r,l),d=new Map,f=e=>{let t=P(e),r=d.get(t);if(r)return r;let i=ht(u,Ue(n,e,l));return d.set(t,i),i},p=[],m=Pr(i,n);m.kind===`file`?p.push(I(n,m.path)):h(m.path);function h(e){let t;try{t=_r(e,{withFileTypes:!0})}catch(t){o.push(`could not read directory ${I(n,e)||`.`}: ${Ir(t)}`);return}for(let r of t){if(r.name.startsWith(`.`))continue;let t=F(e,r.name),i=I(n,t);if(r.isDirectory()){if(s.isDirExcluded(i))continue;h(t)}else if(r.isFile()){if(!Fr(r.name)||s.isExcluded(i))continue;p.push(i)}}}p.sort();let g=[],_=0,v=0,y=0;for(let e of p){let t=F(n,e),r;try{r=B(t,`utf-8`)}catch(t){o.push(`could not read ${e}: ${Ir(t)}`);continue}let i=f(e),s=!1;if(a&&i.enabled){let n=xe(r,i);if(n!==r){let i=`${t}.tmp.${process.pid}.${Date.now()}`;try{xr(i,n,`utf-8`),yr(i,t),r=n,s=!0,y++}catch(t){try{H(i)}catch{}o.push(`could not write fix to ${e}: ${Ir(t)}`)}}}let c=await de(r,i,e);for(let e of c)e.severity===`error`?_++:v++;g.push({file:e,diagnostics:c,fixed:s})}return{contentDir:n,files:g,warnings:o,fileCount:p.length,errorCount:_,warningCount:v,fixedCount:y}}function Pr(e,t){if(e===void 0||e===``)return{kind:`dir`,path:t};let n=ar(e)?e:L(t,e);try{if(V(n).isFile())return{kind:`file`,path:n}}catch{}return{kind:`dir`,path:n}}function Fr(e){let t=e.toLowerCase();return we.some(e=>t.endsWith(e))}function Ir(e){return e instanceof Error?e.message:String(e)}function Lr(e){return new D(`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(),a=Ke(r,i),o=t===void 0?void 0:Rr(t,dn()),s=r.contentRules,c=await Nr({projectDir:i,contentDir:a,baseConfig:s?b(s):ye,targetPath:o,fix:n.fix===!0});n.json===!0?process.stdout.write(`${JSON.stringify(c,null,2)}\n`):process.stdout.write(`${Vr(c)}\n`),(n.errorsOnly===!0?c.errorCount>0:zr(c))&&(process.exitCode=1)})}function Rr(e,t){return L(t,e)}function zr(e){return e.errorCount>0||e.warningCount>0}function Br(e){let t=[N(e.file)+(e.fixed?k(` (fixed)`):``)];for(let n of e.diagnostics){let e=k(`${n.range.start.line+1}:${n.range.start.character+1}`.padEnd(7)),r=n.severity===`error`?j(`error `):M(`warning`);t.push(` ${e} ${r} ${n.message} ${k(`${n.source}/${n.code}`)}`)}return t.push(``),t}function Vr(e){let t=[];for(let n of e.files)n.diagnostics.length>0&&t.push(...Br(n));for(let n of e.warnings)t.push(M(`! ${n}`));e.warnings.length>0&&t.push(``);let n=e.errorCount+e.warningCount;if(n===0)t.push(A(`✓ 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(`${j(r[0]??``)} (${r[1]}, ${r[2]}) across ${e.fileCount} file${e.fileCount===1?``:`s`}.`)}return e.fixedCount>0&&t.push(k(`Fixed ${e.fixedCount} file${e.fixedCount===1?``:`s`}.`)),t.join(`
|
|
3
3
|
`)}const Hr={out:e=>process.stdout.write(`${e}\n`),err:e=>process.stderr.write(`${e}\n`)};function Ur(e){return new D(`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 Wr(t,n,e(),process.cwd(),dn());r!==0&&(process.exitCode=r)})}async function Wr(e,t,n,r,i,a=Hr){let o=Ke(n,r),s;if(e!==void 0){let t=Gr(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=Vt(w(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)}`,u;try{u=await fetch(`http://127.0.0.1:${c.port}/api/audit${l}`,{headers:oe({kind:`cli`,runtimeVersion:E})})}catch(e){return a.err(`Could not reach the OpenKnowledge server on port ${c.port}: ${String(e)}`),1}if(!u.ok){let e=await u.json().catch(()=>({}));return a.err(`Audit failed: ${e.title??e.error??e.message??`server responded with ${u.status}`}`),1}let d=ge.safeParse(await u.json().catch(()=>null));if(!d.success){let e=d.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 f=d.data;return t.json===!0?a.out(JSON.stringify(f,null,2)):a.out(Vr(Kr(f))),+(t.errorsOnly===!0?f.errorCount>0:f.errorCount+f.warningCount>0)}function Gr(e,t,n){let r=I(n,L(t,e));return r===``?``:r.startsWith(`..`)||ar(r)?null:r.split(sr).join(`/`)}function Kr(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}}async function qr(e,t,n,r){let i=Jr(await Yr(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},`[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 Jr(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 Yr(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 Xr(e,t){let n=new D(`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 qr(process.stdin,process.stdout,r,{log:n,getDiag:()=>t});await St(n),process.exit(i)}catch(e){n?.error({err:e},`[auth] git-credential get: unexpected error`),await St(n),process.exit(1)}}),n}function Zr(e){let t=e.endpoint.DEFAULTS;return/^https:\/\/(api\.)?github\.com$/.test(t.baseUrl)?`https://github.com`:t.baseUrl.replace(`/api/v3`,``)}async function Qr(e,t,n){let r={baseUrl:Zr(e),headers:{accept:`application/json`},...n},i=await e(t,r);if(`error`in i.data){let n=new Cn(`${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 $r(e){let t=e.request||Tn,n={client_id:e.clientId};return`scopes`in e&&Array.isArray(e.scopes)&&(n.scope=e.scopes.join(` `)),Qr(t,`POST /login/device/code`,n)}async function ei(e){let t=await Qr(e.request||Tn,`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=ti(e,t.data.expires_in),n.refreshTokenExpiresAt=ti(e,t.data.refresh_token_expires_in)}delete n.scopes}return{...t,authentication:n}}function ti(e,t){return new Date(e+t*1e3).toISOString()}async function ni(e,t){let n=ri(e,t.auth);if(n)return n;let{data:r}=await $r({clientType:e.clientType,clientId:e.clientId,request:t.request||e.request,scopes:t.auth.scopes||e.scopes});await e.onVerification(r);let i=await ai(t.request||e.request,e.clientId,e.clientType,r);return e.authentication=i,i}function ri(e,t){if(t.refresh===!0||!e.authentication)return!1;if(e.clientType===`github-app`)return e.authentication;let n=e.authentication;return(`scopes`in t&&t.scopes||e.scopes).join(` `)===n.scopes.join(` `)?n:!1}async function ii(e){await new Promise(t=>setTimeout(t,e*1e3))}async function ai(e,t,n,r){try{let i={clientId:t,request:e,code:r.device_code},{authentication:a}=n===`oauth-app`?await ei({...i,clientType:`oauth-app`}):await ei({...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 ii(r.interval),ai(e,t,n,r);if(a===`slow_down`)return await ii(r.interval+7),ai(e,t,n,r);throw i}}async function oi(e,t){return ni(e,{auth:t})}async function si(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 ni(e,{request:t,auth:{type:`oauth`}});return i.headers.authorization=`token ${a}`,t(i)}var ci=`0.0.0-development`;function li(e){let t=e.request||Tn.defaults({headers:{"user-agent":`octokit-auth-oauth-device.js/${ci} ${wn()}`}}),{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(oi.bind(null,i),{hook:si.bind(null,i)})}async function ui(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=li({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-CtDa6mtZ.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 di(){return process.env.OPEN_KNOWLEDGE_GITHUB_CLIENT_ID??`Ov23liqlSd0V1MwR6rhI`}function U(e){let t=e.toLowerCase().replace(/:\d+$/,``);C.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 fi(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function pi(e,t,n=ui){let r=di(),{host:i,json:a}=e;U(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?fi(!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?fi(!0,{type:`complete`,host:i,login:s}):process.stderr.write(`✓ Logged in as ${s} on ${i}\n`)}function mi(e){return new D(`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??gt(process.cwd()),r=await e();await pi({...t,host:n},r)})}const hi={style:{maskedText:`[input is masked]`}};var gi=An((e,t)=>{let{validate:n=()=>!0}=e,r=Un(hi,e.theme),[i,a]=Dn(`idle`),[o,s]=Dn(),[c,l]=Dn(``),u=In({status:i,theme:r});Mn(async(e,r)=>{if(i===`idle`)if(Rn(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)}${jn}`),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 _i(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)=>_i.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 vi(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 yi(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 bi=Function.bind,xi=bi.bind(bi);function Si(e,t,n){let r=xi(yi,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]=xi(vi,null).apply(null,i)})}function Ci(){let e=Symbol(`Singular`),t={registry:{}},n=_i.bind(null,t,e);return Si(n,t,e),n}function wi(){let e={registry:{}},t=_i.bind(null,e);return Si(t,e),t}var Ti={Singular:Ci,Collection:wi},Ei=`0.0.0-development`;function Di(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"./chunk-DTipWd-i.mjs";import{At as t,Ct as n,E as r,It as i,M
|
|
|
8
8
|
`),n.includes(`file`)&&process.stderr.write(` cleared from ~/.ok/auth.yml
|
|
9
9
|
`)}function xa(){return new D(`signout`).description(`Remove stored credentials`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname (default: workspace origin host)`).action(async e=>{let t=e.host??gt(process.cwd());await ba({...e,host:t})})}async function Sa(e,t,n=vn){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 Ca(e,t,n){return{type:`status`,host:e,backend:t,...n}}async function wa(e,t){let{host:n,json:r}=e;U(n);let i=t.backend,a=await Sa(n,t);a.tier===`none`&&(r?process.stdout.write(`${JSON.stringify(Ca(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 ua({auth:a.token,...o?{baseUrl:o}:{}});try{let{data:e}=await s.users.getAuthenticated();r?process.stdout.write(`${JSON.stringify(Ca(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=pa(e,n);r?process.stdout.write(`${JSON.stringify(Ca(n,i,{authenticated:!1,error:t.message}))}\n`):process.stderr.write(`✗ ${t.message}\n`),process.exit(1)}}function Ta(e){return new D(`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??gt(process.cwd());await wa({...t,host:n},await e())})}function Ea(e){let t=new D(`auth`);t.description(`GitHub authentication management`);let n=e=>gn(void 0,e);return t.addCommand(mi(n)),t.addCommand(Ta(n)),t.addCommand(ya(n)),t.addCommand(xa()),t.addCommand(ga(n)),t.addCommand(Xr(n,e)),t}function Da(e,t=Cr(),n=xn){try{t===`darwin`?n(`/usr/bin/open`,[`-R`,e]):n(t===`win32`?`explorer.exe`:`xdg-open`,[P(e)])}catch{}}function Oa(){return new D(`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 sn({level:`standard`,projectDir:process.cwd(),redact:!0,outputPath:$t(),logger:Ff()});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&&Da(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 ka(e,t){let n=[];for(let[r,i]of[[`server`,e],[`ui`,t]])(i.status===`dead-pid`||i.status===`corrupt`)&&n.push({name:r,lockPath:i.lockPath,reason:i.status});return{prune:n}}function Aa(e){let t=e.inspect??(t=>t===`ui`?Zt(e.lockDir):Qt(e.lockDir,t)),n=e.unlink??(e=>H(e)),r=e.log??(e=>console.log(e)),i=e.error??(e=>console.error(e)),a=ka(t(`server`),t(`ui`));if(a.prune.length===0)return r(`No stale locks.`),{pruned:[],failed:[]};let o=[],s=[];for(let e of a.prune)try{n(e.lockPath),o.push(e)}catch(t){s.push({target:e,error:t instanceof Error?t.message:String(t)})}if(o.length>0){let e=o.map(e=>`${e.name} (${e.reason})`).join(`, `);r(`Pruned ${o.length} stale lock${o.length===1?``:`s`}: ${e}`)}return s.length>0&&i(`Failed to prune: ${s.map(({target:e,error:t})=>`${e.name} (${e.lockPath}): ${t}`).join(`; `)}`),{pruned:o,failed:s}}function ja(e){return new D(`clean`).description(`Prune stale / corrupt open-knowledge lock files (never touches live locks)`).action(()=>{e(),Aa({lockDir:w(process.cwd())}).failed.length>0&&(process.exitCode=1)})}function Ma(e){return`credential.helper=!${e.map(re).join(` `)} auth git-credential`}async function Na(e,t,n={},r=vn){let i=[`credential.helper=`,Ma(n.selfCliArgs??[`open-knowledge`])];if(!n.skipGhDetect){let t=r(e);if(t.available&&t.token)return{tier:`A`,gitConfig:i,relayToken:{token:t.token,host:e}}}let a=await t.get(e);return a==null?{tier:`none`,gitConfig:[]}:{tier:a.gitProtocol===`ssh`?`C`:`B`,gitConfig:i}}async function Pa(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 Fa=[[`count`,0,10],[`compress`,10,20],[`receiv`,20,60],[`resolv`,60,100]];function Ia(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 Fa)if(n.includes(e))return{stage:t[1],pct:Math.round(i+r/100*(a-i))};return null}function G(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}function La(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 Ra(e,t=process.env){let n=La(t);return e.relayToken?(n.OK_GH_TOKEN=e.relayToken.token,n.OK_GH_TOKEN_HOST=e.relayToken.host):(delete n.OK_GH_TOKEN,delete n.OK_GH_TOKEN_HOST),n}function za(e=process.argv,t=process.execPath){let n=e[1];return n?[t,n]:[t]}function Ba(e){return typeof e!=`string`||e.length===0?[`--progress`]:[`--progress`,`-b`,e]}const Va=se;async function Ha(e){try{return await e.clone(Ba(e.branch)),{fellBack:!1}}catch(t){if(e.branch!==null&&Va(t))return e.onFallback(e.branch),await e.clone(Ba(null)),{fellBack:!0};throw t}}function Ua(e,t){return{baseDir:e,config:t,unsafe:{allowUnsafeCredentialHelper:!0,allowUnsafePager:!0,allowUnsafeSshCommand:!0,allowUnsafeAskPass:!0,allowUnsafeEditor:!0}}}function Wa(e,t,n){return e===`https`&&t===`github.com`&&n}function Ga(e,t){let n=`${t.owner}/${t.name}`;return e===n||e===`${n}.git`?`https://${t.hostname}/${n}`:e}async function Ka(e,t,n,r=process.cwd()){let i=un(e);if(!i)throw Error(`Invalid git URL: ${e}`);let a=Ga(e,i),o=t.dir?L(r,t.dir):L(r,i.name);if(R(o)&&_r(o).length>0)throw Error(`Target directory is not empty: ${o}`);ft();let s=yn(),c=i.protocol===`https`&&i.hostname===`github.com`?await Pa(i.owner,i.name):!1,l=Wa(i.protocol,i.hostname,c)?{tier:`none`,gitConfig:[]}:await Na(i.hostname,s,{selfCliArgs:za()}),u=Ra(l),d=zt(Ua(r,l.gitConfig)).env(u),f=-1;d.outputHandler((e,n,r)=>{r.on(`data`,e=>{let n=e.toString(`utf-8`);for(let e of n.split(`
|
|
10
10
|
`)){let n=Ia(e);n&&n.pct!==f&&(f=n.pct,G(t.json,{type:`progress`,pct:n.pct,stage:n.stage}),t.json||process.stderr.write(`\r Cloning ${n.pct}%`))}})}),await Ha({branch:typeof t.branch==`string`&&t.branch.length>0?t.branch:null,clone:e=>d.clone(a,o,e),onFallback:e=>{G(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-
|
|
11
|
+
`);try{let{runInit:e}=await import(`./init-CcwKgR9R.mjs`),n=await e({cwd:o,mcp:!1});if(n.contentUpdated.length>0){let e=`auto-init: updated ${n.contentUpdated.join(`, `)}`;t.json?G(!0,{type:`warning`,message:e}):process.stderr.write(` ${e}\n`)}}catch(e){let n=e instanceof Error?e.message:String(e);t.json?G(!0,{type:`warning`,message:`auto-init: ${n}`}):process.stderr.write(` auto-init: ${n}\n`)}try{qa(o)}catch(e){let n=e instanceof Error?e.message:String(e);t.json?G(!0,{type:`warning`,message:`git-exclude: ${n}`}):process.stderr.write(` git-exclude: ${n}\n`)}return o}function qa(e){let t=kn(e,[`.ok/`]);return t.kind===`no-exclude`?`no-exclude`:t.kind===`refused-tracked`?`already-present`:t.appended.length>0?`appended`:`already-present`}const Ja=/^[A-Za-z0-9._/:@-]+$/;function Ya(e){return Ja.test(e)?e:re(e)}function Xa(e,t){let n=typeof t==`string`&&t.length>0?` -b ${Ya(t)}`:``;return`ok clone ${Ya(e)}${n}`}function Za(e){let t=x(e.error);if(t.kind!==`auth`)return null;if(ee(t)){let t=Xa(e.url,e.branch);return[`✗ Couldn't clone ${e.url} — authentication is required.`,``,` To fix:`,` 1. Run: ok auth login`,` 2. Then re-run: ${t}`].join(`
|
|
12
12
|
`)}if(t.subclass===`403`){let t=typeof e.principal==`string`&&e.principal.length>0?` (signed in as @${e.principal} — may lack access)`:``;return`✗ Access denied when cloning ${e.url}${t}. Check that your account has access to the repository.`}return t.subclass===`ssh-auth`?`✗ Couldn't clone ${e.url} 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.`:["✗ 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: ${Xa(e.url,e.branch)}`].join(`
|
|
13
|
-
`)}function Qa(e){let t=e.error instanceof Error?e.error.message:String(e.error);if(e.json){e.emit({type:`error`,message:t});return}let n=Za({error:e.error,url:e.url,branch:e.branch,principal:e.principal});e.printStderr(`${n??`✗ ${t}`}\n`)}async function $a(e,t){let n=(await e.get(t))?.login;return n&&n!==`unknown`?n:null}async function eo(e){let t=x(e.error),n=null;if(!e.json&&t.kind===`auth`&&t.subclass===`403`){let t=un(e.url);t&&(n=await(e.resolvePrincipal??(e=>$a(yn(),e)))(t.hostname))}Qa({error:e.error,url:e.url,branch:e.branch,json:e.json,principal:n,emit:e.emit,printStderr:e.printStderr})}function to(e){return new D(`clone`).description(`Clone a git repository and open it`).argument(`<url>`,`Repository URL or owner/repo shorthand`).argument(`[dir]`,`Target directory (default: ./<repo-name>)`).option(`--json`,`Output JSONL progress events`,!1).option(`-b, --branch <branch>`,`Branch to check out (falls back to default if missing)`).action(async(t,n,r)=>{let i=e();try{let a=await Ka(t,{json:r.json,dir:n,branch:r.branch??null},i);if(r.json)G(!0,{type:`complete`,dir:a});else{process.stderr.write(`✓ Cloned to ${a}\n`),process.chdir(a);let{startCommand:t}=await import(`./start-
|
|
13
|
+
`)}function Qa(e){let t=e.error instanceof Error?e.error.message:String(e.error);if(e.json){e.emit({type:`error`,message:t});return}let n=Za({error:e.error,url:e.url,branch:e.branch,principal:e.principal});e.printStderr(`${n??`✗ ${t}`}\n`)}async function $a(e,t){let n=(await e.get(t))?.login;return n&&n!==`unknown`?n:null}async function eo(e){let t=x(e.error),n=null;if(!e.json&&t.kind===`auth`&&t.subclass===`403`){let t=un(e.url);t&&(n=await(e.resolvePrincipal??(e=>$a(yn(),e)))(t.hostname))}Qa({error:e.error,url:e.url,branch:e.branch,json:e.json,principal:n,emit:e.emit,printStderr:e.printStderr})}function to(e){return new D(`clone`).description(`Clone a git repository and open it`).argument(`<url>`,`Repository URL or owner/repo shorthand`).argument(`[dir]`,`Target directory (default: ./<repo-name>)`).option(`--json`,`Output JSONL progress events`,!1).option(`-b, --branch <branch>`,`Branch to check out (falls back to default if missing)`).action(async(t,n,r)=>{let i=e();try{let a=await Ka(t,{json:r.json,dir:n,branch:r.branch??null},i);if(r.json)G(!0,{type:`complete`,dir:a});else{process.stderr.write(`✓ Cloned to ${a}\n`),process.chdir(a);let{startCommand:t}=await import(`./start-CZTOPPJD.mjs`);await t(e).parseAsync([],{from:`user`})}}catch(e){if(e instanceof At||e instanceof bt){r.json?G(!0,{type:`error`,message:e.message}):process.stderr.write(`${e.message}\n`),process.exitCode=78;return}await eo({error:e,url:t,branch:r.branch??null,json:r.json,emit:e=>G(!0,e),printStderr:e=>process.stderr.write(e)}),process.exitCode=1}})}var no=p();const ro=[[`sync`],[`persistence`,`debounceMs`],[`persistence`,`maxDebounceMs`],...f.map(e=>e.path)];function io(e){return Lt({absPath:Rt(`project-local`,e),sideline:!1}).diagnostics}function ao(e={}){let t=e.log??(e=>console.error(e)),n=e.error??(e=>console.error(e)),r=e.loadConfigFn??Kn;try{let{sources:n,diagnostics:i,sidelined:a}=r(e.cwd),o=(e.readProjectLocalFn??io)(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));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 oo(e){let t=(0,no.parseDocument)(B(e,`utf-8`));if(t.errors.length>0)throw Error(`Could not parse ${e}: ${t.errors.map(e=>e.message).join(`; `)}`);let n=[];for(let e of ro)t.hasIn(e)&&n.push(e.join(`.`));return n}function so(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function co(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=so(i)?i:{};e[r]=a,e=a}e[n[n.length-1]]=null}return t}function lo(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 uo(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??Ft,s=lo(r).map(t=>({scope:t,absPath:Rt(t,a,e.homedirOverride)})),c=[],l=!0;for(let{scope:t,absPath:n}of s){if(!R(n)){c.push({path:n,scope:t,found:[],removed:[]});continue}let r;try{r=oo(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:co(ro.filter(e=>r.includes(e.join(`.`)))),homedirOverride:e.homedirOverride});if(!s.ok){c.push({path:n,scope:t,found:r,removed:[],error:_(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 fo=`project | project-local | user | all`,po=new Set(Object.keys({project:!0,"project-local":!0,user:!0,both:!0,all:!0}));function mo(e){return e!==`config`}function ho(){let e=new D(`config`).description(`Inspect and maintain OpenKnowledge configuration files`);return e.command(`validate`).description(`Validate the merged config (defaults → user → project)`).action(()=>{ao({}).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: ${fo}`,`all`).option(`--dry-run`,`Preview without writing`,!1).action(async e=>{let t=String(e.scope);if(!po.has(t)){console.error(`Invalid --scope: ${t}. Expected: ${fo}`),process.exitCode=2;return}(await uo({scope:t,dryRun:e.dryRun})).ok||(process.exitCode=1)}),e}const go=[` 1. ${N(`Customize`)} (sidebar) → ${N(`Skills`)}`,` 2. Click the ${N(`+`)} button`,` 3. Click ${N(`Create skill`)}`,` 4. Click ${N(`Upload skill`)}`,` 5. Pick ${N(`openknowledge.skill`)} from Downloads`],_o=O(` Open the Claude Desktop App, then: ${N(`Customize → Skills → + → Create skill → Upload skill`)} → pick the file.`);function vo(e){let t=[A(`Built ${e.outputPath}`),k(` ${e.size} bytes • sha256 ${e.sha256?.slice(0,12)}…`)];return e.handoffError&&t.push(M(` Handoff failed: ${e.handoffError.message}`)),t.push(_o),t.join(`
|
|
14
14
|
`)}function yo(e){let t=e.skillVersion??`unknown`,n=e.recordedAt??`unknown`;return[O(`OpenKnowledge skill ${N(`v${t}`)} already delivered to Claude Desktop.`),k(` Recorded at ${n} in ~/.ok/skill-state.yml`),k(` Use ${N(`--force`)} to rebuild and re-open the install dialog.`)].join(`
|
|
15
15
|
`)}function bo(e){let t=e.skillVersion?` • Skill v${e.skillVersion}`:``;return[A(`Built ${e.outputPath}`),k(` ${e.size} bytes • sha256 ${e.sha256?.slice(0,12)}…${t}`),O(` Claude Desktop App opened. Now upload the file manually:`),...go,k(` If Claude Desktop didn't open, open it and start at step 1. The file is at ${e.outputPath}`)].join(`
|
|
16
16
|
`)}function xo(e){return`${j(`Error:`)} ${e.buildError??`unknown build failure`}`}async function So(e={}){let t=await pt(e);return t.status===`failed`?{...t,message:xo(t),exitCode:1}:t.status===`skip-current`?{...t,message:yo(t),exitCode:0}:t.status===`installed`?{...t,message:bo(t),exitCode:0}:{...t,message:vo(t),exitCode:0}}function Co(){return new D(`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 So({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 wo(e,t){let n=kr({input:t??process.stdin,output:process.stderr});try{let t=(await n.question(e)).trim().toLowerCase();return t===`y`||t===`yes`}finally{n.close()}}function To(e={}){let t=e.platformName??process.platform,n=e.productName??`OpenKnowledge`;return Wt(t).join(Jt({...e,platformName:t}),n)}function Eo(e={}){let t=e.platformName??process.platform,n=e.home??Sr(),r=e.env??process.env,i=Wt(t),a;return a=t===`win32`?r.LOCALAPPDATA||i.join(n,`AppData`,`Local`):t===`darwin`?i.join(n,`Library`,`Caches`):r.XDG_CACHE_HOME||i.join(n,`.cache`),i.join(a,`@inkeepopen-knowledge-desktop-updater`)}function Do(e){if(typeof e!=`object`||!e)return null;let t=e.recentProjects;if(!Array.isArray(t))return null;let n=[];for(let e of t){if(typeof e!=`object`||!e)continue;let t=e;typeof t.path==`string`&&typeof t.name==`string`&&n.push({path:t.path,name:t.name})}return n}function Oo(e){let t=F(e,`state.json`);if(!R(t))return[];let n;try{n=JSON.parse(B(t,`utf-8`))}catch{return[]}return Do(n)??[]}function ko(e){let t=F(e,`state.json`);if(!R(t))return!1;try{return Do(JSON.parse(B(t,`utf-8`)))!==null}catch{return!1}}function K(e,t){return e===t?`~`:e.startsWith(`${t}/`)?`~${e.slice(t.length)}`:e}function Ao(e){return sr===`/`?e:e.split(sr).join(`/`)}function jo(e,t,n=`This project`){let r=[];r.push({kind:`stop-server`,group:n,label:`Stop the project server (if running)`,lockDir:w(e)});let i=new Set;for(let a of Gt){let o=qt[a];if(!o.projectConfigPath)continue;let s=o.projectConfigPath(e);i.add(Ao(I(e,s))),r.push({kind:`mcp-entry`,group:n,label:`Remove OK's MCP entry from ${o.label} (${Ao(I(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([...En(e),...ie]);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:F(e,a),containWithin:e})}try{r.push({kind:`remove-path`,group:n,label:`Remove the OK shadow repo (.git/ok/)`,path:Be(e)})}catch{}return r}function Mo(e,t){return{scope:`deinit`,ops:jo(e,t)}}function No(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 ${K(F(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(...Fo(a,t));for(let e of Gt){let n=qt[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} (${K(r,t)})`,editorId:e,scope:`user`,cwd:t,home:t,configPath:r})}for(let e of Xn(t))c.push({kind:`remove-path`,group:`Skill bundles`,label:`Remove ${K(e.path,t)}`,path:e.path});c.push(...Io(t,n,e.env));for(let e of o)c.push(...jo(e,t,`Project: ${ir(e)}`));return c.push({kind:`remove-path`,group:`Global directory`,label:s?`Remove ~/.ok (including user-authored skills)`:`Remove ~/.ok (keeping ~/.ok/skills)`,path:F(t,`.ok`),preserve:s?void 0:[`skills`]}),{scope:`uninstall`,ops:c}}function Po(e){return[F(e,`.zshrc`),F(e,`.bash_profile`),F(e,`.config`,`fish`,`conf.d`,`open-knowledge.fish`)]}function Fo(e,t){let n=[],r=new Set([...Po(t),...e?.rcFiles??[]]);for(let e of r)R(e)&&n.push({kind:`shell-block`,group:`Shell PATH`,label:`Strip the OK block from ${K(e,t)}`,rcFile:e});for(let r of e?.extraSymlinks??[])n.push({kind:`extra-symlink`,group:`Shell PATH`,label:`Remove the ok symlink at ${K(r.path,t)}`,path:r.path,target:r.target});return n}function Io(e,t,n){let r={home:e,platformName:t,env:n},i=To(r),a=Eo(r),o=[{kind:`remove-path`,group:`Application data`,label:`Remove ${K(i,e)}`,path:i}];if(t===`darwin`){let t=To({...r,productName:`Open Knowledge`});o.push({kind:`remove-path`,group:`Application data`,label:`Remove ${K(t,e)} (only if it is OpenKnowledge's)`,path:t,requireOurState:!0})}return o.push({kind:`remove-path`,group:`Application data`,label:`Remove ${K(a,e)}`,path:a}),o}async function Lo(e,t={}){let n=t.clearToken??Sn,r=t.clearEmbeddingsKey??Dt,i=t.stopServer??(e=>{let t=ln({lockDir:e,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 Ro(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 Ro(e,t){switch(e.kind){case`stop-server`:{let{stopped:n,failed:r}=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(!R(e.rcFile))return{op:e,status:`not-present`};let{text:t,changed:n,emptyAfter:r}=nn(B(e.rcFile,`utf-8`));return n?r?(br(e.rcFile,{force:!0}),{op:e,status:`removed`,detail:`file removed (was OK-owned)`}):(It(e.rcFile,t,{mode:Hn(e.rcFile)}),{op:e,status:`removed`}):{op:e,status:`not-present`}}case`extra-symlink`:return on(e.path,e.target)?(H(e.path),{op:e,status:`removed`}):{op:e,status:`not-present`};case`mcp-entry`:{let t=tn(qt[e.editorId],e.cwd,e.home,e.configPath);switch(t.kind){case`removed`:return{op:e,status:`removed`};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=Zn(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(Bn(e.projectRoot).length===0)return{op:e,status:`not-present`};let t=Fn(e.projectRoot,En(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 zo(e)}}function zo(e){if(e.requireOurState&&!ko(e.path))return{op:e,status:`skipped`,detail:`not verified as OpenKnowledge — left untouched`};e.containWithin&&Kt(e.path,e.containWithin);let t;try{t=mr(e.path)}catch(e){if(e.code!==`ENOENT`)throw e}if(!t)return{op:e,status:`not-present`};if(t.isSymbolicLink())return H(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 _r(e.path))t.has(r)||(br(F(e.path,r),{recursive:!0,force:!0}),n=!0);return{op:e,status:n?`removed`:`not-present`}}return br(e.path,{recursive:!0,force:!0}),{op:e,status:`removed`}}function Bo(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 Vo(e){if(e.ops.length===0)return k(`Nothing to remove.`);let t=[];for(let[n,r]of Bo(e.ops)){t.length>0&&t.push(``),t.push(N(`${n}:`));for(let e of r)t.push(` ${M(`-`)} ${e.label}`)}return t.join(`
|
|
@@ -39,17 +39,17 @@ ws.addEventListener('error', () => process.exit(1));
|
|
|
39
39
|
setTimeout(() => process.exit(2), ${t+1e4});
|
|
40
40
|
`),r}async function xs(e,t,n,r,i){let a=bs(e,t,F(r,`cpu.cpuprofile`)),o=!1,s=nr(process.execPath,[a],T({stdio:`ignore`})),c=setInterval(()=>{let e=gs(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{br(F(a,`..`),{recursive:!0,force:!0})}catch{}return o}function Ss(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(`
|
|
41
41
|
`)}async function Cs(e,t={}){let{pid:n,cpuProfileSecs:r=15,noInspector:i=!1}=e,a=t.log??(e=>console.log(e)),o=t.discover??Et,s=t.inspect??Qt,c=t.resolveCommand??rt,l=t.resolveUsage??xt,u=t.collectLsofFn??_s,d=t.getEndpoints??ys,f=t.profiler??xs,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(q.default.red(`No process with pid ${n} found.`));return}let _=await o(),v=null,y=null;for(let e of _){let t=s(e,`server`);if(t.status!==`missing`&&t.status!==`corrupt`&&t.lock.pid===n){v=t.lock.worktreeRoot,y={lockDir:e,state:t.status,lockPath:t.lockPath,lock:t.lock};break}}let b=new Date().toISOString().replace(/[:.]/g,`-`),x=e.output?e.output:v?F(v,`.ok`,`local`,`diagnostics`,`process-${n}-${b}`):F(process.cwd(),`ok-diagnose-${n}-${b}`);try{z(x,{recursive:!0})}catch(e){a(q.default.red(`Cannot create output directory ${x}: ${e.message}`));return}a(q.default.bold(`Diagnosing pid ${n}`)),a(`Output: ${x}`),a(``);let S=(e,t)=>{xr(F(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 te=u(n);if(te&&S(`lsof.txt`,te),!i){let e=te?vs(te).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(q.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(q.default.yellow(` CPU profile capture failed`)),t.length>0&&S(`process-stats.jsonl`,`${t.map(e=>JSON.stringify(e)).join(`
|
|
42
|
-
`)}\n`);try{S(`stacks.txt`,Ss(B(F(x,`cpu.cpuprofile`),`utf-8`)))}catch(e){a(q.default.yellow(` stacks.txt skipped: ${e.message}`))}}}else a(q.default.yellow(` Node inspector unavailable — skipping CPU profile`))}a(``),a(q.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: ${q.default.bold(x)}`)}async function ws(e){let t=kr({input:process.stdin,output:process.stdout});try{return(await t.question(e)).trim()}finally{t.close()}}async function Ts(e){let t=hr(F(wr(),`ok-bundle-process-`));return await Cs({pid:e,output:t}),t}function Es(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 Ds(e){let t=e.trim().toLowerCase();return t===`y`||t===`yes`}function Os(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 ks(e){let t=e.manifest.redaction.secretScrub;return t===void 0?q.default.yellow(`NOT scrubbed (--no-redact): tokens and keys ship verbatim`):`scrubbed known credential formats (${t.redactedLineCount} line(s) across ${t.redactions.length} file(s))`}function As(e,t,n){let{summary:r,manifest:i}=t;e(``),e(q.default.bold(`ok diagnose bundle — what leaves this machine`)),e(``),e(` Files: ${r.fileCount}`),e(` Total size: ${Es(r.totalBytes)} uncompressed`),e(` Document names: included in cleartext (${r.docNameCount} doc.name occurrence(s) in telemetry)`),e(` Content-dir path: ${Os(t)}`),e(` Credentials: ${ks(t)}`),e(` Server status: ${i.serverStatus}`),e(` Output: ${n}`),e(``)}async function js(e,t={}){let n=t.log??(e=>console.log(e)),r=t.prompt??ws,i=t.runProcessDiagnose??Ts,a=t.now??(()=>new Date),o;if(e.out!==void 0){o=e.out;let t=P(o);if(!R(t))throw Error(`ok diagnose bundle: --out parent directory does not exist: ${t}. Create it first.`)}else{let t=a().toISOString().replace(/[:.]/g,`-`),n=F(e.contentDir,`.ok`,`local`,`diagnostics`);z(n,{recursive:!0}),o=F(n,`bundle-${t}.zip`)}let s;e.pid!==void 0&&(n(q.default.dim(`Running ok diagnose process ${e.pid} into a temp dir`)),s=await i(e.pid));let c=e.redact!==!1,l=await rn({contentDir:e.contentDir,projectDir:e.projectDir,processDir:s,redact:c,scrubSecrets:c,deps:t.collectDeps});try{return l.manifest.serverStatus===`not-running`&&n(q.default.yellow(` server not running — live state unavailable`)),As(n,l,o),e.yes!==!0&&!Ds(await r(`Write bundle? [y/N]: `))?(n(q.default.dim(`Aborted; no bundle written.`)),{outputPath:null,declined:!0}):(await en({collected:l,outputPath:o}),n(q.default.bold(`Bundle: ${o}`)),{outputPath:o,declined:!1})}finally{if(l.cleanup(),s!==void 0)try{br(s,{recursive:!0,force:!0})}catch{}}}function Ms(){let e=new D(`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(q.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(q.default.red(`--cpu-profile must be a positive integer`)),process.exit(1)),await Cs({pid:n,cpuProfileSecs:r,output:t.output,noInspector:!t.inspector})}),e.addCommand(hs()),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(q.default.red(`Invalid --pid '${e.pid}': must be a positive integer`)),process.exit(1)));try{let{loadConfig:n}=await import(`./loader-
|
|
42
|
+
`)}\n`);try{S(`stacks.txt`,Ss(B(F(x,`cpu.cpuprofile`),`utf-8`)))}catch(e){a(q.default.yellow(` stacks.txt skipped: ${e.message}`))}}}else a(q.default.yellow(` Node inspector unavailable — skipping CPU profile`))}a(``),a(q.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: ${q.default.bold(x)}`)}async function ws(e){let t=kr({input:process.stdin,output:process.stdout});try{return(await t.question(e)).trim()}finally{t.close()}}async function Ts(e){let t=hr(F(wr(),`ok-bundle-process-`));return await Cs({pid:e,output:t}),t}function Es(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 Ds(e){let t=e.trim().toLowerCase();return t===`y`||t===`yes`}function Os(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 ks(e){let t=e.manifest.redaction.secretScrub;return t===void 0?q.default.yellow(`NOT scrubbed (--no-redact): tokens and keys ship verbatim`):`scrubbed known credential formats (${t.redactedLineCount} line(s) across ${t.redactions.length} file(s))`}function As(e,t,n){let{summary:r,manifest:i}=t;e(``),e(q.default.bold(`ok diagnose bundle — what leaves this machine`)),e(``),e(` Files: ${r.fileCount}`),e(` Total size: ${Es(r.totalBytes)} uncompressed`),e(` Document names: included in cleartext (${r.docNameCount} doc.name occurrence(s) in telemetry)`),e(` Content-dir path: ${Os(t)}`),e(` Credentials: ${ks(t)}`),e(` Server status: ${i.serverStatus}`),e(` Output: ${n}`),e(``)}async function js(e,t={}){let n=t.log??(e=>console.log(e)),r=t.prompt??ws,i=t.runProcessDiagnose??Ts,a=t.now??(()=>new Date),o;if(e.out!==void 0){o=e.out;let t=P(o);if(!R(t))throw Error(`ok diagnose bundle: --out parent directory does not exist: ${t}. Create it first.`)}else{let t=a().toISOString().replace(/[:.]/g,`-`),n=F(e.contentDir,`.ok`,`local`,`diagnostics`);z(n,{recursive:!0}),o=F(n,`bundle-${t}.zip`)}let s;e.pid!==void 0&&(n(q.default.dim(`Running ok diagnose process ${e.pid} into a temp dir`)),s=await i(e.pid));let c=e.redact!==!1,l=await rn({contentDir:e.contentDir,projectDir:e.projectDir,processDir:s,redact:c,scrubSecrets:c,deps:t.collectDeps});try{return l.manifest.serverStatus===`not-running`&&n(q.default.yellow(` server not running — live state unavailable`)),As(n,l,o),e.yes!==!0&&!Ds(await r(`Write bundle? [y/N]: `))?(n(q.default.dim(`Aborted; no bundle written.`)),{outputPath:null,declined:!0}):(await en({collected:l,outputPath:o}),n(q.default.bold(`Bundle: ${o}`)),{outputPath:o,declined:!1})}finally{if(l.cleanup(),s!==void 0)try{br(s,{recursive:!0,force:!0})}catch{}}}function Ms(){let e=new D(`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(q.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(q.default.red(`--cpu-profile must be a positive integer`)),process.exit(1)),await Cs({pid:n,cpuProfileSecs:r,output:t.output,noInspector:!t.inspector})}),e.addCommand(hs()),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(q.default.red(`Invalid --pid '${e.pid}': must be a positive integer`)),process.exit(1)));try{let{loadConfig:n}=await import(`./loader-Bbx1ChcV.mjs`),{resolveContentDir:r}=await import(`./src-DRQtLkln.mjs`),i=process.cwd(),{config:a}=n(i);await js({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(q.default.red(t)),process.exit(1)}}),e}async function Ns(){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 gi({message:`Enter embeddings provider API key:`})).trim()}function Ps(e){return dt(e)}async function Fs(e,t){let n=await Ct(at(),e,t);return n.apiKey?{present:!0,notRequired:!1,source:n.source}:{present:!1,notRequired:n.keyless,source:null}}async function Is(e){try{let t=Vt(w(e));if(!t||t.port<=0||!Bt(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 Ls(){return new D(`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 Ns();if(!t){process.stderr.write(`No key provided.
|
|
43
43
|
`),process.exitCode=1;return}let n=L(e.cwd??process.cwd()),{baseUrl:r}=Ps(n);try{await at().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).
|
|
44
44
|
Enable semantic search with \`ok embeddings enable\`, or in
|
|
45
45
|
OK Desktop → Settings → This project → Search.
|
|
46
46
|
`)})}function Rs(){return new D(`clear-key`).description(`Remove 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=L(e.cwd??process.cwd()),{baseUrl:n}=Ps(t),r;try{r=await at().clearForProject(t,n)}catch(e){process.stderr.write(`Failed to clear the embeddings key: ${e instanceof Error?e.message:String(e)}\n`),process.exitCode=1;return}if(!r){process.stderr.write(`No stored embeddings key found for ${n}.\n`);return}process.stderr.write(`✓ Embeddings API key cleared for ${n}.\n`)})}function zs(){return new D(`list`).description(`List every project + endpoint that has a stored embeddings key`).action(async()=>{let e=await at().listProjects();if(e.length===0){process.stderr.write(`No project embeddings keys stored.
|
|
47
47
|
`);return}let t=[`Stored embeddings keys (this machine):`,``];for(let{projectKey:n,endpoints:r}of e){t.push(` ${n}`);for(let{endpoint:e,hint:n}of r)t.push(` ${e} → ${n?`••••${n}`:`set`}`)}process.stdout.write(`${t.join(`
|
|
48
|
-
`)}\n`)})}function Bs(){return new D(`set-url`).description(`Set the embeddings API endpoint for this project (project-local)`).argument(`<url>`,`OpenAI-compatible base URL, e.g. https://api.openai.com/v1`).option(`--cwd <path>`,`Project directory (defaults to the current directory)`).action(async(e,t)=>{let n=e.trim(),r=
|
|
49
|
-
`)})}function Us(){return new D(`clear-model`).description(`Reset the embeddings model to ${
|
|
48
|
+
`)}\n`)})}function Bs(){return new D(`set-url`).description(`Set the embeddings API endpoint for this project (project-local)`).argument(`<url>`,`OpenAI-compatible base URL, e.g. https://api.openai.com/v1`).option(`--cwd <path>`,`Project directory (defaults to the current directory)`).action(async(e,t)=>{let n=e.trim(),r=a(n);if(r!==null){process.stderr.write(r===`invalid-url`?`Not a valid URL: ${e}\n`:`Refusing an insecure endpoint: use https:// (http:// is allowed only for localhost). Got: ${e}\n`),process.exitCode=1;return}let i=L(t.cwd??process.cwd()),o=await Ft({cwd:i,scope:`project-local`,patch:{search:{semantic:{baseUrl:n}}}});if(!o.ok){process.stderr.write(`Failed to set the embeddings endpoint — ${_(o.error)}\n`),process.exitCode=1;return}process.stderr.write(`✓ Embeddings endpoint set to ${n} for ${i}\n`)})}function Vs(){return new D(`clear-url`).description(`Reset the embeddings API endpoint to the default OpenAI endpoint (project-local)`).option(`--cwd <path>`,`Project directory (defaults to the current directory)`).action(async e=>{let t=L(e.cwd??process.cwd()),n=await Ft({cwd:t,scope:`project-local`,patch:{search:{semantic:{baseUrl:l}}}});if(!n.ok){process.stderr.write(`Failed to reset the embeddings endpoint — ${_(n.error)}\n`),process.exitCode=1;return}process.stderr.write(`✓ Embeddings endpoint reset to ${l} for ${t}\n`)})}function Hs(){return new D(`set-model`).description(`Set the embeddings model for this project (project-local)`).argument(`<model>`,`Model id served by the configured endpoint, e.g. nomic-embed-text`).option(`--cwd <path>`,`Project directory (defaults to the current directory)`).action(async(e,t)=>{let n=e.trim();if(!n){process.stderr.write("Model id cannot be empty. Use `clear-model` to reset the default.\n"),process.exitCode=1;return}let r=L(t.cwd??process.cwd()),i=await Ft({cwd:r,scope:`project-local`,patch:{search:{semantic:{model:n}}}});if(!i.ok){process.stderr.write(`Failed to set the embeddings model — ${_(i.error)}\n`),process.exitCode=1;return}process.stderr.write(`✓ Embeddings model set to ${n} for ${r}\n Changing the model re-embeds the corpus on the next search.
|
|
49
|
+
`)})}function Us(){return new D(`clear-model`).description(`Reset the embeddings model to ${n} (project-local)`).option(`--cwd <path>`,`Project directory (defaults to the current directory)`).action(async e=>{let t=L(e.cwd??process.cwd()),r=await Ft({cwd:t,scope:`project-local`,patch:{search:{semantic:{model:n}}}});if(!r.ok){process.stderr.write(`Failed to reset the embeddings model — ${_(r.error)}\n`),process.exitCode=1;return}process.stderr.write(`✓ Embeddings model reset to ${n} for ${t}\n`)})}function Ws(e,t){return new D(e).description(`Turn semantic search ${t?`on`:`off`} for this project (project-local)`).option(`--cwd <path>`,`Project directory (defaults to the current directory)`).action(async n=>{let r=L(n.cwd??process.cwd()),i=await Ft({cwd:r,scope:`project-local`,patch:{search:{semantic:{enabled:t}}}});if(!i.ok){process.stderr.write(`Failed to ${e} semantic search — ${_(i.error)}\n`),process.exitCode=1;return}if(process.stderr.write(`✓ Semantic search ${t?`enabled`:`disabled`} for ${r}\n`),t){let{present:e,notRequired:t}=await Fs(r,Ps(r).baseUrl);!e&&!t&&process.stderr.write(" Note: no API key set yet — run `ok embeddings set-key`. Until then, search stays lexical.\n")}})}function Gs(){return new D(`status`).description(`Show semantic-search capability: key presence, enabled, coverage, provider`).option(`--cwd <path>`,`Project directory (defaults to the current directory)`).option(`--json`,`Output JSON`,!1).action(async e=>{let t=L(e.cwd??process.cwd()),n=Ps(t),{present:r,notRequired:i,source:a}=await Fs(t,n.baseUrl),o=n.enabled&&(r||i),s=o?await Is(t):null;if(e.json){process.stdout.write(`${JSON.stringify({project:t,key:{present:r,notRequired:i,source:a},project_config:{enabled:n.enabled,capable:o,coverage:s?{embedded:s.embedded,total:s.total}:null,provider:{baseUrl:n.baseUrl,model:n.model,dimensions:n.dimensions??null}}})}\n`);return}let c=r?`set for this endpoint — ${a===`env`?`environment (${ct})`:`~/.ok/secrets.yml`}`:i?`not required (localhost endpoint)`:`not set`,l=o?s?`${s.embedded} / ${s.total} pages embedded`:`server not running — start it to index (or it has not embedded yet)`:null,u=[`Semantic search`,` project: ${t}`,``,` This project:`,` enabled: ${n.enabled?`yes`:`no`}`,` API key: ${c}`,` capability: ${o?`AVAILABLE`:`unavailable (search stays lexical)`}`,...l?[` coverage: ${l}`]:[],` provider: ${n.baseUrl}`,` model: ${n.model}`,` dimensions: ${n.dimensions??`auto (detected from the endpoint)`}`],d=[];!r&&!i&&d.push(`Set a key: ok embeddings set-key (or export ${ct})`),n.enabled||d.push(`Enable it: ok embeddings enable (in this project folder)`),d.length>0&&u.push(``,...d.map(e=>` ${e}`)),process.stdout.write(`${u.join(`
|
|
50
50
|
`)}\n`)})}function Ks(){return new D(`embeddings`).description(`Manage the semantic-search embeddings provider key + status`).addCommand(Ls()).addCommand(Rs()).addCommand(Bs()).addCommand(Vs()).addCommand(Hs()).addCommand(Us()).addCommand(Ws(`enable`,!0)).addCommand(Ws(`disable`,!1)).addCommand(zs()).addCommand(Gs())}const qs=F(`Contents`,`Resources`,`cli`,`bin`,`ok.sh`),Js=/Contents\/Resources\/cli\/dist\/cli\.mjs$/;function Ys(e,t,n){return e===`darwin`?[F(t,`Applications`,`OpenKnowledge.app`,qs),F(`/Applications`,`OpenKnowledge.app`,qs)].find(e=>n.existsSync(e))??null:null}function Xs(e,t,n){if(n!==`darwin`)return{proxy:!1,suppressedBy:`platform`};let r=e.OK_BUNDLE_PROXY?.toLowerCase();return r===`0`||r===`false`?{proxy:!1,suppressedBy:`env`}:t.includes(`--no-bundle-proxy`)?{proxy:!1,suppressedBy:`flag`}:typeof t[1]==`string`&&Js.test(t[1])?{proxy:!1,suppressedBy:`self`}:{proxy:!0,suppressedBy:null}}function Zs(e){e.stderr.write(`${JSON.stringify({event:`mcp-bundle-proxy`,mode:e.mode,bundlePath:e.bundlePath,reason:e.reason,hint:`Suppress with --no-bundle-proxy or OK_BUNDLE_PROXY=0.`})}\n`)}function Qs(e){Zs({stderr:e.stderr,mode:`bundled`,bundlePath:e.bundlePath,reason:null});let t=e.spawnImpl??nr,n=e.exitProcess??(e=>process.exit(e)),r=e.now??(()=>Date.now()),i=r(),a=e.startupFailureWindowMs??1e3;return new Promise((o,s)=>{let c=t(e.bundlePath,e.argv.filter(e=>e!==`--no-bundle-proxy`),{env:{...e.env,OK_BUNDLE_PROXY:`0`},stdio:`inherit`,windowsHide:!0}),l=e=>{c.kill(e)},u=()=>{process.off(`SIGTERM`,l),process.off(`SIGINT`,l)};process.on(`SIGTERM`,l),process.on(`SIGINT`,l),c.once(`error`,e=>{u(),s(e)}),c.once(`exit`,(e,t)=>{if(u(),t){s(Error(`bundle process exited by signal ${t}`));return}let o=e??0,c=r()-i;if(o!==0&&c<=a){s(Error(`bundle process exited during startup with code ${o}`));return}n(o)})})}function $s(e){let t=e.scheduler??{setTimeout:(e,t)=>globalThis.setTimeout(e,t),clearTimeout:e=>globalThis.clearTimeout(e)},n=e.initialBackoffMs??1e3,r=e.maxBackoffMs??3e4,i=e.rng??Math.random,a=e.createWebSocket??(e=>new WebSocket(e)),o=e.logger??null,s=e.log,c=null,l=null,u=!1,d=n;function f(e,t,n){try{o?o[e](t,n):s?.(t)}catch{}}function p(){if(u)return;l!==null&&t.clearTimeout(l);let e=d;d=Math.min(d*2,r);let n=i(),a=Math.max(1,Math.floor(e*(1-n/2)));f(`debug`,`scheduling reconnect`,{backoffMs:a,ceilMs:e}),l=t.setTimeout(()=>{l=null,m().catch(e=>f(`warn`,`reconnect failed`,{error:String(e)}))},a)}async function m(){if(u)return;let t;try{t=await e.resolveWsUrl()}catch(e){f(`warn`,`resolveWsUrl threw`,{error:String(e)}),p();return}if(!t){p();return}let r=[];e.pid!==void 0&&r.push(`pid=${encodeURIComponent(String(e.pid))}`),e.connectionId&&r.push(`connectionId=${encodeURIComponent(e.connectionId)}`),e.connectionId&&e.displayName!==void 0&&e.clientName!==void 0&&e.colorSeed!==void 0&&(r.push(`displayName=${encodeURIComponent(e.displayName)}`),r.push(`clientName=${encodeURIComponent(e.clientName)}`),r.push(`colorSeed=${encodeURIComponent(e.colorSeed)}`));let i=r.length>0?`?${r.join(`&`)}`:``,o=`${t}/collab/keepalive${i}`;try{c=a(o)}catch(e){f(`warn`,`WebSocket constructor failed`,{url:o,error:String(e)}),c=null,p();return}c.addEventListener(`open`,()=>{f(`info`,`connected`,{url:t}),d=n}),c.addEventListener(`close`,()=>{u||(f(`info`,`disconnected`,{url:t}),c=null,p())}),c.addEventListener(`error`,()=>{f(`debug`,`websocket error observed`,{url:t,readyState:c?.readyState,reason:`error-event`})})}return queueMicrotask(()=>{m().catch(e=>f(`warn`,`initial connect failed`,{error:String(e)}))}),{close:()=>{if(!u&&(u=!0,l!==null&&(t.clearTimeout(l),l=null),c)){try{c.close()}catch{}c=null}},isConnected:()=>c!==null&&c.readyState===1}}var ec=class{append(e){this._buffer=this._buffer?Buffer.concat([this._buffer,e]):e}readMessage(){if(!this._buffer)return null;let e=this._buffer.indexOf(`
|
|
51
51
|
`);if(e===-1)return null;let t=this._buffer.toString(`utf8`,0,e).replace(/\r$/,``);return this._buffer=this._buffer.subarray(e+1),tc(t)}clear(){this._buffer=void 0}};function tc(e){return ot.parse(JSON.parse(e))}function nc(e){return JSON.stringify(e)+`
|
|
52
|
-
`}var rc=class{constructor(e=cr.stdin,t=cr.stdout){this._stdin=e,this._stdout=t,this._readBuffer=new ec,this._started=!1,this._ondata=e=>{this._readBuffer.append(e),this.processReadBuffer()},this._onerror=e=>{this.onerror?.(e)}}async start(){if(this._started)throw Error(`StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.`);this._started=!0,this._stdin.on(`data`,this._ondata),this._stdin.on(`error`,this._onerror)}processReadBuffer(){for(;;)try{let e=this._readBuffer.readMessage();if(e===null)break;this.onmessage?.(e)}catch(e){this.onerror?.(e)}}async close(){this._stdin.off(`data`,this._ondata),this._stdin.off(`error`,this._onerror),this._stdin.listenerCount(`data`)===0&&this._stdin.pause(),this._readBuffer.clear(),this.onclose?.()}send(e){return new Promise(t=>{let n=nc(e);this._stdout.write(n)?t():this._stdout.once(`drain`,t)})}};function ic(e){if(e.platform!==`darwin`)return{kind:`unchanged`};let t;try{t=e.realpath(e.bundleAnchorPath)}catch(e){return{kind:`unreadable`,reason:e instanceof Error?e.message:String(e)}}let n;try{n=e.statInode(t)}catch(e){return{kind:`unreadable`,reason:e instanceof Error?e.message:String(e)}}return n===e.currentInode?{kind:`unchanged`}:{kind:`replaced`,currentInode:e.currentInode,onDiskInode:n}}function ac(e){let t=e.setInterval??setInterval,n=e.clearInterval??clearInterval,r=e.intervalMs??3e5,i=!0,a=!1,o=!1,s=t(()=>{if(!i)return;let t;try{t=e.detect()}catch(t){e.log(`bundle identity check threw unexpectedly (contract violation): ${t instanceof Error?t.message:String(t)}`);return}if(t.kind===`unreadable`){o||(o=!0,e.log(`bundle identity check unreadable${t.reason?`: ${t.reason}`:``} — will retry on next tick`));return}o&&(o=!1,e.log(`bundle identity check recovered from unreadable`)),t.kind!==`unchanged`&&(i=!1,e.onReplaced(t))},r);return typeof s.unref==`function`&&s.unref(),{stop:()=>{a||(a=!0,i=!1,n(s))}}}function oc(e,t){let n;try{n=t.realpathSync(e)}catch(e){t.log(`[mcp] bundle identity boot capture unreadable (realpath failed): ${e instanceof Error?e.message:String(e)}`);return}let r;try{r=t.statInoSync(n)}catch(e){t.log(`[mcp] bundle identity boot capture unreadable (stat failed): ${e instanceof Error?e.message:String(e)}`);return}return{resolvedPath:n,inode:r}}function sc(e){let t=e.scheduler??{setInterval:(e,t)=>globalThis.setInterval(e,t),clearInterval:e=>globalThis.clearInterval(e)},n=e.getPpid();if(n<=1)return{stop:()=>{}};let r=!1,i=t.setInterval(()=>{if(r)return;let a=e.getPpid();a!==n&&(r=!0,t.clearInterval(i),e.onHostGone(`host process exited (ppid ${n} -> ${a})`))},e.intervalMs??1e3);return i.unref?.(),{stop:()=>t.clearInterval(i)}}function cc(e){let t=t=>{try{e.log(t)}catch{}},n=e.transport.onclose;e.transport.onclose=()=>{t(`[mcp] stdio transport closed (internal shutdown)`),n?.()},e.stdin.once(`end`,()=>t(`[mcp] stdin EOF (host closed pipe)`)),e.stdin.once(`close`,()=>t(`[mcp] stdin closed`)),e.process.on(`exit`,e=>{t(`[mcp] exit code=${e}`)}),e.process.on(`uncaughtExceptionMonitor`,(e,n)=>{t(`[mcp] uncaughtException origin=${n}: ${e instanceof Error?e.stack??e.message:String(e)}`)})}function lc(e){return e?e instanceof Headers?Object.fromEntries(e.entries()):Array.isArray(e)?Object.fromEntries(e):{...e}:{}}function uc(e=fetch,t){return t?async(n,r)=>e(n,{...t,...r,headers:r?.headers?{...lc(t.headers),...lc(r.headers)}:t.headers}):e}let dc;dc=globalThis.crypto?.webcrypto??globalThis.crypto??import(`node:crypto`).then(e=>e.webcrypto);async function fc(e){return(await dc).getRandomValues(new Uint8Array(e))}async function pc(e){let t=``;for(;t.length<e;){let n=await fc(e-t.length);for(let e of n)e<198&&(t+=`abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~`[e%66])}return t}async function mc(e){return await pc(e)}async function hc(e){let t=await(await dc).subtle.digest(`SHA-256`,new TextEncoder().encode(e));return btoa(String.fromCharCode(...new Uint8Array(t))).replace(/\//g,`_`).replace(/\+/g,`-`).replace(/=/g,``)}async function gc(e){if(e||=43,e<43||e>128)throw`Expected a length between 43 and 128. Received ${e}.`;let t=await mc(e);return{code_verifier:t,code_challenge:await hc(t)}}const J=y().superRefine((e,t)=>{if(!URL.canParse(e))return t.addIssue({code:Ar.custom,message:`URL must be parseable`,fatal:!0}),h}).refine(e=>{let t=new URL(e);return t.protocol!==`javascript:`&&t.protocol!==`data:`&&t.protocol!==`vbscript:`},{message:`URL cannot use javascript:, data:, or vbscript: scheme`}),_c=t({resource:i().url(),authorization_servers:s(J).optional(),jwks_uri:i().url().optional(),scopes_supported:s(i()).optional(),bearer_methods_supported:s(i()).optional(),resource_signing_alg_values_supported:s(i()).optional(),resource_name:i().optional(),resource_documentation:i().optional(),resource_policy_uri:i().url().optional(),resource_tos_uri:i().url().optional(),tls_client_certificate_bound_access_tokens:n().optional(),authorization_details_types_supported:s(i()).optional(),dpop_signing_alg_values_supported:s(i()).optional(),dpop_bound_access_tokens_required:n().optional()}),vc=t({issuer:i(),authorization_endpoint:J,token_endpoint:J,registration_endpoint:J.optional(),scopes_supported:s(i()).optional(),response_types_supported:s(i()),response_modes_supported:s(i()).optional(),grant_types_supported:s(i()).optional(),token_endpoint_auth_methods_supported:s(i()).optional(),token_endpoint_auth_signing_alg_values_supported:s(i()).optional(),service_documentation:J.optional(),revocation_endpoint:J.optional(),revocation_endpoint_auth_methods_supported:s(i()).optional(),revocation_endpoint_auth_signing_alg_values_supported:s(i()).optional(),introspection_endpoint:i().optional(),introspection_endpoint_auth_methods_supported:s(i()).optional(),introspection_endpoint_auth_signing_alg_values_supported:s(i()).optional(),code_challenge_methods_supported:s(i()).optional(),client_id_metadata_document_supported:n().optional()}),yc=a({...t({issuer:i(),authorization_endpoint:J,token_endpoint:J,userinfo_endpoint:J.optional(),jwks_uri:J,registration_endpoint:J.optional(),scopes_supported:s(i()).optional(),response_types_supported:s(i()),response_modes_supported:s(i()).optional(),grant_types_supported:s(i()).optional(),acr_values_supported:s(i()).optional(),subject_types_supported:s(i()),id_token_signing_alg_values_supported:s(i()),id_token_encryption_alg_values_supported:s(i()).optional(),id_token_encryption_enc_values_supported:s(i()).optional(),userinfo_signing_alg_values_supported:s(i()).optional(),userinfo_encryption_alg_values_supported:s(i()).optional(),userinfo_encryption_enc_values_supported:s(i()).optional(),request_object_signing_alg_values_supported:s(i()).optional(),request_object_encryption_alg_values_supported:s(i()).optional(),request_object_encryption_enc_values_supported:s(i()).optional(),token_endpoint_auth_methods_supported:s(i()).optional(),token_endpoint_auth_signing_alg_values_supported:s(i()).optional(),display_values_supported:s(i()).optional(),claim_types_supported:s(i()).optional(),claims_supported:s(i()).optional(),service_documentation:i().optional(),claims_locales_supported:s(i()).optional(),ui_locales_supported:s(i()).optional(),claims_parameter_supported:n().optional(),request_parameter_supported:n().optional(),request_uri_parameter_supported:n().optional(),require_request_uri_registration:n().optional(),op_policy_uri:J.optional(),op_tos_uri:J.optional(),client_id_metadata_document_supported:n().optional()}).shape,...vc.pick({code_challenge_methods_supported:!0}).shape}),bc=a({access_token:i(),id_token:i().optional(),token_type:i(),expires_in:Mr().optional(),scope:i().optional(),refresh_token:i().optional()}).strip(),xc=a({error:i(),error_description:i().optional(),error_uri:i().optional()}),Sc=J.optional().or(m(``).transform(()=>void 0)),Cc=a({redirect_uris:s(J),token_endpoint_auth_method:i().optional(),grant_types:s(i()).optional(),response_types:s(i()).optional(),client_name:i().optional(),client_uri:J.optional(),logo_uri:Sc,scope:i().optional(),contacts:s(i()).optional(),tos_uri:Sc,policy_uri:i().optional(),jwks_uri:J.optional(),jwks:v().optional(),software_id:i().optional(),software_version:i().optional(),software_statement:i().optional()}).strip(),wc=a({client_id:i(),client_secret:i().optional(),client_id_issued_at:p().optional(),client_secret_expires_at:p().optional()}).strip(),Tc=Cc.merge(wc);a({error:i(),error_description:i().optional()}).strip(),a({token:i(),token_type_hint:i().optional()}).strip();function Ec(e){let t=typeof e==`string`?new URL(e):new URL(e.href);return t.hash=``,t}function Dc({requestedResource:e,configuredResource:t}){let n=typeof e==`string`?new URL(e):new URL(e.href),r=typeof t==`string`?new URL(t):new URL(t.href);if(n.origin!==r.origin||n.pathname.length<r.pathname.length)return!1;let i=n.pathname.endsWith(`/`)?n.pathname:n.pathname+`/`,a=r.pathname.endsWith(`/`)?r.pathname:r.pathname+`/`;return i.startsWith(a)}var Y=class extends Error{constructor(e,t){super(e),this.errorUri=t,this.name=this.constructor.name}toResponseObject(){let e={error:this.errorCode,error_description:this.message};return this.errorUri&&(e.error_uri=this.errorUri),e}get errorCode(){return this.constructor.errorCode}},Oc=class extends Y{};Oc.errorCode=`invalid_request`;var kc=class extends Y{};kc.errorCode=`invalid_client`;var Ac=class extends Y{};Ac.errorCode=`invalid_grant`;var jc=class extends Y{};jc.errorCode=`unauthorized_client`;var Mc=class extends Y{};Mc.errorCode=`unsupported_grant_type`;var Nc=class extends Y{};Nc.errorCode=`invalid_scope`;var Pc=class extends Y{};Pc.errorCode=`access_denied`;var X=class extends Y{};X.errorCode=`server_error`;var Fc=class extends Y{};Fc.errorCode=`temporarily_unavailable`;var Ic=class extends Y{};Ic.errorCode=`unsupported_response_type`;var Lc=class extends Y{};Lc.errorCode=`unsupported_token_type`;var Rc=class extends Y{};Rc.errorCode=`invalid_token`;var zc=class extends Y{};zc.errorCode=`method_not_allowed`;var Bc=class extends Y{};Bc.errorCode=`too_many_requests`;var Vc=class extends Y{};Vc.errorCode=`invalid_client_metadata`;var Hc=class extends Y{};Hc.errorCode=`insufficient_scope`;var Uc=class extends Y{};Uc.errorCode=`invalid_target`;const Wc={[Oc.errorCode]:Oc,[kc.errorCode]:kc,[Ac.errorCode]:Ac,[jc.errorCode]:jc,[Mc.errorCode]:Mc,[Nc.errorCode]:Nc,[Pc.errorCode]:Pc,[X.errorCode]:X,[Fc.errorCode]:Fc,[Ic.errorCode]:Ic,[Lc.errorCode]:Lc,[Rc.errorCode]:Rc,[zc.errorCode]:zc,[Bc.errorCode]:Bc,[Vc.errorCode]:Vc,[Hc.errorCode]:Hc,[Uc.errorCode]:Uc};var Gc=class extends Error{constructor(e){super(e??`Unauthorized`)}};function Kc(e){return[`client_secret_basic`,`client_secret_post`,`none`].includes(e)}const qc=`code`,Jc=`S256`;function Yc(e,t){let n=e.client_secret!==void 0;return`token_endpoint_auth_method`in e&&e.token_endpoint_auth_method&&Kc(e.token_endpoint_auth_method)&&(t.length===0||t.includes(e.token_endpoint_auth_method))?e.token_endpoint_auth_method:t.length===0?n?`client_secret_basic`:`none`:n&&t.includes(`client_secret_basic`)?`client_secret_basic`:n&&t.includes(`client_secret_post`)?`client_secret_post`:t.includes(`none`)?`none`:n?`client_secret_post`:`none`}function Xc(e,t,n,r){let{client_id:i,client_secret:a}=t;switch(e){case`client_secret_basic`:Zc(i,a,n);return;case`client_secret_post`:Qc(i,a,r);return;case`none`:$c(i,r);return;default:throw Error(`Unsupported client authentication method: ${e}`)}}function Zc(e,t,n){if(!t)throw Error(`client_secret_basic authentication requires a client_secret`);let r=btoa(`${e}:${t}`);n.set(`Authorization`,`Basic ${r}`)}function Qc(e,t,n){n.set(`client_id`,e),t&&n.set(`client_secret`,t)}function $c(e,t){t.set(`client_id`,e)}async function el(e){let t=e instanceof Response?e.status:void 0,n=e instanceof Response?await e.text():e;try{let{error:e,error_description:t,error_uri:r}=xc.parse(JSON.parse(n));return new(Wc[e]||X)(t||``,r)}catch(e){return new X(`${t?`HTTP ${t}: `:``}Invalid OAuth error response: ${e}. Raw body: ${n}`)}}async function tl(e,t){try{return await nl(e,t)}catch(n){if(n instanceof kc||n instanceof jc)return await e.invalidateCredentials?.(`all`),await nl(e,t);if(n instanceof Ac)return await e.invalidateCredentials?.(`tokens`),await nl(e,t);throw n}}async function nl(e,{serverUrl:t,authorizationCode:n,scope:r,resourceMetadataUrl:i,fetchFn:a}){let o=await e.discoveryState?.(),s,c,l,u=i;if(!u&&o?.resourceMetadataUrl&&(u=new URL(o.resourceMetadataUrl)),o?.authorizationServerUrl){if(c=o.authorizationServerUrl,s=o.resourceMetadata,l=o.authorizationServerMetadata??await ml(c,{fetchFn:a}),!s)try{s=await sl(t,{resourceMetadataUrl:u},a)}catch{}(l!==o.authorizationServerMetadata||s!==o.resourceMetadata)&&await e.saveDiscoveryState?.({authorizationServerUrl:String(c),resourceMetadataUrl:u?.toString(),resourceMetadata:s,authorizationServerMetadata:l})}else{let n=await hl(t,{resourceMetadataUrl:u,fetchFn:a});c=n.authorizationServerUrl,l=n.authorizationServerMetadata,s=n.resourceMetadata,await e.saveDiscoveryState?.({authorizationServerUrl:String(c),resourceMetadataUrl:u?.toString(),resourceMetadata:s,authorizationServerMetadata:l})}let d=await il(t,e,s),f=r||s?.scopes_supported?.join(` `)||e.clientMetadata.scope,p=await Promise.resolve(e.clientInformation());if(!p){if(n!==void 0)throw Error(`Existing OAuth client information is required when exchanging an authorization code`);let t=l?.client_id_metadata_document_supported===!0,r=e.clientMetadataUrl;if(r&&!rl(r))throw new Vc(`clientMetadataUrl must be a valid HTTPS URL with a non-root pathname, got: ${r}`);if(t&&r)p={client_id:r},await e.saveClientInformation?.(p);else{if(!e.saveClientInformation)throw Error(`OAuth client information must be saveable for dynamic registration`);let t=await xl(c,{metadata:l,clientMetadata:e.clientMetadata,scope:f,fetchFn:a});await e.saveClientInformation(t),p=t}}let m=!e.redirectUrl;if(n!==void 0||m){let t=await bl(e,c,{metadata:l,resource:d,authorizationCode:n,fetchFn:a});return await e.saveTokens(t),`AUTHORIZED`}let h=await e.tokens();if(h?.refresh_token)try{let t=await yl(c,{metadata:l,clientInformation:p,refreshToken:h.refresh_token,resource:d,addClientAuthentication:e.addClientAuthentication,fetchFn:a});return await e.saveTokens(t),`AUTHORIZED`}catch(e){if(!(!(e instanceof Y)||e instanceof X))throw e}let g=e.state?await e.state():void 0,{authorizationUrl:_,codeVerifier:v}=await gl(c,{metadata:l,clientInformation:p,state:g,redirectUrl:e.redirectUrl,scope:f,resource:d});return await e.saveCodeVerifier(v),await e.redirectToAuthorization(_),`REDIRECT`}function rl(e){if(!e)return!1;try{let t=new URL(e);return t.protocol===`https:`&&t.pathname!==`/`}catch{return!1}}async function il(e,t,n){let r=Ec(e);if(t.validateResourceURL)return await t.validateResourceURL(r,n?.resource);if(n){if(!Dc({requestedResource:r,configuredResource:n.resource}))throw Error(`Protected resource ${n.resource} does not match expected ${r} (or origin)`);return new URL(n.resource)}}function al(e){let t=e.headers.get(`WWW-Authenticate`);if(!t)return{};let[n,r]=t.split(` `);if(n.toLowerCase()!==`bearer`||!r)return{};let i=ol(e,`resource_metadata`)||void 0,a;if(i)try{a=new URL(i)}catch{}let o=ol(e,`scope`)||void 0,s=ol(e,`error`)||void 0;return{resourceMetadataUrl:a,scope:o,error:s}}function ol(e,t){let n=e.headers.get(`WWW-Authenticate`);if(!n)return null;let r=RegExp(`${t}=(?:"([^"]+)"|([^\\s,]+))`),i=n.match(r);return i?i[1]||i[2]:null}async function sl(e,t,n=fetch){let r=await fl(e,`oauth-protected-resource`,n,{protocolVersion:t?.protocolVersion,metadataUrl:t?.resourceMetadataUrl});if(!r||r.status===404)throw await r?.body?.cancel(),Error(`Resource server does not implement OAuth 2.0 Protected Resource Metadata.`);if(!r.ok)throw await r.body?.cancel(),Error(`HTTP ${r.status} trying to load well-known OAuth protected resource metadata.`);return _c.parse(await r.json())}async function cl(e,t,n=fetch){try{return await n(e,{headers:t})}catch(r){if(r instanceof TypeError)return t?cl(e,void 0,n):void 0;throw r}}function ll(e,t=``,n={}){return t.endsWith(`/`)&&(t=t.slice(0,-1)),n.prependPathname?`${t}/.well-known/${e}`:`/.well-known/${e}${t}`}async function ul(e,t,n=fetch){return await cl(e,{"MCP-Protocol-Version":t},n)}function dl(e,t){return!e||e.status>=400&&e.status<500&&t!==`/`}async function fl(e,t,n,r){let i=new URL(e),a=r?.protocolVersion??`2025-11-25`,o;if(r?.metadataUrl)o=new URL(r.metadataUrl);else{let e=ll(t,i.pathname);o=new URL(e,r?.metadataServerUrl??i),o.search=i.search}let s=await ul(o,a,n);return!r?.metadataUrl&&dl(s,i.pathname)&&(s=await ul(new URL(`/.well-known/${t}`,i),a,n)),s}function pl(e){let t=typeof e==`string`?new URL(e):e,n=t.pathname!==`/`,r=[];if(!n)return r.push({url:new URL(`/.well-known/oauth-authorization-server`,t.origin),type:`oauth`}),r.push({url:new URL(`/.well-known/openid-configuration`,t.origin),type:`oidc`}),r;let i=t.pathname;return i.endsWith(`/`)&&(i=i.slice(0,-1)),r.push({url:new URL(`/.well-known/oauth-authorization-server${i}`,t.origin),type:`oauth`}),r.push({url:new URL(`/.well-known/openid-configuration${i}`,t.origin),type:`oidc`}),r.push({url:new URL(`${i}/.well-known/openid-configuration`,t.origin),type:`oidc`}),r}async function ml(e,{fetchFn:t=fetch,protocolVersion:n=lt}={}){let r={"MCP-Protocol-Version":n,Accept:`application/json`},i=pl(e);for(let{url:e,type:n}of i){let i=await cl(e,r,t);if(i){if(!i.ok){if(await i.body?.cancel(),i.status>=400&&i.status<500)continue;throw Error(`HTTP ${i.status} trying to load ${n===`oauth`?`OAuth`:`OpenID provider`} metadata from ${e}`)}return n===`oauth`?vc.parse(await i.json()):yc.parse(await i.json())}}}async function hl(e,t){let n,r;try{n=await sl(e,{resourceMetadataUrl:t?.resourceMetadataUrl},t?.fetchFn),n.authorization_servers&&n.authorization_servers.length>0&&(r=n.authorization_servers[0])}catch{}r||=String(new URL(`/`,e));let i=await ml(r,{fetchFn:t?.fetchFn});return{authorizationServerUrl:r,authorizationServerMetadata:i,resourceMetadata:n}}async function gl(e,{metadata:t,clientInformation:n,redirectUrl:r,scope:i,state:a,resource:o}){let s;if(t){if(s=new URL(t.authorization_endpoint),!t.response_types_supported.includes(qc))throw Error(`Incompatible auth server: does not support response type ${qc}`);if(t.code_challenge_methods_supported&&!t.code_challenge_methods_supported.includes(Jc))throw Error(`Incompatible auth server: does not support code challenge method ${Jc}`)}else s=new URL(`/authorize`,e);let c=await gc(),l=c.code_verifier,u=c.code_challenge;return s.searchParams.set(`response_type`,qc),s.searchParams.set(`client_id`,n.client_id),s.searchParams.set(`code_challenge`,u),s.searchParams.set(`code_challenge_method`,Jc),s.searchParams.set(`redirect_uri`,String(r)),a&&s.searchParams.set(`state`,a),i&&s.searchParams.set(`scope`,i),i?.includes(`offline_access`)&&s.searchParams.append(`prompt`,`consent`),o&&s.searchParams.set(`resource`,o.href),{authorizationUrl:s,codeVerifier:l}}function _l(e,t,n){return new URLSearchParams({grant_type:`authorization_code`,code:e,code_verifier:t,redirect_uri:String(n)})}async function vl(e,{metadata:t,tokenRequestParams:n,clientInformation:r,addClientAuthentication:i,resource:a,fetchFn:o}){let s=t?.token_endpoint?new URL(t.token_endpoint):new URL(`/token`,e),c=new Headers({"Content-Type":`application/x-www-form-urlencoded`,Accept:`application/json`});a&&n.set(`resource`,a.href),i?await i(c,n,s,t):r&&Xc(Yc(r,t?.token_endpoint_auth_methods_supported??[]),r,c,n);let l=await(o??fetch)(s,{method:`POST`,headers:c,body:n});if(!l.ok)throw await el(l);return bc.parse(await l.json())}async function yl(e,{metadata:t,clientInformation:n,refreshToken:r,resource:i,addClientAuthentication:a,fetchFn:o}){return{refresh_token:r,...await vl(e,{metadata:t,tokenRequestParams:new URLSearchParams({grant_type:`refresh_token`,refresh_token:r}),clientInformation:n,addClientAuthentication:a,resource:i,fetchFn:o})}}async function bl(e,t,{metadata:n,resource:r,authorizationCode:i,fetchFn:a}={}){let o=e.clientMetadata.scope,s;if(e.prepareTokenRequest&&(s=await e.prepareTokenRequest(o)),!s){if(!i)throw Error(`Either provider.prepareTokenRequest() or authorizationCode is required`);if(!e.redirectUrl)throw Error(`redirectUrl is required for authorization_code flow`);s=_l(i,await e.codeVerifier(),e.redirectUrl)}let c=await e.clientInformation();return vl(t,{metadata:n,tokenRequestParams:s,clientInformation:c??void 0,addClientAuthentication:e.addClientAuthentication,resource:r,fetchFn:a})}async function xl(e,{metadata:t,clientMetadata:n,scope:r,fetchFn:i}){let a;if(t){if(!t.registration_endpoint)throw Error(`Incompatible auth server: does not support dynamic client registration`);a=new URL(t.registration_endpoint)}else a=new URL(`/register`,e);let o=await(i??fetch)(a,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({...n,...r===void 0?{}:{scope:r}})});if(!o.ok)throw await el(o);return Tc.parse(await o.json())}var Sl=class extends Error{constructor(e,t){super(e),this.name=`ParseError`,this.type=t.type,this.field=t.field,this.value=t.value,this.line=t.line}};function Cl(e){}function wl(e){if(typeof e==`function`)throw TypeError("`config` must be an object, got a function instead. Did you mean `createParser({onEvent: fn})`?");let{onEvent:t=Cl,onError:n=Cl,onRetry:r=Cl,onComment:i,maxBufferSize:a}=e,o=[],s=0,c=!0,l,u=``,d=0,f,p=!1;function m(e){if(p)throw Error("Cannot feed parser: it was terminated after exceeding the configured max buffer size. Call `reset()` to resume parsing.");if(c&&(c=!1,e.charCodeAt(0)===239&&e.charCodeAt(1)===187&&e.charCodeAt(2)===191&&(e=e.slice(3))),o.length===0){let t=g(e);t!==``&&(o.push(t),s=t.length),h();return}if(e.indexOf(`
|
|
52
|
+
`}var rc=class{constructor(e=cr.stdin,t=cr.stdout){this._stdin=e,this._stdout=t,this._readBuffer=new ec,this._started=!1,this._ondata=e=>{this._readBuffer.append(e),this.processReadBuffer()},this._onerror=e=>{this.onerror?.(e)}}async start(){if(this._started)throw Error(`StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.`);this._started=!0,this._stdin.on(`data`,this._ondata),this._stdin.on(`error`,this._onerror)}processReadBuffer(){for(;;)try{let e=this._readBuffer.readMessage();if(e===null)break;this.onmessage?.(e)}catch(e){this.onerror?.(e)}}async close(){this._stdin.off(`data`,this._ondata),this._stdin.off(`error`,this._onerror),this._stdin.listenerCount(`data`)===0&&this._stdin.pause(),this._readBuffer.clear(),this.onclose?.()}send(e){return new Promise(t=>{let n=nc(e);this._stdout.write(n)?t():this._stdout.once(`drain`,t)})}};function ic(e){if(e.platform!==`darwin`)return{kind:`unchanged`};let t;try{t=e.realpath(e.bundleAnchorPath)}catch(e){return{kind:`unreadable`,reason:e instanceof Error?e.message:String(e)}}let n;try{n=e.statInode(t)}catch(e){return{kind:`unreadable`,reason:e instanceof Error?e.message:String(e)}}return n===e.currentInode?{kind:`unchanged`}:{kind:`replaced`,currentInode:e.currentInode,onDiskInode:n}}function ac(e){let t=e.setInterval??setInterval,n=e.clearInterval??clearInterval,r=e.intervalMs??3e5,i=!0,a=!1,o=!1,s=t(()=>{if(!i)return;let t;try{t=e.detect()}catch(t){e.log(`bundle identity check threw unexpectedly (contract violation): ${t instanceof Error?t.message:String(t)}`);return}if(t.kind===`unreadable`){o||(o=!0,e.log(`bundle identity check unreadable${t.reason?`: ${t.reason}`:``} — will retry on next tick`));return}o&&(o=!1,e.log(`bundle identity check recovered from unreadable`)),t.kind!==`unchanged`&&(i=!1,e.onReplaced(t))},r);return typeof s.unref==`function`&&s.unref(),{stop:()=>{a||(a=!0,i=!1,n(s))}}}function oc(e,t){let n;try{n=t.realpathSync(e)}catch(e){t.log(`[mcp] bundle identity boot capture unreadable (realpath failed): ${e instanceof Error?e.message:String(e)}`);return}let r;try{r=t.statInoSync(n)}catch(e){t.log(`[mcp] bundle identity boot capture unreadable (stat failed): ${e instanceof Error?e.message:String(e)}`);return}return{resolvedPath:n,inode:r}}function sc(e){let t=e.scheduler??{setInterval:(e,t)=>globalThis.setInterval(e,t),clearInterval:e=>globalThis.clearInterval(e)},n=e.getPpid();if(n<=1)return{stop:()=>{}};let r=!1,i=t.setInterval(()=>{if(r)return;let a=e.getPpid();a!==n&&(r=!0,t.clearInterval(i),e.onHostGone(`host process exited (ppid ${n} -> ${a})`))},e.intervalMs??1e3);return i.unref?.(),{stop:()=>t.clearInterval(i)}}function cc(e){let t=t=>{try{e.log(t)}catch{}},n=e.transport.onclose;e.transport.onclose=()=>{t(`[mcp] stdio transport closed (internal shutdown)`),n?.()},e.stdin.once(`end`,()=>t(`[mcp] stdin EOF (host closed pipe)`)),e.stdin.once(`close`,()=>t(`[mcp] stdin closed`)),e.process.on(`exit`,e=>{t(`[mcp] exit code=${e}`)}),e.process.on(`uncaughtExceptionMonitor`,(e,n)=>{t(`[mcp] uncaughtException origin=${n}: ${e instanceof Error?e.stack??e.message:String(e)}`)})}function lc(e){return e?e instanceof Headers?Object.fromEntries(e.entries()):Array.isArray(e)?Object.fromEntries(e):{...e}:{}}function uc(e=fetch,t){return t?async(n,r)=>e(n,{...t,...r,headers:r?.headers?{...lc(t.headers),...lc(r.headers)}:t.headers}):e}let dc;dc=globalThis.crypto?.webcrypto??globalThis.crypto??import(`node:crypto`).then(e=>e.webcrypto);async function fc(e){return(await dc).getRandomValues(new Uint8Array(e))}async function pc(e){let t=``;for(;t.length<e;){let n=await fc(e-t.length);for(let e of n)e<198&&(t+=`abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~`[e%66])}return t}async function mc(e){return await pc(e)}async function hc(e){let t=await(await dc).subtle.digest(`SHA-256`,new TextEncoder().encode(e));return btoa(String.fromCharCode(...new Uint8Array(t))).replace(/\//g,`_`).replace(/\+/g,`-`).replace(/=/g,``)}async function gc(e){if(e||=43,e<43||e>128)throw`Expected a length between 43 and 128. Received ${e}.`;let t=await mc(e);return{code_verifier:t,code_challenge:await hc(t)}}const J=s().superRefine((e,t)=>{if(!URL.canParse(e))return t.addIssue({code:Ar.custom,message:`URL must be parseable`,fatal:!0}),v}).refine(e=>{let t=new URL(e);return t.protocol!==`javascript:`&&t.protocol!==`data:`&&t.protocol!==`vbscript:`},{message:`URL cannot use javascript:, data:, or vbscript: scheme`}),_c=g({resource:r().url(),authorization_servers:y(J).optional(),jwks_uri:r().url().optional(),scopes_supported:y(r()).optional(),bearer_methods_supported:y(r()).optional(),resource_signing_alg_values_supported:y(r()).optional(),resource_name:r().optional(),resource_documentation:r().optional(),resource_policy_uri:r().url().optional(),resource_tos_uri:r().url().optional(),tls_client_certificate_bound_access_tokens:c().optional(),authorization_details_types_supported:y(r()).optional(),dpop_signing_alg_values_supported:y(r()).optional(),dpop_bound_access_tokens_required:c().optional()}),vc=g({issuer:r(),authorization_endpoint:J,token_endpoint:J,registration_endpoint:J.optional(),scopes_supported:y(r()).optional(),response_types_supported:y(r()),response_modes_supported:y(r()).optional(),grant_types_supported:y(r()).optional(),token_endpoint_auth_methods_supported:y(r()).optional(),token_endpoint_auth_signing_alg_values_supported:y(r()).optional(),service_documentation:J.optional(),revocation_endpoint:J.optional(),revocation_endpoint_auth_methods_supported:y(r()).optional(),revocation_endpoint_auth_signing_alg_values_supported:y(r()).optional(),introspection_endpoint:r().optional(),introspection_endpoint_auth_methods_supported:y(r()).optional(),introspection_endpoint_auth_signing_alg_values_supported:y(r()).optional(),code_challenge_methods_supported:y(r()).optional(),client_id_metadata_document_supported:c().optional()}),yc=h({...g({issuer:r(),authorization_endpoint:J,token_endpoint:J,userinfo_endpoint:J.optional(),jwks_uri:J,registration_endpoint:J.optional(),scopes_supported:y(r()).optional(),response_types_supported:y(r()),response_modes_supported:y(r()).optional(),grant_types_supported:y(r()).optional(),acr_values_supported:y(r()).optional(),subject_types_supported:y(r()),id_token_signing_alg_values_supported:y(r()),id_token_encryption_alg_values_supported:y(r()).optional(),id_token_encryption_enc_values_supported:y(r()).optional(),userinfo_signing_alg_values_supported:y(r()).optional(),userinfo_encryption_alg_values_supported:y(r()).optional(),userinfo_encryption_enc_values_supported:y(r()).optional(),request_object_signing_alg_values_supported:y(r()).optional(),request_object_encryption_alg_values_supported:y(r()).optional(),request_object_encryption_enc_values_supported:y(r()).optional(),token_endpoint_auth_methods_supported:y(r()).optional(),token_endpoint_auth_signing_alg_values_supported:y(r()).optional(),display_values_supported:y(r()).optional(),claim_types_supported:y(r()).optional(),claims_supported:y(r()).optional(),service_documentation:r().optional(),claims_locales_supported:y(r()).optional(),ui_locales_supported:y(r()).optional(),claims_parameter_supported:c().optional(),request_parameter_supported:c().optional(),request_uri_parameter_supported:c().optional(),require_request_uri_registration:c().optional(),op_policy_uri:J.optional(),op_tos_uri:J.optional(),client_id_metadata_document_supported:c().optional()}).shape,...vc.pick({code_challenge_methods_supported:!0}).shape}),bc=h({access_token:r(),id_token:r().optional(),token_type:r(),expires_in:Mr().optional(),scope:r().optional(),refresh_token:r().optional()}).strip(),xc=h({error:r(),error_description:r().optional(),error_uri:r().optional()}),Sc=J.optional().or(o(``).transform(()=>void 0)),Cc=h({redirect_uris:y(J),token_endpoint_auth_method:r().optional(),grant_types:y(r()).optional(),response_types:y(r()).optional(),client_name:r().optional(),client_uri:J.optional(),logo_uri:Sc,scope:r().optional(),contacts:y(r()).optional(),tos_uri:Sc,policy_uri:r().optional(),jwks_uri:J.optional(),jwks:d().optional(),software_id:r().optional(),software_version:r().optional(),software_statement:r().optional()}).strip(),wc=h({client_id:r(),client_secret:r().optional(),client_id_issued_at:t().optional(),client_secret_expires_at:t().optional()}).strip(),Tc=Cc.merge(wc);h({error:r(),error_description:r().optional()}).strip(),h({token:r(),token_type_hint:r().optional()}).strip();function Ec(e){let t=typeof e==`string`?new URL(e):new URL(e.href);return t.hash=``,t}function Dc({requestedResource:e,configuredResource:t}){let n=typeof e==`string`?new URL(e):new URL(e.href),r=typeof t==`string`?new URL(t):new URL(t.href);if(n.origin!==r.origin||n.pathname.length<r.pathname.length)return!1;let i=n.pathname.endsWith(`/`)?n.pathname:n.pathname+`/`,a=r.pathname.endsWith(`/`)?r.pathname:r.pathname+`/`;return i.startsWith(a)}var Y=class extends Error{constructor(e,t){super(e),this.errorUri=t,this.name=this.constructor.name}toResponseObject(){let e={error:this.errorCode,error_description:this.message};return this.errorUri&&(e.error_uri=this.errorUri),e}get errorCode(){return this.constructor.errorCode}},Oc=class extends Y{};Oc.errorCode=`invalid_request`;var kc=class extends Y{};kc.errorCode=`invalid_client`;var Ac=class extends Y{};Ac.errorCode=`invalid_grant`;var jc=class extends Y{};jc.errorCode=`unauthorized_client`;var Mc=class extends Y{};Mc.errorCode=`unsupported_grant_type`;var Nc=class extends Y{};Nc.errorCode=`invalid_scope`;var Pc=class extends Y{};Pc.errorCode=`access_denied`;var X=class extends Y{};X.errorCode=`server_error`;var Fc=class extends Y{};Fc.errorCode=`temporarily_unavailable`;var Ic=class extends Y{};Ic.errorCode=`unsupported_response_type`;var Lc=class extends Y{};Lc.errorCode=`unsupported_token_type`;var Rc=class extends Y{};Rc.errorCode=`invalid_token`;var zc=class extends Y{};zc.errorCode=`method_not_allowed`;var Bc=class extends Y{};Bc.errorCode=`too_many_requests`;var Vc=class extends Y{};Vc.errorCode=`invalid_client_metadata`;var Hc=class extends Y{};Hc.errorCode=`insufficient_scope`;var Uc=class extends Y{};Uc.errorCode=`invalid_target`;const Wc={[Oc.errorCode]:Oc,[kc.errorCode]:kc,[Ac.errorCode]:Ac,[jc.errorCode]:jc,[Mc.errorCode]:Mc,[Nc.errorCode]:Nc,[Pc.errorCode]:Pc,[X.errorCode]:X,[Fc.errorCode]:Fc,[Ic.errorCode]:Ic,[Lc.errorCode]:Lc,[Rc.errorCode]:Rc,[zc.errorCode]:zc,[Bc.errorCode]:Bc,[Vc.errorCode]:Vc,[Hc.errorCode]:Hc,[Uc.errorCode]:Uc};var Gc=class extends Error{constructor(e){super(e??`Unauthorized`)}};function Kc(e){return[`client_secret_basic`,`client_secret_post`,`none`].includes(e)}const qc=`code`,Jc=`S256`;function Yc(e,t){let n=e.client_secret!==void 0;return`token_endpoint_auth_method`in e&&e.token_endpoint_auth_method&&Kc(e.token_endpoint_auth_method)&&(t.length===0||t.includes(e.token_endpoint_auth_method))?e.token_endpoint_auth_method:t.length===0?n?`client_secret_basic`:`none`:n&&t.includes(`client_secret_basic`)?`client_secret_basic`:n&&t.includes(`client_secret_post`)?`client_secret_post`:t.includes(`none`)?`none`:n?`client_secret_post`:`none`}function Xc(e,t,n,r){let{client_id:i,client_secret:a}=t;switch(e){case`client_secret_basic`:Zc(i,a,n);return;case`client_secret_post`:Qc(i,a,r);return;case`none`:$c(i,r);return;default:throw Error(`Unsupported client authentication method: ${e}`)}}function Zc(e,t,n){if(!t)throw Error(`client_secret_basic authentication requires a client_secret`);let r=btoa(`${e}:${t}`);n.set(`Authorization`,`Basic ${r}`)}function Qc(e,t,n){n.set(`client_id`,e),t&&n.set(`client_secret`,t)}function $c(e,t){t.set(`client_id`,e)}async function el(e){let t=e instanceof Response?e.status:void 0,n=e instanceof Response?await e.text():e;try{let{error:e,error_description:t,error_uri:r}=xc.parse(JSON.parse(n));return new(Wc[e]||X)(t||``,r)}catch(e){return new X(`${t?`HTTP ${t}: `:``}Invalid OAuth error response: ${e}. Raw body: ${n}`)}}async function tl(e,t){try{return await nl(e,t)}catch(n){if(n instanceof kc||n instanceof jc)return await e.invalidateCredentials?.(`all`),await nl(e,t);if(n instanceof Ac)return await e.invalidateCredentials?.(`tokens`),await nl(e,t);throw n}}async function nl(e,{serverUrl:t,authorizationCode:n,scope:r,resourceMetadataUrl:i,fetchFn:a}){let o=await e.discoveryState?.(),s,c,l,u=i;if(!u&&o?.resourceMetadataUrl&&(u=new URL(o.resourceMetadataUrl)),o?.authorizationServerUrl){if(c=o.authorizationServerUrl,s=o.resourceMetadata,l=o.authorizationServerMetadata??await ml(c,{fetchFn:a}),!s)try{s=await sl(t,{resourceMetadataUrl:u},a)}catch{}(l!==o.authorizationServerMetadata||s!==o.resourceMetadata)&&await e.saveDiscoveryState?.({authorizationServerUrl:String(c),resourceMetadataUrl:u?.toString(),resourceMetadata:s,authorizationServerMetadata:l})}else{let n=await hl(t,{resourceMetadataUrl:u,fetchFn:a});c=n.authorizationServerUrl,l=n.authorizationServerMetadata,s=n.resourceMetadata,await e.saveDiscoveryState?.({authorizationServerUrl:String(c),resourceMetadataUrl:u?.toString(),resourceMetadata:s,authorizationServerMetadata:l})}let d=await il(t,e,s),f=r||s?.scopes_supported?.join(` `)||e.clientMetadata.scope,p=await Promise.resolve(e.clientInformation());if(!p){if(n!==void 0)throw Error(`Existing OAuth client information is required when exchanging an authorization code`);let t=l?.client_id_metadata_document_supported===!0,r=e.clientMetadataUrl;if(r&&!rl(r))throw new Vc(`clientMetadataUrl must be a valid HTTPS URL with a non-root pathname, got: ${r}`);if(t&&r)p={client_id:r},await e.saveClientInformation?.(p);else{if(!e.saveClientInformation)throw Error(`OAuth client information must be saveable for dynamic registration`);let t=await xl(c,{metadata:l,clientMetadata:e.clientMetadata,scope:f,fetchFn:a});await e.saveClientInformation(t),p=t}}let m=!e.redirectUrl;if(n!==void 0||m){let t=await bl(e,c,{metadata:l,resource:d,authorizationCode:n,fetchFn:a});return await e.saveTokens(t),`AUTHORIZED`}let h=await e.tokens();if(h?.refresh_token)try{let t=await yl(c,{metadata:l,clientInformation:p,refreshToken:h.refresh_token,resource:d,addClientAuthentication:e.addClientAuthentication,fetchFn:a});return await e.saveTokens(t),`AUTHORIZED`}catch(e){if(!(!(e instanceof Y)||e instanceof X))throw e}let g=e.state?await e.state():void 0,{authorizationUrl:_,codeVerifier:v}=await gl(c,{metadata:l,clientInformation:p,state:g,redirectUrl:e.redirectUrl,scope:f,resource:d});return await e.saveCodeVerifier(v),await e.redirectToAuthorization(_),`REDIRECT`}function rl(e){if(!e)return!1;try{let t=new URL(e);return t.protocol===`https:`&&t.pathname!==`/`}catch{return!1}}async function il(e,t,n){let r=Ec(e);if(t.validateResourceURL)return await t.validateResourceURL(r,n?.resource);if(n){if(!Dc({requestedResource:r,configuredResource:n.resource}))throw Error(`Protected resource ${n.resource} does not match expected ${r} (or origin)`);return new URL(n.resource)}}function al(e){let t=e.headers.get(`WWW-Authenticate`);if(!t)return{};let[n,r]=t.split(` `);if(n.toLowerCase()!==`bearer`||!r)return{};let i=ol(e,`resource_metadata`)||void 0,a;if(i)try{a=new URL(i)}catch{}let o=ol(e,`scope`)||void 0,s=ol(e,`error`)||void 0;return{resourceMetadataUrl:a,scope:o,error:s}}function ol(e,t){let n=e.headers.get(`WWW-Authenticate`);if(!n)return null;let r=RegExp(`${t}=(?:"([^"]+)"|([^\\s,]+))`),i=n.match(r);return i?i[1]||i[2]:null}async function sl(e,t,n=fetch){let r=await fl(e,`oauth-protected-resource`,n,{protocolVersion:t?.protocolVersion,metadataUrl:t?.resourceMetadataUrl});if(!r||r.status===404)throw await r?.body?.cancel(),Error(`Resource server does not implement OAuth 2.0 Protected Resource Metadata.`);if(!r.ok)throw await r.body?.cancel(),Error(`HTTP ${r.status} trying to load well-known OAuth protected resource metadata.`);return _c.parse(await r.json())}async function cl(e,t,n=fetch){try{return await n(e,{headers:t})}catch(r){if(r instanceof TypeError)return t?cl(e,void 0,n):void 0;throw r}}function ll(e,t=``,n={}){return t.endsWith(`/`)&&(t=t.slice(0,-1)),n.prependPathname?`${t}/.well-known/${e}`:`/.well-known/${e}${t}`}async function ul(e,t,n=fetch){return await cl(e,{"MCP-Protocol-Version":t},n)}function dl(e,t){return!e||e.status>=400&&e.status<500&&t!==`/`}async function fl(e,t,n,r){let i=new URL(e),a=r?.protocolVersion??`2025-11-25`,o;if(r?.metadataUrl)o=new URL(r.metadataUrl);else{let e=ll(t,i.pathname);o=new URL(e,r?.metadataServerUrl??i),o.search=i.search}let s=await ul(o,a,n);return!r?.metadataUrl&&dl(s,i.pathname)&&(s=await ul(new URL(`/.well-known/${t}`,i),a,n)),s}function pl(e){let t=typeof e==`string`?new URL(e):e,n=t.pathname!==`/`,r=[];if(!n)return r.push({url:new URL(`/.well-known/oauth-authorization-server`,t.origin),type:`oauth`}),r.push({url:new URL(`/.well-known/openid-configuration`,t.origin),type:`oidc`}),r;let i=t.pathname;return i.endsWith(`/`)&&(i=i.slice(0,-1)),r.push({url:new URL(`/.well-known/oauth-authorization-server${i}`,t.origin),type:`oauth`}),r.push({url:new URL(`/.well-known/openid-configuration${i}`,t.origin),type:`oidc`}),r.push({url:new URL(`${i}/.well-known/openid-configuration`,t.origin),type:`oidc`}),r}async function ml(e,{fetchFn:t=fetch,protocolVersion:n=lt}={}){let r={"MCP-Protocol-Version":n,Accept:`application/json`},i=pl(e);for(let{url:e,type:n}of i){let i=await cl(e,r,t);if(i){if(!i.ok){if(await i.body?.cancel(),i.status>=400&&i.status<500)continue;throw Error(`HTTP ${i.status} trying to load ${n===`oauth`?`OAuth`:`OpenID provider`} metadata from ${e}`)}return n===`oauth`?vc.parse(await i.json()):yc.parse(await i.json())}}}async function hl(e,t){let n,r;try{n=await sl(e,{resourceMetadataUrl:t?.resourceMetadataUrl},t?.fetchFn),n.authorization_servers&&n.authorization_servers.length>0&&(r=n.authorization_servers[0])}catch{}r||=String(new URL(`/`,e));let i=await ml(r,{fetchFn:t?.fetchFn});return{authorizationServerUrl:r,authorizationServerMetadata:i,resourceMetadata:n}}async function gl(e,{metadata:t,clientInformation:n,redirectUrl:r,scope:i,state:a,resource:o}){let s;if(t){if(s=new URL(t.authorization_endpoint),!t.response_types_supported.includes(qc))throw Error(`Incompatible auth server: does not support response type ${qc}`);if(t.code_challenge_methods_supported&&!t.code_challenge_methods_supported.includes(Jc))throw Error(`Incompatible auth server: does not support code challenge method ${Jc}`)}else s=new URL(`/authorize`,e);let c=await gc(),l=c.code_verifier,u=c.code_challenge;return s.searchParams.set(`response_type`,qc),s.searchParams.set(`client_id`,n.client_id),s.searchParams.set(`code_challenge`,u),s.searchParams.set(`code_challenge_method`,Jc),s.searchParams.set(`redirect_uri`,String(r)),a&&s.searchParams.set(`state`,a),i&&s.searchParams.set(`scope`,i),i?.includes(`offline_access`)&&s.searchParams.append(`prompt`,`consent`),o&&s.searchParams.set(`resource`,o.href),{authorizationUrl:s,codeVerifier:l}}function _l(e,t,n){return new URLSearchParams({grant_type:`authorization_code`,code:e,code_verifier:t,redirect_uri:String(n)})}async function vl(e,{metadata:t,tokenRequestParams:n,clientInformation:r,addClientAuthentication:i,resource:a,fetchFn:o}){let s=t?.token_endpoint?new URL(t.token_endpoint):new URL(`/token`,e),c=new Headers({"Content-Type":`application/x-www-form-urlencoded`,Accept:`application/json`});a&&n.set(`resource`,a.href),i?await i(c,n,s,t):r&&Xc(Yc(r,t?.token_endpoint_auth_methods_supported??[]),r,c,n);let l=await(o??fetch)(s,{method:`POST`,headers:c,body:n});if(!l.ok)throw await el(l);return bc.parse(await l.json())}async function yl(e,{metadata:t,clientInformation:n,refreshToken:r,resource:i,addClientAuthentication:a,fetchFn:o}){return{refresh_token:r,...await vl(e,{metadata:t,tokenRequestParams:new URLSearchParams({grant_type:`refresh_token`,refresh_token:r}),clientInformation:n,addClientAuthentication:a,resource:i,fetchFn:o})}}async function bl(e,t,{metadata:n,resource:r,authorizationCode:i,fetchFn:a}={}){let o=e.clientMetadata.scope,s;if(e.prepareTokenRequest&&(s=await e.prepareTokenRequest(o)),!s){if(!i)throw Error(`Either provider.prepareTokenRequest() or authorizationCode is required`);if(!e.redirectUrl)throw Error(`redirectUrl is required for authorization_code flow`);s=_l(i,await e.codeVerifier(),e.redirectUrl)}let c=await e.clientInformation();return vl(t,{metadata:n,tokenRequestParams:s,clientInformation:c??void 0,addClientAuthentication:e.addClientAuthentication,resource:r,fetchFn:a})}async function xl(e,{metadata:t,clientMetadata:n,scope:r,fetchFn:i}){let a;if(t){if(!t.registration_endpoint)throw Error(`Incompatible auth server: does not support dynamic client registration`);a=new URL(t.registration_endpoint)}else a=new URL(`/register`,e);let o=await(i??fetch)(a,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({...n,...r===void 0?{}:{scope:r}})});if(!o.ok)throw await el(o);return Tc.parse(await o.json())}var Sl=class extends Error{constructor(e,t){super(e),this.name=`ParseError`,this.type=t.type,this.field=t.field,this.value=t.value,this.line=t.line}};function Cl(e){}function wl(e){if(typeof e==`function`)throw TypeError("`config` must be an object, got a function instead. Did you mean `createParser({onEvent: fn})`?");let{onEvent:t=Cl,onError:n=Cl,onRetry:r=Cl,onComment:i,maxBufferSize:a}=e,o=[],s=0,c=!0,l,u=``,d=0,f,p=!1;function m(e){if(p)throw Error("Cannot feed parser: it was terminated after exceeding the configured max buffer size. Call `reset()` to resume parsing.");if(c&&(c=!1,e.charCodeAt(0)===239&&e.charCodeAt(1)===187&&e.charCodeAt(2)===191&&(e=e.slice(3))),o.length===0){let t=g(e);t!==``&&(o.push(t),s=t.length),h();return}if(e.indexOf(`
|
|
53
53
|
`)===-1&&e.indexOf(`\r`)===-1){o.push(e),s+=e.length,h();return}o.push(e);let t=o.join(``);o.length=0,s=0;let n=g(t);n!==``&&(o.push(n),s=n.length),h()}function h(){a!==void 0&&(s+u.length<=a||(p=!0,o.length=0,s=0,l=void 0,u=``,d=0,f=void 0,n(new Sl(`Buffered data exceeded max buffer size of ${a} characters`,{type:`max-buffer-size-exceeded`}))))}function g(e){let n=0;if(e.indexOf(`\r`)===-1){let r=e.indexOf(`
|
|
54
54
|
`,n);for(;r!==-1;){if(n===r){d>0&&t({id:l,event:f,data:u}),l=void 0,u=``,d=0,f=void 0,n=r+1,r=e.indexOf(`
|
|
55
55
|
`,n);continue}let i=e.charCodeAt(n);if(Tl(e,n,i)){let i=e.charCodeAt(n+5)===32?n+6:n+5,a=e.slice(i,r);if(d===0&&e.charCodeAt(r+1)===10){t({id:l,event:f,data:a}),l=void 0,u=``,f=void 0,n=r+2,r=e.indexOf(`
|
|
@@ -59,7 +59,7 @@ ${a}`,d++}else El(e,n,i)?f=e.slice(e.charCodeAt(n+6)===32?n+7:n+6,r)||void 0:_(e
|
|
|
59
59
|
`,n),i=-1;if(t!==-1&&r!==-1?i=t<r?t:r:t===-1?r!==-1&&(i=r):i=t===e.length-1?-1:t,i===-1)break;_(e,n,i),n=i+1,e.charCodeAt(n-1)===13&&e.charCodeAt(n)===10&&n++}return e.slice(n)}function _(e,t,n){if(t===n){y();return}let r=e.charCodeAt(t);if(Tl(e,t,r)){let r=e.charCodeAt(t+5)===32?t+6:t+5,i=e.slice(r,n);u=d===0?i:`${u}
|
|
60
60
|
${i}`,d++;return}if(El(e,t,r)){f=e.slice(e.charCodeAt(t+6)===32?t+7:t+6,n)||void 0;return}if(r===105&&e.charCodeAt(t+1)===100&&e.charCodeAt(t+2)===58){let r=e.slice(e.charCodeAt(t+3)===32?t+4:t+3,n);l=r.includes(`\0`)?void 0:r;return}if(r===58){i&&i(e.slice(t,n).slice(e.charCodeAt(t+1)===32?2:1));return}let a=e.slice(t,n),o=a.indexOf(`:`);if(o===-1){v(a,``,a);return}let s=a.slice(0,o),c=a.charCodeAt(o+1)===32?2:1;v(s,a.slice(o+c),a)}function v(e,t,i){switch(e){case`event`:f=t||void 0;break;case`data`:u=d===0?t:`${u}
|
|
61
61
|
${t}`,d++;break;case`id`:l=t.includes(`\0`)?void 0:t;break;case`retry`:/^\d+$/.test(t)?r(parseInt(t,10)):n(new Sl(`Invalid \`retry\` value: "${t}"`,{type:`invalid-retry`,value:t,line:i}));break;default:n(new Sl(`Unknown field "${e.length>20?`${e.slice(0,20)}\u2026`:e}"`,{type:`unknown-field`,field:e,value:t,line:i}));break}}function y(){d>0&&t({id:l,event:f,data:u}),l=void 0,u=``,d=0,f=void 0}function b(e={}){if(e.consume&&o.length>0){let e=o.join(``);_(e,0,e.length)}c=!0,l=void 0,u=``,d=0,f=void 0,o.length=0,s=0,p=!1}return{feed:m,reset:b}}function Tl(e,t,n){return n===100&&e.charCodeAt(t+1)===97&&e.charCodeAt(t+2)===116&&e.charCodeAt(t+3)===97&&e.charCodeAt(t+4)===58}function El(e,t,n){return n===101&&e.charCodeAt(t+1)===118&&e.charCodeAt(t+2)===101&&e.charCodeAt(t+3)===110&&e.charCodeAt(t+4)===116&&e.charCodeAt(t+5)===58}var Dl=class extends TransformStream{constructor({onError:e,onRetry:t,onComment:n,maxBufferSize:r}={}){let i;super({start(a){i=wl({onEvent:e=>{a.enqueue(e)},onError(t){typeof e==`function`&&e(t),(e===`terminate`||t.type===`max-buffer-size-exceeded`)&&a.error(t)},onRetry:t,onComment:n,maxBufferSize:r})},transform(e){i.feed(e)}})}};const Ol={initialReconnectionDelay:1e3,maxReconnectionDelay:3e4,reconnectionDelayGrowFactor:1.5,maxRetries:2};var kl=class extends Error{constructor(e,t){super(`Streamable HTTP error: ${t}`),this.code=e}},Al=class{constructor(e,t){this._hasCompletedAuthFlow=!1,this._url=e,this._resourceMetadataUrl=void 0,this._scope=void 0,this._requestInit=t?.requestInit,this._authProvider=t?.authProvider,this._fetch=t?.fetch,this._fetchWithInit=uc(t?.fetch,t?.requestInit),this._sessionId=t?.sessionId,this._reconnectionOptions=t?.reconnectionOptions??Ol}async _authThenStart(){if(!this._authProvider)throw new Gc(`No auth provider`);let e;try{e=await tl(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})}catch(e){throw this.onerror?.(e),e}if(e!==`AUTHORIZED`)throw new Gc;return await this._startOrAuthSse({resumptionToken:void 0})}async _commonHeaders(){let e={};if(this._authProvider){let t=await this._authProvider.tokens();t&&(e.Authorization=`Bearer ${t.access_token}`)}this._sessionId&&(e[`mcp-session-id`]=this._sessionId),this._protocolVersion&&(e[`mcp-protocol-version`]=this._protocolVersion);let t=lc(this._requestInit?.headers);return new Headers({...e,...t})}async _startOrAuthSse(e){let{resumptionToken:t}=e;try{let n=await this._commonHeaders();n.set(`Accept`,`text/event-stream`),t&&n.set(`last-event-id`,t);let r=await(this._fetch??fetch)(this._url,{method:`GET`,headers:n,signal:this._abortController?.signal});if(!r.ok){if(await r.body?.cancel(),r.status===401&&this._authProvider)return await this._authThenStart();if(r.status===405)return;throw new kl(r.status,`Failed to open SSE stream: ${r.statusText}`)}this._handleSseStream(r.body,e,!0)}catch(e){throw this.onerror?.(e),e}}_getNextReconnectionDelay(e){if(this._serverRetryMs!==void 0)return this._serverRetryMs;let t=this._reconnectionOptions.initialReconnectionDelay,n=this._reconnectionOptions.reconnectionDelayGrowFactor,r=this._reconnectionOptions.maxReconnectionDelay;return Math.min(t*n**+e,r)}_scheduleReconnection(e,t=0){let n=this._reconnectionOptions.maxRetries;if(t>=n){this.onerror?.(Error(`Maximum reconnection attempts (${n}) exceeded.`));return}let r=this._getNextReconnectionDelay(t);this._reconnectionTimeout=setTimeout(()=>{this._startOrAuthSse(e).catch(n=>{this.onerror?.(Error(`Failed to reconnect SSE stream: ${n instanceof Error?n.message:String(n)}`)),this._scheduleReconnection(e,t+1)})},r)}_handleSseStream(e,t,n){if(!e)return;let{onresumptiontoken:r,replayMessageId:i}=t,a,o=!1,s=!1;(async()=>{try{let t=e.pipeThrough(new TextDecoderStream).pipeThrough(new Dl({onRetry:e=>{this._serverRetryMs=e}})).getReader();for(;;){let{value:e,done:n}=await t.read();if(n)break;if(e.id&&(a=e.id,o=!0,r?.(e.id)),e.data&&(!e.event||e.event===`message`))try{let t=ot.parse(JSON.parse(e.data));ut(t)&&(s=!0,i!==void 0&&(t.id=i)),this.onmessage?.(t)}catch(e){this.onerror?.(e)}}(n||o)&&!s&&this._abortController&&!this._abortController.signal.aborted&&this._scheduleReconnection({resumptionToken:a,onresumptiontoken:r,replayMessageId:i},0)}catch(e){if(this.onerror?.(Error(`SSE stream disconnected: ${e}`)),(n||o)&&!s&&this._abortController&&!this._abortController.signal.aborted)try{this._scheduleReconnection({resumptionToken:a,onresumptiontoken:r,replayMessageId:i},0)}catch(e){this.onerror?.(Error(`Failed to reconnect: ${e instanceof Error?e.message:String(e)}`))}}})()}async start(){if(this._abortController)throw Error(`StreamableHTTPClientTransport already started! If using Client class, note that connect() calls start() automatically.`);this._abortController=new AbortController}async finishAuth(e){if(!this._authProvider)throw new Gc(`No auth provider`);if(await tl(this._authProvider,{serverUrl:this._url,authorizationCode:e,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})!==`AUTHORIZED`)throw new Gc(`Failed to authorize`)}async close(){this._reconnectionTimeout&&=(clearTimeout(this._reconnectionTimeout),void 0),this._abortController?.abort(),this.onclose?.()}async send(e,t){try{let{resumptionToken:n,onresumptiontoken:r}=t||{};if(n){this._startOrAuthSse({resumptionToken:n,replayMessageId:vt(e)?e.id:void 0}).catch(e=>this.onerror?.(e));return}let i=await this._commonHeaders();i.set(`content-type`,`application/json`),i.set(`accept`,`application/json, text/event-stream`);let a={...this._requestInit,method:`POST`,headers:i,body:JSON.stringify(e),signal:this._abortController?.signal},o=await(this._fetch??fetch)(this._url,a),s=o.headers.get(`mcp-session-id`);if(s&&(this._sessionId=s),!o.ok){let t=await o.text().catch(()=>null);if(o.status===401&&this._authProvider){if(this._hasCompletedAuthFlow)throw new kl(401,`Server returned 401 after successful authentication`);let{resourceMetadataUrl:t,scope:n}=al(o);if(this._resourceMetadataUrl=t,this._scope=n,await tl(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})!==`AUTHORIZED`)throw new Gc;return this._hasCompletedAuthFlow=!0,this.send(e)}if(o.status===403&&this._authProvider){let{resourceMetadataUrl:t,scope:n,error:r}=al(o);if(r===`insufficient_scope`){let r=o.headers.get(`WWW-Authenticate`);if(this._lastUpscopingHeader===r)throw new kl(403,`Server returned 403 after trying upscoping`);if(n&&(this._scope=n),t&&(this._resourceMetadataUrl=t),this._lastUpscopingHeader=r??void 0,await tl(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetch})!==`AUTHORIZED`)throw new Gc;return this.send(e)}}throw new kl(o.status,`Error POSTing to endpoint: ${t}`)}if(this._hasCompletedAuthFlow=!1,this._lastUpscopingHeader=void 0,o.status===202){await o.body?.cancel(),wt(e)&&this._startOrAuthSse({resumptionToken:void 0}).catch(e=>this.onerror?.(e));return}let c=(Array.isArray(e)?e:[e]).filter(e=>`method`in e&&`id`in e&&e.id!==void 0).length>0,l=o.headers.get(`content-type`);if(c)if(l?.includes(`text/event-stream`))this._handleSseStream(o.body,{onresumptiontoken:r},!1);else if(l?.includes(`application/json`)){let e=await o.json(),t=Array.isArray(e)?e.map(e=>ot.parse(e)):[ot.parse(e)];for(let e of t)this.onmessage?.(e)}else throw await o.body?.cancel(),new kl(-1,`Unexpected content type: ${l}`);else await o.body?.cancel()}catch(e){throw this.onerror?.(e),e}}get sessionId(){return this._sessionId}async terminateSession(){if(this._sessionId)try{let e=await this._commonHeaders(),t={...this._requestInit,method:`DELETE`,headers:e,signal:this._abortController?.signal},n=await(this._fetch??fetch)(this._url,t);if(await n.body?.cancel(),!n.ok&&n.status!==405)throw new kl(n.status,`Failed to terminate session: ${n.statusText}`);this._sessionId=void 0}catch(e){throw this.onerror?.(e),e}}setProtocolVersion(e){this._protocolVersion=e}get protocolVersion(){return this._protocolVersion}async resumeStream(e,t){await this._startOrAuthSse({resumptionToken:e,onresumptiontoken:t?.onresumptiontoken})}};function jl(e){return or.join(or.dirname(e),`..`,`Frameworks`,`OpenKnowledge Server.app`,`Contents`,`MacOS`,`OpenKnowledge Helper`)}const Ml=/\/[^/]+\.app\/Contents\/MacOS\/[^/]+$/;function Nl(e){if(e.platform!==`darwin`||!Ml.test(e.execPath))return null;let t=jl(e.execPath);return e.exists(t)?t:null}function Pl(e={}){let t=e.execPath??process.execPath,n=e.platform??process.platform,r=e.argv??process.argv,i=e.exists??R,a=r[1];return a?{command:Nl({execPath:t,platform:n,exists:i})??t,prefixArgs:[a]}:(console.warn(`[self-spawn] process.argv[1] is empty — falling back to \`npx -y @inkeep/open-knowledge@latest\`. This re-introduces the registry-fetch surface that re-exec was fixing. Observed argv: ${JSON.stringify(r)}`),{command:`npx`,prefixArgs:[`-y`,`@inkeep/open-knowledge@latest`]})}function Fl(e){return(t,n)=>{if((n?.method??`GET`).toUpperCase()===`GET`)return globalThis.fetch(t,n);let r=new AbortController,i=setTimeout(()=>r.abort(Error(`MCP request timed out after ${e}ms`)),e),a=n?.signal instanceof AbortSignal?AbortSignal.any([n.signal,r.signal]):r.signal;return globalThis.fetch(t,{...n,signal:a}).finally(()=>clearTimeout(i))}}function Il(e){if(e===void 0||e===``)return;let t=Number.parseInt(e,10);if(!(Number.isNaN(t)||t<=0))return t}function Ll(e){return e===`0.0.0.0`||e===`::`?`localhost`:e.includes(`:`)&&!e.startsWith(`[`)?`[${e}]`:e}function Rl(e,t){return`http://${Ll(e)}:${t}/mcp`}function zl(e){return`${e}/mcp`}function Bl(e){return e.replace(/^http/,`ws`)}function Vl(e){let t=new URL(e);return t.protocol=t.protocol===`https:`?`wss:`:`ws:`,t.pathname=``,t.search=``,t.hash=``,t.toString().replace(/\/$/,``)}function Hl(e,t){if(e&&e.draining!==!0&&t(e.pid))return Ht(e,{fallbackHost:`127.0.0.1`})??void 0}function Ul(e){return R(e)?B(e,`utf-8`).trim():``}function Wl(e,t){return`server did not start within ${e}ms${t?` stderr:\n${t}`:``}`}function Gl(e){if(e&&typeof e==`object`&&`method`in e&&`id`in e)return e.id}function Kl(e){if(!e||typeof e!=`object`||!(`result`in e))return;let t=e.result;if(!t||typeof t!=`object`||!(`protocolVersion`in t))return;let n=t.protocolVersion;return typeof n==`string`?n:void 0}function ql(e,t){return{jsonrpc:`2.0`,id:e,error:{code:-32e3,message:t instanceof Error?t.message:String(t)}}}async function Jl(e){let t=e.readLock??(()=>Vt(e.lockDir)),n=e.isAlive??Bt,r=e.sleep??(e=>Dr(e)),i=e.spawn??nr,a=e.readErrorLog??Ul,o=e.openErrorLog??(e=>gr(e,`w`)),s=e.closeFd??fr,c=e.timeoutMs??5e3,l=e.pollIntervalMs??100;if(e.portOverride!==void 0){let t=Number.parseInt(e.portOverride,10);if(Number.isNaN(t)||t<=0)throw Error(`invalid --port value '${e.portOverride}' — HTTP MCP shim requires a positive port`);return Rl(fe,t)}let u=t(),d=Hl(u,n);if(d!==void 0)return zl(d);if(e.envAutoStart===`0`)throw new tt(`OpenKnowledge server is not running and OK_MCP_AUTOSTART=0 disables auto-start.`);if(u!==null&&u.draining===!0&&n(u.pid)){let e=Date.now(),i=e+c,a=!0;for(;Date.now()<i;){let e=t();if(e===null||e.draining!==!0||!n(e.pid)){a=!1;break}await r(l)}console.error(`[mcp-shim] waited ${Date.now()-e}ms for a draining predecessor server${a?` (timed out — proceeding anyway)`:``}`);let o=Hl(t(),n);if(o!==void 0)return zl(o)}R(e.lockDir)||z(e.lockDir,{recursive:!0});let f=F(e.lockDir,Se),p=o(f),m,h,g=Pl();try{try{m=i(g.command,[...g.prefixArgs,`start`],{detached:!0,stdio:[`ignore`,`ignore`,p],windowsHide:!0,cwd:e.contentDir,env:{...process.env,OK_LOCK_KIND:`mcp-spawned`,ELECTRON_RUN_AS_NODE:`1`}}),m.on(`error`,e=>{h=e instanceof Error?e.message:String(e)}),m.unref()}catch(e){h=e instanceof Error?e.message:String(e)}}finally{try{s(p)}catch{}}let _=Date.now()+c;for(;Date.now()<_;){if(h){let e=a(f),t=e?` stderr:\n${e}`:``;throw Error(`spawn failed: ${h}${t}`)}await r(l);let e=Hl(t(),n);if(e!==void 0)return zl(e)}if(h){let e=a(f),t=e?` stderr:\n${e}`:``;throw Error(`spawn failed: ${h}${t}`)}throw Error(Wl(c,a(f)))}function Yl(e,t){if(e.portOverride!==void 0)return Vl(t);let n=e.readLock??(()=>Vt(e.lockDir)),r=e.isAlive??Bt,i=Hl(n(),r);if(i!==void 0)return Bl(i)}async function Xl(e,t={}){let n=t.stderr??process.stderr,r=t.requestTimeoutMs??12e4,i=t.createStdioTransport?t.createStdioTransport(t.stdin,t.stdout):new rc(t.stdin,t.stdout),a=t.createHttpTransport?t.createHttpTransport(new URL(e)):new Al(new URL(e),{fetch:Fl(r),requestInit:{headers:{...oe({kind:`mcp`,runtimeVersion:E}),...t.connectionId===void 0?{}:{[mt]:t.connectionId}}}}),o=!1,s=async()=>{o||(o=!0,t.onclose?.(),await Promise.allSettled([i.close(),a.close()]))};i.onerror=e=>{n.write(`[mcp-shim] stdio error: ${e.message}\n`)},a.onerror=e=>{n.write(`[mcp-shim] HTTP transport error: ${e.message}\n`)},i.onclose=()=>{s()},a.onclose=()=>{s()};let c=Promise.resolve();i.onmessage=e=>{c=c.then(async()=>{try{await a.send(e)}catch(t){let r=Gl(e);if(r===void 0){n.write(`[mcp-shim] failed to forward stdio notification: ${t instanceof Error?t.message:String(t)}\n`);return}await i.send(ql(r,t)).catch(e=>{n.write(`[mcp-shim] failed to write stdio error response: ${e instanceof Error?e.message:String(e)}\n`)})}}).catch(e=>{n.write(`[mcp-shim] unexpected stdio forwarding failure: ${e instanceof Error?e.message:String(e)}\n`)})},a.onmessage=e=>{let t=Kl(e);t&&a.setProtocolVersion?.(t),i.send(e).catch(e=>{n.write(`[mcp-shim] failed to write stdio response: ${e instanceof Error?e.message:String(e)}\n`)})};try{await a.start(),await i.start()}catch(e){throw await s(),e}return{close:s}}async function Zl(e){let t=e.stderr??process.stderr,n=e.bridgeFn??Xl,r=await Jl(e),i=e.createConnectionId?.()??Er(),a=!1,o=(e.startKeepalive??$s)({connectionId:i,pid:process.pid,resolveWsUrl:async()=>Yl(e,r),log:e=>t.write(`[mcp-shim] keepalive: ${e}\n`)});t.write(`[mcp-shim] proxying stdio to ${r}\n`);let s;try{s=await n(r,{stderr:t,connectionId:i,onclose:()=>{a||(o.close(),process.exit(0))}})}catch(e){throw o.close(),e}let c=()=>{a=!0,o.close(),s.close().finally(()=>{process.exit(0)})};process.once(`SIGINT`,c),process.once(`SIGTERM`,c)}const Ql=/^mcp\.\d{4}-\d{2}-\d{2}\.log$/;function $l(){return F(Sr(),`.ok`,`logs`)}function eu(e,t=()=>new Date){try{let n=t().getTime(),r=_r(e).filter(e=>Ql.test(e)).flatMap(t=>{try{let n=V(F(e,t));return[{name:t,mtime:n.mtimeMs,size:n.size}]}catch{return[]}}),i=[];for(let t of r)if(n-t.mtime>6048e5)try{H(F(e,t.name))}catch{}else i.push(t);i.sort((e,t)=>e.mtime-t.mtime);let a=i.reduce((e,t)=>e+t.size,0);for(let t of i){if(a<=47185920)break;try{H(F(e,t.name)),a-=t.size}catch{}}}catch{}}function tu(e={}){let t=e.logsDir??$l(),n=e.now??(()=>new Date),r=e.pruneDelayMs??5e3;r<=0?eu(t,n):setTimeout(()=>eu(t,n),r).unref?.();let i=0,a=!1;return{write(e){if(!(i>=5))try{a||=(z(t,{recursive:!0}),!0);let r=n().toISOString();dr(F(t,`mcp.${r.slice(0,10)}.log`),`${r} ${e}`),i=0}catch{a=!1,i++}}}}const nu=lr(import.meta.url),ru=Or($n);async function iu(e){try{let{stdout:t}=await ru(`git`,[`-C`,e,`worktree`,`list`,`--porcelain`],T({timeout:2e3}));return t.split(`
|
|
62
|
-
`).filter(e=>e.startsWith(`worktree `)).length}catch{return 0}}function au(e){let t=L(e);for(;;){if(Ae(t))return t;let n=P(t);if(n===t)throw Error(`No OpenKnowledge project found at or above ${e}. Pass an explicit \`cwd\` argument that points inside an OK project (a directory with a \`${
|
|
62
|
+
`).filter(e=>e.startsWith(`worktree `)).length}catch{return 0}}function au(e){let t=L(e);for(;;){if(Ae(t))return t;let n=P(t);if(n===t)throw Error(`No OpenKnowledge project found at or above ${e}. Pass an explicit \`cwd\` argument that points inside an OK project (a directory with a \`${u}\`).`);t=n}}function ou(e){try{let t=new URL(e);return t.protocol===`file:`?lr(t):void 0}catch{return}}async function su(e){if(!e.getClientCapabilities()?.roots)return;let t;try{t=await e.listRoots()}catch(t){e.log?.(`listRoots fallback failed: ${t instanceof Error?t.message:String(t)}`);return}let n=t.roots??[];if(n.length!==1)return;let r=ou(n[0].uri);return r===void 0&&e.log?.(`single root URI not usable as fs path: ${n[0].uri}`),r}async function cu(e,t,n,r=au){if(e!==void 0){let t=r(e);return{projectDir:t,viaRootGuess:!1,nextSticky:t}}if(t!==void 0){let e=r(t);return{projectDir:e,viaRootGuess:!1,nextSticky:e}}let i=await n();return i===void 0?{projectDir:void 0,viaRootGuess:!1,nextSticky:void 0}:{projectDir:r(i),viaRootGuess:!0,nextSticky:void 0}}async function lu(e){let t=tu(),n={write:e=>(t.write(e),process.stderr.write(e))},r=e.spawnTimeoutMs??Il(process.env.OK_MCP_SPAWN_TIMEOUT_MS),i=e.envAutoStart??process.env.OK_MCP_AUTOSTART,a=qn({startupCwd:e.startupCwd,startupConfig:e.startupConfig}),o=new jt({name:ue,version:E});Ot(o);let s=Er(),c={current:{connectionId:s,displayName:s,colorSeed:s}},l=new Map,u=e=>{if(l.has(e))return;let t=Pt(e),r=c.current,i=$s({connectionId:s,pid:process.pid,displayName:r.displayName,clientName:r.clientInfo?.name??r.displayName,colorSeed:r.colorSeed,resolveWsUrl:async()=>Yl({lockDir:t,contentDir:e},``),log:t=>n.write(`[mcp] keepalive[${e}]: ${t}\n`)});l.set(e,i)},d=()=>su({getClientCapabilities:()=>o.server.getClientCapabilities(),listRoots:()=>o.server.listRoots(),log:e=>n.write(`[mcp] ${e}\n`)}),f,p=!1,m=async e=>{if(p)return;p=!0;let t=await iu(e);if(t<=1){p=!1;return}let r=`Routed to ${e} from the MCP client's single advertised root, but this repo has ${t} git worktrees. If you are working in a worktree, pass its path as \`cwd\` on OK tool calls once — it sticks for the session, so reads, writes, and the preview all target that worktree instead of this checkout.`;try{n.write(`[mcp] ${r}\n`),await o.server.sendLoggingMessage({level:`warning`,data:r})}catch{}},h=async e=>{let t=await cu(e,f,d);if(f=t.nextSticky??f,t.projectDir===void 0)throw Error("`cwd` is required for tool calls against the global MCP server. Pass an absolute path inside an OpenKnowledge project, or have the MCP client advertise a single root.");return t.viaRootGuess&&m(t.projectDir),t.projectDir},g=async e=>{let t=await cu(e,f,d);if(f=t.nextSticky??f,t.projectDir===void 0)return;t.viaRootGuess&&m(t.projectDir);let n=t.projectDir,o=await a(n),s=await Jl({lockDir:Pt(n),contentDir:Ke(o,n),envAutoStart:i,...r===void 0?{}:{timeoutMs:r}});return u(n),s.replace(/\/mcp$/,``)};o.server.oninitialized=()=>{let e=o.server.getClientVersion(),t=Re(e?.name,s);c.current={connectionId:s,clientInfo:e?{name:t,version:e.version}:void 0,displayName:t,colorSeed:t}},Fe(o,{serverUrl:g,resolveCwd:h,config:a,identityRef:c,isHostedAgent:Ce(process.env)}),_t(o);let _=new rc,v=!1,y,b,x=async()=>{if(v)return;v=!0,y?.stop(),b?.stop();for(let e of l.values())try{e.close()}catch(e){n.write(`[mcp] keepalive close error: ${e instanceof Error?e.message:String(e)}\n`)}l.clear();let e=await Promise.allSettled([o.close(),_.close()]);for(let t of e)if(t.status===`rejected`){let e=t.reason;n.write(`[mcp] shutdown close error: ${e instanceof Error?e.message:String(e)}\n`)}};await o.connect(_),n.write(`[mcp] global stdio server ready (per-call project routing)
|
|
63
63
|
`);let S=!1,C=()=>{S||(S=!0,setTimeout(()=>{n.write(`[mcp] shutdown deadline (5s) reached — forcing exit(1)
|
|
64
64
|
`),process.exit(1)},5e3).unref(),x().finally(()=>{process.exit(0)}))};if(process.once(`SIGINT`,C),process.once(`SIGTERM`,C),process.stdin.on(`end`,()=>{n.write(`[mcp] stdin end — host disconnected, shutting down
|
|
65
65
|
`),C()}),process.stdin.on(`error`,e=>{n.write(`[mcp] stdin error (${e instanceof Error?e.message:String(e)}) — host disconnected, shutting down\n`),C()}),b=sc({getPpid:()=>process.ppid,onHostGone:e=>{n.write(`[mcp] ${e} — shutting down\n`),C()}}),cc({log:e=>n.write(`${e}\n`),transport:_,process,stdin:process.stdin}),process.platform===`darwin`){let e=oc(nu,{realpathSync:vr,statInoSync:e=>V(e).ino,log:e=>n.write(`${e}\n`)});if(e!==void 0){n.write(`[mcp] bundle identity anchor=${e.resolvedPath} inode=${e.inode} version=${E}\n`);let{resolvedPath:t,inode:r}=e;y=ac({detect:()=>ic({bundleAnchorPath:nu,currentInode:r,platform:process.platform,realpath:vr,statInode:e=>V(e).ino}),onReplaced:e=>{n.write(`[mcp] bundle replaced anchor=${t} bootInode=${e.currentInode} onDiskInode=${e.onDiskInode} version=${E} — exiting for host respawn\n`),C()},log:e=>n.write(`[mcp] ${e}\n`)})}}return{close:x}}function uu(e){return new D(`mcp`).description(`Start MCP stdio server for project knowledge base`).option(`-p, --port <port>`,`Override per-call routing and proxy stdio to this HTTP MCP port (skips bundle proxy)`,void 0).option(`--no-bundle-proxy`,`Run the npm-fetched MCP server in-process instead of proxying to the Desktop app bundle (macOS-only proxy; no-op elsewhere; equivalent: OK_BUNDLE_PROXY=0)`).action(async t=>{try{let n=e(),r=process.cwd();if(t.port!==void 0){let e=Il(process.env.OK_MCP_SPAWN_TIMEOUT_MS);await Zl({lockDir:``,contentDir:``,portOverride:t.port,envAutoStart:process.env.OK_MCP_AUTOSTART,timeoutMs:e});return}let i=t.bundleProxy===!1?[...process.argv,`--no-bundle-proxy`]:process.argv,a=Xs(process.env,i,process.platform);if(a.proxy){let e=Ys(process.platform,Sr(),{existsSync:R});if(e===null)Zs({stderr:process.stderr,mode:`fallback-absent`,bundlePath:null,reason:`no installed OpenKnowledge.app bundle found`});else try{await Qs({bundlePath:e,argv:process.argv.slice(2),env:process.env,stderr:process.stderr});return}catch(t){Zs({stderr:process.stderr,mode:`fallback-exec-failed`,bundlePath:e,reason:t instanceof Error?t.message:String(t)})}}else{let e=a.suppressedBy===`env`?`suppressed-env`:a.suppressedBy===`flag`?`suppressed-flag`:a.suppressedBy===`self`?`suppressed-self`:`suppressed-platform`;Zs({stderr:process.stderr,mode:e,bundlePath:null,reason:null})}await lu({startupCwd:r,startupConfig:n})}catch(e){process.stderr.write(`MCP server failed to start: ${e instanceof Error?e.message:String(e)}\n`),process.exitCode=1}})}const du=/<aside>\s*([\s\S]*?)\s*<\/aside>/g,fu=/^(?:\p{Extended_Pictographic}️?\s*)+/u;function pu(e){return e.replace(du,(e,t)=>{let n=t.replace(/\r\n/g,`
|
|
@@ -74,7 +74,7 @@ ${t}`,d++;break;case`id`:l=t.includes(`\0`)?void 0:t;break;case`retry`:/^\d+$/.t
|
|
|
74
74
|
`).replace(/\n+$/,``);return e.endsWith(`
|
|
75
75
|
`)?`${c}\n`:c}function qu(e){return e.replace(/\r\n|\r|\n/g,`<br>`).replace(/\|/g,`\\|`)}function Ju(e){return/\s/.test(e)?`<${e}>`:e}function Yu(e,t={}){let{header:n,rows:r}=vu(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(qu).join(` | `)} |`,`| ${n.map(()=>`---`).join(` | `)} |`,...r.map(e=>`| ${n.map((n,r)=>{let i=e[r]??``,a=qu(i);if(r===o&&t.linkForTitle&&i.trim()!==``){let e=t.linkForTitle(i);if(e)return`[${a}](${Ju(e)})`}return a}).join(` | `)} |`)].join(`
|
|
76
76
|
`),columns:i,wide:i>a}}function Xu(e,t){let n=e.match(/^#\s+(.+)$/m);return n?n[1].trim():t}function Zu(e,t){return`# ${e}\n\n${t}\n`}const Qu=[`links`,`frontmatter`,`callouts`,`images`,`tables`],$u=/\.mdx?$/i;function ed(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 td(e,t={}){let n=t.selected??new Set(Qu),r=zu(e);if(!r&&!t.force)return{changes:[],assets:[],deletions:[],report:ed(!1)};let i=ed(r),a=Iu(e),o=Du(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(!$u.test(e)||s&&l.has(e))continue;let r;try{r=B(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=_u(a,ir(e),{strip:t.stripBase64});a=r.markdown;for(let t of r.assets)d.push({path:F(P(e),t.filename),bytes:t.bytes});i.assetsExtracted+=r.assets.length,o(`images`,n)}if(n.has(`callouts`)){let e=a;a=pu(a),o(`callouts`,e)}if(n.has(`frontmatter`)){let t=c.get(e);if(t){let e=a;a=Ku(a,t.propertyKeys),o(`frontmatter`,e)}}if(n.has(`links`)){let e=a;a=Fu(a,{redirectCsv:s}),o(`links`,e)}a!==r&&u.push({path:e,content:a})}if(s)for(let e of o){let r=Yu(e.csvText,{linkForTitle:t=>{let n=wu(e.folderIndex,t);return n.ambiguous&&(i.ambiguousTitleLinks+=1),n.path?I(P(e.stubTargetPath),n.path):null}});if(r.columns===0)continue;let a=e.stubPath??e.stubTargetPath,o=null;if(e.stubPath)try{o=B(e.stubPath,`utf8`)}catch{i.unreadable.push(e.stubPath);continue}let c=Zu(o===null?e.fallbackTitle:Xu(o,e.fallbackTitle),r.table);n.has(`links`)&&(c=Fu(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 nd(e){for(let t of e.assets)z(P(t.path),{recursive:!0}),xr(t.path,t.bytes);for(let t of e.changes)z(P(t.path),{recursive:!0}),xr(t.path,t.content,`utf8`);for(let t of e.deletions)try{H(t)}catch(e){if(e.code!==`ENOENT`)throw e}}const rd={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`},id=[`images`,`callouts`,`frontmatter`,`tables`,`links`];function ad(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 id)n.push(` ${rd[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(`
|
|
77
|
-
`)}function od(e,t){return JSON.stringify({applied:t.applied,...e},null,2)}function sd(e){let t=new Set(Qu);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: ${Qu.join(`, `)}`);return e})}function cd(e,t){let n=new Set(Qu);if(e&&(n=new Set(sd(e))),t)for(let e of sd(t))n.delete(e);return n}function ld(){let e=new D(`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=L(e??process.cwd()),r;try{r=cd(t.only,t.skip)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exitCode=2;return}let i=td(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{nd(i)}catch(e){console.error(`Failed to apply changes: ${e instanceof Error?e.message:String(e)}`),process.exitCode=4;return}console.log(t.json?od(a,{applied:t.apply??!1}):ad(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 ud(e,t){return t===`darwin`?{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=ud(e,t.platform??process.platform);return hn(n.command,n.args,{spawn:t.spawn,env:t.env,timeoutMs:t.timeoutMs})}function fd(e,t,n=process.platform){let r=ud(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 pd(e=()=>_n(bn())){return{detectBundlePath:()=>e().bundlePath??null,resolveBaseUrl:e=>Te({lockDir:w(e)}).baseUrl,classifyName:(e,t)=>{let n=F(e,t);try{return V(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,log:e=>process.stdout.write(`${e}\n`),error:e=>process.stderr.write(`${e}\n`)}}function md(e){return e.startsWith(`/`)||e.includes(`\\`)||e.split(`/`).includes(`..`)}function hd(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 gd(e,t,n){let r=await n.openTarget(e);return r.ok?(n.log(t),0):(n.error(`Could not open ${e}: ${fd(r.reason,e)}.`),1)}async function _d(e,t,n){let r=L(t.project??process.cwd()),i=e.replace(/\/+$/,``);if(!i)return n.error("Nothing to open: pass a doc, folder, or skill name (e.g. `ok open specs/foo/SPEC`)."),1;if(md(i))return n.error(`Invalid name "${i}": must be a relative path with no '..' segments, leading '/', or backslashes.`),1;if(t.skill===!0){let e=t.scope??`project`;if(!le.includes(e))return n.error(`Invalid --scope "${t.scope}": expected one of ${le.join(`, `)}.`),1;if(n.detectBundlePath())return gd(`openknowledge://open?project=${encodeURIComponent(r)}&doc=${encodeURIComponent(`__skill__/${e}/${i}`)}`,`Opening skill ${i} (${e}) in the OpenKnowledge desktop app.`,n);let a=n.resolveBaseUrl(r);if(a){let t=`${a}/#/${Ge(e,i)}`;return gd(t,`Opening skill ${i} (${e}) in your browser: ${t}`,n)}return hd(n)}let a=/\/+$/.test(e)||n.classifyName(r,i)===`folder`,o=n.detectBundlePath();if(a){if(o)return gd(`openknowledge://open?project=${encodeURIComponent(r)}&folder=${encodeURIComponent(i)}`,`Opening folder ${i} in the OpenKnowledge desktop app.`,n);let e=n.resolveBaseUrl(r);if(e){let t=`${e}/#/${Qe(i)}`;return gd(t,`Opening folder ${i} in your browser: ${t}`,n)}return hd(n)}if(o)return gd(`openknowledge://open?project=${encodeURIComponent(r)}&doc=${encodeURIComponent(i)}`,`Opening ${i} in the OpenKnowledge desktop app.`,n);let s=n.resolveBaseUrl(r);if(s){let e=`${s}/#/${Xe(i)}`;return gd(e,`Opening ${i} in your browser: ${e}`,n)}return hd(n)}function vd(){return new D(`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: ${le.join(` | `)}`,`project`).option(`--project <dir>`,`Project root (defaults to the current directory)`).action(async(e,t)=>{process.exitCode=await _d(e,t,pd())})}function yd(e){return new D(`preview`).description(`Show what content the watcher will track (read-only)`).action(async()=>{let{previewContent:t,formatPreviewBlock:n}=await import(`./preview-
|
|
77
|
+
`)}function od(e,t){return JSON.stringify({applied:t.applied,...e},null,2)}function sd(e){let t=new Set(Qu);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: ${Qu.join(`, `)}`);return e})}function cd(e,t){let n=new Set(Qu);if(e&&(n=new Set(sd(e))),t)for(let e of sd(t))n.delete(e);return n}function ld(){let e=new D(`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=L(e??process.cwd()),r;try{r=cd(t.only,t.skip)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exitCode=2;return}let i=td(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{nd(i)}catch(e){console.error(`Failed to apply changes: ${e instanceof Error?e.message:String(e)}`),process.exitCode=4;return}console.log(t.json?od(a,{applied:t.apply??!1}):ad(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 ud(e,t){return t===`darwin`?{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=ud(e,t.platform??process.platform);return hn(n.command,n.args,{spawn:t.spawn,env:t.env,timeoutMs:t.timeoutMs})}function fd(e,t,n=process.platform){let r=ud(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 pd(e=()=>_n(bn())){return{detectBundlePath:()=>e().bundlePath??null,resolveBaseUrl:e=>Te({lockDir:w(e)}).baseUrl,classifyName:(e,t)=>{let n=F(e,t);try{return V(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,log:e=>process.stdout.write(`${e}\n`),error:e=>process.stderr.write(`${e}\n`)}}function md(e){return e.startsWith(`/`)||e.includes(`\\`)||e.split(`/`).includes(`..`)}function hd(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 gd(e,t,n){let r=await n.openTarget(e);return r.ok?(n.log(t),0):(n.error(`Could not open ${e}: ${fd(r.reason,e)}.`),1)}async function _d(e,t,n){let r=L(t.project??process.cwd()),i=e.replace(/\/+$/,``);if(!i)return n.error("Nothing to open: pass a doc, folder, or skill name (e.g. `ok open specs/foo/SPEC`)."),1;if(md(i))return n.error(`Invalid name "${i}": must be a relative path with no '..' segments, leading '/', or backslashes.`),1;if(t.skill===!0){let e=t.scope??`project`;if(!le.includes(e))return n.error(`Invalid --scope "${t.scope}": expected one of ${le.join(`, `)}.`),1;if(n.detectBundlePath())return gd(`openknowledge://open?project=${encodeURIComponent(r)}&doc=${encodeURIComponent(`__skill__/${e}/${i}`)}`,`Opening skill ${i} (${e}) in the OpenKnowledge desktop app.`,n);let a=n.resolveBaseUrl(r);if(a){let t=`${a}/#/${Ge(e,i)}`;return gd(t,`Opening skill ${i} (${e}) in your browser: ${t}`,n)}return hd(n)}let a=/\/+$/.test(e)||n.classifyName(r,i)===`folder`,o=n.detectBundlePath();if(a){if(o)return gd(`openknowledge://open?project=${encodeURIComponent(r)}&folder=${encodeURIComponent(i)}`,`Opening folder ${i} in the OpenKnowledge desktop app.`,n);let e=n.resolveBaseUrl(r);if(e){let t=`${e}/#/${Qe(i)}`;return gd(t,`Opening folder ${i} in your browser: ${t}`,n)}return hd(n)}if(o)return gd(`openknowledge://open?project=${encodeURIComponent(r)}&doc=${encodeURIComponent(i)}`,`Opening ${i} in the OpenKnowledge desktop app.`,n);let s=n.resolveBaseUrl(r);if(s){let e=`${s}/#/${Xe(i)}`;return gd(e,`Opening ${i} in your browser: ${e}`,n)}return hd(n)}function vd(){return new D(`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: ${le.join(` | `)}`,`project`).option(`--project <dir>`,`Project root (defaults to the current directory)`).action(async(e,t)=>{process.exitCode=await _d(e,t,pd())})}function yd(e){return new D(`preview`).description(`Show what content the watcher will track (read-only)`).action(async()=>{let{previewContent:t,formatPreviewBlock:n}=await import(`./preview-DcSm8SQu.mjs`),r=e(),i=process.cwd(),a=Ke(r,i),o;try{o=t({projectDir:i,contentDir:a})}catch(e){console.error(`Content preview failed: ${e instanceof Error?e.message:String(e)}`),process.exitCode=1;return}process.stdout.write(`${n(o,i)}\n`),o.totalCount===0&&o.warnings.length>0&&(process.exitCode=1)})}function Z(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function bd(e,t,n=process.cwd()){let r=e.op??`sync`,i=Vt(w(n));if(i&&i.port>0){let t=`http://127.0.0.1:${i.port}/api/sync/trigger`;e.json||process.stderr.write(`Triggering ${r} via running server (port ${i.port})\n`);try{let n=await fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`,...oe({kind:`cli`,runtimeVersion:E})},body:JSON.stringify({op:r})});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.title??e.error??e.message??`Server responded with ${n.status}`)}Z(e.json,{type:`triggered`,op:r,port:i.port}),e.json||process.stderr.write(`✓ ${r} triggered\n`);return}catch(t){let n=t instanceof Error?t.message:String(t);e.json||process.stderr.write(`Server trigger failed (${n}), running directly\n`)}}e.json||process.stderr.write(`Running ${r} directly (no live server)\n`);let a=zt({baseDir:n});if(r===`sync`||r===`pull`){Z(e.json,{type:`step`,step:`pull`});let t=await a.pull();Z(e.json,{type:`pull`,summary:t.summary}),e.json||process.stderr.write(` pull: ${t.summary.changes} changes\n`)}(r===`sync`||r===`push`)&&(Z(e.json,{type:`step`,step:`push`}),await a.push(),Z(e.json,{type:`push`,ok:!0}),e.json||process.stderr.write(` push: ok
|
|
78
78
|
`)),Z(e.json,{type:`complete`,op:r}),e.json||process.stderr.write(`✓ ${r} complete\n`)}function xd(e){return new D(`sync`).description(`Commit, pull, and push to the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await bd({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 Sd(e){return new D(`pull`).description(`Pull changes from the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await bd({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 Cd(e){return new D(`push`).description(`Push commits to the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await bd({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 wd(e,t){if(e.packSkillHomeRefusal===void 0)return``;if(e.packSkillHomeRefusal===`home-escapes-project`)return`\n${M(`!`)} 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([pe,...me.map(e=>ae[e])].filter(e=>e!==null).map(te))].map(e=>`${e}/`);return`\n${M(`!`)} 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 Td(e){return typeof e==`string`&&Me.includes(e)}async function Ed(e={}){let t=L(e.cwd??process.cwd()),n=e.pack??`knowledge-base`;if(!Je[n])return{status:`failed`,message:`${j(`Error:`)} Unknown pack "${n}". Available: ${Me.join(`, `)}`,exitCode:1};let r;try{r=await je({projectDir:t,rootDir:e.root,packId:n,skipPrerequisite:e.dryRun===!0})}catch(e){return e instanceof Ze?{status:`prerequisite-missing`,message:`${j(`Error:`)} ${e.message}`,exitCode:1}:{status:`failed`,message:`${j(`Error:`)} ${e instanceof Error?e.message:String(e)}`,exitCode:1}}if(!ne(r)){let e=Je[n].name,t=(r.packSkills??[]).filter(e=>e.conflict).map(e=>`\n${M(`!`)} Skill "${e.name}" is your own — the pack's version is not installed. Rename yours to install the pack's version.`).join(``),i=wd(r,e);return{status:`no-op`,message:`${A(`Your ${e} pack is already seeded.`)}${i}${t}${i===``?`\n${k(`Nothing to do.`)}`:``}`,plan:r,exitCode:0}}if(e.dryRun){let e=We(Je[n]);return{status:`dry-run`,message:`${N(`Reference this pack for inspiration (dry-run — no changes made):`)}\n\n${e}\n\n${N(`Plan:`)}\n\n${Od(r,t)}`,plan:r,exitCode:0}}if(!e.yes&&!await kd(`${N(`Plan:`)}\n\n${Od(r,t)}\n\n${N(`Apply?`)} ${k(`[Y/n] `)}`,e.confirmStream))return{status:`cancelled`,message:k(`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=>` ${j(`✗`)} ${e.path}: ${e.error}`);return{status:`failed`,message:[`${M(`Applied`)} ${i.applied} entries, ${M(String(i.errors.length))} error(s):`,...e].join(`
|
|
79
79
|
`),plan:r,exitCode:1}}let a=Je[n].name,o=i.packSkillsInstalled.length>0?`\n${k(`Installed the ${a} skills for: ${i.packSkillsInstalled.join(`, `)}`)}`:``,s=i.pluginsEnabled.length>0?`\n${k(`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${M(`!`)} 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${M(`!`)} 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:`${A(`✓ Seeded ${a}`)} ${k(`(${i.applied} entries, ${i.durationMs}ms)`)}${o}${s}${wd(r,a)}${c}`,plan:r,exitCode:0}}function Dd(){let e=[N(`Available packs:`)];for(let t of Me){let n=Je[t];e.push(` ${A(t)} ${k(`—`)} ${n.name}: ${n.description}`)}return e.join(`
|
|
80
80
|
`)}function Od(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(N(`Folders to create:`));for(let e of r)n.push(` ${A(`+`)} ${O(I(t,L(t,e.path))||e.path)}${k(`/`)}`)}if(i.length>0){n.length>0&&n.push(``),n.push(N(`Files to create:`));for(let e of i)n.push(` ${A(`+`)} ${O(I(t,L(t,e.path))||e.path)}`)}if(e.skipped.length>0){n.length>0&&n.push(``),n.push(k(`Already present (skipped):`));for(let t of e.skipped)n.push(` ${k(`· ${t.path} (${t.reason})`)}`)}if(e.warnings.length>0){n.length>0&&n.push(``),n.push(M(`Warnings:`));for(let t of e.warnings)n.push(` ${M(`!`)} ${t}`)}let a=(e.packSkills??[]).filter(e=>e.conflict);if(a.length>0){n.length>0&&n.push(``),n.push(M(`Name collisions:`));for(let e of a)n.push(` ${M(`!`)} 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(`
|
|
@@ -83,7 +83,7 @@ ${t}`,d++;break;case`id`:l=t.includes(`\0`)?void 0:t;break;case`retry`:/^\d+$/.t
|
|
|
83
83
|
`);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 Nd(e){return new D(`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 Md(t,await e())})}async function Pd(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 Fd(e,t){let{host:n,json:r}=e;U(n);let i=await _a(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 Pd(new ua({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 Id(e){return new D(`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 Fd(t,await e())})}function Ld(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(`
|
|
84
84
|
`)??``}\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 Rd(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 zd(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 Bd(e,t){return(await e.users.getAuthenticated()).data.login.toLowerCase()===t.toLowerCase()?`user`:`org`}function Vd(e){return zt(Ua(e,[])).env(La())}function Hd(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 Ud={ensureOkScaffold:e=>{et(e)},gitFactory:Vd};async function Wd(e){let t={...Ud,...e.deps},n=L(e.projectDir),r;if(e.ownerKind)r=e.ownerKind;else try{r=await Bd(e.octokit,e.body.owner)}catch(e){return{kind:`error`,code:Ld(e)}}try{t.ensureOkScaffold(n)}catch{return{kind:`error`,code:`init-failed`}}let i=t.gitFactory(n);if(!R(F(n,`.git`)))try{await i.init()}catch{return{kind:`error`,code:`init-failed`}}let a;try{a=await Rd({octokit:e.octokit,ownerLogin:e.body.owner,ownerKind:r,name:e.body.name,visibility:e.body.visibility,description:e.body.description})}catch(t){if(Ld(t)===`name-conflict`){let t=await zd(e.octokit,e.body.owner,e.body.name);if(t===null)return{kind:`error`,code:`name-conflict`};a=t}else return{kind:`error`,code:Ld(t)}}try{await i.addRemote(`origin`,a.cloneUrl)}catch(e){if(!String(e.message??``).toLowerCase().includes(`remote origin already exists`))return{kind:`error`,code:`push-failed`}}let o=!1;try{await i.raw([`rev-parse`,`--verify`,`HEAD`])}catch{o=!0}if(o)try{await i.add(`.`),await i.raw([`commit`,`--allow-empty`,`-m`,`Initial commit`])}catch{return{kind:`error`,code:`init-failed`}}let s=Hd(a.cloneUrl,e.token);try{await i.raw([`push`,s,`HEAD:refs/heads/${a.defaultBranch}`])}catch(e){let t=String(e.message??``).toLowerCase();return t.includes(`saml`)||t.includes(`sso`)?{kind:`error`,code:`saml-sso`}:{kind:`error`,code:`push-failed`}}try{await i.raw([`update-ref`,`refs/remotes/origin/${a.defaultBranch}`,`HEAD`])}catch{}return{kind:`ok`,value:{ownerLogin:e.body.owner,repoName:e.body.name,cloneUrl:a.cloneUrl,defaultBranch:a.defaultBranch}}}function Gd(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 Kd(e,t){let{host:n,owner:r,name:i,visibility:a,description:o,projectDir:s,json:c}=e;if(U(n),Ee(s)){process.stderr.write(`${new it(L(s)).message}\n`),process.exitCode=64;return}let l=await _a(n,t);if(l==null){Gd(c,{kind:`error`,code:`auth-required`});return}let u=n===`github.com`?void 0:`https://${n}/api/v3`,d=new ua({auth:l,...u?{baseUrl:u}:{}});try{tr(`git config user.email`,T({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`}Gd(c,await Wd({octokit:d,token:l,projectDir:s,body:{owner:r,name:i,visibility:a,description:o}}))}function qd(e){return new D(`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'
|
|
85
85
|
`),process.exit(1)),await Kd(t,await e())})}function Jd(){let e=new D(`share`);e.description(`Sharing flow operations (owners, name-check, publish)`);let t=()=>gn();return e.addCommand(Id(t)),e.addCommand(Nd(t)),e.addCommand(qd(t)),e}function Yd(){return new D(`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=L(e.project??process.cwd()),n=Nn(t),r=Fn(t,En(t));if(r.kind===`no-exclude`){Xd(e.json,t,r.reason);return}let i=Nn(t);if(e.json){let e={type:`sharing-share`,projectRoot:t,mode:i,removed:r.removed};process.stdout.write(`${JSON.stringify(e)}\n`);return}if(n===`shared`){process.stderr.write(`${O(`Sharing mode is already`)} ${N(`shared`)} ${O(`— nothing to do.`)}\n`);return}process.stderr.write(`${A(`✓`)} ${N(`Sharing mode set to`)} ${A(`shared`)}\n`),process.stderr.write(` Removed OK paths from ${N(`.git/info/exclude`)}; commit the files to share with teammates.\n`)})}function Xd(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(`${M({"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 Zd(){return new D(`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=L(e.project??process.cwd()),n=Nn(t),r=Pn(t),i=[...Bn(t)],a=zn(t,En(t)).tracked;if(e.json){let e={type:`sharing-status`,projectRoot:t,mode:n,skillsShared:r,excluded:i,trackedUpstream:a};process.stdout.write(`${JSON.stringify(e)}\n`);return}let o=[];if(o.push(`OpenKnowledge sharing mode: ${Qd(n)}`),r&&o.push(` ${N(`.ok/skills`)} is committable (carved out); the rest of .ok/ stays local.`),o.push(``),o.push(`Excluded from git via ${N(`.git/info/exclude`)}:`),i.length===0)o.push(` (none)`);else for(let e of i)o.push(` ${e}`);if(o.push(``),o.push(`Other OK paths exist but are tracked upstream:`),a.length===0)o.push(` (none)`);else for(let e of a)o.push(` ${e}`);o.push(``),o.push(`Toggle with: ${O(n===`local-only`?`ok config-sharing share`:`ok config-sharing unshare`)}`),r&&o.push(` (that shares the whole project; to undo only the skills carve-out, use the desktop app: Settings > Sync & sharing)`),process.stdout.write(`${o.join(`
|
|
86
|
-
`)}\n`)})}function Qd(e){switch(e){case`shared`:return A(`shared`);case`local-only`:return A(`local-only`);case`no-git`:return M(`no-git (not a git repository)`)}}function $d(){return new D(`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=L(e.project??process.cwd()),n=kn(t,En(t));if(n.kind===`refused-tracked`){if(e.json){let e={type:`sharing-unshare`,projectRoot:t,mode:`refused-tracked`,tracked:n.tracked,remediation:n.remediation};process.stdout.write(`${JSON.stringify(e)}\n`)}else process.stderr.write(`${n.remediation}\n`);process.exitCode=1;return}if(n.kind===`no-exclude`){ef(e.json,t,n.reason);return}let r=Nn(t);if(e.json){let e={type:`sharing-unshare`,projectRoot:t,mode:r,appended:n.appended,alreadyPresent:n.alreadyPresent};process.stdout.write(`${JSON.stringify(e)}\n`);return}if(n.appended.length===0){process.stderr.write(`${N(`Sharing mode is already`)} ${A(`local-only`)} ${N(`— nothing to do.`)}\n`);return}process.stderr.write(`${A(`✓`)} ${N(`Sharing mode set to`)} ${A(`local-only`)}\n`),process.stderr.write(` Added ${n.appended.length} path(s) to ${N(`.git/info/exclude`)} (per-clone, not committed).\n`)})}function ef(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(`${M({"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 tf(){let e=new D(`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(Yd()),e.addCommand($d()),e.addCommand(Zd()),e}const nf=new Set([`--cwd`,`--log-level`]);function rf(e){let t=[],n=null,r=!1;for(let i=0;i<e.length;i++){let a=e[i];if(a===`--help`||a===`-h`||a===`--version`||a===`-V`){r=!0;break}if(a===`--cwd`||a===`--log-level`){a===`--cwd`&&(n=e[i+1]??null),i++;continue}if(a.startsWith(`--cwd=`)){n=a.slice(6);continue}if(!a.startsWith(`--log-level=`)&&!(a===`--no-color`||a===`--color`)){if(a.startsWith(`-`)){nf.has(a)&&i++;continue}t.push(a)}}return{operands:t,cwd:n,sawTerminalFlag:r}}function af(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 of(e){return/\.(md|mdx)$/i.test(e)}function sf(e,t){if(of(t))return!0;try{return V(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 cf(e=()=>_n(bn())){return{prepare:nt,detectBundlePath:()=>e().bundlePath??null,openTarget:dd,runProjectOpen:(e,t)=>_d(e,{project:t},pd()),runBrowserOpen:e=>uf(e),log:e=>process.stdout.write(`${e}\n`),error:e=>process.stderr.write(`${e}\n`)}}async function lf(e,t){let n;try{n=t.prepare(e)}catch(e){if(e instanceof yt||e instanceof kt||e instanceof Tt)return t.error(e.message),1;throw e}if(n.mode===`project`)return await t.runProjectOpen(n.docName,n.projectRoot);if(t.detectBundlePath()){let e=`openknowledge://open?file=${encodeURIComponent(n.canonicalFilePath)}`,r=await t.openTarget(e);return r.ok?(t.log(`Opening ${n.singleDocRelPath} in the OpenKnowledge desktop app.`),0):(t.error(`Could not open the OpenKnowledge desktop app: ${fd(r.reason,e)}.`),1)}return await t.runBrowserOpen(n),0}async function uf(e){let{createEphemeralProjectDir:t}=await import(`./src-
|
|
86
|
+
`)}\n`)})}function Qd(e){switch(e){case`shared`:return A(`shared`);case`local-only`:return A(`local-only`);case`no-git`:return M(`no-git (not a git repository)`)}}function $d(){return new D(`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=L(e.project??process.cwd()),n=kn(t,En(t));if(n.kind===`refused-tracked`){if(e.json){let e={type:`sharing-unshare`,projectRoot:t,mode:`refused-tracked`,tracked:n.tracked,remediation:n.remediation};process.stdout.write(`${JSON.stringify(e)}\n`)}else process.stderr.write(`${n.remediation}\n`);process.exitCode=1;return}if(n.kind===`no-exclude`){ef(e.json,t,n.reason);return}let r=Nn(t);if(e.json){let e={type:`sharing-unshare`,projectRoot:t,mode:r,appended:n.appended,alreadyPresent:n.alreadyPresent};process.stdout.write(`${JSON.stringify(e)}\n`);return}if(n.appended.length===0){process.stderr.write(`${N(`Sharing mode is already`)} ${A(`local-only`)} ${N(`— nothing to do.`)}\n`);return}process.stderr.write(`${A(`✓`)} ${N(`Sharing mode set to`)} ${A(`local-only`)}\n`),process.stderr.write(` Added ${n.appended.length} path(s) to ${N(`.git/info/exclude`)} (per-clone, not committed).\n`)})}function ef(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(`${M({"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 tf(){let e=new D(`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(Yd()),e.addCommand($d()),e.addCommand(Zd()),e}const nf=new Set([`--cwd`,`--log-level`]);function rf(e){let t=[],n=null,r=!1;for(let i=0;i<e.length;i++){let a=e[i];if(a===`--help`||a===`-h`||a===`--version`||a===`-V`){r=!0;break}if(a===`--cwd`||a===`--log-level`){a===`--cwd`&&(n=e[i+1]??null),i++;continue}if(a.startsWith(`--cwd=`)){n=a.slice(6);continue}if(!a.startsWith(`--log-level=`)&&!(a===`--no-color`||a===`--color`)){if(a.startsWith(`-`)){nf.has(a)&&i++;continue}t.push(a)}}return{operands:t,cwd:n,sawTerminalFlag:r}}function af(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 of(e){return/\.(md|mdx)$/i.test(e)}function sf(e,t){if(of(t))return!0;try{return V(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 cf(e=()=>_n(bn())){return{prepare:nt,detectBundlePath:()=>e().bundlePath??null,openTarget:dd,runProjectOpen:(e,t)=>_d(e,{project:t},pd()),runBrowserOpen:e=>uf(e),log:e=>process.stdout.write(`${e}\n`),error:e=>process.stderr.write(`${e}\n`)}}async function lf(e,t){let n;try{n=t.prepare(e)}catch(e){if(e instanceof yt||e instanceof kt||e instanceof Tt)return t.error(e.message),1;throw e}if(n.mode===`project`)return await t.runProjectOpen(n.docName,n.projectRoot);if(t.detectBundlePath()){let e=`openknowledge://open?file=${encodeURIComponent(n.canonicalFilePath)}`,r=await t.openTarget(e);return r.ok?(t.log(`Opening ${n.singleDocRelPath} in the OpenKnowledge desktop app.`),0):(t.error(`Could not open the OpenKnowledge desktop app: ${fd(r.reason,e)}.`),1)}return await t.runBrowserOpen(n),0}async function uf(e){let{createEphemeralProjectDir:t}=await import(`./src-DRQtLkln.mjs`),{loadConfig:n}=await import(`./src-BgcwWUW8.mjs`),{bootStartServer:r,resolveBundledReactShellDir:i,resolveHost:a}=await import(`./start-CZTOPPJD.mjs`),{openBrowser:o}=await import(`./open-browser-DD5VHxHl.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()}catch{}try{await Tr(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}/#/${Xe(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
87
|
`),o(h)),await new Promise(()=>{})}function df(){let e=new D(`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=L(process.cwd()),n=De(He(t)?.rootPath??t),r=Nt({projectDir:n}),i={...r,skills:r.skills.filter(e=>he(e.provenance,n))};if(e.json){process.stdout.write(`${JSON.stringify(i,null,2)}\n`);return}if(i.skills.length===0){process.stdout.write(`${k(`No installed skills found across any agent.`)}\n`);return}process.stdout.write(`${N(`${i.skills.length} installed skill(s):`)}\n`);for(let e of i.skills){let t=e.provenance.version?k(` v${e.provenance.version}`):``,n=[e.inert.commands&&`commands`,e.inert.hooks&&`hooks`,e.inert.mcp&&`mcp`].filter(Boolean),r=n.length>0?k(` [${n.join(`, `)}]`):``;process.stdout.write(` ${A(e.name)}${t} ${k(e.sourceHarnesses.join(`, `))}${r}\n`)}process.stdout.write(`\n${N(`${i.packs.length} pack(s):`)}\n`);for(let e of i.packs)process.stdout.write(` ${O(e.name)} ${k(`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=Qt(w(process.cwd()),`server`);if(n.status!==`alive`){process.stderr.write(`${j(`Error:`)} no running Open Knowledge server for this project. Start it with ${N(`ok start`)} and retry.\n`),process.exitCode=1;return}let r;try{r=await fetch(`http://127.0.0.1:${n.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(`${j(`Error:`)} could not reach the server: ${t}\n`),process.exitCode=1;return}let i=await r.json().catch(()=>({}));if(!r.ok){let e=i.detail??i.title??`HTTP ${r.status}`;process.stderr.write(`${j(`Import failed:`)} ${e}\n`),process.exitCode=1;return}let a=i.name;if(i.alreadyImported){process.stdout.write(`${O(`Already imported:`)} ${N(a)} (identical content).\n`);return}let o=i.provenance??{},s=i.collisionRenamedFrom;process.stdout.write(`${A(`Imported`)} ${N(a)}${s?k(` (renamed from ${s} — name was taken)`):``} from ${k(o.source??e)}${o.publisher?k(` · ${o.publisher}`):``}.\n${k(`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 i.warnings??[])process.stdout.write(` ${k(`! ${e}`)}\n`)}),e}function ff(e){return{server:pf(`server`,e),ui:e.status===`alive`&&Ut(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 pf(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 mf(e){return`${hf(e.server)}\n${hf(e.ui)}`}function hf(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 gf(e){let t=e.inspect??(()=>Qt(e.lockDir,`server`)),n=e.log??(e=>console.log(e)),r=ff(t());return e.json?n(JSON.stringify(r,null,2)):n(mf(r)),r}function _f(e){return new D(`status`).description(`Show live state of the server + ui lockfiles for this project`).option(`--json`,`Emit structured JSON instead of formatted text`).action(t=>{e(),gf({lockDir:w(process.cwd()),json:t.json===!0})})}function vf(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 yf(e,t){let n=kr({input:e.input,output:e.output});try{return(await n.question(t)).trim()}finally{n.close()}}async function bf(e={}){let t={input:e.input??process.stdin,output:e.output??process.stderr};t.output.write(k(`
|
|
88
88
|
What you share is sent to the OpenKnowledge team.
|
|
89
89
|
`));let n=await Ln({message:`Before you go, mind sharing why? (optional)`,default:null,pageSize:be.length+1,choices:[...be.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 yf(t,k(`Anything else we should know? (optional) `)),i=await yf(t,k(`Email, if we may follow up (optional) `));return{reason:n,note:r||void 0,email:i||void 0}}async function xf(e){if(!vf(e))return`not-prompted`;let t;try{t=await(e.collect??(()=>bf(e)))()}catch{return`failed`}return S(t)?((e.output??process.stderr).write(`\n${N(`Thank you. We read every response.`)}\n\n`),(await(e.submit??ce)({...t,source:`cli_uninstall`,appVersion:e.appVersion,platform:e.platform})).ok?`submitted`:`undelivered`):`skipped`}function Sf(e,t,n=Cf,r=R,i={}){let a=[],o=i.platform??process.platform,s=i.env??process.env;if(o===`darwin`)for(let t of[`/Applications/OpenKnowledge.app`,F(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=F(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 Cf(e){try{return er(`npm`,e,T({encoding:`utf-8`,timeout:5e3,stdio:[`ignore`,`pipe`,`ignore`]}))}catch{return null}}const wf=`━`.repeat(64);function Tf(e,t=process.platform){let n=[M(wf),N(` One more step — remove the OpenKnowledge app itself`),k(` (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(k(` Install method not detected. If you installed it, remove it via:`)),n.push(` ${O(`OK Desktop`)} — ${e}`),n.push(` ${O(`npm global`)} — npm uninstall -g @inkeep/open-knowledge`),n.push(` ${O(`npx`)} — nothing to remove (runs from a temporary cache)`)}else for(let t of e)n.push(` ${O(t.label)}`),n.push(` ${t.instruction}`);return n.push(M(wf)),n.join(`
|
|
@@ -93,7 +93,7 @@ What you share is sent to the OpenKnowledge team.
|
|
|
93
93
|
`,required:!1,theme:{icon:{checked:`[x]`,unchecked:`[ ]`}},choices:e.map(e=>({name:`${e.path}${e.current?` (current)`:``}${e.running?` (running — will be stopped)`:``}`,value:e.path,checked:!1}))})}const Af=k(`The openknowledge:// URL scheme deregisters itself once the app is removed — no action needed.`);async function jf(e={}){let t=e.home??Sr(),n=e.platform??process.platform,r=e.env??process.env,i=L(e.cwd??process.cwd()),a=e.host??`github.com`,o=e.purgeContent??!1,s=e.deps?.discoverLockDirs??Et,c=e.deps?.resolveRecentProjects??Of,l=e.deps?.detectInstallMethods??Sf,u=await s(),d=No({home:t,platform:n,env:r,host:a,lockDirs:u,marker:Xt(t),recentDeinitProjectRoots:await c({home:t,platform:n,env:r,cwd:i,lockDirs:u,yes:e.yes,allProjects:e.allProjects,dryRun:e.dryRun,isTTY:e.isTTY}),purgeContent:o}),f=k("Individual projects are only removed when you select them (or pass --all-projects). To remove OpenKnowledge from one project, run `ok deinit` inside it."),p=()=>Tf(l(t,e.argv1??process.argv[1],void 0,void 0,{platform:n,env:r}),n);if(e.dryRun)return{status:`dry-run`,message:e.json?JSON.stringify(Uo(d),null,2):[N(`Would remove (dry-run — no changes made):`),``,Vo(d),``,f,``,p()].join(`
|
|
94
94
|
`),exitCode:0};if(e.json&&!e.yes)return{status:`failed`,message:`${j(`Error:`)} --json requires --yes (or --dry-run) so there is no interactive prompt.`,exitCode:1};if(!e.yes){if(!(e.isTTY??process.stdout.isTTY))return{status:`cancelled`,message:`${j(`Aborted:`)} refusing to uninstall non-interactively without --yes.`,exitCode:1};if(process.stderr.write(`${N(`This will remove OpenKnowledge from your machine:`)}\n\n${Vo(d)}\n\n${M(`This cannot be undone.`)}\n\n`),!await wo(`${N(`Remove all of the above?`)} ${k(`[y/N] `)}`,e.confirmStream))return{status:`cancelled`,message:k(`Cancelled. Nothing was removed.`),exitCode:0}}let m=await Lo(d,e.deps?.runRemovalDeps),h=m.failed.length===0?async()=>{await xf({stdinIsTTY:e.isStdinTTY,stdoutIsTTY:e.isTTY,yes:e.yes,json:e.json,appVersion:Wn,platform:n,...e.deps?.feedback})}:void 0,g=[e.json?JSON.stringify(Wo(`uninstall`,m),null,2):Ho(m)];return e.json||(g.push(``,f,Af),m.failed.length===0&&g.push(``,A(`OpenKnowledge's files have been removed from this machine.`)),g.push(``,p())),{status:m.failed.length>0?`failed`:`done`,message:g.join(`
|
|
95
95
|
`),exitCode:+(m.failed.length>0),runFeedbackAfterReport:h}}function Mf(){return new D(`uninstall`).description(`Remove OpenKnowledge from your machine — credentials, PATH entries, editor MCP configs, skill bundles, app data, and ~/.ok. Keeps your markdown content and your authored skills (~/.ok/skills) unless --purge-content. Detects the app install and prints how to remove it; never self-deletes.`).option(`-y, --yes`,`Skip the confirmation prompt (removes the global footprint only; add --all-projects to also deinit projects)`).option(`--dry-run`,`Print the removal plan and exit without changing anything`).option(`--json`,`Emit a machine-readable plan/outcome (requires --yes or --dry-run)`).option(`--purge-content`,`Also remove user-authored content (~/.ok/skills)`).option(`--all-projects`,`Also deinit every recent/running project (by default no project is removed — you pick them interactively)`).action(async e=>{let t=await jf({yes:e.yes,dryRun:e.dryRun,json:e.json,purgeContent:e.purgeContent,allProjects:e.allProjects});process.stdout.write(`${t.message}\n`),await t.runFeedbackAfterReport?.(),t.exitCode!==0&&(process.exitCode=t.exitCode)})}function Nf(e){return[e,`Copyright (C) 2026 Inkeep, Inc.`,`License GPL-3.0-or-later: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.`,`This is free software: you are free to change and redistribute it.`,`There is NO WARRANTY, to the extent permitted by law.`].join(`
|
|
96
|
-
`)}process.argv.includes(`--no-color`)?(process.env.NO_COLOR=`1`,delete process.env.FORCE_COLOR):process.argv.includes(`--color`)&&(process.env.FORCE_COLOR=`1`,delete process.env.NO_COLOR),Mt();const Q=new D;let $,Pf;function Ff(){return Pf}Q.name(`open-knowledge`).description(`Local-first knowledge base with CRDT collaboration`).usage(`[options] [file | command]`).version(Nf(Wn)).option(`--cwd <path>`,`Working directory`).option(`--log-level <level>`,`Log level: silent, error, warn, info (default), debug, trace`,`info`).option(`--no-color`,`Disable color output`).option(`--color`,`Force color output`).hook(`preAction`,e=>{let t=e.opts().cwd;if(t!==void 0&&process.chdir(t),Q.getOptionValueSource(`logLevel`)===`cli`){let e=String(Q.opts().logLevel);process.env.LOG_LEVEL=e,process.env.OK_CONSOLE_LEVEL=e}let n=e.args?.[0],r=Yt(n,process.cwd());r!==null&&(fn(process.cwd()),process.chdir(r),console.error(`[ok] Using OpenKnowledge project at ${r}`));let i;try{let e=Kn(r??t);if(i=e.config,mo(n))for(let t of e.diagnostics)t.code===`REMOVED_KEY`&&console.error(`[ok] ${
|
|
96
|
+
`)}process.argv.includes(`--no-color`)?(process.env.NO_COLOR=`1`,delete process.env.FORCE_COLOR):process.argv.includes(`--color`)&&(process.env.FORCE_COLOR=`1`,delete process.env.NO_COLOR),Mt();const Q=new D;let $,Pf;function Ff(){return Pf}Q.name(`open-knowledge`).description(`Local-first knowledge base with CRDT collaboration`).usage(`[options] [file | command]`).version(Nf(Wn)).option(`--cwd <path>`,`Working directory`).option(`--log-level <level>`,`Log level: silent, error, warn, info (default), debug, trace`,`info`).option(`--no-color`,`Disable color output`).option(`--color`,`Force color output`).hook(`preAction`,e=>{let t=e.opts().cwd;if(t!==void 0&&process.chdir(t),Q.getOptionValueSource(`logLevel`)===`cli`){let e=String(Q.opts().logLevel);process.env.LOG_LEVEL=e,process.env.OK_CONSOLE_LEVEL=e}let n=e.args?.[0],r=Yt(n,process.cwd());r!==null&&(fn(process.cwd()),process.chdir(r),console.error(`[ok] Using OpenKnowledge project at ${r}`));let i;try{let e=Kn(r??t);if(i=e.config,mo(n))for(let t of e.diagnostics)t.code===`REMOVED_KEY`&&console.error(`[ok] ${_(t)}`);for(let t of e.ignoredCommittedKeys)console.error(`[ok] ${_e(t)}`)}catch(e){if(n===`uninstall`||n===`deinit`)console.error(`[ok] project config could not be loaded; ${n} will use defaults: ${e instanceof Error?e.message:String(e)}`),i=$e.parse({});else throw e}$=i;let a=e.args?.[0]??e.name()??`cli`;Pf=st({name:`cli`,project:i.project?.name??void 0}),Pf.info({command:a,cwd:process.cwd()},`cli command started`)}),Q.action(async()=>{let e=_n(bn());if(e.available){mn({spawn:nr},e);return}await Jn($,{})});const If=Yn(()=>$);Q.addCommand(If);const Lf=uu(()=>$);Q.addCommand(Lf),Q.addCommand(Vn()),Q.addCommand(Ad()),Q.addCommand(ld()),Q.addCommand(Co(),{hidden:!0}),Q.addCommand(Qn()),Q.addCommand(df());const Rf=yd(()=>$);Q.addCommand(Rf),Q.addCommand(Lr(()=>$)),Q.addCommand(Ur(()=>$));const zf=new D(`ui`).description("Removed: the editor UI is served by `ok start`").allowUnknownOption().allowExcessArguments().argument(`[args...]`).action(()=>{console.error("`ok ui` was removed — the editor UI is served by the project server. Run `ok start` instead."),process.exit(1)});Q.addCommand(zf,{hidden:!0}),Q.addCommand(vd()),Q.addCommand(an(()=>$)),Q.addCommand(ja(()=>$)),Q.addCommand(_f(()=>$)),Q.addCommand(Ko()),Q.addCommand(Mf()),Q.addCommand(cn()),Q.addCommand(Ms()),Q.addCommand(Oa()),Q.addCommand(ho()),Q.addCommand(Ea(Ff)),Q.addCommand(Ks()),Q.addCommand(to(()=>$)),Q.addCommand(xd(()=>$)),Q.addCommand(Cd(()=>$)),Q.addCommand(Sd(()=>$)),Q.addCommand(Jd()),Q.addCommand(tf()),Q.addHelpText(`after`,`
|
|
97
97
|
Examples:
|
|
98
98
|
ok Launch the desktop app (or start a local server if it isn't installed)
|
|
99
99
|
ok notes.md Open a single markdown file in the editor
|