@inkeep/open-knowledge 0.16.1-beta.5 → 0.16.1-beta.7
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/assets/skills/discovery/SKILL.md +1 -1
- package/dist/assets/skills/project/SKILL.md +1 -1
- package/dist/cli.mjs +6 -6
- package/dist/config-schema.json +0 -8
- package/dist/config.project-local.schema.json +0 -8
- package/dist/constants-BuOKDREu.mjs +2 -0
- package/dist/{dist-rExniLf0.mjs → dist-Dat97svn.mjs} +1 -1
- package/dist/{dist-B5ugV3tB.mjs → dist-DvEI00I1.mjs} +5 -5
- package/dist/{gh-detect-Dfl-0bCl.mjs → gh-detect-Dv4BrBzE.mjs} +2 -2
- package/dist/index.mjs +1 -1
- package/dist/{init-D4eCLZHx.mjs → init-BO9tnd8g.mjs} +4 -4
- package/dist/init-BZtiKpeO.mjs +1 -0
- package/dist/{loader-CznR1-tF.mjs → loader-BicOC80J.mjs} +2 -2
- package/dist/loader-Bq5LpCql.mjs +1 -0
- package/dist/preview-BPvWgmw3.mjs +1 -0
- package/dist/{preview-Cv68jNOp.mjs → preview-C7YD86Pc.mjs} +2 -2
- package/dist/public/assets/{ActivityModeContent-MZN4dhuA.js → ActivityModeContent-CvNu5QeL.js} +1 -1
- package/dist/public/assets/{DocumentContext-Dlz6eiMY.js → DocumentContext-B2cgZ6u1.js} +1 -1
- package/dist/public/assets/{GraphPanel-Ch6asGi2.js → GraphPanel-BLt5dvIN.js} +1 -1
- package/dist/public/assets/{OpenInAgentMenuRequestContext-BaZwdwql.js → OpenInAgentMenuRequestContext-CoEBuGe4.js} +1 -1
- package/dist/public/assets/{SettingsDialogBody-isrpM8KM.js → SettingsDialogBody-pUhuKxTx.js} +1 -1
- package/dist/public/assets/{SourceEditor-BmtVP-xk.js → SourceEditor-D_Cx18k-.js} +1 -1
- package/dist/public/assets/{TerminalPanel-Cjyt7ADc.js → TerminalPanel-BPH4SxUM.js} +1 -1
- package/dist/public/assets/{config-validation-events-DirpEeMi.js → config-validation-events-CUcTdeK7.js} +1 -1
- package/dist/public/assets/{dist-BIbxx2ds.js → dist-DDSUF34u.js} +2 -2
- package/dist/public/assets/index-DJWeEt10.js +2002 -0
- package/dist/public/assets/{keyboard-shortcuts-DhU9JBBP.js → keyboard-shortcuts-C7gwridP.js} +1 -1
- package/dist/public/assets/{prop-types-JdxpK0Ba.js → prop-types-Cb0hUmc6.js} +1 -1
- package/dist/public/assets/{target-navigation-intent-h5JrxhMT.js → target-navigation-intent-Cq0mfQqN.js} +1 -1
- package/dist/public/index.html +8 -8
- package/dist/{repair-launch-json-XkDFre78.mjs → repair-launch-json-e8LkOdCc.mjs} +2 -2
- package/dist/{repair-mcp-configs-DI0OaEgi.mjs → repair-mcp-configs--EEo_NYX.mjs} +2 -2
- package/dist/{repair-skills-BatmOz-w.mjs → repair-skills-7PrXw-wL.mjs} +2 -2
- package/dist/repair-skills-FzkUuF_z.mjs +1 -0
- package/dist/schemas/v0/config.project-local.schema.json +0 -8
- package/dist/{server-lock-BpjJj3OD-7KPAM7xJ.mjs → server-lock-BpjJj3OD-C32FtL5e.mjs} +3 -3
- package/dist/server-lock-CyhBidkz-B9tZw0V1.mjs +1 -0
- package/dist/{src-HpKFbF6n.mjs → src-M3O8DB6m.mjs} +2 -2
- package/dist/start-DCkVhUyE.mjs +1 -0
- package/dist/{start-C614hOB1.mjs → start-jFVdiCIZ.mjs} +2 -2
- package/dist/{write-project-skill-DoMniLr2.mjs → write-project-skill-DUCFyVhD.mjs} +2 -2
- package/package.json +1 -1
- package/dist/constants-ZvimrlQT.mjs +0 -2
- package/dist/init-Cu5hVl1G.mjs +0 -1
- package/dist/loader-YEbI0Gik.mjs +0 -1
- package/dist/preview-RdJjnniT.mjs +0 -1
- package/dist/public/assets/index-Ci9LNJxW.js +0 -2002
- package/dist/repair-skills-m7tDCrOx.mjs +0 -1
- package/dist/server-lock-CyhBidkz-Cn1wgQoO.mjs +0 -1
- package/dist/start-BPNv3yFV.mjs +0 -1
|
@@ -3,7 +3,7 @@ name: open-knowledge-discovery
|
|
|
3
3
|
description: "Read when the user asks what Open Knowledge is, wants to install it on a repository, wants to share an Open Knowledge project with collaborators, or asks how `ok init` / `ok install-skill` / OK Desktop set up a project. Do NOT load to perform Open Knowledge reads/writes — the runtime guidance for editing markdown inside an initialized OK project ships as a separate project-local skill at `.claude/skills/open-knowledge/` whenever `ok init` runs. If the user appears to be editing markdown inside a `.ok/` project and this is the only OK skill loaded, advise them to re-run `ok init` to install the project-local skill."
|
|
4
4
|
compatibility: "Any agent host — no MCP server required. Pure discovery + install guidance."
|
|
5
5
|
metadata:
|
|
6
|
-
version: "0.16.1-beta.
|
|
6
|
+
version: "0.16.1-beta.7"
|
|
7
7
|
author: "Inkeep"
|
|
8
8
|
repository: "https://github.com/inkeep/open-knowledge"
|
|
9
9
|
---
|
|
@@ -3,7 +3,7 @@ name: open-knowledge
|
|
|
3
3
|
description: "MUST invoke before reading or editing any `.md` / `.mdx` file, and before any `mcp__open-knowledge__*` tool call (`exec`, `search`, `write`, `edit`, and the rest). This skill is installed into the repository by `ok init`, so its presence alone means this is an Open Knowledge project — its runtime contract governs every markdown file here, with no need to probe for a `.ok/` directory. Authoritative agent-runtime contract for working inside this Open Knowledge project."
|
|
4
4
|
compatibility: "Claude Code, Claude Desktop, Claude Cowork, Claude.ai web. Requires Open Knowledge MCP server + code execution."
|
|
5
5
|
metadata:
|
|
6
|
-
version: "0.16.1-beta.
|
|
6
|
+
version: "0.16.1-beta.7"
|
|
7
7
|
author: "Inkeep"
|
|
8
8
|
repository: "https://github.com/inkeep/open-knowledge"
|
|
9
9
|
---
|
package/dist/cli.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{s as e}from"./chunk-C94x7I9S.mjs";import{t}from"./esm-BLMtE3s6.mjs";import{$i as n,Aa as r,Bi as i,Cr as a,Fi as o,Ii as s,Kr as c,Qi as l,Yr as u,Zi as d,aa as f,bn as p,br as m,f as h,ga as g,hi as _,ia as v,ja as y,n as b,oa as x,pa as S,qi as C,ra as ee,s as w,ua as T}from"./server-lock-BpjJj3OD-
|
|
2
|
+
import{s as e}from"./chunk-C94x7I9S.mjs";import{t}from"./esm-BLMtE3s6.mjs";import{$i as n,Aa as r,Bi as i,Cr as a,Fi as o,Ii as s,Kr as c,Qi as l,Yr as u,Zi as d,aa as f,bn as p,br as m,f as h,ga as g,hi as _,ia as v,ja as y,n as b,oa as x,pa as S,qi as C,ra as ee,s as w,ua as T}from"./server-lock-BpjJj3OD-C32FtL5e.mjs";import{a as te,n as ne,r as re,t as ie}from"./gh-detect-Dv4BrBzE.mjs";import{r as E}from"./git-handle--dq7Gq14-BpH0pmv5.mjs";import{$n as ae,Br as oe,Bt as se,Cn as ce,En as le,F as ue,Fn as de,Gi as fe,Hn as pe,Ht as me,Ji as he,Ki as ge,Kr as _e,P as ve,Pr as ye,Q as be,Qi as xe,Rn as Se,T as Ce,Ur as D,Vt as we,Wi as Te,Xt as Ee,Yi as De,Z as Oe,_ as ke,_t as Ae,aa as je,ai as Me,an as Ne,at as Pe,br as Fe,c as Ie,dn as Le,ea as Re,it as ze,jt as Be,mt as Ve,na as He,qi as Ue,qt as We,ra as Ge,rt as Ke,ta as qe,tt as Je,un as Ye,v as Xe,w as Ze,wr as Qe,xt as $e,yn as et,yr as tt}from"./dist-DvEI00I1.mjs";import{t as nt}from"./yazl-Docqgl6q.mjs";import{n as rt,r as it,t as at}from"./dist-bundle-D75dREX-.mjs";import{A as ot,C as st,D as ct,E as lt,F as ut,I as dt,L as ft,M as pt,N as mt,O as ht,P as gt,S as _t,T as vt,b as yt,j as bt,k as xt,u as St,v as Ct,w as wt}from"./init-BO9tnd8g.mjs";import{a as Tt,c as Et,h as Dt,i as Ot,l as kt,m as At,o as jt,s as Mt,u as Nt}from"./src-M3O8DB6m.mjs";import{n as Pt,t as Ft}from"./constants-BuOKDREu.mjs";import{n as It,t as Lt}from"./loader-BicOC80J.mjs";import{S as Rt,_ as zt,b as Bt,m as Vt,x as Ht,y as Ut}from"./start-jFVdiCIZ.mjs";import{c as Wt,i as O,n as k,o as A,r as Gt,s as j,t as M}from"./colors-CBY1ibtz.mjs";import{n as Kt}from"./repair-skills-7PrXw-wL.mjs";import{execFile as qt,execSync as Jt,spawn as N,spawnSync as P}from"node:child_process";import{accessSync as Yt,closeSync as Xt,constants as Zt,cpSync as Qt,createWriteStream as $t,existsSync as F,mkdirSync as I,mkdtempSync as en,openSync as tn,readFileSync as L,readdirSync as nn,realpathSync as rn,rmSync as an,statSync as on,unlinkSync as sn,writeFileSync as R}from"node:fs";import cn,{basename as z,dirname as ln,join as B,relative as un,resolve as V,sep as dn}from"node:path";import fn from"node:process";import{arch as pn,freemem as mn,homedir as hn,platform as gn,release as _n,tmpdir as vn,totalmem as yn,type as bn,uptime as xn}from"node:os";import{fileURLToPath as Sn}from"node:url";import{rm as Cn}from"node:fs/promises";import{createHash as wn,randomUUID as Tn}from"node:crypto";import{setTimeout as En}from"node:timers/promises";import{promisify as Dn,stripVTControlCharacters as On,styleText as H}from"node:util";import{AsyncLocalStorage as kn,AsyncResource as An}from"node:async_hooks";import*as jn from"node:readline";import{createInterface as Mn}from"node:readline/promises";const Nn={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 Pn;(function(e){})(Pn||={});function Fn(e){return g(C,e)}async function In(e,t,n,r){let i=Ln(await Rn(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 Ln(e){let t={};for(let n of e.split(`
|
|
3
3
|
`)){let e=n.trim();if(e===``)continue;let r=e.indexOf(`=`);r!==-1&&(t[e.slice(0,r)]=e.slice(r+1))}return t}function Rn(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 zn(e,n){let r=new t(`git-credential`);return r.description(`Git credential helper (git credential-helper protocol)`),r.command(`get`).description(`Lookup credentials from TokenStore (called by git)`).action(async()=>{let t=n?.();try{let n,r=await e({onKeychainRead:e=>{n=e},onBackendSelected:e=>{e.backend===`file`&&e.reason&&t?.warn({backend:`file`,reason:e.reason},`[auth] token storage fallback`)}}),i=await In(process.stdin,process.stdout,r,{log:t,getDiag:()=>n});await et(t),process.exit(i)}catch(e){t?.error({error:e instanceof Error?e.message:String(e)},`[auth] git-credential get: unexpected error`),await et(t),process.exit(1)}}),r}function Bn(e){let t=e.endpoint.DEFAULTS;return/^https:\/\/(api\.)?github\.com$/.test(t.baseUrl)?`https://github.com`:t.baseUrl.replace(`/api/v3`,``)}async function Vn(e,t,n){let r={baseUrl:Bn(e),headers:{accept:`application/json`},...n},i=await e(t,r);if(`error`in i.data){let n=new rt(`${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 Hn(e){let t=e.request||at,n={client_id:e.clientId};return`scopes`in e&&Array.isArray(e.scopes)&&(n.scope=e.scopes.join(` `)),Vn(t,`POST /login/device/code`,n)}async function Un(e){let t=await Vn(e.request||at,`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=Wn(e,t.data.expires_in),n.refreshTokenExpiresAt=Wn(e,t.data.refresh_token_expires_in)}delete n.scopes}return{...t,authentication:n}}function Wn(e,t){return new Date(e+t*1e3).toISOString()}async function Gn(e,t){let n=Kn(e,t.auth);if(n)return n;let{data:r}=await Hn({clientType:e.clientType,clientId:e.clientId,request:t.request||e.request,scopes:t.auth.scopes||e.scopes});await e.onVerification(r);let i=await Jn(t.request||e.request,e.clientId,e.clientType,r);return e.authentication=i,i}function Kn(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 qn(e){await new Promise(t=>setTimeout(t,e*1e3))}async function Jn(e,t,n,r){try{let i={clientId:t,request:e,code:r.device_code},{authentication:a}=n===`oauth-app`?await Un({...i,clientType:`oauth-app`}):await Un({...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 qn(r.interval),Jn(e,t,n,r);if(a===`slow_down`)return await qn(r.interval+7),Jn(e,t,n,r);throw i}}async function Yn(e,t){return Gn(e,{auth:t})}async function Xn(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 Gn(e,{request:t,auth:{type:`oauth`}});return i.headers.authorization=`token ${a}`,t(i)}var Zn=`0.0.0-development`;function Qn(e){let t=e.request||at.defaults({headers:{"user-agent":`octokit-auth-oauth-device.js/${Zn} ${it()}`}}),{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(Yn.bind(null,i),{hook:Xn.bind(null,i)})}async function $n(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=Qn({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-BnlRWriT.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 er(){return process.env.OPEN_KNOWLEDGE_GITHUB_CLIENT_ID??`Ov23liqlSd0V1MwR6rhI`}const tr=new Set([`gitlab.com`,`bitbucket.org`,`codeberg.org`,`gitea.com`,`sr.ht`,`sourcehut.org`]);function U(e){let t=e.toLowerCase().replace(/:\d+$/,``);tr.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 nr(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function rr(e,t,n=$n){let r=er(),{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?nr(!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?nr(!0,{type:`complete`,host:i,login:s}):process.stderr.write(`✓ Logged in as ${s} on ${i}\n`)}function ir(e){return new t(`login`).description(`Authenticate with GitHub via Device Flow`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{await rr(t,await e())})}const ar=e=>e.name===`enter`||e.name===`return`;var or=class extends Error{name=`AbortPromptError`;message=`Prompt was aborted`;constructor(e){super(),this.cause=e?.cause}},sr=class extends Error{name=`CancelPromptError`;message=`Prompt was canceled`},cr=class extends Error{name=`ExitPromptError`},lr=class extends Error{name=`HookError`},ur=class extends Error{name=`ValidationError`};const dr=new kn;function fr(e){return{rl:e,hooks:[],hooksCleanup:[],hooksEffect:[],index:0,handleChange(){}}}function pr(e,t){let n=fr(e);return dr.run(n,()=>{function e(e){n.handleChange=()=>{n.index=0,e()},n.handleChange()}return t(e)})}function W(){let e=dr.getStore();if(!e)throw new lr(`[Inquirer] Hook functions can only be called from within a prompt`);return e}function mr(){return W().rl}function hr(e){return An.bind((...t)=>{let n=W(),r=!1,i=n.handleChange;n.handleChange=()=>{r=!0};let a=e(...t);return r&&i(),n.handleChange=i,a})}function gr(e){let t=W(),{index:n}=t,r=e({get(){return t.hooks[n]},set(e){t.hooks[n]=e},initialized:n in t.hooks});return t.index++,r}function _r(){W().handleChange()}const vr={queue(e){let t=W(),{index:n}=t;t.hooksEffect.push(()=>{t.hooksCleanup[n]?.();let r=e(mr());if(r!=null&&typeof r!=`function`)throw new ur(`useEffect return value must be a cleanup function or nothing.`);t.hooksCleanup[n]=r})},run(){let e=W();hr(()=>{e.hooksEffect.forEach(e=>{e()}),e.hooksEffect.length=0})()},clearAll(){let e=W();e.hooksCleanup.forEach(e=>{e?.()}),e.hooksEffect.length=0,e.hooksCleanup.length=0}};function yr(e){return typeof e==`function`}function G(e){return gr(t=>{let n=An.bind(function(e){t.get()!==e&&(t.set(e),_r())});if(t.initialized)return[t.get(),n];let r=yr(e)?e():e;return t.set(r),[r,n]})}function br(e,t){gr(n=>{let r=n.get();(!Array.isArray(r)||t.some((e,t)=>!Object.is(e,r[t])))&&vr.queue(e),n.set(t)})}const xr={prefix:{idle:H(`blue`,`?`),done:H(`green`,ft.tick)},spinner:{interval:80,frames:[`⠋`,`⠙`,`⠹`,`⠸`,`⠼`,`⠴`,`⠦`,`⠧`,`⠇`,`⠏`].map(e=>H(`yellow`,e))},style:{answer:e=>H(`cyan`,e),message:e=>H(`bold`,e),error:e=>H(`red`,`> ${e}`),defaultAnswer:e=>H(`dim`,`(${e})`),help:e=>H(`dim`,e),highlight:e=>H(`cyan`,e),key:e=>H(`cyan`,H(`bold`,`<${e}>`))}};function Sr(e){if(typeof e!=`object`||!e)return!1;let t=e;for(;Object.getPrototypeOf(t)!==null;)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t}function Cr(...e){let t={};for(let n of e)for(let[e,r]of Object.entries(n)){let n=t[e];t[e]=Sr(n)&&Sr(r)?Cr(n,r):r}return t}function wr(...e){return Cr(xr,...e.filter(e=>e!=null))}function Tr({status:e=`idle`,theme:t}){let[n,r]=G(!1),[i,a]=G(0),{prefix:o,spinner:s}=wr(t);return br(()=>{if(e===`loading`){let e,t=-1,n=setTimeout(()=>{r(!0),e=setInterval(()=>{t+=1,a(t%s.frames.length)},s.interval)},300);return()=>{clearTimeout(n),clearInterval(e)}}else r(!1)},[e]),n?s.frames[i]:typeof o==`string`?o:o[e===`loading`?`idle`:e]??o.idle}function Er(e){return G({current:e})[0]}function Dr(e){let t=Er(e);t.current=e,br(e=>{let n=!1,r=hr((r,i)=>{n||t.current(i,e)});return e.input.on(`keypress`,r),()=>{n=!0,e.input.removeListener(`keypress`,r)}},[])}var Or=e(dt(),1);function kr(e,t){return e.split(`
|
|
4
4
|
`).flatMap(e=>ut(e,t,{trim:!1,hard:!0}).split(`
|
|
5
5
|
`).map(e=>e.trimEnd())).join(`
|
|
@@ -19,9 +19,9 @@ import{s as e}from"./chunk-C94x7I9S.mjs";import{t}from"./esm-BLMtE3s6.mjs";impor
|
|
|
19
19
|
`),patterns:[...t],lineCount:n}}const Yi=B(hn(),`.ok`,`logs`),Xi=B(hn(),`.ok`,`bug-reports`);function Zi(e){let t=B(e,`.ok`,`config.yml`);if(F(t))try{let e=L(t,`utf8`).match(/^\s*name:\s*['"]?(.+?)['"]?\s*$/m);if(e?.[1])return e[1]}catch{}return F(B(e,`.ok`))?wn(`sha256`).update(V(e)).digest(`hex`).slice(0,12):null}function Qi(){let e={timestamp:new Date().toISOString(),platform:gn(),osType:bn(),osRelease:_n(),hostname:`[redacted]`,uptime:xn(),freeMem:mn(),totalMem:yn(),nodeVersion:process.version,bunVersion:process.versions.bun??null,v8Version:process.versions.v8??null,pid:process.pid};try{e.macosVersion=Jt(`sw_vers -productVersion 2>/dev/null`,{encoding:`utf8`}).trim()}catch{}try{let t=B(__dirname,`..`,`..`,`package.json`);F(t)&&(e.okVersion=JSON.parse(L(t,`utf8`)).version)}catch{}return e}function $i(e){if(!F(Yi))return{files:[],dir:Yi};let t=nn(Yi).filter(e=>e.endsWith(`.log`)||/\.log\.\d+$/.test(e)).map(e=>B(Yi,e));if(e&&t.length>0){let n=t.filter(t=>{try{return L(t,`utf8`).includes(`"project":"${e}"`)}catch{return!0}});n.length>0&&(t=n)}return{files:t,dir:Yi}}function ea(e){let t=B(e,`.ok`,`local`);return F(t)?{files:[`server.lock`,`last-spawn-error.log`].map(e=>B(t,e)).filter(e=>F(e)),dir:t}:{files:[],dir:null}}function ta(e){let t=B(e,`.ok`,`local`,`logs`);return F(t)?{files:[`server-current.jsonl`,`server-prev.jsonl`].map(e=>B(t,e)).filter(e=>F(e)),dir:t}:{files:[],dir:null}}async function na(t){let n=Uu();I(Xi,{recursive:!0});let r=B(Xi,`${new Date().toISOString().replace(/[:.]/g,`-`)}-bugreport.zip`);n?.info({projectSlug:t.projectSlug},`gathering diagnostic data`);let i=Qi(),{files:a}=$i(t.projectSlug),{files:o}=ea(t.cwd),{files:s}=ta(t.cwd);n?.info({logFileCount:a.length,lockFileCount:o.length,localSinkFileCount:s.length},`files collected`);let c=[],l=[],{ZipFile:u}=await import(`./yazl-CQSNnbvt.mjs`).then(t=>e(t.default,1)),d=new u;for(let e of a)try{let{redacted:t,patterns:n,lineCount:r}=Ji(L(e,`utf8`)),i=`logs/${z(e)}`;d.addBuffer(Buffer.from(t,`utf8`),i),l.push(i),n.length>0&&c.push({file:i,lineCount:r,patterns:n})}catch{}for(let e of o)try{let{redacted:t,patterns:n,lineCount:r}=Ji(L(e,`utf8`)),i=`lockdir/${z(e)}`;d.addBuffer(Buffer.from(t,`utf8`),i),l.push(i),n.length>0&&c.push({file:i,lineCount:r,patterns:n})}catch{}for(let e of s)try{let{redacted:t,patterns:n,lineCount:r}=Ji(L(e,`utf8`)),i=`local-logs/${z(e)}`;d.addBuffer(Buffer.from(t,`utf8`),i),l.push(i),n.length>0&&c.push({file:i,lineCount:r,patterns:n})}catch{}let f=JSON.stringify(i,null,2);d.addBuffer(Buffer.from(f,`utf8`),`sysinfo.json`),l.push(`sysinfo.json`);let p={generatedAt:new Date().toISOString(),disciplineVersion:`1.0.0`,projectSlug:t.projectSlug,files:l,redactions:c,sysinfo:i};d.addBuffer(Buffer.from(JSON.stringify(p,null,2),`utf8`),`MANIFEST.json`);let m=c.reduce((e,t)=>e+t.lineCount,0),h=[`# Bug Report Bundle`,``,`Generated: ${p.generatedAt}`,`Project: ${t.projectSlug??`(unscoped)`}`,`Discipline version: ${p.disciplineVersion}`,``,`## Contents`,``,...l.map(e=>`- ${e}`),``,`## Privacy`,``,`This bundle was auto-redacted before packaging.`,`Patterns checked: ${qi.join(`, `)}`,m>0?`${m} line(s) were scrubbed across ${c.length} file(s).`:`No redactions were needed.`,`See MANIFEST.json for the full redaction audit report.`,``,`This bundle is safe to attach to a GitHub issue.`].join(`
|
|
20
20
|
`);d.addBuffer(Buffer.from(h,`utf8`),`README.md`),d.end();let g=$t(r);if(d.outputStream.pipe(g),await new Promise((e,t)=>{g.on(`close`,e),g.on(`error`,t)}),n?.info({bundlePath:r,fileCount:l.length,redactionCount:m},`bundle written`),process.stdout.write(`${r}\n`),m>0&&process.stderr.write(`ok bug-report: ${m} line(s) auto-redacted across ${c.length} file(s)\n`),!t.noReveal&&gn()===`darwin`)try{N(`/usr/bin/open`,[`-R`,r],{detached:!0,stdio:`ignore`}).unref()}catch{}return r}function ra(){return new t(`bug-report`).description(`Generate a diagnostic bundle for bug reporting`).option(`--reveal`,`Reveal the bundle in Finder (default: true)`,!0).option(`--no-reveal`,`Do not reveal the bundle in Finder`).action(async e=>{let t=process.cwd(),n=Zi(t);try{await na({projectSlug:n,cwd:t,noReveal:!e.reveal})}catch(e){let t=e instanceof Error?e.message:String(e);process.stderr.write(`ok bug-report: failed — ${t}\n`),process.exitCode=1}})}function ia(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=>Dt(e.lockDir,t)),n=e.unlink??(e=>sn(e)),r=e.log??(e=>console.log(e)),i=e.error??(e=>console.error(e)),a=ia(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 oa(e){return new t(`clean`).description(`Prune stale / corrupt open-knowledge lock files (never touches live locks)`).action(()=>{e(),aa({lockDir:D(process.cwd())}).failed.length>0&&(process.exitCode=1)})}async function sa(e,t,n={},r=ie){if(!n.skipGhDetect&&r().available)return{tier:`A`,credentialArgs:[`-c`,`credential.helper=!gh auth git-credential`]};let i=await t.get(e);return i==null?{tier:`none`,credentialArgs:[]}:{tier:i.gitProtocol===`ssh`?`C`:`B`,credentialArgs:[`-c`,`credential.helper=!open-knowledge auth git-credential`]}}async function ca(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 la=[[`count`,0,10],[`compress`,10,20],[`receiv`,20,60],[`resolv`,60,100]];function ua(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 la)if(n.includes(e))return{stage:t[1],pct:Math.round(i+r/100*(a-i))};return null}function J(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}function da(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 fa(e){return typeof e!=`string`||e.length===0?[`--progress`]:[`--progress`,`-b`,e]}const pa=c;async function ma(e){try{return await e.clone(fa(e.branch)),{fellBack:!1}}catch(t){if(e.branch!==null&&pa(t))return e.onFallback(e.branch),await e.clone(fa(null)),{fellBack:!0};throw t}}function ha(e,t){return{baseDir:e,config:t,unsafe:{allowUnsafeCredentialHelper:!0,allowUnsafePager:!0,allowUnsafeSshCommand:!0,allowUnsafeAskPass:!0}}}function ga(e,t,n){return e===`https`&&t===`github.com`&&n}function _a(e,t){let n=`${t.owner}/${t.name}`;return e===n||e===`${n}.git`?`https://${t.hostname}/${n}`:e}async function va(e,t,n,r=process.cwd()){let i=At(e);if(!i)throw Error(`Invalid git URL: ${e}`);let a=_a(e,i),o=t.dir?V(r,t.dir):V(r,i.name);if(F(o)&&nn(o).length>0)throw Error(`Target directory is not empty: ${o}`);let s=te(),c=i.protocol===`https`&&i.hostname===`github.com`?await ca(i.owner,i.name):!1,l=ga(i.protocol,i.hostname,c)?{tier:`none`,credentialArgs:[]}:await sa(i.hostname,s,{}),u=da(),d=E(ha(r,l.credentialArgs.length>=2?[l.credentialArgs[1]]:[])).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(`
|
|
21
21
|
`)){let n=ua(e);n&&n.pct!==f&&(f=n.pct,J(t.json,{type:`progress`,pct:n.pct,stage:n.stage}),t.json||process.stderr.write(`\r Cloning ${n.pct}%`))}})}),await ma({branch:typeof t.branch==`string`&&t.branch.length>0?t.branch:null,clone:e=>d.clone(a,o,e),onFallback:e=>{J(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(`
|
|
22
|
-
`);try{let{runInit:e}=await import(`./init-
|
|
22
|
+
`);try{let{runInit:e}=await import(`./init-BZtiKpeO.mjs`),n=await e({cwd:o,mcp:!1});if(n.contentUpdated.length>0){let e=`auto-init: updated ${n.contentUpdated.join(`, `)}`;t.json?J(!0,{type:`warning`,message:e}):process.stderr.write(` ${e}\n`)}}catch(e){let n=e instanceof Error?e.message:String(e);t.json?J(!0,{type:`warning`,message:`auto-init: ${n}`}):process.stderr.write(` auto-init: ${n}\n`)}try{ya(o)}catch(e){let n=e instanceof Error?e.message:String(e);t.json?J(!0,{type:`warning`,message:`git-exclude: ${n}`}):process.stderr.write(` git-exclude: ${n}\n`)}return o}function ya(e){let t=yt(e,[`.ok/`]);return t.kind===`no-exclude`?`no-exclude`:t.kind===`refused-tracked`?`already-present`:t.appended.length>0?`appended`:`already-present`}const ba=/^[A-Za-z0-9._/:@-]+$/;function xa(e){return ba.test(e)?e:_(e)}function Sa(e,t){let n=typeof t==`string`&&t.length>0?` -b ${xa(t)}`:``;return`ok clone ${xa(e)}${n}`}function Ca(e){let t=m(e.error);if(t.kind!==`auth`)return null;if(u(t)){let t=Sa(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(`
|
|
23
23
|
`)}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: ${Sa(e.url,e.branch)}`].join(`
|
|
24
|
-
`)}function wa(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=Ca({error:e.error,url:e.url,branch:e.branch,principal:e.principal});e.printStderr(`${n??`✗ ${t}`}\n`)}async function Ta(e,t){let n=(await e.get(t))?.login;return n&&n!==`unknown`?n:null}async function Ea(e){let t=m(e.error),n=null;if(!e.json&&t.kind===`auth`&&t.subclass===`403`){let t=At(e.url);t&&(n=await(e.resolvePrincipal??(e=>Ta(te(),e)))(t.hostname))}wa({error:e.error,url:e.url,branch:e.branch,json:e.json,principal:n,emit:e.emit,printStderr:e.printStderr})}function Da(e){return new t(`clone`).description(`Clone a git repository and open it`).argument(`<url>`,`Repository URL or owner/repo shorthand`).argument(`[dir]`,`Target directory (default: ./<repo-name>)`).option(`--json`,`Output JSONL progress events`,!1).option(`-b, --branch <branch>`,`Branch to check out (falls back to default if missing)`).action(async(t,n,r)=>{let i=e();try{let a=await va(t,{json:r.json,dir:n,branch:r.branch??null},i);if(r.json)J(!0,{type:`complete`,dir:a});else{process.stderr.write(`✓ Cloned to ${a}\n`),process.chdir(a);let{startCommand:t}=await import(`./start-
|
|
24
|
+
`)}function wa(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=Ca({error:e.error,url:e.url,branch:e.branch,principal:e.principal});e.printStderr(`${n??`✗ ${t}`}\n`)}async function Ta(e,t){let n=(await e.get(t))?.login;return n&&n!==`unknown`?n:null}async function Ea(e){let t=m(e.error),n=null;if(!e.json&&t.kind===`auth`&&t.subclass===`403`){let t=At(e.url);t&&(n=await(e.resolvePrincipal??(e=>Ta(te(),e)))(t.hostname))}wa({error:e.error,url:e.url,branch:e.branch,json:e.json,principal:n,emit:e.emit,printStderr:e.printStderr})}function Da(e){return new t(`clone`).description(`Clone a git repository and open it`).argument(`<url>`,`Repository URL or owner/repo shorthand`).argument(`[dir]`,`Target directory (default: ./<repo-name>)`).option(`--json`,`Output JSONL progress events`,!1).option(`-b, --branch <branch>`,`Branch to check out (falls back to default if missing)`).action(async(t,n,r)=>{let i=e();try{let a=await va(t,{json:r.json,dir:n,branch:r.branch??null},i);if(r.json)J(!0,{type:`complete`,dir:a});else{process.stderr.write(`✓ Cloned to ${a}\n`),process.chdir(a);let{startCommand:t}=await import(`./start-DCkVhUyE.mjs`);await t(e).parseAsync([],{from:`user`})}}catch(e){await Ea({error:e,url:t,branch:r.branch??null,json:r.json,emit:e=>J(!0,e),printStderr:e=>process.stderr.write(e)}),process.exitCode=1}})}var Oa=y();const ka=[[`sync`],[`persistence`,`debounceMs`],[`persistence`,`maxDebounceMs`],[`server`,`port`],...s.map(e=>e.path)];function Aa(e={}){let t=e.log??(e=>console.error(e)),n=e.error??(e=>console.error(e)),r=e.loadConfigFn??It;try{let{sources:n}=r(e.cwd);return t(`✓ Configuration valid (sources: ${n.length===0?`defaults only`:n.join(`, `)})`),{ok:!0}}catch(e){return n(e instanceof Error?e.message:String(e)),{ok:!1}}}function ja(e){let t=(0,Oa.parseDocument)(L(e,`utf-8`));if(t.errors.length>0)throw Error(`Could not parse ${e}: ${t.errors.map(e=>e.message).join(`; `)}`);let n=[];for(let e of ka)t.hasIn(e)&&n.push(e.join(`.`));return n}function Ma(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Na(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=Ma(i)?i:{};e[r]=a,e=a}e[n[n.length-1]]=null}return t}async function Pa(e={}){let t=e.log??(e=>console.log(e)),n=e.error??(e=>console.error(e)),r=e.scope??`both`,a=e.dryRun??!1,o=e.cwd??process.cwd(),s=e.writeConfigPatchFn??Re,c=[];(r===`project`||r===`both`)&&c.push({scope:`project`,absPath:xe(`project`,o,e.homedirOverride)}),(r===`user`||r===`both`)&&c.push({scope:`user`,absPath:xe(`user`,o,e.homedirOverride)});let l=[],u=!0;for(let{scope:t,absPath:n}of c){if(!F(n)){l.push({path:n,scope:t,found:[],removed:[]});continue}let r;try{r=ja(n)}catch(e){let r=e instanceof Error?e.message:String(e);l.push({path:n,scope:t,found:[],removed:[],error:r}),u=!1;continue}if(r.length===0||a){l.push({path:n,scope:t,found:r,removed:[]});continue}let c=await s({cwd:o,scope:t,patch:Na(ka.filter(e=>r.includes(e.join(`.`)))),homedirOverride:e.homedirOverride});if(!c.ok){l.push({path:n,scope:t,found:r,removed:[],error:i(c.error)}),u=!1;continue}l.push({path:n,scope:t,found:r,removed:r})}for(let e of l)e.error&&n(`✗ ${e.path}: ${e.error}`);let d=l.some(e=>e.error!==void 0),f=l.reduce((e,t)=>e+t.found.length,0);if(f===0&&!d)t(`No deprecated fields found.`);else if(f>0)for(let e of l)e.error||(e.found.length===0?t(` ${e.path}: no deprecated fields`):t(a?`[dry-run] ${e.path}: would remove ${e.found.length} field(s): ${e.found.join(`, `)}`:`✓ ${e.path}: removed ${e.removed.length} field(s): ${e.removed.join(`, `)}`));return{outcomes:l,ok:u}}function Fa(){let e=new t(`config`).description(`Inspect and maintain Open Knowledge configuration files`);return e.command(`validate`).description(`Validate the merged config (defaults → user → project)`).action(()=>{Aa({}).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.*, server.port)`).option(`--scope <scope>`,`Which scope to migrate: project | user | both`,`both`).option(`--dry-run`,`Preview without writing`,!1).action(async e=>{let t=e.scope;if(t!==`project`&&t!==`user`&&t!==`both`){console.error(`Invalid --scope: ${t}. Expected: project | user | both`),process.exitCode=2;return}(await Pa({scope:t,dryRun:e.dryRun})).ok||(process.exitCode=1)}),e}var Ia=e(nt(),1),Y=e(Wt(),1);const La=new Set([`doc.name`]);function Ra(e){return`doc:${wn(`blake2b512`,{outputLength:32}).update(e).digest(`hex`).slice(0,8)}`}function za(e,t,n){let r=e.docNameMap[n];if(r===void 0){e.docNameMap[n]=t;return}if(r===t)return;let i=e.docNameCollisions[n];i?i.includes(t)||i.push(t):e.docNameCollisions[n]=[t]}function Ba(e,t){let n=t.originalToHashed.get(e);if(n!==void 0)return n;let r=Ra(e);return t.originalToHashed.set(e,r),za(t,e,r),r}function Va(e,t){return t.length===0||!e.includes(t)?e:e.split(t).join(`<CONTENT_DIR>`)}function Ha(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Ua(e,t){if(typeof e==`string`)return Va(e,t.contentDir);if(Array.isArray(e))return e.map(e=>Ua(e,t));if(!Ha(e))return e;let n=typeof e.key==`string`&&La.has(e.key)&&Ha(e.value)&&typeof e.value.stringValue==`string`?e.value.stringValue:null,r={};for(let[i,a]of Object.entries(e))if(n!==null&&i===`value`&&Ha(a)){let e=Ba(n,t);r[i]={...a,stringValue:e}}else La.has(i)&&typeof a==`string`?r[i]=Ba(a,t):r[i]=Ua(a,t);return r}function Wa(e,t){if(t.originalToHashed.size===0)return e;let n=Array.from(t.originalToHashed.entries()).sort(([e],[t])=>t.length-e.length),r=e;for(let[e,t]of n)e.length!==0&&r.includes(e)&&(r=r.split(e).join(t));return r}function Ga(e,t){let n=L(e,`utf-8`);if(n.length===0)return;let r=n.endsWith(`
|
|
25
25
|
`),i=n.split(`
|
|
26
26
|
`),a=[];for(let e=0;e<i.length;e++){let n=i[e]??``;if(!(e===i.length-1&&n===``)){if(n.length===0){a.push(``);continue}try{let e=Ua(JSON.parse(n),t);a.push(JSON.stringify(e))}catch{a.push(n)}}}R(e,r?`${a.join(`
|
|
27
27
|
`)}\n`:a.join(`
|
|
@@ -52,7 +52,7 @@ ws.addEventListener('error', () => process.exit(1));
|
|
|
52
52
|
setTimeout(() => process.exit(2), ${t+1e4});
|
|
53
53
|
`),r}async function rs(e,t,n,r,i){let a=ns(e,t,B(r,`cpu.cpuprofile`)),o=!1,s=N(process.execPath,[a],{stdio:`ignore`}),c=setInterval(()=>{let e=Qo(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{an(B(a,`..`),{recursive:!0,force:!0})}catch{}return o}function is(e){let t;try{t=JSON.parse(e)}catch{return`(could not parse profile)`}let n=new Map(t.nodes.map(e=>[e.id,e])),r=new Map;for(let e of t.nodes)for(let t of e.children??[])r.set(t,e.id);let i=new Map;for(let e of t.samples??[])i.set(e,(i.get(e)??0)+1);let a=t.samples?.length??0,o=t.endTime!=null&&t.startTime!=null?((t.endTime-t.startTime)/1e3).toFixed(2):`?`,s=[...i.entries()].sort((e,t)=>t[1]-e[1]).slice(0,10),c=[`samples ${a} duration_ms ${o}`,``,`Top leaf nodes`];for(let[e,t]of s){let r=n.get(e);if(!r)continue;let i=a>0?(t/a*100).toFixed(1):`0.0`,{functionName:o,url:s,lineNumber:l,columnNumber:u}=r.callFrame;c.push(` ${t} ${i}% id=${e} ${o||`(anonymous)`} ${s}:${l}:${u} hit=${r.hitCount??0}`)}c.push(``,`Top stacks`);let l=e=>{let t=[],i=e;for(;i!=null;){let e=n.get(i);if(!e)break;let{functionName:a,url:o,lineNumber:s,columnNumber:c}=e.callFrame;t.unshift(` ${a||`(anonymous)`} ${o} ${s} ${c}`),i=r.get(i)}return t};for(let[e,t]of s.slice(0,5)){let n=a>0?(t/a*100).toFixed(1):`0.0`;c.push(``,`--- ${t} ${n}%`,...l(e))}return c.join(`
|
|
54
54
|
`)}async function as(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??Dt,c=t.resolveCommand??kt,l=t.resolveUsage??Nt,u=t.collectLsofFn??$o,d=t.getEndpoints??ts,f=t.profiler??rs,p=t.isAlive??(e=>{try{return process.kill(e,0),!0}catch(e){return e.code===`EPERM`}}),m=t.sendSignal??((e,t)=>{process.kill(e,t)}),h=t.sleep??(e=>new Promise(t=>setTimeout(t,e))),g=r*1e3;if(!p(n)){a(Y.default.red(`No process with pid ${n} found.`));return}let _=await o(),v=null,y=null;for(let e of _){let t=s(e,`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?B(v,`.ok`,`local`,`diagnostics`,`process-${n}-${b}`):B(process.cwd(),`ok-diagnose-${n}-${b}`);try{I(x,{recursive:!0})}catch(e){a(Y.default.red(`Cannot create output directory ${x}: ${e.message}`));return}a(Y.default.bold(`Diagnosing pid ${n}`)),a(`Output: ${x}`),a(``);let S=(e,t)=>{R(B(x,e),t),a(` wrote ${e}`)},C=c(n),ee=l(n);S(`metadata.json`,JSON.stringify({capturedAt:new Date().toISOString(),pid:n,command:C,usage:ee,lockInfo:y},null,2)),a(` sampling lsof`);let w=u(n);if(w&&S(`lsof.txt`,w),!i){let e=w?es(w).find(e=>e>=9229&&e<=9299)??9229:9229,t=d(e);if(!t||t.length===0){a(` no inspector on :${e}, sending SIGUSR1 to pid ${n}`);try{m(n,`SIGUSR1`),await h(2e3),t=d(e)}catch(e){a(Y.default.yellow(` SIGUSR1 delivery failed: ${e.message}`))}}if(t&&t.length>0){S(`inspector-endpoints.json`,JSON.stringify(t,null,2));let e=t[0].webSocketDebuggerUrl;if(e){a(` capturing ${r}s CPU profile`);let t=[];await f(e,g,n,x,e=>t.push(e))?a(` wrote cpu.cpuprofile`):a(Y.default.yellow(` CPU profile capture failed`)),t.length>0&&S(`process-stats.jsonl`,`${t.map(e=>JSON.stringify(e)).join(`
|
|
55
|
-
`)}\n`);try{S(`stacks.txt`,is(L(B(x,`cpu.cpuprofile`),`utf-8`)))}catch(e){a(Y.default.yellow(` stacks.txt skipped: ${e.message}`))}}}else a(Y.default.yellow(` Node inspector unavailable — skipping CPU profile`))}a(``),a(Y.default.yellow(`⚠ Before sharing, review what each file contains:`)),a(` metadata.json — content directory paths, lock file locations, CPU/MEM at capture time`),a(` lsof.txt — all open files, network connections, and private paths for this process`),a(` inspector-endpoints.json — Node debugger metadata (titles, URLs)`),a(` cpu.cpuprofile — function names and source file paths from your Node process`),a(` stacks.txt — call stacks derived from cpu.cpuprofile; includes source paths`),a(` process-stats.jsonl — CPU/MEM/RSS numbers only; safe to share`),a(``),a(`Bundle: ${Y.default.bold(x)}`)}async function os(e){let t=Mn({input:process.stdin,output:process.stdout});try{return(await t.question(e)).trim()}finally{t.close()}}async function ss(e){let t=en(B(vn(),`ok-bundle-process-`));return await as({pid:e,output:t}),t}function cs(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 ls(e){let t=e.trim().toLowerCase();return t===`y`||t===`yes`}function us(e,t,n){let{summary:r,manifest:i}=t;e(``),e(Y.default.bold(`ok diagnose bundle — content summary`)),e(``),e(` Files: ${r.fileCount}`),e(` Total size: ${cs(r.totalBytes)} uncompressed`),e(` doc.name attributes: ${r.docNameCount} occurrence(s) in telemetry${r.redacted?` (values hashed)`:``}`),e(` Content-dir path: ${r.contentDirVisible?`visible (${i.contentDir.absolutePath})`:`not visible`}`),e(` Redacted: ${r.redacted?`yes`:`no`}`),e(` Server status: ${i.serverStatus}`),e(` Output: ${n}`),e(``)}async function ds(e,t={}){let n=t.log??(e=>console.log(e)),r=t.prompt??os,i=t.runProcessDiagnose??ss,a=t.now??(()=>new Date),o;if(e.out!==void 0){o=e.out;let t=ln(o);if(!F(t))throw Error(`ok diagnose bundle: --out parent directory does not exist: ${t}. Create it first.`)}else{let t=a().toISOString().replace(/[:.]/g,`-`),n=B(e.contentDir,`.ok`,`local`,`diagnostics`);I(n,{recursive:!0}),o=B(n,`bundle-${t}.zip`)}let s;e.pid!==void 0&&(n(Y.default.dim(`Running ok diagnose process ${e.pid} into a temp dir`)),s=await i(e.pid));let c=await Do({contentDir:e.contentDir,projectDir:e.projectDir,processDir:s,redact:e.redact===!0,deps:t.collectDeps});try{return c.manifest.serverStatus===`not-running`&&n(Y.default.yellow(` server not running — live state unavailable`)),us(n,c,o),e.yes!==!0&&!ls(await r(`Write bundle? [y/N]: `))?(n(Y.default.dim(`Aborted; no bundle written.`)),{outputPath:null,declined:!0}):(await Oo({collected:c,outputPath:o}),n(Y.default.bold(`Bundle: ${o}`)),{outputPath:o,declined:!1})}finally{if(c.cleanup(),s!==void 0)try{an(s,{recursive:!0,force:!0})}catch{}}}function fs(){let e=new t(`diagnose`).description(`Diagnostic utilities for open-knowledge processes`);return e.command(`process`).description(`Capture a diagnostic bundle (metadata, lsof, CPU profile) for a running process`).argument(`<pid>`,`Process ID to diagnose`).option(`--cpu-profile <seconds>`,`CPU profile duration (default: 15)`,`15`).option(`--output <dir>`,`Output directory`).option(`--no-inspector`,`Collect metadata only; skip Node inspector and CPU profile`).action(async(e,t)=>{let n=Number.parseInt(e,10);(Number.isNaN(n)||n<=0)&&(console.error(Y.default.red(`Invalid pid '${e}': must be a positive integer`)),process.exit(1));let r=Number.parseInt(t.cpuProfile,10);(Number.isNaN(r)||r<=0)&&(console.error(Y.default.red(`--cpu-profile must be a positive integer`)),process.exit(1)),await as({pid:n,cpuProfileSecs:r,output:t.output,noInspector:!t.inspector})}),e.addCommand(Zo()),e.command(`bundle`).description(`Capture a support bundle (telemetry + logs + server state) into a zip suitable for bug reports`).option(`--pid <pid>`,"Include `ok diagnose process <pid>` output under process/ in the bundle").option(`--out <path>`,`Write the zip to this path instead of the default location`).option(`--yes`,`Skip the y/N prompt`).option(`--redact`,`Hash doc names and strip the content-dir prefix from the staged bundle`).action(async e=>{let t;e.pid!==void 0&&(t=Number.parseInt(e.pid,10),(Number.isNaN(t)||t<=0)&&(console.error(Y.default.red(`Invalid --pid '${e.pid}': must be a positive integer`)),process.exit(1)));try{let{loadConfig:n}=await import(`./loader-
|
|
55
|
+
`)}\n`);try{S(`stacks.txt`,is(L(B(x,`cpu.cpuprofile`),`utf-8`)))}catch(e){a(Y.default.yellow(` stacks.txt skipped: ${e.message}`))}}}else a(Y.default.yellow(` Node inspector unavailable — skipping CPU profile`))}a(``),a(Y.default.yellow(`⚠ Before sharing, review what each file contains:`)),a(` metadata.json — content directory paths, lock file locations, CPU/MEM at capture time`),a(` lsof.txt — all open files, network connections, and private paths for this process`),a(` inspector-endpoints.json — Node debugger metadata (titles, URLs)`),a(` cpu.cpuprofile — function names and source file paths from your Node process`),a(` stacks.txt — call stacks derived from cpu.cpuprofile; includes source paths`),a(` process-stats.jsonl — CPU/MEM/RSS numbers only; safe to share`),a(``),a(`Bundle: ${Y.default.bold(x)}`)}async function os(e){let t=Mn({input:process.stdin,output:process.stdout});try{return(await t.question(e)).trim()}finally{t.close()}}async function ss(e){let t=en(B(vn(),`ok-bundle-process-`));return await as({pid:e,output:t}),t}function cs(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 ls(e){let t=e.trim().toLowerCase();return t===`y`||t===`yes`}function us(e,t,n){let{summary:r,manifest:i}=t;e(``),e(Y.default.bold(`ok diagnose bundle — content summary`)),e(``),e(` Files: ${r.fileCount}`),e(` Total size: ${cs(r.totalBytes)} uncompressed`),e(` doc.name attributes: ${r.docNameCount} occurrence(s) in telemetry${r.redacted?` (values hashed)`:``}`),e(` Content-dir path: ${r.contentDirVisible?`visible (${i.contentDir.absolutePath})`:`not visible`}`),e(` Redacted: ${r.redacted?`yes`:`no`}`),e(` Server status: ${i.serverStatus}`),e(` Output: ${n}`),e(``)}async function ds(e,t={}){let n=t.log??(e=>console.log(e)),r=t.prompt??os,i=t.runProcessDiagnose??ss,a=t.now??(()=>new Date),o;if(e.out!==void 0){o=e.out;let t=ln(o);if(!F(t))throw Error(`ok diagnose bundle: --out parent directory does not exist: ${t}. Create it first.`)}else{let t=a().toISOString().replace(/[:.]/g,`-`),n=B(e.contentDir,`.ok`,`local`,`diagnostics`);I(n,{recursive:!0}),o=B(n,`bundle-${t}.zip`)}let s;e.pid!==void 0&&(n(Y.default.dim(`Running ok diagnose process ${e.pid} into a temp dir`)),s=await i(e.pid));let c=await Do({contentDir:e.contentDir,projectDir:e.projectDir,processDir:s,redact:e.redact===!0,deps:t.collectDeps});try{return c.manifest.serverStatus===`not-running`&&n(Y.default.yellow(` server not running — live state unavailable`)),us(n,c,o),e.yes!==!0&&!ls(await r(`Write bundle? [y/N]: `))?(n(Y.default.dim(`Aborted; no bundle written.`)),{outputPath:null,declined:!0}):(await Oo({collected:c,outputPath:o}),n(Y.default.bold(`Bundle: ${o}`)),{outputPath:o,declined:!1})}finally{if(c.cleanup(),s!==void 0)try{an(s,{recursive:!0,force:!0})}catch{}}}function fs(){let e=new t(`diagnose`).description(`Diagnostic utilities for open-knowledge processes`);return e.command(`process`).description(`Capture a diagnostic bundle (metadata, lsof, CPU profile) for a running process`).argument(`<pid>`,`Process ID to diagnose`).option(`--cpu-profile <seconds>`,`CPU profile duration (default: 15)`,`15`).option(`--output <dir>`,`Output directory`).option(`--no-inspector`,`Collect metadata only; skip Node inspector and CPU profile`).action(async(e,t)=>{let n=Number.parseInt(e,10);(Number.isNaN(n)||n<=0)&&(console.error(Y.default.red(`Invalid pid '${e}': must be a positive integer`)),process.exit(1));let r=Number.parseInt(t.cpuProfile,10);(Number.isNaN(r)||r<=0)&&(console.error(Y.default.red(`--cpu-profile must be a positive integer`)),process.exit(1)),await as({pid:n,cpuProfileSecs:r,output:t.output,noInspector:!t.inspector})}),e.addCommand(Zo()),e.command(`bundle`).description(`Capture a support bundle (telemetry + logs + server state) into a zip suitable for bug reports`).option(`--pid <pid>`,"Include `ok diagnose process <pid>` output under process/ in the bundle").option(`--out <path>`,`Write the zip to this path instead of the default location`).option(`--yes`,`Skip the y/N prompt`).option(`--redact`,`Hash doc names and strip the content-dir prefix from the staged bundle`).action(async e=>{let t;e.pid!==void 0&&(t=Number.parseInt(e.pid,10),(Number.isNaN(t)||t<=0)&&(console.error(Y.default.red(`Invalid --pid '${e.pid}': must be a positive integer`)),process.exit(1)));try{let{loadConfig:n}=await import(`./loader-Bq5LpCql.mjs`),{resolveContentDir:r}=await import(`./dist-Dat97svn.mjs`),i=process.cwd(),{config:a}=n(i);await ds({contentDir:r(a,i),projectDir:i,pid:t,out:e.out,yes:e.yes===!0,redact:e.redact===!0})}catch(e){let t=e instanceof Error?e.message:String(e);console.error(Y.default.red(t)),process.exit(1)}}),e}async function ps(){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 Br({message:`Enter OpenAI embeddings API key:`})).trim()}function ms(e){return Qe(e)}async function hs(){return(await Ne()).file?{present:!0,source:`file`}:process.env.OK_EMBEDDINGS_API_KEY?{present:!0,source:`env`}:{present:!1,source:null}}async function gs(e){try{let t=h(D(e));if(!t||t.port<=0||!w(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 _s(){return new t(`set-key`).description(`Store your OpenAI embeddings API key in ~/.ok/secrets.yml`).action(async()=>{let e=await ps();if(!e){process.stderr.write(`No key provided.
|
|
56
56
|
`),process.exitCode=1;return}await We().set(e),process.stderr.write(`✓ OpenAI embeddings API key stored in ~/.ok/secrets.yml (0600, this machine only).
|
|
57
57
|
Now enable it per project — the easiest path is OK Desktop → Settings → This
|
|
58
58
|
project → Search (a toggle with an egress-confirmation prompt), or run
|
|
@@ -72,7 +72,7 @@ project → Search (a toggle with an egress-confirmation prompt), or run
|
|
|
72
72
|
`).filter(e=>e.startsWith(`worktree `)).length}catch{return 0}}function Nl(e){let t=V(e);for(;;){if(ae(t))return t;let n=ln(t);if(n===t)throw Error(`No Open Knowledge project found at or above ${e}. Pass an explicit \`cwd\` argument that points inside an OK project (a directory with a \`${o}\`).`);t=n}}function Pl(e){try{let t=new URL(e);return t.protocol===`file:`?Sn(t):void 0}catch{return}}async function Fl(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=Pl(n[0].uri);return r===void 0&&e.log?.(`single root URI not usable as fs path: ${n[0].uri}`),r}async function Il(e,t,n,r=Nl){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 Ll(e){let t=process.stderr,n=e.spawnTimeoutMs??hl(process.env.OK_MCP_SPAWN_TIMEOUT_MS),r=e.envAutoStart??process.env.OK_MCP_AUTOSTART,i=Lt({startupCwd:e.startupCwd,startupConfig:e.startupConfig}),a=new Te({name:ue,version:b});pe(a);let o=Tn(),s={current:{connectionId:o,displayName:o,colorSeed:o}},c=new Map,l=e=>{if(c.has(e))return;let n=le(e),r=s.current,i=Is({connectionId:o,displayName:r.displayName,clientName:r.clientInfo?.name??r.displayName,colorSeed:r.colorSeed,resolveWsUrl:async()=>Dl({lockDir:n,contentDir:e},``),log:n=>t.write(`[mcp] keepalive[${e}]: ${n}\n`)});c.set(e,i)},u=()=>Fl({getClientCapabilities:()=>a.server.getClientCapabilities(),listRoots:()=>a.server.listRoots(),log:e=>t.write(`[mcp] ${e}\n`)}),d,f=!1,p=async e=>{if(f)return;f=!0;let n=await Ml(e);if(n<=1){f=!1;return}let r=`Routed to ${e} from the MCP client's single advertised root, but this repo has ${n} 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{t.write(`[mcp] ${r}\n`),await a.server.sendLoggingMessage({level:`warning`,data:r})}catch{}},m=async e=>{let t=await Il(e,d,u);if(d=t.nextSticky??d,t.projectDir===void 0)throw Error("`cwd` is required for tool calls against the global MCP server. Pass an absolute path inside an Open Knowledge project, or have the MCP client advertise a single root.");return t.viaRootGuess&&p(t.projectDir),t.projectDir},h=async e=>{let t=await Il(e,d,u);if(d=t.nextSticky??d,t.projectDir===void 0)return;t.viaRootGuess&&p(t.projectDir);let a=t.projectDir,o=await i(a),s=await El({lockDir:le(a),contentDir:oe(o,a),envAutoStart:r,...n===void 0?{}:{timeoutMs:n}});return l(a),s.replace(/\/mcp$/,``)};a.server.oninitialized=()=>{let e=a.server.getClientVersion(),t=Me(e?.name,o);s.current={connectionId:o,clientInfo:e?{name:t,version:e.version}:void 0,displayName:t,colorSeed:t}},ye(a,{serverUrl:h,resolveCwd:m,config:i,identityRef:s});let g=new Bs,_=!1,v,y,x=async()=>{if(_)return;_=!0,v?.stop(),y?.stop();for(let e of c.values())try{e.close()}catch(e){t.write(`[mcp] keepalive close error: ${e instanceof Error?e.message:String(e)}\n`)}c.clear();let e=await Promise.allSettled([a.close(),g.close()]);for(let n of e)if(n.status===`rejected`){let e=n.reason;t.write(`[mcp] shutdown close error: ${e instanceof Error?e.message:String(e)}\n`)}};await a.connect(g),t.write(`[mcp] global stdio server ready (per-call project routing)
|
|
73
73
|
`);let S=!1,C=()=>{S||(S=!0,setTimeout(()=>{t.write(`[mcp] shutdown deadline (5s) reached — forcing exit(1)
|
|
74
74
|
`),process.exit(1)},5e3).unref(),x().finally(()=>{process.exit(0)}))};if(process.once(`SIGINT`,C),process.once(`SIGTERM`,C),process.stdin.on(`end`,()=>{t.write(`[mcp] stdin end — host disconnected, shutting down
|
|
75
|
-
`),C()}),process.stdin.on(`error`,e=>{t.write(`[mcp] stdin error (${e instanceof Error?e.message:String(e)}) — host disconnected, shutting down\n`),C()}),y=Ws({getPpid:()=>process.ppid,onHostGone:e=>{t.write(`[mcp] ${e} — shutting down\n`),C()}}),Gs({log:e=>t.write(`${e}\n`),transport:g,process,stdin:process.stdin}),process.platform===`darwin`){let e=Us(Al,{realpathSync:rn,statInoSync:e=>on(e).ino,log:e=>t.write(`${e}\n`)});if(e!==void 0){t.write(`[mcp] bundle identity anchor=${e.resolvedPath} inode=${e.inode} version=${b}\n`);let{resolvedPath:n,inode:r}=e;v=Hs({detect:()=>Vs({bundleAnchorPath:Al,currentInode:r,platform:process.platform,realpath:rn,statInode:e=>on(e).ino}),onReplaced:e=>{t.write(`[mcp] bundle replaced anchor=${n} bootInode=${e.currentInode} onDiskInode=${e.onDiskInode} version=${b} — exiting for host respawn\n`),C()},log:e=>t.write(`[mcp] ${e}\n`)})}}return{close:x}}function Rl(e){return new t(`mcp`).description(`Start MCP stdio server for project knowledge base`).option(`-p, --port <port>`,`Override per-call routing and proxy stdio to this HTTP MCP port (skips bundle proxy)`,void 0).option(`--no-bundle-proxy`,`Run the npm-fetched MCP server in-process instead of proxying to the macOS Desktop bundle (equivalent: OK_BUNDLE_PROXY=0)`).action(async t=>{try{let n=e(),r=process.cwd();if(t.port!==void 0){let e=hl(process.env.OK_MCP_SPAWN_TIMEOUT_MS);await kl({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=Ns(process.env,i,process.platform);if(a.proxy){let e=Ms(process.platform,hn(),{existsSync:F});if(e===null)Ps({stderr:process.stderr,mode:`fallback-absent`,bundlePath:null,reason:`no installed Open Knowledge.app bundle found`});else try{await Fs({bundlePath:e,argv:process.argv.slice(2),env:process.env,stderr:process.stderr});return}catch(t){Ps({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`;Ps({stderr:process.stderr,mode:e,bundlePath:null,reason:null})}await Ll({startupCwd:r,startupConfig:n})}catch(e){process.stderr.write(`MCP server failed to start: ${e instanceof Error?e.message:String(e)}\n`),process.exitCode=1}})}function zl(e){let t={...e};return delete t.ELECTRON_RUN_AS_NODE,t}function Bl(e=()=>Ht(Bt())){return{detectBundlePath:()=>e().bundlePath??null,resolveBaseUrl:e=>_e({lockDir:D(e)}).baseUrl,openTarget:e=>{N(`open`,[e],{detached:!0,stdio:`ignore`,env:zl(process.env)}).unref()},log:e=>process.stdout.write(`${e}\n`),error:e=>process.stderr.write(`${e}\n`)}}function Vl(e,t,n){let r=V(t.project??process.cwd()),i=t.folder===!0||/\/+$/.test(e),a=e.replace(/\/+$/,``);if(!a)return n.error("Nothing to open: pass a doc path (e.g. `ok open specs/foo/SPEC`)."),1;if(a.startsWith(`/`)||a.includes(`\\`)||a.split(`/`).includes(`..`))return n.error(`Invalid name "${a}": must be a relative path with no '..' segments, leading '/', or backslashes.`),1;if(i){let e=n.resolveBaseUrl(r);if(!e)return n.error(`No Open Knowledge UI is running for ${r}. Folder preview requires a running UI — start one with \`ok ui\`, then retry.`),1;let t=`${e}/#/${Le(a)}`;return n.openTarget(t),n.log(`Opening folder ${a} in your browser: ${t}`),0}if(n.detectBundlePath()){let e=`openknowledge://open?project=${encodeURIComponent(r)}&doc=${encodeURIComponent(a)}`;return n.openTarget(e),n.log(`Opening ${a} in the Open Knowledge desktop app.`),0}let o=n.resolveBaseUrl(r);if(o){let e=`${o}/#/${Ye(a)}`;return n.openTarget(e),n.log(`Opening ${a} in your browser: ${e}`),0}return n.error("No Open Knowledge desktop app found and no UI is running. Install OK Desktop, or start a UI with `ok ui`, then retry."),1}function Hl(){return new t(`open`).description(`Open a doc in the OK Desktop app (folders open in the browser)`).argument(`<doc>`,`Extension-less doc path (e.g. specs/foo/SPEC), or a folder path with --folder`).option(`--folder`,`Treat <doc> as a folder and open the folder route in the browser`).option(`--project <dir>`,`Project root (defaults to the current directory)`).action((e,t)=>{process.exitCode=Vl(e,t,Bl())})}function Ul(e){return new t(`preview`).description(`Show what content the watcher will track (read-only)`).action(async()=>{let{previewContent:t,formatPreviewBlock:n}=await import(`./preview-
|
|
75
|
+
`),C()}),process.stdin.on(`error`,e=>{t.write(`[mcp] stdin error (${e instanceof Error?e.message:String(e)}) — host disconnected, shutting down\n`),C()}),y=Ws({getPpid:()=>process.ppid,onHostGone:e=>{t.write(`[mcp] ${e} — shutting down\n`),C()}}),Gs({log:e=>t.write(`${e}\n`),transport:g,process,stdin:process.stdin}),process.platform===`darwin`){let e=Us(Al,{realpathSync:rn,statInoSync:e=>on(e).ino,log:e=>t.write(`${e}\n`)});if(e!==void 0){t.write(`[mcp] bundle identity anchor=${e.resolvedPath} inode=${e.inode} version=${b}\n`);let{resolvedPath:n,inode:r}=e;v=Hs({detect:()=>Vs({bundleAnchorPath:Al,currentInode:r,platform:process.platform,realpath:rn,statInode:e=>on(e).ino}),onReplaced:e=>{t.write(`[mcp] bundle replaced anchor=${n} bootInode=${e.currentInode} onDiskInode=${e.onDiskInode} version=${b} — exiting for host respawn\n`),C()},log:e=>t.write(`[mcp] ${e}\n`)})}}return{close:x}}function Rl(e){return new t(`mcp`).description(`Start MCP stdio server for project knowledge base`).option(`-p, --port <port>`,`Override per-call routing and proxy stdio to this HTTP MCP port (skips bundle proxy)`,void 0).option(`--no-bundle-proxy`,`Run the npm-fetched MCP server in-process instead of proxying to the macOS Desktop bundle (equivalent: OK_BUNDLE_PROXY=0)`).action(async t=>{try{let n=e(),r=process.cwd();if(t.port!==void 0){let e=hl(process.env.OK_MCP_SPAWN_TIMEOUT_MS);await kl({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=Ns(process.env,i,process.platform);if(a.proxy){let e=Ms(process.platform,hn(),{existsSync:F});if(e===null)Ps({stderr:process.stderr,mode:`fallback-absent`,bundlePath:null,reason:`no installed Open Knowledge.app bundle found`});else try{await Fs({bundlePath:e,argv:process.argv.slice(2),env:process.env,stderr:process.stderr});return}catch(t){Ps({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`;Ps({stderr:process.stderr,mode:e,bundlePath:null,reason:null})}await Ll({startupCwd:r,startupConfig:n})}catch(e){process.stderr.write(`MCP server failed to start: ${e instanceof Error?e.message:String(e)}\n`),process.exitCode=1}})}function zl(e){let t={...e};return delete t.ELECTRON_RUN_AS_NODE,t}function Bl(e=()=>Ht(Bt())){return{detectBundlePath:()=>e().bundlePath??null,resolveBaseUrl:e=>_e({lockDir:D(e)}).baseUrl,openTarget:e=>{N(`open`,[e],{detached:!0,stdio:`ignore`,env:zl(process.env)}).unref()},log:e=>process.stdout.write(`${e}\n`),error:e=>process.stderr.write(`${e}\n`)}}function Vl(e,t,n){let r=V(t.project??process.cwd()),i=t.folder===!0||/\/+$/.test(e),a=e.replace(/\/+$/,``);if(!a)return n.error("Nothing to open: pass a doc path (e.g. `ok open specs/foo/SPEC`)."),1;if(a.startsWith(`/`)||a.includes(`\\`)||a.split(`/`).includes(`..`))return n.error(`Invalid name "${a}": must be a relative path with no '..' segments, leading '/', or backslashes.`),1;if(i){let e=n.resolveBaseUrl(r);if(!e)return n.error(`No Open Knowledge UI is running for ${r}. Folder preview requires a running UI — start one with \`ok ui\`, then retry.`),1;let t=`${e}/#/${Le(a)}`;return n.openTarget(t),n.log(`Opening folder ${a} in your browser: ${t}`),0}if(n.detectBundlePath()){let e=`openknowledge://open?project=${encodeURIComponent(r)}&doc=${encodeURIComponent(a)}`;return n.openTarget(e),n.log(`Opening ${a} in the Open Knowledge desktop app.`),0}let o=n.resolveBaseUrl(r);if(o){let e=`${o}/#/${Ye(a)}`;return n.openTarget(e),n.log(`Opening ${a} in your browser: ${e}`),0}return n.error("No Open Knowledge desktop app found and no UI is running. Install OK Desktop, or start a UI with `ok ui`, then retry."),1}function Hl(){return new t(`open`).description(`Open a doc in the OK Desktop app (folders open in the browser)`).argument(`<doc>`,`Extension-less doc path (e.g. specs/foo/SPEC), or a folder path with --folder`).option(`--folder`,`Treat <doc> as a folder and open the folder route in the browser`).option(`--project <dir>`,`Project root (defaults to the current directory)`).action((e,t)=>{process.exitCode=Vl(e,t,Bl())})}function Ul(e){return new t(`preview`).description(`Show what content the watcher will track (read-only)`).action(async()=>{let{previewContent:t,formatPreviewBlock:n}=await import(`./preview-BPvWgmw3.mjs`),r=e(),i=process.cwd(),a=oe(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 Wl(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function Gl(e,t,n=process.cwd()){let r=e.op??`sync`,i=h(D(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`,...a({kind:`cli`,runtimeVersion:b})},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}`)}Wl(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 o=E({baseDir:n});if(r===`sync`||r===`pull`){Wl(e.json,{type:`step`,step:`pull`});let t=await o.pull();Wl(e.json,{type:`pull`,summary:t.summary}),e.json||process.stderr.write(` pull: ${t.summary.changes} changes\n`)}(r===`sync`||r===`push`)&&(Wl(e.json,{type:`step`,step:`push`}),await o.push(),Wl(e.json,{type:`push`,ok:!0}),e.json||process.stderr.write(` push: ok
|
|
76
76
|
`)),Wl(e.json,{type:`complete`,op:r}),e.json||process.stderr.write(`✓ ${r} complete\n`)}function Kl(e){return new t(`sync`).description(`Commit, pull, and push to the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await Gl({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 ql(e){return new t(`pull`).description(`Pull changes from the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await Gl({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 Jl(e){return new t(`push`).description(`Push commits to the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await Gl({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 Yl(e){return typeof e==`string`&&be.includes(e)}async function Xl(e={}){let t=V(e.cwd??process.cwd()),n=e.pack??`knowledge-base`;if(!Oe[n])return{status:`failed`,message:`${Gt(`Error:`)} Unknown pack "${n}". Available: ${be.join(`, `)}`,exitCode:1};let r;try{r=await tt({projectDir:t,rootDir:e.root,packId:n})}catch(e){return e instanceof Je?{status:`prerequisite-missing`,message:`${Gt(`Error:`)} ${e.message}`,exitCode:1}:{status:`failed`,message:`${Gt(`Error:`)} ${e instanceof Error?e.message:String(e)}`,exitCode:1}}if(r.created.length===0){let e=Oe[n].name;return{status:`no-op`,message:`${A(`Your ${e} pack is already seeded.`)}\n${k(`Nothing to do.`)}`,plan:r,exitCode:0}}if(e.dryRun){let e=ce(Oe[n]);return{status:`dry-run`,message:`${M(`Reference this pack for inspiration (dry-run — no changes made):`)}\n\n${e}\n\n${M(`Plan:`)}\n\n${Ql(r,t)}`,plan:r,exitCode:0}}if(!e.yes&&!await $l(`${M(`Plan:`)}\n\n${Ql(r,t)}\n\n${M(`Apply?`)} ${k(`[Y/n] `)}`,e.confirmStream))return{status:`cancelled`,message:k(`Cancelled.`),plan:r,exitCode:0};let i=await Ve(r,{projectDir:t,packId:n});if(i.errors.length>0){let e=i.errors.map(e=>` ${Gt(`✗`)} ${e.path}: ${e.error}`);return{status:`failed`,message:[`${j(`Applied`)} ${i.applied} entries, ${j(String(i.errors.length))} error(s):`,...e].join(`
|
|
77
77
|
`),plan:r,exitCode:1}}let a=Oe[n].name,o=i.packSkillsInstalled.length>0?`\n${k(`Installed the ${a} skill for: ${i.packSkillsInstalled.join(`, `)}`)}`:``;return{status:`applied`,message:`${A(`✓ Seeded ${a}`)} ${k(`(${i.applied} entries, ${i.durationMs}ms)`)}${o}`,plan:r,exitCode:0}}function Zl(){let e=[M(`Available packs:`)];for(let t of be){let n=Oe[t];e.push(` ${A(t)} ${k(`—`)} ${n.name}: ${n.description}`)}return e.join(`
|
|
78
78
|
`)}function Ql(e,t){let n=[],r=e.created.filter(e=>e.kind===`folder`),i=e.created.filter(e=>e.kind===`file`);if(r.length>0){n.push(M(`Folders to create:`));for(let e of r)n.push(` ${A(`+`)} ${O(un(t,V(t,e.path))||e.path)}${k(`/`)}`)}if(i.length>0){n.length>0&&n.push(``),n.push(M(`Files to create:`));for(let e of i)n.push(` ${A(`+`)} ${O(un(t,V(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(j(`Warnings:`));for(let t of e.warnings)n.push(` ${j(`!`)} ${t}`)}return n.join(`
|
|
@@ -81,7 +81,7 @@ project → Search (a toggle with an egress-confirmation prompt), or run
|
|
|
81
81
|
`);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 ru(e){return new t(`name-check`).description(`Check if owner/name is available on GitHub`).requiredOption(`--owner <owner>`,`GitHub owner (user or org)`).requiredOption(`--name <name>`,`Repository name`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{await nu(t,await e())})}async function iu(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 au(e,t){let{host:n,json:r}=e;U(n);let i=await Ii(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 iu(new q({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 ou(e){return new t(`owners`).description(`List GitHub owners eligible to host a new repository`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{await au(t,await e())})}function su(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(`
|
|
82
82
|
`)??``}\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 cu(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 lu(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 uu(e,t){return(await e.users.getAuthenticated()).data.login.toLowerCase()===t.toLowerCase()?`user`:`org`}function du(e){return E({baseDir:e,unsafe:{allowUnsafeCredentialHelper:!0}}).env({GIT_TERMINAL_PROMPT:`0`})}function fu(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 pu={ensureOkScaffold:e=>{Se(e)},gitFactory:du};async function mu(e){let t={...pu,...e.deps},n=V(e.projectDir),r;if(e.ownerKind)r=e.ownerKind;else try{r=await uu(e.octokit,e.body.owner)}catch(e){return{kind:`error`,code:su(e)}}try{t.ensureOkScaffold(n)}catch{return{kind:`error`,code:`init-failed`}}let i=t.gitFactory(n);if(!F(B(n,`.git`)))try{await i.init()}catch{return{kind:`error`,code:`init-failed`}}let a;try{a=await cu({octokit:e.octokit,ownerLogin:e.body.owner,ownerKind:r,name:e.body.name,visibility:e.body.visibility,description:e.body.description})}catch(t){if(su(t)===`name-conflict`){let t=await lu(e.octokit,e.body.owner,e.body.name);if(t===null)return{kind:`error`,code:`name-conflict`};a=t}else return{kind:`error`,code:su(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=fu(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 hu(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 gu(e,t){let{host:n,owner:r,name:i,visibility:a,description:o,projectDir:s,json:c}=e;U(n);let l=await Ii(n,t);if(l==null){hu(c,{kind:`error`,code:`auth-required`});return}let u=n===`github.com`?void 0:`https://${n}/api/v3`,d=new q({auth:l,...u?{baseUrl:u}:{}});try{Jt(`git config user.email`,{cwd:s,stdio:`ignore`})}catch{process.env.GIT_AUTHOR_NAME??=`Open Knowledge`,process.env.GIT_AUTHOR_EMAIL??=`noreply@inkeep.com`,process.env.GIT_COMMITTER_NAME??=`Open Knowledge`,process.env.GIT_COMMITTER_EMAIL??=`noreply@inkeep.com`}hu(c,await mu({octokit:d,token:l,projectDir:s,body:{owner:r,name:i,visibility:a,description:o}}))}function _u(e){return new t(`publish`).description(`Publish a no-remote project to GitHub`).requiredOption(`--owner <owner>`,`GitHub owner (user or org)`).requiredOption(`--name <name>`,`Repository name`).requiredOption(`--visibility <visibility>`,`public or private`).option(`--description <description>`,`Repository description`).requiredOption(`--project-dir <projectDir>`,`Path to the project on disk`).option(`--host <host>`,`GitHub or GitHub Enterprise hostname`,`github.com`).option(`--json`,`Output JSON`,!1).action(async t=>{t.visibility!==`public`&&t.visibility!==`private`&&(process.stderr.write(`✗ visibility must be 'public' or 'private'
|
|
83
83
|
`),process.exit(1)),await gu(t,await e())})}function vu(){let e=new t(`share`);e.description(`Sharing flow operations (owners, name-check, publish)`);let n=()=>re();return e.addCommand(ou(n)),e.addCommand(ru(n)),e.addCommand(_u(n)),e}function yu(){return new t(`share`).description(`Switch this project to shared mode (commit OK config alongside content)`).option(`--project <dir>`,`Project root (defaults to cwd)`).option(`--json`,`Output JSON`,!1).action(async e=>{let t=V(e.project??process.cwd()),n=vt(t),r=lt(t,st(t));if(r.kind===`no-exclude`){bu(e.json,t,r.reason);return}let i=vt(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`)} ${M(`shared`)} ${O(`— nothing to do.`)}\n`);return}process.stderr.write(`${A(`✓`)} ${M(`Sharing mode set to`)} ${A(`shared`)}\n`),process.stderr.write(` Removed OK paths from ${M(`.git/info/exclude`)}; commit the files to share with teammates.\n`)})}function bu(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(`${j({"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 xu(){return new t(`status`).description(`Print the current sharing mode and the OK paths in .git/info/exclude`).option(`--project <dir>`,`Project root (defaults to cwd)`).option(`--json`,`Output JSON`,!1).action(async e=>{let t=V(e.project??process.cwd()),n=vt(t),r=[..._t(t)],i=wt(t,st(t)).tracked;if(e.json){let e={type:`sharing-status`,projectRoot:t,mode:n,excluded:r,trackedUpstream:i};process.stdout.write(`${JSON.stringify(e)}\n`);return}let a=[];if(a.push(`Open Knowledge sharing mode: ${Su(n)}`),a.push(``),a.push(`Excluded from git via ${M(`.git/info/exclude`)}:`),r.length===0)a.push(` (none)`);else for(let e of r)a.push(` ${e}`);if(a.push(``),a.push(`Other OK paths exist but are tracked upstream:`),i.length===0)a.push(` (none)`);else for(let e of i)a.push(` ${e}`);a.push(``),a.push(`Toggle with: ${O(n===`local-only`?`ok config-sharing share`:`ok config-sharing unshare`)}`),process.stdout.write(`${a.join(`
|
|
84
|
-
`)}\n`)})}function Su(e){switch(e){case`shared`:return A(`shared`);case`local-only`:return A(`local-only`);case`no-git`:return j(`no-git (not a git repository)`)}}function Cu(){return new t(`unshare`).description(`Switch this project to local-only mode (add OK artifacts to .git/info/exclude so they stay out of git)`).option(`--project <dir>`,`Project root (defaults to cwd)`).option(`--json`,`Output JSON`,!1).action(async e=>{let t=V(e.project??process.cwd()),n=yt(t,st(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`){wu(e.json,t,n.reason);return}let r=vt(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(`${M(`Sharing mode is already`)} ${A(`local-only`)} ${M(`— nothing to do.`)}\n`);return}process.stderr.write(`${A(`✓`)} ${M(`Sharing mode set to`)} ${A(`local-only`)}\n`),process.stderr.write(` Added ${n.appended.length} path(s) to ${M(`.git/info/exclude`)} (per-clone, not committed).\n`)})}function wu(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(`${j({"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 Tu(){let e=new t(`config-sharing`);return e.description(`Manage Open Knowledge's git-sharing mode (share OK config with the team, or keep local-only on this machine)`),e.addCommand(yu()),e.addCommand(Cu()),e.addCommand(xu()),e}const Eu=new Set([`--cwd`,`--log-level`]);function Du(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(`-`)){Eu.has(a)&&i++;continue}t.push(a)}}return{operands:t,cwd:n,sawTerminalFlag:r}}function Ou(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 ku(e){return/\.(md|mdx)$/i.test(e)}function Au(e){let t={...e};return delete t.ELECTRON_RUN_AS_NODE,t}function ju(e=()=>Ht(Bt())){return{prepare:Fe,detectBundlePath:()=>e().bundlePath??null,openTarget:e=>{N(`open`,[e],{detached:!0,stdio:`ignore`,env:Au(process.env)}).unref()},runProjectOpen:(e,t)=>Vl(e,{project:t},Bl()),runBrowserOpen:e=>Pu(e),log:e=>process.stdout.write(`${e}\n`),error:e=>process.stderr.write(`${e}\n`)}}async function Mu(e,t){let n;try{n=t.prepare(e)}catch(e){if(e instanceof ze||e instanceof Ke||e instanceof Pe)return t.error(e.message),1;throw e}if(n.mode===`project`)return t.runProjectOpen(n.docName,n.projectRoot);if(t.detectBundlePath()){let e=`openknowledge://open?file=${encodeURIComponent(n.canonicalFilePath)}`;return t.openTarget(e),t.log(`Opening ${n.singleDocRelPath} in the Open Knowledge desktop app.`),0}return await t.runBrowserOpen(n),0}function Nu(){let e=import.meta.dirname??new URL(`.`,import.meta.url).pathname;return[V(e,`public`),V(e,`../../app/dist`),V(e,`../../../app/dist`)].find(e=>F(e))}async function Pu(e){let{createEphemeralProjectDir:t}=await import(`./dist-
|
|
84
|
+
`)}\n`)})}function Su(e){switch(e){case`shared`:return A(`shared`);case`local-only`:return A(`local-only`);case`no-git`:return j(`no-git (not a git repository)`)}}function Cu(){return new t(`unshare`).description(`Switch this project to local-only mode (add OK artifacts to .git/info/exclude so they stay out of git)`).option(`--project <dir>`,`Project root (defaults to cwd)`).option(`--json`,`Output JSON`,!1).action(async e=>{let t=V(e.project??process.cwd()),n=yt(t,st(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`){wu(e.json,t,n.reason);return}let r=vt(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(`${M(`Sharing mode is already`)} ${A(`local-only`)} ${M(`— nothing to do.`)}\n`);return}process.stderr.write(`${A(`✓`)} ${M(`Sharing mode set to`)} ${A(`local-only`)}\n`),process.stderr.write(` Added ${n.appended.length} path(s) to ${M(`.git/info/exclude`)} (per-clone, not committed).\n`)})}function wu(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(`${j({"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 Tu(){let e=new t(`config-sharing`);return e.description(`Manage Open Knowledge's git-sharing mode (share OK config with the team, or keep local-only on this machine)`),e.addCommand(yu()),e.addCommand(Cu()),e.addCommand(xu()),e}const Eu=new Set([`--cwd`,`--log-level`]);function Du(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(`-`)){Eu.has(a)&&i++;continue}t.push(a)}}return{operands:t,cwd:n,sawTerminalFlag:r}}function Ou(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 ku(e){return/\.(md|mdx)$/i.test(e)}function Au(e){let t={...e};return delete t.ELECTRON_RUN_AS_NODE,t}function ju(e=()=>Ht(Bt())){return{prepare:Fe,detectBundlePath:()=>e().bundlePath??null,openTarget:e=>{N(`open`,[e],{detached:!0,stdio:`ignore`,env:Au(process.env)}).unref()},runProjectOpen:(e,t)=>Vl(e,{project:t},Bl()),runBrowserOpen:e=>Pu(e),log:e=>process.stdout.write(`${e}\n`),error:e=>process.stderr.write(`${e}\n`)}}async function Mu(e,t){let n;try{n=t.prepare(e)}catch(e){if(e instanceof ze||e instanceof Ke||e instanceof Pe)return t.error(e.message),1;throw e}if(n.mode===`project`)return t.runProjectOpen(n.docName,n.projectRoot);if(t.detectBundlePath()){let e=`openknowledge://open?file=${encodeURIComponent(n.canonicalFilePath)}`;return t.openTarget(e),t.log(`Opening ${n.singleDocRelPath} in the Open Knowledge desktop app.`),0}return await t.runBrowserOpen(n),0}function Nu(){let e=import.meta.dirname??new URL(`.`,import.meta.url).pathname;return[V(e,`public`),V(e,`../../app/dist`),V(e,`../../../app/dist`)].find(e=>F(e))}async function Pu(e){let{createEphemeralProjectDir:t}=await import(`./dist-Dat97svn.mjs`),{loadConfig:n}=await import(`./index.mjs`),{bootStartServer:r,resolveHost:i}=await import(`./start-DCkVhUyE.mjs`),{openBrowser:a}=await import(`./open-browser-DHTbHSqx.mjs`),o=Nu();o||(process.stderr.write("Open Knowledge 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 s=t(e.contentDir),c=!1,l,u=async()=>{if(!c){c=!0;try{await l?.destroy()}catch{}try{await Cn(s,{recursive:!0,force:!0})}catch{}}},d=()=>{u().then(()=>process.exit(0))};process.once(`SIGINT`,d),process.once(`SIGTERM`,d);let{config:f}=n(s),p=i({},process.env);try{l=await r({config:f,cwd:s,host:p,port:0,projectDir:s,singleFile:e.canonicalFilePath,serveContentAssets:!0,reactShellDistDir:o})}catch(t){await u(),process.stderr.write(`Failed to open ${e.singleDocRelPath}: ${t instanceof Error?t.message:String(t)}\n`),process.exit(1)}let m=`http://${p}:${l.port}/#/${Ye(e.docName)}`;process.stdout.write(`Opening ${e.singleDocRelPath} in your browser: ${m}\n`),process.stdout.write(`Press Ctrl-C to close the session.
|
|
85
85
|
`),a(m),await new Promise(()=>{})}function Fu(e,t){return{server:Iu(`server`,e),ui:Iu(`ui`,t)}}function Iu(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 Lu(e){return`${Ru(e.server)}\n${Ru(e.ui)}`}function Ru(e){let t=e.name===`server`?`server`:`ui `;return e.state===`missing`?`${t} not running`:e.state===`corrupt`?`${t} lock file corrupt — run \`ok clean\``:e.state===`foreign-host`?`${t} foreign host (${e.host}) pid=${e.pid} port=${e.port}`:e.state===`dead-pid`?`${t} stale (dead pid=${e.pid}) — run \`ok clean\``:`${t} alive pid=${e.pid} port=${e.port} started=${e.startedAt}`}function zu(e){let t=e.inspect??(t=>Dt(e.lockDir,t)),n=e.log??(e=>console.log(e)),r=Fu(t(`server`),t(`ui`));return e.json?n(JSON.stringify(r,null,2)):n(Lu(r)),r}function Bu(e){return new t(`status`).description(`Show live state of the server + ui lockfiles for this project`).option(`--json`,`Emit structured JSON instead of formatted text`).action(t=>{e(),zu({lockDir:D(process.cwd()),json:t.json===!0})})}function Vu(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(`
|
|
86
86
|
`)}process.argv.includes(`--no-color`)?(process.env.NO_COLOR=`1`,delete process.env.FORCE_COLOR):process.argv.includes(`--color`)&&(process.env.FORCE_COLOR=`1`,delete process.env.NO_COLOR);const Q=new t;let $,Hu;function Uu(){return Hu}Q.name(`open-knowledge`).description(`Local-first knowledge base with CRDT collaboration`).usage(`[options] [file | command]`).version(Vu(Pt)).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=jt(n,process.cwd());r!==null&&(Tt(process.cwd()),process.chdir(r),console.error(`[ok] Using Open Knowledge project at ${r}`));let{config:i}=It(r??t);$=i;let a=e.args?.[0]??e.name()??`cli`;Hu=Ee({name:`cli`,project:i.project?.name??void 0}),Hu.info({command:a,cwd:process.cwd()},`cli command started`)}),Q.action(async()=>{if(Ht(Bt()).available){Rt({spawn:N});return}await Vt($,{})});const Wu=zt(()=>$);Q.addCommand(Wu);const Gu=Rl(()=>$);Q.addCommand(Gu),Q.addCommand(St()),Q.addCommand(eu()),Q.addCommand(ks()),Q.addCommand(Kt());const Ku=Ul(()=>$);Q.addCommand(Ku);const qu=Ct(()=>$);Q.addCommand(qu),Q.addCommand(Hl()),Q.addCommand(Ot(()=>$)),Q.addCommand(oa(()=>$)),Q.addCommand(Bu(()=>$)),Q.addCommand(Mt()),Q.addCommand(fs()),Q.addCommand(ra()),Q.addCommand(Fa()),Q.addCommand(Gi(Uu)),Q.addCommand(xs()),Q.addCommand(Da(()=>$)),Q.addCommand(Kl(()=>$)),Q.addCommand(Jl(()=>$)),Q.addCommand(ql(()=>$)),Q.addCommand(vu()),Q.addCommand(Tu()),Q.addHelpText(`after`,`
|
|
87
87
|
Examples:
|
package/dist/config-schema.json
CHANGED
|
@@ -66,14 +66,6 @@
|
|
|
66
66
|
"agentSettable": false,
|
|
67
67
|
"defaultScope": "project-local",
|
|
68
68
|
"description": "Show dot-prefixed entries (e.g. .ok/, .okignore) in the file tree. Per-machine (project-local) — not shared with collaborators."
|
|
69
|
-
},
|
|
70
|
-
"showAllFiles": {
|
|
71
|
-
"default": true,
|
|
72
|
-
"type": "boolean",
|
|
73
|
-
"scope": "project-local",
|
|
74
|
-
"agentSettable": false,
|
|
75
|
-
"defaultScope": "project-local",
|
|
76
|
-
"description": "Show every file, including those excluded by .gitignore / .okignore. On by default; turn off to scope the tree to indexed/linked content. Per-machine (project-local) — not shared."
|
|
77
69
|
}
|
|
78
70
|
},
|
|
79
71
|
"additionalProperties": {}
|
|
@@ -20,14 +20,6 @@
|
|
|
20
20
|
"agentSettable": false,
|
|
21
21
|
"defaultScope": "project-local",
|
|
22
22
|
"description": "Show dot-prefixed entries (e.g. .ok/, .okignore) in the file tree. Per-machine (project-local) — not shared with collaborators."
|
|
23
|
-
},
|
|
24
|
-
"showAllFiles": {
|
|
25
|
-
"default": true,
|
|
26
|
-
"type": "boolean",
|
|
27
|
-
"scope": "project-local",
|
|
28
|
-
"agentSettable": false,
|
|
29
|
-
"defaultScope": "project-local",
|
|
30
|
-
"description": "Show every file, including those excluded by .gitignore / .okignore. On by default; turn off to scope the tree to indexed/linked content. Per-machine (project-local) — not shared."
|
|
31
23
|
}
|
|
32
24
|
},
|
|
33
25
|
"additionalProperties": {}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Gr as e,J as t,Sn as n,Xr as r,a as i,an as a,c as o,d as s,f as c,g as l,h as u,i as d,l as f,m as p,n as m,o as h,p as g,r as _,s as v,t as y,tn as b,u as x,vn as S,wr as C,zt as w}from"./server-lock-BpjJj3OD-
|
|
1
|
+
import{Gr as e,J as t,Sn as n,Xr as r,a as i,an as a,c as o,d as s,f as c,g as l,h as u,i as d,l as f,m as p,n as m,o as h,p as g,r as _,s as v,t as y,tn as b,u as x,vn as S,wr as C,zt as w}from"./server-lock-BpjJj3OD-C32FtL5e.mjs";import{$ as T,$n as E,$r as D,$t as O,A as k,Ai as A,An as j,Ar as M,At as N,B as P,Bi as F,Bn as I,Br as L,Bt as R,C as z,Ci as B,Cn as V,Cr as H,Ct as U,D as W,Di as G,Dn as K,Dr as q,Dt as J,E as Y,Ei as X,En as Z,Er as Q,Et as $,F as ee,Fi as te,Fn as ne,Fr as re,Ft as ie,G as ae,Gn as oe,Gr as se,Gt as ce,H as le,Hi as ue,Hn as de,Hr as fe,Ht as pe,I as me,Ii as he,In as ge,Ir as _e,It as ve,J as ye,Jn as be,Jr as xe,Jt as Se,K as Ce,Kn as we,Kr as Te,Kt as Ee,L as De,Li as Oe,Ln as ke,Lr as Ae,Lt as je,M as Me,Mi as Ne,Mn as Pe,Mr as Fe,Mt as Ie,N as Le,Ni as Re,Nn as ze,Nr as Be,Nt as Ve,O as He,Oi as Ue,On as We,Or as Ge,Ot as Ke,P as qe,Pi as Je,Pn as Ye,Pr as Xe,Pt as Ze,Q as Qe,Qn as $e,Qr as et,Qt as tt,R as nt,Ri as rt,Rn as it,Rr as at,Rt as ot,S as st,Si as ct,Sn as lt,Sr as ut,St as dt,T as ft,Ti as pt,Tn as mt,Tr as ht,Tt as gt,U as _t,Ui as vt,Un as yt,Ur as bt,Ut as xt,V as St,Vi as Ct,Vn as wt,Vr as Tt,Vt as Et,W as Dt,Wn as Ot,Wr as kt,Wt as At,X as jt,Xn as Mt,Xr as Nt,Xt as Pt,Y as Ft,Yn as It,Yr as Lt,Yt as Rt,Z as zt,Zn as Bt,Zr as Vt,Zt as Ht,_ as Ut,_i as Wt,_n as Gt,_r as Kt,_t as qt,a as Jt,ai as Yt,an as Xt,ar as Zt,at as Qt,b as $t,bi as en,bn as tn,br as nn,bt as rn,c as an,ci as on,cn as sn,cr as cn,ct as ln,d as un,di as dn,dn as fn,dr as pn,dt as mn,ei as hn,en as gn,er as _n,et as vn,f as yn,fi as bn,fn as xn,fr as Sn,ft as Cn,g as wn,gi as Tn,gn as En,gr as Dn,gt as On,h as kn,hi as An,hn as jn,hr as Mn,ht as Nn,i as Pn,ii as Fn,in as In,ir as Ln,it as Rn,j as zn,ji as Bn,jn as Vn,jr as Hn,jt as Un,k as Wn,ki as Gn,kn as Kn,kr as qn,kt as Jn,l as Yn,li as Xn,ln as Zn,lr as Qn,lt as $n,m as er,mi as tr,mn as nr,mr as rr,mt as ir,n as ar,na as or,ni as sr,nn as cr,nr as lr,nt as ur,o as dr,oi as fr,on as pr,or as mr,ot as hr,p as gr,pi as _r,pn as vr,pr as yr,pt as br,q as xr,qn as Sr,qr as Cr,qt as wr,r as Tr,ri as Er,rn as Dr,rr as Or,rt as kr,s as Ar,si as jr,sn as Mr,sr as Nr,st as Pr,t as Fr,ta as Ir,ti as Lr,tn as Rr,tr as zr,tt as Br,u as Vr,ui as Hr,un as Ur,ur as Wr,ut as Gr,v as Kr,vi as qr,vn as Jr,vr as Yr,vt as Xr,w as Zr,wi as Qr,wn as $r,wr as ei,wt as ti,x as ni,xi as ri,xn as ii,xr as ai,xt as oi,y as si,yi as ci,yn as li,yr as ui,yt as di,z as fi,zi as pi,zn as mi,zr as hi,zt as gi}from"./dist-DvEI00I1.mjs";export{Fr as AGENT_ID_MAX_LEN,ar as AGENT_ID_RE,Tr as AGENT_WRITE_ORIGIN,Pn as AgentFocusBroadcaster,Jt as AgentPresenceBroadcaster,dr as AgentSessionCapacityError,Ar as AgentSessionManager,an as AutoStartDisabledError,Yn as BacklinkIndex,Vr as CC1Broadcaster,t as CC1_CONTRACT_VERSION,un as CONFIG_FILENAME,yn as CONFLICT_MARKER_RE,gr as CURSOR_BUNDLE_PATHS_BY_PLATFORM,er as ConfigSchema,kn as DEFAULT_CHECKPOINT_RETENTION,wn as DEFAULT_EMBEDDINGS_DIMENSIONS,Ut as DEFAULT_PACK_ID,Kr as EMBEDDINGS_API_KEY_ENV,si as FILE_SYSTEM_WRITER,$t as FILE_WATCHER_ORIGIN,ni as FileEmbeddingsBackend,st as GIT_PREFLIGHT_FAIL_SPAN_NAME,z as GIT_UPSTREAM_WRITER,Ir as GitDirAccessError,Zr as GitNotAvailableError,ft as GitTooOldError,Y as HOCUSPOCUS_AUTH_REJECTION_REASONS,W as HocuspocusAuthRejection,He as HocuspocusAuthTokenSchema,Wn as INSTALLED_AGENTS_SCHEMES,w as LINEAGE_EPOCH_KEY,k as LIVE_DERIVED_INDEX_DEBOUNCE_MS,zn as LOG_MD_TEMPLATE,Me as MANAGED_RENAME_ORIGIN,Le as MAX_AGENT_SESSIONS,qe as MCP_CONNECTION_ID_HEADER,ee as MCP_SERVER_NAME,me as MIN_GIT_VERSION,De as MISSING_OK_CONFIG_MESSAGE,or as MalformedGitPointerError,nt as McpLogger,fi as MissingOkConfigError,P as OBSERVER_SYNC_ORIGIN,St as OK_OKIGNORE_TEMPLATE,b as ORPHAN_MODES,le as PANE_TARGET_TTL_MS,a as PROTOCOL_VERSION,_t as PinoLogger,y as ProcessLockCollisionError,Dt as ProjectGitInitError,ae as ROLLBACK_ORIGIN,Ce as ROOT_GITIGNORE_TEMPLATE,m as RUNTIME_VERSION,xr as SERVICE_WRITER,ye as SKILL_INSTALL_EVENTS_FILE_REL,S as SKILL_STATE_TARGETS,Ft as STARTER_FOLDERS,jt as STARTER_FOLDER_FRONTMATTER_FILENAME,zt as STARTER_PACKS,Qe as STARTER_PACK_IDS,T as STARTER_TEMPLATES,vn as STATE_MANIFEST_FILENAME,_ as STATE_SCHEMA_VERSION,n as SYSTEM_DOC_NAME,Br as SeedPrerequisiteError,ur as SeedRootDirError,d as ServerLockCollisionError,kr as SingleFileNotAFileError,Rn as SingleFileNotFoundError,Qt as SingleFileNotMarkdownError,hr as StateManifestError,Pr as TagIndex,ln as UiLockCollisionError,$n as __getShowAllWalkStatsForTesting,Gr as __resetShowAllWalkStatsForTesting,i as acquireProcessLock,h as acquireServerLock,mn as acquireUiLock,Cn as applyAgentMarkdownWrite,br as applyExternalChange,ir as applySeed,Nn as armPaneTarget,On as assertCompatibleStateManifest,qt as assertGitAvailable,Xr as assertNeverDiskEvent,di as attachIdleShutdown,rn as bootServer,oi as buildAndOpenSkill,dt as buildConfigYmlContent,U as buildExecResult,ti as buildSkillZip,gt as buildStarterFolderFrontmatterYaml,$ as buildWipTree,J as classifyEvents,Ke as classifyFsPath,Jn as clearArmedPaneTarget,N as clearContributors,Un as clearEmbeddingsKeyFromAllBackends,Ie as coercePackId,C as colorFromSeed,Ve as commitUpstreamImport,Ze as commitWip,ie as commitWipFromTree,ve as compareSemver,je as containsConflictMarkers,ot as contentHash,gi as contributorCount,R as countShadowObjects,Et as countStaleAgentWipRefs,pe as countWipRefs,xt as createApiExtension,At as createAssetServeMiddleware,ce as createContentFilter,Ee as createContentFilterAsync,wr as createEmbeddingsSecretStore,Se as createEphemeralProjectDir,Rt as createExternalChangeHandler,Pt as createFileLogger,Ht as createLiveDerivedIndexExtension,tt as createMcpHttpHandler,O as createOsProbe,gn as createPersistenceExtension,Rr as createServer,cr as createServerObserverExtension,Dr as createStreamingErrorWriter,In as createTestLogger,Xt as describeStoredEmbeddingsKey,pr as detectClaudeDesktopPresence,Mr as detectGit,sn as detectProjectShape,Zn as emitPreflightFailureSpan,Ur as encodeDocName,fn as encodeFolderRoute,xn as ensureProjectGit,vr as errorResponse,nr as evictStaleTrackerEntries,jn as extractWikiLinksFromMarkdown,En as fallbackPaths,Gt as findEnclosingGitRoot,Jr as findEnclosingProjectRoot,li as flushFileLogger,tn as formatAuthRejectionWire,ii as formatContributors,lt as formatContributorsFrom,V as formatPackRationale,$r as gcCheckpointRefs,mt as getCurrentMcpLogger,Z as getLocalDir,K as getLogFilePath,We as getLogger,Kn as getLogsDir,j as getMeter,Vn as getMetrics,Pe as getTracer,ze as handleCollabSocketError,Ye as handleSpawnCursor,ne as hasGcLogLatch,e as iconFromClientName,ge as incrementCollabSocketFilteredError,ke as incrementServerObserverFire,it as initContent,mi as initShadowRepo,I as initTelemetry,wt as initToleranceTelemetryWriter,de as installPrettyZodErrors,yt as installTestLoggers,Ot as installUserSkill,oe as isAllowedApiOrigin,we as isAllowedWorkspaceHostHeader,Sr as isConfigDoc,be as isHocuspocusAuthRejectionReason,It as isKnownPackId,Mt as isLoopbackAddress,r as isOrphanMode,Bt as isPairedWriteOrigin,$e as isPathWithinDir,v as isProcessAlive,E as isProjectRoot,_n as isSelfWrite,zr as isSystemDoc,lr as isToleranceTelemetryEnabled,o as isValidLockPid,Or as lastKnownHash,Ln as listRescueCheckpoints,Zt as listStarterPacks,mr as loadPrincipal,f as lockFilePath,Nr as loggerFactory,cn as logsCurrentPath,Qn as logsPreviousPath,Wr as makeLazyEmbeddingsKeyStore,pn as mountMcpAndApi,Sn as normalizeFsPath,yr as packageVersionMajorMinor,rr as parseAuthRejectionWire,Mn as parseGitVersion,Dn as parseHocuspocusAuthToken,Kt as parseKeepaliveConnectionId,Yr as pathToDocName,ui as planSeed,nn as prepareSingleFileOpen,ai as readAllTargets,ut as readArmedPaneTarget,H as readBranchFromHead,x as readProcessLock,s as readProcessLockDetailed,ei as readProjectLocalSemanticConfig,c as readServerLock,ht as readServerPackageVersion,Q as readSkillInstallStateSnapshot,q as readStateManifest,Ge as readTargetRecordedAt,qn as readTargetVersion,M as readUiLock,Hn as reconcile,Fe as recordContributor,Be as recordSkillInstallEvent,Xe as registerAllTools,re as registerWrite,g as releaseProcessLock,p as releaseServerLock,_e as releaseUiLock,Ae as removeLastKnownHash,at as resetMetrics,hi as resolveBundledSkillDir,L as resolveContentDir,Tt as resolveCursorBinaryDefault,fe as resolveCursorSpawnInvocation,bt as resolveLockDir,kt as resolvePack,se as resolvePackageVersion,Te as resolveUiInfo,Cr as restoreContributors,xe as restoreLifecycleFromConflictsJson,Lt as rewriteMarkdownLinksForDocumentRename,Nt as rewriteWikiLinksForDocumentRename,Vt as runAuthReposSubprocess,et as runAuthStatusSubprocess,D as runCloneSubprocess,hn as runDeviceFlowSubprocess,Lr as runWithMcpLogger,sr as safeContentPath,Er as safeSubdir,Fn as safetyCheckpoint,Yt as sanitizeClientName,fr as saveInMemoryCheckpoint,jr as saveVersion,on as seedBasenameIndex,Xn as serializeError,Hr as setActiveSpanAttributes,dn as shadowGit,bn as shutdownTelemetry,_r as spansCurrentPath,tr as spansPreviousPath,An as spawnDetached,Tn as splitMarkdownBlocks,Wt as startWatcher,qr as streamingProblemEvent,ci as swapContributors,en as teardownToleranceTelemetryWriter,ri as toBroadcasterKey,ct as tracedAppendFileSync,B as tracedLinkSync,Qr as tracedMkdir,pt as tracedMkdirSync,X as tracedRename,G as tracedRenameSync,Ue as tracedRmSync,Gn as tracedRmdirSync,A as tracedUnlinkSync,Bn as tracedWriteFile,Ne as tracedWriteFileSync,Re as updateLastKnownHash,u as updateProcessLockPort,l as updateServerLockPort,Je as updateUiLockPort,te as validateAgentId,he as validateCloneInputs,Oe as validateSkillZip,rt as withSpan,pi as withSpanSync,F as writeRootGitignoreForNewRepo,Ct as writeStateManifest,ue as writeTargetVersion,vt as writeTracker};
|