diff --git a/mcp-server/console.html b/mcp-server/console.html new file mode 100644 index 0000000..884afe9 --- /dev/null +++ b/mcp-server/console.html @@ -0,0 +1,380 @@ + + + +Staffing Intelligence Console + +
+

Staffing Intelligence Console

+
Analyzing 500,000 profiles...
+
+
+
Scanning your entire workforce...
+
+
+
+
+ + +
+
+
Powered by Lakehouse — Hybrid SQL + Vector Search across 500,000 embedded worker profiles
+
+ diff --git a/mcp-server/index.ts b/mcp-server/index.ts index ccbe799..d5a3e61 100644 --- a/mcp-server/index.ts +++ b/mcp-server/index.ts @@ -1029,8 +1029,139 @@ tr:hover{background:#111827} return ok(await runWeekSimulation()); } + // ─── Staffing Intelligence Console ─── + if (url.pathname === "/console") { + return new Response(Bun.file(import.meta.dir + "/console.html")); + } + + // Intelligence Brief — parallel analytics across 500K profiles + if (url.pathname === "/intelligence/brief" && req.method === "POST") { + const start = Date.now(); + const [poolR, benchR, supplyR, gemsR, risksR, untappedR, archetypeR] = await Promise.all([ + api("POST", "/query/sql", { sql: `SELECT COUNT(*) total, ROUND(AVG(CAST(reliability AS DOUBLE)),3) avg_rel, SUM(CASE WHEN CAST(reliability AS DOUBLE)>0.9 THEN 1 ELSE 0 END) elite, SUM(CASE WHEN CAST(reliability AS DOUBLE)>0.8 THEN 1 ELSE 0 END) reliable, SUM(CASE WHEN archetype='erratic' THEN 1 ELSE 0 END) erratic, SUM(CASE WHEN archetype='silent' THEN 1 ELSE 0 END) silent_cnt, SUM(CASE WHEN archetype='improving' THEN 1 ELSE 0 END) improving FROM workers_500k` }), + api("POST", "/query/sql", { sql: `SELECT state, COUNT(*) total, ROUND(AVG(CAST(reliability AS DOUBLE)),3) avg_rel, SUM(CASE WHEN CAST(reliability AS DOUBLE)>0.8 THEN 1 ELSE 0 END) reliable, SUM(CASE WHEN CAST(availability AS DOUBLE)>0.5 THEN 1 ELSE 0 END) available FROM workers_500k GROUP BY state ORDER BY total DESC` }), + api("POST", "/query/sql", { sql: `SELECT role, COUNT(*) supply, SUM(CASE WHEN CAST(availability AS DOUBLE)>0.5 THEN 1 ELSE 0 END) available, ROUND(AVG(CAST(reliability AS DOUBLE)),3) avg_rel FROM workers_500k GROUP BY role ORDER BY supply DESC` }), + api("POST", "/query/sql", { sql: `SELECT name, role, city, state, ROUND(CAST(reliability AS DOUBLE),2) rel, ROUND(CAST(availability AS DOUBLE),2) avail, archetype, skills FROM workers_500k WHERE archetype='improving' AND CAST(reliability AS DOUBLE)>0.8 ORDER BY CAST(reliability AS DOUBLE) DESC LIMIT 5` }), + api("POST", "/query/sql", { sql: `SELECT name, role, city, state, ROUND(CAST(reliability AS DOUBLE),2) rel, ROUND(CAST(responsiveness AS DOUBLE),2) resp, ROUND(CAST(compliance AS DOUBLE),2) compl, archetype FROM workers_500k WHERE archetype IN ('erratic','silent') AND CAST(reliability AS DOUBLE)<0.5 ORDER BY CAST(reliability AS DOUBLE) ASC LIMIT 5` }), + api("POST", "/query/sql", { sql: `SELECT name, role, city, state, ROUND(CAST(availability AS DOUBLE),2) avail, ROUND(CAST(reliability AS DOUBLE),2) rel, skills, archetype FROM workers_500k WHERE CAST(availability AS DOUBLE)>0.8 AND CAST(reliability AS DOUBLE)>0.85 ORDER BY CAST(availability AS DOUBLE) DESC LIMIT 5` }), + api("POST", "/query/sql", { sql: `SELECT archetype, COUNT(*) cnt, ROUND(AVG(CAST(reliability AS DOUBLE)),3) avg_rel FROM workers_500k GROUP BY archetype ORDER BY cnt DESC` }), + ]); + return ok({ + pool: poolR.rows?.[0] || {}, + bench: benchR.rows || [], + supply: supplyR.rows || [], + gems: gemsR.rows || [], + risks: risksR.rows || [], + untapped: untappedR.rows || [], + archetypes: archetypeR.rows || [], + duration_ms: Date.now() - start, + }); + } + + // Intelligence Chat — natural language → routed queries → structured results + if (url.pathname === "/intelligence/chat" && req.method === "POST") { + const b = await json(); + const q = (b.message || "").trim(); + const lower = q.toLowerCase(); + const start = Date.now(); + const queries: string[] = []; + + // Route 1: "Find someone like [Name]" + const likeMatch = q.match(/(?:like|similar to)\s+([A-Z][a-z]+(?:\s+[A-Z]\.?\s*)?(?:[A-Z][a-z]+)?)/i); + if (likeMatch) { + const name = likeMatch[1].trim(); + queries.push(`SQL: Looking up ${name}'s profile`); + const profileR = await api("POST", "/query/sql", { sql: `SELECT * FROM workers_500k WHERE name LIKE '%${name.replace(/'/g,"''")}%' LIMIT 1` }); + if (profileR.rows?.length) { + const worker = profileR.rows[0]; + const stateMatch = lower.match(/\b(?:in|from)\s+([A-Z]{2})\b/i) || lower.match(/\b(IL|IN|OH|MO|TN|KY|WI|MI|IA|MN)\b/i); + const stateFilter = stateMatch ? `state = '${stateMatch[1].toUpperCase()}'` : `state != '${worker.state}'`; + queries.push(`Vector: Semantic similarity on ${worker.name}'s full profile → ${stateFilter}`); + const searchR = await api("POST", "/vectors/hybrid", { + question: worker.resume_text || `${worker.role} in ${worker.city} with skills ${worker.skills}`, + index_name: "workers_500k_v1", + sql_filter: stateFilter + ` AND CAST(reliability AS DOUBLE) >= 0.7`, + filter_dataset: "ethereal_workers", id_column: "worker_id", top_k: 5, generate: false, + }); + return ok({ type: "similar", summary: `Found ${(searchR.sources||[]).length} workers similar to ${worker.name}${stateMatch ? ' in '+stateMatch[1].toUpperCase() : ' (other states)'}`, + source: { name: worker.name, role: worker.role, city: worker.city, state: worker.state, rel: worker.reliability, skills: worker.skills, archetype: worker.archetype }, + results: (searchR.sources||[]).map((s:any) => ({ doc_id: s.doc_id, score: s.score, text: s.chunk_text })), + sql_matches: searchR.sql_matches, queries_run: queries, duration_ms: Date.now() - start }); + } + return ok({ type: "error", summary: `Couldn't find "${name}" in the database. Try a full name.`, queries_run: queries, duration_ms: Date.now() - start }); + } + + // Route 2: "What if we lose" + if (/what if|lose|happens if/i.test(lower)) { + const roleMatch = lower.match(/(?:lose|lost?)\s+(?:our\s+)?(?:top\s+)?(\d+)?\s*(.+?)(?:\?|$)/i); + if (roleMatch) { + const count = parseInt(roleMatch[1]) || 5; + const subject = roleMatch[2].trim().replace(/\s*workers?\s*$/,'').replace(/s$/,''); + queries.push(`SQL: Top ${count} ${subject}s by reliability`); + const topR = await api("POST", "/query/sql", { sql: `SELECT name, role, city, state, ROUND(CAST(reliability AS DOUBLE),2) rel, skills FROM workers_500k WHERE LOWER(role) LIKE '%${subject.replace(/'/g,"''")}%' ORDER BY CAST(reliability AS DOUBLE) DESC LIMIT ${count}` }); + if (topR.rows?.length) { + const states = [...new Set(topR.rows.map((r:any) => r.state))]; + queries.push(`SQL: Bench depth for ${subject}s in ${states.join(', ')}`); + const benchR = await api("POST", "/query/sql", { sql: `SELECT state, COUNT(*) total, SUM(CASE WHEN CAST(reliability AS DOUBLE)>0.8 THEN 1 ELSE 0 END) reliable FROM workers_500k WHERE LOWER(role) LIKE '%${subject.replace(/'/g,"''")}%' AND state IN (${states.map((s:string)=>`'${s}'`).join(',')}) GROUP BY state` }); + const totalInRole = (benchR.rows||[]).reduce((s:number,r:any) => s + r.total, 0); + const reliableRemaining = (benchR.rows||[]).reduce((s:number,r:any) => s + r.reliable, 0) - topR.rows.length; + return ok({ type: "whatif", summary: `Impact: losing top ${topR.rows.length} ${subject} workers`, + lost: topR.rows, bench: benchR.rows||[], total_in_role: totalInRole, reliable_remaining: Math.max(0, reliableRemaining), + risk_level: reliableRemaining < count * 2 ? "HIGH" : reliableRemaining < count * 5 ? "MEDIUM" : "LOW", + queries_run: queries, duration_ms: Date.now() - start }); + } + return ok({ type: "error", summary: `Couldn't find workers in the "${subject}" role. Try: welder, forklift operator, assembler, etc.`, queries_run: queries, duration_ms: Date.now() - start }); + } + } + + // Route 3: "Who could handle" — semantic role discovery + if (/could handle|capable of|suitable for|qualified for|try.*for|can do/i.test(lower)) { + const roleDesc = q.replace(/^.*?(?:handle|capable of|suitable for|qualified for|try\s+\w+\s+for|can do)\s*/i,'').replace(/\?$/,'').trim(); + queries.push(`Vector: Semantic search for "${roleDesc}" — no exact role match needed`); + const searchR = await api("POST", "/vectors/hybrid", { + question: `Worker experienced in ${roleDesc}, relevant skills and certifications`, + index_name: "workers_500k_v1", sql_filter: "CAST(reliability AS DOUBLE) >= 0.75", + filter_dataset: "ethereal_workers", id_column: "worker_id", top_k: 8, generate: false, + }); + return ok({ type: "discovery", summary: `${(searchR.sources||[]).length} workers found through semantic skill matching for: "${roleDesc}"`, + role_searched: roleDesc, results: (searchR.sources||[]).map((s:any) => ({ doc_id: s.doc_id, score: s.score, text: s.chunk_text })), + sql_matches: searchR.sql_matches, + note: "None of these workers have this exact role title. They were found because their skills, certifications, and experience are semantically similar. This is talent discovery — finding people for roles that don't exist in your database yet.", + queries_run: queries, duration_ms: Date.now() - start }); + } + + // Route 4: "Stop placing" / risk workers + if (/stop placing|worst|problem|flag|risk|underperform|fire|let go/i.test(lower)) { + queries.push("SQL: erratic/silent workers with reliability < 50%"); + const riskR = await api("POST", "/query/sql", { sql: `SELECT name, role, city, state, ROUND(CAST(reliability AS DOUBLE),2) rel, ROUND(CAST(responsiveness AS DOUBLE),2) resp, ROUND(CAST(compliance AS DOUBLE),2) compl, archetype FROM workers_500k WHERE archetype IN ('erratic','silent') AND CAST(reliability AS DOUBLE)<0.5 ORDER BY CAST(reliability AS DOUBLE) ASC LIMIT 10` }); + const countR = await api("POST", "/query/sql", { sql: `SELECT COUNT(*) cnt FROM workers_500k WHERE archetype IN ('erratic','silent') AND CAST(reliability AS DOUBLE)<0.5` }); + return ok({ type: "risk", summary: `${countR.rows?.[0]?.cnt || 0} workers flagged — showing the 10 lowest performers`, + results: riskR.rows||[], total_flagged: countR.rows?.[0]?.cnt || 0, + queries_run: queries, duration_ms: Date.now() - start }); + } + + // Route 5: Analytics / counts + if (/how many|count|total|percentage|average|breakdown/i.test(lower)) { + queries.push("RAG: analytical question → vector retrieval + LLM reasoning"); + const ragR = await api("POST", "/vectors/rag", { index_name: "workers_500k_v1", question: q, top_k: 3 }); + return ok({ type: "answer", summary: ragR.answer || "Couldn't determine the answer from the data", + sources: (ragR.sources||[]).map((s:any) => ({ doc_id: s.doc_id, text: s.chunk_text, score: s.score })), + queries_run: queries, duration_ms: Date.now() - start }); + } + + // Default: hybrid search with generation + queries.push("Hybrid: SQL filter + vector semantic search + LLM summary"); + const searchR = await api("POST", "/vectors/hybrid", { + question: q, index_name: "workers_500k_v1", sql_filter: "CAST(reliability AS DOUBLE) >= 0.5", + filter_dataset: "ethereal_workers", id_column: "worker_id", top_k: 5, generate: true, + }); + return ok({ type: "search", summary: searchR.answer || `Found ${(searchR.sources||[]).length} matching workers`, + results: (searchR.sources||[]).map((s:any) => ({ doc_id: s.doc_id, score: s.score, text: s.chunk_text })), + sql_matches: searchR.sql_matches, queries_run: queries, duration_ms: Date.now() - start }); + } + activeTrace = null; - return err("Unknown path. Available: / /health /search /sql /match /worker/:id /ask /log /playbooks /profile/:id /vram /context /verify /simulation/run", 404); + return err("Unknown path. Available: / /health /search /sql /match /worker/:id /ask /log /playbooks /profile/:id /vram /context /verify /simulation/run /console /intelligence/brief /intelligence/chat", 404); } catch (e: any) { if (activeTrace) { scoreTrace(activeTrace, "error", 0, e.message); } activeTrace = null;