@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,72 @@
1
+ // The styles of `ca-monitor`: its header, the filter bar and the view below.
2
+ // The tab list's are in `tabs.ts`. The monitor is a container (`ca-monitor`):
3
+ // its parts follow the width it is given, not the window's, so it fits any box
4
+ // of a page that embeds it.
5
+ import { css } from 'lit';
6
+
7
+ export const monitorStyles = css`
8
+ :host { display: flex; flex-direction: column; height: 100%; min-height: 0; font: 13px/1.5 var(--sans); color: var(--text);
9
+ background: var(--backdrop); container: ca-monitor / inline-size; }
10
+ header { flex: none; display: flex; gap: 14px; align-items: center; padding: 10px 18px; border-bottom: 1px solid var(--line);
11
+ background: color-mix(in srgb, var(--bg) 75%, transparent); backdrop-filter: blur(10px); position: relative; z-index: 20; }
12
+ .brand { display: flex; align-items: center; gap: 8px; font-weight: 700; font-size: 15px; letter-spacing: 0.02em; }
13
+ /* the name stays on one line and whole up to a third of the width; the run button gives up its width instead */
14
+ .brand { flex: none; max-width: 30cqi; white-space: nowrap; }
15
+ .brand span { overflow: hidden; text-overflow: ellipsis; }
16
+ .brand svg { width: 22px; height: 22px; flex: none; }
17
+ .logo-braces { stroke: var(--text); }
18
+ .spark-a { stop-color: var(--accent); }
19
+ .spark-b { stop-color: var(--agent); }
20
+ .logo-spark { transform-origin: 60px 60px; }
21
+ :host([live]) .logo-spark { animation: core-beat 1.8s var(--ease) infinite; }
22
+ .runbtn { display: flex; align-items: center; gap: 10px; min-width: min(150px, 100%); max-width: 52cqi; cursor: pointer; padding: 6px 13px;
23
+ border-radius: 999px; background: var(--panel); border: 1px solid var(--line); color: var(--text); transition: border-color 0.2s, background 0.2s; }
24
+ .runbtn:hover { border-color: var(--line2); background: var(--panel2); }
25
+ .rn { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: none; max-width: 40%; }
26
+ .rs { color: var(--text-muted); font-size: 11.5px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
27
+ .chev { color: var(--text-muted); }
28
+ /* a hub: the run's host, after its name */
29
+ .hostchip { flex: none; font-family: var(--mono); font-size: 11px; color: var(--text-2); padding: 0 7px; border: 1px solid var(--line2);
30
+ border-radius: 999px; white-space: nowrap; max-width: 24ch; overflow: hidden; text-overflow: ellipsis; }
31
+ .runbtn .pill { flex: none; font-size: 11px; }
32
+ ca-run-picker { inset-inline-start: 110px; }
33
+ /* the controls keep their width; the name and the run button give theirs */
34
+ .hdr-right { margin-left: auto; display: flex; align-items: center; gap: 12px; flex: none; white-space: nowrap; }
35
+ .nowline { font-size: 12px; color: var(--text-2); white-space: nowrap; overflow: hidden; max-width: 40cqi;
36
+ display: inline-flex; align-items: center; gap: 4px; }
37
+ .clock { font-family: var(--mono); font-size: 11.5px; color: var(--text-muted); }
38
+ .langs { --cae-segmented-radius: 999px; --cae-segmented-height: auto; --cae-segmented-padding: 2px 9px; --cae-segmented-font-size: 11px;
39
+ --cae-segmented-divider: 0; --cae-segmented-hover: var(--text-2); }
40
+ .live-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--status-running); display: inline-block; animation: breathe 1.8s ease-in-out infinite; }
41
+ .live-dot.off { background: var(--line2); animation: none; box-shadow: none; }
42
+
43
+ .bar { flex: none; display: flex; gap: 8px; padding: 8px 18px; border-top: 1px solid var(--line); align-items: center; flex-wrap: wrap; }
44
+ .bar select, .bar input { background: var(--panel); color: var(--text); border: 1px solid var(--line); border-radius: 8px;
45
+ padding: 5px 9px; outline: none; font: inherit; font-size: 12px; }
46
+ .bar input:focus, .bar select:focus { border-color: var(--focus); box-shadow: 0 0 0 calc(var(--focus-width) - 2px) var(--focus); }
47
+
48
+ .api-error { flex: none; margin: 0; padding: 8px 18px; color: var(--status-failed); font: 12px var(--mono); overflow-wrap: anywhere; }
49
+ .api-error:empty { padding: 0; }
50
+ main { border-top: 1px solid var(--line); flex: 1 1 auto; min-height: 0; overflow: auto; padding: 16px 18px 48px; }
51
+ main.stream { display: flex; flex-direction: column; overflow: hidden; padding-bottom: 16px; }
52
+ /* too narrow for one line: the controls go under the name and the run button */
53
+ @container ca-monitor (max-width: 1000px) {
54
+ header { flex-wrap: wrap; row-gap: 8px; }
55
+ }
56
+ @container ca-monitor (max-width: 760px) {
57
+ header { gap: 8px; padding: 8px 12px; }
58
+ /* the run button takes the rest of the first line; its run line gives up its width first */
59
+ .runbtn { flex: 1 1 0; min-width: 0; max-width: none; }
60
+ /* the run picker spans the header, 16px from each side */
61
+ ca-run-picker { inset-inline: 16px; width: auto; }
62
+ .hdr-right { width: 100%; margin-left: 0; flex-wrap: wrap; row-gap: 6px; }
63
+ .nowline { max-width: none; flex: 1 1 100%; }
64
+ main { padding: 12px 12px 40px; }
65
+ .bar { padding: 8px 12px; }
66
+ .bar input { flex: 1 1 10em; min-width: 0; }
67
+ }
68
+ @container ca-monitor (max-width: 420px) {
69
+ .brand { max-width: 40cqi; }
70
+ .runbtn { padding: 6px 10px; gap: 8px; }
71
+ }
72
+ `;
@@ -0,0 +1,143 @@
1
+ // The monitor's tab list: the built-in views, then the custom views; each tab
2
+ // with its count, and the line under the selected one. The selected tab is
3
+ // bold and underlined, not only coloured. A list wider than the monitor
4
+ // scrolls sideways, with a shade at each edge that has more tabs past it.
5
+ import { isRunPanel, type Info } from '@contraagent/api';
6
+ import { msg, str } from '@lit/localize';
7
+ import { css, html, nothing, type TemplateResult } from 'lit';
8
+ import { toneAttr } from '@contraagent/elements';
9
+ import type { Tab } from '../../core/view-route.js';
10
+ import type { Tone } from '../../lib/tone.js';
11
+
12
+ export interface TabInfo {
13
+ id: Tab;
14
+ label: string;
15
+ icon: string;
16
+ tip?: string;
17
+ panel: boolean;
18
+ }
19
+
20
+ /** The built-in tabs, in the current locale (call at render time). */
21
+ const builtinTabs = (): Omit<TabInfo, 'panel'>[] => [
22
+ { id: 'overview', label: msg('Overview'), icon: '◎' },
23
+ { id: 'tasks', label: msg('Tasks', { id: 'tab-tasks', desc: 'Tab: the list of tasks' }), icon: '≡' },
24
+ { id: 'journal', label: msg('History'), icon: '▤', tip: 'journal.jsonl' },
25
+ { id: 'outputs', label: msg('Outputs'), icon: '▣' },
26
+ { id: 'definitions', label: msg('Definitions'), icon: '⌘' },
27
+ { id: 'procs', label: msg('Processes'), icon: '⚙' },
28
+ { id: 'stream', label: msg('Task detail'), icon: '✦' },
29
+ ];
30
+
31
+ /** Every tab, in the current locale: the built-in ones, then one per custom view computed per run (`panels`; a trends panel is not a run's tab). */
32
+ export function monitorTabs(panels: Info['panels']): TabInfo[] {
33
+ return [
34
+ ...builtinTabs().map((t) => ({ ...t, panel: false })),
35
+ ...panels.filter(isRunPanel).map((p) => ({
36
+ id: `panel:${p.name}` as Tab,
37
+ label: p.title || p.name,
38
+ icon: p.icon || '▤',
39
+ tip: p.description ? msg(str`${p.description} (custom view)`) : msg('Custom view'),
40
+ panel: true,
41
+ })),
42
+ ];
43
+ }
44
+
45
+ /** The id of tab `i` in the tab list, which the view below it (`role="tabpanel"`) names as its label. */
46
+ export const tabId = (i: number): string => `tab-${i}`;
47
+
48
+ /**
49
+ * The tab list: `current` selected, a count per tab from `badge` (none when it
50
+ * returns null or ''), and the key hints. `pick` is called with a tab clicked.
51
+ * Each tab controls the element with the id `panel`. The arrow keys, Home and
52
+ * End move the focus between the tabs (a `RovingFocusController` over `.tab`
53
+ * in the host); Enter and Space select one.
54
+ */
55
+ export function tabBar(
56
+ tabs: TabInfo[],
57
+ current: Tab,
58
+ badge: (id: Tab) => [string | number, Tone] | null,
59
+ pick: (id: Tab) => void,
60
+ panel: string,
61
+ /** Show the hint for the single-key shortcuts. */
62
+ keys = true,
63
+ ): TemplateResult {
64
+ return html`<nav data-scroll="x">
65
+ <div class="tabs" role="tablist" aria-label=${msg('Views', { desc: 'The label of the list of tabs: Overview, Tasks, History, ...' })}>
66
+ ${tabs.map((t, i) => {
67
+ const b = badge(t.id);
68
+ const sel = t.id === current;
69
+ return html`${t.panel && !tabs[i - 1]?.panel ? html`<span class="tab-sep" aria-hidden="true" title=${msg('Custom views')}></span>` : nothing}
70
+ <button type="button" role="tab" id=${tabId(i)} aria-selected=${sel ? 'true' : 'false'} aria-controls=${panel}
71
+ class="tab ${t.panel ? 'panel-tab' : ''} ${sel ? 'sel' : ''}" title=${t.tip ?? nothing} @click=${() => pick(t.id)}>
72
+ <span class="tab-ic" aria-hidden="true">${t.icon}</span><span class="tab-label" data-label=${t.label}>${t.label}</span>${b && b[0] !== ''
73
+ ? html`<span class="badge" data-tone=${toneAttr(b[1])}>${b[0]}</span>`
74
+ : nothing}
75
+ </button>`;
76
+ })}
77
+ </div>
78
+ <span class="tab-ind init" aria-hidden="true"></span>
79
+ ${keys ? html`<span class="tabhint meta" role="note" aria-label=${msg('Keyboard shortcuts')}
80
+ ><span aria-hidden="true"><span class="kbd">1</span>–<span class="kbd">${Math.min(9, tabs.length)}</span> ${msg('Tabs')} |
81
+ <span class="kbd">r</span> ${msg('Runs')} | <span class="kbd">/</span> ${msg('Filter')}</span></span
82
+ >` : nothing}
83
+ </nav>`;
84
+ }
85
+
86
+ /**
87
+ * Move the line under the selected tab to it (after a render, a resize); when
88
+ * the selection changed, scroll the tab list so the selected tab is in view.
89
+ */
90
+ export function moveTabIndicator(root: ParentNode): void {
91
+ const sel = root.querySelector<HTMLElement>('.tab.sel');
92
+ const ind = root.querySelector<HTMLElement>('.tab-ind');
93
+ if (!sel || !ind) return;
94
+ ind.style.left = `${sel.offsetLeft + 10}px`;
95
+ ind.style.width = `${Math.max(12, sel.offsetWidth - 20)}px`;
96
+ if (ind.classList.contains('init')) requestAnimationFrame(() => ind.classList.remove('init'));
97
+ const nav = ind.parentElement;
98
+ if (nav && ind.dataset['tab'] !== sel.id) {
99
+ ind.dataset['tab'] = sel.id;
100
+ const edge = 24;
101
+ if (sel.offsetLeft - edge < nav.scrollLeft) nav.scrollLeft = Math.max(0, sel.offsetLeft - edge);
102
+ else if (sel.offsetLeft + sel.offsetWidth + edge > nav.scrollLeft + nav.clientWidth)
103
+ nav.scrollLeft = sel.offsetLeft + sel.offsetWidth + edge - nav.clientWidth;
104
+ }
105
+ }
106
+
107
+ export const tabStyles = css`
108
+ /* Scroll shades: a cover at each end of the tabs (moves with them) over a shade at each edge of the list (stays):
109
+ the shade shows at an edge while more tabs lie past it. */
110
+ nav { flex: none; display: flex; gap: 2px; padding: 6px 18px 0; position: relative; overflow-x: auto; scrollbar-width: none; align-items: center;
111
+ --shade: color-mix(in srgb, var(--text) 22%, transparent);
112
+ background:
113
+ linear-gradient(to right, var(--backdrop) 40%, transparent) left / 32px 100% no-repeat local,
114
+ linear-gradient(to left, var(--backdrop) 40%, transparent) right / 32px 100% no-repeat local,
115
+ radial-gradient(farthest-side at 0 50%, var(--shade), transparent) left / 12px 100% no-repeat scroll,
116
+ radial-gradient(farthest-side at 100% 50%, var(--shade), transparent) right / 12px 100% no-repeat scroll; }
117
+ nav::-webkit-scrollbar { display: none; }
118
+ .tabs { flex: none; display: flex; gap: 2px; align-items: center; }
119
+ .tab { position: relative; background: none; border: none; padding: 8px 14px 11px; color: var(--text-muted); cursor: pointer;
120
+ font-weight: 500; white-space: nowrap; transition: color 0.2s; }
121
+ .tab:hover { color: var(--text-2); }
122
+ .tab.sel { color: var(--text); font-weight: 600; }
123
+ /* The label keeps the width of its bold form, so the tabs do not move when the selection does. */
124
+ .tab-label { display: inline-flex; flex-direction: column; }
125
+ .tab-label::after { content: attr(data-label); font-weight: 600; height: 0; overflow: hidden; visibility: hidden; }
126
+ .tab-ic { opacity: 0.55; margin-right: 6px; font-size: 12px; }
127
+ .tab.sel .tab-ic { opacity: 1; color: var(--accent); }
128
+ .badge { margin-left: 6px; font-size: 10px; font-weight: 500; padding: 0 6px; border-radius: 999px; background: var(--raise); color: var(--text-2); font-variant-numeric: tabular-nums; }
129
+ .badge[data-tone] { background: var(--tone-bg); color: var(--tone); }
130
+ .tab-sep { width: 1px; height: 18px; background: var(--line2); margin: 0 8px 3px; flex: none; align-self: center; }
131
+ .tab-ind { position: absolute; bottom: 0; left: 0; width: 0; height: 2px; border-radius: 2px;
132
+ background: var(--accent); transition: left 0.3s var(--ease), width 0.3s var(--ease); }
133
+ .tab-ind.init { transition: none; }
134
+ .tabhint { margin-left: auto; padding-left: 12px; white-space: nowrap; }
135
+ /* In a narrow monitor the tabs keep the line: no key hints. */
136
+ @container ca-monitor (max-width: 900px) {
137
+ .tabhint { display: none; }
138
+ }
139
+ @container ca-monitor (max-width: 760px) {
140
+ nav { padding: 4px 8px 0; }
141
+ .tab { padding: 8px 10px 11px; }
142
+ }
143
+ `;
@@ -0,0 +1,67 @@
1
+ // The view under the monitor's tabs: the element the view route's tab shows, given
2
+ // the data it reads.
3
+ import { hostOf, isRunLive, latestTask, runActivity, runRow, type MonitorClient, type MonitorSnapshot, type RunDerived } from '@contraagent/api';
4
+ import { msg } from '@lit/localize';
5
+ import { html, nothing, type TemplateResult } from 'lit';
6
+ import type { ViewRoute } from '../../core/view-route.js';
7
+ import { mixedReplay } from '../../words/run-line.js';
8
+ import '../overview/ca-overview.js';
9
+ import '../lists/ca-task-table.js';
10
+ import '../lists/ca-journal-table.js';
11
+ import '../lists/ca-contracts.js';
12
+ import '../lists/ca-definitions.js';
13
+ import '../lists/ca-procs-view.js';
14
+ import '../lists/ca-panel-view.js';
15
+ import '../task/ca-task-view.js';
16
+
17
+ export interface TabViewData {
18
+ snap: MonitorSnapshot;
19
+ viewRoute: ViewRoute;
20
+ /** `deriveRun` of the run's journal and plan. */
21
+ derived: RunDerived;
22
+ /** The text filter, as typed. */
23
+ q: string;
24
+ client: MonitorClient;
25
+ baseUrl: string;
26
+ }
27
+
28
+ /**
29
+ * The view of `viewRoute.tab`; with no run, a blank page that says there are no
30
+ * runs once the server's run list says so (the API's error is above it).
31
+ */
32
+ export function tabView({ snap, viewRoute, derived, q, client, baseUrl }: TabViewData): TemplateResult {
33
+ const { state } = snap;
34
+ if (!viewRoute.run) {
35
+ return html`<div class="blank">${snap.runsLoaded && !snap.error
36
+ ? html`<span class="ic" aria-hidden="true">✦</span><b>${msg('No runs yet', { id: 'no-runs-yet' })}</b>`
37
+ : nothing}</div>`;
38
+ }
39
+ const summary = runRow(snap.runs, snap.run);
40
+ const live = isRunLive(state, summary);
41
+ switch (viewRoute.tab) {
42
+ case 'overview':
43
+ return html`<ca-overview .state=${state} .summary=${summary} .host=${hostOf(snap.hosts?.hosts, summary)} .info=${snap.info} .run=${viewRoute.run} .layer=${viewRoute.layer} .unit=${viewRoute.unit} .sel=${viewRoute.sel}></ca-overview>`;
44
+ case 'tasks':
45
+ return html`<ca-task-table .run=${viewRoute.run} .journal=${state.journal} .plan=${state.plan} .kind=${viewRoute.kind} .q=${q} ?live=${live}></ca-task-table>`;
46
+ case 'journal':
47
+ return html`<ca-journal-table .run=${viewRoute.run} .rows=${state.journal} .plan=${state.plan} .fresh=${snap.fresh} .kind=${viewRoute.kind} .stop=${viewRoute.stop} .q=${q}
48
+ .extras=${summary?.row_extras ?? []} ?replay-marks=${mixedReplay(summary)}></ca-journal-table>`;
49
+ case 'outputs':
50
+ return html`<ca-contracts .run=${viewRoute.run} .outputs=${state.outputs} .journal=${state.journal} .plan=${state.plan}></ca-contracts>`;
51
+ case 'definitions':
52
+ return html`<ca-definitions .client=${client} .run=${viewRoute.run} .journal=${state.journal} .plan=${state.plan} .live=${live}
53
+ .selected=${viewRoute.def}></ca-definitions>`;
54
+ case 'procs':
55
+ return html`<ca-procs-view .procs=${state.procs} ?unresponsive=${runActivity(summary, !!state.procs?.alive) === 'unresponsive'}
56
+ ?exported=${!!snap.info.export}></ca-procs-view>`;
57
+ case 'stream':
58
+ return html`<ca-task-view .client=${client} .journal=${state.journal} .plan=${state.plan} base-url=${baseUrl} .run=${viewRoute.run}
59
+ .taskKey=${viewRoute.key ?? latestTask(derived.rows)} .view=${viewRoute.view} .round=${viewRoute.round} .live=${live}
60
+ ?exported=${!!snap.info.export} ?replay-marks=${mixedReplay(summary)}></ca-task-view>`;
61
+ default: {
62
+ const name = viewRoute.tab.slice('panel:'.length);
63
+ const info = snap.info.panels.find((p) => p.name === name);
64
+ return html`<ca-panel-view .name=${name} .panel=${info} .data=${state.panels[name]}></ca-panel-view>`;
65
+ }
66
+ }
67
+ }
@@ -0,0 +1,157 @@
1
+ import { deriveRun, type JournalRow, type LaunchEvent, type MonitorClient, type Plan, type TaskDetail, type TaskOutcome } from '@contraagent/api';
2
+ import { localized, msg } from '@lit/localize';
3
+ import { LitElement, html, nothing, type PropertyValues } from 'lit';
4
+ import { customElement, property, query, state } from 'lit/decorators.js';
5
+ import { emit, type RoundInfo, type RoundsChangedDetail } from '../../core/events.js';
6
+ import { TASK_VIEWS, type TaskView } from '../../core/view-route.js';
7
+ import { TaskDetailController } from '../../controllers/task-detail.js';
8
+ import { base } from '@contraagent/elements/styles';
9
+ import { executorIconStyles } from '../../words/executor.js';
10
+ import { contractStyles } from '../shared/contract-parts.js';
11
+ import './ca-transcript.js';
12
+ import type { CaTranscript } from './ca-transcript.js';
13
+ import { tagStyles } from '@contraagent/elements/transcript';
14
+ import { isPy, type TaskContext } from './context.js';
15
+ import { taskHeader } from './header.js';
16
+ import { noTranscript } from './panes/transcript.js';
17
+ import { inputPane, outputPane } from './panes/io.js';
18
+ import { definitionPane } from './panes/definition.js';
19
+ import { taskViewStyles } from './styles.js';
20
+
21
+ /** Each view's tab label, in the current locale (call at render time). */
22
+ const viewLabel = (): Record<TaskView, string> => ({
23
+ transcript: msg('Transcript'),
24
+ input: msg('Input'),
25
+ output: msg('Output', { id: 'view-output', desc: 'Tab: the files a task wrote' }),
26
+ definition: msg('Definition'),
27
+ });
28
+
29
+ /**
30
+ * One task: who ran it, every finished attempt, and four views of it: the
31
+ * transcript (live), its input (params, upstream outputs, declared inputs, the
32
+ * prompt), its output (files against their contracts, the result, who uses it)
33
+ * and its definition. Sends `ca-navigate` with `view` or `round`, and
34
+ * `ca-open-task` for a linked task.
35
+ *
36
+ * @fires ca-navigate - `{view}` or `{round}`: another view or round of this task
37
+ * @fires ca-open-task - `{key}`: an upstream or downstream task was clicked
38
+ */
39
+ @customElement('ca-task-view')
40
+ @localized()
41
+ export class CaTaskView extends LitElement {
42
+ static override styles = [base, contractStyles, tagStyles, executorIconStyles, taskViewStyles];
43
+
44
+ @property({ attribute: false }) client!: MonitorClient;
45
+ @property({ attribute: 'base-url' }) baseUrl = '';
46
+ @property() run = '';
47
+ /** A task key; null when there is no task to show. */
48
+ @property({ attribute: false }) taskKey: string | null = null;
49
+ @property() view: TaskView = 'transcript';
50
+ /** The round shown, 1-based; null follows the latest. */
51
+ @property({ attribute: false }) round: number | null = null;
52
+ /** The run is live. */
53
+ @property({ type: Boolean }) live = false;
54
+ /** The whole run's journal: the subscription readings other tasks took after this one, and what happened to the tasks it reads from. Optional. */
55
+ @property({ attribute: false }) journal: JournalRow[] = [];
56
+ /** The run's plan: whether a task with no attempt is waiting or not started, and which earlier task stopped it. Optional. */
57
+ @property({ attribute: false }) plan: Plan | null = null;
58
+ /** Read from an export (`Info.export`): it holds no transcript. */
59
+ @property({ type: Boolean }) exported = false;
60
+ /** The run is a replay that also launched (`mixedReplay`): each attempt played from its recording is marked. */
61
+ @property({ type: Boolean, attribute: 'replay-marks' }) replayMarks = false;
62
+
63
+ private readonly detail = new TaskDetailController(this);
64
+ @query('ca-transcript') private transcriptEl?: CaTranscript;
65
+ @state() private launches: (LaunchEvent | null)[] = [];
66
+ @state() private shownRound = -1;
67
+ @state() private rounds: RoundInfo[] = [];
68
+ /** What happened to every task of the run (`deriveRun` of `journal` and `plan`), by key. */
69
+ private outcomes: ReadonlyMap<string, TaskOutcome> = new Map();
70
+
71
+ protected override willUpdate(changed: PropertyValues<this>): void {
72
+ if (changed.has('run') || changed.has('taskKey') || changed.has('client')) {
73
+ this.detail.load(this.client, this.run, this.taskKey);
74
+ this.launches = [];
75
+ this.shownRound = -1;
76
+ this.rounds = [];
77
+ }
78
+ this.outcomes = this.plan ? deriveRun(this.journal, this.plan).outcomes : new Map<string, TaskOutcome>();
79
+ }
80
+
81
+ /** The view shown: a Python task has no transcript, so it opens on its output. */
82
+ private shownView(d: TaskDetail): TaskView {
83
+ return this.view === 'transcript' && isPy(d) && !d.stream ? 'output' : this.view;
84
+ }
85
+
86
+ private revealSearch(query: string, nth: number): void {
87
+ const at = this.transcriptEl?.revealWebSearch(query, nth);
88
+ emit(this, 'ca-navigate', at ? { view: 'transcript', round: at.round } : { view: 'transcript' });
89
+ }
90
+
91
+ override render() {
92
+ const key = this.taskKey;
93
+ if (!key) {
94
+ return html`<div class="blank"><span class="ic" aria-hidden="true">✦</span><b>${msg('No task selected')}</b></div>`;
95
+ }
96
+ const d = this.detail.value;
97
+ if (!d) return html`<div class="taskmeta meta"><strong>${key}</strong> ${msg('Loading…')}</div>`;
98
+ const c: TaskContext = {
99
+ host: this,
100
+ run: this.run,
101
+ detail: d,
102
+ live: d.launches.length > 0 && this.live,
103
+ journal: this.journal,
104
+ plan: this.plan,
105
+ outcomes: this.outcomes,
106
+ launches: this.launches,
107
+ shownRound: this.shownRound,
108
+ rounds: this.rounds,
109
+ exported: this.exported,
110
+ replayMarks: this.replayMarks,
111
+ };
112
+ const view = this.shownView(d);
113
+ return html`${taskHeader(c, key, (q, nth) => this.revealSearch(q, nth))} ${this.renderViews(d, view)}
114
+ ${d.stream
115
+ ? html`<ca-transcript .run=${this.run} .stream=${d.stream} base-url=${this.baseUrl} .client=${this.client} .live=${c.live}
116
+ .rows=${d.rows} .round=${this.round} mode=${view === 'transcript' ? 'full' : view === 'input' ? 'tabs' : 'none'}
117
+ @ca-rounds=${(e: CustomEvent<RoundsChangedDetail>) => {
118
+ this.launches = e.detail.launches;
119
+ this.shownRound = e.detail.shown;
120
+ this.rounds = e.detail.rounds;
121
+ }}></ca-transcript>`
122
+ : view === 'transcript'
123
+ ? noTranscript(c)
124
+ : nothing}
125
+ ${view !== 'transcript' ? html`<div class="pane">${this.renderPane(c, view)}</div>` : nothing}`;
126
+ }
127
+
128
+ private renderViews(d: TaskDetail, view: TaskView) {
129
+ const io = d.io;
130
+ const py = isPy(d) && !d.stream;
131
+ const n: Partial<Record<TaskView, number>> = {
132
+ input: new Set([...io.inputs.map((o) => o.path), ...io.upstream.flatMap((u) => u.outputs.map((o) => o.path))]).size + Object.keys(io.params).length,
133
+ output: io.outputs.length,
134
+ };
135
+ return html`<div class="tviews" role="tablist">
136
+ ${TASK_VIEWS.filter((id) => !(py && id === 'transcript')).map((id) => {
137
+ const label = viewLabel()[id];
138
+ return html`<button type="button" role="tab" aria-selected=${id === view} class="tview ${id === view ? 'sel' : ''}"
139
+ @click=${() => emit(this, 'ca-navigate', { view: id })}>
140
+ ${label}${n[id] ? html`<span class="badge">${n[id]}</span>` : nothing}
141
+ </button>`;
142
+ })}
143
+ </div>`;
144
+ }
145
+
146
+ private renderPane(c: TaskContext, view: TaskView) {
147
+ if (view === 'input') return inputPane(c);
148
+ if (view === 'output') return outputPane(c);
149
+ return definitionPane(c);
150
+ }
151
+ }
152
+
153
+ declare global {
154
+ interface HTMLElementTagNameMap {
155
+ 'ca-task-view': CaTaskView;
156
+ }
157
+ }
@@ -0,0 +1,214 @@
1
+ import { createMonitorClient, type JournalRow, type MonitorClient, type TranscriptEvent } from '@contraagent/api';
2
+ import { md } from '@contraagent/elements/markdown';
3
+ import type { CaeTranscript, TranscriptMemory, TranscriptSection, TranscriptStrings } from '@contraagent/elements/transcript';
4
+ import '@contraagent/elements/transcript/define';
5
+ import { localized, msg, str } from '@lit/localize';
6
+ import { LitElement, css, html, type PropertyValues } from 'lit';
7
+ import { customElement, property, query, state } from 'lit/decorators.js';
8
+ import { keyed } from 'lit/directives/keyed.js';
9
+ import { classifyRounds } from '../../adapters/transcript/rounds.js';
10
+ import { transcriptSections } from '../../adapters/transcript/sections.js';
11
+ import { StreamController } from '../../controllers/stream.js';
12
+ import { emit, type RoundInfo, type RoundsChangedDetail } from '../../core/events.js';
13
+ import { getLocale } from '../../core/i18n.js';
14
+ import { RememberedSet, SessionSet, memoryOf, pageMemory } from '../../core/memory.js';
15
+ import { promptText } from '../shared/prompt-text.js';
16
+ import { retryTip } from '../../words/attempts.js';
17
+ import { correctionTip } from '../../words/contract.js';
18
+ import { modelSwitchTip } from '../../words/hops.js';
19
+
20
+ /** The transcript's words, in the reader's language (call at render time). */
21
+ const strings = (): TranscriptStrings => ({
22
+ sections: msg('Agent sessions'),
23
+ sectionsTip: [
24
+ `${msg('Retry')}: ${retryTip()}`,
25
+ `${msg('Correction')}: ${correctionTip()}`,
26
+ `${msg('Model switch')}: ${modelSwitchTip()}`,
27
+ ].join('\n'),
28
+ loadEarlier: (n) => (n === 1 ? msg('Show 1 earlier line') : msg(str`Show ${n} earlier lines`)),
29
+ newBelow: (n) => (n === 1 ? msg('Show 1 new event') : msg(str`Show ${n} new events`)),
30
+ newInLatest: (n) =>
31
+ n === 1 ? msg('Show 1 new event in the running agent session') : msg(str`Show ${n} new events in the running agent session`),
32
+ prompt: msg('Prompt'),
33
+ assistant: msg('Assistant'),
34
+ reasoning: msg('Reasoning'),
35
+ characters: (n) => msg(str`${n} characters`),
36
+ tool: msg('tool'),
37
+ results: (n) => (n === 1 ? msg('1 result') : msg(str`${n} results`)),
38
+ done: msg('done', { id: 'tool-done', desc: 'A tool call that finished' }),
39
+ failed: msg('failed'),
40
+ running: msg('running'),
41
+ interrupted: msg('interrupted'),
42
+ interruptedTip: msg('The run ended before the tool call returned'),
43
+ query: msg('query'),
44
+ page: msg('page'),
45
+ fullText: msg('Full text'),
46
+ showAll: (n) => msg(str`Show all (${n} characters)`),
47
+ showLess: msg('Show less'),
48
+ });
49
+
50
+ /**
51
+ * The transcript of one task: every round (one session of the coding agent,
52
+ * with its command line and prompt), chat bubbles, collapsible tool cards (a
53
+ * web search shows its query and the pages it returned as links, a web page
54
+ * read its URL as a link),
55
+ * tailed live. A round is a try (a new session) or a fix-up (the same session,
56
+ * sent back because its output failed its checks); give it the task's journal
57
+ * rows (`.rows`) and each round says how it ended. It draws them with
58
+ * `<cae-transcript>`.
59
+ *
60
+ * Give it `.events` to show a saved transcript, or `run` + `stream` (and
61
+ * `base-url`) to tail one from the monitor. A new `.events` that starts with
62
+ * the same event objects as the last one is that transcript grown: its new
63
+ * events are added below and what is drawn stays. Sends `ca-navigate` with `round`
64
+ * when the reader picks a round, and a non-bubbling `ca-rounds`
65
+ * (`RoundsChangedDetail`) whenever its rounds or the shown round change.
66
+ *
67
+ * @fires ca-navigate - `{round}`: the reader picked a round (null for the latest)
68
+ * @fires ca-rounds - `{launches, shown, rounds}`, not bubbling: the rounds' launch events and what each was, for a host that shows a round's prompt
69
+ */
70
+ @customElement('ca-transcript')
71
+ @localized()
72
+ export class CaTranscript extends LitElement {
73
+ static override styles = css`
74
+ :host { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; position: relative; }
75
+ :host([mode='none']) { display: none; }
76
+ :host([mode='tabs']) { flex: none; }
77
+ `;
78
+
79
+ /** A saved transcript to show as is (no feed). */
80
+ @property({ attribute: false }) events: TranscriptEvent[] | null = null;
81
+ @property() run = '';
82
+ /** The transcript's task key (`TaskDetail.stream`). */
83
+ @property({ attribute: false }) stream: string | null = null;
84
+ @property({ attribute: 'base-url' }) baseUrl = '';
85
+ /** For "load earlier"; one is made from `base-url` when absent. */
86
+ @property({ attribute: false }) client: MonitorClient | null = null;
87
+ /** The task is running: show it working; when not, a call still marked running was interrupted. */
88
+ @property({ type: Boolean }) live = false;
89
+ /** The round to show, 1-based; null follows the latest. */
90
+ @property({ attribute: false }) round: number | null = null;
91
+ /** The task's journal rows (finished tries): each round then says how it ended. */
92
+ @property({ attribute: false }) rows: JournalRow[] = [];
93
+ /** `full`; `tabs`: only the round picker (another view of the task is shown); `none`: hidden. */
94
+ @property({ reflect: true }) mode: 'full' | 'tabs' | 'none' = 'full';
95
+
96
+ /** The round on screen, 0-based; -1 while there is none. */
97
+ @state() private shown = -1;
98
+ @query('cae-transcript') private view?: CaeTranscript;
99
+
100
+ private readonly feed = new StreamController(this);
101
+ private memory: TranscriptMemory | null = null;
102
+ private drawn: { key: unknown[]; rounds: RoundInfo[]; sections: TranscriptSection[] } | null = null;
103
+ private lastSent = '';
104
+ /** The saved transcript last given (`events`): a longer one that starts with it is the same transcript, grown. */
105
+ private fed: readonly TranscriptEvent[] | null = null;
106
+
107
+ private get source(): string {
108
+ return this.events ? 'static' : this.run && this.stream ? `${this.run}\n${this.stream}` : '';
109
+ }
110
+
111
+ override connectedCallback(): void {
112
+ super.connectedCallback();
113
+ if (this.hasUpdated) this.requestUpdate();
114
+ }
115
+
116
+ protected override willUpdate(changed: PropertyValues<this>): void {
117
+ const source = this.source;
118
+ if (!changed.has('events') && source === this.feed.loaded) return;
119
+ // The same saved transcript, grown: its new events are appended, and what is drawn stays.
120
+ const fed = this.fed;
121
+ const events = this.events;
122
+ this.fed = events;
123
+ if (events && fed && source === this.feed.loaded && extends_(events, fed)) {
124
+ this.feed.append(events.slice(fed.length));
125
+ return;
126
+ }
127
+ const { run, stream } = this;
128
+ const id = `transcript:${run}/${stream ?? ''}`;
129
+ // The page's monitor keeps the open cards for the browser tab and the position in the history entry;
130
+ // an embedded one (`history="memory"`) keeps both in its own memory.
131
+ const memory = memoryOf(this);
132
+ const open = memory === pageMemory ? new SessionSet(`${id}:open`) : new RememberedSet(`${id}:open`, this);
133
+ const tailed = !this.events && !!stream;
134
+ this.memory = {
135
+ isOpen: (card) => open.has(card),
136
+ setOpen: (card, on) => open.set(card, on),
137
+ scroll: () => (tailed ? memory.recall(`${id}:scroll`) : undefined),
138
+ setScroll: (at) => tailed && memory.remember(`${id}:scroll`, at),
139
+ };
140
+ this.shown = -1;
141
+ this.feed.load(source, this.events ? { events: this.events } : source && stream ? { run, stream, baseUrl: this.baseUrl } : null);
142
+ }
143
+
144
+ /** The rounds and their sections, drawn again only when the transcript, the rows or the language changed. */
145
+ private sections(): { rounds: RoundInfo[]; sections: TranscriptSection[] } {
146
+ const active = this.live && this.feed.tailing;
147
+ const key = [this.feed.version, this.rows, this.run, active, getLocale()];
148
+ if (this.drawn?.key.every((k, i) => k === key[i])) return this.drawn;
149
+ const t = this.feed.model;
150
+ const rounds = classifyRounds(
151
+ t.rounds.map((r) => r.launch),
152
+ this.rows,
153
+ );
154
+ this.drawn = { key, rounds, sections: transcriptSections(t, rounds, { run: this.run, rows: this.rows, active }) };
155
+ return this.drawn;
156
+ }
157
+
158
+ override render() {
159
+ const feed = this.feed;
160
+ const { sections } = this.sections();
161
+ return keyed(
162
+ feed.generation,
163
+ html`<cae-transcript .sections=${sections} .shown=${this.round === null ? null : this.round - 1} ?live=${this.live}
164
+ .earlier=${feed.behind} ?loading=${!feed.ready} .count=${feed.count} mode=${this.mode} .memory=${this.memory}
165
+ .markdown=${md} .renderDetail=${(d: { text: string }) => promptText(d.text)} .strings=${strings()}
166
+ @cae-section-change=${(e: CustomEvent<{ index: number | null }>) => {
167
+ e.stopPropagation();
168
+ emit(this, 'ca-navigate', { round: e.detail.index === null ? null : e.detail.index + 1 });
169
+ }}
170
+ @cae-section-shown=${(e: CustomEvent<{ index: number }>) => {
171
+ e.stopPropagation();
172
+ this.shown = e.detail.index;
173
+ }}
174
+ @cae-load-earlier=${(e: Event) => {
175
+ e.stopPropagation();
176
+ if (this.stream) void feed.loadEarlier(this.client ?? createMonitorClient({ baseUrl: this.baseUrl }), this.run, this.stream);
177
+ }}></cae-transcript>`,
178
+ );
179
+ }
180
+
181
+ protected override updated(): void {
182
+ const { rounds } = this.sections();
183
+ const sig = `${this.feed.version}|${this.shown}|${rounds.length}|${this.rows.length}`;
184
+ if (sig === this.lastSent) return;
185
+ this.lastSent = sig;
186
+ const detail: RoundsChangedDetail = { launches: this.feed.model.rounds.map((r) => r.launch), shown: this.shown, rounds };
187
+ emit(this, 'ca-rounds', detail, { bubbles: false });
188
+ }
189
+
190
+ /**
191
+ * Show the `nth` (0-based) web search for `query`: its card opens, and is scrolled into
192
+ * view once its round is shown. Returns that round as the `round` of a `ca-navigate`
193
+ * (1-based; null for the latest), or undefined when the transcript holds no such search.
194
+ */
195
+ revealWebSearch(query: string, nth = 0): { round: number | null } | undefined {
196
+ const card = this.feed.model.rounds.flatMap((r) => r.items).filter((it) => it.type === 'tool' && it.query === query)[nth];
197
+ const i = card && this.view ? this.view.reveal(card.id) : -1;
198
+ if (i < 0) return undefined;
199
+ return { round: i === this.feed.model.rounds.length - 1 ? null : i + 1 };
200
+ }
201
+ }
202
+
203
+ /** `next` holds every event of `prev`, the same objects in the same order, and then more or none. */
204
+ function extends_(next: readonly TranscriptEvent[], prev: readonly TranscriptEvent[]): boolean {
205
+ if (next === prev || next.length < prev.length) return next === prev;
206
+ for (let i = prev.length - 1; i >= 0; i--) if (next[i] !== prev[i]) return false;
207
+ return true;
208
+ }
209
+
210
+ declare global {
211
+ interface HTMLElementTagNameMap {
212
+ 'ca-transcript': CaTranscript;
213
+ }
214
+ }