@ashlr/hub 3.13.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 (625) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/dist/authority-surface.json +204 -124
  3. package/dist/build-identity.json +2 -2
  4. package/dist/cli/authority.js +112 -18
  5. package/dist/cli/authority.js.map +1 -1
  6. package/dist/cli/comms.d.ts +33 -19
  7. package/dist/cli/comms.js +128 -151
  8. package/dist/cli/comms.js.map +1 -1
  9. package/dist/cli/completions.js +1 -1
  10. package/dist/cli/completions.js.map +1 -1
  11. package/dist/cli/daemon.js +29 -0
  12. package/dist/cli/daemon.js.map +1 -1
  13. package/dist/cli/director.d.ts +8 -12
  14. package/dist/cli/director.js +17 -52
  15. package/dist/cli/director.js.map +1 -1
  16. package/dist/cli/fleet.js +4 -1
  17. package/dist/cli/fleet.js.map +1 -1
  18. package/dist/cli/help.js +1 -0
  19. package/dist/cli/help.js.map +1 -1
  20. package/dist/cli/leader.d.ts +27 -3
  21. package/dist/cli/leader.js +253 -4
  22. package/dist/cli/leader.js.map +1 -1
  23. package/dist/core/authority/server-enforcement.d.ts +110 -0
  24. package/dist/core/authority/server-enforcement.js +260 -0
  25. package/dist/core/authority/server-enforcement.js.map +1 -0
  26. package/dist/core/authority/standing-grant.d.ts +24 -4
  27. package/dist/core/authority/standing-grant.js +19 -3
  28. package/dist/core/authority/standing-grant.js.map +1 -1
  29. package/dist/core/cloud/timeline.js +13 -7
  30. package/dist/core/cloud/timeline.js.map +1 -1
  31. package/dist/core/comms/change-digest.d.ts +130 -0
  32. package/dist/core/comms/change-digest.js +451 -0
  33. package/dist/core/comms/change-digest.js.map +1 -0
  34. package/dist/core/comms/director-prompt.d.ts +4 -5
  35. package/dist/core/comms/director-prompt.js +4 -71
  36. package/dist/core/comms/director-prompt.js.map +1 -1
  37. package/dist/core/comms/director.d.ts +24 -61
  38. package/dist/core/comms/director.js +29 -382
  39. package/dist/core/comms/director.js.map +1 -1
  40. package/dist/core/comms/dispatch.d.ts +37 -12
  41. package/dist/core/comms/dispatch.js +244 -177
  42. package/dist/core/comms/dispatch.js.map +1 -1
  43. package/dist/core/comms/elon-dialogue.d.ts +23 -15
  44. package/dist/core/comms/elon-dialogue.js +36 -307
  45. package/dist/core/comms/elon-dialogue.js.map +1 -1
  46. package/dist/core/comms/fleet-pulse.js +4 -7
  47. package/dist/core/comms/fleet-pulse.js.map +1 -1
  48. package/dist/core/comms/handlers.d.ts +10 -6
  49. package/dist/core/comms/handlers.js +14 -48
  50. package/dist/core/comms/handlers.js.map +1 -1
  51. package/dist/core/comms/migrations.d.ts +47 -0
  52. package/dist/core/comms/migrations.js +125 -0
  53. package/dist/core/comms/migrations.js.map +1 -0
  54. package/dist/core/comms/requests.d.ts +32 -5
  55. package/dist/core/comms/requests.js +101 -5
  56. package/dist/core/comms/requests.js.map +1 -1
  57. package/dist/core/comms/telegram-channel.d.ts +104 -0
  58. package/dist/core/comms/telegram-channel.js +622 -0
  59. package/dist/core/comms/telegram-channel.js.map +1 -0
  60. package/dist/core/comms/telegram-thread-map.d.ts +56 -0
  61. package/dist/core/comms/telegram-thread-map.js +144 -0
  62. package/dist/core/comms/telegram-thread-map.js.map +1 -0
  63. package/dist/core/daemon/capacity-publisher.d.ts +8 -1
  64. package/dist/core/daemon/capacity-publisher.js +40 -2
  65. package/dist/core/daemon/capacity-publisher.js.map +1 -1
  66. package/dist/core/daemon/loop.js +18 -4
  67. package/dist/core/daemon/loop.js.map +1 -1
  68. package/dist/core/daemon/tick-deadline.d.ts +44 -0
  69. package/dist/core/daemon/tick-deadline.js +83 -0
  70. package/dist/core/daemon/tick-deadline.js.map +1 -0
  71. package/dist/core/daemon/tick-hooks.d.ts +7 -0
  72. package/dist/core/daemon/tick-hooks.js.map +1 -1
  73. package/dist/core/daemon/tick-progress.d.ts +39 -0
  74. package/dist/core/daemon/tick-progress.js +194 -0
  75. package/dist/core/daemon/tick-progress.js.map +1 -0
  76. package/dist/core/dashboard.js +3 -1
  77. package/dist/core/dashboard.js.map +1 -1
  78. package/dist/core/fleet/fleet-merge-state.d.ts +6 -0
  79. package/dist/core/fleet/fleet-merge-state.js.map +1 -1
  80. package/dist/core/fleet/host-merge.d.ts +9 -0
  81. package/dist/core/fleet/host-merge.js +13 -2
  82. package/dist/core/fleet/host-merge.js.map +1 -1
  83. package/dist/core/fleet/merge-gates.d.ts +13 -0
  84. package/dist/core/fleet/merge-gates.js +14 -0
  85. package/dist/core/fleet/merge-gates.js.map +1 -1
  86. package/dist/core/fleet/mirrors.d.ts +162 -6
  87. package/dist/core/fleet/mirrors.js +1051 -49
  88. package/dist/core/fleet/mirrors.js.map +1 -1
  89. package/dist/core/fleet/standing-merge-pass.d.ts +8 -0
  90. package/dist/core/fleet/standing-merge-pass.js +72 -1
  91. package/dist/core/fleet/standing-merge-pass.js.map +1 -1
  92. package/dist/core/fleet/status.d.ts +17 -0
  93. package/dist/core/fleet/status.js +22 -0
  94. package/dist/core/fleet/status.js.map +1 -1
  95. package/dist/core/fleet/tick-hooks-live.d.ts +1 -1
  96. package/dist/core/fleet/tick-hooks-live.js +13 -3
  97. package/dist/core/fleet/tick-hooks-live.js.map +1 -1
  98. package/dist/core/git.d.ts +17 -0
  99. package/dist/core/git.js +124 -25
  100. package/dist/core/git.js.map +1 -1
  101. package/dist/core/goals/open-goals.d.ts +47 -0
  102. package/dist/core/goals/open-goals.js +33 -0
  103. package/dist/core/goals/open-goals.js.map +1 -0
  104. package/dist/core/inbox/merge.d.ts +5 -0
  105. package/dist/core/inbox/merge.js +58 -2
  106. package/dist/core/inbox/merge.js.map +1 -1
  107. package/dist/core/integrations/locus.d.ts +28 -0
  108. package/dist/core/integrations/locus.js +155 -30
  109. package/dist/core/integrations/locus.js.map +1 -1
  110. package/dist/core/integrations/telegram-format.d.ts +40 -0
  111. package/dist/core/integrations/telegram-format.js +123 -0
  112. package/dist/core/integrations/telegram-format.js.map +1 -0
  113. package/dist/core/integrations/telegram.d.ts +60 -4
  114. package/dist/core/integrations/telegram.js +161 -28
  115. package/dist/core/integrations/telegram.js.map +1 -1
  116. package/dist/core/mcp-registry.d.ts +12 -0
  117. package/dist/core/mcp-registry.js +70 -0
  118. package/dist/core/mcp-registry.js.map +1 -1
  119. package/dist/core/observability/rollup.d.ts +12 -10
  120. package/dist/core/observability/rollup.js +44 -17
  121. package/dist/core/observability/rollup.js.map +1 -1
  122. package/dist/core/resources/connection-monitor.d.ts +9 -0
  123. package/dist/core/resources/connection-monitor.js +19 -9
  124. package/dist/core/resources/connection-monitor.js.map +1 -1
  125. package/dist/core/resources/quota-refresh-lease.d.ts +17 -0
  126. package/dist/core/resources/quota-refresh-lease.js +34 -1
  127. package/dist/core/resources/quota-refresh-lease.js.map +1 -1
  128. package/dist/core/routing/budget-api.d.ts +7 -1
  129. package/dist/core/routing/budget-api.js +56 -2
  130. package/dist/core/routing/budget-api.js.map +1 -1
  131. package/dist/core/routing/readiness-types.d.ts +82 -0
  132. package/dist/core/routing/readiness-types.js +23 -0
  133. package/dist/core/routing/readiness-types.js.map +1 -0
  134. package/dist/core/routing/readiness.d.ts +103 -0
  135. package/dist/core/routing/readiness.js +480 -0
  136. package/dist/core/routing/readiness.js.map +1 -0
  137. package/dist/core/sandbox/confine.js +22 -1
  138. package/dist/core/sandbox/confine.js.map +1 -1
  139. package/dist/core/sandbox/policy.d.ts +23 -0
  140. package/dist/core/sandbox/policy.js +100 -0
  141. package/dist/core/sandbox/policy.js.map +1 -1
  142. package/dist/core/types.d.ts +13 -0
  143. package/dist/core/types.js.map +1 -1
  144. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  145. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +1204 -939
  146. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +1319 -1054
  147. package/dist/core/usage/frontier-usage.d.ts +20 -2
  148. package/dist/core/usage/frontier-usage.js +75 -17
  149. package/dist/core/usage/frontier-usage.js.map +1 -1
  150. package/dist/core/verse/accounts.d.ts +45 -0
  151. package/dist/core/verse/accounts.js +246 -17
  152. package/dist/core/verse/accounts.js.map +1 -1
  153. package/dist/core/verse/apps-api.js +23 -11
  154. package/dist/core/verse/apps-api.js.map +1 -1
  155. package/dist/core/verse/apps.d.ts +11 -9
  156. package/dist/core/verse/apps.js +2 -2
  157. package/dist/core/verse/apps.js.map +1 -1
  158. package/dist/core/verse/authority-api.d.ts +8 -2
  159. package/dist/core/verse/authority-api.js +40 -5
  160. package/dist/core/verse/authority-api.js.map +1 -1
  161. package/dist/core/verse/autonomy-ladder.d.ts +172 -0
  162. package/dist/core/verse/autonomy-ladder.js +251 -0
  163. package/dist/core/verse/autonomy-ladder.js.map +1 -0
  164. package/dist/core/verse/context-fit.js +7 -5
  165. package/dist/core/verse/context-fit.js.map +1 -1
  166. package/dist/core/verse/control-api.d.ts +23 -1
  167. package/dist/core/verse/control-api.js +117 -10
  168. package/dist/core/verse/control-api.js.map +1 -1
  169. package/dist/core/verse/fleet-live-api.js +13 -5
  170. package/dist/core/verse/fleet-live-api.js.map +1 -1
  171. package/dist/core/verse/folder-io.d.ts +50 -0
  172. package/dist/core/verse/folder-io.js +142 -0
  173. package/dist/core/verse/folder-io.js.map +1 -0
  174. package/dist/core/verse/git-api.js +5 -4
  175. package/dist/core/verse/git-api.js.map +1 -1
  176. package/dist/core/verse/git-ops.d.ts +10 -1
  177. package/dist/core/verse/git-ops.js +18 -2
  178. package/dist/core/verse/git-ops.js.map +1 -1
  179. package/dist/core/verse/github-api.d.ts +1 -1
  180. package/dist/core/verse/github-api.js +5 -4
  181. package/dist/core/verse/github-api.js.map +1 -1
  182. package/dist/core/verse/github-repo.js +118 -14
  183. package/dist/core/verse/github-repo.js.map +1 -1
  184. package/dist/core/verse/leader-api.d.ts +5 -4
  185. package/dist/core/verse/leader-api.js +237 -10
  186. package/dist/core/verse/leader-api.js.map +1 -1
  187. package/dist/core/verse/local-models.d.ts +10 -0
  188. package/dist/core/verse/local-models.js +10 -1
  189. package/dist/core/verse/local-models.js.map +1 -1
  190. package/dist/core/verse/login-path.d.ts +73 -0
  191. package/dist/core/verse/login-path.js +123 -14
  192. package/dist/core/verse/login-path.js.map +1 -1
  193. package/dist/core/verse/mcp-control-api.js +4 -4
  194. package/dist/core/verse/mcp-control-api.js.map +1 -1
  195. package/dist/core/verse/mcp-scope.d.ts +22 -0
  196. package/dist/core/verse/mcp-scope.js +41 -1
  197. package/dist/core/verse/mcp-scope.js.map +1 -1
  198. package/dist/core/verse/mcp-seat-view.d.ts +10 -0
  199. package/dist/core/verse/mcp-seat-view.js +30 -4
  200. package/dist/core/verse/mcp-seat-view.js.map +1 -1
  201. package/dist/core/verse/overnight-api.js +20 -2
  202. package/dist/core/verse/overnight-api.js.map +1 -1
  203. package/dist/core/verse/path-guard.d.ts +24 -0
  204. package/dist/core/verse/path-guard.js +91 -22
  205. package/dist/core/verse/path-guard.js.map +1 -1
  206. package/dist/core/verse/preview-api.js +22 -0
  207. package/dist/core/verse/preview-api.js.map +1 -1
  208. package/dist/core/verse/projects.d.ts +21 -0
  209. package/dist/core/verse/projects.js +82 -0
  210. package/dist/core/verse/projects.js.map +1 -1
  211. package/dist/core/verse/session-controls-api.js +5 -3
  212. package/dist/core/verse/session-controls-api.js.map +1 -1
  213. package/dist/core/verse/session-handoff.d.ts +26 -0
  214. package/dist/core/verse/session-handoff.js +90 -12
  215. package/dist/core/verse/session-handoff.js.map +1 -1
  216. package/dist/core/verse/terminal-api.js +7 -4
  217. package/dist/core/verse/terminal-api.js.map +1 -1
  218. package/dist/core/verse/terminal.js +9 -5
  219. package/dist/core/verse/terminal.js.map +1 -1
  220. package/dist/core/verse/verse-api.js +81 -27
  221. package/dist/core/verse/verse-api.js.map +1 -1
  222. package/dist/core/verse/workspaces.d.ts +51 -0
  223. package/dist/core/verse/workspaces.js +177 -47
  224. package/dist/core/verse/workspaces.js.map +1 -1
  225. package/dist/core/vision/leader-apply.d.ts +40 -0
  226. package/dist/core/vision/leader-apply.js +101 -30
  227. package/dist/core/vision/leader-apply.js.map +1 -1
  228. package/dist/core/vision/leader-cadence.d.ts +114 -0
  229. package/dist/core/vision/leader-cadence.js +127 -0
  230. package/dist/core/vision/leader-cadence.js.map +1 -0
  231. package/dist/core/vision/leader-goal-evidence.d.ts +25 -0
  232. package/dist/core/vision/leader-goal-evidence.js +36 -0
  233. package/dist/core/vision/leader-goal-evidence.js.map +1 -0
  234. package/dist/core/vision/leader-health.d.ts +53 -0
  235. package/dist/core/vision/leader-health.js +92 -0
  236. package/dist/core/vision/leader-health.js.map +1 -0
  237. package/dist/core/vision/leader-operator.d.ts +176 -0
  238. package/dist/core/vision/leader-operator.js +355 -0
  239. package/dist/core/vision/leader-operator.js.map +1 -0
  240. package/dist/core/vision/leader-run-chain.d.ts +41 -0
  241. package/dist/core/vision/leader-run-chain.js +54 -0
  242. package/dist/core/vision/leader-run-chain.js.map +1 -0
  243. package/dist/core/vision/leader-seat-plan.d.ts +68 -0
  244. package/dist/core/vision/leader-seat-plan.js +93 -0
  245. package/dist/core/vision/leader-seat-plan.js.map +1 -0
  246. package/dist/core/vision/leader-seat.d.ts +71 -5
  247. package/dist/core/vision/leader-seat.js +235 -33
  248. package/dist/core/vision/leader-seat.js.map +1 -1
  249. package/dist/core/vision/leader-thread-types.d.ts +104 -0
  250. package/dist/core/vision/leader-thread-types.js +9 -0
  251. package/dist/core/vision/leader-thread-types.js.map +1 -0
  252. package/dist/core/vision/leader-thread.d.ts +138 -0
  253. package/dist/core/vision/leader-thread.js +926 -0
  254. package/dist/core/vision/leader-thread.js.map +1 -0
  255. package/dist/core/vision/leader-types.d.ts +75 -1
  256. package/dist/core/vision/leader.d.ts +88 -18
  257. package/dist/core/vision/leader.js +269 -69
  258. package/dist/core/vision/leader.js.map +1 -1
  259. package/dist/core/web/public/next/assets/{ActionMenu-Dwjk6rUQ.js → ActionMenu-CIiX2X8w.js} +2 -2
  260. package/dist/core/web/public/next/assets/{ActionMenu-Dwjk6rUQ.js.map → ActionMenu-CIiX2X8w.js.map} +1 -1
  261. package/dist/core/web/public/next/assets/Advanced-DHsysoIL.js +2 -0
  262. package/dist/core/web/public/next/assets/{Advanced-cVYTAsfB.js.map → Advanced-DHsysoIL.js.map} +1 -1
  263. package/dist/core/web/public/next/assets/{App-IsaWDsdF.js → App-CMeAocmW.js} +5 -5
  264. package/dist/core/web/public/next/assets/{App-IsaWDsdF.js.map → App-CMeAocmW.js.map} +1 -1
  265. package/dist/core/web/public/next/assets/AppsSection-DISYnMnc.js +2 -0
  266. package/dist/core/web/public/next/assets/{AppsSection-DDqeSrty.js.map → AppsSection-DISYnMnc.js.map} +1 -1
  267. package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js +2 -0
  268. package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js.map +1 -0
  269. package/dist/core/web/public/next/assets/{AutonomyOffState-CpFYS3tQ.js → AutonomyOffState-CEPSZToP.js} +3 -3
  270. package/dist/core/web/public/next/assets/{AutonomyOffState-CpFYS3tQ.js.map → AutonomyOffState-CEPSZToP.js.map} +1 -1
  271. package/dist/core/web/public/next/assets/AutonomySection-DWc3ciAD.js +2 -0
  272. package/dist/core/web/public/next/assets/{AutonomySection-Dwn8UtOy.js.map → AutonomySection-DWc3ciAD.js.map} +1 -1
  273. package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js +2 -0
  274. package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js.map +1 -0
  275. package/dist/core/web/public/next/assets/{BranchBar-ISZ7xUCj.js → BranchBar-BxhdiIpx.js} +2 -2
  276. package/dist/core/web/public/next/assets/{BranchBar-ISZ7xUCj.js.map → BranchBar-BxhdiIpx.js.map} +1 -1
  277. package/dist/core/web/public/next/assets/{BudgetControl-BARVp-En.js → BudgetControl-C-0KhjRS.js} +2 -2
  278. package/dist/core/web/public/next/assets/{BudgetControl-BARVp-En.js.map → BudgetControl-C-0KhjRS.js.map} +1 -1
  279. package/dist/core/web/public/next/assets/{Button-DtE0rlWD.js → Button-D90dzI_o.js} +2 -2
  280. package/dist/core/web/public/next/assets/{Button-DtE0rlWD.js.map → Button-D90dzI_o.js.map} +1 -1
  281. package/dist/core/web/public/next/assets/{CapacityStrip-DKbKA_Aa.js → CapacityStrip-qKDBC65C.js} +2 -2
  282. package/dist/core/web/public/next/assets/{CapacityStrip-DKbKA_Aa.js.map → CapacityStrip-qKDBC65C.js.map} +1 -1
  283. package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js +2 -0
  284. package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js.map +1 -0
  285. package/dist/core/web/public/next/assets/ChartFrame-DyjmyV8N.css +1 -0
  286. package/dist/core/web/public/next/assets/ChatSection-DlT4QU6a.js +3 -0
  287. package/dist/core/web/public/next/assets/{ChatSection-C9myY4ei.js.map → ChatSection-DlT4QU6a.js.map} +1 -1
  288. package/dist/core/web/public/next/assets/{CloudBudgetForm-CvjK4Oh6.js → CloudBudgetForm-BrNun_Yu.js} +2 -2
  289. package/dist/core/web/public/next/assets/{CloudBudgetForm-CvjK4Oh6.js.map → CloudBudgetForm-BrNun_Yu.js.map} +1 -1
  290. package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js +2 -0
  291. package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js.map +1 -0
  292. package/dist/core/web/public/next/assets/CommandSection-B0xuU-yZ.css +1 -0
  293. package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js +3 -0
  294. package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js.map +1 -0
  295. package/dist/core/web/public/next/assets/{ConfirmDialog-CLUhzaBj.js → ConfirmDialog-BR4nZQ2D.js} +2 -2
  296. package/dist/core/web/public/next/assets/{ConfirmDialog-CLUhzaBj.js.map → ConfirmDialog-BR4nZQ2D.js.map} +1 -1
  297. package/dist/core/web/public/next/assets/{DeleteChatDialog-C_eDhV8b.js → DeleteChatDialog-BCfP12GH.js} +2 -2
  298. package/dist/core/web/public/next/assets/{DeleteChatDialog-C_eDhV8b.js.map → DeleteChatDialog-BCfP12GH.js.map} +1 -1
  299. package/dist/core/web/public/next/assets/{Dialog-BRd_B9OE.js → Dialog-D3msQlCj.js} +2 -2
  300. package/dist/core/web/public/next/assets/{Dialog-BRd_B9OE.js.map → Dialog-D3msQlCj.js.map} +1 -1
  301. package/dist/core/web/public/next/assets/{DiffPane-Cpr9soB2.js → DiffPane-Ix6hvXlY.js} +2 -2
  302. package/dist/core/web/public/next/assets/{DiffPane-Cpr9soB2.js.map → DiffPane-Ix6hvXlY.js.map} +1 -1
  303. package/dist/core/web/public/next/assets/{DiffViewer-CNwd0W3Q.js → DiffViewer-C4WKsCIe.js} +2 -2
  304. package/dist/core/web/public/next/assets/{DiffViewer-CNwd0W3Q.js.map → DiffViewer-C4WKsCIe.js.map} +1 -1
  305. package/dist/core/web/public/next/assets/DockHost-aWP7liri.js +2 -0
  306. package/dist/core/web/public/next/assets/{DockHost-BcEq2qaS.js.map → DockHost-aWP7liri.js.map} +1 -1
  307. package/dist/core/web/public/next/assets/{EmptyState-DsN1H6MC.js → EmptyState-D2IRy3Cg.js} +2 -2
  308. package/dist/core/web/public/next/assets/{EmptyState-DsN1H6MC.js.map → EmptyState-D2IRy3Cg.js.map} +1 -1
  309. package/dist/core/web/public/next/assets/{Epistemic-fycQTBRO.js → Epistemic-DMr18muX.js} +2 -2
  310. package/dist/core/web/public/next/assets/{Epistemic-fycQTBRO.js.map → Epistemic-DMr18muX.js.map} +1 -1
  311. package/dist/core/web/public/next/assets/{EvidenceTimeline-sCCAdnBK.js → EvidenceTimeline-DXmmz6Fi.js} +2 -2
  312. package/dist/core/web/public/next/assets/{EvidenceTimeline-sCCAdnBK.js.map → EvidenceTimeline-DXmmz6Fi.js.map} +1 -1
  313. package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js +3 -0
  314. package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js.map +1 -0
  315. package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js +2 -0
  316. package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js.map +1 -0
  317. package/dist/core/web/public/next/assets/{GearTray-CpDt0xwj.js → GearTray-Dt-ee32-.js} +2 -2
  318. package/dist/core/web/public/next/assets/{GearTray-CpDt0xwj.js.map → GearTray-Dt-ee32-.js.map} +1 -1
  319. package/dist/core/web/public/next/assets/GrowthSection-P9EUfGeA.js +2 -0
  320. package/dist/core/web/public/next/assets/{GrowthSection-BvZezOsX.js.map → GrowthSection-P9EUfGeA.js.map} +1 -1
  321. package/dist/core/web/public/next/assets/{HandoffDialog-B1G6gQyk.js → HandoffDialog-CLJQLe7M.js} +2 -2
  322. package/dist/core/web/public/next/assets/{HandoffDialog-B1G6gQyk.js.map → HandoffDialog-CLJQLe7M.js.map} +1 -1
  323. package/dist/core/web/public/next/assets/{Input-CI0yBHmn.js → Input-D_KRJA9V.js} +2 -2
  324. package/dist/core/web/public/next/assets/{Input-CI0yBHmn.js.map → Input-D_KRJA9V.js.map} +1 -1
  325. package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js +2 -0
  326. package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js.map +1 -0
  327. package/dist/core/web/public/next/assets/LeaderCard-DNsbLwY3.css +1 -0
  328. package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js +2 -0
  329. package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js.map +1 -0
  330. package/dist/core/web/public/next/assets/LeaderConversation-DPHUTq6W.css +1 -0
  331. package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js +2 -0
  332. package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js.map +1 -0
  333. package/dist/core/web/public/next/assets/McpSection-DGbRcyv8.js +2 -0
  334. package/dist/core/web/public/next/assets/{McpSection-nuXer4K-.js.map → McpSection-DGbRcyv8.js.map} +1 -1
  335. package/dist/core/web/public/next/assets/{MessageMarkdown-BCe4TsXk.js → MessageMarkdown-DFvk06qG.js} +3 -3
  336. package/dist/core/web/public/next/assets/{MessageMarkdown-BCe4TsXk.js.map → MessageMarkdown-DFvk06qG.js.map} +1 -1
  337. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DL3LU5kL.js → MessageMarkdownRenderer-BAv4oEUf.js} +2 -2
  338. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DL3LU5kL.js.map → MessageMarkdownRenderer-BAv4oEUf.js.map} +1 -1
  339. package/dist/core/web/public/next/assets/{Meter-b69LM0mU.js → Meter-CMj-VafN.js} +2 -2
  340. package/dist/core/web/public/next/assets/{Meter-b69LM0mU.js.map → Meter-CMj-VafN.js.map} +1 -1
  341. package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js +3 -0
  342. package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js.map +1 -0
  343. package/dist/core/web/public/next/assets/{MutationTokenDialog-Bm34BNVV.js → MutationTokenDialog-DbnO8aYi.js} +2 -2
  344. package/dist/core/web/public/next/assets/{MutationTokenDialog-Bm34BNVV.js.map → MutationTokenDialog-DbnO8aYi.js.map} +1 -1
  345. package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js +3 -0
  346. package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js.map +1 -0
  347. package/dist/core/web/public/next/assets/{NeedsYouList-D5Kk549g.js → NeedsYouList-CCsijdWt.js} +2 -2
  348. package/dist/core/web/public/next/assets/{NeedsYouList-D5Kk549g.js.map → NeedsYouList-CCsijdWt.js.map} +1 -1
  349. package/dist/core/web/public/next/assets/NewChatDialog-BlCHtOIr.js +3 -0
  350. package/dist/core/web/public/next/assets/{NewChatDialog-BqFTWgHU.js.map → NewChatDialog-BlCHtOIr.js.map} +1 -1
  351. package/dist/core/web/public/next/assets/{OnboardingFlow-DcDsguAM.js → OnboardingFlow-Cy9BA9eR.js} +3 -3
  352. package/dist/core/web/public/next/assets/{OnboardingFlow-DcDsguAM.js.map → OnboardingFlow-Cy9BA9eR.js.map} +1 -1
  353. package/dist/core/web/public/next/assets/OnboardingGate-BXpNFoLt.js +3 -0
  354. package/dist/core/web/public/next/assets/{OnboardingGate-BZafM1Vf.js.map → OnboardingGate-BXpNFoLt.js.map} +1 -1
  355. package/dist/core/web/public/next/assets/PreviewPane-COid5A0f.js +2 -0
  356. package/dist/core/web/public/next/assets/{PreviewPane-zT3gK9TD.js.map → PreviewPane-COid5A0f.js.map} +1 -1
  357. package/dist/core/web/public/next/assets/{ProviderLogo-AwHn2sKm.js → ProviderLogo-Cq-CYIwT.js} +2 -2
  358. package/dist/core/web/public/next/assets/{ProviderLogo-AwHn2sKm.js.map → ProviderLogo-Cq-CYIwT.js.map} +1 -1
  359. package/dist/core/web/public/next/assets/{RailStatus-xHrovWvI.js → RailStatus-Co5UB6We.js} +2 -2
  360. package/dist/core/web/public/next/assets/{RailStatus-xHrovWvI.js.map → RailStatus-Co5UB6We.js.map} +1 -1
  361. package/dist/core/web/public/next/assets/{RefreshIndicator-SEFZlMB2.js → RefreshIndicator-DO9ibnSq.js} +2 -2
  362. package/dist/core/web/public/next/assets/{RefreshIndicator-SEFZlMB2.js.map → RefreshIndicator-DO9ibnSq.js.map} +1 -1
  363. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-Dr2WRgkq.js +7 -0
  364. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-CAxPQ4sZ.js.map → ResourcePoolConsoleApp-Dr2WRgkq.js.map} +1 -1
  365. package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js +3 -0
  366. package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js.map +1 -0
  367. package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js +2 -0
  368. package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js.map +1 -0
  369. package/dist/core/web/public/next/assets/ResourcesDrawer-DrGoO8KG.css +1 -0
  370. package/dist/core/web/public/next/assets/{RouteErrorBoundary-C8WGiixc.js → RouteErrorBoundary-SkNhhUbt.js} +2 -2
  371. package/dist/core/web/public/next/assets/{RouteErrorBoundary-C8WGiixc.js.map → RouteErrorBoundary-SkNhhUbt.js.map} +1 -1
  372. package/dist/core/web/public/next/assets/{RunInCloudAction-1-IPLYhf.js → RunInCloudAction-BXPlZwJQ.js} +2 -2
  373. package/dist/core/web/public/next/assets/{RunInCloudAction-1-IPLYhf.js.map → RunInCloudAction-BXPlZwJQ.js.map} +1 -1
  374. package/dist/core/web/public/next/assets/{SeatSelector-DpwNiX8F.js → SeatSelector-J5R3zDkB.js} +3 -3
  375. package/dist/core/web/public/next/assets/{SeatSelector-DpwNiX8F.js.map → SeatSelector-J5R3zDkB.js.map} +1 -1
  376. package/dist/core/web/public/next/assets/{Segmented-Wt1ATod9.js → Segmented-CGh_-tBb.js} +2 -2
  377. package/dist/core/web/public/next/assets/{Segmented-Wt1ATod9.js.map → Segmented-CGh_-tBb.js.map} +1 -1
  378. package/dist/core/web/public/next/assets/{Select-By-V9lMc.js → Select-CWnmUzs3.js} +2 -2
  379. package/dist/core/web/public/next/assets/{Select-By-V9lMc.js.map → Select-CWnmUzs3.js.map} +1 -1
  380. package/dist/core/web/public/next/assets/{SessionGate-WROS02tK.js → SessionGate-sp4KsnUo.js} +2 -2
  381. package/dist/core/web/public/next/assets/{SessionGate-WROS02tK.js.map → SessionGate-sp4KsnUo.js.map} +1 -1
  382. package/dist/core/web/public/next/assets/{SessionInsightChip-DNUcruwp.js → SessionInsightChip-DLFAzdbi.js} +2 -2
  383. package/dist/core/web/public/next/assets/{SessionInsightChip-DNUcruwp.js.map → SessionInsightChip-DLFAzdbi.js.map} +1 -1
  384. package/dist/core/web/public/next/assets/{SessionSearch-UHtt7a8f.js → SessionSearch-DbFjwR1h.js} +2 -2
  385. package/dist/core/web/public/next/assets/{SessionSearch-UHtt7a8f.js.map → SessionSearch-DbFjwR1h.js.map} +1 -1
  386. package/dist/core/web/public/next/assets/{SettingsSection-Bf74l0Gj.js → SettingsSection-Ch23msJ5.js} +2 -2
  387. package/dist/core/web/public/next/assets/SettingsSection-Ch23msJ5.js.map +1 -0
  388. package/dist/core/web/public/next/assets/{SetupChecklist-CzpEcfOl.js → SetupChecklist-Bd76MBAR.js} +2 -2
  389. package/dist/core/web/public/next/assets/{SetupChecklist-CzpEcfOl.js.map → SetupChecklist-Bd76MBAR.js.map} +1 -1
  390. package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js +3 -0
  391. package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js.map +1 -0
  392. package/dist/core/web/public/next/assets/{Sheet-HkBOBMTT.js → Sheet-BZ2AG4Eo.js} +2 -2
  393. package/dist/core/web/public/next/assets/{Sheet-HkBOBMTT.js.map → Sheet-BZ2AG4Eo.js.map} +1 -1
  394. package/dist/core/web/public/next/assets/{ShortcutsOverlay-DiigiT8H.js → ShortcutsOverlay-C8n8y3zf.js} +2 -2
  395. package/dist/core/web/public/next/assets/{ShortcutsOverlay-DiigiT8H.js.map → ShortcutsOverlay-C8n8y3zf.js.map} +1 -1
  396. package/dist/core/web/public/next/assets/Sidebar-DN--cPYN.js +3 -0
  397. package/dist/core/web/public/next/assets/{Sidebar-C9YtBYVZ.js.map → Sidebar-DN--cPYN.js.map} +1 -1
  398. package/dist/core/web/public/next/assets/{Slider-DaEDws-b.js → Slider-KVoJLDD6.js} +2 -2
  399. package/dist/core/web/public/next/assets/{Slider-DaEDws-b.js.map → Slider-KVoJLDD6.js.map} +1 -1
  400. package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js +2 -0
  401. package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js.map +1 -0
  402. package/dist/core/web/public/next/assets/StatTile-CNCqDoPO.css +1 -0
  403. package/dist/core/web/public/next/assets/{StatusBadge-CXG3iNL4.js → StatusBadge-CXsYqmdU.js} +2 -2
  404. package/dist/core/web/public/next/assets/{StatusBadge-CXG3iNL4.js.map → StatusBadge-CXsYqmdU.js.map} +1 -1
  405. package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js +2 -0
  406. package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js.map +1 -0
  407. package/dist/core/web/public/next/assets/{Surface-5bNA08tK.js → Surface-BfDmQcKe.js} +2 -2
  408. package/dist/core/web/public/next/assets/{Surface-5bNA08tK.js.map → Surface-BfDmQcKe.js.map} +1 -1
  409. package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js +2 -0
  410. package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js.map +1 -0
  411. package/dist/core/web/public/next/assets/Swimlane-Bf4Rjoy9.css +1 -0
  412. package/dist/core/web/public/next/assets/{Switch-BmCzfFnu.js → Switch-9NtO_6Lj.js} +2 -2
  413. package/dist/core/web/public/next/assets/{Switch-BmCzfFnu.js.map → Switch-9NtO_6Lj.js.map} +1 -1
  414. package/dist/core/web/public/next/assets/{Tag-WSUIaMVy.js → Tag-DscCRFcN.js} +2 -2
  415. package/dist/core/web/public/next/assets/{Tag-WSUIaMVy.js.map → Tag-DscCRFcN.js.map} +1 -1
  416. package/dist/core/web/public/next/assets/{TerminalPane-BVFgYX6K.js → TerminalPane-B668-DJW.js} +5 -5
  417. package/dist/core/web/public/next/assets/{TerminalPane-BVFgYX6K.js.map → TerminalPane-B668-DJW.js.map} +1 -1
  418. package/dist/core/web/public/next/assets/UniverseConsoleApp-BUV_brY7.js +2 -0
  419. package/dist/core/web/public/next/assets/{UniverseConsoleApp-BpphLqoz.js.map → UniverseConsoleApp-BUV_brY7.js.map} +1 -1
  420. package/dist/core/web/public/next/assets/{UniverseView-DbpbSMwO.js → UniverseView-DG70zH0W.js} +4 -4
  421. package/dist/core/web/public/next/assets/{UniverseView-DbpbSMwO.js.map → UniverseView-DG70zH0W.js.map} +1 -1
  422. package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js +3 -0
  423. package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js.map +1 -0
  424. package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js +3 -0
  425. package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js.map +1 -0
  426. package/dist/core/web/public/next/assets/Workspace-D1nP9BhD.js +10 -0
  427. package/dist/core/web/public/next/assets/{Workspace-RXy0pqp6.js.map → Workspace-D1nP9BhD.js.map} +1 -1
  428. package/dist/core/web/public/next/assets/actions-CY-PjpGc.js +2 -0
  429. package/dist/core/web/public/next/assets/{actions-BZTidCXZ.js.map → actions-CY-PjpGc.js.map} +1 -1
  430. package/dist/core/web/public/next/assets/actions-DkWhhWIg.css +1 -0
  431. package/dist/core/web/public/next/assets/{apps-model-CHO133qt.js → apps-model-Du02KhAf.js} +2 -2
  432. package/dist/core/web/public/next/assets/{apps-model-CHO133qt.js.map → apps-model-Du02KhAf.js.map} +1 -1
  433. package/dist/core/web/public/next/assets/{authority-model-8NeAEwAF.js → authority-model-79SeuKlJ.js} +2 -2
  434. package/dist/core/web/public/next/assets/{authority-model-8NeAEwAF.js.map → authority-model-79SeuKlJ.js.map} +1 -1
  435. package/dist/core/web/public/next/assets/autonomy-ladder-BGWmZzP7.css +1 -0
  436. package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js +2 -0
  437. package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js.map +1 -0
  438. package/dist/core/web/public/next/assets/budget-queries-D8QV5XtH.js +2 -0
  439. package/dist/core/web/public/next/assets/{budget-queries-DFF-3ICg.js.map → budget-queries-D8QV5XtH.js.map} +1 -1
  440. package/dist/core/web/public/next/assets/{capacity-strip-model-5ViUgUlP.js → capacity-strip-model-BwZ1ZbkU.js} +2 -2
  441. package/dist/core/web/public/next/assets/{capacity-strip-model-5ViUgUlP.js.map → capacity-strip-model-BwZ1ZbkU.js.map} +1 -1
  442. package/dist/core/web/public/next/assets/charts-BZ50mZD_.js +2 -0
  443. package/dist/core/web/public/next/assets/charts-BZ50mZD_.js.map +1 -0
  444. package/dist/core/web/public/next/assets/charts-ClCB18la.css +1 -0
  445. package/dist/core/web/public/next/assets/{cloud-model-CfRydq8N.js → cloud-model-BDivRMqv.js} +2 -2
  446. package/dist/core/web/public/next/assets/{cloud-model-CfRydq8N.js.map → cloud-model-BDivRMqv.js.map} +1 -1
  447. package/dist/core/web/public/next/assets/{cloud-queries-DmptbjS8.js → cloud-queries-BPQQ5_pJ.js} +2 -2
  448. package/dist/core/web/public/next/assets/{cloud-queries-DmptbjS8.js.map → cloud-queries-BPQQ5_pJ.js.map} +1 -1
  449. package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js → colors-DvK0wMHH.js} +2 -2
  450. package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js.map → colors-DvK0wMHH.js.map} +1 -1
  451. package/dist/core/web/public/next/assets/{command-catalog-ffCAijVY.js → command-catalog-BIntSa9l.js} +2 -2
  452. package/dist/core/web/public/next/assets/command-catalog-BIntSa9l.js.map +1 -0
  453. package/dist/core/web/public/next/assets/{context-model-CDeyP0cA.js → context-model-Br8t9jgG.js} +2 -2
  454. package/dist/core/web/public/next/assets/{context-model-CDeyP0cA.js.map → context-model-Br8t9jgG.js.map} +1 -1
  455. package/dist/core/web/public/next/assets/{context-model-Bb15chFt.js → context-model-CokrgEUq.js} +3 -3
  456. package/dist/core/web/public/next/assets/{context-model-Bb15chFt.js.map → context-model-CokrgEUq.js.map} +1 -1
  457. package/dist/core/web/public/next/assets/context-queries-eL3caKVG.js +2 -0
  458. package/dist/core/web/public/next/assets/{context-queries-_9bFWb9v.js.map → context-queries-eL3caKVG.js.map} +1 -1
  459. package/dist/core/web/public/next/assets/{control-queries-CXtmZZH6.js → control-queries-B9K-wmcB.js} +2 -2
  460. package/dist/core/web/public/next/assets/{control-queries-CXtmZZH6.js.map → control-queries-B9K-wmcB.js.map} +1 -1
  461. package/dist/core/web/public/next/assets/{copy-setup-BIp0iaiZ.js → copy-setup-XMgCC5f8.js} +2 -2
  462. package/dist/core/web/public/next/assets/{copy-setup-BIp0iaiZ.js.map → copy-setup-XMgCC5f8.js.map} +1 -1
  463. package/dist/core/web/public/next/assets/{dock-icons-Cc43W7r4.js → dock-icons-BJ6ZqB2t.js} +2 -2
  464. package/dist/core/web/public/next/assets/{dock-icons-Cc43W7r4.js.map → dock-icons-BJ6ZqB2t.js.map} +1 -1
  465. package/dist/core/web/public/next/assets/{fleet-model-DOK8ZtEt.js → fleet-model-BvDR3gjp.js} +2 -2
  466. package/dist/core/web/public/next/assets/{fleet-model-DOK8ZtEt.js.map → fleet-model-BvDR3gjp.js.map} +1 -1
  467. package/dist/core/web/public/next/assets/{fleet-queries-BeEAqD6y.js → fleet-queries-W2UFVMZJ.js} +2 -2
  468. package/dist/core/web/public/next/assets/{fleet-queries-BeEAqD6y.js.map → fleet-queries-W2UFVMZJ.js.map} +1 -1
  469. package/dist/core/web/public/next/assets/{focus-trap-ChZ5EFfM.js → focus-trap-CtI1SlMX.js} +2 -2
  470. package/dist/core/web/public/next/assets/{focus-trap-ChZ5EFfM.js.map → focus-trap-CtI1SlMX.js.map} +1 -1
  471. package/dist/core/web/public/next/assets/{format-BmH2yWL6.js → format-CH4g_sl1.js} +2 -2
  472. package/dist/core/web/public/next/assets/{format-BmH2yWL6.js.map → format-CH4g_sl1.js.map} +1 -1
  473. package/dist/core/web/public/next/assets/{format-DKrNjdwD.js → format-D7nBg2bn.js} +2 -2
  474. package/dist/core/web/public/next/assets/{format-DKrNjdwD.js.map → format-D7nBg2bn.js.map} +1 -1
  475. package/dist/core/web/public/next/assets/{git-model-BFwAVbxF.js → git-model-Dnkd1TnK.js} +2 -2
  476. package/dist/core/web/public/next/assets/{git-model-BFwAVbxF.js.map → git-model-Dnkd1TnK.js.map} +1 -1
  477. package/dist/core/web/public/next/assets/global-CMNW_dqn.js +2 -0
  478. package/dist/core/web/public/next/assets/{global-y_exIyAP.js.map → global-CMNW_dqn.js.map} +1 -1
  479. package/dist/core/web/public/next/assets/guarded-runners-YeAc9wLQ.js +2 -0
  480. package/dist/core/web/public/next/assets/{guarded-runners-Cd4POBtI.js.map → guarded-runners-YeAc9wLQ.js.map} +1 -1
  481. package/dist/core/web/public/next/assets/{icons-CygCEFWs.js → icons-D1sYbCTQ.js} +2 -2
  482. package/dist/core/web/public/next/assets/{icons-CygCEFWs.js.map → icons-D1sYbCTQ.js.map} +1 -1
  483. package/dist/core/web/public/next/assets/{index-CyK31YRm.js → index-DZ-UQ7v8.js} +3 -3
  484. package/dist/core/web/public/next/assets/{index-CyK31YRm.js.map → index-DZ-UQ7v8.js.map} +1 -1
  485. package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js +2 -0
  486. package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js.map +1 -0
  487. package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js +2 -0
  488. package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js.map +1 -0
  489. package/dist/core/web/public/next/assets/{live-model-D7hilYFk.js → live-model-D_32RAOR.js} +2 -2
  490. package/dist/core/web/public/next/assets/{live-model-D7hilYFk.js.map → live-model-D_32RAOR.js.map} +1 -1
  491. package/dist/core/web/public/next/assets/{mind.module-B15k0Y9q.js → mind.module-7hA92hRg.js} +2 -2
  492. package/dist/core/web/public/next/assets/{mind.module-B15k0Y9q.js.map → mind.module-7hA92hRg.js.map} +1 -1
  493. package/dist/core/web/public/next/assets/mutations-DQPbFdRJ.js +2 -0
  494. package/dist/core/web/public/next/assets/{mutations-CWlxEMEm.js.map → mutations-DQPbFdRJ.js.map} +1 -1
  495. package/dist/core/web/public/next/assets/{nav-mimleI0R.js → nav-0dOYe2rJ.js} +2 -2
  496. package/dist/core/web/public/next/assets/{nav-mimleI0R.js.map → nav-0dOYe2rJ.js.map} +1 -1
  497. package/dist/core/web/public/next/assets/{overnight-queries-DJ4mZKSj.js → overnight-queries-C4wOnFtE.js} +2 -2
  498. package/dist/core/web/public/next/assets/{overnight-queries-DJ4mZKSj.js.map → overnight-queries-C4wOnFtE.js.map} +1 -1
  499. package/dist/core/web/public/next/assets/primitives-2A5Eq8FQ.js +1 -0
  500. package/dist/core/web/public/next/assets/{queries-Bw1McHTj.js → queries-BTXWdZzU.js} +2 -2
  501. package/dist/core/web/public/next/assets/{queries-Bw1McHTj.js.map → queries-BTXWdZzU.js.map} +1 -1
  502. package/dist/core/web/public/next/assets/{reasoning-pref-KkhI_5-j.js → reasoning-pref-Ca6lN6x_.js} +2 -2
  503. package/dist/core/web/public/next/assets/{reasoning-pref-KkhI_5-j.js.map → reasoning-pref-Ca6lN6x_.js.map} +1 -1
  504. package/dist/core/web/public/next/assets/{reveal-anchor-CCCx_kfT.js → reveal-anchor-DfNLgK_I.js} +2 -2
  505. package/dist/core/web/public/next/assets/{reveal-anchor-CCCx_kfT.js.map → reveal-anchor-DfNLgK_I.js.map} +1 -1
  506. package/dist/core/web/public/next/assets/seat-subscription-C5uPHBsN.js +2 -0
  507. package/dist/core/web/public/next/assets/{seat-subscription-BhUUz7VL.js.map → seat-subscription-C5uPHBsN.js.map} +1 -1
  508. package/dist/core/web/public/next/assets/{sidebar-model-Dcd437cf.js → sidebar-model-CLCdqwkR.js} +2 -2
  509. package/dist/core/web/public/next/assets/{sidebar-model-Dcd437cf.js.map → sidebar-model-CLCdqwkR.js.map} +1 -1
  510. package/dist/core/web/public/next/assets/{slots-BL_J5mmV.js → slots-C-qBeu-8.js} +3 -3
  511. package/dist/core/web/public/next/assets/{slots-BL_J5mmV.js.map → slots-C-qBeu-8.js.map} +1 -1
  512. package/dist/core/web/public/next/assets/{surface-data-C3UAQ4QX.js → surface-data-Dj71tdD-.js} +2 -2
  513. package/dist/core/web/public/next/assets/{surface-data-C3UAQ4QX.js.map → surface-data-Dj71tdD-.js.map} +1 -1
  514. package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js +2 -0
  515. package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js.map +1 -0
  516. package/dist/core/web/public/next/assets/{tasks-model-CzHvclVm.js → tasks-model-O8yR5YXp.js} +2 -2
  517. package/dist/core/web/public/next/assets/{tasks-model-CzHvclVm.js.map → tasks-model-O8yR5YXp.js.map} +1 -1
  518. package/dist/core/web/public/next/assets/{terminal-icons-BwgQTQP0.js → terminal-icons-CoRZq9iO.js} +2 -2
  519. package/dist/core/web/public/next/assets/{terminal-icons-BwgQTQP0.js.map → terminal-icons-CoRZq9iO.js.map} +1 -1
  520. package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js +2 -0
  521. package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js.map +1 -0
  522. package/dist/core/web/public/next/assets/{usage-queries-pXxvy54x.js → usage-queries-AdjEyEtn.js} +2 -2
  523. package/dist/core/web/public/next/assets/{usage-queries-pXxvy54x.js.map → usage-queries-AdjEyEtn.js.map} +1 -1
  524. package/dist/core/web/public/next/assets/{use-guarded-action-EgVWjM5c.js → use-guarded-action-CuuMHeDX.js} +2 -2
  525. package/dist/core/web/public/next/assets/{use-guarded-action-EgVWjM5c.js.map → use-guarded-action-CuuMHeDX.js.map} +1 -1
  526. package/dist/core/web/public/next/assets/{use-ticker-BoqFxRFG.js → use-ticker-BBcp02SZ.js} +2 -2
  527. package/dist/core/web/public/next/assets/{use-ticker-BoqFxRFG.js.map → use-ticker-BBcp02SZ.js.map} +1 -1
  528. package/dist/core/web/public/next/assets/{use-token-gate-DSNIIpI6.js → use-token-gate-CbXVYQYI.js} +2 -2
  529. package/dist/core/web/public/next/assets/{use-token-gate-DSNIIpI6.js.map → use-token-gate-CbXVYQYI.js.map} +1 -1
  530. package/dist/core/web/public/next/assets/{useOnboarding-Bk0VnkxQ.js → useOnboarding-C_Fpe_sH.js} +2 -2
  531. package/dist/core/web/public/next/assets/{useOnboarding-Bk0VnkxQ.js.map → useOnboarding-C_Fpe_sH.js.map} +1 -1
  532. package/dist/core/web/public/next/assets/{useSeatsRefresh-q7Id9RcW.js → useSeatsRefresh-Co1CnxLc.js} +2 -2
  533. package/dist/core/web/public/next/assets/{useSeatsRefresh-q7Id9RcW.js.map → useSeatsRefresh-Co1CnxLc.js.map} +1 -1
  534. package/dist/core/web/public/next/assets/{useVerseTranscript-CqH51rt9.js → useVerseTranscript-DgbigUlV.js} +2 -2
  535. package/dist/core/web/public/next/assets/{useVerseTranscript-CqH51rt9.js.map → useVerseTranscript-DgbigUlV.js.map} +1 -1
  536. package/dist/core/web/public/next/assets/{verse-icons-DsG1dOQx.js → verse-icons-S56hIiXS.js} +2 -2
  537. package/dist/core/web/public/next/assets/{verse-icons-DsG1dOQx.js.map → verse-icons-S56hIiXS.js.map} +1 -1
  538. package/dist/core/web/public/next/assets/verse-model-DAVevkNe.js +2 -0
  539. package/dist/core/web/public/next/assets/{verse-model-JTuvRBVK.js.map → verse-model-DAVevkNe.js.map} +1 -1
  540. package/dist/core/web/public/next/assets/{warmup-Bv1RumVq.js → warmup-B_RAtNZ_.js} +3 -3
  541. package/dist/core/web/public/next/assets/{warmup-Bv1RumVq.js.map → warmup-B_RAtNZ_.js.map} +1 -1
  542. package/dist/core/web/public/next/assets/{why-seat-model-Cau8qG6O.js → why-seat-model-M_r0wX3b.js} +2 -2
  543. package/dist/core/web/public/next/assets/{why-seat-model-Cau8qG6O.js.map → why-seat-model-M_r0wX3b.js.map} +1 -1
  544. package/dist/core/web/public/next/assets/{workspace-model-D-SLfads.js → workspace-model-dji5-Al3.js} +2 -2
  545. package/dist/core/web/public/next/assets/{workspace-model-D-SLfads.js.map → workspace-model-dji5-Al3.js.map} +1 -1
  546. package/dist/core/web/public/next/index.html +1 -1
  547. package/dist/core/web/read-projection-worker.js +2 -1
  548. package/dist/core/web/read-projection-worker.js.map +1 -1
  549. package/dist/core/web/read-projections.d.ts +3 -0
  550. package/dist/core/web/read-projections.js +2 -2
  551. package/dist/core/web/read-projections.js.map +1 -1
  552. package/dist/core/web/visibility.js +3 -4
  553. package/dist/core/web/visibility.js.map +1 -1
  554. package/dist/release-dependency-inventory.json +1 -1
  555. package/package.json +3 -2
  556. package/dist/core/web/public/next/assets/Advanced-cVYTAsfB.js +0 -2
  557. package/dist/core/web/public/next/assets/AppsSection-DDqeSrty.js +0 -2
  558. package/dist/core/web/public/next/assets/AreaTrend-C32rUaxm.js +0 -2
  559. package/dist/core/web/public/next/assets/AreaTrend-C32rUaxm.js.map +0 -1
  560. package/dist/core/web/public/next/assets/AutonomySection-Dwn8UtOy.js +0 -2
  561. package/dist/core/web/public/next/assets/ChartFrame-BVuBe6RP.css +0 -1
  562. package/dist/core/web/public/next/assets/ChartFrame-DK_BDXCt.js +0 -2
  563. package/dist/core/web/public/next/assets/ChartFrame-DK_BDXCt.js.map +0 -1
  564. package/dist/core/web/public/next/assets/ChatSection-C9myY4ei.js +0 -3
  565. package/dist/core/web/public/next/assets/CommandPalette-DzPsth0u.js +0 -2
  566. package/dist/core/web/public/next/assets/CommandPalette-DzPsth0u.js.map +0 -1
  567. package/dist/core/web/public/next/assets/CommandSection-Brp73iox.js +0 -3
  568. package/dist/core/web/public/next/assets/CommandSection-Brp73iox.js.map +0 -1
  569. package/dist/core/web/public/next/assets/CommandSection-CvAVd1w4.css +0 -1
  570. package/dist/core/web/public/next/assets/DockHost-BcEq2qaS.js +0 -2
  571. package/dist/core/web/public/next/assets/FleetSection-BG8iGraG.js +0 -3
  572. package/dist/core/web/public/next/assets/FleetSection-BG8iGraG.js.map +0 -1
  573. package/dist/core/web/public/next/assets/Funnel-B88_wpA4.js +0 -2
  574. package/dist/core/web/public/next/assets/Funnel-B88_wpA4.js.map +0 -1
  575. package/dist/core/web/public/next/assets/GrowthSection-BvZezOsX.js +0 -2
  576. package/dist/core/web/public/next/assets/LeaderCard-BxxiEg4e.js +0 -2
  577. package/dist/core/web/public/next/assets/LeaderCard-BxxiEg4e.js.map +0 -1
  578. package/dist/core/web/public/next/assets/MatrixHeatmap-iPFEU2Tv.js +0 -2
  579. package/dist/core/web/public/next/assets/MatrixHeatmap-iPFEU2Tv.js.map +0 -1
  580. package/dist/core/web/public/next/assets/McpSection-nuXer4K-.js +0 -2
  581. package/dist/core/web/public/next/assets/MindSection-Dc5v5rH3.js +0 -2
  582. package/dist/core/web/public/next/assets/MindSection-Dc5v5rH3.js.map +0 -1
  583. package/dist/core/web/public/next/assets/NeedsYouDrawer-N1cWJjpz.js +0 -3
  584. package/dist/core/web/public/next/assets/NeedsYouDrawer-N1cWJjpz.js.map +0 -1
  585. package/dist/core/web/public/next/assets/NewChatDialog-BqFTWgHU.js +0 -3
  586. package/dist/core/web/public/next/assets/OnboardingGate-BZafM1Vf.js +0 -3
  587. package/dist/core/web/public/next/assets/PreviewPane-zT3gK9TD.js +0 -2
  588. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CAxPQ4sZ.js +0 -7
  589. package/dist/core/web/public/next/assets/ResourcesChrome-BnhnEdJe.js +0 -3
  590. package/dist/core/web/public/next/assets/ResourcesChrome-BnhnEdJe.js.map +0 -1
  591. package/dist/core/web/public/next/assets/ResourcesDrawer-BAFGodny.js +0 -2
  592. package/dist/core/web/public/next/assets/ResourcesDrawer-BAFGodny.js.map +0 -1
  593. package/dist/core/web/public/next/assets/ResourcesDrawer-BCFJ2Uq8.css +0 -1
  594. package/dist/core/web/public/next/assets/SettingsSection-Bf74l0Gj.js.map +0 -1
  595. package/dist/core/web/public/next/assets/Sidebar-C9YtBYVZ.js +0 -3
  596. package/dist/core/web/public/next/assets/StatTile-BuLMsJMx.css +0 -1
  597. package/dist/core/web/public/next/assets/StatTile-CTX41O6y.js +0 -2
  598. package/dist/core/web/public/next/assets/StatTile-CTX41O6y.js.map +0 -1
  599. package/dist/core/web/public/next/assets/StepBand-jJTqYIdX.js +0 -2
  600. package/dist/core/web/public/next/assets/StepBand-jJTqYIdX.js.map +0 -1
  601. package/dist/core/web/public/next/assets/Swimlane-LrslsGxw.js +0 -2
  602. package/dist/core/web/public/next/assets/Swimlane-LrslsGxw.js.map +0 -1
  603. package/dist/core/web/public/next/assets/Swimlane-o6_Zsrnr.css +0 -1
  604. package/dist/core/web/public/next/assets/UniverseConsoleApp-BpphLqoz.js +0 -2
  605. package/dist/core/web/public/next/assets/UsageSection-CUlaKtws.js +0 -3
  606. package/dist/core/web/public/next/assets/UsageSection-CUlaKtws.js.map +0 -1
  607. package/dist/core/web/public/next/assets/VerseConsoleApp-DXDv1aOi.js +0 -3
  608. package/dist/core/web/public/next/assets/VerseConsoleApp-DXDv1aOi.js.map +0 -1
  609. package/dist/core/web/public/next/assets/Workspace-RXy0pqp6.js +0 -10
  610. package/dist/core/web/public/next/assets/actions-BZTidCXZ.js +0 -2
  611. package/dist/core/web/public/next/assets/actions-BmIf9avl.css +0 -1
  612. package/dist/core/web/public/next/assets/budget-queries-DFF-3ICg.js +0 -2
  613. package/dist/core/web/public/next/assets/charts-CzxWrZn7.js +0 -2
  614. package/dist/core/web/public/next/assets/charts-CzxWrZn7.js.map +0 -1
  615. package/dist/core/web/public/next/assets/charts-DhKTrQLw.css +0 -1
  616. package/dist/core/web/public/next/assets/command-catalog-ffCAijVY.js.map +0 -1
  617. package/dist/core/web/public/next/assets/context-queries-_9bFWb9v.js +0 -2
  618. package/dist/core/web/public/next/assets/global-y_exIyAP.js +0 -2
  619. package/dist/core/web/public/next/assets/guarded-runners-Cd4POBtI.js +0 -2
  620. package/dist/core/web/public/next/assets/mutations-CWlxEMEm.js +0 -2
  621. package/dist/core/web/public/next/assets/primitives-DMijqcu0.js +0 -1
  622. package/dist/core/web/public/next/assets/seat-subscription-BhUUz7VL.js +0 -2
  623. package/dist/core/web/public/next/assets/surface-prefetch-BXKjPsV5.js +0 -2
  624. package/dist/core/web/public/next/assets/surface-prefetch-BXKjPsV5.js.map +0 -1
  625. package/dist/core/web/public/next/assets/verse-model-JTuvRBVK.js +0 -2
@@ -0,0 +1,110 @@
1
+ import type { RepoEnforcement } from '../fleet/fleet-types.js';
2
+ /** What a failed GitHub read means (drives the wording and whether a draft may treat it as definitive). */
3
+ export type GithubReadFailure =
4
+ /** The feature is not on this plan for this repo (private repo on Free): definitive. */
5
+ 'plan-unavailable'
6
+ /** Auth is missing or lacks access (401/403 other than the plan message, "Resource not accessible"). */
7
+ | 'no-permission'
8
+ /** 404: no such repo, or not visible to this auth. */
9
+ | 'not-found'
10
+ /** 5xx, 429 / rate limits, timeouts, network errors: try again later. */
11
+ | 'transient' | 'unknown';
12
+ /**
13
+ * PURE: classify a failed GitHub read from its HTTP status (when known) and
14
+ * message (gh's stderr, or the API's `message`). The plan message wins over
15
+ * everything: GitHub sends it with a 403, which would otherwise read as a
16
+ * permission problem. A rate-limit 403 is transient, not a permission problem.
17
+ */
18
+ export declare function classifyGithubReadFailure(input: {
19
+ status?: number | null;
20
+ message: string;
21
+ }): GithubReadFailure;
22
+ /** PURE: true only for GitHub's "not on this plan" answer — never for a permission or transient failure. */
23
+ export declare function isPlanUnavailable(input: {
24
+ status?: number | null;
25
+ message: string;
26
+ }): boolean;
27
+ /** PURE: a short human phrase for a failure kind. */
28
+ export declare function describeGithubReadFailure(kind: GithubReadFailure): string;
29
+ export type ServerEnforcementState =
30
+ /** GitHub requires at least one status check on the default branch (rulesets or classic protection). */
31
+ 'enforced'
32
+ /** Protection is readable (the plan has it) but requires no status check: G7 under `server` would owner-lane every PR. */
33
+ | 'no-required-checks'
34
+ /** Rulesets / protection are not on this plan for this (private) repo: only `local` enforcement can work. */
35
+ | 'unavailable'
36
+ /** Could not tell (permission, network, …): never treated as enforced. */
37
+ | 'unreadable';
38
+ export interface ServerEnforcementProbe {
39
+ nameWithOwner: string;
40
+ state: ServerEnforcementState;
41
+ /** null = the repo itself could not be read. */
42
+ private: boolean | null;
43
+ /** Why the probe could not tell (state 'unavailable' | 'unreadable'); null otherwise. */
44
+ failure: GithubReadFailure | null;
45
+ /** One human sentence. */
46
+ detail: string;
47
+ }
48
+ /** One `gh api <path>` GET. `status` is gh's exit code (0 = the API answered 2xx). */
49
+ export type GithubGet = (path: string) => Promise<{
50
+ status: number;
51
+ stdout: string;
52
+ stderr: string;
53
+ }> | {
54
+ status: number;
55
+ stdout: string;
56
+ stderr: string;
57
+ };
58
+ /**
59
+ * PURE: how many required status checks GitHub enforces on a branch, from the
60
+ * two reads merge gate G7 uses (fleet/host-merge.ts readRequiredChecks): the
61
+ * effective branch rules and the classic protection summary on GET /branches.
62
+ * Classic contexts with `enforcement_level: "off"` enforce nothing.
63
+ */
64
+ export declare function countRequiredChecks(rules: unknown, branch: unknown): number;
65
+ /**
66
+ * Ask GitHub whether it enforces required checks on `nameWithOwner`'s default
67
+ * branch. At most three GETs: the repo, its effective branch rules, the
68
+ * branch (classic protection summary). Never throws.
69
+ */
70
+ export declare function probeServerEnforcement(nameWithOwner: string, get: GithubGet): Promise<ServerEnforcementProbe>;
71
+ /**
72
+ * PURE: the enforcement a NEW grant draft names for a repo. `server` only
73
+ * when GitHub already enforces required checks there — anything else
74
+ * (unavailable, nothing required, unreadable, not probed) is `local`, which
75
+ * is the stricter mode: lower ceilings, and G7 then demands the App's
76
+ * host-verified `ashlr/verify` instead of trusting whatever ran.
77
+ */
78
+ export declare function draftEnforcementFor(probe: Pick<ServerEnforcementProbe, 'state'> | null | undefined): RepoEnforcement;
79
+ /**
80
+ * PURE: should a RE-APPROVAL switch a `server` repo to `local`? Only on
81
+ * definitive evidence that GitHub cannot or does not enforce checks there —
82
+ * an unreadable probe (offline, rate-limited) leaves the signed choice alone,
83
+ * so a flaky network during a re-approval cannot quietly rewrite the grant.
84
+ * A re-approval never switches `local` → `server` (that would widen the
85
+ * ceilings; a new grant does it).
86
+ */
87
+ export declare function reapprovalDowngrades(probe: Pick<ServerEnforcementProbe, 'state'> | null | undefined): boolean;
88
+ /**
89
+ * PURE: the mismatch between a signed grant's enforcement and what GitHub
90
+ * does today, as one sentence for status / setup / Verse; null when they
91
+ * agree or the probe could not tell. The grant itself is never changed here —
92
+ * only a re-approval (Touch ID) switches the repo.
93
+ */
94
+ export declare function enforcementMismatch(grantRepo: {
95
+ nameWithOwner: string;
96
+ enforcement: RepoEnforcement;
97
+ }, probe: ServerEnforcementProbe | null | undefined, grantSeq?: number | null): string | null;
98
+ /**
99
+ * `gh api <path>` (GET only, never a shell, killed after 10 s). Under Vitest
100
+ * it refuses without spawning anything: a draft built by a test that did not
101
+ * inject a reader must never read Mason's real GitHub account — and a refusal
102
+ * makes every repo `local`, the stricter answer.
103
+ */
104
+ export declare function defaultGithubGet(path: string): Promise<{
105
+ status: number;
106
+ stdout: string;
107
+ stderr: string;
108
+ }>;
109
+ /** Probe several repos concurrently (each probe is ≤ 3 sequential GETs). Keyed by lower-cased owner/name. */
110
+ export declare function probeServerEnforcementAll(repos: readonly string[], get?: GithubGet): Promise<Map<string, ServerEnforcementProbe>>;
@@ -0,0 +1,260 @@
1
+ /**
2
+ * Server enforcement — can GitHub itself protect a grant repo's default branch?
3
+ *
4
+ * A standing grant names each repo `server` or `local` enforcement (types.ts
5
+ * StandingGrantRepo). `server` means GitHub's rulesets / branch protection
6
+ * require checks on the default branch, and merge gate G7 trusts exactly those
7
+ * required checks; `local` means GitHub protects nothing, so G7 requires every
8
+ * check on the head green AND the ashlr-fleet App's host-verified
9
+ * `ashlr/verify` (fleet/verify-check-run.ts), under the lower local ceilings.
10
+ *
11
+ * WHY THIS MODULE EXISTS: on GitHub Free, rulesets AND classic branch
12
+ * protection are unavailable for PRIVATE repos. Verified against the live API
13
+ * (2026-09-26, org plan "free", private ashlrai/measurably):
14
+ *
15
+ * GET repos/X/rulesets → 403 "Upgrade to GitHub Pro or make this repository public to enable this feature."
16
+ * GET repos/X/rules/branches/main → 403 (same message)
17
+ * GET repos/X/branches/main/protection → 403 (same message)
18
+ * GET repos/X/branches/main → 200, protected: false
19
+ *
20
+ * So classic branch protection is NOT a fallback where rulesets are missing
21
+ * (it is plan-gated identically) and the fleet does not try to apply it.
22
+ * Drafts used to mark every repo whose visibility was unknown `server`, which
23
+ * made G7 send every PR in such a repo to the owner lane forever. A draft now
24
+ * asks GitHub and names `server` only where GitHub already enforces at least
25
+ * one required check on the default branch; everything else is `local`.
26
+ *
27
+ * Nothing here gates a merge: G7 re-reads the live protection on every PR.
28
+ * These reads only decide what a DRAFT proposes (Mason still signs it) and
29
+ * what status / setup report. Every call is a `gh api <path>` GET.
30
+ */
31
+ import { execFile } from 'node:child_process';
32
+ /** GitHub's wording for a plan-gated feature on a private repo (rulesets, branch protection). */
33
+ const PLAN_UNAVAILABLE_RE = /upgrade to github pro|make this repository public to enable this feature/iu;
34
+ const TRANSIENT_RE = /rate limit|HTTP 5\d\d|HTTP 429|timed? ?out|ETIMEDOUT|ECONNRESET|ECONNREFUSED|ENOTFOUND|EAI_AGAIN|could not resolve|network|did not answer|ran out of time|bad gateway|service unavailable/iu;
35
+ const PERMISSION_RE = /HTTP 40[13]\b|resource not accessible|must have admin|bad credentials|requires authentication|gh auth login|not logged in/iu;
36
+ const NOT_FOUND_RE = /HTTP 404\b|\bnot found\b/iu;
37
+ /**
38
+ * PURE: classify a failed GitHub read from its HTTP status (when known) and
39
+ * message (gh's stderr, or the API's `message`). The plan message wins over
40
+ * everything: GitHub sends it with a 403, which would otherwise read as a
41
+ * permission problem. A rate-limit 403 is transient, not a permission problem.
42
+ */
43
+ export function classifyGithubReadFailure(input) {
44
+ const message = input.message ?? '';
45
+ const status = input.status ?? null;
46
+ if (PLAN_UNAVAILABLE_RE.test(message))
47
+ return 'plan-unavailable';
48
+ if ((status !== null && (status >= 500 || status === 429 || status === 0)) || TRANSIENT_RE.test(message))
49
+ return 'transient';
50
+ if (status === 404 || (status === null && NOT_FOUND_RE.test(message)))
51
+ return 'not-found';
52
+ if (status === 401 || status === 403 || (status === null && PERMISSION_RE.test(message)))
53
+ return 'no-permission';
54
+ return 'unknown';
55
+ }
56
+ /** PURE: true only for GitHub's "not on this plan" answer — never for a permission or transient failure. */
57
+ export function isPlanUnavailable(input) {
58
+ return classifyGithubReadFailure(input) === 'plan-unavailable';
59
+ }
60
+ /** PURE: a short human phrase for a failure kind. */
61
+ export function describeGithubReadFailure(kind) {
62
+ switch (kind) {
63
+ case 'plan-unavailable': return 'not available on this GitHub plan for a private repo';
64
+ case 'no-permission': return 'your gh auth has no access (check `gh auth status`)';
65
+ case 'not-found': return 'not found, or not visible to your gh auth';
66
+ case 'transient': return 'GitHub did not answer (network, rate limit or outage) — try again';
67
+ default: return 'GitHub refused the read';
68
+ }
69
+ }
70
+ const REPO_RE = /^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})\/[A-Za-z0-9._-]{1,100}$/u;
71
+ const BRANCH_RE = /^[A-Za-z0-9._/-]{1,255}$/u;
72
+ function parseJson(text) {
73
+ try {
74
+ return JSON.parse(text || 'null');
75
+ }
76
+ catch {
77
+ return undefined;
78
+ }
79
+ }
80
+ function record(value) {
81
+ return value !== null && typeof value === 'object' && !Array.isArray(value) ? value : null;
82
+ }
83
+ function failureMessage(result) {
84
+ const body = record(parseJson(result.stdout));
85
+ const apiMessage = typeof body?.['message'] === 'string' ? body['message'] : '';
86
+ return `${result.stderr} ${apiMessage}`.replace(/\s+/gu, ' ').trim().slice(0, 300);
87
+ }
88
+ /**
89
+ * PURE: how many required status checks GitHub enforces on a branch, from the
90
+ * two reads merge gate G7 uses (fleet/host-merge.ts readRequiredChecks): the
91
+ * effective branch rules and the classic protection summary on GET /branches.
92
+ * Classic contexts with `enforcement_level: "off"` enforce nothing.
93
+ */
94
+ export function countRequiredChecks(rules, branch) {
95
+ const contexts = new Set();
96
+ if (Array.isArray(rules)) {
97
+ for (const rule of rules) {
98
+ const r = record(rule);
99
+ if (r?.['type'] !== 'required_status_checks')
100
+ continue;
101
+ const checks = record(r['parameters'])?.['required_status_checks'];
102
+ if (!Array.isArray(checks))
103
+ continue;
104
+ for (const check of checks) {
105
+ const context = record(check)?.['context'];
106
+ if (typeof context === 'string' && context.length > 0)
107
+ contexts.add(context);
108
+ }
109
+ }
110
+ }
111
+ const classic = record(record(record(branch)?.['protection'])?.['required_status_checks']);
112
+ if (classic && classic['enforcement_level'] !== 'off') {
113
+ for (const list of [classic['contexts'], Array.isArray(classic['checks']) ? classic['checks'].map((c) => record(c)?.['context']) : []]) {
114
+ if (!Array.isArray(list))
115
+ continue;
116
+ for (const context of list)
117
+ if (typeof context === 'string' && context.length > 0)
118
+ contexts.add(context);
119
+ }
120
+ }
121
+ return contexts.size;
122
+ }
123
+ /**
124
+ * Ask GitHub whether it enforces required checks on `nameWithOwner`'s default
125
+ * branch. At most three GETs: the repo, its effective branch rules, the
126
+ * branch (classic protection summary). Never throws.
127
+ */
128
+ export async function probeServerEnforcement(nameWithOwner, get) {
129
+ const out = (state, isPrivate, failure, detail) => ({ nameWithOwner, state, private: isPrivate, failure, detail });
130
+ if (!REPO_RE.test(nameWithOwner))
131
+ return out('unreadable', null, 'unknown', 'not an owner/name repo');
132
+ let repo;
133
+ try {
134
+ repo = await get(`repos/${nameWithOwner}`);
135
+ }
136
+ catch (error) {
137
+ repo = { status: 1, stdout: '', stderr: error.message };
138
+ }
139
+ if (repo.status !== 0) {
140
+ const failure = classifyGithubReadFailure({ message: failureMessage(repo) });
141
+ return out('unreadable', null, failure, `could not read ${nameWithOwner}: ${describeGithubReadFailure(failure)}`);
142
+ }
143
+ const info = record(parseJson(repo.stdout));
144
+ const isPrivate = info?.['private'] === true ? true : info?.['private'] === false ? false : null;
145
+ const branchName = typeof info?.['default_branch'] === 'string' && BRANCH_RE.test(info['default_branch']) ? info['default_branch'] : null;
146
+ if (!branchName)
147
+ return out('unreadable', isPrivate, 'unknown', `${nameWithOwner} has no readable default branch`);
148
+ const encoded = branchName.split('/').map(encodeURIComponent).join('/');
149
+ let rules;
150
+ try {
151
+ rules = await get(`repos/${nameWithOwner}/rules/branches/${encoded}?per_page=100`);
152
+ }
153
+ catch (error) {
154
+ rules = { status: 1, stdout: '', stderr: error.message };
155
+ }
156
+ let rulesBody = [];
157
+ if (rules.status !== 0) {
158
+ const failure = classifyGithubReadFailure({ message: failureMessage(rules) });
159
+ if (failure === 'plan-unavailable') {
160
+ return out('unavailable', isPrivate, failure, `GitHub rulesets are unavailable on this plan for ${isPrivate === false ? 'repo' : 'private repo'} ${nameWithOwner}`);
161
+ }
162
+ // G7 reads a 404 here as "no rulesets" (older GHES); anything else is unknown.
163
+ if (failure !== 'not-found')
164
+ return out('unreadable', isPrivate, failure, `could not read ${nameWithOwner}'s branch rules: ${describeGithubReadFailure(failure)}`);
165
+ }
166
+ else {
167
+ rulesBody = parseJson(rules.stdout);
168
+ }
169
+ let branch;
170
+ try {
171
+ branch = await get(`repos/${nameWithOwner}/branches/${encoded}`);
172
+ }
173
+ catch (error) {
174
+ branch = { status: 1, stdout: '', stderr: error.message };
175
+ }
176
+ if (branch.status !== 0) {
177
+ const failure = classifyGithubReadFailure({ message: failureMessage(branch) });
178
+ return out('unreadable', isPrivate, failure, `could not read ${nameWithOwner}'s ${branchName} branch: ${describeGithubReadFailure(failure)}`);
179
+ }
180
+ const required = countRequiredChecks(rulesBody, parseJson(branch.stdout));
181
+ return required > 0
182
+ ? out('enforced', isPrivate, null, `GitHub requires ${required} check${required === 1 ? '' : 's'} on ${nameWithOwner}:${branchName}`)
183
+ : out('no-required-checks', isPrivate, null, `GitHub requires no status check on ${nameWithOwner}:${branchName}`);
184
+ }
185
+ /**
186
+ * PURE: the enforcement a NEW grant draft names for a repo. `server` only
187
+ * when GitHub already enforces required checks there — anything else
188
+ * (unavailable, nothing required, unreadable, not probed) is `local`, which
189
+ * is the stricter mode: lower ceilings, and G7 then demands the App's
190
+ * host-verified `ashlr/verify` instead of trusting whatever ran.
191
+ */
192
+ export function draftEnforcementFor(probe) {
193
+ return probe?.state === 'enforced' ? 'server' : 'local';
194
+ }
195
+ /**
196
+ * PURE: should a RE-APPROVAL switch a `server` repo to `local`? Only on
197
+ * definitive evidence that GitHub cannot or does not enforce checks there —
198
+ * an unreadable probe (offline, rate-limited) leaves the signed choice alone,
199
+ * so a flaky network during a re-approval cannot quietly rewrite the grant.
200
+ * A re-approval never switches `local` → `server` (that would widen the
201
+ * ceilings; a new grant does it).
202
+ */
203
+ export function reapprovalDowngrades(probe) {
204
+ return probe?.state === 'unavailable' || probe?.state === 'no-required-checks';
205
+ }
206
+ /**
207
+ * PURE: the mismatch between a signed grant's enforcement and what GitHub
208
+ * does today, as one sentence for status / setup / Verse; null when they
209
+ * agree or the probe could not tell. The grant itself is never changed here —
210
+ * only a re-approval (Touch ID) switches the repo.
211
+ */
212
+ export function enforcementMismatch(grantRepo, probe, grantSeq = null) {
213
+ if (grantRepo.enforcement !== 'server' || !probe)
214
+ return null;
215
+ const grant = grantSeq === null ? 'the grant' : `grant #${grantSeq}`;
216
+ if (probe.state === 'unavailable') {
217
+ return `${grant} says server enforcement for ${grantRepo.nameWithOwner}, but GitHub rulesets are unavailable on this plan for ${probe.private === false ? 'this repo' : 'this private repo'} ` +
218
+ '— G7 sends its PRs to the owner lane; re-approve (`ashlr authority re-approve`) to switch it to local enforcement with ashlr/verify';
219
+ }
220
+ if (probe.state === 'no-required-checks') {
221
+ return `${grant} says server enforcement for ${grantRepo.nameWithOwner}, but GitHub requires no check on its default branch ` +
222
+ '— G7 sends its PRs to the owner lane; run `ashlr authority protect --apply`, or re-approve to switch it to local enforcement with ashlr/verify';
223
+ }
224
+ return null;
225
+ }
226
+ // ---------------------------------------------------------------------------
227
+ // The default reader: a bounded, read-only `gh api <path>`
228
+ // ---------------------------------------------------------------------------
229
+ const GH_PATH_RE = /^[A-Za-z0-9][A-Za-z0-9._~/?=&%-]{0,400}$/u;
230
+ const GH_TIMEOUT_MS = 10_000;
231
+ /**
232
+ * `gh api <path>` (GET only, never a shell, killed after 10 s). Under Vitest
233
+ * it refuses without spawning anything: a draft built by a test that did not
234
+ * inject a reader must never read Mason's real GitHub account — and a refusal
235
+ * makes every repo `local`, the stricter answer.
236
+ */
237
+ export function defaultGithubGet(path) {
238
+ if (process.env['VITEST'] === 'true')
239
+ return Promise.resolve({ status: 1, stdout: '', stderr: 'not read: GitHub reads are disabled under tests' });
240
+ if (!GH_PATH_RE.test(path))
241
+ return Promise.resolve({ status: 1, stdout: '', stderr: 'refused: not a gh api path' });
242
+ return new Promise((done) => {
243
+ execFile('gh', ['api', path], {
244
+ encoding: 'utf8',
245
+ timeout: GH_TIMEOUT_MS,
246
+ maxBuffer: 8 * 1024 * 1024,
247
+ env: { ...process.env, GH_PROMPT_DISABLED: '1', GH_NO_UPDATE_NOTIFIER: '1' },
248
+ }, (error, stdout, stderr) => {
249
+ const code = error?.code;
250
+ done({ status: error ? (typeof code === 'number' ? code : 1) : 0, stdout: stdout ?? '', stderr: stderr || (error ? error.message : '') });
251
+ });
252
+ });
253
+ }
254
+ /** Probe several repos concurrently (each probe is ≤ 3 sequential GETs). Keyed by lower-cased owner/name. */
255
+ export async function probeServerEnforcementAll(repos, get = defaultGithubGet) {
256
+ const unique = [...new Map(repos.map((repo) => [repo.toLowerCase(), repo])).values()];
257
+ const probes = await Promise.all(unique.map((repo) => probeServerEnforcement(repo, get)));
258
+ return new Map(probes.map((probe) => [probe.nameWithOwner.toLowerCase(), probe]));
259
+ }
260
+ //# sourceMappingURL=server-enforcement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-enforcement.js","sourceRoot":"","sources":["../../../src/core/authority/server-enforcement.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,7 @@
24
24
  import { type KeyObject } from 'node:crypto';
25
25
  import type { BudgetEngine } from '../routing/policy.js';
26
26
  import { type FleetEngine, type MergeRisk } from '../fleet/fleet-types.js';
27
+ import { type ServerEnforcementState } from './server-enforcement.js';
27
28
  import { type SurfaceTarget } from './surface.js';
28
29
  import { type LeaderGrantClass, type RolloutCriteria, type SignedStandingGrantV1, type StandingGrantTrustRoot, type StandingGrantV1 } from './types.js';
29
30
  export type GrantParseResult<T> = {
@@ -95,10 +96,19 @@ export declare function standingTrustRootKeys(roots: readonly StandingGrantTrust
95
96
  export declare function verifyStandingGrant(value: unknown, ctx: StandingGrantVerifyContext, roots: readonly StandingGrantTrustRoot[]): StandingGrantVerification;
96
97
  export interface DraftRepoInput {
97
98
  nameWithOwner: string;
98
- /** Private repos on the free plan cannot get server-side protection → local enforcement. null = unknown (treated as public). */
99
+ /** Private repos on the free plan cannot get server-side protection → local enforcement. null = unknown. */
99
100
  visibility: 'public' | 'private' | null;
100
101
  /** The checkout has a verify command (tests); null = unknown. */
101
102
  hasVerify: boolean | null;
103
+ /**
104
+ * What GitHub enforces on the default branch today (server-enforcement.ts
105
+ * probeServerEnforcement). The draft names `server` ONLY for 'enforced';
106
+ * absent / null (not probed) is `local` — the stricter mode. WHY: a repo
107
+ * named `server` that GitHub cannot protect (a private repo on Free has
108
+ * neither rulesets nor branch protection) sends every PR to the owner lane
109
+ * at G7 forever, while `local` gets the App's host-verified ashlr/verify.
110
+ */
111
+ serverEnforcement?: ServerEnforcementState | null;
102
112
  }
103
113
  export interface DraftSeatInput {
104
114
  seatId: string;
@@ -151,12 +161,22 @@ export declare const LOCAL_SEAT_WILDCARD = "local";
151
161
  export declare function buildDefaultGrantPayload(input: GrantDraftInput): StandingGrantV1;
152
162
  /**
153
163
  * PURE: the grant that continues `current` after a pause, an expiry or a new
154
- * 30-day period. Same scope, fresh ids / dates / bindings, and its ladder
155
- * STARTS at the stage `current` had reached — a deploy does not restart the
164
+ * 30-day period. Same scope (except a `server` repo GitHub cannot protect,
165
+ * which becomes `local` — see `serverEnforcement`), fresh ids / dates /
166
+ * bindings, and its ladder STARTS at the stage `current` had reached — a deploy does not restart the
156
167
  * ramp from shadow. The start rung is inside the signed payload (the first
157
168
  * stage), so the Touch ID prompt shows exactly where autonomy resumes.
158
169
  */
159
- export declare function buildReapprovalGrantPayload(current: StandingGrantV1, currentStageIndex: number, input: Omit<GrantDraftInput, 'repos' | 'seats'>): StandingGrantV1;
170
+ export declare function buildReapprovalGrantPayload(current: StandingGrantV1, currentStageIndex: number, input: Omit<GrantDraftInput, 'repos' | 'seats'> & {
171
+ /**
172
+ * What GitHub enforces per repo today (lower-cased owner/name → state).
173
+ * A `server` repo GitHub definitively cannot / does not protect
174
+ * ('unavailable' | 'no-required-checks') is switched to `local` at the
175
+ * local ceilings — the only scope change a re-approval makes, and always
176
+ * a narrowing. Unreadable or absent entries leave the signed choice alone.
177
+ */
178
+ serverEnforcement?: ReadonlyMap<string, ServerEnforcementState>;
179
+ }): StandingGrantV1;
160
180
  /** Plain-language lines describing a grant's scope (CLI confirmation, the Touch ID sheet, logs). */
161
181
  export declare function describeGrantScope(grant: StandingGrantV1): string[];
162
182
  export declare function installedGrantPath(): string;
@@ -27,6 +27,7 @@ import { join } from 'node:path';
27
27
  import { BUDGET_MODES } from '../routing/types.js';
28
28
  import { FLEET_ENGINES, MERGE_RISK_RANK, REPO_STAGE_RANK } from '../fleet/fleet-types.js';
29
29
  import { canonicalJson } from './canonical-json.js';
30
+ import { draftEnforcementFor, reapprovalDowngrades } from './server-enforcement.js';
30
31
  import { keyIdForPublicKeyPem } from './custody-client.js';
31
32
  import { authorityDir, ensureAuthorityDir, readPrivateText, withLedgerTransaction, writePrivateAtomically, } from './ledger.js';
32
33
  import { currentHostBinding, verifyAuthoritySurface } from './surface.js';
@@ -518,7 +519,8 @@ export function buildDefaultGrantPayload(input) {
518
519
  continue;
519
520
  seen.add(key);
520
521
  const plan = DEFAULT_REPO_PLAN[repoName(candidate.nameWithOwner)];
521
- const local = candidate.visibility === 'private';
522
+ const local = candidate.visibility === 'private'
523
+ || draftEnforcementFor(candidate.serverEnforcement ? { state: candidate.serverEnforcement } : null) === 'local';
522
524
  const canMerge = plan !== undefined && !(plan.needsVerify && candidate.hasVerify !== true);
523
525
  const risk = local ? 'low' : plan?.risk ?? 'low';
524
526
  planned.push({
@@ -592,15 +594,29 @@ export function buildDefaultGrantPayload(input) {
592
594
  }
593
595
  /**
594
596
  * PURE: the grant that continues `current` after a pause, an expiry or a new
595
- * 30-day period. Same scope, fresh ids / dates / bindings, and its ladder
596
- * STARTS at the stage `current` had reached — a deploy does not restart the
597
+ * 30-day period. Same scope (except a `server` repo GitHub cannot protect,
598
+ * which becomes `local` — see `serverEnforcement`), fresh ids / dates /
599
+ * bindings, and its ladder STARTS at the stage `current` had reached — a deploy does not restart the
597
600
  * ramp from shadow. The start rung is inside the signed payload (the first
598
601
  * stage), so the Touch ID prompt shows exactly where autonomy resumes.
599
602
  */
600
603
  export function buildReapprovalGrantPayload(current, currentStageIndex, input) {
601
604
  const from = Math.max(0, Math.min(currentStageIndex, current.rollout.stages.length - 1));
605
+ const ceiling = STANDING_GRANT_CEILINGS.localEnforcement;
606
+ const repos = current.repos.map((repo) => {
607
+ const state = input.serverEnforcement?.get(repo.nameWithOwner.toLowerCase());
608
+ if (repo.enforcement !== 'server' || !reapprovalDowngrades(state === undefined ? null : { state }))
609
+ return structuredClone(repo);
610
+ return {
611
+ ...repo,
612
+ enforcement: 'local',
613
+ maxRisk: MERGE_RISK_RANK[repo.maxRisk] > MERGE_RISK_RANK[ceiling.maxRisk] ? ceiling.maxRisk : repo.maxRisk,
614
+ maxMergesPerDay: Math.min(repo.maxMergesPerDay, ceiling.maxMergesPerDay),
615
+ };
616
+ });
602
617
  const payload = {
603
618
  ...structuredClone(current),
619
+ repos,
604
620
  grantId: input.grantId,
605
621
  grantSeq: input.grantSeq,
606
622
  keyId: input.keyId,