@theihtisham/agent-shadow-brain 7.1.3 → 7.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (254) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +125 -90
  3. package/dist/adapters/index.d.ts +1 -1
  4. package/dist/adapters/index.d.ts.map +1 -1
  5. package/dist/adapters/index.js.map +1 -1
  6. package/dist/brain/activity-journal.d.ts.map +1 -1
  7. package/dist/brain/activity-journal.js +2 -1
  8. package/dist/brain/activity-journal.js.map +1 -1
  9. package/dist/brain/auto-update.js +1 -1
  10. package/dist/brain/brain-portability.js +1 -1
  11. package/dist/brain/client-config.d.ts +19 -0
  12. package/dist/brain/client-config.d.ts.map +1 -0
  13. package/dist/brain/client-config.js +40 -0
  14. package/dist/brain/client-config.js.map +1 -0
  15. package/dist/brain/client-integrations.d.ts +2 -0
  16. package/dist/brain/client-integrations.d.ts.map +1 -1
  17. package/dist/brain/client-integrations.js +8 -27
  18. package/dist/brain/client-integrations.js.map +1 -1
  19. package/dist/brain/context-assembly.d.ts +10 -2
  20. package/dist/brain/context-assembly.d.ts.map +1 -1
  21. package/dist/brain/context-assembly.js +238 -14
  22. package/dist/brain/context-assembly.js.map +1 -1
  23. package/dist/brain/context-request.d.ts +4 -0
  24. package/dist/brain/context-request.d.ts.map +1 -0
  25. package/dist/brain/context-request.js +22 -0
  26. package/dist/brain/context-request.js.map +1 -0
  27. package/dist/brain/context-retrieval.d.ts +88 -0
  28. package/dist/brain/context-retrieval.d.ts.map +1 -0
  29. package/dist/brain/context-retrieval.js +300 -0
  30. package/dist/brain/context-retrieval.js.map +1 -0
  31. package/dist/brain/feature-settings.d.ts.map +1 -1
  32. package/dist/brain/feature-settings.js +2 -1
  33. package/dist/brain/feature-settings.js.map +1 -1
  34. package/dist/brain/file-identity.d.ts +4 -0
  35. package/dist/brain/file-identity.d.ts.map +1 -0
  36. package/dist/brain/file-identity.js +27 -0
  37. package/dist/brain/file-identity.js.map +1 -0
  38. package/dist/brain/global-brain.d.ts +11 -1
  39. package/dist/brain/global-brain.d.ts.map +1 -1
  40. package/dist/brain/global-brain.js +58 -6
  41. package/dist/brain/global-brain.js.map +1 -1
  42. package/dist/brain/mcp-server.d.ts +9 -0
  43. package/dist/brain/mcp-server.d.ts.map +1 -1
  44. package/dist/brain/mcp-server.js +237 -53
  45. package/dist/brain/mcp-server.js.map +1 -1
  46. package/dist/brain/mcp-stdio.d.ts.map +1 -1
  47. package/dist/brain/mcp-stdio.js +10 -4
  48. package/dist/brain/mcp-stdio.js.map +1 -1
  49. package/dist/brain/memory-annotations.d.ts.map +1 -1
  50. package/dist/brain/memory-annotations.js +2 -1
  51. package/dist/brain/memory-annotations.js.map +1 -1
  52. package/dist/brain/memory-inspection.d.ts +72 -0
  53. package/dist/brain/memory-inspection.d.ts.map +1 -0
  54. package/dist/brain/memory-inspection.js +131 -0
  55. package/dist/brain/memory-inspection.js.map +1 -0
  56. package/dist/brain/memory-mcp-content.d.ts +44 -0
  57. package/dist/brain/memory-mcp-content.d.ts.map +1 -0
  58. package/dist/brain/memory-mcp-content.js +91 -0
  59. package/dist/brain/memory-mcp-content.js.map +1 -0
  60. package/dist/brain/orchestrator.js +1 -1
  61. package/dist/brain/project-feedback.d.ts +63 -0
  62. package/dist/brain/project-feedback.d.ts.map +1 -0
  63. package/dist/brain/project-feedback.js +289 -0
  64. package/dist/brain/project-feedback.js.map +1 -0
  65. package/dist/brain/project-hub-contract.d.ts +326 -0
  66. package/dist/brain/project-hub-contract.d.ts.map +1 -0
  67. package/dist/brain/project-hub-contract.js +56 -0
  68. package/dist/brain/project-hub-contract.js.map +1 -0
  69. package/dist/brain/project-hub-mcp.d.ts +168 -0
  70. package/dist/brain/project-hub-mcp.d.ts.map +1 -0
  71. package/dist/brain/project-hub-mcp.js +41 -0
  72. package/dist/brain/project-hub-mcp.js.map +1 -0
  73. package/dist/brain/project-hub-pdf-worker.d.ts +13 -0
  74. package/dist/brain/project-hub-pdf-worker.d.ts.map +1 -0
  75. package/dist/brain/project-hub-pdf-worker.js +84 -0
  76. package/dist/brain/project-hub-pdf-worker.js.map +1 -0
  77. package/dist/brain/project-hub-store.d.ts +38 -0
  78. package/dist/brain/project-hub-store.d.ts.map +1 -0
  79. package/dist/brain/project-hub-store.js +189 -0
  80. package/dist/brain/project-hub-store.js.map +1 -0
  81. package/dist/brain/project-hub.d.ts +127 -0
  82. package/dist/brain/project-hub.d.ts.map +1 -0
  83. package/dist/brain/project-hub.js +381 -0
  84. package/dist/brain/project-hub.js.map +1 -0
  85. package/dist/brain/project-kit-inspection.d.ts +28 -0
  86. package/dist/brain/project-kit-inspection.d.ts.map +1 -0
  87. package/dist/brain/project-kit-inspection.js +200 -0
  88. package/dist/brain/project-kit-inspection.js.map +1 -0
  89. package/dist/brain/project-kit-paths.d.ts +13 -0
  90. package/dist/brain/project-kit-paths.d.ts.map +1 -0
  91. package/dist/brain/project-kit-paths.js +141 -0
  92. package/dist/brain/project-kit-paths.js.map +1 -0
  93. package/dist/brain/project-kit.d.ts +41 -0
  94. package/dist/brain/project-kit.d.ts.map +1 -0
  95. package/dist/brain/project-kit.js +255 -0
  96. package/dist/brain/project-kit.js.map +1 -0
  97. package/dist/brain/project-memory.d.ts +38 -0
  98. package/dist/brain/project-memory.d.ts.map +1 -0
  99. package/dist/brain/project-memory.js +76 -0
  100. package/dist/brain/project-memory.js.map +1 -0
  101. package/dist/brain/subconscious.js +2 -2
  102. package/dist/brain/subconscious.js.map +1 -1
  103. package/dist/brain/workflow-skills.d.ts.map +1 -1
  104. package/dist/brain/workflow-skills.js +3 -2
  105. package/dist/brain/workflow-skills.js.map +1 -1
  106. package/dist/cli.js +22 -3
  107. package/dist/cli.js.map +1 -1
  108. package/dist/context-cli.d.ts.map +1 -1
  109. package/dist/context-cli.js +39 -5
  110. package/dist/context-cli.js.map +1 -1
  111. package/dist/dashboard/brain-hub-actions.d.ts +2 -0
  112. package/dist/dashboard/brain-hub-actions.d.ts.map +1 -0
  113. package/dist/dashboard/brain-hub-actions.js +137 -0
  114. package/dist/dashboard/brain-hub-actions.js.map +1 -0
  115. package/dist/dashboard/brain-hub-client.d.ts +2 -0
  116. package/dist/dashboard/brain-hub-client.d.ts.map +1 -0
  117. package/dist/dashboard/brain-hub-client.js +335 -0
  118. package/dist/dashboard/brain-hub-client.js.map +1 -0
  119. package/dist/dashboard/brain-hub-graph.d.ts +2 -0
  120. package/dist/dashboard/brain-hub-graph.d.ts.map +1 -0
  121. package/dist/dashboard/brain-hub-graph.js +176 -0
  122. package/dist/dashboard/brain-hub-graph.js.map +1 -0
  123. package/dist/dashboard/brain-hub-html.d.ts +2 -0
  124. package/dist/dashboard/brain-hub-html.d.ts.map +1 -0
  125. package/dist/dashboard/brain-hub-html.js +30 -0
  126. package/dist/dashboard/brain-hub-html.js.map +1 -0
  127. package/dist/dashboard/brain-hub-project-views.d.ts +2 -0
  128. package/dist/dashboard/brain-hub-project-views.d.ts.map +1 -0
  129. package/dist/dashboard/brain-hub-project-views.js +79 -0
  130. package/dist/dashboard/brain-hub-project-views.js.map +1 -0
  131. package/dist/dashboard/brain-hub-views.d.ts +2 -0
  132. package/dist/dashboard/brain-hub-views.d.ts.map +1 -0
  133. package/dist/dashboard/brain-hub-views.js +150 -0
  134. package/dist/dashboard/brain-hub-views.js.map +1 -0
  135. package/dist/dashboard/demo-workspace.d.ts +11 -0
  136. package/dist/dashboard/demo-workspace.d.ts.map +1 -0
  137. package/dist/dashboard/demo-workspace.js +178 -0
  138. package/dist/dashboard/demo-workspace.js.map +1 -0
  139. package/dist/dashboard/live-workspace-html.d.ts.map +1 -1
  140. package/dist/dashboard/live-workspace-html.js +177 -28
  141. package/dist/dashboard/live-workspace-html.js.map +1 -1
  142. package/dist/dashboard/project-feedback-html.d.ts +5 -0
  143. package/dist/dashboard/project-feedback-html.d.ts.map +1 -0
  144. package/dist/dashboard/project-feedback-html.js +216 -0
  145. package/dist/dashboard/project-feedback-html.js.map +1 -0
  146. package/dist/dashboard/project-hub-api.d.ts +5 -0
  147. package/dist/dashboard/project-hub-api.d.ts.map +1 -0
  148. package/dist/dashboard/project-hub-api.js +121 -0
  149. package/dist/dashboard/project-hub-api.js.map +1 -0
  150. package/dist/dashboard/project-kit-html.d.ts +4 -0
  151. package/dist/dashboard/project-kit-html.d.ts.map +1 -0
  152. package/dist/dashboard/project-kit-html.js +359 -0
  153. package/dist/dashboard/project-kit-html.js.map +1 -0
  154. package/dist/dashboard/project-workspace.d.ts +16 -0
  155. package/dist/dashboard/project-workspace.d.ts.map +1 -0
  156. package/dist/dashboard/project-workspace.js +106 -0
  157. package/dist/dashboard/project-workspace.js.map +1 -0
  158. package/dist/dashboard/server.d.ts +1 -0
  159. package/dist/dashboard/server.d.ts.map +1 -1
  160. package/dist/dashboard/server.js +15 -4
  161. package/dist/dashboard/server.js.map +1 -1
  162. package/dist/dashboard/v6-dashboard-html.d.ts +1 -1
  163. package/dist/dashboard/v6-dashboard-html.d.ts.map +1 -1
  164. package/dist/dashboard/v6-dashboard-html.js +27 -27
  165. package/dist/dashboard/workspace-api.d.ts +6 -0
  166. package/dist/dashboard/workspace-api.d.ts.map +1 -1
  167. package/dist/dashboard/workspace-api.js +154 -34
  168. package/dist/dashboard/workspace-api.js.map +1 -1
  169. package/dist/dashboard/workspace-html.d.ts.map +1 -1
  170. package/dist/dashboard/workspace-html.js +487 -81
  171. package/dist/dashboard/workspace-html.js.map +1 -1
  172. package/dist/dashboard/workspace-status.d.ts +50 -0
  173. package/dist/dashboard/workspace-status.d.ts.map +1 -0
  174. package/dist/dashboard/workspace-status.js +22 -0
  175. package/dist/dashboard/workspace-status.js.map +1 -0
  176. package/dist/index.d.ts +10 -0
  177. package/dist/index.d.ts.map +1 -1
  178. package/dist/index.js +7 -0
  179. package/dist/index.js.map +1 -1
  180. package/dist/integration-cli.d.ts.map +1 -1
  181. package/dist/integration-cli.js +6 -4
  182. package/dist/integration-cli.js.map +1 -1
  183. package/dist/project-cli.d.ts +3 -0
  184. package/dist/project-cli.d.ts.map +1 -0
  185. package/dist/project-cli.js +100 -0
  186. package/dist/project-cli.js.map +1 -0
  187. package/dist/types.d.ts +1 -1
  188. package/dist/types.d.ts.map +1 -1
  189. package/docs/COMPARISON.md +22 -0
  190. package/docs/COMPONENTS.md +66 -0
  191. package/docs/CONTEXT_LAB.md +79 -0
  192. package/docs/FEATURES_AND_LIMITS.md +24 -0
  193. package/docs/INTEGRATIONS.md +68 -0
  194. package/docs/LEARNING.md +46 -0
  195. package/docs/PROJECT_KIT.md +93 -0
  196. package/docs/QUICKSTART.md +44 -0
  197. package/docs/README.md +33 -0
  198. package/docs/ROADMAP-v7.md +147 -0
  199. package/docs/SHARING.md +13 -0
  200. package/docs/SHOWCASE.md +87 -0
  201. package/docs/STATS.md +21 -0
  202. package/docs/TROUBLESHOOTING.md +42 -0
  203. package/docs/UPGRADE_PLAN_v7.0.0.md +203 -0
  204. package/docs/VIRAL-PLAYBOOK.md +259 -0
  205. package/docs/VISUAL_GUIDE_v7.1.4.md +70 -0
  206. package/docs/WORKFLOW_INTEGRATION.md +19 -1
  207. package/docs/WORKSPACE.md +17 -91
  208. package/docs/assets/7.1.4-collaboration-design-preview.png +0 -0
  209. package/docs/assets/7.1.4-comparison.png +0 -0
  210. package/docs/assets/7.1.4-context-lab.png +0 -0
  211. package/docs/assets/7.1.4-control-room-dense-preview.png +0 -0
  212. package/docs/assets/7.1.4-control-room-focus-preview.png +0 -0
  213. package/docs/assets/7.1.4-features.png +0 -0
  214. package/docs/assets/7.1.4-graph.png +0 -0
  215. package/docs/assets/7.1.4-hub-control-room.png +0 -0
  216. package/docs/assets/7.1.4-hub-empty.png +0 -0
  217. package/docs/assets/7.1.4-hub-knowledge.png +0 -0
  218. package/docs/assets/7.1.4-hub-learning.png +0 -0
  219. package/docs/assets/7.1.4-hub-mobile.png +0 -0
  220. package/docs/assets/7.1.4-hub-public-docs-source.png +0 -0
  221. package/docs/assets/7.1.4-hub-public-docs.gif +0 -0
  222. package/docs/assets/7.1.4-hub-public-docs.png +0 -0
  223. package/docs/assets/7.1.4-hub-setup.png +0 -0
  224. package/docs/assets/7.1.4-hub-walkthrough.gif +0 -0
  225. package/docs/assets/7.1.4-integrations.png +0 -0
  226. package/docs/assets/7.1.4-knowledge-design-preview.png +0 -0
  227. package/docs/assets/7.1.4-learning-design-preview.png +0 -0
  228. package/docs/assets/7.1.4-learning.png +0 -0
  229. package/docs/assets/7.1.4-live.png +0 -0
  230. package/docs/assets/7.1.4-memory-review.png +0 -0
  231. package/docs/assets/7.1.4-mobile.png +0 -0
  232. package/docs/assets/7.1.4-models-design-preview.png +0 -0
  233. package/docs/assets/7.1.4-outcome-ranking.png +0 -0
  234. package/docs/assets/7.1.4-overview.png +0 -0
  235. package/docs/assets/7.1.4-project-kit.png +0 -0
  236. package/docs/assets/7.1.4-project-skill-preview.png +0 -0
  237. package/docs/assets/7.1.4-replay.png +0 -0
  238. package/docs/assets/7.1.4-setup-design-preview.png +0 -0
  239. package/docs/assets/7.1.4-usage-design-preview.png +0 -0
  240. package/docs/assets/context-v7.1.3.png +0 -0
  241. package/docs/assets/features-v7.1.3.png +0 -0
  242. package/docs/assets/graph-v7.1.3.png +0 -0
  243. package/docs/assets/integrations-v7.1.3.png +0 -0
  244. package/docs/assets/live-v7.1.4.gif +0 -0
  245. package/docs/evaluation/CONTEXT_EVALUATION_v7.1.4.json +1818 -0
  246. package/docs/evaluation/CONTEXT_EVALUATION_v7.1.4.md +36 -0
  247. package/docs/launch/COMPONENT_MAP_v7.1.4.md +307 -0
  248. package/docs/launch/PROJECT_KIT_PLAN_v7.1.4.md +110 -0
  249. package/docs/launch/PROJECT_LEARNING_PLAN_v7.1.4.md +63 -0
  250. package/docs/launch/RELEASE_NOTES_v7.1.4.md +30 -0
  251. package/docs/launch/RESEARCH_AND_PLAN_v7.1.4.md +255 -0
  252. package/package.json +25 -7
  253. package/skills/shadow-research/SKILL.md +2 -0
  254. package/skills/shadow-workflow/SKILL.md +6 -0
@@ -1 +1 @@
1
- {"version":3,"file":"context-cli.d.ts","sourceRoot":"","sources":["../src/context-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyC9D"}
1
+ {"version":3,"file":"context-cli.d.ts","sourceRoot":"","sources":["../src/context-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoE9D"}
@@ -4,6 +4,10 @@ import { getGlobalBrain, GlobalBrain } from './brain/global-brain.js';
4
4
  import { assembleContext } from './brain/context-assembly.js';
5
5
  import { FeatureSettingsStore, FEATURE_DEFINITIONS } from './brain/feature-settings.js';
6
6
  import { memoryAnnotationsFor } from './brain/memory-annotations.js';
7
+ import { parseContextRequest } from './brain/context-request.js';
8
+ import { inspectMemoryHealth } from './brain/memory-inspection.js';
9
+ import { ProjectFeedbackStore } from './brain/project-feedback.js';
10
+ import { resolveProjectStore } from './brain/project-memory.js';
7
11
  export function registerContextCommands(program) {
8
12
  program.command('context-pack').description('Build a bounded, explained project context pack without model calls')
9
13
  .argument('[query]', 'Current task or search terms', '')
@@ -13,20 +17,29 @@ export function registerContextCommands(program) {
13
17
  .option('--settings <path>', 'Explicit feature-settings file')
14
18
  .option('--token-budget <number>', 'Approximate token budget, including the rendered context', '2000')
15
19
  .option('--cross-project', 'Request broader context when the feature is enabled')
20
+ .option('--profile <name>', 'Retrieval profile: legacy or adaptive', 'legacy')
21
+ .option('--no-related', 'Disable recorded one-hop expansion in adaptive retrieval')
16
22
  .option('--json', 'Print entries, exclusions, reasons, and budget as JSON')
17
23
  .action(async (query, opts) => {
18
24
  const tokenBudget = Number(opts.tokenBudget);
19
25
  if (!Number.isSafeInteger(tokenBudget) || tokenBudget < 0 || tokenBudget > 12000)
20
26
  throw new TypeError('Token budget must be an integer from 0 to 12000.');
21
- const settings = new FeatureSettingsStore({ filePath: opts.settings ?? (opts.db ? path.join(path.dirname(path.resolve(opts.db)), 'feature-settings.json') : undefined) });
27
+ const local = resolveProjectStore(opts.project, opts.db);
28
+ const request = parseContextRequest({ projectId: opts.projectId ?? local?.projectId ?? GlobalBrain.projectIdFor(path.resolve(opts.project)),
29
+ query, tokenBudget, includeCrossProject: !!opts.crossProject, profile: opts.profile, expandRelated: opts.related });
30
+ if (local && (request.projectId !== local.projectId || request.includeCrossProject)) {
31
+ throw new TypeError('This memory store is pinned to its local project.');
32
+ }
33
+ const dbPath = local?.storagePath ?? (opts.db ? path.resolve(opts.db) : undefined);
34
+ const brain = getGlobalBrain(dbPath ? { dbPath } : undefined);
35
+ const settings = new FeatureSettingsStore({ filePath: opts.settings ?? local?.settingsPath ?? (dbPath ? path.join(path.dirname(dbPath), 'feature-settings.json') : undefined) });
22
36
  const features = settings.get().features;
23
- const brain = getGlobalBrain(opts.db ? { dbPath: path.resolve(opts.db) } : undefined);
24
37
  try {
25
38
  if (features.contextAssembly)
26
- await brain.init();
39
+ brain.refresh();
27
40
  const pack = assembleContext(brain, {
28
- projectId: opts.projectId ?? GlobalBrain.projectIdFor(path.resolve(opts.project)),
29
- query, tokenBudget, includeCrossProject: !!opts.crossProject, features,
41
+ ...request, features,
42
+ feedback: features.contextAssembly && local && request.profile === 'adaptive' ? new ProjectFeedbackStore(local.root, brain).get() : undefined,
30
43
  annotations: features.contextAssembly ? memoryAnnotationsFor(brain).get() : undefined,
31
44
  });
32
45
  if (opts.json)
@@ -41,6 +54,27 @@ export function registerContextCommands(program) {
41
54
  await brain.shutdown();
42
55
  }
43
56
  });
57
+ program.command('memory-health').description('Inspect scoped source, review, duplication, age, and relationship attention hints without model calls')
58
+ .option('--project <directory>', 'Project directory', process.cwd())
59
+ .option('--project-id <id>', 'Use an existing memory project ID directly')
60
+ .option('--db <path>', 'Explicit memory-store path')
61
+ .option('--limit <number>', 'Maximum attention items, 1 to 100', '30')
62
+ .action(async (opts) => {
63
+ const local = resolveProjectStore(opts.project, opts.db);
64
+ if (local && opts.projectId && opts.projectId !== local.projectId)
65
+ throw new TypeError('This memory store is pinned to its local project.');
66
+ const dbPath = local?.storagePath ?? (opts.db ? path.resolve(opts.db) : undefined);
67
+ const brain = getGlobalBrain(dbPath ? { dbPath } : undefined);
68
+ try {
69
+ brain.refresh();
70
+ console.log(JSON.stringify(inspectMemoryHealth(brain, memoryAnnotationsFor(brain).get(), {
71
+ projectId: opts.projectId ?? local?.projectId ?? GlobalBrain.projectIdFor(path.resolve(opts.project)), limit: Number(opts.limit),
72
+ }), null, 2));
73
+ }
74
+ finally {
75
+ await brain.shutdown();
76
+ }
77
+ });
44
78
  const features = new Command('features').description('Inspect or change the dedicated runtime feature controls');
45
79
  features.command('list').option('--settings <path>', 'Explicit feature-settings file').action((opts) => {
46
80
  console.log(JSON.stringify({ ...new FeatureSettingsStore({ filePath: opts.settings }).get(), definitions: FEATURE_DEFINITIONS }, null, 2));
@@ -1 +1 @@
1
- {"version":3,"file":"context-cli.js","sourceRoot":"","sources":["../src/context-cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context-cli.js","sourceRoot":"","sources":["../src/context-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const BRAIN_HUB_ACTIONS: string;
2
+ //# sourceMappingURL=brain-hub-actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-hub-actions.d.ts","sourceRoot":"","sources":["../../src/dashboard/brain-hub-actions.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,QAuI7B,CAAC"}
@@ -0,0 +1,137 @@
1
+ export const BRAIN_HUB_ACTIONS = String.raw `
2
+ async function roomWrite(input){
3
+ if(!state.room)throw new Error('Select a room first.');
4
+ state.room=await hubWrite('hub/rooms/'+encodeURIComponent(state.room.room.id)+'/actions',input);
5
+ }
6
+ async function lessonWrite(id,input){
7
+ const {lesson}=await hubWrite('hub/lessons/'+encodeURIComponent(id)+'/actions',input);
8
+ if(lesson)state.hub={...state.hub,lessons:arr(state.hub?.lessons).map(item=>item.id===id?lesson:item)};
9
+ return afterSave(refreshHub,...(input.kind!=='evaluate'?[refreshGraph]:[]));
10
+ }
11
+ async function inspectApprovedMemory(id){
12
+ state.graph=await api('graph'+projectQuery({limit:'140',memory:id}));
13
+ openView('overview');
14
+ await chooseMemory('memory:'+id);
15
+ }
16
+ function handleClick(event){
17
+ const button=event.target.closest('button');
18
+ if(!button||button.disabled)return;
19
+ const data=button.dataset;
20
+ if(data.view){openView(data.view);return;}
21
+ if(data.project){
22
+ if(!state.pending&&data.project!==state.project){state.project=data.project;resetScope();render();void refresh(true);}
23
+ return;
24
+ }
25
+ if(data.node){void chooseMemory(data.node);return;}
26
+ if(data.inspect){state.inspector=data.inspect;renderInspector();$('inspector').querySelector('[data-inspect="'+data.inspect+'"]')?.focus({preventScroll:true});return;}
27
+ if(data.event){setReplay(state.events.findIndex(item=>item.id===data.event));return;}
28
+ if(data.document){void mutation(()=>loadDocuments(data.document),button,'Document opened.');return;}
29
+ if(data.page){state.docPage=Number(data.page);render();return;}
30
+ if(data.room){void mutation(()=>loadRoom(data.room),button,'Room opened.');return;}
31
+ if(data.feature){
32
+ if(!state.features||featureLimit(data.feature))return;
33
+ const feature=data.feature;
34
+ void mutation(async()=>{
35
+ state.features=await api('features',json({patch:{[feature]:!state.features.features[feature]},expectedRevision:state.features.revision}));
36
+ if(feature==='liveActivity'||feature==='activityRecording'){
37
+ if(!state.features.features.liveActivity){state.live=false;state.events=[];state.replayId=null;state.cursor=undefined;state.journalId=undefined;}
38
+ else state.live=true;
39
+ void refresh();
40
+ }
41
+ },button,'Feature setting saved.');return;
42
+ }
43
+ if(data.roomAction){
44
+ const kind=data.roomAction;
45
+ const payload=kind==='ack-message'||kind==='ack-artifact'?{kind:'ack',targetType:kind.slice(4),targetId:data.id,...(data.sha256?{sha256:data.sha256}:{})}:
46
+ kind==='accept'?{kind,artifactId:data.id}:{kind,taskId:data.id,revision:Number(data.revision)};
47
+ void mutation(()=>roomWrite(payload),button);return;
48
+ }
49
+ if(data.lessonAction){void mutation(()=>lessonWrite(data.id,{kind:data.lessonAction}),button);return;}
50
+ if(data.lessonFrom){state.lessonFrom=data.lessonFrom;openView('learning');return;}
51
+ if(!data.action)return;
52
+ if(data.action.startsWith('copy-')){
53
+ const host=arr(state.integrations?.agents).find(item=>item.id===data.host);
54
+ const current=displayEvent();
55
+ const copies={
56
+ 'copy-host':host?.config?.content,'copy-command':host?.command,'copy-diagnostics':state.integrations?.diagnostics,
57
+ 'copy-project-command':'shadow-brain project workspace .','copy-pack':state.context?.markdown,
58
+ 'copy-memory':state.memory?.memory?.content??arr(state.graph?.nodes).find(node=>node.id===state.picked)?.snippet,
59
+ 'copy-event':current?JSON.stringify(current,null,2):null,
60
+ };
61
+ void clipboard(copies[data.action]).catch(failure=>status(failure.message,true));return;
62
+ }
63
+ switch(data.action){
64
+ case 'refresh':void refresh(true);break;
65
+ case 'refresh-room':void mutation(async()=>{await refreshHub();if(state.room)await loadRoom(state.room.room.id);},button,'Room refreshed.');break;
66
+ case 'graph':case 'trace':
67
+ state.graphMode=data.action;state.listing=false;state.pulseIds=[];render();$('main').querySelector('[data-action="'+data.action+'"]')?.focus();break;
68
+ case 'node-list':{
69
+ state.listing=!state.listing;button.setAttribute('aria-expanded',String(state.listing));
70
+ const target=$('node-list');target.hidden=!state.listing;syncGraphControls();if(state.listing)target.querySelector('button')?.focus();break;
71
+ }
72
+ case 'clear-focus':state.focus=false;renderInspector();drawGraph();$('main').querySelector('[data-action=graph]')?.focus({preventScroll:true});break;
73
+ case 'pause':state.motionPaused=!state.motionPaused;state.pulseIds=[];updateOverviewLive();break;
74
+ case 'inspect-latest':state.inspector='event';renderInspector();break;
75
+ case 'live':state.replayId=null;updateOverviewLive();$('replay')?.focus({preventScroll:true});break;
76
+ case 'open-memory':void inspectApprovedMemory(data.memory).catch(failure=>status(failure.message,true));break;
77
+ case 'apply-skill':void mutation(async()=>{
78
+ if(!state.skill?.planHash||!state.skillInput)throw new Error('Preview a project skill before applying it.');
79
+ state.skill={...await api('project-skill-apply',json({...state.skillInput,expectedPlanHash:state.skill.planHash})),applied:true};
80
+ },button,'Reviewed project skill applied.');break;
81
+ case 'review-page':void mutation(async()=>{
82
+ const id=state.documents?.document?.id;
83
+ if(!id)throw new Error('Choose a document page first.');
84
+ state.documents=await hubWrite('hub/documents/'+encodeURIComponent(id)+'/review',{page:state.docPage,decision:data.decision});
85
+ return afterSave(refreshHub,refreshGraph);
86
+ },button,data.decision==='approve'?'Page approved and added to project memory.':'Page rejected.');break;
87
+ }
88
+ }
89
+ function handleSubmit(event){
90
+ const target=event.target;
91
+ const kind=target.dataset.form;
92
+ if(!kind)return;
93
+ event.preventDefault();
94
+ const form=new FormData(target,event.submitter),button=event.submitter;
95
+ const tasks={
96
+ context:async()=>{
97
+ const input={projectId:state.project,query:field(form,'query'),tokenBudget:Number(form.get('tokenBudget')),profile:field(form,'profile'),expandRelated:form.has('expandRelated')};
98
+ state.contextInput=input;
99
+ if(form.get('compare')==='yes'){state.comparison=await api('context-compare',json(input));state.context=state.comparison[input.profile];}
100
+ else {state.context=await api('context',json(input));state.comparison=null;}
101
+ },
102
+ upload:async()=>{
103
+ const pdf=form.get('pdf');
104
+ if(!(pdf instanceof File)||!pdf.size)throw new Error('Choose a PDF to upload.');
105
+ if(state.hub?.limits?.pdfBytes&&pdf.size>state.hub.limits.pdfBytes)throw new Error('The PDF exceeds this workspace’s upload limit.');
106
+ state.documents=await api('hub/documents?'+new URLSearchParams({name:pdf.name}),{method:'POST',body:pdf,headers:{'Content-Type':'application/pdf'},timeoutMs:30000});
107
+ state.docPage=arr(state.documents.pages)[0]?.page??1;
108
+ return afterSave(refreshHub);
109
+ },
110
+ knowledge:async()=>{
111
+ const input={title:field(form,'title'),content:field(form,'content')};
112
+ const source=field(form,'source');if(source)input.source=source;
113
+ await api('project-knowledge',json(input));return afterSave(refreshGraph);
114
+ },
115
+ skill:async()=>{
116
+ const input={requirement:field(form,'requirement'),target:field(form,'target')};
117
+ const name=field(form,'name'),knowledge=field(form,'knowledge');
118
+ if(name)input.name=name;if(knowledge)input.knowledge=knowledge;
119
+ state.skill=await api('project-skill-preview',json(input));state.skillInput=input;
120
+ },
121
+ room:async()=>{state.room=await hubWrite('hub/rooms',{goal:field(form,'goal')});return afterSave(refreshHub);},
122
+ message:async()=>{const replyTo=field(form,'replyTo');await roomWrite({kind:'message',type:field(form,'type'),text:field(form,'text'),...(replyTo?{replyTo}:{})});},
123
+ task:()=>roomWrite({kind:'task',title:field(form,'title')}),
124
+ artifact:async()=>{
125
+ const taskId=field(form,'taskId'),task=arr(state.room?.tasks).find(item=>item.id===taskId);
126
+ if(!task)throw new Error('Choose a claimed task.');
127
+ await roomWrite({kind:'artifact',taskId,revision:task.revision,path:field(form,'path')});
128
+ },
129
+ outcome:()=>{const artifactId=field(form,'artifactId');return roomWrite({kind:'outcome',taskId:field(form,'taskId'),result:field(form,'result'),check:field(form,'check'),evidence:field(form,'evidence'),...(artifactId?{artifactId}:{})});},
130
+ lesson:async()=>{const {lesson}=await hubWrite('hub/lessons',{outcomeId:field(form,'outcomeId'),title:field(form,'title'),text:field(form,'text')});if(lesson)state.hub={...state.hub,lessons:[...arr(state.hub?.lessons),lesson]};state.lessonFrom=null;return afterSave(refreshHub);},
131
+ evaluate:()=>lessonWrite(target.dataset.id,{kind:'evaluate',baseline:form.has('baseline'),candidate:form.has('candidate'),control:form.has('control'),evidence:field(form,'evidence')}),
132
+ };
133
+ const operation=tasks[kind];
134
+ if(operation)void mutation(operation,button,kind==='upload'?'PDF intake recorded.':kind==='context'?'Context pack assembled.':'Saved.');
135
+ }
136
+ `;
137
+ //# sourceMappingURL=brain-hub-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-hub-actions.js","sourceRoot":"","sources":["../../src/dashboard/brain-hub-actions.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuI1C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const BRAIN_HUB_CLIENT: string;
2
+ //# sourceMappingURL=brain-hub-client.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,335 @@
1
+ export const BRAIN_HUB_CLIENT = String.raw `
2
+ const $ = id => document.getElementById(id);
3
+ const arr = value => Array.isArray(value) ? value : [];
4
+ const esc = value => String(value ?? '').replace(/[&<>"']/g, char => ({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[char]));
5
+ const fmt = value => Number.isFinite(value) ? value.toLocaleString() : 'Unavailable';
6
+ const clock = new Intl.DateTimeFormat(undefined,{hour:'2-digit',minute:'2-digit',second:'2-digit'});
7
+ const time = value => value && Number.isFinite(new Date(value).getTime()) ? clock.format(new Date(value)) : '—';
8
+ const isoTime = value => value && Number.isFinite(new Date(value).getTime()) ? new Date(value).toLocaleString() : 'Unavailable';
9
+ const reduced = matchMedia('(prefers-reduced-motion: reduce)');
10
+ const local = document.documentElement.dataset.projectLocal === 'true';
11
+ const projectFeatureLimits={crossProjectContext:'Project memory stays scoped to this project.',automaticBriefing:'Automatic briefing requires a legacy analysis session.'};
12
+ const featureLimit = id => local ? projectFeatureLimits[id] : undefined;
13
+ const nav = {overview:'Brain overview',knowledge:'Knowledge',room:'Collaboration',context:'Context',models:'Models',usage:'Usage',learning:'Learning',setup:'Setup'};
14
+ const labels = {codex:'Codex','claude-code':'Claude Code',opencode:'OpenCode','deepseek-harness':'DeepSeek Harness',user:'Operator'};
15
+ const hostName = value => labels[value] ?? value ?? 'Unknown host';
16
+ const state = {view:'overview',project:'',overview:null,server:null,connection:'connecting',errors:{},graph:null,features:null,integrations:null,
17
+ profile:null,feedback:null,hub:null,documents:null,docPage:1,room:null,context:null,contextInput:null,comparison:null,skill:null,skillInput:null,
18
+ picked:null,memory:null,focus:false,inspector:'record',graphMode:'graph',listing:false,events:[],cursor:undefined,journalId:undefined,
19
+ live:false,recording:false,journalGap:false,replayId:null,motionPaused:false,motionStarted:0,pulseIds:[],pending:false,message:'',messageError:false,
20
+ dataEpoch:0,viewEpoch:0,search:null,lessonFrom:null};
21
+ let timer, polling=false, pollAgain=false, failures=0, polls=0;
22
+ let controller;
23
+ const list = (content,attributes='',classes='') => '<ul class="list '+classes+'" '+attributes+'>'+content+'</ul>';
24
+ const chip = (text,tone='') => '<span class="chip '+tone+'">'+esc(text)+'</span>';
25
+ const btn = (text, attrs='', kind='') => '<button type="button" class="btn '+kind+'" '+attrs+'>'+esc(text)+'</button>';
26
+ const submit = (text, kind='primary') => '<button type="submit" class="btn '+kind+'" '+(state.pending?'disabled':'')+'>'+esc(text)+'</button>';
27
+ const panel = (title, content, meta='', cls='') => '<section class="panel '+cls+'"><div class="panel-head"><h2>'+esc(title)+'</h2>'+meta+'</div>'+content+'</section>';
28
+ const heading = (title, body, actions='') => '<div class="page-head"><div><h1 id="title" tabindex="-1">'+esc(title)+'</h1><p class="small muted">'+esc(body)+'</p></div><div class="actions">'+actions+'</div></div>';
29
+ const empty = (title, detail, action='') => '<div class="empty"><strong>'+esc(title)+'</strong><p class="small">'+esc(detail)+'</p>'+(action?'<div class="actions">'+action+'</div>':'')+'</div>';
30
+ const fact = (label,value) => '<div><dt>'+esc(label)+'</dt><dd>'+esc(value ?? 'Unavailable')+'</dd></div>';
31
+ const error = (key, fallback) => state.errors[key] ? empty('Could not load '+fallback,state.errors[key],btn('Retry','data-action="refresh"')) : '';
32
+ const action = (id,text,kind='',extra='') => btn(text,'data-action="'+id+'" '+extra,kind);
33
+ const view = (id,text=nav[id]) => btn(text,'data-view="'+id+'"','quiet');
34
+ const json = body => ({method:'POST',body:JSON.stringify(body),headers:{'Content-Type':'application/json'}});
35
+ const retryKeys=new Map();
36
+ async function hubWrite(route,input){
37
+ const id=route+'\n'+JSON.stringify(input);
38
+ if(!retryKeys.has(id)){
39
+ if(retryKeys.size>=40)retryKeys.delete(retryKeys.keys().next().value);
40
+ retryKeys.set(id,crypto.randomUUID());
41
+ }
42
+ try{
43
+ const result=await api(route,json({...input,key:retryKeys.get(id)}));
44
+ retryKeys.delete(id);return result;
45
+ }catch(failure){
46
+ if(failure.status&&failure.status<500)retryKeys.delete(id);
47
+ throw failure;
48
+ }
49
+ }
50
+ function status(message='',isError=false){
51
+ state.message=message;state.messageError=isError;
52
+ const target=$('view-status');
53
+ if(target){target.textContent=message;target.dataset.error=String(isError);}
54
+ }
55
+ function projectQuery(extra={}){
56
+ return '?'+new URLSearchParams({...extra,...(state.project?{project:state.project}:{})});
57
+ }
58
+ async function api(route,options={}){
59
+ const {timeoutMs=6500,...request}=options;
60
+ const timeout=AbortSignal.timeout(timeoutMs);
61
+ const signal=request.signal ? AbortSignal.any([request.signal,timeout]) : timeout;
62
+ const pinned=local&&(state.server?.project?.id??state.overview?.projectKit?.projectId);
63
+ const headers={Accept:'application/json',...request.headers,...(pinned&&request.method==='POST'?{'X-Shadow-Brain-Project':pinned}:{})};
64
+ const response=await fetch('/api/workspace/'+route,{...request,signal,cache:'no-store',headers});
65
+ const data=await response.json().catch(()=>null);
66
+ if(!response.ok||!data){
67
+ const failure=new Error(data?.error ?? 'Workspace request returned HTTP '+response.status+'.');
68
+ failure.status=response.status;failure.code=data?.code;throw failure;
69
+ }
70
+ return data;
71
+ }
72
+ function validStatus(data){
73
+ return data&&typeof data.version==='string'&&/^\d+\.\d+\.\d+(?:[-+][\w.-]+)?$/.test(data.version)&&
74
+ typeof data.serverInstanceId==='string'&&data.serverInstanceId.length>0&&['project','shared','demo'].includes(data.mode)&&
75
+ (data.mode!=='project'||typeof data.project?.id==='string'&&typeof data.project.name==='string')&&
76
+ ['ready','error','initializing'].includes(data.storage?.status)&&data.capabilities?.memory===true;
77
+ }
78
+ function validOverview(data){return data&&typeof data.version==='string'&&Array.isArray(data.projects)&&data.totals&&data.projectKit;}
79
+ function scopeName(){return state.overview?.projectKit?.projectName ?? arr(state.overview?.projects).find(project=>project.id===state.project)?.name ?? (state.project||'All projects');}
80
+ function renderChrome(){
81
+ const selector=$('project');
82
+ const projects=arr(state.overview?.projects);
83
+ const fixed=state.overview?.projectKit?.projectId;
84
+ const options=(fixed?'':'<option value="">All projects</option>')+projects.map(project=>'<option value="'+esc(project.id)+'">'+esc(project.name)+'</option>').join('');
85
+ if(selector.dataset.options!==options){selector.innerHTML=options||'<option value="">Loading…</option>';selector.dataset.options=options;}
86
+ selector.disabled=!!fixed||!state.overview||state.pending;
87
+ selector.value=state.project;
88
+ const connection=$('connection');
89
+ const connected=state.connection==='reachable';
90
+ const isDemo=state.overview?.demo===true||state.server?.mode==='demo';
91
+ connection.className='chip '+(connected?'green':state.connection==='connecting'?'':'amber');
92
+ connection.innerHTML='<i class="dot" aria-hidden="true"></i> '+(connected?(isDemo?'Demo workspace · Example data':'Workspace reachable'):state.connection==='connecting'?'Connecting to workspace':'Workspace unavailable');
93
+ const notice=$('notice');
94
+ notice.textContent=state.connection==='offline'?'The local workspace did not respond. Keep this tab open while the launcher restarts the server, or refresh to retry. '+(state.overview?'Showing the last loaded snapshot.':''):
95
+ state.errors.overview||state.server?.storage?.status==='error'?'The server responded, but the memory store is unavailable. '+(state.errors.overview||state.server.storage.error||''):
96
+ state.journalGap?'Some activity expired before this page could read it. The timeline shows retained records.':'';
97
+ $('scope-note').textContent=state.overview?(fixed?'Project-local workspace · ':'Global workspace · ')+scopeName()+(state.overview.version?' · v'+state.overview.version:''):'';
98
+ const buttons=Object.entries(nav).map(([id,label])=>'<button type="button" data-view="'+id+'" '+(id===state.view?'aria-current="page"':'')+'>'+label+'</button>').join('');
99
+ if($('nav').dataset.buttons!==buttons){$('nav').innerHTML=buttons;$('nav').dataset.buttons=buttons;}
100
+ }
101
+ function resetScope(){
102
+ state.dataEpoch++;state.viewEpoch++;state.graph=null;state.picked=null;state.memory=null;state.focus=false;state.context=null;
103
+ state.comparison=null;state.contextInput=null;state.hub=null;state.documents=null;state.room=null;state.profile=null;state.feedback=null;
104
+ state.skill=null;state.skillInput=null;state.search=null;state.events=[];state.cursor=undefined;state.journalId=undefined;state.lessonFrom=null;
105
+ state.replayId=null;state.journalGap=false;state.pulseIds=[];state.motionStarted=0;
106
+ }
107
+ function updateOverview(value){
108
+ const fixed=value.projectKit?.projectId;
109
+ const next=fixed ?? (arr(value.projects).some(project=>project.id===state.project)?state.project:'');
110
+ if(next!==state.project){state.project=next;resetScope();}
111
+ state.overview=value;
112
+ }
113
+ function installTelemetry(page){
114
+ if(!page.liveEnabled){
115
+ state.events=[];state.cursor=undefined;state.journalId=undefined;state.live=false;state.recording=page.recordingEnabled;state.replayId=null;state.pulseIds=[];
116
+ return;
117
+ }
118
+ state.live=true;state.recording=page.recordingEnabled;
119
+ if(page.gap||page.reset||(state.journalId&&state.journalId!==page.journalId)){
120
+ state.events=[];state.replayId=null;state.journalGap=!!page.gap;state.pulseIds=[];
121
+ }
122
+ const hasHistory=state.cursor!==undefined;
123
+ const unique=new Map(state.events.map(event=>[event.id,event]));
124
+ const added=arr(page.events).filter(event=>!unique.has(event.id));
125
+ for(const event of added)unique.set(event.id,event);
126
+ state.events=[...unique.values()].sort((a,b)=>a.sequence-b.sequence).slice(-200);
127
+ state.cursor=page.cursor;
128
+ state.journalId=page.journalId;
129
+ if(state.replayId&&!unique.has(state.replayId))state.replayId=null;
130
+ if(hasHistory&&!page.gap&&!page.reset&&!page.hasMore&&state.view==='overview'&&state.graphMode==='graph'&&!state.focus&&!state.replayId&&!state.motionPaused&&!reduced.matches){
131
+ const now=Date.now();
132
+ const fresh=added.filter(event=>{
133
+ const age=now-Date.parse(event.timestamp);
134
+ return age>=0&&age<=6500;
135
+ });
136
+ if(fresh.length){state.pulseIds=fresh.slice(-4).map(event=>event.id);state.motionStarted=performance.now();}
137
+ }
138
+ }
139
+ async function refresh(manual=false){
140
+ if(document.hidden&&!manual)return;
141
+ clearTimeout(timer);
142
+ if(polling){pollAgain ||= manual;return;}
143
+ polling=true;
144
+ controller=new AbortController();
145
+ const signal=controller.signal;
146
+ const options={signal};
147
+ try{
148
+ const [health,summary]=await Promise.allSettled([api('status',options),api('overview',options)]);
149
+ if(signal.aborted)return;
150
+ const old=state.server?.serverInstanceId;
151
+ const healthOk=health.status==='fulfilled'&&validStatus(health.value);
152
+ const summaryOk=summary.status==='fulfilled'&&validOverview(summary.value);
153
+ if(healthOk){
154
+ const next=health.value;
155
+ if(old&&next.serverInstanceId&&old!==next.serverInstanceId){resetScope();state.features=null;state.integrations=null;}
156
+ state.server=next;
157
+ }
158
+ const reachable=healthOk||summaryOk;
159
+ state.connection=reachable?'reachable':'offline';
160
+ if(summaryOk){updateOverview(summary.value);delete state.errors.overview;}
161
+ else if(reachable)state.errors.overview=summary.reason?.message??'The workspace returned an invalid overview.';
162
+ renderChrome();
163
+ if(!reachable){failures++;state.pulseIds=[];drawGraph();if(!$('title'))render();return;}
164
+ failures=0;
165
+ polls++;
166
+ const epoch=state.dataEpoch;
167
+ const params=new URLSearchParams(projectQuery({limit:'200'}).slice(1));
168
+ if(state.cursor!==undefined)params.set('cursor',state.cursor);
169
+ if(state.journalId)params.set('journalId',state.journalId);
170
+ const jobs=[['telemetry',api('telemetry?'+params,options)]];
171
+ if(!state.graph||manual||(state.view==='overview'&&(polls%3===0||state.graph.totalMemories!==state.overview?.quality?.total)))jobs.push(['graph',api('graph'+projectQuery({limit:'140',...(state.picked?.startsWith('memory:')?{memory:state.picked.slice(7)}:{})}),options)]);
172
+ if(!state.features||manual||state.view==='setup')jobs.push(['features',api('features',options)]);
173
+ if(local&&state.server?.capabilities?.hub!==false&&!state.pending&&(!state.hub||manual||['room','knowledge','learning'].includes(state.view)))jobs.push(['hub',api('hub',options)]);
174
+ if(local&&!state.pending&&state.view==='room'&&state.room)jobs.push(['room',api('hub/rooms/'+encodeURIComponent(state.room.room.id),options)]);
175
+ const results=await Promise.allSettled(jobs.map(([,job])=>job));
176
+ if(signal.aborted||epoch!==state.dataEpoch)return;
177
+ let needsRender=false;
178
+ results.forEach((result,index)=>{
179
+ const name=jobs[index][0];
180
+ if(result.status==='rejected'){state.errors[name]=result.reason.message;return;}
181
+ delete state.errors[name];
182
+ if(name==='telemetry'){installTelemetry(result.value);if(result.value.hasMore)pollAgain=true;}
183
+ else if(name==='graph'&&JSON.stringify(state.graph)!==JSON.stringify(result.value)){state.graph=result.value;needsRender ||= state.view==='overview';}
184
+ else if(name==='features'&&(!state.features||result.value.revision>=state.features.revision)){
185
+ needsRender ||= state.view==='setup'&&state.features?.revision!==result.value.revision;
186
+ state.features=result.value;
187
+ }else if(name==='hub'&&(!state.hub||result.value.revision>=state.hub.revision)){
188
+ needsRender ||= ['room','knowledge','learning'].includes(state.view)&&state.hub?.revision!==result.value.revision;
189
+ state.hub=result.value;
190
+ }else if(name==='room'&&state.room?.room?.id===result.value.room.id&&result.value.revision>=state.room.revision){
191
+ needsRender ||= state.view==='room'&&state.room.revision!==result.value.revision;
192
+ state.room=result.value;
193
+ }
194
+ });
195
+ renderChrome();
196
+ if(state.view==='overview'){
197
+ if(manual||!$('brain-stage')||needsRender)render();
198
+ else updateOverviewLive();
199
+ }else if(manual||!$('title')||needsRender)render(true);
200
+ if(manual)await loadView();
201
+ } finally {
202
+ polling=false;controller=undefined;
203
+ if(!document.hidden){
204
+ const delay=pollAgain?20:failures?Math.min(15000,1800*2**Math.min(3,failures-1)):2600;
205
+ pollAgain=false;timer=setTimeout(()=>void refresh(),delay);
206
+ }
207
+ }
208
+ }
209
+ async function loadView(){
210
+ const epoch=++state.viewEpoch;
211
+ const current=state.view;
212
+ const jobs=[];
213
+ if(current==='setup')jobs.push(['integrations','integrations']);
214
+ if(current==='knowledge'||current==='room'||current==='learning'){
215
+ if(local&&!state.hub)jobs.push(['hub','hub']);
216
+ if(local&&current==='knowledge'&&!state.profile)jobs.push(['profile','project-profile']);
217
+ if(local&&current==='learning'&&!state.feedback)jobs.push(['feedback','project-feedback']);
218
+ }
219
+ if(current==='models')jobs.push(['integrations','integrations']);
220
+ const results=await Promise.allSettled(jobs.map(([,url])=>api(url)));
221
+ if(epoch!==state.viewEpoch||current!==state.view)return;
222
+ results.forEach((result,index)=>{
223
+ const name=jobs[index][0];
224
+ if(result.status==='fulfilled'){state[name]=result.value;delete state.errors[name];}
225
+ else state.errors[name]=result.reason.message;
226
+ });
227
+ if(jobs.length)render(true);
228
+ }
229
+ function openView(next){
230
+ if(!Object.hasOwn(nav,next))return;
231
+ state.view=next;state.message='';state.messageError=false;state.pulseIds=[];
232
+ render();window.scrollTo(0,0);$('title')?.focus({preventScroll:true});void loadView();
233
+ }
234
+ function render(restore=false){
235
+ const formValues=restore?[...$('main').querySelectorAll('form[data-form]')].map(form=>{
236
+ const fields=[...form.elements].filter(node=>node.name&&node.type!=='submit'&&node.type!=='button');
237
+ return {kind:form.dataset.form,id:form.dataset.id,fields:fields.map(node=>({name:node.name,value:node.value,checked:node.checked,
238
+ file:node.type==='file'?node:null,active:node===document.activeElement,start:node.selectionStart,end:node.selectionEnd}))};
239
+ }):[];
240
+ unmountGraph();
241
+ renderChrome();
242
+ const viewBody=views[state.view]();
243
+ $('main').innerHTML=viewBody+'<p class="status small" id="view-status" role="status"></p>';
244
+ status(state.message,state.messageError);
245
+ if(state.view==='overview')mountGraph();
246
+ for(const form of $('main').querySelectorAll('form[data-form]')){
247
+ const saved=formValues.find(item=>item.kind===form.dataset.form&&item.id===form.dataset.id);
248
+ if(!saved)continue;
249
+ for(const field of saved.fields){
250
+ let node=form.elements.namedItem(field.name);
251
+ if(!node)continue;
252
+ if(field.file?.files?.length){node.replaceWith(field.file);node=field.file;}
253
+ else if(node.type!=='file'&&(node.tagName!=='SELECT'||[...node.options].some(option=>option.value===field.value)))node.value=field.value;
254
+ if(node.type==='checkbox')node.checked=field.checked;
255
+ if(field.active){node.closest('details')?.setAttribute('open','');node.focus({preventScroll:true});if(field.start!==null)node.setSelectionRange?.(field.start,field.end);}
256
+ }
257
+ }
258
+ }
259
+ async function chooseMemory(id){
260
+ const item=arr(state.graph?.nodes).find(node=>node.id===id);
261
+ if(!item)return;
262
+ state.picked=id;state.memory=null;state.focus=true;state.inspector='record';state.pulseIds=[];
263
+ renderInspector();drawGraph();
264
+ if(item.kind!=='memory')return;
265
+ const epoch=state.dataEpoch;
266
+ try{
267
+ const detail=await api('memory?'+new URLSearchParams({id:item.memoryId,project:item.project}));
268
+ if(epoch!==state.dataEpoch||state.picked!==id)return;
269
+ state.memory=detail;renderInspector();
270
+ }catch(failure){if(epoch===state.dataEpoch&&state.picked===id)status(failure.message,true);}
271
+ }
272
+ async function loadDocuments(id){state.documents=await api('hub/documents/'+encodeURIComponent(id));state.docPage=arr(state.documents.pages)[0]?.page??1;}
273
+ async function loadRoom(id){state.room=await api('hub/rooms/'+encodeURIComponent(id));}
274
+ async function refreshHub(){state.hub=await api('hub');delete state.errors.hub;}
275
+ async function refreshGraph(){state.graph=await api('graph'+projectQuery({limit:'140'}));delete state.errors.graph;}
276
+ function field(form,name){return String(form.get(name)??'').trim();}
277
+ async function clipboard(text){
278
+ if(!text)throw new Error('There is no text to copy.');
279
+ await navigator.clipboard.writeText(text);
280
+ status('Copied to clipboard.');
281
+ }
282
+ async function mutation(operation,source,success='Saved.'){
283
+ if(state.pending)return;
284
+ state.pending=true;
285
+ const submissionView=state.view;
286
+ if(source)source.disabled=true;
287
+ renderChrome();
288
+ status('Working…');
289
+ try{
290
+ const message=await operation();
291
+ state.pending=false;status(typeof message==='string'?message:success);render(state.view!==submissionView);
292
+ if(source?.dataset.feature)[...$('main').querySelectorAll('[data-feature]')].find(node=>node.dataset.feature===source.dataset.feature)?.focus({preventScroll:true});
293
+ }
294
+ catch(failure){
295
+ if(failure.status===409){
296
+ if(source?.dataset.feature){try{state.features=await api('features');render(true);}catch{}}
297
+ else if(source?.dataset.roomAction&&state.room){try{await loadRoom(state.room.room.id);render(true);}catch{}}
298
+ }
299
+ status(failure.message||'The workspace request failed.',true);
300
+ }finally{
301
+ state.pending=false;
302
+ if(source)source.disabled=false;
303
+ $('main').querySelectorAll('button[type=submit]').forEach(node=>node.disabled=false);
304
+ renderChrome();
305
+ }
306
+ }
307
+ async function afterSave(...refreshers){
308
+ const results=await Promise.allSettled(refreshers.map(refresh=>refresh()));
309
+ return results.some(result=>result.status==='rejected')?'Saved. Refresh the workspace to reload related records.':undefined;
310
+ }
311
+ function setReplay(index){
312
+ const event=state.events[index];
313
+ if(!event)return;
314
+ state.replayId=event.id;state.pulseIds=[];state.inspector='event';state.focus=false;
315
+ updateOverviewLive();renderInspector();drawGraph();
316
+ }
317
+ function start(){
318
+ render();
319
+ $('reload').addEventListener('click',()=>void refresh(true));
320
+ $('project').addEventListener('change',event=>{
321
+ state.project=event.target.value;resetScope();render();void refresh(true);
322
+ });
323
+ $('main').addEventListener('input',event=>{if(event.target.id==='replay')setReplay(Number(event.target.value));});
324
+ document.addEventListener('visibilitychange',()=>{
325
+ clearTimeout(timer);state.pulseIds=[];drawGraph();
326
+ if(document.hidden)controller?.abort();else void refresh(true);
327
+ });
328
+ reduced.addEventListener('change',()=>{state.pulseIds=[];updateOverviewLive();});
329
+ window.addEventListener('online',()=>void refresh(true));
330
+ document.addEventListener('click',handleClick);
331
+ document.addEventListener('submit',handleSubmit);
332
+ void refresh(true);
333
+ }
334
+ `;
335
+ //# sourceMappingURL=brain-hub-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-hub-client.js","sourceRoot":"","sources":["../../src/dashboard/brain-hub-client.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6UzC,CAAC"}
@@ -0,0 +1,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,QA8K3B,CAAC"}