@cortexkit/opencode-antigravity-auth 3.0.5 → 3.0.6

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 (370) hide show
  1. package/README.md +38 -352
  2. package/dist/cli.js +9199 -8799
  3. package/dist/cli.js.map +4 -4
  4. package/dist/cli.meta.json +1286 -1064
  5. package/dist/index.js +13641 -14559
  6. package/dist/index.js.map +4 -4
  7. package/dist/index.meta.json +1333 -1342
  8. package/dist/server.js +10618 -11080
  9. package/dist/server.js.map +4 -4
  10. package/dist/server.meta.json +1 -1
  11. package/dist/src/auth-method-labels.d.ts +3 -0
  12. package/dist/src/auth-method-labels.d.ts.map +1 -0
  13. package/dist/src/auth-method-labels.js +5 -0
  14. package/dist/src/auth-method-labels.js.map +1 -0
  15. package/dist/src/cli.d.ts +3 -1
  16. package/dist/src/cli.d.ts.map +1 -1
  17. package/dist/src/cli.js +98 -12
  18. package/dist/src/cli.js.map +1 -1
  19. package/dist/src/common-auth-embedded/claustrum/consumer.d.ts +33 -3
  20. package/dist/src/common-auth-embedded/claustrum/consumer.js +96 -1
  21. package/dist/src/common-auth-embedded/claustrum/custody.d.ts +4 -1
  22. package/dist/src/common-auth-embedded/claustrum/enrollment.d.ts +6 -1
  23. package/dist/src/common-auth-embedded/claustrum/enrollment.js +6 -1
  24. package/dist/src/common-auth-embedded/claustrum/index.d.ts +2 -1
  25. package/dist/src/common-auth-embedded/claustrum/index.js +5 -3
  26. package/dist/src/common-auth-embedded/claustrum/insula.d.ts +69 -0
  27. package/dist/src/common-auth-embedded/claustrum/insula.js +152 -0
  28. package/dist/src/common-auth-embedded/claustrum/roster.d.ts +13 -0
  29. package/dist/src/common-auth-embedded/claustrum/roster.js +33 -3
  30. package/dist/src/common-auth-embedded/fs/refresh-file-lock.js +20 -11
  31. package/dist/src/common-auth-embedded/quota/codec.d.ts +2 -0
  32. package/dist/src/common-auth-embedded/quota/codec.js +2 -1
  33. package/dist/src/common-auth-embedded/quota/format.d.ts +26 -0
  34. package/dist/src/common-auth-embedded/quota/format.js +78 -42
  35. package/dist/src/common-auth-embedded/quota/index.d.ts +4 -4
  36. package/dist/src/common-auth-embedded/quota/index.js +2 -2
  37. package/dist/src/common-auth-embedded/quota/map.d.ts +11 -0
  38. package/dist/src/common-auth-embedded/quota/map.js +36 -1
  39. package/dist/src/common-auth-embedded/quota/merge.d.ts +3 -1
  40. package/dist/src/common-auth-embedded/quota/merge.js +21 -5
  41. package/dist/src/common-auth-embedded/quota/projection.d.ts +2 -1
  42. package/dist/src/common-auth-embedded/quota/projection.js +3 -1
  43. package/dist/src/common-auth-embedded/setup/command-runner.js +49 -0
  44. package/dist/src/common-auth-embedded/setup/command.d.ts +3 -0
  45. package/dist/src/common-auth-embedded/setup/command.js +215 -0
  46. package/dist/src/common-auth-embedded/setup/config-write.js +60 -0
  47. package/dist/src/common-auth-embedded/setup/detect.d.ts +6 -0
  48. package/dist/src/common-auth-embedded/setup/detect.js +224 -0
  49. package/dist/src/common-auth-embedded/setup/enroll.js +70 -0
  50. package/dist/src/common-auth-embedded/setup/index.d.ts +5 -0
  51. package/dist/src/common-auth-embedded/setup/index.js +4 -0
  52. package/dist/src/common-auth-embedded/setup/paths.js +33 -0
  53. package/dist/src/common-auth-embedded/setup/process-fence.d.ts +43 -0
  54. package/dist/src/common-auth-embedded/setup/process-fence.js +270 -0
  55. package/dist/src/common-auth-embedded/setup/prompts.js +26 -0
  56. package/dist/src/common-auth-embedded/setup/register.d.ts +11 -0
  57. package/dist/src/common-auth-embedded/setup/register.js +130 -0
  58. package/dist/src/common-auth-embedded/setup/types.d.ts +136 -0
  59. package/dist/src/common-auth-embedded/source-output.json +228 -80
  60. package/dist/src/common-auth-embedded/store/schema.d.ts +2 -0
  61. package/dist/src/common-auth-embedded/store/schema.js +3 -2
  62. package/dist/src/ga/rpc/protocol.d.ts +4 -7
  63. package/dist/src/ga/rpc/protocol.d.ts.map +1 -1
  64. package/dist/src/ga/rpc/protocol.js +5 -13
  65. package/dist/src/ga/rpc/protocol.js.map +1 -1
  66. package/dist/src/ga/server/auth.d.ts +8 -3
  67. package/dist/src/ga/server/auth.d.ts.map +1 -1
  68. package/dist/src/ga/server/auth.js +25 -9
  69. package/dist/src/ga/server/auth.js.map +1 -1
  70. package/dist/src/ga/server/index.d.ts +39 -12
  71. package/dist/src/ga/server/index.d.ts.map +1 -1
  72. package/dist/src/ga/server/index.js +214 -53
  73. package/dist/src/ga/server/index.js.map +1 -1
  74. package/dist/src/ga/server/pool-login.d.ts +22 -0
  75. package/dist/src/ga/server/pool-login.d.ts.map +1 -0
  76. package/dist/src/ga/server/pool-login.js +150 -0
  77. package/dist/src/ga/server/pool-login.js.map +1 -0
  78. package/dist/src/ga/tui/host-ga.d.ts +2 -5
  79. package/dist/src/ga/tui/host-ga.d.ts.map +1 -1
  80. package/dist/src/ga/tui/host-ga.js +17 -49
  81. package/dist/src/ga/tui/host-ga.js.map +1 -1
  82. package/dist/src/plugin/accounts.d.ts +1 -1
  83. package/dist/src/plugin/accounts.d.ts.map +1 -1
  84. package/dist/src/plugin/accounts.js +1 -0
  85. package/dist/src/plugin/accounts.js.map +1 -1
  86. package/dist/src/plugin/background-vault-quota-refresh.d.ts +2 -0
  87. package/dist/src/plugin/background-vault-quota-refresh.d.ts.map +1 -1
  88. package/dist/src/plugin/background-vault-quota-refresh.js +125 -10
  89. package/dist/src/plugin/background-vault-quota-refresh.js.map +1 -1
  90. package/dist/src/plugin/command-apply.d.ts +2 -2
  91. package/dist/src/plugin/command-apply.d.ts.map +1 -1
  92. package/dist/src/plugin/command-apply.js +3 -10
  93. package/dist/src/plugin/command-apply.js.map +1 -1
  94. package/dist/src/plugin/commands.d.ts +1 -0
  95. package/dist/src/plugin/commands.d.ts.map +1 -1
  96. package/dist/src/plugin/commands.js +2 -2
  97. package/dist/src/plugin/commands.js.map +1 -1
  98. package/dist/src/plugin/config/operator-settings-schema.d.ts +0 -4
  99. package/dist/src/plugin/config/operator-settings-schema.d.ts.map +1 -1
  100. package/dist/src/plugin/config/operator-settings-schema.js +0 -5
  101. package/dist/src/plugin/config/operator-settings-schema.js.map +1 -1
  102. package/dist/src/plugin/config/schema.d.ts +0 -7
  103. package/dist/src/plugin/config/schema.d.ts.map +1 -1
  104. package/dist/src/plugin/config/schema.js +0 -43
  105. package/dist/src/plugin/config/schema.js.map +1 -1
  106. package/dist/src/plugin/config/writer.d.ts +1 -1
  107. package/dist/src/plugin/config/writer.js +1 -1
  108. package/dist/src/plugin/fetch/retry-state.d.ts +19 -3
  109. package/dist/src/plugin/fetch/retry-state.d.ts.map +1 -1
  110. package/dist/src/plugin/fetch/retry-state.js +0 -6
  111. package/dist/src/plugin/fetch/retry-state.js.map +1 -1
  112. package/dist/src/plugin/fetch-interceptor.d.ts.map +1 -1
  113. package/dist/src/plugin/fetch-interceptor.js +0 -3
  114. package/dist/src/plugin/fetch-interceptor.js.map +1 -1
  115. package/dist/src/plugin/fetch-routing.d.ts +0 -16
  116. package/dist/src/plugin/fetch-routing.d.ts.map +1 -1
  117. package/dist/src/plugin/fetch-routing.js +0 -49
  118. package/dist/src/plugin/fetch-routing.js.map +1 -1
  119. package/dist/src/plugin/ga-location-services.d.ts +14 -9
  120. package/dist/src/plugin/ga-location-services.d.ts.map +1 -1
  121. package/dist/src/plugin/ga-location-services.js +120 -40
  122. package/dist/src/plugin/ga-location-services.js.map +1 -1
  123. package/dist/src/plugin/google-origin.d.ts +7 -0
  124. package/dist/src/plugin/google-origin.d.ts.map +1 -0
  125. package/dist/src/plugin/google-origin.js +14 -0
  126. package/dist/src/plugin/google-origin.js.map +1 -0
  127. package/dist/src/plugin/index.d.ts.map +1 -1
  128. package/dist/src/plugin/index.js +15 -4
  129. package/dist/src/plugin/index.js.map +1 -1
  130. package/dist/src/plugin/oauth-methods.d.ts.map +1 -1
  131. package/dist/src/plugin/oauth-methods.js +0 -33
  132. package/dist/src/plugin/oauth-methods.js.map +1 -1
  133. package/dist/src/plugin/operator-settings.d.ts +1 -1
  134. package/dist/src/plugin/operator-settings.d.ts.map +1 -1
  135. package/dist/src/plugin/operator-settings.js +1 -8
  136. package/dist/src/plugin/operator-settings.js.map +1 -1
  137. package/dist/src/plugin/quota.d.ts +11 -7
  138. package/dist/src/plugin/quota.d.ts.map +1 -1
  139. package/dist/src/plugin/quota.js +128 -102
  140. package/dist/src/plugin/quota.js.map +1 -1
  141. package/dist/src/plugin/request.d.ts +5 -3
  142. package/dist/src/plugin/request.d.ts.map +1 -1
  143. package/dist/src/plugin/request.js +87 -168
  144. package/dist/src/plugin/request.js.map +1 -1
  145. package/dist/src/plugin/server.d.ts.map +1 -1
  146. package/dist/src/plugin/server.js +60 -53
  147. package/dist/src/plugin/server.js.map +1 -1
  148. package/dist/src/plugin/shared/advisory-repository.d.ts +20 -0
  149. package/dist/src/plugin/shared/advisory-repository.d.ts.map +1 -0
  150. package/dist/src/plugin/shared/advisory-repository.js +91 -0
  151. package/dist/src/plugin/shared/advisory-repository.js.map +1 -0
  152. package/dist/src/plugin/shared/request-services.d.ts +19 -25
  153. package/dist/src/plugin/shared/request-services.d.ts.map +1 -1
  154. package/dist/src/plugin/shared/request-services.js +105 -188
  155. package/dist/src/plugin/shared/request-services.js.map +1 -1
  156. package/dist/src/plugin/shared/runtime.js +4 -2
  157. package/dist/src/plugin/shared/runtime.js.map +1 -1
  158. package/dist/src/plugin/shared/vault-request-credentials.d.ts +4 -1
  159. package/dist/src/plugin/shared/vault-request-credentials.d.ts.map +1 -1
  160. package/dist/src/plugin/shared/vault-request-credentials.js +41 -7
  161. package/dist/src/plugin/shared/vault-request-credentials.js.map +1 -1
  162. package/dist/src/plugin/storage.d.ts +2 -2
  163. package/dist/src/plugin/storage.d.ts.map +1 -1
  164. package/dist/src/plugin/storage.js.map +1 -1
  165. package/dist/src/plugin/vault-custody.d.ts.map +1 -1
  166. package/dist/src/plugin/vault-custody.js +147 -35
  167. package/dist/src/plugin/vault-custody.js.map +1 -1
  168. package/dist/src/plugin/vault-quota-outcome.d.ts +19 -0
  169. package/dist/src/plugin/vault-quota-outcome.d.ts.map +1 -0
  170. package/dist/src/plugin/vault-quota-outcome.js +47 -0
  171. package/dist/src/plugin/vault-quota-outcome.js.map +1 -0
  172. package/dist/src/quota-presentation.d.ts +29 -1
  173. package/dist/src/quota-presentation.d.ts.map +1 -1
  174. package/dist/src/quota-presentation.js +52 -17
  175. package/dist/src/quota-presentation.js.map +1 -1
  176. package/dist/src/setup.d.ts +15 -0
  177. package/dist/src/setup.d.ts.map +1 -0
  178. package/dist/src/setup.js +320 -0
  179. package/dist/src/setup.js.map +1 -0
  180. package/dist/src/sidebar-projection.d.ts +1 -1
  181. package/dist/src/sidebar-projection.d.ts.map +1 -1
  182. package/dist/src/sidebar-state.d.ts +1 -1
  183. package/dist/src/sidebar-state.d.ts.map +1 -1
  184. package/dist/src/sidebar-state.js +19 -1
  185. package/dist/src/sidebar-state.js.map +1 -1
  186. package/dist/src/tui.d.ts.map +1 -1
  187. package/dist/src/tui.js +205 -110
  188. package/dist/src/tui.js.map +1 -1
  189. package/dist/tui-build-map.json +37 -37
  190. package/dist/tui-ga-build-map.json +33 -33
  191. package/dist/types/src/auth-method-labels.d.ts +3 -0
  192. package/dist/types/src/auth-method-labels.d.ts.map +1 -0
  193. package/dist/types/src/cli.d.ts +3 -1
  194. package/dist/types/src/cli.d.ts.map +1 -1
  195. package/dist/types/src/common-auth-embedded/auth-menu/terminal.d.ts +43 -0
  196. package/dist/types/src/common-auth-embedded/claustrum/consumer.d.ts +132 -0
  197. package/dist/types/src/common-auth-embedded/claustrum/custody.d.ts +178 -0
  198. package/dist/types/src/common-auth-embedded/claustrum/enrollment.d.ts +164 -0
  199. package/dist/types/src/common-auth-embedded/claustrum/errors.d.ts +16 -0
  200. package/dist/types/src/common-auth-embedded/claustrum/host-slot.d.ts +39 -0
  201. package/dist/types/src/common-auth-embedded/claustrum/index.d.ts +19 -0
  202. package/dist/types/src/common-auth-embedded/claustrum/insula.d.ts +69 -0
  203. package/dist/types/src/common-auth-embedded/claustrum/interlock.d.ts +27 -0
  204. package/dist/types/src/common-auth-embedded/claustrum/roster.d.ts +221 -0
  205. package/dist/types/src/common-auth-embedded/opencode2/errors.d.ts +25 -0
  206. package/dist/types/src/common-auth-embedded/opencode2/index.d.ts +8 -0
  207. package/dist/types/src/common-auth-embedded/opencode2/install.d.ts +55 -0
  208. package/dist/types/src/common-auth-embedded/opencode2/integration.d.ts +112 -0
  209. package/dist/types/src/common-auth-embedded/opencode2/sse.d.ts +12 -0
  210. package/dist/types/src/common-auth-embedded/opencode2/types.d.ts +413 -0
  211. package/dist/types/src/common-auth-embedded/quota/codec.d.ts +2 -0
  212. package/dist/types/src/common-auth-embedded/quota/format.d.ts +26 -0
  213. package/dist/types/src/common-auth-embedded/quota/index.d.ts +4 -4
  214. package/dist/types/src/common-auth-embedded/quota/map.d.ts +11 -0
  215. package/dist/types/src/common-auth-embedded/quota/merge.d.ts +3 -1
  216. package/dist/types/src/common-auth-embedded/quota/projection.d.ts +2 -1
  217. package/dist/types/src/common-auth-embedded/routing/admission.d.ts +93 -0
  218. package/dist/types/src/common-auth-embedded/routing/index.d.ts +8 -0
  219. package/dist/types/src/common-auth-embedded/routing/ordered.d.ts +47 -0
  220. package/dist/types/src/common-auth-embedded/routing/pins.d.ts +22 -0
  221. package/dist/types/src/common-auth-embedded/routing/sticky.d.ts +158 -0
  222. package/dist/types/src/common-auth-embedded/setup/command.d.ts +3 -0
  223. package/dist/types/src/common-auth-embedded/setup/detect.d.ts +6 -0
  224. package/dist/types/src/common-auth-embedded/setup/index.d.ts +5 -0
  225. package/dist/types/src/common-auth-embedded/setup/process-fence.d.ts +43 -0
  226. package/dist/types/src/common-auth-embedded/setup/register.d.ts +11 -0
  227. package/dist/types/src/common-auth-embedded/setup/types.d.ts +136 -0
  228. package/dist/types/src/common-auth-embedded/store/schema.d.ts +2 -0
  229. package/dist/types/src/ga/rpc/protocol.d.ts +4 -7
  230. package/dist/types/src/ga/rpc/protocol.d.ts.map +1 -1
  231. package/dist/types/src/ga/server/auth.d.ts +8 -3
  232. package/dist/types/src/ga/server/auth.d.ts.map +1 -1
  233. package/dist/types/src/ga/server/index.d.ts +39 -12
  234. package/dist/types/src/ga/server/index.d.ts.map +1 -1
  235. package/dist/types/src/ga/server/pool-login.d.ts +22 -0
  236. package/dist/types/src/ga/server/pool-login.d.ts.map +1 -0
  237. package/dist/types/src/plugin/accounts.d.ts +1 -1
  238. package/dist/types/src/plugin/accounts.d.ts.map +1 -1
  239. package/dist/types/src/plugin/background-vault-quota-refresh.d.ts +2 -0
  240. package/dist/types/src/plugin/background-vault-quota-refresh.d.ts.map +1 -1
  241. package/dist/types/src/plugin/command-apply.d.ts +2 -2
  242. package/dist/types/src/plugin/command-apply.d.ts.map +1 -1
  243. package/dist/types/src/plugin/commands.d.ts +1 -0
  244. package/dist/types/src/plugin/commands.d.ts.map +1 -1
  245. package/dist/types/src/plugin/config/operator-settings-schema.d.ts +0 -4
  246. package/dist/types/src/plugin/config/operator-settings-schema.d.ts.map +1 -1
  247. package/dist/types/src/plugin/config/schema.d.ts +0 -7
  248. package/dist/types/src/plugin/config/schema.d.ts.map +1 -1
  249. package/dist/types/src/plugin/config/writer.d.ts +1 -1
  250. package/dist/types/src/plugin/fetch/retry-state.d.ts +19 -3
  251. package/dist/types/src/plugin/fetch/retry-state.d.ts.map +1 -1
  252. package/dist/types/src/plugin/fetch-interceptor.d.ts.map +1 -1
  253. package/dist/types/src/plugin/fetch-routing.d.ts +0 -16
  254. package/dist/types/src/plugin/fetch-routing.d.ts.map +1 -1
  255. package/dist/types/src/plugin/ga-location-services.d.ts +14 -9
  256. package/dist/types/src/plugin/ga-location-services.d.ts.map +1 -1
  257. package/dist/types/src/plugin/google-origin.d.ts +7 -0
  258. package/dist/types/src/plugin/google-origin.d.ts.map +1 -0
  259. package/dist/types/src/plugin/index.d.ts.map +1 -1
  260. package/dist/types/src/plugin/oauth-methods.d.ts.map +1 -1
  261. package/dist/types/src/plugin/operator-settings.d.ts +1 -1
  262. package/dist/types/src/plugin/operator-settings.d.ts.map +1 -1
  263. package/dist/types/src/plugin/quota.d.ts +11 -7
  264. package/dist/types/src/plugin/quota.d.ts.map +1 -1
  265. package/dist/types/src/plugin/request.d.ts +5 -3
  266. package/dist/types/src/plugin/request.d.ts.map +1 -1
  267. package/dist/types/src/plugin/server.d.ts.map +1 -1
  268. package/dist/types/src/plugin/shared/advisory-repository.d.ts +20 -0
  269. package/dist/types/src/plugin/shared/advisory-repository.d.ts.map +1 -0
  270. package/dist/types/src/plugin/shared/request-services.d.ts +19 -25
  271. package/dist/types/src/plugin/shared/request-services.d.ts.map +1 -1
  272. package/dist/types/src/plugin/shared/vault-request-credentials.d.ts +4 -1
  273. package/dist/types/src/plugin/shared/vault-request-credentials.d.ts.map +1 -1
  274. package/dist/types/src/plugin/storage.d.ts +2 -2
  275. package/dist/types/src/plugin/storage.d.ts.map +1 -1
  276. package/dist/types/src/plugin/vault-custody.d.ts.map +1 -1
  277. package/dist/types/src/plugin/vault-quota-outcome.d.ts +19 -0
  278. package/dist/types/src/plugin/vault-quota-outcome.d.ts.map +1 -0
  279. package/dist/types/src/setup.d.ts +15 -0
  280. package/dist/types/src/setup.d.ts.map +1 -0
  281. package/dist/types/src/sidebar-state.d.ts +1 -1
  282. package/dist/types/src/sidebar-state.d.ts.map +1 -1
  283. package/package.json +5 -4
  284. package/src/common-auth-embedded/claustrum/consumer.d.ts +33 -3
  285. package/src/common-auth-embedded/claustrum/consumer.js +96 -1
  286. package/src/common-auth-embedded/claustrum/custody.d.ts +4 -1
  287. package/src/common-auth-embedded/claustrum/enrollment.d.ts +6 -1
  288. package/src/common-auth-embedded/claustrum/enrollment.js +6 -1
  289. package/src/common-auth-embedded/claustrum/index.d.ts +2 -1
  290. package/src/common-auth-embedded/claustrum/index.js +5 -3
  291. package/src/common-auth-embedded/claustrum/insula.d.ts +69 -0
  292. package/src/common-auth-embedded/claustrum/insula.js +152 -0
  293. package/src/common-auth-embedded/claustrum/roster.d.ts +13 -0
  294. package/src/common-auth-embedded/claustrum/roster.js +33 -3
  295. package/src/common-auth-embedded/fs/refresh-file-lock.js +20 -11
  296. package/src/common-auth-embedded/quota/codec.d.ts +2 -0
  297. package/src/common-auth-embedded/quota/codec.js +2 -1
  298. package/src/common-auth-embedded/quota/format.d.ts +26 -0
  299. package/src/common-auth-embedded/quota/format.js +78 -42
  300. package/src/common-auth-embedded/quota/index.d.ts +4 -4
  301. package/src/common-auth-embedded/quota/index.js +2 -2
  302. package/src/common-auth-embedded/quota/map.d.ts +11 -0
  303. package/src/common-auth-embedded/quota/map.js +36 -1
  304. package/src/common-auth-embedded/quota/merge.d.ts +3 -1
  305. package/src/common-auth-embedded/quota/merge.js +21 -5
  306. package/src/common-auth-embedded/quota/projection.d.ts +2 -1
  307. package/src/common-auth-embedded/quota/projection.js +3 -1
  308. package/src/common-auth-embedded/setup/command-runner.js +49 -0
  309. package/src/common-auth-embedded/setup/command.d.ts +3 -0
  310. package/src/common-auth-embedded/setup/command.js +215 -0
  311. package/src/common-auth-embedded/setup/config-write.js +60 -0
  312. package/src/common-auth-embedded/setup/detect.d.ts +6 -0
  313. package/src/common-auth-embedded/setup/detect.js +224 -0
  314. package/src/common-auth-embedded/setup/enroll.js +70 -0
  315. package/src/common-auth-embedded/setup/index.d.ts +5 -0
  316. package/src/common-auth-embedded/setup/index.js +4 -0
  317. package/src/common-auth-embedded/setup/paths.js +33 -0
  318. package/src/common-auth-embedded/setup/process-fence.d.ts +43 -0
  319. package/src/common-auth-embedded/setup/process-fence.js +270 -0
  320. package/src/common-auth-embedded/setup/prompts.js +26 -0
  321. package/src/common-auth-embedded/setup/register.d.ts +11 -0
  322. package/src/common-auth-embedded/setup/register.js +130 -0
  323. package/src/common-auth-embedded/setup/types.d.ts +136 -0
  324. package/src/common-auth-embedded/source-output.json +228 -80
  325. package/src/common-auth-embedded/store/schema.d.ts +2 -0
  326. package/src/common-auth-embedded/store/schema.js +3 -2
  327. package/src/sidebar-state.ts +19 -2
  328. package/src/tui-compiled/common-auth-embedded/quota/codec.js +2 -1
  329. package/src/tui-compiled/common-auth-embedded/quota/format.js +78 -42
  330. package/src/tui-compiled/common-auth-embedded/quota/index.js +2 -2
  331. package/src/tui-compiled/common-auth-embedded/quota/map.js +36 -1
  332. package/src/tui-compiled/common-auth-embedded/quota/merge.js +21 -5
  333. package/src/tui-compiled/common-auth-embedded/quota/projection.js +3 -1
  334. package/src/tui-compiled/quota-presentation.js +42 -9
  335. package/src/tui-compiled/sidebar-state.js +15 -1
  336. package/src/tui-compiled/tui.js +516 -334
  337. package/src/tui-ga-compiled/host-ga.js +11 -38
  338. package/src/tui-ga-compiled/shared/1ff34afa7c42d196-projection.js +3 -1
  339. package/src/tui-ga-compiled/shared/77138df80c7ae006-map.js +36 -1
  340. package/src/tui-ga-compiled/shared/98cc0c186c46c42d-quota-presentation.js +42 -9
  341. package/src/tui-ga-compiled/shared/aef2402f8fc342f0-format.js +78 -42
  342. package/src/tui-ga-compiled/shared/bf17cbee28e58197-index.js +2 -2
  343. package/src/tui-ga-compiled/shared/ca21dc417b36dc5d-codec.js +2 -1
  344. package/src/tui-ga-compiled/shared/ecc214300932dfb6-merge.js +21 -5
  345. package/src/tui-ga-raw/host-ga.tsx +31 -62
  346. package/src/tui-ga-raw/shared/1ff34afa7c42d196-projection.js +3 -1
  347. package/src/tui-ga-raw/shared/77138df80c7ae006-map.js +36 -1
  348. package/src/tui-ga-raw/shared/98cc0c186c46c42d-quota-presentation.js +42 -9
  349. package/src/tui-ga-raw/shared/aef2402f8fc342f0-format.js +78 -42
  350. package/src/tui-ga-raw/shared/bf17cbee28e58197-index.js +2 -2
  351. package/src/tui-ga-raw/shared/ca21dc417b36dc5d-codec.js +2 -1
  352. package/src/tui-ga-raw/shared/ecc214300932dfb6-merge.js +21 -5
  353. package/src/tui-raw/common-auth-embedded/quota/codec.js +2 -1
  354. package/src/tui-raw/common-auth-embedded/quota/format.js +78 -42
  355. package/src/tui-raw/common-auth-embedded/quota/index.js +2 -2
  356. package/src/tui-raw/common-auth-embedded/quota/map.js +36 -1
  357. package/src/tui-raw/common-auth-embedded/quota/merge.js +21 -5
  358. package/src/tui-raw/common-auth-embedded/quota/projection.js +3 -1
  359. package/src/tui-raw/quota-presentation.js +42 -9
  360. package/src/tui-raw/sidebar-state.js +15 -1
  361. package/src/tui-raw/tui.tsx +423 -218
  362. package/src/tui.tsx +423 -218
  363. package/dist/src/tui/vault-setup.d.ts +0 -98
  364. package/dist/src/tui/vault-setup.d.ts.map +0 -1
  365. package/dist/src/tui/vault-setup.js +0 -198
  366. package/dist/src/tui/vault-setup.js.map +0 -1
  367. package/dist/types/src/plugin/transform/model-resolver.d.ts +0 -2
  368. package/dist/types/src/plugin/transform/model-resolver.d.ts.map +0 -1
  369. package/dist/types/src/quota-presentation.d.ts +0 -18
  370. package/dist/types/src/quota-presentation.d.ts.map +0 -1
@@ -1,4 +1,5 @@
1
1
  import { createTextNode as _$createTextNode } from "opentui:runtime-module:%40opentui%2Fsolid";
2
+ import { use as _$use } from "opentui:runtime-module:%40opentui%2Fsolid";
2
3
  import { memo as _$memo } from "opentui:runtime-module:%40opentui%2Fsolid";
3
4
  import { createComponent as _$createComponent } from "opentui:runtime-module:%40opentui%2Fsolid";
4
5
  import { effect as _$effect } from "opentui:runtime-module:%40opentui%2Fsolid";
@@ -21,16 +22,18 @@ import { createElement as _$createElement } from "opentui:runtime-module:%40open
21
22
  * score, and per-session routing decisions), so the fleet components are
22
23
  * adapted rather than copied verbatim:
23
24
  *
24
- * - `QuotaRow` reads `remainingPercent + resetAt` from the Antigravity
25
+ * - `WindowRow` reads `remainingPercent + resetAt` from the Antigravity
25
26
  * `SidebarQuotaEntry` shape and colors via `quotaTone` (remaining
26
- * threshold) instead of `usageTone` (used threshold).
27
+ * threshold) instead of `usageTone` (used threshold). Each window is one
28
+ * line sized from the measured sidebar width.
27
29
  * - `AccountBlock` derives its status word (`active` / `idle` /
28
- * `cooling` / `off` / `blocked`) from the Antigravity account state and
29
- * surfaces health as a muted secondary line rather than a top-level
30
- * bar — fleet parity for "Quota first, health second".
31
- * - `Routing` resolves to a single `Route` `StatRow` carrying the most
32
- * recent `activeRouting` entry, since Antigravity does not maintain a
33
- * per-session sidebar state alongside the slot-rendered tree.
30
+ * `cooling` / `off`) from the Antigravity account state, shows the
31
+ * reading age once per account, and groups windows under `Gemini` and
32
+ * `Other models` headers. The routing health score is not shown.
33
+ * - `Routing` shows the mounted session's most recent `activeRouting`
34
+ * entry, or `No request yet` before the session's first request, since
35
+ * Antigravity does not maintain a per-session sidebar state alongside the
36
+ * slot-rendered tree.
34
37
  *
35
38
  * Hard rules for this file:
36
39
  *
@@ -48,7 +51,7 @@ import { dirname, join } from "node:path";
48
51
  import { fileURLToPath } from "node:url";
49
52
  import { createSlot } from "opentui:runtime-module:%40opentui%2Fsolid";
50
53
  import { createSignal, For, onCleanup, onMount, Show } from "opentui:runtime-module:solid-js";
51
- import { formatQuotaReading, quotaReadingParts } from "./quota-presentation.js";
54
+ import { NO_QUOTA_READING, quotaReadingAge, quotaWindowText } from "./quota-presentation.js";
52
55
  import { getRpcDir } from "./rpc/rpc-dir.js";
53
56
  import { readSidebarState } from "./sidebar-state.js";
54
57
  import { createTuiFileLogger } from "./tui/file-logger.js";
@@ -98,15 +101,35 @@ const dispatchedNotificationIds = new Set();
98
101
  let rpcInFlight = false;
99
102
  const GLOBAL_NOTIFICATION_CURSOR = '__global__';
100
103
  const MAX_NOTIFICATION_CURSORS = 256;
101
- const QUOTA_LABELS = {
102
- gemini: 'Gm',
103
- 'non-gemini': 'NG'
104
+
105
+ // Group headers name each quota pool in plain words.
106
+ const GROUP_NAMES = {
107
+ gemini: 'Gemini',
108
+ 'non-gemini': 'Other models'
104
109
  };
105
- const QUOTA_ORDER = ['gemini', 'non-gemini'];
106
- const WINDOW_GUTTER = {
107
- weekly: '7d',
108
- '5h': '5h'
110
+
111
+ // The collapsed row has room for one word before the window name.
112
+ const COLLAPSED_GROUP_NAMES = {
113
+ gemini: 'Gemini',
114
+ 'non-gemini': 'Other'
109
115
  };
116
+ const QUOTA_ORDER = ['gemini', 'non-gemini'];
117
+
118
+ // Shown instead of a stored figure once the window has reset since it was
119
+ // read: the stored figure describes the window before the reset.
120
+ const RESET_SINCE_READING = 'reset since last check';
121
+
122
+ // Content width (the panel's width inside its padding) used until the first
123
+ // layout pass reports the real one. It fits the narrowest OpenCode sidebar.
124
+ const ASSUMED_CONTENT_WIDTH = 28;
125
+
126
+ // A window row is `<name> <bar> <figure> <reset>`. The bar shrinks to this
127
+ // before the reset column is dropped; below it the bar is dropped too.
128
+ const MIN_BAR_WIDTH = 4;
129
+ // The widest figure the formatter writes: `100% left`.
130
+ const FIGURE_WIDTH = 9;
131
+ // A window name (`5h`, `7d`) and the space after it.
132
+ const NAME_WIDTH = 3;
110
133
 
111
134
  // --- Theme tokens ----------------------------------------------------------
112
135
  //
@@ -200,8 +223,7 @@ function quotaTone(usedPct, appearance) {
200
223
  if (usedPct < appearance.errorThreshold) return 'warn';
201
224
  return 'err';
202
225
  }
203
- function quotaBarSegments(remainingPct, appearance) {
204
- const width = appearance.barWidth;
226
+ function quotaBarSegments(remainingPct, width, appearance) {
205
227
  const usedCells = Math.max(0, Math.min(Math.round(remainingPct / 100 * width), width));
206
228
  const tone = quotaTone(100 - remainingPct, appearance);
207
229
  return [{
@@ -314,12 +336,6 @@ function getSidebarController() {
314
336
 
315
337
  // --- Shared helpers (fleet shape, antigravity data) ------------------------
316
338
 
317
- function clamp(value, min, max) {
318
- if (value < min) return min;
319
- if (value > max) return max;
320
- return value;
321
- }
322
-
323
339
  // Render a "reset in Nm/Nh/NdNh" string from an epoch-ms reset time.
324
340
  // Empty string when no resetAt is cached. The fleet's `formatResetIn`
325
341
  // reads ISO strings; Antigravity persists resetAt as a numeric epoch, so
@@ -398,11 +414,9 @@ function StatRow(props) {
398
414
  })();
399
415
  }
400
416
 
401
- // Fleet CollapsedRow: muted label left, caller-supplied value right. Used
402
- // for the collapsed sidebar view; the Antigravity adapter renders one
403
- // CollapsedRow per visible account (Claude's sibling collapses to a
404
- // single primary-quota line, but Antigravity's multi-quota model fits a
405
- // per-account row better when the sidebar is collapsed).
417
+ // Fleet CollapsedRow: muted label left, caller-supplied value right. The
418
+ // collapsed view renders one for the active account. The caller sizes both
419
+ // sides to the measured width, so neither side may wrap.
406
420
  function CollapsedRow(props) {
407
421
  return (() => {
408
422
  var _el$8 = _$createElement("box"),
@@ -411,6 +425,8 @@ function CollapsedRow(props) {
411
425
  _$setProp(_el$8, "width", '100%');
412
426
  _$setProp(_el$8, "flexDirection", 'row');
413
427
  _$setProp(_el$8, "justifyContent", 'space-between');
428
+ _$setProp(_el$9, "flexShrink", 0);
429
+ _$setProp(_el$9, "wrapMode", 'none');
414
430
  _$insert(_el$9, () => props.label);
415
431
  _$insert(_el$8, () => props.children, null);
416
432
  _$effect(_$p => _$setProp(_el$9, "fg", props.theme().textMuted, _$p));
@@ -418,226 +434,342 @@ function CollapsedRow(props) {
418
434
  })();
419
435
  }
420
436
 
421
- // The bar fills with remaining quota. The shared formatter supplies the
422
- // figure, reset and reading age; the right column aligns reset and age text.
423
- function QuotaRow(props) {
424
- const parts = () => quotaReadingParts(props.label, props.entry, props.now());
425
- const remaining = () => parts().remaining;
426
- const reset = () => parts().detail;
427
- return _$createComponent(Show, {
428
- get when() {
429
- return remaining() != null;
430
- },
431
- get fallback() {
432
- return (() => {
433
- var _el$14 = _$createElement("box"),
434
- _el$15 = _$createElement("text"),
435
- _el$16 = _$createElement("text");
436
- _$insertNode(_el$14, _el$15);
437
- _$insertNode(_el$14, _el$16);
438
- _$setProp(_el$14, "width", '100%');
439
- _$setProp(_el$14, "flexDirection", 'row');
440
- _$setProp(_el$14, "justifyContent", 'space-between');
441
- _$insert(_el$15, () => props.label.padEnd(5));
442
- _$insert(_el$16, () => parts().figure);
443
- _$effect(_p$ => {
444
- var _v$6 = props.theme().textMuted,
445
- _v$7 = props.theme().textMuted;
446
- _v$6 !== _p$.e && (_p$.e = _$setProp(_el$15, "fg", _v$6, _p$.e));
447
- _v$7 !== _p$.t && (_p$.t = _$setProp(_el$16, "fg", _v$7, _p$.t));
448
- return _p$;
449
- }, {
450
- e: undefined,
451
- t: undefined
452
- });
453
- return _el$14;
454
- })();
455
- },
456
- get children() {
457
- var _el$0 = _$createElement("box"),
458
- _el$1 = _$createElement("box"),
459
- _el$10 = _$createElement("text"),
460
- _el$11 = _$createElement("box"),
461
- _el$12 = _$createElement("text");
462
- _$insertNode(_el$0, _el$1);
463
- _$setProp(_el$0, "width", '100%');
464
- _$setProp(_el$0, "flexDirection", 'row');
465
- _$setProp(_el$0, "justifyContent", 'space-between');
466
- _$insertNode(_el$1, _el$10);
467
- _$insertNode(_el$1, _el$11);
468
- _$insertNode(_el$1, _el$12);
469
- _$setProp(_el$1, "flexDirection", 'row');
470
- _$setProp(_el$10, "width", 5);
471
- _$setProp(_el$10, "flexShrink", 0);
472
- _$insert(_el$10, () => props.label);
473
- _$setProp(_el$11, "flexShrink", 0);
474
- _$setProp(_el$11, "flexDirection", 'row');
475
- _$insert(_el$11, _$createComponent(For, {
476
- get each() {
477
- return quotaBarSegments(remaining() ?? 0, props.appearance);
478
- },
479
- children: segment => (() => {
480
- var _el$17 = _$createElement("text");
481
- _$insert(_el$17, () => segment.text);
482
- _$effect(_$p => _$setProp(_el$17, "fg", toneColor(props.theme(), segment.tone), _$p));
483
- return _el$17;
484
- })()
485
- }));
486
- _$insert(_el$12, () => ` ${parts().figure}`);
487
- _$insert(_el$0, _$createComponent(Show, {
488
- get when() {
489
- return reset();
490
- },
491
- get children() {
492
- var _el$13 = _$createElement("text");
493
- _$insert(_el$13, reset);
494
- _$effect(_$p => _$setProp(_el$13, "fg", props.theme().textMuted, _$p));
495
- return _el$13;
496
- }
497
- }), null);
498
- _$effect(_p$ => {
499
- var _v$3 = props.theme().textMuted,
500
- _v$4 = props.appearance.barWidth,
501
- _v$5 = toneColor(props.theme(), quotaTone(100 - (remaining() ?? 0), props.appearance));
502
- _v$3 !== _p$.e && (_p$.e = _$setProp(_el$10, "fg", _v$3, _p$.e));
503
- _v$4 !== _p$.t && (_p$.t = _$setProp(_el$11, "width", _v$4, _p$.t));
504
- _v$5 !== _p$.a && (_p$.a = _$setProp(_el$12, "fg", _v$5, _p$.a));
505
- return _p$;
506
- }, {
507
- e: undefined,
508
- t: undefined,
509
- a: undefined
510
- });
511
- return _el$0;
512
- }
513
- });
437
+ // --- Width-fitted quota rows ------------------------------------------------
438
+ //
439
+ // The OpenCode 1 sidebar is about 32 to 48 columns wide. Every quota line is
440
+ // sized from the measured content width so that it fits on one line: text is
441
+ // never left to the renderer's wrapping, which breaks a row mid-word or down
442
+ // to one character per line once the right-hand column runs out of room.
443
+
444
+ // One entry per stored window, in group order. A pool stored before
445
+ // per-window readings existed contributes one window without a name.
446
+ function accountWindows(account, now) {
447
+ const result = [];
448
+ for (const key of QUOTA_ORDER) {
449
+ const entry = account.quota[key];
450
+ if (!entry) continue;
451
+ const readings = entry.windows && entry.windows.length > 0 ? entry.windows.map(window => ({
452
+ window: window.window,
453
+ remainingPercent: window.remainingPercent,
454
+ resetAt: window.resetAt,
455
+ checkedAt: window.checkedAt
456
+ })) : [{
457
+ remainingPercent: entry.remainingPercent,
458
+ resetAt: entry.resetAt,
459
+ checkedAt: entry.checkedAt
460
+ }];
461
+ for (const reading of readings) result.push({
462
+ key,
463
+ reading,
464
+ text: quotaWindowText(reading, now)
465
+ });
466
+ }
467
+ return result;
468
+ }
469
+
470
+ // A window shows its figure only while no reset has happened since it was
471
+ // read and it has a read time at all.
472
+ function showsFigure(window) {
473
+ return window.text.remaining != null && !window.text.resetSinceReading;
474
+ }
475
+ // Column widths for one `<name> <bar> <figure> <reset>` row within `width`
476
+ // cells. The bar shrinks first, down to MIN_BAR_WIDTH; then the reset column
477
+ // is dropped; then the bar.
478
+ function windowRowLayout(width, named, resetWidth, maxBar) {
479
+ const room = width - (named ? NAME_WIDTH : 0) - FIGURE_WIDTH;
480
+ if (resetWidth > 0) {
481
+ const bar = Math.min(maxBar, room - resetWidth - 2);
482
+ if (bar >= MIN_BAR_WIDTH) return {
483
+ bar,
484
+ reset: true
485
+ };
486
+ }
487
+ const bar = Math.min(maxBar, room - 1);
488
+ return {
489
+ bar: bar >= MIN_BAR_WIDTH ? bar : 0,
490
+ reset: false
491
+ };
492
+ }
493
+
494
+ // Shorten a label to `max` cells, marking the cut with an ellipsis.
495
+ function fitLabel(label, max) {
496
+ if (label.length <= max) return label;
497
+ if (max <= 0) return '';
498
+ if (max === 1) return '…';
499
+ return `${label.slice(0, max - 1)}…`;
514
500
  }
515
501
 
516
- // Fleet AccountBlock, adapted to Antigravity's per-account data. Header
517
- // row is account label (left) + status word (right). The body renders one
518
- // QuotaRow per present quota group in the fleet's stable order, then a
519
- // muted secondary line with the account's health score and, when
520
- // relevant, a cooldown countdown. Status word priorities (first match
521
- // wins):
502
+ // One quota window on one line. The bar fills with remaining quota; the
503
+ // figure and reset come from the shared formatter. A window that reset since
504
+ // its reading shows that fact, dim, in place of the stale figure.
505
+ function WindowRow(props) {
506
+ const text = () => props.window.text;
507
+ const tone = () => quotaTone(100 - (text().remaining ?? 0), props.appearance);
508
+ return (() => {
509
+ var _el$0 = _$createElement("box");
510
+ _$setProp(_el$0, "width", '100%');
511
+ _$setProp(_el$0, "flexDirection", 'row');
512
+ _$insert(_el$0, _$createComponent(Show, {
513
+ get when() {
514
+ return text().name !== '';
515
+ },
516
+ get children() {
517
+ var _el$1 = _$createElement("text");
518
+ _$setProp(_el$1, "width", 3);
519
+ _$setProp(_el$1, "flexShrink", 0);
520
+ _$setProp(_el$1, "wrapMode", 'none');
521
+ _$insert(_el$1, () => text().name);
522
+ _$effect(_$p => _$setProp(_el$1, "fg", props.theme().textMuted, _$p));
523
+ return _el$1;
524
+ }
525
+ }), null);
526
+ _$insert(_el$0, _$createComponent(Show, {
527
+ get when() {
528
+ return showsFigure(props.window);
529
+ },
530
+ get fallback() {
531
+ return (() => {
532
+ var _el$14 = _$createElement("text");
533
+ _$setProp(_el$14, "flexShrink", 1);
534
+ _$setProp(_el$14, "wrapMode", 'none');
535
+ _$insert(_el$14, (() => {
536
+ var _c$ = _$memo(() => !!text().resetSinceReading);
537
+ return () => _c$() ? RESET_SINCE_READING : text().figure;
538
+ })());
539
+ _$effect(_$p => _$setProp(_el$14, "fg", props.theme().textMuted, _$p));
540
+ return _el$14;
541
+ })();
542
+ },
543
+ get children() {
544
+ return [_$createComponent(Show, {
545
+ get when() {
546
+ return props.layout.bar > 0;
547
+ },
548
+ get children() {
549
+ var _el$10 = _$createElement("box");
550
+ _$setProp(_el$10, "flexShrink", 0);
551
+ _$setProp(_el$10, "flexDirection", 'row');
552
+ _$insert(_el$10, _$createComponent(For, {
553
+ get each() {
554
+ return quotaBarSegments(text().remaining ?? 0, props.layout.bar, props.appearance);
555
+ },
556
+ children: segment => (() => {
557
+ var _el$15 = _$createElement("text");
558
+ _$setProp(_el$15, "wrapMode", 'none');
559
+ _$insert(_el$15, () => segment.text);
560
+ _$effect(_$p => _$setProp(_el$15, "fg", toneColor(props.theme(), segment.tone), _$p));
561
+ return _el$15;
562
+ })()
563
+ }));
564
+ _$effect(_$p => _$setProp(_el$10, "width", props.layout.bar + 1, _$p));
565
+ return _el$10;
566
+ }
567
+ }), (() => {
568
+ var _el$11 = _$createElement("text");
569
+ _$setProp(_el$11, "flexShrink", 0);
570
+ _$setProp(_el$11, "wrapMode", 'none');
571
+ _$insert(_el$11, () => text().figure);
572
+ _$effect(_$p => _$setProp(_el$11, "fg", toneColor(props.theme(), tone()), _$p));
573
+ return _el$11;
574
+ })(), (() => {
575
+ var _el$12 = _$createElement("box");
576
+ _$setProp(_el$12, "flexGrow", 1);
577
+ return _el$12;
578
+ })(), _$createComponent(Show, {
579
+ get when() {
580
+ return _$memo(() => !!props.layout.reset)() && text().reset !== '';
581
+ },
582
+ get children() {
583
+ var _el$13 = _$createElement("text");
584
+ _$setProp(_el$13, "flexShrink", 0);
585
+ _$setProp(_el$13, "wrapMode", 'none');
586
+ _$insert(_el$13, () => text().reset);
587
+ _$effect(_$p => _$setProp(_el$13, "fg", props.theme().textMuted, _$p));
588
+ return _el$13;
589
+ }
590
+ })];
591
+ }
592
+ }), null);
593
+ return _el$0;
594
+ })();
595
+ }
596
+
597
+ // Fleet AccountBlock, adapted to Antigravity's per-account data. The header
598
+ // line is the account label, the reading age when the oldest reading is
599
+ // stale, and the status word right-aligned; the age moves to its own dim
600
+ // line when the three do not fit. Below it each quota group present gets a
601
+ // plain-word header and one WindowRow per window. Status word priorities
602
+ // (first match wins):
522
603
  // - `off` when the account is disabled
523
- // - `cooling` when cooldownUntil is still in the future
604
+ // - `cooling <wait>` when cooldownUntil is still in the future
524
605
  // - `active` when current === true
525
606
  // - `idle` for the fallback (current === false) case
526
607
  function AccountBlock(props) {
527
608
  const active = () => props.active ?? props.account.current;
609
+ const cooldownMs = () => {
610
+ const cd = props.account.cooldownUntil;
611
+ if (typeof cd !== 'number') return 0;
612
+ return Math.max(0, cd - props.now());
613
+ };
528
614
  const statusWord = () => {
529
615
  if (!props.account.enabled) return 'off';
530
- const cd = props.account.cooldownUntil;
531
- if (typeof cd === 'number' && cd > props.now()) return 'cooling';
616
+ if (cooldownMs() > 0) return `cooling ${formatWait(cooldownMs())}`;
532
617
  return active() ? 'active' : 'idle';
533
618
  };
534
619
  const statusTone = () => {
535
620
  if (!props.account.enabled) return 'muted';
536
- const cd = props.account.cooldownUntil;
537
- if (typeof cd === 'number' && cd > props.now()) return 'warn';
621
+ if (cooldownMs() > 0) return 'warn';
538
622
  return active() ? 'ok' : 'muted';
539
623
  };
540
- const cooldownMs = () => {
541
- const cd = props.account.cooldownUntil;
542
- if (typeof cd !== 'number') return 0;
543
- return Math.max(0, cd - props.now());
544
- };
545
- const healthText = () => {
546
- const base = `health ${Math.round(clamp(props.account.health, 0, 100))}`;
547
- return cooldownMs() > 0 ? `${base} · cooling ${formatWait(cooldownMs())}` : base;
548
- };
624
+ const windows = () => accountWindows(props.account, props.now());
625
+ const age = () => quotaReadingAge(windows().map(window => window.reading), props.now());
626
+ const ageInline = () => age() !== '' && props.account.label.length + 3 + age().length + 1 + statusWord().length <= props.width();
627
+ const label = () => fitLabel(props.account.label, props.width() - 1 - statusWord().length);
628
+ // One reset column width per account, so bars line up across its rows.
629
+ const resetWidth = () => Math.max(0, ...windows().filter(showsFigure).map(window => window.text.reset.length));
630
+ const layoutFor = window => windowRowLayout(props.width(), window.text.name !== '', resetWidth(), props.appearance.barWidth);
631
+ const groups = () => QUOTA_ORDER.map(key => ({
632
+ key,
633
+ windows: windows().filter(window => window.key === key)
634
+ })).filter(group => group.windows.length > 0);
549
635
  return (() => {
550
- var _el$18 = _$createElement("box"),
551
- _el$19 = _$createElement("box"),
552
- _el$20 = _$createElement("text"),
553
- _el$21 = _$createElement("b"),
636
+ var _el$16 = _$createElement("box"),
637
+ _el$17 = _$createElement("box"),
638
+ _el$18 = _$createElement("text"),
639
+ _el$19 = _$createElement("b"),
640
+ _el$21 = _$createElement("box"),
554
641
  _el$22 = _$createElement("text"),
555
- _el$23 = _$createElement("b"),
556
- _el$24 = _$createElement("box"),
557
- _el$25 = _$createElement("text");
642
+ _el$23 = _$createElement("b");
643
+ _$insertNode(_el$16, _el$17);
644
+ _$setProp(_el$16, "width", '100%');
645
+ _$setProp(_el$16, "flexDirection", 'column');
646
+ _$insertNode(_el$17, _el$18);
647
+ _$insertNode(_el$17, _el$21);
648
+ _$insertNode(_el$17, _el$22);
649
+ _$setProp(_el$17, "width", '100%');
650
+ _$setProp(_el$17, "flexDirection", 'row');
558
651
  _$insertNode(_el$18, _el$19);
559
- _$insertNode(_el$18, _el$24);
560
- _$setProp(_el$18, "width", '100%');
561
- _$setProp(_el$18, "flexDirection", 'column');
562
- _$insertNode(_el$19, _el$20);
563
- _$insertNode(_el$19, _el$22);
564
- _$setProp(_el$19, "width", '100%');
565
- _$setProp(_el$19, "flexDirection", 'row');
566
- _$setProp(_el$19, "justifyContent", 'space-between');
567
- _$insertNode(_el$20, _el$21);
568
- _$insert(_el$21, () => props.account.label);
652
+ _$setProp(_el$18, "flexShrink", 0);
653
+ _$setProp(_el$18, "wrapMode", 'none');
654
+ _$insert(_el$19, label);
655
+ _$insert(_el$17, _$createComponent(Show, {
656
+ get when() {
657
+ return ageInline();
658
+ },
659
+ get children() {
660
+ var _el$20 = _$createElement("text");
661
+ _$setProp(_el$20, "flexShrink", 0);
662
+ _$setProp(_el$20, "wrapMode", 'none');
663
+ _$insert(_el$20, () => ` · ${age()}`);
664
+ _$effect(_$p => _$setProp(_el$20, "fg", props.theme().textMuted, _$p));
665
+ return _el$20;
666
+ }
667
+ }), _el$21);
668
+ _$setProp(_el$21, "flexGrow", 1);
569
669
  _$insertNode(_el$22, _el$23);
670
+ _$setProp(_el$22, "flexShrink", 0);
671
+ _$setProp(_el$22, "wrapMode", 'none');
570
672
  _$insert(_el$23, statusWord);
571
- _$insert(_el$18, _$createComponent(For, {
572
- each: QUOTA_ORDER,
573
- children: key => {
574
- const poolEntry = props.account.quota[key];
575
- const windows = poolEntry?.windows;
576
- // Legacy: no windows array — render a single row with the pool label.
577
- const hasWindows = windows && windows.length > 0;
578
- if (!hasWindows) {
579
- return _$createComponent(QuotaRow, {
580
- get theme() {
581
- return props.theme;
582
- },
583
- get appearance() {
584
- return props.appearance;
585
- },
586
- get label() {
587
- return QUOTA_LABELS[key];
588
- },
589
- entry: poolEntry,
590
- get now() {
591
- return props.now;
592
- }
593
- });
594
- }
595
- return _$memo(() => windows.map(w => _$createComponent(QuotaRow, {
596
- get theme() {
597
- return props.theme;
598
- },
599
- get appearance() {
600
- return props.appearance;
601
- },
602
- get label() {
603
- return `${QUOTA_LABELS[key]} ${WINDOW_GUTTER[w.window] ?? w.window}`;
604
- },
605
- get entry() {
606
- return {
607
- remainingPercent: w.remainingPercent,
608
- resetAt: w.resetAt,
609
- checkedAt: w.checkedAt
610
- };
673
+ _$insert(_el$16, _$createComponent(Show, {
674
+ get when() {
675
+ return _$memo(() => age() !== '')() && !ageInline();
676
+ },
677
+ get children() {
678
+ var _el$24 = _$createElement("text");
679
+ _$setProp(_el$24, "wrapMode", 'none');
680
+ _$insert(_el$24, age);
681
+ _$effect(_$p => _$setProp(_el$24, "fg", props.theme().textMuted, _$p));
682
+ return _el$24;
683
+ }
684
+ }), null);
685
+ _$insert(_el$16, _$createComponent(Show, {
686
+ get when() {
687
+ return groups().length > 0;
688
+ },
689
+ get fallback() {
690
+ return (() => {
691
+ var _el$25 = _$createElement("text");
692
+ _$setProp(_el$25, "wrapMode", 'none');
693
+ _$insert(_el$25, NO_QUOTA_READING);
694
+ _$effect(_$p => _$setProp(_el$25, "fg", props.theme().textMuted, _$p));
695
+ return _el$25;
696
+ })();
697
+ },
698
+ get children() {
699
+ return _$createComponent(For, {
700
+ get each() {
701
+ return groups();
611
702
  },
612
- get now() {
613
- return props.now;
614
- }
615
- })));
703
+ children: group => [(() => {
704
+ var _el$26 = _$createElement("text");
705
+ _$setProp(_el$26, "wrapMode", 'none');
706
+ _$insert(_el$26, () => GROUP_NAMES[group.key]);
707
+ _$effect(_$p => _$setProp(_el$26, "fg", props.theme().textMuted, _$p));
708
+ return _el$26;
709
+ })(), _$createComponent(For, {
710
+ get each() {
711
+ return group.windows;
712
+ },
713
+ children: window => _$createComponent(WindowRow, {
714
+ get theme() {
715
+ return props.theme;
716
+ },
717
+ get appearance() {
718
+ return props.appearance;
719
+ },
720
+ window: window,
721
+ get layout() {
722
+ return layoutFor(window);
723
+ }
724
+ })
725
+ })]
726
+ });
616
727
  }
617
- }), _el$24);
618
- _$insertNode(_el$24, _el$25);
619
- _$setProp(_el$24, "width", '100%');
620
- _$setProp(_el$24, "flexDirection", 'row');
621
- _$insert(_el$25, () => ` ${healthText()}`);
728
+ }), null);
622
729
  _$effect(_p$ => {
623
- var _v$8 = props.marginTop ?? 0,
624
- _v$9 = props.theme().text,
625
- _v$0 = toneColor(props.theme(), statusTone()),
626
- _v$1 = props.theme().textMuted;
627
- _v$8 !== _p$.e && (_p$.e = _$setProp(_el$18, "marginTop", _v$8, _p$.e));
628
- _v$9 !== _p$.t && (_p$.t = _$setProp(_el$20, "fg", _v$9, _p$.t));
629
- _v$0 !== _p$.a && (_p$.a = _$setProp(_el$22, "fg", _v$0, _p$.a));
630
- _v$1 !== _p$.o && (_p$.o = _$setProp(_el$25, "fg", _v$1, _p$.o));
730
+ var _v$3 = props.marginTop ?? 0,
731
+ _v$4 = props.theme().text,
732
+ _v$5 = toneColor(props.theme(), statusTone());
733
+ _v$3 !== _p$.e && (_p$.e = _$setProp(_el$16, "marginTop", _v$3, _p$.e));
734
+ _v$4 !== _p$.t && (_p$.t = _$setProp(_el$18, "fg", _v$4, _p$.t));
735
+ _v$5 !== _p$.a && (_p$.a = _$setProp(_el$22, "fg", _v$5, _p$.a));
631
736
  return _p$;
632
737
  }, {
633
738
  e: undefined,
634
739
  t: undefined,
635
- a: undefined,
636
- o: undefined
740
+ a: undefined
637
741
  });
638
- return _el$18;
742
+ return _el$16;
639
743
  })();
640
744
  }
745
+ // The collapsed row's figure: the lowest current window across both groups.
746
+ // A window that reset since its reading is not current and never binds.
747
+ function collapsedQuota(account, now) {
748
+ if (account.quota.gemini == null && account.quota['non-gemini'] == null) return {
749
+ prefix: '',
750
+ text: '—',
751
+ remaining: null
752
+ };
753
+ const windows = accountWindows(account, now);
754
+ let lowest;
755
+ for (const window of windows) {
756
+ if (!showsFigure(window)) continue;
757
+ if (lowest === undefined || (window.text.remaining ?? 100) < (lowest.text.remaining ?? 100)) lowest = window;
758
+ }
759
+ if (lowest) {
760
+ const name = lowest.text.name;
761
+ return {
762
+ prefix: `${COLLAPSED_GROUP_NAMES[lowest.key]}${name ? ` ${name}` : ''} `,
763
+ text: lowest.text.figure,
764
+ remaining: lowest.text.remaining
765
+ };
766
+ }
767
+ return {
768
+ prefix: '',
769
+ text: windows.some(window => window.text.resetSinceReading) ? RESET_SINCE_READING : NO_QUOTA_READING,
770
+ remaining: null
771
+ };
772
+ }
641
773
  function formatWait(ms) {
642
774
  const seconds = Math.ceil(ms / 1000);
643
775
  if (seconds < 60) return `${seconds}s`;
@@ -714,6 +846,24 @@ export function SidebarPanel(props) {
714
846
  };
715
847
  };
716
848
 
849
+ // The route on one `Route <value>` line when it fits, else one line per
850
+ // part with the strategy last.
851
+ const routeValue = route => `${route.strategy ? `${route.strategy} · ` : ''}${route.family}: ${route.style}`;
852
+ const routeLines = route => [`${route.family}: ${route.style}`, route.strategy ?? ''].filter(line => line !== '');
853
+
854
+ // The width available to content: the header row spans the panel inside
855
+ // its border and padding. Layout reports it during a render pass, so the
856
+ // signal is updated afterwards rather than rebuilding rows mid-pass.
857
+ const [contentWidth, setContentWidth] = createSignal(ASSUMED_CONTENT_WIDTH);
858
+ let headerRow;
859
+ const measureContentWidth = () => {
860
+ const width = headerRow?.width;
861
+ if (typeof width !== 'number' || width <= 0) return;
862
+ queueMicrotask(() => {
863
+ if (width !== contentWidth()) setContentWidth(width);
864
+ });
865
+ };
866
+
717
867
  // Header badge: ▼/▶ {label}. The fleet shows the version string on the
718
868
  // right when no degraded state is present; the antigravity adapter keeps
719
869
  // that right-alignment and surfaces `degraded` as a "LIMITED" badge
@@ -723,36 +873,40 @@ export function SidebarPanel(props) {
723
873
  return !hasData() ? name : collapsed() ? `\u25b6 ${name}` : `\u25bc ${name}`;
724
874
  };
725
875
  return (() => {
726
- var _el$26 = _$createElement("box"),
727
- _el$27 = _$createElement("box"),
876
+ var _el$27 = _$createElement("box"),
728
877
  _el$28 = _$createElement("box"),
729
- _el$29 = _$createElement("text"),
730
- _el$30 = _$createElement("b");
731
- _$insertNode(_el$26, _el$27);
732
- _$setProp(_el$26, "width", '100%');
733
- _$setProp(_el$26, "flexDirection", 'column');
734
- _$setProp(_el$26, "border", SINGLE_BORDER);
735
- _$setProp(_el$26, "paddingTop", 1);
736
- _$setProp(_el$26, "paddingBottom", 1);
737
- _$setProp(_el$26, "paddingLeft", 1);
738
- _$setProp(_el$26, "paddingRight", 1);
878
+ _el$29 = _$createElement("box"),
879
+ _el$30 = _$createElement("text"),
880
+ _el$31 = _$createElement("b");
739
881
  _$insertNode(_el$27, _el$28);
740
882
  _$setProp(_el$27, "width", '100%');
741
- _$setProp(_el$27, "flexDirection", 'row');
742
- _$setProp(_el$27, "justifyContent", 'space-between');
743
- _$setProp(_el$27, "alignItems", 'center');
744
- _$setProp(_el$27, "onMouseDown", () => {
883
+ _$setProp(_el$27, "flexDirection", 'column');
884
+ _$setProp(_el$27, "border", SINGLE_BORDER);
885
+ _$setProp(_el$27, "paddingTop", 1);
886
+ _$setProp(_el$27, "paddingBottom", 1);
887
+ _$setProp(_el$27, "paddingLeft", 1);
888
+ _$setProp(_el$27, "paddingRight", 1);
889
+ _$insertNode(_el$28, _el$29);
890
+ _$use(element => {
891
+ headerRow = element;
892
+ }, _el$28);
893
+ _$setProp(_el$28, "onSizeChange", measureContentWidth);
894
+ _$setProp(_el$28, "width", '100%');
895
+ _$setProp(_el$28, "flexDirection", 'row');
896
+ _$setProp(_el$28, "justifyContent", 'space-between');
897
+ _$setProp(_el$28, "alignItems", 'center');
898
+ _$setProp(_el$28, "onMouseDown", () => {
745
899
  // Mirror the fleet guard: only toggle when there is data to expand
746
900
  // into. Without this a click on the empty-awaiting header would just
747
901
  // toggle the affordance for nothing.
748
902
  if (hasData()) controller.toggleCollapsed();
749
903
  });
750
- _$insertNode(_el$28, _el$29);
751
- _$setProp(_el$28, "paddingLeft", 1);
752
- _$setProp(_el$28, "paddingRight", 1);
753
904
  _$insertNode(_el$29, _el$30);
754
- _$insert(_el$30, headerLabel);
755
- _$insert(_el$27, _$createComponent(Show, {
905
+ _$setProp(_el$29, "paddingLeft", 1);
906
+ _$setProp(_el$29, "paddingRight", 1);
907
+ _$insertNode(_el$30, _el$31);
908
+ _$insert(_el$31, headerLabel);
909
+ _$insert(_el$28, _$createComponent(Show, {
756
910
  get when() {
757
911
  return degraded();
758
912
  },
@@ -762,59 +916,42 @@ export function SidebarPanel(props) {
762
916
  return prefs().header.showVersion && PLUGIN_VERSION !== '';
763
917
  },
764
918
  get children() {
765
- var _el$35 = _$createElement("text");
766
- _$insert(_el$35, `v${PLUGIN_VERSION}`);
767
- _$effect(_$p => _$setProp(_el$35, "fg", theme().textMuted, _$p));
768
- return _el$35;
919
+ var _el$36 = _$createElement("text");
920
+ _$insert(_el$36, `v${PLUGIN_VERSION}`);
921
+ _$effect(_$p => _$setProp(_el$36, "fg", theme().textMuted, _$p));
922
+ return _el$36;
769
923
  }
770
924
  });
771
925
  },
772
926
  get children() {
773
- var _el$31 = _$createElement("box"),
774
- _el$32 = _$createElement("text"),
775
- _el$33 = _$createElement("b");
776
- _$insertNode(_el$31, _el$32);
777
- _$setProp(_el$31, "paddingLeft", 1);
778
- _$setProp(_el$31, "paddingRight", 1);
927
+ var _el$32 = _$createElement("box"),
928
+ _el$33 = _$createElement("text"),
929
+ _el$34 = _$createElement("b");
779
930
  _$insertNode(_el$32, _el$33);
780
- _$insertNode(_el$33, _$createTextNode(`LIMITED`));
931
+ _$setProp(_el$32, "paddingLeft", 1);
932
+ _$setProp(_el$32, "paddingRight", 1);
933
+ _$insertNode(_el$33, _el$34);
934
+ _$insertNode(_el$34, _$createTextNode(`LIMITED`));
781
935
  _$effect(_p$ => {
782
- var _v$10 = theme().warning,
783
- _v$11 = theme().background;
784
- _v$10 !== _p$.e && (_p$.e = _$setProp(_el$31, "backgroundColor", _v$10, _p$.e));
785
- _v$11 !== _p$.t && (_p$.t = _$setProp(_el$32, "fg", _v$11, _p$.t));
936
+ var _v$6 = theme().warning,
937
+ _v$7 = theme().background;
938
+ _v$6 !== _p$.e && (_p$.e = _$setProp(_el$32, "backgroundColor", _v$6, _p$.e));
939
+ _v$7 !== _p$.t && (_p$.t = _$setProp(_el$33, "fg", _v$7, _p$.t));
786
940
  return _p$;
787
941
  }, {
788
942
  e: undefined,
789
943
  t: undefined
790
944
  });
791
- return _el$31;
945
+ return _el$32;
792
946
  }
793
947
  }), null);
794
- _$insert(_el$26, _$createComponent(Show, {
948
+ _$insert(_el$27, _$createComponent(Show, {
795
949
  get when() {
796
950
  return _$memo(() => !!collapsed())() && hasData();
797
951
  },
798
952
  get children() {
799
953
  return (() => {
800
954
  const account = () => visibleAccounts().find(entry => entry.current) ?? visibleAccounts()[0];
801
- const remaining = () => {
802
- const q = account()?.quota;
803
- // The lowest remaining percentage among dated readings determines the warning tone.
804
- const gemini = quotaReadingParts('Gm', q?.gemini, now()).remaining;
805
- const nonGemini = quotaReadingParts('NG', q?.['non-gemini'], now()).remaining;
806
- if (gemini === null && nonGemini === null) return null;
807
- return Math.min(gemini ?? 100, nonGemini ?? 100);
808
- };
809
- const poolText = key => {
810
- const entry = account()?.quota[key];
811
- if (!entry) return `${QUOTA_LABELS[key]}: ${formatQuotaReading(QUOTA_LABELS[key], undefined, now())}`;
812
- // Show binding window when available, else just pool label.
813
- const bindingWindow = entry.windows?.reduce((best, w) => best === null || w.remainingPercent < best.remainingPercent ? w : best, null);
814
- const gutter = bindingWindow ? ` ${WINDOW_GUTTER[bindingWindow.window] ?? bindingWindow.window}` : '';
815
- const text = formatQuotaReading(`${QUOTA_LABELS[key]}${gutter}`, bindingWindow ?? entry, now());
816
- return bindingWindow ? `${QUOTA_LABELS[key]} ${text}` : text;
817
- };
818
955
  const unavailable = () => {
819
956
  const selected = account();
820
957
  return selected != null && (!selected.enabled || selected.cooldownUntil != null && selected.cooldownUntil > now());
@@ -823,43 +960,63 @@ export function SidebarPanel(props) {
823
960
  get when() {
824
961
  return account();
825
962
  },
826
- children: selected => _$createComponent(CollapsedRow, {
827
- theme: theme,
828
- get label() {
829
- return selected().label;
830
- },
831
- get children() {
832
- var _el$36 = _$createElement("box"),
833
- _el$37 = _$createElement("text"),
834
- _el$38 = _$createElement("b"),
835
- _el$39 = _$createElement("text");
836
- _$insertNode(_el$36, _el$37);
837
- _$insertNode(_el$36, _el$39);
838
- _$setProp(_el$36, "flexDirection", 'row');
839
- _$insertNode(_el$37, _el$38);
840
- _$insert(_el$38, (() => {
841
- var _c$ = _$memo(() => !!(account()?.quota.gemini == null && account()?.quota['non-gemini'] == null));
842
- return () => _c$() ? '—' : `${poolText('gemini')} · ${poolText('non-gemini')}`;
843
- })());
844
- _$insert(_el$39, () => unavailable() ? ' ⊘' : ' ●');
845
- _$effect(_p$ => {
846
- var _v$15 = toneColor(theme(), remaining() == null ? 'muted' : quotaTone(100 - (remaining() ?? 100), prefs().appearance)),
847
- _v$16 = toneColor(theme(), unavailable() ? 'err' : remaining() == null ? 'muted' : quotaTone(100 - (remaining() ?? 100), prefs().appearance));
848
- _v$15 !== _p$.e && (_p$.e = _$setProp(_el$37, "fg", _v$15, _p$.e));
849
- _v$16 !== _p$.t && (_p$.t = _$setProp(_el$39, "fg", _v$16, _p$.t));
850
- return _p$;
851
- }, {
852
- e: undefined,
853
- t: undefined
854
- });
855
- return _el$36;
856
- }
857
- })
963
+ children: selected => {
964
+ const quota = () => collapsedQuota(selected(), now());
965
+ const tone = () => {
966
+ const remaining = quota().remaining;
967
+ return remaining == null ? 'muted' : quotaTone(100 - remaining, prefs().appearance);
968
+ };
969
+ // Label, one space, the figure and the two-cell dot. The
970
+ // group prefix goes first when narrow; then the label is cut.
971
+ const figure = () => {
972
+ const {
973
+ prefix,
974
+ text
975
+ } = quota();
976
+ const full = `${prefix}${text}`;
977
+ return selected().label.length + 1 + full.length + 2 <= contentWidth() ? full : text;
978
+ };
979
+ const label = () => fitLabel(selected().label, contentWidth() - 1 - figure().length - 2);
980
+ return _$createComponent(CollapsedRow, {
981
+ theme: theme,
982
+ get label() {
983
+ return label();
984
+ },
985
+ get children() {
986
+ var _el$37 = _$createElement("box"),
987
+ _el$38 = _$createElement("text"),
988
+ _el$39 = _$createElement("b"),
989
+ _el$40 = _$createElement("text");
990
+ _$insertNode(_el$37, _el$38);
991
+ _$insertNode(_el$37, _el$40);
992
+ _$setProp(_el$37, "flexDirection", 'row');
993
+ _$setProp(_el$37, "flexShrink", 0);
994
+ _$insertNode(_el$38, _el$39);
995
+ _$setProp(_el$38, "flexShrink", 0);
996
+ _$setProp(_el$38, "wrapMode", 'none');
997
+ _$insert(_el$39, figure);
998
+ _$setProp(_el$40, "flexShrink", 0);
999
+ _$setProp(_el$40, "wrapMode", 'none');
1000
+ _$insert(_el$40, () => unavailable() ? ' ⊘' : ' ●');
1001
+ _$effect(_p$ => {
1002
+ var _v$1 = toneColor(theme(), tone()),
1003
+ _v$10 = toneColor(theme(), unavailable() ? 'err' : tone());
1004
+ _v$1 !== _p$.e && (_p$.e = _$setProp(_el$38, "fg", _v$1, _p$.e));
1005
+ _v$10 !== _p$.t && (_p$.t = _$setProp(_el$40, "fg", _v$10, _p$.t));
1006
+ return _p$;
1007
+ }, {
1008
+ e: undefined,
1009
+ t: undefined
1010
+ });
1011
+ return _el$37;
1012
+ }
1013
+ });
1014
+ }
858
1015
  });
859
1016
  })();
860
1017
  }
861
1018
  }), null);
862
- _$insert(_el$26, _$createComponent(Show, {
1019
+ _$insert(_el$27, _$createComponent(Show, {
863
1020
  get when() {
864
1021
  return !collapsed() || !hasData();
865
1022
  },
@@ -870,14 +1027,14 @@ export function SidebarPanel(props) {
870
1027
  },
871
1028
  get fallback() {
872
1029
  return (() => {
873
- var _el$40 = _$createElement("box"),
874
- _el$41 = _$createElement("text");
875
- _$insertNode(_el$40, _el$41);
876
- _$setProp(_el$40, "marginTop", 1);
877
- _$setProp(_el$40, "width", '100%');
878
- _$insertNode(_el$41, _$createTextNode(`Waiting for quota…`));
879
- _$effect(_$p => _$setProp(_el$41, "fg", theme().textMuted, _$p));
880
- return _el$40;
1030
+ var _el$41 = _$createElement("box"),
1031
+ _el$42 = _$createElement("text");
1032
+ _$insertNode(_el$41, _el$42);
1033
+ _$setProp(_el$41, "marginTop", 1);
1034
+ _$setProp(_el$41, "width", '100%');
1035
+ _$insertNode(_el$42, _$createTextNode(`Waiting for quota…`));
1036
+ _$effect(_$p => _$setProp(_el$42, "fg", theme().textMuted, _$p));
1037
+ return _el$41;
881
1038
  })();
882
1039
  },
883
1040
  get children() {
@@ -900,6 +1057,7 @@ export function SidebarPanel(props) {
900
1057
  },
901
1058
  account: account,
902
1059
  now: now,
1060
+ width: contentWidth,
903
1061
  get marginTop() {
904
1062
  return index() === 0 ? 0 : 1;
905
1063
  }
@@ -919,20 +1077,44 @@ export function SidebarPanel(props) {
919
1077
  return currentRoute();
920
1078
  },
921
1079
  get fallback() {
922
- return _$createComponent(StatRow, {
923
- theme: theme,
924
- label: "Route",
925
- value: "\u2014",
926
- tone: "muted"
927
- });
1080
+ return (() => {
1081
+ var _el$44 = _$createElement("text");
1082
+ _$insertNode(_el$44, _$createTextNode(`No request yet`));
1083
+ _$setProp(_el$44, "wrapMode", 'none');
1084
+ _$effect(_$p => _$setProp(_el$44, "fg", theme().textMuted, _$p));
1085
+ return _el$44;
1086
+ })();
928
1087
  },
929
- children: route => _$createComponent(StatRow, {
930
- theme: theme,
931
- label: "Route",
932
- get value() {
933
- return `${route().strategy ? `${route().strategy} · ` : ''}${route().family}: ${route().style}`;
1088
+ children: route => _$createComponent(Show, {
1089
+ get when() {
1090
+ return 'Route'.length + 1 + routeValue(route()).length <= contentWidth();
934
1091
  },
935
- tone: "accent"
1092
+ get fallback() {
1093
+ return _$createComponent(For, {
1094
+ get each() {
1095
+ return routeLines(route());
1096
+ },
1097
+ children: line => (() => {
1098
+ var _el$46 = _$createElement("text"),
1099
+ _el$47 = _$createElement("b");
1100
+ _$insertNode(_el$46, _el$47);
1101
+ _$setProp(_el$46, "wrapMode", 'none');
1102
+ _$insert(_el$47, line);
1103
+ _$effect(_$p => _$setProp(_el$46, "fg", toneColor(theme(), 'accent'), _$p));
1104
+ return _el$46;
1105
+ })()
1106
+ });
1107
+ },
1108
+ get children() {
1109
+ return _$createComponent(StatRow, {
1110
+ theme: theme,
1111
+ label: "Route",
1112
+ get value() {
1113
+ return routeValue(route());
1114
+ },
1115
+ tone: "accent"
1116
+ });
1117
+ }
936
1118
  })
937
1119
  })];
938
1120
  }
@@ -980,19 +1162,19 @@ export function SidebarPanel(props) {
980
1162
  }
981
1163
  }), null);
982
1164
  _$effect(_p$ => {
983
- var _v$12 = theme().borderActive,
984
- _v$13 = theme().accent,
985
- _v$14 = theme().background;
986
- _v$12 !== _p$.e && (_p$.e = _$setProp(_el$26, "borderColor", _v$12, _p$.e));
987
- _v$13 !== _p$.t && (_p$.t = _$setProp(_el$28, "backgroundColor", _v$13, _p$.t));
988
- _v$14 !== _p$.a && (_p$.a = _$setProp(_el$29, "fg", _v$14, _p$.a));
1165
+ var _v$8 = theme().borderActive,
1166
+ _v$9 = theme().accent,
1167
+ _v$0 = theme().background;
1168
+ _v$8 !== _p$.e && (_p$.e = _$setProp(_el$27, "borderColor", _v$8, _p$.e));
1169
+ _v$9 !== _p$.t && (_p$.t = _$setProp(_el$29, "backgroundColor", _v$9, _p$.t));
1170
+ _v$0 !== _p$.a && (_p$.a = _$setProp(_el$30, "fg", _v$0, _p$.a));
989
1171
  return _p$;
990
1172
  }, {
991
1173
  e: undefined,
992
1174
  t: undefined,
993
1175
  a: undefined
994
1176
  });
995
- return _el$26;
1177
+ return _el$27;
996
1178
  })();
997
1179
  }
998
1180