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,427 +0,0 @@
1
- import { useState, useCallback, useEffect } from 'react'
2
- import {
3
- listTasks,
4
- createTask,
5
- listResearch,
6
- createResearch,
7
- fetchLogs,
8
- triggerRecompile,
9
- readMemory
10
- } from '../api'
11
- import type { Task, MemoryNode } from '../types'
12
- import TaskQueueTab from '../components/TaskQueueTab'
13
- import ResearchAgendaTab from '../components/ResearchAgendaTab'
14
- import type { ResearchItem } from '../components/ResearchAgendaTab'
15
- import DaemonLogsTab from '../components/DaemonLogsTab'
16
-
17
- export default function TasksPage() {
18
- const [tasks, setTasks] = useState<Task[]>([])
19
- const [researchItems, setResearchItems] = useState<ResearchItem[]>([])
20
- const [researchCounts, setResearchCounts] = useState({ pending: 0, in_progress: 0, done: 0, failed: 0 })
21
- const [logs, setLogs] = useState('(loading live cognitive stream...)')
22
- const [activeTab, setActiveTab] = useState<'tasks' | 'research' | 'logs'>('tasks')
23
-
24
- const [loading, setLoading] = useState(true)
25
- const [error, setError] = useState('')
26
- const [recompiling, setRecompiling] = useState(false)
27
- const [actionSuccess, setActionSuccess] = useState('')
28
-
29
- // Expanded research and lazy-loaded nodes
30
- const [expandedResearchId, setExpandedResearchId] = useState<string | null>(null)
31
- const [loadedDiscoveries, setLoadedDiscoveries] = useState<Record<string, MemoryNode | null>>({})
32
- const [loadingNodeSlugs, setLoadingNodeSlugs] = useState<Record<string, boolean>>({})
33
-
34
- const handleToggleExpand = async (item: ResearchItem) => {
35
- if (expandedResearchId === item.id) {
36
- setExpandedResearchId(null)
37
- return
38
- }
39
-
40
- setExpandedResearchId(item.id)
41
-
42
- if (item.node_slug && !loadedDiscoveries[item.node_slug] && !loadingNodeSlugs[item.node_slug]) {
43
- setLoadingNodeSlugs(prev => ({ ...prev, [item.node_slug!]: true }))
44
- try {
45
- const node = await readMemory(item.node_slug)
46
- setLoadedDiscoveries(prev => ({ ...prev, [item.node_slug!]: node }))
47
- } catch (e) {
48
- console.error('Failed to load memory node for research', e)
49
- setError(`Failed to load memory node: ${(e as Error).message}`)
50
- } finally {
51
- setLoadingNodeSlugs(prev => ({ ...prev, [item.node_slug!]: false }))
52
- }
53
- }
54
- }
55
-
56
- // Task creation form state
57
- const [showTaskForm, setShowTaskForm] = useState(false)
58
- const [taskCategory, setTaskCategory] = useState('fact-seeker')
59
- const [taskTarget, setTaskTarget] = useState('')
60
- const [taskBody, setTaskBody] = useState('')
61
- const [taskSubmitting, setTaskSubmitting] = useState(false)
62
-
63
- // Research creation form state
64
- const [showResearchForm, setShowResearchForm] = useState(false)
65
- const [researchTopic, setResearchTopic] = useState('')
66
- const [researchPriority, setResearchPriority] = useState<'low' | 'medium' | 'high' | 'critical'>('medium')
67
-
68
- const [researchNotes, setResearchNotes] = useState('')
69
- const [researchSubmitting, setResearchSubmitting] = useState(false)
70
-
71
- // Fetch Scheduler Tasks
72
- const fetchTasks = useCallback(async () => {
73
- try {
74
- const data = await listTasks()
75
- setTasks(data || [])
76
- setError('')
77
- } catch (e) {
78
- console.error(e)
79
- setError(`Failed to fetch tasks: ${(e as Error).message}`)
80
- }
81
- }, [])
82
-
83
- const fetchResearchItems = useCallback(async () => {
84
- try {
85
- const res = await listResearch()
86
- setResearchItems(res.items || [])
87
- const counts = { pending: 0, in_progress: 0, done: 0, failed: 0 }
88
- for (const item of (res.items || [])) {
89
- if (counts[item.status as keyof typeof counts] !== undefined) {
90
- counts[item.status as keyof typeof counts]++
91
- }
92
- }
93
- setResearchCounts(counts)
94
- setError('')
95
- } catch (e) {
96
- console.error(e)
97
- setError(`Failed to fetch research: ${(e as Error).message}`)
98
- }
99
- }, [])
100
-
101
- // Fetch Daemon (Cognitive Engine) Logs
102
- const fetchDaemonLogs = useCallback(async () => {
103
- if (activeTab !== 'logs') return
104
- try {
105
- const data = await fetchLogs("server")
106
- setLogs(data.content || '(no logs streamed yet)')
107
- return true
108
- } catch (e) {
109
- setLogs(`Error connecting to cognitive logs: ${(e as Error).message}`)
110
- return false
111
- }
112
- }, [activeTab])
113
-
114
- // Combined Refresh
115
- const refreshAll = useCallback(async () => {
116
- setLoading(true)
117
- await Promise.all([fetchTasks(), fetchResearchItems(), fetchDaemonLogs()])
118
- setLoading(false)
119
- }, [fetchTasks, fetchResearchItems, fetchDaemonLogs])
120
-
121
- // Polling loop
122
- useEffect(() => {
123
- let timeoutId: ReturnType<typeof setTimeout>
124
- let active = true
125
- let failCount = 0
126
-
127
- const poll = async () => {
128
- if (!active) return
129
-
130
- const results = await Promise.all([fetchTasks(), fetchResearchItems(), fetchDaemonLogs()])
131
- const hasError = results.includes(false)
132
-
133
- if (hasError) {
134
- failCount++
135
- } else {
136
- failCount = 0
137
- }
138
-
139
- if (active) {
140
- const delay = Math.min(3000 * Math.pow(2, failCount), 60000)
141
- timeoutId = setTimeout(poll, delay)
142
- }
143
- }
144
-
145
- const init = async () => {
146
- await Promise.all([fetchTasks(), fetchResearchItems(), fetchDaemonLogs()])
147
- setLoading(false)
148
- if (active) {
149
- timeoutId = setTimeout(poll, 3000)
150
- }
151
- }
152
- void init()
153
-
154
- return () => {
155
- active = false
156
- clearTimeout(timeoutId)
157
- }
158
- }, [fetchTasks, fetchResearchItems, fetchDaemonLogs])
159
-
160
- // Trigger Brain Recompilation
161
- const handleRecompile = async () => {
162
- if (recompiling) return
163
- setRecompiling(true)
164
- setError('')
165
- setActionSuccess('')
166
- try {
167
- await triggerRecompile()
168
- setActionSuccess('Surface projections recompiled successfully')
169
- setTimeout(() => setActionSuccess(''), 4000)
170
- void refreshAll()
171
- } catch (e) {
172
- setError(`Recompile failed: ${(e as Error).message}`)
173
- } finally {
174
- setRecompiling(false)
175
- }
176
- }
177
-
178
- // Seed Autonomous Gaps to fill the queue
179
- const handleSeedGaps = async () => {
180
- setError('')
181
- setActionSuccess('')
182
- try {
183
- await createTask(
184
- 'fact-seeker',
185
- 'Audit latest Chrome Extension MV3 API updates',
186
- 'Verify if chrome.declarativeNetRequest rulesets have new declarative properties.'
187
- )
188
- await createTask(
189
- 'post-mortem-daily',
190
- 'Ingest yesterday\'s IDE compile session logs',
191
- 'Analyze TypeScript build latency and suggest performance optimizations.'
192
- )
193
- await createTask(
194
- 'clarity-rewriter',
195
- 'Harden security.yml authentication encryption',
196
- 'Enforce bcrypt rounds to 12 and verify cross-origin session domain locks.'
197
- )
198
-
199
- await createResearch(
200
- 'TypeScript 5.4 advanced mapped types and template literal constraints',
201
- 'high',
202
- 'Evaluate mapped type performance on large monorepos.'
203
- )
204
- await createResearch(
205
- 'Glassmorphism backdrop-filter performance optimizations on mobile Safari',
206
- 'medium',
207
- 'Prevent GPU compositing lag by limiting blur radius.'
208
- )
209
- await createResearch(
210
- 'Local LLM quantization (GGUF vs EXL2) memory efficiency on macOS',
211
- 'high',
212
- 'Check metal buffer usage in Ollama backend models.'
213
- )
214
-
215
- setActionSuccess('Autonomous gaps seeded successfully! Task queue and research agenda are now full.')
216
- setTimeout(() => setActionSuccess(''), 5000)
217
- void refreshAll()
218
- } catch (e) {
219
- setError((e as Error).message)
220
- }
221
- }
222
-
223
- // Create Task Handler
224
- const handleCreateTask = async (e: React.FormEvent) => {
225
- e.preventDefault()
226
- if (!taskTarget.trim()) return
227
- setTaskSubmitting(true)
228
- setError('')
229
- try {
230
- await createTask(taskCategory, taskTarget.trim(), taskBody.trim())
231
- setTaskTarget('')
232
- setTaskBody('')
233
- setShowTaskForm(false)
234
- setActionSuccess('Task enqueued successfully!')
235
- setTimeout(() => setActionSuccess(''), 3000)
236
- void fetchTasks()
237
- } catch (err) {
238
- setError((err as Error).message)
239
- } finally {
240
- setTaskSubmitting(false)
241
- }
242
- }
243
-
244
- // Create Research Handler
245
- const handleCreateResearch = async (e: React.FormEvent) => {
246
- e.preventDefault()
247
- if (!researchTopic.trim()) return
248
- setResearchSubmitting(true)
249
- setError('')
250
- try {
251
- await createResearch(researchTopic.trim(), researchPriority, researchNotes.trim() || undefined)
252
- setResearchTopic('')
253
- setResearchNotes('')
254
- setShowResearchForm(false)
255
- setActionSuccess('Research project enqueued successfully!')
256
- setTimeout(() => setActionSuccess(''), 3000)
257
- void fetchResearchItems()
258
- } catch (err) {
259
- setError((err as Error).message)
260
- } finally {
261
- setResearchSubmitting(false)
262
- }
263
- }
264
-
265
- return (
266
- <div className="page">
267
- <div className="page-header" style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', flexWrap: 'wrap', gap: 16 }}>
268
- <div>
269
- <h1>Cognitive Dashboard</h1>
270
- <p>Real-time background reasoning engine, autonomous research, and active schedulers</p>
271
- </div>
272
-
273
- <div style={{ display: 'flex', gap: 10 }}>
274
- <button
275
- className="btn btn-ghost btn-sm"
276
- onClick={handleSeedGaps}
277
- style={{
278
- border: '1px solid rgba(59, 130, 246, 0.4)',
279
- background: 'rgba(59, 130, 246, 0.05)',
280
- color: '#60a5fa'
281
- }}
282
- >
283
- 🔥 Seed Gaps
284
- </button>
285
-
286
- <button
287
- className="btn btn-sm"
288
- onClick={handleRecompile}
289
- disabled={recompiling}
290
- style={{
291
- background: recompiling ? 'var(--bg-secondary)' : 'linear-gradient(135deg, #3b82f6, #1d4ed8)',
292
- color: '#ffffff',
293
- border: 'none',
294
- cursor: recompiling ? 'not-allowed' : 'pointer'
295
- }}
296
- >
297
- {recompiling ? (
298
- <span style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
299
- <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" style={{ animation: 'spin 1s linear infinite' }}>
300
- <path d="M21 12a9 9 0 1 1-6.219-8.56"/>
301
- </svg>
302
- Compiling...
303
- </span>
304
- ) : 'Recompile Surface'}
305
- </button>
306
- </div>
307
- </div>
308
-
309
- {error && <div className="badge badge-error" style={{ marginBottom: 16, display: 'inline-flex' }}>⚠️ {error}</div>}
310
- {actionSuccess && <div className="badge badge-success" style={{ marginBottom: 16, display: 'inline-flex', background: 'rgba(16, 185, 129, 0.1)', border: '1px solid #10b981', color: '#34d399' }}>✓ {actionSuccess}</div>}
311
-
312
- {/* Tabs Layout */}
313
- <div style={{
314
- display: 'flex',
315
- borderBottom: '1px solid var(--border)',
316
- marginBottom: 20,
317
- gap: 20,
318
- }}>
319
- <button
320
- onClick={() => setActiveTab('tasks')}
321
- style={{
322
- background: 'none',
323
- border: 'none',
324
- borderBottom: activeTab === 'tasks' ? '2px solid #3b82f6' : '2px solid transparent',
325
- color: activeTab === 'tasks' ? 'var(--text-primary)' : 'var(--text-tertiary)',
326
- padding: '10px 4px',
327
- cursor: 'pointer',
328
- fontSize: 14,
329
- fontWeight: 500,
330
- display: 'flex',
331
- alignItems: 'center',
332
- gap: 8
333
- }}
334
- >
335
- 📅 Task Queue
336
- <span className="badge badge-accent" style={{ fontSize: 10, padding: '2px 6px' }}>{tasks.length}</span>
337
- </button>
338
-
339
- <button
340
- onClick={() => setActiveTab('research')}
341
- style={{
342
- background: 'none',
343
- border: 'none',
344
- borderBottom: activeTab === 'research' ? '2px solid #3b82f6' : '2px solid transparent',
345
- color: activeTab === 'research' ? 'var(--text-primary)' : 'var(--text-tertiary)',
346
- padding: '10px 4px',
347
- cursor: 'pointer',
348
- fontSize: 14,
349
- fontWeight: 500,
350
- display: 'flex',
351
- alignItems: 'center',
352
- gap: 8
353
- }}
354
- >
355
- 🔬 Research Agenda
356
- <span className="badge" style={{ fontSize: 10, padding: '2px 6px', background: 'rgba(16, 185, 129, 0.1)', color: '#34d399', border: '1px solid rgba(16, 185, 129, 0.2)' }}>
357
- {researchCounts.pending + researchCounts.in_progress}
358
- </span>
359
- </button>
360
-
361
- <button
362
- onClick={() => setActiveTab('logs')}
363
- style={{
364
- background: 'none',
365
- border: 'none',
366
- borderBottom: activeTab === 'logs' ? '2px solid #3b82f6' : '2px solid transparent',
367
- color: activeTab === 'logs' ? 'var(--text-primary)' : 'var(--text-tertiary)',
368
- padding: '10px 4px',
369
- cursor: 'pointer',
370
- fontSize: 14,
371
- fontWeight: 500,
372
- display: 'flex',
373
- alignItems: 'center',
374
- gap: 8
375
- }}
376
- >
377
- 📟 Live Brain Stream
378
- <span className="pulse" style={{ background: '#10b981', width: 6, height: 6, borderRadius: '50%' }} />
379
- </button>
380
- </div>
381
-
382
- {/* Tab Panels */}
383
- {activeTab === 'tasks' && (
384
- <TaskQueueTab
385
- tasks={tasks}
386
- loading={loading}
387
- showTaskForm={showTaskForm}
388
- setShowTaskForm={setShowTaskForm}
389
- taskCategory={taskCategory}
390
- setTaskCategory={setTaskCategory}
391
- taskTarget={taskTarget}
392
- setTaskTarget={setTaskTarget}
393
- taskBody={taskBody}
394
- setTaskBody={setTaskBody}
395
- taskSubmitting={taskSubmitting}
396
- handleCreateTask={handleCreateTask}
397
- />
398
- )}
399
-
400
- {activeTab === 'research' && (
401
- <ResearchAgendaTab
402
- researchItems={researchItems}
403
- loading={loading}
404
- showResearchForm={showResearchForm}
405
- setShowResearchForm={setShowResearchForm}
406
- researchTopic={researchTopic}
407
- setResearchTopic={setResearchTopic}
408
- researchPriority={researchPriority}
409
- setResearchPriority={setResearchPriority}
410
- researchNotes={researchNotes}
411
- setResearchNotes={setResearchNotes}
412
- researchSubmitting={researchSubmitting}
413
- handleCreateResearch={handleCreateResearch}
414
- expandedResearchId={expandedResearchId}
415
- handleToggleExpand={handleToggleExpand}
416
- loadedDiscoveries={loadedDiscoveries}
417
- loadingNodeSlugs={loadingNodeSlugs}
418
- refreshResearch={fetchResearchItems}
419
- />
420
- )}
421
-
422
- {activeTab === 'logs' && (
423
- <DaemonLogsTab logs={logs} activeTab={activeTab} />
424
- )}
425
- </div>
426
- )
427
- }