@theihtisham/agent-shadow-brain 7.1.0 → 7.1.4
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/CHANGELOG.md +42 -0
- package/README.md +125 -450
- package/dist/activity-cli.d.ts +3 -0
- package/dist/activity-cli.d.ts.map +1 -0
- package/dist/activity-cli.js +78 -0
- package/dist/activity-cli.js.map +1 -0
- package/dist/adapters/index.d.ts +2 -1
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +3 -2
- package/dist/adapters/index.js.map +1 -1
- package/dist/brain/activity-journal.d.ts +82 -0
- package/dist/brain/activity-journal.d.ts.map +1 -0
- package/dist/brain/activity-journal.js +315 -0
- package/dist/brain/activity-journal.js.map +1 -0
- package/dist/brain/activity-reporting.d.ts +14 -0
- package/dist/brain/activity-reporting.d.ts.map +1 -0
- package/dist/brain/activity-reporting.js +17 -0
- package/dist/brain/activity-reporting.js.map +1 -0
- package/dist/brain/auto-update.js +1 -1
- package/dist/brain/brain-portability.js +1 -1
- package/dist/brain/client-config.d.ts +19 -0
- package/dist/brain/client-config.d.ts.map +1 -0
- package/dist/brain/client-config.js +40 -0
- package/dist/brain/client-config.js.map +1 -0
- package/dist/brain/client-integrations.d.ts +63 -0
- package/dist/brain/client-integrations.d.ts.map +1 -0
- package/dist/brain/client-integrations.js +79 -0
- package/dist/brain/client-integrations.js.map +1 -0
- package/dist/brain/context-assembly.d.ts +84 -0
- package/dist/brain/context-assembly.d.ts.map +1 -0
- package/dist/brain/context-assembly.js +529 -0
- package/dist/brain/context-assembly.js.map +1 -0
- package/dist/brain/context-request.d.ts +4 -0
- package/dist/brain/context-request.d.ts.map +1 -0
- package/dist/brain/context-request.js +22 -0
- package/dist/brain/context-request.js.map +1 -0
- package/dist/brain/context-retrieval.d.ts +88 -0
- package/dist/brain/context-retrieval.d.ts.map +1 -0
- package/dist/brain/context-retrieval.js +300 -0
- package/dist/brain/context-retrieval.js.map +1 -0
- package/dist/brain/feature-settings.d.ts +58 -0
- package/dist/brain/feature-settings.d.ts.map +1 -0
- package/dist/brain/feature-settings.js +242 -0
- package/dist/brain/feature-settings.js.map +1 -0
- package/dist/brain/file-identity.d.ts +4 -0
- package/dist/brain/file-identity.d.ts.map +1 -0
- package/dist/brain/file-identity.js +27 -0
- package/dist/brain/file-identity.js.map +1 -0
- package/dist/brain/global-brain.d.ts +18 -1
- package/dist/brain/global-brain.d.ts.map +1 -1
- package/dist/brain/global-brain.js +77 -10
- package/dist/brain/global-brain.js.map +1 -1
- package/dist/brain/mcp-server.d.ts +30 -1
- package/dist/brain/mcp-server.d.ts.map +1 -1
- package/dist/brain/mcp-server.js +378 -28
- package/dist/brain/mcp-server.js.map +1 -1
- package/dist/brain/mcp-stdio.d.ts +12 -0
- package/dist/brain/mcp-stdio.d.ts.map +1 -0
- package/dist/brain/mcp-stdio.js +140 -0
- package/dist/brain/mcp-stdio.js.map +1 -0
- package/dist/brain/memory-annotations.d.ts +97 -0
- package/dist/brain/memory-annotations.d.ts.map +1 -0
- package/dist/brain/memory-annotations.js +389 -0
- package/dist/brain/memory-annotations.js.map +1 -0
- package/dist/brain/memory-graph.d.ts.map +1 -1
- package/dist/brain/memory-graph.js +12 -23
- package/dist/brain/memory-graph.js.map +1 -1
- package/dist/brain/memory-inspection.d.ts +72 -0
- package/dist/brain/memory-inspection.d.ts.map +1 -0
- package/dist/brain/memory-inspection.js +131 -0
- package/dist/brain/memory-inspection.js.map +1 -0
- package/dist/brain/memory-mcp-content.d.ts +44 -0
- package/dist/brain/memory-mcp-content.d.ts.map +1 -0
- package/dist/brain/memory-mcp-content.js +91 -0
- package/dist/brain/memory-mcp-content.js.map +1 -0
- package/dist/brain/memory-sources.d.ts +8 -0
- package/dist/brain/memory-sources.d.ts.map +1 -0
- package/dist/brain/memory-sources.js +27 -0
- package/dist/brain/memory-sources.js.map +1 -0
- package/dist/brain/orchestrator.js +1 -1
- package/dist/brain/project-feedback.d.ts +63 -0
- package/dist/brain/project-feedback.d.ts.map +1 -0
- package/dist/brain/project-feedback.js +289 -0
- package/dist/brain/project-feedback.js.map +1 -0
- package/dist/brain/project-hub-contract.d.ts +326 -0
- package/dist/brain/project-hub-contract.d.ts.map +1 -0
- package/dist/brain/project-hub-contract.js +56 -0
- package/dist/brain/project-hub-contract.js.map +1 -0
- package/dist/brain/project-hub-mcp.d.ts +168 -0
- package/dist/brain/project-hub-mcp.d.ts.map +1 -0
- package/dist/brain/project-hub-mcp.js +41 -0
- package/dist/brain/project-hub-mcp.js.map +1 -0
- package/dist/brain/project-hub-pdf-worker.d.ts +13 -0
- package/dist/brain/project-hub-pdf-worker.d.ts.map +1 -0
- package/dist/brain/project-hub-pdf-worker.js +84 -0
- package/dist/brain/project-hub-pdf-worker.js.map +1 -0
- package/dist/brain/project-hub-store.d.ts +38 -0
- package/dist/brain/project-hub-store.d.ts.map +1 -0
- package/dist/brain/project-hub-store.js +189 -0
- package/dist/brain/project-hub-store.js.map +1 -0
- package/dist/brain/project-hub.d.ts +127 -0
- package/dist/brain/project-hub.d.ts.map +1 -0
- package/dist/brain/project-hub.js +381 -0
- package/dist/brain/project-hub.js.map +1 -0
- package/dist/brain/project-kit-inspection.d.ts +28 -0
- package/dist/brain/project-kit-inspection.d.ts.map +1 -0
- package/dist/brain/project-kit-inspection.js +200 -0
- package/dist/brain/project-kit-inspection.js.map +1 -0
- package/dist/brain/project-kit-paths.d.ts +13 -0
- package/dist/brain/project-kit-paths.d.ts.map +1 -0
- package/dist/brain/project-kit-paths.js +141 -0
- package/dist/brain/project-kit-paths.js.map +1 -0
- package/dist/brain/project-kit.d.ts +41 -0
- package/dist/brain/project-kit.d.ts.map +1 -0
- package/dist/brain/project-kit.js +255 -0
- package/dist/brain/project-kit.js.map +1 -0
- package/dist/brain/project-memory.d.ts +38 -0
- package/dist/brain/project-memory.d.ts.map +1 -0
- package/dist/brain/project-memory.js +76 -0
- package/dist/brain/project-memory.js.map +1 -0
- package/dist/brain/subconscious.d.ts +21 -24
- package/dist/brain/subconscious.d.ts.map +1 -1
- package/dist/brain/subconscious.js +82 -218
- package/dist/brain/subconscious.js.map +1 -1
- package/dist/brain/workflow-skills.d.ts +5 -5
- package/dist/brain/workflow-skills.d.ts.map +1 -1
- package/dist/brain/workflow-skills.js +3 -2
- package/dist/brain/workflow-skills.js.map +1 -1
- package/dist/cli.js +40 -4
- package/dist/cli.js.map +1 -1
- package/dist/context-cli.d.ts +3 -0
- package/dist/context-cli.d.ts.map +1 -0
- package/dist/context-cli.js +90 -0
- package/dist/context-cli.js.map +1 -0
- package/dist/curation-cli.d.ts +4 -0
- package/dist/curation-cli.d.ts.map +1 -0
- package/dist/curation-cli.js +118 -0
- package/dist/curation-cli.js.map +1 -0
- package/dist/dashboard/brain-hub-actions.d.ts +2 -0
- package/dist/dashboard/brain-hub-actions.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-actions.js +137 -0
- package/dist/dashboard/brain-hub-actions.js.map +1 -0
- package/dist/dashboard/brain-hub-client.d.ts +2 -0
- package/dist/dashboard/brain-hub-client.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-client.js +335 -0
- package/dist/dashboard/brain-hub-client.js.map +1 -0
- package/dist/dashboard/brain-hub-graph.d.ts +2 -0
- package/dist/dashboard/brain-hub-graph.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-graph.js +176 -0
- package/dist/dashboard/brain-hub-graph.js.map +1 -0
- package/dist/dashboard/brain-hub-html.d.ts +2 -0
- package/dist/dashboard/brain-hub-html.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-html.js +30 -0
- package/dist/dashboard/brain-hub-html.js.map +1 -0
- package/dist/dashboard/brain-hub-project-views.d.ts +2 -0
- package/dist/dashboard/brain-hub-project-views.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-project-views.js +79 -0
- package/dist/dashboard/brain-hub-project-views.js.map +1 -0
- package/dist/dashboard/brain-hub-views.d.ts +2 -0
- package/dist/dashboard/brain-hub-views.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-views.js +150 -0
- package/dist/dashboard/brain-hub-views.js.map +1 -0
- package/dist/dashboard/demo-workspace.d.ts +11 -0
- package/dist/dashboard/demo-workspace.d.ts.map +1 -0
- package/dist/dashboard/demo-workspace.js +178 -0
- package/dist/dashboard/demo-workspace.js.map +1 -0
- package/dist/dashboard/live-workspace-html.d.ts +2 -0
- package/dist/dashboard/live-workspace-html.d.ts.map +1 -0
- package/dist/dashboard/live-workspace-html.js +1042 -0
- package/dist/dashboard/live-workspace-html.js.map +1 -0
- package/dist/dashboard/project-feedback-html.d.ts +5 -0
- package/dist/dashboard/project-feedback-html.d.ts.map +1 -0
- package/dist/dashboard/project-feedback-html.js +216 -0
- package/dist/dashboard/project-feedback-html.js.map +1 -0
- package/dist/dashboard/project-hub-api.d.ts +5 -0
- package/dist/dashboard/project-hub-api.d.ts.map +1 -0
- package/dist/dashboard/project-hub-api.js +121 -0
- package/dist/dashboard/project-hub-api.js.map +1 -0
- package/dist/dashboard/project-kit-html.d.ts +4 -0
- package/dist/dashboard/project-kit-html.d.ts.map +1 -0
- package/dist/dashboard/project-kit-html.js +359 -0
- package/dist/dashboard/project-kit-html.js.map +1 -0
- package/dist/dashboard/project-workspace.d.ts +16 -0
- package/dist/dashboard/project-workspace.d.ts.map +1 -0
- package/dist/dashboard/project-workspace.js +106 -0
- package/dist/dashboard/project-workspace.js.map +1 -0
- package/dist/dashboard/server.d.ts +2 -0
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +65 -19
- package/dist/dashboard/server.js.map +1 -1
- package/dist/dashboard/v6-dashboard-html.d.ts +1 -1
- package/dist/dashboard/v6-dashboard-html.d.ts.map +1 -1
- package/dist/dashboard/v6-dashboard-html.js +34 -56
- package/dist/dashboard/v6-dashboard-html.js.map +1 -1
- package/dist/dashboard/workspace-api.d.ts +22 -0
- package/dist/dashboard/workspace-api.d.ts.map +1 -0
- package/dist/dashboard/workspace-api.js +429 -0
- package/dist/dashboard/workspace-api.js.map +1 -0
- package/dist/dashboard/workspace-html.d.ts +2 -0
- package/dist/dashboard/workspace-html.d.ts.map +1 -0
- package/dist/dashboard/workspace-html.js +2538 -0
- package/dist/dashboard/workspace-html.js.map +1 -0
- package/dist/dashboard/workspace-status.d.ts +50 -0
- package/dist/dashboard/workspace-status.d.ts.map +1 -0
- package/dist/dashboard/workspace-status.js +22 -0
- package/dist/dashboard/workspace-status.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -1
- package/dist/integration-cli.d.ts +3 -0
- package/dist/integration-cli.d.ts.map +1 -0
- package/dist/integration-cli.js +16 -0
- package/dist/integration-cli.js.map +1 -0
- package/dist/project-cli.d.ts +3 -0
- package/dist/project-cli.d.ts.map +1 -0
- package/dist/project-cli.js +100 -0
- package/dist/project-cli.js.map +1 -0
- package/dist/types.d.ts +12 -3
- package/dist/types.d.ts.map +1 -1
- package/docs/COMPARISON.md +22 -0
- package/docs/COMPONENTS.md +66 -0
- package/docs/CONTEXT_LAB.md +79 -0
- package/docs/FEATURES_AND_LIMITS.md +24 -0
- package/docs/INTEGRATIONS.md +68 -0
- package/docs/LEARNING.md +46 -0
- package/docs/PROJECT_KIT.md +93 -0
- package/docs/QUICKSTART.md +44 -0
- package/docs/README.md +33 -0
- package/docs/ROADMAP-v7.md +147 -0
- package/docs/SHARING.md +13 -0
- package/docs/SHOWCASE.md +87 -0
- package/docs/STATS.md +21 -0
- package/docs/TROUBLESHOOTING.md +42 -0
- package/docs/UPGRADE_PLAN_v7.0.0.md +203 -0
- package/docs/VIRAL-PLAYBOOK.md +259 -0
- package/docs/VISUAL_GUIDE_v7.1.4.md +70 -0
- package/docs/WORKFLOW_INTEGRATION.md +19 -1
- package/docs/WORKSPACE.md +37 -0
- package/docs/assets/7.1.4-collaboration-design-preview.png +0 -0
- package/docs/assets/7.1.4-comparison.png +0 -0
- package/docs/assets/7.1.4-context-lab.png +0 -0
- package/docs/assets/7.1.4-control-room-dense-preview.png +0 -0
- package/docs/assets/7.1.4-control-room-focus-preview.png +0 -0
- package/docs/assets/7.1.4-features.png +0 -0
- package/docs/assets/7.1.4-graph.png +0 -0
- package/docs/assets/7.1.4-hub-control-room.png +0 -0
- package/docs/assets/7.1.4-hub-empty.png +0 -0
- package/docs/assets/7.1.4-hub-knowledge.png +0 -0
- package/docs/assets/7.1.4-hub-learning.png +0 -0
- package/docs/assets/7.1.4-hub-mobile.png +0 -0
- package/docs/assets/7.1.4-hub-public-docs-source.png +0 -0
- package/docs/assets/7.1.4-hub-public-docs.gif +0 -0
- package/docs/assets/7.1.4-hub-public-docs.png +0 -0
- package/docs/assets/7.1.4-hub-setup.png +0 -0
- package/docs/assets/7.1.4-hub-walkthrough.gif +0 -0
- package/docs/assets/7.1.4-integrations.png +0 -0
- package/docs/assets/7.1.4-knowledge-design-preview.png +0 -0
- package/docs/assets/7.1.4-learning-design-preview.png +0 -0
- package/docs/assets/7.1.4-learning.png +0 -0
- package/docs/assets/7.1.4-live.png +0 -0
- package/docs/assets/7.1.4-memory-review.png +0 -0
- package/docs/assets/7.1.4-mobile.png +0 -0
- package/docs/assets/7.1.4-models-design-preview.png +0 -0
- package/docs/assets/7.1.4-outcome-ranking.png +0 -0
- package/docs/assets/7.1.4-overview.png +0 -0
- package/docs/assets/7.1.4-project-kit.png +0 -0
- package/docs/assets/7.1.4-project-skill-preview.png +0 -0
- package/docs/assets/7.1.4-replay.png +0 -0
- package/docs/assets/7.1.4-setup-design-preview.png +0 -0
- package/docs/assets/7.1.4-usage-design-preview.png +0 -0
- package/docs/assets/context-flow-v7.2.png +0 -0
- package/docs/assets/context-v7.1.3.png +0 -0
- package/docs/assets/features-v7.1.3.png +0 -0
- package/docs/assets/graph-v7.1.3.png +0 -0
- package/docs/assets/integrations-v7.1.3.png +0 -0
- package/docs/assets/live-v7.1.3.png +0 -0
- package/docs/assets/live-v7.1.4.gif +0 -0
- package/docs/assets/memory-detail-v7.1.3.png +0 -0
- package/docs/assets/overview-v7.1.3.png +0 -0
- package/docs/assets/workspace-graph-v7.2.png +0 -0
- package/docs/assets/workspace-overview-v7.2.png +0 -0
- package/docs/evaluation/CONTEXT_EVALUATION_v7.1.4.json +1818 -0
- package/docs/evaluation/CONTEXT_EVALUATION_v7.1.4.md +36 -0
- package/docs/launch/COMPONENT_MAP_v7.1.4.md +307 -0
- package/docs/launch/PROJECT_KIT_PLAN_v7.1.4.md +110 -0
- package/docs/launch/PROJECT_LEARNING_PLAN_v7.1.4.md +63 -0
- package/docs/launch/RELEASE_NOTES_v7.1.3.md +40 -0
- package/docs/launch/RELEASE_NOTES_v7.1.4.md +30 -0
- package/docs/launch/RELEASE_NOTES_v7.2.0.md +24 -0
- package/docs/launch/RESEARCH_AND_PLAN_v7.1.4.md +255 -0
- package/package.json +43 -126
- package/skills/shadow-research/SKILL.md +2 -0
- package/skills/shadow-workflow/SKILL.md +6 -0
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
export const BRAIN_HUB_CLIENT = String.raw `
|
|
2
|
+
const $ = id => document.getElementById(id);
|
|
3
|
+
const arr = value => Array.isArray(value) ? value : [];
|
|
4
|
+
const esc = value => String(value ?? '').replace(/[&<>"']/g, char => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[char]));
|
|
5
|
+
const fmt = value => Number.isFinite(value) ? value.toLocaleString() : 'Unavailable';
|
|
6
|
+
const clock = new Intl.DateTimeFormat(undefined,{hour:'2-digit',minute:'2-digit',second:'2-digit'});
|
|
7
|
+
const time = value => value && Number.isFinite(new Date(value).getTime()) ? clock.format(new Date(value)) : '—';
|
|
8
|
+
const isoTime = value => value && Number.isFinite(new Date(value).getTime()) ? new Date(value).toLocaleString() : 'Unavailable';
|
|
9
|
+
const reduced = matchMedia('(prefers-reduced-motion: reduce)');
|
|
10
|
+
const local = document.documentElement.dataset.projectLocal === 'true';
|
|
11
|
+
const projectFeatureLimits={crossProjectContext:'Project memory stays scoped to this project.',automaticBriefing:'Automatic briefing requires a legacy analysis session.'};
|
|
12
|
+
const featureLimit = id => local ? projectFeatureLimits[id] : undefined;
|
|
13
|
+
const nav = {overview:'Brain overview',knowledge:'Knowledge',room:'Collaboration',context:'Context',models:'Models',usage:'Usage',learning:'Learning',setup:'Setup'};
|
|
14
|
+
const labels = {codex:'Codex','claude-code':'Claude Code',opencode:'OpenCode','deepseek-harness':'DeepSeek Harness',user:'Operator'};
|
|
15
|
+
const hostName = value => labels[value] ?? value ?? 'Unknown host';
|
|
16
|
+
const state = {view:'overview',project:'',overview:null,server:null,connection:'connecting',errors:{},graph:null,features:null,integrations:null,
|
|
17
|
+
profile:null,feedback:null,hub:null,documents:null,docPage:1,room:null,context:null,contextInput:null,comparison:null,skill:null,skillInput:null,
|
|
18
|
+
picked:null,memory:null,focus:false,inspector:'record',graphMode:'graph',listing:false,events:[],cursor:undefined,journalId:undefined,
|
|
19
|
+
live:false,recording:false,journalGap:false,replayId:null,motionPaused:false,motionStarted:0,pulseIds:[],pending:false,message:'',messageError:false,
|
|
20
|
+
dataEpoch:0,viewEpoch:0,search:null,lessonFrom:null};
|
|
21
|
+
let timer, polling=false, pollAgain=false, failures=0, polls=0;
|
|
22
|
+
let controller;
|
|
23
|
+
const list = (content,attributes='',classes='') => '<ul class="list '+classes+'" '+attributes+'>'+content+'</ul>';
|
|
24
|
+
const chip = (text,tone='') => '<span class="chip '+tone+'">'+esc(text)+'</span>';
|
|
25
|
+
const btn = (text, attrs='', kind='') => '<button type="button" class="btn '+kind+'" '+attrs+'>'+esc(text)+'</button>';
|
|
26
|
+
const submit = (text, kind='primary') => '<button type="submit" class="btn '+kind+'" '+(state.pending?'disabled':'')+'>'+esc(text)+'</button>';
|
|
27
|
+
const panel = (title, content, meta='', cls='') => '<section class="panel '+cls+'"><div class="panel-head"><h2>'+esc(title)+'</h2>'+meta+'</div>'+content+'</section>';
|
|
28
|
+
const heading = (title, body, actions='') => '<div class="page-head"><div><h1 id="title" tabindex="-1">'+esc(title)+'</h1><p class="small muted">'+esc(body)+'</p></div><div class="actions">'+actions+'</div></div>';
|
|
29
|
+
const empty = (title, detail, action='') => '<div class="empty"><strong>'+esc(title)+'</strong><p class="small">'+esc(detail)+'</p>'+(action?'<div class="actions">'+action+'</div>':'')+'</div>';
|
|
30
|
+
const fact = (label,value) => '<div><dt>'+esc(label)+'</dt><dd>'+esc(value ?? 'Unavailable')+'</dd></div>';
|
|
31
|
+
const error = (key, fallback) => state.errors[key] ? empty('Could not load '+fallback,state.errors[key],btn('Retry','data-action="refresh"')) : '';
|
|
32
|
+
const action = (id,text,kind='',extra='') => btn(text,'data-action="'+id+'" '+extra,kind);
|
|
33
|
+
const view = (id,text=nav[id]) => btn(text,'data-view="'+id+'"','quiet');
|
|
34
|
+
const json = body => ({method:'POST',body:JSON.stringify(body),headers:{'Content-Type':'application/json'}});
|
|
35
|
+
const retryKeys=new Map();
|
|
36
|
+
async function hubWrite(route,input){
|
|
37
|
+
const id=route+'\n'+JSON.stringify(input);
|
|
38
|
+
if(!retryKeys.has(id)){
|
|
39
|
+
if(retryKeys.size>=40)retryKeys.delete(retryKeys.keys().next().value);
|
|
40
|
+
retryKeys.set(id,crypto.randomUUID());
|
|
41
|
+
}
|
|
42
|
+
try{
|
|
43
|
+
const result=await api(route,json({...input,key:retryKeys.get(id)}));
|
|
44
|
+
retryKeys.delete(id);return result;
|
|
45
|
+
}catch(failure){
|
|
46
|
+
if(failure.status&&failure.status<500)retryKeys.delete(id);
|
|
47
|
+
throw failure;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function status(message='',isError=false){
|
|
51
|
+
state.message=message;state.messageError=isError;
|
|
52
|
+
const target=$('view-status');
|
|
53
|
+
if(target){target.textContent=message;target.dataset.error=String(isError);}
|
|
54
|
+
}
|
|
55
|
+
function projectQuery(extra={}){
|
|
56
|
+
return '?'+new URLSearchParams({...extra,...(state.project?{project:state.project}:{})});
|
|
57
|
+
}
|
|
58
|
+
async function api(route,options={}){
|
|
59
|
+
const {timeoutMs=6500,...request}=options;
|
|
60
|
+
const timeout=AbortSignal.timeout(timeoutMs);
|
|
61
|
+
const signal=request.signal ? AbortSignal.any([request.signal,timeout]) : timeout;
|
|
62
|
+
const pinned=local&&(state.server?.project?.id??state.overview?.projectKit?.projectId);
|
|
63
|
+
const headers={Accept:'application/json',...request.headers,...(pinned&&request.method==='POST'?{'X-Shadow-Brain-Project':pinned}:{})};
|
|
64
|
+
const response=await fetch('/api/workspace/'+route,{...request,signal,cache:'no-store',headers});
|
|
65
|
+
const data=await response.json().catch(()=>null);
|
|
66
|
+
if(!response.ok||!data){
|
|
67
|
+
const failure=new Error(data?.error ?? 'Workspace request returned HTTP '+response.status+'.');
|
|
68
|
+
failure.status=response.status;failure.code=data?.code;throw failure;
|
|
69
|
+
}
|
|
70
|
+
return data;
|
|
71
|
+
}
|
|
72
|
+
function validStatus(data){
|
|
73
|
+
return data&&typeof data.version==='string'&&/^\d+\.\d+\.\d+(?:[-+][\w.-]+)?$/.test(data.version)&&
|
|
74
|
+
typeof data.serverInstanceId==='string'&&data.serverInstanceId.length>0&&['project','shared','demo'].includes(data.mode)&&
|
|
75
|
+
(data.mode!=='project'||typeof data.project?.id==='string'&&typeof data.project.name==='string')&&
|
|
76
|
+
['ready','error','initializing'].includes(data.storage?.status)&&data.capabilities?.memory===true;
|
|
77
|
+
}
|
|
78
|
+
function validOverview(data){return data&&typeof data.version==='string'&&Array.isArray(data.projects)&&data.totals&&data.projectKit;}
|
|
79
|
+
function scopeName(){return state.overview?.projectKit?.projectName ?? arr(state.overview?.projects).find(project=>project.id===state.project)?.name ?? (state.project||'All projects');}
|
|
80
|
+
function renderChrome(){
|
|
81
|
+
const selector=$('project');
|
|
82
|
+
const projects=arr(state.overview?.projects);
|
|
83
|
+
const fixed=state.overview?.projectKit?.projectId;
|
|
84
|
+
const options=(fixed?'':'<option value="">All projects</option>')+projects.map(project=>'<option value="'+esc(project.id)+'">'+esc(project.name)+'</option>').join('');
|
|
85
|
+
if(selector.dataset.options!==options){selector.innerHTML=options||'<option value="">Loading…</option>';selector.dataset.options=options;}
|
|
86
|
+
selector.disabled=!!fixed||!state.overview||state.pending;
|
|
87
|
+
selector.value=state.project;
|
|
88
|
+
const connection=$('connection');
|
|
89
|
+
const connected=state.connection==='reachable';
|
|
90
|
+
const isDemo=state.overview?.demo===true||state.server?.mode==='demo';
|
|
91
|
+
connection.className='chip '+(connected?'green':state.connection==='connecting'?'':'amber');
|
|
92
|
+
connection.innerHTML='<i class="dot" aria-hidden="true"></i> '+(connected?(isDemo?'Demo workspace · Example data':'Workspace reachable'):state.connection==='connecting'?'Connecting to workspace':'Workspace unavailable');
|
|
93
|
+
const notice=$('notice');
|
|
94
|
+
notice.textContent=state.connection==='offline'?'The local workspace did not respond. Keep this tab open while the launcher restarts the server, or refresh to retry. '+(state.overview?'Showing the last loaded snapshot.':''):
|
|
95
|
+
state.errors.overview||state.server?.storage?.status==='error'?'The server responded, but the memory store is unavailable. '+(state.errors.overview||state.server.storage.error||''):
|
|
96
|
+
state.journalGap?'Some activity expired before this page could read it. The timeline shows retained records.':'';
|
|
97
|
+
$('scope-note').textContent=state.overview?(fixed?'Project-local workspace · ':'Global workspace · ')+scopeName()+(state.overview.version?' · v'+state.overview.version:''):'';
|
|
98
|
+
const buttons=Object.entries(nav).map(([id,label])=>'<button type="button" data-view="'+id+'" '+(id===state.view?'aria-current="page"':'')+'>'+label+'</button>').join('');
|
|
99
|
+
if($('nav').dataset.buttons!==buttons){$('nav').innerHTML=buttons;$('nav').dataset.buttons=buttons;}
|
|
100
|
+
}
|
|
101
|
+
function resetScope(){
|
|
102
|
+
state.dataEpoch++;state.viewEpoch++;state.graph=null;state.picked=null;state.memory=null;state.focus=false;state.context=null;
|
|
103
|
+
state.comparison=null;state.contextInput=null;state.hub=null;state.documents=null;state.room=null;state.profile=null;state.feedback=null;
|
|
104
|
+
state.skill=null;state.skillInput=null;state.search=null;state.events=[];state.cursor=undefined;state.journalId=undefined;state.lessonFrom=null;
|
|
105
|
+
state.replayId=null;state.journalGap=false;state.pulseIds=[];state.motionStarted=0;
|
|
106
|
+
}
|
|
107
|
+
function updateOverview(value){
|
|
108
|
+
const fixed=value.projectKit?.projectId;
|
|
109
|
+
const next=fixed ?? (arr(value.projects).some(project=>project.id===state.project)?state.project:'');
|
|
110
|
+
if(next!==state.project){state.project=next;resetScope();}
|
|
111
|
+
state.overview=value;
|
|
112
|
+
}
|
|
113
|
+
function installTelemetry(page){
|
|
114
|
+
if(!page.liveEnabled){
|
|
115
|
+
state.events=[];state.cursor=undefined;state.journalId=undefined;state.live=false;state.recording=page.recordingEnabled;state.replayId=null;state.pulseIds=[];
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
state.live=true;state.recording=page.recordingEnabled;
|
|
119
|
+
if(page.gap||page.reset||(state.journalId&&state.journalId!==page.journalId)){
|
|
120
|
+
state.events=[];state.replayId=null;state.journalGap=!!page.gap;state.pulseIds=[];
|
|
121
|
+
}
|
|
122
|
+
const hasHistory=state.cursor!==undefined;
|
|
123
|
+
const unique=new Map(state.events.map(event=>[event.id,event]));
|
|
124
|
+
const added=arr(page.events).filter(event=>!unique.has(event.id));
|
|
125
|
+
for(const event of added)unique.set(event.id,event);
|
|
126
|
+
state.events=[...unique.values()].sort((a,b)=>a.sequence-b.sequence).slice(-200);
|
|
127
|
+
state.cursor=page.cursor;
|
|
128
|
+
state.journalId=page.journalId;
|
|
129
|
+
if(state.replayId&&!unique.has(state.replayId))state.replayId=null;
|
|
130
|
+
if(hasHistory&&!page.gap&&!page.reset&&!page.hasMore&&state.view==='overview'&&state.graphMode==='graph'&&!state.focus&&!state.replayId&&!state.motionPaused&&!reduced.matches){
|
|
131
|
+
const now=Date.now();
|
|
132
|
+
const fresh=added.filter(event=>{
|
|
133
|
+
const age=now-Date.parse(event.timestamp);
|
|
134
|
+
return age>=0&&age<=6500;
|
|
135
|
+
});
|
|
136
|
+
if(fresh.length){state.pulseIds=fresh.slice(-4).map(event=>event.id);state.motionStarted=performance.now();}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
async function refresh(manual=false){
|
|
140
|
+
if(document.hidden&&!manual)return;
|
|
141
|
+
clearTimeout(timer);
|
|
142
|
+
if(polling){pollAgain ||= manual;return;}
|
|
143
|
+
polling=true;
|
|
144
|
+
controller=new AbortController();
|
|
145
|
+
const signal=controller.signal;
|
|
146
|
+
const options={signal};
|
|
147
|
+
try{
|
|
148
|
+
const [health,summary]=await Promise.allSettled([api('status',options),api('overview',options)]);
|
|
149
|
+
if(signal.aborted)return;
|
|
150
|
+
const old=state.server?.serverInstanceId;
|
|
151
|
+
const healthOk=health.status==='fulfilled'&&validStatus(health.value);
|
|
152
|
+
const summaryOk=summary.status==='fulfilled'&&validOverview(summary.value);
|
|
153
|
+
if(healthOk){
|
|
154
|
+
const next=health.value;
|
|
155
|
+
if(old&&next.serverInstanceId&&old!==next.serverInstanceId){resetScope();state.features=null;state.integrations=null;}
|
|
156
|
+
state.server=next;
|
|
157
|
+
}
|
|
158
|
+
const reachable=healthOk||summaryOk;
|
|
159
|
+
state.connection=reachable?'reachable':'offline';
|
|
160
|
+
if(summaryOk){updateOverview(summary.value);delete state.errors.overview;}
|
|
161
|
+
else if(reachable)state.errors.overview=summary.reason?.message??'The workspace returned an invalid overview.';
|
|
162
|
+
renderChrome();
|
|
163
|
+
if(!reachable){failures++;state.pulseIds=[];drawGraph();if(!$('title'))render();return;}
|
|
164
|
+
failures=0;
|
|
165
|
+
polls++;
|
|
166
|
+
const epoch=state.dataEpoch;
|
|
167
|
+
const params=new URLSearchParams(projectQuery({limit:'200'}).slice(1));
|
|
168
|
+
if(state.cursor!==undefined)params.set('cursor',state.cursor);
|
|
169
|
+
if(state.journalId)params.set('journalId',state.journalId);
|
|
170
|
+
const jobs=[['telemetry',api('telemetry?'+params,options)]];
|
|
171
|
+
if(!state.graph||manual||(state.view==='overview'&&(polls%3===0||state.graph.totalMemories!==state.overview?.quality?.total)))jobs.push(['graph',api('graph'+projectQuery({limit:'140',...(state.picked?.startsWith('memory:')?{memory:state.picked.slice(7)}:{})}),options)]);
|
|
172
|
+
if(!state.features||manual||state.view==='setup')jobs.push(['features',api('features',options)]);
|
|
173
|
+
if(local&&state.server?.capabilities?.hub!==false&&!state.pending&&(!state.hub||manual||['room','knowledge','learning'].includes(state.view)))jobs.push(['hub',api('hub',options)]);
|
|
174
|
+
if(local&&!state.pending&&state.view==='room'&&state.room)jobs.push(['room',api('hub/rooms/'+encodeURIComponent(state.room.room.id),options)]);
|
|
175
|
+
const results=await Promise.allSettled(jobs.map(([,job])=>job));
|
|
176
|
+
if(signal.aborted||epoch!==state.dataEpoch)return;
|
|
177
|
+
let needsRender=false;
|
|
178
|
+
results.forEach((result,index)=>{
|
|
179
|
+
const name=jobs[index][0];
|
|
180
|
+
if(result.status==='rejected'){state.errors[name]=result.reason.message;return;}
|
|
181
|
+
delete state.errors[name];
|
|
182
|
+
if(name==='telemetry'){installTelemetry(result.value);if(result.value.hasMore)pollAgain=true;}
|
|
183
|
+
else if(name==='graph'&&JSON.stringify(state.graph)!==JSON.stringify(result.value)){state.graph=result.value;needsRender ||= state.view==='overview';}
|
|
184
|
+
else if(name==='features'&&(!state.features||result.value.revision>=state.features.revision)){
|
|
185
|
+
needsRender ||= state.view==='setup'&&state.features?.revision!==result.value.revision;
|
|
186
|
+
state.features=result.value;
|
|
187
|
+
}else if(name==='hub'&&(!state.hub||result.value.revision>=state.hub.revision)){
|
|
188
|
+
needsRender ||= ['room','knowledge','learning'].includes(state.view)&&state.hub?.revision!==result.value.revision;
|
|
189
|
+
state.hub=result.value;
|
|
190
|
+
}else if(name==='room'&&state.room?.room?.id===result.value.room.id&&result.value.revision>=state.room.revision){
|
|
191
|
+
needsRender ||= state.view==='room'&&state.room.revision!==result.value.revision;
|
|
192
|
+
state.room=result.value;
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
renderChrome();
|
|
196
|
+
if(state.view==='overview'){
|
|
197
|
+
if(manual||!$('brain-stage')||needsRender)render();
|
|
198
|
+
else updateOverviewLive();
|
|
199
|
+
}else if(manual||!$('title')||needsRender)render(true);
|
|
200
|
+
if(manual)await loadView();
|
|
201
|
+
} finally {
|
|
202
|
+
polling=false;controller=undefined;
|
|
203
|
+
if(!document.hidden){
|
|
204
|
+
const delay=pollAgain?20:failures?Math.min(15000,1800*2**Math.min(3,failures-1)):2600;
|
|
205
|
+
pollAgain=false;timer=setTimeout(()=>void refresh(),delay);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
async function loadView(){
|
|
210
|
+
const epoch=++state.viewEpoch;
|
|
211
|
+
const current=state.view;
|
|
212
|
+
const jobs=[];
|
|
213
|
+
if(current==='setup')jobs.push(['integrations','integrations']);
|
|
214
|
+
if(current==='knowledge'||current==='room'||current==='learning'){
|
|
215
|
+
if(local&&!state.hub)jobs.push(['hub','hub']);
|
|
216
|
+
if(local&¤t==='knowledge'&&!state.profile)jobs.push(['profile','project-profile']);
|
|
217
|
+
if(local&¤t==='learning'&&!state.feedback)jobs.push(['feedback','project-feedback']);
|
|
218
|
+
}
|
|
219
|
+
if(current==='models')jobs.push(['integrations','integrations']);
|
|
220
|
+
const results=await Promise.allSettled(jobs.map(([,url])=>api(url)));
|
|
221
|
+
if(epoch!==state.viewEpoch||current!==state.view)return;
|
|
222
|
+
results.forEach((result,index)=>{
|
|
223
|
+
const name=jobs[index][0];
|
|
224
|
+
if(result.status==='fulfilled'){state[name]=result.value;delete state.errors[name];}
|
|
225
|
+
else state.errors[name]=result.reason.message;
|
|
226
|
+
});
|
|
227
|
+
if(jobs.length)render(true);
|
|
228
|
+
}
|
|
229
|
+
function openView(next){
|
|
230
|
+
if(!Object.hasOwn(nav,next))return;
|
|
231
|
+
state.view=next;state.message='';state.messageError=false;state.pulseIds=[];
|
|
232
|
+
render();window.scrollTo(0,0);$('title')?.focus({preventScroll:true});void loadView();
|
|
233
|
+
}
|
|
234
|
+
function render(restore=false){
|
|
235
|
+
const formValues=restore?[...$('main').querySelectorAll('form[data-form]')].map(form=>{
|
|
236
|
+
const fields=[...form.elements].filter(node=>node.name&&node.type!=='submit'&&node.type!=='button');
|
|
237
|
+
return {kind:form.dataset.form,id:form.dataset.id,fields:fields.map(node=>({name:node.name,value:node.value,checked:node.checked,
|
|
238
|
+
file:node.type==='file'?node:null,active:node===document.activeElement,start:node.selectionStart,end:node.selectionEnd}))};
|
|
239
|
+
}):[];
|
|
240
|
+
unmountGraph();
|
|
241
|
+
renderChrome();
|
|
242
|
+
const viewBody=views[state.view]();
|
|
243
|
+
$('main').innerHTML=viewBody+'<p class="status small" id="view-status" role="status"></p>';
|
|
244
|
+
status(state.message,state.messageError);
|
|
245
|
+
if(state.view==='overview')mountGraph();
|
|
246
|
+
for(const form of $('main').querySelectorAll('form[data-form]')){
|
|
247
|
+
const saved=formValues.find(item=>item.kind===form.dataset.form&&item.id===form.dataset.id);
|
|
248
|
+
if(!saved)continue;
|
|
249
|
+
for(const field of saved.fields){
|
|
250
|
+
let node=form.elements.namedItem(field.name);
|
|
251
|
+
if(!node)continue;
|
|
252
|
+
if(field.file?.files?.length){node.replaceWith(field.file);node=field.file;}
|
|
253
|
+
else if(node.type!=='file'&&(node.tagName!=='SELECT'||[...node.options].some(option=>option.value===field.value)))node.value=field.value;
|
|
254
|
+
if(node.type==='checkbox')node.checked=field.checked;
|
|
255
|
+
if(field.active){node.closest('details')?.setAttribute('open','');node.focus({preventScroll:true});if(field.start!==null)node.setSelectionRange?.(field.start,field.end);}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
async function chooseMemory(id){
|
|
260
|
+
const item=arr(state.graph?.nodes).find(node=>node.id===id);
|
|
261
|
+
if(!item)return;
|
|
262
|
+
state.picked=id;state.memory=null;state.focus=true;state.inspector='record';state.pulseIds=[];
|
|
263
|
+
renderInspector();drawGraph();
|
|
264
|
+
if(item.kind!=='memory')return;
|
|
265
|
+
const epoch=state.dataEpoch;
|
|
266
|
+
try{
|
|
267
|
+
const detail=await api('memory?'+new URLSearchParams({id:item.memoryId,project:item.project}));
|
|
268
|
+
if(epoch!==state.dataEpoch||state.picked!==id)return;
|
|
269
|
+
state.memory=detail;renderInspector();
|
|
270
|
+
}catch(failure){if(epoch===state.dataEpoch&&state.picked===id)status(failure.message,true);}
|
|
271
|
+
}
|
|
272
|
+
async function loadDocuments(id){state.documents=await api('hub/documents/'+encodeURIComponent(id));state.docPage=arr(state.documents.pages)[0]?.page??1;}
|
|
273
|
+
async function loadRoom(id){state.room=await api('hub/rooms/'+encodeURIComponent(id));}
|
|
274
|
+
async function refreshHub(){state.hub=await api('hub');delete state.errors.hub;}
|
|
275
|
+
async function refreshGraph(){state.graph=await api('graph'+projectQuery({limit:'140'}));delete state.errors.graph;}
|
|
276
|
+
function field(form,name){return String(form.get(name)??'').trim();}
|
|
277
|
+
async function clipboard(text){
|
|
278
|
+
if(!text)throw new Error('There is no text to copy.');
|
|
279
|
+
await navigator.clipboard.writeText(text);
|
|
280
|
+
status('Copied to clipboard.');
|
|
281
|
+
}
|
|
282
|
+
async function mutation(operation,source,success='Saved.'){
|
|
283
|
+
if(state.pending)return;
|
|
284
|
+
state.pending=true;
|
|
285
|
+
const submissionView=state.view;
|
|
286
|
+
if(source)source.disabled=true;
|
|
287
|
+
renderChrome();
|
|
288
|
+
status('Working…');
|
|
289
|
+
try{
|
|
290
|
+
const message=await operation();
|
|
291
|
+
state.pending=false;status(typeof message==='string'?message:success);render(state.view!==submissionView);
|
|
292
|
+
if(source?.dataset.feature)[...$('main').querySelectorAll('[data-feature]')].find(node=>node.dataset.feature===source.dataset.feature)?.focus({preventScroll:true});
|
|
293
|
+
}
|
|
294
|
+
catch(failure){
|
|
295
|
+
if(failure.status===409){
|
|
296
|
+
if(source?.dataset.feature){try{state.features=await api('features');render(true);}catch{}}
|
|
297
|
+
else if(source?.dataset.roomAction&&state.room){try{await loadRoom(state.room.room.id);render(true);}catch{}}
|
|
298
|
+
}
|
|
299
|
+
status(failure.message||'The workspace request failed.',true);
|
|
300
|
+
}finally{
|
|
301
|
+
state.pending=false;
|
|
302
|
+
if(source)source.disabled=false;
|
|
303
|
+
$('main').querySelectorAll('button[type=submit]').forEach(node=>node.disabled=false);
|
|
304
|
+
renderChrome();
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
async function afterSave(...refreshers){
|
|
308
|
+
const results=await Promise.allSettled(refreshers.map(refresh=>refresh()));
|
|
309
|
+
return results.some(result=>result.status==='rejected')?'Saved. Refresh the workspace to reload related records.':undefined;
|
|
310
|
+
}
|
|
311
|
+
function setReplay(index){
|
|
312
|
+
const event=state.events[index];
|
|
313
|
+
if(!event)return;
|
|
314
|
+
state.replayId=event.id;state.pulseIds=[];state.inspector='event';state.focus=false;
|
|
315
|
+
updateOverviewLive();renderInspector();drawGraph();
|
|
316
|
+
}
|
|
317
|
+
function start(){
|
|
318
|
+
render();
|
|
319
|
+
$('reload').addEventListener('click',()=>void refresh(true));
|
|
320
|
+
$('project').addEventListener('change',event=>{
|
|
321
|
+
state.project=event.target.value;resetScope();render();void refresh(true);
|
|
322
|
+
});
|
|
323
|
+
$('main').addEventListener('input',event=>{if(event.target.id==='replay')setReplay(Number(event.target.value));});
|
|
324
|
+
document.addEventListener('visibilitychange',()=>{
|
|
325
|
+
clearTimeout(timer);state.pulseIds=[];drawGraph();
|
|
326
|
+
if(document.hidden)controller?.abort();else void refresh(true);
|
|
327
|
+
});
|
|
328
|
+
reduced.addEventListener('change',()=>{state.pulseIds=[];updateOverviewLive();});
|
|
329
|
+
window.addEventListener('online',()=>void refresh(true));
|
|
330
|
+
document.addEventListener('click',handleClick);
|
|
331
|
+
document.addEventListener('submit',handleSubmit);
|
|
332
|
+
void refresh(true);
|
|
333
|
+
}
|
|
334
|
+
`;
|
|
335
|
+
//# sourceMappingURL=brain-hub-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-hub-client.js","sourceRoot":"","sources":["../../src/dashboard/brain-hub-client.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6UzC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-hub-graph.d.ts","sourceRoot":"","sources":["../../src/dashboard/brain-hub-graph.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,QA8K3B,CAAC"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
export const BRAIN_HUB_GRAPH = String.raw `
|
|
2
|
+
const tones={project:'124,233,232',memory:'172,199,255',agent:'234,172,249',measured:'124,233,232',reported:'250,208,140'};
|
|
3
|
+
let graphSurface=null;
|
|
4
|
+
function rand(seed){return ()=>{seed=(Math.imul(seed,1664525)+1013904223)>>>0;return seed/4294967296;};}
|
|
5
|
+
function hash(id){let value=2166136261;for(const char of id)value=Math.imul(value^char.charCodeAt(0),16777619);return value>>>0;}
|
|
6
|
+
function mountGraph(){
|
|
7
|
+
const canvas=$('brain-canvas'),stage=$('brain-stage');
|
|
8
|
+
if(!canvas||canvas.hidden||!stage)return;
|
|
9
|
+
const ctx=canvas.getContext('2d');
|
|
10
|
+
if(!ctx)return;
|
|
11
|
+
const surface={canvas,stage,ctx,width:0,height:0,raf:0,observer:null,points:new Map(),edges:[],snapshot:undefined,counts:{}};
|
|
12
|
+
graphSurface=surface;
|
|
13
|
+
surface.observer=new ResizeObserver(()=>resizeGraph(surface));
|
|
14
|
+
surface.observer.observe(stage);
|
|
15
|
+
resizeGraph(surface);
|
|
16
|
+
function hit(event){
|
|
17
|
+
const box=canvas.getBoundingClientRect();
|
|
18
|
+
const x=event.clientX-box.left,y=event.clientY-box.top;
|
|
19
|
+
let best=null,distance=16;
|
|
20
|
+
for(const point of surface.points.values()){
|
|
21
|
+
const d=Math.hypot(x-point.x,y-point.y);
|
|
22
|
+
if(d<distance){best=point;distance=d;}
|
|
23
|
+
}
|
|
24
|
+
return best;
|
|
25
|
+
}
|
|
26
|
+
canvas.addEventListener('pointermove',event=>{
|
|
27
|
+
const point=hit(event);
|
|
28
|
+
canvas.style.cursor=point?'pointer':'default';
|
|
29
|
+
const caption=$('node-caption');
|
|
30
|
+
if(caption&&point){caption.hidden=false;caption.textContent=point.kind==='agent'?hostName(point.label):point.label;}
|
|
31
|
+
else syncGraphControls();
|
|
32
|
+
});
|
|
33
|
+
canvas.addEventListener('pointerleave',syncGraphControls);
|
|
34
|
+
canvas.addEventListener('click',event=>{const point=hit(event);if(point)void chooseMemory(point.id);});
|
|
35
|
+
}
|
|
36
|
+
function unmountGraph(){
|
|
37
|
+
if(!graphSurface)return;
|
|
38
|
+
graphSurface.observer.disconnect();cancelAnimationFrame(graphSurface.raf);graphSurface=null;
|
|
39
|
+
}
|
|
40
|
+
function stroke(ctx,rgb,alpha,width){ctx.strokeStyle='rgba('+rgb+','+alpha+')';ctx.lineWidth=width;ctx.stroke();}
|
|
41
|
+
function dot(ctx,x,y,r,rgb,alpha){ctx.beginPath();ctx.arc(x,y,r,0,Math.PI*2);ctx.fillStyle='rgba('+rgb+','+alpha+')';ctx.fill();}
|
|
42
|
+
function resizeGraph(surface){
|
|
43
|
+
if(graphSurface!==surface)return;
|
|
44
|
+
const {stage,canvas,ctx}=surface;
|
|
45
|
+
const size=stage.getBoundingClientRect(),dpr=Math.min(devicePixelRatio,1.75);
|
|
46
|
+
if(!size.width||!size.height)return;
|
|
47
|
+
surface.width=size.width;surface.height=size.height;surface.snapshot=undefined;
|
|
48
|
+
canvas.width=Math.round(size.width*dpr);
|
|
49
|
+
canvas.height=Math.round(size.height*dpr);
|
|
50
|
+
ctx.setTransform(dpr,0,0,dpr,0,0);
|
|
51
|
+
drawGraph();
|
|
52
|
+
}
|
|
53
|
+
function brainFrame(width,height){return {x:width*.50,y:height*.51,rx:Math.min(width*.318,height*.76),ry:height*.42};}
|
|
54
|
+
function drawOutline(ctx,{x,y,rx,ry}){
|
|
55
|
+
ctx.save();ctx.translate(x,y);ctx.rotate(-.19);ctx.scale(rx,ry);
|
|
56
|
+
ctx.beginPath();ctx.moveTo(0,-.82);
|
|
57
|
+
ctx.bezierCurveTo(-.26,-1.12,-.68,-.95,-.78,-.65);ctx.bezierCurveTo(-1.07,-.56,-1.14,-.11,-.97,.09);
|
|
58
|
+
ctx.bezierCurveTo(-1.09,.45,-.80,.80,-.57,.80);ctx.bezierCurveTo(-.39,1.03,-.11,.96,0,.83);
|
|
59
|
+
ctx.bezierCurveTo(.14,.97,.42,.94,.56,.76);ctx.bezierCurveTo(.89,.77,1.10,.48,.99,.16);
|
|
60
|
+
ctx.bezierCurveTo(1.15,-.09,1.07,-.44,.85,-.57);ctx.bezierCurveTo(.76,-.87,.31,-1.06,0,-.82);ctx.closePath();
|
|
61
|
+
ctx.restore();stroke(ctx,'119,157,206',.19,1);
|
|
62
|
+
}
|
|
63
|
+
function graphPoints(width,height){
|
|
64
|
+
const nodes=arr(state.graph?.nodes),anchors=nodes.filter(node=>node.kind!=='memory');
|
|
65
|
+
const memories=nodes.filter(node=>node.kind==='memory').sort((a,b)=>hash(a.id)-hash(b.id));
|
|
66
|
+
const {x:cx,y:cy,rx,ry}=brainFrame(width,height);
|
|
67
|
+
const points=new Map();
|
|
68
|
+
function point(node,x,y,depth=1){points.set(node.id,{...node,x,y,depth});}
|
|
69
|
+
for(const kind of ['project','agent']){
|
|
70
|
+
const subset=anchors.filter(node=>node.kind===kind);
|
|
71
|
+
subset.forEach((node,i)=>{
|
|
72
|
+
const t=(i+1)/(subset.length+1),sign=kind==='project'?-1:1;
|
|
73
|
+
point(node,cx+sign*(rx*1.01+8*Math.sin(i*2.4)),height*.12+height*.75*t);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
const golden=Math.PI*(3-Math.sqrt(5));
|
|
77
|
+
memories.forEach((node,i)=>{
|
|
78
|
+
const random=rand(hash(node.id)),side=i%2===0?-1:1;
|
|
79
|
+
const count=Math.ceil((memories.length-(i%2))/2),ordinal=Math.floor(i/2);
|
|
80
|
+
const angle=ordinal*golden+(side<0?.55:1.71)+(random()-.5)*.10;
|
|
81
|
+
const r=Math.sqrt((ordinal+.55)/count);
|
|
82
|
+
const x=side*.47+Math.cos(angle)*r*.45,y=Math.sin(angle)*r*.88;
|
|
83
|
+
const projectedX=x*.982+y*.19,projectedY=y*.982-x*.19;
|
|
84
|
+
point(node,cx+projectedX*rx,cy+projectedY*ry,.56+random()*.44);
|
|
85
|
+
});
|
|
86
|
+
return points;
|
|
87
|
+
}
|
|
88
|
+
function displayEvent(){return state.events.find(event=>event.id===state.replayId)??state.events.at(-1);}
|
|
89
|
+
function graphEventPath(event,surface){
|
|
90
|
+
const {width,height,points}=surface;
|
|
91
|
+
const from=points.get('project:'+event.projectId),end=points.get('agent:'+event.agent);
|
|
92
|
+
if(!from||!end)return null;
|
|
93
|
+
const reverse=event.kind==='tool-start'||event.kind==='session-start';
|
|
94
|
+
return reverse?[end,{x:width*.51,y:height*.18},{x:width*.52,y:height*.69},from]:
|
|
95
|
+
[from,{x:width*.47,y:height*.73},{x:width*.49,y:height*.18},end];
|
|
96
|
+
}
|
|
97
|
+
function labelPoint(ctx,point,label,side,color,width,alpha){
|
|
98
|
+
ctx.font='600 10.5px system-ui,sans-serif';
|
|
99
|
+
const limit=Math.min(126,width*.20);
|
|
100
|
+
while(ctx.measureText(label).width>limit&&label.length>1)label=label.slice(0,label.endsWith('…')?-2:-1)+'…';
|
|
101
|
+
const pad=6,labelWidth=ctx.measureText(label).width+2*pad;
|
|
102
|
+
const x=Math.max(3,Math.min(width-labelWidth-3,side<0?point.x-12-labelWidth:point.x+12)),y=point.y-9;
|
|
103
|
+
ctx.globalAlpha=alpha;ctx.fillStyle='#111e31';ctx.beginPath();ctx.roundRect(x,y,labelWidth,18,3);ctx.fill();stroke(ctx,color,.43,.7);
|
|
104
|
+
ctx.fillStyle='#ddefff';ctx.textAlign='left';ctx.textBaseline='middle';ctx.fillText(label,x+pad,y+9);ctx.globalAlpha=1;
|
|
105
|
+
}
|
|
106
|
+
function drawGraph(){
|
|
107
|
+
const surface=graphSurface;
|
|
108
|
+
if(!surface||!surface.width)return;
|
|
109
|
+
if(surface.raf){cancelAnimationFrame(surface.raf);surface.raf=0;}
|
|
110
|
+
const {ctx,width,height,canvas}=surface;
|
|
111
|
+
if(surface.snapshot!==state.graph){
|
|
112
|
+
surface.snapshot=state.graph;
|
|
113
|
+
surface.points=graphPoints(width,height);
|
|
114
|
+
surface.edges=arr(state.graph?.edges).filter(edge=>surface.points.has(edge.source)&&surface.points.has(edge.target));
|
|
115
|
+
surface.counts={};
|
|
116
|
+
for(const point of surface.points.values())surface.counts[point.kind]=(surface.counts[point.kind]??0)+1;
|
|
117
|
+
}
|
|
118
|
+
const {points,edges}=surface;
|
|
119
|
+
const current=state.focus?state.picked:null;
|
|
120
|
+
const connected=new Set(current?[current]:[]);
|
|
121
|
+
if(current)for(const edge of edges){
|
|
122
|
+
if(edge.source===current)connected.add(edge.target);
|
|
123
|
+
if(edge.target===current)connected.add(edge.source);
|
|
124
|
+
}
|
|
125
|
+
ctx.clearRect(0,0,width,height);
|
|
126
|
+
if(points.size)drawOutline(ctx,brainFrame(width,height));
|
|
127
|
+
for(const edge of edges){
|
|
128
|
+
const a=points.get(edge.source),b=points.get(edge.target);
|
|
129
|
+
const active=current&&(edge.source===current||edge.target===current);
|
|
130
|
+
ctx.beginPath();ctx.moveTo(a.x,a.y);ctx.quadraticCurveTo((a.x+b.x)/2,(a.y+b.y)/2+(a.x-b.x)*.15,b.x,b.y);
|
|
131
|
+
const color=edge.kind==='belongs-to'?tones.project:edge.kind==='recorded-by'?tones.agent:'241,200,138';
|
|
132
|
+
if(active){stroke(ctx,color,.22,4.5);stroke(ctx,color,.96,1.45);}
|
|
133
|
+
else stroke(ctx,color,current?.08:edge.kind==='recorded-by'?.46:.52,.84);
|
|
134
|
+
}
|
|
135
|
+
for(const point of points.values()){
|
|
136
|
+
const active=point.id===current,color=tones[point.kind]??tones.memory;
|
|
137
|
+
const alpha=(current&&!connected.has(point.id)?.31:1)*point.depth;
|
|
138
|
+
const r=point.kind==='memory'?(points.size>70?2.8:4.1):5.2;
|
|
139
|
+
dot(ctx,point.x,point.y,active?15:r+5,color,.13*alpha);
|
|
140
|
+
dot(ctx,point.x,point.y,active?4.5:r,color,.92*alpha);
|
|
141
|
+
if(active||point.kind!=='memory'){
|
|
142
|
+
ctx.beginPath();ctx.arc(point.x,point.y,active?10:8,0,Math.PI*2);stroke(ctx,color,.68*alpha,.9);
|
|
143
|
+
}
|
|
144
|
+
if(point.kind!=='memory'&&width>510&&(active||surface.counts[point.kind]<=11))labelPoint(ctx,point,point.kind==='agent'?hostName(point.label):point.label,point.kind==='project'?-1:1,color,width,alpha);
|
|
145
|
+
}
|
|
146
|
+
const age=performance.now()-state.motionStarted;
|
|
147
|
+
const animate=!document.hidden&&!reduced.matches&&!state.motionPaused&&!state.replayId&&state.live&&state.connection==='reachable'&&state.pulseIds.length&&age<1500;
|
|
148
|
+
const traceEvents=current?[]:animate?state.events.filter(event=>state.pulseIds.includes(event.id)):
|
|
149
|
+
state.replayId?[displayEvent()].filter(Boolean):[];
|
|
150
|
+
const routes=traceEvents.map(event=>({event,path:graphEventPath(event,surface)})).filter(route=>route.path);
|
|
151
|
+
routes.forEach(({event,path},index)=>{
|
|
152
|
+
const [a,b,c,d]=path,color=tones[event.source]??tones.reported;
|
|
153
|
+
ctx.beginPath();ctx.moveTo(a.x,a.y);ctx.bezierCurveTo(b.x,b.y,c.x,c.y,d.x,d.y);
|
|
154
|
+
stroke(ctx,color,.19,4.2);stroke(ctx,color,.81,1.25);
|
|
155
|
+
const t=animate?Math.max(0,Math.min(1,age/1310-index*.055)):.58,u=1-t;
|
|
156
|
+
const x=u**3*a.x+3*u*u*t*b.x+3*u*t*t*c.x+t**3*d.x;
|
|
157
|
+
const y=u**3*a.y+3*u*u*t*b.y+3*u*t*t*c.y+t**3*d.y;
|
|
158
|
+
dot(ctx,x,y,8,color,.19);dot(ctx,x,y,4,color,.52);dot(ctx,x,y,1.9,'237,255,255',1);
|
|
159
|
+
});
|
|
160
|
+
const graphEvent=$('graph-event');
|
|
161
|
+
if(graphEvent){
|
|
162
|
+
const event=traceEvents.at(-1),text=event?evidence(event)+' · '+hostName(event.agent)+(routes.length?'':' · journal only'):'';
|
|
163
|
+
if(graphEvent.textContent!==text)graphEvent.textContent=text;
|
|
164
|
+
}
|
|
165
|
+
canvas.dataset.nodes=String(points.size);canvas.dataset.edges=String(edges.length);
|
|
166
|
+
canvas.dataset.pulses=String(routes.length);canvas.dataset.frame=animate&&routes.length?String(Math.round(age)):'static';
|
|
167
|
+
if(animate&&routes.length)surface.raf=requestAnimationFrame(drawGraph);
|
|
168
|
+
}
|
|
169
|
+
function syncGraphControls(){
|
|
170
|
+
const label=$('node-caption'),point=arr(state.graph?.nodes).find(node=>node.id===state.picked);
|
|
171
|
+
if(label){label.hidden=!state.focus||!point||state.listing;label.textContent=point?.label??'';}
|
|
172
|
+
const clear=$('clear-focus');if(clear)clear.hidden=!state.focus;
|
|
173
|
+
$('brain-stage')?.querySelectorAll('[data-node]').forEach(button=>button.setAttribute('aria-pressed',String(button.dataset.node===state.picked&&state.focus)));
|
|
174
|
+
}
|
|
175
|
+
`;
|
|
176
|
+
//# sourceMappingURL=brain-hub-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-hub-graph.js","sourceRoot":"","sources":["../../src/dashboard/brain-hub-graph.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8KxC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-hub-html.d.ts","sourceRoot":"","sources":["../../src/dashboard/brain-hub-html.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,cAAc,QAyBH,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { BRAIN_HUB_CLIENT } from './brain-hub-client.js';
|
|
2
|
+
import { BRAIN_HUB_GRAPH } from './brain-hub-graph.js';
|
|
3
|
+
import { BRAIN_HUB_VIEWS } from './brain-hub-views.js';
|
|
4
|
+
export const BRAIN_HUB_HTML = String.raw `<!doctype html>
|
|
5
|
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="color-scheme" content="dark"><title>Agent Shadow Brain</title>
|
|
6
|
+
<style>
|
|
7
|
+
:root{color-scheme:dark;--ground:#080e19;--surface:#0e1828;--raised:#142237;--border:#263a50;--strong:#425d78;--ink:#ecf5ff;--muted:#a9bed3;--cyan:#78e9e5;--blue:#afc7ff;--pink:#ecb0fc;--amber:#f9d28b;--green:#a0e7be;--red:#ffacb6;--sans:Inter,"Segoe UI",system-ui,sans-serif;--mono:"IBM Plex Mono","Cascadia Mono",Consolas,monospace;font:14px/1.45 var(--sans)}
|
|
8
|
+
*,*::before,*::after{box-sizing:border-box}body{margin:0;background:var(--ground);color:var(--ink)}[hidden]{display:none!important}a{color:var(--cyan)}button,input,select,textarea{font:inherit}button,select{cursor:pointer}button:disabled{cursor:default;opacity:.52}a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,summary:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--cyan);outline-offset:2px}h1,h2,h3,p,ul,ol,dl,dd{margin:0}h1,h2,h3{letter-spacing:-.022em;line-height:1.25}h1{font-size:1.95rem}h2{font-size:1.06rem}h3{font-size:.95rem}p,dd,li,pre,td{overflow-wrap:anywhere}small,.small{font-size:.81rem}.muted{color:var(--muted)}.mono{font-family:var(--mono);font-variant-numeric:tabular-nums}.cyan{color:var(--cyan)}.pink{color:var(--pink)}.amber{color:var(--amber)}.green{color:var(--green)}.red{color:var(--red)}.skip{position:fixed;left:12px;top:8px;z-index:4;transform:translateY(-150%)}.skip:focus{transform:none}
|
|
9
|
+
.frame{max-width:1700px;margin:auto;padding:0 22px 24px}.top,.page-head,.panel-head,.row,.actions,.nav{display:flex;align-items:center;gap:8px}.top,.page-head,.panel-head,.row{justify-content:space-between}.top{min-height:54px;border-bottom:1px solid var(--border);flex-wrap:wrap;padding-block:7px}.brand{display:flex;align-items:center;gap:9px;font-weight:740;white-space:nowrap}.brand svg{width:29px;height:29px;color:var(--cyan)}.actions{flex-wrap:wrap}.nav{margin-bottom:12px;border-bottom:1px solid var(--border);overflow:auto;align-items:stretch;gap:3px;scrollbar-width:thin}.nav button{flex:none;border:0;border-bottom:2px solid transparent;background:none;color:var(--muted);padding:8px 11px;font-size:.9rem;white-space:nowrap}.nav button[aria-current=page],.nav button:hover{color:var(--cyan);border-bottom-color:var(--cyan)}.page-head{margin-bottom:10px}.page-head p{margin-top:4px}.btn,input:not([type=range]),select,textarea{min-width:0;border:1px solid var(--strong);background:var(--raised);color:var(--ink);border-radius:5px;padding:6px 8px}.btn{display:inline-flex;align-items:center;justify-content:center;gap:5px;min-height:32px;text-decoration:none;font-size:.83rem;font-weight:640}.btn:hover,.btn[aria-pressed=true]{background:#203747;border-color:#658c9e}.btn.primary{background:var(--cyan);border-color:var(--cyan);color:#0c252d}.btn.primary:hover{background:#a5f4ed}.btn.quiet{background:transparent;border-color:transparent;color:var(--cyan)}.btn.quiet:hover{background:var(--raised)}.chip{display:inline-flex;align-items:center;gap:5px;background:#203149;border-radius:4px;padding:3px 6px;color:#bfd2e8;font-size:.73rem;font-weight:650;line-height:1.2;max-width:100%}.chip.cyan{background:#153640;color:var(--cyan)}.chip.green{background:#17362b;color:var(--green)}.chip.pink{background:#382847;color:var(--pink)}.chip.amber{background:#392f23;color:var(--amber)}.chip.red{background:#422934;color:var(--red)}.dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:currentColor;flex:none}
|
|
10
|
+
.strip{display:grid;grid-template-columns:1fr 1.05fr 1fr 1.2fr;border:1px solid var(--border);border-radius:7px;background:var(--surface);margin-bottom:10px}.metric{min-width:0;padding:9px 12px}.metric+.metric{border-left:1px solid var(--border)}.metric dt{font-size:.76rem;color:var(--muted)}.metric dd{font-size:1.12rem;font-weight:700;margin:2px 0}.metric small{color:var(--muted);display:block}.metric-trace{width:68px;height:24px;float:right;margin:3px 0 0 6px;opacity:.85}
|
|
11
|
+
.panel{min-width:0;background:var(--surface);border:1px solid var(--border);border-radius:7px;overflow:hidden}.panel-head{min-height:41px;padding:6px 10px;background:#111d30;border-bottom:1px solid var(--border)}.panel-body{padding:10px}.stack{display:grid;gap:10px}.list{list-style:none;padding:0}.list>li+li{border-top:1px solid var(--border)}.item{padding:8px 10px;display:grid;gap:4px}.rail-title{padding:8px 9px;background:#101c2c;border-bottom:1px solid var(--border)}.rail-title:not(:first-child){border-top:1px solid var(--border)}.rail-entry,.entry{width:100%;display:grid;gap:3px;text-align:left;border:0;background:transparent;color:var(--ink);padding:8px 9px;cursor:pointer}.rail-entry:hover,.rail-entry[aria-pressed=true],.entry:hover,.entry[aria-pressed=true]{background:#172c40}.rail-entry strong{font-size:.84rem}.rail-entry small{font-size:.73rem;color:var(--muted)}.empty{padding:12px;display:grid;gap:7px;color:var(--muted)}.empty strong{color:var(--ink)}.notice{padding:9px 11px;border:1px solid #654f37;border-radius:5px;background:#251f1b;color:#ffe1a7;margin:0 0 10px}.notice:empty{display:none}.status{min-height:0;color:var(--green)}.status:empty{display:none}.status[data-error=true]{color:var(--red)}
|
|
12
|
+
.control-grid{display:grid;grid-template-columns:184px minmax(0,1fr) 265px;gap:10px;margin-bottom:10px}.control-grid>.rail,.control-grid>.inspect{overflow:auto;min-height:0}.graph-panel{display:flex;flex-direction:column;background:#080f1d;border-color:#344d68}.graph-stage{position:relative;isolation:isolate;flex:1;min-height:375px;overflow:hidden;background:radial-gradient(ellipse at 50% 49%,#182641 0%,#0e192d 39%,#090f1d 77%)}#brain-canvas{position:absolute;inset:0;width:100%;height:100%;display:block}.graph-meta{position:absolute;left:12px;right:12px;top:11px;display:flex;justify-content:space-between;gap:10px;font:.71rem var(--mono);color:var(--muted);pointer-events:none}.graph-empty{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:min(290px,90%);padding:10px 12px;background:#0e192ceb;border:1px solid #455e7e;border-radius:6px;text-align:center}.graph-empty .actions{justify-content:center;margin-top:6px}.graph-foot{display:flex;align-items:center;justify-content:space-between;gap:6px;flex-wrap:wrap;border-top:1px solid var(--border);background:#0e1828;color:var(--muted);padding:5px 8px;min-height:31px;font-size:.74rem}.legend{display:flex;gap:8px;flex-wrap:wrap}.legend span{display:flex;align-items:center;gap:4px}.legend i{display:inline-block;width:11px;border-top:2px solid currentColor}.node-list{position:absolute;inset:6px;overflow:auto;background:#0d182bef;border:1px solid var(--strong);z-index:1}.node-list>li+li{border-top:1px solid var(--border)}.focus-label{position:absolute;left:50%;bottom:10px;transform:translateX(-50%);max-width:92%;padding:4px 8px;background:#122136;border:1px solid #486787;border-radius:4px;overflow-wrap:anywhere;color:var(--ink);font-size:.76rem;text-align:center;pointer-events:none}.tabs{display:flex;flex-wrap:wrap;gap:4px;border-bottom:1px solid var(--border);padding:6px 7px}.tabs .btn{min-height:26px;padding-block:3px}.facts{display:grid;gap:0}.facts>div{display:flex;justify-content:space-between;gap:9px;border-bottom:1px solid var(--border);padding:6px 0;font-size:.81rem}.facts dt{color:var(--muted)}.facts dd{text-align:right}.receipt{display:grid;gap:5px;border:1px solid var(--border);border-radius:5px;padding:8px;background:#121e30}.lower{display:grid;grid-template-columns:minmax(235px,.8fr) minmax(0,1.8fr);gap:10px}.timeline{max-height:106px;overflow:auto}.event{grid-template-columns:76px minmax(0,1fr) auto;align-items:center;font-size:.8rem;min-height:29px;padding-block:5px}.event time{color:var(--muted)}.replay{padding:5px 8px;display:flex;align-items:center;gap:8px;border-bottom:1px solid var(--border)}.replay input{min-width:35px;flex:1;accent-color:var(--cyan)}.replay output{min-width:6em;text-align:right}.two{display:grid;grid-template-columns:minmax(220px,.85fr) minmax(0,1.45fr);gap:10px;align-items:start}.three{display:grid;grid-template-columns:minmax(150px,.64fr) minmax(0,1.45fr) minmax(220px,.9fr);gap:10px;align-items:start}.form{display:grid;gap:8px}.form label{display:grid;gap:3px;color:var(--muted);font-size:.83rem}.form :is(input,select,textarea){width:100%}.form textarea{resize:vertical}.form input[type=checkbox]{width:auto}.form .check{display:flex;gap:7px;align-items:flex-start}.form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}pre{margin:0;padding:9px;border:1px solid var(--border);background:#091321;border-radius:4px;white-space:pre-wrap;max-height:250px;overflow:auto;color:#d7e9ff;font:.81rem/1.5 var(--mono)}.section-list{max-height:480px;overflow:auto}.section-list .entry strong{font-size:.86rem}.table-wrap{overflow:auto}table{width:100%;border-collapse:collapse;font-size:.84rem}td,th{padding:7px 9px;border-bottom:1px solid var(--border);text-align:left;vertical-align:top}th{color:var(--muted)}.meter{height:5px;border-radius:4px;background:#2b3c53;overflow:hidden}.meter i{display:block;height:100%;background:var(--pink)}.footer{display:flex;justify-content:space-between;flex-wrap:wrap;gap:8px;margin-top:10px;color:var(--muted);font-size:.77rem}details>summary{cursor:pointer;color:var(--cyan)}details[open]>summary{margin-bottom:7px}.trace-list{position:absolute;inset:0;overflow:auto;background:#0e1929}.trace-list .event{grid-template-columns:76px minmax(0,1fr) auto}
|
|
13
|
+
@media(min-width:981px){.control-grid{grid-template-rows:429px}.graph-stage{min-height:0}}
|
|
14
|
+
@media(max-width:1200px){.control-grid{grid-template-columns:153px minmax(0,1fr) 235px}.frame{padding-inline:14px}}
|
|
15
|
+
@media(max-width:980px){.control-grid{grid-template-columns:145px minmax(0,1fr)}.control-grid>.inspect{grid-column:1/-1}.three{grid-template-columns:minmax(145px,.6fr) minmax(0,1.4fr)}.three>.panel:last-child{grid-column:1/-1}}
|
|
16
|
+
@media(max-width:680px){.frame{padding-inline:10px}.top,.page-head{flex-wrap:wrap}.top .actions{width:100%}.nav{margin-bottom:10px}.strip{grid-template-columns:repeat(2,minmax(0,1fr))}.metric:nth-child(3){border-left:0}.metric:nth-child(n+3){border-top:1px solid var(--border)}.control-grid,.lower,.two,.three{grid-template-columns:minmax(0,1fr)}.graph-panel{grid-row:1}.graph-stage{min-height:320px}.control-grid>.rail{max-height:240px}.event{grid-template-columns:61px minmax(0,1fr)}.event .chip{justify-self:start;grid-column:2}.graph-meta{font-size:.62rem}h1{font-size:1.65rem}}
|
|
17
|
+
@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation:none!important;transition:none!important}}
|
|
18
|
+
</style></head><body>
|
|
19
|
+
<a class="btn skip" href="#main">Skip to content</a>
|
|
20
|
+
<div class="frame"><header class="top"><div class="brand"><svg viewBox="0 0 32 32" aria-hidden="true"><path d="M16 2 28 9v14l-12 7-12-7V9Zm0 0v28M4 9l24 14M28 9 4 23" fill="none" stroke="currentColor" stroke-width="1.4"/><circle cx="16" cy="16" r="3.3" fill="currentColor"/></svg>Agent Shadow Brain</div><div class="actions"><span class="chip" id="connection"><i class="dot" aria-hidden="true"></i> Connecting to workspace</span><label for="project" class="small muted">Project</label><select id="project" disabled><option>Loading…</option></select><button class="btn" id="reload" type="button">Refresh</button></div></header>
|
|
21
|
+
<nav class="nav" id="nav" aria-label="Brain workspace"></nav>
|
|
22
|
+
<p class="notice" id="notice" role="status"></p>
|
|
23
|
+
<main id="main" tabindex="-1"><div class="empty"><strong>Opening the workspace</strong><p>Loading the local memory and activity stores.</p></div></main>
|
|
24
|
+
<footer class="footer"><span id="scope-note"></span><span><a href="/workspace">Classic workspace</a> · <a href="/live">Activity diagnostics</a></span></footer>
|
|
25
|
+
</div>
|
|
26
|
+
<script>'use strict';
|
|
27
|
+
` + BRAIN_HUB_CLIENT + BRAIN_HUB_GRAPH + BRAIN_HUB_VIEWS + String.raw `
|
|
28
|
+
start();
|
|
29
|
+
</script></body></html>`;
|
|
30
|
+
//# sourceMappingURL=brain-hub-html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-hub-html.js","sourceRoot":"","sources":["../../src/dashboard/brain-hub-html.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;CAuBvC,GAAG,gBAAgB,GAAG,eAAe,GAAG,eAAe,GAAG,MAAM,CAAC,GAAG,CAAA;;wBAE7C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-hub-project-views.d.ts","sourceRoot":"","sources":["../../src/dashboard/brain-hub-project-views.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,QA6EnC,CAAC"}
|