total-recall-brain 3.41.4 → 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 (147) hide show
  1. package/bin/total-recall.mjs +10 -6
  2. package/docs/reference/cli-reference.md +18 -0
  3. package/frontend/dist/assets/index-4tGQfTa2.js +5605 -0
  4. package/frontend/dist/assets/index-DtwsDyFM.css +1 -0
  5. package/frontend/dist/index.html +2 -2
  6. package/frontend/package.json +11 -0
  7. package/frontend/src/App.tsx +47 -122
  8. package/frontend/src/components/plugins/plugin-frame.ts +1 -0
  9. package/frontend/src/index.css +152 -86
  10. package/frontend/src/pages/HelpPage.tsx +13 -10
  11. package/frontend/src/pages/MemoryPage.tsx +28 -30
  12. package/frontend/src/pages/NetworkPage.tsx +3 -3
  13. package/frontend/src/pages/PluginsPage.tsx +6 -5
  14. package/frontend/src/pages/RulesPage.tsx +16 -12
  15. package/package.json +4 -3
  16. package/scaffold/.agent/skills/total-recall/plugins/code-quality/package-lock.json +3114 -36
  17. package/scaffold/.agent/skills/total-recall/plugins/code-quality/package.json +4 -1
  18. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package-lock.json +3114 -36
  19. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package.json +4 -1
  20. package/scaffold/.agent/skills/total-recall/plugins/embeddings/package-lock.json +3121 -33
  21. package/scaffold/.agent/skills/total-recall/plugins/embeddings/package.json +4 -1
  22. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/package-lock.json +3122 -34
  23. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/package.json +4 -1
  24. package/scaffold/.agent/skills/total-recall/plugins/mesh/package-lock.json +3127 -49
  25. package/scaffold/.agent/skills/total-recall/plugins/mesh/package.json +5 -2
  26. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/mesh.mjs +1 -1
  27. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/capability/index.mjs +136 -7
  28. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/cli.mjs +135 -26
  29. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/package-lock.json +3121 -33
  30. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/package.json +5 -2
  31. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/plugin.json +228 -9
  32. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/skills/meta-harness/SKILL.md +24 -30
  33. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/alerts.mjs +29 -16
  34. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/cascade.mjs +73 -0
  35. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/coordinator.mjs +182 -365
  36. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/dispatch.mjs +33 -0
  37. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/documentation.mjs +40 -14
  38. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/executor.mjs +4 -4
  39. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/agy.mjs +187 -0
  40. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/claude.mjs +275 -0
  41. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/cline.mjs +132 -0
  42. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/codex.mjs +187 -0
  43. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/cursor.mjs +158 -0
  44. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/devin.mjs +157 -0
  45. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/dsh.mjs +183 -0
  46. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/grok.mjs +132 -0
  47. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/hermes.mjs +173 -0
  48. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/index.mjs +87 -0
  49. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/openclaw.mjs +173 -0
  50. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/pi.mjs +129 -0
  51. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate.mjs +12 -0
  52. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/json-reply.mjs +22 -0
  53. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/learner.mjs +72 -70
  54. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/model-catalog.mjs +195 -0
  55. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/paths.mjs +11 -0
  56. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/pool.mjs +36 -0
  57. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/review.mjs +169 -0
  58. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/router.mjs +136 -346
  59. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/runtime.mjs +1 -1
  60. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/ssss-store.mjs +20 -0
  61. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/telemetry.mjs +43 -0
  62. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/threads.mjs +156 -0
  63. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/worker.mjs +117 -35
  64. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/worktree.mjs +51 -0
  65. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/card.js +398 -57
  66. package/scaffold/.agent/skills/total-recall/plugins/openwiki/cli.mjs +304 -46
  67. package/scaffold/.agent/skills/total-recall/plugins/openwiki/package-lock.json +367 -41
  68. package/scaffold/.agent/skills/total-recall/plugins/openwiki/package.json +5 -2
  69. package/scaffold/.agent/skills/total-recall/plugins/openwiki/plugin.json +33 -0
  70. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/config.mjs +2 -2
  71. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/generate.mjs +159 -0
  72. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/graph.mjs +197 -0
  73. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/lint.mjs +153 -0
  74. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/mesh-vaults.mjs +261 -0
  75. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/refresh.mjs +151 -4
  76. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/search.mjs +114 -0
  77. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/token.mjs +96 -0
  78. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/card.js +899 -662
  79. package/scaffold/.agent/skills/total-recall/plugins/openwiki/vendor/openwiki.mjs +8987 -0
  80. package/scaffold/.agent/skills/total-recall/plugins/openwiki/vendor/skills/mermaid-diagrams/SKILL.md +44 -0
  81. package/scaffold/.agent/skills/total-recall/plugins/openwiki/vendor/skills/write-connector/SKILL.md +56 -0
  82. package/scaffold/.agent/skills/total-recall/plugins/security/package-lock.json +3097 -81
  83. package/scaffold/.agent/skills/total-recall/plugins/security/package.json +4 -1
  84. package/src/cli/agent.mjs +12 -1
  85. package/src/cli/compact.mjs +108 -0
  86. package/src/cli/connect.mjs +56 -1
  87. package/src/cli/context.mjs +55 -23
  88. package/src/cli/doctor.mjs +5 -2
  89. package/src/cli/forget.mjs +2 -0
  90. package/src/cli/harness.mjs +62 -50
  91. package/src/cli/memory-entry.mjs +2 -2
  92. package/src/cli/preflight.mjs +152 -16
  93. package/src/cli/release.mjs +386 -0
  94. package/src/cli/remember.mjs +19 -1
  95. package/src/cli/rules.mjs +54 -12
  96. package/src/cli/startup.mjs +1 -1
  97. package/src/cli/status.mjs +12 -2
  98. package/src/core/claude-hooks.mjs +41 -3
  99. package/src/core/cli-commands.mjs +2 -0
  100. package/src/core/cli-semantic-index.mjs +3 -2
  101. package/src/core/conflict-detector.mjs +23 -12
  102. package/src/core/context-compactor.mjs +145 -0
  103. package/src/core/context-policy.mjs +20 -0
  104. package/src/core/duplicate-guard.mjs +350 -0
  105. package/src/core/meta-harness.mjs +31 -11
  106. package/src/core/preflight-gate.mjs +2 -2
  107. package/src/core/preflight-receipt.mjs +29 -1
  108. package/src/core/scaffold-plugins.mjs +7 -0
  109. package/src/core/stdio-flush.mjs +23 -0
  110. package/src/core/surface.mjs +33 -10
  111. package/src/server/invoke-durability.mjs +39 -0
  112. package/src/server/invoke-write-child.mjs +25 -0
  113. package/src/server/routes/invoke.mjs +7 -0
  114. package/src/server/routes/plugins.mjs +2 -2
  115. package/frontend/dist/assets/index-BIQmqDKP.css +0 -1
  116. package/frontend/dist/assets/index-CRzjQLu7.js +0 -5631
  117. package/frontend/src/components/DaemonLogsTab.tsx +0 -54
  118. package/frontend/src/components/ResearchAgendaTab.tsx +0 -712
  119. package/frontend/src/components/TaskQueueTab.tsx +0 -193
  120. package/frontend/src/components/VoiceInput.tsx +0 -112
  121. package/frontend/src/pages/ChatPage.tsx +0 -1059
  122. package/frontend/src/pages/CollabPage.tsx +0 -470
  123. package/frontend/src/pages/DesignDocsPage.tsx +0 -621
  124. package/frontend/src/pages/FilesPage.tsx +0 -393
  125. package/frontend/src/pages/HealthPage.tsx +0 -359
  126. package/frontend/src/pages/InboxPage.tsx +0 -83
  127. package/frontend/src/pages/InstructionsPage.tsx +0 -583
  128. package/frontend/src/pages/IntegrationsPage.tsx +0 -761
  129. package/frontend/src/pages/MeshPage.css +0 -58
  130. package/frontend/src/pages/MeshPage.tsx +0 -1219
  131. package/frontend/src/pages/OkfPage.tsx +0 -535
  132. package/frontend/src/pages/SandboxPage.tsx +0 -113
  133. package/frontend/src/pages/SkillsPage.tsx +0 -1994
  134. package/frontend/src/pages/TasksPage.tsx +0 -427
  135. package/frontend/src/pages/UsagePage.tsx +0 -702
  136. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/README.md +0 -65
  137. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/cli.mjs +0 -76
  138. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/package.json +0 -19
  139. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/plugin.json +0 -266
  140. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/adapters/dsh.mjs +0 -446
  141. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/documentation.mjs +0 -152
  142. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/executor.mjs +0 -71
  143. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/runtime.mjs +0 -36
  144. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/setup.mjs +0 -35
  145. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/worker.mjs +0 -175
  146. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/ui/DESIGN.md +0 -32
  147. 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.4",
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": {
@@ -77,7 +77,7 @@
77
77
  "homepage": "https://github.com/gregiteen/total-recall#readme",
78
78
  "dependencies": {
79
79
  "@simplewebauthn/server": "^13.3.2",
80
- "@ssss/cli": "npm:@gregiteen/ssss-cli@0.14.3",
80
+ "@ssss/cli": "npm:@gregiteen/ssss-cli@0.14.4",
81
81
  "bcrypt": "^6.0.0",
82
82
  "better-sqlite3": "^12.11.1",
83
83
  "cookie-parser": "^1.4.7",
@@ -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
  }