Spaces:
Runtime error
Runtime error
| import { db } from "../config/gun.js"; | |
| import { broadcastHiveEvent } from "./hiveService.js"; | |
| import { updateAgentPresence } from "./agentService.js"; | |
| import { gunSafe } from "../utils/gunUtils.js"; | |
| // ── Shared Logic ────────────────────────────────────────────── | |
| export function fetchHiveState() { | |
| return new Promise((resolve) => { | |
| const agents = []; | |
| const papers = []; | |
| let settled = false; | |
| const finish = () => { | |
| if (settled) return; | |
| settled = true; | |
| // Sort papers by recency (if possible) or just reverse | |
| resolve({ | |
| agents: agents.slice(0, 10), | |
| papers: papers.slice(0, 10).reverse() | |
| }); | |
| }; | |
| // Listen for data | |
| const cutoff = Date.now() - 2 * 60 * 1000; // 2 minutes TTL | |
| db.get("agents").map().once((data, id) => { | |
| if (data && data.lastSeen && data.lastSeen > cutoff) { | |
| agents.push({ name: data.name || id, role: data.role || 'researcher' }); | |
| } | |
| }); | |
| db.get("p2pclaw_papers_v4").map().once((data, id) => { | |
| if (data && data.title) { | |
| papers.push({ | |
| title: data.title, | |
| abstract: data.content ? data.content.substring(0, 150) + "..." : "No abstract", | |
| ipfs_link: data.url_html || null | |
| }); | |
| } | |
| }); | |
| // Hard deadline: resolve after 2s no matter what (Gun can be slow to 'finish') | |
| setTimeout(finish, 2000); | |
| }); | |
| } | |
| // Update investigation progress based on paper content | |
| export function updateInvestigationProgress(paperTitle, paperContent) { | |
| const keywords = (paperTitle + " " + paperContent).toLowerCase(); | |
| // Define active investigations (could be dynamic in future) | |
| const investigations = [ | |
| { id: "inv-001", match: ["melanoma", "skin", "cancer", "dermatology"] }, | |
| { id: "inv-002", match: ["liver", "fibrosis", "hepatology", "hepatic"] }, | |
| { id: "inv-003", match: ["chimera", "neural", "architecture", "topology"] }, | |
| ]; | |
| investigations.forEach(inv => { | |
| const hits = inv.match.filter(kw => keywords.includes(kw)).length; | |
| if (hits >= 1) { // Threshold: at least 1 keyword match | |
| db.get("investigations").get(inv.id).once(data => { | |
| const currentProgress = (data && data.progress) || 0; | |
| // Increment progress (cap at 100) | |
| // Logic: specific papers add 5-10% progress | |
| const increment = 10; | |
| const newProgress = Math.min(100, currentProgress + increment); | |
| db.get("investigations").get(inv.id).put(gunSafe({ progress: newProgress })); | |
| console.log(`[SCIENCE] Investigation ${inv.id} progress updated to ${newProgress}%`); | |
| }); | |
| } | |
| }); | |
| } | |
| export async function sendToHiveChat(sender, text) { | |
| const msgId = `msg-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`; | |
| // Role-based logic: Check if it's a TASK | |
| let type = 'text'; | |
| if (text.startsWith('TASK:')) { | |
| type = 'task'; | |
| } | |
| db.get("chat").get(msgId).put(gunSafe({ | |
| sender: sender, | |
| text: text, | |
| type: type, | |
| timestamp: Date.now() | |
| })); | |
| } | |