@contraagent/ui 0.0.0-stage → 0.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 (731) hide show
  1. package/README.md +137 -2
  2. package/custom-elements.json +7286 -0
  3. package/dist/adapters/check-rows.d.ts +20 -0
  4. package/dist/adapters/check-rows.d.ts.map +1 -0
  5. package/dist/adapters/check-rows.js +77 -0
  6. package/dist/adapters/check-rows.js.map +1 -0
  7. package/dist/adapters/filters.d.ts +29 -0
  8. package/dist/adapters/filters.d.ts.map +1 -0
  9. package/dist/adapters/filters.js +74 -0
  10. package/dist/adapters/filters.js.map +1 -0
  11. package/dist/adapters/graph/compound.d.ts +93 -0
  12. package/dist/adapters/graph/compound.d.ts.map +1 -0
  13. package/dist/adapters/graph/compound.js +322 -0
  14. package/dist/adapters/graph/compound.js.map +1 -0
  15. package/dist/adapters/graph/flow-index.d.ts +54 -0
  16. package/dist/adapters/graph/flow-index.d.ts.map +1 -0
  17. package/dist/adapters/graph/flow-index.js +129 -0
  18. package/dist/adapters/graph/flow-index.js.map +1 -0
  19. package/dist/adapters/graph/highlight.d.ts +14 -0
  20. package/dist/adapters/graph/highlight.d.ts.map +1 -0
  21. package/dist/adapters/graph/highlight.js +33 -0
  22. package/dist/adapters/graph/highlight.js.map +1 -0
  23. package/dist/adapters/graph/input.d.ts +50 -0
  24. package/dist/adapters/graph/input.d.ts.map +1 -0
  25. package/dist/adapters/graph/input.js +201 -0
  26. package/dist/adapters/graph/input.js.map +1 -0
  27. package/dist/adapters/graph/layer.d.ts +33 -0
  28. package/dist/adapters/graph/layer.d.ts.map +1 -0
  29. package/dist/adapters/graph/layer.js +94 -0
  30. package/dist/adapters/graph/layer.js.map +1 -0
  31. package/dist/adapters/graph/matrix.d.ts +62 -0
  32. package/dist/adapters/graph/matrix.d.ts.map +1 -0
  33. package/dist/adapters/graph/matrix.js +96 -0
  34. package/dist/adapters/graph/matrix.js.map +1 -0
  35. package/dist/adapters/graph/project.d.ts +49 -0
  36. package/dist/adapters/graph/project.d.ts.map +1 -0
  37. package/dist/adapters/graph/project.js +319 -0
  38. package/dist/adapters/graph/project.js.map +1 -0
  39. package/dist/adapters/graph/selection.d.ts +31 -0
  40. package/dist/adapters/graph/selection.d.ts.map +1 -0
  41. package/dist/adapters/graph/selection.js +48 -0
  42. package/dist/adapters/graph/selection.js.map +1 -0
  43. package/dist/adapters/graph/states.d.ts +6 -0
  44. package/dist/adapters/graph/states.d.ts.map +1 -0
  45. package/dist/adapters/graph/states.js +5 -0
  46. package/dist/adapters/graph/states.js.map +1 -0
  47. package/dist/adapters/graph/types.d.ts +141 -0
  48. package/dist/adapters/graph/types.d.ts.map +1 -0
  49. package/dist/adapters/graph/types.js +3 -0
  50. package/dist/adapters/graph/types.js.map +1 -0
  51. package/dist/adapters/graph/words.d.ts +48 -0
  52. package/dist/adapters/graph/words.d.ts.map +1 -0
  53. package/dist/adapters/graph/words.js +128 -0
  54. package/dist/adapters/graph/words.js.map +1 -0
  55. package/dist/adapters/index.d.ts +18 -0
  56. package/dist/adapters/index.d.ts.map +1 -0
  57. package/dist/adapters/index.js +23 -0
  58. package/dist/adapters/index.js.map +1 -0
  59. package/dist/adapters/journal-columns.d.ts +21 -0
  60. package/dist/adapters/journal-columns.d.ts.map +1 -0
  61. package/dist/adapters/journal-columns.js +179 -0
  62. package/dist/adapters/journal-columns.js.map +1 -0
  63. package/dist/adapters/kpi-tiles.d.ts +47 -0
  64. package/dist/adapters/kpi-tiles.d.ts.map +1 -0
  65. package/dist/adapters/kpi-tiles.js +173 -0
  66. package/dist/adapters/kpi-tiles.js.map +1 -0
  67. package/dist/adapters/lanes.d.ts +31 -0
  68. package/dist/adapters/lanes.d.ts.map +1 -0
  69. package/dist/adapters/lanes.js +75 -0
  70. package/dist/adapters/lanes.js.map +1 -0
  71. package/dist/adapters/model-shares.d.ts +27 -0
  72. package/dist/adapters/model-shares.d.ts.map +1 -0
  73. package/dist/adapters/model-shares.js +52 -0
  74. package/dist/adapters/model-shares.js.map +1 -0
  75. package/dist/adapters/panel-body.d.ts +34 -0
  76. package/dist/adapters/panel-body.d.ts.map +1 -0
  77. package/dist/adapters/panel-body.js +90 -0
  78. package/dist/adapters/panel-body.js.map +1 -0
  79. package/dist/adapters/preflight.d.ts +12 -0
  80. package/dist/adapters/preflight.d.ts.map +1 -0
  81. package/dist/adapters/preflight.js +15 -0
  82. package/dist/adapters/preflight.js.map +1 -0
  83. package/dist/adapters/task-columns.d.ts +19 -0
  84. package/dist/adapters/task-columns.d.ts.map +1 -0
  85. package/dist/adapters/task-columns.js +107 -0
  86. package/dist/adapters/task-columns.js.map +1 -0
  87. package/dist/adapters/transcript/index.d.ts +6 -0
  88. package/dist/adapters/transcript/index.d.ts.map +1 -0
  89. package/dist/adapters/transcript/index.js +8 -0
  90. package/dist/adapters/transcript/index.js.map +1 -0
  91. package/dist/adapters/transcript/model.d.ts +42 -0
  92. package/dist/adapters/transcript/model.d.ts.map +1 -0
  93. package/dist/adapters/transcript/model.js +128 -0
  94. package/dist/adapters/transcript/model.js.map +1 -0
  95. package/dist/adapters/transcript/rounds.d.ts +15 -0
  96. package/dist/adapters/transcript/rounds.d.ts.map +1 -0
  97. package/dist/adapters/transcript/rounds.js +74 -0
  98. package/dist/adapters/transcript/rounds.js.map +1 -0
  99. package/dist/adapters/transcript/sections.d.ts +18 -0
  100. package/dist/adapters/transcript/sections.d.ts.map +1 -0
  101. package/dist/adapters/transcript/sections.js +69 -0
  102. package/dist/adapters/transcript/sections.js.map +1 -0
  103. package/dist/adapters/transcript/web.d.ts +12 -0
  104. package/dist/adapters/transcript/web.d.ts.map +1 -0
  105. package/dist/adapters/transcript/web.js +39 -0
  106. package/dist/adapters/transcript/web.js.map +1 -0
  107. package/dist/adapters/transcript/who.d.ts +15 -0
  108. package/dist/adapters/transcript/who.d.ts.map +1 -0
  109. package/dist/adapters/transcript/who.js +42 -0
  110. package/dist/adapters/transcript/who.js.map +1 -0
  111. package/dist/adapters/trends.d.ts +11 -0
  112. package/dist/adapters/trends.d.ts.map +1 -0
  113. package/dist/adapters/trends.js +316 -0
  114. package/dist/adapters/trends.js.map +1 -0
  115. package/dist/contraagent-ui.js +1028 -0
  116. package/dist/controllers/locale.d.ts +25 -0
  117. package/dist/controllers/locale.d.ts.map +1 -0
  118. package/dist/controllers/locale.js +33 -0
  119. package/dist/controllers/locale.js.map +1 -0
  120. package/dist/controllers/shortcuts.d.ts +29 -0
  121. package/dist/controllers/shortcuts.d.ts.map +1 -0
  122. package/dist/controllers/shortcuts.js +51 -0
  123. package/dist/controllers/shortcuts.js.map +1 -0
  124. package/dist/controllers/stream.d.ts +41 -0
  125. package/dist/controllers/stream.d.ts.map +1 -0
  126. package/dist/controllers/stream.js +90 -0
  127. package/dist/controllers/stream.js.map +1 -0
  128. package/dist/controllers/task-detail.d.ts +22 -0
  129. package/dist/controllers/task-detail.d.ts.map +1 -0
  130. package/dist/controllers/task-detail.js +50 -0
  131. package/dist/controllers/task-detail.js.map +1 -0
  132. package/dist/controllers/theme.d.ts +32 -0
  133. package/dist/controllers/theme.d.ts.map +1 -0
  134. package/dist/controllers/theme.js +56 -0
  135. package/dist/controllers/theme.js.map +1 -0
  136. package/dist/core/events.d.ts +107 -0
  137. package/dist/core/events.d.ts.map +1 -0
  138. package/dist/core/events.js +5 -0
  139. package/dist/core/events.js.map +1 -0
  140. package/dist/core/i18n.d.ts +21 -0
  141. package/dist/core/i18n.d.ts.map +1 -0
  142. package/dist/core/i18n.js +71 -0
  143. package/dist/core/i18n.js.map +1 -0
  144. package/dist/core/index.d.ts +5 -0
  145. package/dist/core/index.d.ts.map +1 -0
  146. package/dist/core/index.js +7 -0
  147. package/dist/core/index.js.map +1 -0
  148. package/dist/core/memory.d.ts +51 -0
  149. package/dist/core/memory.d.ts.map +1 -0
  150. package/dist/core/memory.js +174 -0
  151. package/dist/core/memory.js.map +1 -0
  152. package/dist/core/scroll.d.ts +21 -0
  153. package/dist/core/scroll.d.ts.map +1 -0
  154. package/dist/core/scroll.js +74 -0
  155. package/dist/core/scroll.js.map +1 -0
  156. package/dist/core/view-route.d.ts +62 -0
  157. package/dist/core/view-route.d.ts.map +1 -0
  158. package/dist/core/view-route.js +143 -0
  159. package/dist/core/view-route.js.map +1 -0
  160. package/dist/core/view-router.d.ts +27 -0
  161. package/dist/core/view-router.d.ts.map +1 -0
  162. package/dist/core/view-router.js +57 -0
  163. package/dist/core/view-router.js.map +1 -0
  164. package/dist/define/all.d.ts +13 -0
  165. package/dist/define/all.d.ts.map +1 -0
  166. package/dist/define/all.js +14 -0
  167. package/dist/define/all.js.map +1 -0
  168. package/dist/define/contracts.d.ts +2 -0
  169. package/dist/define/contracts.d.ts.map +1 -0
  170. package/dist/define/contracts.js +3 -0
  171. package/dist/define/contracts.js.map +1 -0
  172. package/dist/define/definitions.d.ts +3 -0
  173. package/dist/define/definitions.d.ts.map +1 -0
  174. package/dist/define/definitions.js +4 -0
  175. package/dist/define/definitions.js.map +1 -0
  176. package/dist/define/journal-table.d.ts +2 -0
  177. package/dist/define/journal-table.d.ts.map +1 -0
  178. package/dist/define/journal-table.js +3 -0
  179. package/dist/define/journal-table.js.map +1 -0
  180. package/dist/define/kpis.d.ts +2 -0
  181. package/dist/define/kpis.d.ts.map +1 -0
  182. package/dist/define/kpis.js +3 -0
  183. package/dist/define/kpis.js.map +1 -0
  184. package/dist/define/monitor.d.ts +2 -0
  185. package/dist/define/monitor.d.ts.map +1 -0
  186. package/dist/define/monitor.js +3 -0
  187. package/dist/define/monitor.js.map +1 -0
  188. package/dist/define/overview.d.ts +2 -0
  189. package/dist/define/overview.d.ts.map +1 -0
  190. package/dist/define/overview.js +3 -0
  191. package/dist/define/overview.js.map +1 -0
  192. package/dist/define/pipeline-graph.d.ts +2 -0
  193. package/dist/define/pipeline-graph.d.ts.map +1 -0
  194. package/dist/define/pipeline-graph.js +3 -0
  195. package/dist/define/pipeline-graph.js.map +1 -0
  196. package/dist/define/procs.d.ts +3 -0
  197. package/dist/define/procs.d.ts.map +1 -0
  198. package/dist/define/procs.js +4 -0
  199. package/dist/define/procs.js.map +1 -0
  200. package/dist/define/task-table.d.ts +2 -0
  201. package/dist/define/task-table.d.ts.map +1 -0
  202. package/dist/define/task-table.js +3 -0
  203. package/dist/define/task-table.js.map +1 -0
  204. package/dist/define/task-view.d.ts +2 -0
  205. package/dist/define/task-view.d.ts.map +1 -0
  206. package/dist/define/task-view.js +3 -0
  207. package/dist/define/task-view.js.map +1 -0
  208. package/dist/define/timeline.d.ts +2 -0
  209. package/dist/define/timeline.d.ts.map +1 -0
  210. package/dist/define/timeline.js +3 -0
  211. package/dist/define/timeline.js.map +1 -0
  212. package/dist/define/transcript.d.ts +2 -0
  213. package/dist/define/transcript.d.ts.map +1 -0
  214. package/dist/define/transcript.js +3 -0
  215. package/dist/define/transcript.js.map +1 -0
  216. package/dist/elements/lists/ca-contracts.d.ts +46 -0
  217. package/dist/elements/lists/ca-contracts.d.ts.map +1 -0
  218. package/dist/elements/lists/ca-contracts.js +199 -0
  219. package/dist/elements/lists/ca-contracts.js.map +1 -0
  220. package/dist/elements/lists/ca-definitions.d.ts +41 -0
  221. package/dist/elements/lists/ca-definitions.d.ts.map +1 -0
  222. package/dist/elements/lists/ca-definitions.js +182 -0
  223. package/dist/elements/lists/ca-definitions.js.map +1 -0
  224. package/dist/elements/lists/ca-journal-table.d.ts +37 -0
  225. package/dist/elements/lists/ca-journal-table.d.ts.map +1 -0
  226. package/dist/elements/lists/ca-journal-table.js +170 -0
  227. package/dist/elements/lists/ca-journal-table.js.map +1 -0
  228. package/dist/elements/lists/ca-panel-body.d.ts +42 -0
  229. package/dist/elements/lists/ca-panel-body.d.ts.map +1 -0
  230. package/dist/elements/lists/ca-panel-body.js +210 -0
  231. package/dist/elements/lists/ca-panel-body.js.map +1 -0
  232. package/dist/elements/lists/ca-panel-view.d.ts +21 -0
  233. package/dist/elements/lists/ca-panel-view.d.ts.map +1 -0
  234. package/dist/elements/lists/ca-panel-view.js +59 -0
  235. package/dist/elements/lists/ca-panel-view.js.map +1 -0
  236. package/dist/elements/lists/ca-proc-tree.d.ts +16 -0
  237. package/dist/elements/lists/ca-proc-tree.d.ts.map +1 -0
  238. package/dist/elements/lists/ca-proc-tree.js +63 -0
  239. package/dist/elements/lists/ca-proc-tree.js.map +1 -0
  240. package/dist/elements/lists/ca-procs-view.d.ts +27 -0
  241. package/dist/elements/lists/ca-procs-view.d.ts.map +1 -0
  242. package/dist/elements/lists/ca-procs-view.js +91 -0
  243. package/dist/elements/lists/ca-procs-view.js.map +1 -0
  244. package/dist/elements/lists/ca-task-table.d.ts +33 -0
  245. package/dist/elements/lists/ca-task-table.d.ts.map +1 -0
  246. package/dist/elements/lists/ca-task-table.js +115 -0
  247. package/dist/elements/lists/ca-task-table.js.map +1 -0
  248. package/dist/elements/lists/index.d.ts +9 -0
  249. package/dist/elements/lists/index.d.ts.map +1 -0
  250. package/dist/elements/lists/index.js +9 -0
  251. package/dist/elements/lists/index.js.map +1 -0
  252. package/dist/elements/overview/ca-kpis.d.ts +32 -0
  253. package/dist/elements/overview/ca-kpis.d.ts.map +1 -0
  254. package/dist/elements/overview/ca-kpis.js +62 -0
  255. package/dist/elements/overview/ca-kpis.js.map +1 -0
  256. package/dist/elements/overview/ca-model-usage.d.ts +25 -0
  257. package/dist/elements/overview/ca-model-usage.d.ts.map +1 -0
  258. package/dist/elements/overview/ca-model-usage.js +118 -0
  259. package/dist/elements/overview/ca-model-usage.js.map +1 -0
  260. package/dist/elements/overview/ca-overview.d.ts +67 -0
  261. package/dist/elements/overview/ca-overview.d.ts.map +1 -0
  262. package/dist/elements/overview/ca-overview.js +463 -0
  263. package/dist/elements/overview/ca-overview.js.map +1 -0
  264. package/dist/elements/overview/ca-pipeline-graph.d.ts +211 -0
  265. package/dist/elements/overview/ca-pipeline-graph.d.ts.map +1 -0
  266. package/dist/elements/overview/ca-pipeline-graph.js +616 -0
  267. package/dist/elements/overview/ca-pipeline-graph.js.map +1 -0
  268. package/dist/elements/overview/ca-quota.d.ts +42 -0
  269. package/dist/elements/overview/ca-quota.d.ts.map +1 -0
  270. package/dist/elements/overview/ca-quota.js +179 -0
  271. package/dist/elements/overview/ca-quota.js.map +1 -0
  272. package/dist/elements/overview/ca-run-driver.d.ts +33 -0
  273. package/dist/elements/overview/ca-run-driver.d.ts.map +1 -0
  274. package/dist/elements/overview/ca-run-driver.js +146 -0
  275. package/dist/elements/overview/ca-run-driver.js.map +1 -0
  276. package/dist/elements/overview/ca-services.d.ts +25 -0
  277. package/dist/elements/overview/ca-services.d.ts.map +1 -0
  278. package/dist/elements/overview/ca-services.js +77 -0
  279. package/dist/elements/overview/ca-services.js.map +1 -0
  280. package/dist/elements/overview/ca-spend-breakdown.d.ts +24 -0
  281. package/dist/elements/overview/ca-spend-breakdown.d.ts.map +1 -0
  282. package/dist/elements/overview/ca-spend-breakdown.js +108 -0
  283. package/dist/elements/overview/ca-spend-breakdown.js.map +1 -0
  284. package/dist/elements/overview/ca-timeline.d.ts +28 -0
  285. package/dist/elements/overview/ca-timeline.d.ts.map +1 -0
  286. package/dist/elements/overview/ca-timeline.js +72 -0
  287. package/dist/elements/overview/ca-timeline.js.map +1 -0
  288. package/dist/elements/overview/ca-workers.d.ts +23 -0
  289. package/dist/elements/overview/ca-workers.d.ts.map +1 -0
  290. package/dist/elements/overview/ca-workers.js +86 -0
  291. package/dist/elements/overview/ca-workers.js.map +1 -0
  292. package/dist/elements/overview/index.d.ts +11 -0
  293. package/dist/elements/overview/index.d.ts.map +1 -0
  294. package/dist/elements/overview/index.js +11 -0
  295. package/dist/elements/overview/index.js.map +1 -0
  296. package/dist/elements/overview/pipeline-graph/actions.d.ts +16 -0
  297. package/dist/elements/overview/pipeline-graph/actions.d.ts.map +1 -0
  298. package/dist/elements/overview/pipeline-graph/actions.js +42 -0
  299. package/dist/elements/overview/pipeline-graph/actions.js.map +1 -0
  300. package/dist/elements/overview/pipeline-graph/crumbs.d.ts +15 -0
  301. package/dist/elements/overview/pipeline-graph/crumbs.d.ts.map +1 -0
  302. package/dist/elements/overview/pipeline-graph/crumbs.js +70 -0
  303. package/dist/elements/overview/pipeline-graph/crumbs.js.map +1 -0
  304. package/dist/elements/overview/pipeline-graph/host.d.ts +24 -0
  305. package/dist/elements/overview/pipeline-graph/host.d.ts.map +1 -0
  306. package/dist/elements/overview/pipeline-graph/host.js +2 -0
  307. package/dist/elements/overview/pipeline-graph/host.js.map +1 -0
  308. package/dist/elements/overview/pipeline-graph/inspector.d.ts +5 -0
  309. package/dist/elements/overview/pipeline-graph/inspector.d.ts.map +1 -0
  310. package/dist/elements/overview/pipeline-graph/inspector.js +100 -0
  311. package/dist/elements/overview/pipeline-graph/inspector.js.map +1 -0
  312. package/dist/elements/overview/pipeline-graph/outline.d.ts +53 -0
  313. package/dist/elements/overview/pipeline-graph/outline.d.ts.map +1 -0
  314. package/dist/elements/overview/pipeline-graph/outline.js +111 -0
  315. package/dist/elements/overview/pipeline-graph/outline.js.map +1 -0
  316. package/dist/elements/overview/pipeline-graph/strings.d.ts +11 -0
  317. package/dist/elements/overview/pipeline-graph/strings.d.ts.map +1 -0
  318. package/dist/elements/overview/pipeline-graph/strings.js +49 -0
  319. package/dist/elements/overview/pipeline-graph/strings.js.map +1 -0
  320. package/dist/elements/overview/pipeline-graph/styles.d.ts +4 -0
  321. package/dist/elements/overview/pipeline-graph/styles.d.ts.map +1 -0
  322. package/dist/elements/overview/pipeline-graph/styles.js +96 -0
  323. package/dist/elements/overview/pipeline-graph/styles.js.map +1 -0
  324. package/dist/elements/shared/ca-definition.d.ts +26 -0
  325. package/dist/elements/shared/ca-definition.d.ts.map +1 -0
  326. package/dist/elements/shared/ca-definition.js +202 -0
  327. package/dist/elements/shared/ca-definition.js.map +1 -0
  328. package/dist/elements/shared/contract-parts.d.ts +35 -0
  329. package/dist/elements/shared/contract-parts.d.ts.map +1 -0
  330. package/dist/elements/shared/contract-parts.js +167 -0
  331. package/dist/elements/shared/contract-parts.js.map +1 -0
  332. package/dist/elements/shared/file-card.d.ts +17 -0
  333. package/dist/elements/shared/file-card.d.ts.map +1 -0
  334. package/dist/elements/shared/file-card.js +37 -0
  335. package/dist/elements/shared/file-card.js.map +1 -0
  336. package/dist/elements/shared/prompt-text.d.ts +5 -0
  337. package/dist/elements/shared/prompt-text.d.ts.map +1 -0
  338. package/dist/elements/shared/prompt-text.js +13 -0
  339. package/dist/elements/shared/prompt-text.js.map +1 -0
  340. package/dist/elements/shared/task-chip.d.ts +10 -0
  341. package/dist/elements/shared/task-chip.d.ts.map +1 -0
  342. package/dist/elements/shared/task-chip.js +19 -0
  343. package/dist/elements/shared/task-chip.js.map +1 -0
  344. package/dist/elements/shell/ca-clock.d.ts +13 -0
  345. package/dist/elements/shell/ca-clock.d.ts.map +1 -0
  346. package/dist/elements/shell/ca-clock.js +30 -0
  347. package/dist/elements/shell/ca-clock.js.map +1 -0
  348. package/dist/elements/shell/ca-hosts.d.ts +21 -0
  349. package/dist/elements/shell/ca-hosts.d.ts.map +1 -0
  350. package/dist/elements/shell/ca-hosts.js +97 -0
  351. package/dist/elements/shell/ca-hosts.js.map +1 -0
  352. package/dist/elements/shell/ca-monitor.d.ts +182 -0
  353. package/dist/elements/shell/ca-monitor.d.ts.map +1 -0
  354. package/dist/elements/shell/ca-monitor.js +549 -0
  355. package/dist/elements/shell/ca-monitor.js.map +1 -0
  356. package/dist/elements/shell/ca-run-picker.d.ts +71 -0
  357. package/dist/elements/shell/ca-run-picker.d.ts.map +1 -0
  358. package/dist/elements/shell/ca-run-picker.js +313 -0
  359. package/dist/elements/shell/ca-run-picker.js.map +1 -0
  360. package/dist/elements/shell/ca-theme-switch.d.ts +36 -0
  361. package/dist/elements/shell/ca-theme-switch.d.ts.map +1 -0
  362. package/dist/elements/shell/ca-theme-switch.js +186 -0
  363. package/dist/elements/shell/ca-theme-switch.js.map +1 -0
  364. package/dist/elements/shell/ca-toasts.d.ts +23 -0
  365. package/dist/elements/shell/ca-toasts.d.ts.map +1 -0
  366. package/dist/elements/shell/ca-toasts.js +88 -0
  367. package/dist/elements/shell/ca-toasts.js.map +1 -0
  368. package/dist/elements/shell/header.d.ts +13 -0
  369. package/dist/elements/shell/header.d.ts.map +1 -0
  370. package/dist/elements/shell/header.js +38 -0
  371. package/dist/elements/shell/header.js.map +1 -0
  372. package/dist/elements/shell/styles.d.ts +2 -0
  373. package/dist/elements/shell/styles.d.ts.map +1 -0
  374. package/dist/elements/shell/styles.js +72 -0
  375. package/dist/elements/shell/styles.js.map +1 -0
  376. package/dist/elements/shell/tabs.d.ts +32 -0
  377. package/dist/elements/shell/tabs.d.ts.map +1 -0
  378. package/dist/elements/shell/tabs.js +125 -0
  379. package/dist/elements/shell/tabs.js.map +1 -0
  380. package/dist/elements/shell/views.d.ts +27 -0
  381. package/dist/elements/shell/views.d.ts.map +1 -0
  382. package/dist/elements/shell/views.js +55 -0
  383. package/dist/elements/shell/views.js.map +1 -0
  384. package/dist/elements/task/ca-task-view.d.ts +55 -0
  385. package/dist/elements/task/ca-task-view.d.ts.map +1 -0
  386. package/dist/elements/task/ca-task-view.js +199 -0
  387. package/dist/elements/task/ca-task-view.js.map +1 -0
  388. package/dist/elements/task/ca-transcript.d.ts +74 -0
  389. package/dist/elements/task/ca-transcript.d.ts.map +1 -0
  390. package/dist/elements/task/ca-transcript.js +241 -0
  391. package/dist/elements/task/ca-transcript.js.map +1 -0
  392. package/dist/elements/task/context.d.ts +57 -0
  393. package/dist/elements/task/context.d.ts.map +1 -0
  394. package/dist/elements/task/context.js +61 -0
  395. package/dist/elements/task/context.js.map +1 -0
  396. package/dist/elements/task/header.d.ts +9 -0
  397. package/dist/elements/task/header.d.ts.map +1 -0
  398. package/dist/elements/task/header.js +291 -0
  399. package/dist/elements/task/header.js.map +1 -0
  400. package/dist/elements/task/index.d.ts +3 -0
  401. package/dist/elements/task/index.d.ts.map +1 -0
  402. package/dist/elements/task/index.js +3 -0
  403. package/dist/elements/task/index.js.map +1 -0
  404. package/dist/elements/task/inputs.d.ts +28 -0
  405. package/dist/elements/task/inputs.d.ts.map +1 -0
  406. package/dist/elements/task/inputs.js +27 -0
  407. package/dist/elements/task/inputs.js.map +1 -0
  408. package/dist/elements/task/panes/definition.d.ts +5 -0
  409. package/dist/elements/task/panes/definition.d.ts.map +1 -0
  410. package/dist/elements/task/panes/definition.js +5 -0
  411. package/dist/elements/task/panes/definition.js.map +1 -0
  412. package/dist/elements/task/panes/io.d.ts +8 -0
  413. package/dist/elements/task/panes/io.d.ts.map +1 -0
  414. package/dist/elements/task/panes/io.js +184 -0
  415. package/dist/elements/task/panes/io.js.map +1 -0
  416. package/dist/elements/task/panes/transcript.d.ts +5 -0
  417. package/dist/elements/task/panes/transcript.d.ts.map +1 -0
  418. package/dist/elements/task/panes/transcript.js +29 -0
  419. package/dist/elements/task/panes/transcript.js.map +1 -0
  420. package/dist/elements/task/styles.d.ts +2 -0
  421. package/dist/elements/task/styles.d.ts.map +1 -0
  422. package/dist/elements/task/styles.js +66 -0
  423. package/dist/elements/task/styles.js.map +1 -0
  424. package/dist/elements/trends/ca-trends.d.ts +55 -0
  425. package/dist/elements/trends/ca-trends.d.ts.map +1 -0
  426. package/dist/elements/trends/ca-trends.js +213 -0
  427. package/dist/elements/trends/ca-trends.js.map +1 -0
  428. package/dist/index.d.ts +14 -0
  429. package/dist/index.d.ts.map +1 -0
  430. package/dist/index.js +22 -0
  431. package/dist/index.js.map +1 -0
  432. package/dist/lib/tone.d.ts +29 -0
  433. package/dist/lib/tone.d.ts.map +1 -0
  434. package/dist/lib/tone.js +97 -0
  435. package/dist/lib/tone.js.map +1 -0
  436. package/dist/lib/trends.d.ts +15 -0
  437. package/dist/lib/trends.d.ts.map +1 -0
  438. package/dist/lib/trends.js +36 -0
  439. package/dist/lib/trends.js.map +1 -0
  440. package/dist/locales/codes.d.ts +14 -0
  441. package/dist/locales/codes.d.ts.map +1 -0
  442. package/dist/locales/codes.js +21 -0
  443. package/dist/locales/codes.js.map +1 -0
  444. package/dist/locales/ja.d.ts +785 -0
  445. package/dist/locales/ja.d.ts.map +1 -0
  446. package/dist/locales/ja.js +791 -0
  447. package/dist/locales/ja.js.map +1 -0
  448. package/dist/words/api-error.d.ts +4 -0
  449. package/dist/words/api-error.d.ts.map +1 -0
  450. package/dist/words/api-error.js +13 -0
  451. package/dist/words/api-error.js.map +1 -0
  452. package/dist/words/attempts.d.ts +17 -0
  453. package/dist/words/attempts.d.ts.map +1 -0
  454. package/dist/words/attempts.js +26 -0
  455. package/dist/words/attempts.js.map +1 -0
  456. package/dist/words/causes.d.ts +33 -0
  457. package/dist/words/causes.d.ts.map +1 -0
  458. package/dist/words/causes.js +58 -0
  459. package/dist/words/causes.js.map +1 -0
  460. package/dist/words/changes.d.ts +9 -0
  461. package/dist/words/changes.d.ts.map +1 -0
  462. package/dist/words/changes.js +23 -0
  463. package/dist/words/changes.js.map +1 -0
  464. package/dist/words/claims.d.ts +9 -0
  465. package/dist/words/claims.d.ts.map +1 -0
  466. package/dist/words/claims.js +12 -0
  467. package/dist/words/claims.js.map +1 -0
  468. package/dist/words/context.d.ts +18 -0
  469. package/dist/words/context.d.ts.map +1 -0
  470. package/dist/words/context.js +39 -0
  471. package/dist/words/context.js.map +1 -0
  472. package/dist/words/contract.d.ts +25 -0
  473. package/dist/words/contract.d.ts.map +1 -0
  474. package/dist/words/contract.js +52 -0
  475. package/dist/words/contract.js.map +1 -0
  476. package/dist/words/credential.d.ts +5 -0
  477. package/dist/words/credential.d.ts.map +1 -0
  478. package/dist/words/credential.js +7 -0
  479. package/dist/words/credential.js.map +1 -0
  480. package/dist/words/executor.d.ts +12 -0
  481. package/dist/words/executor.d.ts.map +1 -0
  482. package/dist/words/executor.js +20 -0
  483. package/dist/words/executor.js.map +1 -0
  484. package/dist/words/export.d.ts +8 -0
  485. package/dist/words/export.d.ts.map +1 -0
  486. package/dist/words/export.js +17 -0
  487. package/dist/words/export.js.map +1 -0
  488. package/dist/words/format.d.ts +36 -0
  489. package/dist/words/format.d.ts.map +1 -0
  490. package/dist/words/format.js +109 -0
  491. package/dist/words/format.js.map +1 -0
  492. package/dist/words/hops.d.ts +12 -0
  493. package/dist/words/hops.d.ts.map +1 -0
  494. package/dist/words/hops.js +27 -0
  495. package/dist/words/hops.js.map +1 -0
  496. package/dist/words/hosts.d.ts +18 -0
  497. package/dist/words/hosts.d.ts.map +1 -0
  498. package/dist/words/hosts.js +22 -0
  499. package/dist/words/hosts.js.map +1 -0
  500. package/dist/words/index.d.ts +28 -0
  501. package/dist/words/index.d.ts.map +1 -0
  502. package/dist/words/index.js +32 -0
  503. package/dist/words/index.js.map +1 -0
  504. package/dist/words/models.d.ts +10 -0
  505. package/dist/words/models.d.ts.map +1 -0
  506. package/dist/words/models.js +45 -0
  507. package/dist/words/models.js.map +1 -0
  508. package/dist/words/outcome.d.ts +14 -0
  509. package/dist/words/outcome.d.ts.map +1 -0
  510. package/dist/words/outcome.js +58 -0
  511. package/dist/words/outcome.js.map +1 -0
  512. package/dist/words/panels.d.ts +17 -0
  513. package/dist/words/panels.d.ts.map +1 -0
  514. package/dist/words/panels.js +63 -0
  515. package/dist/words/panels.js.map +1 -0
  516. package/dist/words/passes.d.ts +11 -0
  517. package/dist/words/passes.d.ts.map +1 -0
  518. package/dist/words/passes.js +13 -0
  519. package/dist/words/passes.js.map +1 -0
  520. package/dist/words/preflight.d.ts +28 -0
  521. package/dist/words/preflight.d.ts.map +1 -0
  522. package/dist/words/preflight.js +30 -0
  523. package/dist/words/preflight.js.map +1 -0
  524. package/dist/words/priority.d.ts +5 -0
  525. package/dist/words/priority.d.ts.map +1 -0
  526. package/dist/words/priority.js +7 -0
  527. package/dist/words/priority.js.map +1 -0
  528. package/dist/words/prompt.d.ts +10 -0
  529. package/dist/words/prompt.d.ts.map +1 -0
  530. package/dist/words/prompt.js +17 -0
  531. package/dist/words/prompt.js.map +1 -0
  532. package/dist/words/quota.d.ts +35 -0
  533. package/dist/words/quota.d.ts.map +1 -0
  534. package/dist/words/quota.js +102 -0
  535. package/dist/words/quota.js.map +1 -0
  536. package/dist/words/rests.d.ts +26 -0
  537. package/dist/words/rests.d.ts.map +1 -0
  538. package/dist/words/rests.js +77 -0
  539. package/dist/words/rests.js.map +1 -0
  540. package/dist/words/rounds.d.ts +14 -0
  541. package/dist/words/rounds.d.ts.map +1 -0
  542. package/dist/words/rounds.js +60 -0
  543. package/dist/words/rounds.js.map +1 -0
  544. package/dist/words/row-extras.d.ts +7 -0
  545. package/dist/words/row-extras.d.ts.map +1 -0
  546. package/dist/words/row-extras.js +26 -0
  547. package/dist/words/row-extras.js.map +1 -0
  548. package/dist/words/run-line.d.ts +40 -0
  549. package/dist/words/run-line.d.ts.map +1 -0
  550. package/dist/words/run-line.js +66 -0
  551. package/dist/words/run-line.js.map +1 -0
  552. package/dist/words/services.d.ts +16 -0
  553. package/dist/words/services.d.ts.map +1 -0
  554. package/dist/words/services.js +45 -0
  555. package/dist/words/services.js.map +1 -0
  556. package/dist/words/stop.d.ts +6 -0
  557. package/dist/words/stop.d.ts.map +1 -0
  558. package/dist/words/stop.js +69 -0
  559. package/dist/words/stop.js.map +1 -0
  560. package/dist/words/table.d.ts +4 -0
  561. package/dist/words/table.d.ts.map +1 -0
  562. package/dist/words/table.js +8 -0
  563. package/dist/words/table.js.map +1 -0
  564. package/dist/words/task-definition.d.ts +23 -0
  565. package/dist/words/task-definition.d.ts.map +1 -0
  566. package/dist/words/task-definition.js +27 -0
  567. package/dist/words/task-definition.js.map +1 -0
  568. package/dist/words/time-box.d.ts +8 -0
  569. package/dist/words/time-box.d.ts.map +1 -0
  570. package/dist/words/time-box.js +12 -0
  571. package/dist/words/time-box.js.map +1 -0
  572. package/dist/words/trends.d.ts +86 -0
  573. package/dist/words/trends.d.ts.map +1 -0
  574. package/dist/words/trends.js +104 -0
  575. package/dist/words/trends.js.map +1 -0
  576. package/docs/embed.md +121 -0
  577. package/docs/events.md +38 -0
  578. package/docs/examples/embed.html +31 -0
  579. package/docs/examples/journal.ts +32 -0
  580. package/docs/examples/live-transcript.ts +22 -0
  581. package/docs/examples/vite/index.html +30 -0
  582. package/docs/examples/vite/main.ts +23 -0
  583. package/docs/languages.md +48 -0
  584. package/docs/live-data.md +17 -0
  585. package/docs/theming.md +21 -0
  586. package/docs/tsconfig.json +14 -0
  587. package/package.json +131 -4
  588. package/src/adapters/check-rows.ts +81 -0
  589. package/src/adapters/filters.ts +76 -0
  590. package/src/adapters/graph/compound.ts +359 -0
  591. package/src/adapters/graph/flow-index.ts +154 -0
  592. package/src/adapters/graph/highlight.ts +40 -0
  593. package/src/adapters/graph/input.ts +236 -0
  594. package/src/adapters/graph/layer.ts +92 -0
  595. package/src/adapters/graph/matrix.ts +133 -0
  596. package/src/adapters/graph/plans.fixture.ts +194 -0
  597. package/src/adapters/graph/project.ts +358 -0
  598. package/src/adapters/graph/selection.ts +54 -0
  599. package/src/adapters/graph/states.ts +10 -0
  600. package/src/adapters/graph/types.ts +148 -0
  601. package/src/adapters/graph/words.ts +146 -0
  602. package/src/adapters/index.ts +22 -0
  603. package/src/adapters/journal-columns.ts +200 -0
  604. package/src/adapters/kpi-tiles.ts +211 -0
  605. package/src/adapters/lanes.ts +98 -0
  606. package/src/adapters/model-shares.ts +62 -0
  607. package/src/adapters/panel-body.ts +112 -0
  608. package/src/adapters/preflight.ts +27 -0
  609. package/src/adapters/task-columns.ts +120 -0
  610. package/src/adapters/transcript/index.ts +14 -0
  611. package/src/adapters/transcript/model.ts +156 -0
  612. package/src/adapters/transcript/rounds.ts +86 -0
  613. package/src/adapters/transcript/sections.ts +82 -0
  614. package/src/adapters/transcript/web.ts +40 -0
  615. package/src/adapters/transcript/who.ts +53 -0
  616. package/src/adapters/trends.ts +337 -0
  617. package/src/controllers/locale.ts +47 -0
  618. package/src/controllers/shortcuts.ts +69 -0
  619. package/src/controllers/stream.ts +103 -0
  620. package/src/controllers/task-detail.ts +54 -0
  621. package/src/controllers/theme.ts +73 -0
  622. package/src/core/events.ts +120 -0
  623. package/src/core/i18n.ts +76 -0
  624. package/src/core/index.ts +6 -0
  625. package/src/core/memory.ts +177 -0
  626. package/src/core/scroll.ts +73 -0
  627. package/src/core/view-route.ts +177 -0
  628. package/src/core/view-router.ts +66 -0
  629. package/src/define/all.ts +13 -0
  630. package/src/define/contracts.ts +2 -0
  631. package/src/define/definitions.ts +3 -0
  632. package/src/define/journal-table.ts +2 -0
  633. package/src/define/kpis.ts +2 -0
  634. package/src/define/monitor.ts +2 -0
  635. package/src/define/overview.ts +2 -0
  636. package/src/define/pipeline-graph.ts +2 -0
  637. package/src/define/procs.ts +3 -0
  638. package/src/define/task-table.ts +2 -0
  639. package/src/define/task-view.ts +2 -0
  640. package/src/define/timeline.ts +2 -0
  641. package/src/define/transcript.ts +2 -0
  642. package/src/elements/lists/ca-contracts.ts +204 -0
  643. package/src/elements/lists/ca-definitions.ts +170 -0
  644. package/src/elements/lists/ca-journal-table.ts +141 -0
  645. package/src/elements/lists/ca-panel-body.ts +200 -0
  646. package/src/elements/lists/ca-panel-view.ts +50 -0
  647. package/src/elements/lists/ca-proc-tree.ts +57 -0
  648. package/src/elements/lists/ca-procs-view.ts +89 -0
  649. package/src/elements/lists/ca-task-table.ts +94 -0
  650. package/src/elements/lists/index.ts +8 -0
  651. package/src/elements/overview/ca-kpis.ts +51 -0
  652. package/src/elements/overview/ca-model-usage.ts +113 -0
  653. package/src/elements/overview/ca-overview.ts +499 -0
  654. package/src/elements/overview/ca-pipeline-graph.ts +617 -0
  655. package/src/elements/overview/ca-quota.ts +164 -0
  656. package/src/elements/overview/ca-run-driver.ts +140 -0
  657. package/src/elements/overview/ca-services.ts +66 -0
  658. package/src/elements/overview/ca-spend-breakdown.ts +107 -0
  659. package/src/elements/overview/ca-timeline.ts +57 -0
  660. package/src/elements/overview/ca-workers.ts +82 -0
  661. package/src/elements/overview/index.ts +10 -0
  662. package/src/elements/overview/pipeline-graph/actions.ts +45 -0
  663. package/src/elements/overview/pipeline-graph/crumbs.ts +75 -0
  664. package/src/elements/overview/pipeline-graph/host.ts +26 -0
  665. package/src/elements/overview/pipeline-graph/inspector.ts +104 -0
  666. package/src/elements/overview/pipeline-graph/outline.ts +150 -0
  667. package/src/elements/overview/pipeline-graph/strings.ts +53 -0
  668. package/src/elements/overview/pipeline-graph/styles.ts +97 -0
  669. package/src/elements/shared/ca-definition.ts +206 -0
  670. package/src/elements/shared/contract-parts.ts +174 -0
  671. package/src/elements/shared/file-card.ts +49 -0
  672. package/src/elements/shared/prompt-text.ts +13 -0
  673. package/src/elements/shared/task-chip.ts +18 -0
  674. package/src/elements/shell/ca-clock.ts +27 -0
  675. package/src/elements/shell/ca-hosts.ts +93 -0
  676. package/src/elements/shell/ca-monitor.ts +528 -0
  677. package/src/elements/shell/ca-run-picker.ts +284 -0
  678. package/src/elements/shell/ca-theme-switch.ts +170 -0
  679. package/src/elements/shell/ca-toasts.ts +100 -0
  680. package/src/elements/shell/header.ts +45 -0
  681. package/src/elements/shell/styles.ts +72 -0
  682. package/src/elements/shell/tabs.ts +143 -0
  683. package/src/elements/shell/views.ts +67 -0
  684. package/src/elements/task/ca-task-view.ts +157 -0
  685. package/src/elements/task/ca-transcript.ts +214 -0
  686. package/src/elements/task/context.ts +105 -0
  687. package/src/elements/task/header.ts +296 -0
  688. package/src/elements/task/index.ts +2 -0
  689. package/src/elements/task/inputs.ts +46 -0
  690. package/src/elements/task/panes/definition.ts +7 -0
  691. package/src/elements/task/panes/io.ts +190 -0
  692. package/src/elements/task/panes/transcript.ts +29 -0
  693. package/src/elements/task/styles.ts +66 -0
  694. package/src/elements/trends/ca-trends.ts +204 -0
  695. package/src/index.ts +23 -0
  696. package/src/lib/tone.ts +109 -0
  697. package/src/lib/trends.ts +44 -0
  698. package/src/locales/codes.ts +23 -0
  699. package/src/locales/ja.ts +795 -0
  700. package/src/words/api-error.ts +17 -0
  701. package/src/words/attempts.ts +28 -0
  702. package/src/words/causes.ts +67 -0
  703. package/src/words/changes.ts +29 -0
  704. package/src/words/claims.ts +16 -0
  705. package/src/words/context.ts +47 -0
  706. package/src/words/contract.ts +63 -0
  707. package/src/words/credential.ts +8 -0
  708. package/src/words/executor.ts +22 -0
  709. package/src/words/export.ts +22 -0
  710. package/src/words/format.ts +107 -0
  711. package/src/words/hops.ts +30 -0
  712. package/src/words/hosts.ts +37 -0
  713. package/src/words/index.ts +31 -0
  714. package/src/words/models.ts +50 -0
  715. package/src/words/outcome.ts +61 -0
  716. package/src/words/panels.ts +71 -0
  717. package/src/words/passes.ts +18 -0
  718. package/src/words/preflight.ts +53 -0
  719. package/src/words/priority.ts +8 -0
  720. package/src/words/prompt.ts +20 -0
  721. package/src/words/quota.ts +108 -0
  722. package/src/words/rests.ts +96 -0
  723. package/src/words/rounds.ts +56 -0
  724. package/src/words/row-extras.ts +24 -0
  725. package/src/words/run-line.ts +77 -0
  726. package/src/words/services.ts +57 -0
  727. package/src/words/stop.ts +65 -0
  728. package/src/words/table.ts +10 -0
  729. package/src/words/task-definition.ts +37 -0
  730. package/src/words/time-box.ts +21 -0
  731. package/src/words/trends.ts +118 -0
@@ -0,0 +1,164 @@
1
+ import { runAccounts, type AccountUsage, type CredentialRest, type JournalRow, type QuotaCap, type QuotaReading } from '@contraagent/api';
2
+ import { localized, msg, str } from '@lit/localize';
3
+ import { LitElement, css, html, nothing } from 'lit';
4
+ import { customElement, property } from 'lit/decorators.js';
5
+ import { ClockController } from '@contraagent/elements';
6
+ import { localTime } from '../../words/format.js';
7
+ import { capLabel, capsLine, credentialLabel, restFacts, restSpan } from '../../words/index.js';
8
+ import { accountLabel, pct, quotaStatusLabel, resetsIn } from '../../words/quota.js';
9
+ import { pill } from '@contraagent/elements/primitives';
10
+ import { base } from '@contraagent/elements/styles';
11
+
12
+ type Window = 'five_hour' | 'seven_day';
13
+
14
+ /**
15
+ * Subscription usage over the run, per account (credential): for the weekly and
16
+ * the 5-hour window, the account's first reading and its last, and when each
17
+ * window resets. Readings come at session starts and are account-wide. The
18
+ * accounts are the run's (`journal`), or given (`accounts`: a hub's, over every
19
+ * run of every host, `Hosts.quota`). With the run's quota caps and rests
20
+ * (`caps`, `rests`, `rule`: `Plan.quota_caps`, `.rests`, `.quota_rule`), each
21
+ * window shows its cap, and each account whether it is paused and its rests.
22
+ */
23
+ @customElement('ca-quota')
24
+ @localized()
25
+ export class CaQuota extends LitElement {
26
+ static override styles = [
27
+ base,
28
+ css`
29
+ :host { display: block; container-type: inline-size; }
30
+ /* the bar keeps a width of its own, and ends near its figures on a wide card */
31
+ .rows { display: grid; grid-template-columns: max-content minmax(70px, 420px) max-content max-content; justify-content: start; gap: 10px 14px; align-items: center; }
32
+ .name { font-size: 12px; color: var(--text-2); white-space: nowrap; }
33
+ .bar { position: relative; height: 12px; border-radius: 4px; background: var(--track); overflow: hidden; }
34
+ .bar i { position: absolute; top: 0; bottom: 0; }
35
+ /* usage measures, it does not judge: neutral, attention from 80% (the number says it too) */
36
+ .bar .before { left: 0; background: var(--meter); opacity: 0.45; }
37
+ .bar .during { background: var(--meter); }
38
+ .bar.hot .during, .bar.full .during, .bar.hot .before, .bar.full .before { background: var(--status-attention); }
39
+ /* the cap: a line across the bar where the account is paused */
40
+ .bar .cap { width: 2px; margin-left: -1px; background: var(--text); opacity: 0.7; }
41
+ .val.hot b, .val.full b { color: var(--status-attention); }
42
+ .val { font-family: var(--mono); font-size: 12px; font-variant-numeric: tabular-nums; white-space: nowrap; }
43
+ .val b { color: var(--text); }
44
+ .val .lim { color: var(--text-muted); }
45
+ .reset { font-size: 11.5px; color: var(--text-muted); white-space: nowrap; }
46
+ /* a narrow card: the reset time goes under its bar */
47
+ @container (max-width: 460px) {
48
+ .rows { grid-template-columns: max-content minmax(70px, 1fr) max-content; row-gap: 2px; }
49
+ .reset { grid-column: 2 / -1; margin-bottom: 6px; }
50
+ }
51
+ .status { margin-top: 8px; }
52
+ .acct { padding: 10px 0; border-top: 1px solid var(--line); }
53
+ .acct:first-child { border-top: 0; padding-top: 0; }
54
+ .acct-h { display: flex; align-items: baseline; flex-wrap: wrap; gap: 8px; margin-bottom: 8px; font-size: 12px; }
55
+ .acct-h i { font-style: normal; color: var(--text-muted); font-size: 11px; }
56
+ .acct-h b { font-family: var(--mono); color: var(--text); font-weight: 600; }
57
+ .rests { margin: 8px 0 0; padding: 0; list-style: none; font-size: 11.5px; color: var(--text-2); }
58
+ .rests li { padding: 2px 0; }
59
+ .rule { margin-bottom: 10px; font-size: 12px; color: var(--text-2); }
60
+ .rule code { font-family: var(--mono); color: var(--text); }
61
+ `,
62
+ ];
63
+
64
+ @property({ attribute: false }) journal: JournalRow[] = [];
65
+ /** Each account's first and last reading, highest weekly use first; null: from `journal`. */
66
+ @property({ attribute: false }) accounts: readonly AccountUsage[] | null = null;
67
+ /** The run's quota caps, by credential (`Plan.quota_caps`). */
68
+ @property({ attribute: false }) caps: readonly QuotaCap[] = [];
69
+ /** Each rest of a credential in the run, in start order (`Plan.rests`). */
70
+ @property({ attribute: false }) rests: readonly CredentialRest[] = [];
71
+ /** The run's quota rule, `module.qualname` (`Plan.quota_rule`); '' for none. */
72
+ @property() rule = '';
73
+ /** The run is live: a rest with no reset time (a rule's) stands only while it is. */
74
+ @property({ type: Boolean }) live = false;
75
+
76
+ constructor() {
77
+ super();
78
+ new ClockController(this); // "resets in" counts down
79
+ }
80
+
81
+ private row(w: Window, name: string, first: QuotaReading, last: QuotaReading, cap: number | null | undefined) {
82
+ const a = first[`${w}_pct`];
83
+ const b = last[`${w}_pct`];
84
+ if (a == null && b == null) return nothing;
85
+ const from = Math.max(0, Math.min(100, a ?? b ?? 0));
86
+ const to = Math.max(from, Math.min(100, b ?? from));
87
+ const resets = last[`${w}_resets_at`];
88
+ const cls = to >= 100 || (cap != null && to >= cap) ? 'full' : to >= 80 ? 'hot' : '';
89
+ const limit = cap != null ? capLabel(cap) : '';
90
+ return html`<span class="name">${name}</span>
91
+ <span class="bar ${cls}" title=${limit ? `${pct(a)} → ${pct(b)} | ${limit}` : `${pct(a)} → ${pct(b)}`}>
92
+ <i class="before" style="width:${from}%"></i>
93
+ <i class="during" style="left:${from}%;width:${to - from}%"></i>
94
+ ${cap != null ? html`<i class="cap" style="left:${Math.min(100, cap)}%" aria-hidden="true"></i>` : nothing}
95
+ </span>
96
+ <span class="val ${cls}">${pct(a)} → <b>${pct(b)}</b>${limit ? html` <span class="lim">| ${limit}</span>` : nothing}</span>
97
+ <span class="reset" title=${resets ? localTime(resets, true) : ''}>${resetsIn(resets)}</span>`;
98
+ }
99
+
100
+ /**
101
+ * An account's pill while it is paused: `paused until 10/14 14:30`; nothing otherwise. A rest
102
+ * stands until it ended, until its window reset, and (a rule's, with no reset) while the run is live.
103
+ */
104
+ private paused(rests: readonly CredentialRest[]) {
105
+ const at = Date.now();
106
+ const now = rests.find((r) => !r.ended && (r.until ? Date.parse(r.until) > at : this.live));
107
+ if (!now) return nothing;
108
+ const text = now.until ? msg(str`paused until ${localTime(now.until, true)}`) : msg('paused');
109
+ return pill({ text, tone: 'attention', title: restFacts(now) });
110
+ }
111
+
112
+ override render() {
113
+ const accounts = this.accounts ?? runAccounts(this.journal);
114
+ if (!accounts.length && !this.rests.length) return nothing;
115
+ const caps = new Map(this.caps.map((c) => [c.credential, c]));
116
+ return html`${this.rule
117
+ ? html`<div class="rule" title="quota_rule">${msg('Usage rule')} <code>${this.rule}</code></div>`
118
+ : nothing}${accounts.map((a) => {
119
+ const status = quotaStatusLabel(a.last.status, a.last.status_window);
120
+ const cap = caps.get(a.credential);
121
+ const rests = this.rests.filter((r) => r.credential === a.credential && (!r.account || !a.account || r.account === a.account));
122
+ // One identity on two accounts (`default` on two coding agents, a replaced token): each named.
123
+ const twice = !!a.account && accounts.some((o) => o !== a && o.credential === a.credential);
124
+ return html`<div class="acct">
125
+ <div class="acct-h"><i>${msg('Identity')}</i><b>${credentialLabel(a.credential) || '—'}</b>${twice
126
+ ? html`<i title=${msg(str`Account: ${a.account ?? ''}`)}>${accountLabel(a.account ?? '')}</i>`
127
+ : nothing}${status
128
+ ? pill({ text: status, tone: 'attention', title: a.last.status, mark: null })
129
+ : nothing}${this.paused(rests)}${cap ? html`<i title="max_five_hour_pct, max_seven_day_pct">${capsLine(cap)}</i>` : nothing}</div>
130
+ <div class="rows">
131
+ ${this.row('seven_day', msg('Weekly usage'), a.first, a.last, cap?.seven_day_pct)}
132
+ ${this.row('five_hour', msg('5-hour usage'), a.first, a.last, cap?.five_hour_pct)}
133
+ </div>
134
+ ${this.restList(rests)}
135
+ </div>`;
136
+ })}${this.unread(accounts, caps)}`;
137
+ }
138
+
139
+ private restList(rests: readonly CredentialRest[]) {
140
+ return rests.length ? html`<ul class="rests" title="rests.jsonl">${rests.map((r) => html`<li>${restSpan(r)}</li>`)}</ul>` : nothing;
141
+ }
142
+
143
+ /** The accounts paused in the run with no reading in its journal (their reading came from an earlier run). */
144
+ private unread(accounts: readonly AccountUsage[], caps: ReadonlyMap<string, QuotaCap>) {
145
+ const shown = new Set(accounts.map((a) => a.credential));
146
+ const others = [...new Set(this.rests.map((r) => r.credential))].filter((c) => !shown.has(c));
147
+ return others.map((credential) => {
148
+ const rests = this.rests.filter((r) => r.credential === credential);
149
+ const cap = caps.get(credential);
150
+ return html`<div class="acct">
151
+ <div class="acct-h"><i>${msg('Identity')}</i><b>${credentialLabel(credential)}</b>${this.paused(rests)}${cap
152
+ ? html`<i title="max_five_hour_pct, max_seven_day_pct">${capsLine(cap)}</i>`
153
+ : nothing}</div>
154
+ ${this.restList(rests)}
155
+ </div>`;
156
+ });
157
+ }
158
+ }
159
+
160
+ declare global {
161
+ interface HTMLElementTagNameMap {
162
+ 'ca-quota': CaQuota;
163
+ }
164
+ }
@@ -0,0 +1,140 @@
1
+ import { elapsedS, result, runActivity, type HostSummary, type Plan, type Procs, type RunSummary } from '@contraagent/api';
2
+ import { localized, msg, str } from '@lit/localize';
3
+ import { LitElement, css, html, nothing } from 'lit';
4
+ import { customElement, property } from 'lit/decorators.js';
5
+ import { starts } from '@contraagent/elements';
6
+ import { facts, fmtDur, localTime, sentence } from '../../words/format.js';
7
+ import { hostFact, lastReport, noReportLabel } from '../../words/hosts.js';
8
+ import { preflightLabel, preflightStoppedCause, preflightStoppedTitle, preflightTip } from '../../words/preflight.js';
9
+ import { preflightRows } from '../../adapters/preflight.js';
10
+ import { toneAttr, type Tone } from '@contraagent/elements';
11
+ import { base, factStyles } from '@contraagent/elements/styles';
12
+ import '@contraagent/elements/count/define';
13
+
14
+ /** The mark of how a run ended (■ for a run with no tasks). */
15
+ const MARK: Record<Tone, string> = { failed: '✕', attention: '◌', done: '✓', running: '', muted: '■', neutral: '■' };
16
+
17
+ /**
18
+ * The run's own process: running (pid, run group, how many tasks at once,
19
+ * command line), or not running, and then how it finished: with errors, or with
20
+ * tasks not done (from `plan`). On a hub, a run whose host stopped reporting
21
+ * (`summary.unresponsive`) is neither: no report from its host, since `host.last_seen`.
22
+ * Under it, the models the run's preflight found available, replaced or not
23
+ * available (`plan.preflight`); a run its preflight ended names the kinds that did it.
24
+ */
25
+ @customElement('ca-run-driver')
26
+ @localized()
27
+ export class CaRunDriver extends LitElement {
28
+ static override styles = [
29
+ base,
30
+ factStyles,
31
+ css`
32
+ :host { display: block; }
33
+ .drv { display: flex; gap: 14px; align-items: flex-start; }
34
+ .drv-ic { width: 42px; height: 42px; border-radius: 12px; flex: none; display: grid; place-items: center; font-size: 16px;
35
+ background: var(--raise); color: var(--text-muted); }
36
+ .drv.on .drv-ic { background: var(--status-running-bg); box-shadow: 0 0 0 1px color-mix(in srgb, var(--status-running) 35%, transparent), 0 0 22px var(--status-running-bg); }
37
+ /* how a run ended: the mark's shape and the title's words carry it; the colour only where a status applies */
38
+ .drv-ic[data-tone] { color: var(--tone); font-weight: 700; }
39
+ .drv-ic[data-tone='failed'], .drv-ic[data-tone='attention'] { background: var(--tone-bg); }
40
+ .drv.on .drv-ic .spin { width: 18px; height: 18px; }
41
+ .drv-t { font-size: 15px; font-weight: 600; }
42
+ .drv-up { font-family: var(--mono); font-size: 12px; color: var(--status-running); margin-left: 6px; font-weight: 400; }
43
+ .drv-cmd { margin-top: 8px; }
44
+ .drv-cmd summary { cursor: pointer; font-size: 11px; color: var(--text-muted); }
45
+ .pf { margin-top: 10px; font-size: 12px; }
46
+ .pf-h { color: var(--text-muted); font-size: 11px; margin-bottom: 4px; }
47
+ /* a label, then its fact: one row each, the facts in one column */
48
+ .pf-rows { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: 3px 12px; margin: 0; }
49
+ .pf-rows dt { color: var(--text-muted); }
50
+ .pf-rows dt[data-tone] { color: var(--tone); }
51
+ .pf-rows dd { margin: 0; color: var(--text-2); overflow-wrap: anywhere; }
52
+ .drv-cmd code { display: block; margin-top: 4px; white-space: pre-wrap; word-break: break-all; color: var(--text-2); max-height: 120px; overflow: auto; }
53
+ `,
54
+ ];
55
+
56
+ @property({ attribute: false }) procs: Procs | null = null;
57
+ @property({ attribute: false }) summary: RunSummary | undefined;
58
+ @property({ attribute: false }) plan: Plan = { nodes: [], groups: [] };
59
+ /** The run's host (a hub): when it last reported. */
60
+ @property({ attribute: false }) host: HostSummary | undefined;
61
+
62
+ /**
63
+ * How a run that is not running ended, as its title: everything scheduled ran
64
+ * (finished), with or without failed or not-started tasks, or some tasks never got their turn (stopped).
65
+ */
66
+ private stateTitle(): [text: string, tone: Tone] {
67
+ if (this.plan.preflight?.stopped?.length) return [preflightStoppedTitle(), 'failed'];
68
+ if (!this.plan.nodes.length) return [msg('Not running'), 'neutral'];
69
+ const r = result(this.plan);
70
+ if (r.failed) return [r.failed === 1 ? msg('Finished with 1 task failed') : msg(str`Finished with ${r.failed} tasks failed`), 'failed'];
71
+ if (r.left) return [r.left === 1 ? msg('Finished with 1 task not done') : msg(str`Finished with ${r.left} tasks not done`), 'attention'];
72
+ if (r.notStarted) return [r.notStarted === 1 ? msg('Finished with 1 task not started') : msg(str`Finished with ${r.notStarted} tasks not started`), 'attention'];
73
+ return [msg('Finished'), 'done'];
74
+ }
75
+
76
+ override render() {
77
+ const p = this.procs;
78
+ const r = this.summary;
79
+ if (!p?.alive) {
80
+ // Its host stopped reporting (a hub): not known to run, not known to have ended.
81
+ const quiet = runActivity(r) === 'unresponsive';
82
+ const [title, tone]: [string, Tone] = quiet ? [sentence(noReportLabel()), 'attention'] : this.stateTitle();
83
+ const took = quiet ? null : elapsedS(r);
84
+ return html`<div class="drv off">
85
+ <div class="drv-ic" data-tone=${toneAttr(tone)} aria-hidden="true">${MARK[tone]}</div>
86
+ <div>
87
+ <div class="drv-t tone-text" data-tone=${tone === 'done' ? nothing : toneAttr(tone)}>${title}</div>
88
+ <div class="meta">${facts(
89
+ this.plan.preflight?.stopped?.length ? preflightStoppedCause(this.plan.preflight.stopped) : '',
90
+ quiet ? lastReport(this.host) : '',
91
+ !r?.last_ts ? msg('No activity') : quiet ? msg(str`Last activity ${localTime(r.last_ts, true)}`) : msg(str`Ended ${localTime(r.last_ts, true)}`),
92
+ took == null ? '' : msg(str`Took ${fmtDur(took)}`),
93
+ r?.run_group ? msg(str`Run group ${r.run_group}`) : '',
94
+ quiet ? hostFact(r?.host_id ?? '') : '',
95
+ )}</div>
96
+ ${this.preflight()}
97
+ </div>
98
+ </div>`;
99
+ }
100
+ const started = Date.parse(p.started_at);
101
+ const since = starts.at(`drv:${p.pid ?? ''}`, Number.isNaN(started) ? 1 : (Date.now() - started) / 1000);
102
+ const rows: [string, string | number][] = [
103
+ [msg('PID'), p.pid ?? '—'],
104
+ [msg('Run group'), p.run_group],
105
+ [msg('Running at once (limit)'), p.max_workers || '—'],
106
+ [msg('Started'), localTime(p.started_at, true)],
107
+ ];
108
+ return html`<div class="drv on">
109
+ <div class="drv-ic"><span class="spin"></span></div>
110
+ <div style="min-width:0">
111
+ <div class="drv-t">${msg('Running')} <cae-elapsed class="drv-up" .since=${since}></cae-elapsed></div>
112
+ <div class="drv-facts">${rows.map(([k, v]) => html`<span><i>${k}</i>${v}</span>`)}</div>
113
+ ${this.preflight()}
114
+ <details class="drv-cmd"><summary>${msg('Command line')}</summary><code>${p.argv.join(' ')}</code></details>
115
+ </div>
116
+ </div>`;
117
+ }
118
+
119
+ /** The preflight's rows under their label; nothing for a run with no preflight. */
120
+ private preflight() {
121
+ const pf = this.plan.preflight;
122
+ const rows = preflightRows(pf);
123
+ if (!pf || !rows.length) return nothing;
124
+ return html`<div class="pf">
125
+ <div class="pf-h" title=${preflightTip(pf.policy)}>${preflightLabel()}</div>
126
+ <dl class="pf-rows">
127
+ ${rows.map(
128
+ (r) => html`<dt data-tone=${toneAttr(r.tone)} title=${r.tip || nothing}>${r.label}</dt><dd class="jmono">${r.text}</dd>`,
129
+ )}
130
+ </dl>
131
+ </div>`;
132
+ }
133
+ }
134
+
135
+ declare global {
136
+ interface HTMLElementTagNameMap {
137
+ 'ca-run-driver': CaRunDriver;
138
+ }
139
+ }
140
+
@@ -0,0 +1,66 @@
1
+ import type { PlanNode, ServiceSpan } from '@contraagent/api';
2
+ import { localized, msg } from '@lit/localize';
3
+ import { LitElement, css, html, nothing } from 'lit';
4
+ import { customElement, property } from 'lit/decorators.js';
5
+ import { statusWord } from '@contraagent/elements/primitives';
6
+ import { base } from '@contraagent/elements/styles';
7
+ import type { Tone } from '@contraagent/elements';
8
+ import { kindUnit } from '../../words/format.js';
9
+ import { serviceFacts, serviceState, serviceStateLabel, type ServiceState } from '../../words/services.js';
10
+ import { taskChip } from '../shared/task-chip.js';
11
+
12
+ const TONE: Record<ServiceState, Tone> = { running: 'running', stopped: 'done', failed: 'failed', unknown: 'muted' };
13
+
14
+ /**
15
+ * The run's services (`Plan.services`): each start of the long-lived helper a claim
16
+ * name stands for, one per row, with its state, its claim name, its address, when it
17
+ * started and stopped and why, and the task whose claim started it.
18
+ *
19
+ * @fires ca-open-task - the task chip of the task that started a service was clicked
20
+ */
21
+ @customElement('ca-services')
22
+ @localized()
23
+ export class CaServices extends LitElement {
24
+ static override styles = [
25
+ base,
26
+ css`
27
+ :host { display: block; }
28
+ ul { margin: 0; padding: 0; list-style: none; display: grid; gap: 8px; }
29
+ li { display: grid; grid-template-columns: max-content 1fr; column-gap: 10px; row-gap: 2px; align-items: baseline; font-size: 12px; }
30
+ .name { font-family: var(--mono); color: var(--text); overflow-wrap: anywhere; }
31
+ .addr { font-family: var(--mono); color: var(--text-2); overflow-wrap: anywhere; }
32
+ .facts { grid-column: 2; color: var(--text-2); overflow-wrap: anywhere; }
33
+ .by { grid-column: 2; }
34
+ `,
35
+ ];
36
+
37
+ /** Each start of a service, in start order (`Plan.services`). */
38
+ @property({ attribute: false }) services: readonly ServiceSpan[] = [];
39
+ /** The run's tasks (`Plan.nodes`): the task that started a service is named by its kind and unit. */
40
+ @property({ attribute: false }) nodes: readonly PlanNode[] = [];
41
+ /** Whether the run still runs: a service with no stop recorded is running only then. */
42
+ @property({ type: Boolean }) live = false;
43
+
44
+ override render() {
45
+ if (!this.services.length) return html`<div class="meta">${msg('No services')}</div>`;
46
+ const byKey = new Map(this.nodes.map((n) => [n.key, n]));
47
+ return html`<ul>
48
+ ${this.services.map((s) => {
49
+ const state = serviceState(s, this.live);
50
+ const node = s.key ? byKey.get(s.key) : undefined;
51
+ return html`<li>
52
+ ${statusWord({ text: serviceStateLabel(state), tone: TONE[state] })}
53
+ <div><span class="name" title="services.jsonl">${s.name}</span>${s.address ? html` <span class="addr">${s.address}</span>` : nothing}</div>
54
+ <div class="facts">${serviceFacts(s)}</div>
55
+ ${s.key ? html`<div class="by">${taskChip(this, node ? kindUnit(node) : s.key, node ?? { key: s.key })}</div>` : nothing}
56
+ </li>`;
57
+ })}
58
+ </ul>`;
59
+ }
60
+ }
61
+
62
+ declare global {
63
+ interface HTMLElementTagNameMap {
64
+ 'ca-services': CaServices;
65
+ }
66
+ }
@@ -0,0 +1,107 @@
1
+ import { spendByKind, spendByTask, spendOf, totalTokens, type JournalRow, type Spend } from '@contraagent/api';
2
+ import { localized, msg, str } from '@lit/localize';
3
+ import { LitElement, css, html, nothing } from 'lit';
4
+ import { customElement, property } from 'lit/decorators.js';
5
+ import { repeat } from 'lit/directives/repeat.js';
6
+ import { emit } from '../../core/events.js';
7
+ import { facts, kindUnit, tokenCount, usd } from '../../words/format.js';
8
+ import { base } from '@contraagent/elements/styles';
9
+ import { legend, legendStyles } from '@contraagent/elements/primitives';
10
+
11
+ type Part = 'input' | 'cache_read' | 'cache_creation' | 'output';
12
+ const PARTS: readonly Part[] = ['input', 'cache_read', 'cache_creation', 'output'];
13
+
14
+ /**
15
+ * Where a run's tokens and cost went: per kind, a bar of its tokens (input,
16
+ * cache read, cache write, output) with its cost and share of the run's cost,
17
+ * most expensive first; then the most expensive tasks.
18
+ *
19
+ * @fires ca-open-task - `{key}`: one of the most expensive tasks was clicked
20
+ */
21
+ @customElement('ca-spend-breakdown')
22
+ @localized()
23
+ export class CaSpendBreakdown extends LitElement {
24
+ static override styles = [
25
+ base,
26
+ legendStyles,
27
+ css`
28
+ :host { display: block; }
29
+ /* the bar's track is bounded, so its figures stay beside it on a wide card */
30
+ .kinds { display: grid; grid-template-columns: minmax(70px, max-content) minmax(0, 420px) max-content max-content; justify-content: start; gap: 8px 14px; align-items: center; }
31
+ .kind { font-family: var(--mono); font-size: 12px; color: var(--text-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
32
+ .bar { display: flex; height: 12px; border-radius: 4px; overflow: hidden; background: var(--track); }
33
+ .bar i { display: block; height: 100%; }
34
+ .num { font-variant-numeric: tabular-nums; text-align: right; font-size: 12px; white-space: nowrap; }
35
+ .share { color: var(--text-muted); min-width: 3.5em; }
36
+ .seg-input { background: var(--tok-input); }
37
+ .seg-cache_read { background: var(--tok-cache-read); }
38
+ .seg-cache_creation { background: var(--tok-cache-write); }
39
+ .seg-output { background: var(--tok-output); }
40
+ .legend { margin-top: 10px; }
41
+ h4 { margin: 16px 0 6px; font-size: 12px; color: var(--text-2); font-weight: 600; }
42
+ .top { display: grid; grid-template-columns: minmax(0, max-content) 64px 64px max-content; column-gap: 20px; row-gap: 4px; align-items: baseline; }
43
+ .top a { font-family: var(--mono); font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
44
+ `,
45
+ ];
46
+
47
+ @property({ attribute: false }) journal: JournalRow[] = [];
48
+ /** How many of the most expensive tasks to list. */
49
+ @property({ type: Number }) top = 5;
50
+
51
+ private partLabel(p: Part): string {
52
+ switch (p) {
53
+ case 'input':
54
+ return msg('input');
55
+ case 'cache_read':
56
+ return msg('cache read');
57
+ case 'cache_creation':
58
+ return msg('cache write');
59
+ case 'output':
60
+ return msg('output');
61
+ }
62
+ }
63
+
64
+ private bar(s: Spend, max: number) {
65
+ const total = totalTokens(s);
66
+ const width = max ? (100 * total) / max : 0;
67
+ const tip = facts(...PARTS.map((p) => `${this.partLabel(p)} ${tokenCount(s[p])}`));
68
+ return html`<div class="bar" title=${tip} style="width:${Math.max(width, 0.5).toFixed(2)}%">
69
+ ${PARTS.map((p) => (s[p] && total ? html`<i class="seg-${p}" style="width:${((100 * s[p]) / total).toFixed(2)}%"></i>` : nothing))}
70
+ </div>`;
71
+ }
72
+
73
+ override render() {
74
+ if (!spendOf(this.journal)) return html`<div class="meta">${msg('No tokens reported')}</div>`;
75
+ const kinds = spendByKind(this.journal);
76
+ const max = Math.max(1, ...kinds.map((k) => totalTokens(k.spend)));
77
+ const tasks = spendByTask(this.journal).slice(0, this.top);
78
+ return html`<div class="kinds">
79
+ ${repeat(
80
+ kinds,
81
+ (k) => k.id,
82
+ (k) => html`<span class="kind" title=${k.id}>${k.id}</span>${this.bar(k.spend, max)}
83
+ <span class="num">${facts(tokenCount(totalTokens(k.spend)), usd(k.spend.cost))}</span>
84
+ <span class="num share">${k.share !== null ? `${Math.round(k.share * 100)}%` : ''}</span>`,
85
+ )}
86
+ </div>
87
+ ${legend(PARTS.map((p) => ({ label: this.partLabel(p), cls: `seg-${p}` })))}
88
+ <h4>${msg('Most expensive tasks')}</h4>
89
+ <div class="top">
90
+ ${tasks.map(
91
+ (t) => html`<a class="lnk" href="#" title=${t.id} @click=${(e: Event) => {
92
+ e.preventDefault();
93
+ emit(this, 'ca-open-task', { key: t.id });
94
+ }}>${kindUnit(t)}</a>
95
+ <span class="num">${tokenCount(totalTokens(t.spend))}</span>
96
+ <span class="num">${usd(t.spend.cost)}</span>
97
+ <span class="num share">${t.share !== null ? msg(str`${Math.round(t.share * 100)}%`) : ''}</span>`,
98
+ )}
99
+ </div>`;
100
+ }
101
+ }
102
+
103
+ declare global {
104
+ interface HTMLElementTagNameMap {
105
+ 'ca-spend-breakdown': CaSpendBreakdown;
106
+ }
107
+ }
@@ -0,0 +1,57 @@
1
+ import { deriveRun, liveActivities, type JournalRow, type Plan, type Procs } from '@contraagent/api';
2
+ import { localized, msg, str } from '@lit/localize';
3
+ import { LitElement, css, html } from 'lit';
4
+ import { customElement, property } from 'lit/decorators.js';
5
+ import { keyed } from 'lit/directives/keyed.js';
6
+ import { starts } from '@contraagent/elements';
7
+ import { base } from '@contraagent/elements/styles';
8
+ import '@contraagent/elements/lanes/define';
9
+ import type { LanesStrings } from '@contraagent/elements/lanes';
10
+ import { laneStyles, lanesFromJournal } from '../../adapters/lanes.js';
11
+ import { getLocale } from '../../core/i18n.js';
12
+
13
+ /**
14
+ * Every finished attempt as a bar as long as it took, on its kind's lane, the
15
+ * running ones growing until now (the last six hours of the run), as
16
+ * `<cae-lanes>` (`lanesFromJournal`).
17
+ */
18
+ @customElement('ca-timeline')
19
+ @localized()
20
+ export class CaTimeline extends LitElement {
21
+ static override styles = [base, css`:host { display: block; }`];
22
+
23
+ @property({ attribute: false }) journal: JournalRow[] = [];
24
+ /** The run's plan: with the journal, why a task did not start, as the tasks list says it. Optional. */
25
+ @property({ attribute: false }) plan: Plan | null = null;
26
+ @property({ attribute: false }) procs: Procs | null = null;
27
+ /** The run is live: its running tasks are drawn, growing every second. */
28
+ @property({ type: Boolean }) live = false;
29
+ /** The run drawn; the bars grow in when a run is first drawn, not on every update. */
30
+ @property() run = '';
31
+
32
+ override render() {
33
+ const now = Date.now();
34
+ const live = this.live
35
+ ? liveActivities(this.procs).map((a) => ({ kind: a.kind, cls: a.cls, t0: starts.at(a.id, a.ageS, now) }))
36
+ : [];
37
+ const tl = lanesFromJournal(this.journal, live, deriveRun(this.journal, this.plan).outcomes, this.run);
38
+ if (!tl)
39
+ return html`<div class="blank" style="padding:28px"><span class="ic" aria-hidden="true">⏱</span>${this.live
40
+ ? msg('No finished attempts yet')
41
+ : msg('No finished attempts')}</div>`;
42
+ const strings: Partial<LanesStrings> = {
43
+ omitted: (n) => (n === 1 ? msg('1 older attempt not shown') : msg(str`${n} older attempts not shown`)),
44
+ };
45
+ return keyed(
46
+ this.run,
47
+ html`<cae-lanes .lanes=${tl.lanes} .barStyles=${laneStyles()} .omitted=${tl.omitted} ?live=${this.live}
48
+ locale=${getLocale()} .strings=${strings}></cae-lanes>`,
49
+ );
50
+ }
51
+ }
52
+
53
+ declare global {
54
+ interface HTMLElementTagNameMap {
55
+ 'ca-timeline': CaTimeline;
56
+ }
57
+ }
@@ -0,0 +1,82 @@
1
+ import { liveActivities, type Procs } from '@contraagent/api';
2
+ import { localized, msg } from '@lit/localize';
3
+ import { LitElement, css, html } from 'lit';
4
+ import { customElement, property } from 'lit/decorators.js';
5
+ import { repeat } from 'lit/directives/repeat.js';
6
+ import { emit } from '../../core/events.js';
7
+ import { starts } from '@contraagent/elements';
8
+ import { base } from '@contraagent/elements/styles';
9
+ import '@contraagent/elements/count/define';
10
+ import { executorIcon } from '../../words/executor.js';
11
+
12
+ /**
13
+ * What runs now: one card per running task (an agent session opens its
14
+ * transcript), the rest idle, up to the number of tasks the run runs at once
15
+ * (`max_concurrent`). Sends `ca-open-task`.
16
+ *
17
+ * @fires ca-open-task - `{key}`: a running agent launch was clicked
18
+ */
19
+ @customElement('ca-workers')
20
+ @localized()
21
+ export class CaWorkers extends LitElement {
22
+ static override styles = [
23
+ base,
24
+ css`
25
+ :host { display: block; container-type: inline-size; }
26
+ .wks { display: grid; grid-template-columns: repeat(var(--n, 3), minmax(0, 1fr)); gap: 10px; }
27
+ @container (max-width: 860px) { .wks { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
28
+ @container (max-width: 360px) { .wks { grid-template-columns: minmax(0, 1fr); } }
29
+ .wk { border-radius: 11px; padding: 10px 12px; border: 1px solid var(--line); background: color-mix(in srgb, var(--text) 2.5%, transparent); min-width: 0;
30
+ position: relative; overflow: hidden; display: block; width: 100%; color: inherit; text-align: start; }
31
+ .wk > .meta { display: block; }
32
+ .wk.py, .wk.llm { border-color: var(--line2); }
33
+ .wk.llm { box-shadow: inset 3px 0 0 -1px color-mix(in srgb, var(--agent) 60%, transparent); cursor: pointer; }
34
+ .wk.llm:hover { border-color: var(--accent); }
35
+ .wk.idle { opacity: 0.45; border-style: dashed; }
36
+ .wk-top { display: flex; align-items: center; gap: 8px; min-width: 0; }
37
+ .wk-top b { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
38
+ .wk-ic { width: 24px; height: 24px; border-radius: 7px; flex: none; display: grid; place-items: center; background: var(--raise); font-size: 12px; }
39
+ .wk.llm .wk-ic { color: var(--agent); }
40
+ .wk.py .wk-ic { color: var(--text-muted); }
41
+ .wk-el { margin-left: auto; font-family: var(--mono); font-size: 11.5px; color: var(--status-running); }
42
+ .wk-bar { position: absolute; left: 0; right: 0; bottom: 0; height: 2px; overflow: hidden; }
43
+ .wk-bar i { position: absolute; top: 0; bottom: 0; width: 30%; background: linear-gradient(90deg, transparent, var(--status-running), transparent);
44
+ animation: scan 1.8s linear infinite; }
45
+ `,
46
+ ];
47
+
48
+ @property({ attribute: false }) procs: Procs | null = null;
49
+ /** The run is live; when not, every slot is idle. */
50
+ @property({ type: Boolean }) live = false;
51
+
52
+ override render() {
53
+ const work = this.live ? liveActivities(this.procs) : [];
54
+ const max = Math.max(this.procs?.max_workers || 1, work.length);
55
+ const free = Array.from({ length: max - work.length }, (_, i) => i);
56
+ return html`<div class="wks" style="--n:${Math.min(max, 6)}">
57
+ ${repeat(
58
+ work,
59
+ (a) => a.id,
60
+ (a) => {
61
+ const body = html`<span class="wk-top">${executorIcon(a.cls !== 'llm', a.cls === 'llm' ? msg('Agent task') : msg('Python task'), 'wk-ic')}<b>${a.kind}</b>
62
+ <cae-elapsed class="wk-el" .since=${starts.at(a.id, a.ageS)}></cae-elapsed></span>
63
+ <span class="meta">${a.detail}</span>
64
+ <span class="wk-bar"><i></i></span>`;
65
+ // A slot with a task opens it: a button.
66
+ return a.key
67
+ ? html`<button type="button" class="wk ${a.cls}" @click=${() => emit(this, 'ca-open-task', { key: a.key })}>${body}</button>`
68
+ : html`<div class="wk ${a.cls}">${body}</div>`;
69
+ },
70
+ )}
71
+ ${free.map(
72
+ () => html`<div class="wk idle"><div class="wk-top"><b>${msg('Idle')}</b></div></div>`,
73
+ )}
74
+ </div>`;
75
+ }
76
+ }
77
+
78
+ declare global {
79
+ interface HTMLElementTagNameMap {
80
+ 'ca-workers': CaWorkers;
81
+ }
82
+ }
@@ -0,0 +1,10 @@
1
+ export * from './ca-overview.js';
2
+ export * from './ca-run-driver.js';
3
+ export * from './ca-workers.js';
4
+ export * from './ca-pipeline-graph.js';
5
+ export * from './ca-kpis.js';
6
+ export * from './ca-timeline.js';
7
+ export * from './ca-spend-breakdown.js';
8
+ export * from './ca-model-usage.js';
9
+ export * from './ca-quota.js';
10
+ export * from './ca-services.js';