@inkeep/open-knowledge 0.15.0 → 0.15.1-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/assets/skills/discovery/SKILL.md +1 -1
  2. package/dist/assets/skills/project/SKILL.md +5 -1
  3. package/dist/cli.mjs +5 -5
  4. package/dist/constants-OuLu8AdA.mjs +2 -0
  5. package/dist/{dist-BWV2MusQ.mjs → dist-BEh-GNLZ.mjs} +18 -1
  6. package/dist/{dist-DE2XTwQ5.mjs → dist-RBTJcoMv.mjs} +1 -1
  7. package/dist/index.mjs +1 -1
  8. package/dist/init-BUHJZjKi.mjs +1 -0
  9. package/dist/{init-Dk494K1D.mjs → init-mM-my2mf.mjs} +4 -4
  10. package/dist/{loader-BwrQjUfM.mjs → loader-Bm38bc01.mjs} +2 -2
  11. package/dist/loader-ZfhORCo_.mjs +1 -0
  12. package/dist/{preview-h-OyfvxY.mjs → preview-DO3biQng.mjs} +2 -2
  13. package/dist/preview-PK3dPbxr.mjs +1 -0
  14. package/dist/public/assets/{ActivityModeContent-EQRhbqwT.js → ActivityModeContent-5C5DgxUr.js} +1 -1
  15. package/dist/public/assets/{DocumentContext-BIuY-2Q4.js → DocumentContext-ChlC_1es.js} +1 -1
  16. package/dist/public/assets/{OpenInAgentMenuRequestContext-CLaqAjaQ.js → OpenInAgentMenuRequestContext-DsARjeLs.js} +1 -1
  17. package/dist/public/assets/{SettingsDialogBody-CtkfwZN0.js → SettingsDialogBody-BKAbkXfX.js} +1 -1
  18. package/dist/public/assets/{SourceEditor-BhkMman-.js → SourceEditor-gZArmuOu.js} +1 -1
  19. package/dist/public/assets/{config-validation-events-BMLN6KjW.js → config-validation-events-Bn8BnXmc.js} +1 -1
  20. package/dist/public/assets/{index-D9huVV9f.js → index-iQ7BsbcI.js} +4 -4
  21. package/dist/public/assets/{telemetry-impl-DOol9SLI.js → telemetry-impl-DoqF2oxU.js} +1 -1
  22. package/dist/public/index.html +4 -4
  23. package/dist/{repair-launch-json-Bep2C-2a.mjs → repair-launch-json-Drvz-gHk.mjs} +2 -2
  24. package/dist/{repair-mcp-configs-Cb_ceFgJ.mjs → repair-mcp-configs-Czb19OyF.mjs} +2 -2
  25. package/dist/{repair-skills-CTlH3pls.mjs → repair-skills-B-TzD-dX.mjs} +2 -2
  26. package/dist/repair-skills-CAEdErr8.mjs +1 -0
  27. package/dist/{src-CK1MtOQ7.mjs → src-D8R1uRwT.mjs} +2 -2
  28. package/dist/{start-LZr6D3Uq.mjs → start-CWAWzKJn.mjs} +2 -2
  29. package/dist/start-Cru3uCN4.mjs +1 -0
  30. package/dist/{write-project-skill-CeIR8amK.mjs → write-project-skill-BmnnFB1y.mjs} +2 -2
  31. package/package.json +1 -1
  32. package/dist/constants-C6kiUjwl.mjs +0 -2
  33. package/dist/init-BrrfpAXh.mjs +0 -1
  34. package/dist/loader-B0pstK3p.mjs +0 -1
  35. package/dist/preview-JCxDQckS.mjs +0 -1
  36. package/dist/repair-skills-DdU2sQ5O.mjs +0 -1
  37. package/dist/start-BonMCOoj.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.15.0"
6
+ version: "0.15.1-beta.0"
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.15.0"
6
+ version: "0.15.1-beta.0"
7
7
  author: "Inkeep"
8
8
  repository: "https://github.com/inkeep/open-knowledge"
9
9
  ---
@@ -113,6 +113,8 @@ OK Electron and `ok ui` share `ui.lock`; when a second UI binds a different port
113
113
 
114
114
  Call `write` / `edit` as soon as you have content. Native `Edit` / `sed` / direct `Write` on in-scope markdown is forbidden — it bypasses the CRDT and loses agent attribution in the shadow repo.
115
115
 
116
+ **Persist incrementally — the knowledge base IS your checkpoint (MUST).** On any multi-step or long-running task — a research sweep, a multi-source synthesis, a batch of docs — write completed work to the KB as you finish each unit: per section, per source, per doc. Never hold finished findings only in your context waiting for one final write at the end. A rate limit, crash, or context compaction mid-task discards everything still unwritten; work already persisted to a doc survives, and you resume by reading the doc back instead of redoing the work. Create the target doc early (skeleton + frontmatter), then `edit` each section in as it firms up. Completed, paid-for work that existed only in context and got dropped on a rate limit is the exact failure this rule prevents — the KB is where work goes to be safe, not a thing you save to once at the finish line.
117
+
116
118
  **Pass a `summary` on every content write (SHOULD).** `write`, `edit`, and `move` each take a one-line `summary` (≤80 chars) describing the user-facing outcome of the change — "Add gear list and permit info", not "edited trip doc". It renders as a bullet under your name in the document timeline and is the only human-readable change-note persisted to the shadow-repo history; omit it and the timeline shows *that* you wrote but not *what changed*. Write it from the reader's perspective, keep it specific, and avoid secrets or PII (it lands in git history). Each entry in the batch `documents:` form carries its own `summary`.
117
119
 
118
120
  **Reach for visual structure where it aids comprehension.** Default to the right OK primitive over flat prose: a Callout (`> [!NOTE]`) for a key caveat, a ` ```mermaid ` diagram for a process or relationship, a table for options or comparisons, an `html preview` chart for numbers. **Call the `palette` MCP tool as you draft** (and `palette({ components })` for a canonical's JSX schema) — it returns copy-ready markdown-native forms, themed `html preview` embed starters, and the theme tokens, so the visual lands themed and in the content graph instead of hand-rolled. Don't decorate — use a visual only when it carries the point better than prose would. Full catalog: §Components.
@@ -398,6 +400,8 @@ Body is just the wiki-embed. PDFs/opaque attachments render as a click-dispatchi
398
400
 
399
401
  When you make a multi-step change (batch of new docs, folder restructure), pause between steps to let the browser preview catch up. The CRDT edit streams live; the preview follows your edit cadence. Don't batch 10 writes in a row — interleave the writes so the user watching the browser sees the narrative progress.
400
402
 
403
+ This does not conflict with *Persist incrementally* (§Writing): a checkpoint-write per section/source is naturally spaced by the work that produces that unit (read a source → write its findings → read the next), so those writes *are* the interleaved cadence. The anti-pattern is firing many writes back-to-back with no intervening work — not persisting completed work as you go. When in tension, durability wins: never hold finished work back from the KB to smooth cadence.
404
+
401
405
  This is primarily a human-watchability concern — the user watches edits land in the preview; interleaved cadence makes the narrative legible. When the batch is done, navigate the preview to the primary deliverable (see "End a turn on the deliverable" in §Preview).
402
406
 
403
407
  **Hub docs.** Don't *create* `INDEX.md` / `README.md` hub files solely to catalog children — `exec("ls -A <folder>")` returns the same view live, with per-file frontmatter + backlink counts. But if a hub doc *already exists* from prior work, keep it updated as children change — interleave: write child → update hub → write next child, rather than batching five child edits and a single trailing hub update.
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,Ai as r,Gi as i,Ki as a,Pi as o,Qi as s,Ta as c,Vi as l,Wr as u,Zi as d,bn as f,ea as p,f as m,ia as h,ki as g,n as _,qi as v,s as y,sa as ee,ua as b,wa as x,xr as S}from"./server-lock-BpjJj3OD-CqSr5wlA.mjs";import{a as te,n as C,r as ne,t as re}from"./gh-detect-DDDo2rYe.mjs";import{r as w}from"./git-handle--dq7Gq14-BpH0pmv5.mjs";import{$i as ie,Bt as ae,Cr as oe,F as se,Gi as ce,Gr as le,Hr as ue,Ht as de,Ji as fe,Ki as pe,Ln as me,Nr as he,P as ge,Pn as _e,Q as ve,Qn as ye,T as be,Tn as xe,Ui as Se,Vn as Ce,Vt as we,Wi as Te,Xt as Ee,Z as De,Zi as Oe,_ as ke,_t as Ae,an as je,at as Me,c as Ne,dn as Pe,ea as Fe,ia as Ie,ii as Le,it as Re,jt as ze,mt as Be,na as Ve,qi as He,qt as Ue,rt as We,ta as Ge,tt as Ke,un as qe,v as Je,vr as Ye,w as Xe,xt as Ze,yn as Qe,yr as $e,zr as et}from"./dist-BWV2MusQ.mjs";import{t as tt}from"./yazl-Docqgl6q.mjs";import{n as nt,r as rt,t as T}from"./dist-bundle-D75dREX-.mjs";import{B as it,C as at,E as ot,F as st,H as ct,I as lt,L as ut,M as dt,N as ft,P as pt,R as mt,S as ht,T as gt,V as _t,b as vt,u as yt,v as bt,w as xt,z as St}from"./init-Dk494K1D.mjs";import{a as Ct,c as wt,h as Tt,i as Et,l as Dt,m as Ot,o as kt,s as At,u as jt}from"./src-CK1MtOQ7.mjs";import{n as Mt,t as Nt}from"./constants-C6kiUjwl.mjs";import{n as Pt,t as Ft}from"./loader-BwrQjUfM.mjs";import{S as It,_ as Lt,b as Rt,m as zt,x as Bt,y as Vt}from"./start-LZr6D3Uq.mjs";import{c as Ht,i as E,n as D,o as O,r as k,s as A,t as j}from"./colors-8SzMRIVy.mjs";import{n as Ut}from"./repair-skills-CTlH3pls.mjs";import{execFile as Wt,execSync as Gt,spawn as M,spawnSync as N}from"node:child_process";import{accessSync as Kt,closeSync as qt,constants as Jt,cpSync as Yt,createWriteStream as Xt,existsSync as P,mkdirSync as F,mkdtempSync as Zt,openSync as Qt,readFileSync as I,readdirSync as $t,realpathSync as en,rmSync as tn,statSync as nn,unlinkSync as rn,writeFileSync as L}from"node:fs";import an,{basename as R,dirname as on,join as z,relative as sn,resolve as B,sep as cn}from"node:path";import ln from"node:process";import{arch as un,freemem as dn,homedir as fn,platform as pn,release as mn,tmpdir as hn,totalmem as gn,type as _n,uptime as vn}from"node:os";import{fileURLToPath as yn}from"node:url";import{rm as bn}from"node:fs/promises";import{createHash as xn,randomUUID as Sn}from"node:crypto";import{setTimeout as Cn}from"node:timers/promises";import{promisify as wn,stripVTControlCharacters as Tn,styleText as V}from"node:util";import{AsyncLocalStorage as En,AsyncResource as Dn}from"node:async_hooks";import*as On from"node:readline";import{createInterface as kn}from"node:readline/promises";const An={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 jn;(function(e){})(jn||={});function Mn(e){return b(l,e)}async function Nn(e,t,n,r){let i=Pn(await Fn(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 Pn(e){let t={};for(let n of e.split(`
2
+ import{s as e}from"./chunk-C94x7I9S.mjs";import{t}from"./esm-BLMtE3s6.mjs";import{$i as n,Ai as r,Gi as i,Ki as a,Pi as o,Qi as s,Ta as c,Vi as l,Wr as u,Zi as d,bn as f,ea as p,f as m,ia as h,ki as g,n as _,qi as v,s as y,sa as ee,ua as b,wa as x,xr as S}from"./server-lock-BpjJj3OD-CqSr5wlA.mjs";import{a as te,n as C,r as ne,t as re}from"./gh-detect-DDDo2rYe.mjs";import{r as w}from"./git-handle--dq7Gq14-BpH0pmv5.mjs";import{$i as ie,Bt as ae,Cr as oe,F as se,Gi as ce,Gr as le,Hr as ue,Ht as de,Ji as fe,Ki as pe,Ln as me,Nr as he,P as ge,Pn as _e,Q as ve,Qn as ye,T as be,Tn as xe,Ui as Se,Vn as Ce,Vt as we,Wi as Te,Xt as Ee,Z as De,Zi as Oe,_ as ke,_t as Ae,an as je,at as Me,c as Ne,dn as Pe,ea as Fe,ia as Ie,ii as Le,it as Re,jt as ze,mt as Be,na as Ve,qi as He,qt as Ue,rt as We,ta as Ge,tt as Ke,un as qe,v as Je,vr as Ye,w as Xe,xt as Ze,yn as Qe,yr as $e,zr as et}from"./dist-BEh-GNLZ.mjs";import{t as tt}from"./yazl-Docqgl6q.mjs";import{n as nt,r as rt,t as T}from"./dist-bundle-D75dREX-.mjs";import{B as it,C as at,E as ot,F as st,H as ct,I as lt,L as ut,M as dt,N as ft,P as pt,R as mt,S as ht,T as gt,V as _t,b as vt,u as yt,v as bt,w as xt,z as St}from"./init-mM-my2mf.mjs";import{a as Ct,c as wt,h as Tt,i as Et,l as Dt,m as Ot,o as kt,s as At,u as jt}from"./src-D8R1uRwT.mjs";import{n as Mt,t as Nt}from"./constants-OuLu8AdA.mjs";import{n as Pt,t as Ft}from"./loader-Bm38bc01.mjs";import{S as It,_ as Lt,b as Rt,m as zt,x as Bt,y as Vt}from"./start-CWAWzKJn.mjs";import{c as Ht,i as E,n as D,o as O,r as k,s as A,t as j}from"./colors-8SzMRIVy.mjs";import{n as Ut}from"./repair-skills-B-TzD-dX.mjs";import{execFile as Wt,execSync as Gt,spawn as M,spawnSync as N}from"node:child_process";import{accessSync as Kt,closeSync as qt,constants as Jt,cpSync as Yt,createWriteStream as Xt,existsSync as P,mkdirSync as F,mkdtempSync as Zt,openSync as Qt,readFileSync as I,readdirSync as $t,realpathSync as en,rmSync as tn,statSync as nn,unlinkSync as rn,writeFileSync as L}from"node:fs";import an,{basename as R,dirname as on,join as z,relative as sn,resolve as B,sep as cn}from"node:path";import ln from"node:process";import{arch as un,freemem as dn,homedir as fn,platform as pn,release as mn,tmpdir as hn,totalmem as gn,type as _n,uptime as vn}from"node:os";import{fileURLToPath as yn}from"node:url";import{rm as bn}from"node:fs/promises";import{createHash as xn,randomUUID as Sn}from"node:crypto";import{setTimeout as Cn}from"node:timers/promises";import{promisify as wn,stripVTControlCharacters as Tn,styleText as V}from"node:util";import{AsyncLocalStorage as En,AsyncResource as Dn}from"node:async_hooks";import*as On from"node:readline";import{createInterface as kn}from"node:readline/promises";const An={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 jn;(function(e){})(jn||={});function Mn(e){return b(l,e)}async function Nn(e,t,n,r){let i=Pn(await Fn(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 Pn(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 Fn(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 In(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 Nn(process.stdin,process.stdout,r,{log:t,getDiag:()=>n});await Qe(t),process.exit(i)}catch(e){t?.error({error:e instanceof Error?e.message:String(e)},`[auth] git-credential get: unexpected error`),await Qe(t),process.exit(1)}}),r}function Ln(e){let t=e.endpoint.DEFAULTS;return/^https:\/\/(api\.)?github\.com$/.test(t.baseUrl)?`https://github.com`:t.baseUrl.replace(`/api/v3`,``)}async function Rn(e,t,n){let r={baseUrl:Ln(e),headers:{accept:`application/json`},...n},i=await e(t,r);if(`error`in i.data){let n=new nt(`${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 zn(e){let t=e.request||T,n={client_id:e.clientId};return`scopes`in e&&Array.isArray(e.scopes)&&(n.scope=e.scopes.join(` `)),Rn(t,`POST /login/device/code`,n)}async function Bn(e){let t=await Rn(e.request||T,`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=Vn(e,t.data.expires_in),n.refreshTokenExpiresAt=Vn(e,t.data.refresh_token_expires_in)}delete n.scopes}return{...t,authentication:n}}function Vn(e,t){return new Date(e+t*1e3).toISOString()}async function Hn(e,t){let n=Un(e,t.auth);if(n)return n;let{data:r}=await zn({clientType:e.clientType,clientId:e.clientId,request:t.request||e.request,scopes:t.auth.scopes||e.scopes});await e.onVerification(r);let i=await Gn(t.request||e.request,e.clientId,e.clientType,r);return e.authentication=i,i}function Un(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 Wn(e){await new Promise(t=>setTimeout(t,e*1e3))}async function Gn(e,t,n,r){try{let i={clientId:t,request:e,code:r.device_code},{authentication:a}=n===`oauth-app`?await Bn({...i,clientType:`oauth-app`}):await Bn({...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 Wn(r.interval),Gn(e,t,n,r);if(a===`slow_down`)return await Wn(r.interval+7),Gn(e,t,n,r);throw i}}async function Kn(e,t){return Hn(e,{auth:t})}async function qn(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 Hn(e,{request:t,auth:{type:`oauth`}});return i.headers.authorization=`token ${a}`,t(i)}var Jn=`0.0.0-development`;function Yn(e){let t=e.request||T.defaults({headers:{"user-agent":`octokit-auth-oauth-device.js/${Jn} ${rt()}`}}),{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(Kn.bind(null,i),{hook:qn.bind(null,i)})}async function Xn(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=Yn({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 Zn(){return process.env.OPEN_KNOWLEDGE_GITHUB_CLIENT_ID??`Ov23liqlSd0V1MwR6rhI`}const Qn=new Set([`gitlab.com`,`bitbucket.org`,`codeberg.org`,`gitea.com`,`sr.ht`,`sourcehut.org`]);function H(e){let t=e.toLowerCase().replace(/:\d+$/,``);Qn.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 $n(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function er(e,t,n=Xn){let r=Zn(),{host:i,json:a}=e;H(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?$n(!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?$n(!0,{type:`complete`,host:i,login:s}):process.stderr.write(`✓ Logged in as ${s} on ${i}\n`)}function tr(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 er(t,await e())})}const nr=e=>e.name===`enter`||e.name===`return`;var rr=class extends Error{name=`AbortPromptError`;message=`Prompt was aborted`;constructor(e){super(),this.cause=e?.cause}},ir=class extends Error{name=`CancelPromptError`;message=`Prompt was canceled`},ar=class extends Error{name=`ExitPromptError`},or=class extends Error{name=`HookError`},sr=class extends Error{name=`ValidationError`};const cr=new En;function lr(e){return{rl:e,hooks:[],hooksCleanup:[],hooksEffect:[],index:0,handleChange(){}}}function ur(e,t){let n=lr(e);return cr.run(n,()=>{function e(e){n.handleChange=()=>{n.index=0,e()},n.handleChange()}return t(e)})}function U(){let e=cr.getStore();if(!e)throw new or(`[Inquirer] Hook functions can only be called from within a prompt`);return e}function dr(){return U().rl}function fr(e){return Dn.bind((...t)=>{let n=U(),r=!1,i=n.handleChange;n.handleChange=()=>{r=!0};let a=e(...t);return r&&i(),n.handleChange=i,a})}function pr(e){let t=U(),{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 mr(){U().handleChange()}const hr={queue(e){let t=U(),{index:n}=t;t.hooksEffect.push(()=>{t.hooksCleanup[n]?.();let r=e(dr());if(r!=null&&typeof r!=`function`)throw new sr(`useEffect return value must be a cleanup function or nothing.`);t.hooksCleanup[n]=r})},run(){let e=U();fr(()=>{e.hooksEffect.forEach(e=>{e()}),e.hooksEffect.length=0})()},clearAll(){let e=U();e.hooksCleanup.forEach(e=>{e?.()}),e.hooksEffect.length=0,e.hooksCleanup.length=0}};function gr(e){return typeof e==`function`}function W(e){return pr(t=>{let n=Dn.bind(function(e){t.get()!==e&&(t.set(e),mr())});if(t.initialized)return[t.get(),n];let r=gr(e)?e():e;return t.set(r),[r,n]})}function _r(e,t){pr(n=>{let r=n.get();(!Array.isArray(r)||t.some((e,t)=>!Object.is(e,r[t])))&&hr.queue(e),n.set(t)})}const vr={prefix:{idle:V(`blue`,`?`),done:V(`green`,ct.tick)},spinner:{interval:80,frames:[`⠋`,`⠙`,`⠹`,`⠸`,`⠼`,`⠴`,`⠦`,`⠧`,`⠇`,`⠏`].map(e=>V(`yellow`,e))},style:{answer:e=>V(`cyan`,e),message:e=>V(`bold`,e),error:e=>V(`red`,`> ${e}`),defaultAnswer:e=>V(`dim`,`(${e})`),help:e=>V(`dim`,e),highlight:e=>V(`cyan`,e),key:e=>V(`cyan`,V(`bold`,`<${e}>`))}};function yr(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 br(...e){let t={};for(let n of e)for(let[e,r]of Object.entries(n)){let n=t[e];t[e]=yr(n)&&yr(r)?br(n,r):r}return t}function xr(...e){return br(vr,...e.filter(e=>e!=null))}function Sr({status:e=`idle`,theme:t}){let[n,r]=W(!1),[i,a]=W(0),{prefix:o,spinner:s}=xr(t);return _r(()=>{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 Cr(e){return W({current:e})[0]}function wr(e){let t=Cr(e);t.current=e,_r(e=>{let n=!1,r=fr((r,i)=>{n||t.current(i,e)});return e.input.on(`keypress`,r),()=>{n=!0,e.input.removeListener(`keypress`,r)}},[])}var Tr=e(_t(),1);function Er(e,t){return e.split(`
4
4
  `).flatMap(e=>it(e,t,{trim:!1,hard:!0}).split(`
5
5
  `).map(e=>e.trimEnd())).join(`
@@ -19,7 +19,7 @@ import{s as e}from"./chunk-C94x7I9S.mjs";import{t}from"./esm-BLMtE3s6.mjs";impor
19
19
  `),patterns:[...t],lineCount:n}}const Ki=z(fn(),`.ok`,`logs`),qi=z(fn(),`.ok`,`bug-reports`);function Ji(e){let t=z(e,`.ok`,`config.yml`);if(P(t))try{let e=I(t,`utf8`).match(/^\s*name:\s*['"]?(.+?)['"]?\s*$/m);if(e?.[1])return e[1]}catch{}return P(z(e,`.ok`))?xn(`sha256`).update(B(e)).digest(`hex`).slice(0,12):null}function Yi(){let e={timestamp:new Date().toISOString(),platform:pn(),osType:_n(),osRelease:mn(),hostname:`[redacted]`,uptime:vn(),freeMem:dn(),totalMem:gn(),nodeVersion:process.version,bunVersion:process.versions.bun??null,v8Version:process.versions.v8??null,pid:process.pid};try{e.macosVersion=Gt(`sw_vers -productVersion 2>/dev/null`,{encoding:`utf8`}).trim()}catch{}try{let t=z(__dirname,`..`,`..`,`package.json`);P(t)&&(e.okVersion=JSON.parse(I(t,`utf8`)).version)}catch{}return e}function Xi(e){if(!P(Ki))return{files:[],dir:Ki};let t=$t(Ki).filter(e=>e.endsWith(`.log`)||/\.log\.\d+$/.test(e)).map(e=>z(Ki,e));if(e&&t.length>0){let n=t.filter(t=>{try{return I(t,`utf8`).includes(`"project":"${e}"`)}catch{return!0}});n.length>0&&(t=n)}return{files:t,dir:Ki}}function Zi(e){let t=z(e,`.ok`,`local`);return P(t)?{files:[`server.lock`,`last-spawn-error.log`].map(e=>z(t,e)).filter(e=>P(e)),dir:t}:{files:[],dir:null}}function Qi(e){let t=z(e,`.ok`,`local`,`logs`);return P(t)?{files:[`server-current.jsonl`,`server-prev.jsonl`].map(e=>z(t,e)).filter(e=>P(e)),dir:t}:{files:[],dir:null}}async function $i(t){let n=Au();F(qi,{recursive:!0});let r=z(qi,`${new Date().toISOString().replace(/[:.]/g,`-`)}-bugreport.zip`);n?.info({projectSlug:t.projectSlug},`gathering diagnostic data`);let i=Yi(),{files:a}=Xi(t.projectSlug),{files:o}=Zi(t.cwd),{files:s}=Qi(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}=Gi(I(e,`utf8`)),i=`logs/${R(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}=Gi(I(e,`utf8`)),i=`lockdir/${R(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}=Gi(I(e,`utf8`)),i=`local-logs/${R(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: ${Wi.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=Xt(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&&pn()===`darwin`)try{M(`/usr/bin/open`,[`-R`,r],{detached:!0,stdio:`ignore`}).unref()}catch{}return r}function ea(){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=Ji(t);try{await $i({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 ta(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 na(e){let t=e.inspect??(t=>Tt(e.lockDir,t)),n=e.unlink??(e=>rn(e)),r=e.log??(e=>console.log(e)),i=e.error??(e=>console.error(e)),a=ta(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 ra(e){return new t(`clean`).description(`Prune stale / corrupt open-knowledge lock files (never touches live locks)`).action(()=>{e(),na({lockDir:ue(process.cwd())}).failed.length>0&&(process.exitCode=1)})}async function ia(e,t,n={},r=re){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 aa(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 oa=[[`count`,0,10],[`compress`,10,20],[`receiv`,20,60],[`resolv`,60,100]];function sa(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 oa)if(n.includes(e))return{stage:t[1],pct:Math.round(i+r/100*(a-i))};return null}function q(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}function ca(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 la(e){return typeof e!=`string`||e.length===0?[`--progress`]:[`--progress`,`-b`,e]}const ua=u;async function da(e){try{return await e.clone(la(e.branch)),{fellBack:!1}}catch(t){if(e.branch!==null&&ua(t))return e.onFallback(e.branch),await e.clone(la(null)),{fellBack:!0};throw t}}function fa(e,t,n){return e===`https`&&t===`github.com`&&n}async function pa(e,t,n,r=process.cwd()){let i=Ot(e);if(!i)throw Error(`Invalid git URL: ${e}`);let a=t.dir?B(r,t.dir):B(r,i.name);if(P(a)&&$t(a).length>0)throw Error(`Target directory is not empty: ${a}`);let o=te(),s=i.protocol===`https`&&i.hostname===`github.com`?await aa(i.owner,i.name):!1,c=fa(i.protocol,i.hostname,s)?{tier:`none`,credentialArgs:[]}:await ia(i.hostname,o,{}),l=ca(),u=w({baseDir:r,config:c.credentialArgs.length>=2?[c.credentialArgs[1]]:[],unsafe:{allowUnsafeCredentialHelper:!0}}).env(l),d=-1;u.outputHandler((e,n,r)=>{r.on(`data`,e=>{let n=e.toString(`utf-8`);for(let e of n.split(`
21
21
  `)){let n=sa(e);n&&n.pct!==d&&(d=n.pct,q(t.json,{type:`progress`,pct:n.pct,stage:n.stage}),t.json||process.stderr.write(`\r Cloning ${n.pct}%`))}})}),await da({branch:typeof t.branch==`string`&&t.branch.length>0?t.branch:null,clone:t=>u.clone(e,a,t),onFallback:e=>{q(t.json,{type:`branch-fallback`,branch:e}),t.json||process.stderr.write(`\n Branch '${e}' not found upstream — cloning default branch instead.\n`)}}),t.json||process.stderr.write(`
22
- `);try{let{runInit:e}=await import(`./init-BrrfpAXh.mjs`),n=await e({cwd:a,mcp:!1});if(n.contentUpdated.length>0){let e=`auto-init: updated ${n.contentUpdated.join(`, `)}`;t.json?q(!0,{type:`warning`,message:e}):process.stderr.write(` ${e}\n`)}}catch(e){let n=e instanceof Error?e.message:String(e);t.json?q(!0,{type:`warning`,message:`auto-init: ${n}`}):process.stderr.write(` auto-init: ${n}\n`)}try{ma(a)}catch(e){let n=e instanceof Error?e.message:String(e);t.json?q(!0,{type:`warning`,message:`git-exclude: ${n}`}):process.stderr.write(` git-exclude: ${n}\n`)}return a}function ma(e){let t=vt(e,[`.ok/`]);return t.kind===`no-exclude`?`no-exclude`:t.kind===`refused-tracked`?`already-present`:t.appended.length>0?`appended`:`already-present`}function ha(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 pa(t,{json:r.json,dir:n,branch:r.branch??null},i);if(r.json)q(!0,{type:`complete`,dir:a});else{process.stderr.write(`✓ Cloned to ${a}\n`),process.chdir(a);let{startCommand:t}=await import(`./start-BonMCOoj.mjs`);await t(e).parseAsync([],{from:`user`})}}catch(e){let t=e instanceof Error?e.message:String(e);r.json?q(!0,{type:`error`,message:t}):process.stderr.write(`✗ ${t}\n`),process.exitCode=1}})}var ga=c();const _a=[[`sync`],[`persistence`,`debounceMs`],[`persistence`,`maxDebounceMs`],[`server`,`port`],...r.map(e=>e.path)];function va(e={}){let t=e.log??(e=>console.error(e)),n=e.error??(e=>console.error(e)),r=e.loadConfigFn??Pt;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 ya(e){let t=(0,ga.parseDocument)(I(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 _a)t.hasIn(e)&&n.push(e.join(`.`));return n}function ba(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function xa(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=ba(i)?i:{};e[r]=a,e=a}e[n[n.length-1]]=null}return t}async function Sa(e={}){let t=e.log??(e=>console.log(e)),n=e.error??(e=>console.error(e)),r=e.scope??`both`,i=e.dryRun??!1,a=e.cwd??process.cwd(),s=e.writeConfigPatchFn??ie,c=[];(r===`project`||r===`both`)&&c.push({scope:`project`,absPath:Oe(`project`,a,e.homedirOverride)}),(r===`user`||r===`both`)&&c.push({scope:`user`,absPath:Oe(`user`,a,e.homedirOverride)});let l=[],u=!0;for(let{scope:t,absPath:n}of c){if(!P(n)){l.push({path:n,scope:t,found:[],removed:[]});continue}let r;try{r=ya(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||i){l.push({path:n,scope:t,found:r,removed:[]});continue}let c=await s({cwd:a,scope:t,patch:xa(_a.filter(e=>r.includes(e.join(`.`)))),homedirOverride:e.homedirOverride});if(!c.ok){l.push({path:n,scope:t,found:r,removed:[],error:o(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(i?`[dry-run] ${e.path}: would remove ${e.found.length} field(s): ${e.found.join(`, `)}`:`✓ ${e.path}: removed ${e.removed.length} field(s): ${e.removed.join(`, `)}`));return{outcomes:l,ok:u}}function Ca(){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(()=>{va({}).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 Sa({scope:t,dryRun:e.dryRun})).ok||(process.exitCode=1)}),e}var wa=e(tt(),1),J=e(Ht(),1);const Ta=new Set([`doc.name`]);function Ea(e){return`doc:${xn(`blake2b512`,{outputLength:32}).update(e).digest(`hex`).slice(0,8)}`}function Da(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 Oa(e,t){let n=t.originalToHashed.get(e);if(n!==void 0)return n;let r=Ea(e);return t.originalToHashed.set(e,r),Da(t,e,r),r}function ka(e,t){return t.length===0||!e.includes(t)?e:e.split(t).join(`<CONTENT_DIR>`)}function Aa(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ja(e,t){if(typeof e==`string`)return ka(e,t.contentDir);if(Array.isArray(e))return e.map(e=>ja(e,t));if(!Aa(e))return e;let n=typeof e.key==`string`&&Ta.has(e.key)&&Aa(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`&&Aa(a)){let e=Oa(n,t);r[i]={...a,stringValue:e}}else Ta.has(i)&&typeof a==`string`?r[i]=Oa(a,t):r[i]=ja(a,t);return r}function Ma(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 Na(e,t){let n=I(e,`utf-8`);if(n.length===0)return;let r=n.endsWith(`
22
+ `);try{let{runInit:e}=await import(`./init-BUHJZjKi.mjs`),n=await e({cwd:a,mcp:!1});if(n.contentUpdated.length>0){let e=`auto-init: updated ${n.contentUpdated.join(`, `)}`;t.json?q(!0,{type:`warning`,message:e}):process.stderr.write(` ${e}\n`)}}catch(e){let n=e instanceof Error?e.message:String(e);t.json?q(!0,{type:`warning`,message:`auto-init: ${n}`}):process.stderr.write(` auto-init: ${n}\n`)}try{ma(a)}catch(e){let n=e instanceof Error?e.message:String(e);t.json?q(!0,{type:`warning`,message:`git-exclude: ${n}`}):process.stderr.write(` git-exclude: ${n}\n`)}return a}function ma(e){let t=vt(e,[`.ok/`]);return t.kind===`no-exclude`?`no-exclude`:t.kind===`refused-tracked`?`already-present`:t.appended.length>0?`appended`:`already-present`}function ha(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 pa(t,{json:r.json,dir:n,branch:r.branch??null},i);if(r.json)q(!0,{type:`complete`,dir:a});else{process.stderr.write(`✓ Cloned to ${a}\n`),process.chdir(a);let{startCommand:t}=await import(`./start-Cru3uCN4.mjs`);await t(e).parseAsync([],{from:`user`})}}catch(e){let t=e instanceof Error?e.message:String(e);r.json?q(!0,{type:`error`,message:t}):process.stderr.write(`✗ ${t}\n`),process.exitCode=1}})}var ga=c();const _a=[[`sync`],[`persistence`,`debounceMs`],[`persistence`,`maxDebounceMs`],[`server`,`port`],...r.map(e=>e.path)];function va(e={}){let t=e.log??(e=>console.error(e)),n=e.error??(e=>console.error(e)),r=e.loadConfigFn??Pt;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 ya(e){let t=(0,ga.parseDocument)(I(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 _a)t.hasIn(e)&&n.push(e.join(`.`));return n}function ba(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function xa(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=ba(i)?i:{};e[r]=a,e=a}e[n[n.length-1]]=null}return t}async function Sa(e={}){let t=e.log??(e=>console.log(e)),n=e.error??(e=>console.error(e)),r=e.scope??`both`,i=e.dryRun??!1,a=e.cwd??process.cwd(),s=e.writeConfigPatchFn??ie,c=[];(r===`project`||r===`both`)&&c.push({scope:`project`,absPath:Oe(`project`,a,e.homedirOverride)}),(r===`user`||r===`both`)&&c.push({scope:`user`,absPath:Oe(`user`,a,e.homedirOverride)});let l=[],u=!0;for(let{scope:t,absPath:n}of c){if(!P(n)){l.push({path:n,scope:t,found:[],removed:[]});continue}let r;try{r=ya(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||i){l.push({path:n,scope:t,found:r,removed:[]});continue}let c=await s({cwd:a,scope:t,patch:xa(_a.filter(e=>r.includes(e.join(`.`)))),homedirOverride:e.homedirOverride});if(!c.ok){l.push({path:n,scope:t,found:r,removed:[],error:o(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(i?`[dry-run] ${e.path}: would remove ${e.found.length} field(s): ${e.found.join(`, `)}`:`✓ ${e.path}: removed ${e.removed.length} field(s): ${e.removed.join(`, `)}`));return{outcomes:l,ok:u}}function Ca(){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(()=>{va({}).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 Sa({scope:t,dryRun:e.dryRun})).ok||(process.exitCode=1)}),e}var wa=e(tt(),1),J=e(Ht(),1);const Ta=new Set([`doc.name`]);function Ea(e){return`doc:${xn(`blake2b512`,{outputLength:32}).update(e).digest(`hex`).slice(0,8)}`}function Da(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 Oa(e,t){let n=t.originalToHashed.get(e);if(n!==void 0)return n;let r=Ea(e);return t.originalToHashed.set(e,r),Da(t,e,r),r}function ka(e,t){return t.length===0||!e.includes(t)?e:e.split(t).join(`<CONTENT_DIR>`)}function Aa(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ja(e,t){if(typeof e==`string`)return ka(e,t.contentDir);if(Array.isArray(e))return e.map(e=>ja(e,t));if(!Aa(e))return e;let n=typeof e.key==`string`&&Ta.has(e.key)&&Aa(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`&&Aa(a)){let e=Oa(n,t);r[i]={...a,stringValue:e}}else Ta.has(i)&&typeof a==`string`?r[i]=Oa(a,t):r[i]=ja(a,t);return r}function Ma(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 Na(e,t){let n=I(e,`utf-8`);if(n.length===0)return;let r=n.endsWith(`
23
23
  `),i=n.split(`
24
24
  `),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=ja(JSON.parse(n),t);a.push(JSON.stringify(e))}catch{a.push(n)}}}L(e,r?`${a.join(`
25
25
  `)}\n`:a.join(`
@@ -50,7 +50,7 @@ ws.addEventListener('error', () => process.exit(1));
50
50
  setTimeout(() => process.exit(2), ${t+1e4});
51
51
  `),r}async function Wo(e,t,n,r,i){let a=Uo(e,t,z(r,`cpu.cpuprofile`)),o=!1,s=M(process.execPath,[a],{stdio:`ignore`}),c=setInterval(()=>{let e=zo(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{tn(z(a,`..`),{recursive:!0,force:!0})}catch{}return o}function Go(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(`
52
52
  `)}async function Ko(e,t={}){let{pid:n,cpuProfileSecs:r=15,noInspector:i=!1}=e,a=t.log??(e=>console.log(e)),o=t.discover??wt,s=t.inspect??Tt,c=t.resolveCommand??Dt,l=t.resolveUsage??jt,u=t.collectLsofFn??Bo,d=t.getEndpoints??Ho,f=t.profiler??Wo,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(J.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 ee=new Date().toISOString().replace(/[:.]/g,`-`),b=e.output?e.output:v?z(v,`.ok`,`local`,`diagnostics`,`process-${n}-${ee}`):z(process.cwd(),`ok-diagnose-${n}-${ee}`);try{F(b,{recursive:!0})}catch(e){a(J.default.red(`Cannot create output directory ${b}: ${e.message}`));return}a(J.default.bold(`Diagnosing pid ${n}`)),a(`Output: ${b}`),a(``);let x=(e,t)=>{L(z(b,e),t),a(` wrote ${e}`)},S=c(n),te=l(n);x(`metadata.json`,JSON.stringify({capturedAt:new Date().toISOString(),pid:n,command:S,usage:te,lockInfo:y},null,2)),a(` sampling lsof`);let C=u(n);if(C&&x(`lsof.txt`,C),!i){let e=C?Vo(C).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(J.default.yellow(` SIGUSR1 delivery failed: ${e.message}`))}}if(t&&t.length>0){x(`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,b,e=>t.push(e))?a(` wrote cpu.cpuprofile`):a(J.default.yellow(` CPU profile capture failed`)),t.length>0&&x(`process-stats.jsonl`,`${t.map(e=>JSON.stringify(e)).join(`
53
- `)}\n`);try{x(`stacks.txt`,Go(I(z(b,`cpu.cpuprofile`),`utf-8`)))}catch(e){a(J.default.yellow(` stacks.txt skipped: ${e.message}`))}}}else a(J.default.yellow(` Node inspector unavailable — skipping CPU profile`))}a(``),a(J.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: ${J.default.bold(b)}`)}async function qo(e){let t=kn({input:process.stdin,output:process.stdout});try{return(await t.question(e)).trim()}finally{t.close()}}async function Jo(e){let t=Zt(z(hn(),`ok-bundle-process-`));return await Ko({pid:e,output:t}),t}function Yo(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 Xo(e){let t=e.trim().toLowerCase();return t===`y`||t===`yes`}function Zo(e,t,n){let{summary:r,manifest:i}=t;e(``),e(J.default.bold(`ok diagnose bundle — content summary`)),e(``),e(` Files: ${r.fileCount}`),e(` Total size: ${Yo(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 Qo(e,t={}){let n=t.log??(e=>console.log(e)),r=t.prompt??qo,i=t.runProcessDiagnose??Jo,a=t.now??(()=>new Date),o;if(e.out!==void 0){o=e.out;let t=on(o);if(!P(t))throw Error(`ok diagnose bundle: --out parent directory does not exist: ${t}. Create it first.`)}else{let t=a().toISOString().replace(/[:.]/g,`-`),n=z(e.contentDir,`.ok`,`local`,`diagnostics`);F(n,{recursive:!0}),o=z(n,`bundle-${t}.zip`)}let s;e.pid!==void 0&&(n(J.default.dim(`Running ok diagnose process ${e.pid} into a temp dir`)),s=await i(e.pid));let c=await mo({contentDir:e.contentDir,projectDir:e.projectDir,processDir:s,redact:e.redact===!0,deps:t.collectDeps});try{return c.manifest.serverStatus===`not-running`&&n(J.default.yellow(` server not running — live state unavailable`)),Zo(n,c,o),e.yes!==!0&&!Xo(await r(`Write bundle? [y/N]: `))?(n(J.default.dim(`Aborted; no bundle written.`)),{outputPath:null,declined:!0}):(await ho({collected:c,outputPath:o}),n(J.default.bold(`Bundle: ${o}`)),{outputPath:o,declined:!1})}finally{if(c.cleanup(),s!==void 0)try{tn(s,{recursive:!0,force:!0})}catch{}}}function $o(){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(J.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(J.default.red(`--cpu-profile must be a positive integer`)),process.exit(1)),await Ko({pid:n,cpuProfileSecs:r,output:t.output,noInspector:!t.inspector})}),e.addCommand(Ro()),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(J.default.red(`Invalid --pid '${e.pid}': must be a positive integer`)),process.exit(1)));try{let{loadConfig:n}=await import(`./loader-B0pstK3p.mjs`),{resolveContentDir:r}=await import(`./dist-DE2XTwQ5.mjs`),i=process.cwd(),{config:a}=n(i);await Qo({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(J.default.red(t)),process.exit(1)}}),e}async function es(){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 Lr({message:`Enter OpenAI embeddings API key:`})).trim()}function ts(e){return oe(e)}async function ns(){return(await je()).file?{present:!0,source:`file`}:process.env.OK_EMBEDDINGS_API_KEY?{present:!0,source:`env`}:{present:!1,source:null}}async function rs(e){try{let t=m(ue(e));if(!t||t.port<=0||!y(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 is(){return new t(`set-key`).description(`Store your OpenAI embeddings API key in ~/.ok/secrets.yml`).action(async()=>{let e=await es();if(!e){process.stderr.write(`No key provided.
53
+ `)}\n`);try{x(`stacks.txt`,Go(I(z(b,`cpu.cpuprofile`),`utf-8`)))}catch(e){a(J.default.yellow(` stacks.txt skipped: ${e.message}`))}}}else a(J.default.yellow(` Node inspector unavailable — skipping CPU profile`))}a(``),a(J.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: ${J.default.bold(b)}`)}async function qo(e){let t=kn({input:process.stdin,output:process.stdout});try{return(await t.question(e)).trim()}finally{t.close()}}async function Jo(e){let t=Zt(z(hn(),`ok-bundle-process-`));return await Ko({pid:e,output:t}),t}function Yo(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 Xo(e){let t=e.trim().toLowerCase();return t===`y`||t===`yes`}function Zo(e,t,n){let{summary:r,manifest:i}=t;e(``),e(J.default.bold(`ok diagnose bundle — content summary`)),e(``),e(` Files: ${r.fileCount}`),e(` Total size: ${Yo(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 Qo(e,t={}){let n=t.log??(e=>console.log(e)),r=t.prompt??qo,i=t.runProcessDiagnose??Jo,a=t.now??(()=>new Date),o;if(e.out!==void 0){o=e.out;let t=on(o);if(!P(t))throw Error(`ok diagnose bundle: --out parent directory does not exist: ${t}. Create it first.`)}else{let t=a().toISOString().replace(/[:.]/g,`-`),n=z(e.contentDir,`.ok`,`local`,`diagnostics`);F(n,{recursive:!0}),o=z(n,`bundle-${t}.zip`)}let s;e.pid!==void 0&&(n(J.default.dim(`Running ok diagnose process ${e.pid} into a temp dir`)),s=await i(e.pid));let c=await mo({contentDir:e.contentDir,projectDir:e.projectDir,processDir:s,redact:e.redact===!0,deps:t.collectDeps});try{return c.manifest.serverStatus===`not-running`&&n(J.default.yellow(` server not running — live state unavailable`)),Zo(n,c,o),e.yes!==!0&&!Xo(await r(`Write bundle? [y/N]: `))?(n(J.default.dim(`Aborted; no bundle written.`)),{outputPath:null,declined:!0}):(await ho({collected:c,outputPath:o}),n(J.default.bold(`Bundle: ${o}`)),{outputPath:o,declined:!1})}finally{if(c.cleanup(),s!==void 0)try{tn(s,{recursive:!0,force:!0})}catch{}}}function $o(){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(J.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(J.default.red(`--cpu-profile must be a positive integer`)),process.exit(1)),await Ko({pid:n,cpuProfileSecs:r,output:t.output,noInspector:!t.inspector})}),e.addCommand(Ro()),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(J.default.red(`Invalid --pid '${e.pid}': must be a positive integer`)),process.exit(1)));try{let{loadConfig:n}=await import(`./loader-ZfhORCo_.mjs`),{resolveContentDir:r}=await import(`./dist-RBTJcoMv.mjs`),i=process.cwd(),{config:a}=n(i);await Qo({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(J.default.red(t)),process.exit(1)}}),e}async function es(){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 Lr({message:`Enter OpenAI embeddings API key:`})).trim()}function ts(e){return oe(e)}async function ns(){return(await je()).file?{present:!0,source:`file`}:process.env.OK_EMBEDDINGS_API_KEY?{present:!0,source:`env`}:{present:!1,source:null}}async function rs(e){try{let t=m(ue(e));if(!t||t.port<=0||!y(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 is(){return new t(`set-key`).description(`Store your OpenAI embeddings API key in ~/.ok/secrets.yml`).action(async()=>{let e=await es();if(!e){process.stderr.write(`No key provided.
54
54
  `),process.exitCode=1;return}await Ue().set(e),process.stderr.write(`✓ OpenAI embeddings API key stored in ~/.ok/secrets.yml (0600, this machine only).
55
55
  Now enable it per project — the easiest path is OK Desktop → Settings → This
56
56
  project → Search (a toggle with an egress-confirmation prompt), or run
@@ -70,7 +70,7 @@ project → Search (a toggle with an egress-confirmation prompt), or run
70
70
  `).filter(e=>e.startsWith(`worktree `)).length}catch{return 0}}function bl(e){let t=B(e);for(;;){if(ye(t))return t;let n=on(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 \`${g}\`).`);t=n}}function xl(e){try{let t=new URL(e);return t.protocol===`file:`?yn(t):void 0}catch{return}}async function Sl(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=xl(n[0].uri);return r===void 0&&e.log?.(`single root URI not usable as fs path: ${n[0].uri}`),r}async function Cl(e,t,n,r=bl){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 wl(e){let t=process.stderr,n=e.spawnTimeoutMs??nl(process.env.OK_MCP_SPAWN_TIMEOUT_MS),r=e.envAutoStart??process.env.OK_MCP_AUTOSTART,i=Ft({startupCwd:e.startupCwd,startupConfig:e.startupConfig}),a=new Se({name:se,version:_});Ce(a);let o=Sn(),s={current:{connectionId:o,displayName:o,colorSeed:o}},c=new Map,l=e=>{if(c.has(e))return;let n=xe(e),r=s.current,i=Cs({connectionId:o,displayName:r.displayName,clientName:r.clientInfo?.name??r.displayName,colorSeed:r.colorSeed,resolveWsUrl:async()=>ml({lockDir:n,contentDir:e},``),log:n=>t.write(`[mcp] keepalive[${e}]: ${n}\n`)});c.set(e,i)},u=()=>Sl({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 yl(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 Cl(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 Cl(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 pl({lockDir:xe(a),contentDir:et(o,a),envAutoStart:r,...n===void 0?{}:{timeoutMs:n}});return l(a),s.replace(/\/mcp$/,``)};a.server.oninitialized=()=>{let e=a.server.getClientVersion(),t=Le(e?.name,o);s.current={connectionId:o,clientInfo:e?{name:t,version:e.version}:void 0,displayName:t,colorSeed:t}},he(a,{serverUrl:h,resolveCwd:m,config:i,identityRef:s});let g=new Ds,v=!1,y,ee,b=async()=>{if(v)return;v=!0,y?.stop(),ee?.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)
71
71
  `);let x=!1,S=()=>{x||(x=!0,setTimeout(()=>{t.write(`[mcp] shutdown deadline (5s) reached — forcing exit(1)
72
72
  `),process.exit(1)},5e3).unref(),b().finally(()=>{process.exit(0)}))};if(process.once(`SIGINT`,S),process.once(`SIGTERM`,S),process.stdin.on(`end`,()=>{t.write(`[mcp] stdin end — host disconnected, shutting down
73
- `),S()}),process.stdin.on(`error`,e=>{t.write(`[mcp] stdin error (${e instanceof Error?e.message:String(e)}) — host disconnected, shutting down\n`),S()}),ee=js({getPpid:()=>process.ppid,onHostGone:e=>{t.write(`[mcp] ${e} — shutting down\n`),S()}}),Ms({log:e=>t.write(`${e}\n`),transport:g,process,stdin:process.stdin}),process.platform===`darwin`){let e=As(_l,{realpathSync:en,statInoSync:e=>nn(e).ino,log:e=>t.write(`${e}\n`)});if(e!==void 0){t.write(`[mcp] bundle identity anchor=${e.resolvedPath} inode=${e.inode} version=${_}\n`);let{resolvedPath:n,inode:r}=e;y=ks({detect:()=>Os({bundleAnchorPath:_l,currentInode:r,platform:process.platform,realpath:en,statInode:e=>nn(e).ino}),onReplaced:e=>{t.write(`[mcp] bundle replaced anchor=${n} bootInode=${e.currentInode} onDiskInode=${e.onDiskInode} version=${_} — exiting for host respawn\n`),S()},log:e=>t.write(`[mcp] ${e}\n`)})}}return{close:b}}function Tl(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=nl(process.env.OK_MCP_SPAWN_TIMEOUT_MS);await gl({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=bs(process.env,i,process.platform);if(a.proxy){let e=ys(process.platform,fn(),{existsSync:P});if(e===null)xs({stderr:process.stderr,mode:`fallback-absent`,bundlePath:null,reason:`no installed Open Knowledge.app bundle found`});else try{await Ss({bundlePath:e,argv:process.argv.slice(2),env:process.env,stderr:process.stderr});return}catch(t){xs({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`;xs({stderr:process.stderr,mode:e,bundlePath:null,reason:null})}await wl({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 El(e){let t={...e};return delete t.ELECTRON_RUN_AS_NODE,t}function Dl(e=()=>Bt(Rt())){return{detectBundlePath:()=>e().bundlePath??null,resolveBaseUrl:e=>le({lockDir:ue(e)}).baseUrl,openTarget:e=>{M(`open`,[e],{detached:!0,stdio:`ignore`,env:El(process.env)}).unref()},log:e=>process.stdout.write(`${e}\n`),error:e=>process.stderr.write(`${e}\n`)}}function Ol(e,t,n){let r=B(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}/#/${Pe(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}/#/${qe(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 kl(){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=Ol(e,t,Dl())})}function Al(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-JCxDQckS.mjs`),r=e(),i=process.cwd(),a=et(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 jl(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function Ml(e,t,n=process.cwd()){let r=e.op??`sync`,i=m(ue(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`,...S({kind:`cli`,runtimeVersion:_})},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}`)}jl(e.json,{type:`triggered`,op:r,port:i.port}),e.json||process.stderr.write(`✓ ${r} triggered\n`);return}catch(t){let n=t instanceof Error?t.message:String(t);e.json||process.stderr.write(`Server trigger failed (${n}), running directly\n`)}}e.json||process.stderr.write(`Running ${r} directly (no live server)\n`);let a=w({baseDir:n});if(r===`sync`||r===`pull`){jl(e.json,{type:`step`,step:`pull`});let t=await a.pull();jl(e.json,{type:`pull`,summary:t.summary}),e.json||process.stderr.write(` pull: ${t.summary.changes} changes\n`)}(r===`sync`||r===`push`)&&(jl(e.json,{type:`step`,step:`push`}),await a.push(),jl(e.json,{type:`push`,ok:!0}),e.json||process.stderr.write(` push: ok
73
+ `),S()}),process.stdin.on(`error`,e=>{t.write(`[mcp] stdin error (${e instanceof Error?e.message:String(e)}) — host disconnected, shutting down\n`),S()}),ee=js({getPpid:()=>process.ppid,onHostGone:e=>{t.write(`[mcp] ${e} — shutting down\n`),S()}}),Ms({log:e=>t.write(`${e}\n`),transport:g,process,stdin:process.stdin}),process.platform===`darwin`){let e=As(_l,{realpathSync:en,statInoSync:e=>nn(e).ino,log:e=>t.write(`${e}\n`)});if(e!==void 0){t.write(`[mcp] bundle identity anchor=${e.resolvedPath} inode=${e.inode} version=${_}\n`);let{resolvedPath:n,inode:r}=e;y=ks({detect:()=>Os({bundleAnchorPath:_l,currentInode:r,platform:process.platform,realpath:en,statInode:e=>nn(e).ino}),onReplaced:e=>{t.write(`[mcp] bundle replaced anchor=${n} bootInode=${e.currentInode} onDiskInode=${e.onDiskInode} version=${_} — exiting for host respawn\n`),S()},log:e=>t.write(`[mcp] ${e}\n`)})}}return{close:b}}function Tl(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=nl(process.env.OK_MCP_SPAWN_TIMEOUT_MS);await gl({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=bs(process.env,i,process.platform);if(a.proxy){let e=ys(process.platform,fn(),{existsSync:P});if(e===null)xs({stderr:process.stderr,mode:`fallback-absent`,bundlePath:null,reason:`no installed Open Knowledge.app bundle found`});else try{await Ss({bundlePath:e,argv:process.argv.slice(2),env:process.env,stderr:process.stderr});return}catch(t){xs({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`;xs({stderr:process.stderr,mode:e,bundlePath:null,reason:null})}await wl({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 El(e){let t={...e};return delete t.ELECTRON_RUN_AS_NODE,t}function Dl(e=()=>Bt(Rt())){return{detectBundlePath:()=>e().bundlePath??null,resolveBaseUrl:e=>le({lockDir:ue(e)}).baseUrl,openTarget:e=>{M(`open`,[e],{detached:!0,stdio:`ignore`,env:El(process.env)}).unref()},log:e=>process.stdout.write(`${e}\n`),error:e=>process.stderr.write(`${e}\n`)}}function Ol(e,t,n){let r=B(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}/#/${Pe(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}/#/${qe(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 kl(){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=Ol(e,t,Dl())})}function Al(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-PK3dPbxr.mjs`),r=e(),i=process.cwd(),a=et(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 jl(e,t){e&&process.stdout.write(`${JSON.stringify(t)}\n`)}async function Ml(e,t,n=process.cwd()){let r=e.op??`sync`,i=m(ue(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`,...S({kind:`cli`,runtimeVersion:_})},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}`)}jl(e.json,{type:`triggered`,op:r,port:i.port}),e.json||process.stderr.write(`✓ ${r} triggered\n`);return}catch(t){let n=t instanceof Error?t.message:String(t);e.json||process.stderr.write(`Server trigger failed (${n}), running directly\n`)}}e.json||process.stderr.write(`Running ${r} directly (no live server)\n`);let a=w({baseDir:n});if(r===`sync`||r===`pull`){jl(e.json,{type:`step`,step:`pull`});let t=await a.pull();jl(e.json,{type:`pull`,summary:t.summary}),e.json||process.stderr.write(` pull: ${t.summary.changes} changes\n`)}(r===`sync`||r===`push`)&&(jl(e.json,{type:`step`,step:`push`}),await a.push(),jl(e.json,{type:`push`,ok:!0}),e.json||process.stderr.write(` push: ok
74
74
  `)),jl(e.json,{type:`complete`,op:r}),e.json||process.stderr.write(`✓ ${r} complete\n`)}function Nl(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 Ml({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 Pl(e){return new t(`pull`).description(`Pull changes from the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await Ml({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 Fl(e){return new t(`push`).description(`Push commits to the remote`).option(`--json`,`Output JSONL progress events`,!1).action(async t=>{try{await Ml({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 Il(e){return typeof e==`string`&&ve.includes(e)}async function Ll(e={}){let t=B(e.cwd??process.cwd()),n=e.pack??`knowledge-base`;if(!De[n])return{status:`failed`,message:`${k(`Error:`)} Unknown pack "${n}". Available: ${ve.join(`, `)}`,exitCode:1};let r;try{r=await Ye({projectDir:t,rootDir:e.root,packId:n})}catch(e){return e instanceof Ke?{status:`prerequisite-missing`,message:`${k(`Error:`)} ${e.message}`,exitCode:1}:{status:`failed`,message:`${k(`Error:`)} ${e instanceof Error?e.message:String(e)}`,exitCode:1}}if(r.created.length===0){let e=De[n].name;return{status:`no-op`,message:`${O(`Your ${e} pack is already seeded.`)}\n${D(`Nothing to do.`)}`,plan:r,exitCode:0}}if(e.dryRun)return{status:`dry-run`,message:`${j(`Plan (dry-run — no changes made):`)}\n\n${zl(r,t)}`,plan:r,exitCode:0};if(!e.yes&&!await Bl(`${j(`Plan:`)}\n\n${zl(r,t)}\n\n${j(`Apply?`)} ${D(`[Y/n] `)}`,e.confirmStream))return{status:`cancelled`,message:D(`Cancelled.`),plan:r,exitCode:0};let i=await Be(r,{projectDir:t,packId:n});if(i.errors.length>0){let e=i.errors.map(e=>` ${k(`✗`)} ${e.path}: ${e.error}`);return{status:`failed`,message:[`${A(`Applied`)} ${i.applied} entries, ${A(String(i.errors.length))} error(s):`,...e].join(`
75
75
  `),plan:r,exitCode:1}}let a=De[n].name,o=i.packSkillsInstalled.length>0?`\n${D(`Installed the ${a} skill for: ${i.packSkillsInstalled.join(`, `)}`)}`:``;return{status:`applied`,message:`${O(`✓ Seeded ${a}`)} ${D(`(${i.applied} entries, ${i.durationMs}ms)`)}${o}`,plan:r,exitCode:0}}function Rl(){let e=[j(`Available packs:`)];for(let t of ve){let n=De[t];e.push(` ${O(t)} ${D(`—`)} ${n.name}: ${n.description}`)}return e.join(`
76
76
  `)}function zl(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(j(`Folders to create:`));for(let e of r)n.push(` ${O(`+`)} ${E(sn(t,B(t,e.path))||e.path)}${D(`/`)}`)}if(i.length>0){n.length>0&&n.push(``),n.push(j(`Files to create:`));for(let e of i)n.push(` ${O(`+`)} ${E(sn(t,B(t,e.path))||e.path)}`)}if(e.skipped.length>0){n.length>0&&n.push(``),n.push(D(`Already present (skipped):`));for(let t of e.skipped)n.push(` ${D(`· ${t.path} (${t.reason})`)}`)}if(e.warnings.length>0){n.length>0&&n.push(``),n.push(A(`Warnings:`));for(let t of e.warnings)n.push(` ${A(`!`)} ${t}`)}return n.join(`
@@ -79,7 +79,7 @@ project → Search (a toggle with an egress-confirmation prompt), or run
79
79
  `);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 Wl(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 Ul(t,await e())})}async function Gl(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 Kl(e,t){let{host:n,json:r}=e;H(n);let i=await Ni(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 Gl(new K({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 ql(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 Kl(t,await e())})}function Jl(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(`
80
80
  `)??``}\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 Yl(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 Xl(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 Zl(e,t){return(await e.users.getAuthenticated()).data.login.toLowerCase()===t.toLowerCase()?`user`:`org`}function Ql(e){return w({baseDir:e,unsafe:{allowUnsafeCredentialHelper:!0}}).env({GIT_TERMINAL_PROMPT:`0`})}function $l(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 eu={ensureOkScaffold:e=>{me(e)},gitFactory:Ql};async function tu(e){let t={...eu,...e.deps},n=B(e.projectDir),r;if(e.ownerKind)r=e.ownerKind;else try{r=await Zl(e.octokit,e.body.owner)}catch(e){return{kind:`error`,code:Jl(e)}}try{t.ensureOkScaffold(n)}catch{return{kind:`error`,code:`init-failed`}}let i=t.gitFactory(n);if(!P(z(n,`.git`)))try{await i.init()}catch{return{kind:`error`,code:`init-failed`}}let a;try{a=await Yl({octokit:e.octokit,ownerLogin:e.body.owner,ownerKind:r,name:e.body.name,visibility:e.body.visibility,description:e.body.description})}catch(t){if(Jl(t)===`name-conflict`){let t=await Xl(e.octokit,e.body.owner,e.body.name);if(t===null)return{kind:`error`,code:`name-conflict`};a=t}else return{kind:`error`,code:Jl(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=$l(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 nu(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 ru(e,t){let{host:n,owner:r,name:i,visibility:a,description:o,projectDir:s,json:c}=e;H(n);let l=await Ni(n,t);if(l==null){nu(c,{kind:`error`,code:`auth-required`});return}let u=n===`github.com`?void 0:`https://${n}/api/v3`,d=new K({auth:l,...u?{baseUrl:u}:{}});try{Gt(`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`}nu(c,await tu({octokit:d,token:l,projectDir:s,body:{owner:r,name:i,visibility:a,description:o}}))}function iu(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'
81
81
  `),process.exit(1)),await ru(t,await e())})}function au(){let e=new t(`share`);e.description(`Sharing flow operations (owners, name-check, publish)`);let n=()=>ne();return e.addCommand(ql(n)),e.addCommand(Wl(n)),e.addCommand(iu(n)),e}function ou(){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=B(e.project??process.cwd()),n=gt(t),r=ot(t,at(t));if(r.kind===`no-exclude`){su(e.json,t,r.reason);return}let i=gt(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(`${E(`Sharing mode is already`)} ${j(`shared`)} ${E(`— nothing to do.`)}\n`);return}process.stderr.write(`${O(`✓`)} ${j(`Sharing mode set to`)} ${O(`shared`)}\n`),process.stderr.write(` Removed OK paths from ${j(`.git/info/exclude`)}; commit the files to share with teammates.\n`)})}function su(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(`${A({"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 cu(){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=B(e.project??process.cwd()),n=gt(t),r=[...ht(t)],i=xt(t,at(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: ${lu(n)}`),a.push(``),a.push(`Excluded from git via ${j(`.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: ${E(n===`local-only`?`ok config-sharing share`:`ok config-sharing unshare`)}`),process.stdout.write(`${a.join(`
82
- `)}\n`)})}function lu(e){switch(e){case`shared`:return O(`shared`);case`local-only`:return O(`local-only`);case`no-git`:return A(`no-git (not a git repository)`)}}function uu(){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=B(e.project??process.cwd()),n=vt(t,at(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`){du(e.json,t,n.reason);return}let r=gt(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(`${j(`Sharing mode is already`)} ${O(`local-only`)} ${j(`— nothing to do.`)}\n`);return}process.stderr.write(`${O(`✓`)} ${j(`Sharing mode set to`)} ${O(`local-only`)}\n`),process.stderr.write(` Added ${n.appended.length} path(s) to ${j(`.git/info/exclude`)} (per-clone, not committed).\n`)})}function du(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(`${A({"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 fu(){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(ou()),e.addCommand(uu()),e.addCommand(cu()),e}const pu=new Set([`--cwd`,`--log-level`]);function mu(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(`-`)){pu.has(a)&&i++;continue}t.push(a)}}return{operands:t,cwd:n,sawTerminalFlag:r}}function hu(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 gu(e){return/\.(md|mdx)$/i.test(e)}function _u(e){let t={...e};return delete t.ELECTRON_RUN_AS_NODE,t}function vu(e=()=>Bt(Rt())){return{prepare:$e,detectBundlePath:()=>e().bundlePath??null,openTarget:e=>{M(`open`,[e],{detached:!0,stdio:`ignore`,env:_u(process.env)}).unref()},runProjectOpen:(e,t)=>Ol(e,{project:t},Dl()),runBrowserOpen:e=>xu(e),log:e=>process.stdout.write(`${e}\n`),error:e=>process.stderr.write(`${e}\n`)}}async function yu(e,t){let n;try{n=t.prepare(e)}catch(e){if(e instanceof Re||e instanceof We||e instanceof Me)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 bu(){let e=import.meta.dirname??new URL(`.`,import.meta.url).pathname;return[B(e,`public`),B(e,`../../app/dist`),B(e,`../../../app/dist`)].find(e=>P(e))}async function xu(e){let{createEphemeralProjectDir:t}=await import(`./dist-DE2XTwQ5.mjs`),{loadConfig:n}=await import(`./index.mjs`),{bootStartServer:r,resolveHost:i}=await import(`./start-BonMCOoj.mjs`),{openBrowser:a}=await import(`./open-browser-DHTbHSqx.mjs`),o=bu();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 bn(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}/#/${qe(e.docName)}`;process.stdout.write(`Opening ${e.singleDocRelPath} in your browser: ${m}\n`),process.stdout.write(`Press Ctrl-C to close the session.
82
+ `)}\n`)})}function lu(e){switch(e){case`shared`:return O(`shared`);case`local-only`:return O(`local-only`);case`no-git`:return A(`no-git (not a git repository)`)}}function uu(){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=B(e.project??process.cwd()),n=vt(t,at(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`){du(e.json,t,n.reason);return}let r=gt(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(`${j(`Sharing mode is already`)} ${O(`local-only`)} ${j(`— nothing to do.`)}\n`);return}process.stderr.write(`${O(`✓`)} ${j(`Sharing mode set to`)} ${O(`local-only`)}\n`),process.stderr.write(` Added ${n.appended.length} path(s) to ${j(`.git/info/exclude`)} (per-clone, not committed).\n`)})}function du(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(`${A({"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 fu(){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(ou()),e.addCommand(uu()),e.addCommand(cu()),e}const pu=new Set([`--cwd`,`--log-level`]);function mu(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(`-`)){pu.has(a)&&i++;continue}t.push(a)}}return{operands:t,cwd:n,sawTerminalFlag:r}}function hu(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 gu(e){return/\.(md|mdx)$/i.test(e)}function _u(e){let t={...e};return delete t.ELECTRON_RUN_AS_NODE,t}function vu(e=()=>Bt(Rt())){return{prepare:$e,detectBundlePath:()=>e().bundlePath??null,openTarget:e=>{M(`open`,[e],{detached:!0,stdio:`ignore`,env:_u(process.env)}).unref()},runProjectOpen:(e,t)=>Ol(e,{project:t},Dl()),runBrowserOpen:e=>xu(e),log:e=>process.stdout.write(`${e}\n`),error:e=>process.stderr.write(`${e}\n`)}}async function yu(e,t){let n;try{n=t.prepare(e)}catch(e){if(e instanceof Re||e instanceof We||e instanceof Me)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 bu(){let e=import.meta.dirname??new URL(`.`,import.meta.url).pathname;return[B(e,`public`),B(e,`../../app/dist`),B(e,`../../../app/dist`)].find(e=>P(e))}async function xu(e){let{createEphemeralProjectDir:t}=await import(`./dist-RBTJcoMv.mjs`),{loadConfig:n}=await import(`./index.mjs`),{bootStartServer:r,resolveHost:i}=await import(`./start-Cru3uCN4.mjs`),{openBrowser:a}=await import(`./open-browser-DHTbHSqx.mjs`),o=bu();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 bn(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}/#/${qe(e.docName)}`;process.stdout.write(`Opening ${e.singleDocRelPath} in your browser: ${m}\n`),process.stdout.write(`Press Ctrl-C to close the session.
83
83
  `),a(m),await new Promise(()=>{})}function Su(e,t){return{server:Cu(`server`,e),ui:Cu(`ui`,t)}}function Cu(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 wu(e){return`${Tu(e.server)}\n${Tu(e.ui)}`}function Tu(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 Eu(e){let t=e.inspect??(t=>Tt(e.lockDir,t)),n=e.log??(e=>console.log(e)),r=Su(t(`server`),t(`ui`));return e.json?n(JSON.stringify(r,null,2)):n(wu(r)),r}function Du(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(),Eu({lockDir:ue(process.cwd()),json:t.json===!0})})}function Ou(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(`
84
84
  `)}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 $,ku;function Au(){return ku}Q.name(`open-knowledge`).description(`Local-first knowledge base with CRDT collaboration`).usage(`[options] [file | command]`).version(Ou(Mt)).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=kt(n,process.cwd());r!==null&&(Ct(process.cwd()),process.chdir(r),console.error(`[ok] Using Open Knowledge project at ${r}`));let{config:i}=Pt(r??t);$=i;let a=e.args?.[0]??e.name()??`cli`;ku=Ee({name:`cli`,project:i.project?.name??void 0}),ku.info({command:a,cwd:process.cwd()},`cli command started`)}),Q.action(async()=>{if(Bt(Rt()).available){It({spawn:M});return}await zt($,{})});const ju=Lt(()=>$);Q.addCommand(ju);const Mu=Tl(()=>$);Q.addCommand(Mu),Q.addCommand(yt()),Q.addCommand(Vl()),Q.addCommand(gs()),Q.addCommand(Ut());const Nu=Al(()=>$);Q.addCommand(Nu);const Pu=bt(()=>$);Q.addCommand(Pu),Q.addCommand(kl()),Q.addCommand(Et(()=>$)),Q.addCommand(ra(()=>$)),Q.addCommand(Du(()=>$)),Q.addCommand(At()),Q.addCommand($o()),Q.addCommand(ea()),Q.addCommand(Ca()),Q.addCommand(Hi(Au)),Q.addCommand(cs()),Q.addCommand(ha(()=>$)),Q.addCommand(Nl(()=>$)),Q.addCommand(Fl(()=>$)),Q.addCommand(Pl(()=>$)),Q.addCommand(au()),Q.addCommand(fu()),Q.addHelpText(`after`,`
85
85
  Examples:
@@ -0,0 +1,2 @@
1
+ import"./server-lock-BpjJj3OD-CqSr5wlA.mjs";var e=`0.15.1-beta.0`;const t=`config.yml`,n=e;export{n,t};
2
+ //# sourceMappingURL=constants-OuLu8AdA.mjs.map
@@ -1812,6 +1812,8 @@ You already confirmed the decision at the STOP gate at the top of this workflow.
1812
1812
 
1813
1813
  ### 3. Write the canonical article
1814
1814
 
1815
+ **Persist as you go (MUST).** For a large consolidation drawing on several research docs, create the article skeleton — frontmatter + the headings below — first, then \`edit\` each section in as you finish it; don't hold the whole synthesis in context for one final write. A rate limit or crash mid-synthesis then costs you one section, not the entire article. (The OK skill's §Writing carries this rule for all long-running work: the knowledge base is your checkpoint.)
1816
+
1815
1817
  Save inside the content directory (\`${t}\`). Path convention depends on the project:
1816
1818
 
1817
1819
  - If the project uses the three-tier lifecycle (external-sources → research → articles), save under an \`articles/\` folder relative to the content dir, grouped by topic subfolder when the area is broad (e.g., \`articles/editor/crdt-architecture.md\`)
@@ -2502,6 +2504,17 @@ Research articles default to **3P/external framing** — investigating third-par
2502
2504
 
2503
2505
  ---
2504
2506
 
2507
+ ## Persist as you go — the article IS your checkpoint
2508
+
2509
+ ⛔ **PERSIST AS YOU GO — crash-safe checkpoint rule.** The single most expensive failure this workflow has produced is completed research lost to a mid-session rate limit or crash — analysis held in context, never written, discarded when the session died. The user paid for work that vanished. The knowledge base is the checkpoint; two rules make every step crash-safe:
2510
+
2511
+ - **\`ingest\` each source the moment you fetch it (Step 3), one at a time** — never fetch all sources and ingest them in a trailing batch. An ingested source survives a crash; a fetched-but-unwritten one does not.
2512
+ - **Create the article skeleton early and fill it section-by-section as you read (Steps 4–5), not in one final write at the end.** After you analyze each source, \`edit\` its findings into the article before moving to the next. A crash after reading five of eight sources then leaves five sections safely in the KB; you resume by reading the partial article back, not by re-running the whole sweep.
2513
+
2514
+ Structured notes that live only in your context are not persisted work. If a finding is worth keeping, it belongs in an ingested source or in the article — written, not held.
2515
+
2516
+ ---
2517
+
2505
2518
  ## Step 0: Create workflow checkpoint tasks
2506
2519
 
2507
2520
  ⛔ **ALWAYS THE FIRST ACTION.** Before any read, any scan, any fetch — create tasks. They persist across context compaction, make skipped steps immediately visible, and show progress to the user.
@@ -2644,6 +2657,8 @@ Take structured notes:
2644
2657
  - **Unknowns** and open questions — the boundary of what you know
2645
2658
  - **Relevance** to the specific decision at hand
2646
2659
 
2660
+ **Write these notes into the article as you take them, not after (MUST — see *Persist as you go* above).** Create the article skeleton — frontmatter + the Step 5 section headings — before you start reading, then \`edit\` each source's findings into the relevant section the moment you finish analyzing it. The "notes" ARE the article's Findings section in progress; don't hold them in context to transcribe in one pass at Step 5. A rate limit between here and Step 5 must not be able to discard analysis you've already done. By the time you reach Step 5 the article is mostly written, and Step 5 becomes finalize-and-polish.
2661
+
2647
2662
  ### Grounding discipline
2648
2663
 
2649
2664
  Every factual claim in the article must cite its source inline. No unsourced speculation. If you don't have evidence: (a) run another search and cite it, (b) mark inline \`(TODO: needs source)\`, or (c) don't write the claim. Never fabricate.
@@ -2652,6 +2667,8 @@ Every factual claim in the article must cite its source inline. No unsourced spe
2652
2667
 
2653
2668
  ## Step 5: Write the research article (Path A only)
2654
2669
 
2670
+ If you followed *Persist as you go*, the article already exists and is substantially filled from Step 4 — this step **finalizes** it (fill any remaining sections, tighten the recommendation, run the structure + validation checks below) rather than writing from a blank doc. **If it does not exist or is thin, and you are resuming after an interruption: \`exec("cat <path>")\` the partial article back first and fill only the missing sections** — and note that any Step 4 analysis that was never written to the KB was lost when the session broke, so re-derive only what's actually missing. Creating the doc from scratch here means the incremental rule was skipped; that's the failure mode, not the happy path.
2671
+
2655
2672
  Save a markdown document inside the content directory. Path convention:
2656
2673
 
2657
2674
  - If the project adopted the three-tier lifecycle (external-sources → research → articles), save under \`<content-dir>/research/<slug>.md\`.
@@ -2829,4 +2846,4 @@ In headless mode, write the recap into the research article's "Further reading"
2829
2846
  `))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-BxYBJc_v.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(`
2830
2847
  `).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/
2831
2848
  `,`utf-8`),t}export{STARTER_TEMPLATES as $,writeConfigPatch as $i,isSelfWrite as $n,runDeviceFlowSubprocess as $r,createOsProbe as $t,LIVE_DERIVED_INDEX_DEBOUNCE_MS as A,tracedWriteFile as Ai,getMetrics as An,reconcile as Ar,clearContributors as At,OBSERVER_SYNC_ORIGIN as B,writeStateManifest as Bi,initToleranceTelemetryWriter as Bn,resolveCursorBinaryDefault as Br,countShadowObjects as Bt,GIT_UPSTREAM_WRITER as C,tracedMkdir as Ci,gcCheckpointRefs as Cn,readProjectLocalSemanticConfig as Cr,buildExecResult as Ct,HocuspocusAuthRejection as D,tracedRmSync as Di,getLogger as Dn,readTargetRecordedAt as Dr,classifyEvents as Dt,HOCUSPOCUS_AUTH_REJECTION_REASONS as E,tracedRenameSync as Ei,getLogFilePath as En,readStateManifest as Er,buildWipTree as Et,MCP_SERVER_NAME as F,validateCloneInputs as Fi,incrementCollabSocketFilteredError as Fn,releaseUiLock as Fr,commitWipFromTree as Ft,ROLLBACK_ORIGIN as G,LATEST_PROTOCOL_VERSION as Gi,isAllowedWorkspaceHostHeader as Gn,resolveUiInfo as Gr,createContentFilter as Gt,PANE_TARGET_TTL_MS as H,writeTracker as Hi,installTestLoggers as Hn,resolveLockDir as Hr,countWipRefs as Ht,MIN_GIT_VERSION as I,validateSkillZip as Ii,incrementServerObserverFire as In,removeLastKnownHash as Ir,compareSemver as It,SKILL_INSTALL_EVENTS_FILE_REL as J,isJSONRPCResultResponse as Ji,isKnownPackId as Jn,rewriteMarkdownLinksForDocumentRename as Jr,createEphemeralProjectDir as Jt,ROOT_GITIGNORE_TEMPLATE as K,isInitializedNotification as Ki,isConfigDoc as Kn,restoreContributors as Kr,createContentFilterAsync as Kt,MISSING_OK_CONFIG_MESSAGE as L,withSpan as Li,initContent as Ln,resetMetrics as Lr,containsConflictMarkers as Lt,MANAGED_RENAME_ORIGIN as M,updateLastKnownHash as Mi,handleCollabSocketError as Mn,recordSkillInstallEvent as Mr,coercePackId as Mt,MAX_AGENT_SESSIONS as N,updateUiLockPort as Ni,handleSpawnCursor as Nn,registerAllTools as Nr,commitUpstreamImport as Nt,HocuspocusAuthTokenSchema as O,tracedRmdirSync as Oi,getLogsDir as On,readTargetVersion as Or,classifyFsPath as Ot,MCP_CONNECTION_ID_HEADER as P,validateAgentId as Pi,hasGcLogLatch as Pn,registerWrite as Pr,commitWip as Pt,STARTER_PACK_IDS as Q,withFileLockSync as Qi,isProjectRoot as Qn,runCloneSubprocess as Qr,createMcpHttpHandler as Qt,McpLogger as R,withSpanSync as Ri,initShadowRepo as Rn,resolveBundledSkillDir as Rr,contentHash as Rt,GIT_PREFLIGHT_FAIL_SPAN_NAME as S,tracedLinkSync as Si,formatContributorsFrom as Sn,readBranchFromHead as Sr,buildConfigYmlContent as St,GitTooOldError as T,tracedRename as Ti,getLocalDir as Tn,readSkillInstallStateSnapshot as Tr,buildStarterFolderFrontmatterYaml as Tt,PinoLogger as U,McpServer as Ui,installUserSkill as Un,resolvePack as Ur,createApiExtension as Ut,OK_OKIGNORE_TEMPLATE as V,writeTargetVersion as Vi,installPrettyZodErrors as Vn,resolveCursorSpawnInvocation as Vr,countStaleAgentWipRefs as Vt,ProjectGitInitError as W,JSONRPCMessageSchema as Wi,isAllowedApiOrigin as Wn,resolvePackageVersion as Wr,createAssetServeMiddleware as Wt,STARTER_FOLDER_FRONTMATTER_FILENAME as X,readConfigSafely as Xi,isPairedWriteOrigin as Xn,runAuthReposSubprocess as Xr,createFileLogger as Xt,STARTER_FOLDERS as Y,atomicWriteFileSync as Yi,isLoopbackAddress as Yn,rewriteWikiLinksForDocumentRename as Yr,createExternalChangeHandler as Yt,STARTER_PACKS as Z,resolveConfigPath as Zi,isPathWithinDir as Zn,runAuthStatusSubprocess as Zr,createLiveDerivedIndexExtension as Zt,DEFAULT_PACK_ID as _,streamingProblemEvent as _i,findEnclosingGitRoot as _n,pathToDocName as _r,assertGitAvailable as _t,AgentPresenceBroadcaster as a,saveInMemoryCheckpoint as ai,describeStoredEmbeddingsKey as an,loadPrincipal as ar,SingleFileNotMarkdownError as at,FILE_WATCHER_ORIGIN as b,toBroadcasterKey as bi,formatAuthRejectionWire as bn,readAllTargets as br,bootServer as bt,AutoStartDisabledError as c,serializeError as ci,detectProjectShape as cn,logsPreviousPath as cr,UiLockCollisionError as ct,CONFIG_FILENAME as d,shutdownTelemetry as di,encodeFolderRoute as dn,normalizeFsPath as dr,acquireUiLock as dt,GitDirAccessError as ea,runWithMcpLogger as ei,createPersistenceExtension as en,isSystemDoc as er,STATE_MANIFEST_FILENAME as et,CONFLICT_MARKER_RE as f,spansCurrentPath as fi,ensureProjectGit as fn,packageVersionMajorMinor as fr,applyAgentMarkdownWrite as ft,DEFAULT_EMBEDDINGS_DIMENSIONS as g,startWatcher as gi,fallbackPaths as gn,parseKeepaliveConnectionId as gr,assertCompatibleStateManifest as gt,DEFAULT_CHECKPOINT_RETENTION as h,splitMarkdownBlocks as hi,extractWikiLinksFromMarkdown as hn,parseHocuspocusAuthToken as hr,armPaneTarget as ht,AgentFocusBroadcaster as i,resolveShadowDir as ia,sanitizeClientName as ii,createTestLogger as in,listStarterPacks as ir,SingleFileNotFoundError as it,LOG_MD_TEMPLATE as j,tracedWriteFileSync as ji,getTracer as jn,recordContributor as jr,clearEmbeddingsKeyFromAllBackends as jt,INSTALLED_AGENTS_SCHEMES as k,tracedUnlinkSync as ki,getMeter as kn,readUiLock as kr,clearArmedPaneTarget as kt,BacklinkIndex as l,setActiveSpanAttributes as li,emitPreflightFailureSpan as ln,makeLazyEmbeddingsKeyStore as lr,__getShowAllWalkStatsForTesting as lt,ConfigSchema as m,spawnDetached as mi,evictStaleTrackerEntries as mn,parseGitVersion as mr,applySeed as mt,AGENT_ID_RE as n,parseCheckpoint as na,safeSubdir as ni,createServerObserverExtension as nn,lastKnownHash as nr,SeedRootDirError as nt,AgentSessionCapacityError as o,saveVersion as oi,detectClaudeDesktopPresence as on,loggerFactory as or,StateManifestError as ot,CURSOR_BUNDLE_PATHS_BY_PLATFORM as p,spansPreviousPath as pi,errorResponse as pn,parseAuthRejectionWire as pr,applyExternalChange as pt,SERVICE_WRITER as q,isJSONRPCRequest as qi,isHocuspocusAuthRejectionReason as qn,restoreLifecycleFromConflictsJson as qr,createEmbeddingsSecretStore as qt,AGENT_WRITE_ORIGIN as r,resolveGitDirDetailed as ra,safetyCheckpoint as ri,createStreamingErrorWriter as rn,listRescueCheckpoints as rr,SingleFileNotAFileError as rt,AgentSessionManager as s,seedBasenameIndex as si,detectGit as sn,logsCurrentPath as sr,TagIndex as st,AGENT_ID_MAX_LEN as t,MalformedGitPointerError as ta,safeContentPath as ti,createServer$1 as tn,isToleranceTelemetryEnabled as tr,SeedPrerequisiteError as tt,CC1Broadcaster as u,shadowGit as ui,encodeDocName as un,mountMcpAndApi as ur,__resetShowAllWalkStatsForTesting as ut,EMBEDDINGS_API_KEY_ENV as v,swapContributors as vi,findEnclosingProjectRoot as vn,planSeed as vr,assertNeverDiskEvent as vt,GitNotAvailableError as w,tracedMkdirSync as wi,getCurrentMcpLogger as wn,readServerPackageVersion as wr,buildSkillZip as wt,FileEmbeddingsBackend as x,tracedAppendFileSync as xi,formatContributors as xn,readArmedPaneTarget as xr,buildAndOpenSkill as xt,FILE_SYSTEM_WRITER as y,teardownToleranceTelemetryWriter as yi,flushFileLogger as yn,prepareSingleFileOpen as yr,attachIdleShutdown as yt,MissingOkConfigError as z,writeRootGitignoreForNewRepo as zi,initTelemetry as zn,resolveContentDir as zr,contributorCount as zt};
2832
- //# sourceMappingURL=dist-BWV2MusQ.mjs.map
2849
+ //# sourceMappingURL=dist-BEh-GNLZ.mjs.map
@@ -1 +1 @@
1
- import{J as e,Sr as t,Ur as n,a as r,an as i,c as a,d as o,f as s,g as c,h as l,i as u,l as d,m as f,n as p,o as m,p as h,qr as g,r as _,s as v,t as y,tn as b,u as x,vn as S,xn as C,zt as w}from"./server-lock-BpjJj3OD-CqSr5wlA.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,Un as vt,Ur as yt,Ut as bt,V as xt,Vi as St,Vn as Ct,Vr as wt,Vt as Tt,W as Et,Wn as Dt,Wr as Ot,Wt as kt,X as At,Xn as jt,Xr as Mt,Xt as Nt,Y as Pt,Yn as Ft,Yr as It,Yt as Lt,Z as Rt,Zn as zt,Zr as Bt,Zt as Vt,_ as Ht,_i as Ut,_n as Wt,_r as Gt,_t as Kt,a as qt,ai as Jt,an as Yt,ar as Xt,at as Zt,b as Qt,bi as $t,bn as en,br as tn,bt as nn,c as rn,ci as an,cn as on,cr as sn,ct as cn,d as ln,di as un,dn,dr as fn,dt as pn,ea 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,ni as or,nn as sr,nr as cr,nt as lr,o as ur,oi as dr,on as fr,or as pr,ot as mr,p as hr,pi as gr,pn as _r,pr as vr,pt as yr,q as br,qn as xr,qr as Sr,qt as Cr,r as wr,ri as Tr,rn as Er,rr as Dr,rt as Or,s as kr,si as Ar,sn as jr,sr as Mr,st as Nr,t as Pr,ta as Fr,ti as Ir,tn as Lr,tr as Rr,tt as zr,u as Br,ui as Vr,un as Hr,ur as Ur,ut as Wr,v as Gr,vi as Kr,vn as qr,vr as Jr,vt as Yr,w as Xr,wi as Zr,wn as Qr,wr as $r,wt as ei,x as ti,xi as ni,xn as ri,xr as ii,xt as ai,y as oi,yi as si,yn as ci,yr as li,yt as ui,z as di,zi as fi,zn as pi,zr as mi,zt as hi}from"./dist-BWV2MusQ.mjs";export{Pr as AGENT_ID_MAX_LEN,ar as AGENT_ID_RE,wr as AGENT_WRITE_ORIGIN,Pn as AgentFocusBroadcaster,qt as AgentPresenceBroadcaster,ur as AgentSessionCapacityError,kr as AgentSessionManager,rn as AutoStartDisabledError,Yn as BacklinkIndex,Br as CC1Broadcaster,e as CC1_CONTRACT_VERSION,ln as CONFIG_FILENAME,yn as CONFLICT_MARKER_RE,hr as CURSOR_BUNDLE_PATHS_BY_PLATFORM,er as ConfigSchema,kn as DEFAULT_CHECKPOINT_RETENTION,wn as DEFAULT_EMBEDDINGS_DIMENSIONS,Ht as DEFAULT_PACK_ID,Gr as EMBEDDINGS_API_KEY_ENV,oi as FILE_SYSTEM_WRITER,Qt as FILE_WATCHER_ORIGIN,ti as FileEmbeddingsBackend,st as GIT_PREFLIGHT_FAIL_SPAN_NAME,z as GIT_UPSTREAM_WRITER,mn as GitDirAccessError,Xr 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,Fr as MalformedGitPointerError,nt as McpLogger,di as MissingOkConfigError,P as OBSERVER_SYNC_ORIGIN,xt as OK_OKIGNORE_TEMPLATE,b as ORPHAN_MODES,le as PANE_TARGET_TTL_MS,i as PROTOCOL_VERSION,_t as PinoLogger,y as ProcessLockCollisionError,Et as ProjectGitInitError,ae as ROLLBACK_ORIGIN,Ce as ROOT_GITIGNORE_TEMPLATE,p as RUNTIME_VERSION,br as SERVICE_WRITER,ye as SKILL_INSTALL_EVENTS_FILE_REL,S as SKILL_STATE_TARGETS,Pt as STARTER_FOLDERS,At as STARTER_FOLDER_FRONTMATTER_FILENAME,Rt as STARTER_PACKS,Qe as STARTER_PACK_IDS,T as STARTER_TEMPLATES,vn as STATE_MANIFEST_FILENAME,_ as STATE_SCHEMA_VERSION,C as SYSTEM_DOC_NAME,zr as SeedPrerequisiteError,lr as SeedRootDirError,u as ServerLockCollisionError,Or as SingleFileNotAFileError,Rn as SingleFileNotFoundError,Zt as SingleFileNotMarkdownError,mr as StateManifestError,Nr as TagIndex,cn as UiLockCollisionError,$n as __getShowAllWalkStatsForTesting,Wr as __resetShowAllWalkStatsForTesting,r as acquireProcessLock,m as acquireServerLock,pn as acquireUiLock,Cn as applyAgentMarkdownWrite,yr as applyExternalChange,ir as applySeed,Nn as armPaneTarget,On as assertCompatibleStateManifest,Kt as assertGitAvailable,Yr as assertNeverDiskEvent,ui as attachIdleShutdown,nn as bootServer,ai as buildAndOpenSkill,dt as buildConfigYmlContent,U as buildExecResult,ei 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,t as colorFromSeed,Ve as commitUpstreamImport,Ze as commitWip,ie as commitWipFromTree,ve as compareSemver,je as containsConflictMarkers,ot as contentHash,hi as contributorCount,R as countShadowObjects,Tt as countStaleAgentWipRefs,pe as countWipRefs,bt as createApiExtension,kt as createAssetServeMiddleware,ce as createContentFilter,Ee as createContentFilterAsync,Cr as createEmbeddingsSecretStore,Se as createEphemeralProjectDir,Lt as createExternalChangeHandler,Nt as createFileLogger,Vt as createLiveDerivedIndexExtension,tt as createMcpHttpHandler,O as createOsProbe,gn as createPersistenceExtension,Lr as createServer,sr as createServerObserverExtension,Er as createStreamingErrorWriter,In as createTestLogger,Yt as describeStoredEmbeddingsKey,fr as detectClaudeDesktopPresence,jr as detectGit,on as detectProjectShape,Zn as emitPreflightFailureSpan,Hr as encodeDocName,dn as encodeFolderRoute,xn as ensureProjectGit,_r as errorResponse,nr as evictStaleTrackerEntries,jn as extractWikiLinksFromMarkdown,En as fallbackPaths,Wt as findEnclosingGitRoot,qr as findEnclosingProjectRoot,ci as flushFileLogger,en as formatAuthRejectionWire,ri as formatContributors,lt as formatContributorsFrom,V as gcCheckpointRefs,Qr as getCurrentMcpLogger,mt as getLocalDir,Z as getLogFilePath,K as getLogger,We as getLogsDir,Kn as getMeter,j as getMetrics,Vn as getTracer,Pe as handleCollabSocketError,ze as handleSpawnCursor,Ye as hasGcLogLatch,n as iconFromClientName,ne as incrementCollabSocketFilteredError,ge as incrementServerObserverFire,ke as initContent,it as initShadowRepo,pi as initTelemetry,I as initToleranceTelemetryWriter,Ct as installPrettyZodErrors,de as installTestLoggers,vt as installUserSkill,Dt as isAllowedApiOrigin,oe as isAllowedWorkspaceHostHeader,we as isConfigDoc,xr as isHocuspocusAuthRejectionReason,be as isKnownPackId,Ft as isLoopbackAddress,g as isOrphanMode,jt as isPairedWriteOrigin,zt as isPathWithinDir,v as isProcessAlive,$e as isProjectRoot,E as isSelfWrite,_n as isSystemDoc,Rr as isToleranceTelemetryEnabled,a as isValidLockPid,cr as lastKnownHash,Dr as listRescueCheckpoints,Ln as listStarterPacks,Xt as loadPrincipal,d as lockFilePath,pr as loggerFactory,Mr as logsCurrentPath,sn as logsPreviousPath,Qn as makeLazyEmbeddingsKeyStore,Ur as mountMcpAndApi,fn as normalizeFsPath,Sn as packageVersionMajorMinor,vr as parseAuthRejectionWire,rr as parseGitVersion,Mn as parseHocuspocusAuthToken,Dn as parseKeepaliveConnectionId,Gt as pathToDocName,Jr as planSeed,li as prepareSingleFileOpen,tn as readAllTargets,ii as readArmedPaneTarget,ut as readBranchFromHead,x as readProcessLock,o as readProcessLockDetailed,H as readProjectLocalSemanticConfig,s as readServerLock,$r as readServerPackageVersion,ht as readSkillInstallStateSnapshot,Q as readStateManifest,q as readTargetRecordedAt,Ge as readTargetVersion,qn as readUiLock,M as reconcile,Hn as recordContributor,Fe as recordSkillInstallEvent,Be as registerAllTools,Xe as registerWrite,h as releaseProcessLock,f as releaseServerLock,re as releaseUiLock,_e as removeLastKnownHash,Ae as resetMetrics,at as resolveBundledSkillDir,mi as resolveContentDir,L as resolveCursorBinaryDefault,wt as resolveCursorSpawnInvocation,fe as resolveLockDir,yt as resolvePack,Ot as resolvePackageVersion,se as resolveUiInfo,Te as restoreContributors,Sr as restoreLifecycleFromConflictsJson,xe as rewriteMarkdownLinksForDocumentRename,It as rewriteWikiLinksForDocumentRename,Mt as runAuthReposSubprocess,Bt as runAuthStatusSubprocess,et as runCloneSubprocess,D as runDeviceFlowSubprocess,hn as runWithMcpLogger,Ir as safeContentPath,or as safeSubdir,Tr as safetyCheckpoint,Fn as sanitizeClientName,Jt as saveInMemoryCheckpoint,dr as saveVersion,Ar as seedBasenameIndex,an as serializeError,Xn as setActiveSpanAttributes,Vr as shadowGit,un as shutdownTelemetry,bn as spansCurrentPath,gr as spansPreviousPath,tr as spawnDetached,An as splitMarkdownBlocks,Tn as startWatcher,Ut as streamingProblemEvent,Kr as swapContributors,si as teardownToleranceTelemetryWriter,$t as toBroadcasterKey,ni as tracedAppendFileSync,ct as tracedLinkSync,B as tracedMkdir,Zr as tracedMkdirSync,pt as tracedRename,X as tracedRenameSync,G as tracedRmSync,Ue as tracedRmdirSync,Gn as tracedUnlinkSync,A as tracedWriteFile,Bn as tracedWriteFileSync,Ne as updateLastKnownHash,l as updateProcessLockPort,c as updateServerLockPort,Re as updateUiLockPort,Je as validateAgentId,te as validateCloneInputs,he as validateSkillZip,Oe as withSpan,rt as withSpanSync,fi as writeRootGitignoreForNewRepo,F as writeStateManifest,St as writeTargetVersion,ue as writeTracker};
1
+ import{J as e,Sr as t,Ur as n,a as r,an as i,c as a,d as o,f as s,g as c,h as l,i as u,l as d,m as f,n as p,o as m,p as h,qr as g,r as _,s as v,t as y,tn as b,u as x,vn as S,xn as C,zt as w}from"./server-lock-BpjJj3OD-CqSr5wlA.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,Un as vt,Ur as yt,Ut as bt,V as xt,Vi as St,Vn as Ct,Vr as wt,Vt as Tt,W as Et,Wn as Dt,Wr as Ot,Wt as kt,X as At,Xn as jt,Xr as Mt,Xt as Nt,Y as Pt,Yn as Ft,Yr as It,Yt as Lt,Z as Rt,Zn as zt,Zr as Bt,Zt as Vt,_ as Ht,_i as Ut,_n as Wt,_r as Gt,_t as Kt,a as qt,ai as Jt,an as Yt,ar as Xt,at as Zt,b as Qt,bi as $t,bn as en,br as tn,bt as nn,c as rn,ci as an,cn as on,cr as sn,ct as cn,d as ln,di as un,dn,dr as fn,dt as pn,ea 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,ni as or,nn as sr,nr as cr,nt as lr,o as ur,oi as dr,on as fr,or as pr,ot as mr,p as hr,pi as gr,pn as _r,pr as vr,pt as yr,q as br,qn as xr,qr as Sr,qt as Cr,r as wr,ri as Tr,rn as Er,rr as Dr,rt as Or,s as kr,si as Ar,sn as jr,sr as Mr,st as Nr,t as Pr,ta as Fr,ti as Ir,tn as Lr,tr as Rr,tt as zr,u as Br,ui as Vr,un as Hr,ur as Ur,ut as Wr,v as Gr,vi as Kr,vn as qr,vr as Jr,vt as Yr,w as Xr,wi as Zr,wn as Qr,wr as $r,wt as ei,x as ti,xi as ni,xn as ri,xr as ii,xt as ai,y as oi,yi as si,yn as ci,yr as li,yt as ui,z as di,zi as fi,zn as pi,zr as mi,zt as hi}from"./dist-BEh-GNLZ.mjs";export{Pr as AGENT_ID_MAX_LEN,ar as AGENT_ID_RE,wr as AGENT_WRITE_ORIGIN,Pn as AgentFocusBroadcaster,qt as AgentPresenceBroadcaster,ur as AgentSessionCapacityError,kr as AgentSessionManager,rn as AutoStartDisabledError,Yn as BacklinkIndex,Br as CC1Broadcaster,e as CC1_CONTRACT_VERSION,ln as CONFIG_FILENAME,yn as CONFLICT_MARKER_RE,hr as CURSOR_BUNDLE_PATHS_BY_PLATFORM,er as ConfigSchema,kn as DEFAULT_CHECKPOINT_RETENTION,wn as DEFAULT_EMBEDDINGS_DIMENSIONS,Ht as DEFAULT_PACK_ID,Gr as EMBEDDINGS_API_KEY_ENV,oi as FILE_SYSTEM_WRITER,Qt as FILE_WATCHER_ORIGIN,ti as FileEmbeddingsBackend,st as GIT_PREFLIGHT_FAIL_SPAN_NAME,z as GIT_UPSTREAM_WRITER,mn as GitDirAccessError,Xr 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,Fr as MalformedGitPointerError,nt as McpLogger,di as MissingOkConfigError,P as OBSERVER_SYNC_ORIGIN,xt as OK_OKIGNORE_TEMPLATE,b as ORPHAN_MODES,le as PANE_TARGET_TTL_MS,i as PROTOCOL_VERSION,_t as PinoLogger,y as ProcessLockCollisionError,Et as ProjectGitInitError,ae as ROLLBACK_ORIGIN,Ce as ROOT_GITIGNORE_TEMPLATE,p as RUNTIME_VERSION,br as SERVICE_WRITER,ye as SKILL_INSTALL_EVENTS_FILE_REL,S as SKILL_STATE_TARGETS,Pt as STARTER_FOLDERS,At as STARTER_FOLDER_FRONTMATTER_FILENAME,Rt as STARTER_PACKS,Qe as STARTER_PACK_IDS,T as STARTER_TEMPLATES,vn as STATE_MANIFEST_FILENAME,_ as STATE_SCHEMA_VERSION,C as SYSTEM_DOC_NAME,zr as SeedPrerequisiteError,lr as SeedRootDirError,u as ServerLockCollisionError,Or as SingleFileNotAFileError,Rn as SingleFileNotFoundError,Zt as SingleFileNotMarkdownError,mr as StateManifestError,Nr as TagIndex,cn as UiLockCollisionError,$n as __getShowAllWalkStatsForTesting,Wr as __resetShowAllWalkStatsForTesting,r as acquireProcessLock,m as acquireServerLock,pn as acquireUiLock,Cn as applyAgentMarkdownWrite,yr as applyExternalChange,ir as applySeed,Nn as armPaneTarget,On as assertCompatibleStateManifest,Kt as assertGitAvailable,Yr as assertNeverDiskEvent,ui as attachIdleShutdown,nn as bootServer,ai as buildAndOpenSkill,dt as buildConfigYmlContent,U as buildExecResult,ei 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,t as colorFromSeed,Ve as commitUpstreamImport,Ze as commitWip,ie as commitWipFromTree,ve as compareSemver,je as containsConflictMarkers,ot as contentHash,hi as contributorCount,R as countShadowObjects,Tt as countStaleAgentWipRefs,pe as countWipRefs,bt as createApiExtension,kt as createAssetServeMiddleware,ce as createContentFilter,Ee as createContentFilterAsync,Cr as createEmbeddingsSecretStore,Se as createEphemeralProjectDir,Lt as createExternalChangeHandler,Nt as createFileLogger,Vt as createLiveDerivedIndexExtension,tt as createMcpHttpHandler,O as createOsProbe,gn as createPersistenceExtension,Lr as createServer,sr as createServerObserverExtension,Er as createStreamingErrorWriter,In as createTestLogger,Yt as describeStoredEmbeddingsKey,fr as detectClaudeDesktopPresence,jr as detectGit,on as detectProjectShape,Zn as emitPreflightFailureSpan,Hr as encodeDocName,dn as encodeFolderRoute,xn as ensureProjectGit,_r as errorResponse,nr as evictStaleTrackerEntries,jn as extractWikiLinksFromMarkdown,En as fallbackPaths,Wt as findEnclosingGitRoot,qr as findEnclosingProjectRoot,ci as flushFileLogger,en as formatAuthRejectionWire,ri as formatContributors,lt as formatContributorsFrom,V as gcCheckpointRefs,Qr as getCurrentMcpLogger,mt as getLocalDir,Z as getLogFilePath,K as getLogger,We as getLogsDir,Kn as getMeter,j as getMetrics,Vn as getTracer,Pe as handleCollabSocketError,ze as handleSpawnCursor,Ye as hasGcLogLatch,n as iconFromClientName,ne as incrementCollabSocketFilteredError,ge as incrementServerObserverFire,ke as initContent,it as initShadowRepo,pi as initTelemetry,I as initToleranceTelemetryWriter,Ct as installPrettyZodErrors,de as installTestLoggers,vt as installUserSkill,Dt as isAllowedApiOrigin,oe as isAllowedWorkspaceHostHeader,we as isConfigDoc,xr as isHocuspocusAuthRejectionReason,be as isKnownPackId,Ft as isLoopbackAddress,g as isOrphanMode,jt as isPairedWriteOrigin,zt as isPathWithinDir,v as isProcessAlive,$e as isProjectRoot,E as isSelfWrite,_n as isSystemDoc,Rr as isToleranceTelemetryEnabled,a as isValidLockPid,cr as lastKnownHash,Dr as listRescueCheckpoints,Ln as listStarterPacks,Xt as loadPrincipal,d as lockFilePath,pr as loggerFactory,Mr as logsCurrentPath,sn as logsPreviousPath,Qn as makeLazyEmbeddingsKeyStore,Ur as mountMcpAndApi,fn as normalizeFsPath,Sn as packageVersionMajorMinor,vr as parseAuthRejectionWire,rr as parseGitVersion,Mn as parseHocuspocusAuthToken,Dn as parseKeepaliveConnectionId,Gt as pathToDocName,Jr as planSeed,li as prepareSingleFileOpen,tn as readAllTargets,ii as readArmedPaneTarget,ut as readBranchFromHead,x as readProcessLock,o as readProcessLockDetailed,H as readProjectLocalSemanticConfig,s as readServerLock,$r as readServerPackageVersion,ht as readSkillInstallStateSnapshot,Q as readStateManifest,q as readTargetRecordedAt,Ge as readTargetVersion,qn as readUiLock,M as reconcile,Hn as recordContributor,Fe as recordSkillInstallEvent,Be as registerAllTools,Xe as registerWrite,h as releaseProcessLock,f as releaseServerLock,re as releaseUiLock,_e as removeLastKnownHash,Ae as resetMetrics,at as resolveBundledSkillDir,mi as resolveContentDir,L as resolveCursorBinaryDefault,wt as resolveCursorSpawnInvocation,fe as resolveLockDir,yt as resolvePack,Ot as resolvePackageVersion,se as resolveUiInfo,Te as restoreContributors,Sr as restoreLifecycleFromConflictsJson,xe as rewriteMarkdownLinksForDocumentRename,It as rewriteWikiLinksForDocumentRename,Mt as runAuthReposSubprocess,Bt as runAuthStatusSubprocess,et as runCloneSubprocess,D as runDeviceFlowSubprocess,hn as runWithMcpLogger,Ir as safeContentPath,or as safeSubdir,Tr as safetyCheckpoint,Fn as sanitizeClientName,Jt as saveInMemoryCheckpoint,dr as saveVersion,Ar as seedBasenameIndex,an as serializeError,Xn as setActiveSpanAttributes,Vr as shadowGit,un as shutdownTelemetry,bn as spansCurrentPath,gr as spansPreviousPath,tr as spawnDetached,An as splitMarkdownBlocks,Tn as startWatcher,Ut as streamingProblemEvent,Kr as swapContributors,si as teardownToleranceTelemetryWriter,$t as toBroadcasterKey,ni as tracedAppendFileSync,ct as tracedLinkSync,B as tracedMkdir,Zr as tracedMkdirSync,pt as tracedRename,X as tracedRenameSync,G as tracedRmSync,Ue as tracedRmdirSync,Gn as tracedUnlinkSync,A as tracedWriteFile,Bn as tracedWriteFileSync,Ne as updateLastKnownHash,l as updateProcessLockPort,c as updateServerLockPort,Re as updateUiLockPort,Je as validateAgentId,te as validateCloneInputs,he as validateSkillZip,Oe as withSpan,rt as withSpanSync,fi as writeRootGitignoreForNewRepo,F as writeStateManifest,St as writeTargetVersion,ue as writeTracker};
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{i as e,r as t,t as n}from"./gh-detect-DDDo2rYe.mjs";import{A as r,C as i,D as a,E as o,O as s,S as c,T as l,_ as u,b as d,d as f,g as p,h as m,i as h,j as g,k as _,o as v,r as y,s as b,t as x,w as S,x as C,y as w}from"./init-Dk494K1D.mjs";import{d as T,f as E,m as D,n as O,p as k,r as A,t as j}from"./src-CK1MtOQ7.mjs";import{n as M}from"./loader-BwrQjUfM.mjs";import{n as N}from"./preview-h-OyfvxY.mjs";import{n as P,t as F}from"./mcp-migrate-event-D0NrGjvc.mjs";export{a as ALL_EDITOR_IDS,s as EDITOR_LABELS,_ as EDITOR_TARGETS,x as LAUNCH_CONFIG_NAME,y as LAUNCH_UI_CHAIN_SENTINEL,h as LAUNCH_UI_CHAIN_V1,d as addOkPathsToGitExclude,r as buildManagedServerEntry,F as buildMcpConfigMigrateEvent,v as classifyExistingMcpEntry,t as createTokenStore,n as detectGh,b as detectInstalledEditors,C as formatTrackedRemediation,c as getExcludedOkPaths,i as getOkArtifactPaths,g as isEntryUpToDate,M as loadConfig,e as makeLazyProbeTokenStore,T as parseGitHubBlobUrl,E as parseGitHubShareUrl,k as parseGitHubTreeUrl,D as parseGitUrl,N as previewContent,S as probeTrackedOkPaths,f as readExistingMcpEntry,l as readSharingMode,o as removeOkPathsFromGitExclude,w as resolveProjectRoot,A as runStop,m as scaffoldLaunchJson,P as truncatePriorEntry,O as validateLocalFolderForShare,p as writeEditorMcpConfig,j as writeProjectAiIntegrations,u as writeUserMcpConfigs};
1
+ import{i as e,r as t,t as n}from"./gh-detect-DDDo2rYe.mjs";import{A as r,C as i,D as a,E as o,O as s,S as c,T as l,_ as u,b as d,d as f,g as p,h as m,i as h,j as g,k as _,o as v,r as y,s as b,t as x,w as S,x as C,y as w}from"./init-mM-my2mf.mjs";import{d as T,f as E,m as D,n as O,p as k,r as A,t as j}from"./src-D8R1uRwT.mjs";import{n as M}from"./loader-Bm38bc01.mjs";import{n as N}from"./preview-DO3biQng.mjs";import{n as P,t as F}from"./mcp-migrate-event-D0NrGjvc.mjs";export{a as ALL_EDITOR_IDS,s as EDITOR_LABELS,_ as EDITOR_TARGETS,x as LAUNCH_CONFIG_NAME,y as LAUNCH_UI_CHAIN_SENTINEL,h as LAUNCH_UI_CHAIN_V1,d as addOkPathsToGitExclude,r as buildManagedServerEntry,F as buildMcpConfigMigrateEvent,v as classifyExistingMcpEntry,t as createTokenStore,n as detectGh,b as detectInstalledEditors,C as formatTrackedRemediation,c as getExcludedOkPaths,i as getOkArtifactPaths,g as isEntryUpToDate,M as loadConfig,e as makeLazyProbeTokenStore,T as parseGitHubBlobUrl,E as parseGitHubShareUrl,k as parseGitHubTreeUrl,D as parseGitUrl,N as previewContent,S as probeTrackedOkPaths,f as readExistingMcpEntry,l as readSharingMode,o as removeOkPathsFromGitExclude,w as resolveProjectRoot,A as runStop,m as scaffoldLaunchJson,P as truncatePriorEntry,O as validateLocalFolderForShare,p as writeEditorMcpConfig,j as writeProjectAiIntegrations,u as writeUserMcpConfigs};
@@ -0,0 +1 @@
1
+ import{m as e}from"./init-mM-my2mf.mjs";export{e as runInit};