@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,146 @@
1
+ // What the pipeline graph says about its nodes and marks. Pure: each depends only on
2
+ // its arguments (`live`: the run is running, so a pending task waits rather than did
3
+ // not run).
4
+ import { planOutcome, type PlanNode, type TaskState } from '@contraagent/api';
5
+ import type { StateStyle, StateStyles } from '@contraagent/elements/primitives';
6
+ import { msg, str } from '@lit/localize';
7
+ import { facts, fmtDur, kindUnit, listText } from '../../words/format.js';
8
+ import { passesRan, stateCount, taskStatusLabel } from '../../words/index.js';
9
+ import { SEVERITY } from './states.js';
10
+ import type { GraphNode, LayerGraph, LayerMark, NodeCounts } from './types.js';
11
+
12
+ /** The states the legend can show, in this order; it shows the ones the view has. */
13
+ export const LEGEND: readonly TaskState[] = ['done', 'partial', 'running', 'pending', 'failed', 'blocked', 'skipped'];
14
+
15
+ /** How each task state looks: done round, partly done half filled, running round and breathing, waiting a ring, failed square, not started hatched, skipped muted. */
16
+ const LOOKS: Record<TaskState, Pick<StateStyle, 'tone' | 'shape'>> = {
17
+ done: { tone: 'done', shape: 'round' },
18
+ partial: { tone: 'attention', shape: 'half' },
19
+ running: { tone: 'running', shape: 'round' },
20
+ pending: { tone: 'neutral', shape: 'ring' },
21
+ failed: { tone: 'failed', shape: 'square' },
22
+ blocked: { tone: 'attention', shape: 'hatched' },
23
+ skipped: { tone: 'muted', shape: 'round' },
24
+ };
25
+
26
+ /** The task states as the graph draws them, in the legend's order (`live`: a pending task waits; else it did not run). */
27
+ export function taskStateStyles(live: boolean): StateStyles {
28
+ return Object.fromEntries(
29
+ LEGEND.map((s): [string, StateStyle] => [s, { ...LOOKS[s], label: stateWord(s, live), rank: SEVERITY[s], count: (n) => countOf(s, n, live) }]),
30
+ );
31
+ }
32
+
33
+ /** A pending task waits while the run runs; once the run is over, it did not run. */
34
+ export function stateWord(s: TaskState, live: boolean): string {
35
+ return taskStatusLabel(planOutcome(s), live);
36
+ }
37
+
38
+ /** How many marks are in a state, number first: "3 failed". */
39
+ export function countOf(s: TaskState, n: number, live: boolean): string {
40
+ const o = planOutcome(s);
41
+ return stateCount(o === 'waiting' && !live ? 'not_run' : o, n);
42
+ }
43
+
44
+ /** How many tasks are in each state, in words: "2 done | 1 failed". */
45
+ export function stateCounts(c: NodeCounts, live: boolean): string {
46
+ return facts(...LEGEND.filter((s) => c[s]).map((s) => countOf(s, c[s], live)));
47
+ }
48
+
49
+ /** How many tasks are done (plan state done: done, and done after retrying): "5 of 6 tasks done". Skipped tasks are counted apart. */
50
+ export function doneOf(c: NodeCounts): string {
51
+ return msg(str`${c.done} of ${c.total} tasks done`);
52
+ }
53
+
54
+ /** The tasks that are not done, by state, most severe first: "1 failed", "1 not started", "1 partly done". */
55
+ export function notDone(c: NodeCounts, live: boolean): string[] {
56
+ return (['failed', 'blocked', 'partial', 'running', 'pending', 'skipped'] as const).filter((s) => c[s]).map((s) => countOf(s, c[s], live));
57
+ }
58
+
59
+ /** A fact's class: failed, not started or partly done, running, or muted (waiting, not run, skipped). */
60
+ export type ExceptionClass = 'err' | 'warn' | 'live' | 'mut';
61
+
62
+ /** What a node needs a word for: its tasks that are not done, by state, and its flow calls that stopped with an error. */
63
+ export function exceptions(n: Pick<GraphNode, 'counts' | 'errors'>, live: boolean): [ExceptionClass, string][] {
64
+ const c = n.counts;
65
+ const out: [ExceptionClass, string][] = [];
66
+ if (c.failed) out.push(['err', countOf('failed', c.failed, live)]);
67
+ if (n.errors) out.push(['err', n.errors === 1 ? msg('1 flow call stopped with an error') : msg(str`${n.errors} flow calls stopped with an error`)]);
68
+ if (c.blocked) out.push(['warn', countOf('blocked', c.blocked, live)]);
69
+ if (c.partial) out.push(['warn', countOf('partial', c.partial, live)]);
70
+ if (c.running) out.push(['live', countOf('running', c.running, live)]);
71
+ if (c.pending) out.push(['mut', countOf('pending', c.pending, live)]);
72
+ if (c.skipped) out.push(['mut', countOf('skipped', c.skipped, live)]);
73
+ return out;
74
+ }
75
+
76
+ /** Where a loop is: `flow.py:130` (the file's name and the loop's first line), or `line 130` when the file is not known. */
77
+ export function where(line: number | string, file?: string): string {
78
+ const name = file ? file.slice(file.lastIndexOf('/') + 1) : '';
79
+ return name ? `${name}:${line}` : msg(str`line ${line}`);
80
+ }
81
+
82
+ /** Who runs a kind node's tasks, in the words the Tasks list uses. */
83
+ export function executorWord(n: Pick<GraphNode, 'executor'>): string {
84
+ if (n.executor === 'agent') return msg('Agent task');
85
+ if (n.executor === 'python') return msg('Python task');
86
+ return n.executor === 'mixed' ? facts(msg('Agent task'), msg('Python task')) : '';
87
+ }
88
+
89
+ /** A node's tooltip: what it is, and its tasks done. */
90
+ export function nodeTip(n: GraphNode): string {
91
+ if (n.type !== 'flow') return facts(n.label, executorWord(n), doneOf(n.counts));
92
+ return facts(msg(str`Function ${n.name}`), n.timeBox ? msg(str`Deadline ${fmtDur(n.timeBox.deadline_s)}`) : '', doneOf(n.counts));
93
+ }
94
+
95
+ /** The names of the nodes `n` waits for, was created after, and feeds. */
96
+ export function neighbours(n: GraphNode, g: Pick<LayerGraph, 'nodes' | 'edges' | 'stubs'>): { waits: string[]; after: string[]; feeds: string[] } {
97
+ const label = (id: string) => {
98
+ const x = g.nodes.find((y) => y.id === id);
99
+ return !x ? id : x.box ? msg(str`${x.label} in the loop`) : x.label;
100
+ };
101
+ const into = (type: 'after' | 'created') => [
102
+ ...g.stubs.filter((s) => s.to === n.id && s.type === type).map((s) => s.label),
103
+ ...g.edges.filter((e) => e.to === n.id && e.type === type).map((e) => label(e.from)),
104
+ ];
105
+ return { waits: into('after'), after: into('created'), feeds: [...new Set(g.edges.filter((e) => e.from === n.id).map((e) => label(e.to)))] };
106
+ }
107
+
108
+ /** The node for a screen reader: its counts, and the nodes it waits for, was created after and feeds. */
109
+ export function nodeLabel(n: GraphNode, g: Pick<LayerGraph, 'nodes' | 'edges' | 'stubs'>, live: boolean): string {
110
+ const c = n.counts;
111
+ const { waits, after, feeds } = neighbours(n, g);
112
+ return [
113
+ n.type === 'flow' ? facts(msg(str`Function ${n.label}`), doneOf(c)) : facts(n.label, executorWord(n), doneOf(c)),
114
+ ...exceptions(n, live).map(([, t]) => t),
115
+ waits.length ? msg(str`Waits for: ${listText(waits)}`) : '',
116
+ after.length ? msg(str`Created after: ${listText(after)}`) : '',
117
+ feeds.length ? msg(str`Later tasks: ${listText(feeds)}`) : '',
118
+ ]
119
+ .filter(Boolean)
120
+ .join('. ');
121
+ }
122
+
123
+ /** What a mark's words come from: its task (none for a flow call's mark), why a task did not start, and the run being live. */
124
+ export interface MarkContext {
125
+ task: PlanNode | undefined;
126
+ causeOf: (key: string) => string;
127
+ live: boolean;
128
+ }
129
+
130
+ /** What a mark says: its name, state, passes, attempts, tasks and time, for its tooltip and its label. */
131
+ export function markText(label: string, m: LayerMark, x: MarkContext, pass = ''): { name: string; parts: string[]; id: string } {
132
+ const t = m.flow ? undefined : x.task;
133
+ // A mark of one task is named by its kind: a group's node holds several kinds (the implementations of a base kind).
134
+ const name = kindUnit({ kind: m.count === 1 && t ? t.kind : label, unit: m.unit });
135
+ const cause = !m.flow && m.state === 'blocked' ? x.causeOf(m.key) : '';
136
+ const state = cause ? msg(str`Not started: ${cause}`) : stateWord(m.state, x.live);
137
+ const attempts = t?.attempts ?? 1;
138
+ const tries = attempts > 1 ? msg(str`${attempts} attempts`) : '';
139
+ const passes = m.passes ? passesRan(m.passes) : '';
140
+ const many = m.flow || m.count > 1 ? msg(str`${m.count} tasks`) : '';
141
+ // A flow call's tasks that are not done, and its own error: what its state comes from.
142
+ const not = m.counts ? notDone(m.counts, x.live) : [];
143
+ const error = m.error === undefined ? [] : [msg('Flow call stopped with an error'), m.error];
144
+ const time = !m.flow && (m.state === 'done' || m.state === 'partial' || m.state === 'failed') && t?.wall_s ? fmtDur(t.wall_s) : '';
145
+ return { name, parts: [state, pass, passes, tries, many, ...not, ...error, time].filter(Boolean), id: m.flow ? msg(str`Flow call ${m.key}`) : m.key };
146
+ }
@@ -0,0 +1,22 @@
1
+ // Pure functions from contraagent's run data to what the generic elements of
2
+ // `@contraagent/elements` take: the lists' filters, the columns of the tasks
3
+ // list and the history, the figures' tiles, the timeline's lanes, a checked
4
+ // file's rows, the pipeline graph's layers and loops' passes, and a transcript's
5
+ // sections.
6
+ export * from './filters.js';
7
+ export * from './task-columns.js';
8
+ export * from './journal-columns.js';
9
+ export * from './kpi-tiles.js';
10
+ export * from './lanes.js';
11
+ export * from './check-rows.js';
12
+ export * from './model-shares.js';
13
+ export * from './trends.js';
14
+ export { graphFromPlan, graphInput, matrixFromPlan, matrixInput, type GraphWordsContext } from './graph/input.js';
15
+ export { autoLayer, layerGraph, parentLayer, resolveLayer, splitLayer } from './graph/layer.js';
16
+ export { passMatrix, sortRows as sortPassRows, type MatrixSort, type PassMatrix } from './graph/matrix.js';
17
+ export { markSel, parseSelection, type Selected } from './graph/selection.js';
18
+ export { taskStateStyles } from './graph/words.js';
19
+ export { compound, chooseOpen, doi, interest, notable, placeKey, placeStats, towardOf, type Compound, type OpenChoice, type PlaceStats } from './graph/compound.js';
20
+ export { LOOP_SEGMENT, type FlowBox, type GraphNode, type LayerGraph, type LayerMark, type LayerModel, type LoopBox } from './graph/types.js';
21
+ export * from './transcript/index.js';
22
+ export * from './preflight.js';
@@ -0,0 +1,200 @@
1
+ // The history's columns (`ca-journal-table`): a row per finished attempt
2
+ // (`JournalRow`), when it ended, the task, its stop, the agent and model, tokens,
3
+ // cost, time and the reason, then the pipeline's own columns (`row_extras`).
4
+ import { isBad, isLaunched, isPython, runRelative, type JournalRow, type TaskOutcome } from '@contraagent/api';
5
+ import type { DataColumn } from '@contraagent/elements/data-table';
6
+ import { statusWord } from '@contraagent/elements/primitives';
7
+ import { msg, str } from '@lit/localize';
8
+ import { html, nothing } from 'lit';
9
+ import { stopTone } from '../lib/tone.js';
10
+ import { executorIcon } from '../words/executor.js';
11
+ import { facts, fmtDur, kindUnit, localTime, sentence, tokenCount, unreadEvents, usd } from '../words/format.js';
12
+ import { attemptLabel, correctionsText, credentialLabel, credentialTip, modelSwitch, notStartedCause, outcomeLabel, replayedLabel, replayedTip, stopLabel } from '../words/index.js';
13
+ import { accountReading, readingShort } from '../words/quota.js';
14
+ import { customColumnTip, customValue } from '../words/row-extras.js';
15
+ import { contextWarnedText, contextWarnedTip, peakContextLine } from '../words/context.js';
16
+ import { attemptFacts } from './filters.js';
17
+
18
+ export interface JournalColumnsContext {
19
+ /** The run id: paths inside the run directory are shown relative to it. */
20
+ run: string;
21
+ /** What happened to each task (`deriveRun`): a refused row names its cause in words. */
22
+ outcomes: ReadonlyMap<string, TaskOutcome>;
23
+ /** Every row of the journal, in order: the attempts of a task, and the one that later did it. */
24
+ journal: readonly JournalRow[];
25
+ /** The rows shown: the time bars are relative to their longest. */
26
+ rows: readonly JournalRow[];
27
+ /** The pipeline's own columns (`RunSummary.row_extras`): one column each, after the reason. */
28
+ extras?: readonly string[];
29
+ /** Mark each attempt played from its recording (`JournalRow.replayed`): the run is a replay that also launched (`mixedReplay`). */
30
+ replayMarks?: boolean;
31
+ }
32
+
33
+ /** A stop as a short column label: a task that never ran is just "not started"; the cause goes to the reason. */
34
+ export function shortStop(stop: string | null | undefined): string {
35
+ return stop === 'invalid_input' ? outcomeLabel('not_started') : stopLabel(stop);
36
+ }
37
+
38
+ /** The identity the attempt authenticated as; both when a model switch changed it. */
39
+ function identity(e: JournalRow) {
40
+ const ids = [...new Set([...(e.hops ?? []).map((h) => h.credential), e.credential].filter(Boolean))];
41
+ if (!ids.length) return nothing;
42
+ // The subscription usage the attempt's first session started at, when the agent reported one.
43
+ const start = (e.quota ?? [])[0];
44
+ const tip = start ? msg(str`Usage at session start (account-wide): ${accountReading(start)}`) : '';
45
+ // The reading belongs to one account: name it when the row has more than one, or a different one.
46
+ const own = start && ids.length === 1 && (start.credential ?? '') === ids[0];
47
+ const shown = start ? (own ? readingShort(start) : accountReading(start)) : '';
48
+ const tips = [tip, ...ids.map(credentialTip)].filter(Boolean).join('\n');
49
+ return html`<span class="sub" title=${tips || nothing}>${ids.map((c) => credentialLabel(c)).join(' → ')}${start ? html` <span class="q">${shown}</span>` : nothing}</span>`;
50
+ }
51
+
52
+ /** The columns of the history. */
53
+ export function journalColumns(ctx: JournalColumnsContext): DataColumn<JournalRow>[] {
54
+ const maxWall = Math.max(1, ...ctx.rows.map((e) => e.wall_s || 0));
55
+ const tries = attemptFacts(ctx.journal);
56
+ const index = new Map(ctx.journal.map((r, i) => [r, i]));
57
+ /** The attempt that later did the task, after this one failed (0: none). */
58
+ const laterTry = (e: JournalRow): number => {
59
+ const f = tries.get(e.key);
60
+ return !e.ok && isLaunched(e) && (f?.lastOk ?? -1) > (index.get(e) ?? 0) ? (f?.lastOkTry ?? 0) : 0;
61
+ };
62
+
63
+ /**
64
+ * What the reason column says: the model switch, then (for a row that failed,
65
+ * never ran, or was partly done) the reason, run-relative, then the attempt that later did the task,
66
+ * then its peak context when it passed the warning threshold of the context limit.
67
+ */
68
+ const reason = (e: JournalRow) => {
69
+ const ran = isLaunched(e);
70
+ const sw = modelSwitch(e.hops, null, e.skipped_hops);
71
+ const run = ctx.run || e.run_id || '';
72
+ const own = ctx.outcomes.get(e.key);
73
+ const cause = e.stop === 'invalid_input' && own ? notStartedCause({ attempts: [e], cause: null }, ctx.outcomes, run) : '';
74
+ const why = cause ? sentence(cause) : (!e.ok || !ran || e.stop === 'partial') && e.reason ? runRelative(e.reason, run) : '';
75
+ const n = laterTry(e);
76
+ const later = n ? msg(str`Task done on attempt ${n}`) : '';
77
+ const warned = e.context_warned ? contextWarnedText(e) : '';
78
+ if (!sw && !why && !later && !warned) return html`<span class="jdim">—</span>`;
79
+ return html`${sw ? html`<span class="nw" title=${msg('Model switch')}>${sw}</span><br />` : nothing}${why ? html`${why}<br />` : nothing}${later
80
+ ? html`<span class="later">${later}</span>${warned ? html`<br />` : nothing}`
81
+ : nothing}${warned
82
+ ? html`<span class="tone-text" data-tone="attention" title=${[contextWarnedTip(), peakContextLine(e)].filter(Boolean).join('\n')}>${warned}</span>`
83
+ : nothing}`;
84
+ };
85
+
86
+ /** A pipeline's own column: its name as the pipeline wrote it, its value as text. */
87
+ const custom = (name: string): DataColumn<JournalRow> => ({
88
+ id: `x:${name}`,
89
+ header: name,
90
+ tip: customColumnTip(),
91
+ width: 'minmax(80px,0.6fr)',
92
+ text: (e) => customValue((e as Record<string, unknown>)[name]),
93
+ cell: (e) => {
94
+ const v = customValue((e as Record<string, unknown>)[name]);
95
+ return v === '—' ? html`<span class="jdim">—</span>` : html`<span class="jmono" title=${v}>${v}</span>`;
96
+ },
97
+ });
98
+
99
+ return [
100
+ { id: 'ended', header: msg('Ended'), width: '64px', cell: (e) => html`<span class="jmono" title=${localTime(e.ts, true)}>${localTime(e.ts)}</span>` },
101
+ {
102
+ id: 'task',
103
+ header: msg('Task'),
104
+ width: 'minmax(130px,0.8fr)',
105
+ rowHeader: true,
106
+ text: (e) => e.key,
107
+ cell: (e) => {
108
+ const py = isPython(e);
109
+ return html`<span class="jmono" title=${e.key}>${executorIcon(py, py ? msg('Python task') : msg('Agent task'), '')}
110
+ ${kindUnit(e)}</span>`;
111
+ },
112
+ },
113
+ {
114
+ id: 'outcome',
115
+ header: msg('Outcome'),
116
+ tip: msg('How the attempt ended (stop)'),
117
+ width: 'minmax(150px,0.7fr)',
118
+ cell: (e) => {
119
+ const ran = isLaunched(e);
120
+ const numbered = ran && (tries.get(e.key)?.count ?? 1) > 1;
121
+ const corrections = ran ? correctionsText((e.rounds ?? 1) - 1) : '';
122
+ const played = ctx.replayMarks && e.replayed ? replayedLabel() : '';
123
+ return statusWord({
124
+ text: html`<span class="nw">${shortStop(e.stop)}</span>${numbered || corrections || played
125
+ ? html`<span class="sub" title=${played ? replayedTip() : nothing}>${facts(numbered ? attemptLabel(e.attempt) : '', corrections, played)}</span>`
126
+ : nothing}`,
127
+ tone: stopTone(e.stop),
128
+ cls: 'two',
129
+ title: e.stop,
130
+ });
131
+ },
132
+ },
133
+ {
134
+ id: 'agent',
135
+ header: msg('Agent, model, identity'),
136
+ width: 'minmax(150px,1fr)',
137
+ cell: (e) =>
138
+ html`<span class="jmono jdim two" title=${facts(e.route, modelSwitch(e.hops, null, e.skipped_hops)) || nothing}>${isLaunched(e)
139
+ ? html`<span>${[e.agent, e.model].filter(Boolean).join(' / ') || '—'}</span>${identity(e)}`
140
+ : '—'}</span>`,
141
+ },
142
+ {
143
+ id: 'tokens',
144
+ header: msg('Tokens'),
145
+ tip: msg('Input / output | cache read / cache write'),
146
+ align: 'end',
147
+ width: '92px',
148
+ cell: (e) => {
149
+ const u = e.usage;
150
+ const tip = [u?.resident != null ? msg(str`Input of the first API call: ${tokenCount(u.resident)}`) : '', peakContextLine(e)].filter(Boolean).join('\n');
151
+ const first = tip || nothing;
152
+ return html`<span class="two" title=${first}>${u
153
+ ? html`<span>${tokenCount(u.input)} / ${tokenCount(u.output)}</span><span class="sub">${tokenCount(u.cache_read)} / ${tokenCount(u.cache_creation)}</span>`
154
+ : html`<span class="jdim">—</span>`}</span>`;
155
+ },
156
+ },
157
+ {
158
+ id: 'cost',
159
+ header: msg('Cost'),
160
+ tip: msg('Reported by the coding agent'),
161
+ align: 'end',
162
+ width: '60px',
163
+ cell: (e) => {
164
+ const hops = e.hops ?? [];
165
+ const perHop =
166
+ hops.length > 1
167
+ ? hops.map((h) => facts(h.model || h.route || '—', credentialLabel(h.credential) || '—', usd(h.cost_usd), stopLabel(h.stop))).join('\n')
168
+ : '';
169
+ return html`<span class="cost" title=${perHop || msg('Reported by the coding agent')}>${usd(e.cost_usd)}</span>`;
170
+ },
171
+ },
172
+ {
173
+ id: 'time',
174
+ header: msg('Time'),
175
+ align: 'end',
176
+ width: '76px',
177
+ cell: (e) => {
178
+ const py = isPython(e);
179
+ return isLaunched(e)
180
+ ? html`${fmtDur(e.wall_s)}<span class="jdur"><i class=${isBad(e) ? 'bad' : py ? '' : 'llm'}
181
+ style="width:${Math.max(2, Math.round((100 * (e.wall_s || 0)) / maxWall))}%"></i></span>`
182
+ : '—';
183
+ },
184
+ },
185
+ {
186
+ id: 'reason',
187
+ header: msg('Reason'),
188
+ width: 'minmax(200px,2.2fr)',
189
+ cell: (e) => {
190
+ const unread = unreadEvents([e]);
191
+ return html`<span class="jwhy" title=${e.reason || nothing}>${reason(e)}${unread
192
+ ? html` <span class="unread nw" title=${msg(str`Event types this contraagent version does not know (unread_events): ${unread}`)}
193
+ ><span aria-hidden="true">⚠</span> ${msg('Unrecognized events')}</span
194
+ >`
195
+ : nothing}</span>`;
196
+ },
197
+ },
198
+ ...(ctx.extras ?? []).map(custom),
199
+ ];
200
+ }
@@ -0,0 +1,211 @@
1
+ // The run in numbers, as the tiles of `<cae-stat-tiles>` (`ca-kpis`): tasks and
2
+ // how they ended, attempts, failed attempts, agent time, retries, corrections
3
+ // and model switches, from the journal. Pure.
4
+ import { inputProblems, isLaunched, isPython, retries, spendByKind, spendOf, totalTokens, type JournalRow, type RunDerived, type TaskOutcome } from '@contraagent/api';
5
+ import type { Fact } from '@contraagent/elements/primitives';
6
+ import type { StatTile } from '@contraagent/elements/tiles';
7
+ import { msg, str } from '@lit/localize';
8
+ import { problemTone } from '../lib/tone.js';
9
+ import { factList, facts, fmtDur, kindUnit, tokenCount, usd } from '../words/format.js';
10
+ import { stateCount } from '../words/index.js';
11
+ import { retryTip } from '../words/attempts.js';
12
+ import { correctionTip } from '../words/contract.js';
13
+ import { modelSwitchTip } from '../words/hops.js';
14
+
15
+ /**
16
+ * The run's figures, from the journal. Only tries that ran count: a task
17
+ * refused before launch (`invalid_input`) has a row but is not a try, not an
18
+ * agent session and not a failed attempt; tasks are counted by `deriveRun`.
19
+ */
20
+ export interface Kpis {
21
+ /** Tries that ran. */
22
+ attempts: number;
23
+ python: number;
24
+ /** Agent sessions: tries an agent ran. */
25
+ launches: number;
26
+ /** Tries that ran and failed. */
27
+ bad: number;
28
+ launchWall: number;
29
+ pythonWall: number;
30
+ /** Tries after a task's first, and the tasks they belong to. */
31
+ retries: number;
32
+ retriedTasks: number;
33
+ /** The keys of the tasks that were retried / had fix-ups (to open one directly when it is the only one). */
34
+ retriedKeys: string[];
35
+ fixupKeys: string[];
36
+ /** Fix-ups (sessions resumed with check errors), and the tasks that had any. */
37
+ fixups: number;
38
+ fixupTasks: number;
39
+ /** Model switches after a rate limit, and the tasks that switched. */
40
+ switches: number;
41
+ switchTasks: number;
42
+ }
43
+
44
+ export function kpis(journal: readonly JournalRow[]): Kpis {
45
+ const ran = journal.filter(isLaunched);
46
+ const py = ran.filter(isPython);
47
+ const llm = ran.filter((e) => !isPython(e));
48
+ const wall = (xs: readonly JournalRow[]) => xs.reduce((a, e) => a + (e.wall_s || 0), 0);
49
+ const keys = (xs: readonly JournalRow[]) => [...new Set(xs.map((e) => e.key))];
50
+ const tasks = (xs: readonly JournalRow[]) => keys(xs).length;
51
+ const retried = retries(journal);
52
+ const fixed = ran.filter((e) => (e.rounds || 1) > 1);
53
+ const switched = ran.filter((e) => (e.hops || []).length > 1);
54
+ return {
55
+ attempts: ran.length,
56
+ python: py.length,
57
+ launches: llm.length,
58
+ bad: ran.filter((e) => !e.ok).length,
59
+ launchWall: wall(llm),
60
+ pythonWall: wall(py),
61
+ retries: retried.length,
62
+ retriedTasks: tasks(retried),
63
+ retriedKeys: keys(retried),
64
+ fixupKeys: keys(fixed),
65
+ fixups: fixed.reduce((a, e) => a + (e.rounds || 1) - 1, 0),
66
+ fixupTasks: tasks(fixed),
67
+ switches: switched.reduce((a, e) => a + (e.hops || []).length - 1, 0),
68
+ switchTasks: tasks(switched),
69
+ };
70
+ }
71
+
72
+ /** What a tile's link opens: one task (`key`), or the history filtered by `stop` (`bad`, `invalid_input`, `retried`, `fixup`). */
73
+ export type KpiAction = { key: string } | { stop: string };
74
+
75
+ /** A tile's action id (`StatTile.action.id`) as what it opens. */
76
+ export function kpiAction(id: string): KpiAction {
77
+ return id.startsWith('task:') ? { key: id.slice(5) } : { stop: id.replace(/^history:/, '') };
78
+ }
79
+
80
+ /**
81
+ * Why the tasks that did not start did not start, as the data names it: an
82
+ * input missing, an input that failed checks, an earlier task that failed.
83
+ */
84
+ function notStartedCauses(outcomes: Iterable<TaskOutcome>): string[] {
85
+ let missing = false;
86
+ let checks = false;
87
+ let earlier = false;
88
+ for (const t of outcomes) {
89
+ if (t.outcome !== 'not_started') continue;
90
+ const last = t.attempts[t.attempts.length - 1];
91
+ const ps = last?.stop === 'invalid_input' ? inputProblems(last.reason) : [];
92
+ if (ps.some((p) => p.problem === 'missing')) missing = true;
93
+ if (ps.some((p) => p.problem === 'checks')) checks = true;
94
+ if (ps.some((p) => p.problem === 'failed') || (!ps.length && t.cause)) earlier = true;
95
+ }
96
+ return factList(earlier ? msg('Earlier task failed') : '', missing ? msg('Input missing') : '', checks ? msg('Input failed checks') : '');
97
+ }
98
+
99
+ /** The history filtered by `stop`, named `label`. */
100
+ const history = (stop: string, label: string): StatTile['action'] => ({ id: `history:${stop}`, label });
101
+
102
+ /** The tasks behind a count: the task itself when it is one (named), else the history filtered to them (`label`). */
103
+ function show(journal: readonly JournalRow[], keys: readonly string[], stop: string, label: string): StatTile['action'] {
104
+ const only = keys.length === 1 ? keys[0] : undefined;
105
+ if (!only) return history(stop, label);
106
+ const row = journal.find((r) => r.key === only);
107
+ return { id: `task:${only}`, label: row ? kindUnit(row) : only };
108
+ }
109
+
110
+ /**
111
+ * The tiles: tasks (with `d` from the plan; from the journal alone otherwise),
112
+ * attempts, cost and tokens (when reported), failed attempts, not started,
113
+ * agent time, retries, corrections and model switches. Neutral by default:
114
+ * only a problem count above 0 takes its tone (`problemTone`).
115
+ */
116
+ export function kpiTiles(journal: readonly JournalRow[], d: Pick<RunDerived, 'outcomes' | 'counts'>): StatTile[] {
117
+ const k = kpis(journal);
118
+ const { outcomes, counts: c } = d;
119
+ // The total is neutral; the parts that are problems carry their own status.
120
+ const parts: Fact[] = [
121
+ { text: stateCount('done', c.doneTotal), tone: 'neutral' },
122
+ { text: c.skipped ? stateCount('skipped', c.skipped) : '', tone: 'neutral' },
123
+ { text: c.failed ? stateCount('failed', c.failed) : '', tone: problemTone(c.failed, 'failed') },
124
+ { text: c.not_started ? stateCount('not_started', c.not_started) : '', tone: problemTone(c.not_started, 'attention') },
125
+ { text: c.partial ? stateCount('partial', c.partial) : '', tone: problemTone(c.partial, 'attention') },
126
+ ];
127
+ return [
128
+ { id: 'tasks', label: msg('Tasks', { id: 'tasks', desc: 'A count of tasks' }), value: c.total, sub: [parts] },
129
+ {
130
+ id: 'attempts',
131
+ label: msg('Attempts'),
132
+ value: k.attempts,
133
+ sub: [factList(k.launches === 1 ? msg('1 agent session') : msg(str`${k.launches} agent sessions`), k.python === 1 ? msg('1 Python task attempt') : msg(str`${k.python} Python task attempts`))],
134
+ tip: msg('Attempts that ran, retries included (journal.jsonl)'),
135
+ },
136
+ ...spendTiles(journal),
137
+ {
138
+ id: 'bad',
139
+ tone: problemTone(k.bad, 'failed'),
140
+ label: msg('Failed attempts'),
141
+ value: k.bad,
142
+ sub: [k.bad ? [] : [msg('All attempts done')]],
143
+ ...(k.bad ? { action: history('bad', msg('Failed attempts in history')) } : {}),
144
+ },
145
+ {
146
+ id: 'notstarted',
147
+ tone: problemTone(c.not_started, 'attention'),
148
+ label: msg('Not started'),
149
+ value: c.not_started,
150
+ sub: [c.not_started ? notStartedCauses(outcomes.values()) : [msg('All tasks started')]],
151
+ ...(c.not_started ? { action: history('invalid_input', msg('Tasks not started in history')) } : {}),
152
+ },
153
+ {
154
+ id: 'wall',
155
+ label: msg('Agent session time'),
156
+ value: fmtDur(k.launchWall),
157
+ sub: [[msg(str`Python tasks: ${fmtDur(k.pythonWall)}`)]],
158
+ tip: msg('Summed over agent sessions, including sessions that ran at once'),
159
+ },
160
+ {
161
+ id: 'retry',
162
+ label: msg('Retries'),
163
+ value: k.retries,
164
+ sub: [[!k.retries ? msg('No retries') : k.retriedTasks === 1 ? msg('1 task retried') : msg(str`${k.retriedTasks} tasks retried`)]],
165
+ tip: retryTip(),
166
+ ...(k.retries ? { action: show(journal, k.retriedKeys, 'retried', msg('Retried tasks in history')) } : {}),
167
+ },
168
+ {
169
+ id: 'ct',
170
+ label: msg('Corrections'),
171
+ value: k.fixups,
172
+ sub: [[!k.fixups ? msg('No corrections') : k.fixupTasks === 1 ? msg('1 task with a correction') : msg(str`${k.fixupTasks} tasks with corrections`)]],
173
+ tip: correctionTip(),
174
+ ...(k.fixups ? { action: show(journal, k.fixupKeys, 'fixup', msg('Attempts with corrections in history')) } : {}),
175
+ },
176
+ {
177
+ id: 'fo',
178
+ label: msg('Model switches'),
179
+ value: k.switches,
180
+ sub: [[!k.switches ? msg('No model switches') : k.switchTasks === 1 ? msg('1 task with a model switch') : msg(str`${k.switchTasks} tasks with model switches`)]],
181
+ tip: modelSwitchTip(),
182
+ },
183
+ ];
184
+ }
185
+
186
+ /** Cost and tokens, when any attempt reported them. */
187
+ function spendTiles(journal: readonly JournalRow[]): StatTile[] {
188
+ const s = spendOf(journal);
189
+ if (!s) return [];
190
+ const top = spendByKind(journal)[0];
191
+ return [
192
+ {
193
+ id: 'cost',
194
+ label: msg('Cost'),
195
+ value: usd(s.cost),
196
+ sub: top && top.share !== null ? [[msg(str`Highest cost: ${top.kind}`)], factList(usd(top.spend.cost), msg(str`${Math.round(top.share * 100)}% of the total`))] : [[]],
197
+ tip: msg('Reported by the coding agent'),
198
+ },
199
+ {
200
+ id: 'tokens',
201
+ label: msg('Tokens'),
202
+ value: tokenCount(totalTokens(s)),
203
+ sub: [factList(msg(str`${tokenCount(s.input)} input`), msg(str`${tokenCount(s.output)} output`), msg(str`${tokenCount(s.cache_read + s.cache_creation)} cache`))],
204
+ tip: facts(
205
+ msg(str`${tokenCount(s.cache_read)} cache read`),
206
+ msg(str`${tokenCount(s.cache_creation)} cache write`),
207
+ s.calls === 1 ? msg('1 API call') : msg(str`${s.calls} API calls`),
208
+ ),
209
+ },
210
+ ];
211
+ }