@ashlr/hub 2.2.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 (477) hide show
  1. package/CHANGELOG.md +1158 -0
  2. package/LICENSE +21 -0
  3. package/README.md +833 -0
  4. package/bin/ashlr +8 -0
  5. package/dist/api/core.d.ts +28 -0
  6. package/dist/api/core.js +42 -0
  7. package/dist/api/core.js.map +1 -0
  8. package/dist/api/index.d.ts +9 -0
  9. package/dist/api/index.js +9 -0
  10. package/dist/api/index.js.map +1 -0
  11. package/dist/api/plugin.d.ts +12 -0
  12. package/dist/api/plugin.js +13 -0
  13. package/dist/api/plugin.js.map +1 -0
  14. package/dist/api/types.d.ts +9 -0
  15. package/dist/api/types.js +9 -0
  16. package/dist/api/types.js.map +1 -0
  17. package/dist/cli/args.d.ts +20 -0
  18. package/dist/cli/args.js +23 -0
  19. package/dist/cli/args.js.map +1 -0
  20. package/dist/cli/ask.d.ts +22 -0
  21. package/dist/cli/ask.js +240 -0
  22. package/dist/cli/ask.js.map +1 -0
  23. package/dist/cli/audit.d.ts +26 -0
  24. package/dist/cli/audit.js +199 -0
  25. package/dist/cli/audit.js.map +1 -0
  26. package/dist/cli/backlog.d.ts +26 -0
  27. package/dist/cli/backlog.js +322 -0
  28. package/dist/cli/backlog.js.map +1 -0
  29. package/dist/cli/completions.d.ts +18 -0
  30. package/dist/cli/completions.js +156 -0
  31. package/dist/cli/completions.js.map +1 -0
  32. package/dist/cli/daemon.d.ts +31 -0
  33. package/dist/cli/daemon.js +334 -0
  34. package/dist/cli/daemon.js.map +1 -0
  35. package/dist/cli/demo-sandbox.d.ts +78 -0
  36. package/dist/cli/demo-sandbox.js +227 -0
  37. package/dist/cli/demo-sandbox.js.map +1 -0
  38. package/dist/cli/demo.d.ts +76 -0
  39. package/dist/cli/demo.js +285 -0
  40. package/dist/cli/demo.js.map +1 -0
  41. package/dist/cli/digest.d.ts +46 -0
  42. package/dist/cli/digest.js +352 -0
  43. package/dist/cli/digest.js.map +1 -0
  44. package/dist/cli/doctor-init.d.ts +28 -0
  45. package/dist/cli/doctor-init.js +335 -0
  46. package/dist/cli/doctor-init.js.map +1 -0
  47. package/dist/cli/genome.d.ts +62 -0
  48. package/dist/cli/genome.js +1061 -0
  49. package/dist/cli/genome.js.map +1 -0
  50. package/dist/cli/gh.d.ts +27 -0
  51. package/dist/cli/gh.js +322 -0
  52. package/dist/cli/gh.js.map +1 -0
  53. package/dist/cli/goals.d.ts +55 -0
  54. package/dist/cli/goals.js +667 -0
  55. package/dist/cli/goals.js.map +1 -0
  56. package/dist/cli/health.d.ts +56 -0
  57. package/dist/cli/health.js +407 -0
  58. package/dist/cli/health.js.map +1 -0
  59. package/dist/cli/help.d.ts +51 -0
  60. package/dist/cli/help.js +436 -0
  61. package/dist/cli/help.js.map +1 -0
  62. package/dist/cli/inbox.d.ts +28 -0
  63. package/dist/cli/inbox.js +589 -0
  64. package/dist/cli/inbox.js.map +1 -0
  65. package/dist/cli/index.d.ts +41 -0
  66. package/dist/cli/index.js +1208 -0
  67. package/dist/cli/index.js.map +1 -0
  68. package/dist/cli/knowledge.d.ts +33 -0
  69. package/dist/cli/knowledge.js +575 -0
  70. package/dist/cli/knowledge.js.map +1 -0
  71. package/dist/cli/mcp.d.ts +26 -0
  72. package/dist/cli/mcp.js +487 -0
  73. package/dist/cli/mcp.js.map +1 -0
  74. package/dist/cli/models.d.ts +26 -0
  75. package/dist/cli/models.js +435 -0
  76. package/dist/cli/models.js.map +1 -0
  77. package/dist/cli/new.d.ts +32 -0
  78. package/dist/cli/new.js +565 -0
  79. package/dist/cli/new.js.map +1 -0
  80. package/dist/cli/notify.d.ts +20 -0
  81. package/dist/cli/notify.js +188 -0
  82. package/dist/cli/notify.js.map +1 -0
  83. package/dist/cli/onboard.d.ts +85 -0
  84. package/dist/cli/onboard.js +305 -0
  85. package/dist/cli/onboard.js.map +1 -0
  86. package/dist/cli/open.d.ts +38 -0
  87. package/dist/cli/open.js +86 -0
  88. package/dist/cli/open.js.map +1 -0
  89. package/dist/cli/orient.d.ts +14 -0
  90. package/dist/cli/orient.js +110 -0
  91. package/dist/cli/orient.js.map +1 -0
  92. package/dist/cli/picker.d.ts +21 -0
  93. package/dist/cli/picker.js +177 -0
  94. package/dist/cli/picker.js.map +1 -0
  95. package/dist/cli/plugins.d.ts +21 -0
  96. package/dist/cli/plugins.js +394 -0
  97. package/dist/cli/plugins.js.map +1 -0
  98. package/dist/cli/preflight.d.ts +29 -0
  99. package/dist/cli/preflight.js +131 -0
  100. package/dist/cli/preflight.js.map +1 -0
  101. package/dist/cli/pulse.d.ts +26 -0
  102. package/dist/cli/pulse.js +482 -0
  103. package/dist/cli/pulse.js.map +1 -0
  104. package/dist/cli/reflect.d.ts +42 -0
  105. package/dist/cli/reflect.js +381 -0
  106. package/dist/cli/reflect.js.map +1 -0
  107. package/dist/cli/run.d.ts +29 -0
  108. package/dist/cli/run.js +687 -0
  109. package/dist/cli/run.js.map +1 -0
  110. package/dist/cli/sandbox.d.ts +20 -0
  111. package/dist/cli/sandbox.js +345 -0
  112. package/dist/cli/sandbox.js.map +1 -0
  113. package/dist/cli/seams.d.ts +41 -0
  114. package/dist/cli/seams.js +167 -0
  115. package/dist/cli/seams.js.map +1 -0
  116. package/dist/cli/serve.d.ts +25 -0
  117. package/dist/cli/serve.js +249 -0
  118. package/dist/cli/serve.js.map +1 -0
  119. package/dist/cli/ship.d.ts +33 -0
  120. package/dist/cli/ship.js +433 -0
  121. package/dist/cli/ship.js.map +1 -0
  122. package/dist/cli/spec.d.ts +19 -0
  123. package/dist/cli/spec.js +478 -0
  124. package/dist/cli/spec.js.map +1 -0
  125. package/dist/cli/swarm.d.ts +42 -0
  126. package/dist/cli/swarm.js +1365 -0
  127. package/dist/cli/swarm.js.map +1 -0
  128. package/dist/cli/telemetry.d.ts +26 -0
  129. package/dist/cli/telemetry.js +364 -0
  130. package/dist/cli/telemetry.js.map +1 -0
  131. package/dist/cli/tui.d.ts +17 -0
  132. package/dist/cli/tui.js +52 -0
  133. package/dist/cli/tui.js.map +1 -0
  134. package/dist/cli/ui.d.ts +53 -0
  135. package/dist/cli/ui.js +66 -0
  136. package/dist/cli/ui.js.map +1 -0
  137. package/dist/cli/update.d.ts +38 -0
  138. package/dist/cli/update.js +682 -0
  139. package/dist/cli/update.js.map +1 -0
  140. package/dist/cli/vercel.d.ts +20 -0
  141. package/dist/cli/vercel.js +193 -0
  142. package/dist/cli/vercel.js.map +1 -0
  143. package/dist/cli/verify-safety.d.ts +96 -0
  144. package/dist/cli/verify-safety.js +509 -0
  145. package/dist/cli/verify-safety.js.map +1 -0
  146. package/dist/cli/wire.d.ts +22 -0
  147. package/dist/cli/wire.js +205 -0
  148. package/dist/cli/wire.js.map +1 -0
  149. package/dist/core/classify.d.ts +51 -0
  150. package/dist/core/classify.js +450 -0
  151. package/dist/core/classify.js.map +1 -0
  152. package/dist/core/config.d.ts +63 -0
  153. package/dist/core/config.js +474 -0
  154. package/dist/core/config.js.map +1 -0
  155. package/dist/core/daemon/loop.d.ts +74 -0
  156. package/dist/core/daemon/loop.js +618 -0
  157. package/dist/core/daemon/loop.js.map +1 -0
  158. package/dist/core/daemon/state.d.ts +66 -0
  159. package/dist/core/daemon/state.js +197 -0
  160. package/dist/core/daemon/state.js.map +1 -0
  161. package/dist/core/dashboard.d.ts +40 -0
  162. package/dist/core/dashboard.js +463 -0
  163. package/dist/core/dashboard.js.map +1 -0
  164. package/dist/core/digest/build.d.ts +51 -0
  165. package/dist/core/digest/build.js +230 -0
  166. package/dist/core/digest/build.js.map +1 -0
  167. package/dist/core/digest/deliver.d.ts +47 -0
  168. package/dist/core/digest/deliver.js +230 -0
  169. package/dist/core/digest/deliver.js.map +1 -0
  170. package/dist/core/digest/store.d.ts +57 -0
  171. package/dist/core/digest/store.js +223 -0
  172. package/dist/core/digest/store.js.map +1 -0
  173. package/dist/core/doctor-fix.d.ts +21 -0
  174. package/dist/core/doctor-fix.js +440 -0
  175. package/dist/core/doctor-fix.js.map +1 -0
  176. package/dist/core/doctor.d.ts +18 -0
  177. package/dist/core/doctor.js +806 -0
  178. package/dist/core/doctor.js.map +1 -0
  179. package/dist/core/env-bridge.d.ts +64 -0
  180. package/dist/core/env-bridge.js +103 -0
  181. package/dist/core/env-bridge.js.map +1 -0
  182. package/dist/core/genome/capture.d.ts +49 -0
  183. package/dist/core/genome/capture.js +352 -0
  184. package/dist/core/genome/capture.js.map +1 -0
  185. package/dist/core/genome/consolidate.d.ts +38 -0
  186. package/dist/core/genome/consolidate.js +426 -0
  187. package/dist/core/genome/consolidate.js.map +1 -0
  188. package/dist/core/genome/export.d.ts +29 -0
  189. package/dist/core/genome/export.js +102 -0
  190. package/dist/core/genome/export.js.map +1 -0
  191. package/dist/core/genome/playbook.d.ts +33 -0
  192. package/dist/core/genome/playbook.js +320 -0
  193. package/dist/core/genome/playbook.js.map +1 -0
  194. package/dist/core/genome/recall.d.ts +45 -0
  195. package/dist/core/genome/recall.js +293 -0
  196. package/dist/core/genome/recall.js.map +1 -0
  197. package/dist/core/genome/store.d.ts +62 -0
  198. package/dist/core/genome/store.js +711 -0
  199. package/dist/core/genome/store.js.map +1 -0
  200. package/dist/core/git.d.ts +34 -0
  201. package/dist/core/git.js +115 -0
  202. package/dist/core/git.js.map +1 -0
  203. package/dist/core/goals/advance.d.ts +82 -0
  204. package/dist/core/goals/advance.js +263 -0
  205. package/dist/core/goals/advance.js.map +1 -0
  206. package/dist/core/goals/planner.d.ts +58 -0
  207. package/dist/core/goals/planner.js +233 -0
  208. package/dist/core/goals/planner.js.map +1 -0
  209. package/dist/core/goals/store.d.ts +128 -0
  210. package/dist/core/goals/store.js +442 -0
  211. package/dist/core/goals/store.js.map +1 -0
  212. package/dist/core/inbox/apply.d.ts +36 -0
  213. package/dist/core/inbox/apply.js +407 -0
  214. package/dist/core/inbox/apply.js.map +1 -0
  215. package/dist/core/inbox/notify-proposal.d.ts +13 -0
  216. package/dist/core/inbox/notify-proposal.js +21 -0
  217. package/dist/core/inbox/notify-proposal.js.map +1 -0
  218. package/dist/core/inbox/store.d.ts +67 -0
  219. package/dist/core/inbox/store.js +258 -0
  220. package/dist/core/inbox/store.js.map +1 -0
  221. package/dist/core/index-engine.d.ts +62 -0
  222. package/dist/core/index-engine.js +486 -0
  223. package/dist/core/index-engine.js.map +1 -0
  224. package/dist/core/integrations/desktop-notify.d.ts +18 -0
  225. package/dist/core/integrations/desktop-notify.js +42 -0
  226. package/dist/core/integrations/desktop-notify.js.map +1 -0
  227. package/dist/core/integrations/editors.d.ts +50 -0
  228. package/dist/core/integrations/editors.js +216 -0
  229. package/dist/core/integrations/editors.js.map +1 -0
  230. package/dist/core/integrations/github.d.ts +66 -0
  231. package/dist/core/integrations/github.js +332 -0
  232. package/dist/core/integrations/github.js.map +1 -0
  233. package/dist/core/integrations/identity.d.ts +29 -0
  234. package/dist/core/integrations/identity.js +359 -0
  235. package/dist/core/integrations/identity.js.map +1 -0
  236. package/dist/core/integrations/notify.d.ts +23 -0
  237. package/dist/core/integrations/notify.js +96 -0
  238. package/dist/core/integrations/notify.js.map +1 -0
  239. package/dist/core/integrations/vercel.d.ts +37 -0
  240. package/dist/core/integrations/vercel.js +192 -0
  241. package/dist/core/integrations/vercel.js.map +1 -0
  242. package/dist/core/knowledge/ask.d.ts +34 -0
  243. package/dist/core/knowledge/ask.js +325 -0
  244. package/dist/core/knowledge/ask.js.map +1 -0
  245. package/dist/core/knowledge/graph.d.ts +51 -0
  246. package/dist/core/knowledge/graph.js +564 -0
  247. package/dist/core/knowledge/graph.js.map +1 -0
  248. package/dist/core/knowledge/index.d.ts +74 -0
  249. package/dist/core/knowledge/index.js +586 -0
  250. package/dist/core/knowledge/index.js.map +1 -0
  251. package/dist/core/learn/playbooks.d.ts +84 -0
  252. package/dist/core/learn/playbooks.js +241 -0
  253. package/dist/core/learn/playbooks.js.map +1 -0
  254. package/dist/core/learn/reflect.d.ts +87 -0
  255. package/dist/core/learn/reflect.js +435 -0
  256. package/dist/core/learn/reflect.js.map +1 -0
  257. package/dist/core/learn/store.d.ts +51 -0
  258. package/dist/core/learn/store.js +165 -0
  259. package/dist/core/learn/store.js.map +1 -0
  260. package/dist/core/learn/tuning.d.ts +48 -0
  261. package/dist/core/learn/tuning.js +201 -0
  262. package/dist/core/learn/tuning.js.map +1 -0
  263. package/dist/core/lifecycle/scaffold.d.ts +43 -0
  264. package/dist/core/lifecycle/scaffold.js +260 -0
  265. package/dist/core/lifecycle/scaffold.js.map +1 -0
  266. package/dist/core/lifecycle/ship.d.ts +48 -0
  267. package/dist/core/lifecycle/ship.js +513 -0
  268. package/dist/core/lifecycle/ship.js.map +1 -0
  269. package/dist/core/lifecycle/templates.d.ts +20 -0
  270. package/dist/core/lifecycle/templates.js +605 -0
  271. package/dist/core/lifecycle/templates.js.map +1 -0
  272. package/dist/core/mcp-gateway.d.ts +59 -0
  273. package/dist/core/mcp-gateway.js +385 -0
  274. package/dist/core/mcp-gateway.js.map +1 -0
  275. package/dist/core/mcp-native.d.ts +53 -0
  276. package/dist/core/mcp-native.js +507 -0
  277. package/dist/core/mcp-native.js.map +1 -0
  278. package/dist/core/mcp-registry.d.ts +36 -0
  279. package/dist/core/mcp-registry.js +180 -0
  280. package/dist/core/mcp-registry.js.map +1 -0
  281. package/dist/core/observability/budget-alert.d.ts +18 -0
  282. package/dist/core/observability/budget-alert.js +90 -0
  283. package/dist/core/observability/budget-alert.js.map +1 -0
  284. package/dist/core/observability/estimate.d.ts +27 -0
  285. package/dist/core/observability/estimate.js +188 -0
  286. package/dist/core/observability/estimate.js.map +1 -0
  287. package/dist/core/observability/forecast.d.ts +19 -0
  288. package/dist/core/observability/forecast.js +101 -0
  289. package/dist/core/observability/forecast.js.map +1 -0
  290. package/dist/core/observability/governance.d.ts +28 -0
  291. package/dist/core/observability/governance.js +101 -0
  292. package/dist/core/observability/governance.js.map +1 -0
  293. package/dist/core/observability/otlp.d.ts +88 -0
  294. package/dist/core/observability/otlp.js +217 -0
  295. package/dist/core/observability/otlp.js.map +1 -0
  296. package/dist/core/observability/rollup.d.ts +35 -0
  297. package/dist/core/observability/rollup.js +311 -0
  298. package/dist/core/observability/rollup.js.map +1 -0
  299. package/dist/core/observability/telemetry-sink.d.ts +63 -0
  300. package/dist/core/observability/telemetry-sink.js +350 -0
  301. package/dist/core/observability/telemetry-sink.js.map +1 -0
  302. package/dist/core/observability/usage-source.d.ts +60 -0
  303. package/dist/core/observability/usage-source.js +347 -0
  304. package/dist/core/observability/usage-source.js.map +1 -0
  305. package/dist/core/onboard.d.ts +27 -0
  306. package/dist/core/onboard.js +288 -0
  307. package/dist/core/onboard.js.map +1 -0
  308. package/dist/core/orient.d.ts +23 -0
  309. package/dist/core/orient.js +135 -0
  310. package/dist/core/orient.js.map +1 -0
  311. package/dist/core/phantom.d.ts +23 -0
  312. package/dist/core/phantom.js +279 -0
  313. package/dist/core/phantom.js.map +1 -0
  314. package/dist/core/plugins/host-api.d.ts +29 -0
  315. package/dist/core/plugins/host-api.js +113 -0
  316. package/dist/core/plugins/host-api.js.map +1 -0
  317. package/dist/core/plugins/integrity.d.ts +36 -0
  318. package/dist/core/plugins/integrity.js +73 -0
  319. package/dist/core/plugins/integrity.js.map +1 -0
  320. package/dist/core/plugins/manifest.d.ts +31 -0
  321. package/dist/core/plugins/manifest.js +316 -0
  322. package/dist/core/plugins/manifest.js.map +1 -0
  323. package/dist/core/plugins/registry.d.ts +87 -0
  324. package/dist/core/plugins/registry.js +415 -0
  325. package/dist/core/plugins/registry.js.map +1 -0
  326. package/dist/core/plugins/types.d.ts +182 -0
  327. package/dist/core/plugins/types.js +40 -0
  328. package/dist/core/plugins/types.js.map +1 -0
  329. package/dist/core/plugins/wrappers.d.ts +40 -0
  330. package/dist/core/plugins/wrappers.js +229 -0
  331. package/dist/core/plugins/wrappers.js.map +1 -0
  332. package/dist/core/portfolio/backlog.d.ts +40 -0
  333. package/dist/core/portfolio/backlog.js +177 -0
  334. package/dist/core/portfolio/backlog.js.map +1 -0
  335. package/dist/core/portfolio/scanners.d.ts +21 -0
  336. package/dist/core/portfolio/scanners.js +600 -0
  337. package/dist/core/portfolio/scanners.js.map +1 -0
  338. package/dist/core/providers.d.ts +34 -0
  339. package/dist/core/providers.js +250 -0
  340. package/dist/core/providers.js.map +1 -0
  341. package/dist/core/quality/conventions.d.ts +35 -0
  342. package/dist/core/quality/conventions.js +267 -0
  343. package/dist/core/quality/conventions.js.map +1 -0
  344. package/dist/core/quality/fixes.d.ts +56 -0
  345. package/dist/core/quality/fixes.js +209 -0
  346. package/dist/core/quality/fixes.js.map +1 -0
  347. package/dist/core/quality/health.d.ts +69 -0
  348. package/dist/core/quality/health.js +350 -0
  349. package/dist/core/quality/health.js.map +1 -0
  350. package/dist/core/quality/store.d.ts +56 -0
  351. package/dist/core/quality/store.js +195 -0
  352. package/dist/core/quality/store.js.map +1 -0
  353. package/dist/core/readiness.d.ts +112 -0
  354. package/dist/core/readiness.js +431 -0
  355. package/dist/core/readiness.js.map +1 -0
  356. package/dist/core/run/agent-loop.d.ts +40 -0
  357. package/dist/core/run/agent-loop.js +291 -0
  358. package/dist/core/run/agent-loop.js.map +1 -0
  359. package/dist/core/run/budget.d.ts +47 -0
  360. package/dist/core/run/budget.js +113 -0
  361. package/dist/core/run/budget.js.map +1 -0
  362. package/dist/core/run/engines.d.ts +75 -0
  363. package/dist/core/run/engines.js +199 -0
  364. package/dist/core/run/engines.js.map +1 -0
  365. package/dist/core/run/model-manager.d.ts +64 -0
  366. package/dist/core/run/model-manager.js +339 -0
  367. package/dist/core/run/model-manager.js.map +1 -0
  368. package/dist/core/run/orchestrator.d.ts +100 -0
  369. package/dist/core/run/orchestrator.js +1515 -0
  370. package/dist/core/run/orchestrator.js.map +1 -0
  371. package/dist/core/run/provider-client.d.ts +46 -0
  372. package/dist/core/run/provider-client.js +796 -0
  373. package/dist/core/run/provider-client.js.map +1 -0
  374. package/dist/core/run/retry.d.ts +19 -0
  375. package/dist/core/run/retry.js +68 -0
  376. package/dist/core/run/retry.js.map +1 -0
  377. package/dist/core/run/router.d.ts +50 -0
  378. package/dist/core/run/router.js +257 -0
  379. package/dist/core/run/router.js.map +1 -0
  380. package/dist/core/run/self-heal.d.ts +52 -0
  381. package/dist/core/run/self-heal.js +181 -0
  382. package/dist/core/run/self-heal.js.map +1 -0
  383. package/dist/core/run/streaming.d.ts +31 -0
  384. package/dist/core/run/streaming.js +122 -0
  385. package/dist/core/run/streaming.js.map +1 -0
  386. package/dist/core/run/verify.d.ts +30 -0
  387. package/dist/core/run/verify.js +204 -0
  388. package/dist/core/run/verify.js.map +1 -0
  389. package/dist/core/sandbox/audit.d.ts +31 -0
  390. package/dist/core/sandbox/audit.js +169 -0
  391. package/dist/core/sandbox/audit.js.map +1 -0
  392. package/dist/core/sandbox/policy.d.ts +61 -0
  393. package/dist/core/sandbox/policy.js +211 -0
  394. package/dist/core/sandbox/policy.js.map +1 -0
  395. package/dist/core/sandbox/worktree.d.ts +175 -0
  396. package/dist/core/sandbox/worktree.js +673 -0
  397. package/dist/core/sandbox/worktree.js.map +1 -0
  398. package/dist/core/seams/backlog.d.ts +47 -0
  399. package/dist/core/seams/backlog.js +47 -0
  400. package/dist/core/seams/backlog.js.map +1 -0
  401. package/dist/core/seams/daemon-coordinator.d.ts +72 -0
  402. package/dist/core/seams/daemon-coordinator.js +76 -0
  403. package/dist/core/seams/daemon-coordinator.js.map +1 -0
  404. package/dist/core/seams/genome.d.ts +45 -0
  405. package/dist/core/seams/genome.js +53 -0
  406. package/dist/core/seams/genome.js.map +1 -0
  407. package/dist/core/seams/identity.d.ts +40 -0
  408. package/dist/core/seams/identity.js +44 -0
  409. package/dist/core/seams/identity.js.map +1 -0
  410. package/dist/core/seams/inbox.d.ts +60 -0
  411. package/dist/core/seams/inbox.js +66 -0
  412. package/dist/core/seams/inbox.js.map +1 -0
  413. package/dist/core/seams/index.d.ts +20 -0
  414. package/dist/core/seams/index.js +21 -0
  415. package/dist/core/seams/index.js.map +1 -0
  416. package/dist/core/seams/portfolio.d.ts +50 -0
  417. package/dist/core/seams/portfolio.js +61 -0
  418. package/dist/core/seams/portfolio.js.map +1 -0
  419. package/dist/core/seams/registry.d.ts +42 -0
  420. package/dist/core/seams/registry.js +128 -0
  421. package/dist/core/seams/registry.js.map +1 -0
  422. package/dist/core/seams/run-swarm.d.ts +66 -0
  423. package/dist/core/seams/run-swarm.js +74 -0
  424. package/dist/core/seams/run-swarm.js.map +1 -0
  425. package/dist/core/seams/types.d.ts +123 -0
  426. package/dist/core/seams/types.js +35 -0
  427. package/dist/core/seams/types.js.map +1 -0
  428. package/dist/core/spec/spec-store.d.ts +62 -0
  429. package/dist/core/spec/spec-store.js +359 -0
  430. package/dist/core/spec/spec-store.js.map +1 -0
  431. package/dist/core/swarm/gate.d.ts +45 -0
  432. package/dist/core/swarm/gate.js +114 -0
  433. package/dist/core/swarm/gate.js.map +1 -0
  434. package/dist/core/swarm/planner.d.ts +32 -0
  435. package/dist/core/swarm/planner.js +293 -0
  436. package/dist/core/swarm/planner.js.map +1 -0
  437. package/dist/core/swarm/rollback.d.ts +56 -0
  438. package/dist/core/swarm/rollback.js +266 -0
  439. package/dist/core/swarm/rollback.js.map +1 -0
  440. package/dist/core/swarm/runner.d.ts +62 -0
  441. package/dist/core/swarm/runner.js +1263 -0
  442. package/dist/core/swarm/runner.js.map +1 -0
  443. package/dist/core/swarm/sign.d.ts +71 -0
  444. package/dist/core/swarm/sign.js +362 -0
  445. package/dist/core/swarm/sign.js.map +1 -0
  446. package/dist/core/swarm/store.d.ts +52 -0
  447. package/dist/core/swarm/store.js +195 -0
  448. package/dist/core/swarm/store.js.map +1 -0
  449. package/dist/core/tidy.d.ts +32 -0
  450. package/dist/core/tidy.js +354 -0
  451. package/dist/core/tidy.js.map +1 -0
  452. package/dist/core/tools-registry.d.ts +16 -0
  453. package/dist/core/tools-registry.js +308 -0
  454. package/dist/core/tools-registry.js.map +1 -0
  455. package/dist/core/types.d.ts +2545 -0
  456. package/dist/core/types.js +9 -0
  457. package/dist/core/types.js.map +1 -0
  458. package/dist/core/web/api.d.ts +53 -0
  459. package/dist/core/web/api.js +698 -0
  460. package/dist/core/web/api.js.map +1 -0
  461. package/dist/core/web/public/app.js +1906 -0
  462. package/dist/core/web/public/index.html +721 -0
  463. package/dist/core/web/public/styles.css +2007 -0
  464. package/dist/core/web/server.d.ts +18 -0
  465. package/dist/core/web/server.js +122 -0
  466. package/dist/core/web/server.js.map +1 -0
  467. package/dist/core/web/static.d.ts +18 -0
  468. package/dist/core/web/static.js +122 -0
  469. package/dist/core/web/static.js.map +1 -0
  470. package/dist/tui/app.d.ts +33 -0
  471. package/dist/tui/app.js +350 -0
  472. package/dist/tui/app.js.map +1 -0
  473. package/dist/tui/render.d.ts +20 -0
  474. package/dist/tui/render.js +558 -0
  475. package/dist/tui/render.js.map +1 -0
  476. package/package.json +80 -0
  477. package/schema/config.schema.json +223 -0
@@ -0,0 +1,721 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <meta name="description" content="ashlr hub — local-first AI orchestration dashboard" />
7
+ <title>ashlr hub</title>
8
+
9
+ <!--
10
+ Critical path CSS — only the structural rules needed before styles.css
11
+ renders (avoids FOUC on the dark background). Everything else lives in
12
+ styles.css and app.js. NO external fonts, NO CDN — all local.
13
+ -->
14
+ <style>
15
+ /* ── Reset & base ─────────────────────────────────────────────────────── */
16
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
17
+
18
+ :root {
19
+ /* Brand palette — terminal-refined, dark-first */
20
+ --bg-base: #0d0f12;
21
+ --bg-surface: #13161b;
22
+ --bg-elevated: #1a1e26;
23
+ --bg-hover: #1f2430;
24
+
25
+ --border: #222834;
26
+ --border-focus: #3a4560;
27
+
28
+ --text-primary: #e2e8f5;
29
+ --text-secondary: #8892a8;
30
+ --text-muted: #4e5768;
31
+ --text-inverse: #0d0f12;
32
+
33
+ /* Accent — cyan-electric, echo of terminal cursor */
34
+ --accent: #00d4ff;
35
+ --accent-dim: #00a8cc;
36
+ --accent-glow: rgba(0, 212, 255, 0.12);
37
+
38
+ /* Status semantics */
39
+ --status-ok: #22d3a0;
40
+ --status-warn: #f5a623;
41
+ --status-fail: #f04e4e;
42
+ --status-pending: #6b7a99;
43
+ --status-running: #00d4ff;
44
+
45
+ /* Phase palette (swarm DAG nodes) */
46
+ --phase-scaffold: #7c6aff;
47
+ --phase-build: #00d4ff;
48
+ --phase-integrate: #f5a623;
49
+ --phase-verify: #22d3a0;
50
+ --phase-review: #f04e4e;
51
+
52
+ /* Typography — system mono stack, no external fonts */
53
+ --font-mono: 'JetBrains Mono', 'Cascadia Code', 'Fira Code',
54
+ ui-monospace, 'Cascadia Mono', 'Segoe UI Mono',
55
+ 'Ubuntu Mono', Menlo, Consolas, monospace;
56
+ --font-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui,
57
+ Helvetica, Arial, sans-serif;
58
+
59
+ /* Layout */
60
+ --nav-height: 52px;
61
+ --sidebar-w: 220px;
62
+ --radius-sm: 4px;
63
+ --radius-md: 8px;
64
+ --radius-lg: 12px;
65
+
66
+ /* Motion */
67
+ --transition: 140ms ease;
68
+ }
69
+
70
+ html, body {
71
+ height: 100%;
72
+ background: var(--bg-base);
73
+ color: var(--text-primary);
74
+ font-family: var(--font-sans);
75
+ font-size: 14px;
76
+ line-height: 1.5;
77
+ -webkit-font-smoothing: antialiased;
78
+ overflow: hidden; /* layout manages scrolling per-region */
79
+ }
80
+ </style>
81
+
82
+ <link rel="stylesheet" href="/styles.css" />
83
+ </head>
84
+
85
+ <body>
86
+
87
+ <!-- ── Skip navigation (accessibility) ─────────────────────────────────── -->
88
+ <a href="#main-content" class="skip-link">Skip to content</a>
89
+
90
+ <!-- ══════════════════════════════════════════════════════════════════════ -->
91
+ <!-- TOP NAV -->
92
+ <!-- ══════════════════════════════════════════════════════════════════════ -->
93
+ <header class="topnav" role="banner">
94
+ <div class="topnav__brand" aria-label="ashlr hub home">
95
+ <!-- Inline SVG wordmark / logo mark — no external asset -->
96
+ <svg class="topnav__logo" width="24" height="24" viewBox="0 0 24 24"
97
+ fill="none" xmlns="http://www.w3.org/2000/svg"
98
+ aria-hidden="true" focusable="false">
99
+ <!-- Hexagon outline (hub icon) -->
100
+ <polygon points="12,2 21.39,7 21.39,17 12,22 2.61,17 2.61,7"
101
+ stroke="currentColor" stroke-width="1.5"
102
+ fill="none" stroke-linejoin="round"/>
103
+ <!-- Inner pulse dot -->
104
+ <circle cx="12" cy="12" r="2.5" fill="currentColor"/>
105
+ <!-- Spoke lines -->
106
+ <line x1="12" y1="9.5" x2="12" y2="7" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/>
107
+ <line x1="12" y1="14.5" x2="12" y2="17" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/>
108
+ <line x1="9.8" y1="10.75" x2="7.5" y2="9.5" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/>
109
+ <line x1="14.2" y1="13.25" x2="16.5" y2="14.5" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/>
110
+ <line x1="9.8" y1="13.25" x2="7.5" y2="14.5" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/>
111
+ <line x1="14.2" y1="10.75" x2="16.5" y2="9.5" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/>
112
+ </svg>
113
+ <span class="topnav__wordmark">ashlr<span class="topnav__wordmark-hub">hub</span></span>
114
+ </div>
115
+
116
+ <!-- Primary tab navigation -->
117
+ <nav class="topnav__tabs" role="navigation" aria-label="Dashboard sections">
118
+ <button class="nav-tab nav-tab--active"
119
+ role="tab"
120
+ aria-selected="true"
121
+ aria-controls="panel-overview"
122
+ data-view="overview"
123
+ type="button">
124
+ <svg width="14" height="14" viewBox="0 0 16 16" fill="none" aria-hidden="true">
125
+ <rect x="1" y="1" width="6" height="6" rx="1.5" fill="currentColor" opacity=".9"/>
126
+ <rect x="9" y="1" width="6" height="6" rx="1.5" fill="currentColor" opacity=".6"/>
127
+ <rect x="1" y="9" width="6" height="6" rx="1.5" fill="currentColor" opacity=".6"/>
128
+ <rect x="9" y="9" width="6" height="6" rx="1.5" fill="currentColor" opacity=".3"/>
129
+ </svg>
130
+ Overview
131
+ </button>
132
+
133
+ <button class="nav-tab"
134
+ role="tab"
135
+ aria-selected="false"
136
+ aria-controls="panel-runs"
137
+ data-view="runs"
138
+ type="button">
139
+ <svg width="14" height="14" viewBox="0 0 16 16" fill="none" aria-hidden="true">
140
+ <circle cx="8" cy="8" r="6.5" stroke="currentColor" stroke-width="1.5"/>
141
+ <polyline points="5.5,8 7.5,10 10.5,6"
142
+ stroke="currentColor" stroke-width="1.5"
143
+ stroke-linecap="round" stroke-linejoin="round"/>
144
+ </svg>
145
+ Runs
146
+ </button>
147
+
148
+ <button class="nav-tab"
149
+ role="tab"
150
+ aria-selected="false"
151
+ aria-controls="panel-swarms"
152
+ data-view="swarms"
153
+ type="button">
154
+ <svg width="14" height="14" viewBox="0 0 16 16" fill="none" aria-hidden="true">
155
+ <circle cx="8" cy="3" r="2" fill="currentColor" opacity=".9"/>
156
+ <circle cx="3" cy="13" r="2" fill="currentColor" opacity=".7"/>
157
+ <circle cx="13" cy="13" r="2" fill="currentColor" opacity=".7"/>
158
+ <line x1="8" y1="5" x2="3" y2="11" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/>
159
+ <line x1="8" y1="5" x2="13" y2="11" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/>
160
+ <line x1="3" y1="13" x2="13" y2="13" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/>
161
+ </svg>
162
+ Swarms
163
+ </button>
164
+
165
+ <button class="nav-tab"
166
+ role="tab"
167
+ aria-selected="false"
168
+ aria-controls="panel-pulse"
169
+ data-view="pulse"
170
+ type="button">
171
+ <svg width="14" height="14" viewBox="0 0 16 16" fill="none" aria-hidden="true">
172
+ <polyline points="1,8 4,8 5.5,3 7,13 8.5,6 10,10 11.5,8 15,8"
173
+ stroke="currentColor" stroke-width="1.5"
174
+ stroke-linecap="round" stroke-linejoin="round"
175
+ fill="none"/>
176
+ </svg>
177
+ Pulse
178
+ </button>
179
+
180
+ <button class="nav-tab"
181
+ role="tab"
182
+ aria-selected="false"
183
+ aria-controls="panel-genome"
184
+ data-view="genome"
185
+ type="button">
186
+ <svg width="14" height="14" viewBox="0 0 16 16" fill="none" aria-hidden="true">
187
+ <!-- DNA helix suggestion -->
188
+ <path d="M5,1 Q8,4 5,7 Q8,10 5,13 Q8,16 5,15"
189
+ stroke="currentColor" stroke-width="1.4"
190
+ stroke-linecap="round" fill="none"/>
191
+ <path d="M11,1 Q8,4 11,7 Q8,10 11,13 Q8,16 11,15"
192
+ stroke="currentColor" stroke-width="1.4"
193
+ stroke-linecap="round" fill="none"/>
194
+ <line x1="6.5" y1="3.5" x2="9.5" y2="3.5" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/>
195
+ <line x1="6" y1="8" x2="10" y2="8" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/>
196
+ <line x1="6.5" y1="12.5" x2="9.5" y2="12.5" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/>
197
+ </svg>
198
+ Genome
199
+ </button>
200
+
201
+ undefined
202
+
203
+ <!-- Right side: live indicator + connection status -->
204
+ <div class="topnav__meta" aria-live="polite" aria-atomic="false">
205
+ <span class="live-badge" id="live-badge" aria-label="Live updates active">
206
+ <span class="live-badge__dot" aria-hidden="true"></span>
207
+ <span class="live-badge__label">live</span>
208
+ </span>
209
+ <span class="topnav__time" id="topnav-time" aria-label="Last updated"></span>
210
+ </div>
211
+ </header>
212
+
213
+ <!-- ══════════════════════════════════════════════════════════════════════ -->
214
+ <!-- MAIN LAYOUT -->
215
+ <!-- ══════════════════════════════════════════════════════════════════════ -->
216
+ <div class="layout" role="presentation">
217
+
218
+ <!-- ── MAIN CONTENT ─────────────────────────────────────────────────── -->
219
+ <main class="main-content" id="main-content" role="main">
220
+
221
+ <!-- ── PANEL: Overview ──────────────────────────────────────────── -->
222
+ <section class="panel panel--active"
223
+ id="panel-overview"
224
+ role="tabpanel"
225
+ aria-labelledby="tab-overview"
226
+ tabindex="0">
227
+
228
+ <div class="panel__header">
229
+ <h1 class="panel__title">Overview</h1>
230
+ <p class="panel__subtitle">Hub at a glance</p>
231
+ </div>
232
+
233
+ <!-- Stat cards row -->
234
+ <div class="stat-grid" role="list" aria-label="Hub statistics">
235
+
236
+ <article class="stat-card" role="listitem" aria-label="Repositories">
237
+ <header class="stat-card__header">
238
+ <svg class="stat-card__icon" width="16" height="16" viewBox="0 0 16 16"
239
+ fill="none" aria-hidden="true">
240
+ <rect x="1.5" y="1.5" width="13" height="13" rx="2"
241
+ stroke="currentColor" stroke-width="1.4"/>
242
+ <line x1="1.5" y1="5.5" x2="14.5" y2="5.5"
243
+ stroke="currentColor" stroke-width="1.2"/>
244
+ <circle cx="4.5" cy="3.5" r="0.8" fill="currentColor"/>
245
+ <circle cx="7" cy="3.5" r="0.8" fill="currentColor"/>
246
+ </svg>
247
+ <span class="stat-card__label">Repos</span>
248
+ </header>
249
+ <div class="stat-card__value" id="stat-repos-total"
250
+ aria-live="polite">—</div>
251
+ <div class="stat-card__sub">
252
+ <span class="stat-card__chip stat-card__chip--warn"
253
+ id="stat-repos-dirty" aria-label="dirty repos">— dirty</span>
254
+ <span class="stat-card__chip stat-card__chip--muted"
255
+ id="stat-repos-stale" aria-label="stale repos">— stale</span>
256
+ </div>
257
+ </article>
258
+
259
+ <article class="stat-card" role="listitem" aria-label="Activity">
260
+ <header class="stat-card__header">
261
+ <svg class="stat-card__icon" width="16" height="16" viewBox="0 0 16 16"
262
+ fill="none" aria-hidden="true">
263
+ <polyline points="1,10 4,10 5.5,5 7,13 8.5,7 10,10 12,10"
264
+ stroke="currentColor" stroke-width="1.4"
265
+ stroke-linecap="round" stroke-linejoin="round"/>
266
+ <line x1="12" y1="10" x2="15" y2="10"
267
+ stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/>
268
+ </svg>
269
+ <span class="stat-card__label">Activity <span class="stat-label-dim">7d</span></span>
270
+ </header>
271
+ <div class="stat-card__value" id="stat-activity-sessions"
272
+ aria-live="polite">—</div>
273
+ <div class="stat-card__sub">
274
+ <span class="stat-card__chip stat-card__chip--accent"
275
+ id="stat-activity-cost" aria-label="estimated cost">—</span>
276
+ <span class="stat-card__chip stat-card__chip--muted"
277
+ id="stat-activity-tokens" aria-label="tokens">— tok</span>
278
+ </div>
279
+ </article>
280
+
281
+ <article class="stat-card" role="listitem" aria-label="Tools">
282
+ <header class="stat-card__header">
283
+ <svg class="stat-card__icon" width="16" height="16" viewBox="0 0 16 16"
284
+ fill="none" aria-hidden="true">
285
+ <path d="M9,1.5 L14.5,7 L10,11.5 L4.5,6 L9,1.5Z"
286
+ stroke="currentColor" stroke-width="1.4"
287
+ stroke-linejoin="round" fill="none"/>
288
+ <line x1="4.5" y1="11.5" x2="1.5" y2="14.5"
289
+ stroke="currentColor" stroke-width="2"
290
+ stroke-linecap="round"/>
291
+ </svg>
292
+ <span class="stat-card__label">Tools</span>
293
+ </header>
294
+ <div class="stat-card__value" id="stat-tools"
295
+ aria-live="polite">—</div>
296
+ <div class="stat-card__sub">
297
+ <span class="stat-card__chip stat-card__chip--ok"
298
+ id="stat-tools-installed" aria-label="installed tools">— installed</span>
299
+ </div>
300
+ </article>
301
+
302
+ <article class="stat-card" role="listitem" aria-label="Genome">
303
+ <header class="stat-card__header">
304
+ <svg class="stat-card__icon" width="16" height="16" viewBox="0 0 16 16"
305
+ fill="none" aria-hidden="true">
306
+ <path d="M5,1 Q8,4 5,7 Q8,10 5,13"
307
+ stroke="currentColor" stroke-width="1.4"
308
+ stroke-linecap="round" fill="none"/>
309
+ <path d="M11,1 Q8,4 11,7 Q8,10 11,13"
310
+ stroke="currentColor" stroke-width="1.4"
311
+ stroke-linecap="round" fill="none"/>
312
+ <line x1="6.5" y1="3.5" x2="9.5" y2="3.5"
313
+ stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/>
314
+ <line x1="6" y1="7" x2="10" y2="7"
315
+ stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/>
316
+ <line x1="6.5" y1="10.5" x2="9.5" y2="10.5"
317
+ stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/>
318
+ </svg>
319
+ <span class="stat-card__label">Genome</span>
320
+ </header>
321
+ <div class="stat-card__value" id="stat-genome-entries"
322
+ aria-live="polite">—</div>
323
+ <div class="stat-card__sub">
324
+ <span class="stat-card__chip stat-card__chip--muted"
325
+ id="stat-genome-projects" aria-label="projects in genome">— projects</span>
326
+ </div>
327
+ </article>
328
+
329
+ </div><!-- /.stat-grid -->
330
+
331
+ <!-- Recent runs + swarms side-by-side -->
332
+ <div class="overview-grid">
333
+
334
+ <section class="card" aria-labelledby="ov-runs-heading">
335
+ <header class="card__header">
336
+ <h2 class="card__title" id="ov-runs-heading">Recent Runs</h2>
337
+ <button class="card__action" data-goto="runs" type="button"
338
+ aria-label="View all runs">All runs</button>
339
+ </header>
340
+ <div class="card__body">
341
+ <ul class="run-list" id="ov-runs-list" aria-live="polite" aria-label="Recent runs">
342
+ <li class="run-list__empty skeleton-line">Loading…</li>
343
+ </ul>
344
+ </div>
345
+ </section>
346
+
347
+ <section class="card" aria-labelledby="ov-swarms-heading">
348
+ <header class="card__header">
349
+ <h2 class="card__title" id="ov-swarms-heading">Active Swarms</h2>
350
+ <button class="card__action" data-goto="swarms" type="button"
351
+ aria-label="View all swarms">All swarms</button>
352
+ </header>
353
+ <div class="card__body">
354
+ <ul class="swarm-list" id="ov-swarms-list" aria-live="polite" aria-label="Recent swarms">
355
+ <li class="swarm-list__empty skeleton-line">Loading…</li>
356
+ </ul>
357
+ </div>
358
+ </section>
359
+
360
+ </div><!-- /.overview-grid -->
361
+
362
+ <!-- MCP servers strip -->
363
+ <section class="card card--full" aria-labelledby="ov-mcp-heading">
364
+ <header class="card__header">
365
+ <h2 class="card__title" id="ov-mcp-heading">MCP Servers</h2>
366
+ </header>
367
+ <div class="card__body">
368
+ <ul class="mcp-strip" id="ov-mcp-list" aria-live="polite" aria-label="MCP server health">
369
+ <li class="mcp-strip__empty skeleton-line">Loading…</li>
370
+ </ul>
371
+ </div>
372
+ </section>
373
+
374
+ </section><!-- /#panel-overview -->
375
+
376
+
377
+ <!-- ── PANEL: Runs ───────────────────────────────────────────────── -->
378
+ <section class="panel"
379
+ id="panel-runs"
380
+ role="tabpanel"
381
+ aria-labelledby="tab-runs"
382
+ tabindex="0"
383
+ hidden>
384
+
385
+ <div class="panel__header">
386
+ <h1 class="panel__title">Runs</h1>
387
+ <p class="panel__subtitle">Agent run history and status</p>
388
+ </div>
389
+
390
+ <div class="runs-layout">
391
+ <!-- Left: run list -->
392
+ <aside class="runs-sidebar" aria-label="Run list">
393
+ <ul class="run-index" id="runs-index" aria-live="polite">
394
+ <li class="run-index__empty skeleton-line">Loading…</li>
395
+ </ul>
396
+ </aside>
397
+
398
+ <!-- Right: run detail -->
399
+ <div class="runs-detail" id="runs-detail" aria-live="polite" aria-label="Run detail">
400
+ <div class="runs-detail__empty">
401
+ <svg width="48" height="48" viewBox="0 0 48 48" fill="none"
402
+ aria-hidden="true" focusable="false">
403
+ <circle cx="24" cy="24" r="20" stroke="currentColor"
404
+ stroke-width="2" opacity=".2"/>
405
+ <polyline points="16,24 22,30 32,18"
406
+ stroke="currentColor" stroke-width="2.5"
407
+ stroke-linecap="round" stroke-linejoin="round"
408
+ opacity=".3"/>
409
+ </svg>
410
+ <p>Select a run to view details</p>
411
+ </div>
412
+ </div>
413
+ </div>
414
+
415
+ </section><!-- /#panel-runs -->
416
+
417
+
418
+ <!-- ── PANEL: Swarms ─────────────────────────────────────────────── -->
419
+ <section class="panel"
420
+ id="panel-swarms"
421
+ role="tabpanel"
422
+ aria-labelledby="tab-swarms"
423
+ tabindex="0"
424
+ hidden>
425
+
426
+ <div class="panel__header">
427
+ <h1 class="panel__title">Swarms</h1>
428
+ <p class="panel__subtitle">Multi-phase agent fleet runs with live DAG</p>
429
+ </div>
430
+
431
+ <div class="swarms-layout">
432
+
433
+ <!-- Left: swarm index -->
434
+ <aside class="swarms-sidebar" aria-label="Swarm list">
435
+ <ul class="swarm-index" id="swarms-index" aria-live="polite">
436
+ <li class="swarm-index__empty skeleton-line">Loading…</li>
437
+ </ul>
438
+ </aside>
439
+
440
+ <!-- Right: swarm detail + DAG -->
441
+ <div class="swarms-detail" id="swarms-detail" aria-live="polite"
442
+ aria-label="Swarm detail and dependency graph">
443
+
444
+ <!-- Burndown progress bar area -->
445
+ <div class="swarm-burndown" id="swarm-burndown" hidden>
446
+ <div class="swarm-burndown__bar-wrap" role="progressbar"
447
+ aria-valuemin="0" aria-valuemax="100"
448
+ aria-valuenow="0" aria-label="Swarm task completion">
449
+ <div class="swarm-burndown__bar" id="swarm-burndown-bar"></div>
450
+ </div>
451
+ <div class="swarm-burndown__labels">
452
+ <span id="swarm-burndown-text">0 / 0 tasks</span>
453
+ <span class="swarm-burndown__phase" id="swarm-burndown-phase"></span>
454
+ </div>
455
+ </div>
456
+
457
+ <!-- DAG visualization — SVG rendered by app.js -->
458
+ <div class="dag-wrap" id="dag-wrap" aria-label="Task dependency graph">
459
+ <svg class="dag-svg" id="dag-svg"
460
+ role="img" aria-label="Swarm task dependency graph"
461
+ xmlns="http://www.w3.org/2000/svg">
462
+ <title>Swarm DAG</title>
463
+ <desc>Visual dependency graph for the selected swarm's tasks</desc>
464
+ <!-- app.js populates this dynamically -->
465
+ </svg>
466
+ <div class="dag-empty" id="dag-empty">
467
+ <svg width="48" height="48" viewBox="0 0 48 48" fill="none"
468
+ aria-hidden="true">
469
+ <circle cx="24" cy="10" r="5" stroke="currentColor"
470
+ stroke-width="2" opacity=".25"/>
471
+ <circle cx="12" cy="38" r="5" stroke="currentColor"
472
+ stroke-width="2" opacity=".25"/>
473
+ <circle cx="36" cy="38" r="5" stroke="currentColor"
474
+ stroke-width="2" opacity=".25"/>
475
+ <line x1="24" y1="15" x2="12" y2="33"
476
+ stroke="currentColor" stroke-width="1.5" opacity=".2"/>
477
+ <line x1="24" y1="15" x2="36" y2="33"
478
+ stroke="currentColor" stroke-width="1.5" opacity=".2"/>
479
+ </svg>
480
+ <p>Select a swarm to view its DAG</p>
481
+ </div>
482
+ </div>
483
+
484
+ <!-- Task list (below DAG) -->
485
+ <div class="swarm-tasks" id="swarm-tasks" aria-label="Swarm task list" hidden>
486
+ <h3 class="swarm-tasks__heading">Tasks</h3>
487
+ <ul class="task-list" id="swarm-task-list" aria-live="polite"></ul>
488
+ </div>
489
+
490
+ </div><!-- /.swarms-detail -->
491
+ </div><!-- /.swarms-layout -->
492
+
493
+ </section><!-- /#panel-swarms -->
494
+
495
+
496
+ <!-- ── PANEL: Pulse ──────────────────────────────────────────────── -->
497
+ <section class="panel"
498
+ id="panel-pulse"
499
+ role="tabpanel"
500
+ aria-labelledby="tab-pulse"
501
+ tabindex="0"
502
+ hidden>
503
+
504
+ <div class="panel__header panel__header--row">
505
+ <div>
506
+ <h1 class="panel__title">Pulse</h1>
507
+ <p class="panel__subtitle">Token usage and cost analytics</p>
508
+ </div>
509
+ <!-- Window picker -->
510
+ <fieldset class="window-picker" aria-label="Time window">
511
+ <legend class="sr-only">Time window</legend>
512
+ <label class="window-btn">
513
+ <input type="radio" name="pulse-window" value="1d" />
514
+ <span>1d</span>
515
+ </label>
516
+ <label class="window-btn window-btn--active">
517
+ <input type="radio" name="pulse-window" value="7d" checked />
518
+ <span>7d</span>
519
+ </label>
520
+ <label class="window-btn">
521
+ <input type="radio" name="pulse-window" value="30d" />
522
+ <span>30d</span>
523
+ </label>
524
+ </fieldset>
525
+ </div>
526
+
527
+ <!-- Totals row -->
528
+ <div class="pulse-totals" id="pulse-totals" aria-live="polite" aria-label="Pulse totals">
529
+ <div class="pulse-total">
530
+ <span class="pulse-total__label">Cost</span>
531
+ <span class="pulse-total__value" id="pulse-cost">—</span>
532
+ </div>
533
+ <div class="pulse-total">
534
+ <span class="pulse-total__label">Tokens in</span>
535
+ <span class="pulse-total__value" id="pulse-tokens-in">—</span>
536
+ </div>
537
+ <div class="pulse-total">
538
+ <span class="pulse-total__label">Tokens out</span>
539
+ <span class="pulse-total__value" id="pulse-tokens-out">—</span>
540
+ </div>
541
+ <div class="pulse-total">
542
+ <span class="pulse-total__label">Sessions</span>
543
+ <span class="pulse-total__value" id="pulse-sessions">—</span>
544
+ </div>
545
+ <div class="pulse-total">
546
+ <span class="pulse-total__label">Commits</span>
547
+ <span class="pulse-total__value" id="pulse-commits">—</span>
548
+ </div>
549
+ <!-- Budget alert -->
550
+ <div class="pulse-budget" id="pulse-budget" aria-live="polite"></div>
551
+ </div>
552
+
553
+ <div class="pulse-charts">
554
+
555
+ <!-- By-day bar chart (SVG, rendered by app.js) -->
556
+ <section class="chart-card" aria-labelledby="chart-daily-heading">
557
+ <header class="chart-card__header">
558
+ <h2 class="chart-card__title" id="chart-daily-heading">Daily cost</h2>
559
+ <span class="chart-card__unit" aria-label="Unit: USD">USD</span>
560
+ </header>
561
+ <div class="chart-card__body">
562
+ <svg class="bar-chart" id="chart-daily-svg"
563
+ role="img" aria-label="Daily cost bar chart"
564
+ xmlns="http://www.w3.org/2000/svg">
565
+ <title>Daily cost</title>
566
+ </svg>
567
+ </div>
568
+ </section>
569
+
570
+ <!-- By-project bar chart -->
571
+ <section class="chart-card" aria-labelledby="chart-project-heading">
572
+ <header class="chart-card__header">
573
+ <h2 class="chart-card__title" id="chart-project-heading">By project</h2>
574
+ <span class="chart-card__unit" aria-label="Unit: USD">USD</span>
575
+ </header>
576
+ <div class="chart-card__body">
577
+ <svg class="bar-chart" id="chart-project-svg"
578
+ role="img" aria-label="Project cost bar chart"
579
+ xmlns="http://www.w3.org/2000/svg">
580
+ <title>By project</title>
581
+ </svg>
582
+ </div>
583
+ </section>
584
+
585
+ <!-- By-model bar chart -->
586
+ <section class="chart-card" aria-labelledby="chart-model-heading">
587
+ <header class="chart-card__header">
588
+ <h2 class="chart-card__title" id="chart-model-heading">By model</h2>
589
+ <span class="chart-card__unit" aria-label="Unit: USD">USD</span>
590
+ </header>
591
+ <div class="chart-card__body">
592
+ <svg class="bar-chart" id="chart-model-svg"
593
+ role="img" aria-label="Model cost bar chart"
594
+ xmlns="http://www.w3.org/2000/svg">
595
+ <title>By model</title>
596
+ </svg>
597
+ </div>
598
+ </section>
599
+
600
+ </div><!-- /.pulse-charts -->
601
+
602
+ </section><!-- /#panel-pulse -->
603
+
604
+
605
+ <!-- ── PANEL: Genome ─────────────────────────────────────────────── -->
606
+ <section class="panel"
607
+ id="panel-genome"
608
+ role="tabpanel"
609
+ aria-labelledby="tab-genome"
610
+ tabindex="0"
611
+ hidden>
612
+
613
+ <div class="panel__header panel__header--row">
614
+ <div>
615
+ <h1 class="panel__title">Genome</h1>
616
+ <p class="panel__subtitle">Shared memory — cross-project knowledge base</p>
617
+ </div>
618
+ <!-- Live search -->
619
+ <div class="genome-search" role="search" aria-label="Search genome entries">
620
+ <label for="genome-search-input" class="sr-only">Search genome</label>
621
+ <svg class="genome-search__icon" width="14" height="14" viewBox="0 0 16 16"
622
+ fill="none" aria-hidden="true">
623
+ <circle cx="6.5" cy="6.5" r="5" stroke="currentColor" stroke-width="1.5"/>
624
+ <line x1="10.5" y1="10.5" x2="14.5" y2="14.5"
625
+ stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
626
+ </svg>
627
+ <input type="search"
628
+ id="genome-search-input"
629
+ class="genome-search__input"
630
+ placeholder="Search entries…"
631
+ autocomplete="off"
632
+ spellcheck="false"
633
+ aria-controls="genome-entries-list"
634
+ aria-label="Search genome entries" />
635
+ </div>
636
+ </div>
637
+
638
+ <!-- Genome entries list -->
639
+ <div class="genome-grid">
640
+ <ul class="genome-list" id="genome-entries-list"
641
+ aria-live="polite" aria-label="Genome entries">
642
+ <li class="genome-list__empty skeleton-line">Loading…</li>
643
+ </ul>
644
+ </div>
645
+
646
+ </section><!-- /#panel-genome -->
647
+
648
+ <!-- ── PANEL: Portfolio (M29) — READ-ONLY ────────────────── -->
649
+ <!-- INERT FALLBACK: app.js renderShell() replaces document.body with a
650
+ single dynamic <main id="main">, discarding this static panel. The
651
+ live portfolio view is rendered by app.js loadView('portfolio'); this
652
+ markup is an unused no-JS skeleton (as are all sibling #panel-*). -->
653
+ <section class="panel"
654
+ id="panel-portfolio" role="tabpanel"
655
+ aria-labelledby="tab-portfolio"
656
+ tabindex="0"
657
+ hidden>
658
+
659
+ <div class="panel__header">
660
+ <h1 class="panel__title">Portfolio</h1>
661
+ <p class="panel__subtitle">Org-level health, goals, and cost — read-only</p>
662
+ </div>
663
+
664
+ <!-- Portfolio cards are rendered by app.js renderPortfolio(); this is
665
+ the static skeleton fallback. NO mutation controls live here. -->
666
+ <div class="portfolio-grid" id="portfolio-grid" aria-live="polite">
667
+ <p class="hint">Loading…</p>
668
+ </div>
669
+
670
+ </section><!-- /#panel-portfolio -->
671
+
672
+
673
+ <!-- ── PANEL: Inbox (M32) — INERT no-JS skeleton ────────────────── -->
674
+ <!-- app.js renderInbox() replaces this at runtime -->
675
+ <section class="panel"
676
+ id="panel-inbox"
677
+ role="tabpanel"
678
+ aria-labelledby="tab-inbox"
679
+ tabindex="0"
680
+ hidden>
681
+ <div class="panel__header">
682
+ <h1 class="panel__title">Inbox</h1>
683
+ <p class="panel__subtitle">Pending proposals awaiting review</p>
684
+ </div>
685
+ <div class="portfolio-grid" id="inbox-grid" aria-live="polite">
686
+ <p class="hint">Loading…</p>
687
+ </div>
688
+ </section><!-- /#panel-inbox -->
689
+
690
+ <!-- ── PANEL: Daemon (M32) — INERT no-JS skeleton ───────────────── -->
691
+ <!-- app.js renderDaemon() replaces this at runtime -->
692
+ <section class="panel"
693
+ id="panel-daemon"
694
+ role="tabpanel"
695
+ aria-labelledby="tab-daemon"
696
+ tabindex="0"
697
+ hidden>
698
+ <div class="panel__header">
699
+ <h1 class="panel__title">Daemon</h1>
700
+ <p class="panel__subtitle">Background automation state</p>
701
+ </div>
702
+ <div id="daemon-grid" aria-live="polite">
703
+ <p class="hint">Loading…</p>
704
+ </div>
705
+ </section><!-- /#panel-daemon -->
706
+ </main><!-- /#main-content -->
707
+
708
+ </div><!-- /.layout -->
709
+
710
+ <!-- ── Toast / notification region ───────────────────────────────────── -->
711
+ <div class="toast-region" id="toast-region"
712
+ role="status" aria-live="polite" aria-atomic="true"
713
+ aria-label="Notifications"></div>
714
+
715
+ <!-- ══════════════════════════════════════════════════════════════════════ -->
716
+ <!-- APP SCRIPT — loaded last, deferred, fully local (no CDN) -->
717
+ <!-- ══════════════════════════════════════════════════════════════════════ -->
718
+ <script src="/app.js" defer></script>
719
+
720
+ </body>
721
+ </html>