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.
- package/bin/total-recall.mjs +10 -6
- package/docs/reference/cli-reference.md +18 -0
- package/frontend/dist/assets/index-4tGQfTa2.js +5605 -0
- package/frontend/dist/assets/index-DtwsDyFM.css +1 -0
- package/frontend/dist/index.html +2 -2
- package/frontend/package.json +11 -0
- package/frontend/src/App.tsx +47 -122
- package/frontend/src/components/plugins/plugin-frame.ts +1 -0
- package/frontend/src/index.css +152 -86
- package/frontend/src/pages/HelpPage.tsx +13 -10
- package/frontend/src/pages/MemoryPage.tsx +28 -30
- package/frontend/src/pages/NetworkPage.tsx +3 -3
- package/frontend/src/pages/PluginsPage.tsx +6 -5
- package/frontend/src/pages/RulesPage.tsx +16 -12
- package/package.json +4 -3
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/package-lock.json +3114 -36
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/package.json +4 -1
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package-lock.json +3114 -36
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package.json +4 -1
- package/scaffold/.agent/skills/total-recall/plugins/embeddings/package-lock.json +3121 -33
- package/scaffold/.agent/skills/total-recall/plugins/embeddings/package.json +4 -1
- package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/package-lock.json +3122 -34
- package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/package.json +4 -1
- package/scaffold/.agent/skills/total-recall/plugins/mesh/package-lock.json +3127 -49
- package/scaffold/.agent/skills/total-recall/plugins/mesh/package.json +5 -2
- package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/mesh.mjs +1 -1
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/capability/index.mjs +136 -7
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/cli.mjs +135 -26
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/package-lock.json +3121 -33
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/package.json +5 -2
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/plugin.json +228 -9
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/skills/meta-harness/SKILL.md +24 -30
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/alerts.mjs +29 -16
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/cascade.mjs +73 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/coordinator.mjs +182 -365
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/dispatch.mjs +33 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/documentation.mjs +40 -14
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/executor.mjs +4 -4
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/agy.mjs +187 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/claude.mjs +275 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/cline.mjs +132 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/codex.mjs +187 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/cursor.mjs +158 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/devin.mjs +157 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/dsh.mjs +183 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/grok.mjs +132 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/hermes.mjs +173 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/index.mjs +87 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/openclaw.mjs +173 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate-adapters/pi.mjs +129 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/gate.mjs +12 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/json-reply.mjs +22 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/learner.mjs +72 -70
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/model-catalog.mjs +195 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/paths.mjs +11 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/pool.mjs +36 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/review.mjs +169 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/router.mjs +136 -346
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/runtime.mjs +1 -1
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/ssss-store.mjs +20 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/telemetry.mjs +43 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/threads.mjs +156 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/worker.mjs +117 -35
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/worktree.mjs +51 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/card.js +398 -57
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/cli.mjs +304 -46
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/package-lock.json +367 -41
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/package.json +5 -2
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/plugin.json +33 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/config.mjs +2 -2
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/generate.mjs +159 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/graph.mjs +197 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/lint.mjs +153 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/mesh-vaults.mjs +261 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/refresh.mjs +151 -4
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/search.mjs +114 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/token.mjs +96 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/card.js +899 -662
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/vendor/openwiki.mjs +8987 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/vendor/skills/mermaid-diagrams/SKILL.md +44 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/vendor/skills/write-connector/SKILL.md +56 -0
- package/scaffold/.agent/skills/total-recall/plugins/security/package-lock.json +3097 -81
- package/scaffold/.agent/skills/total-recall/plugins/security/package.json +4 -1
- package/src/cli/agent.mjs +12 -1
- package/src/cli/compact.mjs +108 -0
- package/src/cli/connect.mjs +56 -1
- package/src/cli/context.mjs +55 -23
- package/src/cli/doctor.mjs +5 -2
- package/src/cli/forget.mjs +2 -0
- package/src/cli/harness.mjs +62 -50
- package/src/cli/memory-entry.mjs +2 -2
- package/src/cli/preflight.mjs +152 -16
- package/src/cli/release.mjs +386 -0
- package/src/cli/remember.mjs +19 -1
- package/src/cli/rules.mjs +54 -12
- package/src/cli/startup.mjs +1 -1
- package/src/cli/status.mjs +12 -2
- package/src/core/claude-hooks.mjs +41 -3
- package/src/core/cli-commands.mjs +2 -0
- package/src/core/cli-semantic-index.mjs +3 -2
- package/src/core/conflict-detector.mjs +23 -12
- package/src/core/context-compactor.mjs +145 -0
- package/src/core/context-policy.mjs +20 -0
- package/src/core/duplicate-guard.mjs +350 -0
- package/src/core/meta-harness.mjs +31 -11
- package/src/core/preflight-gate.mjs +2 -2
- package/src/core/preflight-receipt.mjs +29 -1
- package/src/core/scaffold-plugins.mjs +7 -0
- package/src/core/stdio-flush.mjs +23 -0
- package/src/core/surface.mjs +33 -10
- package/src/server/invoke-durability.mjs +39 -0
- package/src/server/invoke-write-child.mjs +25 -0
- package/src/server/routes/invoke.mjs +7 -0
- package/src/server/routes/plugins.mjs +2 -2
- package/frontend/dist/assets/index-BIQmqDKP.css +0 -1
- package/frontend/dist/assets/index-CRzjQLu7.js +0 -5631
- package/frontend/src/components/DaemonLogsTab.tsx +0 -54
- package/frontend/src/components/ResearchAgendaTab.tsx +0 -712
- package/frontend/src/components/TaskQueueTab.tsx +0 -193
- package/frontend/src/components/VoiceInput.tsx +0 -112
- package/frontend/src/pages/ChatPage.tsx +0 -1059
- package/frontend/src/pages/CollabPage.tsx +0 -470
- package/frontend/src/pages/DesignDocsPage.tsx +0 -621
- package/frontend/src/pages/FilesPage.tsx +0 -393
- package/frontend/src/pages/HealthPage.tsx +0 -359
- package/frontend/src/pages/InboxPage.tsx +0 -83
- package/frontend/src/pages/InstructionsPage.tsx +0 -583
- package/frontend/src/pages/IntegrationsPage.tsx +0 -761
- package/frontend/src/pages/MeshPage.css +0 -58
- package/frontend/src/pages/MeshPage.tsx +0 -1219
- package/frontend/src/pages/OkfPage.tsx +0 -535
- package/frontend/src/pages/SandboxPage.tsx +0 -113
- package/frontend/src/pages/SkillsPage.tsx +0 -1994
- package/frontend/src/pages/TasksPage.tsx +0 -427
- package/frontend/src/pages/UsagePage.tsx +0 -702
- package/scaffold/.agent/skills/total-recall/plugins/cli-agents/README.md +0 -65
- package/scaffold/.agent/skills/total-recall/plugins/cli-agents/cli.mjs +0 -76
- package/scaffold/.agent/skills/total-recall/plugins/cli-agents/package.json +0 -19
- package/scaffold/.agent/skills/total-recall/plugins/cli-agents/plugin.json +0 -266
- package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/adapters/dsh.mjs +0 -446
- package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/documentation.mjs +0 -152
- package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/executor.mjs +0 -71
- package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/runtime.mjs +0 -36
- package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/setup.mjs +0 -35
- package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/worker.mjs +0 -175
- package/scaffold/.agent/skills/total-recall/plugins/cli-agents/ui/DESIGN.md +0 -32
- 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
|
-
}
|