@ashlr/hub 3.12.0 → 3.14.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 (719) hide show
  1. package/CHANGELOG.md +157 -0
  2. package/README.md +29 -16
  3. package/dist/authority-surface.json +274 -148
  4. package/dist/build-identity.json +2 -2
  5. package/dist/cli/authority.d.ts +145 -33
  6. package/dist/cli/authority.js +1292 -315
  7. package/dist/cli/authority.js.map +1 -1
  8. package/dist/cli/cloud.js +12 -3
  9. package/dist/cli/cloud.js.map +1 -1
  10. package/dist/cli/comms.d.ts +33 -19
  11. package/dist/cli/comms.js +128 -151
  12. package/dist/cli/comms.js.map +1 -1
  13. package/dist/cli/completions.js +1 -1
  14. package/dist/cli/completions.js.map +1 -1
  15. package/dist/cli/daemon.js +29 -0
  16. package/dist/cli/daemon.js.map +1 -1
  17. package/dist/cli/director.d.ts +8 -12
  18. package/dist/cli/director.js +17 -52
  19. package/dist/cli/director.js.map +1 -1
  20. package/dist/cli/fleet.js +4 -1
  21. package/dist/cli/fleet.js.map +1 -1
  22. package/dist/cli/help.js +1 -0
  23. package/dist/cli/help.js.map +1 -1
  24. package/dist/cli/leader.d.ts +27 -3
  25. package/dist/cli/leader.js +253 -4
  26. package/dist/cli/leader.js.map +1 -1
  27. package/dist/core/authority/protected-paths.js +11 -0
  28. package/dist/core/authority/protected-paths.js.map +1 -1
  29. package/dist/core/authority/resident.d.ts +101 -0
  30. package/dist/core/authority/resident.js +246 -0
  31. package/dist/core/authority/resident.js.map +1 -0
  32. package/dist/core/authority/server-enforcement.d.ts +110 -0
  33. package/dist/core/authority/server-enforcement.js +260 -0
  34. package/dist/core/authority/server-enforcement.js.map +1 -0
  35. package/dist/core/authority/standing-grant.d.ts +24 -4
  36. package/dist/core/authority/standing-grant.js +19 -3
  37. package/dist/core/authority/standing-grant.js.map +1 -1
  38. package/dist/core/authority/types.d.ts +43 -0
  39. package/dist/core/authority/types.js +6 -0
  40. package/dist/core/authority/types.js.map +1 -1
  41. package/dist/core/cloud/budget.js +11 -1
  42. package/dist/core/cloud/budget.js.map +1 -1
  43. package/dist/core/cloud/cloud-api.d.ts +25 -2
  44. package/dist/core/cloud/cloud-api.js +139 -5
  45. package/dist/core/cloud/cloud-api.js.map +1 -1
  46. package/dist/core/cloud/pr-actions.d.ts +93 -0
  47. package/dist/core/cloud/pr-actions.js +436 -0
  48. package/dist/core/cloud/pr-actions.js.map +1 -0
  49. package/dist/core/cloud/pr-preview.d.ts +128 -0
  50. package/dist/core/cloud/pr-preview.js +228 -0
  51. package/dist/core/cloud/pr-preview.js.map +1 -0
  52. package/dist/core/cloud/store.d.ts +2 -0
  53. package/dist/core/cloud/store.js +28 -0
  54. package/dist/core/cloud/store.js.map +1 -1
  55. package/dist/core/cloud/timeline-api.d.ts +24 -0
  56. package/dist/core/cloud/timeline-api.js +46 -0
  57. package/dist/core/cloud/timeline-api.js.map +1 -0
  58. package/dist/core/cloud/timeline-types.d.ts +62 -0
  59. package/dist/core/cloud/timeline-types.js +36 -0
  60. package/dist/core/cloud/timeline-types.js.map +1 -0
  61. package/dist/core/cloud/timeline.d.ts +102 -0
  62. package/dist/core/cloud/timeline.js +925 -0
  63. package/dist/core/cloud/timeline.js.map +1 -0
  64. package/dist/core/cloud/tracker.js +67 -0
  65. package/dist/core/cloud/tracker.js.map +1 -1
  66. package/dist/core/cloud/types.d.ts +38 -0
  67. package/dist/core/cloud/types.js +1 -1
  68. package/dist/core/cloud/types.js.map +1 -1
  69. package/dist/core/comms/change-digest.d.ts +130 -0
  70. package/dist/core/comms/change-digest.js +451 -0
  71. package/dist/core/comms/change-digest.js.map +1 -0
  72. package/dist/core/comms/director-prompt.d.ts +4 -5
  73. package/dist/core/comms/director-prompt.js +4 -71
  74. package/dist/core/comms/director-prompt.js.map +1 -1
  75. package/dist/core/comms/director.d.ts +24 -61
  76. package/dist/core/comms/director.js +29 -382
  77. package/dist/core/comms/director.js.map +1 -1
  78. package/dist/core/comms/dispatch.d.ts +37 -12
  79. package/dist/core/comms/dispatch.js +244 -177
  80. package/dist/core/comms/dispatch.js.map +1 -1
  81. package/dist/core/comms/elon-dialogue.d.ts +23 -15
  82. package/dist/core/comms/elon-dialogue.js +36 -307
  83. package/dist/core/comms/elon-dialogue.js.map +1 -1
  84. package/dist/core/comms/fleet-pulse.js +4 -7
  85. package/dist/core/comms/fleet-pulse.js.map +1 -1
  86. package/dist/core/comms/handlers.d.ts +10 -6
  87. package/dist/core/comms/handlers.js +14 -48
  88. package/dist/core/comms/handlers.js.map +1 -1
  89. package/dist/core/comms/migrations.d.ts +47 -0
  90. package/dist/core/comms/migrations.js +125 -0
  91. package/dist/core/comms/migrations.js.map +1 -0
  92. package/dist/core/comms/requests.d.ts +32 -5
  93. package/dist/core/comms/requests.js +101 -5
  94. package/dist/core/comms/requests.js.map +1 -1
  95. package/dist/core/comms/telegram-channel.d.ts +104 -0
  96. package/dist/core/comms/telegram-channel.js +622 -0
  97. package/dist/core/comms/telegram-channel.js.map +1 -0
  98. package/dist/core/comms/telegram-thread-map.d.ts +56 -0
  99. package/dist/core/comms/telegram-thread-map.js +144 -0
  100. package/dist/core/comms/telegram-thread-map.js.map +1 -0
  101. package/dist/core/daemon/capacity-publisher.d.ts +8 -1
  102. package/dist/core/daemon/capacity-publisher.js +40 -2
  103. package/dist/core/daemon/capacity-publisher.js.map +1 -1
  104. package/dist/core/daemon/loop.js +18 -4
  105. package/dist/core/daemon/loop.js.map +1 -1
  106. package/dist/core/daemon/service-install-authority.d.ts +10 -2
  107. package/dist/core/daemon/service-install-authority.js +14 -5
  108. package/dist/core/daemon/service-install-authority.js.map +1 -1
  109. package/dist/core/daemon/service.d.ts +15 -0
  110. package/dist/core/daemon/service.js +26 -0
  111. package/dist/core/daemon/service.js.map +1 -1
  112. package/dist/core/daemon/tick-deadline.d.ts +44 -0
  113. package/dist/core/daemon/tick-deadline.js +83 -0
  114. package/dist/core/daemon/tick-deadline.js.map +1 -0
  115. package/dist/core/daemon/tick-hooks.d.ts +7 -0
  116. package/dist/core/daemon/tick-hooks.js.map +1 -1
  117. package/dist/core/daemon/tick-progress.d.ts +39 -0
  118. package/dist/core/daemon/tick-progress.js +194 -0
  119. package/dist/core/daemon/tick-progress.js.map +1 -0
  120. package/dist/core/dashboard.js +3 -1
  121. package/dist/core/dashboard.js.map +1 -1
  122. package/dist/core/fleet/cloud-intake.d.ts +95 -0
  123. package/dist/core/fleet/cloud-intake.js +557 -0
  124. package/dist/core/fleet/cloud-intake.js.map +1 -0
  125. package/dist/core/fleet/dispatch-router.d.ts +13 -0
  126. package/dist/core/fleet/dispatch-router.js +32 -8
  127. package/dist/core/fleet/dispatch-router.js.map +1 -1
  128. package/dist/core/fleet/fleet-merge-state.d.ts +16 -0
  129. package/dist/core/fleet/fleet-merge-state.js.map +1 -1
  130. package/dist/core/fleet/host-merge.d.ts +14 -0
  131. package/dist/core/fleet/host-merge.js +24 -2
  132. package/dist/core/fleet/host-merge.js.map +1 -1
  133. package/dist/core/fleet/merge-gates.d.ts +21 -0
  134. package/dist/core/fleet/merge-gates.js +39 -5
  135. package/dist/core/fleet/merge-gates.js.map +1 -1
  136. package/dist/core/fleet/mirrors.d.ts +162 -6
  137. package/dist/core/fleet/mirrors.js +1051 -49
  138. package/dist/core/fleet/mirrors.js.map +1 -1
  139. package/dist/core/fleet/standing-merge-pass.d.ts +8 -0
  140. package/dist/core/fleet/standing-merge-pass.js +102 -1
  141. package/dist/core/fleet/standing-merge-pass.js.map +1 -1
  142. package/dist/core/fleet/status.d.ts +17 -0
  143. package/dist/core/fleet/status.js +22 -0
  144. package/dist/core/fleet/status.js.map +1 -1
  145. package/dist/core/fleet/tick-hooks-live.d.ts +10 -1
  146. package/dist/core/fleet/tick-hooks-live.js +57 -8
  147. package/dist/core/fleet/tick-hooks-live.js.map +1 -1
  148. package/dist/core/fleet/verify-check-run.d.ts +90 -0
  149. package/dist/core/fleet/verify-check-run.js +274 -0
  150. package/dist/core/fleet/verify-check-run.js.map +1 -0
  151. package/dist/core/git.d.ts +17 -0
  152. package/dist/core/git.js +124 -25
  153. package/dist/core/git.js.map +1 -1
  154. package/dist/core/goals/open-goals.d.ts +47 -0
  155. package/dist/core/goals/open-goals.js +33 -0
  156. package/dist/core/goals/open-goals.js.map +1 -0
  157. package/dist/core/inbox/merge.d.ts +5 -0
  158. package/dist/core/inbox/merge.js +58 -2
  159. package/dist/core/inbox/merge.js.map +1 -1
  160. package/dist/core/integrations/locus.d.ts +28 -0
  161. package/dist/core/integrations/locus.js +155 -30
  162. package/dist/core/integrations/locus.js.map +1 -1
  163. package/dist/core/integrations/telegram-format.d.ts +40 -0
  164. package/dist/core/integrations/telegram-format.js +123 -0
  165. package/dist/core/integrations/telegram-format.js.map +1 -0
  166. package/dist/core/integrations/telegram.d.ts +60 -4
  167. package/dist/core/integrations/telegram.js +161 -28
  168. package/dist/core/integrations/telegram.js.map +1 -1
  169. package/dist/core/mcp-registry.d.ts +12 -0
  170. package/dist/core/mcp-registry.js +70 -0
  171. package/dist/core/mcp-registry.js.map +1 -1
  172. package/dist/core/observability/rollup.d.ts +12 -10
  173. package/dist/core/observability/rollup.js +44 -17
  174. package/dist/core/observability/rollup.js.map +1 -1
  175. package/dist/core/resources/connection-monitor.d.ts +9 -0
  176. package/dist/core/resources/connection-monitor.js +19 -9
  177. package/dist/core/resources/connection-monitor.js.map +1 -1
  178. package/dist/core/resources/quota-refresh-lease.d.ts +17 -0
  179. package/dist/core/resources/quota-refresh-lease.js +34 -1
  180. package/dist/core/resources/quota-refresh-lease.js.map +1 -1
  181. package/dist/core/routing/budget-api.d.ts +18 -1
  182. package/dist/core/routing/budget-api.js +120 -10
  183. package/dist/core/routing/budget-api.js.map +1 -1
  184. package/dist/core/routing/budget-store.d.ts +22 -1
  185. package/dist/core/routing/budget-store.js +22 -8
  186. package/dist/core/routing/budget-store.js.map +1 -1
  187. package/dist/core/routing/readiness-types.d.ts +82 -0
  188. package/dist/core/routing/readiness-types.js +23 -0
  189. package/dist/core/routing/readiness-types.js.map +1 -0
  190. package/dist/core/routing/readiness.d.ts +103 -0
  191. package/dist/core/routing/readiness.js +480 -0
  192. package/dist/core/routing/readiness.js.map +1 -0
  193. package/dist/core/sandbox/confine.js +22 -1
  194. package/dist/core/sandbox/confine.js.map +1 -1
  195. package/dist/core/sandbox/policy.d.ts +23 -0
  196. package/dist/core/sandbox/policy.js +100 -0
  197. package/dist/core/sandbox/policy.js.map +1 -1
  198. package/dist/core/types.d.ts +13 -0
  199. package/dist/core/types.js.map +1 -1
  200. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  201. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +1204 -939
  202. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +1319 -1054
  203. package/dist/core/usage/frontier-usage.d.ts +20 -2
  204. package/dist/core/usage/frontier-usage.js +75 -17
  205. package/dist/core/usage/frontier-usage.js.map +1 -1
  206. package/dist/core/verse/account-health.js +9 -3
  207. package/dist/core/verse/account-health.js.map +1 -1
  208. package/dist/core/verse/accounts.d.ts +45 -0
  209. package/dist/core/verse/accounts.js +246 -17
  210. package/dist/core/verse/accounts.js.map +1 -1
  211. package/dist/core/verse/activity-api.d.ts +5 -1
  212. package/dist/core/verse/activity-api.js +62 -14
  213. package/dist/core/verse/activity-api.js.map +1 -1
  214. package/dist/core/verse/apps-api.js +23 -11
  215. package/dist/core/verse/apps-api.js.map +1 -1
  216. package/dist/core/verse/apps.d.ts +11 -9
  217. package/dist/core/verse/apps.js +2 -2
  218. package/dist/core/verse/apps.js.map +1 -1
  219. package/dist/core/verse/authority-api.d.ts +17 -3
  220. package/dist/core/verse/authority-api.js +122 -7
  221. package/dist/core/verse/authority-api.js.map +1 -1
  222. package/dist/core/verse/autonomy-ladder.d.ts +172 -0
  223. package/dist/core/verse/autonomy-ladder.js +251 -0
  224. package/dist/core/verse/autonomy-ladder.js.map +1 -0
  225. package/dist/core/verse/context-fit.js +7 -5
  226. package/dist/core/verse/context-fit.js.map +1 -1
  227. package/dist/core/verse/control-api.d.ts +23 -1
  228. package/dist/core/verse/control-api.js +117 -10
  229. package/dist/core/verse/control-api.js.map +1 -1
  230. package/dist/core/verse/fleet-live-api.js +13 -5
  231. package/dist/core/verse/fleet-live-api.js.map +1 -1
  232. package/dist/core/verse/folder-io.d.ts +50 -0
  233. package/dist/core/verse/folder-io.js +142 -0
  234. package/dist/core/verse/folder-io.js.map +1 -0
  235. package/dist/core/verse/git-api.js +5 -4
  236. package/dist/core/verse/git-api.js.map +1 -1
  237. package/dist/core/verse/git-ops.d.ts +10 -1
  238. package/dist/core/verse/git-ops.js +18 -2
  239. package/dist/core/verse/git-ops.js.map +1 -1
  240. package/dist/core/verse/github-api.d.ts +1 -1
  241. package/dist/core/verse/github-api.js +5 -4
  242. package/dist/core/verse/github-api.js.map +1 -1
  243. package/dist/core/verse/github-repo.js +118 -14
  244. package/dist/core/verse/github-repo.js.map +1 -1
  245. package/dist/core/verse/leader-api.d.ts +5 -4
  246. package/dist/core/verse/leader-api.js +237 -10
  247. package/dist/core/verse/leader-api.js.map +1 -1
  248. package/dist/core/verse/local-models.d.ts +10 -0
  249. package/dist/core/verse/local-models.js +10 -1
  250. package/dist/core/verse/local-models.js.map +1 -1
  251. package/dist/core/verse/login-path.d.ts +73 -0
  252. package/dist/core/verse/login-path.js +123 -14
  253. package/dist/core/verse/login-path.js.map +1 -1
  254. package/dist/core/verse/mcp-control-api.js +4 -4
  255. package/dist/core/verse/mcp-control-api.js.map +1 -1
  256. package/dist/core/verse/mcp-scope.d.ts +22 -0
  257. package/dist/core/verse/mcp-scope.js +41 -1
  258. package/dist/core/verse/mcp-scope.js.map +1 -1
  259. package/dist/core/verse/mcp-seat-view.d.ts +10 -0
  260. package/dist/core/verse/mcp-seat-view.js +30 -4
  261. package/dist/core/verse/mcp-seat-view.js.map +1 -1
  262. package/dist/core/verse/overnight-api.js +20 -2
  263. package/dist/core/verse/overnight-api.js.map +1 -1
  264. package/dist/core/verse/path-guard.d.ts +24 -0
  265. package/dist/core/verse/path-guard.js +91 -22
  266. package/dist/core/verse/path-guard.js.map +1 -1
  267. package/dist/core/verse/preview-api.js +22 -0
  268. package/dist/core/verse/preview-api.js.map +1 -1
  269. package/dist/core/verse/projects.d.ts +21 -0
  270. package/dist/core/verse/projects.js +82 -0
  271. package/dist/core/verse/projects.js.map +1 -1
  272. package/dist/core/verse/seat-readiness.d.ts +25 -0
  273. package/dist/core/verse/seat-readiness.js +43 -6
  274. package/dist/core/verse/seat-readiness.js.map +1 -1
  275. package/dist/core/verse/session-controls-api.js +5 -3
  276. package/dist/core/verse/session-controls-api.js.map +1 -1
  277. package/dist/core/verse/session-handoff.d.ts +26 -0
  278. package/dist/core/verse/session-handoff.js +90 -12
  279. package/dist/core/verse/session-handoff.js.map +1 -1
  280. package/dist/core/verse/terminal-api.js +7 -4
  281. package/dist/core/verse/terminal-api.js.map +1 -1
  282. package/dist/core/verse/terminal.js +9 -5
  283. package/dist/core/verse/terminal.js.map +1 -1
  284. package/dist/core/verse/verse-api.d.ts +3 -1
  285. package/dist/core/verse/verse-api.js +87 -27
  286. package/dist/core/verse/verse-api.js.map +1 -1
  287. package/dist/core/verse/workspaces.d.ts +51 -0
  288. package/dist/core/verse/workspaces.js +177 -47
  289. package/dist/core/verse/workspaces.js.map +1 -1
  290. package/dist/core/vision/leader-apply.d.ts +40 -0
  291. package/dist/core/vision/leader-apply.js +101 -30
  292. package/dist/core/vision/leader-apply.js.map +1 -1
  293. package/dist/core/vision/leader-cadence.d.ts +114 -0
  294. package/dist/core/vision/leader-cadence.js +127 -0
  295. package/dist/core/vision/leader-cadence.js.map +1 -0
  296. package/dist/core/vision/leader-goal-evidence.d.ts +25 -0
  297. package/dist/core/vision/leader-goal-evidence.js +36 -0
  298. package/dist/core/vision/leader-goal-evidence.js.map +1 -0
  299. package/dist/core/vision/leader-health.d.ts +53 -0
  300. package/dist/core/vision/leader-health.js +92 -0
  301. package/dist/core/vision/leader-health.js.map +1 -0
  302. package/dist/core/vision/leader-operator.d.ts +176 -0
  303. package/dist/core/vision/leader-operator.js +355 -0
  304. package/dist/core/vision/leader-operator.js.map +1 -0
  305. package/dist/core/vision/leader-run-chain.d.ts +41 -0
  306. package/dist/core/vision/leader-run-chain.js +54 -0
  307. package/dist/core/vision/leader-run-chain.js.map +1 -0
  308. package/dist/core/vision/leader-seat-plan.d.ts +68 -0
  309. package/dist/core/vision/leader-seat-plan.js +93 -0
  310. package/dist/core/vision/leader-seat-plan.js.map +1 -0
  311. package/dist/core/vision/leader-seat.d.ts +71 -5
  312. package/dist/core/vision/leader-seat.js +235 -33
  313. package/dist/core/vision/leader-seat.js.map +1 -1
  314. package/dist/core/vision/leader-thread-types.d.ts +104 -0
  315. package/dist/core/vision/leader-thread-types.js +9 -0
  316. package/dist/core/vision/leader-thread-types.js.map +1 -0
  317. package/dist/core/vision/leader-thread.d.ts +138 -0
  318. package/dist/core/vision/leader-thread.js +926 -0
  319. package/dist/core/vision/leader-thread.js.map +1 -0
  320. package/dist/core/vision/leader-types.d.ts +75 -1
  321. package/dist/core/vision/leader.d.ts +88 -18
  322. package/dist/core/vision/leader.js +269 -69
  323. package/dist/core/vision/leader.js.map +1 -1
  324. package/dist/core/web/public/next/assets/{ActionMenu-B4-39f2S.js → ActionMenu-CIiX2X8w.js} +2 -2
  325. package/dist/core/web/public/next/assets/{ActionMenu-B4-39f2S.js.map → ActionMenu-CIiX2X8w.js.map} +1 -1
  326. package/dist/core/web/public/next/assets/Advanced-DHsysoIL.js +2 -0
  327. package/dist/core/web/public/next/assets/{Advanced-B-LqYXvd.js.map → Advanced-DHsysoIL.js.map} +1 -1
  328. package/dist/core/web/public/next/assets/App-CMeAocmW.js +7 -0
  329. package/dist/core/web/public/next/assets/{App-E2zCDRxm.js.map → App-CMeAocmW.js.map} +1 -1
  330. package/dist/core/web/public/next/assets/AppsSection-DISYnMnc.js +2 -0
  331. package/dist/core/web/public/next/assets/{AppsSection-8wXPPhZb.js.map → AppsSection-DISYnMnc.js.map} +1 -1
  332. package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js +2 -0
  333. package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js.map +1 -0
  334. package/dist/core/web/public/next/assets/AutonomyOffState-CEPSZToP.js +3 -0
  335. package/dist/core/web/public/next/assets/AutonomyOffState-CEPSZToP.js.map +1 -0
  336. package/dist/core/web/public/next/assets/AutonomyOffState-CmSSTHVe.css +1 -0
  337. package/dist/core/web/public/next/assets/AutonomySection-DWc3ciAD.js +2 -0
  338. package/dist/core/web/public/next/assets/{AutonomySection-B46igJKR.js.map → AutonomySection-DWc3ciAD.js.map} +1 -1
  339. package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js +2 -0
  340. package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js.map +1 -0
  341. package/dist/core/web/public/next/assets/{BranchBar-BRkrEQGs.js → BranchBar-BxhdiIpx.js} +2 -2
  342. package/dist/core/web/public/next/assets/{BranchBar-BRkrEQGs.js.map → BranchBar-BxhdiIpx.js.map} +1 -1
  343. package/dist/core/web/public/next/assets/BudgetControl-C-0KhjRS.js +2 -0
  344. package/dist/core/web/public/next/assets/BudgetControl-C-0KhjRS.js.map +1 -0
  345. package/dist/core/web/public/next/assets/{Button-BhO-WKPp.js → Button-D90dzI_o.js} +2 -2
  346. package/dist/core/web/public/next/assets/{Button-BhO-WKPp.js.map → Button-D90dzI_o.js.map} +1 -1
  347. package/dist/core/web/public/next/assets/{CapacityStrip-CkFz5vq2.js → CapacityStrip-qKDBC65C.js} +2 -2
  348. package/dist/core/web/public/next/assets/{CapacityStrip-CkFz5vq2.js.map → CapacityStrip-qKDBC65C.js.map} +1 -1
  349. package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js +2 -0
  350. package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js.map +1 -0
  351. package/dist/core/web/public/next/assets/ChartFrame-DyjmyV8N.css +1 -0
  352. package/dist/core/web/public/next/assets/ChatSection-DlT4QU6a.js +3 -0
  353. package/dist/core/web/public/next/assets/ChatSection-DlT4QU6a.js.map +1 -0
  354. package/dist/core/web/public/next/assets/{CloudBudgetForm-Bd91iStN.js → CloudBudgetForm-BrNun_Yu.js} +2 -2
  355. package/dist/core/web/public/next/assets/{CloudBudgetForm-Bd91iStN.js.map → CloudBudgetForm-BrNun_Yu.js.map} +1 -1
  356. package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js +2 -0
  357. package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js.map +1 -0
  358. package/dist/core/web/public/next/assets/CommandSection-B0xuU-yZ.css +1 -0
  359. package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js +3 -0
  360. package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js.map +1 -0
  361. package/dist/core/web/public/next/assets/{ConfirmDialog-Bv4hdK2T.js → ConfirmDialog-BR4nZQ2D.js} +2 -2
  362. package/dist/core/web/public/next/assets/{ConfirmDialog-Bv4hdK2T.js.map → ConfirmDialog-BR4nZQ2D.js.map} +1 -1
  363. package/dist/core/web/public/next/assets/{DeleteChatDialog-CH1Ix8Eh.js → DeleteChatDialog-BCfP12GH.js} +2 -2
  364. package/dist/core/web/public/next/assets/{DeleteChatDialog-CH1Ix8Eh.js.map → DeleteChatDialog-BCfP12GH.js.map} +1 -1
  365. package/dist/core/web/public/next/assets/{Dialog-BSsIFNqD.js → Dialog-D3msQlCj.js} +2 -2
  366. package/dist/core/web/public/next/assets/{Dialog-BSsIFNqD.js.map → Dialog-D3msQlCj.js.map} +1 -1
  367. package/dist/core/web/public/next/assets/{DiffPane-BpNuJmth.js → DiffPane-Ix6hvXlY.js} +2 -2
  368. package/dist/core/web/public/next/assets/{DiffPane-BpNuJmth.js.map → DiffPane-Ix6hvXlY.js.map} +1 -1
  369. package/dist/core/web/public/next/assets/{DiffViewer-CJarUvs0.js → DiffViewer-C4WKsCIe.js} +2 -2
  370. package/dist/core/web/public/next/assets/{DiffViewer-CJarUvs0.js.map → DiffViewer-C4WKsCIe.js.map} +1 -1
  371. package/dist/core/web/public/next/assets/DockHost-aWP7liri.js +2 -0
  372. package/dist/core/web/public/next/assets/{DockHost-DW9q0NdR.js.map → DockHost-aWP7liri.js.map} +1 -1
  373. package/dist/core/web/public/next/assets/{EmptyState-DPrd2aak.js → EmptyState-D2IRy3Cg.js} +2 -2
  374. package/dist/core/web/public/next/assets/{EmptyState-DPrd2aak.js.map → EmptyState-D2IRy3Cg.js.map} +1 -1
  375. package/dist/core/web/public/next/assets/{Epistemic-D7MxSmED.js → Epistemic-DMr18muX.js} +2 -2
  376. package/dist/core/web/public/next/assets/{Epistemic-D7MxSmED.js.map → Epistemic-DMr18muX.js.map} +1 -1
  377. package/dist/core/web/public/next/assets/EvidenceTimeline-DXmmz6Fi.js +2 -0
  378. package/dist/core/web/public/next/assets/EvidenceTimeline-DXmmz6Fi.js.map +1 -0
  379. package/dist/core/web/public/next/assets/EvidenceTimeline-PBDAiSuG.css +1 -0
  380. package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js +3 -0
  381. package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js.map +1 -0
  382. package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js +2 -0
  383. package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js.map +1 -0
  384. package/dist/core/web/public/next/assets/{GearTray-CIPtzeIx.js → GearTray-Dt-ee32-.js} +2 -2
  385. package/dist/core/web/public/next/assets/{GearTray-CIPtzeIx.js.map → GearTray-Dt-ee32-.js.map} +1 -1
  386. package/dist/core/web/public/next/assets/GrowthSection-P9EUfGeA.js +2 -0
  387. package/dist/core/web/public/next/assets/{GrowthSection-iiQg6wvK.js.map → GrowthSection-P9EUfGeA.js.map} +1 -1
  388. package/dist/core/web/public/next/assets/{HandoffDialog-DrQ6ofuy.js → HandoffDialog-CLJQLe7M.js} +2 -2
  389. package/dist/core/web/public/next/assets/{HandoffDialog-DrQ6ofuy.js.map → HandoffDialog-CLJQLe7M.js.map} +1 -1
  390. package/dist/core/web/public/next/assets/{Input-C0MQxEM6.js → Input-D_KRJA9V.js} +2 -2
  391. package/dist/core/web/public/next/assets/{Input-C0MQxEM6.js.map → Input-D_KRJA9V.js.map} +1 -1
  392. package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js +2 -0
  393. package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js.map +1 -0
  394. package/dist/core/web/public/next/assets/LeaderCard-DNsbLwY3.css +1 -0
  395. package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js +2 -0
  396. package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js.map +1 -0
  397. package/dist/core/web/public/next/assets/LeaderConversation-DPHUTq6W.css +1 -0
  398. package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js +2 -0
  399. package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js.map +1 -0
  400. package/dist/core/web/public/next/assets/McpSection-DGbRcyv8.js +2 -0
  401. package/dist/core/web/public/next/assets/{McpSection-BRuCcTjT.js.map → McpSection-DGbRcyv8.js.map} +1 -1
  402. package/dist/core/web/public/next/assets/{MessageMarkdown-bRvD5nSc.js → MessageMarkdown-DFvk06qG.js} +3 -3
  403. package/dist/core/web/public/next/assets/{MessageMarkdown-bRvD5nSc.js.map → MessageMarkdown-DFvk06qG.js.map} +1 -1
  404. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-FjjkPKA2.js → MessageMarkdownRenderer-BAv4oEUf.js} +2 -2
  405. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-FjjkPKA2.js.map → MessageMarkdownRenderer-BAv4oEUf.js.map} +1 -1
  406. package/dist/core/web/public/next/assets/{Meter-CFNLpwA-.js → Meter-CMj-VafN.js} +2 -2
  407. package/dist/core/web/public/next/assets/{Meter-CFNLpwA-.js.map → Meter-CMj-VafN.js.map} +1 -1
  408. package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js +3 -0
  409. package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js.map +1 -0
  410. package/dist/core/web/public/next/assets/{MutationTokenDialog-T7gv3a9r.js → MutationTokenDialog-DbnO8aYi.js} +2 -2
  411. package/dist/core/web/public/next/assets/{MutationTokenDialog-T7gv3a9r.js.map → MutationTokenDialog-DbnO8aYi.js.map} +1 -1
  412. package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js +3 -0
  413. package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js.map +1 -0
  414. package/dist/core/web/public/next/assets/NeedsYouList-CCsijdWt.js +2 -0
  415. package/dist/core/web/public/next/assets/{NeedsYouList-BgH8ezqf.js.map → NeedsYouList-CCsijdWt.js.map} +1 -1
  416. package/dist/core/web/public/next/assets/NeedsYouList-CH6Mq-E_.css +1 -0
  417. package/dist/core/web/public/next/assets/NewChatDialog-BlCHtOIr.js +3 -0
  418. package/dist/core/web/public/next/assets/{NewChatDialog-Db5Xjrk8.js.map → NewChatDialog-BlCHtOIr.js.map} +1 -1
  419. package/dist/core/web/public/next/assets/OnboardingFlow-Cy9BA9eR.js +3 -0
  420. package/dist/core/web/public/next/assets/OnboardingFlow-Cy9BA9eR.js.map +1 -0
  421. package/dist/core/web/public/next/assets/OnboardingGate-BXpNFoLt.js +3 -0
  422. package/dist/core/web/public/next/assets/{OnboardingGate-C4VXn7BJ.js.map → OnboardingGate-BXpNFoLt.js.map} +1 -1
  423. package/dist/core/web/public/next/assets/PreviewPane-COid5A0f.js +2 -0
  424. package/dist/core/web/public/next/assets/{PreviewPane-BPBbcROb.js.map → PreviewPane-COid5A0f.js.map} +1 -1
  425. package/dist/core/web/public/next/assets/{ProviderLogo-CT2cSfkg.js → ProviderLogo-Cq-CYIwT.js} +2 -2
  426. package/dist/core/web/public/next/assets/{ProviderLogo-CT2cSfkg.js.map → ProviderLogo-Cq-CYIwT.js.map} +1 -1
  427. package/dist/core/web/public/next/assets/{RailStatus-Vgl0GYtd.js → RailStatus-Co5UB6We.js} +2 -2
  428. package/dist/core/web/public/next/assets/{RailStatus-Vgl0GYtd.js.map → RailStatus-Co5UB6We.js.map} +1 -1
  429. package/dist/core/web/public/next/assets/{RefreshIndicator-CSyqpY_q.js → RefreshIndicator-DO9ibnSq.js} +2 -2
  430. package/dist/core/web/public/next/assets/{RefreshIndicator-CSyqpY_q.js.map → RefreshIndicator-DO9ibnSq.js.map} +1 -1
  431. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-Dr2WRgkq.js +7 -0
  432. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BX2nkdmZ.js.map → ResourcePoolConsoleApp-Dr2WRgkq.js.map} +1 -1
  433. package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js +3 -0
  434. package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js.map +1 -0
  435. package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js +2 -0
  436. package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js.map +1 -0
  437. package/dist/core/web/public/next/assets/ResourcesDrawer-DrGoO8KG.css +1 -0
  438. package/dist/core/web/public/next/assets/{RouteErrorBoundary-BaC7YVzR.js → RouteErrorBoundary-SkNhhUbt.js} +2 -2
  439. package/dist/core/web/public/next/assets/{RouteErrorBoundary-BaC7YVzR.js.map → RouteErrorBoundary-SkNhhUbt.js.map} +1 -1
  440. package/dist/core/web/public/next/assets/{RunInCloudAction-D5PDHJPE.js → RunInCloudAction-BXPlZwJQ.js} +2 -2
  441. package/dist/core/web/public/next/assets/{RunInCloudAction-D5PDHJPE.js.map → RunInCloudAction-BXPlZwJQ.js.map} +1 -1
  442. package/dist/core/web/public/next/assets/{SeatSelector-Cg75LInq.js → SeatSelector-J5R3zDkB.js} +3 -3
  443. package/dist/core/web/public/next/assets/{SeatSelector-Cg75LInq.js.map → SeatSelector-J5R3zDkB.js.map} +1 -1
  444. package/dist/core/web/public/next/assets/{Segmented-CametjLt.js → Segmented-CGh_-tBb.js} +2 -2
  445. package/dist/core/web/public/next/assets/{Segmented-CametjLt.js.map → Segmented-CGh_-tBb.js.map} +1 -1
  446. package/dist/core/web/public/next/assets/{Select-De52fghU.js → Select-CWnmUzs3.js} +2 -2
  447. package/dist/core/web/public/next/assets/{Select-De52fghU.js.map → Select-CWnmUzs3.js.map} +1 -1
  448. package/dist/core/web/public/next/assets/{SessionGate-CzlcNq3O.js → SessionGate-sp4KsnUo.js} +2 -2
  449. package/dist/core/web/public/next/assets/{SessionGate-CzlcNq3O.js.map → SessionGate-sp4KsnUo.js.map} +1 -1
  450. package/dist/core/web/public/next/assets/{SessionInsightChip-Bk_Owa7u.js → SessionInsightChip-DLFAzdbi.js} +2 -2
  451. package/dist/core/web/public/next/assets/{SessionInsightChip-Bk_Owa7u.js.map → SessionInsightChip-DLFAzdbi.js.map} +1 -1
  452. package/dist/core/web/public/next/assets/{SessionSearch-C6C8DHN8.js → SessionSearch-DbFjwR1h.js} +2 -2
  453. package/dist/core/web/public/next/assets/{SessionSearch-C6C8DHN8.js.map → SessionSearch-DbFjwR1h.js.map} +1 -1
  454. package/dist/core/web/public/next/assets/{SettingsSection-mI9wQYZg.js → SettingsSection-Ch23msJ5.js} +2 -2
  455. package/dist/core/web/public/next/assets/SettingsSection-Ch23msJ5.js.map +1 -0
  456. package/dist/core/web/public/next/assets/SetupChecklist-Bd76MBAR.js +2 -0
  457. package/dist/core/web/public/next/assets/SetupChecklist-Bd76MBAR.js.map +1 -0
  458. package/dist/core/web/public/next/assets/SetupChecklist-BhZpFLsj.css +1 -0
  459. package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js +3 -0
  460. package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js.map +1 -0
  461. package/dist/core/web/public/next/assets/{Sheet-CJhK9Dqv.js → Sheet-BZ2AG4Eo.js} +2 -2
  462. package/dist/core/web/public/next/assets/{Sheet-CJhK9Dqv.js.map → Sheet-BZ2AG4Eo.js.map} +1 -1
  463. package/dist/core/web/public/next/assets/{ShortcutsOverlay-DDW-i9Fc.js → ShortcutsOverlay-C8n8y3zf.js} +2 -2
  464. package/dist/core/web/public/next/assets/{ShortcutsOverlay-DDW-i9Fc.js.map → ShortcutsOverlay-C8n8y3zf.js.map} +1 -1
  465. package/dist/core/web/public/next/assets/Sidebar-DN--cPYN.js +3 -0
  466. package/dist/core/web/public/next/assets/Sidebar-DN--cPYN.js.map +1 -0
  467. package/dist/core/web/public/next/assets/{Slider-Bwd9HfXl.js → Slider-KVoJLDD6.js} +2 -2
  468. package/dist/core/web/public/next/assets/{Slider-Bwd9HfXl.js.map → Slider-KVoJLDD6.js.map} +1 -1
  469. package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js +2 -0
  470. package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js.map +1 -0
  471. package/dist/core/web/public/next/assets/StatTile-CNCqDoPO.css +1 -0
  472. package/dist/core/web/public/next/assets/{StatusBadge-DHKRtttH.js → StatusBadge-CXsYqmdU.js} +2 -2
  473. package/dist/core/web/public/next/assets/{StatusBadge-DHKRtttH.js.map → StatusBadge-CXsYqmdU.js.map} +1 -1
  474. package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js +2 -0
  475. package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js.map +1 -0
  476. package/dist/core/web/public/next/assets/{Surface-D--LXgQm.js → Surface-BfDmQcKe.js} +2 -2
  477. package/dist/core/web/public/next/assets/{Surface-D--LXgQm.js.map → Surface-BfDmQcKe.js.map} +1 -1
  478. package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js +2 -0
  479. package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js.map +1 -0
  480. package/dist/core/web/public/next/assets/Swimlane-Bf4Rjoy9.css +1 -0
  481. package/dist/core/web/public/next/assets/{Switch-PMixU6b0.js → Switch-9NtO_6Lj.js} +2 -2
  482. package/dist/core/web/public/next/assets/{Switch-PMixU6b0.js.map → Switch-9NtO_6Lj.js.map} +1 -1
  483. package/dist/core/web/public/next/assets/{Tag-fordBsrJ.js → Tag-DscCRFcN.js} +2 -2
  484. package/dist/core/web/public/next/assets/{Tag-fordBsrJ.js.map → Tag-DscCRFcN.js.map} +1 -1
  485. package/dist/core/web/public/next/assets/{TerminalPane-BSnGdUuF.js → TerminalPane-B668-DJW.js} +5 -5
  486. package/dist/core/web/public/next/assets/{TerminalPane-BSnGdUuF.js.map → TerminalPane-B668-DJW.js.map} +1 -1
  487. package/dist/core/web/public/next/assets/UniverseConsoleApp-BUV_brY7.js +2 -0
  488. package/dist/core/web/public/next/assets/{UniverseConsoleApp-DtXFhAhw.js.map → UniverseConsoleApp-BUV_brY7.js.map} +1 -1
  489. package/dist/core/web/public/next/assets/{UniverseView-sWm3pnTW.js → UniverseView-DG70zH0W.js} +4 -4
  490. package/dist/core/web/public/next/assets/{UniverseView-sWm3pnTW.js.map → UniverseView-DG70zH0W.js.map} +1 -1
  491. package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js +3 -0
  492. package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js.map +1 -0
  493. package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js +3 -0
  494. package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js.map +1 -0
  495. package/dist/core/web/public/next/assets/Workspace-D1nP9BhD.js +10 -0
  496. package/dist/core/web/public/next/assets/{Workspace-BQSZFSeO.js.map → Workspace-D1nP9BhD.js.map} +1 -1
  497. package/dist/core/web/public/next/assets/actions-CY-PjpGc.js +2 -0
  498. package/dist/core/web/public/next/assets/{actions-Ci6I4C0l.js.map → actions-CY-PjpGc.js.map} +1 -1
  499. package/dist/core/web/public/next/assets/actions-DkWhhWIg.css +1 -0
  500. package/dist/core/web/public/next/assets/{apps-model-DlwnfqwJ.js → apps-model-Du02KhAf.js} +2 -2
  501. package/dist/core/web/public/next/assets/{apps-model-DlwnfqwJ.js.map → apps-model-Du02KhAf.js.map} +1 -1
  502. package/dist/core/web/public/next/assets/{authority-model-BFuPezSo.js → authority-model-79SeuKlJ.js} +2 -2
  503. package/dist/core/web/public/next/assets/{authority-model-BFuPezSo.js.map → authority-model-79SeuKlJ.js.map} +1 -1
  504. package/dist/core/web/public/next/assets/autonomy-ladder-BGWmZzP7.css +1 -0
  505. package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js +2 -0
  506. package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js.map +1 -0
  507. package/dist/core/web/public/next/assets/budget-queries-D8QV5XtH.js +2 -0
  508. package/dist/core/web/public/next/assets/{budget-queries-DsAjH8ac.js.map → budget-queries-D8QV5XtH.js.map} +1 -1
  509. package/dist/core/web/public/next/assets/{capacity-strip-model-Dn1cNOhz.js → capacity-strip-model-BwZ1ZbkU.js} +2 -2
  510. package/dist/core/web/public/next/assets/{capacity-strip-model-Dn1cNOhz.js.map → capacity-strip-model-BwZ1ZbkU.js.map} +1 -1
  511. package/dist/core/web/public/next/assets/charts-BZ50mZD_.js +2 -0
  512. package/dist/core/web/public/next/assets/charts-BZ50mZD_.js.map +1 -0
  513. package/dist/core/web/public/next/assets/charts-ClCB18la.css +1 -0
  514. package/dist/core/web/public/next/assets/cloud-model-BDivRMqv.js +2 -0
  515. package/dist/core/web/public/next/assets/{cloud-model-CX407gPY.js.map → cloud-model-BDivRMqv.js.map} +1 -1
  516. package/dist/core/web/public/next/assets/{cloud-queries-QAhpExlz.js → cloud-queries-BPQQ5_pJ.js} +2 -2
  517. package/dist/core/web/public/next/assets/{cloud-queries-QAhpExlz.js.map → cloud-queries-BPQQ5_pJ.js.map} +1 -1
  518. package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js → colors-DvK0wMHH.js} +2 -2
  519. package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js.map → colors-DvK0wMHH.js.map} +1 -1
  520. package/dist/core/web/public/next/assets/{command-catalog-CF0cQQac.js → command-catalog-BIntSa9l.js} +2 -2
  521. package/dist/core/web/public/next/assets/command-catalog-BIntSa9l.js.map +1 -0
  522. package/dist/core/web/public/next/assets/{context-model-Co4wh3SM.js → context-model-Br8t9jgG.js} +2 -2
  523. package/dist/core/web/public/next/assets/{context-model-Co4wh3SM.js.map → context-model-Br8t9jgG.js.map} +1 -1
  524. package/dist/core/web/public/next/assets/{context-model-DV1zCfAm.js → context-model-CokrgEUq.js} +3 -3
  525. package/dist/core/web/public/next/assets/{context-model-DV1zCfAm.js.map → context-model-CokrgEUq.js.map} +1 -1
  526. package/dist/core/web/public/next/assets/context-queries-eL3caKVG.js +2 -0
  527. package/dist/core/web/public/next/assets/{context-queries-CktFQqSS.js.map → context-queries-eL3caKVG.js.map} +1 -1
  528. package/dist/core/web/public/next/assets/{control-queries-DAvlh_YM.js → control-queries-B9K-wmcB.js} +2 -2
  529. package/dist/core/web/public/next/assets/{control-queries-DAvlh_YM.js.map → control-queries-B9K-wmcB.js.map} +1 -1
  530. package/dist/core/web/public/next/assets/copy-setup-XMgCC5f8.js +2 -0
  531. package/dist/core/web/public/next/assets/copy-setup-XMgCC5f8.js.map +1 -0
  532. package/dist/core/web/public/next/assets/{dock-icons-BFuBbqJl.js → dock-icons-BJ6ZqB2t.js} +2 -2
  533. package/dist/core/web/public/next/assets/{dock-icons-BFuBbqJl.js.map → dock-icons-BJ6ZqB2t.js.map} +1 -1
  534. package/dist/core/web/public/next/assets/{fleet-model-Dfd5JyLR.js → fleet-model-BvDR3gjp.js} +2 -2
  535. package/dist/core/web/public/next/assets/{fleet-model-Dfd5JyLR.js.map → fleet-model-BvDR3gjp.js.map} +1 -1
  536. package/dist/core/web/public/next/assets/{fleet-queries-RtMTd5rR.js → fleet-queries-W2UFVMZJ.js} +2 -2
  537. package/dist/core/web/public/next/assets/{fleet-queries-RtMTd5rR.js.map → fleet-queries-W2UFVMZJ.js.map} +1 -1
  538. package/dist/core/web/public/next/assets/{focus-trap-BdrbWfC4.js → focus-trap-CtI1SlMX.js} +2 -2
  539. package/dist/core/web/public/next/assets/{focus-trap-BdrbWfC4.js.map → focus-trap-CtI1SlMX.js.map} +1 -1
  540. package/dist/core/web/public/next/assets/format-CH4g_sl1.js +2 -0
  541. package/dist/core/web/public/next/assets/format-CH4g_sl1.js.map +1 -0
  542. package/dist/core/web/public/next/assets/{format-DKrNjdwD.js → format-D7nBg2bn.js} +2 -2
  543. package/dist/core/web/public/next/assets/{format-DKrNjdwD.js.map → format-D7nBg2bn.js.map} +1 -1
  544. package/dist/core/web/public/next/assets/{git-model-_BnI_Ogh.js → git-model-Dnkd1TnK.js} +2 -2
  545. package/dist/core/web/public/next/assets/{git-model-_BnI_Ogh.js.map → git-model-Dnkd1TnK.js.map} +1 -1
  546. package/dist/core/web/public/next/assets/global-CMNW_dqn.js +2 -0
  547. package/dist/core/web/public/next/assets/{global-CNNGMril.js.map → global-CMNW_dqn.js.map} +1 -1
  548. package/dist/core/web/public/next/assets/guarded-runners-YeAc9wLQ.js +2 -0
  549. package/dist/core/web/public/next/assets/{guarded-runners-DPh2d32e.js.map → guarded-runners-YeAc9wLQ.js.map} +1 -1
  550. package/dist/core/web/public/next/assets/{icons-0haWy6nh.js → icons-D1sYbCTQ.js} +2 -2
  551. package/dist/core/web/public/next/assets/{icons-0haWy6nh.js.map → icons-D1sYbCTQ.js.map} +1 -1
  552. package/dist/core/web/public/next/assets/{index-QesfXBsb.js → index-DZ-UQ7v8.js} +3 -3
  553. package/dist/core/web/public/next/assets/{index-QesfXBsb.js.map → index-DZ-UQ7v8.js.map} +1 -1
  554. package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js +2 -0
  555. package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js.map +1 -0
  556. package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js +2 -0
  557. package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js.map +1 -0
  558. package/dist/core/web/public/next/assets/{live-model-De-q0ZFK.js → live-model-D_32RAOR.js} +2 -2
  559. package/dist/core/web/public/next/assets/live-model-D_32RAOR.js.map +1 -0
  560. package/dist/core/web/public/next/assets/{mind.module-BrK2nFOL.js → mind.module-7hA92hRg.js} +2 -2
  561. package/dist/core/web/public/next/assets/{mind.module-BrK2nFOL.js.map → mind.module-7hA92hRg.js.map} +1 -1
  562. package/dist/core/web/public/next/assets/mutations-DQPbFdRJ.js +2 -0
  563. package/dist/core/web/public/next/assets/{mutations-DTCtKCn_.js.map → mutations-DQPbFdRJ.js.map} +1 -1
  564. package/dist/core/web/public/next/assets/{nav-KmGX0CVz.js → nav-0dOYe2rJ.js} +2 -2
  565. package/dist/core/web/public/next/assets/{nav-KmGX0CVz.js.map → nav-0dOYe2rJ.js.map} +1 -1
  566. package/dist/core/web/public/next/assets/{overnight-queries-mlO0xzsr.js → overnight-queries-C4wOnFtE.js} +2 -2
  567. package/dist/core/web/public/next/assets/{overnight-queries-mlO0xzsr.js.map → overnight-queries-C4wOnFtE.js.map} +1 -1
  568. package/dist/core/web/public/next/assets/primitives-2A5Eq8FQ.js +1 -0
  569. package/dist/core/web/public/next/assets/{queries-CyBE8nsW.js → queries-BTXWdZzU.js} +2 -2
  570. package/dist/core/web/public/next/assets/{queries-CyBE8nsW.js.map → queries-BTXWdZzU.js.map} +1 -1
  571. package/dist/core/web/public/next/assets/{reasoning-pref-CaoA4_Vl.js → reasoning-pref-Ca6lN6x_.js} +2 -2
  572. package/dist/core/web/public/next/assets/{reasoning-pref-CaoA4_Vl.js.map → reasoning-pref-Ca6lN6x_.js.map} +1 -1
  573. package/dist/core/web/public/next/assets/{reveal-anchor-BP1VqnPU.js → reveal-anchor-DfNLgK_I.js} +2 -2
  574. package/dist/core/web/public/next/assets/{reveal-anchor-BP1VqnPU.js.map → reveal-anchor-DfNLgK_I.js.map} +1 -1
  575. package/dist/core/web/public/next/assets/seat-subscription-C5uPHBsN.js +2 -0
  576. package/dist/core/web/public/next/assets/{seat-subscription-C5Tvr0WQ.js.map → seat-subscription-C5uPHBsN.js.map} +1 -1
  577. package/dist/core/web/public/next/assets/{sidebar-model-B5Qk95k_.js → sidebar-model-CLCdqwkR.js} +2 -2
  578. package/dist/core/web/public/next/assets/{sidebar-model-B5Qk95k_.js.map → sidebar-model-CLCdqwkR.js.map} +1 -1
  579. package/dist/core/web/public/next/assets/{slots-DHKQDoE6.js → slots-C-qBeu-8.js} +3 -3
  580. package/dist/core/web/public/next/assets/{slots-DHKQDoE6.js.map → slots-C-qBeu-8.js.map} +1 -1
  581. package/dist/core/web/public/next/assets/{surface-data-CchClvHo.js → surface-data-Dj71tdD-.js} +2 -2
  582. package/dist/core/web/public/next/assets/{surface-data-CchClvHo.js.map → surface-data-Dj71tdD-.js.map} +1 -1
  583. package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js +2 -0
  584. package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js.map +1 -0
  585. package/dist/core/web/public/next/assets/{tasks-model-D6WFVULI.js → tasks-model-O8yR5YXp.js} +2 -2
  586. package/dist/core/web/public/next/assets/{tasks-model-D6WFVULI.js.map → tasks-model-O8yR5YXp.js.map} +1 -1
  587. package/dist/core/web/public/next/assets/{terminal-icons-BvCvuXk2.js → terminal-icons-CoRZq9iO.js} +2 -2
  588. package/dist/core/web/public/next/assets/{terminal-icons-BvCvuXk2.js.map → terminal-icons-CoRZq9iO.js.map} +1 -1
  589. package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js +2 -0
  590. package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js.map +1 -0
  591. package/dist/core/web/public/next/assets/types-IYKrYLku.js +2 -0
  592. package/dist/core/web/public/next/assets/types-IYKrYLku.js.map +1 -0
  593. package/dist/core/web/public/next/assets/{usage-queries-D1SU1t7r.js → usage-queries-AdjEyEtn.js} +2 -2
  594. package/dist/core/web/public/next/assets/{usage-queries-D1SU1t7r.js.map → usage-queries-AdjEyEtn.js.map} +1 -1
  595. package/dist/core/web/public/next/assets/{use-guarded-action-BZmBv7CJ.js → use-guarded-action-CuuMHeDX.js} +2 -2
  596. package/dist/core/web/public/next/assets/{use-guarded-action-BZmBv7CJ.js.map → use-guarded-action-CuuMHeDX.js.map} +1 -1
  597. package/dist/core/web/public/next/assets/{use-ticker-CkJ4-0wU.js → use-ticker-BBcp02SZ.js} +2 -2
  598. package/dist/core/web/public/next/assets/{use-ticker-CkJ4-0wU.js.map → use-ticker-BBcp02SZ.js.map} +1 -1
  599. package/dist/core/web/public/next/assets/{use-token-gate-CYcfk_GS.js → use-token-gate-CbXVYQYI.js} +2 -2
  600. package/dist/core/web/public/next/assets/{use-token-gate-CYcfk_GS.js.map → use-token-gate-CbXVYQYI.js.map} +1 -1
  601. package/dist/core/web/public/next/assets/{useOnboarding-CujRS6PK.js → useOnboarding-C_Fpe_sH.js} +2 -2
  602. package/dist/core/web/public/next/assets/{useOnboarding-CujRS6PK.js.map → useOnboarding-C_Fpe_sH.js.map} +1 -1
  603. package/dist/core/web/public/next/assets/{useSeatsRefresh-BEaQdkZs.js → useSeatsRefresh-Co1CnxLc.js} +2 -2
  604. package/dist/core/web/public/next/assets/{useSeatsRefresh-BEaQdkZs.js.map → useSeatsRefresh-Co1CnxLc.js.map} +1 -1
  605. package/dist/core/web/public/next/assets/{useVerseTranscript-BQ0J6Xhx.js → useVerseTranscript-DgbigUlV.js} +2 -2
  606. package/dist/core/web/public/next/assets/{useVerseTranscript-BQ0J6Xhx.js.map → useVerseTranscript-DgbigUlV.js.map} +1 -1
  607. package/dist/core/web/public/next/assets/{verse-icons-DndgEgKS.js → verse-icons-S56hIiXS.js} +2 -2
  608. package/dist/core/web/public/next/assets/{verse-icons-DndgEgKS.js.map → verse-icons-S56hIiXS.js.map} +1 -1
  609. package/dist/core/web/public/next/assets/verse-model-DAVevkNe.js +2 -0
  610. package/dist/core/web/public/next/assets/{verse-model-MMySehjj.js.map → verse-model-DAVevkNe.js.map} +1 -1
  611. package/dist/core/web/public/next/assets/{warmup-CNEH_-be.js → warmup-B_RAtNZ_.js} +3 -3
  612. package/dist/core/web/public/next/assets/{warmup-CNEH_-be.js.map → warmup-B_RAtNZ_.js.map} +1 -1
  613. package/dist/core/web/public/next/assets/why-seat-model-M_r0wX3b.js +2 -0
  614. package/dist/core/web/public/next/assets/why-seat-model-M_r0wX3b.js.map +1 -0
  615. package/dist/core/web/public/next/assets/{workspace-model-Dukb2wwv.js → workspace-model-dji5-Al3.js} +2 -2
  616. package/dist/core/web/public/next/assets/{workspace-model-Dukb2wwv.js.map → workspace-model-dji5-Al3.js.map} +1 -1
  617. package/dist/core/web/public/next/index.html +1 -1
  618. package/dist/core/web/read-projection-worker.js +2 -1
  619. package/dist/core/web/read-projection-worker.js.map +1 -1
  620. package/dist/core/web/read-projections.d.ts +3 -0
  621. package/dist/core/web/read-projections.js +2 -2
  622. package/dist/core/web/read-projections.js.map +1 -1
  623. package/dist/core/web/visibility.js +3 -4
  624. package/dist/core/web/visibility.js.map +1 -1
  625. package/dist/release-dependency-inventory.json +1 -1
  626. package/docs/AUTONOMY-GAP.md +1 -1
  627. package/package.json +3 -2
  628. package/dist/core/web/public/next/assets/Advanced-B-LqYXvd.js +0 -2
  629. package/dist/core/web/public/next/assets/App-E2zCDRxm.js +0 -7
  630. package/dist/core/web/public/next/assets/AppsSection-8wXPPhZb.js +0 -2
  631. package/dist/core/web/public/next/assets/AreaTrend-BFimExYn.js +0 -2
  632. package/dist/core/web/public/next/assets/AreaTrend-BFimExYn.js.map +0 -1
  633. package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js +0 -2
  634. package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js.map +0 -1
  635. package/dist/core/web/public/next/assets/AutonomyOffState-DmbE71vI.css +0 -1
  636. package/dist/core/web/public/next/assets/AutonomySection-B46igJKR.js +0 -2
  637. package/dist/core/web/public/next/assets/BudgetControl-T_RjPrw9.js +0 -2
  638. package/dist/core/web/public/next/assets/BudgetControl-T_RjPrw9.js.map +0 -1
  639. package/dist/core/web/public/next/assets/ChartFrame-BVuBe6RP.css +0 -1
  640. package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js +0 -2
  641. package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js.map +0 -1
  642. package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js +0 -3
  643. package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js.map +0 -1
  644. package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js +0 -2
  645. package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js.map +0 -1
  646. package/dist/core/web/public/next/assets/CommandSection-CvAVd1w4.css +0 -1
  647. package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js +0 -2
  648. package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js.map +0 -1
  649. package/dist/core/web/public/next/assets/DockHost-DW9q0NdR.js +0 -2
  650. package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js +0 -3
  651. package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js.map +0 -1
  652. package/dist/core/web/public/next/assets/Funnel-BeNQZWv2.js +0 -2
  653. package/dist/core/web/public/next/assets/Funnel-BeNQZWv2.js.map +0 -1
  654. package/dist/core/web/public/next/assets/GrowthSection-iiQg6wvK.js +0 -2
  655. package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js +0 -2
  656. package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js.map +0 -1
  657. package/dist/core/web/public/next/assets/MatrixHeatmap-DZvZeWXL.js +0 -2
  658. package/dist/core/web/public/next/assets/MatrixHeatmap-DZvZeWXL.js.map +0 -1
  659. package/dist/core/web/public/next/assets/McpSection-BRuCcTjT.js +0 -2
  660. package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js +0 -2
  661. package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js.map +0 -1
  662. package/dist/core/web/public/next/assets/NeedsYouDrawer-lYN4G_aM.js +0 -2
  663. package/dist/core/web/public/next/assets/NeedsYouDrawer-lYN4G_aM.js.map +0 -1
  664. package/dist/core/web/public/next/assets/NeedsYouList-BgH8ezqf.js +0 -2
  665. package/dist/core/web/public/next/assets/NeedsYouList-CruOt4JT.css +0 -1
  666. package/dist/core/web/public/next/assets/NewChatDialog-Db5Xjrk8.js +0 -3
  667. package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js +0 -2
  668. package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js.map +0 -1
  669. package/dist/core/web/public/next/assets/OnboardingGate-C4VXn7BJ.js +0 -3
  670. package/dist/core/web/public/next/assets/PreviewPane-BPBbcROb.js +0 -2
  671. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-BX2nkdmZ.js +0 -7
  672. package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js +0 -3
  673. package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js.map +0 -1
  674. package/dist/core/web/public/next/assets/ResourcesDrawer-BCFJ2Uq8.css +0 -1
  675. package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js +0 -2
  676. package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js.map +0 -1
  677. package/dist/core/web/public/next/assets/SettingsSection-mI9wQYZg.js.map +0 -1
  678. package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js +0 -3
  679. package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js.map +0 -1
  680. package/dist/core/web/public/next/assets/StatTile-BuLMsJMx.css +0 -1
  681. package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js +0 -2
  682. package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js.map +0 -1
  683. package/dist/core/web/public/next/assets/StepBand-DQykLkk_.js +0 -2
  684. package/dist/core/web/public/next/assets/StepBand-DQykLkk_.js.map +0 -1
  685. package/dist/core/web/public/next/assets/Swimlane-BzH6OCee.js +0 -2
  686. package/dist/core/web/public/next/assets/Swimlane-BzH6OCee.js.map +0 -1
  687. package/dist/core/web/public/next/assets/Swimlane-o6_Zsrnr.css +0 -1
  688. package/dist/core/web/public/next/assets/UniverseConsoleApp-DtXFhAhw.js +0 -2
  689. package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js +0 -3
  690. package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js.map +0 -1
  691. package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js +0 -3
  692. package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js.map +0 -1
  693. package/dist/core/web/public/next/assets/Workspace-BQSZFSeO.js +0 -10
  694. package/dist/core/web/public/next/assets/actions-BmIf9avl.css +0 -1
  695. package/dist/core/web/public/next/assets/actions-Ci6I4C0l.js +0 -2
  696. package/dist/core/web/public/next/assets/budget-queries-DsAjH8ac.js +0 -2
  697. package/dist/core/web/public/next/assets/charts-C_xJbJiw.js +0 -2
  698. package/dist/core/web/public/next/assets/charts-C_xJbJiw.js.map +0 -1
  699. package/dist/core/web/public/next/assets/charts-DhKTrQLw.css +0 -1
  700. package/dist/core/web/public/next/assets/cloud-model-CX407gPY.js +0 -2
  701. package/dist/core/web/public/next/assets/command-catalog-CF0cQQac.js.map +0 -1
  702. package/dist/core/web/public/next/assets/context-queries-CktFQqSS.js +0 -2
  703. package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js +0 -2
  704. package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js.map +0 -1
  705. package/dist/core/web/public/next/assets/format-Dk4Fmxax.js +0 -2
  706. package/dist/core/web/public/next/assets/format-Dk4Fmxax.js.map +0 -1
  707. package/dist/core/web/public/next/assets/global-CNNGMril.js +0 -2
  708. package/dist/core/web/public/next/assets/guarded-runners-DPh2d32e.js +0 -2
  709. package/dist/core/web/public/next/assets/live-model-De-q0ZFK.js.map +0 -1
  710. package/dist/core/web/public/next/assets/mutations-DTCtKCn_.js +0 -2
  711. package/dist/core/web/public/next/assets/primitives-D0Fb3TtS.js +0 -1
  712. package/dist/core/web/public/next/assets/seat-subscription-C5Tvr0WQ.js +0 -2
  713. package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js +0 -2
  714. package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js.map +0 -1
  715. package/dist/core/web/public/next/assets/types-D5XOdyw8.js +0 -2
  716. package/dist/core/web/public/next/assets/types-D5XOdyw8.js.map +0 -1
  717. package/dist/core/web/public/next/assets/verse-model-MMySehjj.js +0 -2
  718. package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js +0 -2
  719. package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Input-C0MQxEM6.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/Input.module.css","../../../../../../src/web-ui/components/primitives/Input.tsx"],"sourcesContent":[".field {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n}\n\n.label {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n font-weight: var(--font-weight-medium);\n}\n\n.shell {\n display: flex;\n align-items: center;\n gap: var(--space-1);\n height: var(--density-row);\n padding: 0 var(--space-2);\n background: var(--bg-input);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n transition:\n border-color var(--duration-fast) var(--ease-standard),\n box-shadow var(--duration-fast) var(--ease-standard);\n}\n\n.sm {\n height: var(--density-row-sm);\n}\n\n.shell:hover:not(:has(.input:disabled)) {\n border-color: var(--border-strong);\n}\n\n/* The field's own focus ring: the inner <input> has no visible outline, so\n the shell carries it (and :focus-visible keeps it keyboard-only). */\n/* The system ring, not an --accent-100 wash: that token is pinned at 92%\n lightness in light and 22% in dark (tokens.css), so hue and saturation\n follow the operator's accent but LIGHTNESS never does — every preset and\n every slider position produced the same 1.34:1 / 1.15:1 near-invisible\n ring. --shadow-focus-ring is already the 2px-gap + 2px-accent shape\n DESIGN-V2 §6 asks for, and --border-focus is contrast-tested. */\n.shell:has(.input:focus-visible) {\n border-color: var(--border-focus);\n box-shadow: var(--shadow-focus-ring);\n}\n\n.invalid {\n border-color: var(--status-danger-solid);\n}\n\n.input {\n flex: 1;\n min-width: 0;\n height: 100%;\n border: none;\n background: none;\n color: var(--text-primary);\n font-family: var(--font-ui);\n font-size: var(--text-sm-size);\n}\n\n.input:focus,\n.input:focus-visible {\n outline: none;\n box-shadow: none;\n}\n\n.input::placeholder {\n color: var(--text-tertiary);\n}\n\n.input:disabled {\n color: var(--text-disabled);\n cursor: not-allowed;\n}\n\n.mono {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n}\n\n.prefix {\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n white-space: nowrap;\n}\n\n.hint {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n.error {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--status-danger-fg);\n}\n","/**\n * components/primitives/Input.tsx — single-line text/number entry.\n *\n * Nothing here is a default browser control: hairline border, no inner card,\n * accent on focus. The accessible name comes from `label` when the field\n * stands alone, or from the caller's own `aria-label`/`aria-labelledby` when\n * it sits in a two-column settings row whose label lives on the other side.\n * An `error` is announced via role=\"alert\" and wired with aria-describedby —\n * red text alone never carries the message (design doc §6).\n */\nimport { useId, type InputHTMLAttributes, type ReactNode } from 'react';\nimport styles from './Input.module.css';\n\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'className' | 'prefix'> {\n label?: ReactNode;\n /** Quiet helper text under the field. */\n hint?: ReactNode;\n /** Error message; also flips the field into its invalid styling. */\n error?: ReactNode;\n size?: 'sm' | 'md';\n /** Paths, ids, tokens counts — anything that should not be kerned. */\n mono?: boolean;\n /** Non-interactive leading text (e.g. \"$\", \"http://\"). Shadows the rarely\n * used HTML `prefix` attribute on purpose — this is the useful meaning. */\n prefix?: ReactNode;\n className?: string;\n}\n\nexport function Input({\n label,\n hint,\n error,\n size = 'md',\n mono = false,\n prefix,\n className,\n id,\n ...rest\n}: InputProps) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const hintId = `${inputId}-hint`;\n const errorId = `${inputId}-error`;\n const describedBy = [rest['aria-describedby'], hint ? hintId : null, error ? errorId : null]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={`${styles.field} ${className ?? ''}`}>\n {label ? (\n <label className={styles.label} htmlFor={inputId}>\n {label}\n </label>\n ) : null}\n <div className={`${styles.shell} ${styles[size]} ${error ? styles.invalid : ''}`}>\n {prefix ? <span className={styles.prefix}>{prefix}</span> : null}\n <input\n {...rest}\n id={inputId}\n className={`${styles.input} ${mono ? styles.mono : ''}`}\n aria-invalid={error ? true : rest['aria-invalid']}\n aria-describedby={describedBy || undefined}\n />\n </div>\n {hint ? (\n <p id={hintId} className={styles.hint}>\n {hint}\n </p>\n ) : null}\n {error ? (\n <p id={errorId} className={styles.error} role=\"alert\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n"],"mappings":"oTC4BA,SAAgB,EAAM,CACpB,QACA,OACA,QACA,OAAO,KACP,OAAO,GACP,SACA,YACA,KACA,GAAG,GACU,CACb,IAAM,GAAA,EAAc,EAAA,MAAA,CAAM,EACpB,EAAU,GAAM,EAChB,EAAS,GAAG,EAAQ,OACpB,EAAU,GAAG,EAAQ,QACrB,EAAc,CAAC,EAAK,oBAAqB,EAAO,EAAS,KAAM,EAAQ,EAAU,IAAI,CAAC,CACzF,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,EAEX,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,GAAG,EAAO,MAAM,GAAG,GAAa,KAAhD,SAAA,CACG,GACC,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAW,EAAO,MAAO,QAAS,EACtC,SAAA,CACI,CAAA,EACL,MACJ,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,GAAG,EAAO,MAAM,GAAG,EAAO,GAAM,GAAG,EAAQ,EAAO,QAAU,KAA5E,SAAA,CACG,GAAS,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,OAAS,SAAA,CAAa,CAAA,EAAI,MAC5D,EAAA,EAAA,IAAA,CAAC,QAAD,CACE,GAAI,EACJ,GAAI,EACJ,UAAW,GAAG,EAAO,MAAM,GAAG,EAAO,EAAO,KAAO,KACnD,eAAc,EAAQ,GAAO,EAAK,gBAClC,mBAAkB,GAAe,IAAA,EAClC,CAAA,CACE,IACJ,GACC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,GAAI,EAAQ,UAAW,EAAO,KAC9B,SAAA,CACA,CAAA,EACD,KACH,GACC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,GAAI,EAAS,UAAW,EAAO,MAAO,KAAK,QAC3C,SAAA,CACA,CAAA,EACD,IACD,GAET"}
1
+ {"version":3,"file":"Input-D_KRJA9V.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/Input.module.css","../../../../../../src/web-ui/components/primitives/Input.tsx"],"sourcesContent":[".field {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n}\n\n.label {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n font-weight: var(--font-weight-medium);\n}\n\n.shell {\n display: flex;\n align-items: center;\n gap: var(--space-1);\n height: var(--density-row);\n padding: 0 var(--space-2);\n background: var(--bg-input);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n transition:\n border-color var(--duration-fast) var(--ease-standard),\n box-shadow var(--duration-fast) var(--ease-standard);\n}\n\n.sm {\n height: var(--density-row-sm);\n}\n\n.shell:hover:not(:has(.input:disabled)) {\n border-color: var(--border-strong);\n}\n\n/* The field's own focus ring: the inner <input> has no visible outline, so\n the shell carries it (and :focus-visible keeps it keyboard-only). */\n/* The system ring, not an --accent-100 wash: that token is pinned at 92%\n lightness in light and 22% in dark (tokens.css), so hue and saturation\n follow the operator's accent but LIGHTNESS never does — every preset and\n every slider position produced the same 1.34:1 / 1.15:1 near-invisible\n ring. --shadow-focus-ring is already the 2px-gap + 2px-accent shape\n DESIGN-V2 §6 asks for, and --border-focus is contrast-tested. */\n.shell:has(.input:focus-visible) {\n border-color: var(--border-focus);\n box-shadow: var(--shadow-focus-ring);\n}\n\n.invalid {\n border-color: var(--status-danger-solid);\n}\n\n.input {\n flex: 1;\n min-width: 0;\n height: 100%;\n border: none;\n background: none;\n color: var(--text-primary);\n font-family: var(--font-ui);\n font-size: var(--text-sm-size);\n}\n\n.input:focus,\n.input:focus-visible {\n outline: none;\n box-shadow: none;\n}\n\n.input::placeholder {\n color: var(--text-tertiary);\n}\n\n.input:disabled {\n color: var(--text-disabled);\n cursor: not-allowed;\n}\n\n.mono {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n}\n\n.prefix {\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n white-space: nowrap;\n}\n\n.hint {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n.error {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--status-danger-fg);\n}\n","/**\n * components/primitives/Input.tsx — single-line text/number entry.\n *\n * Nothing here is a default browser control: hairline border, no inner card,\n * accent on focus. The accessible name comes from `label` when the field\n * stands alone, or from the caller's own `aria-label`/`aria-labelledby` when\n * it sits in a two-column settings row whose label lives on the other side.\n * An `error` is announced via role=\"alert\" and wired with aria-describedby —\n * red text alone never carries the message (design doc §6).\n */\nimport { useId, type InputHTMLAttributes, type ReactNode } from 'react';\nimport styles from './Input.module.css';\n\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'className' | 'prefix'> {\n label?: ReactNode;\n /** Quiet helper text under the field. */\n hint?: ReactNode;\n /** Error message; also flips the field into its invalid styling. */\n error?: ReactNode;\n size?: 'sm' | 'md';\n /** Paths, ids, tokens counts — anything that should not be kerned. */\n mono?: boolean;\n /** Non-interactive leading text (e.g. \"$\", \"http://\"). Shadows the rarely\n * used HTML `prefix` attribute on purpose — this is the useful meaning. */\n prefix?: ReactNode;\n className?: string;\n}\n\nexport function Input({\n label,\n hint,\n error,\n size = 'md',\n mono = false,\n prefix,\n className,\n id,\n ...rest\n}: InputProps) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const hintId = `${inputId}-hint`;\n const errorId = `${inputId}-error`;\n const describedBy = [rest['aria-describedby'], hint ? hintId : null, error ? errorId : null]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={`${styles.field} ${className ?? ''}`}>\n {label ? (\n <label className={styles.label} htmlFor={inputId}>\n {label}\n </label>\n ) : null}\n <div className={`${styles.shell} ${styles[size]} ${error ? styles.invalid : ''}`}>\n {prefix ? <span className={styles.prefix}>{prefix}</span> : null}\n <input\n {...rest}\n id={inputId}\n className={`${styles.input} ${mono ? styles.mono : ''}`}\n aria-invalid={error ? true : rest['aria-invalid']}\n aria-describedby={describedBy || undefined}\n />\n </div>\n {hint ? (\n <p id={hintId} className={styles.hint}>\n {hint}\n </p>\n ) : null}\n {error ? (\n <p id={errorId} className={styles.error} role=\"alert\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n"],"mappings":"oTC4BA,SAAgB,EAAM,CACpB,QACA,OACA,QACA,OAAO,KACP,OAAO,GACP,SACA,YACA,KACA,GAAG,GACU,CACb,IAAM,GAAA,EAAc,EAAA,MAAA,CAAM,EACpB,EAAU,GAAM,EAChB,EAAS,GAAG,EAAQ,OACpB,EAAU,GAAG,EAAQ,QACrB,EAAc,CAAC,EAAK,oBAAqB,EAAO,EAAS,KAAM,EAAQ,EAAU,IAAI,CAAC,CACzF,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,EAEX,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,GAAG,EAAO,MAAM,GAAG,GAAa,KAAhD,SAAA,CACG,GACC,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAW,EAAO,MAAO,QAAS,EACtC,SAAA,CACI,CAAA,EACL,MACJ,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,GAAG,EAAO,MAAM,GAAG,EAAO,GAAM,GAAG,EAAQ,EAAO,QAAU,KAA5E,SAAA,CACG,GAAS,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,OAAS,SAAA,CAAa,CAAA,EAAI,MAC5D,EAAA,EAAA,IAAA,CAAC,QAAD,CACE,GAAI,EACJ,GAAI,EACJ,UAAW,GAAG,EAAO,MAAM,GAAG,EAAO,EAAO,KAAO,KACnD,eAAc,EAAQ,GAAO,EAAK,gBAClC,mBAAkB,GAAe,IAAA,EAClC,CAAA,CACE,IACJ,GACC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,GAAI,EAAQ,UAAW,EAAO,KAC9B,SAAA,CACA,CAAA,EACD,KACH,GACC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,GAAI,EAAS,UAAW,EAAO,MAAO,KAAK,QAC3C,SAAA,CACA,CAAA,EACD,IACD,GAET"}
@@ -0,0 +1,2 @@
1
+ import{n as e}from"./index-DZ-UQ7v8.js";import{g as t,h as n}from"./global-CMNW_dqn.js";import{L as r}from"./VerseConsoleApp-CWU6R3By.js";import{n as i,u as a}from"./format-CH4g_sl1.js";import{t as o}from"./Button-D90dzI_o.js";import{d as s}from"./surface-data-Dj71tdD-.js";import{n as c,t as l}from"./nav-0dOYe2rJ.js";import{i as u,n as d,t as f}from"./Surface-BfDmQcKe.js";import{r as p}from"./actions-CY-PjpGc.js";import{t as m}from"./use-ticker-BBcp02SZ.js";import{g as h,l as g,o as _,r as v,v as y}from"./thread-data-DQB_g66d.js";import{i as b}from"./leader-focus-BjeJv7CW.js";function x(e){return e.status===`applied`||e.status===`scheduled`}function S(e){return e.status===`scheduled`&&e.class===`B`||e.status===`escalated`}function C(e,t){if(e.status!==`scheduled`||!e.applyAfter)return null;let n=Date.parse(e.createdAt),r=Date.parse(e.applyAfter);return!Number.isFinite(n)||!Number.isFinite(r)||r<=n?null:Math.max(0,Math.min(1,(r-t)/(r-n)))}function w(e,t){if(!e)return``;let n=Date.parse(e)-t;if(!Number.isFinite(n))return``;if(n<=0)return`applying…`;let r=Math.ceil(n/6e4);return r<60?`${r}m`:`${Math.floor(r/60)}h ${String(r%60).padStart(2,`0`)}m`}var T={"merges/day":`merges/day`};function E(e){if(!e)return null;let t=Date.parse(e.byDate),n=Number.isFinite(t)?new Date(t).toLocaleDateString(`en-US`,{weekday:`short`,month:`short`,day:`numeric`}):e.byDate,r=Number.isInteger(e.delta)?String(Math.abs(e.delta)):Math.abs(e.delta).toFixed(1);return`${e.delta>=0?`+`:`−`}${r} ${T[e.metric]??e.metric} by ${n}`}function D(e){return e.expectedDelta?e.outcome?e.outcome.hit===null?`ungraded`:e.outcome.hit?`hit`:`miss`:`pending`:`ungraded`}var O={hit:`hit`,miss:`missed`,pending:`graded in 7 days`,ungraded:`not gradeable`};function k(e){if(!e?.latest)return[];let t=new Map(e.actions.map(e=>[e.id,e])),n=e.latest.actions.map(e=>t.get(e.id)??e),r={A:0,B:1,C:2};return n.sort((e,t)=>r[e.class]-r[t.class]||Date.parse(t.createdAt)-Date.parse(e.createdAt))}var A={scheduled:`Scheduled`,applied:`Applied`,vetoed:`Vetoed`,refused:`Refused`,failed:`Failed`,escalated:`Needs you`};function j(e){if(!e)return null;let t=e.standards.filter(e=>e.retiredAt===null);if(e.timeline.length||e.actions.length||e.hitRate.graded>0||t.length)return null;let n=e.lastRun?.reason?.trim()||null;return{title:e.lastRun?`The Leader hasn't written a memo yet.`:`The Leader hasn't run yet.`,why:n?/[.!?…]$/.test(n)?n:`${n}.`:null}}var M={line:`_line_4stg3_5`,preview:`_preview_4stg3_14`,meta:`_meta_4stg3_22`,text:`_text_4stg3_28`,ask:`_ask_4stg3_37`,askText:`_askText_4stg3_66`,where:`_where_4stg3_72`},N=e(),P=3e4;function F(){let e=n(_,{freshMs:15e3}),i=t(_);r(i,P);let o=h(e.data?.value?.messages??[]);return(0,N.jsxs)(`div`,{className:M.line,children:[o?(0,N.jsxs)(`p`,{className:M.preview,"aria-label":`The Leader's latest message`,children:[(0,N.jsxs)(`span`,{className:M.meta,children:[`Leader · `,g[o.channel],` · `,a(o.at)]}),(0,N.jsx)(`span`,{className:M.text,title:o.text,children:y(o.text)})]}):null,(0,N.jsxs)(`button`,{type:`button`,className:M.ask,onClick:()=>b({kind:`composer`}),children:[(0,N.jsx)(`span`,{className:M.askText,children:`Message the Leader…`}),(0,N.jsx)(`span`,{className:M.where,"aria-hidden":`true`,children:`opens Mind`})]})]})}var I=8,L=2*Math.PI*I;function R({action:e}){let t=m(1e3),n=C(e,t);if(n===null)return null;let r=w(e.applyAfter,t);return(0,N.jsxs)(`span`,{className:p.ring,role:`timer`,"aria-label":`Applies in ${r} unless vetoed`,children:[(0,N.jsxs)(`svg`,{width:20,height:20,viewBox:`0 0 20 20`,"aria-hidden":`true`,children:[(0,N.jsx)(`circle`,{cx:10,cy:10,r:I,className:p.ringTrack}),(0,N.jsx)(`circle`,{"data-role":`remaining`,cx:10,cy:10,r:I,className:p.ringFill,strokeDasharray:`${(L*n).toFixed(2)} ${L.toFixed(2)}`,transform:`rotate(-90 10 10)`})]}),(0,N.jsx)(`span`,{className:p.ringText,children:r})]})}function z(e){return{title:`Veto this action?`,body:e.status===`scheduled`?`“${e.summary}” will not apply. The Leader records the veto and learns from it.`:`“${e.summary}” is undone exactly as it was applied. The Leader records the veto and learns from it.`,confirmLabel:`Veto`,destructive:!0}}function B(e){return{title:`Approve this action?`,body:e.status===`scheduled`?`“${e.summary}” applies now instead of waiting out its veto window. You can still veto it afterwards.`:`“${e.summary}” is outside the standing grant. Approving tells the Leader to go ahead; the server still checks it against your authority.`,confirmLabel:`Approve`}}function V({action:e,actions:t,compact:n=!1,approve:r=!1,dryRun:i=!1,anchored:a=!0}){let c=!i&&x(e),u=r&&!i&&S(e);return(0,N.jsxs)(`li`,{className:p.actionRow,"data-status":e.status,id:a?l(`action-${e.id}`):void 0,children:[(0,N.jsx)(`span`,{className:p.classBadge,"data-class":e.class,title:`Class ${e.class}`,children:e.class}),(0,N.jsxs)(`span`,{className:p.actionText,children:[(0,N.jsx)(`span`,{className:p.actionSummary,children:e.summary}),n?null:(0,N.jsx)(`span`,{className:p.actionWhy,children:e.why})]}),(0,N.jsxs)(`span`,{className:p.actionState,children:[i?(0,N.jsx)(`span`,{className:p.statusWord,"data-status":`dry-run`,children:`Dry run`}):e.status===`scheduled`?(0,N.jsx)(R,{action:e}):(0,N.jsx)(`span`,{className:p.statusWord,"data-status":e.status,children:A[e.status]}),u?(0,N.jsx)(o,{size:`sm`,variant:`subtle`,disabled:t.busy||t.readOnly,"aria-label":`Approve: ${e.summary}`,onClick:()=>t.act(()=>v(e.id),`Approve “${e.summary}”`,{confirm:B(e)}),children:`Approve`}):null,c?(0,N.jsx)(o,{size:`sm`,variant:`ghost`,className:p.vetoChip,disabled:t.busy||t.readOnly,"aria-label":`Veto: ${e.summary}`,onClick:()=>t.act(()=>s({action:`veto`,actionId:e.id}),`Veto “${e.summary}”`,{confirm:z(e)}),children:`Veto`}):null]})]})}function H({read:e,loading:t,actions:n}){let r=e?.value??null,o=r?.latest??null,l=k(r),m=E(o?.move?.expectedDelta??null),h=l.some(x);return(0,N.jsxs)(f,{title:`Leader`,caption:o?`Memo ${a(o.at)}${o.seatId?` · ${o.seatId}`:``}${r?.nextRunAt?` · next run ${new Date(r.nextRunAt).toLocaleTimeString(`en-US`,{hour:`numeric`,minute:`2-digit`})}`:``}`:void 0,actions:(0,N.jsxs)(N.Fragment,{children:[o?.dryRun?(0,N.jsx)(`span`,{className:p.dryRun,children:`Dry run`}):null,(0,N.jsxs)(`button`,{type:`button`,className:p.linkButton,onClick:()=>c(`mind`,null),"aria-keyshortcuts":`Meta+4`,children:[`Open Mind `,(0,N.jsx)(`kbd`,{className:p.kbd,children:`⌘4`})]})]}),children:[t&&!e?(0,N.jsx)(`p`,{className:p.muted,"aria-busy":`true`,children:`Reading the Leader…`}):r?o?(0,N.jsxs)(N.Fragment,{children:[(0,N.jsxs)(`dl`,{className:p.memo,children:[(0,N.jsxs)(`div`,{className:p.memoRow,children:[(0,N.jsx)(`dt`,{children:(0,N.jsx)(u,{children:`Bottleneck`})}),(0,N.jsx)(`dd`,{className:p.memoText,children:o.bottleneck?.statement??`—`})]}),(0,N.jsxs)(`div`,{className:p.memoRow,children:[(0,N.jsx)(`dt`,{children:(0,N.jsx)(u,{children:`The move`})}),(0,N.jsxs)(`dd`,{className:p.memoText,children:[o.move?.statement??`—`,m?(0,N.jsx)(`span`,{className:p.delta,children:m}):null]})]})]}),l.length?(0,N.jsx)(`ul`,{className:p.actionList,"aria-label":`Leader actions`,children:l.map(e=>(0,N.jsx)(V,{action:e,actions:n},e.id))}):null,o.dryRun?(0,N.jsx)(`p`,{className:p.muted,children:`Shadow stage: these actions are shown, never applied.`}):null,h&&!o.dryRun?(0,N.jsx)(`button`,{type:`button`,className:p.moreLink,disabled:n.busy||n.readOnly,onClick:()=>n.act(()=>s({action:`veto-memo`,memoId:o.id}),`Veto the whole memo`,{confirm:{title:`Veto the whole memo?`,body:`Every applied action is undone exactly and every scheduled one is cancelled. The Leader records the veto.`,confirmLabel:`Veto memo`,destructive:!0}}),children:`Veto the whole memo`}):null]}):(0,N.jsxs)(d,{children:[i(`No memo yet${r.lastRun?` — last run ${a(r.lastRun.at)}: ${r.lastRun.reason??r.lastRun.outcome}`:``}`),r.nextRunAt?` Next run ${new Date(r.nextRunAt).toLocaleString(`en-US`,{weekday:`short`,hour:`numeric`,minute:`2-digit`})}.`:``]}):(0,N.jsx)(d,{tone:`unknown`,children:e?.reason??`The Leader did not answer.`}),(0,N.jsx)(F,{})]})}export{x as a,D as c,E as i,H as n,j as o,O as r,k as s,V as t};
2
+ //# sourceMappingURL=LeaderCard-D-7DlJuR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LeaderCard-D-7DlJuR.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mind/leader-model.ts","../../../../../../src/web-ui/routes/verse/leader/leader-line.module.css","../../../../../../src/web-ui/routes/verse/leader/LeaderLine.tsx","../../../../../../src/web-ui/routes/verse/command/CountdownRing.tsx","../../../../../../src/web-ui/routes/verse/command/LeaderCard.tsx"],"sourcesContent":["/**\n * routes/verse/mind/leader-model.ts — pure helpers over LeaderStateV1 for the\n * Command Leader card and the Mind surface (unit C7; SPEC-310B §4).\n *\n * class A — applied now; Veto undoes it exactly (its recorded inverse);\n * class B — waits out its veto window (a countdown ring), then applies;\n * class C — outside the grant, never applied: shown as \"needs you\".\n *\n * Framework-free; tested directly.\n */\nimport type { LeaderAction, LeaderExpectedDelta, LeaderMemoSummary, LeaderStateV1 } from '../../../../core/vision/leader-types.js';\n\n/** Actions a Veto can still act on: applied (undo) or scheduled (cancel). */\nexport function isVetoable(action: LeaderAction): boolean {\n return action.status === 'applied' || action.status === 'scheduled';\n}\n\n/**\n * Actions Mason can approve from the conversation: a class-B action still in\n * its veto window (apply now) or a class-C ask outside the grant (go ahead —\n * the server re-checks it against the authority it holds).\n */\nexport function isApprovable(action: Pick<LeaderAction, 'status' | 'class'>): boolean {\n return (action.status === 'scheduled' && action.class === 'B') || action.status === 'escalated';\n}\n\n/** Remaining fraction (1 → 0) of a class-B action's veto window; null when it has none. */\nexport function vetoWindowFraction(action: Pick<LeaderAction, 'status' | 'createdAt' | 'applyAfter'>, now: number): number | null {\n if (action.status !== 'scheduled' || !action.applyAfter) return null;\n const start = Date.parse(action.createdAt);\n const end = Date.parse(action.applyAfter);\n if (!Number.isFinite(start) || !Number.isFinite(end) || end <= start) return null;\n return Math.max(0, Math.min(1, (end - now) / (end - start)));\n}\n\n/** \"18m\", \"1h 04m\", \"applying…\" */\nexport function countdownText(applyAfter: string | null, now: number): string {\n if (!applyAfter) return '';\n const ms = Date.parse(applyAfter) - now;\n if (!Number.isFinite(ms)) return '';\n if (ms <= 0) return 'applying…';\n const m = Math.ceil(ms / 60_000);\n if (m < 60) return `${m}m`;\n return `${Math.floor(m / 60)}h ${String(m % 60).padStart(2, '0')}m`;\n}\n\nconst METRIC_UNIT: Record<string, string> = { 'merges/day': 'merges/day' };\n\n/** \"+4 merges/day by Fri\" */\nexport function expectedDeltaText(d: LeaderExpectedDelta | null): string | null {\n if (!d) return null;\n const by = Date.parse(d.byDate);\n const when = Number.isFinite(by) ? new Date(by).toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric' }) : d.byDate;\n const n = Number.isInteger(d.delta) ? String(Math.abs(d.delta)) : Math.abs(d.delta).toFixed(1);\n return `${d.delta >= 0 ? '+' : '−'}${n} ${METRIC_UNIT[d.metric] ?? d.metric} by ${when}`;\n}\n\nexport type OutcomeMark = 'hit' | 'miss' | 'pending' | 'ungraded';\n\nexport function outcomeMark(m: Pick<LeaderMemoSummary, 'outcome' | 'expectedDelta'>): OutcomeMark {\n if (!m.expectedDelta) return 'ungraded';\n if (!m.outcome) return 'pending';\n if (m.outcome.hit === null) return 'ungraded';\n return m.outcome.hit ? 'hit' : 'miss';\n}\n\nexport const OUTCOME_WORD: Record<OutcomeMark, string> = {\n hit: 'hit',\n miss: 'missed',\n pending: 'graded in 7 days',\n ungraded: 'not gradeable',\n};\n\n/** The latest memo's actions, class-C last (they are asks, not actions). */\nexport function memoActions(state: LeaderStateV1 | null): LeaderAction[] {\n if (!state?.latest) return [];\n const byId = new Map(state.actions.map((a) => [a.id, a]));\n // The state's action list carries the newest status; fall back to the memo's copy.\n const list = state.latest.actions.map((a) => byId.get(a.id) ?? a);\n const order = { A: 0, B: 1, C: 2 } as const;\n return list.sort((a, b) => order[a.class] - order[b.class] || Date.parse(b.createdAt) - Date.parse(a.createdAt));\n}\n\nexport const STATUS_WORD: Record<LeaderAction['status'], string> = {\n scheduled: 'Scheduled',\n applied: 'Applied',\n vetoed: 'Vetoed',\n refused: 'Refused',\n failed: 'Failed',\n escalated: 'Needs you',\n};\n\n/**\n * The Leader has nothing to show — no memo, no action, nothing graded, no\n * standard — so Mind says it once instead of three empty cards. The title is\n * the fact; the line is the last run's own reason when it gave one. Null\n * while the Leader has anything to show (or has not answered).\n */\nexport function leaderSilence(state: LeaderStateV1 | null): { title: string; why: string | null } | null {\n if (!state) return null;\n const standards = state.standards.filter((s) => s.retiredAt === null);\n if (state.timeline.length || state.actions.length || state.hitRate.graded > 0 || standards.length) return null;\n const reason = state.lastRun?.reason?.trim() || null;\n return {\n title: state.lastRun ? \"The Leader hasn't written a memo yet.\" : \"The Leader hasn't run yet.\",\n why: reason ? (/[.!?…]$/.test(reason) ? reason : `${reason}.`) : null,\n };\n}\n","/*\n * routes/verse/leader/leader-line.module.css — the Leader line at the foot of\n * Command's Leader card. Tokens only (style-scan-310).\n */\n.line {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n margin-top: var(--space-3);\n padding-top: var(--space-3);\n border-top: 1px solid var(--border-subtle);\n}\n\n.preview {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n margin: 0;\n min-width: 0;\n}\n\n.meta {\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n.text {\n color: var(--text-secondary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.ask {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-2);\n width: 100%;\n min-height: var(--control-h-sm);\n padding: 0 var(--space-3);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-md);\n background: var(--bg-input);\n color: var(--text-tertiary);\n font: inherit;\n font-size: var(--text-sm-size);\n text-align: left;\n cursor: text;\n transition: border-color var(--duration-fast) var(--ease-standard);\n}\n\n.ask:hover {\n border-color: var(--border-strong);\n color: var(--text-secondary);\n}\n\n.ask:focus-visible {\n outline: 2px solid var(--border-focus);\n outline-offset: 2px;\n}\n\n.askText {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.where {\n flex: none;\n color: var(--text-tertiary);\n font-size: var(--text-2xs-size);\n}\n","/**\n * routes/verse/leader/LeaderLine.tsx — the foot of Command's Leader card:\n * the Leader's latest message (one line, any channel) and a \"Message the\n * Leader…\" affordance that opens Mind's conversation with the composer\n * focused (leader-focus.ts).\n *\n * ┌ L Leader · Telegram · 12m ago ┐\n * │ Judge queue is clearing; raising Grok to 3 lanes at 14:20 unless… │\n * │ [ Message the Leader… ⌘4 ↵ ] │\n *\n * Reads the thread's first page from the shared cache (Mind reads the same\n * key), polls it at Command's calm pace, and hides the preview — never the\n * button — when the conversation route is absent or silent.\n */\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { formatRelative } from '../autonomy/format.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { requestLeaderFocus } from './leader-focus.js';\nimport { leaderThreadQuery } from './thread-data.js';\nimport { CHANNEL_LABEL, latestLeaderMessage, previewText } from './thread-model.js';\nimport styles from './leader-line.module.css';\n\nexport const LEADER_LINE_POLL_MS = 30_000;\n\nexport function LeaderLine() {\n const thread = useQuery(leaderThreadQuery, { freshMs: 15_000 });\n const refetch = useRefetch(leaderThreadQuery);\n usePollWhileVisible(refetch, LEADER_LINE_POLL_MS);\n const latest = latestLeaderMessage(thread.data?.value?.messages ?? []);\n return (\n <div className={styles.line}>\n {latest ? (\n <p className={styles.preview} aria-label=\"The Leader's latest message\">\n <span className={styles.meta}>\n Leader · {CHANNEL_LABEL[latest.channel]} · {formatRelative(latest.at)}\n </span>\n {/* Model text: one plain line (Markdown marks dropped), never HTML. */}\n <span className={styles.text} title={latest.text}>{previewText(latest.text)}</span>\n </p>\n ) : null}\n <button type=\"button\" className={styles.ask} onClick={() => requestLeaderFocus({ kind: 'composer' })}>\n <span className={styles.askText}>Message the Leader…</span>\n <span className={styles.where} aria-hidden=\"true\">opens Mind</span>\n </button>\n </div>\n );\n}\n","/**\n * routes/verse/command/CountdownRing.tsx — a class-B action's veto window as\n * a shrinking ring (r5/visual.md §2 Motion: \"Class-B veto: countdown ring\n * drawn as a conic stroke that shrinks once per second\").\n *\n * It ticks once a second even under reduced motion — a countdown is\n * information, not decoration (use-ticker.ts) — but it never animates\n * between ticks. The minutes are always written beside it, so the ring is\n * never the only carrier.\n */\nimport { useNow } from '../autonomy/use-ticker.js';\nimport { countdownText, vetoWindowFraction } from '../mind/leader-model.js';\nimport type { LeaderAction } from '../../../../core/vision/leader-types.js';\nimport styles from './command.module.css';\n\nconst R = 8;\nconst C = 2 * Math.PI * R;\n\nexport function CountdownRing({ action }: { action: Pick<LeaderAction, 'status' | 'createdAt' | 'applyAfter' | 'summary'> }) {\n const now = useNow(1000);\n const fraction = vetoWindowFraction(action, now);\n if (fraction === null) return null;\n const text = countdownText(action.applyAfter, now);\n return (\n <span className={styles.ring} role=\"timer\" aria-label={`Applies in ${text} unless vetoed`}>\n <svg width={20} height={20} viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <circle cx={10} cy={10} r={R} className={styles.ringTrack} />\n <circle\n data-role=\"remaining\"\n cx={10}\n cy={10}\n r={R}\n className={styles.ringFill}\n strokeDasharray={`${(C * fraction).toFixed(2)} ${C.toFixed(2)}`}\n transform=\"rotate(-90 10 10)\"\n />\n </svg>\n <span className={styles.ringText}>{text}</span>\n </span>\n );\n}\n","/**\n * routes/verse/command/LeaderCard.tsx — the Leader's latest memo on Command\n * (span 7; SPEC-310B §6 \"Leader card: Bottleneck, The Move, a Veto chip on\n * each action, and countdown rings for class-B actions\"; unit C7).\n *\n * Every line is the Leader's own (untrusted model) text, rendered as plain\n * text — never markdown, never a link. Veto confirms, then asks for the\n * token; the server runs the action's recorded inverse, restoring the prior\n * state exactly. A dry-run memo (rollout shadow stage) says so in words.\n */\nimport type { LeaderAction, LeaderStateV1 } from '../../../../core/vision/leader-types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { asSentence, formatRelative } from '../autonomy/format.js';\nimport { STATUS_WORD, expectedDeltaText, isApprovable, isVetoable, memoActions } from '../mind/leader-model.js';\nimport { approveLeaderAction } from '../leader/thread-data.js';\nimport { LeaderLine } from '../leader/LeaderLine.js';\nimport { CountdownRing } from './CountdownRing.js';\nimport { anchorId, goToSection } from './nav.js';\nimport { postLeader, type OptionalRead } from './surface-data.js';\nimport { Card, CardNote, MicroLabel } from './Surface.js';\nimport type { ConfirmSpec, SurfaceActions } from './actions.js';\nimport styles from './command.module.css';\n\nexport function vetoConfirm(action: Pick<LeaderAction, 'summary' | 'status'>): ConfirmSpec {\n return {\n title: 'Veto this action?',\n body:\n action.status === 'scheduled'\n ? `“${action.summary}” will not apply. The Leader records the veto and learns from it.`\n : `“${action.summary}” is undone exactly as it was applied. The Leader records the veto and learns from it.`,\n confirmLabel: 'Veto',\n destructive: true,\n };\n}\n\nexport function approveConfirm(action: Pick<LeaderAction, 'summary' | 'status'>): ConfirmSpec {\n return {\n title: 'Approve this action?',\n body:\n action.status === 'scheduled'\n ? `“${action.summary}” applies now instead of waiting out its veto window. You can still veto it afterwards.`\n : `“${action.summary}” is outside the standing grant. Approving tells the Leader to go ahead; the server still checks it against your authority.`,\n confirmLabel: 'Approve',\n };\n}\n\nexport interface ActionRowProps {\n action: LeaderAction;\n actions: SurfaceActions;\n compact?: boolean;\n /** Offer Approve on a class-B action in its window or a class-C ask (the Leader conversation). */\n approve?: boolean;\n /** A shadow-stage memo's action: shown, never applied — nothing to approve or veto. */\n dryRun?: boolean;\n /** The row's anchor id (the action log's rows are jump targets; a copy in the conversation is not). */\n anchored?: boolean;\n}\n\nexport function ActionRow({ action, actions, compact = false, approve = false, dryRun = false, anchored = true }: ActionRowProps) {\n const vetoable = !dryRun && isVetoable(action);\n const approvable = approve && !dryRun && isApprovable(action);\n return (\n <li className={styles.actionRow} data-status={action.status} id={anchored ? anchorId(`action-${action.id}`) : undefined}>\n <span className={styles.classBadge} data-class={action.class} title={`Class ${action.class}`}>\n {action.class}\n </span>\n <span className={styles.actionText}>\n <span className={styles.actionSummary}>{action.summary}</span>\n {!compact ? <span className={styles.actionWhy}>{action.why}</span> : null}\n </span>\n <span className={styles.actionState}>\n {dryRun ? (\n <span className={styles.statusWord} data-status=\"dry-run\">Dry run</span>\n ) : action.status === 'scheduled' ? (\n <CountdownRing action={action} />\n ) : (\n <span className={styles.statusWord} data-status={action.status}>{STATUS_WORD[action.status]}</span>\n )}\n {approvable ? (\n <Button\n size=\"sm\"\n variant=\"subtle\"\n disabled={actions.busy || actions.readOnly}\n aria-label={`Approve: ${action.summary}`}\n onClick={() => actions.act(() => approveLeaderAction(action.id), `Approve “${action.summary}”`, { confirm: approveConfirm(action) })}\n >\n Approve\n </Button>\n ) : null}\n {vetoable ? (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className={styles.vetoChip}\n disabled={actions.busy || actions.readOnly}\n aria-label={`Veto: ${action.summary}`}\n onClick={() => actions.act(() => postLeader({ action: 'veto', actionId: action.id }), `Veto “${action.summary}”`, { confirm: vetoConfirm(action) })}\n >\n Veto\n </Button>\n ) : null}\n </span>\n </li>\n );\n}\n\nexport function LeaderCard({ read, loading, actions }: { read: OptionalRead<LeaderStateV1> | undefined; loading: boolean; actions: SurfaceActions }) {\n const state = read?.value ?? null;\n const memo = state?.latest ?? null;\n const list = memoActions(state);\n const delta = expectedDeltaText(memo?.move?.expectedDelta ?? null);\n const vetoable = list.some(isVetoable);\n return (\n <Card\n title=\"Leader\"\n caption={memo ? `Memo ${formatRelative(memo.at)}${memo.seatId ? ` · ${memo.seatId}` : ''}${state?.nextRunAt ? ` · next run ${new Date(state.nextRunAt).toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' })}` : ''}` : undefined}\n actions={\n <>\n {memo?.dryRun ? <span className={styles.dryRun}>Dry run</span> : null}\n <button type=\"button\" className={styles.linkButton} onClick={() => goToSection('mind', null)} aria-keyshortcuts=\"Meta+4\">\n Open Mind <kbd className={styles.kbd}>⌘4</kbd>\n </button>\n </>\n }\n >\n {loading && !read ? (\n <p className={styles.muted} aria-busy=\"true\">Reading the Leader…</p>\n ) : !state ? (\n <CardNote tone=\"unknown\">{read?.reason ?? 'The Leader did not answer.'}</CardNote>\n ) : !memo ? (\n <CardNote>\n {/* The run's reason is server prose that may carry its own stop. */}\n {asSentence(`No memo yet${state.lastRun ? ` — last run ${formatRelative(state.lastRun.at)}: ${state.lastRun.reason ?? state.lastRun.outcome}` : ''}`)}\n {state.nextRunAt ? ` Next run ${new Date(state.nextRunAt).toLocaleString('en-US', { weekday: 'short', hour: 'numeric', minute: '2-digit' })}.` : ''}\n </CardNote>\n ) : (\n <>\n <dl className={styles.memo}>\n <div className={styles.memoRow}>\n <dt><MicroLabel>Bottleneck</MicroLabel></dt>\n <dd className={styles.memoText}>{memo.bottleneck?.statement ?? '—'}</dd>\n </div>\n <div className={styles.memoRow}>\n <dt><MicroLabel>The move</MicroLabel></dt>\n <dd className={styles.memoText}>\n {memo.move?.statement ?? '—'}\n {delta ? <span className={styles.delta}>{delta}</span> : null}\n </dd>\n </div>\n </dl>\n {list.length ? (\n <ul className={styles.actionList} aria-label=\"Leader actions\">\n {list.map((a) => (\n <ActionRow key={a.id} action={a} actions={actions} />\n ))}\n </ul>\n ) : null}\n {memo.dryRun ? <p className={styles.muted}>Shadow stage: these actions are shown, never applied.</p> : null}\n {vetoable && !memo.dryRun ? (\n <button\n type=\"button\"\n className={styles.moreLink}\n disabled={actions.busy || actions.readOnly}\n onClick={() =>\n actions.act(() => postLeader({ action: 'veto-memo', memoId: memo.id }), 'Veto the whole memo', {\n confirm: {\n title: 'Veto the whole memo?',\n body: 'Every applied action is undone exactly and every scheduled one is cancelled. The Leader records the veto.',\n confirmLabel: 'Veto memo',\n destructive: true,\n },\n })\n }\n >\n Veto the whole memo\n </button>\n ) : null}\n </>\n )}\n <LeaderLine />\n </Card>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ ._line_4stg3_5{gap:var(--space-2);margin-top:var(--space-3);padding-top:var(--space-3);border-top:1px solid var(--border-subtle);flex-direction:column;display:flex}._preview_4stg3_14{gap:var(--space-1);flex-direction:column;min-width:0;margin:0;display:flex}._meta_4stg3_22{color:var(--text-tertiary);font-size:var(--text-xs-size);line-height:var(--text-xs-line)}._text_4stg3_28{color:var(--text-secondary);font-size:var(--text-sm-size);line-height:var(--text-sm-line);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._ask_4stg3_37{justify-content:space-between;align-items:center;gap:var(--space-2);width:100%;min-height:var(--control-h-sm);padding:0 var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-md);background:var(--bg-input);color:var(--text-tertiary);font:inherit;font-size:var(--text-sm-size);text-align:left;cursor:text;transition:border-color var(--duration-fast) var(--ease-standard);display:flex}._ask_4stg3_37:hover{border-color:var(--border-strong);color:var(--text-secondary)}._ask_4stg3_37:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}._askText_4stg3_66{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._where_4stg3_72{color:var(--text-tertiary);font-size:var(--text-2xs-size);flex:none}
@@ -0,0 +1,2 @@
1
+ import{a as e,c as t,n}from"./index-DZ-UQ7v8.js";import{A as r,g as i,h as a,s as o}from"./global-CMNW_dqn.js";import{t as s}from"./MutationTokenDialog-DbnO8aYi.js";import{L as c}from"./VerseConsoleApp-CWU6R3By.js";import{t as l}from"./MessageMarkdown-DFvk06qG.js";import{C as u,g as d,n as f,y as p}from"./icons-D1sYbCTQ.js";import{a as m}from"./nav-0dOYe2rJ.js";import{r as h}from"./actions-CY-PjpGc.js";import{t as g}from"./use-ticker-BBcp02SZ.js";import{t as _}from"./use-guarded-action-CuuMHeDX.js";import{_ as ee,a as v,c as te,d as ne,f as re,h as ie,i as ae,l as y,m as oe,n as se,o as ce,p as b,s as x,t as S,u as C,v as w}from"./thread-data-DQB_g66d.js";import{a as le,n as ue,o as T,t as de}from"./leader-focus-BjeJv7CW.js";import{i as E,s as fe,t as D}from"./LeaderCard-D-7DlJuR.js";var O=t(e(),1),k={panel:`_panel_13qlu_9`,head:`_head_13qlu_18`,heading:`_heading_13qlu_27`,title:`_title_13qlu_35`,caption:`_caption_13qlu_43`,dormant:`_dormant_13qlu_49`,dormantDot:`_dormantDot_13qlu_63`,micro:`_micro_13qlu_70`,muted:`_muted_13qlu_79`,textButton:`_textButton_13qlu_86`,iconButton:`_iconButton_13qlu_113`,suggestion:`_suggestion_13qlu_145`,send:`_send_13qlu_146`,log:`_log_13qlu_147`,directives:`_directives_13qlu_153`,chips:`_chips_13qlu_162`,directiveChip:`_directiveChip_13qlu_169`,directiveText:`_directiveText_13qlu_183`,pin:`_pin_13qlu_190`,addDirective:`_addDirective_13qlu_198`,directiveInput:`_directiveInput_13qlu_206`,logInner:`_logInner_13qlu_238`,groupBody:`_groupBody_13qlu_247`,group:`_group_13qlu_247`,thinking:`_thinking_13qlu_253`,masonItem:`_masonItem_13qlu_257`,older:`_older_13qlu_262`,placeholder:`_placeholder_13qlu_267`,empty:`_empty_13qlu_278`,emptyTitle:`_emptyTitle_13qlu_288`,emptyBody:`_emptyBody_13qlu_295`,suggestions:`_suggestions_13qlu_303`,day:`_day_13qlu_328`,system:`_system_13qlu_348`,groupHead:`_groupHead_13qlu_368`,avatar:`_avatar_13qlu_381`,who:`_who_13qlu_401`,time:`_time_13qlu_406`,channel:`_channel_13qlu_410`,entry:`_entry_13qlu_443`,leaderText:`_leaderText_13qlu_453`,prose:`_prose_13qlu_460`,bubble:`_bubble_13qlu_476`,replyTo:`_replyTo_13qlu_498`,delivery:`_delivery_13qlu_507`,failed:`_failed_13qlu_517`,dots:`_dots_13qlu_537`,"leader-dot":`_leader-dot_13qlu_1`,memoCard:`_memoCard_13qlu_577`,memoHead:`_memoHead_13qlu_593`,memoFacts:`_memoFacts_13qlu_603`,delta:`_delta_13qlu_625`,memoActions:`_memoActions_13qlu_640`,more:`_more_13qlu_651`,question:`_question_13qlu_662`,answered:`_answered_13qlu_683`,answeredText:`_answeredText_13qlu_699`,directiveNote:`_directiveNote_13qlu_707`,directiveNoteText:`_directiveNoteText_13qlu_719`,foot:`_foot_13qlu_728`,composer:`_composer_13qlu_733`,composerContext:`_composerContext_13qlu_740`,composerContextText:`_composerContextText_13qlu_749`,composerRow:`_composerRow_13qlu_755`,composerBox:`_composerBox_13qlu_778`,composerHint:`_composerHint_13qlu_828`,counter:`_counter_13qlu_838`,key:`_key_13qlu_846`},A=n();function pe({read:e,actions:t,adding:n,onAddingChange:r}){let[i,a]=(0,O.useState)(``),o=(0,O.useRef)(null);(0,O.useEffect)(()=>{n&&o.current?.focus()},[n]);let s=e?.value??null,c=t.busy||t.readOnly;function l(){let e=i.trim();!e||e.length>500||t.act(()=>S(e),`Adding a Leader directive requires the dispatch token.`,{onDone:()=>{a(``),r(!1)}})}function f(e){if(e.key===`Escape`){e.preventDefault(),e.stopPropagation(),a(``),r(!1);return}e.key===`Enter`&&!e.nativeEvent.isComposing&&(e.preventDefault(),e.stopPropagation(),l())}return(0,A.jsxs)(`div`,{className:k.directives,role:`group`,"aria-label":`Directives`,children:[(0,A.jsx)(`span`,{className:k.micro,children:`Directives`}),e?s===null?(0,A.jsx)(`span`,{className:k.muted,children:e.reason??`Directives did not answer.`}):s.length===0&&!n?(0,A.jsx)(`span`,{className:k.muted,children:`None standing — the Leader works from its own judgment.`}):(0,A.jsx)(`ul`,{className:k.chips,children:s.map(e=>(0,A.jsxs)(`li`,{className:k.directiveChip,title:[e.text,e.channel?`added from ${y[e.channel]}`:null].filter(Boolean).join(` — `),children:[(0,A.jsx)(`span`,{className:k.pin,"aria-hidden":`true`}),(0,A.jsx)(`span`,{className:k.directiveText,children:e.text}),(0,A.jsx)(`button`,{type:`button`,className:k.iconButton,"aria-label":`Retire directive: ${e.text}`,disabled:c,onClick:()=>t.act(()=>x(e.id),`Retiring a Leader directive requires the dispatch token.`),children:(0,A.jsx)(u,{})})]},e.id))}):(0,A.jsx)(`span`,{className:k.muted,"aria-busy":`true`,children:`Reading…`}),n?(0,A.jsxs)(`span`,{className:k.addDirective,children:[(0,A.jsx)(`input`,{ref:o,className:k.directiveInput,"aria-label":`New directive`,placeholder:`e.g. No new goals until binshield ships`,value:i,maxLength:500,onChange:e=>a(e.target.value),onKeyDown:f,onBlur:()=>{i.trim()||r(!1)}}),(0,A.jsx)(`button`,{type:`button`,className:k.textButton,disabled:c||!i.trim(),onClick:l,children:`Add`})]}):s===null?null:(0,A.jsxs)(`button`,{type:`button`,className:k.textButton,disabled:t.readOnly,onClick:()=>r(!0),children:[(0,A.jsx)(d,{}),` Add directive`]})]})}function me(e,t){e.style.height=`auto`;let n=Number.parseFloat(getComputedStyle(e).lineHeight)||20,r=e.offsetHeight-e.clientHeight,i=n*t+r+16;e.style.height=`${Math.min(e.scrollHeight+r,i)}px`,e.style.overflowY=e.scrollHeight+r>i?`auto`:`hidden`}var he=(0,O.forwardRef)(function({value:e,onChange:t,onSend:n,label:r,placeholder:i,disabledReason:a=null,variant:o=`thread`,context:s=null,autoFocus:c=!1,maxLines:l=8},d){let f=(0,O.useRef)(null);(0,O.useImperativeHandle)(d,()=>({focus:()=>f.current?.focus({preventScroll:!1})}),[]),(0,O.useEffect)(()=>{f.current&&me(f.current,l)},[e,l]);let m=e.trim(),h=e.length>C,g=m.length>0&&!h&&a===null,_=(0,O.useCallback)(()=>{g&&n(m)},[g,n,m]);function ee(e){e.key!==`Enter`||e.shiftKey||e.altKey||e.nativeEvent.isComposing||e.keyCode===229||(e.preventDefault(),e.stopPropagation(),_())}let v=e.length>C*.9;return(0,A.jsxs)(`div`,{className:k.composer,"data-variant":o,"data-disabled":a===null?void 0:`true`,children:[s?(0,A.jsxs)(`div`,{className:k.composerContext,children:[(0,A.jsx)(`span`,{className:k.composerContextText,title:s.label,children:s.label}),(0,A.jsx)(`button`,{type:`button`,className:k.iconButton,"aria-label":`Stop answering this question`,onClick:s.onClear,children:(0,A.jsx)(u,{})})]}):null,(0,A.jsxs)(`div`,{className:k.composerRow,children:[(0,A.jsx)(`textarea`,{ref:f,className:k.composerBox,"aria-label":r,placeholder:a??i,value:e,rows:1,disabled:a!==null,autoFocus:c,onChange:e=>t(e.target.value),onKeyDown:ee,"aria-invalid":h||void 0}),(0,A.jsx)(`button`,{type:`button`,className:k.send,"aria-label":o===`answer`?`Send answer`:`Send to the Leader`,disabled:!g,onClick:_,children:(0,A.jsx)(p,{})})]}),o===`thread`?(0,A.jsxs)(`p`,{className:k.composerHint,children:[v?(0,A.jsxs)(`span`,{className:k.counter,"data-over":h?`true`:void 0,children:[e.length.toLocaleString(`en-US`),` / `,C.toLocaleString(`en-US`)]}):null,(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`kbd`,{className:k.key,children:`↵`}),` send · `,(0,A.jsx)(`kbd`,{className:k.key,children:`Shift`}),` `,(0,A.jsx)(`kbd`,{className:k.key,children:`↵`}),` new line`]})]}):null]})});function j({channel:e}){return(0,A.jsx)(`span`,{className:k.channel,"data-channel":e,title:`Sent via ${y[e]}`,children:y[e]})}function M(e){switch(e?.telegram){case`sent`:return{text:`Also sent to Telegram`,failed:!1};case`failed`:return{text:`Telegram: not delivered`,failed:!0};case`pending`:return{text:`Sending to Telegram…`,failed:!1};default:return null}}function N({message:e}){let t=M(e.delivery);return t?(0,A.jsx)(`span`,{className:k.delivery,"data-failed":t.failed?`true`:void 0,children:t.text}):null}function ge(e,t){if(e.replyTo){let n=t.byId.get(e.replyTo);if(n)return n}if(e.questionId){for(let n of t.byId.values())if(n.kind===`question`&&n.questionId===e.questionId)return n}return null}function P({message:e,ctx:t}){let{leader:n}=t,r=e.memoId??null,i=r&&n?.latest?.id===r?n.latest:null,a=r?n?.timeline.find(e=>e.id===r)??null:null,o=[];n&&(i?o=fe(n):e.actionIds?o=e.actionIds.flatMap(e=>n.actions.find(t=>t.id===e)??[]):r&&(o=n.actions.filter(e=>e.memoId===r)));let s=i?.bottleneck?.statement??a?.bottleneck??null,c=i?.move?.statement??a?.move??null,u=E(i?.move?.expectedDelta??a?.expectedDelta??null),d=i?.dryRun??!1,f=s!==null||c!==null||o.length>0;return(0,A.jsxs)(`article`,{className:k.memoCard,"aria-label":`Leader memo`,"data-dry-run":d?`true`:void 0,children:[(0,A.jsxs)(`header`,{className:k.memoHead,children:[(0,A.jsx)(`span`,{className:k.micro,children:`Memo`}),d?(0,A.jsx)(`span`,{className:h.dryRun,children:`Dry run`}):null,a?(0,A.jsx)(`button`,{type:`button`,className:k.textButton,onClick:()=>m(`memo-${a.id}`),children:`In the timeline`}):null]}),f?(0,A.jsxs)(`dl`,{className:k.memoFacts,children:[s?(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`dt`,{className:k.micro,children:`Bottleneck`}),(0,A.jsx)(`dd`,{children:s})]}):null,c?(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`dt`,{className:k.micro,children:`The move`}),(0,A.jsxs)(`dd`,{children:[c,u?(0,A.jsx)(`span`,{className:k.delta,children:u}):null]})]}):null]}):(0,A.jsx)(`div`,{className:k.prose,children:(0,A.jsx)(l,{text:e.text})}),o.length?(0,A.jsx)(`ul`,{className:`${h.actionList} ${k.memoActions}`,"aria-label":`Memo actions`,children:o.map(e=>(0,A.jsx)(D,{action:e,actions:t.actions,approve:!0,dryRun:d,anchored:!1},e.id))}):null,d?(0,A.jsx)(`p`,{className:k.muted,children:t.dormant?`Autonomy is off, so this memo is a dry run — its actions are shown, never applied.`:`Shadow stage — these actions are shown, never applied.`}):null,f&&e.text.trim()?(0,A.jsxs)(`details`,{className:k.more,children:[(0,A.jsx)(`summary`,{children:`The Leader’s note`}),(0,A.jsx)(`div`,{className:k.prose,children:(0,A.jsx)(l,{text:e.text})})]}):null]})}function F({message:e,ctx:t}){let n=t.answered.get(e.id)??null,r=t.answering.has(e.questionId??e.id);return(0,A.jsxs)(`article`,{className:k.question,"aria-label":`Leader question`,"data-answered":n?`true`:void 0,"data-focused":t.focusQuestionId===e.id?`true`:void 0,"data-question-id":e.id,children:[(0,A.jsxs)(`span`,{className:k.micro,children:[`Question`,e.memoId?` · from the memo`:``]}),(0,A.jsx)(`div`,{className:k.prose,children:(0,A.jsx)(l,{text:e.text})}),n?(0,A.jsxs)(`p`,{className:k.answered,children:[(0,A.jsx)(f,{}),` Answered`,n.channel===`verse`?``:` on ${y[n.channel]}`,` · `,(0,A.jsx)(`span`,{className:k.answeredText,children:w(n.text,120)})]}):r?(0,A.jsx)(`p`,{className:k.muted,role:`status`,children:`Sending your answer…`}):(0,A.jsx)(he,{variant:`answer`,label:`Answer the Leader: ${w(e.text,80)}`,placeholder:`Answer the Leader…`,value:t.answerDraft(e.id),onChange:n=>t.setAnswerDraft(e.id,n),onSend:n=>t.onAnswer(e,n),disabledReason:t.sendDisabledReason,autoFocus:t.focusQuestionId===e.id,maxLines:6})]})}function I({message:e,ctx:t}){let n=t.leader&&e.actionIds?e.actionIds.flatMap(e=>t.leader.actions.find(t=>t.id===e)??[]):[];return(0,A.jsxs)(`div`,{className:k.leaderText,children:[(0,A.jsx)(`div`,{className:k.prose,children:(0,A.jsx)(l,{text:e.text})}),n.length?(0,A.jsx)(`ul`,{className:`${h.actionList} ${k.memoActions}`,"aria-label":`Actions`,children:n.map(e=>(0,A.jsx)(D,{action:e,actions:t.actions,approve:!0,compact:!0,anchored:!1},e.id))}):null]})}function L({message:e,ctx:t}){let n=e.kind===`answer`||e.replyTo?ge(e,t):null;return(0,A.jsxs)(`div`,{className:k.masonItem,children:[n?(0,A.jsxs)(`span`,{className:k.replyTo,title:n.text,children:[`Re: `,w(n.text,90)]}):null,(0,A.jsx)(`p`,{className:k.bubble,children:e.text}),(0,A.jsx)(N,{message:e})]})}function R({pending:e,ctx:t}){return(0,A.jsxs)(`div`,{className:k.masonItem,"data-state":e.state,children:[(0,A.jsx)(`p`,{className:k.bubble,"data-state":e.state,children:e.text}),e.state===`sending`?(0,A.jsx)(`span`,{className:k.delivery,children:`Sending…`}):(0,A.jsxs)(`span`,{className:k.failed,role:`alert`,children:[`Not sent`,e.error?` — ${e.error.replace(/\.$/,``)}`:``,`.`,(0,A.jsx)(`button`,{type:`button`,className:k.textButton,onClick:()=>t.onRetry(e.clientId),disabled:t.sendDisabledReason!==null,children:`Retry`}),(0,A.jsx)(`button`,{type:`button`,className:k.textButton,onClick:()=>t.onDiscard(e.clientId),children:`Discard`})]})]})}function z({message:e}){return(0,A.jsxs)(`p`,{className:k.directiveNote,children:[(0,A.jsx)(`span`,{className:k.pin,"aria-hidden":`true`}),(0,A.jsx)(`span`,{className:k.micro,children:`Directive`}),(0,A.jsx)(`span`,{className:k.directiveNoteText,children:e.text})]})}function _e({entry:e,ctx:t}){if(e.type===`pending`)return(0,A.jsx)(R,{pending:e.pending,ctx:t});let n=e.message;switch(n.kind){case`memo`:return(0,A.jsx)(P,{message:n,ctx:t});case`question`:return(0,A.jsx)(F,{message:n,ctx:t});case`directive`:return(0,A.jsx)(z,{message:n});case`action`:return n.from===`leader`?(0,A.jsx)(I,{message:n,ctx:t}):(0,A.jsx)(L,{message:n,ctx:t});default:return n.from===`mason`?(0,A.jsx)(L,{message:n,ctx:t}):(0,A.jsxs)(`div`,{className:k.leaderText,children:[(0,A.jsx)(`div`,{className:k.prose,children:(0,A.jsx)(l,{text:n.text})}),(0,A.jsx)(N,{message:n})]})}}function ve({rows:e,ctx:t}){return(0,A.jsx)(A.Fragment,{children:e.map(e=>{if(e.type===`day`)return(0,A.jsx)(`div`,{className:k.day,role:`separator`,"aria-label":e.label,children:(0,A.jsx)(`span`,{children:e.label})},e.key);if(e.type===`system`)return(0,A.jsxs)(`p`,{className:k.system,"data-message-id":e.entry.message.id,children:[e.entry.message.text,` `,(0,A.jsx)(`time`,{dateTime:e.entry.message.at,children:b(e.entry.message.at)})]},e.key);let n=e.from===`leader`;return(0,A.jsxs)(`section`,{className:k.group,"data-from":e.from,"aria-label":`${n?`Leader`:`You`}, ${b(e.at)}`,children:[(0,A.jsxs)(`header`,{className:k.groupHead,children:[(0,A.jsx)(`span`,{className:k.avatar,"data-from":e.from,"aria-hidden":`true`,children:n?`L`:`M`}),(0,A.jsx)(`span`,{className:k.who,children:n?`Leader`:`You`}),(0,A.jsx)(j,{channel:e.channel}),(0,A.jsx)(`time`,{className:k.time,dateTime:e.at,title:new Date(e.at).toLocaleString(`en-US`),children:b(e.at)})]}),(0,A.jsx)(`div`,{className:k.groupBody,children:e.entries.map(e=>(0,A.jsx)(`div`,{className:k.entry,"data-message-id":e.type===`message`?e.message.id:void 0,"data-kind":e.type===`message`?e.message.kind:`pending`,children:(0,A.jsx)(_e,{entry:e,ctx:t})},e.key))})]},e.key)})})}var ye=1e4,be=3e3,xe=3e4,Se=`Messaging the Leader requires the dispatch token.`,Ce=96,we=[`What is the bottleneck right now?`,`Why this move, and what would change your mind?`,`What would you do with more Claude budget?`];function Te(){let[e,t]=(0,O.useState)(!1),[n,i]=(0,O.useState)(``),a=(0,O.useRef)(null),o=(0,O.useCallback)((e,n)=>{if(r()){n();return}a.current=n,i(e),t(!0)},[]),c=(0,O.useCallback)(()=>{t(!1);let e=a.current;a.current=null,e&&r()&&e()},[]);return{run:o,dialog:(0,A.jsx)(s,{open:e,onClose:c,reason:n,tokenHelp:`the mutation token ashlr verse printed`})}}var Ee=0;function B({leader:e,actions:t,dormant:n}){let r=(0,O.useId)(),s=a(ce,{freshMs:5e3}),l=i(ce),u=a(v,{freshMs:3e4}),d=i(v),f=Te(),p=g(1e4),[m,h]=(0,O.useState)([]),[y,b]=(0,O.useState)(`idle`),[x,S]=(0,O.useState)([]),[C,E]=(0,O.useState)([]),[fe,D]=(0,O.useState)(()=>new Set),[me,j]=(0,O.useState)(``),[M,N]=(0,O.useState)(null),[ge,P]=(0,O.useState)({}),[F,I]=(0,O.useState)(null),[L,R]=(0,O.useState)(!1),[z,_e]=(0,O.useState)(!1),B=(0,O.useRef)(null),V=(0,O.useRef)(null),De=(0,O.useRef)(null),H=(0,O.useRef)(!0),U=(0,O.useRef)(!0),W=s.data,G=W?.value?.messages??null,K=(0,O.useMemo)(()=>ee(G?[m,G]:[m],x,C),[m,G,x,C]),q=(0,O.useMemo)(()=>K.flatMap(e=>e.type===`message`?[e.message]:[]),[K]),Oe=(0,O.useMemo)(()=>new Map(q.map(e=>[e.id,e])),[q]),ke=(0,O.useMemo)(()=>ne(q),[q]),Ae=(0,O.useMemo)(()=>ie(K,p),[K,p]),J=re(K,fe,p);c(l,J?be:ye),c(d,xe),(0,O.useEffect)(()=>{if(!G||x.length===0)return;let e=new Set(G.map(e=>e.id));x.some(t=>e.has(t.id))&&S(t=>t.filter(t=>!e.has(t.id)))},[G,x]);let je=W!==void 0&&W.value===null,Y=z||t.readOnly?`Read-only session — this server runs without dispatch, so messages cannot be sent.`:je?`The conversation is not available on this server.`:null,X=(0,O.useCallback)(async e=>{try{let t=e.kind===`answer`&&e.questionId?await se(e.questionId,e.text):await te(e.text,e.replyTo);E(t=>t.filter(t=>t.clientId!==e.clientId)),t&&(S(e=>[...e,t.message,...t.reply?[t.reply]:[]]),t.reply||D(e=>new Set(e).add(t.message.id))),U.current=!0,l()}catch(t){t instanceof o&&_e(!0),E(n=>n.map(n=>n.clientId===e.clientId?{...n,state:`failed`,error:_(t)}:n))}},[l]),Z=(0,O.useCallback)((e,t)=>{f.run(Se,()=>{Ee+=1;let n={clientId:`local-${Ee}`,kind:t.kind,text:e,at:new Date().toISOString(),replyTo:t.replyTo,questionId:t.questionId,state:`sending`,error:null};t.onStart(),U.current=!0,E(e=>[...e,n]),X(n)})},[f,X]),Me=(0,O.useCallback)(e=>{let t=M?`> ${M.replace(/\n/g,` `)}\n\n${e}`:e;Z(t,{kind:`message`,replyTo:null,questionId:null,onStart:()=>{j(``),N(null)}})},[M,Z]),Ne=(0,O.useCallback)((e,t)=>{Z(t,{kind:`answer`,replyTo:e.id,questionId:e.questionId??e.id,onStart:()=>P(t=>({...t,[e.id]:``}))})},[Z]),Pe=(0,O.useCallback)(e=>{f.run(Se,()=>{let t=C.find(t=>t.clientId===e);if(!t)return;let n={...t,state:`sending`,error:null,at:new Date().toISOString()};U.current=!0,E(t=>t.map(t=>t.clientId===e?n:t)),X(n)})},[f,C,X]),Fe=(0,O.useCallback)(e=>E(t=>t.filter(t=>t.clientId!==e)),[]),Q=(0,O.useSyncExternalStore)(le,de,()=>null);(0,O.useEffect)(()=>{if(!Q)return;if(!ue(Q)){T(Q.seq);return}if(Q.kind===`composer`){U.current=!0,B.current?.focus(),T(Q.seq);return}if(Q.kind===`directive`){R(!0),T(Q.seq);return}if(!W)return;let e=oe(q,Q);e?I(e.id):(N(Q.text??`the Leader’s question`),B.current?.focus()),T(Q.seq)},[Q,W,q]),(0,O.useEffect)(()=>{if(!F)return;let e=[...V.current?.querySelectorAll(`[data-question-id]`)??[]].find(e=>e.dataset.questionId===F);if(!e)return;e.scrollIntoView?.({block:`center`,behavior:`smooth`}),e.querySelector(`textarea`)?.focus({preventScroll:!0});let t=window.setTimeout(()=>I(null),2400);return()=>window.clearTimeout(t)},[F]);let Ie=(0,O.useCallback)(()=>{let e=V.current;e&&(H.current=e.scrollHeight-e.scrollTop-e.clientHeight<=Ce)},[]),Le=K.length?K[K.length-1].key:null;(0,O.useLayoutEffect)(()=>{let e=V.current;e&&((U.current||H.current)&&(e.scrollTop=e.scrollHeight),U.current=!1)},[Le,J]),(0,O.useEffect)(()=>{let e=V.current,t=De.current;if(!e||!t||typeof ResizeObserver>`u`)return;let n=e.scrollHeight,r=new ResizeObserver(()=>{(e.scrollTop+e.clientHeight>=n-Ce||H.current)&&(e.scrollTop=e.scrollHeight,H.current=!0),n=e.scrollHeight});return r.observe(t),()=>r.disconnect()},[]);let $=q.length?q[0].id:null,Re=y!==`done`&&y!==`loading`&&(G?.length??0)>=50&&$!==null,ze=(0,O.useCallback)(async()=>{if(!$)return;let e=V.current,t=e?e.scrollHeight-e.scrollTop:0;b(`loading`);try{let n=await ae($);h(e=>[...n,...e]),b(n.length<50?`done`:`idle`),requestAnimationFrame(()=>{e&&(e.scrollTop=e.scrollHeight-t)})}catch{b(`error`)}},[$]),Be=(0,O.useMemo)(()=>new Set(C.filter(e=>e.kind===`answer`&&e.state===`sending`&&e.questionId).map(e=>e.questionId)),[C]),Ve={leader:e?.value??null,actions:t,answered:ke,byId:Oe,answering:Be,focusQuestionId:F,answerDraft:e=>ge[e]??``,setAnswerDraft:(e,t)=>P(n=>({...n,[e]:t})),onAnswer:Ne,onRetry:Pe,onDiscard:Fe,sendDisabledReason:Y,dormant:n};return(0,A.jsxs)(`section`,{className:k.panel,"aria-labelledby":r,"data-testid":`leader-conversation`,children:[(0,A.jsxs)(`header`,{className:k.head,children:[(0,A.jsxs)(`span`,{className:k.heading,children:[(0,A.jsx)(`h3`,{id:r,className:k.title,children:`Leader`}),(0,A.jsx)(`span`,{className:k.caption,children:`One conversation across Verse, Telegram and the CLI`})]}),n?(0,A.jsxs)(`span`,{className:k.dormant,title:`The Leader still reads, answers and writes memos. With autonomy off, every memo is a dry run: its actions are shown, never applied.`,children:[(0,A.jsx)(`span`,{className:k.dormantDot,"aria-hidden":`true`}),`Autonomy off · memos are dry runs`]}):null]}),(0,A.jsx)(pe,{read:u.data,actions:t,adding:L,onAddingChange:R}),(0,A.jsx)(`div`,{ref:V,className:k.log,role:`log`,"aria-label":`Conversation with the Leader`,"aria-live":`polite`,"aria-relevant":`additions`,onScroll:Ie,tabIndex:0,children:(0,A.jsxs)(`div`,{ref:De,className:k.logInner,children:[Re||y===`error`||y===`loading`?(0,A.jsx)(`div`,{className:k.older,children:(0,A.jsx)(`button`,{type:`button`,className:k.textButton,onClick:()=>void ze(),disabled:y===`loading`,children:y===`loading`?`Loading earlier messages…`:y===`error`?`Earlier messages did not load — try again`:`Load earlier messages`})}):null,W?je&&K.length===0?(0,A.jsx)(`p`,{className:k.placeholder,"data-tone":`unknown`,children:W.reason??`The Leader conversation did not answer.`}):K.length===0?(0,A.jsxs)(`div`,{className:k.empty,children:[(0,A.jsx)(`p`,{className:k.emptyTitle,children:`No conversation yet`}),(0,A.jsx)(`p`,{className:k.emptyBody,children:`Ask the Leader why it made a move, what it would do next, or give it a standing directive. Replies here also reach Telegram when it is connected.`}),Y===null?(0,A.jsx)(`div`,{className:k.suggestions,children:we.map(e=>(0,A.jsx)(`button`,{type:`button`,className:k.suggestion,onClick:()=>{j(e),B.current?.focus()},children:e},e))}):null]}):(0,A.jsx)(ve,{rows:Ae,ctx:Ve}):(0,A.jsx)(`p`,{className:k.placeholder,"aria-busy":`true`,children:`Reading the conversation…`}),J?(0,A.jsxs)(`p`,{className:k.thinking,role:`status`,children:[(0,A.jsxs)(`span`,{className:k.dots,"aria-hidden":`true`,children:[(0,A.jsx)(`span`,{}),(0,A.jsx)(`span`,{}),(0,A.jsx)(`span`,{})]}),`Leader is thinking…`]}):null]})}),(0,A.jsx)(`div`,{className:k.foot,children:(0,A.jsx)(he,{ref:B,label:`Message the Leader`,placeholder:`Message the Leader…`,value:me,onChange:j,onSend:Me,disabledReason:Y,context:M?{label:`Answering: ${w(M,120)}`,onClear:()=>N(null)}:null})}),f.dialog]})}export{xe as DIRECTIVES_POLL_MS,B as LeaderConversation,B as default,ye as THREAD_POLL_MS,be as THREAD_POLL_THINKING_MS};
2
+ //# sourceMappingURL=LeaderConversation-DGZjWI-E.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LeaderConversation-DGZjWI-E.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/leader/leader.module.css","../../../../../../src/web-ui/routes/verse/leader/DirectivesStrip.tsx","../../../../../../src/web-ui/routes/verse/leader/LeaderComposer.tsx","../../../../../../src/web-ui/routes/verse/leader/ThreadItems.tsx","../../../../../../src/web-ui/routes/verse/leader/LeaderConversation.tsx"],"sourcesContent":["/*\n * routes/verse/leader/leader.module.css — the Leader conversation on Mind.\n * Calm by construction: one surface, hairline dividers, no bubbles for the\n * Leader (its words read like a document), a quiet bubble for Mason's.\n * Tokens only (style-scan-310).\n */\n\n/* ---- panel ------------------------------------------------------------- */\n.panel {\n display: flex;\n flex-direction: column;\n min-width: 0;\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-lg);\n background: var(--bg-surface);\n}\n\n.head {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--space-2) var(--space-3);\n padding: var(--card-pad) var(--card-pad) var(--space-2);\n}\n\n.heading {\n display: flex;\n flex: 1 1 240px;\n flex-direction: column;\n gap: var(--space-px);\n min-width: 0;\n}\n\n.title {\n margin: 0;\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: var(--font-weight-semibold);\n}\n\n.caption {\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n.dormant {\n display: inline-flex;\n flex: none;\n align-items: center;\n gap: var(--space-2);\n padding: 0 var(--space-2);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-full);\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n line-height: var(--text-sm-line);\n white-space: nowrap;\n}\n\n.dormantDot {\n width: 6px;\n height: 6px;\n border-radius: var(--radius-full);\n background: var(--status-neutral-solid);\n}\n\n.micro {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n\n.muted {\n margin: 0;\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n.textButton {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n padding: 0;\n border: 0;\n background: none;\n color: var(--text-link);\n font: inherit;\n font-size: var(--text-xs-size);\n cursor: pointer;\n}\n\n.textButton:hover:not(:disabled) {\n text-decoration: underline;\n}\n\n.textButton:disabled {\n color: var(--text-disabled);\n cursor: default;\n}\n\n.textButton svg {\n width: 12px;\n height: 12px;\n}\n\n.iconButton {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n padding: 0;\n border: 0;\n border-radius: var(--radius-xs);\n background: none;\n color: var(--text-tertiary);\n cursor: pointer;\n}\n\n.iconButton svg {\n width: 12px;\n height: 12px;\n}\n\n.iconButton:hover:not(:disabled) {\n background: var(--bg-hover);\n color: var(--text-primary);\n}\n\n.iconButton:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n.textButton:focus-visible,\n.iconButton:focus-visible,\n.suggestion:focus-visible,\n.send:focus-visible,\n.log:focus-visible {\n outline: 2px solid var(--border-focus);\n outline-offset: 2px;\n}\n\n/* ---- directives -------------------------------------------------------- */\n.directives {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-2);\n padding: var(--space-2) var(--card-pad);\n border-top: 1px solid var(--border-subtle);\n}\n\n.chips {\n display: contents;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.directiveChip {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n max-width: 100%;\n padding: 0 var(--space-1) 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-full);\n background: var(--bg-surface-raised);\n color: var(--text-primary);\n font-size: var(--text-xs-size);\n line-height: var(--text-sm-line);\n}\n\n.directiveText {\n overflow: hidden;\n max-width: 48ch;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.pin {\n flex: none;\n width: 6px;\n height: 6px;\n border-radius: var(--radius-full);\n background: var(--accent-500);\n}\n\n.addDirective {\n display: inline-flex;\n flex: 1 1 240px;\n align-items: center;\n gap: var(--space-2);\n min-width: 0;\n}\n\n.directiveInput {\n flex: 1;\n min-width: 0;\n height: var(--control-h-xs);\n padding: 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-md);\n background: var(--bg-input);\n color: var(--text-primary);\n font: inherit;\n font-size: var(--text-xs-size);\n}\n\n.directiveInput:focus {\n border-color: var(--border-focus);\n outline: none;\n}\n\n/* ---- the log ----------------------------------------------------------- */\n.log {\n display: flex;\n flex-direction: column;\n min-height: 240px;\n max-height: clamp(320px, 62vh, 760px);\n padding: var(--space-4) var(--card-pad);\n overflow-y: auto;\n overscroll-behavior: contain;\n border-top: 1px solid var(--border-subtle);\n scroll-padding-bottom: var(--space-4);\n container-type: inline-size;\n}\n\n.logInner {\n display: flex;\n flex: 1 0 auto;\n flex-direction: column;\n gap: var(--space-4);\n}\n\n/* A narrow log (a phone, a split window): runs use the full width. */\n@container (max-width: 520px) {\n .groupBody,\n .group[data-from='mason'] .groupBody {\n padding-left: 0;\n padding-right: 0;\n }\n\n .thinking {\n padding-left: 0;\n }\n\n .masonItem {\n max-width: 88%;\n }\n}\n\n.older {\n display: flex;\n justify-content: center;\n}\n\n.placeholder {\n margin: auto 0;\n color: var(--text-tertiary);\n font-size: var(--text-sm-size);\n text-align: center;\n}\n\n.placeholder[data-tone='unknown'] {\n color: var(--status-unknown-fg);\n}\n\n.empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--space-2);\n margin: auto 0;\n padding: var(--space-6) 0;\n text-align: center;\n}\n\n.emptyTitle {\n margin: 0;\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-semibold);\n}\n\n.emptyBody {\n max-width: var(--measure-read);\n margin: 0;\n color: var(--text-secondary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line-relaxed);\n}\n\n.suggestions {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: var(--space-2);\n margin-top: var(--space-2);\n}\n\n.suggestion {\n padding: var(--space-1) var(--space-3);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-full);\n background: none;\n color: var(--text-secondary);\n font: inherit;\n font-size: var(--text-xs-size);\n cursor: pointer;\n transition: border-color var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);\n}\n\n.suggestion:hover {\n border-color: var(--border-strong);\n color: var(--text-primary);\n}\n\n.day {\n display: flex;\n align-items: center;\n gap: var(--space-3);\n color: var(--text-tertiary);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n font-family: var(--font-display);\n}\n\n.day::before,\n.day::after {\n content: '';\n flex: 1;\n height: 1px;\n background: var(--border-subtle);\n}\n\n.system {\n margin: 0;\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n text-align: center;\n}\n\n/* ---- a run of messages ------------------------------------------------- */\n.group {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n min-width: 0;\n}\n\n.group[data-from='mason'] {\n align-items: flex-end;\n}\n\n.groupHead {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n.group[data-from='mason'] .groupHead {\n flex-direction: row-reverse;\n}\n\n.avatar {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: var(--radius-sm);\n background: var(--accent-50);\n color: var(--accent-700);\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n font-weight: var(--font-weight-semibold);\n}\n\n.avatar[data-from='mason'] {\n background: var(--status-neutral-bg);\n color: var(--status-neutral-fg);\n}\n\n.who {\n color: var(--text-primary);\n font-weight: var(--font-weight-semibold);\n}\n\n.time {\n font-variant-numeric: tabular-nums;\n}\n\n.channel {\n padding: 0 var(--space-1);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-xs);\n color: var(--text-tertiary);\n font-size: var(--text-2xs-size);\n line-height: var(--text-xs-line);\n}\n\n.channel[data-channel='telegram'] {\n border-color: var(--status-info-solid);\n color: var(--status-info-fg);\n}\n\n.channel[data-channel='cli'] {\n font-family: var(--font-mono);\n}\n\n.groupBody {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n width: 100%;\n min-width: 0;\n padding-left: calc(20px + var(--space-2));\n}\n\n.group[data-from='mason'] .groupBody {\n align-items: flex-end;\n padding-left: 0;\n padding-right: calc(20px + var(--space-2));\n}\n\n.entry {\n width: 100%;\n min-width: 0;\n}\n\n.group[data-from='mason'] .entry {\n display: flex;\n justify-content: flex-end;\n}\n\n.leaderText {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n max-width: var(--measure-read);\n}\n\n.prose {\n min-width: 0;\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line-relaxed);\n overflow-wrap: anywhere;\n}\n\n.masonItem {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: var(--space-1);\n max-width: min(78%, var(--measure-read));\n}\n\n.bubble {\n margin: 0;\n padding: var(--space-2) var(--space-3);\n border-radius: var(--radius-lg);\n background: var(--bg-surface-raised);\n border: 1px solid var(--border-subtle);\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line-relaxed);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n\n.bubble[data-state='sending'] {\n opacity: 0.7;\n}\n\n.bubble[data-state='failed'] {\n border-color: var(--status-danger-solid);\n border-style: dashed;\n}\n\n.replyTo {\n overflow: hidden;\n max-width: 100%;\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.delivery {\n color: var(--text-tertiary);\n font-size: var(--text-2xs-size);\n line-height: var(--text-xs-line);\n}\n\n.delivery[data-failed='true'] {\n color: var(--status-warning-fg);\n}\n\n.failed {\n display: inline-flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: var(--space-2);\n color: var(--status-danger-fg);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n.thinking {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n margin: 0;\n padding-left: calc(20px + var(--space-2));\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n}\n\n.dots {\n display: inline-flex;\n gap: 3px;\n}\n\n.dots span {\n width: 4px;\n height: 4px;\n border-radius: var(--radius-full);\n background: var(--text-tertiary);\n animation: leader-dot 1.2s var(--ease-standard) infinite;\n}\n\n.dots span:nth-child(2) {\n animation-delay: 0.15s;\n}\n\n.dots span:nth-child(3) {\n animation-delay: 0.3s;\n}\n\n@keyframes leader-dot {\n 0%,\n 80%,\n 100% {\n opacity: 0.3;\n }\n 40% {\n opacity: 1;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .dots span {\n animation: none;\n opacity: 0.6;\n }\n}\n\n/* ---- memo card --------------------------------------------------------- */\n.memoCard {\n container-type: inline-size;\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n max-width: 720px;\n padding: var(--space-3);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-md);\n background: var(--bg-canvas);\n}\n\n.memoCard[data-dry-run='true'] {\n border-style: dashed;\n}\n\n.memoHead {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n}\n\n.memoHead .textButton {\n margin-left: auto;\n}\n\n.memoFacts {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n margin: 0;\n}\n\n.memoFacts > div {\n display: grid;\n grid-template-columns: 96px minmax(0, 1fr);\n gap: var(--space-3);\n align-items: baseline;\n}\n\n.memoFacts dd {\n margin: 0;\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n overflow-wrap: anywhere;\n}\n\n.delta {\n display: block;\n margin-top: var(--space-1);\n color: var(--status-success-fg);\n font-size: var(--text-xs-size);\n font-variant-numeric: tabular-nums;\n}\n\n/* A narrow memo: labels above their lines, and each action's state under its text. */\n@container (max-width: 460px) {\n .memoFacts > div {\n grid-template-columns: minmax(0, 1fr);\n gap: var(--space-1);\n }\n\n .memoActions > li {\n grid-template-columns: auto minmax(0, 1fr);\n row-gap: var(--space-2);\n }\n\n .memoActions > li > :last-child {\n grid-column: 2;\n justify-self: start;\n }\n}\n\n.more summary {\n color: var(--text-link);\n font-size: var(--text-xs-size);\n cursor: pointer;\n}\n\n.more[open] summary {\n margin-bottom: var(--space-2);\n}\n\n/* ---- question ---------------------------------------------------------- */\n.question {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n max-width: 720px;\n padding: var(--space-3);\n border: 1px solid var(--border-default);\n border-left: 2px solid var(--accent-500);\n border-radius: var(--radius-md);\n background: var(--bg-canvas);\n transition: box-shadow var(--duration-base) var(--ease-standard);\n}\n\n.question[data-answered='true'] {\n border-left-color: var(--status-success-solid);\n}\n\n.question[data-focused='true'] {\n box-shadow: var(--shadow-focus-ring);\n}\n\n.answered {\n display: flex;\n align-items: center;\n gap: var(--space-1);\n margin: 0;\n min-width: 0;\n color: var(--status-success-fg);\n font-size: var(--text-xs-size);\n}\n\n.answered svg {\n flex: none;\n width: 12px;\n height: 12px;\n}\n\n.answeredText {\n overflow: hidden;\n color: var(--text-secondary);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* ---- directive in the thread ------------------------------------------- */\n.directiveNote {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n max-width: 100%;\n margin: 0;\n padding: var(--space-1) var(--space-3);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-full);\n background: var(--bg-surface-raised);\n}\n\n.directiveNoteText {\n overflow: hidden;\n color: var(--text-primary);\n font-size: var(--text-xs-size);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* ---- composer ---------------------------------------------------------- */\n.foot {\n padding: var(--space-3) var(--card-pad) var(--card-pad);\n border-top: 1px solid var(--border-subtle);\n}\n\n.composer {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n}\n\n.composerContext {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n min-width: 0;\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n}\n\n.composerContextText {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.composerRow {\n display: flex;\n align-items: flex-end;\n gap: var(--space-2);\n padding: var(--space-1) var(--space-1) var(--space-1) var(--space-3);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-lg);\n background: var(--bg-input);\n transition: border-color var(--duration-fast) var(--ease-standard);\n}\n\n.composerRow:focus-within {\n border-color: var(--border-focus);\n}\n\n.composer[data-variant='answer'] .composerRow {\n border-radius: var(--radius-md);\n}\n\n.composer[data-disabled='true'] .composerRow {\n background: var(--bg-canvas);\n}\n\n.composerBox {\n flex: 1;\n min-width: 0;\n min-height: var(--control-h-sm);\n padding: var(--space-1) 0;\n border: 0;\n background: none;\n color: var(--text-primary);\n font: inherit;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n resize: none;\n overflow-y: hidden;\n}\n\n.composerBox:focus {\n outline: none;\n}\n\n.composerBox::placeholder {\n color: var(--text-tertiary);\n}\n\n.send {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: var(--control-h-sm);\n height: var(--control-h-sm);\n padding: 0;\n border: 0;\n border-radius: var(--radius-md);\n background: var(--accent-600);\n color: var(--text-on-accent);\n cursor: pointer;\n transition: opacity var(--duration-fast) var(--ease-standard);\n}\n\n.send svg {\n width: 14px;\n height: 14px;\n}\n\n.send:disabled {\n background: var(--bg-active);\n color: var(--text-disabled);\n cursor: default;\n}\n\n.composerHint {\n display: flex;\n justify-content: flex-end;\n gap: var(--space-3);\n margin: 0;\n color: var(--text-tertiary);\n font-size: var(--text-2xs-size);\n line-height: var(--text-xs-line);\n}\n\n.counter {\n font-variant-numeric: tabular-nums;\n}\n\n.counter[data-over='true'] {\n color: var(--status-danger-fg);\n}\n\n.key {\n display: inline-block;\n min-width: 14px;\n padding: 0 2px;\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-xs);\n font-family: var(--font-ui);\n text-align: center;\n}\n","/**\n * routes/verse/leader/DirectivesStrip.tsx — Mason's standing instructions to\n * the Leader, pinned above the conversation as chips.\n *\n * DIRECTIVES [Ship binshield before new goals ×] [No spend raises at night ×] + Add directive\n *\n * × retires one (token, no confirmation: a directive can be added back in a\n * second, and retiring one only removes an instruction). \"+ Add directive\"\n * opens an inline box: Enter adds, Escape cancels. Both go through the\n * surface's actions (token prompt, read-only explanation, the server's own\n * refusal sentence on the Mind action line).\n */\nimport { useEffect, useRef, useState, type KeyboardEvent } from 'react';\nimport { IconPlus, IconX } from '../../../components/primitives/icons.js';\nimport type { SurfaceActions } from '../command/actions.js';\nimport type { OptionalRead } from '../command/surface-data.js';\nimport { addLeaderDirective, retireLeaderDirective } from './thread-data.js';\nimport { CHANNEL_LABEL } from './thread-model.js';\nimport type { DirectiveChip } from './thread-types.js';\nimport styles from './leader.module.css';\n\nexport const DIRECTIVE_MAX = 500;\n\nexport interface DirectivesStripProps {\n read: OptionalRead<DirectiveChip[]> | undefined;\n actions: SurfaceActions;\n /** The inline add box is open (the panel opens it for ⌘K \"Add Leader directive…\"). */\n adding: boolean;\n onAddingChange: (adding: boolean) => void;\n}\n\nexport function DirectivesStrip({ read, actions, adding, onAddingChange }: DirectivesStripProps) {\n const [draft, setDraft] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n useEffect(() => {\n if (adding) inputRef.current?.focus();\n }, [adding]);\n\n const list = read?.value ?? null;\n const disabled = actions.busy || actions.readOnly;\n\n function add() {\n const text = draft.trim();\n if (!text || text.length > DIRECTIVE_MAX) return;\n actions.act(() => addLeaderDirective(text), 'Adding a Leader directive requires the dispatch token.', {\n onDone: () => {\n setDraft('');\n onAddingChange(false);\n },\n });\n }\n\n function onKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n setDraft('');\n onAddingChange(false);\n return;\n }\n if (event.key === 'Enter' && !event.nativeEvent.isComposing) {\n event.preventDefault();\n event.stopPropagation();\n add();\n }\n }\n\n return (\n <div className={styles.directives} role=\"group\" aria-label=\"Directives\">\n <span className={styles.micro}>Directives</span>\n {!read ? (\n <span className={styles.muted} aria-busy=\"true\">Reading…</span>\n ) : list === null ? (\n <span className={styles.muted}>{read.reason ?? 'Directives did not answer.'}</span>\n ) : list.length === 0 && !adding ? (\n <span className={styles.muted}>None standing — the Leader works from its own judgment.</span>\n ) : (\n <ul className={styles.chips}>\n {list.map((d) => (\n <li key={d.id} className={styles.directiveChip} title={[d.text, d.channel ? `added from ${CHANNEL_LABEL[d.channel]}` : null].filter(Boolean).join(' — ')}>\n <span className={styles.pin} aria-hidden=\"true\" />\n <span className={styles.directiveText}>{d.text}</span>\n <button\n type=\"button\"\n className={styles.iconButton}\n aria-label={`Retire directive: ${d.text}`}\n disabled={disabled}\n onClick={() => actions.act(() => retireLeaderDirective(d.id), 'Retiring a Leader directive requires the dispatch token.')}\n >\n <IconX />\n </button>\n </li>\n ))}\n </ul>\n )}\n {adding ? (\n <span className={styles.addDirective}>\n <input\n ref={inputRef}\n className={styles.directiveInput}\n aria-label=\"New directive\"\n placeholder=\"e.g. No new goals until binshield ships\"\n value={draft}\n maxLength={DIRECTIVE_MAX}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={onKeyDown}\n onBlur={() => {\n // An empty box closes on blur; words typed stay until Escape or Add.\n if (!draft.trim()) onAddingChange(false);\n }}\n />\n <button type=\"button\" className={styles.textButton} disabled={disabled || !draft.trim()} onClick={add}>\n Add\n </button>\n </span>\n ) : list !== null ? (\n <button type=\"button\" className={styles.textButton} disabled={actions.readOnly} onClick={() => onAddingChange(true)}>\n <IconPlus /> Add directive\n </button>\n ) : null}\n </div>\n );\n}\n","/**\n * routes/verse/leader/LeaderComposer.tsx — the Leader conversation's input:\n * a growing text box and one Send button. Deliberately NOT the chat\n * composer (no seats, models, attachments or slash commands — the Leader\n * reads words).\n *\n * Enter sends · Shift+Enter is a new line · an IME composition is never\n * sent mid-word · an empty or whitespace box never sends.\n *\n * Also the inline answer box under a Leader question (`variant=\"answer\"`):\n * the same keys, one line to start.\n */\nimport { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, type KeyboardEvent } from 'react';\nimport { IconSend, IconX } from '../../../components/primitives/icons.js';\nimport { LEADER_MESSAGE_MAX } from './thread-model.js';\nimport styles from './leader.module.css';\n\nexport interface LeaderComposerHandle {\n focus: () => void;\n}\n\nexport interface LeaderComposerProps {\n value: string;\n onChange: (value: string) => void;\n /** Called with the trimmed text; the owner clears `value` when the send starts. */\n onSend: (text: string) => void;\n label: string;\n placeholder: string;\n /** Why sending is off right now (read-only session, route absent); null = on. */\n disabledReason?: string | null;\n variant?: 'thread' | 'answer';\n /** A line above the box (\"Answering: …\") with a way to drop it. */\n context?: { label: string; onClear: () => void } | null;\n autoFocus?: boolean;\n /** Grow up to this many lines before scrolling. */\n maxLines?: number;\n}\n\n/** Grow the box to its content, up to `maxLines`. */\nfunction fit(el: HTMLTextAreaElement, maxLines: number): void {\n el.style.height = 'auto';\n const line = Number.parseFloat(getComputedStyle(el).lineHeight) || 20;\n const pad = el.offsetHeight - el.clientHeight;\n const max = line * maxLines + pad + 16;\n el.style.height = `${Math.min(el.scrollHeight + pad, max)}px`;\n el.style.overflowY = el.scrollHeight + pad > max ? 'auto' : 'hidden';\n}\n\nexport const LeaderComposer = forwardRef<LeaderComposerHandle, LeaderComposerProps>(function LeaderComposer(\n { value, onChange, onSend, label, placeholder, disabledReason = null, variant = 'thread', context = null, autoFocus = false, maxLines = 8 },\n ref,\n) {\n const boxRef = useRef<HTMLTextAreaElement>(null);\n useImperativeHandle(ref, () => ({ focus: () => boxRef.current?.focus({ preventScroll: false }) }), []);\n\n useEffect(() => {\n if (boxRef.current) fit(boxRef.current, maxLines);\n }, [value, maxLines]);\n\n const trimmed = value.trim();\n const over = value.length > LEADER_MESSAGE_MAX;\n const canSend = trimmed.length > 0 && !over && disabledReason === null;\n\n const send = useCallback(() => {\n if (!canSend) return;\n onSend(trimmed);\n }, [canSend, onSend, trimmed]);\n\n function onKeyDown(event: KeyboardEvent<HTMLTextAreaElement>) {\n if (event.key !== 'Enter' || event.shiftKey || event.altKey) return;\n // Mid-composition (Japanese, Chinese, …) Enter picks a candidate, not \"send\".\n if (event.nativeEvent.isComposing || event.keyCode === 229) return;\n event.preventDefault();\n // Keep the key from reaching a shell or drawer shortcut.\n event.stopPropagation();\n send();\n }\n\n const near = value.length > LEADER_MESSAGE_MAX * 0.9;\n return (\n <div className={styles.composer} data-variant={variant} data-disabled={disabledReason !== null ? 'true' : undefined}>\n {context ? (\n <div className={styles.composerContext}>\n <span className={styles.composerContextText} title={context.label}>{context.label}</span>\n <button type=\"button\" className={styles.iconButton} aria-label=\"Stop answering this question\" onClick={context.onClear}>\n <IconX />\n </button>\n </div>\n ) : null}\n <div className={styles.composerRow}>\n <textarea\n ref={boxRef}\n className={styles.composerBox}\n aria-label={label}\n placeholder={disabledReason ?? placeholder}\n value={value}\n rows={1}\n disabled={disabledReason !== null}\n // Only when the operator asked for this box (a Needs-you \"Answer\").\n autoFocus={autoFocus}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={onKeyDown}\n aria-invalid={over || undefined}\n />\n <button type=\"button\" className={styles.send} aria-label={variant === 'answer' ? 'Send answer' : 'Send to the Leader'} disabled={!canSend} onClick={send}>\n <IconSend />\n </button>\n </div>\n {variant === 'thread' ? (\n <p className={styles.composerHint}>\n {near ? (\n <span className={styles.counter} data-over={over ? 'true' : undefined}>\n {value.length.toLocaleString('en-US')} / {LEADER_MESSAGE_MAX.toLocaleString('en-US')}\n </span>\n ) : null}\n <span>\n <kbd className={styles.key}>↵</kbd> send · <kbd className={styles.key}>Shift</kbd> <kbd className={styles.key}>↵</kbd> new line\n </span>\n </p>\n ) : null}\n </div>\n );\n});\n","/**\n * routes/verse/leader/ThreadItems.tsx — how each kind of Leader-thread\n * message draws (grouping and order are thread-model.ts; state and sends\n * are LeaderConversation.tsx).\n *\n * message / update Leader: prose (sanitised Markdown), left\n * Mason: a quiet bubble (plain text), right\n * memo a card: bottleneck, the move (+ expected delta), the\n * actions with their class chip, veto countdown and\n * [Approve] [Veto]; a dry-run memo says so and offers none\n * question the question and, until answered, its answer box\n * answer Mason's bubble, headed by the question it answers\n * directive a pinned chip (\"Directive · …\")\n * action the Leader's note plus the actions it is about\n * system one centred quiet line\n * pending Mason's bubble while sending; on failure the reason,\n * Retry and Discard\n *\n * Memo and action fields are the Leader's own text: plain text, like the\n * rest of Mind. Conversational text goes through MessageMarkdown, the chat's\n * sanitising renderer (DOMPurify; links open in a new tab, no HTML survives).\n */\nimport type { LeaderAction, LeaderStateV1 } from '../../../../core/vision/leader-types.js';\nimport { IconCheck } from '../../../components/primitives/icons.js';\nimport { MessageMarkdown } from '../MessageMarkdown.js';\nimport type { SurfaceActions } from '../command/actions.js';\nimport { ActionRow } from '../command/LeaderCard.js';\nimport { scrollToAnchor } from '../command/nav.js';\nimport commandStyles from '../command/command.module.css';\nimport { expectedDeltaText, memoActions } from '../mind/leader-model.js';\nimport { LeaderComposer } from './LeaderComposer.js';\nimport { CHANNEL_LABEL, clockTime, previewText, type PendingMessage, type ThreadEntry, type ThreadRow } from './thread-model.js';\nimport type { LeaderThreadChannel, LeaderThreadMessage } from './thread-types.js';\nimport styles from './leader.module.css';\n\nexport function ChannelBadge({ channel }: { channel: LeaderThreadChannel }) {\n return (\n <span className={styles.channel} data-channel={channel} title={`Sent via ${CHANNEL_LABEL[channel]}`}>\n {CHANNEL_LABEL[channel]}\n </span>\n );\n}\n\n/** \"Also sent to Telegram\" / \"Telegram: not delivered\" — only what the server reported. */\nexport function deliveryNote(delivery: LeaderThreadMessage['delivery']): { text: string; failed: boolean } | null {\n switch (delivery?.telegram) {\n case 'sent':\n return { text: 'Also sent to Telegram', failed: false };\n case 'failed':\n return { text: 'Telegram: not delivered', failed: true };\n case 'pending':\n return { text: 'Sending to Telegram…', failed: false };\n default:\n return null;\n }\n}\n\nfunction DeliveryNote({ message }: { message: LeaderThreadMessage }) {\n const note = deliveryNote(message.delivery);\n return note ? <span className={styles.delivery} data-failed={note.failed ? 'true' : undefined}>{note.text}</span> : null;\n}\n\nexport interface ThreadContext {\n leader: LeaderStateV1 | null;\n actions: SurfaceActions;\n /** question message id → its answer. */\n answered: ReadonlyMap<string, LeaderThreadMessage>;\n /** Every known message by id (an answer names its question). */\n byId: ReadonlyMap<string, LeaderThreadMessage>;\n /** Question ids with an answer in flight. */\n answering: ReadonlySet<string>;\n /** The question whose box should take focus (a Needs-you \"Answer\"). */\n focusQuestionId: string | null;\n answerDraft: (questionMessageId: string) => string;\n setAnswerDraft: (questionMessageId: string, text: string) => void;\n onAnswer: (question: LeaderThreadMessage, text: string) => void;\n onRetry: (clientId: string) => void;\n onDiscard: (clientId: string) => void;\n /** Why sending is off (read-only, route absent); null = on. */\n sendDisabledReason: string | null;\n /** Autonomy is off: memos are dry runs. */\n dormant: boolean;\n}\n\n/** The question an answer closes, by its id or the message it replies to. */\nfunction questionOf(m: LeaderThreadMessage, ctx: ThreadContext): LeaderThreadMessage | null {\n if (m.replyTo) {\n const q = ctx.byId.get(m.replyTo);\n if (q) return q;\n }\n if (m.questionId) {\n for (const q of ctx.byId.values()) if (q.kind === 'question' && q.questionId === m.questionId) return q;\n }\n return null;\n}\n\nfunction MemoCard({ message, ctx }: { message: LeaderThreadMessage; ctx: ThreadContext }) {\n const { leader } = ctx;\n const memoId = message.memoId ?? null;\n const memo = memoId && leader?.latest?.id === memoId ? leader.latest : null;\n const summary = memoId ? leader?.timeline.find((t) => t.id === memoId) ?? null : null;\n let list: LeaderAction[] = [];\n if (leader) {\n if (memo) list = memoActions(leader);\n else if (message.actionIds) list = message.actionIds.flatMap((id) => leader.actions.find((a) => a.id === id) ?? []);\n else if (memoId) list = leader.actions.filter((a) => a.memoId === memoId);\n }\n const bottleneck = memo?.bottleneck?.statement ?? summary?.bottleneck ?? null;\n const move = memo?.move?.statement ?? summary?.move ?? null;\n const delta = expectedDeltaText(memo?.move?.expectedDelta ?? summary?.expectedDelta ?? null);\n const dryRun = memo?.dryRun ?? false;\n const structured = bottleneck !== null || move !== null || list.length > 0;\n return (\n <article className={styles.memoCard} aria-label=\"Leader memo\" data-dry-run={dryRun ? 'true' : undefined}>\n <header className={styles.memoHead}>\n <span className={styles.micro}>Memo</span>\n {dryRun ? <span className={commandStyles.dryRun}>Dry run</span> : null}\n {summary ? (\n <button type=\"button\" className={styles.textButton} onClick={() => scrollToAnchor(`memo-${summary.id}`)}>\n In the timeline\n </button>\n ) : null}\n </header>\n {structured ? (\n <dl className={styles.memoFacts}>\n {bottleneck ? (\n <div>\n <dt className={styles.micro}>Bottleneck</dt>\n <dd>{bottleneck}</dd>\n </div>\n ) : null}\n {move ? (\n <div>\n <dt className={styles.micro}>The move</dt>\n <dd>\n {move}\n {delta ? <span className={styles.delta}>{delta}</span> : null}\n </dd>\n </div>\n ) : null}\n </dl>\n ) : (\n <div className={styles.prose}>\n <MessageMarkdown text={message.text} />\n </div>\n )}\n {list.length ? (\n <ul className={`${commandStyles.actionList} ${styles.memoActions}`} aria-label=\"Memo actions\">\n {list.map((a) => (\n <ActionRow key={a.id} action={a} actions={ctx.actions} approve dryRun={dryRun} anchored={false} />\n ))}\n </ul>\n ) : null}\n {dryRun ? (\n <p className={styles.muted}>\n {ctx.dormant ? 'Autonomy is off, so this memo is a dry run — its actions are shown, never applied.' : 'Shadow stage — these actions are shown, never applied.'}\n </p>\n ) : null}\n {structured && message.text.trim() ? (\n <details className={styles.more}>\n <summary>The Leader’s note</summary>\n <div className={styles.prose}>\n <MessageMarkdown text={message.text} />\n </div>\n </details>\n ) : null}\n </article>\n );\n}\n\nfunction QuestionCard({ message, ctx }: { message: LeaderThreadMessage; ctx: ThreadContext }) {\n const answer = ctx.answered.get(message.id) ?? null;\n const sending = ctx.answering.has(message.questionId ?? message.id);\n return (\n <article className={styles.question} aria-label=\"Leader question\" data-answered={answer ? 'true' : undefined} data-focused={ctx.focusQuestionId === message.id ? 'true' : undefined} data-question-id={message.id}>\n <span className={styles.micro}>Question{message.memoId ? ' · from the memo' : ''}</span>\n <div className={styles.prose}>\n <MessageMarkdown text={message.text} />\n </div>\n {answer ? (\n <p className={styles.answered}>\n <IconCheck /> Answered{answer.channel !== 'verse' ? ` on ${CHANNEL_LABEL[answer.channel]}` : ''} · <span className={styles.answeredText}>{previewText(answer.text, 120)}</span>\n </p>\n ) : sending ? (\n <p className={styles.muted} role=\"status\">Sending your answer…</p>\n ) : (\n <LeaderComposer\n variant=\"answer\"\n label={`Answer the Leader: ${previewText(message.text, 80)}`}\n placeholder=\"Answer the Leader…\"\n value={ctx.answerDraft(message.id)}\n onChange={(v) => ctx.setAnswerDraft(message.id, v)}\n onSend={(text) => ctx.onAnswer(message, text)}\n disabledReason={ctx.sendDisabledReason}\n autoFocus={ctx.focusQuestionId === message.id}\n maxLines={6}\n />\n )}\n </article>\n );\n}\n\nfunction ActionNote({ message, ctx }: { message: LeaderThreadMessage; ctx: ThreadContext }) {\n const list = ctx.leader && message.actionIds ? message.actionIds.flatMap((id) => ctx.leader!.actions.find((a) => a.id === id) ?? []) : [];\n return (\n <div className={styles.leaderText}>\n <div className={styles.prose}>\n <MessageMarkdown text={message.text} />\n </div>\n {list.length ? (\n <ul className={`${commandStyles.actionList} ${styles.memoActions}`} aria-label=\"Actions\">\n {list.map((a) => (\n <ActionRow key={a.id} action={a} actions={ctx.actions} approve compact anchored={false} />\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n\nfunction MasonBubble({ message, ctx }: { message: LeaderThreadMessage; ctx: ThreadContext }) {\n const question = message.kind === 'answer' || message.replyTo ? questionOf(message, ctx) : null;\n return (\n <div className={styles.masonItem}>\n {question ? <span className={styles.replyTo} title={question.text}>Re: {previewText(question.text, 90)}</span> : null}\n {/* Mason's words, possibly from Telegram: plain text, never HTML. */}\n <p className={styles.bubble}>{message.text}</p>\n <DeliveryNote message={message} />\n </div>\n );\n}\n\nfunction PendingBubble({ pending, ctx }: { pending: PendingMessage; ctx: ThreadContext }) {\n return (\n <div className={styles.masonItem} data-state={pending.state}>\n <p className={styles.bubble} data-state={pending.state}>{pending.text}</p>\n {pending.state === 'sending' ? (\n <span className={styles.delivery}>Sending…</span>\n ) : (\n <span className={styles.failed} role=\"alert\">\n Not sent{pending.error ? ` — ${pending.error.replace(/\\.$/, '')}` : ''}.\n <button type=\"button\" className={styles.textButton} onClick={() => ctx.onRetry(pending.clientId)} disabled={ctx.sendDisabledReason !== null}>\n Retry\n </button>\n <button type=\"button\" className={styles.textButton} onClick={() => ctx.onDiscard(pending.clientId)}>\n Discard\n </button>\n </span>\n )}\n </div>\n );\n}\n\nfunction DirectiveNote({ message }: { message: LeaderThreadMessage }) {\n return (\n <p className={styles.directiveNote}>\n <span className={styles.pin} aria-hidden=\"true\" />\n <span className={styles.micro}>Directive</span>\n <span className={styles.directiveNoteText}>{message.text}</span>\n </p>\n );\n}\n\nfunction EntryView({ entry, ctx }: { entry: ThreadEntry; ctx: ThreadContext }) {\n if (entry.type === 'pending') return <PendingBubble pending={entry.pending} ctx={ctx} />;\n const m = entry.message;\n switch (m.kind) {\n case 'memo':\n return <MemoCard message={m} ctx={ctx} />;\n case 'question':\n return <QuestionCard message={m} ctx={ctx} />;\n case 'directive':\n return <DirectiveNote message={m} />;\n case 'action':\n return m.from === 'leader' ? <ActionNote message={m} ctx={ctx} /> : <MasonBubble message={m} ctx={ctx} />;\n default:\n return m.from === 'mason' ? (\n <MasonBubble message={m} ctx={ctx} />\n ) : (\n <div className={styles.leaderText}>\n <div className={styles.prose}>\n <MessageMarkdown text={m.text} />\n </div>\n <DeliveryNote message={m} />\n </div>\n );\n }\n}\n\nexport function ThreadRows({ rows, ctx }: { rows: readonly ThreadRow[]; ctx: ThreadContext }) {\n return (\n <>\n {rows.map((row) => {\n if (row.type === 'day') {\n return (\n <div key={row.key} className={styles.day} role=\"separator\" aria-label={row.label}>\n <span>{row.label}</span>\n </div>\n );\n }\n if (row.type === 'system') {\n return (\n <p key={row.key} className={styles.system} data-message-id={row.entry.message.id}>\n {row.entry.message.text} <time dateTime={row.entry.message.at}>{clockTime(row.entry.message.at)}</time>\n </p>\n );\n }\n const leader = row.from === 'leader';\n return (\n <section key={row.key} className={styles.group} data-from={row.from} aria-label={`${leader ? 'Leader' : 'You'}, ${clockTime(row.at)}`}>\n <header className={styles.groupHead}>\n <span className={styles.avatar} data-from={row.from} aria-hidden=\"true\">{leader ? 'L' : 'M'}</span>\n <span className={styles.who}>{leader ? 'Leader' : 'You'}</span>\n <ChannelBadge channel={row.channel} />\n <time className={styles.time} dateTime={row.at} title={new Date(row.at).toLocaleString('en-US')}>\n {clockTime(row.at)}\n </time>\n </header>\n <div className={styles.groupBody}>\n {row.entries.map((e) => (\n <div key={e.key} className={styles.entry} data-message-id={e.type === 'message' ? e.message.id : undefined} data-kind={e.type === 'message' ? e.message.kind : 'pending'}>\n <EntryView entry={e} ctx={ctx} />\n </div>\n ))}\n </div>\n </section>\n );\n })}\n </>\n );\n}\n","/**\n * routes/verse/leader/LeaderConversation.tsx — talk to the Leader: the heart\n * of Mind (⌘4). Loaded lazily by MindSection (its own chunk: the chat's\n * first paint never pays for it).\n *\n * ┌ Leader ───────────────────── One thread · Verse, Telegram, CLI ─ ● Autonomy off ┐\n * │ DIRECTIVES [Ship binshield first ×] [+ Add directive] │\n * │ ─────────────────────────── Today ─────────────────────────── │\n * │ L Leader · Telegram · 9:14 AM │\n * │ ┌ MEMO ───────────────────────────────── Dry run ┐ │\n * │ │ BOTTLENECK Judge queue on grok-a… │ │\n * │ │ THE MOVE Raise Grok to 3 lanes +4 merges/day by Fri │\n * │ │ [B] Raise Grok to 3 lanes ◔ 18m [Approve] [Veto] │\n * │ ┌ QUESTION Should measurably stay at local enforcement…? │\n * │ │ [ Answer the Leader… ↑ ] │\n * │ You · Verse · 9:20 AM [ Yes, keep… ]│\n * │ ··· Leader is thinking… │\n * │ [ Message the Leader… ↑ ] │\n * └────────────────────────────────────────────────────────────────────────────────┘\n *\n * SENDING is optimistic: the words appear at once as a pending bubble; the\n * server's copy replaces it (thread-model mergeThread dedupes, even when a\n * poll lands before the POST returns); a failure keeps the words with the\n * server's reason, Retry and Discard. Every send needs the mutation token —\n * without one the token dialog opens FIRST and the draft stays in the box\n * until it is unlocked (cancelling loses nothing).\n *\n * \"Leader is thinking…\" shows while a send is in flight and, when the server\n * said it will reply later (reply: null), until the Leader's next message —\n * for at most AWAIT_REPLY_MS. Meanwhile the thread polls every 3 s instead\n * of 10 s. There is no Leader event stream to subscribe to (/api/events has\n * no leader topic), so polling while visible is the honest refresh.\n */\nimport { useCallback, useEffect, useId, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';\nimport type { LeaderStateV1 } from '../../../../core/vision/leader-types.js';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { hasMutationHold } from '../../../data/auth-store.js';\nimport { DispatchDisabledError } from '../../../data/client.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { describeControlError } from '../autonomy/use-guarded-action.js';\nimport { useNow } from '../autonomy/use-ticker.js';\nimport type { SurfaceActions } from '../command/actions.js';\nimport type { OptionalRead } from '../command/surface-data.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { DirectivesStrip } from './DirectivesStrip.js';\nimport { getLeaderFocus, isLeaderFocusLive, subscribeLeaderFocus, takeLeaderFocus } from './leader-focus.js';\nimport { LeaderComposer, type LeaderComposerHandle } from './LeaderComposer.js';\nimport { answerLeaderQuestion, fetchOlderThread, leaderDirectivesQuery, leaderThreadQuery, sendLeaderMessage, THREAD_PAGE_SIZE } from './thread-data.js';\nimport {\n answeredQuestions,\n awaitingReply,\n findQuestion,\n groupThread,\n mergeThread,\n previewText,\n type PendingMessage,\n} from './thread-model.js';\nimport { ThreadRows, type ThreadContext } from './ThreadItems.js';\nimport type { LeaderThreadMessage } from './thread-types.js';\nimport styles from './leader.module.css';\n\nexport const THREAD_POLL_MS = 10_000;\nexport const THREAD_POLL_THINKING_MS = 3_000;\nexport const DIRECTIVES_POLL_MS = 30_000;\n\nconst SEND_TOKEN_REASON = 'Messaging the Leader requires the dispatch token.';\n\n/** A thread scrolled within this of its end counts as \"at the end\" (new messages follow it down). */\nconst STICK_PX = 96;\n\nconst SUGGESTIONS = ['What is the bottleneck right now?', 'Why this move, and what would change your mind?', 'What would you do with more Claude budget?'];\n\nexport interface LeaderConversationProps {\n /** The Leader's state (Mind already reads it): memo cards and action rows come from here. */\n leader: OptionalRead<LeaderStateV1> | undefined;\n /** Mind's actions: Approve / Veto / directives share its confirm → token → error line. */\n actions: SurfaceActions;\n /** Autonomy is off: the Leader still talks, its memos are dry runs. */\n dormant: boolean;\n}\n\n/**\n * Token first, then the send — so a cancelled unlock never leaves a\n * phantom pending bubble, and the draft is still in the box.\n */\nfunction useTokenGate() {\n const [open, setOpen] = useState(false);\n const [reason, setReason] = useState('');\n const next = useRef<(() => void) | null>(null);\n const run = useCallback((why: string, fn: () => void) => {\n if (hasMutationHold()) {\n fn();\n return;\n }\n next.current = fn;\n setReason(why);\n setOpen(true);\n }, []);\n const close = useCallback(() => {\n setOpen(false);\n const fn = next.current;\n next.current = null;\n // Read live: the dialog closes synchronously after the token is set.\n if (fn && hasMutationHold()) fn();\n }, []);\n return { run, dialog: <MutationTokenDialog open={open} onClose={close} reason={reason} tokenHelp=\"the mutation token ashlr verse printed\" /> };\n}\n\nlet localSeq = 0;\n\nexport function LeaderConversation({ leader, actions, dormant }: LeaderConversationProps) {\n const titleId = useId();\n const thread = useQuery(leaderThreadQuery, { freshMs: 5_000 });\n const refetchThread = useRefetch(leaderThreadQuery);\n const directives = useQuery(leaderDirectivesQuery, { freshMs: 30_000 });\n const refetchDirectives = useRefetch(leaderDirectivesQuery);\n const gate = useTokenGate();\n // Day labels and the \"thinking\" time-out only: a coarse tick is plenty.\n const now = useNow(10_000);\n\n const [older, setOlder] = useState<LeaderThreadMessage[]>([]);\n const [olderState, setOlderState] = useState<'idle' | 'loading' | 'done' | 'error'>('idle');\n const [received, setReceived] = useState<LeaderThreadMessage[]>([]);\n const [pending, setPending] = useState<PendingMessage[]>([]);\n const [awaiting, setAwaiting] = useState<ReadonlySet<string>>(() => new Set());\n const [draft, setDraft] = useState('');\n /** A Needs-you question the thread has no message for: answered as a quoted message. */\n const [quote, setQuote] = useState<string | null>(null);\n const [answerDrafts, setAnswerDrafts] = useState<Record<string, string>>({});\n const [focusQuestionId, setFocusQuestionId] = useState<string | null>(null);\n const [addingDirective, setAddingDirective] = useState(false);\n const [readOnly, setReadOnly] = useState(false);\n\n const composerRef = useRef<LeaderComposerHandle>(null);\n const logRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const atEnd = useRef(true);\n const stick = useRef(true);\n\n const read = thread.data;\n const page = read?.value?.messages ?? null;\n const entries = useMemo(() => mergeThread(page ? [older, page] : [older], received, pending), [older, page, received, pending]);\n const messages = useMemo(() => entries.flatMap((e) => (e.type === 'message' ? [e.message] : [])), [entries]);\n const byId = useMemo(() => new Map(messages.map((m) => [m.id, m])), [messages]);\n const answered = useMemo(() => answeredQuestions(messages), [messages]);\n const rows = useMemo(() => groupThread(entries, now), [entries, now]);\n const thinking = awaitingReply(entries, awaiting, now);\n\n usePollWhileVisible(refetchThread, thinking ? THREAD_POLL_THINKING_MS : THREAD_POLL_MS);\n usePollWhileVisible(refetchDirectives, DIRECTIVES_POLL_MS);\n\n // A send's echo is dropped once a server read carries it.\n useEffect(() => {\n if (!page || received.length === 0) return;\n const onPage = new Set(page.map((m) => m.id));\n if (received.some((m) => onPage.has(m.id))) setReceived((r) => r.filter((m) => !onPage.has(m.id)));\n }, [page, received]);\n\n const unavailable = read !== undefined && read.value === null;\n const sendDisabledReason =\n readOnly || actions.readOnly\n ? 'Read-only session — this server runs without dispatch, so messages cannot be sent.'\n : unavailable\n ? 'The conversation is not available on this server.'\n : null;\n\n // ---- sending ------------------------------------------------------------\n\n const deliver = useCallback(\n async (p: PendingMessage) => {\n try {\n const result =\n p.kind === 'answer' && p.questionId ? await answerLeaderQuestion(p.questionId, p.text) : await sendLeaderMessage(p.text, p.replyTo);\n setPending((ps) => ps.filter((x) => x.clientId !== p.clientId));\n if (result) {\n setReceived((r) => [...r, result.message, ...(result.reply ? [result.reply] : [])]);\n if (!result.reply) setAwaiting((a) => new Set(a).add(result.message.id));\n }\n stick.current = true;\n refetchThread();\n } catch (err) {\n if (err instanceof DispatchDisabledError) setReadOnly(true);\n setPending((ps) => ps.map((x) => (x.clientId === p.clientId ? { ...x, state: 'failed', error: describeControlError(err) } : x)));\n }\n },\n [refetchThread],\n );\n\n const submit = useCallback(\n (text: string, opts: { kind: 'message' | 'answer'; replyTo: string | null; questionId: string | null; onStart: () => void }) => {\n gate.run(SEND_TOKEN_REASON, () => {\n localSeq += 1;\n const p: PendingMessage = {\n clientId: `local-${localSeq}`,\n kind: opts.kind,\n text,\n at: new Date().toISOString(),\n replyTo: opts.replyTo,\n questionId: opts.questionId,\n state: 'sending',\n error: null,\n };\n opts.onStart();\n stick.current = true;\n setPending((ps) => [...ps, p]);\n void deliver(p);\n });\n },\n [gate, deliver],\n );\n\n const sendDraft = useCallback(\n (text: string) => {\n // A question the thread has no message for is answered as a quoted message.\n const body = quote ? `> ${quote.replace(/\\n/g, ' ')}\\n\\n${text}` : text;\n submit(body, {\n kind: 'message',\n replyTo: null,\n questionId: null,\n onStart: () => {\n setDraft('');\n setQuote(null);\n },\n });\n },\n [quote, submit],\n );\n\n const onAnswer = useCallback(\n (question: LeaderThreadMessage, text: string) => {\n submit(text, {\n kind: 'answer',\n replyTo: question.id,\n questionId: question.questionId ?? question.id,\n onStart: () => setAnswerDrafts((d) => ({ ...d, [question.id]: '' })),\n });\n },\n [submit],\n );\n\n const onRetry = useCallback(\n (clientId: string) => {\n gate.run(SEND_TOKEN_REASON, () => {\n const found = pending.find((x) => x.clientId === clientId);\n if (!found) return;\n // Retried now: it moves to the end of the thread, where a new send would sit.\n const again: PendingMessage = { ...found, state: 'sending', error: null, at: new Date().toISOString() };\n stick.current = true;\n setPending((ps) => ps.map((x) => (x.clientId === clientId ? again : x)));\n void deliver(again);\n });\n },\n [gate, pending, deliver],\n );\n\n const onDiscard = useCallback((clientId: string) => setPending((ps) => ps.filter((x) => x.clientId !== clientId)), []);\n\n // ---- focus requests (⌘K, Command, Needs-you) ------------------------------\n\n const request = useSyncExternalStore(subscribeLeaderFocus, getLeaderFocus, () => null);\n useEffect(() => {\n if (!request) return;\n if (!isLeaderFocusLive(request)) {\n takeLeaderFocus(request.seq);\n return;\n }\n if (request.kind === 'composer') {\n stick.current = true;\n composerRef.current?.focus();\n takeLeaderFocus(request.seq);\n return;\n }\n if (request.kind === 'directive') {\n setAddingDirective(true);\n takeLeaderFocus(request.seq);\n return;\n }\n // A question: wait for the first read, then find it.\n if (!read) return;\n const q = findQuestion(messages, request);\n if (q) setFocusQuestionId(q.id);\n else {\n setQuote(request.text ?? 'the Leader’s question');\n composerRef.current?.focus();\n }\n takeLeaderFocus(request.seq);\n }, [request, read, messages]);\n\n // Reveal the asked-for question; focus its answer box when it has one.\n useEffect(() => {\n if (!focusQuestionId) return;\n // Matched by dataset, not a selector: ids are server strings.\n const host = [...(logRef.current?.querySelectorAll<HTMLElement>('[data-question-id]') ?? [])].find((el) => el.dataset['questionId'] === focusQuestionId);\n if (!host) return;\n host.scrollIntoView?.({ block: 'center', behavior: 'smooth' });\n const box = host.querySelector<HTMLTextAreaElement>('textarea');\n box?.focus({ preventScroll: true });\n const t = window.setTimeout(() => setFocusQuestionId(null), 2_400);\n return () => window.clearTimeout(t);\n }, [focusQuestionId]);\n\n // ---- scrolling ------------------------------------------------------------\n\n const onScroll = useCallback(() => {\n const el = logRef.current;\n if (!el) return;\n atEnd.current = el.scrollHeight - el.scrollTop - el.clientHeight <= STICK_PX;\n }, []);\n\n const lastKey = entries.length ? entries[entries.length - 1]!.key : null;\n useLayoutEffect(() => {\n const el = logRef.current;\n if (!el) return;\n // Follow the conversation down only when the operator is already at its end (or just sent).\n if (stick.current || atEnd.current) el.scrollTop = el.scrollHeight;\n stick.current = false;\n }, [lastKey, thinking]);\n\n // Content also grows WITHOUT a new message — the Markdown chunk lands, the\n // Leader's state turns a memo's text into its card, a font swaps in. An\n // operator at the end stays at the end through all of it.\n useEffect(() => {\n const el = logRef.current;\n const content = contentRef.current;\n if (!el || !content || typeof ResizeObserver === 'undefined') return;\n // Judged against the height BEFORE this growth: the scroll event for the\n // growth can land first and call the operator \"not at the end\" when they were.\n let before = el.scrollHeight;\n const ro = new ResizeObserver(() => {\n const wasAtEnd = el.scrollTop + el.clientHeight >= before - STICK_PX;\n if (wasAtEnd || atEnd.current) {\n el.scrollTop = el.scrollHeight;\n atEnd.current = true;\n }\n before = el.scrollHeight;\n });\n ro.observe(content);\n return () => ro.disconnect();\n }, []);\n\n // ---- older pages ----------------------------------------------------------\n\n const oldestId = messages.length ? messages[0]!.id : null;\n const canLoadOlder = olderState !== 'done' && olderState !== 'loading' && (page?.length ?? 0) >= THREAD_PAGE_SIZE && oldestId !== null;\n const loadOlder = useCallback(async () => {\n if (!oldestId) return;\n const el = logRef.current;\n const before = el ? el.scrollHeight - el.scrollTop : 0;\n setOlderState('loading');\n try {\n const got = await fetchOlderThread(oldestId);\n setOlder((o) => [...got, ...o]);\n setOlderState(got.length < THREAD_PAGE_SIZE ? 'done' : 'idle');\n // Keep the operator's place: the page grows above them.\n requestAnimationFrame(() => {\n if (el) el.scrollTop = el.scrollHeight - before;\n });\n } catch {\n setOlderState('error');\n }\n }, [oldestId]);\n\n // ---- render ---------------------------------------------------------------\n\n const answering = useMemo(\n () => new Set(pending.filter((p) => p.kind === 'answer' && p.state === 'sending' && p.questionId).map((p) => p.questionId!)),\n [pending],\n );\n const ctx: ThreadContext = {\n leader: leader?.value ?? null,\n actions,\n answered,\n byId,\n answering,\n focusQuestionId,\n answerDraft: (id) => answerDrafts[id] ?? '',\n setAnswerDraft: (id, text) => setAnswerDrafts((d) => ({ ...d, [id]: text })),\n onAnswer,\n onRetry,\n onDiscard,\n sendDisabledReason,\n dormant,\n };\n\n return (\n <section className={styles.panel} aria-labelledby={titleId} data-testid=\"leader-conversation\">\n <header className={styles.head}>\n <span className={styles.heading}>\n <h3 id={titleId} className={styles.title}>Leader</h3>\n <span className={styles.caption}>One conversation across Verse, Telegram and the CLI</span>\n </span>\n {dormant ? (\n <span className={styles.dormant} title=\"The Leader still reads, answers and writes memos. With autonomy off, every memo is a dry run: its actions are shown, never applied.\">\n <span className={styles.dormantDot} aria-hidden=\"true\" />\n Autonomy off · memos are dry runs\n </span>\n ) : null}\n </header>\n\n <DirectivesStrip read={directives.data} actions={actions} adding={addingDirective} onAddingChange={setAddingDirective} />\n\n <div ref={logRef} className={styles.log} role=\"log\" aria-label=\"Conversation with the Leader\" aria-live=\"polite\" aria-relevant=\"additions\" onScroll={onScroll} tabIndex={0}>\n <div ref={contentRef} className={styles.logInner}>\n {canLoadOlder || olderState === 'error' || olderState === 'loading' ? (\n <div className={styles.older}>\n <button type=\"button\" className={styles.textButton} onClick={() => void loadOlder()} disabled={olderState === 'loading'}>\n {olderState === 'loading' ? 'Loading earlier messages…' : olderState === 'error' ? 'Earlier messages did not load — try again' : 'Load earlier messages'}\n </button>\n </div>\n ) : null}\n {!read ? (\n <p className={styles.placeholder} aria-busy=\"true\">Reading the conversation…</p>\n ) : unavailable && entries.length === 0 ? (\n <p className={styles.placeholder} data-tone=\"unknown\">{read.reason ?? 'The Leader conversation did not answer.'}</p>\n ) : entries.length === 0 ? (\n <div className={styles.empty}>\n <p className={styles.emptyTitle}>No conversation yet</p>\n <p className={styles.emptyBody}>\n Ask the Leader why it made a move, what it would do next, or give it a standing directive. Replies here also reach Telegram when it is connected.\n </p>\n {sendDisabledReason === null ? (\n <div className={styles.suggestions}>\n {SUGGESTIONS.map((s) => (\n <button\n key={s}\n type=\"button\"\n className={styles.suggestion}\n onClick={() => {\n setDraft(s);\n composerRef.current?.focus();\n }}\n >\n {s}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n ) : (\n <ThreadRows rows={rows} ctx={ctx} />\n )}\n {thinking ? (\n <p className={styles.thinking} role=\"status\">\n <span className={styles.dots} aria-hidden=\"true\">\n <span />\n <span />\n <span />\n </span>\n Leader is thinking…\n </p>\n ) : null}\n </div>\n </div>\n\n <div className={styles.foot}>\n <LeaderComposer\n ref={composerRef}\n label=\"Message the Leader\"\n placeholder=\"Message the Leader…\"\n value={draft}\n onChange={setDraft}\n onSend={sendDraft}\n disabledReason={sendDisabledReason}\n context={quote ? { label: `Answering: ${previewText(quote, 120)}`, onClear: () => setQuote(null) } : null}\n />\n </div>\n {gate.dialog}\n </section>\n );\n}\n\nexport default LeaderConversation;\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ ._panel_13qlu_9{border:1px solid var(--border-subtle);border-radius:var(--radius-lg);background:var(--bg-surface);flex-direction:column;min-width:0;display:flex}._head_13qlu_18{justify-content:space-between;align-items:flex-start;gap:var(--space-2) var(--space-3);padding:var(--card-pad) var(--card-pad) var(--space-2);flex-wrap:wrap;display:flex}._heading_13qlu_27{gap:var(--space-px);flex-direction:column;flex:240px;min-width:0;display:flex}._title_13qlu_35{color:var(--text-primary);font-size:var(--text-sm-size);line-height:var(--text-sm-line);font-weight:var(--font-weight-semibold);margin:0}._caption_13qlu_43{color:var(--text-tertiary);font-size:var(--text-xs-size);line-height:var(--text-xs-line)}._dormant_13qlu_49{align-items:center;gap:var(--space-2);padding:0 var(--space-2);border:1px solid var(--border-subtle);border-radius:var(--radius-full);color:var(--text-secondary);font-size:var(--text-xs-size);line-height:var(--text-sm-line);white-space:nowrap;flex:none;display:inline-flex}._dormantDot_13qlu_63{border-radius:var(--radius-full);background:var(--status-neutral-solid);width:6px;height:6px}._micro_13qlu_70{font-family:var(--font-display);font-size:var(--text-2xs-size);line-height:var(--text-2xs-line);letter-spacing:var(--tracking-label);text-transform:uppercase;color:var(--text-tertiary)}._muted_13qlu_79{color:var(--text-tertiary);font-size:var(--text-xs-size);line-height:var(--text-xs-line);margin:0}._textButton_13qlu_86{align-items:center;gap:var(--space-1);color:var(--text-link);font:inherit;font-size:var(--text-xs-size);cursor:pointer;background:0 0;border:0;padding:0;display:inline-flex}._textButton_13qlu_86:hover:not(:disabled){text-decoration:underline}._textButton_13qlu_86:disabled{color:var(--text-disabled);cursor:default}._textButton_13qlu_86 svg{width:12px;height:12px}._iconButton_13qlu_113{border-radius:var(--radius-xs);width:18px;height:18px;color:var(--text-tertiary);cursor:pointer;background:0 0;border:0;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}._iconButton_13qlu_113 svg{width:12px;height:12px}._iconButton_13qlu_113:hover:not(:disabled){background:var(--bg-hover);color:var(--text-primary)}._iconButton_13qlu_113:disabled{opacity:.4;cursor:default}._textButton_13qlu_86:focus-visible,._iconButton_13qlu_113:focus-visible,._suggestion_13qlu_145:focus-visible,._send_13qlu_146:focus-visible,._log_13qlu_147:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}._directives_13qlu_153{align-items:center;gap:var(--space-2);padding:var(--space-2) var(--card-pad);border-top:1px solid var(--border-subtle);flex-wrap:wrap;display:flex}._chips_13qlu_162{margin:0;padding:0;list-style:none;display:contents}._directiveChip_13qlu_169{align-items:center;gap:var(--space-1);max-width:100%;padding:0 var(--space-1) 0 var(--space-2);border:1px solid var(--border-default);border-radius:var(--radius-full);background:var(--bg-surface-raised);color:var(--text-primary);font-size:var(--text-xs-size);line-height:var(--text-sm-line);display:inline-flex}._directiveText_13qlu_183{text-overflow:ellipsis;white-space:nowrap;max-width:48ch;overflow:hidden}._pin_13qlu_190{border-radius:var(--radius-full);background:var(--accent-500);flex:none;width:6px;height:6px}._addDirective_13qlu_198{align-items:center;gap:var(--space-2);flex:240px;min-width:0;display:inline-flex}._directiveInput_13qlu_206{min-width:0;height:var(--control-h-xs);padding:0 var(--space-2);border:1px solid var(--border-default);border-radius:var(--radius-md);background:var(--bg-input);color:var(--text-primary);font:inherit;font-size:var(--text-xs-size);flex:1}._directiveInput_13qlu_206:focus{border-color:var(--border-focus);outline:none}._log_13qlu_147{min-height:240px;max-height:clamp(320px,62vh,760px);padding:var(--space-4) var(--card-pad);overscroll-behavior:contain;border-top:1px solid var(--border-subtle);scroll-padding-bottom:var(--space-4);flex-direction:column;display:flex;overflow-y:auto;container-type:inline-size}._logInner_13qlu_238{gap:var(--space-4);flex-direction:column;flex:1 0 auto;display:flex}@container (width<=520px){._groupBody_13qlu_247,._group_13qlu_247[data-from=mason] ._groupBody_13qlu_247{padding-left:0;padding-right:0}._thinking_13qlu_253{padding-left:0}._masonItem_13qlu_257{max-width:88%}}._older_13qlu_262{justify-content:center;display:flex}._placeholder_13qlu_267{color:var(--text-tertiary);font-size:var(--text-sm-size);text-align:center;margin:auto 0}._placeholder_13qlu_267[data-tone=unknown]{color:var(--status-unknown-fg)}._empty_13qlu_278{align-items:center;gap:var(--space-2);padding:var(--space-6) 0;text-align:center;flex-direction:column;margin:auto 0;display:flex}._emptyTitle_13qlu_288{color:var(--text-primary);font-size:var(--text-sm-size);font-weight:var(--font-weight-semibold);margin:0}._emptyBody_13qlu_295{max-width:var(--measure-read);color:var(--text-secondary);font-size:var(--text-sm-size);line-height:var(--text-sm-line-relaxed);margin:0}._suggestions_13qlu_303{justify-content:center;gap:var(--space-2);margin-top:var(--space-2);flex-wrap:wrap;display:flex}._suggestion_13qlu_145{padding:var(--space-1) var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-full);color:var(--text-secondary);font:inherit;font-size:var(--text-xs-size);cursor:pointer;transition:border-color var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);background:0 0}._suggestion_13qlu_145:hover{border-color:var(--border-strong);color:var(--text-primary)}._day_13qlu_328{align-items:center;gap:var(--space-3);color:var(--text-tertiary);font-size:var(--text-2xs-size);line-height:var(--text-2xs-line);letter-spacing:var(--tracking-label);text-transform:uppercase;font-family:var(--font-display);display:flex}._day_13qlu_328:before,._day_13qlu_328:after{content:"";background:var(--border-subtle);flex:1;height:1px}._system_13qlu_348{color:var(--text-tertiary);font-size:var(--text-xs-size);line-height:var(--text-xs-line);text-align:center;margin:0}._group_13qlu_247{gap:var(--space-2);flex-direction:column;min-width:0;display:flex}._group_13qlu_247[data-from=mason]{align-items:flex-end}._groupHead_13qlu_368{align-items:center;gap:var(--space-2);color:var(--text-tertiary);font-size:var(--text-xs-size);line-height:var(--text-xs-line);display:flex}._group_13qlu_247[data-from=mason] ._groupHead_13qlu_368{flex-direction:row-reverse}._avatar_13qlu_381{border-radius:var(--radius-sm);background:var(--accent-50);width:20px;height:20px;color:var(--accent-700);font-family:var(--font-display);font-size:var(--text-2xs-size);font-weight:var(--font-weight-semibold);flex:none;justify-content:center;align-items:center;display:inline-flex}._avatar_13qlu_381[data-from=mason]{background:var(--status-neutral-bg);color:var(--status-neutral-fg)}._who_13qlu_401{color:var(--text-primary);font-weight:var(--font-weight-semibold)}._time_13qlu_406{font-variant-numeric:tabular-nums}._channel_13qlu_410{padding:0 var(--space-1);border:1px solid var(--border-subtle);border-radius:var(--radius-xs);color:var(--text-tertiary);font-size:var(--text-2xs-size);line-height:var(--text-xs-line)}._channel_13qlu_410[data-channel=telegram]{border-color:var(--status-info-solid);color:var(--status-info-fg)}._channel_13qlu_410[data-channel=cli]{font-family:var(--font-mono)}._groupBody_13qlu_247{gap:var(--space-2);width:100%;min-width:0;padding-left:calc(20px + var(--space-2));flex-direction:column;display:flex}._group_13qlu_247[data-from=mason] ._groupBody_13qlu_247{padding-left:0;padding-right:calc(20px + var(--space-2));align-items:flex-end}._entry_13qlu_443{width:100%;min-width:0}._group_13qlu_247[data-from=mason] ._entry_13qlu_443{justify-content:flex-end;display:flex}._leaderText_13qlu_453{gap:var(--space-2);max-width:var(--measure-read);flex-direction:column;display:flex}._prose_13qlu_460{min-width:0;color:var(--text-primary);font-size:var(--text-sm-size);line-height:var(--text-sm-line-relaxed);overflow-wrap:anywhere}._masonItem_13qlu_257{align-items:flex-end;gap:var(--space-1);max-width:min(78%, var(--measure-read));flex-direction:column;display:flex}._bubble_13qlu_476{padding:var(--space-2) var(--space-3);border-radius:var(--radius-lg);background:var(--bg-surface-raised);border:1px solid var(--border-subtle);color:var(--text-primary);font-size:var(--text-sm-size);line-height:var(--text-sm-line-relaxed);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}._bubble_13qlu_476[data-state=sending]{opacity:.7}._bubble_13qlu_476[data-state=failed]{border-color:var(--status-danger-solid);border-style:dashed}._replyTo_13qlu_498{max-width:100%;color:var(--text-tertiary);font-size:var(--text-xs-size);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._delivery_13qlu_507{color:var(--text-tertiary);font-size:var(--text-2xs-size);line-height:var(--text-xs-line)}._delivery_13qlu_507[data-failed=true]{color:var(--status-warning-fg)}._failed_13qlu_517{justify-content:flex-end;gap:var(--space-2);color:var(--status-danger-fg);font-size:var(--text-xs-size);line-height:var(--text-xs-line);flex-wrap:wrap;display:inline-flex}._thinking_13qlu_253{align-items:center;gap:var(--space-2);padding-left:calc(20px + var(--space-2));color:var(--text-tertiary);font-size:var(--text-xs-size);margin:0;display:inline-flex}._dots_13qlu_537{gap:3px;display:inline-flex}._dots_13qlu_537 span{border-radius:var(--radius-full);background:var(--text-tertiary);width:4px;height:4px;animation:_leader-dot_13qlu_1 1.2s var(--ease-standard) infinite}._dots_13qlu_537 span:nth-child(2){animation-delay:.15s}._dots_13qlu_537 span:nth-child(3){animation-delay:.3s}@keyframes _leader-dot_13qlu_1{0%,80%,to{opacity:.3}40%{opacity:1}}@media (prefers-reduced-motion:reduce){._dots_13qlu_537 span{opacity:.6;animation:none}}._memoCard_13qlu_577{gap:var(--space-2);max-width:720px;padding:var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-md);background:var(--bg-canvas);flex-direction:column;display:flex;container-type:inline-size}._memoCard_13qlu_577[data-dry-run=true]{border-style:dashed}._memoHead_13qlu_593{align-items:center;gap:var(--space-2);display:flex}._memoHead_13qlu_593 ._textButton_13qlu_86{margin-left:auto}._memoFacts_13qlu_603{gap:var(--space-2);flex-direction:column;margin:0;display:flex}._memoFacts_13qlu_603>div{gap:var(--space-3);grid-template-columns:96px minmax(0,1fr);align-items:baseline;display:grid}._memoFacts_13qlu_603 dd{color:var(--text-primary);font-size:var(--text-sm-size);line-height:var(--text-sm-line);overflow-wrap:anywhere;margin:0}._delta_13qlu_625{margin-top:var(--space-1);color:var(--status-success-fg);font-size:var(--text-xs-size);font-variant-numeric:tabular-nums;display:block}@container (width<=460px){._memoFacts_13qlu_603>div{gap:var(--space-1);grid-template-columns:minmax(0,1fr)}._memoActions_13qlu_640>li{row-gap:var(--space-2);grid-template-columns:auto minmax(0,1fr)}._memoActions_13qlu_640>li>:last-child{grid-column:2;justify-self:start}}._more_13qlu_651 summary{color:var(--text-link);font-size:var(--text-xs-size);cursor:pointer}._more_13qlu_651[open] summary{margin-bottom:var(--space-2)}._question_13qlu_662{gap:var(--space-2);max-width:720px;padding:var(--space-3);border:1px solid var(--border-default);border-left:2px solid var(--accent-500);border-radius:var(--radius-md);background:var(--bg-canvas);transition:box-shadow var(--duration-base) var(--ease-standard);flex-direction:column;display:flex}._question_13qlu_662[data-answered=true]{border-left-color:var(--status-success-solid)}._question_13qlu_662[data-focused=true]{box-shadow:var(--shadow-focus-ring)}._answered_13qlu_683{align-items:center;gap:var(--space-1);min-width:0;color:var(--status-success-fg);font-size:var(--text-xs-size);margin:0;display:flex}._answered_13qlu_683 svg{flex:none;width:12px;height:12px}._answeredText_13qlu_699{color:var(--text-secondary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._directiveNote_13qlu_707{align-items:center;gap:var(--space-2);max-width:100%;padding:var(--space-1) var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-full);background:var(--bg-surface-raised);margin:0;display:inline-flex}._directiveNoteText_13qlu_719{color:var(--text-primary);font-size:var(--text-xs-size);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._foot_13qlu_728{padding:var(--space-3) var(--card-pad) var(--card-pad);border-top:1px solid var(--border-subtle)}._composer_13qlu_733{gap:var(--space-1);flex-direction:column;min-width:0;display:flex}._composerContext_13qlu_740{align-items:center;gap:var(--space-2);min-width:0;color:var(--text-secondary);font-size:var(--text-xs-size);display:flex}._composerContextText_13qlu_749{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._composerRow_13qlu_755{align-items:flex-end;gap:var(--space-2);padding:var(--space-1) var(--space-1) var(--space-1) var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-lg);background:var(--bg-input);transition:border-color var(--duration-fast) var(--ease-standard);display:flex}._composerRow_13qlu_755:focus-within{border-color:var(--border-focus)}._composer_13qlu_733[data-variant=answer] ._composerRow_13qlu_755{border-radius:var(--radius-md)}._composer_13qlu_733[data-disabled=true] ._composerRow_13qlu_755{background:var(--bg-canvas)}._composerBox_13qlu_778{min-width:0;min-height:var(--control-h-sm);padding:var(--space-1) 0;color:var(--text-primary);font:inherit;font-size:var(--text-sm-size);line-height:var(--text-sm-line);resize:none;background:0 0;border:0;flex:1;overflow-y:hidden}._composerBox_13qlu_778:focus{outline:none}._composerBox_13qlu_778::placeholder{color:var(--text-tertiary)}._send_13qlu_146{width:var(--control-h-sm);height:var(--control-h-sm);border-radius:var(--radius-md);background:var(--accent-600);color:var(--text-on-accent);cursor:pointer;transition:opacity var(--duration-fast) var(--ease-standard);border:0;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}._send_13qlu_146 svg{width:14px;height:14px}._send_13qlu_146:disabled{background:var(--bg-active);color:var(--text-disabled);cursor:default}._composerHint_13qlu_828{justify-content:flex-end;gap:var(--space-3);color:var(--text-tertiary);font-size:var(--text-2xs-size);line-height:var(--text-xs-line);margin:0;display:flex}._counter_13qlu_838{font-variant-numeric:tabular-nums}._counter_13qlu_838[data-over=true]{color:var(--status-danger-fg)}._key_13qlu_846{border:1px solid var(--border-subtle);border-radius:var(--radius-xs);min-width:14px;font-family:var(--font-ui);text-align:center;padding:0 2px;display:inline-block}
@@ -0,0 +1,2 @@
1
+ import{a as e,c as t,n}from"./index-DZ-UQ7v8.js";import{B as r,H as i,T as a,V as o,W as s,h as c,i as l,m as u,n as ee,r as d,t as f,z as p}from"./ChartFrame-DY-GVUb3.js";import{_ as m,c as h,g,h as _,l as v,m as y,u as b,y as x}from"./colors-DvK0wMHH.js";import{i as S,t as C}from"./format-D7nBg2bn.js";var w=t(e(),1),T={gauge:`_gauge_1y0vx_1`,readout:`_readout_1y0vx_8`,value:`_value_1y0vx_18`,unknownValue:`_unknownValue_1y0vx_24`,state:`_state_1y0vx_30`,caption:`_caption_1y0vx_43`,fit:`_fit_1y0vx_49`},E=n(),D={ok:`within limits`,warn:`near the limit`,danger:`at the limit`,unknown:`unknown`};function te(e){let[t,n]=(0,w.useState)(0),[r,i]=(0,w.useState)(null);return(0,w.useLayoutEffect)(()=>{e.current!==r&&i(e.current)}),(0,w.useLayoutEffect)(()=>{let e=r;if(!e)return;let t=()=>{let t=Math.floor(e.getBoundingClientRect().width);n(e=>e===t?e:t)};if(t(),typeof ResizeObserver>`u`)return;let i=0,a=new ResizeObserver(()=>{cancelAnimationFrame(i),i=requestAnimationFrame(t)});return a.observe(e),()=>{cancelAnimationFrame(i),a.disconnect()}},[r]),t}function ne(e,t){return e>0?Math.max(112,Math.min(t,Math.floor(e))):t}function O(e){return e===`danger`?x(`danger`):e===`warn`?x(`warning`):h}function k({title:e,description:t,caveat:n,status:r,value:i,warnAt:l=.7,dangerAt:d=.9,marker:p,caption:m,size:h=180,formatValue:g=e=>S(e),showState:_=!0}){let v=(0,w.useId)(),x=y((0,w.useId)()),C=(0,w.useRef)(null),k=ne(te(C),h),A=_?c(i,l,d):i===null?`unknown`:`ok`,j=Math.max(10,Math.round(k/12)),M=k/2-j/2-2,N=k/2,P=k/2,F=k/2+j/2+4,I=i===null?`unknown`:g(i),L=i===null?`${e}: unknown`:_?`${e}: ${I}, ${D[A]}`:`${e}: ${I}`,R=[{key:`value`,label:`Used`,value:I},..._?[{key:`state`,label:`State`,value:D[A]},{key:`warn`,label:`Warning at`,value:g(l)},{key:`danger`,label:`Limit at`,value:g(d)}]:[],...p?[{key:`marker`,label:p.label,value:g(p.value)}]:[]],z=[{key:`label`,label:`Measure`,render:e=>e.label},{key:`value`,label:`Value`,numeric:!0,render:e=>e.value}],B=p?a(N,P,M+j/2+3,Math.PI*(1-Math.min(1,Math.max(0,p.value)))):null,V=p?a(N,P,M-j/2-3,Math.PI*(1-Math.min(1,Math.max(0,p.value)))):null;return(0,E.jsx)(f,{title:e,description:t,caveat:n,status:r??{kind:`ready`},skeleton:`gauge`,table:(0,E.jsx)(ee,{caption:e,columns:z,rows:R,rowKey:e=>e.key}),children:(0,E.jsx)(`div`,{ref:C,className:T.fit,children:(0,E.jsxs)(`div`,{className:T.gauge,role:`meter`,"aria-label":e,"aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":i===null?void 0:Math.min(1,Math.max(0,i)),"aria-valuetext":L,"aria-describedby":m?v:void 0,"data-severity":A,children:[(0,E.jsxs)(`svg`,{className:s.svg,width:k,height:F,viewBox:`0 0 ${k} ${F}`,"aria-hidden":`true`,children:[(0,E.jsx)(`defs`,{children:(0,E.jsx)(o,{id:x})}),(0,E.jsx)(`path`,{"data-role":`track`,d:u(N,P,M,0,1),fill:`none`,stroke:i===null?`url(#${x})`:b,strokeWidth:j,strokeLinecap:`round`}),i!==null&&i>0?(0,E.jsx)(`path`,{"data-role":`fill`,d:u(N,P,M,0,Math.min(1,i)),fill:`none`,stroke:O(A),strokeWidth:j,strokeLinecap:`round`}):null,B&&V?(0,E.jsx)(`line`,{"data-role":`marker`,x1:V.x,y1:V.y,x2:B.x,y2:B.y,stroke:`var(--text-primary)`,strokeWidth:2,strokeLinecap:`round`}):null]}),(0,E.jsxs)(`div`,{className:T.readout,children:[(0,E.jsx)(`span`,{className:i===null?T.unknownValue:T.value,children:I}),_&&A!==`unknown`?(0,E.jsx)(`span`,{className:T.state,children:D[A]}):null,m?(0,E.jsx)(`span`,{id:v,className:T.caption,children:m}):null,p?(0,E.jsxs)(`span`,{className:T.caption,children:[p.label,`: `,g(p.value)]}):null]})]})})})}var A={scroll:`_scroll_1j5ed_3`,focus:`_focus_1j5ed_8`,num:`_num_1j5ed_17`};function j(e,t,n){let r=(t,n)=>{let r=e[t]?.[n];return r==null||!Number.isFinite(r)?null:r},i=e=>{let t=e.filter(e=>e!==null);return t.length?t.reduce((e,t)=>e+t,0):null},a=Array.from({length:t},(e,t)=>i(Array.from({length:n},(e,n)=>r(t,n)))),o=Array.from({length:n},(e,n)=>i(Array.from({length:t},(e,t)=>r(t,n)))),s=0;for(let e=0;e<t;e++)for(let t=0;t<n;t++)s=Math.max(s,r(e,t)??0);return{rows:a,columns:o,max:s,grand:i(a)}}var M=26,N=40,P=2,F=22,I=56;function L({title:e,description:t,caveat:n,status:a,rows:c,columns:u,values:h,unit:b=``,formatValue:x=C,showTotals:S=!0,defaultView:T,actions:D,width:te,ariaLabel:ne}){let O=(0,w.useRef)(null),k=l(O,te),L=d(),[R,z]=(0,w.useState)(null),B=(0,w.useId)(),V=y((0,w.useId)()),re=b?` ${b}`:``,H=j(h,c.length,u.length),ie=H.grand!==null,ae=a??(c.length===0||u.length===0?{kind:`empty`}:ie?{kind:`ready`}:{kind:`unknown`,reason:`no cell in this matrix was measured.`}),U=Math.max(72,Math.min(150,Math.round(k*.24))),oe=S?74:0,W=S?N*.6:0,se=k-U-oe,G=Math.max(F,Math.min(112,Math.floor(se/Math.max(1,u.length))-P)),K=Math.max(F,Math.min(I,30)),q=U,J=W+M,Y=q+u.length*(G+P)+oe,ce=J+c.length*32,le=Math.max(1,...H.rows.map(e=>e??0)),ue=Math.max(1,...H.columns.map(e=>e??0)),de=G>=28,fe=Math.floor(U/(7*L)),X=(e,t)=>{let n=h[e]?.[t];return n==null||!Number.isFinite(n)?null:n},pe=e=>H.max>0?e/H.max:0,me=e=>e===null?`url(#${V})`:e<=0?_(0):g(pe(e)),he=e=>m(e<=0?0:pe(e)),ge=(e,t)=>{let n=X(e,t);return`${c[e].label} × ${u[t].label}: ${n===null?`not measured`:`${x(n)}${re}`}`};function _e(e){if(c.length===0||u.length===0)return;let t=R??{r:0,c:0},n=null;e.key===`ArrowRight`?n={r:t.r,c:t.c+1}:e.key===`ArrowLeft`?n={r:t.r,c:t.c-1}:e.key===`ArrowDown`?n={r:t.r+1,c:t.c}:e.key===`ArrowUp`?n={r:t.r-1,c:t.c}:e.key===`Home`?n={r:t.r,c:0}:e.key===`End`&&(n={r:t.r,c:u.length-1}),n&&(e.preventDefault(),z({r:Math.max(0,Math.min(c.length-1,n.r)),c:Math.max(0,Math.min(u.length-1,n.c))}))}let Z=null;for(let e=0;e<c.length;e++)for(let t=0;t<u.length;t++){let n=X(e,t);n!==null&&(!Z||n>Z.v)&&(Z={r:e,c:t,v:n})}let Q=c.length*u.length-h.flat().filter(e=>e!=null).length,ve=ne??`${e}: ${c.length} × ${u.length} grid, ${H.grand===null?`nothing measured`:`${x(H.grand)}${re} in total`}`+(Z&&Z.v>0?`; most in ${c[Z.r].label} × ${u[Z.c].label} (${x(Z.v)})`:``)+(Q>0?`; ${Q} cell${Q===1?``:`s`} not measured`:``)+`.`,ye=c.map((e,t)=>({id:e.id,label:e.label,index:t})),be=[{key:`__row`,label:``,render:e=>e.label},...u.map((e,t)=>({key:e.id,label:e.label,numeric:!0,render:e=>{let n=X(e.index,t);return n===null?`—`:x(n)}})),{key:`__total`,label:`Total`,numeric:!0,render:e=>H.rows[e.index]===null?`—`:x(H.rows[e.index])}],$=R;return(0,E.jsx)(f,{title:e,description:t,caveat:n,status:ae,skeleton:`heat`,defaultView:T,actions:D,table:(0,E.jsx)(ee,{caption:e,columns:be,rows:ye,rowKey:e=>e.id}),footer:(0,E.jsxs)(`div`,{className:s.legend,"aria-hidden":`true`,children:[(0,E.jsx)(`span`,{className:s.legendItem,children:`0`}),[0,1,2,3,4].map(e=>(0,E.jsx)(`span`,{className:s.swatch,style:{background:e===0?_(0):g(e/4)}},e)),(0,E.jsx)(`span`,{className:s.legendItem,children:H.max>0?x(H.max):`more`}),Q>0?(0,E.jsxs)(`span`,{className:s.legendItem,children:[(0,E.jsx)(`span`,{className:s.swatchHatch}),`not measured`]}):null]}),children:(0,E.jsxs)(`div`,{ref:O,className:`${s.plotWrap} ${s.focusable} ${A.scroll}`,tabIndex:0,role:`group`,"aria-label":`${e}. Use the arrow keys to move between cells.`,"aria-describedby":B,onFocus:()=>z(e=>e??{r:0,c:0}),onBlur:()=>z(null),onKeyDown:_e,children:[(0,E.jsxs)(`svg`,{className:s.svg,width:Y,height:ce,viewBox:`0 0 ${Y} ${ce}`,role:`img`,"aria-label":ve,children:[(0,E.jsx)(`defs`,{children:(0,E.jsx)(o,{id:V})}),S?u.map((e,t)=>{let n=H.columns[t]??null,r=n===null?0:Math.max(n>0?2:0,n/ue*(W-4)),i=q+t*(G+P);return(0,E.jsx)(`g`,{"data-col-total":e.id,children:n===null?null:(0,E.jsx)(`rect`,{x:i+G*.2,y:W-r,width:G*.6,height:r,rx:2,fill:v})},`ct-${e.id}`)}):null,u.map((e,t)=>{let n=q+t*(G+P),i=Math.max(2,Math.floor((G-(e.engine?22:0))/7));return(0,E.jsxs)(`g`,{children:[e.engine?(0,E.jsx)(r,{engine:e.engine,x:n+2,y:W+5,height:14}):null,(0,E.jsx)(`text`,{className:s.label,x:n+(e.engine?24:G/2),y:W+M/2,dy:`0.32em`,textAnchor:e.engine?`start`:`middle`,children:e.label.length>i?`${e.label.slice(0,i-1)}…`:e.label})]},`ch-${e.id}`)}),c.map((e,t)=>{let n=J+t*32,r=H.rows[t]??null,i=r===null?0:Math.max(r>0?2:0,r/le*N),a=q+u.length*(G+P)+6;return(0,E.jsxs)(`g`,{"data-row":e.id,children:[(0,E.jsx)(`text`,{className:s.label,x:U-8,y:n+K/2,dy:`0.32em`,textAnchor:`end`,children:e.label.length>fe?`${e.label.slice(0,fe-1)}…`:e.label}),u.map((r,i)=>{let a=X(t,i),o=q+i*(G+P),c=$?.r===t&&$.c===i;return(0,E.jsxs)(`g`,{children:[(0,E.jsx)(`rect`,{"data-cell":`${e.id}:${r.id}`,"data-value":a===null?`unknown`:a,className:`${a===null?s.unknownMark:``} ${c?A.focus:``}`,x:a===null?o+.5:o,y:a===null?n+.5:n,width:a===null?G-1:G,height:a===null?29:K,rx:3,fill:me(a),onPointerEnter:()=>z({r:t,c:i}),onPointerLeave:()=>z(null)}),de&&a!==null?(0,E.jsx)(`text`,{"data-cell-value":`${e.id}:${r.id}`,className:A.num,x:o+G/2,y:n+K/2,dy:`0.32em`,textAnchor:`middle`,fill:he(a),children:x(a)}):null]},r.id)}),S?(0,E.jsxs)(`g`,{"data-row-total":e.id,children:[r===null?null:(0,E.jsx)(`rect`,{x:a,y:n+K*.25,width:i,height:K*.5,rx:2,fill:v}),(0,E.jsx)(`text`,{className:s.tick,x:a+i+4,y:n+K/2,dy:`0.32em`,children:r===null?`—`:x(r)})]}):null]},e.id)})]}),(0,E.jsx)(`span`,{id:B,className:s.srOnly,"aria-live":`polite`,children:$?ge($.r,$.c):``}),$?(0,E.jsx)(p,{left:i(q+$.c*(G+P)+G/2,Y,80),top:J+$.r*32,title:`${c[$.r].label} × ${u[$.c].label}`,rows:[{key:`v`,label:b||`Value`,value:X($.r,$.c)===null?null:x(X($.r,$.c))}]}):null]})})}export{k as n,L as t};
2
+ //# sourceMappingURL=MatrixHeatmap-C7BCG2d7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MatrixHeatmap-C7BCG2d7.js","names":[],"sources":["../../../../../../src/web-ui/components/charts/Gauge.module.css","../../../../../../src/web-ui/components/charts/Gauge.tsx","../../../../../../src/web-ui/components/charts/MatrixHeatmap.module.css","../../../../../../src/web-ui/components/charts/MatrixHeatmap.tsx"],"sourcesContent":[".gauge {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--space-1);\n}\n\n.readout {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 2px;\n margin-top: calc(-1 * var(--space-6));\n text-align: center;\n}\n\n/* Proportional figures for a standalone number (tabular only in columns). */\n.value {\n font-size: var(--text-2xl-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.unknownValue {\n font-size: var(--text-lg-size, var(--text-sm-size));\n font-weight: var(--font-weight-medium);\n color: var(--status-unknown-fg);\n}\n\n.state {\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n}\n\n.gauge[data-severity='warn'] .state {\n color: var(--status-warning-fg);\n}\n\n.gauge[data-severity='danger'] .state {\n color: var(--status-danger-fg);\n}\n\n.caption {\n font-size: var(--text-xs-size);\n color: var(--text-tertiary);\n}\n\n/* V3.10: the measuring box — full card width, so the arc can size to it. */\n.fit {\n width: 100%;\n min-width: 0;\n display: flex;\n justify-content: center;\n}\n","/**\n * components/charts/Gauge.tsx — one fraction on a 180° arc: how much of a\n * window is used, how close a cap is. The fill carries SEVERITY (accent →\n * warning → danger at the thresholds) over a track that is a lighter step of\n * the same ramp; an optional marker shows a line that matters (e.g. the\n * reserve kept for interactive use). The number and a words-first state label\n * sit under the arc, so severity is never colour alone.\n *\n * Honesty: `null` is UNKNOWN — an empty track and \"unknown\", never 0%. Values\n * past 100% are drawn full and printed as they are (\"112%\").\n *\n * Semantics: role=\"meter\" with aria-valuenow/min/max/valuetext.\n */\nimport { useId, useLayoutEffect, useRef, useState } from 'react';\nimport { CHART_SEQUENTIAL, CHART_TRACK, hatchPatternId, toneColor } from './colors.js';\nimport { HatchPattern } from './ChartParts.js';\nimport { ChartFrame, type ChartStatus } from './ChartFrame.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport { gaugeArc, gaugeSeverity, polar, type GaugeSeverity } from './chart-math.js';\nimport { formatPercent } from './format.js';\nimport plot from './plot.module.css';\nimport styles from './Gauge.module.css';\n\nexport interface GaugeProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n /** Fraction used, 0..1 (may exceed 1). null = unknown. */\n value: number | null;\n /** Severity thresholds as fractions (defaults 0.7 / 0.9). */\n warnAt?: number;\n dangerAt?: number;\n /** A reference line on the arc, e.g. { value: 0.6, label: 'Autonomy cap' }. */\n marker?: { value: number; label: string };\n /** Words under the number, e.g. \"resets in 2h\". */\n caption?: string;\n /**\n * The LARGEST diameter in px (default 180). V3.10: the gauge fits its\n * container — two gauges side by side at 375 px each shrink (never below\n * MIN_GAUGE_SIZE) instead of widening the page.\n */\n size?: number;\n formatValue?: (fraction: number) => string;\n /**\n * Print the severity words (\"near the limit\"). Default true. Set false for\n * a fraction where higher is BETTER (a hit rate): the fill stays one\n * quantity hue and no limit language is used.\n */\n showState?: boolean;\n}\n\nconst SEVERITY_LABEL: Record<GaugeSeverity, string> = {\n ok: 'within limits',\n warn: 'near the limit',\n danger: 'at the limit',\n unknown: 'unknown',\n};\n\n/** Smallest diameter a gauge draws at; below it the readout would collide with the arc. */\nexport const MIN_GAUGE_SIZE = 112;\n\n/** The container's measured width (0 until laid out: jsdom, a hidden tab). */\nfunction useContainerWidth(ref: React.RefObject<HTMLElement | null>): number {\n const [width, setWidth] = useState(0);\n // Track the node: the gauge mounts after a loading frame (see useChartWidth).\n const [node, setNode] = useState<HTMLElement | null>(null);\n // Runs after every render on purpose (ref.current is not a dependency React\n // can see); the equality guard makes it settle in one pass, never a loop.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useLayoutEffect(() => {\n if (ref.current !== node) setNode(ref.current);\n });\n useLayoutEffect(() => {\n const el = node;\n if (!el) return undefined;\n const read = (): void => {\n const w = Math.floor(el.getBoundingClientRect().width);\n setWidth((prev) => (prev === w ? prev : w));\n };\n read();\n if (typeof ResizeObserver === 'undefined') return undefined;\n let frame = 0;\n const observer = new ResizeObserver(() => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(read);\n });\n observer.observe(el);\n return () => {\n cancelAnimationFrame(frame);\n observer.disconnect();\n };\n }, [node]);\n return width;\n}\n\n/** Diameter for a container: the largest that fits, clamped to [MIN_GAUGE_SIZE, max]. */\nexport function gaugeDiameter(containerWidth: number, max: number): number {\n if (!(containerWidth > 0)) return max;\n return Math.max(MIN_GAUGE_SIZE, Math.min(max, Math.floor(containerWidth)));\n}\n\nfunction severityColor(severity: GaugeSeverity): string {\n if (severity === 'danger') return toneColor('danger');\n if (severity === 'warn') return toneColor('warning');\n return CHART_SEQUENTIAL;\n}\n\ninterface Row {\n key: string;\n label: string;\n value: string;\n}\n\nexport function Gauge({\n title,\n description,\n caveat,\n status,\n value,\n warnAt = 0.7,\n dangerAt = 0.9,\n marker,\n caption,\n size: maxSize = 180,\n formatValue = (f) => formatPercent(f),\n showState = true,\n}: GaugeProps) {\n const captionId = useId();\n const hatchId = hatchPatternId(useId());\n const fitRef = useRef<HTMLDivElement>(null);\n const size = gaugeDiameter(useContainerWidth(fitRef), maxSize);\n const severity = showState ? gaugeSeverity(value, warnAt, dangerAt) : value === null ? 'unknown' : 'ok';\n const stroke = Math.max(10, Math.round(size / 12));\n const r = size / 2 - stroke / 2 - 2;\n const cx = size / 2;\n const cy = size / 2;\n const h = size / 2 + stroke / 2 + 4;\n const valueText = value === null ? 'unknown' : formatValue(value);\n const spoken = value === null ? `${title}: unknown` : showState ? `${title}: ${valueText}, ${SEVERITY_LABEL[severity]}` : `${title}: ${valueText}`;\n\n const rows: Row[] = [\n { key: 'value', label: 'Used', value: valueText },\n ...(showState\n ? [\n { key: 'state', label: 'State', value: SEVERITY_LABEL[severity] },\n { key: 'warn', label: 'Warning at', value: formatValue(warnAt) },\n { key: 'danger', label: 'Limit at', value: formatValue(dangerAt) },\n ]\n : []),\n ...(marker ? [{ key: 'marker', label: marker.label, value: formatValue(marker.value) }] : []),\n ];\n const columns: TableColumn<Row>[] = [\n { key: 'label', label: 'Measure', render: (row) => row.label },\n { key: 'value', label: 'Value', numeric: true, render: (row) => row.value },\n ];\n\n const markerOuter = marker ? polar(cx, cy, r + stroke / 2 + 3, Math.PI * (1 - Math.min(1, Math.max(0, marker.value)))) : null;\n const markerInner = marker ? polar(cx, cy, r - stroke / 2 - 3, Math.PI * (1 - Math.min(1, Math.max(0, marker.value)))) : null;\n\n return (\n <ChartFrame\n title={title}\n description={description}\n caveat={caveat}\n status={status ?? { kind: 'ready' }}\n skeleton=\"gauge\"\n table={<TableView caption={title} columns={columns} rows={rows} rowKey={(row) => row.key} />}\n >\n <div ref={fitRef} className={styles.fit}>\n <div\n className={styles.gauge}\n role=\"meter\"\n aria-label={title}\n aria-valuemin={0}\n aria-valuemax={1}\n aria-valuenow={value === null ? undefined : Math.min(1, Math.max(0, value))}\n aria-valuetext={spoken}\n aria-describedby={caption ? captionId : undefined}\n data-severity={severity}\n >\n <svg className={plot.svg} width={size} height={h} viewBox={`0 0 ${size} ${h}`} aria-hidden=\"true\">\n <defs>\n <HatchPattern id={hatchId} />\n </defs>\n {/* Unknown: the track is hatched, not the pale ramp step a \"little\" value would get. */}\n <path\n data-role=\"track\"\n d={gaugeArc(cx, cy, r, 0, 1)}\n fill=\"none\"\n stroke={value === null ? `url(#${hatchId})` : CHART_TRACK}\n strokeWidth={stroke}\n strokeLinecap=\"round\"\n />\n {value !== null && value > 0 ? (\n <path\n data-role=\"fill\"\n d={gaugeArc(cx, cy, r, 0, Math.min(1, value))}\n fill=\"none\"\n stroke={severityColor(severity)}\n strokeWidth={stroke}\n strokeLinecap=\"round\"\n />\n ) : null}\n {markerOuter && markerInner ? (\n <line\n data-role=\"marker\"\n x1={markerInner.x}\n y1={markerInner.y}\n x2={markerOuter.x}\n y2={markerOuter.y}\n stroke=\"var(--text-primary)\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n />\n ) : null}\n </svg>\n <div className={styles.readout}>\n <span className={value === null ? styles.unknownValue : styles.value}>{valueText}</span>\n {showState && severity !== 'unknown' ? <span className={styles.state}>{SEVERITY_LABEL[severity]}</span> : null}\n {caption ? <span id={captionId} className={styles.caption}>{caption}</span> : null}\n {marker ? <span className={styles.caption}>{marker.label}: {formatValue(marker.value)}</span> : null}\n </div>\n </div>\n </div>\n </ChartFrame>\n );\n}\n","/* MatrixHeatmap — horizontal scroll when a wide matrix meets a narrow card,\n the focused-cell ring, and in-cell numbers. Tokens only. */\n.scroll {\n overflow-x: auto;\n overscroll-behavior-x: contain;\n}\n\n.focus {\n stroke: var(--border-focus);\n stroke-width: 2;\n}\n\n/* In-cell numbers: the fill is set per cell (colors.ts quantityInk, by the\n cell's luminance), so this class must NOT set one — a CSS fill would beat\n the attribute. Never a stroke / halo: paint-order stroke around dark text\n on a dark cell turned the glyphs into blobs. */\n.num {\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n font-weight: var(--font-weight-medium);\n font-variant-numeric: tabular-nums;\n stroke: none;\n pointer-events: none;\n}\n","/**\n * components/charts/MatrixHeatmap.tsx — a rows × columns grid of counts\n * (V3.10, SPEC-310C §5 Mind: insight KIND × ENGINE, faceted per repo;\n * r5/visual.md §2 \"MatrixHeatmap\").\n *\n * Encoding, one meaning per mark:\n * - a KNOWN value is a step of the fixed azure quantity ramp\n * (colors.ts quantityColor) — a TRUE ZERO is the faint heat-0 cell;\n * - an UNKNOWN value (null: nothing was measured for that cell, e.g. an\n * engine with no recorded reasoning) is the 45° unknown hatch with an\n * outline — never the palest step, which would claim \"a little\";\n * - row and column TOTALS sit in the margins as bars (right and top), so\n * \"which kind dominates\" reads without adding cells in your head.\n * A column may carry an engine: its header gets the 2px tick + monogram.\n *\n * Keyboard: the grid is one tab stop; arrows move a cell, Home/End jump\n * along the row; the focused cell is announced. The Table view has every\n * cell and both totals. At 375 px callers usually start on the table\n * (`defaultView=\"table\"`, SPEC-310C §5 \"Mind's matrix shows as a table\").\n */\nimport { useId, useRef, useState, type KeyboardEvent, type ReactNode } from 'react';\nimport { CHART_SEQUENTIAL_SOFT, hatchPatternId, heatColor, quantityColor, quantityInk, type ChartEngine } from './colors.js';\nimport { ChartFrame, type ChartStatus, type ChartView } from './ChartFrame.js';\nimport { ChartTooltip, EngineTick, HatchPattern, clampTooltipLeft } from './ChartParts.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport { formatCompact } from './format.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport { useTextScale } from './useTextScale.js';\nimport plot from './plot.module.css';\nimport styles from './MatrixHeatmap.module.css';\n\nexport interface MatrixAxisItem {\n id: string;\n label: string;\n /** Column-only: the engine this column stands for (tick + monogram in the header). */\n engine?: ChartEngine;\n}\n\nexport interface MatrixHeatmapProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n rows: MatrixAxisItem[];\n columns: MatrixAxisItem[];\n /** values[rowIndex][columnIndex]; null = not measured. */\n values: ReadonlyArray<ReadonlyArray<number | null>>;\n /** Unit word for spoken text and the table (\"insights\"). */\n unit?: string;\n formatValue?: (v: number) => string;\n /** Row / column totals as margin bars (default true). */\n showTotals?: boolean;\n defaultView?: ChartView;\n /** Extra header controls (e.g. the repo facet picker). */\n actions?: ReactNode;\n width?: number;\n ariaLabel?: string;\n}\n\ninterface Totals {\n rows: (number | null)[];\n columns: (number | null)[];\n max: number;\n grand: number | null;\n}\n\n/** Sum known values; a line with NO known value has an unknown (null) total, never 0. */\nexport function matrixTotals(values: ReadonlyArray<ReadonlyArray<number | null>>, rows: number, columns: number): Totals {\n const cell = (r: number, c: number): number | null => {\n const v = values[r]?.[c];\n return v === undefined || v === null || !Number.isFinite(v) ? null : v;\n };\n const sum = (xs: (number | null)[]): number | null => {\n const known = xs.filter((x): x is number => x !== null);\n return known.length ? known.reduce((a, b) => a + b, 0) : null;\n };\n const rowTotals = Array.from({ length: rows }, (_, r) => sum(Array.from({ length: columns }, (_, c) => cell(r, c))));\n const colTotals = Array.from({ length: columns }, (_, c) => sum(Array.from({ length: rows }, (_, r) => cell(r, c))));\n let max = 0;\n for (let r = 0; r < rows; r++) for (let c = 0; c < columns; c++) max = Math.max(max, cell(r, c) ?? 0);\n return { rows: rowTotals, columns: colTotals, max, grand: sum(rowTotals) };\n}\n\nconst HEADER_H = 26;\nconst MARGIN_BAR = 40;\nconst GAP = 2;\nconst MIN_CELL = 22;\nconst MAX_CELL = 56;\n\nexport function MatrixHeatmap({\n title,\n description,\n caveat,\n status,\n rows,\n columns,\n values,\n unit = '',\n formatValue = formatCompact,\n showTotals = true,\n defaultView,\n actions,\n width: fixedWidth,\n ariaLabel,\n}: MatrixHeatmapProps) {\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const textScale = useTextScale();\n const [focus, setFocus] = useState<{ r: number; c: number } | null>(null);\n const liveId = useId();\n const hatchId = hatchPatternId(useId());\n const unitText = unit ? ` ${unit}` : '';\n\n const totals = matrixTotals(values, rows.length, columns.length);\n const anyKnown = totals.grand !== null;\n const resolvedStatus: ChartStatus = status ?? (rows.length === 0 || columns.length === 0\n ? { kind: 'empty' }\n : anyKnown ? { kind: 'ready' } : { kind: 'unknown', reason: 'no cell in this matrix was measured.' });\n\n const labelW = Math.max(72, Math.min(150, Math.round(width * 0.24)));\n const marginRight = showTotals ? MARGIN_BAR + 34 : 0;\n const marginTop = showTotals ? MARGIN_BAR * 0.6 : 0;\n const avail = width - labelW - marginRight;\n const cellW = Math.max(MIN_CELL, Math.min(MAX_CELL * 2, Math.floor(avail / Math.max(1, columns.length)) - GAP));\n const cellH = Math.max(MIN_CELL, Math.min(MAX_CELL, 30));\n const gridX = labelW;\n const gridY = marginTop + HEADER_H;\n const svgW = gridX + columns.length * (cellW + GAP) + marginRight;\n const svgH = gridY + rows.length * (cellH + GAP);\n const rowTotalMax = Math.max(1, ...totals.rows.map((t) => t ?? 0));\n const colTotalMax = Math.max(1, ...totals.columns.map((t) => t ?? 0));\n const showNumbers = cellW >= 28;\n // 7 px a character at 12 px text, scaled to the Display size.\n const labelChars = Math.floor(labelW / (7 * textScale));\n\n const cellValue = (r: number, c: number): number | null => {\n const v = values[r]?.[c];\n return v === undefined || v === null || !Number.isFinite(v) ? null : v;\n };\n const fraction = (v: number): number => (totals.max > 0 ? v / totals.max : 0);\n const fill = (v: number | null): string => (v === null ? `url(#${hatchId})` : v <= 0 ? heatColor(0) : quantityColor(fraction(v)));\n // A true zero sits on the faint heat-0 cell, the palest ground there is.\n const cellInk = (v: number): string => (v <= 0 ? quantityInk(0) : quantityInk(fraction(v)));\n const describe = (r: number, c: number): string => {\n const v = cellValue(r, c);\n return `${rows[r]!.label} × ${columns[c]!.label}: ${v === null ? 'not measured' : `${formatValue(v)}${unitText}`}`;\n };\n\n function onKey(e: KeyboardEvent<HTMLDivElement>): void {\n if (rows.length === 0 || columns.length === 0) return;\n const cur = focus ?? { r: 0, c: 0 };\n let next: { r: number; c: number } | null = null;\n if (e.key === 'ArrowRight') next = { r: cur.r, c: cur.c + 1 };\n else if (e.key === 'ArrowLeft') next = { r: cur.r, c: cur.c - 1 };\n else if (e.key === 'ArrowDown') next = { r: cur.r + 1, c: cur.c };\n else if (e.key === 'ArrowUp') next = { r: cur.r - 1, c: cur.c };\n else if (e.key === 'Home') next = { r: cur.r, c: 0 };\n else if (e.key === 'End') next = { r: cur.r, c: columns.length - 1 };\n if (!next) return;\n e.preventDefault();\n setFocus({ r: Math.max(0, Math.min(rows.length - 1, next.r)), c: Math.max(0, Math.min(columns.length - 1, next.c)) });\n }\n\n let peak: { r: number; c: number; v: number } | null = null;\n for (let r = 0; r < rows.length; r++) for (let c = 0; c < columns.length; c++) {\n const v = cellValue(r, c);\n if (v !== null && (!peak || v > peak.v)) peak = { r, c, v };\n }\n const unknownCells = rows.length * columns.length - values.flat().filter((v) => v !== null && v !== undefined).length;\n const summary = ariaLabel ?? `${title}: ${rows.length} × ${columns.length} grid, ${totals.grand === null ? 'nothing measured' : `${formatValue(totals.grand)}${unitText} in total`}` +\n (peak && peak.v > 0 ? `; most in ${rows[peak.r]!.label} × ${columns[peak.c]!.label} (${formatValue(peak.v)})` : '') +\n (unknownCells > 0 ? `; ${unknownCells} cell${unknownCells === 1 ? '' : 's'} not measured` : '') + '.';\n\n interface TableRow { id: string; label: string; index: number }\n const tableRows: TableRow[] = rows.map((r, index) => ({ id: r.id, label: r.label, index }));\n const tableColumns: TableColumn<TableRow>[] = [\n { key: '__row', label: '', render: (r) => r.label },\n ...columns.map((c, ci) => ({\n key: c.id,\n label: c.label,\n numeric: true,\n render: (r: TableRow) => {\n const v = cellValue(r.index, ci);\n return v === null ? '—' : formatValue(v);\n },\n })),\n { key: '__total', label: 'Total', numeric: true, render: (r) => (totals.rows[r.index] === null ? '—' : formatValue(totals.rows[r.index]!)) },\n ];\n\n const focusCell = focus;\n\n return (\n <ChartFrame\n title={title}\n description={description}\n caveat={caveat}\n status={resolvedStatus}\n skeleton=\"heat\"\n defaultView={defaultView}\n actions={actions}\n table={<TableView caption={title} columns={tableColumns} rows={tableRows} rowKey={(r) => r.id} />}\n footer={\n <div className={plot.legend} aria-hidden=\"true\">\n <span className={plot.legendItem}>0</span>\n {[0, 1, 2, 3, 4].map((i) => (\n <span key={i} className={plot.swatch} style={{ background: i === 0 ? heatColor(0) : quantityColor(i / 4) }} />\n ))}\n <span className={plot.legendItem}>{totals.max > 0 ? formatValue(totals.max) : 'more'}</span>\n {unknownCells > 0 ? (\n <span className={plot.legendItem}>\n <span className={plot.swatchHatch} />\n not measured\n </span>\n ) : null}\n </div>\n }\n >\n <div\n ref={wrapRef}\n className={`${plot.plotWrap} ${plot.focusable} ${styles.scroll}`}\n tabIndex={0}\n role=\"group\"\n aria-label={`${title}. Use the arrow keys to move between cells.`}\n aria-describedby={liveId}\n onFocus={() => setFocus((f) => f ?? { r: 0, c: 0 })}\n onBlur={() => setFocus(null)}\n onKeyDown={onKey}\n >\n <svg className={plot.svg} width={svgW} height={svgH} viewBox={`0 0 ${svgW} ${svgH}`} role=\"img\" aria-label={summary}>\n <defs>\n <HatchPattern id={hatchId} />\n </defs>\n {/* Column totals (top margin) */}\n {showTotals\n ? columns.map((c, ci) => {\n const t = totals.columns[ci] ?? null;\n const h = t === null ? 0 : Math.max(t > 0 ? 2 : 0, (t / colTotalMax) * (marginTop - 4));\n const x = gridX + ci * (cellW + GAP);\n return (\n <g key={`ct-${c.id}`} data-col-total={c.id}>\n {t === null ? null : <rect x={x + cellW * 0.2} y={marginTop - h} width={cellW * 0.6} height={h} rx={2} fill={CHART_SEQUENTIAL_SOFT} />}\n </g>\n );\n })\n : null}\n {/* Column headers */}\n {columns.map((c, ci) => {\n const x = gridX + ci * (cellW + GAP);\n const chars = Math.max(2, Math.floor((cellW - (c.engine ? 22 : 0)) / 7));\n return (\n <g key={`ch-${c.id}`}>\n {c.engine ? <EngineTick engine={c.engine} x={x + 2} y={marginTop + 5} height={HEADER_H - 12} /> : null}\n <text className={plot.label} x={x + (c.engine ? 24 : cellW / 2)} y={marginTop + HEADER_H / 2} dy=\"0.32em\" textAnchor={c.engine ? 'start' : 'middle'}>\n {c.label.length > chars ? `${c.label.slice(0, chars - 1)}…` : c.label}\n </text>\n </g>\n );\n })}\n {rows.map((row, ri) => {\n const y = gridY + ri * (cellH + GAP);\n const t = totals.rows[ri] ?? null;\n const barW = t === null ? 0 : Math.max(t > 0 ? 2 : 0, (t / rowTotalMax) * MARGIN_BAR);\n const barX = gridX + columns.length * (cellW + GAP) + 6;\n return (\n <g key={row.id} data-row={row.id}>\n <text className={plot.label} x={labelW - 8} y={y + cellH / 2} dy=\"0.32em\" textAnchor=\"end\">\n {row.label.length > labelChars ? `${row.label.slice(0, labelChars - 1)}…` : row.label}\n </text>\n {columns.map((col, ci) => {\n const v = cellValue(ri, ci);\n const x = gridX + ci * (cellW + GAP);\n const isFocus = focusCell?.r === ri && focusCell.c === ci;\n return (\n <g key={col.id}>\n <rect\n data-cell={`${row.id}:${col.id}`}\n data-value={v === null ? 'unknown' : v}\n className={`${v === null ? plot.unknownMark : ''} ${isFocus ? styles.focus : ''}`}\n x={v === null ? x + 0.5 : x}\n y={v === null ? y + 0.5 : y}\n width={v === null ? cellW - 1 : cellW}\n height={v === null ? cellH - 1 : cellH}\n rx={3}\n fill={fill(v)}\n onPointerEnter={() => setFocus({ r: ri, c: ci })}\n onPointerLeave={() => setFocus(null)}\n />\n {showNumbers && v !== null ? (\n // Plain fill picked by the cell's luminance (colors.ts\n // quantityInk) — no halo: a surface stroke around text\n // on a dark cell smeared \"1\" into a blob.\n <text data-cell-value={`${row.id}:${col.id}`} className={styles.num} x={x + cellW / 2} y={y + cellH / 2} dy=\"0.32em\" textAnchor=\"middle\" fill={cellInk(v)}>\n {formatValue(v)}\n </text>\n ) : null}\n </g>\n );\n })}\n {showTotals ? (\n <g data-row-total={row.id}>\n {t === null ? null : <rect x={barX} y={y + cellH * 0.25} width={barW} height={cellH * 0.5} rx={2} fill={CHART_SEQUENTIAL_SOFT} />}\n <text className={plot.tick} x={barX + barW + 4} y={y + cellH / 2} dy=\"0.32em\">\n {t === null ? '—' : formatValue(t)}\n </text>\n </g>\n ) : null}\n </g>\n );\n })}\n </svg>\n <span id={liveId} className={plot.srOnly} aria-live=\"polite\">\n {focusCell ? describe(focusCell.r, focusCell.c) : ''}\n </span>\n {focusCell ? (\n <ChartTooltip\n left={clampTooltipLeft(gridX + focusCell.c * (cellW + GAP) + cellW / 2, svgW, 80)}\n top={gridY + focusCell.r * (cellH + GAP)}\n title={`${rows[focusCell.r]!.label} × ${columns[focusCell.c]!.label}`}\n rows={[{ key: 'v', label: unit || 'Value', value: cellValue(focusCell.r, focusCell.c) === null ? null : formatValue(cellValue(focusCell.r, focusCell.c)!) }]}\n />\n ) : null}\n </div>\n </ChartFrame>\n );\n}\n"],"mappings":"kgBCoDM,EAAgD,CACpD,GAAI,gBACJ,KAAM,iBACN,OAAQ,eACR,QAAS,SACX,EAMA,SAAS,GAAkB,EAAkD,CAC3E,GAAM,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAS,CAAC,EAE9B,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAA6B,IAAI,EA2BzD,OAvBA,EAAA,EAAA,gBAAA,KAAsB,CAChB,EAAI,UAAY,GAAM,EAAQ,EAAI,OAAO,CAC/C,CAAC,GACD,EAAA,EAAA,gBAAA,KAAsB,CACpB,IAAM,EAAK,EACX,GAAI,CAAC,EAAI,OACT,IAAM,MAAmB,CACvB,IAAM,EAAI,KAAK,MAAM,EAAG,sBAAsB,CAAC,CAAC,KAAK,EACrD,EAAU,GAAU,IAAS,EAAI,EAAO,CAAE,CAC5C,EAEA,GADA,EAAK,EACD,OAAO,eAAmB,IAAa,OAC3C,IAAI,EAAQ,EACN,EAAW,IAAI,mBAAqB,CACxC,qBAAqB,CAAK,EAC1B,EAAQ,sBAAsB,CAAI,CACpC,CAAC,EAED,OADA,EAAS,QAAQ,CAAE,MACN,CACX,qBAAqB,CAAK,EAC1B,EAAS,WAAW,CACtB,CACF,EAAG,CAAC,CAAI,CAAC,EACF,CACT,CAGA,SAAgB,GAAc,EAAwB,EAAqB,CAEzE,OADM,EAAiB,EAChB,KAAK,IAAA,IAAoB,KAAK,IAAI,EAAK,KAAK,MAAM,CAAc,CAAC,CAAC,EADvC,CAEpC,CAEA,SAAS,EAAc,EAAiC,CAGtD,OAFI,IAAa,SAAiB,EAAU,QAAQ,EAChD,IAAa,OAAe,EAAU,SAAS,EAC5C,CACT,CAQA,SAAgB,EAAM,CACpB,QACA,cACA,SACA,SACA,QACA,SAAS,GACT,WAAW,GACX,SACA,UACA,KAAM,EAAU,IAChB,cAAe,GAAM,EAAc,CAAC,EACpC,YAAY,IACC,CACb,IAAM,GAAA,EAAY,EAAA,MAAA,CAAM,EAClB,EAAU,GAAA,EAAe,EAAA,MAAA,CAAM,CAAC,EAChC,GAAA,EAAS,EAAA,OAAA,CAAuB,IAAI,EACpC,EAAO,GAAc,GAAkB,CAAM,EAAG,CAAO,EACvD,EAAW,EAAY,EAAc,EAAO,EAAQ,CAAQ,EAAI,IAAU,KAAO,UAAY,KAC7F,EAAS,KAAK,IAAI,GAAI,KAAK,MAAM,EAAO,EAAE,CAAC,EAC3C,EAAI,EAAO,EAAI,EAAS,EAAI,EAC5B,EAAK,EAAO,EACZ,EAAK,EAAO,EACZ,EAAI,EAAO,EAAI,EAAS,EAAI,EAC5B,EAAY,IAAU,KAAO,UAAY,EAAY,CAAK,EAC1D,EAAS,IAAU,KAAO,GAAG,EAAM,WAAa,EAAY,GAAG,EAAM,IAAI,EAAU,IAAI,EAAe,KAAc,GAAG,EAAM,IAAI,IAEjI,EAAc,CAClB,CAAE,IAAK,QAAS,MAAO,OAAQ,MAAO,CAAU,EAChD,GAAI,EACA,CACE,CAAE,IAAK,QAAS,MAAO,QAAS,MAAO,EAAe,EAAU,EAChE,CAAE,IAAK,OAAQ,MAAO,aAAc,MAAO,EAAY,CAAM,CAAE,EAC/D,CAAE,IAAK,SAAU,MAAO,WAAY,MAAO,EAAY,CAAQ,CAAE,CACnE,EACA,CAAC,EACL,GAAI,EAAS,CAAC,CAAE,IAAK,SAAU,MAAO,EAAO,MAAO,MAAO,EAAY,EAAO,KAAK,CAAE,CAAC,EAAI,CAAC,CAC7F,EACM,EAA8B,CAClC,CAAE,IAAK,QAAS,MAAO,UAAW,OAAS,GAAQ,EAAI,KAAM,EAC7D,CAAE,IAAK,QAAS,MAAO,QAAS,QAAS,GAAM,OAAS,GAAQ,EAAI,KAAM,CAC5E,EAEM,EAAc,EAAS,EAAM,EAAI,EAAI,EAAI,EAAS,EAAI,EAAG,KAAK,IAAM,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,EAAO,KAAK,CAAC,EAAE,EAAI,KACnH,EAAc,EAAS,EAAM,EAAI,EAAI,EAAI,EAAS,EAAI,EAAG,KAAK,IAAM,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,EAAO,KAAK,CAAC,EAAE,EAAI,KAEzH,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACS,QACM,cACL,SACR,OAAQ,GAAU,CAAE,KAAM,OAAQ,EAClC,SAAS,QACT,OAAO,EAAA,EAAA,IAAA,CAAC,GAAD,CAAW,QAAS,EAAgB,UAAe,OAAM,OAAS,GAAQ,EAAI,GAAM,CAAA,EAE3F,UAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,IAAK,EAAQ,UAAW,EAAO,IACpC,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CACE,UAAW,EAAO,MAClB,KAAK,QACL,aAAY,EACZ,gBAAe,EACf,gBAAe,EACf,gBAAe,IAAU,KAAO,IAAA,GAAY,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,CAAK,CAAC,EAC1E,iBAAgB,EAChB,mBAAkB,EAAU,EAAY,IAAA,GACxC,gBAAe,EATjB,SAAA,EAWE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAK,IAAK,MAAO,EAAM,OAAQ,EAAG,QAAS,OAAO,EAAK,GAAG,IAAK,cAAY,OAA3F,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,GAAI,CAAU,CAAA,CACxB,CAAA,GAEN,EAAA,EAAA,IAAA,CAAC,OAAD,CACE,YAAU,QACV,EAAG,EAAS,EAAI,EAAI,EAAG,EAAG,CAAC,EAC3B,KAAK,OACL,OAAQ,IAAU,KAAO,QAAQ,EAAQ,GAAK,EAC9C,YAAa,EACb,cAAc,OACf,CAAA,EACA,IAAU,MAAQ,EAAQ,GACzB,EAAA,EAAA,IAAA,CAAC,OAAD,CACE,YAAU,OACV,EAAG,EAAS,EAAI,EAAI,EAAG,EAAG,KAAK,IAAI,EAAG,CAAK,CAAC,EAC5C,KAAK,OACL,OAAQ,EAAc,CAAQ,EAC9B,YAAa,EACb,cAAc,OACf,CAAA,EACC,KACH,GAAe,GACd,EAAA,EAAA,IAAA,CAAC,OAAD,CACE,YAAU,SACV,GAAI,EAAY,EAChB,GAAI,EAAY,EAChB,GAAI,EAAY,EAChB,GAAI,EAAY,EAChB,OAAO,sBACP,YAAa,EACb,cAAc,OACf,CAAA,EACC,IACD,CACL,CAAA,GAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,QAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,IAAU,KAAO,EAAO,aAAe,EAAO,MAAQ,SAAA,CAAgB,CAAA,EACtF,GAAa,IAAa,WAAY,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAQ,SAAA,EAAe,EAAgB,CAAA,EAAI,KACzG,GAAU,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,GAAI,EAAW,UAAW,EAAO,QAAU,SAAA,CAAc,CAAA,EAAI,KAC7E,GAAS,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAxB,SAAA,CAAkC,EAAO,MAAM,KAAG,EAAY,EAAO,KAAK,CAAQ,CAAI,CAAA,EAAA,IAC7F,CACF,CAAA,CAAA,GACA,CAAA,CACK,CAAA,CAEhB,6EEhKA,SAAgB,EAAa,EAAqD,EAAc,EAAyB,CACvH,IAAM,GAAQ,EAAW,IAA6B,CACpD,IAAM,EAAI,EAAO,EAAE,GAAG,GACtB,OAAO,GAAyB,MAAQ,CAAC,OAAO,SAAS,CAAC,EAAI,KAAO,CACvE,EACM,EAAO,GAAyC,CACpD,IAAM,EAAQ,EAAG,OAAQ,GAAmB,IAAM,IAAI,EACtD,OAAO,EAAM,OAAS,EAAM,QAAQ,EAAG,IAAM,EAAI,EAAG,CAAC,EAAI,IAC3D,EACM,EAAY,MAAM,KAAK,CAAE,OAAQ,CAAK,GAAI,EAAG,IAAM,EAAI,MAAM,KAAK,CAAE,OAAQ,CAAQ,GAAI,EAAG,IAAM,EAAK,EAAG,CAAC,CAAC,CAAC,CAAC,EAC7G,EAAY,MAAM,KAAK,CAAE,OAAQ,CAAQ,GAAI,EAAG,IAAM,EAAI,MAAM,KAAK,CAAE,OAAQ,CAAK,GAAI,EAAG,IAAM,EAAK,EAAG,CAAC,CAAC,CAAC,CAAC,EAC/G,EAAM,EACV,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,IAAK,IAAK,IAAI,EAAI,EAAG,EAAI,EAAS,IAAK,EAAM,KAAK,IAAI,EAAK,EAAK,EAAG,CAAC,GAAK,CAAC,EACpG,MAAO,CAAE,KAAM,EAAW,QAAS,EAAW,MAAK,MAAO,EAAI,CAAS,CAAE,CAC3E,CAEA,IAAM,EAAW,GACX,EAAa,GACb,EAAM,EACN,EAAW,GACX,EAAW,GAEjB,SAAgB,EAAc,CAC5B,QACA,cACA,SACA,SACA,OACA,UACA,SACA,OAAO,GACP,cAAc,EACd,aAAa,GACb,cACA,UACA,MAAO,GACP,cACqB,CACrB,IAAM,GAAA,EAAU,EAAA,OAAA,CAAuB,IAAI,EACrC,EAAQ,EAAc,EAAS,EAAU,EACzC,EAAY,EAAa,EACzB,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAA0C,IAAI,EAClE,GAAA,EAAS,EAAA,MAAA,CAAM,EACf,EAAU,GAAA,EAAe,EAAA,MAAA,CAAM,CAAC,EAChC,GAAW,EAAO,IAAI,IAAS,GAE/B,EAAS,EAAa,EAAQ,EAAK,OAAQ,EAAQ,MAAM,EACzD,GAAW,EAAO,QAAU,KAC5B,GAA8B,IAAW,EAAK,SAAW,GAAK,EAAQ,SAAW,EACnF,CAAE,KAAM,OAAQ,EAChB,GAAW,CAAE,KAAM,OAAQ,EAAI,CAAE,KAAM,UAAW,OAAQ,sCAAuC,GAE/F,EAAS,KAAK,IAAI,GAAI,KAAK,IAAI,IAAK,KAAK,MAAM,EAAQ,GAAI,CAAC,CAAC,EAC7D,GAAc,EAAa,GAAkB,EAC7C,EAAY,EAAa,EAAa,GAAM,EAC5C,GAAQ,EAAQ,EAAS,GACzB,EAAQ,KAAK,IAAI,EAAU,KAAK,IAAI,IAAc,KAAK,MAAM,GAAQ,KAAK,IAAI,EAAG,EAAQ,MAAM,CAAC,EAAI,CAAG,CAAC,EACxG,EAAQ,KAAK,IAAI,EAAU,KAAK,IAAI,EAAU,EAAE,CAAC,EACjD,EAAQ,EACR,EAAQ,EAAY,EACpB,EAAO,EAAQ,EAAQ,QAAU,EAAQ,GAAO,GAChD,GAAO,EAAQ,EAAK,OAAU,GAC9B,GAAc,KAAK,IAAI,EAAG,GAAG,EAAO,KAAK,IAAK,GAAM,GAAK,CAAC,CAAC,EAC3D,GAAc,KAAK,IAAI,EAAG,GAAG,EAAO,QAAQ,IAAK,GAAM,GAAK,CAAC,CAAC,EAC9D,GAAc,GAAS,GAEvB,GAAa,KAAK,MAAM,GAAU,EAAI,EAAU,EAEhD,GAAa,EAAW,IAA6B,CACzD,IAAM,EAAI,EAAO,EAAE,GAAG,GACtB,OAAO,GAAyB,MAAQ,CAAC,OAAO,SAAS,CAAC,EAAI,KAAO,CACvE,EACM,GAAY,GAAuB,EAAO,IAAM,EAAI,EAAI,EAAO,IAAM,EACrE,GAAQ,GAA8B,IAAM,KAAO,QAAQ,EAAQ,GAAK,GAAK,EAAI,EAAU,CAAC,EAAI,EAAc,GAAS,CAAC,CAAC,EAEzH,GAAW,GAAgC,EAAT,GAAK,EAAgB,EAAiB,GAAS,CAAC,CAAC,EACnF,IAAY,EAAW,IAAsB,CACjD,IAAM,EAAI,EAAU,EAAG,CAAC,EACxB,MAAO,GAAG,EAAK,EAAE,CAAE,MAAM,KAAK,EAAQ,EAAE,CAAE,MAAM,IAAI,IAAM,KAAO,eAAiB,GAAG,EAAY,CAAC,IAAI,MACxG,EAEA,SAAS,GAAM,EAAwC,CACrD,GAAI,EAAK,SAAW,GAAK,EAAQ,SAAW,EAAG,OAC/C,IAAM,EAAM,GAAS,CAAE,EAAG,EAAG,EAAG,CAAE,EAC9B,EAAwC,KACxC,EAAE,MAAQ,aAAc,EAAO,CAAE,EAAG,EAAI,EAAG,EAAG,EAAI,EAAI,CAAE,EACnD,EAAE,MAAQ,YAAa,EAAO,CAAE,EAAG,EAAI,EAAG,EAAG,EAAI,EAAI,CAAE,EACvD,EAAE,MAAQ,YAAa,EAAO,CAAE,EAAG,EAAI,EAAI,EAAG,EAAG,EAAI,CAAE,EACvD,EAAE,MAAQ,UAAW,EAAO,CAAE,EAAG,EAAI,EAAI,EAAG,EAAG,EAAI,CAAE,EACrD,EAAE,MAAQ,OAAQ,EAAO,CAAE,EAAG,EAAI,EAAG,EAAG,CAAE,EAC1C,EAAE,MAAQ,QAAO,EAAO,CAAE,EAAG,EAAI,EAAG,EAAG,EAAQ,OAAS,CAAE,GAC9D,IACL,EAAE,eAAe,EACjB,EAAS,CAAE,EAAG,KAAK,IAAI,EAAG,KAAK,IAAI,EAAK,OAAS,EAAG,EAAK,CAAC,CAAC,EAAG,EAAG,KAAK,IAAI,EAAG,KAAK,IAAI,EAAQ,OAAS,EAAG,EAAK,CAAC,CAAC,CAAE,CAAC,EACtH,CAEA,IAAI,EAAmD,KACvD,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,OAAQ,IAAK,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,OAAQ,IAAK,CAC7E,IAAM,EAAI,EAAU,EAAG,CAAC,EACpB,IAAM,OAAS,CAAC,GAAQ,EAAI,EAAK,KAAI,EAAO,CAAE,IAAG,IAAG,GAAE,EAC5D,CACA,IAAM,EAAe,EAAK,OAAS,EAAQ,OAAS,EAAO,KAAK,CAAC,CAAC,OAAQ,GAAM,GAAM,IAAuB,CAAC,CAAC,OACzG,GAAU,IAAa,GAAG,EAAM,IAAI,EAAK,OAAO,KAAK,EAAQ,OAAO,SAAS,EAAO,QAAU,KAAO,mBAAqB,GAAG,EAAY,EAAO,KAAK,IAAI,GAAS,cACrK,GAAQ,EAAK,EAAI,EAAI,aAAa,EAAK,EAAK,EAAE,CAAE,MAAM,KAAK,EAAQ,EAAK,EAAE,CAAE,MAAM,IAAI,EAAY,EAAK,CAAC,EAAE,GAAK,KAC/G,EAAe,EAAI,KAAK,EAAa,OAAO,IAAiB,EAAI,GAAK,IAAI,eAAiB,IAAM,IAG9F,GAAwB,EAAK,KAAK,EAAG,KAAW,CAAE,GAAI,EAAE,GAAI,MAAO,EAAE,MAAO,OAAM,EAAE,EACpF,GAAwC,CAC5C,CAAE,IAAK,QAAS,MAAO,GAAI,OAAS,GAAM,EAAE,KAAM,EAClD,GAAG,EAAQ,KAAK,EAAG,KAAQ,CACzB,IAAK,EAAE,GACP,MAAO,EAAE,MACT,QAAS,GACT,OAAS,GAAgB,CACvB,IAAM,EAAI,EAAU,EAAE,MAAO,CAAE,EAC/B,OAAO,IAAM,KAAO,IAAM,EAAY,CAAC,CACzC,CACF,EAAE,EACF,CAAE,IAAK,UAAW,MAAO,QAAS,QAAS,GAAM,OAAS,GAAO,EAAO,KAAK,EAAE,SAAW,KAAO,IAAM,EAAY,EAAO,KAAK,EAAE,MAAO,CAAG,CAC7I,EAEM,EAAY,EAElB,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACS,QACM,cACL,SACR,OAAQ,GACR,SAAS,OACI,cACJ,UACT,OAAO,EAAA,EAAA,IAAA,CAAC,GAAD,CAAW,QAAS,EAAO,QAAS,GAAc,KAAM,GAAW,OAAS,GAAM,EAAE,EAAK,CAAA,EAChG,QACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAK,OAAQ,cAAY,OAAzC,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAK,WAAY,SAAA,GAAO,CAAA,EACxC,CAAC,EAAG,EAAG,EAAG,EAAG,CAAC,CAAC,CAAC,IAAK,IACpB,EAAA,EAAA,IAAA,CAAC,OAAD,CAAc,UAAW,EAAK,OAAQ,MAAO,CAAE,WAAY,IAAM,EAAI,EAAU,CAAC,EAAI,EAAc,EAAI,CAAC,CAAE,CAAI,EAAlG,CAAkG,CAC9G,GACD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAK,WAAa,SAAA,EAAO,IAAM,EAAI,EAAY,EAAO,GAAG,EAAI,MAAa,CAAA,EAC1F,EAAe,GACd,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAK,WAAtB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAK,WAAc,CAAA,EAAC,cAEjC,CACJ,CAAA,EAAA,IACD,IAGP,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CACE,IAAK,EACL,UAAW,GAAG,EAAK,SAAS,GAAG,EAAK,UAAU,GAAG,EAAO,SACxD,SAAU,EACV,KAAK,QACL,aAAY,GAAG,EAAM,6CACrB,mBAAkB,EAClB,YAAe,EAAU,GAAM,GAAK,CAAE,EAAG,EAAG,EAAG,CAAE,CAAC,EAClD,WAAc,EAAS,IAAI,EAC3B,UAAW,GATb,SAAA,EAWE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAK,IAAK,MAAO,EAAM,OAAQ,GAAM,QAAS,OAAO,EAAK,GAAG,KAAQ,KAAK,MAAM,aAAY,GAA5G,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,GAAI,CAAU,CAAA,CACxB,CAAA,EAEL,EACG,EAAQ,KAAK,EAAG,IAAO,CACrB,IAAM,EAAI,EAAO,QAAQ,IAAO,KAC1B,EAAI,IAAM,KAAO,EAAI,KAAK,IAAI,EAAI,EAAI,EAAI,EAAI,EAAI,IAAgB,EAAY,EAAE,EAChF,EAAI,EAAQ,GAAM,EAAQ,GAChC,OACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAsB,iBAAgB,EAAE,GACrC,SAAA,IAAM,KAAO,MAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAG,EAAI,EAAQ,GAAK,EAAG,EAAY,EAAG,MAAO,EAAQ,GAAK,OAAQ,EAAG,GAAI,EAAG,KAAM,CAAwB,CAAA,CACpI,EAFK,MAAM,EAAE,IAEb,CAEP,CAAC,EACD,KAEH,EAAQ,KAAK,EAAG,IAAO,CACtB,IAAM,EAAI,EAAQ,GAAM,EAAQ,GAC1B,EAAQ,KAAK,IAAI,EAAG,KAAK,OAAO,GAAS,EAAE,OAAS,GAAK,IAAM,CAAC,CAAC,EACvE,OACE,EAAA,EAAA,KAAA,CAAC,IAAD,CAAA,SAAA,CACG,EAAE,QAAS,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,OAAQ,EAAE,OAAQ,EAAG,EAAI,EAAG,EAAG,EAAY,EAAG,OAAQ,EAAgB,CAAA,EAAI,MAClG,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAK,MAAO,EAAG,GAAK,EAAE,OAAS,GAAK,EAAQ,GAAI,EAAG,EAAY,EAAW,EAAG,GAAG,SAAS,WAAY,EAAE,OAAS,QAAU,SACxI,SAAA,EAAE,MAAM,OAAS,EAAQ,GAAG,EAAE,MAAM,MAAM,EAAG,EAAQ,CAAC,EAAE,GAAK,EAAE,KAC5D,CAAA,CACL,CAAA,EALK,MAAM,EAAE,IAKb,CAEP,CAAC,EACA,EAAK,KAAK,EAAK,IAAO,CACrB,IAAM,EAAI,EAAQ,EAAM,GAClB,EAAI,EAAO,KAAK,IAAO,KACvB,EAAO,IAAM,KAAO,EAAI,KAAK,IAAI,EAAI,EAAI,EAAI,EAAI,EAAI,GAAe,CAAU,EAC9E,EAAO,EAAQ,EAAQ,QAAU,EAAQ,GAAO,EACtD,OACE,EAAA,EAAA,KAAA,CAAC,IAAD,CAAgB,WAAU,EAAI,GAA9B,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAK,MAAO,EAAG,EAAS,EAAG,EAAG,EAAI,EAAQ,EAAG,GAAG,SAAS,WAAW,MAClF,SAAA,EAAI,MAAM,OAAS,GAAa,GAAG,EAAI,MAAM,MAAM,EAAG,GAAa,CAAC,EAAE,GAAK,EAAI,KAC5E,CAAA,EACL,EAAQ,KAAK,EAAK,IAAO,CACxB,IAAM,EAAI,EAAU,EAAI,CAAE,EACpB,EAAI,EAAQ,GAAM,EAAQ,GAC1B,EAAU,GAAW,IAAM,GAAM,EAAU,IAAM,EACvD,OACE,EAAA,EAAA,KAAA,CAAC,IAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CACE,YAAW,GAAG,EAAI,GAAG,GAAG,EAAI,KAC5B,aAAY,IAAM,KAAO,UAAY,EACrC,UAAW,GAAG,IAAM,KAAO,EAAK,YAAc,GAAG,GAAG,EAAU,EAAO,MAAQ,KAC7E,EAAG,IAAM,KAAO,EAAI,GAAM,EAC1B,EAAG,IAAM,KAAO,EAAI,GAAM,EAC1B,MAAO,IAAM,KAAO,EAAQ,EAAI,EAChC,OAAQ,IAAM,KAAO,GAAY,EACjC,GAAI,EACJ,KAAM,GAAK,CAAC,EACZ,mBAAsB,EAAS,CAAE,EAAG,EAAI,EAAG,CAAG,CAAC,EAC/C,mBAAsB,EAAS,IAAI,CACpC,CAAA,EACA,IAAe,IAAM,MAIpB,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,kBAAiB,GAAG,EAAI,GAAG,GAAG,EAAI,KAAM,UAAW,EAAO,IAAK,EAAG,EAAI,EAAQ,EAAG,EAAG,EAAI,EAAQ,EAAG,GAAG,SAAS,WAAW,SAAS,KAAM,GAAQ,CAAC,EACrJ,SAAA,EAAY,CAAC,CACV,CAAA,EACJ,IACH,CAAA,EAtBK,EAAI,EAsBT,CAEP,CAAC,EACA,GACC,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,iBAAgB,EAAI,GAAvB,SAAA,CACG,IAAM,KAAO,MAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAG,EAAM,EAAG,EAAI,EAAQ,IAAM,MAAO,EAAM,OAAQ,EAAQ,GAAK,GAAI,EAAG,KAAM,CAAwB,CAAA,GAChI,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAK,KAAM,EAAG,EAAO,EAAO,EAAG,EAAG,EAAI,EAAQ,EAAG,GAAG,SAClE,SAAA,IAAM,KAAO,IAAM,EAAY,CAAC,CAC7B,CAAA,CACL,CACD,CAAA,EAAA,IACH,CA1CK,EAAA,EAAI,EA0CT,CAEP,CAAC,CACE,KACL,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,GAAI,EAAQ,UAAW,EAAK,OAAQ,YAAU,SACjD,SAAA,EAAY,GAAS,EAAU,EAAG,EAAU,CAAC,EAAI,EAC9C,CAAA,EACL,GACC,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAM,EAAiB,EAAQ,EAAU,GAAK,EAAQ,GAAO,EAAQ,EAAG,EAAM,EAAE,EAChF,IAAK,EAAQ,EAAU,EAAK,GAC5B,MAAO,GAAG,EAAK,EAAU,EAAE,CAAE,MAAM,KAAK,EAAQ,EAAU,EAAE,CAAE,QAC9D,KAAM,CAAC,CAAE,IAAK,IAAK,MAAO,GAAQ,QAAS,MAAO,EAAU,EAAU,EAAG,EAAU,CAAC,IAAM,KAAO,KAAO,EAAY,EAAU,EAAU,EAAG,EAAU,CAAC,CAAE,CAAE,CAAC,CAC5J,CAAA,EACC,IACD,GACK,CAAA,CAEhB"}
@@ -0,0 +1,2 @@
1
+ import{n as e}from"./index-DZ-UQ7v8.js";import{AppsSection as t}from"./AppsSection-DISYnMnc.js";var n=e();function r(){return(0,n.jsx)(t,{focusGroup:`mcp-servers`})}export{r as McpSection};
2
+ //# sourceMappingURL=McpSection-DGbRcyv8.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"McpSection-BRuCcTjT.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/sections/McpSection.tsx"],"sourcesContent":["/**\n * routes/verse/sections/McpSection.tsx — the legacy MCP entry point, folded\n * into Apps & Accounts (SPEC-310C §0.1 \"MCP moves into Apps\", §4).\n *\n * MCP is no longer a section of its own: its per-seat view, the standing\n * caveat (Claude and local seats load none), the drift alert and — new — the\n * Add flow all live in the MCP SERVERS group of the Apps page. This file stays\n * only so a shell that still routes `mcp` (a stored v2 `section: 'mcp'`, or\n * C1's `fallbackModules: ['McpSection']` while AppsSection is loading) lands\n * on that group instead of on a \"missing section\" notice. It renders the same\n * page — one implementation, never two MCP views that could drift.\n */\nimport { AppsSection } from './AppsSection.js';\n\nexport function McpSection() {\n return <AppsSection focusGroup=\"mcp-servers\" />;\n}\n"],"mappings":"0GAcA,SAAgB,GAAa,CAC3B,OAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,WAAW,aAAe,CAAA,CAChD"}
1
+ {"version":3,"file":"McpSection-DGbRcyv8.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/sections/McpSection.tsx"],"sourcesContent":["/**\n * routes/verse/sections/McpSection.tsx — the legacy MCP entry point, folded\n * into Apps & Accounts (SPEC-310C §0.1 \"MCP moves into Apps\", §4).\n *\n * MCP is no longer a section of its own: its per-seat view, the standing\n * caveat (Claude and local seats load none), the drift alert and — new — the\n * Add flow all live in the MCP SERVERS group of the Apps page. This file stays\n * only so a shell that still routes `mcp` (a stored v2 `section: 'mcp'`, or\n * C1's `fallbackModules: ['McpSection']` while AppsSection is loading) lands\n * on that group instead of on a \"missing section\" notice. It renders the same\n * page — one implementation, never two MCP views that could drift.\n */\nimport { AppsSection } from './AppsSection.js';\n\nexport function McpSection() {\n return <AppsSection focusGroup=\"mcp-servers\" />;\n}\n"],"mappings":"0GAcA,SAAgB,GAAa,CAC3B,OAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,WAAW,aAAe,CAAA,CAChD"}