total-recall-brain 3.12.2 → 3.13.1

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 (154) hide show
  1. package/README.md +91 -108
  2. package/bin/antigravity.mjs +81 -52
  3. package/bin/total-recall.mjs +32 -57
  4. package/extension/background.js +1 -1
  5. package/extension/options/options.js +9 -3
  6. package/extension/sidepanel/sidepanel.js +0 -2
  7. package/frontend/index.html +4 -3
  8. package/frontend/package.json +3 -1
  9. package/frontend/src/App.tsx +112 -111
  10. package/frontend/src/api.ts +700 -18
  11. package/frontend/src/components/BrainSelector.tsx +211 -199
  12. package/frontend/src/components/DocumentEditorModal.tsx +57 -0
  13. package/frontend/src/components/DocumentTable.tsx +47 -0
  14. package/frontend/src/components/Graph3D.tsx +120 -71
  15. package/frontend/src/components/UsageChart.tsx +78 -0
  16. package/frontend/src/components/brand/BrandMark.tsx +95 -0
  17. package/frontend/src/index.css +286 -86
  18. package/frontend/src/pages/ApiKeysPage.tsx +1878 -215
  19. package/frontend/src/pages/ChatPage.tsx +103 -45
  20. package/frontend/src/pages/DesignDocsPage.tsx +614 -0
  21. package/frontend/src/pages/FilesPage.tsx +10 -6
  22. package/frontend/src/pages/GraphPage.tsx +5 -3
  23. package/frontend/src/pages/HelpPage.tsx +2 -2
  24. package/frontend/src/pages/InboxPage.tsx +82 -0
  25. package/frontend/src/pages/InstructionsPage.tsx +583 -0
  26. package/frontend/src/pages/IntegrationsPage.tsx +21 -10
  27. package/frontend/src/pages/LoginPage.tsx +95 -77
  28. package/frontend/src/pages/MemoryPage.tsx +31 -8
  29. package/frontend/src/pages/ModelsPage.tsx +280 -23
  30. package/frontend/src/pages/OkfPage.tsx +535 -0
  31. package/frontend/src/pages/OnboardingPage.tsx +690 -0
  32. package/frontend/src/pages/OpenWikiPage.tsx +561 -0
  33. package/frontend/src/pages/SettingsPage.tsx +826 -740
  34. package/frontend/src/pages/SkillsPage.tsx +1259 -117
  35. package/frontend/src/pages/UsagePage.tsx +256 -11
  36. package/frontend/src/pages/VaultPage.tsx +223 -0
  37. package/frontend/src/types.ts +173 -0
  38. package/package.json +4 -4
  39. package/scaffold/.agent/skills/total-recall/SKILL.md +43 -4
  40. package/scaffold/.agent/skills/total-recall/modules/README.md +10 -0
  41. package/scaffold/.agent/skills/total-recall/modules/agents/README.md +5 -0
  42. package/scaffold/.agent/skills/total-recall/{skills/tr-cli-agents → modules/agents}/agents.yml +8 -0
  43. package/scaffold/.agent/skills/total-recall/modules/skill-deploy/README.md +9 -0
  44. package/scaffold/.agent/skills/total-recall/openwiki/README.md +10 -0
  45. package/scaffold/.agent/skills/total-recall/openwiki/architecture.md +5 -0
  46. package/scaffold/.agent/skills/total-recall/openwiki/ide.md +10 -0
  47. package/scaffold/.agent/skills/total-recall/openwiki/memory.md +11 -0
  48. package/scaffold/.agent/skills/total-recall/openwiki/secrets.md +7 -0
  49. package/scaffold/.agent/skills/total-recall/openwiki/skills.md +7 -0
  50. package/src/cli/brain.mjs +63 -5
  51. package/src/cli/connect.mjs +11 -19
  52. package/src/cli/daemon.mjs +5 -4
  53. package/src/cli/deploy-ui.mjs +8 -3
  54. package/src/cli/deploy.mjs +84 -27
  55. package/src/cli/ingest/index.mjs +1 -1
  56. package/src/cli/init.mjs +63 -34
  57. package/src/cli/remember.mjs +3 -3
  58. package/src/cli/secret.mjs +812 -0
  59. package/src/cli/setup.mjs +34 -7
  60. package/src/cli/share.mjs +2 -2
  61. package/src/cli/skill.mjs +396 -35
  62. package/src/cli/sync.mjs +4 -4
  63. package/src/cli/task.mjs +287 -0
  64. package/src/core/clarity-rewriter.mjs +5 -5
  65. package/src/core/config.mjs +44 -2
  66. package/src/core/conflict-detector.mjs +5 -5
  67. package/src/core/crons.mjs +54 -0
  68. package/src/core/daemon-loop.mjs +87 -235
  69. package/src/core/dream.mjs +170 -10
  70. package/src/core/env-import.mjs +456 -0
  71. package/src/core/fact-seeker.mjs +14 -14
  72. package/src/core/import-rules.mjs +20 -7
  73. package/src/core/inference-engine.mjs +3 -3
  74. package/src/core/migrate.mjs +14 -8
  75. package/src/core/okf-adapter.mjs +2 -2
  76. package/src/core/operation-validator.mjs +39 -331
  77. package/src/core/optimizer.mjs +7 -0
  78. package/src/core/post-mortem.mjs +2 -2
  79. package/src/core/project-brain.mjs +349 -0
  80. package/src/core/provider-catalog.mjs +296 -0
  81. package/src/core/quick-capture.mjs +1 -1
  82. package/src/core/remote-vault-sync.mjs +194 -0
  83. package/src/core/research-queue.mjs +7 -11
  84. package/src/core/runtime.mjs +33 -9
  85. package/src/core/scheduler.mjs +59 -5
  86. package/src/core/schema.mjs +14 -0
  87. package/src/core/search.mjs +1 -1
  88. package/src/core/secrets-env-export.mjs +323 -0
  89. package/src/core/secrets-rotate.mjs +245 -0
  90. package/src/core/secrets-store.mjs +645 -0
  91. package/src/core/semantic-index.mjs +3 -3
  92. package/src/core/skills-registry.mjs +1062 -0
  93. package/src/core/source-adapters.mjs +4 -1
  94. package/src/core/ssss-host-extension.mjs +94 -0
  95. package/src/core/ssss-kernel-bridge.mjs +530 -0
  96. package/src/core/surface.mjs +14 -0
  97. package/src/core/task-envelope.mjs +298 -0
  98. package/src/core/task-executors.mjs +600 -0
  99. package/src/core/validated-write.mjs +124 -56
  100. package/src/core/vault.mjs +19 -34
  101. package/src/core/webauthn-store.mjs +272 -0
  102. package/src/server/api.mjs +28 -16
  103. package/src/server/auth.mjs +53 -2
  104. package/src/server/index.mjs +3 -3
  105. package/src/server/keys.mjs +30 -4
  106. package/src/server/rest.mjs +405 -68
  107. package/src/server/route-manifest.json +168 -0
  108. package/src/server/routes/_shared.mjs +40 -1
  109. package/src/server/routes/docs.mjs +260 -0
  110. package/src/server/routes/memory.mjs +145 -32
  111. package/src/server/routes/research.mjs +30 -0
  112. package/src/server/routes/secrets.mjs +470 -0
  113. package/src/server/routes/share.mjs +2 -2
  114. package/src/server/routes/skills.mjs +452 -54
  115. package/src/server/routes/sync.mjs +48 -0
  116. package/src/server/routes/webauthn.mjs +184 -0
  117. package/src/server/update-route-manifest.mjs +39 -0
  118. package/templates/onboarding-interview.md +32 -22
  119. package/templates/openwiki/README.md +10 -0
  120. package/templates/openwiki/architecture.md +5 -0
  121. package/templates/openwiki/ide.md +10 -0
  122. package/templates/openwiki/memory.md +11 -0
  123. package/templates/openwiki/secrets.md +7 -0
  124. package/templates/openwiki/skills.md +7 -0
  125. package/scaffold/.agent/skills/total-recall/skills/tr-cli-agents/SKILL.md +0 -121
  126. package/scaffold/.agent/skills/total-recall/skills/tr-cli-agents/references/antigravity.txt +0 -20
  127. package/scaffold/.agent/skills/total-recall/skills/tr-cli-agents/references/claude.txt +0 -58
  128. package/scaffold/.agent/skills/total-recall/skills/tr-cli-agents/references/codex.txt +0 -81
  129. package/scaffold/.agent/skills/total-recall/skills/tr-cli-agents/references/gemini.txt +0 -44
  130. package/scaffold/.agent/skills/total-recall/skills/tr-cli-agents/scripts/.gitkeep +0 -0
  131. package/scaffold/.agent/skills/total-recall/skills/tr-cli-agents/subagents/.gitkeep +0 -0
  132. package/scaffold/.agent/skills/total-recall/skills/tr-research/SKILL.md +0 -338
  133. package/scaffold/.agent/skills/total-recall/skills/tr-skill/SKILL.md +0 -282
  134. package/scaffold/.agent/skills/total-recall/skills/tr-skill/assets/skill-template/SKILL.md +0 -20
  135. package/scaffold/.agent/skills/total-recall/skills/tr-skill/evals/evals.json +0 -20
  136. package/scaffold/.agent/skills/total-recall/skills/tr-skill/hooks/on-skill-add.sh +0 -14
  137. package/scaffold/.agent/skills/total-recall/skills/tr-skill/hooks/on-skill-delete.sh +0 -14
  138. package/scaffold/.agent/skills/total-recall/skills/tr-skill/learnings/.gitkeep +0 -0
  139. package/scaffold/.agent/skills/total-recall/skills/tr-skill/references/.gitkeep +0 -0
  140. package/scaffold/.agent/skills/total-recall/skills/tr-skill/scripts/.gitkeep +0 -0
  141. package/scaffold/.agent/skills/total-recall/skills/tr-skill/scripts/create-skill.sh +0 -65
  142. package/scaffold/.agent/skills/total-recall/skills/tr-skill/scripts/enforce-skill-optimization.mjs +0 -135
  143. package/scaffold/.agent/skills/total-recall/skills/tr-skill/scripts/skill-watcher.mjs +0 -64
  144. package/scaffold/.agent/skills/total-recall/skills/tr-skill/subagents/audit-all-skills.md +0 -62
  145. package/scaffold/.agent/skills/total-recall/skills/tr-ssss/SKILL.md +0 -298
  146. package/scaffold/.agent/skills/total-recall/skills/tr-ssss/evals/evals.json +0 -17
  147. package/scaffold/.agent/skills/total-recall/skills/tr-ssss/references/CHANGELOG.md +0 -124
  148. package/scaffold/.agent/skills/total-recall/skills/tr-ssss/references/ssss-spec.md +0 -1325
  149. package/scaffold/.agent/skills/total-recall/skills/tr-ssss/scripts/validate-schema.mjs +0 -232
  150. package/scaffold/.agent/skills/total-recall/skills/tr-ssss/subagents/audit-ssss-node.md +0 -9
  151. /package/scaffold/.agent/skills/total-recall/{skills/tr-cli-agents/evals → modules/skill-deploy/scripts}/.gitkeep +0 -0
  152. /package/scaffold/.agent/skills/total-recall/{skills/tr-skill → modules/skill-deploy}/scripts/find-skills.mjs +0 -0
  153. /package/scaffold/.agent/skills/total-recall/{skills/tr-skill → modules/skill-deploy}/scripts/install-skill.mjs +0 -0
  154. /package/scaffold/.agent/skills/total-recall/{skills/tr-skill → modules/skill-deploy}/scripts/scan-skill.mjs +0 -0
@@ -110,20 +110,24 @@ export default function ChatPage({ activeBrainId, onBrainChange }: { activeBrain
110
110
  .then(health => {
111
111
  const agents = health.cli_agents && health.cli_agents.length > 0
112
112
  ? health.cli_agents
113
- : ['antigravity', 'claude', 'codex'];
113
+ : ['antigravity', 'grok', 'claude', 'codex'];
114
114
  setAvailableModels(agents);
115
115
 
116
116
  const saved = localStorage.getItem('selectedModel');
117
117
  if (saved && agents.includes(saved)) {
118
118
  setSelectedModel(saved);
119
119
  } else {
120
- const defaultAgent = agents.includes('antigravity') ? 'antigravity' : agents[0];
120
+ const defaultAgent = agents.includes('antigravity')
121
+ ? 'antigravity'
122
+ : agents.includes('grok')
123
+ ? 'grok'
124
+ : agents[0];
121
125
  setSelectedModel(defaultAgent);
122
126
  localStorage.setItem('selectedModel', defaultAgent);
123
127
  }
124
128
  })
125
129
  .catch(() => {
126
- const agents = ['antigravity', 'claude', 'codex'];
130
+ const agents = ['antigravity', 'grok', 'claude', 'codex'];
127
131
  setAvailableModels(agents);
128
132
  const saved = localStorage.getItem('selectedModel');
129
133
  if (saved && agents.includes(saved)) {
@@ -170,11 +174,51 @@ export default function ChatPage({ activeBrainId, onBrainChange }: { activeBrain
170
174
  }
171
175
  }, [])
172
176
 
173
- // Reload memory nodes when active selected brain changes
177
+ // Reload memory nodes when active selected brain changes or background SSE triggers
174
178
  useEffect(() => {
175
- listMemory(activeBrainId)
176
- .then(setAllMemoryNodes)
177
- .catch(console.error)
179
+ let active = true
180
+
181
+ const loadMemoryNodes = () => {
182
+ listMemory(activeBrainId)
183
+ .then(nodes => {
184
+ if (!active) return
185
+ setAllMemoryNodes(nodes)
186
+ // Ensure selected grounding nodes stay in sync if a node is deleted in another tab/process
187
+ setSelectedGroundingNodes(prev => prev.filter(slug => nodes.some(n => n.slug === slug)))
188
+ })
189
+ .catch(console.error)
190
+ }
191
+
192
+ // Initial load
193
+ loadMemoryNodes()
194
+
195
+ // Listen to Cognitive Daemon SSE for memory surface rebuilds
196
+ const sseUrl = "http://localhost:9111/stream"
197
+ const eventSource = new EventSource(sseUrl)
198
+
199
+ eventSource.onmessage = (event) => {
200
+ if (!active) return
201
+ try {
202
+ const logEntry = JSON.parse(event.data)
203
+ if (
204
+ logEntry.sender === 'conflict-detector' ||
205
+ logEntry.sender === 'memory-ingestion' ||
206
+ logEntry.message?.includes('Surface compilation') ||
207
+ logEntry.message?.includes('Brain embeddings rebuilt') ||
208
+ logEntry.message?.includes('Graph indices rebuilt') ||
209
+ logEntry.message?.includes('deleted')
210
+ ) {
211
+ loadMemoryNodes()
212
+ }
213
+ } catch (e) {
214
+ // ignore parsing errors from stream
215
+ }
216
+ }
217
+
218
+ return () => {
219
+ active = false
220
+ eventSource.close()
221
+ }
178
222
  }, [activeBrainId])
179
223
 
180
224
  // Click outside listener for grounding node selector popover and model selector dropdown
@@ -501,8 +545,36 @@ export default function ChatPage({ activeBrainId, onBrainChange }: { activeBrain
501
545
  </aside>
502
546
 
503
547
  {/* Main Chat Area */}
504
- <div className="chat-container">
505
- <header className="chat-header animate-fade-in">
548
+ <div className="chat-container" style={{ position: 'relative', overflow: 'hidden' }}>
549
+ {/* Decorative graph only — never intercepts clicks (was blocking model/provider UI) */}
550
+ <div
551
+ aria-hidden
552
+ style={{
553
+ position: 'absolute',
554
+ top: 0,
555
+ left: 0,
556
+ right: 0,
557
+ bottom: 0,
558
+ zIndex: 0,
559
+ pointerEvents: 'none',
560
+ opacity: messages.length > 0 ? 0.22 : 0.55,
561
+ transition: 'opacity 0.3s ease',
562
+ }}
563
+ >
564
+ <Graph3D
565
+ threads={threads}
566
+ memoryNodes={allMemoryNodes}
567
+ researchItems={researchItems}
568
+ onOpenThread={() => {}}
569
+ onGroundMemoryNode={() => {}}
570
+ selectedGroundingNodes={selectedGroundingNodes}
571
+ interactive={false}
572
+ />
573
+ </div>
574
+ <header
575
+ className="chat-header animate-fade-in"
576
+ style={{ position: 'relative', zIndex: 40, overflow: 'visible' }}
577
+ >
506
578
  <div className="chat-header-title">
507
579
  <h2>Chat Session</h2>
508
580
  {activeThreadId && (
@@ -511,13 +583,17 @@ export default function ChatPage({ activeBrainId, onBrainChange }: { activeBrain
511
583
  </span>
512
584
  )}
513
585
  </div>
514
- <div className="chat-header-model-selector" ref={dropdownRef}>
515
- <span className="selector-label">Model:</span>
516
- <div className="model-selector-dropdown-wrapper">
586
+ <div className="chat-header-model-selector" ref={dropdownRef} style={{ position: 'relative', zIndex: 50 }}>
587
+ <span className="selector-label">Model / provider:</span>
588
+ <div className="model-selector-dropdown-wrapper" style={{ position: 'relative', zIndex: 50 }}>
517
589
  <button
590
+ type="button"
518
591
  className={`model-selector-dropdown-btn ${showModelDropdown ? 'active' : ''}`}
519
- onClick={() => setShowModelDropdown(!showModelDropdown)}
520
- title="Select CLI agent model"
592
+ onClick={(e) => {
593
+ e.stopPropagation()
594
+ setShowModelDropdown((v) => !v)
595
+ }}
596
+ title="Select CLI agent / provider"
521
597
  >
522
598
  <span style={{ textTransform: 'capitalize' }}>{selectedModel || 'Select Model'}</span>
523
599
  <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round">
@@ -525,12 +601,19 @@ export default function ChatPage({ activeBrainId, onBrainChange }: { activeBrain
525
601
  </svg>
526
602
  </button>
527
603
  {showModelDropdown && (
528
- <div className="model-selector-menu glass">
604
+ <div
605
+ className="model-selector-menu glass"
606
+ style={{ zIndex: 200, pointerEvents: 'auto' }}
607
+ role="listbox"
608
+ >
529
609
  {availableModels.map(modelName => (
530
610
  <div
531
611
  key={modelName}
612
+ role="option"
613
+ aria-selected={selectedModel === modelName}
532
614
  className={`model-selector-item ${selectedModel === modelName ? 'selected' : ''}`}
533
- onClick={() => {
615
+ onClick={(e) => {
616
+ e.stopPropagation()
534
617
  setSelectedModel(modelName)
535
618
  localStorage.setItem('selectedModel', modelName)
536
619
  setSelectedSubModel('')
@@ -542,6 +625,7 @@ export default function ChatPage({ activeBrainId, onBrainChange }: { activeBrain
542
625
  <span className="model-selector-item-name" style={{ textTransform: 'capitalize' }}>{modelName}</span>
543
626
  <span className="model-selector-item-desc">
544
627
  {modelName === 'antigravity' && 'Google Antigravity'}
628
+ {modelName === 'grok' && 'xAI Grok Build CLI'}
545
629
  {modelName === 'gemini' && 'Google Gemini CLI'}
546
630
  {modelName === 'claude' && 'Anthropic Claude CLI'}
547
631
  {modelName === 'codex' && 'Codex Coding Agent'}
@@ -654,7 +738,7 @@ export default function ChatPage({ activeBrainId, onBrainChange }: { activeBrain
654
738
  style={{
655
739
  flexShrink: 0,
656
740
  padding: '6px 14px',
657
- background: 'linear-gradient(135deg, #6c5ce7, #a29bfe)',
741
+ background: 'linear-gradient(135deg, #3b82f6, #93c5fd)',
658
742
  color: '#fff',
659
743
  borderRadius: 6,
660
744
  fontWeight: 500,
@@ -685,35 +769,9 @@ export default function ChatPage({ activeBrainId, onBrainChange }: { activeBrain
685
769
  </div>
686
770
  )}
687
771
 
688
- <div className="chat-messages" style={{ position: 'relative' }}>
689
- <div style={{
690
- position: 'absolute',
691
- top: 0,
692
- left: 0,
693
- right: 0,
694
- bottom: 0,
695
- zIndex: 1,
696
- pointerEvents: messages.length > 0 ? 'none' : 'auto',
697
- opacity: messages.length > 0 ? 0.35 : 1,
698
- transition: 'opacity 0.3s ease'
699
- }}>
700
- <Graph3D
701
- threads={threads}
702
- memoryNodes={allMemoryNodes}
703
- researchItems={researchItems}
704
- onOpenThread={(threadId) => setActiveThreadId(threadId)}
705
- onGroundMemoryNode={(slug) => {
706
- setSelectedGroundingNodes(prev =>
707
- prev.includes(slug) ? prev.filter(s => s !== slug) : [...prev, slug]
708
- )
709
- }}
710
- selectedGroundingNodes={selectedGroundingNodes}
711
- />
712
- </div>
713
-
772
+ <div className="chat-messages" style={{ position: 'relative', zIndex: 1, pointerEvents: 'auto' }}>
714
773
  <div style={{
715
774
  position: 'relative',
716
- zIndex: 2,
717
775
  display: 'flex',
718
776
  flexDirection: 'column',
719
777
  gap: '16px',
@@ -773,7 +831,7 @@ export default function ChatPage({ activeBrainId, onBrainChange }: { activeBrain
773
831
  <div ref={messagesEnd} />
774
832
  </div>
775
833
  </div>
776
- <div className="chat-input-bar">
834
+ <div className="chat-input-bar" style={{ position: 'relative', zIndex: 30, pointerEvents: 'auto' }}>
777
835
  {selectedGroundingNodes.length > 0 && (
778
836
  <div className="grounding-pills">
779
837
  {selectedGroundingNodes.map(slug => {