total-recall-brain 3.41.5 → 3.41.6

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 (131) hide show
  1. package/bin/total-recall.mjs +7 -4
  2. package/frontend/dist/assets/index-4tGQfTa2.js +5605 -0
  3. package/frontend/dist/assets/index-DtwsDyFM.css +1 -0
  4. package/frontend/dist/index.html +2 -2
  5. package/frontend/package.json +11 -0
  6. package/frontend/src/App.tsx +47 -122
  7. package/frontend/src/components/plugins/plugin-frame.ts +1 -0
  8. package/frontend/src/index.css +152 -86
  9. package/frontend/src/pages/HelpPage.tsx +13 -10
  10. package/frontend/src/pages/MemoryPage.tsx +28 -30
  11. package/frontend/src/pages/NetworkPage.tsx +3 -3
  12. package/frontend/src/pages/PluginsPage.tsx +6 -5
  13. package/frontend/src/pages/RulesPage.tsx +16 -12
  14. package/package.json +3 -2
  15. package/scaffold/.agent/skills/total-recall/plugins/code-quality/package-lock.json +8 -8
  16. package/scaffold/.agent/skills/total-recall/plugins/code-quality/package.json +3 -0
  17. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package-lock.json +8 -8
  18. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package.json +3 -0
  19. package/scaffold/.agent/skills/total-recall/plugins/embeddings/package-lock.json +8 -8
  20. package/scaffold/.agent/skills/total-recall/plugins/embeddings/package.json +3 -0
  21. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/package-lock.json +8 -8
  22. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/package.json +3 -0
  23. package/scaffold/.agent/skills/total-recall/plugins/mesh/package-lock.json +8 -8
  24. package/scaffold/.agent/skills/total-recall/plugins/mesh/package.json +4 -1
  25. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/mesh.mjs +1 -1
  26. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/capability/index.mjs +136 -7
  27. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/cli.mjs +135 -26
  28. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/package-lock.json +8 -8
  29. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/package.json +4 -1
  30. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/plugin.json +228 -9
  31. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/skills/meta-harness/SKILL.md +24 -30
  32. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/alerts.mjs +29 -16
  33. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/cascade.mjs +73 -0
  34. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/coordinator.mjs +182 -365
  35. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/dispatch.mjs +33 -0
  36. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/documentation.mjs +9 -3
  37. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/executor.mjs +4 -4
  38. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/agy.mjs +187 -0
  39. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/claude.mjs +275 -0
  40. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/cline.mjs +132 -0
  41. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/codex.mjs +187 -0
  42. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/cursor.mjs +158 -0
  43. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/devin.mjs +157 -0
  44. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/dsh.mjs +183 -0
  45. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/grok.mjs +132 -0
  46. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/hermes.mjs +173 -0
  47. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/index.mjs +87 -0
  48. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/openclaw.mjs +173 -0
  49. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/pi.mjs +129 -0
  50. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate.mjs +12 -0
  51. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/json-reply.mjs +22 -0
  52. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/learner.mjs +72 -70
  53. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/model-catalog.mjs +195 -0
  54. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/paths.mjs +11 -0
  55. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/pool.mjs +36 -0
  56. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/review.mjs +169 -0
  57. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/router.mjs +136 -346
  58. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/runtime.mjs +1 -1
  59. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/ssss-store.mjs +20 -0
  60. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/telemetry.mjs +43 -0
  61. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/threads.mjs +156 -0
  62. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/worker.mjs +117 -35
  63. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/worktree.mjs +51 -0
  64. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/card.js +398 -57
  65. package/scaffold/.agent/skills/total-recall/plugins/openwiki/cli.mjs +10 -0
  66. package/scaffold/.agent/skills/total-recall/plugins/openwiki/package-lock.json +3 -3
  67. package/scaffold/.agent/skills/total-recall/plugins/openwiki/package.json +3 -0
  68. package/scaffold/.agent/skills/total-recall/plugins/openwiki/plugin.json +42 -190
  69. package/scaffold/.agent/skills/total-recall/plugins/openwiki/vendor/openwiki.mjs +1 -1
  70. package/scaffold/.agent/skills/total-recall/plugins/openwiki/vendor/skills/mermaid-diagrams/SKILL.md +44 -0
  71. package/scaffold/.agent/skills/total-recall/plugins/openwiki/vendor/skills/write-connector/SKILL.md +56 -0
  72. package/scaffold/.agent/skills/total-recall/plugins/security/package-lock.json +8 -8
  73. package/scaffold/.agent/skills/total-recall/plugins/security/package.json +3 -0
  74. package/src/cli/agent.mjs +12 -1
  75. package/src/cli/compact.mjs +2 -2
  76. package/src/cli/connect.mjs +56 -1
  77. package/src/cli/context.mjs +10 -7
  78. package/src/cli/doctor.mjs +5 -2
  79. package/src/cli/harness.mjs +62 -50
  80. package/src/cli/memory-entry.mjs +2 -2
  81. package/src/cli/preflight.mjs +152 -16
  82. package/src/cli/remember.mjs +19 -1
  83. package/src/cli/rules.mjs +54 -12
  84. package/src/cli/startup.mjs +1 -1
  85. package/src/cli/status.mjs +12 -2
  86. package/src/core/claude-hooks.mjs +41 -3
  87. package/src/core/cli-semantic-index.mjs +3 -2
  88. package/src/core/conflict-detector.mjs +23 -12
  89. package/src/core/context-compactor.mjs +2 -0
  90. package/src/core/context-policy.mjs +20 -0
  91. package/src/core/duplicate-guard.mjs +350 -0
  92. package/src/core/meta-harness.mjs +31 -11
  93. package/src/core/preflight-gate.mjs +2 -2
  94. package/src/core/preflight-receipt.mjs +28 -0
  95. package/src/core/scaffold-plugins.mjs +7 -0
  96. package/src/core/stdio-flush.mjs +23 -0
  97. package/src/core/surface.mjs +33 -10
  98. package/src/server/routes/plugins.mjs +2 -2
  99. package/frontend/dist/assets/index-BIQmqDKP.css +0 -1
  100. package/frontend/dist/assets/index-WT3gs-x6.js +0 -5631
  101. package/frontend/src/components/DaemonLogsTab.tsx +0 -54
  102. package/frontend/src/components/ResearchAgendaTab.tsx +0 -712
  103. package/frontend/src/components/TaskQueueTab.tsx +0 -193
  104. package/frontend/src/components/VoiceInput.tsx +0 -112
  105. package/frontend/src/pages/ChatPage.tsx +0 -1059
  106. package/frontend/src/pages/CollabPage.tsx +0 -470
  107. package/frontend/src/pages/DesignDocsPage.tsx +0 -621
  108. package/frontend/src/pages/FilesPage.tsx +0 -393
  109. package/frontend/src/pages/HealthPage.tsx +0 -359
  110. package/frontend/src/pages/InboxPage.tsx +0 -83
  111. package/frontend/src/pages/InstructionsPage.tsx +0 -583
  112. package/frontend/src/pages/IntegrationsPage.tsx +0 -761
  113. package/frontend/src/pages/MeshPage.css +0 -58
  114. package/frontend/src/pages/MeshPage.tsx +0 -1219
  115. package/frontend/src/pages/OkfPage.tsx +0 -535
  116. package/frontend/src/pages/SandboxPage.tsx +0 -113
  117. package/frontend/src/pages/SkillsPage.tsx +0 -1994
  118. package/frontend/src/pages/TasksPage.tsx +0 -427
  119. package/frontend/src/pages/UsagePage.tsx +0 -702
  120. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/README.md +0 -65
  121. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/cli.mjs +0 -76
  122. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/package.json +0 -19
  123. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/plugin.json +0 -266
  124. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/adapters/dsh.mjs +0 -446
  125. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/documentation.mjs +0 -152
  126. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/executor.mjs +0 -71
  127. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/runtime.mjs +0 -36
  128. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/setup.mjs +0 -35
  129. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/worker.mjs +0 -175
  130. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/ui/DESIGN.md +0 -32
  131. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/ui/card.js +0 -575
@@ -1,6 +1,6 @@
1
1
  import { useState, useEffect, useCallback } from "react"
2
2
  import { useSearchParams } from "react-router-dom"
3
- import { listMemory, searchMemory, readMemory, fetchConflicts, resolveConflict, saveMemory, createMemory, deleteMemory, fetchSessions, deleteSession } from "../api"
3
+ import { listMemory, searchMemory, readMemory, fetchConflicts, resolveConflict, saveMemory, createMemory, deleteMemory, fetchSessions, deleteSession, getApiBase } from "../api"
4
4
  import type { MemoryNode, Conflict } from "../types"
5
5
  import type { SessionSummary } from "../api"
6
6
 
@@ -297,9 +297,10 @@ export default function MemoryPage({ activeBrainId }: { activeBrainId?: string }
297
297
  }
298
298
  }, [urlSlug, activeBrainId, nodes])
299
299
 
300
- // Wire SSE Live Agent Monitor Streaming (Port 9111)
300
+ // Wire SSE Live Agent Monitor Streaming
301
301
  useEffect(() => {
302
- const sseUrl = "http://localhost:9111/stream"
302
+ const base = getApiBase() || window.location.origin
303
+ const sseUrl = `${base.replace(/\/+$/, '')}/stream`
303
304
  const eventSource = new EventSource(sseUrl)
304
305
 
305
306
  eventSource.onmessage = (event) => {
@@ -529,9 +530,9 @@ export default function MemoryPage({ activeBrainId }: { activeBrainId?: string }
529
530
 
530
531
  {/* Action Buttons */}
531
532
  <div style={{ display: "flex", justifyContent: "flex-end", gap: 12, marginTop: 12 }}>
532
- <button className="btn btn-ghost" type="button" onClick={onCancel} style={{ fontSize: 13 }}>Cancel</button>
533
- <button className="btn btn-purple" type="button" onClick={onSubmit} style={{ fontSize: 13 }}>
534
- {isNew ? "🚀 Create Memory Node" : "💾 Save Changes"}
533
+ <button className="btn btn-ghost" type="button" onClick={onCancel} style={{ fontSize: 13, minHeight: 44, padding: "0 18px", borderRadius: "var(--radius-md, 10px)" }}>Cancel</button>
534
+ <button className="btn btn-purple" type="button" onClick={onSubmit} style={{ fontSize: 13, minHeight: 44, padding: "0 18px", borderRadius: "var(--radius-md, 10px)" }}>
535
+ {isNew ? "Create Memory Node" : "Save Changes"}
535
536
  </button>
536
537
  </div>
537
538
  </div>
@@ -552,20 +553,20 @@ export default function MemoryPage({ activeBrainId }: { activeBrainId?: string }
552
553
  </div>
553
554
 
554
555
  {/* Tab Selection */}
555
- <div style={{ display: "flex", background: "rgba(255,255,255,0.03)", padding: 4, borderRadius: 8, border: "1px solid var(--border)" }}>
556
+ <div style={{ display: "flex", background: "rgba(12, 18, 32, 0.72)", backdropFilter: "blur(16px)", padding: 4, borderRadius: "var(--radius-md, 10px)", border: "1px solid var(--border)" }}>
556
557
  <button
557
558
  className={`btn btn-sm ${activeTab === "vault" ? "btn-purple" : "btn-ghost"}`}
558
559
  onClick={() => { setActiveTab("vault"); setSelected(null); setSearchParams({}); }}
559
- style={{ borderRadius: 6, fontSize: 12, padding: "6px 12px" }}
560
+ style={{ borderRadius: 6, fontSize: 12, minHeight: 36, padding: "6px 14px", fontWeight: 600 }}
560
561
  >
561
- 🧠 Active Nodes
562
+ Active Nodes
562
563
  </button>
563
564
  <button
564
565
  className={`btn btn-sm ${activeTab === "conflicts" ? "btn-cyan" : "btn-ghost"}`}
565
566
  onClick={() => { setActiveTab("conflicts"); setSelected(null); setSearchParams({}); }}
566
- style={{ borderRadius: 6, fontSize: 12, padding: "6px 12px", display: "flex", alignItems: "center", gap: 6 }}
567
+ style={{ borderRadius: 6, fontSize: 12, minHeight: 36, padding: "6px 14px", fontWeight: 600, display: "flex", alignItems: "center", gap: 6 }}
567
568
  >
568
- ⚠️ Quarantined Conflicts
569
+ Quarantined Conflicts
569
570
  {conflicts.length > 0 && (
570
571
  <span style={{ background: "#ef4444", color: "#fff", fontSize: 9, padding: "1px 5px", borderRadius: 10, fontWeight: 700 }}>
571
572
  {conflicts.length}
@@ -575,9 +576,9 @@ export default function MemoryPage({ activeBrainId }: { activeBrainId?: string }
575
576
  <button
576
577
  className={`btn btn-sm ${activeTab === "sessions" ? "btn-purple" : "btn-ghost"}`}
577
578
  onClick={() => { setActiveTab("sessions"); setSelected(null); setSearchParams({}); }}
578
- style={{ borderRadius: 6, fontSize: 12, padding: "6px 12px" }}
579
+ style={{ borderRadius: 6, fontSize: 12, minHeight: 36, padding: "6px 14px", fontWeight: 600 }}
579
580
  >
580
- 📝 Sessions
581
+ Sessions
581
582
  {sessionsTotal > 0 && (
582
583
  <span style={{ background: "rgba(139,92,246,0.3)", color: "#a78bfa", fontSize: 9, padding: "1px 5px", borderRadius: 10, fontWeight: 700, marginLeft: 4 }}>
583
584
  {sessionsTotal}
@@ -587,7 +588,7 @@ export default function MemoryPage({ activeBrainId }: { activeBrainId?: string }
587
588
  </div>
588
589
  </div>
589
590
 
590
- {error && <div className="badge badge-error" style={{ alignSelf: "flex-start", marginBottom: 15 }}>⚠️ {error}</div>}
591
+ {error && <div className="badge badge-error" style={{ alignSelf: "flex-start", marginBottom: 15 }}>{error}</div>}
591
592
 
592
593
  {activeTab === "vault" ? (
593
594
  <div className="memory-layout">
@@ -599,7 +600,7 @@ export default function MemoryPage({ activeBrainId }: { activeBrainId?: string }
599
600
  className={`category-btn ${category === c ? "active" : ""}`}
600
601
  onClick={() => { setCategory(c); setSearchParams({}); setIsCreating(false); setIsEditing(false); }}
601
602
  >
602
- <span>{c === "all" ? "📋 All Nodes" : c}</span>
603
+ <span>{c === "all" ? "All Nodes" : c}</span>
603
604
  {c === "all"
604
605
  ? <span className="category-count">{nodes.length}</span>
605
606
  : categoryCounts[c]
@@ -611,7 +612,7 @@ export default function MemoryPage({ activeBrainId }: { activeBrainId?: string }
611
612
 
612
613
  <button
613
614
  className="btn btn-purple"
614
- style={{ width: "100%", marginTop: 20, display: "flex", alignItems: "center", justifyContent: "center", gap: 8, fontSize: 13 }}
615
+ style={{ width: "100%", marginTop: 20, display: "flex", alignItems: "center", justifyContent: "center", gap: 8, fontSize: 13, minHeight: 44, borderRadius: "var(--radius-md, 10px)", fontWeight: 600 }}
615
616
  onClick={() => {
616
617
  setSelected(null);
617
618
  setSearchParams({});
@@ -632,7 +633,7 @@ export default function MemoryPage({ activeBrainId }: { activeBrainId?: string }
632
633
  setEditSupersedes("");
633
634
  }}
634
635
  >
635
- ➕ Create New Node
636
+ Create New Node
636
637
  </button>
637
638
  </div>
638
639
  <div className="memory-main">
@@ -710,14 +711,14 @@ export default function MemoryPage({ activeBrainId }: { activeBrainId?: string }
710
711
  }}
711
712
  style={{ fontSize: 12, border: "1px solid var(--border)" }}
712
713
  >
713
- ✏️ Edit Node
714
+ Edit Node
714
715
  </button>
715
716
  <button
716
717
  className="btn btn-ghost btn-sm"
717
718
  onClick={() => handleDelete(selected.slug)}
718
- style={{ fontSize: 12, borderColor: "rgba(239,68,68,0.2)", color: "#fca5a5" }}
719
+ style={{ fontSize: 12, minHeight: 36, padding: "0 12px", borderColor: "rgba(239,68,68,0.2)", color: "#fca5a5" }}
719
720
  >
720
- 🗑️ Delete
721
+ Delete
721
722
  </button>
722
723
  </div>
723
724
  </div>
@@ -900,13 +901,13 @@ export default function MemoryPage({ activeBrainId }: { activeBrainId?: string }
900
901
  )}
901
902
  </div>
902
903
  <div style={{ display: "flex", flexWrap: "wrap", gap: 16, fontSize: 11, color: "var(--text-tertiary)", marginTop: 8 }}>
903
- <span>📂 {n.category}</span>
904
+ <span>{n.category}</span>
904
905
  {n.importance !== undefined && (
905
906
  <span style={{ color: "#fbbf24" }}>★ {n.importance}/5</span>
906
907
  )}
907
908
  {n.confidence !== undefined && (
908
909
  <span style={{ display: "flex", alignItems: "center", gap: 4 }}>
909
- 🧠 {Math.round(n.confidence * 100)}%
910
+ {Math.round(n.confidence * 100)}%
910
911
  </span>
911
912
  )}
912
913
  </div>
@@ -929,8 +930,7 @@ export default function MemoryPage({ activeBrainId }: { activeBrainId?: string }
929
930
 
930
931
  {conflicts.length === 0 ? (
931
932
  <div style={{ textAlign: "center", padding: 60, background: "rgba(255,255,255,0.02)", borderRadius: 12, border: "1px dashed var(--border)", color: "var(--text-tertiary)" }}>
932
- <span style={{ fontSize: 32, display: "block", marginBottom: 12 }}>🛡️</span>
933
- <h4 style={{ color: "#fff", marginBottom: 6 }}>All Clear!</h4>
933
+ <h4 style={{ color: "#fff", marginBottom: 6 }}>All Clear</h4>
934
934
  No memory conflicts enqueued or quarantined in `.agent/memory-inbox/conflicts/`.
935
935
  </div>
936
936
  ) : (
@@ -1040,8 +1040,8 @@ export default function MemoryPage({ activeBrainId }: { activeBrainId?: string }
1040
1040
  {activeTab === "sessions" && (
1041
1041
  <div className="health-log" style={{ background: "rgba(15,23,42,0.45)", backdropFilter: "blur(12px)", border: "1px solid var(--border)", borderRadius: 12, padding: 24 }}>
1042
1042
  <div style={{ display: "flex", justifyContent: "space-between", alignItems: "center", marginBottom: 16 }}>
1043
- <h2 style={{ margin: 0, color: "#fff", fontSize: 16 }}>📝 IDE Sessions ({sessionsTotal})</h2>
1044
- <button className="btn btn-ghost btn-sm" onClick={loadSessions} style={{ fontSize: 12 }}>🔄 Refresh</button>
1043
+ <h2 style={{ margin: 0, color: "#fff", fontSize: 16 }}>IDE Sessions ({sessionsTotal})</h2>
1044
+ <button className="btn btn-ghost btn-sm" onClick={loadSessions} style={{ fontSize: 12, minHeight: 36, padding: "0 12px" }}>Refresh</button>
1045
1045
  </div>
1046
1046
 
1047
1047
  {sessionsLoading ? (
@@ -1050,7 +1050,6 @@ export default function MemoryPage({ activeBrainId }: { activeBrainId?: string }
1050
1050
  </div>
1051
1051
  ) : sessionsList.length === 0 ? (
1052
1052
  <div style={{ textAlign: "center", padding: 40, color: "var(--text-tertiary)" }}>
1053
- <span style={{ fontSize: 32, display: "block", marginBottom: 8 }}>📝</span>
1054
1053
  No sessions ingested yet. Sessions appear here when the relay ships IDE conversation data.
1055
1054
  </div>
1056
1055
  ) : (
@@ -1072,7 +1071,6 @@ export default function MemoryPage({ activeBrainId }: { activeBrainId?: string }
1072
1071
  codex: "#10b981",
1073
1072
  vscode: "#3b82f6",
1074
1073
  cursor: "#06b6d4",
1075
- "gemini-cli": "#ec4899",
1076
1074
  }
1077
1075
  const color = sourceColors[s.source || ""] || "var(--text-secondary)"
1078
1076
  return (
@@ -1106,9 +1104,9 @@ export default function MemoryPage({ activeBrainId }: { activeBrainId?: string }
1106
1104
  <button
1107
1105
  className="btn btn-ghost btn-sm"
1108
1106
  onClick={() => handleDeleteSession(s.id)}
1109
- style={{ fontSize: 10, padding: "2px 6px", color: "#fca5a5", borderColor: "rgba(239,68,68,0.2)" }}
1107
+ style={{ fontSize: 11, padding: "4px 8px", color: "#fca5a5", borderColor: "rgba(239,68,68,0.2)" }}
1110
1108
  >
1111
- 🗑️
1109
+ Delete
1112
1110
  </button>
1113
1111
  </td>
1114
1112
  </tr>
@@ -199,7 +199,7 @@ export default function NetworkPage() {
199
199
  {/* Firewall Blocklist */}
200
200
  <div className="card">
201
201
  <div className="section-title">
202
- 🛡️ Firewall Blocklist
202
+ Firewall Blocklist
203
203
  <span className="badge badge-warning">{policy?.blocked_domains?.length ?? 0}</span>
204
204
  </div>
205
205
 
@@ -247,7 +247,7 @@ export default function NetworkPage() {
247
247
 
248
248
  {/* Global Limits Editor */}
249
249
  <div className="card">
250
- <div className="section-title">⚙️ Global Limits</div>
250
+ <div className="section-title">Global Limits</div>
251
251
  <div className="limits-form">
252
252
  <div className="limits-row">
253
253
  <span className="limits-label">Max Global Concurrency</span>
@@ -302,7 +302,7 @@ export default function NetworkPage() {
302
302
 
303
303
  {/* Audit Log */}
304
304
  <div className="card network-section-full">
305
- <div className="section-title">📋 Audit Log</div>
305
+ <div className="section-title">Audit Log</div>
306
306
 
307
307
  <div className="audit-filters">
308
308
  <input
@@ -632,17 +632,18 @@ export default function PluginsPage({ activeBrainId }: PluginsPageProps) {
632
632
 
633
633
  const closeDetail = () => {
634
634
  setDetail(null)
635
- if (searchParams.has("id")) {
635
+ if (searchParams.has("id") || searchParams.has("plugin")) {
636
636
  const next = new URLSearchParams(searchParams)
637
637
  next.delete("id")
638
+ next.delete("plugin")
638
639
  setSearchParams(next)
639
640
  }
640
641
  }
641
642
 
642
643
  useEffect(() => {
643
- const id = searchParams.get("id")
644
+ const id = searchParams.get("id") || searchParams.get("plugin")
644
645
  if (!id || detail?.id === id) return
645
- const match = installed.find((p) => p.id === id)
646
+ const match = installed.find((p) => p.id === id || p.id === `tr-plugin-${id}` || p.name === id)
646
647
  if (match) openDetail(match)
647
648
  // eslint-disable-next-line react-hooks/exhaustive-deps
648
649
  }, [searchParams, installed])
@@ -1331,14 +1332,14 @@ export default function PluginsPage({ activeBrainId }: PluginsPageProps) {
1331
1332
 
1332
1333
  <div style={{ display: "grid", gridTemplateColumns: "1fr 1fr", gap: "12px" }}>
1333
1334
  <div style={{ background: "var(--bg-tertiary)", padding: "12px", borderRadius: "8px", border: "1px solid var(--border)" }}>
1334
- <div style={{ fontWeight: 600, color: "#38bdf8", marginBottom: "4px" }}>🔒 Private Plugins</div>
1335
+ <div style={{ fontWeight: 600, color: "#38bdf8", marginBottom: "4px" }}>Private Plugins</div>
1335
1336
  <div style={{ ...muted, fontSize: "12px", lineHeight: 1.4 }}>
1336
1337
  Store directly inside <code style={mono}>.agent/skills/total-recall/plugins/&lt;id&gt;</code> or link locally. Never shared outside this machine or project. Zero cloud exposure.
1337
1338
  </div>
1338
1339
  </div>
1339
1340
 
1340
1341
  <div style={{ background: "var(--bg-tertiary)", padding: "12px", borderRadius: "8px", border: "1px solid var(--border)" }}>
1341
- <div style={{ fontWeight: 600, color: "#a855f7", marginBottom: "4px" }}>🌐 Plugin Store Distribution</div>
1342
+ <div style={{ fontWeight: 600, color: "#a855f7", marginBottom: "4px" }}>Plugin Store Distribution</div>
1342
1343
  <div style={{ ...muted, fontSize: "12px", lineHeight: 1.4 }}>
1343
1344
  Deploy to the store via <code style={mono}>total-recall deploy-store &lt;id&gt;</code>. Cryptographically signed and distributed across the mesh for team consumption.
1344
1345
  </div>
@@ -81,21 +81,25 @@ export default function RulesPage({ activeBrainId }: { activeBrainId: string })
81
81
  key={`${rule.scope}:${rule.slug}`}
82
82
  data-testid="rule-card"
83
83
  style={{
84
- border: `1px solid ${isArchived ? 'var(--border)' : colorCode}`,
84
+ border: `1px solid ${isArchived ? 'rgba(148, 163, 184, 0.12)' : colorCode}`,
85
85
  opacity: isArchived ? 0.6 : 1,
86
- borderRadius: 8,
87
- padding: 16,
88
- marginBottom: 12,
89
- background: 'var(--bg-secondary)',
86
+ borderRadius: 12,
87
+ padding: 18,
88
+ marginBottom: 14,
89
+ background: 'rgba(12, 18, 32, 0.72)',
90
+ backdropFilter: 'blur(16px)',
91
+ WebkitBackdropFilter: 'blur(16px)',
92
+ boxShadow: '0 4px 16px rgba(0, 0, 0, 0.25)',
90
93
  display: 'flex',
91
94
  flexDirection: 'column',
92
- gap: 8,
95
+ gap: 10,
96
+ transition: 'all var(--transition-fast)',
93
97
  }}
94
98
  >
95
99
  <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
96
- <h4 style={{ margin: 0, fontSize: 16, color: 'var(--text-primary)' }}>{rule.title}</h4>
100
+ <h4 style={{ margin: 0, fontSize: 16, fontWeight: 600, color: 'var(--text-primary)' }}>{rule.title}</h4>
97
101
  <div style={{ display: 'flex', gap: 8, alignItems: 'center' }}>
98
- <span style={{ fontSize: 12, color: 'var(--text-tertiary)', background: 'var(--bg-primary)', padding: '2px 6px', borderRadius: 4 }}>
102
+ <span style={{ fontSize: 11, fontWeight: 500, color: 'var(--text-secondary)', background: 'rgba(148, 163, 184, 0.12)', border: '1px solid rgba(148, 163, 184, 0.15)', padding: '2px 8px', borderRadius: 6 }}>
99
103
  {rule.scope} brain
100
104
  </span>
101
105
  <span style={{ fontSize: 12, color: 'gold' }} aria-label={`Importance ${stars} of 5`}>
@@ -103,21 +107,21 @@ export default function RulesPage({ activeBrainId }: { activeBrainId: string })
103
107
  </span>
104
108
  </div>
105
109
  </div>
106
- <div style={{ fontSize: 14, color: 'var(--text-secondary)', whiteSpace: 'pre-wrap' }}>
110
+ <div style={{ fontSize: 13.5, lineHeight: 1.6, color: 'var(--text-secondary)', whiteSpace: 'pre-wrap' }}>
107
111
  {rule.body || '(no body)'}
108
112
  </div>
109
- <div style={{ display: 'flex', justifyContent: 'flex-end', marginTop: 8 }}>
113
+ <div style={{ display: 'flex', justifyContent: 'flex-end', marginTop: 6 }}>
110
114
  {isArchived ? (
111
115
  <button
112
116
  onClick={() => handleRestore(rule)}
113
- style={{ padding: '4px 8px', borderRadius: 4, background: 'var(--bg-primary)', border: '1px solid var(--border)', cursor: 'pointer', color: 'var(--text-primary)' }}
117
+ style={{ padding: '6px 12px', borderRadius: 6, background: 'rgba(148, 163, 184, 0.1)', border: '1px solid var(--border)', cursor: 'pointer', color: 'var(--text-primary)', fontSize: 12, fontWeight: 500 }}
114
118
  >
115
119
  Restore
116
120
  </button>
117
121
  ) : (
118
122
  <button
119
123
  onClick={() => handleArchive(rule)}
120
- style={{ padding: '4px 8px', borderRadius: 4, background: 'var(--bg-primary)', border: '1px solid var(--border)', cursor: 'pointer', color: 'var(--text-primary)' }}
124
+ style={{ padding: '6px 12px', borderRadius: 6, background: 'rgba(148, 163, 184, 0.1)', border: '1px solid var(--border)', cursor: 'pointer', color: 'var(--text-primary)', fontSize: 12, fontWeight: 500 }}
121
125
  >
122
126
  Archive
123
127
  </button>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "total-recall-brain",
3
- "version": "3.41.5",
3
+ "version": "3.41.6",
4
4
  "description": "The Vibe Coding Brain & Autonomous Software Factory: memory, rules, secrets, and 33 visual plugins automatically managed across all your devices.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -121,6 +121,7 @@
121
121
  },
122
122
  "overrides": {
123
123
  "proxy-addr": "2.0.8",
124
- "argparse": "2.0.1"
124
+ "argparse": "2.0.1",
125
+ "minimatch": "^11.0.4"
125
126
  }
126
127
  }
@@ -12,7 +12,7 @@
12
12
  "@gregiteen/ssss-cli": "0.14.4"
13
13
  },
14
14
  "devDependencies": {
15
- "total-recall-brain": "3.41.4"
15
+ "total-recall-brain": "3.41.5"
16
16
  }
17
17
  },
18
18
  "node_modules/@alcalzone/ansi-tokenize": {
@@ -1580,9 +1580,9 @@
1580
1580
  },
1581
1581
  "node_modules/@ssss/cli": {
1582
1582
  "name": "@gregiteen/ssss-cli",
1583
- "version": "0.14.3",
1584
- "resolved": "https://registry.npmjs.org/@gregiteen/ssss-cli/-/ssss-cli-0.14.3.tgz",
1585
- "integrity": "sha512-vvGgiNLjus3/xp+iotiGqbSG0R7+Q/bP5cP2Psa7Rhtm/vrMuM5B4LebYu7bPf3TzgCyTbv96PcxGWf6gxbW0Q==",
1583
+ "version": "0.14.4",
1584
+ "resolved": "https://registry.npmjs.org/@gregiteen/ssss-cli/-/ssss-cli-0.14.4.tgz",
1585
+ "integrity": "sha512-R6JIgPRvS9xXp0xb6BYO3rauv+72r35GIiDrJcvbjPdTSHFZXr8/jRxFOgoF8yTed/5xyGFF3ey3DI9bOjmHVA==",
1586
1586
  "dev": true,
1587
1587
  "license": "ISC",
1588
1588
  "bin": {
@@ -5543,9 +5543,9 @@
5543
5543
  }
5544
5544
  },
5545
5545
  "node_modules/total-recall-brain": {
5546
- "version": "3.41.4",
5547
- "resolved": "https://registry.npmjs.org/total-recall-brain/-/total-recall-brain-3.41.4.tgz",
5548
- "integrity": "sha512-xn6Ye5R/fHT7JP/ZjNJwmpteG/jcD9dzErbYwE46ZGThVaGsP1H81avSn0ZOAuLdUFRSgsoEijiAEHSaUA/4uQ==",
5546
+ "version": "3.41.5",
5547
+ "resolved": "https://registry.npmjs.org/total-recall-brain/-/total-recall-brain-3.41.5.tgz",
5548
+ "integrity": "sha512-gaW46xAtnFf+zfkv8LHYQLMzt27JjelyFggc8zAZafCnCJRbNSP8D02cbbcx49f3a70t/hkgA9RhJOY8HTqRFg==",
5549
5549
  "dev": true,
5550
5550
  "license": "MIT",
5551
5551
  "workspaces": [
@@ -5553,7 +5553,7 @@
5553
5553
  ],
5554
5554
  "dependencies": {
5555
5555
  "@simplewebauthn/server": "^13.3.2",
5556
- "@ssss/cli": "npm:@gregiteen/ssss-cli@0.14.3",
5556
+ "@ssss/cli": "npm:@gregiteen/ssss-cli@0.14.4",
5557
5557
  "bcrypt": "^6.0.0",
5558
5558
  "better-sqlite3": "^12.11.1",
5559
5559
  "cookie-parser": "^1.4.7",
@@ -24,5 +24,8 @@
24
24
  ],
25
25
  "publishConfig": {
26
26
  "access": "public"
27
+ },
28
+ "overrides": {
29
+ "@ssss/cli": "npm:@gregiteen/ssss-cli@0.14.4"
27
30
  }
28
31
  }
@@ -12,7 +12,7 @@
12
12
  "@gregiteen/ssss-cli": "0.14.4"
13
13
  },
14
14
  "devDependencies": {
15
- "total-recall-brain": "3.41.4"
15
+ "total-recall-brain": "3.41.5"
16
16
  }
17
17
  },
18
18
  "node_modules/@alcalzone/ansi-tokenize": {
@@ -1580,9 +1580,9 @@
1580
1580
  },
1581
1581
  "node_modules/@ssss/cli": {
1582
1582
  "name": "@gregiteen/ssss-cli",
1583
- "version": "0.14.3",
1584
- "resolved": "https://registry.npmjs.org/@gregiteen/ssss-cli/-/ssss-cli-0.14.3.tgz",
1585
- "integrity": "sha512-vvGgiNLjus3/xp+iotiGqbSG0R7+Q/bP5cP2Psa7Rhtm/vrMuM5B4LebYu7bPf3TzgCyTbv96PcxGWf6gxbW0Q==",
1583
+ "version": "0.14.4",
1584
+ "resolved": "https://registry.npmjs.org/@gregiteen/ssss-cli/-/ssss-cli-0.14.4.tgz",
1585
+ "integrity": "sha512-R6JIgPRvS9xXp0xb6BYO3rauv+72r35GIiDrJcvbjPdTSHFZXr8/jRxFOgoF8yTed/5xyGFF3ey3DI9bOjmHVA==",
1586
1586
  "dev": true,
1587
1587
  "license": "ISC",
1588
1588
  "bin": {
@@ -5543,9 +5543,9 @@
5543
5543
  }
5544
5544
  },
5545
5545
  "node_modules/total-recall-brain": {
5546
- "version": "3.41.4",
5547
- "resolved": "https://registry.npmjs.org/total-recall-brain/-/total-recall-brain-3.41.4.tgz",
5548
- "integrity": "sha512-xn6Ye5R/fHT7JP/ZjNJwmpteG/jcD9dzErbYwE46ZGThVaGsP1H81avSn0ZOAuLdUFRSgsoEijiAEHSaUA/4uQ==",
5546
+ "version": "3.41.5",
5547
+ "resolved": "https://registry.npmjs.org/total-recall-brain/-/total-recall-brain-3.41.5.tgz",
5548
+ "integrity": "sha512-gaW46xAtnFf+zfkv8LHYQLMzt27JjelyFggc8zAZafCnCJRbNSP8D02cbbcx49f3a70t/hkgA9RhJOY8HTqRFg==",
5549
5549
  "dev": true,
5550
5550
  "license": "MIT",
5551
5551
  "workspaces": [
@@ -5553,7 +5553,7 @@
5553
5553
  ],
5554
5554
  "dependencies": {
5555
5555
  "@simplewebauthn/server": "^13.3.2",
5556
- "@ssss/cli": "npm:@gregiteen/ssss-cli@0.14.3",
5556
+ "@ssss/cli": "npm:@gregiteen/ssss-cli@0.14.4",
5557
5557
  "bcrypt": "^6.0.0",
5558
5558
  "better-sqlite3": "^12.11.1",
5559
5559
  "cookie-parser": "^1.4.7",
@@ -27,5 +27,8 @@
27
27
  ],
28
28
  "publishConfig": {
29
29
  "access": "public"
30
+ },
31
+ "overrides": {
32
+ "@ssss/cli": "npm:@gregiteen/ssss-cli@0.14.4"
30
33
  }
31
34
  }
@@ -12,7 +12,7 @@
12
12
  "@gregiteen/ssss-cli": "0.14.4"
13
13
  },
14
14
  "devDependencies": {
15
- "total-recall-brain": "3.41.4"
15
+ "total-recall-brain": "3.41.5"
16
16
  }
17
17
  },
18
18
  "node_modules/@alcalzone/ansi-tokenize": {
@@ -1590,9 +1590,9 @@
1590
1590
  },
1591
1591
  "node_modules/@ssss/cli": {
1592
1592
  "name": "@gregiteen/ssss-cli",
1593
- "version": "0.14.3",
1594
- "resolved": "https://registry.npmjs.org/@gregiteen/ssss-cli/-/ssss-cli-0.14.3.tgz",
1595
- "integrity": "sha512-vvGgiNLjus3/xp+iotiGqbSG0R7+Q/bP5cP2Psa7Rhtm/vrMuM5B4LebYu7bPf3TzgCyTbv96PcxGWf6gxbW0Q==",
1593
+ "version": "0.14.4",
1594
+ "resolved": "https://registry.npmjs.org/@gregiteen/ssss-cli/-/ssss-cli-0.14.4.tgz",
1595
+ "integrity": "sha512-R6JIgPRvS9xXp0xb6BYO3rauv+72r35GIiDrJcvbjPdTSHFZXr8/jRxFOgoF8yTed/5xyGFF3ey3DI9bOjmHVA==",
1596
1596
  "dev": true,
1597
1597
  "license": "ISC",
1598
1598
  "bin": {
@@ -5539,9 +5539,9 @@
5539
5539
  }
5540
5540
  },
5541
5541
  "node_modules/total-recall-brain": {
5542
- "version": "3.41.4",
5543
- "resolved": "https://registry.npmjs.org/total-recall-brain/-/total-recall-brain-3.41.4.tgz",
5544
- "integrity": "sha512-xn6Ye5R/fHT7JP/ZjNJwmpteG/jcD9dzErbYwE46ZGThVaGsP1H81avSn0ZOAuLdUFRSgsoEijiAEHSaUA/4uQ==",
5542
+ "version": "3.41.5",
5543
+ "resolved": "https://registry.npmjs.org/total-recall-brain/-/total-recall-brain-3.41.5.tgz",
5544
+ "integrity": "sha512-gaW46xAtnFf+zfkv8LHYQLMzt27JjelyFggc8zAZafCnCJRbNSP8D02cbbcx49f3a70t/hkgA9RhJOY8HTqRFg==",
5545
5545
  "dev": true,
5546
5546
  "license": "MIT",
5547
5547
  "workspaces": [
@@ -5549,7 +5549,7 @@
5549
5549
  ],
5550
5550
  "dependencies": {
5551
5551
  "@simplewebauthn/server": "^13.3.2",
5552
- "@ssss/cli": "npm:@gregiteen/ssss-cli@0.14.3",
5552
+ "@ssss/cli": "npm:@gregiteen/ssss-cli@0.14.4",
5553
5553
  "bcrypt": "^6.0.0",
5554
5554
  "better-sqlite3": "^12.11.1",
5555
5555
  "cookie-parser": "^1.4.7",
@@ -17,5 +17,8 @@
17
17
  ],
18
18
  "dependencies": {
19
19
  "@gregiteen/ssss-cli": "0.14.4"
20
+ },
21
+ "overrides": {
22
+ "@ssss/cli": "npm:@gregiteen/ssss-cli@0.14.4"
20
23
  }
21
24
  }
@@ -12,7 +12,7 @@
12
12
  "@gregiteen/ssss-cli": "0.14.4"
13
13
  },
14
14
  "devDependencies": {
15
- "total-recall-brain": "3.41.4",
15
+ "total-recall-brain": "3.41.5",
16
16
  "vitest": "^4.1.10"
17
17
  }
18
18
  },
@@ -1888,9 +1888,9 @@
1888
1888
  },
1889
1889
  "node_modules/@ssss/cli": {
1890
1890
  "name": "@gregiteen/ssss-cli",
1891
- "version": "0.14.3",
1892
- "resolved": "https://registry.npmjs.org/@gregiteen/ssss-cli/-/ssss-cli-0.14.3.tgz",
1893
- "integrity": "sha512-vvGgiNLjus3/xp+iotiGqbSG0R7+Q/bP5cP2Psa7Rhtm/vrMuM5B4LebYu7bPf3TzgCyTbv96PcxGWf6gxbW0Q==",
1891
+ "version": "0.14.4",
1892
+ "resolved": "https://registry.npmjs.org/@gregiteen/ssss-cli/-/ssss-cli-0.14.4.tgz",
1893
+ "integrity": "sha512-R6JIgPRvS9xXp0xb6BYO3rauv+72r35GIiDrJcvbjPdTSHFZXr8/jRxFOgoF8yTed/5xyGFF3ey3DI9bOjmHVA==",
1894
1894
  "dev": true,
1895
1895
  "license": "ISC",
1896
1896
  "bin": {
@@ -6533,9 +6533,9 @@
6533
6533
  }
6534
6534
  },
6535
6535
  "node_modules/total-recall-brain": {
6536
- "version": "3.41.4",
6537
- "resolved": "https://registry.npmjs.org/total-recall-brain/-/total-recall-brain-3.41.4.tgz",
6538
- "integrity": "sha512-xn6Ye5R/fHT7JP/ZjNJwmpteG/jcD9dzErbYwE46ZGThVaGsP1H81avSn0ZOAuLdUFRSgsoEijiAEHSaUA/4uQ==",
6536
+ "version": "3.41.5",
6537
+ "resolved": "https://registry.npmjs.org/total-recall-brain/-/total-recall-brain-3.41.5.tgz",
6538
+ "integrity": "sha512-gaW46xAtnFf+zfkv8LHYQLMzt27JjelyFggc8zAZafCnCJRbNSP8D02cbbcx49f3a70t/hkgA9RhJOY8HTqRFg==",
6539
6539
  "dev": true,
6540
6540
  "license": "MIT",
6541
6541
  "workspaces": [
@@ -6543,7 +6543,7 @@
6543
6543
  ],
6544
6544
  "dependencies": {
6545
6545
  "@simplewebauthn/server": "^13.3.2",
6546
- "@ssss/cli": "npm:@gregiteen/ssss-cli@0.14.3",
6546
+ "@ssss/cli": "npm:@gregiteen/ssss-cli@0.14.4",
6547
6547
  "bcrypt": "^6.0.0",
6548
6548
  "better-sqlite3": "^12.11.1",
6549
6549
  "cookie-parser": "^1.4.7",
@@ -20,5 +20,8 @@
20
20
  },
21
21
  "dependencies": {
22
22
  "@gregiteen/ssss-cli": "0.14.4"
23
+ },
24
+ "overrides": {
25
+ "@ssss/cli": "npm:@gregiteen/ssss-cli@0.14.4"
23
26
  }
24
27
  }
@@ -15,7 +15,7 @@
15
15
  "devDependencies": {
16
16
  "jsdom": "^29.1.1",
17
17
  "supertest": "^7.3.1",
18
- "total-recall-brain": "3.41.4",
18
+ "total-recall-brain": "3.41.5",
19
19
  "vitest": "^4.1.12"
20
20
  }
21
21
  },
@@ -2136,9 +2136,9 @@
2136
2136
  },
2137
2137
  "node_modules/@ssss/cli": {
2138
2138
  "name": "@gregiteen/ssss-cli",
2139
- "version": "0.14.3",
2140
- "resolved": "https://registry.npmjs.org/@gregiteen/ssss-cli/-/ssss-cli-0.14.3.tgz",
2141
- "integrity": "sha512-vvGgiNLjus3/xp+iotiGqbSG0R7+Q/bP5cP2Psa7Rhtm/vrMuM5B4LebYu7bPf3TzgCyTbv96PcxGWf6gxbW0Q==",
2139
+ "version": "0.14.4",
2140
+ "resolved": "https://registry.npmjs.org/@gregiteen/ssss-cli/-/ssss-cli-0.14.4.tgz",
2141
+ "integrity": "sha512-R6JIgPRvS9xXp0xb6BYO3rauv+72r35GIiDrJcvbjPdTSHFZXr8/jRxFOgoF8yTed/5xyGFF3ey3DI9bOjmHVA==",
2142
2142
  "dev": true,
2143
2143
  "license": "ISC",
2144
2144
  "bin": {
@@ -7177,9 +7177,9 @@
7177
7177
  }
7178
7178
  },
7179
7179
  "node_modules/total-recall-brain": {
7180
- "version": "3.41.4",
7181
- "resolved": "https://registry.npmjs.org/total-recall-brain/-/total-recall-brain-3.41.4.tgz",
7182
- "integrity": "sha512-xn6Ye5R/fHT7JP/ZjNJwmpteG/jcD9dzErbYwE46ZGThVaGsP1H81avSn0ZOAuLdUFRSgsoEijiAEHSaUA/4uQ==",
7180
+ "version": "3.41.5",
7181
+ "resolved": "https://registry.npmjs.org/total-recall-brain/-/total-recall-brain-3.41.5.tgz",
7182
+ "integrity": "sha512-gaW46xAtnFf+zfkv8LHYQLMzt27JjelyFggc8zAZafCnCJRbNSP8D02cbbcx49f3a70t/hkgA9RhJOY8HTqRFg==",
7183
7183
  "dev": true,
7184
7184
  "license": "MIT",
7185
7185
  "workspaces": [
@@ -7187,7 +7187,7 @@
7187
7187
  ],
7188
7188
  "dependencies": {
7189
7189
  "@simplewebauthn/server": "^13.3.2",
7190
- "@ssss/cli": "npm:@gregiteen/ssss-cli@0.14.3",
7190
+ "@ssss/cli": "npm:@gregiteen/ssss-cli@0.14.4",
7191
7191
  "bcrypt": "^6.0.0",
7192
7192
  "better-sqlite3": "^12.11.1",
7193
7193
  "cookie-parser": "^1.4.7",
@@ -22,5 +22,8 @@
22
22
  "src/",
23
23
  "!src/**/*.spec.mjs",
24
24
  "!src/**/*.test.mjs"
25
- ]
25
+ ],
26
+ "overrides": {
27
+ "@ssss/cli": "npm:@gregiteen/ssss-cli@0.14.4"
28
+ }
26
29
  }
@@ -88,7 +88,7 @@ function normalizeNode(node, self = false) {
88
88
  hostname: normalizeHostname(node?.DNSName) || node?.HostName || null,
89
89
  // The name the machine reports for itself, which is what the control
90
90
  // server lists it under. It differs from the DNS name whenever the node was
91
- // renamed (a droplet listed as `portfolio-site` answers as `cloud.mesh…`),
91
+ // renamed (a host listed as `web-1` answers as `cloud.mesh…`),
92
92
  // and it is not unique, so it is an identity to match, never a key.
93
93
  os_hostname: node?.HostName || null,
94
94
  ip: node?.TailscaleIPs?.[0] || null,