@a-company/paradigm 5.23.0 → 5.27.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/dist/{agent-loader-EPXURMO7.js → agent-loader-MQMXCI3D.js} +1 -1
- package/dist/{agent-loader-PYGPX6D2.js → agent-loader-RGPE3LRD.js} +1 -1
- package/dist/{ambient-WEPHBAJD.js → ambient-2RAKMUC7.js} +2 -2
- package/dist/{chunk-V7K6CQVX.js → chunk-4YIKDQRB.js} +9 -9
- package/dist/chunk-73R63P7K.js +2 -0
- package/dist/{chunk-Z34K6GY2.js → chunk-CUOEZAVL.js} +4 -4
- package/dist/{chunk-HXKWL3VK.js → chunk-DJERXYEL.js} +1 -1
- package/dist/{chunk-4ZGGWZ32.js → chunk-HBGRP73K.js} +1 -1
- package/dist/{chunk-PUBB7LIT.js → chunk-PBVBTHGE.js} +1 -1
- package/dist/{chunk-AD5TAD2A.js → chunk-UELDOSWH.js} +1 -1
- package/dist/{chunk-6EX37L4Q.js → chunk-VZLGBGU3.js} +5 -5
- package/dist/{chunk-2QO33NYK.js → chunk-XGAOYG77.js} +2 -2
- package/dist/{chunk-XUFYOXOU.js → chunk-ZMQXXFG2.js} +2 -2
- package/dist/{compliance-TSXLXADI.js → compliance-LM2NN2S6.js} +2 -2
- package/dist/{docs-RXPN6CK7.js → docs-5BX2YWYK.js} +1 -1
- package/dist/{habits-LX5IWCZM.js → habits-GICVMTJL.js} +1 -1
- package/dist/index.js +1 -1
- package/dist/mcp.js +24 -24
- package/dist/{nomination-engine-XF7TWPAP.js → nomination-engine-K7MQD53E.js} +1 -1
- package/dist/platform-server-G6MJIAJS.js +25 -0
- package/dist/reindex-HA3CJG7S.js +2 -0
- package/dist/{serve-JE6UF5P2.js → serve-ZJ3EXVA5.js} +1 -1
- package/dist/session-tracker-G7VOLRMR.js +2 -0
- package/dist/{session-work-log-3MNUDEZ6.js → session-work-log-HFOD7LEG.js} +1 -1
- package/dist/{session-work-log-J2H5OZBR.js → session-work-log-IEYBPFUC.js} +1 -1
- package/dist/{symphony-3QMBGCZY.js → symphony-43N4R6C2.js} +1 -1
- package/dist/{symphony-QI63XL62.js → symphony-ZQ5OHJTP.js} +3 -3
- package/dist/{symphony-loader-XACVV2E3.js → symphony-loader-XJT43FOS.js} +1 -1
- package/dist/{symphony-relay-5GY5JIPT.js → symphony-relay-KBHN3ZMR.js} +1 -1
- package/dist/university-FJ7OCOA3.js +2 -0
- package/package.json +1 -1
- package/platform-ui/dist/assets/AmbientSection-BYjt75R1.js +1 -0
- package/platform-ui/dist/assets/{CanvasSection-DLW0s-Bu.js → CanvasSection-rKvA_vZj.js} +2 -2
- package/platform-ui/dist/assets/{DocsSection-BQ9Hi51g.js → DocsSection-CI9K73M-.js} +1 -1
- package/platform-ui/dist/assets/GitSection-DSGj_c6S.js +4 -0
- package/platform-ui/dist/assets/{GraphSection-0c9C-w7K.js → GraphSection-CawN7pC5.js} +2 -2
- package/platform-ui/dist/assets/LoreSection-oO5dCe6O.js +1 -0
- package/platform-ui/dist/assets/{SentinelSection-C4OoME9U.js → SentinelSection-DNgoYMH0.js} +1 -1
- package/platform-ui/dist/assets/SymphonySection-C0zfcqv3.js +1 -0
- package/platform-ui/dist/assets/TeamSection-Bzd3Dt9Q.js +1 -0
- package/platform-ui/dist/assets/UniversitySection-B3ltVfpt.css +1 -0
- package/platform-ui/dist/assets/UniversitySection-tBr62R0S.js +1 -0
- package/platform-ui/dist/assets/{index-DPpOdAtC.js → index-BaOmyn11.js} +12 -12
- package/platform-ui/dist/index.html +1 -1
- package/dist/chunk-RMOALQJN.js +0 -2
- package/dist/platform-server-2KXHGHFV.js +0 -25
- package/dist/reindex-PGDQSM42.js +0 -2
- package/dist/session-tracker-SKOMBDOW.js +0 -2
- package/platform-ui/dist/assets/AmbientSection-DqQ2mfCO.js +0 -1
- package/platform-ui/dist/assets/GitSection-QQeUX6o3.js +0 -4
- package/platform-ui/dist/assets/LoreSection--t56kCj2.js +0 -1
- package/platform-ui/dist/assets/SymphonySection-B-rvsLxq.js +0 -1
- package/platform-ui/dist/assets/TeamSection-CBFmNEEo.js +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {v}from'./chunk-
|
|
2
|
+
import {v}from'./chunk-DJERXYEL.js';export{o as adjustAttentionFromFeedback,u as applySurfacingRules,s as autoPromoteJournalEntries,g as detectDebates,n as emitAndProcess,k as engageNomination,r as forwardNominationsToRelay,q as getNeverlandMetrics,p as getNominationStats,j as loadDebates,i as loadNominations,t as loadSurfacingConfig,h as persistNominations,f as processEvent,m as processPendingEvents,l as resolveDebate}from'./chunk-DJERXYEL.js';import'./chunk-ZMQXXFG2.js';import'./chunk-QGZRM6ZB.js';import'./chunk-VG7FN2TU.js';import'./chunk-5TAVYPOV.js';v();
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {a,b as b$1,c}from'./chunk-XMAV5AG6.js';import {a as a$1,b as b$2}from'./chunk-Y6KXTQBG.js';import'./chunk-5TAVYPOV.js';import U,{Router}from'express';import*as ut from'http';import*as v from'path';import*as S from'fs';import {fileURLToPath}from'url';import A from'chalk';import {WebSocketServer,WebSocket}from'ws';import X from'simple-git';import*as W from'js-yaml';import*as H from'os';function dt(r){let n=["#58a6ff","#3fb950","#f85149","#d29922","#bc8cff","#f778ba","#79c0ff","#56d364"],o=0;for(let s=0;s<r.length;s++)o=(o<<5)-o+r.charCodeAt(s)|0;return n[Math.abs(o)%n.length]}var gt=0,E=class{agents=new Map;staleTimeout=120*1e3;join(n){let o=new Date().toISOString(),s={agentId:n,color:dt(n),connectedAt:o,lastActivity:o};return this.agents.set(n,s),s}touch(n){let o=this.agents.get(n);o&&(o.lastActivity=new Date().toISOString());}leave(n){this.agents.delete(n);}getAll(){return Array.from(this.agents.values())}pruneStale(){let n=Date.now(),o=[];for(let[s,t]of this.agents)n-new Date(t.lastActivity).getTime()>this.staleTimeout&&(this.agents.delete(s),o.push(s));return o}},M=class{state={section:"overview",selectedSymbol:null,theme:"dark",lastInteraction:Date.now()};highlights=[];annotations=[];muted=false;updateSection(n){this.state.section=n,this.state.lastInteraction=Date.now();}updateSelectedSymbol(n){this.state.selectedSymbol=n,this.state.lastInteraction=Date.now();}updateTheme(n){this.state.theme=n;}setMuted(n){this.muted=n;}isMuted(){return this.muted}isUserActive(n=5e3){return Date.now()-this.state.lastInteraction<n}getState(){return {...this.state,muted:this.muted}}addHighlight(n){this.highlights.push(n),n.duration>0&&setTimeout(()=>{this.highlights=this.highlights.filter(o=>o!==n);},n.duration);}addAnnotation(n){let o={...n,id:`ann-${++gt}`,createdAt:Date.now()};return this.annotations.push(o),o.duration>0&&setTimeout(()=>{this.annotations=this.annotations.filter(s=>s!==o);},o.duration),o}clearHighlights(){this.highlights=[];}clearAnnotations(){this.annotations=[];}clearAll(){this.highlights=[],this.annotations=[];}getHighlights(){return [...this.highlights]}getAnnotations(){return [...this.annotations]}};function Q(r){let n=new Set,o=new E,s=new M;function t(a){let c=JSON.stringify(a);for(let l of n)l.readyState===WebSocket.OPEN&&l.send(c);}return new WebSocketServer({server:r,path:"/ws"}).on("connection",a=>{n.add(a),a.on("message",c=>{try{let l=JSON.parse(c.toString());l.type==="user:navigate"?s.updateSection(l.section):l.type==="user:select"?s.updateSelectedSymbol(l.symbol??null):l.type==="user:theme"?s.updateTheme(l.theme):l.type==="user:mute"?(s.setMuted(l.muted),t({type:"agent:mute_changed",muted:l.muted})):l.type==="ping"&&a.send(JSON.stringify({type:"pong",timestamp:new Date().toISOString()}));}catch{}}),a.on("close",()=>{n.delete(a);}),a.on("error",()=>{n.delete(a);});}),setInterval(()=>{let a=o.pruneStale();for(let c of a)t({type:"agent:leave",agentId:c});},3e4),{broadcast:t,agentPresence:o,userState:s,clientCount:()=>n.size}}function V(r){let n=Router();return n.post("/",(o,s)=>{let{command:t,agentId:e,payload:a}=o.body;if(!t||!e){s.status(400).json({error:"Missing command or agentId"});return}switch(r.agentPresence.getAll().find(l=>l.agentId===e)||(r.agentPresence.join(e),r.broadcast({type:"agent:join",agent:r.agentPresence.getAll().find(l=>l.agentId===e)})),r.agentPresence.touch(e),t){case "navigate":{let{section:l,symbol:i,loreId:u}=a,m=r.userState.isUserActive();if(r.userState.isMuted()){s.json({navigated:false,reason:"Agent actions are muted by user"});return}r.broadcast({type:"agent:navigate",agentId:e,section:l,symbol:i,loreId:u,userActive:m}),l&&r.userState.updateSection(l),i&&r.userState.updateSelectedSymbol(i),s.json({navigated:true,section:l,symbol:i,userActive:m});return}case "highlight":{let{symbols:l,color:i,duration:u,pulse:m,label:d}=a;if(r.userState.isMuted()){s.json({highlighted:false,reason:"Agent actions are muted by user"});return}let f=l||[];r.userState.addHighlight({symbols:f,color:i||r.agentPresence.getAll().find(P=>P.agentId===e)?.color||"#58a6ff",duration:u||5e3,pulse:m??true,label:d,createdAt:Date.now()}),r.broadcast({type:"agent:highlight",agentId:e,symbols:f,color:i||"#58a6ff",duration:u||5e3,pulse:m??true,label:d}),s.json({highlighted:true,count:f.length});return}case "annotate":{let{type:l,message:i,symbol:u,severity:m,duration:d}=a;if(r.userState.isMuted()){s.json({annotated:false,reason:"Agent actions are muted by user"});return}let f=r.userState.addAnnotation({type:l||"toast",message:i||"",symbol:u,severity:m||"info",duration:d||6e3});r.broadcast({type:"agent:annotate",agentId:e,annotation:f}),s.json({annotated:true,id:f.id});return}case "observe":{let l=r.userState.getState(),i=r.agentPresence.getAll(),u=r.clientCount()>0;s.json({connected:u,users:r.clientCount(),agents:i,state:{section:l.section,selectedSymbol:l.selectedSymbol,theme:l.theme,muted:l.muted},highlights:r.userState.getHighlights(),annotations:r.userState.getAnnotations()});return}case "clear":{let{target:l}=a,i=l||"all";(i==="highlights"||i==="all")&&r.userState.clearHighlights(),(i==="annotations"||i==="all")&&r.userState.clearAnnotations(),r.broadcast({type:"agent:clear",agentId:e,target:i}),s.json({cleared:true,target:i});return}default:s.status(400).json({error:`Unknown command: ${t}`});return}}),n}function yt(r){try{return JSON.parse(S.readFileSync(r,"utf-8"))}catch{return null}}function O(r){try{return W.load(S.readFileSync(r,"utf-8"))}catch{return null}}function bt(r){let n=v.join(r,".paradigm","scan-index.json"),o=yt(n);if(!o?.symbols)return {total:0,byType:{}};let s={};for(let t of o.symbols){let e=t.category||"unknown";s[e]=(s[e]||0)+1;}return {total:o.symbols.length,byType:s}}function St(r){let n=v.join(r,".paradigm","lore","entries");if(!S.existsSync(n))return {total:0,thisWeek:0,lastEntry:null,calibrationScore:null,assessed:0};let o=S.readdirSync(n).filter(d=>d.endsWith(".yaml")||d.endsWith(".yml")),t=Date.now()-10080*60*1e3,e=null,a=0,c=0,l=0,i=0,u=0;for(let d of o)try{let p=O(v.join(n,d));if(!p)continue;let f=p.timestamp;if(f){let P=new Date(f).getTime();(!e||P>new Date(e).getTime())&&(e=f),P>=t&&a++;}p.assessment&&(c++,typeof p.confidence=="number"&&typeof p.assessment_delta=="number"&&(l+=p.confidence,i+=Math.abs(p.assessment_delta),u++));}catch{}let m=u>0?Math.max(0,1-i/u):null;return {total:o.length,thisWeek:a,lastEntry:e,calibrationScore:m,assessed:c}}function vt(r){let n=v.join(r,".paradigm","tasks");if(!S.existsSync(n))return {total:0,inProgress:0,completed:0};let o=S.readdirSync(n).filter(e=>e.endsWith(".yaml")||e.endsWith(".yml")),s=0,t=0;for(let e of o)try{let a=O(v.join(n,e));if(!a)continue;let c=a.status;c==="in-progress"||c==="in_progress"?s++:(c==="completed"||c==="done")&&t++;}catch{}return {total:o.length,inProgress:s,completed:t}}function Rt(r){let n=["src","lib","packages"],o=0,s=0;for(let t of n){let e=v.join(r,t);S.existsSync(e)&&tt(e,{},a=>{o+=a.withPurpose,s+=a.total;});}return S.existsSync(v.join(r,".purpose"))&&(o++,s++),s===0?1:o/s}function tt(r,n,o){let s={withPurpose:0,total:0};try{let t=S.readdirSync(r,{withFileTypes:!0});t.some(a=>a.isFile()&&/\.(ts|tsx|js|jsx|rs|py|go|swift)$/.test(a.name))&&(s.total++,t.some(a=>a.isFile()&&a.name===".purpose")&&s.withPurpose++);for(let a of t)a.isDirectory()&&!a.name.startsWith(".")&&a.name!=="node_modules"&&a.name!=="dist"&&tt(v.join(r,a.name),s,c=>{s.withPurpose+=c.withPurpose,s.total+=c.total;});}catch{}o(s);}function jt(r){let n=v.join(r,"portal.yaml");if(!S.existsSync(n))return 1;let o=O(n);return o?.routes?Object.keys(o.routes).length>0?1:.5:1}function wt(r){let n=v.join(r,".paradigm","aspect-graph.db");return S.existsSync(n),1}function At(r){let n=v.join(r,".paradigm","config.yaml"),o=O(n);return {name:o?.project||v.basename(r),discipline:o?.discipline||"general"}}async function Pt(r,n){try{return (await X(r).log({maxCount:n})).all.map(t=>({timestamp:t.date,type:"commit",summary:t.message.split(`
|
|
3
|
+
`)[0],symbol:kt(t.message),link:t.hash.substring(0,7)}))}catch{return []}}function kt(r){let n=r.match(/[#$^!~][\w-]+/);return n?n[0]:void 0}function xt(r,n){let o=v.join(r,".paradigm","lore","entries");if(!S.existsSync(o))return [];let s=S.readdirSync(o).filter(e=>e.endsWith(".yaml")||e.endsWith(".yml")),t=[];for(let e of s)try{let a=O(v.join(o,e));if(!a)continue;t.push({timestamp:a.timestamp||"",type:"lore",summary:a.title||e,symbol:Array.isArray(a.symbols_touched)?a.symbols_touched[0]:void 0,link:a.id});}catch{}return t.sort((e,a)=>new Date(a.timestamp).getTime()-new Date(e.timestamp).getTime()).slice(0,n)}function et(r){return async(n,o)=>{try{let s=At(r),t=bt(r),e=St(r),a=vt(r),c=Rt(r),l=jt(r),i=wt(r),u="unknown";try{u=(await X(r).branch()).current;}catch{}let[m,d]=await Promise.all([Pt(r,20),Promise.resolve(xt(r,20))]),p=[...m,...d].sort((x,g)=>new Date(g.timestamp).getTime()-new Date(x.timestamp).getTime()).slice(0,20),f=e.lastEntry?Math.floor((Date.now()-new Date(e.lastEntry).getTime())/(1e3*60*60*24)):0,P={project:{name:s.name,branch:u,discipline:s.discipline},symbols:t,lore:{total:e.total,thisWeek:e.thisWeek,lastEntry:e.lastEntry},calibration:{score:e.calibrationScore,assessed:e.assessed},tasks:a,health:{purposeCoverage:c,aspectAnchors:i,gateCompliance:l,calibration:e.calibrationScore??1,loreFreshnessDays:f},recentActivity:p};o.json(P);}catch(s){o.status(500).json({error:"Failed to aggregate overview",detail:String(s)});}}}var qt=/[#$^!~][\w-]+/g;function It(r){let n=r.match(qt);return n?[...new Set(n)]:[]}function nt(r){let n=Router(),o=X(r);return n.get("/status",async(s,t)=>{try{let[e,a]=await Promise.all([o.status(),o.branch()]);t.json({branch:a.current,ahead:e.ahead,behind:e.behind,staged:e.staged,unstaged:e.modified.filter(c=>!e.staged.includes(c)),untracked:e.not_added});}catch(e){t.status(500).json({error:"Failed to get git status",detail:String(e)});}}),n.get("/branches",async(s,t)=>{try{let e=await o.branch(),a=Object.values(e.branches).map(c=>({name:c.name,current:c.current,commit:c.commit,label:c.label}));t.json({current:e.current,branches:a});}catch(e){t.status(500).json({error:"Failed to get branches",detail:String(e)});}}),n.get("/log",async(s,t)=>{try{let e=Math.min(parseInt(s.query.limit)||20,100),a=parseInt(s.query.offset)||0,c=await o.log({maxCount:e,"--skip":a}),l=c.all.map(i=>({hash:i.hash,shortHash:i.hash.substring(0,7),message:i.message,author:i.author_name,date:i.date,symbols:It(i.message)}));t.json({commits:l,total:c.total});}catch(e){t.status(500).json({error:"Failed to get git log",detail:String(e)});}}),n.get("/diff",async(s,t)=>{try{let e=s.query.path,a=s.query.staged==="true",c=[];a&&c.push("--cached"),e&&c.push("--",e);let l=await o.diff(c);t.json({diff:l});}catch(e){t.status(500).json({error:"Failed to get diff",detail:String(e)});}}),n.post("/stage",async(s,t)=>{try{let{paths:e}=s.body;if(!e?.length){t.status(400).json({error:"paths is required"});return}await o.add(e),t.json({staged:e});}catch(e){t.status(500).json({error:"Failed to stage files",detail:String(e)});}}),n.post("/unstage",async(s,t)=>{try{let{paths:e}=s.body;if(!e?.length){t.status(400).json({error:"paths is required"});return}await o.reset(["HEAD","--",...e]),t.json({unstaged:e});}catch(e){t.status(500).json({error:"Failed to unstage files",detail:String(e)});}}),n.post("/commit",async(s,t)=>{try{let{message:e}=s.body;if(!e?.trim()){t.status(400).json({error:"message is required"});return}let a=await o.commit(e);t.json({hash:a.commit,summary:a.summary});}catch(e){t.status(500).json({error:"Failed to commit",detail:String(e)});}}),n.post("/push",async(s,t)=>{try{let e=await o.push();t.json({pushed:!0,branch:e.branch,remoteMessages:e.remoteMessages});}catch(e){t.status(500).json({error:"Failed to push",detail:String(e)});}}),n}function N(r){if(!S.existsSync(r))return [];try{let o=S.readFileSync(r,"utf-8").split(`
|
|
4
|
+
`).filter(t=>t.trim()),s=[];for(let t of o)try{s.push(JSON.parse(t));}catch{}return s}catch{return []}}function $t(r,n){let o=v.dirname(r);S.existsSync(o)||S.mkdirSync(o,{recursive:true});let s=n.map(t=>JSON.stringify(t)).join(`
|
|
5
|
+
`)+`
|
|
6
|
+
`;S.writeFileSync(r,s,"utf-8");}function Ot(r){let n=r.match(/^(\d+)(m|h|d)$/);if(!n)return null;let o=parseInt(n[1],10),s=n[2],t=Date.now();switch(s){case "m":return new Date(t-o*60*1e3);case "h":return new Date(t-o*60*60*1e3);case "d":return new Date(t-o*24*60*60*1e3);default:return null}}function rt(r,n){let o=Router(),s=v.join(r,".paradigm","events","stream.jsonl"),t=v.join(r,".paradigm","events","nominations.jsonl"),e=v.join(r,".paradigm","events","debates.jsonl"),a=v.join(r,".paradigm","data-policy.yaml");return o.get("/events",(c,l)=>{try{let{type:i,source:u,symbol:m,agent:d,since:p,limit:f}=c.query,P=f?parseInt(f,10):50,x=p?Ot(p):null,g=N(s);i&&(g=g.filter(w=>w.type===i)),u&&(g=g.filter(w=>w.source===u)),m&&(g=g.filter(w=>w.symbol===m)),d&&(g=g.filter(w=>w.agent===d)),x&&(g=g.filter(w=>w.timestamp?new Date(w.timestamp).getTime()>=x.getTime():!1));let T=g.slice(-P);n.broadcast({type:"ambient:event",action:"query",count:T.length}),l.json(T);}catch(i){l.status(500).json({error:"Failed to query events",detail:String(i)});}}),o.get("/nominations",(c,l)=>{try{let{agent:i,urgency:u,pending_only:m,include_debates:d,limit:p}=c.query,f=p?parseInt(p,10):20,P=m!=="false",x=d==="true",g=N(t);i&&(g=g.filter(k=>k.agent===i)),u&&(g=g.filter(k=>k.urgency===u)),P&&(g=g.filter(k=>!k.engaged)),g=g.slice(-f);let T;if(x){let k=N(e);T=new Map;for(let I of k)if(I.nominationId){let z=T.get(I.nominationId)||[];z.push(I),T.set(I.nominationId,z);}}let w=g.map(k=>{let I={...k};return x&&T&&k.id&&(I.debates=T.get(k.id)||[]),I});l.json(w);}catch(i){l.status(500).json({error:"Failed to query nominations",detail:String(i)});}}),o.post("/nominations/:id/engage",(c,l)=>{try{let{id:i}=c.params,{response:u}=c.body;if(!u||!["accepted","dismissed","deferred"].includes(u)){l.status(400).json({error:"response must be one of: accepted, dismissed, deferred"});return}let m=N(t),d=m.findIndex(p=>p.id===i);if(d===-1){l.status(404).json({error:`Nomination not found: ${i}`});return}m[d]={...m[d],engaged:!0,response:u},$t(t,m),n.broadcast({type:"ambient:nomination",action:"engaged",nominationId:i,response:u}),l.json(m[d]);}catch(i){l.status(500).json({error:"Failed to engage nomination",detail:String(i)});}}),o.get("/stream",(c,l)=>{l.setHeader("Content-Type","text/event-stream"),l.setHeader("Cache-Control","no-cache"),l.setHeader("Connection","keep-alive"),l.flushHeaders();let i=0;try{i=S.statSync(s).size;}catch{}let m=setInterval(()=>{try{if(!S.existsSync(s))return;let d=S.statSync(s);if(d.size<=i)if(d.size<i)i=0;else return;let p=S.openSync(s,"r"),f=Buffer.alloc(d.size-i);S.readSync(p,f,0,f.length,i),S.closeSync(p),i=d.size;let x=f.toString("utf-8").split(`
|
|
7
|
+
`).filter(g=>g.trim());for(let g of x)try{let T=JSON.parse(g);l.write(`data: ${JSON.stringify(T)}
|
|
8
|
+
|
|
9
|
+
`);}catch{}}catch{}},1e3);l.write(`: connected
|
|
10
|
+
|
|
11
|
+
`),c.on("close",()=>{clearInterval(m);});}),o.get("/policy",(c,l)=>{try{if(S.existsSync(a)){let i=S.readFileSync(a,"utf-8"),u=W.load(i);l.json(u);}else l.json({version:"1.0",retention:{events:"30d",nominations:"90d",debates:"90d"},collection:{telemetry:!1,usage:!1},sharing:{external:!1}});}catch(i){l.status(500).json({error:"Failed to read data policy",detail:String(i)});}}),o}function Ct(r){if(!S.existsSync(r))return [];try{return S.readFileSync(r,"utf-8").trim().split(`
|
|
12
|
+
`).filter(n=>n.trim()).map(n=>{try{return JSON.parse(n)}catch{return null}}).filter(n=>n!==null)}catch{return []}}function _t(){let r=v.join(H.homedir(),".paradigm","agents"),n=[];if(!S.existsSync(r))return n;for(let o of S.readdirSync(r).filter(s=>s.endsWith(".agent")))try{let s=S.readFileSync(v.join(r,o),"utf-8"),t=W.load(s);if(!t?.id)continue;let e=t.expertise||[];e.sort((a,c)=>c.confidence-a.confidence),n.push({id:t.id,role:t.role||t.id,nickname:t.nickname,benched:t.benched||!1,expertiseCount:e.length,topExpertise:e.slice(0,3).map(a=>({symbol:a.symbol,confidence:parseFloat(a.confidence.toFixed(2))})),threshold:t.attention?.threshold});}catch{}return n}function Et(){let r=v.join(H.homedir(),".paradigm","mail","agents");if(!S.existsSync(r))return [];let n=[];try{for(let t of S.readdirSync(r,{withFileTypes:!0})){if(!t.isDirectory())continue;let e=v.join(r,t.name);for(let a of ["inbox.jsonl","outbox.jsonl"]){let c=v.join(e,a),l=Ct(c);for(let i of l)i.threadRoot?.startsWith("thr-orch-")&&(n.some(u=>u.id===i.id)||n.push({id:i.id,threadRoot:i.threadRoot,timestamp:i.timestamp,sender:{name:i.sender?.name||"unknown",role:i.sender?.role,project:i.sender?.project},intent:i.intent||"context",text:i.content?.text||"",symbols:i.symbols||[],diff:i.content?.diff,decision:i.content?.decision}));}}}catch{}let o=new Map;for(let t of n){let e=t.threadRoot;o.has(e)||o.set(e,[]),o.get(e).push(t);}let s=[];for(let[t,e]of o){e.sort((i,u)=>i.timestamp.localeCompare(u.timestamp));let c=t.replace("thr-orch-","").split("-"),l=c[0]?`Team ${c[0]}`:t;s.push({id:t,displayName:l,messages:e,lastActivity:e[e.length-1]?.timestamp||""});}return s.sort((t,e)=>e.lastActivity.localeCompare(t.lastActivity)),s}function ot(r){let n=Router();return n.get("/roster",(o,s)=>{try{let t=_t(),e=t.filter(c=>!c.benched),a=t.filter(c=>c.benched);s.json({active:e,benched:a,total:t.length});}catch(t){s.status(500).json({error:"Failed to load roster",detail:String(t)});}}),n.get("/threads",(o,s)=>{try{let t=Et();s.json({threads:t,count:t.length});}catch(t){s.status(500).json({error:"Failed to load threads",detail:String(t)});}}),n.patch("/agents/:id/bench",(o,s)=>{try{let{id:t}=o.params,{benched:e}=o.body,a=v.join(H.homedir(),".paradigm","agents"),c=v.join(a,`${t}.agent`);if(!S.existsSync(c)){s.status(404).json({error:`Agent "${t}" not found`});return}let l=S.readFileSync(c,"utf-8"),i=W.load(l);i.benched=e,i.updated=new Date().toISOString(),S.writeFileSync(c,W.dump(i,{lineWidth:120,noRefs:!0,sortKeys:!1}),"utf-8"),s.json({id:t,benched:e,updated:i.updated});}catch(t){s.status(500).json({error:"Failed to update agent",detail:String(t)});}}),n}var Nt=new Set(["node_modules",".git","dist",".next","build",".paradigm",".turbo",".cache","coverage",".output"]);function it(r,n){let o=[],s;try{s=S.readdirSync(r,{withFileTypes:!0});}catch{return o}for(let t of s)t.isDirectory()?!Nt.has(t.name)&&!t.name.startsWith(".")&&o.push(...it(v.join(r,t.name),n)):t.isFile()&&t.name.endsWith(".canvas")&&o.push(v.relative(n,v.join(r,t.name)));return o}var $=null,at=0,Ht=5e3;function Jt(r){let n=Date.now();if($&&n-at<Ht)return $;let o=S.readdirSync(r).filter(t=>t.endsWith(".canvas")).map(t=>t),s=it(r,r).filter(t=>!o.includes(t));return $=[...o,...s],at=n,$}function J(r,n){let o=v.resolve(r,n);return !o.startsWith(r+v.sep)&&o!==r||!o.endsWith(".canvas")?null:o}function ct(r){let n=Router();return n.get("/files",(o,s)=>{try{let e=Jt(r).map(a=>{let c=v.join(r,a);try{let l=S.statSync(c),i=v.basename(a,".canvas"),u="";try{let m=W.load(S.readFileSync(c,"utf8"));m&&typeof m.name=="string"&&(i=m.name),m&&typeof m.description=="string"&&(u=m.description);}catch{}return {path:a,name:i,description:u,modified:l.mtime.toISOString(),size:l.size}}catch{return null}}).filter(Boolean);e.sort((a,c)=>c.modified.localeCompare(a.modified)),s.json({files:e});}catch(t){s.status(500).json({error:"Failed to list canvas files",details:t.message});}}),n.get("/files/*",(o,s)=>{let t=o.params[0]||o.params.path||"";if(!t){s.status(400).json({error:"File path required"});return}let e=J(r,t);if(!e){s.status(400).json({error:"Invalid path"});return}if(!S.existsSync(e)){s.status(404).json({error:`Canvas file not found: ${t}`});return}try{let a=S.readFileSync(e,"utf8"),c=W.load(a);s.json(c);}catch(a){s.status(500).json({error:"Failed to read canvas file",details:a.message});}}),n.put("/files/*",(o,s)=>{let t=o.params[0]||o.params.path||"";if(!t){s.status(400).json({error:"File path required"});return}let e=J(r,t);if(!e){s.status(400).json({error:"Invalid path"});return}try{let a=o.body;if(!a||typeof a!="object"){s.status(400).json({error:"Request body must be a JSON object"});return}let c=new Date().toISOString();a.created||(a.created=c),a.updated=c;let l=v.dirname(e);S.existsSync(l)||S.mkdirSync(l,{recursive:!0});let i=W.dump(a,{lineWidth:-1,noRefs:!0,quotingType:'"',forceQuotes:!1});S.writeFileSync(e,i,"utf8"),$=null,s.json({saved:!0,path:t});}catch(a){s.status(500).json({error:"Failed to save canvas file",details:a.message});}}),n.delete("/files/*",(o,s)=>{let t=o.params[0]||o.params.path||"";if(!t){s.status(400).json({error:"File path required"});return}let e=J(r,t);if(!e){s.status(400).json({error:"Invalid path"});return}if(!S.existsSync(e)){s.status(404).json({error:`Canvas file not found: ${t}`});return}try{S.unlinkSync(e),$=null,s.json({deleted:!0,path:t});}catch(a){s.status(500).json({error:"Failed to delete canvas file",details:a.message});}}),n}var zt=fileURLToPath(import.meta.url),lt=v.dirname(zt),b={component(r){let n=A.magenta(`#${r}`);return {info:(o,s)=>{let t=s?A.gray(` ${Object.entries(s).map(([e,a])=>`${e}=${a}`).join(" ")}`):"";console.log(`${A.blue("i")} ${n} ${o}${t}`);},success:(o,s)=>{let t=s?A.gray(` ${Object.entries(s).map(([e,a])=>`${e}=${a}`).join(" ")}`):"";console.log(`${A.green("+")} ${n} ${o}${t}`);},warn:(o,s)=>{let t=s?A.gray(` ${Object.entries(s).map(([e,a])=>`${e}=${a}`).join(" ")}`):"";console.log(`${A.yellow("!")} ${n} ${o}${t}`);},error:(o,s)=>{let t=s?A.gray(` ${Object.entries(s).map(([e,a])=>`${e}=${a}`).join(" ")}`):"";console.error(`${A.red("x")} ${n} ${o}${t}`);}}}};function mt(r){let n=["overview","lore","graph","canvas","git","ambient","team"],o=r.sections??[...n,"sentinel","university","symphony","docs"],s=new Set;for(let t of o){if(n.includes(t)){s.add(t);continue}if(t==="sentinel"){let e=v.join(r.projectDir,".paradigm");S.existsSync(e)&&s.add(t);}else if(t==="university")s.add(t);else if(t==="symphony"){let e=v.join(process.env.HOME||"~",".paradigm","score");S.existsSync(e)&&s.add(t);}else s.add(t);}return s}function Gt(r){let n=U(),o=mt(r);n.use(U.json()),n.use((t,e,a)=>{if(e.header("Access-Control-Allow-Origin","*"),e.header("Access-Control-Allow-Methods","GET, POST, PUT, DELETE, OPTIONS"),e.header("Access-Control-Allow-Headers","Content-Type"),t.method==="OPTIONS"){e.sendStatus(204);return}a();}),n.use("/api/lore",a(r.projectDir)),n.use("/api/info",b$1(r.projectDir)),n.use("/api/sessions",c(r.projectDir)),n.use("/api/symbols",a$1(r.projectDir)),n.use("/api/graphs",b$2(r.projectDir)),n.get("/api/platform/overview",et(r.projectDir)),n.use("/api/canvas",ct(r.projectDir)),n.use("/api/git",nt(r.projectDir)),n.get("/api/platform/health",(t,e)=>{e.json({status:"ok",timestamp:new Date().toISOString(),sections:Array.from(o)});}),n.get("/api/platform/sections",(t,e)=>{e.json({sections:Array.from(o)});}),n.get("/api/health",(t,e)=>{e.json({status:"ok",timestamp:new Date().toISOString()});}),n.set("agentRouterSlot",true);let s=v.join(lt,"..","platform-ui","dist");return S.existsSync(s)||(s=v.join(lt,"..","..","platform-ui","dist")),S.existsSync(s)?(n.use(U.static(s)),n.get("{*path}",(t,e,a)=>{t.path.startsWith("/api")?a():e.sendFile(v.join(s,"index.html"));})):n.get("/",(t,e)=>{e.send(`
|
|
13
|
+
<html>
|
|
14
|
+
<head><title>Paradigm Platform</title></head>
|
|
15
|
+
<body style="background:#0d1117;color:#e6edf3;font-family:system-ui;display:flex;align-items:center;justify-content:center;height:100vh;margin:0">
|
|
16
|
+
<div style="text-align:center">
|
|
17
|
+
<h1 style="font-size:2rem;margin-bottom:8px">Paradigm Platform</h1>
|
|
18
|
+
<p style="color:#8b949e">UI not built yet. Run <code style="background:#21262d;padding:4px 8px;border-radius:4px">cd platform-ui && npx vite build</code></p>
|
|
19
|
+
<p style="color:#8b949e;margin-top:16px">APIs available:</p>
|
|
20
|
+
<p><a href="/api/lore" style="color:#58a6ff">/api/lore</a> · <a href="/api/symbols" style="color:#58a6ff">/api/symbols</a> · <a href="/api/platform/health" style="color:#58a6ff">/api/platform/health</a></p>
|
|
21
|
+
</div>
|
|
22
|
+
</body>
|
|
23
|
+
</html>
|
|
24
|
+
`);}),n}async function Pe(r){let n=Gt(r),o=mt(r);b.component("platform-server").info("Starting Paradigm Platform",{port:r.port}),b.component("platform-server").info("Project directory",{path:r.projectDir}),b.component("platform-server").info("Sections",{enabled:Array.from(o).join(", ")});let s=ut.createServer(n),t=Q(s);if(n.use("/api/platform/agent-command",V(t)),n.use("/api/ambient",rt(r.projectDir,t)),n.use("/api/team",ot(r.projectDir)),o.has("sentinel"))try{let{createSentinelBridge:e}=await import('./sentinel-bridge-VR357PKL.js'),a=await e(r.projectDir,t.broadcast);a&&(n.use("/api/sentinel",a),b.component("platform-server").success("Sentinel routes mounted"));}catch{b.component("platform-server").warn("Sentinel not available");}if(o.has("symphony"))try{let{createSymphonyRouter:e}=await import('./symphony-43N4R6C2.js');n.use("/api/symphony",e(r.projectDir,t.broadcast)),b.component("platform-server").success("Symphony routes mounted");}catch{b.component("platform-server").warn("Symphony routes failed to mount");}if(o.has("docs"))try{let{createDocsRouter:e}=await import('./docs-EDQ2STFK.js');n.use("/api/docs",e(r.projectDir)),b.component("platform-server").success("Docs routes mounted");}catch{b.component("platform-server").warn("Docs routes failed to mount");}if(o.has("university"))try{let{createUniversityRouter:e}=await import('./university-FJ7OCOA3.js');n.use("/api/university",e(r.projectDir)),b.component("platform-server").success("University routes mounted");}catch{b.component("platform-server").warn("University routes failed to mount");}return new Promise((e,a)=>{s.listen(r.port,()=>{b.component("platform-server").success("Platform running",{url:`http://localhost:${r.port}`}),b.component("platform-ws").success("WebSocket ready",{url:`ws://localhost:${r.port}/ws`}),console.log(""),console.log(A.gray(" Sections:"));for(let c of o)console.log(A.gray(` ${A.cyan("\u25CF")} ${c}`));console.log(""),r.open&&import('open').then(c=>{c.default(`http://localhost:${r.port}`),b.component("platform-server").info("Opened browser");}).catch(()=>{b.component("platform-server").warn("Could not open browser automatically");}),e();}),s.on("error",c=>{c.code==="EADDRINUSE"?b.component("platform-server").error("Port already in use",{port:r.port}):b.component("platform-server").error("Server error",{error:c.message}),a(c);});})}
|
|
25
|
+
export{Gt as createPlatformApp,Pe as startPlatformServer};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import'./chunk-5TAVYPOV.js';import o from'chalk';async function i(e){let n=process.cwd(),t=parseInt(e.port||"3850",10),s=e.open!==false,a=e.sections?e.sections.split(",").map(r=>r.trim()):void 0;console.log(o.cyan(`
|
|
3
3
|
Starting Paradigm Platform...
|
|
4
|
-
`));try{let{startPlatformServer:r}=await import('./platform-server-
|
|
4
|
+
`));try{let{startPlatformServer:r}=await import('./platform-server-G6MJIAJS.js');await r({port:t,projectDir:n,open:s,sections:a}),console.log(o.green(` Platform running at ${o.bold(`http://localhost:${t}`)}`)),console.log(o.gray(` Press Ctrl+C to stop
|
|
5
5
|
`)),await new Promise(()=>{});}catch(r){r.code==="EADDRINUSE"?(console.error(o.red(`
|
|
6
6
|
Error: Port ${t} is already in use.`)),console.log(o.gray(` Try: paradigm serve --port ${t+1}
|
|
7
7
|
`))):console.error(o.red(`
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
export{a as appendSessionWorkEntry,c as clearSessionWorkLog,e as getAgentEntries,f as getAgentVerdicts,d as getContributingAgents,b as readSessionWorkLog}from'./chunk-
|
|
2
|
+
export{a as appendSessionWorkEntry,c as clearSessionWorkLog,e as getAgentEntries,f as getAgentVerdicts,d as getContributingAgents,b as readSessionWorkLog}from'./chunk-PBVBTHGE.js';import'./chunk-5TAVYPOV.js';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {h}from'./chunk-
|
|
2
|
+
import {h}from'./chunk-UELDOSWH.js';export{a as appendSessionWorkEntry,c as clearSessionWorkLog,e as getAgentEntries,f as getAgentVerdicts,d as getContributingAgents,b as readSessionWorkLog}from'./chunk-UELDOSWH.js';import'./chunk-5TAVYPOV.js';h();
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {e,d,i,h,f,q,p,s,r,a,o,t,u,k,B,x,z,y}from'./chunk-
|
|
2
|
+
import {e,d,i,h,f,q,p,s,r,a,o,t,u,k,B,x,z,y}from'./chunk-CUOEZAVL.js';import'./chunk-5TAVYPOV.js';import {Router}from'express';function G(u$1,p$1){let d$1=Router();return d$1.get("/agents",(i$1,s)=>{try{e();let e$1=d(),n=i(),a=new Set(e$1.map(t=>t.id));for(let t of n)a.has(t.id)||e$1.push(t);let r=e$1.map(t=>({id:t.id,name:t.name,project:t.project,role:t.role,status:h(t)?"asleep":"awake",lastPoll:t.lastPoll,startedAt:t.startedAt,statusBlurb:t.statusBlurb}));s.json({agents:r});}catch(e){s.status(500).json({error:"Failed to list agents",detail:String(e)});}}),d$1.get("/agents/me",(i,s)=>{try{let e=f(u$1);s.json({identity:e||null});}catch(e){s.status(500).json({error:"Failed to get identity",detail:String(e)});}}),d$1.get("/peers",async(i,s)=>{try{let{loadPeers:e}=await import('./symphony-peers-X5NGWXFP.js'),a=e().map(r=>({id:r.id,displayName:r.displayName,address:r.address,connectedAt:r.connectedAt,lastSeen:r.lastSeen,revoked:r.revoked,agents:r.agents||[]}));s.json({peers:a});}catch(e){s.status(500).json({error:"Failed to list peers",detail:String(e)});}}),d$1.get("/threads",(i,s)=>{try{let e=i.query.status,n;(e==="active"||e==="resolved")&&(n=e);let r=q(n).map(t=>({id:t.id,topic:t.topic,status:t.status,participants:t.participants.map(o=>({id:o.id,name:o.name,type:o.type})),messageCount:t.messageCount,lastActivity:t.lastActivity,decision:t.decision}));s.json({threads:r});}catch(e){s.status(500).json({error:"Failed to list threads",detail:String(e)});}}),d$1.get("/threads/:threadId",(i,s$1)=>{try{let{threadId:e}=i.params,n=p(e);if(!n){s$1.status(404).json({error:`Thread not found: ${e}`});return}let a=s(e),r=new Set;for(let t of a)for(let o of t.symbols)r.add(o);s$1.json({thread:{id:n.id,topic:n.topic,status:n.status,participants:n.participants.map(t=>({id:t.id,name:t.name,type:t.type})),messageCount:n.messageCount,lastActivity:n.lastActivity,decision:n.decision},messages:a.map(t=>({id:t.id,sender:{id:t.sender.id,name:t.sender.name,type:t.sender.type},intent:t.intent,text:t.content.text,timestamp:t.timestamp,symbols:t.symbols,diff:t.content.diff,decision:t.content.decision,recipients:t.recipients?.map(o=>({id:o.id,name:o.name}))})),symbolsDiscussed:[...r]});}catch(e){s$1.status(500).json({error:"Failed to load thread",detail:String(e)});}}),d$1.post("/threads/:threadId/resolve",(i,s)=>{try{let{threadId:e}=i.params,{decision:n}=i.body;if(!r(e,n)){s.status(404).json({error:`Thread not found: ${e}`});return}p$1&&p$1({type:"symphony:thread_resolved",threadId:e,decision:n}),s.json({resolved:!0,threadId:e,decision:n});}catch(e){s.status(500).json({error:"Failed to resolve thread",detail:String(e)});}}),d$1.post("/messages",(i,s)=>{try{let{intent:e,text:n,threadRoot:a$1,recipients:r,symbols:t$1,diff:o$1,decision:f}=i.body;if(!e||!n){s.status(400).json({error:"intent and text are required"});return}let l={id:`human/${a(u$1)}`,name:"Human (Platform UI)",type:"human"},g=a$1,b=!1;if(!a$1){let q=n.length>60?n.slice(0,60)+"...":n;g=o(q,l).id,b=!0;}let x;if(r&&r.length>0){let q=d();x=r.map(y=>{let R=q.find(H=>H.id===y);return R?{id:R.id,name:R.name,type:"agent"}:{id:y,name:y,type:"agent"}});}let c=t({sender:l,recipients:x,intent:e,text:n,threadRoot:g,symbols:t$1,diff:o$1,decision:f}),N=u(c);p$1&&p$1({type:"symphony:message",message:{id:c.id,sender:{id:l.id,name:l.name,type:l.type},intent:c.intent,text:c.content.text,timestamp:c.timestamp,symbols:c.symbols,diff:c.content.diff,decision:c.content.decision},threadId:g}),s.json({sent:!0,messageId:c.id,threadId:g,threadCreated:b,deliveredTo:N});}catch(e){s.status(500).json({error:"Failed to send message",detail:String(e)});}}),d$1.get("/inbox",(i,s)=>{try{let e=a(u$1),n=k(e);s.json({agentId:e,messages:n.map(a=>({id:a.id,sender:{id:a.sender.id,name:a.sender.name,type:a.sender.type},intent:a.intent,text:a.content.text,timestamp:a.timestamp,threadRoot:a.threadRoot,symbols:a.symbols}))});}catch(e){s.status(500).json({error:"Failed to read inbox",detail:String(e)});}}),d$1.get("/file-requests",(i,s)=>{try{B();let e=i.query.status,n;(e==="pending"||e==="approved"||e==="denied"||e==="expired")&&(n=e);let r=x(n).map(t=>({requestId:t.request.requestId,filePath:t.request.filePath,reason:t.request.reason,requester:{id:t.request.requester.id,name:t.request.requester.name},urgency:t.request.urgency,snippet:t.request.snippet,status:t.status,createdAt:t.createdAt,resolvedAt:t.resolvedAt,denyReason:t.denyReason}));s.json({fileRequests:r});}catch(e){s.status(500).json({error:"Failed to list file requests",detail:String(e)});}}),d$1.post("/file-requests/:requestId/action",(i,s)=>{try{let{requestId:e}=i.params,{action:n,reason:a}=i.body;if(!n){s.status(400).json({error:"action is required"});return}if(n==="deny"){let o=z(e,a);s.json({success:o,requestId:e,action:"denied",reason:a});return}let r=n==="approve-redacted",t=y(e,u$1,r);if(!t.success){s.status(400).json({success:!1,requestId:e,error:t.error});return}s.json({success:!0,requestId:e,action:r?"approved-redacted":"approved",filePath:t.delivery?.filePath,size:t.delivery?.size});}catch(e){s.status(500).json({error:"Failed to handle file request",detail:String(e)});}}),d$1.get("/status",(i,s)=>{try{e();let e$1=d(),n=e$1.filter(f=>!h(f)).length,a$1=q("active"),r=a(u$1),t=k(r),o=x("pending");s.json({agentCount:e$1.length,awakeCount:n,asleepCount:e$1.length-n,activeThreadCount:a$1.length,unreadCount:t.length,pendingFileRequests:o.length});}catch(e){s.status(500).json({error:"Failed to get status",detail:String(e)});}}),d$1}export{G as createSymphonyRouter};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {b as b$1,i,h,f,a,c,d,q as q$1,k,e as e$1,o,t,u,g,p as p$1,m,n,s,r,x,v,A,w,y,z}from'./chunk-
|
|
2
|
+
import {b as b$1,i,h,f,a,c,d,q as q$1,k,e as e$1,o,t,u,g,p as p$1,m,n,s,r,x,v,A,w,y,z}from'./chunk-CUOEZAVL.js';import'./chunk-5TAVYPOV.js';import e from'chalk';import*as b from'path';import*as p from'fs';import*as q from'os';async function te(s){let o=process.cwd();if(s.remote){await Y(o,s.remote);return}let r=b$1(o);console.log(e.green(`\u2713 Joined as ${e.bold(r.id)}`));let i$1=i().filter(l=>l.id!==r.id);if(i$1.length>0){console.log(e.cyan(`
|
|
3
3
|
Found ${i$1.length} other session${i$1.length!==1?"s":""}:`));for(let l of i$1){let t=h(l)?e.yellow("asleep"):e.green("awake");console.log(` ${e.white(l.id)} \u2014 ${l.name} [${t}]`);}}else console.log(e.gray(`
|
|
4
4
|
No other sessions found. Open another terminal and run "paradigm symphony join".`));console.log(e.gray(`
|
|
5
|
-
Tip: Set up polling with: /loop 10s paradigm_symphony_poll`));}async function Y(s,o){let{SymphonyRelay:r}=await import('./symphony-relay-
|
|
5
|
+
Tip: Set up polling with: /loop 10s paradigm_symphony_poll`));}async function Y(s,o){let{SymphonyRelay:r}=await import('./symphony-relay-KBHN3ZMR.js'),n,i;if(o.includes("#")){let c=o.split("#");n=c[0],i=c[1];}else n=o;n.includes(":")||(n=`${n}:3939`);let l=f(s);l||(l=b$1(s));let t;if(i)t=i,console.log(e.cyan(`
|
|
6
6
|
Connecting to ${n} with embedded pairing code...`));else if(console.log(e.cyan(`
|
|
7
7
|
Connecting to ${n}...`)),console.log(e.white(" Enter the 6-digit pairing code shown on the host:")),t=await K(" Code: "),t=t.trim(),!/^\d{6}$/.test(t)){console.log(e.red(" Invalid code. Must be 6 digits."));return}let a=new r({mode:"client",peerId:l.id,events:{onPeerConnected:(c,g)=>{console.log(e.green(` \u2713 Connected to ${e.bold(g)} (${c})`));},onPeerDisconnected:c=>{console.log(e.yellow(` Peer ${c} disconnected. Reconnecting...`));},onMessageRelayed:(c,g,y)=>{console.log(e.gray(` \u2190 Message ${c.slice(0,8)} from ${g} \u2192 ${y}`));},onError:c=>{console.log(e.red(` Error: ${c.message}`));}}});try{await a.connectToServer(n,t),console.log(e.green(`
|
|
8
8
|
\u2713 Paired and connected!`)),console.log(e.gray(" Messages from remote agents will appear in your inbox.")),console.log(e.gray(` Press Ctrl+C to disconnect.
|
|
@@ -28,7 +28,7 @@ import {b as b$1,i,h,f,a,c,d,q as q$1,k,e as e$1,o,t,u,g,p as p$1,m,n,s,r,x,v,A,
|
|
|
28
28
|
`));for(let n of r){let i=new Date(n.timestamp).toLocaleString(void 0,{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"});console.log(` ${e.cyan(n.sender.name)} ${e.gray(`[${n.intent}]`)} ${e.gray(i)}`);let l=n.content.text.split(`
|
|
29
29
|
`);for(let t of l)console.log(` ${t}`);n.symbols.length>0&&console.log(` ${e.gray(`Symbols: ${n.symbols.join(", ")}`)}`),n.content.decision&&console.log(` ${e.green(`Decision: ${n.content.decision}`)}`),console.log();}}async function de(s,o){let r$1=p$1(s);if(!r$1){console.log(e.red(`Thread not found: ${s}`));return}r(s,o.decision)?(console.log(e.green(`\u2713 Thread resolved: ${r$1.topic}`)),o.decision&&console.log(e.gray(` Decision: ${o.decision}`)),console.log(e.gray(` Tip: Record this as lore with "paradigm lore record --title 'Thread: ${r$1.topic}'"`))):console.log(e.red("Failed to resolve thread."));}async function ye(s){e$1();let o=process.cwd(),r=f(o),n=d(),i=q$1("active"),l=x("pending"),t=r?k(r.id):[],{loadPeers:a}=await import('./symphony-peers-X5NGWXFP.js'),g=a().filter(d=>!d.revoked);if(s.json){console.log(JSON.stringify({identity:r?{id:r.id,project:r.project,role:r.role}:null,agents:n.map(d=>({id:d.id,status:h(d)?"asleep":"awake",statusBlurb:d.statusBlurb})),peers:g.map(d=>({id:d.id,address:d.address,agents:d.agents?.length??0,lastSeen:d.lastSeen})),activeThreads:i.length,unreadMessages:t.length,pendingFileRequests:l.length},null,2));return}console.log(e.cyan(`
|
|
30
30
|
Symphony Status
|
|
31
|
-
`)),console.log(r?` ${e.white("Identity:")} ${r.id}`:` ${e.yellow("Not joined.")} Run "paradigm symphony join" to join.`);let y=n.filter(d=>!h(d)).length;console.log(` ${e.white("Agents:")} ${n.length} joined (${y} awake)`);for(let d of n){let h$1=h(d)?e.yellow("asleep"):e.green("awake"),u=d.statusBlurb?e.gray(` \u2014 ${d.statusBlurb}`):"";console.log(` ${e.white(d.id)} [${h$1}]${u}`);}if(g.length>0){let d=g.reduce((h,u)=>h+(u.agents?.length??0),0);console.log(` ${e.white("Peers:")} ${g.length} connected (${d} remote agents)`);for(let h of g){let u=h.agents?.length??0;console.log(` ${e.white(h.id)} at ${h.address} (${u} agent${u!==1?"s":""})`);}}else console.log(` ${e.white("Peers:")} ${e.gray('none (run "paradigm symphony serve" to accept connections)')}`);console.log(` ${e.white("Threads:")} ${i.length} active`),console.log(` ${e.white("Unread:")} ${t.length} note${t.length!==1?"s":""}`),console.log(` ${e.white("File Requests:")} ${l.length} pending`),console.log();}async function pe(s){let o=parseInt(s.port||"3939",10),r=process.cwd(),{SymphonyRelay:n}=await import('./symphony-relay-
|
|
31
|
+
`)),console.log(r?` ${e.white("Identity:")} ${r.id}`:` ${e.yellow("Not joined.")} Run "paradigm symphony join" to join.`);let y=n.filter(d=>!h(d)).length;console.log(` ${e.white("Agents:")} ${n.length} joined (${y} awake)`);for(let d of n){let h$1=h(d)?e.yellow("asleep"):e.green("awake"),u=d.statusBlurb?e.gray(` \u2014 ${d.statusBlurb}`):"";console.log(` ${e.white(d.id)} [${h$1}]${u}`);}if(g.length>0){let d=g.reduce((h,u)=>h+(u.agents?.length??0),0);console.log(` ${e.white("Peers:")} ${g.length} connected (${d} remote agents)`);for(let h of g){let u=h.agents?.length??0;console.log(` ${e.white(h.id)} at ${h.address} (${u} agent${u!==1?"s":""})`);}}else console.log(` ${e.white("Peers:")} ${e.gray('none (run "paradigm symphony serve" to accept connections)')}`);console.log(` ${e.white("Threads:")} ${i.length} active`),console.log(` ${e.white("Unread:")} ${t.length} note${t.length!==1?"s":""}`),console.log(` ${e.white("File Requests:")} ${l.length} pending`),console.log();}async function pe(s){let o=parseInt(s.port||"3939",10),r=process.cwd(),{SymphonyRelay:n}=await import('./symphony-relay-KBHN3ZMR.js'),i=f(r);i||(i=b$1(r)),console.log(e.cyan(`
|
|
32
32
|
Starting Symphony relay server...
|
|
33
33
|
`));let l=new n({mode:"server",peerId:i.id,port:o,events:{onPeerConnected:(t,a)=>{console.log(e.green(` \u2713 Peer connected: ${e.bold(a)} (${t})`));let c=l.getRemoteAgents();c.length>0&&console.log(e.gray(` Remote agents: ${c.map(g=>g.id).join(", ")}`));},onPeerDisconnected:t=>{console.log(e.yellow(` Peer disconnected: ${t}`));},onPeerAuthFailed:(t,a)=>{console.log(e.red(` Auth failed from ${t}: ${a}`));},onMessageRelayed:(t,a,c)=>{console.log(e.gray(` \u2194 Relayed ${t.slice(0,8)} from ${a} to ${c}`));},onError:t=>{console.log(e.red(` Error: ${t.message}`));}}});try{let t=await l.startServer(),a=Q();if(console.log(e.green(` \u2713 Symphony relay listening on port ${o}`)),console.log(),console.log(e.white(" Pairing Code:")),console.log(),console.log(e.bold.cyan(` ${t.code.slice(0,3)} ${t.code.slice(3)}`)),console.log(),console.log(e.gray(" Share this code with the person connecting.")),console.log(e.gray(` Code rotates every 5 minutes.
|
|
34
34
|
`)),console.log(e.white(" LAN connect:")),console.log(e.gray(` paradigm symphony join --remote ${a}:${o}`)),s.public){let g=`${a}:${o}#${t.code}`;console.log(),console.log(e.white(" Internet connect (connection string):")),console.log(e.cyan(` paradigm symphony join --remote ${g}`)),console.log(e.gray(" (Requires port 3939 reachable: port forward, VPN, or SSH tunnel)"));}console.log(e.gray(`
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
export{a as SCORE_DIR,w as acknowledgeMessages,f as appendJsonlLine,s as appendToInbox,u as appendToOutbox,L as approveFileRequest,F as buildMessage,k as cleanStaleAgents,I as createFileRequest,z as createThread,M as denyFileRequest,p as discoverClaudeCodeSessions,c as ensureMailDirs,b as ensureScoreDirs,P as expireOldRequests,y as garbageCollect,d as getAgentDir,l as getMyIdentity,E as getThreadMessages,o as isAgentAsleep,O as isPathAutoApproved,N as isPathDenied,j as listAgents,K as listFileRequests,B as listThreads,J as loadFileRequest,A as loadThread,H as loadTrustConfig,m as markAgentPollTime,q as peekInbox,x as readAck,t as readInbox,e as readJsonlFile,v as readOutbox,r as recordAckSize,h as registerAgent,g as resolveAgentIdentity,D as resolveThread,G as routeMessage,i as unregisterAgent,n as updateAgentStatus,C as updateThread}from'./chunk-
|
|
2
|
+
export{a as SCORE_DIR,w as acknowledgeMessages,f as appendJsonlLine,s as appendToInbox,u as appendToOutbox,L as approveFileRequest,F as buildMessage,k as cleanStaleAgents,I as createFileRequest,z as createThread,M as denyFileRequest,p as discoverClaudeCodeSessions,c as ensureMailDirs,b as ensureScoreDirs,P as expireOldRequests,y as garbageCollect,d as getAgentDir,l as getMyIdentity,E as getThreadMessages,o as isAgentAsleep,O as isPathAutoApproved,N as isPathDenied,j as listAgents,K as listFileRequests,B as listThreads,J as loadFileRequest,A as loadThread,H as loadTrustConfig,m as markAgentPollTime,q as peekInbox,x as readAck,t as readInbox,e as readJsonlFile,v as readOutbox,r as recordAckSize,h as registerAgent,g as resolveAgentIdentity,D as resolveThread,G as routeMessage,i as unregisterAgent,n as updateAgentStatus,C as updateThread}from'./chunk-VZLGBGU3.js';import'./chunk-5TAVYPOV.js';
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {k as k$1,l,n,f as f$1,m as m$1,c as c$1,j,i}from'./chunk-J32OPJEX.js';import {d,j as j$1,l as l$1,h}from'./chunk-
|
|
2
|
+
import {k as k$1,l,n,f as f$1,m as m$1,c as c$1,j,i}from'./chunk-J32OPJEX.js';import {d,j as j$1,l as l$1,h}from'./chunk-CUOEZAVL.js';import'./chunk-5TAVYPOV.js';import*as v from'fs';import*as m from'path';import*as k from'os';import*as f from'crypto';import {WebSocketServer,WebSocket}from'ws';var X=m.join(k.homedir(),".paradigm","score"),O=2e3,x=3e4,D=1e4,N=3,L=6e4,E=1e3,H=3e4;function c(l,e){l.readyState===WebSocket.OPEN&&l.send(JSON.stringify(e));}function M(l){try{let e=typeof l=="string"?l:String(l);return JSON.parse(e)}catch{return null}}var C=class l$2{wss=null;wsClient=null;mode;pairingState=null;connectedPeers=new Map;seenMessageIds=new Set;outboxWatchInterval=null;keepaliveInterval=null;reconnectTimer=null;reconnectDelay=E;outboxPositions=new Map;events;myPeerId;port;stopped=false;failedAuthAttempts=new Map;pongTimers=new Map;serverAddress=null;serverCode=null;static MAX_SEEN_IDS=1e4;constructor(e){this.mode=e.mode,this.myPeerId=e.peerId,this.port=e.port??3939,this.events=e.events??{};}async startServer(){if(this.mode!=="server")throw new Error('startServer() requires mode "server"');return this.pairingState=k$1(),this.wss=new WebSocketServer({port:this.port}),this.wss.on("connection",(e,t)=>{let n=t.socket.remoteAddress??"unknown";if(this.isRateLimited(n)){c(e,{type:"auth_fail",reason:"Too many failed attempts \u2014 try again later"}),e.close();return}let i=f.randomBytes(32).toString("hex");c(e,{type:"hello",version:"1.0",peerId:this.myPeerId,challenge:i});let s=false;e.on("message",r=>{let o=M(r);if(o){if(!s){this.handleServerAuth(e,o,i,n).then(a=>{a&&(s=true,this.registerPeerConnection(a,e));}).catch(a=>{this.events.onError?.(a instanceof Error?a:new Error(String(a)));});return}this.handleAuthenticatedFrame(e,o);}}),e.on("close",()=>{s&&this.handlePeerDisconnect(e);}),e.on("error",r=>{this.events.onError?.(r);});}),this.wss.on("error",e=>{this.events.onError?.(e);}),await new Promise((e,t)=>{this.wss.on("listening",e),this.wss.on("error",t);}),this.startOutboxWatcher(),this.startKeepalive(),this.pairingState}async handleServerAuth(e,t,n$1,i){if(t.type!=="auth")return c(e,{type:"auth_fail",reason:"Expected auth frame"}),e.close(),null;if(!this.pairingState||!l(this.pairingState,t.code)){this.recordFailedAuth(i);let a="Invalid or expired pairing code";return c(e,{type:"auth_fail",reason:a}),this.events.onPeerAuthFailed?.(i,a),e.close(),null}let s=this.pairingState.codeHash;if(!n(n$1,s,t.proof)){this.recordFailedAuth(i);let a="HMAC proof verification failed";return c(e,{type:"auth_fail",reason:a}),this.events.onPeerAuthFailed?.(i,a),e.close(),null}let r=this.getLocalAgentSummaries(),o=this.myPeerId;return c(e,{type:"auth_ok",peerId:this.myPeerId,displayName:o,agents:r}),f$1({id:t.peerId,displayName:t.peerId,address:i,sharedSecret:this.pairingState.sharedSecret,connectedAt:new Date().toISOString(),lastSeen:new Date().toISOString(),revoked:false,agents:[]}),t.peerId}async connectToServer(e,t){if(this.mode!=="client")throw new Error('connectToServer() requires mode "client"');this.serverAddress=e,this.serverCode=t,await this.attemptConnection(e,t);}attemptConnection(e,t){return new Promise((n,i)=>{if(this.stopped){i(new Error("Relay has been stopped"));return}let s=e.includes("://")?e:`ws://${e}`,r=new WebSocket(s),o=false;r.on("open",()=>{this.wsClient=r;}),r.on("message",a=>{let d=M(a);if(d)switch(d.type){case "hello":{let R=f.createHash("sha256").update(t).digest("hex"),F=m$1(d.challenge,R);c(r,{type:"auth",peerId:this.myPeerId,code:t,proof:F});break}case "auth_ok":{f$1({id:d.peerId,displayName:d.displayName,address:e,sharedSecret:t,connectedAt:new Date().toISOString(),lastSeen:new Date().toISOString(),revoked:false,agents:d.agents}),c(r,{type:"agents_sync",agents:this.getLocalAgentSummaries()}),this.registerPeerConnection(d.peerId,r),this.startOutboxWatcher(),this.startKeepalive(),this.reconnectDelay=E,o||(o=true,n());break}case "auth_fail":{o||(o=true,i(new Error(`Auth failed: ${d.reason}`))),r.close();break}default:this.handleAuthenticatedFrame(r,d);break}}),r.on("close",()=>{this.handlePeerDisconnect(r),o?this.stopped||this.scheduleReconnect():(o=true,i(new Error("Connection closed before auth completed")));}),r.on("error",a=>{this.events.onError?.(a),o||(o=true,i(a));});})}handleAuthenticatedFrame(e,t){switch(t.type){case "message":this.handleIncomingMessage(e,t.message,t.origin);break;case "message_ack":break;case "nomination_forward":this.handleNominationForward(e,t.nomination,t.origin);break;case "agents_sync":this.handleAgentsSync(e,t.agents);break;case "agent_joined":{let n=this.peerIdForSocket(e);if(n){let s=c$1().find(r=>r.id===n);if(s){let r=[...s.agents||[],t.agent];j(n,r);}}break}case "agent_left":{let n=this.peerIdForSocket(e);if(n){let s=c$1().find(r=>r.id===n);if(s){let r=(s.agents||[]).filter(o=>o.id!==t.agentId);j(n,r);}}break}case "peer_leaving":this.handlePeerDisconnect(e),e.close();break;case "ping":c(e,{type:"pong"});break;case "pong":this.handlePong(e);break;}}handleIncomingMessage(e,t,n){if(this.seenMessageIds.has(t.id)){c(e,{type:"message_ack",messageId:t.id});return}this.addToSeenIds(t.id);let i=d();if(t.recipients&&t.recipients.length>0)for(let s of t.recipients){let r=i.find(o=>o.id===s.id);r&&(j$1(r.id,t),this.events.onMessageRelayed?.(t.id,n,r.id));}else for(let s of i)j$1(s.id,t),this.events.onMessageRelayed?.(t.id,n,s.id);if(this.mode==="server"){let s=this.peerIdForSocket(e);for(let[r,o]of this.connectedPeers)r!==s&&r!==n&&c(o,{type:"message",message:t,origin:n});}c(e,{type:"message_ack",messageId:t.id});}handleNominationForward(e,t,n){if(!t?.id)return;let i={...t,remote_origin:n,forwarded_at:new Date().toISOString()};try{let s=m.join(k.homedir(),".paradigm","events");v.mkdirSync(s,{recursive:!0});let r=m.join(s,"nominations.jsonl");v.appendFileSync(r,JSON.stringify(i)+`
|
|
3
3
|
`,"utf8");}catch{}if(this.mode==="server")for(let[s,r]of this.connectedPeers)r!==e&&r.readyState===WebSocket.OPEN&&c(r,{type:"nomination_forward",nomination:i,origin:n});c(e,{type:"nomination_ack",nominationId:t.id});}handleAgentsSync(e,t){let n=this.peerIdForSocket(e);n&&(j(n,t),i(n));}startOutboxWatcher(){this.outboxWatchInterval||(this.outboxWatchInterval=setInterval(()=>{if(this.connectedPeers.size!==0)try{let e=d();for(let t of e){let n=l$1(t.id),i=this.outboxPositions.get(t.id)??0;if(n.length<=i)continue;let s=n.slice(i);for(let r of s){if(this.seenMessageIds.has(r.id))continue;this.addToSeenIds(r.id);let o={type:"message",message:r,origin:this.myPeerId};for(let[a,d]of this.connectedPeers)c(d,o);}this.outboxPositions.set(t.id,n.length);}}catch(e){this.events.onError?.(e instanceof Error?e:new Error(String(e)));}},O));}stopOutboxWatcher(){this.outboxWatchInterval&&(clearInterval(this.outboxWatchInterval),this.outboxWatchInterval=null);}startKeepalive(){this.keepaliveInterval||(this.keepaliveInterval=setInterval(()=>{for(let[e,t]of this.connectedPeers){c(t,{type:"ping"});let n=setTimeout(()=>{this.handlePeerDisconnect(t),t.terminate();},D);this.pongTimers.set(e,n);}},x));}stopKeepalive(){this.keepaliveInterval&&(clearInterval(this.keepaliveInterval),this.keepaliveInterval=null);for(let e of this.pongTimers.values())clearTimeout(e);this.pongTimers.clear();}handlePong(e){let t=this.peerIdForSocket(e);if(t){let n=this.pongTimers.get(t);n&&(clearTimeout(n),this.pongTimers.delete(t)),i(t);}}registerPeerConnection(e,t){let n=this.connectedPeers.get(e);n&&n!==t&&n.close(),this.connectedPeers.set(e,t),i(e),this.events.onPeerConnected?.(e,e);}handlePeerDisconnect(e){let t=this.peerIdForSocket(e);if(!t)return;this.connectedPeers.delete(t);let n=this.pongTimers.get(t);n&&(clearTimeout(n),this.pongTimers.delete(t)),this.events.onPeerDisconnected?.(t);}peerIdForSocket(e){for(let[t,n]of this.connectedPeers)if(n===e)return t;return null}scheduleReconnect(){if(this.stopped||this.mode!=="client"||!this.serverAddress||!this.serverCode)return;this.stopOutboxWatcher(),this.stopKeepalive(),this.wsClient=null;let e=this.reconnectDelay;this.reconnectDelay=Math.min(this.reconnectDelay*2,H),this.reconnectTimer=setTimeout(()=>{this.stopped||this.attemptConnection(this.serverAddress,this.serverCode).catch(t=>{this.events.onError?.(t instanceof Error?t:new Error(String(t)));});},e);}isRateLimited(e){let t=this.failedAuthAttempts.get(e);return t?Date.now()<t.cooldownUntil?true:t.count>=N?(t.cooldownUntil=Date.now()+L,true):false:false}recordFailedAuth(e){let t=this.failedAuthAttempts.get(e);t?t.count++:this.failedAuthAttempts.set(e,{count:1,cooldownUntil:0});}addToSeenIds(e){if(this.seenMessageIds.add(e),this.seenMessageIds.size>l$2.MAX_SEEN_IDS){let t=Array.from(this.seenMessageIds),n=Math.floor(t.length/2);this.seenMessageIds=new Set(t.slice(n));}}getLocalAgentSummaries(){return d().map(e=>({id:e.id,project:e.project,role:e.role,status:h(e)?"asleep":"awake"}))}stop(){this.stopped=true;for(let[e,t]of this.connectedPeers)c(t,{type:"peer_leaving"}),t.close();this.connectedPeers.clear(),this.wsClient&&(this.wsClient.close(),this.wsClient=null),this.stopOutboxWatcher(),this.stopKeepalive(),this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.wss&&(this.wss.close(),this.wss=null);}getConnectedPeers(){return Array.from(this.connectedPeers.keys())}getRemoteAgents(){let e=[],t=c$1();for(let n of this.connectedPeers.keys()){let i=t.find(s=>s.id===n);if(i?.agents)for(let s of i.agents)e.push({...s,peerId:n});}return e}rotatePairingCode(){if(this.mode!=="server")throw new Error('rotatePairingCode() requires mode "server"');return this.pairingState=k$1(),this.pairingState}};export{X as SCORE_DIR,C as SymphonyRelay};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import'./chunk-5TAVYPOV.js';import {Router}from'express';import*as n from'fs';import*as o from'path';function m(p){let i=Router(),u=o.join(__dirname,"..","..","university-content");return i.get("/courses",(a,e)=>{try{let s=o.join(u,"courses");if(!n.existsSync(s))return e.json({courses:[]});let l=n.readdirSync(s).filter(r=>r.endsWith(".json")).map(r=>{let t=JSON.parse(n.readFileSync(o.join(s,r),"utf-8"));return {id:t.id,title:t.title,description:t.description,lessonCount:t.lessons?.length||0,quizCount:t.quizzes?.length||0,lessons:(t.lessons||[]).map(d=>({id:d.id,title:d.title}))}});return l.sort((r,t)=>r.id.localeCompare(t.id)),e.json({courses:l})}catch(s){e.status(500).json({error:"Failed to list courses",detail:String(s)});}}),i.get("/courses/:id",(a,e)=>{try{let s=o.join(u,"courses",`${a.params.id}.json`);if(!n.existsSync(s))return e.status(404).json({error:`Course '${a.params.id}' not found`});let c=JSON.parse(n.readFileSync(s,"utf-8"));return e.json(c)}catch(s){e.status(500).json({error:"Failed to load course",detail:String(s)});}}),i.get("/plsat",(a,e)=>{try{let s=o.join(u,"plsat");if(!n.existsSync(s))return e.json({versions:[]});let l=n.readdirSync(s).filter(r=>r.endsWith(".json")).map(r=>{let t=JSON.parse(n.readFileSync(o.join(s,r),"utf-8"));return {version:t.version||r.replace(".json",""),frameworkVersion:t.frameworkVersion,questionCount:t.questions?.length||0,timeLimit:t.timeLimit,passThreshold:t.passThreshold}});return e.json({versions:l})}catch(s){e.status(500).json({error:"Failed to list PLSAT versions",detail:String(s)});}}),i.get("/diplomas",(a,e)=>{try{let s=o.join(p,".paradigm","university","diplomas");if(!n.existsSync(s))return e.json({diplomas:[]});let l=n.readdirSync(s).filter(r=>r.endsWith(".json")||r.endsWith(".yaml")).map(r=>{let t=n.readFileSync(o.join(s,r),"utf-8");return r.endsWith(".json")?JSON.parse(t):t}).filter(Boolean);return e.json({diplomas:l})}catch(s){e.status(500).json({error:"Failed to load diplomas",detail:String(s)});}}),i.get("/reference",(a,e)=>{try{let s=o.join(u,"reference.json");if(!n.existsSync(s))return e.json({});let c=JSON.parse(n.readFileSync(s,"utf-8"));return e.json(c)}catch(s){e.status(500).json({error:"Failed to load reference",detail:String(s)});}}),i}export{m as createUniversityRouter};
|
package/package.json
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as j,r as u,e as N,j as n,S as b}from"./index-BaOmyn11.js";let l=null,m=null;const y=j((e,s)=>({events:[],nominations:[],debates:[],loading:!1,eventFilter:{},fetchEvents:async t=>{l==null||l.abort(),l=new AbortController;const{signal:a}=l;e({loading:!0});try{const c=t||s().eventFilter,o=new URLSearchParams;c.type&&o.set("type",c.type),c.since&&o.set("since",c.since);const r=await fetch(`/api/ambient/events?${o}`,{signal:a});if(!r.ok)throw new Error(`HTTP ${r.status}`);const d=await r.json();e({events:d.events||[],loading:!1})}catch(c){if(c instanceof Error&&c.name==="AbortError")return;e({loading:!1})}},fetchNominations:async()=>{m==null||m.abort(),m=new AbortController;const{signal:t}=m;try{const a=await fetch("/api/ambient/nominations?pending_only=true&include_debates=true",{signal:t});if(!a.ok)throw new Error(`HTTP ${a.status}`);const c=await a.json();e({nominations:c.nominations||[],debates:c.debates||[]})}catch(a){if(a instanceof Error&&a.name==="AbortError")return}},engageNomination:async(t,a)=>{try{const c=await fetch(`/api/ambient/nominations/${encodeURIComponent(t)}/engage`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({response:a})});if(!c.ok)throw new Error(`HTTP ${c.status}`);e(o=>({nominations:o.nominations.map(r=>r.id===t?{...r,engaged:!0,response:a}:r)}))}catch{s().fetchNominations()}},setEventFilter:t=>{e({eventFilter:t}),s().fetchEvents(t)},connectSSE:()=>{const t=new EventSource("/api/ambient/stream");return t.onmessage=a=>{try{const c=JSON.parse(a.data);e(o=>({events:[c,...o.events].slice(0,200)}))}catch{}},t.onerror=()=>{},()=>t.close()}})),p={critical:0,high:1,medium:2,low:3};function w(e){try{const s=new Date(e),a=Date.now()-s.getTime();return a<6e4?"just now":a<36e5?`${Math.floor(a/6e4)}m ago`:a<864e5?`${Math.floor(a/36e5)}h ago`:a<6048e5?`${Math.floor(a/864e5)}d ago`:s.toLocaleDateString()}catch{return""}}function E(e){return["file_change","tool_call","sentinel","agent"].includes(e)?`ambient__type-badge--${e}`:"ambient__type-badge--default"}function S(e){return["critical","high","medium","low"].includes(e)?`ambient__urgency-badge--${e}`:"ambient__urgency-badge--low"}function A(e){const s=Date.now()-36e5;return e.filter(t=>{try{return new Date(t.timestamp).getTime()>s}catch{return!1}}).length}function T(e){const s=new Set(e.map(t=>t.type));return Array.from(s).sort()}function D({event:e}){return n.jsxs("div",{className:"ambient__event-item",children:[n.jsx("span",{className:`ambient__type-badge ${E(e.type)}`,children:e.type.replace(/_/g," ")}),n.jsxs("div",{className:"ambient__event-body",children:[n.jsxs("div",{className:"ambient__event-top-row",children:[e.context&&n.jsx("span",{className:"ambient__event-context",children:e.context}),!e.context&&e.source&&n.jsx("span",{className:"ambient__event-context",children:e.source})]}),e.path&&n.jsx("span",{className:"ambient__event-path",children:e.path}),e.symbols&&e.symbols.length>0&&n.jsx("div",{className:"ambient__event-symbols",children:e.symbols.map(s=>n.jsx("span",{className:"ambient__event-symbol",children:s},s))})]}),n.jsx("span",{className:"ambient__event-time",children:w(e.timestamp)})]})}function $({nomination:e,onEngage:s}){const t=e.engaged;return n.jsxs("div",{className:"ambient__nom-item",children:[n.jsxs("div",{className:"ambient__nom-header",children:[n.jsx("span",{className:`ambient__urgency-badge ${S(e.urgency)}`,children:e.urgency}),n.jsx("span",{className:"ambient__nom-agent",children:e.agent}),n.jsx("span",{className:"ambient__nom-type",children:e.type})]}),n.jsx("div",{className:"ambient__nom-brief",children:e.brief}),!t&&n.jsxs("div",{className:"ambient__nom-actions",children:[n.jsx("button",{className:"ambient__nom-btn ambient__nom-btn--accept",onClick:()=>s(e.id,"accepted"),children:"Accept"}),n.jsx("button",{className:"ambient__nom-btn ambient__nom-btn--dismiss",onClick:()=>s(e.id,"dismissed"),children:"Dismiss"})]}),t&&n.jsx("div",{style:{fontSize:11,color:"var(--p-text-muted)",fontStyle:"italic"},children:e.response==="accepted"?"Accepted":e.response==="dismissed"?"Dismissed":"Deferred"})]})}function k({debate:e}){return n.jsxs("div",{className:"ambient__debate-item",children:[n.jsx("div",{className:"ambient__debate-topic",children:e.topic}),n.jsxs("div",{className:"ambient__debate-meta",children:[e.type," · ",e.nominations.length," nomination",e.nominations.length!==1?"s":""]})]})}function R(){const{events:e,nominations:s,debates:t,loading:a,eventFilter:c,fetchEvents:o,fetchNominations:r,engageNomination:d,setEventFilter:g,connectSSE:v}=y(),h=u.useRef(null);u.useEffect(()=>{o(),r();const i=v();return h.current=setInterval(()=>{N.getState().activeSection==="ambient"&&r()},1e4),()=>{i(),h.current&&clearInterval(h.current)}},[]);const _=s.filter(i=>!i.engaged).sort((i,x)=>(p[i.urgency]??99)-(p[x.urgency]??99)),f=T(e);return a&&e.length===0?n.jsxs("div",{className:"ambient",children:[n.jsx("h1",{className:"ambient__title",children:"Ambient"}),n.jsx("p",{style:{color:"var(--p-text-muted)"},children:"Loading..."})]}):n.jsxs("div",{className:"ambient",children:[n.jsx("h1",{className:"ambient__title",children:"Ambient"}),n.jsxs("div",{className:"ambient__cards",children:[n.jsx(b,{value:A(e),label:"Events (last hour)",accent:"var(--p-accent-blue)"}),n.jsx(b,{value:_.length,label:"Pending Nominations",accent:"var(--p-accent-orange)"}),n.jsx(b,{value:t.length,label:"Active Debates",accent:"var(--p-accent-purple)"})]}),n.jsxs("div",{className:"ambient__grid",children:[n.jsxs("div",{children:[n.jsxs("div",{className:"ambient__section-header",children:[n.jsx("span",{className:"ambient__section-header-title",children:"Event Stream"}),n.jsxs("select",{className:"ambient__filter-select",value:c.type||"",onChange:i=>g({...c,type:i.target.value||void 0}),children:[n.jsx("option",{value:"",children:"All types"}),f.map(i=>n.jsx("option",{value:i,children:i.replace(/_/g," ")},i))]})]}),n.jsxs("div",{className:"ambient__events",children:[e.length===0&&n.jsx("div",{className:"ambient__events-empty",children:"No events recorded yet"}),e.map(i=>n.jsx(D,{event:i},i.id))]})]}),n.jsxs("div",{children:[n.jsx("div",{className:"ambient__section-title",children:"Nominations"}),n.jsxs("div",{className:"ambient__nominations",children:[_.length===0&&n.jsx("div",{className:"ambient__nominations-empty",children:"No pending nominations"}),_.map(i=>n.jsx($,{nomination:i,onEngage:d},i.id))]}),t.length>0&&n.jsxs("div",{className:"ambient__debates",children:[n.jsx("div",{className:"ambient__section-title",children:"Debates"}),t.map(i=>n.jsx(k,{debate:i},i.id))]})]})]})]})}export{R as default};
|