@monoes/monomindcli 1.10.56 → 1.11.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 (569) hide show
  1. package/.claude/agents/core/coordinator.md +71 -0
  2. package/.claude/agents/generated/case-analyst.md +50 -0
  3. package/.claude/agents/generated/copy-editor.md +45 -0
  4. package/.claude/agents/generated/court-reporter.md +50 -0
  5. package/.claude/agents/generated/defender.md +51 -0
  6. package/.claude/agents/generated/editor-in-chief.md +45 -0
  7. package/.claude/agents/generated/fact-checker.md +45 -0
  8. package/.claude/agents/generated/judge.md +51 -0
  9. package/.claude/agents/generated/prosecutor.md +51 -0
  10. package/.claude/agents/generated/reporter.md +45 -0
  11. package/.claude/commands/hooks/README.md +1 -1
  12. package/.claude/commands/hooks/overview.md +1 -1
  13. package/.claude/commands/mastermind/_repeat.md +1 -1
  14. package/.claude/commands/mastermind/do.md +3 -1
  15. package/.claude/commands/mastermind/help.md +2 -2
  16. package/.claude/commands/mastermind/master.md +39 -6
  17. package/.claude/commands/mastermind/memory.md +1 -1
  18. package/.claude/commands/memory/memory-search.md +2 -2
  19. package/.claude/commands/monitoring/status.md +1 -1
  20. package/.claude/commands/{browse.md → monobrowse.md} +2 -2
  21. package/.claude/commands/sparc.md +1 -1
  22. package/.claude/helpers/handlers/graph-status-handler.cjs +1 -1
  23. package/.claude/helpers/loop-tracker.cjs +1 -1
  24. package/.claude/skills/agent-browser-testing/SKILL.md +1 -1
  25. package/.claude/skills/hooks-automation/SKILL.md +0 -3
  26. package/.claude/skills/mastermind/build.md +1 -1
  27. package/.claude/skills/mastermind/code-quality-reviewer-prompt.md +60 -0
  28. package/.claude/skills/mastermind/content.md +1 -1
  29. package/.claude/skills/mastermind/createorg.md +79 -2
  30. package/.claude/skills/mastermind/design.md +3 -1
  31. package/.claude/skills/mastermind/finance.md +1 -1
  32. package/.claude/skills/mastermind/implementer-prompt.md +109 -0
  33. package/.claude/skills/mastermind/marketing.md +1 -1
  34. package/.claude/skills/mastermind/ops.md +1 -1
  35. package/.claude/skills/mastermind/plan.md +20 -2
  36. package/.claude/skills/mastermind/release.md +1 -1
  37. package/.claude/skills/mastermind/research.md +1 -1
  38. package/.claude/skills/mastermind/review.md +1 -1
  39. package/.claude/skills/mastermind/sales.md +1 -1
  40. package/.claude/skills/mastermind/spec-reviewer-prompt.md +63 -0
  41. package/.claude/skills/sparc-methodology/SKILL.md +3 -3
  42. package/.claude/skills/swarm-advanced/SKILL.md +1 -4
  43. package/README.md +18 -32
  44. package/dist/src/agents/registry-builder.d.ts +1 -7
  45. package/dist/src/agents/registry-builder.d.ts.map +1 -1
  46. package/dist/src/agents/registry-builder.js +10 -6
  47. package/dist/src/agents/registry-builder.js.map +1 -1
  48. package/dist/src/benchmarks/benchmark-runner.d.ts +59 -12
  49. package/dist/src/benchmarks/benchmark-runner.d.ts.map +1 -1
  50. package/dist/src/benchmarks/benchmark-runner.js +67 -13
  51. package/dist/src/benchmarks/benchmark-runner.js.map +1 -1
  52. package/dist/src/benchmarks/metric-evaluators.d.ts.map +1 -1
  53. package/dist/src/benchmarks/metric-evaluators.js.map +1 -1
  54. package/dist/src/benchmarks/pretrain/index.d.ts +0 -13
  55. package/dist/src/benchmarks/pretrain/index.d.ts.map +1 -1
  56. package/dist/src/benchmarks/pretrain/index.js.map +1 -1
  57. package/dist/src/commands/agent-wasm.d.ts +2 -2
  58. package/dist/src/commands/agent-wasm.js +5 -5
  59. package/dist/src/commands/agent.d.ts.map +1 -1
  60. package/dist/src/commands/agent.js +1 -6
  61. package/dist/src/commands/agent.js.map +1 -1
  62. package/dist/src/commands/analyze.d.ts +1 -1
  63. package/dist/src/commands/analyze.d.ts.map +1 -1
  64. package/dist/src/commands/analyze.js +8 -18
  65. package/dist/src/commands/analyze.js.map +1 -1
  66. package/dist/src/commands/doctor.d.ts.map +1 -1
  67. package/dist/src/commands/doctor.js +53 -3
  68. package/dist/src/commands/doctor.js.map +1 -1
  69. package/dist/src/commands/embeddings.d.ts.map +1 -1
  70. package/dist/src/commands/embeddings.js +9 -33
  71. package/dist/src/commands/embeddings.js.map +1 -1
  72. package/dist/src/commands/hooks.d.ts.map +1 -1
  73. package/dist/src/commands/hooks.js +24 -76
  74. package/dist/src/commands/hooks.js.map +1 -1
  75. package/dist/src/commands/index.d.ts +4 -6
  76. package/dist/src/commands/index.d.ts.map +1 -1
  77. package/dist/src/commands/index.js +8 -15
  78. package/dist/src/commands/index.js.map +1 -1
  79. package/dist/src/commands/init.js +2 -2
  80. package/dist/src/commands/init.js.map +1 -1
  81. package/dist/src/commands/issues.d.ts.map +1 -1
  82. package/dist/src/commands/issues.js +16 -11
  83. package/dist/src/commands/issues.js.map +1 -1
  84. package/dist/src/commands/mcp.d.ts +1 -1
  85. package/dist/src/commands/memory.js +6 -6
  86. package/dist/src/commands/memory.js.map +1 -1
  87. package/dist/src/commands/migrate.d.ts.map +1 -1
  88. package/dist/src/commands/migrate.js +1 -2
  89. package/dist/src/commands/migrate.js.map +1 -1
  90. package/dist/src/commands/monograph.d.ts.map +1 -1
  91. package/dist/src/commands/monograph.js +18 -11
  92. package/dist/src/commands/monograph.js.map +1 -1
  93. package/dist/src/commands/monovector/backup.d.ts +11 -0
  94. package/dist/src/commands/monovector/backup.d.ts.map +1 -0
  95. package/dist/src/commands/{ruvector → monovector}/backup.js +25 -25
  96. package/dist/src/commands/monovector/backup.js.map +1 -0
  97. package/dist/src/commands/monovector/benchmark.d.ts +11 -0
  98. package/dist/src/commands/monovector/benchmark.d.ts.map +1 -0
  99. package/dist/src/commands/{ruvector → monovector}/benchmark.js +14 -14
  100. package/dist/src/commands/monovector/benchmark.js.map +1 -0
  101. package/dist/src/commands/monovector/import.d.ts +18 -0
  102. package/dist/src/commands/monovector/import.d.ts.map +1 -0
  103. package/dist/src/commands/{ruvector → monovector}/import.js +21 -21
  104. package/dist/src/commands/monovector/import.js.map +1 -0
  105. package/dist/src/commands/{ruvector → monovector}/index.d.ts +6 -6
  106. package/dist/src/commands/monovector/index.d.ts.map +1 -0
  107. package/dist/src/commands/{ruvector → monovector}/index.js +22 -22
  108. package/dist/src/commands/monovector/index.js.map +1 -0
  109. package/dist/src/commands/monovector/init.d.ts +11 -0
  110. package/dist/src/commands/monovector/init.d.ts.map +1 -0
  111. package/dist/src/commands/{ruvector → monovector}/init.js +36 -36
  112. package/dist/src/commands/monovector/init.js.map +1 -0
  113. package/dist/src/commands/monovector/migrate.d.ts +11 -0
  114. package/dist/src/commands/monovector/migrate.d.ts.map +1 -0
  115. package/dist/src/commands/{ruvector → monovector}/migrate.js +16 -16
  116. package/dist/src/commands/monovector/migrate.js.map +1 -0
  117. package/dist/src/commands/{ruvector → monovector}/optimize.d.ts +2 -2
  118. package/dist/src/commands/monovector/optimize.d.ts.map +1 -0
  119. package/dist/src/commands/{ruvector → monovector}/optimize.js +10 -10
  120. package/dist/src/commands/monovector/optimize.js.map +1 -0
  121. package/dist/src/commands/monovector/setup.d.ts +18 -0
  122. package/dist/src/commands/monovector/setup.d.ts.map +1 -0
  123. package/dist/src/commands/{ruvector → monovector}/setup.js +77 -77
  124. package/dist/src/commands/monovector/setup.js.map +1 -0
  125. package/dist/src/commands/{ruvector → monovector}/status.d.ts +2 -2
  126. package/dist/src/commands/monovector/status.d.ts.map +1 -0
  127. package/dist/src/commands/{ruvector → monovector}/status.js +34 -34
  128. package/dist/src/commands/monovector/status.js.map +1 -0
  129. package/dist/src/commands/neural.d.ts +1 -1
  130. package/dist/src/commands/neural.d.ts.map +1 -1
  131. package/dist/src/commands/neural.js +31 -608
  132. package/dist/src/commands/neural.js.map +1 -1
  133. package/dist/src/commands/performance.d.ts.map +1 -1
  134. package/dist/src/commands/performance.js +7 -10
  135. package/dist/src/commands/performance.js.map +1 -1
  136. package/dist/src/commands/plugins.d.ts.map +1 -1
  137. package/dist/src/commands/plugins.js +3 -4
  138. package/dist/src/commands/plugins.js.map +1 -1
  139. package/dist/src/commands/process.d.ts.map +1 -1
  140. package/dist/src/commands/process.js +5 -12
  141. package/dist/src/commands/process.js.map +1 -1
  142. package/dist/src/commands/progress.d.ts.map +1 -1
  143. package/dist/src/commands/progress.js +16 -16
  144. package/dist/src/commands/progress.js.map +1 -1
  145. package/dist/src/commands/replay.d.ts.map +1 -1
  146. package/dist/src/commands/replay.js.map +1 -1
  147. package/dist/src/commands/route.d.ts +2 -2
  148. package/dist/src/commands/route.js +23 -23
  149. package/dist/src/commands/route.js.map +1 -1
  150. package/dist/src/commands/status.d.ts.map +1 -1
  151. package/dist/src/commands/status.js +0 -3
  152. package/dist/src/commands/status.js.map +1 -1
  153. package/dist/src/commands/swarm.d.ts.map +1 -1
  154. package/dist/src/commands/swarm.js +2 -3
  155. package/dist/src/commands/swarm.js.map +1 -1
  156. package/dist/src/commands/update.d.ts +1 -1
  157. package/dist/src/config-adapter.d.ts.map +1 -1
  158. package/dist/src/config-adapter.js +27 -0
  159. package/dist/src/config-adapter.js.map +1 -1
  160. package/dist/src/consensus/audit-writer.d.ts +44 -17
  161. package/dist/src/consensus/audit-writer.d.ts.map +1 -1
  162. package/dist/src/consensus/audit-writer.js.map +1 -1
  163. package/dist/src/dlq/dlq-replayer.d.ts +1 -1
  164. package/dist/src/dlq/dlq-replayer.d.ts.map +1 -1
  165. package/dist/src/index.d.ts +1 -1
  166. package/dist/src/index.js +5 -5
  167. package/dist/src/index.js.map +1 -1
  168. package/dist/src/init/claudemd-generator.d.ts.map +1 -1
  169. package/dist/src/init/claudemd-generator.js +10 -14
  170. package/dist/src/init/claudemd-generator.js.map +1 -1
  171. package/dist/src/init/executor.d.ts.map +1 -1
  172. package/dist/src/init/executor.js +17 -27
  173. package/dist/src/init/executor.js.map +1 -1
  174. package/dist/src/init/helpers-generator.d.ts +1 -1
  175. package/dist/src/init/helpers-generator.js +2 -2
  176. package/dist/src/init/types.d.ts +1 -1
  177. package/dist/src/init/types.d.ts.map +1 -1
  178. package/dist/src/mcp-client.d.ts.map +1 -1
  179. package/dist/src/mcp-client.js +1 -7
  180. package/dist/src/mcp-client.js.map +1 -1
  181. package/dist/src/mcp-server.d.ts.map +1 -1
  182. package/dist/src/mcp-server.js +9 -1
  183. package/dist/src/mcp-server.js.map +1 -1
  184. package/dist/src/mcp-tools/agent-tools.d.ts.map +1 -1
  185. package/dist/src/mcp-tools/agent-tools.js +1 -52
  186. package/dist/src/mcp-tools/agent-tools.js.map +1 -1
  187. package/dist/src/mcp-tools/analyze-tools.js +5 -5
  188. package/dist/src/mcp-tools/analyze-tools.js.map +1 -1
  189. package/dist/src/mcp-tools/auto-install.d.ts +4 -4
  190. package/dist/src/mcp-tools/autopilot-tools.d.ts +1 -1
  191. package/dist/src/mcp-tools/browser-tools.d.ts +1 -1
  192. package/dist/src/mcp-tools/browser-tools.d.ts.map +1 -1
  193. package/dist/src/mcp-tools/browser-tools.js +6 -5
  194. package/dist/src/mcp-tools/browser-tools.js.map +1 -1
  195. package/dist/src/mcp-tools/claims-tools.d.ts +1 -1
  196. package/dist/src/mcp-tools/coordination-tools.d.ts +1 -1
  197. package/dist/src/mcp-tools/coordination-tools.d.ts.map +1 -1
  198. package/dist/src/mcp-tools/coordination-tools.js +51 -54
  199. package/dist/src/mcp-tools/coordination-tools.js.map +1 -1
  200. package/dist/src/mcp-tools/daa-tools.d.ts +1 -1
  201. package/dist/src/mcp-tools/daa-tools.d.ts.map +1 -1
  202. package/dist/src/mcp-tools/daa-tools.js.map +1 -1
  203. package/dist/src/mcp-tools/embeddings-tools.js +10 -10
  204. package/dist/src/mcp-tools/embeddings-tools.js.map +1 -1
  205. package/dist/src/mcp-tools/guidance-tools.d.ts +1 -1
  206. package/dist/src/mcp-tools/guidance-tools.d.ts.map +1 -1
  207. package/dist/src/mcp-tools/guidance-tools.js +0 -24
  208. package/dist/src/mcp-tools/guidance-tools.js.map +1 -1
  209. package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -1
  210. package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
  211. package/dist/src/mcp-tools/hooks-tools.js +189 -446
  212. package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
  213. package/dist/src/mcp-tools/index.d.ts +0 -2
  214. package/dist/src/mcp-tools/index.d.ts.map +1 -1
  215. package/dist/src/mcp-tools/index.js +0 -2
  216. package/dist/src/mcp-tools/index.js.map +1 -1
  217. package/dist/src/mcp-tools/monograph-compat.d.ts +334 -0
  218. package/dist/src/mcp-tools/monograph-compat.d.ts.map +1 -0
  219. package/dist/src/mcp-tools/monograph-compat.js +1108 -0
  220. package/dist/src/mcp-tools/monograph-compat.js.map +1 -0
  221. package/dist/src/mcp-tools/monograph-tools.d.ts.map +1 -1
  222. package/dist/src/mcp-tools/monograph-tools.js +76 -34
  223. package/dist/src/mcp-tools/monograph-tools.js.map +1 -1
  224. package/dist/src/mcp-tools/neural-tools.d.ts +2 -2
  225. package/dist/src/mcp-tools/neural-tools.js +2 -2
  226. package/dist/src/mcp-tools/neural-tools.js.map +1 -1
  227. package/dist/src/mcp-tools/progress-tools.d.ts +1 -1
  228. package/dist/src/mcp-tools/ruvllm-tools.d.ts +2 -2
  229. package/dist/src/mcp-tools/ruvllm-tools.js +3 -3
  230. package/dist/src/mcp-tools/terminal-tools.d.ts +1 -1
  231. package/dist/src/mcp-tools/terminal-tools.d.ts.map +1 -1
  232. package/dist/src/mcp-tools/terminal-tools.js +29 -19
  233. package/dist/src/mcp-tools/terminal-tools.js.map +1 -1
  234. package/dist/src/mcp-tools/transfer-tools.d.ts +1 -1
  235. package/dist/src/mcp-tools/wasm-agent-tools.d.ts +1 -1
  236. package/dist/src/mcp-tools/wasm-agent-tools.js +2 -2
  237. package/dist/src/memory/intelligence.d.ts.map +1 -1
  238. package/dist/src/memory/intelligence.js +14 -8
  239. package/dist/src/memory/intelligence.js.map +1 -1
  240. package/dist/src/memory/memory-bridge.d.ts +17 -2
  241. package/dist/src/memory/memory-bridge.d.ts.map +1 -1
  242. package/dist/src/memory/memory-bridge.js +76 -23
  243. package/dist/src/memory/memory-bridge.js.map +1 -1
  244. package/dist/src/memory/memory-initializer.d.ts +2 -2
  245. package/dist/src/memory/memory-initializer.d.ts.map +1 -1
  246. package/dist/src/memory/memory-initializer.js +37 -39
  247. package/dist/src/memory/memory-initializer.js.map +1 -1
  248. package/dist/src/monovector/capabilities.d.ts +34 -0
  249. package/dist/src/monovector/capabilities.d.ts.map +1 -0
  250. package/dist/src/monovector/capabilities.js +37 -0
  251. package/dist/src/monovector/capabilities.js.map +1 -0
  252. package/dist/src/monovector/command-outcomes.d.ts +37 -0
  253. package/dist/src/monovector/command-outcomes.d.ts.map +1 -0
  254. package/dist/src/monovector/command-outcomes.js +87 -0
  255. package/dist/src/monovector/command-outcomes.js.map +1 -0
  256. package/dist/src/monovector/coverage-router.d.ts +103 -0
  257. package/dist/src/monovector/coverage-router.d.ts.map +1 -0
  258. package/dist/src/monovector/coverage-router.js +337 -0
  259. package/dist/src/monovector/coverage-router.js.map +1 -0
  260. package/dist/src/monovector/coverage-tools.d.ts +14 -0
  261. package/dist/src/monovector/coverage-tools.d.ts.map +1 -0
  262. package/dist/src/monovector/coverage-tools.js +112 -0
  263. package/dist/src/monovector/coverage-tools.js.map +1 -0
  264. package/dist/src/{ruvector → monovector}/diff-classifier.d.ts +2 -2
  265. package/dist/src/monovector/diff-classifier.d.ts.map +1 -0
  266. package/dist/src/monovector/diff-classifier.js.map +1 -0
  267. package/dist/src/monovector/index.d.ts +61 -0
  268. package/dist/src/monovector/index.d.ts.map +1 -0
  269. package/dist/src/monovector/index.js +67 -0
  270. package/dist/src/monovector/index.js.map +1 -0
  271. package/dist/src/monovector/init-state.d.ts +35 -0
  272. package/dist/src/monovector/init-state.d.ts.map +1 -0
  273. package/dist/src/monovector/init-state.js +36 -0
  274. package/dist/src/monovector/init-state.js.map +1 -0
  275. package/dist/src/monovector/route-outcomes.d.ts +55 -0
  276. package/dist/src/monovector/route-outcomes.d.ts.map +1 -0
  277. package/dist/src/monovector/route-outcomes.js +137 -0
  278. package/dist/src/monovector/route-outcomes.js.map +1 -0
  279. package/dist/src/parser.js +3 -3
  280. package/dist/src/parser.js.map +1 -1
  281. package/dist/src/plugins/store/discovery.d.ts.map +1 -1
  282. package/dist/src/plugins/store/discovery.js +0 -31
  283. package/dist/src/plugins/store/discovery.js.map +1 -1
  284. package/dist/src/production/circuit-breaker.d.ts +26 -6
  285. package/dist/src/production/circuit-breaker.d.ts.map +1 -1
  286. package/dist/src/production/circuit-breaker.js.map +1 -1
  287. package/dist/src/production/error-handler.d.ts +55 -30
  288. package/dist/src/production/error-handler.d.ts.map +1 -1
  289. package/dist/src/production/error-handler.js.map +1 -1
  290. package/dist/src/production/index.d.ts +3 -20
  291. package/dist/src/production/index.d.ts.map +1 -1
  292. package/dist/src/production/index.js +3 -15
  293. package/dist/src/production/index.js.map +1 -1
  294. package/dist/src/production/monitoring.d.ts +54 -34
  295. package/dist/src/production/monitoring.d.ts.map +1 -1
  296. package/dist/src/production/monitoring.js +12 -14
  297. package/dist/src/production/monitoring.js.map +1 -1
  298. package/dist/src/production/rate-limiter.d.ts +64 -19
  299. package/dist/src/production/rate-limiter.d.ts.map +1 -1
  300. package/dist/src/production/rate-limiter.js +5 -5
  301. package/dist/src/production/rate-limiter.js.map +1 -1
  302. package/dist/src/production/retry.d.ts.map +1 -1
  303. package/dist/src/production/retry.js +4 -2
  304. package/dist/src/production/retry.js.map +1 -1
  305. package/dist/src/runtime/headless.d.ts +3 -3
  306. package/dist/src/services/claim-service.d.ts +50 -59
  307. package/dist/src/services/claim-service.d.ts.map +1 -1
  308. package/dist/src/services/claim-service.js +83 -50
  309. package/dist/src/services/claim-service.js.map +1 -1
  310. package/dist/src/services/config-file-manager.d.ts.map +1 -1
  311. package/dist/src/services/config-file-manager.js +8 -1
  312. package/dist/src/services/config-file-manager.js.map +1 -1
  313. package/dist/src/services/worker-daemon.d.ts.map +1 -1
  314. package/dist/src/services/worker-daemon.js +4 -0
  315. package/dist/src/services/worker-daemon.js.map +1 -1
  316. package/dist/src/transfer/ipfs/upload.d.ts +1 -1
  317. package/dist/src/transfer/storage/gcs.d.ts +1 -1
  318. package/dist/src/types.d.ts +13 -0
  319. package/dist/src/types.d.ts.map +1 -1
  320. package/dist/src/types.js.map +1 -1
  321. package/dist/src/ui/collector.mjs +51 -11
  322. package/dist/src/ui/dashboard.html +313 -88
  323. package/dist/src/ui/server.mjs +163 -8
  324. package/dist/src/update/checker.d.ts +1 -1
  325. package/dist/src/update/index.d.ts +1 -1
  326. package/dist/tsconfig.tsbuildinfo +1 -1
  327. package/package.json +13 -13
  328. package/scripts/publish-registry.ts +0 -1
  329. package/.claude/commands/monomind/adr.md +0 -11
  330. package/.claude/commands/monomind/budget.md +0 -7
  331. package/.claude/commands/monomind/createtask.md +0 -277
  332. package/.claude/commands/monomind/do.md +0 -498
  333. package/.claude/commands/monomind/graph-status.md +0 -7
  334. package/.claude/commands/monomind/help.md +0 -118
  335. package/.claude/commands/monomind/idea.md +0 -273
  336. package/.claude/commands/monomind/improve.md +0 -352
  337. package/.claude/commands/monomind/loops.md +0 -7
  338. package/.claude/commands/monomind/memory.md +0 -230
  339. package/.claude/commands/monomind/repeat.md +0 -257
  340. package/.claude/commands/monomind/review.md +0 -317
  341. package/.claude/commands/monomind/specialagents.md +0 -125
  342. package/.claude/commands/monomind/swarm.md +0 -161
  343. package/.claude/commands/monomind/understand.md +0 -139
  344. package/.claude/commands/training/README.md +0 -39
  345. package/.claude/commands/training/neural-patterns.md +0 -73
  346. package/.claude/commands/training/neural-train.md +0 -79
  347. package/dist/src/commands/appliance-advanced.d.ts +0 -9
  348. package/dist/src/commands/appliance-advanced.d.ts.map +0 -1
  349. package/dist/src/commands/appliance-advanced.js +0 -238
  350. package/dist/src/commands/appliance-advanced.js.map +0 -1
  351. package/dist/src/commands/appliance.d.ts +0 -8
  352. package/dist/src/commands/appliance.d.ts.map +0 -1
  353. package/dist/src/commands/appliance.js +0 -406
  354. package/dist/src/commands/appliance.js.map +0 -1
  355. package/dist/src/commands/ruvector/backup.d.ts +0 -11
  356. package/dist/src/commands/ruvector/backup.d.ts.map +0 -1
  357. package/dist/src/commands/ruvector/backup.js.map +0 -1
  358. package/dist/src/commands/ruvector/benchmark.d.ts +0 -11
  359. package/dist/src/commands/ruvector/benchmark.d.ts.map +0 -1
  360. package/dist/src/commands/ruvector/benchmark.js.map +0 -1
  361. package/dist/src/commands/ruvector/import.d.ts +0 -18
  362. package/dist/src/commands/ruvector/import.d.ts.map +0 -1
  363. package/dist/src/commands/ruvector/import.js.map +0 -1
  364. package/dist/src/commands/ruvector/index.d.ts.map +0 -1
  365. package/dist/src/commands/ruvector/index.js.map +0 -1
  366. package/dist/src/commands/ruvector/init.d.ts +0 -11
  367. package/dist/src/commands/ruvector/init.d.ts.map +0 -1
  368. package/dist/src/commands/ruvector/init.js.map +0 -1
  369. package/dist/src/commands/ruvector/migrate.d.ts +0 -11
  370. package/dist/src/commands/ruvector/migrate.d.ts.map +0 -1
  371. package/dist/src/commands/ruvector/migrate.js.map +0 -1
  372. package/dist/src/commands/ruvector/optimize.d.ts.map +0 -1
  373. package/dist/src/commands/ruvector/optimize.js.map +0 -1
  374. package/dist/src/commands/ruvector/setup.d.ts +0 -18
  375. package/dist/src/commands/ruvector/setup.d.ts.map +0 -1
  376. package/dist/src/commands/ruvector/setup.js.map +0 -1
  377. package/dist/src/commands/ruvector/status.d.ts.map +0 -1
  378. package/dist/src/commands/ruvector/status.js.map +0 -1
  379. package/dist/src/ruvector/agent-wasm.d.ts +0 -182
  380. package/dist/src/ruvector/agent-wasm.d.ts.map +0 -1
  381. package/dist/src/ruvector/agent-wasm.js +0 -316
  382. package/dist/src/ruvector/agent-wasm.js.map +0 -1
  383. package/dist/src/ruvector/ast-analyzer.d.ts +0 -67
  384. package/dist/src/ruvector/ast-analyzer.d.ts.map +0 -1
  385. package/dist/src/ruvector/ast-analyzer.js +0 -277
  386. package/dist/src/ruvector/ast-analyzer.js.map +0 -1
  387. package/dist/src/ruvector/coverage-router.d.ts +0 -160
  388. package/dist/src/ruvector/coverage-router.d.ts.map +0 -1
  389. package/dist/src/ruvector/coverage-router.js +0 -539
  390. package/dist/src/ruvector/coverage-router.js.map +0 -1
  391. package/dist/src/ruvector/coverage-tools.d.ts +0 -33
  392. package/dist/src/ruvector/coverage-tools.d.ts.map +0 -1
  393. package/dist/src/ruvector/coverage-tools.js +0 -157
  394. package/dist/src/ruvector/coverage-tools.js.map +0 -1
  395. package/dist/src/ruvector/diff-classifier.d.ts.map +0 -1
  396. package/dist/src/ruvector/diff-classifier.js.map +0 -1
  397. package/dist/src/ruvector/enhanced-model-router.d.ts +0 -146
  398. package/dist/src/ruvector/enhanced-model-router.d.ts.map +0 -1
  399. package/dist/src/ruvector/enhanced-model-router.js +0 -551
  400. package/dist/src/ruvector/enhanced-model-router.js.map +0 -1
  401. package/dist/src/ruvector/flash-attention.d.ts +0 -195
  402. package/dist/src/ruvector/flash-attention.d.ts.map +0 -1
  403. package/dist/src/ruvector/flash-attention.js +0 -643
  404. package/dist/src/ruvector/flash-attention.js.map +0 -1
  405. package/dist/src/ruvector/graph-analyzer.d.ts +0 -187
  406. package/dist/src/ruvector/graph-analyzer.d.ts.map +0 -1
  407. package/dist/src/ruvector/graph-analyzer.js +0 -929
  408. package/dist/src/ruvector/graph-analyzer.js.map +0 -1
  409. package/dist/src/ruvector/index.d.ts +0 -56
  410. package/dist/src/ruvector/index.d.ts.map +0 -1
  411. package/dist/src/ruvector/index.js +0 -58
  412. package/dist/src/ruvector/index.js.map +0 -1
  413. package/dist/src/ruvector/lora-adapter.d.ts +0 -218
  414. package/dist/src/ruvector/lora-adapter.d.ts.map +0 -1
  415. package/dist/src/ruvector/lora-adapter.js +0 -455
  416. package/dist/src/ruvector/lora-adapter.js.map +0 -1
  417. package/dist/src/ruvector/model-router.d.ts +0 -222
  418. package/dist/src/ruvector/model-router.d.ts.map +0 -1
  419. package/dist/src/ruvector/model-router.js +0 -512
  420. package/dist/src/ruvector/model-router.js.map +0 -1
  421. package/dist/src/ruvector/moe-router.d.ts +0 -213
  422. package/dist/src/ruvector/moe-router.d.ts.map +0 -1
  423. package/dist/src/ruvector/moe-router.js +0 -649
  424. package/dist/src/ruvector/moe-router.js.map +0 -1
  425. package/dist/src/ruvector/q-learning-router.d.ts +0 -217
  426. package/dist/src/ruvector/q-learning-router.d.ts.map +0 -1
  427. package/dist/src/ruvector/q-learning-router.js +0 -712
  428. package/dist/src/ruvector/q-learning-router.js.map +0 -1
  429. package/dist/src/ruvector/ruvllm-wasm.d.ts +0 -179
  430. package/dist/src/ruvector/ruvllm-wasm.d.ts.map +0 -1
  431. package/dist/src/ruvector/ruvllm-wasm.js +0 -363
  432. package/dist/src/ruvector/ruvllm-wasm.js.map +0 -1
  433. package/dist/src/ruvector/semantic-router.d.ts +0 -77
  434. package/dist/src/ruvector/semantic-router.d.ts.map +0 -1
  435. package/dist/src/ruvector/semantic-router.js +0 -178
  436. package/dist/src/ruvector/semantic-router.js.map +0 -1
  437. package/dist/src/ruvector/vector-db.d.ts +0 -69
  438. package/dist/src/ruvector/vector-db.d.ts.map +0 -1
  439. package/dist/src/ruvector/vector-db.js +0 -243
  440. package/dist/src/ruvector/vector-db.js.map +0 -1
  441. package/dist/src/services/ruvector-training.d.ts +0 -222
  442. package/dist/src/services/ruvector-training.d.ts.map +0 -1
  443. package/dist/src/services/ruvector-training.js +0 -696
  444. package/dist/src/services/ruvector-training.js.map +0 -1
  445. package/dist/src/ui/.monomind/loops/loop-1779095996252-mdjpp.json +0 -11
  446. package/dist/src/ui/data/agent-avatars.html +0 -763
  447. package/dist/src/ui/data/agent-avatars.json +0 -966
  448. package/dist/src/ui/data/avatars/account-strategist.svg +0 -58
  449. package/dist/src/ui/data/avatars/accounts-payable.svg +0 -54
  450. package/dist/src/ui/data/avatars/adaptive-coordinator.svg +0 -55
  451. package/dist/src/ui/data/avatars/adaptive-coordinator2.svg +0 -54
  452. package/dist/src/ui/data/avatars/ai-citation.svg +0 -57
  453. package/dist/src/ui/data/avatars/ai-engineer.svg +0 -61
  454. package/dist/src/ui/data/avatars/analytics-reporter.svg +0 -53
  455. package/dist/src/ui/data/avatars/api-tester.svg +0 -53
  456. package/dist/src/ui/data/avatars/architecture.svg +0 -54
  457. package/dist/src/ui/data/avatars/automation-governance.svg +0 -55
  458. package/dist/src/ui/data/avatars/backend-dev.svg +0 -53
  459. package/dist/src/ui/data/avatars/benchmarker.svg +0 -54
  460. package/dist/src/ui/data/avatars/blockchain-auditor.svg +0 -53
  461. package/dist/src/ui/data/avatars/byzantine-coord.svg +0 -57
  462. package/dist/src/ui/data/avatars/case-analyst.svg +0 -57
  463. package/dist/src/ui/data/avatars/cicd-engineer.svg +0 -55
  464. package/dist/src/ui/data/avatars/cloud-architect.svg +0 -54
  465. package/dist/src/ui/data/avatars/code-review-swarm.svg +0 -57
  466. package/dist/src/ui/data/avatars/coder-v119.svg +0 -57
  467. package/dist/src/ui/data/avatars/coder.svg +0 -58
  468. package/dist/src/ui/data/avatars/collective-coord.svg +0 -54
  469. package/dist/src/ui/data/avatars/compliance-auditor.svg +0 -58
  470. package/dist/src/ui/data/avatars/consensus-coordinator.svg +0 -54
  471. package/dist/src/ui/data/avatars/content-creator.svg +0 -54
  472. package/dist/src/ui/data/avatars/crdt-synchronizer.svg +0 -53
  473. package/dist/src/ui/data/avatars/cro-specialist.svg +0 -58
  474. package/dist/src/ui/data/avatars/data-consolidator.svg +0 -54
  475. package/dist/src/ui/data/avatars/data-engineer.svg +0 -53
  476. package/dist/src/ui/data/avatars/database-optimizer.svg +0 -61
  477. package/dist/src/ui/data/avatars/deal-strategist.svg +0 -54
  478. package/dist/src/ui/data/avatars/defender.svg +0 -53
  479. package/dist/src/ui/data/avatars/devops-automator.svg +0 -56
  480. package/dist/src/ui/data/avatars/discovery-coach.svg +0 -54
  481. package/dist/src/ui/data/avatars/email-marketing.svg +0 -57
  482. package/dist/src/ui/data/avatars/embedded-firmware.svg +0 -61
  483. package/dist/src/ui/data/avatars/evidence-collector.svg +0 -57
  484. package/dist/src/ui/data/avatars/experiment-tracker.svg +0 -53
  485. package/dist/src/ui/data/avatars/feedback-synthesizer.svg +0 -54
  486. package/dist/src/ui/data/avatars/finance-tracker.svg +0 -54
  487. package/dist/src/ui/data/avatars/frontend-developer.svg +0 -54
  488. package/dist/src/ui/data/avatars/game-audio-engineer.svg +0 -59
  489. package/dist/src/ui/data/avatars/game-designer.svg +0 -54
  490. package/dist/src/ui/data/avatars/gossip-coordinator.svg +0 -54
  491. package/dist/src/ui/data/avatars/hierarchical-coord.svg +0 -54
  492. package/dist/src/ui/data/avatars/incident-commander.svg +0 -57
  493. package/dist/src/ui/data/avatars/infrastructure.svg +0 -54
  494. package/dist/src/ui/data/avatars/input-validator.svg +0 -53
  495. package/dist/src/ui/data/avatars/ios-developer.svg +0 -54
  496. package/dist/src/ui/data/avatars/issue-tracker.svg +0 -53
  497. package/dist/src/ui/data/avatars/judge.svg +0 -55
  498. package/dist/src/ui/data/avatars/launch-strategist.svg +0 -54
  499. package/dist/src/ui/data/avatars/legal-compliance.svg +0 -53
  500. package/dist/src/ui/data/avatars/level-designer.svg +0 -53
  501. package/dist/src/ui/data/avatars/load-balancer.svg +0 -57
  502. package/dist/src/ui/data/avatars/mcp-builder.svg +0 -53
  503. package/dist/src/ui/data/avatars/memory-coordinator.svg +0 -55
  504. package/dist/src/ui/data/avatars/mesh-coordinator.svg +0 -55
  505. package/dist/src/ui/data/avatars/ml-developer.svg +0 -58
  506. package/dist/src/ui/data/avatars/mobile-app-builder.svg +0 -53
  507. package/dist/src/ui/data/avatars/mobile-dev.svg +0 -54
  508. package/dist/src/ui/data/avatars/model-qa.svg +0 -58
  509. package/dist/src/ui/data/avatars/narrative-designer.svg +0 -58
  510. package/dist/src/ui/data/avatars/outbound-strategist.svg +0 -55
  511. package/dist/src/ui/data/avatars/path-validator.svg +0 -54
  512. package/dist/src/ui/data/avatars/payment-agent.svg +0 -53
  513. package/dist/src/ui/data/avatars/perf-analyzer.svg +0 -58
  514. package/dist/src/ui/data/avatars/pipeline-analyst.svg +0 -54
  515. package/dist/src/ui/data/avatars/planner.svg +0 -55
  516. package/dist/src/ui/data/avatars/pr-manager.svg +0 -54
  517. package/dist/src/ui/data/avatars/pricing-strategist.svg +0 -54
  518. package/dist/src/ui/data/avatars/product-manager.svg +0 -54
  519. package/dist/src/ui/data/avatars/production-validator.svg +0 -54
  520. package/dist/src/ui/data/avatars/project-shepherd.svg +0 -54
  521. package/dist/src/ui/data/avatars/proposal-strategist.svg +0 -54
  522. package/dist/src/ui/data/avatars/prosecutor.svg +0 -57
  523. package/dist/src/ui/data/avatars/pseudocode.svg +0 -53
  524. package/dist/src/ui/data/avatars/queen-coordinator.svg +0 -55
  525. package/dist/src/ui/data/avatars/quorum-manager.svg +0 -53
  526. package/dist/src/ui/data/avatars/raft-manager.svg +0 -53
  527. package/dist/src/ui/data/avatars/reality-checker.svg +0 -58
  528. package/dist/src/ui/data/avatars/recruitment.svg +0 -58
  529. package/dist/src/ui/data/avatars/refinement.svg +0 -53
  530. package/dist/src/ui/data/avatars/release-manager.svg +0 -54
  531. package/dist/src/ui/data/avatars/repo-architect.svg +0 -54
  532. package/dist/src/ui/data/avatars/researcher.svg +0 -58
  533. package/dist/src/ui/data/avatars/resource-allocator.svg +0 -53
  534. package/dist/src/ui/data/avatars/reviewer.svg +0 -53
  535. package/dist/src/ui/data/avatars/safe-executor.svg +0 -53
  536. package/dist/src/ui/data/avatars/sales-coach.svg +0 -53
  537. package/dist/src/ui/data/avatars/sales-engineer.svg +0 -58
  538. package/dist/src/ui/data/avatars/scout-explorer.svg +0 -58
  539. package/dist/src/ui/data/avatars/security-architect.svg +0 -54
  540. package/dist/src/ui/data/avatars/security-auditor.svg +0 -55
  541. package/dist/src/ui/data/avatars/senior-developer.svg +0 -58
  542. package/dist/src/ui/data/avatars/senior-pm.svg +0 -58
  543. package/dist/src/ui/data/avatars/seo-specialist.svg +0 -57
  544. package/dist/src/ui/data/avatars/social-media.svg +0 -54
  545. package/dist/src/ui/data/avatars/solidity-engineer.svg +0 -58
  546. package/dist/src/ui/data/avatars/sparc-coder.svg +0 -58
  547. package/dist/src/ui/data/avatars/sparc-coord.svg +0 -56
  548. package/dist/src/ui/data/avatars/specification.svg +0 -57
  549. package/dist/src/ui/data/avatars/sprint-prioritizer.svg +0 -53
  550. package/dist/src/ui/data/avatars/sre.svg +0 -54
  551. package/dist/src/ui/data/avatars/studio-operations.svg +0 -53
  552. package/dist/src/ui/data/avatars/studio-producer.svg +0 -55
  553. package/dist/src/ui/data/avatars/support-responder.svg +0 -56
  554. package/dist/src/ui/data/avatars/system-architect.svg +0 -54
  555. package/dist/src/ui/data/avatars/task-orchestrator.svg +0 -56
  556. package/dist/src/ui/data/avatars/technical-artist.svg +0 -53
  557. package/dist/src/ui/data/avatars/technical-writer.svg +0 -59
  558. package/dist/src/ui/data/avatars/tester.svg +0 -53
  559. package/dist/src/ui/data/avatars/threat-detection.svg +0 -61
  560. package/dist/src/ui/data/avatars/trend-researcher.svg +0 -54
  561. package/dist/src/ui/data/avatars/trial-director.svg +0 -55
  562. package/dist/src/ui/data/avatars/unity-architect.svg +0 -54
  563. package/dist/src/ui/data/avatars/visionos-engineer.svg +0 -57
  564. package/dist/src/ui/data/avatars/worker-specialist.svg +0 -55
  565. package/dist/src/ui/data/avatars/workflow-architect.svg +0 -57
  566. package/dist/src/ui/data/avatars/workflow-automation.svg +0 -54
  567. package/dist/src/ui/data/avatars/zk-steward.svg +0 -54
  568. package/dist/src/ui/data/known-projects.json +0 -1
  569. /package/dist/src/{ruvector → monovector}/diff-classifier.js +0 -0
@@ -280,7 +280,7 @@ html, body { height: 100%; background: var(--bg); color: var(--text-hi); font-fa
280
280
  .oi-chip.live { background: oklch(65% 0.15 150 / 0.12); color: var(--green); }
281
281
 
282
282
  /* detail pane */
283
- #org-detail-pane { flex: 1; display: flex; flex-direction: column; overflow: hidden; min-width: 0; }
283
+ #org-detail-pane { flex: 1; display: flex; flex-direction: column; overflow: hidden; min-width: 0; position: relative; }
284
284
  #org-detail-pane.empty-state { align-items: center; justify-content: center; }
285
285
  .orgs-no-sel { color: var(--text-lo); font-size: 13px; text-align: center; }
286
286
  .orgs-no-sel-ico { font-size: 28px; margin-bottom: 10px; opacity: 0.3; }
@@ -304,6 +304,61 @@ html, body { height: 100%; background: var(--bg); color: var(--text-hi); font-fa
304
304
  .odt-pane { display: none; }
305
305
  .odt-pane.active { display: block; }
306
306
 
307
+ /* agent detail drawer (slides in from right within the org detail pane) */
308
+ #org-agent-drawer {
309
+ position: absolute; top: 0; right: 0; height: 100%;
310
+ width: min(420px, 82%);
311
+ background: var(--surface); border-left: 1px solid var(--border);
312
+ box-shadow: -16px 0 44px -14px oklch(0% 0 0 / 0.5);
313
+ transform: translateX(101%);
314
+ transition: transform 0.32s cubic-bezier(0.16, 1, 0.3, 1);
315
+ display: flex; flex-direction: column; z-index: 40; min-width: 0;
316
+ }
317
+ #org-agent-drawer.open { transform: translateX(0); }
318
+ @media (prefers-reduced-motion: reduce) { #org-agent-drawer { transition: none; } }
319
+ #oad-head { display: flex; align-items: center; gap: 11px; padding: 16px 16px 14px; border-bottom: 1px solid var(--border); flex-shrink: 0; }
320
+ .oad-avatar { width: 46px; height: 46px; border-radius: 50%; flex-shrink: 0; background: var(--surface-hi); object-fit: cover; }
321
+ .oad-id { flex: 1; min-width: 0; }
322
+ .oad-name { font-size: 15px; font-weight: 600; color: var(--text-hi); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
323
+ .oad-pills { display: flex; gap: 5px; margin-top: 5px; flex-wrap: wrap; }
324
+ .oad-pill { font-size: 10px; padding: 2px 7px; border-radius: 7px; background: var(--surface-hi); color: var(--text-lo); }
325
+ .oad-pill.model { color: var(--accent); background: oklch(72% 0.18 75 / 0.1); }
326
+ .oad-close { background: none; border: none; color: var(--text-lo); font-size: 14px; cursor: pointer; padding: 4px 7px; border-radius: 6px; line-height: 1; flex-shrink: 0; }
327
+ .oad-close:hover { color: var(--text-hi); background: var(--surface-hi); }
328
+ #oad-body { flex: 1; overflow-y: auto; padding: 16px; }
329
+ #oad-body::-webkit-scrollbar { width: 3px; }
330
+ #oad-body::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; }
331
+ .oad-loading, .oad-empty { color: var(--text-lo); font-size: 12px; padding: 6px 0; line-height: 1.5; }
332
+ .oad-empty code, .oad-doc code { background: var(--surface-hi); padding: 1px 5px; border-radius: 4px; font-family: var(--mono); font-size: 0.92em; }
333
+ .oad-desc { font-size: 12.5px; color: var(--text-mid); line-height: 1.5; margin-bottom: 16px; }
334
+ .oad-sec { margin-bottom: 18px; }
335
+ .oad-sec-h { font-size: 10px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-lo); margin-bottom: 9px; display: flex; align-items: baseline; gap: 8px; }
336
+ .oad-file { text-transform: none; letter-spacing: 0; opacity: 0.55; font-size: 10px; font-family: var(--mono); }
337
+ .oad-chars { display: flex; flex-direction: column; gap: 7px; }
338
+ .oad-char { display: grid; grid-template-columns: 96px 1fr; gap: 10px; font-size: 12px; align-items: start; }
339
+ .oad-char-k { color: var(--text-lo); }
340
+ .oad-char-v { color: var(--text-hi); }
341
+ .oad-chips { display: flex; flex-wrap: wrap; gap: 6px; }
342
+ .oad-chip { font-size: 11px; padding: 3px 9px; border-radius: 9px; background: oklch(65% 0.12 240 / 0.13); color: oklch(74% 0.1 240); }
343
+ .oad-chip.alt { background: oklch(65% 0.15 150 / 0.11); color: oklch(72% 0.13 150); }
344
+ .oad-list { margin: 0; padding-left: 17px; }
345
+ .oad-list li { font-size: 12px; color: var(--text-mid); line-height: 1.5; margin-bottom: 3px; }
346
+ .oad-doc { font-size: 12.5px; color: var(--text-mid); line-height: 1.55; }
347
+ .oad-doc h1, .oad-doc h2, .oad-doc h3, .oad-doc h4, .oad-doc h5, .oad-doc h6 { color: var(--text-hi); margin: 15px 0 7px; line-height: 1.3; }
348
+ .oad-doc h1 { font-size: 15px; } .oad-doc h2 { font-size: 13.5px; } .oad-doc h3 { font-size: 12.5px; } .oad-doc h4 { font-size: 12px; }
349
+ .oad-doc p { margin: 0 0 9px; }
350
+ .oad-doc ul, .oad-doc ol { margin: 0 0 9px; padding-left: 18px; }
351
+ .oad-doc li { margin-bottom: 3px; }
352
+ .oad-doc strong { color: var(--text-hi); font-weight: 600; }
353
+ .oad-doc pre { background: var(--surface-hi); border: 1px solid var(--border); border-radius: 8px; padding: 10px 12px; overflow-x: auto; margin: 0 0 10px; }
354
+ .oad-doc pre code { background: none; padding: 0; font-size: 11.5px; color: var(--text-mid); }
355
+ /* clickable org chart nodes + role cards */
356
+ .v2oc-node { cursor: pointer; }
357
+ .v2oc-node.selected > circle { stroke-width: 3.4 !important; }
358
+ .role-v2 { cursor: pointer; transition: border-color 0.12s, transform 0.12s; }
359
+ .role-v2:hover { transform: translateY(-1px); }
360
+ .rv2-more { margin-top: 9px; font-size: 10.5px; color: var(--accent); opacity: 0.85; }
361
+
307
362
  /* org meta strip */
308
363
  .org-meta-strip { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 8px; margin-bottom: 16px; }
309
364
  .oms-cell { background: var(--surface); border: 1px solid var(--border); border-radius: var(--r); padding: 10px 12px; }
@@ -1690,34 +1745,12 @@ textarea.sess-note-input:focus { border-color:var(--accent); }
1690
1745
  </div>
1691
1746
  <div id="org-detail-tabs">
1692
1747
  <button class="odt-btn active" data-tab="chart" onclick="v2SwitchOrgTab('chart')">Chart</button>
1693
- <button class="odt-btn" data-tab="roles" onclick="v2SwitchOrgTab('roles')">Roles</button>
1694
1748
  <button class="odt-btn" data-tab="activity" onclick="v2SwitchOrgTab('activity')">Activity</button>
1695
1749
  <button class="odt-btn" data-tab="health" onclick="v2SwitchOrgTab('health')">Health</button>
1696
- <button class="odt-btn" data-tab="heartbeats" onclick="v2SwitchOrgTab('heartbeats')">Heartbeats</button>
1697
- <button class="odt-btn" data-tab="tasks" onclick="v2SwitchOrgTab('tasks')">Tasks</button>
1698
- <button class="odt-btn" data-tab="costs" onclick="v2SwitchOrgTab('costs')">Costs</button>
1699
- <button class="odt-btn" data-tab="members" onclick="v2SwitchOrgTab('members')">Members</button>
1700
- <button class="odt-btn" data-tab="goals" onclick="v2SwitchOrgTab('goals')">Goals</button>
1701
- <button class="odt-btn" data-tab="board" onclick="v2SwitchOrgTab('board')">Board</button>
1702
- <button class="odt-btn" data-tab="live" onclick="v2SwitchOrgTab('live')">Live</button>
1703
1750
  <button class="odt-btn" data-tab="approvals" onclick="v2SwitchOrgTab('approvals')">Approvals</button>
1704
- <button class="odt-btn" data-tab="secrets" onclick="v2SwitchOrgTab('secrets')">Secrets</button>
1705
- <button class="odt-btn" data-tab="settings" onclick="v2SwitchOrgTab('settings')">Settings</button>
1706
- <button class="odt-btn" data-tab="routines" onclick="v2SwitchOrgTab('routines')">Routines</button>
1707
- <button class="odt-btn" data-tab="myissues" onclick="v2SwitchOrgTab('myissues')">My Issues</button>
1708
1751
  <button class="odt-btn" data-tab="budgets" onclick="v2SwitchOrgTab('budgets')">Budgets</button>
1709
- <button class="odt-btn" data-tab="plugins" onclick="v2SwitchOrgTab('plugins')">Plugins</button>
1710
1752
  <button class="odt-btn" data-tab="charts" onclick="v2SwitchOrgTab('charts')">Charts</button>
1711
- <button class="odt-btn" data-tab="projects" onclick="v2SwitchOrgTab('projects')">Projects</button>
1712
1753
  <button class="odt-btn" data-tab="skills" onclick="v2SwitchOrgTab('skills')">Skills</button>
1713
- <button class="odt-btn" data-tab="workspaces" onclick="v2SwitchOrgTab('workspaces')">Workspaces</button>
1714
- <button class="odt-btn" data-tab="invites" onclick="v2SwitchOrgTab('invites')">Invites</button>
1715
- <button class="odt-btn" data-tab="agents-full" onclick="v2SwitchOrgTab('agents-full')">Agents</button>
1716
- <button class="odt-btn" data-tab="environments" onclick="v2SwitchOrgTab('environments')">Environments</button>
1717
- <button class="odt-btn" data-tab="access" onclick="v2SwitchOrgTab('access')">Access</button>
1718
- <button class="odt-btn" data-tab="issues-full" onclick="v2SwitchOrgTab('issues-full')">Issues</button>
1719
- <button class="odt-btn" data-tab="join-requests" onclick="v2SwitchOrgTab('join-requests')">Join Queue</button>
1720
- <button class="odt-btn" data-tab="threads" onclick="v2SwitchOrgTab('threads')">Threads</button>
1721
1754
  </div>
1722
1755
  <div id="org-detail-body">
1723
1756
  <div class="odt-pane active" id="odt-chart"></div>
@@ -1751,6 +1784,11 @@ textarea.sess-note-input:focus { border-color:var(--accent); }
1751
1784
  <div class="odt-pane" id="odt-threads"></div>
1752
1785
  </div>
1753
1786
  </div>
1787
+ <!-- agent detail drawer (node-click / role-card-click) -->
1788
+ <div id="org-agent-drawer" aria-hidden="true">
1789
+ <div id="oad-head"></div>
1790
+ <div id="oad-body"></div>
1791
+ </div>
1754
1792
  </div>
1755
1793
  </div>
1756
1794
 
@@ -4544,6 +4582,7 @@ function v2RenderOrgList() {
4544
4582
 
4545
4583
  async function v2SelectOrg(name) {
4546
4584
  _v2SelOrg = name;
4585
+ if (typeof v2CloseAgent === 'function') v2CloseAgent();
4547
4586
  const requested = name;
4548
4587
  const requestedDir = DIR;
4549
4588
  document.querySelectorAll('.org-item').forEach(el => {
@@ -4586,6 +4625,7 @@ async function v2SelectOrg(name) {
4586
4625
  _v2OrgData._agents = Array.isArray(agentsR) ? agentsR : (agentsR?.agents || []);
4587
4626
  _v2OrgData._budgets = budgetsR;
4588
4627
  _v2OrgData._members = Array.isArray(membersR) ? membersR : (membersR?.members || []);
4628
+ _v2OrgData._joinRequests = (membersR && membersR.join_requests) || [];
4589
4629
  _v2OrgData._issues = Array.isArray(issuesR) ? issuesR : (issuesR?.issues || []);
4590
4630
  } catch (_) {
4591
4631
  if (_v2SelOrg !== requested || DIR !== requestedDir) return;
@@ -4865,8 +4905,8 @@ function v2RenderOrgChart() {
4865
4905
  const nameY = subType ? (R * 0.55 + 2).toFixed(0) : (R * 0.55 + 8).toFixed(0);
4866
4906
  const avR = Math.round(R * 0.52);
4867
4907
  const avatarSrc = v2RoleAvatar(role);
4868
- nodesHTML += `<g class="v2oc-node" transform="translate(${p.x.toFixed(1)},${p.y.toFixed(1)})">
4869
- <title>${esc(displayName)}${subType ? ` · ${esc(subType)}` : ''}</title>
4908
+ nodesHTML += `<g class="v2oc-node" data-role="${esc(role.id)}" onclick="v2OpenAgent('${String(role.id).replace(/['\\]/g,'\\$&')}')" transform="translate(${p.x.toFixed(1)},${p.y.toFixed(1)})">
4909
+ <title>${esc(displayName)}${subType ? ` · ${esc(subType)}` : ''} — click for details</title>
4870
4910
  ${outerRing}
4871
4911
  <circle r="${R}" fill="oklch(12% 0.008 55)" stroke="${color}" stroke-width="${leader ? 2.5 : 1.8}" filter="url(#v2glow)"/>
4872
4912
  <image href="${avatarSrc}" x="${-avR}" y="${-R + 2}" width="${avR * 2}" height="${avR * 2}" clip-path="url(#${nodeClipIds[i]})" preserveAspectRatio="xMidYMid meet" onerror="this.setAttribute('href','data/avatars/coder.svg')"/>
@@ -5007,7 +5047,7 @@ function v2RenderOrgRoles() {
5007
5047
  const displayName = r.name || r.title || r.id;
5008
5048
  const roleType = r.type || r.agent_type || '';
5009
5049
  const avatarSrc = v2RoleAvatar(r);
5010
- return `<div class="role-v2" style="border-top:2px solid ${color}">
5050
+ return `<div class="role-v2" style="border-top:2px solid ${color}" onclick="v2OpenAgent('${String(r.id).replace(/['\\]/g,'\\$&')}')" title="View agent characteristics, skills & instructions">
5011
5051
  <div class="rv2-head">
5012
5052
  <img class="rv2-avatar" src="${avatarSrc}" alt="${esc(displayName)}" loading="lazy" onerror="this.src='data/avatars/coder.svg'"/>
5013
5053
  <div class="rv2-info">
@@ -5018,10 +5058,127 @@ function v2RenderOrgRoles() {
5018
5058
  <div class="rv2-id">${esc(r.id)}</div>
5019
5059
  ${r.reports_to ? `<div class="rv2-reports">reports to <span>${esc(r.reports_to)}</span></div>` : ''}
5020
5060
  ${resps.length ? `<div class="rv2-resps">${resps.map(s=>`<div class="rv2-resp">${esc(s)}</div>`).join('')}</div>` : ''}
5061
+ <div class="rv2-more">View characteristics, skills &amp; instructions →</div>
5021
5062
  </div>`;
5022
5063
  }).join('')}</div>`;
5023
5064
  }
5024
5065
 
5066
+ // ── agent detail drawer ──────────────────────
5067
+ function v2HighlightAgentNode(roleId) {
5068
+ document.querySelectorAll('#v2oc-nodes .v2oc-node').forEach(n =>
5069
+ n.classList.toggle('selected', !!roleId && n.getAttribute('data-role') === roleId));
5070
+ }
5071
+ function v2CloseAgent() {
5072
+ const drawer = document.getElementById('org-agent-drawer');
5073
+ if (drawer) { drawer.classList.remove('open'); drawer.setAttribute('aria-hidden', 'true'); }
5074
+ v2HighlightAgentNode(null);
5075
+ }
5076
+ async function v2OpenAgent(roleId) {
5077
+ if (!_v2SelOrg || !roleId) return;
5078
+ const drawer = document.getElementById('org-agent-drawer');
5079
+ const bodyEl = document.getElementById('oad-body');
5080
+ const headEl = document.getElementById('oad-head');
5081
+ if (!drawer || !bodyEl || !headEl) return;
5082
+ drawer.classList.add('open'); drawer.setAttribute('aria-hidden', 'false');
5083
+ v2HighlightAgentNode(roleId);
5084
+ headEl.innerHTML = '<button class="oad-close" onclick="v2CloseAgent()" aria-label="Close">✕</button>';
5085
+ bodyEl.innerHTML = '<div class="oad-loading">Loading agent…</div>';
5086
+ try {
5087
+ const r = await fetch(`/api/org/${encodeURIComponent(_v2SelOrg)}/agent/${encodeURIComponent(roleId)}${DIR ? '?dir=' + encodeURIComponent(DIR) : ''}`);
5088
+ if (!r.ok) throw new Error('not found');
5089
+ v2RenderAgentDrawer(await r.json());
5090
+ } catch (_) {
5091
+ bodyEl.innerHTML = '<div class="oad-loading">Could not load agent detail.</div>';
5092
+ }
5093
+ }
5094
+ function v2RenderAgentDrawer(data) {
5095
+ const role = (data && data.role) || {};
5096
+ const def = (data && data.definition) || { found: false };
5097
+ const cap = def.capability || {};
5098
+ const headEl = document.getElementById('oad-head');
5099
+ const bodyEl = document.getElementById('oad-body');
5100
+ if (!headEl || !bodyEl) return;
5101
+ const name = role.name || role.title || role.id || 'Agent';
5102
+ const type = role.agent_type || role.type || '';
5103
+ const model = (role.adapter_config && role.adapter_config.model) || cap.model_preference || '';
5104
+ const avatar = v2RoleAvatar(role);
5105
+
5106
+ headEl.innerHTML = `
5107
+ <img class="oad-avatar" src="${avatar}" alt="${esc(name)}" onerror="this.src='data/avatars/coder.svg'"/>
5108
+ <div class="oad-id">
5109
+ <div class="oad-name">${esc(name)}</div>
5110
+ <div class="oad-pills">
5111
+ ${type ? `<span class="oad-pill">${esc(type)}</span>` : ''}
5112
+ ${model ? `<span class="oad-pill model">${esc(model)}</span>` : ''}
5113
+ </div>
5114
+ </div>
5115
+ <button class="oad-close" onclick="v2CloseAgent()" aria-label="Close">✕</button>`;
5116
+
5117
+ const chars = [];
5118
+ if (cap.goal) chars.push(['Goal', cap.goal]);
5119
+ if (role.reports_to) chars.push(['Reports to', role.reports_to]);
5120
+ if (model) chars.push(['Model', model]);
5121
+ if (role.adapter_config && role.adapter_config.max_tokens) chars.push(['Max tokens', String(role.adapter_config.max_tokens)]);
5122
+ if (cap.input_type) chars.push(['Input', cap.input_type]);
5123
+ if (cap.output_type) chars.push(['Output', cap.output_type]);
5124
+ if (cap.termination) chars.push(['Done when', cap.termination]);
5125
+ if (cap.version) chars.push(['Version', cap.version]);
5126
+
5127
+ const skills = [];
5128
+ (Array.isArray(role.skills) ? role.skills : []).forEach(s => { if (s && !skills.includes(s)) skills.push(s); });
5129
+ (Array.isArray(cap.expertise) ? cap.expertise : []).forEach(s => { if (s && !skills.includes(s)) skills.push(s); });
5130
+ const taskTypes = Array.isArray(cap.task_types) ? cap.task_types : [];
5131
+ const resps = Array.isArray(role.responsibilities) ? role.responsibilities : [];
5132
+
5133
+ let html = '';
5134
+ if (def.description) html += `<div class="oad-desc">${esc(def.description)}</div>`;
5135
+ if (chars.length) html += `<div class="oad-sec"><div class="oad-sec-h">Characteristics</div><div class="oad-chars">${chars.map(([k, v]) => `<div class="oad-char"><span class="oad-char-k">${esc(k)}</span><span class="oad-char-v">${esc(v)}</span></div>`).join('')}</div></div>`;
5136
+ if (skills.length) html += `<div class="oad-sec"><div class="oad-sec-h">Skills &amp; expertise</div><div class="oad-chips">${skills.map(s => `<span class="oad-chip">${esc(s)}</span>`).join('')}</div></div>`;
5137
+ if (resps.length) html += `<div class="oad-sec"><div class="oad-sec-h">Responsibilities</div><ul class="oad-list">${resps.map(s => `<li>${esc(s)}</li>`).join('')}</ul></div>`;
5138
+ if (taskTypes.length) html += `<div class="oad-sec"><div class="oad-sec-h">Task types</div><div class="oad-chips">${taskTypes.map(s => `<span class="oad-chip alt">${esc(s)}</span>`).join('')}</div></div>`;
5139
+ if (def.found && def.document) {
5140
+ html += `<div class="oad-sec"><div class="oad-sec-h">Instructions &amp; document${def.file ? ` <span class="oad-file">${esc(def.file)}</span>` : ''}</div><div class="oad-doc">${v2RenderMarkdown(def.document)}</div></div>`;
5141
+ } else {
5142
+ html += `<div class="oad-sec"><div class="oad-empty">No instruction document is defined for agent type <code>${esc(type || '?')}</code>. Showing org-configured details only.</div></div>`;
5143
+ }
5144
+ bodyEl.innerHTML = html;
5145
+ bodyEl.scrollTop = 0;
5146
+ }
5147
+ // Minimal, XSS-safe markdown → HTML (headings, lists, code, bold/italic, inline code).
5148
+ function v2RenderMarkdown(md) {
5149
+ if (!md) return '';
5150
+ const escHtml = (s) => String(s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
5151
+ const blocks = [];
5152
+ let src = String(md).replace(/```(\w*)\n([\s\S]*?)```/g, (_m, _lang, code) => {
5153
+ blocks.push('<pre><code>' + escHtml(code.replace(/\n$/, '')) + '</code></pre>');
5154
+ return ' B' + (blocks.length - 1) + ' ';
5155
+ });
5156
+ src = escHtml(src);
5157
+ src = src.replace(/^######\s+(.+)$/gm, '<h6>$1</h6>')
5158
+ .replace(/^#####\s+(.+)$/gm, '<h5>$1</h5>')
5159
+ .replace(/^####\s+(.+)$/gm, '<h4>$1</h4>')
5160
+ .replace(/^###\s+(.+)$/gm, '<h3>$1</h3>')
5161
+ .replace(/^##\s+(.+)$/gm, '<h2>$1</h2>')
5162
+ .replace(/^#\s+(.+)$/gm, '<h1>$1</h1>');
5163
+ src = src.replace(/`([^`]+)`/g, '<code>$1</code>');
5164
+ src = src.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>').replace(/(^|[^*])\*([^*\n]+)\*/g, '$1<em>$2</em>');
5165
+ let html = '', inUl = false, inOl = false;
5166
+ const closeLists = () => { if (inUl) { html += '</ul>'; inUl = false; } if (inOl) { html += '</ol>'; inOl = false; } };
5167
+ for (const ln of src.split('\n')) {
5168
+ const ul = ln.match(/^\s*[-*]\s+(.+)$/);
5169
+ const ol = ln.match(/^\s*\d+\.\s+(.+)$/);
5170
+ if (ul) { if (inOl) { html += '</ol>'; inOl = false; } if (!inUl) { html += '<ul>'; inUl = true; } html += '<li>' + ul[1] + '</li>'; continue; }
5171
+ if (ol) { if (inUl) { html += '</ul>'; inUl = false; } if (!inOl) { html += '<ol>'; inOl = true; } html += '<li>' + ol[1] + '</li>'; continue; }
5172
+ closeLists();
5173
+ if (/^<h[1-6]>/.test(ln) || /^ B\d+ $/.test(ln.trim())) { html += ln; continue; }
5174
+ if (ln.trim() === '') continue;
5175
+ html += '<p>' + ln + '</p>';
5176
+ }
5177
+ closeLists();
5178
+ html = html.replace(/<p>( B\d+ )<\/p>/g, '$1').replace(/ B(\d+) /g, (_m, i) => blocks[+i] || '');
5179
+ return html;
5180
+ }
5181
+
5025
5182
  // ── org activity ────────────────────────────
5026
5183
  function v2RenderOrgActivity() {
5027
5184
  if (!_v2SelOrg) return;
@@ -5070,13 +5227,22 @@ function v2RenderOrgHeartbeats() {
5070
5227
  if (!_v2SelOrg) return;
5071
5228
  const pane = document.getElementById('odt-heartbeats');
5072
5229
  if (!pane) return;
5073
- const hb = Array.isArray(_v2OrgData?.heartbeats) ? _v2OrgData.heartbeats : [];
5074
- if (!hb.length) { pane.innerHTML = '<div class="empty">No heartbeat data</div>'; return; }
5075
- pane.innerHTML = `<div class="m-group-title">Heartbeats</div>` +
5076
- hb.slice(0, 30).map(h => `<div style="display:flex;justify-content:space-between;padding:5px 0;border-bottom:1px solid var(--border);font-size:12px">
5077
- <span style="color:var(--text-hi);font-family:monospace">${esc(h.agent || '—')}</span>
5078
- <span style="color:var(--text-lo)">${relTime(h.ts)}</span>
5079
- <span class="ss-pill ${h.ok !== false ? 'on' : 'warn'}">${h.ok !== false ? 'OK' : 'WARN'}</span>
5230
+ // Derive from the agent roster each agent carries status + lastHeartbeat
5231
+ let hb = Array.isArray(_v2OrgData?.heartbeats) ? _v2OrgData.heartbeats : [];
5232
+ if (!hb.length && Array.isArray(_v2OrgData?._agents)) {
5233
+ hb = _v2OrgData._agents.map(a => ({
5234
+ agent: a.title || a.id || '—',
5235
+ ts: a.lastHeartbeat ?? a.last_heartbeat ?? a.ts ?? null,
5236
+ status: a.status || 'idle',
5237
+ }));
5238
+ }
5239
+ if (!hb.length) { pane.innerHTML = '<div class="empty">No agents to report</div>'; return; }
5240
+ const cls = (st) => (st === 'active' || st === 'running') ? 'on' : ((st === 'error' || st === 'failed') ? 'warn' : '');
5241
+ pane.innerHTML = `<div class="m-group-title">Agent Heartbeats</div>` +
5242
+ hb.slice(0, 50).map(h => `<div style="display:flex;justify-content:space-between;align-items:center;gap:10px;padding:6px 0;border-bottom:1px solid var(--border);font-size:12px">
5243
+ <span style="color:var(--text-hi);font-family:var(--mono);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">${esc(h.agent || '—')}</span>
5244
+ <span style="color:var(--text-lo);white-space:nowrap">${h.ts ? relTime(h.ts) : 'never'}</span>
5245
+ <span class="ss-pill ${cls(h.status)}">${esc(String(h.status || 'idle').toUpperCase())}</span>
5080
5246
  </div>`).join('');
5081
5247
  }
5082
5248
 
@@ -5085,13 +5251,24 @@ function v2RenderOrgTasks() {
5085
5251
  if (!_v2SelOrg) return;
5086
5252
  const pane = document.getElementById('odt-tasks');
5087
5253
  if (!pane) return;
5088
- const tasks = Array.isArray(_v2OrgData?.tasks) ? _v2OrgData.tasks : [];
5254
+ // Normalize: API returns {todo:[],doing:[],done:[]} (columns) or a flat array
5255
+ const raw = _v2OrgData?.tasks;
5256
+ let tasks = [];
5257
+ if (Array.isArray(raw)) tasks = raw.slice();
5258
+ else if (raw && typeof raw === 'object') {
5259
+ for (const [col, items] of Object.entries(raw)) {
5260
+ (Array.isArray(items) ? items : []).forEach(t => tasks.push({ ...t, status: t.status || col }));
5261
+ }
5262
+ }
5089
5263
  if (!tasks.length) { pane.innerHTML = '<div class="empty">No tasks</div>'; return; }
5090
- pane.innerHTML = `<div class="m-group-title">Tasks</div>` +
5091
- tasks.slice(0, 50).map(t => `<div style="display:flex;gap:10px;align-items:baseline;padding:5px 0;border-bottom:1px solid var(--border);font-size:12px">
5092
- <span class="ss-pill ${t.status === 'done' ? 'on' : t.status === 'running' ? 'warn' : ''}">${esc(t.status || '?')}</span>
5093
- <span style="flex:1;color:var(--text-hi);font-family:monospace;font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">${esc(t.description || t.id || '—')}</span>
5094
- <span style="color:var(--text-lo);white-space:nowrap">${relTime(t.ts || t.created_at)}</span>
5264
+ const rank = { running: 0, doing: 0, todo: 1, pending: 1, done: 2 };
5265
+ tasks.sort((a, b) => (rank[a.status] ?? 1) - (rank[b.status] ?? 1));
5266
+ const pill = (st) => st === 'done' ? 'on' : (st === 'running' || st === 'doing' ? 'warn' : '');
5267
+ pane.innerHTML = `<div class="m-group-title">Tasks (${tasks.length})</div>` +
5268
+ tasks.slice(0, 80).map(t => `<div style="display:flex;gap:10px;align-items:baseline;padding:5px 0;border-bottom:1px solid var(--border);font-size:12px">
5269
+ <span class="ss-pill ${pill(t.status)}">${esc(t.status || '?')}</span>
5270
+ <span style="flex:1;color:var(--text-hi);font-family:var(--mono);font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">${esc(t.description || t.title || t.id || '—')}</span>
5271
+ <span style="color:var(--text-lo);white-space:nowrap">${relTime(t.ts || t.created_at || t.updated_at)}</span>
5095
5272
  </div>`).join('');
5096
5273
  }
5097
5274
 
@@ -5100,14 +5277,38 @@ function v2RenderOrgCosts() {
5100
5277
  if (!_v2SelOrg) return;
5101
5278
  const pane = document.getElementById('odt-costs');
5102
5279
  if (!pane) return;
5103
- const costs = _v2OrgData?.costs;
5104
- if (!costs) { pane.innerHTML = '<div class="empty">No cost data</div>'; return; }
5105
- const rows = Array.isArray(costs) ? costs : Object.entries(costs).map(([k, v]) => ({ label: k, value: v }));
5106
- pane.innerHTML = `<div class="m-group-title">Cost Breakdown</div>` +
5107
- rows.slice(0, 20).map(r => `<div style="display:flex;justify-content:space-between;padding:5px 0;border-bottom:1px solid var(--border);font-size:12px">
5108
- <span style="color:var(--text-hi)">${esc(String(r.label ?? r.name ?? '—'))}</span>
5109
- <span style="color:var(--accent);font-family:monospace">$${Number(r.value ?? r.cost ?? 0).toFixed(4)}</span>
5110
- </div>`).join('');
5280
+ // Primary source: per-agent cost rollup from the org budgets endpoint (already loaded)
5281
+ const b = _v2OrgData?._budgets;
5282
+ let rows = (b && Array.isArray(b.agents)) ? b.agents.map(a => ({
5283
+ label: a.title || a.id || '—',
5284
+ cost: Number(a.total_cost_usd ?? a.cost ?? 0),
5285
+ tin: Number(a.tokens_in ?? a.tokensIn ?? 0),
5286
+ tout: Number(a.tokens_out ?? a.tokensOut ?? 0),
5287
+ })) : [];
5288
+ // Fallback to legacy _v2OrgData.costs if ever present
5289
+ if (!rows.length && _v2OrgData?.costs) {
5290
+ const c = _v2OrgData.costs;
5291
+ rows = Array.isArray(c)
5292
+ ? c.map(r => ({ label: r.label ?? r.name ?? '—', cost: Number(r.value ?? r.cost ?? 0), tin: 0, tout: 0 }))
5293
+ : Object.entries(c).map(([k, v]) => ({ label: k, cost: Number(v) || 0, tin: 0, tout: 0 }));
5294
+ }
5295
+ if (!rows.length) { pane.innerHTML = '<div class="empty">No cost data</div>'; return; }
5296
+ const cur = (b && b.currency) || 'USD';
5297
+ const period = (b && b.period) || '';
5298
+ const total = rows.reduce((s, r) => s + r.cost, 0);
5299
+ const totIn = rows.reduce((s, r) => s + r.tin, 0), totOut = rows.reduce((s, r) => s + r.tout, 0);
5300
+ rows.sort((a, c) => c.cost - a.cost);
5301
+ pane.innerHTML = `<div class="m-group-title">Cost Breakdown${period ? ` · ${esc(period)}` : ''}</div>
5302
+ <div style="display:flex;justify-content:space-between;align-items:baseline;padding:8px 0 10px;border-bottom:1px solid var(--border);margin-bottom:6px">
5303
+ <span style="color:var(--text-lo);font-size:11px">Total (${esc(cur)})</span>
5304
+ <span style="color:var(--accent);font-family:var(--mono);font-size:15px;font-weight:600">$${total.toFixed(4)}</span>
5305
+ </div>` +
5306
+ rows.map(r => `<div style="display:flex;justify-content:space-between;align-items:baseline;gap:10px;padding:6px 0;border-bottom:1px solid var(--border);font-size:12px">
5307
+ <span style="color:var(--text-hi);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">${esc(String(r.label))}</span>
5308
+ <span style="color:var(--text-lo);font-family:var(--mono);font-size:10px;white-space:nowrap">${(r.tin + r.tout).toLocaleString()} tok</span>
5309
+ <span style="color:var(--accent);font-family:var(--mono);white-space:nowrap">$${r.cost.toFixed(4)}</span>
5310
+ </div>`).join('') +
5311
+ `<div style="color:var(--text-lo);font-size:10px;margin-top:10px">${totIn.toLocaleString()} in · ${totOut.toLocaleString()} out · sourced from org budgets</div>`;
5111
5312
  }
5112
5313
 
5113
5314
  // ── org members tab ────────────────────────────────────────
@@ -5115,17 +5316,25 @@ function v2RenderOrgMembers() {
5115
5316
  if (!_v2SelOrg) return;
5116
5317
  const pane = document.getElementById('odt-members');
5117
5318
  if (!pane) return;
5319
+ // Prefer actual joined members from the members endpoint; fall back to defined roles
5320
+ const members = Array.isArray(_v2OrgData?._members) ? _v2OrgData._members : [];
5118
5321
  const roles = Array.isArray(_v2OrgData?.roles) ? _v2OrgData.roles : [];
5119
- if (!roles.length) { pane.innerHTML = '<div class="empty">No members</div>'; return; }
5120
- pane.innerHTML = `<div class="m-group-title">Members (${roles.length})</div>` +
5121
- roles.map(r => `<div style="display:flex;gap:10px;align-items:center;padding:6px 0;border-bottom:1px solid var(--border);font-size:12px">
5322
+ const list = members.length ? members : roles;
5323
+ const joinReqs = Array.isArray(_v2OrgData?._joinRequests) ? _v2OrgData._joinRequests : [];
5324
+ if (!list.length) { pane.innerHTML = '<div class="empty">No members</div>'; return; }
5325
+ const src = members.length ? 'joined members' : 'defined roles';
5326
+ const active = (r) => r.running || r.active || r.status === 'active';
5327
+ pane.innerHTML = `<div class="m-group-title">Members (${list.length}) · ${src}</div>` +
5328
+ list.map(r => `<div style="display:flex;gap:10px;align-items:center;padding:6px 0;border-bottom:1px solid var(--border);font-size:12px">
5122
5329
  <span style="width:28px;height:28px;border-radius:50%;background:var(--surface-hi);display:inline-flex;align-items:center;justify-content:center;font-size:14px;flex-shrink:0">◈</span>
5123
5330
  <div style="flex:1;min-width:0">
5124
- <div style="color:var(--text-hi);font-family:monospace;font-size:12px">${esc(r.id || r.name || '—')}</div>
5125
- <div style="color:var(--text-lo);font-size:10px">${esc(r.type || r.role || '')}</div>
5331
+ <div style="color:var(--text-hi);font-family:var(--mono);font-size:12px">${esc(r.name || r.id || r.user || '—')}</div>
5332
+ <div style="color:var(--text-lo);font-size:10px">${esc(r.title || r.type || r.role || '')}</div>
5126
5333
  </div>
5127
- <span class="ss-pill ${r.running || r.active ? 'on' : ''}">${r.running || r.active ? 'ACTIVE' : 'IDLE'}</span>
5128
- </div>`).join('');
5334
+ <span class="ss-pill ${active(r) ? 'on' : ''}">${active(r) ? 'ACTIVE' : 'IDLE'}</span>
5335
+ </div>`).join('') +
5336
+ (joinReqs.length ? `<div class="m-group-title" style="margin-top:14px">Join Requests (${joinReqs.length})</div>` +
5337
+ joinReqs.map(j => `<div style="display:flex;justify-content:space-between;padding:5px 0;border-bottom:1px solid var(--border);font-size:12px"><span style="color:var(--text-hi)">${esc(j.user || j.name || j.id || '—')}</span><span style="color:var(--text-lo)">${esc(j.status || 'pending')}</span></div>`).join('') : '');
5129
5338
  }
5130
5339
 
5131
5340
  // ── GOALS ──────────────────────────────────────────────────
@@ -5283,6 +5492,9 @@ function v2RenderOrgSettings() {
5283
5492
  const d = _v2OrgData;
5284
5493
  const topos = ['hierarchical', 'mesh', 'hierarchical-mesh', 'adaptive', 'centralized', 'hybrid'];
5285
5494
  const govs = ['auto', 'board', 'strict'];
5495
+ // governance may be a string or an object {policy,...}; budget lives under run_config
5496
+ const govVal = (d.governance && typeof d.governance === 'object') ? (d.governance.policy || '') : (d.governance || '');
5497
+ const budgetVal = d.run_config?.budget_tokens ?? d.budget_tokens ?? d.budgetTokens ?? '';
5286
5498
  el.innerHTML = `
5287
5499
  <div style="font-size:11px;color:var(--text-lo);margin-bottom:14px">Changes generate a CLI command — no direct writes from UI.</div>
5288
5500
  <div style="display:flex;flex-direction:column;gap:12px;max-width:380px">
@@ -5294,10 +5506,10 @@ function v2RenderOrgSettings() {
5294
5506
  </div>
5295
5507
  <div><div class="le-lbl">Governance</div>
5296
5508
  <select id="os-gov" class="filter-input" style="cursor:pointer">
5297
- ${govs.map(g => `<option ${d.governance === g ? 'selected' : ''}>${esc(g)}</option>`).join('')}
5509
+ ${govs.map(g => `<option ${govVal === g ? 'selected' : ''}>${esc(g)}</option>`).join('')}
5298
5510
  </select>
5299
5511
  </div>
5300
- <div><div class="le-lbl">Budget (tokens)</div><input id="os-budget" class="filter-input" type="number" value="${esc(String(d.budgetTokens || d.budget_tokens || ''))}"></div>
5512
+ <div><div class="le-lbl">Budget (tokens)</div><input id="os-budget" class="filter-input" type="number" value="${esc(String(budgetVal || ''))}"></div>
5301
5513
  <button class="btn" style="width:fit-content;color:var(--accent);border-color:var(--accent)" onclick="generateOrgSettingsCmd()">Generate CLI Command</button>
5302
5514
  <div id="os-cmd-out" style="display:none;font-family:var(--mono);font-size:11px;background:var(--bg);border:1px solid var(--border);border-radius:6px;padding:10px;word-break:break-all;cursor:pointer;color:var(--text-hi)" title="Click to copy" onclick="navigator.clipboard.writeText(this.textContent).then(()=>showToast('Copied','','ok'))"></div>
5303
5515
  </div>`;
@@ -5519,32 +5731,38 @@ async function v2RenderOrgProjects() {
5519
5731
  }
5520
5732
 
5521
5733
  // ── SKILLS ─────────────────────────────────────────────────
5522
- function v2RenderOrgSkills() {
5734
+ async function v2RenderOrgSkills() {
5523
5735
  const el = document.getElementById('odt-skills');
5524
5736
  if (!el || !_v2OrgData) return;
5525
5737
  const roles = Array.isArray(_v2OrgData.roles) ? _v2OrgData.roles : [];
5526
- if (!roles.length) { el.innerHTML = '<div class="empty">No roles with skills defined</div>'; return; }
5527
-
5528
- // Build role→skills matrix
5529
- const allSkills = [...new Set(roles.flatMap(r => Array.isArray(r.skills) ? r.skills : []))];
5530
- if (!allSkills.length) {
5531
- // Flat skill list per role
5532
- el.innerHTML = roles.map(r => `<div style="padding:8px 0;border-bottom:1px solid var(--border)">
5533
- <div style="font-size:13px;font-weight:600;color:var(--text-hi);margin-bottom:4px">${esc(r.id || r.name || '—')}</div>
5534
- <div style="font-size:12px;color:var(--text-lo)">${esc((r.description || r.goal || 'No skills listed'))}</div>
5535
- </div>`).join('');
5536
- return;
5537
- }
5538
- el.innerHTML = `<div style="overflow-x:auto"><table style="width:100%;border-collapse:collapse;font-size:11px">
5539
- <thead><tr style="color:var(--text-xs);text-align:left">
5540
- <th style="padding:5px 8px;min-width:100px">Role</th>
5541
- ${allSkills.slice(0,10).map(s => `<th style="padding:5px 4px;font-family:var(--mono);white-space:nowrap">${esc(s.slice(0,16))}</th>`).join('')}
5542
- </tr></thead>
5543
- <tbody>${roles.map(r => `<tr style="border-top:1px solid var(--border)">
5544
- <td style="padding:5px 8px;color:var(--text-hi);font-weight:500">${esc(r.id || r.name || '—')}</td>
5545
- ${allSkills.slice(0,10).map(s => `<td style="padding:5px 4px;text-align:center">${(r.skills||[]).includes(s)?'<span style="color:var(--green)">✓</span>':'<span style="color:var(--border)">·</span>'}</td>`).join('')}
5546
- </tr>`).join('')}</tbody>
5547
- </table></div>`;
5738
+ if (!roles.length) { el.innerHTML = '<div class="empty">No roles defined</div>'; return; }
5739
+ el.innerHTML = '<div class="empty">Loading skills…</div>';
5740
+ const org = _v2SelOrg, dirq = DIR ? '?dir=' + encodeURIComponent(DIR) : '';
5741
+ // Enrich each role with expertise + task types from its agent definition (same source as the detail drawer)
5742
+ const enriched = await Promise.all(roles.map(async r => {
5743
+ const expertise = Array.isArray(r.skills) ? r.skills.slice() : [];
5744
+ let taskTypes = [];
5745
+ try {
5746
+ const j = await fetch(`/api/org/${encodeURIComponent(org)}/agent/${encodeURIComponent(r.id)}${dirq}`).then(x => x.ok ? x.json() : null);
5747
+ const cap = j && j.definition && j.definition.capability;
5748
+ if (cap) {
5749
+ (cap.expertise || []).forEach(s => { if (s && !expertise.includes(s)) expertise.push(s); });
5750
+ taskTypes = cap.task_types || [];
5751
+ }
5752
+ } catch (_) {}
5753
+ return { name: r.name || r.title || r.id, type: r.type || r.agent_type || '', expertise, taskTypes };
5754
+ }));
5755
+ if (_v2SelOrg !== org) return; // org switched while fetching
5756
+ el.innerHTML = enriched.map(e => `<div style="padding:10px 0;border-bottom:1px solid var(--border)">
5757
+ <div style="display:flex;align-items:baseline;gap:8px;margin-bottom:6px">
5758
+ <span style="font-size:13px;font-weight:600;color:var(--text-hi)">${esc(e.name)}</span>
5759
+ ${e.type ? `<span style="font-size:10px;color:var(--text-lo)">${esc(e.type)}</span>` : ''}
5760
+ </div>
5761
+ ${e.expertise.length
5762
+ ? `<div style="display:flex;flex-wrap:wrap;gap:5px;${e.taskTypes.length ? 'margin-bottom:6px' : ''}">${e.expertise.map(s => `<span class="oad-chip">${esc(s)}</span>`).join('')}</div>`
5763
+ : '<div style="font-size:11px;color:var(--text-lo)">No skills listed</div>'}
5764
+ ${e.taskTypes.length ? `<div style="display:flex;flex-wrap:wrap;gap:5px">${e.taskTypes.map(s => `<span class="oad-chip alt">${esc(s)}</span>`).join('')}</div>` : ''}
5765
+ </div>`).join('');
5548
5766
  }
5549
5767
 
5550
5768
  // ── WORKSPACES ─────────────────────────────────────────────
@@ -8719,10 +8937,11 @@ async function loadMemoriesTab() {
8719
8937
  const detail = document.getElementById('mem-detail-pane');
8720
8938
  if (!_memFiles.length && detail) {
8721
8939
  detail.innerHTML = '<div style="color:var(--text-lo);font-size:12px;padding:16px 0;line-height:1.7">'
8722
- + '<div style="font-size:13px;color:var(--text-hi);margin-bottom:8px">No auto-memory files yet</div>'
8723
- + 'Auto-memory files are created automatically during Claude Code sessions<br>'
8724
- + 'at: <span style="font-family:var(--mono);font-size:11px;color:var(--accent)">' + esc(data.memDir || '') + '</span><br><br>'
8725
- + 'Use <span style="font-family:var(--mono);color:var(--accent)">/memory save</span> or complete tasks to populate.'
8940
+ + '<div style="font-size:13px;color:var(--text-hi);margin-bottom:8px">No memories yet</div>'
8941
+ + 'Memories are <strong>curated</strong> saved as Markdown files in:<br>'
8942
+ + '<span style="font-family:var(--mono);font-size:11px;color:var(--accent)">' + esc(data.memDir || '') + '</span><br><br>'
8943
+ + 'Ask Claude to remember something, or click <span style="font-family:var(--mono);color:var(--accent)">+ New Memory</span> below.<br>'
8944
+ + 'Entries recorded to the backend memory store also appear here automatically.'
8726
8945
  + '</div>';
8727
8946
  }
8728
8947
  _renderMemList();
@@ -8769,15 +8988,21 @@ function selectMem(filename) {
8769
8988
  .replace(/\*\*(.+?)\*\*/g, (_, g) => '<strong>' + esc(g) + '</strong>')
8770
8989
  .replace(/^#{1,3} (.+)/gm, (_, g) => '<div style="font-weight:600;color:var(--text-hi);margin:6px 0 2px">' + esc(g) + '</div>')
8771
8990
  .replace(/^- (.+)/gm, (_, g) => '<div style="padding-left:12px">• ' + esc(g) + '</div>');
8991
+ const srcBadge = f.source === 'backend'
8992
+ ? '<span class="mem-badge" style="background:var(--text-lo)22;color:var(--text-lo);margin-left:6px" title="Stored in the AgentDB backend store, not as a file">backend</span>'
8993
+ : '';
8994
+ const actions = (f.readonly || f.source === 'backend')
8995
+ ? '<div class="mem-actions"><span style="font-size:11px;color:var(--text-lo)">Read-only — stored in the backend memory store (not a file)</span></div>'
8996
+ : '<div class="mem-actions">' +
8997
+ '<button class="btn" onclick="openEditMemModal(' + JSON.stringify(filename) + ')">&#x270E; Edit</button>' +
8998
+ '<button class="btn" style="color:var(--red);border-color:var(--red)" onclick="deleteMem(' + JSON.stringify(filename) + ')">&#x2715; Delete</button>' +
8999
+ '</div>';
8772
9000
  detail.innerHTML =
8773
- '<span class="mem-badge" style="background:' + col + '22;color:' + col + '">' + esc(f.type || '?') + '</span>' +
9001
+ '<span class="mem-badge" style="background:' + col + '22;color:' + col + '">' + esc(f.type || '?') + '</span>' + srcBadge +
8774
9002
  '<div style="font-size:15px;font-weight:600;color:var(--text-hi);margin-bottom:4px">' + esc(f.name || filename.replace('.md','')) + '</div>' +
8775
9003
  (f.description ? '<div style="font-size:12px;color:var(--text-lo);margin-bottom:12px">' + esc(f.description) + '</div>' : '') +
8776
9004
  '<div class="mem-body-render">' + bodyHtml + '</div>' +
8777
- '<div class="mem-actions">' +
8778
- '<button class="btn" onclick="openEditMemModal(' + JSON.stringify(filename) + ')">&#x270E; Edit</button>' +
8779
- '<button class="btn" style="color:var(--red);border-color:var(--red)" onclick="deleteMem(' + JSON.stringify(filename) + ')">&#x2715; Delete</button>' +
8780
- '</div>';
9005
+ actions;
8781
9006
  }
8782
9007
 
8783
9008
  async function openEditMemModal(filename) {