opencastle 0.27.0 → 0.27.2

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 (242) hide show
  1. package/bin/cli.mjs +6 -0
  2. package/dist/cli/agents.d.ts +3 -0
  3. package/dist/cli/agents.d.ts.map +1 -0
  4. package/dist/cli/agents.js +161 -0
  5. package/dist/cli/agents.js.map +1 -0
  6. package/dist/cli/baselines.d.ts +3 -0
  7. package/dist/cli/baselines.d.ts.map +1 -0
  8. package/dist/cli/baselines.js +128 -0
  9. package/dist/cli/baselines.js.map +1 -0
  10. package/dist/cli/convoy/dashboard-types.d.ts +146 -0
  11. package/dist/cli/convoy/dashboard-types.d.ts.map +1 -0
  12. package/dist/cli/convoy/dashboard-types.js +2 -0
  13. package/dist/cli/convoy/dashboard-types.js.map +1 -0
  14. package/dist/cli/convoy/engine.d.ts +67 -2
  15. package/dist/cli/convoy/engine.d.ts.map +1 -1
  16. package/dist/cli/convoy/engine.js +2036 -28
  17. package/dist/cli/convoy/engine.js.map +1 -1
  18. package/dist/cli/convoy/engine.test.js +1659 -70
  19. package/dist/cli/convoy/engine.test.js.map +1 -1
  20. package/dist/cli/convoy/event-schemas.d.ts +9 -0
  21. package/dist/cli/convoy/event-schemas.d.ts.map +1 -0
  22. package/dist/cli/convoy/event-schemas.js +185 -0
  23. package/dist/cli/convoy/event-schemas.js.map +1 -0
  24. package/dist/cli/convoy/events.d.ts +12 -1
  25. package/dist/cli/convoy/events.d.ts.map +1 -1
  26. package/dist/cli/convoy/events.js +186 -13
  27. package/dist/cli/convoy/events.js.map +1 -1
  28. package/dist/cli/convoy/events.test.js +325 -28
  29. package/dist/cli/convoy/events.test.js.map +1 -1
  30. package/dist/cli/convoy/expertise.d.ts +16 -0
  31. package/dist/cli/convoy/expertise.d.ts.map +1 -0
  32. package/dist/cli/convoy/expertise.js +121 -0
  33. package/dist/cli/convoy/expertise.js.map +1 -0
  34. package/dist/cli/convoy/expertise.test.d.ts +2 -0
  35. package/dist/cli/convoy/expertise.test.d.ts.map +1 -0
  36. package/dist/cli/convoy/expertise.test.js +96 -0
  37. package/dist/cli/convoy/expertise.test.js.map +1 -0
  38. package/dist/cli/convoy/export.test.js +1 -0
  39. package/dist/cli/convoy/export.test.js.map +1 -1
  40. package/dist/cli/convoy/formula.d.ts +19 -0
  41. package/dist/cli/convoy/formula.d.ts.map +1 -0
  42. package/dist/cli/convoy/formula.js +142 -0
  43. package/dist/cli/convoy/formula.js.map +1 -0
  44. package/dist/cli/convoy/formula.test.d.ts +2 -0
  45. package/dist/cli/convoy/formula.test.d.ts.map +1 -0
  46. package/dist/cli/convoy/formula.test.js +342 -0
  47. package/dist/cli/convoy/formula.test.js.map +1 -0
  48. package/dist/cli/convoy/gates.d.ts +128 -0
  49. package/dist/cli/convoy/gates.d.ts.map +1 -0
  50. package/dist/cli/convoy/gates.js +606 -0
  51. package/dist/cli/convoy/gates.js.map +1 -0
  52. package/dist/cli/convoy/gates.test.d.ts +2 -0
  53. package/dist/cli/convoy/gates.test.d.ts.map +1 -0
  54. package/dist/cli/convoy/gates.test.js +976 -0
  55. package/dist/cli/convoy/gates.test.js.map +1 -0
  56. package/dist/cli/convoy/health.d.ts +11 -0
  57. package/dist/cli/convoy/health.d.ts.map +1 -1
  58. package/dist/cli/convoy/health.js +54 -0
  59. package/dist/cli/convoy/health.js.map +1 -1
  60. package/dist/cli/convoy/health.test.js +56 -1
  61. package/dist/cli/convoy/health.test.js.map +1 -1
  62. package/dist/cli/convoy/issues.d.ts +8 -0
  63. package/dist/cli/convoy/issues.d.ts.map +1 -0
  64. package/dist/cli/convoy/issues.js +98 -0
  65. package/dist/cli/convoy/issues.js.map +1 -0
  66. package/dist/cli/convoy/issues.test.d.ts +2 -0
  67. package/dist/cli/convoy/issues.test.d.ts.map +1 -0
  68. package/dist/cli/convoy/issues.test.js +107 -0
  69. package/dist/cli/convoy/issues.test.js.map +1 -0
  70. package/dist/cli/convoy/knowledge.d.ts +5 -0
  71. package/dist/cli/convoy/knowledge.d.ts.map +1 -0
  72. package/dist/cli/convoy/knowledge.js +116 -0
  73. package/dist/cli/convoy/knowledge.js.map +1 -0
  74. package/dist/cli/convoy/knowledge.test.d.ts +2 -0
  75. package/dist/cli/convoy/knowledge.test.d.ts.map +1 -0
  76. package/dist/cli/convoy/knowledge.test.js +87 -0
  77. package/dist/cli/convoy/knowledge.test.js.map +1 -0
  78. package/dist/cli/convoy/lessons.d.ts +17 -0
  79. package/dist/cli/convoy/lessons.d.ts.map +1 -0
  80. package/dist/cli/convoy/lessons.js +149 -0
  81. package/dist/cli/convoy/lessons.js.map +1 -0
  82. package/dist/cli/convoy/lessons.test.d.ts +2 -0
  83. package/dist/cli/convoy/lessons.test.d.ts.map +1 -0
  84. package/dist/cli/convoy/lessons.test.js +135 -0
  85. package/dist/cli/convoy/lessons.test.js.map +1 -0
  86. package/dist/cli/convoy/lock.d.ts +13 -0
  87. package/dist/cli/convoy/lock.d.ts.map +1 -0
  88. package/dist/cli/convoy/lock.js +88 -0
  89. package/dist/cli/convoy/lock.js.map +1 -0
  90. package/dist/cli/convoy/lock.test.d.ts +2 -0
  91. package/dist/cli/convoy/lock.test.d.ts.map +1 -0
  92. package/dist/cli/convoy/lock.test.js +136 -0
  93. package/dist/cli/convoy/lock.test.js.map +1 -0
  94. package/dist/cli/convoy/log-merge.test.d.ts +2 -0
  95. package/dist/cli/convoy/log-merge.test.d.ts.map +1 -0
  96. package/dist/cli/convoy/log-merge.test.js +147 -0
  97. package/dist/cli/convoy/log-merge.test.js.map +1 -0
  98. package/dist/cli/convoy/merge.d.ts +4 -0
  99. package/dist/cli/convoy/merge.d.ts.map +1 -1
  100. package/dist/cli/convoy/merge.js +18 -1
  101. package/dist/cli/convoy/merge.js.map +1 -1
  102. package/dist/cli/convoy/merge.test.js +6 -7
  103. package/dist/cli/convoy/merge.test.js.map +1 -1
  104. package/dist/cli/convoy/partition.d.ts +51 -0
  105. package/dist/cli/convoy/partition.d.ts.map +1 -0
  106. package/dist/cli/convoy/partition.js +186 -0
  107. package/dist/cli/convoy/partition.js.map +1 -0
  108. package/dist/cli/convoy/partition.test.d.ts +2 -0
  109. package/dist/cli/convoy/partition.test.d.ts.map +1 -0
  110. package/dist/cli/convoy/partition.test.js +315 -0
  111. package/dist/cli/convoy/partition.test.js.map +1 -0
  112. package/dist/cli/convoy/pipeline.test.js +6 -0
  113. package/dist/cli/convoy/pipeline.test.js.map +1 -1
  114. package/dist/cli/convoy/store.d.ts +99 -7
  115. package/dist/cli/convoy/store.d.ts.map +1 -1
  116. package/dist/cli/convoy/store.js +764 -31
  117. package/dist/cli/convoy/store.js.map +1 -1
  118. package/dist/cli/convoy/store.test.js +1810 -18
  119. package/dist/cli/convoy/store.test.js.map +1 -1
  120. package/dist/cli/convoy/types.d.ts +427 -5
  121. package/dist/cli/convoy/types.d.ts.map +1 -1
  122. package/dist/cli/convoy/types.js +42 -1
  123. package/dist/cli/convoy/types.js.map +1 -1
  124. package/dist/cli/log.d.ts +11 -0
  125. package/dist/cli/log.d.ts.map +1 -1
  126. package/dist/cli/log.js +114 -2
  127. package/dist/cli/log.js.map +1 -1
  128. package/dist/cli/run/adapters/claude.d.ts +2 -0
  129. package/dist/cli/run/adapters/claude.d.ts.map +1 -1
  130. package/dist/cli/run/adapters/claude.js +89 -49
  131. package/dist/cli/run/adapters/claude.js.map +1 -1
  132. package/dist/cli/run/adapters/claude.test.d.ts +2 -0
  133. package/dist/cli/run/adapters/claude.test.d.ts.map +1 -0
  134. package/dist/cli/run/adapters/claude.test.js +205 -0
  135. package/dist/cli/run/adapters/claude.test.js.map +1 -0
  136. package/dist/cli/run/adapters/copilot.d.ts +1 -0
  137. package/dist/cli/run/adapters/copilot.d.ts.map +1 -1
  138. package/dist/cli/run/adapters/copilot.js +84 -46
  139. package/dist/cli/run/adapters/copilot.js.map +1 -1
  140. package/dist/cli/run/adapters/copilot.test.d.ts +2 -0
  141. package/dist/cli/run/adapters/copilot.test.d.ts.map +1 -0
  142. package/dist/cli/run/adapters/copilot.test.js +195 -0
  143. package/dist/cli/run/adapters/copilot.test.js.map +1 -0
  144. package/dist/cli/run/adapters/cursor.d.ts +1 -0
  145. package/dist/cli/run/adapters/cursor.d.ts.map +1 -1
  146. package/dist/cli/run/adapters/cursor.js +83 -47
  147. package/dist/cli/run/adapters/cursor.js.map +1 -1
  148. package/dist/cli/run/adapters/cursor.test.d.ts +2 -0
  149. package/dist/cli/run/adapters/cursor.test.d.ts.map +1 -0
  150. package/dist/cli/run/adapters/cursor.test.js +129 -0
  151. package/dist/cli/run/adapters/cursor.test.js.map +1 -0
  152. package/dist/cli/run/adapters/opencode.d.ts +1 -0
  153. package/dist/cli/run/adapters/opencode.d.ts.map +1 -1
  154. package/dist/cli/run/adapters/opencode.js +81 -47
  155. package/dist/cli/run/adapters/opencode.js.map +1 -1
  156. package/dist/cli/run/adapters/opencode.test.d.ts +2 -0
  157. package/dist/cli/run/adapters/opencode.test.d.ts.map +1 -0
  158. package/dist/cli/run/adapters/opencode.test.js +119 -0
  159. package/dist/cli/run/adapters/opencode.test.js.map +1 -0
  160. package/dist/cli/run/executor.js +1 -1
  161. package/dist/cli/run/executor.js.map +1 -1
  162. package/dist/cli/run/schema.d.ts.map +1 -1
  163. package/dist/cli/run/schema.js +245 -4
  164. package/dist/cli/run/schema.js.map +1 -1
  165. package/dist/cli/run/schema.test.js +669 -0
  166. package/dist/cli/run/schema.test.js.map +1 -1
  167. package/dist/cli/run.d.ts.map +1 -1
  168. package/dist/cli/run.js +362 -22
  169. package/dist/cli/run.js.map +1 -1
  170. package/dist/cli/types.d.ts +85 -2
  171. package/dist/cli/types.d.ts.map +1 -1
  172. package/dist/cli/types.js.map +1 -1
  173. package/dist/cli/watch.d.ts +15 -0
  174. package/dist/cli/watch.d.ts.map +1 -0
  175. package/dist/cli/watch.js +279 -0
  176. package/dist/cli/watch.js.map +1 -0
  177. package/package.json +5 -1
  178. package/src/cli/agents.ts +177 -0
  179. package/src/cli/baselines.ts +143 -0
  180. package/src/cli/convoy/TELEMETRY.md +203 -0
  181. package/src/cli/convoy/dashboard-types.ts +141 -0
  182. package/src/cli/convoy/engine.test.ts +1937 -70
  183. package/src/cli/convoy/engine.ts +2350 -40
  184. package/src/cli/convoy/event-schemas.ts +195 -0
  185. package/src/cli/convoy/events.test.ts +384 -39
  186. package/src/cli/convoy/events.ts +202 -16
  187. package/src/cli/convoy/expertise.test.ts +128 -0
  188. package/src/cli/convoy/expertise.ts +163 -0
  189. package/src/cli/convoy/export.test.ts +1 -0
  190. package/src/cli/convoy/formula.test.ts +405 -0
  191. package/src/cli/convoy/formula.ts +174 -0
  192. package/src/cli/convoy/gates.test.ts +1169 -0
  193. package/src/cli/convoy/gates.ts +774 -0
  194. package/src/cli/convoy/health.test.ts +64 -2
  195. package/src/cli/convoy/health.ts +80 -2
  196. package/src/cli/convoy/issues.test.ts +143 -0
  197. package/src/cli/convoy/issues.ts +136 -0
  198. package/src/cli/convoy/knowledge.test.ts +101 -0
  199. package/src/cli/convoy/knowledge.ts +132 -0
  200. package/src/cli/convoy/lessons.test.ts +188 -0
  201. package/src/cli/convoy/lessons.ts +164 -0
  202. package/src/cli/convoy/lock.test.ts +181 -0
  203. package/src/cli/convoy/lock.ts +103 -0
  204. package/src/cli/convoy/log-merge.test.ts +179 -0
  205. package/src/cli/convoy/merge.test.ts +6 -7
  206. package/src/cli/convoy/merge.ts +19 -1
  207. package/src/cli/convoy/partition.test.ts +423 -0
  208. package/src/cli/convoy/partition.ts +232 -0
  209. package/src/cli/convoy/pipeline.test.ts +6 -0
  210. package/src/cli/convoy/store.test.ts +2041 -20
  211. package/src/cli/convoy/store.ts +945 -46
  212. package/src/cli/convoy/types.ts +278 -4
  213. package/src/cli/log.ts +120 -2
  214. package/src/cli/run/adapters/claude.test.ts +234 -0
  215. package/src/cli/run/adapters/claude.ts +45 -5
  216. package/src/cli/run/adapters/copilot.test.ts +224 -0
  217. package/src/cli/run/adapters/copilot.ts +34 -4
  218. package/src/cli/run/adapters/cursor.test.ts +144 -0
  219. package/src/cli/run/adapters/cursor.ts +33 -2
  220. package/src/cli/run/adapters/opencode.test.ts +135 -0
  221. package/src/cli/run/adapters/opencode.ts +30 -2
  222. package/src/cli/run/executor.ts +1 -1
  223. package/src/cli/run/schema.test.ts +758 -0
  224. package/src/cli/run/schema.ts +300 -25
  225. package/src/cli/run.ts +341 -21
  226. package/src/cli/types.ts +86 -1
  227. package/src/cli/watch.ts +298 -0
  228. package/src/dashboard/dist/_astro/{index.DtnyD8a5.css → index.6L3_HsPT.css} +1 -1
  229. package/src/dashboard/dist/data/.gitkeep +0 -0
  230. package/src/dashboard/dist/data/convoy-list.json +1 -0
  231. package/src/dashboard/dist/data/overall-stats.json +24 -0
  232. package/src/dashboard/dist/index.html +701 -3
  233. package/src/dashboard/node_modules/.vite/deps/_metadata.json +6 -6
  234. package/src/dashboard/public/data/.gitkeep +0 -0
  235. package/src/dashboard/public/data/convoy-list.json +1 -0
  236. package/src/dashboard/public/data/overall-stats.json +24 -0
  237. package/src/dashboard/scripts/etl.test.ts +210 -0
  238. package/src/dashboard/scripts/etl.ts +108 -0
  239. package/src/dashboard/scripts/integration-test.ts +504 -0
  240. package/src/dashboard/src/pages/index.astro +854 -15
  241. package/src/dashboard/src/styles/dashboard.css +557 -1
  242. package/src/orchestrator/prompts/generate-convoy.prompt.md +212 -13
@@ -14,7 +14,7 @@
14
14
 
15
15
  --text-primary: #f0f0f5;
16
16
  --text-secondary: #8a8a9a;
17
- --text-tertiary: #5a5a6e;
17
+ --text-tertiary: #7a7a8e;
18
18
  --text-accent: #a78bfa;
19
19
 
20
20
  --gradient-accent: linear-gradient(135deg, #a78bfa 0%, #6366f1 50%, #3b82f6 100%);
@@ -1713,3 +1713,559 @@ body {
1713
1713
  min-width: 120px;
1714
1714
  }
1715
1715
  }
1716
+
1717
+ /* ── Convoy Selector ── */
1718
+ .convoy-selector {
1719
+ display: flex;
1720
+ align-items: center;
1721
+ gap: 0.5rem;
1722
+ }
1723
+ .convoy-selector__label {
1724
+ font-size: 0.75rem;
1725
+ text-transform: uppercase;
1726
+ letter-spacing: 0.05em;
1727
+ color: var(--text-secondary);
1728
+ }
1729
+ .convoy-selector__select {
1730
+ appearance: none;
1731
+ background: var(--bg-tertiary);
1732
+ border: 1px solid rgba(255, 255, 255, 0.08);
1733
+ border-radius: 6px;
1734
+ color: var(--text-primary);
1735
+ font-size: 0.8125rem;
1736
+ padding: 0.375rem 2rem 0.375rem 0.75rem;
1737
+ cursor: pointer;
1738
+ max-width: 320px;
1739
+ background-image: url("data:image/svg+xml,%3Csvg width='10' height='6' viewBox='0 0 10 6' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%238a8a9a' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
1740
+ background-repeat: no-repeat;
1741
+ background-position: right 0.75rem center;
1742
+ transition: border-color 0.15s;
1743
+ }
1744
+ .convoy-selector__select:hover {
1745
+ border-color: rgba(255, 255, 255, 0.15);
1746
+ }
1747
+ .convoy-selector__select:focus {
1748
+ outline: 2px solid var(--accent-purple);
1749
+ outline-offset: 2px;
1750
+ }
1751
+
1752
+ /* ── Overall Stats Section ── */
1753
+ .overall-stats {
1754
+ margin-bottom: 0;
1755
+ padding: 1.25rem;
1756
+ background: var(--bg-secondary);
1757
+ border-radius: 12px;
1758
+ border: 1px solid rgba(255, 255, 255, 0.06);
1759
+ }
1760
+ .overall-stats__header {
1761
+ display: flex;
1762
+ align-items: center;
1763
+ gap: 0.5rem;
1764
+ margin-bottom: 1rem;
1765
+ }
1766
+ .overall-stats__title {
1767
+ font-size: 1rem;
1768
+ font-weight: 600;
1769
+ color: var(--text-primary);
1770
+ margin: 0;
1771
+ }
1772
+ .overall-stats__grid {
1773
+ display: grid;
1774
+ grid-template-columns: repeat(6, 1fr);
1775
+ gap: 0.75rem;
1776
+ }
1777
+
1778
+ /* ── Overall KPI Card ── */
1779
+ .overall-kpi {
1780
+ display: flex;
1781
+ flex-direction: column;
1782
+ gap: 0.25rem;
1783
+ padding: 0.75rem;
1784
+ background: var(--bg-tertiary);
1785
+ border-radius: 8px;
1786
+ border: 1px solid rgba(255, 255, 255, 0.04);
1787
+ transition: border-color 0.15s;
1788
+ }
1789
+ .overall-kpi:hover {
1790
+ border-color: rgba(255, 255, 255, 0.1);
1791
+ }
1792
+ .overall-kpi__label {
1793
+ font-size: 0.6875rem;
1794
+ text-transform: uppercase;
1795
+ letter-spacing: 0.05em;
1796
+ color: var(--text-secondary);
1797
+ display: flex;
1798
+ align-items: center;
1799
+ gap: 0.25rem;
1800
+ }
1801
+ .overall-kpi__value {
1802
+ font-size: 1.375rem;
1803
+ font-weight: 700;
1804
+ color: var(--text-primary);
1805
+ font-variant-numeric: tabular-nums;
1806
+ }
1807
+
1808
+ /* ── Convoy Detail Header ── */
1809
+ .convoy-detail-header {
1810
+ padding: 1.25rem;
1811
+ background: var(--bg-secondary);
1812
+ border-radius: 12px;
1813
+ border: 1px solid rgba(255, 255, 255, 0.06);
1814
+ }
1815
+ .convoy-detail-header__top {
1816
+ display: flex;
1817
+ align-items: center;
1818
+ gap: 0.75rem;
1819
+ margin-bottom: 0.75rem;
1820
+ }
1821
+ .convoy-detail-header__name {
1822
+ font-size: 1.25rem;
1823
+ font-weight: 700;
1824
+ color: var(--text-primary);
1825
+ margin: 0;
1826
+ }
1827
+ .convoy-detail-header__meta {
1828
+ display: flex;
1829
+ flex-wrap: wrap;
1830
+ gap: 1rem;
1831
+ }
1832
+ .convoy-meta__item {
1833
+ font-size: 0.8125rem;
1834
+ color: var(--text-secondary);
1835
+ }
1836
+
1837
+ /* ── Status Badge ── */
1838
+ .status-badge {
1839
+ display: inline-flex;
1840
+ align-items: center;
1841
+ padding: 0.125rem 0.625rem;
1842
+ border-radius: 999px;
1843
+ font-size: 0.6875rem;
1844
+ font-weight: 600;
1845
+ text-transform: uppercase;
1846
+ letter-spacing: 0.05em;
1847
+ }
1848
+ .status-badge--done {
1849
+ background: rgba(34, 197, 94, 0.15);
1850
+ color: var(--color-success);
1851
+ }
1852
+ .status-badge--running {
1853
+ background: rgba(59, 130, 246, 0.15);
1854
+ color: var(--accent-blue);
1855
+ }
1856
+ .status-badge--failed {
1857
+ background: rgba(239, 68, 68, 0.15);
1858
+ color: var(--color-failed);
1859
+ }
1860
+ .status-badge--gate-failed,
1861
+ .status-badge--gate_failed {
1862
+ background: rgba(245, 158, 11, 0.15);
1863
+ color: var(--color-partial);
1864
+ }
1865
+
1866
+ /* ── Tooltip ── */
1867
+ .tooltip-trigger {
1868
+ position: relative;
1869
+ cursor: help;
1870
+ font-size: 0.75rem;
1871
+ opacity: 0.5;
1872
+ transition: opacity 0.15s;
1873
+ }
1874
+ .tooltip-trigger:hover {
1875
+ opacity: 1;
1876
+ }
1877
+ .tooltip-trigger:hover::after {
1878
+ content: attr(data-tooltip);
1879
+ position: absolute;
1880
+ bottom: 100%;
1881
+ left: 50%;
1882
+ transform: translateX(-50%);
1883
+ padding: 0.375rem 0.625rem;
1884
+ background: var(--bg-primary);
1885
+ border: 1px solid rgba(255, 255, 255, 0.12);
1886
+ border-radius: 6px;
1887
+ font-size: 0.75rem;
1888
+ color: var(--text-primary);
1889
+ max-width: 280px;
1890
+ white-space: normal;
1891
+ text-align: left;
1892
+ z-index: 100;
1893
+ pointer-events: none;
1894
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
1895
+ }
1896
+ .tooltip-trigger:focus {
1897
+ opacity: 1;
1898
+ outline: 2px solid var(--accent-blue);
1899
+ outline-offset: 2px;
1900
+ border-radius: 2px;
1901
+ }
1902
+ .tooltip-trigger:focus::after,
1903
+ .tooltip-trigger:focus-visible::after {
1904
+ content: attr(data-tooltip);
1905
+ position: absolute;
1906
+ bottom: 100%;
1907
+ left: 50%;
1908
+ transform: translateX(-50%);
1909
+ padding: 0.375rem 0.625rem;
1910
+ background: var(--bg-primary);
1911
+ border: 1px solid rgba(255, 255, 255, 0.12);
1912
+ border-radius: 6px;
1913
+ font-size: 0.75rem;
1914
+ color: var(--text-primary);
1915
+ max-width: 280px;
1916
+ white-space: normal;
1917
+ text-align: left;
1918
+ z-index: 100;
1919
+ pointer-events: none;
1920
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
1921
+ }
1922
+
1923
+ /* ── Additional Status Badges ── */
1924
+ .status-badge--pending {
1925
+ background: rgba(100, 116, 139, 0.15);
1926
+ color: #94a3b8;
1927
+ }
1928
+ .status-badge--assigned {
1929
+ background: rgba(59, 130, 246, 0.1);
1930
+ color: #60a5fa;
1931
+ }
1932
+ .status-badge--timed-out {
1933
+ background: rgba(239, 68, 68, 0.12);
1934
+ color: #f87171;
1935
+ }
1936
+ .status-badge--review-blocked {
1937
+ background: rgba(245, 158, 11, 0.12);
1938
+ color: #fbbf24;
1939
+ }
1940
+ .status-badge--skipped {
1941
+ background: rgba(100, 116, 139, 0.1);
1942
+ color: #64748b;
1943
+ }
1944
+ .status-badge--hook-failed {
1945
+ background: rgba(239, 68, 68, 0.1);
1946
+ color: #f87171;
1947
+ }
1948
+ .status-badge--disputed {
1949
+ background: rgba(167, 139, 250, 0.15);
1950
+ color: var(--accent-purple);
1951
+ }
1952
+ .status-badge--wait-for-input {
1953
+ background: rgba(245, 158, 11, 0.1);
1954
+ color: var(--color-partial);
1955
+ }
1956
+
1957
+ /* ── Task Summary Cards ── */
1958
+ .task-summary-cards {
1959
+ display: flex;
1960
+ gap: 12px;
1961
+ flex-wrap: wrap;
1962
+ margin-bottom: 20px;
1963
+ }
1964
+
1965
+ .task-summary-card {
1966
+ flex: 1 1 140px;
1967
+ display: flex;
1968
+ flex-direction: column;
1969
+ gap: 8px;
1970
+ padding: 14px 16px;
1971
+ background: var(--bg-card);
1972
+ border: 1px solid var(--border-color);
1973
+ border-radius: 10px;
1974
+ transition: border-color 0.15s;
1975
+ }
1976
+ .task-summary-card:hover {
1977
+ border-color: rgba(255, 255, 255, 0.12);
1978
+ }
1979
+ .task-summary-card__label {
1980
+ font-size: 0.6875rem;
1981
+ font-weight: 600;
1982
+ text-transform: uppercase;
1983
+ letter-spacing: 0.06em;
1984
+ color: var(--text-tertiary);
1985
+ }
1986
+ .task-summary-card__value {
1987
+ font-size: 1.75rem;
1988
+ font-weight: 700;
1989
+ line-height: 1;
1990
+ color: var(--text-primary);
1991
+ }
1992
+ .task-summary-card--done { border-left: 3px solid var(--color-success); }
1993
+ .task-summary-card--running { border-left: 3px solid var(--accent-blue); }
1994
+ .task-summary-card--errors { border-left: 3px solid var(--color-failed); }
1995
+ .task-summary-card--waiting { border-left: 3px solid #94a3b8; }
1996
+ .task-summary-card--input { border-left: 3px solid var(--color-partial); }
1997
+
1998
+ /* ── Task Table ── */
1999
+ .task-table-wrap {
2000
+ overflow-x: auto;
2001
+ }
2002
+ .task-table .td-num {
2003
+ text-align: right;
2004
+ }
2005
+ .sortable-th {
2006
+ cursor: pointer;
2007
+ user-select: none;
2008
+ }
2009
+ .sortable-th:hover {
2010
+ color: var(--text-secondary);
2011
+ }
2012
+ .sortable-th--active {
2013
+ color: var(--text-primary);
2014
+ }
2015
+ .sort-indicator {
2016
+ margin-left: 4px;
2017
+ font-size: 0.5625rem;
2018
+ opacity: 0.5;
2019
+ }
2020
+ .sortable-th--active .sort-indicator {
2021
+ opacity: 1;
2022
+ color: var(--accent-blue);
2023
+ }
2024
+
2025
+ /* ── Phase Breakdown ── */
2026
+ .phase-breakdown {
2027
+ display: flex;
2028
+ flex-direction: column;
2029
+ gap: 8px;
2030
+ margin-bottom: 20px;
2031
+ }
2032
+ .phase-breakdown__row {
2033
+ display: flex;
2034
+ align-items: center;
2035
+ gap: 12px;
2036
+ }
2037
+ .phase-breakdown__label {
2038
+ font-size: 0.75rem;
2039
+ font-weight: 600;
2040
+ color: var(--text-tertiary);
2041
+ min-width: 60px;
2042
+ }
2043
+ .phase-breakdown__bar {
2044
+ flex: 1;
2045
+ height: 10px;
2046
+ background: rgba(255, 255, 255, 0.04);
2047
+ border-radius: 5px;
2048
+ overflow: hidden;
2049
+ display: flex;
2050
+ }
2051
+ .phase-breakdown__seg {
2052
+ height: 100%;
2053
+ transition: width 0.3s ease;
2054
+ }
2055
+ .phase-breakdown__seg--done { background: var(--color-success); }
2056
+ .phase-breakdown__seg--running { background: var(--accent-blue); }
2057
+ .phase-breakdown__seg--waiting { background: #475569; }
2058
+ .phase-breakdown__seg--failed { background: var(--color-failed); }
2059
+ .phase-breakdown__count {
2060
+ font-size: 0.6875rem;
2061
+ color: var(--text-tertiary);
2062
+ min-width: 52px;
2063
+ text-align: right;
2064
+ }
2065
+
2066
+ /* ── Responsive: Overall Stats ── */
2067
+ @media (max-width: 960px) {
2068
+ .overall-stats__grid {
2069
+ grid-template-columns: repeat(3, 1fr);
2070
+ }
2071
+ }
2072
+ @media (max-width: 640px) {
2073
+ .overall-stats__grid {
2074
+ grid-template-columns: repeat(2, 1fr);
2075
+ }
2076
+ .convoy-detail-header__name {
2077
+ font-size: 1rem;
2078
+ }
2079
+ .convoy-selector__select {
2080
+ max-width: 200px;
2081
+ }
2082
+ }
2083
+ @media (max-width: 480px) {
2084
+ .overall-stats__grid {
2085
+ grid-template-columns: 1fr;
2086
+ }
2087
+ }
2088
+
2089
+ /* ── Quality / Reliability / Drift Sections ── */
2090
+ .reliability-empty {
2091
+ font-size: 0.875rem;
2092
+ color: var(--text-tertiary);
2093
+ padding: 12px 0;
2094
+ margin: 0;
2095
+ }
2096
+
2097
+ /* ── Secret Leak Banner ── */
2098
+ .secret-leak-banner {
2099
+ display: flex;
2100
+ align-items: flex-start;
2101
+ gap: 12px;
2102
+ padding: 14px 16px;
2103
+ background: rgba(245, 158, 11, 0.1);
2104
+ border: 1px solid rgba(245, 158, 11, 0.3);
2105
+ border-radius: 8px;
2106
+ margin-top: 16px;
2107
+ }
2108
+ .secret-leak-banner__icon {
2109
+ font-size: 1.25rem;
2110
+ flex-shrink: 0;
2111
+ line-height: 1.4;
2112
+ }
2113
+ .secret-leak-banner__text {
2114
+ display: flex;
2115
+ flex-direction: column;
2116
+ gap: 4px;
2117
+ }
2118
+ .secret-leak-banner__text strong {
2119
+ font-size: 0.875rem;
2120
+ font-weight: 600;
2121
+ color: var(--color-partial);
2122
+ }
2123
+ .secret-leak-banner__text span {
2124
+ font-size: 0.8125rem;
2125
+ color: var(--text-secondary);
2126
+ }
2127
+
2128
+ /* ── Artifact Type Badges ──────────────────────────────── */
2129
+ .artifact-type-badge {
2130
+ display: inline-block;
2131
+ padding: 2px 8px;
2132
+ border-radius: 4px;
2133
+ font-size: 0.75rem;
2134
+ font-weight: 600;
2135
+ color: #fff;
2136
+ text-transform: uppercase;
2137
+ letter-spacing: 0.03em;
2138
+ }
2139
+
2140
+ /* ── Timeline Filter Chips ─────────────────────────────── */
2141
+ .timeline-filters {
2142
+ display: flex;
2143
+ gap: 8px;
2144
+ flex-wrap: wrap;
2145
+ margin-bottom: 16px;
2146
+ }
2147
+
2148
+ .timeline-filter-chip {
2149
+ display: inline-flex;
2150
+ align-items: center;
2151
+ padding: 6px 14px;
2152
+ border-radius: 20px;
2153
+ border: 1px solid var(--border);
2154
+ background: transparent;
2155
+ color: var(--text-secondary);
2156
+ font-size: 0.8125rem;
2157
+ font-weight: 500;
2158
+ cursor: pointer;
2159
+ transition: all 0.15s ease;
2160
+ }
2161
+
2162
+ .timeline-filter-chip:hover {
2163
+ border-color: var(--accent);
2164
+ color: var(--text-primary);
2165
+ }
2166
+
2167
+ .timeline-filter-chip--active {
2168
+ background: var(--accent);
2169
+ border-color: var(--accent);
2170
+ color: #fff;
2171
+ }
2172
+
2173
+ /* ── Event Timeline ────────────────────────────────────── */
2174
+ .event-timeline-row {
2175
+ padding: 12px 16px;
2176
+ border-bottom: 1px solid var(--border);
2177
+ cursor: pointer;
2178
+ transition: background 0.15s ease;
2179
+ }
2180
+
2181
+ .event-timeline-row:hover {
2182
+ background: rgba(167, 139, 250, 0.05);
2183
+ }
2184
+
2185
+ .event-timeline-row--expanded {
2186
+ background: rgba(167, 139, 250, 0.08);
2187
+ }
2188
+
2189
+ .event-timeline-row__main {
2190
+ display: flex;
2191
+ align-items: center;
2192
+ gap: 12px;
2193
+ flex-wrap: wrap;
2194
+ }
2195
+
2196
+ .event-timeline-ts {
2197
+ font-size: 0.8125rem;
2198
+ color: var(--text-secondary);
2199
+ min-width: 140px;
2200
+ font-variant-numeric: tabular-nums;
2201
+ }
2202
+
2203
+ .event-type-badge {
2204
+ display: inline-block;
2205
+ padding: 2px 8px;
2206
+ border-radius: 4px;
2207
+ font-size: 0.6875rem;
2208
+ font-weight: 600;
2209
+ color: #fff;
2210
+ text-transform: uppercase;
2211
+ letter-spacing: 0.03em;
2212
+ }
2213
+
2214
+ .event-timeline-context {
2215
+ font-size: 0.8125rem;
2216
+ color: var(--text-tertiary, #6b7280);
2217
+ font-family: var(--font-mono, 'SF Mono', 'Fira Code', monospace);
2218
+ }
2219
+
2220
+ .event-timeline-detail {
2221
+ margin-top: 8px;
2222
+ padding: 12px;
2223
+ background: var(--bg-card, #111118);
2224
+ border-radius: 6px;
2225
+ border: 1px solid var(--border);
2226
+ }
2227
+
2228
+ .event-timeline-json {
2229
+ font-size: 0.75rem;
2230
+ color: var(--text-secondary);
2231
+ white-space: pre-wrap;
2232
+ word-break: break-all;
2233
+ margin: 0;
2234
+ font-family: var(--font-mono, 'SF Mono', 'Fira Code', monospace);
2235
+ max-height: 300px;
2236
+ overflow-y: auto;
2237
+ }
2238
+
2239
+ @media (max-width: 640px) {
2240
+ .event-timeline-ts {
2241
+ min-width: auto;
2242
+ font-size: 0.75rem;
2243
+ }
2244
+ .event-timeline-row__main {
2245
+ gap: 8px;
2246
+ }
2247
+ .timeline-filter-chip {
2248
+ padding: 4px 10px;
2249
+ font-size: 0.75rem;
2250
+ }
2251
+ }
2252
+
2253
+ /* ── Focus Styles ── */
2254
+ .dash-btn:focus-visible,
2255
+ .convoy-selector__select:focus-visible,
2256
+ .filter-select:focus-visible,
2257
+ .filter-input:focus-visible,
2258
+ .dash-sidebar__link:focus-visible,
2259
+ .timeline-filter-chip:focus-visible {
2260
+ outline: 2px solid var(--accent-blue);
2261
+ outline-offset: 2px;
2262
+ }
2263
+
2264
+ /* ── Status Explanation ── */
2265
+ .convoy-status-explanation {
2266
+ font-size: 0.8125rem;
2267
+ color: var(--text-secondary);
2268
+ margin-top: 0.25rem;
2269
+ margin-bottom: 0.5rem;
2270
+ font-style: italic;
2271
+ }