@ashlr/hub 2.2.0 → 3.0.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 (177) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +59 -2
  3. package/dist/api/plugin.d.ts +1 -0
  4. package/dist/cli/backlog.js +2 -0
  5. package/dist/cli/backlog.js.map +1 -1
  6. package/dist/cli/digest.d.ts +6 -0
  7. package/dist/cli/digest.js +127 -2
  8. package/dist/cli/digest.js.map +1 -1
  9. package/dist/cli/eval-fixtures.d.ts +18 -0
  10. package/dist/cli/eval-fixtures.js +38 -0
  11. package/dist/cli/eval-fixtures.js.map +1 -0
  12. package/dist/cli/eval.d.ts +56 -0
  13. package/dist/cli/eval.js +283 -0
  14. package/dist/cli/eval.js.map +1 -0
  15. package/dist/cli/fleet.d.ts +27 -0
  16. package/dist/cli/fleet.js +222 -0
  17. package/dist/cli/fleet.js.map +1 -0
  18. package/dist/cli/goal.d.ts +15 -0
  19. package/dist/cli/goal.js +91 -0
  20. package/dist/cli/goal.js.map +1 -0
  21. package/dist/cli/help.js +10 -3
  22. package/dist/cli/help.js.map +1 -1
  23. package/dist/cli/inbox.d.ts +6 -0
  24. package/dist/cli/inbox.js +183 -8
  25. package/dist/cli/inbox.js.map +1 -1
  26. package/dist/cli/index.js +42 -0
  27. package/dist/cli/index.js.map +1 -1
  28. package/dist/cli/loop.d.ts +16 -0
  29. package/dist/cli/loop.js +66 -0
  30. package/dist/cli/loop.js.map +1 -0
  31. package/dist/cli/mcp.d.ts +12 -0
  32. package/dist/cli/mcp.js +148 -0
  33. package/dist/cli/mcp.js.map +1 -1
  34. package/dist/cli/onboard.d.ts +16 -0
  35. package/dist/cli/onboard.js +71 -0
  36. package/dist/cli/onboard.js.map +1 -1
  37. package/dist/cli/plugins.js +9 -8
  38. package/dist/cli/plugins.js.map +1 -1
  39. package/dist/cli/pulse.d.ts +10 -0
  40. package/dist/cli/pulse.js +261 -0
  41. package/dist/cli/pulse.js.map +1 -1
  42. package/dist/cli/run.js +21 -3
  43. package/dist/cli/run.js.map +1 -1
  44. package/dist/cli/stack.d.ts +34 -0
  45. package/dist/cli/stack.js +221 -0
  46. package/dist/cli/stack.js.map +1 -0
  47. package/dist/cli/update.js +12 -5
  48. package/dist/cli/update.js.map +1 -1
  49. package/dist/core/daemon/loop.d.ts +10 -5
  50. package/dist/core/daemon/loop.js +167 -37
  51. package/dist/core/daemon/loop.js.map +1 -1
  52. package/dist/core/env-bridge.js +3 -2
  53. package/dist/core/env-bridge.js.map +1 -1
  54. package/dist/core/fleet/automerge-pass.d.ts +33 -0
  55. package/dist/core/fleet/automerge-pass.js +61 -0
  56. package/dist/core/fleet/automerge-pass.js.map +1 -0
  57. package/dist/core/fleet/quota.d.ts +70 -0
  58. package/dist/core/fleet/quota.js +198 -0
  59. package/dist/core/fleet/quota.js.map +1 -0
  60. package/dist/core/fleet/router.d.ts +46 -0
  61. package/dist/core/fleet/router.js +121 -0
  62. package/dist/core/fleet/router.js.map +1 -0
  63. package/dist/core/fleet/self.d.ts +58 -0
  64. package/dist/core/fleet/self.js +187 -0
  65. package/dist/core/fleet/self.js.map +1 -0
  66. package/dist/core/fleet/status.d.ts +54 -0
  67. package/dist/core/fleet/status.js +157 -0
  68. package/dist/core/fleet/status.js.map +1 -0
  69. package/dist/core/foundry/provenance.d.ts +78 -0
  70. package/dist/core/foundry/provenance.js +172 -0
  71. package/dist/core/foundry/provenance.js.map +1 -0
  72. package/dist/core/git.d.ts +13 -0
  73. package/dist/core/git.js +26 -0
  74. package/dist/core/git.js.map +1 -1
  75. package/dist/core/inbox/merge.d.ts +151 -0
  76. package/dist/core/inbox/merge.js +858 -0
  77. package/dist/core/inbox/merge.js.map +1 -0
  78. package/dist/core/inbox/store.js +10 -1
  79. package/dist/core/inbox/store.js.map +1 -1
  80. package/dist/core/integrations/markdown.d.ts +66 -0
  81. package/dist/core/integrations/markdown.js +132 -0
  82. package/dist/core/integrations/markdown.js.map +1 -0
  83. package/dist/core/integrations/secrets.d.ts +37 -0
  84. package/dist/core/integrations/secrets.js +67 -0
  85. package/dist/core/integrations/secrets.js.map +1 -0
  86. package/dist/core/integrations/stack.d.ts +47 -0
  87. package/dist/core/integrations/stack.js +107 -0
  88. package/dist/core/integrations/stack.js.map +1 -0
  89. package/dist/core/mcp-native-engineer.d.ts +123 -0
  90. package/dist/core/mcp-native-engineer.js +936 -0
  91. package/dist/core/mcp-native-engineer.js.map +1 -0
  92. package/dist/core/mcp-native.js +20 -42
  93. package/dist/core/mcp-native.js.map +1 -1
  94. package/dist/core/mcp-registry.js +2 -0
  95. package/dist/core/mcp-registry.js.map +1 -1
  96. package/dist/core/observability/codex-source.d.ts +53 -0
  97. package/dist/core/observability/codex-source.js +390 -0
  98. package/dist/core/observability/codex-source.js.map +1 -0
  99. package/dist/core/observability/estimate.d.ts +12 -0
  100. package/dist/core/observability/estimate.js +26 -0
  101. package/dist/core/observability/estimate.js.map +1 -1
  102. package/dist/core/observability/limits.d.ts +52 -0
  103. package/dist/core/observability/limits.js +316 -0
  104. package/dist/core/observability/limits.js.map +1 -0
  105. package/dist/core/observability/usage-source.js +3 -1
  106. package/dist/core/observability/usage-source.js.map +1 -1
  107. package/dist/core/portfolio/scanners.d.ts +1 -0
  108. package/dist/core/portfolio/scanners.js +40 -1
  109. package/dist/core/portfolio/scanners.js.map +1 -1
  110. package/dist/core/providers.js +4 -0
  111. package/dist/core/providers.js.map +1 -1
  112. package/dist/core/quality/health.js +1 -0
  113. package/dist/core/quality/health.js.map +1 -1
  114. package/dist/core/run/agent-loop.d.ts +8 -0
  115. package/dist/core/run/agent-loop.js +24 -14
  116. package/dist/core/run/agent-loop.js.map +1 -1
  117. package/dist/core/run/engine-registry.d.ts +48 -0
  118. package/dist/core/run/engine-registry.js +190 -0
  119. package/dist/core/run/engine-registry.js.map +1 -0
  120. package/dist/core/run/engines.d.ts +17 -3
  121. package/dist/core/run/engines.js +63 -44
  122. package/dist/core/run/engines.js.map +1 -1
  123. package/dist/core/run/learned-router.d.ts +121 -0
  124. package/dist/core/run/learned-router.js +374 -0
  125. package/dist/core/run/learned-router.js.map +1 -0
  126. package/dist/core/run/model-manager.js +3 -3
  127. package/dist/core/run/model-manager.js.map +1 -1
  128. package/dist/core/run/model-profile.d.ts +67 -0
  129. package/dist/core/run/model-profile.js +132 -0
  130. package/dist/core/run/model-profile.js.map +1 -0
  131. package/dist/core/run/orchestrator.d.ts +1 -1
  132. package/dist/core/run/orchestrator.js +642 -510
  133. package/dist/core/run/orchestrator.js.map +1 -1
  134. package/dist/core/run/prompts/budget.d.ts +25 -0
  135. package/dist/core/run/prompts/budget.js +51 -0
  136. package/dist/core/run/prompts/budget.js.map +1 -0
  137. package/dist/core/run/prompts/index.d.ts +14 -0
  138. package/dist/core/run/prompts/index.js +59 -0
  139. package/dist/core/run/prompts/index.js.map +1 -0
  140. package/dist/core/run/prompts/layers.d.ts +26 -0
  141. package/dist/core/run/prompts/layers.js +73 -0
  142. package/dist/core/run/prompts/layers.js.map +1 -0
  143. package/dist/core/run/prompts/roles.d.ts +23 -0
  144. package/dist/core/run/prompts/roles.js +48 -0
  145. package/dist/core/run/prompts/roles.js.map +1 -0
  146. package/dist/core/run/prompts/types.d.ts +38 -0
  147. package/dist/core/run/prompts/types.js +5 -0
  148. package/dist/core/run/prompts/types.js.map +1 -0
  149. package/dist/core/run/provider-client.d.ts +6 -24
  150. package/dist/core/run/provider-client.js +125 -61
  151. package/dist/core/run/provider-client.js.map +1 -1
  152. package/dist/core/run/router.js +8 -0
  153. package/dist/core/run/router.js.map +1 -1
  154. package/dist/core/run/sandboxed-engine.d.ts +66 -0
  155. package/dist/core/run/sandboxed-engine.js +262 -0
  156. package/dist/core/run/sandboxed-engine.js.map +1 -0
  157. package/dist/core/run/verify-commands.d.ts +83 -0
  158. package/dist/core/run/verify-commands.js +234 -0
  159. package/dist/core/run/verify-commands.js.map +1 -0
  160. package/dist/core/run/verify.d.ts +31 -1
  161. package/dist/core/run/verify.js +48 -0
  162. package/dist/core/run/verify.js.map +1 -1
  163. package/dist/core/sandbox/audit.d.ts +27 -0
  164. package/dist/core/sandbox/audit.js +34 -0
  165. package/dist/core/sandbox/audit.js.map +1 -1
  166. package/dist/core/sandbox/confine.d.ts +134 -0
  167. package/dist/core/sandbox/confine.js +370 -0
  168. package/dist/core/sandbox/confine.js.map +1 -0
  169. package/dist/core/types.d.ts +227 -5
  170. package/dist/core/web/api.js +77 -28
  171. package/dist/core/web/api.js.map +1 -1
  172. package/dist/core/web/control.d.ts +116 -0
  173. package/dist/core/web/control.js +307 -0
  174. package/dist/core/web/control.js.map +1 -0
  175. package/dist/core/web/public/app.js +512 -6
  176. package/dist/core/web/public/styles.css +468 -0
  177. package/package.json +1 -1
@@ -2005,3 +2005,471 @@ a:hover {
2005
2005
  transition-duration: 0.01ms !important;
2006
2006
  }
2007
2007
  }
2008
+
2009
+ /* =============================================================================
2010
+ M61 — Mission Control view
2011
+ ============================================================================= */
2012
+
2013
+ /* Nav highlight for the control link */
2014
+ .nav-link--control {
2015
+ border-left: 2px solid var(--accent);
2016
+ padding-left: calc(var(--space-3) - 2px);
2017
+ }
2018
+
2019
+ /* ── Hero panel ──────────────────────────────────────────────────────────── */
2020
+ .ctrl-hero {
2021
+ background: var(--bg-surface);
2022
+ border: 1px solid var(--border-default);
2023
+ border-radius: var(--radius-lg);
2024
+ padding: var(--space-5) var(--space-6);
2025
+ margin-bottom: var(--space-5);
2026
+ }
2027
+
2028
+ .ctrl-daemon-status {
2029
+ display: flex;
2030
+ align-items: center;
2031
+ gap: var(--space-3);
2032
+ margin-bottom: var(--space-3);
2033
+ }
2034
+
2035
+ .ctrl-daemon-label {
2036
+ font-size: 15px;
2037
+ font-weight: 600;
2038
+ color: var(--text-secondary);
2039
+ font-family: var(--font-mono);
2040
+ }
2041
+ .ctrl-daemon-label.running { color: var(--status-done); }
2042
+
2043
+ .ctrl-pid {
2044
+ font-size: 11px;
2045
+ color: var(--text-muted);
2046
+ font-family: var(--font-mono);
2047
+ background: var(--bg-elevated);
2048
+ border-radius: var(--radius-sm);
2049
+ padding: 1px 6px;
2050
+ }
2051
+
2052
+ .ctrl-last-tick {
2053
+ font-size: 11.5px;
2054
+ color: var(--text-muted);
2055
+ font-family: var(--font-mono);
2056
+ margin-bottom: var(--space-4);
2057
+ }
2058
+
2059
+ /* Live pulsing dot */
2060
+ .ctrl-live-dot {
2061
+ width: 10px;
2062
+ height: 10px;
2063
+ border-radius: 50%;
2064
+ background: var(--text-muted);
2065
+ flex-shrink: 0;
2066
+ transition: background var(--duration-normal);
2067
+ }
2068
+ .ctrl-live-dot.running {
2069
+ background: var(--status-done);
2070
+ box-shadow: 0 0 0 0 var(--status-done);
2071
+ animation: ctrl-pulse 2s infinite;
2072
+ }
2073
+ @keyframes ctrl-pulse {
2074
+ 0% { box-shadow: 0 0 0 0 rgba(52, 211, 153, 0.55); }
2075
+ 70% { box-shadow: 0 0 0 7px rgba(52, 211, 153, 0); }
2076
+ 100% { box-shadow: 0 0 0 0 rgba(52, 211, 153, 0); }
2077
+ }
2078
+
2079
+ /* Hero metrics row */
2080
+ .ctrl-hero-metrics {
2081
+ display: flex;
2082
+ flex-wrap: wrap;
2083
+ gap: var(--space-4);
2084
+ margin-top: var(--space-2);
2085
+ }
2086
+
2087
+ .ctrl-metric {
2088
+ display: flex;
2089
+ flex-direction: column;
2090
+ gap: 2px;
2091
+ min-width: 80px;
2092
+ }
2093
+ .ctrl-metric-value {
2094
+ font-size: 22px;
2095
+ font-weight: 700;
2096
+ font-family: var(--font-mono);
2097
+ letter-spacing: -0.5px;
2098
+ line-height: 1.15;
2099
+ }
2100
+ .ctrl-metric-label {
2101
+ font-size: 10.5px;
2102
+ font-weight: 600;
2103
+ letter-spacing: 0.05em;
2104
+ text-transform: uppercase;
2105
+ color: var(--text-muted);
2106
+ }
2107
+
2108
+ /* ── Shared card wrapper ─────────────────────────────────────────────────── */
2109
+ .ctrl-card {
2110
+ margin-bottom: var(--space-5);
2111
+ }
2112
+
2113
+ /* ── Banners ─────────────────────────────────────────────────────────────── */
2114
+ .ctrl-banner {
2115
+ padding: var(--space-3) var(--space-4);
2116
+ border-radius: var(--radius-md);
2117
+ font-size: 13px;
2118
+ margin-bottom: var(--space-4);
2119
+ display: flex;
2120
+ gap: var(--space-2);
2121
+ align-items: center;
2122
+ }
2123
+ .ctrl-banner--paused {
2124
+ background: rgba(248, 113, 113, 0.1);
2125
+ border: 1px solid rgba(248, 113, 113, 0.35);
2126
+ color: var(--status-failed);
2127
+ }
2128
+
2129
+ /* ── Local models ────────────────────────────────────────────────────────── */
2130
+ .ctrl-provider-row {
2131
+ display: flex;
2132
+ flex-wrap: wrap;
2133
+ align-items: center;
2134
+ gap: var(--space-3);
2135
+ padding: var(--space-3) 0;
2136
+ border-bottom: 1px solid var(--border-subtle);
2137
+ font-size: 13px;
2138
+ }
2139
+ .ctrl-provider-row:last-child { border-bottom: none; }
2140
+ .ctrl-provider-row.active { background: var(--accent-glow); border-radius: var(--radius-sm); padding-left: var(--space-3); }
2141
+
2142
+ .ctrl-health-dot {
2143
+ width: 8px;
2144
+ height: 8px;
2145
+ border-radius: 50%;
2146
+ flex-shrink: 0;
2147
+ }
2148
+ .ctrl-health-dot.up { background: var(--status-done); }
2149
+ .ctrl-health-dot.down { background: var(--status-failed); }
2150
+
2151
+ .ctrl-provider-name {
2152
+ font-family: var(--font-mono);
2153
+ font-size: 13px;
2154
+ font-weight: 600;
2155
+ color: var(--text-primary);
2156
+ min-width: 80px;
2157
+ }
2158
+ .ctrl-provider-kind {
2159
+ font-size: 11px;
2160
+ color: var(--text-muted);
2161
+ background: var(--bg-elevated);
2162
+ border-radius: var(--radius-sm);
2163
+ padding: 1px 5px;
2164
+ }
2165
+ .ctrl-provider-url {
2166
+ font-family: var(--font-mono);
2167
+ font-size: 11.5px;
2168
+ color: var(--text-secondary);
2169
+ }
2170
+ .ctrl-active-badge {
2171
+ font-size: 10px;
2172
+ font-weight: 700;
2173
+ letter-spacing: 0.08em;
2174
+ text-transform: uppercase;
2175
+ color: var(--accent);
2176
+ background: var(--accent-glow);
2177
+ border: 1px solid var(--accent-dim);
2178
+ border-radius: var(--radius-full);
2179
+ padding: 1px 7px;
2180
+ }
2181
+
2182
+ /* Model chips */
2183
+ .ctrl-model-chips {
2184
+ display: flex;
2185
+ flex-wrap: wrap;
2186
+ gap: var(--space-1);
2187
+ margin-left: auto;
2188
+ }
2189
+ .ctrl-model-chip {
2190
+ font-family: var(--font-mono);
2191
+ font-size: 11px;
2192
+ color: var(--text-secondary);
2193
+ background: var(--bg-elevated);
2194
+ border: 1px solid var(--border-default);
2195
+ border-radius: var(--radius-sm);
2196
+ padding: 1px 6px;
2197
+ white-space: nowrap;
2198
+ }
2199
+ .ctrl-model-chip.muted { color: var(--text-muted); border-style: dashed; }
2200
+
2201
+ /* ── Backends & limits ───────────────────────────────────────────────────── */
2202
+ .ctrl-sub-note {
2203
+ display: flex;
2204
+ align-items: center;
2205
+ gap: var(--space-2);
2206
+ font-size: 12px;
2207
+ color: var(--text-secondary);
2208
+ background: rgba(251, 191, 36, 0.08);
2209
+ border: 1px solid rgba(251, 191, 36, 0.25);
2210
+ border-radius: var(--radius-md);
2211
+ padding: var(--space-2) var(--space-3);
2212
+ margin-bottom: var(--space-4);
2213
+ }
2214
+ .ctrl-sub-icon { color: var(--status-aborted); font-size: 13px; }
2215
+
2216
+ /* M63: rolling-window usage rows */
2217
+ .ctrl-win-section { margin-bottom: var(--space-3); }
2218
+ .ctrl-win-label {
2219
+ font-size: 11px;
2220
+ font-weight: 700;
2221
+ color: var(--text-muted);
2222
+ text-transform: uppercase;
2223
+ letter-spacing: 0.06em;
2224
+ margin-bottom: var(--space-1);
2225
+ }
2226
+ .ctrl-win-row {
2227
+ display: grid;
2228
+ grid-template-columns: 100px 80px 80px;
2229
+ gap: var(--space-2);
2230
+ align-items: center;
2231
+ padding: 3px 0;
2232
+ border-bottom: 1px solid var(--border-subtle);
2233
+ font-size: 12px;
2234
+ }
2235
+ .ctrl-win-row:last-child { border-bottom: none; }
2236
+ .ctrl-win-provider { font-family: var(--font-mono); color: var(--text-primary); font-weight: 600; }
2237
+ .ctrl-win-tokens { font-family: var(--font-mono); color: var(--text-secondary); text-align: right; }
2238
+ .ctrl-win-cost { font-family: var(--font-mono); color: var(--accent); text-align: right; }
2239
+
2240
+ /* M63: provider status rows */
2241
+ .ctrl-prov-status-row {
2242
+ display: flex;
2243
+ align-items: baseline;
2244
+ gap: var(--space-2);
2245
+ padding: 5px 0;
2246
+ border-bottom: 1px solid var(--border-subtle);
2247
+ font-size: 12px;
2248
+ flex-wrap: wrap;
2249
+ }
2250
+ .ctrl-prov-status-row:last-child { border-bottom: none; }
2251
+ .ctrl-prov-status-name { font-family: var(--font-mono); font-weight: 700; color: var(--text-primary); min-width: 80px; }
2252
+ .ctrl-prov-status-detail { color: var(--text-secondary); flex: 1; min-width: 0; }
2253
+ .ctrl-prov-status-used { font-family: var(--font-mono); color: var(--status-done); font-size: 11px; white-space: nowrap; }
2254
+ /* M64: rate-limit bar for subscription providers (Codex used%) */
2255
+ .ctrl-prov-rl-wrap { display: flex; align-items: center; gap: var(--space-2); margin-top: var(--space-1); width: 100%; }
2256
+ .ctrl-prov-rl-bar-track { flex: 1; height: 4px; background: var(--bg-elevated); border-radius: 2px; overflow: hidden; min-width: 60px; max-width: 120px; }
2257
+ .ctrl-prov-rl-bar { height: 100%; border-radius: 2px; transition: width 0.3s ease; }
2258
+ .ctrl-prov-rl-pct { font-family: var(--font-mono); font-size: 11px; color: var(--text-secondary); white-space: nowrap; min-width: 32px; text-align: right; }
2259
+ .ctrl-prov-rl-reset { font-family: var(--font-mono); font-size: 11px; color: var(--text-muted); white-space: nowrap; }
2260
+ .ctrl-prov-kind-badge {
2261
+ font-size: 10px;
2262
+ font-weight: 700;
2263
+ border-radius: var(--radius-sm);
2264
+ padding: 1px 5px;
2265
+ white-space: nowrap;
2266
+ }
2267
+ .ctrl-prov-kind-badge.api-key { color: var(--status-done); background: rgba(74, 222, 128, 0.12); border: 1px solid rgba(74, 222, 128, 0.3); }
2268
+ .ctrl-prov-kind-badge.subscription { color: var(--text-muted); background: var(--bg-elevated); border: 1px solid var(--border-subtle); }
2269
+
2270
+ .ctrl-backend-list { margin-bottom: var(--space-4); }
2271
+
2272
+ .ctrl-backend-row {
2273
+ display: flex;
2274
+ align-items: center;
2275
+ gap: var(--space-3);
2276
+ padding: var(--space-2) 0;
2277
+ border-bottom: 1px solid var(--border-subtle);
2278
+ font-size: 13px;
2279
+ }
2280
+ .ctrl-backend-row:last-child { border-bottom: none; }
2281
+
2282
+ .ctrl-backend-name {
2283
+ font-family: var(--font-mono);
2284
+ font-weight: 600;
2285
+ color: var(--text-primary);
2286
+ min-width: 100px;
2287
+ }
2288
+ .ctrl-backend-dispatches {
2289
+ font-size: 12px;
2290
+ color: var(--text-secondary);
2291
+ flex: 1;
2292
+ }
2293
+
2294
+ .ctrl-limits-heading {
2295
+ font-size: 10.5px;
2296
+ font-weight: 700;
2297
+ letter-spacing: 0.07em;
2298
+ text-transform: uppercase;
2299
+ color: var(--text-muted);
2300
+ margin-bottom: var(--space-2);
2301
+ margin-top: var(--space-2);
2302
+ }
2303
+
2304
+ .ctrl-limit-row {
2305
+ display: grid;
2306
+ grid-template-columns: 110px 50px 1fr 60px 55px;
2307
+ align-items: center;
2308
+ gap: var(--space-3);
2309
+ padding: var(--space-2) 0;
2310
+ font-size: 12px;
2311
+ }
2312
+ .ctrl-limit-backend { font-family: var(--font-mono); color: var(--text-primary); font-weight: 600; }
2313
+ .ctrl-limit-window { font-family: var(--font-mono); color: var(--text-muted); font-size: 11px; }
2314
+ .ctrl-limit-bar-wrap {
2315
+ height: 6px;
2316
+ background: var(--bg-elevated);
2317
+ border-radius: var(--radius-full);
2318
+ overflow: hidden;
2319
+ }
2320
+ .ctrl-limit-bar {
2321
+ height: 100%;
2322
+ border-radius: var(--radius-full);
2323
+ transition: width var(--duration-normal) var(--ease-out);
2324
+ min-width: 2px;
2325
+ }
2326
+ .ctrl-limit-label { font-family: var(--font-mono); font-size: 11px; color: var(--text-secondary); text-align: right; }
2327
+ .ctrl-standing { font-size: 10.5px; font-weight: 700; text-align: center; border-radius: var(--radius-sm); padding: 1px 5px; }
2328
+ .ctrl-standing.ok { color: var(--status-done); background: rgba(52, 211, 153, 0.12); }
2329
+ .ctrl-standing.warn { color: var(--status-aborted); background: rgba(251, 146, 60, 0.12); }
2330
+ .ctrl-standing.over { color: var(--status-failed); background: rgba(248, 113, 113, 0.12); }
2331
+ .ctrl-standing.unlimited { color: var(--text-muted); background: var(--bg-elevated); }
2332
+
2333
+ /* ── Usage panel ─────────────────────────────────────────────────────────── */
2334
+ .ctrl-usage-totals {
2335
+ display: flex;
2336
+ flex-wrap: wrap;
2337
+ gap: var(--space-4);
2338
+ margin-bottom: var(--space-5);
2339
+ }
2340
+
2341
+ .ctrl-prov-heading {
2342
+ font-size: 10.5px;
2343
+ font-weight: 700;
2344
+ letter-spacing: 0.07em;
2345
+ text-transform: uppercase;
2346
+ color: var(--text-muted);
2347
+ margin-bottom: var(--space-3);
2348
+ }
2349
+
2350
+ .ctrl-prov-row {
2351
+ display: grid;
2352
+ grid-template-columns: 160px 1fr 42px 70px 70px;
2353
+ align-items: center;
2354
+ gap: var(--space-3);
2355
+ padding: var(--space-2) 0;
2356
+ font-size: 12px;
2357
+ border-bottom: 1px solid var(--border-subtle);
2358
+ }
2359
+ .ctrl-prov-row:last-child { border-bottom: none; }
2360
+ .ctrl-prov-label { font-family: var(--font-mono); color: var(--text-primary); }
2361
+ .ctrl-prov-label.local { color: var(--status-done); }
2362
+
2363
+ .ctrl-prov-bar-wrap {
2364
+ height: 6px;
2365
+ background: var(--bg-elevated);
2366
+ border-radius: var(--radius-full);
2367
+ overflow: hidden;
2368
+ }
2369
+ .ctrl-prov-bar {
2370
+ height: 100%;
2371
+ border-radius: var(--radius-full);
2372
+ background: var(--accent);
2373
+ transition: width var(--duration-normal) var(--ease-out);
2374
+ min-width: 2px;
2375
+ }
2376
+ .ctrl-prov-bar.local { background: var(--status-done); }
2377
+
2378
+ .ctrl-prov-pct { font-family: var(--font-mono); font-size: 11px; color: var(--text-secondary); text-align: right; }
2379
+ .ctrl-prov-cost { font-family: var(--font-mono); font-size: 11px; color: var(--text-muted); text-align: right; }
2380
+ .ctrl-prov-tokens { font-family: var(--font-mono); font-size: 11px; color: var(--text-muted); text-align: right; }
2381
+
2382
+ /* ── Activity log ────────────────────────────────────────────────────────── */
2383
+ .ctrl-log-body {
2384
+ padding: var(--space-2) var(--space-5);
2385
+ max-height: 320px;
2386
+ overflow-y: auto;
2387
+ font-family: var(--font-mono);
2388
+ font-size: 12px;
2389
+ }
2390
+ .ctrl-log-row {
2391
+ display: grid;
2392
+ grid-template-columns: 90px 60px 1fr;
2393
+ gap: var(--space-3);
2394
+ align-items: baseline;
2395
+ padding: var(--space-1) 0;
2396
+ border-bottom: 1px solid var(--border-subtle);
2397
+ transition: background var(--duration-fast);
2398
+ }
2399
+ .ctrl-log-row:last-child { border-bottom: none; }
2400
+ .ctrl-log-row:hover { background: var(--bg-hover); }
2401
+ .ctrl-log-row--error, .ctrl-log-row--fail { color: var(--status-failed); }
2402
+ .ctrl-log-row--warn { color: var(--status-aborted); }
2403
+
2404
+ .ctrl-log-ts { color: var(--text-muted); font-size: 11px; white-space: nowrap; }
2405
+ .ctrl-log-kind {
2406
+ font-size: 10px;
2407
+ font-weight: 700;
2408
+ letter-spacing: 0.06em;
2409
+ text-transform: uppercase;
2410
+ text-align: center;
2411
+ border-radius: var(--radius-sm);
2412
+ padding: 1px 4px;
2413
+ }
2414
+ .ctrl-log-kind--info { color: var(--accent); background: rgba(56, 189, 248, 0.1); }
2415
+ .ctrl-log-kind--warn { color: var(--status-aborted); background: rgba(251, 146, 60, 0.1); }
2416
+ .ctrl-log-kind--error,
2417
+ .ctrl-log-kind--fail { color: var(--status-failed); background: rgba(248, 113, 113, 0.1); }
2418
+ .ctrl-log-kind--success,
2419
+ .ctrl-log-kind--done { color: var(--status-done); background: rgba(52, 211, 153, 0.1); }
2420
+ .ctrl-log-kind--debug { color: var(--text-muted); background: var(--bg-elevated); }
2421
+ .ctrl-log-msg { color: var(--text-primary); word-break: break-word; }
2422
+
2423
+ /* ── M67: Security panel ─────────────────────────────────────────────────── */
2424
+ .ctrl-sec-counts {
2425
+ display: flex;
2426
+ flex-wrap: wrap;
2427
+ gap: var(--space-2);
2428
+ margin-bottom: var(--space-3);
2429
+ }
2430
+
2431
+ .ctrl-sec-badge {
2432
+ font-size: 11px;
2433
+ font-weight: 700;
2434
+ letter-spacing: 0.04em;
2435
+ text-transform: uppercase;
2436
+ border-radius: var(--radius-full);
2437
+ padding: 2px 10px;
2438
+ }
2439
+ .ctrl-sec-badge--critical { color: #fff; background: var(--status-failed); }
2440
+ .ctrl-sec-badge--high { color: var(--text-inverse); background: var(--status-aborted); }
2441
+ .ctrl-sec-badge--medium { color: var(--text-inverse); background: #facc15; }
2442
+ .ctrl-sec-badge--low { color: var(--text-primary); background: var(--bg-elevated); border: 1px solid var(--border-default); }
2443
+
2444
+ .ctrl-sec-list {
2445
+ display: flex;
2446
+ flex-direction: column;
2447
+ gap: 2px;
2448
+ }
2449
+
2450
+ .ctrl-sec-row {
2451
+ display: grid;
2452
+ grid-template-columns: 72px 120px 1fr;
2453
+ gap: var(--space-3);
2454
+ align-items: baseline;
2455
+ padding: var(--space-1) var(--space-2);
2456
+ border-radius: var(--radius-sm);
2457
+ font-size: 12.5px;
2458
+ }
2459
+ .ctrl-sec-row:hover { background: var(--bg-hover); }
2460
+
2461
+ .ctrl-sec-sev {
2462
+ font-size: 10.5px;
2463
+ font-weight: 700;
2464
+ text-transform: uppercase;
2465
+ text-align: center;
2466
+ border-radius: var(--radius-sm);
2467
+ padding: 1px 5px;
2468
+ }
2469
+ .ctrl-sec-sev--critical { color: var(--status-failed); background: rgba(248, 113, 113, 0.15); }
2470
+ .ctrl-sec-sev--high { color: var(--status-aborted); background: rgba(251, 146, 60, 0.15); }
2471
+ .ctrl-sec-sev--medium { color: #facc15; background: rgba(250, 204, 21, 0.12); }
2472
+ .ctrl-sec-sev--low { color: var(--text-muted); background: var(--bg-elevated); }
2473
+
2474
+ .ctrl-sec-repo { color: var(--text-secondary); font-family: var(--font-mono); font-size: 11.5px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
2475
+ .ctrl-sec-title { color: var(--text-primary); word-break: break-word; }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ashlr/hub",
3
- "version": "2.2.0",
3
+ "version": "3.0.0",
4
4
  "description": "Local-first command center for agentic engineers.",
5
5
  "publishConfig": {
6
6
  "access": "public",