shieldcortex 2.0.0
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/LICENSE +21 -0
- package/README.md +282 -0
- package/dashboard/components.json +22 -0
- package/dashboard/eslint.config.mjs +42 -0
- package/dashboard/next.config.ts +7 -0
- package/dashboard/package-lock.json +8053 -0
- package/dashboard/package.json +44 -0
- package/dashboard/postcss.config.mjs +7 -0
- package/dashboard/public/file.svg +1 -0
- package/dashboard/public/globe.svg +1 -0
- package/dashboard/public/next.svg +1 -0
- package/dashboard/public/vercel.svg +1 -0
- package/dashboard/public/window.svg +1 -0
- package/dashboard/scripts/ensure-api.mjs +76 -0
- package/dashboard/src/app/error.tsx +49 -0
- package/dashboard/src/app/favicon.ico +0 -0
- package/dashboard/src/app/globals.css +130 -0
- package/dashboard/src/app/layout.tsx +35 -0
- package/dashboard/src/app/page.tsx +364 -0
- package/dashboard/src/components/Providers.tsx +27 -0
- package/dashboard/src/components/brain/ActivityPulseSystem.tsx +229 -0
- package/dashboard/src/components/brain/BrainMesh.tsx +133 -0
- package/dashboard/src/components/brain/BrainRegions.tsx +254 -0
- package/dashboard/src/components/brain/BrainScene.tsx +255 -0
- package/dashboard/src/components/brain/CategoryLabels.tsx +103 -0
- package/dashboard/src/components/brain/CoreSphere.tsx +215 -0
- package/dashboard/src/components/brain/DataFlowParticles.tsx +123 -0
- package/dashboard/src/components/brain/DataStreamRings.tsx +161 -0
- package/dashboard/src/components/brain/ElectronFlow.tsx +323 -0
- package/dashboard/src/components/brain/HolographicGrid.tsx +235 -0
- package/dashboard/src/components/brain/MemoryLinks.tsx +271 -0
- package/dashboard/src/components/brain/MemoryNode.tsx +245 -0
- package/dashboard/src/components/brain/NeuralPathways.tsx +441 -0
- package/dashboard/src/components/brain/SynapseNodes.tsx +312 -0
- package/dashboard/src/components/brain/TimelineControls.tsx +205 -0
- package/dashboard/src/components/chip/ChipScene.tsx +497 -0
- package/dashboard/src/components/chip/ChipSubstrate.tsx +238 -0
- package/dashboard/src/components/chip/CortexCore.tsx +210 -0
- package/dashboard/src/components/chip/DataBus.tsx +416 -0
- package/dashboard/src/components/chip/MemoryCell.tsx +225 -0
- package/dashboard/src/components/chip/MemoryGrid.tsx +328 -0
- package/dashboard/src/components/chip/QuantumCell.tsx +316 -0
- package/dashboard/src/components/chip/SectionLabel.tsx +113 -0
- package/dashboard/src/components/chip/index.ts +14 -0
- package/dashboard/src/components/controls/ControlPanel.tsx +106 -0
- package/dashboard/src/components/controls/VersionPanel.tsx +185 -0
- package/dashboard/src/components/dashboard/StatsPanel.tsx +164 -0
- package/dashboard/src/components/debug/ActivityLog.tsx +250 -0
- package/dashboard/src/components/debug/DebugPanel.tsx +101 -0
- package/dashboard/src/components/debug/QueryTester.tsx +192 -0
- package/dashboard/src/components/debug/RelationshipGraph.tsx +403 -0
- package/dashboard/src/components/debug/SqlConsole.tsx +319 -0
- package/dashboard/src/components/graph/KnowledgeGraph.tsx +230 -0
- package/dashboard/src/components/graph/OntologyGraph.tsx +631 -0
- package/dashboard/src/components/insights/ActivityHeatmap.tsx +131 -0
- package/dashboard/src/components/insights/InsightsView.tsx +46 -0
- package/dashboard/src/components/insights/KnowledgeMapPanel.tsx +80 -0
- package/dashboard/src/components/insights/QualityPanel.tsx +116 -0
- package/dashboard/src/components/memories/MemoriesView.tsx +150 -0
- package/dashboard/src/components/memories/MemoryCard.tsx +103 -0
- package/dashboard/src/components/memory/MemoryDetail.tsx +325 -0
- package/dashboard/src/components/nav/NavRail.tsx +54 -0
- package/dashboard/src/components/ui/button.tsx +62 -0
- package/dashboard/src/components/ui/card.tsx +92 -0
- package/dashboard/src/components/ui/input.tsx +21 -0
- package/dashboard/src/hooks/useDebouncedValue.ts +24 -0
- package/dashboard/src/hooks/useMemories.ts +458 -0
- package/dashboard/src/hooks/useSuggestions.ts +46 -0
- package/dashboard/src/lib/category-colors.ts +84 -0
- package/dashboard/src/lib/position-algorithm.ts +177 -0
- package/dashboard/src/lib/simplex-noise.ts +217 -0
- package/dashboard/src/lib/store.ts +88 -0
- package/dashboard/src/lib/utils.ts +6 -0
- package/dashboard/src/lib/websocket.ts +249 -0
- package/dashboard/src/types/memory.ts +73 -0
- package/dashboard/tsconfig.json +34 -0
- package/dist/__tests__/consolidation-merge.test.d.ts +9 -0
- package/dist/__tests__/consolidation-merge.test.d.ts.map +1 -0
- package/dist/__tests__/consolidation-merge.test.js +137 -0
- package/dist/__tests__/consolidation-merge.test.js.map +1 -0
- package/dist/__tests__/contradictions.test.d.ts +8 -0
- package/dist/__tests__/contradictions.test.d.ts.map +1 -0
- package/dist/__tests__/contradictions.test.js +78 -0
- package/dist/__tests__/contradictions.test.js.map +1 -0
- package/dist/__tests__/salience-evolution.test.d.ts +7 -0
- package/dist/__tests__/salience-evolution.test.d.ts.map +1 -0
- package/dist/__tests__/salience-evolution.test.js +151 -0
- package/dist/__tests__/salience-evolution.test.js.map +1 -0
- package/dist/__tests__/store.test.d.ts +7 -0
- package/dist/__tests__/store.test.d.ts.map +1 -0
- package/dist/__tests__/store.test.js +582 -0
- package/dist/__tests__/store.test.js.map +1 -0
- package/dist/api/control.d.ts +27 -0
- package/dist/api/control.d.ts.map +1 -0
- package/dist/api/control.js +60 -0
- package/dist/api/control.js.map +1 -0
- package/dist/api/events.d.ts +159 -0
- package/dist/api/events.d.ts.map +1 -0
- package/dist/api/events.js +155 -0
- package/dist/api/events.js.map +1 -0
- package/dist/api/version.d.ts +36 -0
- package/dist/api/version.d.ts.map +1 -0
- package/dist/api/version.js +146 -0
- package/dist/api/version.js.map +1 -0
- package/dist/api/visualization-server.d.ts +11 -0
- package/dist/api/visualization-server.d.ts.map +1 -0
- package/dist/api/visualization-server.js +1186 -0
- package/dist/api/visualization-server.js.map +1 -0
- package/dist/context/project-context.d.ts +57 -0
- package/dist/context/project-context.d.ts.map +1 -0
- package/dist/context/project-context.js +135 -0
- package/dist/context/project-context.js.map +1 -0
- package/dist/database/init.d.ts +49 -0
- package/dist/database/init.d.ts.map +1 -0
- package/dist/database/init.js +567 -0
- package/dist/database/init.js.map +1 -0
- package/dist/defence/__tests__/firewall.test.d.ts +8 -0
- package/dist/defence/__tests__/firewall.test.d.ts.map +1 -0
- package/dist/defence/__tests__/firewall.test.js +123 -0
- package/dist/defence/__tests__/firewall.test.js.map +1 -0
- package/dist/defence/__tests__/fragmentation.test.d.ts +7 -0
- package/dist/defence/__tests__/fragmentation.test.d.ts.map +1 -0
- package/dist/defence/__tests__/fragmentation.test.js +51 -0
- package/dist/defence/__tests__/fragmentation.test.js.map +1 -0
- package/dist/defence/__tests__/pipeline.test.d.ts +8 -0
- package/dist/defence/__tests__/pipeline.test.d.ts.map +1 -0
- package/dist/defence/__tests__/pipeline.test.js +61 -0
- package/dist/defence/__tests__/pipeline.test.js.map +1 -0
- package/dist/defence/__tests__/sensitivity.test.d.ts +7 -0
- package/dist/defence/__tests__/sensitivity.test.d.ts.map +1 -0
- package/dist/defence/__tests__/sensitivity.test.js +61 -0
- package/dist/defence/__tests__/sensitivity.test.js.map +1 -0
- package/dist/defence/__tests__/trust.test.d.ts +7 -0
- package/dist/defence/__tests__/trust.test.d.ts.map +1 -0
- package/dist/defence/__tests__/trust.test.js +49 -0
- package/dist/defence/__tests__/trust.test.js.map +1 -0
- package/dist/defence/audit/index.d.ts +4 -0
- package/dist/defence/audit/index.d.ts.map +1 -0
- package/dist/defence/audit/index.js +3 -0
- package/dist/defence/audit/index.js.map +1 -0
- package/dist/defence/audit/logger.d.ts +14 -0
- package/dist/defence/audit/logger.d.ts.map +1 -0
- package/dist/defence/audit/logger.js +54 -0
- package/dist/defence/audit/logger.js.map +1 -0
- package/dist/defence/audit/queries.d.ts +33 -0
- package/dist/defence/audit/queries.d.ts.map +1 -0
- package/dist/defence/audit/queries.js +103 -0
- package/dist/defence/audit/queries.js.map +1 -0
- package/dist/defence/firewall/anomaly-scorer.d.ts +8 -0
- package/dist/defence/firewall/anomaly-scorer.d.ts.map +1 -0
- package/dist/defence/firewall/anomaly-scorer.js +58 -0
- package/dist/defence/firewall/anomaly-scorer.js.map +1 -0
- package/dist/defence/firewall/encoding-detector.d.ts +13 -0
- package/dist/defence/firewall/encoding-detector.d.ts.map +1 -0
- package/dist/defence/firewall/encoding-detector.js +120 -0
- package/dist/defence/firewall/encoding-detector.js.map +1 -0
- package/dist/defence/firewall/index.d.ts +21 -0
- package/dist/defence/firewall/index.d.ts.map +1 -0
- package/dist/defence/firewall/index.js +133 -0
- package/dist/defence/firewall/index.js.map +1 -0
- package/dist/defence/firewall/instruction-detector.d.ts +12 -0
- package/dist/defence/firewall/instruction-detector.d.ts.map +1 -0
- package/dist/defence/firewall/instruction-detector.js +99 -0
- package/dist/defence/firewall/instruction-detector.js.map +1 -0
- package/dist/defence/firewall/privilege-detector.d.ts +13 -0
- package/dist/defence/firewall/privilege-detector.d.ts.map +1 -0
- package/dist/defence/firewall/privilege-detector.js +89 -0
- package/dist/defence/firewall/privilege-detector.js.map +1 -0
- package/dist/defence/fragmentation/assembly-detector.d.ts +18 -0
- package/dist/defence/fragmentation/assembly-detector.d.ts.map +1 -0
- package/dist/defence/fragmentation/assembly-detector.js +72 -0
- package/dist/defence/fragmentation/assembly-detector.js.map +1 -0
- package/dist/defence/fragmentation/entity-extractor.d.ts +19 -0
- package/dist/defence/fragmentation/entity-extractor.d.ts.map +1 -0
- package/dist/defence/fragmentation/entity-extractor.js +86 -0
- package/dist/defence/fragmentation/entity-extractor.js.map +1 -0
- package/dist/defence/fragmentation/index.d.ts +23 -0
- package/dist/defence/fragmentation/index.d.ts.map +1 -0
- package/dist/defence/fragmentation/index.js +49 -0
- package/dist/defence/fragmentation/index.js.map +1 -0
- package/dist/defence/fragmentation/temporal-analyzer.d.ts +28 -0
- package/dist/defence/fragmentation/temporal-analyzer.d.ts.map +1 -0
- package/dist/defence/fragmentation/temporal-analyzer.js +41 -0
- package/dist/defence/fragmentation/temporal-analyzer.js.map +1 -0
- package/dist/defence/index.d.ts +12 -0
- package/dist/defence/index.d.ts.map +1 -0
- package/dist/defence/index.js +18 -0
- package/dist/defence/index.js.map +1 -0
- package/dist/defence/pipeline.d.ts +9 -0
- package/dist/defence/pipeline.d.ts.map +1 -0
- package/dist/defence/pipeline.js +115 -0
- package/dist/defence/pipeline.js.map +1 -0
- package/dist/defence/scanner/index.d.ts +5 -0
- package/dist/defence/scanner/index.d.ts.map +1 -0
- package/dist/defence/scanner/index.js +5 -0
- package/dist/defence/scanner/index.js.map +1 -0
- package/dist/defence/scanner/scan-existing.d.ts +34 -0
- package/dist/defence/scanner/scan-existing.d.ts.map +1 -0
- package/dist/defence/scanner/scan-existing.js +136 -0
- package/dist/defence/scanner/scan-existing.js.map +1 -0
- package/dist/defence/sensitivity/classifier.d.ts +6 -0
- package/dist/defence/sensitivity/classifier.d.ts.map +1 -0
- package/dist/defence/sensitivity/classifier.js +50 -0
- package/dist/defence/sensitivity/classifier.js.map +1 -0
- package/dist/defence/sensitivity/index.d.ts +11 -0
- package/dist/defence/sensitivity/index.d.ts.map +1 -0
- package/dist/defence/sensitivity/index.js +13 -0
- package/dist/defence/sensitivity/index.js.map +1 -0
- package/dist/defence/sensitivity/patterns.d.ts +14 -0
- package/dist/defence/sensitivity/patterns.d.ts.map +1 -0
- package/dist/defence/sensitivity/patterns.js +67 -0
- package/dist/defence/sensitivity/patterns.js.map +1 -0
- package/dist/defence/sensitivity/redaction.d.ts +17 -0
- package/dist/defence/sensitivity/redaction.d.ts.map +1 -0
- package/dist/defence/sensitivity/redaction.js +47 -0
- package/dist/defence/sensitivity/redaction.js.map +1 -0
- package/dist/defence/trust/index.d.ts +3 -0
- package/dist/defence/trust/index.d.ts.map +1 -0
- package/dist/defence/trust/index.js +3 -0
- package/dist/defence/trust/index.js.map +1 -0
- package/dist/defence/trust/recall-filter.d.ts +10 -0
- package/dist/defence/trust/recall-filter.d.ts.map +1 -0
- package/dist/defence/trust/recall-filter.js +38 -0
- package/dist/defence/trust/recall-filter.js.map +1 -0
- package/dist/defence/trust/source-scorer.d.ts +6 -0
- package/dist/defence/trust/source-scorer.d.ts.map +1 -0
- package/dist/defence/trust/source-scorer.js +34 -0
- package/dist/defence/trust/source-scorer.js.map +1 -0
- package/dist/defence/types.d.ts +88 -0
- package/dist/defence/types.d.ts.map +1 -0
- package/dist/defence/types.js +15 -0
- package/dist/defence/types.js.map +1 -0
- package/dist/embeddings/generator.d.ts +20 -0
- package/dist/embeddings/generator.d.ts.map +1 -0
- package/dist/embeddings/generator.js +83 -0
- package/dist/embeddings/generator.js.map +1 -0
- package/dist/embeddings/index.d.ts +2 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +2 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/errors.d.ts +74 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +131 -0
- package/dist/errors.js.map +1 -0
- package/dist/graph/backfill.d.ts +6 -0
- package/dist/graph/backfill.d.ts.map +1 -0
- package/dist/graph/backfill.js +33 -0
- package/dist/graph/backfill.js.map +1 -0
- package/dist/graph/extract.d.ts +21 -0
- package/dist/graph/extract.d.ts.map +1 -0
- package/dist/graph/extract.js +231 -0
- package/dist/graph/extract.js.map +1 -0
- package/dist/graph/resolve.d.ts +6 -0
- package/dist/graph/resolve.d.ts.map +1 -0
- package/dist/graph/resolve.js +126 -0
- package/dist/graph/resolve.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +248 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/activation.d.ts +69 -0
- package/dist/memory/activation.d.ts.map +1 -0
- package/dist/memory/activation.js +168 -0
- package/dist/memory/activation.js.map +1 -0
- package/dist/memory/consolidate.d.ts +98 -0
- package/dist/memory/consolidate.d.ts.map +1 -0
- package/dist/memory/consolidate.js +511 -0
- package/dist/memory/consolidate.js.map +1 -0
- package/dist/memory/contradiction.d.ts +69 -0
- package/dist/memory/contradiction.d.ts.map +1 -0
- package/dist/memory/contradiction.js +286 -0
- package/dist/memory/contradiction.js.map +1 -0
- package/dist/memory/decay.d.ts +62 -0
- package/dist/memory/decay.d.ts.map +1 -0
- package/dist/memory/decay.js +184 -0
- package/dist/memory/decay.js.map +1 -0
- package/dist/memory/salience.d.ts +36 -0
- package/dist/memory/salience.d.ts.map +1 -0
- package/dist/memory/salience.js +216 -0
- package/dist/memory/salience.js.map +1 -0
- package/dist/memory/similarity.d.ts +57 -0
- package/dist/memory/similarity.d.ts.map +1 -0
- package/dist/memory/similarity.js +114 -0
- package/dist/memory/similarity.js.map +1 -0
- package/dist/memory/store.d.ts +179 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +1184 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/memory/types.d.ts +97 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +30 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +568 -0
- package/dist/server.js.map +1 -0
- package/dist/service/install.d.ts +15 -0
- package/dist/service/install.d.ts.map +1 -0
- package/dist/service/install.js +178 -0
- package/dist/service/install.js.map +1 -0
- package/dist/service/templates.d.ts +13 -0
- package/dist/service/templates.d.ts.map +1 -0
- package/dist/service/templates.js +58 -0
- package/dist/service/templates.js.map +1 -0
- package/dist/setup/claude-md.d.ts +12 -0
- package/dist/setup/claude-md.d.ts.map +1 -0
- package/dist/setup/claude-md.js +68 -0
- package/dist/setup/claude-md.js.map +1 -0
- package/dist/setup/clawdbot.d.ts +15 -0
- package/dist/setup/clawdbot.d.ts.map +1 -0
- package/dist/setup/clawdbot.js +118 -0
- package/dist/setup/clawdbot.js.map +1 -0
- package/dist/setup/doctor.d.ts +5 -0
- package/dist/setup/doctor.d.ts.map +1 -0
- package/dist/setup/doctor.js +141 -0
- package/dist/setup/doctor.js.map +1 -0
- package/dist/setup/hooks.d.ts +6 -0
- package/dist/setup/hooks.d.ts.map +1 -0
- package/dist/setup/hooks.js +36 -0
- package/dist/setup/hooks.js.map +1 -0
- package/dist/setup/migrate.d.ts +16 -0
- package/dist/setup/migrate.d.ts.map +1 -0
- package/dist/setup/migrate.js +164 -0
- package/dist/setup/migrate.js.map +1 -0
- package/dist/setup/settings-hooks.d.ts +7 -0
- package/dist/setup/settings-hooks.d.ts.map +1 -0
- package/dist/setup/settings-hooks.js +83 -0
- package/dist/setup/settings-hooks.js.map +1 -0
- package/dist/setup/uninstall.d.ts +12 -0
- package/dist/setup/uninstall.d.ts.map +1 -0
- package/dist/setup/uninstall.js +125 -0
- package/dist/setup/uninstall.js.map +1 -0
- package/dist/tools/context.d.ts +135 -0
- package/dist/tools/context.d.ts.map +1 -0
- package/dist/tools/context.js +273 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/forget.d.ts +53 -0
- package/dist/tools/forget.d.ts.map +1 -0
- package/dist/tools/forget.js +179 -0
- package/dist/tools/forget.js.map +1 -0
- package/dist/tools/graph.d.ts +46 -0
- package/dist/tools/graph.d.ts.map +1 -0
- package/dist/tools/graph.js +206 -0
- package/dist/tools/graph.js.map +1 -0
- package/dist/tools/recall.d.ts +79 -0
- package/dist/tools/recall.d.ts.map +1 -0
- package/dist/tools/recall.js +156 -0
- package/dist/tools/recall.js.map +1 -0
- package/dist/tools/remember.d.ts +83 -0
- package/dist/tools/remember.d.ts.map +1 -0
- package/dist/tools/remember.js +151 -0
- package/dist/tools/remember.js.map +1 -0
- package/dist/worker/brain-worker.d.ts +100 -0
- package/dist/worker/brain-worker.d.ts.map +1 -0
- package/dist/worker/brain-worker.js +283 -0
- package/dist/worker/brain-worker.js.map +1 -0
- package/dist/worker/link-discovery.d.ts +47 -0
- package/dist/worker/link-discovery.d.ts.map +1 -0
- package/dist/worker/link-discovery.js +103 -0
- package/dist/worker/link-discovery.js.map +1 -0
- package/dist/worker/predictive-consolidation.d.ts +46 -0
- package/dist/worker/predictive-consolidation.d.ts.map +1 -0
- package/dist/worker/predictive-consolidation.js +110 -0
- package/dist/worker/predictive-consolidation.js.map +1 -0
- package/dist/worker/types.d.ts +91 -0
- package/dist/worker/types.d.ts.map +1 -0
- package/dist/worker/types.js +22 -0
- package/dist/worker/types.js.map +1 -0
- package/hooks/clawdbot/cortex-memory/HOOK.md +71 -0
- package/hooks/clawdbot/cortex-memory/handler.js +279 -0
- package/package.json +73 -0
- package/scripts/pre-compact-hook.mjs +716 -0
- package/scripts/session-end-hook.mjs +548 -0
- package/scripts/session-start-hook.mjs +221 -0
- package/scripts/start-dashboard.sh +41 -0
- package/scripts/stop-dashboard.sh +21 -0
- package/scripts/stop-hook.mjs +163 -0
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Memory Data Hooks
|
|
5
|
+
* TanStack Query hooks for fetching memory data
|
|
6
|
+
*
|
|
7
|
+
* Uses WebSocket for real-time updates with polling as fallback.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
11
|
+
import { Memory, MemoryStats, MemoryLink } from '@/types/memory';
|
|
12
|
+
import { useMemoryWebSocket } from '@/lib/websocket';
|
|
13
|
+
|
|
14
|
+
const API_BASE = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3001';
|
|
15
|
+
|
|
16
|
+
// Pagination metadata from API
|
|
17
|
+
export interface PaginationInfo {
|
|
18
|
+
offset: number;
|
|
19
|
+
limit: number;
|
|
20
|
+
total: number;
|
|
21
|
+
hasMore: boolean;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Paginated response from API
|
|
25
|
+
interface PaginatedMemoriesResponse {
|
|
26
|
+
memories: Memory[];
|
|
27
|
+
pagination: PaginationInfo;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Fetch memories with pagination support
|
|
31
|
+
async function fetchMemories(options?: {
|
|
32
|
+
project?: string;
|
|
33
|
+
type?: string;
|
|
34
|
+
category?: string;
|
|
35
|
+
limit?: number;
|
|
36
|
+
offset?: number;
|
|
37
|
+
mode?: 'recent' | 'important' | 'search';
|
|
38
|
+
query?: string;
|
|
39
|
+
}): Promise<PaginatedMemoriesResponse> {
|
|
40
|
+
const params = new URLSearchParams();
|
|
41
|
+
if (options?.project) params.set('project', options.project);
|
|
42
|
+
if (options?.type) params.set('type', options.type);
|
|
43
|
+
if (options?.category) params.set('category', options.category);
|
|
44
|
+
if (options?.limit) params.set('limit', options.limit.toString());
|
|
45
|
+
if (options?.offset) params.set('offset', options.offset.toString());
|
|
46
|
+
if (options?.mode) params.set('mode', options.mode);
|
|
47
|
+
if (options?.query) params.set('query', options.query);
|
|
48
|
+
|
|
49
|
+
const response = await fetch(`${API_BASE}/api/memories?${params}`);
|
|
50
|
+
if (!response.ok) throw new Error('Failed to fetch memories');
|
|
51
|
+
return response.json();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Fetch memory stats
|
|
55
|
+
async function fetchStats(project?: string): Promise<MemoryStats> {
|
|
56
|
+
const params = project ? `?project=${project}` : '';
|
|
57
|
+
const response = await fetch(`${API_BASE}/api/stats${params}`);
|
|
58
|
+
if (!response.ok) throw new Error('Failed to fetch stats');
|
|
59
|
+
return response.json();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Fetch memory links
|
|
63
|
+
async function fetchLinks(project?: string): Promise<MemoryLink[]> {
|
|
64
|
+
const params = project ? `?project=${project}` : '';
|
|
65
|
+
const response = await fetch(`${API_BASE}/api/links${params}`);
|
|
66
|
+
if (!response.ok) throw new Error('Failed to fetch links');
|
|
67
|
+
return response.json();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Project info from API
|
|
71
|
+
export interface ProjectInfo {
|
|
72
|
+
project: string | null;
|
|
73
|
+
memory_count: number;
|
|
74
|
+
label: string;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Fetch list of projects
|
|
78
|
+
async function fetchProjects(): Promise<{ projects: ProjectInfo[] }> {
|
|
79
|
+
const response = await fetch(`${API_BASE}/api/projects`);
|
|
80
|
+
if (!response.ok) throw new Error('Failed to fetch projects');
|
|
81
|
+
return response.json();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Access a memory (reinforce)
|
|
85
|
+
async function accessMemory(id: number): Promise<Memory> {
|
|
86
|
+
const response = await fetch(`${API_BASE}/api/memories/${id}/access`, {
|
|
87
|
+
method: 'POST',
|
|
88
|
+
});
|
|
89
|
+
if (!response.ok) throw new Error('Failed to access memory');
|
|
90
|
+
return response.json();
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Trigger consolidation
|
|
94
|
+
async function triggerConsolidation(): Promise<{
|
|
95
|
+
success: boolean;
|
|
96
|
+
consolidated: number;
|
|
97
|
+
decayed: number;
|
|
98
|
+
deleted: number;
|
|
99
|
+
}> {
|
|
100
|
+
const response = await fetch(`${API_BASE}/api/consolidate`, {
|
|
101
|
+
method: 'POST',
|
|
102
|
+
});
|
|
103
|
+
if (!response.ok) throw new Error('Failed to consolidate');
|
|
104
|
+
return response.json();
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Hook: Get all memories with pagination
|
|
108
|
+
// Polling is reduced because WebSocket handles real-time updates
|
|
109
|
+
export function useMemories(options?: {
|
|
110
|
+
project?: string;
|
|
111
|
+
type?: string;
|
|
112
|
+
category?: string;
|
|
113
|
+
limit?: number;
|
|
114
|
+
offset?: number;
|
|
115
|
+
mode?: 'recent' | 'important' | 'search';
|
|
116
|
+
query?: string;
|
|
117
|
+
}) {
|
|
118
|
+
const query = useQuery({
|
|
119
|
+
queryKey: ['memories', options],
|
|
120
|
+
queryFn: () => fetchMemories(options),
|
|
121
|
+
refetchInterval: 30000, // Fallback poll every 30 seconds (WebSocket handles real-time)
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
// Extract memories array and pagination from response
|
|
125
|
+
return {
|
|
126
|
+
...query,
|
|
127
|
+
data: query.data?.memories,
|
|
128
|
+
pagination: query.data?.pagination,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Hook: Get memory stats
|
|
133
|
+
export function useStats(project?: string) {
|
|
134
|
+
return useQuery({
|
|
135
|
+
queryKey: ['stats', project],
|
|
136
|
+
queryFn: () => fetchStats(project),
|
|
137
|
+
refetchInterval: 30000, // Fallback poll every 30 seconds
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Hook: Get memory links
|
|
142
|
+
export function useMemoryLinks(project?: string) {
|
|
143
|
+
return useQuery({
|
|
144
|
+
queryKey: ['links', project],
|
|
145
|
+
queryFn: () => fetchLinks(project),
|
|
146
|
+
refetchInterval: 60000, // Fallback poll every 60 seconds
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Hook: Get list of projects
|
|
151
|
+
export function useProjects() {
|
|
152
|
+
return useQuery({
|
|
153
|
+
queryKey: ['projects'],
|
|
154
|
+
queryFn: fetchProjects,
|
|
155
|
+
refetchInterval: 60000, // Refresh project list every minute
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Hook: Combined memories with WebSocket real-time updates
|
|
160
|
+
export function useMemoriesWithRealtime(options?: {
|
|
161
|
+
project?: string;
|
|
162
|
+
type?: string;
|
|
163
|
+
category?: string;
|
|
164
|
+
limit?: number;
|
|
165
|
+
offset?: number;
|
|
166
|
+
mode?: 'recent' | 'important' | 'search';
|
|
167
|
+
query?: string;
|
|
168
|
+
}) {
|
|
169
|
+
// Connect to WebSocket for real-time updates
|
|
170
|
+
const ws = useMemoryWebSocket();
|
|
171
|
+
|
|
172
|
+
// Fetch memories with reduced polling (WebSocket handles most updates)
|
|
173
|
+
const memories = useMemories(options);
|
|
174
|
+
|
|
175
|
+
return {
|
|
176
|
+
...memories,
|
|
177
|
+
isConnected: ws.isConnected,
|
|
178
|
+
lastEvent: ws.lastEvent,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Hook: Access/reinforce a memory
|
|
183
|
+
export function useAccessMemory() {
|
|
184
|
+
const queryClient = useQueryClient();
|
|
185
|
+
|
|
186
|
+
return useMutation({
|
|
187
|
+
mutationFn: accessMemory,
|
|
188
|
+
onSuccess: () => {
|
|
189
|
+
// Invalidate memories to trigger refetch
|
|
190
|
+
queryClient.invalidateQueries({ queryKey: ['memories'] });
|
|
191
|
+
queryClient.invalidateQueries({ queryKey: ['stats'] });
|
|
192
|
+
},
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Hook: Trigger consolidation
|
|
197
|
+
export function useConsolidate() {
|
|
198
|
+
const queryClient = useQueryClient();
|
|
199
|
+
|
|
200
|
+
return useMutation({
|
|
201
|
+
mutationFn: triggerConsolidation,
|
|
202
|
+
onSuccess: () => {
|
|
203
|
+
queryClient.invalidateQueries({ queryKey: ['memories'] });
|
|
204
|
+
queryClient.invalidateQueries({ queryKey: ['stats'] });
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// ============================================
|
|
210
|
+
// CONTROL API
|
|
211
|
+
// ============================================
|
|
212
|
+
|
|
213
|
+
// Control status response
|
|
214
|
+
export interface ControlStatus {
|
|
215
|
+
paused: boolean;
|
|
216
|
+
uptime: number;
|
|
217
|
+
uptimeFormatted: string;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// Fetch control status
|
|
221
|
+
async function fetchControlStatus(): Promise<ControlStatus> {
|
|
222
|
+
const response = await fetch(`${API_BASE}/api/control/status`);
|
|
223
|
+
if (!response.ok) throw new Error('Failed to fetch control status');
|
|
224
|
+
return response.json();
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Pause memory creation
|
|
228
|
+
async function pauseMemoryCreation(): Promise<{ paused: boolean }> {
|
|
229
|
+
const response = await fetch(`${API_BASE}/api/control/pause`, {
|
|
230
|
+
method: 'POST',
|
|
231
|
+
});
|
|
232
|
+
if (!response.ok) throw new Error('Failed to pause');
|
|
233
|
+
return response.json();
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Resume memory creation
|
|
237
|
+
async function resumeMemoryCreation(): Promise<{ paused: boolean }> {
|
|
238
|
+
const response = await fetch(`${API_BASE}/api/control/resume`, {
|
|
239
|
+
method: 'POST',
|
|
240
|
+
});
|
|
241
|
+
if (!response.ok) throw new Error('Failed to resume');
|
|
242
|
+
return response.json();
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// Hook: Get control status
|
|
246
|
+
export function useControlStatus() {
|
|
247
|
+
return useQuery({
|
|
248
|
+
queryKey: ['control-status'],
|
|
249
|
+
queryFn: fetchControlStatus,
|
|
250
|
+
refetchInterval: 10000, // Poll every 10 seconds for uptime updates
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// Hook: Pause memory creation
|
|
255
|
+
export function usePauseMemory() {
|
|
256
|
+
const queryClient = useQueryClient();
|
|
257
|
+
|
|
258
|
+
return useMutation({
|
|
259
|
+
mutationFn: pauseMemoryCreation,
|
|
260
|
+
onSuccess: () => {
|
|
261
|
+
queryClient.invalidateQueries({ queryKey: ['control-status'] });
|
|
262
|
+
},
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// Hook: Resume memory creation
|
|
267
|
+
export function useResumeMemory() {
|
|
268
|
+
const queryClient = useQueryClient();
|
|
269
|
+
|
|
270
|
+
return useMutation({
|
|
271
|
+
mutationFn: resumeMemoryCreation,
|
|
272
|
+
onSuccess: () => {
|
|
273
|
+
queryClient.invalidateQueries({ queryKey: ['control-status'] });
|
|
274
|
+
},
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// ============================================
|
|
279
|
+
// VERSION API
|
|
280
|
+
// ============================================
|
|
281
|
+
|
|
282
|
+
// Version info from API
|
|
283
|
+
export interface VersionInfo {
|
|
284
|
+
currentVersion: string;
|
|
285
|
+
latestVersion: string | null;
|
|
286
|
+
updateAvailable: boolean;
|
|
287
|
+
checkedAt: string;
|
|
288
|
+
cacheHit: boolean;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Update result from API
|
|
292
|
+
export interface UpdateResult {
|
|
293
|
+
success: boolean;
|
|
294
|
+
previousVersion: string;
|
|
295
|
+
newVersion: string | null;
|
|
296
|
+
error?: string;
|
|
297
|
+
requiresRestart: boolean;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// Fetch current version
|
|
301
|
+
async function fetchVersion(): Promise<{ version: string }> {
|
|
302
|
+
const response = await fetch(`${API_BASE}/api/version`);
|
|
303
|
+
if (!response.ok) throw new Error('Failed to fetch version');
|
|
304
|
+
return response.json();
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// Check for updates
|
|
308
|
+
async function checkForUpdates(force = false): Promise<VersionInfo> {
|
|
309
|
+
const params = force ? '?force=true' : '';
|
|
310
|
+
const response = await fetch(`${API_BASE}/api/version/check${params}`);
|
|
311
|
+
if (!response.ok) throw new Error('Failed to check for updates');
|
|
312
|
+
return response.json();
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// Perform update
|
|
316
|
+
async function performUpdate(): Promise<UpdateResult> {
|
|
317
|
+
const response = await fetch(`${API_BASE}/api/version/update`, {
|
|
318
|
+
method: 'POST',
|
|
319
|
+
});
|
|
320
|
+
if (!response.ok) throw new Error('Failed to perform update');
|
|
321
|
+
return response.json();
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
// Restart server
|
|
325
|
+
async function restartServer(): Promise<{ success: boolean; message: string }> {
|
|
326
|
+
const response = await fetch(`${API_BASE}/api/version/restart`, {
|
|
327
|
+
method: 'POST',
|
|
328
|
+
});
|
|
329
|
+
if (!response.ok) throw new Error('Failed to restart server');
|
|
330
|
+
return response.json();
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// Hook: Get current version
|
|
334
|
+
export function useVersion() {
|
|
335
|
+
return useQuery({
|
|
336
|
+
queryKey: ['version'],
|
|
337
|
+
queryFn: fetchVersion,
|
|
338
|
+
staleTime: Infinity, // Version doesn't change during session
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// Hook: Check for updates (enabled on demand)
|
|
343
|
+
export function useCheckForUpdates(enabled = false) {
|
|
344
|
+
return useQuery({
|
|
345
|
+
queryKey: ['version-check'],
|
|
346
|
+
queryFn: () => checkForUpdates(false),
|
|
347
|
+
enabled,
|
|
348
|
+
staleTime: 5 * 60 * 1000, // Match server cache TTL (5 minutes)
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// Hook: Force check for updates
|
|
353
|
+
export function useForceCheckForUpdates() {
|
|
354
|
+
const queryClient = useQueryClient();
|
|
355
|
+
|
|
356
|
+
return useMutation({
|
|
357
|
+
mutationFn: () => checkForUpdates(true),
|
|
358
|
+
onSuccess: data => {
|
|
359
|
+
queryClient.setQueryData(['version-check'], data);
|
|
360
|
+
},
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// Hook: Perform update
|
|
365
|
+
export function usePerformUpdate() {
|
|
366
|
+
const queryClient = useQueryClient();
|
|
367
|
+
|
|
368
|
+
return useMutation({
|
|
369
|
+
mutationFn: performUpdate,
|
|
370
|
+
onSuccess: result => {
|
|
371
|
+
if (result.success) {
|
|
372
|
+
// Invalidate version queries to pick up new version
|
|
373
|
+
queryClient.invalidateQueries({ queryKey: ['version'] });
|
|
374
|
+
queryClient.invalidateQueries({ queryKey: ['version-check'] });
|
|
375
|
+
}
|
|
376
|
+
},
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
// Hook: Restart server
|
|
381
|
+
export function useRestartServer() {
|
|
382
|
+
return useMutation({
|
|
383
|
+
mutationFn: restartServer,
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// ============================================
|
|
388
|
+
// INSIGHTS API
|
|
389
|
+
// ============================================
|
|
390
|
+
|
|
391
|
+
// Activity data for heatmap
|
|
392
|
+
export interface ActivityDay {
|
|
393
|
+
date: string;
|
|
394
|
+
count: number;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
async function fetchActivity(project?: string): Promise<{ activity: ActivityDay[] }> {
|
|
398
|
+
const params = project ? `?project=${project}` : '';
|
|
399
|
+
const response = await fetch(`${API_BASE}/api/memories/activity${params}`);
|
|
400
|
+
if (!response.ok) throw new Error('Failed to fetch activity');
|
|
401
|
+
return response.json();
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
export function useActivity(project?: string) {
|
|
405
|
+
return useQuery({
|
|
406
|
+
queryKey: ['activity', project],
|
|
407
|
+
queryFn: () => fetchActivity(project),
|
|
408
|
+
staleTime: 5 * 60 * 1000,
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
// Memory quality data
|
|
413
|
+
export interface QualityData {
|
|
414
|
+
neverAccessed: { count: number; items: Array<Record<string, unknown>> };
|
|
415
|
+
stale: { count: number; items: Array<Record<string, unknown>> };
|
|
416
|
+
duplicates: { count: number; items: Array<Record<string, unknown>> };
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
async function fetchQuality(project?: string): Promise<QualityData> {
|
|
420
|
+
const params = project ? `?project=${project}` : '';
|
|
421
|
+
const response = await fetch(`${API_BASE}/api/memories/quality${params}`);
|
|
422
|
+
if (!response.ok) throw new Error('Failed to fetch quality');
|
|
423
|
+
return response.json();
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
export function useQuality(project?: string) {
|
|
427
|
+
return useQuery({
|
|
428
|
+
queryKey: ['quality', project],
|
|
429
|
+
queryFn: () => fetchQuality(project),
|
|
430
|
+
staleTime: 5 * 60 * 1000,
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
// Contradictions data
|
|
435
|
+
export interface Contradiction {
|
|
436
|
+
memoryAId: number;
|
|
437
|
+
memoryATitle: string;
|
|
438
|
+
memoryBId: number;
|
|
439
|
+
memoryBTitle: string;
|
|
440
|
+
score: number;
|
|
441
|
+
reason: string;
|
|
442
|
+
sharedTopics: string[];
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
async function fetchContradictions(project?: string): Promise<{ contradictions: Contradiction[]; count: number }> {
|
|
446
|
+
const params = project ? `?project=${project}` : '';
|
|
447
|
+
const response = await fetch(`${API_BASE}/api/contradictions${params}`);
|
|
448
|
+
if (!response.ok) throw new Error('Failed to fetch contradictions');
|
|
449
|
+
return response.json();
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
export function useContradictions(project?: string) {
|
|
453
|
+
return useQuery({
|
|
454
|
+
queryKey: ['contradictions', project],
|
|
455
|
+
queryFn: () => fetchContradictions(project),
|
|
456
|
+
staleTime: 5 * 60 * 1000,
|
|
457
|
+
});
|
|
458
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Search Suggestions Hook
|
|
3
|
+
*
|
|
4
|
+
* Fetches autocomplete suggestions for the search input.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { useQuery } from '@tanstack/react-query';
|
|
8
|
+
import { useDebouncedValue } from './useDebouncedValue';
|
|
9
|
+
|
|
10
|
+
const API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3001';
|
|
11
|
+
|
|
12
|
+
interface Suggestion {
|
|
13
|
+
text: string;
|
|
14
|
+
type: 'title' | 'category' | 'project';
|
|
15
|
+
count: number;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
async function fetchSuggestions(query: string): Promise<Suggestion[]> {
|
|
19
|
+
if (!query || query.length < 2) {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const response = await fetch(
|
|
24
|
+
`${API_URL}/api/suggestions?q=${encodeURIComponent(query)}&limit=8`
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
if (!response.ok) {
|
|
28
|
+
throw new Error('Failed to fetch suggestions');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const data = await response.json();
|
|
32
|
+
return data.suggestions;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function useSuggestions(query: string) {
|
|
36
|
+
// Debounce the query to avoid too many requests
|
|
37
|
+
const debouncedQuery = useDebouncedValue(query, 200);
|
|
38
|
+
|
|
39
|
+
return useQuery({
|
|
40
|
+
queryKey: ['suggestions', debouncedQuery],
|
|
41
|
+
queryFn: () => fetchSuggestions(debouncedQuery),
|
|
42
|
+
enabled: debouncedQuery.length >= 2,
|
|
43
|
+
staleTime: 30000, // Cache for 30 seconds
|
|
44
|
+
refetchOnWindowFocus: false,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Category Colors
|
|
3
|
+
* Visual color mappings for memory categories
|
|
4
|
+
*
|
|
5
|
+
* Includes both classic (cool blue/purple) and Jarvis (warm gold/orange) palettes
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { MemoryCategory, MemoryType } from '@/types/memory';
|
|
9
|
+
|
|
10
|
+
// Classic color palette (cool blues and purples)
|
|
11
|
+
export const CATEGORY_COLORS: Record<MemoryCategory, string> = {
|
|
12
|
+
architecture: '#3B82F6', // Blue
|
|
13
|
+
pattern: '#8B5CF6', // Purple
|
|
14
|
+
preference: '#EC4899', // Pink
|
|
15
|
+
error: '#EF4444', // Red
|
|
16
|
+
context: '#10B981', // Green
|
|
17
|
+
learning: '#F59E0B', // Amber
|
|
18
|
+
todo: '#F97316', // Orange
|
|
19
|
+
note: '#6B7280', // Gray
|
|
20
|
+
relationship: '#06B6D4', // Cyan
|
|
21
|
+
custom: '#A855F7', // Violet
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export const TYPE_COLORS: Record<MemoryType, string> = {
|
|
25
|
+
short_term: '#F97316', // Orange
|
|
26
|
+
long_term: '#3B82F6', // Blue
|
|
27
|
+
episodic: '#8B5CF6', // Purple
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// Jarvis color palette (warm gold/orange holographic style)
|
|
31
|
+
export const JARVIS_CATEGORY_COLORS: Record<MemoryCategory, string> = {
|
|
32
|
+
architecture: '#FFD700', // Bright gold
|
|
33
|
+
pattern: '#FFB347', // Warm gold
|
|
34
|
+
preference: '#FFA500', // Pure orange
|
|
35
|
+
error: '#FF6B6B', // Keep red-ish for errors
|
|
36
|
+
context: '#FFC080', // Soft peach
|
|
37
|
+
learning: '#FFE4B5', // Moccasin
|
|
38
|
+
todo: '#FF8C00', // Deep orange
|
|
39
|
+
note: '#FFCC66', // Light amber
|
|
40
|
+
relationship: '#00D4FF', // Cyan accent
|
|
41
|
+
custom: '#FFB347', // Warm gold
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export const JARVIS_TYPE_COLORS: Record<MemoryType, string> = {
|
|
45
|
+
short_term: '#FFD700', // Bright gold (front)
|
|
46
|
+
episodic: '#FFB347', // Warm gold (middle)
|
|
47
|
+
long_term: '#FF8C00', // Deep orange (back)
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
// Color mode toggle - defaults to Jarvis mode
|
|
51
|
+
let useJarvisColors = true;
|
|
52
|
+
|
|
53
|
+
export function setUseJarvisColors(value: boolean): void {
|
|
54
|
+
useJarvisColors = value;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function getUseJarvisColors(): boolean {
|
|
58
|
+
return useJarvisColors;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function getCategoryColor(category: MemoryCategory): string {
|
|
62
|
+
if (useJarvisColors) {
|
|
63
|
+
return JARVIS_CATEGORY_COLORS[category] || JARVIS_CATEGORY_COLORS.custom;
|
|
64
|
+
}
|
|
65
|
+
return CATEGORY_COLORS[category] || CATEGORY_COLORS.custom;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function getTypeColor(type: MemoryType): string {
|
|
69
|
+
if (useJarvisColors) {
|
|
70
|
+
return JARVIS_TYPE_COLORS[type] || JARVIS_TYPE_COLORS.short_term;
|
|
71
|
+
}
|
|
72
|
+
return TYPE_COLORS[type] || TYPE_COLORS.short_term;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function hexToRgb(hex: string): { r: number; g: number; b: number } {
|
|
76
|
+
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
|
|
77
|
+
return result
|
|
78
|
+
? {
|
|
79
|
+
r: parseInt(result[1], 16) / 255,
|
|
80
|
+
g: parseInt(result[2], 16) / 255,
|
|
81
|
+
b: parseInt(result[3], 16) / 255,
|
|
82
|
+
}
|
|
83
|
+
: { r: 1, g: 1, b: 1 };
|
|
84
|
+
}
|