@inkeep/open-knowledge 0.16.0-beta.10 → 0.16.0-beta.12
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/constants-DPPr1-uo.mjs +2 -0
- package/dist/{dist-B4KfITEx.mjs → dist--S8onIrO.mjs} +1 -1
- package/dist/{dist-C8vZvWXx.mjs → dist-Br1AQTZl.mjs} +2 -2
- package/dist/index.mjs +1 -1
- package/dist/init-CCxl47GP.mjs +1 -0
- package/dist/{init-Cs3Wy1Db.mjs → init-CTZq5jSa.mjs} +4 -4
- package/dist/{loader-DIkxBt6Z.mjs → loader-Cfbl-zmD.mjs} +2 -2
- package/dist/loader-DKhjUSTP.mjs +1 -0
- package/dist/{preview-DFWLUdPh.mjs → preview-CkrU7puU.mjs} +2 -2
- package/dist/preview-EPydzuCR.mjs +1 -0
- package/dist/public/assets/{index-BUqQLsUm.js → index-BmwXZ8xM.js} +4 -4
- package/dist/public/assets/index-Ch1_o2WE.css +1 -0
- package/dist/public/index.html +2 -2
- package/dist/{repair-launch-json-CDw99k_9.mjs → repair-launch-json-11VrI7yf.mjs} +2 -2
- package/dist/{repair-mcp-configs-Bg4XD3-n.mjs → repair-mcp-configs-DA9QL2Cd.mjs} +2 -2
- package/dist/repair-skills-Bv7y6ZgO.mjs +1 -0
- package/dist/{repair-skills-BcVvR7s4.mjs → repair-skills-CA90BNvr.mjs} +2 -2
- package/dist/{src-BlzVC-Zd.mjs → src-Nis6h9fy.mjs} +2 -2
- package/dist/start-CA0DMSPN.mjs +1 -0
- package/dist/{start-CmNmlqNL.mjs → start-Cdc9dPAz.mjs} +2 -2
- package/dist/{write-project-skill-BgcwKkOH.mjs → write-project-skill-B6sZCIWR.mjs} +2 -2
- package/package.json +1 -1
- package/dist/constants-De-R77If.mjs +0 -2
- package/dist/init-D7I5ryQ5.mjs +0 -1
- package/dist/loader-D22jaE-I.mjs +0 -1
- package/dist/preview-DLcfiZlx.mjs +0 -1
- package/dist/public/assets/index-C428DlDI.css +0 -1
- package/dist/repair-skills-5F3DDM4z.mjs +0 -1
- package/dist/start-C8aaBdT3.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.0-beta.
|
|
6
|
+
version: "0.16.0-beta.12"
|
|
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.0-beta.
|
|
6
|
+
version: "0.16.0-beta.12"
|
|
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-DieV1RDy.mjs";import{a as te,n as ne,r as re,t as ie}from"./gh-detect-DnwA-B1z.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-
|
|
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-DieV1RDy.mjs";import{a as te,n as ne,r as re,t as ie}from"./gh-detect-DnwA-B1z.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-Br1AQTZl.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-CTZq5jSa.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-Nis6h9fy.mjs";import{n as Pt,t as Ft}from"./constants-DPPr1-uo.mjs";import{n as It,t as Lt}from"./loader-Cfbl-zmD.mjs";import{S as Rt,_ as zt,b as Bt,m as Vt,x as Ht,y as Ut}from"./start-Cdc9dPAz.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-CA90BNvr.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-CCxl47GP.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-CA0DMSPN.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-DKhjUSTP.mjs`),{resolveContentDir:r}=await import(`./dist--S8onIrO.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-EPydzuCR.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--S8onIrO.mjs`),{loadConfig:n}=await import(`./index.mjs`),{bootStartServer:r,resolveHost:i}=await import(`./start-CA0DMSPN.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:
|
|
@@ -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-DieV1RDy.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-
|
|
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-DieV1RDy.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-Br1AQTZl.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};
|
|
@@ -1789,7 +1789,7 @@ Every document outside this file and \`log.md\` carries a non-empty \`type\` in
|
|
|
1789
1789
|
`,OKF_LOG_MD=`# Log
|
|
1790
1790
|
|
|
1791
1791
|
Change history for this knowledge base, newest entry first. Add a dated entry (\`## YYYY-MM-DD: <summary>\`) whenever you create, edit, or restructure content — one entry per working session, not per file.
|
|
1792
|
-
`,STARTER_PACKS={"knowledge-base":{id:`knowledge-base`,name:`Knowledge base`,description:`Trusted articles from your sources.`,defaultSubfolder:`brain`,folders:KNOWLEDGE_BASE_FOLDERS,templates:KNOWLEDGE_BASE_TEMPLATES,rootFiles:{"log.md":KNOWLEDGE_BASE_LOG_MD}},"software-lifecycle":{id:`software-lifecycle`,name:`Software lifecycle`,description:`Proposals, decisions, and specs.`,defaultSubfolder:`project-docs`,folders:SOFTWARE_LIFECYCLE_FOLDERS,templates:SOFTWARE_LIFECYCLE_TEMPLATES},"plain-notes":{id:`plain-notes`,name:`Plain notes`,description:`Notes and daily entries.`,defaultSubfolder:void 0,folders:PLAIN_NOTES_FOLDERS,templates:PLAIN_NOTES_TEMPLATES},worldbuilding:{id:`worldbuilding`,name:`Worldbuilding`,description:`A wiki for your story world.`,defaultSubfolder:`world`,folders:WORLDBUILDING_FOLDERS,templates:WORLDBUILDING_TEMPLATES},"writing-pipeline":{id:`writing-pipeline`,name:`Writing pipeline`,description:`From first draft to finished piece.`,defaultSubfolder:`writing`,folders:WRITING_PIPELINE_FOLDERS,templates:WRITING_PIPELINE_TEMPLATES},"entity-vault":{id:`entity-vault`,name:`Personal CRM`,description:`Track the people, companies, and meetings.`,defaultSubfolder:`vault`,folders:ENTITY_VAULT_FOLDERS,templates:ENTITY_VAULT_TEMPLATES,rootFiles:{"log.md":ENTITY_VAULT_LOG_MD,"USER.md":ENTITY_VAULT_USER_MD,"SOUL.md":ENTITY_VAULT_SOUL_MD,"ACCESS_POLICY.md":ENTITY_VAULT_ACCESS_POLICY_MD,"HEARTBEAT.md":ENTITY_VAULT_HEARTBEAT_MD}},okf:{id:`okf`,name:`Open Knowledge Format`,description:`
|
|
1792
|
+
`,STARTER_PACKS={"knowledge-base":{id:`knowledge-base`,name:`Knowledge base`,description:`Trusted articles from your sources.`,defaultSubfolder:`brain`,folders:KNOWLEDGE_BASE_FOLDERS,templates:KNOWLEDGE_BASE_TEMPLATES,rootFiles:{"log.md":KNOWLEDGE_BASE_LOG_MD}},"software-lifecycle":{id:`software-lifecycle`,name:`Software lifecycle`,description:`Proposals, decisions, and specs.`,defaultSubfolder:`project-docs`,folders:SOFTWARE_LIFECYCLE_FOLDERS,templates:SOFTWARE_LIFECYCLE_TEMPLATES},"plain-notes":{id:`plain-notes`,name:`Plain notes`,description:`Notes and daily entries.`,defaultSubfolder:void 0,folders:PLAIN_NOTES_FOLDERS,templates:PLAIN_NOTES_TEMPLATES},worldbuilding:{id:`worldbuilding`,name:`Worldbuilding`,description:`A wiki for your story world.`,defaultSubfolder:`world`,folders:WORLDBUILDING_FOLDERS,templates:WORLDBUILDING_TEMPLATES},"writing-pipeline":{id:`writing-pipeline`,name:`Writing pipeline`,description:`From first draft to finished piece.`,defaultSubfolder:`writing`,folders:WRITING_PIPELINE_FOLDERS,templates:WRITING_PIPELINE_TEMPLATES},"entity-vault":{id:`entity-vault`,name:`Personal CRM`,description:`Track the people, companies, and meetings.`,defaultSubfolder:`vault`,folders:ENTITY_VAULT_FOLDERS,templates:ENTITY_VAULT_TEMPLATES,rootFiles:{"log.md":ENTITY_VAULT_LOG_MD,"USER.md":ENTITY_VAULT_USER_MD,"SOUL.md":ENTITY_VAULT_SOUL_MD,"ACCESS_POLICY.md":ENTITY_VAULT_ACCESS_POLICY_MD,"HEARTBEAT.md":ENTITY_VAULT_HEARTBEAT_MD}},okf:{id:`okf`,name:`Open Knowledge Format`,description:`Wiki using Google's Open Knowledge Format.`,defaultSubfolder:void 0,folders:OKF_FOLDERS,templates:OKF_TEMPLATES,rootFiles:{"welcome.md":OKF_WELCOME_MD,"index.md":OKF_INDEX_MD,"log.md":OKF_LOG_MD}}},STARTER_PACK_IDS=Object.keys(STARTER_PACKS);function resolvePack(e){return e&&STARTER_PACKS[e]||STARTER_PACKS[DEFAULT_PACK_ID]}function isKnownPackId(e){return typeof e==`string`&&STARTER_PACK_IDS.includes(e)}function coercePackId(e){return isKnownPackId(e)?e:void 0}function deriveFolderSummary(e){let t=e.trim(),s=(/^([^.!?]+[.!?])/.exec(t)?.[1]??t).trim();return s.length<=140?s:`${s.slice(0,137)}…`}function listStarterPacks(){return STARTER_PACK_IDS.map(e=>{let t=STARTER_PACKS[e];return{id:t.id,name:t.name,description:t.description,defaultSubfolder:t.defaultSubfolder,folders:t.folders.map(e=>({path:e.path,summary:deriveFolderSummary(e.description)})),entryCounts:computePackEntryCounts(t)}})}function computePackEntryCounts(e){let t=e.folders.length,s=0;for(let t of e.folders)s+=1+(t.extraTemplates?.length??0);return s+=e.rootFiles?Object.keys(e.rootFiles).length:0,{files:s,folders:t}}const STARTER_FOLDERS=KNOWLEDGE_BASE_FOLDERS,STARTER_TEMPLATES=KNOWLEDGE_BASE_TEMPLATES,LOG_MD_TEMPLATE=KNOWLEDGE_BASE_LOG_MD,STARTER_FOLDER_FRONTMATTER_FILENAME=`frontmatter.yml`;function buildStarterFolderFrontmatterYaml(e){let t=[];t.push(`title: ${yamlScalar(e.title)}`),t.push(`description: ${yamlScalar(e.description)}`),t.push(`tags:`);for(let s of e.tags)t.push(` - ${yamlScalar(s)}`);return`${t.join(`
|
|
1793
1793
|
`)}\n`}function yamlScalar(e){return e===``?`""`:/[:#\n"'\\]|^\s|\s$/.test(e)?`"${e.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}"`:e}function resolveFileContent(e,t){let s=/^([^/]+)\/\.ok\/frontmatter\.yml$/.exec(e);if(s){let e=t.folders.find(e=>e.path===s[1]);return e?buildStarterFolderFrontmatterYaml(e):void 0}let g=/^([^/]+)\/\.ok\/templates\/([^/]+)\.md$/.exec(e);if(g){let e=g[2]??``;return t.templates[e]}if(!e.includes(`/`)&&t.rootFiles?.[e]!==void 0)return t.rootFiles[e]}async function applySeed(e,t={}){let s=Date.now(),g=resolve(t.projectDir??process.cwd()),S=resolvePack(t.packId??`knowledge-base`),w=0,E=[],D=[];for(let t of e.created)try{let e=assertEntryPathInProject(g,t.path);D.push({entry:t,absPath:e})}catch(e){E.push({path:typeof t.path==`string`?t.path:String(t.path),error:e instanceof SeedRootDirError||e instanceof Error?e.message:String(e)})}for(let{entry:e,absPath:t}of D.filter(e=>e.entry.kind===`folder`))try{mkdirSync(t,{recursive:!0}),w+=1}catch(t){E.push({path:e.path,error:t instanceof Error?t.message:String(t)})}for(let{entry:e,absPath:t}of D.filter(e=>e.entry.kind===`file`)){let s=e.template??e.path,g=resolveFileContent(s,S);if(g===void 0){E.push({path:e.path,error:`No content template registered for template id "${s}" in pack "${S.id}"`});continue}if(!existsSync(t))try{writeFileSync(t,g,`utf-8`),w+=1}catch(t){E.push({path:e.path,error:t instanceof Error?t.message:String(t)})}}let O=installPackSkill(g,S.id);return{applied:w,errors:E,durationMs:Date.now()-s,packSkillsInstalled:O}}function frontmatterTemplateId(e){return`${e}/.ok/frontmatter.yml`}function templateFileTemplateId(e,t){return`${e}/.ok/templates/${t}.md`}function normalizeRootDir(e,t){if(!e)return``;let s=e.trim();if(s===``||s===`.`||s===`./`)return``;if(s.startsWith(`/`))throw new SeedRootDirError(`rootDir must be relative to the project directory, got: ${e}`);let g=s.replace(/\\/g,`/`).replace(/^\.\//,``).replace(/\/+$/,``);if(g.split(`/`).some(e=>e===`..`))throw new SeedRootDirError(`rootDir must not contain '..' segments, got: ${e}`);return assertEntryPathInProject(t,g),g}function joinRelative(e,t){return e===``?t:`${e}/${t}`}async function planSeed(e={}){let t=resolve(e.projectDir??process.cwd());if(!isProjectRoot(t))throw new SeedPrerequisiteError(`No ${OK_PROJECT_MARKER} found at ${t}. Run \`ok init\` first to scaffold the tool config.`);let s=normalizeRootDir(e.rootDir,t),g=resolvePack(e.packId??`knowledge-base`),S=[],w=[],E=[];s!==``&&(existsSync(join(t,s))?w.push({path:s,reason:`already-exists`}):S.push({path:s,kind:`folder`}));for(let e of g.folders){let D=joinRelative(s,e.path);existsSync(join(t,D))?w.push({path:D,reason:`already-exists`}):S.push({path:D,kind:`folder`});let O=`${D}/.ok`;existsSync(join(t,O))?w.push({path:O,reason:`already-exists`}):S.push({path:O,kind:`folder`});let k=`${O}/${STARTER_FOLDER_FRONTMATTER_FILENAME}`;existsSync(join(t,k))?w.push({path:k,reason:`already-exists`}):S.push({path:k,kind:`file`,template:frontmatterTemplateId(e.path)});let j=`${O}/templates`;existsSync(join(t,j))?w.push({path:j,reason:`already-exists`}):S.push({path:j,kind:`folder`});let F=[e.starterTemplate,...e.extraTemplates??[]];for(let s of F){let D=`${j}/${s}.md`;if(existsSync(join(t,D))){w.push({path:D,reason:`already-exists`});continue}if(g.templates[s]===void 0){let t=s===e.starterTemplate;E.push(t?`No starter template body registered for "${s}" in pack "${g.id}". The folder will land without a pre-selected template.`:`No body registered for extra template "${s}" in pack "${g.id}". The folder will land without that optional variant.`);continue}S.push({path:D,kind:`file`,template:templateFileTemplateId(e.path,s)})}}if(g.rootFiles)for(let e of Object.keys(g.rootFiles)){let g=joinRelative(s,e);existsSync(join(t,g))?w.push({path:g,reason:`already-exists`}):S.push({path:g,kind:`file`,template:e})}return{created:S,skipped:w,warnings:E}}const PACK_INSPIRATION_NOTE=[`These are patterns to adapt to your domain, not a layout to copy verbatim.`,"To build a variant: create your own folders (via `write` or your editor) and reuse only the ideas that fit.","To adopt this pack as-is: re-run without `--dry-run`."].join(`
|
|
1794
1794
|
`);function folderTemplateNames(e){return[e.starterTemplate,...e.extraTemplates??[]].join(`, `)}function formatPackRationale(e){let t=[`Pack: ${e.name} — ${e.description}`,``,PACK_INSPIRATION_NOTE,``];t.push(`Layout & rationale:`);for(let s of e.folders)t.push(` ${s.path}/ — ${s.title}`),t.push(` why: ${s.description}`),t.push(` templates: ${folderTemplateNames(s)}`);let s=e.rootFiles?Object.keys(e.rootFiles):[];return s.length>0&&t.push(``,`Root files: ${s.join(`, `)}`),t.join(`
|
|
1795
1795
|
`)}function createSingleFlight(){let e=new Map;return{run(t,s){let g=e.get(t);if(g)return{promise:g,coalesced:!0};let S=s();e.set(t,S);let w=()=>{e.get(t)===S&&e.delete(t)};return S.then(w,w),{promise:S,coalesced:!1}},get size(){return e.size}}}const log$7=getLogger(`suggest-links`),WORD_CHAR_RE=/[\p{L}\p{N}]/u,WIKI_LINK_RE=/\[\[([^\n#[\]|]+)(?:#([^\n[\]|]+))?(?:\|([^\n[\]]+))?\]\]/y,MD_LINK_RE=/\[([^\]\n]*)\]\((<[^>\n]+>|[^)\s\n]+)(?:\s+(?:"[^"\n]*"|'[^'\n]*'|\([^)\n]*\)))?\)/y,MD_IMAGE_RE=/!\[([^\]\n]*)\]\((<[^>\n]+>|[^)\s\n]+)(?:\s+(?:"[^"\n]*"|'[^'\n]*'|\([^)\n]*\)))?\)/y;var SuggestLinksTargetNotFoundError=class extends Error{constructor(e){super(`Document not found: ${e}`),this.name=`SuggestLinksTargetNotFoundError`}};function normalizeSnippet(e){return e.replace(/\s+/g,` `).trim()}function snippetAround(e,t,s){if(!normalizeSnippet(e))return null;let g=Math.max(e.lastIndexOf(`.`,t-1),e.lastIndexOf(`?`,t-1),e.lastIndexOf(`!`,t-1),e.lastIndexOf(`
|
|
@@ -2952,4 +2952,4 @@ In headless mode, write the recap into the research article's "Further reading"
|
|
|
2952
2952
|
`))e&&await t.raw(`update-ref`,`-d`,e);Y.info({context:e.oldBranch},`[branch-switch] cleaned up detached context ${e.oldBranch}`)}}catch(e){Y.error({err:e},`[branch-switch] detached cleanup failed`)}setBatchInProgress(!1),await ye.flushDeferredStores(`discard-stale`),Te?.emitBranchSwitched(g)}if(e.headMoved&&e.newHead&&_e.current&&s>0){let t=L??`.`;try{let s=await commitUpstreamImport(_e.current,t,e.oldHead,e.newHead,g);incrementUpstreamImport(),Y.info({oldHead:e.oldHead?.slice(0,8)??`null`,newHead:e.newHead.slice(0,8),sha:s.slice(0,8)},`[history] upstream-import from ${e.oldHead?.slice(0,8)??`null`}..${e.newHead.slice(0,8)} → ${s.slice(0,8)}`)}catch(e){Y.error({err:e},`[shadow] upstream-import failed`)}}})}catch(e){Y.error({err:e},`[server] HEAD watcher failed to start`),Fr.push(`head-watcher`)}function D(e){for(let g of e)try{let e=relative(t,join(s,g));if(e.startsWith(`..`))continue;let S=stripDocExtension(e),w=Ce.documents.get(S);if(!w)continue;let E=jt(S);E===null?Y.warn({docName:S,file:g},`[sync] content conflict: serializeDoc returned null; reconciledBase snapshot skipped`):setReconciledBase(S,E);let D=w.getMap(`lifecycle`);D.set(`status`,`conflict`),D.set(`reason`,`sync-merge-conflict`),Y.info({docName:S,file:g},`[sync] marked loaded content conflict`)}catch(e){Y.warn({err:e,file:g},`[sync] failed to mark loaded content conflict`)}}let O=buildSyncCredentialArgs(H);try{$t=new SyncEngine({projectDir:s,contentDir:t,contentFilter:fe,contentRoot:L,syncEnabled:te(),credentialArgs:O,cc1Broadcaster:Te,detectGh:e.detectGh,tokenStore:e.tokenStore,checkPushPermissionFn:e.checkPushPermissionFn,setBatchInProgress:e=>{setBatchInProgress(e),e||ye.flushDeferredStores(`within-branch`).catch(e=>{Y.error({err:e},`[persistence] deferred store drain failed after sync batch`)})},onStateChange:e=>{Y.info({state:e},`[sync] state → ${e}`)},onContentConflictsDetected:D,onAutoDisable:async e=>{Y.warn({reason:e},`[sync] auto-disabled — persisting to project-local config`);let t=await writeConfigPatch({cwd:s,scope:`project-local`,patch:{autoSync:{enabled:!1}}});t.ok||Y.error({result:t,reason:e,humanError:humanFormat(t.error),configPath:resolveConfigPath(`project-local`,s)},`[sync] failed to persist auto-disable — next restart WILL re-enable sync and re-trigger the same failure. Check permissions on the config path.`)}}),await $t.start()}catch(e){Y.warn({err:e},`[server] SyncEngine failed to start — sync disabled`),$t=null}Ke(`files`),Ke(`backlinks`),Ke(`graph`),Ke(`tags`)}return Ir().then(Ue,We),{hocuspocus:Ce,sessionManager:we,cc1Broadcaster:Te,agentFocusBroadcaster:De,agentPresenceBroadcaster:je,maintenanceCoordinator:ve,contentFilter:fe,basenameIndex:ce,serverInstanceId:oe,destroy:Mr,ready:Ge,degraded:Fr,lockDir:se,get syncEngine(){return $t}}}const SERVER_MEMORY_SCHEMA_VERSION=1,BYTES_PER_MB=1024*1024;function toMb(e){return e/BYTES_PER_MB}function captureServerMemorySnapshot(){let e=process.memoryUsage();return{schemaVersion:SERVER_MEMORY_SCHEMA_VERSION,capturedAt:new Date().toISOString(),snapshot:{rssMb:toMb(e.rss),heapTotalMb:toMb(e.heapTotal),heapUsedMb:toMb(e.heapUsed),externalMb:toMb(e.external),arrayBuffersMb:toMb(e.arrayBuffers)}}}let cachedGauge=null;onTelemetryShutdown(()=>{cachedGauge=null});function installServerMemoryGauge(){if(cachedGauge)return;let e=getMeter().createObservableGauge(`ok.server.memory.usage_megabytes`,{description:`Server process memory by section. Bounded labels: section ∈ {heap_used, heap_total, rss}.`,unit:`MB`});e.addCallback(e=>{let{snapshot:t}=captureServerMemorySnapshot();e.observe(t.heapUsedMb,{section:`heap_used`}),e.observe(t.heapTotalMb,{section:`heap_total`}),e.observe(t.rssMb,{section:`rss`})}),cachedGauge=e}const TELEMETRY_FILENAME=`tolerance-telemetry.jsonl`,TELEMETRY_PREV_FILENAME=`tolerance-telemetry.prev.jsonl`,TELEMETRY_MAX_BYTES=8*1024*1024;let appender=null,appendFailureWarned=!1;function isToleranceTelemetryEnabled(e=process.env){return e.OK_BRIDGE_TOLERANCE_TELEMETRY===`1`}function initToleranceTelemetryWriter(e){if(!isToleranceTelemetryEnabled())return;let t=getLocalDir(e);appender=new RotatingAppender({currentPath:resolve(t,TELEMETRY_FILENAME),previousPath:resolve(t,TELEMETRY_PREV_FILENAME),maxBytes:TELEMETRY_MAX_BYTES}),setToleranceTelemetryHook(e=>{let t={event:`bridge-tolerance-fire`,timestamp:e.timestamp,class:e.className,document:e.documentName??null,codeUnitPosition:e.codeUnitPosition,severity:e.severity};appender?.append(`${JSON.stringify(t)}\n`).catch(e=>{appendFailureWarned||(appendFailureWarned=!0,console.warn(`[tolerance-telemetry] append failed; further failures are silent:`,e instanceof Error?e.message:String(e)))})})}async function teardownToleranceTelemetryWriter(){setToleranceTelemetryHook(null),await appender?.drain(),appender=null,appendFailureWarned=!1}const LEGACY_RUNTIME_FILENAMES=[`server.lock`,`ui.lock`,`state.json`,`principal.json`,`sync-state.json`,`conflicts.json`,`last-spawn-error.log`],LEGACY_RUNTIME_DIRNAMES=[`cache`,`tmp`];function findLegacyRuntimeFiles(e){let t=resolve(e,LOCAL_DIR);if(!(()=>{if(!existsSync(t))return!0;try{return readdirSync(t).length===0}catch{return!0}})())return[];let s=[];for(let t of LEGACY_RUNTIME_FILENAMES)existsSync(resolve(e,t))&&s.push(t);for(let t of LEGACY_RUNTIME_DIRNAMES){let g=resolve(e,t);try{existsSync(g)&&statSync(g).isDirectory()&&s.push(`${t}/`)}catch{}}return s}function computeWorktreeAttributes(e){let t=resolveGitDirDetailed(e);switch(t.kind){case`directory`:return{kind:`main`,gitdir:t.path};case`linked`:return{kind:`linked`,gitdir:t.path};case`malformed-pointer`:return{kind:`linked`,gitdir:null};case`inaccessible`:case`absent`:return{kind:`main`,gitdir:null}}}const DEFAULT_IDLE_THRESHOLD_MS=1800*1e3,DESTROY_STEP_TIMEOUT_MS=5e3,PINO_REDACT_MAX_DEPTH=5;async function bootServer(e){let t=e.projectDir??e.contentDir,s=resolveLocalSinkConfig({projectDir:t});if(s){let e=s.telemetry.attributeDenylist,t=[];for(let s of e){t.push(s);for(let e=1;e<=PINO_REDACT_MAX_DEPTH;e++)t.push(`${`*.`.repeat(e)}${s}`)}loggerFactory.configure({pinoConfig:{fileSink:s.logs,redactPaths:t}})}initTelemetry({localSink:s?.telemetry}),initToleranceTelemetryWriter(t),installServerMemoryGauge();let{kind:g,gitdir:S}=computeWorktreeAttributes(e.projectDir??e.contentDir),w={"ok.worktree.kind":g};return S!==null&&(w[`ok.worktree.gitdir`]=normalizeFsPath(S)),withSpan(`ok.boot`,{attributes:w},async()=>bootServerInner(e))}async function bootServerInner(e){let t=e.skipAutoInit??!1,s=e.attachUiSibling??!0,g=e.idleShutdownMs,S=e.log??getLogger(`boot`),w=process.env.OK_LOCK_KIND===`mcp-spawned`||process.env.OK_LOCK_KIND===`interactive`?process.env.OK_LOCK_KIND:void 0,E=e.lockKind??w??`interactive`,{createServer:D}=await import(`node:http`),{updateServerLockPort:O}=await import(`./server-lock-CyhBidkz-KHJ5sHjG.mjs`),k=!1;if(!t&&e.autoInitFn)try{k=!!await e.autoInitFn()}catch(e){S.warn({err:e},`autoInitFn failed`)}let j=e.projectDir??e.contentDir,F=resolve(j,`.ok`);if(!existsSync(resolve(F,`config.yml`)))throw new MissingOkConfigError(existsSync(F)?`config`:`okdir`,j);existsSync(resolve(F,`.gitignore`))||console.warn("[boot] Note: .ok/.gitignore is missing — per-machine state files in .ok/ may show up as untracked changes. Run `ok init` to add the recommended ignore entries.");let L=e.gitPreflight??assertGitAvailable;try{e.gitEnabled!==!1&&L()}catch(e){if(e instanceof GitNotAvailableError||e instanceof GitTooOldError){let t=e instanceof GitTooOldError?e.detected:``,s=e instanceof GitTooOldError?`too_old`:`not_available`;emitPreflightFailureSpan(e),S.warn({event:`git_preflight_fail`,platform:e.platform,reason:s,detectedVersion:t},s===`not_available`?`git binary not found`:`git binary too old`),process.stderr.write(`${e.message}\n`)}throw await shutdownTelemetry(),await Promise.race([teardownToleranceTelemetryWriter(),new Promise(e=>setTimeout(e,DESTROY_STEP_TIMEOUT_MS))]),e}let B=findLegacyRuntimeFiles(F);B.length>0&&console.warn(`[boot] Found legacy runtime files at .ok/${B.join(`, `)}. Delete .ok/ and re-init — these files moved to .ok/${LOCAL_DIR}/.`);let H=createServer$1({contentDir:e.contentDir,projectDir:e.projectDir,contentRoot:e.contentRoot,port:e.port,host:e.host,quiet:e.quiet??!1,debounce:e.debounce,maxDebounce:e.maxDebounce,gitEnabled:e.gitEnabled,commitDebounceMs:e.commitDebounceMs,wipRef:e.wipRef,enableTestRoutes:e.enableTestRoutes,shadowRepo:e.shadowRepo,destroyTimeoutMs:e.destroyTimeoutMs,localOpCliArgs:e.localOpCliArgs,onAgentWrite:e.onAgentWrite,lockKind:E,skipStateManifestCheck:e.skipStateManifestCheck,detectGh:e.detectGh,tokenStore:e.tokenStore,embeddingsKeyStore:e.embeddingsKeyStore,singleDocRelPath:e.singleDocRelPath,ephemeral:e.ephemeral}),{hocuspocus:q,destroy:ee,ready:J,degraded:Y,lockDir:te,sessionManager:ne,agentFocusBroadcaster:ae,agentPresenceBroadcaster:oe,maintenanceCoordinator:se}=H,ce=(()=>{let t=e.host??`localhost`;return t===`0.0.0.0`||t===`::`?`localhost`:t.includes(`:`)&&!t.startsWith(`[`)?`[${t}]`:t})(),ue=e.port??0,de=e.ephemeral?void 0:createMcpHttpHandler({contentDir:e.contentDir,projectDir:e.projectDir??e.contentDir,config:e.config,getServerUrl:()=>`http://${ce}:${ue}`,log:S}),fe=D();fe.headersTimeout=3e4,fe.requestTimeout=6e4;let me=e.serveContentAssets?createAssetServeMiddleware({contentFilter:H.contentFilter,contentSirv:build_default(e.contentDir,{dev:!0,dotfiles:!1}),inlineExtensions:INLINE_RENDERABLE_EXTENSIONS,assetExtensions:ASSET_EXTENSIONS,blocklistExtensions:EXECUTABLE_BLOCKLIST_EXTENSIONS}):void 0,ge=!1;if(e.reactShellDistDir)try{acquireUiLock(te,{port:0,worktreeRoot:e.projectDir??e.contentDir}),ge=!0}catch(e){if(e instanceof UiLockCollisionError)S.info({event:`ui-lock-yielded-to-live-holder`,pid:process.pid,existingPid:e.existing.pid,existingPort:e.existing.port,lockDir:te},`ui.lock already held by a live process — yielding (advertisement is fulfilled)`);else throw await ee().catch(()=>{}),e}let _e=e.reactShellDistDir?build_default(e.reactShellDistDir,{single:!0,gzip:!0,immutable:!0}):void 0,ve=mountMcpAndApi({httpServer:fe,hocuspocus:q,mcpHttpHandler:de,log:S,sessionManager:ne,agentFocusBroadcaster:ae,agentPresenceBroadcaster:oe,maintenanceCoordinator:se,keepaliveGraceMs:e.keepaliveGraceMs,contentAssetMiddleware:me,reactShellMiddleware:_e,ephemeral:e.ephemeral}),ye=async()=>{throw Error(`bootServer: destroy() invoked before initialization — boot did not complete`)},Ce=null;g!==null&&(Ce=attachIdleShutdown({httpServer:fe,thresholdMs:g??DEFAULT_IDLE_THRESHOLD_MS,log:S,onShutdown:(e.idleShutdownHandler??(e=>async()=>{await e()}))(async()=>{await ye()})})),await restoreLifecycleFromConflictsJson({hocuspocus:q,projectDir:e.projectDir??e.contentDir,log:S});try{await new Promise((t,s)=>{let g=e=>s(e);fe.once(`error`,g),fe.listen(e.port,e.host,()=>{fe.removeListener(`error`,g),t()})})}catch(e){if(ge)try{releaseUiLock(te)}catch(e){S.warn({err:e},`releaseUiLock failed during listen-error cleanup`)}throw await ee().catch(()=>{}),e}let we=fe.address(),Te=typeof we==`object`&&we?we.port:e.port??0;if(ue=Te,O(te,Te),ge&&updateUiLockPort(te,Te),s&&e.spawnUiSiblingFn)try{await e.spawnUiSiblingFn({lockDir:te,log:S})}catch(e){S.warn({err:e},`spawnUiSiblingFn failed`)}let De=!1,je=async(e,t)=>{let s;try{await Promise.race([t(),new Promise((t,g)=>{s=setTimeout(()=>{g(Error(`${e} timed out after ${DESTROY_STEP_TIMEOUT_MS}ms`))},DESTROY_STEP_TIMEOUT_MS),s.unref?.()})])}finally{s!==void 0&&clearTimeout(s)}};return ye=async()=>{if(De)return;De=!0;let e=[],t=async(t,s)=>{try{await je(t,s)}catch(s){e.push(s),S.warn({err:s,step:t},`bootServer destroy step failed`)}};try{Ce?.detach()}catch(t){e.push(t),S.warn({err:t,step:`idleHandle.detach`},`bootServer destroy step failed`)}if(await t(`mount.shutdown`,()=>ve.shutdown()),de!==void 0&&await t(`mcpHttpHandler.close`,()=>de.close()),await t(`mount.wss.close`,()=>new Promise((e,t)=>{ve.wss.close(s=>s?t(s):e())})),await t(`httpServer.closeAllConnections`,async()=>{fe.closeAllConnections?.()}),await t(`httpServer.close`,()=>new Promise((e,t)=>{fe.close(s=>s&&s.code!==`ERR_SERVER_NOT_RUNNING`?t(s):e())})),await t(`destroyHocuspocus`,()=>ee()),ge&&await t(`releaseUiLock`,async()=>releaseUiLock(te)),await t(`shutdownTelemetry`,()=>shutdownTelemetry()),await t(`teardownToleranceTelemetry`,()=>teardownToleranceTelemetryWriter()),await t(`flushLogFileSinks`,()=>loggerFactory.flushAllFileSinks()),e.length>0)throw AggregateError(e,`bootServer destroy completed with errors`)},{httpServer:fe,destroy:ye,lockDir:te,contentDir:e.contentDir,port:Te,ready:J,degraded:Y,didAutoInit:k,serverInstance:H}}async function restoreLifecycleFromConflictsJson(e){let{hocuspocus:t,projectDir:s,log:g}=e,S,w;try{S=new ConflictStore(s),w=S.list()}catch(e){g.warn({err:e,projectDir:s},`[boot] lifecycle restore: failed to read conflicts.json — skipping`);return}if(w.length===0)return;let E=null;try{let e=resolveGitDir(s),t=e?join(e,`MERGE_HEAD`):null;if(!t||!existsSync(t)){S.clear(),console.warn(JSON.stringify({event:`lifecycle-restore-cleared-stale-conflicts`,reason:`no-merge-head`,count:w.length}));return}let g=(await simpleGit({baseDir:s,timeout:{block:5e3}}).raw([`diff`,`--name-only`,`--diff-filter=U`])).trim();E=new Set(g?g.split(`
|
|
2953
2953
|
`).map(e=>e.trim()).filter(Boolean):[])}catch(e){g.warn({err:e,projectDir:s},`[boot] lifecycle restore: git unmerged probe failed — restoring all entries`)}if(E!==null){let e=0;for(let t of w)E.has(t.file)||(S.removeConflict(t.file),e++);if(e>0&&console.warn(JSON.stringify({event:`lifecycle-restore-pruned-resolved-entries`,pruned:e,remaining:w.length-e})),w=w.filter(e=>E?.has(e.file)),w.length===0)return}for(let e of w){let s=stripDocExtension(e.file),S=null,w=!1;try{S=await t.openDirectConnection(s);let e=S.document;if(!e)continue;let g=e.getMap(`lifecycle`);g.set(`status`,`conflict`),g.set(`reason`,`conflict-markers`),w=!0,console.warn(JSON.stringify({event:`lifecycle-restored-from-conflicts-json`,"doc.name":s}))}catch(e){g.warn({err:e,docName:s},`[boot] lifecycle restore: failed to set lifecycle for doc — skipping`)}finally{if(S)try{await S.disconnect()}catch(e){g.warn({err:e,docName:s,restored:w},`[boot] lifecycle restore: disconnect failed after lifecycle write`)}}}}const ConfigSchema=ConfigSchema$1;function detectClaudeDesktopPresence(e={}){let t=e.home??homedir(),s=e.platformName??process.platform,g=e.env??process.env;return s===`darwin`?existsSync(join(t,`Library`,`Application Support`,`Claude`)):s===`win32`?existsSync(join(g.APPDATA??join(t,`AppData`,`Roaming`),`Claude`)):!1}const OK_LOGS_DIR=join(homedir(),`.ok`,`logs`),MAX_ROTATED_FILES=2,MAX_AGE_DAYS=7,MAX_DIR_SIZE_BYTES=45*1024*1024,REDACT_PATHS=[`authorization`,`password`,`token`,`apiKey`,`secret`,`*.authorization`,`*.password`,`*.token`,`*.apiKey`,`*.secret`];function resolveLogLevel(){let e=process.env.OK_LOG_LEVEL??process.env.LOG_LEVEL;if(e){let t=[`fatal`,`error`,`warn`,`info`,`debug`],s=e.toLowerCase();if(t.includes(s))return s}return process.env.NODE_ENV===`test`?`silent`:`info`}function ensureDir(e){mkdirSync(e,{recursive:!0})}function todayDateString(){return new Date().toISOString().slice(0,10)}function rotateIfNeeded(e){try{if(statSync(e).size<5242880)return}catch{return}for(let t=MAX_ROTATED_FILES;t>=1;t--){let s=t===1?e:`${e}.${t-1}`,g=`${e}.${t}`;try{renameSync(s,g)}catch{}}try{unlinkSync(`${e}.${MAX_ROTATED_FILES+1}`)}catch{}}function pruneLogsDir(e){try{let t=Date.now(),s=MAX_AGE_DAYS*24*60*60*1e3,g=readdirSync(e).filter(e=>e.endsWith(`.log`)||/\.log\.\d+$/.test(e)).map(t=>{try{let s=statSync(join(e,t));return{name:t,mtime:s.mtimeMs,size:s.size}}catch{return null}}).filter(Boolean);for(let S of g)if(t-S.mtime>s)try{unlinkSync(join(e,S.name))}catch{}let S=g.filter(e=>t-e.mtime<=s).sort((e,t)=>e.mtime-t.mtime),w=S.reduce((e,t)=>e+t.size,0);for(let t of S){if(w<=MAX_DIR_SIZE_BYTES)break;try{unlinkSync(join(e,t.name)),w-=t.size}catch{}}}catch{}}function createFileLogger(e){ensureDir(OK_LOGS_DIR);let t=todayDateString(),s=e.filePath??join(OK_LOGS_DIR,`${e.name}.${t}.log`);rotateIfNeeded(s),(e._setTimeout??setTimeout)(()=>pruneLogsDir(OK_LOGS_DIR),5e3).unref();let g=import_pino.default.destination({dest:s,append:!0,sync:!0});return(0,import_pino.default)({level:resolveLogLevel(),name:e.name,redact:{paths:REDACT_PATHS,censor:`[REDACTED]`},base:{pid:process.pid,hostname:void 0,runtime:`cli`,project:e.project??`<no-project>`},timestamp:import_pino.default.stdTimeFunctions.isoTime,...e.additionalOptions},g)}function flushFileLogger(e,t=250){return new Promise(s=>{if(!e){s();return}let g=e[import_pino.default.symbols.streamSym],S=!1,w=()=>{S||(S=!0,s())};if(!g||typeof g.flushSync!=`function`){w();return}let E=()=>{try{g.flushSync?.()}catch{}w()},D=setTimeout(w,t);typeof D.unref==`function`&&D.unref(),typeof g.fd==`number`&&g.fd>=0?(clearTimeout(D),E()):typeof g.once==`function`?g.once(`ready`,()=>{clearTimeout(D),E()}):(clearTimeout(D),E())})}function getLogFilePath(e){return join(OK_LOGS_DIR,`${e}.${todayDateString()}.log`)}function getLogsDir(){return OK_LOGS_DIR}const ANCESTOR_WALK_DEPTH_LIMIT=30,GIT_MARKER=`.git`;function findEnclosingGitRoot(e){let t=resolve(e),s=0;for(;s<ANCESTOR_WALK_DEPTH_LIMIT;){let e=!1;try{e=existsSync(resolve(t,GIT_MARKER))}catch{e=!1}if(e)return{gitRoot:t,distance:s};let g=dirname(t);if(g===t)return null;t=g,s+=1}return null}const execFileAsync=promisify(execFile),log=getLogger(`project-git`);var ProjectGitInitError=class extends Error{stderr;constructor(e,t=``,s){super(e,s),this.name=`ProjectGitInitError`,this.stderr=t}};async function isInsideExistingWorkTree(e){try{let{stdout:t}=await execFileAsync(`git`,[`rev-parse`,`--is-inside-work-tree`],{cwd:e});return t.trim()===`true`}catch{return!1}}async function ensureProjectGit(e){let t=resolve(e),s=resolve(t,`.git`),g=resolve(s,`HEAD`),S=!1;if(existsSync(s)){if(!statSync(s).isDirectory()||existsSync(g))return{didInit:!1};log.info({},`detected partial .git/ — running git init to repair`),S=!0}else if(await isInsideExistingWorkTree(t))return{didInit:!1};let w=``;try{w=(await execFileAsync(`git`,[`init`,`--initial-branch=main`,t])).stderr??``}catch(e){let s=typeof e==`object`&&e&&`stderr`in e?String(e.stderr??``):``;throw new ProjectGitInitError(`git init failed at ${t}: ${e instanceof Error?e.message:String(e)}`,s,{cause:e})}if(!existsSync(g))throw new ProjectGitInitError(`git init reported success but ${s}/HEAD is missing (partial init detected)`,w);return S?(log.info({path:t},`backfilled missing .git/HEAD`),{didInit:!0,repaired:!0}):(log.info({path:t,branch:`main`},`initialized .git/`),{didInit:!0})}async function resolvePackageVersion(e,t){let s;try{s=createRequire(t).resolve(e)}catch(e){if(e?.code===`MODULE_NOT_FOUND`)return;throw e}for(let t=dirname(s),g=0;g<32;g+=1){let s=join(t,`package.json`);if(existsSync(s))try{let t=JSON.parse(await readFile$1(s,`utf-8`));if(t.name===e&&typeof t.version==`string`)return t.version}catch{}let g=dirname(t);if(g===t)return;t=g}}const MAX_CAUSE_DEPTH=5,HOME_PATH_PATTERNS=[{regex:/\/Users\/[^/]+\//g,replacement:`~/`},{regex:/\/home\/[^/]+\//g,replacement:`~/`},{regex:/C:\\\\Users\\\\[^\\\\]+\\\\/g,replacement:`~\\`},{regex:/C:\\Users\\[^\\]+\\/g,replacement:`~\\`}];function scrubPaths(e){if(e===void 0)return;let t=e;for(let{regex:e,replacement:s}of HOME_PATH_PATTERNS)t=t.replace(e,s);return t}function serializeError(e,t=0,s=new WeakSet){if(t>=MAX_CAUSE_DEPTH)return{name:`SerializedError.CauseDepthExceeded`,message:`cause chain depth > ${MAX_CAUSE_DEPTH}; truncated`};if(typeof e==`object`&&e){if(s.has(e))return{name:`SerializedError.CauseCycle`,message:`cyclic cause; truncated`};s.add(e)}if(e instanceof Error)return{name:e.name,message:scrubPaths(e.message)??``,stack:scrubPaths(e.stack),code:e.code,cause:e.cause===void 0?void 0:serializeError(e.cause,t+1,s)};if(e==null)return{name:`UnknownError`,message:String(e)};if(typeof e==`string`)return{name:`StringError`,message:scrubPaths(e)??e};if(typeof e==`object`){let g=e;return{name:String(g.name??`ObjectError`),message:scrubPaths(String(g.message??``))??``,stack:scrubPaths(g.stack),code:g.code,cause:g.cause===void 0?void 0:serializeError(g.cause,t+1,s)}}return{name:`UnknownError`,message:String(e)}}var SingleFileNotFoundError=class extends Error{constructor(e){super(`File not found: ${e}`),this.filePath=e,this.name=`SingleFileNotFoundError`}},SingleFileNotAFileError=class extends Error{constructor(e){super(`Not a file: ${e}. \`ok <file>\` opens a single markdown file.`),this.filePath=e,this.name=`SingleFileNotAFileError`}},SingleFileNotMarkdownError=class extends Error{constructor(e){super(`Open Knowledge edits markdown files (.md / .mdx): ${e}`),this.filePath=e,this.name=`SingleFileNotMarkdownError`}};function prepareSingleFileOpen(e){if(!isSupportedDocFile(e))throw new SingleFileNotMarkdownError(e);let t;try{t=realpathSync(resolve(e))}catch(t){throw t.code===`ENOENT`?new SingleFileNotFoundError(e):t}if(!statSync(t).isFile())throw new SingleFileNotAFileError(e);let s=dirname(t),g=findEnclosingProjectRoot(s);if(g){let e=g.rootPath;return{mode:`project`,projectRoot:e,docName:stripDocExtension(relative(resolveProjectContentDir(e),t).split(sep).join(`/`)),canonicalFilePath:t}}let S=basename(t);return{mode:`ephemeral`,canonicalFilePath:t,contentDir:s,singleDocRelPath:S,docName:stripDocExtension(S)}}function resolveProjectContentDir(e){return resolve(e,readConfigSafely({absPath:resolveConfigPath(`project`,e),sideline:!1,warn:()=>{}}).value.content?.dir??`.`)}function createEphemeralProjectDir(e){let t=mkdtempSync(resolve(tmpdir(),`ok-ephemeral-`)),s=resolve(t,`.ok`);return mkdirSync(s,{recursive:!0}),writeFileSync(resolve(s,`config.yml`),`# Ephemeral single-file session (\`ok <file>\`). Throwaway — safe to delete.\ncontent:\n dir: ${JSON.stringify(e)}\n`,`utf-8`),writeFileSync(resolve(s,`.gitignore`),`local/
|
|
2954
2954
|
`,`utf-8`),t}export{STARTER_TEMPLATES as $,withFileLockSync as $i,isProjectRoot as $n,runCloneSubprocess as $r,createOsProbe as $t,LIVE_DERIVED_INDEX_DEBOUNCE_MS as A,tracedUnlinkSync as Ai,getMeter as An,readUiLock as Ar,clearContributors as At,OBSERVER_SYNC_ORIGIN as B,writeRootGitignoreForNewRepo as Bi,initTelemetry as Bn,resolveContentDir as Br,countShadowObjects as Bt,GIT_UPSTREAM_WRITER as C,tracedLinkSync as Ci,formatPackRationale as Cn,readBranchFromHead as Cr,buildExecResult as Ct,HocuspocusAuthRejection as D,tracedRenameSync as Di,getLogFilePath as Dn,readStateManifest as Dr,classifyEvents as Dt,HOCUSPOCUS_AUTH_REJECTION_REASONS as E,tracedRename as Ei,getLocalDir as En,readSkillInstallStateSnapshot as Er,buildWipTree as Et,MCP_SERVER_NAME as F,validateAgentId as Fi,hasGcLogLatch as Fn,registerWrite as Fr,commitWipFromTree as Ft,ROLLBACK_ORIGIN as G,JSONRPCMessageSchema as Gi,isAllowedApiOrigin as Gn,resolvePackageVersion as Gr,createContentFilter as Gt,PANE_TARGET_TTL_MS as H,writeTargetVersion as Hi,installPrettyZodErrors as Hn,resolveCursorSpawnInvocation as Hr,countWipRefs as Ht,MIN_GIT_VERSION as I,validateCloneInputs as Ii,incrementCollabSocketFilteredError as In,releaseUiLock as Ir,compareSemver as It,SKILL_INSTALL_EVENTS_FILE_REL as J,isJSONRPCRequest as Ji,isHocuspocusAuthRejectionReason as Jn,restoreLifecycleFromConflictsJson as Jr,createEphemeralProjectDir as Jt,ROOT_GITIGNORE_TEMPLATE as K,LATEST_PROTOCOL_VERSION as Ki,isAllowedWorkspaceHostHeader as Kn,resolveUiInfo as Kr,createContentFilterAsync as Kt,MISSING_OK_CONFIG_MESSAGE as L,validateSkillZip as Li,incrementServerObserverFire as Ln,removeLastKnownHash as Lr,containsConflictMarkers as Lt,MANAGED_RENAME_ORIGIN as M,tracedWriteFileSync as Mi,getTracer as Mn,recordContributor as Mr,coercePackId as Mt,MAX_AGENT_SESSIONS as N,updateLastKnownHash as Ni,handleCollabSocketError as Nn,recordSkillInstallEvent as Nr,commitUpstreamImport as Nt,HocuspocusAuthTokenSchema as O,tracedRmSync as Oi,getLogger as On,readTargetRecordedAt as Or,classifyFsPath as Ot,MCP_CONNECTION_ID_HEADER as P,updateUiLockPort as Pi,handleSpawnCursor as Pn,registerAllTools as Pr,commitWip as Pt,STARTER_PACK_IDS as Q,resolveConfigPath as Qi,isPathWithinDir as Qn,runAuthStatusSubprocess as Qr,createMcpHttpHandler as Qt,McpLogger as R,withSpan as Ri,initContent as Rn,resetMetrics as Rr,contentHash as Rt,GIT_PREFLIGHT_FAIL_SPAN_NAME as S,tracedAppendFileSync as Si,formatContributorsFrom as Sn,readArmedPaneTarget as Sr,buildConfigYmlContent as St,GitTooOldError as T,tracedMkdirSync as Ti,getCurrentMcpLogger as Tn,readServerPackageVersion as Tr,buildStarterFolderFrontmatterYaml as Tt,PinoLogger as U,writeTracker as Ui,installTestLoggers as Un,resolveLockDir as Ur,createApiExtension as Ut,OK_OKIGNORE_TEMPLATE as V,writeStateManifest as Vi,initToleranceTelemetryWriter as Vn,resolveCursorBinaryDefault as Vr,countStaleAgentWipRefs as Vt,ProjectGitInitError as W,McpServer as Wi,installUserSkill as Wn,resolvePack as Wr,createAssetServeMiddleware as Wt,STARTER_FOLDER_FRONTMATTER_FILENAME as X,atomicWriteFileSync as Xi,isLoopbackAddress as Xn,rewriteWikiLinksForDocumentRename as Xr,createFileLogger as Xt,STARTER_FOLDERS as Y,isJSONRPCResultResponse as Yi,isKnownPackId as Yn,rewriteMarkdownLinksForDocumentRename as Yr,createExternalChangeHandler as Yt,STARTER_PACKS as Z,readConfigSafely as Zi,isPairedWriteOrigin as Zn,runAuthReposSubprocess as Zr,createLiveDerivedIndexExtension as Zt,DEFAULT_PACK_ID as _,startWatcher as _i,findEnclosingGitRoot as _n,parseKeepaliveConnectionId as _r,assertGitAvailable as _t,AgentPresenceBroadcaster as a,resolveShadowDir as aa,sanitizeClientName as ai,describeStoredEmbeddingsKey as an,listStarterPacks as ar,SingleFileNotMarkdownError as at,FILE_WATCHER_ORIGIN as b,teardownToleranceTelemetryWriter as bi,formatAuthRejectionWire as bn,prepareSingleFileOpen as br,bootServer as bt,AutoStartDisabledError as c,seedBasenameIndex as ci,detectProjectShape as cn,logsCurrentPath as cr,UiLockCollisionError as ct,CONFIG_FILENAME as d,shadowGit as di,encodeFolderRoute as dn,mountMcpAndApi as dr,acquireUiLock as dt,writeConfigPatch as ea,runDeviceFlowSubprocess as ei,createPersistenceExtension as en,isSelfWrite as er,STATE_MANIFEST_FILENAME as et,CONFLICT_MARKER_RE as f,shutdownTelemetry as fi,ensureProjectGit as fn,normalizeFsPath as fr,applyAgentMarkdownWrite as ft,DEFAULT_EMBEDDINGS_DIMENSIONS as g,splitMarkdownBlocks as gi,fallbackPaths as gn,parseHocuspocusAuthToken as gr,assertCompatibleStateManifest as gt,DEFAULT_CHECKPOINT_RETENTION as h,spawnDetached as hi,extractWikiLinksFromMarkdown as hn,parseGitVersion as hr,armPaneTarget as ht,AgentFocusBroadcaster as i,resolveGitDirDetailed as ia,safetyCheckpoint as ii,createTestLogger as in,listRescueCheckpoints as ir,SingleFileNotFoundError as it,LOG_MD_TEMPLATE as j,tracedWriteFile as ji,getMetrics as jn,reconcile as jr,clearEmbeddingsKeyFromAllBackends as jt,INSTALLED_AGENTS_SCHEMES as k,tracedRmdirSync as ki,getLogsDir as kn,readTargetVersion as kr,clearArmedPaneTarget as kt,BacklinkIndex as l,serializeError as li,emitPreflightFailureSpan as ln,logsPreviousPath as lr,__getShowAllWalkStatsForTesting as lt,ConfigSchema as m,spansPreviousPath as mi,evictStaleTrackerEntries as mn,parseAuthRejectionWire as mr,applySeed as mt,AGENT_ID_RE as n,MalformedGitPointerError as na,safeContentPath as ni,createServerObserverExtension as nn,isToleranceTelemetryEnabled as nr,SeedRootDirError as nt,AgentSessionCapacityError as o,saveInMemoryCheckpoint as oi,detectClaudeDesktopPresence as on,loadPrincipal as or,StateManifestError as ot,CURSOR_BUNDLE_PATHS_BY_PLATFORM as p,spansCurrentPath as pi,errorResponse as pn,packageVersionMajorMinor as pr,applyExternalChange as pt,SERVICE_WRITER as q,isInitializedNotification as qi,isConfigDoc as qn,restoreContributors as qr,createEmbeddingsSecretStore as qt,AGENT_WRITE_ORIGIN as r,parseCheckpoint as ra,safeSubdir as ri,createStreamingErrorWriter as rn,lastKnownHash as rr,SingleFileNotAFileError as rt,AgentSessionManager as s,saveVersion as si,detectGit as sn,loggerFactory as sr,TagIndex as st,AGENT_ID_MAX_LEN as t,GitDirAccessError as ta,runWithMcpLogger as ti,createServer$1 as tn,isSystemDoc as tr,SeedPrerequisiteError as tt,CC1Broadcaster as u,setActiveSpanAttributes as ui,encodeDocName as un,makeLazyEmbeddingsKeyStore as ur,__resetShowAllWalkStatsForTesting as ut,EMBEDDINGS_API_KEY_ENV as v,streamingProblemEvent as vi,findEnclosingProjectRoot as vn,pathToDocName as vr,assertNeverDiskEvent as vt,GitNotAvailableError as w,tracedMkdir as wi,gcCheckpointRefs as wn,readProjectLocalSemanticConfig as wr,buildSkillZip as wt,FileEmbeddingsBackend as x,toBroadcasterKey as xi,formatContributors as xn,readAllTargets as xr,buildAndOpenSkill as xt,FILE_SYSTEM_WRITER as y,swapContributors as yi,flushFileLogger as yn,planSeed as yr,attachIdleShutdown as yt,MissingOkConfigError as z,withSpanSync as zi,initShadowRepo as zn,resolveBundledSkillDir as zr,contributorCount as zt};
|
|
2955
|
-
//# sourceMappingURL=dist-
|
|
2955
|
+
//# sourceMappingURL=dist-Br1AQTZl.mjs.map
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e,r as t,t as n}from"./gh-detect-DnwA-B1z.mjs";import{C as r,E as i,S as a,T as o,_ as s,b as c,d as l,g as u,h as d,i as f,o as p,r as m,s as h,t as g,w as _,x as v,y}from"./init-
|
|
1
|
+
import{i as e,r as t,t as n}from"./gh-detect-DnwA-B1z.mjs";import{C as r,E as i,S as a,T as o,_ as s,b as c,d as l,g as u,h as d,i as f,o as p,r as m,s as h,t as g,w as _,x as v,y}from"./init-CTZq5jSa.mjs";import{d as b,f as x,m as S,n as C,p as w,r as T,t as E}from"./src-Nis6h9fy.mjs";import{a as D,c as O,o as k,r as A,s as j,t as M}from"./write-project-skill-B6sZCIWR.mjs";import{n as N}from"./loader-Cfbl-zmD.mjs";import{n as P}from"./preview-CkrU7puU.mjs";import{n as F,t as I}from"./mcp-migrate-event-D0NrGjvc.mjs";export{A as ALL_EDITOR_IDS,D as EDITOR_LABELS,k as EDITOR_TARGETS,g as LAUNCH_CONFIG_NAME,m as LAUNCH_UI_CHAIN_SENTINEL,f as LAUNCH_UI_CHAIN_V1,c as addOkPathsToGitExclude,M as assertProjectPathSafe,j as buildManagedServerEntry,I as buildMcpConfigMigrateEvent,p as classifyExistingMcpEntry,t as createTokenStore,n as detectGh,h as detectInstalledEditors,v as formatTrackedRemediation,a as getExcludedOkPaths,r as getOkArtifactPaths,O as isEntryUpToDate,N as loadConfig,e as makeLazyProbeTokenStore,b as parseGitHubBlobUrl,x as parseGitHubShareUrl,w as parseGitHubTreeUrl,S as parseGitUrl,P as previewContent,_ as probeTrackedOkPaths,l as readExistingMcpEntry,o as readSharingMode,i as removeOkPathsFromGitExclude,y as resolveProjectRoot,T as runStop,d as scaffoldLaunchJson,F as truncatePriorEntry,C as validateLocalFolderForShare,u as writeEditorMcpConfig,E as writeProjectAiIntegrations,s as writeUserMcpConfigs};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{m as e}from"./init-CTZq5jSa.mjs";export{e as runInit};
|