crewly 1.20.181 → 1.20.183

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 (220) hide show
  1. package/config/roles/orchestrator/prompt.md +4 -0
  2. package/config/skills/agent/core/report-status/execute.sh +4 -2
  3. package/dist/backend/backend/src/constants.d.ts +101 -1
  4. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  5. package/dist/backend/backend/src/constants.js +110 -1
  6. package/dist/backend/backend/src/constants.js.map +1 -1
  7. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts.map +1 -1
  8. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js +22 -1
  9. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js.map +1 -1
  10. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  11. package/dist/backend/backend/src/controllers/chat/chat.controller.js +25 -24
  12. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  13. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  14. package/dist/backend/backend/src/controllers/slack/slack.controller.js +15 -0
  15. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  16. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.d.ts +11 -1
  17. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.d.ts.map +1 -1
  18. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js +44 -9
  19. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js.map +1 -1
  20. package/dist/backend/backend/src/controllers/system/runtime-terms.controller.d.ts +31 -0
  21. package/dist/backend/backend/src/controllers/system/runtime-terms.controller.d.ts.map +1 -0
  22. package/dist/backend/backend/src/controllers/system/runtime-terms.controller.js +99 -0
  23. package/dist/backend/backend/src/controllers/system/runtime-terms.controller.js.map +1 -0
  24. package/dist/backend/backend/src/index.d.ts.map +1 -1
  25. package/dist/backend/backend/src/index.js +4 -0
  26. package/dist/backend/backend/src/index.js.map +1 -1
  27. package/dist/backend/backend/src/routes/modules/system.routes.d.ts.map +1 -1
  28. package/dist/backend/backend/src/routes/modules/system.routes.js +3 -0
  29. package/dist/backend/backend/src/routes/modules/system.routes.js.map +1 -1
  30. package/dist/backend/backend/src/services/agent/antigravity-runtime.service.d.ts.map +1 -1
  31. package/dist/backend/backend/src/services/agent/antigravity-runtime.service.js +5 -0
  32. package/dist/backend/backend/src/services/agent/antigravity-runtime.service.js.map +1 -1
  33. package/dist/backend/backend/src/services/decisions/decision-card.d.ts +14 -4
  34. package/dist/backend/backend/src/services/decisions/decision-card.d.ts.map +1 -1
  35. package/dist/backend/backend/src/services/decisions/decision-card.js +31 -10
  36. package/dist/backend/backend/src/services/decisions/decision-card.js.map +1 -1
  37. package/dist/backend/backend/src/services/decisions/decision.service.d.ts +40 -2
  38. package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  39. package/dist/backend/backend/src/services/decisions/decision.service.js +100 -8
  40. package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
  41. package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts.map +1 -1
  42. package/dist/backend/backend/src/services/decisions/decision.wiring.js +7 -0
  43. package/dist/backend/backend/src/services/decisions/decision.wiring.js.map +1 -1
  44. package/dist/backend/backend/src/services/messaging/message-queue.service.d.ts +2 -1
  45. package/dist/backend/backend/src/services/messaging/message-queue.service.d.ts.map +1 -1
  46. package/dist/backend/backend/src/services/messaging/message-queue.service.js +6 -3
  47. package/dist/backend/backend/src/services/messaging/message-queue.service.js.map +1 -1
  48. package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  49. package/dist/backend/backend/src/services/messaging/queue-processor.service.js +6 -1
  50. package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  51. package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.d.ts +3 -1
  52. package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.d.ts.map +1 -1
  53. package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.js +7 -4
  54. package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.js.map +1 -1
  55. package/dist/backend/backend/src/services/orc/orc-status-router.service.d.ts +110 -0
  56. package/dist/backend/backend/src/services/orc/orc-status-router.service.d.ts.map +1 -0
  57. package/dist/backend/backend/src/services/orc/orc-status-router.service.js +229 -0
  58. package/dist/backend/backend/src/services/orc/orc-status-router.service.js.map +1 -0
  59. package/dist/backend/backend/src/services/orc/orc-status-routing.d.ts +108 -0
  60. package/dist/backend/backend/src/services/orc/orc-status-routing.d.ts.map +1 -0
  61. package/dist/backend/backend/src/services/orc/orc-status-routing.js +145 -0
  62. package/dist/backend/backend/src/services/orc/orc-status-routing.js.map +1 -0
  63. package/dist/backend/backend/src/services/orc/orc-wake-counter.d.ts +86 -0
  64. package/dist/backend/backend/src/services/orc/orc-wake-counter.d.ts.map +1 -0
  65. package/dist/backend/backend/src/services/orc/orc-wake-counter.js +130 -0
  66. package/dist/backend/backend/src/services/orc/orc-wake-counter.js.map +1 -0
  67. package/dist/backend/backend/src/services/orc/work-item-destination.d.ts +33 -0
  68. package/dist/backend/backend/src/services/orc/work-item-destination.d.ts.map +1 -1
  69. package/dist/backend/backend/src/services/orc/work-item-destination.js +49 -0
  70. package/dist/backend/backend/src/services/orc/work-item-destination.js.map +1 -1
  71. package/dist/backend/backend/src/services/orc/work-item-destination.wiring.d.ts +2 -1
  72. package/dist/backend/backend/src/services/orc/work-item-destination.wiring.d.ts.map +1 -1
  73. package/dist/backend/backend/src/services/orc/work-item-destination.wiring.js +10 -4
  74. package/dist/backend/backend/src/services/orc/work-item-destination.wiring.js.map +1 -1
  75. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.d.ts +8 -0
  76. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.d.ts.map +1 -1
  77. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.js +5 -0
  78. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.js.map +1 -1
  79. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts +2 -0
  80. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts.map +1 -1
  81. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js +4 -0
  82. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js.map +1 -1
  83. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts +2 -0
  84. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts.map +1 -1
  85. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.js.map +1 -1
  86. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.d.ts.map +1 -1
  87. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js +3 -0
  88. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js.map +1 -1
  89. package/dist/backend/backend/src/services/runtime-fallback/runtime-smoke-test.service.d.ts +15 -1
  90. package/dist/backend/backend/src/services/runtime-fallback/runtime-smoke-test.service.d.ts.map +1 -1
  91. package/dist/backend/backend/src/services/runtime-fallback/runtime-smoke-test.service.js +13 -2
  92. package/dist/backend/backend/src/services/runtime-fallback/runtime-smoke-test.service.js.map +1 -1
  93. package/dist/backend/backend/src/services/runtime-terms/antigravity-terms-driver.d.ts +92 -0
  94. package/dist/backend/backend/src/services/runtime-terms/antigravity-terms-driver.d.ts.map +1 -0
  95. package/dist/backend/backend/src/services/runtime-terms/antigravity-terms-driver.js +199 -0
  96. package/dist/backend/backend/src/services/runtime-terms/antigravity-terms-driver.js.map +1 -0
  97. package/dist/backend/backend/src/services/runtime-terms/antigravity-terms-screens.d.ts +79 -0
  98. package/dist/backend/backend/src/services/runtime-terms/antigravity-terms-screens.d.ts.map +1 -0
  99. package/dist/backend/backend/src/services/runtime-terms/antigravity-terms-screens.js +145 -0
  100. package/dist/backend/backend/src/services/runtime-terms/antigravity-terms-screens.js.map +1 -0
  101. package/dist/backend/backend/src/services/runtime-terms/fake-agy-tui.fixture.d.ts +75 -0
  102. package/dist/backend/backend/src/services/runtime-terms/fake-agy-tui.fixture.d.ts.map +1 -0
  103. package/dist/backend/backend/src/services/runtime-terms/fake-agy-tui.fixture.js +218 -0
  104. package/dist/backend/backend/src/services/runtime-terms/fake-agy-tui.fixture.js.map +1 -0
  105. package/dist/backend/backend/src/services/runtime-terms/runtime-terms-consent.service.d.ts +245 -0
  106. package/dist/backend/backend/src/services/runtime-terms/runtime-terms-consent.service.d.ts.map +1 -0
  107. package/dist/backend/backend/src/services/runtime-terms/runtime-terms-consent.service.js +428 -0
  108. package/dist/backend/backend/src/services/runtime-terms/runtime-terms-consent.service.js.map +1 -0
  109. package/dist/backend/backend/src/services/runtime-terms/runtime-terms.store.d.ts +67 -0
  110. package/dist/backend/backend/src/services/runtime-terms/runtime-terms.store.d.ts.map +1 -0
  111. package/dist/backend/backend/src/services/runtime-terms/runtime-terms.store.js +78 -0
  112. package/dist/backend/backend/src/services/runtime-terms/runtime-terms.store.js.map +1 -0
  113. package/dist/backend/backend/src/services/runtime-terms/runtime-terms.wiring.d.ts +39 -0
  114. package/dist/backend/backend/src/services/runtime-terms/runtime-terms.wiring.d.ts.map +1 -0
  115. package/dist/backend/backend/src/services/runtime-terms/runtime-terms.wiring.js +161 -0
  116. package/dist/backend/backend/src/services/runtime-terms/runtime-terms.wiring.js.map +1 -0
  117. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +16 -0
  118. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  119. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +31 -8
  120. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  121. package/dist/backend/backend/src/services/task-pool/give-up/give-up-recovery.service.d.ts.map +1 -1
  122. package/dist/backend/backend/src/services/task-pool/give-up/give-up-recovery.service.js +2 -0
  123. package/dist/backend/backend/src/services/task-pool/give-up/give-up-recovery.service.js.map +1 -1
  124. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +23 -0
  125. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  126. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +61 -0
  127. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  128. package/dist/backend/backend/src/types/decision.types.d.ts +29 -5
  129. package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
  130. package/dist/backend/build-info.json +2 -2
  131. package/dist/cli/backend/src/constants.d.ts +101 -1
  132. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  133. package/dist/cli/backend/src/constants.js +110 -1
  134. package/dist/cli/backend/src/constants.js.map +1 -1
  135. package/dist/cli/backend/src/services/agent/antigravity-runtime.service.d.ts.map +1 -1
  136. package/dist/cli/backend/src/services/agent/antigravity-runtime.service.js +5 -0
  137. package/dist/cli/backend/src/services/agent/antigravity-runtime.service.js.map +1 -1
  138. package/dist/cli/backend/src/services/decisions/decision-card.d.ts +165 -0
  139. package/dist/cli/backend/src/services/decisions/decision-card.d.ts.map +1 -0
  140. package/dist/cli/backend/src/services/decisions/decision-card.js +358 -0
  141. package/dist/cli/backend/src/services/decisions/decision-card.js.map +1 -0
  142. package/dist/cli/backend/src/services/decisions/decision-contract.d.ts +83 -0
  143. package/dist/cli/backend/src/services/decisions/decision-contract.d.ts.map +1 -0
  144. package/dist/cli/backend/src/services/decisions/decision-contract.js +226 -0
  145. package/dist/cli/backend/src/services/decisions/decision-contract.js.map +1 -0
  146. package/dist/cli/backend/src/services/decisions/decision-store.d.ts +80 -0
  147. package/dist/cli/backend/src/services/decisions/decision-store.d.ts.map +1 -0
  148. package/dist/cli/backend/src/services/decisions/decision-store.js +151 -0
  149. package/dist/cli/backend/src/services/decisions/decision-store.js.map +1 -0
  150. package/dist/cli/backend/src/services/decisions/decision.service.d.ts +376 -0
  151. package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -0
  152. package/dist/cli/backend/src/services/decisions/decision.service.js +821 -0
  153. package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -0
  154. package/dist/cli/backend/src/services/decisions/ticket-thread-store.d.ts +97 -0
  155. package/dist/cli/backend/src/services/decisions/ticket-thread-store.d.ts.map +1 -0
  156. package/dist/cli/backend/src/services/decisions/ticket-thread-store.js +137 -0
  157. package/dist/cli/backend/src/services/decisions/ticket-thread-store.js.map +1 -0
  158. package/dist/cli/backend/src/services/messaging/message-queue.service.d.ts +2 -1
  159. package/dist/cli/backend/src/services/messaging/message-queue.service.d.ts.map +1 -1
  160. package/dist/cli/backend/src/services/messaging/message-queue.service.js +6 -3
  161. package/dist/cli/backend/src/services/messaging/message-queue.service.js.map +1 -1
  162. package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  163. package/dist/cli/backend/src/services/messaging/queue-processor.service.js +6 -1
  164. package/dist/cli/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  165. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts +3 -1
  166. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts.map +1 -1
  167. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js +7 -4
  168. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js.map +1 -1
  169. package/dist/cli/backend/src/services/orc/orc-status-routing.d.ts +108 -0
  170. package/dist/cli/backend/src/services/orc/orc-status-routing.d.ts.map +1 -0
  171. package/dist/cli/backend/src/services/orc/orc-status-routing.js +145 -0
  172. package/dist/cli/backend/src/services/orc/orc-status-routing.js.map +1 -0
  173. package/dist/cli/backend/src/services/orc/orc-wake-counter.d.ts +86 -0
  174. package/dist/cli/backend/src/services/orc/orc-wake-counter.d.ts.map +1 -0
  175. package/dist/cli/backend/src/services/orc/orc-wake-counter.js +130 -0
  176. package/dist/cli/backend/src/services/orc/orc-wake-counter.js.map +1 -0
  177. package/dist/cli/backend/src/services/orc/work-item-destination.d.ts +198 -0
  178. package/dist/cli/backend/src/services/orc/work-item-destination.d.ts.map +1 -0
  179. package/dist/cli/backend/src/services/orc/work-item-destination.js +288 -0
  180. package/dist/cli/backend/src/services/orc/work-item-destination.js.map +1 -0
  181. package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts +136 -0
  182. package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts.map +1 -0
  183. package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.js +152 -0
  184. package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.js.map +1 -0
  185. package/dist/cli/backend/src/services/runtime-fallback/runtime-smoke-test.service.d.ts +217 -0
  186. package/dist/cli/backend/src/services/runtime-fallback/runtime-smoke-test.service.d.ts.map +1 -0
  187. package/dist/cli/backend/src/services/runtime-fallback/runtime-smoke-test.service.js +430 -0
  188. package/dist/cli/backend/src/services/runtime-fallback/runtime-smoke-test.service.js.map +1 -0
  189. package/dist/cli/backend/src/services/runtime-terms/antigravity-terms-driver.d.ts +92 -0
  190. package/dist/cli/backend/src/services/runtime-terms/antigravity-terms-driver.d.ts.map +1 -0
  191. package/dist/cli/backend/src/services/runtime-terms/antigravity-terms-driver.js +199 -0
  192. package/dist/cli/backend/src/services/runtime-terms/antigravity-terms-driver.js.map +1 -0
  193. package/dist/cli/backend/src/services/runtime-terms/antigravity-terms-screens.d.ts +79 -0
  194. package/dist/cli/backend/src/services/runtime-terms/antigravity-terms-screens.d.ts.map +1 -0
  195. package/dist/cli/backend/src/services/runtime-terms/antigravity-terms-screens.js +145 -0
  196. package/dist/cli/backend/src/services/runtime-terms/antigravity-terms-screens.js.map +1 -0
  197. package/dist/cli/backend/src/services/runtime-terms/runtime-terms-consent.service.d.ts +245 -0
  198. package/dist/cli/backend/src/services/runtime-terms/runtime-terms-consent.service.d.ts.map +1 -0
  199. package/dist/cli/backend/src/services/runtime-terms/runtime-terms-consent.service.js +428 -0
  200. package/dist/cli/backend/src/services/runtime-terms/runtime-terms-consent.service.js.map +1 -0
  201. package/dist/cli/backend/src/services/runtime-terms/runtime-terms.store.d.ts +67 -0
  202. package/dist/cli/backend/src/services/runtime-terms/runtime-terms.store.d.ts.map +1 -0
  203. package/dist/cli/backend/src/services/runtime-terms/runtime-terms.store.js +78 -0
  204. package/dist/cli/backend/src/services/runtime-terms/runtime-terms.store.js.map +1 -0
  205. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +16 -0
  206. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  207. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +31 -8
  208. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  209. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +23 -0
  210. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  211. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +61 -0
  212. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  213. package/dist/cli/backend/src/types/decision.types.d.ts +192 -0
  214. package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -0
  215. package/dist/cli/backend/src/types/decision.types.js +13 -0
  216. package/dist/cli/backend/src/types/decision.types.js.map +1 -0
  217. package/dist/cli/cli/src/commands/harness-setup.js +2 -2
  218. package/frontend/dist/assets/{index-4271e95e.js → index-9c91de50.js} +138 -138
  219. package/frontend/dist/index.html +1 -1
  220. package/package.json +1 -1
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Drive Antigravity CLI's first-run screens to the owner's choice,
3
+ * deterministically, in a terminal the harness controls.
4
+ *
5
+ * One key at a time; before every key the screen is read and parsed
6
+ * ({@link parseAntigravityTermsScreen}) and the next key is chosen from what
7
+ * is on screen — never from a fixed key count:
8
+ *
9
+ * - colour scheme: bring the focus to `terminal`, Enter; leave "Import
10
+ * extensions from Gemini CLI" unchecked; Enter on Next only when the
11
+ * screen shows `* terminal` and the import box unchecked;
12
+ * - Terms: toggle the data-sharing box only when it differs from the
13
+ * owner's choice, re-read to verify, then go to Done and press Enter —
14
+ * only when the box (read again, right then) matches the choice;
15
+ * - then wait for the main prompt.
16
+ *
17
+ * Anything that does not match (an unknown screen for too long, an account
18
+ * sign-in, no focus, too many keys) aborts: Done is never pressed after a
19
+ * mismatch. specs/2026-10-01-runtime-terms-consent.md
20
+ *
21
+ * @module services/runtime-terms/antigravity-terms-driver
22
+ */
23
+ import { RUNTIME_TERMS_CONSTANTS } from '../../constants.js';
24
+ import { parseAntigravityTermsScreen } from './antigravity-terms-screens.js';
25
+ const A = RUNTIME_TERMS_CONSTANTS.ANTIGRAVITY;
26
+ const D = RUNTIME_TERMS_CONSTANTS.DRIVE;
27
+ /** Their bytes (the same as the session helper's KEY_CODES). */
28
+ export const DRIVER_KEY_BYTES = {
29
+ Up: '\x1b[A',
30
+ Down: '\x1b[B',
31
+ Right: '\x1b[C',
32
+ Left: '\x1b[D',
33
+ Enter: '\r',
34
+ };
35
+ /**
36
+ * Decide the next step for a parsed screen.
37
+ *
38
+ * @param s - Parsed screen
39
+ * @param shareData - Owner's choice for the data-sharing box
40
+ * @param donePressed - Done was already pressed
41
+ * @returns Next step
42
+ */
43
+ export function nextTermsStep(s, shareData, donePressed) {
44
+ switch (s.kind) {
45
+ case 'login':
46
+ return { abort: 'Antigravity CLI asked for a Google account sign-in (Crewly only runs it on a Gemini API key)' };
47
+ case 'trust':
48
+ // The folder-trust screen: its pre-selected "Yes, I trust this folder" (the harness's scratch folder).
49
+ return { key: 'Enter' };
50
+ case 'main_prompt':
51
+ return { done: true };
52
+ case 'unknown':
53
+ return { wait: true };
54
+ case 'color_scheme': {
55
+ if (donePressed)
56
+ return { abort: 'The setup screens came back after Done was pressed' };
57
+ const f = s.focus;
58
+ if (!f)
59
+ return { wait: true };
60
+ if (f.type === 'scheme') {
61
+ if (f.name === A.DEFAULT_COLOR_SCHEME)
62
+ return { key: 'Enter' };
63
+ // Move toward `terminal` (the first scheme).
64
+ return { key: 'Up' };
65
+ }
66
+ if (f.type === 'import') {
67
+ if (f.checked)
68
+ return { key: 'Enter' };
69
+ if (s.chosenScheme !== A.DEFAULT_COLOR_SCHEME)
70
+ return { key: 'Up' };
71
+ return { key: 'Down' };
72
+ }
73
+ // Next
74
+ if (s.chosenScheme === A.DEFAULT_COLOR_SCHEME && s.importChecked !== true)
75
+ return { key: 'Enter' };
76
+ return { key: 'Up' };
77
+ }
78
+ case 'terms': {
79
+ if (donePressed)
80
+ return { wait: true };
81
+ if (s.dataChecked === null)
82
+ return { abort: 'Could not read the data-sharing checkbox on the Terms screen' };
83
+ if (!s.focus)
84
+ return { wait: true };
85
+ if (s.focus === 'data')
86
+ return s.dataChecked === shareData ? { key: 'Down' } : { key: 'Enter' };
87
+ if (s.focus === 'previous')
88
+ return s.dataChecked === shareData ? { key: 'Right' } : { key: 'Up' };
89
+ // Done is focused: press it only when the box matches the choice.
90
+ return s.dataChecked === shareData ? { key: 'Enter' } : { key: 'Left' };
91
+ }
92
+ }
93
+ }
94
+ /**
95
+ * Drive the first-run screens. Never throws.
96
+ *
97
+ * @param term - Terminal running a freshly launched `agy`
98
+ * @param opts - Owner's choice and timing
99
+ * @returns Result
100
+ */
101
+ export async function driveAntigravityTerms(term, opts) {
102
+ const now = opts.now ?? (() => Date.now());
103
+ const sleep = opts.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
104
+ const pollMs = opts.pollMs ?? D.POLL_MS;
105
+ const keySettleMs = opts.keySettleMs ?? D.KEY_SETTLE_MS;
106
+ const maxKeys = opts.maxKeys ?? D.MAX_KEYS;
107
+ const keys = [];
108
+ let screen = '';
109
+ let donePressed = false;
110
+ let dataSharing;
111
+ let sawFirstRun = false;
112
+ const started = now();
113
+ let unknownSince = null;
114
+ let doneAt = 0;
115
+ const read = async () => {
116
+ try {
117
+ screen = String(await term.capture());
118
+ }
119
+ catch {
120
+ // keep the last screen
121
+ }
122
+ return screen;
123
+ };
124
+ const result = (ok, error) => ({
125
+ ok,
126
+ donePressed,
127
+ alreadyAccepted: ok && !donePressed && !sawFirstRun,
128
+ ...(dataSharing !== undefined ? { dataSharing } : {}),
129
+ ...(error ? { error } : {}),
130
+ keys,
131
+ screen,
132
+ });
133
+ try {
134
+ for (;;) {
135
+ const parsed = parseAntigravityTermsScreen(await read());
136
+ if (parsed.kind === 'color_scheme' || parsed.kind === 'terms')
137
+ sawFirstRun = true;
138
+ const step = nextTermsStep(parsed, opts.shareData, donePressed);
139
+ if ('abort' in step)
140
+ return result(false, step.abort);
141
+ if ('done' in step) {
142
+ if (sawFirstRun && !donePressed)
143
+ return result(false, 'The prompt appeared without the Terms screen being completed');
144
+ return result(true);
145
+ }
146
+ if ('wait' in step) {
147
+ const t = now();
148
+ if (donePressed) {
149
+ if (t - doneAt > (opts.promptTimeoutMs ?? D.PROMPT_TIMEOUT_MS)) {
150
+ return result(false, 'Done was pressed, but Antigravity CLI did not show its prompt in time');
151
+ }
152
+ }
153
+ else if (!sawFirstRun && parsed.kind === 'unknown') {
154
+ if (t - started > (opts.launchTimeoutMs ?? D.LAUNCH_TIMEOUT_MS)) {
155
+ return result(false, 'Antigravity CLI did not show its setup screens or its prompt in time');
156
+ }
157
+ }
158
+ else {
159
+ unknownSince ??= t;
160
+ if (t - unknownSince > (opts.unknownScreenTimeoutMs ?? D.UNKNOWN_SCREEN_TIMEOUT_MS)) {
161
+ return result(false, 'The screen did not match the expected setup screens');
162
+ }
163
+ }
164
+ await sleep(pollMs);
165
+ continue;
166
+ }
167
+ unknownSince = null;
168
+ if (keys.length >= maxKeys)
169
+ return result(false, `Gave up after ${maxKeys} keys without reaching the end of the setup screens`);
170
+ const pressingDone = parsed.kind === 'terms' && parsed.focus === 'done' && step.key === 'Enter';
171
+ if (pressingDone) {
172
+ // Last check right before accepting: read again, everything must still match.
173
+ const again = parseAntigravityTermsScreen(await read());
174
+ if (again.kind !== 'terms' || again.focus !== 'done' || again.dataChecked !== opts.shareData) {
175
+ return result(false, 'The Terms screen changed just before Done; nothing was accepted');
176
+ }
177
+ dataSharing = again.dataChecked;
178
+ }
179
+ const before = screen;
180
+ await term.write(DRIVER_KEY_BYTES[step.key]);
181
+ keys.push(step.key);
182
+ if (pressingDone) {
183
+ donePressed = true;
184
+ doneAt = now();
185
+ }
186
+ // Wait for the screen to react before deciding again.
187
+ const settleUntil = now() + keySettleMs;
188
+ while (now() < settleUntil) {
189
+ await sleep(pollMs);
190
+ if ((await read()) !== before)
191
+ break;
192
+ }
193
+ }
194
+ }
195
+ catch (err) {
196
+ return result(false, `Driving the setup screens failed: ${err instanceof Error ? err.message : String(err)}`);
197
+ }
198
+ }
199
+ //# sourceMappingURL=antigravity-terms-driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"antigravity-terms-driver.js","sourceRoot":"","sources":["../../../../../../backend/src/services/runtime-terms/antigravity-terms-driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,2BAA2B,EAA+B,MAAM,gCAAgC,CAAC;AAE1G,MAAM,CAAC,GAAG,uBAAuB,CAAC,WAAW,CAAC;AAC9C,MAAM,CAAC,GAAG,uBAAuB,CAAC,KAAK,CAAC;AAaxC,gEAAgE;AAChE,MAAM,CAAC,MAAM,gBAAgB,GAAwC;IACpE,EAAE,EAAE,QAAQ;IACZ,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,QAAQ;IACf,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,IAAI;CACX,CAAC;AAoCF;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,CAAyB,EAAE,SAAkB,EAAE,WAAoB;IAChG,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,OAAO;YACX,OAAO,EAAE,KAAK,EAAE,8FAA8F,EAAE,CAAC;QAClH,KAAK,OAAO;YACX,uGAAuG;YACvG,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;QACzB,KAAK,aAAa;YACjB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACvB,KAAK,SAAS;YACb,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACvB,KAAK,cAAc,CAAC,CAAC,CAAC;YACrB,IAAI,WAAW;gBAAE,OAAO,EAAE,KAAK,EAAE,oDAAoD,EAAE,CAAC;YACxF,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;YAClB,IAAI,CAAC,CAAC;gBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAC9B,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACzB,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,oBAAoB;oBAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;gBAC/D,6CAA6C;gBAC7C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;YACtB,CAAC;YACD,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACzB,IAAI,CAAC,CAAC,OAAO;oBAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;gBACvC,IAAI,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,oBAAoB;oBAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;gBACpE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;YACxB,CAAC;YACD,OAAO;YACP,IAAI,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,oBAAoB,IAAI,CAAC,CAAC,aAAa,KAAK,IAAI;gBAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;YACnG,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QACtB,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACd,IAAI,WAAW;gBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACvC,IAAI,CAAC,CAAC,WAAW,KAAK,IAAI;gBAAE,OAAO,EAAE,KAAK,EAAE,8DAA8D,EAAE,CAAC;YAC7G,IAAI,CAAC,CAAC,CAAC,KAAK;gBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACpC,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;gBAAE,OAAO,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;YAChG,IAAI,CAAC,CAAC,KAAK,KAAK,UAAU;gBAAE,OAAO,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;YAClG,kEAAkE;YAClE,OAAO,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;QACzE,CAAC;IACF,CAAC;AACF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAmB,EAAE,IAAuB;IACvF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1F,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC;IACxC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,aAAa,CAAC;IACxD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,QAAQ,CAAC;IAC3C,MAAM,IAAI,GAAgB,EAAE,CAAC;IAC7B,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,WAAgC,CAAC;IACrC,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;IACtB,IAAI,YAAY,GAAkB,IAAI,CAAC;IACvC,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,MAAM,IAAI,GAAG,KAAK,IAAqB,EAAE;QACxC,IAAI,CAAC;YACJ,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACR,uBAAuB;QACxB,CAAC;QACD,OAAO,MAAM,CAAC;IACf,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,CAAC,EAAW,EAAE,KAAc,EAAoB,EAAE,CAAC,CAAC;QAClE,EAAE;QACF,WAAW;QACX,eAAe,EAAE,EAAE,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW;QACnD,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,IAAI;QACJ,MAAM;KACN,CAAC,CAAC;IAEH,IAAI,CAAC;QACJ,SAAS,CAAC;YACT,MAAM,MAAM,GAAG,2BAA2B,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;YACzD,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;gBAAE,WAAW,GAAG,IAAI,CAAC;YAClF,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAChE,IAAI,OAAO,IAAI,IAAI;gBAAE,OAAO,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACtD,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACpB,IAAI,WAAW,IAAI,CAAC,WAAW;oBAAE,OAAO,MAAM,CAAC,KAAK,EAAE,8DAA8D,CAAC,CAAC;gBACtH,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;YAED,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACpB,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC;gBAChB,IAAI,WAAW,EAAE,CAAC;oBACjB,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAC;wBAChE,OAAO,MAAM,CAAC,KAAK,EAAE,uEAAuE,CAAC,CAAC;oBAC/F,CAAC;gBACF,CAAC;qBAAM,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBACtD,IAAI,CAAC,GAAG,OAAO,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAC;wBACjE,OAAO,MAAM,CAAC,KAAK,EAAE,sEAAsE,CAAC,CAAC;oBAC9F,CAAC;gBACF,CAAC;qBAAM,CAAC;oBACP,YAAY,KAAK,CAAC,CAAC;oBACnB,IAAI,CAAC,GAAG,YAAY,GAAG,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,CAAC,yBAAyB,CAAC,EAAE,CAAC;wBACrF,OAAO,MAAM,CAAC,KAAK,EAAE,qDAAqD,CAAC,CAAC;oBAC7E,CAAC;gBACF,CAAC;gBACD,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;gBACpB,SAAS;YACV,CAAC;YACD,YAAY,GAAG,IAAI,CAAC;YAEpB,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO;gBAAE,OAAO,MAAM,CAAC,KAAK,EAAE,iBAAiB,OAAO,qDAAqD,CAAC,CAAC;YAChI,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,KAAK,OAAO,CAAC;YAChG,IAAI,YAAY,EAAE,CAAC;gBAClB,8EAA8E;gBAC9E,MAAM,KAAK,GAAG,2BAA2B,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;gBACxD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;oBAC9F,OAAO,MAAM,CAAC,KAAK,EAAE,iEAAiE,CAAC,CAAC;gBACzF,CAAC;gBACD,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;YACjC,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,CAAC;YACtB,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,IAAI,YAAY,EAAE,CAAC;gBAClB,WAAW,GAAG,IAAI,CAAC;gBACnB,MAAM,GAAG,GAAG,EAAE,CAAC;YAChB,CAAC;YACD,sDAAsD;YACtD,MAAM,WAAW,GAAG,GAAG,EAAE,GAAG,WAAW,CAAC;YACxC,OAAO,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;gBAC5B,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;gBACpB,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,KAAK,MAAM;oBAAE,MAAM;YACtC,CAAC;QACF,CAAC;IACF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,OAAO,MAAM,CAAC,KAAK,EAAE,qCAAqC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/G,CAAC;AACF,CAAC"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Antigravity CLI first-run screens, read from screen text (pure).
3
+ *
4
+ * What agy 1.2.14 paints on its first interactive launch (captured in a PTY,
5
+ * focus marked by `> `, a chosen colour scheme by `* `, a focused button
6
+ * drawn without its brackets):
7
+ *
8
+ * ```
9
+ * Welcome to Antigravity CLI!
10
+ * Choose your color scheme: ╭──── preview ────╮
11
+ * > terminal │ … │
12
+ * light │ … │
13
+ * …
14
+ * Migration options: ← only when Gemini CLI extensions exist
15
+ * > [ ] Import extensions from Gemini CLI (1 found: …)
16
+ * [Next] ← focused: "> Next"
17
+ *
18
+ * Terms of Service & Data Use
19
+ * > [x] Yes, I agree to help improve Antigravity CLI by allowing …
20
+ * [Previous] [Done] ← focused: "> Previous" / "> Done"
21
+ * ↑/↓ Navigate · enter Toggle
22
+ * ```
23
+ *
24
+ * Every field is derived from text, never from a key count, so the driver
25
+ * can check the screen before and after each key.
26
+ * specs/2026-10-01-runtime-terms-consent.md
27
+ *
28
+ * @module services/runtime-terms/antigravity-terms-screens
29
+ */
30
+ /** Focus on the colour-scheme screen. */
31
+ export type ColorSchemeFocus = {
32
+ type: 'scheme';
33
+ name: string;
34
+ } | {
35
+ type: 'import';
36
+ checked: boolean;
37
+ } | {
38
+ type: 'next';
39
+ };
40
+ /** Focus on the Terms screen. */
41
+ export type TermsFocus = 'data' | 'previous' | 'done';
42
+ /** A parsed screen. */
43
+ export type AntigravityTermsScreen = {
44
+ kind: 'color_scheme';
45
+ focus: ColorSchemeFocus | null;
46
+ /** Scheme marked `*` (chosen), when one is */
47
+ chosenScheme: string | null;
48
+ /** The migration section is shown */
49
+ migration: boolean;
50
+ /** Its import checkbox, when shown */
51
+ importChecked: boolean | null;
52
+ } | {
53
+ kind: 'terms';
54
+ focus: TermsFocus | null;
55
+ dataChecked: boolean | null;
56
+ } | {
57
+ kind: 'trust';
58
+ } | {
59
+ kind: 'login';
60
+ } | {
61
+ kind: 'main_prompt';
62
+ } | {
63
+ kind: 'unknown';
64
+ };
65
+ /**
66
+ * Parse an Antigravity CLI screen.
67
+ *
68
+ * @param screen - Captured screen (ANSI is stripped here)
69
+ * @returns What is on screen
70
+ */
71
+ export declare function parseAntigravityTermsScreen(screen: string): AntigravityTermsScreen;
72
+ /**
73
+ * Whether a screen shows the first-run (colour scheme / Terms) screens.
74
+ *
75
+ * @param screen - Captured screen
76
+ * @returns True on either first-run screen
77
+ */
78
+ export declare function isAntigravityFirstRunScreen(screen: string): boolean;
79
+ //# sourceMappingURL=antigravity-terms-screens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"antigravity-terms-screens.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/runtime-terms/antigravity-terms-screens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAOH,yCAAyC;AACzC,MAAM,MAAM,gBAAgB,GACzB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpB,iCAAiC;AACjC,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;AAEtD,uBAAuB;AACvB,MAAM,MAAM,sBAAsB,GAC/B;IACA,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC/B,8CAA8C;IAC9C,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,qCAAqC;IACrC,SAAS,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,aAAa,EAAE,OAAO,GAAG,IAAI,CAAC;CAC7B,GACD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,OAAO,GAAG,IAAI,CAAA;CAAE,GACxE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AA4EvB;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,sBAAsB,CAUlF;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAGnE"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Antigravity CLI first-run screens, read from screen text (pure).
3
+ *
4
+ * What agy 1.2.14 paints on its first interactive launch (captured in a PTY,
5
+ * focus marked by `> `, a chosen colour scheme by `* `, a focused button
6
+ * drawn without its brackets):
7
+ *
8
+ * ```
9
+ * Welcome to Antigravity CLI!
10
+ * Choose your color scheme: ╭──── preview ────╮
11
+ * > terminal │ … │
12
+ * light │ … │
13
+ * …
14
+ * Migration options: ← only when Gemini CLI extensions exist
15
+ * > [ ] Import extensions from Gemini CLI (1 found: …)
16
+ * [Next] ← focused: "> Next"
17
+ *
18
+ * Terms of Service & Data Use
19
+ * > [x] Yes, I agree to help improve Antigravity CLI by allowing …
20
+ * [Previous] [Done] ← focused: "> Previous" / "> Done"
21
+ * ↑/↓ Navigate · enter Toggle
22
+ * ```
23
+ *
24
+ * Every field is derived from text, never from a key count, so the driver
25
+ * can check the screen before and after each key.
26
+ * specs/2026-10-01-runtime-terms-consent.md
27
+ *
28
+ * @module services/runtime-terms/antigravity-terms-screens
29
+ */
30
+ import { ANTIGRAVITY_CONSTANTS, RUNTIME_TERMS_CONSTANTS } from '../../constants.js';
31
+ import { stripAnsiCodes } from '../../utils/terminal-string-ops.js';
32
+ const A = RUNTIME_TERMS_CONSTANTS.ANTIGRAVITY;
33
+ /**
34
+ * The left column of a line (the colour list shares lines with the preview box).
35
+ *
36
+ * @param line - Screen line
37
+ * @returns Text before the preview box border
38
+ */
39
+ function leftColumn(line) {
40
+ const cut = line.search(/[│╭╰]/);
41
+ return (cut >= 0 ? line.slice(0, cut) : line).replace(/\s+$/, '');
42
+ }
43
+ /**
44
+ * Parse the colour-scheme screen.
45
+ *
46
+ * @param lines - Screen lines
47
+ * @returns Parsed screen
48
+ */
49
+ function parseColorScheme(lines) {
50
+ let focus = null;
51
+ let chosenScheme = null;
52
+ let importChecked = null;
53
+ let migration = false;
54
+ for (const raw of lines) {
55
+ const line = leftColumn(raw);
56
+ const scheme = /^\s*([>*])?\s*(.+?)\s*$/.exec(line);
57
+ if (scheme && A.COLOR_SCHEMES.includes(scheme[2])) {
58
+ if (scheme[1] === '>')
59
+ focus = { type: 'scheme', name: scheme[2] };
60
+ if (scheme[1] === '*')
61
+ chosenScheme = scheme[2];
62
+ continue;
63
+ }
64
+ if (raw.includes(A.MIGRATION_TITLE))
65
+ migration = true;
66
+ if (raw.includes(A.IMPORT_ITEM)) {
67
+ const m = /^\s*(>)?\s*\[([ xX])\]/.exec(raw);
68
+ if (m) {
69
+ importChecked = m[2].toLowerCase() === 'x';
70
+ if (m[1])
71
+ focus = { type: 'import', checked: importChecked };
72
+ }
73
+ continue;
74
+ }
75
+ if (new RegExp(`^\\s*>\\s+${A.NEXT_BUTTON}\\s*$`).test(raw))
76
+ focus = { type: 'next' };
77
+ }
78
+ return { kind: 'color_scheme', focus, chosenScheme, migration, importChecked };
79
+ }
80
+ /**
81
+ * Parse the Terms screen.
82
+ *
83
+ * @param lines - Screen lines
84
+ * @returns Parsed screen
85
+ */
86
+ function parseTerms(lines) {
87
+ let focus = null;
88
+ let dataChecked = null;
89
+ let dataLines = 0;
90
+ for (const raw of lines) {
91
+ if (raw.includes(A.DATA_ITEM)) {
92
+ dataLines += 1;
93
+ const m = /^\s*(>)?\s*\[([ xX])\]\s/.exec(raw);
94
+ if (m) {
95
+ dataChecked = m[2].toLowerCase() === 'x';
96
+ if (m[1])
97
+ focus = 'data';
98
+ }
99
+ continue;
100
+ }
101
+ if (raw.includes(A.PREVIOUS_BUTTON) && raw.includes(A.DONE_BUTTON)) {
102
+ if (new RegExp(`>\\s+${A.PREVIOUS_BUTTON}\\b`).test(raw))
103
+ focus = 'previous';
104
+ else if (new RegExp(`>\\s+${A.DONE_BUTTON}\\b`).test(raw))
105
+ focus = 'done';
106
+ }
107
+ }
108
+ // Two copies of the item would make "the" checkbox ambiguous.
109
+ if (dataLines !== 1)
110
+ dataChecked = null;
111
+ return { kind: 'terms', focus, dataChecked };
112
+ }
113
+ /**
114
+ * Parse an Antigravity CLI screen.
115
+ *
116
+ * @param screen - Captured screen (ANSI is stripped here)
117
+ * @returns What is on screen
118
+ */
119
+ export function parseAntigravityTermsScreen(screen) {
120
+ const clean = stripAnsiCodes(screen);
121
+ const lines = clean.split(/\r?\n/);
122
+ if (clean.includes(A.TERMS_TITLE))
123
+ return parseTerms(lines);
124
+ if (clean.includes(A.COLOR_SCHEME_TITLE))
125
+ return parseColorScheme(lines);
126
+ const S = ANTIGRAVITY_CONSTANTS.SCREEN;
127
+ if (clean.includes(S.TRUST_PROMPT) && clean.includes(S.TRUST_ACCEPT_OPTION))
128
+ return { kind: 'trust' };
129
+ if (S.ACCOUNT_LOGIN_MARKERS.some((m) => clean.includes(m)))
130
+ return { kind: 'login' };
131
+ if (clean.includes(S.IDLE_FOOTER))
132
+ return { kind: 'main_prompt' };
133
+ return { kind: 'unknown' };
134
+ }
135
+ /**
136
+ * Whether a screen shows the first-run (colour scheme / Terms) screens.
137
+ *
138
+ * @param screen - Captured screen
139
+ * @returns True on either first-run screen
140
+ */
141
+ export function isAntigravityFirstRunScreen(screen) {
142
+ const kind = parseAntigravityTermsScreen(screen).kind;
143
+ return kind === 'terms' || kind === 'color_scheme';
144
+ }
145
+ //# sourceMappingURL=antigravity-terms-screens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"antigravity-terms-screens.js","sourceRoot":"","sources":["../../../../../../backend/src/services/runtime-terms/antigravity-terms-screens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEpE,MAAM,CAAC,GAAG,uBAAuB,CAAC,WAAW,CAAC;AA6B9C;;;;;GAKG;AACH,SAAS,UAAU,CAAC,IAAY;IAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACnE,CAAC;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,KAAe;IACxC,IAAI,KAAK,GAA4B,IAAI,CAAC;IAC1C,IAAI,YAAY,GAAkB,IAAI,CAAC;IACvC,IAAI,aAAa,GAAmB,IAAI,CAAC;IACzC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,MAAM,IAAI,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;gBAAE,KAAK,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;gBAAE,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAChD,SAAS;QACV,CAAC;QACD,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC;YAAE,SAAS,GAAG,IAAI,CAAC;QACtD,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,GAAG,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC7C,IAAI,CAAC,EAAE,CAAC;gBACP,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC;gBAC3C,IAAI,CAAC,CAAC,CAAC,CAAC;oBAAE,KAAK,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;YAC9D,CAAC;YACD,SAAS;QACV,CAAC;QACD,IAAI,IAAI,MAAM,CAAC,aAAa,CAAC,CAAC,WAAW,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,KAAK,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACvF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;AAChF,CAAC;AAED;;;;;GAKG;AACH,SAAS,UAAU,CAAC,KAAe;IAClC,IAAI,KAAK,GAAsB,IAAI,CAAC;IACpC,IAAI,WAAW,GAAmB,IAAI,CAAC;IACvC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/B,SAAS,IAAI,CAAC,CAAC;YACf,MAAM,CAAC,GAAG,0BAA0B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC/C,IAAI,CAAC,EAAE,CAAC;gBACP,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC;gBACzC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAAE,KAAK,GAAG,MAAM,CAAC;YAC1B,CAAC;YACD,SAAS;QACV,CAAC;QACD,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC;YACpE,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,eAAe,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,KAAK,GAAG,UAAU,CAAC;iBACxE,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,KAAK,GAAG,MAAM,CAAC;QAC3E,CAAC;IACF,CAAC;IACD,8DAA8D;IAC9D,IAAI,SAAS,KAAK,CAAC;QAAE,WAAW,GAAG,IAAI,CAAC;IACxC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AAC9C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CAAC,MAAc;IACzD,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;QAAE,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC;QAAE,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACzE,MAAM,CAAC,GAAG,qBAAqB,CAAC,MAAM,CAAC;IACvC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACtG,IAAI,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACrF,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IAClE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAC5B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CAAC,MAAc;IACzD,MAAM,IAAI,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;IACtD,OAAO,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,cAAc,CAAC;AACpD,CAAC"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Tests-only fake of Antigravity CLI's first-run TUI (agy 1.2.14): a
3
+ * scripted terminal that takes the raw bytes a PTY would get, renders the
4
+ * screens the real binary paints (same text, same focus markers) and
5
+ * records every key, so a test can check exactly what was pressed and the
6
+ * resulting checkbox state.
7
+ *
8
+ * Behaviour copied from the real binary:
9
+ * - colour list: ↑/↓ move (wrapping inside the list), Enter chooses (`* name`);
10
+ * without Gemini CLI extensions Enter goes straight to the Terms screen,
11
+ * with them the focus moves to "Import extensions…" (↑ from there returns
12
+ * to the bottom of the list and un-chooses the scheme), then Next;
13
+ * - Terms: the data item starts checked; Enter / Space toggle it; ↓ moves to
14
+ * the buttons ([Previous] first), ←/→ between them, ↑ back to the item;
15
+ * Enter on Previous goes back, Enter on Done accepts and shows the prompt.
16
+ *
17
+ * @module services/runtime-terms/fake-agy-tui.fixture
18
+ */
19
+ import type { TermsTerminal } from './antigravity-terms-driver.js';
20
+ /** Keys decoded from the bytes received. */
21
+ export type FakeKey = 'Up' | 'Down' | 'Left' | 'Right' | 'Enter' | 'Space' | 'CtrlC' | 'Other';
22
+ /** Options. */
23
+ export interface FakeAgyOptions {
24
+ /** Gemini CLI extensions exist (shows "Migration options") */
25
+ migration?: boolean;
26
+ /** Start on the prompt (terms already accepted) */
27
+ alreadyAccepted?: boolean;
28
+ /** Paint a different Terms screen (wording changed in a new version) */
29
+ changedTerms?: boolean;
30
+ /** Paint an account sign-in instead of the setup screens */
31
+ accountLogin?: boolean;
32
+ /** Toggling the data box does nothing (a stuck TUI) */
33
+ stuckCheckbox?: boolean;
34
+ /** Starting focus in the colour list */
35
+ startScheme?: string;
36
+ }
37
+ /** The fake. */
38
+ export declare class FakeAgyTui implements TermsTerminal {
39
+ private readonly opts;
40
+ /** Every key received, in order */
41
+ readonly keys: FakeKey[];
42
+ screenName: 'color' | 'terms' | 'main' | 'exited' | 'login';
43
+ focusZone: 'list' | 'import' | 'next';
44
+ focusIdx: number;
45
+ chosen: string | null;
46
+ importChecked: boolean;
47
+ termsFocus: 'data' | 'previous' | 'done';
48
+ dataChecked: boolean;
49
+ /** What Done accepted, once pressed */
50
+ accepted: {
51
+ scheme: string | null;
52
+ importExtensions: boolean;
53
+ dataSharing: boolean;
54
+ } | null;
55
+ /** Times Done was pressed */
56
+ doneCount: number;
57
+ /**
58
+ * @param opts - Scenario
59
+ */
60
+ constructor(opts?: FakeAgyOptions);
61
+ /**
62
+ * Receive bytes as a PTY would.
63
+ *
64
+ * @param data - Raw bytes
65
+ */
66
+ write(data: string): void;
67
+ private press;
68
+ private pressColor;
69
+ private pressTerms;
70
+ /** @returns The screen as text */
71
+ capture(): string;
72
+ private renderColor;
73
+ private renderTerms;
74
+ }
75
+ //# sourceMappingURL=fake-agy-tui.fixture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-agy-tui.fixture.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/runtime-terms/fake-agy-tui.fixture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAInE,4CAA4C;AAC5C,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAY/F,eAAe;AACf,MAAM,WAAW,cAAc;IAC9B,8DAA8D;IAC9D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mDAAmD;IACnD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,wEAAwE;IACxE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,uDAAuD;IACvD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,wCAAwC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,gBAAgB;AAChB,qBAAa,UAAW,YAAW,aAAa;IAkBnC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAjBjC,mCAAmC;IACnC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,CAAM;IAC9B,UAAU,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAW;IACtE,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAU;IAC/C,QAAQ,SAAK;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC7B,aAAa,UAAS;IACtB,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAAU;IAClD,WAAW,UAAQ;IACnB,uCAAuC;IACvC,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,gBAAgB,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAQ;IACnG,6BAA6B;IAC7B,SAAS,SAAK;IAEd;;OAEG;gBAC0B,IAAI,GAAE,cAAmB;IAMtD;;;;OAIG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAWzB,OAAO,CAAC,KAAK;IASb,OAAO,CAAC,UAAU;IA0BlB,OAAO,CAAC,UAAU;IAqBlB,kCAAkC;IAClC,OAAO,IAAI,MAAM;IAsBjB,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,WAAW;CAmCnB"}