total-recall-brain 3.13.0 → 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.
- package/README.md +91 -108
- package/bin/antigravity.mjs +81 -52
- package/bin/total-recall.mjs +32 -57
- package/extension/background.js +1 -1
- package/extension/options/options.js +9 -3
- package/extension/sidepanel/sidepanel.js +0 -2
- package/frontend/index.html +4 -3
- package/frontend/package.json +1 -0
- package/frontend/src/App.tsx +109 -152
- package/frontend/src/api.ts +605 -23
- package/frontend/src/components/BrainSelector.tsx +211 -199
- package/frontend/src/components/DocumentEditorModal.tsx +57 -0
- package/frontend/src/components/DocumentTable.tsx +47 -0
- package/frontend/src/components/Graph3D.tsx +120 -71
- package/frontend/src/components/UsageChart.tsx +3 -3
- package/frontend/src/components/brand/BrandMark.tsx +95 -0
- package/frontend/src/index.css +286 -86
- package/frontend/src/pages/ApiKeysPage.tsx +1878 -215
- package/frontend/src/pages/ChatPage.tsx +103 -45
- package/frontend/src/pages/DesignDocsPage.tsx +5 -5
- package/frontend/src/pages/FilesPage.tsx +10 -6
- package/frontend/src/pages/GraphPage.tsx +5 -3
- package/frontend/src/pages/HelpPage.tsx +2 -2
- package/frontend/src/pages/InboxPage.tsx +82 -0
- package/frontend/src/pages/InstructionsPage.tsx +1 -1
- package/frontend/src/pages/IntegrationsPage.tsx +21 -10
- package/frontend/src/pages/LoginPage.tsx +95 -77
- package/frontend/src/pages/MemoryPage.tsx +31 -8
- package/frontend/src/pages/OnboardingPage.tsx +690 -0
- package/frontend/src/pages/OpenWikiPage.tsx +412 -323
- package/frontend/src/pages/SettingsPage.tsx +825 -922
- package/frontend/src/pages/SkillsPage.tsx +272 -147
- package/frontend/src/pages/UsagePage.tsx +23 -31
- package/frontend/src/pages/VaultPage.tsx +223 -0
- package/frontend/src/types.ts +13 -0
- package/package.json +4 -4
- package/scaffold/.agent/skills/total-recall/SKILL.md +43 -4
- package/scaffold/.agent/skills/total-recall/modules/README.md +10 -0
- package/scaffold/.agent/skills/total-recall/modules/agents/README.md +5 -0
- package/scaffold/.agent/skills/total-recall/{skills/tr-cli-agents → modules/agents}/agents.yml +8 -0
- package/scaffold/.agent/skills/total-recall/modules/skill-deploy/README.md +9 -0
- package/scaffold/.agent/skills/total-recall/openwiki/README.md +10 -0
- package/scaffold/.agent/skills/total-recall/openwiki/architecture.md +5 -0
- package/scaffold/.agent/skills/total-recall/openwiki/ide.md +10 -0
- package/scaffold/.agent/skills/total-recall/openwiki/memory.md +11 -0
- package/scaffold/.agent/skills/total-recall/openwiki/secrets.md +7 -0
- package/scaffold/.agent/skills/total-recall/openwiki/skills.md +7 -0
- package/src/cli/brain.mjs +63 -5
- package/src/cli/connect.mjs +11 -19
- package/src/cli/daemon.mjs +5 -4
- package/src/cli/deploy-ui.mjs +8 -3
- package/src/cli/deploy.mjs +84 -27
- package/src/cli/ingest/index.mjs +1 -1
- package/src/cli/init.mjs +63 -34
- package/src/cli/remember.mjs +3 -3
- package/src/cli/secret.mjs +812 -0
- package/src/cli/setup.mjs +34 -7
- package/src/cli/share.mjs +2 -2
- package/src/cli/skill.mjs +396 -35
- package/src/cli/sync.mjs +4 -4
- package/src/cli/task.mjs +287 -0
- package/src/core/clarity-rewriter.mjs +5 -5
- package/src/core/config.mjs +44 -2
- package/src/core/conflict-detector.mjs +5 -5
- package/src/core/crons.mjs +54 -0
- package/src/core/daemon-loop.mjs +87 -235
- package/src/core/dream.mjs +170 -10
- package/src/core/env-import.mjs +456 -0
- package/src/core/fact-seeker.mjs +14 -14
- package/src/core/import-rules.mjs +20 -7
- package/src/core/inference-engine.mjs +3 -3
- package/src/core/migrate.mjs +14 -8
- package/src/core/okf-adapter.mjs +2 -2
- package/src/core/operation-validator.mjs +39 -331
- package/src/core/optimizer.mjs +7 -0
- package/src/core/post-mortem.mjs +2 -2
- package/src/core/project-brain.mjs +349 -0
- package/src/core/provider-catalog.mjs +296 -0
- package/src/core/quick-capture.mjs +1 -1
- package/src/core/remote-vault-sync.mjs +194 -0
- package/src/core/research-queue.mjs +7 -11
- package/src/core/runtime.mjs +33 -9
- package/src/core/scheduler.mjs +59 -5
- package/src/core/schema.mjs +14 -0
- package/src/core/search.mjs +1 -1
- package/src/core/secrets-env-export.mjs +323 -0
- package/src/core/secrets-rotate.mjs +245 -0
- package/src/core/secrets-store.mjs +645 -0
- package/src/core/semantic-index.mjs +3 -3
- package/src/core/skills-registry.mjs +1062 -0
- package/src/core/source-adapters.mjs +4 -1
- package/src/core/ssss-host-extension.mjs +94 -0
- package/src/core/ssss-kernel-bridge.mjs +530 -0
- package/src/core/surface.mjs +14 -0
- package/src/core/task-envelope.mjs +298 -0
- package/src/core/task-executors.mjs +600 -0
- package/src/core/validated-write.mjs +124 -56
- package/src/core/vault.mjs +19 -34
- package/src/core/webauthn-store.mjs +272 -0
- package/src/server/api.mjs +26 -16
- package/src/server/auth.mjs +51 -0
- package/src/server/index.mjs +3 -3
- package/src/server/keys.mjs +30 -4
- package/src/server/rest.mjs +198 -25
- package/src/server/route-manifest.json +156 -0
- package/src/server/routes/_shared.mjs +40 -1
- package/src/server/routes/docs.mjs +260 -0
- package/src/server/routes/memory.mjs +145 -32
- package/src/server/routes/research.mjs +30 -0
- package/src/server/routes/secrets.mjs +470 -0
- package/src/server/routes/share.mjs +2 -2
- package/src/server/routes/skills.mjs +452 -54
- package/src/server/routes/sync.mjs +48 -0
- package/src/server/routes/webauthn.mjs +184 -0
- package/src/server/update-route-manifest.mjs +39 -0
- package/templates/onboarding-interview.md +32 -22
- package/templates/openwiki/README.md +10 -0
- package/templates/openwiki/architecture.md +5 -0
- package/templates/openwiki/ide.md +10 -0
- package/templates/openwiki/memory.md +11 -0
- package/templates/openwiki/secrets.md +7 -0
- package/templates/openwiki/skills.md +7 -0
- package/scaffold/.agent/skills/total-recall/skills/tr-cli-agents/SKILL.md +0 -121
- package/scaffold/.agent/skills/total-recall/skills/tr-cli-agents/references/antigravity.txt +0 -20
- package/scaffold/.agent/skills/total-recall/skills/tr-cli-agents/references/claude.txt +0 -58
- package/scaffold/.agent/skills/total-recall/skills/tr-cli-agents/references/codex.txt +0 -81
- package/scaffold/.agent/skills/total-recall/skills/tr-cli-agents/references/gemini.txt +0 -44
- package/scaffold/.agent/skills/total-recall/skills/tr-cli-agents/scripts/.gitkeep +0 -0
- package/scaffold/.agent/skills/total-recall/skills/tr-cli-agents/subagents/.gitkeep +0 -0
- package/scaffold/.agent/skills/total-recall/skills/tr-research/SKILL.md +0 -338
- package/scaffold/.agent/skills/total-recall/skills/tr-skill/SKILL.md +0 -282
- package/scaffold/.agent/skills/total-recall/skills/tr-skill/assets/skill-template/SKILL.md +0 -20
- package/scaffold/.agent/skills/total-recall/skills/tr-skill/evals/evals.json +0 -20
- package/scaffold/.agent/skills/total-recall/skills/tr-skill/hooks/on-skill-add.sh +0 -14
- package/scaffold/.agent/skills/total-recall/skills/tr-skill/hooks/on-skill-delete.sh +0 -14
- package/scaffold/.agent/skills/total-recall/skills/tr-skill/learnings/.gitkeep +0 -0
- package/scaffold/.agent/skills/total-recall/skills/tr-skill/references/.gitkeep +0 -0
- package/scaffold/.agent/skills/total-recall/skills/tr-skill/scripts/.gitkeep +0 -0
- package/scaffold/.agent/skills/total-recall/skills/tr-skill/scripts/create-skill.sh +0 -65
- package/scaffold/.agent/skills/total-recall/skills/tr-skill/scripts/enforce-skill-optimization.mjs +0 -135
- package/scaffold/.agent/skills/total-recall/skills/tr-skill/scripts/skill-watcher.mjs +0 -64
- package/scaffold/.agent/skills/total-recall/skills/tr-skill/subagents/audit-all-skills.md +0 -62
- package/scaffold/.agent/skills/total-recall/skills/tr-ssss/SKILL.md +0 -298
- package/scaffold/.agent/skills/total-recall/skills/tr-ssss/evals/evals.json +0 -17
- package/scaffold/.agent/skills/total-recall/skills/tr-ssss/references/CHANGELOG.md +0 -124
- package/scaffold/.agent/skills/total-recall/skills/tr-ssss/references/ssss-spec.md +0 -1325
- package/scaffold/.agent/skills/total-recall/skills/tr-ssss/scripts/validate-schema.mjs +0 -232
- package/scaffold/.agent/skills/total-recall/skills/tr-ssss/subagents/audit-ssss-node.md +0 -9
- /package/scaffold/.agent/skills/total-recall/{skills/tr-cli-agents/evals → modules/skill-deploy/scripts}/.gitkeep +0 -0
- /package/scaffold/.agent/skills/total-recall/{skills/tr-skill → modules/skill-deploy}/scripts/find-skills.mjs +0 -0
- /package/scaffold/.agent/skills/total-recall/{skills/tr-skill → modules/skill-deploy}/scripts/install-skill.mjs +0 -0
- /package/scaffold/.agent/skills/total-recall/{skills/tr-skill → modules/skill-deploy}/scripts/scan-skill.mjs +0 -0
package/frontend/package.json
CHANGED
package/frontend/src/App.tsx
CHANGED
|
@@ -1,30 +1,22 @@
|
|
|
1
1
|
import { useState, useEffect } from 'react'
|
|
2
|
-
import { BrowserRouter, Routes, Route, NavLink, useLocation } from 'react-router-dom'
|
|
2
|
+
import { BrowserRouter, Routes, Route, NavLink, Navigate, useLocation } from 'react-router-dom'
|
|
3
3
|
import './App.css'
|
|
4
4
|
import { getApiBase, setApiBase, checkSession, logout, registerUnauthedCallback, fetchHealth } from './api'
|
|
5
5
|
import type { HealthData } from './types'
|
|
6
6
|
import LoginPage from './pages/LoginPage'
|
|
7
7
|
import ChatPage from './pages/ChatPage'
|
|
8
8
|
import MemoryPage from './pages/MemoryPage'
|
|
9
|
-
import HealthPage from './pages/HealthPage'
|
|
10
|
-
import SandboxPage from './pages/SandboxPage'
|
|
11
9
|
import SettingsPage from './pages/SettingsPage'
|
|
12
10
|
import TasksPage from './pages/TasksPage'
|
|
13
|
-
import FilesPage from './pages/FilesPage'
|
|
14
11
|
import ApiKeysPage from './pages/ApiKeysPage'
|
|
15
12
|
import IntegrationsPage from './pages/IntegrationsPage'
|
|
16
13
|
import BrainSelector from './components/BrainSelector'
|
|
17
|
-
import AutomationsPage from './pages/AutomationsPage'
|
|
18
|
-
import ModelsPage from './pages/ModelsPage'
|
|
19
14
|
import SkillsPage from './pages/SkillsPage'
|
|
20
|
-
import UsagePage from './pages/UsagePage'
|
|
21
|
-
import CollabPage from './pages/CollabPage'
|
|
22
15
|
import HelpPage from './pages/HelpPage'
|
|
23
16
|
import GraphPage from './pages/GraphPage'
|
|
24
|
-
import InstructionsPage from './pages/InstructionsPage'
|
|
25
|
-
import DesignDocsPage from './pages/DesignDocsPage'
|
|
26
|
-
import OkfPage from './pages/OkfPage'
|
|
27
17
|
import OpenWikiPage from './pages/OpenWikiPage'
|
|
18
|
+
import OnboardingPage, { isOnboardingComplete } from './pages/OnboardingPage'
|
|
19
|
+
import BrandMark from './components/brand/BrandMark'
|
|
28
20
|
|
|
29
21
|
// ─── Auth state type ──────────────────────────────────────────────────────────
|
|
30
22
|
type AuthState = 'loading' | 'authed' | 'unauthed'
|
|
@@ -62,10 +54,21 @@ function Sidebar({ onLogout, health, activeBrainId, onBrainChange }: SidebarProp
|
|
|
62
54
|
return (
|
|
63
55
|
<aside className="sidebar">
|
|
64
56
|
<div className="sidebar-brand">
|
|
65
|
-
<
|
|
66
|
-
|
|
57
|
+
<div className="sidebar-brand-lockup" title="Total Recall">
|
|
58
|
+
<BrandMark variant="lockup" height={48} alt="Total Recall" />
|
|
59
|
+
</div>
|
|
60
|
+
<span style={{ paddingLeft: 2 }}>Portable memory · any IDE</span>
|
|
67
61
|
</div>
|
|
68
62
|
<nav className="sidebar-nav">
|
|
63
|
+
<div className="nav-section-label">Memory</div>
|
|
64
|
+
{!isOnboardingComplete() && (
|
|
65
|
+
<NavLink to="/onboarding" className={({ isActive }) => `nav-link ${isActive ? 'active' : ''}`} id="nav-onboarding">
|
|
66
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
67
|
+
<path d="M12 2L2 7l10 5 10-5-10-5z" /><path d="M2 17l10 5 10-5" /><path d="M2 12l10 5 10-5" />
|
|
68
|
+
</svg>
|
|
69
|
+
Setup
|
|
70
|
+
</NavLink>
|
|
71
|
+
)}
|
|
69
72
|
<NavLink to="/" end className={({ isActive }) => `nav-link ${isActive ? 'active' : ''}`} id="nav-chat">
|
|
70
73
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
71
74
|
<path d="M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z" />
|
|
@@ -76,121 +79,56 @@ function Sidebar({ onLogout, health, activeBrainId, onBrainChange }: SidebarProp
|
|
|
76
79
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
77
80
|
<circle cx="12" cy="12" r="10" /><path d="M12 16v-4M12 8h.01" />
|
|
78
81
|
</svg>
|
|
79
|
-
|
|
80
|
-
</NavLink>
|
|
81
|
-
<NavLink to="/tasks" className={({ isActive }) => `nav-link ${isActive ? 'active' : ''}`} id="nav-tasks">
|
|
82
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
83
|
-
<path d="M9 11l3 3L22 4" /><path d="M21 12v7a2 2 0 01-2 2H5a2 2 0 01-2-2V5a2 2 0 012-2h11" />
|
|
84
|
-
</svg>
|
|
85
|
-
Tasks
|
|
86
|
-
</NavLink>
|
|
87
|
-
<NavLink to="/automations" className={({ isActive }) => `nav-link ${isActive ? 'active' : ''}`} id="nav-automations">
|
|
88
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
89
|
-
<circle cx="12" cy="12" r="10" />
|
|
90
|
-
<polyline points="12 6 12 12 16 14" />
|
|
91
|
-
</svg>
|
|
92
|
-
Automations
|
|
93
|
-
</NavLink>
|
|
94
|
-
<NavLink to="/files" className={({ isActive }) => `nav-link ${isActive ? 'active' : ''}`} id="nav-files">
|
|
95
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
96
|
-
<path d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z" />
|
|
97
|
-
</svg>
|
|
98
|
-
Files
|
|
99
|
-
</NavLink>
|
|
100
|
-
<NavLink to="/sandbox" className={({ isActive }) => `nav-link ${isActive ? 'active' : ''}`} id="nav-sandbox">
|
|
101
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
102
|
-
<polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" />
|
|
103
|
-
</svg>
|
|
104
|
-
Sandbox
|
|
105
|
-
</NavLink>
|
|
106
|
-
<NavLink to="/models" className={({ isActive }) => `nav-link ${isActive ? 'active' : ''}`} id="nav-models">
|
|
107
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
108
|
-
<path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"></path><polyline points="3.27 6.96 12 12.01 20.73 6.96"></polyline><line x1="12" y1="22.08" x2="12" y2="12"></line>
|
|
109
|
-
</svg>
|
|
110
|
-
Models & Agents
|
|
111
|
-
</NavLink>
|
|
112
|
-
<NavLink to="/health" className={({ isActive }) => `nav-link ${isActive ? 'active' : ''}`} id="nav-health">
|
|
113
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
114
|
-
<path d="M22 12h-4l-3 9L9 3l-3 9H2" />
|
|
115
|
-
</svg>
|
|
116
|
-
Health
|
|
82
|
+
Vault
|
|
117
83
|
</NavLink>
|
|
118
|
-
<NavLink to="/
|
|
119
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
120
|
-
<line x1="12" y1="1" x2="12" y2="23"></line>
|
|
121
|
-
<path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"></path>
|
|
122
|
-
</svg>
|
|
123
|
-
Usage & Costs
|
|
124
|
-
</NavLink>
|
|
125
|
-
<NavLink to="/settings" className={({ isActive }) => `nav-link ${isActive ? 'active' : ''}`} id="nav-settings">
|
|
84
|
+
<NavLink to="/graph" className={({ isActive }) => `nav-link ${isActive ? 'active' : ''}`} id="nav-graph">
|
|
126
85
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
127
|
-
<circle cx="
|
|
86
|
+
<circle cx="5" cy="6" r="2" /><circle cx="19" cy="6" r="2" /><circle cx="12" cy="18" r="2" />
|
|
87
|
+
<path d="M7 7l4 9M17 7l-4 9" />
|
|
128
88
|
</svg>
|
|
129
|
-
|
|
89
|
+
Graph
|
|
130
90
|
</NavLink>
|
|
131
|
-
<NavLink to="/
|
|
91
|
+
<NavLink to="/tasks" className={({ isActive }) => `nav-link ${isActive ? 'active' : ''}`} id="nav-tasks">
|
|
132
92
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
133
|
-
<path d="
|
|
93
|
+
<path d="M9 11l3 3L22 4" /><path d="M21 12v7a2 2 0 01-2 2H5a2 2 0 01-2-2V5a2 2 0 012-2h11" />
|
|
134
94
|
</svg>
|
|
135
|
-
|
|
95
|
+
Tasks
|
|
136
96
|
</NavLink>
|
|
97
|
+
|
|
98
|
+
<div className="nav-section-label">Connect</div>
|
|
137
99
|
<NavLink to="/integrations" className={({ isActive }) => `nav-link ${isActive ? 'active' : ''}`} id="nav-integrations">
|
|
138
100
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
139
101
|
<path d="M10 13a5 5 0 007.54.54l3-3a5 5 0 00-7.07-7.07l-1.72 1.71" />
|
|
140
102
|
<path d="M14 11a5 5 0 00-7.54-.54l-3 3a5 5 0 007.07 7.07l1.71-1.71" />
|
|
141
103
|
</svg>
|
|
142
|
-
|
|
104
|
+
IDEs
|
|
143
105
|
</NavLink>
|
|
144
106
|
<NavLink to="/skills" className={({ isActive }) => `nav-link ${isActive ? 'active' : ''}`} id="nav-skills">
|
|
145
107
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
146
108
|
<path d="M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5" />
|
|
147
109
|
</svg>
|
|
148
|
-
Skills
|
|
149
|
-
</NavLink>
|
|
150
|
-
<NavLink to="/collab" className={({ isActive }) => `nav-link ${isActive ? 'active' : ''}`} id="nav-collab">
|
|
151
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
152
|
-
<path d="M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2" />
|
|
153
|
-
<circle cx="9" cy="7" r="4" />
|
|
154
|
-
<path d="M23 21v-2a4 4 0 00-3-3.87" />
|
|
155
|
-
<path d="M16 3.13a4 4 0 010 7.75" />
|
|
156
|
-
</svg>
|
|
157
|
-
Collaboration
|
|
158
|
-
</NavLink>
|
|
159
|
-
<NavLink to="/instructions" className={({ isActive }) => `nav-link ${isActive ? 'active' : ''}`} id="nav-instructions">
|
|
160
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
161
|
-
<path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z" />
|
|
162
|
-
<polyline points="14 2 14 8 20 8" />
|
|
163
|
-
<line x1="16" y1="13" x2="8" y2="13" />
|
|
164
|
-
<line x1="16" y1="17" x2="8" y2="17" />
|
|
165
|
-
<polyline points="10 9 9 9 8 9" />
|
|
166
|
-
</svg>
|
|
167
|
-
Instructions
|
|
110
|
+
Skills
|
|
168
111
|
</NavLink>
|
|
169
|
-
<NavLink to="/
|
|
112
|
+
<NavLink to="/openwiki" className={({ isActive }) => `nav-link ${isActive ? 'active' : ''}`} id="nav-openwiki">
|
|
170
113
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
171
|
-
<
|
|
172
|
-
<
|
|
173
|
-
<line x1="9" y1="21" x2="9" y2="9" />
|
|
114
|
+
<path d="M2 3h6a4 4 0 014 4v14a3 3 0 00-3-3H2z" />
|
|
115
|
+
<path d="M22 3h-6a4 4 0 00-4 4v14a3 3 0 013-3h7z" />
|
|
174
116
|
</svg>
|
|
175
|
-
|
|
117
|
+
OpenWiki
|
|
176
118
|
</NavLink>
|
|
177
|
-
|
|
119
|
+
|
|
120
|
+
<div className="nav-section-label">Account</div>
|
|
121
|
+
<NavLink to="/keys" className={({ isActive }) => `nav-link ${isActive ? 'active' : ''}`} id="nav-keys">
|
|
178
122
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
179
|
-
<path d="M21
|
|
180
|
-
<polyline points="7.5 4.21 12 6.81 16.5 4.21" />
|
|
181
|
-
<polyline points="7.5 19.79 7.5 14.6 3 12" />
|
|
182
|
-
<polyline points="21 12 16.5 14.6 16.5 19.79" />
|
|
183
|
-
<polyline points="3.27 6.96 12 12.01 20.73 6.96" />
|
|
184
|
-
<line x1="12" y1="22.08" x2="12" y2="12" />
|
|
123
|
+
<path d="M21 2l-2 2m-7.61 7.61a5.5 5.5 0 11-7.778 7.778 5.5 5.5 0 017.777-7.777zm0 0L15.5 7.5m0 0l3 3L22 7l-3-3m-3.5 3.5L19 4" />
|
|
185
124
|
</svg>
|
|
186
|
-
|
|
125
|
+
Secrets
|
|
187
126
|
</NavLink>
|
|
188
|
-
<NavLink to="/
|
|
127
|
+
<NavLink to="/settings" className={({ isActive }) => `nav-link ${isActive ? 'active' : ''}`} id="nav-settings">
|
|
189
128
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
190
|
-
<path d="
|
|
191
|
-
<path d="M22 3h-6a4 4 0 00-4 4v14a3 3 0 013-3h7z" />
|
|
129
|
+
<circle cx="12" cy="12" r="3" /><path d="M19.4 15a1.65 1.65 0 00.33 1.82l.06.06a2 2 0 010 2.83 2 2 0 01-2.83 0l-.06-.06a1.65 1.65 0 00-1.82-.33 1.65 1.65 0 00-1 1.51V21a2 2 0 01-4 0v-.09A1.65 1.65 0 009 19.4a1.65 1.65 0 00-1.82.33l-.06.06a2 2 0 01-2.83-2.83l.06-.06A1.65 1.65 0 004.68 15a1.65 1.65 0 00-1.51-1H3a2 2 0 010-4h.09A1.65 1.65 0 004.6 9a1.65 1.65 0 00-.33-1.82l-.06-.06a2 2 0 012.83-2.83l.06.06A1.65 1.65 0 009 4.68a1.65 1.65 0 001-1.51V3a2 2 0 014 0v.09a1.65 1.65 0 001 1.51 1.65 1.65 0 001.82-.33l.06-.06a2 2 0 012.83 2.83l-.06.06A1.65 1.65 0 0019.4 9a1.65 1.65 0 001.51 1H21a2 2 0 010 4h-.09a1.65 1.65 0 00-1.51 1z" />
|
|
192
130
|
</svg>
|
|
193
|
-
|
|
131
|
+
Settings
|
|
194
132
|
</NavLink>
|
|
195
133
|
<NavLink to="/help" className={({ isActive }) => `nav-link ${isActive ? 'active' : ''}`} id="nav-help">
|
|
196
134
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
@@ -198,40 +136,39 @@ function Sidebar({ onLogout, health, activeBrainId, onBrainChange }: SidebarProp
|
|
|
198
136
|
<path d="M9.09 9a3 3 0 015.83 1c0 2-3 3-3 3" />
|
|
199
137
|
<line x1="12" y1="17" x2="12.01" y2="17" />
|
|
200
138
|
</svg>
|
|
201
|
-
|
|
202
|
-
</NavLink>
|
|
203
|
-
<NavLink to="/graph" className={({ isActive }) => `nav-link ${isActive ? 'active' : ''}`} id="nav-graph">
|
|
204
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
205
|
-
<polygon points="12 2 2 22 22 22" />
|
|
206
|
-
</svg>
|
|
207
|
-
Sovereign Graph
|
|
139
|
+
Help
|
|
208
140
|
</NavLink>
|
|
141
|
+
{isOnboardingComplete() && (
|
|
142
|
+
<NavLink to="/onboarding" className={({ isActive }) => `nav-link ${isActive ? 'active' : ''}`} id="nav-onboarding-replay" style={{ opacity: 0.75 }}>
|
|
143
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
144
|
+
<path d="M12 2L2 7l10 5 10-5-10-5z" /><path d="M2 17l10 5 10-5" /><path d="M2 12l10 5 10-5" />
|
|
145
|
+
</svg>
|
|
146
|
+
Setup guide
|
|
147
|
+
</NavLink>
|
|
148
|
+
)}
|
|
209
149
|
</nav>
|
|
210
|
-
<div className="sidebar-footer">
|
|
211
|
-
<
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
<option value=
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
)}
|
|
233
|
-
</select>
|
|
234
|
-
</div>
|
|
150
|
+
<div className="sidebar-footer" style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
|
|
151
|
+
<BrainSelector activeBrainId={activeBrainId} onBrainChange={onBrainChange} />
|
|
152
|
+
<select
|
|
153
|
+
value={getApiBase()}
|
|
154
|
+
onChange={e => setApiBase(e.target.value)}
|
|
155
|
+
title="API host"
|
|
156
|
+
style={{
|
|
157
|
+
width: '100%',
|
|
158
|
+
background: 'rgba(148, 163, 184, 0.06)',
|
|
159
|
+
color: 'var(--text-tertiary)',
|
|
160
|
+
border: '1px solid var(--border)',
|
|
161
|
+
borderRadius: 8,
|
|
162
|
+
padding: '5px 8px',
|
|
163
|
+
fontSize: 10,
|
|
164
|
+
outline: 'none',
|
|
165
|
+
}}
|
|
166
|
+
>
|
|
167
|
+
<option value="">Local API</option>
|
|
168
|
+
{import.meta.env.VITE_BRAIN_URL && (
|
|
169
|
+
<option value={import.meta.env.VITE_BRAIN_URL}>{new URL(import.meta.env.VITE_BRAIN_URL).host}</option>
|
|
170
|
+
)}
|
|
171
|
+
</select>
|
|
235
172
|
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
|
|
236
173
|
<div style={{ display: 'flex', flexDirection: 'column', gap: 4, fontSize: 11 }}>
|
|
237
174
|
{(() => {
|
|
@@ -294,9 +231,19 @@ function Sidebar({ onLogout, health, activeBrainId, onBrainChange }: SidebarProp
|
|
|
294
231
|
|
|
295
232
|
// ─── Main content (routes) ────────────────────────────────────────────────────
|
|
296
233
|
|
|
234
|
+
function OnboardingRedirect() {
|
|
235
|
+
const location = useLocation()
|
|
236
|
+
// First visit: force guided onboarding until complete (local flag or vault profile)
|
|
237
|
+
if (!isOnboardingComplete() && location.pathname !== '/onboarding') {
|
|
238
|
+
return <Navigate to="/onboarding" replace />
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
return null
|
|
242
|
+
}
|
|
243
|
+
|
|
297
244
|
function MainContent({ activeBrainId, onBrainChange }: { activeBrainId: string; onBrainChange: (id: string) => void }) {
|
|
298
245
|
const location = useLocation();
|
|
299
|
-
const isChat = location.pathname === '/';
|
|
246
|
+
const isChat = location.pathname === '/' || location.pathname === '/chat';
|
|
300
247
|
const [floatingChat, setFloatingChat] = useState(false);
|
|
301
248
|
|
|
302
249
|
useEffect(() => {
|
|
@@ -331,10 +278,14 @@ function MainContent({ activeBrainId, onBrainChange }: { activeBrainId: string;
|
|
|
331
278
|
|
|
332
279
|
return (
|
|
333
280
|
<main className="main-content" style={{ display: 'flex', flexDirection: 'column', height: '100%', overflow: 'hidden', position: 'relative' }}>
|
|
281
|
+
<OnboardingRedirect />
|
|
334
282
|
<div style={chatStyle}>
|
|
335
283
|
{floatingChat && (
|
|
336
284
|
<div style={{ padding: '8px', background: 'var(--bg-secondary)', borderBottom: '1px solid var(--border)', display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
|
|
337
|
-
<span style={{ fontSize: 12, fontWeight: 600 }}>
|
|
285
|
+
<span style={{ fontSize: 12, fontWeight: 600, display: 'flex', alignItems: 'center', gap: 8 }}>
|
|
286
|
+
<img src="/brand/total-recall-icon.svg" alt="" width={18} height={18} style={{ borderRadius: 4 }} />
|
|
287
|
+
Total Recall
|
|
288
|
+
</span>
|
|
338
289
|
<button onClick={() => setFloatingChat(false)} style={{ background: 'none', border: 'none', cursor: 'pointer', color: 'var(--text-tertiary)' }}>✖</button>
|
|
339
290
|
</div>
|
|
340
291
|
)}
|
|
@@ -343,26 +294,32 @@ function MainContent({ activeBrainId, onBrainChange }: { activeBrainId: string;
|
|
|
343
294
|
{(!isChat || floatingChat) && (
|
|
344
295
|
<div style={{ flex: 1, overflow: 'auto' }}>
|
|
345
296
|
<Routes>
|
|
346
|
-
<Route path="/" element={<
|
|
297
|
+
<Route path="/" element={<Navigate to={isOnboardingComplete() ? '/openwiki' : '/onboarding'} replace />} />
|
|
298
|
+
<Route path="/chat" element={<ChatPage activeBrainId={activeBrainId} />} />
|
|
299
|
+
<Route path="/onboarding" element={<OnboardingPage />} />
|
|
347
300
|
<Route path="/memory" element={<MemoryPage activeBrainId={activeBrainId} />} />
|
|
301
|
+
<Route path="/graph" element={<GraphPage activeBrainId={activeBrainId} />} />
|
|
348
302
|
<Route path="/tasks" element={<TasksPage />} />
|
|
349
|
-
<Route path="/automations" element={<AutomationsPage />} />
|
|
350
|
-
<Route path="/files" element={<FilesPage />} />
|
|
351
|
-
<Route path="/sandbox" element={<SandboxPage />} />
|
|
352
|
-
<Route path="/models" element={<ModelsPage />} />
|
|
353
|
-
<Route path="/health" element={<HealthPage />} />
|
|
354
|
-
<Route path="/usage" element={<UsagePage />} />
|
|
355
|
-
<Route path="/settings" element={<SettingsPage />} />
|
|
356
|
-
<Route path="/keys" element={<ApiKeysPage />} />
|
|
357
|
-
<Route path="/integrations" element={<IntegrationsPage />} />
|
|
358
303
|
<Route path="/skills" element={<SkillsPage />} />
|
|
359
|
-
<Route path="/
|
|
360
|
-
<Route path="/
|
|
361
|
-
<Route path="/
|
|
362
|
-
<Route path="/
|
|
363
|
-
<Route path="/openwiki" element={<OpenWikiPage />} />
|
|
304
|
+
<Route path="/openwiki" element={<OpenWikiPage activeBrainId={activeBrainId} />} />
|
|
305
|
+
<Route path="/integrations" element={<IntegrationsPage />} />
|
|
306
|
+
<Route path="/keys" element={<ApiKeysPage />} />
|
|
307
|
+
<Route path="/settings" element={<SettingsPage />} />
|
|
364
308
|
<Route path="/help" element={<HelpPage />} />
|
|
365
|
-
|
|
309
|
+
{/* Legacy OS-control-plane routes → core product */}
|
|
310
|
+
<Route path="/vault" element={<Navigate to="/memory" replace />} />
|
|
311
|
+
<Route path="/inbox" element={<Navigate to="/tasks" replace />} />
|
|
312
|
+
<Route path="/automations" element={<Navigate to="/tasks" replace />} />
|
|
313
|
+
<Route path="/files" element={<Navigate to="/memory" replace />} />
|
|
314
|
+
<Route path="/sandbox" element={<Navigate to="/memory" replace />} />
|
|
315
|
+
<Route path="/models" element={<Navigate to="/settings" replace />} />
|
|
316
|
+
<Route path="/health" element={<Navigate to="/settings" replace />} />
|
|
317
|
+
<Route path="/usage" element={<Navigate to="/settings" replace />} />
|
|
318
|
+
<Route path="/collab" element={<Navigate to="/memory" replace />} />
|
|
319
|
+
<Route path="/instructions" element={<Navigate to="/memory" replace />} />
|
|
320
|
+
<Route path="/design" element={<Navigate to="/memory" replace />} />
|
|
321
|
+
<Route path="/okf" element={<Navigate to="/memory" replace />} />
|
|
322
|
+
<Route path="*" element={<Navigate to="/memory" replace />} />
|
|
366
323
|
</Routes>
|
|
367
324
|
</div>
|
|
368
325
|
)}
|