botnote 0.1.21 → 0.1.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "botnote",
3
- "version": "0.1.21",
3
+ "version": "0.1.22",
4
4
  "description": "Notion for bots. Lightweight project + notes + memory store, agent-first.",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@10.33.0",
@@ -490,21 +490,23 @@ npm i -g botnote@latest
490
490
  # Daemon host: use http://127.0.0.1:4280 and skip the token.
491
491
  botnote login`}),O.jsx(on,{title:"Update runtime",code:`# If you installed the optional helper CLI, keep it current.
492
492
  npm i -g botnote@latest
493
- botnote --version`})]}),O.jsx(xo,{icon:NB,title:"Claude Code",subtitle:"Recommended for day-to-day work. Enable marketplace auto-update after installation."}),O.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-3",children:[O.jsx(on,{title:"Install",code:`# In Claude Code
493
+ botnote --version`})]}),O.jsx(xo,{icon:NB,title:"Claude Code",subtitle:"Recommended for day-to-day work. Update through /plugin, then reload plugins in-session."}),O.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-3",children:[O.jsx(on,{title:"Install",code:`# In Claude Code
494
494
  /plugin marketplace add jianhua-wang/botnote
495
495
  /plugin install botnote@botnote
496
496
 
497
497
  # Claude Code will prompt for:
498
498
  # botnote_url -> default https://botnote.net (use http://127.0.0.1:4280 on daemon host)
499
- # botnote_token -> bearer from Settings → API tokens (skip on loopback)`}),O.jsx(on,{title:"Update",code:`# Preferred: enable marketplace auto-update in Claude Code.
499
+ # botnote_token -> bearer from Settings → API tokens (skip on loopback)`}),O.jsx(on,{title:"Update",code:`# Claude Code does not expose auto-update in every build.
500
500
  /plugin
501
- # Marketplaces botnote Enable auto-update
501
+ # Marketplaces -> botnote -> Update, if your build shows it.
502
502
 
503
- # After Claude reports an updated plugin:
504
- /reload-plugins
503
+ # If there is no Update action:
504
+ # 1. Remove/uninstall botnote from /plugin.
505
+ # 2. Install it again.
506
+ /plugin install botnote@botnote
505
507
 
506
- # Manual update, if available in your Claude Code build:
507
- claude plugin update botnote@botnote`})]}),O.jsx(xo,{icon:GT,title:"Codex",subtitle:"Use the Git marketplace flow; sparse checkout means no full botnote source checkout. Restart Codex after install or update."}),O.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-3",children:[O.jsx(on,{title:"Install",code:`# No full source checkout required.
508
+ # Apply changes in this session:
509
+ /reload-plugins`})]}),O.jsx(xo,{icon:GT,title:"Codex",subtitle:"Use the Git marketplace flow; sparse checkout means no full botnote source checkout. Restart Codex after install or update."}),O.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-3",children:[O.jsx(on,{title:"Install",code:`# No full source checkout required.
508
510
  codex plugin marketplace add https://github.com/jianhua-wang/botnote.git \\
509
511
  --sparse .agents/plugins \\
510
512
  --sparse plugins/botnote
@@ -546,7 +548,7 @@ npm i -g botnote@latest`})]}),O.jsx(xo,{icon:yx,title:"Advanced",subtitle:"Only
546
548
  /botnote:start-work DEMO-12 # pick up a task with project context
547
549
  /botnote:remember "..." # capture a note
548
550
  /botnote:recall "..." # hybrid search
549
- /botnote:done # mark current focus done`}),O.jsxs("div",{className:"border border-line rounded-md bg-surface px-4 py-3 text-xs text-muted leading-relaxed flex items-start gap-3",children:[O.jsx(_B,{size:13,className:"mt-0.5 shrink-0 text-accent"}),O.jsxs("div",{children:["Plugin distribution lives at"," ",O.jsx("a",{href:"https://github.com/jianhua-wang/botnote",target:"_blank",className:"text-accent hover:underline",rel:"noreferrer",children:"jianhua-wang/botnote"}),". ","Claude Code can auto-update third-party marketplaces when enabled; after an update, run"," ",O.jsx("code",{className:"text-ink",children:"/reload-plugins"}),". Codex has no reload command: refresh Git marketplace snapshots with"," ",O.jsx("code",{className:"text-ink",children:"codex plugin marketplace upgrade"}),", reinstall the plugin, then start a new Codex session."]})]})]})}function kO({icon:n,title:e,body:t}){return O.jsxs("div",{className:"border border-line rounded-md bg-surface px-4 py-3 min-h-[104px]",children:[O.jsxs("div",{className:"flex items-center gap-2 text-sm font-semibold text-ink",children:[O.jsx("span",{className:"w-6 h-6 rounded-md bg-accentSoft text-accent flex items-center justify-center shrink-0",children:O.jsx(n,{size:13})}),e]}),O.jsx("p",{className:"mt-2 text-xs text-muted leading-relaxed",children:t})]})}function xo({icon:n,title:e,subtitle:t}){return O.jsxs("div",{className:"pt-2 border-t border-lineSoft flex items-start gap-2",children:[O.jsx("span",{className:"mt-0.5 w-6 h-6 rounded-md bg-sidebar text-muted border border-line flex items-center justify-center shrink-0",children:O.jsx(n,{size:13})}),O.jsxs("div",{children:[O.jsx("h2",{className:"text-sm font-semibold text-ink",children:e}),O.jsx("p",{className:"text-xs text-muted leading-relaxed mt-0.5",children:t})]})]})}function iU(){const{data:n,isLoading:e}=Iq(),t=zq(),r=Zq(),[i,s]=N.useState(!0),[l,o]=N.useState("openai"),[u,h]=N.useState("text-embedding-3-small"),[f,p]=N.useState(""),[m,y]=N.useState(""),[k,b]=N.useState(!1),[w,S]=N.useState(null);N.useEffect(()=>{n&&(s(n.enabled),o(n.provider),h(n.model),p(n.baseUrl??""),y(""),b(!1))},[n]);async function C(T){T.preventDefault(),S(null);const Z=m.trim(),q={enabled:i,provider:l,model:u.trim(),baseUrl:l==="openai_compatible"&&f.trim()||null,...Z?{apiKey:Z}:k?{apiKey:null}:{}},ee=await t.mutateAsync(q);y(""),b(!1),S(ee.effectiveEnabled?"Embedding search is ready.":zP(ee.statusReason))}async function Q(){S(null);const T=Math.min((n==null?void 0:n.missingCount)??xO,xO),Z=await r.mutateAsync(T),q=n&&n.missingCount>xO;S(q?`Queued ${Z.enqueued} item(s), the maximum per request. Pending queue: ${Z.pendingCount}.`:`Queued all ${Z.enqueued} missing item(s). Pending queue: ${Z.pendingCount}.`)}const A=n&&n.totalCount>0?Math.round(n.embeddedCount/n.totalCount*100):0,I=!!(n!=null&&n.effectiveEnabled&&n.missingCount>0);return O.jsxs(O.Fragment,{children:[O.jsx(Xl,{title:"Embeddings",blurb:"Configure semantic search for botnote. The database vector column is fixed at 384 dimensions, so provider models must return 384-dimensional embeddings."}),O.jsx("div",{className:`border rounded-md px-4 py-3 text-xs leading-relaxed ${n!=null&&n.effectiveEnabled?"border-success/30 bg-success/10 text-ink":"border-warn/30 bg-warn/10 text-ink"}`,children:e?"Loading embedding settings...":n!=null&&n.effectiveEnabled?O.jsxs(O.Fragment,{children:["Semantic search is enabled via ",O.jsx("strong",{children:sU(n.provider)})," using"," ",O.jsx("code",{children:n.model}),". Search merges BM25 + cosine + time decay."]}):O.jsxs(O.Fragment,{children:["Semantic search is not active: ",zP((n==null?void 0:n.statusReason)??"not_loaded"),". Text search still works through BM25."]})}),O.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-4 gap-2",children:[O.jsx(Tf,{label:"Status",value:n!=null&&n.effectiveEnabled?"On":"Off"}),O.jsx(Tf,{label:"Embedded",value:`${(n==null?void 0:n.embeddedCount)??0}/${(n==null?void 0:n.totalCount)??0}`}),O.jsx(Tf,{label:"Missing",value:`${(n==null?void 0:n.missingCount)??0}`}),O.jsx(Tf,{label:"Queue",value:`${(n==null?void 0:n.pendingCount)??0}`})]}),O.jsxs("div",{className:"border border-line rounded-md bg-surface px-4 py-3 space-y-2",children:[O.jsxs("div",{className:"flex items-center justify-between gap-3",children:[O.jsxs("div",{children:[O.jsx("div",{className:"text-xs font-semibold text-ink",children:"Vector coverage"}),O.jsxs("div",{className:"text-xxs text-muted",children:[A,"% of task/note records have embeddings."]})]}),O.jsxs("button",{type:"button",className:"btn",disabled:!I||r.isPending,onClick:Q,title:n!=null&&n.effectiveEnabled?"Queue embeddings for all existing records without body_vec":"Enable embeddings before backfilling",children:[O.jsx(FT,{size:11})," ",r.isPending?"Queueing...":"Backfill all missing"]})]}),O.jsx("div",{className:"h-2 rounded bg-sidebar overflow-hidden border border-lineSoft",children:O.jsx("div",{className:"h-full bg-accent",style:{width:`${A}%`}})})]}),O.jsxs("form",{onSubmit:C,className:"border border-line rounded-md bg-surface px-4 py-4 space-y-4",children:[O.jsxs("label",{className:"flex items-center gap-2 text-sm text-ink",children:[O.jsx("input",{type:"checkbox",checked:i,onChange:T=>s(T.target.checked)}),"Enable semantic search"]}),O.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-3",children:[O.jsxs("label",{className:"space-y-1",children:[O.jsx("span",{className:"block text-xxs uppercase tracking-wider text-muted",children:"Provider"}),O.jsxs("select",{className:"input",value:l,onChange:T=>o(T.target.value),children:[O.jsx("option",{value:"openai",children:"OpenAI"}),O.jsx("option",{value:"openai_compatible",children:"OpenAI-compatible"})]})]}),O.jsxs("label",{className:"space-y-1",children:[O.jsx("span",{className:"block text-xxs uppercase tracking-wider text-muted",children:"Model"}),O.jsx("input",{className:"input font-mono",list:"embedding-models",value:u,onChange:T=>h(T.target.value),placeholder:"text-embedding-3-small"}),O.jsxs("datalist",{id:"embedding-models",children:[O.jsx("option",{value:"text-embedding-3-small"}),O.jsx("option",{value:"text-embedding-3-large"})]})]})]}),l==="openai_compatible"&&O.jsxs("label",{className:"space-y-1 block",children:[O.jsx("span",{className:"block text-xxs uppercase tracking-wider text-muted",children:"Base URL"}),O.jsx("input",{className:"input font-mono",value:f,onChange:T=>p(T.target.value),placeholder:"https://api.example.com/v1"})]}),O.jsxs("label",{className:"space-y-1 block",children:[O.jsx("span",{className:"block text-xxs uppercase tracking-wider text-muted",children:"API key"}),O.jsx("input",{className:"input font-mono",type:"password",value:m,onChange:T=>{y(T.target.value),T.target.value&&b(!1)},placeholder:n!=null&&n.apiKeyConfigured?`Configured (${n.apiKeySource??"unknown"}${n.apiKeyPreview?` · ${n.apiKeyPreview}`:""})`:"sk-..."}),O.jsxs("div",{className:"flex items-center justify-between gap-3 text-xxs text-muted",children:[O.jsx("span",{children:"Full keys are stored server-side and are not returned to the browser after save."}),(n==null?void 0:n.settingsApiKeyConfigured)&&O.jsxs("label",{className:"inline-flex items-center gap-1.5",children:[O.jsx("input",{type:"checkbox",checked:k,onChange:T=>{b(T.target.checked),T.target.checked&&y("")}}),"Clear stored key"]})]})]}),O.jsxs("div",{className:"border border-lineSoft rounded-md bg-sidebar/30 px-3 py-2 text-xs text-muted leading-relaxed",children:["OpenAI-compatible providers must accept the OpenAI embeddings API and return"," ",O.jsx("code",{className:"text-ink",children:"384"})," dimensions for the selected model. Existing vectors are not automatically regenerated when provider or model changes; use Backfill all missing to queue every record that does not have a vector yet."]}),w&&O.jsx("div",{className:"text-xs text-accentText bg-accentSoft/50 border border-accent/20 rounded-md px-3 py-2",children:w}),t.error&&O.jsx("div",{className:"text-xs text-danger",children:t.error instanceof Error?t.error.message:String(t.error)}),r.error&&O.jsx("div",{className:"text-xs text-danger",children:r.error instanceof Error?r.error.message:String(r.error)}),O.jsx("div",{className:"flex justify-end",children:O.jsxs("button",{type:"submit",className:"btn btn-primary",disabled:t.isPending||u.trim().length===0,children:[O.jsx(Nc,{size:11})," ",t.isPending?"Saving...":"Save embedding settings"]})})]})]})}function Tf({label:n,value:e}){return O.jsxs("div",{className:"border border-line rounded-md bg-surface px-3 py-2",children:[O.jsx("div",{className:"text-xxs uppercase tracking-wider text-muted",children:n}),O.jsx("div",{className:"text-lg font-semibold text-ink mt-0.5",children:e})]})}function sU(n){return n==="openai_compatible"?"OpenAI-compatible":"OpenAI"}function zP(n){switch(n){case"ready":return"ready";case"disabled":return"disabled";case"missing_api_key":return"missing API key";case"missing_base_url":return"missing base URL";case"injected":return"using injected test embedder";case"not_loaded":return"configuration not loaded yet"}}function lU(){const n=`{
551
+ /botnote:done # mark current focus done`}),O.jsxs("div",{className:"border border-line rounded-md bg-surface px-4 py-3 text-xs text-muted leading-relaxed flex items-start gap-3",children:[O.jsx(_B,{size:13,className:"mt-0.5 shrink-0 text-accent"}),O.jsxs("div",{children:["Plugin distribution lives at"," ",O.jsx("a",{href:"https://github.com/jianhua-wang/botnote",target:"_blank",className:"text-accent hover:underline",rel:"noreferrer",children:"jianhua-wang/botnote"}),". ","Claude Code updates through ",O.jsx("code",{className:"text-ink",children:"/plugin"}),"; after updating or reinstalling, run ",O.jsx("code",{className:"text-ink",children:"/reload-plugins"}),". Codex has no reload command: refresh Git marketplace snapshots with"," ",O.jsx("code",{className:"text-ink",children:"codex plugin marketplace upgrade"}),", reinstall the plugin, then start a new Codex session."]})]})]})}function kO({icon:n,title:e,body:t}){return O.jsxs("div",{className:"border border-line rounded-md bg-surface px-4 py-3 min-h-[104px]",children:[O.jsxs("div",{className:"flex items-center gap-2 text-sm font-semibold text-ink",children:[O.jsx("span",{className:"w-6 h-6 rounded-md bg-accentSoft text-accent flex items-center justify-center shrink-0",children:O.jsx(n,{size:13})}),e]}),O.jsx("p",{className:"mt-2 text-xs text-muted leading-relaxed",children:t})]})}function xo({icon:n,title:e,subtitle:t}){return O.jsxs("div",{className:"pt-2 border-t border-lineSoft flex items-start gap-2",children:[O.jsx("span",{className:"mt-0.5 w-6 h-6 rounded-md bg-sidebar text-muted border border-line flex items-center justify-center shrink-0",children:O.jsx(n,{size:13})}),O.jsxs("div",{children:[O.jsx("h2",{className:"text-sm font-semibold text-ink",children:e}),O.jsx("p",{className:"text-xs text-muted leading-relaxed mt-0.5",children:t})]})]})}function iU(){const{data:n,isLoading:e}=Iq(),t=zq(),r=Zq(),[i,s]=N.useState(!0),[l,o]=N.useState("openai"),[u,h]=N.useState("text-embedding-3-small"),[f,p]=N.useState(""),[m,y]=N.useState(""),[k,b]=N.useState(!1),[w,S]=N.useState(null);N.useEffect(()=>{n&&(s(n.enabled),o(n.provider),h(n.model),p(n.baseUrl??""),y(""),b(!1))},[n]);async function C(T){T.preventDefault(),S(null);const Z=m.trim(),q={enabled:i,provider:l,model:u.trim(),baseUrl:l==="openai_compatible"&&f.trim()||null,...Z?{apiKey:Z}:k?{apiKey:null}:{}},ee=await t.mutateAsync(q);y(""),b(!1),S(ee.effectiveEnabled?"Embedding search is ready.":zP(ee.statusReason))}async function Q(){S(null);const T=Math.min((n==null?void 0:n.missingCount)??xO,xO),Z=await r.mutateAsync(T),q=n&&n.missingCount>xO;S(q?`Queued ${Z.enqueued} item(s), the maximum per request. Pending queue: ${Z.pendingCount}.`:`Queued all ${Z.enqueued} missing item(s). Pending queue: ${Z.pendingCount}.`)}const A=n&&n.totalCount>0?Math.round(n.embeddedCount/n.totalCount*100):0,I=!!(n!=null&&n.effectiveEnabled&&n.missingCount>0);return O.jsxs(O.Fragment,{children:[O.jsx(Xl,{title:"Embeddings",blurb:"Configure semantic search for botnote. The database vector column is fixed at 384 dimensions, so provider models must return 384-dimensional embeddings."}),O.jsx("div",{className:`border rounded-md px-4 py-3 text-xs leading-relaxed ${n!=null&&n.effectiveEnabled?"border-success/30 bg-success/10 text-ink":"border-warn/30 bg-warn/10 text-ink"}`,children:e?"Loading embedding settings...":n!=null&&n.effectiveEnabled?O.jsxs(O.Fragment,{children:["Semantic search is enabled via ",O.jsx("strong",{children:sU(n.provider)})," using"," ",O.jsx("code",{children:n.model}),". Search merges BM25 + cosine + time decay."]}):O.jsxs(O.Fragment,{children:["Semantic search is not active: ",zP((n==null?void 0:n.statusReason)??"not_loaded"),". Text search still works through BM25."]})}),O.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-4 gap-2",children:[O.jsx(Tf,{label:"Status",value:n!=null&&n.effectiveEnabled?"On":"Off"}),O.jsx(Tf,{label:"Embedded",value:`${(n==null?void 0:n.embeddedCount)??0}/${(n==null?void 0:n.totalCount)??0}`}),O.jsx(Tf,{label:"Missing",value:`${(n==null?void 0:n.missingCount)??0}`}),O.jsx(Tf,{label:"Queue",value:`${(n==null?void 0:n.pendingCount)??0}`})]}),O.jsxs("div",{className:"border border-line rounded-md bg-surface px-4 py-3 space-y-2",children:[O.jsxs("div",{className:"flex items-center justify-between gap-3",children:[O.jsxs("div",{children:[O.jsx("div",{className:"text-xs font-semibold text-ink",children:"Vector coverage"}),O.jsxs("div",{className:"text-xxs text-muted",children:[A,"% of task/note records have embeddings."]})]}),O.jsxs("button",{type:"button",className:"btn",disabled:!I||r.isPending,onClick:Q,title:n!=null&&n.effectiveEnabled?"Queue embeddings for all existing records without body_vec":"Enable embeddings before backfilling",children:[O.jsx(FT,{size:11})," ",r.isPending?"Queueing...":"Backfill all missing"]})]}),O.jsx("div",{className:"h-2 rounded bg-sidebar overflow-hidden border border-lineSoft",children:O.jsx("div",{className:"h-full bg-accent",style:{width:`${A}%`}})})]}),O.jsxs("form",{onSubmit:C,className:"border border-line rounded-md bg-surface px-4 py-4 space-y-4",children:[O.jsxs("label",{className:"flex items-center gap-2 text-sm text-ink",children:[O.jsx("input",{type:"checkbox",checked:i,onChange:T=>s(T.target.checked)}),"Enable semantic search"]}),O.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-3",children:[O.jsxs("label",{className:"space-y-1",children:[O.jsx("span",{className:"block text-xxs uppercase tracking-wider text-muted",children:"Provider"}),O.jsxs("select",{className:"input",value:l,onChange:T=>o(T.target.value),children:[O.jsx("option",{value:"openai",children:"OpenAI"}),O.jsx("option",{value:"openai_compatible",children:"OpenAI-compatible"})]})]}),O.jsxs("label",{className:"space-y-1",children:[O.jsx("span",{className:"block text-xxs uppercase tracking-wider text-muted",children:"Model"}),O.jsx("input",{className:"input font-mono",list:"embedding-models",value:u,onChange:T=>h(T.target.value),placeholder:"text-embedding-3-small"}),O.jsxs("datalist",{id:"embedding-models",children:[O.jsx("option",{value:"text-embedding-3-small"}),O.jsx("option",{value:"text-embedding-3-large"})]})]})]}),l==="openai_compatible"&&O.jsxs("label",{className:"space-y-1 block",children:[O.jsx("span",{className:"block text-xxs uppercase tracking-wider text-muted",children:"Base URL"}),O.jsx("input",{className:"input font-mono",value:f,onChange:T=>p(T.target.value),placeholder:"https://api.example.com/v1"})]}),O.jsxs("label",{className:"space-y-1 block",children:[O.jsx("span",{className:"block text-xxs uppercase tracking-wider text-muted",children:"API key"}),O.jsx("input",{className:"input font-mono",type:"password",value:m,onChange:T=>{y(T.target.value),T.target.value&&b(!1)},placeholder:n!=null&&n.apiKeyConfigured?`Configured (${n.apiKeySource??"unknown"}${n.apiKeyPreview?` · ${n.apiKeyPreview}`:""})`:"sk-..."}),O.jsxs("div",{className:"flex items-center justify-between gap-3 text-xxs text-muted",children:[O.jsx("span",{children:"Full keys are stored server-side and are not returned to the browser after save."}),(n==null?void 0:n.settingsApiKeyConfigured)&&O.jsxs("label",{className:"inline-flex items-center gap-1.5",children:[O.jsx("input",{type:"checkbox",checked:k,onChange:T=>{b(T.target.checked),T.target.checked&&y("")}}),"Clear stored key"]})]})]}),O.jsxs("div",{className:"border border-lineSoft rounded-md bg-sidebar/30 px-3 py-2 text-xs text-muted leading-relaxed",children:["OpenAI-compatible providers must accept the OpenAI embeddings API and return"," ",O.jsx("code",{className:"text-ink",children:"384"})," dimensions for the selected model. Existing vectors are not automatically regenerated when provider or model changes; use Backfill all missing to queue every record that does not have a vector yet."]}),w&&O.jsx("div",{className:"text-xs text-accentText bg-accentSoft/50 border border-accent/20 rounded-md px-3 py-2",children:w}),t.error&&O.jsx("div",{className:"text-xs text-danger",children:t.error instanceof Error?t.error.message:String(t.error)}),r.error&&O.jsx("div",{className:"text-xs text-danger",children:r.error instanceof Error?r.error.message:String(r.error)}),O.jsx("div",{className:"flex justify-end",children:O.jsxs("button",{type:"submit",className:"btn btn-primary",disabled:t.isPending||u.trim().length===0,children:[O.jsx(Nc,{size:11})," ",t.isPending?"Saving...":"Save embedding settings"]})})]})]})}function Tf({label:n,value:e}){return O.jsxs("div",{className:"border border-line rounded-md bg-surface px-3 py-2",children:[O.jsx("div",{className:"text-xxs uppercase tracking-wider text-muted",children:n}),O.jsx("div",{className:"text-lg font-semibold text-ink mt-0.5",children:e})]})}function sU(n){return n==="openai_compatible"?"OpenAI-compatible":"OpenAI"}function zP(n){switch(n){case"ready":return"ready";case"disabled":return"disabled";case"missing_api_key":return"missing API key";case"missing_base_url":return"missing base URL";case"injected":return"using injected test embedder";case"not_loaded":return"configuration not loaded yet"}}function lU(){const n=`{
550
552
  "mcpServers": {
551
553
  "botnote": {
552
554
  "command": "botnote",
@@ -8,7 +8,7 @@
8
8
  <link rel="preconnect" href="https://fonts.googleapis.com" />
9
9
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
10
10
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet" />
11
- <script type="module" crossorigin src="/assets/index-tCGCP7mO.js"></script>
11
+ <script type="module" crossorigin src="/assets/index-DFtd7aGy.js"></script>
12
12
  <link rel="stylesheet" crossorigin href="/assets/index-DBDF6wZm.css">
13
13
  </head>
14
14
  <body>