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,103 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Category Labels
|
|
5
|
+
*
|
|
6
|
+
* Shows labels around the brain for each category region.
|
|
7
|
+
* Categories are arranged in a circle like a clock face.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { useMemo } from 'react';
|
|
11
|
+
import { Html } from '@react-three/drei';
|
|
12
|
+
import { MemoryCategory } from '@/types/memory';
|
|
13
|
+
import { getCategoryColor } from '@/lib/category-colors';
|
|
14
|
+
|
|
15
|
+
// Category positions (angles in degrees, matching position-algorithm.ts)
|
|
16
|
+
const CATEGORY_ANGLES: Record<MemoryCategory, number> = {
|
|
17
|
+
architecture: 0,
|
|
18
|
+
pattern: 36,
|
|
19
|
+
preference: 72,
|
|
20
|
+
error: 108,
|
|
21
|
+
context: 144,
|
|
22
|
+
learning: 180,
|
|
23
|
+
todo: 216,
|
|
24
|
+
note: 252,
|
|
25
|
+
relationship: 288,
|
|
26
|
+
custom: 324,
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// Category icons
|
|
30
|
+
const CATEGORY_ICONS: Record<MemoryCategory, string> = {
|
|
31
|
+
architecture: '🏗️',
|
|
32
|
+
pattern: '🔄',
|
|
33
|
+
preference: '⚙️',
|
|
34
|
+
error: '🐛',
|
|
35
|
+
context: '📍',
|
|
36
|
+
learning: '💡',
|
|
37
|
+
todo: '✅',
|
|
38
|
+
note: '📝',
|
|
39
|
+
relationship: '🔗',
|
|
40
|
+
custom: '📦',
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
interface CategoryLabelsProps {
|
|
44
|
+
memoryCounts: Record<string, number>;
|
|
45
|
+
radius?: number;
|
|
46
|
+
showCounts?: boolean;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function CategoryLabels({
|
|
50
|
+
memoryCounts,
|
|
51
|
+
radius = 5.5,
|
|
52
|
+
showCounts = true,
|
|
53
|
+
}: CategoryLabelsProps) {
|
|
54
|
+
const labels = useMemo(() => {
|
|
55
|
+
return (Object.keys(CATEGORY_ANGLES) as MemoryCategory[]).map((category) => {
|
|
56
|
+
const angle = CATEGORY_ANGLES[category] * (Math.PI / 180);
|
|
57
|
+
const x = radius * Math.cos(angle);
|
|
58
|
+
const z = radius * Math.sin(angle);
|
|
59
|
+
const count = memoryCounts[category] || 0;
|
|
60
|
+
const color = getCategoryColor(category);
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
category,
|
|
64
|
+
position: [x, 0, z] as [number, number, number],
|
|
65
|
+
count,
|
|
66
|
+
color,
|
|
67
|
+
icon: CATEGORY_ICONS[category],
|
|
68
|
+
};
|
|
69
|
+
});
|
|
70
|
+
}, [memoryCounts, radius]);
|
|
71
|
+
|
|
72
|
+
return (
|
|
73
|
+
<group name="category-labels">
|
|
74
|
+
{labels.map(({ category, position, count, color, icon }) => (
|
|
75
|
+
<Html
|
|
76
|
+
key={category}
|
|
77
|
+
position={position}
|
|
78
|
+
center
|
|
79
|
+
style={{ pointerEvents: 'none' }}
|
|
80
|
+
distanceFactor={12}
|
|
81
|
+
>
|
|
82
|
+
<div
|
|
83
|
+
className="flex flex-col items-center gap-0.5 opacity-60 hover:opacity-100 transition-opacity"
|
|
84
|
+
style={{ color }}
|
|
85
|
+
>
|
|
86
|
+
<span className="text-lg">{icon}</span>
|
|
87
|
+
<span className="text-[10px] font-medium capitalize whitespace-nowrap">
|
|
88
|
+
{category}
|
|
89
|
+
</span>
|
|
90
|
+
{showCounts && count > 0 && (
|
|
91
|
+
<span
|
|
92
|
+
className="text-[9px] px-1.5 py-0.5 rounded-full"
|
|
93
|
+
style={{ backgroundColor: color + '30' }}
|
|
94
|
+
>
|
|
95
|
+
{count}
|
|
96
|
+
</span>
|
|
97
|
+
)}
|
|
98
|
+
</div>
|
|
99
|
+
</Html>
|
|
100
|
+
))}
|
|
101
|
+
</group>
|
|
102
|
+
);
|
|
103
|
+
}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Core Sphere
|
|
5
|
+
* Glowing central energy core - the "heart" of the AI brain
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Bright central sphere with multiple glow layers
|
|
9
|
+
* - Pulsing animation tied to activity level
|
|
10
|
+
* - Color gradient from deep orange (#FF8C00) to bright gold (#FFD700)
|
|
11
|
+
* - Additive blending for realistic glow effect
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { useRef, useMemo, useEffect } from 'react';
|
|
15
|
+
import { useFrame } from '@react-three/fiber';
|
|
16
|
+
import * as THREE from 'three';
|
|
17
|
+
|
|
18
|
+
// Shared geometries to prevent memory leaks
|
|
19
|
+
const CORE_GEOMETRY = new THREE.SphereGeometry(1, 32, 32);
|
|
20
|
+
const GLOW_GEOMETRY = new THREE.SphereGeometry(1, 24, 24);
|
|
21
|
+
|
|
22
|
+
interface CoreSphereProps {
|
|
23
|
+
/** Activity level 0-1, affects pulse intensity and speed */
|
|
24
|
+
activity?: number;
|
|
25
|
+
/** Base radius of the core sphere */
|
|
26
|
+
radius?: number;
|
|
27
|
+
/** Position of the core */
|
|
28
|
+
position?: [number, number, number];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function CoreSphere({
|
|
32
|
+
activity = 0.5,
|
|
33
|
+
radius = 0.4,
|
|
34
|
+
position = [0, 0, 0],
|
|
35
|
+
}: CoreSphereProps) {
|
|
36
|
+
const coreRef = useRef<THREE.Mesh>(null);
|
|
37
|
+
const glow1Ref = useRef<THREE.Mesh>(null);
|
|
38
|
+
const glow2Ref = useRef<THREE.Mesh>(null);
|
|
39
|
+
const glow3Ref = useRef<THREE.Mesh>(null);
|
|
40
|
+
const glow4Ref = useRef<THREE.Mesh>(null);
|
|
41
|
+
|
|
42
|
+
// Core material - brightest, deep orange
|
|
43
|
+
const coreMaterial = useMemo(
|
|
44
|
+
() =>
|
|
45
|
+
new THREE.MeshBasicMaterial({
|
|
46
|
+
color: '#FF8C00',
|
|
47
|
+
transparent: true,
|
|
48
|
+
opacity: 0.95,
|
|
49
|
+
depthWrite: false,
|
|
50
|
+
}),
|
|
51
|
+
[]
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
// Inner glow layer 1 - orange-gold
|
|
55
|
+
const glow1Material = useMemo(
|
|
56
|
+
() =>
|
|
57
|
+
new THREE.MeshBasicMaterial({
|
|
58
|
+
color: '#FFA500',
|
|
59
|
+
transparent: true,
|
|
60
|
+
opacity: 0.15,
|
|
61
|
+
depthWrite: false,
|
|
62
|
+
blending: THREE.AdditiveBlending,
|
|
63
|
+
}),
|
|
64
|
+
[]
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
// Glow layer 2 - transitioning to gold
|
|
68
|
+
const glow2Material = useMemo(
|
|
69
|
+
() =>
|
|
70
|
+
new THREE.MeshBasicMaterial({
|
|
71
|
+
color: '#FFB700',
|
|
72
|
+
transparent: true,
|
|
73
|
+
opacity: 0.08,
|
|
74
|
+
depthWrite: false,
|
|
75
|
+
blending: THREE.AdditiveBlending,
|
|
76
|
+
}),
|
|
77
|
+
[]
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
// Glow layer 3 - lighter gold
|
|
81
|
+
const glow3Material = useMemo(
|
|
82
|
+
() =>
|
|
83
|
+
new THREE.MeshBasicMaterial({
|
|
84
|
+
color: '#FFC500',
|
|
85
|
+
transparent: true,
|
|
86
|
+
opacity: 0.04,
|
|
87
|
+
depthWrite: false,
|
|
88
|
+
blending: THREE.AdditiveBlending,
|
|
89
|
+
}),
|
|
90
|
+
[]
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
// Outer glow layer 4 - brightest gold, most diffuse
|
|
94
|
+
const glow4Material = useMemo(
|
|
95
|
+
() =>
|
|
96
|
+
new THREE.MeshBasicMaterial({
|
|
97
|
+
color: '#FFD700',
|
|
98
|
+
transparent: true,
|
|
99
|
+
opacity: 0.02,
|
|
100
|
+
depthWrite: false,
|
|
101
|
+
blending: THREE.AdditiveBlending,
|
|
102
|
+
}),
|
|
103
|
+
[]
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
// Cleanup materials on unmount
|
|
107
|
+
useEffect(() => {
|
|
108
|
+
return () => {
|
|
109
|
+
coreMaterial.dispose();
|
|
110
|
+
glow1Material.dispose();
|
|
111
|
+
glow2Material.dispose();
|
|
112
|
+
glow3Material.dispose();
|
|
113
|
+
glow4Material.dispose();
|
|
114
|
+
};
|
|
115
|
+
}, [coreMaterial, glow1Material, glow2Material, glow3Material, glow4Material]);
|
|
116
|
+
|
|
117
|
+
// Animation - pulsing "breathing" effect
|
|
118
|
+
useFrame((state) => {
|
|
119
|
+
if (!coreRef.current) return;
|
|
120
|
+
|
|
121
|
+
const time = state.clock.elapsedTime;
|
|
122
|
+
|
|
123
|
+
// Base pulse speed increases with activity (0.8 to 3.0 Hz)
|
|
124
|
+
const pulseSpeed = 0.8 + activity * 2.2;
|
|
125
|
+
|
|
126
|
+
// Primary breathing pulse
|
|
127
|
+
const primaryPulse = Math.sin(time * pulseSpeed) * 0.5 + 0.5;
|
|
128
|
+
|
|
129
|
+
// Secondary faster micro-pulse for energy feel
|
|
130
|
+
const microPulse = Math.sin(time * pulseSpeed * 3) * 0.15 + 0.85;
|
|
131
|
+
|
|
132
|
+
// Combined pulse with activity influence
|
|
133
|
+
const combinedPulse = primaryPulse * (0.7 + activity * 0.3) * microPulse;
|
|
134
|
+
|
|
135
|
+
// Core sphere - subtle scale pulsing
|
|
136
|
+
const coreScale = radius * (1 + combinedPulse * 0.15);
|
|
137
|
+
coreRef.current.scale.setScalar(coreScale);
|
|
138
|
+
coreMaterial.opacity = 0.85 + combinedPulse * 0.1;
|
|
139
|
+
|
|
140
|
+
// Glow layer 1 - larger, synced with core
|
|
141
|
+
if (glow1Ref.current) {
|
|
142
|
+
const glow1Scale = radius * 1.6 * (1 + combinedPulse * 0.1);
|
|
143
|
+
glow1Ref.current.scale.setScalar(glow1Scale);
|
|
144
|
+
glow1Material.opacity = (0.1 + combinedPulse * 0.06) * (0.6 + activity * 0.4);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Glow layer 2 - slightly phase-shifted for depth
|
|
148
|
+
if (glow2Ref.current) {
|
|
149
|
+
const phase2 = Math.sin(time * pulseSpeed - 0.3) * 0.5 + 0.5;
|
|
150
|
+
const glow2Scale = radius * 2.0 * (1 + phase2 * 0.08);
|
|
151
|
+
glow2Ref.current.scale.setScalar(glow2Scale);
|
|
152
|
+
glow2Material.opacity = (0.05 + phase2 * 0.04) * (0.5 + activity * 0.5);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Glow layer 3 - more phase shift, slower feel
|
|
156
|
+
if (glow3Ref.current) {
|
|
157
|
+
const phase3 = Math.sin(time * pulseSpeed * 0.7 - 0.6) * 0.5 + 0.5;
|
|
158
|
+
const glow3Scale = radius * 2.4 * (1 + phase3 * 0.06);
|
|
159
|
+
glow3Ref.current.scale.setScalar(glow3Scale);
|
|
160
|
+
glow3Material.opacity = (0.025 + phase3 * 0.02) * (0.4 + activity * 0.6);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Glow layer 4 - outermost, slowest, most ethereal
|
|
164
|
+
if (glow4Ref.current) {
|
|
165
|
+
const phase4 = Math.sin(time * pulseSpeed * 0.5 - 0.9) * 0.5 + 0.5;
|
|
166
|
+
const glow4Scale = radius * 3.0 * (1 + phase4 * 0.05);
|
|
167
|
+
glow4Ref.current.scale.setScalar(glow4Scale);
|
|
168
|
+
glow4Material.opacity = (0.01 + phase4 * 0.015) * (0.3 + activity * 0.7);
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
return (
|
|
173
|
+
<group position={position} name="core-sphere">
|
|
174
|
+
{/* Outermost glow layer 4 - brightest gold, most diffuse */}
|
|
175
|
+
<mesh
|
|
176
|
+
ref={glow4Ref}
|
|
177
|
+
geometry={GLOW_GEOMETRY}
|
|
178
|
+
material={glow4Material}
|
|
179
|
+
scale={radius * 3.0}
|
|
180
|
+
/>
|
|
181
|
+
|
|
182
|
+
{/* Glow layer 3 - lighter gold */}
|
|
183
|
+
<mesh
|
|
184
|
+
ref={glow3Ref}
|
|
185
|
+
geometry={GLOW_GEOMETRY}
|
|
186
|
+
material={glow3Material}
|
|
187
|
+
scale={radius * 2.4}
|
|
188
|
+
/>
|
|
189
|
+
|
|
190
|
+
{/* Glow layer 2 - transitioning gold */}
|
|
191
|
+
<mesh
|
|
192
|
+
ref={glow2Ref}
|
|
193
|
+
geometry={GLOW_GEOMETRY}
|
|
194
|
+
material={glow2Material}
|
|
195
|
+
scale={radius * 2.0}
|
|
196
|
+
/>
|
|
197
|
+
|
|
198
|
+
{/* Inner glow layer 1 - orange-gold */}
|
|
199
|
+
<mesh
|
|
200
|
+
ref={glow1Ref}
|
|
201
|
+
geometry={GLOW_GEOMETRY}
|
|
202
|
+
material={glow1Material}
|
|
203
|
+
scale={radius * 1.6}
|
|
204
|
+
/>
|
|
205
|
+
|
|
206
|
+
{/* Core sphere - brightest, deep orange center */}
|
|
207
|
+
<mesh
|
|
208
|
+
ref={coreRef}
|
|
209
|
+
geometry={CORE_GEOMETRY}
|
|
210
|
+
material={coreMaterial}
|
|
211
|
+
scale={radius}
|
|
212
|
+
/>
|
|
213
|
+
</group>
|
|
214
|
+
);
|
|
215
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Data Flow Particles
|
|
5
|
+
* Animated particles flowing between brain regions
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { useRef, useMemo } from 'react';
|
|
9
|
+
import { useFrame } from '@react-three/fiber';
|
|
10
|
+
import * as THREE from 'three';
|
|
11
|
+
|
|
12
|
+
interface DataFlowParticlesProps {
|
|
13
|
+
count?: number;
|
|
14
|
+
speed?: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function DataFlowParticles({
|
|
18
|
+
count = 150,
|
|
19
|
+
speed = 0.5,
|
|
20
|
+
}: DataFlowParticlesProps) {
|
|
21
|
+
const pointsRef = useRef<THREE.Points>(null);
|
|
22
|
+
|
|
23
|
+
// Initialize particle data
|
|
24
|
+
const { positions, velocities, colors, opacities } = useMemo(() => {
|
|
25
|
+
const pos = new Float32Array(count * 3);
|
|
26
|
+
const vel = new Float32Array(count * 3);
|
|
27
|
+
const col = new Float32Array(count * 3);
|
|
28
|
+
const opa = new Float32Array(count);
|
|
29
|
+
|
|
30
|
+
for (let i = 0; i < count; i++) {
|
|
31
|
+
const i3 = i * 3;
|
|
32
|
+
|
|
33
|
+
// Random position within brain bounds
|
|
34
|
+
pos[i3] = (Math.random() - 0.5) * 8;
|
|
35
|
+
pos[i3 + 1] = (Math.random() - 0.5) * 6;
|
|
36
|
+
pos[i3 + 2] = (Math.random() - 0.5) * 7;
|
|
37
|
+
|
|
38
|
+
// Velocity - flowing from front to back (STM to LTM direction)
|
|
39
|
+
vel[i3] = (Math.random() - 0.5) * 0.01;
|
|
40
|
+
vel[i3 + 1] = (Math.random() - 0.5) * 0.01;
|
|
41
|
+
vel[i3 + 2] = -0.015 - Math.random() * 0.02;
|
|
42
|
+
|
|
43
|
+
// Initial opacity
|
|
44
|
+
opa[i] = 0.3 + Math.random() * 0.4;
|
|
45
|
+
|
|
46
|
+
// Color based on z-position
|
|
47
|
+
updateColor(col, i3, pos[i3 + 2]);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return { positions: pos, velocities: vel, colors: col, opacities: opa };
|
|
51
|
+
}, [count]);
|
|
52
|
+
|
|
53
|
+
function updateColor(col: Float32Array, i3: number, z: number) {
|
|
54
|
+
if (z > 1.5) {
|
|
55
|
+
// Short-term region - orange
|
|
56
|
+
col[i3] = 0.976;
|
|
57
|
+
col[i3 + 1] = 0.451;
|
|
58
|
+
col[i3 + 2] = 0.086;
|
|
59
|
+
} else if (z < -1.5) {
|
|
60
|
+
// Long-term region - blue
|
|
61
|
+
col[i3] = 0.231;
|
|
62
|
+
col[i3 + 1] = 0.51;
|
|
63
|
+
col[i3 + 2] = 0.965;
|
|
64
|
+
} else {
|
|
65
|
+
// Episodic region - purple
|
|
66
|
+
col[i3] = 0.545;
|
|
67
|
+
col[i3 + 1] = 0.361;
|
|
68
|
+
col[i3 + 2] = 0.965;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
useFrame(() => {
|
|
73
|
+
if (!pointsRef.current) return;
|
|
74
|
+
|
|
75
|
+
const posAttr = pointsRef.current.geometry.attributes.position;
|
|
76
|
+
const colAttr = pointsRef.current.geometry.attributes.color;
|
|
77
|
+
|
|
78
|
+
for (let i = 0; i < count; i++) {
|
|
79
|
+
const i3 = i * 3;
|
|
80
|
+
|
|
81
|
+
// Update position
|
|
82
|
+
posAttr.array[i3] += velocities[i3] * speed;
|
|
83
|
+
posAttr.array[i3 + 1] += velocities[i3 + 1] * speed;
|
|
84
|
+
posAttr.array[i3 + 2] += velocities[i3 + 2] * speed;
|
|
85
|
+
|
|
86
|
+
// Reset if out of bounds (wrap around)
|
|
87
|
+
if (posAttr.array[i3 + 2] < -4) {
|
|
88
|
+
posAttr.array[i3 + 2] = 4;
|
|
89
|
+
posAttr.array[i3] = (Math.random() - 0.5) * 8;
|
|
90
|
+
posAttr.array[i3 + 1] = (Math.random() - 0.5) * 6;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Update color based on new position
|
|
94
|
+
updateColor(colAttr.array as Float32Array, i3, posAttr.array[i3 + 2]);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
posAttr.needsUpdate = true;
|
|
98
|
+
colAttr.needsUpdate = true;
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
return (
|
|
102
|
+
<points ref={pointsRef}>
|
|
103
|
+
<bufferGeometry>
|
|
104
|
+
<bufferAttribute
|
|
105
|
+
attach="attributes-position"
|
|
106
|
+
args={[positions, 3]}
|
|
107
|
+
/>
|
|
108
|
+
<bufferAttribute
|
|
109
|
+
attach="attributes-color"
|
|
110
|
+
args={[colors, 3]}
|
|
111
|
+
/>
|
|
112
|
+
</bufferGeometry>
|
|
113
|
+
<pointsMaterial
|
|
114
|
+
size={0.06}
|
|
115
|
+
vertexColors
|
|
116
|
+
transparent
|
|
117
|
+
opacity={0.6}
|
|
118
|
+
sizeAttenuation
|
|
119
|
+
depthWrite={false}
|
|
120
|
+
/>
|
|
121
|
+
</points>
|
|
122
|
+
);
|
|
123
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Data Stream Rings
|
|
5
|
+
* Creates orbital rings around the brain with data particles flowing along them
|
|
6
|
+
* Part of the Jarvis holographic aesthetic - particles flow around ring circumferences
|
|
7
|
+
* Uses BufferGeometry with Float32Array for GPU efficiency
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { useMemo, useRef } from 'react';
|
|
11
|
+
import { useFrame } from '@react-three/fiber';
|
|
12
|
+
import * as THREE from 'three';
|
|
13
|
+
|
|
14
|
+
interface RingConfig {
|
|
15
|
+
radius: number;
|
|
16
|
+
tiltX: number;
|
|
17
|
+
tiltZ: number;
|
|
18
|
+
particleCount: number;
|
|
19
|
+
speed: number;
|
|
20
|
+
colorIndex: number; // 0 = gold, 1 = warm gold, 2 = deep orange
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Ring configurations with different radii and tilts for visual variety
|
|
24
|
+
const RING_CONFIGS: RingConfig[] = [
|
|
25
|
+
{ radius: 4.0, tiltX: 0.3, tiltZ: 0.1, particleCount: 16, speed: 0.8, colorIndex: 0 },
|
|
26
|
+
{ radius: 4.5, tiltX: -0.2, tiltZ: 0.4, particleCount: 18, speed: 0.6, colorIndex: 1 },
|
|
27
|
+
{ radius: 5.0, tiltX: 0.5, tiltZ: -0.2, particleCount: 20, speed: 0.7, colorIndex: 2 },
|
|
28
|
+
{ radius: 5.5, tiltX: -0.4, tiltZ: -0.3, particleCount: 14, speed: 0.9, colorIndex: 0 },
|
|
29
|
+
{ radius: 6.0, tiltX: 0.1, tiltZ: 0.5, particleCount: 12, speed: 0.5, colorIndex: 1 },
|
|
30
|
+
];
|
|
31
|
+
|
|
32
|
+
// Golden color palette matching the Jarvis aesthetic
|
|
33
|
+
const COLORS = [
|
|
34
|
+
{ r: 1.0, g: 0.843, b: 0.0 }, // #FFD700 - Bright gold
|
|
35
|
+
{ r: 1.0, g: 0.702, b: 0.278 }, // #FFB347 - Warm gold
|
|
36
|
+
{ r: 1.0, g: 0.549, b: 0.0 }, // #FF8C00 - Deep orange
|
|
37
|
+
];
|
|
38
|
+
|
|
39
|
+
interface DataStreamRingProps {
|
|
40
|
+
config: RingConfig;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Single orbital ring with flowing particles
|
|
45
|
+
*/
|
|
46
|
+
function DataStreamRing({ config }: DataStreamRingProps) {
|
|
47
|
+
const pointsRef = useRef<THREE.Points>(null);
|
|
48
|
+
const groupRef = useRef<THREE.Group>(null);
|
|
49
|
+
|
|
50
|
+
// Initialize particle positions and phases along the ring circumference
|
|
51
|
+
const { positions, phases, colors } = useMemo(() => {
|
|
52
|
+
const { radius, particleCount, colorIndex } = config;
|
|
53
|
+
const positions = new Float32Array(particleCount * 3);
|
|
54
|
+
const phases = new Float32Array(particleCount);
|
|
55
|
+
const colors = new Float32Array(particleCount * 3);
|
|
56
|
+
|
|
57
|
+
const baseColor = COLORS[colorIndex];
|
|
58
|
+
|
|
59
|
+
for (let i = 0; i < particleCount; i++) {
|
|
60
|
+
// Distribute particles evenly around the ring with some randomness
|
|
61
|
+
const baseAngle = (i / particleCount) * Math.PI * 2;
|
|
62
|
+
const angleOffset = (Math.random() - 0.5) * 0.2; // Small random offset
|
|
63
|
+
const angle = baseAngle + angleOffset;
|
|
64
|
+
|
|
65
|
+
phases[i] = angle;
|
|
66
|
+
|
|
67
|
+
// Position on ring circumference (XZ plane, will be tilted by group rotation)
|
|
68
|
+
positions[i * 3] = Math.cos(angle) * radius;
|
|
69
|
+
positions[i * 3 + 1] = (Math.random() - 0.5) * 0.1; // Slight Y variation
|
|
70
|
+
positions[i * 3 + 2] = Math.sin(angle) * radius;
|
|
71
|
+
|
|
72
|
+
// Color with slight variation for visual interest
|
|
73
|
+
const colorVariation = 0.9 + Math.random() * 0.2;
|
|
74
|
+
colors[i * 3] = baseColor.r * colorVariation;
|
|
75
|
+
colors[i * 3 + 1] = baseColor.g * colorVariation;
|
|
76
|
+
colors[i * 3 + 2] = baseColor.b * colorVariation;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return { positions, phases, colors };
|
|
80
|
+
}, [config]);
|
|
81
|
+
|
|
82
|
+
// Animate particles flowing around the ring
|
|
83
|
+
useFrame((state, delta) => {
|
|
84
|
+
if (!pointsRef.current) return;
|
|
85
|
+
|
|
86
|
+
const { radius, particleCount, speed } = config;
|
|
87
|
+
const positionAttr = pointsRef.current.geometry.attributes
|
|
88
|
+
.position as THREE.BufferAttribute;
|
|
89
|
+
const positions = positionAttr.array as Float32Array;
|
|
90
|
+
const time = state.clock.elapsedTime;
|
|
91
|
+
|
|
92
|
+
for (let i = 0; i < particleCount; i++) {
|
|
93
|
+
// Update phase (angle) to create flow around the ring
|
|
94
|
+
phases[i] += delta * speed;
|
|
95
|
+
|
|
96
|
+
// Wrap angle
|
|
97
|
+
if (phases[i] > Math.PI * 2) {
|
|
98
|
+
phases[i] -= Math.PI * 2;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const angle = phases[i];
|
|
102
|
+
|
|
103
|
+
// Add subtle wave motion to the radius for organic feel
|
|
104
|
+
const radiusWave = radius + Math.sin(time * 2 + angle * 3) * 0.05;
|
|
105
|
+
|
|
106
|
+
// Update position on ring circumference
|
|
107
|
+
positions[i * 3] = Math.cos(angle) * radiusWave;
|
|
108
|
+
positions[i * 3 + 1] = Math.sin(time * 1.5 + angle) * 0.08; // Gentle vertical oscillation
|
|
109
|
+
positions[i * 3 + 2] = Math.sin(angle) * radiusWave;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
positionAttr.needsUpdate = true;
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
return (
|
|
116
|
+
<group ref={groupRef} rotation={[config.tiltX, 0, config.tiltZ]}>
|
|
117
|
+
<points ref={pointsRef}>
|
|
118
|
+
<bufferGeometry>
|
|
119
|
+
<bufferAttribute
|
|
120
|
+
attach="attributes-position"
|
|
121
|
+
args={[positions, 3]}
|
|
122
|
+
/>
|
|
123
|
+
<bufferAttribute
|
|
124
|
+
attach="attributes-color"
|
|
125
|
+
args={[colors, 3]}
|
|
126
|
+
/>
|
|
127
|
+
</bufferGeometry>
|
|
128
|
+
<pointsMaterial
|
|
129
|
+
size={0.04}
|
|
130
|
+
vertexColors
|
|
131
|
+
transparent
|
|
132
|
+
opacity={0.4}
|
|
133
|
+
blending={THREE.AdditiveBlending}
|
|
134
|
+
depthWrite={false}
|
|
135
|
+
sizeAttenuation
|
|
136
|
+
/>
|
|
137
|
+
</points>
|
|
138
|
+
</group>
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
interface DataStreamRingsProps {
|
|
143
|
+
visible?: boolean;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* All orbital data stream rings around the brain
|
|
148
|
+
*/
|
|
149
|
+
export function DataStreamRings({ visible = true }: DataStreamRingsProps) {
|
|
150
|
+
if (!visible) return null;
|
|
151
|
+
|
|
152
|
+
return (
|
|
153
|
+
<group>
|
|
154
|
+
{RING_CONFIGS.map((config, index) => (
|
|
155
|
+
<DataStreamRing key={index} config={config} />
|
|
156
|
+
))}
|
|
157
|
+
</group>
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export default DataStreamRings;
|