brainllm 10.4.1 → 10.5.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.
package/README.md CHANGED
@@ -10,7 +10,7 @@ A persistent, graph-structured second brain for Claude and any MCP client — bu
10
10
 
11
11
  [**brainllm site**](https://miisodev.github.io/BrainLLM/) · [How it works](https://miisodev.github.io/BrainLLM/how-it-works.html) · [Use cases](https://miisodev.github.io/BrainLLM/use-cases.html) · [Docs](https://miisodev.github.io/BrainLLM/docs.html)
12
12
 
13
- [![Version](https://img.shields.io/badge/version-10.4.1-f59e0b?style=flat-square)](https://github.com/miisodev/BrainLLM/releases)
13
+ [![Version](https://img.shields.io/badge/version-10.5.0-f59e0b?style=flat-square)](https://github.com/miisodev/BrainLLM/releases)
14
14
  [![CI](https://img.shields.io/github/actions/workflow/status/miisodev/BrainLLM/ci.yml?branch=main&style=flat-square&label=CI&color=f59e0b)](https://github.com/miisodev/BrainLLM/actions/workflows/ci.yml)
15
15
  [![License: MIT](https://img.shields.io/badge/license-MIT-a1a1aa?style=flat-square)](./LICENSE)
16
16
  [![Runtime: Bun](https://img.shields.io/badge/runtime-Bun%20%E2%89%A5%201.0-a1a1aa?style=flat-square&logo=bun&logoColor=white)](https://bun.sh)
package/dist/index.js CHANGED
@@ -31754,43 +31754,88 @@ async function resolveClient(clientId) {
31754
31754
  return validateClientDocument(url.href, doc2);
31755
31755
  }
31756
31756
  var esc2 = (s) => s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
31757
- function consentPage(params, clientHost, error2) {
31758
- const hidden = Object.entries(params).map(([k, v]) => `<input type="hidden" name="${esc2(k)}" value="${esc2(v)}">`).join("");
31759
- return `<!doctype html>
31757
+ var PAGE_CSS = `
31758
+ :root {
31759
+ --bg:#0a0a0f; --bg-raised:#12121a; --bg-pill:#1a1a24;
31760
+ --text:#fafafa; --text-muted:#a1a1aa; --text-soft:#d4d4d8;
31761
+ --accent:#f59e0b; --accent-glow:rgba(245,158,11,.3);
31762
+ --border:rgba(255,255,255,.08); --border-strong:rgba(255,255,255,.15);
31763
+ --font-display:"Space Grotesk","Inter",system-ui,sans-serif;
31764
+ --font-body:"Inter",system-ui,-apple-system,sans-serif;
31765
+ --font-mono:"JetBrains Mono",ui-monospace,SFMono-Regular,Menlo,monospace;
31766
+ color-scheme: dark;
31767
+ }
31768
+ *,*::before,*::after { box-sizing:border-box; }
31769
+ body {
31770
+ margin:0; min-height:100dvh; display:grid; place-items:center; padding:24px;
31771
+ background:var(--bg); color:var(--text);
31772
+ font-family:var(--font-body); font-size:16px; line-height:1.6;
31773
+ -webkit-font-smoothing:antialiased;
31774
+ background-image:radial-gradient(circle at 50% 0%, rgba(245,158,11,.07) 0%, rgba(0,0,0,0) 60%);
31775
+ }
31776
+ .card {
31777
+ width:min(430px,100%); background:var(--bg-raised);
31778
+ border:1px solid var(--border); border-radius:16px; padding:32px;
31779
+ }
31780
+ .brand { display:flex; align-items:center; gap:10px; margin-bottom:26px; }
31781
+ .brand-mark { display:grid; grid-template-columns:repeat(3,4px); gap:3px; }
31782
+ .brand-mark i { width:4px; height:4px; border-radius:50%; background:var(--accent); display:block; }
31783
+ .brand-mark i.off { background:#3f3f46; }
31784
+ .brand-name { font-family:var(--font-display); font-size:19px; font-weight:700; letter-spacing:-.475px; }
31785
+ h1 { font-family:var(--font-display); font-size:24px; font-weight:700; letter-spacing:-.02em; line-height:1.2; margin:0 0 8px; }
31786
+ p { margin:0 0 20px; color:var(--text-muted); font-size:14.5px; }
31787
+ .host {
31788
+ font-family:var(--font-mono); font-size:13px; color:var(--text);
31789
+ background:var(--bg-pill); border:1px solid var(--border-strong);
31790
+ border-radius:6px; padding:2px 7px;
31791
+ }
31792
+ .scope {
31793
+ display:flex; gap:11px; align-items:flex-start; padding:14px 16px; font-size:14px;
31794
+ background:var(--bg-pill); border:1px solid var(--border); border-radius:11px;
31795
+ margin-bottom:22px; color:var(--text-soft);
31796
+ }
31797
+ .scope .dot { width:6px; height:6px; border-radius:50%; background:var(--accent); box-shadow:0 0 8px rgba(245,158,11,.8); flex:none; margin-top:7px; }
31798
+ label { display:block; font-size:13px; font-weight:600; margin-bottom:7px; color:var(--text-soft); }
31799
+ input[type=password] {
31800
+ width:100%; padding:12px 14px; font-size:15px; font-family:inherit;
31801
+ background:var(--bg); color:var(--text);
31802
+ border:1px solid var(--border-strong); border-radius:9px; margin-bottom:20px;
31803
+ }
31804
+ input[type=password]:focus { outline:none; border-color:var(--accent); box-shadow:0 0 0 3px rgba(245,158,11,.15); }
31805
+ .row { display:flex; gap:10px; }
31806
+ button {
31807
+ flex:1; padding:13px; font-size:15px; font-weight:600; font-family:inherit;
31808
+ border-radius:11px; border:1px solid transparent; cursor:pointer;
31809
+ transition:transform .12s, box-shadow .2s, background .2s;
31810
+ }
31811
+ .approve { background:var(--accent); color:#0a0a0f; box-shadow:0 0 40px var(--accent-glow); }
31812
+ .approve:hover { transform:translateY(-1px); box-shadow:0 0 56px rgba(245,158,11,.42); }
31813
+ .deny { background:transparent; color:var(--text); border-color:var(--border-strong); font-weight:500; }
31814
+ .deny:hover { background:rgba(255,255,255,.04); }
31815
+ .err {
31816
+ background:rgba(239,68,68,.1); border:1px solid rgba(239,68,68,.3); color:#fca5a5;
31817
+ padding:11px 14px; border-radius:9px; font-size:14px; margin-bottom:18px;
31818
+ }
31819
+ .foot { margin:22px 0 0; font-size:12.5px; color:var(--text-dim,#52525b); text-align:center; }
31820
+ @media (prefers-reduced-motion: reduce) { button { transition:none; } .approve:hover { transform:none; } }
31821
+ `;
31822
+ var BRAND_MARK = `<span class="brand-mark"><i></i><i class="off"></i><i></i><i></i><i></i><i class="off"></i><i class="off"></i><i></i><i></i></span>`;
31823
+ var shell = (title, body) => `<!doctype html>
31760
31824
  <html lang="en"><head><meta charset="utf-8">
31761
31825
  <meta name="viewport" content="width=device-width,initial-scale=1">
31762
- <title>Authorize access to your brain</title>
31763
- <style>
31764
- :root { color-scheme: light dark; }
31765
- body { font: 16px/1.55 ui-sans-serif, system-ui, -apple-system, sans-serif; margin: 0;
31766
- min-height: 100dvh; display: grid; place-items: center; padding: 24px;
31767
- background: #faf9f7; color: #1a1a1a; }
31768
- @media (prefers-color-scheme: dark) { body { background: #16151a; color: #ececf1; } }
31769
- .card { width: min(420px, 100%); background: light-dark(#fff, #1f1e26); border-radius: 14px;
31770
- padding: 28px; box-shadow: 0 1px 2px rgba(0,0,0,.06), 0 8px 24px rgba(0,0,0,.08); }
31771
- h1 { font-size: 19px; margin: 0 0 6px; letter-spacing: -0.01em; }
31772
- p { margin: 0 0 18px; color: light-dark(#5c5a66, #a5a3b0); font-size: 14.5px; }
31773
- .host { font-weight: 600; color: light-dark(#1a1a1a, #ececf1); }
31774
- .scope { display: flex; gap: 10px; align-items: flex-start; padding: 12px 14px; font-size: 14px;
31775
- background: light-dark(#f4f3f0, #26252e); border-radius: 9px; margin-bottom: 18px; }
31776
- label { display: block; font-size: 13px; font-weight: 600; margin-bottom: 6px; }
31777
- input[type=password] { width: 100%; box-sizing: border-box; padding: 10px 12px; font-size: 15px;
31778
- border: 1px solid light-dark(#dcdae2, #3a3945); border-radius: 8px; margin-bottom: 16px;
31779
- background: light-dark(#fff, #16151a); color: inherit; }
31780
- .row { display: flex; gap: 10px; }
31781
- button { flex: 1; padding: 11px; font-size: 15px; font-weight: 600; border-radius: 8px;
31782
- border: 1px solid transparent; cursor: pointer; font-family: inherit; }
31783
- .approve { background: #6d28d9; color: #fff; }
31784
- .deny { background: transparent; border-color: light-dark(#dcdae2, #3a3945); color: inherit; }
31785
- .err { background: #fee2e2; color: #991b1b; padding: 10px 12px; border-radius: 8px;
31786
- font-size: 14px; margin-bottom: 16px; }
31787
- @media (prefers-color-scheme: dark) { .err { background: #45161a; color: #fca5a5; } }
31788
- </style></head>
31789
- <body><form class="card" method="POST" action="/authorize">
31790
- <h1>Authorize access to your brain</h1>
31791
- <p><span class="host">${esc2(clientHost)}</span> is requesting access to your BrainLLM memory.</p>
31826
+ <meta name="theme-color" content="#0a0a0f">
31827
+ <meta name="robots" content="noindex,nofollow">
31828
+ <title>${esc2(title)}</title>
31829
+ <style>${PAGE_CSS}</style></head>
31830
+ <body>${body}</body></html>`;
31831
+ function consentPage(params, clientHost, error2) {
31832
+ const hidden = Object.entries(params).map(([k, v]) => `<input type="hidden" name="${esc2(k)}" value="${esc2(v)}">`).join("");
31833
+ return shell("Authorize access to your brain", `<form class="card" method="POST" action="/authorize">
31834
+ <div class="brand">${BRAND_MARK}<span class="brand-name">BrainLLM</span></div>
31835
+ <h1>Authorize access</h1>
31836
+ <p><span class="host">${esc2(clientHost)}</span> is requesting access to your brain.</p>
31792
31837
  ${error2 ? `<div class="err">${esc2(error2)}</div>` : ""}
31793
- <div class="scope"><span>\uD83E\uDDE0</span><span>Read and write everything in your brain \u2014 memories, threads, knowledge and your diary.</span></div>
31838
+ <div class="scope"><span class="dot"></span><span>Read and write everything in your brain \u2014 memories, threads, knowledge and your diary.</span></div>
31794
31839
  <label for="pw">Owner password</label>
31795
31840
  <input id="pw" type="password" name="password" autocomplete="current-password" autofocus required>
31796
31841
  ${hidden}
@@ -31798,7 +31843,8 @@ function consentPage(params, clientHost, error2) {
31798
31843
  <button class="deny" type="submit" name="decision" value="deny">Deny</button>
31799
31844
  <button class="approve" type="submit" name="decision" value="approve">Authorize</button>
31800
31845
  </div>
31801
- </form></body></html>`;
31846
+ <p class="foot">Only the host above is shown, and it is the one DNS and TLS vouch for.</p>
31847
+ </form>`);
31802
31848
  }
31803
31849
  var redirectWith = (uri, params) => {
31804
31850
  const u = new URL(uri);
@@ -31806,7 +31852,12 @@ var redirectWith = (uri, params) => {
31806
31852
  u.searchParams.set(k, v);
31807
31853
  return new Response(null, { status: 302, headers: { Location: u.href } });
31808
31854
  };
31809
- var htmlError = (message, status = 400) => new Response(`<!doctype html><meta charset="utf-8"><title>Authorization error</title>` + `<body style="font:16px/1.6 ui-sans-serif,system-ui,sans-serif;max-width:34rem;margin:12vh auto;padding:0 24px">` + `<h1 style="font-size:19px">Authorization error</h1><p>${esc2(message)}</p></body>`, { status, headers: { "Content-Type": "text/html; charset=utf-8" } });
31855
+ var htmlError = (message, status = 400) => new Response(shell("Authorization error", `<div class="card">
31856
+ <div class="brand">${BRAND_MARK}<span class="brand-name">BrainLLM</span></div>
31857
+ <h1>Authorization error</h1>
31858
+ <div class="err">${esc2(message)}</div>
31859
+ <p class="foot">Nothing was authorized. Close this window and start again from your client.</p>
31860
+ </div>`), { status, headers: { "Content-Type": "text/html; charset=utf-8" } });
31810
31861
  async function handleAuthorize(req, base) {
31811
31862
  const url = new URL(req.url);
31812
31863
  const form = req.method === "POST" ? await req.formData() : null;
@@ -32024,7 +32075,7 @@ function createServer(origin = null) {
32024
32075
  const s = new McpServer({
32025
32076
  name: "BrainLLM",
32026
32077
  title: "BrainLLM",
32027
- version: "10.4.1",
32078
+ version: "10.5.0",
32028
32079
  icons: brandingIcons(origin)
32029
32080
  });
32030
32081
  registerTools(s, trilium, brainRef, mode);
package/manifest.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "dxt_version": "0.1",
3
3
  "name": "brainllm",
4
4
  "display_name": "BrainLLM",
5
- "version": "10.4.1",
5
+ "version": "10.5.0",
6
6
  "description": "Turns TriliumNext Notes into a persistent, graph-structured second brain for Claude and other LLM clients.",
7
7
  "long_description": "BrainLLM is an MCP server that organises memory into five purpose-built areas (Master, LLM, Memory, Knowledge, Insights). The model supplies content while the server owns placement, format, lifecycle, dates and backups. Includes a full raw ETAPI surface for advanced use. Requires a running TriliumNext instance and the Bun runtime.",
8
8
  "author": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "brainllm",
3
- "version": "10.4.1",
3
+ "version": "10.5.0",
4
4
  "mcpName": "io.github.miisodev/brainllm",
5
5
  "description": "MCP server that turns TriliumNext Notes into a persistent, graph-structured second brain for Claude and other LLM clients.",
6
6
  "author": "Kevin Miiso Novo <miisodev@gmail.com>",
package/server.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
3
  "name": "io.github.miisodev/brainllm",
4
4
  "description": "Persistent graph-structured memory for LLMs in TriliumNext Notes — readable and editable by humans.",
5
- "version": "10.4.1",
5
+ "version": "10.5.0",
6
6
  "websiteUrl": "https://github.com/miisodev/BrainLLM#readme",
7
7
  "repository": {
8
8
  "url": "https://github.com/miisodev/BrainLLM",
@@ -12,7 +12,7 @@
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "brainllm",
15
- "version": "10.4.1",
15
+ "version": "10.5.0",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  },