@ashlr/hub 3.12.0 → 3.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (719) hide show
  1. package/CHANGELOG.md +157 -0
  2. package/README.md +29 -16
  3. package/dist/authority-surface.json +274 -148
  4. package/dist/build-identity.json +2 -2
  5. package/dist/cli/authority.d.ts +145 -33
  6. package/dist/cli/authority.js +1292 -315
  7. package/dist/cli/authority.js.map +1 -1
  8. package/dist/cli/cloud.js +12 -3
  9. package/dist/cli/cloud.js.map +1 -1
  10. package/dist/cli/comms.d.ts +33 -19
  11. package/dist/cli/comms.js +128 -151
  12. package/dist/cli/comms.js.map +1 -1
  13. package/dist/cli/completions.js +1 -1
  14. package/dist/cli/completions.js.map +1 -1
  15. package/dist/cli/daemon.js +29 -0
  16. package/dist/cli/daemon.js.map +1 -1
  17. package/dist/cli/director.d.ts +8 -12
  18. package/dist/cli/director.js +17 -52
  19. package/dist/cli/director.js.map +1 -1
  20. package/dist/cli/fleet.js +4 -1
  21. package/dist/cli/fleet.js.map +1 -1
  22. package/dist/cli/help.js +1 -0
  23. package/dist/cli/help.js.map +1 -1
  24. package/dist/cli/leader.d.ts +27 -3
  25. package/dist/cli/leader.js +253 -4
  26. package/dist/cli/leader.js.map +1 -1
  27. package/dist/core/authority/protected-paths.js +11 -0
  28. package/dist/core/authority/protected-paths.js.map +1 -1
  29. package/dist/core/authority/resident.d.ts +101 -0
  30. package/dist/core/authority/resident.js +246 -0
  31. package/dist/core/authority/resident.js.map +1 -0
  32. package/dist/core/authority/server-enforcement.d.ts +110 -0
  33. package/dist/core/authority/server-enforcement.js +260 -0
  34. package/dist/core/authority/server-enforcement.js.map +1 -0
  35. package/dist/core/authority/standing-grant.d.ts +24 -4
  36. package/dist/core/authority/standing-grant.js +19 -3
  37. package/dist/core/authority/standing-grant.js.map +1 -1
  38. package/dist/core/authority/types.d.ts +43 -0
  39. package/dist/core/authority/types.js +6 -0
  40. package/dist/core/authority/types.js.map +1 -1
  41. package/dist/core/cloud/budget.js +11 -1
  42. package/dist/core/cloud/budget.js.map +1 -1
  43. package/dist/core/cloud/cloud-api.d.ts +25 -2
  44. package/dist/core/cloud/cloud-api.js +139 -5
  45. package/dist/core/cloud/cloud-api.js.map +1 -1
  46. package/dist/core/cloud/pr-actions.d.ts +93 -0
  47. package/dist/core/cloud/pr-actions.js +436 -0
  48. package/dist/core/cloud/pr-actions.js.map +1 -0
  49. package/dist/core/cloud/pr-preview.d.ts +128 -0
  50. package/dist/core/cloud/pr-preview.js +228 -0
  51. package/dist/core/cloud/pr-preview.js.map +1 -0
  52. package/dist/core/cloud/store.d.ts +2 -0
  53. package/dist/core/cloud/store.js +28 -0
  54. package/dist/core/cloud/store.js.map +1 -1
  55. package/dist/core/cloud/timeline-api.d.ts +24 -0
  56. package/dist/core/cloud/timeline-api.js +46 -0
  57. package/dist/core/cloud/timeline-api.js.map +1 -0
  58. package/dist/core/cloud/timeline-types.d.ts +62 -0
  59. package/dist/core/cloud/timeline-types.js +36 -0
  60. package/dist/core/cloud/timeline-types.js.map +1 -0
  61. package/dist/core/cloud/timeline.d.ts +102 -0
  62. package/dist/core/cloud/timeline.js +925 -0
  63. package/dist/core/cloud/timeline.js.map +1 -0
  64. package/dist/core/cloud/tracker.js +67 -0
  65. package/dist/core/cloud/tracker.js.map +1 -1
  66. package/dist/core/cloud/types.d.ts +38 -0
  67. package/dist/core/cloud/types.js +1 -1
  68. package/dist/core/cloud/types.js.map +1 -1
  69. package/dist/core/comms/change-digest.d.ts +130 -0
  70. package/dist/core/comms/change-digest.js +451 -0
  71. package/dist/core/comms/change-digest.js.map +1 -0
  72. package/dist/core/comms/director-prompt.d.ts +4 -5
  73. package/dist/core/comms/director-prompt.js +4 -71
  74. package/dist/core/comms/director-prompt.js.map +1 -1
  75. package/dist/core/comms/director.d.ts +24 -61
  76. package/dist/core/comms/director.js +29 -382
  77. package/dist/core/comms/director.js.map +1 -1
  78. package/dist/core/comms/dispatch.d.ts +37 -12
  79. package/dist/core/comms/dispatch.js +244 -177
  80. package/dist/core/comms/dispatch.js.map +1 -1
  81. package/dist/core/comms/elon-dialogue.d.ts +23 -15
  82. package/dist/core/comms/elon-dialogue.js +36 -307
  83. package/dist/core/comms/elon-dialogue.js.map +1 -1
  84. package/dist/core/comms/fleet-pulse.js +4 -7
  85. package/dist/core/comms/fleet-pulse.js.map +1 -1
  86. package/dist/core/comms/handlers.d.ts +10 -6
  87. package/dist/core/comms/handlers.js +14 -48
  88. package/dist/core/comms/handlers.js.map +1 -1
  89. package/dist/core/comms/migrations.d.ts +47 -0
  90. package/dist/core/comms/migrations.js +125 -0
  91. package/dist/core/comms/migrations.js.map +1 -0
  92. package/dist/core/comms/requests.d.ts +32 -5
  93. package/dist/core/comms/requests.js +101 -5
  94. package/dist/core/comms/requests.js.map +1 -1
  95. package/dist/core/comms/telegram-channel.d.ts +104 -0
  96. package/dist/core/comms/telegram-channel.js +622 -0
  97. package/dist/core/comms/telegram-channel.js.map +1 -0
  98. package/dist/core/comms/telegram-thread-map.d.ts +56 -0
  99. package/dist/core/comms/telegram-thread-map.js +144 -0
  100. package/dist/core/comms/telegram-thread-map.js.map +1 -0
  101. package/dist/core/daemon/capacity-publisher.d.ts +8 -1
  102. package/dist/core/daemon/capacity-publisher.js +40 -2
  103. package/dist/core/daemon/capacity-publisher.js.map +1 -1
  104. package/dist/core/daemon/loop.js +18 -4
  105. package/dist/core/daemon/loop.js.map +1 -1
  106. package/dist/core/daemon/service-install-authority.d.ts +10 -2
  107. package/dist/core/daemon/service-install-authority.js +14 -5
  108. package/dist/core/daemon/service-install-authority.js.map +1 -1
  109. package/dist/core/daemon/service.d.ts +15 -0
  110. package/dist/core/daemon/service.js +26 -0
  111. package/dist/core/daemon/service.js.map +1 -1
  112. package/dist/core/daemon/tick-deadline.d.ts +44 -0
  113. package/dist/core/daemon/tick-deadline.js +83 -0
  114. package/dist/core/daemon/tick-deadline.js.map +1 -0
  115. package/dist/core/daemon/tick-hooks.d.ts +7 -0
  116. package/dist/core/daemon/tick-hooks.js.map +1 -1
  117. package/dist/core/daemon/tick-progress.d.ts +39 -0
  118. package/dist/core/daemon/tick-progress.js +194 -0
  119. package/dist/core/daemon/tick-progress.js.map +1 -0
  120. package/dist/core/dashboard.js +3 -1
  121. package/dist/core/dashboard.js.map +1 -1
  122. package/dist/core/fleet/cloud-intake.d.ts +95 -0
  123. package/dist/core/fleet/cloud-intake.js +557 -0
  124. package/dist/core/fleet/cloud-intake.js.map +1 -0
  125. package/dist/core/fleet/dispatch-router.d.ts +13 -0
  126. package/dist/core/fleet/dispatch-router.js +32 -8
  127. package/dist/core/fleet/dispatch-router.js.map +1 -1
  128. package/dist/core/fleet/fleet-merge-state.d.ts +16 -0
  129. package/dist/core/fleet/fleet-merge-state.js.map +1 -1
  130. package/dist/core/fleet/host-merge.d.ts +14 -0
  131. package/dist/core/fleet/host-merge.js +24 -2
  132. package/dist/core/fleet/host-merge.js.map +1 -1
  133. package/dist/core/fleet/merge-gates.d.ts +21 -0
  134. package/dist/core/fleet/merge-gates.js +39 -5
  135. package/dist/core/fleet/merge-gates.js.map +1 -1
  136. package/dist/core/fleet/mirrors.d.ts +162 -6
  137. package/dist/core/fleet/mirrors.js +1051 -49
  138. package/dist/core/fleet/mirrors.js.map +1 -1
  139. package/dist/core/fleet/standing-merge-pass.d.ts +8 -0
  140. package/dist/core/fleet/standing-merge-pass.js +102 -1
  141. package/dist/core/fleet/standing-merge-pass.js.map +1 -1
  142. package/dist/core/fleet/status.d.ts +17 -0
  143. package/dist/core/fleet/status.js +22 -0
  144. package/dist/core/fleet/status.js.map +1 -1
  145. package/dist/core/fleet/tick-hooks-live.d.ts +10 -1
  146. package/dist/core/fleet/tick-hooks-live.js +57 -8
  147. package/dist/core/fleet/tick-hooks-live.js.map +1 -1
  148. package/dist/core/fleet/verify-check-run.d.ts +90 -0
  149. package/dist/core/fleet/verify-check-run.js +274 -0
  150. package/dist/core/fleet/verify-check-run.js.map +1 -0
  151. package/dist/core/git.d.ts +17 -0
  152. package/dist/core/git.js +124 -25
  153. package/dist/core/git.js.map +1 -1
  154. package/dist/core/goals/open-goals.d.ts +47 -0
  155. package/dist/core/goals/open-goals.js +33 -0
  156. package/dist/core/goals/open-goals.js.map +1 -0
  157. package/dist/core/inbox/merge.d.ts +5 -0
  158. package/dist/core/inbox/merge.js +58 -2
  159. package/dist/core/inbox/merge.js.map +1 -1
  160. package/dist/core/integrations/locus.d.ts +28 -0
  161. package/dist/core/integrations/locus.js +155 -30
  162. package/dist/core/integrations/locus.js.map +1 -1
  163. package/dist/core/integrations/telegram-format.d.ts +40 -0
  164. package/dist/core/integrations/telegram-format.js +123 -0
  165. package/dist/core/integrations/telegram-format.js.map +1 -0
  166. package/dist/core/integrations/telegram.d.ts +60 -4
  167. package/dist/core/integrations/telegram.js +161 -28
  168. package/dist/core/integrations/telegram.js.map +1 -1
  169. package/dist/core/mcp-registry.d.ts +12 -0
  170. package/dist/core/mcp-registry.js +70 -0
  171. package/dist/core/mcp-registry.js.map +1 -1
  172. package/dist/core/observability/rollup.d.ts +12 -10
  173. package/dist/core/observability/rollup.js +44 -17
  174. package/dist/core/observability/rollup.js.map +1 -1
  175. package/dist/core/resources/connection-monitor.d.ts +9 -0
  176. package/dist/core/resources/connection-monitor.js +19 -9
  177. package/dist/core/resources/connection-monitor.js.map +1 -1
  178. package/dist/core/resources/quota-refresh-lease.d.ts +17 -0
  179. package/dist/core/resources/quota-refresh-lease.js +34 -1
  180. package/dist/core/resources/quota-refresh-lease.js.map +1 -1
  181. package/dist/core/routing/budget-api.d.ts +18 -1
  182. package/dist/core/routing/budget-api.js +120 -10
  183. package/dist/core/routing/budget-api.js.map +1 -1
  184. package/dist/core/routing/budget-store.d.ts +22 -1
  185. package/dist/core/routing/budget-store.js +22 -8
  186. package/dist/core/routing/budget-store.js.map +1 -1
  187. package/dist/core/routing/readiness-types.d.ts +82 -0
  188. package/dist/core/routing/readiness-types.js +23 -0
  189. package/dist/core/routing/readiness-types.js.map +1 -0
  190. package/dist/core/routing/readiness.d.ts +103 -0
  191. package/dist/core/routing/readiness.js +480 -0
  192. package/dist/core/routing/readiness.js.map +1 -0
  193. package/dist/core/sandbox/confine.js +22 -1
  194. package/dist/core/sandbox/confine.js.map +1 -1
  195. package/dist/core/sandbox/policy.d.ts +23 -0
  196. package/dist/core/sandbox/policy.js +100 -0
  197. package/dist/core/sandbox/policy.js.map +1 -1
  198. package/dist/core/types.d.ts +13 -0
  199. package/dist/core/types.js.map +1 -1
  200. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  201. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +1204 -939
  202. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +1319 -1054
  203. package/dist/core/usage/frontier-usage.d.ts +20 -2
  204. package/dist/core/usage/frontier-usage.js +75 -17
  205. package/dist/core/usage/frontier-usage.js.map +1 -1
  206. package/dist/core/verse/account-health.js +9 -3
  207. package/dist/core/verse/account-health.js.map +1 -1
  208. package/dist/core/verse/accounts.d.ts +45 -0
  209. package/dist/core/verse/accounts.js +246 -17
  210. package/dist/core/verse/accounts.js.map +1 -1
  211. package/dist/core/verse/activity-api.d.ts +5 -1
  212. package/dist/core/verse/activity-api.js +62 -14
  213. package/dist/core/verse/activity-api.js.map +1 -1
  214. package/dist/core/verse/apps-api.js +23 -11
  215. package/dist/core/verse/apps-api.js.map +1 -1
  216. package/dist/core/verse/apps.d.ts +11 -9
  217. package/dist/core/verse/apps.js +2 -2
  218. package/dist/core/verse/apps.js.map +1 -1
  219. package/dist/core/verse/authority-api.d.ts +17 -3
  220. package/dist/core/verse/authority-api.js +122 -7
  221. package/dist/core/verse/authority-api.js.map +1 -1
  222. package/dist/core/verse/autonomy-ladder.d.ts +172 -0
  223. package/dist/core/verse/autonomy-ladder.js +251 -0
  224. package/dist/core/verse/autonomy-ladder.js.map +1 -0
  225. package/dist/core/verse/context-fit.js +7 -5
  226. package/dist/core/verse/context-fit.js.map +1 -1
  227. package/dist/core/verse/control-api.d.ts +23 -1
  228. package/dist/core/verse/control-api.js +117 -10
  229. package/dist/core/verse/control-api.js.map +1 -1
  230. package/dist/core/verse/fleet-live-api.js +13 -5
  231. package/dist/core/verse/fleet-live-api.js.map +1 -1
  232. package/dist/core/verse/folder-io.d.ts +50 -0
  233. package/dist/core/verse/folder-io.js +142 -0
  234. package/dist/core/verse/folder-io.js.map +1 -0
  235. package/dist/core/verse/git-api.js +5 -4
  236. package/dist/core/verse/git-api.js.map +1 -1
  237. package/dist/core/verse/git-ops.d.ts +10 -1
  238. package/dist/core/verse/git-ops.js +18 -2
  239. package/dist/core/verse/git-ops.js.map +1 -1
  240. package/dist/core/verse/github-api.d.ts +1 -1
  241. package/dist/core/verse/github-api.js +5 -4
  242. package/dist/core/verse/github-api.js.map +1 -1
  243. package/dist/core/verse/github-repo.js +118 -14
  244. package/dist/core/verse/github-repo.js.map +1 -1
  245. package/dist/core/verse/leader-api.d.ts +5 -4
  246. package/dist/core/verse/leader-api.js +237 -10
  247. package/dist/core/verse/leader-api.js.map +1 -1
  248. package/dist/core/verse/local-models.d.ts +10 -0
  249. package/dist/core/verse/local-models.js +10 -1
  250. package/dist/core/verse/local-models.js.map +1 -1
  251. package/dist/core/verse/login-path.d.ts +73 -0
  252. package/dist/core/verse/login-path.js +123 -14
  253. package/dist/core/verse/login-path.js.map +1 -1
  254. package/dist/core/verse/mcp-control-api.js +4 -4
  255. package/dist/core/verse/mcp-control-api.js.map +1 -1
  256. package/dist/core/verse/mcp-scope.d.ts +22 -0
  257. package/dist/core/verse/mcp-scope.js +41 -1
  258. package/dist/core/verse/mcp-scope.js.map +1 -1
  259. package/dist/core/verse/mcp-seat-view.d.ts +10 -0
  260. package/dist/core/verse/mcp-seat-view.js +30 -4
  261. package/dist/core/verse/mcp-seat-view.js.map +1 -1
  262. package/dist/core/verse/overnight-api.js +20 -2
  263. package/dist/core/verse/overnight-api.js.map +1 -1
  264. package/dist/core/verse/path-guard.d.ts +24 -0
  265. package/dist/core/verse/path-guard.js +91 -22
  266. package/dist/core/verse/path-guard.js.map +1 -1
  267. package/dist/core/verse/preview-api.js +22 -0
  268. package/dist/core/verse/preview-api.js.map +1 -1
  269. package/dist/core/verse/projects.d.ts +21 -0
  270. package/dist/core/verse/projects.js +82 -0
  271. package/dist/core/verse/projects.js.map +1 -1
  272. package/dist/core/verse/seat-readiness.d.ts +25 -0
  273. package/dist/core/verse/seat-readiness.js +43 -6
  274. package/dist/core/verse/seat-readiness.js.map +1 -1
  275. package/dist/core/verse/session-controls-api.js +5 -3
  276. package/dist/core/verse/session-controls-api.js.map +1 -1
  277. package/dist/core/verse/session-handoff.d.ts +26 -0
  278. package/dist/core/verse/session-handoff.js +90 -12
  279. package/dist/core/verse/session-handoff.js.map +1 -1
  280. package/dist/core/verse/terminal-api.js +7 -4
  281. package/dist/core/verse/terminal-api.js.map +1 -1
  282. package/dist/core/verse/terminal.js +9 -5
  283. package/dist/core/verse/terminal.js.map +1 -1
  284. package/dist/core/verse/verse-api.d.ts +3 -1
  285. package/dist/core/verse/verse-api.js +87 -27
  286. package/dist/core/verse/verse-api.js.map +1 -1
  287. package/dist/core/verse/workspaces.d.ts +51 -0
  288. package/dist/core/verse/workspaces.js +177 -47
  289. package/dist/core/verse/workspaces.js.map +1 -1
  290. package/dist/core/vision/leader-apply.d.ts +40 -0
  291. package/dist/core/vision/leader-apply.js +101 -30
  292. package/dist/core/vision/leader-apply.js.map +1 -1
  293. package/dist/core/vision/leader-cadence.d.ts +114 -0
  294. package/dist/core/vision/leader-cadence.js +127 -0
  295. package/dist/core/vision/leader-cadence.js.map +1 -0
  296. package/dist/core/vision/leader-goal-evidence.d.ts +25 -0
  297. package/dist/core/vision/leader-goal-evidence.js +36 -0
  298. package/dist/core/vision/leader-goal-evidence.js.map +1 -0
  299. package/dist/core/vision/leader-health.d.ts +53 -0
  300. package/dist/core/vision/leader-health.js +92 -0
  301. package/dist/core/vision/leader-health.js.map +1 -0
  302. package/dist/core/vision/leader-operator.d.ts +176 -0
  303. package/dist/core/vision/leader-operator.js +355 -0
  304. package/dist/core/vision/leader-operator.js.map +1 -0
  305. package/dist/core/vision/leader-run-chain.d.ts +41 -0
  306. package/dist/core/vision/leader-run-chain.js +54 -0
  307. package/dist/core/vision/leader-run-chain.js.map +1 -0
  308. package/dist/core/vision/leader-seat-plan.d.ts +68 -0
  309. package/dist/core/vision/leader-seat-plan.js +93 -0
  310. package/dist/core/vision/leader-seat-plan.js.map +1 -0
  311. package/dist/core/vision/leader-seat.d.ts +71 -5
  312. package/dist/core/vision/leader-seat.js +235 -33
  313. package/dist/core/vision/leader-seat.js.map +1 -1
  314. package/dist/core/vision/leader-thread-types.d.ts +104 -0
  315. package/dist/core/vision/leader-thread-types.js +9 -0
  316. package/dist/core/vision/leader-thread-types.js.map +1 -0
  317. package/dist/core/vision/leader-thread.d.ts +138 -0
  318. package/dist/core/vision/leader-thread.js +926 -0
  319. package/dist/core/vision/leader-thread.js.map +1 -0
  320. package/dist/core/vision/leader-types.d.ts +75 -1
  321. package/dist/core/vision/leader.d.ts +88 -18
  322. package/dist/core/vision/leader.js +269 -69
  323. package/dist/core/vision/leader.js.map +1 -1
  324. package/dist/core/web/public/next/assets/{ActionMenu-B4-39f2S.js → ActionMenu-CIiX2X8w.js} +2 -2
  325. package/dist/core/web/public/next/assets/{ActionMenu-B4-39f2S.js.map → ActionMenu-CIiX2X8w.js.map} +1 -1
  326. package/dist/core/web/public/next/assets/Advanced-DHsysoIL.js +2 -0
  327. package/dist/core/web/public/next/assets/{Advanced-B-LqYXvd.js.map → Advanced-DHsysoIL.js.map} +1 -1
  328. package/dist/core/web/public/next/assets/App-CMeAocmW.js +7 -0
  329. package/dist/core/web/public/next/assets/{App-E2zCDRxm.js.map → App-CMeAocmW.js.map} +1 -1
  330. package/dist/core/web/public/next/assets/AppsSection-DISYnMnc.js +2 -0
  331. package/dist/core/web/public/next/assets/{AppsSection-8wXPPhZb.js.map → AppsSection-DISYnMnc.js.map} +1 -1
  332. package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js +2 -0
  333. package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js.map +1 -0
  334. package/dist/core/web/public/next/assets/AutonomyOffState-CEPSZToP.js +3 -0
  335. package/dist/core/web/public/next/assets/AutonomyOffState-CEPSZToP.js.map +1 -0
  336. package/dist/core/web/public/next/assets/AutonomyOffState-CmSSTHVe.css +1 -0
  337. package/dist/core/web/public/next/assets/AutonomySection-DWc3ciAD.js +2 -0
  338. package/dist/core/web/public/next/assets/{AutonomySection-B46igJKR.js.map → AutonomySection-DWc3ciAD.js.map} +1 -1
  339. package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js +2 -0
  340. package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js.map +1 -0
  341. package/dist/core/web/public/next/assets/{BranchBar-BRkrEQGs.js → BranchBar-BxhdiIpx.js} +2 -2
  342. package/dist/core/web/public/next/assets/{BranchBar-BRkrEQGs.js.map → BranchBar-BxhdiIpx.js.map} +1 -1
  343. package/dist/core/web/public/next/assets/BudgetControl-C-0KhjRS.js +2 -0
  344. package/dist/core/web/public/next/assets/BudgetControl-C-0KhjRS.js.map +1 -0
  345. package/dist/core/web/public/next/assets/{Button-BhO-WKPp.js → Button-D90dzI_o.js} +2 -2
  346. package/dist/core/web/public/next/assets/{Button-BhO-WKPp.js.map → Button-D90dzI_o.js.map} +1 -1
  347. package/dist/core/web/public/next/assets/{CapacityStrip-CkFz5vq2.js → CapacityStrip-qKDBC65C.js} +2 -2
  348. package/dist/core/web/public/next/assets/{CapacityStrip-CkFz5vq2.js.map → CapacityStrip-qKDBC65C.js.map} +1 -1
  349. package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js +2 -0
  350. package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js.map +1 -0
  351. package/dist/core/web/public/next/assets/ChartFrame-DyjmyV8N.css +1 -0
  352. package/dist/core/web/public/next/assets/ChatSection-DlT4QU6a.js +3 -0
  353. package/dist/core/web/public/next/assets/ChatSection-DlT4QU6a.js.map +1 -0
  354. package/dist/core/web/public/next/assets/{CloudBudgetForm-Bd91iStN.js → CloudBudgetForm-BrNun_Yu.js} +2 -2
  355. package/dist/core/web/public/next/assets/{CloudBudgetForm-Bd91iStN.js.map → CloudBudgetForm-BrNun_Yu.js.map} +1 -1
  356. package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js +2 -0
  357. package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js.map +1 -0
  358. package/dist/core/web/public/next/assets/CommandSection-B0xuU-yZ.css +1 -0
  359. package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js +3 -0
  360. package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js.map +1 -0
  361. package/dist/core/web/public/next/assets/{ConfirmDialog-Bv4hdK2T.js → ConfirmDialog-BR4nZQ2D.js} +2 -2
  362. package/dist/core/web/public/next/assets/{ConfirmDialog-Bv4hdK2T.js.map → ConfirmDialog-BR4nZQ2D.js.map} +1 -1
  363. package/dist/core/web/public/next/assets/{DeleteChatDialog-CH1Ix8Eh.js → DeleteChatDialog-BCfP12GH.js} +2 -2
  364. package/dist/core/web/public/next/assets/{DeleteChatDialog-CH1Ix8Eh.js.map → DeleteChatDialog-BCfP12GH.js.map} +1 -1
  365. package/dist/core/web/public/next/assets/{Dialog-BSsIFNqD.js → Dialog-D3msQlCj.js} +2 -2
  366. package/dist/core/web/public/next/assets/{Dialog-BSsIFNqD.js.map → Dialog-D3msQlCj.js.map} +1 -1
  367. package/dist/core/web/public/next/assets/{DiffPane-BpNuJmth.js → DiffPane-Ix6hvXlY.js} +2 -2
  368. package/dist/core/web/public/next/assets/{DiffPane-BpNuJmth.js.map → DiffPane-Ix6hvXlY.js.map} +1 -1
  369. package/dist/core/web/public/next/assets/{DiffViewer-CJarUvs0.js → DiffViewer-C4WKsCIe.js} +2 -2
  370. package/dist/core/web/public/next/assets/{DiffViewer-CJarUvs0.js.map → DiffViewer-C4WKsCIe.js.map} +1 -1
  371. package/dist/core/web/public/next/assets/DockHost-aWP7liri.js +2 -0
  372. package/dist/core/web/public/next/assets/{DockHost-DW9q0NdR.js.map → DockHost-aWP7liri.js.map} +1 -1
  373. package/dist/core/web/public/next/assets/{EmptyState-DPrd2aak.js → EmptyState-D2IRy3Cg.js} +2 -2
  374. package/dist/core/web/public/next/assets/{EmptyState-DPrd2aak.js.map → EmptyState-D2IRy3Cg.js.map} +1 -1
  375. package/dist/core/web/public/next/assets/{Epistemic-D7MxSmED.js → Epistemic-DMr18muX.js} +2 -2
  376. package/dist/core/web/public/next/assets/{Epistemic-D7MxSmED.js.map → Epistemic-DMr18muX.js.map} +1 -1
  377. package/dist/core/web/public/next/assets/EvidenceTimeline-DXmmz6Fi.js +2 -0
  378. package/dist/core/web/public/next/assets/EvidenceTimeline-DXmmz6Fi.js.map +1 -0
  379. package/dist/core/web/public/next/assets/EvidenceTimeline-PBDAiSuG.css +1 -0
  380. package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js +3 -0
  381. package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js.map +1 -0
  382. package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js +2 -0
  383. package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js.map +1 -0
  384. package/dist/core/web/public/next/assets/{GearTray-CIPtzeIx.js → GearTray-Dt-ee32-.js} +2 -2
  385. package/dist/core/web/public/next/assets/{GearTray-CIPtzeIx.js.map → GearTray-Dt-ee32-.js.map} +1 -1
  386. package/dist/core/web/public/next/assets/GrowthSection-P9EUfGeA.js +2 -0
  387. package/dist/core/web/public/next/assets/{GrowthSection-iiQg6wvK.js.map → GrowthSection-P9EUfGeA.js.map} +1 -1
  388. package/dist/core/web/public/next/assets/{HandoffDialog-DrQ6ofuy.js → HandoffDialog-CLJQLe7M.js} +2 -2
  389. package/dist/core/web/public/next/assets/{HandoffDialog-DrQ6ofuy.js.map → HandoffDialog-CLJQLe7M.js.map} +1 -1
  390. package/dist/core/web/public/next/assets/{Input-C0MQxEM6.js → Input-D_KRJA9V.js} +2 -2
  391. package/dist/core/web/public/next/assets/{Input-C0MQxEM6.js.map → Input-D_KRJA9V.js.map} +1 -1
  392. package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js +2 -0
  393. package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js.map +1 -0
  394. package/dist/core/web/public/next/assets/LeaderCard-DNsbLwY3.css +1 -0
  395. package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js +2 -0
  396. package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js.map +1 -0
  397. package/dist/core/web/public/next/assets/LeaderConversation-DPHUTq6W.css +1 -0
  398. package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js +2 -0
  399. package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js.map +1 -0
  400. package/dist/core/web/public/next/assets/McpSection-DGbRcyv8.js +2 -0
  401. package/dist/core/web/public/next/assets/{McpSection-BRuCcTjT.js.map → McpSection-DGbRcyv8.js.map} +1 -1
  402. package/dist/core/web/public/next/assets/{MessageMarkdown-bRvD5nSc.js → MessageMarkdown-DFvk06qG.js} +3 -3
  403. package/dist/core/web/public/next/assets/{MessageMarkdown-bRvD5nSc.js.map → MessageMarkdown-DFvk06qG.js.map} +1 -1
  404. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-FjjkPKA2.js → MessageMarkdownRenderer-BAv4oEUf.js} +2 -2
  405. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-FjjkPKA2.js.map → MessageMarkdownRenderer-BAv4oEUf.js.map} +1 -1
  406. package/dist/core/web/public/next/assets/{Meter-CFNLpwA-.js → Meter-CMj-VafN.js} +2 -2
  407. package/dist/core/web/public/next/assets/{Meter-CFNLpwA-.js.map → Meter-CMj-VafN.js.map} +1 -1
  408. package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js +3 -0
  409. package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js.map +1 -0
  410. package/dist/core/web/public/next/assets/{MutationTokenDialog-T7gv3a9r.js → MutationTokenDialog-DbnO8aYi.js} +2 -2
  411. package/dist/core/web/public/next/assets/{MutationTokenDialog-T7gv3a9r.js.map → MutationTokenDialog-DbnO8aYi.js.map} +1 -1
  412. package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js +3 -0
  413. package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js.map +1 -0
  414. package/dist/core/web/public/next/assets/NeedsYouList-CCsijdWt.js +2 -0
  415. package/dist/core/web/public/next/assets/{NeedsYouList-BgH8ezqf.js.map → NeedsYouList-CCsijdWt.js.map} +1 -1
  416. package/dist/core/web/public/next/assets/NeedsYouList-CH6Mq-E_.css +1 -0
  417. package/dist/core/web/public/next/assets/NewChatDialog-BlCHtOIr.js +3 -0
  418. package/dist/core/web/public/next/assets/{NewChatDialog-Db5Xjrk8.js.map → NewChatDialog-BlCHtOIr.js.map} +1 -1
  419. package/dist/core/web/public/next/assets/OnboardingFlow-Cy9BA9eR.js +3 -0
  420. package/dist/core/web/public/next/assets/OnboardingFlow-Cy9BA9eR.js.map +1 -0
  421. package/dist/core/web/public/next/assets/OnboardingGate-BXpNFoLt.js +3 -0
  422. package/dist/core/web/public/next/assets/{OnboardingGate-C4VXn7BJ.js.map → OnboardingGate-BXpNFoLt.js.map} +1 -1
  423. package/dist/core/web/public/next/assets/PreviewPane-COid5A0f.js +2 -0
  424. package/dist/core/web/public/next/assets/{PreviewPane-BPBbcROb.js.map → PreviewPane-COid5A0f.js.map} +1 -1
  425. package/dist/core/web/public/next/assets/{ProviderLogo-CT2cSfkg.js → ProviderLogo-Cq-CYIwT.js} +2 -2
  426. package/dist/core/web/public/next/assets/{ProviderLogo-CT2cSfkg.js.map → ProviderLogo-Cq-CYIwT.js.map} +1 -1
  427. package/dist/core/web/public/next/assets/{RailStatus-Vgl0GYtd.js → RailStatus-Co5UB6We.js} +2 -2
  428. package/dist/core/web/public/next/assets/{RailStatus-Vgl0GYtd.js.map → RailStatus-Co5UB6We.js.map} +1 -1
  429. package/dist/core/web/public/next/assets/{RefreshIndicator-CSyqpY_q.js → RefreshIndicator-DO9ibnSq.js} +2 -2
  430. package/dist/core/web/public/next/assets/{RefreshIndicator-CSyqpY_q.js.map → RefreshIndicator-DO9ibnSq.js.map} +1 -1
  431. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-Dr2WRgkq.js +7 -0
  432. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BX2nkdmZ.js.map → ResourcePoolConsoleApp-Dr2WRgkq.js.map} +1 -1
  433. package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js +3 -0
  434. package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js.map +1 -0
  435. package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js +2 -0
  436. package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js.map +1 -0
  437. package/dist/core/web/public/next/assets/ResourcesDrawer-DrGoO8KG.css +1 -0
  438. package/dist/core/web/public/next/assets/{RouteErrorBoundary-BaC7YVzR.js → RouteErrorBoundary-SkNhhUbt.js} +2 -2
  439. package/dist/core/web/public/next/assets/{RouteErrorBoundary-BaC7YVzR.js.map → RouteErrorBoundary-SkNhhUbt.js.map} +1 -1
  440. package/dist/core/web/public/next/assets/{RunInCloudAction-D5PDHJPE.js → RunInCloudAction-BXPlZwJQ.js} +2 -2
  441. package/dist/core/web/public/next/assets/{RunInCloudAction-D5PDHJPE.js.map → RunInCloudAction-BXPlZwJQ.js.map} +1 -1
  442. package/dist/core/web/public/next/assets/{SeatSelector-Cg75LInq.js → SeatSelector-J5R3zDkB.js} +3 -3
  443. package/dist/core/web/public/next/assets/{SeatSelector-Cg75LInq.js.map → SeatSelector-J5R3zDkB.js.map} +1 -1
  444. package/dist/core/web/public/next/assets/{Segmented-CametjLt.js → Segmented-CGh_-tBb.js} +2 -2
  445. package/dist/core/web/public/next/assets/{Segmented-CametjLt.js.map → Segmented-CGh_-tBb.js.map} +1 -1
  446. package/dist/core/web/public/next/assets/{Select-De52fghU.js → Select-CWnmUzs3.js} +2 -2
  447. package/dist/core/web/public/next/assets/{Select-De52fghU.js.map → Select-CWnmUzs3.js.map} +1 -1
  448. package/dist/core/web/public/next/assets/{SessionGate-CzlcNq3O.js → SessionGate-sp4KsnUo.js} +2 -2
  449. package/dist/core/web/public/next/assets/{SessionGate-CzlcNq3O.js.map → SessionGate-sp4KsnUo.js.map} +1 -1
  450. package/dist/core/web/public/next/assets/{SessionInsightChip-Bk_Owa7u.js → SessionInsightChip-DLFAzdbi.js} +2 -2
  451. package/dist/core/web/public/next/assets/{SessionInsightChip-Bk_Owa7u.js.map → SessionInsightChip-DLFAzdbi.js.map} +1 -1
  452. package/dist/core/web/public/next/assets/{SessionSearch-C6C8DHN8.js → SessionSearch-DbFjwR1h.js} +2 -2
  453. package/dist/core/web/public/next/assets/{SessionSearch-C6C8DHN8.js.map → SessionSearch-DbFjwR1h.js.map} +1 -1
  454. package/dist/core/web/public/next/assets/{SettingsSection-mI9wQYZg.js → SettingsSection-Ch23msJ5.js} +2 -2
  455. package/dist/core/web/public/next/assets/SettingsSection-Ch23msJ5.js.map +1 -0
  456. package/dist/core/web/public/next/assets/SetupChecklist-Bd76MBAR.js +2 -0
  457. package/dist/core/web/public/next/assets/SetupChecklist-Bd76MBAR.js.map +1 -0
  458. package/dist/core/web/public/next/assets/SetupChecklist-BhZpFLsj.css +1 -0
  459. package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js +3 -0
  460. package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js.map +1 -0
  461. package/dist/core/web/public/next/assets/{Sheet-CJhK9Dqv.js → Sheet-BZ2AG4Eo.js} +2 -2
  462. package/dist/core/web/public/next/assets/{Sheet-CJhK9Dqv.js.map → Sheet-BZ2AG4Eo.js.map} +1 -1
  463. package/dist/core/web/public/next/assets/{ShortcutsOverlay-DDW-i9Fc.js → ShortcutsOverlay-C8n8y3zf.js} +2 -2
  464. package/dist/core/web/public/next/assets/{ShortcutsOverlay-DDW-i9Fc.js.map → ShortcutsOverlay-C8n8y3zf.js.map} +1 -1
  465. package/dist/core/web/public/next/assets/Sidebar-DN--cPYN.js +3 -0
  466. package/dist/core/web/public/next/assets/Sidebar-DN--cPYN.js.map +1 -0
  467. package/dist/core/web/public/next/assets/{Slider-Bwd9HfXl.js → Slider-KVoJLDD6.js} +2 -2
  468. package/dist/core/web/public/next/assets/{Slider-Bwd9HfXl.js.map → Slider-KVoJLDD6.js.map} +1 -1
  469. package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js +2 -0
  470. package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js.map +1 -0
  471. package/dist/core/web/public/next/assets/StatTile-CNCqDoPO.css +1 -0
  472. package/dist/core/web/public/next/assets/{StatusBadge-DHKRtttH.js → StatusBadge-CXsYqmdU.js} +2 -2
  473. package/dist/core/web/public/next/assets/{StatusBadge-DHKRtttH.js.map → StatusBadge-CXsYqmdU.js.map} +1 -1
  474. package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js +2 -0
  475. package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js.map +1 -0
  476. package/dist/core/web/public/next/assets/{Surface-D--LXgQm.js → Surface-BfDmQcKe.js} +2 -2
  477. package/dist/core/web/public/next/assets/{Surface-D--LXgQm.js.map → Surface-BfDmQcKe.js.map} +1 -1
  478. package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js +2 -0
  479. package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js.map +1 -0
  480. package/dist/core/web/public/next/assets/Swimlane-Bf4Rjoy9.css +1 -0
  481. package/dist/core/web/public/next/assets/{Switch-PMixU6b0.js → Switch-9NtO_6Lj.js} +2 -2
  482. package/dist/core/web/public/next/assets/{Switch-PMixU6b0.js.map → Switch-9NtO_6Lj.js.map} +1 -1
  483. package/dist/core/web/public/next/assets/{Tag-fordBsrJ.js → Tag-DscCRFcN.js} +2 -2
  484. package/dist/core/web/public/next/assets/{Tag-fordBsrJ.js.map → Tag-DscCRFcN.js.map} +1 -1
  485. package/dist/core/web/public/next/assets/{TerminalPane-BSnGdUuF.js → TerminalPane-B668-DJW.js} +5 -5
  486. package/dist/core/web/public/next/assets/{TerminalPane-BSnGdUuF.js.map → TerminalPane-B668-DJW.js.map} +1 -1
  487. package/dist/core/web/public/next/assets/UniverseConsoleApp-BUV_brY7.js +2 -0
  488. package/dist/core/web/public/next/assets/{UniverseConsoleApp-DtXFhAhw.js.map → UniverseConsoleApp-BUV_brY7.js.map} +1 -1
  489. package/dist/core/web/public/next/assets/{UniverseView-sWm3pnTW.js → UniverseView-DG70zH0W.js} +4 -4
  490. package/dist/core/web/public/next/assets/{UniverseView-sWm3pnTW.js.map → UniverseView-DG70zH0W.js.map} +1 -1
  491. package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js +3 -0
  492. package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js.map +1 -0
  493. package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js +3 -0
  494. package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js.map +1 -0
  495. package/dist/core/web/public/next/assets/Workspace-D1nP9BhD.js +10 -0
  496. package/dist/core/web/public/next/assets/{Workspace-BQSZFSeO.js.map → Workspace-D1nP9BhD.js.map} +1 -1
  497. package/dist/core/web/public/next/assets/actions-CY-PjpGc.js +2 -0
  498. package/dist/core/web/public/next/assets/{actions-Ci6I4C0l.js.map → actions-CY-PjpGc.js.map} +1 -1
  499. package/dist/core/web/public/next/assets/actions-DkWhhWIg.css +1 -0
  500. package/dist/core/web/public/next/assets/{apps-model-DlwnfqwJ.js → apps-model-Du02KhAf.js} +2 -2
  501. package/dist/core/web/public/next/assets/{apps-model-DlwnfqwJ.js.map → apps-model-Du02KhAf.js.map} +1 -1
  502. package/dist/core/web/public/next/assets/{authority-model-BFuPezSo.js → authority-model-79SeuKlJ.js} +2 -2
  503. package/dist/core/web/public/next/assets/{authority-model-BFuPezSo.js.map → authority-model-79SeuKlJ.js.map} +1 -1
  504. package/dist/core/web/public/next/assets/autonomy-ladder-BGWmZzP7.css +1 -0
  505. package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js +2 -0
  506. package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js.map +1 -0
  507. package/dist/core/web/public/next/assets/budget-queries-D8QV5XtH.js +2 -0
  508. package/dist/core/web/public/next/assets/{budget-queries-DsAjH8ac.js.map → budget-queries-D8QV5XtH.js.map} +1 -1
  509. package/dist/core/web/public/next/assets/{capacity-strip-model-Dn1cNOhz.js → capacity-strip-model-BwZ1ZbkU.js} +2 -2
  510. package/dist/core/web/public/next/assets/{capacity-strip-model-Dn1cNOhz.js.map → capacity-strip-model-BwZ1ZbkU.js.map} +1 -1
  511. package/dist/core/web/public/next/assets/charts-BZ50mZD_.js +2 -0
  512. package/dist/core/web/public/next/assets/charts-BZ50mZD_.js.map +1 -0
  513. package/dist/core/web/public/next/assets/charts-ClCB18la.css +1 -0
  514. package/dist/core/web/public/next/assets/cloud-model-BDivRMqv.js +2 -0
  515. package/dist/core/web/public/next/assets/{cloud-model-CX407gPY.js.map → cloud-model-BDivRMqv.js.map} +1 -1
  516. package/dist/core/web/public/next/assets/{cloud-queries-QAhpExlz.js → cloud-queries-BPQQ5_pJ.js} +2 -2
  517. package/dist/core/web/public/next/assets/{cloud-queries-QAhpExlz.js.map → cloud-queries-BPQQ5_pJ.js.map} +1 -1
  518. package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js → colors-DvK0wMHH.js} +2 -2
  519. package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js.map → colors-DvK0wMHH.js.map} +1 -1
  520. package/dist/core/web/public/next/assets/{command-catalog-CF0cQQac.js → command-catalog-BIntSa9l.js} +2 -2
  521. package/dist/core/web/public/next/assets/command-catalog-BIntSa9l.js.map +1 -0
  522. package/dist/core/web/public/next/assets/{context-model-Co4wh3SM.js → context-model-Br8t9jgG.js} +2 -2
  523. package/dist/core/web/public/next/assets/{context-model-Co4wh3SM.js.map → context-model-Br8t9jgG.js.map} +1 -1
  524. package/dist/core/web/public/next/assets/{context-model-DV1zCfAm.js → context-model-CokrgEUq.js} +3 -3
  525. package/dist/core/web/public/next/assets/{context-model-DV1zCfAm.js.map → context-model-CokrgEUq.js.map} +1 -1
  526. package/dist/core/web/public/next/assets/context-queries-eL3caKVG.js +2 -0
  527. package/dist/core/web/public/next/assets/{context-queries-CktFQqSS.js.map → context-queries-eL3caKVG.js.map} +1 -1
  528. package/dist/core/web/public/next/assets/{control-queries-DAvlh_YM.js → control-queries-B9K-wmcB.js} +2 -2
  529. package/dist/core/web/public/next/assets/{control-queries-DAvlh_YM.js.map → control-queries-B9K-wmcB.js.map} +1 -1
  530. package/dist/core/web/public/next/assets/copy-setup-XMgCC5f8.js +2 -0
  531. package/dist/core/web/public/next/assets/copy-setup-XMgCC5f8.js.map +1 -0
  532. package/dist/core/web/public/next/assets/{dock-icons-BFuBbqJl.js → dock-icons-BJ6ZqB2t.js} +2 -2
  533. package/dist/core/web/public/next/assets/{dock-icons-BFuBbqJl.js.map → dock-icons-BJ6ZqB2t.js.map} +1 -1
  534. package/dist/core/web/public/next/assets/{fleet-model-Dfd5JyLR.js → fleet-model-BvDR3gjp.js} +2 -2
  535. package/dist/core/web/public/next/assets/{fleet-model-Dfd5JyLR.js.map → fleet-model-BvDR3gjp.js.map} +1 -1
  536. package/dist/core/web/public/next/assets/{fleet-queries-RtMTd5rR.js → fleet-queries-W2UFVMZJ.js} +2 -2
  537. package/dist/core/web/public/next/assets/{fleet-queries-RtMTd5rR.js.map → fleet-queries-W2UFVMZJ.js.map} +1 -1
  538. package/dist/core/web/public/next/assets/{focus-trap-BdrbWfC4.js → focus-trap-CtI1SlMX.js} +2 -2
  539. package/dist/core/web/public/next/assets/{focus-trap-BdrbWfC4.js.map → focus-trap-CtI1SlMX.js.map} +1 -1
  540. package/dist/core/web/public/next/assets/format-CH4g_sl1.js +2 -0
  541. package/dist/core/web/public/next/assets/format-CH4g_sl1.js.map +1 -0
  542. package/dist/core/web/public/next/assets/{format-DKrNjdwD.js → format-D7nBg2bn.js} +2 -2
  543. package/dist/core/web/public/next/assets/{format-DKrNjdwD.js.map → format-D7nBg2bn.js.map} +1 -1
  544. package/dist/core/web/public/next/assets/{git-model-_BnI_Ogh.js → git-model-Dnkd1TnK.js} +2 -2
  545. package/dist/core/web/public/next/assets/{git-model-_BnI_Ogh.js.map → git-model-Dnkd1TnK.js.map} +1 -1
  546. package/dist/core/web/public/next/assets/global-CMNW_dqn.js +2 -0
  547. package/dist/core/web/public/next/assets/{global-CNNGMril.js.map → global-CMNW_dqn.js.map} +1 -1
  548. package/dist/core/web/public/next/assets/guarded-runners-YeAc9wLQ.js +2 -0
  549. package/dist/core/web/public/next/assets/{guarded-runners-DPh2d32e.js.map → guarded-runners-YeAc9wLQ.js.map} +1 -1
  550. package/dist/core/web/public/next/assets/{icons-0haWy6nh.js → icons-D1sYbCTQ.js} +2 -2
  551. package/dist/core/web/public/next/assets/{icons-0haWy6nh.js.map → icons-D1sYbCTQ.js.map} +1 -1
  552. package/dist/core/web/public/next/assets/{index-QesfXBsb.js → index-DZ-UQ7v8.js} +3 -3
  553. package/dist/core/web/public/next/assets/{index-QesfXBsb.js.map → index-DZ-UQ7v8.js.map} +1 -1
  554. package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js +2 -0
  555. package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js.map +1 -0
  556. package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js +2 -0
  557. package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js.map +1 -0
  558. package/dist/core/web/public/next/assets/{live-model-De-q0ZFK.js → live-model-D_32RAOR.js} +2 -2
  559. package/dist/core/web/public/next/assets/live-model-D_32RAOR.js.map +1 -0
  560. package/dist/core/web/public/next/assets/{mind.module-BrK2nFOL.js → mind.module-7hA92hRg.js} +2 -2
  561. package/dist/core/web/public/next/assets/{mind.module-BrK2nFOL.js.map → mind.module-7hA92hRg.js.map} +1 -1
  562. package/dist/core/web/public/next/assets/mutations-DQPbFdRJ.js +2 -0
  563. package/dist/core/web/public/next/assets/{mutations-DTCtKCn_.js.map → mutations-DQPbFdRJ.js.map} +1 -1
  564. package/dist/core/web/public/next/assets/{nav-KmGX0CVz.js → nav-0dOYe2rJ.js} +2 -2
  565. package/dist/core/web/public/next/assets/{nav-KmGX0CVz.js.map → nav-0dOYe2rJ.js.map} +1 -1
  566. package/dist/core/web/public/next/assets/{overnight-queries-mlO0xzsr.js → overnight-queries-C4wOnFtE.js} +2 -2
  567. package/dist/core/web/public/next/assets/{overnight-queries-mlO0xzsr.js.map → overnight-queries-C4wOnFtE.js.map} +1 -1
  568. package/dist/core/web/public/next/assets/primitives-2A5Eq8FQ.js +1 -0
  569. package/dist/core/web/public/next/assets/{queries-CyBE8nsW.js → queries-BTXWdZzU.js} +2 -2
  570. package/dist/core/web/public/next/assets/{queries-CyBE8nsW.js.map → queries-BTXWdZzU.js.map} +1 -1
  571. package/dist/core/web/public/next/assets/{reasoning-pref-CaoA4_Vl.js → reasoning-pref-Ca6lN6x_.js} +2 -2
  572. package/dist/core/web/public/next/assets/{reasoning-pref-CaoA4_Vl.js.map → reasoning-pref-Ca6lN6x_.js.map} +1 -1
  573. package/dist/core/web/public/next/assets/{reveal-anchor-BP1VqnPU.js → reveal-anchor-DfNLgK_I.js} +2 -2
  574. package/dist/core/web/public/next/assets/{reveal-anchor-BP1VqnPU.js.map → reveal-anchor-DfNLgK_I.js.map} +1 -1
  575. package/dist/core/web/public/next/assets/seat-subscription-C5uPHBsN.js +2 -0
  576. package/dist/core/web/public/next/assets/{seat-subscription-C5Tvr0WQ.js.map → seat-subscription-C5uPHBsN.js.map} +1 -1
  577. package/dist/core/web/public/next/assets/{sidebar-model-B5Qk95k_.js → sidebar-model-CLCdqwkR.js} +2 -2
  578. package/dist/core/web/public/next/assets/{sidebar-model-B5Qk95k_.js.map → sidebar-model-CLCdqwkR.js.map} +1 -1
  579. package/dist/core/web/public/next/assets/{slots-DHKQDoE6.js → slots-C-qBeu-8.js} +3 -3
  580. package/dist/core/web/public/next/assets/{slots-DHKQDoE6.js.map → slots-C-qBeu-8.js.map} +1 -1
  581. package/dist/core/web/public/next/assets/{surface-data-CchClvHo.js → surface-data-Dj71tdD-.js} +2 -2
  582. package/dist/core/web/public/next/assets/{surface-data-CchClvHo.js.map → surface-data-Dj71tdD-.js.map} +1 -1
  583. package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js +2 -0
  584. package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js.map +1 -0
  585. package/dist/core/web/public/next/assets/{tasks-model-D6WFVULI.js → tasks-model-O8yR5YXp.js} +2 -2
  586. package/dist/core/web/public/next/assets/{tasks-model-D6WFVULI.js.map → tasks-model-O8yR5YXp.js.map} +1 -1
  587. package/dist/core/web/public/next/assets/{terminal-icons-BvCvuXk2.js → terminal-icons-CoRZq9iO.js} +2 -2
  588. package/dist/core/web/public/next/assets/{terminal-icons-BvCvuXk2.js.map → terminal-icons-CoRZq9iO.js.map} +1 -1
  589. package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js +2 -0
  590. package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js.map +1 -0
  591. package/dist/core/web/public/next/assets/types-IYKrYLku.js +2 -0
  592. package/dist/core/web/public/next/assets/types-IYKrYLku.js.map +1 -0
  593. package/dist/core/web/public/next/assets/{usage-queries-D1SU1t7r.js → usage-queries-AdjEyEtn.js} +2 -2
  594. package/dist/core/web/public/next/assets/{usage-queries-D1SU1t7r.js.map → usage-queries-AdjEyEtn.js.map} +1 -1
  595. package/dist/core/web/public/next/assets/{use-guarded-action-BZmBv7CJ.js → use-guarded-action-CuuMHeDX.js} +2 -2
  596. package/dist/core/web/public/next/assets/{use-guarded-action-BZmBv7CJ.js.map → use-guarded-action-CuuMHeDX.js.map} +1 -1
  597. package/dist/core/web/public/next/assets/{use-ticker-CkJ4-0wU.js → use-ticker-BBcp02SZ.js} +2 -2
  598. package/dist/core/web/public/next/assets/{use-ticker-CkJ4-0wU.js.map → use-ticker-BBcp02SZ.js.map} +1 -1
  599. package/dist/core/web/public/next/assets/{use-token-gate-CYcfk_GS.js → use-token-gate-CbXVYQYI.js} +2 -2
  600. package/dist/core/web/public/next/assets/{use-token-gate-CYcfk_GS.js.map → use-token-gate-CbXVYQYI.js.map} +1 -1
  601. package/dist/core/web/public/next/assets/{useOnboarding-CujRS6PK.js → useOnboarding-C_Fpe_sH.js} +2 -2
  602. package/dist/core/web/public/next/assets/{useOnboarding-CujRS6PK.js.map → useOnboarding-C_Fpe_sH.js.map} +1 -1
  603. package/dist/core/web/public/next/assets/{useSeatsRefresh-BEaQdkZs.js → useSeatsRefresh-Co1CnxLc.js} +2 -2
  604. package/dist/core/web/public/next/assets/{useSeatsRefresh-BEaQdkZs.js.map → useSeatsRefresh-Co1CnxLc.js.map} +1 -1
  605. package/dist/core/web/public/next/assets/{useVerseTranscript-BQ0J6Xhx.js → useVerseTranscript-DgbigUlV.js} +2 -2
  606. package/dist/core/web/public/next/assets/{useVerseTranscript-BQ0J6Xhx.js.map → useVerseTranscript-DgbigUlV.js.map} +1 -1
  607. package/dist/core/web/public/next/assets/{verse-icons-DndgEgKS.js → verse-icons-S56hIiXS.js} +2 -2
  608. package/dist/core/web/public/next/assets/{verse-icons-DndgEgKS.js.map → verse-icons-S56hIiXS.js.map} +1 -1
  609. package/dist/core/web/public/next/assets/verse-model-DAVevkNe.js +2 -0
  610. package/dist/core/web/public/next/assets/{verse-model-MMySehjj.js.map → verse-model-DAVevkNe.js.map} +1 -1
  611. package/dist/core/web/public/next/assets/{warmup-CNEH_-be.js → warmup-B_RAtNZ_.js} +3 -3
  612. package/dist/core/web/public/next/assets/{warmup-CNEH_-be.js.map → warmup-B_RAtNZ_.js.map} +1 -1
  613. package/dist/core/web/public/next/assets/why-seat-model-M_r0wX3b.js +2 -0
  614. package/dist/core/web/public/next/assets/why-seat-model-M_r0wX3b.js.map +1 -0
  615. package/dist/core/web/public/next/assets/{workspace-model-Dukb2wwv.js → workspace-model-dji5-Al3.js} +2 -2
  616. package/dist/core/web/public/next/assets/{workspace-model-Dukb2wwv.js.map → workspace-model-dji5-Al3.js.map} +1 -1
  617. package/dist/core/web/public/next/index.html +1 -1
  618. package/dist/core/web/read-projection-worker.js +2 -1
  619. package/dist/core/web/read-projection-worker.js.map +1 -1
  620. package/dist/core/web/read-projections.d.ts +3 -0
  621. package/dist/core/web/read-projections.js +2 -2
  622. package/dist/core/web/read-projections.js.map +1 -1
  623. package/dist/core/web/visibility.js +3 -4
  624. package/dist/core/web/visibility.js.map +1 -1
  625. package/dist/release-dependency-inventory.json +1 -1
  626. package/docs/AUTONOMY-GAP.md +1 -1
  627. package/package.json +3 -2
  628. package/dist/core/web/public/next/assets/Advanced-B-LqYXvd.js +0 -2
  629. package/dist/core/web/public/next/assets/App-E2zCDRxm.js +0 -7
  630. package/dist/core/web/public/next/assets/AppsSection-8wXPPhZb.js +0 -2
  631. package/dist/core/web/public/next/assets/AreaTrend-BFimExYn.js +0 -2
  632. package/dist/core/web/public/next/assets/AreaTrend-BFimExYn.js.map +0 -1
  633. package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js +0 -2
  634. package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js.map +0 -1
  635. package/dist/core/web/public/next/assets/AutonomyOffState-DmbE71vI.css +0 -1
  636. package/dist/core/web/public/next/assets/AutonomySection-B46igJKR.js +0 -2
  637. package/dist/core/web/public/next/assets/BudgetControl-T_RjPrw9.js +0 -2
  638. package/dist/core/web/public/next/assets/BudgetControl-T_RjPrw9.js.map +0 -1
  639. package/dist/core/web/public/next/assets/ChartFrame-BVuBe6RP.css +0 -1
  640. package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js +0 -2
  641. package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js.map +0 -1
  642. package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js +0 -3
  643. package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js.map +0 -1
  644. package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js +0 -2
  645. package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js.map +0 -1
  646. package/dist/core/web/public/next/assets/CommandSection-CvAVd1w4.css +0 -1
  647. package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js +0 -2
  648. package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js.map +0 -1
  649. package/dist/core/web/public/next/assets/DockHost-DW9q0NdR.js +0 -2
  650. package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js +0 -3
  651. package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js.map +0 -1
  652. package/dist/core/web/public/next/assets/Funnel-BeNQZWv2.js +0 -2
  653. package/dist/core/web/public/next/assets/Funnel-BeNQZWv2.js.map +0 -1
  654. package/dist/core/web/public/next/assets/GrowthSection-iiQg6wvK.js +0 -2
  655. package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js +0 -2
  656. package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js.map +0 -1
  657. package/dist/core/web/public/next/assets/MatrixHeatmap-DZvZeWXL.js +0 -2
  658. package/dist/core/web/public/next/assets/MatrixHeatmap-DZvZeWXL.js.map +0 -1
  659. package/dist/core/web/public/next/assets/McpSection-BRuCcTjT.js +0 -2
  660. package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js +0 -2
  661. package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js.map +0 -1
  662. package/dist/core/web/public/next/assets/NeedsYouDrawer-lYN4G_aM.js +0 -2
  663. package/dist/core/web/public/next/assets/NeedsYouDrawer-lYN4G_aM.js.map +0 -1
  664. package/dist/core/web/public/next/assets/NeedsYouList-BgH8ezqf.js +0 -2
  665. package/dist/core/web/public/next/assets/NeedsYouList-CruOt4JT.css +0 -1
  666. package/dist/core/web/public/next/assets/NewChatDialog-Db5Xjrk8.js +0 -3
  667. package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js +0 -2
  668. package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js.map +0 -1
  669. package/dist/core/web/public/next/assets/OnboardingGate-C4VXn7BJ.js +0 -3
  670. package/dist/core/web/public/next/assets/PreviewPane-BPBbcROb.js +0 -2
  671. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-BX2nkdmZ.js +0 -7
  672. package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js +0 -3
  673. package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js.map +0 -1
  674. package/dist/core/web/public/next/assets/ResourcesDrawer-BCFJ2Uq8.css +0 -1
  675. package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js +0 -2
  676. package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js.map +0 -1
  677. package/dist/core/web/public/next/assets/SettingsSection-mI9wQYZg.js.map +0 -1
  678. package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js +0 -3
  679. package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js.map +0 -1
  680. package/dist/core/web/public/next/assets/StatTile-BuLMsJMx.css +0 -1
  681. package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js +0 -2
  682. package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js.map +0 -1
  683. package/dist/core/web/public/next/assets/StepBand-DQykLkk_.js +0 -2
  684. package/dist/core/web/public/next/assets/StepBand-DQykLkk_.js.map +0 -1
  685. package/dist/core/web/public/next/assets/Swimlane-BzH6OCee.js +0 -2
  686. package/dist/core/web/public/next/assets/Swimlane-BzH6OCee.js.map +0 -1
  687. package/dist/core/web/public/next/assets/Swimlane-o6_Zsrnr.css +0 -1
  688. package/dist/core/web/public/next/assets/UniverseConsoleApp-DtXFhAhw.js +0 -2
  689. package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js +0 -3
  690. package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js.map +0 -1
  691. package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js +0 -3
  692. package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js.map +0 -1
  693. package/dist/core/web/public/next/assets/Workspace-BQSZFSeO.js +0 -10
  694. package/dist/core/web/public/next/assets/actions-BmIf9avl.css +0 -1
  695. package/dist/core/web/public/next/assets/actions-Ci6I4C0l.js +0 -2
  696. package/dist/core/web/public/next/assets/budget-queries-DsAjH8ac.js +0 -2
  697. package/dist/core/web/public/next/assets/charts-C_xJbJiw.js +0 -2
  698. package/dist/core/web/public/next/assets/charts-C_xJbJiw.js.map +0 -1
  699. package/dist/core/web/public/next/assets/charts-DhKTrQLw.css +0 -1
  700. package/dist/core/web/public/next/assets/cloud-model-CX407gPY.js +0 -2
  701. package/dist/core/web/public/next/assets/command-catalog-CF0cQQac.js.map +0 -1
  702. package/dist/core/web/public/next/assets/context-queries-CktFQqSS.js +0 -2
  703. package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js +0 -2
  704. package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js.map +0 -1
  705. package/dist/core/web/public/next/assets/format-Dk4Fmxax.js +0 -2
  706. package/dist/core/web/public/next/assets/format-Dk4Fmxax.js.map +0 -1
  707. package/dist/core/web/public/next/assets/global-CNNGMril.js +0 -2
  708. package/dist/core/web/public/next/assets/guarded-runners-DPh2d32e.js +0 -2
  709. package/dist/core/web/public/next/assets/live-model-De-q0ZFK.js.map +0 -1
  710. package/dist/core/web/public/next/assets/mutations-DTCtKCn_.js +0 -2
  711. package/dist/core/web/public/next/assets/primitives-D0Fb3TtS.js +0 -1
  712. package/dist/core/web/public/next/assets/seat-subscription-C5Tvr0WQ.js +0 -2
  713. package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js +0 -2
  714. package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js.map +0 -1
  715. package/dist/core/web/public/next/assets/types-D5XOdyw8.js +0 -2
  716. package/dist/core/web/public/next/assets/types-D5XOdyw8.js.map +0 -1
  717. package/dist/core/web/public/next/assets/verse-model-MMySehjj.js +0 -2
  718. package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js +0 -2
  719. package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js.map +0 -1
@@ -0,0 +1,274 @@
1
+ /**
2
+ * The host-verified required check `ashlr/verify` — 3.13.
3
+ *
4
+ * WHY: G7 needs GitHub to prove a fleet PR green. A repo without CI (GitHub
5
+ * Actions off, e.g. ashlrai/ashlr-hub) reports zero check runs, so every PR
6
+ * went to the owner lane (`no-required-checks` / `no-checks`); and on a
7
+ * local-enforcement repo "every check green" accepted ANY green check — a
8
+ * Vercel preview deploy alone passed G7. The fleet already runs the real
9
+ * suite on the exact tree in its mirror (G3, verifyAndPersistProposal); this
10
+ * module turns that result into a GitHub check run the ashlr-fleet App posts
11
+ * on the PR head, so rulesets can REQUIRE it (pinned to the App's id) and G7
12
+ * can demand it on local-enforcement repos.
13
+ *
14
+ * The one rule: `success` is posted ONLY when G3 passed AND the PR head
15
+ * commit GitHub holds has exactly the verified tree on exactly the verified
16
+ * base (its only parent). Anything else — G3 not passed, no command ran, a
17
+ * head whose tree or parent differs — is `failure`. Nothing here ever posts
18
+ * `neutral` or `skipped` (G7 counts those as green).
19
+ *
20
+ * Idempotent per head SHA: a commit id fixes its tree and parents forever, so
21
+ * the decision is a pure function of (head SHA, verified binding). The memo
22
+ * (`FleetPrMemo.verifyCheck`, in the agent-unreadable fleet merge state)
23
+ * remembers the run posted for a head; an unchanged decision makes no GitHub
24
+ * call, a changed one PATCHes that run, a new head gets a new run.
25
+ *
26
+ * The App id G7 trusts comes from GitHub's own answer to the App's
27
+ * authenticated create call (`app.id` on the returned run) — an installation
28
+ * token can only create runs as its own App, so no other App (a Vercel
29
+ * integration, an agent's token) can ever be mistaken for the fleet's.
30
+ *
31
+ * Needs the App permission `checks: write`. A 403 is reported as `permission`
32
+ * (not retryable); `ashlr authority setup` detects the missing permission and
33
+ * prints where to grant it.
34
+ */
35
+ import { createHash } from 'node:crypto';
36
+ import { scrubSecrets } from '../util/scrub.js';
37
+ /** The check-run name rulesets require and G7 demands on local-enforcement repos. */
38
+ export const ASHLR_VERIFY_CHECK_NAME = 'ashlr/verify';
39
+ /** Where to grant the missing permission (the exact per-App URL is printed by `ashlr authority setup`). */
40
+ export const VERIFY_CHECK_PERMISSION_HINT = "the ashlr-fleet GitHub App needs the permission 'Checks: Read and write' to post ashlr/verify — " +
41
+ 'grant it in the App settings (Permissions & events), accept the new permission on each installation, ' +
42
+ 'then run `ashlr authority setup` (it prints the exact links)';
43
+ const SHA_RE = /^[0-9a-f]{40}$/;
44
+ const NAME_WITH_OWNER_RE = /^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})\/[A-Za-z0-9._-]{1,100}$/;
45
+ const MAX_COMMANDS = 20;
46
+ const MAX_CMD_CHARS = 200;
47
+ function sha256(text) {
48
+ return createHash('sha256').update(text, 'utf8').digest('hex');
49
+ }
50
+ function obj(value) {
51
+ return value !== null && typeof value === 'object' && !Array.isArray(value) ? value : null;
52
+ }
53
+ function short(value) {
54
+ return value ? value.slice(0, 12) : 'none';
55
+ }
56
+ /** Bounded, secret-scrubbed commands (they come from the base tree's config, never from the diff). */
57
+ export function normalizeVerifyCommands(commands) {
58
+ if (!Array.isArray(commands))
59
+ return [];
60
+ const out = [];
61
+ for (const command of commands.slice(0, MAX_COMMANDS)) {
62
+ const kind = typeof command?.kind === 'string' ? command.kind.replace(/[^a-z0-9_-]/gi, '').slice(0, 32) : '';
63
+ if (!kind)
64
+ continue;
65
+ const cmd = Array.isArray(command.cmd)
66
+ ? command.cmd.filter((part) => typeof part === 'string').slice(0, 32)
67
+ .map((part) => scrubSecrets(part).replace(/[\r\n`]/g, ' ').slice(0, MAX_CMD_CHARS))
68
+ : [];
69
+ out.push({ kind, cmd });
70
+ }
71
+ return out;
72
+ }
73
+ /** Digest of everything the decision depends on besides the (immutable) head commit itself. */
74
+ export function verifyCheckInputsDigest(headSha, verified) {
75
+ return sha256(`ashlr:verify-check:v1\0${JSON.stringify({
76
+ headSha,
77
+ g3: verified.g3 ? { verdict: verified.g3.verdict, code: verified.g3.code } : null,
78
+ verifyDigest: verified.verifyDigest,
79
+ baseSha: verified.baseSha,
80
+ treeSha: verified.treeSha,
81
+ commands: verified.commands.map((c) => ({ kind: c.kind, cmd: [...c.cmd] })),
82
+ })}`);
83
+ }
84
+ /**
85
+ * PURE: success only for G3 pass + at least one command + the head being the
86
+ * verified tree on the verified base as its only parent. `head` is GitHub's
87
+ * view of the PR head commit.
88
+ */
89
+ export function decideVerifyCheck(input) {
90
+ const { verified, head } = input;
91
+ const facts = [
92
+ `- Head: \`${input.headSha}\` (tree \`${head.tree}\`, parent ${head.parents.map((p) => `\`${p}\``).join(', ') || 'none'})`,
93
+ `- Verified tree: \`${verified.treeSha ?? 'none'}\``,
94
+ `- Verified base: \`${verified.baseSha ?? 'none'}\``,
95
+ `- Verify digest: \`${verified.verifyDigest ?? 'none'}\``,
96
+ `- G3: ${verified.g3 ? `${verified.g3.verdict} (${verified.g3.code})` : 'not run'}`,
97
+ ];
98
+ let failure = null;
99
+ if (!verified.g3 || verified.g3.verdict !== 'pass') {
100
+ failure = verified.g3
101
+ ? `G3 did not pass (${verified.g3.verdict}: ${verified.g3.code})`
102
+ : 'G3 never ran for this change (owner-lane PRs are not host-verified)';
103
+ }
104
+ else if (!verified.verifyDigest)
105
+ failure = 'no verification digest is bound to this change';
106
+ else if (!verified.treeSha || !SHA_RE.test(verified.treeSha) || !verified.baseSha || !SHA_RE.test(verified.baseSha)) {
107
+ failure = 'the verified tree / base is not recorded';
108
+ }
109
+ else if (verified.commands.length === 0)
110
+ failure = 'no verify command is recorded as having run';
111
+ else if (head.tree !== verified.treeSha)
112
+ failure = `the head's tree ${short(head.tree)} is not the verified tree ${short(verified.treeSha)}`;
113
+ else if (head.parents.length !== 1 || head.parents[0] !== verified.baseSha) {
114
+ failure = `the head's parent is not the verified base ${short(verified.baseSha)}`;
115
+ }
116
+ const commandLines = verified.commands.length === 0
117
+ ? ['_No verify command recorded._']
118
+ : verified.commands.map((c) => `- ${failure === null ? 'passed' : 'recorded'} · **${c.kind}**${c.cmd.length > 0 ? ` · \`${c.cmd.join(' ')}\`` : ''}`);
119
+ const text = [
120
+ '### Binding',
121
+ ...facts,
122
+ '',
123
+ '### Commands (ran on the exact tree in the fleet mirror, confined)',
124
+ ...commandLines,
125
+ ].join('\n');
126
+ if (failure !== null) {
127
+ return {
128
+ conclusion: 'failure',
129
+ title: 'Not host-verified',
130
+ summary: scrubSecrets(`ashlr did not verify this head: ${failure}.`).slice(0, 1_000),
131
+ text,
132
+ };
133
+ }
134
+ return {
135
+ conclusion: 'success',
136
+ title: `Host-verified: tree ${short(verified.treeSha)} on ${short(verified.baseSha)}`,
137
+ summary: `The fleet ran ${verified.commands.length} verify command(s) on exactly this tree (G3 ${verified.g3.code}); ` +
138
+ `this head is that tree on that base, so GitHub can require this check.`,
139
+ text,
140
+ };
141
+ }
142
+ async function call(deps, repo, method, suffix, body) {
143
+ let token;
144
+ try {
145
+ token = (await deps.token(repo)).token;
146
+ }
147
+ catch (error) {
148
+ return { status: 0, body: { message: `no installation token for ${repo}: ${scrubSecrets(error instanceof Error ? error.message : String(error)).slice(0, 200)}` } };
149
+ }
150
+ try {
151
+ return await deps.transport({ method, path: `/repos/${repo}${suffix}`, token, ...(body !== undefined ? { body } : {}) });
152
+ }
153
+ catch {
154
+ return { status: 0, body: null };
155
+ }
156
+ }
157
+ function replyMessage(reply) {
158
+ const message = obj(reply.body)?.['message'];
159
+ return reply.status === 0
160
+ ? 'GitHub did not answer (network error or timeout)'
161
+ : `GitHub answered HTTP ${reply.status}${typeof message === 'string' ? `: ${scrubSecrets(message).slice(0, 200)}` : ''}`;
162
+ }
163
+ function failed(reply, what) {
164
+ if (reply.status === 403) {
165
+ return { ok: false, code: 'permission', reason: `${what}: ${replyMessage(reply)}; ${VERIFY_CHECK_PERMISSION_HINT}`, retryable: false };
166
+ }
167
+ const retryable = reply.status === 0 || reply.status === 429 || reply.status >= 500;
168
+ return { ok: false, code: 'github', reason: `${what}: ${replyMessage(reply)}`, retryable };
169
+ }
170
+ /**
171
+ * Create or update the `ashlr/verify` check run on `headSha` from the
172
+ * ashlr-fleet App (through the host-merge transport and its installation
173
+ * token). Never throws.
174
+ */
175
+ export async function postVerifyCheckRun(input, deps) {
176
+ if (!NAME_WITH_OWNER_RE.test(input.repo) || !SHA_RE.test(input.headSha)) {
177
+ return { ok: false, code: 'invalid', reason: 'repo or head SHA is malformed', retryable: false };
178
+ }
179
+ const inputsDigest = verifyCheckInputsDigest(input.headSha, input.verified);
180
+ const prior = input.prior ?? null;
181
+ if (prior && prior.headSha === input.headSha && prior.inputsDigest === inputsDigest) {
182
+ return { ok: true, memo: prior, action: 'unchanged' };
183
+ }
184
+ // GitHub's view of the head — the tree the check vouches for is the one GitHub holds.
185
+ const headReply = await call(deps, input.repo, 'GET', `/git/commits/${input.headSha}`);
186
+ if (headReply.status !== 200)
187
+ return failed(headReply, 'head commit read');
188
+ const headBody = obj(headReply.body);
189
+ const tree = obj(headBody?.['tree'])?.['sha'];
190
+ const parentsRaw = headBody?.['parents'];
191
+ if (headBody?.['sha'] !== input.headSha || typeof tree !== 'string' || !SHA_RE.test(tree) || !Array.isArray(parentsRaw)) {
192
+ return { ok: false, code: 'github', reason: 'GitHub returned a malformed head commit', retryable: true };
193
+ }
194
+ const parents = parentsRaw.map((p) => obj(p)?.['sha']).filter((p) => typeof p === 'string' && SHA_RE.test(p));
195
+ if (parents.length !== parentsRaw.length)
196
+ return { ok: false, code: 'github', reason: 'GitHub returned malformed head parents', retryable: true };
197
+ const decision = decideVerifyCheck({ headSha: input.headSha, head: { tree, parents }, verified: input.verified });
198
+ const common = {
199
+ external_id: inputsDigest,
200
+ status: 'completed',
201
+ conclusion: decision.conclusion,
202
+ completed_at: new Date(deps.nowMs()).toISOString(),
203
+ output: { title: decision.title, summary: decision.summary, text: decision.text.slice(0, 60_000) },
204
+ };
205
+ let reply = null;
206
+ let action = 'created';
207
+ if (prior && prior.headSha === input.headSha) {
208
+ reply = await call(deps, input.repo, 'PATCH', `/check-runs/${prior.runId}`, common);
209
+ action = 'updated';
210
+ // The run is gone (or not ours any more): post a fresh one instead.
211
+ if (reply.status === 404 || reply.status === 422)
212
+ reply = null;
213
+ }
214
+ if (reply === null) {
215
+ reply = await call(deps, input.repo, 'POST', '/check-runs', { name: ASHLR_VERIFY_CHECK_NAME, head_sha: input.headSha, ...common });
216
+ action = 'created';
217
+ }
218
+ if (reply.status !== 200 && reply.status !== 201)
219
+ return failed(reply, `check run ${action === 'created' ? 'create' : 'update'}`);
220
+ const run = obj(reply.body);
221
+ const runId = run?.['id'];
222
+ const appIdRaw = obj(run?.['app'])?.['id'];
223
+ const appId = typeof appIdRaw === 'number' && Number.isSafeInteger(appIdRaw) && appIdRaw > 0 ? String(appIdRaw) : null;
224
+ if (!Number.isSafeInteger(runId) || runId < 1 || appId === null ||
225
+ run?.['head_sha'] !== input.headSha || run?.['name'] !== ASHLR_VERIFY_CHECK_NAME || run?.['conclusion'] !== decision.conclusion) {
226
+ return { ok: false, code: 'github', reason: 'GitHub returned a check run that is not the one posted', retryable: true };
227
+ }
228
+ // A PATCH answered by a different App than the one that created the run is not ours.
229
+ if (action === 'updated' && prior && prior.appId !== appId) {
230
+ return { ok: false, code: 'github', reason: `the check run is attributed to App ${appId}, not ${prior.appId}`, retryable: false };
231
+ }
232
+ return {
233
+ ok: true,
234
+ action,
235
+ memo: {
236
+ headSha: input.headSha,
237
+ runId: runId,
238
+ appId,
239
+ conclusion: decision.conclusion,
240
+ inputsDigest,
241
+ at: new Date(deps.nowMs()).toISOString(),
242
+ },
243
+ };
244
+ }
245
+ /** The verified binding a fleet merge state carries (G3 row, verify digest, verified base / tree, commands). */
246
+ export function verifiedBindingOf(state) {
247
+ const g3 = state.gates['G3'];
248
+ return {
249
+ g3: g3 ? { verdict: g3.verdict, code: g3.code } : null,
250
+ verifyDigest: state.verifyDigest,
251
+ baseSha: state.baseSha,
252
+ treeSha: state.treeSha,
253
+ commands: normalizeVerifyCommands(state.verifyCommands ?? []),
254
+ };
255
+ }
256
+ /**
257
+ * Post (or confirm) `ashlr/verify` on the open fleet PR's current head and
258
+ * remember it on `state.pr.verifyCheck`. The caller persists the state.
259
+ */
260
+ export async function ensureFleetVerifyCheck(state, deps) {
261
+ const pr = state.pr;
262
+ if (!pr || pr.state !== 'open')
263
+ return { ok: false, code: 'invalid', reason: 'no open fleet PR', retryable: false };
264
+ const result = await postVerifyCheckRun({
265
+ repo: state.repo,
266
+ headSha: pr.headSha,
267
+ verified: verifiedBindingOf(state),
268
+ prior: pr.verifyCheck ?? null,
269
+ }, deps);
270
+ if (result.ok)
271
+ pr.verifyCheck = result.memo;
272
+ return result;
273
+ }
274
+ //# sourceMappingURL=verify-check-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-check-run.js","sourceRoot":"","sources":["../../../src/core/fleet/verify-check-run.ts"],"names":[],"mappings":"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"}
@@ -14,11 +14,19 @@ import type { GitStatus } from './types.js';
14
14
  * where `.git` is a plain file containing a `gitdir:` pointer.
15
15
  */
16
16
  export declare function isRepo(dir: string): boolean;
17
+ /** {@link isRepo} with the stat off the event loop. Never rejects. */
18
+ export declare function isRepoAsync(dir: string): Promise<boolean>;
17
19
  /**
18
20
  * Returns a GitStatus snapshot for the repo at `repoPath`, or null when the
19
21
  * path is not a repo or git is unavailable.
20
22
  */
21
23
  export declare function getGitStatus(repoPath: string): GitStatus | null;
24
+ /**
25
+ * {@link getGitStatus} without blocking the event loop (see `gitAsync`): the
26
+ * same four git commands and the same answer. After the branch read succeeds
27
+ * the other three run concurrently; they are independent reads. Never rejects.
28
+ */
29
+ export declare function getGitStatusAsync(repoPath: string, signal?: AbortSignal): Promise<GitStatus | null>;
22
30
  /**
23
31
  * Resolve the repository's default branch name (the integration target for an
24
32
  * auto-merge). Resolution order:
@@ -32,6 +40,8 @@ export declare function getGitStatus(repoPath: string): GitStatus | null;
32
40
  * through to 'main'.
33
41
  */
34
42
  export declare function defaultBranch(repoPath: string): string;
43
+ /** {@link defaultBranch} without blocking the event loop (see `gitAsync`): same commands, same answer. Never rejects. */
44
+ export declare function defaultBranchAsync(repoPath: string, signal?: AbortSignal): Promise<string>;
35
45
  /**
36
46
  * Resolve the sole GitHub owner/repo authorized by every `origin` fetch and
37
47
  * effective push URL. Git applies fetch URLs as push destinations when no
@@ -50,6 +60,13 @@ export interface GitHubOriginAuthority {
50
60
  }
51
61
  /** Resolve the canonical identity and one exact effective push transport. */
52
62
  export declare function resolveGitHubOriginAuthorityDetails(repoPath: string): GitHubOriginAuthority | null;
63
+ /**
64
+ * {@link resolveGitHubOriginAuthority} without blocking the event loop (see
65
+ * `gitAsync`): the same three git commands and the same fail-closed answer.
66
+ * The two URL reads run concurrently once the rewrite-rule check has passed.
67
+ * Never rejects.
68
+ */
69
+ export declare function resolveGitHubOriginAuthorityAsync(repoPath: string, signal?: AbortSignal): Promise<string | null>;
53
70
  /**
54
71
  * Parses the `origin` remote URL of the repo at `repoPath` and extracts the
55
72
  * GitHub org (or user) name. Returns `{ remote, org }` where either may be
package/dist/core/git.js CHANGED
@@ -7,9 +7,10 @@
7
7
  * - Every execFileSync call gets a tight timeout (5 s) and stdio:'pipe'
8
8
  * so a hung git never blocks the indexer.
9
9
  */
10
- import { execFileSync } from 'node:child_process';
10
+ import { execFile, execFileSync } from 'node:child_process';
11
11
  import { existsSync, statSync } from 'node:fs';
12
- import { join } from 'node:path';
12
+ import { stat } from 'node:fs/promises';
13
+ import { join, resolve as resolvePath } from 'node:path';
13
14
  // ---------------------------------------------------------------------------
14
15
  // Internal helpers
15
16
  // ---------------------------------------------------------------------------
@@ -33,6 +34,36 @@ function git(cwd, args) {
33
34
  return null;
34
35
  }
35
36
  }
37
+ /**
38
+ * `git()` without blocking the event loop: the same command, timeout and
39
+ * output rules (trimmed stdout; null on a non-zero exit, a timeout, a spawn
40
+ * failure or stdout over execFileSync's default 1 MiB), but the wait happens
41
+ * in libuv instead of on the calling thread.
42
+ *
43
+ * WHY. A server calling these helpers per request (the Verse sidecar's
44
+ * GET /api/verse/workspaces, up to seven git calls per root) must not freeze
45
+ * while git works in a folder macOS guards with a privacy prompt (~/Desktop,
46
+ * ~/Documents, removable volumes): execFileSync parks the whole process until
47
+ * the prompt is answered or the timeout fires, once per call.
48
+ *
49
+ * The repo is named with `git -C <dir>` and the child starts in `/`, NOT with
50
+ * `cwd: dir`: the spawn's chdir runs inside the parent's posix_spawn/fork
51
+ * call, so a cwd behind a pending prompt would park the calling thread in
52
+ * uv_spawn itself. `-C` moves that chdir into git, where waiting is harmless.
53
+ * `-C` is git's documented equivalent of starting in that directory. Stdin is
54
+ * closed at once, as execFileSync's is, so a command that would read it sees EOF.
55
+ */
56
+ function gitAsync(cwd, args, signal) {
57
+ return new Promise((resolvePromise) => {
58
+ try {
59
+ const child = execFile('git', ['-C', resolvePath(cwd), ...args], { cwd: '/', timeout: GIT_TIMEOUT, encoding: 'utf8', maxBuffer: 1024 * 1024, ...(signal ? { signal } : {}) }, (error, stdout) => resolvePromise(error ? null : String(stdout).trim()));
60
+ child.stdin?.end();
61
+ }
62
+ catch {
63
+ resolvePromise(null);
64
+ }
65
+ });
66
+ }
36
67
  /** Normalize one supported GitHub transport URL to lowercase owner/repo. */
37
68
  function canonicalGitHubDestination(remote) {
38
69
  const match = remote.match(/^https:\/\/(?:[^/?#@]+@)?github\.com(?::443)?\/([^/?#]+)\/([^/?#]+)$/i) ??
@@ -70,6 +101,22 @@ export function isRepo(dir) {
70
101
  const st = statSync(gitEntry, { throwIfNoEntry: false });
71
102
  return st !== undefined; // exists as either file or dir
72
103
  }
104
+ /** {@link isRepo} with the stat off the event loop. Never rejects. */
105
+ export async function isRepoAsync(dir) {
106
+ try {
107
+ await stat(join(dir, '.git'));
108
+ return true;
109
+ }
110
+ catch {
111
+ return false;
112
+ }
113
+ }
114
+ // The commands getGitStatus runs, shared with getGitStatusAsync so both ask
115
+ // git exactly the same questions.
116
+ const STATUS_BRANCH_ARGS = ['rev-parse', '--abbrev-ref', 'HEAD'];
117
+ const STATUS_PORCELAIN_ARGS = ['status', '--porcelain'];
118
+ const STATUS_REV_COUNT_ARGS = ['rev-list', '--left-right', '--count', '@{u}...HEAD'];
119
+ const STATUS_LAST_COMMIT_ARGS = ['log', '-1', '--format=%cI'];
73
120
  /**
74
121
  * Returns a GitStatus snapshot for the repo at `repoPath`, or null when the
75
122
  * path is not a repo or git is unavailable.
@@ -78,24 +125,39 @@ export function getGitStatus(repoPath) {
78
125
  if (!isRepo(repoPath))
79
126
  return null;
80
127
  // --- branch ---
81
- const branchRaw = git(repoPath, ['rev-parse', '--abbrev-ref', 'HEAD']);
128
+ const branchRaw = git(repoPath, [...STATUS_BRANCH_ARGS]);
82
129
  if (branchRaw === null)
83
130
  return null; // git not available / not a real repo
131
+ return gitStatusFrom(branchRaw, git(repoPath, [...STATUS_PORCELAIN_ARGS]), git(repoPath, [...STATUS_REV_COUNT_ARGS]), git(repoPath, [...STATUS_LAST_COMMIT_ARGS]));
132
+ }
133
+ /**
134
+ * {@link getGitStatus} without blocking the event loop (see `gitAsync`): the
135
+ * same four git commands and the same answer. After the branch read succeeds
136
+ * the other three run concurrently; they are independent reads. Never rejects.
137
+ */
138
+ export async function getGitStatusAsync(repoPath, signal) {
139
+ if (!(await isRepoAsync(repoPath)))
140
+ return null;
141
+ const branchRaw = await gitAsync(repoPath, STATUS_BRANCH_ARGS, signal);
142
+ if (branchRaw === null)
143
+ return null; // git not available / not a real repo
144
+ const [porcelain, revCount, lastCommit] = await Promise.all([
145
+ gitAsync(repoPath, STATUS_PORCELAIN_ARGS, signal),
146
+ gitAsync(repoPath, STATUS_REV_COUNT_ARGS, signal),
147
+ gitAsync(repoPath, STATUS_LAST_COMMIT_ARGS, signal),
148
+ ]);
149
+ return gitStatusFrom(branchRaw, porcelain, revCount, lastCommit);
150
+ }
151
+ /** The GitStatus four git outputs describe (a null output: that command failed). */
152
+ function gitStatusFrom(branchRaw, porcelain, revCount, lastCommitRaw) {
84
153
  const branch = branchRaw || 'HEAD'; // detached HEAD shows 'HEAD'
85
154
  // --- dirty (number of changed lines in porcelain output) ---
86
- const porcelain = git(repoPath, ['status', '--porcelain']);
87
155
  const dirty = porcelain === null || porcelain === ''
88
156
  ? 0
89
157
  : porcelain.split('\n').filter(Boolean).length;
90
158
  // --- ahead / behind upstream ---
91
159
  let ahead = 0;
92
160
  let behind = 0;
93
- const revCount = git(repoPath, [
94
- 'rev-list',
95
- '--left-right',
96
- '--count',
97
- '@{u}...HEAD',
98
- ]);
99
161
  if (revCount !== null) {
100
162
  // Output is "<behind>\t<ahead>" (left=upstream, right=HEAD)
101
163
  const parts = revCount.split(/\s+/);
@@ -106,7 +168,7 @@ export function getGitStatus(repoPath) {
106
168
  }
107
169
  // If no upstream is configured, revCount is null → ahead/behind stay 0.
108
170
  // --- last commit ISO timestamp ---
109
- const lastCommit = git(repoPath, ['log', '-1', '--format=%cI']) || null;
171
+ const lastCommit = lastCommitRaw || null;
110
172
  return { branch, dirty, ahead, behind, lastCommit };
111
173
  }
112
174
  /**
@@ -122,15 +184,28 @@ export function getGitStatus(repoPath) {
122
184
  * through to 'main'.
123
185
  */
124
186
  export function defaultBranch(repoPath) {
125
- const sym = git(repoPath, ['symbolic-ref', '--short', 'refs/remotes/origin/HEAD']);
126
- if (sym) {
127
- // e.g. "origin/main" → "main"
128
- const slash = sym.indexOf('/');
129
- const name = slash >= 0 ? sym.slice(slash + 1) : sym;
130
- if (name)
131
- return name;
132
- }
133
- const cur = git(repoPath, ['rev-parse', '--abbrev-ref', 'HEAD']);
187
+ const fromOrigin = originHeadBranch(git(repoPath, [...ORIGIN_HEAD_ARGS]));
188
+ if (fromOrigin)
189
+ return fromOrigin;
190
+ return currentBranchOrMain(git(repoPath, [...STATUS_BRANCH_ARGS]));
191
+ }
192
+ /** {@link defaultBranch} without blocking the event loop (see `gitAsync`): same commands, same answer. Never rejects. */
193
+ export async function defaultBranchAsync(repoPath, signal) {
194
+ const fromOrigin = originHeadBranch(await gitAsync(repoPath, ORIGIN_HEAD_ARGS, signal));
195
+ if (fromOrigin)
196
+ return fromOrigin;
197
+ return currentBranchOrMain(await gitAsync(repoPath, STATUS_BRANCH_ARGS, signal));
198
+ }
199
+ const ORIGIN_HEAD_ARGS = ['symbolic-ref', '--short', 'refs/remotes/origin/HEAD'];
200
+ /** e.g. "origin/main" → "main"; null when there is no usable origin/HEAD. */
201
+ function originHeadBranch(sym) {
202
+ if (!sym)
203
+ return null;
204
+ const slash = sym.indexOf('/');
205
+ const name = slash >= 0 ? sym.slice(slash + 1) : sym;
206
+ return name || null;
207
+ }
208
+ function currentBranchOrMain(cur) {
134
209
  if (cur && cur !== 'HEAD')
135
210
  return cur;
136
211
  return 'main';
@@ -151,13 +226,37 @@ export function resolveGitHubOriginAuthority(repoPath) {
151
226
  export function resolveGitHubOriginAuthorityDetails(repoPath) {
152
227
  // A resolved URL can be rewritten again when fed back to another git command.
153
228
  // Refuse every rewrite rule instead of trying to reason about chained config.
154
- const rewriteRules = git(repoPath, [
155
- 'config', '--get-regexp', '^url\\..*\\.(insteadof|pushinsteadof)$',
156
- ]);
229
+ const rewriteRules = git(repoPath, [...ORIGIN_REWRITE_RULE_ARGS]);
230
+ if (rewriteRules)
231
+ return null;
232
+ return originAuthorityFrom(git(repoPath, [...ORIGIN_FETCH_URL_ARGS]), git(repoPath, [...ORIGIN_PUSH_URL_ARGS]));
233
+ }
234
+ // The commands resolveGitHubOriginAuthorityDetails runs, shared with its async twin.
235
+ const ORIGIN_REWRITE_RULE_ARGS = [
236
+ 'config', '--get-regexp', '^url\\..*\\.(insteadof|pushinsteadof)$',
237
+ ];
238
+ const ORIGIN_FETCH_URL_ARGS = ['remote', 'get-url', '--all', 'origin'];
239
+ const ORIGIN_PUSH_URL_ARGS = ['remote', 'get-url', '--push', '--all', 'origin'];
240
+ /**
241
+ * {@link resolveGitHubOriginAuthority} without blocking the event loop (see
242
+ * `gitAsync`): the same three git commands and the same fail-closed answer.
243
+ * The two URL reads run concurrently once the rewrite-rule check has passed.
244
+ * Never rejects.
245
+ */
246
+ export async function resolveGitHubOriginAuthorityAsync(repoPath, signal) {
247
+ const rewriteRules = await gitAsync(repoPath, ORIGIN_REWRITE_RULE_ARGS, signal);
157
248
  if (rewriteRules)
158
249
  return null;
159
- const fetchUrls = gitUrls(git(repoPath, ['remote', 'get-url', '--all', 'origin']));
160
- const pushUrls = gitUrls(git(repoPath, ['remote', 'get-url', '--push', '--all', 'origin']));
250
+ const [fetchOut, pushOut] = await Promise.all([
251
+ gitAsync(repoPath, ORIGIN_FETCH_URL_ARGS, signal),
252
+ gitAsync(repoPath, ORIGIN_PUSH_URL_ARGS, signal),
253
+ ]);
254
+ return originAuthorityFrom(fetchOut, pushOut)?.nameWithOwner ?? null;
255
+ }
256
+ /** The authority two `remote get-url --all` outputs describe, or null (fail closed). */
257
+ function originAuthorityFrom(fetchOut, pushOut) {
258
+ const fetchUrls = gitUrls(fetchOut);
259
+ const pushUrls = gitUrls(pushOut);
161
260
  if (!fetchUrls || !pushUrls)
162
261
  return null;
163
262
  const destinations = new Set();
@@ -1 +1 @@
1
- {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/core/git.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/core/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * The ONE definition of an "open" (active) goal, shared by the Leader's
3
+ * evidence, the Leader's `active-goals` metric, and the digest / dashboard
4
+ * "goals in flight" list.
5
+ *
6
+ * WHY THIS FILE EXISTS (3.14 Leader reliability). The Leader counted open
7
+ * goals from `listGoalsDetailed()` and replaced the WHOLE goals section with
8
+ * `null` whenever the read was incomplete — while the digest counted from
9
+ * `listGoals()`, which silently drops unreadable files. Three goal files had
10
+ * a 1970 `updatedAt` (earlier than `createdAt`, which the store's record
11
+ * guard rejects), so every read was "degraded": the digest reported 18–21
12
+ * active goals while the Leader's model saw `GOALS AND FOCUS: null` and wrote
13
+ * "the fleet has zero active goals". Now both sides count the same readable
14
+ * goals with the same status rule, and an incomplete read is reported as a
15
+ * LOWER BOUND with the unreadable-file count — never as nothing.
16
+ *
17
+ * Pure (no I/O): callers pass the result of a goal-store read.
18
+ */
19
+ import type { Goal, GoalStatus } from '../types.js';
20
+ /**
21
+ * Statuses that occupy focus capacity. `planning` counts: a goal with no
22
+ * milestones yet is still open work the fleet has committed to.
23
+ */
24
+ export declare const OPEN_GOAL_STATUSES: readonly GoalStatus[];
25
+ export declare function isOpenGoal(goal: Pick<Goal, 'status'>): boolean;
26
+ export interface GoalReadLike {
27
+ goals: readonly Goal[];
28
+ /** False when any goal file could not be read (or the listing was truncated). */
29
+ complete: boolean;
30
+ /** Goal files that could not be read; undefined = not reported by the source. */
31
+ unreadable?: number;
32
+ }
33
+ export interface OpenGoalsSummary {
34
+ /** Open goals among the READABLE ones — a lower bound when `complete` is false. */
35
+ open: number;
36
+ active: number;
37
+ planning: number;
38
+ paused: number;
39
+ /** Readable goals of every status. */
40
+ total: number;
41
+ complete: boolean;
42
+ /** Goal files the store could not read (0 when complete; null = unknown). */
43
+ unreadable: number | null;
44
+ /** The open goals themselves, in the source's order. */
45
+ openGoals: Goal[];
46
+ }
47
+ export declare function summarizeOpenGoals(read: GoalReadLike): OpenGoalsSummary;