@cortexkit/opencode-antigravity-auth 3.0.4 → 3.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (370) hide show
  1. package/README.md +38 -352
  2. package/dist/cli.js +9199 -8799
  3. package/dist/cli.js.map +4 -4
  4. package/dist/cli.meta.json +1286 -1064
  5. package/dist/index.js +13641 -14559
  6. package/dist/index.js.map +4 -4
  7. package/dist/index.meta.json +1333 -1342
  8. package/dist/server.js +9578 -9987
  9. package/dist/server.js.map +4 -4
  10. package/dist/server.meta.json +1 -1
  11. package/dist/src/auth-method-labels.d.ts +3 -0
  12. package/dist/src/auth-method-labels.d.ts.map +1 -0
  13. package/dist/src/auth-method-labels.js +5 -0
  14. package/dist/src/auth-method-labels.js.map +1 -0
  15. package/dist/src/cli.d.ts +3 -1
  16. package/dist/src/cli.d.ts.map +1 -1
  17. package/dist/src/cli.js +98 -12
  18. package/dist/src/cli.js.map +1 -1
  19. package/dist/src/common-auth-embedded/claustrum/consumer.d.ts +33 -3
  20. package/dist/src/common-auth-embedded/claustrum/consumer.js +96 -1
  21. package/dist/src/common-auth-embedded/claustrum/custody.d.ts +4 -1
  22. package/dist/src/common-auth-embedded/claustrum/enrollment.d.ts +6 -1
  23. package/dist/src/common-auth-embedded/claustrum/enrollment.js +6 -1
  24. package/dist/src/common-auth-embedded/claustrum/index.d.ts +2 -1
  25. package/dist/src/common-auth-embedded/claustrum/index.js +5 -3
  26. package/dist/src/common-auth-embedded/claustrum/insula.d.ts +69 -0
  27. package/dist/src/common-auth-embedded/claustrum/insula.js +152 -0
  28. package/dist/src/common-auth-embedded/claustrum/roster.d.ts +13 -0
  29. package/dist/src/common-auth-embedded/claustrum/roster.js +33 -3
  30. package/dist/src/common-auth-embedded/fs/refresh-file-lock.js +20 -11
  31. package/dist/src/common-auth-embedded/quota/codec.d.ts +2 -0
  32. package/dist/src/common-auth-embedded/quota/codec.js +2 -1
  33. package/dist/src/common-auth-embedded/quota/format.d.ts +26 -0
  34. package/dist/src/common-auth-embedded/quota/format.js +78 -42
  35. package/dist/src/common-auth-embedded/quota/index.d.ts +4 -4
  36. package/dist/src/common-auth-embedded/quota/index.js +2 -2
  37. package/dist/src/common-auth-embedded/quota/map.d.ts +11 -0
  38. package/dist/src/common-auth-embedded/quota/map.js +36 -1
  39. package/dist/src/common-auth-embedded/quota/merge.d.ts +3 -1
  40. package/dist/src/common-auth-embedded/quota/merge.js +21 -5
  41. package/dist/src/common-auth-embedded/quota/projection.d.ts +2 -1
  42. package/dist/src/common-auth-embedded/quota/projection.js +3 -1
  43. package/dist/src/common-auth-embedded/setup/command-runner.js +49 -0
  44. package/dist/src/common-auth-embedded/setup/command.d.ts +3 -0
  45. package/dist/src/common-auth-embedded/setup/command.js +215 -0
  46. package/dist/src/common-auth-embedded/setup/config-write.js +60 -0
  47. package/dist/src/common-auth-embedded/setup/detect.d.ts +6 -0
  48. package/dist/src/common-auth-embedded/setup/detect.js +224 -0
  49. package/dist/src/common-auth-embedded/setup/enroll.js +70 -0
  50. package/dist/src/common-auth-embedded/setup/index.d.ts +5 -0
  51. package/dist/src/common-auth-embedded/setup/index.js +4 -0
  52. package/dist/src/common-auth-embedded/setup/paths.js +33 -0
  53. package/dist/src/common-auth-embedded/setup/process-fence.d.ts +43 -0
  54. package/dist/src/common-auth-embedded/setup/process-fence.js +270 -0
  55. package/dist/src/common-auth-embedded/setup/prompts.js +26 -0
  56. package/dist/src/common-auth-embedded/setup/register.d.ts +11 -0
  57. package/dist/src/common-auth-embedded/setup/register.js +130 -0
  58. package/dist/src/common-auth-embedded/setup/types.d.ts +136 -0
  59. package/dist/src/common-auth-embedded/source-output.json +228 -80
  60. package/dist/src/common-auth-embedded/store/schema.d.ts +2 -0
  61. package/dist/src/common-auth-embedded/store/schema.js +3 -2
  62. package/dist/src/ga/rpc/protocol.d.ts +6 -10
  63. package/dist/src/ga/rpc/protocol.d.ts.map +1 -1
  64. package/dist/src/ga/rpc/protocol.js +65 -13
  65. package/dist/src/ga/rpc/protocol.js.map +1 -1
  66. package/dist/src/ga/server/auth.d.ts +8 -3
  67. package/dist/src/ga/server/auth.d.ts.map +1 -1
  68. package/dist/src/ga/server/auth.js +25 -9
  69. package/dist/src/ga/server/auth.js.map +1 -1
  70. package/dist/src/ga/server/index.d.ts +39 -12
  71. package/dist/src/ga/server/index.d.ts.map +1 -1
  72. package/dist/src/ga/server/index.js +229 -55
  73. package/dist/src/ga/server/index.js.map +1 -1
  74. package/dist/src/ga/server/pool-login.d.ts +22 -0
  75. package/dist/src/ga/server/pool-login.d.ts.map +1 -0
  76. package/dist/src/ga/server/pool-login.js +150 -0
  77. package/dist/src/ga/server/pool-login.js.map +1 -0
  78. package/dist/src/ga/tui/host-ga.d.ts +2 -5
  79. package/dist/src/ga/tui/host-ga.d.ts.map +1 -1
  80. package/dist/src/ga/tui/host-ga.js +17 -49
  81. package/dist/src/ga/tui/host-ga.js.map +1 -1
  82. package/dist/src/plugin/accounts.d.ts +1 -1
  83. package/dist/src/plugin/accounts.d.ts.map +1 -1
  84. package/dist/src/plugin/accounts.js +1 -0
  85. package/dist/src/plugin/accounts.js.map +1 -1
  86. package/dist/src/plugin/background-vault-quota-refresh.d.ts +2 -0
  87. package/dist/src/plugin/background-vault-quota-refresh.d.ts.map +1 -1
  88. package/dist/src/plugin/background-vault-quota-refresh.js +125 -10
  89. package/dist/src/plugin/background-vault-quota-refresh.js.map +1 -1
  90. package/dist/src/plugin/command-apply.d.ts +2 -2
  91. package/dist/src/plugin/command-apply.d.ts.map +1 -1
  92. package/dist/src/plugin/command-apply.js +3 -10
  93. package/dist/src/plugin/command-apply.js.map +1 -1
  94. package/dist/src/plugin/commands.d.ts +1 -0
  95. package/dist/src/plugin/commands.d.ts.map +1 -1
  96. package/dist/src/plugin/commands.js +2 -2
  97. package/dist/src/plugin/commands.js.map +1 -1
  98. package/dist/src/plugin/config/operator-settings-schema.d.ts +0 -4
  99. package/dist/src/plugin/config/operator-settings-schema.d.ts.map +1 -1
  100. package/dist/src/plugin/config/operator-settings-schema.js +0 -5
  101. package/dist/src/plugin/config/operator-settings-schema.js.map +1 -1
  102. package/dist/src/plugin/config/schema.d.ts +0 -7
  103. package/dist/src/plugin/config/schema.d.ts.map +1 -1
  104. package/dist/src/plugin/config/schema.js +0 -43
  105. package/dist/src/plugin/config/schema.js.map +1 -1
  106. package/dist/src/plugin/config/writer.d.ts +1 -1
  107. package/dist/src/plugin/config/writer.js +1 -1
  108. package/dist/src/plugin/fetch/retry-state.d.ts +19 -3
  109. package/dist/src/plugin/fetch/retry-state.d.ts.map +1 -1
  110. package/dist/src/plugin/fetch/retry-state.js +0 -6
  111. package/dist/src/plugin/fetch/retry-state.js.map +1 -1
  112. package/dist/src/plugin/fetch-interceptor.d.ts.map +1 -1
  113. package/dist/src/plugin/fetch-interceptor.js +0 -3
  114. package/dist/src/plugin/fetch-interceptor.js.map +1 -1
  115. package/dist/src/plugin/fetch-routing.d.ts +0 -16
  116. package/dist/src/plugin/fetch-routing.d.ts.map +1 -1
  117. package/dist/src/plugin/fetch-routing.js +0 -49
  118. package/dist/src/plugin/fetch-routing.js.map +1 -1
  119. package/dist/src/plugin/ga-location-services.d.ts +14 -9
  120. package/dist/src/plugin/ga-location-services.d.ts.map +1 -1
  121. package/dist/src/plugin/ga-location-services.js +120 -40
  122. package/dist/src/plugin/ga-location-services.js.map +1 -1
  123. package/dist/src/plugin/google-origin.d.ts +7 -0
  124. package/dist/src/plugin/google-origin.d.ts.map +1 -0
  125. package/dist/src/plugin/google-origin.js +14 -0
  126. package/dist/src/plugin/google-origin.js.map +1 -0
  127. package/dist/src/plugin/index.d.ts.map +1 -1
  128. package/dist/src/plugin/index.js +15 -4
  129. package/dist/src/plugin/index.js.map +1 -1
  130. package/dist/src/plugin/oauth-methods.d.ts.map +1 -1
  131. package/dist/src/plugin/oauth-methods.js +0 -33
  132. package/dist/src/plugin/oauth-methods.js.map +1 -1
  133. package/dist/src/plugin/operator-settings.d.ts +1 -1
  134. package/dist/src/plugin/operator-settings.d.ts.map +1 -1
  135. package/dist/src/plugin/operator-settings.js +1 -8
  136. package/dist/src/plugin/operator-settings.js.map +1 -1
  137. package/dist/src/plugin/quota.d.ts +11 -7
  138. package/dist/src/plugin/quota.d.ts.map +1 -1
  139. package/dist/src/plugin/quota.js +128 -102
  140. package/dist/src/plugin/quota.js.map +1 -1
  141. package/dist/src/plugin/request.d.ts +5 -3
  142. package/dist/src/plugin/request.d.ts.map +1 -1
  143. package/dist/src/plugin/request.js +87 -168
  144. package/dist/src/plugin/request.js.map +1 -1
  145. package/dist/src/plugin/server.d.ts.map +1 -1
  146. package/dist/src/plugin/server.js +60 -53
  147. package/dist/src/plugin/server.js.map +1 -1
  148. package/dist/src/plugin/shared/advisory-repository.d.ts +20 -0
  149. package/dist/src/plugin/shared/advisory-repository.d.ts.map +1 -0
  150. package/dist/src/plugin/shared/advisory-repository.js +91 -0
  151. package/dist/src/plugin/shared/advisory-repository.js.map +1 -0
  152. package/dist/src/plugin/shared/request-services.d.ts +19 -25
  153. package/dist/src/plugin/shared/request-services.d.ts.map +1 -1
  154. package/dist/src/plugin/shared/request-services.js +105 -188
  155. package/dist/src/plugin/shared/request-services.js.map +1 -1
  156. package/dist/src/plugin/shared/runtime.js +4 -2
  157. package/dist/src/plugin/shared/runtime.js.map +1 -1
  158. package/dist/src/plugin/shared/vault-request-credentials.d.ts +4 -1
  159. package/dist/src/plugin/shared/vault-request-credentials.d.ts.map +1 -1
  160. package/dist/src/plugin/shared/vault-request-credentials.js +41 -7
  161. package/dist/src/plugin/shared/vault-request-credentials.js.map +1 -1
  162. package/dist/src/plugin/storage.d.ts +2 -2
  163. package/dist/src/plugin/storage.d.ts.map +1 -1
  164. package/dist/src/plugin/storage.js.map +1 -1
  165. package/dist/src/plugin/vault-custody.d.ts.map +1 -1
  166. package/dist/src/plugin/vault-custody.js +147 -35
  167. package/dist/src/plugin/vault-custody.js.map +1 -1
  168. package/dist/src/plugin/vault-quota-outcome.d.ts +19 -0
  169. package/dist/src/plugin/vault-quota-outcome.d.ts.map +1 -0
  170. package/dist/src/plugin/vault-quota-outcome.js +47 -0
  171. package/dist/src/plugin/vault-quota-outcome.js.map +1 -0
  172. package/dist/src/quota-presentation.d.ts +29 -1
  173. package/dist/src/quota-presentation.d.ts.map +1 -1
  174. package/dist/src/quota-presentation.js +52 -17
  175. package/dist/src/quota-presentation.js.map +1 -1
  176. package/dist/src/setup.d.ts +15 -0
  177. package/dist/src/setup.d.ts.map +1 -0
  178. package/dist/src/setup.js +320 -0
  179. package/dist/src/setup.js.map +1 -0
  180. package/dist/src/sidebar-projection.d.ts +1 -1
  181. package/dist/src/sidebar-projection.d.ts.map +1 -1
  182. package/dist/src/sidebar-state.d.ts +1 -1
  183. package/dist/src/sidebar-state.d.ts.map +1 -1
  184. package/dist/src/sidebar-state.js +19 -1
  185. package/dist/src/sidebar-state.js.map +1 -1
  186. package/dist/src/tui.d.ts.map +1 -1
  187. package/dist/src/tui.js +205 -110
  188. package/dist/src/tui.js.map +1 -1
  189. package/dist/tui-build-map.json +37 -37
  190. package/dist/tui-ga-build-map.json +33 -33
  191. package/dist/types/src/auth-method-labels.d.ts +3 -0
  192. package/dist/types/src/auth-method-labels.d.ts.map +1 -0
  193. package/dist/types/src/cli.d.ts +3 -1
  194. package/dist/types/src/cli.d.ts.map +1 -1
  195. package/dist/types/src/common-auth-embedded/auth-menu/terminal.d.ts +43 -0
  196. package/dist/types/src/common-auth-embedded/claustrum/consumer.d.ts +132 -0
  197. package/dist/types/src/common-auth-embedded/claustrum/custody.d.ts +178 -0
  198. package/dist/types/src/common-auth-embedded/claustrum/enrollment.d.ts +164 -0
  199. package/dist/types/src/common-auth-embedded/claustrum/errors.d.ts +16 -0
  200. package/dist/types/src/common-auth-embedded/claustrum/host-slot.d.ts +39 -0
  201. package/dist/types/src/common-auth-embedded/claustrum/index.d.ts +19 -0
  202. package/dist/types/src/common-auth-embedded/claustrum/insula.d.ts +69 -0
  203. package/dist/types/src/common-auth-embedded/claustrum/interlock.d.ts +27 -0
  204. package/dist/types/src/common-auth-embedded/claustrum/roster.d.ts +221 -0
  205. package/dist/types/src/common-auth-embedded/opencode2/errors.d.ts +25 -0
  206. package/dist/types/src/common-auth-embedded/opencode2/index.d.ts +8 -0
  207. package/dist/types/src/common-auth-embedded/opencode2/install.d.ts +55 -0
  208. package/dist/types/src/common-auth-embedded/opencode2/integration.d.ts +112 -0
  209. package/dist/types/src/common-auth-embedded/opencode2/sse.d.ts +12 -0
  210. package/dist/types/src/common-auth-embedded/opencode2/types.d.ts +413 -0
  211. package/dist/types/src/common-auth-embedded/quota/codec.d.ts +2 -0
  212. package/dist/types/src/common-auth-embedded/quota/format.d.ts +26 -0
  213. package/dist/types/src/common-auth-embedded/quota/index.d.ts +4 -4
  214. package/dist/types/src/common-auth-embedded/quota/map.d.ts +11 -0
  215. package/dist/types/src/common-auth-embedded/quota/merge.d.ts +3 -1
  216. package/dist/types/src/common-auth-embedded/quota/projection.d.ts +2 -1
  217. package/dist/types/src/common-auth-embedded/routing/admission.d.ts +93 -0
  218. package/dist/types/src/common-auth-embedded/routing/index.d.ts +8 -0
  219. package/dist/types/src/common-auth-embedded/routing/ordered.d.ts +47 -0
  220. package/dist/types/src/common-auth-embedded/routing/pins.d.ts +22 -0
  221. package/dist/types/src/common-auth-embedded/routing/sticky.d.ts +158 -0
  222. package/dist/types/src/common-auth-embedded/setup/command.d.ts +3 -0
  223. package/dist/types/src/common-auth-embedded/setup/detect.d.ts +6 -0
  224. package/dist/types/src/common-auth-embedded/setup/index.d.ts +5 -0
  225. package/dist/types/src/common-auth-embedded/setup/process-fence.d.ts +43 -0
  226. package/dist/types/src/common-auth-embedded/setup/register.d.ts +11 -0
  227. package/dist/types/src/common-auth-embedded/setup/types.d.ts +136 -0
  228. package/dist/types/src/common-auth-embedded/store/schema.d.ts +2 -0
  229. package/dist/types/src/ga/rpc/protocol.d.ts +6 -10
  230. package/dist/types/src/ga/rpc/protocol.d.ts.map +1 -1
  231. package/dist/types/src/ga/server/auth.d.ts +8 -3
  232. package/dist/types/src/ga/server/auth.d.ts.map +1 -1
  233. package/dist/types/src/ga/server/index.d.ts +39 -12
  234. package/dist/types/src/ga/server/index.d.ts.map +1 -1
  235. package/dist/types/src/ga/server/pool-login.d.ts +22 -0
  236. package/dist/types/src/ga/server/pool-login.d.ts.map +1 -0
  237. package/dist/types/src/plugin/accounts.d.ts +1 -1
  238. package/dist/types/src/plugin/accounts.d.ts.map +1 -1
  239. package/dist/types/src/plugin/background-vault-quota-refresh.d.ts +2 -0
  240. package/dist/types/src/plugin/background-vault-quota-refresh.d.ts.map +1 -1
  241. package/dist/types/src/plugin/command-apply.d.ts +2 -2
  242. package/dist/types/src/plugin/command-apply.d.ts.map +1 -1
  243. package/dist/types/src/plugin/commands.d.ts +1 -0
  244. package/dist/types/src/plugin/commands.d.ts.map +1 -1
  245. package/dist/types/src/plugin/config/operator-settings-schema.d.ts +0 -4
  246. package/dist/types/src/plugin/config/operator-settings-schema.d.ts.map +1 -1
  247. package/dist/types/src/plugin/config/schema.d.ts +0 -7
  248. package/dist/types/src/plugin/config/schema.d.ts.map +1 -1
  249. package/dist/types/src/plugin/config/writer.d.ts +1 -1
  250. package/dist/types/src/plugin/fetch/retry-state.d.ts +19 -3
  251. package/dist/types/src/plugin/fetch/retry-state.d.ts.map +1 -1
  252. package/dist/types/src/plugin/fetch-interceptor.d.ts.map +1 -1
  253. package/dist/types/src/plugin/fetch-routing.d.ts +0 -16
  254. package/dist/types/src/plugin/fetch-routing.d.ts.map +1 -1
  255. package/dist/types/src/plugin/ga-location-services.d.ts +14 -9
  256. package/dist/types/src/plugin/ga-location-services.d.ts.map +1 -1
  257. package/dist/types/src/plugin/google-origin.d.ts +7 -0
  258. package/dist/types/src/plugin/google-origin.d.ts.map +1 -0
  259. package/dist/types/src/plugin/index.d.ts.map +1 -1
  260. package/dist/types/src/plugin/oauth-methods.d.ts.map +1 -1
  261. package/dist/types/src/plugin/operator-settings.d.ts +1 -1
  262. package/dist/types/src/plugin/operator-settings.d.ts.map +1 -1
  263. package/dist/types/src/plugin/quota.d.ts +11 -7
  264. package/dist/types/src/plugin/quota.d.ts.map +1 -1
  265. package/dist/types/src/plugin/request.d.ts +5 -3
  266. package/dist/types/src/plugin/request.d.ts.map +1 -1
  267. package/dist/types/src/plugin/server.d.ts.map +1 -1
  268. package/dist/types/src/plugin/shared/advisory-repository.d.ts +20 -0
  269. package/dist/types/src/plugin/shared/advisory-repository.d.ts.map +1 -0
  270. package/dist/types/src/plugin/shared/request-services.d.ts +19 -25
  271. package/dist/types/src/plugin/shared/request-services.d.ts.map +1 -1
  272. package/dist/types/src/plugin/shared/vault-request-credentials.d.ts +4 -1
  273. package/dist/types/src/plugin/shared/vault-request-credentials.d.ts.map +1 -1
  274. package/dist/types/src/plugin/storage.d.ts +2 -2
  275. package/dist/types/src/plugin/storage.d.ts.map +1 -1
  276. package/dist/types/src/plugin/vault-custody.d.ts.map +1 -1
  277. package/dist/types/src/plugin/vault-quota-outcome.d.ts +19 -0
  278. package/dist/types/src/plugin/vault-quota-outcome.d.ts.map +1 -0
  279. package/dist/types/src/setup.d.ts +15 -0
  280. package/dist/types/src/setup.d.ts.map +1 -0
  281. package/dist/types/src/sidebar-state.d.ts +1 -1
  282. package/dist/types/src/sidebar-state.d.ts.map +1 -1
  283. package/package.json +5 -4
  284. package/src/common-auth-embedded/claustrum/consumer.d.ts +33 -3
  285. package/src/common-auth-embedded/claustrum/consumer.js +96 -1
  286. package/src/common-auth-embedded/claustrum/custody.d.ts +4 -1
  287. package/src/common-auth-embedded/claustrum/enrollment.d.ts +6 -1
  288. package/src/common-auth-embedded/claustrum/enrollment.js +6 -1
  289. package/src/common-auth-embedded/claustrum/index.d.ts +2 -1
  290. package/src/common-auth-embedded/claustrum/index.js +5 -3
  291. package/src/common-auth-embedded/claustrum/insula.d.ts +69 -0
  292. package/src/common-auth-embedded/claustrum/insula.js +152 -0
  293. package/src/common-auth-embedded/claustrum/roster.d.ts +13 -0
  294. package/src/common-auth-embedded/claustrum/roster.js +33 -3
  295. package/src/common-auth-embedded/fs/refresh-file-lock.js +20 -11
  296. package/src/common-auth-embedded/quota/codec.d.ts +2 -0
  297. package/src/common-auth-embedded/quota/codec.js +2 -1
  298. package/src/common-auth-embedded/quota/format.d.ts +26 -0
  299. package/src/common-auth-embedded/quota/format.js +78 -42
  300. package/src/common-auth-embedded/quota/index.d.ts +4 -4
  301. package/src/common-auth-embedded/quota/index.js +2 -2
  302. package/src/common-auth-embedded/quota/map.d.ts +11 -0
  303. package/src/common-auth-embedded/quota/map.js +36 -1
  304. package/src/common-auth-embedded/quota/merge.d.ts +3 -1
  305. package/src/common-auth-embedded/quota/merge.js +21 -5
  306. package/src/common-auth-embedded/quota/projection.d.ts +2 -1
  307. package/src/common-auth-embedded/quota/projection.js +3 -1
  308. package/src/common-auth-embedded/setup/command-runner.js +49 -0
  309. package/src/common-auth-embedded/setup/command.d.ts +3 -0
  310. package/src/common-auth-embedded/setup/command.js +215 -0
  311. package/src/common-auth-embedded/setup/config-write.js +60 -0
  312. package/src/common-auth-embedded/setup/detect.d.ts +6 -0
  313. package/src/common-auth-embedded/setup/detect.js +224 -0
  314. package/src/common-auth-embedded/setup/enroll.js +70 -0
  315. package/src/common-auth-embedded/setup/index.d.ts +5 -0
  316. package/src/common-auth-embedded/setup/index.js +4 -0
  317. package/src/common-auth-embedded/setup/paths.js +33 -0
  318. package/src/common-auth-embedded/setup/process-fence.d.ts +43 -0
  319. package/src/common-auth-embedded/setup/process-fence.js +270 -0
  320. package/src/common-auth-embedded/setup/prompts.js +26 -0
  321. package/src/common-auth-embedded/setup/register.d.ts +11 -0
  322. package/src/common-auth-embedded/setup/register.js +130 -0
  323. package/src/common-auth-embedded/setup/types.d.ts +136 -0
  324. package/src/common-auth-embedded/source-output.json +228 -80
  325. package/src/common-auth-embedded/store/schema.d.ts +2 -0
  326. package/src/common-auth-embedded/store/schema.js +3 -2
  327. package/src/sidebar-state.ts +19 -2
  328. package/src/tui-compiled/common-auth-embedded/quota/codec.js +2 -1
  329. package/src/tui-compiled/common-auth-embedded/quota/format.js +78 -42
  330. package/src/tui-compiled/common-auth-embedded/quota/index.js +2 -2
  331. package/src/tui-compiled/common-auth-embedded/quota/map.js +36 -1
  332. package/src/tui-compiled/common-auth-embedded/quota/merge.js +21 -5
  333. package/src/tui-compiled/common-auth-embedded/quota/projection.js +3 -1
  334. package/src/tui-compiled/quota-presentation.js +42 -9
  335. package/src/tui-compiled/sidebar-state.js +15 -1
  336. package/src/tui-compiled/tui.js +516 -334
  337. package/src/tui-ga-compiled/host-ga.js +11 -38
  338. package/src/tui-ga-compiled/shared/1ff34afa7c42d196-projection.js +3 -1
  339. package/src/tui-ga-compiled/shared/77138df80c7ae006-map.js +36 -1
  340. package/src/tui-ga-compiled/shared/98cc0c186c46c42d-quota-presentation.js +42 -9
  341. package/src/tui-ga-compiled/shared/aef2402f8fc342f0-format.js +78 -42
  342. package/src/tui-ga-compiled/shared/bf17cbee28e58197-index.js +2 -2
  343. package/src/tui-ga-compiled/shared/ca21dc417b36dc5d-codec.js +2 -1
  344. package/src/tui-ga-compiled/shared/ecc214300932dfb6-merge.js +21 -5
  345. package/src/tui-ga-raw/host-ga.tsx +31 -62
  346. package/src/tui-ga-raw/shared/1ff34afa7c42d196-projection.js +3 -1
  347. package/src/tui-ga-raw/shared/77138df80c7ae006-map.js +36 -1
  348. package/src/tui-ga-raw/shared/98cc0c186c46c42d-quota-presentation.js +42 -9
  349. package/src/tui-ga-raw/shared/aef2402f8fc342f0-format.js +78 -42
  350. package/src/tui-ga-raw/shared/bf17cbee28e58197-index.js +2 -2
  351. package/src/tui-ga-raw/shared/ca21dc417b36dc5d-codec.js +2 -1
  352. package/src/tui-ga-raw/shared/ecc214300932dfb6-merge.js +21 -5
  353. package/src/tui-raw/common-auth-embedded/quota/codec.js +2 -1
  354. package/src/tui-raw/common-auth-embedded/quota/format.js +78 -42
  355. package/src/tui-raw/common-auth-embedded/quota/index.js +2 -2
  356. package/src/tui-raw/common-auth-embedded/quota/map.js +36 -1
  357. package/src/tui-raw/common-auth-embedded/quota/merge.js +21 -5
  358. package/src/tui-raw/common-auth-embedded/quota/projection.js +3 -1
  359. package/src/tui-raw/quota-presentation.js +42 -9
  360. package/src/tui-raw/sidebar-state.js +15 -1
  361. package/src/tui-raw/tui.tsx +423 -218
  362. package/src/tui.tsx +423 -218
  363. package/dist/src/tui/vault-setup.d.ts +0 -98
  364. package/dist/src/tui/vault-setup.d.ts.map +0 -1
  365. package/dist/src/tui/vault-setup.js +0 -198
  366. package/dist/src/tui/vault-setup.js.map +0 -1
  367. package/dist/types/src/plugin/transform/model-resolver.d.ts +0 -2
  368. package/dist/types/src/plugin/transform/model-resolver.d.ts.map +0 -1
  369. package/dist/types/src/quota-presentation.d.ts +0 -18
  370. package/dist/types/src/quota-presentation.d.ts.map +0 -1
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * OpenCode 2 (2.0.22) server plugin. It sends the host's Google model
3
- * requests for this plugin's models to Antigravity accounts through a
3
+ * requests carrying the common-auth placeholder to Antigravity accounts through a
4
4
  * loopback bridge, and serves the `antigravity-auth` v1 RPC with each
5
5
  * location's account state and commands. `createGaAntigravityPlugin` is the
6
6
  * plugin the host loads; `createGaPluginFromServices` builds one over a
@@ -9,12 +9,14 @@
9
9
  import { randomUUID } from 'node:crypto';
10
10
  import { createServer, } from 'node:http';
11
11
  import { buildAntigravityHarnessUserAgent, fetchWithAgyCliTransport, getPublicModelDefinitions, isRetiredAgyModel, loadCommonAuthCommands, } from '@cortexkit/antigravity-auth-core';
12
+ import { placeholderSecret } from '../../common-auth-embedded/opencode2/index.js';
12
13
  import { createGaLocationServices } from "../../plugin/ga-location-services.js";
14
+ import { isCanonicalGoogleOrigin } from "../../plugin/google-origin.js";
13
15
  import { createLocationRuntime, } from "../../plugin/shared/runtime.js";
14
16
  import { redactAccountForSidebar, } from "../../sidebar-state.js";
15
17
  import { assertLoopbackProxyGuard, } from "../proxy-guard.js";
16
18
  import { ANTIGRAVITY_MENU_COMMAND_NAME, ANTIGRAVITY_RPC_DEFINITION, ANTIGRAVITY_RPC_LIMITS, ANTIGRAVITY_RPC_VERSION, AntigravityApplyInputSchema, AntigravityApplyOutputSchema, AntigravityApplyResultSchema, AntigravityNotificationPayloadSchema, AntigravityStateInputSchema, AntigravityStateOutputSchema, } from "../rpc/protocol.js";
17
- import { registerGaVaultActivation } from "./auth.js";
19
+ import { registerGaAuthMethods } from "./auth.js";
18
20
  // Raw request sender
19
21
  /**
20
22
  * How long a response body may stall with no bytes before the raw sender
@@ -99,23 +101,35 @@ export function gaPreHeaderFailureResponse(error) {
99
101
  export async function startGaLoopbackBridge(options) {
100
102
  const queued = new Map();
101
103
  const running = new Set();
104
+ const reads = new Set();
102
105
  const sockets = new Set();
103
- // Post-header failures by job id, held until the job's adapted response
104
- // reads them or the hold expires.
105
- const failures = new Map();
106
- const recordFailure = (id, error) => {
107
- const timer = setTimeout(() => failures.delete(id), GA_UNCLAIMED_JOB_TTL_MS);
108
- timer.unref?.();
109
- failures.set(id, { error, timer });
106
+ // Responses not yet wrapped by adaptResponse stay in this map with a bounded
107
+ // hold after completion. Once wrapped, the body's closure keeps the upstream
108
+ // Error available to slow readers without an expiring global error record.
109
+ const unclaimed = new Map();
110
+ // Weak references let disposal detach its bookkeeping without keeping
111
+ // abandoned response bodies (and their errors) alive.
112
+ const lifetimes = new Set();
113
+ const finalized = new FinalizationRegistry((reference) => lifetimes.delete(reference));
114
+ const release = (state, discardFailure = true) => {
115
+ state.released = true;
116
+ if (discardFailure)
117
+ state.failure = undefined;
118
+ const entry = unclaimed.get(state.id);
119
+ if (entry?.state === state) {
120
+ clearTimeout(entry.timer);
121
+ unclaimed.delete(state.id);
122
+ }
123
+ if (state.reference)
124
+ lifetimes.delete(state.reference);
125
+ finalized.unregister(state);
110
126
  };
111
- const takeFailure = (id) => {
112
- const entry = failures.get(id);
113
- if (!entry)
114
- return undefined;
115
- clearTimeout(entry.timer);
116
- failures.delete(id);
117
- return entry.error;
127
+ const takeFailure = (state) => {
128
+ const failure = state.failure;
129
+ release(state);
130
+ return failure;
118
131
  };
132
+ let closing = false;
119
133
  let disposal = null;
120
134
  const report = (message) => {
121
135
  try {
@@ -126,7 +140,7 @@ export async function startGaLoopbackBridge(options) {
126
140
  }
127
141
  };
128
142
  const server = createServer((request, response) => {
129
- void handle(request, response).catch((error) => {
143
+ const pending = handle(request, response).catch((error) => {
130
144
  report(`bridge request failed: ${errorMessage(error)}`);
131
145
  if (!response.headersSent) {
132
146
  writeResponseHead(response, 500, 'application/json');
@@ -136,6 +150,8 @@ export async function startGaLoopbackBridge(options) {
136
150
  response.destroy();
137
151
  }
138
152
  });
153
+ reads.add(pending);
154
+ void pending.finally(() => reads.delete(pending));
139
155
  });
140
156
  server.on('connection', (socket) => {
141
157
  sockets.add(socket);
@@ -148,7 +164,7 @@ export async function startGaLoopbackBridge(options) {
148
164
  const entry = id ? queued.get(id) : undefined;
149
165
  // The body is always `{}`; read and ignore it so the socket stays usable.
150
166
  request.resume();
151
- if (request.method !== 'POST' || !id || !entry || disposal) {
167
+ if (request.method !== 'POST' || !id || !entry || closing) {
152
168
  writeResponseHead(response, 404, 'application/json');
153
169
  response.end(JSON.stringify({ error: { message: 'unknown job' } }));
154
170
  return;
@@ -156,6 +172,17 @@ export async function startGaLoopbackBridge(options) {
156
172
  // A job runs at most once.
157
173
  queued.delete(id);
158
174
  clearTimeout(entry.timer);
175
+ const state = {
176
+ id,
177
+ failure: undefined,
178
+ claimed: false,
179
+ released: false,
180
+ };
181
+ const reference = new WeakRef(state);
182
+ state.reference = reference;
183
+ lifetimes.add(reference);
184
+ finalized.register(state, reference, state);
185
+ unclaimed.set(id, { state });
159
186
  const controller = new AbortController();
160
187
  running.add(controller);
161
188
  response.once('close', () => {
@@ -174,10 +201,22 @@ export async function startGaLoopbackBridge(options) {
174
201
  catch (error) {
175
202
  upstream = gaPreHeaderFailureResponse(error);
176
203
  }
177
- await pipeResponse(upstream, response, (error) => recordFailure(id, error));
204
+ await pipeResponse(upstream, response, (error) => {
205
+ // An adapted body owns its error even while disposal drains its reader.
206
+ // Unadapted jobs must not create retained failures after closing starts.
207
+ if (!state.released && (state.claimed || !closing))
208
+ state.failure = error;
209
+ });
178
210
  }
179
211
  finally {
180
212
  running.delete(controller);
213
+ if (!closing && !state.claimed && !state.released) {
214
+ const entry = unclaimed.get(id);
215
+ if (entry) {
216
+ entry.timer = setTimeout(() => release(state), GA_UNCLAIMED_JOB_TTL_MS);
217
+ entry.timer.unref?.();
218
+ }
219
+ }
181
220
  }
182
221
  };
183
222
  await new Promise((resolve, reject) => {
@@ -195,7 +234,7 @@ export async function startGaLoopbackBridge(options) {
195
234
  port: address.port,
196
235
  origin,
197
236
  rewrite(original, job, env) {
198
- if (disposal)
237
+ if (closing)
199
238
  throw new Error('The Antigravity bridge is disposed');
200
239
  const id = randomUUID();
201
240
  const target = `${origin}/agy/${id}`;
@@ -230,6 +269,16 @@ export async function startGaLoopbackBridge(options) {
230
269
  if (!source)
231
270
  return null;
232
271
  const reader = source.getReader();
272
+ const entry = unclaimed.get(id);
273
+ const state = entry?.state ?? {
274
+ id,
275
+ failure: undefined,
276
+ claimed: false,
277
+ released: true,
278
+ };
279
+ state.claimed = true;
280
+ clearTimeout(entry?.timer);
281
+ unclaimed.delete(id);
233
282
  const body = new ReadableStream({
234
283
  async pull(controller) {
235
284
  try {
@@ -238,7 +287,8 @@ export async function startGaLoopbackBridge(options) {
238
287
  // The bridge ends a failed job's loopback body cleanly after
239
288
  // its last byte and records the failure first, so the end of
240
289
  // the body is where the genuine error is delivered.
241
- const failure = takeFailure(id);
290
+ const failure = takeFailure(state);
291
+ reader.releaseLock();
242
292
  if (failure)
243
293
  controller.error(failure);
244
294
  else
@@ -248,12 +298,18 @@ export async function startGaLoopbackBridge(options) {
248
298
  controller.enqueue(value);
249
299
  }
250
300
  catch (error) {
251
- controller.error(takeFailure(id) ?? error);
301
+ controller.error(takeFailure(state) ?? error);
302
+ reader.releaseLock();
252
303
  }
253
304
  },
254
- cancel(reason) {
255
- takeFailure(id);
256
- return reader.cancel(reason);
305
+ async cancel(reason) {
306
+ release(state);
307
+ try {
308
+ await reader.cancel(reason);
309
+ }
310
+ finally {
311
+ reader.releaseLock();
312
+ }
257
313
  },
258
314
  });
259
315
  return new Response(body, {
@@ -263,15 +319,32 @@ export async function startGaLoopbackBridge(options) {
263
319
  });
264
320
  },
265
321
  pendingJobs: () => queued.size + running.size,
322
+ retainedResponses() {
323
+ let claimed = 0;
324
+ let failures = 0;
325
+ let timers = 0;
326
+ for (const reference of lifetimes) {
327
+ const state = reference.deref();
328
+ if (!state || state.released)
329
+ continue;
330
+ if (state.claimed)
331
+ claimed++;
332
+ if (state.failure)
333
+ failures++;
334
+ }
335
+ for (const entry of unclaimed.values()) {
336
+ if (entry.timer)
337
+ timers++;
338
+ }
339
+ return { unclaimed: unclaimed.size, claimed, failures, timers };
340
+ },
266
341
  dispose() {
267
342
  if (!disposal) {
343
+ closing = true;
268
344
  disposal = (async () => {
269
345
  for (const { timer } of queued.values())
270
346
  clearTimeout(timer);
271
347
  queued.clear();
272
- for (const { timer } of failures.values())
273
- clearTimeout(timer);
274
- failures.clear();
275
348
  const closed = new Promise((resolve) => {
276
349
  server.close(() => resolve());
277
350
  });
@@ -280,7 +353,17 @@ export async function startGaLoopbackBridge(options) {
280
353
  }
281
354
  for (const socket of sockets)
282
355
  socket.destroy();
356
+ await Promise.allSettled([...reads]);
283
357
  await closed;
358
+ for (const reference of lifetimes) {
359
+ const state = reference.deref();
360
+ // Detach every bridge owner, but leave an adapted body's terminal
361
+ // error in its own closure until EOF, cancellation or collection.
362
+ if (state)
363
+ release(state, !state.claimed);
364
+ }
365
+ lifetimes.clear();
366
+ unclaimed.clear();
284
367
  })();
285
368
  }
286
369
  return disposal;
@@ -319,6 +402,10 @@ function writeResponseHead(response, status, contentType) {
319
402
  */
320
403
  async function pipeResponse(upstream, response, onFailure) {
321
404
  const contentType = upstream.headers.get('content-type') ?? 'application/octet-stream';
405
+ if (response.destroyed) {
406
+ await upstream.body?.cancel().catch(() => { });
407
+ return;
408
+ }
322
409
  writeResponseHead(response, upstream.status, contentType);
323
410
  if (!upstream.body) {
324
411
  response.end();
@@ -339,7 +426,11 @@ async function pipeResponse(upstream, response, onFailure) {
339
426
  if (eventStream) {
340
427
  tail = (tail + Buffer.from(value).toString('latin1')).slice(-2);
341
428
  }
342
- if (!response.write(value)) {
429
+ if (response.destroyed) {
430
+ await reader.cancel().catch(() => { });
431
+ return;
432
+ }
433
+ if (!response.write(value) && !response.destroyed) {
343
434
  await new Promise((resolve) => {
344
435
  response.once('drain', resolve);
345
436
  response.once('close', resolve);
@@ -360,6 +451,9 @@ async function pipeResponse(upstream, response, onFailure) {
360
451
  response.end();
361
452
  return;
362
453
  }
454
+ finally {
455
+ reader.releaseLock();
456
+ }
363
457
  if (eventStream && wroteAny && tail !== '\n\n') {
364
458
  response.write(tail.endsWith('\n') ? '\n' : '\n\n');
365
459
  }
@@ -470,6 +564,19 @@ function routeDto(entry) {
470
564
  updatedAt: entry.updatedAt,
471
565
  };
472
566
  }
567
+ /** Sidebar optionals must be omitted, not sent as own undefined JSON fields. */
568
+ function omitUndefinedFields(value) {
569
+ if (Array.isArray(value))
570
+ return value.map(omitUndefinedFields);
571
+ if (value === null || typeof value !== 'object')
572
+ return value;
573
+ const prototype = Object.getPrototypeOf(value);
574
+ if (prototype !== Object.prototype && prototype !== null)
575
+ return value;
576
+ return Object.fromEntries(Object.entries(value)
577
+ .filter(([, field]) => field !== undefined)
578
+ .map(([key, field]) => [key, omitUndefinedFields(field)]));
579
+ }
473
580
  export function createGaRpcActivation(options) {
474
581
  const generation = options.generation ?? createGaGeneration();
475
582
  const now = options.now ?? Date.now;
@@ -575,13 +682,13 @@ export function createGaRpcActivation(options) {
575
682
  };
576
683
  const gemini = entry(quota.gemini);
577
684
  const nonGemini = entry(quota['non-gemini']);
578
- return {
685
+ return omitUndefinedFields({
579
686
  ...rest,
580
687
  quota: {
581
688
  ...(gemini ? { gemini } : {}),
582
689
  ...(nonGemini ? { 'non-gemini': nonGemini } : {}),
583
690
  },
584
- };
691
+ });
585
692
  };
586
693
  const state = async (input, signal) => {
587
694
  const parsed = AntigravityStateInputSchema.parse(input);
@@ -744,6 +851,8 @@ export function createGaRpcActivation(options) {
744
851
  export const GA_PLUGIN_ID = 'cortexkit.antigravity-auth';
745
852
  /** The host provider whose requests the hooks handle. */
746
853
  export const GA_PROVIDER_ID = 'google';
854
+ // OpenCode 2 uses `default` to mean that no explicit thinking variant is selected.
855
+ const GA_HOST_DEFAULT_VARIANT = 'default';
747
856
  const REQUEST_KIND_MATCHES_HOST = true;
748
857
  void REQUEST_KIND_MATCHES_HOST;
749
858
  /** Session headers the host sets on a model request. */
@@ -751,21 +860,38 @@ const PARENT_SESSION_HEADERS = [
751
860
  'x-opencode-parent-session-id',
752
861
  'x-parent-session-id',
753
862
  ];
863
+ /** Ownership follows the host-prepared credential, never the active connection. */
864
+ export function isGaOwnedRequest(event) {
865
+ return (event.request.headers.get('x-goog-api-key') === placeholderSecret('google'));
866
+ }
867
+ export const GA_RETRY_OWNERSHIP_LIMIT = 512;
868
+ export const GA_UNSUPPORTED_REQUEST_MESSAGE = 'This request cannot use Antigravity. Choose a supported Antigravity model.';
869
+ export const GA_CUSTOM_GOOGLE_ORIGIN_MESSAGE = 'Antigravity pool requests need the default Google base URL. Remove the custom baseURL from the Google provider settings.';
754
870
  /**
755
- * Whether the plugin owns a Google request: every title request (the host
756
- * may pick an off-catalog title model) and any request for a model this
757
- * plugin registered or withdrew. Withdrawn selections must reach shared
758
- * admission rather than passing through to the host's Google transport.
871
+ * The retry API has no attempt identity, so only the latest Google transport
872
+ * per session is known. Updating an entry makes it newest; eviction makes
873
+ * ownership unknown rather than assuming a retry belongs to Antigravity.
759
874
  */
760
- export function isGaOwnedRequest(event, isRegisteredModel) {
761
- // The hooks are registered for the Google provider only; the provider
762
- // check repeats that scope so a host that widened it still passes other
763
- // providers through untouched.
764
- if (event.model.providerID !== GA_PROVIDER_ID)
765
- return false;
766
- return (event.kind === 'title' ||
767
- isRegisteredModel(event.model.id) ||
768
- isRetiredAgyModel(event.model.id));
875
+ export class GaRequestOwnership {
876
+ latest = new Map();
877
+ record(sessionID, owned) {
878
+ this.latest.delete(sessionID);
879
+ this.latest.set(sessionID, owned);
880
+ if (this.latest.size > GA_RETRY_OWNERSHIP_LIMIT) {
881
+ const oldest = this.latest.keys().next().value;
882
+ if (oldest !== undefined)
883
+ this.latest.delete(oldest);
884
+ }
885
+ }
886
+ get(sessionID) {
887
+ return this.latest.get(sessionID);
888
+ }
889
+ delete(sessionID) {
890
+ this.latest.delete(sessionID);
891
+ }
892
+ clear() {
893
+ this.latest.clear();
894
+ }
769
895
  }
770
896
  /**
771
897
  * Request hook body: record an owned Google content request as a bridge job
@@ -775,17 +901,33 @@ export function isGaOwnedRequest(event, isRegisteredModel) {
775
901
  * then records it as the request's error and dispatches nothing.
776
902
  */
777
903
  export async function rewriteGaHttpRequest(event, input) {
778
- if (!isGaOwnedRequest(event, input.isRegisteredModel))
904
+ if (event.model.providerID !== GA_PROVIDER_ID)
779
905
  return;
780
- const original = event.request;
781
- if (!isGaGoogleContentRequest(original))
906
+ const owned = isGaOwnedRequest(event);
907
+ input.ownership.record(event.sessionID, owned);
908
+ if (!owned)
782
909
  return;
910
+ const original = event.request;
911
+ if (!isGaGoogleContentRequest(original)) {
912
+ throw new Error(GA_UNSUPPORTED_REQUEST_MESSAGE);
913
+ }
914
+ if (!isCanonicalGoogleOrigin(original.url)) {
915
+ throw new Error(GA_CUSTOM_GOOGLE_ORIGIN_MESSAGE);
916
+ }
917
+ // Titles must reach the engine's title router even for retired or foreign IDs.
918
+ if (event.kind !== 'title' &&
919
+ !input.isRegisteredModel(event.model.id) &&
920
+ !isRetiredAgyModel(event.model.id)) {
921
+ throw new Error(GA_UNSUPPORTED_REQUEST_MESSAGE);
922
+ }
783
923
  const job = {
784
924
  sessionID: event.sessionID,
785
925
  parentSessionID: headerValue(original, PARENT_SESSION_HEADERS),
786
926
  kind: event.kind,
787
927
  modelID: event.model.id,
788
- variant: event.model.variant ?? null,
928
+ variant: event.model.variant === GA_HOST_DEFAULT_VARIANT
929
+ ? null
930
+ : (event.model.variant ?? null),
789
931
  url: original.url,
790
932
  body: await original.clone().text(),
791
933
  };
@@ -800,11 +942,12 @@ export function adaptGaHttpResponse(event, bridge) {
800
942
  /**
801
943
  * Retry hook body. The bridge's job runner rotates accounts and retries
802
944
  * endpoints itself; a host retry on top would repeat that whole sequence.
803
- * Registered and withdrawn models are affected; withdrawn selections must not retry.
945
+ * Response adaptation cannot clear ownership: the host classifies status and
946
+ * consumes the body only after its response hook has run.
804
947
  */
805
- export function decideGaRetry(event, isRegisteredModel) {
948
+ export function decideGaRetry(event, ownership) {
806
949
  if (event.model.providerID === GA_PROVIDER_ID &&
807
- (isRegisteredModel(event.model.id) || isRetiredAgyModel(event.model.id))) {
950
+ ownership.get(event.sessionID) === true) {
808
951
  event.decision = { retry: false };
809
952
  }
810
953
  }
@@ -893,7 +1036,7 @@ function headerValue(request, names) {
893
1036
  * the location runtime, the RPC activation and the loopback bridge for the
894
1037
  * host-owned location directory; registers the `antigravity-auth` RPC, the
895
1038
  * public catalog models on the Google provider, the `http.request` rewrite,
896
- * the `http.response` post-header error adapter and the registered-model
1039
+ * the `http.response` post-header error adapter and the latest-owned-session
897
1040
  * retry policy (all scoped to the Google provider);
898
1041
  * and returns a Cleanup that removes only this activation's hooks and RPC
899
1042
  * and stops everything else: producers are stopped and awaited, queued
@@ -925,9 +1068,9 @@ export async function setupGaActivation(context, factory, overrides = {}) {
925
1068
  // writes drain and the runtime's files and handles close.
926
1069
  try {
927
1070
  if (context.integration?.transform) {
928
- runtime.scope.add(await registerGaVaultActivation({
1071
+ runtime.scope.add(await registerGaAuthMethods({
929
1072
  integration: { transform: context.integration.transform },
930
- }), 'producer');
1073
+ }, undefined, { local: services.localLogin, oauth: overrides.oauth }), 'producer');
931
1074
  }
932
1075
  let serving = null;
933
1076
  const requireServing = () => {
@@ -968,6 +1111,36 @@ export async function setupGaActivation(context, factory, overrides = {}) {
968
1111
  });
969
1112
  runtime.scope.add(bridge, 'producer');
970
1113
  runtime.scope.add(activation, 'producer');
1114
+ const ownership = new GaRequestOwnership();
1115
+ const events = new AbortController();
1116
+ const eventSurface = context.event;
1117
+ const eventTask = eventSurface
1118
+ ? (async () => {
1119
+ try {
1120
+ for await (const event of eventSurface.subscribe({
1121
+ signal: events.signal,
1122
+ })) {
1123
+ if (event.type === 'session.deleted') {
1124
+ ownership.delete(event.data.sessionID);
1125
+ }
1126
+ }
1127
+ }
1128
+ catch {
1129
+ if (!events.signal.aborted) {
1130
+ runtime.logger
1131
+ .createLogger('ownership')
1132
+ .warn('Session cleanup subscription stopped');
1133
+ }
1134
+ }
1135
+ })()
1136
+ : undefined;
1137
+ runtime.scope.add({
1138
+ dispose: async () => {
1139
+ events.abort();
1140
+ await eventTask;
1141
+ ownership.clear();
1142
+ },
1143
+ }, 'producer');
971
1144
  const handlers = {
972
1145
  state: (input, call) => activation.handlers.state(input, call.signal),
973
1146
  apply: (input, call) => activation.handlers.apply(input, call.signal),
@@ -999,7 +1172,7 @@ export async function setupGaActivation(context, factory, overrides = {}) {
999
1172
  await context.command.reload();
1000
1173
  const responseHook = await context.session.hook('http.response', (event) => adaptGaHttpResponse(event, bridge), { providerID: GA_PROVIDER_ID });
1001
1174
  runtime.scope.add(responseHook, 'producer');
1002
- const retryHook = await context.session.hook('retry', (event) => decideGaRetry(event, isRegisteredModel), { providerID: GA_PROVIDER_ID });
1175
+ const retryHook = await context.session.hook('retry', (event) => decideGaRetry(event, ownership), { providerID: GA_PROVIDER_ID });
1003
1176
  runtime.scope.add(retryHook, 'producer');
1004
1177
  // The `http.request` hook, which rewrites requests to the bridge, is
1005
1178
  // installed last, so every request it rewrites already has the
@@ -1009,6 +1182,7 @@ export async function setupGaActivation(context, factory, overrides = {}) {
1009
1182
  bridge,
1010
1183
  isRegisteredModel,
1011
1184
  env: process.env,
1185
+ ownership,
1012
1186
  }), { providerID: GA_PROVIDER_ID });
1013
1187
  runtime.scope.add(requestHook, 'producer');
1014
1188
  }