@theihtisham/agent-shadow-brain 7.2.0 → 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 (438) hide show
  1. package/CHANGELOG.md +478 -429
  2. package/README.md +198 -68
  3. package/dist/activity-cli.d.ts +3 -0
  4. package/dist/activity-cli.d.ts.map +1 -0
  5. package/dist/activity-cli.js +78 -0
  6. package/dist/activity-cli.js.map +1 -0
  7. package/dist/adapters/index.d.ts +2 -1
  8. package/dist/adapters/index.d.ts.map +1 -1
  9. package/dist/adapters/index.js +3 -2
  10. package/dist/adapters/index.js.map +1 -1
  11. package/dist/brain/activity-journal.d.ts +82 -0
  12. package/dist/brain/activity-journal.d.ts.map +1 -0
  13. package/dist/brain/activity-journal.js +315 -0
  14. package/dist/brain/activity-journal.js.map +1 -0
  15. package/dist/brain/activity-reporting.d.ts +14 -0
  16. package/dist/brain/activity-reporting.d.ts.map +1 -0
  17. package/dist/brain/activity-reporting.js +17 -0
  18. package/dist/brain/activity-reporting.js.map +1 -0
  19. package/dist/brain/auto-update.js +1 -1
  20. package/dist/brain/auto-update.js.map +1 -1
  21. package/dist/brain/brain-portability.js +1 -1
  22. package/dist/brain/brain-portability.js.map +1 -1
  23. package/dist/brain/client-config.d.ts +19 -0
  24. package/dist/brain/client-config.d.ts.map +1 -0
  25. package/dist/brain/client-config.js +40 -0
  26. package/dist/brain/client-config.js.map +1 -0
  27. package/dist/brain/client-integrations.d.ts +63 -0
  28. package/dist/brain/client-integrations.d.ts.map +1 -0
  29. package/dist/brain/client-integrations.js +79 -0
  30. package/dist/brain/client-integrations.js.map +1 -0
  31. package/dist/brain/context-assembly.d.ts +41 -5
  32. package/dist/brain/context-assembly.d.ts.map +1 -1
  33. package/dist/brain/context-assembly.js +366 -35
  34. package/dist/brain/context-assembly.js.map +1 -1
  35. package/dist/brain/context-efficiency.d.ts +48 -0
  36. package/dist/brain/context-efficiency.d.ts.map +1 -0
  37. package/dist/brain/context-efficiency.js +34 -0
  38. package/dist/brain/context-efficiency.js.map +1 -0
  39. package/dist/brain/context-request.d.ts +4 -0
  40. package/dist/brain/context-request.d.ts.map +1 -0
  41. package/dist/brain/context-request.js +24 -0
  42. package/dist/brain/context-request.js.map +1 -0
  43. package/dist/brain/context-retrieval.d.ts +88 -0
  44. package/dist/brain/context-retrieval.d.ts.map +1 -0
  45. package/dist/brain/context-retrieval.js +301 -0
  46. package/dist/brain/context-retrieval.js.map +1 -0
  47. package/dist/brain/feature-settings.d.ts +10 -0
  48. package/dist/brain/feature-settings.d.ts.map +1 -1
  49. package/dist/brain/feature-settings.js +18 -2
  50. package/dist/brain/feature-settings.js.map +1 -1
  51. package/dist/brain/file-identity.d.ts +4 -0
  52. package/dist/brain/file-identity.d.ts.map +1 -0
  53. package/dist/brain/file-identity.js +27 -0
  54. package/dist/brain/file-identity.js.map +1 -0
  55. package/dist/brain/global-brain.d.ts +18 -2
  56. package/dist/brain/global-brain.d.ts.map +1 -1
  57. package/dist/brain/global-brain.js +75 -7
  58. package/dist/brain/global-brain.js.map +1 -1
  59. package/dist/brain/managed-project-skills.d.ts +48 -0
  60. package/dist/brain/managed-project-skills.d.ts.map +1 -0
  61. package/dist/brain/managed-project-skills.js +230 -0
  62. package/dist/brain/managed-project-skills.js.map +1 -0
  63. package/dist/brain/mcp-presence.d.ts +50 -0
  64. package/dist/brain/mcp-presence.d.ts.map +1 -0
  65. package/dist/brain/mcp-presence.js +214 -0
  66. package/dist/brain/mcp-presence.js.map +1 -0
  67. package/dist/brain/mcp-server.d.ts +40 -1
  68. package/dist/brain/mcp-server.d.ts.map +1 -1
  69. package/dist/brain/mcp-server.js +506 -52
  70. package/dist/brain/mcp-server.js.map +1 -1
  71. package/dist/brain/mcp-stdio.d.ts +12 -0
  72. package/dist/brain/mcp-stdio.d.ts.map +1 -0
  73. package/dist/brain/mcp-stdio.js +158 -0
  74. package/dist/brain/mcp-stdio.js.map +1 -0
  75. package/dist/brain/memory-annotations.d.ts +99 -0
  76. package/dist/brain/memory-annotations.d.ts.map +1 -0
  77. package/dist/brain/memory-annotations.js +402 -0
  78. package/dist/brain/memory-annotations.js.map +1 -0
  79. package/dist/brain/memory-graph.d.ts.map +1 -1
  80. package/dist/brain/memory-graph.js +12 -23
  81. package/dist/brain/memory-graph.js.map +1 -1
  82. package/dist/brain/memory-inspection.d.ts +73 -0
  83. package/dist/brain/memory-inspection.d.ts.map +1 -0
  84. package/dist/brain/memory-inspection.js +131 -0
  85. package/dist/brain/memory-inspection.js.map +1 -0
  86. package/dist/brain/memory-mcp-content.d.ts +46 -0
  87. package/dist/brain/memory-mcp-content.d.ts.map +1 -0
  88. package/dist/brain/memory-mcp-content.js +95 -0
  89. package/dist/brain/memory-mcp-content.js.map +1 -0
  90. package/dist/brain/memory-sources.d.ts +8 -0
  91. package/dist/brain/memory-sources.d.ts.map +1 -0
  92. package/dist/brain/memory-sources.js +27 -0
  93. package/dist/brain/memory-sources.js.map +1 -0
  94. package/dist/brain/model-registry.d.ts +4 -5
  95. package/dist/brain/model-registry.d.ts.map +1 -1
  96. package/dist/brain/model-registry.js +22 -207
  97. package/dist/brain/model-registry.js.map +1 -1
  98. package/dist/brain/model-usage.d.ts +66 -0
  99. package/dist/brain/model-usage.d.ts.map +1 -0
  100. package/dist/brain/model-usage.js +246 -0
  101. package/dist/brain/model-usage.js.map +1 -0
  102. package/dist/brain/native-codex.d.ts +105 -0
  103. package/dist/brain/native-codex.d.ts.map +1 -0
  104. package/dist/brain/native-codex.js +292 -0
  105. package/dist/brain/native-codex.js.map +1 -0
  106. package/dist/brain/native-session-import.d.ts +56 -0
  107. package/dist/brain/native-session-import.d.ts.map +1 -0
  108. package/dist/brain/native-session-import.js +307 -0
  109. package/dist/brain/native-session-import.js.map +1 -0
  110. package/dist/brain/orchestrator.js +1 -1
  111. package/dist/brain/orchestrator.js.map +1 -1
  112. package/dist/brain/project-feedback.d.ts +63 -0
  113. package/dist/brain/project-feedback.d.ts.map +1 -0
  114. package/dist/brain/project-feedback.js +300 -0
  115. package/dist/brain/project-feedback.js.map +1 -0
  116. package/dist/brain/project-hub-contract.d.ts +332 -0
  117. package/dist/brain/project-hub-contract.d.ts.map +1 -0
  118. package/dist/brain/project-hub-contract.js +57 -0
  119. package/dist/brain/project-hub-contract.js.map +1 -0
  120. package/dist/brain/project-hub-mcp.d.ts +182 -0
  121. package/dist/brain/project-hub-mcp.d.ts.map +1 -0
  122. package/dist/brain/project-hub-mcp.js +46 -0
  123. package/dist/brain/project-hub-mcp.js.map +1 -0
  124. package/dist/brain/project-hub-pdf-worker.d.ts +13 -0
  125. package/dist/brain/project-hub-pdf-worker.d.ts.map +1 -0
  126. package/dist/brain/project-hub-pdf-worker.js +84 -0
  127. package/dist/brain/project-hub-pdf-worker.js.map +1 -0
  128. package/dist/brain/project-hub-store.d.ts +50 -0
  129. package/dist/brain/project-hub-store.d.ts.map +1 -0
  130. package/dist/brain/project-hub-store.js +257 -0
  131. package/dist/brain/project-hub-store.js.map +1 -0
  132. package/dist/brain/project-hub.d.ts +132 -0
  133. package/dist/brain/project-hub.d.ts.map +1 -0
  134. package/dist/brain/project-hub.js +403 -0
  135. package/dist/brain/project-hub.js.map +1 -0
  136. package/dist/brain/project-kit-inspection.d.ts +28 -0
  137. package/dist/brain/project-kit-inspection.d.ts.map +1 -0
  138. package/dist/brain/project-kit-inspection.js +200 -0
  139. package/dist/brain/project-kit-inspection.js.map +1 -0
  140. package/dist/brain/project-kit-paths.d.ts +13 -0
  141. package/dist/brain/project-kit-paths.d.ts.map +1 -0
  142. package/dist/brain/project-kit-paths.js +141 -0
  143. package/dist/brain/project-kit-paths.js.map +1 -0
  144. package/dist/brain/project-kit.d.ts +51 -0
  145. package/dist/brain/project-kit.d.ts.map +1 -0
  146. package/dist/brain/project-kit.js +319 -0
  147. package/dist/brain/project-kit.js.map +1 -0
  148. package/dist/brain/project-memory.d.ts +38 -0
  149. package/dist/brain/project-memory.d.ts.map +1 -0
  150. package/dist/brain/project-memory.js +76 -0
  151. package/dist/brain/project-memory.js.map +1 -0
  152. package/dist/brain/project-policy-delivery.d.ts +8 -0
  153. package/dist/brain/project-policy-delivery.d.ts.map +1 -0
  154. package/dist/brain/project-policy-delivery.js +38 -0
  155. package/dist/brain/project-policy-delivery.js.map +1 -0
  156. package/dist/brain/project-policy.d.ts +88 -0
  157. package/dist/brain/project-policy.d.ts.map +1 -0
  158. package/dist/brain/project-policy.js +267 -0
  159. package/dist/brain/project-policy.js.map +1 -0
  160. package/dist/brain/project-session-contract.d.ts +180 -0
  161. package/dist/brain/project-session-contract.d.ts.map +1 -0
  162. package/dist/brain/project-session-contract.js +50 -0
  163. package/dist/brain/project-session-contract.js.map +1 -0
  164. package/dist/brain/project-session-mcp.d.ts +145 -0
  165. package/dist/brain/project-session-mcp.d.ts.map +1 -0
  166. package/dist/brain/project-session-mcp.js +58 -0
  167. package/dist/brain/project-session-mcp.js.map +1 -0
  168. package/dist/brain/project-sessions.d.ts +97 -0
  169. package/dist/brain/project-sessions.d.ts.map +1 -0
  170. package/dist/brain/project-sessions.js +223 -0
  171. package/dist/brain/project-sessions.js.map +1 -0
  172. package/dist/brain/project-source-contract.d.ts +109 -0
  173. package/dist/brain/project-source-contract.d.ts.map +1 -0
  174. package/dist/brain/project-source-contract.js +2 -0
  175. package/dist/brain/project-source-contract.js.map +1 -0
  176. package/dist/brain/project-source-intake.d.ts +26 -0
  177. package/dist/brain/project-source-intake.d.ts.map +1 -0
  178. package/dist/brain/project-source-intake.js +457 -0
  179. package/dist/brain/project-source-intake.js.map +1 -0
  180. package/dist/brain/subconscious.d.ts +3 -1
  181. package/dist/brain/subconscious.d.ts.map +1 -1
  182. package/dist/brain/subconscious.js +8 -3
  183. package/dist/brain/subconscious.js.map +1 -1
  184. package/dist/brain/workflow-skills.d.ts +5 -5
  185. package/dist/brain/workflow-skills.d.ts.map +1 -1
  186. package/dist/brain/workflow-skills.js +3 -2
  187. package/dist/brain/workflow-skills.js.map +1 -1
  188. package/dist/cli.js +37 -3
  189. package/dist/cli.js.map +1 -1
  190. package/dist/context-cli.d.ts.map +1 -1
  191. package/dist/context-cli.js +49 -7
  192. package/dist/context-cli.js.map +1 -1
  193. package/dist/curation-cli.d.ts +4 -0
  194. package/dist/curation-cli.d.ts.map +1 -0
  195. package/dist/curation-cli.js +118 -0
  196. package/dist/curation-cli.js.map +1 -0
  197. package/dist/dashboard/brain-hub-actions.d.ts +2 -0
  198. package/dist/dashboard/brain-hub-actions.d.ts.map +1 -0
  199. package/dist/dashboard/brain-hub-actions.js +234 -0
  200. package/dist/dashboard/brain-hub-actions.js.map +1 -0
  201. package/dist/dashboard/brain-hub-agent-dock.d.ts +2 -0
  202. package/dist/dashboard/brain-hub-agent-dock.d.ts.map +1 -0
  203. package/dist/dashboard/brain-hub-agent-dock.js +255 -0
  204. package/dist/dashboard/brain-hub-agent-dock.js.map +1 -0
  205. package/dist/dashboard/brain-hub-brand-icons.d.ts +2 -0
  206. package/dist/dashboard/brain-hub-brand-icons.d.ts.map +1 -0
  207. package/dist/dashboard/brain-hub-brand-icons.js +9 -0
  208. package/dist/dashboard/brain-hub-brand-icons.js.map +1 -0
  209. package/dist/dashboard/brain-hub-client.d.ts +2 -0
  210. package/dist/dashboard/brain-hub-client.d.ts.map +1 -0
  211. package/dist/dashboard/brain-hub-client.js +435 -0
  212. package/dist/dashboard/brain-hub-client.js.map +1 -0
  213. package/dist/dashboard/brain-hub-context.d.ts +2 -0
  214. package/dist/dashboard/brain-hub-context.d.ts.map +1 -0
  215. package/dist/dashboard/brain-hub-context.js +37 -0
  216. package/dist/dashboard/brain-hub-context.js.map +1 -0
  217. package/dist/dashboard/brain-hub-controls.d.ts +2 -0
  218. package/dist/dashboard/brain-hub-controls.d.ts.map +1 -0
  219. package/dist/dashboard/brain-hub-controls.js +63 -0
  220. package/dist/dashboard/brain-hub-controls.js.map +1 -0
  221. package/dist/dashboard/brain-hub-exchanges.d.ts +2 -0
  222. package/dist/dashboard/brain-hub-exchanges.d.ts.map +1 -0
  223. package/dist/dashboard/brain-hub-exchanges.js +82 -0
  224. package/dist/dashboard/brain-hub-exchanges.js.map +1 -0
  225. package/dist/dashboard/brain-hub-graph.d.ts +2 -0
  226. package/dist/dashboard/brain-hub-graph.d.ts.map +1 -0
  227. package/dist/dashboard/brain-hub-graph.js +338 -0
  228. package/dist/dashboard/brain-hub-graph.js.map +1 -0
  229. package/dist/dashboard/brain-hub-html.d.ts +2 -0
  230. package/dist/dashboard/brain-hub-html.d.ts.map +1 -0
  231. package/dist/dashboard/brain-hub-html.js +85 -0
  232. package/dist/dashboard/brain-hub-html.js.map +1 -0
  233. package/dist/dashboard/brain-hub-knowledge.d.ts +2 -0
  234. package/dist/dashboard/brain-hub-knowledge.d.ts.map +1 -0
  235. package/dist/dashboard/brain-hub-knowledge.js +33 -0
  236. package/dist/dashboard/brain-hub-knowledge.js.map +1 -0
  237. package/dist/dashboard/brain-hub-live.d.ts +2 -0
  238. package/dist/dashboard/brain-hub-live.d.ts.map +1 -0
  239. package/dist/dashboard/brain-hub-live.js +151 -0
  240. package/dist/dashboard/brain-hub-live.js.map +1 -0
  241. package/dist/dashboard/brain-hub-managed-skills.d.ts +2 -0
  242. package/dist/dashboard/brain-hub-managed-skills.d.ts.map +1 -0
  243. package/dist/dashboard/brain-hub-managed-skills.js +20 -0
  244. package/dist/dashboard/brain-hub-managed-skills.js.map +1 -0
  245. package/dist/dashboard/brain-hub-native.d.ts +2 -0
  246. package/dist/dashboard/brain-hub-native.d.ts.map +1 -0
  247. package/dist/dashboard/brain-hub-native.js +44 -0
  248. package/dist/dashboard/brain-hub-native.js.map +1 -0
  249. package/dist/dashboard/brain-hub-project-views.d.ts +2 -0
  250. package/dist/dashboard/brain-hub-project-views.d.ts.map +1 -0
  251. package/dist/dashboard/brain-hub-project-views.js +80 -0
  252. package/dist/dashboard/brain-hub-project-views.js.map +1 -0
  253. package/dist/dashboard/brain-hub-sessions.d.ts +2 -0
  254. package/dist/dashboard/brain-hub-sessions.d.ts.map +1 -0
  255. package/dist/dashboard/brain-hub-sessions.js +40 -0
  256. package/dist/dashboard/brain-hub-sessions.js.map +1 -0
  257. package/dist/dashboard/brain-hub-usage.d.ts +2 -0
  258. package/dist/dashboard/brain-hub-usage.d.ts.map +1 -0
  259. package/dist/dashboard/brain-hub-usage.js +28 -0
  260. package/dist/dashboard/brain-hub-usage.js.map +1 -0
  261. package/dist/dashboard/brain-hub-views.d.ts +2 -0
  262. package/dist/dashboard/brain-hub-views.d.ts.map +1 -0
  263. package/dist/dashboard/brain-hub-views.js +155 -0
  264. package/dist/dashboard/brain-hub-views.js.map +1 -0
  265. package/dist/dashboard/demo-workspace.d.ts +11 -0
  266. package/dist/dashboard/demo-workspace.d.ts.map +1 -0
  267. package/dist/dashboard/demo-workspace.js +178 -0
  268. package/dist/dashboard/demo-workspace.js.map +1 -0
  269. package/dist/dashboard/live-workspace-html.d.ts +2 -0
  270. package/dist/dashboard/live-workspace-html.d.ts.map +1 -0
  271. package/dist/dashboard/live-workspace-html.js +1042 -0
  272. package/dist/dashboard/live-workspace-html.js.map +1 -0
  273. package/dist/dashboard/managed-project-skills-api.d.ts +29 -0
  274. package/dist/dashboard/managed-project-skills-api.d.ts.map +1 -0
  275. package/dist/dashboard/managed-project-skills-api.js +28 -0
  276. package/dist/dashboard/managed-project-skills-api.js.map +1 -0
  277. package/dist/dashboard/native-codex-api.d.ts +83 -0
  278. package/dist/dashboard/native-codex-api.d.ts.map +1 -0
  279. package/dist/dashboard/native-codex-api.js +91 -0
  280. package/dist/dashboard/native-codex-api.js.map +1 -0
  281. package/dist/dashboard/project-feedback-html.d.ts +5 -0
  282. package/dist/dashboard/project-feedback-html.d.ts.map +1 -0
  283. package/dist/dashboard/project-feedback-html.js +216 -0
  284. package/dist/dashboard/project-feedback-html.js.map +1 -0
  285. package/dist/dashboard/project-file-watch.d.ts +46 -0
  286. package/dist/dashboard/project-file-watch.d.ts.map +1 -0
  287. package/dist/dashboard/project-file-watch.js +221 -0
  288. package/dist/dashboard/project-file-watch.js.map +1 -0
  289. package/dist/dashboard/project-hub-api.d.ts +5 -0
  290. package/dist/dashboard/project-hub-api.d.ts.map +1 -0
  291. package/dist/dashboard/project-hub-api.js +121 -0
  292. package/dist/dashboard/project-hub-api.js.map +1 -0
  293. package/dist/dashboard/project-kit-html.d.ts +4 -0
  294. package/dist/dashboard/project-kit-html.d.ts.map +1 -0
  295. package/dist/dashboard/project-kit-html.js +359 -0
  296. package/dist/dashboard/project-kit-html.js.map +1 -0
  297. package/dist/dashboard/project-live-stream.d.ts +33 -0
  298. package/dist/dashboard/project-live-stream.d.ts.map +1 -0
  299. package/dist/dashboard/project-live-stream.js +233 -0
  300. package/dist/dashboard/project-live-stream.js.map +1 -0
  301. package/dist/dashboard/project-policy-api.d.ts +37 -0
  302. package/dist/dashboard/project-policy-api.d.ts.map +1 -0
  303. package/dist/dashboard/project-policy-api.js +31 -0
  304. package/dist/dashboard/project-policy-api.js.map +1 -0
  305. package/dist/dashboard/project-session-api.d.ts +28 -0
  306. package/dist/dashboard/project-session-api.d.ts.map +1 -0
  307. package/dist/dashboard/project-session-api.js +84 -0
  308. package/dist/dashboard/project-session-api.js.map +1 -0
  309. package/dist/dashboard/project-source-api.d.ts +11 -0
  310. package/dist/dashboard/project-source-api.d.ts.map +1 -0
  311. package/dist/dashboard/project-source-api.js +67 -0
  312. package/dist/dashboard/project-source-api.js.map +1 -0
  313. package/dist/dashboard/project-workspace.d.ts +16 -0
  314. package/dist/dashboard/project-workspace.d.ts.map +1 -0
  315. package/dist/dashboard/project-workspace.js +124 -0
  316. package/dist/dashboard/project-workspace.js.map +1 -0
  317. package/dist/dashboard/server.d.ts +1 -0
  318. package/dist/dashboard/server.d.ts.map +1 -1
  319. package/dist/dashboard/server.js +99 -42
  320. package/dist/dashboard/server.js.map +1 -1
  321. package/dist/dashboard/v6-dashboard-html.d.ts +1 -1
  322. package/dist/dashboard/v6-dashboard-html.d.ts.map +1 -1
  323. package/dist/dashboard/v6-dashboard-html.js +4261 -4309
  324. package/dist/dashboard/v6-dashboard-html.js.map +1 -1
  325. package/dist/dashboard/workspace-api.d.ts +12 -0
  326. package/dist/dashboard/workspace-api.d.ts.map +1 -1
  327. package/dist/dashboard/workspace-api.js +359 -41
  328. package/dist/dashboard/workspace-api.js.map +1 -1
  329. package/dist/dashboard/workspace-html.d.ts.map +1 -1
  330. package/dist/dashboard/workspace-html.js +1118 -135
  331. package/dist/dashboard/workspace-html.js.map +1 -1
  332. package/dist/dashboard/workspace-status.d.ts +53 -0
  333. package/dist/dashboard/workspace-status.d.ts.map +1 -0
  334. package/dist/dashboard/workspace-status.js +23 -0
  335. package/dist/dashboard/workspace-status.js.map +1 -0
  336. package/dist/index.d.ts +16 -0
  337. package/dist/index.d.ts.map +1 -1
  338. package/dist/index.js +13 -0
  339. package/dist/index.js.map +1 -1
  340. package/dist/integration-cli.d.ts +3 -0
  341. package/dist/integration-cli.d.ts.map +1 -0
  342. package/dist/integration-cli.js +16 -0
  343. package/dist/integration-cli.js.map +1 -0
  344. package/dist/project-cli.d.ts +3 -0
  345. package/dist/project-cli.d.ts.map +1 -0
  346. package/dist/project-cli.js +100 -0
  347. package/dist/project-cli.js.map +1 -0
  348. package/dist/types.d.ts +8 -1
  349. package/dist/types.d.ts.map +1 -1
  350. package/docs/BRAND_ASSETS.md +36 -0
  351. package/docs/COMPARISON.md +22 -0
  352. package/docs/COMPONENTS.md +66 -0
  353. package/docs/CONTEXT_LAB.md +79 -0
  354. package/docs/FEATURES_AND_LIMITS.md +29 -0
  355. package/docs/INTEGRATIONS.md +70 -0
  356. package/docs/LEARNING.md +46 -0
  357. package/docs/PROJECT_KIT.md +98 -0
  358. package/docs/QUICKSTART.md +62 -0
  359. package/docs/README.md +36 -0
  360. package/docs/ROADMAP-v7.md +147 -0
  361. package/docs/SESSIONS.md +77 -0
  362. package/docs/SHARING.md +13 -0
  363. package/docs/SHOWCASE.md +87 -0
  364. package/docs/SOURCE_INTAKE.md +33 -0
  365. package/docs/STATS.md +21 -0
  366. package/docs/TROUBLESHOOTING.md +42 -0
  367. package/docs/UPGRADE_PLAN_v7.0.0.md +203 -0
  368. package/docs/VIRAL-PLAYBOOK.md +259 -0
  369. package/docs/VISUAL_GUIDE_v7.1.4.md +70 -0
  370. package/docs/VISUAL_GUIDE_v7.22.0.md +73 -0
  371. package/docs/WORKFLOW_INTEGRATION.md +21 -1
  372. package/docs/WORKSPACE.md +63 -70
  373. package/docs/assets/7.1.4-collaboration-design-preview.png +0 -0
  374. package/docs/assets/7.1.4-comparison.png +0 -0
  375. package/docs/assets/7.1.4-context-lab.png +0 -0
  376. package/docs/assets/7.1.4-control-room-dense-preview.png +0 -0
  377. package/docs/assets/7.1.4-control-room-focus-preview.png +0 -0
  378. package/docs/assets/7.1.4-features.png +0 -0
  379. package/docs/assets/7.1.4-graph.png +0 -0
  380. package/docs/assets/7.1.4-hub-control-room.png +0 -0
  381. package/docs/assets/7.1.4-hub-empty.png +0 -0
  382. package/docs/assets/7.1.4-hub-knowledge.png +0 -0
  383. package/docs/assets/7.1.4-hub-learning.png +0 -0
  384. package/docs/assets/7.1.4-hub-mobile.png +0 -0
  385. package/docs/assets/7.1.4-hub-public-docs-source.png +0 -0
  386. package/docs/assets/7.1.4-hub-public-docs.gif +0 -0
  387. package/docs/assets/7.1.4-hub-public-docs.png +0 -0
  388. package/docs/assets/7.1.4-hub-setup.png +0 -0
  389. package/docs/assets/7.1.4-hub-walkthrough.gif +0 -0
  390. package/docs/assets/7.1.4-integrations.png +0 -0
  391. package/docs/assets/7.1.4-knowledge-design-preview.png +0 -0
  392. package/docs/assets/7.1.4-learning-design-preview.png +0 -0
  393. package/docs/assets/7.1.4-learning.png +0 -0
  394. package/docs/assets/7.1.4-live.png +0 -0
  395. package/docs/assets/7.1.4-memory-review.png +0 -0
  396. package/docs/assets/7.1.4-mobile.png +0 -0
  397. package/docs/assets/7.1.4-models-design-preview.png +0 -0
  398. package/docs/assets/7.1.4-outcome-ranking.png +0 -0
  399. package/docs/assets/7.1.4-overview.png +0 -0
  400. package/docs/assets/7.1.4-project-kit.png +0 -0
  401. package/docs/assets/7.1.4-project-skill-preview.png +0 -0
  402. package/docs/assets/7.1.4-replay.png +0 -0
  403. package/docs/assets/7.1.4-setup-design-preview.png +0 -0
  404. package/docs/assets/7.1.4-usage-design-preview.png +0 -0
  405. package/docs/assets/7.22.0-agent-dock-mobile.png +0 -0
  406. package/docs/assets/7.22.0-agent-dock.gif +0 -0
  407. package/docs/assets/7.22.0-agent-dock.png +0 -0
  408. package/docs/assets/7.22.0-hub-exchange.png +0 -0
  409. package/docs/assets/7.22.0-hub-exchanges.gif +0 -0
  410. package/docs/assets/7.22.0-hub-graph.png +0 -0
  411. package/docs/assets/7.22.0-hub-mobile-empty.png +0 -0
  412. package/docs/assets/7.22.0-managed-skills.png +0 -0
  413. package/docs/assets/7.22.0-plain-evidence.png +0 -0
  414. package/docs/assets/7.22.0-project-controls.png +0 -0
  415. package/docs/assets/7.22.0-sessions.png +0 -0
  416. package/docs/assets/7.22.0-teach-brain.png +0 -0
  417. package/docs/assets/context-v7.1.3.png +0 -0
  418. package/docs/assets/features-v7.1.3.png +0 -0
  419. package/docs/assets/graph-v7.1.3.png +0 -0
  420. package/docs/assets/integrations-v7.1.3.png +0 -0
  421. package/docs/assets/live-v7.1.3.png +0 -0
  422. package/docs/assets/live-v7.1.4.gif +0 -0
  423. package/docs/assets/memory-detail-v7.1.3.png +0 -0
  424. package/docs/assets/overview-v7.1.3.png +0 -0
  425. package/docs/evaluation/CONTEXT_EVALUATION_v7.1.4.json +1818 -0
  426. package/docs/evaluation/CONTEXT_EVALUATION_v7.1.4.md +36 -0
  427. package/docs/launch/COMPONENT_MAP_v7.1.4.md +307 -0
  428. package/docs/launch/PROJECT_KIT_PLAN_v7.1.4.md +110 -0
  429. package/docs/launch/PROJECT_LEARNING_PLAN_v7.1.4.md +63 -0
  430. package/docs/launch/RELEASE_ACCEPTANCE_v7.22.0.md +48 -0
  431. package/docs/launch/RELEASE_NOTES_v7.1.3.md +40 -0
  432. package/docs/launch/RELEASE_NOTES_v7.1.4.md +30 -0
  433. package/docs/launch/RELEASE_NOTES_v7.22.0.md +53 -0
  434. package/docs/launch/RESEARCH_AND_PLAN_v7.1.4.md +255 -0
  435. package/docs/launch/RESEARCH_AND_PLAN_v7.22.0.md +672 -0
  436. package/package.json +135 -111
  437. package/skills/shadow-research/SKILL.md +2 -0
  438. package/skills/shadow-workflow/SKILL.md +8 -0
@@ -0,0 +1,82 @@
1
+ export const BRAIN_HUB_EXCHANGES = String.raw `
2
+ function exchangeKey(event){
3
+ if(event?.source!=='measured'||event.transport!=='mcp'||!['tool-start','tool-end'].includes(event.kind)||
4
+ !event.projectId||!event.sessionId||!event.agent||!event.tool||!event.correlationId)return null;
5
+ return JSON.stringify([event.projectId,event.sessionId,event.agent,event.tool,event.correlationId]);
6
+ }
7
+ function exchangeClientKey(event){return JSON.stringify([event.projectId,event.agent,event.sessionId]);}
8
+ let exchangeCache={events:null,pairs:new Map(),clients:[]};
9
+ function observedExchanges(){
10
+ if(exchangeCache.events===state.events)return exchangeCache;
11
+ const exchanges=new Map(),clients=new Map(),pairs=new Map();
12
+ for(const event of state.events){
13
+ const key=exchangeKey(event);
14
+ if(!key)continue;
15
+ const pair=exchanges.get(key)??{requests:[],results:[]};
16
+ if(event.kind==='tool-start')pair.requests.push(event);
17
+ else pair.results.push(event);
18
+ exchanges.set(key,pair);
19
+ const client=exchangeClientKey(event);
20
+ clients.delete(client);
21
+ clients.set(client,event);
22
+ }
23
+ for(const pair of exchanges.values()){
24
+ const request=pair.requests[0],result=pair.results[0];
25
+ if(pair.requests.length!==1||pair.results.length!==1||request.sequence>=result.sequence)continue;
26
+ pairs.set(request.id,result);
27
+ pairs.set(result.id,request);
28
+ }
29
+ exchangeCache={events:state.events,pairs,clients:[...clients.values()].reverse()};
30
+ return exchangeCache;
31
+ }
32
+ function exchangeLabel(event){
33
+ return event.kind==='tool-start'?'Request observed':event.outcome==='success'?'Result ready':
34
+ event.outcome==='cancelled'?'Tool cancelled':'Tool error';
35
+ }
36
+ function exchangeDirection(event){
37
+ return event.kind==='tool-start'?'Client → Workspace':'Workspace → Client';
38
+ }
39
+ function exchangeProject(event){
40
+ return arr(state.overview?.projects).find(project=>project.id===event.projectId)?.name??event.projectId;
41
+ }
42
+ function exchangeMarkup(){
43
+ const {clients}=observedExchanges();
44
+ const selected=state.replayId?displayEvent():null;
45
+ const events=state.replayId?(exchangeKey(selected)?[selected]:[]):clients.slice(0,3);
46
+ const mode=state.replayId?'Replay':state.errors.telemetry||state.connection==='offline'?'Last loaded':'Latest';
47
+ const label=state.replayId?mode:mode+(clients.length?' · '+(clients.length>3?'3 of ':'')+clients.length+' client sessions':'');
48
+ const rows=events.map(event=>{
49
+ const incoming=event.kind==='tool-start';
50
+ const isError=!incoming&&event.outcome!=='success';
51
+ const host=hostName(event.agent),project=exchangeProject(event);
52
+ const client='<span>'+esc(host)+' <small class="muted mono" aria-label="Session suffix '+esc(event.sessionId.slice(-6))+'">'+esc(event.sessionId.slice(-6))+'</small></span>';
53
+ const workspace='<span class="exchange-workspace">Workspace</span>',arrow='<span class="exchange-arrow" aria-hidden="true"></span><span class="sr-only"> to </span>';
54
+ const route='<span class="exchange-route" title="'+esc(exchangeDirection(event)+' · '+project)+'">'+(incoming?client+arrow+workspace:workspace+arrow+client)+'</span>';
55
+ return '<li><button class="exchange-row" type="button" data-event="'+esc(event.id)+'" aria-pressed="'+(state.replayId===event.id)+'" title="'+esc(project+' · '+event.sessionId)+'">'+route+
56
+ '<span class="exchange-summary"><strong>'+esc(event.tool)+'</strong><span class="'+(isError?'red':incoming?'blue':'cyan')+'">'+exchangeLabel(event)+'</span></span><time class="mono muted" datetime="'+esc(event.timestamp)+'">'+esc(time(event.timestamp))+'</time></button></li>';
57
+ }).join('');
58
+ const message=state.replayExpired?'The selected replay record is outside the loaded history.':selected?'This event does not have a measured MCP request or result direction.':state.errors.telemetry?'The activity journal is unavailable.':
59
+ state.connection==='offline'?'The workspace is offline.':!state.live?'Live activity is off.':'Awaiting a measured MCP tool exchange.';
60
+ return '<div class="exchange-head"><h3>MCP exchanges</h3><span class="small muted">'+esc(label)+'</span></div>'+
61
+ (rows?list(rows,'aria-label="Observed MCP client sessions"','exchange-list'):'<p class="exchange-empty small muted">'+esc(message)+'</p>');
62
+ }
63
+ function updateExchanges(){
64
+ const container=$('graph-exchanges');
65
+ if(!container)return;
66
+ const markup=exchangeMarkup();
67
+ if(container.dataset.markup===markup)return;
68
+ const active=container.querySelector('[data-event]:focus')?.dataset.event;
69
+ container.innerHTML=markup;container.dataset.markup=markup;
70
+ if(active)[...container.querySelectorAll('[data-event]')].find(row=>row.dataset.event===active)?.focus({preventScroll:true});
71
+ }
72
+ function pairedExchangeMarkup(event){
73
+ if(!exchangeKey(event))return '';
74
+ const other=observedExchanges().pairs.get(event.id);
75
+ const isRequest=event.kind==='tool-start';
76
+ return '<dl class="facts">'+fact('Boundary',exchangeDirection(event))+fact('Observation',exchangeLabel(event))+fact('Project',exchangeProject(event))+'</dl>'+
77
+ (other?'<button class="btn quiet" type="button" data-event="'+esc(other.id)+'">'+(isRequest?'Inspect paired result':'Inspect paired request')+'</button>':
78
+ '<p class="small muted">'+(isRequest?'A matching result is absent from loaded records.':'A matching request is absent from loaded records.')+'</p>')+
79
+ '<p class="small muted">The journal records the tool boundary. Model consumption is unobserved.</p>';
80
+ }
81
+ `;
82
+ //# sourceMappingURL=brain-hub-exchanges.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-hub-exchanges.js","sourceRoot":"","sources":["../../src/dashboard/brain-hub-exchanges.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgF5C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const BRAIN_HUB_GRAPH: string;
2
+ //# sourceMappingURL=brain-hub-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-hub-graph.d.ts","sourceRoot":"","sources":["../../src/dashboard/brain-hub-graph.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,QAgV3B,CAAC"}
@@ -0,0 +1,338 @@
1
+ export const BRAIN_HUB_GRAPH = String.raw `
2
+ const tones={project:'124,233,232',memory:'172,199,255',agent:'234,172,249',measured:'124,233,232',reported:'250,208,140'};
3
+ const relationColors={supports:'91,209,221',related:'119,165,221',contradicts:'227,175,119',supersedes:'150,154,222'};
4
+ const graphMemoryLimit='500';
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
+ }
77
+ function rand(seed){return ()=>{seed=(Math.imul(seed,1664525)+1013904223)>>>0;return seed/4294967296;};}
78
+ function hash(id){let value=2166136261;for(const char of id)value=Math.imul(value^char.charCodeAt(0),16777619);return value>>>0;}
79
+ function mountGraph(){
80
+ const canvas=$('brain-canvas'),stage=$('brain-stage');
81
+ if(!canvas||canvas.hidden||!stage)return;
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:''};
86
+ graphSurface=surface;
87
+ surface.observer=new ResizeObserver(()=>resizeGraph(surface));
88
+ surface.observer.observe(stage);
89
+ resizeGraph(surface);
90
+ function hit(event){
91
+ const box=canvas.getBoundingClientRect();
92
+ const {x,y}=graphCoordinates(surface,event.clientX-box.left,event.clientY-box.top);
93
+ let best=null,distance=15/graphCamera.scale;
94
+ for(const point of surface.points.values()){
95
+ const d=Math.hypot(x-point.x,y-point.y);
96
+ if(d<distance){best=point;distance=d;}
97
+ }
98
+ return best;
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
+ });
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
+ }
115
+ const point=hit(event);
116
+ canvas.style.cursor=point?'pointer':graphCamera.scale>1?'grab':'default';
117
+ const caption=$('node-caption');
118
+ if(caption&&point){caption.hidden=false;caption.textContent=point.kind==='agent'?hostName(point.label):point.label;}
119
+ else syncGraphControls();
120
+ });
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();
131
+ }
132
+ function unmountGraph(){
133
+ if(!graphSurface)return;
134
+ graphSurface.observer.disconnect();cancelAnimationFrame(graphSurface.raf);graphSurface=null;
135
+ }
136
+ function stroke(ctx,rgb,alpha,width){ctx.strokeStyle='rgba('+rgb+','+alpha+')';ctx.lineWidth=width;ctx.stroke();}
137
+ function dot(ctx,x,y,r,rgb,alpha){ctx.beginPath();ctx.arc(x,y,r,0,Math.PI*2);ctx.fillStyle='rgba('+rgb+','+alpha+')';ctx.fill();}
138
+ function resizeGraph(surface){
139
+ if(graphSurface!==surface)return;
140
+ const {stage,canvas,ctx}=surface;
141
+ const size=stage.getBoundingClientRect(),dpr=Math.min(devicePixelRatio,1.75);
142
+ if(!size.width||!size.height)return;
143
+ surface.width=size.width;surface.height=size.height;surface.snapshot=undefined;boundCamera(surface);
144
+ canvas.width=Math.round(size.width*dpr);
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='';
149
+ ctx.setTransform(dpr,0,0,dpr,0,0);
150
+ drawGraph();
151
+ }
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);
192
+ }
193
+ function graphPoints(width,height){
194
+ const nodes=arr(state.graph?.nodes),anchors=nodes.filter(node=>node.kind!=='memory');
195
+ const memories=nodes.filter(node=>node.kind==='memory');
196
+ const frame=brainFrame(width,height);
197
+ const points=new Map();
198
+ function point(node,x,y,depth=1){points.set(node.id,{...node,x,y,depth});}
199
+ for(const kind of ['project','agent']){
200
+ const subset=anchors.filter(node=>node.kind===kind);
201
+ subset.forEach((node,i)=>{
202
+ const t=(i+1)/(subset.length+1),sign=kind==='project'?-1:1;
203
+ point(node,frame.x+sign*(frame.rx+Math.max(7,Math.min(32,width*.043))),height*.21+height*.58*t);
204
+ });
205
+ }
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);
215
+ return points;
216
+ }
217
+ function displayEvent(){return state.replayId?state.events.find(event=>event.id===state.replayId):state.events.at(-1);}
218
+ function graphEventPath(event,surface){
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];
224
+ }
225
+ function labelPoint(ctx,point,label,side,color,width,alpha){
226
+ ctx.font='600 10.5px system-ui,sans-serif';
227
+ const limit=Math.min(126,width*.20);
228
+ while(ctx.measureText(label).width>limit&&label.length>1)label=label.slice(0,label.endsWith('…')?-2:-1)+'…';
229
+ const pad=6,labelWidth=ctx.measureText(label).width+2*pad;
230
+ const x=Math.max(3,Math.min(width-labelWidth-3,side<0?point.x-12-labelWidth:point.x+12)),y=point.y-9;
231
+ ctx.globalAlpha=alpha;ctx.fillStyle='#111e31';ctx.beginPath();ctx.roundRect(x,y,labelWidth,18,3);ctx.fill();stroke(ctx,color,.43,.7);
232
+ ctx.fillStyle='#ddefff';ctx.textAlign='left';ctx.textBaseline='middle';ctx.fillText(label,x+pad,y+9);ctx.globalAlpha=1;
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
+ }
274
+ function drawGraph(){
275
+ const surface=graphSurface;
276
+ if(!surface||!surface.width)return;
277
+ if(surface.raf){cancelAnimationFrame(surface.raf);surface.raf=0;}
278
+ const {ctx,width,height,canvas}=surface;
279
+ if(surface.snapshot!==state.graph){
280
+ surface.snapshot=state.graph;
281
+ surface.points=graphPoints(width,height);
282
+ surface.edges=arr(state.graph?.edges).filter(edge=>surface.points.has(edge.source)&&surface.points.has(edge.target));
283
+ surface.counts={};
284
+ for(const point of surface.points.values())surface.counts[point.kind]=(surface.counts[point.kind]??0)+1;
285
+ surface.layerKey='';
286
+ }
287
+ const {points,edges}=surface;
288
+ const current=state.focus?state.picked:null;
289
+ const layerKey=JSON.stringify([current,state.graphFilter,graphCamera]);
290
+ if(surface.layerKey!==layerKey){drawMemoryLayer(surface,current);surface.layerKey=layerKey;}
291
+ ctx.clearRect(0,0,width,height);
292
+ ctx.drawImage(surface.layer,0,0,width,height);
293
+ const age=performance.now()-state.motionStarted;
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)):
296
+ state.replayId?[displayEvent()].filter(Boolean):[];
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);
305
+ ctx.beginPath();ctx.moveTo(a.x,a.y);ctx.bezierCurveTo(b.x,b.y,c.x,c.y,d.x,d.y);
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;
310
+ const x=u**3*a.x+3*u*u*t*b.x+3*u*t*t*c.x+t**3*d.x;
311
+ const y=u**3*a.y+3*u*u*t*b.y+3*u*t*t*c.y+t**3*d.y;
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);
313
+ }
314
+ const graphEvent=$('graph-event');
315
+ if(graphEvent){
316
+ const text=path?exchangeDirection(currentEvent)+' · '+exchangeLabel(currentEvent):'';
317
+ if(graphEvent.textContent!==text)graphEvent.textContent=text;
318
+ graphEvent.hidden=!path||!!current||state.listing;
319
+ }
320
+ canvas.dataset.nodes=String(points.size);canvas.dataset.edges=String(edges.length);
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);
323
+ }
324
+ function syncGraphControls(){
325
+ const label=$('node-caption'),point=arr(state.graph?.nodes).find(node=>node.id===state.picked);
326
+ if(label){label.hidden=!state.focus||!point||state.listing;label.textContent=point?.label??'';}
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)));
335
+ $('brain-stage')?.querySelectorAll('[data-node]').forEach(button=>button.setAttribute('aria-pressed',String(button.dataset.node===state.picked&&state.focus)));
336
+ }
337
+ `;
338
+ //# sourceMappingURL=brain-hub-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-hub-graph.js","sourceRoot":"","sources":["../../src/dashboard/brain-hub-graph.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgVxC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const BRAIN_HUB_HTML: string;
2
+ //# sourceMappingURL=brain-hub-html.d.ts.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,85 @@
1
+ import { BRAIN_HUB_CLIENT } from './brain-hub-client.js';
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';
5
+ import { BRAIN_HUB_VIEWS } from './brain-hub-views.js';
6
+ export const BRAIN_HUB_HTML = String.raw `<!doctype html>
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>
8
+ <style>
9
+ :root{color-scheme:dark;--ground:#080e19;--surface:#0e1828;--raised:#142237;--border:#263a50;--strong:#425d78;--ink:#ecf5ff;--muted:#a9bed3;--cyan:#78e9e5;--blue:#afc7ff;--pink:#ecb0fc;--amber:#f9d28b;--green:#a0e7be;--red:#ffacb6;--sans:Inter,"Segoe UI",system-ui,sans-serif;--mono:"IBM Plex Mono","Cascadia Mono",Consolas,monospace;font:14px/1.45 var(--sans)}
10
+ *,*::before,*::after{box-sizing:border-box}body{margin:0;background:var(--ground);color:var(--ink)}[hidden]{display:none!important}a{color:var(--cyan)}button,input,select,textarea{font:inherit}button,select{cursor:pointer}button:disabled{cursor:default;opacity:.52}a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,summary:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--cyan);outline-offset:2px}h1,h2,h3,p,ul,ol,dl,dd{margin:0}h1,h2,h3{letter-spacing:-.022em;line-height:1.25}h1{font-size:1.95rem}h2{font-size:1.06rem}h3{font-size:.95rem}p,dd,li,pre,td{overflow-wrap:anywhere}small,.small{font-size:.81rem}.muted{color:var(--muted)}.mono{font-family:var(--mono);font-variant-numeric:tabular-nums}.cyan{color:var(--cyan)}.pink{color:var(--pink)}.amber{color:var(--amber)}.green{color:var(--green)}.red{color:var(--red)}.skip{position:fixed;left:12px;top:8px;z-index:4;transform:translateY(-150%)}.skip:focus{transform:none}
11
+ .frame{max-width:1700px;margin:auto;padding:0 22px 24px}.top,.page-head,.panel-head,.row,.actions,.nav{display:flex;align-items:center;gap:8px}.top,.page-head,.panel-head,.row{justify-content:space-between}.top{min-height:54px;border-bottom:1px solid var(--border);flex-wrap:wrap;padding-block:7px}.brand{display:flex;align-items:center;gap:9px;font-weight:740;white-space:nowrap}.brand svg{width:29px;height:29px;color:var(--cyan)}.actions{flex-wrap:wrap}.nav{margin-bottom:12px;border-bottom:1px solid var(--border);overflow:auto;align-items:stretch;gap:3px;scrollbar-width:thin}.nav button{flex:none;border:0;border-bottom:2px solid transparent;background:none;color:var(--muted);padding:8px 11px;font-size:.9rem;white-space:nowrap}.nav button[aria-current=page],.nav button:hover{color:var(--cyan);border-bottom-color:var(--cyan)}.page-head{margin-bottom:10px}.page-head p{margin-top:4px}.btn,input:not([type=range]),select,textarea{min-width:0;border:1px solid var(--strong);background:var(--raised);color:var(--ink);border-radius:5px;padding:6px 8px}.btn{display:inline-flex;align-items:center;justify-content:center;gap:5px;min-height:32px;text-decoration:none;font-size:.83rem;font-weight:640}.btn:hover,.btn[aria-pressed=true]{background:#203747;border-color:#658c9e}.btn.primary{background:var(--cyan);border-color:var(--cyan);color:#0c252d}.btn.primary:hover{background:#a5f4ed}.btn.quiet{background:transparent;border-color:transparent;color:var(--cyan)}.btn.quiet:hover{background:var(--raised)}.chip{display:inline-flex;align-items:center;gap:5px;background:#203149;border-radius:4px;padding:3px 6px;color:#bfd2e8;font-size:.73rem;font-weight:650;line-height:1.2;max-width:100%}.chip.cyan{background:#153640;color:var(--cyan)}.chip.green{background:#17362b;color:var(--green)}.chip.pink{background:#382847;color:var(--pink)}.chip.amber{background:#392f23;color:var(--amber)}.chip.red{background:#422934;color:var(--red)}.dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:currentColor;flex:none}
12
+ .strip{display:grid;grid-template-columns:1fr 1.05fr 1fr 1.2fr;border:1px solid var(--border);border-radius:7px;background:var(--surface);margin-bottom:10px}.metric{min-width:0;padding:9px 12px}.metric+.metric{border-left:1px solid var(--border)}.metric dt{font-size:.76rem;color:var(--muted)}.metric dd{font-size:1.12rem;font-weight:700;margin:2px 0}.metric small{color:var(--muted);display:block}.metric-trace{width:68px;height:24px;float:right;margin:3px 0 0 6px;opacity:.85}
13
+ .panel{min-width:0;background:var(--surface);border:1px solid var(--border);border-radius:7px;overflow:hidden}.panel-head{min-height:41px;padding:6px 10px;background:#111d30;border-bottom:1px solid var(--border)}.panel-body{padding:10px}.stack{display:grid;gap:10px}.list{list-style:none;padding:0}.list>li+li{border-top:1px solid var(--border)}.item{padding:8px 10px;display:grid;gap:4px}.rail-title{padding:8px 9px;background:#101c2c;border-bottom:1px solid var(--border)}.rail-title:not(:first-child){border-top:1px solid var(--border)}.rail-entry,.entry{width:100%;display:grid;gap:3px;text-align:left;border:0;background:transparent;color:var(--ink);padding:8px 9px;cursor:pointer}.rail-entry:hover,.rail-entry[aria-pressed=true],.entry:hover,.entry[aria-pressed=true]{background:#172c40}.rail-entry strong{font-size:.84rem}.rail-entry small{font-size:.73rem;color:var(--muted)}.empty{padding:12px;display:grid;gap:7px;color:var(--muted)}.empty strong{color:var(--ink)}.notice{padding:9px 11px;border:1px solid #654f37;border-radius:5px;background:#251f1b;color:#ffe1a7;margin:0 0 10px}.notice:empty{display:none}.status{min-height:0;color:var(--green)}.status:empty{display:none}.status[data-error=true]{color:var(--red)}
14
+ .control-grid{display:grid;grid-template-columns:184px minmax(0,1fr) 265px;gap:10px;margin-bottom:10px}.control-grid>.rail,.control-grid>.inspect{overflow:auto;min-height:0}.graph-panel{display:flex;flex-direction:column;background:#080f1d;border-color:#344d68}.graph-stage{position:relative;isolation:isolate;flex:1;min-height:375px;overflow:hidden;background:radial-gradient(ellipse at 50% 49%,#182641 0%,#0e192d 39%,#090f1d 77%)}#brain-canvas{position:absolute;inset:0;width:100%;height:100%;display:block}.graph-meta{position:absolute;left:12px;right:12px;top:11px;display:flex;justify-content:space-between;gap:10px;font:.71rem var(--mono);color:var(--muted);pointer-events:none}.graph-empty{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:min(290px,90%);padding:10px 12px;background:#0e192ceb;border:1px solid #455e7e;border-radius:6px;text-align:center}.graph-empty .actions{justify-content:center;margin-top:6px}.graph-foot{display:flex;align-items:center;justify-content:space-between;gap:6px;flex-wrap:wrap;border-top:1px solid var(--border);background:#0e1828;color:var(--muted);padding:5px 8px;min-height:31px;font-size:.74rem}.legend{display:flex;gap:8px;flex-wrap:wrap}.legend span{display:flex;align-items:center;gap:4px}.legend i{display:inline-block;width:11px;border-top:2px solid currentColor}.node-list{position:absolute;inset:6px;overflow:auto;background:#0d182bef;border:1px solid var(--strong);z-index:1}.node-list>li+li{border-top:1px solid var(--border)}.focus-label{position:absolute;left:50%;bottom:10px;transform:translateX(-50%);max-width:92%;padding:4px 8px;background:#122136;border:1px solid #486787;border-radius:4px;overflow-wrap:anywhere;color:var(--ink);font-size:.76rem;text-align:center;pointer-events:none}.tabs{display:flex;flex-wrap:wrap;gap:4px;border-bottom:1px solid var(--border);padding:6px 7px}.tabs .btn{min-height:26px;padding-block:3px}.facts{display:grid;gap:0}.facts>div{display:flex;justify-content:space-between;gap:9px;border-bottom:1px solid var(--border);padding:6px 0;font-size:.81rem}.facts dt{color:var(--muted)}.facts dd{text-align:right}.receipt{display:grid;gap:5px;border:1px solid var(--border);border-radius:5px;padding:8px;background:#121e30}.lower{display:grid;grid-template-columns:minmax(235px,.8fr) minmax(0,1.8fr);gap:10px}.timeline{max-height:106px;overflow:auto}.event{grid-template-columns:76px minmax(0,1fr) auto;align-items:center;font-size:.8rem;min-height:29px;padding-block:5px}.event time{color:var(--muted)}.replay{padding:5px 8px;display:flex;align-items:center;gap:8px;border-bottom:1px solid var(--border)}.replay input{min-width:35px;flex:1;accent-color:var(--cyan)}.replay output{min-width:6em;text-align:right}.two{display:grid;grid-template-columns:minmax(220px,.85fr) minmax(0,1.45fr);gap:10px;align-items:start}.three{display:grid;grid-template-columns:minmax(150px,.64fr) minmax(0,1.45fr) minmax(220px,.9fr);gap:10px;align-items:start}.form{display:grid;gap:8px}.form label{display:grid;gap:3px;color:var(--muted);font-size:.83rem}.form :is(input,select,textarea){width:100%}.form textarea{resize:vertical}.form input[type=checkbox]{width:auto}.form .check{display:flex;gap:7px;align-items:flex-start}.form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}pre{margin:0;padding:9px;border:1px solid var(--border);background:#091321;border-radius:4px;white-space:pre-wrap;max-height:250px;overflow:auto;color:#d7e9ff;font:.81rem/1.5 var(--mono)}.section-list{max-height:480px;overflow:auto}.section-list .entry strong{font-size:.86rem}.table-wrap{overflow:auto}table{width:100%;border-collapse:collapse;font-size:.84rem}td,th{padding:7px 9px;border-bottom:1px solid var(--border);text-align:left;vertical-align:top}th{color:var(--muted)}.meter{height:5px;border-radius:4px;background:#2b3c53;overflow:hidden}.meter i{display:block;height:100%;background:var(--pink)}.footer{display:flex;justify-content:space-between;flex-wrap:wrap;gap:8px;margin-top:10px;color:var(--muted);font-size:.77rem}details>summary{cursor:pointer;color:var(--cyan)}details[open]>summary{margin-bottom:7px}.trace-list{position:absolute;inset:0;overflow:auto;background:#0e1929}.trace-list .event{grid-template-columns:76px minmax(0,1fr) auto}
15
+ @media(min-width:981px){.control-grid{grid-template-rows:429px}.graph-stage{min-height:0}}
16
+ @media(max-width:1200px){.control-grid{grid-template-columns:153px minmax(0,1fr) 235px}.frame{padding-inline:14px}}
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}}
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}}
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)}}
72
+ </style></head><body>
73
+ <a class="btn skip" href="#main">Skip to content</a>
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>
75
+ <nav class="nav" id="nav" aria-label="Brain workspace"></nav>
76
+ <span class="chip" id="stream-health" role="status" hidden></span>
77
+ <p class="notice" id="notice" role="status"></p>
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>
79
+ <footer class="footer"><span id="scope-note"></span><span><a href="/workspace">Classic workspace</a> · <a href="/live">Activity diagnostics</a></span></footer>
80
+ </div>
81
+ <script>'use strict';
82
+ ` + BRAIN_HUB_CLIENT + BRAIN_HUB_LIVE + BRAIN_HUB_EXCHANGES + BRAIN_HUB_GRAPH + BRAIN_HUB_VIEWS + String.raw `
83
+ start();
84
+ </script></body></html>`;
85
+ //# sourceMappingURL=brain-hub-html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-hub-html.js","sourceRoot":"","sources":["../../src/dashboard/brain-hub-html.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,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,2 @@
1
+ export declare const BRAIN_HUB_KNOWLEDGE: string;
2
+ //# sourceMappingURL=brain-hub-knowledge.d.ts.map
@@ -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"}