@a-company/paradigm 5.23.0 → 5.24.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/{ambient-WEPHBAJD.js → ambient-HYZR42NX.js} +1 -1
- package/dist/chunk-73R63P7K.js +2 -0
- package/dist/{compliance-TSXLXADI.js → compliance-NLG7KB73.js} +2 -2
- package/dist/{docs-RXPN6CK7.js → docs-UIYXJ3O3.js} +1 -1
- package/dist/{habits-LX5IWCZM.js → habits-GICVMTJL.js} +1 -1
- package/dist/index.js +1 -1
- package/dist/mcp.js +22 -22
- package/dist/platform-server-FXYBBH6E.js +25 -0
- package/dist/{serve-JE6UF5P2.js → serve-5W6KOA4R.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/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
|
@@ -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-3QMBGCZY.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-FXYBBH6E.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(`
|
|
@@ -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};
|