@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,528 @@
1
+ import {
2
+ createExportClient,
3
+ deriveRun,
4
+ isRunLive,
5
+ liveActivities,
6
+ MonitorStore,
7
+ hostOf,
8
+ openExportFeed,
9
+ runActivity,
10
+ runIdOf,
11
+ runRow,
12
+ type MonitorSnapshot,
13
+ type RunDerived,
14
+ } from '@contraagent/api';
15
+ import { localized, msg, str } from '@lit/localize';
16
+ import { LitElement, html, nothing, type PropertyValues } from 'lit';
17
+ import { customElement, property, query, state } from 'lit/decorators.js';
18
+ import type { ChooseThemeDetail, FilterDetail, NavigateDetail, OpenTaskDetail, SelectRunDetail } from '../../core/events.js';
19
+ import { LOCALE_NAMES, allLocales, chooseLocale, configureLocales, getLocale, isLocale, type Locale } from '../../core/i18n.js';
20
+ import { LocalMemory, flushMemory, keepMemory, memoryOf } from '../../core/memory.js';
21
+ import { ScrollMemory } from '../../core/scroll.js';
22
+ import type { ViewRoute, ViewRoutePatch, Tab } from '../../core/view-route.js';
23
+ import { ViewRouter, type ViewRouteCause, type ViewRouterMode } from '../../core/view-router.js';
24
+ import { LocaleController } from '../../controllers/locale.js';
25
+ import { ShortcutsController, isShortcutScope, type ShortcutScope } from '../../controllers/shortcuts.js';
26
+ import { ThemeController } from '../../controllers/theme.js';
27
+ import { runLine, runLineAccounts, triesLine } from '../../words/index.js';
28
+ import { runMark } from '../../words/run-line.js';
29
+ import { exportTip, exportedLabel } from '../../words/export.js';
30
+ import { apiErrorLine } from '../../words/api-error.js';
31
+ import { accountsTip } from '../../words/quota.js';
32
+ import { hostFact, hostsLine, lastReport, noReportLabel } from '../../words/hosts.js';
33
+ import { pill } from '@contraagent/elements/primitives';
34
+ import { runTone, type Tone } from '../../lib/tone.js';
35
+ import { RovingFocusController, toneAttr } from '@contraagent/elements';
36
+ import '@contraagent/elements/segmented/define';
37
+ import { base } from '@contraagent/elements/styles';
38
+ import { adoptThemes, hostThemeStyles, rememberTheme, type ThemeChoice, type ThemeName } from '@contraagent/elements/themes';
39
+ import { rowToast, type CaToasts } from './ca-toasts.js';
40
+ import { monitorStyles } from './styles.js';
41
+ import { monitorTabs, moveTabIndicator, tabBar, tabId, tabStyles } from './tabs.js';
42
+ import { brand, connection, nowLine } from './header.js';
43
+ import { tabView } from './views.js';
44
+ import './ca-clock.js';
45
+ import './ca-hosts.js';
46
+ import './ca-run-picker.js';
47
+ import './ca-toasts.js';
48
+ import './ca-theme-switch.js';
49
+ import '../trends/ca-trends.js';
50
+ import { browserZone, runGroups, trendsQuery } from '../../lib/trends.js';
51
+ import { trendsTip, trendsTitle } from '../../words/trends.js';
52
+
53
+ /** Applies a typed filter to the URL after the reader stops typing, so the history is not written per key. */
54
+ const Q_DEBOUNCE_MS = 250;
55
+
56
+ /**
57
+ * The whole monitor: header, run switcher, tabs, filters and the views, live.
58
+ * It owns the data (`MonitorStore`) and the view route (`ViewRouter`); every view below
59
+ * it only renders what it is given and sends `ca-*` events back up.
60
+ */
61
+ @customElement('ca-monitor')
62
+ @localized()
63
+ export class CaMonitor extends LitElement {
64
+ static override styles = [hostThemeStyles, base, tabStyles, monitorStyles];
65
+
66
+ /**
67
+ * Where the monitor's API is served, such as `http://127.0.0.1:8787`, or a
68
+ * path of this page's origin, such as `/monitor` (`contraagent monitor
69
+ * --base-path` writes it into the page it serves); '' is this page's origin.
70
+ * A server on another origin must allow this page's
71
+ * (`contraagent monitor --cors-origin`). It takes effect whenever it is set,
72
+ * before or after the element connects: a change closes the old server's
73
+ * feeds and opens the run named by `run`, else the new server's newest run.
74
+ * A request that gets no JSON answer (a network error, a status outside 2xx,
75
+ * or an HTML page from a server without the API) is shown above the view,
76
+ * with its URL and cause, and written to the console.
77
+ */
78
+ @property({ attribute: 'base-url' }) baseUrl = '';
79
+ /**
80
+ * An export to read instead of a server (`contraagent monitor export`): its `data/`
81
+ * directory, relative to the page (`export="data/"`) or absolute. The monitor then
82
+ * makes no request to an API and opens no feed: it reads the export's files, which
83
+ * hold no transcripts and no processes. Set, it outranks `base-url`.
84
+ */
85
+ @property({ attribute: 'export' }) exportUrl = '';
86
+ /**
87
+ * `url`: the monitor is the page. The view route lives in the address bar (Back
88
+ * and reload return to it), and the monitor sets the page's title, `lang` and
89
+ * theme. `memory`: for a monitor embedded in another page. The view route, the
90
+ * scroll positions and the open sections live in the element, and the page's
91
+ * URL, history, title and `<html>` attributes stay the host's. A change after
92
+ * connecting takes effect at once: `memory` keeps the view route shown, `url`
93
+ * reads the address bar's.
94
+ */
95
+ @property() history: ViewRouterMode = 'url';
96
+ /**
97
+ * Where the single-key shortcuts (1 to 9 for the tabs, `r` for the runs, `/`
98
+ * for the filter) work: `page`, anywhere in the page except in a text field;
99
+ * `element`, only while the focus is inside the monitor; `off`, nowhere.
100
+ * Unset: `page` with `history="url"`, `element` with `history="memory"`.
101
+ */
102
+ @property() shortcuts: ShortcutScope | '' = '';
103
+ /**
104
+ * The run to open first (in `memory` mode, or when the URL names none). A
105
+ * change after connecting opens that run.
106
+ */
107
+ @property() run = '';
108
+ /**
109
+ * The language to show (`en`, `ja`). Unset: the reader's earlier choice, else
110
+ * the browser's language. The header's switch changes it and remembers it.
111
+ */
112
+ @property() locale: Locale | '' = '';
113
+ /**
114
+ * The theme: `contraagent-dark`, `contraagent-light`, `system` (one of the two,
115
+ * as the system's colour scheme), `github-dark`, `github-light`, `one-dark`,
116
+ * `nord` or `high-contrast`. Unset: the reader's earlier choice, else
117
+ * `contraagent-dark`. The header's control changes it and remembers it. The
118
+ * theme shown is reflected as `data-ca-theme` (on `<html>` too, with `history="url"`).
119
+ */
120
+ @property() theme: ThemeChoice | '' = '';
121
+ /** Reflects whether the run is live (the logo moves). */
122
+ @property({ type: Boolean, reflect: true }) live = false;
123
+
124
+ @state() private snap!: MonitorSnapshot;
125
+ @state() private viewRoute!: ViewRoute;
126
+ @state() private pickerOpen = false;
127
+ /** The filter text as typed, ahead of the URL. */
128
+ @state() private qDraft: string | null = null;
129
+
130
+ @query('main') private main!: HTMLElement;
131
+ @query('ca-toasts') private toasts!: CaToasts;
132
+ @query('.runbtn') private runBtn!: HTMLButtonElement;
133
+ @query('ca-run-picker') private picker!: HTMLElement;
134
+
135
+ private readonly themes = new ThemeController(this, { theme: () => this.theme, pageWide: () => this.history === 'url' });
136
+
137
+ /** One tab stop for the tab list, on the selected tab; the arrow keys, Home and End move between the tabs. */
138
+ private readonly tabFocus = new RovingFocusController(this, {
139
+ items: () => [...this.renderRoot.querySelectorAll<HTMLElement>('[role="tablist"] [role="tab"]')],
140
+ layout: 'horizontal',
141
+ wrap: true,
142
+ });
143
+ private store!: MonitorStore;
144
+ private viewRouter!: ViewRouter;
145
+ /** The `baseUrl` the store was made for, and the `history` the view router was. */
146
+ private storeBase = '';
147
+ private viewRouterMode: ViewRouterMode = 'url';
148
+ /** Stop listening to the store. */
149
+ private readonly storeCleanups: (() => void)[] = [];
150
+ private readonly mainScroll = new ScrollMemory('main', () => memoryOf(this));
151
+ private pendingScroll: ViewRouteCause | null = null;
152
+ private qTimer: ReturnType<typeof setTimeout> | null = null;
153
+ private readonly cleanups: (() => void)[] = [];
154
+ /** The scroll positions and open sections, with `history="memory"`. */
155
+ private readonly localMemory = new LocalMemory();
156
+ /** Closes the run picker on a click outside it; listened for on the document only while the picker is open. */
157
+ private readonly onOutsideClick = (e: MouseEvent): void => {
158
+ if (!e.composedPath().some((n) => n instanceof HTMLElement && (n.localName === 'ca-run-picker' || n.classList.contains('runbtn')))) this.pickerOpen = false;
159
+ };
160
+ private outsideClickOn = false;
161
+ private navObserver: ResizeObserver | null = null;
162
+ private navObserved: Element | null = null;
163
+ private readonly language: LocaleController;
164
+ /** Whether the elements can switch language: false when the page configured Lit Localize itself. */
165
+ private locales = false;
166
+
167
+ constructor() {
168
+ super();
169
+ this.language = new LocaleController(this, { locale: () => this.locale, pageWide: () => this.history === 'url' });
170
+ new ShortcutsController(this, (e) => this.onKey(e), () => this.shortcutScope);
171
+ }
172
+
173
+ /** The first paint waits for the reader's language: its module loads when first chosen. */
174
+ protected override async scheduleUpdate(): Promise<unknown> {
175
+ await this.language.ready;
176
+ return super.scheduleUpdate();
177
+ }
178
+
179
+ override connectedCallback(): void {
180
+ // Set up here, not at import: a page that only imports the package keeps its own setup.
181
+ this.locales = configureLocales();
182
+ adoptThemes(this.ownerDocument);
183
+ super.connectedCallback();
184
+ this.openStore();
185
+ this.openViewRouter();
186
+ void this.store.start();
187
+ this.cleanups.push(() => {
188
+ this.listenOutside(false);
189
+ this.navObserver?.disconnect();
190
+ this.navObserver = null;
191
+ this.navObserved = null;
192
+ });
193
+ this.addEventListener('ca-open-task', (e: CustomEvent<OpenTaskDetail>) => {
194
+ this.navigate({ tab: 'stream', key: e.detail.key, ...(e.detail.view ? { view: e.detail.view } : {}) });
195
+ });
196
+ this.addEventListener('ca-navigate', (e: CustomEvent<NavigateDetail>) => {
197
+ const { replace, ...patch } = e.detail;
198
+ this.navigate(patch, { replace: replace === true });
199
+ });
200
+ this.addEventListener('ca-select-run', (e: CustomEvent<SelectRunDetail>) => this.navigate({ run: e.detail.run, page: '' }));
201
+ this.addEventListener('ca-filter', (e: CustomEvent<FilterDetail>) => this.navigate(e.detail));
202
+ this.addEventListener('ca-choose-theme', (e: CustomEvent<ChooseThemeDetail>) => {
203
+ this.theme = e.detail.theme;
204
+ rememberTheme(e.detail.theme);
205
+ });
206
+ }
207
+
208
+ /** Where the store reads: an export's files, else the server at `baseUrl`. */
209
+ private get source(): string {
210
+ return this.exportUrl ? `export:${this.exportUrl}` : this.baseUrl;
211
+ }
212
+
213
+ /** A store for the export, else for `baseUrl`, shown and listened to; not started. */
214
+ private openStore(): void {
215
+ this.storeBase = this.source;
216
+ if (this.exportUrl) {
217
+ const client = createExportClient(new URL(this.exportUrl, this.ownerDocument.baseURI).href);
218
+ this.store = new MonitorStore({ client, openRunFeed: openExportFeed(client), runsEveryMs: 0 });
219
+ } else this.store = new MonitorStore({ baseUrl: this.baseUrl });
220
+ this.show(this.store.snapshot);
221
+ this.storeCleanups.push(
222
+ this.store.subscribe((s) => {
223
+ this.show(s);
224
+ this.pickDefaultRun();
225
+ }),
226
+ this.store.onNewRow((row) => this.toasts?.show(...rowToast(row, this.snap.run))),
227
+ );
228
+ }
229
+
230
+ private closeStore(): void {
231
+ for (const fn of this.storeCleanups.splice(0)) fn();
232
+ this.store.stop();
233
+ }
234
+
235
+ /**
236
+ * A view router for `history`, started at the `run` property's run; when it replaces
237
+ * another view router, `memory` starts at the view route shown and `url` at the address bar's.
238
+ */
239
+ private openViewRouter(): void {
240
+ this.viewRouterMode = this.history;
241
+ keepMemory(this, this.history === 'memory' ? this.localMemory : null);
242
+ const at = !this.viewRoute ? (this.run ? { run: this.run } : {}) : this.history === 'memory' ? this.viewRoute : {};
243
+ this.viewRouter = new ViewRouter(this.history, (viewRoute, cause) => this.onViewRoute(viewRoute, cause), at, flushMemory);
244
+ this.viewRouter.start();
245
+ }
246
+
247
+ /**
248
+ * A connection property changed while connected: a new `base-url` gets a new
249
+ * store (the feeds of the old one close) and the run named by `run`, else the
250
+ * newest of the new server's; a new `history` gets a new view router; a new `run` opens it.
251
+ */
252
+ protected override willUpdate(changed: PropertyValues<this>): void {
253
+ if (!this.isConnected || !this.store) return;
254
+ if (this.source !== this.storeBase) {
255
+ this.closeStore();
256
+ this.openStore();
257
+ this.navigate({ run: this.run }, { replace: true });
258
+ this.store.selectRun(this.viewRoute.run);
259
+ void this.store.start();
260
+ }
261
+ if (this.history !== this.viewRouterMode) {
262
+ this.viewRouter.stop();
263
+ this.openViewRouter();
264
+ }
265
+ if (changed.has('run') && changed.get('run') !== undefined && this.run) this.navigate({ run: this.run });
266
+ }
267
+
268
+ /** Show a new snapshot of the data, and whether the run is live; write a new API failure to the console. */
269
+ private show(snap: MonitorSnapshot): void {
270
+ // A new failure of the API goes to the console too, as the view says it.
271
+ if (snap.error && snap.error !== this.snap?.error) console.error(apiErrorLine(snap.error));
272
+ this.snap = snap;
273
+ this.live = isRunLive(snap.state, runRow(snap.runs, snap.run));
274
+ }
275
+
276
+ /** Where the single-key shortcuts work now: the `shortcuts` property, else by `history`. */
277
+ private get shortcutScope(): ShortcutScope {
278
+ return isShortcutScope(this.shortcuts) ? this.shortcuts : this.history === 'url' ? 'page' : 'element';
279
+ }
280
+
281
+ /** Listen for a click outside the run picker on the document (while it is open), or stop. */
282
+ private listenOutside(on: boolean): void {
283
+ if (on === this.outsideClickOn) return;
284
+ this.outsideClickOn = on;
285
+ if (on) document.addEventListener('click', this.onOutsideClick);
286
+ else document.removeEventListener('click', this.onOutsideClick);
287
+ }
288
+
289
+ /** The theme shown now. */
290
+ get shownTheme(): ThemeName {
291
+ return this.themes.shown;
292
+ }
293
+
294
+ override disconnectedCallback(): void {
295
+ super.disconnectedCallback();
296
+ for (const fn of this.cleanups.splice(0)) fn();
297
+ keepMemory(this, null);
298
+ this.viewRouter.stop();
299
+ this.closeStore();
300
+ this.mainScroll.detach();
301
+ }
302
+
303
+ /** Go elsewhere: the view route changes, and with it the URL (pushing an entry for a new place). */
304
+ navigate(patch: ViewRoutePatch, opts: { replace?: boolean } = {}): void {
305
+ this.viewRouter.navigate(patch, opts);
306
+ }
307
+
308
+ private onViewRoute(viewRoute: ViewRoute, cause: ViewRouteCause): void {
309
+ const before = this.viewRoute;
310
+ this.viewRoute = viewRoute;
311
+ if (cause !== 'replace') this.qDraft = null;
312
+ this.store.selectRun(viewRoute.run);
313
+ // Another tab of the same trends shows what is loaded already.
314
+ const sameTrends = before?.page === 'trends' && JSON.stringify(trendsQuery(before)) === JSON.stringify(trendsQuery(viewRoute));
315
+ if (viewRoute.page !== 'trends') this.store.closeTrends();
316
+ else if (!sameTrends) void this.store.loadTrends(trendsQuery(viewRoute));
317
+ this.pickDefaultRun();
318
+ if (cause !== 'replace') this.pendingScroll = cause;
319
+ }
320
+
321
+ /**
322
+ * With no run named, open the most recent one (replacing the entry: it is a
323
+ * default, not a step). The hosts page names none; a monitor of one host has no hosts page.
324
+ */
325
+ private pickDefaultRun(): void {
326
+ const { info, runs } = this.snap;
327
+ if (this.viewRoute.page === 'trends') return;
328
+ if (this.viewRoute.page === 'hosts') {
329
+ if (!info.api_version || info.hosts) return;
330
+ this.navigate({ page: '' }, { replace: true });
331
+ }
332
+ const first = runs[0];
333
+ if (!this.viewRoute.run && first) this.navigate({ run: first.run }, { replace: true });
334
+ }
335
+
336
+ private onKey(e: KeyboardEvent): void {
337
+ if (e.key === 'r') {
338
+ e.preventDefault();
339
+ this.pickerOpen = true;
340
+ } else if (e.key === '/') {
341
+ e.preventDefault();
342
+ this.renderRoot.querySelector<HTMLInputElement>('.bar input')?.focus();
343
+ } else if (/^[1-9]$/.test(e.key) && !this.viewRoute.page) {
344
+ const tab = monitorTabs(this.snap.info.panels)[Number(e.key) - 1];
345
+ if (tab) this.navigate({ tab: tab.id });
346
+ }
347
+ }
348
+
349
+ /** The index of the selected tab in the tab list, or -1 (a custom view the run does not have). */
350
+ private selectedTab(): number {
351
+ return monitorTabs(this.snap.info.panels).findIndex((t) => t.id === this.viewRoute.tab);
352
+ }
353
+
354
+ /** Close the run picker; the focus goes back to the button that opens it when it was in the picker. */
355
+ private closePicker(): void {
356
+ const inside = this.picker?.matches(':focus-within');
357
+ this.pickerOpen = false;
358
+ if (inside) this.runBtn?.focus();
359
+ }
360
+
361
+ protected override updated(): void {
362
+ // A monitor that is the page names it, in its language.
363
+ if (this.history === 'url' && this.snap) document.title = msg(str`${this.snap.info.title} monitor`);
364
+ // The click on the run button that opened the picker reaches the document after this: `onOutsideClick` passes it over.
365
+ this.listenOutside(this.isConnected && this.pickerOpen);
366
+ this.observeNav();
367
+ // Tab comes back into the tab list on the selected tab.
368
+ if (this.snap && this.viewRoute) this.tabFocus.set(Math.max(0, this.selectedTab()));
369
+ moveTabIndicator(this.renderRoot);
370
+ if (this.main) this.mainScroll.attach(this.main);
371
+ if (this.pendingScroll) {
372
+ // A new place starts at the top; Back, Forward and a reload return to where the reader was.
373
+ if (this.pendingScroll === 'push') this.mainScroll.reset();
374
+ else this.mainScroll.restore();
375
+ this.pendingScroll = null;
376
+ }
377
+ }
378
+
379
+ /** Move the line under the selected tab when the tab bar changes size. */
380
+ private observeNav(): void {
381
+ const nav = this.renderRoot.querySelector('nav');
382
+ if (!nav || typeof ResizeObserver === 'undefined') return;
383
+ if (this.navObserved === nav) return;
384
+ if (!this.navObserver) this.navObserver = new ResizeObserver(() => moveTabIndicator(this.renderRoot));
385
+ else this.navObserver.disconnect();
386
+ this.navObserver.observe(nav);
387
+ this.navObserved = nav;
388
+ }
389
+
390
+ private setQ(q: string): void {
391
+ this.qDraft = q;
392
+ if (this.qTimer) clearTimeout(this.qTimer);
393
+ this.qTimer = setTimeout(() => {
394
+ this.qTimer = null;
395
+ this.navigate({ q });
396
+ }, Q_DEBOUNCE_MS);
397
+ }
398
+
399
+ /** The header's language switch: switch now, and remember it for the next visit. */
400
+ private pickLocale(locale: Locale): void {
401
+ this.locale = locale;
402
+ void chooseLocale(locale);
403
+ }
404
+
405
+ override render() {
406
+ if (!this.snap || !this.viewRoute) return nothing;
407
+ const { snap, viewRoute } = this;
408
+ const acts = liveActivities(snap.state.procs);
409
+ const derived = deriveRun(snap.state.journal, snap.state.plan);
410
+ const tab = this.selectedTab();
411
+ const keys = this.shortcutScope !== 'off';
412
+ const hub = !!snap.info.hosts;
413
+ const hostsPage = viewRoute.page === 'hosts';
414
+ const trendsPage = viewRoute.page === 'trends';
415
+ return html`
416
+ <header>
417
+ ${brand(snap.info.title)}
418
+ <button type="button" class="runbtn" title=${keys ? msg('Switch run (r)') : msg('Switch run')} aria-haspopup="dialog" aria-expanded=${this.pickerOpen ? 'true' : 'false'}
419
+ @click=${() => (this.pickerOpen = !this.pickerOpen)}>
420
+ ${hostsPage ? this.hostsLabel() : trendsPage ? this.trendsLabel() : this.runLabel(hub, derived)}
421
+ <span class="chev" aria-hidden="true">▾</span>
422
+ </button>
423
+ <div class="hdr-right">
424
+ ${nowLine(this, acts)}
425
+ <ca-theme-switch .value=${this.themes.choice} .system=${this.themes.system}></ca-theme-switch>
426
+ ${this.locales
427
+ ? html`<cae-segmented class="langs" label=${msg('Language')} .value=${getLocale()}
428
+ .options=${allLocales.map((l) => ({ value: l, label: LOCALE_NAMES[l], lang: l }))}
429
+ @cae-change=${(e: CustomEvent<{ value: string }>) => isLocale(e.detail.value) && this.pickLocale(e.detail.value)}></cae-segmented>`
430
+ : nothing}
431
+ ${snap.info.export
432
+ ? pill({ text: exportedLabel(snap.info.export), tone: 'muted', title: exportTip(snap.info.export) })
433
+ : connection(snap.connected)}
434
+ <ca-clock class="clock"></ca-clock>
435
+ </div>
436
+ <ca-run-picker .runs=${snap.runs} current=${viewRoute.run} ?open=${this.pickerOpen} ?hub=${hub} .hosts=${snap.hosts?.hosts ?? []} page=${viewRoute.page}
437
+ @ca-close=${() => this.closePicker()}></ca-run-picker>
438
+ </header>
439
+ ${hostsPage
440
+ ? html`${this.renderApiError()}<main id="main"><ca-hosts .hosts=${snap.hosts}></ca-hosts></main>`
441
+ : trendsPage
442
+ ? html`${this.renderApiError()}<main id="main"><ca-trends .view=${snap.trends} days=${viewRoute.days} from=${viewRoute.from} to=${viewRoute.to}
443
+ tz=${viewRoute.tz || browserZone()} group=${viewRoute.group} .groups=${runGroups(snap.runs)} .panels=${snap.info.panels}
444
+ tab=${viewRoute.trendsTab} ?exported=${!!snap.info.export}></ca-trends></main>`
445
+ : html`${this.renderTabs(derived, acts.length)} ${this.renderBar(derived)} ${this.renderApiError()}
446
+ <main id="main" class=${viewRoute.tab === 'stream' ? 'stream' : ''} role="tabpanel" aria-labelledby=${tab >= 0 ? tabId(tab) : nothing}
447
+ >${tabView({ snap, viewRoute, derived, q: this.qDraft ?? viewRoute.q, client: this.store.client, baseUrl: this.store.client.baseUrl })}</main>`}
448
+ <ca-toasts></ca-toasts>
449
+ `;
450
+ }
451
+
452
+ /**
453
+ * The run button's label for a run: its status dot, its name (on a hub,
454
+ * without the host, which follows it), no report from its host (a hub; before
455
+ * the run line, which the button may cut), its run line.
456
+ */
457
+ private runLabel(hub: boolean, derived: RunDerived) {
458
+ const { snap, viewRoute } = this;
459
+ const summary = runRow(snap.runs, snap.run);
460
+ const activity = runActivity(summary, !!snap.state.procs?.alive);
461
+ const dot = runTone(activity, summary?.tasks);
462
+ const host = hub ? (summary?.host_id ?? '') : '';
463
+ return html`<span class="dot" data-tone=${toneAttr(dot)} aria-hidden="true"></span>
464
+ <span class="rn" title=${host ? viewRoute.run : nothing}>${summary && host ? runIdOf(summary) : viewRoute.run || '—'}</span>
465
+ ${host ? html`<span class="hostchip" title=${hostFact(host)}><span class="sr">${hostFact(host)}</span><span aria-hidden="true">${host}</span></span>` : nothing}
466
+ ${activity === 'unresponsive' ? pill({ text: noReportLabel(), tone: 'attention', title: lastReport(hostOf(snap.hosts?.hosts, summary)) }) : nothing}
467
+ ${runMark(summary) ? pill({ ...runMark(summary)!, tone: 'muted' }) : nothing}
468
+ <span class="rs" title=${summary ? accountsTip(runLineAccounts(snap.state, summary)) : ''}>${summary ? runLine(snap.state, summary, derived) : ''}</span>`;
469
+ }
470
+
471
+ /** The run button's label on the trends page: its name, and what it shows. */
472
+ private trendsLabel() {
473
+ return html`<span class="dot" data-tone="neutral" aria-hidden="true"></span><span class="rn">${trendsTitle()}</span><span class="rs">${trendsTip()}</span>`;
474
+ }
475
+
476
+ /** The run button's label on the hosts page: the hosts in one line, attention while a host has no report. */
477
+ private hostsLabel() {
478
+ const hosts = this.snap.hosts?.hosts ?? [];
479
+ return html`<span class="dot" data-tone=${toneAttr(hosts.some((h) => !h.up) ? 'attention' : 'neutral')} aria-hidden="true"></span>
480
+ <span class="rn">${msg('Hosts')}</span><span class="rs">${hostsLine(hosts)}</span>`;
481
+ }
482
+
483
+ /** A request to the API that got no JSON answer: its URL and cause. */
484
+ private renderApiError() {
485
+ const { error } = this.snap;
486
+ return html`<p class="api-error" role="alert">${error ? html`<span class="ic" aria-hidden="true">✕</span> ${apiErrorLine(error)}` : nothing}</p>`;
487
+ }
488
+
489
+ private renderTabs(d: RunDerived, busy: number) {
490
+ const { state } = this.snap;
491
+ const { tries } = d.tries;
492
+ const tasks = d.counts;
493
+ // A tab's count is a total: neutral, never coloured by its worst part. Only a count of what is running is.
494
+ const badge = (id: Tab): [string | number, Tone] | null =>
495
+ id === 'tasks'
496
+ ? [tasks.total || '', 'neutral']
497
+ : id === 'journal'
498
+ ? [tries || '', 'neutral']
499
+ : id === 'procs'
500
+ ? [state.procs?.alive ? busy || '' : '', 'running']
501
+ : null;
502
+ return tabBar(monitorTabs(this.snap.info.panels), this.viewRoute.tab, badge, (id) => this.navigate({ tab: id }), 'main', this.shortcutScope !== 'off');
503
+ }
504
+
505
+ private renderBar(d: RunDerived) {
506
+ const { viewRoute } = this;
507
+ if (viewRoute.tab !== 'tasks' && viewRoute.tab !== 'journal') return nothing;
508
+ const { counts, kinds } = d;
509
+ const total = counts.total;
510
+ return html`<div class="bar">
511
+ <select title=${msg('Kind')} aria-label=${msg('Kind')} @change=${(e: Event) => this.navigate({ kind: (e.target as HTMLSelectElement).value })}>
512
+ <option value="" ?selected=${!viewRoute.kind}>${msg('All kinds')}</option>
513
+ ${kinds.map((k) => html`<option ?selected=${k === viewRoute.kind}>${k}</option>`)}
514
+ </select>
515
+ <input placeholder=${msg('Filter')} aria-label=${msg('Text filter')} size="22" title=${this.shortcutScope !== 'off' ? msg('Text filter (/)') : msg('Text filter')} .value=${this.qDraft ?? viewRoute.q}
516
+ @input=${(e: Event) => this.setQ((e.target as HTMLInputElement).value)} />
517
+ <span class="meta">${viewRoute.tab === 'journal'
518
+ ? triesLine(d.tries)
519
+ : total === 1 ? msg('1 task') : msg(str`${total} tasks`)}</span>
520
+ </div>`;
521
+ }
522
+ }
523
+
524
+ declare global {
525
+ interface HTMLElementTagNameMap {
526
+ 'ca-monitor': CaMonitor;
527
+ }
528
+ }