@theihtisham/agent-shadow-brain 7.1.4 → 7.22.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/CHANGELOG.md +478 -462
- package/README.md +97 -24
- package/dist/brain/auto-update.js +1 -1
- package/dist/brain/auto-update.js.map +1 -1
- package/dist/brain/brain-portability.js +1 -1
- package/dist/brain/brain-portability.js.map +1 -1
- package/dist/brain/client-integrations.js +1 -1
- package/dist/brain/client-integrations.js.map +1 -1
- package/dist/brain/context-assembly.d.ts +10 -0
- package/dist/brain/context-assembly.d.ts.map +1 -1
- package/dist/brain/context-assembly.js +15 -6
- package/dist/brain/context-assembly.js.map +1 -1
- package/dist/brain/context-efficiency.d.ts +48 -0
- package/dist/brain/context-efficiency.d.ts.map +1 -0
- package/dist/brain/context-efficiency.js +34 -0
- package/dist/brain/context-efficiency.js.map +1 -0
- package/dist/brain/context-request.d.ts +1 -1
- package/dist/brain/context-request.d.ts.map +1 -1
- package/dist/brain/context-request.js +4 -2
- package/dist/brain/context-request.js.map +1 -1
- package/dist/brain/context-retrieval.d.ts +1 -1
- package/dist/brain/context-retrieval.d.ts.map +1 -1
- package/dist/brain/context-retrieval.js +2 -1
- package/dist/brain/context-retrieval.js.map +1 -1
- package/dist/brain/feature-settings.d.ts +5 -0
- package/dist/brain/feature-settings.d.ts.map +1 -1
- package/dist/brain/feature-settings.js +8 -2
- package/dist/brain/feature-settings.js.map +1 -1
- package/dist/brain/global-brain.d.ts +1 -1
- package/dist/brain/global-brain.d.ts.map +1 -1
- package/dist/brain/global-brain.js +1 -0
- package/dist/brain/global-brain.js.map +1 -1
- package/dist/brain/managed-project-skills.d.ts +48 -0
- package/dist/brain/managed-project-skills.d.ts.map +1 -0
- package/dist/brain/managed-project-skills.js +230 -0
- package/dist/brain/managed-project-skills.js.map +1 -0
- package/dist/brain/mcp-presence.d.ts +50 -0
- package/dist/brain/mcp-presence.d.ts.map +1 -0
- package/dist/brain/mcp-presence.js +214 -0
- package/dist/brain/mcp-presence.js.map +1 -0
- package/dist/brain/mcp-server.d.ts +12 -0
- package/dist/brain/mcp-server.d.ts.map +1 -1
- package/dist/brain/mcp-server.js +177 -31
- package/dist/brain/mcp-server.js.map +1 -1
- package/dist/brain/mcp-stdio.d.ts +1 -1
- package/dist/brain/mcp-stdio.d.ts.map +1 -1
- package/dist/brain/mcp-stdio.js +19 -1
- package/dist/brain/mcp-stdio.js.map +1 -1
- package/dist/brain/memory-annotations.d.ts +2 -0
- package/dist/brain/memory-annotations.d.ts.map +1 -1
- package/dist/brain/memory-annotations.js +13 -0
- package/dist/brain/memory-annotations.js.map +1 -1
- package/dist/brain/memory-inspection.d.ts +1 -0
- package/dist/brain/memory-inspection.d.ts.map +1 -1
- package/dist/brain/memory-inspection.js +1 -1
- package/dist/brain/memory-inspection.js.map +1 -1
- package/dist/brain/memory-mcp-content.d.ts +4 -2
- package/dist/brain/memory-mcp-content.d.ts.map +1 -1
- package/dist/brain/memory-mcp-content.js +20 -16
- package/dist/brain/memory-mcp-content.js.map +1 -1
- package/dist/brain/model-registry.d.ts +4 -5
- package/dist/brain/model-registry.d.ts.map +1 -1
- package/dist/brain/model-registry.js +22 -207
- package/dist/brain/model-registry.js.map +1 -1
- package/dist/brain/model-usage.d.ts +66 -0
- package/dist/brain/model-usage.d.ts.map +1 -0
- package/dist/brain/model-usage.js +246 -0
- package/dist/brain/model-usage.js.map +1 -0
- package/dist/brain/native-codex.d.ts +105 -0
- package/dist/brain/native-codex.d.ts.map +1 -0
- package/dist/brain/native-codex.js +292 -0
- package/dist/brain/native-codex.js.map +1 -0
- package/dist/brain/native-session-import.d.ts +56 -0
- package/dist/brain/native-session-import.d.ts.map +1 -0
- package/dist/brain/native-session-import.js +307 -0
- package/dist/brain/native-session-import.js.map +1 -0
- package/dist/brain/orchestrator.js +1 -1
- package/dist/brain/orchestrator.js.map +1 -1
- package/dist/brain/project-feedback.d.ts +1 -1
- package/dist/brain/project-feedback.d.ts.map +1 -1
- package/dist/brain/project-feedback.js +19 -8
- package/dist/brain/project-feedback.js.map +1 -1
- package/dist/brain/project-hub-contract.d.ts +6 -0
- package/dist/brain/project-hub-contract.d.ts.map +1 -1
- package/dist/brain/project-hub-contract.js +2 -1
- package/dist/brain/project-hub-contract.js.map +1 -1
- package/dist/brain/project-hub-mcp.d.ts +14 -0
- package/dist/brain/project-hub-mcp.d.ts.map +1 -1
- package/dist/brain/project-hub-mcp.js +6 -1
- package/dist/brain/project-hub-mcp.js.map +1 -1
- package/dist/brain/project-hub-store.d.ts +14 -2
- package/dist/brain/project-hub-store.d.ts.map +1 -1
- package/dist/brain/project-hub-store.js +70 -2
- package/dist/brain/project-hub-store.js.map +1 -1
- package/dist/brain/project-hub.d.ts +5 -0
- package/dist/brain/project-hub.d.ts.map +1 -1
- package/dist/brain/project-hub.js +23 -1
- package/dist/brain/project-hub.js.map +1 -1
- package/dist/brain/project-kit.d.ts +10 -0
- package/dist/brain/project-kit.d.ts.map +1 -1
- package/dist/brain/project-kit.js +80 -16
- package/dist/brain/project-kit.js.map +1 -1
- package/dist/brain/project-policy-delivery.d.ts +8 -0
- package/dist/brain/project-policy-delivery.d.ts.map +1 -0
- package/dist/brain/project-policy-delivery.js +38 -0
- package/dist/brain/project-policy-delivery.js.map +1 -0
- package/dist/brain/project-policy.d.ts +88 -0
- package/dist/brain/project-policy.d.ts.map +1 -0
- package/dist/brain/project-policy.js +267 -0
- package/dist/brain/project-policy.js.map +1 -0
- package/dist/brain/project-session-contract.d.ts +180 -0
- package/dist/brain/project-session-contract.d.ts.map +1 -0
- package/dist/brain/project-session-contract.js +50 -0
- package/dist/brain/project-session-contract.js.map +1 -0
- package/dist/brain/project-session-mcp.d.ts +145 -0
- package/dist/brain/project-session-mcp.d.ts.map +1 -0
- package/dist/brain/project-session-mcp.js +58 -0
- package/dist/brain/project-session-mcp.js.map +1 -0
- package/dist/brain/project-sessions.d.ts +97 -0
- package/dist/brain/project-sessions.d.ts.map +1 -0
- package/dist/brain/project-sessions.js +223 -0
- package/dist/brain/project-sessions.js.map +1 -0
- package/dist/brain/project-source-contract.d.ts +109 -0
- package/dist/brain/project-source-contract.d.ts.map +1 -0
- package/dist/brain/project-source-contract.js +2 -0
- package/dist/brain/project-source-contract.js.map +1 -0
- package/dist/brain/project-source-intake.d.ts +26 -0
- package/dist/brain/project-source-intake.d.ts.map +1 -0
- package/dist/brain/project-source-intake.js +457 -0
- package/dist/brain/project-source-intake.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/context-cli.d.ts.map +1 -1
- package/dist/context-cli.js +9 -3
- package/dist/context-cli.js.map +1 -1
- package/dist/dashboard/brain-hub-actions.d.ts.map +1 -1
- package/dist/dashboard/brain-hub-actions.js +232 -135
- package/dist/dashboard/brain-hub-actions.js.map +1 -1
- package/dist/dashboard/brain-hub-agent-dock.d.ts +2 -0
- package/dist/dashboard/brain-hub-agent-dock.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-agent-dock.js +255 -0
- package/dist/dashboard/brain-hub-agent-dock.js.map +1 -0
- package/dist/dashboard/brain-hub-brand-icons.d.ts +2 -0
- package/dist/dashboard/brain-hub-brand-icons.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-brand-icons.js +9 -0
- package/dist/dashboard/brain-hub-brand-icons.js.map +1 -0
- package/dist/dashboard/brain-hub-client.d.ts.map +1 -1
- package/dist/dashboard/brain-hub-client.js +433 -333
- package/dist/dashboard/brain-hub-client.js.map +1 -1
- package/dist/dashboard/brain-hub-context.d.ts +2 -0
- package/dist/dashboard/brain-hub-context.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-context.js +37 -0
- package/dist/dashboard/brain-hub-context.js.map +1 -0
- package/dist/dashboard/brain-hub-controls.d.ts +2 -0
- package/dist/dashboard/brain-hub-controls.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-controls.js +63 -0
- package/dist/dashboard/brain-hub-controls.js.map +1 -0
- package/dist/dashboard/brain-hub-exchanges.d.ts +2 -0
- package/dist/dashboard/brain-hub-exchanges.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-exchanges.js +82 -0
- package/dist/dashboard/brain-hub-exchanges.js.map +1 -0
- package/dist/dashboard/brain-hub-graph.d.ts.map +1 -1
- package/dist/dashboard/brain-hub-graph.js +236 -74
- package/dist/dashboard/brain-hub-graph.js.map +1 -1
- package/dist/dashboard/brain-hub-html.d.ts.map +1 -1
- package/dist/dashboard/brain-hub-html.js +56 -1
- package/dist/dashboard/brain-hub-html.js.map +1 -1
- package/dist/dashboard/brain-hub-knowledge.d.ts +2 -0
- package/dist/dashboard/brain-hub-knowledge.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-knowledge.js +33 -0
- package/dist/dashboard/brain-hub-knowledge.js.map +1 -0
- package/dist/dashboard/brain-hub-live.d.ts +2 -0
- package/dist/dashboard/brain-hub-live.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-live.js +151 -0
- package/dist/dashboard/brain-hub-live.js.map +1 -0
- package/dist/dashboard/brain-hub-managed-skills.d.ts +2 -0
- package/dist/dashboard/brain-hub-managed-skills.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-managed-skills.js +20 -0
- package/dist/dashboard/brain-hub-managed-skills.js.map +1 -0
- package/dist/dashboard/brain-hub-native.d.ts +2 -0
- package/dist/dashboard/brain-hub-native.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-native.js +44 -0
- package/dist/dashboard/brain-hub-native.js.map +1 -0
- package/dist/dashboard/brain-hub-project-views.d.ts.map +1 -1
- package/dist/dashboard/brain-hub-project-views.js +78 -77
- package/dist/dashboard/brain-hub-project-views.js.map +1 -1
- package/dist/dashboard/brain-hub-sessions.d.ts +2 -0
- package/dist/dashboard/brain-hub-sessions.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-sessions.js +40 -0
- package/dist/dashboard/brain-hub-sessions.js.map +1 -0
- package/dist/dashboard/brain-hub-usage.d.ts +2 -0
- package/dist/dashboard/brain-hub-usage.d.ts.map +1 -0
- package/dist/dashboard/brain-hub-usage.js +28 -0
- package/dist/dashboard/brain-hub-usage.js.map +1 -0
- package/dist/dashboard/brain-hub-views.d.ts.map +1 -1
- package/dist/dashboard/brain-hub-views.js +151 -146
- package/dist/dashboard/brain-hub-views.js.map +1 -1
- package/dist/dashboard/live-workspace-html.js +1039 -1039
- package/dist/dashboard/managed-project-skills-api.d.ts +29 -0
- package/dist/dashboard/managed-project-skills-api.d.ts.map +1 -0
- package/dist/dashboard/managed-project-skills-api.js +28 -0
- package/dist/dashboard/managed-project-skills-api.js.map +1 -0
- package/dist/dashboard/native-codex-api.d.ts +83 -0
- package/dist/dashboard/native-codex-api.d.ts.map +1 -0
- package/dist/dashboard/native-codex-api.js +91 -0
- package/dist/dashboard/native-codex-api.js.map +1 -0
- package/dist/dashboard/project-file-watch.d.ts +46 -0
- package/dist/dashboard/project-file-watch.d.ts.map +1 -0
- package/dist/dashboard/project-file-watch.js +221 -0
- package/dist/dashboard/project-file-watch.js.map +1 -0
- package/dist/dashboard/project-live-stream.d.ts +33 -0
- package/dist/dashboard/project-live-stream.d.ts.map +1 -0
- package/dist/dashboard/project-live-stream.js +233 -0
- package/dist/dashboard/project-live-stream.js.map +1 -0
- package/dist/dashboard/project-policy-api.d.ts +37 -0
- package/dist/dashboard/project-policy-api.d.ts.map +1 -0
- package/dist/dashboard/project-policy-api.js +31 -0
- package/dist/dashboard/project-policy-api.js.map +1 -0
- package/dist/dashboard/project-session-api.d.ts +28 -0
- package/dist/dashboard/project-session-api.d.ts.map +1 -0
- package/dist/dashboard/project-session-api.js +84 -0
- package/dist/dashboard/project-session-api.js.map +1 -0
- package/dist/dashboard/project-source-api.d.ts +11 -0
- package/dist/dashboard/project-source-api.d.ts.map +1 -0
- package/dist/dashboard/project-source-api.js +67 -0
- package/dist/dashboard/project-source-api.js.map +1 -0
- package/dist/dashboard/project-workspace.d.ts.map +1 -1
- package/dist/dashboard/project-workspace.js +18 -0
- package/dist/dashboard/project-workspace.js.map +1 -1
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +64 -25
- 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 +4261 -4309
- package/dist/dashboard/v6-dashboard-html.js.map +1 -1
- package/dist/dashboard/workspace-api.d.ts.map +1 -1
- package/dist/dashboard/workspace-api.js +105 -23
- package/dist/dashboard/workspace-api.js.map +1 -1
- package/dist/dashboard/workspace-status.d.ts +3 -0
- package/dist/dashboard/workspace-status.d.ts.map +1 -1
- package/dist/dashboard/workspace-status.js +4 -3
- package/dist/dashboard/workspace-status.js.map +1 -1
- package/dist/project-cli.js +1 -1
- package/dist/project-cli.js.map +1 -1
- package/docs/BRAND_ASSETS.md +36 -0
- package/docs/FEATURES_AND_LIMITS.md +29 -24
- package/docs/INTEGRATIONS.md +4 -2
- package/docs/LEARNING.md +1 -1
- package/docs/PROJECT_KIT.md +6 -1
- package/docs/QUICKSTART.md +62 -44
- package/docs/README.md +36 -33
- package/docs/SESSIONS.md +77 -0
- package/docs/SOURCE_INTAKE.md +33 -0
- package/docs/STATS.md +21 -21
- package/docs/VISUAL_GUIDE_v7.22.0.md +73 -0
- package/docs/WORKFLOW_INTEGRATION.md +3 -1
- package/docs/WORKSPACE.md +63 -37
- package/docs/assets/7.22.0-agent-dock-mobile.png +0 -0
- package/docs/assets/7.22.0-agent-dock.gif +0 -0
- package/docs/assets/7.22.0-agent-dock.png +0 -0
- package/docs/assets/7.22.0-hub-exchange.png +0 -0
- package/docs/assets/7.22.0-hub-exchanges.gif +0 -0
- package/docs/assets/7.22.0-hub-graph.png +0 -0
- package/docs/assets/7.22.0-hub-mobile-empty.png +0 -0
- package/docs/assets/7.22.0-managed-skills.png +0 -0
- package/docs/assets/7.22.0-plain-evidence.png +0 -0
- package/docs/assets/7.22.0-project-controls.png +0 -0
- package/docs/assets/7.22.0-sessions.png +0 -0
- package/docs/assets/7.22.0-teach-brain.png +0 -0
- package/docs/launch/RELEASE_ACCEPTANCE_v7.22.0.md +48 -0
- package/docs/launch/RELEASE_NOTES_v7.22.0.md +53 -0
- package/docs/launch/RESEARCH_AND_PLAN_v7.22.0.md +672 -0
- package/package.json +135 -130
- package/skills/shadow-workflow/SKILL.md +2 -0
|
@@ -1,37 +1,133 @@
|
|
|
1
1
|
export const BRAIN_HUB_GRAPH = String.raw `
|
|
2
2
|
const tones={project:'124,233,232',memory:'172,199,255',agent:'234,172,249',measured:'124,233,232',reported:'250,208,140'};
|
|
3
|
+
const relationColors={supports:'91,209,221',related:'119,165,221',contradicts:'227,175,119',supersedes:'150,154,222'};
|
|
4
|
+
const graphMemoryLimit='500';
|
|
3
5
|
let graphSurface=null;
|
|
6
|
+
const defaultCamera=()=>({scale:1,x:0,y:0});
|
|
7
|
+
let graphCamera=defaultCamera();
|
|
8
|
+
function graphFinderResults(){
|
|
9
|
+
const search=state.search;
|
|
10
|
+
if(!search)return '<div class="graph-results" id="graph-results">'+list(arr(state.graph?.nodes).map(node=>
|
|
11
|
+
'<li><button class="entry" type="button" data-node="'+esc(node.id)+'" aria-pressed="'+(state.focus&&state.picked===node.id)+'"><strong>'+
|
|
12
|
+
esc(node.kind==='agent'?hostName(node.label):node.label)+'</strong><small class="muted">'+esc(node.kind+(node.category?' · '+node.category:''))+'</small></button></li>').join(''),
|
|
13
|
+
'aria-label="Displayed graph records"')+'</div>';
|
|
14
|
+
const items=arr(search.items);
|
|
15
|
+
return '<div class="graph-results" id="graph-results" aria-busy="'+!!search.loading+'"><p class="small muted graph-search-note" role="status">'+
|
|
16
|
+
esc(search.error??(search.loading?'Searching stored memories…':items.length?fmt(items.length)+' of '+fmt(search.total)+' matches'+(search.truncated?' · bounded inventory':''):'No matching memories in this scope.'))+'</p>'+
|
|
17
|
+
(items.length?list(items.map(item=>'<li><button class="entry" type="button" data-graph-memory="'+esc(item.id)+'" data-graph-project="'+esc(item.project)+
|
|
18
|
+
'"><strong>'+esc(item.title||item.id)+'</strong><small class="muted">'+esc(item.category+' · '+hostName(item.agent)+(item.projectName?' · '+item.projectName:''))+'</small></button></li>').join(''),'aria-label="Stored memory search results"'):'')+'</div>';
|
|
19
|
+
}
|
|
20
|
+
function graphFinderMarkup(hidden){
|
|
21
|
+
return '<div id="node-list" class="node-list graph-finder" '+(hidden?'hidden':'')+'><form id="graph-find-form" class="graph-find" role="search" aria-label="Find stored memories">'+
|
|
22
|
+
'<label for="graph-search" class="sr-only">Find stored memories in this scope</label><input id="graph-search" name="query" type="search" value="'+esc(state.search?.query)+
|
|
23
|
+
'" placeholder="Search all stored memories" maxlength="180"><button class="btn" type="submit">Search</button>'+action('clear-graph-search','Clear','quiet')+
|
|
24
|
+
'</form>'+graphFinderResults()+'</div>';
|
|
25
|
+
}
|
|
26
|
+
async function findGraphMemories(query){
|
|
27
|
+
const epoch=state.dataEpoch;
|
|
28
|
+
const search=query?{query,loading:true}:null;
|
|
29
|
+
state.search=search;
|
|
30
|
+
const field=$('graph-search'),results=$('graph-results');
|
|
31
|
+
if(field)field.value=query;
|
|
32
|
+
if(results)results.outerHTML=graphFinderResults();
|
|
33
|
+
if(!search)return;
|
|
34
|
+
try{Object.assign(search,await api('memories'+projectQuery({q:query,limit:'30'})));}
|
|
35
|
+
catch(failure){search.error=failure.message;}
|
|
36
|
+
if(epoch!==state.dataEpoch||state.search!==search)return;
|
|
37
|
+
search.loading=false;
|
|
38
|
+
const result=$('graph-results');
|
|
39
|
+
if(result)result.outerHTML=graphFinderResults();
|
|
40
|
+
}
|
|
41
|
+
async function focusGraphMemory(id,project){
|
|
42
|
+
const dataEpoch=state.dataEpoch,graphEpoch=++state.graphEpoch;
|
|
43
|
+
const query=projectQuery({limit:graphMemoryLimit,memory:id});
|
|
44
|
+
try{
|
|
45
|
+
const graph=await api('graph'+query);
|
|
46
|
+
if(dataEpoch!==state.dataEpoch||graphEpoch!==state.graphEpoch||state.view!=='overview')return;
|
|
47
|
+
if(!arr(graph.nodes).some(node=>node.memoryId===id&&node.project===project))throw new Error('The memory is no longer available in this scope.');
|
|
48
|
+
state.graphEpoch++;state.graph=graph;state.listing=false;render();
|
|
49
|
+
const details=chooseMemory('memory:'+id);
|
|
50
|
+
$('main').querySelector('[data-inspect=record]')?.focus({preventScroll:true});
|
|
51
|
+
await details;
|
|
52
|
+
}catch(failure){if(dataEpoch===state.dataEpoch&&graphEpoch===state.graphEpoch&&state.view==='overview')status(failure.message,true);}
|
|
53
|
+
}
|
|
54
|
+
function filterGraph(value){
|
|
55
|
+
if(!['all','project','author','typed'].includes(value))return;
|
|
56
|
+
state.graphFilter=value;
|
|
57
|
+
drawGraph();syncGraphControls();
|
|
58
|
+
}
|
|
59
|
+
const graphCoordinates=(surface,x,y)=>({x:(x-surface.width/2-graphCamera.x)/graphCamera.scale+surface.width/2,
|
|
60
|
+
y:(y-surface.height/2-graphCamera.y)/graphCamera.scale+surface.height/2});
|
|
61
|
+
function boundCamera(surface){
|
|
62
|
+
const dx=(graphCamera.scale-1)*surface.width/2,dy=(graphCamera.scale-1)*surface.height/2;
|
|
63
|
+
graphCamera.x=Math.max(-dx,Math.min(dx,graphCamera.x));
|
|
64
|
+
graphCamera.y=Math.max(-dy,Math.min(dy,graphCamera.y));
|
|
65
|
+
}
|
|
66
|
+
function zoomGraph(direction){
|
|
67
|
+
if(!graphSurface)return;
|
|
68
|
+
const before=graphCamera.scale;
|
|
69
|
+
const scale=direction==='fit'?1:Math.round(Math.max(1,Math.min(3,before+direction*.5))*10)/10;
|
|
70
|
+
const point=state.focus&&graphSurface.points.get(state.picked);
|
|
71
|
+
if(point){
|
|
72
|
+
const x=point.x-graphSurface.width/2,y=point.y-graphSurface.height/2;
|
|
73
|
+
graphCamera={scale,x:graphCamera.x+x*(before-scale),y:graphCamera.y+y*(before-scale)};
|
|
74
|
+
}else graphCamera.scale=scale;
|
|
75
|
+
boundCamera(graphSurface);drawGraph();syncGraphControls();
|
|
76
|
+
}
|
|
4
77
|
function rand(seed){return ()=>{seed=(Math.imul(seed,1664525)+1013904223)>>>0;return seed/4294967296;};}
|
|
5
78
|
function hash(id){let value=2166136261;for(const char of id)value=Math.imul(value^char.charCodeAt(0),16777619);return value>>>0;}
|
|
6
79
|
function mountGraph(){
|
|
7
80
|
const canvas=$('brain-canvas'),stage=$('brain-stage');
|
|
8
81
|
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,
|
|
82
|
+
const ctx=canvas.getContext('2d'),layer=document.createElement('canvas'),layerContext=layer.getContext('2d');
|
|
83
|
+
if(!ctx||!layerContext)return;
|
|
84
|
+
const surface={canvas,stage,ctx,layer,layerContext,width:0,height:0,raf:0,observer:null,
|
|
85
|
+
points:new Map(),edges:[],snapshot:undefined,counts:{},drag:null,layerKey:''};
|
|
12
86
|
graphSurface=surface;
|
|
13
87
|
surface.observer=new ResizeObserver(()=>resizeGraph(surface));
|
|
14
88
|
surface.observer.observe(stage);
|
|
15
89
|
resizeGraph(surface);
|
|
16
90
|
function hit(event){
|
|
17
91
|
const box=canvas.getBoundingClientRect();
|
|
18
|
-
const x=event.clientX-box.left,
|
|
19
|
-
let best=null,distance=
|
|
92
|
+
const {x,y}=graphCoordinates(surface,event.clientX-box.left,event.clientY-box.top);
|
|
93
|
+
let best=null,distance=15/graphCamera.scale;
|
|
20
94
|
for(const point of surface.points.values()){
|
|
21
95
|
const d=Math.hypot(x-point.x,y-point.y);
|
|
22
96
|
if(d<distance){best=point;distance=d;}
|
|
23
97
|
}
|
|
24
98
|
return best;
|
|
25
99
|
}
|
|
100
|
+
canvas.addEventListener('pointerdown',event=>{
|
|
101
|
+
if(event.button!==0||event.pointerType==='touch'||graphCamera.scale===1)return;
|
|
102
|
+
surface.drag={id:event.pointerId,x:event.clientX,y:event.clientY,
|
|
103
|
+
fromX:graphCamera.x,fromY:graphCamera.y,moved:false};
|
|
104
|
+
});
|
|
26
105
|
canvas.addEventListener('pointermove',event=>{
|
|
106
|
+
const drag=surface.drag;
|
|
107
|
+
if(drag?.id===event.pointerId){
|
|
108
|
+
const dx=event.clientX-drag.x,dy=event.clientY-drag.y;
|
|
109
|
+
if(drag.moved||Math.hypot(dx,dy)>4){
|
|
110
|
+
if(!drag.moved)canvas.setPointerCapture(event.pointerId);
|
|
111
|
+
drag.moved=true;graphCamera.x=drag.fromX+dx;graphCamera.y=drag.fromY+dy;
|
|
112
|
+
boundCamera(surface);canvas.style.cursor='grabbing';drawGraph();return;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
27
115
|
const point=hit(event);
|
|
28
|
-
canvas.style.cursor=point?'pointer':'default';
|
|
116
|
+
canvas.style.cursor=point?'pointer':graphCamera.scale>1?'grab':'default';
|
|
29
117
|
const caption=$('node-caption');
|
|
30
118
|
if(caption&&point){caption.hidden=false;caption.textContent=point.kind==='agent'?hostName(point.label):point.label;}
|
|
31
119
|
else syncGraphControls();
|
|
32
120
|
});
|
|
33
|
-
canvas.addEventListener('pointerleave',syncGraphControls);
|
|
34
|
-
canvas.addEventListener('
|
|
121
|
+
canvas.addEventListener('pointerleave',()=>{if(!surface.drag?.moved)surface.drag=null;syncGraphControls();});
|
|
122
|
+
canvas.addEventListener('pointercancel',()=>{surface.drag=null;});
|
|
123
|
+
canvas.addEventListener('pointerup',event=>{
|
|
124
|
+
const moved=surface.drag?.moved;surface.drag=null;
|
|
125
|
+
canvas.style.cursor=graphCamera.scale>1?'grab':'default';
|
|
126
|
+
if(moved||event.button!==0)return;
|
|
127
|
+
const point=hit(event);
|
|
128
|
+
if(point)void chooseMemory(point.id);
|
|
129
|
+
});
|
|
130
|
+
syncGraphControls();
|
|
35
131
|
}
|
|
36
132
|
function unmountGraph(){
|
|
37
133
|
if(!graphSurface)return;
|
|
@@ -44,55 +140,87 @@ function resizeGraph(surface){
|
|
|
44
140
|
const {stage,canvas,ctx}=surface;
|
|
45
141
|
const size=stage.getBoundingClientRect(),dpr=Math.min(devicePixelRatio,1.75);
|
|
46
142
|
if(!size.width||!size.height)return;
|
|
47
|
-
surface.width=size.width;surface.height=size.height;surface.snapshot=undefined;
|
|
143
|
+
surface.width=size.width;surface.height=size.height;surface.snapshot=undefined;boundCamera(surface);
|
|
48
144
|
canvas.width=Math.round(size.width*dpr);
|
|
49
145
|
canvas.height=Math.round(size.height*dpr);
|
|
146
|
+
surface.layer.width=canvas.width;surface.layer.height=canvas.height;
|
|
147
|
+
surface.layerContext.setTransform(dpr,0,0,dpr,0,0);
|
|
148
|
+
surface.layerKey='';
|
|
50
149
|
ctx.setTransform(dpr,0,0,dpr,0,0);
|
|
51
150
|
drawGraph();
|
|
52
151
|
}
|
|
53
|
-
function brainFrame(width,height){return {x:width*.50,y:height*.
|
|
54
|
-
function
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
152
|
+
function brainFrame(width,height){return {x:width*.50,y:height*.49,rx:Math.min(width*.34,height*.70),ry:Math.min(height*.42,width*.255)};}
|
|
153
|
+
function brainShell(angle){
|
|
154
|
+
const x=Math.cos(angle),y=Math.sin(angle);
|
|
155
|
+
const contour=1+.044*Math.cos(3*angle+.7)+.036*Math.cos(5*angle-.7)+.018*Math.sin(9*angle);
|
|
156
|
+
return {x:x*contour,y:y*contour*(y>0?.91+.12*x:1.02)-.07*x};
|
|
157
|
+
}
|
|
158
|
+
function brainProjection(frame,x,y,z){
|
|
159
|
+
const tilt=-.16,scale=1+.067*z;
|
|
160
|
+
const across=frame.rx*(x*scale+.10*z),down=frame.ry*(y*scale-.12*z);
|
|
161
|
+
return {x:frame.x+across*Math.cos(tilt)-down*Math.sin(tilt),y:frame.y+across*Math.sin(tilt)+down*Math.cos(tilt)};
|
|
162
|
+
}
|
|
163
|
+
function shellPath(ctx,frame,depth){
|
|
164
|
+
for(let step=0;step<=112;step++){
|
|
165
|
+
const rim=brainShell(step/112*Math.PI*2);
|
|
166
|
+
const point=brainProjection(frame,rim.x,rim.y,depth);
|
|
167
|
+
if(step===0)ctx.moveTo(point.x,point.y);
|
|
168
|
+
else ctx.lineTo(point.x,point.y);
|
|
169
|
+
}
|
|
170
|
+
ctx.closePath();
|
|
171
|
+
}
|
|
172
|
+
function drawOutline(ctx,frame){
|
|
173
|
+
const {x,y,rx,ry}=frame;
|
|
174
|
+
const field=ctx.createRadialGradient(x+rx*.22,y-ry*.42,0,x,y,rx*1.1);
|
|
175
|
+
field.addColorStop(0,'rgba(47,123,151,.22)');
|
|
176
|
+
field.addColorStop(.64,'rgba(52,74,132,.13)');
|
|
177
|
+
field.addColorStop(1,'rgba(15,24,47,.06)');
|
|
178
|
+
ctx.beginPath();shellPath(ctx,frame,0);ctx.fillStyle=field;ctx.fill();
|
|
179
|
+
ctx.beginPath();shellPath(ctx,frame,-.74);stroke(ctx,'108,162,215',.19,.7);
|
|
180
|
+
ctx.beginPath();shellPath(ctx,frame,.66);stroke(ctx,'140,193,225',.30,.9);
|
|
181
|
+
// Subtle contour guides give the point volume spatial context.
|
|
182
|
+
ctx.beginPath();
|
|
183
|
+
for(const [angle,depth] of [[-.76,-.22],[.38,.35],[1.24,.57]]){
|
|
184
|
+
const start=brainShell(angle),end=brainShell(angle+Math.PI);
|
|
185
|
+
const a=brainProjection(frame,start.x*.97,start.y*.97,depth);
|
|
186
|
+
const b=brainProjection(frame,-.28,.04,depth);
|
|
187
|
+
const c=brainProjection(frame,.45,-.22,depth);
|
|
188
|
+
const d=brainProjection(frame,end.x*.98,end.y*.98,depth);
|
|
189
|
+
ctx.moveTo(a.x,a.y);ctx.bezierCurveTo(c.x,c.y,b.x,b.y,d.x,d.y);
|
|
190
|
+
}
|
|
191
|
+
stroke(ctx,'135,181,233',.12,.75);
|
|
62
192
|
}
|
|
63
193
|
function graphPoints(width,height){
|
|
64
194
|
const nodes=arr(state.graph?.nodes),anchors=nodes.filter(node=>node.kind!=='memory');
|
|
65
|
-
const memories=nodes.filter(node=>node.kind==='memory')
|
|
66
|
-
const
|
|
195
|
+
const memories=nodes.filter(node=>node.kind==='memory');
|
|
196
|
+
const frame=brainFrame(width,height);
|
|
67
197
|
const points=new Map();
|
|
68
198
|
function point(node,x,y,depth=1){points.set(node.id,{...node,x,y,depth});}
|
|
69
199
|
for(const kind of ['project','agent']){
|
|
70
200
|
const subset=anchors.filter(node=>node.kind===kind);
|
|
71
201
|
subset.forEach((node,i)=>{
|
|
72
202
|
const t=(i+1)/(subset.length+1),sign=kind==='project'?-1:1;
|
|
73
|
-
point(node,
|
|
203
|
+
point(node,frame.x+sign*(frame.rx+Math.max(7,Math.min(32,width*.043))),height*.21+height*.58*t);
|
|
74
204
|
});
|
|
75
205
|
}
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
const random
|
|
79
|
-
const
|
|
80
|
-
const
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
});
|
|
206
|
+
const projected=memories.map(node=>{
|
|
207
|
+
const random=rand(hash(node.id));
|
|
208
|
+
const angle=random()*Math.PI*2,polar=random()*2-1;
|
|
209
|
+
const shell=random()<.40;
|
|
210
|
+
const radius=shell?.87+.13*random():Math.cbrt(random());
|
|
211
|
+
const rim=brainShell(angle),disk=Math.sqrt(1-polar**2)*radius,depth=polar*radius;
|
|
212
|
+
return {node,depth,...brainProjection(frame,rim.x*disk,rim.y*disk,depth)};
|
|
213
|
+
}).sort((left,right)=>left.depth-right.depth);
|
|
214
|
+
for(const node of projected)point(node.node,node.x,node.y,(node.depth+1)/2);
|
|
86
215
|
return points;
|
|
87
216
|
}
|
|
88
|
-
function displayEvent(){return state.events.find(event=>event.id===state.replayId)
|
|
217
|
+
function displayEvent(){return state.replayId?state.events.find(event=>event.id===state.replayId):state.events.at(-1);}
|
|
89
218
|
function graphEventPath(event,surface){
|
|
90
|
-
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
const
|
|
94
|
-
return
|
|
95
|
-
[from,{x:width*.47,y:height*.73},{x:width*.49,y:height*.18},end];
|
|
219
|
+
if(!exchangeKey(event))return null;
|
|
220
|
+
const {width,height}=surface;
|
|
221
|
+
const workspace={x:width*.47,y:height*.67},client={x:width*.92,y:height*.37};
|
|
222
|
+
const controls=[{x:width*.31,y:height*.27},{x:width*.68,y:height*.16}];
|
|
223
|
+
return event.kind==='tool-start'?[client,...controls.reverse(),workspace]:[workspace,...controls,client];
|
|
96
224
|
}
|
|
97
225
|
function labelPoint(ctx,point,label,side,color,width,alpha){
|
|
98
226
|
ctx.font='600 10.5px system-ui,sans-serif';
|
|
@@ -103,6 +231,46 @@ function labelPoint(ctx,point,label,side,color,width,alpha){
|
|
|
103
231
|
ctx.globalAlpha=alpha;ctx.fillStyle='#111e31';ctx.beginPath();ctx.roundRect(x,y,labelWidth,18,3);ctx.fill();stroke(ctx,color,.43,.7);
|
|
104
232
|
ctx.fillStyle='#ddefff';ctx.textAlign='left';ctx.textBaseline='middle';ctx.fillText(label,x+pad,y+9);ctx.globalAlpha=1;
|
|
105
233
|
}
|
|
234
|
+
function drawMemoryLayer(surface,current){
|
|
235
|
+
const {layerContext:ctx,width,height,points,edges}=surface;
|
|
236
|
+
const connected=new Set(current?[current]:[]);
|
|
237
|
+
if(current)for(const edge of edges){
|
|
238
|
+
if(edge.source===current)connected.add(edge.target);
|
|
239
|
+
if(edge.target===current)connected.add(edge.source);
|
|
240
|
+
}
|
|
241
|
+
ctx.clearRect(0,0,width,height);
|
|
242
|
+
ctx.save();ctx.translate(width/2+graphCamera.x,height/2+graphCamera.y);ctx.scale(graphCamera.scale,graphCamera.scale);ctx.translate(-width/2,-height/2);
|
|
243
|
+
if(points.size)drawOutline(ctx,brainFrame(width,height));
|
|
244
|
+
for(const edge of edges){
|
|
245
|
+
const relation=edge.kind==='belongs-to'?'project':edge.kind==='recorded-by'?'author':'typed';
|
|
246
|
+
if(state.graphFilter!=='all'&&relation!==state.graphFilter)continue;
|
|
247
|
+
const a=points.get(edge.source),b=points.get(edge.target);
|
|
248
|
+
const active=current&&(edge.source===current||edge.target===current);
|
|
249
|
+
const isTyped=relation==='typed',depth=(a.depth+b.depth)/2;
|
|
250
|
+
ctx.beginPath();ctx.moveTo(a.x,a.y);
|
|
251
|
+
if(isTyped)ctx.lineTo(b.x,b.y);
|
|
252
|
+
else ctx.quadraticCurveTo((a.x+b.x)/2,(a.y+b.y)/2+(a.x-b.x)*.08,b.x,b.y);
|
|
253
|
+
const color=relation==='project'?tones.project:relation==='author'?tones.agent:relationColors[edge.kind]??tones.memory;
|
|
254
|
+
if(active){stroke(ctx,color,.18,4);stroke(ctx,color,.88,1.25);}
|
|
255
|
+
else{
|
|
256
|
+
const alpha=isTyped?.10+depth*.38:state.graphFilter===relation?.16:.022;
|
|
257
|
+
stroke(ctx,color,current?alpha*.12:alpha,isTyped?.38+depth*.46:.57);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
for(const point of points.values()){
|
|
261
|
+
const active=point.id===current,memory=point.kind==='memory';
|
|
262
|
+
const color=memory?(point.depth>.65?'145,230,247':tones.memory):tones[point.kind];
|
|
263
|
+
const alpha=(current&&!connected.has(point.id)?.23:1)*(.35+.65*point.depth);
|
|
264
|
+
const r=memory?(points.size>70?.68+1.12*point.depth:1.7+1.6*point.depth):3.4;
|
|
265
|
+
if(active||point.depth>.68)dot(ctx,point.x,point.y,active?12:r+2.4,color,.15*alpha);
|
|
266
|
+
dot(ctx,point.x,point.y,active?3.5:r,color,.88*alpha);
|
|
267
|
+
if(active||!memory){
|
|
268
|
+
ctx.beginPath();ctx.arc(point.x,point.y,active?8:5.4,0,Math.PI*2);stroke(ctx,color,.62*alpha,.75);
|
|
269
|
+
}
|
|
270
|
+
if(!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);
|
|
271
|
+
}
|
|
272
|
+
ctx.restore();
|
|
273
|
+
}
|
|
106
274
|
function drawGraph(){
|
|
107
275
|
const surface=graphSurface;
|
|
108
276
|
if(!surface||!surface.width)return;
|
|
@@ -114,62 +282,56 @@ function drawGraph(){
|
|
|
114
282
|
surface.edges=arr(state.graph?.edges).filter(edge=>surface.points.has(edge.source)&&surface.points.has(edge.target));
|
|
115
283
|
surface.counts={};
|
|
116
284
|
for(const point of surface.points.values())surface.counts[point.kind]=(surface.counts[point.kind]??0)+1;
|
|
285
|
+
surface.layerKey='';
|
|
117
286
|
}
|
|
118
287
|
const {points,edges}=surface;
|
|
119
288
|
const current=state.focus?state.picked:null;
|
|
120
|
-
const
|
|
121
|
-
if(
|
|
122
|
-
if(edge.source===current)connected.add(edge.target);
|
|
123
|
-
if(edge.target===current)connected.add(edge.source);
|
|
124
|
-
}
|
|
289
|
+
const layerKey=JSON.stringify([current,state.graphFilter,graphCamera]);
|
|
290
|
+
if(surface.layerKey!==layerKey){drawMemoryLayer(surface,current);surface.layerKey=layerKey;}
|
|
125
291
|
ctx.clearRect(0,0,width,height);
|
|
126
|
-
|
|
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
|
-
}
|
|
292
|
+
ctx.drawImage(surface.layer,0,0,width,height);
|
|
146
293
|
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<
|
|
148
|
-
const traceEvents=
|
|
294
|
+
const animate=!document.hidden&&!reduced.matches&&!state.motionPaused&&!state.replayId&&state.live&&state.connection==='reachable'&&state.pulseIds.length&&age<1350&&!state.listing;
|
|
295
|
+
const traceEvents=animate?state.events.filter(event=>state.pulseIds.includes(event.id)&&exchangeKey(event)):
|
|
149
296
|
state.replayId?[displayEvent()].filter(Boolean):[];
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
297
|
+
// The lower lane represents MCP boundary activity independently of the stored graph.
|
|
298
|
+
const step=animate?age/1350*traceEvents.length:0;
|
|
299
|
+
const currentEvent=traceEvents[Math.floor(step)];
|
|
300
|
+
const path=currentEvent&&graphEventPath(currentEvent,surface);
|
|
301
|
+
if(path){
|
|
302
|
+
const event=currentEvent;
|
|
303
|
+
const [a,b,c,d]=path,color=event.kind==='tool-start'?'104,205,238':event.outcome==='success'?tones.measured:'255,172,182';
|
|
304
|
+
const direction=Math.atan2(d.y-c.y,d.x-c.x);
|
|
153
305
|
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,.
|
|
155
|
-
|
|
306
|
+
stroke(ctx,color,.10,7);stroke(ctx,color,.24,3.2);stroke(ctx,color,.88,1.35);
|
|
307
|
+
ctx.save();ctx.translate(d.x,d.y);ctx.rotate(direction);
|
|
308
|
+
ctx.beginPath();ctx.moveTo(-6,-3.1);ctx.lineTo(0,0);ctx.lineTo(-6,3.1);stroke(ctx,color,.92,1.3);ctx.restore();
|
|
309
|
+
const t=animate?step%1:.58,u=1-t;
|
|
156
310
|
const x=u**3*a.x+3*u*u*t*b.x+3*u*t*t*c.x+t**3*d.x;
|
|
157
311
|
const y=u**3*a.y+3*u*u*t*b.y+3*u*t*t*c.y+t**3*d.y;
|
|
158
312
|
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
|
-
}
|
|
313
|
+
}
|
|
160
314
|
const graphEvent=$('graph-event');
|
|
161
315
|
if(graphEvent){
|
|
162
|
-
const
|
|
316
|
+
const text=path?exchangeDirection(currentEvent)+' · '+exchangeLabel(currentEvent):'';
|
|
163
317
|
if(graphEvent.textContent!==text)graphEvent.textContent=text;
|
|
318
|
+
graphEvent.hidden=!path||!!current||state.listing;
|
|
164
319
|
}
|
|
165
320
|
canvas.dataset.nodes=String(points.size);canvas.dataset.edges=String(edges.length);
|
|
166
|
-
canvas.dataset.pulses=
|
|
167
|
-
if(animate&&
|
|
321
|
+
canvas.dataset.pulses=path?'1':'0';canvas.dataset.frame=animate&&path?String(Math.round(age)):'static';
|
|
322
|
+
if(animate&&path)surface.raf=requestAnimationFrame(drawGraph);
|
|
168
323
|
}
|
|
169
324
|
function syncGraphControls(){
|
|
170
325
|
const label=$('node-caption'),point=arr(state.graph?.nodes).find(node=>node.id===state.picked);
|
|
171
326
|
if(label){label.hidden=!state.focus||!point||state.listing;label.textContent=point?.label??'';}
|
|
172
327
|
const clear=$('clear-focus');if(clear)clear.hidden=!state.focus;
|
|
328
|
+
const zoom=$('graph-zoom');
|
|
329
|
+
if(zoom)zoom.textContent=Math.round(graphCamera.scale*100)+'%';
|
|
330
|
+
const plus=$('graph-zoom-in'),minus=$('graph-zoom-out');
|
|
331
|
+
// Keep zoom controls focusable at bounds for keyboard continuity.
|
|
332
|
+
plus?.setAttribute('aria-disabled',String(graphCamera.scale>=3));
|
|
333
|
+
minus?.setAttribute('aria-disabled',String(graphCamera.scale<=1));
|
|
334
|
+
$('main').querySelectorAll('[data-graph-filter]').forEach(button=>button.setAttribute('aria-pressed',String(state.graphFilter===button.dataset.graphFilter)));
|
|
173
335
|
$('brain-stage')?.querySelectorAll('[data-node]').forEach(button=>button.setAttribute('aria-pressed',String(button.dataset.node===state.picked&&state.focus)));
|
|
174
336
|
}
|
|
175
337
|
`;
|
|
@@ -1 +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
|
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgVxC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brain-hub-html.d.ts","sourceRoot":"","sources":["../../src/dashboard/brain-hub-html.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"brain-hub-html.d.ts","sourceRoot":"","sources":["../../src/dashboard/brain-hub-html.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,cAAc,QA8EH,CAAC"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { BRAIN_HUB_CLIENT } from './brain-hub-client.js';
|
|
2
2
|
import { BRAIN_HUB_GRAPH } from './brain-hub-graph.js';
|
|
3
|
+
import { BRAIN_HUB_EXCHANGES } from './brain-hub-exchanges.js';
|
|
4
|
+
import { BRAIN_HUB_LIVE } from './brain-hub-live.js';
|
|
3
5
|
import { BRAIN_HUB_VIEWS } from './brain-hub-views.js';
|
|
4
6
|
export const BRAIN_HUB_HTML = String.raw `<!doctype html>
|
|
5
7
|
<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>
|
|
@@ -15,16 +17,69 @@ export const BRAIN_HUB_HTML = String.raw `<!doctype html>
|
|
|
15
17
|
@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
18
|
@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
19
|
@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation:none!important;transition:none!important}}
|
|
20
|
+
.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
|
|
21
|
+
.graph-panel{background:var(--surface)}.graph-stage{background:radial-gradient(circle,#6a84a128 .6px,transparent .9px) 0 0/18px 18px,radial-gradient(ellipse at 50% 55%,#12243b,#0b1527 62%,#080f1c 100%)}
|
|
22
|
+
.graph-meta{font-size:.73rem;color:#bdd0e6;text-transform:none}.graph-foot{padding-block:4px;gap:3px 8px}
|
|
23
|
+
.legend,.graph-camera{display:flex;align-items:center;flex-wrap:wrap;gap:3px}.legend .legend-filter{display:inline-flex;gap:5px;align-items:center;padding:3px 6px;min-height:27px;border:1px solid transparent;border-radius:4px;background:transparent;color:var(--muted)}
|
|
24
|
+
.legend .legend-filter[aria-pressed=true]{border-color:var(--strong);background:var(--raised);color:var(--ink)}
|
|
25
|
+
.legend .legend-filter:hover{color:var(--ink);background:var(--raised)}.legend .legend-filter i{width:10px}
|
|
26
|
+
.graph-camera .btn{font-size:.73rem;min-height:26px;padding:2px 7px}.graph-camera .btn[aria-disabled=true]{opacity:.55;cursor:default}.graph-camera output{width:4ch;text-align:center}
|
|
27
|
+
.graph-finder{display:flex;flex-direction:column;border-radius:5px;overflow:hidden;background:#0d182b}
|
|
28
|
+
.graph-find{display:flex;align-items:center;gap:6px;flex-wrap:wrap;padding:8px;border-bottom:1px solid var(--border);background:var(--surface)}
|
|
29
|
+
.graph-find input{flex:1;min-width:130px}.graph-results{overflow:auto;flex:1}.graph-search-note{padding:6px 9px}
|
|
30
|
+
.graph-exchanges{border-top:1px solid var(--border);background:var(--surface)}
|
|
31
|
+
.exchange-head{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:5px 9px}
|
|
32
|
+
.exchange-head h3{font-size:.84rem;font-weight:650;letter-spacing:0}
|
|
33
|
+
.exchange-row{display:grid;width:100%;grid-template-columns:minmax(110px,1.2fr) minmax(96px,1fr) auto;gap:4px 8px;align-items:center;text-align:left;border:0;border-top:1px solid var(--border);background:transparent;color:var(--ink);padding:4px 9px;font-size:.76rem}
|
|
34
|
+
.exchange-row:hover,.exchange-row[aria-pressed=true]{background:var(--raised)}
|
|
35
|
+
.exchange-row:focus-visible{outline-offset:-2px}
|
|
36
|
+
.exchange-route,.exchange-summary{display:flex;align-items:center;gap:5px;min-width:0}
|
|
37
|
+
.exchange-route span:not(.exchange-arrow),.exchange-summary strong{min-width:0;overflow-wrap:anywhere}
|
|
38
|
+
.exchange-route .exchange-workspace{flex:none;white-space:nowrap}
|
|
39
|
+
.exchange-route small{display:inline-block}
|
|
40
|
+
.exchange-summary{color:var(--muted);flex-wrap:wrap}.exchange-summary strong{font:600 .76rem var(--mono);color:var(--ink)}
|
|
41
|
+
.exchange-arrow{position:relative;flex:0 0 18px;height:1px;background:var(--cyan)}
|
|
42
|
+
.exchange-arrow::after{content:"";position:absolute;right:0;top:-2px;width:5px;height:5px;transform:rotate(45deg);border-top:1px solid var(--cyan);border-right:1px solid var(--cyan)}
|
|
43
|
+
.exchange-empty{padding:0 9px 7px}
|
|
44
|
+
.live-path-label{position:absolute;bottom:3px;left:50%;transform:translateX(-50%);max-width:92%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding:2px 6px;border-radius:4px;background:var(--ground);color:var(--ink);font-size:.73rem;pointer-events:none}
|
|
45
|
+
@media(min-width:981px){.control-grid{grid-template-rows:576px}}
|
|
46
|
+
@media(max-width:680px){.legend .legend-filter,.graph-camera .btn{min-height:36px}.exchange-row{min-height:40px;padding-block:6px}.graph-panel-empty .graph-stage{min-height:220px}}
|
|
47
|
+
@media(max-width:360px){.exchange-row{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.exchange-row time{grid-column:1/-1}.graph-find input{flex-basis:100%}}
|
|
48
|
+
.preserve{white-space:pre-wrap;overflow-wrap:anywhere}
|
|
49
|
+
.tool-dock{margin-bottom:10px}.tool-dock-head{display:flex;align-items:baseline;justify-content:space-between;gap:4px 12px;flex-wrap:wrap;padding:9px 12px}
|
|
50
|
+
.tool-dock-list{display:flex;align-items:stretch;gap:6px;flex-wrap:wrap;padding:0 12px 8px}
|
|
51
|
+
.tool-dock-list>li+li{border:0}.tool-dock-button{display:flex;align-items:center;gap:8px;min-height:42px;padding:5px 10px;border:1px solid var(--border);
|
|
52
|
+
border-radius:6px;color:var(--ink);background:var(--raised);text-align:left}
|
|
53
|
+
.tool-dock-button:hover,.tool-dock-button[aria-expanded=true]{border-color:var(--cyan)}
|
|
54
|
+
.tool-mark{width:23px;height:23px;display:grid;place-items:center;color:var(--ink);font:700 .72rem var(--mono)}
|
|
55
|
+
.tool-mark svg{display:block;width:100%;height:100%}
|
|
56
|
+
.tool-dock-text{display:grid;gap:1px;line-height:1.2}.tool-dock-text strong{font-size:.81rem}.tool-dock-text small{color:var(--muted);font-size:.69rem}
|
|
57
|
+
.tool-dock-indicator{width:6px;height:6px;margin-left:4px;border-radius:50%;background:var(--strong)}
|
|
58
|
+
.tool-activity-pulse{animation:tool-report 1.3s ease-out}
|
|
59
|
+
@keyframes tool-report{0%{background:var(--cyan);box-shadow:0 0 0 5px #78e9e53d}100%{background:var(--strong);box-shadow:0 0 0 0 #78e9e500}}
|
|
60
|
+
.tool-dock-empty,.tool-dock-caption{padding:0 12px 7px}.tool-dock-details{display:grid;gap:5px;padding:9px 12px;border-top:1px solid var(--border);background:var(--ground)}
|
|
61
|
+
.tool-dock-record-list{display:flex;flex-wrap:wrap;gap:6px}.tool-dock-record-list>li+li{border:0}
|
|
62
|
+
.tool-dock-record-list li{max-width:100%}.tool-dock-record{display:grid;gap:1px;min-height:36px;padding:4px 7px;color:var(--ink);background:var(--surface);border:1px solid var(--border);border-radius:5px;text-align:left;overflow-wrap:anywhere;font-size:.76rem}
|
|
63
|
+
.tool-dock-record[aria-pressed=true],.tool-dock-record:hover{border-color:var(--cyan)}
|
|
64
|
+
.tool-evidence-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}.tool-evidence-grid dt,.tool-evidence-grid dd{overflow-wrap:anywhere}
|
|
65
|
+
@media(max-width:680px){.tool-evidence-grid{grid-template-columns:minmax(0,1fr)}.tool-dock-button,.tool-dock-record{min-height:44px}}
|
|
66
|
+
@media(prefers-reduced-motion:reduce){.tool-activity-pulse{animation:none}}
|
|
67
|
+
[id^="policy-"][type="range"]{accent-color:var(--cyan)}
|
|
68
|
+
#project-file-body strong{min-width:0;overflow-wrap:anywhere}
|
|
69
|
+
#project-file-pulse{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted)}
|
|
70
|
+
.file-fresh{animation:file-observed 1.6s ease-out}
|
|
71
|
+
@keyframes file-observed{0%{color:var(--cyan)}100%{color:var(--muted)}}
|
|
18
72
|
</style></head><body>
|
|
19
73
|
<a class="btn skip" href="#main">Skip to content</a>
|
|
20
74
|
<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
75
|
<nav class="nav" id="nav" aria-label="Brain workspace"></nav>
|
|
76
|
+
<span class="chip" id="stream-health" role="status" hidden></span>
|
|
22
77
|
<p class="notice" id="notice" role="status"></p>
|
|
23
78
|
<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
79
|
<footer class="footer"><span id="scope-note"></span><span><a href="/workspace">Classic workspace</a> · <a href="/live">Activity diagnostics</a></span></footer>
|
|
25
80
|
</div>
|
|
26
81
|
<script>'use strict';
|
|
27
|
-
` + BRAIN_HUB_CLIENT + BRAIN_HUB_GRAPH + BRAIN_HUB_VIEWS + String.raw `
|
|
82
|
+
` + BRAIN_HUB_CLIENT + BRAIN_HUB_LIVE + BRAIN_HUB_EXCHANGES + BRAIN_HUB_GRAPH + BRAIN_HUB_VIEWS + String.raw `
|
|
28
83
|
start();
|
|
29
84
|
</script></body></html>`;
|
|
30
85
|
//# sourceMappingURL=brain-hub-html.js.map
|
|
@@ -1 +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
|
|
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,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4EvC,GAAG,gBAAgB,GAAG,cAAc,GAAG,mBAAmB,GAAG,eAAe,GAAG,eAAe,GAAG,MAAM,CAAC,GAAG,CAAA;;wBAEpF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-hub-knowledge.d.ts","sourceRoot":"","sources":["../../src/dashboard/brain-hub-knowledge.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,QA+B/B,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export const BRAIN_HUB_KNOWLEDGE = String.raw `
|
|
2
|
+
function sourceReview(){
|
|
3
|
+
const source=state.source;
|
|
4
|
+
if(!source)return empty('Your saved notes and review','Paste ordinary text and choose Add to memory. For longer notes, choose Review first and save the useful parts.');
|
|
5
|
+
const counts={pending:0,approved:0,rejected:0};arr(source.items).forEach(item=>counts[item.status]++);
|
|
6
|
+
return '<div class="panel-body stack"><div class="row"><h3>'+esc(source.title)+'</h3>'+chip(source.kind)+'</div><p class="small muted">'+counts.pending+' to review · '+counts.approved+' saved · '+counts.rejected+' skipped. Titles and categories are suggestions from the text’s structure; check them before saving.</p>'+list(arr(source.items).map(item=>{
|
|
7
|
+
const chosen=item.approved??item;
|
|
8
|
+
return '<li class="item"><div class="row"><strong>'+esc(chosen.title)+'</strong>'+chip(item.status,item.status==='approved'?'green':'amber')+'</div><p class="small mono muted">'+esc(item.id)+(item.role?' · Speaker: '+esc(item.role):'')+'</p>'+
|
|
9
|
+
(item.status==='pending'?'<form class="form" data-form="source-review" data-item="'+esc(item.id)+'"><label>Name for this memory<input name="title" maxlength="150" value="'+esc(item.title)+'" required></label><label>What the brain should remember<textarea name="text" rows="4" maxlength="6000" required>'+esc(item.text)+'</textarea></label><label>Topic<input name="category" maxlength="64" value="'+esc(item.category)+'" required></label><div class="actions"><button class="btn primary" type="submit" name="decision" value="approve" '+(state.pending?'disabled':'')+'>Save to this project</button><button class="btn" type="submit" name="decision" value="reject" formnovalidate '+(state.pending?'disabled':'')+'>Skip this part</button></div></form>':'<p class="preserve">'+esc(chosen.text)+'</p>'+ (item.memoryId?'<div class="actions">'+action('open-memory','Inspect memory','','data-memory="'+esc(item.memoryId)+'"')+action('source-evidence','View original source','','data-memory="'+esc(item.memoryId)+'"')+'</div>':''));
|
|
10
|
+
}).join(''))+(source.kind==='transcript-json'&&counts.approved?'<p class="small muted">Finish reviewing first: the session will contain a snapshot of the messages approved now. Reimporting opens the same snapshot.</p>'+action('import-session','Open reviewed history in Sessions'):'')+'<details><summary>Original source fingerprint</summary><pre>'+esc(source.sha256)+'</pre><p class="small muted">'+esc(source.name)+' · '+fmt(source.bytes)+' bytes · '+esc(source.parser)+'</p></details></div>';
|
|
11
|
+
}
|
|
12
|
+
function teachPanel(){
|
|
13
|
+
return panel('Add to memory','<div class="panel-body stack"><p>Write what you want your agents to remember. Ordinary words are enough.</p><form class="form" data-form="teach"><label>What should this project remember?<textarea name="text" rows="7" maxlength="180000" placeholder="The cupboard is black. Keep its brass handles when we redesign the room." required>'+esc(state.teachDraft??'')+'</textarea></label><div class="actions"><button class="btn primary" type="submit" name="mode" value="save" '+(state.pending?'disabled':'')+'>Add to memory</button><button class="btn" type="submit" name="mode" value="review" '+(state.pending?'disabled':'')+'>Review first</button></div></form><p class="small muted">Add to memory saves your text as reference knowledge for connected agents in this project. Try “What colour is the cupboard?” in Context to check recall. Notes up to 6,000 characters and 20 paragraphs can be saved directly; use Review first for longer notes or corrections.</p><details><summary>Optional: upload text, Markdown, or a conversation</summary><form class="form" data-form="source-upload"><label>Source file<input name="source" type="file" accept=".txt,.md,.markdown,.json,text/plain,application/json" required></label><p class="small muted">Up to 1 MiB. Conversations use a simple JSON messages array with role and text content. Imported messages remain reference material, including messages labelled system or developer.</p><p class="small muted">Download a sample to see the supported JSON formats:</p><div class="actions">'+action('download-example','Knowledge JSON','','data-example="knowledge"')+action('download-example','Transcript JSON','','data-example="transcript"')+action('download-example','Simple transcript JSON','','data-example="simple"')+'</div>'+submit('Review file')+'</form></details></div>');
|
|
14
|
+
}
|
|
15
|
+
function evidencePanel(){
|
|
16
|
+
const result=state.evidence;if(!result)return '';
|
|
17
|
+
const e=result.evidence;
|
|
18
|
+
return panel('Original source','<div class="panel-body stack"><div class="row">'+chip(result.state,result.state==='resolved'?'green':'amber')+action('close-evidence','Close')+'</div>'+(e?'<h3>'+esc(e.title)+'</h3><p class="small mono">'+esc([e.kind,e.page?'Page '+e.page:e.locator,e.role?'Speaker: '+e.role:''].filter(Boolean).join(' · '))+'</p><pre>'+esc(e.text)+'</pre>'+(e.truncated?'<p class="small amber">This display is a bounded excerpt.</p>':'')+(e.approvedText!==undefined&&e.approvedText!==e.text?'<h3>Your approved correction</h3><pre>'+esc(e.approvedText)+'</pre>':'')+(e.outcome?'<h3>Reported outcome</h3><p>'+esc(e.outcome.result)+' - '+esc(e.outcome.check)+' - '+esc(e.outcome.provenance)+'</p><pre>'+esc(e.outcome.evidence)+'</pre>':'')+(e.evaluation?'<h3>Operator-reported comparison</h3><p>Baseline: '+(e.evaluation.baseline?'pass':'fail')+' - Candidate: '+(e.evaluation.candidate?'pass':'fail')+' - Control: '+(e.evaluation.control?'pass':'fail')+'</p><pre>'+esc(e.evaluation.evidence)+'</pre>':'')+(e.sha256?'<details><summary>Verified stored fingerprint</summary><pre>'+esc(e.sha256)+'</pre></details>':'')+'<p class="small muted">Source association checked against this project. '+(e.reported?'Evaluation results were reported by an operator.':'This verifies where the text came from, not whether every claim is true.')+'</p>':'<p>'+esc(result.state==='reference-only'?'This memory has a reference label, without a stored source to verify.':'The original source could not be verified. No unrelated file was opened.')+'</p>')+'</div>');
|
|
19
|
+
}
|
|
20
|
+
function sourceLibrary(){
|
|
21
|
+
if(state.errors.sources)return error('sources','saved sources');
|
|
22
|
+
const sources=arr(state.sources?.sources);
|
|
23
|
+
return sources.length?list(sources.map(source=>'<li><button class="entry" type="button" data-source="'+esc(source.id)+'" aria-pressed="'+(source.id===state.source?.id)+'"><strong>'+esc(source.title)+'</strong><small class="muted">'+esc(source.kind)+' · '+source.approvedCount+' saved / '+source.itemCount+' parts</small></button></li>').join('')):empty('Your source library is empty','Notes and uploaded files stay in this project.');
|
|
24
|
+
}
|
|
25
|
+
function feedbackControls(){
|
|
26
|
+
const feedback=state.feedback;
|
|
27
|
+
if(!feedback)return error('feedback','learning feedback')||empty('Loading learning history','Reading feedback for this project.');
|
|
28
|
+
const memories=arr(state.context?.entries);
|
|
29
|
+
const choices=memories.length?memories:arr(state.graph?.nodes).filter(node=>node.kind==='memory').map(node=>({id:node.memoryId,excerpt:node.label}));
|
|
30
|
+
return '<div class="panel-body stack"><p>Tell the brain what helped for a task. Useful memories can rank higher for similar work; incorrect memories receive a penalty. Feedback changes retrieval, not model weights.</p><div class="actions">'+chip(feedback.enabled?'Feedback influences recall':'Feedback influence paused',feedback.enabled?'green':'amber')+action('toggle-feedback',feedback.enabled?'Pause influence':'Enable influence')+'</div>'+(choices.length?'<form class="form" data-form="feedback"><label>Memory<select name="memoryId">'+choices.map(entry=>'<option value="'+esc(entry.id)+'">'+esc(entry.excerpt)+'</option>').join('')+'</select></label><label>What were you working on?<input name="task" maxlength="1000" value="'+esc(state.contextInput?.query??'')+'" required></label><label>Was the memory helpful?<select name="rating"><option value="useful">Useful</option><option value="not-useful">Not relevant to this task</option><option value="incorrect">Incorrect</option></select></label><label>Why?<textarea name="reason" rows="2" maxlength="600" required></textarea></label>'+submit('Save feedback')+'</form>':empty('Start with a context pack','Describe a task in Context, then review the memories it selected.',view('context','Try a task')))+list(arr(feedback.records).slice().reverse().map(record=>'<li class="item"><div class="row"><strong>'+esc(record.rating)+'</strong>'+action('remove-feedback','Remove','','data-feedback="'+esc(record.id)+'"')+'</div><p>'+esc(record.task)+'</p><p class="small muted">'+esc(record.reason)+'</p>'+action('open-memory','Inspect memory','','data-memory="'+esc(record.memoryId)+'"')+'</li>').join(''))+'</div>';
|
|
31
|
+
}
|
|
32
|
+
`;
|
|
33
|
+
//# sourceMappingURL=brain-hub-knowledge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-hub-knowledge.js","sourceRoot":"","sources":["../../src/dashboard/brain-hub-knowledge.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+B5C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-hub-live.d.ts","sourceRoot":"","sources":["../../src/dashboard/brain-hub-live.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,QAqJ1B,CAAC"}
|