@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.
Files changed (275) hide show
  1. package/CHANGELOG.md +478 -462
  2. package/README.md +97 -24
  3. package/dist/brain/auto-update.js +1 -1
  4. package/dist/brain/auto-update.js.map +1 -1
  5. package/dist/brain/brain-portability.js +1 -1
  6. package/dist/brain/brain-portability.js.map +1 -1
  7. package/dist/brain/client-integrations.js +1 -1
  8. package/dist/brain/client-integrations.js.map +1 -1
  9. package/dist/brain/context-assembly.d.ts +10 -0
  10. package/dist/brain/context-assembly.d.ts.map +1 -1
  11. package/dist/brain/context-assembly.js +15 -6
  12. package/dist/brain/context-assembly.js.map +1 -1
  13. package/dist/brain/context-efficiency.d.ts +48 -0
  14. package/dist/brain/context-efficiency.d.ts.map +1 -0
  15. package/dist/brain/context-efficiency.js +34 -0
  16. package/dist/brain/context-efficiency.js.map +1 -0
  17. package/dist/brain/context-request.d.ts +1 -1
  18. package/dist/brain/context-request.d.ts.map +1 -1
  19. package/dist/brain/context-request.js +4 -2
  20. package/dist/brain/context-request.js.map +1 -1
  21. package/dist/brain/context-retrieval.d.ts +1 -1
  22. package/dist/brain/context-retrieval.d.ts.map +1 -1
  23. package/dist/brain/context-retrieval.js +2 -1
  24. package/dist/brain/context-retrieval.js.map +1 -1
  25. package/dist/brain/feature-settings.d.ts +5 -0
  26. package/dist/brain/feature-settings.d.ts.map +1 -1
  27. package/dist/brain/feature-settings.js +8 -2
  28. package/dist/brain/feature-settings.js.map +1 -1
  29. package/dist/brain/global-brain.d.ts +1 -1
  30. package/dist/brain/global-brain.d.ts.map +1 -1
  31. package/dist/brain/global-brain.js +1 -0
  32. package/dist/brain/global-brain.js.map +1 -1
  33. package/dist/brain/managed-project-skills.d.ts +48 -0
  34. package/dist/brain/managed-project-skills.d.ts.map +1 -0
  35. package/dist/brain/managed-project-skills.js +230 -0
  36. package/dist/brain/managed-project-skills.js.map +1 -0
  37. package/dist/brain/mcp-presence.d.ts +50 -0
  38. package/dist/brain/mcp-presence.d.ts.map +1 -0
  39. package/dist/brain/mcp-presence.js +214 -0
  40. package/dist/brain/mcp-presence.js.map +1 -0
  41. package/dist/brain/mcp-server.d.ts +12 -0
  42. package/dist/brain/mcp-server.d.ts.map +1 -1
  43. package/dist/brain/mcp-server.js +177 -31
  44. package/dist/brain/mcp-server.js.map +1 -1
  45. package/dist/brain/mcp-stdio.d.ts +1 -1
  46. package/dist/brain/mcp-stdio.d.ts.map +1 -1
  47. package/dist/brain/mcp-stdio.js +19 -1
  48. package/dist/brain/mcp-stdio.js.map +1 -1
  49. package/dist/brain/memory-annotations.d.ts +2 -0
  50. package/dist/brain/memory-annotations.d.ts.map +1 -1
  51. package/dist/brain/memory-annotations.js +13 -0
  52. package/dist/brain/memory-annotations.js.map +1 -1
  53. package/dist/brain/memory-inspection.d.ts +1 -0
  54. package/dist/brain/memory-inspection.d.ts.map +1 -1
  55. package/dist/brain/memory-inspection.js +1 -1
  56. package/dist/brain/memory-inspection.js.map +1 -1
  57. package/dist/brain/memory-mcp-content.d.ts +4 -2
  58. package/dist/brain/memory-mcp-content.d.ts.map +1 -1
  59. package/dist/brain/memory-mcp-content.js +20 -16
  60. package/dist/brain/memory-mcp-content.js.map +1 -1
  61. package/dist/brain/model-registry.d.ts +4 -5
  62. package/dist/brain/model-registry.d.ts.map +1 -1
  63. package/dist/brain/model-registry.js +22 -207
  64. package/dist/brain/model-registry.js.map +1 -1
  65. package/dist/brain/model-usage.d.ts +66 -0
  66. package/dist/brain/model-usage.d.ts.map +1 -0
  67. package/dist/brain/model-usage.js +246 -0
  68. package/dist/brain/model-usage.js.map +1 -0
  69. package/dist/brain/native-codex.d.ts +105 -0
  70. package/dist/brain/native-codex.d.ts.map +1 -0
  71. package/dist/brain/native-codex.js +292 -0
  72. package/dist/brain/native-codex.js.map +1 -0
  73. package/dist/brain/native-session-import.d.ts +56 -0
  74. package/dist/brain/native-session-import.d.ts.map +1 -0
  75. package/dist/brain/native-session-import.js +307 -0
  76. package/dist/brain/native-session-import.js.map +1 -0
  77. package/dist/brain/orchestrator.js +1 -1
  78. package/dist/brain/orchestrator.js.map +1 -1
  79. package/dist/brain/project-feedback.d.ts +1 -1
  80. package/dist/brain/project-feedback.d.ts.map +1 -1
  81. package/dist/brain/project-feedback.js +19 -8
  82. package/dist/brain/project-feedback.js.map +1 -1
  83. package/dist/brain/project-hub-contract.d.ts +6 -0
  84. package/dist/brain/project-hub-contract.d.ts.map +1 -1
  85. package/dist/brain/project-hub-contract.js +2 -1
  86. package/dist/brain/project-hub-contract.js.map +1 -1
  87. package/dist/brain/project-hub-mcp.d.ts +14 -0
  88. package/dist/brain/project-hub-mcp.d.ts.map +1 -1
  89. package/dist/brain/project-hub-mcp.js +6 -1
  90. package/dist/brain/project-hub-mcp.js.map +1 -1
  91. package/dist/brain/project-hub-store.d.ts +14 -2
  92. package/dist/brain/project-hub-store.d.ts.map +1 -1
  93. package/dist/brain/project-hub-store.js +70 -2
  94. package/dist/brain/project-hub-store.js.map +1 -1
  95. package/dist/brain/project-hub.d.ts +5 -0
  96. package/dist/brain/project-hub.d.ts.map +1 -1
  97. package/dist/brain/project-hub.js +23 -1
  98. package/dist/brain/project-hub.js.map +1 -1
  99. package/dist/brain/project-kit.d.ts +10 -0
  100. package/dist/brain/project-kit.d.ts.map +1 -1
  101. package/dist/brain/project-kit.js +80 -16
  102. package/dist/brain/project-kit.js.map +1 -1
  103. package/dist/brain/project-policy-delivery.d.ts +8 -0
  104. package/dist/brain/project-policy-delivery.d.ts.map +1 -0
  105. package/dist/brain/project-policy-delivery.js +38 -0
  106. package/dist/brain/project-policy-delivery.js.map +1 -0
  107. package/dist/brain/project-policy.d.ts +88 -0
  108. package/dist/brain/project-policy.d.ts.map +1 -0
  109. package/dist/brain/project-policy.js +267 -0
  110. package/dist/brain/project-policy.js.map +1 -0
  111. package/dist/brain/project-session-contract.d.ts +180 -0
  112. package/dist/brain/project-session-contract.d.ts.map +1 -0
  113. package/dist/brain/project-session-contract.js +50 -0
  114. package/dist/brain/project-session-contract.js.map +1 -0
  115. package/dist/brain/project-session-mcp.d.ts +145 -0
  116. package/dist/brain/project-session-mcp.d.ts.map +1 -0
  117. package/dist/brain/project-session-mcp.js +58 -0
  118. package/dist/brain/project-session-mcp.js.map +1 -0
  119. package/dist/brain/project-sessions.d.ts +97 -0
  120. package/dist/brain/project-sessions.d.ts.map +1 -0
  121. package/dist/brain/project-sessions.js +223 -0
  122. package/dist/brain/project-sessions.js.map +1 -0
  123. package/dist/brain/project-source-contract.d.ts +109 -0
  124. package/dist/brain/project-source-contract.d.ts.map +1 -0
  125. package/dist/brain/project-source-contract.js +2 -0
  126. package/dist/brain/project-source-contract.js.map +1 -0
  127. package/dist/brain/project-source-intake.d.ts +26 -0
  128. package/dist/brain/project-source-intake.d.ts.map +1 -0
  129. package/dist/brain/project-source-intake.js +457 -0
  130. package/dist/brain/project-source-intake.js.map +1 -0
  131. package/dist/cli.js +1 -1
  132. package/dist/cli.js.map +1 -1
  133. package/dist/context-cli.d.ts.map +1 -1
  134. package/dist/context-cli.js +9 -3
  135. package/dist/context-cli.js.map +1 -1
  136. package/dist/dashboard/brain-hub-actions.d.ts.map +1 -1
  137. package/dist/dashboard/brain-hub-actions.js +232 -135
  138. package/dist/dashboard/brain-hub-actions.js.map +1 -1
  139. package/dist/dashboard/brain-hub-agent-dock.d.ts +2 -0
  140. package/dist/dashboard/brain-hub-agent-dock.d.ts.map +1 -0
  141. package/dist/dashboard/brain-hub-agent-dock.js +255 -0
  142. package/dist/dashboard/brain-hub-agent-dock.js.map +1 -0
  143. package/dist/dashboard/brain-hub-brand-icons.d.ts +2 -0
  144. package/dist/dashboard/brain-hub-brand-icons.d.ts.map +1 -0
  145. package/dist/dashboard/brain-hub-brand-icons.js +9 -0
  146. package/dist/dashboard/brain-hub-brand-icons.js.map +1 -0
  147. package/dist/dashboard/brain-hub-client.d.ts.map +1 -1
  148. package/dist/dashboard/brain-hub-client.js +433 -333
  149. package/dist/dashboard/brain-hub-client.js.map +1 -1
  150. package/dist/dashboard/brain-hub-context.d.ts +2 -0
  151. package/dist/dashboard/brain-hub-context.d.ts.map +1 -0
  152. package/dist/dashboard/brain-hub-context.js +37 -0
  153. package/dist/dashboard/brain-hub-context.js.map +1 -0
  154. package/dist/dashboard/brain-hub-controls.d.ts +2 -0
  155. package/dist/dashboard/brain-hub-controls.d.ts.map +1 -0
  156. package/dist/dashboard/brain-hub-controls.js +63 -0
  157. package/dist/dashboard/brain-hub-controls.js.map +1 -0
  158. package/dist/dashboard/brain-hub-exchanges.d.ts +2 -0
  159. package/dist/dashboard/brain-hub-exchanges.d.ts.map +1 -0
  160. package/dist/dashboard/brain-hub-exchanges.js +82 -0
  161. package/dist/dashboard/brain-hub-exchanges.js.map +1 -0
  162. package/dist/dashboard/brain-hub-graph.d.ts.map +1 -1
  163. package/dist/dashboard/brain-hub-graph.js +236 -74
  164. package/dist/dashboard/brain-hub-graph.js.map +1 -1
  165. package/dist/dashboard/brain-hub-html.d.ts.map +1 -1
  166. package/dist/dashboard/brain-hub-html.js +56 -1
  167. package/dist/dashboard/brain-hub-html.js.map +1 -1
  168. package/dist/dashboard/brain-hub-knowledge.d.ts +2 -0
  169. package/dist/dashboard/brain-hub-knowledge.d.ts.map +1 -0
  170. package/dist/dashboard/brain-hub-knowledge.js +33 -0
  171. package/dist/dashboard/brain-hub-knowledge.js.map +1 -0
  172. package/dist/dashboard/brain-hub-live.d.ts +2 -0
  173. package/dist/dashboard/brain-hub-live.d.ts.map +1 -0
  174. package/dist/dashboard/brain-hub-live.js +151 -0
  175. package/dist/dashboard/brain-hub-live.js.map +1 -0
  176. package/dist/dashboard/brain-hub-managed-skills.d.ts +2 -0
  177. package/dist/dashboard/brain-hub-managed-skills.d.ts.map +1 -0
  178. package/dist/dashboard/brain-hub-managed-skills.js +20 -0
  179. package/dist/dashboard/brain-hub-managed-skills.js.map +1 -0
  180. package/dist/dashboard/brain-hub-native.d.ts +2 -0
  181. package/dist/dashboard/brain-hub-native.d.ts.map +1 -0
  182. package/dist/dashboard/brain-hub-native.js +44 -0
  183. package/dist/dashboard/brain-hub-native.js.map +1 -0
  184. package/dist/dashboard/brain-hub-project-views.d.ts.map +1 -1
  185. package/dist/dashboard/brain-hub-project-views.js +78 -77
  186. package/dist/dashboard/brain-hub-project-views.js.map +1 -1
  187. package/dist/dashboard/brain-hub-sessions.d.ts +2 -0
  188. package/dist/dashboard/brain-hub-sessions.d.ts.map +1 -0
  189. package/dist/dashboard/brain-hub-sessions.js +40 -0
  190. package/dist/dashboard/brain-hub-sessions.js.map +1 -0
  191. package/dist/dashboard/brain-hub-usage.d.ts +2 -0
  192. package/dist/dashboard/brain-hub-usage.d.ts.map +1 -0
  193. package/dist/dashboard/brain-hub-usage.js +28 -0
  194. package/dist/dashboard/brain-hub-usage.js.map +1 -0
  195. package/dist/dashboard/brain-hub-views.d.ts.map +1 -1
  196. package/dist/dashboard/brain-hub-views.js +151 -146
  197. package/dist/dashboard/brain-hub-views.js.map +1 -1
  198. package/dist/dashboard/live-workspace-html.js +1039 -1039
  199. package/dist/dashboard/managed-project-skills-api.d.ts +29 -0
  200. package/dist/dashboard/managed-project-skills-api.d.ts.map +1 -0
  201. package/dist/dashboard/managed-project-skills-api.js +28 -0
  202. package/dist/dashboard/managed-project-skills-api.js.map +1 -0
  203. package/dist/dashboard/native-codex-api.d.ts +83 -0
  204. package/dist/dashboard/native-codex-api.d.ts.map +1 -0
  205. package/dist/dashboard/native-codex-api.js +91 -0
  206. package/dist/dashboard/native-codex-api.js.map +1 -0
  207. package/dist/dashboard/project-file-watch.d.ts +46 -0
  208. package/dist/dashboard/project-file-watch.d.ts.map +1 -0
  209. package/dist/dashboard/project-file-watch.js +221 -0
  210. package/dist/dashboard/project-file-watch.js.map +1 -0
  211. package/dist/dashboard/project-live-stream.d.ts +33 -0
  212. package/dist/dashboard/project-live-stream.d.ts.map +1 -0
  213. package/dist/dashboard/project-live-stream.js +233 -0
  214. package/dist/dashboard/project-live-stream.js.map +1 -0
  215. package/dist/dashboard/project-policy-api.d.ts +37 -0
  216. package/dist/dashboard/project-policy-api.d.ts.map +1 -0
  217. package/dist/dashboard/project-policy-api.js +31 -0
  218. package/dist/dashboard/project-policy-api.js.map +1 -0
  219. package/dist/dashboard/project-session-api.d.ts +28 -0
  220. package/dist/dashboard/project-session-api.d.ts.map +1 -0
  221. package/dist/dashboard/project-session-api.js +84 -0
  222. package/dist/dashboard/project-session-api.js.map +1 -0
  223. package/dist/dashboard/project-source-api.d.ts +11 -0
  224. package/dist/dashboard/project-source-api.d.ts.map +1 -0
  225. package/dist/dashboard/project-source-api.js +67 -0
  226. package/dist/dashboard/project-source-api.js.map +1 -0
  227. package/dist/dashboard/project-workspace.d.ts.map +1 -1
  228. package/dist/dashboard/project-workspace.js +18 -0
  229. package/dist/dashboard/project-workspace.js.map +1 -1
  230. package/dist/dashboard/server.d.ts.map +1 -1
  231. package/dist/dashboard/server.js +64 -25
  232. package/dist/dashboard/server.js.map +1 -1
  233. package/dist/dashboard/v6-dashboard-html.d.ts +1 -1
  234. package/dist/dashboard/v6-dashboard-html.d.ts.map +1 -1
  235. package/dist/dashboard/v6-dashboard-html.js +4261 -4309
  236. package/dist/dashboard/v6-dashboard-html.js.map +1 -1
  237. package/dist/dashboard/workspace-api.d.ts.map +1 -1
  238. package/dist/dashboard/workspace-api.js +105 -23
  239. package/dist/dashboard/workspace-api.js.map +1 -1
  240. package/dist/dashboard/workspace-status.d.ts +3 -0
  241. package/dist/dashboard/workspace-status.d.ts.map +1 -1
  242. package/dist/dashboard/workspace-status.js +4 -3
  243. package/dist/dashboard/workspace-status.js.map +1 -1
  244. package/dist/project-cli.js +1 -1
  245. package/dist/project-cli.js.map +1 -1
  246. package/docs/BRAND_ASSETS.md +36 -0
  247. package/docs/FEATURES_AND_LIMITS.md +29 -24
  248. package/docs/INTEGRATIONS.md +4 -2
  249. package/docs/LEARNING.md +1 -1
  250. package/docs/PROJECT_KIT.md +6 -1
  251. package/docs/QUICKSTART.md +62 -44
  252. package/docs/README.md +36 -33
  253. package/docs/SESSIONS.md +77 -0
  254. package/docs/SOURCE_INTAKE.md +33 -0
  255. package/docs/STATS.md +21 -21
  256. package/docs/VISUAL_GUIDE_v7.22.0.md +73 -0
  257. package/docs/WORKFLOW_INTEGRATION.md +3 -1
  258. package/docs/WORKSPACE.md +63 -37
  259. package/docs/assets/7.22.0-agent-dock-mobile.png +0 -0
  260. package/docs/assets/7.22.0-agent-dock.gif +0 -0
  261. package/docs/assets/7.22.0-agent-dock.png +0 -0
  262. package/docs/assets/7.22.0-hub-exchange.png +0 -0
  263. package/docs/assets/7.22.0-hub-exchanges.gif +0 -0
  264. package/docs/assets/7.22.0-hub-graph.png +0 -0
  265. package/docs/assets/7.22.0-hub-mobile-empty.png +0 -0
  266. package/docs/assets/7.22.0-managed-skills.png +0 -0
  267. package/docs/assets/7.22.0-plain-evidence.png +0 -0
  268. package/docs/assets/7.22.0-project-controls.png +0 -0
  269. package/docs/assets/7.22.0-sessions.png +0 -0
  270. package/docs/assets/7.22.0-teach-brain.png +0 -0
  271. package/docs/launch/RELEASE_ACCEPTANCE_v7.22.0.md +48 -0
  272. package/docs/launch/RELEASE_NOTES_v7.22.0.md +53 -0
  273. package/docs/launch/RESEARCH_AND_PLAN_v7.22.0.md +672 -0
  274. package/package.json +135 -130
  275. package/skills/shadow-workflow/SKILL.md +2 -0
@@ -0,0 +1,255 @@
1
+ import { BRAIN_HUB_BRAND_ICONS } from './brain-hub-brand-icons.js';
2
+ export const BRAIN_HUB_AGENT_DOCK = 'const brainBrandMarks = ' + JSON.stringify(BRAIN_HUB_BRAND_ICONS) + ';\n' + String.raw `
3
+ const observedPulses=new Map();
4
+ let dockTool=null,dockSession=null,dockPinned=false;
5
+ let dockPresenceTimer=0,dockPresenceReceived=0;
6
+ const dockVisible=scope=>scope==='overview'||scope==='sessions';
7
+ const rosterTool=label=>typeof label==='string'&&label&&label!=='user'&&label!=='portal';
8
+ const toolKey=value=>JSON.stringify([value.projectId,value.tool,value.kind,value.identity]);
9
+ const toolOrder=['codex','claude-code','deepseek-harness','opencode'];
10
+ const presenceClock=()=>Date.parse(state.presence?.checkedAt)+(performance.now()-dockPresenceReceived);
11
+ function currentDockConnections(){
12
+ if(!state.presence?.enabled||state.errors?.presence||state.connection!=='reachable')return [];
13
+ const now=presenceClock();
14
+ return arr(state.presence.connections).filter(item=>Date.parse(item.expiresAt)>now);
15
+ }
16
+ function noteAgentActivity(events){
17
+ if(document.hidden||reduced.matches||state.motionPaused||state.replayId||!dockVisible(state.view))return;
18
+ const now=Date.now();
19
+ for(const event of events)if(rosterTool(event.agent)&&event.projectId&&event.sessionId){
20
+ const age=now-Date.parse(event.timestamp);
21
+ if(age>=0&&age<6500)observedPulses.set(event.id,{until:now+1300});
22
+ }
23
+ for(const [id,pulse] of observedPulses)if(pulse.until<now)observedPulses.delete(id);
24
+ }
25
+ function rosterState(){
26
+ const groups=new Map();
27
+ const scope=state.project;
28
+ const accepts=(projectId,tool)=>projectId&&(!scope||scope===projectId)&&rosterTool(tool);
29
+ function group(projectId,tool,kind,identity){
30
+ const key=toolKey({projectId,tool,kind,identity});
31
+ let record=groups.get(key);
32
+ if(!record){record={key,projectId,tool,kind,identity,session:null,event:null,receipt:null};groups.set(key,record);}
33
+ return record;
34
+ }
35
+ const connections=new Map(),hostChats=new Map();
36
+ const connectionKey=(projectId,connectionId)=>JSON.stringify([projectId,connectionId]);
37
+ for(const session of arr(state.sessions?.sessions)){
38
+ const projectId=state.sessions.projectId,tool=session.native?.tool??session.actor?.tool;
39
+ const hostId=session.hostSessionId,connection=session.actor?.kind==='agent'&&session.actor?.id?.startsWith(tool+':mcp-')
40
+ ?session.actor.id.slice(tool.length+1):null;
41
+ if(!accepts(projectId,tool))continue;
42
+ const record=group(projectId,tool,'project-session',session.id);
43
+ record.session=session;record.connection=connection;
44
+ if(hostId){
45
+ const key=JSON.stringify([projectId,tool,hostId]);
46
+ const list=hostChats.get(key)??[];
47
+ list.push(record);hostChats.set(key,list);
48
+ }
49
+ if(connection){
50
+ const key=connectionKey(projectId,connection);
51
+ connections.set(key,connections.has(key)&&connections.get(key)!==tool?null:tool);
52
+ }
53
+ }
54
+ for(const connection of currentDockConnections()){
55
+ const projectId=state.presence.projectId;
56
+ if(!accepts(projectId,connection.tool))continue;
57
+ connections.set(connectionKey(projectId,connection.id),connection.tool);
58
+ group(projectId,connection.tool,'connection',connection.id).presence=connection;
59
+ }
60
+ for(const event of state.events){
61
+ if(!event.sessionId||!accepts(event.projectId,event.agent))continue;
62
+ const measured=event.source==='measured'&&event.transport==='mcp';
63
+ const tool=measured&&event.agent==='mcp-client'?connections.get(connectionKey(event.projectId,event.sessionId))??event.agent:event.agent;
64
+ const record=group(event.projectId,tool,measured?'connection':'report',event.sessionId);
65
+ if(!record.event||event.sequence>record.event.sequence)record.event=event;
66
+ }
67
+ const models=new Set();
68
+ for(const receipt of arr(state.usage?.receipts)){
69
+ if(!receipt.sessionId||!accepts(receipt.projectId,receipt.agent))continue;
70
+ const matches=hostChats.get(JSON.stringify([receipt.projectId,receipt.agent,receipt.sessionId]))??[];
71
+ const record=matches.length===1?matches[0]:group(receipt.projectId,receipt.agent,'conversation',receipt.sessionId);
72
+ if(matches.length>1)record.sharedReceipt=true;
73
+ if(!record.receipt||receipt.recordedAt>=record.receipt.recordedAt)record.receipt=receipt;
74
+ const model=receipt.responseModel??receipt.requestModel;
75
+ if(model)models.add(JSON.stringify([receipt.provider??null,model]));
76
+ }
77
+ const tools=new Map();
78
+ for(const record of groups.values()){
79
+ const latest=[record.event?.timestamp,record.receipt?.recordedAt,record.session?.lastReportedAt,record.presence?.lastSeenAt].filter(Boolean).sort().at(-1);
80
+ record.latest=latest;
81
+ if(!tools.has(record.tool))tools.set(record.tool,[]);
82
+ tools.get(record.tool).push(record);
83
+ }
84
+ for(const rows of tools.values())rows.sort((a,b)=>String(b.latest??'').localeCompare(String(a.latest??'')));
85
+ const order=tool=>toolOrder.includes(tool)?toolOrder.indexOf(tool):toolOrder.length;
86
+ const sorted=[...tools].sort((a,b)=>order(a[0])-order(b[0])||a[0].localeCompare(b[0]));
87
+ return {tools:sorted,groups,models:models.size};
88
+ }
89
+ function toolMark(tool){
90
+ const icon=Object.hasOwn(brainBrandMarks,tool)?brainBrandMarks[tool]:'<span>'+esc(hostName(tool).slice(0,2).toUpperCase())+'</span>';
91
+ return '<span class="tool-mark" aria-hidden="true">'+icon+'</span>';
92
+ }
93
+ function toolEnabled(tool){
94
+ if(!local||!state.policy||state.errors.policy)return null;
95
+ return arr(state.policy.policy.tools).find(item=>item.tool===tool.toLowerCase().trim())?.enabled!==false;
96
+ }
97
+ function dockAction(record){
98
+ const {event,receipt,session}=record;
99
+ if(record.kind==='connection'&&event)return [eventLabel(event),evidence(event)];
100
+ if(event&&event.timestamp===record.latest)return [eventLabel(event),evidence(event)];
101
+ if(receipt&&receipt.recordedAt===record.latest)return ['Model usage receipt','Host-reported'];
102
+ if(session)return [session.native||session.sourceId?'Conversation snapshot':session.reportedStatus==='completed'?'Reported completed':
103
+ session.reportedStatus==='waiting'?'Reported waiting':'Reported working','Recorded session'];
104
+ return record.presence?['No recorded action','Transport heartbeat'] : ['Unavailable','No evidence'];
105
+ }
106
+ function toolDockInspector(record,records){
107
+ const {event,receipt,session}=record;
108
+ const [actionLabel,provenance]=dockAction(record);
109
+ const actualTitle=session?.native?session.native.titleExact??'Unavailable':session?.title??'Not reported';
110
+ const role=arr(state.policy?.chats).find(chat=>chat.id===session?.id)?.role??'Unassigned';
111
+ const workspace=arr(state.overview?.projects).find(project=>project.id===record.projectId)?.name??record.projectId;
112
+ const counter=value=>Number.isFinite(value)?fmt(value):'Not reported';
113
+ const availability=toolEnabled(record.tool);
114
+ const labelFor=item=>item.session?(item.session.native?item.session.native.titleExact??'Untitled native snapshot':item.session.title):
115
+ (item.kind==='connection'?'MCP connection ':item.kind==='report'?'Host report ':item.sharedReceipt?'Shared chat usage ':'Usage receipt ')+item.identity;
116
+ const chooser=records.length>1?list(records.map(item=>{
117
+ const model=item.receipt?.responseModel??item.receipt?.requestModel;
118
+ return '<li><button class="tool-dock-record" type="button" data-dock-record="'+esc(item.key)+'" aria-pressed="'+(item.key===record.key)+'"><strong>'+
119
+ esc(labelFor(item))+'</strong>'+(model?'<small class="muted">'+esc(model)+'</small>':'')+'</button></li>';
120
+ }).join(''),'aria-label="Chats and connection evidence"','tool-dock-record-list'):'';
121
+ const idLabel=record.kind==='connection'?'MCP connection ID':record.kind==='report'?'Reported session ID':record.kind==='project-session'?'Project session ID':'Host chat ID';
122
+ return '<section class="tool-dock-details" id="tool-dock-details" aria-label="'+esc(hostName(record.tool))+' activity details">'+
123
+ '<div class="row"><h3>'+esc(hostName(record.tool))+'</h3><div class="actions">'+
124
+ (session?btn('Open session','data-dock-open="'+esc(session.id)+'"','quiet'):'')+
125
+ btn('Close details','data-dock-close','quiet')+'</div></div>'+chooser+
126
+ '<div class="tool-evidence-grid"><dl class="facts">'+fact('Workspace',workspace)+fact('Conversation',actualTitle)+
127
+ fact(idLabel,record.identity)+(session?.hostSessionId?fact('Host chat ID',session.hostSessionId):'')+
128
+ (record.connection?fact('Reporting MCP connection',record.connection):'')+
129
+ fact('Coordination role',role)+fact('Participation',availability===null?'Unavailable':availability?'Enabled':'Disabled')+'</dl>'+
130
+ '<dl class="facts">'+fact('Latest recorded action',actionLabel)+fact('Evidence',provenance)+fact('Last seen',isoTime(record.latest))+
131
+ (record.presence?fact('MCP heartbeat',isoTime(record.presence.lastSeenAt)): '')+
132
+ fact('Latest tool duration',Number.isFinite(event?.durationMs)?fmt(event.durationMs)+' ms · '+evidence(event):'Not recorded')+'</dl>'+
133
+ '<dl class="facts">'+fact('Model',receipt?.responseModel??receipt?.requestModel??'Not reported')+fact('Provider',receipt?.provider??'Not reported')+
134
+ fact('Host-reported effort',receipt?.reasoningEffort??'Not reported')+fact('Reported input tokens',counter(receipt?.inputTokens))+
135
+ fact('Reported output tokens',counter(receipt?.outputTokens))+(receipt?fact('Usage receipt time',isoTime(receipt.recordedAt)):'')+
136
+ (record.sharedReceipt?fact('Attribution','Shared chat receipt · individual session unavailable'):'')+'</dl></div></section>';
137
+ }
138
+ function pickDockRecord(){
139
+ if(!dockTool)return;
140
+ const records=rosterState().tools.find(([tool])=>tool===dockTool)?.[1]??[];
141
+ dockSession=(records.find(item=>item.session)??records[0])?.key??null;
142
+ }
143
+ function agentDockMarkup(){
144
+ const {tools,groups,models}=rosterState();
145
+ const visible=tools.slice(0,12);
146
+ if(dockTool&&!visible.some(([tool])=>tool===dockTool)){dockTool=null;dockSession=null;dockPinned=false;}
147
+ const controls=visible.map(([tool,records])=>{
148
+ const availability=toolEnabled(tool);
149
+ const latestEvent=records.map(item=>item.event).filter(Boolean).sort((a,b)=>b.sequence-a.sequence)[0];
150
+ const chats=new Set(records.filter(item=>item.session).map(item=>JSON.stringify([item.projectId,item.session.hostSessionId??item.identity]))).size;
151
+ const workers=records.filter(item=>item.session&&arr(state.policy?.chats).some(chat=>chat.id===item.session.id&&chat.role==='worker')).length;
152
+ const reporting=records.filter(item=>item.presence).length;
153
+ const description=availability===false?'Participation off':chats?chats+' chat'+(chats===1?'':'s')+(workers?' · '+workers+' worker'+(workers===1?'':'s'):''):
154
+ reporting?reporting+' reporting':latestEvent?'Observed '+time(latestEvent.timestamp):'Reported usage';
155
+ return '<li><button class="tool-dock-button" type="button" data-dock-tool="'+esc(tool)+'" aria-label="Inspect '+esc(hostName(tool))+'" aria-expanded="'+(tool===dockTool)+'" aria-controls="tool-dock-details">'+
156
+ toolMark(tool)+'<span class="tool-dock-text"><strong>'+esc(hostName(tool))+'</strong><small>'+esc(description)+
157
+ '</small></span><span class="tool-dock-indicator" data-observed="'+esc(latestEvent?.id)+'" title="'+esc(reporting?reporting+' reporting MCP connections':'No current transport heartbeat')+'" aria-hidden="true"></span></button></li>';
158
+ }).join('');
159
+ const selection=tools.find(([tool])=>tool===dockTool)?.[1]??[];
160
+ const row=selection.find(item=>item.key===dockSession)??selection.find(item=>item.session)??selection[0];
161
+ const conversations=new Set([...groups.values()].filter(item=>item.session).map(item=>JSON.stringify([item.projectId,item.tool,item.session.hostSessionId??item.identity]))).size;
162
+ const agents=[...groups.values()].filter(item=>item.session?.actor?.kind==='agent').length;
163
+ const connections=[...groups.values()].filter(item=>item.kind==='connection').length;
164
+ const presence=state.errors.presence||local&&state.connection==='offline'?'Reporting MCP connections unavailable':
165
+ state.presence?.enabled===false?'MCP presence recording off':state.presence?fmt(currentDockConnections().length)+' reporting MCP connections':
166
+ local?'MCP presence loading':fmt(connections)+' observed MCP connections';
167
+ const sourceState=!state.live&&state.features?.features?.liveActivity===false?'Journal display off':
168
+ state.errors.telemetry||state.connection==='offline'?'Previously loaded activity':'Recorded activity';
169
+ return '<div class="tool-dock-head"><h2>Tool activity</h2><p class="small muted">'+
170
+ fmt(tools.length)+' tools <span aria-hidden="true">·</span> '+fmt(agents)+' agent sessions <span aria-hidden="true">·</span> '+fmt(conversations)+' registered chats <span aria-hidden="true">·</span> '+esc(presence)+' <span aria-hidden="true">·</span> '+fmt(models)+' reported models'+
171
+ (tools.length>visible.length?' · '+visible.length+' shown':'')+'</p></div>'+
172
+ (controls?list(controls,'aria-label="Tools with project evidence"','tool-dock-list'):'<p class="tool-dock-empty small muted">Tool records appear after a measured exchange or explicit host report.</p>')+
173
+ (row?toolDockInspector(row,selection):'<div id="tool-dock-details" hidden></div>')+'<p class="tool-dock-caption small muted">'+esc(sourceState)+
174
+ ' · Retained evidence'+(state.presence?.enabled&&!state.errors.presence?' · MCP heartbeat window '+Math.round(state.presence.expiresAfterMs/1000)+'s':'')+
175
+ (state.errors.sessions?' · Sessions unavailable':'')+(state.errors.usage?' · Usage unavailable':'')+(state.errors.policy?' · Controls unavailable':'')+'</p>';
176
+ }
177
+ function installDockPresence(value){
178
+ state.presence=value;dockPresenceReceived=performance.now();
179
+ }
180
+ function scheduleDockExpiry(){
181
+ clearTimeout(dockPresenceTimer);
182
+ if(document.hidden||!dockVisible(state.view)||!state.presence?.enabled||state.errors.presence)return;
183
+ const now=presenceClock();
184
+ const dates=arr(state.presence.connections).map(item=>Date.parse(item.expiresAt)).filter(time=>Number.isFinite(time));
185
+ if(!dates.length||!Number.isFinite(now))return;
186
+ dockPresenceTimer=setTimeout(()=>{updateAgentDock();queueLive(['presence']);},Math.max(150,Math.min(...dates)-now+100));
187
+ }
188
+ function agentDock(){return '<section class="panel tool-dock" id="tool-dock" aria-label="Tool activity">'+agentDockMarkup()+'</section>';}
189
+ function updateAgentDock(){
190
+ const dock=$('tool-dock');
191
+ if(!dock)return;
192
+ const focus=document.activeElement;
193
+ const key=dock.contains(focus)?focus?.dataset.dockTool:null;
194
+ const recordKey=dock.contains(focus)?focus?.dataset.dockRecord:null;
195
+ const focused=dock.contains(focus);
196
+ const id=focused?focus?.id:null;
197
+ const markup=agentDockMarkup();
198
+ if(dock.dataset.markup!==markup){
199
+ dock.innerHTML=markup;dock.dataset.markup=markup;
200
+ if(key)focusDockTool(key);
201
+ else if(recordKey)[...dock.querySelectorAll('[data-dock-record]')].find(button=>button.dataset.dockRecord===recordKey)?.focus({preventScroll:true});
202
+ else if(id)$(id)?.focus({preventScroll:true});
203
+ else if(focused)focusDockTool(dockTool);
204
+ }
205
+ const now=Date.now();
206
+ if(document.hidden||reduced.matches||state.motionPaused||state.replayId||state.connection!=='reachable'||!state.live){
207
+ observedPulses.clear();
208
+ for(const mark of dock.querySelectorAll('.tool-activity-pulse'))mark.classList.remove('tool-activity-pulse');
209
+ return;
210
+ }
211
+ for(const button of dock.querySelectorAll('[data-dock-tool]')){
212
+ const dot=button.querySelector('.tool-dock-indicator');
213
+ const id=dot.dataset.observed,pulse=observedPulses.get(id);
214
+ if(pulse&&pulse.until>now){
215
+ if(dot.dataset.event===id)continue;
216
+ dot.dataset.event=id;
217
+ dot.classList.remove('tool-activity-pulse');
218
+ void dot.offsetWidth;
219
+ dot.classList.add('tool-activity-pulse');
220
+ }
221
+ }
222
+ }
223
+ let dockFocusRestore=false;
224
+ function focusDockTool(tool){
225
+ dockFocusRestore=true;
226
+ [...$('tool-dock')?.querySelectorAll('[data-dock-tool]')??[]].find(button=>button.dataset.dockTool===tool)?.focus({preventScroll:true});
227
+ dockFocusRestore=false;
228
+ }
229
+ function previewDockTool(target){
230
+ const tool=target.closest?.('[data-dock-tool]')?.dataset.dockTool;
231
+ if(!tool||dockPinned||dockFocusRestore||tool===dockTool)return;
232
+ dockTool=tool;pickDockRecord();updateAgentDock();
233
+ }
234
+ function handleAgentDock(button){
235
+ const data=button.dataset;
236
+ if(data.dockTool){
237
+ if(dockPinned&&dockTool===data.dockTool){dockTool=null;dockSession=null;dockPinned=false;updateAgentDock();focusDockTool(data.dockTool);return true;}
238
+ dockPinned=true;dockTool=data.dockTool;dockSession=null;
239
+ pickDockRecord();
240
+ updateAgentDock();focusDockTool(data.dockTool);return true;
241
+ }
242
+ if(Object.hasOwn(data,'dockClose')){
243
+ const prior=dockTool;dockTool=null;dockSession=null;dockPinned=false;updateAgentDock();focusDockTool(prior);return true;
244
+ }
245
+ if(data.dockRecord){dockSession=data.dockRecord;dockPinned=true;updateAgentDock();return true;}
246
+ if(data.dockOpen){
247
+ openView('sessions');
248
+ void mutation(async()=>{state.sessionBefore=null;state.sessionCheckpoint=null;state.session=await api('sessions/'+encodeURIComponent(data.dockOpen));},button,'Session opened.')
249
+ .then(()=>$('conversation-continuity')?.focus({preventScroll:true}));
250
+ return true;
251
+ }
252
+ return false;
253
+ }
254
+ `;
255
+ //# sourceMappingURL=brain-hub-agent-dock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-hub-agent-dock.js","sourceRoot":"","sources":["../../src/dashboard/brain-hub-agent-dock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,MAAM,CAAC,MAAM,oBAAoB,GAAG,0BAA0B,GAAG,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4P1H,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const BRAIN_HUB_BRAND_ICONS: Record<string, string>;
2
+ //# sourceMappingURL=brain-hub-brand-icons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-hub-brand-icons.d.ts","sourceRoot":"","sources":["../../src/dashboard/brain-hub-brand-icons.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKxD,CAAC"}
@@ -0,0 +1,9 @@
1
+ // Local integration identifiers from Lobe Icons, MIT. See docs/BRAND_ASSETS.md.
2
+ // Keep these trusted SVG strings local; no remote image request or icon runtime.
3
+ export const BRAIN_HUB_BRAND_ICONS = {
4
+ "codex": "<svg fill=\"currentColor\" fill-rule=\"evenodd\" height=\"1em\" style=\"flex:none;line-height:1\" viewBox=\"0 0 24 24\" width=\"1em\" xmlns=\"http://www.w3.org/2000/svg\"><title>OpenAI</title><path d=\"M9.205 8.658v-2.26c0-.19.072-.333.238-.428l4.543-2.616c.619-.357 1.356-.523 2.117-.523 2.854 0 4.662 2.212 4.662 4.566 0 .167 0 .357-.024.547l-4.71-2.759a.797.797 0 00-.856 0l-5.97 3.473zm10.609 8.8V12.06c0-.333-.143-.57-.429-.737l-5.97-3.473 1.95-1.118a.433.433 0 01.476 0l4.543 2.617c1.309.76 2.189 2.378 2.189 3.948 0 1.808-1.07 3.473-2.76 4.163zM7.802 12.703l-1.95-1.142c-.167-.095-.239-.238-.239-.428V5.899c0-2.545 1.95-4.472 4.591-4.472 1 0 1.927.333 2.712.928L8.23 5.067c-.285.166-.428.404-.428.737v6.898zM12 15.128l-2.795-1.57v-3.33L12 8.658l2.795 1.57v3.33L12 15.128zm1.796 7.23c-1 0-1.927-.332-2.712-.927l4.686-2.712c.285-.166.428-.404.428-.737v-6.898l1.974 1.142c.167.095.238.238.238.428v5.233c0 2.545-1.974 4.472-4.614 4.472zm-5.637-5.303l-4.544-2.617c-1.308-.761-2.188-2.378-2.188-3.948A4.482 4.482 0 014.21 6.327v5.423c0 .333.143.571.428.738l5.947 3.449-1.95 1.118a.432.432 0 01-.476 0zm-.262 3.9c-2.688 0-4.662-2.021-4.662-4.519 0-.19.024-.38.047-.57l4.686 2.71c.286.167.571.167.856 0l5.97-3.448v2.26c0 .19-.07.333-.237.428l-4.543 2.616c-.619.357-1.356.523-2.117.523zm5.899 2.83a5.947 5.947 0 005.827-4.756C22.287 18.339 24 15.84 24 13.296c0-1.665-.713-3.282-1.998-4.448.119-.5.19-.999.19-1.498 0-3.401-2.759-5.947-5.946-5.947-.642 0-1.26.095-1.88.31A5.962 5.962 0 0010.205 0a5.947 5.947 0 00-5.827 4.757C1.713 5.447 0 7.945 0 10.49c0 1.666.713 3.283 1.998 4.448-.119.5-.19 1-.19 1.499 0 3.401 2.759 5.946 5.946 5.946.642 0 1.26-.095 1.88-.309a5.96 5.96 0 004.162 1.713z\"></path></svg>",
5
+ "claude-code": "<svg fill=\"currentColor\" fill-rule=\"evenodd\" height=\"1em\" style=\"flex:none;line-height:1\" viewBox=\"0 0 24 24\" width=\"1em\" xmlns=\"http://www.w3.org/2000/svg\"><title>Claude</title><path d=\"M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z\"></path></svg>",
6
+ "deepseek-harness": "<svg fill=\"currentColor\" fill-rule=\"evenodd\" height=\"1em\" style=\"flex:none;line-height:1\" viewBox=\"0 0 24 24\" width=\"1em\" xmlns=\"http://www.w3.org/2000/svg\"><title>DeepSeek</title><path d=\"M23.748 4.482c-.254-.124-.364.113-.512.234-.051.039-.094.09-.137.136-.372.397-.806.657-1.373.626-.829-.046-1.537.214-2.163.848-.133-.782-.575-1.248-1.247-1.548-.352-.156-.708-.311-.955-.65-.172-.241-.219-.51-.305-.774-.055-.16-.11-.323-.293-.35-.2-.031-.278.136-.356.276-.313.572-.434 1.202-.422 1.84.027 1.436.633 2.58 1.838 3.393.137.093.172.187.129.323-.082.28-.18.552-.266.833-.055.179-.137.217-.329.14a5.526 5.526 0 01-1.736-1.18c-.857-.828-1.631-1.742-2.597-2.458a11.365 11.365 0 00-.689-.471c-.985-.957.13-1.743.388-1.836.27-.098.093-.432-.779-.428-.872.004-1.67.295-2.687.684a3.055 3.055 0 01-.465.137 9.597 9.597 0 00-2.883-.102c-1.885.21-3.39 1.102-4.497 2.623C.082 8.606-.231 10.684.152 12.85c.403 2.284 1.569 4.175 3.36 5.653 1.858 1.533 3.997 2.284 6.438 2.14 1.482-.085 3.133-.284 4.994-1.86.47.234.962.327 1.78.397.63.059 1.236-.03 1.705-.128.735-.156.684-.837.419-.961-2.155-1.004-1.682-.595-2.113-.926 1.096-1.296 2.746-2.642 3.392-7.003.05-.347.007-.565 0-.845-.004-.17.035-.237.23-.256a4.173 4.173 0 001.545-.475c1.396-.763 1.96-2.015 2.093-3.517.02-.23-.004-.467-.247-.588zM11.581 18c-2.089-1.642-3.102-2.183-3.52-2.16-.392.024-.321.471-.235.763.09.288.207.486.371.739.114.167.192.416-.113.603-.673.416-1.842-.14-1.897-.167-1.361-.802-2.5-1.86-3.301-3.307-.774-1.393-1.224-2.887-1.298-4.482-.02-.386.093-.522.477-.592a4.696 4.696 0 011.529-.039c2.132.312 3.946 1.265 5.468 2.774.868.86 1.525 1.887 2.202 2.891.72 1.066 1.494 2.082 2.48 2.914.348.292.625.514.891.677-.802.09-2.14.11-3.054-.614zm1-6.44a.306.306 0 01.415-.287.302.302 0 01.2.288.306.306 0 01-.31.307.303.303 0 01-.304-.308zm3.11 1.596c-.2.081-.399.151-.59.16a1.245 1.245 0 01-.798-.254c-.274-.23-.47-.358-.552-.758a1.73 1.73 0 01.016-.588c.07-.327-.008-.537-.239-.727-.187-.156-.426-.199-.688-.199a.559.559 0 01-.254-.078c-.11-.054-.2-.19-.114-.358.028-.054.16-.186.192-.21.356-.202.767-.136 1.146.016.352.144.618.408 1.001.782.391.451.462.576.685.914.176.265.336.537.445.848.067.195-.019.354-.25.452z\"></path></svg>",
7
+ "opencode": "<svg fill=\"currentColor\" fill-rule=\"evenodd\" height=\"1em\" style=\"flex:none;line-height:1\" viewBox=\"0 0 24 24\" width=\"1em\" xmlns=\"http://www.w3.org/2000/svg\"><title>opencode</title><path d=\"M16 6H8v12h8V6zm4 16H4V2h16v20z\"></path></svg>"
8
+ };
9
+ //# sourceMappingURL=brain-hub-brand-icons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-hub-brand-icons.js","sourceRoot":"","sources":["../../src/dashboard/brain-hub-brand-icons.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,iFAAiF;AACjF,MAAM,CAAC,MAAM,qBAAqB,GAA2B;IAC3D,OAAO,EAAE,yqDAAyqD;IAClrD,aAAa,EAAE,urDAAurD;IACtsD,kBAAkB,EAAE,+pEAA+pE;IACnrE,UAAU,EAAE,6PAA6P;CAC1Q,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"brain-hub-client.d.ts","sourceRoot":"","sources":["../../src/dashboard/brain-hub-client.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,QA6U5B,CAAC"}
1
+ {"version":3,"file":"brain-hub-client.d.ts","sourceRoot":"","sources":["../../src/dashboard/brain-hub-client.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,QAib5B,CAAC"}