@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,105 @@
1
+ // What the parts of `ca-task-view` (its header and its panes) render from: the
2
+ // task's detail, the run around it and what its transcript reported, plus the
3
+ // facts they share about the task.
4
+ import {
5
+ inputProblems,
6
+ isLaunched,
7
+ isPython,
8
+ outcomeOf,
9
+ runRelative,
10
+ type JournalRow,
11
+ type LaunchEvent,
12
+ type Outcome,
13
+ type Plan,
14
+ type TaskDetail,
15
+ type TaskOutcome,
16
+ type UpstreamTask,
17
+ } from '@contraagent/api';
18
+ import { html } from 'lit';
19
+ import { emit, type RoundInfo } from '../../core/events.js';
20
+ import { kindUnit } from '../../words/format.js';
21
+ import { correctionsText, inputCause, notStartedCause } from '../../words/index.js';
22
+ import { type Producer } from '../../words/contract.js';
23
+
24
+ export interface TaskContext {
25
+ /** The element: it sends the events. */
26
+ host: HTMLElement;
27
+ run: string;
28
+ detail: TaskDetail;
29
+ /** The task is running now. */
30
+ live: boolean;
31
+ /** The whole run's journal; may be empty. */
32
+ journal: JournalRow[];
33
+ plan: Plan | null;
34
+ /** What happened to every task of the run, by key (empty without a plan). */
35
+ outcomes: ReadonlyMap<string, TaskOutcome>;
36
+ /** From the transcript: each round's launch, the round shown, the rounds. */
37
+ launches: (LaunchEvent | null)[];
38
+ shownRound: number;
39
+ rounds: RoundInfo[];
40
+ /** Read from an export (`Info.export`): it holds no transcript. */
41
+ exported?: boolean;
42
+ /** The run is a replay that also launched (`mixedReplay`): each attempt played from its recording is marked. */
43
+ replayMarks?: boolean;
44
+ }
45
+
46
+ /** A Python task: it runs in the pipeline's process, so it has no agent session and no transcript. */
47
+ export const isPy = (d: TaskDetail): boolean => isPython(d.io) || d.rows.some(isPython);
48
+
49
+ /** The coding agent ran for this task at least once. */
50
+ export const hadSession = (d: TaskDetail): boolean => !isPy(d) && (!!d.stream || d.launches.length > 0 || d.rows.some(isLaunched));
51
+
52
+ /** The task's state in the run: running, waiting, not started, done ... */
53
+ export const stateOf = (c: TaskContext): Outcome =>
54
+ c.live ? 'running' : (c.outcomes.get(c.detail.key)?.outcome ?? outcomeOf(undefined, c.detail.rows));
55
+
56
+ /** The earlier task that writes `path`, by the task's own upstream list. */
57
+ export const writerOf = (c: TaskContext, path: string): UpstreamTask | undefined =>
58
+ c.detail.io.upstream.find((u) => u.outputs.some((o) => o.path === path));
59
+
60
+ /** For a contract card: who writes a file, and what happened to that task. */
61
+ export const producerOf =
62
+ (c: TaskContext) =>
63
+ (path: string): Producer | undefined => {
64
+ const u = writerOf(c, path);
65
+ if (!u) return undefined;
66
+ const o = u.outputs.find((x) => x.path === path);
67
+ return { name: kindUnit(u), written: !!o?.file.exists, outcome: c.outcomes.get(u.key)?.outcome };
68
+ };
69
+
70
+ /**
71
+ * Why a task did not start, as a phrase after "Not started: ": the input its
72
+ * refusal names and why it is not ready, or the earlier task that failed; '' when unknown.
73
+ */
74
+ export function notStartedWhy(c: TaskContext): string {
75
+ const d = c.detail;
76
+ const own = c.outcomes.get(d.key) ?? { attempts: d.rows, cause: null };
77
+ const cause = notStartedCause(own, c.outcomes, c.run, (path) => writerOf(c, path)?.key);
78
+ if (cause) return cause;
79
+ // A task the plan does not list (no outcomes): name the earlier task by its upstream entry.
80
+ const p = inputProblems(d.rows[d.rows.length - 1]?.reason)[0];
81
+ const w = p ? writerOf(c, p.path) : undefined;
82
+ return p ? inputCause(runRelative(p.path, c.run), p.problem, w ? { name: kindUnit(w) } : undefined) : '';
83
+ }
84
+
85
+ /** The earlier task a task that did not start waits for: the one its refusal names, or the failed one upstream. */
86
+ export function culprit(c: TaskContext): { key: string; kind: string; unit: string; executor?: string } | undefined {
87
+ const d = c.detail;
88
+ const p = inputProblems(d.rows[d.rows.length - 1]?.reason)[0];
89
+ const byKey = p?.producer ? c.outcomes.get(p.producer) : undefined;
90
+ if (byKey) return byKey;
91
+ const w = p ? writerOf(c, p.path) : undefined;
92
+ if (w) return w;
93
+ const cause = c.outcomes.get(d.key)?.cause;
94
+ return cause ? c.outcomes.get(cause) : undefined;
95
+ }
96
+
97
+ /** `N corrections` for a journal row whose attempt needed them ('' when none). */
98
+ export const correctionsOf = (r: { rounds?: number | null }): string => correctionsText((r.rounds || 1) - 1);
99
+
100
+ /** A task's name as a link that sends `ca-open-task`. */
101
+ export const taskLink = (c: TaskContext, u: { key: string; kind: string; unit: string }) =>
102
+ html`<a class="lnk" href="#" @click=${(e: Event) => {
103
+ e.preventDefault();
104
+ emit(c.host, 'ca-open-task', { key: u.key });
105
+ }}>${kindUnit(u)}</a>`;
@@ -0,0 +1,296 @@
1
+ // The top of `ca-task-view`: the task's name and status, who ran it, what it
2
+ // spent, and a chip per finished attempt.
3
+ import { deferredIn, isLaunched, runReadings, runRelative, spendOf, tryQuota, type JournalRow, type Spend } from '@contraagent/api';
4
+ import { msg, str } from '@lit/localize';
5
+ import { html, nothing, type TemplateResult } from 'lit';
6
+ import { toneAttr } from '@contraagent/elements';
7
+ import { pill } from '@contraagent/elements/primitives';
8
+ import { facts, fmtDur, kindUnit, listText, localTime, tokenCount, unreadEvents, usd } from '../../words/format.js';
9
+ import { attemptNames, deferredText, changedFiles, changedFilesTip, changeLabel, credentialLabel, credentialTip, locksLabel, locksTip, modelSwitch, outcomeLabel, priorityText, priorityTip, replayedLabel, replayedTip, stopLabel, type ChangeKind } from '../../words/index.js';
10
+ import { contextWarnedText, contextWarnedTip, peakContextLine, peakContextTip, peakTry } from '../../words/context.js';
11
+ import { readingShort, readingTip } from '../../words/quota.js';
12
+ import { customColumnTip, customValues } from '../../words/row-extras.js';
13
+ import { isStop, type Tone } from '../../lib/tone.js';
14
+ import { executorIcon } from '../../words/executor.js';
15
+ import '@contraagent/elements/json-tree/define';
16
+ import { tagChips, type TranscriptTag } from '@contraagent/elements/transcript';
17
+ import { checkMessage } from '../../adapters/transcript/rounds.js';
18
+ import { agentLabel, launchWho, whoTags, type Who } from '../../adapters/transcript/who.js';
19
+ import { correctionsOf, hadSession, isPy, notStartedWhy, stateOf, type TaskContext } from './context.js';
20
+
21
+ /** Keys of `TaskDetail` the header shows itself; any other key (a `task_detail` callback's) is shown as JSON. */
22
+ const SHOWN_KEYS = new Set(['key', 'rows', 'launches', 'stream', 'task_detail_error', 'definition', 'io', 'row_extras']);
23
+
24
+ /** The status mark and the word a screen reader says for it: a partly done attempt is ok, with the mark of a state needing attention. */
25
+ const mark = (r: JournalRow) =>
26
+ r.stop === 'partial'
27
+ ? html`<span aria-hidden="true">◌</span><span class="sr">${outcomeLabel('partial')}</span>`
28
+ : html`<span aria-hidden="true">${r.ok ? '✓' : '✕'}</span><span class="sr">${r.ok ? msg('passed') : msg('failed')}</span>`;
29
+
30
+ /** One line under the title: what happened to the task, in words, and its tone (`failed`, `attention`, `muted`, or none). */
31
+ function verdict(c: TaskContext): [text: string, tone: Tone] {
32
+ const rows = c.detail.rows;
33
+ const tries = rows.filter(isLaunched);
34
+ const last = rows[rows.length - 1];
35
+ const state = stateOf(c);
36
+ switch (state) {
37
+ case 'running':
38
+ return [msg('Running'), 'neutral'];
39
+ case 'waiting': {
40
+ const node = c.plan?.nodes.find((n) => n.key === c.detail.key);
41
+ const why = node?.deferred ? deferredText(node.deferred_cause, node.deferred, deferredIn(c.plan, node.deferred_cause)) : '';
42
+ return why ? [msg(str`Not run: ${why}`), 'attention'] : [msg('Waiting'), 'muted'];
43
+ }
44
+ case 'skipped':
45
+ return [msg('Skipped'), 'muted'];
46
+ case 'not_started': {
47
+ const cause = notStartedWhy(c);
48
+ return [cause ? msg(str`Not started: ${cause}`) : msg('Not started'), 'attention'];
49
+ }
50
+ case 'partial': {
51
+ // An agent task's partial reason is the stop its launch ended on (`partial_on`): said in words.
52
+ const why = last?.reason && isStop(last.reason) ? stopLabel(last.reason) : runRelative(last?.reason, c.run);
53
+ return [why ? msg(str`Partly done: ${why}`) : msg('Partly done'), 'attention'];
54
+ }
55
+ case 'failed': {
56
+ const why = runRelative(last?.reason, c.run) || stopLabel(last?.stop);
57
+ return [tries.length > 1 ? msg(str`Failed on all ${tries.length} attempts: ${why}`) : msg(str`Failed: ${why}`), 'failed'];
58
+ }
59
+ default:
60
+ break;
61
+ }
62
+ if (!last) return [outcomeLabel(state), 'neutral'];
63
+ const fails = tries.filter((r) => !r.ok);
64
+ if (fails.length) {
65
+ const why = runRelative(fails[0]?.reason, c.run) || stopLabel(fails[0]?.stop);
66
+ return [
67
+ fails.length === 1
68
+ ? msg(str`Done on attempt ${tries.length} | 1 failed attempt | first failure: ${why}`)
69
+ : msg(str`Done on attempt ${tries.length} | ${fails.length} failed attempts | first failure: ${why}`),
70
+ 'neutral',
71
+ ];
72
+ }
73
+ const corrections = (last.rounds || 1) - 1 + (last.hook_errors ?? []).length;
74
+ if (corrections > 0) {
75
+ const errors = [...(last.hook_errors ?? []).flat(), ...(last.round_errors ?? []).flat(), ...c.rounds.flatMap((r) => r.rejectedWith)];
76
+ const first = errors[0] ? checkMessage(runRelative(errors[0], c.run)) : '';
77
+ if (!first) return [corrections === 1 ? msg('Done after 1 correction') : msg(str`Done after ${corrections} corrections`), 'neutral'];
78
+ return [
79
+ corrections === 1
80
+ ? msg(str`Done after 1 correction | first failed check: ${first}`)
81
+ : msg(str`Done after ${corrections} corrections | first failed check: ${first}`),
82
+ 'neutral',
83
+ ];
84
+ }
85
+ const sw = modelSwitch(last.hops, null, last.skipped_hops);
86
+ if (sw) return [msg(str`Done after a model switch: ${sw}`), 'neutral'];
87
+ return [msg('Done'), 'neutral'];
88
+ }
89
+
90
+ /** The model of the latest round, as its launch named it (`--model`). */
91
+ function streamModel(c: TaskContext): string {
92
+ for (let i = c.launches.length - 1; i >= 0; i--) {
93
+ const l = c.launches[i];
94
+ const m = l ? launchWho(l).model : '';
95
+ if (m) return m;
96
+ }
97
+ return '';
98
+ }
99
+
100
+ /**
101
+ * The header of task `key`. `onSearch(query, nth)` is called when the reader
102
+ * picks one of its web searches (the nth with that query).
103
+ */
104
+ export function taskHeader(c: TaskContext, key: string, onSearch: (query: string, nth: number) => void): TemplateResult {
105
+ const d = c.detail;
106
+ const live = c.live;
107
+ const { rows, launches } = d;
108
+ const py = isPy(d);
109
+ const session = hadSession(d);
110
+ const byTs = rows.slice().sort((a, b) => String(a.ts).localeCompare(String(b.ts)));
111
+ const lastRow = byTs[byTs.length - 1];
112
+ const lc0 = launches[0];
113
+ const who: Who = {
114
+ agent: agentLabel(lc0?.cmd ? lc0.cmd.split(' ')[0] : lastRow?.agent),
115
+ // The journal may not name the model (an agent that does not report it): fall back to the one the transcript shows.
116
+ model: lc0?.model || lastRow?.model || streamModel(c),
117
+ role: lc0?.role || '',
118
+ };
119
+ const otherModels = session ? [...new Set(byTs.map((r) => r.model).filter((x): x is string => !!x && x !== who.model))] : [];
120
+ const first = rows[0];
121
+ const tries = rows.filter(isLaunched);
122
+ const extras = Object.entries(d).filter(([k]) => !SHOWN_KEYS.has(k));
123
+ const [verdictText, tone] = verdict(c);
124
+ const kindName = py ? msg('Python task') : msg('Agent task');
125
+ const node = c.plan?.nodes.find((n) => n.key === d.key);
126
+ return html`<div class="taskmeta">
127
+ <div class="tm-head">
128
+ ${executorIcon(py, kindName, `tm-av ${py ? 'py' : ''}`)}
129
+ <div style="min-width:0">
130
+ <div class="tm-name" title=${key}>${first ? kindUnit(first) : node ? kindUnit(node) : key.replace(/^python:/, '')} ${live ? pill({ text: msg('running'), tone: 'running' }) : nothing}</div>
131
+ <div class="verdict" data-tone=${toneAttr(tone)}>${verdictText}</div>
132
+ ${node?.claims?.length
133
+ ? html`<div class="meta" title=${locksTip()}>
134
+ ${locksLabel()} ${node.claims.map((text) => pill({ text }))}
135
+ </div>`
136
+ : nothing}
137
+ ${node?.priority ? html`<div class="meta" title=${priorityTip()}>${priorityText(node.priority)}</div>` : nothing}
138
+ ${node?.rerun ? html`<div class="meta">${msg(str`Ran again after a resume: ${node.rerun}`)}</div>` : nothing}
139
+ ${session
140
+ ? html`<div class="whos">
141
+ ${tagChips([...whoTags(who), ...identityTags(tries)])}
142
+ ${otherModels.length
143
+ ? html`<span class="meta">${otherModels.length === 1
144
+ ? msg(str`Earlier attempts used model ${otherModels[0] ?? ''}`)
145
+ : msg(str`Earlier attempts used models ${listText(otherModels)}`)}</span>`
146
+ : nothing}
147
+ </div>`
148
+ : nothing}
149
+ ${launches.length
150
+ ? html`<div class="meta">${launches.length === 1 ? msg('1 agent session running') : msg(str`${launches.length} agent sessions running`)}</div>`
151
+ : nothing}
152
+ ${spendLine(spendOf(rows), tries)}
153
+ ${quotaLine(c, tries)}
154
+ </div>
155
+ </div>
156
+ ${tries.length
157
+ ? html`<div class="runchips">${attemptNames(tries).map((name, i) => runChip(c, tries[i] as JournalRow, name, session, d.row_extras ?? []))}</div>`
158
+ : nothing}
159
+ ${customLine(tries, d.row_extras ?? [])}
160
+ ${searchFold(tries, onSearch)}
161
+ ${changesFold(tries)}
162
+ ${unreadEvents(tries)
163
+ ? html`<div class="meta unread" title=${msg('Event types this contraagent version does not know (unread_events)')}>
164
+ <span aria-hidden="true">⚠</span> ${msg(str`Unrecognized events: ${unreadEvents(tries)}`)}
165
+ </div>`
166
+ : nothing}
167
+ ${d.task_detail_error ? html`<div class="meta v-bad">${msg(str`The task_detail callback failed: ${d.task_detail_error ?? ''}`)}</div>` : nothing}
168
+ ${launches.map(
169
+ (lc) => html`<details class="launch">
170
+ <summary>${facts(msg(str`Process ${lc.pid ?? '—'}`), lc.key || '')}</summary>
171
+ <div class="meta">${facts(msg(str`Plugin ${lc.plugin || msg('none', { id: 'none', desc: 'An empty value' })}`), msg(str`Model ${lc.model || '—'}`), msg(str`Role ${lc.role || msg('none', { id: 'none', desc: 'An empty value' })}`))}</div>
172
+ </details>`,
173
+ )}
174
+ ${extras.map(
175
+ ([k, v]) => html`<details class="io-fold"><summary>${k}</summary><cae-json-tree .value=${v}></cae-json-tree></details>`,
176
+ )}
177
+ </div>`;
178
+ }
179
+
180
+ /** The identities the task's attempts authenticated as (each hop's, when a model switch changed it). */
181
+ function identityTags(tries: JournalRow[]): TranscriptTag[] {
182
+ const ids = [...new Set(tries.flatMap((r) => [...(r.hops ?? []).map((h) => h.credential), r.credential]).filter((x): x is string => !!x))];
183
+ if (!ids.length) return [];
184
+ const tip = [msg('Account or API key the coding agent used (credential)'), ...ids.map(credentialTip)].filter(Boolean).join('\n');
185
+ return [{ label: msg('identity'), value: listText(ids.map(credentialLabel)), tip, look: 'quiet' }];
186
+ }
187
+
188
+ /** The queries of the web searches the task's attempts made, in call order; each opens its card in the transcript. */
189
+ function searchFold(tries: JournalRow[], onSearch: (query: string, nth: number) => void) {
190
+ const queries = tries.flatMap((r) => r.web_queries ?? []);
191
+ const seen = new Map<string, number>();
192
+ return queries.length
193
+ ? html`<details class="io-fold">
194
+ <summary>${queries.length === 1 ? msg('1 web search') : msg(str`${queries.length} web searches`)}</summary>
195
+ <ol class="meta searches">
196
+ ${queries.map((q) => {
197
+ const nth = seen.get(q) ?? 0;
198
+ seen.set(q, nth + 1);
199
+ return html`<li><button class="qlink jmono" @click=${() => onSearch(q, nth)}>
200
+ ${q}
201
+ </button></li>`;
202
+ })}
203
+ </ol>
204
+ </details>`
205
+ : nothing;
206
+ }
207
+
208
+ /** The files each attempt changed under the task's `changes` patterns (the attempt named when more than one has them); nothing for a task that declares none. */
209
+ function changesFold(tries: JournalRow[]) {
210
+ const names = attemptNames(tries);
211
+ const withChanges = tries.filter((r) => r.changes).length;
212
+ const files = tries.flatMap((r, i) => {
213
+ const c = r.changes;
214
+ if (!c) return [];
215
+ const at = withChanges > 1 ? (names[i] ?? '') : '';
216
+ const gone = new Set(c.removed);
217
+ const kept = new Set(c.kept);
218
+ const after = (p: string, kind: ChangeKind): ChangeKind => (gone.has(p) ? 'removed' : kept.has(p) ? 'kept' : kind);
219
+ const of = (paths: string[] | undefined, kind: ChangeKind) => (paths ?? []).map((p) => facts(at, p, changeLabel(after(p, kind))));
220
+ return [...of(c.created, 'created'), ...of(c.modified, 'modified'), ...of(c.deleted, 'deleted')];
221
+ });
222
+ if (!withChanges) return nothing;
223
+ if (!files.length) return html`<div class="meta">${msg('No changed files')}</div>`;
224
+ return html`<details class="io-fold">
225
+ <summary title=${changedFilesTip()}>${changedFiles(files.length)}</summary>
226
+ <ul class="meta searches jmono">${files.map((f) => html`<li>${f}</li>`)}</ul>
227
+ </details>`;
228
+ }
229
+
230
+ /** The latest attempt's custom columns (`row_extras`), name and value; each attempt's are in its chip's tooltip. */
231
+ function customLine(tries: JournalRow[], extras: readonly string[]) {
232
+ const last = tries[tries.length - 1];
233
+ const values = last ? customValues(last, extras) : [];
234
+ if (!values.length) return nothing;
235
+ const tip = customColumnTip();
236
+ return html`<div class="whos">${tagChips(values.map(([label, value]) => ({ label, value, tip, look: 'quiet' as const })))}</div>`;
237
+ }
238
+
239
+ /**
240
+ * The task's spend over all its attempts: cost, then tokens, then the largest peak
241
+ * context of its attempts (with its share of the context limit, and its state when
242
+ * an attempt passed the warning threshold). Nothing when none was reported.
243
+ */
244
+ function spendLine(s: Spend | null, tries: JournalRow[]) {
245
+ if (!s) return nothing;
246
+ const peak = peakTry(tries);
247
+ const warned = tries.find((r) => r.context_warned);
248
+ return html`<div class="spend">
249
+ <b title=${msg('Reported by the coding agent')}>${usd(s.cost)}</b>
250
+ <span>${msg(str`Tokens: ${tokenCount(s.input)} input, ${tokenCount(s.output)} output, ${tokenCount(s.cache_read)} cache read, ${tokenCount(s.cache_creation)} cache write`)}</span>
251
+ <span>${s.calls === 1 ? msg('1 API call') : msg(str`${s.calls} API calls`)}</span>
252
+ ${peak ? html`<span title=${peakContextTip()}>${peakContextLine(peak)}</span>` : nothing}
253
+ ${warned ? html`<span class="tone-text" data-tone="attention" title=${contextWarnedTip()}>${contextWarnedText(warned)}</span>` : nothing}
254
+ </div>`;
255
+ }
256
+
257
+ /** The task's subscription usage: at its first session start, and the next reading the run took after it ended. */
258
+ function quotaLine(c: TaskContext, tries: JournalRow[]) {
259
+ const readings = runReadings(c.journal.length ? c.journal : tries);
260
+ const first = tries[0];
261
+ const last = tries[tries.length - 1];
262
+ const start = first ? tryQuota(first, readings).start : null;
263
+ if (!start || !last) return nothing;
264
+ const next = tryQuota(last, readings).next;
265
+ // The identity chip names the account; both readings are that account's.
266
+ return html`<div class="spend quota">
267
+ <span title=${readingTip(start)}>${msg(str`Usage at session start: ${readingShort(start)}`)}</span>
268
+ ${next ? html`<span title=${readingTip(next)}>${msg(str`Usage after this task: ${readingShort(next)}`)}</span>` : nothing}
269
+ </div>`;
270
+ }
271
+
272
+ /** One finished attempt: how it ended, how long, its cost; the rest (when, corrections, model, model switch) in its tooltip. */
273
+ function runChip(c: TaskContext, r: JournalRow, name: string, session: boolean, extras: readonly string[]) {
274
+ const look = r.stop === 'partial' ? 'part' : r.ok ? 'ok' : 'bad';
275
+ const played = !!c.replayMarks && !!r.replayed;
276
+ const reason = runRelative(r.reason, c.run);
277
+ const sw = modelSwitch(r.hops, null, r.skipped_hops);
278
+ const tip = [
279
+ msg(str`Ended ${localTime(r.ts, true)}`),
280
+ correctionsOf(r),
281
+ session && r.model ? msg(str`Model ${r.model}`) : '',
282
+ sw ? msg(str`Model switch: ${sw}`) : '',
283
+ peakContextLine(r),
284
+ r.context_warned ? contextWarnedText(r) : '',
285
+ reason,
286
+ r.route || '',
287
+ played ? replayedTip() : '',
288
+ ...customValues(r, extras).map(([k, v]) => `${k}: ${v}`),
289
+ ]
290
+ .filter(Boolean)
291
+ .join('\n');
292
+ const cost = r.cost_usd !== null && r.cost_usd !== undefined ? usd(r.cost_usd) : '';
293
+ return html`<span class="runchip ${look}" title=${tip}>
294
+ ${mark(r)} ${facts(name, stopLabel(r.stop, r.reason), fmtDur(r.wall_s), cost, played ? replayedLabel() : '')}
295
+ </span>`;
296
+ }
@@ -0,0 +1,2 @@
1
+ export * from './ca-task-view.js';
2
+ export * from './ca-transcript.js';
@@ -0,0 +1,46 @@
1
+ // What a task reads, file by file, and the earlier tasks it waits for: the
2
+ // Input tab's arithmetic, apart from its templates. Pure.
3
+ import type { ContractSpec, TaskIO, UpstreamTask } from '@contraagent/api';
4
+
5
+ /** One file the task reads: its input contract, and the earlier task that writes it (with that task's output contract), if any. */
6
+ export interface InputFile {
7
+ spec: ContractSpec;
8
+ from: UpstreamTask | null;
9
+ /** The earlier task's contract for the same file: whether it was written and passed its checks. */
10
+ out: ContractSpec | null;
11
+ }
12
+
13
+ /** One earlier task: how many of its output files this task reads, and the others. */
14
+ export interface EarlierTask {
15
+ task: UpstreamTask;
16
+ read: number;
17
+ /** Its output files this task does not read. */
18
+ rest: ContractSpec[];
19
+ }
20
+
21
+ /** An output file that is missing, or did not pass its checks. */
22
+ export const notPassed = (o: ContractSpec): boolean => !o.file.exists || (o.status != null && o.status !== 'valid');
23
+
24
+ /**
25
+ * The Input tab of a task: every file it reads (its declared inputs), each with the
26
+ * earlier task that writes it; then the earlier tasks it waits for, each with the
27
+ * output files it does not read. An earlier task with an output that is missing or did
28
+ * not pass comes first.
29
+ */
30
+ export function inputView(io: Pick<TaskIO, 'inputs' | 'upstream'>): { files: InputFile[]; earlier: EarlierTask[] } {
31
+ const reads = new Set(io.inputs.map((o) => o.path));
32
+ const files = io.inputs.map((spec): InputFile => {
33
+ for (const u of io.upstream) {
34
+ const out = u.outputs.find((o) => o.path === spec.path);
35
+ if (out) return { spec, from: u, out };
36
+ }
37
+ return { spec, from: null, out: null };
38
+ });
39
+ const earlier = io.upstream.map((task): EarlierTask => ({
40
+ task,
41
+ read: task.outputs.filter((o) => reads.has(o.path)).length,
42
+ rest: task.outputs.filter((o) => !reads.has(o.path)),
43
+ }));
44
+ const bad = (e: EarlierTask) => Number(e.task.outputs.some(notPassed));
45
+ return { files, earlier: [...earlier].sort((a, b) => bad(b) - bad(a)) };
46
+ }
@@ -0,0 +1,7 @@
1
+ // The definition pane of `ca-task-view`: the task's kind, as `ca-definition` shows it.
2
+ import { html, type TemplateResult } from 'lit';
3
+ import '../../shared/ca-definition.js';
4
+ import type { TaskContext } from '../context.js';
5
+
6
+ export const definitionPane = (c: TaskContext): TemplateResult =>
7
+ html`<ca-definition .definition=${c.detail.definition ?? null} memory="task-definition"></ca-definition>`;
@@ -0,0 +1,190 @@
1
+ // The input and output panes of `ca-task-view`: what the task read (parameters,
2
+ // files, earlier tasks, the prompt) and what it wrote (files against their
3
+ // contracts, the outcome, tokens and cost, later tasks).
4
+ import { isLaunched, isPython, runReadings, runStarts, tryQuota, type JournalRow, type Outcome, type SourcedReading } from '@contraagent/api';
5
+ import { msg, str } from '@lit/localize';
6
+ import { html, nothing, type TemplateResult } from 'lit';
7
+ import { pill } from '@contraagent/elements/primitives';
8
+ import '@contraagent/elements/json-tree/define';
9
+ import { facts, fmtDur, kindUnit, tokenCount, usd } from '../../../words/format.js';
10
+ import { attemptLabel, attemptNames, credentialLabel, credentialTip, outcomeLabel, stopLabel } from '../../../words/index.js';
11
+ import { accountReading, readingShort, readingTip } from '../../../words/quota.js';
12
+ import { outcomeMark, outcomeTone, stopTone } from '../../../lib/tone.js';
13
+ import { executorIcon } from '../../../words/executor.js';
14
+ import { promptText } from '../../shared/prompt-text.js';
15
+ import { contractChip } from '../../shared/contract-parts.js';
16
+ import { ioFileCard } from '../../shared/file-card.js';
17
+ import { taskChip } from '../../shared/task-chip.js';
18
+ import { inputView, notPassed, type EarlierTask, type InputFile } from '../inputs.js';
19
+ import { roundLabel, roundWhy } from '../../../words/rounds.js';
20
+ import { correctionsOf, hadSession, isPy, producerOf, stateOf, taskLink, type TaskContext } from '../context.js';
21
+
22
+ const valueText = (v: unknown): string => (typeof v === 'string' ? v : JSON.stringify(v) ?? String(v));
23
+ const sameJson = (a: unknown, b: unknown): boolean => {
24
+ try {
25
+ return JSON.stringify(a) === JSON.stringify(b);
26
+ } catch {
27
+ return false;
28
+ }
29
+ };
30
+
31
+ /** A task's outcome as a pill, in its words. */
32
+ const outcomeChip = (o: Outcome) => pill({ text: outcomeLabel(o), tone: outcomeTone(o), mark: outcomeMark(o) });
33
+
34
+ /** What the task read: its parameters, its input files, the earlier tasks, and (for an agent task) its prompt. */
35
+ export function inputPane(c: TaskContext): TemplateResult {
36
+ const d = c.detail;
37
+ const io = d.io;
38
+ const params = Object.entries(io.params);
39
+ const { files, earlier } = inputView(io);
40
+ const source = (v: unknown) => io.upstream.find((u) => u.outputs.some((o) => o.file.exists && sameJson(o.file.content, v)));
41
+ return html`<h4 class="sect-h">${msg('Parameters')}</h4>
42
+ ${params.length
43
+ ? html`<table class="ct-fields params">
44
+ ${params.map(([k, v]) => {
45
+ const from = source(v);
46
+ return html`<tr>
47
+ <td class="jmono">${k}</td>
48
+ <td>${v !== null && typeof v === 'object' ? html`<cae-json-tree .value=${v} .open=${0}></cae-json-tree>` : html`<span class="jmono">${valueText(v)}</span>`}</td>
49
+ <td>${from ? html`<span class="from">${msg(html`From ${taskLink(c, from)}`)}</span>` : nothing}</td>
50
+ </tr>`;
51
+ })}
52
+ </table>`
53
+ : html`<div class="meta">${msg('No parameters')}</div>`}
54
+ <h4 class="sect-h">${msg('Input files')}</h4>
55
+ ${files.length ? files.map((f) => inputCard(c, f)) : html`<div class="meta">${msg('No input files')}</div>`}
56
+ <h4 class="sect-h">${msg('Earlier tasks')}</h4>
57
+ ${earlier.length ? earlier.map((e) => earlierTask(c, e)) : html`<div class="meta">${msg('No earlier tasks')}</div>`}
58
+ ${isPy(d) ? nothing : promptSection(c)}`;
59
+ }
60
+
61
+ /** One file the task reads: its check, and the earlier task that writes it or that it is from before the run. */
62
+ function inputCard(c: TaskContext, f: InputFile) {
63
+ const u = f.from;
64
+ const state = u ? c.outcomes.get(u.key)?.outcome : undefined;
65
+ const origin = u
66
+ ? html`<span>${msg(html`Output of ${taskLink(c, u)}`)}</span>${state && state !== 'done' ? outcomeChip(state) : nothing}`
67
+ : msg('File from before the run');
68
+ // Written by an earlier task: that task's check of it ("passed", "not written (task failed)").
69
+ const st = f.out?.status;
70
+ if (!st) return ioFileCard(f.spec, 'input', c.run, { origin });
71
+ const chip = contractChip(st);
72
+ return ioFileCard({ ...f.spec, status: st }, 'input', c.run, { origin, chip });
73
+ }
74
+
75
+ /** One earlier task: its status, how many of its output files this task reads, and the others folded under it (open when one did not pass). */
76
+ function earlierTask(c: TaskContext, e: EarlierTask) {
77
+ const u = e.task;
78
+ const kindName = isPython(u) ? msg('Python task') : msg('Agent task');
79
+ const state = c.outcomes.get(u.key)?.outcome;
80
+ const n = u.outputs.length;
81
+ const summary = !n
82
+ ? msg('No output files')
83
+ : facts(n === 1 ? msg('1 output file') : msg(str`${n} output files`), e.read ? (e.read === 1 ? msg('1 read by this task') : msg(str`${e.read} read by this task`)) : '');
84
+ const head = html`<div class="up-hd">
85
+ ${executorIcon(isPython(u), kindName)}
86
+ ${taskLink(c, u)}
87
+ ${state ? outcomeChip(state) : nothing}
88
+ <span class="meta">${summary}</span>
89
+ </div>`;
90
+ if (!e.rest.length) return html`<div class="upstream">${head}</div>`;
91
+ const cards = e.rest.map((o) => ioFileCard(o, 'output', c.run, { producerOf: producerOf(c) }));
92
+ return e.rest.some(notPassed)
93
+ ? html`<div class="upstream">${head}${cards}</div>`
94
+ : html`<details class="upstream"><summary>${head}</summary>${cards}</details>`;
95
+ }
96
+
97
+ /** The prompt of the round chosen in the transcript, or why there is none. */
98
+ function promptSection(c: TaskContext) {
99
+ const d = c.detail;
100
+ const n = c.launches.length;
101
+ const shown = c.shownRound;
102
+ const info = c.rounds[shown];
103
+ const tries = c.rounds[c.rounds.length - 1]?.tryNo ?? 1;
104
+ const ran = d.rows.filter(isLaunched);
105
+ const names = attemptNames(ran);
106
+ const starts = runStarts(ran);
107
+ const prompt = c.launches[shown]?.prompt ?? '';
108
+ const state = stateOf(c);
109
+ return html`<h4 class="sect-h">${msg('Prompt')}${n > 1 && info
110
+ ? html` <span class="meta">${roundLabel(info, tries, names[info.tryNo - 1])}: ${roundWhy(info, starts[info.tryNo - 1] !== starts[info.tryNo - 2])}</span>`
111
+ : nothing}</h4>
112
+ ${prompt
113
+ ? promptText(prompt)
114
+ : html`<div class="meta">${d.stream
115
+ ? msg('Loading…')
116
+ : hadSession(d)
117
+ ? facts(msg('No prompt'), msg('not saved (keep_transcripts = false)'))
118
+ : facts(msg('No prompt'), outcomeLabel(state))}</div>`}`;
119
+ }
120
+
121
+ /** Per attempt that reported any: tokens, API calls, cost and identity; per hop under a model switch. */
122
+ function usageTable(c: TaskContext, rows: JournalRow[]) {
123
+ const spent = rows.filter((r) => isLaunched(r) && (r.usage || (r.cost_usd !== null && r.cost_usd !== undefined)));
124
+ if (!spent.length) return nothing;
125
+ const dash = html`<td class="jdim">—</td>`;
126
+ const readings: SourcedReading[] = runReadings(c.journal.length ? c.journal : rows);
127
+ const quota = spent.some((r) => (r.quota ?? []).length);
128
+ const dashL = html`<td class="l jdim">—</td>`;
129
+ // The identity column is next to it: name the account only when the reading is another one's.
130
+ const reading = (q: ReturnType<typeof tryQuota>['start'], cred: string | undefined) =>
131
+ q ? html`<td class="l" title=${readingTip(q)}>${(q.credential ?? '') === (cred ?? '') ? readingShort(q) : accountReading(q)}</td>` : dashL;
132
+ return html`<h4 class="sect-h">${msg('Tokens and cost')}</h4>
133
+ <div class="usage-wrap" data-scroll="x"><table class="usage">
134
+ <tr>
135
+ <th class="l"></th><th>${msg('Input')}</th><th>${msg('Output', { id: 'tokens-output', desc: 'Column: output tokens' })}</th><th>${msg('Cache read')}</th><th>${msg('Cache write')}</th>
136
+ <th>${msg('API calls')}</th><th title=${msg('Reported by the coding agent')}>${msg('Cost')}</th><th class="l">${msg('Identity')}</th>
137
+ ${quota
138
+ ? html`<th class="l" title=${msg('Subscription usage when the agent session started (account-wide)')}>${msg('Usage at start')}</th>
139
+ <th class="l" title=${msg('The first reading of the same account after this attempt ended')}>${msg('Usage after')}</th>`
140
+ : nothing}
141
+ </tr>
142
+ ${spent.map((r) => {
143
+ const u = r.usage;
144
+ const hops = r.hops ?? [];
145
+ return html`<tr>
146
+ <td class="l">${attemptLabel(r.attempt)}</td>
147
+ ${u
148
+ ? html`<td>${tokenCount(u.input)}</td><td>${tokenCount(u.output)}</td><td>${tokenCount(u.cache_read)}</td><td>${tokenCount(u.cache_creation)}</td><td>${u.calls}</td>`
149
+ : html`${dash}${dash}${dash}${dash}${dash}`}
150
+ <td>${usd(r.cost_usd)}</td><td class="l" title=${credentialTip(r.credential) || nothing}>${credentialLabel(r.credential) || '—'}</td>
151
+ ${quota ? html`${reading(tryQuota(r, readings).start, r.credential)}${reading(tryQuota(r, readings).next, r.credential)}` : nothing}
152
+ </tr>
153
+ ${hops.length > 1
154
+ ? hops.map(
155
+ (h) => html`<tr class="hop">
156
+ <td class="l">${facts(h.model || h.route || '—', stopLabel(h.stop))}</td>
157
+ <td></td><td></td><td></td><td></td><td></td>
158
+ <td>${usd(h.cost_usd)}</td><td class="l" title=${credentialTip(h.credential) || nothing}>${credentialLabel(h.credential) || '—'}</td>
159
+ ${quota ? html`<td></td><td></td>` : nothing}
160
+ </tr>`,
161
+ )
162
+ : nothing}`;
163
+ })}
164
+ </table></div>`;
165
+ }
166
+
167
+ /** What the task wrote: its output files, its outcome, tokens and cost, and the later tasks. */
168
+ export function outputPane(c: TaskContext): TemplateResult {
169
+ const d = c.detail;
170
+ const io = d.io;
171
+ const last = d.rows[d.rows.length - 1];
172
+ // The reason, a refusal's cause and a model switch are in the verdict above, so they are not repeated here.
173
+ return html`<h4 class="sect-h">${msg('Output files')}</h4>
174
+ ${io.outputs.length
175
+ ? io.outputs.map((o) => ioFileCard(o, 'output', c.run, { producerOf: producerOf(c) }))
176
+ : html`<div class="meta">${msg('No output files')}</div>`}
177
+ ${last
178
+ ? html`<h4 class="sect-h">${msg('Outcome')}</h4>
179
+ <div class="ct-in">
180
+ ${pill({ text: stopLabel(last.stop, last.reason), tone: stopTone(last.stop) })}
181
+ ${isLaunched(last) ? html`<span class="meta">${facts(attemptLabel(last.attempt), fmtDur(last.wall_s), correctionsOf(last))}</span>` : nothing}
182
+
183
+ </div>`
184
+ : nothing}
185
+ ${usageTable(c, d.rows)}
186
+ <h4 class="sect-h">${msg('Later tasks')}</h4>
187
+ ${io.downstream.length
188
+ ? html`<div class="down">${io.downstream.map((x) => taskChip(c.host, kindUnit(x), x))}</div>`
189
+ : html`<div class="meta">${msg('No later tasks')}</div>`}`;
190
+ }